diff --git a/TBF_V2/Docu/Prüfstationsanalyse Hannover Stara Tura.pdf b/TBF_V2/Docu/Prüfstationsanalyse Hannover Stara Tura.pdf new file mode 100644 index 00000000..b302744c Binary files /dev/null and b/TBF_V2/Docu/Prüfstationsanalyse Hannover Stara Tura.pdf differ diff --git a/TBF_V2/Docu/Prüfstationsanalyse Hannover.pdf b/TBF_V2/Docu/Prüfstationsanalyse Hannover.pdf new file mode 100644 index 00000000..09ef7830 Binary files /dev/null and b/TBF_V2/Docu/Prüfstationsanalyse Hannover.pdf differ diff --git a/TBF_V2/Docu/Prüfstationsanalyse Stara Tura.pdf b/TBF_V2/Docu/Prüfstationsanalyse Stara Tura.pdf new file mode 100644 index 00000000..1b324fc3 Binary files /dev/null and b/TBF_V2/Docu/Prüfstationsanalyse Stara Tura.pdf differ diff --git a/TBF_V2/Docu/Schulung-TBF-P2022.docx b/TBF_V2/Docu/Schulung-TBF-P2022.docx new file mode 100644 index 00000000..6c291e4d Binary files /dev/null and b/TBF_V2/Docu/Schulung-TBF-P2022.docx differ diff --git a/TBF_V2/Docu/SoftwareDesign/TBF_SDDe.docx b/TBF_V2/Docu/SoftwareDesign/TBF_SDDe.docx new file mode 100644 index 00000000..84ad5bf6 Binary files /dev/null and b/TBF_V2/Docu/SoftwareDesign/TBF_SDDe.docx differ diff --git a/TBF_V2/Docu/SoftwareDesign/TBF_SDDe.vsd b/TBF_V2/Docu/SoftwareDesign/TBF_SDDe.vsd new file mode 100644 index 00000000..1eab01ae Binary files /dev/null and b/TBF_V2/Docu/SoftwareDesign/TBF_SDDe.vsd differ diff --git a/TBF_V2/Docu/SoftwareDesign/TBF_SRSe.docx b/TBF_V2/Docu/SoftwareDesign/TBF_SRSe.docx new file mode 100644 index 00000000..ed8c7ef4 Binary files /dev/null and b/TBF_V2/Docu/SoftwareDesign/TBF_SRSe.docx differ diff --git a/TBF_V2/Sources/TBF/.gitignore b/TBF_V2/Sources/TBF/.gitignore new file mode 100644 index 00000000..d08e4307 --- /dev/null +++ b/TBF_V2/Sources/TBF/.gitignore @@ -0,0 +1,25 @@ +Config/bin/ +Config/obj/ +DeviceTest/bin/ +DeviceTest/obj/ +Dirichlet.Numerics/bin +Dirichlet.Numerics/obj +GraphLib/bin +GraphLib/obj +MonitoringDB/bin +MonitoringDB/obj +Results/bin/ +Results/obj/ +ResultsBrowser/bin/ +ResultsBrowser/obj/ +TBF/bin/ +TBF/obj/ +TBFSetup/Debug/ +TBFSetup/Release/ +Users/bin/ +Users/obj/ +UserManagement/bin/ +UserManagement/obj/ +Doc/ +*.suo +*.bak diff --git a/TBF_V2/Sources/TBF/Config/Config.csproj b/TBF_V2/Sources/TBF/Config/Config.csproj new file mode 100644 index 00000000..68f4d018 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Config.csproj @@ -0,0 +1,152 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {743DF7DB-C7B6-42EB-986D-0F485E5588E4} + Library + Properties + Config + Config + v4.0 + 512 + + + true + full + false + bin\Debug\ + TRACE;DEBUG;GENESIS;IPERL;LANG_DE + prompt + 4 + false + x86 + + + pdbonly + true + bin\Release\ + TRACE;GENESIS;IPERL;LANG_DE + prompt + 4 + + + + ..\..\..\Debug\ControlComponent3U.dll + + + ..\packages\FluentNHibernate.2.0.3.0\lib\net40\FluentNHibernate.dll + + + ..\packages\Iesi.Collections.4.0.0.4000\lib\net40\Iesi.Collections.dll + + + ..\packages\log4net.2.0.2\lib\net40-full\log4net.dll + + + ..\packages\MySql.Data.6.6.5\lib\net40\MySql.Data.dll + + + ..\packages\NHibernate.4.0.4.4000\lib\net40\NHibernate.dll + + + + + ..\packages\System.Data.SQLite.1.0.90.0\lib\net40\System.Data.SQLite.dll + + + ..\packages\System.Data.SQLite.1.0.90.0\lib\net40\System.Data.SQLite.Linq.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + True + Strings.resx + + + + + + + + + + + Designer + + + + + + + {6E5CB0E9-E1B6-4E5D-AC6E-B1049E180F2B} + Users + + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Config/Data.cs b/TBF_V2/Sources/TBF/Config/Data.cs new file mode 100644 index 00000000..997d474e --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Data.cs @@ -0,0 +1,96 @@ +using System; + +namespace Config +{ + public class Data : Users.GlobalData + { + public const string AdminUsername = "admin"; + public const string AdminPassword = "staratura"; + public const string SQLiteDbFName = "SQLite.db"; + +#if MUNICH + public const int WMsCount = 3; + public const int LineSize = 1; + public const int CompoundWMsCount = 1; + public const int HeatMetersCount = 0; + public const int MaxPartNr = 3; +#elif DN100 || BADGER_STREDNA_TRAT || BADGER_VELKA_TRAT || CEVAK_200 + public const int WMsCount = 3; + public const int LineSize = 3; + public const int CompoundWMsCount = 1; + public const int HeatMetersCount = 0; + public const int MaxPartNr = WMsCount / LineSize; +#elif FUZHOU300 || FUZHOU150 || PT200IL || PUCHONG_PT200 || GENESIS || SLM_150 || PETERSBURG_200 + public const int WMsCount = 6; + public const int LineSize = 6; + public const int CompoundWMsCount = 3; + public const int HeatMetersCount = 0; + public const int MaxPartNr = 3; +#elif DUBAJ_50 + public const int WMsCount = 10; + public const int LineSize = 5; + public const int CompoundWMsCount = 0; + public const int HeatMetersCount = 0; + public const int MaxPartNr = WMsCount / LineSize; +#elif FUZHOU100 + public const int WMsCount = 10; + public const int LineSize = 10; + public const int CompoundWMsCount = 1; + public const int HeatMetersCount = 0; + public const int MaxPartNr = WMsCount / LineSize; +#elif TORINO50 || BADGER_MALA_TRAT || BERLIN + public const int WMsCount = 6; + public const int LineSize = 6; + public const int CompoundWMsCount = 1; + public const int HeatMetersCount = 0; + public const int MaxPartNr = 1; +#elif TORUN_PT50_2015 || CEVAK_PT40_272 || MURES_PT40 || FUZHOU_40 || PETERSBURG_50 || KEMPNO_50 || BAHRAIN_50 || KRAKOW_50 || JUZNA_AFRIKA_50 || ZAMBIA + public const int WMsCount = 20; + public const int LineSize = 10; + public const int CompoundWMsCount = 1; + public const int HeatMetersCount = 0; + public const int MaxPartNr = WMsCount / LineSize; +#elif RUM_MOB + public const int WMsCount = 8; + public const int LineSize = 8; + public const int CompoundWMsCount = 1; + public const int HeatMetersCount = 0; + public const int MaxPartNr = WMsCount / LineSize; +#elif TURA_IPERL + public const int WMsCount = 40; + public const int LineSize = 20; + public const int CompoundWMsCount = 1; + public const int HeatMetersCount = 0; + public const int MaxPartNr = WMsCount / LineSize; +#elif TURA_SPECIAL || SENTEC + public const int WMsCount = 6; + public const int LineSize = 6; + public const int CompoundWMsCount = 1; + public const int HeatMetersCount = 0; + public const int MaxPartNr = WMsCount / LineSize; +#elif SLM_50 + public const int WMsCount = 12; + public const int LineSize = 12; + public const int CompoundWMsCount = 1; + public const int HeatMetersCount = 6; + public const int MaxPartNr = WMsCount / LineSize; +#elif SLM_END || WARSAW_END + public const int WMsCount = 10; + public const int LineSize = 5; + public const int CompoundWMsCount = 1; + public const int HeatMetersCount = 0; + public const int MaxPartNr = 4; +#elif MALTA_WSD25 + public const int WMsCount = 6; + public const int LineSize = 6; + public const int CompoundWMsCount = 0; + public const int HeatMetersCount = 0; + public const int MaxPartNr = WMsCount / LineSize; +#endif + + /// + /// Database related: This object reference is set after a successful user login + /// + public static DatabaseSettings CurrentBench; + } +} diff --git a/TBF_V2/Sources/TBF/Config/DatabaseSettings.cs b/TBF_V2/Sources/TBF/Config/DatabaseSettings.cs new file mode 100644 index 00000000..7671d478 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/DatabaseSettings.cs @@ -0,0 +1,54 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Text; +using System.Xml.Serialization; + +namespace Config +{ + /// + /// Test bench database settings, contains bench name and settings od several databases + /// + public class DatabaseSettings : ICloneable + { + // Public fields + public string BenchName; + public bool IsRealBench; + public Users.DBSettings ProceduresDBSettings; /// Config database settings + public Users.DBSettings WaterMetersDBSettings; /// Results database settings + public Users.DBSettings UsersDBSettings; /// Users database settings + + // Constructor + public DatabaseSettings() + { + BenchName = String.Empty; /// Empty string (avoid null) + IsRealBench = false; + ProceduresDBSettings = new Users.DBSettings(Users.Entities.DBType.MySql, string.Empty); + WaterMetersDBSettings = new Users.DBSettings(Users.Entities.DBType.MySql, string.Empty); + UsersDBSettings = new Users.DBSettings(Users.Entities.DBType.MySql, string.Empty); + } + + public object Clone() + { + DatabaseSettings result = new DatabaseSettings(); + + result.BenchName = BenchName; + result.IsRealBench = IsRealBench; + result.ProceduresDBSettings = (Users.DBSettings)ProceduresDBSettings.Clone(); + result.WaterMetersDBSettings = (Users.DBSettings)WaterMetersDBSettings.Clone(); + result.UsersDBSettings = (Users.DBSettings)ProceduresDBSettings.Clone(); + + return result; + } + + public override string ToString() + { + return string.Format("{0} config={1} results={2} users={3}", + BenchName, + ProceduresDBSettings.ConnectionString, + WaterMetersDBSettings.ConnectionString, + UsersDBSettings.ConnectionString); + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Entities/BenchPath.cs b/TBF_V2/Sources/TBF/Config/Entities/BenchPath.cs new file mode 100644 index 00000000..8572a10d --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Entities/BenchPath.cs @@ -0,0 +1,61 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; + +namespace Config.Entities +{ + public class BenchPath : IHasName, IHasItemNr, IHasValves + { + public virtual int Id { get; protected set; } + public virtual int ItemNr { get; set; } + public virtual string Name { get; set; } + public virtual string OriName { get; set; } /// Not mapped to database + public virtual float Qfrom { get; set; } /// Water flow in [m3/h] + public virtual float Qto { get; set; } /// Water flow in [m3/h] + public virtual string TempMtrUp { get; set; } + public virtual string TempMtrDown { get; set; } + public virtual string PressMtrUp { get; set; } + public virtual string PressMtrDown { get; set; } + public virtual string PressMtrDelta { get; set; } + public virtual string StopBFValve { get; set; } + + /// Valves + public virtual string ValvesOpen { get; set; } + public virtual string ValvesClose { get; set; } + + /// ------------- Additional stuff not mapped into the database ------------- + + public BenchPath() + { + ValvesOpen = string.Empty; + ValvesClose = string.Empty; + } + + public BenchPath(string name, int itemNr) + : this() + { + Name = name; + ItemNr = itemNr; + } + + public virtual BenchPath Clone(string name, int itemNr) + { + BenchPath result = new BenchPath(name, itemNr); + + result.Qfrom = Qfrom; + result.Qto = Qto; + result.TempMtrUp = TempMtrUp; + result.TempMtrDown = TempMtrDown; + result.PressMtrUp = PressMtrUp; + result.PressMtrDown = PressMtrDown; + result.PressMtrDelta = PressMtrDelta; + result.StopBFValve = StopBFValve; + result.ValvesOpen = ValvesOpen; + result.ValvesClose = ValvesClose; + + return result; + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Entities/Component.cs b/TBF_V2/Sources/TBF/Config/Entities/Component.cs new file mode 100644 index 00000000..800013e3 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Entities/Component.cs @@ -0,0 +1,136 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; + +namespace Config.Entities +{ + public class Component : IHasName, IHasItemNr + { + public virtual int Id { get; protected set; } + public virtual int ItemNr { get; set; } + public virtual string Name { get; set; } + public virtual string ClassName { get; set; } + public virtual string ParentName { get; set; } + public virtual DebugMode Mode { get; set; } + public virtual LogLevel Logging { get; set; } + public virtual string Parameters { get; set; } + public virtual IList Corrections { get; set; } + + /// ------------- Additional stuff not mapped into the database ------------- + + public Component() + { + Name = string.Empty; + ClassName = string.Empty; + Corrections = new List(); + } + + public static Component CreateFromCfg(string name, string className, string parentName, int itemNr, + DebugMode debugLevel, LogLevel logLevel, string parameters) + { + Component result = new Component(); + result.ItemNr = itemNr; + result.Name = name; + result.ClassName = className; + result.ParentName = parentName; + result.Mode = debugLevel; + result.Logging = logLevel; + result.Parameters = parameters; + return result; + } + + // Makes a new copy of this object (not just a reference) + public virtual Component Clone() + { + Component result = new Component(); + result.ItemNr = ItemNr; + result.Name = Name; + result.ClassName = ClassName; + result.ParentName = ParentName; + result.Mode = Mode; + result.Logging = Logging; + result.Parameters = Parameters; + return result; + } + + public virtual void Export(StreamWriter output) + { + output.WriteLine(Name); + output.WriteLine(ClassName); + output.WriteLine(ParentName); + output.WriteLine(Mode.ToString()); + output.WriteLine(Logging.ToString()); + output.Write(Parameters); + + output.Close(); + } + + public static Component Import(StreamReader input) + { + Component result = new Component(); + + result.Name = input.ReadLine(); + result.ClassName = input.ReadLine(); + result.ParentName = input.ReadLine(); + + string line = input.ReadLine(); + if (line.Equals(DebugMode.DetectedOff.ToString())) result.Mode = DebugMode.DetectedOff; + else if (line.Equals(DebugMode.DetectedOn.ToString())) result.Mode = DebugMode.DetectedOn; + else if (line.Equals(DebugMode.Normal.ToString())) result.Mode = DebugMode.Normal; + else if (line.Equals(DebugMode.AutoDetect.ToString())) result.Mode = DebugMode.AutoDetect; + else if (line.Equals(DebugMode.FailureDuringOperation.ToString())) result.Mode = DebugMode.FailureDuringOperation; + else if (line.Equals(DebugMode.Off.ToString())) result.Mode = DebugMode.Off; + else if (line.Equals(DebugMode.Record.ToString())) result.Mode = DebugMode.Record; + else if (line.Equals(DebugMode.Reply.ToString())) result.Mode = DebugMode.Reply; + else if (line.Equals(DebugMode.Simulate.ToString())) result.Mode = DebugMode.Simulate; + else if (line.Equals(DebugMode.Inherit.ToString())) result.Mode = DebugMode.Inherit; + + line = input.ReadLine(); + if (line.Equals(LogLevel.Off.ToString())) result.Logging = LogLevel.Off; + else if (line.Equals(LogLevel.Fatal.ToString())) result.Logging = LogLevel.Fatal; + else if (line.Equals(LogLevel.Error.ToString())) result.Logging = LogLevel.Error; + else if (line.Equals(LogLevel.Warn.ToString())) result.Logging = LogLevel.Warn; + else if (line.Equals(LogLevel.Info.ToString())) result.Logging = LogLevel.Info; + else if (line.Equals(LogLevel.Debug.ToString())) result.Logging = LogLevel.Debug; + else if (line.Equals(LogLevel.All.ToString())) result.Logging = LogLevel.All; + + result.Parameters = string.Empty; + line = input.ReadLine(); + while (line != null) + { + result.Parameters += line; + result.Parameters += Environment.NewLine; + line = input.ReadLine(); + } + + return result; + } + + public virtual string ToString(string indent) + { + string result = string.Empty; + + result += indent + "ItemNr = " + (ItemNr + 1).ToString() + Environment.NewLine; + result += indent + "Name = " + Name + Environment.NewLine; + result += indent + "ClassName = " + ClassName + Environment.NewLine; + if (ParentName != null) + { + result += indent + "ParentName = " + ParentName + Environment.NewLine; + } + result += indent + "DebugLevel = " + Mode.ToString() + Environment.NewLine; + result += indent + "LogLevel = " + Logging.ToString() + Environment.NewLine; + result += indent + "Parameters = " + Parameters + Environment.NewLine; + + return result; + } + + public override string ToString() + { + return string.Format("{0} ({1})", Name, ClassName); + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Entities/ComponentProcedure.cs b/TBF_V2/Sources/TBF/Config/Entities/ComponentProcedure.cs new file mode 100644 index 00000000..e0b17982 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Entities/ComponentProcedure.cs @@ -0,0 +1,61 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.IO; + +namespace Config.Entities +{ + public class ComponentProcedure + { + public virtual int Id { get; protected set; } + public virtual string CmpntName { get; set; } /// Component name + public virtual string Parameters { get; set; } + public virtual Procedure Procedure { get; set; } + + IParamsProvider paramsProvider; + /// + public virtual IParamsProvider GetParamsProvider() { return paramsProvider; } + public virtual void SetParamsProvider(IParamsProvider paramsProvider) { this.paramsProvider = paramsProvider; } + + + protected ComponentProcedure() { } + + public ComponentProcedure(string name, string parameters, Procedure procedure) + { + this.CmpntName = name; + this.Parameters = parameters; + this.Procedure = procedure; + } + + + public virtual ComponentProcedure Clone(Procedure newProcedure) + { + return new ComponentProcedure(CmpntName, Parameters, newProcedure); + } + + public virtual void Export(StreamWriter output) + { + output.WriteLine(CmpntName); + output.WriteLine(Parameters.Replace(Environment.NewLine, "~")); + } + + public static ComponentProcedure Import(StreamReader input, Procedure newProcedure) + { + string firstLine = input.ReadLine(); + + if (string.IsNullOrEmpty(firstLine)) return null; + + try + { + string cmptnName = firstLine; + string parameters = input.ReadLine().Replace("~", Environment.NewLine); + return new ComponentProcedure(cmptnName, parameters, newProcedure); + } + catch (Exception) + { + return null; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Entities/ComponentTest.cs b/TBF_V2/Sources/TBF/Config/Entities/ComponentTest.cs new file mode 100644 index 00000000..ab059928 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Entities/ComponentTest.cs @@ -0,0 +1,61 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.IO; + +namespace Config.Entities +{ + public class ComponentTest + { + public virtual int Id { get; protected set; } + public virtual string CmpntName { get; set; } /// Component name + public virtual string Parameters { get; set; } + public virtual Test Test { get; set; } + + IParamsProvider paramsProvider; + /// + public virtual IParamsProvider GetParamsProvider() { return paramsProvider; } + public virtual void SetParamsProvider(IParamsProvider paramsProvider) { this.paramsProvider = paramsProvider; } + + + protected ComponentTest() { } + + public ComponentTest(string name, string parameters, Test test) + { + this.CmpntName = name; + this.Parameters = parameters; + this.Test = test; + } + + + public virtual ComponentTest Clone() + { + return new ComponentTest(CmpntName, Parameters, Test); + } + + public virtual void Export(StreamWriter output) + { + output.WriteLine(CmpntName); + output.WriteLine(Parameters.Replace(Environment.NewLine, "~")); + } + + public static ComponentTest Import(StreamReader input, Test newTest) + { + string firstLine = input.ReadLine(); + + if (string.IsNullOrEmpty(firstLine)) return null; + + try + { + string cmptnName = firstLine; + string parameters = input.ReadLine().Replace("~", Environment.NewLine); + return new ComponentTest(cmptnName, parameters, newTest); + } + catch (Exception) + { + return null; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Entities/Enums.cs b/TBF_V2/Sources/TBF/Config/Entities/Enums.cs new file mode 100644 index 00000000..0558d7dc --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Entities/Enums.cs @@ -0,0 +1,493 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Reflection; + +namespace Config.Entities +{ + /// + /// Helper class to assign descriptions to enum values + /// + public class Description : Attribute + { + public string Text; + public Description(string t) + { + Text = t; + } + } + + public static class GetDescription + { + /// Extension method for enum-s + public static string ToDescription(this Enum en) + { + Type type = en.GetType(); + MemberInfo[] memInfo = type.GetMember(en.ToString()); + + if (memInfo != null && memInfo.Length > 0) + { + object[] attrs = memInfo[0].GetCustomAttributes(typeof(Description), false); + if (attrs != null && attrs.Length > 0) + return ((Description)attrs[0]).Text; + } + + return en.ToString(); /// Return ToString() value in case there is no description + } + } + + /// + /// Flags returned by each device configuration control Verify(...) function. + /// + public enum CfgUpdateFlags + { + None = 0, + Error = 0x1, /// Some settings in the user control are invalid and cannot be set + Warning = 0x02, /// Some settings in the user control are suspicious, can be set after user confirmation + RestartRqrd = 0x04, /// TBF program restart is required to apply all changed parameters + AnyChange = 0x08, /// At least one parameter have changed + VolatileChange = 0x10, + InvokeCfgChange = 0x20, /// Invoke CfgChange handler of the component + } + + public enum RemoteDBUse + { + [Description("Local DB only")] LocalDBOnly, + [Description("Remote DB only")] RemoteDBOnly, + [Description("Both DB-s, local 1st")] BothDBsLocalFirst, + [Description("Both DB-s, remote 1st")] BothDBsRemoteFirst, + Count, + } + + /// + /// Contains a procedure name and a database specification (local/remote). + /// + public class ProcedureInfo + { + public readonly string Name; + public readonly Users.Entities.DBKind DBKind; + + public ProcedureInfo(string name, Users.Entities.DBKind dbKind) + { + Name = name; + DBKind = dbKind; + } + } + + public enum ProcedureState + { + Active, + History, + Count, + } + + /// Kind of meters for the procedure / test + public enum MetersKind + { +#if LANG_DE + [Description("Wasserzähler")] Single, + [Description("Verbundwasserzähler")] Combined, + [Description("Wärmezähler")] HeatMeter, +#elif LANG_CS + [Description("Vodoměry")] Single, + [Description("Kombinované vodoměry")] Combined, + [Description("Měřiče tepla")] HeatMeter, +#elif LANG_RU + [Description("Счетчик")] Single, + [Description("Комбинированный счетчик")] Combined, + [Description("Счетчик тепла")] HeatMeter, +#else + [Description("Water meters")] Single, + [Description("Compound water meters")] Combined, + [Description("Heat meters")] HeatMeter, +#endif + } + + public enum CompoundMeterId : byte + { + Single, + CompoundMain, + CompoundAux, + Compound, + HeatMeterVolume, + HeatMeterEnergy, + SingleOrCompound, /// Only used when querying results + } + + public enum Medium + { + [Description("")] NotSpecified, +#if LANG_PL + [Description("zimna")] ColdWater, + [Description("ciepła")] HotWater, +#elif LANG_IT + [Description("freddo")] ColdWater, + [Description("caldo")] HotWater, +#else + [Description("cold")] ColdWater, + [Description("hot")] HotWater, +#endif + Count + } + + public enum Mounting + { + [Description("")] NotSpecified, +#if LANG_DE + [Description("H")] H, /// horizontal + [Description("V")] V, /// vertical + [Description("STR")] S, /// standrohre + [Description("F")] F, /// fall +#else + [Description("H")] H, /// horizontal + [Description("V")] V, /// vertical + [Description("S")] S, /// steig + [Description("F")] F, /// fall +#endif + Count + } + + public enum TemperatureClass + { + [Description("")] NotSpecified, + [Description("T30")] T30, + [Description("T50")] T50, + [Description("T70")] T70, + [Description("T90")] T90, + [Description("T130")] T130, + [Description("T180")] T180, + [Description("T30/70")] T30_70, + [Description("T30/90")] T30_90, + [Description("T30/130")] T30_130, + [Description("T30/180")] T30_180, + [Description("30")] t30, + [Description("50")] t50, + [Description("70")] t70, + [Description("90")] t90, + [Description("130")] t130, + [Description("180")] t180, + Count + } + + public enum FlowProfileSensitivityClass + { + [Description("")] NotSpecified, + [Description("U0")] U0, /// ? + [Description("D0")] D0, /// ? + Count + } + + public enum PressureLossClass + { + [Description("")] NotSpecified, + [Description("dp63")] dp63, /// 0.063 MPa = 0.63 bar, TODO: Change to "Δp63" + [Description("dp40")] dp40, /// 0.040 MPa = 0.40 bar + [Description("dp25")] dp25, /// 0.025 MPa = 0.25 bar + [Description("dp16")] dp16, /// 0.016 MPa = 0.16 bar + [Description("dp10")] dp10, /// 0.010 MPa = 0.10 bar + Count + } + + /// Maximum Admissible Pressure + public enum MaxAdmissiblePressure + { + [Description("")] NotSpecified, + [Description("MAP6")] MAP6, + [Description("MAP10")] MAP10, + [Description("MAP16")] MAP16, + [Description("MAP25")] MAP25, + [Description("MAP40")] MAP40, + Count + } + + /// Register reader type + public enum RegisterReaderType + { + Unknown, + Pulses, /// Sick, optical and similar + Camera, /// CLP1611 + DataStream, /// iPerl + Manual, /// Entered by human via form (also from camera images) + Count + } + + /// Transition step is finished when this condition is fulfilled + public enum StepCondition + { + None, + Scale1Empty, + Scale2Empty, + Scale3Empty, + AllScalesEmpty, + Count + } + + public enum Publish : sbyte + { +#if LANG_DE + /// german + [Description("nie")] Never = 0, + [Description("immer")] Always = 1, + [Description("Bildschirm")] OnScreen = 2, + [Description("intern")] Internal = 3, +#elif LANG_CS + /// czech + [Description("nikdy")] Never = 0, + [Description("vždy")] Always = 1, + [Description("na obrazovku")] OnScreen = 2, + [Description("interně")] Internal = 3, +#elif LANG_SK + /// slovak + [Description("nikdy")] Never = 0, + [Description("vždy")] Always = 1, + [Description("na obrazovku")] OnScreen = 2, + [Description("interne")] Internal = 3, +#elif LANG_PL + /// polish + [Description("nigdy")] Never = 0, + [Description("zawsze")] Always = 1, + [Description("na ekranie")] OnScreen = 2, + [Description("wewnętrznie")] Internal = 3, +#elif LANG_RU + /// russian + [Description("никогда")] Never = 0, + [Description("всегда")] Always = 1, + [Description("толька экран")] OnScreen = 2, + [Description("внутренно")] Internal = 3, +#else + /// english + [Description("Never")] Never = 0, + [Description("Always")] Always = 1, + [Description("On screen")] OnScreen = 2, + [Description("Internal")] Internal = 3, +#endif + Count + } + + public enum MassMethod : byte + { +#if LANG_DE + /// nemecky + [Description("Waage")] Scale, + [Description("Spanne")] Spread, + [Description("Standardabw.")] StdDev, +#elif LANG_CS + /// cesky + [Description("váhou")] Scale, + [Description("max.rozdíl")] Spread, + [Description("std.dev.")] StdDev, +#else + [Description("Scale")] Scale, + [Description("Spread")] Spread, + [Description("Std.dev.")] StdDev, +#endif + Count + } + + public enum TestRedType + { + Fix, + /// etc. + Count, + } + + public enum FQC1 + { + FQC1, + FQP1, + Count, + } + + public enum Progress + { + JustStarted, + TransitionBefore, + SwitchingFlowDetection, + FlowSetting, + Aborted, /// Use as an argument when a test was aborted + Test, + TransitionAfter, + Completed, + Count, + } + + public enum Device + { + Screen, + Printer, + Disk, + } + + public enum PageOrientation + { + Portrait, + Landscape, + Count, + } + + public enum ItemCategory + { +#if LANG_DE + [Description("Allgemein")] Other, + [Description("Prüfstanddaten")] BenchData, + [Description("Prüfstandergebnisse")] BenchResult, + [Description("Prüfpunktdaten")] TestData, + [Description("Prüfpunktergebnisse")] TestResult, + [Description("Wasserzelledaten")] MeterData, + [Description("Wasserzelleergebnisse")] MeterResult, +#else + [Description("Other")] Other, + [Description("Bench data")] BenchData, + [Description("Bench result")] BenchResult, + [Description("Test data")] TestData, + [Description("Test result")] TestResult, + [Description("Meter data")] MeterData, + [Description("Meter result")] MeterResult, +#endif + Count, + } + + /// Possible modes of operation of components and devices. + public enum DebugMode + { +#if LANG_DE + [Description("Erkennen-aus")] DetectedOff = -2, + [Description("Erkennen-ein")] DetectedOn = -1, + [Description("Normal")] Normal = 0, /// Normal operation + [Description("Auto-erkennen")] AutoDetect, /// The component (device) will be auto-detected + [Description("Fehler")] FailureDuringOperation, /// Failure during operation -> disabled + [Description("Aus")] Off, /// The component is off + [Description("Aufzeichnen")] Record, + [Description("Reply")] Reply, + [Description("Simuliert")] Simulate, /// Test bench simulation, this mode does not require any hardware + [Description("Geerbt")] Inherit, +#else + [Description("Detected off")] DetectedOff = -2, + [Description("Detected on")] DetectedOn = -1, + [Description("Normal")] Normal = 0, /// Normal operation + [Description("Auto detect")] AutoDetect, /// The component (device) will be auto-detected + [Description("Run-time error")] FailureDuringOperation, /// Failure during operation -> disabled + [Description("Off")] Off, /// The component is off + [Description("Record")] Record, + [Description("Reply")] Reply, + [Description("Simulate")] Simulate, /// Test bench simulation, this mode does not require any hardware + [Description("Inherit")] Inherit, +#endif + Count, + } + + public enum LogLevel + { +#if LANG_DE + [Description("Aus")] Off, + [Description("Schwerwiegend")] Fatal, + [Description("Fehler")] Error, + [Description("Warnung")] Warn, + [Description("Info")] Info, + [Description("Debug")] Debug, + [Description("Alles")] All, +#else + [Description("Off")] Off, + [Description("Fatal")] Fatal, + [Description("Error")] Error, + [Description("Warn")] Warn, + [Description("Info")] Info, + [Description("Debug")] Debug, + [Description("All")] All, +#endif + Count, + } + + + /// Arrangement of tests + public enum TestsArrangement + { + Rows, + Columns, + } + + /// Arrangement of meters + public enum MetersArrangement + { + Vertically, + Horizontally, + } + + public enum Alignment + { +#if LANG_DE + [Description("links")] Left, + [Description("zentriert")] Center, + [Description("rechts")] Right, + [Description("angepasst")] Justified, +#else + [Description("Left")] Left, + [Description("Center")] Center, + [Description("Right")] Right, + [Description("Justified")] Justified, +#endif + Count + } + + public enum VertAlignment + { + [Description("Top")] Top, + [Description("Middle")] Middle, + [Description("Bottom")] Bottom, + } + + public enum TableForm + { + None, + Rows, + Columns, + ColumnsPL, + Count, + } + + public enum ImageRotation + { + [Description("0 deg")] None, + [Description("90 deg")] Deg90, + [Description("180 deg")] Deg180, + [Description("270 deg")] Deg270, + Count + } + + public enum CameraDisplayResolution + { + Small, + Medium, + Large, + // FullScreen, + Count, + } + + public enum ErrorFlagsMode : sbyte + { +#if LANG_DE + [Description("aus")] Off, + [Description("info")] Info, + [Description("ein")] On, +#elif LANG_CS + [Description("vypnuto")] Off, + [Description("info")] Info, + [Description("zapnuto")] On, +#elif LANG_RU + [Description("выкл")] Off, + [Description("инфо")] Info, + [Description("вкл")] On, +#elif LANG_PL + [Description("nie")] Off, + [Description("info")] Info, + [Description("tak")] On, +#else // LANG_EN + [Description("off")] Off, + [Description("info")] Info, + [Description("on")] On, +#endif + Count + } +} diff --git a/TBF_V2/Sources/TBF/Config/Entities/FeedingPath.cs b/TBF_V2/Sources/TBF/Config/Entities/FeedingPath.cs new file mode 100644 index 00000000..dac4a6d5 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Entities/FeedingPath.cs @@ -0,0 +1,53 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; + +namespace Config.Entities +{ + public class FeedingPath : IHasName, IHasItemNr, IHasValves + { + public virtual int Id { get; protected set; } + public virtual int ItemNr { get; set; } + public virtual string Name { get; set; } + public virtual string OriName { get; set; } /// Not mapped to database + public virtual float Qfrom { get; set; } /// Water flow in [m3/h] + public virtual float Qto { get; set; } /// Water flow in [m3/h] + public virtual string Pump { get; set; } + public virtual string RegulValvesPct { get; set; } /// Positions of regulation valves in % separated by ';' + + /// Valves + public virtual string ValvesOpen { get; set; } + public virtual string ValvesClose { get; set; } + + /// ------------- Additional stuff not mapped into the database ------------- + + public FeedingPath() + { + ValvesOpen = string.Empty; + ValvesClose = string.Empty; + } + + public FeedingPath(string name, int itemNr) + : this() + { + Name = name; + ItemNr = itemNr; + } + + public virtual FeedingPath Clone(string name, int itemNr) + { + FeedingPath result = new FeedingPath(name, itemNr); + + result.Qfrom = Qfrom; + result.Qto = Qto; + result.Pump = Pump; + result.RegulValvesPct = RegulValvesPct; + result.ValvesOpen = ValvesOpen; + result.ValvesClose = ValvesClose; + + return result; + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Entities/Group.cs b/TBF_V2/Sources/TBF/Config/Entities/Group.cs new file mode 100644 index 00000000..208840ee --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Entities/Group.cs @@ -0,0 +1,24 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; + +namespace Config.Entities +{ + public class Group + { + public virtual int Id { get; protected set; } + public virtual int Gid { get; set; } + public virtual string Name { get; set; } + + public Group() + { + } + + public Group(int gid, string name) + { + Gid = gid; + Name = name; + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Entities/HeatMetersPath.cs b/TBF_V2/Sources/TBF/Config/Entities/HeatMetersPath.cs new file mode 100644 index 00000000..95e7c006 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Entities/HeatMetersPath.cs @@ -0,0 +1,65 @@ +/// +/// Copyright (c) 2016-2017 Sensus Metering Systems +/// +using System; + +namespace Config.Entities +{ + public class HeatMetersPath : IHasName, IHasItemNr + { + public virtual int Id { get; protected set; } + public virtual int ItemNr { get; set; } + public virtual string Name { get; set; } + public virtual string OriName { get; set; } /// Not mapped to database + + public virtual float TempWarmFrom { get; set; } /// Warm temperature range from [°C] + public virtual float TempWarmTo { get; set; } /// Warm temperature range to [°C] + public virtual float TempColdFrom { get; set; } /// Cold temperature range from [°C] + public virtual float TempColdTo { get; set; } /// Cold temperature renge to [°C] + + public virtual string TMeterRefWarm1 { get; set; } + public virtual string TMeterRefWarm2 { get; set; } + public virtual string TMeterRefCold1 { get; set; } + public virtual string TMeterRefCold2 { get; set; } + + public virtual string TMeterWorkWarm1 { get; set; } + public virtual string TMeterWorkWarm2 { get; set; } + public virtual string TMeterWorkCold1 { get; set; } + public virtual string TMeterWorkCold2 { get; set; } + + /// ------------- Additional stuff not mapped into the database ------------- + + public HeatMetersPath() + { + } + + public HeatMetersPath(string name, int itemNr) + : this() + { + Name = name; + ItemNr = itemNr; + } + + public virtual HeatMetersPath Clone(string name, int itemNr) + { + HeatMetersPath result = new HeatMetersPath(name, itemNr); + + result.TempWarmFrom = TempWarmFrom; + result.TempWarmTo = TempWarmTo; + result.TempColdFrom = TempColdFrom; + result.TempColdTo = TempColdTo; + + result.TMeterRefWarm1 = TMeterRefWarm1; + result.TMeterRefWarm2 = TMeterRefWarm2; + result.TMeterRefCold1 = TMeterRefCold1; + result.TMeterRefCold2 = TMeterRefCold2; + + result.TMeterWorkWarm1 = TMeterWorkWarm1; + result.TMeterWorkWarm2 = TMeterWorkWarm2; + result.TMeterWorkCold1 = TMeterWorkCold1; + result.TMeterWorkCold2 = TMeterWorkCold2; + + return result; + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Entities/IHasItemNr.cs b/TBF_V2/Sources/TBF/Config/Entities/IHasItemNr.cs new file mode 100644 index 00000000..504f3f63 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Entities/IHasItemNr.cs @@ -0,0 +1,11 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace Config.Entities +{ + public interface IHasItemNr + { + int Id { get; } + int ItemNr { get; set; } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Entities/IHasName.cs b/TBF_V2/Sources/TBF/Config/Entities/IHasName.cs new file mode 100644 index 00000000..44bd1137 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Entities/IHasName.cs @@ -0,0 +1,11 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace Config.Entities +{ + public interface IHasName + { + int Id { get; } + string Name { get; set; } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Entities/IHasValves.cs b/TBF_V2/Sources/TBF/Config/Entities/IHasValves.cs new file mode 100644 index 00000000..d2e7232c --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Entities/IHasValves.cs @@ -0,0 +1,11 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace Config.Entities +{ + public interface IHasValves + { + string ValvesOpen { get; set; } /// List of valves to be opened + string ValvesClose { get; set; } /// List of valves to be closed + } +} diff --git a/TBF_V2/Sources/TBF/Config/Entities/IParamsProvider.cs b/TBF_V2/Sources/TBF/Config/Entities/IParamsProvider.cs new file mode 100644 index 00000000..d2bbc541 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Entities/IParamsProvider.cs @@ -0,0 +1,71 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Xml.Serialization; + +namespace Config.Entities +{ + public interface IParamsProvider + { + /// + /// Get XML Serializer + /// + XmlSerializer GetSerializer(); + + string ComponentName { get; } + + /// + /// Number of parameters + /// + int ParamsCount(); + + /// + /// Returns a parameter name + /// + /// Zero based index of the parameter + string ParamName(int ix); + + /// + /// Returns a list of possible values of one parameter (ComboBox when editing) or null (Textbox when editing). + /// + /// Zero based index of the parameter + IList ParamValues(int ix); + + /// + /// Returns a parameter value in the string form + /// + /// Zero based index of the parameter + string ToString(int ix); + + /// + /// Initialize values of all parameters + /// + void InitializeAll(); + + /// + /// Validates the string representation of a parameter + /// + /// Zero based index of the parameter + /// String representation of the parameter + /// Warning message in case the string is wrong or null + /// true = string is OK, false = string is wrong (see 'message') + bool ValidateParam(int ix, string strValue, out string message); + + /// + /// Update the parameter from a string + /// + /// Zero based index of the parameter + /// String representation of the parameter + CfgUpdateFlags UpdateParam(int ix, string strValue); + + void UpdateEmbeddedDbEntity(); + + /// + /// Creates an object copy + /// + /// + IParamsProvider Clone(); + } +} diff --git a/TBF_V2/Sources/TBF/Config/Entities/MeasurementCorrection.cs b/TBF_V2/Sources/TBF/Config/Entities/MeasurementCorrection.cs new file mode 100644 index 00000000..6d3bea7d --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Entities/MeasurementCorrection.cs @@ -0,0 +1,22 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; + +namespace Config.Entities +{ + public class MeasurementCorrection + { + public virtual int Id { get; protected set; } + public virtual int RangeIx { get; set; } /// 0..5 + public virtual float Measurement { get; set; } + public virtual float Correction { get; set; } + + public MeasurementCorrection() { } + + public MeasurementCorrection(int rangeIx) + { + RangeIx = rangeIx; + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Entities/MetersPath.cs b/TBF_V2/Sources/TBF/Config/Entities/MetersPath.cs new file mode 100644 index 00000000..6c105a89 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Entities/MetersPath.cs @@ -0,0 +1,209 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; + +namespace Config.Entities +{ + public class MetersPath : IHasName, IHasItemNr + { + public virtual int Id { get; protected set; } + public virtual int ItemNr { get; set; } + public virtual string Name { get; set; } + public virtual string OriName { get; set; } /// Not mapped to database + + /// Sensors + public virtual string Sensor1 { get; set; } + public virtual string Sensor2 { get; set; } + public virtual string Sensor3 { get; set; } + public virtual string Sensor4 { get; set; } + public virtual string Sensor5 { get; set; } + public virtual string Sensor6 { get; set; } + public virtual string Sensor7 { get; set; } + public virtual string Sensor8 { get; set; } + public virtual string Sensor9 { get; set; } + public virtual string Sensor10 { get; set; } + public virtual string Sensor11 { get; set; } + public virtual string Sensor12 { get; set; } + public virtual string Sensor13 { get; set; } + public virtual string Sensor14 { get; set; } + public virtual string Sensor15 { get; set; } + public virtual string Sensor16 { get; set; } + public virtual string Sensor17 { get; set; } + public virtual string Sensor18 { get; set; } + public virtual string Sensor19 { get; set; } + public virtual string Sensor20 { get; set; } + public virtual string Sensor21 { get; set; } + public virtual string Sensor22 { get; set; } + public virtual string Sensor23 { get; set; } + public virtual string Sensor24 { get; set; } + public virtual string Sensor25 { get; set; } + public virtual string Sensor26 { get; set; } + public virtual string Sensor27 { get; set; } + public virtual string Sensor28 { get; set; } + public virtual string Sensor29 { get; set; } + public virtual string Sensor30 { get; set; } + public virtual string Sensor31 { get; set; } + public virtual string Sensor32 { get; set; } + public virtual string Sensor33 { get; set; } + public virtual string Sensor34 { get; set; } + public virtual string Sensor35 { get; set; } + public virtual string Sensor36 { get; set; } + public virtual string Sensor37 { get; set; } + public virtual string Sensor38 { get; set; } + public virtual string Sensor39 { get; set; } + public virtual string Sensor40 { get; set; } + + /// ------------- Additional stuff not mapped into the database ------------- + + public MetersPath() + { + } + + public MetersPath(string name, int itemNr) + : this() + { + Name = name; + ItemNr = itemNr; + } + + public virtual MetersPath Clone(string name, int itemNr) + { + MetersPath result = new MetersPath(name, itemNr); + result.Sensor1 = Sensor1; + result.Sensor2 = Sensor2; + result.Sensor3 = Sensor3; + result.Sensor4 = Sensor4; + result.Sensor5 = Sensor5; + result.Sensor6 = Sensor6; + result.Sensor7 = Sensor7; + result.Sensor8 = Sensor8; + result.Sensor9 = Sensor9; + result.Sensor10 = Sensor10; + result.Sensor11 = Sensor11; + result.Sensor12 = Sensor12; + result.Sensor13 = Sensor13; + result.Sensor14 = Sensor14; + result.Sensor15 = Sensor15; + result.Sensor16 = Sensor16; + result.Sensor17 = Sensor17; + result.Sensor18 = Sensor18; + result.Sensor19 = Sensor19; + result.Sensor20 = Sensor20; + result.Sensor21 = Sensor21; + result.Sensor22 = Sensor22; + result.Sensor23 = Sensor23; + result.Sensor24 = Sensor24; + result.Sensor25 = Sensor25; + result.Sensor26 = Sensor26; + result.Sensor27 = Sensor27; + result.Sensor28 = Sensor28; + result.Sensor29 = Sensor29; + result.Sensor30 = Sensor30; + result.Sensor31 = Sensor31; + result.Sensor32 = Sensor32; + result.Sensor33 = Sensor33; + result.Sensor34 = Sensor34; + result.Sensor35 = Sensor35; + result.Sensor36 = Sensor36; + result.Sensor37 = Sensor37; + result.Sensor38 = Sensor38; + result.Sensor39 = Sensor39; + result.Sensor40 = Sensor40; + + return result; + } + + /// Returns the component name + public virtual string GetSensor(int i) + { + if (i == 0) return Sensor1; + else if (i == 1) return Sensor2; + else if (i == 2) return Sensor3; + else if (i == 3) return Sensor4; + else if (i == 4) return Sensor5; + else if (i == 5) return Sensor6; + else if (i == 6) return Sensor7; + else if (i == 7) return Sensor8; + else if (i == 8) return Sensor9; + else if (i == 9) return Sensor10; + else if (i == 10) return Sensor11; + else if (i == 11) return Sensor12; + else if (i == 12) return Sensor13; + else if (i == 13) return Sensor14; + else if (i == 14) return Sensor15; + else if (i == 15) return Sensor16; + else if (i == 16) return Sensor17; + else if (i == 17) return Sensor18; + else if (i == 18) return Sensor19; + else if (i == 19) return Sensor20; + else if (i == 20) return Sensor21; + else if (i == 21) return Sensor22; + else if (i == 22) return Sensor23; + else if (i == 23) return Sensor24; + else if (i == 24) return Sensor25; + else if (i == 25) return Sensor26; + else if (i == 26) return Sensor27; + else if (i == 27) return Sensor28; + else if (i == 28) return Sensor29; + else if (i == 29) return Sensor30; + else if (i == 30) return Sensor31; + else if (i == 31) return Sensor32; + else if (i == 32) return Sensor33; + else if (i == 33) return Sensor34; + else if (i == 34) return Sensor35; + else if (i == 35) return Sensor36; + else if (i == 36) return Sensor37; + else if (i == 37) return Sensor38; + else if (i == 38) return Sensor39; + else if (i == 39) return Sensor40; + else return null; + } + + /// Sets the component name + public virtual void SetSensor(int i, string cmpntName) + { + if (i == 0) Sensor1 = cmpntName; + else if (i == 1) Sensor2 = cmpntName; + else if (i == 2) Sensor3 = cmpntName; + else if (i == 3) Sensor4 = cmpntName; + else if (i == 4) Sensor5 = cmpntName; + else if (i == 5) Sensor6 = cmpntName; + else if (i == 6) Sensor7 = cmpntName; + else if (i == 7) Sensor8 = cmpntName; + else if (i == 8) Sensor9 = cmpntName; + else if (i == 9) Sensor10 = cmpntName; + else if (i == 10) Sensor11 = cmpntName; + else if (i == 11) Sensor12 = cmpntName; + else if (i == 12) Sensor13 = cmpntName; + else if (i == 13) Sensor14 = cmpntName; + else if (i == 14) Sensor15 = cmpntName; + else if (i == 15) Sensor16 = cmpntName; + else if (i == 16) Sensor17 = cmpntName; + else if (i == 17) Sensor18 = cmpntName; + else if (i == 18) Sensor19 = cmpntName; + else if (i == 19) Sensor20 = cmpntName; + else if (i == 20) Sensor21 = cmpntName; + else if (i == 21) Sensor22 = cmpntName; + else if (i == 22) Sensor23 = cmpntName; + else if (i == 23) Sensor24 = cmpntName; + else if (i == 24) Sensor25 = cmpntName; + else if (i == 25) Sensor26 = cmpntName; + else if (i == 26) Sensor27 = cmpntName; + else if (i == 27) Sensor28 = cmpntName; + else if (i == 28) Sensor29 = cmpntName; + else if (i == 29) Sensor30 = cmpntName; + else if (i == 30) Sensor31 = cmpntName; + else if (i == 31) Sensor32 = cmpntName; + else if (i == 32) Sensor33 = cmpntName; + else if (i == 33) Sensor34 = cmpntName; + else if (i == 34) Sensor35 = cmpntName; + else if (i == 35) Sensor36 = cmpntName; + else if (i == 36) Sensor37 = cmpntName; + else if (i == 37) Sensor38 = cmpntName; + else if (i == 38) Sensor39 = cmpntName; + else if (i == 39) Sensor40 = cmpntName; + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Entities/OutputPath.cs b/TBF_V2/Sources/TBF/Config/Entities/OutputPath.cs new file mode 100644 index 00000000..8b375f3b --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Entities/OutputPath.cs @@ -0,0 +1,66 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; + +namespace Config.Entities +{ + public class OutputPath : IHasName, IHasItemNr, IHasValves + { + public virtual int Id { get; protected set; } + public virtual int ItemNr { get; set; } + public virtual string Name { get; set; } + public virtual string OriName { get; set; } /// Not mapped to database + public virtual float Qfrom { get; set; } /// Water flow in [m3/h] + public virtual float Qto { get; set; } /// Water flow in [m3/h] + public virtual string RegulValve { get; set; } + public virtual string FlowMeter { get; set; } + public virtual float PidCoef { get; set; } /// PID coefficient for the regulation path + public virtual string StartValve { get; set; } + public virtual string Diverter { get; set; } + public virtual string TempDiv { get; set; } + public virtual string Scale { get; set; } + public virtual string EmptyTankValve { get; set; } /// Not used anywhere + + /// Valves + public virtual string ValvesOpen { get; set; } + public virtual string ValvesClose { get; set; } + + /// ------------- Additional stuff not mapped into the database ------------- + + public OutputPath() + { + ValvesOpen = string.Empty; + ValvesClose = string.Empty; + } + + public OutputPath(string name, int itemNr) + : this() + { + Name = name; + ItemNr = itemNr; + } + + public virtual OutputPath Clone(string name, int itemNr) + { + OutputPath result = new OutputPath(name, itemNr); + + result.Name = Name; + result.Qfrom = Qfrom; + result.Qto = Qto; + result.RegulValve = RegulValve; + result.FlowMeter = FlowMeter; + result.PidCoef = PidCoef; + result.StartValve = StartValve; + result.Diverter = Diverter; + result.TempDiv = TempDiv; + result.Scale = Scale; + result.EmptyTankValve = EmptyTankValve; + result.ValvesOpen = ValvesOpen; + result.ValvesClose = ValvesClose; + + return result; + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Entities/Procedure.cs b/TBF_V2/Sources/TBF/Config/Entities/Procedure.cs new file mode 100644 index 00000000..64504c10 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Entities/Procedure.cs @@ -0,0 +1,242 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; + +namespace Config.Entities +{ + /// + /// Stores one test procedure, supports revisions and history log + /// + public class Procedure : IHasName, IHasItemNr + { + public virtual int Id { get; protected set; } + public virtual int ItemNr { get; set; } + public virtual string Name { get; set; } + + public virtual string Description { get; set; } /// Short description + public virtual string CreationUser { get; set; } /// Name of the user who has created or changed this procedure + public virtual DateTime CreationTime { get; set; } /// Date and time of the creation or change + public virtual string LastChgUser { get; set; } /// Name of the user who has created or changed this procedure + public virtual DateTime LastChgTime { get; set; } /// Date and time of the creation or change + public virtual string LongDescription { get; set; } /// Long description (notes) + + public virtual ProcedureState ProcedureState { get; set; } + public virtual int Revision { get; set; } + public virtual int PredecessorId { get; set; } + public virtual bool ObtainedByCopy { get; set; } /// Initial version of this procedure was a copy of another procedure + /// + public virtual MetersKind MetersKind { get; set; } /// single / compound / heat meters + public virtual string Watermeters { get; set; } /// Water meter name or Id + public virtual bool Protected { get; set; } /// true = procedure cannot be changed by a testing specialist + public virtual bool MustBeComplete { get; set; } /// true = procedure can be finished just when all tests were finished + public virtual bool ManualCtrlDisabled { get; set; } /// true = manual control of valves, etc. is disabled + + public virtual string DataEntry { get; set; } /// Component to use for data entry + public virtual string ResultsPrinter { get; set; } /// Component to use for printing the results + public virtual string ResultsWriter { get; set; } /// Component to use for saving the results into the file + public virtual string TransitionStart { get; set; } + public virtual string TransitionEnd { get; set; } + + public virtual string AltProcName { get; set; } /// Alternative procedure name (null or string.Empty = no alt. procedure) + public virtual int AltProcPeriod { get; set; } /// Period of alternative procedures (0 = no alt. procedure) + + public virtual IList MoreParams { get; set; } + public virtual IList Tests { get; set; } + + /// ------------- Additional stuff not mapped into the database ------------- + + public Procedure() + { + MoreParams = new List(); + Tests = new List(); + + /// + /// Default values + /// + CreationUser = (Users.GlobalData.CurrentUser != null) ? Users.GlobalData.CurrentUser.UserName : null; + CreationTime = DateTime.Now; + LastChgUser = CreationUser; + LastChgTime = CreationTime; + MetersKind = Entities.MetersKind.Single; + Watermeters = string.Empty; + Description = string.Empty; + LongDescription = string.Empty; + } + + public Procedure(string name, int itemNr) + : this() + { + Name = name; + ItemNr = itemNr; + } + + public virtual Procedure Clone() + { + Procedure result = new Procedure(); + + result.ItemNr = ItemNr; + result.Name = Name; + result.Description = Description; + result.CreationUser = CreationUser; + result.CreationTime = CreationTime; + result.LastChgUser = LastChgUser; + result.LastChgTime = LastChgTime; + result.LongDescription = LongDescription; + + result.ProcedureState = ProcedureState; + result.Revision = Revision; + result.PredecessorId = Id; + result.ObtainedByCopy = ObtainedByCopy; + + result.MetersKind = MetersKind; + result.Watermeters = Watermeters; + result.Protected = Protected; + result.MustBeComplete = MustBeComplete; + result.ManualCtrlDisabled = ManualCtrlDisabled; + result.DataEntry = DataEntry; + result.ResultsPrinter = ResultsPrinter; + result.ResultsWriter = ResultsWriter; + result.TransitionStart = TransitionStart; + result.TransitionEnd = TransitionEnd; + + foreach (var prms in MoreParams) { result.MoreParams.Add(prms.Clone(result)); } + foreach (var test in Tests) { result.Tests.Add(test.Clone()); } + + return result; + } + + public virtual void Export(StreamWriter output) + { + output.WriteLine(ItemNr.ToString(CultureInfo.InvariantCulture)); + output.WriteLine(Name); + output.WriteLine(Description); + output.WriteLine(CreationUser); + output.WriteLine(CreationTime.ToString(CultureInfo.InvariantCulture)); + output.WriteLine(LastChgUser); + output.WriteLine(LastChgTime.ToString(CultureInfo.InvariantCulture)); + output.WriteLine(MetersKind.ToString()); + output.WriteLine(Watermeters); + output.WriteLine(Protected.ToString()); + output.WriteLine(MustBeComplete.ToString()); + output.WriteLine(ManualCtrlDisabled.ToString()); + output.WriteLine(DataEntry); + output.WriteLine(ResultsPrinter); + output.WriteLine(ResultsWriter); + output.WriteLine(TransitionStart); + output.WriteLine(TransitionEnd); + + foreach (var prms in MoreParams) { prms.Export(output); } + output.WriteLine(); + + foreach (var test in Tests) { test.Export(output); } + output.WriteLine(); + + output.Close(); + } + + public static Procedure Import(StreamReader input) + { + Procedure result = new Procedure(); + + result.ItemNr = int.Parse(input.ReadLine(), CultureInfo.InvariantCulture); + result.Name = input.ReadLine(); + result.Description = input.ReadLine(); + result.CreationUser = input.ReadLine(); + result.CreationTime = DateTime.Parse(input.ReadLine(), CultureInfo.InvariantCulture); + result.LastChgUser = input.ReadLine(); + result.LastChgTime = DateTime.Parse(input.ReadLine(), CultureInfo.InvariantCulture); + string line = input.ReadLine(); + result.MetersKind = line.Equals(MetersKind.Single.ToString()) ? MetersKind.Single : (line.Equals(MetersKind.Combined.ToString()) ? MetersKind.Combined : MetersKind.HeatMeter); + result.Watermeters = input.ReadLine(); + result.Protected = bool.Parse(input.ReadLine()); + result.MustBeComplete = bool.Parse(input.ReadLine()); + result.ManualCtrlDisabled = bool.Parse(input.ReadLine()); + result.DataEntry = input.ReadLine(); + result.ResultsPrinter = input.ReadLine(); + result.ResultsWriter = input.ReadLine(); + result.TransitionStart = input.ReadLine(); + result.TransitionEnd = input.ReadLine(); + + while(true) + { + ComponentProcedure prms = ComponentProcedure.Import(input, result); + if (prms == null) + break; + else + result.MoreParams.Add(prms); + } + + while (true) + { + Test tst = Test.Import(input, result); + if (tst == null) + break; + else + result.Tests.Add(tst); + } + + return result; + } + + public virtual string Compare(StreamReader inp) + { + System.Text.StringBuilder diff = new System.Text.StringBuilder(); + const string fmt = "{0} = {1}\r\n (in the file {2})\r\n"; + string ln; + + ln = inp.ReadLine(); /// skip ItemNr + ln = inp.ReadLine(); if (ln != Name) { diff.AppendFormat(fmt, "Name", Name, ln); }; + ln = inp.ReadLine(); if (ln != Description) { diff.AppendFormat(fmt, "Description", Description, ln); }; + ln = inp.ReadLine(); /// skip CreationUser + ln = inp.ReadLine(); /// skip CreationTime + ln = inp.ReadLine(); /// skip LastChgUser + ln = inp.ReadLine(); /// skip LastChgTime + ln = inp.ReadLine(); if (ln != MetersKind.ToString()) { diff.AppendFormat(fmt, "MetersKind", MetersKind, ln); }; + ln = inp.ReadLine(); if (ln != Watermeters) { diff.AppendFormat(fmt, "Watermeters", Watermeters, ln); }; + + ln = inp.ReadLine(); if (ln != Protected.ToString()) { diff.AppendFormat(fmt, "Protected", Protected, ln); }; + ln = inp.ReadLine(); if (ln != MustBeComplete.ToString()) { diff.AppendFormat(fmt, "MustBeComplete", MustBeComplete, ln); }; + ln = inp.ReadLine(); if (ln != ManualCtrlDisabled.ToString()) { diff.AppendFormat(fmt, "ManualCtrlDisabled", ManualCtrlDisabled, ln); }; + ln = inp.ReadLine(); if (ln != DataEntry) { diff.AppendFormat(fmt, "DataEntry", DataEntry, ln); }; + ln = inp.ReadLine(); if (ln != ResultsPrinter) { diff.AppendFormat(fmt, "ResultsPrinter", ResultsPrinter, ln); }; + ln = inp.ReadLine(); if (ln != ResultsWriter) { diff.AppendFormat(fmt, "ResultsWriter", ResultsWriter, ln); }; + ln = inp.ReadLine(); if (ln != TransitionStart) { diff.AppendFormat(fmt, "TransitionStart", TransitionStart, ln); }; + ln = inp.ReadLine(); if (ln != TransitionEnd) { diff.AppendFormat(fmt, "TransitionEnd", TransitionEnd, ln); }; + + /// TODO Compare componentprocedure-s + while (ComponentProcedure.Import(inp, null) != null) + { + } + + + //foreach (var test in Tests) + //{ + // string testDiff = test.Compare(inp); + // if (testDiff.Contains( + //} + + //bool extraTestsInFile = true; + //while (Test.Import(inp, null) != null) { extraTestsInFile = true; } + + return diff.ToString(); + } + + public virtual ComponentProcedure GetProcedureParamsEntity(string cmpntName) + { + foreach (var procPrms in MoreParams) + { + if (procPrms.CmpntName == cmpntName) return procPrms; + } + return null; + } + + public override string ToString() + { + return string.Format("{0}, rev.{1}", Name, Revision); + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Entities/ProcedureHistory.cs b/TBF_V2/Sources/TBF/Config/Entities/ProcedureHistory.cs new file mode 100644 index 00000000..8c9a98ca --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Entities/ProcedureHistory.cs @@ -0,0 +1,31 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; + +namespace Config.Entities +{ + public class ProcedureHistory + { + public virtual int Id { get; protected set; } + public virtual Procedure Current { get; set; } + public virtual IList OldProcedures { get; set; } + + /// ------------- Additional stuff not mapped into the database ------------- + + public ProcedureHistory() + { + Current = new Procedure(); + OldProcedures = new List(); + } + + public virtual ProcedureHistory Clone() + { + ProcedureHistory result = new ProcedureHistory(); + result.Current = Current.Clone(); + foreach (Procedure p in OldProcedures) result.OldProcedures.Add(p.Clone()); + return result; + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Entities/Test.cs b/TBF_V2/Sources/TBF/Config/Entities/Test.cs new file mode 100644 index 00000000..9047f035 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Entities/Test.cs @@ -0,0 +1,369 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; + +namespace Config.Entities +{ + /// + /// Test, consisting of one or more repetitions of the test 'SingleTest'. + /// + public class Test : IHasName, IHasItemNr + { + public virtual int Id { get; protected set; } + public virtual int ItemNr { get; set; } + public virtual string Name { get; set; } + public virtual int Part { get; set; } /// Part=0 ... test of all WM-s + /// Part>0 ... part of a set of tests with the same Name: subset of WM-s is given by MetersPath + public virtual sbyte Publish { get; set; } /// 0=no, 1=in all protocols, 2=on screen, 3=internal + public virtual bool DoEvaluate { get; set; } + public virtual float Qfrom { get; set; } /// Water flow low limit in [m3/h] + public virtual float Qto { get; set; } /// Water flow high limit in [m3/h] + public virtual float Volume { get; set; } /// Test volume (target) in [l] + public virtual float TstTime { get; set; } /// Test time (estimate) in [s] + public virtual string Method { get; set; } + public virtual float ErrLimLo { get; set; } /// in [%] (usually < 0) or 1=class1, 2=class2, 3=class3 + public virtual float ErrLimHi { get; set; } /// in [%] (usually > 0) or -Qn in m3/h + public virtual float Uncertainty { get; set; } /// int [%] makes error limits tighter: 0 <= Uncertainty <= abs(ErrLimXx) + public virtual int Repeats { get; set; } + public virtual bool DoDraining { get; set; } + public virtual bool DoZeroing { get; set; } + public virtual bool DoControlWaterTemp { get; set; } + public virtual float TempLimLo { get; set; } /// Lower limit for the controlled temperature + public virtual float TempLimHi { get; set; } /// Upper limit for the controlled temperature + public virtual float PumpPower { get; set; } /// Power of the pump in [%] in the range 0 .. 100.0f, use values 0% and 100% for non-FM pumps + public virtual int MassRepeats { get; set; } /// Number of mass. measurements at the beginning/end of test, 0 = default (=5) + public virtual float MassSpread { get; set; } /// Max spread of mass. measurements at the beginning/end of test, 0 = default + public virtual MassMethod MassMethod { get; set; } /// method of mass. measurement at the beginning/end of test: false=slow (precise), true=using immediate mass measurement and evaluation + public virtual int TimeBeforeFlow { get; set; } /// Delay time before the start of flow control in [s] + public virtual int TimeFlow2Mass { get; set; } /// Delay time from the flow stable to the 1st mass measurement in [s] + public virtual int TimePump2StartV { get; set; } /// Delay time from the start of the pump to opening the start valve in [s] + public virtual int TimeStop2Mass { get; set; } /// Delay time from the test end (diverted) to the 2nd mass measuremen in [s] + public virtual double TolerRed { get; set; } /// = Filter + public virtual TestRedType RedType { get; set; } + public virtual string FeedingPath { get; set; } + public virtual string BenchPath { get; set; } + public virtual string OutputPath { get; set; } + public virtual string MetersPath { get; set; } +#if HEAT_METERS + public virtual string HeatMetersPath { get; set; } +#endif + public virtual string RelTransBefore { get; set; } + public virtual string RelTransBetween { get; set; } + public virtual string RelTransAfter { get; set; } + public virtual string TransitionAfter { get; set; } + + public virtual IList MoreParams { get; set; } + + public virtual Procedure Procedure { get; set; } + + /// ------------- Additional stuff not mapped into the database ------------- + + public Test() + { + MoreParams = new List(); + + /// + /// Default values + /// + Publish = (sbyte)Config.Entities.Publish.Always; + DoEvaluate = true; + Repeats = 1; + DoDraining = false; + DoZeroing = false; + DoControlWaterTemp = false; + TempLimLo = 15.0f; + TempLimHi = 25.0f; + ErrLimLo = -2.0f; /// [%] lower error limit + ErrLimHi = 2.0f; /// [%] upper error limit + Uncertainty = 0; + PumpPower = 60.0f; /// [%] + MassRepeats = 0; /// default + MassSpread = 0; /// default + MassMethod = MassMethod.Scale; /// default + TimeBeforeFlow = 10; /// [s] time before the start of flow control in [s] + TimeFlow2Mass = 5; /// [s] time from the flow stable to the 1st mass measurement in [s] + TimePump2StartV = 1; /// [s] time from the 1st mass measurement to the test start in [s] + TimeStop2Mass = 5; /// [s] between the test end and the final mass measurement + TolerRed = 0; /// = Filter parameter + RelTransBefore = string.Empty; + RelTransBetween = string.Empty; + RelTransAfter = string.Empty; + TransitionAfter = string.Empty; + } + + public Test(string name, int itemNr, Procedure procedure) + : this() + { + Name = name; + ItemNr = itemNr; + Procedure = procedure; + } + + // Makes a new copy of this object (not just a reference) + public virtual Test Clone() + { + Test result = new Test(Name, ItemNr, Procedure); + + result.Part = Part; + result.Publish = Publish; + result.DoEvaluate = DoEvaluate; + result.Qfrom = Qfrom; + result.Qto = Qto; + result.Volume = Volume; + result.TstTime = TstTime; + result.Method = Method; + result.ErrLimLo = ErrLimLo; + result.ErrLimHi = ErrLimHi; + result.Uncertainty = Uncertainty; + result.Repeats = Repeats; + result.DoDraining = DoDraining; + result.DoZeroing = DoZeroing; + result.DoControlWaterTemp = DoControlWaterTemp; + result.TempLimLo = TempLimLo; + result.TempLimHi = TempLimHi; + result.PumpPower = PumpPower; + result.MassRepeats = MassRepeats; + result.MassSpread = MassSpread; + result.MassMethod = MassMethod; + result.TimeBeforeFlow = TimeBeforeFlow; + result.TimeFlow2Mass = TimeFlow2Mass; + result.TimePump2StartV = TimePump2StartV; + result.TimeStop2Mass = TimeStop2Mass; + result.TolerRed = TolerRed; + result.RedType = RedType; + result.FeedingPath = FeedingPath; + result.BenchPath = BenchPath; + result.OutputPath = OutputPath; + result.MetersPath = MetersPath; +#if HEAT_METERS + result.HeatMetersPath = HeatMetersPath; +#endif + result.RelTransBefore = RelTransBefore; + result.RelTransBetween = RelTransBetween; + result.RelTransAfter = RelTransAfter; + result.TransitionAfter = TransitionAfter; + foreach (var prms in MoreParams) { result.MoreParams.Add(prms.Clone()); } + + return result; + } + + public virtual void Export(StreamWriter output) + { + CultureInfo ci = CultureInfo.InvariantCulture; + + output.WriteLine(Name); + output.WriteLine(Part.ToString(ci)); + output.WriteLine(Publish.ToString(ci)); + output.WriteLine(DoEvaluate.ToString()); + output.WriteLine(Qfrom.ToString(ci)); + output.WriteLine(Qto.ToString(ci)); + output.WriteLine(Volume.ToString(ci)); + output.WriteLine(TstTime.ToString(ci)); + output.WriteLine(Method); + output.WriteLine(ErrLimLo.ToString(ci)); + output.WriteLine(ErrLimHi.ToString(ci)); + output.WriteLine(Uncertainty.ToString(ci)); + output.WriteLine(Repeats.ToString(ci)); + output.WriteLine(DoDraining.ToString()); + output.WriteLine(DoZeroing.ToString()); + output.WriteLine(DoControlWaterTemp.ToString()); + output.WriteLine(TempLimLo.ToString(ci)); + output.WriteLine(TempLimHi.ToString(ci)); + output.WriteLine(PumpPower.ToString(ci)); + output.WriteLine(MassRepeats.ToString(ci)); + output.WriteLine(MassSpread.ToString(ci)); + output.WriteLine(((byte)MassMethod).ToString(ci)); + output.WriteLine(TimeBeforeFlow.ToString(ci)); + output.WriteLine(TimeFlow2Mass.ToString(ci)); + output.WriteLine(TimePump2StartV.ToString(ci)); + output.WriteLine(TimeStop2Mass.ToString(ci)); + output.WriteLine(FeedingPath); + output.WriteLine(BenchPath); + output.WriteLine(OutputPath); + output.WriteLine(MetersPath); + output.WriteLine(RelTransBefore); + output.WriteLine(RelTransBetween); + output.WriteLine(RelTransAfter); + output.WriteLine(TransitionAfter); + + foreach (var prms in MoreParams) { prms.Export(output); } + output.WriteLine(); + } + + public static Test Import(StreamReader input, Procedure newProcedure) + { + string firstLine = input.ReadLine(); + if (string.IsNullOrEmpty(firstLine)) + { + return null; + } + + CultureInfo ci = CultureInfo.InvariantCulture; + Test tst = new Test(); + + tst.Name = firstLine; + tst.Part = int.Parse(input.ReadLine(), ci); + tst.Publish = sbyte.Parse(input.ReadLine(), ci); + tst.DoEvaluate = bool.Parse(input.ReadLine()); + tst.Qfrom = float.Parse(input.ReadLine(), ci); + tst.Qto = float.Parse(input.ReadLine(), ci); + tst.Volume = float.Parse(input.ReadLine(), ci); + tst.TstTime = float.Parse(input.ReadLine(), ci); + tst.Method = input.ReadLine(); + tst.ErrLimLo = float.Parse(input.ReadLine(), ci); + tst.ErrLimHi = float.Parse(input.ReadLine(), ci); + tst.Uncertainty = float.Parse(input.ReadLine(), ci); + tst.Repeats = int.Parse(input.ReadLine(), ci); + tst.DoDraining = bool.Parse(input.ReadLine()); + tst.DoZeroing = bool.Parse(input.ReadLine()); + tst.DoControlWaterTemp = bool.Parse(input.ReadLine()); + tst.TempLimLo = float.Parse(input.ReadLine(), ci); + tst.TempLimHi = float.Parse(input.ReadLine(), ci); + tst.PumpPower = float.Parse(input.ReadLine(), ci); + tst.MassRepeats = int.Parse(input.ReadLine(), ci); + tst.MassSpread = float.Parse(input.ReadLine(), ci); + tst.MassMethod = (MassMethod)byte.Parse(input.ReadLine(), ci); + tst.TimeBeforeFlow = int.Parse(input.ReadLine(), ci); + tst.TimeFlow2Mass = int.Parse(input.ReadLine(), ci); + tst.TimePump2StartV = int.Parse(input.ReadLine(), ci); + tst.TimeStop2Mass = int.Parse(input.ReadLine(), ci); + tst.FeedingPath = input.ReadLine(); + tst.BenchPath = input.ReadLine(); + tst.OutputPath = input.ReadLine(); + tst.MetersPath = input.ReadLine(); + tst.RelTransBefore = input.ReadLine(); + tst.RelTransBetween = input.ReadLine(); + tst.RelTransAfter = input.ReadLine(); + tst.TransitionAfter = input.ReadLine(); + + while (true) + { + ComponentTest prms = ComponentTest.Import(input, tst); + if (prms == null) + break; + else + tst.MoreParams.Add(prms); + } + + tst.Procedure = newProcedure; + return tst; + } + + public virtual string Compare(StreamReader inp) + { + System.Text.StringBuilder diff = new System.Text.StringBuilder(); + string fmt = string.Format("Test {0} : ", Name) + "{0} = {1}\r\n (in the file {2})\r\n"; + string ln; + CultureInfo ci = CultureInfo.InvariantCulture; + + string firstLine = inp.ReadLine(); + if (string.IsNullOrEmpty(firstLine)) return string.Format("Test {0} is missing in the file\r\n", Name); + + if (Name != firstLine) { diff.AppendFormat(fmt, "Name", Name, firstLine); }; + ln = inp.ReadLine(); if (ln != Part.ToString(ci)) { diff.AppendFormat(fmt, "Part", Part.ToString(ci), ln); }; + ln = inp.ReadLine(); if (ln != Publish.ToString(ci)) { diff.AppendFormat(fmt, "Publish", Publish.ToString(ci), ln); }; + ln = inp.ReadLine(); if (ln != DoEvaluate.ToString(ci)) { diff.AppendFormat(fmt, "Evaluate", DoEvaluate.ToString(ci), ln); }; + ln = inp.ReadLine(); if (ln != Qfrom.ToString(ci)) { diff.AppendFormat(fmt, "Qfrom", Qfrom.ToString(ci), ln); }; + ln = inp.ReadLine(); if (ln != Qto.ToString(ci)) { diff.AppendFormat(fmt, "Qto", Qto.ToString(ci), ln); }; + ln = inp.ReadLine(); if (ln != Volume.ToString(ci)) { diff.AppendFormat(fmt, "Volume", Volume.ToString(ci), ln); }; + ln = inp.ReadLine(); if (ln != TstTime.ToString(ci)) { diff.AppendFormat(fmt, "TstTime", TstTime.ToString(ci), ln); }; + ln = inp.ReadLine(); if (ln != Method) { diff.AppendFormat(fmt, "Method", Method, ln); }; + ln = inp.ReadLine(); if (ln != ErrLimLo.ToString(ci)) { diff.AppendFormat(fmt, "ErrLimLo", ErrLimLo.ToString(ci), ln); }; + ln = inp.ReadLine(); if (ln != ErrLimHi.ToString(ci)) { diff.AppendFormat(fmt, "ErrLimHi", ErrLimHi.ToString(ci), ln); }; + ln = inp.ReadLine(); if (ln != Uncertainty.ToString(ci)) { diff.AppendFormat(fmt, "Uncertainty", Uncertainty.ToString(ci), ln); }; + ln = inp.ReadLine(); if (ln != Repeats.ToString(ci)) { diff.AppendFormat(fmt, "Repeats", Repeats.ToString(ci), ln); }; + ln = inp.ReadLine(); if (ln != DoDraining.ToString(ci)) { diff.AppendFormat(fmt, "Draining", DoDraining.ToString(ci), ln); }; + ln = inp.ReadLine(); if (ln != DoZeroing.ToString(ci)) { diff.AppendFormat(fmt, "Zeroing", DoZeroing.ToString(ci), ln); }; + ln = inp.ReadLine(); if (ln != DoControlWaterTemp.ToString()) { diff.AppendFormat(fmt, "DoControlWaterTemp", DoControlWaterTemp.ToString(ci), ln); }; + ln = inp.ReadLine(); if (ln != TempLimLo.ToString(ci)) { diff.AppendFormat(fmt, "TempLimLo", TempLimLo.ToString(ci), ln); }; + ln = inp.ReadLine(); if (ln != TempLimHi.ToString(ci)) { diff.AppendFormat(fmt, "TempLimHi", TempLimHi.ToString(ci), ln); }; + ln = inp.ReadLine(); if (ln != PumpPower.ToString(ci)) { diff.AppendFormat(fmt, "PumpPower", PumpPower.ToString(ci), ln); }; + ln = inp.ReadLine(); if (ln != MassRepeats.ToString(ci)) { diff.AppendFormat(fmt, "MassRepeats", MassRepeats.ToString(ci), ln); }; + ln = inp.ReadLine(); if (ln != MassSpread.ToString(ci)) { diff.AppendFormat(fmt, "MassSpread", MassSpread.ToString(ci), ln); }; + ln = inp.ReadLine(); if (ln != ((byte)MassMethod).ToString(ci)) { diff.AppendFormat(fmt, "MassMethod", ((byte)MassMethod).ToString(ci), ln); }; + ln = inp.ReadLine(); if (ln != TimeBeforeFlow.ToString(ci)) { diff.AppendFormat(fmt, "TimeBeforeFlow", TimeBeforeFlow.ToString(ci), ln); }; + ln = inp.ReadLine(); if (ln != TimeFlow2Mass.ToString(ci)) { diff.AppendFormat(fmt, "TimeFlow2Mass", TimeFlow2Mass.ToString(ci), ln); }; + ln = inp.ReadLine(); if (ln != TimePump2StartV.ToString(ci)) { diff.AppendFormat(fmt, "TimePump2StartV", TimePump2StartV.ToString(ci), ln); }; + ln = inp.ReadLine(); if (ln != TimeStop2Mass.ToString(ci)) { diff.AppendFormat(fmt, "TimeStop2Mass", TimeStop2Mass.ToString(ci), ln); }; + ln = inp.ReadLine(); if (ln != FeedingPath) { diff.AppendFormat(fmt, "FeedingPath", FeedingPath, ln); }; + ln = inp.ReadLine(); if (ln != BenchPath) { diff.AppendFormat(fmt, "BenchPath", BenchPath, ln); }; + ln = inp.ReadLine(); if (ln != OutputPath) { diff.AppendFormat(fmt, "OutputPath", OutputPath, ln); }; + ln = inp.ReadLine(); if (ln != MetersPath) { diff.AppendFormat(fmt, "MetersPath", MetersPath, ln); }; + ln = inp.ReadLine(); if (ln != RelTransBefore) { diff.AppendFormat(fmt, "RelTransBefore", RelTransBefore, ln); }; + ln = inp.ReadLine(); if (ln != RelTransBetween) { diff.AppendFormat(fmt, "RelTransBetween", RelTransBetween, ln); }; + ln = inp.ReadLine(); if (ln != RelTransAfter) { diff.AppendFormat(fmt, "RelTransAfter", RelTransAfter, ln); }; + ln = inp.ReadLine(); if (ln != TransitionAfter) { diff.AppendFormat(fmt, "TransitionAfter", TransitionAfter, ln); }; + + return diff.ToString(); + } + + public virtual ComponentTest GetTestParamsEntity(string cmpntName) + { + foreach (var tstPrms in MoreParams) + { + if (tstPrms.CmpntName == cmpntName) return tstPrms; + } + return null; + } + + public virtual float GetErrLimLo(float flow) + { + if (ErrLimLo <= ErrLimHi) + { + return ErrLimLo; /// Error limit of a water meter + } + else + { + /// Metrological class and nominal flow of a heat meter + int metrClass = (int)Math.Round(ErrLimLo); + float Qp = Math.Abs(ErrLimHi); + float Q = Math.Max(flow, 0.00001f); /// to avoid division by zero + + /// Calculate the error limit of a heat meter + switch (metrClass) + { + default: + case 1: return -Math.Min(3.5f, 1.0f + 0.01f * Qp / Q); + case 2: return -Math.Min(5.0f, 2.0f + 0.02f * Qp / Q); + case 3: return -Math.Min(5.0f, 3.0f + 0.05f * Qp / Q); + } + } + } + + public virtual float GetErrLimHi(float flow) + { + if (ErrLimLo <= ErrLimHi) + { + return ErrLimHi; /// Error limit of a water meter + } + else + { + /// Metrological class and nominal flow of a heat meter + int metrClass = (int)Math.Round(ErrLimLo); + float Qp = Math.Abs(ErrLimHi); + float Q = Math.Max(flow, 0.00001f); /// to avoid division by zero + + /// Calculate the error limit of a heat meter + switch (metrClass) + { + default: + case 1: return +Math.Min(3.5f, 1.0f + 0.01f * Qp / Q); + case 2: return +Math.Min(5.0f, 2.0f + 0.02f * Qp / Q); + case 3: return +Math.Min(5.0f, 3.0f + 0.05f * Qp / Q); + } + } + } + + + public override string ToString() + { + string partStr = (Part > 0) ? string.Format(", part {0}", Part) : string.Empty; + + return string.Format("{0}(P.{1},{2}){3}", Name, ((Publish)Publish).ToString(), DoEvaluate ? "E" : "-", partStr); + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Entities/TransitionSequence.cs b/TBF_V2/Sources/TBF/Config/Entities/TransitionSequence.cs new file mode 100644 index 00000000..d17ef434 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Entities/TransitionSequence.cs @@ -0,0 +1,41 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System.Collections.Generic; + +namespace Config.Entities +{ + /// + /// Stores one transition sequence containing a list of transition steps + /// + public class TransitionSequence : IHasName, IHasItemNr + { + public virtual int Id { get; protected set; } + public virtual int ItemNr { get; set; } + public virtual string Name { get; set; } + public virtual string OriName { get; set; } /// Not mapped to database + public virtual string Description { get; set; } /// Short description + public virtual IList TransitionSteps { get; set; } + + public TransitionSequence() + { + TransitionSteps = new List(); + } + + public TransitionSequence(string name, int itemNr) + : this() + { + Name = name; + ItemNr = itemNr; + } + + public virtual TransitionSequence Clone() + { + TransitionSequence result = new TransitionSequence(); + result.Name = Name; + result.Description = Description; + foreach (var step in TransitionSteps) { result.TransitionSteps.Add(step.Clone()); } + return result; + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Entities/TransitionStep.cs b/TBF_V2/Sources/TBF/Config/Entities/TransitionStep.cs new file mode 100644 index 00000000..143b525e --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Entities/TransitionStep.cs @@ -0,0 +1,65 @@ +/// +/// Copyright (c) 2013-2015, 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; + +namespace Config.Entities +{ + public class TransitionStep : IHasItemNr, IHasValves + { + public virtual int Id { get; protected set; } + public virtual int ItemNr { get; set; } /// Order of the preparation step + public virtual int Duration { get; set; } /// Duration in seconds + public virtual string Message { get; set; } /// Message + public virtual string EndCondition { get; set; } /// Condition when transition step is finished (next to the duration) + public virtual string ValvesOpen { get; set; } /// List of valves to be opened + public virtual string ValvesClose { get; set; } /// List of valves to be closed + public virtual string RegulValvesPct { get; set; } /// Positions of regulation valves in % separated by ';' + public virtual string PumpWithFMPcts { get; set; } /// Power of FM controlled pumps in % separated by ';' + + public virtual TransitionSequence TransitionSequence { get; set; } + + /// ------------- Additional stuff not mapped into the database ------------- + + public TransitionStep() + { + Duration = 5; /// sec. + EndCondition = "None"; + } + + public TransitionStep(int itemNr, TransitionSequence sequence) + : this() + { + ItemNr = itemNr; + TransitionSequence = sequence; + } + + public virtual TransitionStep Clone() + { + TransitionStep result = new TransitionStep(ItemNr, TransitionSequence); + result.Duration = Duration; + result.Message = Message; + result.EndCondition = EndCondition; + result.ValvesOpen = ValvesOpen; + result.ValvesClose = ValvesClose; + result.RegulValvesPct = RegulValvesPct; + result.PumpWithFMPcts = PumpWithFMPcts; + return result; + } + + public virtual string ToString(string indent) + { + string result = ""; + result += indent + "ItemNr = " + ItemNr.ToString() + ", "; + result += indent + "Duration = " + Duration.ToString() + ", "; + result += indent + "Message = " + Message + ", "; + result += indent + "EndCondition = " + EndCondition + ", "; + result += indent + "ValvesOpen = " + ValvesOpen + ", "; + result += indent + "ValvesClose = " + ValvesClose + ", "; + result += indent + "RegulValvesPct = " + RegulValvesPct + ", "; + result += indent + "PumpsWithFMPct = " + PumpWithFMPcts + Environment.NewLine; + return result; + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Entities/User.cs b/TBF_V2/Sources/TBF/Config/Entities/User.cs new file mode 100644 index 00000000..f969c950 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Entities/User.cs @@ -0,0 +1,43 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; + +namespace Config.Entities +{ + public class User + { + public virtual int Id { get; protected set; } + public virtual string UserName { get; set; } /// = name, alias, abbreviation + public virtual string FullName { get; set; } /// = description + public virtual int Number { get; set; } + public virtual string Password { get; set; } + public virtual DateTime LastPwChange { get; set; } + public virtual IList Groups { get; set; } //User can be a member of a list of groups + + public User() + { + Groups = new List(); + } + + /// + /// Adds a group to the user. + /// + /// Group to be added + public virtual void AddGroup(Group group) + { + Groups.Add(group); + } + + /// + /// Encrypts and sets users password. + /// + /// Unencrypted password + public virtual void SetPassword(string password) + { + Password = Users.Entities.User.getHash(password); + LastPwChange = DateTime.Now; + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Entities/VirtualBenchSequence.cs b/TBF_V2/Sources/TBF/Config/Entities/VirtualBenchSequence.cs new file mode 100644 index 00000000..151d8c20 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Entities/VirtualBenchSequence.cs @@ -0,0 +1,39 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; + +namespace Config.Entities +{ + public class VirtualBenchSequence : IHasName, IHasItemNr + { + public virtual int Id { get; protected set; } + public virtual int ItemNr { get; set; } + public virtual string Name { get; set; } + public virtual string OriName { get; set; } /// Not mapped to database + public virtual string Description { get; set; } /// Short description + public virtual IList VirtualBenchSteps { get; set; } + + public VirtualBenchSequence() + { + VirtualBenchSteps = new List(); + } + + public VirtualBenchSequence(string name, int itemNr) + : this() + { + Name = name; + ItemNr = itemNr; + } + + public virtual VirtualBenchSequence Clone() + { + VirtualBenchSequence result = new VirtualBenchSequence(); + result.Name = Name; + result.Description = Description; + foreach (var step in VirtualBenchSteps) { result.VirtualBenchSteps.Add(step.Clone()); } + return result; + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Entities/VirtualBenchStep.cs b/TBF_V2/Sources/TBF/Config/Entities/VirtualBenchStep.cs new file mode 100644 index 00000000..8e850eda --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Entities/VirtualBenchStep.cs @@ -0,0 +1,39 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; + +namespace Config.Entities +{ + public class VirtualBenchStep : IHasItemNr + { + public virtual int Id { get; protected set; } + public virtual int ItemNr { get; set; } /// Order of the preparation step + public virtual int Duration { get; set; } /// Duration in seconds + /// + + public virtual VirtualBenchSequence VirtualBenchSequence { get; set; } + + /// ------------- Additional stuff not mapped into the database ------------- + + public VirtualBenchStep() + { + Duration = 5; /// sec. + } + + public VirtualBenchStep(int itemNr, VirtualBenchSequence sequence) + : this() + { + ItemNr = itemNr; + VirtualBenchSequence = sequence; + } + + public virtual VirtualBenchStep Clone() + { + VirtualBenchStep result = new VirtualBenchStep(ItemNr, VirtualBenchSequence); + + return result; + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Entities/WMType.cs b/TBF_V2/Sources/TBF/Config/Entities/WMType.cs new file mode 100644 index 00000000..ab60d298 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Entities/WMType.cs @@ -0,0 +1,78 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +/// This class holds the watermeter type specific data +/// that have all watermaters of the same type in common + +namespace Config.Entities +{ + public class WMType + { + // mapped + public virtual int Id { get; protected set; } /// primary key + public virtual DateTime CreateTime { get; set; } /// Date and time of the creation or change + public virtual string CreateUserName { get; set; } /// Name of the user who has created or changed this procedure + public virtual string CreateDescription { get; set; } /// Description\ + + public virtual string Name { get; set; } /// type name + public virtual float PulseRate { get; set; } /// Pulses per Liter + + // not yet mapped + public virtual int IdentNr { get; protected set; } /// identification number of watermeter tzpe + public virtual int Diameter { get; set; } /// nominal diameter + public virtual int Pressure { get; set; } /// nominal pressure + public virtual int Length { get; set; } /// construction length + public virtual int Temperatur { get; set; } /// nominal temperature in C + public virtual float NominalFlow { get; set; } /// nominal flow Qn + + /// ------------- Additional stuff not mapped into the database ------------- + + public WMType() + { + } + + public static WMType DefaultWMType() + { + WMType procedure = new WMType() + { + CreateTime = DateTime.Now, + CreateUserName = Users.GlobalData.CurrentUser.UserName, + CreateDescription = "A default water meter created.", + Name = "Watermeter", + PulseRate = 1000, + }; + return procedure; + } + + public virtual WMType Clone() + { + WMType result = new WMType(); + + result.CreateTime = CreateTime; + result.CreateUserName = CreateUserName; + result.CreateDescription = CreateDescription; + result.Name = Name; + result.PulseRate = PulseRate; + + return result; + } + + public override string ToString() + { + string result = ""; + result += "WMTpe: " + Environment.NewLine; + result += " Name = " + Name + Environment.NewLine; + result += " Created by = " + CreateUserName + Environment.NewLine; + result += " Created on = " + CreateTime.ToString() + Environment.NewLine; + result += " Description = " + CreateDescription + Environment.NewLine; + result += " Pulse rate = " + PulseRate.ToString() + Environment.NewLine; + return result; + } + } +} + diff --git a/TBF_V2/Sources/TBF/Config/Entities/Watermeter.cs b/TBF_V2/Sources/TBF/Config/Entities/Watermeter.cs new file mode 100644 index 00000000..ff1f058f --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Entities/Watermeter.cs @@ -0,0 +1,40 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using NHibernate; +using FluentNHibernate; + +namespace Config.Entities +{ + public class Watermeter + { + public virtual int Id { get; protected set; } /// primary key + + public virtual DateTime CreateTime { get; set; } /// Date and time of the creation or change + public virtual string CreateUserName { get; set; } /// Name of the user who has created or changed this procedure + public virtual string CreateDescription { get; set; } /// Description + + /// mapped + public virtual string Serial { get; set; } /// serial number + public virtual WMType WMType { get; set; } /// type of watermeter + /// + + /// + /// Load a watermeter from the database + /// + public static Watermeter LoadBySerialnr(string SerialNr) + { + IList ListOfWatermeters = FluentCommon.CreateSession(Users.Entities.DBKind.Results) + .CreateQuery("FROM Watermeter WHERE Serial = :SerialNrParameter") + .SetParameter("SerialNrParameter", SerialNr) + .List(); + if (ListOfWatermeters.Count > 0) return ListOfWatermeters.ElementAt(0); + return null; + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/FluentCommon.cs b/TBF_V2/Sources/TBF/Config/FluentCommon.cs new file mode 100644 index 00000000..ca8b42f6 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/FluentCommon.cs @@ -0,0 +1,247 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using FluentNHibernate.Cfg; +using FluentNHibernate.Cfg.Db; +using NHibernate; +using NHibernate.Cfg; +using NHibernate.Tool.hbm2ddl; +using Config.Resources; + +namespace Config +{ + public static class FluentCommon + { + /// + /// Session factories for regular sessions. + /// + public static ISessionFactory[] SessionFactories = new ISessionFactory[(int)Users.Entities.DBKind.Count]; + + /// + /// NHibernate session factory (to create the database session 'SessionFactory') + /// + /// A database session + static ISessionFactory CreateSessionFactory(Users.Entities.DBKind database) + { + Users.Entities.DBType dbType; + string connectionString; + + switch (database) + { + default: + case Users.Entities.DBKind.Config: + dbType = Data.CurrentBench.ProceduresDBSettings.DbType; + connectionString = Data.CurrentBench.ProceduresDBSettings.ConnectionString; + break; + case Users.Entities.DBKind.Results: + dbType = Data.CurrentBench.WaterMetersDBSettings.DbType; + connectionString = Data.CurrentBench.WaterMetersDBSettings.ConnectionString; + break; + case Users.Entities.DBKind.RemoteConfig: + dbType = Data.CurrentBench.UsersDBSettings.DbType; + connectionString = Data.CurrentBench.UsersDBSettings.ConnectionString; + break; + } + + return CreateSessionFactory(database, dbType, connectionString, false); + } + + /// + /// NHibernate session factory (to create the database session 'SessionFactory') + /// + /// A database session + public static ISessionFactory CreateSessionFactory(Users.Entities.DBKind database, Users.Entities.DBType dbType, string connectionString, bool createDB) + { + try + { + FluentConfiguration cfg = Fluently.Configure(); + + switch (dbType) + { + default: + case Users.Entities.DBType.SQLite: + cfg = cfg.Database(SQLiteConfiguration.Standard.UsingFile(connectionString)); + break; + case Users.Entities.DBType.MySql: + cfg = cfg.Database(MySQLConfiguration.Standard.ConnectionString(connectionString)); + break; + } + + switch (database) + { + default: + case Users.Entities.DBKind.Config: + case Users.Entities.DBKind.RemoteConfig: + cfg = cfg.Mappings(m => m.FluentMappings.AddFromAssemblyOf()); + break; + case Users.Entities.DBKind.Results: + cfg = cfg.Mappings(m => m.FluentMappings.AddFromAssemblyOf()); + break; + } + + if (createDB) + { + return cfg.ExposeConfiguration(BuildSchemaCreate).BuildSessionFactory(); + } + else + { + return cfg.ExposeConfiguration(BuildSchema).BuildSessionFactory(); + } + } + catch (Exception exc) + { + MessageBox.Show(string.Format(Strings.Cannot_open_DB_Cause_0, exc.Message), + Strings.Error, + MessageBoxButtons.OK, + MessageBoxIcon.Error); + return null; + } + } + + public delegate void BuildSchemaDlgt(Configuration config); + + static void BuildSchema(Configuration config) + { + /// This NHibernate tool takes a configuration (with mapping info in) + /// and exports a database schema from it + new SchemaExport(config).SetOutputFile("db_schema"); + } + + static void BuildSchemaCreate(Configuration config) + { + /// This NHibernate tool takes a configuration (with mapping info in) + /// and exports a database schema from it + new SchemaExport(config).Create(true, true); + } + + /// Create a NHibernate session for the given database + public static ISession CreateSession(Users.Entities.DBKind database) + { + int ix = (int)database; + if (ix < 0 || ix >= (int)Users.Entities.DBKind.Count) return null; + + if (SessionFactories[ix] == null) SessionFactories[ix] = CreateSessionFactory(database); + + return SessionFactories[ix].OpenSession(); + } + + public static void SaveToDb(Users.Entities.DBKind database, object obj) + { + SaveToDb(CreateSession(database), obj); + } + + public static void SaveToDb(ISession session, object obj) + { + using (var transaction = session.BeginTransaction()) + { + try + { + session.SaveOrUpdate(obj); + transaction.Commit(); + } + catch + { + transaction.Rollback(); + } + } + } + + public static void DeleteFromDb(Users.Entities.DBKind database, object obj) + { + DeleteFromDb(CreateSession(database), obj); + } + + public static void DeleteFromDb(ISession session, object obj) + { + using (var transaction = session.BeginTransaction()) + { + session.Delete(obj); + transaction.Commit(); + } + } + + /// + /// Create an empty users database. + /// Database contains only the user 'admin' and the control board component 'CB'. + /// + /// DBType.SQLite or DBType.MySql + /// Connection string + /// true=success, false=error + public static bool CreateEmptyConfigDB(Users.Entities.DBType dbType, string connectionString) + { + ISessionFactory sessionFactory = CreateSessionFactory(Users.Entities.DBKind.Config, dbType, connectionString, true); + if (sessionFactory == null) return false; + + /// Populate the database + using (var session = sessionFactory.OpenSession()) + { + using (var transaction = session.BeginTransaction()) + { + /// + /// Prepare all groups + /// + var testers = new Config.Entities.Group((int)Users.Grp.GID.Testers, Strings.Tester); + var testingSpecialists = new Config.Entities.Group((int)Users.Grp.GID.TestingSpecialists, Strings.Testing_Specialist); + var headOfLab = new Config.Entities.Group((int)Users.Grp.GID.HeadOfLab, Strings.Head_of_Lab); + var maintenanceSpecialists = new Config.Entities.Group((int)Users.Grp.GID.MaintenanceSpecialists, Strings.Maintenance_Specialist); + var metrologists = new Config.Entities.Group((int)Users.Grp.GID.Metrologists, Strings.Metrologist); + var calibrationSpecialists = new Config.Entities.Group((int)Users.Grp.GID.CalibrationSpecialists, Strings.Calibration_Specialist); + var administrators = new Config.Entities.Group((int)Users.Grp.GID.Administrators, Strings.Administrator); + + /// Create the user 'admin' add his groups + var admin = new Config.Entities.User + { + UserName = Data.AdminUsername, + FullName = Strings.Administrator, + LastPwChange = DateTime.Now + }; + admin.SetPassword(Data.AdminPassword); + admin.AddGroup(testers); + admin.AddGroup(testingSpecialists); + admin.AddGroup(headOfLab); + admin.AddGroup(maintenanceSpecialists); + admin.AddGroup(metrologists); + admin.AddGroup(calibrationSpecialists); + admin.AddGroup(administrators); + + session.SaveOrUpdate(admin); + + ///// Create the control board component + //var cmpnt = (new BenchControl.Elde.ControlBoardCfg(new BenchControl.Elde.ControlBoardFactory())).CreateDbEntity(); + //session.SaveOrUpdate(cmpnt); + + transaction.Commit(); + } + } + + return true; + } + + /// + /// Create an empty water meters database + /// + /// DBType.SQLite or DBType.MySql + /// Connection string + /// true=success, false=error + public static bool CreateEmptyResultsDB(Users.Entities.DBType dbType, string connectionString) + { + ISessionFactory sessionFactory = CreateSessionFactory(Users.Entities.DBKind.Results, dbType, connectionString, true); + if (sessionFactory == null) return false; + + /// Populate the database + //using (var session = sessionFactory.OpenSession()) + //{ + // using (var transaction = session.BeginTransaction()) + // { + // /// Create one component + // var cmpnt = (new BenchControl.Elde.ControlBoardCfg("CB", 1)).CreateDbEntity(); + // session.SaveOrUpdate(cmpnt); + // transaction.Commit(); + // } + //} + return true; + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Formulas.cs b/TBF_V2/Sources/TBF/Config/Formulas.cs new file mode 100644 index 00000000..85a5d873 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Formulas.cs @@ -0,0 +1,399 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using log4net; + +namespace Config +{ + public static class Formulas + { + private static readonly ILog log = LogManager.GetLogger(typeof(Formulas)); + private static readonly ILog logrefError = LogManager.GetLogger("RefErrorLog"); + /// + /// Tables to calculate specific enthalpy + /// + private static readonly int[] Ii; + private static readonly int[] Ji; + private static readonly double[] ni; + + private static readonly double[] Di; + + /// + /// Constructor + /// + static Formulas() + { + /// + /// Initialize tables to calculate specific enthalpies + /// + Ii = new int[34] { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 8, 8, 21, 23, 29, 30, 31, 32 }; + Ji = new int[34] { -2, -1, 0, 1, 2, 3, 4, 5, -9, -7, -1, 0, 1, 3, -3, 0, 1, 3, 17, -4, 0, 6, -5, -2, 10, -8, -11, -6, -29, -31, -38, -39, -40, -41 }; + ni = new double[34] { + 0.14632971213167, /// 1 + -0.84548187169114, /// 2 + -0.37563603672040E1, /// 3 + 0.33855169168385E1, /// 4 + -0.95791963387872, /// 5 + 0.15772038513228, /// 6 + -0.16616417199501E-1, /// 7 + 0.81214629983568E-3, /// 8 + 0.28319080123804E-3, /// 9 + -0.60706301565874E-3, /// 10 + -0.18990068218419E-1, /// 11 + -0.32529748770505E-1, /// 12 + -0.21841717175414E-1, /// 13 + -0.52838357969930E-4, /// 14 + -0.47184321073267E-3, /// 15 + -0.30001780793026E-3, /// 16 + 0.47661393906987E-4, /// 17 + -0.44141845330846E-5, /// 18 + -0.72694996297594E-15, /// 19 + -0.31679644845054E-4, /// 20 + -0.28270797985312E-5, /// 21 + -0.85205128120103E-9, /// 22 + -0.22425281908000E-5, /// 23 + -0.65171222895601E-6, /// 24 + -0.14341729937924E-12, /// 25 + -0.40516996860117E-6, /// 26 + -0.12734301741641E-8, /// 27 + -0.17424871230634E-9, /// 28 + -0.68762131295531E-18, /// 29 + 0.14478307828521E-19, /// 30 + 0.26335781662795E-22, /// 31 + -0.11947622640071E-22, /// 32 + 0.18228094581404E-23, /// 33 + -0.93537087292458E-25, /// 34 + }; + + /// + /// Initialize a table to calculate temperature of a platinum thermometer from resistance + /// + Di = new double[] + { + 439.932854, + 472.418020, + 37.684494, + 7.472018, + 2.920828, + 0.005184, + -0.963864, + -0.188732, + 0.191203, + 0.049025, + }; + } + + /// + /// Calculate density of distilled water from temperature + /// + /// ITS-90 temperature in [°C] + /// Density in [kg/m3] + public static double DistilledWaterDensityFromTemp(double t) + { + if (t <= 40) + { + const double c0 = 999.839564; + const double c1 = 0.067998613; + const double c2 = -0.0091101468; + const double c3 = 0.00010058299; + const double c4 = -0.0000011275659; + const double c5 = 6.5985371e-09; + + return ((((c5 * t + c4) * t + c3) * t + c2) * t + c1) * t + c0; + } + else + { + const double a0 = 9.9983952E2; + const double a1 = 1.6952577E1; + const double a2 = -7.9905127E-3; + const double a3 = -4.6241757E-5; + const double a4 = 1.0584601E-7; + const double a5 = -2.8103006E-10; + const double b = 1.6887236E-2; + + return (((((a5 * t + a4) * t + a3) * t + a2) * t + a1) * t + a0) / (1.0 + b * t); + } + } + + /// + /// Calculate density of distilled water from temperature (obsolete) + /// + /// IPTS-68 temperature in [°C] + /// Density in [kg/m3] + public static double DistilledWaterDensityFromTempIPTS68(double t) + { + const double a0 = 999.842594; + const double a1 = 0.06793952; + const double a2 = -0.009095290; + const double a3 = 0.0001001685; + const double a4 = -0.000001120083; + const double a5 = 6.536332e-09; + + return ((((a5 * t + a4) * t + a3) * t + a2) * t + a1) * t + a0; + } + + /// + /// Calculate density by comparing calculated data and data from a certificate + /// + /// Density from a certificate in [kg/m3] + /// Temperature from a certificate in [°C] + /// Density correction in [kg/m3] + public static double DensityCorrection(double realDensity, double atTemperature) + { + /// Calculated data + double calculatedDensity = DistilledWaterDensityFromTemp(atTemperature); + + return realDensity - calculatedDensity; + } + + /// + /// Calculate corrected (real) water density from temperature + /// + /// Temperature in [°C] + /// Density in [kg/m3] + public static double WaterDensityFromTemp(double t, double realDensity, double atTemperature) + { + return DistilledWaterDensityFromTemp(t) + DensityCorrection(realDensity, atTemperature); + } + + /// + /// Calculate corrected (real) water density from temperature + /// + /// Temperature in [°C] + /// Density in [kg/m3] + public static double WaterDensityFromTempPress(double temp, double pressure, double realDensity, double atTemperature) + { + double x0 = 5.08821E-10; + double x1 = 1.2639418; + double x2 = 0.2660269; + double x3 = 0.3734838; + double x4 = 2.0205242; + double theta = temp / 100.0; + double B = x0 * (((x3 * theta + x2) * theta + x1) * theta + 1) / (1 + x4 * theta); + + return WaterDensityFromTemp(temp, realDensity, atTemperature) * (1 + B * Config.Units.ConvertTo(Config.Unit.Pa, pressure)); + } + + + public static float AirDensityFromAmbientVales(float tempC, float pressureBar, float humiPct) + { + double pressurePa = 100000.0 * (double)pressureBar; /// [Pa] + double tempKelvin = 273.15 + (double)tempC; + double coef1 = 1.2811805 / 10000.0 * tempKelvin * tempKelvin + - 1.950987 / 100.0 * tempKelvin + + 34.04926034 + - 6.353631 * 1000.0 / tempKelvin; + double coef3 = humiPct / 100.0 * System.Math.Exp(coef1) / pressurePa; + double airDensityKgm3 = 0.00348353 * pressurePa * (1.0 - 0.378 * coef3) / tempKelvin; /// kg/m3 + return (float)airDensityKgm3; + } + + /// + /// Convert 'pulses' to 'volume', prevent division by zero + /// + public static double VolumeFromPulses(int pulses, double pulsesPerLiter) + { + if (pulsesPerLiter <= double.Epsilon) return 0; + return Convert.ToDouble(pulses) / pulsesPerLiter; + } + + /// + /// Calculate the error in % from 'measured' and 'true' volume, prevent division by zero + /// + public static double ErrorFromVolumes(double measuredVolume, double trueVolume) + { + if (trueVolume <= float.Epsilon) + { + if (measuredVolume <= float.Epsilon) + { + log.WarnFormat("ErrorFromVolumes({0},{1}) returns {2}", measuredVolume, trueVolume, -100.0); + return -100.0; + } + + log.WarnFormat("ErrorFromVolumes({0},{1}) returns {2}", measuredVolume, trueVolume, 99.0); + return 99.0; + } + + double error = 100.0 * (measuredVolume - trueVolume) / trueVolume; + log.InfoFormat("ErrorFromVolumes({0},{1}) returns {2}", measuredVolume, trueVolume, error); + return error; + } + + /// + /// Calculates corrected value form a list of corrections by interpolation. + /// It is assumed that values in the list 'corrections' are sorted. + /// + /// Raw uncorrected value + /// Sorted (value, correction) pairs + /// Corrected value + public static double CorrectedValue(double rawValue, IList corrections) + { + logrefError.InfoFormat("call CorrectedValue({0},{1}.Count)", rawValue, corrections.Count); + if (corrections == null || corrections.Count == 0) + { + logrefError.InfoFormat("CorrectedValue({0},{1}.Count) return rawValue... no correction found", rawValue, corrections.Count); + return rawValue; + } + + if (rawValue < corrections[0].Measurement) + { + logrefError.InfoFormat("CorrectedValue({0},{1}.Count) return {2}... rawValue < corrections[0].Measurement", rawValue, corrections.Count, rawValue + corrections[0].Correction); + return rawValue + corrections[0].Correction; + } + + int count = corrections.Count; + for (int i = 1; i < count; i++) + { + if (rawValue < corrections[i].Measurement) + { + double d1 = rawValue - corrections[i-1].Measurement; + double d2 = corrections[i].Measurement - rawValue; + + double corr; + if (d1 + d2 <= float.Epsilon) + { + corr = (corrections[i - 1].Correction + corrections[i].Correction) / 2.0; + logrefError.InfoFormat("CorrectedValue({0},{1}.Count) return {2}... (corrections[i - 1].Correction + corrections[i].Correction) / 2.0", rawValue, corrections.Count, rawValue + corr); + + } + else + { + corr = (corrections[i - 1].Correction * d2 + corrections[i].Correction * d1) / (d1 + d2); + logrefError.InfoFormat("CorrectedValue({0},{1}.Count) return {2}... (corrections[i - 1].Correction * d2 + corrections[i].Correction * d1) / (d1 + d2)", rawValue, corrections.Count, rawValue + corr); + } + return rawValue + corr; + } + } + logrefError.InfoFormat("CorrectedValue({0},{1}.Count) return {2}... rawValue < corrections[0].Measurement", rawValue, corrections.Count, rawValue + corrections[count - 1].Correction); + + return rawValue + corrections[count - 1].Correction; + } + + + /// + /// Converts a measurement error to a correction (used when preparing correction tables). + /// + /// Measured value (in arbitrary units) + /// Measurement error in % + /// Correction in the same units as the measured value + public static double CorrectionFromError(double measuredValue, double error) + { + double trueValue = measuredValue / (1 + error/100); + double correction = trueValue - measuredValue; + return correction; + } + + + /// + /// Calculates the heat coefficient for water + /// + /// Pressure [bar] + /// Inlet temperature [°C] + /// Outlet temperature [°C] + /// true = flow measured @inlet, false = flow measured @outlet + /// Heat coefficient for water [J/(m3 K)] + public static double HeatCoefficientWater(double pressure, double T_in, double T_out, bool flowMeasuredAtInlet) + { + if (T_in == T_out) return 0; + + const double R = 461.526; /// [J kg^-1 K^-1] + const double p_star_Pa = 16.53E6; /// [Pa] (=16.53 MPa) + const double T_star = 1386.0; /// [K] + + double T_in_K = Config.Units.ConvertTo(Config.Unit.K, T_in); + double T_out_K = Config.Units.ConvertTo(Config.Unit.K, T_out); + double tau_in = T_star / T_in_K; + double tau_out = T_star / T_out_K; + double pi = Config.Units.ConvertTo(Config.Unit.Pa, pressure) / p_star_Pa; + + double h_in = tau_in * GammaTau(pi, tau_in) * R * T_in_K; + double h_out = tau_out * GammaTau(pi, tau_out) * R * T_out_K; + + double ni = flowMeasuredAtInlet ? GammaPi(pi, tau_in) * R * T_in_K / p_star_Pa + : GammaPi(pi, tau_out) * R * T_out_K / p_star_Pa; + + return (h_in - h_out) / (ni * (T_in - T_out)); + } + + /// + /// gamma(pi) see also STN EN 1434-1 Annex A (A.4) + /// + /// pi = p / p* where p* = 16.53 MPa + /// tau = T* / T where T* = 1386 K + /// gamma(pi) + static double GammaPi(double pi, double tau) + { + double result = 0; + for (int i = 0; i < 34; i++) + { + result -= ni[i] * Ii[i] * Math.Pow(7.1 - pi, Ii[i] - 1) * Math.Pow(tau - 1.222, Ji[i]); + } + return result; + } + + /// + /// gamma(tau) see also STN EN 1434-1 Annex A (A.7) + /// + /// pi = p / p* where p* = 16.53 MPa + /// tau = T* / T where T* = 1386 K + /// gamma(tau) + static double GammaTau(double pi, double tau) + { + double result = 0; + for (int i = 0; i < 34; i++) + { + result += ni[i] * Math.Pow(7.1 - pi, Ii[i]) * Ji[i] * Math.Pow(tau - 1.222, Ji[i] - 1); + } + return result; + } + + /// + /// Conversion of measured resistance of a platinum thermometer to temperature according to ITS-90 + /// + /// Measured resistance in [°C] + /// Calibrated resistance in Ohm at 0.01°C + /// Calibrated ITS-90 coefficient a7 + /// Calibrated ITS-90 coefficient b7 + /// Calibrated ITS-90 coefficient c7 + /// Temperature in [°C] + public static double PlatinumResistanceTM_ITS90_R2T(double R, double R001C, double a7, double b7, double c7) + { + double w = R / R001C; /// ratio + double r1 = w - 1.0; + double dw = r1 * (a7 + r1 * (b7 + r1 * c7)); /// = a7*r1 + b7*r1^2 + c7*r1^3 + double wr = w - dw; + double x = (wr - 2.64) / 1.64; + + double sum = 0; + for (int i = Di.Length - 1; i >= 0; i--) + { + sum = sum * x + Di[i]; + } + + return sum; + } + + /// + /// Conversion of measured resistance of a platinum thermometer to temperature using Callendar-Van Dusen equations + /// + /// Measured resistance in [°C] + /// Calibrated resistance in Ohm at 0°C + /// Calibration coefficient a + /// Calibration coefficient b + /// Temperature in [°C] + public static double PlatinumResistanceTM_ITS27_R2T(double R, double R0, double A, double B) + { + if (R0 * R0 * A * A - 4 * R0 * B * (R0 - R) <= 0) return 0; /// Out of range + + return (-(R0 * A) + Math.Sqrt(R0 * R0 * A * A - 4 * R0 * B * (R0 - R))) / (2 * R0 * B); + } + + + public static double Buoyancy() + { + return 1.00103; + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Mappings/BenchPathMap.cs b/TBF_V2/Sources/TBF/Config/Mappings/BenchPathMap.cs new file mode 100644 index 00000000..8865bdd6 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Mappings/BenchPathMap.cs @@ -0,0 +1,32 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using FluentNHibernate.Mapping; +using Config.Entities; + +namespace Config.Mappings +{ + class BenchPathMap : ClassMap + { + public BenchPathMap() + { + Id(x => x.Id); + Map(x => x.ItemNr); + Map(x => x.Name); + Map(x => x.Qfrom); + Map(x => x.Qto); + Map(x => x.TempMtrUp).Column("TempIn"); + Map(x => x.TempMtrDown).Column("TempOut"); + Map(x => x.PressMtrUp).Column("PressIn"); + Map(x => x.PressMtrDown).Column("PressOut"); + Map(x => x.PressMtrDelta); + Map(x => x.StopBFValve); + Map(x => x.ValvesOpen) + .CustomType("StringClob") + .CustomSqlType("varchar(8000)"); + Map(x => x.ValvesClose) + .CustomType("StringClob") + .CustomSqlType("varchar(8000)"); + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Mappings/ComponentMap.cs b/TBF_V2/Sources/TBF/Config/Mappings/ComponentMap.cs new file mode 100644 index 00000000..5a7170dc --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Mappings/ComponentMap.cs @@ -0,0 +1,28 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using FluentNHibernate.Mapping; +using Config.Entities; + +namespace Config.Mappings +{ + class ComponentMap : ClassMap + { + public ComponentMap() + { + Id(x => x.Id); + Map(x => x.Name); + Map(x => x.ClassName); + Map(x => x.ParentName); + Map(x => x.ItemNr); + Map(x => x.Mode); + Map(x => x.Logging); + Map(x => x.Parameters) + .CustomType("StringClob") + .CustomSqlType("varchar(8000)"); + HasMany(x => x.Corrections) + .OrderBy("Measurement") + .Cascade.All(); + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Mappings/ComponentProcedureMap.cs b/TBF_V2/Sources/TBF/Config/Mappings/ComponentProcedureMap.cs new file mode 100644 index 00000000..107d8a28 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Mappings/ComponentProcedureMap.cs @@ -0,0 +1,22 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using FluentNHibernate.Mapping; +using Config.Entities; + +namespace Config.Mappings +{ + class ComponentProcedureMap : ClassMap + { + public ComponentProcedureMap() + { + Id(x => x.Id); + Map(x => x.CmpntName); + Map(x => x.Parameters) + .CustomType("StringClob") + .CustomSqlType("varchar(8000)"); + + References(x => x.Procedure); + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Mappings/ComponentTestMap.cs b/TBF_V2/Sources/TBF/Config/Mappings/ComponentTestMap.cs new file mode 100644 index 00000000..00c4ab36 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Mappings/ComponentTestMap.cs @@ -0,0 +1,22 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using FluentNHibernate.Mapping; +using Config.Entities; + +namespace Config.Mappings +{ + class ComponentTestMap : ClassMap + { + public ComponentTestMap() + { + Id(x => x.Id); + Map(x => x.CmpntName); + Map(x => x.Parameters) + .CustomType("StringClob") + .CustomSqlType("varchar(8000)"); + + References(x => x.Test); + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Mappings/FeedingPathMap.cs b/TBF_V2/Sources/TBF/Config/Mappings/FeedingPathMap.cs new file mode 100644 index 00000000..41ed03e6 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Mappings/FeedingPathMap.cs @@ -0,0 +1,28 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using FluentNHibernate.Mapping; +using Config.Entities; + +namespace Config.Mappings +{ + class FeedingPathMap : ClassMap + { + public FeedingPathMap() + { + Id(x => x.Id); + Map(x => x.ItemNr); + Map(x => x.Name); + Map(x => x.Qfrom); + Map(x => x.Qto); + Map(x => x.Pump); + Map(x => x.RegulValvesPct); + Map(x => x.ValvesOpen) + .CustomType("StringClob") + .CustomSqlType("varchar(8000)"); + Map(x => x.ValvesClose) + .CustomType("StringClob") + .CustomSqlType("varchar(8000)"); + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Mappings/GroupMap.cs b/TBF_V2/Sources/TBF/Config/Mappings/GroupMap.cs new file mode 100644 index 00000000..2e0ada87 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Mappings/GroupMap.cs @@ -0,0 +1,17 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using FluentNHibernate.Mapping; + +namespace Config.Mappings +{ + class GroupMap : ClassMap + { + public GroupMap() + { + Id(x => x.Id); + Map(x => x.Gid); + Map(x => x.Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Mappings/HeatMetersPathMap.cs b/TBF_V2/Sources/TBF/Config/Mappings/HeatMetersPathMap.cs new file mode 100644 index 00000000..7c03888a --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Mappings/HeatMetersPathMap.cs @@ -0,0 +1,35 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using FluentNHibernate.Mapping; +using Config.Entities; + +namespace Config.Mappings +{ +#if HEAT_METERS + class HeatMetersPathMap : ClassMap + { + public HeatMetersPathMap() + { + Id(x => x.Id); + Map(x => x.ItemNr); + Map(x => x.Name); + + Map(x => x.TempWarmFrom); + Map(x => x.TempWarmTo); + Map(x => x.TempColdFrom); + Map(x => x.TempColdTo); + + Map(x => x.TMeterRefWarm1); + Map(x => x.TMeterRefWarm2); + Map(x => x.TMeterRefCold1); + Map(x => x.TMeterRefCold2); + + Map(x => x.TMeterWorkWarm1); + Map(x => x.TMeterWorkWarm2); + Map(x => x.TMeterWorkCold1); + Map(x => x.TMeterWorkCold2); + } + } +#endif +} diff --git a/TBF_V2/Sources/TBF/Config/Mappings/MeasurementCorrectionMap.cs b/TBF_V2/Sources/TBF/Config/Mappings/MeasurementCorrectionMap.cs new file mode 100644 index 00000000..806efeb5 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Mappings/MeasurementCorrectionMap.cs @@ -0,0 +1,19 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using FluentNHibernate.Mapping; +using Config.Entities; + +namespace Config.Mappings +{ + class MeasurementCorrectionMap : ClassMap + { + public MeasurementCorrectionMap() + { + Id(x => x.Id); + Map(x => x.RangeIx); + Map(x => x.Measurement); + Map(x => x.Correction); + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Mappings/MetersPathMap.cs b/TBF_V2/Sources/TBF/Config/Mappings/MetersPathMap.cs new file mode 100644 index 00000000..0e95448e --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Mappings/MetersPathMap.cs @@ -0,0 +1,61 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using FluentNHibernate.Mapping; +using Config.Entities; + +namespace Config.Mappings +{ + class MetersPathMap : ClassMap + { + public MetersPathMap() + { + Id(x => x.Id); + Map(x => x.ItemNr); + Map(x => x.Name); + +#pragma warning disable + if (Config.Data.WMsCount >= 1) Map(x => x.Sensor1); + if (Config.Data.WMsCount >= 2) Map(x => x.Sensor2); + if (Config.Data.WMsCount >= 3) Map(x => x.Sensor3); + if (Config.Data.WMsCount >= 4) Map(x => x.Sensor4); + if (Config.Data.WMsCount >= 5) Map(x => x.Sensor5); + if (Config.Data.WMsCount >= 6) Map(x => x.Sensor6); + if (Config.Data.WMsCount >= 7) Map(x => x.Sensor7); + if (Config.Data.WMsCount >= 8) Map(x => x.Sensor8); + if (Config.Data.WMsCount >= 9) Map(x => x.Sensor9); + if (Config.Data.WMsCount >= 10) Map(x => x.Sensor10); + if (Config.Data.WMsCount >= 11) Map(x => x.Sensor11); + if (Config.Data.WMsCount >= 12) Map(x => x.Sensor12); + if (Config.Data.WMsCount >= 13) Map(x => x.Sensor13); + if (Config.Data.WMsCount >= 14) Map(x => x.Sensor14); + if (Config.Data.WMsCount >= 15) Map(x => x.Sensor15); + if (Config.Data.WMsCount >= 16) Map(x => x.Sensor16); + if (Config.Data.WMsCount >= 17) Map(x => x.Sensor17); + if (Config.Data.WMsCount >= 18) Map(x => x.Sensor18); + if (Config.Data.WMsCount >= 19) Map(x => x.Sensor19); + if (Config.Data.WMsCount >= 20) Map(x => x.Sensor20); + if (Config.Data.WMsCount >= 21) Map(x => x.Sensor21); + if (Config.Data.WMsCount >= 22) Map(x => x.Sensor22); + if (Config.Data.WMsCount >= 23) Map(x => x.Sensor23); + if (Config.Data.WMsCount >= 24) Map(x => x.Sensor24); + if (Config.Data.WMsCount >= 25) Map(x => x.Sensor25); + if (Config.Data.WMsCount >= 26) Map(x => x.Sensor26); + if (Config.Data.WMsCount >= 27) Map(x => x.Sensor27); + if (Config.Data.WMsCount >= 28) Map(x => x.Sensor28); + if (Config.Data.WMsCount >= 29) Map(x => x.Sensor29); + if (Config.Data.WMsCount >= 30) Map(x => x.Sensor30); + if (Config.Data.WMsCount >= 31) Map(x => x.Sensor31); + if (Config.Data.WMsCount >= 32) Map(x => x.Sensor32); + if (Config.Data.WMsCount >= 33) Map(x => x.Sensor33); + if (Config.Data.WMsCount >= 34) Map(x => x.Sensor34); + if (Config.Data.WMsCount >= 35) Map(x => x.Sensor35); + if (Config.Data.WMsCount >= 36) Map(x => x.Sensor36); + if (Config.Data.WMsCount >= 37) Map(x => x.Sensor37); + if (Config.Data.WMsCount >= 38) Map(x => x.Sensor38); + if (Config.Data.WMsCount >= 39) Map(x => x.Sensor39); + if (Config.Data.WMsCount >= 40) Map(x => x.Sensor40); +#pragma warning restore + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Mappings/OutputPathMap.cs b/TBF_V2/Sources/TBF/Config/Mappings/OutputPathMap.cs new file mode 100644 index 00000000..1e7ebbe1 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Mappings/OutputPathMap.cs @@ -0,0 +1,35 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using FluentNHibernate.Mapping; +using Config.Entities; + +namespace Config.Mappings +{ + class OutputPathMap : ClassMap + { + public OutputPathMap() + { + Id(x => x.Id); + Map(x => x.ItemNr); + Map(x => x.Name); + Map(x => x.Qfrom); + Map(x => x.Qto); + Map(x => x.RegulValve); + Map(x => x.FlowMeter); + Map(x => x.PidCoef); + Map(x => x.StartValve); + Map(x => x.Diverter); + Map(x => x.TempDiv); + Map(x => x.Scale) + .Column("Balance"); + Map(x => x.EmptyTankValve); + Map(x => x.ValvesOpen) + .CustomType("StringClob") + .CustomSqlType("varchar(8000)"); + Map(x => x.ValvesClose) + .CustomType("StringClob") + .CustomSqlType("varchar(8000)"); + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Mappings/ProcedureMap.cs b/TBF_V2/Sources/TBF/Config/Mappings/ProcedureMap.cs new file mode 100644 index 00000000..977d34c9 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Mappings/ProcedureMap.cs @@ -0,0 +1,53 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using FluentNHibernate.Mapping; +using Config.Entities; + +namespace Config.Mappings +{ + class ProcedureMap : ClassMap + { + public ProcedureMap() + { + Id(x => x.Id); + Map(x => x.ItemNr); + Map(x => x.Name); + + Map(x => x.Description); + Map(x => x.CreationUser); + Map(x => x.CreationTime); + Map(x => x.LastChgUser); + Map(x => x.LastChgTime); + Map(x => x.LongDescription); + + Map(x => x.ProcedureState); + Map(x => x.Revision); + Map(x => x.PredecessorId); + Map(x => x.ObtainedByCopy); + + Map(x => x.MetersKind); + Map(x => x.Watermeters); + Map(x => x.Protected); + Map(x => x.MustBeComplete); + Map(x => x.ManualCtrlDisabled); + + Map(x => x.DataEntry); + Map(x => x.ResultsPrinter); + Map(x => x.ResultsWriter); + Map(x => x.TransitionStart); + Map(x => x.TransitionEnd); + + Map(x => x.AltProcName); + Map(x => x.AltProcPeriod); + + ////Map(x => x.MetrologicalClass); + ////HasOne(x => x.WMType); + HasMany(x => x.MoreParams) + .Cascade.All(); + HasMany(x => x.Tests) + .OrderBy("ItemNr") + .Cascade.All(); + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Mappings/TestMap.cs b/TBF_V2/Sources/TBF/Config/Mappings/TestMap.cs new file mode 100644 index 00000000..52c9cb27 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Mappings/TestMap.cs @@ -0,0 +1,65 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using FluentNHibernate.Mapping; +using Config.Entities; + +namespace Config.Mappings +{ + class TestMap : ClassMap + { + public TestMap() + { + Id(x => x.Id); + Map(x => x.ItemNr); + Map(x => x.Name); + Map(x => x.Part); + Map(x => x.Publish); + Map(x => x.DoEvaluate) + .Column("Evaluate"); + Map(x => x.Qfrom); + Map(x => x.Qto); + Map(x => x.Volume); + Map(x => x.TstTime); + Map(x => x.Repeats); + Map(x => x.DoDraining) + .Column("Emptying"); + Map(x => x.DoZeroing) + .Column("Zeroing"); + Map(x => x.DoControlWaterTemp); + Map(x => x.TempLimLo); + Map(x => x.TempLimHi); + Map(x => x.PumpPower); + Map(x => x.MassRepeats); + Map(x => x.MassSpread); + Map(x => x.MassMethod) + .CustomType(); + Map(x => x.TimeBeforeFlow); + Map(x => x.TimeFlow2Mass); + Map(x => x.TimePump2StartV) + .Column("TimeMass2Start"); + Map(x => x.TimeStop2Mass); + Map(x => x.Method); + Map(x => x.ErrLimLo); + Map(x => x.ErrLimHi); + Map(x => x.Uncertainty); + Map(x => x.TolerRed) + .Column("TolerRed"); /// ??? + Map(x => x.RedType); /// ??? + Map(x => x.FeedingPath); + Map(x => x.BenchPath); + Map(x => x.OutputPath); + Map(x => x.MetersPath); +#if HEAT_METERS + Map(x => x.HeatMetersPath); +#endif + Map(x => x.RelTransBefore); + Map(x => x.RelTransBetween); + Map(x => x.RelTransAfter); + Map(x => x.TransitionAfter); + HasMany(x => x.MoreParams) + .Cascade.All(); + References(x => x.Procedure); + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Mappings/TransitionSequenceMap.cs b/TBF_V2/Sources/TBF/Config/Mappings/TransitionSequenceMap.cs new file mode 100644 index 00000000..f270209d --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Mappings/TransitionSequenceMap.cs @@ -0,0 +1,22 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using FluentNHibernate.Mapping; +using Config.Entities; + +namespace Config.Mappings +{ + class TransitionSequenceMap : ClassMap + { + public TransitionSequenceMap() + { + Id(x => x.Id); + Map(x => x.ItemNr); + Map(x => x.Name); + Map(x => x.Description); + HasMany(x => x.TransitionSteps) + .OrderBy("ItemNr") + .Cascade.All(); + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Mappings/TransitionStepMap.cs b/TBF_V2/Sources/TBF/Config/Mappings/TransitionStepMap.cs new file mode 100644 index 00000000..08196e71 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Mappings/TransitionStepMap.cs @@ -0,0 +1,30 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using FluentNHibernate.Mapping; +using Config.Entities; + +namespace Config.Mappings +{ + class TransitionStepMap : ClassMap + { + public TransitionStepMap() + { + Id(x => x.Id); + Map(x => x.ItemNr); + Map(x => x.Duration); + Map(x => x.Message); + Map(x => x.EndCondition); + Map(x => x.ValvesOpen) + .CustomType("StringClob") + .CustomSqlType("varchar(8000)"); + Map(x => x.ValvesClose) + .CustomType("StringClob") + .CustomSqlType("varchar(8000)"); + Map(x => x.RegulValvesPct); + Map(x => x.PumpWithFMPcts); + + References(x => x.TransitionSequence); + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Mappings/UserMap.cs b/TBF_V2/Sources/TBF/Config/Mappings/UserMap.cs new file mode 100644 index 00000000..ccb02838 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Mappings/UserMap.cs @@ -0,0 +1,22 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using FluentNHibernate.Mapping; + +namespace Config.Mappings +{ + class UserMap : ClassMap + { + public UserMap() + { + Id(x => x.Id); + Map(x => x.UserName).Column("Name"); + Map(x => x.Number); + Map(x => x.Password); + Map(x => x.FullName).Column("Description"); + Map(x => x.LastPwChange); + HasMany(x => x.Groups) + .Cascade.All(); + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Mappings/VirtualBenchSequenceMap.cs b/TBF_V2/Sources/TBF/Config/Mappings/VirtualBenchSequenceMap.cs new file mode 100644 index 00000000..2a002250 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Mappings/VirtualBenchSequenceMap.cs @@ -0,0 +1,22 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using FluentNHibernate.Mapping; +using Config.Entities; + +namespace Config.Mappings +{ + class VirtualBenchSequenceMap : ClassMap + { + public VirtualBenchSequenceMap() + { + Id(x => x.Id); + Map(x => x.ItemNr); + Map(x => x.Name); + Map(x => x.Description); + HasMany(x => x.VirtualBenchSteps) + .OrderBy("ItemNr") + .Cascade.All(); + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Mappings/VirtualBenchStepMap.cs b/TBF_V2/Sources/TBF/Config/Mappings/VirtualBenchStepMap.cs new file mode 100644 index 00000000..bf4e7d65 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Mappings/VirtualBenchStepMap.cs @@ -0,0 +1,20 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using FluentNHibernate.Mapping; +using Config.Entities; + +namespace Config.Mappings +{ + class VirtualBenchStepMap : ClassMap + { + public VirtualBenchStepMap() + { + Id(x => x.Id); + Map(x => x.ItemNr); + Map(x => x.Duration); + + References(x => x.VirtualBenchSequence); + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Mappings/WMTypeMap.cs b/TBF_V2/Sources/TBF/Config/Mappings/WMTypeMap.cs new file mode 100644 index 00000000..58173a51 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Mappings/WMTypeMap.cs @@ -0,0 +1,20 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using FluentNHibernate.Mapping; + +namespace Config.Mappings +{ + class WMTypeMap : ClassMap + { + public WMTypeMap() + { + Id(x => x.Id); + Map(x => x.CreateTime); + Map(x => x.CreateUserName); + Map(x => x.CreateDescription); + Map(x => x.Name); + Map(x => x.PulseRate); + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Mappings/WatermeterMap.cs b/TBF_V2/Sources/TBF/Config/Mappings/WatermeterMap.cs new file mode 100644 index 00000000..03553373 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Mappings/WatermeterMap.cs @@ -0,0 +1,19 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using FluentNHibernate.Mapping; + +namespace Config.Mappings +{ + class WatermeterMap : ClassMap + { + public WatermeterMap() + { + Id(x => x.Id); + Map(x => x.Serial); + // HasOne(x => x.WMType) + // .Cascade.All(); + References(x => x.WMType); + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Properties/AssemblyInfo.cs b/TBF_V2/Sources/TBF/Config/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..9a8e0d1f --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Config")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Sensus")] +[assembly: AssemblyProduct("Config")] +[assembly: AssemblyCopyright("Copyright © 2013 - 2018 Sensus Slovensko a.s.")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("3fc3ff67-7386-4aff-9855-bef33d5fa0d3")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("2.18.928.0")] +[assembly: AssemblyFileVersion("2.18.928.0")] diff --git a/TBF_V2/Sources/TBF/Config/Resources/Strings.Designer.cs b/TBF_V2/Sources/TBF/Config/Resources/Strings.Designer.cs new file mode 100644 index 00000000..313079c2 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Resources/Strings.Designer.cs @@ -0,0 +1,164 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Config.Resources { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Strings { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Strings() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Config.Resources.Strings", typeof(Strings).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Administrator. + /// + internal static string Administrator { + get { + return ResourceManager.GetString("Administrator", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Calibration Specialist. + /// + internal static string Calibration_Specialist { + get { + return ResourceManager.GetString("Calibration_Specialist", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cannot open DB Cause 0. + /// + internal static string Cannot_open_DB_Cause_0 { + get { + return ResourceManager.GetString("Cannot_open_DB_Cause_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error. + /// + internal static string Error + { + get + { + return ResourceManager.GetString("Error", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Failed. + /// + internal static string Failed { + get { + return ResourceManager.GetString("Failed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Head of Lab. + /// + internal static string Head_of_Lab { + get { + return ResourceManager.GetString("Head_of_Lab", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Maintenance Specialist. + /// + internal static string Maintenance_Specialist { + get { + return ResourceManager.GetString("Maintenance_Specialist", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Metrologist. + /// + internal static string Metrologist { + get { + return ResourceManager.GetString("Metrologist", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Passed. + /// + internal static string Passed { + get { + return ResourceManager.GetString("Passed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tester. + /// + internal static string Tester { + get { + return ResourceManager.GetString("Tester", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Testing Specialist. + /// + internal static string Testing_Specialist { + get { + return ResourceManager.GetString("Testing_Specialist", resourceCulture); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Resources/Strings.cs.resx b/TBF_V2/Sources/TBF/Config/Resources/Strings.cs.resx new file mode 100644 index 00000000..fde77890 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Resources/Strings.cs.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Chyba + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Config/Resources/Strings.de.resx b/TBF_V2/Sources/TBF/Config/Resources/Strings.de.resx new file mode 100644 index 00000000..e9a6e00e --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Resources/Strings.de.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Administrator + + + Kalibriertechniker + + + Laborleiter + + + Wartungstechniker + + + Messtechniker + + + Prüfer + + + Prüftechniker + + + NiO + + + iO + + + Fehler + + + Datenbank kann nicht geöffnet.\\r\\nUrsache:\\r\\n{0} + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Config/Resources/Strings.it.resx b/TBF_V2/Sources/TBF/Config/Resources/Strings.it.resx new file mode 100644 index 00000000..457cc0e9 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Resources/Strings.it.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Amministratore + + + esperto in calibrazione + + + capo di laboratorio + + + esperto di manutenzione + + + metrologo + + + tester + + + esperto di prove + + + NOK + + + ok + + + Impossibile aprire il database\\r\\nCause:\\r\\n{0} + + + Errore + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Config/Resources/Strings.pl.resx b/TBF_V2/Sources/TBF/Config/Resources/Strings.pl.resx new file mode 100644 index 00000000..def032d3 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Resources/Strings.pl.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Administrator + + + Specjalista ds. kalibracji + + + Kierownik Laboratorium + + + Konserwator + + + Metrolog + + + Pracownik przeprowadzający testy + + + Specjalista ds. testów + + + Niepowodzenie + + + OK + + + Nie można otworzyć \\r\\nCause:\\r\\n{0} + + + Błąd + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Config/Resources/Strings.resx b/TBF_V2/Sources/TBF/Config/Resources/Strings.resx new file mode 100644 index 00000000..25ef4532 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Resources/Strings.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Administrator + + + Calibration Specialist + + + Head of Lab + + + Maintenance Specialist + + + Metrologist + + + Tester + + + Testing Specialist + + + NOK + + + OK + + + Cannot open database.\\r\\nCause:\\r\\n{0} + + + Error + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Config/Resources/Strings.ru.resx b/TBF_V2/Sources/TBF/Config/Resources/Strings.ru.resx new file mode 100644 index 00000000..00b613b0 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Resources/Strings.ru.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Администратор + + + Специалист по калибровке + + + Руководитель лаборатории + + + Специалист по техобслуживанию + + + Метролог + + + Контролер + + + Специалист по тестированию + + + NOK + + + OK + + + Не удается открыть БД.\\r\\nCause:\\r\\n{0} + + + Ошибка + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Config/Resources/Strings.zh-CN.resx b/TBF_V2/Sources/TBF/Config/Resources/Strings.zh-CN.resx new file mode 100644 index 00000000..a95f116c --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Resources/Strings.zh-CN.resx @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 管理员 + + + 校准专员 + + + NOK + + + 实验室负责人 + + + 维护专员 + + + 计量者 + + + + + + 测试仪 + + + 测试专员 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Config/Units.cs b/TBF_V2/Sources/TBF/Config/Units.cs new file mode 100644 index 00000000..bf286e39 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Units.cs @@ -0,0 +1,478 @@ +/// +/// Copyright (c) 2016-2018 Sensus Slovensko a.s. +/// +using System; +using System.Reflection; +using Config.Entities; + +namespace Config +{ + public enum Unit + { + [Description("---")] None, + + [Description("imp.")] pulse, +#if LANG_PL + [Description("stopień")] degree, +#else + [Description("degree")] degree, +#endif + [Description("l")] l, /// * 1 liter + [Description("dm3")] dm3, /// 1 dm3 = 1 liter + [Description("m3")] m3, /// 1000 l + [Description("gal(UK)")] gal_UK, /// 1 gal(UK) = 4.54609 l + [Description("gal(US)")] gal_US, /// 1 gal(US) = 3.78541178 l + + [Description("l/h")] lph, /// 1 liter/h + [Description("m3/h")] m3ph, /// * 1 m3/h = 1000 l/h + + [Description("g")] g, /// 0.001 kg + [Description("kg")] kg, /// * 1 kilogram + [Description("t")] t, /// 1000 kg + [Description("lb")] lb, /// 0.45359237 kg + + [Description("s")] s, /// * 1 second + [Description("min")] min, /// 1 min = 60 s + [Description("hr")] hour, /// 1 hour = 60 min = 3600 s + [Description("ms")] ms, /// 1 ms = 0.001 s + + [Description("°C")] C, /// * degree Celsius (°C) + [Description("°F")] F, /// degree Fahrenheit + [Description("K")] K, /// degree Kelvin + + [Description("Pa")] Pa, /// 1 Pa = 0.01 hPa + [Description("hPa")] hPa, /// 1 hPa = 100 Pa + [Description("kPa")] kPa, /// 1 kPa = 10 HPa + [Description("MPa")] MPa, /// 1 MPa = 10000 hPa + [Description("mbar")] mbar, /// 1 mbar = 1 hPa = 100 Pa + [Description("bar")] bar, /// * 1 Bar = 1000 mbar = 0.1 MPa = 100000 Pa + [Description("inHg")] inHg, /// 1 inHg = 33.864 hPa + + [Description("R%")] RPct, /// * 1 R% + + [Description("%")] Pct, /// * 1 % + [Description("promile")] Promile, /// 1 promile = 0.1 % + + [Description("mm")] mm, /// * 1 millimeter + [Description("cm")] cm, /// 1 cm = 10 mm + [Description("m")] m, /// 1 m = 1000 mm + [Description("in")] inch, /// 1 inch = 25.4 mm + + [Description("kg/m3")] kgpm3, /// * 1 kg/m3 = 0.001 kg/l + [Description("kg/l")] kgpl, /// 1 kg/l = 1000 kg/m3 + + [Description("J")] J, /// * 1 Joul + [Description("kJ")] kJ, /// 1 kJ = 1000 J + [Description("MJ")] MJ, /// 1 MJ = 1000000 J + [Description("Wh")] Wh, /// 1 Wh = 3600 J + [Description("kWh")] kWh, /// 1 kWh = 3600000 J + [Description("MWh")] MWh, /// 1 MWh = 3600000000 J + +#if LANG_PL + [Description("imp/l")] ppl, /// * 1 pulse/l + [Description("imp/dm3")] ppdm3, /// * 1 pulse/dm3 + [Description("stopień/l")] degpl, /// * 1 degree/l + [Description("stopień/dm3")] degpdm3, /// * 1 degree/dm3 + [Description("l/imp")] lpp, /// * 1 l/pulse + [Description("dm3/imp")] dm3pp, /// * 1 dm3/pulse + [Description("l/stopień")] lpdeg, /// * 1 l/degree + [Description("dm3/stopień")] dm3pdeg, /// * 1 dm3/degree +#else + [Description("pulse/l")] ppl, /// * 1 pulse/l + [Description("pulse/dm3")] ppdm3, /// * 1 pulse/dm3 + [Description("degree/l")] degpl, /// * 1 degree/l + [Description("degree/dm3")] degpdm3, /// * 1 degree/dm3 + [Description("l/pulse")] lpp, /// * 1 l/pulse + [Description("dm3/pulse")] dm3pp, /// * 1 dm3/pulse + [Description("l/degree")] lpdeg, /// * 1 l/degree + [Description("dm3/degree")] dm3pdeg, /// * 1 dm3/degree +#endif + /// + [Description("pulse/kWh")] ppkWh, /// * 1 pulse/kWh + [Description("kWh/pulse")] kWhpp, /// * 1 kWh/pulse + + Count + } + + public enum Quantity + { + /// Quantities with units and conversions (double -> double) +#if LANG_DE + [Description("Volumen")] Volume, + [Description("Durchfluss")] Flow, + [Description("Masse")] Mass, + [Description("Zeit")] Time, + [Description("Temperatur")] Temperature, + [Description("Druck")] Pressure, + [Description("Feuchtigkeit")] Humidity, + [Description("Fehler")] Error, + [Description("Länge")] Length, + [Description("Dichte")] Density, + [Description("Energie")] Energy, + [Description("Impulse")] Pulses, + [Description("Impulse/l")] PulsePerLtr, + [Description("Impulse/kWh")] PulsePerKWh, + + /// Quantities without units and conversions + [Description("Nummer")] Number, + [Description("Text")] String, + [Description("Boolean")] Boolean, + [Description("Datum und Uhrzeit")] DateTime, +#elif LANG_PL + [Description("Objętość")] Volume, + [Description("Przepływ")] Flow, + [Description("Masa")] Mass, + [Description("Czas")] Time, + [Description("Temperatura")] Temperature, + [Description("Ciśnienie")] Pressure, + [Description("Wilgotność")] Humidity, + [Description("Błąd")] Error, + [Description("Długość")] Length, + [Description("Gęstość")] Density, + [Description("Energia")] Energy, + [Description("Impulsy")] Pulses, + [Description("Impulsy/litr")] PulsePerLtr, + [Description("Impulsy/kWh")] PulsePerKWh, + + /// Quantities without units and conversions + [Description("Numer")] Number, + [Description("Tekst")] String, + [Description("Boolean")] Boolean, + [Description("Data i czas")] DateTime, +#elif LANG_CS + [Description("Objem")] Volume, + [Description("Průtok")] Flow, + [Description("Hmotnost")] Mass, + [Description("Čas")] Time, + [Description("Teplota")] Temperature, + [Description("Tlak")] Pressure, + [Description("Vlhkost")] Humidity, + [Description("Chyba")] Error, + [Description("Délka")] Length, + [Description("Hustota")] Density, + [Description("Energie")] Energy, + [Description("Pulzy")] Pulses, + [Description("Pulzy/litr")] PulsePerLtr, + [Description("Pulzy/kWh")] PulsePerKWh, + + /// Quantities without units and conversions + [Description("Počet")] Number, + [Description("Text")] String, + [Description("Boolean")] Boolean, + [Description("Datum a čas")] DateTime, +#elif LANG_IT + [Description("Volume")] Volume, + [Description("Flusso")] Flow, + [Description("Massa")] Mass, + [Description("Tempo")] Time, + [Description("Temperatura")] Temperature, + [Description("Pressione")] Pressure, + [Description("Umidità")] Humidity, + [Description("Errore")] Error, + [Description("Lungezza")] Length, + [Description("Densità")] Density, + [Description("Energia")] Energy, + [Description("Impulso")] Pulses, + [Description("Impulso/litro")] PulsePerLtr, + [Description("Impulso/kWh")] PulsePerKWh, + + /// Quantities without units and conversions + [Description("Numero")] Number, + [Description("Stringa")] String, + [Description("Boolean")] Boolean, + [Description("Data e ora")] DateTime, +#else + [Description("Volume")] Volume, + [Description("Flow")] Flow, + [Description("Mass")] Mass, + [Description("Time")] Time, + [Description("Temperature")] Temperature, + [Description("Pressure")] Pressure, + [Description("Humidity")] Humidity, + [Description("Error")] Error, + [Description("Length")] Length, + [Description("Density")] Density, + [Description("Energy")] Energy, + [Description("Pulses")] Pulses, + [Description("Pulses/liter")] PulsePerLtr, + [Description("Pulses/kWh")] PulsePerKWh, + + /// Quantities without units and conversions + [Description("Number")] Number, + [Description("String")] String, + [Description("Boolean")] Boolean, + [Description("Date and time")] DateTime, +#endif + Count, + } + + public static class Units + { + public static bool IsUnitless(Quantity quantity) + { + return quantity >= Quantity.Number; + } + + public static bool IsDefaultUnit(Unit unit) + { + return unit == Unit.l || unit == Unit.m3ph || unit == Unit.kg || unit == Unit.s || unit == Unit.C || unit == Unit.bar || unit == Unit.RPct || + unit == Unit.Pct || unit == Unit.mm || unit == Unit.kgpm3 || unit == Unit.J || unit == Unit.ppl || unit == Unit.ppkWh; + } + + public static bool IsQuantity(Unit units, Quantity quantity) + { + return (quantity == GetQuantity(units)); + } + + public static Quantity GetQuantity(Unit units) + { + switch (units) + { + case Unit.pulse: + case Unit.degree: + return Config.Quantity.Pulses; + + case Unit.l: + case Unit.dm3: + case Unit.m3: + case Unit.gal_UK: + case Unit.gal_US: + return Config.Quantity.Volume; + + case Unit.lph: + case Unit.m3ph: + return Config.Quantity.Flow; + + case Unit.g: + case Unit.kg: + case Unit.t: + case Unit.lb: + return Config.Quantity.Mass; + + case Unit.s: + case Unit.min: + case Unit.hour: + case Unit.ms: + return Config.Quantity.Time; + + case Unit.C: + case Unit.F: + case Unit.K: + return Config.Quantity.Temperature; + + case Unit.Pa: + case Unit.hPa: + case Unit.mbar: + case Unit.kPa: + case Unit.bar: + case Unit.MPa: + case Unit.inHg: + return Config.Quantity.Pressure; + + case Unit.RPct: + return Config.Quantity.Humidity; + + case Unit.Pct: + case Unit.Promile: + return Config.Quantity.Error; + + case Unit.mm: + case Unit.cm: + case Unit.m: + case Unit.inch: + return Config.Quantity.Length; + + case Unit.kgpm3: + case Unit.kgpl: + return Config.Quantity.Density; + + case Unit.J: + case Unit.kJ: + case Unit.MJ: + case Unit.Wh: + case Unit.kWh: + case Unit.MWh: + return Config.Quantity.Energy; + + case Unit.ppl: + case Unit.ppdm3: + case Unit.degpl: + case Unit.degpdm3: + case Unit.lpp: + case Unit.dm3pp: + case Unit.lpdeg: + case Unit.dm3pdeg: + return Config.Quantity.PulsePerLtr; + + case Unit.ppkWh: + case Unit.kWhpp: + return Config.Quantity.PulsePerKWh; + + default: + return Config.Quantity.Number; + } + } + + public static bool IsVolume(Unit units) { return IsQuantity(units, Config.Quantity.Volume); } + public static bool IsFlow(Unit units) { return IsQuantity(units, Config.Quantity.Flow); } + public static bool IsMass(Unit units) { return IsQuantity(units, Config.Quantity.Mass); } + public static bool IsTime(Unit units) { return IsQuantity(units, Config.Quantity.Time); } + public static bool IsTemperature(Unit units) { return IsQuantity(units, Config.Quantity.Temperature); } + public static bool IsPressure(Unit units) { return IsQuantity(units, Config.Quantity.Pressure); } + public static bool IsHumidity(Unit units) { return IsQuantity(units, Config.Quantity.Humidity); } + public static bool IsError(Unit units) { return IsQuantity(units, Config.Quantity.Error); } + public static bool IsLength(Unit units) { return IsQuantity(units, Config.Quantity.Length); } + public static bool IsDensity(Unit units) { return IsQuantity(units, Config.Quantity.Density); } + public static bool IsEnergy(Unit units) { return IsQuantity(units, Config.Quantity.Energy); } + public static bool IsPulses(Unit units) { return IsQuantity(units, Config.Quantity.Pulses); } + public static bool IsPulsePerLtr(Unit units) { return IsQuantity(units, Config.Quantity.PulsePerLtr); } + public static bool IsPulsePerKWh(Unit units) { return IsQuantity(units, Config.Quantity.PulsePerKWh); } + + + public static double ConvertTo(Unit units, double v) + { + switch (units) + { + /// Volume: internal representation in l + case Unit.dm3: + case Unit.l: return v; /// 1 liter + case Unit.m3: return 0.001 * v; /// 1 m3 = 1000 l + case Unit.gal_UK: return 0.21996925 * v; /// 1 gal(UK) = 4.54609 l + case Unit.gal_US: return 0.26417205 * v; /// 1 gal(US) = 3.78541178 l + + /// Flow: internal representation in m3/h + case Unit.lph: return 1000 * v; /// 1 liter/h + case Unit.m3ph: return v; /// 1 m3/h = 1000 l/h + + /// Mass: internal representation in kg + case Unit.g: return 1000 * v; /// 1 g = 0.001 kg + case Unit.kg: return v; /// 1 kilogram + case Unit.t: return 0.001 * v; /// 1 t = 1000 kg + case Unit.lb: return 2.2046226 * v; /// 1 lb = 0.45359237 kg + + /// Time or duration: internal representation in seconds [s] + case Unit.s: return v; + case Unit.min: return v / 60; + case Unit.hour: return v / 3600; + case Unit.ms: return 1000 * v; + + /// Temperature: internal representation in °C + case Unit.C: return v; /// degree Celsius (°C) + case Unit.F: return 1.8 * v + 32; /// degree Fahrenheit + case Unit.K: return v + 273.15; /// degree Kelvin + + /// Pressure: internal representation in bar = 0.1 MPa + case Unit.Pa: return 100000 * v; /// 1 hPa = 100 Pa + case Unit.hPa: return 1000 * v; /// 1 hPa = 100 Pa + case Unit.mbar: return 1000 * v; /// 1 mbar = 1 hPa = 100 Pa + case Unit.kPa: return 100 * v; /// 1 kPa = 10 HPa + case Unit.bar: return v; /// 1 bar = 1000 mbar = 100000 Pa + case Unit.MPa: return 0.1 * v; /// 1 MPa = 10000 hPa + case Unit.inHg: return 29.53 * v; /// 1 inHg = 33.864 hPa + + /// Error: internal representation in % + case Unit.Pct: return v; /// 1 % + case Unit.Promile: return 10 * v; /// 1 promile = 0.1 % + + /// Diameter, length: internal representation in mm + case Unit.mm: return v; /// 1 mm + case Unit.cm: return 0.1 * v; /// 1 cm = 10 mm + case Unit.m: return 0.001 * v; /// 1 m = 1000 mm + case Unit.inch: return v / 25.4; /// 1 inch = 25.4 mm + + /// Density: internal representation in kg/m3 + case Unit.kgpm3: return v; + case Unit.kgpl: return 0.001 * v; + + /// Energy, internal representation in Joul + case Unit.J: return v; /// 1 Joul + case Unit.kJ: return 0.001 * v; /// 1 kJ = 1000 J + case Unit.MJ: return 0.000001 * v; /// 1 kJ = 1000000 J + case Unit.Wh: return v / 3600.0; /// 1 Wh = 3600 J + case Unit.kWh: return v / 3600000.0; /// 1 kWh = 3600000 J + case Unit.MWh: return v / 3600000000.0;/// 1 MWh = 3600000000 J + + case Unit.kWhpp: + case Unit.lpp: + case Unit.dm3pp: + case Unit.lpdeg: + case Unit.dm3pdeg: return ((v <= float.Epsilon) ? 0 : 1 / v); + + default: return v; + } + } + + public static double ConvertFrom(Unit units, double v) + { + switch (units) + { + /// Volume: internal representation in l + case Unit.dm3: + case Unit.l: return v; /// 1 liter + case Unit.m3: return 1000 * v; /// 1000 l + case Unit.gal_UK: return 4.54609 * v; /// 1 gal(UK) = 4.54609 l + case Unit.gal_US: return 3.78541178 * v; /// 1 gal(US) = 3.78541178 l + + /// Flow: internal representation in m3/h + case Unit.lph: return 0.001 * v; /// 1 liter/h + case Unit.m3ph: return v; /// 1 m3/h = 1000 l/h + + /// Mass: internal representation in kg + case Unit.g: return 0.001 * v; /// 1 g = 0.001 kg + case Unit.kg: return v; /// 1 kilogram + case Unit.t: return 1000 * v; /// 1 t = 1000 kg + case Unit.lb: return 0.45359237 * v; /// 1 lb = 0.45359237 kg + + /// Time or duration: internal representation in seconds [s] + case Unit.s: return v; + case Unit.min: return 60 * v; + case Unit.hour: return 3600 * v; + case Unit.ms: return v / 1000; + + /// Temperature: internal representation in °C + case Unit.C: return v; /// degree Celsius (°C) + case Unit.F: return 5 * (v-32) / 9; /// degree Fahrenheit + case Unit.K: return v - 273.15; /// degree Kelvin + + /// Pressure: internal representation in bar = 0.1 MPa + case Unit.Pa: return 0.00001 * v; /// 1 hPa = 100 Pa + case Unit.hPa: return 0.001 * v; /// 1 hPa = 100 Pa + case Unit.mbar: return 0.001 * v; /// 1 mbar = 1 hPa = 100 Pa + case Unit.kPa: return 0.01 * v; /// 1 kPa = 10 HPa + case Unit.bar: return v; /// 1 bar = 1000 mbar = 100000 Pa + case Unit.MPa: return 10 * v; /// 1 MPa = 10000 hPa + case Unit.inHg: return 0.033864 * v; /// 1 inHg = 33.864 hPa + + /// Error: internal representation in % + case Unit.Pct: return v; /// 1 % + case Unit.Promile: return 0.1 * v; /// 1 promile = 0.1 % + + /// Diameter, length: internal representation in mm + case Unit.mm: return v; /// 1 mm + case Unit.cm: return 10 * v; /// 1 cm = 10 mm + case Unit.m: return 1000 * v; /// 1 m = 1000 mm + case Unit.inch: return 25.4 * v; /// 1 inch = 25.4 mm + + /// Density: internal representation in kg/m3 + case Unit.kgpm3: return v; + case Unit.kgpl: return 1000 * v; + + /// Energy, internal representation in Joul + case Unit.J: return v; /// 1 Joul + case Unit.kJ: return 1000 * v; /// 1 kJ = 1000 J + case Unit.MJ: return 1000000 * v; /// 1 kJ = 1000000 J + case Unit.Wh: return 3600 * v; /// 1 Wh = 3600 J + case Unit.kWh: return 3600000 * v; /// 1 kWh = 3600000 J + case Unit.MWh: return 3600000000 * v; /// 1 kWh = 3600000000 J + + case Unit.kWhpp: + case Unit.lpp: + case Unit.dm3pp: + case Unit.lpdeg: + case Unit.dm3pdeg: return ((v == 0) ? 0 : 1 / v); + + default: return v; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/Config/Utils.cs b/TBF_V2/Sources/TBF/Config/Utils.cs new file mode 100644 index 00000000..f93c6f75 --- /dev/null +++ b/TBF_V2/Sources/TBF/Config/Utils.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Config +{ + public static class Utils + { + public static string SignificantDigitsToFmt(double value, int sigDigits) + { + if (sigDigits == 5) + { + if (value >= 9999.5 || value < -9999.5) return "F0"; + else if (value >= 999.95 || value < -999.95) return "F1"; + else if (value >= 99.995 || value < -99.995) return "F2"; + else if (value >= 9.9995 || value < -9.9995) return "F3"; + else if (value >= 0.99995 || value < -0.99995) return "F4"; + else if (value >= 0.099995 || value < -0.099995) return "F5"; + else if (value >= 0.0099995 || value < -0.0099995) return "F6"; + else if (value >= 0.00099995 || value < -0.00099995) return "F7"; + else if (value >= 0.000099995 || value < -0.000099995) return "F8"; + else return "F9"; + } + else if (sigDigits == 4) + { + if (value >= 999.5 || value < -999.5) return "F0"; + else if (value >= 99.95 || value < -99.95) return "F1"; + else if (value >= 9.995 || value < -9.995) return "F2"; + else if (value >= 0.9995 || value < -0.9995) return "F3"; + else if (value >= 0.09995 || value < -0.09995) return "F4"; + else if (value >= 0.009995 || value < -0.009995) return "F5"; + else if (value >= 0.0009995 || value < -0.0009995) return "F6"; + else if (value >= 0.00009995 || value < -0.00009995) return "F7"; + else return "F8"; + } + else if (sigDigits == 3) + { + if (value >= 99.5 || value < -99.5) return "F0"; + else if (value >= 9.95 || value < -9.95) return "F1"; + else if (value >= 0.995 || value < -0.995) return "F2"; + else if (value >= 0.0995 || value < -0.0995) return "F3"; + else if (value >= 0.00995 || value < -0.00995) return "F4"; + else if (value >= 0.000995 || value < -0.000995) return "F5"; + else if (value >= 0.0000995 || value < -0.0000995) return "F6"; + else return "F7"; + } + else if (sigDigits == 2) + { + if (value >= 9.5 || value < -9.5) return "F0"; + else if (value >= 0.95 || value < -0.95) return "F1"; + else if (value >= 0.095 || value < -0.095) return "F2"; + else if (value >= 0.0095 || value < -0.0095) return "F3"; + else if (value >= 0.00095 || value < -0.00095) return "F4"; + else if (value >= 0.000095 || value < -0.000095) return "F5"; + else return "F6"; + } + else /// if (sigDigits == 1) + { + if (value >= 0.95 || value < -0.95) return "F0"; + else if (value >= 0.095 || value < -0.095) return "F1"; + else if (value >= 0.0095 || value < -0.0095) return "F2"; + else if (value >= 0.00095 || value < -0.00095) return "F3"; + else if (value >= 0.000095 || value < -0.000095) return "F4"; + else return "F5"; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/DeviceTest/DeviceTest.csproj b/TBF_V2/Sources/TBF/DeviceTest/DeviceTest.csproj new file mode 100644 index 00000000..98047db2 --- /dev/null +++ b/TBF_V2/Sources/TBF/DeviceTest/DeviceTest.csproj @@ -0,0 +1,108 @@ + + + + Debug + x86 + 8.0.30703 + 2.0 + {6D3384DC-4638-4A92-91A8-F39D900377C6} + WinExe + Properties + DeviceTest + DeviceTest + v4.0 + + + 512 + + + x86 + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + x86 + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + DeviceTest.Program + + + + False + ..\packages\log4net.2.0.2\lib\net40-full\log4net.dll + + + + + + + + + + + + + + + Form + + + DeviceTestDlg.cs + + + + + + DeviceTestDlg.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + {743DF7DB-C7B6-42EB-986D-0F485E5588E4} + Config + + + {8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48} + TBF + + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/DeviceTest/DeviceTestDlg.Designer.cs b/TBF_V2/Sources/TBF/DeviceTest/DeviceTestDlg.Designer.cs new file mode 100644 index 00000000..3077a04c --- /dev/null +++ b/TBF_V2/Sources/TBF/DeviceTest/DeviceTestDlg.Designer.cs @@ -0,0 +1,584 @@ +namespace DeviceTest +{ + partial class DeviceTestDlg + { + /// + /// 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() + { + this.parentClassNameComboBox = new System.Windows.Forms.ComboBox(); + this.classLabel = new System.Windows.Forms.Label(); + this.nameLabel = new System.Windows.Forms.Label(); + this.parentNameTextBox = new System.Windows.Forms.TextBox(); + this.configureParentButton = new System.Windows.Forms.Button(); + this.startButton = new System.Windows.Forms.Button(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.configureComponent1Button = new System.Windows.Forms.Button(); + this.componentNameTextBox = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.component1ClassNameComboBox = new System.Windows.Forms.ComboBox(); + this.radioButton4 = new System.Windows.Forms.RadioButton(); + this.radioButton3 = new System.Windows.Forms.RadioButton(); + this.radioButton2 = new System.Windows.Forms.RadioButton(); + this.radioButton1 = new System.Windows.Forms.RadioButton(); + this.radioButton0 = new System.Windows.Forms.RadioButton(); + this.stopButton = new System.Windows.Forms.Button(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.configureComponent2Button = new System.Windows.Forms.Button(); + this.component2NameTextBox = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.component2ClassNameComboBox = new System.Windows.Forms.ComboBox(); + this.radioButton24 = new System.Windows.Forms.RadioButton(); + this.radioButton23 = new System.Windows.Forms.RadioButton(); + this.radioButton22 = new System.Windows.Forms.RadioButton(); + this.radioButton21 = new System.Windows.Forms.RadioButton(); + this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.radioButton34 = new System.Windows.Forms.RadioButton(); + this.radioButton33 = new System.Windows.Forms.RadioButton(); + this.radioButton32 = new System.Windows.Forms.RadioButton(); + this.radioButton31 = new System.Windows.Forms.RadioButton(); + this.groupBox5 = new System.Windows.Forms.GroupBox(); + this.configureComponent3Button = new System.Windows.Forms.Button(); + this.component3NameTextBox = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.label6 = new System.Windows.Forms.Label(); + this.component3ClassNameComboBox = new System.Windows.Forms.ComboBox(); + this.groupBox1.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.groupBox4.SuspendLayout(); + this.groupBox5.SuspendLayout(); + this.SuspendLayout(); + // + // parentClassNameComboBox + // + this.parentClassNameComboBox.FormattingEnabled = true; + this.parentClassNameComboBox.Location = new System.Drawing.Point(77, 19); + this.parentClassNameComboBox.Name = "parentClassNameComboBox"; + this.parentClassNameComboBox.Size = new System.Drawing.Size(299, 21); + this.parentClassNameComboBox.TabIndex = 0; + // + // classLabel + // + this.classLabel.AutoSize = true; + this.classLabel.Location = new System.Drawing.Point(11, 22); + this.classLabel.Name = "classLabel"; + this.classLabel.Size = new System.Drawing.Size(32, 13); + this.classLabel.TabIndex = 1; + this.classLabel.Text = "Class"; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(11, 47); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 2; + this.nameLabel.Text = "Name"; + // + // parentNameTextBox + // + this.parentNameTextBox.Enabled = false; + this.parentNameTextBox.Location = new System.Drawing.Point(77, 44); + this.parentNameTextBox.Name = "parentNameTextBox"; + this.parentNameTextBox.Size = new System.Drawing.Size(299, 20); + this.parentNameTextBox.TabIndex = 3; + // + // configureParentButton + // + this.configureParentButton.Location = new System.Drawing.Point(395, 19); + this.configureParentButton.Name = "configureParentButton"; + this.configureParentButton.Size = new System.Drawing.Size(73, 45); + this.configureParentButton.TabIndex = 4; + this.configureParentButton.Text = "Configure"; + this.configureParentButton.UseVisualStyleBackColor = true; + this.configureParentButton.Click += new System.EventHandler(this.configureParentButton_Click); + // + // startButton + // + this.startButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.startButton.Location = new System.Drawing.Point(520, 19); + this.startButton.Name = "startButton"; + this.startButton.Size = new System.Drawing.Size(73, 45); + this.startButton.TabIndex = 7; + this.startButton.Text = "Start"; + this.startButton.UseVisualStyleBackColor = true; + this.startButton.Click += new System.EventHandler(this.startButton_Click); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.configureParentButton); + this.groupBox1.Controls.Add(this.parentNameTextBox); + this.groupBox1.Controls.Add(this.nameLabel); + this.groupBox1.Controls.Add(this.classLabel); + this.groupBox1.Controls.Add(this.parentClassNameComboBox); + this.groupBox1.Location = new System.Drawing.Point(12, 12); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(486, 75); + this.groupBox1.TabIndex = 8; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Parent component"; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.configureComponent1Button); + this.groupBox2.Controls.Add(this.componentNameTextBox); + this.groupBox2.Controls.Add(this.label1); + this.groupBox2.Controls.Add(this.label2); + this.groupBox2.Controls.Add(this.component1ClassNameComboBox); + this.groupBox2.Location = new System.Drawing.Point(12, 93); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(486, 75); + this.groupBox2.TabIndex = 9; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Component 1"; + // + // configureComponentButton + // + this.configureComponent1Button.Location = new System.Drawing.Point(395, 19); + this.configureComponent1Button.Name = "configureComponentButton"; + this.configureComponent1Button.Size = new System.Drawing.Size(73, 45); + this.configureComponent1Button.TabIndex = 4; + this.configureComponent1Button.Text = "Configure"; + this.configureComponent1Button.UseVisualStyleBackColor = true; + this.configureComponent1Button.Click += new System.EventHandler(this.configureComponent1Button_Click); + // + // componentNameTextBox + // + this.componentNameTextBox.Enabled = false; + this.componentNameTextBox.Location = new System.Drawing.Point(77, 44); + this.componentNameTextBox.Name = "componentNameTextBox"; + this.componentNameTextBox.Size = new System.Drawing.Size(299, 20); + this.componentNameTextBox.TabIndex = 3; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(11, 47); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(35, 13); + this.label1.TabIndex = 2; + this.label1.Text = "Name"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(11, 22); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(32, 13); + this.label2.TabIndex = 1; + this.label2.Text = "Class"; + // + // componentClassNameComboBox + // + this.component1ClassNameComboBox.FormattingEnabled = true; + this.component1ClassNameComboBox.Location = new System.Drawing.Point(77, 19); + this.component1ClassNameComboBox.Name = "componentClassNameComboBox"; + this.component1ClassNameComboBox.Size = new System.Drawing.Size(299, 21); + this.component1ClassNameComboBox.TabIndex = 0; + // + // radioButton4 + // + this.radioButton4.AutoSize = true; + this.radioButton4.Location = new System.Drawing.Point(13, 118); + this.radioButton4.Name = "radioButton4"; + this.radioButton4.Size = new System.Drawing.Size(51, 17); + this.radioButton4.TabIndex = 9; + this.radioButton4.TabStop = true; + this.radioButton4.Text = "spare"; + this.radioButton4.UseVisualStyleBackColor = true; + this.radioButton4.CheckedChanged += new System.EventHandler(this.radioButton4_CheckedChanged); + // + // radioButton3 + // + this.radioButton3.AutoSize = true; + this.radioButton3.Location = new System.Drawing.Point(13, 95); + this.radioButton3.Name = "radioButton3"; + this.radioButton3.Size = new System.Drawing.Size(51, 17); + this.radioButton3.TabIndex = 8; + this.radioButton3.TabStop = true; + this.radioButton3.Text = "spare"; + this.radioButton3.UseVisualStyleBackColor = true; + this.radioButton3.CheckedChanged += new System.EventHandler(this.radioButton3_CheckedChanged); + // + // radioButton2 + // + this.radioButton2.AutoSize = true; + this.radioButton2.Location = new System.Drawing.Point(13, 72); + this.radioButton2.Name = "radioButton2"; + this.radioButton2.Size = new System.Drawing.Size(51, 17); + this.radioButton2.TabIndex = 7; + this.radioButton2.TabStop = true; + this.radioButton2.Text = "spare"; + this.radioButton2.UseVisualStyleBackColor = true; + this.radioButton2.CheckedChanged += new System.EventHandler(this.radioButton2_CheckedChanged); + // + // radioButton1 + // + this.radioButton1.AutoSize = true; + this.radioButton1.Location = new System.Drawing.Point(13, 49); + this.radioButton1.Name = "radioButton1"; + this.radioButton1.Size = new System.Drawing.Size(106, 17); + this.radioButton1.TabIndex = 6; + this.radioButton1.TabStop = true; + this.radioButton1.Text = "ReadPressureOp"; + this.radioButton1.UseVisualStyleBackColor = true; + this.radioButton1.CheckedChanged += new System.EventHandler(this.radioButton1_CheckedChanged); + // + // radioButton0 + // + this.radioButton0.AutoSize = true; + this.radioButton0.Location = new System.Drawing.Point(13, 26); + this.radioButton0.Name = "radioButton0"; + this.radioButton0.Size = new System.Drawing.Size(94, 17); + this.radioButton0.TabIndex = 5; + this.radioButton0.TabStop = true; + this.radioButton0.Text = "Stop operation"; + this.radioButton0.UseVisualStyleBackColor = true; + this.radioButton0.CheckedChanged += new System.EventHandler(this.radioButton0_CheckedChanged); + // + // stopButton + // + this.stopButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.stopButton.Location = new System.Drawing.Point(520, 77); + this.stopButton.Name = "stopButton"; + this.stopButton.Size = new System.Drawing.Size(73, 45); + this.stopButton.TabIndex = 10; + this.stopButton.Text = "Stop"; + this.stopButton.UseVisualStyleBackColor = true; + this.stopButton.Click += new System.EventHandler(this.stopButton_Click); + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.configureComponent2Button); + this.groupBox3.Controls.Add(this.component2NameTextBox); + this.groupBox3.Controls.Add(this.label3); + this.groupBox3.Controls.Add(this.label4); + this.groupBox3.Controls.Add(this.component2ClassNameComboBox); + this.groupBox3.Location = new System.Drawing.Point(12, 174); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(486, 75); + this.groupBox3.TabIndex = 11; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "Component 2"; + // + // configureComponent2Button + // + this.configureComponent2Button.Location = new System.Drawing.Point(395, 19); + this.configureComponent2Button.Name = "configureComponent2Button"; + this.configureComponent2Button.Size = new System.Drawing.Size(73, 45); + this.configureComponent2Button.TabIndex = 4; + this.configureComponent2Button.Text = "Configure"; + this.configureComponent2Button.UseVisualStyleBackColor = true; + this.configureComponent2Button.Click += new System.EventHandler(this.configureComponent2Button_Click); + // + // component2NameTextBox + // + this.component2NameTextBox.Enabled = false; + this.component2NameTextBox.Location = new System.Drawing.Point(77, 44); + this.component2NameTextBox.Name = "component2NameTextBox"; + this.component2NameTextBox.Size = new System.Drawing.Size(299, 20); + this.component2NameTextBox.TabIndex = 3; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(11, 47); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(35, 13); + this.label3.TabIndex = 2; + this.label3.Text = "Name"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(11, 22); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(32, 13); + this.label4.TabIndex = 1; + this.label4.Text = "Class"; + // + // component2ClassNameComboBox + // + this.component2ClassNameComboBox.FormattingEnabled = true; + this.component2ClassNameComboBox.Location = new System.Drawing.Point(77, 19); + this.component2ClassNameComboBox.Name = "component2ClassNameComboBox"; + this.component2ClassNameComboBox.Size = new System.Drawing.Size(299, 21); + this.component2ClassNameComboBox.TabIndex = 0; + // + // radioButton24 + // + this.radioButton24.AutoSize = true; + this.radioButton24.Location = new System.Drawing.Point(212, 118); + this.radioButton24.Name = "radioButton24"; + this.radioButton24.Size = new System.Drawing.Size(51, 17); + this.radioButton24.TabIndex = 9; + this.radioButton24.TabStop = true; + this.radioButton24.Text = "spare"; + this.radioButton24.UseVisualStyleBackColor = true; + this.radioButton24.CheckedChanged += new System.EventHandler(this.radioButton24_CheckedChanged); + // + // radioButton23 + // + this.radioButton23.AutoSize = true; + this.radioButton23.Location = new System.Drawing.Point(212, 95); + this.radioButton23.Name = "radioButton23"; + this.radioButton23.Size = new System.Drawing.Size(51, 17); + this.radioButton23.TabIndex = 8; + this.radioButton23.TabStop = true; + this.radioButton23.Text = "spare"; + this.radioButton23.UseVisualStyleBackColor = true; + this.radioButton23.CheckedChanged += new System.EventHandler(this.radioButton23_CheckedChanged); + // + // radioButton22 + // + this.radioButton22.AutoSize = true; + this.radioButton22.Location = new System.Drawing.Point(212, 72); + this.radioButton22.Name = "radioButton22"; + this.radioButton22.Size = new System.Drawing.Size(51, 17); + this.radioButton22.TabIndex = 7; + this.radioButton22.TabStop = true; + this.radioButton22.Text = "spare"; + this.radioButton22.UseVisualStyleBackColor = true; + this.radioButton22.CheckedChanged += new System.EventHandler(this.radioButton22_CheckedChanged); + // + // radioButton21 + // + this.radioButton21.AutoSize = true; + this.radioButton21.Location = new System.Drawing.Point(212, 49); + this.radioButton21.Name = "radioButton21"; + this.radioButton21.Size = new System.Drawing.Size(106, 17); + this.radioButton21.TabIndex = 6; + this.radioButton21.TabStop = true; + this.radioButton21.Text = "ReadPressureOp"; + this.radioButton21.UseVisualStyleBackColor = true; + this.radioButton21.CheckedChanged += new System.EventHandler(this.radioButton21_CheckedChanged); + // + // groupBox4 + // + this.groupBox4.Controls.Add(this.radioButton34); + this.groupBox4.Controls.Add(this.radioButton33); + this.groupBox4.Controls.Add(this.radioButton32); + this.groupBox4.Controls.Add(this.radioButton31); + this.groupBox4.Controls.Add(this.radioButton24); + this.groupBox4.Controls.Add(this.radioButton4); + this.groupBox4.Controls.Add(this.radioButton23); + this.groupBox4.Controls.Add(this.radioButton0); + this.groupBox4.Controls.Add(this.radioButton22); + this.groupBox4.Controls.Add(this.radioButton3); + this.groupBox4.Controls.Add(this.radioButton21); + this.groupBox4.Controls.Add(this.radioButton1); + this.groupBox4.Controls.Add(this.radioButton2); + this.groupBox4.Location = new System.Drawing.Point(12, 349); + this.groupBox4.Name = "groupBox4"; + this.groupBox4.Size = new System.Drawing.Size(581, 145); + this.groupBox4.TabIndex = 12; + this.groupBox4.TabStop = false; + this.groupBox4.Text = "Operations"; + // + // radioButton34 + // + this.radioButton34.AutoSize = true; + this.radioButton34.Location = new System.Drawing.Point(405, 118); + this.radioButton34.Name = "radioButton34"; + this.radioButton34.Size = new System.Drawing.Size(51, 17); + this.radioButton34.TabIndex = 13; + this.radioButton34.TabStop = true; + this.radioButton34.Text = "spare"; + this.radioButton34.UseVisualStyleBackColor = true; + this.radioButton34.CheckedChanged += new System.EventHandler(this.radioButton34_CheckedChanged); + // + // radioButton33 + // + this.radioButton33.AutoSize = true; + this.radioButton33.Location = new System.Drawing.Point(405, 95); + this.radioButton33.Name = "radioButton33"; + this.radioButton33.Size = new System.Drawing.Size(51, 17); + this.radioButton33.TabIndex = 12; + this.radioButton33.TabStop = true; + this.radioButton33.Text = "spare"; + this.radioButton33.UseVisualStyleBackColor = true; + this.radioButton33.CheckedChanged += new System.EventHandler(this.radioButton33_CheckedChanged); + // + // radioButton32 + // + this.radioButton32.AutoSize = true; + this.radioButton32.Location = new System.Drawing.Point(405, 72); + this.radioButton32.Name = "radioButton32"; + this.radioButton32.Size = new System.Drawing.Size(51, 17); + this.radioButton32.TabIndex = 11; + this.radioButton32.TabStop = true; + this.radioButton32.Text = "spare"; + this.radioButton32.UseVisualStyleBackColor = true; + this.radioButton32.CheckedChanged += new System.EventHandler(this.radioButton32_CheckedChanged); + // + // radioButton31 + // + this.radioButton31.AutoSize = true; + this.radioButton31.Location = new System.Drawing.Point(405, 49); + this.radioButton31.Name = "radioButton31"; + this.radioButton31.Size = new System.Drawing.Size(106, 17); + this.radioButton31.TabIndex = 10; + this.radioButton31.TabStop = true; + this.radioButton31.Text = "ReadPressureOp"; + this.radioButton31.UseVisualStyleBackColor = true; + this.radioButton31.CheckedChanged += new System.EventHandler(this.radioButton31_CheckedChanged); + // + // groupBox5 + // + this.groupBox5.Controls.Add(this.configureComponent3Button); + this.groupBox5.Controls.Add(this.component3NameTextBox); + this.groupBox5.Controls.Add(this.label5); + this.groupBox5.Controls.Add(this.label6); + this.groupBox5.Controls.Add(this.component3ClassNameComboBox); + this.groupBox5.Location = new System.Drawing.Point(12, 255); + this.groupBox5.Name = "groupBox5"; + this.groupBox5.Size = new System.Drawing.Size(486, 75); + this.groupBox5.TabIndex = 13; + this.groupBox5.TabStop = false; + this.groupBox5.Text = "Component 3"; + // + // configureComponent3Button + // + this.configureComponent3Button.Location = new System.Drawing.Point(395, 19); + this.configureComponent3Button.Name = "configureComponent3Button"; + this.configureComponent3Button.Size = new System.Drawing.Size(73, 45); + this.configureComponent3Button.TabIndex = 4; + this.configureComponent3Button.Text = "Configure"; + this.configureComponent3Button.UseVisualStyleBackColor = true; + this.configureComponent3Button.Click += new System.EventHandler(this.configureComponent3Button_Click); + // + // component3NameTextBox + // + this.component3NameTextBox.Enabled = false; + this.component3NameTextBox.Location = new System.Drawing.Point(77, 44); + this.component3NameTextBox.Name = "component3NameTextBox"; + this.component3NameTextBox.Size = new System.Drawing.Size(299, 20); + this.component3NameTextBox.TabIndex = 3; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(11, 47); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(35, 13); + this.label5.TabIndex = 2; + this.label5.Text = "Name"; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(11, 22); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(32, 13); + this.label6.TabIndex = 1; + this.label6.Text = "Class"; + // + // component3ClassNameComboBox + // + this.component3ClassNameComboBox.FormattingEnabled = true; + this.component3ClassNameComboBox.Location = new System.Drawing.Point(77, 19); + this.component3ClassNameComboBox.Name = "component3ClassNameComboBox"; + this.component3ClassNameComboBox.Size = new System.Drawing.Size(299, 21); + this.component3ClassNameComboBox.TabIndex = 0; + // + // DeviceTestDlg + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(613, 502); + this.Controls.Add(this.groupBox5); + this.Controls.Add(this.groupBox4); + this.Controls.Add(this.groupBox3); + this.Controls.Add(this.stopButton); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.startButton); + this.Controls.Add(this.groupBox1); + this.Name = "DeviceTestDlg"; + this.Text = "Device test"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.DeviceTestDlg_FormClosing); + this.Load += new System.EventHandler(this.DeviceTestDlg_Load); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.groupBox4.ResumeLayout(false); + this.groupBox4.PerformLayout(); + this.groupBox5.ResumeLayout(false); + this.groupBox5.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.ComboBox parentClassNameComboBox; + private System.Windows.Forms.Label classLabel; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.TextBox parentNameTextBox; + private System.Windows.Forms.Button configureParentButton; + private System.Windows.Forms.Button startButton; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.Button configureComponent1Button; + private System.Windows.Forms.TextBox componentNameTextBox; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.ComboBox component1ClassNameComboBox; + private System.Windows.Forms.RadioButton radioButton4; + private System.Windows.Forms.RadioButton radioButton3; + private System.Windows.Forms.RadioButton radioButton2; + private System.Windows.Forms.RadioButton radioButton1; + private System.Windows.Forms.RadioButton radioButton0; + private System.Windows.Forms.Button stopButton; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.RadioButton radioButton24; + private System.Windows.Forms.RadioButton radioButton23; + private System.Windows.Forms.RadioButton radioButton22; + private System.Windows.Forms.RadioButton radioButton21; + private System.Windows.Forms.Button configureComponent2Button; + private System.Windows.Forms.TextBox component2NameTextBox; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.ComboBox component2ClassNameComboBox; + private System.Windows.Forms.GroupBox groupBox4; + private System.Windows.Forms.GroupBox groupBox5; + private System.Windows.Forms.Button configureComponent3Button; + private System.Windows.Forms.TextBox component3NameTextBox; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.ComboBox component3ClassNameComboBox; + private System.Windows.Forms.RadioButton radioButton34; + private System.Windows.Forms.RadioButton radioButton33; + private System.Windows.Forms.RadioButton radioButton32; + private System.Windows.Forms.RadioButton radioButton31; + } +} + diff --git a/TBF_V2/Sources/TBF/DeviceTest/DeviceTestDlg.cs b/TBF_V2/Sources/TBF/DeviceTest/DeviceTestDlg.cs new file mode 100644 index 00000000..57be4d3f --- /dev/null +++ b/TBF_V2/Sources/TBF/DeviceTest/DeviceTestDlg.cs @@ -0,0 +1,835 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Threading; +using System.Windows.Forms; +using TBF.BenchControl; +using TBF.BenchControl.Generic; +using TBF.BenchControl.GenericDevices; +using System.Xml.Serialization; + + +namespace DeviceTest +{ + public partial class DeviceTestDlg : Form + { + IList compClasses; + + IComponentFactory parentFactory; + IComponentFactory component1Factory; + IComponentFactory component2Factory; + IComponentFactory component3Factory; + + IComponentCfg parentCfg; + IComponentCfg component1Cfg; + IComponentCfg component2Cfg; + IComponentCfg component3Cfg; + + static IList tbfDevices; + static IList tbfComponents; + static TBF.BenchControl.Generic.IComponent tbfComponent1forOp; + static TBF.BenchControl.Generic.IComponent tbfComponent2forOp; + static TBF.BenchControl.Generic.IComponent tbfComponent3forOp; + + static Thread workerThread; + static bool workerThreadRunning; + + + static int activeOperationId; + + static IOperation operation1; + static IOperation operation2; + static IOperation operation3; + static IOperation operation4; + + static IOperation operation21; + static IOperation operation22; + static IOperation operation23; + static IOperation operation24; + + static IOperation operation31; + static IOperation operation32; + static IOperation operation33; + static IOperation operation34; + + + static TBF.Boxes.FloatBox floatBox; + static Event evnt; + + + static DeviceTestDlg() + { + floatBox = new TBF.Boxes.FloatBox(); + floatBox.Format = "F2"; + } + + public DeviceTestDlg() + { + InitializeComponent(); + radioButton0.Checked = true; + stopButton.Enabled = false; + + compClasses = new List(); + foreach (var componentFactory in TbfComponents.Factories) + { + compClasses.Add(componentFactory.ClassName); + } + + tbfComponents = new List(); + tbfDevices = new List(); + } + + private void DeviceTestDlg_Load(object sender, EventArgs e) + { + + foreach (var clName in compClasses) + { + parentClassNameComboBox.Items.Add(clName); + component1ClassNameComboBox.Items.Add(clName); + component2ClassNameComboBox.Items.Add(clName); + component3ClassNameComboBox.Items.Add(clName); + } + + try + { + if (!string.IsNullOrEmpty(Program.LocalSettings.ParentClassName) && + !string.IsNullOrEmpty(Program.LocalSettings.ParentName) && + !string.IsNullOrEmpty(Program.LocalSettings.ParentSettings)) + { + FactoryFromClassName(Program.LocalSettings.ParentClassName, ref parentFactory); + + using (var reader = new StringReader(Program.LocalSettings.ParentSettings)) + { + IComponentCfg config = (IComponentCfg)(new XmlSerializer(parentFactory.DefaultConfig().GetType())).Deserialize(reader); + config.Name = Program.LocalSettings.ParentName; + config.ParentName = string.Empty; + config.ItemNr = 0; + config.DebugLevel = Config.Entities.DebugMode.Normal; + config.LogLevel = Config.Entities.LogLevel.Debug; + config.Corrections = null; + config.Factory = parentFactory; + parentCfg = config; + } + + parentClassNameComboBox.Text = Program.LocalSettings.ParentClassName; + parentNameTextBox.Text = Program.LocalSettings.ParentName; + } + } + catch + { + parentFactory = null; + parentCfg = null; + parentClassNameComboBox.Text = string.Empty; + parentNameTextBox.Text = string.Empty; + } + + try + { + if (!string.IsNullOrEmpty(Program.LocalSettings.ComponentClassName) && + !string.IsNullOrEmpty(Program.LocalSettings.ComponentName) && + !string.IsNullOrEmpty(Program.LocalSettings.ComponentSettings)) + { + FactoryFromClassName(Program.LocalSettings.ComponentClassName, ref component1Factory); + + using (var reader = new StringReader(Program.LocalSettings.ComponentSettings)) + { + IComponentCfg config = (IComponentCfg)(new XmlSerializer(component1Factory.DefaultConfig().GetType())).Deserialize(reader); + config.Name = Program.LocalSettings.ComponentName; + config.ParentName = string.IsNullOrEmpty(Program.LocalSettings.ComponentParentName) ? string.Empty : Program.LocalSettings.ComponentParentName; + config.ItemNr = 1; + config.DebugLevel = Config.Entities.DebugMode.Normal; + config.LogLevel = Config.Entities.LogLevel.Debug; + config.Corrections = null; + config.Factory = component1Factory; + component1Cfg = config; + } + + component1ClassNameComboBox.Text = Program.LocalSettings.ComponentClassName; + componentNameTextBox.Text = Program.LocalSettings.ComponentName; + + UpdateOperations(component1ClassNameComboBox.Text); + } + } + catch + { + component1Factory = null; + component1Cfg = null; + component1ClassNameComboBox.Text = string.Empty; + componentNameTextBox.Text = string.Empty; + } + + try + { + if (!string.IsNullOrEmpty(Program.LocalSettings.Component2ClassName) && + !string.IsNullOrEmpty(Program.LocalSettings.Component2Name) && + !string.IsNullOrEmpty(Program.LocalSettings.Component2Settings)) + { + FactoryFromClassName(Program.LocalSettings.Component2ClassName, ref component2Factory); + + using (var reader = new StringReader(Program.LocalSettings.Component2Settings)) + { + IComponentCfg config = (IComponentCfg)(new XmlSerializer(component2Factory.DefaultConfig().GetType())).Deserialize(reader); + config.Name = Program.LocalSettings.Component2Name; + config.ParentName = string.IsNullOrEmpty(Program.LocalSettings.Component2ParentName) ? string.Empty : Program.LocalSettings.Component2ParentName; + config.ItemNr = 2; + config.DebugLevel = Config.Entities.DebugMode.Normal; + config.LogLevel = Config.Entities.LogLevel.Debug; + config.Corrections = null; + config.Factory = component2Factory; + component2Cfg = config; + } + + component2ClassNameComboBox.Text = Program.LocalSettings.Component2ClassName; + component2NameTextBox.Text = Program.LocalSettings.Component2Name; + + UpdateOperations2(component2ClassNameComboBox.Text); + } + } + catch + { + component2Factory = null; + component2Cfg = null; + component2ClassNameComboBox.Text = string.Empty; + component2NameTextBox.Text = string.Empty; + } + + try + { + if (!string.IsNullOrEmpty(Program.LocalSettings.Component3ClassName) && + !string.IsNullOrEmpty(Program.LocalSettings.Component3Name) && + !string.IsNullOrEmpty(Program.LocalSettings.Component3Settings)) + { + FactoryFromClassName(Program.LocalSettings.Component3ClassName, ref component3Factory); + + using (var reader = new StringReader(Program.LocalSettings.Component3Settings)) + { + IComponentCfg config = (IComponentCfg)(new XmlSerializer(component3Factory.DefaultConfig().GetType())).Deserialize(reader); + config.Name = Program.LocalSettings.Component3Name; + config.ParentName = string.IsNullOrEmpty(Program.LocalSettings.Component3ParentName) ? string.Empty : Program.LocalSettings.Component3ParentName; + config.ItemNr = 3; + config.DebugLevel = Config.Entities.DebugMode.Normal; + config.LogLevel = Config.Entities.LogLevel.Debug; + config.Corrections = null; + config.Factory = component3Factory; + component3Cfg = config; + } + + component3ClassNameComboBox.Text = Program.LocalSettings.Component3ClassName; + component3NameTextBox.Text = Program.LocalSettings.Component3Name; + + UpdateOperations3(component3ClassNameComboBox.Text); + } + } + catch + { + component3Factory = null; + component3Cfg = null; + component3ClassNameComboBox.Text = string.Empty; + component3NameTextBox.Text = string.Empty; + } + } + + void SaveSettings() + { + Program.LocalSettings.ParentClassName = parentClassNameComboBox.Text; + Program.LocalSettings.ParentName = parentNameTextBox.Text; + Program.LocalSettings.ParentSettings = (parentCfg != null) ? parentCfg.CreateDbEntity().Parameters : string.Empty; + + Program.LocalSettings.ComponentClassName = component1ClassNameComboBox.Text; + Program.LocalSettings.ComponentName = componentNameTextBox.Text; + Program.LocalSettings.ComponentParentName = (component1Cfg != null) ? component1Cfg.ParentName : string.Empty; + Program.LocalSettings.ComponentSettings = (component1Cfg != null) ? component1Cfg.CreateDbEntity().Parameters : string.Empty; + + Program.LocalSettings.Component2ClassName = component2ClassNameComboBox.Text; + Program.LocalSettings.Component2Name = component2NameTextBox.Text; + Program.LocalSettings.Component2ParentName = (component2Cfg != null) ? component2Cfg.ParentName : string.Empty; + Program.LocalSettings.Component2Settings = (component2Cfg != null) ? component2Cfg.CreateDbEntity().Parameters : string.Empty; + + Program.LocalSettings.Component3ClassName = component3ClassNameComboBox.Text; + Program.LocalSettings.Component3Name = component3NameTextBox.Text; + Program.LocalSettings.Component3ParentName = (component3Cfg != null) ? component3Cfg.ParentName : string.Empty; + Program.LocalSettings.Component3Settings = (component3Cfg != null) ? component3Cfg.CreateDbEntity().Parameters : string.Empty; + + Program.LocalSettings.Save(); + } + + + void UpdateOperations(string className) + { + if (className == "Keithley.TempMeter") radioButton1.Text = "ReadPressureOp"; + else if (className == "Network.Camera.CLP1611") radioButton1.Text = "Livestream"; + else if (className == "Network.Camera.Roi") radioButton1.Text = "RoiDetection"; + else if (className == "Modbus.Easytherm") + { + radioButton1.Text = "SetTemperature(10)"; + radioButton2.Text = "SetTemperature(20)"; + } + else if (className == "Modbus.TankSelector") + { + radioButton1.Text = "SelectTank 1"; + radioButton2.Text = "SelectTank 2"; + radioButton3.Text = "SelectTank 3"; + radioButton4.Text = "SelectTank -"; + } + else radioButton1.Text = "spare"; + } + /// + void UpdateOperations2(string className) + { + if (className == "Keithley.TempMeter") radioButton21.Text = "ReadPressureOp"; + else if (className == "Network.Camera.CLP1611") radioButton21.Text = "Livestream"; + else if (className == "Network.Camera.Roi") radioButton21.Text = "RoiDetection"; + else if (className == "Modbus.Easytherm") + { + radioButton21.Text = "SetTemperature(10)"; + radioButton22.Text = "SetTemperature(20)"; + } + else if (className == "Modbus.TankSelector") + { + radioButton21.Text = "SelectTank 1"; + radioButton22.Text = "SelectTank 2"; + radioButton23.Text = "SelectTank 3"; + radioButton24.Text = "SelectTank -"; + } + else radioButton21.Text = "spare"; + } + /// + void UpdateOperations3(string className) + { + if (className == "Keithley.TempMeter") radioButton31.Text = "ReadPressureOp"; + else if (className == "Network.Camera.CLP1611") radioButton31.Text = "Livestream"; + else if (className == "Network.Camera.Roi") radioButton31.Text = "RoiDetection"; + else if (className == "Modbus.Easytherm") + { + radioButton31.Text = "SetTemperature(10)"; + radioButton32.Text = "SetTemperature(20)"; + } + else if (className == "Modbus.TankSelector") + { + radioButton31.Text = "SelectTank 1"; + radioButton32.Text = "SelectTank 2"; + radioButton33.Text = "SelectTank 3"; + radioButton34.Text = "SelectTank -"; + } + else radioButton31.Text = "spare"; + } + + + int GetActiveOperationId() + { + if (radioButton1.Checked) { return 1; } + else if (radioButton2.Checked) { return 2; } + else if (radioButton3.Checked) { return 3; } + else if (radioButton4.Checked) { return 4; } + else if (radioButton21.Checked) { return 21; } + else if (radioButton22.Checked) { return 22; } + else if (radioButton23.Checked) { return 23; } + else if (radioButton24.Checked) { return 24; } + else if (radioButton31.Checked) { return 31; } + else if (radioButton32.Checked) { return 32; } + else if (radioButton33.Checked) { return 33; } + else if (radioButton34.Checked) { return 34; } + else return 0; /// stopOperationRadioButton.Checked + } + + + private void radioButton0_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); } + private void radioButton1_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); } + private void radioButton2_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); } + private void radioButton3_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); } + private void radioButton4_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); } + /// + private void radioButton21_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); } + private void radioButton22_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); } + private void radioButton23_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); } + private void radioButton24_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); } + /// + private void radioButton31_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); } + private void radioButton32_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); } + private void radioButton33_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); } + private void radioButton34_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); } + + + /// + /// Updates component factory + /// + /// Component class name + /// Reference to a factory + /// true when factory changed + bool FactoryFromClassName(string className, ref IComponentFactory factory) + { + foreach (var fac in TbfComponents.Factories) + { + if (className == fac.ClassName) + { + if (factory != fac) + { + factory = fac; + return true; + } + else + { + return false; + } + } + } + + if (factory != null) + { + factory = null; + return true; + } + + return false; + } + + private void configureParentButton_Click(object sender, EventArgs e) + { + bool factoryChanged = FactoryFromClassName(parentClassNameComboBox.Text, ref parentFactory); + if (parentFactory == null) + { + MessageBox.Show("Invalid parent class", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + return; + } + + if (factoryChanged || parentCfg == null) + { + parentCfg = parentFactory.DefaultConfig(); + } + IComponentCfgCtrl cfgControl = parentCfg.GetControl(); + cfgControl.Config = parentCfg; + cfgControl.Config.ItemNr = 0; + + TBF.ComponentParametersDlg cfgForm = new TBF.ComponentParametersDlg(); + cfgForm.TbfComponents = new List(); + + cfgForm.ComponentCfgCtrl = cfgControl; + cfgForm.UnlockAfterStart = true; + DialogResult dr = cfgForm.ShowDialog(); + if (dr != DialogResult.OK) return; + + parentNameTextBox.Text = parentCfg.Name; + } + + + private void configureComponent1Button_Click(object sender, EventArgs e) + { + bool factoryChanged = FactoryFromClassName(component1ClassNameComboBox.Text, ref component1Factory); + if (component1Factory == null) + { + MessageBox.Show("Invalid component class", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + return; + } + + if (factoryChanged || component1Cfg == null) + { + component1Cfg = component1Factory.DefaultConfig(); + } + IComponentCfgCtrl cfgControl = component1Cfg.GetControl(); + cfgControl.Config = component1Cfg; + cfgControl.Config.ItemNr = 1; + + TBF.ComponentParametersDlg cfgForm = new TBF.ComponentParametersDlg(); + /// + IList compEntities = new List(); + if (parentFactory != null && parentCfg != null) compEntities.Add(parentCfg.CreateDbEntity()); + cfgForm.TbfComponents = compEntities; + + cfgForm.ComponentCfgCtrl = cfgControl; + cfgForm.UnlockAfterStart = true; + DialogResult dr = cfgForm.ShowDialog(); + if (dr != DialogResult.OK) return; + + componentNameTextBox.Text = component1Cfg.Name; + + UpdateOperations(component1ClassNameComboBox.Text); + } + + + private void configureComponent2Button_Click(object sender, EventArgs e) + { + bool factoryChanged = FactoryFromClassName(component2ClassNameComboBox.Text, ref component2Factory); + if (component2Factory == null) + { + MessageBox.Show("Invalid component class", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + return; + } + + if (factoryChanged || component2Cfg == null) + { + component2Cfg = component2Factory.DefaultConfig(); + } + IComponentCfgCtrl cfgControl = component2Cfg.GetControl(); + cfgControl.Config = component2Cfg; + cfgControl.Config.ItemNr = 1; + + TBF.ComponentParametersDlg cfgForm = new TBF.ComponentParametersDlg(); + /// + IList compEntities = new List(); + if (parentFactory != null && parentCfg != null) compEntities.Add(parentCfg.CreateDbEntity()); + if (component1Factory != null && component1Cfg != null) compEntities.Add(component1Cfg.CreateDbEntity()); + cfgForm.TbfComponents = compEntities; + + cfgForm.ComponentCfgCtrl = cfgControl; + cfgForm.UnlockAfterStart = true; + DialogResult dr = cfgForm.ShowDialog(); + if (dr != DialogResult.OK) return; + + component2NameTextBox.Text = component2Cfg.Name; + + UpdateOperations2(component2ClassNameComboBox.Text); + } + + + private void configureComponent3Button_Click(object sender, EventArgs e) + { + bool factoryChanged = FactoryFromClassName(component3ClassNameComboBox.Text, ref component3Factory); + if (component3Factory == null) + { + MessageBox.Show("Invalid component class", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + return; + } + + if (factoryChanged || component3Cfg == null) + { + component3Cfg = component3Factory.DefaultConfig(); + } + IComponentCfgCtrl cfgControl = component3Cfg.GetControl(); + cfgControl.Config = component3Cfg; + cfgControl.Config.ItemNr = 1; + + TBF.ComponentParametersDlg cfgForm = new TBF.ComponentParametersDlg(); + /// + IList compEntities = new List(); + if (parentFactory != null && parentCfg != null) compEntities.Add(parentCfg.CreateDbEntity()); + if (component1Factory != null && component1Cfg != null) compEntities.Add(component1Cfg.CreateDbEntity()); + if (component2Factory != null && component2Cfg != null) compEntities.Add(component2Cfg.CreateDbEntity()); + cfgForm.TbfComponents = compEntities; + + cfgForm.ComponentCfgCtrl = cfgControl; + cfgForm.UnlockAfterStart = true; + DialogResult dr = cfgForm.ShowDialog(); + if (dr != DialogResult.OK) return; + + component3NameTextBox.Text = component3Cfg.Name; + + UpdateOperations3(component3ClassNameComboBox.Text); + } + + + private void startButton_Click(object sender, EventArgs e) + { + tbfComponents.Clear(); + tbfDevices.Clear(); + tbfComponent1forOp = null; + operation1 = null; + operation2 = null; + operation3 = null; + operation4 = null; + tbfComponent2forOp = null; + operation21 = null; + operation22 = null; + operation23 = null; + operation24 = null; + tbfComponent3forOp = null; + operation31 = null; + operation32 = null; + operation33 = null; + operation34 = null; + workerThreadRunning = false; + + string initializedDeviceName = "none"; + try + { + if (parentFactory != null && parentCfg != null) + { + TBF.BenchControl.Generic.IComponent component = parentFactory.GetComponent(parentCfg, tbfComponents); + tbfComponents.Add(component); + IDevice dev = component as IDevice; + if (dev != null) + { + initializedDeviceName = dev.Name; + dev.Initialize(); + tbfDevices.Add(dev); + } + } + if (component1Factory != null && component1Cfg != null) + { + TBF.BenchControl.Generic.IComponent component = component1Factory.GetComponent(component1Cfg, tbfComponents); + tbfComponents.Add(component); + tbfComponent1forOp = component; + IDevice dev = component as IDevice; + if (dev != null) + { + initializedDeviceName = dev.Name; + dev.Initialize(); + tbfDevices.Add(dev); + } + } + if (component2Factory != null && component2Cfg != null) + { + TBF.BenchControl.Generic.IComponent component2 = component2Factory.GetComponent(component2Cfg, tbfComponents); + tbfComponents.Add(component2); + tbfComponent2forOp = component2; + IDevice dev = component2 as IDevice; + if (dev != null) + { + initializedDeviceName = dev.Name; + dev.Initialize(); + tbfDevices.Add(dev); + } + } + if (component3Factory != null && component3Cfg != null) + { + TBF.BenchControl.Generic.IComponent component3 = component3Factory.GetComponent(component3Cfg, tbfComponents); + tbfComponents.Add(component3); + tbfComponent3forOp = component3; + IDevice dev = component3 as IDevice; + if (dev != null) + { + initializedDeviceName = dev.Name; + dev.Initialize(); + tbfDevices.Add(dev); + } + } + + if (tbfComponents.Count == 0) throw new Exception("There are no components"); + + SaveSettings(); /// Save settings after successful initialization + + workerThread = new Thread(Worker); + workerThread.CurrentCulture = Thread.CurrentThread.CurrentCulture; + workerThread.CurrentUICulture = Thread.CurrentThread.CurrentUICulture; + workerThreadRunning = true; + workerThread.Start(); + + startButton.Enabled = false; + stopButton.Enabled = true; + configureComponent2Button.Enabled = false; + configureComponent1Button.Enabled = false; + configureParentButton.Enabled = false; + } + catch (Exception exc) + { + workerThreadRunning = false; + workerThread = null; + + MessageBox.Show(exc.Message, + string.Format("'{0}' initialization failed", initializedDeviceName), + MessageBoxButtons.OK, + MessageBoxIcon.Exclamation); + + foreach (var dev in tbfDevices) dev.StopDevice(); + tbfDevices.Clear(); + + startButton.Enabled = true; + stopButton.Enabled = false; + configureComponent2Button.Enabled = true; + configureComponent1Button.Enabled = true; + configureParentButton.Enabled = true; + } + } + + + static void Worker() + { + int activeOperationLocal = 0; + int previousOperation = 0; + + + if (tbfComponent1forOp is TBF.BenchControl.Modbus.PressureMeter.Meret.PressureMeter) + { + operation1 = (tbfComponent1forOp as TBF.BenchControl.Modbus.PressureMeter.Meret.PressureMeter).ReadPressureOp(ref floatBox); + } + else if (tbfComponent1forOp is TBF.BenchControl.Network.Camera.CLP1611.Camera) + { + operation1 = (tbfComponent1forOp as TBF.BenchControl.Network.Camera.CLP1611.Camera).LiveStreamOp(false); + operation2 = (tbfComponent1forOp as TBF.BenchControl.Network.Camera.CLP1611.Camera).LiveStreamOp(true); + } + else if (tbfComponent1forOp is TBF.BenchControl.Network.Camera.Roi.Roi) + { + operation1 = (tbfComponent1forOp as TBF.BenchControl.Network.Camera.Roi.Roi).RoiDetectionOp(); + } + else if (tbfComponent1forOp is TBF.BenchControl.Modbus.Easytherm.Easytherm) + { + operation1 = (tbfComponent1forOp as TBF.BenchControl.Modbus.Easytherm.Easytherm).SetTemperatureOp(10); + operation2 = (tbfComponent1forOp as TBF.BenchControl.Modbus.Easytherm.Easytherm).SetTemperatureOp(20); + } + else if (tbfComponent1forOp is TBF.BenchControl.Modbus.TankSelector.TankSelector) + { + //operation1 = (tbfComponent1forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(1); + //operation2 = (tbfComponent1forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(2); + //operation3 = (tbfComponent1forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(3); + //operation4 = (tbfComponent1forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(0); + } + + + if (tbfComponent2forOp is TBF.BenchControl.Modbus.PressureMeter.Meret.PressureMeter) + { + operation21 = (tbfComponent2forOp as TBF.BenchControl.Modbus.PressureMeter.Meret.PressureMeter).ReadPressureOp(ref floatBox); + } + else if (tbfComponent2forOp is TBF.BenchControl.Network.Camera.CLP1611.Camera) + { + operation21 = (tbfComponent2forOp as TBF.BenchControl.Network.Camera.CLP1611.Camera).LiveStreamOp(false); + operation22 = (tbfComponent2forOp as TBF.BenchControl.Network.Camera.CLP1611.Camera).LiveStreamOp(true); + } + else if (tbfComponent2forOp is TBF.BenchControl.Network.Camera.Roi.Roi) + { + operation21 = (tbfComponent2forOp as TBF.BenchControl.Network.Camera.Roi.Roi).RoiDetectionOp(); + } + else if (tbfComponent2forOp is TBF.BenchControl.Modbus.Easytherm.Easytherm) + { + operation21 = (tbfComponent1forOp as TBF.BenchControl.Modbus.Easytherm.Easytherm).SetTemperatureOp(10); + operation22 = (tbfComponent1forOp as TBF.BenchControl.Modbus.Easytherm.Easytherm).SetTemperatureOp(20); + } + else if (tbfComponent2forOp is TBF.BenchControl.Modbus.TankSelector.TankSelector) + { + //operation21 = (tbfComponent2forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(1); + //operation22 = (tbfComponent2forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(2); + //operation23 = (tbfComponent2forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(3); + //operation24 = (tbfComponent2forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(0); + } + + + if (tbfComponent3forOp is TBF.BenchControl.Modbus.PressureMeter.Meret.PressureMeter) + { + operation31 = (tbfComponent3forOp as TBF.BenchControl.Modbus.PressureMeter.Meret.PressureMeter).ReadPressureOp(ref floatBox); + } + else if (tbfComponent3forOp is TBF.BenchControl.Network.Camera.CLP1611.Camera) + { + operation31 = (tbfComponent3forOp as TBF.BenchControl.Network.Camera.CLP1611.Camera).LiveStreamOp(false); + operation33 = (tbfComponent3forOp as TBF.BenchControl.Network.Camera.CLP1611.Camera).LiveStreamOp(true); + } + else if (tbfComponent3forOp is TBF.BenchControl.Network.Camera.Roi.Roi) + { + operation31 = (tbfComponent3forOp as TBF.BenchControl.Network.Camera.Roi.Roi).RoiDetectionOp(); + } + else if (tbfComponent3forOp is TBF.BenchControl.Modbus.Easytherm.Easytherm) + { + operation31 = (tbfComponent1forOp as TBF.BenchControl.Modbus.Easytherm.Easytherm).SetTemperatureOp(10); + operation32 = (tbfComponent1forOp as TBF.BenchControl.Modbus.Easytherm.Easytherm).SetTemperatureOp(20); + } + else if (tbfComponent3forOp is TBF.BenchControl.Modbus.TankSelector.TankSelector) + { + //operation31 = (tbfComponent3forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(1); + //operation32 = (tbfComponent3forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(2); + //operation33 = (tbfComponent3forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(3); + //operation34 = (tbfComponent3forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(0); + } + + + while (workerThreadRunning) + { + Thread.Sleep(1000); + + if (workerThreadRunning) + { + foreach (var d in tbfDevices) d.RunDeviceBefore(); + + if (tbfComponent1forOp != null) + { + previousOperation = activeOperationLocal; + activeOperationLocal = activeOperationId; + if (previousOperation == 0 && activeOperationLocal != 0) + { + switch (activeOperationLocal) + { + case 1: if (operation1 != null) operation1.Start(); Debug.WriteLine("op1.Start()"); break; + case 2: if (operation2 != null) operation2.Start(); Debug.WriteLine("op2.Start()"); break; + case 3: if (operation3 != null) operation3.Start(); Debug.WriteLine("op3.Start()"); break; + case 4: if (operation4 != null) operation4.Start(); Debug.WriteLine("op4.Start()"); break; + case 21: if (operation21 != null) operation21.Start(); Debug.WriteLine("op21.Start()"); break; + case 22: if (operation22 != null) operation22.Start(); Debug.WriteLine("op22.Start()"); break; + case 23: if (operation23 != null) operation23.Start(); Debug.WriteLine("op23.Start()"); break; + case 24: if (operation24 != null) operation24.Start(); Debug.WriteLine("op24.Start()"); break; + case 31: if (operation31 != null) operation31.Start(); Debug.WriteLine("op31.Start()"); break; + case 32: if (operation32 != null) operation32.Start(); Debug.WriteLine("op32.Start()"); break; + case 33: if (operation33 != null) operation33.Start(); Debug.WriteLine("op33.Start()"); break; + case 34: if (operation34 != null) operation34.Start(); Debug.WriteLine("op34.Start()"); break; + } + } + else if (previousOperation == activeOperationLocal && activeOperationLocal != 0) + { + switch (activeOperationLocal) + { + case 1: if (operation1 != null) evnt = operation1.Run(); Debug.WriteLine("op1.Run() -> {0}", evnt); break; + case 2: if (operation2 != null) evnt = operation2.Run(); Debug.WriteLine("op2.Run() -> {0}", evnt); break; + case 3: if (operation3 != null) evnt = operation3.Run(); Debug.WriteLine("op3.Run() -> {0}", evnt); break; + case 4: if (operation4 != null) evnt = operation4.Run(); Debug.WriteLine("op4.Run() -> {0}", evnt); break; + case 21: if (operation21 != null) evnt = operation21.Run(); Debug.WriteLine("op21.Run() -> {0}", evnt); break; + case 22: if (operation22 != null) evnt = operation22.Run(); Debug.WriteLine("op22.Run() -> {0}", evnt); break; + case 23: if (operation23 != null) evnt = operation23.Run(); Debug.WriteLine("op23.Run() -> {0}", evnt); break; + case 24: if (operation24 != null) evnt = operation24.Run(); Debug.WriteLine("op24.Run() -> {0}", evnt); break; + case 31: if (operation31 != null) evnt = operation31.Run(); Debug.WriteLine("op31.Run() -> {0}", evnt); break; + case 32: if (operation32 != null) evnt = operation32.Run(); Debug.WriteLine("op32.Run() -> {0}", evnt); break; + case 33: if (operation33 != null) evnt = operation33.Run(); Debug.WriteLine("op33.Run() -> {0}", evnt); break; + case 34: if (operation34 != null) evnt = operation34.Run(); Debug.WriteLine("op34.Run() -> {0}", evnt); break; + default: evnt = Event.None; break; + } + } + else if (previousOperation != 0 && activeOperationLocal == 0) + { + switch (previousOperation) + { + case 1: if (operation1 != null) operation1.Stop(); Debug.WriteLine("op1.Stop()"); break; + case 2: if (operation2 != null) operation2.Stop(); Debug.WriteLine("op2.Stop()"); break; + case 3: if (operation3 != null) operation3.Stop(); Debug.WriteLine("op3.Stop()"); break; + case 4: if (operation4 != null) operation4.Stop(); Debug.WriteLine("op4.Stop()"); break; + case 21: if (operation21 != null) operation21.Stop(); Debug.WriteLine("op21.Stop()"); break; + case 22: if (operation22 != null) operation22.Stop(); Debug.WriteLine("op22.Stop()"); break; + case 23: if (operation23 != null) operation23.Stop(); Debug.WriteLine("op23.Stop()"); break; + case 24: if (operation24 != null) operation24.Stop(); Debug.WriteLine("op24.Stop()"); break; + case 31: if (operation31 != null) operation31.Stop(); Debug.WriteLine("op31.Stop()"); break; + case 32: if (operation32 != null) operation32.Stop(); Debug.WriteLine("op32.Stop()"); break; + case 33: if (operation33 != null) operation33.Stop(); Debug.WriteLine("op33.Stop()"); break; + case 34: if (operation34 != null) operation34.Stop(); Debug.WriteLine("op34.Stop()"); break; + } + } + } + + foreach (var d in tbfDevices) d.RunDeviceAfter(); + } + } + + foreach (var d in tbfDevices) d.StopDevice(); + } + + private void stopButton_Click(object sender, EventArgs e) + { + Cursor = Cursors.WaitCursor; + + workerThreadRunning = false; + workerThread.Join(5000); + workerThread = null; + + Cursor = Cursors.Default; + + startButton.Enabled = true; + stopButton.Enabled = false; + configureParentButton.Enabled = true; + configureComponent1Button.Enabled = true; + configureComponent2Button.Enabled = true; + configureComponent3Button.Enabled = true; + } + + private void DeviceTestDlg_FormClosing(object sender, FormClosingEventArgs e) + { + Cursor = Cursors.WaitCursor; + + if (workerThread != null) + { + workerThreadRunning = false; + workerThread.Join(3000); + workerThread = null; + } + + Cursor = Cursors.Default; + + SaveSettings(); + + Cursor = Cursors.Default; + } + } +} diff --git a/TBF_V2/Sources/TBF/DeviceTest/DeviceTestDlg.resx b/TBF_V2/Sources/TBF/DeviceTest/DeviceTestDlg.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/DeviceTest/DeviceTestDlg.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/DeviceTest/LocalSettings.cs b/TBF_V2/Sources/TBF/DeviceTest/LocalSettings.cs new file mode 100644 index 00000000..08bfaef9 --- /dev/null +++ b/TBF_V2/Sources/TBF/DeviceTest/LocalSettings.cs @@ -0,0 +1,126 @@ +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; + +namespace DeviceTest +{ + /// + /// Class to be serialized to an XML file... + /// + [XmlRootAttribute("DeviceTest")] + public class LocalSettings + { + public string ParentClassName; + public string ParentName; + public string ParentSettings; + + public string ComponentClassName; + public string ComponentName; + public string ComponentParentName; + public string ComponentSettings; + + public string Component2ClassName; + public string Component2Name; + public string Component2ParentName; + public string Component2Settings; + + public string Component3ClassName; + public string Component3Name; + public string Component3ParentName; + public string Component3Settings; + + public LocalSettings() + { + } + + /// + /// Load public fields of this class from the XML file. + /// + /// LocalSettings object or null when Load() fails + public static LocalSettings Load(string fileName) + { + try + { + using (TextReader reader = new StreamReader(fileName)) + { + LocalSettings ls = (new XmlSerializer(typeof(LocalSettings))).Deserialize(reader) as LocalSettings; + // Copy the settings just in case De-serialize() completes OK + return ls; + } + } + catch (Exception e) + { + string msg = e.Message; + return null; + } + } + + /// + /// Save public fields of this class to the XML file. + /// + public void Save() + { + try + { + using (TextWriter writer = new StreamWriter(Program.LocalSettingsFileName)) + { + (new XmlSerializer(typeof(LocalSettings))).Serialize(writer, this); + } + } + catch (Exception e) + { + string msg = e.Message; + } + } + + /// + /// Updates history stored in a string array by a new latest string. + /// + /// Last entered string + /// true = updated and saved + public bool UpdateHistory(string lastStrValue, ref string[] history) + { + const int MaxHistoryLen = 10; + + if (string.IsNullOrEmpty(lastStrValue)) return false; + + int currentHistoryLength = (history != null) ? history.Length : 0; + + int match = -1; + for (int i = 0; i < currentHistoryLength; i++) + { + if (history[i] == lastStrValue) + { + match = i; + break; + } + } + + if (match >= 0 || currentHistoryLength >= MaxHistoryLen) + { + /// History does not have to be extended (because of a match) or should not be extended (because of the lenght) + if (match < 0) match = currentHistoryLength - 1; + + for (int j = match; j > 0; j--) + { + history[j] = history[j - 1]; + } + history[0] = lastStrValue; + } + else + { + /// History will be extended, new item inserted at the beginning + string[] newHistory = new string[currentHistoryLength + 1]; + newHistory[0] = lastStrValue; + for (int j = 1; j <= currentHistoryLength; j++) + { + newHistory[j] = history[j - 1]; + } + history = newHistory; + } + Save(); + return true; + } + } +} diff --git a/TBF_V2/Sources/TBF/DeviceTest/Program.cs b/TBF_V2/Sources/TBF/DeviceTest/Program.cs new file mode 100644 index 00000000..5720fe88 --- /dev/null +++ b/TBF_V2/Sources/TBF/DeviceTest/Program.cs @@ -0,0 +1,111 @@ +/// +/// Copyright (c) 2016-2017 Sensus Metering Systems +/// +using System; +using System.IO; +using System.Windows.Forms; +using log4net; + +namespace DeviceTest +{ + static class Program + { + /// Program information + public static string Version; /// version string + public static DateTime BuildDateTime; /// date and time of program build + + /// log4net + static ILog log; + const string log4netConfigFName = "log4netConfig.xml"; + + /// Local settings + public static readonly string LocAppDataDir; + public static readonly string LocalSettingsFileName; + public static readonly string LocalSettingsBackupName; + public static LocalSettings LocalSettings; + + static Program() + { + /// Program version string + System.Reflection.Assembly thisAssembly = System.Reflection.Assembly.GetExecutingAssembly(); + Version ver = thisAssembly.GetName().Version; + Version = string.Format("{0}.{1}.{2}", ver.Major, ver.Minor, ver.Build); + BuildDateTime = new System.IO.FileInfo(thisAssembly.Location).LastWriteTime; + + /// Local program configuration directory including the trailing backslash + LocAppDataDir = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + + Path.DirectorySeparatorChar + "TestBenchFramework" + Path.DirectorySeparatorChar; + LocalSettingsFileName = LocAppDataDir + "DeviceTest.xml"; + LocalSettingsBackupName = LocAppDataDir + "DeviceTest.backup.xml"; + } + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + /// + /// Load the local settings + /// + Program.LocalSettings = LocalSettings.Load(Program.LocalSettingsFileName); + if (Program.LocalSettings == null) + { + /// Loading local seetings from regular config file failed. Use the backup + Program.LocalSettings = LocalSettings.Load(Program.LocalSettingsBackupName); + if (Program.LocalSettings == null) + { + MessageBox.Show("Na tomto počítači nebol tento program ani raz spustený.\r\nPoužijú sa základné nastavenia.", "Upozornenie", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + Program.LocalSettings = new LocalSettings(); + Directory.CreateDirectory(LocAppDataDir); + Program.LocalSettings.Save(); + } + else + { + LocalSettings.Save(); /// Save the settings to overwrite the wrong file + } + } + else + { + /// Loading local seetings from the regular config file was successful. Update the backup + File.Copy(Program.LocalSettingsFileName, Program.LocalSettingsBackupName, true); + } + + /// Configure and start logging + log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(LocAppDataDir + log4netConfigFName)); + log = LogManager.GetLogger(typeof(Program)); + log.Fatal("--------------------------------------------------------------------------------"); + log.Fatal(string.Format("TBF ver.{0}", Version)); + + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + + try + { + DeviceTestDlg dlg = new DeviceTestDlg(); + Application.Run(dlg); + } + catch (Exception exc) + { + LogException(log, "Exception in Application.Run(DeviceTestDlg)", exc); + MessageBox.Show("Program havaroval:" + + Environment.NewLine + Environment.NewLine + exc.Message + + ((exc.InnerException == null) ? string.Empty : (Environment.NewLine + exc.InnerException.Message)) + + Environment.NewLine + exc.StackTrace, + "Pozor!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + } + } + + static void LogException(ILog log, string description, Exception e) + { + log.FatalFormat("---------------( {0} )---------------", description); + log.FatalFormat("Message : {0}", e.Message); + if (e.InnerException != null) + { + log.FatalFormat("InnerMessage : {0}", e.InnerException.Message); + } + log.FatalFormat("StackTrace : {0}{1}", Environment.NewLine, e.StackTrace); + log.Fatal("--------------------------------------"); + } + } +} diff --git a/TBF_V2/Sources/TBF/DeviceTest/Properties/AssemblyInfo.cs b/TBF_V2/Sources/TBF/DeviceTest/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..6fcf0125 --- /dev/null +++ b/TBF_V2/Sources/TBF/DeviceTest/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("DeviceTest")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("DeviceTest")] +[assembly: AssemblyCopyright("Copyright © 2016")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("a3e8ad92-6617-4f5c-88ce-346d28120fb7")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/TBF_V2/Sources/TBF/DeviceTest/Properties/Resources.Designer.cs b/TBF_V2/Sources/TBF/DeviceTest/Properties/Resources.Designer.cs new file mode 100644 index 00000000..9e195144 --- /dev/null +++ b/TBF_V2/Sources/TBF/DeviceTest/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace DeviceTest.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DeviceTest.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/DeviceTest/Properties/Resources.resx b/TBF_V2/Sources/TBF/DeviceTest/Properties/Resources.resx new file mode 100644 index 00000000..af7dbebb --- /dev/null +++ b/TBF_V2/Sources/TBF/DeviceTest/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/DeviceTest/Properties/Settings.Designer.cs b/TBF_V2/Sources/TBF/DeviceTest/Properties/Settings.Designer.cs new file mode 100644 index 00000000..14cb028c --- /dev/null +++ b/TBF_V2/Sources/TBF/DeviceTest/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace DeviceTest.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/DeviceTest/Properties/Settings.settings b/TBF_V2/Sources/TBF/DeviceTest/Properties/Settings.settings new file mode 100644 index 00000000..39645652 --- /dev/null +++ b/TBF_V2/Sources/TBF/DeviceTest/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/TBF_V2/Sources/TBF/DeviceTest/app.config b/TBF_V2/Sources/TBF/DeviceTest/app.config new file mode 100644 index 00000000..e3656033 --- /dev/null +++ b/TBF_V2/Sources/TBF/DeviceTest/app.config @@ -0,0 +1,3 @@ + + + diff --git a/TBF_V2/Sources/TBF/Dirichlet.Numerics/Dirichlet.Numerics.csproj b/TBF_V2/Sources/TBF/Dirichlet.Numerics/Dirichlet.Numerics.csproj new file mode 100644 index 00000000..6e1ff9f2 --- /dev/null +++ b/TBF_V2/Sources/TBF/Dirichlet.Numerics/Dirichlet.Numerics.csproj @@ -0,0 +1,51 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {439D0878-C76E-452B-B17D-209A89E91D36} + Library + Properties + Dirichlet.Numerics + Dirichlet.Numerics + v4.0 + 512 + Client + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + diff --git a/TBF_V2/Sources/TBF/Dirichlet.Numerics/Int128.cs b/TBF_V2/Sources/TBF/Dirichlet.Numerics/Int128.cs new file mode 100644 index 00000000..8473c9cc --- /dev/null +++ b/TBF_V2/Sources/TBF/Dirichlet.Numerics/Int128.cs @@ -0,0 +1,1753 @@ +using System; +using System.Diagnostics; +using System.Globalization; +using System.Linq; +using System.Numerics; + +namespace Dirichlet.Numerics +{ + public struct Int128 : IFormattable, IComparable, IComparable, IEquatable + { + private UInt128 v; + + private static readonly Int128 minValue = (Int128)((UInt128)1 << 127); + private static readonly Int128 maxValue = (Int128)(((UInt128)1 << 127) - 1); + private static readonly Int128 zero = (Int128)0; + private static readonly Int128 one = (Int128)1; + private static readonly Int128 minusOne = (Int128)(-1); + + public static Int128 MinValue { get { return minValue; } } + public static Int128 MaxValue { get { return maxValue; } } + public static Int128 Zero { get { return zero; } } + public static Int128 One { get { return one; } } + public static Int128 MinusOne { get { return minusOne; } } + + public static Int128 Parse(string value) + { + Int128 c; + if (!TryParse(value, out c)) + throw new FormatException(); + return c; + } + + public static bool TryParse(string value, out Int128 result) + { + return TryParse(value, NumberStyles.Integer, NumberFormatInfo.CurrentInfo, out result); + } + + public static bool TryParse(string value, NumberStyles style, IFormatProvider format, out Int128 result) + { + BigInteger a; + if (!BigInteger.TryParse(value, style, format, out a)) + { + result = Int128.Zero; + return false; + } + UInt128.Create(out result.v, a); + return true; + } + + public Int128(long value) + { + UInt128.Create(out v, value); + } + + public Int128(ulong value) + { + UInt128.Create(out v, value); + } + + public Int128(double value) + { + UInt128.Create(out v, value); + } + + public Int128(decimal value) + { + UInt128.Create(out v, value); + } + + public Int128(BigInteger value) + { + UInt128.Create(out v, value); + } + + public ulong S0 { get { return v.S0; } } + public ulong S1 { get { return v.S1; } } + + public bool IsZero { get { return v.IsZero; } } + public bool IsOne { get { return v.IsOne; } } + public bool IsPowerOfTwo { get { return v.IsPowerOfTwo; } } + public bool IsEven { get { return v.IsEven; } } + public bool IsNegative { get { return v.S1 > long.MaxValue; } } + public int Sign { get { return IsNegative ? -1 : v.Sign; } } + + public override string ToString() + { + return ((BigInteger)this).ToString(); + } + + public string ToString(string format) + { + return ((BigInteger)this).ToString(format); + } + + public string ToString(IFormatProvider provider) + { + return ToString(null, provider); + } + + public string ToString(string format, IFormatProvider provider) + { + return ((BigInteger)this).ToString(format, provider); + } + + public static explicit operator Int128(double a) + { + Int128 c; + UInt128.Create(out c.v, a); + return c; + } + + public static implicit operator Int128(sbyte a) + { + Int128 c; + UInt128.Create(out c.v, a); + return c; + } + + public static implicit operator Int128(byte a) + { + Int128 c; + UInt128.Create(out c.v, a); + return c; + } + + public static implicit operator Int128(short a) + { + Int128 c; + UInt128.Create(out c.v, a); + return c; + } + + public static implicit operator Int128(ushort a) + { + Int128 c; + UInt128.Create(out c.v, a); + return c; + } + + public static implicit operator Int128(int a) + { + Int128 c; + UInt128.Create(out c.v, a); + return c; + } + + public static implicit operator Int128(uint a) + { + Int128 c; + UInt128.Create(out c.v, (ulong)a); + return c; + } + + public static implicit operator Int128(long a) + { + Int128 c; + UInt128.Create(out c.v, a); + return c; + } + + public static implicit operator Int128(ulong a) + { + Int128 c; + UInt128.Create(out c.v, a); + return c; + } + + public static explicit operator Int128(decimal a) + { + Int128 c; + UInt128.Create(out c.v, a); + return c; + } + + public static explicit operator Int128(UInt128 a) + { + Int128 c; + c.v = a; + return c; + } + + public static explicit operator UInt128(Int128 a) + { + return a.v; + } + + public static explicit operator Int128(BigInteger a) + { + Int128 c; + UInt128.Create(out c.v, a); + return c; + } + + public static explicit operator sbyte(Int128 a) + { + return (sbyte)a.v.S0; + } + + public static explicit operator byte(Int128 a) + { + return (byte)a.v.S0; + } + + public static explicit operator short(Int128 a) + { + return (short)a.v.S0; + } + + public static explicit operator ushort(Int128 a) + { + return (ushort)a.v.S0; + } + + public static explicit operator int(Int128 a) + { + return (int)a.v.S0; + } + + public static explicit operator uint(Int128 a) + { + return (uint)a.v.S0; + } + + public static explicit operator long(Int128 a) + { + return (long)a.v.S0; + } + + public static explicit operator ulong(Int128 a) + { + return a.v.S0; + } + + public static explicit operator decimal(Int128 a) + { + if (a.IsNegative) + { + UInt128 c; + UInt128.Negate(out c, ref a.v); + return -(decimal)c; + } + return (decimal)a.v; + } + + public static implicit operator BigInteger(Int128 a) + { + if (a.IsNegative) + { + UInt128 c; + UInt128.Negate(out c, ref a.v); + return -(BigInteger)c; + } + return (BigInteger)a.v; + } + + public static explicit operator float(Int128 a) + { + if (a.IsNegative) + { + UInt128 c; + UInt128.Negate(out c, ref a.v); + return -UInt128.ConvertToFloat(ref c); + } + return UInt128.ConvertToFloat(ref a.v); + } + + public static explicit operator double(Int128 a) + { + if (a.IsNegative) + { + UInt128 c; + UInt128.Negate(out c, ref a.v); + return -UInt128.ConvertToDouble(ref c); + } + return UInt128.ConvertToDouble(ref a.v); + } + + public static Int128 operator <<(Int128 a, int b) + { + Int128 c; + UInt128.LeftShift(out c.v, ref a.v, b); + return c; + } + + public static Int128 operator >>(Int128 a, int b) + { + Int128 c; + UInt128.ArithmeticRightShift(out c.v, ref a.v, b); + return c; + } + + public static Int128 operator &(Int128 a, Int128 b) + { + Int128 c; + UInt128.And(out c.v, ref a.v, ref b.v); + return c; + } + + public static int operator &(Int128 a, int b) + { + return (int)(a.v & (uint)b); + } + + public static int operator &(int a, Int128 b) + { + return (int)(b.v & (uint)a); + } + + public static long operator &(Int128 a, long b) + { + return (long)(a.v & (ulong)b); + } + + public static long operator &(long a, Int128 b) + { + return (long)(b.v & (ulong)a); + } + + public static Int128 operator |(Int128 a, Int128 b) + { + Int128 c; + UInt128.Or(out c.v, ref a.v, ref b.v); + return c; + } + + public static Int128 operator ^(Int128 a, Int128 b) + { + Int128 c; + UInt128.ExclusiveOr(out c.v, ref a.v, ref b.v); + return c; + } + + public static Int128 operator ~(Int128 a) + { + Int128 c; + UInt128.Not(out c.v, ref a.v); + return c; + } + + public static Int128 operator +(Int128 a, long b) + { + Int128 c; + if (b < 0) + UInt128.Subtract(out c.v, ref a.v, (ulong)(-b)); + else + UInt128.Add(out c.v, ref a.v, (ulong)b); + return c; + } + + public static Int128 operator +(long a, Int128 b) + { + Int128 c; + if (a < 0) + UInt128.Subtract(out c.v, ref b.v, (ulong)(-a)); + else + UInt128.Add(out c.v, ref b.v, (ulong)a); + return c; + } + + public static Int128 operator +(Int128 a, Int128 b) + { + Int128 c; + UInt128.Add(out c.v, ref a.v, ref b.v); + return c; + } + + public static Int128 operator ++(Int128 a) + { + Int128 c; + UInt128.Add(out c.v, ref a.v, 1); + return c; + } + + public static Int128 operator -(Int128 a, long b) + { + Int128 c; + if (b < 0) + UInt128.Add(out c.v, ref a.v, (ulong)(-b)); + else + UInt128.Subtract(out c.v, ref a.v, (ulong)b); + return c; + } + + public static Int128 operator -(Int128 a, Int128 b) + { + Int128 c; + UInt128.Subtract(out c.v, ref a.v, ref b.v); + return c; + } + + public static Int128 operator +(Int128 a) + { + return a; + } + + public static Int128 operator -(Int128 a) + { + Int128 c; + UInt128.Negate(out c.v, ref a.v); + return c; + } + + public static Int128 operator --(Int128 a) + { + Int128 c; + UInt128.Subtract(out c.v, ref a.v, 1); + return c; + } + + public static Int128 operator *(Int128 a, int b) + { + Int128 c; + Multiply(out c, ref a, b); + return c; + } + + public static Int128 operator *(int a, Int128 b) + { + Int128 c; + Multiply(out c, ref b, a); + return c; + } + + public static Int128 operator *(Int128 a, uint b) + { + Int128 c; + Multiply(out c, ref a, b); + return c; + } + + public static Int128 operator *(uint a, Int128 b) + { + Int128 c; + Multiply(out c, ref b, a); + return c; + } + + public static Int128 operator *(Int128 a, long b) + { + Int128 c; + Multiply(out c, ref a, b); + return c; + } + + public static Int128 operator *(long a, Int128 b) + { + Int128 c; + Multiply(out c, ref b, a); + return c; + } + + public static Int128 operator *(Int128 a, ulong b) + { + Int128 c; + Multiply(out c, ref a, b); + return c; + } + + public static Int128 operator *(ulong a, Int128 b) + { + Int128 c; + Multiply(out c, ref b, a); + return c; + } + + public static Int128 operator *(Int128 a, Int128 b) + { + Int128 c; + Multiply(out c, ref a, ref b); + return c; + } + + public static Int128 operator /(Int128 a, int b) + { + Int128 c; + Divide(out c, ref a, b); + return c; + } + + public static Int128 operator /(Int128 a, uint b) + { + Int128 c; + Divide(out c, ref a, b); + return c; + } + + public static Int128 operator /(Int128 a, long b) + { + Int128 c; + Divide(out c, ref a, b); + return c; + } + + public static Int128 operator /(Int128 a, ulong b) + { + Int128 c; + Divide(out c, ref a, b); + return c; + } + + public static Int128 operator /(Int128 a, Int128 b) + { + Int128 c; + Divide(out c, ref a, ref b); + return c; + } + + public static int operator %(Int128 a, int b) + { + return Remainder(ref a, b); + } + + public static int operator %(Int128 a, uint b) + { + return Remainder(ref a, b); + } + + public static long operator %(Int128 a, long b) + { + return Remainder(ref a, b); + } + + public static long operator %(Int128 a, ulong b) + { + return Remainder(ref a, b); + } + + public static Int128 operator %(Int128 a, Int128 b) + { + Int128 c; + Remainder(out c, ref a, ref b); + return c; + } + + public static bool operator <(Int128 a, UInt128 b) + { + return a.CompareTo(b) < 0; + } + + public static bool operator <(UInt128 a, Int128 b) + { + return b.CompareTo(a) > 0; + } + + public static bool operator <(Int128 a, Int128 b) + { + return LessThan(ref a.v, ref b.v); + } + + public static bool operator <(Int128 a, int b) + { + return LessThan(ref a.v, b); + } + + public static bool operator <(int a, Int128 b) + { + return LessThan(a, ref b.v); + } + + public static bool operator <(Int128 a, uint b) + { + return LessThan(ref a.v, b); + } + + public static bool operator <(uint a, Int128 b) + { + return LessThan(a, ref b.v); + } + + public static bool operator <(Int128 a, long b) + { + return LessThan(ref a.v, b); + } + + public static bool operator <(long a, Int128 b) + { + return LessThan(a, ref b.v); + } + + public static bool operator <(Int128 a, ulong b) + { + return LessThan(ref a.v, b); + } + + public static bool operator <(ulong a, Int128 b) + { + return LessThan(a, ref b.v); + } + + public static bool operator <=(Int128 a, UInt128 b) + { + return a.CompareTo(b) <= 0; + } + + public static bool operator <=(UInt128 a, Int128 b) + { + return b.CompareTo(a) >= 0; + } + + public static bool operator <=(Int128 a, Int128 b) + { + return !LessThan(ref b.v, ref a.v); + } + + public static bool operator <=(Int128 a, int b) + { + return !LessThan(b, ref a.v); + } + + public static bool operator <=(int a, Int128 b) + { + return !LessThan(ref b.v, a); + } + + public static bool operator <=(Int128 a, uint b) + { + return !LessThan(b, ref a.v); + } + + public static bool operator <=(uint a, Int128 b) + { + return !LessThan(ref b.v, a); + } + + public static bool operator <=(Int128 a, long b) + { + return !LessThan(b, ref a.v); + } + + public static bool operator <=(long a, Int128 b) + { + return !LessThan(ref b.v, a); + } + + public static bool operator <=(Int128 a, ulong b) + { + return !LessThan(b, ref a.v); + } + + public static bool operator <=(ulong a, Int128 b) + { + return !LessThan(ref b.v, a); + } + + public static bool operator >(Int128 a, UInt128 b) + { + return a.CompareTo(b) > 0; + } + + public static bool operator >(UInt128 a, Int128 b) + { + return b.CompareTo(a) < 0; + } + + public static bool operator >(Int128 a, Int128 b) + { + return LessThan(ref b.v, ref a.v); + } + + public static bool operator >(Int128 a, int b) + { + return LessThan(b, ref a.v); + } + + public static bool operator >(int a, Int128 b) + { + return LessThan(ref b.v, a); + } + + public static bool operator >(Int128 a, uint b) + { + return LessThan(b, ref a.v); + } + + public static bool operator >(uint a, Int128 b) + { + return LessThan(ref b.v, a); + } + + public static bool operator >(Int128 a, long b) + { + return LessThan(b, ref a.v); + } + + public static bool operator >(long a, Int128 b) + { + return LessThan(ref b.v, a); + } + + public static bool operator >(Int128 a, ulong b) + { + return LessThan(b, ref a.v); + } + + public static bool operator >(ulong a, Int128 b) + { + return LessThan(ref b.v, a); + } + + public static bool operator >=(Int128 a, UInt128 b) + { + return a.CompareTo(b) >= 0; + } + + public static bool operator >=(UInt128 a, Int128 b) + { + return b.CompareTo(a) <= 0; + } + + public static bool operator >=(Int128 a, Int128 b) + { + return !LessThan(ref a.v, ref b.v); + } + + public static bool operator >=(Int128 a, int b) + { + return !LessThan(ref a.v, b); + } + + public static bool operator >=(int a, Int128 b) + { + return !LessThan(a, ref b.v); + } + + public static bool operator >=(Int128 a, uint b) + { + return !LessThan(ref a.v, b); + } + + public static bool operator >=(uint a, Int128 b) + { + return !LessThan(a, ref b.v); + } + + public static bool operator >=(Int128 a, long b) + { + return !LessThan(ref a.v, b); + } + + public static bool operator >=(long a, Int128 b) + { + return !LessThan(a, ref b.v); + } + + public static bool operator >=(Int128 a, ulong b) + { + return !LessThan(ref a.v, b); + } + + public static bool operator >=(ulong a, Int128 b) + { + return !LessThan(a, ref b.v); + } + + public static bool operator ==(UInt128 a, Int128 b) + { + return b.Equals(a); + } + + public static bool operator ==(Int128 a, UInt128 b) + { + return a.Equals(b); + } + + public static bool operator ==(Int128 a, Int128 b) + { + return a.v.Equals(b.v); + } + + public static bool operator ==(Int128 a, int b) + { + return a.Equals(b); + } + + public static bool operator ==(int a, Int128 b) + { + return b.Equals(a); + } + + public static bool operator ==(Int128 a, uint b) + { + return a.Equals(b); + } + + public static bool operator ==(uint a, Int128 b) + { + return b.Equals(a); + } + + public static bool operator ==(Int128 a, long b) + { + return a.Equals(b); + } + + public static bool operator ==(long a, Int128 b) + { + return b.Equals(a); + } + + public static bool operator ==(Int128 a, ulong b) + { + return a.Equals(b); + } + + public static bool operator ==(ulong a, Int128 b) + { + return b.Equals(a); + } + + public static bool operator !=(UInt128 a, Int128 b) + { + return !b.Equals(a); + } + + public static bool operator !=(Int128 a, UInt128 b) + { + return !a.Equals(b); + } + + public static bool operator !=(Int128 a, Int128 b) + { + return !a.v.Equals(b.v); + } + + public static bool operator !=(Int128 a, int b) + { + return !a.Equals(b); + } + + public static bool operator !=(int a, Int128 b) + { + return !b.Equals(a); + } + + public static bool operator !=(Int128 a, uint b) + { + return !a.Equals(b); + } + + public static bool operator !=(uint a, Int128 b) + { + return !b.Equals(a); + } + + public static bool operator !=(Int128 a, long b) + { + return !a.Equals(b); + } + + public static bool operator !=(long a, Int128 b) + { + return !b.Equals(a); + } + + public static bool operator !=(Int128 a, ulong b) + { + return !a.Equals(b); + } + + public static bool operator !=(ulong a, Int128 b) + { + return !b.Equals(a); + } + + public int CompareTo(UInt128 other) + { + if (IsNegative) + return -1; + return v.CompareTo(other); + } + + public int CompareTo(Int128 other) + { + return SignedCompare(ref v, other.S0, other.S1); + } + + public int CompareTo(int other) + { + return SignedCompare(ref v, (ulong)other, (ulong)(other >> 31)); + } + + public int CompareTo(uint other) + { + return SignedCompare(ref v, (ulong)other, 0); + } + + public int CompareTo(long other) + { + return SignedCompare(ref v, (ulong)other, (ulong)(other >> 63)); + } + + public int CompareTo(ulong other) + { + return SignedCompare(ref v, other, 0); + } + + public int CompareTo(object obj) + { + if (obj == null) + return 1; + if (!(obj is Int128)) + throw new ArgumentException(); + return CompareTo((Int128)obj); + } + + private static bool LessThan(ref UInt128 a, ref UInt128 b) + { + var as1 = (long)a.S1; + var bs1 = (long)b.S1; + if (as1 != bs1) + return as1 < bs1; + return a.S0 < b.S0; + } + + private static bool LessThan(ref UInt128 a, long b) + { + var as1 = (long)a.S1; + var bs1 = b >> 63; + if (as1 != bs1) + return as1 < bs1; + return a.S0 < (ulong)b; + } + + private static bool LessThan(long a, ref UInt128 b) + { + var as1 = a >> 63; + var bs1 = (long)b.S1; + if (as1 != bs1) + return as1 < bs1; + return (ulong)a < b.S0; + } + + private static bool LessThan(ref UInt128 a, ulong b) + { + var as1 = (long)a.S1; + if (as1 != 0) + return as1 < 0; + return a.S0 < b; + } + + private static bool LessThan(ulong a, ref UInt128 b) + { + var bs1 = (long)b.S1; + if (0 != bs1) + return 0 < bs1; + return a < b.S0; + } + + private static int SignedCompare(ref UInt128 a, ulong bs0, ulong bs1) + { + var as1 = a.S1; + if (as1 != bs1) + return ((long)as1).CompareTo((long)bs1); + return a.S0.CompareTo(bs0); + } + + public bool Equals(UInt128 other) + { + return !IsNegative && v.Equals(other); + } + + public bool Equals(Int128 other) + { + return v.Equals(other.v); + } + + public bool Equals(int other) + { + if (other < 0) + return v.S1 == ulong.MaxValue && v.S0 == (uint)other; + return v.S1 == 0 && v.S0 == (uint)other; + } + + public bool Equals(uint other) + { + return v.S1 == 0 && v.S0 == other; + } + + public bool Equals(long other) + { + if (other < 0) + return v.S1 == ulong.MaxValue && v.S0 == (ulong)other; + return v.S1 == 0 && v.S0 == (ulong)other; + } + + public bool Equals(ulong other) + { + return v.S1 == 0 && v.S0 == other; + } + + public override bool Equals(object obj) + { + if (!(obj is Int128)) + return false; + return Equals((Int128)obj); + } + + public override int GetHashCode() + { + return v.GetHashCode(); + } + + public static void Multiply(out Int128 c, ref Int128 a, int b) + { + if (a.IsNegative) + { + UInt128 aneg; + UInt128.Negate(out aneg, ref a.v); + if (b < 0) + UInt128.Multiply(out c.v, ref aneg, (uint)(-b)); + else + { + UInt128.Multiply(out c.v, ref aneg, (uint)b); + UInt128.Negate(ref c.v); + } + } + else + { + if (b < 0) + { + UInt128.Multiply(out c.v, ref a.v, (uint)(-b)); + UInt128.Negate(ref c.v); + } + else + UInt128.Multiply(out c.v, ref a.v, (uint)b); + } + Debug.Assert((BigInteger)c == (BigInteger)a * (BigInteger)b); + } + + public static void Multiply(out Int128 c, ref Int128 a, uint b) + { + if (a.IsNegative) + { + UInt128 aneg; + UInt128.Negate(out aneg, ref a.v); + UInt128.Multiply(out c.v, ref aneg, b); + UInt128.Negate(ref c.v); + } + else + UInt128.Multiply(out c.v, ref a.v, b); + Debug.Assert((BigInteger)c == (BigInteger)a * (BigInteger)b); + } + + public static void Multiply(out Int128 c, ref Int128 a, long b) + { + if (a.IsNegative) + { + UInt128 aneg; + UInt128.Negate(out aneg, ref a.v); + if (b < 0) + UInt128.Multiply(out c.v, ref aneg, (ulong)(-b)); + else + { + UInt128.Multiply(out c.v, ref aneg, (ulong)b); + UInt128.Negate(ref c.v); + } + } + else + { + if (b < 0) + { + UInt128.Multiply(out c.v, ref a.v, (ulong)(-b)); + UInt128.Negate(ref c.v); + } + else + UInt128.Multiply(out c.v, ref a.v, (ulong)b); + } + Debug.Assert((BigInteger)c == (BigInteger)a * (BigInteger)b); + } + + public static void Multiply(out Int128 c, ref Int128 a, ulong b) + { + if (a.IsNegative) + { + UInt128 aneg; + UInt128.Negate(out aneg, ref a.v); + UInt128.Multiply(out c.v, ref aneg, b); + UInt128.Negate(ref c.v); + } + else + UInt128.Multiply(out c.v, ref a.v, b); + Debug.Assert((BigInteger)c == (BigInteger)a * (BigInteger)b); + } + + public static void Multiply(out Int128 c, ref Int128 a, ref Int128 b) + { + if (a.IsNegative) + { + UInt128 aneg; + UInt128.Negate(out aneg, ref a.v); + if (b.IsNegative) + { + UInt128 bneg; + UInt128.Negate(out bneg, ref b.v); + UInt128.Multiply(out c.v, ref aneg, ref bneg); + } + else + { + UInt128.Multiply(out c.v, ref aneg, ref b.v); + UInt128.Negate(ref c.v); + } + } + else + { + if (b.IsNegative) + { + UInt128 bneg; + UInt128.Negate(out bneg, ref b.v); + UInt128.Multiply(out c.v, ref a.v, ref bneg); + UInt128.Negate(ref c.v); + } + else + UInt128.Multiply(out c.v, ref a.v, ref b.v); + } + Debug.Assert((BigInteger)c == (BigInteger)a * (BigInteger)b); + } + + public static void Divide(out Int128 c, ref Int128 a, int b) + { + if (a.IsNegative) + { + UInt128 aneg; + UInt128.Negate(out aneg, ref a.v); + if (b < 0) + UInt128.Multiply(out c.v, ref aneg, (uint)(-b)); + else + { + UInt128.Multiply(out c.v, ref aneg, (uint)b); + UInt128.Negate(ref c.v); + } + } + else + { + if (b < 0) + { + UInt128.Multiply(out c.v, ref a.v, (uint)(-b)); + UInt128.Negate(ref c.v); + } + else + UInt128.Multiply(out c.v, ref a.v, (uint)b); + } + Debug.Assert((BigInteger)c == (BigInteger)a / (BigInteger)b); + } + + public static void Divide(out Int128 c, ref Int128 a, uint b) + { + if (a.IsNegative) + { + UInt128 aneg; + UInt128.Negate(out aneg, ref a.v); + UInt128.Divide(out c.v, ref aneg, b); + UInt128.Negate(ref c.v); + } + else + UInt128.Divide(out c.v, ref a.v, b); + Debug.Assert((BigInteger)c == (BigInteger)a / (BigInteger)b); + } + + public static void Divide(out Int128 c, ref Int128 a, long b) + { + if (a.IsNegative) + { + UInt128 aneg; + UInt128.Negate(out aneg, ref a.v); + if (b < 0) + UInt128.Divide(out c.v, ref aneg, (ulong)(-b)); + else + { + UInt128.Divide(out c.v, ref aneg, (ulong)b); + UInt128.Negate(ref c.v); + } + } + else + { + if (b < 0) + { + UInt128.Divide(out c.v, ref a.v, (ulong)(-b)); + UInt128.Negate(ref c.v); + } + else + UInt128.Divide(out c.v, ref a.v, (ulong)b); + } + Debug.Assert((BigInteger)c == (BigInteger)a / (BigInteger)b); + } + + public static void Divide(out Int128 c, ref Int128 a, ulong b) + { + if (a.IsNegative) + { + UInt128 aneg; + UInt128.Negate(out aneg, ref a.v); + UInt128.Divide(out c.v, ref aneg, b); + UInt128.Negate(ref c.v); + } + else + UInt128.Divide(out c.v, ref a.v, b); + Debug.Assert((BigInteger)c == (BigInteger)a / (BigInteger)b); + } + + public static void Divide(out Int128 c, ref Int128 a, ref Int128 b) + { + if (a.IsNegative) + { + UInt128 aneg; + UInt128.Negate(out aneg, ref a.v); + if (b.IsNegative) + { + UInt128 bneg; + UInt128.Negate(out bneg, ref b.v); + UInt128.Divide(out c.v, ref aneg, ref bneg); + } + else + { + UInt128.Divide(out c.v, ref aneg, ref b.v); + UInt128.Negate(ref c.v); + } + } + else + { + if (b.IsNegative) + { + UInt128 bneg; + UInt128.Negate(out bneg, ref b.v); + UInt128.Divide(out c.v, ref a.v, ref bneg); + UInt128.Negate(ref c.v); + } + else + UInt128.Divide(out c.v, ref a.v, ref b.v); + } + Debug.Assert((BigInteger)c == (BigInteger)a / (BigInteger)b); + } + + public static int Remainder(ref Int128 a, int b) + { + if (a.IsNegative) + { + UInt128 aneg; + UInt128.Negate(out aneg, ref a.v); + if (b < 0) + return (int)UInt128.Remainder(ref aneg, (uint)(-b)); + else + return -(int)UInt128.Remainder(ref aneg, (uint)b); + } + else + { + if (b < 0) + return -(int)UInt128.Remainder(ref a.v, (uint)(-b)); + else + return (int)UInt128.Remainder(ref a.v, (uint)b); + } + } + + public static int Remainder(ref Int128 a, uint b) + { + if (a.IsNegative) + { + UInt128 aneg; + UInt128.Negate(out aneg, ref a.v); + return -(int)UInt128.Remainder(ref aneg, b); + } + else + return (int)UInt128.Remainder(ref a.v, b); + } + + public static long Remainder(ref Int128 a, long b) + { + if (a.IsNegative) + { + UInt128 aneg; + UInt128.Negate(out aneg, ref a.v); + if (b < 0) + return (long)UInt128.Remainder(ref aneg, (ulong)(-b)); + else + return -(long)UInt128.Remainder(ref aneg, (ulong)b); + } + else + { + if (b < 0) + return -(long)UInt128.Remainder(ref a.v, (ulong)(-b)); + else + return (long)UInt128.Remainder(ref a.v, (ulong)b); + } + } + + public static long Remainder(ref Int128 a, ulong b) + { + if (a.IsNegative) + { + UInt128 aneg; + UInt128.Negate(out aneg, ref a.v); + return -(long)UInt128.Remainder(ref aneg, b); + } + else + return (long)UInt128.Remainder(ref a.v, b); + } + + public static void Remainder(out Int128 c, ref Int128 a, ref Int128 b) + { + if (a.IsNegative) + { + UInt128 aneg; + UInt128.Negate(out aneg, ref a.v); + if (b.IsNegative) + { + UInt128 bneg; + UInt128.Negate(out bneg, ref b.v); + UInt128.Remainder(out c.v, ref aneg, ref bneg); + } + else + { + UInt128.Remainder(out c.v, ref aneg, ref b.v); + UInt128.Negate(ref c.v); + } + } + else + { + if (b.IsNegative) + { + UInt128 bneg; + UInt128.Negate(out bneg, ref b.v); + UInt128.Remainder(out c.v, ref a.v, ref bneg); + UInt128.Negate(ref c.v); + } + else + UInt128.Remainder(out c.v, ref a.v, ref b.v); + } + Debug.Assert((BigInteger)c == (BigInteger)a % (BigInteger)b); + } + + public static Int128 Abs(Int128 a) + { + if (!a.IsNegative) + return a; + Int128 c; + UInt128.Negate(out c.v, ref a.v); + return c; + } + + public static Int128 Square(long a) + { + if (a < 0) + a = -a; + Int128 c; + UInt128.Square(out c.v, (ulong)a); + return c; + } + + public static Int128 Square(Int128 a) + { + Int128 c; + if (a.IsNegative) + { + UInt128 aneg; + UInt128.Negate(out aneg, ref a.v); + UInt128.Square(out c.v, ref aneg); + } + else + UInt128.Square(out c.v, ref a.v); + return c; + } + + public static Int128 Cube(long a) + { + Int128 c; + if (a < 0) + { + UInt128.Cube(out c.v, (ulong)(-a)); + UInt128.Negate(ref c.v); + } + else + UInt128.Cube(out c.v, (ulong)a); + return c; + } + + public static Int128 Cube(Int128 a) + { + Int128 c; + if (a < 0) + { + UInt128 aneg; + UInt128.Negate(out aneg, ref a.v); + UInt128.Cube(out c.v, ref aneg); + UInt128.Negate(ref c.v); + } + else + UInt128.Cube(out c.v, ref a.v); + return c; + } + + public static void Add(ref Int128 a, long b) + { + if (b < 0) + UInt128.Subtract(ref a.v, (ulong)(-b)); + else + UInt128.Add(ref a.v, (ulong)b); + } + + public static void Add(ref Int128 a, ref Int128 b) + { + UInt128.Add(ref a.v, ref b.v); + } + + public static void Subtract(ref Int128 a, long b) + { + if (b < 0) + UInt128.Add(ref a.v, (ulong)(-b)); + else + UInt128.Subtract(ref a.v, (ulong)b); + } + + public static void Subtract(ref Int128 a, ref Int128 b) + { + UInt128.Subtract(ref a.v, ref b.v); + } + + public static void Add(ref Int128 a, Int128 b) + { + UInt128.Add(ref a.v, ref b.v); + } + + public static void Subtract(ref Int128 a, Int128 b) + { + UInt128.Subtract(ref a.v, ref b.v); + } + + public static void AddProduct(ref Int128 a, ref UInt128 b, int c) + { + UInt128 product; + if (c < 0) + { + UInt128.Multiply(out product, ref b, (uint)(-c)); + UInt128.Subtract(ref a.v, ref product); + } + else + { + UInt128.Multiply(out product, ref b, (uint)c); + UInt128.Add(ref a.v, ref product); + } + } + + public static void AddProduct(ref Int128 a, ref UInt128 b, long c) + { + UInt128 product; + if (c < 0) + { + UInt128.Multiply(out product, ref b, (ulong)(-c)); + UInt128.Subtract(ref a.v, ref product); + } + else + { + UInt128.Multiply(out product, ref b, (ulong)c); + UInt128.Add(ref a.v, ref product); + } + } + + public static void SubtractProduct(ref Int128 a, ref UInt128 b, int c) + { + UInt128 d; + if (c < 0) + { + UInt128.Multiply(out d, ref b, (uint)(-c)); + UInt128.Add(ref a.v, ref d); + } + else + { + UInt128.Multiply(out d, ref b, (uint)c); + UInt128.Subtract(ref a.v, ref d); + } + } + + public static void SubtractProduct(ref Int128 a, ref UInt128 b, long c) + { + UInt128 d; + if (c < 0) + { + UInt128.Multiply(out d, ref b, (ulong)(-c)); + UInt128.Add(ref a.v, ref d); + } + else + { + UInt128.Multiply(out d, ref b, (ulong)c); + UInt128.Subtract(ref a.v, ref d); + } + } + + public static void AddProduct(ref Int128 a, UInt128 b, int c) + { + AddProduct(ref a, ref b, c); + } + + public static void AddProduct(ref Int128 a, UInt128 b, long c) + { + AddProduct(ref a, ref b, c); + } + + public static void SubtractProduct(ref Int128 a, UInt128 b, int c) + { + SubtractProduct(ref a, ref b, c); + } + + public static void SubtractProduct(ref Int128 a, UInt128 b, long c) + { + SubtractProduct(ref a, ref b, c); + } + + public static void Pow(out Int128 result, ref Int128 value, int exponent) + { + if (exponent < 0) + throw new ArgumentException("exponent must not be negative"); + if (value.IsNegative) + { + UInt128 valueneg; + UInt128.Negate(out valueneg, ref value.v); + if ((exponent & 1) == 0) + UInt128.Pow(out result.v, ref valueneg, (uint)exponent); + else + { + UInt128.Pow(out result.v, ref valueneg, (uint)exponent); + UInt128.Negate(ref result.v); + } + } + else + UInt128.Pow(out result.v, ref value.v, (uint)exponent); + } + + public static Int128 Pow(Int128 value, int exponent) + { + Int128 result; + Pow(out result, ref value, exponent); + return result; + } + + public static ulong FloorSqrt(Int128 a) + { + if (a.IsNegative) + throw new ArgumentException("argument must not be negative"); + return UInt128.FloorSqrt(a.v); + } + + public static ulong CeilingSqrt(Int128 a) + { + if (a.IsNegative) + throw new ArgumentException("argument must not be negative"); + return UInt128.CeilingSqrt(a.v); + } + + public static long FloorCbrt(Int128 a) + { + if (a.IsNegative) + { + UInt128 aneg; + UInt128.Negate(out aneg, ref a.v); + return -(long)UInt128.FloorCbrt(aneg); + } + return (long)UInt128.FloorCbrt(a.v); + } + + public static long CeilingCbrt(Int128 a) + { + if (a.IsNegative) + { + UInt128 aneg; + UInt128.Negate(out aneg, ref a.v); + return -(long)UInt128.CeilingCbrt(aneg); + } + return (long)UInt128.CeilingCbrt(a.v); + } + + public static Int128 Min(Int128 a, Int128 b) + { + if (LessThan(ref a.v, ref b.v)) + return a; + return b; + } + + public static Int128 Max(Int128 a, Int128 b) + { + if (LessThan(ref b.v, ref a.v)) + return a; + return b; + } + + public static double Log(Int128 a) + { + return Log(a, Math.E); + } + + public static double Log10(Int128 a) + { + return Log(a, 10); + } + + public static double Log(Int128 a, double b) + { + if (a.IsNegative || a.IsZero) + throw new ArgumentException("argument must be positive"); + return Math.Log(UInt128.ConvertToDouble(ref a.v), b); + } + + public static Int128 Add(Int128 a, Int128 b) + { + Int128 c; + UInt128.Add(out c.v, ref a.v, ref b.v); + return c; + } + + public static Int128 Subtract(Int128 a, Int128 b) + { + Int128 c; + UInt128.Subtract(out c.v, ref a.v, ref b.v); + return c; + } + + public static Int128 Multiply(Int128 a, Int128 b) + { + Int128 c; + Multiply(out c, ref a, ref b); + return c; + } + + public static Int128 Divide(Int128 a, Int128 b) + { + Int128 c; + Divide(out c, ref a, ref b); + return c; + } + + public static Int128 Remainder(Int128 a, Int128 b) + { + Int128 c; + Remainder(out c, ref a, ref b); + return c; + } + + public static Int128 DivRem(Int128 a, Int128 b, out Int128 remainder) + { + Int128 c; + Divide(out c, ref a, ref b); + Remainder(out remainder, ref a, ref b); + return c; + } + + public static Int128 Negate(Int128 a) + { + Int128 c; + UInt128.Negate(out c.v, ref a.v); + return c; + } + + public static Int128 GreatestCommonDivisor(Int128 a, Int128 b) + { + Int128 c; + GreatestCommonDivisor(out c, ref a, ref b); + return c; + } + + public static void GreatestCommonDivisor(out Int128 c, ref Int128 a, ref Int128 b) + { + if (a.IsNegative) + { + UInt128 aneg; + UInt128.Negate(out aneg, ref a.v); + if (b.IsNegative) + { + UInt128 bneg; + UInt128.Negate(out bneg, ref b.v); + UInt128.GreatestCommonDivisor(out c.v, ref aneg, ref bneg); + } + else + UInt128.GreatestCommonDivisor(out c.v, ref aneg, ref b.v); + } + else + { + if (b.IsNegative) + { + UInt128 bneg; + UInt128.Negate(out bneg, ref b.v); + UInt128.GreatestCommonDivisor(out c.v, ref a.v, ref bneg); + } + else + UInt128.GreatestCommonDivisor(out c.v, ref a.v, ref b.v); + } + } + + public static void LeftShift(ref Int128 c, int d) + { + UInt128.LeftShift(ref c.v, d); + } + + public static void LeftShift(ref Int128 c) + { + UInt128.LeftShift(ref c.v); + } + + public static void RightShift(ref Int128 c, int d) + { + UInt128.ArithmeticRightShift(ref c.v, d); + } + + public static void RightShift(ref Int128 c) + { + UInt128.ArithmeticRightShift(ref c.v); + } + + public static void Swap(ref Int128 a, ref Int128 b) + { + UInt128.Swap(ref a.v, ref b.v); + } + + public static int Compare(Int128 a, Int128 b) + { + return a.CompareTo(b); + } + + public static void Shift(out Int128 c, ref Int128 a, int d) + { + UInt128.ArithmeticShift(out c.v, ref a.v, d); + } + + public static void Shift(ref Int128 c, int d) + { + UInt128.ArithmeticShift(ref c.v, d); + } + + public static Int128 ModAdd(Int128 a, Int128 b, Int128 modulus) + { + Int128 c; + UInt128.ModAdd(out c.v, ref a.v, ref b.v, ref modulus.v); + return c; + } + + public static Int128 ModSub(Int128 a, Int128 b, Int128 modulus) + { + Int128 c; + UInt128.ModSub(out c.v, ref a.v, ref b.v, ref modulus.v); + return c; + } + + public static Int128 ModMul(Int128 a, Int128 b, Int128 modulus) + { + Int128 c; + UInt128.ModMul(out c.v, ref a.v, ref b.v, ref modulus.v); + return c; + } + + public static Int128 ModPow(Int128 value, Int128 exponent, Int128 modulus) + { +Int128 result; + UInt128.ModPow(out result.v, ref value.v, ref exponent.v, ref modulus.v); + return result; + } + } +} diff --git a/TBF_V2/Sources/TBF/Dirichlet.Numerics/Properties/AssemblyInfo.cs b/TBF_V2/Sources/TBF/Dirichlet.Numerics/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..0c435d92 --- /dev/null +++ b/TBF_V2/Sources/TBF/Dirichlet.Numerics/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Dirichlet.Numerics")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Dirichlet.Numerics")] +[assembly: AssemblyCopyright("Copyright 2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("a588abc0-c631-4475-9eab-4163d9f81fed")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/TBF_V2/Sources/TBF/Dirichlet.Numerics/UInt128.cs b/TBF_V2/Sources/TBF/Dirichlet.Numerics/UInt128.cs new file mode 100644 index 00000000..c3867176 --- /dev/null +++ b/TBF_V2/Sources/TBF/Dirichlet.Numerics/UInt128.cs @@ -0,0 +1,2638 @@ +using System; +using System.Diagnostics; +using System.Globalization; +using System.Linq; +using System.Numerics; + +namespace Dirichlet.Numerics +{ + public struct UInt128 : IFormattable, IComparable, IComparable, IEquatable + { + private struct UInt256 + { + public ulong s0; + public ulong s1; + public ulong s2; + public ulong s3; + + public uint r0 { get { return (uint)s0; } } + public uint r1 { get { return (uint)(s0 >> 32); } } + public uint r2 { get { return (uint)s1; } } + public uint r3 { get { return (uint)(s1 >> 32); } } + public uint r4 { get { return (uint)s2; } } + public uint r5 { get { return (uint)(s2 >> 32); } } + public uint r6 { get { return (uint)s3; } } + public uint r7 { get { return (uint)(s3 >> 32); } } + + public UInt128 t0 { get { UInt128 result; UInt128.Create(out result, s0, s1); return result; } } + public UInt128 t1 { get { UInt128 result; UInt128.Create(out result, s2, s3); return result; } } + + public static implicit operator BigInteger(UInt256 a) + { + return (BigInteger)a.s3 << 192 | (BigInteger)a.s2 << 128 | (BigInteger)a.s1 << 64 | a.s0; + } + + public override string ToString() + { + return ((BigInteger)this).ToString(); + } + } + + private ulong s0; + private ulong s1; + + private static readonly UInt128 maxValue = ~(UInt128)0; + private static readonly UInt128 zero = (UInt128)0; + private static readonly UInt128 one = (UInt128)1; + + public static UInt128 MinValue { get { return zero; } } + public static UInt128 MaxValue { get { return maxValue; } } + public static UInt128 Zero { get { return zero; } } + public static UInt128 One { get { return one; } } + + public static UInt128 Parse(string value) + { + UInt128 c; + if (!TryParse(value, out c)) + throw new FormatException(); + return c; + } + + public static bool TryParse(string value, out UInt128 result) + { + return TryParse(value, NumberStyles.Integer, NumberFormatInfo.CurrentInfo, out result); + } + + public static bool TryParse(string value, NumberStyles style, IFormatProvider provider, out UInt128 result) + { + BigInteger a; + if (!BigInteger.TryParse(value, style, provider, out a)) + { + result = Zero; + return false; + } + Create(out result, a); + return true; + } + + public UInt128(long value) + { + Create(out this, value); + } + + public UInt128(ulong value) + { + Create(out this, value); + } + + public UInt128(decimal value) + { + Create(out this, value); + } + + public UInt128(double value) + { + Create(out this, value); + } + + public UInt128(BigInteger value) + { + Create(out this, value); + } + + public static void Create(out UInt128 c, uint r0, uint r1, uint r2, uint r3) + { + c.s0 = (ulong)r1 << 32 | r0; + c.s1 = (ulong)r3 << 32 | r2; + } + + public static void Create(out UInt128 c, ulong s0, ulong s1) + { + c.s0 = s0; + c.s1 = s1; + } + + public static void Create(out UInt128 c, long a) + { + c.s0 = (ulong)a; + c.s1 = a < 0 ? ulong.MaxValue : 0; + } + + public static void Create(out UInt128 c, ulong a) + { + c.s0 = a; + c.s1 = 0; + } + + public static void Create(out UInt128 c, decimal a) + { + var bits = decimal.GetBits(decimal.Truncate(a)); + Create(out c, (uint)bits[0], (uint)bits[1], (uint)bits[2], 0); + if (a < 0) + Negate(ref c); + } + + public static void Create(out UInt128 c, BigInteger a) + { + var sign = a.Sign; + if (sign == -1) + a = -a; + c.s0 = (ulong)(a & ulong.MaxValue); + c.s1 = (ulong)(a >> 64); + if (sign == -1) + Negate(ref c); + } + + public static void Create(out UInt128 c, double a) + { + var negate = false; + if (a < 0) + { + negate = true; + a = -a; + } + if (a <= ulong.MaxValue) + { + c.s0 = (ulong)a; + c.s1 = 0; + } + else + { + var shift = Math.Max((int)Math.Ceiling(Math.Log(a, 2)) - 63, 0); + c.s0 = (ulong)(a / Math.Pow(2, shift)); + c.s1 = 0; + LeftShift(ref c, shift); + } + if (negate) + Negate(ref c); + } + + private uint r0 { get { return (uint)s0; } } + private uint r1 { get { return (uint)(s0 >> 32); } } + private uint r2 { get { return (uint)s1; } } + private uint r3 { get { return (uint)(s1 >> 32); } } + + public ulong S0 { get { return s0; } } + public ulong S1 { get { return s1; } } + + public bool IsZero { get { return (s0 | s1) == 0; } } + public bool IsOne { get { return (s1 ^ s0) == 1; } } + public bool IsPowerOfTwo { get { return (this & (this - 1)).IsZero; } } + public bool IsEven { get { return (s0 & 1) == 0; } } + public int Sign { get { return IsZero ? 0 : 1; } } + + public override string ToString() + { + return ((BigInteger)this).ToString(); + } + + public string ToString(string format) + { + return ((BigInteger)this).ToString(format); + } + + public string ToString(IFormatProvider provider) + { + return ToString(null, provider); + } + + public string ToString(string format, IFormatProvider provider) + { + return ((BigInteger)this).ToString(format, provider); + } + + public static explicit operator UInt128(double a) + { + UInt128 c; + Create(out c, a); + return c; + } + + public static explicit operator UInt128(sbyte a) + { + UInt128 c; + Create(out c, a); + return c; + } + + public static implicit operator UInt128(byte a) + { + UInt128 c; + Create(out c, a); + return c; + } + + public static explicit operator UInt128(short a) + { + UInt128 c; + Create(out c, a); + return c; + } + + public static implicit operator UInt128(ushort a) + { + UInt128 c; + Create(out c, a); + return c; + } + + public static explicit operator UInt128(int a) + { + UInt128 c; + Create(out c, a); + return c; + } + + public static implicit operator UInt128(uint a) + { + UInt128 c; + Create(out c, a); + return c; + } + + public static explicit operator UInt128(long a) + { + UInt128 c; + Create(out c, a); + return c; + } + + public static implicit operator UInt128(ulong a) + { + UInt128 c; + Create(out c, a); + return c; + } + + public static explicit operator UInt128(decimal a) + { + UInt128 c; + Create(out c, a); + return c; + } + + public static explicit operator UInt128(BigInteger a) + { + UInt128 c; + Create(out c, a); + return c; + } + + public static explicit operator float(UInt128 a) + { + return ConvertToFloat(ref a); + } + + public static explicit operator double(UInt128 a) + { + return ConvertToDouble(ref a); + } + + public static float ConvertToFloat(ref UInt128 a) + { + if (a.s1 == 0) + return a.s0; + return a.s1 * (float)ulong.MaxValue + a.s0; + } + + public static double ConvertToDouble(ref UInt128 a) + { + if (a.s1 == 0) + return a.s0; + return a.s1 * (double)ulong.MaxValue + a.s0; + } + + public static explicit operator sbyte(UInt128 a) + { + return (sbyte)a.s0; + } + + public static explicit operator byte(UInt128 a) + { + return (byte)a.s0; + } + + public static explicit operator short(UInt128 a) + { + return (short)a.s0; + } + + public static explicit operator ushort(UInt128 a) + { + return (ushort)a.s0; + } + + public static explicit operator int(UInt128 a) + { + return (int)a.s0; + } + + public static explicit operator uint(UInt128 a) + { + return (uint)a.s0; + } + + public static explicit operator long(UInt128 a) + { + return (long)a.s0; + } + + public static explicit operator ulong(UInt128 a) + { + return a.s0; + } + + public static explicit operator decimal(UInt128 a) + { + if (a.s1 == 0) + return a.s0; + var shift = Math.Max(0, 32 - GetBitLength(a.s1)); + UInt128 ashift; + RightShift(out ashift, ref a, shift); + return new decimal((int)a.r0, (int)a.r1, (int)a.r2, false, (byte)shift); + } + + public static implicit operator BigInteger(UInt128 a) + { + if (a.s1 == 0) + return a.s0; + return (BigInteger)a.s1 << 64 | a.s0; + } + + public static UInt128 operator <<(UInt128 a, int b) + { + UInt128 c; + LeftShift(out c, ref a, b); + return c; + } + + public static UInt128 operator >>(UInt128 a, int b) + { + UInt128 c; + RightShift(out c, ref a, b); + return c; + } + + public static UInt128 operator &(UInt128 a, UInt128 b) + { + UInt128 c; + And(out c, ref a, ref b); + return c; + } + + public static uint operator &(UInt128 a, uint b) + { + return (uint)a.s0 & b; + } + + public static uint operator &(uint a, UInt128 b) + { + return a & (uint)b.s0; + } + + public static ulong operator &(UInt128 a, ulong b) + { + return a.s0 & b; + } + + public static ulong operator &(ulong a, UInt128 b) + { + return a & b.s0; + } + + public static UInt128 operator |(UInt128 a, UInt128 b) + { + UInt128 c; + Or(out c, ref a, ref b); + return c; + } + + public static UInt128 operator ^(UInt128 a, UInt128 b) + { + UInt128 c; + ExclusiveOr(out c, ref a, ref b); + return c; + } + + public static UInt128 operator ~(UInt128 a) + { + UInt128 c; + Not(out c, ref a); + return c; + } + + public static UInt128 operator +(UInt128 a, UInt128 b) + { + UInt128 c; + Add(out c, ref a, ref b); + return c; + } + + public static UInt128 operator +(UInt128 a, ulong b) + { + UInt128 c; + Add(out c, ref a, b); + return c; + } + + public static UInt128 operator +(ulong a, UInt128 b) + { + UInt128 c; + Add(out c, ref b, a); + return c; + } + + public static UInt128 operator ++(UInt128 a) + { + UInt128 c; + Add(out c, ref a, 1); + return c; + } + + public static UInt128 operator -(UInt128 a, UInt128 b) + { + UInt128 c; + Subtract(out c, ref a, ref b); + return c; + } + + public static UInt128 operator -(UInt128 a, ulong b) + { + UInt128 c; + Subtract(out c, ref a, b); + return c; + } + + public static UInt128 operator -(ulong a, UInt128 b) + { + UInt128 c; + Subtract(out c, a, ref b); + return c; + } + + public static UInt128 operator --(UInt128 a) + { + UInt128 c; + Subtract(out c, ref a, 1); + return c; + } + + public static UInt128 operator +(UInt128 a) + { + return a; + } + + public static UInt128 operator *(UInt128 a, uint b) + { + UInt128 c; + Multiply(out c, ref a, b); + return c; + } + + public static UInt128 operator *(uint a, UInt128 b) + { + UInt128 c; + Multiply(out c, ref b, a); + return c; + } + + public static UInt128 operator *(UInt128 a, ulong b) + { + UInt128 c; + Multiply(out c, ref a, b); + return c; + } + + public static UInt128 operator *(ulong a, UInt128 b) + { + UInt128 c; + Multiply(out c, ref b, a); + return c; + } + + public static UInt128 operator *(UInt128 a, UInt128 b) + { + UInt128 c; + Multiply(out c, ref a, ref b); + return c; + } + + public static UInt128 operator /(UInt128 a, ulong b) + { + UInt128 c; + Divide(out c, ref a, b); + return c; + } + + public static UInt128 operator /(UInt128 a, UInt128 b) + { + UInt128 c; + Divide(out c, ref a, ref b); + return c; + } + + public static ulong operator %(UInt128 a, uint b) + { + return Remainder(ref a, b); + } + + public static ulong operator %(UInt128 a, ulong b) + { + return Remainder(ref a, b); + } + + public static UInt128 operator %(UInt128 a, UInt128 b) + { + UInt128 c; + Remainder(out c, ref a, ref b); + return c; + } + + public static bool operator <(UInt128 a, UInt128 b) + { + return LessThan(ref a, ref b); + } + + public static bool operator <(UInt128 a, int b) + { + return LessThan(ref a, b); + } + + public static bool operator <(int a, UInt128 b) + { + return LessThan(a, ref b); + } + + public static bool operator <(UInt128 a, uint b) + { + return LessThan(ref a, b); + } + + public static bool operator <(uint a, UInt128 b) + { + return LessThan(a, ref b); + } + + public static bool operator <(UInt128 a, long b) + { + return LessThan(ref a, b); + } + + public static bool operator <(long a, UInt128 b) + { + return LessThan(a, ref b); + } + + public static bool operator <(UInt128 a, ulong b) + { + return LessThan(ref a, b); + } + + public static bool operator <(ulong a, UInt128 b) + { + return LessThan(a, ref b); + } + + public static bool operator <=(UInt128 a, UInt128 b) + { + return !LessThan(ref b, ref a); + } + + public static bool operator <=(UInt128 a, int b) + { + return !LessThan(b, ref a); + } + + public static bool operator <=(int a, UInt128 b) + { + return !LessThan(ref b, a); + } + + public static bool operator <=(UInt128 a, uint b) + { + return !LessThan(b, ref a); + } + + public static bool operator <=(uint a, UInt128 b) + { + return !LessThan(ref b, a); + } + + public static bool operator <=(UInt128 a, long b) + { + return !LessThan(b, ref a); + } + + public static bool operator <=(long a, UInt128 b) + { + return !LessThan(ref b, a); + } + + public static bool operator <=(UInt128 a, ulong b) + { + return !LessThan(b, ref a); + } + + public static bool operator <=(ulong a, UInt128 b) + { + return !LessThan(ref b, a); + } + + public static bool operator >(UInt128 a, UInt128 b) + { + return LessThan(ref b, ref a); + } + + public static bool operator >(UInt128 a, int b) + { + return LessThan(b, ref a); + } + + public static bool operator >(int a, UInt128 b) + { + return LessThan(ref b, a); + } + + public static bool operator >(UInt128 a, uint b) + { + return LessThan(b, ref a); + } + + public static bool operator >(uint a, UInt128 b) + { + return LessThan(ref b, a); + } + + public static bool operator >(UInt128 a, long b) + { + return LessThan(b, ref a); + } + + public static bool operator >(long a, UInt128 b) + { + return LessThan(ref b, a); + } + + public static bool operator >(UInt128 a, ulong b) + { + return LessThan(b, ref a); + } + + public static bool operator >(ulong a, UInt128 b) + { + return LessThan(ref b, a); + } + + public static bool operator >=(UInt128 a, UInt128 b) + { + return !LessThan(ref a, ref b); + } + + public static bool operator >=(UInt128 a, int b) + { + return !LessThan(ref a, b); + } + + public static bool operator >=(int a, UInt128 b) + { + return !LessThan(a, ref b); + } + + public static bool operator >=(UInt128 a, uint b) + { + return !LessThan(ref a, b); + } + + public static bool operator >=(uint a, UInt128 b) + { + return !LessThan(a, ref b); + } + + public static bool operator >=(UInt128 a, long b) + { + return !LessThan(ref a, b); + } + + public static bool operator >=(long a, UInt128 b) + { + return !LessThan(a, ref b); + } + + public static bool operator >=(UInt128 a, ulong b) + { + return !LessThan(ref a, b); + } + + public static bool operator >=(ulong a, UInt128 b) + { + return !LessThan(a, ref b); + } + + public static bool operator ==(UInt128 a, UInt128 b) + { + return a.Equals(b); + } + + public static bool operator ==(UInt128 a, int b) + { + return a.Equals(b); + } + + public static bool operator ==(int a, UInt128 b) + { + return b.Equals(a); + } + + public static bool operator ==(UInt128 a, uint b) + { + return a.Equals(b); + } + + public static bool operator ==(uint a, UInt128 b) + { + return b.Equals(a); + } + + public static bool operator ==(UInt128 a, long b) + { + return a.Equals(b); + } + + public static bool operator ==(long a, UInt128 b) + { + return b.Equals(a); + } + + public static bool operator ==(UInt128 a, ulong b) + { + return a.Equals(b); + } + + public static bool operator ==(ulong a, UInt128 b) + { + return b.Equals(a); + } + + public static bool operator !=(UInt128 a, UInt128 b) + { + return !a.Equals(b); + } + + public static bool operator !=(UInt128 a, int b) + { + return !a.Equals(b); + } + + public static bool operator !=(int a, UInt128 b) + { + return !b.Equals(a); + } + + public static bool operator !=(UInt128 a, uint b) + { + return !a.Equals(b); + } + + public static bool operator !=(uint a, UInt128 b) + { + return !b.Equals(a); + } + + public static bool operator !=(UInt128 a, long b) + { + return !a.Equals(b); + } + + public static bool operator !=(long a, UInt128 b) + { + return !b.Equals(a); + } + + public static bool operator !=(UInt128 a, ulong b) + { + return !a.Equals(b); + } + + public static bool operator !=(ulong a, UInt128 b) + { + return !b.Equals(a); + } + + public int CompareTo(UInt128 other) + { + if (s1 != other.s1) + return s1.CompareTo(other.s1); + return s0.CompareTo(other.s0); + } + + public int CompareTo(int other) + { + if (s1 != 0 || other < 0) + return 1; + return s0.CompareTo((ulong)other); + } + + public int CompareTo(uint other) + { + if (s1 != 0) + return 1; + return s0.CompareTo((ulong)other); + } + + public int CompareTo(long other) + { + if (s1 != 0 || other < 0) + return 1; + return s0.CompareTo((ulong)other); + } + + public int CompareTo(ulong other) + { + if (s1 != 0) + return 1; + return s0.CompareTo(other); + } + + public int CompareTo(object obj) + { + if (obj == null) + return 1; + if (!(obj is UInt128)) + throw new ArgumentException(); + return CompareTo((UInt128)obj); + } + + private static bool LessThan(ref UInt128 a, long b) + { + return b >= 0 && a.s1 == 0 && a.s0 < (ulong)b; + } + + private static bool LessThan(long a, ref UInt128 b) + { + return a < 0 || b.s1 != 0 || (ulong)a < b.s0; + } + + private static bool LessThan(ref UInt128 a, ulong b) + { + return a.s1 == 0 && a.s0 < b; + } + + private static bool LessThan(ulong a, ref UInt128 b) + { + return b.s1 != 0 || a < b.s0; + } + + private static bool LessThan(ref UInt128 a, ref UInt128 b) + { + if (a.s1 != b.s1) + return a.s1 < b.s1; + return a.s0 < b.s0; + } + + public static bool Equals(ref UInt128 a, ref UInt128 b) + { + return a.s0 == b.s0 && a.s1 == b.s1; + } + + public bool Equals(UInt128 other) + { + return s0 == other.s0 && s1 == other.s1; + } + + public bool Equals(int other) + { + return other >= 0 && s0 == (uint)other && s1 == 0; + } + + public bool Equals(uint other) + { + return s0 == other && s1 == 0; + } + + public bool Equals(long other) + { + return other >= 0 && s0 == (ulong)other && s1 == 0; + } + + public bool Equals(ulong other) + { + return s0 == other && s1 == 0; + } + + public override bool Equals(object obj) + { + if (!(obj is UInt128)) + return false; + return Equals((UInt128)obj); + } + + public override int GetHashCode() + { + return s0.GetHashCode() ^ s1.GetHashCode(); + } + + public static void Multiply(out UInt128 c, ulong a, ulong b) + { + Multiply64(out c, a, b); + Debug.Assert((BigInteger)c == (BigInteger)a * (BigInteger)b); + } + + public static void Multiply(out UInt128 c, ref UInt128 a, uint b) + { + if (a.s1 == 0) + Multiply64(out c, a.s0, b); + else + Multiply128(out c, ref a, b); + Debug.Assert((BigInteger)c == (BigInteger)a * (BigInteger)b % ((BigInteger)1 << 128)); + } + + public static void Multiply(out UInt128 c, ref UInt128 a, ulong b) + { + if (a.s1 == 0) + Multiply64(out c, a.s0, b); + else + Multiply128(out c, ref a, b); + Debug.Assert((BigInteger)c == (BigInteger)a * (BigInteger)b % ((BigInteger)1 << 128)); + } + + public static void Multiply(out UInt128 c, ref UInt128 a, ref UInt128 b) + { + if ((a.s1 | b.s1) == 0) + Multiply64(out c, a.s0, b.s0); + else if (a.s1 == 0) + Multiply128(out c, ref b, a.s0); + else if (b.s1 == 0) + Multiply128(out c, ref a, b.s0); + else + Multiply128(out c, ref a, ref b); + Debug.Assert((BigInteger)c == (BigInteger)a * (BigInteger)b % ((BigInteger)1 << 128)); + } + + private static void Multiply(out UInt256 c, ref UInt128 a, ref UInt128 b) + { +#if true + UInt128 c00, c01, c10, c11; + Multiply64(out c00, a.s0, b.s0); + Multiply64(out c01, a.s0, b.s1); + Multiply64(out c10, a.s1, b.s0); + Multiply64(out c11, a.s1, b.s1); + var carry1 = (uint)0; + var carry2 = (uint)0; + c.s0 = c00.S0; + c.s1 = Add(Add(c00.s1, c01.s0, ref carry1), c10.s0, ref carry1); + c.s2 = Add(Add(Add(c01.s1, c10.s1, ref carry2), c11.s0, ref carry2), carry1, ref carry2); + c.s3 = c11.s1 + carry2; +#else + // Karatsuba method. + // Warning: doesn't correctly handle overflow. + UInt128 z0, z1, z2; + Multiply64(out z0, a.s0, b.s0); + Multiply64(out z2, a.s1, b.s1); + Multiply64(out z1, a.s0 + a.s1, b.s0 + b.s1); + Subtract(ref z1, ref z2); + Subtract(ref z1, ref z0); + var carry1 = (uint)0; + var carry2 = (uint)0; + c.s0 = z0.S0; + c.s1 = Add(z0.s1, z1.s0, ref carry1); + c.s2 = Add(Add(z1.s1, z2.s0, ref carry2), carry1, ref carry2); + c.s3 = z2.s1 + carry2; +#endif + Debug.Assert((BigInteger)c == (BigInteger)a * (BigInteger)b); + } + + public static UInt128 Abs(UInt128 a) + { + return a; + } + + public static UInt128 Square(ulong a) + { + UInt128 c; + Square(out c, a); + return c; + } + + public static UInt128 Square(UInt128 a) + { + UInt128 c; + Square(out c, ref a); + return c; + } + + public static void Square(out UInt128 c, ulong a) + { + Square64(out c, a); + } + + public static void Square(out UInt128 c, ref UInt128 a) + { + if (a.s1 == 0) + Square64(out c, a.s0); + else + Multiply128(out c, ref a, ref a); + } + + public static UInt128 Cube(ulong a) + { + UInt128 c; + Cube(out c, a); + return c; + } + + public static UInt128 Cube(UInt128 a) + { + UInt128 c; + Cube(out c, ref a); + return c; + } + + public static void Cube(out UInt128 c, ulong a) + { + UInt128 square; + Square(out square, a); + Multiply(out c, ref square, a); + } + + public static void Cube(out UInt128 c, ref UInt128 a) + { + UInt128 square; + if (a.s1 == 0) + { + Square64(out square, a.s0); + Multiply(out c, ref square, a.s0); + } + else + { + Multiply128(out square, ref a, ref a); + Multiply128(out c, ref square, ref a); + } + } + + public static void Add(out UInt128 c, ulong a, ulong b) + { + c.s0 = a + b; + c.s1 = 0; + if (c.s0 < a && c.s0 < b) + ++c.s1; + Debug.Assert((BigInteger)c == ((BigInteger)a + (BigInteger)b)); + } + + public static void Add(out UInt128 c, ref UInt128 a, ulong b) + { + c.s0 = a.s0 + b; + c.s1 = a.s1; + if (c.s0 < a.s0 && c.s0 < b) + ++c.s1; + Debug.Assert((BigInteger)c == ((BigInteger)a + (BigInteger)b) % ((BigInteger)1 << 128)); + } + + public static void Add(out UInt128 c, ref UInt128 a, ref UInt128 b) + { + c.s0 = a.s0 + b.s0; + c.s1 = a.s1 + b.s1; + if (c.s0 < a.s0 && c.s0 < b.s0) + ++c.s1; + Debug.Assert((BigInteger)c == ((BigInteger)a + (BigInteger)b) % ((BigInteger)1 << 128)); + } + + private static ulong Add(ulong a, ulong b, ref uint carry) + { + var c = a + b; + if (c < a && c < b) + ++carry; + return c; + } + + public static void Add(ref UInt128 a, ulong b) + { + var sum = a.s0 + b; + if (sum < a.s0 && sum < b) + ++a.s1; + a.s0 = sum; + } + + public static void Add(ref UInt128 a, ref UInt128 b) + { + var sum = a.s0 + b.s0; + if (sum < a.s0 && sum < b.s0) + ++a.s1; + a.s0 = sum; + a.s1 += b.s1; + } + + public static void Add(ref UInt128 a, UInt128 b) + { + Add(ref a, ref b); + } + + public static void Subtract(out UInt128 c, ref UInt128 a, ulong b) + { + c.s0 = a.s0 - b; + c.s1 = a.s1; + if (a.s0 < b) + --c.s1; + Debug.Assert((BigInteger)c == ((BigInteger)a - (BigInteger)b + ((BigInteger)1 << 128)) % ((BigInteger)1 << 128)); + } + + public static void Subtract(out UInt128 c, ulong a, ref UInt128 b) + { + c.s0 = a - b.s0; + c.s1 = 0 - b.s1; + if (a < b.s0) + --c.s1; + Debug.Assert((BigInteger)c == ((BigInteger)a - (BigInteger)b + ((BigInteger)1 << 128)) % ((BigInteger)1 << 128)); + } + + public static void Subtract(out UInt128 c, ref UInt128 a, ref UInt128 b) + { + c.s0 = a.s0 - b.s0; + c.s1 = a.s1 - b.s1; + if (a.s0 < b.s0) + --c.s1; + Debug.Assert((BigInteger)c == ((BigInteger)a - (BigInteger)b + ((BigInteger)1 << 128)) % ((BigInteger)1 << 128)); + } + + public static void Subtract(ref UInt128 a, ulong b) + { + if (a.s0 < b) + --a.s1; + a.s0 -= b; + } + + public static void Subtract(ref UInt128 a, ref UInt128 b) + { + if (a.s0 < b.s0) + --a.s1; + a.s0 -= b.s0; + a.s1 -= b.s1; + } + + public static void Subtract(ref UInt128 a, UInt128 b) + { + Subtract(ref a, ref b); + } + + private static void Square64(out UInt128 w, ulong u) + { + var u0 = (ulong)(uint)u; + var u1 = u >> 32; + var carry = u0 * u0; + var r0 = (uint)carry; + var u0u1 = u0 * u1; + carry = (carry >> 32) + u0u1; + var r2 = carry >> 32; + carry = (uint)carry + u0u1; + w.s0 = carry << 32 | r0; + w.s1 = (carry >> 32) + r2 + u1 * u1; + Debug.Assert((BigInteger)w == (BigInteger)u * u); + } + + private static void Multiply64(out UInt128 w, uint u, uint v) + { + w.s0 = (ulong)u * v; + w.s1 = 0; + Debug.Assert((BigInteger)w == (BigInteger)u * v); + } + + private static void Multiply64(out UInt128 w, ulong u, uint v) + { + var u0 = (ulong)(uint)u; + var u1 = u >> 32; + var carry = u0 * v; + var r0 = (uint)carry; + carry = (carry >> 32) + u1 * v; + w.s0 = carry << 32 | r0; + w.s1 = carry >> 32; + Debug.Assert((BigInteger)w == (BigInteger)u * v); + } + + private static void Multiply64(out UInt128 w, ulong u, ulong v) + { + var u0 = (ulong)(uint)u; + var u1 = u >> 32; + var v0 = (ulong)(uint)v; + var v1 = v >> 32; + var carry = u0 * v0; + var r0 = (uint)carry; + carry = (carry >> 32) + u0 * v1; + var r2 = carry >> 32; + carry = (uint)carry + u1 * v0; + w.s0 = carry << 32 | r0; + w.s1 = (carry >> 32) + r2 + u1 * v1; + Debug.Assert((BigInteger)w == (BigInteger)u * v); + } + + private static void Multiply64(out UInt128 w, ulong u, ulong v, ulong c) + { + var u0 = (ulong)(uint)u; + var u1 = u >> 32; + var v0 = (ulong)(uint)v; + var v1 = v >> 32; + var carry = u0 * v0 + (uint)c; + var r0 = (uint)carry; + carry = (carry >> 32) + u0 * v1 + (c >> 32); + var r2 = carry >> 32; + carry = (uint)carry + u1 * v0; + w.s0 = carry << 32 | r0; + w.s1 = (carry >> 32) + r2 + u1 * v1; + Debug.Assert((BigInteger)w == (BigInteger)u * v + c); + } + + private static ulong MultiplyHigh64(ulong u, ulong v, ulong c) + { + var u0 = (ulong)(uint)u; + var u1 = u >> 32; + var v0 = (ulong)(uint)v; + var v1 = v >> 32; + var carry = ((u0 * v0 + (uint)c) >> 32) + u0 * v1 + (c >> 32); + var r2 = carry >> 32; + carry = (uint)carry + u1 * v0; + return (carry >> 32) + r2 + u1 * v1; + } + + private static void Multiply128(out UInt128 w, ref UInt128 u, uint v) + { + Multiply64(out w, u.s0, v); + w.s1 += u.s1 * v; + Debug.Assert((BigInteger)w == (BigInteger)u * v % ((BigInteger)1 << 128)); + } + + private static void Multiply128(out UInt128 w, ref UInt128 u, ulong v) + { + Multiply64(out w, u.s0, v); + w.s1 += u.s1 * v; + Debug.Assert((BigInteger)w == (BigInteger)u * v % ((BigInteger)1 << 128)); + } + + private static void Multiply128(out UInt128 w, ref UInt128 u, ref UInt128 v) + { + Multiply64(out w, u.s0, v.s0); + w.s1 += u.s1 * v.s0 + u.s0 * v.s1; + Debug.Assert((BigInteger)w == (BigInteger)u * v % ((BigInteger)1 << 128)); + } + + public static void Divide(out UInt128 w, ref UInt128 u, uint v) + { + if (u.s1 == 0) + Divide64(out w, u.s0, v); + else if (u.s1 <= uint.MaxValue) + Divide96(out w, ref u, v); + else + Divide128(out w, ref u, v); + } + + public static void Divide(out UInt128 w, ref UInt128 u, ulong v) + { + if (u.s1 == 0) + Divide64(out w, u.s0, v); + else + { + var v0 = (uint)v; + if (v == v0) + { + if (u.s1 <= uint.MaxValue) + Divide96(out w, ref u, v0); + else + Divide128(out w, ref u, v0); + } + else + { + if (u.s1 <= uint.MaxValue) + Divide96(out w, ref u, v); + else + Divide128(out w, ref u, v); + } + } + } + + public static void Divide(out UInt128 c, ref UInt128 a, ref UInt128 b) + { + if (LessThan(ref a, ref b)) + c = Zero; + else if (b.s1 == 0) + Divide(out c, ref a, b.s0); + else if (b.s1 <= uint.MaxValue) + { + UInt128 rem; + Create(out c, DivRem96(out rem, ref a, ref b)); + } + else + { + UInt128 rem; + Create(out c, DivRem128(out rem, ref a, ref b)); + } + } + + public static uint Remainder(ref UInt128 u, uint v) + { + if (u.s1 == 0) + return (uint)(u.s0 % v); + if (u.s1 <= uint.MaxValue) + return Remainder96(ref u, v); + return Remainder128(ref u, v); + } + + public static ulong Remainder(ref UInt128 u, ulong v) + { + if (u.s1 == 0) + return u.s0 % v; + var v0 = (uint)v; + if (v == v0) + { + if (u.s1 <= uint.MaxValue) + return Remainder96(ref u, v0); + return Remainder128(ref u, v0); + } + if (u.s1 <= uint.MaxValue) + return Remainder96(ref u, v); + return Remainder128(ref u, v); + } + + public static void Remainder(out UInt128 c, ref UInt128 a, ref UInt128 b) + { + if (LessThan(ref a, ref b)) + c = a; + else if (b.s1 == 0) + Create(out c, Remainder(ref a, b.s0)); + else if (b.s1 <= uint.MaxValue) + DivRem96(out c, ref a, ref b); + else + DivRem128(out c, ref a, ref b); + } + + public static void Remainder(ref UInt128 a, ref UInt128 b) + { + UInt128 a2 = a; + Remainder(out a, ref a2, ref b); + } + + private static void Remainder(out UInt128 c, ref UInt256 a, ref UInt128 b) + { + if (b.r3 == 0) + Remainder192(out c, ref a, ref b); + else + Remainder256(out c, ref a, ref b); + } + + private static void Divide64(out UInt128 w, ulong u, ulong v) + { + w.s1 = 0; + w.s0 = u / v; + Debug.Assert((BigInteger)w == (BigInteger)u / v); + } + + private static void Divide96(out UInt128 w, ref UInt128 u, uint v) + { + var r2 = u.r2; + var w2 = r2 / v; + var u0 = (ulong)(r2 - w2 * v); + var u0u1 = u0 << 32 | u.r1; + var w1 = (uint)(u0u1 / v); + u0 = u0u1 - w1 * v; + u0u1 = u0 << 32 | u.r0; + var w0 = (uint)(u0u1 / v); + w.s1 = w2; + w.s0 = (ulong)w1 << 32 | w0; + Debug.Assert((BigInteger)w == (BigInteger)u / v); + } + + private static void Divide128(out UInt128 w, ref UInt128 u, uint v) + { + var r3 = u.r3; + var w3 = r3 / v; + var u0 = (ulong)(r3 - w3 * v); + var u0u1 = u0 << 32 | u.r2; + var w2 = (uint)(u0u1 / v); + u0 = u0u1 - w2 * v; + u0u1 = u0 << 32 | u.r1; + var w1 = (uint)(u0u1 / v); + u0 = u0u1 - w1 * v; + u0u1 = u0 << 32 | u.r0; + var w0 = (uint)(u0u1 / v); + w.s1 = (ulong)w3 << 32 | w2; + w.s0 = (ulong)w1 << 32 | w0; + Debug.Assert((BigInteger)w == (BigInteger)u / v); + } + + private static void Divide96(out UInt128 w, ref UInt128 u, ulong v) + { + w.s0 = w.s1 = 0; + var dneg = GetBitLength((uint)(v >> 32)); + var d = 32 - dneg; + var vPrime = v << d; + var v1 = (uint)(vPrime >> 32); + var v2 = (uint)vPrime; + var r0 = u.r0; + var r1 = u.r1; + var r2 = u.r2; + var r3 = (uint)0; + if (d != 0) + { + r3 = r2 >> dneg; + r2 = r2 << d | r1 >> dneg; + r1 = r1 << d | r0 >> dneg; + r0 <<= d; + } + var q1 = DivRem(r3, ref r2, ref r1, v1, v2); + var q0 = DivRem(r2, ref r1, ref r0, v1, v2); + w.s0 = (ulong)q1 << 32 | q0; + w.s1 = 0; + Debug.Assert((BigInteger)w == (BigInteger)u / v); + } + + private static void Divide128(out UInt128 w, ref UInt128 u, ulong v) + { + w.s0 = w.s1 = 0; + var dneg = GetBitLength((uint)(v >> 32)); + var d = 32 - dneg; + var vPrime = v << d; + var v1 = (uint)(vPrime >> 32); + var v2 = (uint)vPrime; + var r0 = u.r0; + var r1 = u.r1; + var r2 = u.r2; + var r3 = u.r3; + var r4 = (uint)0; + if (d != 0) + { + r4 = r3 >> dneg; + r3 = r3 << d | r2 >> dneg; + r2 = r2 << d | r1 >> dneg; + r1 = r1 << d | r0 >> dneg; + r0 <<= d; + } + w.s1 = DivRem(r4, ref r3, ref r2, v1, v2); + var q1 = DivRem(r3, ref r2, ref r1, v1, v2); + var q0 = DivRem(r2, ref r1, ref r0, v1, v2); + w.s0 = (ulong)q1 << 32 | q0; + Debug.Assert((BigInteger)w == (BigInteger)u / v); + } + + private static uint Remainder96(ref UInt128 u, uint v) + { + var u0 = (ulong)(u.r2 % v); + var u0u1 = u0 << 32 | u.r1; + u0 = u0u1 % v; + u0u1 = u0 << 32 | u.r0; + return (uint)(u0u1 % v); + } + + private static uint Remainder128(ref UInt128 u, uint v) + { + var u0 = (ulong)(u.r3 % v); + var u0u1 = u0 << 32 | u.r2; + u0 = u0u1 % v; + u0u1 = u0 << 32 | u.r1; + u0 = u0u1 % v; + u0u1 = u0 << 32 | u.r0; + return (uint)(u0u1 % v); + } + + private static ulong Remainder96(ref UInt128 u, ulong v) + { + var dneg = GetBitLength((uint)(v >> 32)); + var d = 32 - dneg; + var vPrime = v << d; + var v1 = (uint)(vPrime >> 32); + var v2 = (uint)vPrime; + var r0 = u.r0; + var r1 = u.r1; + var r2 = u.r2; + var r3 = (uint)0; + if (d != 0) + { + r3 = r2 >> dneg; + r2 = r2 << d | r1 >> dneg; + r1 = r1 << d | r0 >> dneg; + r0 <<= d; + } + DivRem(r3, ref r2, ref r1, v1, v2); + DivRem(r2, ref r1, ref r0, v1, v2); + return ((ulong)r1 << 32 | r0) >> d; + } + + private static ulong Remainder128(ref UInt128 u, ulong v) + { + var dneg = GetBitLength((uint)(v >> 32)); + var d = 32 - dneg; + var vPrime = v << d; + var v1 = (uint)(vPrime >> 32); + var v2 = (uint)vPrime; + var r0 = u.r0; + var r1 = u.r1; + var r2 = u.r2; + var r3 = u.r3; + var r4 = (uint)0; + if (d != 0) + { + r4 = r3 >> dneg; + r3 = r3 << d | r2 >> dneg; + r2 = r2 << d | r1 >> dneg; + r1 = r1 << d | r0 >> dneg; + r0 <<= d; + } + DivRem(r4, ref r3, ref r2, v1, v2); + DivRem(r3, ref r2, ref r1, v1, v2); + DivRem(r2, ref r1, ref r0, v1, v2); + return ((ulong)r1 << 32 | r0) >> d; + } + + private static ulong DivRem96(out UInt128 rem, ref UInt128 a, ref UInt128 b) + { + var d = 32 - GetBitLength(b.r2); + UInt128 v; + LeftShift64(out v, ref b, d); + var r4 = (uint)LeftShift64(out rem, ref a, d); + var v1 = v.r2; + var v2 = v.r1; + var v3 = v.r0; + var r3 = rem.r3; + var r2 = rem.r2; + var r1 = rem.r1; + var r0 = rem.r0; + var q1 = DivRem(r4, ref r3, ref r2, ref r1, v1, v2, v3); + var q0 = DivRem(r3, ref r2, ref r1, ref r0, v1, v2, v3); + Create(out rem, r0, r1, r2, 0); + var div = (ulong)q1 << 32 | q0; + RightShift64(ref rem, d); + Debug.Assert((BigInteger)div == (BigInteger)a / (BigInteger)b); + Debug.Assert((BigInteger)rem == (BigInteger)a % (BigInteger)b); + return div; + } + + private static uint DivRem128(out UInt128 rem, ref UInt128 a, ref UInt128 b) + { + var d = 32 - GetBitLength(b.r3); + UInt128 v; + LeftShift64(out v, ref b, d); + var r4 = (uint)LeftShift64(out rem, ref a, d); + var r3 = rem.r3; + var r2 = rem.r2; + var r1 = rem.r1; + var r0 = rem.r0; + var div = DivRem(r4, ref r3, ref r2, ref r1, ref r0, v.r3, v.r2, v.r1, v.r0); + Create(out rem, r0, r1, r2, r3); + RightShift64(ref rem, d); + Debug.Assert((BigInteger)div == (BigInteger)a / (BigInteger)b); + Debug.Assert((BigInteger)rem == (BigInteger)a % (BigInteger)b); + return div; + } + + private static void Remainder192(out UInt128 c, ref UInt256 a, ref UInt128 b) + { + var d = 32 - GetBitLength(b.r2); + UInt128 v; + LeftShift64(out v, ref b, d); + var v1 = v.r2; + var v2 = v.r1; + var v3 = v.r0; + UInt256 rem; + LeftShift64(out rem, ref a, d); + var r6 = rem.r6; + var r5 = rem.r5; + var r4 = rem.r4; + var r3 = rem.r3; + var r2 = rem.r2; + var r1 = rem.r1; + var r0 = rem.r0; + DivRem(r6, ref r5, ref r4, ref r3, v1, v2, v3); + DivRem(r5, ref r4, ref r3, ref r2, v1, v2, v3); + DivRem(r4, ref r3, ref r2, ref r1, v1, v2, v3); + DivRem(r3, ref r2, ref r1, ref r0, v1, v2, v3); + Create(out c, r0, r1, r2, 0); + RightShift64(ref c, d); + Debug.Assert((BigInteger)c == (BigInteger)a % (BigInteger)b); + } + + private static void Remainder256(out UInt128 c, ref UInt256 a, ref UInt128 b) + { + var d = 32 - GetBitLength(b.r3); + UInt128 v; + LeftShift64(out v, ref b, d); + var v1 = v.r3; + var v2 = v.r2; + var v3 = v.r1; + var v4 = v.r0; + UInt256 rem; + var r8 = (uint)LeftShift64(out rem, ref a, d); + var r7 = rem.r7; + var r6 = rem.r6; + var r5 = rem.r5; + var r4 = rem.r4; + var r3 = rem.r3; + var r2 = rem.r2; + var r1 = rem.r1; + var r0 = rem.r0; + DivRem(r8, ref r7, ref r6, ref r5, ref r4, v1, v2, v3, v4); + DivRem(r7, ref r6, ref r5, ref r4, ref r3, v1, v2, v3, v4); + DivRem(r6, ref r5, ref r4, ref r3, ref r2, v1, v2, v3, v4); + DivRem(r5, ref r4, ref r3, ref r2, ref r1, v1, v2, v3, v4); + DivRem(r4, ref r3, ref r2, ref r1, ref r0, v1, v2, v3, v4); + Create(out c, r0, r1, r2, r3); + RightShift64(ref c, d); + Debug.Assert((BigInteger)c == (BigInteger)a % (BigInteger)b); + } + + private static ulong Q(uint u0, uint u1, uint u2, uint v1, uint v2) + { + var u0u1 = (ulong)u0 << 32 | u1; + var qhat = u0 == v1 ? uint.MaxValue : u0u1 / v1; + var r = u0u1 - qhat * v1; + if (r == (uint)r && v2 * qhat > (r << 32 | u2)) + { + --qhat; + r += v1; + if (r == (uint)r && v2 * qhat > (r << 32 | u2)) + { + --qhat; + r += v1; + } + } + return qhat; + } + + private static uint DivRem(uint u0, ref uint u1, ref uint u2, uint v1, uint v2) + { + var qhat = Q(u0, u1, u2, v1, v2); + var carry = qhat * v2; + var borrow = (long)u2 - (uint)carry; + carry >>= 32; + u2 = (uint)borrow; + borrow >>= 32; + carry += qhat * v1; + borrow += (long)u1 - (uint)carry; + carry >>= 32; + u1 = (uint)borrow; + borrow >>= 32; + borrow += (long)u0 - (uint)carry; + if (borrow != 0) + { + --qhat; + carry = (ulong)u2 + v2; + u2 = (uint)carry; + carry >>= 32; + carry += (ulong)u1 + v1; + u1 = (uint)carry; + } + return (uint)qhat; + } + + private static uint DivRem(uint u0, ref uint u1, ref uint u2, ref uint u3, uint v1, uint v2, uint v3) + { + var qhat = Q(u0, u1, u2, v1, v2); + var carry = qhat * v3; + var borrow = (long)u3 - (uint)carry; + carry >>= 32; + u3 = (uint)borrow; + borrow >>= 32; + carry += qhat * v2; + borrow += (long)u2 - (uint)carry; + carry >>= 32; + u2 = (uint)borrow; + borrow >>= 32; + carry += qhat * v1; + borrow += (long)u1 - (uint)carry; + carry >>= 32; + u1 = (uint)borrow; + borrow >>= 32; + borrow += (long)u0 - (uint)carry; + if (borrow != 0) + { + --qhat; + carry = (ulong)u3 + v3; + u3 = (uint)carry; + carry >>= 32; + carry += (ulong)u2 + v2; + u2 = (uint)carry; + carry >>= 32; + carry += (ulong)u1 + v1; + u1 = (uint)carry; + } + return (uint)qhat; + } + + private static uint DivRem(uint u0, ref uint u1, ref uint u2, ref uint u3, ref uint u4, uint v1, uint v2, uint v3, uint v4) + { + var qhat = Q(u0, u1, u2, v1, v2); + var carry = qhat * v4; + var borrow = (long)u4 - (uint)carry; + carry >>= 32; + u4 = (uint)borrow; + borrow >>= 32; + carry += qhat * v3; + borrow += (long)u3 - (uint)carry; + carry >>= 32; + u3 = (uint)borrow; + borrow >>= 32; + carry += qhat * v2; + borrow += (long)u2 - (uint)carry; + carry >>= 32; + u2 = (uint)borrow; + borrow >>= 32; + carry += qhat * v1; + borrow += (long)u1 - (uint)carry; + carry >>= 32; + u1 = (uint)borrow; + borrow >>= 32; + borrow += (long)u0 - (uint)carry; + if (borrow != 0) + { + --qhat; + carry = (ulong)u4 + v4; + u4 = (uint)carry; + carry >>= 32; + carry += (ulong)u3 + v3; + u3 = (uint)carry; + carry >>= 32; + carry += (ulong)u2 + v2; + u2 = (uint)carry; + carry >>= 32; + carry += (ulong)u1 + v1; + u1 = (uint)carry; + } + return (uint)qhat; + } + + public static void ModAdd(out UInt128 c, ref UInt128 a, ref UInt128 b, ref UInt128 modulus) + { + Add(out c, ref a, ref b); + if (!LessThan(ref c, ref modulus) || LessThan(ref c, ref a) && LessThan(ref c, ref b)) + Subtract(ref c, ref modulus); + } + + public static void ModSub(out UInt128 c, ref UInt128 a, ref UInt128 b, ref UInt128 modulus) + { + Subtract(out c, ref a, ref b); + if (LessThan(ref a, ref b)) + Add(ref c, ref modulus); + } + + public static void ModMul(out UInt128 c, ref UInt128 a, ref UInt128 b, ref UInt128 modulus) + { + if (modulus.s1 == 0) + { + UInt128 product; + Multiply64(out product, a.s0, b.s0); + Create(out c, UInt128.Remainder(ref product, modulus.s0)); + } + else + { + UInt256 product; + Multiply(out product, ref a, ref b); + Remainder(out c, ref product, ref modulus); + } + } + + public static void ModMul(ref UInt128 a, ref UInt128 b, ref UInt128 modulus) + { + if (modulus.s1 == 0) + { + UInt128 product; + Multiply64(out product, a.s0, b.s0); + Create(out a, UInt128.Remainder(ref product, modulus.s0)); + } + else + { + UInt256 product; + Multiply(out product, ref a, ref b); + Remainder(out a, ref product, ref modulus); + } + } + + public static void ModPow(out UInt128 result, ref UInt128 value, ref UInt128 exponent, ref UInt128 modulus) + { + result = one; + var v = value; + var e = exponent.s0; + if (exponent.s1 != 0) + { + for (var i = 0; i < 64; i++) + { + if ((e & 1) != 0) + ModMul(ref result, ref v, ref modulus); + ModMul(ref v, ref v, ref modulus); + e >>= 1; + } + e = exponent.s1; + } + while (e != 0) + { + if ((e & 1) != 0) + ModMul(ref result, ref v, ref modulus); + if (e != 1) + ModMul(ref v, ref v, ref modulus); + e >>= 1; + } + Debug.Assert(BigInteger.ModPow(value, exponent, modulus) == result); + } + + public static void Shift(out UInt128 c, ref UInt128 a, int d) + { + if (d < 0) + RightShift(out c, ref a, -d); + else + LeftShift(out c, ref a, d); + } + + public static void ArithmeticShift(out UInt128 c, ref UInt128 a, int d) + { + if (d < 0) + ArithmeticRightShift(out c, ref a, -d); + else + LeftShift(out c, ref a, d); + } + + public static ulong LeftShift64(out UInt128 c, ref UInt128 a, int d) + { + if (d == 0) + { + c = a; + return 0; + } + var dneg = 64 - d; + c.s1 = a.s1 << d | a.s0 >> dneg; + c.s0 = a.s0 << d; + return a.s1 >> dneg; + } + + private static ulong LeftShift64(out UInt256 c, ref UInt256 a, int d) + { + if (d == 0) + { + c = a; + return 0; + } + var dneg = 64 - d; + c.s3 = a.s3 << d | a.s2 >> dneg; + c.s2 = a.s2 << d | a.s1 >> dneg; + c.s1 = a.s1 << d | a.s0 >> dneg; + c.s0 = a.s0 << d; + return a.s3 >> dneg; + } + + public static void LeftShift(out UInt128 c, ref UInt128 a, int b) + { + if (b < 64) + LeftShift64(out c, ref a, b); + else if (b == 64) + { + c.s0 = 0; + c.s1 = a.s0; + return; + } + else + { + c.s0 = 0; + c.s1 = a.s0 << (b - 64); + } + } + + public static void RightShift64(out UInt128 c, ref UInt128 a, int b) + { + if (b == 0) + c = a; + else + { + c.s0 = a.s0 >> b | a.s1 << (64 - b); + c.s1 = a.s1 >> b; + } + } + + public static void RightShift(out UInt128 c, ref UInt128 a, int b) + { + if (b < 64) + RightShift64(out c, ref a, b); + else if (b == 64) + { + c.s0 = a.s1; + c.s1 = 0; + } + else + { + c.s0 = a.s1 >> (b - 64); + c.s1 = 0; + } + } + + public static void ArithmeticRightShift64(out UInt128 c, ref UInt128 a, int b) + { + if (b == 0) + c = a; + else + { + c.s0 = a.s0 >> b | a.s1 << (64 - b); + c.s1 = (ulong)((long)a.s1 >> b); + } + } + + public static void ArithmeticRightShift(out UInt128 c, ref UInt128 a, int b) + { + if (b < 64) + ArithmeticRightShift64(out c, ref a, b); + else if (b == 64) + { + c.s0 = a.s1; + c.s1 = (ulong)((long)a.s1 >> 63); + } + else + { + c.s0 = a.s1 >> (b - 64); + c.s1 = (ulong)((long)a.s1 >> 63); + } + } + + public static void And(out UInt128 c, ref UInt128 a, ref UInt128 b) + { + c.s0 = a.s0 & b.s0; + c.s1 = a.s1 & b.s1; + } + + public static void Or(out UInt128 c, ref UInt128 a, ref UInt128 b) + { + c.s0 = a.s0 | b.s0; + c.s1 = a.s1 | b.s1; + } + + public static void ExclusiveOr(out UInt128 c, ref UInt128 a, ref UInt128 b) + { + c.s0 = a.s0 ^ b.s0; + c.s1 = a.s1 ^ b.s1; + } + + public static void Not(out UInt128 c, ref UInt128 a) + { + c.s0 = ~a.s0; + c.s1 = ~a.s1; + } + + public static void Negate(ref UInt128 a) + { + var s0 = a.s0; + a.s0 = 0 - s0; + a.s1 = 0 - a.s1; + if (s0 > 0) + --a.s1; + } + + + public static void Negate(out UInt128 c, ref UInt128 a) + { + c.s0 = 0 - a.s0; + c.s1 = 0 - a.s1; + if (a.s0 > 0) + --c.s1; + Debug.Assert((BigInteger)c == (BigInteger)(~a + 1)); + } + + public static void Pow(out UInt128 result, ref UInt128 value, uint exponent) + { + result = one; + while (exponent != 0) + { + + if ((exponent & 1) != 0) + { + var previous = result; + Multiply(out result, ref previous, ref value); + } + if (exponent != 1) + { + var previous = value; + Square(out value, ref previous); + } + exponent >>= 1; + } + } + + public static UInt128 Pow(UInt128 value, uint exponent) + { + UInt128 result; + Pow(out result, ref value, exponent); + return result; + } + + private const int maxRepShift = 53; + private static readonly ulong maxRep = (ulong)1 << maxRepShift; + private static readonly UInt128 maxRepSquaredHigh = (ulong)1 << (2 * maxRepShift - 64); + + public static ulong FloorSqrt(UInt128 a) + { + if (a.s1 == 0 && a.s0 <= maxRep) + return (ulong)Math.Sqrt(a.s0); + var s = (ulong)Math.Sqrt(ConvertToDouble(ref a)); + if (a.s1 < maxRepSquaredHigh) + { + UInt128 s2; + Square(out s2, s); + var r = a.s0 - s2.s0; + if (r > long.MaxValue) + --s; + else if (r - (s << 1) <= long.MaxValue) + ++s; + Debug.Assert((BigInteger)s * s <= a && (BigInteger)(s + 1) * (s + 1) > a); + return s; + } + s = FloorSqrt(ref a, s); + Debug.Assert((BigInteger)s * s <= a && (BigInteger)(s + 1) * (s + 1) > a); + return s; + } + + public static ulong CeilingSqrt(UInt128 a) + { + if (a.s1 == 0 && a.s0 <= maxRep) + return (ulong)Math.Ceiling(Math.Sqrt(a.s0)); + var s = (ulong)Math.Ceiling(Math.Sqrt(ConvertToDouble(ref a))); + if (a.s1 < maxRepSquaredHigh) + { + UInt128 s2; + Square(out s2, s); + var r = s2.s0 - a.s0; + if (r > long.MaxValue) + ++s; + else if (r - (s << 1) <= long.MaxValue) + --s; + Debug.Assert((BigInteger)(s - 1) * (s - 1) < a && (BigInteger)s * s >= a); + return s; + } + s = FloorSqrt(ref a, s); + UInt128 square; + Square(out square, s); + if (square.S0 != a.S0 || square.S1 != a.S1) + ++s; + Debug.Assert((BigInteger)(s - 1) * (s - 1) < a && (BigInteger)s * s >= a); + return s; + } + + private static ulong FloorSqrt(ref UInt128 a, ulong s) + { + var sprev = (ulong)0; + UInt128 div; + UInt128 sum; + while (true) + { + // Equivalent to: + // snext = (a / s + s) / 2; + Divide(out div, ref a, s); + Add(out sum, ref div, s); + var snext = sum.S0 >> 1; + if (sum.S1 != 0) + snext |= (ulong)1 << 63; + if (snext == sprev) + { + if (snext < s) + s = snext; + break; + } + sprev = s; + s = snext; + } + return s; + } + + public static ulong FloorCbrt(UInt128 a) + { + var s = (ulong)Math.Pow(ConvertToDouble(ref a), (double)1 / 3); + UInt128 s3; + Cube(out s3, s); + if (a < s3) + --s; + else + { + UInt128 sum; + Multiply(out sum, 3 * s, s + 1); + UInt128 diff; + Subtract(out diff, ref a, ref s3); + if (LessThan(ref sum, ref diff)) + ++s; + } + Debug.Assert((BigInteger)s * s * s <= a && (BigInteger)(s + 1) * (s + 1) * (s + 1) > a); + return s; + } + + public static ulong CeilingCbrt(UInt128 a) + { + var s = (ulong)Math.Ceiling(Math.Pow(ConvertToDouble(ref a), (double)1 / 3)); + UInt128 s3; + Cube(out s3, s); + if (s3 < a) + ++s; + else + { + UInt128 sum; + Multiply(out sum, 3 * s, s + 1); + UInt128 diff; + Subtract(out diff, ref s3, ref a); + if (LessThan(ref sum, ref diff)) + --s; + } + Debug.Assert((BigInteger)(s - 1) * (s - 1) * (s - 1) < a && (BigInteger)s * s * s >= a); + return s; + } + + public static UInt128 Min(UInt128 a, UInt128 b) + { + if (LessThan(ref a, ref b)) + return a; + return b; + } + + public static UInt128 Max(UInt128 a, UInt128 b) + { + if (LessThan(ref b, ref a)) + return a; + return b; + } + + public static double Log(UInt128 a) + { + return Log(a, Math.E); + } + + public static double Log10(UInt128 a) + { + return Log(a, 10); + } + + public static double Log(UInt128 a, double b) + { + return Math.Log(ConvertToDouble(ref a), b); + } + + public static UInt128 Add(UInt128 a, UInt128 b) + { + UInt128 c; + Add(out c, ref a, ref b); + return c; + } + + public static UInt128 Subtract(UInt128 a, UInt128 b) + { + UInt128 c; + Subtract(out c, ref a, ref b); + return c; + } + + public static UInt128 Multiply(UInt128 a, UInt128 b) + { + UInt128 c; + Multiply(out c, ref a, ref b); + return c; + } + + public static UInt128 Divide(UInt128 a, UInt128 b) + { + UInt128 c; + Divide(out c, ref a, ref b); + return c; + } + + public static UInt128 Remainder(UInt128 a, UInt128 b) + { + UInt128 c; + Remainder(out c, ref a, ref b); + return c; + } + + public static UInt128 DivRem(UInt128 a, UInt128 b, out UInt128 remainder) + { + UInt128 c; + Divide(out c, ref a, ref b); + Remainder(out remainder, ref a, ref b); + return c; + } + + public static UInt128 ModAdd(UInt128 a, UInt128 b, UInt128 modulus) + { + UInt128 c; + ModAdd(out c, ref a, ref b, ref modulus); + return c; + } + + public static UInt128 ModSub(UInt128 a, UInt128 b, UInt128 modulus) + { + UInt128 c; + ModSub(out c, ref a, ref b, ref modulus); + return c; + } + + public static UInt128 ModMul(UInt128 a, UInt128 b, UInt128 modulus) + { + UInt128 c; + ModMul(out c, ref a, ref b, ref modulus); + return c; + } + + public static UInt128 ModPow(UInt128 value, UInt128 exponent, UInt128 modulus) + { + UInt128 result; + ModPow(out result, ref value, ref exponent, ref modulus); + return result; + } + + public static UInt128 Negate(UInt128 a) + { + UInt128 c; + Negate(out c, ref a); + return c; + } + + public static UInt128 GreatestCommonDivisor(UInt128 a, UInt128 b) + { + UInt128 c; + GreatestCommonDivisor(out c, ref a, ref b); + return c; + } + + private static void RightShift64(ref UInt128 c, int d) + { + if (d == 0) + return; + c.s0 = c.s1 << (64 - d) | c.s0 >> d; + c.s1 >>= d; + } + + public static void RightShift(ref UInt128 c, int d) + { + if (d < 64) + RightShift64(ref c, d); + else + { + c.s0 = c.s1 >> (d - 64); + c.s1 = 0; + } + } + + public static void Shift(ref UInt128 c, int d) + { + if (d < 0) + RightShift(ref c, -d); + else + LeftShift(ref c, d); + } + + public static void ArithmeticShift(ref UInt128 c, int d) + { + if (d < 0) + ArithmeticRightShift(ref c, -d); + else + LeftShift(ref c, d); + } + + public static void RightShift(ref UInt128 c) + { + c.s0 = c.s1 << 63 | c.s0 >> 1; + c.s1 >>= 1; + } + + private static void ArithmeticRightShift64(ref UInt128 c, int d) + { + if (d == 0) + return; + c.s0 = c.s1 << (64 - d) | c.s0 >> d; + c.s1 = (ulong)((long)c.s1 >> d); + } + + public static void ArithmeticRightShift(ref UInt128 c, int d) + { + if (d < 64) + ArithmeticRightShift64(ref c, d); + else + { + c.s0 = (ulong)((long)c.s1 >> (d - 64)); + c.s1 = 0; + } + } + + public static void ArithmeticRightShift(ref UInt128 c) + { + c.s0 = c.s1 << 63 | c.s0 >> 1; + c.s1 = (ulong)((long)c.s1 >> 1); + } + + private static ulong LeftShift64(ref UInt128 c, int d) + { + if (d == 0) + return 0; + var dneg = 64 - d; + var result = c.s1 >> dneg; + c.s1 = c.s1 << d | c.s0 >> dneg; + c.s0 <<= d; + return result; + } + + public static void LeftShift(ref UInt128 c, int d) + { + if (d < 64) + LeftShift64(ref c, d); + else + { + c.s1 = c.s0 << (d - 64); + c.s0 = 0; + } + } + + public static void LeftShift(ref UInt128 c) + { + c.s1 = c.s1 << 1 | c.s0 >> 63; + c.s0 <<= 1; + } + + public static void Swap(ref UInt128 a, ref UInt128 b) + { + var as0 = a.s0; + var as1 = a.s1; + a.s0 = b.s0; + a.s1 = b.s1; + b.s0 = as0; + b.s1 = as1; + } + + public static void GreatestCommonDivisor(out UInt128 c, ref UInt128 a, ref UInt128 b) + { + // Check whether one number is > 64 bits and the other is <= 64 bits and both are non-zero. + UInt128 a1, b1; + if ((a.s1 == 0) != (b.s1 == 0) && !a.IsZero && !b.IsZero) + { + // Perform a normal step so that both a and b are <= 64 bits. + if (LessThan(ref a, ref b)) + { + a1 = a; + Remainder(out b1, ref b, ref a); + } + else + { + b1 = b; + Remainder(out a1, ref a, ref b); + } + } + else + { + a1 = a; + b1 = b; + } + + // Make sure neither is zero. + if (a1.IsZero) + { + c = b1; + return; + } + if (b1.IsZero) + { + c = a1; + return; + } + + // Ensure a >= b. + if (LessThan(ref a1, ref b1)) + Swap(ref a1, ref b1); + + // Lehmer-Euclid algorithm. + // See: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.31.693 + while (a1.s1 != 0 && !b.IsZero) + { + // Extract the high 63 bits of a and b. + var norm = 63 - GetBitLength(a1.s1); + UInt128 ahat, bhat; + Shift(out ahat, ref a1, norm); + Shift(out bhat, ref b1, norm); + var uhat = (long)ahat.s1; + var vhat = (long)bhat.s1; + + // Check whether q exceeds single-precision. + if (vhat == 0) + { + // Perform a normal step and try again. + UInt128 rem; + Remainder(out rem, ref a1, ref b1); + a1 = b1; + b1 = rem; + continue; + } + + // Perform steps using signed single-precision arithmetic. + var x0 = (long)1; + var y0 = (long)0; + var x1 = (long)0; + var y1 = (long)1; + var even = true; + while (true) + { + // Calculate quotient, cosquence pair, and update uhat and vhat. + var q = uhat / vhat; + var x2 = x0 - q * x1; + var y2 = y0 - q * y1; + var t = uhat; + uhat = vhat; + vhat = t - q * vhat; + even = !even; + + // Apply Jebelean's termination condition + // to check whether q is valid. + if (even) + { + if (vhat < -x2 || uhat - vhat < y2 - y1) + break; + } + else + { + if (vhat < -y2 || uhat - vhat < x2 - x1) + break; + } + + // Adjust cosequence history. + x0 = x1; y0 = y1; x1 = x2; y1 = y2; + } + + // Check whether a normal step is necessary. + if (x0 == 1 && y0 == 0) + { + UInt128 rem; + Remainder(out rem, ref a1, ref b1); + a1 = b1; + b1 = rem; + continue; + } + + // Back calculate a and b from the last valid cosequence pairs. + UInt128 anew, bnew; + if (even) + { + AddProducts(out anew, y0, ref b1, x0, ref a1); + AddProducts(out bnew, x1, ref a1, y1, ref b1); + } + else + { + AddProducts(out anew, x0, ref a1, y0, ref b1); + AddProducts(out bnew, y1, ref b1, x1, ref a1); + } + a1 = anew; + b1 = bnew; + } + + // Check whether we have any 64 bit work left. + if (!b1.IsZero) + { + var a2 = a1.s0; + var b2 = b1.s0; + + // Perform 64 bit steps. + while (a2 > uint.MaxValue && b2 != 0) + { + var t = a2 % b2; + a2 = b2; + b2 = t; + } + + // Check whether we have any 32 bit work left. + if (b2 != 0) + { + var a3 = (uint)a2; + var b3 = (uint)b2; + + // Perform 32 bit steps. + while (b3 != 0) + { + var t = a3 % b3; + a3 = b3; + b3 = t; + } + + Create(out c, a3); + } + else + Create(out c, a2); + } + else + c = a1; + } + + private static void AddProducts(out UInt128 result, long x, ref UInt128 u, long y, ref UInt128 v) + { + // Compute x * u + y * v assuming y is negative and the result is positive and fits in 128 bits. + UInt128 product1; + Multiply(out product1, ref u, (ulong)x); + UInt128 product2; + Multiply(out product2, ref v, (ulong)(-y)); + Subtract(out result, ref product1, ref product2); + } + + public static int Compare(UInt128 a, UInt128 b) + { + return a.CompareTo(b); + } + + private static byte[] bitLength = Enumerable.Range(0, byte.MaxValue + 1) + .Select(value => + { + int count; + for (count = 0; value != 0; count++) + value >>= 1; + return (byte)count; + }).ToArray(); + + private static int GetBitLength(uint value) + { + var tt = value >> 16; + if (tt != 0) + { + var t = tt >> 8; + if (t != 0) + return bitLength[t] + 24; + return bitLength[tt] + 16; + } + else + { + var t = value >> 8; + if (t != 0) + return bitLength[t] + 8; + return bitLength[value]; + } + } + + private static int GetBitLength(ulong value) + { + var r1 = value >> 32; + if (r1 != 0) + return GetBitLength((uint)r1) + 32; + return GetBitLength((uint)value); + } + + public static void Reduce(out UInt128 w, ref UInt128 u, ref UInt128 v, ref UInt128 n, ulong k0) + { + UInt128 carry; + Multiply64(out carry, u.s0, v.s0); + var t0 = carry.s0; + Multiply64(out carry, u.s1, v.s0, carry.s1); + var t1 = carry.s0; + var t2 = carry.s1; + + var m = t0 * k0; + Multiply64(out carry, m, n.s1, MultiplyHigh64(m, n.s0, t0)); + Add(ref carry, t1); + t0 = carry.s0; + Add(out carry, carry.s1, t2); + t1 = carry.s0; + t2 = carry.s1; + + Multiply64(out carry, u.s0, v.s1, t0); + t0 = carry.s0; + Multiply64(out carry, u.s1, v.s1, carry.s1); + Add(ref carry, t1); + t1 = carry.s0; + Add(out carry, carry.s1, t2); + t2 = carry.s0; + var t3 = carry.s1; + + m = t0 * k0; + Multiply64(out carry, m, n.s1, MultiplyHigh64(m, n.s0, t0)); + Add(ref carry, t1); + t0 = carry.s0; + Add(out carry, carry.s1, t2); + t1 = carry.s0; + t2 = t3 + carry.s1; + + Create(out w, t0, t1); + if (t2 != 0 || !LessThan(ref w, ref n)) + Subtract(ref w, ref n); + } + + public static void Reduce(out UInt128 w, ref UInt128 t, ref UInt128 n, ulong k0) + { + UInt128 carry; + var t0 = t.s0; + var t1 = t.s1; + var t2 = (ulong)0; + + for (var i = 0; i < 2; i++) + { + var m = t0 * k0; + Multiply64(out carry, m, n.s1, MultiplyHigh64(m, n.s0, t0)); + Add(ref carry, t1); + t0 = carry.s0; + Add(out carry, carry.s1, t2); + t1 = carry.s0; + t2 = carry.s1; + } + + Create(out w, t0, t1); + if (t2 != 0 || !LessThan(ref w, ref n)) + Subtract(ref w, ref n); + } + + public static UInt128 Reduce(UInt128 u, UInt128 v, UInt128 n, ulong k0) + { + UInt128 w; + Reduce(out w, ref u, ref v, ref n, k0); + return w; + } + + public static UInt128 Reduce(UInt128 t, UInt128 n, ulong k0) + { + UInt128 w; + Reduce(out w, ref t, ref n, k0); + return w; + } + } +} diff --git a/TBF_V2/Sources/TBF/Dirichlet.Numerics/license.txt b/TBF_V2/Sources/TBF/Dirichlet.Numerics/license.txt new file mode 100644 index 00000000..5e6188c6 --- /dev/null +++ b/TBF_V2/Sources/TBF/Dirichlet.Numerics/license.txt @@ -0,0 +1,13 @@ +Copyright 2014 Rick Sladkey + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/GemCard/APDUCommand.cs b/TBF_V2/Sources/TBF/GemCard/APDUCommand.cs new file mode 100644 index 00000000..6b32fb36 --- /dev/null +++ b/TBF_V2/Sources/TBF/GemCard/APDUCommand.cs @@ -0,0 +1,94 @@ +using System; +using System.Text; + +namespace GemCard +{ + /// + /// This class represents a command APDU + /// + public class APDUCommand + { + /// + /// Minimun size of an APDU command in bytes + /// + public const int APDU_MIN_LENGTH = 4; + + public byte Class; /// Class byte + public byte Ins; /// Instruction byte + public byte P1; /// Parameter P1 byte + public byte P2; /// Parameter P2 byte + public byte[] Data; /// Data to send to the card if any, null if no data to send + public byte Le; /// Number of data expected, 0 if none + + /// + /// Constructor + /// + /// Class byte + /// Instruction byte + /// Parameter P1 byte + /// Parameter P2 byte + /// Data to send to the card if any, null if no data to send + /// Number of data expected, 0 if none + public APDUCommand(byte bCla, byte bIns, byte bP1, byte bP2, byte[] baData, byte bLe) + { + this.Class = bCla; + this.Ins = bIns; + this.P1 = bP1; + this.P2 = bP2; + this.Data = baData; + this.Le = bLe; + } + + + /// + /// Update the current APDU with selected parameters + /// + /// APDU parameters + public void Update(APDUParam apduParam) + { + if (apduParam.UseData) Data = apduParam.Data; + if (apduParam.UseLe) Le = apduParam.Le; + if (apduParam.UseP1) P1 = apduParam.P1; + if (apduParam.UseP2) P2 = apduParam.P2; + if (apduParam.UseChannel) Class += apduParam.Channel; + } + + /// + /// Overrides the ToString method to format to a string the APDUCommand object + /// + /// + public override string ToString() + { + string strData = null; + byte bLc = 0; + byte bP3 = Le; + + if (Data != null) + { + StringBuilder sData = new StringBuilder(Data.Length * 2); + for (int nI = 0; nI < Data.Length; nI++) + { + sData.AppendFormat("{0:X02}", Data[nI]); + } + + strData = "Data=" + sData.ToString(); + bLc = (byte) Data.Length; + bP3 = bLc; + } + + //string strApdu = string.Format("Class={0:X02} Ins={1:X02} P1={2:X02} P2={3:X02} Le={4:X02} Lc={5:X02} ", + //m_bCla, m_bIns, m_bP1, m_bP2, m_bLe, bLc); + StringBuilder strApdu = new StringBuilder(); + + strApdu.AppendFormat("Class={0:X02} Ins={1:X02} P1={2:X02} P2={3:X02} P3={4:X02} ", + Class, Ins, P1, P2, bP3); + + if (Data != null) + { + strApdu.Append(strData); + } + + return strApdu.ToString(); + } + } +} diff --git a/TBF_V2/Sources/TBF/GemCard/APDUParam.cs b/TBF_V2/Sources/TBF/GemCard/APDUParam.cs new file mode 100644 index 00000000..a9be136f --- /dev/null +++ b/TBF_V2/Sources/TBF/GemCard/APDUParam.cs @@ -0,0 +1,147 @@ +using System; + +namespace GemCard +{ + /// + /// This class is used to update a set of parameters of an APDUCommand object + /// + public class APDUParam + { + byte bClass; + byte bChannel; + byte bP2; + byte bP1; + + byte[] baData; + short nLe; + + bool fUseP1; + bool fUseP2; + bool fChannel; + bool fData; + bool fClass; + bool fLe; + + /// + /// Resets the current instance, all flags are set to false + /// + public void Reset() + { + bClass = 0; + bChannel = 0; + bP2 = 0; + bP1 = 0; + + baData = null; + nLe = -1; + + fUseP1 = false; + fUseP2 = false; + fChannel = false; + fData = false; + fClass = false; + fLe = false; + } + + #region Constructors + + public APDUParam() + { + Reset(); + } + + /// + /// Copy constructor (used for cloning) + /// + /// + public APDUParam(APDUParam param) + { + // Copy field + if (param.baData != null) + { + param.baData.CopyTo(baData, 0); + } + + this.bClass = param.bClass; + this.bChannel = param.bChannel; + this.bP1 = param.bP1; + this.bP2 = param.bP2; + this.nLe = param.nLe; + + // Copy flags field + this.fChannel = param.fChannel; + this.fClass = param.fClass; + this.fData = param.fData; + this.fLe = param.fLe; + this.fUseP1 = param.fUseP1; + this.fUseP2 = param.fUseP2; + } + + public APDUParam(byte bClass, byte bP1, byte bP2, byte[] baData, short nLe) + { + this.Class = bClass; + this.P1 = bP1; + this.P2 = bP2; + this.Data = baData; + this.Le = (byte)nLe; + } + + #endregion + + /// + /// Clones the current APDUParam instance + /// + /// + public APDUParam Clone() + { + return new APDUParam(this); + } + + #region Properties + + public bool UseClass { get { return fClass; } } + public bool UseChannel { get { return fChannel; } } + public bool UseLe { get { return fLe; } } + public bool UseData { get { return fData; } } + public bool UseP1 { get { return fUseP1; } } + public bool UseP2 { get { return fUseP2; } } + + public byte P1 + { + get { return bP1; } + set { bP1 = value; fUseP1 = true; } + } + + public byte P2 + { + get { return bP2; } + set { bP2 = value; fUseP2 = true; } + } + + public byte[] Data + { + get { return baData; } + set { baData = value; fData = true; } + } + + public byte Le + { + get { return (byte)nLe; } + set { nLe = value; fLe = true; } + } + + public byte Channel + { + get { return bChannel; } + set { bChannel = value; fChannel = true; } + } + + public byte Class + { + get { return bClass; } + set { bClass = value; fClass = true; } + } + + #endregion + } +} diff --git a/TBF_V2/Sources/TBF/GemCard/APDUResponse.cs b/TBF_V2/Sources/TBF/GemCard/APDUResponse.cs new file mode 100644 index 00000000..f54171a4 --- /dev/null +++ b/TBF_V2/Sources/TBF/GemCard/APDUResponse.cs @@ -0,0 +1,74 @@ +using System; +using System.Text; + +namespace GemCard +{ + /// + /// This class represents the APDU response sent by the card + /// + public class APDUResponse + { + /// + /// Status bytes length + /// + public const int SW_LENGTH = 2; + + /// + /// Response data. Contains the data sent by the card minus the 2 status bytes (SW1, SW2) + /// null if no data were sent by the card + /// + public byte[] Data; + public byte SW1; + public byte SW2; + + /// + /// Status get property + /// + public ushort Status + { + get { return (ushort)(((short)SW1 << 8) + (short)SW2); } + } + + /// + /// Constructor from the byte data sent back by the card + /// + /// Buffer of data from the card + public APDUResponse(byte[] baData) + { + if (baData.Length > SW_LENGTH) + { + Data = new byte[baData.Length - SW_LENGTH]; + + for (int nI = 0; nI < baData.Length - SW_LENGTH; nI++) + { + this.Data[nI] = baData[nI]; + } + } + + this.SW1 = baData[baData.Length - 2]; + this.SW2 = baData[baData.Length - 1]; + } + + /// + /// Overrides the ToString method to format to a string the APDUResponse object + /// + /// + public override string ToString() + { + if (Data != null) + { + StringBuilder sData = new StringBuilder(Data.Length * 2); + for (int nI = 0; nI < Data.Length; nI++) + { + sData.AppendFormat("{0:X02}", Data[nI]); + } + + return sData.ToString(); + } + else + { + return string.Empty; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/GemCard/AssemblyInfo.cs b/TBF_V2/Sources/TBF/GemCard/AssemblyInfo.cs new file mode 100644 index 00000000..9f89a328 --- /dev/null +++ b/TBF_V2/Sources/TBF/GemCard/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/TBF_V2/Sources/TBF/GemCard/CardBase.cs b/TBF_V2/Sources/TBF/GemCard/CardBase.cs new file mode 100644 index 00000000..3c4ae310 --- /dev/null +++ b/TBF_V2/Sources/TBF/GemCard/CardBase.cs @@ -0,0 +1,162 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; + +namespace GemCard +{ + /// + /// Values for AttrId of SCardGetAttrib + /// + public class SCARD_ATTR_VALUE + { + private const uint + SCARD_CLASS_COMMUNICATIONS = 2, + SCARD_CLASS_PROTOCOL = 3, + SCARD_CLASS_MECHANICAL = 6, + SCARD_CLASS_VENDOR_DEFINED = 7, + SCARD_CLASS_IFD_PROTOCOL = 8, + SCARD_CLASS_ICC_STATE = 9, + SCARD_CLASS_SYSTEM = 0x7fff; + + private static UInt32 SCardAttrValue(UInt32 attrClass, UInt32 val) + { + return (attrClass << 16) | val; + } + + public static UInt32 CHANNEL_ID { get { return SCardAttrValue(SCARD_CLASS_COMMUNICATIONS, 0x0110); } } + + public static UInt32 CHARACTERISTICS { get { return SCardAttrValue(SCARD_CLASS_MECHANICAL, 0x0150); } } + + public static UInt32 CURRENT_PROTOCOL_TYPE { get { return SCardAttrValue(SCARD_CLASS_IFD_PROTOCOL, 0x0201); } } + + public static UInt32 DEVICE_UNIT { get { return SCardAttrValue(SCARD_CLASS_SYSTEM, 0x0001); } } + public static UInt32 DEVICE_FRIENDLY_NAME { get { return SCardAttrValue(SCARD_CLASS_SYSTEM, 0x0003); } } + public UInt32 DEVICE_SYSTEM_NAME { get { return SCardAttrValue(SCARD_CLASS_SYSTEM, 0x0004); } } + + public static UInt32 ICC_PRESENCE { get { return SCardAttrValue(SCARD_CLASS_ICC_STATE, 0x0300); } } + public static UInt32 ICC_INTERFACE_STATUS { get { return SCardAttrValue(SCARD_CLASS_ICC_STATE, 0x0301); } } + public static UInt32 ATR_STRING { get { return SCardAttrValue(SCARD_CLASS_ICC_STATE, 0x0303); } } + public static UInt32 ICC_TYPE_PER_ATR { get { return SCardAttrValue(SCARD_CLASS_ICC_STATE, 0x0304); } } + + public static UInt32 PROTOCOL_TYPES { get { return SCardAttrValue(SCARD_CLASS_PROTOCOL, 0x0120); } } + + public static UInt32 VENDOR_NAME { get { return SCardAttrValue(SCARD_CLASS_VENDOR_DEFINED, 0x0100); } } + public static UInt32 VENDOR_IFD_TYPE { get { return SCardAttrValue(SCARD_CLASS_VENDOR_DEFINED, 0x0101); } } + public static UInt32 VENDOR_IFD_VERSION { get { return SCardAttrValue(SCARD_CLASS_VENDOR_DEFINED, 0x0102); } } + public static UInt32 VENDOR_IFD_SERIAL_NO { get { return SCardAttrValue(SCARD_CLASS_VENDOR_DEFINED, 0x0103); } } + } + + /// + /// Abstract class that adds a basic event management to the ICard interface. + /// + abstract public class CardBase : ICard + { + protected const uint INFINITE = 0xFFFFFFFF; + protected const uint WAIT_TIME = 250; + + protected bool m_bRunCardDetection = true; + protected Thread m_thread = null; + + /// + /// Event handler for the card insertion + /// + public event EventHandler OnCardInserted = null; + + /// + /// Event handler for the card removal + /// + public event EventHandler OnCardRemoved = null; + + ~CardBase() + { + // Stop any eventual card detection thread + StopCardEvents(); + } + + #region Abstract method that implement the ICard interface + abstract public string[] ListReaders(); + abstract public void Connect(string Reader, SHARE ShareMode, PROTOCOL PreferredProtocols); + abstract public void Disconnect(DISCONNECT Disposition); + abstract public APDUResponse Transmit(APDUCommand ApduCmd); + abstract public void BeginTransaction(); + abstract public void EndTransaction(DISCONNECT Disposition); + abstract public byte[] GetAttribute(UInt32 AttribId); + #endregion + + /// + /// This method should start a thread that checks for card insertion or removal + /// + /// + public void StartCardEvents(string Reader) + { + if (m_thread == null) + { + m_bRunCardDetection = true; + + m_thread = new Thread(new ParameterizedThreadStart(RunCardDetection)); + m_thread.Start(Reader); + } + } + + /// + /// Stops the card events thread + /// + public void StopCardEvents() + { + if (m_thread != null) + { + int + nTimeOut = 10, + nCount = 0; + bool m_bStop = false; + m_bRunCardDetection = false; + + do + { + if (nCount > nTimeOut) + { + m_thread.Abort(); + break; + } + + if (m_thread.ThreadState == ThreadState.Aborted) + m_bStop = true; + + if (m_thread.ThreadState == ThreadState.Stopped) + m_bStop = true; + + Thread.Sleep(200); + ++nCount; // Manage time out + } + while (!m_bStop); + + m_thread = null; + } + } + + /// + /// This function must implement a card detection mechanism. + /// + /// When card insertion is detected, it must call the method CardInserted() + /// When card removal is detected, it must call the method CardRemoved() + /// + /// + /// Name of the reader to scan for card event + abstract protected void RunCardDetection(object Reader); + + #region Event methods + + protected void CardInserted(object sender, CardInsertedEventArgs args) + { + if (OnCardInserted != null) OnCardInserted(sender, args); + } + + protected void CardRemoved(object sender, CardRemovedEventArgs args) + { + if (OnCardRemoved != null) OnCardRemoved(sender, args); + } + + #endregion + } +} diff --git a/TBF_V2/Sources/TBF/GemCard/CardCOM.cs b/TBF_V2/Sources/TBF/GemCard/CardCOM.cs new file mode 100644 index 00000000..26269999 --- /dev/null +++ b/TBF_V2/Sources/TBF/GemCard/CardCOM.cs @@ -0,0 +1,173 @@ +using System; +using System.Runtime.InteropServices; +using SCARDSSPLib; +using GemCardExLib; + +namespace GemCard +{ + /// + /// Implements the ICard interface using the SCard COM objects from Microsoft and SCardDatabaseEx object + /// for the ListReaders function. + /// + public class CardCOM : CardBase + { + private ISCard m_itfCard = null; + + /// + /// Default constructor + /// + public CardCOM() + { + // Create the SCard object + m_itfCard = new CSCardClass(); + } + + #region ICard Members + + /// + /// Wraps the PCSC function + /// LONG SCardListReaders(SCARDCONTEXT hContext, + /// LPCTSTR mszGroups, + /// LPTSTR mszReaders, + /// LPDWORD pcchReaders + /// ); + /// + /// A string array of the readers + public override string[] ListReaders() + { + ISCardDatabaseEx itfCardBase = new SCardDatabaseEx(); + + return (string[]) itfCardBase.ListReaders(); + } + + /// + /// Wraps the PCSC function + /// LONG SCardConnect( + /// IN SCARDCONTEXT hContext, + /// IN LPCTSTR szReader, + /// IN DWORD dwShareMode, + /// IN DWORD dwPreferredProtocols, + /// OUT LPSCARDHANDLE phCard, + /// OUT LPDWORD pdwActiveProtocol + /// ); + /// + /// + /// + /// + public override void Connect(string Reader, SHARE ShareMode, PROTOCOL PreferredProtocols) + { + // Calls AttachReader to connect to the card + m_itfCard.AttachByReader(Reader, (SCARD_SHARE_MODES) ShareMode, (SCARD_PROTOCOLS) PreferredProtocols); + } + + /// + /// Wraps the PCSC function + /// LONG SCardDisconnect( + /// IN SCARDHANDLE hCard, + /// IN DWORD dwDisposition + /// ); + /// + /// + public override void Disconnect(DISCONNECT Disposition) + { + // Off the connection with the card + m_itfCard.Detach((SCARD_DISPOSITIONS) Disposition); + } + + /// + /// Wraps the PCSC function + /// LONG SCardTransmit( + /// SCARDHANDLE hCard, + /// LPCSCARD_I0_REQUEST pioSendPci, + /// LPCBYTE pbSendBuffer, + /// DWORD cbSendLength, + /// LPSCARD_IO_REQUEST pioRecvPci, + /// LPBYTE pbRecvBuffer, + /// LPDWORD pcbRecvLength + /// ); + /// + /// APDUCommand object with the APDU to send to the card + /// An APDUResponse object with the response from the card + public override APDUResponse Transmit(APDUCommand ApduCmd) + { + CSCardCmd itfCmd = new CSCardCmdClass(); + CByteBuffer itfData = new CByteBufferClass(); + int nLe = ApduCmd.Le; + + if (ApduCmd.Data == null) + { + itfData.SetSize(0); + } + else + { + int nWrite = 0; + + itfData.SetSize(ApduCmd.Data.Length); + itfData.Write(ref ApduCmd.Data[0], ApduCmd.Data.Length, ref nWrite); + } + + // Build the APDU command + itfCmd.BuildCmd(ApduCmd.Class, ApduCmd.Ins, ApduCmd.P1, ApduCmd.P2, itfData, ref nLe); + + // Send the command + m_itfCard.Transaction(ref itfCmd); + + // Analyse the response + int nRead = 0; + byte[] pbResp = new byte[itfCmd.ApduReplyLength]; + + itfCmd.ApduReply.Read(ref pbResp[0], itfCmd.ApduReplyLength, ref nRead); + + return new APDUResponse(pbResp); + } + + /// + /// Wraps the PSCS function + /// LONG SCardBeginTransaction( + /// SCARDHANDLE hCard + // ); + /// This function is not supported in the COM implementation + /// + public override void BeginTransaction() + { + throw new NotImplementedException("BeginTransaction is not supported in the COM implementation"); + } + + /// + /// Wraps the PCSC function + /// LONG SCardEndTransaction( + /// SCARDHANDLE hCard, + /// DWORD dwDisposition + /// ); + /// This function is not supported in the COM implementation + /// + /// A value from DISCONNECT enum + public override void EndTransaction(DISCONNECT Disposition) + { + throw new NotImplementedException("EndTransaction is not supported in the COM implementation"); + } + + /// + /// Gets the attributes of the card + /// + /// Identifier for the Attribute to get + /// Attribute content + public override byte[] GetAttribute(UInt32 AttribId) + { + throw new NotImplementedException(); + } + #endregion + + /// + /// This function must implement a card detection mechanism. + /// + /// When card insertion is detected, it must call the method CardInserted() + /// When card removal is detected, it must call the method CardRemoved() + /// + /// + protected override void RunCardDetection(object Reader) + { + throw new Exception("The method or operation is not implemented."); + } + } +} diff --git a/TBF_V2/Sources/TBF/GemCard/CardInsertedEventArgs.cs b/TBF_V2/Sources/TBF/GemCard/CardInsertedEventArgs.cs new file mode 100644 index 00000000..affae319 --- /dev/null +++ b/TBF_V2/Sources/TBF/GemCard/CardInsertedEventArgs.cs @@ -0,0 +1,9 @@ +using System; + +namespace GemCard +{ + public class CardInsertedEventArgs : EventArgs + { + public CardInsertedEventArgs() { } + } +} diff --git a/TBF_V2/Sources/TBF/GemCard/CardNative.cs b/TBF_V2/Sources/TBF/GemCard/CardNative.cs new file mode 100644 index 00000000..fc7d0212 --- /dev/null +++ b/TBF_V2/Sources/TBF/GemCard/CardNative.cs @@ -0,0 +1,620 @@ +using System; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading; + +namespace GemCard +{ + /// + /// CARD_STATE enumeration, used by the PC/SC function SCardGetStatusChanged + /// + enum CARD_STATE + { + UNAWARE = 0x00000000, + IGNORE = 0x00000001, + CHANGED = 0x00000002, + UNKNOWN = 0x00000004, + UNAVAILABLE = 0x00000008, + EMPTY = 0x00000010, + PRESENT = 0x00000020, + ATRMATCH = 0x00000040, + EXCLUSIVE = 0x00000080, + INUSE = 0x00000100, + MUTE = 0x00000200, + UNPOWERED = 0x00000400 + } + + /// + /// Wraps the SCARD_IO_STRUCTURE + /// + /// + [StructLayout(LayoutKind.Sequential)] + public struct SCard_IO_Request + { + public UInt32 m_dwProtocol; + public UInt32 m_cbPciLength; + } + + + /// + /// Wraps theSCARD_READERSTATE structure of PC/SC + /// + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] + public struct SCard_ReaderState + { + public string m_szReader; + public IntPtr m_pvUserData; + public UInt32 m_dwCurrentState; + public UInt32 m_dwEventState; + public UInt32 m_cbAtr; + [MarshalAs(UnmanagedType.ByValArray, SizeConst=32)] + public byte[] m_rgbAtr; + } + + /// + /// Implementation of ICard using native (P/Invoke) interoperability for PC/SC + /// + public class CardNative : CardBase + { + private UInt32 m_hContext = 0; + private UInt32 m_hCard = 0; + private UInt32 m_nProtocol = (uint) PROTOCOL.T0; + private int m_nLastError = 0; + + #region PCSC_FUNCTIONS + /// + /// Native SCardGetStatusChanged from winscard.dll + /// + /// + /// + /// + /// + /// + [DllImport("winscard.dll", SetLastError = true)] + internal static extern int SCardGetStatusChange(UInt32 hContext, + UInt32 dwTimeout, + [In,Out] SCard_ReaderState[] rgReaderStates, + UInt32 cReaders); + + /// + /// Native SCardListReaders function from winscard.dll + /// + /// + /// + /// + /// + /// + [DllImport("winscard.dll", SetLastError=true)] + internal static extern int SCardListReaders(UInt32 hContext, + [MarshalAs(UnmanagedType.LPTStr)] string mszGroups, + IntPtr mszReaders, + out UInt32 pcchReaders); + + /// + /// Native SCardEstablishContext function from winscard.dll + /// + /// + /// + /// + /// + /// + [DllImport("winscard.dll", SetLastError=true)] + internal static extern int SCardEstablishContext(UInt32 dwScope, + IntPtr pvReserved1, + IntPtr pvReserved2, + IntPtr phContext); + + /// + /// Native SCardReleaseContext function from winscard.dll + /// + /// + /// + [DllImport("winscard.dll", SetLastError=true)] + internal static extern int SCardReleaseContext(UInt32 hContext); + + /// + /// Native SCardConnect function from winscard.dll + /// + /// + /// + /// + /// + /// + /// + /// + [DllImport("winscard.dll", SetLastError=true, CharSet=CharSet.Auto)] + internal static extern int SCardConnect(UInt32 hContext, + [MarshalAs(UnmanagedType.LPTStr)] string szReader, + UInt32 dwShareMode, + UInt32 dwPreferredProtocols, + IntPtr phCard, + IntPtr pdwActiveProtocol); + + /// + /// Native SCardDisconnect function from winscard.dll + /// + /// + /// + /// + [DllImport("winscard.dll", SetLastError=true)] + internal static extern int SCardDisconnect(UInt32 hCard, + UInt32 dwDisposition); + + /// + /// Native SCardTransmit function from winscard.dll + /// + /// + /// + /// + /// + /// + /// + /// + /// + [DllImport("winscard.dll", SetLastError=true)] + internal static extern int SCardTransmit(UInt32 hCard, + [In] ref SCard_IO_Request pioSendPci, + byte[] pbSendBuffer, + UInt32 cbSendLength, + IntPtr pioRecvPci, + [Out] byte[] pbRecvBuffer, + out UInt32 pcbRecvLength + ); + + /// + /// Native SCardBeginTransaction function of winscard.dll + /// + /// + /// + [DllImport("winscard.dll", SetLastError = true)] + internal static extern int SCardBeginTransaction(UInt32 hContext); + + /// + /// Native SCardEndTransaction function of winscard.dll + /// + /// + /// + [DllImport("winscard.dll", SetLastError = true)] + internal static extern int SCardEndTransaction(UInt32 hContext, UInt32 dwDisposition); + + [DllImport("winscard.dll", SetLastError = true)] + internal static extern int SCardGetAttrib(UInt32 hCard, + UInt32 dwAttribId, + [Out] byte[] pbAttr, + out UInt32 pcbAttrLen); + + #endregion + + /// + /// Default constructor + /// + public CardNative() + { + } + + /// + /// Object destruction + /// + ~CardNative() + { + Disconnect(DISCONNECT.Unpower); + + ReleaseContext(); + } + + #region ICard Members + + /// + /// Wraps the PCSC function + /// LONG SCardListReaders(SCARDCONTEXT hContext, + /// LPCTSTR mszGroups, + /// LPTSTR mszReaders, + /// LPDWORD pcchReaders + /// ); + /// + /// A string array of the readers + public override string[] ListReaders() + { + EstablishContext(SCOPE.User); + + string[] sListReaders = null; + UInt32 pchReaders = 0; + IntPtr szListReaders = IntPtr.Zero; + + m_nLastError = SCardListReaders(m_hContext, null, szListReaders, out pchReaders); + if (m_nLastError == 0) + { + szListReaders = Marshal.AllocHGlobal((int) pchReaders); + m_nLastError = SCardListReaders(m_hContext, null, szListReaders, out pchReaders); + if (m_nLastError == 0) + { + char[] caReadersData = new char[pchReaders]; + int nbReaders = 0; + for (int nI = 0; nI < pchReaders; nI++) + { + caReadersData[nI] = (char) Marshal.ReadByte(szListReaders, nI); + + if (caReadersData[nI] == 0) + nbReaders++; + } + + // Remove last 0 + --nbReaders; + + if (nbReaders != 0) + { + sListReaders = new string[nbReaders]; + char[] caReader = new char[pchReaders]; + int nIdx = 0; + int nIdy = 0; + int nIdz = 0; + // Get the nJ string from the multi-string + + while(nIdx < pchReaders - 1) + { + caReader[nIdy] = caReadersData[nIdx]; + if (caReader[nIdy] == 0) + { + sListReaders[nIdz] = new string(caReader, 0, nIdy); + ++nIdz; + nIdy = 0; + caReader = new char[pchReaders]; + } + else + ++nIdy; + + ++nIdx; + } + } + + } + + Marshal.FreeHGlobal(szListReaders); + } + + ReleaseContext(); + + return sListReaders; + } + + /// + /// Wraps the PCSC function + /// LONG SCardEstablishContext( + /// IN DWORD dwScope, + /// IN LPCVOID pvReserved1, + /// IN LPCVOID pvReserved2, + /// OUT LPSCARDCONTEXT phContext + /// ); + /// + /// + public void EstablishContext(SCOPE Scope) + { + IntPtr hContext = Marshal.AllocHGlobal(Marshal.SizeOf(m_hContext)); + + m_nLastError = SCardEstablishContext((uint) Scope, IntPtr.Zero, IntPtr.Zero, hContext); + if (m_nLastError != 0) + { + string msg = "SCardEstablishContext error: " + m_nLastError; + + Marshal.FreeHGlobal(hContext); + throw new Exception(msg); + } + + m_hContext = (uint) Marshal.ReadInt32(hContext); + + Marshal.FreeHGlobal(hContext); + } + + + /// + /// Wraps the PCSC function + /// LONG SCardReleaseContext( + /// IN SCARDCONTEXT hContext + /// ); + /// + public void ReleaseContext() + { + if (m_hContext != 0) + { + m_nLastError = SCardReleaseContext(m_hContext); + + if (m_nLastError != 0) + { + string msg = "SCardReleaseContext error: " + m_nLastError; + throw new Exception(msg); + } + + m_hContext = 0; + } + } + + /// + /// Wraps the PCSC function + /// LONG SCardConnect( + /// IN SCARDCONTEXT hContext, + /// IN LPCTSTR szReader, + /// IN DWORD dwShareMode, + /// IN DWORD dwPreferredProtocols, + /// OUT LPSCARDHANDLE phCard, + /// OUT LPDWORD pdwActiveProtocol + /// ); + /// + /// + /// + /// + public override void Connect(string Reader, SHARE ShareMode, PROTOCOL PreferredProtocols) + { + EstablishContext(SCOPE.User); + + IntPtr hCard = Marshal.AllocHGlobal(Marshal.SizeOf(m_hCard)); + IntPtr pProtocol = Marshal.AllocHGlobal(Marshal.SizeOf(m_nProtocol)); + + m_nLastError = SCardConnect(m_hContext, + Reader, + (uint) ShareMode, + (uint) PreferredProtocols, + hCard, + pProtocol); + + if (m_nLastError != 0) + { + string msg = "SCardConnect error: " + m_nLastError; + + Marshal.FreeHGlobal(hCard); + Marshal.FreeHGlobal(pProtocol); + throw new Exception(msg); + } + + m_hCard = (uint) Marshal.ReadInt32(hCard); + m_nProtocol = (uint) Marshal.ReadInt32(pProtocol); + + Marshal.FreeHGlobal(hCard); + Marshal.FreeHGlobal(pProtocol); + } + + /// + /// Wraps the PCSC function + /// LONG SCardDisconnect( + /// IN SCARDHANDLE hCard, + /// IN DWORD dwDisposition + /// ); + /// + /// + public override void Disconnect(DISCONNECT Disposition) + { + if (m_hCard != 0) + { + m_nLastError = SCardDisconnect(m_hCard, (uint) Disposition); + m_hCard = 0; + + if (m_nLastError != 0) + { + string msg = "SCardDisconnect error: " + m_nLastError; + throw new Exception(msg); + } + + ReleaseContext(); + } + } + + /// + /// Wraps the PCSC function + /// LONG SCardTransmit( + /// SCARDHANDLE hCard, + /// LPCSCARD_I0_REQUEST pioSendPci, + /// LPCBYTE pbSendBuffer, + /// DWORD cbSendLength, + /// LPSCARD_IO_REQUEST pioRecvPci, + /// LPBYTE pbRecvBuffer, + /// LPDWORD pcbRecvLength + /// ); + /// + /// APDUCommand object with the APDU to send to the card + /// An APDUResponse object with the response from the card + public override APDUResponse Transmit(APDUCommand ApduCmd) + { + uint RecvLength = (uint) (ApduCmd.Le + APDUResponse.SW_LENGTH); + byte[] ApduBuffer = null; + byte[] ApduResponse = new byte[ApduCmd.Le + APDUResponse.SW_LENGTH]; + SCard_IO_Request ioRequest = new SCard_IO_Request(); + ioRequest.m_dwProtocol = m_nProtocol; + ioRequest.m_cbPciLength = 8; + + // Build the command APDU + if (ApduCmd.Data == null) + { + ApduBuffer = new byte[APDUCommand.APDU_MIN_LENGTH + ((ApduCmd.Le != 0) ? 1 : 0)]; + + if (ApduCmd.Le != 0) + ApduBuffer[4] = (byte) ApduCmd.Le; + } + else + { + ApduBuffer = new byte[APDUCommand.APDU_MIN_LENGTH + 1 + ApduCmd.Data.Length]; + + for (int nI = 0; nI < ApduCmd.Data.Length; nI++) + ApduBuffer[APDUCommand.APDU_MIN_LENGTH + 1 + nI] = ApduCmd.Data[nI]; + + ApduBuffer[APDUCommand.APDU_MIN_LENGTH] = (byte) ApduCmd.Data.Length; + } + + ApduBuffer[0] = ApduCmd.Class; + ApduBuffer[1] = ApduCmd.Ins; + ApduBuffer[2] = ApduCmd.P1; + ApduBuffer[3] = ApduCmd.P2; + + m_nLastError = SCardTransmit(m_hCard, ref ioRequest, ApduBuffer, (uint) ApduBuffer.Length, IntPtr.Zero, ApduResponse, out RecvLength); + if (m_nLastError != 0) + { + string msg = "SCardTransmit error: " + m_nLastError; + throw new Exception(msg); + } + + byte[] ApduData = new byte[RecvLength]; + + for (int nI = 0; nI < RecvLength; nI++) + ApduData[nI] = ApduResponse[nI]; + + return new APDUResponse(ApduData); + } + + + /// + /// Wraps the PSCS function + /// LONG SCardBeginTransaction( + /// SCARDHANDLE hCard + // ); + /// + public override void BeginTransaction() + { + if (m_hCard != 0) + { + m_nLastError = SCardBeginTransaction(m_hCard); + if (m_nLastError != 0) + { + string msg = "SCardBeginTransaction error: " + m_nLastError; + throw new Exception(msg); + } + } + } + + /// + /// Wraps the PCSC function + /// LONG SCardEndTransaction( + /// SCARDHANDLE hCard, + /// DWORD dwDisposition + /// ); + /// + /// A value from DISCONNECT enum + public override void EndTransaction(DISCONNECT Disposition) + { + if (m_hCard != 0) + { + m_nLastError = SCardEndTransaction(m_hCard, (UInt32)Disposition); + if (m_nLastError != 0) + { + string msg = "SCardEndTransaction error: " + m_nLastError; + throw new Exception(msg); + } + } + } + + /// + /// Gets the attributes of the card + /// + /// Identifier for the Attribute to get + /// Attribute content + public override byte[] GetAttribute(UInt32 AttribId) + { + byte[] attr = null; + UInt32 attrLen = 0; + + m_nLastError = SCardGetAttrib(m_hCard, AttribId, attr, out attrLen); + if (m_nLastError == 0) + { + if (attrLen != 0) + { + attr = new byte[attrLen]; + m_nLastError = SCardGetAttrib(m_hCard, AttribId, attr, out attrLen); + if (m_nLastError != 0) + { + string msg = "SCardGetAttr error: " + m_nLastError; + throw new Exception(msg); + } + } + } + else + { + string msg = "SCardGetAttr error: " + m_nLastError; + throw new Exception(msg); + } + + return attr; + } + #endregion + + /// + /// This function must implement a card detection mechanism. + /// + /// When card insertion is detected, it must call the method CardInserted() + /// When card removal is detected, it must call the method CardRemoved() + /// + /// + protected override void RunCardDetection(object Reader) + { + bool bFirstLoop = true; + UInt32 hContext = 0; // Local context + IntPtr phContext; + + phContext = Marshal.AllocHGlobal(Marshal.SizeOf(hContext)); + + if (SCardEstablishContext((uint) SCOPE.User, IntPtr.Zero, IntPtr.Zero, phContext) == 0) + { + hContext = (uint)Marshal.ReadInt32(phContext); + Marshal.FreeHGlobal(phContext); + + UInt32 nbReaders = 1; + SCard_ReaderState[] readerState = new SCard_ReaderState[nbReaders]; + + readerState[0].m_dwCurrentState = (UInt32) CARD_STATE.UNAWARE; + readerState[0].m_szReader = (string)Reader; + + UInt32 eventState; + UInt32 currentState = readerState[0].m_dwCurrentState; + + // Card detection loop + do + { + if (SCardGetStatusChange(hContext, WAIT_TIME + , readerState, nbReaders) == 0) + { + eventState = readerState[0].m_dwEventState; + currentState = readerState[0].m_dwCurrentState; + + // Check state + if (((eventState & (uint) CARD_STATE.CHANGED) == (uint) CARD_STATE.CHANGED) && !bFirstLoop) + { + // State has changed + if ((eventState & (uint) CARD_STATE.EMPTY) == (uint) CARD_STATE.EMPTY) + { + // There is no card, card has been removed -> Fire CardRemoved event + CardRemoved(this, new CardRemovedEventArgs()); + } + + if (((eventState & (uint)CARD_STATE.PRESENT) == (uint)CARD_STATE.PRESENT) && + ((eventState & (uint) CARD_STATE.PRESENT) != (currentState & (uint) CARD_STATE.PRESENT))) + { + // There is a card in the reader -> Fire CardInserted event + CardInserted(this, new CardInsertedEventArgs()); + } + + if ((eventState & (uint) CARD_STATE.ATRMATCH) == (uint) CARD_STATE.ATRMATCH) + { + // There is a card in the reader and it matches the ATR we were expecting-> Fire CardInserted event + CardInserted(this, new CardInsertedEventArgs()); + } + } + + // The current stateis now the event state + readerState[0].m_dwCurrentState = eventState; + + bFirstLoop = false; + } + + Thread.Sleep(100); + + if (m_bRunCardDetection == false) + break; + } + while (true); // Exit on request + } + else + { + Marshal.FreeHGlobal(phContext); + throw new Exception("PC/SC error"); + } + + SCardReleaseContext(hContext); + } + } +} diff --git a/TBF_V2/Sources/TBF/GemCard/CardRemovedEventArgs.cs b/TBF_V2/Sources/TBF/GemCard/CardRemovedEventArgs.cs new file mode 100644 index 00000000..df65d35c --- /dev/null +++ b/TBF_V2/Sources/TBF/GemCard/CardRemovedEventArgs.cs @@ -0,0 +1,9 @@ +using System; + +namespace GemCard +{ + public class CardRemovedEventArgs : EventArgs + { + public CardRemovedEventArgs() { } + } +} diff --git a/TBF_V2/Sources/TBF/GemCard/GemCard.csproj b/TBF_V2/Sources/TBF/GemCard/GemCard.csproj new file mode 100644 index 00000000..eefd3520 --- /dev/null +++ b/TBF_V2/Sources/TBF/GemCard/GemCard.csproj @@ -0,0 +1,179 @@ + + + + Local + 8.0.50727 + 2.0 + {8B10D15A-39DE-4B56-8DD1-710C1EB3A697} + Debug + AnyCPU + + + + + GemCard + + + JScript + Grid + IE50 + false + Library + GemCard + OnBuildSuccess + + + + + + + 3.5 + v4.0 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + + bin\Debug\ + true + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + + + false + false + false + false + 4 + + + bin\Release\ + true + 285212672 + false + + + TRACE + + + false + 4096 + false + + + true + false + false + false + 4 + + + true + bin\x86\Debug\ + DEBUG;TRACE + 285212672 + true + 4096 + x86 + true + true + false + + + bin\x86\Release\ + TRACE + 285212672 + true + true + 4096 + x86 + false + false + + + + System + + + System.Data + + + System.XML + + + {00020430-0000-0000-C000-000000000046} + 2 + 0 + 0 + primary + False + + + + + Code + + + + Code + + + + + + Code + + + + Code + + + Code + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + true + + + False + Windows Installer 3.1 + true + + + + + + + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/GemCard/ICard.cs b/TBF_V2/Sources/TBF/GemCard/ICard.cs new file mode 100644 index 00000000..b6b88e50 --- /dev/null +++ b/TBF_V2/Sources/TBF/GemCard/ICard.cs @@ -0,0 +1,149 @@ +using System; + +namespace GemCard +{ + /// + /// This interface gives access to the basic card functions. It must be implemented by a class. + /// + public interface ICard + { + /// + /// Wraps the PCSC funciton + /// LONG SCardListReaders(SCARDCONTEXT hContext, + /// LPCTSTR mszGroups, + /// LPTSTR mszReaders, + /// LPDWORD pcchReaders + /// ); + /// + /// A string array of the readers + string[] ListReaders(); + + /// + /// Wraps the PCSC function + /// LONG SCardConnect( + /// IN SCARDCONTEXT hContext, + /// IN LPCTSTR szReader, + /// IN DWORD dwShareMode, + /// IN DWORD dwPreferredProtocols, + /// OUT LPSCARDHANDLE phCard, + /// OUT LPDWORD pdwActiveProtocol + /// ); + /// + /// + /// + /// + void Connect(string Reader, SHARE ShareMode, PROTOCOL PreferredProtocols); + + /// + /// Wraps the PCSC function + /// LONG SCardDisconnect( + /// IN SCARDHANDLE hCard, + /// IN DWORD dwDisposition + /// ); + /// + /// + void Disconnect(DISCONNECT Disposition); + + /// + /// Wraps the PCSC function + /// LONG SCardTransmit( + /// SCARDHANDLE hCard, + /// LPCSCARD_I0_REQUEST pioSendPci, + /// LPCBYTE pbSendBuffer, + /// DWORD cbSendLength, + /// LPSCARD_IO_REQUEST pioRecvPci, + /// LPBYTE pbRecvBuffer, + /// LPDWORD pcbRecvLength + /// ); + /// + /// APDUCommand object with the APDU to send to the card + /// An APDUResponse object with the response from the card + APDUResponse Transmit(APDUCommand ApduCmd); + + /// + /// Wraps the PSCS function + /// LONG SCardBeginTransaction( + /// SCARDHANDLE hCard + // ); + /// + void BeginTransaction(); + + /// + /// Wraps the PCSC function + /// LONG SCardEndTransaction( + /// SCARDHANDLE hCard, + /// DWORD dwDisposition + /// ); + /// + void EndTransaction(DISCONNECT Disposition); + + /// + /// Gets the attributes of the card + /// + /// Identifier for the Attribute to get + /// Attribute content + byte[] GetAttribute(UInt32 AttribId); + } + + /// + /// SCOPE context + /// + public enum SCOPE + { + /// + /// The context is a user context, and any database operations are performed within the + /// domain of the user. + /// + User, + + /// + /// The context is that of the current terminal, and any database operations are performed + /// within the domain of that terminal. (The calling application must have appropriate + /// access permissions for any database actions.) + /// + Terminal, + + /// + /// The context is the system context, and any database operations are performed within the + /// domain of the system. (The calling application must have appropriate access + /// permissions for any database actions.) + /// + System + } + + /// + /// SHARE mode enumeration + /// + public enum SHARE + { + Exclusive = 1, /// This app. is not willing to share this card with other applications. + Shared, /// This app. is willing to share this card with other applications. + Direct, /// This app. demands direct control of the reader, so it is not available to other applications. + } + + + /// + /// PROTOCOL enumeration + /// + public enum PROTOCOL + { + Undefined = 0x00000000, /// There is no active protocol. + T0 = 0x00000001, /// T=0 is the active protocol. + T1 = 0x00000002, /// T=1 is the active protocol. + T0orT1 = T0 | T1, /// T=1 or T=0 can be the active protocol + Raw = 0x00010000, /// Raw is the active protocol. + Default = unchecked ((int) 0x80000000), /// Use implicit PTS. + } + + + /// + /// DISCONNECT action enumeration + /// + public enum DISCONNECT + { + Leave, /// Don't do anything special on close + Reset, /// Reset the card on close + Unpower, /// Power down the card on close + Eject, /// Eject(!) the card on close + } +} diff --git a/TBF_V2/Sources/TBF/GemCard/SmartCardException.cs b/TBF_V2/Sources/TBF/GemCard/SmartCardException.cs new file mode 100644 index 00000000..507ea0d0 --- /dev/null +++ b/TBF_V2/Sources/TBF/GemCard/SmartCardException.cs @@ -0,0 +1,40 @@ +using System; + +namespace GemCard +{ + /// + /// Smart card exceptions + /// + public class SmartCardException : Exception + { + + public SmartCardException() : base("Smart card exception") + { + } + + public SmartCardException(string Message) : base(Message) + { + } + } + + + public class ApduCommandException : Exception + { + public const string + NotValidDocument = "The file is not a valid APDU command document", + NoSuchCommand = "No such APDU command in the document", + ParamLeFormat = "Le parameter format is not correct", + ParamP3Format = "P3 parameter format is not correct", + NoSuchSequence = "No such APDU sequence in the document", + MissingApduOrCommand = "An Apdu or a Sequence is missing in this Sequence"; + + public ApduCommandException() : base("APDU command exception") + { + } + + public ApduCommandException(string Message) : base(Message) + { + } + + } +} diff --git a/TBF_V2/Sources/TBF/GraphLib/BackBuffer.cs b/TBF_V2/Sources/TBF/GraphLib/BackBuffer.cs new file mode 100644 index 00000000..8af129bd --- /dev/null +++ b/TBF_V2/Sources/TBF/GraphLib/BackBuffer.cs @@ -0,0 +1,87 @@ +using System; +using System.Drawing; + + + +/* Copyright (c) 2008-2014 DI Zimmermann Stephan (stefan.zimmermann@tele2.at) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +namespace GraphLib +{ + public class BackBuffer + { + private Graphics graphics; + private Bitmap memoryBitmap; + private int width; + private int height; + + public BackBuffer() + { + width = 0; + height = 0; + } + + public bool Init(Graphics g, int width, int height) + { + if (memoryBitmap != null) + { + memoryBitmap.Dispose(); + memoryBitmap = null; + } + + if (graphics != null) + { + graphics.Dispose(); + graphics = null; + } + + if (width == 0 || height == 0) + return false; + + if ((width != this.width) || (height != this.height) || graphics == null) + { + this.width = width; + this.height = height; + + memoryBitmap = new Bitmap(width, height); + graphics = Graphics.FromImage(memoryBitmap); + } + + return true; + } + + public void Render(Graphics g) + { + if (memoryBitmap != null) + { + g.DrawImage(memoryBitmap, + new Rectangle(0, 0, width, height), + 0, 0, width, height, + GraphicsUnit.Pixel); + } + } + + public bool CanDoubleBuffer() { return graphics != null; } + + public Graphics Graphics { get { return graphics; } } + } +} diff --git a/TBF_V2/Sources/TBF/GraphLib/DataSource.cs b/TBF_V2/Sources/TBF/GraphLib/DataSource.cs new file mode 100644 index 00000000..532c9a1a --- /dev/null +++ b/TBF_V2/Sources/TBF/GraphLib/DataSource.cs @@ -0,0 +1,254 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Runtime.Serialization; +using System.Runtime.Serialization.Formatters.Binary; +using System.ComponentModel; +using System.Drawing; + +/* Copyright (c) 2008-2014 DI Zimmermann Stephan (stefan.zimmermann@tele2.at) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +namespace GraphLib +{ + public class DataSource + { + public delegate String OnDrawXAxisLabelEvent(DataSource src, int idx); + public delegate String OnDrawYAxisLabelEvent(DataSource src, float value); + + public OnDrawXAxisLabelEvent OnRenderXAxisLabel = null; + public OnDrawYAxisLabelEvent OnRenderYAxisLabel = null; + + private PointF[] samples = null; + private int length = 0; + + private String name = String.Empty; + private int downSample = 1; + private Color color = Color.Black; + + public float VisibleDataRange_X = 0; + public float DY = 0; + public float YD0 = -200; + public float YD1 = 200; + public float Cur_YD0 = -200; + public float Cur_YD1 = 200; + + public float grid_distance_y = 200; // grid distance in units ( draw a horizontal line every 200 units ) + + public float off_Y = 0; + public float grid_off_y = 0; + + public bool yFlip = true; + + public bool Active = true; + + public float XAutoScaleOffset = 100; + + public float CurGraphHeight = 1.0f; + + public float CurGraphWidth = 1.0f; + + private bool autoScaleY = false; + private bool autoScaleX = false; + + + public bool AutoScaleY + { + get { return autoScaleY; } + set { autoScaleY = value; } + } + + public bool AutoScaleX + { + get { return autoScaleX; } + set { autoScaleX = value; } + } + + public PointF[] Samples + { + get { return samples; } + set + { + samples = value; + length = samples.Length; + } + } + + public float XMin + { + get + { + float x_min = float.MaxValue; + if (samples != null && samples.Length > 0) + { + foreach (PointF p in samples) if (p.X < x_min) x_min=p.X; + } + return x_min; + } + } + + public float XMax + { + get + { + float x_max = float.MinValue; + if (samples != null && samples.Length > 0) + { + foreach (PointF p in samples) if (p.X > x_max) x_max = p.X; + } + return x_max; + } + } + + public float YMin + { + get + { + float y_min = float.MaxValue; + if (samples != null && samples.Length > 0) + { + foreach (PointF p in samples) if (p.Y < y_min) y_min = p.Y; + } + return y_min; + } + } + + public float YMax + { + get + { + float y_max = float.MinValue; + if (samples.Length > 0) + { + foreach (PointF p in samples) if (p.Y > y_max) y_max = p.Y; + } + return y_max; + } + } + + public void SetDisplayRangeY(float y_start, float y_end) + { + YD0 = y_start; + YD1 = y_end; + } + + public void SetGridDistanceY(float grid_dist_y_units) + { + grid_distance_y = grid_dist_y_units; + } + + public void SetGridOriginY(float off_y) + { + grid_off_y = off_y; + } + + + /// + /// Load Samples from a file. Returns loaded points count. + /// + /// File pathname + /// Loaded points count + public int LoadSamples(string pathName, out float yMin, out float yMax) + { + yMin = float.MaxValue; + yMax = float.MinValue; + try + { + Int64 size = new FileInfo(pathName).Length; + if ((size % 8) != 0) return 0; + int samplesCount = (int)(size / 8L) - 1; + if (samplesCount <= 0) return 0; + + PointF[] newSamples = new PointF[samplesCount]; + using (BinaryReader reader = new BinaryReader(File.Open(pathName, FileMode.Open))) + { + for (int i = 0; i < samplesCount; i++) + { + newSamples[i].X = reader.ReadSingle(); + newSamples[i].Y = reader.ReadSingle(); + } + yMin = reader.ReadSingle(); + yMax = reader.ReadSingle(); + } + + Samples = newSamples; + return samplesCount; + } + catch (Exception exc) + { + return 0; + } + } + + + [Category("Properties")] // Take this out, and you will soon have problems with serialization; + [DefaultValue(typeof(string), "")] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] + public String Name + { + get { return name; } + set { name = value; } + } + + [Category("Properties")] // Take this out, and you will soon have problems with serialization; + [DefaultValue(typeof(Color), "")] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] + public Color GraphColor + { + get { return color; } + set { color = value; } + } + + [Category("Properties")] // Take this out, and you will soon have problems with serialization; + [DefaultValue(typeof(int), "0")] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] + public int Length + { + get { return length; } + set + { + length = value; + if (length != 0) + { + samples = new PointF[length]; + } + else + { + // length is 0 + if (samples != null) + { + samples = null; + } + } + } + } + + [Category("Properties")] // Take this out, and you will soon have problems with serialization; + [DefaultValue(typeof(int), "1")] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] + public int Downsampling + { + get { return downSample; } + set { downSample = value; } + } + } +} diff --git a/TBF_V2/Sources/TBF/GraphLib/GraphLib.csproj b/TBF_V2/Sources/TBF/GraphLib/GraphLib.csproj new file mode 100644 index 00000000..fd4987f4 --- /dev/null +++ b/TBF_V2/Sources/TBF/GraphLib/GraphLib.csproj @@ -0,0 +1,115 @@ + + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {0C0A1F4D-1363-4544-A7C5-196C76D26CCA} + Library + Properties + ClassLibrary1 + GraphLib + v4.0 + + + + + 2.0 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + UserControl + + + PlotterGraphPaneEx.cs + + + UserControl + + + PlotterDisplayEx.cs + + + + Form + + + PlotterGraphSelectCurvesForm.cs + + + + Form + + + PrintPreviewForm.cs + + + + True + True + Resources.resx + + + + + + PlotterGraphPaneEx.cs + Designer + + + PlotterDisplayEx.cs + Designer + + + Designer + PlotterGraphSelectCurvesForm.cs + + + Designer + PrintPreviewForm.cs + + + Designer + ResXFileCodeGenerator + Resources.Designer.cs + + + + + + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/GraphLib/GraphLib.sln b/TBF_V2/Sources/TBF/GraphLib/GraphLib.sln new file mode 100644 index 00000000..53a616e7 --- /dev/null +++ b/TBF_V2/Sources/TBF/GraphLib/GraphLib.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GraphLib", "GraphLib.csproj", "{0C0A1F4D-1363-4544-A7C5-196C76D26CCA}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0C0A1F4D-1363-4544-A7C5-196C76D26CCA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0C0A1F4D-1363-4544-A7C5-196C76D26CCA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0C0A1F4D-1363-4544-A7C5-196C76D26CCA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0C0A1F4D-1363-4544-A7C5-196C76D26CCA}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/TBF_V2/Sources/TBF/GraphLib/PlotterDisplayEx.cs b/TBF_V2/Sources/TBF/GraphLib/PlotterDisplayEx.cs new file mode 100644 index 00000000..3d7a11e3 --- /dev/null +++ b/TBF_V2/Sources/TBF/GraphLib/PlotterDisplayEx.cs @@ -0,0 +1,298 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Text; +using System.Windows.Forms; +using System.Threading; +using System.ComponentModel.Design; +using System.Drawing.Drawing2D; + + +/* Copyright (c) 2008-2014 DI Zimmermann Stephan (stefan.zimmermann@tele2.at) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +namespace GraphLib +{ + public partial class PlotterDisplayEx : UserControl + { + #region MEMBERS + + delegate void InvokeVoidFuncDelegate(); + + PlotterGraphSelectCurvesForm GraphPropertiesForm = null; + PrintPreviewForm printPreviewForm = null; + + private bool paused = false; + private bool isRunning = false; + + #endregion + + #region CONSTRUCTOR + + public PlotterDisplayEx() + { + InitializeComponent(); + isRunning = false; + } + + void contextMenuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e) + { + String text = e.ClickedItem.Text; + foreach (DataSource s in gPane.Sources) + { + if (s.Name == text) + { + s.Active ^= true; + gPane.Invalidate(); + break; + } + } + } + + #endregion + + #region PROPERTIES + + [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] + [Editor(typeof(System.ComponentModel.Design.CollectionEditor), + typeof(System.Drawing.Design.UITypeEditor))] + public IList DataSources + { + get { return gPane.Sources; } + } + + [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] + [Editor(typeof(System.ComponentModel.Design.CollectionEditor), + typeof(System.Drawing.Design.UITypeEditor))] + public PlotterGraphPaneEx.LayoutMode PanelLayout + { + get { return gPane.layout; } + set { gPane.layout = value; } + } + + [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] + [Editor(typeof(System.ComponentModel.Design.CollectionEditor), + typeof(System.Drawing.Design.UITypeEditor))] + public SmoothingMode Smoothing + { + get { return gPane.smoothing; } + set { gPane.smoothing = value; } + } + + [Category("Playback")] + [DefaultValue(typeof(bool), "true")] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] + public bool ShowMovingGrid + { + get { return gPane.hasMovingGrid; } + set { gPane.hasMovingGrid = value; } + } + + + [Category("Properties")] + [DefaultValue(typeof(Color), "")] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] + public Color BackgroundColorTop + { + get { return gPane.BgndColorTop; } + set { gPane.BgndColorTop = value; } + } + + [Category("Properties")] + [DefaultValue(typeof(Color), "")] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] + public Color BackgroundColorBot + { + get { return gPane.BgndColorBot; } + set { gPane.BgndColorBot = value; } + } + + [Category("Properties")] + [DefaultValue(typeof(Color), "")] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] + public Color DashedGridColor + { + get { return gPane.MinorGridColor; } + set { gPane.MinorGridColor = value; } + } + + [Category("Properties")] + [DefaultValue(typeof(Color), "")] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] + public Color SolidGridColor + { + get { return gPane.MajorGridColor; } + set { gPane.MajorGridColor = value; } + } + + + public bool DoubleBuffering + { + get { return gPane.useDoubleBuffer; } + set { gPane.useDoubleBuffer = value; } + } + + #endregion + + #region PUBLIC METHODS + + public void SetDisplayRangeX(float x_start, float x_end ) + { + gPane.XD0 = x_start; + gPane.XD1 = x_end; + gPane.CurXD0 = gPane.XD0; + gPane.CurXD1 = gPane.XD1; + } + + public void SetGridDistanceX(float grid_dist_x_samples) + { + gPane.grid_distance_x = grid_dist_x_samples; + } + + public void SetGridOriginX(float off_x) + { + gPane.grid_off_x = off_x; + } + + + #endregion + + #region PRIVATE METHODS + + protected override void Dispose(bool disposing) + { + paused = true; + base.Dispose(disposing); + } + + private void SetPlayPanelVisible() + { + panel1.Visible = true; + tb1.Buttons[0].Visible = true; + tb1.Buttons[1].Visible = true; + } + + private void SetPlayPanelInvisible() + { + panel1.Visible = false; + tb1.Buttons[0].Visible = false; + tb1.Buttons[1].Visible = false; + + } + + private void UpdateControl() + { + try + { + bool AllAutoscaled = true; + + foreach (DataSource s in gPane.Sources) + { + AllAutoscaled &= s.AutoScaleX; + } + + + if (AllAutoscaled == true) + { + if (panel1.Visible == true) + { + this.Invoke(new MethodInvoker(SetPlayPanelInvisible)); + } + } + else + { + if (panel1.Visible == false) + { + this.Invoke(new MethodInvoker(SetPlayPanelVisible)); + } + } + } + catch + { + } + } + + private void UpdateScrollBar() + { + if (InvokeRequired) + { + Invoke(new MethodInvoker(UpdateScrollBar)); + } + else + { + if (gPane.Sources.Count > 0) + { + if (gPane.starting_idx > gPane.Sources[0].Length) + { + hScrollBar1.Value = 10000; + } + else if (gPane.starting_idx >= 0) + { + hScrollBar1.Value = 10000 * (int)gPane.starting_idx / gPane.Sources[0].Length; + } + else + { + hScrollBar1.Value = 0; + } + } + else + { + hScrollBar1.Value = 0; + } + } + } + + private void OnScrollbarScroll(object sender, ScrollEventArgs e) + { + if (gPane.Sources.Count > 0) + { + int val = hScrollBar1.Value; + + int maxLen = 0; + foreach (var s in DataSources) + { + if (s.Length > maxLen) maxLen = s.Length; + } + + gPane.starting_idx = (int)(maxLen * (float)val / 10000.0f); + gPane.Invalidate(); + } + } + + #endregion + + private void selectGraphsToolStripMenuItem_Click(object sender, EventArgs e) + { + if (GraphPropertiesForm == null) + { + GraphPropertiesForm = new PlotterGraphSelectCurvesForm(); + } + + GraphPropertiesForm.GraphPanel = this.gPane; + GraphPropertiesForm.Show(); + // GraphPropertiesForm.BringToFront(); + + } + } +} diff --git a/TBF_V2/Sources/TBF/GraphLib/PlotterDisplayEx.designer.cs b/TBF_V2/Sources/TBF/GraphLib/PlotterDisplayEx.designer.cs new file mode 100644 index 00000000..47412927 --- /dev/null +++ b/TBF_V2/Sources/TBF/GraphLib/PlotterDisplayEx.designer.cs @@ -0,0 +1,200 @@ +namespace GraphLib +{ + partial class PlotterDisplayEx + { + + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PlotterDisplayEx)); + this.tb1 = new System.Windows.Forms.ToolBar(); + this.tbbSave = new System.Windows.Forms.ToolBarButton(); + this.tbbOpen = new System.Windows.Forms.ToolBarButton(); + this.imgList1 = new System.Windows.Forms.ImageList(this.components); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.panel1 = new System.Windows.Forms.Panel(); + this.lb_Position = new System.Windows.Forms.Label(); + this.hScrollBar1 = new System.Windows.Forms.HScrollBar(); + this.gPane = new GraphLib.PlotterGraphPaneEx(); + this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); + this.selectGraphsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.panel1.SuspendLayout(); + this.contextMenuStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // tb1 + // + this.tb1.Appearance = System.Windows.Forms.ToolBarAppearance.Flat; + this.tb1.Buttons.AddRange(new System.Windows.Forms.ToolBarButton[] { + this.tbbSave, + this.tbbOpen}); + this.tb1.ButtonSize = new System.Drawing.Size(16, 16); + this.tb1.Divider = false; + this.tb1.Dock = System.Windows.Forms.DockStyle.None; + this.tb1.DropDownArrows = true; + this.tb1.ImageList = this.imgList1; + this.tb1.Location = new System.Drawing.Point(11, 5); + this.tb1.Name = "tb1"; + this.tb1.ShowToolTips = true; + this.tb1.Size = new System.Drawing.Size(80, 26); + this.tb1.TabIndex = 1; + this.tb1.Visible = false; + // + // tbbSave + // + this.tbbSave.ImageIndex = 0; + this.tbbSave.Name = "tbbSave"; + this.tbbSave.Tag = "play"; + // + // tbbOpen + // + this.tbbOpen.ImageIndex = 1; + this.tbbOpen.Name = "tbbOpen"; + this.tbbOpen.Tag = "stop"; + // + // imgList1 + // + this.imgList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imgList1.ImageStream"))); + this.imgList1.TransparentColor = System.Drawing.Color.Transparent; + this.imgList1.Images.SetKeyName(0, "media-playback-start.png"); + this.imgList1.Images.SetKeyName(1, "media-playback-stop.png"); + this.imgList1.Images.SetKeyName(2, "media-playback-pause.png"); + this.imgList1.Images.SetKeyName(3, "printer.png"); + // + // splitContainer1 + // + this.splitContainer1.BackColor = System.Drawing.SystemColors.Control; + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer1.IsSplitterFixed = true; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.BackColor = System.Drawing.SystemColors.ControlDarkDark; + this.splitContainer1.Panel1.Controls.Add(this.tb1); + this.splitContainer1.Panel1.Controls.Add(this.panel1); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.BackColor = System.Drawing.Color.Transparent; + this.splitContainer1.Panel2.Controls.Add(this.gPane); + this.splitContainer1.Size = new System.Drawing.Size(598, 339); + this.splitContainer1.SplitterDistance = 34; + this.splitContainer1.TabIndex = 2; + this.splitContainer1.TabStop = false; + // + // panel1 + // + this.panel1.Controls.Add(this.lb_Position); + this.panel1.Controls.Add(this.hScrollBar1); + this.panel1.Location = new System.Drawing.Point(99, 3); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(496, 28); + this.panel1.TabIndex = 7; + // + // lb_Position + // + this.lb_Position.AutoSize = true; + this.lb_Position.ForeColor = System.Drawing.SystemColors.ControlLightLight; + this.lb_Position.Location = new System.Drawing.Point(6, 8); + this.lb_Position.Name = "lb_Position"; + this.lb_Position.Size = new System.Drawing.Size(44, 13); + this.lb_Position.TabIndex = 3; + this.lb_Position.Text = "Position"; + // + // hScrollBar1 + // + this.hScrollBar1.Location = new System.Drawing.Point(57, 10); + this.hScrollBar1.Maximum = 10000; + this.hScrollBar1.Name = "hScrollBar1"; + this.hScrollBar1.Size = new System.Drawing.Size(118, 10); + this.hScrollBar1.TabIndex = 4; + this.hScrollBar1.Scroll += new System.Windows.Forms.ScrollEventHandler(this.OnScrollbarScroll); + // + // gPane + // + this.gPane.Dock = System.Windows.Forms.DockStyle.Fill; + this.gPane.Location = new System.Drawing.Point(0, 0); + this.gPane.Name = "gPane"; + this.gPane.Size = new System.Drawing.Size(598, 301); + this.gPane.TabIndex = 1; + // + // contextMenuStrip1 + // + this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.selectGraphsToolStripMenuItem, + this.toolStripSeparator1}); + this.contextMenuStrip1.Name = "contextMenuStrip1"; + this.contextMenuStrip1.Size = new System.Drawing.Size(117, 32); + // + // selectGraphsToolStripMenuItem + // + this.selectGraphsToolStripMenuItem.Name = "selectGraphsToolStripMenuItem"; + this.selectGraphsToolStripMenuItem.Size = new System.Drawing.Size(116, 22); + this.selectGraphsToolStripMenuItem.Text = "Options"; + this.selectGraphsToolStripMenuItem.Click += new System.EventHandler(this.selectGraphsToolStripMenuItem_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(113, 6); + // + // PlotterDisplayEx + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Transparent; + this.ContextMenuStrip = this.contextMenuStrip1; + this.Controls.Add(this.splitContainer1); + this.Name = "PlotterDisplayEx"; + this.Size = new System.Drawing.Size(598, 339); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel1.PerformLayout(); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); + this.contextMenuStrip1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.ToolBar tb1; + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.ToolBarButton tbbSave; + private System.Windows.Forms.ToolBarButton tbbOpen; + private System.Windows.Forms.HScrollBar hScrollBar1; + private PlotterGraphPaneEx gPane; + private System.Windows.Forms.Label lb_Position; + public System.Windows.Forms.ContextMenuStrip contextMenuStrip1; + private System.Windows.Forms.ToolStripMenuItem selectGraphsToolStripMenuItem; + private System.Windows.Forms.ImageList imgList1; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.Panel panel1; + + } +} diff --git a/TBF_V2/Sources/TBF/GraphLib/PlotterDisplayEx.resx b/TBF_V2/Sources/TBF/GraphLib/PlotterDisplayEx.resx new file mode 100644 index 00000000..35ef645d --- /dev/null +++ b/TBF_V2/Sources/TBF/GraphLib/PlotterDisplayEx.resx @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 17, 17 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACI + DgAAAk1TRnQBSQFMAgEBBAEAARQBAAEUAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA + AwABIAMAAQEBAAEgBgABIP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AKgADAQECwAABtgGV + AU8B/QHKAZgBWQH/AcoBlwFZAf8BygGXAVkB/wHKAZcBWQH/AcoBlwFYAf8ByQGXAVgB/wHJAZcBWAH/ + AcoBmAFZAf8BtgGUAU8B/RQAAxQBHAMRARcDAgEDrAADTgGZA10B0gNMAf8BxwGVAVUB/wH5AfcB9gH/ + AfkB8QHsAf8B+QHxAesB/wH4AfAB6QH/AfcB7QHmAf8B9AHqAeEB/wHyAegB3gH/AfoB+AH2Af8BxwGU + AVUB/wMYAf8DWAHRA0QBeggAAxUBHQFiAlgB6QM6AWEDDQESAwABASwAAxsBJgMbASYDGwEmAxsBJgMb + ASYDGwEmAxsBJgMbASYDGwEmAxsBJgMbASYDGwEmEAADGwEmAxsBJgMbASYDGwEmAxsBJgMbASYDGwEm + AxsBJgMbASYDGwEmAxsBJgMbASYIAANUAf0DpwH/A7UB/wOBAf8BrwGsAaoB/wHFAcABvQH/AcUBwAG9 + Af8BxQHAAb0B/wHFAcABvQH/AcUBwAG9Af8BxQHAAb0B/wGtAaoBqAH/AyAB/wO1Af8DmwH/AxcB/wgA + AxUBHQNNAfoBOgIrAfwDXwHgAysBQgMNARIoAAMbASYDKwH8AYACgQH/AYACgQH/AYACgQH/AYACgQH/ + AYACgQH/AYACgQH/AYACgQH/AYACgQH/AYACgQH/AxsBJhAAAxsBJgMrAfwBgAKBAf8BgAKBAf8BgAKB + Af8DIwE0AxsBJgMrAfwBgAKBAf8BgAKBAf8BgAKBAf8DIwE0CAADZAH/A7UB/wO1Af8DlQH/A4EB/wOB + Af8DbQH/A2IB/wNVAf8DRgH/AzcB/wM2Af8DYgH/A7UB/wO1Af8DGQH/CAADFQEdAV8CSgH7AfkB+gH5 + Af8DfwH+AV8BUwFSAfsDVQGyAx0BKgMIAQsgAAMbASYDQAH9IP8DQAH9AxsBJgMAAQEMAAMbASYDQAH9 + AfwB/QH8Bf8DQAH9AxsBJgMbASYDQAH9AfwB/QH8Bf8DQAH9AxsBJgMAAQEEAANpAf8DuwH/A7sB/wON + Af8D1AH/A7kB/wO5Af8DuQH/A7kB/wO5Af8DuQH/A9MB/wODAf8DuwH/A7sB/wMeAf8IAAMVAR0DKwH8 + AfoC+wH/AfUC9gH/AfkC+gH/ATsBLgEtAfwBbQJRAfcDQgF2AxYBHgMFAQcYAAMbASYDQAH9BP8B1QHb + AdgB/wHUAdsB1wH/AdQB2wHYAf8B0wHbAdcB/wHRAdkB1QH/Ac8B1wHTBf8DQAH9AxsBJgMBAQIMAAMb + ASYDQAH9AeIB5QHkAf8B2AHfAdwB/wNAAf0DGwEmAxsBJgNAAf0D8wH/AfcB+AH3Af8DQAH9AxsBJgMB + AQIEAANuAf8D1wH/A9cB/wOXAf8D2AH/A78B/wO/Af8DvwH/A78B/wO/Af8DvwH/A9cB/wOOAf8D1wH/ + A9cB/wMzAf8IAAMWAR4DKwH8A/sB/wHTAdoB1wH/AdoB3wHcAf8B9gH3AfYB/wHyAvMB/wE6AisB/AFg + AlkB6wMzAVMDEgEZAwQBBRAAAxsBJgNAAf0E/wHaAeAB3QH/AdsB4QHeAf8B3QHiAeAB/wHdAeIB4AH/ + AdsB4QHeAf8B2AHeAdsF/wNAAf0DGwEmAwEBAgwAAxsBJgNAAf0B4gHmAeQB/wHcAeIB3wH/A0AB/QMb + ASYDGwEmA0AB/QHvAfEB8AH/AfAB8wHxAf8DQAH9AxsBJgMBAQIEAANyAf8D+QH/A/kB/wOrAf8D3wH/ + A8sB/wPLAf8DywH/A8sB/wPLAf8DywH/A98B/wOjAf8D+QH/A/kB/wNVAf8IAAMWAR4DKwH8A/sB/wHf + AeQB4QH/Ad4B4wHhAf8B3gHjAeAB/wHjAecB5QH/AfQC9QH/A38B/gGRAkAB/QNWAbYDJgE5AxABFQwA + AxsBJgNAAf0E/wHdAeMB4AH/AeEB5gHjAf8B5AHpAecB/wHmAeoB6AH/AeUB6QHnAf8B4gHnAeQF/wNA + Af0DGwEmAwEBAgwAAxsBJgNAAf0B5AHoAeUB/wHeAeMB4QH/A0AB/QMbASYDGwEmA0AB/QHsAe8B7gH/ + AecB6wHpAf8DQAH9AxsBJgMBAQIEAANqAfkD/AH/A/wB/wPLAf8D8gH/A/IB/wPyAf8D8gH/A/IB/wPy + Af8D8gH/A/IB/wPGAf8D/AH/A/wB/wNwAf4IAAMWAR4DKwH8A/sB/wHqAe4B7AH/AewB7wHuAf8B7AHv + Ae4B/wHrAe4B7QH/AekB7AHrAf8DfwH+AToCKwH8AVgCVgG7Ax0BKgMGAQgMAAMbASYDQAH9BP8B3wHk + AeEB/wHkAekB5gH/AeoB7QHrAf8B7gHxAe8B/wHvAfEB8AH/AewB7wHuBf8DQAH9AxsBJgMBAQIMAAMb + ASYDQAH9AesB7QHsAf8B3QHjAeAB/wNAAf0DGwEmAxsBJgNAAf0B7QHwAe8B/wHfAeQB4QH/A0AB/QMb + ASYDAQECBAADXQTSAf8D6AH/A3EB/wNxAf8DcQH/A3EB/wNxAf8DcQH/A3EB/wNxAf8DcQH/A3EB/wPo + Af8DxAH/A1wB3AgAAxYBHgMrAfwD+wH/AfUC9gH/AfoB+wH6Af8D+QH/Ad0C3gH/AWoCRwH5A10B7QE6 + AjkBYAMNAREUAAMbASYDQAH9BP8B3AHiAd8B/wHkAegB5gH/AesB7gHtAf8B8gH0AfMB/wH3AvgB/wH2 + AfgB9wX/A0AB/QMbASYDAQECDAADGwEmA0AB/QHyAfQB8wH/AdoB3wHdAf8DQAH9AxsBJgMcASgDQAH9 + AfMB9QH0Af8B1gHdAdkB/wNAAf0DGwEmAwEBAgQAAy0BRQOaAf8DzAH/AccBiwFCAf8B+QH0Ae0B/wH+ + AegB2AH/Af4B6AHXAf8B/QHlAdMB/wH8AeQB0QH/AfoB4AHHAf8B+QHdAcMB/wH6AfQB7QH/AccBhQE+ + Af8DwwH/A2gB/wMtAUUIAAMWAR4DKwH8A/sB/wHwAfMB8gH/AeYC6AH/A00B+gFiAlIB9AFRAk8BpQMU + ARwDAAEBGAADGwEmA0AB/QT/AdgB3wHcAf8B4AHlAeMB/wHoAesB6gH/Ae8B8gHwAf8B9wH4AfcB/wP9 + Bf8DQAH9AxsBJgMBAQIMAAMbASYDQAH9A/wB/wHVAdsB2AH/A0AB/QMbASYDHAEoA0AB/QP8Af8B0gHa + AdYB/wNAAf0DGwEmAwEBAggAAzsBYwNqAfMBxQGJAUAB/wH5AfQB7wH/Af4B5wHXAf8B/QHnAdUB/wH8 + AeYB0gH/AfsB4QHMAf8B+AHcAcIB/wH2AdoBvQH/AfoB9AHvAf8BxAGDATwB/wNdAfMDOwFjDAADFgEe + AysB/AP7Af8BPgIyAfwDTQH6AVoCVwG9AxgBIgMCAQMgAAMbASYDQAH9IP8DQAH9AxsBJgMBAQIMAAMb + ASYDQAH9CP8DQAH9AxsBJgMcASgDQAH9CP8DQAH9AxsBJgMBAQIMAAMHAQkBlgF6AUcC+QH0AfAB/wH8 + AeYB0wH/Af0B5wHTAf8B+wHjAc0B/wH6AeAByAH/AfUB1gG7Af8B8wHUAbUB/wH4AfQB8AH/AZUBagFH + AfkDBwEJEAADFgEeA0AB/QFbAjIB+wFgAlwB1AMjATMDBwEKKAADGwEmAysB/AEpAS0BKwH/ASkBLQEr + Af8BKQEtASsB/wEpAS0BKwH/ASkBLQErAf8BKQEtASsB/wEpAS0BKwH/ASkBLQErAf8BKQEtASsB/wMb + ASYDAQECDAADGwEmAWMBVwFVAf4BKQEtASsB/wEpAS0BKwH/ASkBLQErAf8DGwEmAxwBKAFjAVcBVQH+ + ASkBLQErAf8BKQEtASsB/wEpAS0BKwH/AxsBJgMBAQIQAAGSAXoBUQH3AfkB9QHxAf8B/AHjAc8B/wH8 + AeQBzwH/AfoB4QHKAf8B+QHdAcQB/wH0AekB3wH/AfcB8gHsAf8B9QHvAekB/wGZAV8BRQH7FAADFgEf + AV4CWgHYAygBPQMNAREwAAMbASYDGwEmAxsBJgMbASYDGwEmAxsBJgMbASYDGwEmAxsBJgMbASYDGwEm + AxsBJgMAAQEMAAMbASYDGwEmAxsBJgMbASYDGwEmAxsBJgMbASYDGwEmAxsBJgMbASYDGwEmAxsBJgMA + AQEQAAGJAWoBSQH2AfkB9QHxAf8B/AHjAc0B/wH7AeMBzQH/AfkB4AHIAf8B+AHcAcIB/wH9AfsB+AH/ + AfwB5gHNAf8B4gG2AYQB/wJUAVIBphQAAxYBHwMRARcDAgEDuAABngF1AU0B+gH3AfIB7AH/AfgB9AHu + Af8B+AHzAe0B/wH4AfMB7QH/AfgB8gHsAf8B8gHmAdcB/wHiAbIBcQH/AZABcQFiAfYDBQEHFAADAwEE + wAADOgFgAlgBVgG7AbEBfwFPAf4ByAGMAUMB/wGSAX8BUQH3AZIBfwFRAfcBrgF/AUwB/gNOAZQUAAFC + AU0BPgcAAT4DAAEoAwABQAMAASADAAEBAQABAQYAAQEWAAP/gQAB3wX/AeABBwHHBf8CAAHBAf8BwAED + AcABAwIAAcAB/wHAAQMBwAEDAgABwAE/AcABAQHAAQECAAHAAQ8BwAEBAcABAQIAAcABAwHAAQEBwAEB + AgABwAEBAcABAQHAAQECAAHAAQEBwAEBAcABAQIAAcABBwHAAQEBwAEBAgABwAEPAcABAQHAAQEBgAEB + AcABPwHAAQEBwAEBAcABAwHAAf8BwAEBAcABAQHgAQcBwwH/AcABAQHAAQEB4AEHAccF/wHgAQcB3wX/ + AeABHws= + + + + 84, 17 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/GraphLib/PlotterGraphPaneEx.Designer.cs b/TBF_V2/Sources/TBF/GraphLib/PlotterGraphPaneEx.Designer.cs new file mode 100644 index 00000000..9c05883d --- /dev/null +++ b/TBF_V2/Sources/TBF/GraphLib/PlotterGraphPaneEx.Designer.cs @@ -0,0 +1,46 @@ +namespace GraphLib +{ + partial class PlotterGraphPaneEx + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // PlotterGraphPane + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Name = "PlotterGraphPane"; + this.Size = new System.Drawing.Size(409, 150); + this.Load += new System.EventHandler(this.OnLoadControl); + this.ResumeLayout(false); + + } + + #endregion + } +} diff --git a/TBF_V2/Sources/TBF/GraphLib/PlotterGraphPaneEx.cs b/TBF_V2/Sources/TBF/GraphLib/PlotterGraphPaneEx.cs new file mode 100644 index 00000000..57fade46 --- /dev/null +++ b/TBF_V2/Sources/TBF/GraphLib/PlotterGraphPaneEx.cs @@ -0,0 +1,1052 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Text; +using System.Windows.Forms; +using System.Drawing.Drawing2D; + + /* Copyright (c) 2008-2014 DI Zimmermann Stephan (stefan.zimmermann@tele2.at) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +namespace GraphLib +{ + public partial class PlotterGraphPaneEx : UserControl + { + #region MEMBERS + + public enum LayoutMode + { + NORMAL, + STACKED, + VERTICAL_ARRANGED, + TILES_VER, + TILES_HOR, + } + + private BackBuffer backBuffer; + private int ActiveSources = 0; + + public LayoutMode layout = LayoutMode.NORMAL; + + public Color MajorGridColor = Color.DarkGray; + public Color MinorGridColor = Color.DarkGray; + public Color GraphColor = Color.DarkGreen; + public Color BgndColorTop = Color.White; + public Color BgndColorBot = Color.White; + public Color LabelColor = Color.White; + public Color GraphBoxColor = Color.White; + public bool useDoubleBuffer = false; + public Font legendFont = new Font(FontFamily.GenericSansSerif, 8.25f); + + private IList sources = new List(); + + public SmoothingMode smoothing = SmoothingMode.None; + + public bool hasMovingGrid = true; + public bool hasBoundingBox = true; + + private Point mousePos = new Point(); + private bool mouseDown = false; + + + public float starting_idx = 0; + + + public float XD0 = -50; + + public float XD1 = 100; + + public float DX = 0; + + public float off_X = 0; + + public float CurXD0 = 0; + + public float CurXD1 = 0; + + public float grid_distance_x = 60; // grid distance in samples ( draw a vertical line every 60 samples ) + public float grid_off_x = 0; + public float GraphCaptionLineHeight = 28; + + public float pad_inter = 4; // padding between graphs + public float pad_left = 10; // left padding + public float pad_right = 10; // right padding + public float pad_top = 10; // top + public float pad_bot = 10; // bottom padding + + public float graph_distance_x = 10; // distance between graphs, x direction + public float graph_distance_y = 10; // distance between graphs, y direction + + public float yLabelAreaWidth = 40; // y-label area width + + public float xLabelAreaheight = 8; // x-label padding ( bottom area left and right were x labels are still visible ) + + PointF graphCaptionOffset = new PointF(12, 2); + + public float[] MinorGridPattern = new float[] { 2,4 }; + public float[] MajorGridPattern = new float[] { 2,2 }; + + DashStyle MinorGridDashStyle = DashStyle.Custom; + DashStyle MajorGridDashStyle = DashStyle.Custom; + public bool MoveMinorGrid = true; + + #endregion + + #region CONSTRUCTOR + + public PlotterGraphPaneEx() + { + backBuffer = new BackBuffer(); + + InitializeComponent(); + + this.Resize += new System.EventHandler(this.OnResizeForm); + this.MouseDown += new MouseEventHandler(OnMouseDown); + this.MouseUp += new MouseEventHandler(OnMouseUp); + this.MouseMove += new MouseEventHandler(OnMouseMove); + } + + #endregion + + public IList Sources { get { return sources; } } + + private void OnLoadControl(object sender, EventArgs e) + { + backBuffer.Init(this.CreateGraphics(), this.ClientRectangle.Width, this.ClientRectangle.Height); + } + + protected override void OnPaintBackground(PaintEventArgs e) + { + if (ParentForm == null) + { + // paint background when control is used in editor + base.OnPaintBackground(e); + + } + else + { + // do not repaint background to avoid flickering + } + } + + private void OnResizeForm(object sender, System.EventArgs e) + { + backBuffer.Init(this.CreateGraphics(), ClientRectangle.Width, ClientRectangle.Height); + Invalidate(); + } + + private void OnMouseUp(object sender, MouseEventArgs e) + { + if (mouseDown == true) + { + mouseDown = false; + Cursor = Cursors.Default; + } + } + + private void OnMouseDown(object sender, MouseEventArgs e) + { + if (mouseDown == false) + { + mouseDown = true; + mousePos = e.Location; + Cursor = Cursors.Hand; + } + } + + private void OnMouseMove(object sender, MouseEventArgs e) + { + if (mouseDown) + { + float dx = mousePos.X - e.Location.X; + + mousePos = e.Location; + + float DX = CurXD1 - CurXD0; + + float off_X = dx * DX / this.Width; + + if (Math.Abs(off_X) > 0) + { + starting_idx += off_X; + } + + Invalidate(); + } + } + + public void PaintGraphs(Graphics CurGraphics, float CurWidth, float CurHeight, float OFFX, float OFFY) + { + int CurGraphIdx = 0; + int VertTileCount = 1; + int HorTileCount = 1; + + float curOffY = 0; + float CurOffX = 0; + + if ((layout == LayoutMode.TILES_VER || layout == LayoutMode.TILES_HOR) && ActiveSources >= 1) + { + // calculate number of tiles + if (layout == LayoutMode.TILES_VER) + { + VertTileCount = 1; + HorTileCount = 1; + while (true) + { + if (VertTileCount * HorTileCount >= ActiveSources) break; + VertTileCount++; + if (VertTileCount * HorTileCount >= ActiveSources) break; + HorTileCount++; + } + } + else if (layout == LayoutMode.TILES_HOR) + { + VertTileCount = 1; + HorTileCount = 1; + while (true) + { + if (VertTileCount * HorTileCount >= ActiveSources) break; + HorTileCount++; + if (VertTileCount * HorTileCount >= ActiveSources) break; + VertTileCount++; + } + } + } + + foreach (DataSource source in sources) + { + source.Cur_YD0 = source.YD0; + source.Cur_YD1 = source.YD1; + + source.CurGraphHeight = CurHeight; + source.CurGraphWidth = CurWidth - pad_left - yLabelAreaWidth - pad_right; + + if (source.yFlip) + { + DX = XD1 - XD0; + } + else + { + DX = XD1 - XD0; + } + + CurXD0 = XD0; + CurXD1 = XD1; + + if (source.AutoScaleX && source.Samples.Length > 0) + { + CurXD0 = source.XMin - source.XAutoScaleOffset; + CurXD1 = source.XMax + source.XAutoScaleOffset; + DX = CurXD1 - CurXD0; + } + + if (source.Active) + { + if (source.AutoScaleY == true) + { + int idx_start = -1; + int idx_stop = -1; + float ymin = 0.0f; + float ymax = 0.0f; + float ymin_range = 0; + float ymax_range = 0; + + int DownSample = source.Downsampling; + PointF[] data = source.Samples; + float mult_y = source.CurGraphHeight / source.DY; + float mult_x = source.CurGraphWidth / DX; + float coff_x = off_X - starting_idx * mult_x; + + if (source.AutoScaleX) + { + coff_x = off_X ; + } + + for (int i = 0; i < data.Length - 1; i += DownSample) + { + float x = data[i].X * mult_x + coff_x; + + if (data[i].Y > ymax) ymax = data[i].Y; + if (data[i].Y < ymin) ymin = data[i].Y; + + if (x > 0 && x < (source.CurGraphWidth)) + { + if (idx_start == -1) idx_start = i; + idx_stop = i; + + if (data[i].Y > ymax_range) ymax_range = data[i].Y; + if (data[i].Y < ymin_range) ymin_range = data[i].Y; + } + } + + if (idx_start >= 0 && idx_stop >= 0) + { + float data_range = ymax - ymin; // this is range in the data + float delta_range = ymax_range - ymin_range; // this is the visible data range -> might be smaller + + source.Cur_YD0 = ymin_range; + source.Cur_YD1 = ymax_range; + } + } + + if (layout == LayoutMode.VERTICAL_ARRANGED && ActiveSources >= 1) + { + if (ActiveSources > 1) + { + source.CurGraphHeight = (float)(CurHeight - pad_top - pad_bot) / ActiveSources - GraphCaptionLineHeight; + float Diff = ((ActiveSources - 1) * pad_inter) / ActiveSources; + source.CurGraphHeight -= Diff; + } + else + { + source.CurGraphHeight = (float)(CurHeight - pad_top - pad_bot) - GraphCaptionLineHeight; + } + } + else if (layout == LayoutMode.STACKED && ActiveSources >= 1) + { + if (ActiveSources > 1) + { + source.CurGraphHeight = (float)(CurHeight - pad_top - pad_bot) / ActiveSources - GraphCaptionLineHeight; + } + else + { + source.CurGraphHeight = (float)(CurHeight - pad_top - pad_bot) - GraphCaptionLineHeight; + } + } + else if ((layout == LayoutMode.TILES_VER || layout == LayoutMode.TILES_HOR) && ActiveSources >= 1) + { + if (ActiveSources > 1) + { + source.CurGraphHeight = (float)(CurHeight - pad_top - pad_bot) / VertTileCount - GraphCaptionLineHeight; + float Diff = ((ActiveSources - 1) * pad_inter) / VertTileCount; + source.CurGraphHeight -= Diff; + source.CurGraphWidth = (float)(CurWidth - pad_left - pad_right) / HorTileCount - yLabelAreaWidth; + } + else + { + source.CurGraphHeight = (float)(CurHeight - pad_top - pad_bot) - GraphCaptionLineHeight; + } + } + else + { + source.CurGraphHeight = (float)(CurHeight - pad_top - pad_bot) - GraphCaptionLineHeight; + source.CurGraphWidth = CurWidth - pad_left - yLabelAreaWidth * ActiveSources - pad_right; + + } + + if (source.yFlip) + { + source.DY = source.Cur_YD0 - source.Cur_YD1; + + if (DX != 0 && source.DY != 0) + { + source.off_Y = -source.Cur_YD1 * source.CurGraphHeight / source.DY; + off_X = -CurXD0 * source.CurGraphWidth / DX; + } + } + else + { + source.DY = source.Cur_YD1 - source.Cur_YD0; + + if (DX != 0 && source.DY != 0) + { + source.off_Y = -source.Cur_YD0 * source.CurGraphHeight / source.DY; + off_X = -CurXD0 * source.CurGraphWidth / DX; + } + } + + if ((layout == LayoutMode.TILES_VER || layout == LayoutMode.TILES_HOR)) + { + if (ActiveSources > 1) + { + if (layout == LayoutMode.TILES_VER) + { + // TODO: calc curOffX and CurrOffY for CurGraphIdx!! + int CurIdxY = CurGraphIdx % VertTileCount; + int CurIdxX = CurGraphIdx / VertTileCount; + + curOffY = OFFY + pad_top + CurIdxY * (source.CurGraphHeight + GraphCaptionLineHeight); + CurOffX = OFFX + yLabelAreaWidth + pad_left + CurIdxX * (yLabelAreaWidth + source.CurGraphWidth); + } + else + { + int CurIdxX = CurGraphIdx % HorTileCount; + int CurIdxY = CurGraphIdx / HorTileCount; + + curOffY = OFFY + pad_top + CurIdxY * (source.CurGraphHeight + GraphCaptionLineHeight); + CurOffX = OFFX + yLabelAreaWidth + pad_left + CurIdxX * (yLabelAreaWidth + source.CurGraphWidth); + } + + } + else + { + // one active source + curOffY = OFFY + pad_top + CurGraphIdx * (source.CurGraphHeight + GraphCaptionLineHeight); + CurOffX = OFFX + pad_left + yLabelAreaWidth; + } + } + else if (layout == LayoutMode.VERTICAL_ARRANGED) + { + if (ActiveSources > 1) + { + curOffY = OFFY + pad_top + CurGraphIdx * (source.CurGraphHeight + GraphCaptionLineHeight + pad_inter); + } + else + { + curOffY = OFFY + pad_top + CurGraphIdx * (source.CurGraphHeight + GraphCaptionLineHeight); + } + + CurOffX = OFFX + pad_left + yLabelAreaWidth; + } + else if (layout == LayoutMode.STACKED) + { + if (ActiveSources > 1) + { + curOffY = OFFY + pad_top + CurGraphIdx * (source.CurGraphHeight); + } + else + { + curOffY = OFFY + pad_top + CurGraphIdx * (source.CurGraphHeight); + } + + CurOffX = OFFX + pad_left + yLabelAreaWidth; + } + else + { + CurOffX = OFFX + pad_left + yLabelAreaWidth * ActiveSources; + curOffY = OFFY + pad_top; + } + + DrawGrid(CurGraphics, source, CurOffX, curOffY + GraphCaptionLineHeight / 2); + + if (hasBoundingBox) + { + float w = source.CurGraphWidth; + float h = source.CurGraphHeight + GraphCaptionLineHeight / 2; + + DrawGraphBox(CurGraphics, CurOffX, curOffY, w, h); + + } + + List marker_pos = DrawGraphCurve(CurGraphics, source, CurOffX, curOffY + GraphCaptionLineHeight / 2); + + if (layout == LayoutMode.NORMAL) + { + DrawGraphCaption(CurGraphics, source, marker_pos, CurOffX + CurGraphIdx * (50 + yLabelAreaWidth) + (CurGraphIdx==0 ? 0 : 50), curOffY); + + if (CurGraphIdx == 0) + { + DrawXLabels(CurGraphics, source, marker_pos, CurOffX, curOffY); + } + + DrawYLabels(CurGraphics, source, marker_pos, CurOffX + yLabelAreaWidth * (CurGraphIdx - ActiveSources + 1), curOffY); + } + else + { + DrawGraphCaption(CurGraphics, source, marker_pos, CurOffX, curOffY); + + DrawXLabels(CurGraphics, source, marker_pos, CurOffX, curOffY); + + DrawYLabels(CurGraphics, source, marker_pos, CurOffX, curOffY); + } + + + + CurGraphIdx++; + } + } + } + + private void PaintStackedGraphs(Graphics CurGraphics,float CurWidth,float CurHeigth, float OFFX, float OFFY) + { + int CurGraphIdx = 0; + float curOffY = 0; + float CurOffX = 0; + + foreach (DataSource source in sources) + { + source.Cur_YD0 = source.YD0; + source.Cur_YD1 = source.YD1; + + source.CurGraphHeight = CurHeigth; + source.CurGraphWidth = CurWidth - pad_left - yLabelAreaWidth - pad_right; + + DX = XD1 - XD0; + + if (source.AutoScaleX && source.Samples.Length > 0) + { + DX = source.Samples[source.Samples.Length - 1].X; + } + + CurXD0 = XD0; + CurXD1 = XD1; + + if (source.Active) + { + if (source.AutoScaleY == true) + { + int idx_start = -1; + int idx_stop = -1; + float ymin = 0.0f; + float ymax = 0.0f; + float ymin_range = 0; + float ymax_range = 0; + + int DownSample = source.Downsampling; + PointF[] data = source.Samples; + float mult_y = source.CurGraphHeight / source.DY; + float mult_x = source.CurGraphWidth / DX; + float coff_x = off_X - starting_idx * mult_x; + + if (source.AutoScaleX) + { + coff_x = off_X; // avoid dragging in x-autoscale mode + } + + for (int i = 0; i < data.Length - 1; i += DownSample) + { + float x = data[i].X * mult_x + coff_x; + + if (data[i].Y > ymax) ymax = data[i].Y; + if (data[i].Y < ymin) ymin = data[i].Y; + + if (x > 0 && x < (source.CurGraphWidth)) + { + if (idx_start == -1) idx_start = i; + idx_stop = i; + + if (data[i].Y > ymax_range) ymax_range = data[i].Y; + if (data[i].Y < ymin_range) ymin_range = data[i].Y; + } + } + + if (idx_start >= 0 && idx_stop >= 0) + { + float data_range = ymax - ymin; // this is range in the data + float delta_range = ymax_range - ymin_range; // this is the visible data range -> might be smaller + + source.Cur_YD0 = ymin_range; + source.Cur_YD1 = ymax_range; + } + } + + if (ActiveSources > 1) + { + source.CurGraphHeight = (float)(CurHeigth - GraphCaptionLineHeight - pad_top - pad_bot) / ActiveSources; + } + else + { + source.CurGraphHeight = (float)(CurHeigth - GraphCaptionLineHeight - pad_top - pad_bot); + } + + if (source.yFlip) + { + source.DY = source.Cur_YD0 - source.Cur_YD1; + + if (DX != 0 && source.DY != 0) + { + source.off_Y = -source.Cur_YD1 * source.CurGraphHeight / source.DY; + off_X = -CurXD0 * source.CurGraphWidth / DX; + } + } + else + { + source.DY = source.Cur_YD1 - source.Cur_YD0; + + if (DX != 0 && source.DY != 0) + { + source.off_Y = -source.Cur_YD0 * source.CurGraphHeight / source.DY; + off_X = -CurXD0 * source.CurGraphWidth / DX; + } + } + + if (ActiveSources > 1) + { + curOffY = OFFY + pad_top + CurGraphIdx * (source.CurGraphHeight); + } + else + { + curOffY = OFFY + pad_top + CurGraphIdx * (source.CurGraphHeight); + } + + CurOffX = OFFX + pad_left + yLabelAreaWidth; + + DrawGrid(CurGraphics, source, CurOffX, curOffY + GraphCaptionLineHeight / 2); + + if (hasBoundingBox && CurGraphIdx == ActiveSources - 1) + { + DrawGraphBox(CurGraphics, pad_left + yLabelAreaWidth, pad_top, source.CurGraphWidth, CurHeigth - pad_top - GraphCaptionLineHeight); + } + + List marker_pos = DrawGraphCurve(CurGraphics, source, CurOffX, curOffY + GraphCaptionLineHeight / 2); + + DrawGraphCaption(CurGraphics, source, marker_pos, CurOffX + CurGraphIdx * (50 + yLabelAreaWidth) + (CurGraphIdx == 0 ? 0 : 50), pad_top); + + DrawYLabels(CurGraphics, source, marker_pos, CurOffX, curOffY); + + if (CurGraphIdx == ActiveSources - 1) + { + DrawXLabels(CurGraphics, source, marker_pos, pad_left, Height - pad_top - GraphCaptionLineHeight - source.CurGraphHeight); + } + + /* + if (hasBoundingBox && CurGraphIdx == ActiveSources - 1) + { + DrawGraphBox(CurGraphics, pad_left + yLabelAreaWidth, pad_top, source.CurGraphWidth, CurHeigth - pad_top - GraphCaptionLineHeight); + } + * */ + + CurGraphIdx++; + } + } + } + + public void PaintControl(Graphics CurGraphics, float CurWidth, float CurHeight, float OffX, float OffY, bool PaintBgnd) + { + if (PaintBgnd) + { + DrawBackground(CurGraphics,CurWidth,CurHeight,OffX,OffY); + } + + ActiveSources = 0; + + foreach (DataSource source in sources) + { + if (source.Samples != null && + source.Samples.Length > 0 && + source.Active == true) + { + ActiveSources++; + } + } + + switch (layout) + { + case LayoutMode.NORMAL: + + case LayoutMode.TILES_HOR: + case LayoutMode.TILES_VER: + case LayoutMode.VERTICAL_ARRANGED: + + PaintGraphs(CurGraphics, CurWidth, CurHeight, OffX, OffY); + + break; + + case LayoutMode.STACKED: + + PaintStackedGraphs(CurGraphics, CurWidth, CurHeight, OffX, OffY); + + break; + } + } + + protected override void OnPaint(PaintEventArgs e) + { + try + { + if (ParentForm != null) + { + Graphics CurGraphics = e.Graphics; + + if (backBuffer.Graphics != null && useDoubleBuffer == true) + { + CurGraphics = backBuffer.Graphics; + } + + CurGraphics.SmoothingMode = smoothing; + + PaintControl(CurGraphics,this.Width,this.Height,0,0,true); + + if (backBuffer.Graphics != null && useDoubleBuffer == true) + { + backBuffer.Render(e.Graphics); + } + } + } + catch (Exception ex) + { + Console.Write("exception : " + ex.Message); + } + + base.OnPaint(e); + } + + + private void DrawBackground(Graphics g,float CurWidth, float CurHeight, float CurOFFX, float CurOFFY) + { + Rectangle rbgn = new Rectangle((int)CurOFFX, (int)CurOFFY, (int)CurWidth, (int)CurHeight); + + if (BgndColorTop != BgndColorBot) + { + using (LinearGradientBrush lb1 = new LinearGradientBrush(new Point((int)0, (int)0), + new Point((int)0, (int)(CurHeight)), + BgndColorTop, + BgndColorBot)) + { + g.FillRectangle(lb1, rbgn); + } + } + else + { + using (SolidBrush sb1 = new SolidBrush(BgndColorTop)) + { + g.FillRectangle(sb1, rbgn); + } + } + } + + + private void DrawGrid( Graphics g, DataSource source, float CurrOffX, float CurOffY ) + { + int Idx = 0; + float mult_x = source.CurGraphWidth / DX; + float coff_x = off_X - starting_idx * mult_x; + + if (source.AutoScaleX) + { + coff_x = off_X; // avoid dragging in x-autoscale mode + } + + Color CurGridColor = MajorGridColor; + Color CurMinGridClor = MinorGridColor; + + if (layout == LayoutMode.NORMAL && source.AutoScaleY) + { + CurGridColor = source.GraphColor; + CurMinGridClor = source.GraphColor; + } + + using (Pen minorGridPen = new Pen(CurMinGridClor)) + { + minorGridPen.DashPattern = MinorGridPattern; + minorGridPen.DashStyle = MinorGridDashStyle; + + using (Pen p2 = new Pen(CurGridColor)) + { + p2.DashPattern = MajorGridPattern; + p2.DashStyle = MajorGridDashStyle; + + if (DX != 0) + { + while (true) + { + float x = Idx * grid_distance_x * source.CurGraphWidth / DX + grid_off_x * source.CurGraphWidth / DX; + + if (MoveMinorGrid) + { + x += coff_x; + } + + if (x > 0 && x < source.CurGraphWidth) + { + g.DrawLine(minorGridPen, new Point((int)(x + CurrOffX - 0.5f), (int)(CurOffY)), + new Point((int)(x + CurrOffX - 0.5f), (int)(CurOffY + source.CurGraphHeight))); + } + if (x > source.CurGraphWidth) + { + break; + } + + Idx++; + } + } + + if (source.DY != 0) + { + float y0 = (float)(source.grid_off_y * source.CurGraphHeight / source.DY + source.off_Y); + + // draw horizontal zero grid lines + if (0 >= source.YD0 && 0 <= source.YD1) + { + g.DrawLine(p2, new Point((int)CurrOffX, (int)(CurOffY + y0 + 0.5f)), new Point((int)(CurrOffX + source.CurGraphWidth + 0.5f), (int)(CurOffY + y0 + 0.5f))); + } + + // draw horizontal grid lines + for (float idy = source.grid_off_y; idy > source.YD0; idy -= source.grid_distance_y) + { + float y = (idy * source.CurGraphHeight) / source.DY + source.off_Y; + + if (y >= 0 && y < source.CurGraphHeight) + { + g.DrawLine(minorGridPen, + new Point((int)CurrOffX, (int)(CurOffY + y + 0.5f)), + new Point((int)(CurrOffX + source.CurGraphWidth + 0.5f), (int)(0.5f + CurOffY + y))); + } + } + + // draw horizontal grid lines + for (float idy = source.grid_off_y; idy < source.YD1; idy += source.grid_distance_y) + { + float y = (idy * source.CurGraphHeight) / source.DY + source.off_Y; + + if (y >= 0 && y < source.CurGraphHeight) + { + g.DrawLine(minorGridPen, + new Point((int)CurrOffX, (int)(CurOffY + y + 0.5f)), + new Point((int)(CurrOffX + source.CurGraphWidth + 0.5f), (int)(0.5f + CurOffY + y))); + } + } + } + } + } + } + + + private List DrawGraphCurve(Graphics g, DataSource source, float offset_x, float offset_y) + { + List marker_positions = new List(); + + if (DX != 0 && source.DY != 0) + { + List ps = new List(); + + if (source.Samples != null && source.Samples.Length > 1) + { + + int DownSample = source.Downsampling; + PointF[] data = source.Samples; + float mult_y = source.CurGraphHeight / source.DY; + float mult_x = source.CurGraphWidth / DX; + float coff_x = off_X - starting_idx * mult_x; + + if (source.AutoScaleX) + { + coff_x = off_X; // avoid dragging in x-autoscale mode + } + + for (int i = 0; i < data.Length - 1; i += DownSample) + { + float x = data[i].X * mult_x + coff_x; + float y = data[i].Y * mult_y + source.off_Y; + + int xi = (int)(data[i].X); + + if (xi % grid_distance_x == 0) + { + if (x >= (0 - xLabelAreaheight) && x <= (source.CurGraphWidth + xLabelAreaheight)) + { + marker_positions.Add(i); + } + } + + if (x > 0 && x < (source.CurGraphWidth)) + { + ps.Add(new Point((int)(x + offset_x+0.5f), (int)(y + offset_y + 0.5f))); + } + else if (x > source.CurGraphWidth) + { + break; + } + } + + using (Pen p = new Pen(source.GraphColor)) + { + if (ps.Count > 0) + { + g.DrawLines(p, ps.ToArray()); + } + } + } + } + return marker_positions; + } + + + private void DrawGraphCaption(Graphics g, DataSource source, IList marker_pos, float offset_x, float offset_y) + { + using (Brush brush = new SolidBrush(source.GraphColor)) + { + using (Pen pen = new Pen(brush)) + { + pen.DashPattern = MajorGridPattern; + + g.DrawString(source.Name, legendFont, brush, new PointF(offset_x + graphCaptionOffset.X + 12, offset_y +graphCaptionOffset.Y+ 2)); + + } + } + } + + + private void DrawXLabels(Graphics g, DataSource source, IList marker_pos, float offset_x, float offset_y) + { + Color XLabColor = source.GraphColor; + + if (layout == LayoutMode.NORMAL || layout == LayoutMode.STACKED) + { + XLabColor = GraphBoxColor; + } + + using (Brush brush = new SolidBrush(XLabColor)) + { + using (Pen pen = new Pen(brush)) + { + pen.DashPattern = MajorGridPattern; + + if (DX != 0 && source.DY != 0) + { + if (source.Samples != null && source.Samples.Length > 1) + { + PointF[] data = source.Samples; + + float mult_y = source.CurGraphHeight / source.DY; + float mult_x = source.CurGraphWidth / DX; + + float coff_x = off_X - starting_idx * mult_x; + + if (source.AutoScaleX) + { + coff_x = off_X; // avoid dragging in x-autoscale mode + } + + foreach (int i in marker_pos) + { + int xi = (int)(data[i].X); + + if (xi % grid_distance_x == 0) + { + float x = data[i].X * mult_x + coff_x; + + String value = "" + data[i].X; + + if (source.OnRenderXAxisLabel != null) + { + value = source.OnRenderXAxisLabel(source, i); + } + + /// TODO: find out how to calculate this offset. Must be padding + something else + float unknownOffset = -14;// -14; + + if (MoveMinorGrid == false) + { + g.DrawLine(pen, x, offset_y + GraphCaptionLineHeight + source.CurGraphHeight + unknownOffset, + x, offset_y + GraphCaptionLineHeight + source.CurGraphHeight); + + g.DrawString(value, legendFont, brush, + new PointF((int)(0.5f + x + offset_x + 4), + GraphCaptionLineHeight + offset_y + source.CurGraphHeight + unknownOffset)); + } + else + { + SizeF dim = g.MeasureString(value, legendFont); + g.DrawString(value, legendFont, brush, + new PointF((int)(0.5f + x + offset_x + 4 - dim.Width / 2), + GraphCaptionLineHeight + offset_y + source.CurGraphHeight + unknownOffset)); + + } + } + } + } + } + + + } + } + } + + + private void DrawYLabels(Graphics g, DataSource source, IList marker_pos, float offset_x, float offset_y ) + { + using (Brush b = new SolidBrush(source.GraphColor)) + { + using (Pen pen = new Pen(b)) + { + pen.DashPattern = new float[] { 2, 2 }; + + float GridDistY = source.grid_distance_y; + /// + if (source.AutoScaleY) + { + // calculate a matching grid distance + GridDistY = -Utilities.MostSignificantDigit(source.DY); + + if (GridDistY == 0) + { + GridDistY = source.grid_distance_y; + } + } + + // draw labels for horizontal lines + if (source.DY != 0) + { + float y0 = (float)(source.grid_off_y * source.CurGraphHeight / source.DY + source.off_Y); + if (y0 >= 0 && y0 < source.CurGraphHeight) + { + String value = (source.OnRenderYAxisLabel == null) ? "0" : source.OnRenderYAxisLabel(source, 0); + SizeF dim = g.MeasureString(value, legendFont); + g.DrawString(value, legendFont, b, new PointF((int)offset_x - dim.Width, (int)(offset_y + y0 + 0.5f + dim.Height / 2))); + } + + for (float Idx = source.grid_off_y; Idx > source.YD0; Idx -= GridDistY) + { + if (Idx != 0) + { + float y1 = (float)(Idx * source.CurGraphHeight) / source.DY + source.off_Y; + + if (y1 >= 0 && y1 < source.CurGraphHeight) + { + string value = (source.OnRenderYAxisLabel == null) ? Idx.ToString() : source.OnRenderYAxisLabel(source, Idx); + SizeF dim = g.MeasureString(value, legendFont); + g.DrawString(value, legendFont, b, new PointF((int)offset_x - dim.Width, (int)(offset_y + y1 + 0.5f + dim.Height / 2))); + } + } + } + + for (float Idx = source.grid_off_y; Idx < source.YD1; Idx += GridDistY) + { + if (Idx != 0) + { + float y2 = (float)(Idx * source.CurGraphHeight) / source.DY + source.off_Y; + + if (y2 >= 0 && y2 < source.CurGraphHeight) + { + string value = (source.OnRenderYAxisLabel == null) ? Idx.ToString() : source.OnRenderYAxisLabel(source, Idx); + SizeF dim = g.MeasureString(value, legendFont); + g.DrawString(value, legendFont, b, new PointF((int)offset_x - dim.Width, (int)(offset_y + y2 + 0.5f + dim.Height / 2))); + } + } + } + } + } + } + } + + + private void DrawGraphBox(Graphics g, float offset_x, float offset_y, float w, float h ) + { + using (Pen p2 = new Pen(GraphBoxColor)) + { + g.DrawLine(p2, new Point((int)(offset_x + 0.5f), (int)(offset_y + 0.5f)), + new Point((int)(offset_x + w - 0.5f), (int)(offset_y + 0.5f))); + + g.DrawLine(p2, new Point((int)(offset_x + w - 0.5f), (int)(offset_y + 0.5f)), + new Point((int)(offset_x + w - 0.5f), (int)(offset_y + h + 0.5f))); + + g.DrawLine(p2, new Point((int)(offset_x + w - 0.5f), (int)(offset_y + h + 0.5f)), + new Point((int)(offset_x + 0.5f), (int)(offset_y + h + 0.5f))); + + g.DrawLine(p2, new Point((int)(offset_x + 0.5f), (int)(offset_y + h + 0.5f)), + new Point((int)(offset_x + 0.5f), (int)(offset_y + 0.5f))); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/GraphLib/PlotterGraphPaneEx.resx b/TBF_V2/Sources/TBF/GraphLib/PlotterGraphPaneEx.resx new file mode 100644 index 00000000..19dc0dd8 --- /dev/null +++ b/TBF_V2/Sources/TBF/GraphLib/PlotterGraphPaneEx.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/GraphLib/PlotterGraphSelectCurvesForm.Designer.cs b/TBF_V2/Sources/TBF/GraphLib/PlotterGraphSelectCurvesForm.Designer.cs new file mode 100644 index 00000000..331db07e --- /dev/null +++ b/TBF_V2/Sources/TBF/GraphLib/PlotterGraphSelectCurvesForm.Designer.cs @@ -0,0 +1,365 @@ +namespace GraphLib +{ + partial class PlotterGraphSelectCurvesForm + { + /// + /// 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() + { + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.lb_Graphs = new System.Windows.Forms.CheckedListBox(); + this.gB_SelectedGraph = new System.Windows.Forms.GroupBox(); + this.cb_X_AutoScale = new System.Windows.Forms.CheckBox(); + this.tb_GraphName = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.cbDownSampling = new System.Windows.Forms.ComboBox(); + this.label2 = new System.Windows.Forms.Label(); + this.btn_GraphColor = new System.Windows.Forms.Button(); + this.cb_Y_AutoScale = new System.Windows.Forms.CheckBox(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.label7 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.bt_MinorGridColor = new System.Windows.Forms.Button(); + this.bt_bg_col_bot = new System.Windows.Forms.Button(); + this.label6 = new System.Windows.Forms.Label(); + this.bt_MajorGridColor = new System.Windows.Forms.Button(); + this.label4 = new System.Windows.Forms.Label(); + this.bt_bg_col_top = new System.Windows.Forms.Button(); + this.btn_AutoScaleAll = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.cb_Layout = new System.Windows.Forms.ComboBox(); + this.button1 = new System.Windows.Forms.Button(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.gB_SelectedGraph.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.lb_Graphs); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.gB_SelectedGraph); + this.splitContainer1.Panel2.Controls.Add(this.groupBox1); + this.splitContainer1.Panel2.Controls.Add(this.button1); + this.splitContainer1.Size = new System.Drawing.Size(395, 431); + this.splitContainer1.SplitterDistance = 171; + this.splitContainer1.TabIndex = 0; + // + // lb_Graphs + // + this.lb_Graphs.Dock = System.Windows.Forms.DockStyle.Fill; + this.lb_Graphs.FormattingEnabled = true; + this.lb_Graphs.Location = new System.Drawing.Point(0, 0); + this.lb_Graphs.Name = "lb_Graphs"; + this.lb_Graphs.Size = new System.Drawing.Size(171, 424); + this.lb_Graphs.TabIndex = 0; + this.lb_Graphs.SelectedIndexChanged += new System.EventHandler(this.checkedListBox1_SelectedIndexChanged_1); + // + // gB_SelectedGraph + // + this.gB_SelectedGraph.Controls.Add(this.cb_X_AutoScale); + this.gB_SelectedGraph.Controls.Add(this.tb_GraphName); + this.gB_SelectedGraph.Controls.Add(this.label3); + this.gB_SelectedGraph.Controls.Add(this.cbDownSampling); + this.gB_SelectedGraph.Controls.Add(this.label2); + this.gB_SelectedGraph.Controls.Add(this.btn_GraphColor); + this.gB_SelectedGraph.Controls.Add(this.cb_Y_AutoScale); + this.gB_SelectedGraph.Location = new System.Drawing.Point(6, 232); + this.gB_SelectedGraph.Name = "gB_SelectedGraph"; + this.gB_SelectedGraph.Size = new System.Drawing.Size(206, 158); + this.gB_SelectedGraph.TabIndex = 6; + this.gB_SelectedGraph.TabStop = false; + this.gB_SelectedGraph.Text = "Selected Graph Options"; + this.gB_SelectedGraph.Visible = false; + // + // cb_X_AutoScale + // + this.cb_X_AutoScale.AutoSize = true; + this.cb_X_AutoScale.Location = new System.Drawing.Point(12, 102); + this.cb_X_AutoScale.Name = "cb_X_AutoScale"; + this.cb_X_AutoScale.Size = new System.Drawing.Size(93, 17); + this.cb_X_AutoScale.TabIndex = 8; + this.cb_X_AutoScale.Text = "X AutoScaling"; + this.cb_X_AutoScale.UseVisualStyleBackColor = true; + this.cb_X_AutoScale.CheckedChanged += new System.EventHandler(this.cb_X_AutoScale_CheckedChanged); + // + // tb_GraphName + // + this.tb_GraphName.Location = new System.Drawing.Point(12, 24); + this.tb_GraphName.Name = "tb_GraphName"; + this.tb_GraphName.Size = new System.Drawing.Size(167, 20); + this.tb_GraphName.TabIndex = 7; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(52, 133); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(76, 13); + this.label3.TabIndex = 6; + this.label3.Text = "Downsampling"; + // + // cbDownSampling + // + this.cbDownSampling.FormattingEnabled = true; + this.cbDownSampling.Items.AddRange(new object[] { + "1", + "2", + "3", + "4", + "5", + "6"}); + this.cbDownSampling.Location = new System.Drawing.Point(7, 130); + this.cbDownSampling.Name = "cbDownSampling"; + this.cbDownSampling.Size = new System.Drawing.Size(39, 21); + this.cbDownSampling.TabIndex = 5; + this.cbDownSampling.Text = "1"; + this.cbDownSampling.SelectedIndexChanged += new System.EventHandler(this.OnDownsamplingChanged); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(57, 55); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(63, 13); + this.label2.TabIndex = 4; + this.label2.Text = "Graph Color"; + // + // btn_GraphColor + // + this.btn_GraphColor.Location = new System.Drawing.Point(11, 50); + this.btn_GraphColor.Name = "btn_GraphColor"; + this.btn_GraphColor.Size = new System.Drawing.Size(26, 23); + this.btn_GraphColor.TabIndex = 3; + this.btn_GraphColor.UseVisualStyleBackColor = true; + this.btn_GraphColor.Click += new System.EventHandler(this.btn_GraphColor_Click); + // + // cb_Y_AutoScale + // + this.cb_Y_AutoScale.AutoSize = true; + this.cb_Y_AutoScale.Location = new System.Drawing.Point(12, 79); + this.cb_Y_AutoScale.Name = "cb_Y_AutoScale"; + this.cb_Y_AutoScale.Size = new System.Drawing.Size(93, 17); + this.cb_Y_AutoScale.TabIndex = 2; + this.cb_Y_AutoScale.Text = "Y AutoScaling"; + this.cb_Y_AutoScale.UseVisualStyleBackColor = true; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.label7); + this.groupBox1.Controls.Add(this.label5); + this.groupBox1.Controls.Add(this.bt_MinorGridColor); + this.groupBox1.Controls.Add(this.bt_bg_col_bot); + this.groupBox1.Controls.Add(this.label6); + this.groupBox1.Controls.Add(this.bt_MajorGridColor); + this.groupBox1.Controls.Add(this.label4); + this.groupBox1.Controls.Add(this.bt_bg_col_top); + this.groupBox1.Controls.Add(this.btn_AutoScaleAll); + this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Controls.Add(this.cb_Layout); + this.groupBox1.Location = new System.Drawing.Point(6, 5); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(206, 221); + this.groupBox1.TabIndex = 4; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "General Options"; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(57, 194); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(82, 13); + this.label7.TabIndex = 10; + this.label7.Text = "Minor Grid Color"; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(57, 136); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(128, 13); + this.label5.TabIndex = 8; + this.label5.Text = "Background Color Bottom"; + // + // bt_MinorGridColor + // + this.bt_MinorGridColor.Location = new System.Drawing.Point(11, 189); + this.bt_MinorGridColor.Name = "bt_MinorGridColor"; + this.bt_MinorGridColor.Size = new System.Drawing.Size(26, 23); + this.bt_MinorGridColor.TabIndex = 9; + this.bt_MinorGridColor.UseVisualStyleBackColor = true; + this.bt_MinorGridColor.Click += new System.EventHandler(this.bt_MinorGridColor_Click); + // + // bt_bg_col_bot + // + this.bt_bg_col_bot.Location = new System.Drawing.Point(11, 131); + this.bt_bg_col_bot.Name = "bt_bg_col_bot"; + this.bt_bg_col_bot.Size = new System.Drawing.Size(26, 23); + this.bt_bg_col_bot.TabIndex = 7; + this.bt_bg_col_bot.UseVisualStyleBackColor = true; + this.bt_bg_col_bot.Click += new System.EventHandler(this.bt_bg_col_bot_Click); + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(57, 165); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(82, 13); + this.label6.TabIndex = 8; + this.label6.Text = "Major Grid Color"; + // + // bt_MajorGridColor + // + this.bt_MajorGridColor.Location = new System.Drawing.Point(11, 160); + this.bt_MajorGridColor.Name = "bt_MajorGridColor"; + this.bt_MajorGridColor.Size = new System.Drawing.Size(26, 23); + this.bt_MajorGridColor.TabIndex = 7; + this.bt_MajorGridColor.UseVisualStyleBackColor = true; + this.bt_MajorGridColor.Click += new System.EventHandler(this.bt_MajorGridColor_Click); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(57, 107); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(114, 13); + this.label4.TabIndex = 6; + this.label4.Text = "Background Color Top"; + // + // bt_bg_col_top + // + this.bt_bg_col_top.Location = new System.Drawing.Point(11, 102); + this.bt_bg_col_top.Name = "bt_bg_col_top"; + this.bt_bg_col_top.Size = new System.Drawing.Size(26, 23); + this.bt_bg_col_top.TabIndex = 5; + this.bt_bg_col_top.UseVisualStyleBackColor = true; + this.bt_bg_col_top.Click += new System.EventHandler(this.bt_bg_col_top_Click); + // + // btn_AutoScaleAll + // + this.btn_AutoScaleAll.Location = new System.Drawing.Point(11, 69); + this.btn_AutoScaleAll.Name = "btn_AutoScaleAll"; + this.btn_AutoScaleAll.Size = new System.Drawing.Size(167, 25); + this.btn_AutoScaleAll.TabIndex = 4; + this.btn_AutoScaleAll.Text = "Auto Scale All"; + this.btn_AutoScaleAll.UseVisualStyleBackColor = true; + this.btn_AutoScaleAll.Click += new System.EventHandler(this.OnButtonAutoScallOnClicked); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(9, 26); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(39, 13); + this.label1.TabIndex = 3; + this.label1.Text = "Layout"; + // + // cb_Layout + // + this.cb_Layout.FormattingEnabled = true; + this.cb_Layout.Items.AddRange(new object[] { + "Normal", + "Stacked", + "Tiles - Fill Vertical", + "Tiles - Fill Horizontal", + "Vertically"}); + this.cb_Layout.Location = new System.Drawing.Point(11, 42); + this.cb_Layout.Name = "cb_Layout"; + this.cb_Layout.Size = new System.Drawing.Size(168, 21); + this.cb_Layout.TabIndex = 2; + this.cb_Layout.Text = "Select"; + this.cb_Layout.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(66, 396); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(68, 23); + this.button1.TabIndex = 0; + this.button1.Text = "Exit"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // PlotterGraphSelectCurvesForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(395, 431); + this.Controls.Add(this.splitContainer1); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(16, 246); + this.Name = "PlotterGraphSelectCurvesForm"; + this.Text = "Graph Properties"; + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.ResumeLayout(false); + this.gB_SelectedGraph.ResumeLayout(false); + this.gB_SelectedGraph.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.CheckedListBox lb_Graphs; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox cb_Layout; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Button btn_GraphColor; + private System.Windows.Forms.CheckBox cb_Y_AutoScale; + private System.Windows.Forms.Button btn_AutoScaleAll; + private System.Windows.Forms.GroupBox gB_SelectedGraph; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.ComboBox cbDownSampling; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Button bt_bg_col_top; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Button bt_bg_col_bot; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.Button bt_MinorGridColor; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Button bt_MajorGridColor; + private System.Windows.Forms.TextBox tb_GraphName; + private System.Windows.Forms.CheckBox cb_X_AutoScale; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/GraphLib/PlotterGraphSelectCurvesForm.cs b/TBF_V2/Sources/TBF/GraphLib/PlotterGraphSelectCurvesForm.cs new file mode 100644 index 00000000..115e44dc --- /dev/null +++ b/TBF_V2/Sources/TBF/GraphLib/PlotterGraphSelectCurvesForm.cs @@ -0,0 +1,369 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + + +/* Copyright (c) 2008-2014 DI Zimmermann Stephan (stefan.zimmermann@tele2.at) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +namespace GraphLib +{ + public partial class PlotterGraphSelectCurvesForm : Form + { + private int selectetGraphIndex = -1; + + private PlotterGraphPaneEx gpane = null; + + public PlotterGraphSelectCurvesForm() + { + InitializeComponent(); + FormClosing += new FormClosingEventHandler(OnFormClosing); + lb_Graphs.SelectedIndexChanged += new EventHandler(OnSelectedGraphIndexChanged); + VisibleChanged += new EventHandler(OnVisibleChanged); + tb_GraphName.TextChanged += new EventHandler(tb_GraphName_TextChanged); + } + + void tb_GraphName_TextChanged(object sender, EventArgs e) + { + if (selectetGraphIndex >= 0 && selectetGraphIndex < gpane.Sources.Count) + { + DataSource src = gpane.Sources[selectetGraphIndex]; + String Text = tb_GraphName.Text; + + if (String.IsNullOrEmpty(Text) == false) + { + src.Name = Text; + gpane.Invalidate(); + } + } + } + + public PlotterGraphPaneEx GraphPanel + { + set + { + gpane = value; + if (gpane != null) + { + this.lb_Graphs.Items.Clear(); + + foreach (DataSource s in gpane.Sources) + { + if (s.Active) + { + this.lb_Graphs.Items.Add(s.Name, CheckState.Checked); + } + else + { + this.lb_Graphs.Items.Add(s.Name, CheckState.Unchecked); + } + } + + UpdateAllCheckedState(); + } + } + } + + void UpdateAllCheckedState() + { + int AutoScaleOn = 0; + + foreach (DataSource src in gpane.Sources) + { + if (src.AutoScaleY) + { + AutoScaleOn++; + } + } + + if (AutoScaleOn == 0) + { + btn_AutoScaleAll.Visible = true; + btn_AutoScaleAll.Text = "Auto Y-Scale all Graphs"; + } + else + { + btn_AutoScaleAll.Visible = true; + btn_AutoScaleAll.Text = "Normal Y-Scale all Graphs"; + } + } + + void OnVisibleChanged(object sender, EventArgs e) + { + if (this.Visible == true) + { + selectetGraphIndex = -1; + gB_SelectedGraph.Visible = false; + + if (gpane != null) + { + UpdateAllCheckedState(); + + if (gpane.layout == PlotterGraphPaneEx.LayoutMode.NORMAL) + { + cb_Layout.SelectedIndex = 0; + } + else if (gpane.layout == PlotterGraphPaneEx.LayoutMode.STACKED) + { + cb_Layout.SelectedIndex = 1; + } + else if (gpane.layout == PlotterGraphPaneEx.LayoutMode.TILES_HOR) + { + cb_Layout.SelectedIndex = 2; + } + else if (gpane.layout == PlotterGraphPaneEx.LayoutMode.TILES_VER) + { + cb_Layout.SelectedIndex = 3; + } + else if (gpane.layout == PlotterGraphPaneEx.LayoutMode.VERTICAL_ARRANGED) + { + cb_Layout.SelectedIndex = 4; + } + + bt_bg_col_top.BackColor = gpane.BgndColorTop; + bt_bg_col_bot.BackColor = gpane.BgndColorBot; + bt_MajorGridColor.BackColor = gpane.MajorGridColor; + bt_MinorGridColor.BackColor = gpane.MinorGridColor; + + } + } + } + + + void OnSelectedGraphIndexChanged(object sender, EventArgs e) + { + if (gpane != null) + { + for (int i = 0; i < gpane.Sources.Count; i++) + { + if (lb_Graphs.CheckedIndices.Contains(i)) + { + gpane.Sources[i].Active = true; + } + else + { + gpane.Sources[i].Active = false; + } + } + gpane.Invalidate(); + } + } + + void OnFormClosing(object sender, FormClosingEventArgs e) + { + this.Hide(); + e.Cancel = true; + } + + private void button1_Click(object sender, EventArgs e) + { + this.Hide(); + } + + private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) + { + if (cb_Layout.SelectedIndex == 0) + { + gpane.layout = PlotterGraphPaneEx.LayoutMode.NORMAL; + } + if (cb_Layout.SelectedIndex == 1) + { + gpane.layout = PlotterGraphPaneEx.LayoutMode.STACKED; + } + + if (cb_Layout.SelectedIndex == 2) + { + gpane.layout = PlotterGraphPaneEx.LayoutMode.TILES_VER; + } + if (cb_Layout.SelectedIndex == 3) + { + gpane.layout = PlotterGraphPaneEx.LayoutMode.TILES_HOR; + } + if (cb_Layout.SelectedIndex == 4) + { + gpane.layout = PlotterGraphPaneEx.LayoutMode.VERTICAL_ARRANGED; + } + gpane.Invalidate(); + } + + private void checkedListBox1_SelectedIndexChanged_1(object sender, EventArgs e) + { + selectetGraphIndex = lb_Graphs.SelectedIndex; + + UpdateSelectedGraphInfo(); + gB_SelectedGraph.Visible = true; + } + + private void UpdateSelectedGraphInfo() + { + if (selectetGraphIndex >= 0 && selectetGraphIndex < gpane.Sources.Count) + { + DataSource src = gpane.Sources[selectetGraphIndex]; + btn_GraphColor.BackColor = src.GraphColor; + + cb_Y_AutoScale.Checked = src.AutoScaleY; + cb_X_AutoScale.Checked = src.AutoScaleX; + + cbDownSampling.SelectedIndex = (src.Downsampling - 1); + tb_GraphName.Text = src.Name; + } + } + + private void btn_GraphColor_Click(object sender, EventArgs e) + { + if (selectetGraphIndex >= 0 && selectetGraphIndex < gpane.Sources.Count) + { + DataSource src = gpane.Sources[selectetGraphIndex]; + ColorDialog d = new ColorDialog(); + if (d.ShowDialog() == DialogResult.OK) + { + btn_GraphColor.BackColor = d.Color; + src.GraphColor = d.Color; + gpane.Invalidate(); + } + } + } + + + private void OnButtonAutoScallOnClicked(object sender, EventArgs e) + { + int AutoScaleOn = 0; + + foreach (DataSource src in gpane.Sources) + { + if (src.AutoScaleY) + { + AutoScaleOn++; + } + } + + if (AutoScaleOn == 0) + { + btn_AutoScaleAll.Text = "Normal scale for all graphs"; + foreach (DataSource src in gpane.Sources) + { + src.AutoScaleY = true; + } + } + else + { + btn_AutoScaleAll.Text = "Auto scale for all graphs"; + foreach (DataSource src in gpane.Sources) + { + src.AutoScaleY = false; + } + } + + UpdateSelectedGraphInfo(); + gpane.Invalidate(); + } + + private void OnDownsamplingChanged(object sender, EventArgs e) + { + if (selectetGraphIndex >= 0 && selectetGraphIndex < gpane.Sources.Count) + { + DataSource src = gpane.Sources[selectetGraphIndex]; + + src.Downsampling = (cbDownSampling.SelectedIndex + 1); + } + + gpane.Invalidate(); + } + + private void bt_bg_col_top_Click(object sender, EventArgs e) + { + ColorDialog d = new ColorDialog(); + if (d.ShowDialog() == DialogResult.OK) + { + bt_bg_col_top.BackColor = d.Color; + gpane.BgndColorTop = d.Color; + + gpane.Invalidate(); + } + } + + private void bt_bg_col_bot_Click(object sender, EventArgs e) + { + ColorDialog d = new ColorDialog(); + if (d.ShowDialog() == DialogResult.OK) + { + bt_bg_col_bot.BackColor = d.Color; + gpane.BgndColorBot = d.Color; + gpane.Invalidate(); + } + } + + private void bt_MajorGridColor_Click(object sender, EventArgs e) + { + ColorDialog d = new ColorDialog(); + if (d.ShowDialog() == DialogResult.OK) + { + bt_MajorGridColor.BackColor = d.Color; + gpane.MajorGridColor = d.Color; + gpane.Invalidate(); + } + } + + private void bt_MinorGridColor_Click(object sender, EventArgs e) + { + ColorDialog d = new ColorDialog(); + if (d.ShowDialog() == DialogResult.OK) + { + bt_MinorGridColor.BackColor = d.Color; + gpane.MinorGridColor = d.Color; + gpane.Invalidate(); + } + } + + private void cb_Y_AutoScale_CheckedChanged(object sender, EventArgs e) + { + if (selectetGraphIndex >= 0 && selectetGraphIndex < gpane.Sources.Count) + { + DataSource src = gpane.Sources[selectetGraphIndex]; + + src.AutoScaleY = cb_Y_AutoScale.Checked; + + UpdateAllCheckedState(); + + gpane.Invalidate(); + } + } + + private void cb_X_AutoScale_CheckedChanged(object sender, EventArgs e) + { + if (selectetGraphIndex >= 0 && selectetGraphIndex < gpane.Sources.Count) + { + DataSource src = gpane.Sources[selectetGraphIndex]; + + src.AutoScaleX = cb_X_AutoScale.Checked; + + UpdateAllCheckedState(); + + gpane.Invalidate(); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/GraphLib/PlotterGraphSelectCurvesForm.resx b/TBF_V2/Sources/TBF/GraphLib/PlotterGraphSelectCurvesForm.resx new file mode 100644 index 00000000..19dc0dd8 --- /dev/null +++ b/TBF_V2/Sources/TBF/GraphLib/PlotterGraphSelectCurvesForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/GraphLib/PrecisionTimer.cs b/TBF_V2/Sources/TBF/GraphLib/PrecisionTimer.cs new file mode 100644 index 00000000..5480f2e1 --- /dev/null +++ b/TBF_V2/Sources/TBF/GraphLib/PrecisionTimer.cs @@ -0,0 +1,490 @@ +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.Runtime.InteropServices; + +#region License + +/* + * Based on the work of Leslie Sanford + */ + +#endregion + + +namespace PrecisionTimer +{ + public enum Mode + { + OneShot, + Periodic + }; + + [StructLayout(LayoutKind.Sequential)] + public struct TimerCaps + { + public int periodMin; + public int periodMax; + } + + + public sealed class Timer : IComponent + { + private delegate void TimeProc(int id, int msg, int user, int param1, int param2); + + private delegate void EventRaiser(EventArgs e); + + [DllImport("winmm.dll")] + private static extern int timeGetDevCaps(ref TimerCaps caps, + int sizeOfTimerCaps); + + [DllImport("winmm.dll")] + private static extern int timeSetEvent(int delay, + int resolution, + TimeProc proc, + int user, + int mode); + + [DllImport("winmm.dll")] + private static extern int timeKillEvent(int id); + + private const int TIMERR_NOERROR = 0; + + private int timerID; + + private volatile Mode mode; + + private volatile int period; + + private volatile int resolution; + + private TimeProc timeProcPeriodic; + + private TimeProc timeProcOneShot; + + private EventRaiser tickRaiser; + + private bool running = false; + + private volatile bool disposed = false; + + private ISynchronizeInvoke synchronizingObject = null; + + private ISite site = null; + + private static TimerCaps caps; + + public event EventHandler Started; + + public event EventHandler Stopped; + + public event EventHandler Tick; + + static Timer() + { + // Get multimedia timer capabilities. + timeGetDevCaps(ref caps, Marshal.SizeOf(caps)); + } + + + public Timer(IContainer container) + { + + container.Add(this); + + Initialize(); + } + + + public Timer() + { + Initialize(); + } + + ~Timer() + { + if(IsRunning) + { + // Stop and destroy timer. + timeKillEvent(timerID); + } + } + + private void Initialize() + { + this.mode = Mode.Periodic; + this.period = Capabilities.periodMin; + this.resolution = 1; + + running = false; + + timeProcPeriodic = new TimeProc(TimerPeriodicEventCallback); + timeProcOneShot = new TimeProc(TimerOneShotEventCallback); + tickRaiser = new EventRaiser(OnTick); + } + + + public void Start() + { + + if(disposed) + { + throw new ObjectDisposedException("Timer"); + } + + if(IsRunning) + { + return; + } + + if(Mode == Mode.Periodic) + { + timerID = timeSetEvent(Period, Resolution, timeProcPeriodic, 0, (int)Mode); + } + else + { + timerID = timeSetEvent(Period, Resolution, timeProcOneShot, 0, (int)Mode); + } + + if(timerID != 0) + { + running = true; + + if(SynchronizingObject != null && SynchronizingObject.InvokeRequired) + { + SynchronizingObject.BeginInvoke( + new EventRaiser(OnStarted), + new object[] { EventArgs.Empty }); + } + else + { + OnStarted(EventArgs.Empty); + } + } + else + { + throw new TimerException("Unable to start timer."); + } + } + + + public void Stop() + { + + if(disposed) + { + throw new ObjectDisposedException("Timer"); + } + + if(!running) + { + return; + } + + + int result = timeKillEvent(timerID); + + Debug.Assert(result == TIMERR_NOERROR); + + running = false; + + if(SynchronizingObject != null && SynchronizingObject.InvokeRequired) + { + SynchronizingObject.BeginInvoke( + new EventRaiser(OnStopped), + new object[] { EventArgs.Empty }); + } + else + { + OnStopped(EventArgs.Empty); + } + } + + + private void TimerPeriodicEventCallback(int id, int msg, int user, int param1, int param2) + { + if(synchronizingObject != null) + { + synchronizingObject.BeginInvoke(tickRaiser, new object[] { EventArgs.Empty }); + } + else + { + OnTick(EventArgs.Empty); + } + } + + private void TimerOneShotEventCallback(int id, int msg, int user, int param1, int param2) + { + if(synchronizingObject != null) + { + synchronizingObject.BeginInvoke(tickRaiser, new object[] { EventArgs.Empty }); + Stop(); + } + else + { + OnTick(EventArgs.Empty); + Stop(); + } + } + + + + // Raises the Disposed event. + private void OnDisposed(EventArgs e) + { + EventHandler handler = Disposed; + + if(handler != null) + { + handler(this, e); + } + } + + // Raises the Started event. + private void OnStarted(EventArgs e) + { + EventHandler handler = Started; + + if(handler != null) + { + handler(this, e); + } + } + + // Raises the Stopped event. + private void OnStopped(EventArgs e) + { + EventHandler handler = Stopped; + + if(handler != null) + { + handler(this, e); + } + } + + // Raises the Tick event. + private void OnTick(EventArgs e) + { + EventHandler handler = Tick; + + if(handler != null) + { + handler(this, e); + } + } + + + + + + /// + /// Gets or sets the object used to marshal event-handler calls. + /// + public ISynchronizeInvoke SynchronizingObject + { + get + { + #region Require + + if(disposed) + { + throw new ObjectDisposedException("Timer"); + } + + #endregion + + return synchronizingObject; + } + set + { + #region Require + + if(disposed) + { + throw new ObjectDisposedException("Timer"); + } + + #endregion + + synchronizingObject = value; + } + } + + + public int Period + { + get + { + #region Require + + if(disposed) + { + throw new ObjectDisposedException("Timer"); + } + + #endregion + + return period; + } + set + { + #region Require + + if(disposed) + { + throw new ObjectDisposedException("Timer"); + } + else if(value < Capabilities.periodMin || value > Capabilities.periodMax) + { + throw new ArgumentOutOfRangeException("Period", value, + "Multimedia Timer period out of range."); + } + + #endregion + + period = value; + + if(IsRunning) + { + Stop(); + Start(); + } + } + } + + + public int Resolution + { + get + { + + if(disposed) + { + throw new ObjectDisposedException("Timer"); + } + + return resolution; + } + set + { + if(disposed) + { + throw new ObjectDisposedException("Timer"); + } + else if(value < 0) + { + throw new ArgumentOutOfRangeException("Resolution", value, + "timer resolution out of range."); + } + + resolution = value; + + if(IsRunning) + { + Stop(); + Start(); + } + } + } + + public Mode Mode + { + get + { + + if(disposed) + { + throw new ObjectDisposedException("Timer"); + } + + + return mode; + } + set + { + + if(disposed) + { + throw new ObjectDisposedException("Timer"); + } + + + mode = value; + + if(IsRunning) + { + Stop(); + Start(); + } + } + } + + /// + /// Gets a value indicating whether the Timer is running. + /// + public bool IsRunning + { + get + { + return running; + } + } + + /// + /// Gets the timer capabilities. + /// + public static TimerCaps Capabilities + { + get + { + return caps; + } + } + + + + + public event System.EventHandler Disposed; + + public ISite Site + { + get + { + return site; + } + set + { + site = value; + } + } + + + public void Dispose() + { + + if(disposed) + { + return; + } + + if(IsRunning) + { + Stop(); + } + + disposed = true; + + OnDisposed(EventArgs.Empty); + } + + + } + + + public class TimerException : ApplicationException + { + public TimerException(string message) : base(message) + { + } + } +} diff --git a/TBF_V2/Sources/TBF/GraphLib/PrintPreviewForm.Designer.cs b/TBF_V2/Sources/TBF/GraphLib/PrintPreviewForm.Designer.cs new file mode 100644 index 00000000..fd880fb8 --- /dev/null +++ b/TBF_V2/Sources/TBF/GraphLib/PrintPreviewForm.Designer.cs @@ -0,0 +1,264 @@ +namespace GraphLib +{ + partial class PrintPreviewForm + { + /// + /// 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() + { + this.printPreviewCtrl = new System.Windows.Forms.PrintPreviewControl(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.rb_Unscaled = new System.Windows.Forms.RadioButton(); + this.rb_BestFit = new System.Windows.Forms.RadioButton(); + this.rb_Scale = new System.Windows.Forms.RadioButton(); + this.cb_PrintBackground = new System.Windows.Forms.CheckBox(); + this.label3 = new System.Windows.Forms.Label(); + this.cb_Printer = new System.Windows.Forms.ComboBox(); + this.label2 = new System.Windows.Forms.Label(); + this.cb_Orientation = new System.Windows.Forms.ComboBox(); + this.label1 = new System.Windows.Forms.Label(); + this.cb_PaperSize = new System.Windows.Forms.ComboBox(); + this.bt_Cancel = new System.Windows.Forms.Button(); + this.bt_print = new System.Windows.Forms.Button(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // printPreviewCtrl + // + this.printPreviewCtrl.BackColor = System.Drawing.SystemColors.ControlLight; + this.printPreviewCtrl.Dock = System.Windows.Forms.DockStyle.Fill; + this.printPreviewCtrl.Location = new System.Drawing.Point(0, 0); + this.printPreviewCtrl.Name = "printPreviewCtrl"; + this.printPreviewCtrl.Size = new System.Drawing.Size(453, 501); + this.printPreviewCtrl.TabIndex = 1; + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer1.IsSplitterFixed = true; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.printPreviewCtrl); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.groupBox1); + this.splitContainer1.Panel2.Controls.Add(this.cb_PrintBackground); + this.splitContainer1.Panel2.Controls.Add(this.label3); + this.splitContainer1.Panel2.Controls.Add(this.cb_Printer); + this.splitContainer1.Panel2.Controls.Add(this.label2); + this.splitContainer1.Panel2.Controls.Add(this.cb_Orientation); + this.splitContainer1.Panel2.Controls.Add(this.label1); + this.splitContainer1.Panel2.Controls.Add(this.cb_PaperSize); + this.splitContainer1.Panel2.Controls.Add(this.bt_Cancel); + this.splitContainer1.Panel2.Controls.Add(this.bt_print); + this.splitContainer1.Size = new System.Drawing.Size(681, 501); + this.splitContainer1.SplitterDistance = 453; + this.splitContainer1.TabIndex = 2; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.rb_Unscaled); + this.groupBox1.Controls.Add(this.rb_BestFit); + this.groupBox1.Controls.Add(this.rb_Scale); + this.groupBox1.Location = new System.Drawing.Point(18, 188); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(93, 93); + this.groupBox1.TabIndex = 12; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Scaling"; + // + // rb_Unscaled + // + this.rb_Unscaled.AutoSize = true; + this.rb_Unscaled.Location = new System.Drawing.Point(13, 19); + this.rb_Unscaled.Name = "rb_Unscaled"; + this.rb_Unscaled.Size = new System.Drawing.Size(70, 17); + this.rb_Unscaled.TabIndex = 8; + this.rb_Unscaled.TabStop = true; + this.rb_Unscaled.Text = "Unscaled"; + this.rb_Unscaled.UseVisualStyleBackColor = true; + this.rb_Unscaled.CheckedChanged += new System.EventHandler(this.rb_Unscaled_CheckedChanged); + // + // rb_BestFit + // + this.rb_BestFit.AutoSize = true; + this.rb_BestFit.Location = new System.Drawing.Point(13, 65); + this.rb_BestFit.Name = "rb_BestFit"; + this.rb_BestFit.Size = new System.Drawing.Size(60, 17); + this.rb_BestFit.TabIndex = 6; + this.rb_BestFit.TabStop = true; + this.rb_BestFit.Text = "Best Fit"; + this.rb_BestFit.UseVisualStyleBackColor = true; + this.rb_BestFit.CheckedChanged += new System.EventHandler(this.rb_BestFit_CheckedChanged); + // + // rb_Scale + // + this.rb_Scale.AutoSize = true; + this.rb_Scale.Location = new System.Drawing.Point(13, 42); + this.rb_Scale.Name = "rb_Scale"; + this.rb_Scale.Size = new System.Drawing.Size(52, 17); + this.rb_Scale.TabIndex = 7; + this.rb_Scale.TabStop = true; + this.rb_Scale.Text = "Scale"; + this.rb_Scale.UseVisualStyleBackColor = true; + this.rb_Scale.CheckedChanged += new System.EventHandler(this.rb_Scale_CheckedChanged); + // + // cb_PrintBackground + // + this.cb_PrintBackground.AutoSize = true; + this.cb_PrintBackground.Location = new System.Drawing.Point(22, 321); + this.cb_PrintBackground.Name = "cb_PrintBackground"; + this.cb_PrintBackground.Size = new System.Drawing.Size(108, 17); + this.cb_PrintBackground.TabIndex = 11; + this.cb_PrintBackground.Text = "Print Background"; + this.cb_PrintBackground.UseVisualStyleBackColor = true; + this.cb_PrintBackground.Visible = false; + this.cb_PrintBackground.CheckedChanged += new System.EventHandler(this.cb_PrintBackground_CheckedChanged); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(19, 29); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(37, 13); + this.label3.TabIndex = 10; + this.label3.Text = "Printer"; + // + // cb_Printer + // + this.cb_Printer.FormattingEnabled = true; + this.cb_Printer.Location = new System.Drawing.Point(18, 45); + this.cb_Printer.Name = "cb_Printer"; + this.cb_Printer.Size = new System.Drawing.Size(195, 21); + this.cb_Printer.TabIndex = 9; + this.cb_Printer.SelectedIndexChanged += new System.EventHandler(this.cb_Printer_SelectedIndexChanged); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(19, 134); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(58, 13); + this.label2.TabIndex = 5; + this.label2.Text = "Orientation"; + // + // cb_Orientation + // + this.cb_Orientation.FormattingEnabled = true; + this.cb_Orientation.Items.AddRange(new object[] { + "Portrait", + "Landscape"}); + this.cb_Orientation.Location = new System.Drawing.Point(18, 150); + this.cb_Orientation.Name = "cb_Orientation"; + this.cb_Orientation.Size = new System.Drawing.Size(93, 21); + this.cb_Orientation.TabIndex = 4; + this.cb_Orientation.SelectedIndexChanged += new System.EventHandler(this.cb_Orientation_SelectedIndexChanged); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(19, 81); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(58, 13); + this.label1.TabIndex = 3; + this.label1.Text = "Paper Size"; + // + // cb_PaperSize + // + this.cb_PaperSize.FormattingEnabled = true; + this.cb_PaperSize.Location = new System.Drawing.Point(18, 97); + this.cb_PaperSize.Name = "cb_PaperSize"; + this.cb_PaperSize.Size = new System.Drawing.Size(93, 21); + this.cb_PaperSize.TabIndex = 2; + this.cb_PaperSize.SelectedIndexChanged += new System.EventHandler(this.cb_PaperSize_SelectedIndexChanged); + // + // bt_Cancel + // + this.bt_Cancel.Location = new System.Drawing.Point(118, 450); + this.bt_Cancel.Name = "bt_Cancel"; + this.bt_Cancel.Size = new System.Drawing.Size(69, 26); + this.bt_Cancel.TabIndex = 1; + this.bt_Cancel.Text = "Cancel"; + this.bt_Cancel.UseVisualStyleBackColor = true; + this.bt_Cancel.Click += new System.EventHandler(this.bt_Cancel_Click); + // + // bt_print + // + this.bt_print.Location = new System.Drawing.Point(22, 450); + this.bt_print.Name = "bt_print"; + this.bt_print.Size = new System.Drawing.Size(69, 26); + this.bt_print.TabIndex = 0; + this.bt_print.Text = "Print"; + this.bt_print.UseVisualStyleBackColor = true; + this.bt_print.Click += new System.EventHandler(this.bt_print_Click); + // + // PrintPreviewForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(681, 501); + this.Controls.Add(this.splitContainer1); + this.MaximumSize = new System.Drawing.Size(697, 537); + this.MinimumSize = new System.Drawing.Size(697, 537); + this.Name = "PrintPreviewForm"; + this.Text = "PrintPreviewForm"; + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.Panel2.PerformLayout(); + this.splitContainer1.ResumeLayout(false); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.PrintPreviewControl printPreviewCtrl; + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.Button bt_Cancel; + private System.Windows.Forms.Button bt_print; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox cb_PaperSize; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.ComboBox cb_Orientation; + private System.Windows.Forms.RadioButton rb_Scale; + private System.Windows.Forms.RadioButton rb_BestFit; + private System.Windows.Forms.RadioButton rb_Unscaled; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.ComboBox cb_Printer; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.CheckBox cb_PrintBackground; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/GraphLib/PrintPreviewForm.cs b/TBF_V2/Sources/TBF/GraphLib/PrintPreviewForm.cs new file mode 100644 index 00000000..bb6ece57 --- /dev/null +++ b/TBF_V2/Sources/TBF/GraphLib/PrintPreviewForm.cs @@ -0,0 +1,336 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Drawing.Printing; + +namespace GraphLib +{ + public partial class PrintPreviewForm : Form + { + private PrintDocument printDoc = new PrintDocument(); + private PlotterGraphPaneEx gpane = null; + private String strDefaultPrinter = String.Empty; + + private bool bBestScale = false; + private bool bPageScale = false; + private bool bUnscaled = false; + private bool bLandscape = false; + private int selPrinterIndex = -1; + + public PrintPreviewForm() + { + InitializeComponent(); + + printPreviewCtrl.Zoom = 1; + rb_BestFit.Checked = true; + rb_Scale.Checked = false; + rb_Unscaled.Checked = false; + cb_Orientation.SelectedIndex = 0; + printDoc.PrintPage += new PrintPageEventHandler(printDoc_PrintPage); + this.VisibleChanged += new EventHandler(OnVisibleChanged); + FormClosing += new FormClosingEventHandler(OnFormClosing); + } + + void FillInInstalledPrinters() + { + strDefaultPrinter = printDoc.PrinterSettings.PrinterName; + cb_Printer.Items.Clear(); + foreach (String strPrinter in PrinterSettings.InstalledPrinters) + { + cb_Printer.Items.Add(strPrinter); + + if (strPrinter == strDefaultPrinter) + { + cb_Printer.SelectedIndex = cb_Printer.Items.IndexOf(strPrinter); + } + } + } + + void OnVisibleChanged(object sender, EventArgs e) + { + if (this.Visible) + { + bLandscape = cb_Orientation.SelectedIndex == 1; + + FillInInstalledPrinters(); + + FillInPaperSizes(); + + UpdateScaleRadioButtons(); + + InvalidatePrintPreview(); + } + else + { + + } + } + + void OnFormClosing(object sender, FormClosingEventArgs e) + { + this.Hide(); + e.Cancel = true; + } + + void UpdateScaleRadioButtons() + { + bBestScale = rb_BestFit.Checked; + bPageScale = rb_Scale.Checked; + bUnscaled = rb_Unscaled.Checked; + } + + double AutoZoomPreview() + { + float zoom = 1.0f; + float step = 0.05f; + + float PaperWidth = printDoc.DefaultPageSettings.PaperSize.Width; + float PaperHeight = printDoc.DefaultPageSettings.PaperSize.Height; + + if (bLandscape) + { + PaperHeight = printDoc.DefaultPageSettings.PaperSize.Width * zoom; + PaperWidth = printDoc.DefaultPageSettings.PaperSize.Height * zoom; + } + + while (zoom > 0.1f) + { + double CurW = PaperWidth * zoom; + double CurH = PaperHeight * zoom; + + if (splitContainer1.Panel1.Width < (CurW+10) || splitContainer1.Panel1.Height < (CurH+10)) + { + zoom -= step; + } + else + { + break; + } + } + + return zoom; + } + + void FillInPaperSizes() + { + cb_PaperSize.Items.Clear(); + + foreach (PaperSize s in printDoc.PrinterSettings.PaperSizes) + { + cb_PaperSize.Items.Add(s.PaperName.ToString()); + } + + if (cb_PaperSize.SelectedIndex == -1 || cb_PaperSize.SelectedIndex >= cb_PaperSize.Items.Count) + { + int idx = cb_PaperSize.Items.IndexOf(printDoc.DefaultPageSettings.PaperSize.PaperName); + + if (idx >= 0 && idx < cb_PaperSize.Items.Count) + { + cb_PaperSize.SelectedIndex = idx; + } + else + { + cb_PaperSize.SelectedIndex = 0; + } + } + } + + void InvalidatePrintPreview() + { + printDoc.DefaultPageSettings.Landscape = bLandscape; + printPreviewCtrl.Document = printDoc; + printPreviewCtrl.Document.DocumentName = "Preview"; + printPreviewCtrl.Zoom = AutoZoomPreview(); + printPreviewCtrl.InvalidatePreview(); + } + + + public PlotterGraphPaneEx GraphPanel + { + set + { + gpane = value; + } + } + + private void AutoScaleDocument(ref float w, ref float h, ref float x, ref float y) + { + float CurGraphWidth = gpane.Width; + float CurGraphHeight = gpane.Height; + float CurPaperWidth = printDoc.DefaultPageSettings.PaperSize.Width; + float CurPaperHeight = printDoc.DefaultPageSettings.PaperSize.Height; + + if (bLandscape) + { + CurPaperWidth = printDoc.DefaultPageSettings.PaperSize.Height; + CurPaperHeight = printDoc.DefaultPageSettings.PaperSize.Width; + } + + if (bUnscaled) + { + // do nothing + } + + if (bPageScale) // scale to page + { + CurGraphWidth = CurPaperWidth; + CurGraphHeight = CurPaperHeight; + } + + if (bBestScale) // scale to best fit + { + float zoom = 1.0f; + float step = 0.05f; + + if (CurGraphWidth > (CurPaperWidth ) || CurGraphHeight > (CurPaperHeight )) + { + // scale down + while ((zoom * gpane.Width > CurPaperWidth || zoom * gpane.Height > CurPaperHeight) && zoom > step) + { + zoom -= step; + } + zoom -= step; + + } + else if (CurGraphWidth < CurPaperWidth && CurGraphHeight < CurPaperHeight) + { + // scale up + while (((zoom+step) * gpane.Width < CurPaperWidth && (zoom+step) * gpane.Height < CurPaperHeight) && zoom > step) + { + zoom += step; + } + + } + CurGraphWidth = zoom * gpane.Width; + CurGraphHeight = zoom * gpane.Height; + } + + w = CurGraphWidth; + h = CurGraphHeight; + + // center print + x = (CurPaperWidth - w) / 2.0f; + y = (CurPaperHeight - h) / 2.0f; + } + + private void printDoc_PrintPage(object sender, PrintPageEventArgs e) + { + if (gpane != null) + { + float x=0, y=0, w=gpane.Width, h=gpane.Height; + + AutoScaleDocument(ref w, ref h, ref x, ref y); + e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; + //gpane.PaintControl(e.Graphics, w, h,x,y,cb_PrintBackground.Checked); + gpane.PaintControl(e.Graphics, w, h, x, y, false); + } + } + + private void bt_print_Click(object sender, EventArgs e) + { + if (printDoc != null) + { + printDoc.Print(); + this.Hide(); + } + } + + private void bt_Cancel_Click(object sender, EventArgs e) + { + this.Hide(); + } + + private void cb_PaperSize_SelectedIndexChanged(object sender, EventArgs e) + { + if (cb_PaperSize.SelectedIndex >= 0 && cb_PaperSize.SelectedIndex < cb_PaperSize.Items.Count) + { + + foreach (PaperSize s in printDoc.PrinterSettings.PaperSizes) + { + if (s.PaperName == (string)cb_PaperSize.Items[cb_PaperSize.SelectedIndex]) + { + printDoc.DefaultPageSettings.PaperSize = s; + InvalidatePrintPreview(); + } + } + } + } + + + private void rb_BestFit_CheckedChanged(object sender, EventArgs e) + { + if (rb_BestFit.Checked) + { + rb_Scale.Checked = !rb_BestFit.Checked; + rb_Unscaled.Checked = !rb_BestFit.Checked; + } + + UpdateScaleRadioButtons(); + InvalidatePrintPreview(); + } + + private void rb_Scale_CheckedChanged(object sender, EventArgs e) + { + if (rb_Scale.Checked) + { + rb_BestFit.Checked = !rb_Scale.Checked; + rb_Unscaled.Checked = !rb_Scale.Checked; + } + + UpdateScaleRadioButtons(); + InvalidatePrintPreview(); + } + + private void rb_Unscaled_CheckedChanged(object sender, EventArgs e) + { + if (rb_Unscaled.Checked) + { + rb_Scale.Checked = !rb_Unscaled.Checked; + rb_BestFit.Checked = !rb_Unscaled.Checked; + } + + UpdateScaleRadioButtons(); + InvalidatePrintPreview(); + } + + private void cb_Printer_SelectedIndexChanged(object sender, EventArgs e) + { + selPrinterIndex = cb_Printer.SelectedIndex; + + if (selPrinterIndex >= 0 && selPrinterIndex < cb_Printer.Items.Count) + { + printDoc.PrinterSettings.PrinterName = (string)cb_Printer.Items[selPrinterIndex]; + this.Text = "Print Preview - " + printDoc.PrinterSettings.PrinterName; + } + + FillInPaperSizes(); + + InvalidatePrintPreview(); + } + + private void cb_Orientation_SelectedIndexChanged(object sender, EventArgs e) + { + if (cb_Orientation.SelectedIndex == 0) + { + bLandscape = false; + } + else + { + bLandscape = true; + } + + InvalidatePrintPreview(); + } + + private void cb_PrintBackground_CheckedChanged(object sender, EventArgs e) + { + InvalidatePrintPreview(); + } + + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/GraphLib/PrintPreviewForm.resx b/TBF_V2/Sources/TBF/GraphLib/PrintPreviewForm.resx new file mode 100644 index 00000000..19dc0dd8 --- /dev/null +++ b/TBF_V2/Sources/TBF/GraphLib/PrintPreviewForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/GraphLib/Properties/AssemblyInfo.cs b/TBF_V2/Sources/TBF/GraphLib/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..42e2343e --- /dev/null +++ b/TBF_V2/Sources/TBF/GraphLib/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("GraphLibrary")] +[assembly: AssemblyDescription("Library for easy and simple graph drawing")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("GraphLibrary")] +[assembly: AssemblyCopyright("Copyright © 2008-2014 ZIMMERMANN STEPHAN")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("b23e30ac-c4b8-4863-90d0-cf0ad837c050")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.1")] +[assembly: AssemblyFileVersion("1.0.0.1")] diff --git a/TBF_V2/Sources/TBF/GraphLib/Properties/Resources.Designer.cs b/TBF_V2/Sources/TBF/GraphLib/Properties/Resources.Designer.cs new file mode 100644 index 00000000..00cd8089 --- /dev/null +++ b/TBF_V2/Sources/TBF/GraphLib/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// Dieser Code wurde von einem Tool generiert. +// Laufzeitversion:4.0.30319.18408 +// +// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +// der Code erneut generiert wird. +// +//------------------------------------------------------------------------------ + +namespace ClassLibrary1.Properties { + using System; + + + /// + /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. + /// + // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert + // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. + // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen + // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ClassLibrary1.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle + /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/GraphLib/Properties/Resources.resx b/TBF_V2/Sources/TBF/GraphLib/Properties/Resources.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/TBF_V2/Sources/TBF/GraphLib/Properties/Resources.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/GraphLib/Utils.cs b/TBF_V2/Sources/TBF/GraphLib/Utils.cs new file mode 100644 index 00000000..d260a98d --- /dev/null +++ b/TBF_V2/Sources/TBF/GraphLib/Utils.cs @@ -0,0 +1,45 @@ +using System; + +namespace GraphLib +{ + public class Utilities + { + /// + /// returns the most significant decimal digit + /// 250 -> 100 + /// 350 -> 100 + /// 12 -> 10 + /// 5 -> 1 + /// 0.5 .> 0.1 + /// ..... + /// + /// + /// + static public float MostSignificantDigit(float Value) + { + float n = 1; + + float val_abs = Math.Abs(Value); + float sig = 1.0f * Math.Sign(Value); + + if (val_abs > 1) + { + while (n < val_abs) + { + n *= 10.0f; + } + + return (float)((int)(sig * n / 10)); + } + else // n <= 1 + { + while (n > val_abs) + { + n /= 10.0f; + } + + return sig * n; + } + } + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/MonitoringDB/BatteryInfo.cs b/TBF_V2/Sources/TBF/MonitoringDB/BatteryInfo.cs new file mode 100644 index 00000000..f2bdff51 --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/BatteryInfo.cs @@ -0,0 +1,115 @@ +using System; +using System.Collections.Generic; +using log4net; +using MonitoringDB.Entities; + +namespace MonitoringDB +{ + public class BatteryInfo + { + static readonly ILog log = LogManager.GetLogger(typeof(BatteryInfo)); + + /// Constants + public const string VitzrocellBatteryPartNr = "68118221"; + public const string TadiranBatteryPartNr = "68117469"; + + public string PcbNumber; /// Unique PCB number of the water meter + public string BattSapPartNr; /// Battery SAP part number + public int BattBatchNr; /// Batch number (purchase order) + public string BattMMYY; /// Production date + public string BattSupplier; /// Supplier + public string PrintedBatteryInfo; /// 'T', 'Vi' or '-' + public DateTime TimeStamp; /// Record creation time + + bool complete { get { return (PcbNumber != null) && (BattSapPartNr != null) && (BattBatchNr != 0) && (BattMMYY != null) && (BattSupplier != null); } } + + + public BatteryInfo() + { + TimeStamp = DateTime.Now; + PrintedBatteryInfo = "-"; + } + + + /// + /// Search MySQL DB and get battery info, add it into the record. + /// + /// true when successful + public static BatteryInfo GetBatteryInfo(string pcbNumber, IList records) + { + if (string.IsNullOrEmpty(pcbNumber)) + { + log.ErrorFormat("Invalid PcbBr, no battery info."); + return null; + } + + BatteryInfo info = new BatteryInfo() { PcbNumber = pcbNumber }; + + try + { + bool error = false; + + foreach (var rec in records) + { + if (rec.Part.CodeLocation == CodeLocation.OnPallet) + { + if (rec.Part.Name == VitzrocellBatteryPartNr) + { + if (info.BattSapPartNr != null) { error = true; break; } + info.BattSapPartNr = VitzrocellBatteryPartNr; + int battBatchNr; + info.BattBatchNr = int.TryParse(rec.Code, out battBatchNr) ? battBatchNr : 1; + info.BattSupplier = "VITZROCELL"; + } + else if (rec.Part.Name == TadiranBatteryPartNr) + { + if (info.BattSapPartNr != null) { error = true; break; } + info.BattSapPartNr = TadiranBatteryPartNr; + int battBatchNr; + info.BattBatchNr = int.TryParse(rec.Code, out battBatchNr) ? battBatchNr : 1; + info.BattSupplier = "TADIRAN"; + } + } + + if (rec.Part.CodeType == CodeType.DateMMYY) + { + if (info.BattMMYY != null) { error = true; break; } + info.BattMMYY = rec.Code; + } + } + + if (error || !info.complete) + { + log.ErrorFormat("Battery info. for PcbNr={0} wasn't found in MySQL database", info.PcbNumber); + return null; + } + + /// + /// Set battery information printed on labels + /// + if (info.BattSupplier == "VITZROCELL") + { + info.PrintedBatteryInfo = "Vi"; + } + else if (info.BattSupplier == "TADIRAN") + { + info.PrintedBatteryInfo = "T"; + } + + return info; + } + catch (Exception exc) + { + log.ErrorFormat("Battery info. for PcbNr={0} wasn't found in MySQL database: {1}", + info.PcbNumber, exc.Message); + return null; + } + } + + + public override string ToString() + { + return string.Format("PcbNr={0}, Battery={1}/{2}/{3}, Time={4}", PcbNumber, BattBatchNr, BattMMYY, BattSupplier, TimeStamp); + } + } +} diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Entities/Option1.cs b/TBF_V2/Sources/TBF/MonitoringDB/Entities/Option1.cs new file mode 100644 index 00000000..fc0f91a2 --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Entities/Option1.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; + +namespace MonitoringDB.Entities +{ + public class Option1 : Interfaces.IOption + { + public virtual int Id { get; protected set; } + public virtual int ItemNr { get; set; } + public virtual string Name { get; set; } + public virtual string OraDBType { get; set; } + public virtual string Description { get; set; } + public virtual CodeType CodeType { get; set; } + public virtual CodeForm CodeForm { get; set; } + public virtual CodeLocation CodeLocation { get; set; } + public virtual LifetimeManagement LifetimeManagement { get; set; } + public virtual bool Enabled { get; set; } + + public Option1() + { + Name = string.Empty; + Description = string.Empty; + } + + /// + /// Create a copy of a part (1) belongig to another process, (2) not assigned to any workstep yet. + /// + /// Process owning the cloned part + /// Cloned part + public virtual Part GetPart(Process owningProcess) + { + Part rslt = new Part(); + + rslt.Name = Name; + rslt.OraDBType = OraDBType; + rslt.Description = Description; + rslt.CodeType = CodeType; + rslt.CodeForm = CodeForm; + rslt.CodeLocation = CodeLocation; + rslt.LifetimeManagement = LifetimeManagement; + + rslt.StepNumber = 0; + rslt.Process = owningProcess; + rslt.Workstep = null; + + return rslt; + } + + public override string ToString() + { + return string.Format("{0}. {1} ({2})", ItemNr, Name, Description); + } + } +} diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Entities/Option2.cs b/TBF_V2/Sources/TBF/MonitoringDB/Entities/Option2.cs new file mode 100644 index 00000000..1cddd27b --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Entities/Option2.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; + +namespace MonitoringDB.Entities +{ + public class Option2 : Interfaces.IOption + { + public virtual int Id { get; protected set; } + public virtual int ItemNr { get; set; } + public virtual string Name { get; set; } + public virtual string OraDBType { get; set; } + public virtual string Description { get; set; } + public virtual CodeType CodeType { get; set; } + public virtual CodeForm CodeForm { get; set; } + public virtual CodeLocation CodeLocation { get; set; } + public virtual LifetimeManagement LifetimeManagement { get; set; } + public virtual bool Enabled { get; set; } + + public Option2() + { + Name = string.Empty; + Description = string.Empty; + } + + /// + /// Create a copy of a part (1) belongig to another process, (2) not assigned to any workstep yet. + /// + /// Process owning the cloned part + /// Cloned part + public virtual Part GetPart(Process owningProcess) + { + Part rslt = new Part(); + + rslt.Name = Name; + rslt.OraDBType = OraDBType; + rslt.Description = Description; + rslt.CodeType = CodeType; + rslt.CodeForm = CodeForm; + rslt.CodeLocation = CodeLocation; + rslt.LifetimeManagement = LifetimeManagement; + + rslt.StepNumber = 0; + rslt.Process = owningProcess; + rslt.Workstep = null; + + return rslt; + } + + public override string ToString() + { + return string.Format("{0}. {1} ({2})", ItemNr, Name, Description); + } + } +} diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Entities/Part.cs b/TBF_V2/Sources/TBF/MonitoringDB/Entities/Part.cs new file mode 100644 index 00000000..6368f4bd --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Entities/Part.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; + +namespace MonitoringDB.Entities +{ + public class Part + { + public virtual int Id { get; protected set; } + public virtual string Name { get; set; } + public virtual string OraDBType { get; set; } + public virtual string Description { get; set; } + public virtual CodeType CodeType { get; set; } + public virtual CodeForm CodeForm { get; set; } + public virtual CodeLocation CodeLocation { get; set; } + public virtual LifetimeManagement LifetimeManagement { get; set; } + public virtual int StepNumber { get; set; } + + public virtual Process Process { get; set; } + public virtual Workstep Workstep { get; set; } + + + public Part() + { + Name = string.Empty; + Description = string.Empty; + } + + /// + /// Constructor used when the part is added to a process + /// + /// + /// + /// + /// + public Part(string name, Process process, CodeType codeType, CodeForm codeForm, CodeLocation codeLocation) + { + Name = name; + OraDBType = string.Empty; + Description = string.Empty; + CodeType = codeType; + CodeForm = codeForm; + CodeLocation = codeLocation; + StepNumber = 0; + + Process = process; + Workstep = null; + } + + /// + /// Create a copy of a part (1) belongig to another process, (2) not assigned to any workstep yet. + /// + /// Process owning the cloned part + /// Cloned part + public virtual Part Clone(Process owningProcess) + { + Part rslt = new Part(); + + rslt.Name = Name; + rslt.OraDBType = OraDBType; + rslt.Description = Description; + rslt.CodeType = CodeType; + rslt.CodeForm = CodeForm; + rslt.CodeLocation = CodeLocation; + rslt.LifetimeManagement = LifetimeManagement; + + rslt.StepNumber = 0; + rslt.Process = owningProcess; + rslt.Workstep = null; + + return rslt; + } + + public override string ToString() + { + return string.Format("{0} step={1} ({2})", Name, StepNumber, Description); + } + } +} diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Entities/Process.cs b/TBF_V2/Sources/TBF/MonitoringDB/Entities/Process.cs new file mode 100644 index 00000000..121e82cb --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Entities/Process.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; + +namespace MonitoringDB.Entities +{ + public class Process + { + public virtual int Id { get; protected set; } + public virtual int ItemNr { get; set; } + public virtual string Name { get; set; } + public virtual string Description { get; set; } + public virtual ReleaseStatus ReleaseStatus { get; set; } + public virtual DateTime TimeStamp { get; set; } + public virtual string UserName { get; set; } + + public virtual IList Parts { get; set; } + public virtual IList Worksteps { get; set; } + + /// + /// Default (private) constructor inicializing lists + /// + protected Process() + { + Parts = new List(); + Worksteps = new List(); + } + + /// + /// Constructor used when this process is created + /// + /// + public Process(string name) + : this() + { + Name = name; + Description = string.Empty; + ReleaseStatus = ReleaseStatus.In_preparation; + TimeStamp = DateTime.Now; + UserName = "admin"; + } + + /// + /// Create a copy of a process with a new name + /// + /// + /// + public virtual Process Clone(string name) + { + Process rslt = new Process(name); + rslt.Description = Description; + + foreach (var part in Parts) rslt.Parts.Add(part.Clone(rslt)); + foreach (var workstep in Worksteps) rslt.Worksteps.Add(workstep.Clone(rslt)); + + return rslt; + } + + public override string ToString() + { + return string.Format("{0} '{1}' ({2}) {3} {4}", + ItemNr, + Name, + TimeStamp.Date.ToShortDateString(), + (Description == null) ? string.Empty : Description, + ReleaseStatus); + } + } +} diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Entities/Record.cs b/TBF_V2/Sources/TBF/MonitoringDB/Entities/Record.cs new file mode 100644 index 00000000..2880e28e --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Entities/Record.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; + +namespace MonitoringDB.Entities +{ + public class Record + { + public virtual int Id { get; protected set; } + public virtual string Code { get; set; } + public virtual DateTime TimeStamp { get; set; } + + public virtual Part Part { get; set; } + public virtual ReferenceRecord ReferenceRecord { get; set; } + + + protected Record() + { + } + + /// + /// Constructor used when a part barcode is scanned + /// + /// Part + /// Reference record + /// Scanned barcode + public Record(Part part, ReferenceRecord referenceRecord, string code) + { + Part = part; + ReferenceRecord = referenceRecord; + Code = code; + TimeStamp = DateTime.Now; + } + + /// + /// Create a copy of a process with a new name + /// + /// + /// + public virtual Record Clone(Process newProcess, ReferenceRecord newRR) + { + Part newPart = null; + foreach (var pt in newProcess.Parts) + { + if (Part.Name == pt.Name) + { + newPart = pt; + break; + } + } + Record rslt = new Record(newPart, newRR, Code); + rslt.TimeStamp = TimeStamp; + + return rslt; + } + + public override string ToString() + { + return string.Format("code={0} part={1} description='{2}'", Code, Part.Name, Part.Description); + } + } +} diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Entities/ReferenceRecord.cs b/TBF_V2/Sources/TBF/MonitoringDB/Entities/ReferenceRecord.cs new file mode 100644 index 00000000..00b65eb5 --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Entities/ReferenceRecord.cs @@ -0,0 +1,88 @@ +using System; +using System.Collections.Generic; + +namespace MonitoringDB.Entities +{ + public class ReferenceRecord + { + public virtual int Id { get; protected set; } + public virtual string Code { get; set; } + public virtual DateTime TimeStamp { get; set; } + public virtual string UserName { get; set; } + public virtual string Workplace { get; set; } + public virtual int Result { get; set; } /// 0 = No error (OK), >0 = Error code + + public virtual Process Process { get; set; } + public virtual Workstep Workstep { get; set; } + public virtual IList Records { get; set; } + + + /// + /// Default (private) constructor inicializing lists + /// + protected ReferenceRecord() + { + Records = new List(); + } + + /// + /// Constructor used when reference barcode is scanned + /// + /// Process + /// Workstep + /// Scanned barcode + public ReferenceRecord(Process process, Workstep workstep, string code, + string userName, string workplace, int result) + { + Process = process; + Workstep = workstep; + Code = code; + TimeStamp = DateTime.Now; + UserName = userName; + Workplace = workplace; + Result = result; + } + + /// + /// Create a copy of a process with a new name + /// + /// + /// + public virtual ReferenceRecord Clone(Process newProcess) + { + Workstep newWorkstep = null; + foreach (var ws in newProcess.Worksteps) + { + if (Workstep.Name == ws.Name) + { + newWorkstep = ws; + break; + } + } + + ReferenceRecord rslt = new ReferenceRecord(newProcess, newWorkstep, + Code, UserName, Workplace, Result); + rslt.TimeStamp = TimeStamp; + + rslt.Records = new List(); + foreach (var record in Records) + { + rslt.Records.Add(record.Clone(newProcess, rslt)); + } + + return rslt; + } + + public override string ToString() + { + return string.Format("code={0} part={1} description='{2}' step='{3}' workplace='{4}' user={5} time={6:dd.MM.yyyy HH:mm:ss}", + (Code != null) ? Code : "", + Workstep.ReferencePart.Name, + Workstep.ReferencePart.Description, + Workstep.Name, + Workplace, + UserName, + TimeStamp); + } + } +} diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Entities/Workstep.cs b/TBF_V2/Sources/TBF/MonitoringDB/Entities/Workstep.cs new file mode 100644 index 00000000..fb883253 --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Entities/Workstep.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; + +namespace MonitoringDB.Entities +{ + public class Workstep + { + public virtual int Id { get; protected set; } + public virtual int WorkstepNr { get; set; } + public virtual string Name { get; set; } + public virtual string Description { get; set; } + public virtual int CheckPartNr { get; set; } + public virtual bool AllowRepairs { get; set; } + + public virtual Process Process { get; set; } + public virtual Part ReferencePart { get; set; } + public virtual IList Parts { get; set; } + + + /// + /// Default (private) constructor inicializing a list + /// + protected Workstep() + { + Parts = new List(); + } + + /// + /// Constructor used when this workstep is added to a process + /// + /// Workstep name + /// Process to be referenced + public Workstep(int workstepNr, string name, Process process) + : this() + { + WorkstepNr = workstepNr; + Name = name; + Description = string.Empty; + CheckPartNr = 0; + AllowRepairs = false; + Process = process; + ReferencePart = null; + } + + public virtual Workstep Clone(Process owningProcess) + { + Workstep rslt = new Workstep(WorkstepNr, Name, owningProcess); + rslt.Description = Description; + rslt.CheckPartNr = CheckPartNr; + rslt.AllowRepairs = AllowRepairs; + + if (ReferencePart != null) + { + foreach (var p in owningProcess.Parts) + { + if (p.Name == ReferencePart.Name) rslt.ReferencePart = p; + } + } + + foreach (var srcP in Parts) + { + foreach (var p in owningProcess.Parts) + { + if (p.Name == srcP.Name) + { + rslt.Parts.Add(p); + p.StepNumber = srcP.StepNumber; + p.Workstep = rslt; + } + } + } + + return rslt; + } + + public override string ToString() + { + //return string.Format("{0} {1} ({2}) Ref: {3}", WorkstepNr, Name, Description, (ReferencePart != null) ? ReferencePart.Name : "none"); + return string.Format("{0}: {1}", WorkstepNr, Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Enums.cs b/TBF_V2/Sources/TBF/MonitoringDB/Enums.cs new file mode 100644 index 00000000..3a4092ec --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Enums.cs @@ -0,0 +1,97 @@ +namespace MonitoringDB +{ + public enum CodeType + { + UniqueNr, + FlowtubeNr, /// prvé 3 znaky sa zhodujú s poslednými 3 znakmi názvu + FlowtubeNrLU, /// začiatok kódu sa zhoduje s názvom + BatchNr, + BatchNrContainingPartName, + DateMMYY, + QualityCheck, + Count + } + + public enum CodeForm + { + Barcode, + QRCode, + Keyboard, + OkNok, + Count + } + + public enum CodeLocation + { + OnPart, + OnPallet, + Count + } + + public enum LifetimeManagement + { + None, + OneYear, + Count, + } + + public enum ReleaseStatus + { + In_preparation, + Released, + ReleasedActive, + Deactivated, + Count, + } + + public enum Mode + { + Debug, // Debug mode - no Oracle database used + Test, // Test database used + Production, // Production database used + Count, + } + + public enum LoginLevel + { + None, + TeamLeader, + Administrator, + MH, + Count, + } + + public enum ItemSpecID + { + RefRecordID = 0, + + TimeStamp, + Workstep, + Workplace, + UserName, + Barcode, + PartBarcode, + + TimeStamp2, + Workstep2, + Workplace2, + UserName2, + Barcode2, + PartBarcode2, + + SerialNr, + PurchaseOrder, + TestResult, + MaxPruefindex, + + Process, + } + + public enum ItemSpecCaps + { + None = 0, + ReferenceRecord = 1, + AssociatedRecord = 2, + OracleQuery = 4, + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/MonitoringDB/FluentNH.cs b/TBF_V2/Sources/TBF/MonitoringDB/FluentNH.cs new file mode 100644 index 00000000..bc798be6 --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/FluentNH.cs @@ -0,0 +1,210 @@ +using System; +using System.Collections.Generic; +using FluentNHibernate.Cfg; +using FluentNHibernate.Cfg.Db; +using NHibernate; +using NHibernate.Cfg; +using NHibernate.Tool.hbm2ddl; + +namespace MonitoringDB +{ + public static class FluentNH + { + /// + /// Current session factory for the last used connection string or null + /// + public static ISessionFactory SessionFactory; + + + /// Connection string for all sessions + static string connectionString; + /// + public static string ConnectionString + { + get { return connectionString; } + set + { + if (value != connectionString) + { + connectionString = value; + SessionFactory = null; /// Clear SessionFactory on connection string change + } + } + } + + + /// + /// NHibernate session factory (to create the database session 'SessionFactory') + /// + /// A database session + static ISessionFactory CreateSessionFactory() + { + return CreateSessionFactory(false); + } + + /// + /// NHibernate session factory (to create the database session 'SessionFactory') + /// + /// A database session + public static ISessionFactory CreateSessionFactory(bool createDB) + { + FluentConfiguration cfg = Fluently + .Configure() + .Database(MySQLConfiguration.Standard.ConnectionString(connectionString)) + .Mappings(m => m.FluentMappings.AddFromAssemblyOf()); + + if (createDB) + { + return cfg.ExposeConfiguration(BuildSchemaCreate).BuildSessionFactory(); + } + else + { + return cfg.ExposeConfiguration(BuildSchema).BuildSessionFactory(); + } + } + + public delegate void BuildSchemaDlgt(Configuration config); + + public static void BuildSchema(Configuration config) + { + /// This NHibernate tool takes a configuration (with mapping info in) + /// and exports a database schema from it + new SchemaExport(config).SetOutputFile("db_schema"); + } + + static void BuildSchemaCreate(Configuration config) + { + /// This NHibernate tool takes a configuration (with mapping info in) + /// and exports a database schema from it + new SchemaExport(config).Create(true, true); + } + + /// Create a NHibernate session for the given database + public static ISession CreateSession(string connectionString) + { + ConnectionString = connectionString; /// Clears session factory on connction string change + + if (SessionFactory == null) + SessionFactory = CreateSessionFactory(); + + return SessionFactory.OpenSession(); + } + + + /// + /// Create an empty database. + /// Database contains only the user 'admin' and the control board component 'CB'. + /// + /// DBType.SQLite or DBType.MySql + /// Connection string + /// true=success, false=error + public static bool CreateEmptyDB(string connectionString) + { + ConnectionString = connectionString; + + ISessionFactory sessionFactory = CreateSessionFactory(true); + if (sessionFactory == null) return false; + + /// Populate the database + using (var session = sessionFactory.OpenSession()) + { + //using (var transaction = session.BeginTransaction()) + //{ + // var part1 = new MonitoringDB.Entities.Part("flow tube", CodeType.UniqueNr, CodeForm.QRCode, 0); + // session.SaveOrUpdate(part1); + // transaction.Commit(); + //} + } + + return true; + } + + + public static IList FindWMParts(ISession session, string pcbNumber) + { + IList foundParts = new List(); /// initially empty + + if (string.IsNullOrEmpty(pcbNumber)) return foundParts; /// return an empty list + + try + { + /// Get all already existing reference records with Code == pcbNumber, referenceRecords[0] will be the most recent one + var referenceRecords = session.QueryOver() + .Where(rr => (rr.Code == pcbNumber)) + .OrderBy(rr => rr.TimeStamp).Desc + .List(); + + if (referenceRecords.Count == 0) return foundParts; /// Returns an empty list if no such ref. record found + + foundParts.Add(new WMPart(referenceRecords[0])); + Entities.Process process = referenceRecords[0].Process; + /// + foreach (var refR in referenceRecords) + { + if (process != refR.Process) + { + continue; /// skip records obtained by another process + } + + IList relatedRecords = session + .QueryOver() + .Where(x => (x.ReferenceRecord == refR)) + .List(); + + + foreach (var relR in relatedRecords) + { + foundParts.Add(new WMPart(relR)); + foreach (var ws in process.Worksteps) + { + if (ws.ReferencePart == relR.Part) + { + FindWMPartsRecursively(process, ws.ReferencePart, relR.Code, session, ref foundParts); + } + } + } + } + } + catch + { + } + + return foundParts; + } + + + static void FindWMPartsRecursively(Entities.Process process, Entities.Part refPart, string code, ISession session, ref IList foundParts) + { + IList referenceRecords = session + .QueryOver() + .Where(x => (x.Workstep.ReferencePart == refPart)) + .Where(x => (x.Code == code)) + .OrderBy(x => x.TimeStamp).Desc + .List(); + + if (referenceRecords.Count == 0) return; + + foreach (var refR in referenceRecords) + { + IList relatedRecords = session + .QueryOver() + .Where(x => (x.ReferenceRecord == refR)) + .List(); + + + foreach (var relR in relatedRecords) + { + foundParts.Add(new WMPart(relR)); + + foreach (var ws in process.Worksteps) + { + if (ws.ReferencePart == relR.Part) + { + FindWMPartsRecursively(process, ws.ReferencePart, relR.Code, session, ref foundParts); + } + } + } + } + } + } +} diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Forms/ListViewEx.cs b/TBF_V2/Sources/TBF/MonitoringDB/Forms/ListViewEx.cs new file mode 100644 index 00000000..f2417628 --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Forms/ListViewEx.cs @@ -0,0 +1,456 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Windows.Forms; +using System.Runtime.InteropServices; + +namespace MonitoringDB.Forms +{ + /// + /// Event Handler for SubItem events + /// + public delegate void SubItemEventHandler(object sender, SubItemEventArgs e); + /// + /// Event Handler for SubItemEndEditing events + /// + public delegate void SubItemEndEditingEventHandler(object sender, SubItemEndEditingEventArgs e); + + + /// + /// Inherited ListView to allow in-place editing of subitems + /// + public class ListViewEx : System.Windows.Forms.ListView + { + #region Interop structs, imports and constants + /// + /// MessageHeader for WM_NOTIFY + /// + private struct NMHDR + { +#pragma warning disable + public IntPtr hwndFrom; + public Int32 idFrom; + public Int32 code; +#pragma warning restore + } + + + [DllImport("user32.dll")] + private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wPar, IntPtr lPar); + [DllImport("user32.dll", CharSet=CharSet.Ansi)] + private static extern IntPtr SendMessage(IntPtr hWnd, int msg, int len, ref int [] order); + + // ListView messages + private const int LVM_FIRST = 0x1000; + private const int LVM_GETCOLUMNORDERARRAY = (LVM_FIRST + 59); + + // Windows Messages that will abort editing + private const int WM_HSCROLL = 0x114; + private const int WM_VSCROLL = 0x115; + private const int WM_SIZE = 0x05; + private const int WM_NOTIFY = 0x4E; + + private const int HDN_FIRST = -300; + private const int HDN_BEGINDRAG = (HDN_FIRST-10); + private const int HDN_ITEMCHANGINGA = (HDN_FIRST-0); + private const int HDN_ITEMCHANGINGW = (HDN_FIRST-20); + #endregion + + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + public event SubItemEventHandler SubItemClicked; + public event SubItemEventHandler SubItemBeginEditing; + public event SubItemEndEditingEventHandler SubItemEndEditing; + + public ListViewEx() + { + // This call is required by the Windows.Forms Form Designer. + InitializeComponent(); + + base.FullRowSelect = true; + base.View = View.Details; + base.AllowColumnReorder = true; + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if( components != null ) + components.Dispose(); + } + base.Dispose( disposing ); + } + + #region Component Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + #endregion + + private bool _doubleClickActivation = false; + /// + /// Is a double click required to start editing a cell? + /// + public bool DoubleClickActivation + { + get { return _doubleClickActivation; } + set { _doubleClickActivation = value; } + } + + + /// + /// Retrieve the order in which columns appear + /// + /// Current display order of column indices + public int[] GetColumnOrder() + { + IntPtr lPar = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(int)) * Columns.Count); + + IntPtr res = SendMessage(Handle, LVM_GETCOLUMNORDERARRAY, new IntPtr(Columns.Count), lPar); + if (res.ToInt32() == 0) // Something went wrong + { + Marshal.FreeHGlobal(lPar); + return null; + } + + int [] order = new int[Columns.Count]; + Marshal.Copy(lPar, order, 0, Columns.Count); + + Marshal.FreeHGlobal(lPar); + + return order; + } + + + /// + /// Find ListViewItem and SubItem Index at position (x,y) + /// + /// relative to ListView + /// relative to ListView + /// Item at position (x,y) + /// SubItem index + public int GetSubItemAt(int x, int y, out ListViewItem item) + { + item = this.GetItemAt(x, y); + + if (item != null) + { + int[] order = GetColumnOrder(); + Rectangle lviBounds; + int subItemX; + + lviBounds = item.GetBounds(ItemBoundsPortion.Entire); + subItemX = lviBounds.Left; + for (int i=0; i + /// Get bounds for a SubItem + /// + /// Target ListViewItem + /// Target SubItem index + /// Bounds of SubItem (relative to ListView) + public Rectangle GetSubItemBounds(ListViewItem Item, int SubItem) + { + int[] order = GetColumnOrder(); + + Rectangle subItemRect = Rectangle.Empty; + if (SubItem >= order.Length) + throw new IndexOutOfRangeException("SubItem "+SubItem+" out of range"); + + if (Item == null) + throw new ArgumentNullException("Item"); + + Rectangle lviBounds = Item.GetBounds(ItemBoundsPortion.Entire); + int subItemX = lviBounds.Left; + + ColumnHeader col; + int i; + for (i=0; i + /// Fire SubItemClicked + /// + ///Point of click/doubleclick + private void EditSubitemAt(Point p) + { + ListViewItem item; + int idx = GetSubItemAt(p.X, p.Y, out item); + if (idx >= 0) + { + OnSubItemClicked(new SubItemEventArgs(item, idx)); + } + } + + #endregion + + #region In-place editing functions + // The control performing the actual editing + private Control _editingControl; + // The LVI being edited + private ListViewItem _editItem; + // The SubItem being edited + private int _editSubItem; + + protected void OnSubItemBeginEditing(SubItemEventArgs e) + { + if (SubItemBeginEditing != null) SubItemBeginEditing(this, e); + } + + protected void OnSubItemEndEditing(SubItemEndEditingEventArgs e) + { + if (SubItemEndEditing != null) SubItemEndEditing(this, e); + } + + protected void OnSubItemClicked(SubItemEventArgs e) + { + if (SubItemClicked != null) SubItemClicked(this, e); + } + + + /// + /// Begin in-place editing of given cell + /// + /// Control used as cell editor + /// ListViewItem to edit + /// SubItem index to edit + public void StartEditing(Control c, ListViewItem Item, int SubItem) + { + OnSubItemBeginEditing(new SubItemEventArgs(Item, SubItem)); + + Rectangle rcSubItem = GetSubItemBounds(Item, SubItem); + + if (rcSubItem.X < 0) + { + // Left edge of SubItem not visible - adjust rectangle position and width + rcSubItem.Width += rcSubItem.X; + rcSubItem.X=0; + } + if (rcSubItem.X+rcSubItem.Width > this.Width) + { + // Right edge of SubItem not visible - adjust rectangle width + rcSubItem.Width = this.Width-rcSubItem.Left; + } + + // Subitem bounds are relative to the location of the ListView! + rcSubItem.Offset(Left, Top); + + // In case the editing control and the listview are on different parents, + // account for different origins + Point origin = new Point(0,0); + Point lvOrigin = this.Parent.PointToScreen(origin); + Point ctlOrigin = c.Parent.PointToScreen(origin); + + rcSubItem.Offset(lvOrigin.X-ctlOrigin.X, lvOrigin.Y-ctlOrigin.Y); + + // Position and show editor + c.Bounds = rcSubItem; + c.Text = Item.SubItems[SubItem].Text; + c.Visible = true; + c.BringToFront(); + c.Focus(); + + _editingControl = c; + _editingControl.Leave += new EventHandler(_editControl_Leave); + _editingControl.KeyPress += new KeyPressEventHandler(_editControl_KeyPress); + + _editItem = Item; + _editSubItem = SubItem; + } + + + private void _editControl_Leave(object sender, EventArgs e) + { + // cell editor losing focus + EndEditing(true); + } + + private void _editControl_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) + { + switch (e.KeyChar) + { + case (char)(int)Keys.Escape: + { + EndEditing(false); + break; + } + + case (char)(int)Keys.Enter: + { + EndEditing(true); + break; + } + } + } + + /// + /// Accept or discard current value of cell editor control + /// + /// Use the _editingControl's Text as new SubItem text or discard changes? + public void EndEditing(bool AcceptChanges) + { + if (_editingControl == null) + return; + + SubItemEndEditingEventArgs e = new SubItemEndEditingEventArgs( + _editItem, // The item being edited + _editSubItem, // The subitem index being edited + AcceptChanges ? + _editingControl.Text : // Use editControl text if changes are accepted + _editItem.SubItems[_editSubItem].Text, // or the original subitem's text, if changes are discarded + !AcceptChanges // Cancel? + ); + + OnSubItemEndEditing(e); + + _editItem.SubItems[_editSubItem].Text = e.DisplayText; + + _editingControl.Leave -= new EventHandler(_editControl_Leave); + _editingControl.KeyPress -= new KeyPressEventHandler(_editControl_KeyPress); + + _editingControl.Visible = false; + + _editingControl = null; + _editItem = null; + _editSubItem = -1; + } + #endregion + } + + + /// + /// Event Args for SubItemClicked event + /// + public class SubItemEventArgs : EventArgs + { + int subItem = -1; /// Sub-item index + ListViewItem item = null; + + public int SubItem { get { return subItem; } } + public ListViewItem Item { get { return item; } } + + public SubItemEventArgs(ListViewItem item, int subItem) + { + this.subItem = subItem; + this.item = item; + } + } + + + /// + /// Event Args for SubItemEndEditingClicked event + /// + public class SubItemEndEditingEventArgs : SubItemEventArgs + { + string displayText = string.Empty; + bool cancel = true; + + public SubItemEndEditingEventArgs(ListViewItem item, int subItem, string displayText, bool cancel) : + base(item, subItem) + { + this.displayText = displayText; + this.cancel = cancel; + } + public string DisplayText + { + get { return displayText; } + set { displayText = value; } + } + public bool Cancel + { + get { return cancel; } + set { cancel = value; } + } + } +} diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Forms/ListViewEx.resx b/TBF_V2/Sources/TBF/MonitoringDB/Forms/ListViewEx.resx new file mode 100644 index 00000000..7e323966 --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Forms/ListViewEx.resx @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.0.0.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3102.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3102.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Forms/ModelessForm.Designer.cs b/TBF_V2/Sources/TBF/MonitoringDB/Forms/ModelessForm.Designer.cs new file mode 100644 index 00000000..2e5ae7b7 --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Forms/ModelessForm.Designer.cs @@ -0,0 +1,64 @@ +namespace MonitoringDB.Forms +{ + partial class ModelessForm + { + /// + /// 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() + { + this.label1 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(47, 29); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(35, 13); + this.label1.TabIndex = 0; + this.label1.Text = "label1"; + // + // ModelessForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(191, 56); + this.Controls.Add(this.label1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Name = "ModelessForm"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "ModelessForm"; + this.Load += new System.EventHandler(this.ModelessForm_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label label1; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Forms/ModelessForm.cs b/TBF_V2/Sources/TBF/MonitoringDB/Forms/ModelessForm.cs new file mode 100644 index 00000000..1f6186e3 --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Forms/ModelessForm.cs @@ -0,0 +1,68 @@ +using System; +using System.Drawing; +using System.Windows.Forms; + +namespace MonitoringDB.Forms +{ + public partial class ModelessForm : Form + { + /// + /// Called from the state machine when an operation forces a modeless dialog close. + /// + public static void CloseForm() + { + if (CloseFormHandler == null) return; + try { CloseFormHandler(null, null); } + catch (Exception) { } + } + public static event EventHandler CloseFormHandler; + + void OnCloseForm(object sender, EventArgs args) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + + public string Title; + public string Message; + public Color BackgroundColor; + public Color TextColor; + public Font TextFont; + public string FontFamily; + public int FontSize; + public FontStyle FontStyle; + + + /// + /// Constructor to be used by the application + /// + /// Window title + /// Displayed message + public ModelessForm() + { + InitializeComponent(); + ControlBox = false; + + CloseFormHandler += delegate(object sender, EventArgs args) + { + if (InvokeRequired) { Invoke(new EventHandler(OnCloseForm), sender, args); } + else OnCloseForm(sender, args); + }; + } + + private void ModelessForm_Load(object sender, EventArgs e) + { + if (Title != null) Text = Title; + if (Message != null) label1.Text = Message; + if (BackgroundColor != null) BackColor = BackgroundColor; + if (TextColor != null) ForeColor = TextColor; + if (FontFamily != null) label1.Font = new Font(FontFamily, FontSize, FontStyle); + + float textWidth = Graphics.FromImage(new Bitmap(1, 1)).MeasureString(label1.Text, label1.Font).Width; + float textHeight = Graphics.FromImage(new Bitmap(1, 1)).MeasureString(label1.Text, label1.Font).Height; + Width = (int)textWidth + 120; /// Form width calculated from the text width + Height += (int)textHeight; /// Form height calculated from the text height + } + } +} diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Forms/ModelessForm.resx b/TBF_V2/Sources/TBF/MonitoringDB/Forms/ModelessForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Forms/ModelessForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Forms/ResultsConfigDlg.cs b/TBF_V2/Sources/TBF/MonitoringDB/Forms/ResultsConfigDlg.cs new file mode 100644 index 00000000..ed5b6781 --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Forms/ResultsConfigDlg.cs @@ -0,0 +1,299 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using log4net; +using MonitoringDB.Entities; +using MonitoringDB.Resources; + +namespace MonitoringDB.Forms +{ + public partial class ResultsConfigDlg : Form + { + /// + /// ListViewEx columns + /// + enum Column + { + Item, + Caption, + Format, + Precision, + Width, + Count, + } + Control[] editors; + + + public IList AvailableItems; + public IList SelectedItems; + + + public bool Compound; /// false = single meter items, true = combined meter items + + public ResultsConfigDlg() + { + InitializeComponent(); + } + + void Localize() + { + Text = Strings.Configuration; + availableResultsLabel.Text = Strings.Available_results; + selectedResultsLabel.Text = Strings.Selected_results; + addButton.Text = Strings.Add; + removeButton.Text = Strings.Remove; + removeAllButton.Text = Strings.Remove_all; + okButton.Text = Strings.OkBtnText; + cancelButton.Text = Strings.CancelBtnText; + upButton.Text = Strings.UpBtnText; + downButton.Text = Strings.DownBtnText; + } + + void ResultsConfig_Load(object sender, EventArgs e) + { + Localize(); + + /// Add columns to ListViewEx + selectedResultsListViewEx.Columns.Add(new ColumnHeader { Text = Strings.Item, Width = 120 }); + selectedResultsListViewEx.Columns.Add(new ColumnHeader { Text = Strings.Caption }); + selectedResultsListViewEx.Columns.Add(new ColumnHeader { Text = Strings.Format }); + selectedResultsListViewEx.Columns.Add(new ColumnHeader { Text = Strings.Precision }); + selectedResultsListViewEx.Columns.Add(new ColumnHeader { Text = Strings.Width }); + + editors = new Control[] + { + null, + new TextBox(), + new TextBox(), + new TextBox(), + new TextBox(), + }; + foreach (var edi in editors) + { + if (edi != null) + { + edi.Visible = false; + Controls.Add(edi); + } + } + + selectedResultsListViewEx.SubItemClicked += new SubItemEventHandler(selectedResultsListViewEx_SubItemClicked); + selectedResultsListViewEx.SubItemEndEditing += new SubItemEndEditingEventHandler(selectedResultsListViewEx_SubItemEndEditing); + + RedrawAvailable(); + RedrawSelected(); + } + + void selectedResultsListViewEx_SubItemClicked(object sender, SubItemEventArgs e) + { + if ((e.SubItem > 0) && (e.SubItem < (int)Column.Count)) + { + selectedResultsListViewEx.StartEditing(editors[e.SubItem], e.Item, e.SubItem); + } + } + + void selectedResultsListViewEx_SubItemEndEditing(object sender, SubItemEndEditingEventArgs e) + { + ListViewItem lvi = e.Item; + ItemSpec item = lvi.Tag as ItemSpec; + + switch ((Column)e.SubItem) + { + case Column.Caption: item.Caption = e.DisplayText; return; + case Column.Format: item.Format = e.DisplayText; return; + case Column.Precision: item.Precision = e.DisplayText; return; + + case Column.Width: + { + int width; + if (Int32.TryParse(editors[e.SubItem].Text, out width) && width >= 0) + { + item.Width = width; + return; /// OK + } + break; /// Error + } + default: + return; /// OK + } + + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + return; + } + + /// + /// Redraw selected items (right hand side) + /// + void RedrawAvailable() + { + availableResultsListBox.Items.Clear(); + AvailableItems = new List(); + foreach (var item in ItemSpec.AllItems) + { + AvailableItems.Add(item); + availableResultsListBox.Items.Add(item.Name); + } + } + + /// + /// Redraw selected items (right hand side) + /// + void RedrawSelected() + { + selectedResultsListViewEx.Items.Clear(); + foreach (var item in SelectedItems) + { + ListViewItem lvi = new ListViewItem(item.Name); /// Item + lvi.Tag = item; + lvi.SubItems.Add(item.Caption); /// Header + lvi.SubItems.Add(item.Format); /// Format + lvi.SubItems.Add(item.Precision); /// Precision + lvi.SubItems.Add(item.Width.ToString()); /// Width + + selectedResultsListViewEx.Items.Add(lvi); + } + } + + void UpdateSelectedFromView() + { + } + + void availableResultsListBox_DoubleClick(object sender, EventArgs e) + { + /// Double click works when just one item is selected + if (availableResultsListBox.SelectedIndices.Count == 1) + { + var oriItem = AvailableItems[availableResultsListBox.SelectedIndices[0]]; + SelectedItems.Add(oriItem.Clone()); + RedrawAvailable(); + RedrawSelected(); + + /// Select the last item + selectedResultsListViewEx.Focus(); + selectedResultsListViewEx.Items[SelectedItems.Count - 1].Selected = true; + selectedResultsListViewEx.Items[SelectedItems.Count - 1].EnsureVisible(); + } + } + + void addButton_Click(object sender, EventArgs e) + { + /// Append at the end, this code supports multiple selected items, + /// although ListBox control settings may limit the max.number of selected items to one. + + for (int i = availableResultsListBox.SelectedIndices.Count - 1; i >= 0; i--) + { + var oriItem = AvailableItems[availableResultsListBox.SelectedIndices[i]]; + SelectedItems.Add(oriItem.Clone()); + } + RedrawAvailable(); + RedrawSelected(); + + /// Select the last item + selectedResultsListViewEx.Focus(); + selectedResultsListViewEx.Items[SelectedItems.Count - 1].Selected = true; + selectedResultsListViewEx.Items[SelectedItems.Count - 1].EnsureVisible(); + } + + private void selectedResultsListBox_DoubleClick(object sender, EventArgs e) + { + /// Double click works when just one item is selected + + if (selectedResultsListViewEx.SelectedIndices.Count == 1) + { + SelectedItems.RemoveAt(selectedResultsListViewEx.SelectedIndices[0]); + RedrawAvailable(); + RedrawSelected(); + } + } + + void removeButton_Click(object sender, EventArgs e) + { + /// Remove from the list (the last selected item first so that the indexes are not affected) + + for (int i = selectedResultsListViewEx.SelectedIndices.Count - 1; i >= 0; i--) + { + SelectedItems.RemoveAt(selectedResultsListViewEx.SelectedIndices[i]); + } + RedrawAvailable(); + RedrawSelected(); + } + + void removeAllButton_Click(object sender, EventArgs e) + { + /// Remove all items from 'Selected' list + + SelectedItems.Clear(); + RedrawAvailable(); + RedrawSelected(); + } + + void okButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.OK; + Close(); + } + + private void ResultsConfigDlg_KeyPress(object sender, KeyPressEventArgs e) + { + e.Handled = true; + } + + private void upButton_Click(object sender, EventArgs e) + { + if (selectedResultsListViewEx.SelectedIndices.Count != 1) return; + + int selIdx = selectedResultsListViewEx.SelectedIndices[0]; + if (selIdx == 0) + { + /// Cannot move up + selectedResultsListViewEx.Focus(); + selectedResultsListViewEx.Items[0].Selected = true; + return; + } + + ItemSpec tmp = SelectedItems[selIdx - 1]; + SelectedItems[selIdx - 1] = SelectedItems[selIdx]; + SelectedItems[selIdx] = tmp; + + RedrawSelected(); + + selectedResultsListViewEx.Focus(); + selectedResultsListViewEx.Items[selIdx - 1].Selected = true; + selectedResultsListViewEx.Items[selIdx - 1].EnsureVisible(); + } + + private void downButton_Click(object sender, EventArgs e) + { + if (selectedResultsListViewEx.SelectedIndices.Count != 1) return; + + int selIdx = selectedResultsListViewEx.SelectedIndices[0]; + if (selIdx == SelectedItems.Count - 1) + { + /// Cannot move down + selectedResultsListViewEx.Focus(); + selectedResultsListViewEx.Items[SelectedItems.Count - 1].Selected = true; + return; + } + + ItemSpec tmp = SelectedItems[selIdx + 1]; + SelectedItems[selIdx + 1] = SelectedItems[selIdx]; + SelectedItems[selIdx] = tmp; + + RedrawSelected(); + + selectedResultsListViewEx.Focus(); + selectedResultsListViewEx.Items[selIdx + 1].Selected = true; + selectedResultsListViewEx.Items[selIdx + 1].EnsureVisible(); + } + + private void cancelButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + } +} diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Forms/ResultsConfigDlg.designer.cs b/TBF_V2/Sources/TBF/MonitoringDB/Forms/ResultsConfigDlg.designer.cs new file mode 100644 index 00000000..e99d463b --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Forms/ResultsConfigDlg.designer.cs @@ -0,0 +1,201 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +namespace MonitoringDB.Forms +{ + partial class ResultsConfigDlg + { + /// + /// 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() + { + this.okButton = new System.Windows.Forms.Button(); + this.cancelButton = new System.Windows.Forms.Button(); + this.availableResultsListBox = new System.Windows.Forms.ListBox(); + this.availableResultsLabel = new System.Windows.Forms.Label(); + this.selectedResultsLabel = new System.Windows.Forms.Label(); + this.removeAllButton = new System.Windows.Forms.Button(); + this.removeButton = new System.Windows.Forms.Button(); + this.addButton = new System.Windows.Forms.Button(); + this.selectedResultsListViewEx = new MonitoringDB.Forms.ListViewEx(); + this.upButton = new System.Windows.Forms.Button(); + this.downButton = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // okButton + // + this.okButton.Location = new System.Drawing.Point(344, 401); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(104, 30); + this.okButton.TabIndex = 4; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // cancelButton + // + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cancelButton.Location = new System.Drawing.Point(465, 401); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(104, 30); + this.cancelButton.TabIndex = 5; + this.cancelButton.Text = "Cancel"; + this.cancelButton.UseVisualStyleBackColor = true; + this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click); + // + // availableResultsListBox + // + this.availableResultsListBox.FormattingEnabled = true; + this.availableResultsListBox.Location = new System.Drawing.Point(12, 31); + this.availableResultsListBox.Name = "availableResultsListBox"; + this.availableResultsListBox.Size = new System.Drawing.Size(162, 355); + this.availableResultsListBox.TabIndex = 6; + this.availableResultsListBox.DoubleClick += new System.EventHandler(this.availableResultsListBox_DoubleClick); + // + // availableResultsLabel + // + this.availableResultsLabel.AutoSize = true; + this.availableResultsLabel.Location = new System.Drawing.Point(12, 9); + this.availableResultsLabel.Name = "availableResultsLabel"; + this.availableResultsLabel.Size = new System.Drawing.Size(86, 13); + this.availableResultsLabel.TabIndex = 8; + this.availableResultsLabel.Text = "Available results:"; + // + // selectedResultsLabel + // + this.selectedResultsLabel.AutoSize = true; + this.selectedResultsLabel.Location = new System.Drawing.Point(284, 9); + this.selectedResultsLabel.Name = "selectedResultsLabel"; + this.selectedResultsLabel.Size = new System.Drawing.Size(85, 13); + this.selectedResultsLabel.TabIndex = 9; + this.selectedResultsLabel.Text = "Selected results:"; + // + // removeAllButton + // + this.removeAllButton.Location = new System.Drawing.Point(184, 144); + this.removeAllButton.Name = "removeAllButton"; + this.removeAllButton.Size = new System.Drawing.Size(94, 30); + this.removeAllButton.TabIndex = 46; + this.removeAllButton.Text = "<< R&emove all"; + this.removeAllButton.UseVisualStyleBackColor = true; + this.removeAllButton.Click += new System.EventHandler(this.removeAllButton_Click); + // + // removeButton + // + this.removeButton.Location = new System.Drawing.Point(184, 109); + this.removeButton.Name = "removeButton"; + this.removeButton.Size = new System.Drawing.Size(93, 30); + this.removeButton.TabIndex = 45; + this.removeButton.Text = "< &Remove"; + this.removeButton.UseVisualStyleBackColor = true; + this.removeButton.Click += new System.EventHandler(this.removeButton_Click); + // + // addButton + // + this.addButton.Location = new System.Drawing.Point(184, 74); + this.addButton.Name = "addButton"; + this.addButton.Size = new System.Drawing.Size(93, 30); + this.addButton.TabIndex = 44; + this.addButton.Text = "&Add >"; + this.addButton.UseVisualStyleBackColor = true; + this.addButton.Click += new System.EventHandler(this.addButton_Click); + // + // selectedResultsListViewEx + // + this.selectedResultsListViewEx.AllowColumnReorder = true; + this.selectedResultsListViewEx.DoubleClickActivation = false; + this.selectedResultsListViewEx.FullRowSelect = true; + this.selectedResultsListViewEx.Location = new System.Drawing.Point(287, 31); + this.selectedResultsListViewEx.Name = "selectedResultsListViewEx"; + this.selectedResultsListViewEx.Size = new System.Drawing.Size(594, 355); + this.selectedResultsListViewEx.TabIndex = 47; + this.selectedResultsListViewEx.UseCompatibleStateImageBehavior = false; + this.selectedResultsListViewEx.View = System.Windows.Forms.View.Details; + this.selectedResultsListViewEx.SubItemClicked += new MonitoringDB.Forms.SubItemEventHandler(this.selectedResultsListViewEx_SubItemClicked); + this.selectedResultsListViewEx.SubItemEndEditing += new MonitoringDB.Forms.SubItemEndEditingEventHandler(this.selectedResultsListViewEx_SubItemEndEditing); + // + // upButton + // + this.upButton.Location = new System.Drawing.Point(184, 236); + this.upButton.Name = "upButton"; + this.upButton.Size = new System.Drawing.Size(93, 30); + this.upButton.TabIndex = 48; + this.upButton.Text = "Up"; + this.upButton.UseVisualStyleBackColor = true; + this.upButton.Click += new System.EventHandler(this.upButton_Click); + // + // downButton + // + this.downButton.Location = new System.Drawing.Point(184, 272); + this.downButton.Name = "downButton"; + this.downButton.Size = new System.Drawing.Size(93, 30); + this.downButton.TabIndex = 49; + this.downButton.Text = "Down"; + this.downButton.UseVisualStyleBackColor = true; + this.downButton.Click += new System.EventHandler(this.downButton_Click); + // + // ResultsConfigDlg + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(893, 445); + this.Controls.Add(this.downButton); + this.Controls.Add(this.upButton); + this.Controls.Add(this.selectedResultsListViewEx); + this.Controls.Add(this.removeAllButton); + this.Controls.Add(this.removeButton); + this.Controls.Add(this.addButton); + this.Controls.Add(this.selectedResultsLabel); + this.Controls.Add(this.availableResultsLabel); + this.Controls.Add(this.availableResultsListBox); + this.Controls.Add(this.cancelButton); + this.Controls.Add(this.okButton); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Name = "ResultsConfigDlg"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "ResultsConfig"; + this.Load += new System.EventHandler(this.ResultsConfig_Load); + this.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.ResultsConfigDlg_KeyPress); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.ListBox availableResultsListBox; + private System.Windows.Forms.Label availableResultsLabel; + private System.Windows.Forms.Label selectedResultsLabel; + private System.Windows.Forms.Button removeAllButton; + private System.Windows.Forms.Button removeButton; + private System.Windows.Forms.Button addButton; + private ListViewEx selectedResultsListViewEx; + private System.Windows.Forms.Button upButton; + private System.Windows.Forms.Button downButton; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Forms/ResultsConfigDlg.resx b/TBF_V2/Sources/TBF/MonitoringDB/Forms/ResultsConfigDlg.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Forms/ResultsConfigDlg.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Forms/SettingsDlg.Designer.cs b/TBF_V2/Sources/TBF/MonitoringDB/Forms/SettingsDlg.Designer.cs new file mode 100644 index 00000000..a4e69e33 --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Forms/SettingsDlg.Designer.cs @@ -0,0 +1,325 @@ +namespace MonitoringDB.Forms +{ + partial class SettingsDlg + { + /// + /// 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() + { + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.connectionStringTextBox = new System.Windows.Forms.TextBox(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.radioButton2 = new System.Windows.Forms.RadioButton(); + this.radioButton1 = new System.Windows.Forms.RadioButton(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.workplaceNameTextBox = new System.Windows.Forms.TextBox(); + this.saveButton = new System.Windows.Forms.Button(); + this.cancelButton = new System.Windows.Forms.Button(); + this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.extraBatteryLifetimeTextBox = new System.Windows.Forms.TextBox(); + this.oracleGroupBox = new System.Windows.Forms.GroupBox(); + this.checkPcbIsInOracleCheckBox = new System.Windows.Forms.CheckBox(); + this.oracleBatteryCheckBox = new System.Windows.Forms.CheckBox(); + this.groupBox5 = new System.Windows.Forms.GroupBox(); + this.usersDBConnStringTextBox = new System.Windows.Forms.TextBox(); + this.timeGroupBox = new System.Windows.Forms.GroupBox(); + this.timePicker3 = new System.Windows.Forms.DateTimePicker(); + this.timePicker2 = new System.Windows.Forms.DateTimePicker(); + this.timePicker1 = new System.Windows.Forms.DateTimePicker(); + this.label1 = new System.Windows.Forms.Label(); + this.groupBox1.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.groupBox4.SuspendLayout(); + this.oracleGroupBox.SuspendLayout(); + this.groupBox5.SuspendLayout(); + this.timeGroupBox.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.connectionStringTextBox); + this.groupBox1.Location = new System.Drawing.Point(12, 69); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(622, 50); + this.groupBox1.TabIndex = 1; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Connection string pre záznamy z výroby"; + // + // connectionStringTextBox + // + this.connectionStringTextBox.Location = new System.Drawing.Point(17, 18); + this.connectionStringTextBox.Name = "connectionStringTextBox"; + this.connectionStringTextBox.Size = new System.Drawing.Size(586, 20); + this.connectionStringTextBox.TabIndex = 0; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.radioButton2); + this.groupBox2.Controls.Add(this.radioButton1); + this.groupBox2.Location = new System.Drawing.Point(12, 250); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(222, 70); + this.groupBox2.TabIndex = 4; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Režim činnosti"; + // + // radioButton2 + // + this.radioButton2.AutoSize = true; + this.radioButton2.Location = new System.Drawing.Point(95, 41); + this.radioButton2.Name = "radioButton2"; + this.radioButton2.Size = new System.Drawing.Size(58, 17); + this.radioButton2.TabIndex = 1; + this.radioButton2.TabStop = true; + this.radioButton2.Text = "Výroba"; + this.radioButton2.UseVisualStyleBackColor = true; + // + // radioButton1 + // + this.radioButton1.AutoSize = true; + this.radioButton1.Location = new System.Drawing.Point(95, 20); + this.radioButton1.Name = "radioButton1"; + this.radioButton1.Size = new System.Drawing.Size(46, 17); + this.radioButton1.TabIndex = 0; + this.radioButton1.TabStop = true; + this.radioButton1.Text = "Test"; + this.radioButton1.UseVisualStyleBackColor = true; + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.workplaceNameTextBox); + this.groupBox3.Location = new System.Drawing.Point(12, 12); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(622, 50); + this.groupBox3.TabIndex = 0; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "Meno pracoviska"; + // + // workplaceNameTextBox + // + this.workplaceNameTextBox.Location = new System.Drawing.Point(17, 18); + this.workplaceNameTextBox.Name = "workplaceNameTextBox"; + this.workplaceNameTextBox.Size = new System.Drawing.Size(586, 20); + this.workplaceNameTextBox.TabIndex = 0; + // + // saveButton + // + this.saveButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.saveButton.Location = new System.Drawing.Point(400, 270); + this.saveButton.Name = "saveButton"; + this.saveButton.Size = new System.Drawing.Size(104, 42); + this.saveButton.TabIndex = 6; + this.saveButton.Text = "Uložiť"; + this.saveButton.UseVisualStyleBackColor = true; + this.saveButton.Click += new System.EventHandler(this.saveButton_Click); + // + // cancelButton + // + this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cancelButton.Location = new System.Drawing.Point(523, 270); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(104, 42); + this.cancelButton.TabIndex = 7; + this.cancelButton.Text = "Zrušiť"; + this.cancelButton.UseVisualStyleBackColor = true; + this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click); + // + // groupBox4 + // + this.groupBox4.Controls.Add(this.extraBatteryLifetimeTextBox); + this.groupBox4.Location = new System.Drawing.Point(12, 182); + this.groupBox4.Name = "groupBox4"; + this.groupBox4.Size = new System.Drawing.Size(222, 62); + this.groupBox4.TabIndex = 3; + this.groupBox4.TabStop = false; + this.groupBox4.Text = "Predĺženie životnosti baterky v mesiacoch"; + // + // extraBatteryLifetimeTextBox + // + this.extraBatteryLifetimeTextBox.Location = new System.Drawing.Point(17, 25); + this.extraBatteryLifetimeTextBox.Name = "extraBatteryLifetimeTextBox"; + this.extraBatteryLifetimeTextBox.Size = new System.Drawing.Size(191, 20); + this.extraBatteryLifetimeTextBox.TabIndex = 0; + // + // oracleGroupBox + // + this.oracleGroupBox.Controls.Add(this.checkPcbIsInOracleCheckBox); + this.oracleGroupBox.Controls.Add(this.oracleBatteryCheckBox); + this.oracleGroupBox.Location = new System.Drawing.Point(384, 182); + this.oracleGroupBox.Name = "oracleGroupBox"; + this.oracleGroupBox.Size = new System.Drawing.Size(249, 74); + this.oracleGroupBox.TabIndex = 5; + this.oracleGroupBox.TabStop = false; + this.oracleGroupBox.Text = "Oracle"; + this.oracleGroupBox.Visible = false; + // + // checkPcbIsInOracleCheckBox + // + this.checkPcbIsInOracleCheckBox.AutoSize = true; + this.checkPcbIsInOracleCheckBox.Location = new System.Drawing.Point(18, 45); + this.checkPcbIsInOracleCheckBox.Name = "checkPcbIsInOracleCheckBox"; + this.checkPcbIsInOracleCheckBox.Size = new System.Drawing.Size(213, 17); + this.checkPcbIsInOracleCheckBox.TabIndex = 0; + this.checkPcbIsInOracleCheckBox.Text = "Skontrolovať či PCB už bola overovaná"; + this.checkPcbIsInOracleCheckBox.UseVisualStyleBackColor = true; + // + // oracleBatteryCheckBox + // + this.oracleBatteryCheckBox.AutoSize = true; + this.oracleBatteryCheckBox.Location = new System.Drawing.Point(18, 19); + this.oracleBatteryCheckBox.Name = "oracleBatteryCheckBox"; + this.oracleBatteryCheckBox.Size = new System.Drawing.Size(193, 17); + this.oracleBatteryCheckBox.TabIndex = 0; + this.oracleBatteryCheckBox.Text = "Uložiť informácie o batérii do Oracle"; + this.oracleBatteryCheckBox.UseVisualStyleBackColor = true; + // + // groupBox5 + // + this.groupBox5.Controls.Add(this.usersDBConnStringTextBox); + this.groupBox5.Location = new System.Drawing.Point(12, 125); + this.groupBox5.Name = "groupBox5"; + this.groupBox5.Size = new System.Drawing.Size(622, 50); + this.groupBox5.TabIndex = 2; + this.groupBox5.TabStop = false; + this.groupBox5.Text = "Connection string pre centrálnu databázu používateľov"; + // + // usersDBConnStringTextBox + // + this.usersDBConnStringTextBox.Location = new System.Drawing.Point(17, 18); + this.usersDBConnStringTextBox.Name = "usersDBConnStringTextBox"; + this.usersDBConnStringTextBox.Size = new System.Drawing.Size(586, 20); + this.usersDBConnStringTextBox.TabIndex = 0; + // + // timeGroupBox + // + this.timeGroupBox.Controls.Add(this.label1); + this.timeGroupBox.Controls.Add(this.timePicker3); + this.timeGroupBox.Controls.Add(this.timePicker2); + this.timeGroupBox.Controls.Add(this.timePicker1); + this.timeGroupBox.Location = new System.Drawing.Point(240, 181); + this.timeGroupBox.Name = "timeGroupBox"; + this.timeGroupBox.Size = new System.Drawing.Size(138, 140); + this.timeGroupBox.TabIndex = 8; + this.timeGroupBox.TabStop = false; + this.timeGroupBox.Text = "Čas odlogovania"; + this.timeGroupBox.Visible = false; + // + // timePicker3 + // + this.timePicker3.Format = System.Windows.Forms.DateTimePickerFormat.Custom; + this.timePicker3.Location = new System.Drawing.Point(19, 98); + this.timePicker3.Name = "timePicker3"; + this.timePicker3.Size = new System.Drawing.Size(98, 20); + this.timePicker3.TabIndex = 2; + // + // timePicker2 + // + this.timePicker2.Format = System.Windows.Forms.DateTimePickerFormat.Custom; + this.timePicker2.Location = new System.Drawing.Point(19, 72); + this.timePicker2.Name = "timePicker2"; + this.timePicker2.Size = new System.Drawing.Size(98, 20); + this.timePicker2.TabIndex = 1; + // + // timePicker1 + // + this.timePicker1.AllowDrop = true; + this.timePicker1.Format = System.Windows.Forms.DateTimePickerFormat.Custom; + this.timePicker1.Location = new System.Drawing.Point(19, 46); + this.timePicker1.Name = "timePicker1"; + this.timePicker1.Size = new System.Drawing.Size(98, 20); + this.timePicker1.TabIndex = 0; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(17, 27); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(106, 13); + this.label1.TabIndex = 3; + this.label1.Text = "00:00 = neodlogovať"; + // + // SettingsDlg + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(648, 333); + this.Controls.Add(this.timeGroupBox); + this.Controls.Add(this.groupBox5); + this.Controls.Add(this.oracleGroupBox); + this.Controls.Add(this.groupBox4); + this.Controls.Add(this.cancelButton); + this.Controls.Add(this.saveButton); + this.Controls.Add(this.groupBox3); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.groupBox1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.MaximizeBox = false; + this.Name = "SettingsDlg"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "SettingsDlg"; + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.groupBox4.ResumeLayout(false); + this.groupBox4.PerformLayout(); + this.oracleGroupBox.ResumeLayout(false); + this.oracleGroupBox.PerformLayout(); + this.groupBox5.ResumeLayout(false); + this.groupBox5.PerformLayout(); + this.timeGroupBox.ResumeLayout(false); + this.timeGroupBox.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TextBox connectionStringTextBox; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.TextBox workplaceNameTextBox; + private System.Windows.Forms.Button saveButton; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.RadioButton radioButton2; + private System.Windows.Forms.RadioButton radioButton1; + private System.Windows.Forms.GroupBox groupBox4; + private System.Windows.Forms.TextBox extraBatteryLifetimeTextBox; + private System.Windows.Forms.GroupBox oracleGroupBox; + private System.Windows.Forms.CheckBox oracleBatteryCheckBox; + private System.Windows.Forms.CheckBox checkPcbIsInOracleCheckBox; + private System.Windows.Forms.GroupBox groupBox5; + private System.Windows.Forms.TextBox usersDBConnStringTextBox; + private System.Windows.Forms.GroupBox timeGroupBox; + private System.Windows.Forms.DateTimePicker timePicker3; + private System.Windows.Forms.DateTimePicker timePicker2; + private System.Windows.Forms.DateTimePicker timePicker1; + private System.Windows.Forms.Label label1; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Forms/SettingsDlg.cs b/TBF_V2/Sources/TBF/MonitoringDB/Forms/SettingsDlg.cs new file mode 100644 index 00000000..ae30c400 --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Forms/SettingsDlg.cs @@ -0,0 +1,119 @@ +using System; +using System.Windows.Forms; + +namespace MonitoringDB.Forms +{ + public partial class SettingsDlg : Form + { + static readonly DateTime MinTime = new DateTime(1753, 1, 1, 0, 0, 0); + + + public string WorkplaceName + { + set { workplaceNameTextBox.Text = value; } + get { return workplaceNameTextBox.Text; } + } + + public string ConnectionString + { + set { connectionStringTextBox.Text = value; } + get { return connectionStringTextBox.Text; } + } + + public string UsersDBConnString + { + set { usersDBConnStringTextBox.Text = value; } + get { return usersDBConnStringTextBox.Text; } + } + + public bool OracleBattery + { + set { oracleBatteryCheckBox.Checked = value; } + get { return oracleBatteryCheckBox.Checked; } + } + + public bool CheckPcbIsInOracle + { + set { checkPcbIsInOracleCheckBox.Checked = value; } + get { return checkPcbIsInOracleCheckBox.Checked; } + } + + public int ExtraBatterLifetime + { + get + { + int extraLifetime; + if (int.TryParse(extraBatteryLifetimeTextBox.Text, out extraLifetime) && extraLifetime >= 0) return extraLifetime; + return 0; + } + } + + public MonitoringDB.Mode Mode + { + set + { + radioButton1.Checked = (value == MonitoringDB.Mode.Test); + radioButton2.Checked = (value == MonitoringDB.Mode.Production); + } + get + { + return radioButton1.Checked ? MonitoringDB.Mode.Test : MonitoringDB.Mode.Production; + } + } + + public DateTime LogoutTime1 + { + get { return timePicker1.Value; } + set { timePicker1.Value = (value.CompareTo(MinTime) < 0) ? MinTime : value; } + } + + public DateTime LogoutTime2 + { + get { return timePicker2.Value; } + set { timePicker2.Value = (value.CompareTo(MinTime) < 0) ? MinTime : value; } + } + + public DateTime LogoutTime3 + { + get { return timePicker3.Value; } + set { timePicker3.Value = (value.CompareTo(MinTime) < 0) ? MinTime : value; } + } + + + /// + /// Basic configuration dialog + /// + /// false = Konfiguracia pracovisk, true = Pracovisko + public SettingsDlg(bool isWorkplace) + { + InitializeComponent(); + if (isWorkplace) + { + oracleGroupBox.Visible = true; + timeGroupBox.Visible = true; + } + extraBatteryLifetimeTextBox.Text = "0"; + + timePicker1.Format = DateTimePickerFormat.Custom; + timePicker1.CustomFormat = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.ShortTimePattern; + + timePicker2.Format = DateTimePickerFormat.Custom; + timePicker2.CustomFormat = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.ShortTimePattern; + + timePicker3.Format = DateTimePickerFormat.Custom; + timePicker3.CustomFormat = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.ShortTimePattern; + } + + private void saveButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.OK; + Close(); + } + + private void cancelButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + } +} diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Forms/SettingsDlg.resx b/TBF_V2/Sources/TBF/MonitoringDB/Forms/SettingsDlg.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Forms/SettingsDlg.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Forms/TrivialLoginDlg.cs b/TBF_V2/Sources/TBF/MonitoringDB/Forms/TrivialLoginDlg.cs new file mode 100644 index 00000000..417172f0 --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Forms/TrivialLoginDlg.cs @@ -0,0 +1,49 @@ +using System; +using System.Windows.Forms; + +namespace MonitoringDB.Forms +{ + public partial class TrivialLoginDlg : Form + { + public LoginLevel LoginLevel; + + public TrivialLoginDlg() + { + InitializeComponent(); + LoginLevel = LoginLevel.None; + } + + private void okButton_Click(object sender, EventArgs e) + { + if (passwordTextBox.Text.ToLower().Equals("barcode")) + { + LoginLevel = LoginLevel.Administrator; + DialogResult = DialogResult.OK; + Close(); + } + else if (passwordTextBox.Text.ToLower().Equals("teamleader")) + { + LoginLevel = LoginLevel.TeamLeader; + DialogResult = DialogResult.OK; + Close(); + } + else if (passwordTextBox.Text.ToLower().Equals("kremik")) + { + LoginLevel = LoginLevel.MH; + DialogResult = DialogResult.OK; + Close(); + } + else + { + DialogResult = DialogResult.Cancel; + Close(); + } + } + + private void cancelButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + } +} diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Forms/TrivialLoginDlg.designer.cs b/TBF_V2/Sources/TBF/MonitoringDB/Forms/TrivialLoginDlg.designer.cs new file mode 100644 index 00000000..a6ed92a7 --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Forms/TrivialLoginDlg.designer.cs @@ -0,0 +1,105 @@ +namespace MonitoringDB.Forms +{ + partial class TrivialLoginDlg + { + /// + /// 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() + { + this.passwordGroupBox = new System.Windows.Forms.GroupBox(); + this.passwordTextBox = new System.Windows.Forms.TextBox(); + this.okButton = new System.Windows.Forms.Button(); + this.cancelButton = new System.Windows.Forms.Button(); + this.passwordGroupBox.SuspendLayout(); + this.SuspendLayout(); + // + // passwordGroupBox + // + this.passwordGroupBox.Controls.Add(this.passwordTextBox); + this.passwordGroupBox.Location = new System.Drawing.Point(12, 10); + this.passwordGroupBox.Name = "passwordGroupBox"; + this.passwordGroupBox.Size = new System.Drawing.Size(200, 49); + this.passwordGroupBox.TabIndex = 0; + this.passwordGroupBox.TabStop = false; + this.passwordGroupBox.Text = "Heslo"; + // + // passwordTextBox + // + this.passwordTextBox.Location = new System.Drawing.Point(51, 18); + this.passwordTextBox.Name = "passwordTextBox"; + this.passwordTextBox.PasswordChar = '*'; + this.passwordTextBox.Size = new System.Drawing.Size(100, 20); + this.passwordTextBox.TabIndex = 0; + // + // okButton + // + this.okButton.Location = new System.Drawing.Point(237, 18); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(75, 39); + this.okButton.TabIndex = 1; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // cancelButton + // + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cancelButton.Location = new System.Drawing.Point(330, 18); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(75, 39); + this.cancelButton.TabIndex = 2; + this.cancelButton.Text = "Cancel"; + this.cancelButton.UseVisualStyleBackColor = true; + this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click); + // + // LoginDlg + // + this.AcceptButton = this.okButton; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cancelButton; + this.ClientSize = new System.Drawing.Size(426, 73); + this.Controls.Add(this.cancelButton); + this.Controls.Add(this.okButton); + this.Controls.Add(this.passwordGroupBox); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "LoginDlg"; + this.Text = "LoginDlg"; + this.passwordGroupBox.ResumeLayout(false); + this.passwordGroupBox.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox passwordGroupBox; + private System.Windows.Forms.TextBox passwordTextBox; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.Button cancelButton; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Forms/TrivialLoginDlg.resx b/TBF_V2/Sources/TBF/MonitoringDB/Forms/TrivialLoginDlg.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Forms/TrivialLoginDlg.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Interfaces/IOption.cs b/TBF_V2/Sources/TBF/MonitoringDB/Interfaces/IOption.cs new file mode 100644 index 00000000..c585a3ad --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Interfaces/IOption.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; + +namespace MonitoringDB.Interfaces +{ + public interface IOption + { + int Id { get; } + int ItemNr { get; set; } + string Name { get; set; } + string OraDBType { get; set; } + string Description { get; set; } + CodeType CodeType { get; set; } + CodeForm CodeForm { get; set; } + CodeLocation CodeLocation { get; set; } + LifetimeManagement LifetimeManagement { get; set; } + bool Enabled { get; set; } + Entities.Part GetPart(Entities.Process owningProcess); + } +} diff --git a/TBF_V2/Sources/TBF/MonitoringDB/ItemSpec.cs b/TBF_V2/Sources/TBF/MonitoringDB/ItemSpec.cs new file mode 100644 index 00000000..9826e58b --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/ItemSpec.cs @@ -0,0 +1,306 @@ +/// +/// Copyright (c) 2016-2017 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using MonitoringDB.Entities; +using MonitoringDB.Resources; +using NHibernate; +using NHibernate.Criterion; + +namespace MonitoringDB +{ + public class ItemSpec + { + /// + /// Function delegate to pick a reference record and convert it to a string + /// + public delegate string PrintDlgt(object x, string format, string precision, int width); + + /// + /// Public fields + /// + public readonly ItemSpecID Uid; /// Unique Uid used to distinguish items + public readonly string Name; /// Name that can be localized to identify the item in a list + public readonly PrintDlgt PrintFn; /// Function used to convert the result to a text + + public string Caption; /// User defined text printed in the column header + public string Format; /// Specifies the text generation + public string Precision; /// Specifies the text generation + public int Width; /// Specifies the text generation + + readonly ItemSpecCaps itemSpecCaps; + + /// Public parameterless constructor + public ItemSpec() + { + } + + /// Constructor to specify all items + public ItemSpec(ItemSpecID uid, string name, PrintDlgt printFn, ItemSpecCaps itemSpecCaps) + { + Uid = uid; + Name = name; + PrintFn = printFn; + this.itemSpecCaps = itemSpecCaps; + /// + Caption = name; + Format = "{0}"; + Precision = string.Empty; + Width = 0; + } + + /// Copy constructor + public ItemSpec Clone() + { + ItemSpec newItem = new ItemSpec(Uid, Name, PrintFn, itemSpecCaps); + newItem.Caption = Caption; + newItem.Format = Format; + newItem.Precision = Precision; + newItem.Width = Width; + return newItem; + } + + + /// Safe wrapper which replaces null-s by empty strings + public string Print(object x) + { + string str = PrintFn(x, Format, Precision, Width); + return (str == null) ? string.Empty : str; + } + + + /// Similar to Print(), in addition embeds text into "" + public string Export(object x) + { + string str = PrintFn(x, Format, Precision, Width); + if (str == null) str = string.Empty; + + if (Uid == ItemSpecID.Barcode || Uid == ItemSpecID.PartBarcode || Uid == ItemSpecID.SerialNr || Uid == ItemSpecID.PurchaseOrder) + { + return string.Format("=\"{0}\"", str); + } + return str; + } + + + /// Static list of all available items + public static readonly IList AllItems; + + /// + /// Static constructor that initializes the list of all items + /// + static ItemSpec() + { + AllItems = new List(); + + AllItems.Add(new ItemSpec(ItemSpecID.RefRecordID, Strings.RefRecordID, (x, f, p, w) => ((int)x).ToString(), ItemSpecCaps.ReferenceRecord)); + + AllItems.Add(new ItemSpec(ItemSpecID.TimeStamp, Strings.Time_stamp, (x, f, p, w) => string.IsNullOrEmpty(f) ? ((DateTime)x).ToString() : string.Format(f, (DateTime)x), ItemSpecCaps.ReferenceRecord)); + AllItems.Add(new ItemSpec(ItemSpecID.Workstep, Strings.Workstep, (x, f, p, w) => string.IsNullOrEmpty(f) ? ((Workstep)x).Name : string.Format(f, ((Workstep)x).Name), ItemSpecCaps.ReferenceRecord)); + AllItems.Add(new ItemSpec(ItemSpecID.Workplace, Strings.Workplace, (x, f, p, w) => string.IsNullOrEmpty(f) ? (string)x : string.Format(f, x), ItemSpecCaps.ReferenceRecord)); + AllItems.Add(new ItemSpec(ItemSpecID.UserName, Strings.User_name, (x, f, p, w) => string.IsNullOrEmpty(f) ? (string)x : string.Format(f, x), ItemSpecCaps.ReferenceRecord)); + AllItems.Add(new ItemSpec(ItemSpecID.Barcode, Strings.Barcode, (x, f, p, w) => string.IsNullOrEmpty(f) ? (string)x : string.Format(f, x), ItemSpecCaps.ReferenceRecord)); + AllItems.Add(new ItemSpec(ItemSpecID.PartBarcode, Strings.Part_barcode, (x, f, p, w) => string.IsNullOrEmpty(f) ? (string)x : string.Format(f, x), ItemSpecCaps.ReferenceRecord | ItemSpecCaps.AssociatedRecord)); + + AllItems.Add(new ItemSpec(ItemSpecID.TimeStamp2, Strings.Time_stamp+"2", (x, f, p, w) => string.IsNullOrEmpty(f) ? ((DateTime)x).ToString() : string.Format(f, (DateTime)x), ItemSpecCaps.ReferenceRecord)); + AllItems.Add(new ItemSpec(ItemSpecID.Workstep2, Strings.Workstep+"2", (x, f, p, w) => string.IsNullOrEmpty(f) ? ((Workstep)x).Name : string.Format(f, ((Workstep)x).Name), ItemSpecCaps.ReferenceRecord)); + AllItems.Add(new ItemSpec(ItemSpecID.Workplace2, Strings.Workplace+"2", (x, f, p, w) => string.IsNullOrEmpty(f) ? (string)x : string.Format(f, x), ItemSpecCaps.ReferenceRecord)); + AllItems.Add(new ItemSpec(ItemSpecID.UserName2, Strings.User_name+"2", (x, f, p, w) => string.IsNullOrEmpty(f) ? (string)x : string.Format(f, x), ItemSpecCaps.ReferenceRecord)); + AllItems.Add(new ItemSpec(ItemSpecID.Barcode2, Strings.Barcode+"2", (x, f, p, w) => string.IsNullOrEmpty(f) ? (string)x : string.Format(f, x), ItemSpecCaps.ReferenceRecord)); + AllItems.Add(new ItemSpec(ItemSpecID.PartBarcode2, Strings.Part_barcode+"2",(x, f, p, w)=> string.IsNullOrEmpty(f) ? (string)x : string.Format(f, x), ItemSpecCaps.ReferenceRecord | ItemSpecCaps.AssociatedRecord)); + + AllItems.Add(new ItemSpec(ItemSpecID.SerialNr, Strings.Serial_nr, (x, f, p, w) => x as string, ItemSpecCaps.ReferenceRecord | ItemSpecCaps.OracleQuery)); + AllItems.Add(new ItemSpec(ItemSpecID.PurchaseOrder, Strings.Purchase_order, (x, f, p, w) => x as string, ItemSpecCaps.ReferenceRecord | ItemSpecCaps.OracleQuery)); + AllItems.Add(new ItemSpec(ItemSpecID.TestResult, Strings.Test_result, (x, f, p, w) => x as string, ItemSpecCaps.ReferenceRecord | ItemSpecCaps.OracleQuery)); + AllItems.Add(new ItemSpec(ItemSpecID.MaxPruefindex, Strings.Max_pruefindex, (x, f, p, w) => x as string, ItemSpecCaps.ReferenceRecord | ItemSpecCaps.OracleQuery)); + + AllItems.Add(new ItemSpec(ItemSpecID.Process, Strings.Process, (x, f, p, w) => string.IsNullOrEmpty(f) ? ((Process)x).Name : string.Format(f, ((Process)x).Name), ItemSpecCaps.ReferenceRecord)); + } + + public PropertyProjection GetProperty(ReferenceRecord refRecord, Record record) + { + switch (Uid) + { + case ItemSpecID.RefRecordID: return Projections.Property(() => refRecord.Id); + + case ItemSpecID.TimeStamp: return Projections.Property(() => refRecord.TimeStamp); + case ItemSpecID.Workstep: return Projections.Property(() => refRecord.Workstep); + case ItemSpecID.Workplace: return Projections.Property(() => refRecord.Workplace); + case ItemSpecID.UserName: return Projections.Property(() => refRecord.UserName); + case ItemSpecID.Barcode: return Projections.Property(() => refRecord.Code); + case ItemSpecID.PartBarcode: return Projections.Property(() => record.Code); + + case ItemSpecID.TimeStamp2: return null; + case ItemSpecID.Workstep2: return null; + case ItemSpecID.Workplace2: return null; + case ItemSpecID.UserName2: return null; + case ItemSpecID.Barcode2: return null; + case ItemSpecID.PartBarcode2: return null; + + case ItemSpecID.SerialNr: return null; + case ItemSpecID.PurchaseOrder: return null; + case ItemSpecID.TestResult: return null; + case ItemSpecID.MaxPruefindex: return null; + + case ItemSpecID.Process: return Projections.Property(() => refRecord.Process); + + default: return null; + } + } + + public PropertyProjection GetProperty2(ReferenceRecord refRecord2, Record record2) + { + switch (Uid) + { + case ItemSpecID.RefRecordID: return null; + + case ItemSpecID.TimeStamp: return null; + case ItemSpecID.Workstep: return null; + case ItemSpecID.Workplace: return null; + case ItemSpecID.UserName: return null; + case ItemSpecID.Barcode: return null; + case ItemSpecID.PartBarcode: return null; + + case ItemSpecID.TimeStamp2: return Projections.Property(() => refRecord2.TimeStamp); + case ItemSpecID.Workstep2: return Projections.Property(() => refRecord2.Workstep); + case ItemSpecID.Workplace2: return Projections.Property(() => refRecord2.Workplace); + case ItemSpecID.UserName2: return Projections.Property(() => refRecord2.UserName); + case ItemSpecID.Barcode2: return Projections.Property(() => refRecord2.Code); + case ItemSpecID.PartBarcode2: return Projections.Property(() => record2.Code); + + case ItemSpecID.SerialNr: return null; + case ItemSpecID.PurchaseOrder: return null; + case ItemSpecID.TestResult: return null; + case ItemSpecID.MaxPruefindex: return null; + + case ItemSpecID.Process: return Projections.Property(() => refRecord2.Process); + + default: return null; + } + } + + public ItemSpecCaps GetCaps() + { + return itemSpecCaps; + } + + + public static ItemSpec GetItem(ItemSpecID id) + { + foreach (var item in AllItems) + if (item.Uid == id) + return item.Clone(); + + return null; + } + + public static ItemSpec GetItem(string uidName) + { + foreach (var item in AllItems) + if (item.Uid.ToString() == uidName) + return item.Clone(); + + return null; + } + + + public static ProjectionList GetProjections(IList items, ReferenceRecord refRecord, Record record) + { + ProjectionList projections = Projections.ProjectionList(); + foreach (var item in items) + { + PropertyProjection projection = item.GetProperty(refRecord, record); + if (projection != null) + projections.Add(projection); + } + + return projections; + } + + public static IList Expand(IList data, IList items) + { + if (data.Count == 0) return data; + + int iSize = data[0].Length; + int oSize = items.Count; + for (int i = 0; i < data.Count; i++) + { + object[] inArr = data[i]; + + object[] outArr = new object[oSize]; + int srcIx = 0; + for (int dstIx = 0; dstIx < oSize; dstIx++) + { + outArr[dstIx] = ((items[dstIx].GetCaps() & ItemSpecCaps.OracleQuery) == ItemSpecCaps.OracleQuery) ? string.Empty : inArr[srcIx++]; + } + + data[i] = outArr; + } + + return data; + } + + + //static string GetPartCode(ReferenceRecord refRecord, string partName) + //{ + // if (refRecord != null && refRecord.Records != null) + // { + // foreach (var record in refRecord.Records) + // { + // if (record.Part.Name.Equals(partName)) + // { + // return record.Code; + // } + // } + // } + + // return string.Empty; + //} + + public static string[] ToStrArray(IList items) + { + int count = (items != null) ? items.Count : 0; + string[] result = new string[count]; + for (int i = 0; i < count; i++) + { + result[i] = string.Format("{0}~{1}~{2}~{3}~{4}", + items[i].Uid, + items[i].Caption, + items[i].Format, + items[i].Precision, + items[i].Width); + } + return result; + } + + public static IList FromStrArray(string[] strArray) + { + IList result = new List(); + if (strArray != null) + { + for (int i = 0; i < strArray.Length; i++) + { + string[] field = strArray[i].Split(new char[] { '~' }); + try + { + ItemSpec item = GetItem(field[0]); + item.Caption = field[1]; + item.Format = field[2]; + item.Precision = field[3]; + item.Width = int.Parse(field[4]); + + result.Add(item); + } + catch + { + ItemSpec item = GetItem(ItemSpecID.RefRecordID); + item.Format = string.Format("Parse error: {0}", strArray[i]); + result.Add(item); + } + } + } + return result; + } + } +} diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Mappings/Option1Map.cs b/TBF_V2/Sources/TBF/MonitoringDB/Mappings/Option1Map.cs new file mode 100644 index 00000000..1b260011 --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Mappings/Option1Map.cs @@ -0,0 +1,21 @@ +using FluentNHibernate.Mapping; + +namespace MonitoringDB.Mappings +{ + class Option1Map : ClassMap + { + public Option1Map() + { + Id(x => x.Id); + Map(x => x.ItemNr); + Map(x => x.Name); + Map(x => x.OraDBType); + Map(x => x.Description); + Map(x => x.CodeType); + Map(x => x.CodeForm); + Map(x => x.CodeLocation); + Map(x => x.LifetimeManagement); + Map(x => x.Enabled); + } + } +} diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Mappings/Option2Map.cs b/TBF_V2/Sources/TBF/MonitoringDB/Mappings/Option2Map.cs new file mode 100644 index 00000000..ab082900 --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Mappings/Option2Map.cs @@ -0,0 +1,21 @@ +using FluentNHibernate.Mapping; + +namespace MonitoringDB.Mappings +{ + class Option2Map : ClassMap + { + public Option2Map() + { + Id(x => x.Id); + Map(x => x.ItemNr); + Map(x => x.Name); + Map(x => x.OraDBType); + Map(x => x.Description); + Map(x => x.CodeType); + Map(x => x.CodeForm); + Map(x => x.CodeLocation); + Map(x => x.LifetimeManagement); + Map(x => x.Enabled); + } + } +} diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Mappings/PartMap.cs b/TBF_V2/Sources/TBF/MonitoringDB/Mappings/PartMap.cs new file mode 100644 index 00000000..4cb6b7be --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Mappings/PartMap.cs @@ -0,0 +1,23 @@ +using FluentNHibernate.Mapping; + +namespace MonitoringDB.Mappings +{ + class PartMap : ClassMap + { + public PartMap() + { + Id(x => x.Id); + Map(x => x.Name); + Map(x => x.OraDBType); + Map(x => x.Description); + Map(x => x.CodeType); + Map(x => x.CodeForm); + Map(x => x.CodeLocation); + Map(x => x.LifetimeManagement); + Map(x => x.StepNumber); + + References(x => x.Process); + References(x => x.Workstep); + } + } +} diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Mappings/ProcessMap.cs b/TBF_V2/Sources/TBF/MonitoringDB/Mappings/ProcessMap.cs new file mode 100644 index 00000000..f2212962 --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Mappings/ProcessMap.cs @@ -0,0 +1,25 @@ +using FluentNHibernate.Mapping; + +namespace MonitoringDB.Mappings +{ + class ProcessMap : ClassMap + { + public ProcessMap() + { + Id(x => x.Id); + Map(x => x.ItemNr); + Map(x => x.Name); + Map(x => x.Description); + Map(x => x.ReleaseStatus); + Map(x => x.TimeStamp); + Map(x => x.UserName); + + HasMany(x => x.Parts) + .OrderBy("Name") + .Cascade.All(); + HasMany(x => x.Worksteps) + .OrderBy("WorkstepNr") + .Cascade.All(); + } + } +} diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Mappings/RecordMap.cs b/TBF_V2/Sources/TBF/MonitoringDB/Mappings/RecordMap.cs new file mode 100644 index 00000000..558c1557 --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Mappings/RecordMap.cs @@ -0,0 +1,17 @@ +using FluentNHibernate.Mapping; + +namespace MonitoringDB.Mappings +{ + class RecordMap : ClassMap + { + public RecordMap() + { + Id(x => x.Id); + Map(x => x.Code); + Map(x => x.TimeStamp); + + References(x => x.Part); + References(x => x.ReferenceRecord); + } + } +} diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Mappings/ReferenceRecordMap.cs b/TBF_V2/Sources/TBF/MonitoringDB/Mappings/ReferenceRecordMap.cs new file mode 100644 index 00000000..a2115f77 --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Mappings/ReferenceRecordMap.cs @@ -0,0 +1,22 @@ +using FluentNHibernate.Mapping; + +namespace MonitoringDB.Mappings +{ + class ReferenceRecordMap : ClassMap + { + public ReferenceRecordMap() + { + Id(x => x.Id); + Map(x => x.Code); + Map(x => x.TimeStamp); + Map(x => x.UserName); + Map(x => x.Workplace); + Map(x => x.Result); + + References(x => x.Process); + References(x => x.Workstep); + HasMany(x => x.Records) + .Cascade.All(); + } + } +} diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Mappings/WorkstepMap.cs b/TBF_V2/Sources/TBF/MonitoringDB/Mappings/WorkstepMap.cs new file mode 100644 index 00000000..a9c31096 --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Mappings/WorkstepMap.cs @@ -0,0 +1,23 @@ +using FluentNHibernate.Mapping; + +namespace MonitoringDB.Mappings +{ + class WorkstepMap : ClassMap + { + public WorkstepMap() + { + Id(x => x.Id); + Map(x => x.WorkstepNr); + Map(x => x.Name); + Map(x => x.Description); + Map(x => x.CheckPartNr); + Map(x => x.AllowRepairs); + + References(x => x.Process); + References(x => x.ReferencePart); + HasMany(x => x.Parts) + .OrderBy("StepNumber") + .Cascade.All(); + } + } +} diff --git a/TBF_V2/Sources/TBF/MonitoringDB/MonitoringDB.csproj b/TBF_V2/Sources/TBF/MonitoringDB/MonitoringDB.csproj new file mode 100644 index 00000000..4f436d15 --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/MonitoringDB.csproj @@ -0,0 +1,163 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {EFEC8A31-3022-4DA7-A8F6-16D30A94C3FF} + Library + Properties + MonitoringDB + MonitoringDB + v4.0 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\FluentNHibernate.2.0.3.0\lib\net40\FluentNHibernate.dll + True + + + ..\packages\Iesi.Collections.4.0.0.4000\lib\net40\Iesi.Collections.dll + True + + + ..\packages\log4net.2.0.2\lib\net40-full\log4net.dll + + + False + ..\packages\MySql.Data.6.6.5\lib\net40\MySql.Data.dll + + + ..\packages\NHibernate.4.0.4.4000\lib\net40\NHibernate.dll + True + + + + + + + + + + + + + + + + + Component + + + Form + + + TrivialLoginDlg.cs + + + Form + + + ModelessForm.cs + + + Form + + + ResultsConfigDlg.cs + + + Form + + + SettingsDlg.cs + + + + + + + + True + True + Strings.resx + + + + + + + + + + + + + + + + + + + True + True + Resources.resx + + + + + ListViewEx.cs + + + TrivialLoginDlg.cs + + + ModelessForm.cs + + + ResultsConfigDlg.cs + + + SettingsDlg.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + + + ResXFileCodeGenerator + Strings.Designer.cs + + + + + + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Properties/AssemblyInfo.cs b/TBF_V2/Sources/TBF/MonitoringDB/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..2d8125e5 --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Common")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Common")] +[assembly: AssemblyCopyright("Copyright © 2015-2018 Sensus Slovensko, a.s.")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("b182c80f-8670-40ab-ad26-6fb8de86552e")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.5.61.0")] +[assembly: AssemblyFileVersion("1.5.61.0")] diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Properties/Resources.Designer.cs b/TBF_V2/Sources/TBF/MonitoringDB/Properties/Resources.Designer.cs new file mode 100644 index 00000000..83868cae --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace MonitoringDB.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MonitoringDB.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Properties/Resources.resx b/TBF_V2/Sources/TBF/MonitoringDB/Properties/Resources.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Properties/Resources.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/MonitoringDB/QuitAppException.cs b/TBF_V2/Sources/TBF/MonitoringDB/QuitAppException.cs new file mode 100644 index 00000000..4e76e2a8 --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/QuitAppException.cs @@ -0,0 +1,12 @@ +using System; + +namespace MonitoringDB +{ + public class QuitAppException : Exception + { + public QuitAppException(string message) + : base(message) + { + } + } +} diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Resources/Strings.Designer.cs b/TBF_V2/Sources/TBF/MonitoringDB/Resources/Strings.Designer.cs new file mode 100644 index 00000000..542428e6 --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Resources/Strings.Designer.cs @@ -0,0 +1,333 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace MonitoringDB.Resources { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Strings { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Strings() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MonitoringDB.Resources.Strings", typeof(Strings).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Add >. + /// + internal static string Add { + get { + return ResourceManager.GetString("Add", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Available results. + /// + internal static string Available_results { + get { + return ResourceManager.GetString("Available_results", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Barcode. + /// + internal static string Barcode { + get { + return ResourceManager.GetString("Barcode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cancel. + /// + internal static string CancelBtnText { + get { + return ResourceManager.GetString("CancelBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Caption. + /// + internal static string Caption { + get { + return ResourceManager.GetString("Caption", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Configuration. + /// + internal static string Configuration { + get { + return ResourceManager.GetString("Configuration", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Down. + /// + internal static string DownBtnText { + get { + return ResourceManager.GetString("DownBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Format. + /// + internal static string Format { + get { + return ResourceManager.GetString("Format", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Item. + /// + internal static string Item { + get { + return ResourceManager.GetString("Item", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Max. prüfindex. + /// + internal static string Max_pruefindex { + get { + return ResourceManager.GetString("Max_pruefindex", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to OK. + /// + internal static string OkBtnText { + get { + return ResourceManager.GetString("OkBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Another part barcode. + /// + internal static string Part_barcode { + get { + return ResourceManager.GetString("Part_barcode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Precision. + /// + internal static string Precision { + get { + return ResourceManager.GetString("Precision", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Process. + /// + internal static string Process { + get { + return ResourceManager.GetString("Process", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Purchase order. + /// + internal static string Purchase_order { + get { + return ResourceManager.GetString("Purchase_order", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Record ID. + /// + internal static string RefRecordID { + get { + return ResourceManager.GetString("RefRecordID", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to < Remove. + /// + internal static string Remove { + get { + return ResourceManager.GetString("Remove", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remove all. + /// + internal static string Remove_all { + get { + return ResourceManager.GetString("Remove_all", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Selected results. + /// + internal static string Selected_results { + get { + return ResourceManager.GetString("Selected_results", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Serial nr.. + /// + internal static string Serial_nr { + get { + return ResourceManager.GetString("Serial_nr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Serial_number. + /// + internal static string Serial_number { + get { + return ResourceManager.GetString("Serial_number", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Summary. + /// + internal static string Summary { + get { + return ResourceManager.GetString("Summary", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test result. + /// + internal static string Test_result { + get { + return ResourceManager.GetString("Test_result", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Text. + /// + internal static string Text { + get { + return ResourceManager.GetString("Text", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Time stamp. + /// + internal static string Time_stamp { + get { + return ResourceManager.GetString("Time_stamp", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Up. + /// + internal static string UpBtnText { + get { + return ResourceManager.GetString("UpBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to User name. + /// + internal static string User_name { + get { + return ResourceManager.GetString("User_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Width. + /// + internal static string Width { + get { + return ResourceManager.GetString("Width", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Workplace. + /// + internal static string Workplace { + get { + return ResourceManager.GetString("Workplace", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Workstep. + /// + internal static string Workstep { + get { + return ResourceManager.GetString("Workstep", resourceCulture); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/MonitoringDB/Resources/Strings.resx b/TBF_V2/Sources/TBF/MonitoringDB/Resources/Strings.resx new file mode 100644 index 00000000..48968a01 --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/Resources/Strings.resx @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Add > + + + Available results + + + Barcode + + + Cancel + + + Caption + + + Configuration + + + Down + + + Format + + + Item + + + Max. prüfindex + + + OK + + + Another part barcode + + + Precision + + + Process + + + Purchase order + + + Record ID + + + < Remove + + + Remove all + + + Selected results + + + Serial nr. + + + Serial_number + + + Summary + + + Test result + + + Text + + + Time stamp + + + Up + + + User name + + + Width + + + Workplace + + + Workstep + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/MonitoringDB/ScanVerificationInfo.cs b/TBF_V2/Sources/TBF/MonitoringDB/ScanVerificationInfo.cs new file mode 100644 index 00000000..df3ce96c --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/ScanVerificationInfo.cs @@ -0,0 +1,25 @@ +using MonitoringDB.Entities; + +namespace MonitoringDB +{ + public class ScanVerificationInfo + { + public Workstep Workstep; /// null = verification is disabled + public bool VerifyReferencePart; /// true = verify current workstep ReferencePart with another part + /// false = verify Part from current workstep parts with ReferencePart of another Workstep + public Part Part; /// Applicable when VerifyReferencePart == false + + /// Constructor that disables verification + public ScanVerificationInfo() + { + Workstep = null; + } + + public ScanVerificationInfo(Workstep workstep, bool verifyReferencePart, Part part) + { + Workstep = workstep; + VerifyReferencePart = verifyReferencePart; + Part = part; + } + } +} diff --git a/TBF_V2/Sources/TBF/MonitoringDB/SerializableDictionary.cs b/TBF_V2/Sources/TBF/MonitoringDB/SerializableDictionary.cs new file mode 100644 index 00000000..163e147e --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/SerializableDictionary.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.Xml.Serialization; + +namespace MonitoringDB +{ + [XmlRoot("dictionary")] + public class SerializableDictionary + : Dictionary, IXmlSerializable + { + public System.Xml.Schema.XmlSchema GetSchema() + { + return null; + } + + public void ReadXml(System.Xml.XmlReader reader) + { + XmlSerializer keySerializer = new XmlSerializer(typeof(TKey)); + XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue)); + + bool wasEmpty = reader.IsEmptyElement; + reader.Read(); + + if (wasEmpty) + return; + + while (reader.NodeType != System.Xml.XmlNodeType.EndElement) + { + reader.ReadStartElement("item"); + + reader.ReadStartElement("key"); + TKey key = (TKey)keySerializer.Deserialize(reader); + reader.ReadEndElement(); + + reader.ReadStartElement("value"); + TValue value = (TValue)valueSerializer.Deserialize(reader); + reader.ReadEndElement(); + + this.Add(key, value); + + reader.ReadEndElement(); + reader.MoveToContent(); + } + reader.ReadEndElement(); + } + + public void WriteXml(System.Xml.XmlWriter writer) + { + XmlSerializer keySerializer = new XmlSerializer(typeof(TKey)); + XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue)); + + foreach (TKey key in this.Keys) + { + writer.WriteStartElement("item"); + + writer.WriteStartElement("key"); + keySerializer.Serialize(writer, key); + writer.WriteEndElement(); + + writer.WriteStartElement("value"); + TValue value = this[key]; + valueSerializer.Serialize(writer, value); + writer.WriteEndElement(); + + writer.WriteEndElement(); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/MonitoringDB/WMPart.cs b/TBF_V2/Sources/TBF/MonitoringDB/WMPart.cs new file mode 100644 index 00000000..5b798921 --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/WMPart.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using MonitoringDB.Entities; + +namespace MonitoringDB +{ + public class WMPart + { + public string Name; + public Process Process; + public string OraDBType; + public string Description; + public string Code; + public DateTime TimeStamp; + public CodeType CodeType; + public CodeForm CodeForm; + public CodeLocation CodeLocation; + public string UserName; + public string Workplace; + + public WMPart(ReferenceRecord rr) + { + Name = rr.Workstep.ReferencePart.Name; + Process = rr.Process; + OraDBType = rr.Workstep.ReferencePart.OraDBType; + Description = rr.Workstep.ReferencePart.Description; + Code = rr.Code; + TimeStamp = rr.TimeStamp; + CodeType = rr.Workstep.ReferencePart.CodeType; + CodeForm = rr.Workstep.ReferencePart.CodeForm; + CodeLocation = rr.Workstep.ReferencePart.CodeLocation; + UserName = rr.UserName; + Workplace = rr.Workplace; + } + + public WMPart(Record r) + { + Name = r.Part.Name; + Process = r.Part.Process; + OraDBType = r.Part.OraDBType; + Description = r.Part.Description; + Code = r.Code; + TimeStamp = r.TimeStamp; + CodeType = r.Part.CodeType; + CodeForm = r.Part.CodeForm; + CodeLocation = r.Part.CodeLocation; + UserName = r.ReferenceRecord.UserName; + Workplace = r.ReferenceRecord.Workplace; + } + } +} diff --git a/TBF_V2/Sources/TBF/MonitoringDB/app.config b/TBF_V2/Sources/TBF/MonitoringDB/app.config new file mode 100644 index 00000000..b3e77abf --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/app.config @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/MonitoringDB/packages.config b/TBF_V2/Sources/TBF/MonitoringDB/packages.config new file mode 100644 index 00000000..3f52f5e2 --- /dev/null +++ b/TBF_V2/Sources/TBF/MonitoringDB/packages.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Results/BatchResults.cs b/TBF_V2/Sources/TBF/Results/BatchResults.cs new file mode 100644 index 00000000..88753707 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/BatchResults.cs @@ -0,0 +1,210 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Results.Entities; + +namespace Results +{ + public class BatchResults + { + public readonly int WMPositionsCount; + + public IList TestDataList; + public IList ComponentsList; + public IList WaterMeterDataList; + + private BatchResults(int wmPositionsCount) + { + WMPositionsCount = wmPositionsCount; + + TestDataList = new List(); + ComponentsList = new List(); + WaterMeterDataList = new List(); + } + + + public Batch Batch; + public WaterMeter[] WaterMeters; + + public static BatchResults NewFromProcedure(int batchNr, int benchId, string user, int userNr, string programVer, + Config.Entities.Procedure procedure, + WaterMeterData[] waterMeterDatas, int[] waterMeterParts, double densityCorr) + { + BatchResults d = new BatchResults(waterMeterDatas.Length); + int year = DateTime.Now.Year; + + /// Create new batch + d.Batch = new Batch() + { + TestBenchId = benchId, + BatchNr = batchNr, + ProgramVersion = programVer, + UserName = user, + UserNumber = userNr, + ProcedureName = procedure.Name, + ProcedureDescription = procedure.Description, + WatermetersStr = procedure.Watermeters, + ProcedureRevision = procedure.Revision, + ProtocolTitle = string.Empty, + StartTime = DateTime.Now, + DensityCorr = (float)densityCorr, + Compound = (procedure.MetersKind == Config.Entities.MetersKind.Combined), +#if HEAT_METERS + HeatMeter = (procedure.MetersKind == Config.Entities.MetersKind.HeatMeter), +#endif + }; + + /// + /// Add watermeter to an array, array index is WM position. + /// AddWaterMetersToBatch() has to be used before saving results. + /// + d.WaterMeters = new WaterMeter[d.WMPositionsCount]; + for (int i = 0; i < d.WMPositionsCount; i++) + { + if (waterMeterDatas[i] == null) continue; + WaterMeterData wmd = WaterMeterData.UpdateList(d.WaterMeterDataList, waterMeterDatas[i]); + d.WaterMeters[i] = new WaterMeter() + { + Batch = d.Batch, + WaterMeterData = wmd, + WMPosition = i + 1, + YearOfProduction = year, + }; + } + + + foreach (var t in procedure.Tests) + { + if (t.Publish != (byte)Config.Entities.Publish.Never) + { + TestData td = TestData.UpdateList(d.TestDataList, new TestData(t)); + + for (int rnr = 1; rnr <= t.Repeats; rnr++) + { + /// Create an empty test result and add it to the list + TestRslt tr = new TestRslt(d.Batch, td, t.Part, rnr); + d.Batch.TestRslts.Add(tr); + + for (int i = 0; i < d.WMPositionsCount; i++) + { + if (d.WaterMeters[i] == null) continue; + + if (t.Part != 0 && waterMeterParts[i] != 0 && t.Part != waterMeterParts[i]) continue; + + /// + /// Create empty watermeter test results and add them to the list and to dictionaries + /// + IList wmtrs = d.WaterMeters[i].MeterTestRslts; + if (d.Batch.Compound) + { + /// Compound water meter + wmtrs.Add(new MeterTestRslt(d.WaterMeters[i], tr, Config.Entities.CompoundMeterId.CompoundMain)); + wmtrs.Add(new MeterTestRslt(d.WaterMeters[i], tr, Config.Entities.CompoundMeterId.CompoundAux)); + wmtrs.Add(new MeterTestRslt(d.WaterMeters[i], tr, Config.Entities.CompoundMeterId.Compound)); + } + else if (d.Batch.HeatMeter) + { + /// Heat meter + wmtrs.Add(new MeterTestRslt(d.WaterMeters[i], tr, Config.Entities.CompoundMeterId.HeatMeterVolume)); + wmtrs.Add(new MeterTestRslt(d.WaterMeters[i], tr, Config.Entities.CompoundMeterId.HeatMeterEnergy)); + } + else + { + /// Water meter + wmtrs.Add(new MeterTestRslt(d.WaterMeters[i], tr, Config.Entities.CompoundMeterId.Single)); + } + } + } + } + } + + return d; + } + + public static BatchResults FromBatch(Batch batch) + { + int wmCount = batch.WaterMeters.Count; + if (wmCount == 0) return null; + + BatchResults batchResults = new BatchResults(wmCount); + batchResults.Batch = batch; + batchResults.WaterMeters = new WaterMeter[wmCount]; + for (int i = 0; i < wmCount; i++) batchResults.WaterMeters[i] = batch.WaterMeters[i]; + + return batchResults; + } + + public TestRslt GetTestRslt(string name, int part) + { + return Batch.GetTestRslt(name, part); + } + + public MeterTestRslt GetMeterTestRslt(string name, int wmnr0, Config.Entities.CompoundMeterId meterId) + { + if (WaterMeters[wmnr0] != null) + { + return WaterMeters[wmnr0].GetMeterTestRslt(name, meterId); + } + return null; + } + + + /// + /// Returns true when all tests were done + /// + /// true = all tests done + public bool AllTestsDone() + { + for (int i = 0; i < WMPositionsCount; i++) + { + if (WaterMeters[i] != null) + { + foreach (var mtr in WaterMeters[i].MeterTestRslts) + { + if (!mtr.TestDone) return false; + } + } + } + return true; + } + + + /// + /// Adds non-null water meters from an array to a Batch water meters list. + /// This method should be used when results are prepared and + /// all disabled water meters are deleted. + /// + public void AddWaterMetersToBatch() + { + for (int i = 0; i < WMPositionsCount; i++) + { + if (WaterMeters[i] != null) + { + WaterMeters[i].Passed = WaterMeters[i].PassedFromTests(); + if (!WaterMeters[i].Disabled) + { + Batch.WaterMeters.Add(WaterMeters[i]); + } + } + } + } + + + public bool IsProduction() + { + for (int i = 0; i < WMPositionsCount; i++) + { + if (WaterMeters[i] != null) + { + foreach (var mtr in WaterMeters[i].MeterTestRslts) + { + if (mtr.TestData().Name.ToLower().Contains("adj")) + return true; + } + } + } + return false; + } + } +} diff --git a/TBF_V2/Sources/TBF/Results/DB.cs b/TBF_V2/Sources/TBF/Results/DB.cs new file mode 100644 index 00000000..ecfea110 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/DB.cs @@ -0,0 +1,328 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using FluentNHibernate.Cfg; +using FluentNHibernate.Cfg.Db; +using log4net; +using NHibernate; +using NHibernate.Cfg; +using NHibernate.Tool.hbm2ddl; +using Results.Entities; + +namespace Results +{ + public static class DB + { + static readonly ILog log = LogManager.GetLogger(typeof(DB)); + + /// Session factory for all regular sessions, not for CreateEmptyResultsDB(). + public static ISessionFactory SessionFactory; + + /// Connection string for all sessions + static string connectionString; + /// + public static string ConnectionString + { + get { return connectionString; } + set + { + if (value != connectionString) + { + connectionString = value; + SessionFactory = null; /// Clear SessionFactory on connection string change + } + } + } + + /// Database type (MySQL or SQLite) for all sessions + private static Users.Entities.DBType dbType; + /// + public static Users.Entities.DBType DbType + { + get { return dbType; } + set { dbType = value; SessionFactory = null; } + } + + /// + /// NHibernate session factory (to create the database session 'SessionFactory') + /// + /// A database session + static ISessionFactory CreateSessionFactory() + { + return CreateSessionFactory(false); + } + + /// + /// NHibernate session factory (to create the database session 'SessionFactory') + /// + /// true = Create a new DB, false = Regular DB + /// A database session + public static ISessionFactory CreateSessionFactory(bool createDB) + { + FluentConfiguration cfg = Fluently.Configure(); + + switch (dbType) + { + default: + case Users.Entities.DBType.SQLite: + cfg = cfg.Database(SQLiteConfiguration.Standard.UsingFile(connectionString)); + break; + case Users.Entities.DBType.MySql: + cfg = cfg.Database(MySQLConfiguration.Standard.ConnectionString(connectionString)); + break; + } + + cfg = cfg.Mappings(m => m.FluentMappings.AddFromAssemblyOf()); + + if (createDB) + { + return cfg.ExposeConfiguration(BuildSchemaCreate).BuildSessionFactory(); + } + else + { + return cfg.ExposeConfiguration(BuildSchema).BuildSessionFactory(); + } + } + + static void BuildSchema(Configuration config) + { + /// This NHibernate tool takes a configuration with mapping info and exports a database schema + new SchemaExport(config).SetOutputFile("db_schema"); + } + + static void BuildSchemaCreate(Configuration config) + { + /// This NHibernate tool takes a configuration with mapping info and exports a database schema + new SchemaExport(config).Create(true, true); + } + + /// Create a NHibernate session for the given database + public static ISession CreateSession() + { + if (string.IsNullOrEmpty(connectionString)) + { + throw new Exception("Connection string was not specified"); + } + + if (SessionFactory == null) SessionFactory = CreateSessionFactory(); + + return SessionFactory.OpenSession(); + } + + + public static void SaveObject(object obj) + { + SaveObject(CreateSession(), obj); + } + /// + public static void SaveObject(ISession session, object obj) + { + using (var transaction = session.BeginTransaction()) + { + session.SaveOrUpdate(obj); + try { transaction.Commit(); } + catch { } + } + } + + + public static void DeleteObject(object obj) + { + DeleteObject(CreateSession(), obj); + } + /// + public static void DeleteObject(ISession session, object obj) + { + using (var transaction = session.BeginTransaction()) + { + session.Delete(obj); + transaction.Commit(); + } + } + + + /// + /// Create an empty users database. + /// Database contains only the user 'admin' and the control board component 'CB'. + /// + /// DBType.SQLite or DBType.MySql + /// Connection string + /// true=success, false=error + public static bool CreateEmptyDB() + { + ISessionFactory sessionFactory = CreateSessionFactory(true); + if (sessionFactory == null) return false; + + /// Populate the database + using (var session = sessionFactory.OpenSession()) + { + using (var transaction = session.BeginTransaction()) + { + transaction.Commit(); + } + } + + return true; + } + + + /// + /// Shared data + /// + public static IList TestDataList; + public static IList ComponentsList; + public static IList WaterMeterDataList; + + + /// + /// Loads shared data from the database + /// + /// Throws NHibernate exceptions + public static void LoadSharedData() + { + ISession session = DB.CreateSession(); + + TestDataList = session.QueryOver().List(); + ComponentsList = session.QueryOver().List(); + WaterMeterDataList = session.QueryOver().List(); + } + + /// + /// Loads shared data from the database + /// + /// Throws NHibernate exceptions + public static int GetMaxSavedBatchNr() + { + ISession session = DB.CreateSession(); + IList batches = session.QueryOver().List(); + + int maxBatchNr = 0; + foreach (var b in batches) + { + if (b.BatchNr > maxBatchNr) maxBatchNr = b.BatchNr; + } + return maxBatchNr; + } + + + /// + /// Update TestData, Components and WaterMeterData fo tests and water meters in batch results + /// with existing data in static lists TestDataList, ComponentsList and WaterMeterDataList. + /// + /// Batch results + /// true when any data modiifed + public static bool UpdateBatchData(Entities.Batch batch) + { + ISession session = DB.CreateSession(); + + if (session == null) return false; + + foreach (var tr in batch.TestRslts) + { + /// Search in TestDataList and update test data in the new batch + TestData td = TestData.UpdateList(TestDataList, tr.TestData); + tr.TestData = td; + + /// Search in ComponentsList and update components in the new batch + Components cd = Components.UpdateList(ComponentsList, tr.Components); + tr.Components = cd; + } + + foreach (var wm in batch.WaterMeters) + { + /// Search in WaterMeterDataList and update water meter data in the new batch + WaterMeterData wmd = WaterMeterData.UpdateList(WaterMeterDataList, wm.WaterMeterData); + wm.WaterMeterData = wmd; + } + + return true; /// TODO: Really check for modifications + } + + + public static bool SaveNewBatch(Entities.Batch batch) + { + ISession session = DB.CreateSession(); + if (session == null) return false; + + TestDataList = session.QueryOver().List(); + ComponentsList = session.QueryOver().List(); + WaterMeterDataList = session.QueryOver().List(); + + UpdateBatchData(batch); + + ITransaction transaction = session.BeginTransaction(); + if (transaction == null) return false; + + try + { + foreach (var td in TestDataList) if (td.Id == 0) session.SaveOrUpdate(td); + foreach (var cd in ComponentsList) if (cd.Id == 0) session.SaveOrUpdate(cd); + foreach (var wd in WaterMeterDataList) if (wd.Id == 0) session.SaveOrUpdate(wd); + + log.Debug(batch.ToString(1)); + foreach (var tstRslt in batch.TestRslts) + { + log.Debug(tstRslt.ToString(1)); + } + + session.SaveOrUpdate(batch); + + transaction.Commit(); + } + catch (Exception exc) + { + transaction.Rollback(); + + log.FatalFormat("Saving results of batch #{0} into the results DB failed: {1}", batch.BatchNr, exc.Message); + if (exc.InnerException != null && !string.IsNullOrEmpty(exc.InnerException.Message)) + { + log.FatalFormat("Inner exception message: {0}", exc.InnerException.Message); + } + + return false; + } + + session.Flush(); + + return true; + } + + + public static Batch LoadBatch(int batchNr) + { + IList batches; + ISession session = DB.CreateSession(); + if (session == null) return null; + + try + { + TestDataList = session.QueryOver().List(); + ComponentsList = session.QueryOver().List(); + WaterMeterDataList = session.QueryOver().List(); + + batches = session.QueryOver() + .Where(x => (x.BatchNr == batchNr)) + .List(); + + foreach (var batch in batches) + { + batch.TestRslts = session.QueryOver() + .Where(x => (x.Batch.Id == batch.Id)) + .List(); + batch.WaterMeters = session.QueryOver() + .Where(x => (x.Batch.Id == batch.Id)) + .List(); + } + + return (batches.Count > 0) ? batches[0] : null; + } + catch (Exception exc) + { + log.FatalFormat("Cannot load batch #{0}: {1}", batchNr, exc.Message); + return null; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/Results/DBase.cs b/TBF_V2/Sources/TBF/Results/DBase.cs new file mode 100644 index 00000000..db9ffb07 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/DBase.cs @@ -0,0 +1,63 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using FluentNHibernate.Cfg; +using FluentNHibernate.Cfg.Db; +using log4net; +using NHibernate; +using NHibernate.Cfg; +using NHibernate.Tool.hbm2ddl; +using Results.Entities; + +namespace Results +{ + public class DBase + { + static readonly ILog log = LogManager.GetLogger(typeof(DBase)); + + /// Session factory for all regular sessions, not for CreateEmptyResultsDB(). + public static IList Databases; + public static int Count { get { return Databases.Count; } } + + static DBase() + { + Databases = new List(); + } + + + public readonly string Name; + public readonly string ConnectionString; + + ISessionFactory sessionFactory; + + public DBase(string connectionString, string name) + { + this.ConnectionString = connectionString; + this.Name = name; + sessionFactory = Fluently.Configure() + .Database(MySQLConfiguration.Standard.ConnectionString(connectionString)) + .Mappings(m => m.FluentMappings.AddFromAssemblyOf()) + .ExposeConfiguration(BuildSchema) + .BuildSessionFactory(); + } + + public DBase(string connectionString) + : this(connectionString, string.Empty) + { + } + + + private void BuildSchema(Configuration config) + { + /// This NHibernate tool takes a configuration with mapping info and exports a database schema + new SchemaExport(config).SetOutputFile("db_schema"); + } + + public ISession OpenSession() + { + return sessionFactory.OpenSession(); + } + } +} diff --git a/TBF_V2/Sources/TBF/Results/Entities/Batch.cs b/TBF_V2/Sources/TBF/Results/Entities/Batch.cs new file mode 100644 index 00000000..771ff25d --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Entities/Batch.cs @@ -0,0 +1,207 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; + +namespace Results.Entities +{ + public class Batch + { + public virtual int Id { get; protected set; } + public virtual int BatchNr { get; set; } + public virtual int TestBenchId { get; set; } + public virtual string ProgramVersion { get; set; } + public virtual string UserName { get; set; } + public virtual int UserNumber { get; set; } + public virtual string ProcedureName { get; set; } + public virtual string ProcedureDescription { get; set; } /// CEVAK, not mapped to DB + public virtual int ProcedureRevision { get; set; } + public virtual string WatermetersStr { get; set; } /// CEVAK, not mapped to DB + public virtual string ProtocolTitle { get; set; } + public virtual string Remark { get; set; } + public virtual float DensityCorr { get; set; } /// Density correction in [kg/m3] + public virtual float Custom2 { get; set; } + public virtual float Custom3 { get; set; } + public virtual DateTime StartTime { get; set; } + public virtual DateTime EndTime { get; set; } + public virtual bool Dirty { get; set; } + public virtual bool RsltsSent { get; set; } + public virtual bool RsltsPrinted { get; set; } + public virtual IList Tests { get; set; } + public virtual IList WaterMeters { get; set; } + public virtual IList TestRslts { get; set; } + public virtual bool Compound { get; set; } /// Not mapped to DB now + public virtual bool HeatMeter { get; set; } /// Not mapped to DB now + + public Batch() + { + Tests = new List(); + WaterMeters = new List(); + TestRslts = new List(); + } + + public virtual int PassedMetersCount() + { + int count = 0; + foreach (var mtr in WaterMeters) if (mtr.PassedFromTests()) count++; + return count; + } + + public virtual int FailedMetersCount() + { + return WaterMeters.Count - PassedMetersCount(); + } + + public virtual double AmbTempMean() + { + double timeSum = 0; + double sum = 0; + + foreach (var tr in TestRslts) + { + if (tr.TestDone) + { + double duration = (tr.EndTime - tr.StartTime).TotalSeconds; + timeSum += duration; + sum += (tr.AmbTempMean * duration); + } + } + + return (timeSum == 0) ? 0 : (sum / timeSum); + } + + public virtual double AmbPressMean() + { + double timeSum = 0; + double sum = 0; + + foreach (var tr in TestRslts) + { + if (tr.TestDone) + { + double duration = (tr.EndTime - tr.StartTime).TotalSeconds; + timeSum += duration; + sum += (tr.AmbPressMean * duration); + } + } + + return (timeSum == 0) ? 0 : (sum / timeSum); + } + + public virtual double AmbHumiMean() + { + double timeSum = 0; + double sum = 0; + + foreach (var tr in TestRslts) + { + if (tr.TestDone) + { + double duration = (tr.EndTime - tr.StartTime).TotalSeconds; + timeSum += duration; + sum += (tr.AmbHumiMean * duration); + } + } + + return (timeSum == 0) ? 0 : (sum / timeSum); + } + + public virtual double AmbTempStart() + { + for (int i = 0; i < TestRslts.Count; i++) + { + if (TestRslts[i].Publish() == Config.Entities.Publish.Always) + return TestRslts[i].AmbTempStart; + } + return 0; + } + public virtual double AmbPressStart() + { + for (int i = 0; i < TestRslts.Count; i++) + { + if (TestRslts[i].Publish() == Config.Entities.Publish.Always) + return TestRslts[i].AmbPressStart; + } + return 0; + } + public virtual double AmbHumiStart() + { + for (int i = 0; i < TestRslts.Count; i++) + { + if (TestRslts[i].Publish() == Config.Entities.Publish.Always) + return TestRslts[i].AmbHumiStart; + } + return 0; + } + + public virtual double AmbTempEnd() + { + for (int i = TestRslts.Count - 1; i >= 0; i++) + { + if (TestRslts[i].Publish() == Config.Entities.Publish.Always) + return TestRslts[i].AmbTempEnd; + } + return 0; + } + public virtual double AmbPressEnd() + { + for (int i = TestRslts.Count - 1; i >= 0; i++) + { + if (TestRslts[i].Publish() == Config.Entities.Publish.Always) + return TestRslts[i].AmbPressEnd; + } + return 0; + } + public virtual double AmbHumiEnd() + { + for (int i = TestRslts.Count - 1; i >= 0; i++) + { + if (TestRslts[i].Publish() == Config.Entities.Publish.Always) + return TestRslts[i].AmbHumiEnd; + } + return 0; + } + + public virtual double Buoyancy() + { + double timeSum = 0; + double sum = 0; + + foreach (var tr in TestRslts) + { + if (tr.TestData.Evaluate && tr.TestDone) + { + double duration = (tr.EndTime - tr.StartTime).TotalSeconds; + timeSum += duration; + sum += (tr.Buoyancy * duration); + } + } + + return (timeSum == 0) ? 0 : (sum / timeSum); + } + + public virtual TestRslt GetTestRslt(string name, int part) + { + foreach (var tr in TestRslts) + { + if (part == tr.Part && name.Equals(tr.Name())) return tr; + } + return null; + } + + public override string ToString() + { + return string.Format("Batch #{0}, Start:{1}, End:{2}, Procedure:{3}", BatchNr, StartTime, EndTime, ProcedureName); + } + + public virtual string ToString(int i) + { + return string.Format("Batch: BatchNr={0} TestBenchId={1} ProgramVersion={2} UserName={3} UserNumber={4} ProcedureName={5} ProcedureRevision={6} ProtocolTitle={7} Remark={8} DensityCorr={9} Custom2={10} Custom3={11} StartTime={12} EndTime={13} Dirty={14} RsltsSent={15} RsltsPrinted={16}", + BatchNr, TestBenchId, ProgramVersion, UserName, UserNumber, + ProcedureName, ProcedureRevision, ProtocolTitle, Remark, DensityCorr, + Custom2, Custom3, StartTime, EndTime, Dirty, + RsltsSent, RsltsPrinted); + } + } +} diff --git a/TBF_V2/Sources/TBF/Results/Entities/Components.cs b/TBF_V2/Sources/TBF/Results/Entities/Components.cs new file mode 100644 index 00000000..2a8017b2 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Entities/Components.cs @@ -0,0 +1,94 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Results.Entities +{ + public class Components + { + public virtual int Id { get; protected set; } + public virtual int TestBenchId { get; set; } + public virtual string TestBenchName { get; set; } + public virtual string Pump { get; set; } + public virtual string RegValve { get; set; } + public virtual string Flowmeter { get; set; } + public virtual string Diverter { get; set; } + public virtual string Scale { get; set; } + public virtual string Custom1 { get; set; } + public virtual string Custom2 { get; set; } + public virtual string Custom3 { get; set; } + + protected Components() + { + TestBenchId = 0; + TestBenchName = string.Empty; + Pump = string.Empty; + RegValve = string.Empty; + Flowmeter = string.Empty; + Diverter = string.Empty; + Scale = string.Empty; + Custom1 = string.Empty; + Custom2 = string.Empty; + Custom3 = string.Empty; + } + + public Components(int benchId, string benchName, string pump, string flowmeter, + string scale, string regValve, string diverter) + { + TestBenchId = benchId; + TestBenchName = benchName; + Pump = pump; + RegValve = regValve; + Flowmeter = flowmeter; + Diverter = diverter; + Scale = scale; + Custom1 = string.Empty; + Custom2 = string.Empty; + Custom3 = string.Empty; + } + + + /// + /// Method to compare the content of two entities + /// + /// Second entity to compare with + /// first = two entities are equal (except of Id) + public virtual bool Equals(Components bc) + { + if (TestBenchId != bc.TestBenchId) return false; + if (!TestBenchName.Equals(bc.TestBenchName)) return false; + if (!Pump.Equals(bc.Pump)) return false; + if (!RegValve.Equals(bc.RegValve)) return false; + if (!Flowmeter.Equals(bc.Flowmeter)) return false; + if (!Diverter.Equals(bc.Diverter)) return false; + if (!Scale.Equals(bc.Scale)) return false; + if (!Custom1.Equals(bc.Custom1)) return false; + if (!Custom2.Equals(bc.Custom2)) return false; + if (!Custom3.Equals(bc.Custom3)) return false; + + return true; + } + + + /// + /// Adds an item to the list if it does not occur there + /// + /// List of items + /// Item to add to the list or find there + /// Item from the list (existing or added) + public static Components UpdateList(IList list, Components item) + { + if (item == null) return null; /// Null item is not stored in the list + + Components found = list.FirstOrDefault(x => x.Equals(item)); + + if (found != null) return found; /// The same item found in the list, The found item returned + + list.Add(item); /// Item not fund in the list, it is added to the list + return item; + } + } +} diff --git a/TBF_V2/Sources/TBF/Results/Entities/MeterTestRslt.cs b/TBF_V2/Sources/TBF/Results/Entities/MeterTestRslt.cs new file mode 100644 index 00000000..a4d702e7 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Entities/MeterTestRslt.cs @@ -0,0 +1,129 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; + +namespace Results.Entities +{ + public class MeterTestRslt + { + public virtual int Id { get; protected set; } + + public virtual byte CompoundMeterId { get; set; } /// 0=single, 1=compound/main, 2=compound/aux., 3=compound/overal, 4=heat meter volume, 5=heat meter energy + public virtual int RegReaderType { get; set; } /// Not mapped to the DB, does not depent on localisation and customer + + public virtual double PulsesMeter { get; set; } /// # of water meter or heat meter pulses + public virtual double PulsesMaster { get; set; } /// # of reference flowmeter pulses (gated by this water meter pulses) + public virtual double PulsesPerLiter { get; set; } /// [l ^ -1], in case of heat meters (CompoundMeterId==5) pulses per kWh in [kWh ^ -1] + public virtual double VolumeStart { get; set; } /// Volume or energy (CompoundMeterId==5) on test start in [l] or [J] + public virtual double VolumeEnd { get; set; } /// Volume or energy (CompoundMeterId==5) on test end in [l] or [J] + public virtual double VolumeMeter { get; set; } /// Measured volume or energy (CompoundMeterId==5) in [l] or [J] + public virtual double VolumeRef { get; set; } /// Reference volume or energy (CompoundMeterId==5) in [l] or [J] + public virtual double TimestampStart { get; set; } /// [s] + public virtual double TimestampEnd { get; set; } /// [s] + public virtual double TestTime { get; set; } /// [s] + + /// Main result + public virtual double Error { get; set; } /// [%] + public virtual double KorrErrQ { get; set; } /// [%] not mapped to results DB, saved to Oracle DB + public virtual bool TestDone { get; set; } /// true = test was completed + public virtual bool Passed { get; set; } /// true = test passed, water meter is OK + + public virtual WaterMeter WaterMeter { get; set; } /// reference to the WaterMeter entity + public virtual TestRslt TestRslt { get; set; } /// reference to the TestRslt entity + + /// Wrappers + public virtual string Name() { return TestRslt.Name(); } + public virtual DateTime StartTime() { return TestRslt.StartTime; } + public virtual DateTime EndTime() { return TestRslt.EndTime; } + public virtual double FlowSetTime() { return TestRslt.FlowSetTime; } /// [s] + public virtual double FlowMass() { return TestRslt.FlowMass; } /// [kg/h] + public virtual double FlowVolume() { return TestRslt.FlowVolume; } /// [m3/h] + public virtual double ErrorMaster() { return TestRslt.ErrorMaster; } /// [%] + public virtual double DensityLine() { return TestRslt.DensityLine; } + public virtual Components Components(){ return TestRslt.Components; } + /// + public virtual TestData TestData() { return TestRslt.TestData; } + /// + public virtual int Repeats() { return TestData().Repeats; } + public virtual double Qfrom() { return TestData().Qfrom; } /// [m3/h] + public virtual double Qto() { return TestData().Qto; } /// [m3/h] + public virtual double TargetVolume() { return TestData().TargetVolume; } /// [l] + public virtual double TargetTime() { return TestData().TargetTime; } /// [s] + public virtual string Method() { return TestData().Method; } + public virtual double ErrLimLo() { return TestData().ErrLimLo; } /// [%] + public virtual double ErrLimHi() { return TestData().ErrLimHi; } /// [%] + public virtual double Uncertainty() { return TestData().Uncertainty; } /// [%] + + public virtual string ProcedureName() { return WaterMeter.Batch.ProcedureName; } + public virtual int BatchNr() { return WaterMeter.Batch.BatchNr; } + public virtual string SerialNr() { return WaterMeter.SerialNr; } + public virtual string EndState() { return WaterMeter.EndState; } + public virtual double QRise() { return WaterMeter.QRise; } /// [m3/h] + public virtual double QFall() { return WaterMeter.QFall; } /// [m3/h] + + public virtual bool Evaluate() { return TestData().Evaluate; } + public virtual Config.Entities.Publish Publish() { return (Config.Entities.Publish)TestData().Publish; } + + public virtual WaterMeterData WaterMeterData() { return WaterMeter.WaterMeterData; } + public virtual Batch Batch() { return WaterMeter.Batch; } + + public virtual bool IsPilotRslt() + { + return (CompoundMeterId == (byte)Config.Entities.CompoundMeterId.Single) || + (CompoundMeterId == (byte)Config.Entities.CompoundMeterId.Compound) || + (CompoundMeterId == (byte)Config.Entities.CompoundMeterId.HeatMeterEnergy); + } + + public virtual bool IsPulses() { return (RegReaderType == (int)Config.Entities.RegisterReaderType.Pulses || RegReaderType == (int)Config.Entities.RegisterReaderType.Unknown); } + public virtual bool IsCamera() { return (RegReaderType == (int)Config.Entities.RegisterReaderType.Camera); } + public virtual bool IsDataStream() { return (RegReaderType == (int)Config.Entities.RegisterReaderType.DataStream); } + public virtual bool IsManual() { return (RegReaderType == (int)Config.Entities.RegisterReaderType.Manual); } + + public virtual string PassedColorStr() + { + return Utils.PassedColorStr(Passed, Evaluate()); + } + + public MeterTestRslt() + { + TestDone = false; + Passed = false; + } + + public MeterTestRslt(WaterMeter waterMeterRslt, TestRslt testRslt, Config.Entities.CompoundMeterId compoundMeterId) + : this() + { + WaterMeter = waterMeterRslt; + TestRslt = testRslt; + CompoundMeterId = (byte)compoundMeterId; + } + + public virtual void CopyContentFrom(MeterTestRslt src) + { + if (src == null) return; + + CompoundMeterId = src.CompoundMeterId; + RegReaderType = src.RegReaderType; + PulsesMeter = src.PulsesMeter; + PulsesMaster = src.PulsesMaster; + PulsesPerLiter = src.PulsesPerLiter; + VolumeStart = src.VolumeStart; + VolumeEnd = src.VolumeEnd; + VolumeMeter = src.VolumeMeter; + VolumeRef = src.VolumeRef; + TimestampStart = src.TimestampStart; + TimestampEnd = src.TimestampEnd; + TestTime = src.TestTime; + Error = src.Error; + KorrErrQ = src.KorrErrQ; + TestDone = src.TestDone; + Passed = src.Passed; + } + + public override string ToString() + { + return (TestRslt != null) ? Name() : base.ToString(); + } + } +} diff --git a/TBF_V2/Sources/TBF/Results/Entities/TestData.cs b/TBF_V2/Sources/TBF/Results/Entities/TestData.cs new file mode 100644 index 00000000..b5be978d --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Entities/TestData.cs @@ -0,0 +1,108 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Results.Entities +{ + /// + /// Test, consisting of one or more repetitions of the test 'SingleTest'. + /// + public class TestData + { + public virtual int Id { get; protected set; } + public virtual string Name { get; set; } + public virtual int Repeats { get; set; } + public virtual double Qfrom { get; set; } /// [m3/h] flow range low limit + public virtual double Qto { get; set; } /// [m3/h] flow range high limit + public virtual double TargetVolume { get; set; } /// [l] target test volume + public virtual double TargetTime { get; set; } /// [s] target test time + public virtual string Method { get; set; } + public virtual double ErrLimLo { get; set; } /// [%] (usually < 0) + public virtual double ErrLimHi { get; set; } /// [%] (usually > 0) + public virtual double Uncertainty { get; set; } /// [%] makes error limits tighter: 0 <= Uncertainty <= abs(ErrLimXx) + public virtual bool DoControlWaterTemp { get; set; } + public virtual float TempLimLo { get; set; } + public virtual float TempLimHi { get; set; } + public virtual sbyte Publish { get; set; } /// 0=no, 1=in all protocols, 2=on screen, 3=internal + public virtual bool Evaluate { get; set; } + + + protected TestData() + { + Name = string.Empty; + Method = string.Empty; + } + + public TestData(Config.Entities.Test test) + : this() + { + Name = test.Name; + Repeats = test.Repeats; + Qfrom = (double)test.Qfrom; + Qto = (double)test.Qto; + TargetVolume = (double)test.Volume; + TargetTime = (double)test.TstTime; + Method = test.Method; + ErrLimLo = (double)test.ErrLimLo; + ErrLimHi = (double)test.ErrLimHi; + Uncertainty = (double)test.Uncertainty; + DoControlWaterTemp = test.DoControlWaterTemp; + TempLimLo = test.TempLimLo; + TempLimHi = test.TempLimHi; + Publish = test.Publish; + Evaluate = test.DoEvaluate; + } + + + /// + /// Method to compare the content of two entities + /// + /// Second entity to compare with + /// first = two entities are equal (except of Id) + public virtual bool Equals(TestData td) + { + if (!Name.Equals(td.Name)) return false; + if (Repeats != td.Repeats) return false; + if (Qfrom != td.Qfrom) return false; + if (Qto != td.Qto) return false; + if (TargetVolume != td.TargetVolume) return false; + if (TargetTime != td.TargetTime) return false; + if (!Method.Equals(td.Method)) return false; + if (ErrLimLo != td.ErrLimLo) return false; + if (ErrLimHi != td.ErrLimHi) return false; + if (Uncertainty != td.Uncertainty) return false; + if (DoControlWaterTemp != td.DoControlWaterTemp) return false; + if (DoControlWaterTemp) + { + if (TempLimLo != td.TempLimLo) return false; + if (TempLimHi != td.TempLimHi) return false; + } + if (Publish != td.Publish) return false; + if (Evaluate != td.Evaluate) return false; + + return true; + } + + + /// + /// Adds an item to the list if it does not occur there + /// + /// List of items + /// Item to add to the list or find there + /// Item from the list (existing or added) + public static TestData UpdateList(IList list, TestData item) + { + if (item == null) return null; /// Null item is not stored in the list + + TestData found = list.FirstOrDefault(x => x.Equals(item)); + + if (found != null) return found; /// The same item found in the list, The found item returned + + list.Add(item); /// Item not fund in the list, it is added to the list + return item; + } + } +} diff --git a/TBF_V2/Sources/TBF/Results/Entities/TestRslt.cs b/TBF_V2/Sources/TBF/Results/Entities/TestRslt.cs new file mode 100644 index 00000000..7b7ce36e --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Entities/TestRslt.cs @@ -0,0 +1,347 @@ +/// +/// Copyright (c) 2015-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Text; + +namespace Results.Entities +{ + public class TestRslt + { + /// Identity + public virtual int Id { get; protected set; } + public virtual Batch Batch { get; set; } + public virtual TestData TestData { get; set; } + public virtual Components Components { get; set; } + public virtual int Part { get; set; } + public virtual int RepetitionNr { get; set; } /// Repetition number from the set of repeated tests (1...) + public virtual string MethodClass { get; set; } /// Not mapped to the DB, does not depent on localisation and customer + + /// Main results + public virtual bool TestDone { get; set; } + public virtual string Remark { get; set; } + public virtual DateTime StartTime { get; set; } /// Date and time of the test start + public virtual DateTime EndTime { get; set; } /// Date and time of the test end + public virtual int FlowSetTime { get; set; } /// [s] Measurement time in seconds + public virtual double TestTime { get; set; } /// [s] Measurement time in seconds + public virtual double PulsesMaster { get; set; } + public virtual double ConstMasterRaw { get; set; } /// [l/pls] Liters per pulse of the master flow meter uncorrected. + public virtual double ConstMasterCorr { get; set; } /// [l/pls] Liters per pulse of the master flow meter corrected by a correction table. + public virtual double ConstMaster { get; set; } /// [l/pls] Liters per pulse of the master flow meter calculated from a mass measurement. + /// When mass measurement is not available, corrected by a correction table. + public virtual double MassStartRaw { get; set; } /// [kg] + public virtual double MassStart { get; set; } /// [kg] + public virtual double MassEndRaw { get; set; } /// [kg] + public virtual double MassEnd { get; set; } /// [kg] + public virtual double DensityIn { get; set; } /// [kg/m3] + public virtual double DensityLine { get; set; } /// [kg/m3] + public virtual double DensityDiv { get; set; } /// [kg/m3] + public virtual double Buoyancy { get; set; } + public virtual double FlowMass { get; set; } /// [kg/h] calculated from conventional true value + public virtual double FlowVolume { get; set; } /// [m3/h] + public virtual double VolumeCTV { get; set; } /// [l] Volume conventional true value + public virtual double VolumeMaster { get; set; } /// [l] Volume from the master flow meter + public virtual double ErrorMaster { get; set; } /// [%] Error of the master flow meter + + public virtual float DiverterStart { get; set; } /// [s] Diverter switch time when test starts + public virtual float DivStart10 { get; set; } /// [s] Diverter switch time when test starts at level 10 (e.g. 10%) (not mapped to DB) + public virtual float DivStart50 { get; set; } /// [s] Diverter switch time when test starts at level 50 (e.g. 50%) (not mapped to DB) + public virtual float DivStart90 { get; set; } /// [s] Diverter switch time when test starts at level 90 (e.g. 90%) (not mapped to DB) + + public virtual float DiverterEnd { get; set; } /// [s] Diverter switch time when test ends + public virtual float DivEnd90 { get; set; } /// [s] Diverter switch time when test starts at level 90 (e.g. 90%) (not mapped to DB) + public virtual float DivEnd50 { get; set; } /// [s] Diverter switch time when test starts at level 50 (e.g. 50%) (not mapped to DB) + public virtual float DivEnd10 { get; set; } /// [s] Diverter switch time when test starts at level 10 (e.g. 10%) (not mapped to DB) + + public virtual int ErrorFlags { get; set; } /// bitfield : bit0=E1, bit1=E2, bit2=E3, etc. + public virtual sbyte ErrorFlagsMd { get; set; } /// 0=off, 1=info, 2=on (evaluated in MeterTestRslt.Passed) + + /// Main results of heat meters + public virtual double RefEnergy { get; set; } /// [J] Joul + + /// Auxiliary results + public virtual float AmbTempMean { get; set; } /// [°C] Average ambient air temperature + public virtual float AmbTempStart { get; set; } /// [°C] Ambient air temperature on test start + public virtual float AmbTempEnd { get; set; } /// [°C] Ambient air temperature on test end + public virtual float AmbTempMin { get; set; } /// [°C] Minimum ambient air temperature + public virtual float AmbTempMax { get; set; } /// [°C] Maximum ambient air temperature + public virtual float AmbPressMean { get; set; } /// [bar] Average ambient air pressure + public virtual float AmbPressStart { get; set; } /// [bar] Ambient air pressure on test start + public virtual float AmbPressEnd { get; set; } /// [bar] Ambient air pressure on test end + public virtual float AmbPressMin { get; set; } /// [bar] Minimum ambient air pressure + public virtual float AmbPressMax { get; set; } /// [bar] Maximum ambient air pressure + public virtual float AmbHumiMean { get; set; } /// [%] Average ambient air relative humidity + public virtual float AmbHumiStart { get; set; } /// [%] Ambient air relative humidity on test start + public virtual float AmbHumiEnd { get; set; } /// [%] Ambient air relative humidity on test end + public virtual float AmbHumiMin { get; set; } /// [%] Minimum ambient air relative humidity + public virtual float AmbHumiMax { get; set; } /// [%] Maximum ambient air relative humidity + public virtual float PressUpMean { get; set; } /// [bar] Input water pressure (average) + public virtual float PressUpStart { get; set; } /// [bar] + public virtual float PressUpEnd { get; set; } /// [bar] + public virtual float PressUpMin { get; set; } /// [bar] + public virtual float PressUpMax { get; set; } /// [bar] + public virtual float PressDownMean { get; set; } /// [bar] + public virtual float PressDownStart { get; set; } /// [bar] + public virtual float PressDownEnd { get; set; } /// [bar] + public virtual float PressDownMin { get; set; } /// [bar] + public virtual float PressDownMax { get; set; } /// [bar] + public virtual float PressDeltaMean { get; set; } /// [bar] + public virtual float PressDeltaStart { get; set; } /// [bar] + public virtual float PressDeltaEnd { get; set; } /// [bar] + public virtual float PressDeltaMin { get; set; } /// [bar] + public virtual float PressDeltaMax { get; set; } /// [bar] + public virtual float TempUpMean { get; set; } /// [°C] + public virtual float TempUpStart { get; set; } /// [°C] + public virtual float TempUpEnd { get; set; } /// [°C] + public virtual float TempUpMin { get; set; } /// [°C] + public virtual float TempUpMax { get; set; } /// [°C] + public virtual float TempDownMean { get; set; } /// [°C] + public virtual float TempDownStart { get; set; } /// [°C] + public virtual float TempDownEnd { get; set; } /// [°C] + public virtual float TempDownMin { get; set; } /// [°C] + public virtual float TempDownMax { get; set; } /// [°C] + public virtual float TempDivMean { get; set; } /// [°C] + public virtual float TempDivStart { get; set; } /// [°C] + public virtual float TempDivEnd { get; set; } /// [°C] + public virtual float TempDivMin { get; set; } /// [°C] + public virtual float TempDivMax { get; set; } /// [°C] + public virtual float FlowMean { get; set; } /// [m3/h] mean flow from the reference flowmeter + public virtual float FlowStart { get; set; } /// [m3/h] flow at the start of test from the reference flowmeter + public virtual float FlowEnd { get; set; } /// [m3/h] flow at the end of test from the reference flowmeter + public virtual float FlowMin { get; set; } /// [m3/h] + public virtual float FlowMax { get; set; } /// [m3/h] + + public virtual float Custom1 { get; set; } /// [°C] T ref hi mean + public virtual float Custom2 { get; set; } /// [°C] T ref hi start + public virtual float Custom3 { get; set; } /// [°C] T ref hi end + public virtual float Custom4 { get; set; } /// [°C] T ref hi min + public virtual float Custom5 { get; set; } /// [°C] T ref hi max + public virtual float Custom6 { get; set; } /// [°C] T ref lo mean + public virtual float Custom7 { get; set; } /// [°C] T ref lo start + public virtual float Custom8 { get; set; } /// [°C] T ref lo end + public virtual float Custom9 { get; set; } /// [°C] T ref lo min + public virtual float Custom10 { get; set; } /// [°C] T ref lo max + + /// Wrappers + public virtual string Name() { return Utils.GetTestName(TestData.Name, TestData.Repeats, RepetitionNr); } + public virtual int Repeats() { return TestData.Repeats; } + public virtual double Qfrom() { return TestData.Qfrom; } + public virtual double Qto() { return TestData.Qto; } + public virtual double TargetVolume() { return TestData.TargetVolume; } + public virtual double TargetTime() { return TestData.TargetTime; } + public virtual string Method() { return TestData.Method; } + public virtual bool IsRelErrTest() { return (MethodClass != null) ? (MethodClass.Contains("FixedStart") || MethodClass.Contains("FlyingStart") || MethodClass.Contains("CombinedWithDetection")) : true; } + public virtual bool IsPMaxTest() { return (MethodClass != null) ? (MethodClass.Contains("PMaxTest") || MethodClass.Contains("LeakTest")) : true; } + public virtual bool IsStartStop() { return (MethodClass != null) ? MethodClass.Contains("FixedStart") : true; } + public virtual bool IsDiverter() { return (MethodClass != null) ? (MethodClass.Contains("FlyingStart") && MethodClass.Contains("MassColl")) : true; } + + public virtual double ErrLimLo() + { + if (TestData.ErrLimLo <= TestData.ErrLimHi) + { + return TestData.ErrLimLo; /// Error limit of a water meter + } + else + { + /// Metrological class and nominal flow of a heat meter + int metrClass = (int)Math.Round(TestData.ErrLimLo); + double Qp = Math.Abs(TestData.ErrLimHi); + double Q = Math.Max(FlowMean, 0.00001); /// to avoid division by zero + + /// Calculate the error limit of a heat meter + switch (metrClass) + { + default: + case 1: return -Math.Min(3.5, 1.0 + 0.01 * Qp / Q); + case 2: return -Math.Min(5.0, 2.0 + 0.02 * Qp / Q); + case 3: return -Math.Min(5.0, 3.0 + 0.05 * Qp / Q); + } + } + } + + public virtual double ErrLimHi() + { + if (TestData.ErrLimLo <= TestData.ErrLimHi) + { + return TestData.ErrLimHi; /// Error limit of a water meter + } + else + { + /// Metrological class and nominal flow of a heat meter + int metrClass = (int)Math.Round(TestData.ErrLimLo); + double Qp = Math.Abs(TestData.ErrLimHi); + double Q = Math.Max(FlowMean, 0.00001); /// to avoid division by zero + + /// Calculate the error limit of a heat meter + switch (metrClass) + { + default: + case 1: return +Math.Min(3.5, 1.0 + 0.01 * Qp / Q); + case 2: return +Math.Min(5.0, 2.0 + 0.02 * Qp / Q); + case 3: return +Math.Min(5.0, 3.0 + 0.05 * Qp / Q); + } + } + } + + public virtual double Uncertainty() { return TestData.Uncertainty; } + public virtual float TempLimLo() { return TestData.TempLimLo; } + public virtual float TempLimHi() { return TestData.TempLimHi; } + public virtual bool Evaluate() { return TestData.Evaluate; } + public virtual Config.Entities.Publish Publish() { return (Config.Entities.Publish)TestData.Publish; } + + + protected TestRslt() + { + } + + public TestRslt(Batch batch, TestData testData, int part, int repetitionNr) + : this() + { + Batch = batch; + TestData = testData; + Part = part; + RepetitionNr = repetitionNr; + } + + public virtual void CopyContentFrom(TestRslt src) + { + if (src == null) return; + + Components = src.Components; /// ??? + Part = src.Part; + RepetitionNr = src.RepetitionNr; + MethodClass = src.MethodClass; + TestDone = src.TestDone; + Remark = src.Remark; + StartTime = src.StartTime; + EndTime = src.EndTime; + FlowSetTime = src.FlowSetTime; + TestTime = src.TestTime; + PulsesMaster = src.PulsesMaster; + ConstMasterRaw = src.ConstMasterRaw; + ConstMaster = src.ConstMaster; + MassStartRaw = src.MassStartRaw; + MassStart = src.MassStart; + MassEndRaw = src.MassEndRaw; + MassEnd = src.MassEnd; + DensityIn = src.DensityIn; + DensityLine = src.DensityLine; + DensityDiv = src.DensityDiv; + Buoyancy = src.Buoyancy; + FlowMass = src.FlowMass; + FlowVolume = src.FlowVolume; + VolumeCTV = src.VolumeCTV; + VolumeMaster = src.VolumeMaster; + ErrorMaster = src.ErrorMaster; + DiverterStart = src.DiverterStart; + DiverterEnd = src.DiverterEnd; + ErrorFlags = src.ErrorFlags; + ErrorFlagsMd = src.ErrorFlagsMd; + RefEnergy = src.RefEnergy; + AmbTempMean = src.AmbTempMean; + AmbTempStart = src.AmbTempStart; + AmbTempEnd = src.AmbTempEnd; + AmbTempMin = src.AmbTempMin; + AmbTempMax = src.AmbTempMax; + AmbPressMean = src.AmbPressMean; + AmbPressStart = src.AmbPressStart; + AmbPressEnd = src.AmbPressEnd; + AmbPressMin = src.AmbPressMin; + AmbPressMax = src.AmbPressMax; + AmbHumiMean = src.AmbHumiMean; + AmbHumiStart = src.AmbHumiStart; + AmbHumiEnd = src.AmbHumiEnd; + AmbHumiMin = src.AmbHumiMin; + AmbHumiMax = src.AmbHumiMax; + PressUpMean = src.PressUpMean; + PressUpStart = src.PressUpStart; + PressUpEnd = src.PressUpEnd; + PressUpMin = src.PressUpMin; + PressUpMax = src.PressUpMax; + PressDownMean = src.PressDownMean; + PressDownStart = src.PressDownStart; + PressDownEnd = src.PressDownEnd; + PressDownMin = src.PressDownMin; + PressDownMax = src.PressDownMax; + PressDeltaMean = src.PressDeltaMean; + PressDeltaStart = src.PressDeltaStart; + PressDeltaEnd = src.PressDeltaEnd; + PressDeltaMin = src.PressDeltaMin; + PressDeltaMax = src.PressDeltaMax; + TempUpMean = src.TempUpMean; + TempUpStart = src.TempUpStart; + TempUpEnd = src.TempUpEnd; + TempUpMin = src.TempUpMin; + TempUpMax = src.TempUpMax; + TempDownMean = src.TempDownMean; + TempDownStart = src.TempDownStart; + TempDownEnd = src.TempDownEnd; + TempDownMin = src.TempDownMin; + TempDownMax = src.TempDownMax; + TempDivMean = src.TempDivMean; + TempDivStart = src.TempDivStart; + TempDivEnd = src.TempDivEnd; + TempDivMin = src.TempDivMin; + TempDivMax = src.TempDivMax; + FlowMean = src.FlowMean; + FlowStart = src.FlowStart; + FlowEnd = src.FlowEnd; + FlowMin = src.FlowMin; + FlowMax = src.FlowMax; + Custom1 = src.Custom1; + Custom2 = src.Custom2; + Custom3 = src.Custom3; + Custom4 = src.Custom4; + Custom5 = src.Custom5; + Custom6 = src.Custom6; + Custom7 = src.Custom7; + Custom8 = src.Custom8; + Custom9 = src.Custom9; + Custom10 = src.Custom10; + } + + /// Wrapper + public virtual Config.Entities.ErrorFlagsMode ErrorFlagsMode() + { + return (Config.Entities.ErrorFlagsMode)ErrorFlagsMd; + } + + /// Wrapper + public virtual string ErrorFlagsStr() + { + string eFlags = Utils.ErrorFlagsStr(ErrorFlags); +#if LANG_PL + return string.IsNullOrEmpty(eFlags) ? "brak" : eFlags; +#else + return eFlags; +#endif + } + + public override string ToString() + { + return string.Format("batch={0}, procedure={1}, test={2}, {3} {4}", Batch.BatchNr, Batch.ProcedureName, Name(), StartTime.ToShortDateString(), StartTime.ToShortTimeString()); + } + + public virtual string ToString(int i) + { + return string.Format("TestRslt: Part={0} RepetitionNr={1} TestDone={2} Remark={3} StartTime={4} EndTime={5} FlowSetTime={6} TestTime={7} PulsesMaster={8} ConstMaster={9} MassStartRaw={10} MassStart={11} MassEndRaw={12} MassEnd={13} DensityIn={14} DensityOut={15} DensityDiv={16} Buoyancy={17} FlowMass={18} FlowVolume={19} VolumeCTV={20} VolumeMaster={21} ErrorMaster={22} DiverterStart={85} DiverterEnd={86} ErrorFlags={23} ErrorFlagsMd={24} AmbTempMean={25} AmbTempStart={26} AmbTempEnd={27} AmbTempMin={28} AmbTempMax={29} AmbPressMean={30} AmbPressStart={31} AmbPressEnd={32} AmbPressMin={33} AmbPressMax={34} AmbHumiMean={35} AmbHumiStart={36} AmbHumiEnd={37} AmbHumiMin={38} AmbHumiMax={39} PressUpMean={40} PressUpStart={41} PressUpEnd={42} PressUpMin={43} PressUpMax={44} PressDownMean={45} PressDownStart={46} PressDownEnd={47} PressDownMin={48} PressDownMax={49} PressDeltaMean={50} PressDeltaStart={51} PressDeltaEnd={52} PressDeltaMin={53} PressDeltaMax={54} TempUpMean={55} TempUpStart={56} TempUpEnd={57} TempUpMin={58} TempUpMax={59} TempDownMean={60} TempDownStart={61} TempDownEnd={62} TempDownMin={63} TempDownMax={64} TempDivMean={65} TempDivStart={66} TempDivEnd={67} TempDivMin={68} TempDivMax={69} FlowMean={70} FlowStart={71} FlowEnd={72} FlowMin={73} FlowMax={74} Custom1={75} Custom2={76} Custom3={77} Custom4={78} Custom5={79} Custom6={80} Custom7={81} Custom8={82} Custom9={83} Custom10={84}", + Part, RepetitionNr, TestDone, Remark, StartTime, EndTime, FlowSetTime, TestTime, + PulsesMaster, ConstMaster, MassStartRaw, MassStart, MassEndRaw, MassEnd, + DensityIn, DensityLine, DensityDiv, Buoyancy, FlowMass, FlowVolume, + VolumeCTV, VolumeMaster, ErrorMaster, ErrorFlags, ErrorFlagsMd, + AmbTempMean, AmbTempStart, AmbTempEnd, AmbTempMin, AmbTempMax, + AmbPressMean, AmbPressStart, AmbPressEnd, AmbPressMin, AmbPressMax, + AmbHumiMean, AmbHumiStart, AmbHumiEnd, AmbHumiMin, AmbHumiMax, + PressUpMean, PressUpStart, PressUpEnd, PressUpMin, PressUpMax, + PressDownMean, PressDownStart, PressDownEnd, PressDownMin, PressDownMax, + PressDeltaMean, PressDeltaStart, PressDeltaEnd, PressDeltaMin, PressDeltaMax, + TempUpMean, TempUpStart, TempUpEnd, TempUpMin, TempUpMax, + TempDownMean, TempDownStart, TempDownEnd, TempDownMin, TempDownMax, + TempDivMean, TempDivStart, TempDivEnd, TempDivMin, TempDivMax, + FlowMean, FlowStart, FlowEnd, FlowMin, FlowMax, + Custom1, Custom2, Custom3, Custom4, Custom5, Custom6, Custom7, Custom8, Custom9, Custom10, + DiverterStart, DiverterEnd); + } + } +} diff --git a/TBF_V2/Sources/TBF/Results/Entities/WaterMeter.cs b/TBF_V2/Sources/TBF/Results/Entities/WaterMeter.cs new file mode 100644 index 00000000..a37f1ad9 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Entities/WaterMeter.cs @@ -0,0 +1,352 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Text; +using Config.Entities; + +namespace Results.Entities +{ + + public enum ResultCode + { + None = 0, + + Bit16 = (1 << 16), + Bit17 = (1 << 17), + Bit18 = (1 << 18), + Bit19 = (1 << 19), + RfidErrorCodeMask = (Bit16 | Bit17 | Bit18 | Bit19), /// RFID comm. err. (the first encounetered error is stored) + + Bit20 = (1 << 20), + Bit21 = (1 << 21), + Bit22 = (1 << 22), + Bit23 = (1 << 23), + RfidErrorTestIdMask = (Bit20 | Bit21 | Bit22 | Bit23), /// RFID comm. err. (the first encounetered error is stored) + + MissingOptoData = (1 << 24), + OptoDataWithZeroFlow = (1 << 25), + OptoErrorCodeMask = (MissingOptoData | OptoDataWithZeroFlow), /// Opto comm. err. (the first encounetered error is stored) + + Bit26 = (1 << 26), + Bit27 = (1 << 27), + Bit28 = (1 << 28), + Bit29 = (1 << 29), + Bit30 = (1 << 30), + Bit31 = (1 << 31), + } + + + public class WaterMeter + { + public virtual int Id { get; protected set; } + public virtual string SerialNr { get; set; } /// Main s/n for compound meters, PCB Number for iPerl water meter + public virtual string SerialNrAux { get; set; } /// Aux s/n for compound meters, Serial number for iPerl water meter + public virtual string PurchaseOrder { get; set; } + public virtual int YearOfProduction { get; set; } + public virtual int WMPosition { get; set; } + public virtual string EndState { get; set; } /// End state (of the main water meter) + public virtual string EndStateAux { get; set; } /// End state of the auxiliary water meter + public virtual double QRise { get; set; } /// [m3/h] detected Q_rise of a composed meter or 'sensitivity' of a single meter + public virtual double QFall { get; set; } /// [m3/h] detected Q_fall of a composed meter + public virtual int ErrorFlags { get; set; } /// bitfield : bit14=E15, bit15=E16 + public virtual bool Passed { get; set; } + public virtual int ResultCode { get; set; } + public virtual string ArchivePath { get; set; } + public virtual string Remark { get; set; } + +#if IPERL + public virtual int SerialNrEx { get; set; } /// Aux s/n for compound meters, Serial number for iPerl water meter + public virtual double OrigCalibFactor { get; set; } /// iPerl calibration factor used during the test + public virtual double CalibFactor { get; set; } /// iPerl calibration factor used during the test + public virtual double Q2ErrWOCorrection { get; set; } + public virtual bool Q2CorrectionDone { get; set; } /// true = iPerl Q2 correction was done + public virtual double Q2Correction { get; set; } /// !!! obsolete + public virtual int Q2CorrRFlow { get; set; } /// iPerl Q2 correction for the R-flow written to iPerl + public virtual int Q2CorrLFlow { get; set; } /// iPerl Q2 correction for the L-flow written to iPerl + public virtual int Q2CorrFlowRight { get; set; } /// 1 = right to left + public virtual double Diff2Hz8Hz { get; set; } + public virtual bool Hz2CorrectionDone { get; set; } /// true = iPerl Q2 correction was done + public virtual int Hz2Correction { get; set; } /// iPerl Q2 correction used during the test + public virtual string FWVersion { get; set; } +#endif +#if ORACLE_DB + public virtual int Pruefindex { get; set; } /// Not mapped to DB !!! 0=unknown (saving to Oracle failed), >=1 ... pruefindex + public virtual int HydrPruefung { get; set; } /// Not mapped to DB !!! +#endif + public virtual WaterMeterData WaterMeterData { get; set; } + public virtual Batch Batch { get; set; } + public virtual IList MeterTestRslts { get; set; } + + /// + /// Wrappers + /// + public virtual string ProductName() { return WaterMeterData.ProductName; } + public virtual string Producer() { return WaterMeterData.Producer; } + public virtual string MetrologicalClass() { return WaterMeterData.MetrologicalClass; } + public virtual string ApprovalInfo() { return WaterMeterData.ApprovalInfo; } + public virtual bool NewQnames() { return WaterMeterData.NewQnames; } + public virtual double Q4_Qmax() { return WaterMeterData.Q4_Qmax; } + public virtual double Q3_Qn() { return WaterMeterData.Q3_Qn; } + public virtual double Q2_Qt() { return WaterMeterData.Q2_Qt; } + public virtual double Q1_Qmin() { return WaterMeterData.Q1_Qmin; } + + public virtual bool Compound() { return WaterMeterData.Compound; } + public virtual bool HeatMeter() { return WaterMeterData.HeatMeter; } + + public virtual string ProducerAux() { return WaterMeterData.ProducerAux; } + public virtual double Q3_Qn_Aux() { return WaterMeterData.Q3_Qn_Aux; } + public virtual string MetrologicalClassAux() { return WaterMeterData.MetrologicalClassAux; } + public virtual string ApprovalInfoAux() { return WaterMeterData.ApprovalInfoAux; } + + public virtual int BatchNr() { return Batch.BatchNr; } + public virtual int BenchId() { return Batch.TestBenchId; } + public virtual string ProcedureName() { return Batch.ProcedureName; } + public virtual int ProcedureRevision() { return Batch.ProcedureRevision; } + public virtual DateTime StartTime() { return Batch.StartTime; } + public virtual DateTime EndTime() { return Batch.EndTime; } + + protected MeterTestRslt lastMeterTestRslts; + public virtual MeterTestRslt LastMeterTestRslts() { return lastMeterTestRslts; } + + + public virtual int ErrorFlagsFromTests(out ErrorFlagsMode errorFlagsMode) + { + int errorFlags = 0; + ErrorFlagsMode eFlagsMode = 0; /// = ErrorFlagsMode.Off; + foreach (var mtr in MeterTestRslts) + { + if (mtr.TestDone) errorFlags |= mtr.TestRslt.ErrorFlags; + if ((int)mtr.TestRslt.ErrorFlagsMode() > (int)eFlagsMode) eFlagsMode = mtr.TestRslt.ErrorFlagsMode(); + } + errorFlagsMode = eFlagsMode; /// Maximum from all tests (=ErrorFlagsMode.On if at least one test is ErrorFlagsMode.On) + return errorFlags; + } + + public virtual int ErrorFlagsFromTestsAndWM(out ErrorFlagsMode errorFlagsMode) + { + int eFlagsFromTests = ErrorFlagsFromTests(out errorFlagsMode) | ErrorFlags; + return (errorFlagsMode != ErrorFlagsMode.Off) ? (eFlagsFromTests | ErrorFlags) : 0; + } + + /// + /// Convert combined errorFlags of all tests to string + /// + /// ErrorFlags string + public virtual string ErrorFlagsStr() + { + ErrorFlagsMode errorFlagsMode; + string eFlags = Utils.ErrorFlagsStr(ErrorFlagsFromTestsAndWM(out errorFlagsMode)); +#if LANG_PL + return string.IsNullOrEmpty(eFlags) ? "brak" : eFlags; +#else + return eFlags; +#endif + } + + public virtual string PassedOrErrorFlagsStr() + { + ErrorFlagsMode errorFlagsMode; + string eFlags = Utils.ErrorFlagsStr(ErrorFlagsFromTestsAndWM(out errorFlagsMode)); + return string.IsNullOrEmpty(eFlags) ? (WaterMeterData.Text4 + PassedColorStr()) : eFlags; + } + + /// + /// Convert failed tests and combined errorFlags of all tests to string + /// + /// ErrorFlagsEx string + public virtual string ErrorFlagsStrEx() + { + StringBuilder errFlgsStr = new StringBuilder(); + foreach (var mtr in MeterTestRslts) + { + if (mtr.Evaluate() && mtr.TestDone && !mtr.Passed) + { + errFlgsStr.Append(mtr.Name()); + errFlgsStr.Append(" "); + } + } + + ErrorFlagsMode errorFlagsMode; + errFlgsStr.Append(Utils.ErrorFlagsStr(ErrorFlagsFromTestsAndWM(out errorFlagsMode))); + + return errFlgsStr.ToString(); + } + + public virtual bool PassedFromTests() + { + ErrorFlagsMode eFlagsMode; + int eFlags = ErrorFlagsFromTestsAndWM(out eFlagsMode); + + bool passed = true; + if (eFlagsMode == ErrorFlagsMode.On && eFlags != 0) passed = false; + + foreach (var mtr in MeterTestRslts) + { + if (mtr.Evaluate() && (!mtr.Passed || !mtr.TestDone)) + { + passed = false; + break; + } + } + + return passed; + } + + public virtual bool CompletedFromTests() + { + bool completed = true; + foreach (var mtr in MeterTestRslts) + { + if (mtr.Evaluate() && !mtr.TestDone) + { + completed = false; + break; + } + } + return completed; + } + + + public virtual string PassedColorStr() + { + return Utils.PassedColorStr(Passed, true); + } + + + + + /// + /// Not mapped to the database + /// + public virtual bool Disabled { get; set; } /// true = Disabled water meters (not saved into DB) + + + public virtual MeterTestRslt GetMeterTestRslt(string testName) + { + return GetMeterTestRslt(testName, CompoundMeterId.SingleOrCompound); + } + + public virtual MeterTestRslt GetMeterTestRslt(string testName, Config.Entities.CompoundMeterId meterId) + { + if (string.IsNullOrEmpty(testName)) return null; + if (Disabled) return null; + + string testNameL = testName.ToLower(); + foreach (var mtr in MeterTestRslts) + { + if (mtr.Name().ToLower().Equals(testNameL)) + { + if (mtr.CompoundMeterId == (byte)meterId) + { + return mtr; + } + else if (meterId == Config.Entities.CompoundMeterId.SingleOrCompound && + mtr.CompoundMeterId == (byte)Config.Entities.CompoundMeterId.Single) + { + return mtr; + } + else if (meterId == Config.Entities.CompoundMeterId.SingleOrCompound && + mtr.CompoundMeterId == (byte)Config.Entities.CompoundMeterId.Compound) + { + return mtr; + } + } + } + return null; + } + + public virtual TestRslt GetTestRslt(string testName) + { + MeterTestRslt mtr = GetMeterTestRslt(testName); + if (mtr != null) return mtr.TestRslt; + return null; + } + + public virtual TestData GetTestData(string testName) + { + foreach (var mtr in MeterTestRslts) + { + if (mtr.TestRslt.TestData.Name == testName) + { + return mtr.TestRslt.TestData; + } + } + return null; + } + + + + /// + /// Constructor, initializes a list, used as a base for other constructors + /// + public WaterMeter() + { + MeterTestRslts = new List(); + } + + + public virtual void CopyContentFrom(WaterMeter src) + { + if (src == null) return; + + SerialNr = src.SerialNr; + SerialNrAux = src.SerialNrAux; + PurchaseOrder = src.PurchaseOrder; + YearOfProduction = src.YearOfProduction; + // WMPosition skipped + EndState = src.EndState; + EndStateAux = src.EndStateAux; + QRise = src.QRise; + QFall = src.QFall; + ErrorFlags = src.ErrorFlags; + Passed = src.Passed; + ResultCode = src.ResultCode; + ArchivePath = src.ArchivePath; + Remark = src.Remark; +#if IPERL + SerialNrEx = src.SerialNrEx; + OrigCalibFactor = src.OrigCalibFactor; + CalibFactor = src.CalibFactor; + Q2ErrWOCorrection = src.Q2ErrWOCorrection; + Q2CorrectionDone = src.Q2CorrectionDone; + Q2Correction = src.Q2Correction; + Q2CorrRFlow = src.Q2CorrRFlow; + Q2CorrLFlow = src.Q2CorrLFlow; + Q2CorrFlowRight = src.Q2CorrFlowRight; + Diff2Hz8Hz = src.Diff2Hz8Hz; + Hz2CorrectionDone = src.Hz2CorrectionDone; + Hz2Correction = src.Hz2Correction; + FWVersion = src.FWVersion; +#endif +#if ORACLE_DB + Pruefindex = src.Pruefindex; + HydrPruefung = src.HydrPruefung; +#endif + foreach (var mtr in MeterTestRslts) + { + MeterTestRslt srcMtr = src.GetMeterTestRslt(mtr.Name(), (Config.Entities.CompoundMeterId)mtr.CompoundMeterId); + if (srcMtr != null) + { + mtr.CopyContentFrom(srcMtr); + mtr.TestRslt.CopyContentFrom(srcMtr.TestRslt); + } + } + } + + public override string ToString() + { + StringBuilder sb = new StringBuilder(80); +#if IPERL + sb.AppendFormat("PCB:{0} S/N:{1} ", SerialNr, SerialNrEx); +#else + sb.AppendFormat("S/N:{0} ", SerialNr); +#endif + + foreach (var tr in MeterTestRslts) sb.AppendFormat(" {0}:{1}%", tr.Name(), tr.Error.ToString("F2")); + sb.AppendFormat(" test start: {0} {1} batch={2}", StartTime().ToShortDateString(), StartTime().ToShortTimeString(), BatchNr()); + return sb.ToString(); + } + } +} diff --git a/TBF_V2/Sources/TBF/Results/Entities/WaterMeterData.cs b/TBF_V2/Sources/TBF/Results/Entities/WaterMeterData.cs new file mode 100644 index 00000000..c70578b7 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Entities/WaterMeterData.cs @@ -0,0 +1,138 @@ +/// +/// Copyright (c) 2015-2017 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Results.Entities +{ + public class WaterMeterData + { + public virtual int Id { get; protected set; } + + public virtual string ProductName { get; set; } + public virtual string Producer { get; set; } + + public virtual double DN { get; set; } /// [mm] + public virtual double L { get; set; } /// [mm] + public virtual Config.Entities.Mounting Mounting { get; set; } /// H / V / S / F + + public virtual bool NewQnames { get; set; } /// Yes = Q3... No = Qn... + public virtual double Q4_Qmax { get; set; } /// [m3/h] + public virtual double Q3_Qn { get; set; } /// [m3/h] + public virtual double Q2_Qt { get; set; } /// [m3/h] + public virtual double Q1_Qmin { get; set; } /// [m3/h] + + public virtual string MetrologicalClass { get; set; } + public virtual Config.Entities.TemperatureClass TemperatureClass { get; set; } + public virtual Config.Entities.PressureLossClass PressureLossClass { get; set; } + public virtual Config.Entities.MaxAdmissiblePressure MaxAdmissiblePressure { get; set; } + public virtual Config.Entities.FlowProfileSensitivityClass FlowProfileSensitivityClass { get; set; } + + public virtual string ApprovalInfo { get; set; } + public virtual string Certificate { get; set; } + + public virtual double PulsesPerLtr { get; set; } + + /// Concerns compound water meters + public virtual string ProducerAux { get; set; } + public virtual double Q3_Qn_Aux { get; set; } /// [m3/h] + public virtual string MetrologicalClassAux { get; set; } + public virtual string ApprovalInfoAux { get; set; } + + public virtual Config.Entities.Medium Medium { get; set; } + + public virtual string Text1 { get; set; } + public virtual string Text2 { get; set; } + public virtual string Text3 { get; set; } + public virtual string Text4 { get; set; } + public virtual string Text5 { get; set; } + + public virtual bool Compound { get; set; } + public virtual bool HeatMeter { get; set; } + +#if ORACLE_DB + public virtual int WMTypeId { get; set; } + public virtual int WMTypeRev { get; set; } +#endif + + public WaterMeterData() + { + } + + + /// + /// Method to compare the content of two entities + /// + /// Second entity to compare with + /// first = two entities are equal (except of Id) + public virtual bool Equals(WaterMeterData wmd) + { + if (!ProductName.Equals(wmd.ProductName)) return false; + if (!Producer.Equals(wmd.Producer)) return false; + + if (DN != wmd.DN) return false; + if (L != wmd.L) return false; + if (Mounting != wmd.Mounting) return false; + + if (NewQnames != wmd.NewQnames) return false; + if (Q4_Qmax != wmd.Q4_Qmax) return false; + if (Q3_Qn != wmd.Q3_Qn) return false; + if (Q2_Qt != wmd.Q2_Qt) return false; + if (Q1_Qmin != wmd.Q1_Qmin) return false; + + if (!MetrologicalClass.Equals(wmd.MetrologicalClass)) return false; + if (!TemperatureClass.Equals(wmd.TemperatureClass)) return false; + if (!PressureLossClass.Equals(wmd.PressureLossClass)) return false; + if (!MaxAdmissiblePressure.Equals(wmd.MaxAdmissiblePressure)) return false; + if (!FlowProfileSensitivityClass.Equals(wmd.FlowProfileSensitivityClass)) return false; + + if (!ApprovalInfo.Equals(wmd.ApprovalInfo)) return false; + if (Certificate != wmd.Certificate) return false; + + if (PulsesPerLtr != wmd.PulsesPerLtr) return false; + + if (ProducerAux != wmd.ProducerAux) return false; + if (Q3_Qn_Aux != wmd.Q3_Qn_Aux) return false; + if (MetrologicalClassAux != wmd.MetrologicalClassAux) return false; + if (ApprovalInfoAux != wmd.ApprovalInfoAux) return false; + + if (Medium != wmd.Medium) return false; + + if (Text1 != wmd.Text1) return false; + if (Text2 != wmd.Text2) return false; + if (Text3 != wmd.Text3) return false; + if (Text4 != wmd.Text4) return false; + if (Text5 != wmd.Text5) return false; + + if (Compound != wmd.Compound) return false; + if (HeatMeter != wmd.HeatMeter) return false; + +#if ORACLE_DB + if (WMTypeId != wmd.WMTypeId) return false; + if (WMTypeRev != wmd.WMTypeRev) return false; +#endif + return true; + } + + + /// + /// Adds an item to the list if it does not occur there + /// + /// List of items + /// Item to add to the list or find there + /// Item from the list (existing or added) + public static WaterMeterData UpdateList(IList list, WaterMeterData item) + { + if (item == null) return null; /// Null item is not stored in the list + + WaterMeterData found = list.FirstOrDefault(x => x.Equals(item)); + + if (found != null) return found; /// The same item found in the list, The found item returned + + list.Add(item); /// Item not fund in the list, it is added to the list + return item; + } + } +} diff --git a/TBF_V2/Sources/TBF/Results/Forms/BatchResultsDlg.Designer.cs b/TBF_V2/Sources/TBF/Results/Forms/BatchResultsDlg.Designer.cs new file mode 100644 index 00000000..2d53950a --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Forms/BatchResultsDlg.Designer.cs @@ -0,0 +1,63 @@ +namespace Results.Forms +{ + partial class BatchResultsDlg + { + /// + /// 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() + { + this.flowLayoutPanel = new System.Windows.Forms.FlowLayoutPanel(); + this.SuspendLayout(); + // + // flowLayoutPanel + // + this.flowLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.flowLayoutPanel.Location = new System.Drawing.Point(0, 0); + this.flowLayoutPanel.Name = "flowLayoutPanel"; + this.flowLayoutPanel.Size = new System.Drawing.Size(1058, 721); + this.flowLayoutPanel.TabIndex = 0; + this.flowLayoutPanel.SizeChanged += new System.EventHandler(this.flowLayoutPanel_SizeChanged); + // + // BatchResultsDlg + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1058, 721); + this.Controls.Add(this.flowLayoutPanel); + this.Name = "BatchResultsDlg"; + this.Text = "Results"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.BatchResultsDlg_FormClosing); + this.Load += new System.EventHandler(this.BatchResultsDlg_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel; + + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Results/Forms/BatchResultsDlg.cs b/TBF_V2/Sources/TBF/Results/Forms/BatchResultsDlg.cs new file mode 100644 index 00000000..c7160a1d --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Forms/BatchResultsDlg.cs @@ -0,0 +1,376 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using Results.Resources; + +namespace Results.Forms +{ + public partial class BatchResultsDlg : Form + { + static readonly ILog log = LogManager.GetLogger(typeof(BatchResultsDlg)); + + DateTime lastRedraw; + DateTime lastSizeChange; + bool loaded; + + /// + /// Public members + /// + public MetersArrangement MetersArrangement; + public TestsArrangement TestsArrangement; + public int NrMetersInOneGroup; + + public IList RsltItems_Screen_SingleWM; + public IList RsltItems_Screen_CombinedWM; + public IList RsltItems_Screen_HeatM; + public int[] RsltsClmnWidths { set { rsltsClmnWidths = value; } } + + public int PopupResultsLeft; + public int PopupResultsTop; + public int PopupResultsWidth; + public int PopupResultsHeight; + + public Results.BatchResults Results { set { Display(value); } } + + /// + /// Private members + /// + Results.BatchResults results; + MetersKind metersKind; + + ListView firstListView; + public int[] rsltsClmnWidths; + int rsltsClmnCount { get { return (rsltsClmnWidths != null) ? rsltsClmnWidths.Length : 0; } } + + int lvWidth; + int lvHeight; + + + Timer timer; + + + public BatchResultsDlg() + { + InitializeComponent(); + Text = Strings.Results; + + lastSizeChange = DateTime.Now; + + // Create a timer with a ten second interval. + timer = new Timer(); + timer.Interval = 500; /// ms + timer.Tick += new EventHandler(OnTimer); + timer.Start(); + } + + private void BatchResultsDlg_Load(object sender, EventArgs e) + { + if (PopupResultsLeft != 0) Left = PopupResultsLeft; + if (PopupResultsTop != 0) Top = PopupResultsTop; + if (PopupResultsWidth != 0) Width = PopupResultsWidth; + if (PopupResultsHeight != 0) Height = PopupResultsHeight; + + loaded = true; + if (results != null) Redraw(); + } + + public void Display(Results.BatchResults results) + { + this.results = results; + if (loaded) Redraw(); + } + + + IList GetRsltItems(MetersKind metersKind) + { + IList srcItems; + switch (metersKind) + { + default: + case MetersKind.Single: srcItems = RsltItems_Screen_SingleWM; break; + case MetersKind.Combined: srcItems = RsltItems_Screen_CombinedWM; break; + case MetersKind.HeatMeter: srcItems = RsltItems_Screen_HeatM; break; + } + + IList copiedItems = new List(); + foreach (var it in srcItems) copiedItems.Add(it.Clone()); + return copiedItems; + } + + + /// + /// Re-draw the results. Apply new settings if they changed. + /// + public void Redraw() + { + lastRedraw = DateTime.Now; + + this.SuspendLayout(); + + try + { + /// Determine how many water meters were enabled for result evaluation and printing + int enabledWMsCount = 0; + for (int i = 0; i < results.WMPositionsCount; i++) + { + if (results.WaterMeters[i] != null && !results.WaterMeters[i].Disabled) + { + enabledWMsCount++; + } + } + + int metersInOneGroup = Math.Max(1, Math.Min(enabledWMsCount, NrMetersInOneGroup)); + int nrGroups = Math.Max(1, (enabledWMsCount + metersInOneGroup - 1) / metersInOneGroup); + + if (MetersArrangement == MetersArrangement.Horizontally) + { + flowLayoutPanel.FlowDirection = FlowDirection.LeftToRight; + lvWidth = flowLayoutPanel.Width / metersInOneGroup - 6; + lvHeight = flowLayoutPanel.Height / nrGroups - 6; + } + else + { + flowLayoutPanel.FlowDirection = FlowDirection.TopDown; + lvWidth = flowLayoutPanel.Width / nrGroups - 6; + lvHeight = flowLayoutPanel.Height / metersInOneGroup - 6; + } + flowLayoutPanel.Controls.Clear(); + flowLayoutPanel.WrapContents = true; + flowLayoutPanel.AutoScroll = true; + + bool first = true; + for (int i = 0; i < results.WMPositionsCount; i++) + { + if (results.WaterMeters[i] != null && !results.WaterMeters[i].Disabled) + { + ListView lview = (TestsArrangement == TestsArrangement.Rows) + ? GetResultsTestsAreRows(results.WaterMeters[i], i + 1) + : GetResultsTestsAreColumns(results.WaterMeters[i], i + 1); + if (lview != null) + { + flowLayoutPanel.Controls.Add(lview); + if (first) + { + firstListView = lview; + first = false; + } + } + } + } + } + catch (Exception e) + { + log.FatalFormat("Redrawing results failed : {0}", e.Message); + if (e.InnerException != null) + { + log.FatalFormat("InnerMessage : {0}", e.InnerException.Message); + } + log.FatalFormat("StackTrace : {0}{1}", Environment.NewLine, e.StackTrace); + } + + this.ResumeLayout(false); + } + + /// + /// Get an empty ListView control with appropriate parameters. + /// + /// ListView control + ListView GetListView() + { + ListView lview = new ListView(); + lview.AllowColumnReorder = false; + lview.Dock = System.Windows.Forms.DockStyle.None; + lview.FullRowSelect = true; + lview.GridLines = true; + lview.Location = new System.Drawing.Point(0, 0); + lview.Size = new System.Drawing.Size(lvWidth, lvHeight); + lview.TabIndex = 0; + lview.UseCompatibleStateImageBehavior = false; + lview.View = System.Windows.Forms.View.Details; + return lview; + } + + + /// + /// Get decorated test names for a specified watermeter + /// + /// Watermeter results entity + /// A list of strings + IList GetAllDecoratedTestNames(Results.Entities.WaterMeter wMtr) + { + IList testNames = new List(); + + foreach (var mtr in wMtr.MeterTestRslts) + { + if (mtr.IsPilotRslt() && mtr.TestDone && (mtr.Publish() != Config.Entities.Publish.Never) + && (mtr.Publish() != Config.Entities.Publish.Internal)) + { + testNames.Add(mtr.Name()); + } + } + + return testNames; + } + + + /// + /// Get a ListView control filled with results of the meter 'mtr' + /// + /// Water meter number (1-based): 1 .. Config.Data.WMsCount + /// ListView object + ListView GetResultsTestsAreRows(Results.Entities.WaterMeter wMtr, int printedWMNr) + { + metersKind = wMtr.Compound() ? MetersKind.Combined : (wMtr.HeatMeter() ? MetersKind.HeatMeter : MetersKind.Single); + + ListView lview = GetListView(); + + IList items = GetRsltItems(metersKind); + + if (items == null || items.Count == 0) return lview; + + // Header + lview.Columns.Add(printedWMNr.ToString(), (rsltsClmnCount > 0) ? rsltsClmnWidths[0] : 40); + int col = 1; + foreach (var item in items) + { + lview.Columns.Add(item.Caption, (rsltsClmnCount > col) ? rsltsClmnWidths[col] : 70); + col++; + } + + + IList testNames = GetAllDecoratedTestNames(wMtr); + int ix = 0; + foreach (var mtr in wMtr.MeterTestRslts) + { + if (mtr != null && mtr.IsPilotRslt() && mtr.TestDone && mtr.Publish() != Config.Entities.Publish.Never + && mtr.Publish() != Config.Entities.Publish.Internal) + { + ListViewItem lvi = new ListViewItem(testNames[ix++]); + + for (int i = 0; i < items.Count; i++) + { + string str = items[i].Print(wMtr, mtr.Name()); + + /// Extract and use color information + string[] texts = str.Split(new char[] { '|' }); + if (texts.Length == 1) + { + lvi.SubItems.Add(str); + } + else if (texts.Length == 2) + { + Color color = texts[1].Equals("Green") ? Color.Green : (texts[1].Equals("Red") ? Color.Red : Color.White); + lvi.UseItemStyleForSubItems = false; + lvi.SubItems.Add(texts[0]); + lvi.SubItems[lvi.SubItems.Count - 1].BackColor = color; + } + else + { + lvi.SubItems.Add(string.Empty); + } + } + + lview.Items.Add(lvi); + } + } + + return lview; + } + + + /// + /// Get a ListView control filled with results of the meter 'mtr' + /// + /// Water meter number (1-based): 1 .. Config.Data.WMsCount + /// ListView object + ListView GetResultsTestsAreColumns(Results.Entities.WaterMeter wMtr, int printedWMNr) + { + metersKind = wMtr.Compound() ? MetersKind.Combined : (wMtr.HeatMeter() ? MetersKind.HeatMeter : MetersKind.Single); + + ListView lview = GetListView(); + + IList items = GetRsltItems(metersKind); + + if (items == null || items.Count == 0) return lview; + + // Header + lview.Columns.Add(printedWMNr.ToString(), (rsltsClmnCount > 0) ? rsltsClmnWidths[0] : 40); + int i = 1; + foreach (var str in GetAllDecoratedTestNames(wMtr)) + { + lview.Columns.Add(str, (rsltsClmnCount > i) ? rsltsClmnWidths[i] : 70); + i++; + } + + foreach (var item in items) + { + ListViewItem lvi = new ListViewItem(item.Caption); + + foreach (var mtr in wMtr.MeterTestRslts) + { + if (mtr != null && mtr.IsPilotRslt() && mtr.TestDone && mtr.Publish() != Config.Entities.Publish.Never && + mtr.Publish() != Config.Entities.Publish.Internal) + { + string str = item.Print(wMtr, mtr.Name()); + + string[] texts = str.Split(new char[] { '|' }); + if (texts.Length == 1) + { + lvi.SubItems.Add(str); + } + else if (texts.Length == 2) + { + Color color = texts[1].Equals("Green") ? Color.Green : (texts[1].Equals("Red") ? Color.Red : Color.White); + lvi.UseItemStyleForSubItems = false; + lvi.SubItems.Add(texts[0]); + lvi.SubItems[lvi.SubItems.Count - 1].BackColor = color; + } + else + { + lvi.SubItems.Add(string.Empty); + } + } + } + + lview.Items.Add(lvi); + } + + return lview; + } + + private void BatchResultsDlg_FormClosing(object sender, FormClosingEventArgs e) + { + PopupResultsLeft = Left; + PopupResultsTop = Top; + PopupResultsWidth = Width; + PopupResultsHeight = Height; + } + + private void flowLayoutPanel_SizeChanged(object sender, EventArgs e) + { + lastSizeChange = DateTime.Now; + } + + private void OnTimer(object source, EventArgs e) + { + if (DateTime.Compare(lastSizeChange, lastRedraw) > 0) + { + /// The last size change was later then the last redraw + + DateTime now = DateTime.Now; + if (DateTime.Compare(lastSizeChange + new TimeSpan(0, 0, 1), now) < 0) + { + /// More then 1s since the last size change + Redraw(); + } + } + } + } +} diff --git a/TBF_V2/Sources/TBF/Results/Forms/BatchResultsDlg.resx b/TBF_V2/Sources/TBF/Results/Forms/BatchResultsDlg.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Forms/BatchResultsDlg.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Results/Forms/ListViewEx.cs b/TBF_V2/Sources/TBF/Results/Forms/ListViewEx.cs new file mode 100644 index 00000000..cd28a214 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Forms/ListViewEx.cs @@ -0,0 +1,486 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Windows.Forms; +using System.Runtime.InteropServices; + +namespace Results.Forms +{ + /// + /// Event Handler for SubItem events + /// + public delegate void SubItemEventHandler(object sender, SubItemEventArgs e); + /// + /// Event Handler for SubItemEndEditing events + /// + public delegate void SubItemEndEditingEventHandler(object sender, SubItemEndEditingEventArgs e); + + + /// + /// Inherited ListView to allow in-place editing of subitems + /// + public class ListViewEx : System.Windows.Forms.ListView + { + #region Interop structs, imports and constants + /// + /// MessageHeader for WM_NOTIFY + /// + private struct NMHDR + { +#pragma warning disable + public IntPtr hwndFrom; + public Int32 idFrom; + public Int32 code; +#pragma warning restore + } + + + [DllImport("user32.dll")] + private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wPar, IntPtr lPar); + [DllImport("user32.dll", CharSet=CharSet.Ansi)] + private static extern IntPtr SendMessage(IntPtr hWnd, int msg, int len, ref int [] order); + + // ListView messages + private const int LVM_FIRST = 0x1000; + private const int LVM_GETCOLUMNORDERARRAY = (LVM_FIRST + 59); + + // Windows Messages that will abort editing + private const int WM_HSCROLL = 0x114; + private const int WM_VSCROLL = 0x115; + private const int WM_SIZE = 0x05; + private const int WM_NOTIFY = 0x4E; + + private const int HDN_FIRST = -300; + private const int HDN_BEGINDRAG = (HDN_FIRST-10); + private const int HDN_ITEMCHANGINGA = (HDN_FIRST-0); + private const int HDN_ITEMCHANGINGW = (HDN_FIRST-20); + #endregion + + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + public event SubItemEventHandler SubItemClicked; + public event SubItemEventHandler SubItemRightClicked; + public event SubItemEventHandler SubItemBeginEditing; + public event SubItemEndEditingEventHandler SubItemEndEditing; + + public ListViewEx() + { + // This call is required by the Windows.Forms Form Designer. + InitializeComponent(); + + base.FullRowSelect = true; + base.View = View.Details; + base.AllowColumnReorder = true; + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if( components != null ) + components.Dispose(); + } + base.Dispose( disposing ); + } + + #region Component Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + #endregion + + private bool _doubleClickActivation = false; + /// + /// Is a double click required to start editing a cell? + /// + public bool DoubleClickActivation + { + get { return _doubleClickActivation; } + set { _doubleClickActivation = value; } + } + + + /// + /// Retrieve the order in which columns appear + /// + /// Current display order of column indices + public int[] GetColumnOrder() + { + IntPtr lPar = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(int)) * Columns.Count); + + IntPtr res = SendMessage(Handle, LVM_GETCOLUMNORDERARRAY, new IntPtr(Columns.Count), lPar); + if (res.ToInt32() == 0) // Something went wrong + { + Marshal.FreeHGlobal(lPar); + return null; + } + + int [] order = new int[Columns.Count]; + Marshal.Copy(lPar, order, 0, Columns.Count); + + Marshal.FreeHGlobal(lPar); + + return order; + } + + + /// + /// Find ListViewItem and SubItem Index at position (x,y) + /// + /// relative to ListView + /// relative to ListView + /// Item at position (x,y) + /// SubItem index + public int GetSubItemAt(int x, int y, out ListViewItem item) + { + item = this.GetItemAt(x, y); + + if (item != null) + { + int[] order = GetColumnOrder(); + Rectangle lviBounds; + int subItemX; + + lviBounds = item.GetBounds(ItemBoundsPortion.Entire); + subItemX = lviBounds.Left; + for (int i=0; i + /// Get bounds for a SubItem + /// + /// Target ListViewItem + /// Target SubItem index + /// Bounds of SubItem (relative to ListView) + public Rectangle GetSubItemBounds(ListViewItem Item, int SubItem) + { + int[] order = GetColumnOrder(); + + Rectangle subItemRect = Rectangle.Empty; + if (SubItem >= order.Length) + throw new IndexOutOfRangeException("SubItem "+SubItem+" out of range"); + + if (Item == null) + throw new ArgumentNullException("Item"); + + Rectangle lviBounds = Item.GetBounds(ItemBoundsPortion.Entire); + int subItemX = lviBounds.Left; + + ColumnHeader col; + int i; + for (i=0; i + /// Fire SubItemClicked + /// + ///Point of click/doubleclick + private void EditSubitemAt(Point p) + { + ListViewItem item; + int idx = GetSubItemAt(p.X, p.Y, out item); + if (idx >= 0) + { + OnSubItemClicked(new SubItemEventArgs(item, idx)); + } + } + + /// + /// Fire SubItemRightClicked + /// + ///Point of click/doubleclick + private void RightClickFunctionSubitemAt(Point p) + { + ListViewItem item; + int idx = GetSubItemAt(p.X, p.Y, out item); + if (idx >= 0) + { + OnSubItemRightClicked(new SubItemEventArgs(item, idx)); + } + } + + #endregion + + #region In-place editing functions + // The control performing the actual editing + private Control _editingControl; + // The LVI being edited + private ListViewItem _editItem; + // The SubItem being edited + private int _editSubItem; + + protected void OnSubItemBeginEditing(SubItemEventArgs e) + { + if (SubItemBeginEditing != null) SubItemBeginEditing(this, e); + } + + protected void OnSubItemEndEditing(SubItemEndEditingEventArgs e) + { + if (SubItemEndEditing != null) SubItemEndEditing(this, e); + } + + protected void OnSubItemClicked(SubItemEventArgs e) + { + if (SubItemClicked != null) SubItemClicked(this, e); + } + + protected void OnSubItemRightClicked(SubItemEventArgs e) + { + if (SubItemRightClicked != null) SubItemRightClicked(this, e); + } + + + /// + /// Begin in-place editing of given cell + /// + /// Control used as cell editor + /// ListViewItem to edit + /// SubItem index to edit + public void StartEditing(Control c, ListViewItem Item, int SubItem) + { + OnSubItemBeginEditing(new SubItemEventArgs(Item, SubItem)); + + Rectangle rcSubItem = GetSubItemBounds(Item, SubItem); + + if (rcSubItem.X < 0) + { + // Left edge of SubItem not visible - adjust rectangle position and width + rcSubItem.Width += rcSubItem.X; + rcSubItem.X=0; + } + if (rcSubItem.X+rcSubItem.Width > this.Width) + { + // Right edge of SubItem not visible - adjust rectangle width + rcSubItem.Width = this.Width-rcSubItem.Left; + } + + // Subitem bounds are relative to the location of the ListView! + rcSubItem.Offset(Left, Top); + + // In case the editing control and the listview are on different parents, + // account for different origins + Point origin = new Point(0,0); + Point lvOrigin = this.Parent.PointToScreen(origin); + Point ctlOrigin = c.Parent.PointToScreen(origin); + + rcSubItem.Offset(lvOrigin.X-ctlOrigin.X, lvOrigin.Y-ctlOrigin.Y); + + // Position and show editor + c.Bounds = rcSubItem; + c.Text = Item.SubItems[SubItem].Text; + c.Visible = true; + c.BringToFront(); + c.Focus(); + + _editingControl = c; + _editingControl.Leave += new EventHandler(_editControl_Leave); + _editingControl.KeyPress += new KeyPressEventHandler(_editControl_KeyPress); + + _editItem = Item; + _editSubItem = SubItem; + } + + + private void _editControl_Leave(object sender, EventArgs e) + { + // cell editor losing focus + EndEditing(true); + } + + private void _editControl_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) + { + switch (e.KeyChar) + { + case (char)(int)Keys.Escape: + { + EndEditing(false); + break; + } + + case (char)(int)Keys.Enter: + { + EndEditing(true); + break; + } + } + } + + /// + /// Accept or discard current value of cell editor control + /// + /// Use the _editingControl's Text as new SubItem text or discard changes? + public void EndEditing(bool AcceptChanges) + { + if (_editingControl == null) + return; + + SubItemEndEditingEventArgs e = new SubItemEndEditingEventArgs( + _editItem, // The item being edited + _editSubItem, // The subitem index being edited + AcceptChanges ? + _editingControl.Text : // Use editControl text if changes are accepted + _editItem.SubItems[_editSubItem].Text, // or the original subitem's text, if changes are discarded + !AcceptChanges // Cancel? + ); + + OnSubItemEndEditing(e); + + _editItem.SubItems[_editSubItem].Text = e.DisplayText; + + _editingControl.Leave -= new EventHandler(_editControl_Leave); + _editingControl.KeyPress -= new KeyPressEventHandler(_editControl_KeyPress); + + _editingControl.Visible = false; + + _editingControl = null; + _editItem = null; + _editSubItem = -1; + } + #endregion + } + + + /// + /// Event Args for SubItemClicked event + /// + public class SubItemEventArgs : EventArgs + { + int subItem = -1; /// Sub-item index + ListViewItem item = null; + + public int SubItem { get { return subItem; } } + public ListViewItem Item { get { return item; } } + + public SubItemEventArgs(ListViewItem item, int subItem) + { + this.subItem = subItem; + this.item = item; + } + } + + + /// + /// Event Args for SubItemEndEditingClicked event + /// + public class SubItemEndEditingEventArgs : SubItemEventArgs + { + string displayText = string.Empty; + bool cancel = true; + + public SubItemEndEditingEventArgs(ListViewItem item, int subItem, string displayText, bool cancel) : + base(item, subItem) + { + this.displayText = displayText; + this.cancel = cancel; + } + public string DisplayText + { + get { return displayText; } + set { displayText = value; } + } + public bool Cancel + { + get { return cancel; } + set { cancel = value; } + } + } +} diff --git a/TBF_V2/Sources/TBF/Results/Forms/ListViewEx.resx b/TBF_V2/Sources/TBF/Results/Forms/ListViewEx.resx new file mode 100644 index 00000000..7e323966 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Forms/ListViewEx.resx @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.0.0.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3102.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3102.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + diff --git a/TBF_V2/Sources/TBF/Results/Forms/ResultsConfigCtrl.Designer.cs b/TBF_V2/Sources/TBF/Results/Forms/ResultsConfigCtrl.Designer.cs new file mode 100644 index 00000000..e14460d7 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Forms/ResultsConfigCtrl.Designer.cs @@ -0,0 +1,258 @@ +namespace Results.Forms +{ + partial class ResultsConfigCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.availableTabControl = new System.Windows.Forms.TabControl(); + this.tabPage1 = new System.Windows.Forms.TabPage(); + this.availableByQuantityTreeView = new System.Windows.Forms.TreeView(); + this.tabPage2 = new System.Windows.Forms.TabPage(); + this.availableByCategoryTreeView = new System.Windows.Forms.TreeView(); + this.tabPage3 = new System.Windows.Forms.TabPage(); + this.availableAlphabeticTreeView = new System.Windows.Forms.TreeView(); + this.downButton = new System.Windows.Forms.Button(); + this.upButton = new System.Windows.Forms.Button(); + this.selectedResultsListViewEx = new Results.Forms.ListViewEx(); + this.removeAllButton = new System.Windows.Forms.Button(); + this.removeButton = new System.Windows.Forms.Button(); + this.addButton = new System.Windows.Forms.Button(); + this.selectedResultsLabel = new System.Windows.Forms.Label(); + this.availableResultsLabel = new System.Windows.Forms.Label(); + this.availableTabControl.SuspendLayout(); + this.tabPage1.SuspendLayout(); + this.tabPage2.SuspendLayout(); + this.tabPage3.SuspendLayout(); + this.SuspendLayout(); + // + // availableTabControl + // + this.availableTabControl.Controls.Add(this.tabPage1); + this.availableTabControl.Controls.Add(this.tabPage2); + this.availableTabControl.Controls.Add(this.tabPage3); + this.availableTabControl.Enabled = false; + this.availableTabControl.Location = new System.Drawing.Point(9, 33); + this.availableTabControl.Name = "availableTabControl"; + this.availableTabControl.SelectedIndex = 0; + this.availableTabControl.Size = new System.Drawing.Size(206, 453); + this.availableTabControl.TabIndex = 59; + // + // tabPage1 + // + this.tabPage1.Controls.Add(this.availableByQuantityTreeView); + this.tabPage1.Location = new System.Drawing.Point(4, 22); + this.tabPage1.Name = "tabPage1"; + this.tabPage1.Padding = new System.Windows.Forms.Padding(3); + this.tabPage1.Size = new System.Drawing.Size(198, 427); + this.tabPage1.TabIndex = 0; + this.tabPage1.Text = "A...Z"; + this.tabPage1.UseVisualStyleBackColor = true; + // + // availableByQuantityTreeView + // + this.availableByQuantityTreeView.Dock = System.Windows.Forms.DockStyle.Fill; + this.availableByQuantityTreeView.Location = new System.Drawing.Point(3, 3); + this.availableByQuantityTreeView.Name = "availableByQuantityTreeView"; + this.availableByQuantityTreeView.Size = new System.Drawing.Size(192, 421); + this.availableByQuantityTreeView.TabIndex = 0; + this.availableByQuantityTreeView.DoubleClick += new System.EventHandler(this.availableByQuantityTreeView_DoubleClick); + // + // tabPage2 + // + this.tabPage2.Controls.Add(this.availableByCategoryTreeView); + this.tabPage2.Location = new System.Drawing.Point(4, 22); + this.tabPage2.Name = "tabPage2"; + this.tabPage2.Padding = new System.Windows.Forms.Padding(3); + this.tabPage2.Size = new System.Drawing.Size(198, 427); + this.tabPage2.TabIndex = 1; + this.tabPage2.Text = "by quantity"; + this.tabPage2.UseVisualStyleBackColor = true; + // + // availableByCategoryTreeView + // + this.availableByCategoryTreeView.Dock = System.Windows.Forms.DockStyle.Fill; + this.availableByCategoryTreeView.Location = new System.Drawing.Point(3, 3); + this.availableByCategoryTreeView.Name = "availableByCategoryTreeView"; + this.availableByCategoryTreeView.Size = new System.Drawing.Size(192, 421); + this.availableByCategoryTreeView.TabIndex = 0; + this.availableByCategoryTreeView.DoubleClick += new System.EventHandler(this.availableByCategoryTreeView_DoubleClick); + // + // tabPage3 + // + this.tabPage3.Controls.Add(this.availableAlphabeticTreeView); + this.tabPage3.Location = new System.Drawing.Point(4, 22); + this.tabPage3.Name = "tabPage3"; + this.tabPage3.Size = new System.Drawing.Size(198, 427); + this.tabPage3.TabIndex = 2; + this.tabPage3.Text = "by category"; + this.tabPage3.UseVisualStyleBackColor = true; + // + // availableAlphabeticTreeView + // + this.availableAlphabeticTreeView.Dock = System.Windows.Forms.DockStyle.Fill; + this.availableAlphabeticTreeView.Location = new System.Drawing.Point(0, 0); + this.availableAlphabeticTreeView.Name = "availableAlphabeticTreeView"; + this.availableAlphabeticTreeView.Size = new System.Drawing.Size(198, 427); + this.availableAlphabeticTreeView.TabIndex = 0; + this.availableAlphabeticTreeView.DoubleClick += new System.EventHandler(this.availableAlphabeticTreeView_DoubleClick); + // + // downButton + // + this.downButton.Enabled = false; + this.downButton.Location = new System.Drawing.Point(221, 351); + this.downButton.Name = "downButton"; + this.downButton.Size = new System.Drawing.Size(93, 30); + this.downButton.TabIndex = 58; + this.downButton.Text = "Down"; + this.downButton.UseVisualStyleBackColor = true; + this.downButton.Click += new System.EventHandler(this.downButton_Click); + // + // upButton + // + this.upButton.Enabled = false; + this.upButton.Location = new System.Drawing.Point(221, 315); + this.upButton.Name = "upButton"; + this.upButton.Size = new System.Drawing.Size(93, 30); + this.upButton.TabIndex = 57; + this.upButton.Text = "Up"; + this.upButton.UseVisualStyleBackColor = true; + this.upButton.Click += new System.EventHandler(this.upButton_Click); + // + // selectedResultsListViewEx + // + this.selectedResultsListViewEx.AllowColumnReorder = true; + this.selectedResultsListViewEx.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.selectedResultsListViewEx.DoubleClickActivation = false; + this.selectedResultsListViewEx.Enabled = false; + this.selectedResultsListViewEx.FullRowSelect = true; + this.selectedResultsListViewEx.GridLines = true; + this.selectedResultsListViewEx.Location = new System.Drawing.Point(322, 33); + this.selectedResultsListViewEx.Name = "selectedResultsListViewEx"; + this.selectedResultsListViewEx.Size = new System.Drawing.Size(594, 453); + this.selectedResultsListViewEx.TabIndex = 56; + this.selectedResultsListViewEx.UseCompatibleStateImageBehavior = false; + this.selectedResultsListViewEx.View = System.Windows.Forms.View.Details; + this.selectedResultsListViewEx.DoubleClick += new System.EventHandler(this.selectedResultsListViewEx_DoubleClick); + // + // removeAllButton + // + this.removeAllButton.Enabled = false; + this.removeAllButton.Location = new System.Drawing.Point(221, 223); + this.removeAllButton.Name = "removeAllButton"; + this.removeAllButton.Size = new System.Drawing.Size(94, 30); + this.removeAllButton.TabIndex = 55; + this.removeAllButton.Text = "<< R&emove all"; + this.removeAllButton.UseVisualStyleBackColor = true; + this.removeAllButton.Visible = false; + this.removeAllButton.Click += new System.EventHandler(this.removeAllButton_Click); + // + // removeButton + // + this.removeButton.Enabled = false; + this.removeButton.Location = new System.Drawing.Point(221, 188); + this.removeButton.Name = "removeButton"; + this.removeButton.Size = new System.Drawing.Size(93, 30); + this.removeButton.TabIndex = 54; + this.removeButton.Text = "< &Remove"; + this.removeButton.UseVisualStyleBackColor = true; + this.removeButton.Click += new System.EventHandler(this.removeButton_Click); + // + // addButton + // + this.addButton.Enabled = false; + this.addButton.Location = new System.Drawing.Point(221, 153); + this.addButton.Name = "addButton"; + this.addButton.Size = new System.Drawing.Size(93, 30); + this.addButton.TabIndex = 53; + this.addButton.Text = "&Add >"; + this.addButton.UseVisualStyleBackColor = true; + this.addButton.Click += new System.EventHandler(this.addButton_Click); + // + // selectedResultsLabel + // + this.selectedResultsLabel.AutoSize = true; + this.selectedResultsLabel.Location = new System.Drawing.Point(321, 11); + this.selectedResultsLabel.Name = "selectedResultsLabel"; + this.selectedResultsLabel.Size = new System.Drawing.Size(85, 13); + this.selectedResultsLabel.TabIndex = 52; + this.selectedResultsLabel.Text = "Selected results:"; + // + // availableResultsLabel + // + this.availableResultsLabel.AutoSize = true; + this.availableResultsLabel.Location = new System.Drawing.Point(11, 11); + this.availableResultsLabel.Name = "availableResultsLabel"; + this.availableResultsLabel.Size = new System.Drawing.Size(86, 13); + this.availableResultsLabel.TabIndex = 51; + this.availableResultsLabel.Text = "Available results:"; + // + // ResultsConfigCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.availableTabControl); + this.Controls.Add(this.downButton); + this.Controls.Add(this.upButton); + this.Controls.Add(this.selectedResultsListViewEx); + this.Controls.Add(this.removeAllButton); + this.Controls.Add(this.removeButton); + this.Controls.Add(this.addButton); + this.Controls.Add(this.selectedResultsLabel); + this.Controls.Add(this.availableResultsLabel); + this.Name = "ResultsConfigCtrl"; + this.Size = new System.Drawing.Size(925, 496); + this.Load += new System.EventHandler(this.ResultsConfigCtrl_Load); + this.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.ResultsConfigCtrl_KeyPress); + this.availableTabControl.ResumeLayout(false); + this.tabPage1.ResumeLayout(false); + this.tabPage2.ResumeLayout(false); + this.tabPage3.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TabControl availableTabControl; + private System.Windows.Forms.TabPage tabPage1; + private System.Windows.Forms.TreeView availableByQuantityTreeView; + private System.Windows.Forms.TabPage tabPage2; + private System.Windows.Forms.TreeView availableByCategoryTreeView; + private System.Windows.Forms.TabPage tabPage3; + private System.Windows.Forms.TreeView availableAlphabeticTreeView; + private System.Windows.Forms.Button downButton; + private System.Windows.Forms.Button upButton; + private ListViewEx selectedResultsListViewEx; + private System.Windows.Forms.Button removeAllButton; + private System.Windows.Forms.Button removeButton; + private System.Windows.Forms.Button addButton; + private System.Windows.Forms.Label selectedResultsLabel; + private System.Windows.Forms.Label availableResultsLabel; + + } +} diff --git a/TBF_V2/Sources/TBF/Results/Forms/ResultsConfigCtrl.cs b/TBF_V2/Sources/TBF/Results/Forms/ResultsConfigCtrl.cs new file mode 100644 index 00000000..e943a20b --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Forms/ResultsConfigCtrl.cs @@ -0,0 +1,511 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; +using Config.Entities; +using Results.Resources; + +namespace Results.Forms +{ + public partial class ResultsConfigCtrl : UserControl + { + /// + /// ListViewEx columns + /// + enum Column + { + Item, + Caption, + Units, + Format, + Precision, + Width, + Alignment, + TestID, + Count, + } + + Control[] editors; /// all editors except of units + ComboBox unitsCB; /// units combo box + + public MetersKind MetersKind; + public IList SelectedItems; + public bool SupressTestIDColumn; + public bool Unlocked + { + set + { + availableTabControl.Enabled = value; + selectedResultsListViewEx.Enabled = value; + addButton.Enabled = value; + removeButton.Enabled = value; + removeAllButton.Enabled = value; + upButton.Enabled = value; + downButton.Enabled = value; + unlocked = value; + } + get { return unlocked; } + } + bool unlocked; + + + public ResultsConfigCtrl(bool supressTestIDColumn) + : this() + { + this.SupressTestIDColumn = supressTestIDColumn; + } + + public ResultsConfigCtrl() + { + InitializeComponent(); + } + + + void Localize() + { + Text = Strings.Configuration; + availableResultsLabel.Text = Strings.Available_results; + availableTabControl.TabPages[0].Text = Strings.Quantity; + availableTabControl.TabPages[1].Text = Strings.Category; + availableTabControl.TabPages[2].Text = "A...Z"; + + selectedResultsLabel.Text = Strings.Selected_results; + + addButton.Text = Strings.Add; + removeButton.Text = Strings.Remove; + removeAllButton.Text = Strings.Remove_all; + upButton.Text = Strings.UpBtnText; + downButton.Text = Strings.DownBtnText; + } + + private void ResultsConfigCtrl_Load(object sender, EventArgs e) + { + Localize(); + + /// Add columns to ListViewEx + selectedResultsListViewEx.Columns.Add(new ColumnHeader { Text = Strings.Item, Width = 120 }); + selectedResultsListViewEx.Columns.Add(new ColumnHeader { Text = Strings.Caption }); + selectedResultsListViewEx.Columns.Add(new ColumnHeader { Text = Strings.Units }); + selectedResultsListViewEx.Columns.Add(new ColumnHeader { Text = Strings.Format }); + selectedResultsListViewEx.Columns.Add(new ColumnHeader { Text = Strings.Precision }); + selectedResultsListViewEx.Columns.Add(new ColumnHeader { Text = Strings.Width }); + selectedResultsListViewEx.Columns.Add(new ColumnHeader { Text = Strings.Alignment }); + if (!SupressTestIDColumn) + { + selectedResultsListViewEx.Columns.Add(new ColumnHeader { Text = Strings.Test_ID }); + } + + /// Create controls used by ListViewEx to edit items + unitsCB = new ComboBox(); + + ComboBox alignmentCB = new ComboBox(); + for (Config.Entities.Alignment a = 0; a < Config.Entities.Alignment.Count; a++) + { + alignmentCB.Items.Add(a.ToDescription()); + } + + editors = new Control[] + { + null, + new TextBox(), /// caption + unitsCB, + new TextBox(), /// format + new TextBox(), /// precision + new TextBox(), /// width + alignmentCB, + new TextBox(), /// testID + }; + foreach (var edi in editors) + { + if (edi != null) + { + edi.Visible = false; + Controls.Add(edi); + } + } + + selectedResultsListViewEx.SubItemClicked += new SubItemEventHandler(selectedResultsListViewEx_SubItemClicked); + selectedResultsListViewEx.SubItemEndEditing += new SubItemEndEditingEventHandler(selectedResultsListViewEx_SubItemEndEditing); + + availableByQuantityTreeView.ShowNodeToolTips = true; + availableByCategoryTreeView.ShowNodeToolTips = true; + availableAlphabeticTreeView.ShowNodeToolTips = true; + + RedrawAvailable(); + RedrawSelected(); + } + + void selectedResultsListViewEx_SubItemClicked(object sender, SubItemEventArgs e) + { + if (e.SubItem == (int)Column.Units) + { + Config.Quantity quantity = (e.Item.Tag as WMeterRsltItemSpec).Quantity; + unitsCB.Items.Clear(); + unitsCB.Items.Add(Config.Unit.None.ToDescription()); /// "---" + for (Config.Unit u = (Config.Unit)1; u < Config.Unit.Count; u++) + { + if (Config.Units.IsQuantity(u, quantity)) unitsCB.Items.Add(u.ToDescription()); + } + selectedResultsListViewEx.StartEditing(unitsCB, e.Item, e.SubItem); + } + else if ((e.SubItem > 0) && (e.SubItem < (int)(SupressTestIDColumn ? Column.TestID : Column.Count))) + { + selectedResultsListViewEx.StartEditing(editors[e.SubItem], e.Item, e.SubItem); + } + } + + void selectedResultsListViewEx_SubItemEndEditing(object sender, SubItemEndEditingEventArgs e) + { + ListViewItem lvi = e.Item; + WMeterRsltItemSpec item = lvi.Tag as WMeterRsltItemSpec; + + switch ((Column)e.SubItem) + { + case Column.Caption: item.Caption = e.DisplayText; return; + case Column.Units: + for (Config.Unit u = 0; u < Config.Unit.Count; u++) + { + if (u.ToDescription().Equals(unitsCB.Text)) + { + item.Units = u; + return; /// OK + } + } + break; /// Error + + case Column.Format: item.Format = e.DisplayText; return; + case Column.Precision: item.Precision = e.DisplayText; return; + case Column.Width: + { + int width; + if (Int32.TryParse(editors[e.SubItem].Text, out width) && width >= 0) + { + item.Width = width; + return; /// OK + } + break; /// Error + } + + case Column.Alignment: + for (Config.Entities.Alignment a = 0; a < Config.Entities.Alignment.Count; a++) + { + if (a.ToDescription().Equals(editors[e.SubItem].Text)) + { + item.Alignment = a; + return; + } + } + break; /// Error + + case Column.TestID: item.TestID = e.DisplayText; return; + + default: + return; /// OK + } + + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + return; + } + + + /// + /// Redraw available items (right hand side) + /// + void RedrawAvailable() + { + RedrawByQuantity(availableByQuantityTreeView); + RedrawByCategory(availableByCategoryTreeView); + RedrawInAlphabeticOrder(availableAlphabeticTreeView); + } + + + void RedrawInAlphabeticOrder(TreeView treeView) + { + treeView.Nodes.Clear(); + + IList alphabeticlList = WMeterRsltItemSpec.AllItems.OrderBy(x => x.Name).ToList(); + /// + foreach (var item in alphabeticlList) + { + TreeNode node = new TreeNode(item.Name); + node.Tag = item; + node.ToolTipText = item.ToolTipText; + treeView.Nodes.Add(node); + } + } + + + void RedrawByQuantity(TreeView treeView) + { + treeView.Nodes.Clear(); + + IList quantities = new List(); + for (Config.Quantity q = 0; q < Config.Quantity.Count; q++) quantities.Add(q); + + IList sortedQuantities = quantities.OrderBy(x => x.ToDescription()).ToList(); + + foreach (var q in sortedQuantities) + { + int n = 0; + foreach (var ri in WMeterRsltItemSpec.AllItems) + { + if (ri.Quantity == q) n++; + } + + if (n > 0) + { + TreeNode[] array = new TreeNode[n]; + int i = 0; + foreach (var ri in WMeterRsltItemSpec.AllItems) + { + if (ri.Quantity == q) + { + TreeNode node = new TreeNode(ri.Name); + node.Tag = ri; + node.ToolTipText = ri.ToolTipText; + array[i++] = node; + } + } + + treeView.Nodes.Add(new TreeNode(q.ToDescription(), array)); + } + } + } + + + void RedrawByCategory(TreeView treeView) + { + treeView.Nodes.Clear(); + + IList categories = new List(); + for (ItemCategory c = 0; c < ItemCategory.Count; c++) categories.Add(c); + + IList sortedCategories = categories.OrderBy(x => x.ToDescription()).ToList(); + + foreach (var c in sortedCategories) + { + int n = 0; + foreach (var ri in WMeterRsltItemSpec.AllItems) + { + if (ri.Category == c) n++; + } + + if (n > 0) + { + TreeNode[] array = new TreeNode[n]; + int i = 0; + foreach (var ri in WMeterRsltItemSpec.AllItems) + { + if (ri.Category == c) + { + TreeNode node = new TreeNode(ri.Name); + node.Tag = ri; + node.ToolTipText = ri.ToolTipText; + array[i++] = node; + } + } + + treeView.Nodes.Add(new TreeNode(c.ToDescription(), array)); + } + } + } + + + /// + /// Redraw selected items (right hand side) + /// + void RedrawSelected() + { + selectedResultsListViewEx.Items.Clear(); + + if (SelectedItems == null) return; + + foreach (var item in SelectedItems) + { + ListViewItem lvi = new ListViewItem(item.Name); /// Item + lvi.Tag = item; + lvi.SubItems.Add(item.Caption); /// Header + lvi.SubItems.Add(item.Units.ToDescription()); /// Units + lvi.SubItems.Add(item.Format); /// Format + lvi.SubItems.Add(item.Precision); /// Precision + lvi.SubItems.Add(item.Width.ToString()); /// Width + lvi.SubItems.Add(item.Alignment.ToDescription()); /// Alignment + if (!SupressTestIDColumn) + { + lvi.SubItems.Add(item.TestID); /// TestID + } + + selectedResultsListViewEx.Items.Add(lvi); + } + } + + void UpdateSelectedFromView() + { + } + + + void addButton_Click(object sender, EventArgs e) + { + switch (availableTabControl.SelectedIndex) + { + case 0: + availableByQuantityTreeView_DoubleClick(this, null); + break; + case 1: + availableByCategoryTreeView_DoubleClick(this, null); + break; + case 2: + availableAlphabeticTreeView_DoubleClick(this, null); + break; + default: + break; + } + } + + private void availableByQuantityTreeView_DoubleClick(object sender, EventArgs e) + { + if (availableByQuantityTreeView.SelectedNode != null && + availableByQuantityTreeView.SelectedNode.Tag is WMeterRsltItemSpec) + { + AddItem(availableByQuantityTreeView.SelectedNode.Tag as WMeterRsltItemSpec); + } + } + + private void availableByCategoryTreeView_DoubleClick(object sender, EventArgs e) + { + if (availableByCategoryTreeView.SelectedNode != null && + availableByCategoryTreeView.SelectedNode.Tag is WMeterRsltItemSpec) + { + AddItem(availableByCategoryTreeView.SelectedNode.Tag as WMeterRsltItemSpec); + } + } + + private void availableAlphabeticTreeView_DoubleClick(object sender, EventArgs e) + { + if (availableAlphabeticTreeView.SelectedNode != null && + availableAlphabeticTreeView.SelectedNode.Tag is WMeterRsltItemSpec) + { + AddItem(availableAlphabeticTreeView.SelectedNode.Tag as WMeterRsltItemSpec); + } + } + + void AddItem(WMeterRsltItemSpec item) + { + WMeterRsltItemSpec newItem = item.Clone(); + newItem.Caption = newItem.Name; + SelectedItems.Add(newItem); + RedrawSelected(); + + /// Select the last item + selectedResultsListViewEx.Focus(); + selectedResultsListViewEx.Items[SelectedItems.Count - 1].Selected = true; + selectedResultsListViewEx.Items[SelectedItems.Count - 1].EnsureVisible(); + } + + + private void selectedResultsListViewEx_DoubleClick(object sender, EventArgs e) + { + /// Double click works when just one item is selected + + if (selectedResultsListViewEx.SelectedIndices.Count == 1) + { + SelectedItems.RemoveAt(selectedResultsListViewEx.SelectedIndices[0]); + RedrawAvailable(); + RedrawSelected(); + } + } + + void removeButton_Click(object sender, EventArgs e) + { + /// Remove from the list (the last selected item first so that the indexes are not affected) + + for (int i = selectedResultsListViewEx.SelectedIndices.Count - 1; i >= 0; i--) + { + SelectedItems.RemoveAt(selectedResultsListViewEx.SelectedIndices[i]); + } + RedrawAvailable(); + RedrawSelected(); + } + + void removeAllButton_Click(object sender, EventArgs e) + { + /// Remove all items from 'Selected' list + + SelectedItems.Clear(); + RedrawAvailable(); + RedrawSelected(); + } + + //void okButton_Click(object sender, EventArgs e) + //{ + // DialogResult = DialogResult.OK; + // Close(); + //} + + private void ResultsConfigCtrl_KeyPress(object sender, KeyPressEventArgs e) + { + e.Handled = true; + } + + private void upButton_Click(object sender, EventArgs e) + { + if (selectedResultsListViewEx.SelectedIndices.Count != 1) return; + + int selIdx = selectedResultsListViewEx.SelectedIndices[0]; + if (selIdx == 0) + { + /// Cannot move up + selectedResultsListViewEx.Focus(); + selectedResultsListViewEx.Items[0].Selected = true; + return; + } + + WMeterRsltItemSpec tmp = SelectedItems[selIdx - 1]; + SelectedItems[selIdx - 1] = SelectedItems[selIdx]; + SelectedItems[selIdx] = tmp; + + RedrawSelected(); + + selectedResultsListViewEx.Focus(); + selectedResultsListViewEx.Items[selIdx - 1].Selected = true; + selectedResultsListViewEx.Items[selIdx - 1].EnsureVisible(); + } + + private void downButton_Click(object sender, EventArgs e) + { + if (selectedResultsListViewEx.SelectedIndices.Count != 1) return; + + int selIdx = selectedResultsListViewEx.SelectedIndices[0]; + if (selIdx == SelectedItems.Count - 1) + { + /// Cannot move down + selectedResultsListViewEx.Focus(); + selectedResultsListViewEx.Items[SelectedItems.Count - 1].Selected = true; + return; + } + + WMeterRsltItemSpec tmp = SelectedItems[selIdx + 1]; + SelectedItems[selIdx + 1] = SelectedItems[selIdx]; + SelectedItems[selIdx] = tmp; + + RedrawSelected(); + + selectedResultsListViewEx.Focus(); + selectedResultsListViewEx.Items[selIdx + 1].Selected = true; + selectedResultsListViewEx.Items[selIdx + 1].EnsureVisible(); + } + + //private void cancelButton_Click(object sender, EventArgs e) + //{ + // DialogResult = DialogResult.Cancel; + // Close(); + //} + + private void availableByCategoryTreeView_NodeMouseHover2(object sender, TreeNodeMouseHoverEventArgs e) + { + ToolTip toolTip = new ToolTip(); + toolTip.SetToolTip(this, e.Node.ToolTipText); + } + } +} diff --git a/TBF_V2/Sources/TBF/Results/Forms/ResultsConfigCtrl.resx b/TBF_V2/Sources/TBF/Results/Forms/ResultsConfigCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Forms/ResultsConfigCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Results/Forms/ResultsConfigDlg.cs b/TBF_V2/Sources/TBF/Results/Forms/ResultsConfigDlg.cs new file mode 100644 index 00000000..9a8fc5f3 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Forms/ResultsConfigDlg.cs @@ -0,0 +1,71 @@ +/// +/// Copyright (c) 2016-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using Results; +using Results.Resources; + +namespace Results.Forms +{ + public partial class ResultsConfigDlg : Form + { + public IList SelectedItems + { + set { resultsConfigCtrl.SelectedItems = value; } + get { return resultsConfigCtrl.SelectedItems; } + } + + public MetersKind MetersKind + { + set { resultsConfigCtrl.MetersKind = value; } + } + + + public ResultsConfigDlg(bool supressTestIDColumn) + : this() + { + resultsConfigCtrl.SupressTestIDColumn = supressTestIDColumn; + } + + public ResultsConfigDlg() + { + InitializeComponent(); + resultsConfigCtrl.Unlocked = true; + } + + + void Localize() + { + Text = Strings.Configuration; + okButton.Text = Strings.OkBtnText; + cancelButton.Text = Strings.CancelBtnText; + } + + void ResultsConfig_Load(object sender, EventArgs e) + { + Localize(); + } + + void okButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.OK; + Close(); + } + + private void cancelButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + private void ResultsConfigDlg_KeyPress(object sender, KeyPressEventArgs e) + { + e.Handled = true; + } + } +} diff --git a/TBF_V2/Sources/TBF/Results/Forms/ResultsConfigDlg.designer.cs b/TBF_V2/Sources/TBF/Results/Forms/ResultsConfigDlg.designer.cs new file mode 100644 index 00000000..5f2b8566 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Forms/ResultsConfigDlg.designer.cs @@ -0,0 +1,94 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +namespace Results.Forms +{ + partial class ResultsConfigDlg + { + /// + /// 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() + { + this.okButton = new System.Windows.Forms.Button(); + this.cancelButton = new System.Windows.Forms.Button(); + this.resultsConfigCtrl = new Results.Forms.ResultsConfigCtrl(); + this.SuspendLayout(); + // + // okButton + // + this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.okButton.Location = new System.Drawing.Point(939, 29); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(105, 42); + this.okButton.TabIndex = 4; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // cancelButton + // + this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cancelButton.Location = new System.Drawing.Point(939, 82); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(105, 42); + this.cancelButton.TabIndex = 5; + this.cancelButton.Text = "Cancel"; + this.cancelButton.UseVisualStyleBackColor = true; + this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click); + // + // resultsConfigCtrl + // + this.resultsConfigCtrl.Location = new System.Drawing.Point(-1, 1); + this.resultsConfigCtrl.Name = "resultsConfigCtrl"; + this.resultsConfigCtrl.Size = new System.Drawing.Size(925, 496); + this.resultsConfigCtrl.TabIndex = 6; + // + // ResultsConfigDlg + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1066, 498); + this.Controls.Add(this.resultsConfigCtrl); + this.Controls.Add(this.cancelButton); + this.Controls.Add(this.okButton); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Name = "ResultsConfigDlg"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "ResultsConfig"; + this.Load += new System.EventHandler(this.ResultsConfig_Load); + this.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.ResultsConfigDlg_KeyPress); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.Button cancelButton; + private ResultsConfigCtrl resultsConfigCtrl; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Results/Forms/ResultsConfigDlg.resx b/TBF_V2/Sources/TBF/Results/Forms/ResultsConfigDlg.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Forms/ResultsConfigDlg.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Results/ItemID.cs b/TBF_V2/Sources/TBF/Results/ItemID.cs new file mode 100644 index 00000000..37f086d6 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/ItemID.cs @@ -0,0 +1,258 @@ +/// +/// Copyright (c) 2016-2017 Sensus Metering Systems +/// +using System; + +namespace Results +{ + public enum ItemID + { + String, /// 0 + Test_name, /// 1 + Procedure_name, /// 2 + Batch_number, /// 3 + Test_method, /// 4 + Density, /// 5 + Q_from, /// 6 + Q_to, /// 7 + Test_volume, /// 8 + Error_limit_Lo, /// 9 + Error_limit_Hi, /// 10 + Uncertainty, /// 11 + Test_start_time, /// 12 + Test_end_time, /// 13 + Test_time, /// 14 + Flow, /// 15 + T_up_mean, /// 16 + T_down_mean, /// 17 + T_div, /// 18 + P_up, /// 19 + P_up_start, /// 20 + P_up_end, /// 21 + P_down, /// 22 + P_down_start, /// 23 + P_down_end, /// 24 + Reference_error, /// 25 + Ambient_temperature, /// 26 + Ambient_pressure, /// 27 + Ambient_humidity, /// 28 + Volume, /// 29 + Reference_volume, /// 30 + Error, /// 31 + Passed, /// 32 + Watermeter_type, /// 33 + Producer, /// 34 + DN, /// 35 + L, /// 36 + Mounting, /// 37 + Q4, /// 38 + Q3, /// 39 + Q2, /// 40 + Q1, /// 41 + Metrological_class, /// 42 + Temperature_class, /// 43 + Pressure_loss_class, /// 44 + Max_admissible_pressure, /// 45 + Flow_profile_sensitivity_class, /// 46 + Approval_info, /// 47 + Certificate, /// 48 + Pulses_per_liter, /// 49 Water meter constant (water meter data, not used in calculations) + Text1, /// 50 + Text2, /// 51 + Text3, /// 52 + Text4, /// 53 + Text5, /// 54 + Serial_Nr, /// 55 + Purchase_order, /// 56 + Year_of_production, /// 57 + WM_Position, /// 58 + End_state, /// 59 + Pulses, /// 60 + Pulse__liter, /// 61 Water meter constant (pulses per liter) specific for one test + Reference_pulses_ni, /// 62 Reference pulses gated for specific meter (synchro method) + Reference_energy, /// 63 + Test_bench_ID, /// 64 + Program_version, /// 65 + User_name, /// 66 + User_nr, /// 67 + Energy, /// 68 + Watermeters, /// 69 + Protocol_title, /// 70 + Batch_start_time, /// 71 + Batch_end_time, /// 72 + Lite_per_pulse_Read, /// 73 + Result_code, /// 74 + Remark, /// 75 + T_Hi_mean, /// 76 + T_Hi_start, /// 77 + T_Hi_end, /// 78 + T_Hi_avg, /// 79 + T_Lo_mean, /// 80 + T_Lo_start, /// 81 + T_Lo_end, /// 82 + T_Lo_avg, /// 83 + P_delta_mean, /// 84 + P_delta_start, /// 85 + P_delta_end, /// 86 + Meter_type, /// 87 Single, Compound or HeatMeter + Volume_main, /// 88 + Volume_aux, /// 89 + Start_volume, /// 90 + Start_volume_main, /// 91 + Start_volume_aux, /// 92 + End_volume, /// 93 + End_volume_main, /// 94 + End_volume_aux, /// 95 + Error_main, /// 96 + Error_aux, /// 97 + Serial_Nr_main, /// 98 + Serial_Nr_aux, /// 99 + End_state_main, /// 100 + End_state_aux, /// 101 + Q_rise, /// 102 + Q_fall, /// 103 + + /// iPerl + OrigCalibFactor, /// 104 + CalibFactor, /// 105 + Q2ErrWOCorrection, /// 106 + Q2CorrectionDone, /// 107 + Q2CorrRFlow, /// 108 + Q2CorrLFlow, /// 109 + Q2CorrFlowRight, /// 110 + + Q_ref_mean, /// 111 + T_up_start, /// 112 + T_up_end, /// 113 + T_up_avg, /// 114 + T_down_start, /// 115 + T_down_end, /// 116 + T_down_avg, /// 117 + T_div_start, /// 118 + T_div_end, /// 119 + T_div_avg, /// 120 + P_up_avg, /// 121 + P_down_avg, /// 122 + P_delta_avg, /// 123 + + TestDone, /// 124 + TestPassed, /// 125 + + /// iPerl + FW_Version, /// 126 + + Mass_start_raw, /// 127 + Mass_start, /// 128 + Mass_end_raw, /// 129 + Mass_end, /// 130 + Mass, /// 131 + Buoyancy, /// 132 + Density_correction, /// 133 + + ErrorFlags, /// 134 + E1, /// 135 + E2, /// 136 + E3, /// 137 + E4, /// 138 + E5, /// 139 + E6, /// 140 + E7, /// 141 + E8, /// 142 + E9, /// 143 + E10, /// 144 + E11, /// 145 + E12, /// 146 + E13, /// 147 + E14, /// 148 + E15, /// 149 + E16, /// 150 + + Table_row_nr, /// 151 + Table_column_nr, /// 152 + WMRemark, /// 153 + + User_description, /// 154 + Legalizator, /// 155 + + Passed_meters_count, /// 156 + Failed_meters_count, /// 157 + Passed_seals_count, /// 158 + + Diverter_start_time, /// 159 + Diverter_end_time, /// 160 + Q_sensitivity, /// 161 + + Q_ref_min, /// 162 + Q_ref_max, /// 163 + Q_ref_start, /// 164 + Q_ref_end, /// 165 + + Amb_temp_start_end, /// 166 + Amb_press_start_end, /// 167 + Amb_humi_start_end, /// 168 + + ResultOrErrorFlags, /// 169, PL specific result + + T_up_min, /// 170 + T_up_max, /// 171 + T_down_min, /// 172 + T_down_max, /// 173 + T_div_min, /// 174 + T_div_max, /// 175 + P_up_min, /// 176 + P_up_max, /// 177 + P_down_min, /// 178 + P_down_max, /// 179 + P_delta_min, /// 180 + P_delta_max, /// 181 + + T_rho_0, /// 182 + Rho_Wa_calc, /// 183 + + Formatted_WM_ID, /// 184, Formated WM ID string: + /// {0}=start DateTime {1}-end DateTime, {2}=batch nr., {3}=wm pos.(1..max), {4}=s/n string + E21, /// 185 + + T_line_mean, /// 186 + T_line_start, /// 187 + T_line_end, /// 188 + T_line_avg, /// 189 + T_line_min, /// 190 + T_line_max, /// 191 + + ErrorFlagsEx, /// 192 + RhoDistilledWtrAtMeLineTemp, /// 193 + ConstMaster, /// 194 + Reference_pulses, /// 195 Reference pulses not gated + spare, + Separator, /// 197 + Test_time_ni, /// 198 Test time for a specific meter (gated in case of a synchro method OR a difference of 2 time stamps) + PMax_test_time, /// 199 Pressure test time + Start_valve_open_time, /// 200 + Start_valve_close_time, /// 201 + Qc, /// 202 Flow for a water meter + Degree__liter, /// 203 Water meter constant (degree per liter) specific for one test with camera + Camera_angle, /// 204 + Camera_angle_start, /// 205 + Camera_angle_end, /// 206 + + P_delta_mean_per_mtr, /// 207 + P_delta_mean_from_up_down, /// 208 + P_delta_mean_from_up_down_per_mtr, /// 209 + Timestamp_start, /// 210 + Timestamp_end, /// 211 + P_PMax_test_mean, /// 212 PMax test pressure mean of (Pup + Pdown)/2 + + Medium, /// 213 Woda zimna/ciepla + + Flow_ctv, /// 214 + Flow_ctv_min, /// 215 + Flow_ctv_max, /// 216 + Flow_ctv_start, /// 217 + Flow_ctv_end, /// 218 + ConstMasterRaw, /// 219 ConstMaster (like 194) uncorrected + Reference_error_corr, /// 220 Reference flow meter error after correction using correction curve + + Count, + } +} diff --git a/TBF_V2/Sources/TBF/Results/ItemSpec.cs b/TBF_V2/Sources/TBF/Results/ItemSpec.cs new file mode 100644 index 00000000..c653ab99 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/ItemSpec.cs @@ -0,0 +1,244 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using Results.Entities; +using Results.Resources; + +namespace Results +{ + public class ItemSpec + { + /// + /// Public fields + /// + public readonly string Name; /// Name-s of all items must be unique + public readonly string ClmnHeaderText; /// Text printed in the column header + + + /// + /// Function to pick a MeterTestResult field and convert it into a string + /// + public delegate string PrintDlgt(MeterTestRslt meterTestRslt); + + /// + /// Function to pick a MeterTestResult field and convert it into a string + /// + public delegate string PrintCompoundDlgt(MeterTestRslt mainMtrTestResult, + MeterTestRslt auxMtrTestResult, + MeterTestRslt compoundMtrTestResult); + + /// + /// Function to pick a MeterTestResult field and convert it into a string + /// + public delegate string PrintHeatMeterDlgt(MeterTestRslt volumeTestResult, + MeterTestRslt energyTestResult); + + private readonly PrintDlgt printDlgt; + private readonly PrintCompoundDlgt printCompoundDlgt; + private readonly PrintHeatMeterDlgt printHeatMeterDlgt; + + public bool CanPrintSingle { get { return (printDlgt != null); } } + public bool CanPrintCompoundMeter { get { return (printCompoundDlgt != null); } } + public bool CanPrintHeatMeter { get { return (printHeatMeterDlgt != null); } } + + /// Safe wrapper which replaces null-s by empty strings + public string Print(MeterTestRslt meterTestRslt) + { + string str = null; + if (printDlgt != null) str = printDlgt(meterTestRslt); + return (str == null) ? string.Empty : str; + } + + /// Safe wrapper which replaces null-s by empty strings + public string PrintCombined(MeterTestRslt mainMtrTestResult, + MeterTestRslt auxMtrTestResult, + MeterTestRslt compoundMtrTestResult) + { + string str = null; + if (printCompoundDlgt != null) str = printCompoundDlgt(mainMtrTestResult, auxMtrTestResult, compoundMtrTestResult); + return (str == null) ? string.Empty : str; + } + + /// Safe wrapper which replaces null-s by empty strings + public string PrintHeatMeter(MeterTestRslt volumeTestResult, + MeterTestRslt energyTestResult) + { + string str = null; + if (printHeatMeterDlgt != null) str = printHeatMeterDlgt(volumeTestResult, energyTestResult); + return (str == null) ? string.Empty : str; + } + + + /// + /// Public constructor + /// + public ItemSpec(string name, string clmnHeaderText, PrintDlgt printDlgt, PrintCompoundDlgt printCombinedDlgt, PrintHeatMeterDlgt printHeatMeterDlgt) + { + Name = name; + ClmnHeaderText = clmnHeaderText; + this.printDlgt = printDlgt; + this.printCompoundDlgt = printCombinedDlgt; + this.printHeatMeterDlgt = printHeatMeterDlgt; + } + + + /// Static list of all available items + public static readonly IList AllItems; + + /// Static constructor that initializes the list of all items + static ItemSpec() + { + AllItems = new List(); + + /// Common + + //AllItems.Add(new ResultItemSpec("Bench ID", "Bench ID", x => x.BenchID, (x, y, z) => x.BenchID)); + AllItems.Add(new ItemSpec("Test name", Strings.Test, x => x.Name(), (x, y, z) => z.Name(), (x, z) => z.Name())); + AllItems.Add(new ItemSpec("Procedure name", Strings.Procedure, x => x.ProcedureName(), (x, y, z) => z.ProcedureName(), (x, z) => z.ProcedureName())); + AllItems.Add(new ItemSpec("Batch number", Strings.Batch_nr, x => x.BatchNr().ToString(), (x, y, z) => z.BatchNr().ToString(), (x, z) => z.BatchNr().ToString())); + AllItems.Add(new ItemSpec("Test method", Strings.Test_method, x => x.Method(), (x, y, z) => z.Method(), (x, z) => z.Method())); + AllItems.Add(new ItemSpec("Density", Strings.Density, x => x.DensityOut().ToString("F1"), (x, y, z) => z.DensityOut().ToString("F1"), (x, z) => z.DensityOut().ToString("F1"))); /// [kg/m3] + + /// Target values + AllItems.Add(new ItemSpec("Q from", Strings.Q_from + " [m3/h]", x => x.Qfrom().ToString("F3"), (x, y, z) => z.Qfrom().ToString("F3"), (x, z) => z.Qfrom().ToString("F3"))); + AllItems.Add(new ItemSpec("Q to", Strings.Q_to + " [m3/h]", x => x.Qto().ToString("F3"), (x, y, z) => z.Qto().ToString("F3"), (x, z) => z.Qto().ToString("F3"))); + AllItems.Add(new ItemSpec("Test volume", Strings.Test_vol + " [l]", x => x.TargetVolume().ToString("F1"), (x, y, z) => z.TargetVolume().ToString("F1"), (x, z) => z.TargetVolume().ToString("F1"))); + AllItems.Add(new ItemSpec("Error limit Lo", Strings.ErrLimLo + " [%]", x => x.ErrLimLo().ToString("F1"), (x, y, z) => z.ErrLimLo().ToString("F1"), (x, z) => z.ErrLimLo().ToString("F1"))); + AllItems.Add(new ItemSpec("Error limit Hi", Strings.ErrLimHi + " [%]", x => x.ErrLimHi().ToString("F1"), (x, y, z) => z.ErrLimHi().ToString("F1"), (x, z) => z.ErrLimHi().ToString("F1"))); + AllItems.Add(new ItemSpec("Uncertainty", Strings.Uncertainty + " [%]", x => x.Uncertainty().ToString("F2"), (x, y, z) => z.Uncertainty().ToString("F2"), (x, z) => z.Uncertainty().ToString("F2"))); + + /// Test results + AllItems.Add(new ItemSpec("Test start time", Strings.T_start, x => x.StartTime().ToShortTimeString(), (x, y, z) => z.StartTime().ToShortTimeString(), (x, z) => z.StartTime().ToShortTimeString())); + AllItems.Add(new ItemSpec("Test end time", Strings.T_end, x => x.EndTime().ToShortTimeString(), (x, y, z) => z.EndTime().ToShortTimeString(), (x, z) => z.EndTime().ToShortTimeString())); + AllItems.Add(new ItemSpec("Test time", Strings.T_s, x => x.TestTime.ToString("F2"), (x, y, z) => z.TestTime.ToString("F2"), (x, z) => z.TestTime.ToString("F2"))); + AllItems.Add(new ItemSpec("Flow", Strings.Flow + " [m3/h]", x => Utils.DoubleToStr(x.FlowVolume(), 4), (x, y, z) => Utils.DoubleToStr(z.FlowVolume(), 4), (x, z) => Utils.DoubleToStr(x.FlowVolume(), 4))); + AllItems.Add(new ItemSpec("T in", Strings.T_in + " [°C]", x => x.TestRslt.TempUpMean.ToString("F2"), (x, y, z) => z.TestRslt.TempUpMean.ToString("F2"), (x, z) => z.TestRslt.TempUpMean.ToString("F2"))); + AllItems.Add(new ItemSpec("T out", Strings.T_out + " [°C]", x => x.TestRslt.TempDownMean.ToString("F2"), (x, y, z) => z.TestRslt.TempDownMean.ToString("F2"), (x, z) => z.TestRslt.TempDownMean.ToString("F2"))); + AllItems.Add(new ItemSpec("T div", Strings.T_div + " [°C]", x => x.TestRslt.TempDivMean.ToString("F2"), (x, y, z) => z.TestRslt.TempDivMean.ToString("F2"), (x, z) => z.TestRslt.TempDivMean.ToString("F2"))); + AllItems.Add(new ItemSpec("P up", Strings.P_up + " [kPa]", x => (100 * x.TestRslt.PressUpMean).ToString("F3"), (x, y, z) => z.TestRslt.PressUpMean.ToString("F3"), (x, z) => z.TestRslt.PressUpMean.ToString("F3"))); + AllItems.Add(new ItemSpec("P up start", Strings.P_up_start + " [kPa]", x => (100 * x.TestRslt.PressUpStart).ToString("F3"), (x, y, z) => z.TestRslt.PressUpStart.ToString("F3"), (x, z) => z.TestRslt.PressUpStart.ToString("F3"))); + AllItems.Add(new ItemSpec("P up end", Strings.P_up_end + " [kPa]", x => (100 * x.TestRslt.PressUpEnd).ToString("F3"), (x, y, z) => z.TestRslt.PressUpEnd.ToString("F3"), (x, z) => z.TestRslt.PressUpEnd.ToString("F3"))); + AllItems.Add(new ItemSpec("P down", Strings.P_dn + " [kPa]", x => (100 * x.TestRslt.PressDownMean).ToString("F3"), (x, y, z) => z.TestRslt.PressDownMean.ToString("F3"), (x, z) => z.TestRslt.PressDownMean.ToString("F3"))); + AllItems.Add(new ItemSpec("P down start", Strings.P_dn_start + " [kPa]", x => (100 * x.TestRslt.PressDownStart).ToString("F3"), (x, y, z) => z.TestRslt.PressDownStart.ToString("F3"), (x, z) => z.TestRslt.PressDownStart.ToString("F3"))); + AllItems.Add(new ItemSpec("P down end", Strings.P_dn_end + " [kPa]", x => (100 * x.TestRslt.PressDownEnd).ToString("F3"), (x, y, z) => z.TestRslt.PressDownEnd.ToString("F3"), (x, z) => z.TestRslt.PressDownEnd.ToString("F3"))); + AllItems.Add(new ItemSpec("P delta", Strings.P_delta + " [kPa]", x => (100 * x.TestRslt.PressDeltaMean).ToString("F3"), (x, y, z) => z.TestRslt.PressDeltaMean.ToString("F3"), (x, z) => z.TestRslt.PressDeltaMean.ToString("F3"))); + AllItems.Add(new ItemSpec("P delta start", Strings.P_delta_start + " [kPa]", x => (100 * x.TestRslt.PressDeltaStart).ToString("F3"), (x, y, z) => z.TestRslt.PressDeltaStart.ToString("F3"), (x, z) => z.TestRslt.PressDeltaStart.ToString("F3"))); + AllItems.Add(new ItemSpec("P delta end", Strings.P_delta_end + " [kPa]", x => (100 * x.TestRslt.PressDeltaEnd).ToString("F3"), (x, y, z) => z.TestRslt.PressDeltaEnd.ToString("F3"), (x, z) => z.TestRslt.PressDeltaEnd.ToString("F3"))); + AllItems.Add(new ItemSpec("Reference error", Strings.ErrRef + " [%]", x => x.TestRslt.ErrorMaster.ToString("F3"), (x, y, z) => z.TestRslt.ErrorMaster.ToString("F3"), (x, z) => z.TestRslt.ErrorMaster.ToString("F3"))); + AllItems.Add(new ItemSpec("Ambient temperature", Strings.T_amb + " [°C]", x => x.TestRslt.AmbTempMean.ToString("F1"), (x, y, z) => z.TestRslt.AmbTempMean.ToString("F1"), (x, z) => z.TestRslt.AmbTempMean.ToString("F1"))); + AllItems.Add(new ItemSpec("Ambient pressure", Strings.P_amb + " [mbar]", x => (1000 * x.TestRslt.AmbPressMean).ToString("F0"), (x, y, z) => (1000 * z.TestRslt.AmbPressMean).ToString("F0"), (x, z) => (1000 * z.TestRslt.AmbPressMean).ToString("F0"))); + AllItems.Add(new ItemSpec("Ambient humidity", Strings.H_amb + " [%]", x => x.TestRslt.AmbHumiMean.ToString("F1"), (x, y, z) => z.TestRslt.AmbHumiMean.ToString("F1"), (x, z) => z.TestRslt.AmbHumiMean.ToString("F1"))); + + /// Single and combined meter results + AllItems.Add(new ItemSpec("Start volume", Strings.Start_volume + " [l]", x => x.VolumeStart.ToString("F3"), (x, y, z) => z.VolumeStart.ToString("F3"), (x, z) => z.VolumeStart.ToString("F3"))); + AllItems.Add(new ItemSpec("End volume", Strings.End_volume + " [l]", x => x.VolumeEnd.ToString("F3"), (x, y, z) => z.VolumeEnd.ToString("F3"), (x, z) => z.VolumeEnd.ToString("F3"))); + AllItems.Add(new ItemSpec("Volume", Strings.Volume + " [l]", x => x.VolumeMeter.ToString("F3"), (x, y, z) => z.VolumeMeter.ToString("F3"), (x, z) => x.VolumeMeter.ToString("F3"))); + AllItems.Add(new ItemSpec("Reference volume", Strings.VolRef + " [l]", x => x.VolumeRef.ToString("F3"), (x, y, z) => z.VolumeRef.ToString("F3"), (x, z) => x.VolumeRef.ToString("F3"))); + AllItems.Add(new ItemSpec("Error", Strings.Error + " [%]", x => x.Error.ToString("F2"), (x, y, z) => z.Error.ToString("F2"), null)); + AllItems.Add(new ItemSpec("Passed", Strings.Result, x => x.PassedColorStr(), (x, y, z) => z.PassedColorStr(), null)); + AllItems.Add(new ItemSpec("Volume Error", "Volume Error" + " [%]", null, null, (x, z) => x.Error.ToString("F2"))); + AllItems.Add(new ItemSpec("Volume Passed", "Volume Passed", null, null, (x, z) => x.PassedColorStr())); + AllItems.Add(new ItemSpec("Energy Error", "Energy Error" + " [%]", null, null, (x, z) => z.Error.ToString("F2"))); + AllItems.Add(new ItemSpec("Energy Passed", "Energy Passed", null, null, (x, z) => z.PassedColorStr())); + + /// Water meter info + AllItems.Add(new ItemSpec("Watermeter type", Strings.WM_Type, x => x.WaterMeterData().ProductName, (x, y, z) => z.WaterMeterData().ProductName, (x, z) => z.WaterMeterData().ProductName)); + AllItems.Add(new ItemSpec("Producer", Strings.Producer, x => x.WaterMeterData().Producer, (x, y, z) => z.WaterMeterData().Producer, (x, z) => z.WaterMeterData().Producer)); + AllItems.Add(new ItemSpec("Metrological class", Strings.MClass, x => x.WaterMeterData().MetrologicalClass, (x, y, z) => z.WaterMeterData().MetrologicalClass, (x, z) => z.WaterMeterData().MetrologicalClass)); + AllItems.Add(new ItemSpec("Approval info", Strings.Approval, x => x.WaterMeterData().ApprovalInfo, (x, y, z) => z.WaterMeterData().ApprovalInfo, (x, z) => z.WaterMeterData().ApprovalInfo)); + AllItems.Add(new ItemSpec("Q4", "Q4 [m3/h]", x => x.WaterMeterData().Q4_Qmax.ToString(), (x, y, z) => z.WaterMeterData().Q4_Qmax.ToString(), null)); + AllItems.Add(new ItemSpec("Q3", "Q3 [m3/h]", x => x.WaterMeterData().Q3_Qn.ToString(), (x, y, z) => z.WaterMeterData().Q3_Qn.ToString(), null)); + AllItems.Add(new ItemSpec("Q2", "Q2 [m3/h]", x => x.WaterMeterData().Q2_Qt.ToString(), (x, y, z) => z.WaterMeterData().Q2_Qt.ToString(), null)); + AllItems.Add(new ItemSpec("Q1", "Q1 [m3/h]", x => x.WaterMeterData().Q1_Qmin.ToString(), (x, y, z) => z.WaterMeterData().Q1_Qmin.ToString(), null)); + AllItems.Add(new ItemSpec("Qmax", "Qmax [m3/h]", x => x.WaterMeterData().Q4_Qmax.ToString(), (x, y, z) => z.WaterMeterData().Q4_Qmax.ToString(), null)); + AllItems.Add(new ItemSpec("Qn", "Qn [m3/h]", x => x.WaterMeterData().Q3_Qn.ToString(), (x, y, z) => z.WaterMeterData().Q3_Qn.ToString(), null)); + AllItems.Add(new ItemSpec("Qt", "Qt [m3/h]", x => x.WaterMeterData().Q2_Qt.ToString(), (x, y, z) => z.WaterMeterData().Q2_Qt.ToString(), null)); + AllItems.Add(new ItemSpec("Qmin", "Qmin [m3/h]", x => x.WaterMeterData().Q1_Qmin.ToString(), (x, y, z) => z.WaterMeterData().Q1_Qmin.ToString(), null)); + + /// Water meters results + AllItems.Add(new ItemSpec("Serial Nr", Strings.sn, x => x.WaterMeter.SerialNr, (x, y, z) => z.WaterMeter.SerialNr, (x, z) => z.WaterMeter.SerialNr)); + AllItems.Add(new ItemSpec("Purchase order", Strings.PO, x => x.WaterMeter.PurchaseOrder, (x, y, z) => z.WaterMeter.PurchaseOrder, (x, z) => z.WaterMeter.PurchaseOrder)); + AllItems.Add(new ItemSpec("Year of production", Strings.Year, x => x.WaterMeter.YearOfProduction.ToString(), (x, y, z) => z.WaterMeter.YearOfProduction.ToString(), (x, z) => z.WaterMeter.YearOfProduction.ToString())); + AllItems.Add(new ItemSpec("WM Position", Strings.Pos, x => x.WaterMeter.WMPosition.ToString(), (x, y, z) => z.WaterMeter.WMPosition.ToString(), (x, z) => z.WaterMeter.WMPosition.ToString())); + + /// Water meters results (single) + AllItems.Add(new ItemSpec("End state", Strings.End_state, x => x.EndState(), null, null)); + AllItems.Add(new ItemSpec("Pulses", Strings.Pulses, x => x.PulsesMeter.ToString(), null, null)); + AllItems.Add(new ItemSpec("Pulses/liter", Strings.PulsesLiter, x => x.PulsesPerLiter.ToString(), null, null)); + AllItems.Add(new ItemSpec("Reference pulses", Strings.RefPulses, x => x.PulsesMaster.ToString(), null, null)); + + /// Water meters results (combined) + AllItems.Add(new ItemSpec("Q rise", Strings.Q_rise + " [m3/h]", null, (x, y, z) => (z.QRise() == 0) ? "-" : Utils.DoubleToStr(z.QRise(), 4), null)); + AllItems.Add(new ItemSpec("Q fall", Strings.Q_fall + " [m3/h]", null, (x, y, z) => (z.QFall() == 0) ? "-" : Utils.DoubleToStr(z.QFall(), 4), null)); + AllItems.Add(new ItemSpec("Error large WM", Strings.Err_main + " [%]", null, (x, y, z) => x.Error.ToString("F2"), null)); + AllItems.Add(new ItemSpec("Error small WM", Strings.Err_aux + " [%]", null, (x, y, z) => y.Error.ToString("F2"), null)); + AllItems.Add(new ItemSpec("Serial Nr large WM", Strings.sn_main, null, (x, y, z) => x.SerialNr(), null)); + AllItems.Add(new ItemSpec("Serial Nr small WM", Strings.sn_aux, null, (x, y, z) => y.SerialNr(), null)); + AllItems.Add(new ItemSpec("End state large WM", Strings.EndState_main, null, (x, y, z) => x.EndState(), null)); + AllItems.Add(new ItemSpec("End state small WM", Strings.EndState_aux, null, (x, y, z) => y.EndState(), null)); + AllItems.Add(new ItemSpec("Start volume main", Strings.Start_volume_main + " [l]",x => x.VolumeMeter.ToString("F3"), (x, y, z) => x.VolumeStart.ToString("F3"), null)); + AllItems.Add(new ItemSpec("End volume main", Strings.End_volume_main + " [l]", x => x.VolumeMeter.ToString("F3"), (x, y, z) => x.VolumeEnd.ToString("F3"), null)); + AllItems.Add(new ItemSpec("Volume main", Strings.Volume_main + " [l]", x => x.VolumeMeter.ToString("F3"), (x, y, z) => x.VolumeMeter.ToString("F3"), null)); + AllItems.Add(new ItemSpec("Start volume aux", Strings.Start_volume_aux + " [l]", x => x.VolumeMeter.ToString("F3"), (x, y, z) => y.VolumeStart.ToString("F3"), null)); + AllItems.Add(new ItemSpec("End volume aux", Strings.End_volume_aux + " [l]", x => x.VolumeMeter.ToString("F3"), (x, y, z) => y.VolumeEnd.ToString("F3"), null)); + AllItems.Add(new ItemSpec("Volume aux", Strings.Volume_aux + " [l]", x => x.VolumeMeter.ToString("F3"), (x, y, z) => y.VolumeMeter.ToString("F3"), null)); + + /// Batch info + AllItems.Add(new ItemSpec("Batch number", Strings.Batch_nr, x => x.Batch().BatchNr.ToString(), (x, y, z) => x.Batch().BatchNr.ToString(), (x, z) => x.Batch().BatchNr.ToString())); + AllItems.Add(new ItemSpec("Test bench ID", Strings.Bench, x => x.Batch().TestBenchId.ToString(), (x, y, z) => x.Batch().TestBenchId.ToString(), (x, z) => x.Batch().TestBenchId.ToString())); + AllItems.Add(new ItemSpec("Program version", Strings.Ver, x => x.Batch().ProgramVersion, (x, y, z) => x.Batch().ProgramVersion, (x, z) => x.Batch().ProgramVersion)); + AllItems.Add(new ItemSpec("User name", Strings.User, x => x.Batch().UserName, (x, y, z) => x.Batch().UserName, (x, z) => x.Batch().UserName)); + AllItems.Add(new ItemSpec("User nr.", Strings.User_nr, x => x.Batch().UserNumber.ToString(), (x, y, z) => x.Batch().UserNumber.ToString(), (x, z) => x.Batch().UserNumber.ToString())); + AllItems.Add(new ItemSpec("Procedure name", Strings.Procedure, x => x.Batch().ProcedureName, (x, y, z) => x.Batch().ProcedureName, (x, z) => x.Batch().ProcedureName)); + AllItems.Add(new ItemSpec("Watermeters", Strings.WMs, x => x.Batch().WatermetersStr, (x, y, z) => x.Batch().WatermetersStr, (x, z) => x.Batch().WatermetersStr)); + AllItems.Add(new ItemSpec("Protocol title", Strings.Protocol, x => x.Batch().ProtocolTitle, (x, y, z) => x.Batch().ProtocolTitle, (x, z) => x.Batch().ProtocolTitle)); + AllItems.Add(new ItemSpec("Batch start time", Strings.Start, x => x.Batch().StartTime.ToShortTimeString(), (x, y, z) => x.Batch().StartTime.ToShortTimeString(), (x, z) => x.Batch().StartTime.ToShortTimeString())); + AllItems.Add(new ItemSpec("Batch end time", Strings.End, x => x.Batch().EndTime.ToShortTimeString(), (x, y, z) => x.Batch().EndTime.ToShortTimeString(), (x, z) => x.Batch().EndTime.ToShortTimeString())); + + /// Heat meters results + AllItems.Add(new ItemSpec("Energy", Strings.Energy, null, null, (x, z) => z.VolumeMeter.ToString())); + AllItems.Add(new ItemSpec("Reference energy", Strings.Energy_ref, null, null, (x, z) => z.VolumeRef.ToString())); + AllItems.Add(new ItemSpec("Temp hi me", "T hi me", null, null, (x, z) => z.TestRslt.Custom1.ToString("F3"))); + AllItems.Add(new ItemSpec("Temp hi st", "T hi st", null, null, (x, z) => z.TestRslt.Custom2.ToString("F3"))); + AllItems.Add(new ItemSpec("Temp hi en", "T hi en", null, null, (x, z) => z.TestRslt.Custom3.ToString("F3"))); + AllItems.Add(new ItemSpec("Temp hi av", "T hi av", null, null, (x, z) => ((z.TestRslt.Custom2 + z.TestRslt.Custom3) / 2).ToString("F3"))); + AllItems.Add(new ItemSpec("Temp lo me", "T lo me", null, null, (x, z) => z.TestRslt.Custom6.ToString("F3"))); + AllItems.Add(new ItemSpec("Temp lo st", "T lo st", null, null, (x, z) => z.TestRslt.Custom7.ToString("F3"))); + AllItems.Add(new ItemSpec("Temp lo en", "T lo en", null, null, (x, z) => z.TestRslt.Custom8.ToString("F3"))); + AllItems.Add(new ItemSpec("Temp lo av", "T lo av", null, null, (x, z) => ((z.TestRslt.Custom7 + z.TestRslt.Custom8) / 2).ToString("F3"))); + + AllItems.Add(new ItemSpec("Start mass", Strings.Start_mass + " [kg]", x => x.TestRslt.MassStart.ToString("F4"), (x, y, z) => z.TestRslt.MassStart.ToString("F4"), (x, z) => z.TestRslt.MassStart.ToString("F4"))); + AllItems.Add(new ItemSpec("End mass", Strings.End_mass + " [kg]", x => x.TestRslt.MassEnd.ToString("F4"), (x, y, z) => z.TestRslt.MassEnd.ToString("F4"), (x, z) => z.TestRslt.MassEnd.ToString("F4"))); + } + + public static ItemSpec GetItem(string name) + { + foreach (var item in AllItems) if (item.Name.Equals(name)) return item; + return null; + } + + public static string[] ToStrArray(IList items) + { + int count = (items != null) ? items.Count : 0; + string[] result = new string[count]; + for (int i = 0; i < count; i++) result[i] = items[i].Name; + return result; + } + + public static IList FromStrArray(string[] strArray) + { + IList result = new List(); + if (strArray != null) + { + for (int i = 0; i < strArray.Length; i++) + { + ItemSpec item = GetItem(strArray[i]); + if (item != null) result.Add(item); + } + } + return result; + } + } +} diff --git a/TBF_V2/Sources/TBF/Results/Mappings/BatchMap.cs b/TBF_V2/Sources/TBF/Results/Mappings/BatchMap.cs new file mode 100644 index 00000000..bba268f9 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Mappings/BatchMap.cs @@ -0,0 +1,42 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +using FluentNHibernate.Mapping; +using Results.Entities; + +namespace Results.Mappings +{ + class BatchMap : ClassMap + { + public BatchMap() + { + Id(x => x.Id); + Map(x => x.BatchNr); + Map(x => x.TestBenchId); + Map(x => x.ProgramVersion); + Map(x => x.UserName); + Map(x => x.UserNumber); + Map(x => x.ProcedureName); + Map(x => x.ProcedureRevision); + Map(x => x.ProtocolTitle); + Map(x => x.Remark) + .CustomType("StringClob") + .CustomSqlType("varchar(2000)"); + Map(x => x.DensityCorr) + .Column("Custom1"); ; + Map(x => x.Custom2); + Map(x => x.Custom3); + Map(x => x.StartTime); + Map(x => x.EndTime); + Map(x => x.Dirty); + Map(x => x.RsltsSent); + Map(x => x.RsltsPrinted); + HasMany(x => x.Tests) + .Cascade.All(); + HasMany(x => x.WaterMeters) + .Cascade.All(); + HasMany(x => x.TestRslts) + .Cascade.All(); + } + } +} diff --git a/TBF_V2/Sources/TBF/Results/Mappings/ComponentsMap.cs b/TBF_V2/Sources/TBF/Results/Mappings/ComponentsMap.cs new file mode 100644 index 00000000..245c2ef1 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Mappings/ComponentsMap.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using FluentNHibernate.Mapping; +using Results.Entities; + +namespace Results.Mappings +{ + class ComponentsMap : ClassMap + { + public ComponentsMap() + { + Id(x => x.Id); + Map(x => x.TestBenchId); + Map(x => x.TestBenchName); + Map(x => x.Pump); + Map(x => x.RegValve); + Map(x => x.Flowmeter); + Map(x => x.Diverter); + Map(x => x.Scale); + Map(x => x.Custom1); + Map(x => x.Custom2); + Map(x => x.Custom3); + } + } +} diff --git a/TBF_V2/Sources/TBF/Results/Mappings/MeterTestRsltMap.cs b/TBF_V2/Sources/TBF/Results/Mappings/MeterTestRsltMap.cs new file mode 100644 index 00000000..b0332ad6 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Mappings/MeterTestRsltMap.cs @@ -0,0 +1,33 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +using FluentNHibernate.Mapping; +using Results.Entities; + +namespace Results.Mappings +{ + class MeterTestRsltMap : ClassMap + { + public MeterTestRsltMap() + { + Id(x => x.Id); + Map(x => x.CompoundMeterId); + Map(x => x.PulsesMeter); + Map(x => x.PulsesMaster); + Map(x => x.PulsesPerLiter); + Map(x => x.VolumeStart); + Map(x => x.VolumeEnd); + Map(x => x.VolumeMeter); + Map(x => x.VolumeRef); + Map(x => x.TimestampStart); + Map(x => x.TimestampEnd); + Map(x => x.TestTime); + Map(x => x.Error); + Map(x => x.TestDone); + Map(x => x.Passed); + + References(x => x.WaterMeter); + References(x => x.TestRslt); + } + } +} diff --git a/TBF_V2/Sources/TBF/Results/Mappings/TestDataMap.cs b/TBF_V2/Sources/TBF/Results/Mappings/TestDataMap.cs new file mode 100644 index 00000000..c7eb542c --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Mappings/TestDataMap.cs @@ -0,0 +1,28 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +using FluentNHibernate.Mapping; +using Results.Entities; + +namespace Results.Mappings +{ + class TestDataMap : ClassMap + { + public TestDataMap() + { + Id(x => x.Id); + Map(x => x.Name); + Map(x => x.Qfrom); + Map(x => x.Qto); + Map(x => x.TargetVolume); + Map(x => x.TargetTime); + Map(x => x.Repeats); + Map(x => x.Method); + Map(x => x.ErrLimLo); + Map(x => x.ErrLimHi); + Map(x => x.Uncertainty); + Map(x => x.Publish); + Map(x => x.Evaluate); + } + } +} diff --git a/TBF_V2/Sources/TBF/Results/Mappings/TestRsltMap.cs b/TBF_V2/Sources/TBF/Results/Mappings/TestRsltMap.cs new file mode 100644 index 00000000..b3f5fd23 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Mappings/TestRsltMap.cs @@ -0,0 +1,111 @@ +/// +/// Copyright (c) 2015-2018 Sensus Slovensko a.s. +/// +using FluentNHibernate.Mapping; +using Results.Entities; + +namespace Results.Mappings +{ + class TestRsltMap : ClassMap + { + public TestRsltMap() + { + Id(x => x.Id); + References(x => x.Batch); + References(x => x.TestData); + References(x => x.Components); + Map(x => x.Part); + Map(x => x.RepetitionNr); + + Map(x => x.TestDone); + Map(x => x.Remark) + .CustomType("StringClob") + .CustomSqlType("varchar(2000)"); + Map(x => x.StartTime); + Map(x => x.EndTime); + Map(x => x.FlowSetTime); + Map(x => x.TestTime); + Map(x => x.PulsesMaster); + Map(x => x.ConstMaster); + Map(x => x.MassStartRaw); + Map(x => x.MassStart); + Map(x => x.MassEndRaw); + Map(x => x.MassEnd); + Map(x => x.DensityIn); + Map(x => x.DensityLine).Column("DensityOut"); + Map(x => x.DensityDiv); + Map(x => x.Buoyancy); + Map(x => x.FlowMass); + Map(x => x.FlowVolume); + Map(x => x.VolumeCTV); + Map(x => x.VolumeMaster); + Map(x => x.ErrorMaster); + Map(x => x.DiverterStart); + Map(x => x.DiverterEnd); + Map(x => x.ErrorFlags); + Map(x => x.ErrorFlagsMd); +#if HEAT_METERS + Map(x => x.RefEnergy); +#endif + Map(x => x.AmbTempMean).Column("AmbientTempAve"); + Map(x => x.AmbTempStart); + Map(x => x.AmbTempEnd); + Map(x => x.AmbTempMin); + Map(x => x.AmbTempMax); + Map(x => x.AmbPressMean).Column("AmbientPressAve"); + Map(x => x.AmbPressStart); + Map(x => x.AmbPressEnd); + Map(x => x.AmbPressMin); + Map(x => x.AmbPressMax); + Map(x => x.AmbHumiMean).Column("AmbientHumiAve"); + Map(x => x.AmbHumiStart); + Map(x => x.AmbHumiEnd); + Map(x => x.AmbHumiMin); + Map(x => x.AmbHumiMax); + Map(x => x.PressUpMean).Column("PressUpAvrg"); + Map(x => x.PressUpStart); + Map(x => x.PressUpEnd); + Map(x => x.PressUpMin); + Map(x => x.PressUpMax); + Map(x => x.PressDownMean).Column("PressDownAvrg"); + Map(x => x.PressDownStart); + Map(x => x.PressDownEnd); + Map(x => x.PressDownMin); + Map(x => x.PressDownMax); + Map(x => x.PressDeltaMean); + Map(x => x.PressDeltaStart); + Map(x => x.PressDeltaEnd); + Map(x => x.PressDeltaMin); + Map(x => x.PressDeltaMax); + Map(x => x.TempUpMean).Column("TempInAvrg"); + Map(x => x.TempUpStart).Column("TempInStart"); + Map(x => x.TempUpEnd).Column("TempInEnd"); + Map(x => x.TempUpMin).Column("TempInMin"); + Map(x => x.TempUpMax).Column("TempInMax"); + Map(x => x.TempDownMean).Column("TempOutAvrg"); + Map(x => x.TempDownStart).Column("TempOutStart"); + Map(x => x.TempDownEnd).Column("TempOutEnd"); + Map(x => x.TempDownMin).Column("TempOutMin"); + Map(x => x.TempDownMax).Column("TempOutMax"); + Map(x => x.TempDivMean).Column("TempDivAvrg"); + Map(x => x.TempDivStart); + Map(x => x.TempDivEnd); + Map(x => x.TempDivMin); + Map(x => x.TempDivMax); + Map(x => x.FlowMean); + Map(x => x.FlowStart); + Map(x => x.FlowEnd); + Map(x => x.FlowMin); + Map(x => x.FlowMax); + + Map(x => x.Custom1); + Map(x => x.Custom2); + Map(x => x.Custom3); + Map(x => x.Custom4); + Map(x => x.Custom5); + Map(x => x.Custom6); + Map(x => x.Custom7); + Map(x => x.Custom8); + } + } +} diff --git a/TBF_V2/Sources/TBF/Results/Mappings/WaterMeterDataMap.cs b/TBF_V2/Sources/TBF/Results/Mappings/WaterMeterDataMap.cs new file mode 100644 index 00000000..79164a66 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Mappings/WaterMeterDataMap.cs @@ -0,0 +1,61 @@ +/// +/// Copyright (c) 2015-2017 Sensus Slovensko a.s. +/// +using FluentNHibernate.Mapping; +using Results.Entities; + +namespace Results.Mappings +{ + class WaterMeterDataMap : ClassMap + { + public WaterMeterDataMap() + { + Id(x => x.Id); + Map(x => x.ProductName); + Map(x => x.Producer); + + Map(x => x.DN); + Map(x => x.L); + Map(x => x.Mounting); + +#if MUNICH && LANG_DE + Map(x => x.NewQnames); +#endif + Map(x => x.Q4_Qmax); + Map(x => x.Q3_Qn); + Map(x => x.Q2_Qt); + Map(x => x.Q1_Qmin); + + Map(x => x.MetrologicalClass); + Map(x => x.TemperatureClass); + Map(x => x.PressureLossClass); + Map(x => x.MaxAdmissiblePressure); + Map(x => x.FlowProfileSensitivityClass); + + Map(x => x.ApprovalInfo); + Map(x => x.Certificate); + + Map(x => x.PulsesPerLtr); + + Map(x => x.ProducerAux); + Map(x => x.Q3_Qn_Aux); + Map(x => x.MetrologicalClassAux); + Map(x => x.ApprovalInfoAux); + + Map(x => x.Text1); + Map(x => x.Text2); + Map(x => x.Text3); + Map(x => x.Text4); + Map(x => x.Text5); + + Map(x => x.Compound); +#if HEAT_METER_SUPPORT + Map(x => x.HeatMeter); +#endif +#if ORACLE_DB + Map(x => x.WMTypeId); + Map(x => x.WMTypeRev); +#endif + } + } +} diff --git a/TBF_V2/Sources/TBF/Results/Mappings/WaterMeterMap.cs b/TBF_V2/Sources/TBF/Results/Mappings/WaterMeterMap.cs new file mode 100644 index 00000000..d13b5d79 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Mappings/WaterMeterMap.cs @@ -0,0 +1,51 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using FluentNHibernate.Mapping; +using Results.Entities; + +namespace Results.Mappings +{ + class WaterMeterMap : ClassMap + { + public WaterMeterMap() + { + Id(x => x.Id); + Map(x => x.SerialNr); + Map(x => x.SerialNrAux); + Map(x => x.PurchaseOrder); + Map(x => x.YearOfProduction); + Map(x => x.WMPosition); + Map(x => x.EndState); + Map(x => x.EndStateAux); + Map(x => x.QRise); + Map(x => x.QFall); + Map(x => x.ErrorFlags); + Map(x => x.Passed); + Map(x => x.ResultCode); + Map(x => x.ArchivePath); + Map(x => x.Remark) + .CustomType("StringClob") + .CustomSqlType("varchar(2000)"); +#if IPERL + Map(x => x.SerialNrEx); + Map(x => x.OrigCalibFactor); + Map(x => x.CalibFactor); + Map(x => x.Q2ErrWOCorrection); + Map(x => x.Q2CorrectionDone); + Map(x => x.Q2Correction); + Map(x => x.Q2CorrRFlow); + Map(x => x.Q2CorrLFlow); + Map(x => x.Q2CorrFlowRight); + Map(x => x.Diff2Hz8Hz); + Map(x => x.Hz2CorrectionDone); + Map(x => x.Hz2Correction); + Map(x => x.FWVersion); +#endif + References(x => x.WaterMeterData); + References(x => x.Batch); + HasMany(x => x.MeterTestRslts) + .Cascade.All(); + } + } +} diff --git a/TBF_V2/Sources/TBF/Results/Output/Printers/Cevak/PrintDocumentCevak.cs b/TBF_V2/Sources/TBF/Results/Output/Printers/Cevak/PrintDocumentCevak.cs new file mode 100644 index 00000000..5edbd1c8 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Output/Printers/Cevak/PrintDocumentCevak.cs @@ -0,0 +1,446 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Printing; +using System.IO; +using Config.Entities; +using Results.Resources; + +namespace Results.Output.Printers.Cevak +{ + enum DocumentSection + { + FirstPage, + OtherPages, + Appendix1, + Appendix2, + Count, + } + + public class PrintDocumentCevak : PrintDocument + { + const string FontFamilyName = "Arial"; //"Times New Roman"; + + const int SpacingOne = 18; + const int SpacingOneAndHalf = (3 * SpacingOne) / 2; + + readonly int topMargin; + readonly int bottomMargin; + readonly int leftMargin; + readonly int TitleX; + readonly int TitleY; /// Depends on the size of the header + readonly int HdrTop; /// = TitleY + 60 + readonly int BodyTop; /// = HdrTop + 160 + + /// Size of the printed area without margins, after taking into account 'pageOrientation' + int printHeight; + int printWidth; + + /// + /// Property variable for the Font the user wishes to use + /// + Font font; + Font boldFont; + Font titleFont; + + /// + /// Data to print + /// + Results.Entities.Batch batch; + + string testBenchName; + string address1; + + + /// + /// Items to print + /// + readonly IList rsltItems; + + /// + /// Layout and status + /// + DocumentSection documentSection; + + int nrWMsOnFirstPage; + int nrWMsOnNextPage; + int nextWMNr; /// nr. of watermeter to be printed as the first one on the next page + int nrPages; + int pageNr; /// Page number to be printed at the bottom of the page + + /// + /// Constructor + /// + /// Text to be printed + public PrintDocumentCevak(Results.Entities.Batch batch, + PageOrientation pageOrientation, + int topMargin, int bottomMargin, int leftMargin, + string testBenchName, string address1) + { + this.batch = batch; + + DefaultPageSettings.Landscape = (pageOrientation == PageOrientation.Landscape); + + this.topMargin = topMargin; + this.bottomMargin = bottomMargin; + this.leftMargin = leftMargin; + + this.testBenchName = testBenchName; + this.address1 = address1; + + TitleX = leftMargin; + TitleY = topMargin; /// Depends on the size of the header + HdrTop = TitleY + 60; + BodyTop = HdrTop + 250; + + rsltItems = Results.ItemSpec.FromStrArray(new string[] { + "Test name", + "Volume", + "Reference volume", + "Test time", + "Flow", + "Error", + "Passed", + //"Reference error", // ? + }); + + /// Set print area size and margins (in dots using 100 dpi) + if (DefaultPageSettings.Landscape) + { + printHeight = base.DefaultPageSettings.PaperSize.Width - topMargin - bottomMargin; + printWidth = base.DefaultPageSettings.PaperSize.Height - leftMargin - leftMargin; + } + else + { + printHeight = base.DefaultPageSettings.PaperSize.Height - topMargin - bottomMargin; + printWidth = base.DefaultPageSettings.PaperSize.Width - leftMargin - leftMargin; + } + + + int testsCount = 0; + foreach (var mtr in batch.WaterMeters[0].MeterTestRslts) + { + if (mtr.Publish() == Config.Entities.Publish.Always) testsCount++; + } + + if (batch.WaterMeters[0].Compound()) testsCount /= 3; + + int wmSectionHeight = (testsCount + 4) * SpacingOne; + + nrWMsOnFirstPage = (printHeight - BodyTop + TitleY - 2 * SpacingOne) / wmSectionHeight; + nrWMsOnNextPage = (printHeight - 2 * SpacingOne) / wmSectionHeight; + nrWMsOnNextPage = Math.Max(nrWMsOnNextPage, 1); /// Prevent division by zero if there are too many WM tests + + nrPages = 1 + (batch.WaterMeters.Count - nrWMsOnFirstPage + nrWMsOnNextPage - 1) / nrWMsOnNextPage; + + pageNr = 1; + nextWMNr = 0; + documentSection = DocumentSection.FirstPage; + } + + /// + /// Override the default onbeginPrint method of the PrintDocument Object + /// + /// + /// + protected override void OnBeginPrint(System.Drawing.Printing.PrintEventArgs e) + { + base.OnBeginPrint(e); + + if (font == null) { font = new Font(FontFamilyName, 10, FontStyle.Regular); } + if (boldFont == null) { boldFont = new Font(FontFamilyName, 10, FontStyle.Bold); } + if (titleFont == null) { titleFont = new Font(FontFamilyName, 18, FontStyle.Bold); } + } + + /// + /// Override the default OnPrintPage method of the PrintDocument. + /// + /// + /// This provides the print logic for our document + protected override void OnPrintPage(System.Drawing.Printing.PrintPageEventArgs e) + { + /// Run base code + base.OnPrintPage(e); + + /// Use the StringFormat class for the text layout of our document + StringFormat format = new StringFormat(StringFormatFlags.LineLimit); + + + if (documentSection != DocumentSection.OtherPages) + { + ///---------- + /// Header + ///---------- + if (documentSection == DocumentSection.FirstPage) + { + RectangleF printArea = new RectangleF(TitleX, TitleY, printWidth, 40); + e.Graphics.DrawString(batch.ProtocolTitle, titleFont, Brushes.Black, printArea); + } + else + { + PrintAt(e, TitleX, TitleY, batch.ProtocolTitle); + } + + string[] leftColumn = new string[] + { + "Protokol č.: ", + "Zákazník: ", + "Datum a čas: ", + "Procedura: ", + "Popis procedury: ", + "Typ vodoměru: ", + "Zkoušející: ", + "Název zkušební stanice: ", + "Zkušební SW, č. verze: ", + "Metodika: ", /// BenchAdresa 1 + //"Okolní teplota: ", // Disabled, see email dated 25.11.2016 + //"Okolní tlak: ", + //"Relativní vlhkost: ", + }; + + string[] rightColumn = new string[] + { + batch.BatchNr.ToString(), + batch.WaterMeters[0].PurchaseOrder, + //batch.EndTime.ToShortDateString() + " " + batch.EndTime.ToShortTimeString(), + string.Format("{0}.{1}.{2} {3}:{4}", batch.EndTime.Year.ToString("D4"), + batch.EndTime.Month.ToString("D2"), + batch.EndTime.Day.ToString("D2"), + batch.EndTime.Hour.ToString("D2"), + batch.EndTime.Minute.ToString("D2")), + string.IsNullOrEmpty(batch.ProcedureName) ? "" : batch.ProcedureName, + string.IsNullOrEmpty(batch.ProcedureDescription) ? "" : batch.ProcedureDescription, + string.IsNullOrEmpty(batch.WatermetersStr) ? "" : batch.WatermetersStr, + string.IsNullOrEmpty(batch.UserName) ? "" : batch.UserName, + string.IsNullOrEmpty(testBenchName) ? "" : testBenchName, + string.Format("Test Bench Framework ver.{0}", batch.ProgramVersion), + string.IsNullOrEmpty(address1) ? "" : address1, + //batch.AmbientTempAve().ToString("F1") + " °C", // Disabled, see email dated 25.11.2016 + //Config.Units.ConvertTo(Config.Unit.mbar, batch.AmbientPressAve()).ToString("F0") + " mbar", + //batch.AmbientHumiAve().ToString("F0") + " %", + }; + + /// Determine max. left column width in characters + int maxLen = 0; + foreach (var s in leftColumn) if (s.Length > maxLen) maxLen = s.Length; + + /// Write aligned columns + for (int i = 0; i < Math.Min(leftColumn.Length, rightColumn.Length); i++) + { + PrintAt(e, leftMargin, HdrTop + SpacingOne * i, leftColumn[i]); + PrintAt(e, 300, HdrTop + SpacingOne * i, rightColumn[i]); + } + } + + if (documentSection == DocumentSection.FirstPage || documentSection == DocumentSection.OtherPages) + { + ///-------- + /// Body + ///-------- + + /// This variable represents the top coordinate of the area where WM results are printed + /// and it is updated (increased by) the value returned by PrintWM() - the section size. + int nextWmTop = (pageNr == 1) ? BodyTop : TitleY; + + int nrWMsOnPage = (pageNr == 1) ? nrWMsOnFirstPage : nrWMsOnNextPage; + + for (int wmNr = nextWMNr; wmNr < Math.Min(nextWMNr + nrWMsOnPage, batch.WaterMeters.Count); wmNr++) /// wmNr is 0-based + { + int wmPosition = true ? batch.WaterMeters[wmNr].WMPosition : (wmNr + 1); + nextWmTop += PrintWM(e, batch.WaterMeters[wmNr], wmPosition, nextWmTop); + } + + nextWMNr += nrWMsOnPage; + e.HasMorePages = true; + if (nextWMNr < batch.WaterMeters.Count) + { + documentSection = DocumentSection.OtherPages; + } + else + { + documentSection = DocumentSection.Appendix1; + } + + ///---------- + /// Footer + ///---------- + string footerText = string.Format("{0} {1}/{2}", Strings.Page, pageNr++, nrPages); + int footerWidth = (int)e.Graphics.MeasureString(footerText, font).Width; + PrintAt(e, leftMargin + (printWidth - footerWidth) / 2, topMargin + printHeight - SpacingOne, footerText); + } + else + { + ///------------------------------- + /// List of passed water meters + ///------------------------------- + + int nextWmTop = BodyTop; + + foreach (var wm in batch.WaterMeters) + { + if (wm.Passed) + { + PrintAt(e, leftMargin, nextWmTop, string.Format("Vodoměr {0}: s/n {1}", wm.WMPosition, wm.SerialNr)); + nextWmTop += SpacingOne; + } + } + + if (documentSection == DocumentSection.Appendix1) + { + documentSection = DocumentSection.Appendix2; + e.HasMorePages = true; + } + else + { + e.HasMorePages = false; + } + } + } + + + /// + /// Print one water meter results + /// + /// Water meter + /// Number of the water meter printed + /// Top coordinate of watermeter data + /// The height of the printed section + int PrintWM(System.Drawing.Printing.PrintPageEventArgs e, + Results.Entities.WaterMeter wm, int printedWMNr, int top) + { + /// Determin column widths + float[] columnPos = new float[rsltItems.Count + 1]; + columnPos[0] = (float)leftMargin; + + for (int i = 0; i < rsltItems.Count; i++) + { + float columnWidth = e.Graphics.MeasureString(rsltItems[i].ClmnHeaderText, font).Width; + foreach (var mtr in wm.MeterTestRslts) + { + string itemText; + + if (!wm.Compound()) + { + itemText = rsltItems[i].Print(mtr); + } + else if (mtr.CompoundMeterId == (byte)CompoundMeterId.Compound) + { + Results.Entities.MeterTestRslt mainMtr = wm.GetMeterTestRslt(mtr.Name(), CompoundMeterId.CompoundMain); + Results.Entities.MeterTestRslt auxMtr = wm.GetMeterTestRslt(mtr.Name(), CompoundMeterId.CompoundAux); + itemText = rsltItems[i].PrintCombined(mainMtr, auxMtr, mtr); + } + else + { + continue; + } + + /// Strip color information + string[] texts = itemText.Split(new char[] { '|' }); + if (texts.Length == 2) { itemText = texts[0]; } + + float width = e.Graphics.MeasureString(itemText, font).Width; + if (width > columnWidth) columnWidth = width; + } + columnPos[i + 1] = columnPos[i] + columnWidth + 20.0f; + } + int tableLeftX = (int)columnPos[0]; + int tableRightX = (int)columnPos[rsltItems.Count] - 20; + + string wmText = string.Format("Vodoměr {0}", printedWMNr); + PrintAt(e, leftMargin, top, wmText); + if (!string.IsNullOrEmpty(wm.SerialNr)) + { + PrintAt(e, leftMargin + (int)e.Graphics.MeasureString(wmText, font).Width, top, + string.Format(" s/n = {0}", wm.SerialNr)); + } + + /// Horizontal line + int horY = top + 25; + e.Graphics.DrawLine(new Pen(Color.Black, 2), new Point(tableLeftX, horY), new Point(tableRightX, horY)); + + for (int i = 0; i < rsltItems.Count; i++) + { + PrintAt(e, (int)columnPos[i], top + 27, rsltItems[i].ClmnHeaderText); + } + + /// Horizontal line + horY = top + 27 + SpacingOne; + e.Graphics.DrawLine(new Pen(Color.Black, 2), new Point(tableLeftX, horY), new Point(tableRightX, horY)); + + int testsCount = 0; + foreach (var mtr in wm.MeterTestRslts) + { + if (mtr.Publish() == Config.Entities.Publish.Always) + { + testsCount++; + for (int i = 0; i < rsltItems.Count; i++) + { + string itemText; + + if (!wm.Compound()) + { + /// Single water meter + itemText = rsltItems[i].Print(mtr); + } + else if (mtr.CompoundMeterId == (byte)CompoundMeterId.Compound) + { + Results.Entities.MeterTestRslt mainMtr = wm.GetMeterTestRslt(mtr.Name(), CompoundMeterId.CompoundMain); + Results.Entities.MeterTestRslt auxMtr = wm.GetMeterTestRslt(mtr.Name(), CompoundMeterId.CompoundMain); + itemText = rsltItems[i].PrintCombined(mainMtr, auxMtr, mtr); + } + else + { + continue; + } + + /// Strip color information + string[] texts = itemText.Split(new char[] { '|' }); + if (texts.Length == 2) + { + itemText = texts[0]; + Color color = texts[1].Equals("Green") ? Color.Green : (texts[1].Equals("Red") ? Color.Red : Color.White); + /// TODO: How to print colors? + } + + PrintAt(e, (int)columnPos[i], top + 30 + SpacingOne * testsCount, itemText); + } + } + } + + /// Horizontal line + horY = top + 30 + SpacingOne * (testsCount + 1); + e.Graphics.DrawLine(new Pen(Color.Black, 2), new Point(tableLeftX, horY), new Point(tableRightX, horY)); + + return (testsCount + 4) * SpacingOne; + } + + + void PrintAt(System.Drawing.Printing.PrintPageEventArgs e, Point p, string text) + { + PrintAt(e, p.X, p.Y, text); + } + + + void PrintAt(System.Drawing.Printing.PrintPageEventArgs e, int x, int y, string text) + { + RectangleF printArea = new RectangleF(x, y, 667, SpacingOne); + e.Graphics.DrawString(text, this.font, Brushes.Black, printArea); + } + + + void PrintBoldAt(System.Drawing.Printing.PrintPageEventArgs e, Point p, string text) + { + PrintBoldAt(e, p.X, p.Y, text); + } + + + void PrintBoldAt(System.Drawing.Printing.PrintPageEventArgs e, int x, int y, string text) + { + RectangleF printArea = new RectangleF(x, y, 667, SpacingOne); + e.Graphics.DrawString(text, this.boldFont, Brushes.Black, printArea); + } + } +} diff --git a/TBF_V2/Sources/TBF/Results/Output/Printers/Enhanced/EnhancedPrintDocument.cs b/TBF_V2/Sources/TBF/Results/Output/Printers/Enhanced/EnhancedPrintDocument.cs new file mode 100644 index 00000000..36bc686c --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Output/Printers/Enhanced/EnhancedPrintDocument.cs @@ -0,0 +1,317 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Printing; +using System.IO; +using Config.Entities; +using Results.Resources; + +namespace Results.Output.Printers.Enhanced +{ + public class EnhancedPrintDocument : PrintDocument + { + /// Size of the printed area without margins, after taking into account 'pageOrientation' + readonly int printHeight; + readonly int printWidth; + + readonly int topMargin; + readonly int bottomMargin; + readonly int leftMargin; + readonly int TitleX; + readonly int TitleY; /// Depends on the size of the header + + readonly int SpacingOne; + readonly int SpacingOneAndHalf; + readonly int SpacingOne4Header; + readonly int SpacingOneAndHalf4Header; + + readonly int SpacingOne4Footer; + + int CommonTop; /// = TitleY + 60 + int BodyTop; /// = HdrTop + 160 + /// + int titleHeight; + int commonHeight; + + /// + /// Property variable for the Font the user wishes to use + /// + Font titleFont; + Font headerFont; + Font font; + Font footerFont; + + TableStyle style; + + /// + /// Data to print + /// + Results.Entities.Batch batch; + + EnhancedPrinterCfg cfg; + + /// + /// Items to print + /// + string header; + IList commonItems; + IList testItems; + string footer; + + /// + /// Layout and status + /// + int nrWMsOnFirstPage; + int nrWMsOnNextPage; + int nextWMNr; /// nr. of watermeter to be printed as the first one on the next page + int nrPages; + int pageNr; /// Page number to be printed at the bottom of the page + + + /// + /// Constructor + /// + /// Text to be printed + public EnhancedPrintDocument(Results.Entities.Batch batch, EnhancedPrinterCfg cfg, string documentName) + { + this.batch = batch; + this.cfg = cfg; + DocumentName = documentName; + + topMargin = cfg.TopMargin; + bottomMargin = cfg.BottomMargin; + leftMargin = cfg.LeftMargin; + + header = string.IsNullOrEmpty(cfg.Header) ? string.Empty : cfg.Header.Replace("~", Environment.NewLine); + commonItems = Results.WMeterRsltItemSpec.FromStrArray(cfg.CommonItems); + testItems = Results.WMeterRsltItemSpec.FromStrArray(cfg.TestItems); /// TestID info will be overwritten later on + footer = string.IsNullOrEmpty(cfg.Footer) ? string.Empty : cfg.Footer.Replace("~", Environment.NewLine); + + /// Initialize fonts + titleFont = new Font((cfg.TitFntFml != null ? cfg.TitFntFml : "Arial"), (cfg.TitFntSz > 0 ? cfg.TitFntSz : 10), (FontStyle)cfg.TitFntSty); + headerFont = new Font((cfg.HdrFntFml != null ? cfg.HdrFntFml : "Arial"), (cfg.HdrFntSz > 0 ? cfg.HdrFntSz : 10), (FontStyle)cfg.HdrFntSty); + font = new Font((cfg.BodyFntFml != null ? cfg.BodyFntFml : "Arial"), (cfg.BodyFntSz > 0 ? cfg.BodyFntSz : 10), (FontStyle)cfg.BodyFntSty); + footerFont = new Font((cfg.FooterFntFml != null ? cfg.FooterFntFml : "Arial"), (cfg.FooterFntSz > 0 ? cfg.FooterFntSz : 10), (FontStyle)cfg.FooterFntSty); + + /// Table style of one water meter table where tests are rows + style = new TableStyle + { + Font = font, + HeaderFont = headerFont, + MarginX = 5, + MarginY = 3, + LineWidth = 1, + TopHeadersCount = 1, + HorizLines = TableLines.FirstSecondAndLast, + VertLines = TableLines.All + }; + + /// Set print area size and margins (in dots using 100 dpi) + DefaultPageSettings.Landscape = (cfg.PageOrientation == PageOrientation.Landscape); + /// + if (DefaultPageSettings.Landscape) + { + printHeight = base.DefaultPageSettings.PaperSize.Width - topMargin - bottomMargin; + printWidth = base.DefaultPageSettings.PaperSize.Height - leftMargin - leftMargin; + } + else + { + printHeight = base.DefaultPageSettings.PaperSize.Height - topMargin - bottomMargin; + printWidth = base.DefaultPageSettings.PaperSize.Width - leftMargin - leftMargin; + } + + /// Document outline preliminary calculations + SpacingOne = System.Windows.Forms.TextRenderer.MeasureText("Abcgq", font).Height; + SpacingOneAndHalf = (3 * SpacingOne) / 2; + SpacingOne4Header = System.Windows.Forms.TextRenderer.MeasureText("Abcgq", headerFont).Height; + SpacingOneAndHalf4Header = (3 * SpacingOne4Header) / 2; + SpacingOne4Footer = System.Windows.Forms.TextRenderer.MeasureText("Abcgq", footerFont).Height; + + TitleX = cfg.LeftMargin; + TitleY = cfg.TopMargin; + + pageNr = 1; + nextWMNr = 0; + } + + /// + /// Override the default onbeginPrint method of the PrintDocument Object + /// + /// + /// + protected override void OnBeginPrint(System.Drawing.Printing.PrintEventArgs e) + { + base.OnBeginPrint(e); + } + + /// + /// Override the default OnPrintPage method of the PrintDocument. + /// + /// + /// This provides the print logic for our document + protected override void OnPrintPage(System.Drawing.Printing.PrintPageEventArgs e) + { + /// Run base code + base.OnPrintPage(e); + + if (!string.IsNullOrEmpty(cfg.Template)) + { + string templatePath = Path.Combine("C:\\TBF\\Templates\\", cfg.Template); + if (File.Exists(templatePath)) + { + if (cfg.PageOrientation == PageOrientation.Portrait) + e.Graphics.DrawImage(new Bitmap(Image.FromFile(templatePath), 827, 1169), new Rectangle(0, 0, 827, 1169)); + else + e.Graphics.DrawImage(new Bitmap(Image.FromFile(templatePath), 1169, 827), new Rectangle(0, 0, 1169, 827)); + } + } + + /// Use the StringFormat class for the text layout of our document + StringFormat format = new StringFormat(StringFormatFlags.LineLimit); + + if (pageNr == 1) + { + ///---------- + /// Prepare document outline + ///---------- + titleHeight = System.Windows.Forms.TextRenderer.MeasureText(header, titleFont).Height; + CommonTop = TitleY + titleHeight + SpacingOne4Header; + + commonHeight = commonItems.Count * SpacingOne; + BodyTop = CommonTop + commonHeight + SpacingOne4Header; + + Table table0 = Table.Create_TestsAreRows(batch.WaterMeters[0], testItems, style); + SizeF tableSize = table0.Measure(e); + int wmSectionHeight = (int)tableSize.Height + 3 * SpacingOne4Header; + + nrWMsOnFirstPage = (printHeight - BodyTop + TitleY - 2 * SpacingOne) / wmSectionHeight; + nrWMsOnNextPage = (printHeight - 2 * SpacingOne) / wmSectionHeight; + nrWMsOnNextPage = Math.Max(nrWMsOnNextPage, 1); /// Prevent division by zero if there are too many WM tests + + nrPages = 1 + (batch.WaterMeters.Count - nrWMsOnFirstPage + nrWMsOnNextPage - 1) / nrWMsOnNextPage; + + + ///---------- + /// Title + ///---------- + RectangleF printArea = new RectangleF(TitleX, TitleY, printWidth, titleHeight); + e.Graphics.DrawString(header, titleFont, Brushes.Black, printArea); + + ///---------------- + /// Common items + ///---------------- + string[] leftColumn = new string[commonItems.Count]; + string[] rightColumn = new string[commonItems.Count]; + + int cnt = 0; + foreach (var v in commonItems) + { + leftColumn[cnt] = v.Caption; + rightColumn[cnt] = (batch.WaterMeters.Count > 0) ? v.Print(batch.WaterMeters[0]) : string.Empty; + cnt++; + } + + /// Determine max. left column width in characters + int maxLen = 0; + foreach (var s in leftColumn) if (s.Length > maxLen) maxLen = s.Length; + + /// Write aligned columns + for (int i = 0; i < Math.Min(leftColumn.Length, rightColumn.Length); i++) + { + PrintAt(e, leftMargin, CommonTop + SpacingOne * i, leftColumn[i]); + PrintAt(e, 300, CommonTop + SpacingOne * i, rightColumn[i]); + } + } + + ///-------- + /// Body + ///-------- + + /// This variable represents the top coordinate of the area where WM results are printed + /// and it is updated (increased by) the value returned by PrintXyzWM() - the section size. + int nextWmTop = (pageNr == 1) ? BodyTop : TitleY; + + int nrWMsOnPage = (pageNr == 1) ? nrWMsOnFirstPage : nrWMsOnNextPage; + + for (int wmNr = nextWMNr; wmNr < Math.Min(nextWMNr + nrWMsOnPage, batch.WaterMeters.Count); wmNr++) /// wmNr is 0-based + { + int wmPosition = true ? batch.WaterMeters[wmNr].WMPosition : (wmNr + 1); + nextWmTop = (int)PrintWM(e, batch.WaterMeters[wmNr], wmPosition, nextWmTop) + SpacingOneAndHalf4Header; + } + + nextWMNr += nrWMsOnPage; + e.HasMorePages = (nextWMNr < batch.WaterMeters.Count); + + ///---------- + /// Footer + ///---------- + int footerWidth = (int)e.Graphics.MeasureString(footer, footerFont).Width; + PrintFooterAt(e, leftMargin + (printWidth - footerWidth) / 2, topMargin + printHeight - 2 * SpacingOne, footer); + + string pageNrText = string.Format("{0} {1}/{2}", Strings.Page, pageNr++, nrPages); + int pageNrWidth = (int)e.Graphics.MeasureString(pageNrText, font).Width; + PrintAt(e, leftMargin + (printWidth - pageNrWidth) / 2, topMargin + printHeight - SpacingOne, pageNrText); + } + + + /// + /// Print one water meter results + /// + /// Water meter + /// Number of the water meter printed + /// Top coordinate of watermeter data + /// The height of the printed section + float PrintWM(System.Drawing.Printing.PrintPageEventArgs e, + Results.Entities.WaterMeter wm, int printedWMNr, int top) + { + /// Print the water meter number and the serial number + string wmText = string.Format("{0} {1}", Strings.Water_Meter, printedWMNr); + PrintHeaderAt(e, leftMargin, top, wmText); + if (!string.IsNullOrEmpty(wm.SerialNr)) + { + PrintHeaderAt(e, leftMargin + (int)e.Graphics.MeasureString(wmText, headerFont).Width, top, + string.Format(" {0} = {1}", Strings.sn, wm.SerialNr)); + } + + Table table = Table.Create_TestsAreRows(wm, testItems, style); + + return table.Draw(e, leftMargin, top + SpacingOneAndHalf4Header); + } + + + void PrintAt(System.Drawing.Printing.PrintPageEventArgs e, Point p, string text) + { + PrintAt(e, p.X, p.Y, text); + } + void PrintAt(System.Drawing.Printing.PrintPageEventArgs e, int x, int y, string text) + { + RectangleF printArea = new RectangleF(x, y, 2000, SpacingOne); + e.Graphics.DrawString(text, this.font, Brushes.Black, printArea); + } + + + void PrintHeaderAt(System.Drawing.Printing.PrintPageEventArgs e, Point p, string text) + { + PrintHeaderAt(e, p.X, p.Y, text); + } + void PrintHeaderAt(System.Drawing.Printing.PrintPageEventArgs e, int x, int y, string text) + { + RectangleF printArea = new RectangleF(x, y, 2000, SpacingOne4Header); + e.Graphics.DrawString(text, this.headerFont, Brushes.Black, printArea); + } + + + void PrintFooterAt(System.Drawing.Printing.PrintPageEventArgs e, Point p, string text) + { + PrintFooterAt(e, p.X, p.Y, text); + } + void PrintFooterAt(System.Drawing.Printing.PrintPageEventArgs e, int x, int y, string text) + { + RectangleF printArea = new RectangleF(x, y, 2000, SpacingOne4Footer); + e.Graphics.DrawString(text, this.footerFont, Brushes.Black, printArea); + } + } +} diff --git a/TBF_V2/Sources/TBF/Results/Output/Printers/Enhanced/EnhancedPrinterCfg.cs b/TBF_V2/Sources/TBF/Results/Output/Printers/Enhanced/EnhancedPrinterCfg.cs new file mode 100644 index 00000000..9635f68f --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Output/Printers/Enhanced/EnhancedPrinterCfg.cs @@ -0,0 +1,34 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// + +namespace Results.Output.Printers.Enhanced +{ + public class EnhancedPrinterCfg + { + public Config.Entities.PageOrientation PageOrientation; + public string Template; + public int TopMargin; + public int BottomMargin; + public int LeftMargin; + public string TitFntFml; + public int TitFntSz; + public int TitFntSty; + public string HdrFntFml; + public int HdrFntSz; + public int HdrFntSty; + public string BodyFntFml; + public int BodyFntSz; + public int BodyFntSty; + public string FooterFntFml; + public int FooterFntSz; + public int FooterFntSty; + public bool GoodOnly; + public bool SupressPrinting; /// Bypass printing when true + public System.Globalization.CultureInfo CultureInfo; + public string Header; /// =Title + public string[] CommonItems; + public string[] TestItems; + public string Footer; + } +} diff --git a/TBF_V2/Sources/TBF/Results/Output/Printers/Munich/MunichPrintDocument.cs b/TBF_V2/Sources/TBF/Results/Output/Printers/Munich/MunichPrintDocument.cs new file mode 100644 index 00000000..3215a87b --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Output/Printers/Munich/MunichPrintDocument.cs @@ -0,0 +1,451 @@ +/// +/// Copyright (c) 2016-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Printing; +using Config.Entities; + +namespace Results.Output.Printers.Munich +{ + public class MunichPrintDocument : PrintDocument + { + const string FontFamilyName = "Arial"; ///"Times New Roman"; + + const int SpacingOne = 18; + const int SpacingOneAndHalf = 24; /// was 27 before + const int TitleX = 240; + const int TitleY = 180; /// Depends on the size of the header + const int FirstLineNr = 14; /// Depends on the size of the header + const int Tab1 = 80; /// Positions of columns above the table + const int Tab2 = 240; + const int Tab3 = 430; + const int Tab4 = 590; + const int BorderW = 1; /// Table border line width + const int MarginTop = 7; /// Margins of the text from table lines + const int MarginLeft = 4; /// Margins of the text from table lines + + /// + /// Data to print + /// + readonly string docVersion; + readonly Results.Entities.WaterMeter wm; + string zaehlertyp; + string pruefvorlage; + + readonly IList results; + readonly int resultsCount; + readonly bool compound; /// true when MetersKind is MetersKind.Combined + + /// Top coordinate of the table + int nrPages; + int pageNr; + int firstTblTop; + int secondTblTop; + + /// + /// Property variable for the Font the user wishes to use + /// + Font font; + Font boldFont; + Font fontTitle; + + /// + /// Constructor + /// + /// Text to be printed + public MunichPrintDocument(string docVersion, + Results.Entities.WaterMeter wm, + PageOrientation pageOrientation) + { + this.docVersion = docVersion; + this.wm = wm; + compound = wm.Compound(); + + string[] info = wm.ProductName().Split(new char[] { ';' }); + if (info.Length >= 2) + { + pruefvorlage = info[0]; + zaehlertyp = info[1]; + } + else if (info.Length == 1) + { + pruefvorlage = info[0]; + zaehlertyp = compound ? "Verbundzähler" : "Einzelzähler"; + } + else + { + pruefvorlage = wm.ProcedureName(); + zaehlertyp = compound ? "Verbundzähler" : "Einzelzähler"; + } + + results = wm.MeterTestRslts; + this.resultsCount = compound ? (results.Count / 3) : results.Count; + + int resultsCount = wm.MeterTestRslts.Count; + if (compound) resultsCount /= 3; + + pageNr = 1; + nrPages = (compound ? (resultsCount > 7) : (resultsCount > 9)) ? 2 : 1; + + DefaultPageSettings.Landscape = (pageOrientation == PageOrientation.Landscape); + } + + /// + /// Override the default onbeginPrint method of the PrintDocument Object. + /// + /// + /// + protected override void OnBeginPrint(System.Drawing.Printing.PrintEventArgs e) + { + base.OnBeginPrint(e); + + if (font == null) { font = new Font(FontFamilyName, 10, FontStyle.Regular); } + if (boldFont == null) { boldFont = new Font(FontFamilyName, 10, FontStyle.Bold); } + if (fontTitle == null) { fontTitle = new Font(FontFamilyName, 24, FontStyle.Bold); } + } + + /// + /// Override the default OnPrintPage method of the PrintDocument. + /// + /// + /// This provides the print logic for our document + protected override void OnPrintPage(System.Drawing.Printing.PrintPageEventArgs e) + { + /// Run base code + base.OnPrintPage(e); + + /// Draw 2550 x 3507 'headpic' scaled to A4 at 100 DPI + e.Graphics.DrawImage(Results.Properties.Resources.Headpic, new Rectangle(0, 0, 827, 1137)); + + /// Set print area size and margins (in dots using 80 dpi) + int printHeight = base.DefaultPageSettings.PaperSize.Height - base.DefaultPageSettings.Margins.Top - base.DefaultPageSettings.Margins.Bottom; + int printWidth = base.DefaultPageSettings.PaperSize.Width - base.DefaultPageSettings.Margins.Left - base.DefaultPageSettings.Margins.Right; + int leftMargin = base.DefaultPageSettings.Margins.Left; /// X + int topMargin = base.DefaultPageSettings.Margins.Top; /// Y + + /// Check if the user selected to print in Landscape mode + /// if they did then we need to swap height/width parameters + if (base.DefaultPageSettings.Landscape) + { + int tmp = printHeight; + printHeight = printWidth; + printWidth = tmp; + } + + int x = leftMargin; + int y = topMargin; + + /// Use the StringFormat class for the text layout of our document + StringFormat format = new StringFormat(StringFormatFlags.LineLimit); + + int lineNr = FirstLineNr; + + if (pageNr == 1) + { + RectangleF printArea = new RectangleF(TitleX, TitleY, 667, 50); + e.Graphics.DrawString(wm.Batch.ProtocolTitle, this.fontTitle, Brushes.Black, printArea); + + /// + /// Common + /// + PrintAt(e, Tab1, lineNr * SpacingOne, docVersion); + lineNr++; + PrintBoldAt(e, Tab1, lineNr * SpacingOne, "Prüfstand Nr :"); + PrintBoldAt(e, Tab2, lineNr * SpacingOne, wm.BenchId().ToString()); + PrintBoldAt(e, Tab3, lineNr * SpacingOne, "Datum :"); + PrintBoldAt(e, Tab4, lineNr * SpacingOne, wm.Batch.EndTime.Date.ToString("d")); + lineNr++; + PrintAt(e, Tab1, lineNr * SpacingOne, "Zählertyp :"); + PrintAt(e, Tab2, lineNr * SpacingOne, zaehlertyp); + PrintAt(e, Tab3, lineNr * SpacingOne, "Eichjahr :"); + PrintAt(e, Tab4, lineNr * SpacingOne, wm.YearOfProduction.ToString()); + lineNr++; + PrintAt(e, Tab1, lineNr * SpacingOne, "Prüfvorlage :"); + PrintAt(e, Tab2, lineNr * SpacingOne, pruefvorlage); + lineNr += 2; + + if (compound) + { + PrintBoldAt(e, Tab1, lineNr * SpacingOne, "Hauptzahler"); + PrintBoldAt(e, Tab3, lineNr * SpacingOne, "Nebenzahler"); + lineNr++; + } + + PrintAt(e, Tab1, lineNr * SpacingOne, "Hersteller :"); + PrintAt(e, Tab2, lineNr * SpacingOne, wm.Producer()); + if (compound) + { + PrintAt(e, Tab3, lineNr * SpacingOne, "Hersteller :"); + PrintAt(e, Tab4, lineNr * SpacingOne, wm.ProducerAux()); + } + lineNr++; + + PrintAt(e, Tab1, lineNr * SpacingOne, "Seriennummer :"); + PrintAt(e, Tab2, lineNr * SpacingOne, wm.SerialNr); + if (compound) + { + PrintAt(e, Tab3, lineNr * SpacingOne, "Seriennummer :"); + PrintAt(e, Tab4, lineNr * SpacingOne, wm.SerialNrAux); + } + lineNr++; + + PrintAt(e, Tab1, lineNr * SpacingOne, wm.NewQnames() ? "Q3 :" : "Qn :"); + PrintAt(e, Tab2, lineNr * SpacingOne, wm.Q3_Qn().ToString()); + if (compound) + { + PrintAt(e, Tab3, lineNr * SpacingOne, wm.NewQnames() ? "Q3 :" : "Qn :"); + PrintAt(e, Tab4, lineNr * SpacingOne, wm.Q3_Qn_Aux().ToString()); + } + lineNr++; + + PrintAt(e, Tab1, lineNr * SpacingOne, "Zulassungszeichen :"); + PrintAt(e, Tab2, lineNr * SpacingOne, wm.ApprovalInfo()); + if (compound) + { + PrintAt(e, Tab3, lineNr * SpacingOne, "Zulassungszeichen :"); + PrintAt(e, Tab4, lineNr * SpacingOne, wm.ApprovalInfoAux()); + } + lineNr++; + + PrintAt(e, Tab1, lineNr * SpacingOne, "Metr. klasse :"); + PrintAt(e, Tab2, lineNr * SpacingOne, wm.MetrologicalClass()); + if (compound) + { + PrintAt(e, Tab3, lineNr * SpacingOne, "Metr. klasse :"); + PrintAt(e, Tab4, lineNr * SpacingOne, wm.MetrologicalClassAux()); + } + lineNr++; + + PrintAt(e, Tab1, lineNr * SpacingOne, "Stand :"); + PrintAt(e, Tab2, lineNr * SpacingOne, wm.EndState); + if (compound) + { + PrintAt(e, Tab3, lineNr * SpacingOne, "Stand :"); + PrintAt(e, Tab4, lineNr * SpacingOne, wm.EndStateAux); + + lineNr += 2; + PrintAt(e, Tab1, lineNr * SpacingOne, "Umschaltpunkte :"); + lineNr++; + PrintAt(e, Tab1, lineNr * SpacingOne, "Qsteig"); + PrintAt(e, Tab2, lineNr * SpacingOne, (1000.0 * wm.QRise).ToString("F1") + " l/h"); + lineNr++; + PrintAt(e, Tab1, lineNr * SpacingOne, "Qfall"); + PrintAt(e, Tab2, lineNr * SpacingOne, (1000.0 * wm.QFall).ToString("F1") + " l/h"); + } + + lineNr += 2; + firstTblTop = SpacingOne * lineNr; + + /// + /// Table 1 + /// + PrintTableOne(e, firstTblTop); + DrawTableFrame(e, resultsCount + 1, firstTblTop); + } + + + if (pageNr == nrPages) + { + if (pageNr == 1) + { + secondTblTop = firstTblTop + (resultsCount + 2) * SpacingOneAndHalf; + lineNr += ((resultsCount + 2) * SpacingOneAndHalf * 2) / SpacingOne; + } + else + { + lineNr -= 3; + + if (compound) + { + PrintBoldAt(e, Tab1, lineNr * SpacingOne, "Hauptzahler"); + PrintBoldAt(e, Tab3, lineNr * SpacingOne, "Nebenzahler"); + lineNr++; + } + + PrintAt(e, Tab1, lineNr * SpacingOne, "Hersteller :"); + PrintAt(e, Tab2, lineNr * SpacingOne, wm.Producer()); + if (compound) + { + PrintAt(e, Tab3, lineNr * SpacingOne, "Hersteller :"); + PrintAt(e, Tab4, lineNr * SpacingOne, wm.ProducerAux()); + } + lineNr++; + + PrintAt(e, Tab1, lineNr * SpacingOne, "Seriennummer :"); + PrintAt(e, Tab2, lineNr * SpacingOne, wm.SerialNr); + if (compound) + { + PrintAt(e, Tab3, lineNr * SpacingOne, "Seriennummer :"); + PrintAt(e, Tab4, lineNr * SpacingOne, wm.SerialNrAux); + } + lineNr += ((resultsCount + 2) * SpacingOneAndHalf) / SpacingOne + 2; + + secondTblTop = TitleY + (compound ? 5 : 4) * SpacingOne; + } + + /// + /// Table 2 + /// + PrintTableTwo(e, secondTblTop); + DrawTableFrame(e, resultsCount + 1, secondTblTop); + + /// + /// Footer + /// + PrintAt(e, Tab1, lineNr * SpacingOne, "Temperatur"); + PrintAt(e, Tab2, lineNr * SpacingOne, wm.Batch.AmbTempMean().ToString("F1") + " \x00b0C"); + lineNr++; + PrintAt(e, Tab1, lineNr * SpacingOne, "Feuchtigkeit"); + PrintAt(e, Tab2, lineNr * SpacingOne, wm.Batch.AmbHumiMean().ToString("F0") + " %"); + lineNr++; + PrintAt(e, Tab1, lineNr * SpacingOne, "Luftdruck"); + PrintAt(e, Tab2, lineNr * SpacingOne, Config.Units.ConvertTo(Config.Unit.mbar, wm.Batch.AmbPressMean()).ToString("F0") + " mbar"); + + lineNr++; + PrintAt(e, Tab3, lineNr * SpacingOne, wm.Batch.EndTime.Date.ToString("d")); + lineNr++; + PrintAt(e, Tab3, lineNr * SpacingOne, "Datum"); + PrintAt(e, Tab4, lineNr * SpacingOne, "Unterschrift"); + } + + e.HasMorePages = (pageNr != nrPages); + pageNr++; + } + + /// + /// Print table texts. + /// + void PrintTableOne(System.Drawing.Printing.PrintPageEventArgs e, int tblTop) + { + PrintAt(e, GetTabItemPos(0, 0, tblTop), "Prüflauf"); + PrintAt(e, GetTabItemPos(0, 1, tblTop), "Q [l/h]"); + PrintAt(e, GetTabItemPos(0, 2, tblTop), "Prüf-Vol.[l]"); + PrintAt(e, GetTabItemPos(0, 3, tblTop), compound ? "HZ-Vol.[l]" : "Z-Vol.[l]"); + PrintAt(e, GetTabItemPos(0, 4, tblTop), compound ? "NZ-Vol.[l]" : "-"); + PrintAt(e, GetTabItemPos(0, 5, tblTop), "Fehler [%]"); + PrintAt(e, GetTabItemPos(0, 6, tblTop), "Ergebnis"); + + int rowCnt = 1; + foreach (var mtr in wm.MeterTestRslts) + { + if (!compound || mtr.CompoundMeterId == (byte)CompoundMeterId.Compound) + { + PrintAt(e, GetTabItemPos(rowCnt, 0, tblTop), mtr.Name()); + PrintAt(e, GetTabItemPos(rowCnt, 1, tblTop), mtr.TestRslt.FlowMass.ToString("F1")); + PrintAt(e, GetTabItemPos(rowCnt, 2, tblTop), mtr.TestRslt.VolumeCTV.ToString("F2")); + if (compound) + { + Results.Entities.MeterTestRslt mainMtr = wm.GetMeterTestRslt(mtr.Name(), CompoundMeterId.CompoundMain); + Results.Entities.MeterTestRslt auxMtr = wm.GetMeterTestRslt(mtr.Name(), CompoundMeterId.CompoundAux); + + PrintAt(e, GetTabItemPos(rowCnt, 3, tblTop), mainMtr.VolumeMeter.ToString("F2")); + PrintAt(e, GetTabItemPos(rowCnt, 4, tblTop), auxMtr.VolumeMeter.ToString("F2")); + PrintAt(e, GetTabItemPos(rowCnt, 5, tblTop), mtr.Error.ToString("F2")); + PrintAt(e, GetTabItemPos(rowCnt, 6, tblTop), mtr.Passed ? "iO" : "NiO"); + } + else + { + PrintAt(e, GetTabItemPos(rowCnt, 3, tblTop), mtr.VolumeMeter.ToString("F2")); + PrintAt(e, GetTabItemPos(rowCnt, 4, tblTop), "-"); + PrintAt(e, GetTabItemPos(rowCnt, 5, tblTop), mtr.Error.ToString("F2")); + PrintAt(e, GetTabItemPos(rowCnt, 6, tblTop), mtr.Passed ? "iO" : "NiO"); + } + + rowCnt++; + } + } + } + + void PrintTableTwo(System.Drawing.Printing.PrintPageEventArgs e, int tblTop) + { + PrintAt(e, GetTabItemPos(0, 1, tblTop), "Q [l/h]"); + PrintAt(e, GetTabItemPos(0, 2, tblTop), "Temperatur"); + PrintAt(e, GetTabItemPos(0, 3, tblTop), "Dichte"); + PrintAt(e, GetTabItemPos(0, 4, tblTop), "Prüfzeit"); + PrintAt(e, GetTabItemPos(0, 5, tblTop), "Druck Eing."); + PrintAt(e, GetTabItemPos(0, 6, tblTop), "Druck Ausg."); + + int rowCnt = 1; + foreach (var mtr in wm.MeterTestRslts) + { + if (!compound || mtr.CompoundMeterId == (byte)CompoundMeterId.Compound) + { + Point p = GetTabItemPos(rowCnt, 0, tblTop); + PrintAt(e, p.X, p.Y, mtr.Name()); + + PrintAt(e, GetTabItemPos(rowCnt, 1, tblTop), mtr.TestRslt.FlowMass.ToString("F1")); + PrintAt(e, GetTabItemPos(rowCnt, 2, tblTop), mtr.TestRslt.TempDownMean.ToString("F2")); + PrintAt(e, GetTabItemPos(rowCnt, 3, tblTop), mtr.TestRslt.DensityDiv.ToString("F2")); + PrintAt(e, GetTabItemPos(rowCnt, 4, tblTop), mtr.TestTime.ToString("F1")); + PrintAt(e, GetTabItemPos(rowCnt, 5, tblTop), Config.Units.ConvertTo(Config.Unit.bar, mtr.TestRslt.PressUpMean).ToString("F3")); + PrintAt(e, GetTabItemPos(rowCnt, 6, tblTop), Config.Units.ConvertTo(Config.Unit.bar, mtr.TestRslt.PressDownMean).ToString("F3")); + + rowCnt++; + } + } + } + + /// + /// Draw table lines. + /// + void DrawTableFrame(System.Drawing.Printing.PrintPageEventArgs e, int rowsCount, int tblTop) + { + int t = tblTop; + int m = tblTop + SpacingOneAndHalf; + int b = tblTop + rowsCount * SpacingOneAndHalf; + + // Horizontal lines + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(80, t), new Point(747, t)); + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(80, m), new Point(747, m)); + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(80, b), new Point(747, b)); + + // Vertical lines + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point( 80, t), new Point( 80, b)); + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(267, t), new Point(267, b)); + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(347, t), new Point(347, b)); + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(427, t), new Point(427, b)); + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(507, t), new Point(507, b)); + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(587, t), new Point(587, b)); + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(667, t), new Point(667, b)); + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(747, t), new Point(747, b)); + } + + + void PrintAt(System.Drawing.Printing.PrintPageEventArgs e, Point p, string text) + { + PrintAt(e, p.X, p.Y, text); + } + + void PrintAt(System.Drawing.Printing.PrintPageEventArgs e, int x, int y, string text) + { + RectangleF printArea = new RectangleF(x, y, 667, SpacingOne); + e.Graphics.DrawString(text, this.font, Brushes.Black, printArea); + } + + void PrintBoldAt(System.Drawing.Printing.PrintPageEventArgs e, Point p, string text) + { + PrintBoldAt(e, p.X, p.Y, text); + } + + void PrintBoldAt(System.Drawing.Printing.PrintPageEventArgs e, int x, int y, string text) + { + RectangleF printArea = new RectangleF(x, y, 667, SpacingOne); + e.Graphics.DrawString(text, this.boldFont, Brushes.Black, printArea); + } + + /// + /// Get text position form a number of the test and a number of the parameter. + /// + /// + /// Table column (0-based) + /// + Point GetTabItemPos(int row, int column, int tblTop) + { + int x = MarginLeft + ((column == 0) ? 80 : 187) + column * 80; /// leftmost column is wider + int y = MarginTop + tblTop + (row * SpacingOneAndHalf) - 2; + return new Point(x, y); + } + } +} diff --git a/TBF_V2/Sources/TBF/Results/Output/Printers/OnePerMeter/OnePerMeterPrintDocument.cs b/TBF_V2/Sources/TBF/Results/Output/Printers/OnePerMeter/OnePerMeterPrintDocument.cs new file mode 100644 index 00000000..773e4f51 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Output/Printers/OnePerMeter/OnePerMeterPrintDocument.cs @@ -0,0 +1,349 @@ +/// +/// Copyright (c) 2017-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Printing; +using System.IO; +using Config.Entities; +using Results.Resources; + +namespace Results.Output.Printers.OnePerMeter +{ + public class OnePerMeterPrintDocument : PrintersCommon + { + const float GapBetweenTableColumns = 10; + const float GapBetweenCommonColumns = 10; + + /// Size of the printed area without margins, after taking into account 'pageOrientation' + readonly int printHeight; + readonly int printWidth; + + readonly int topMargin; + readonly int bottomMargin; + readonly int leftMargin; + readonly int TitleX; + readonly int TitleY; /// Depends on the size of the header + + readonly int spacingOne; + readonly int spacingOne4Header; + + float titleHeight; + + /// + /// Property variable for the Font the user wishes to use + /// + Font titleFont; + Font headerFont; + Font font; + Font footerFont; + + /// + /// Data to print + /// + Results.Entities.Batch batch; + OnePerMeterPrinterCfg cfg; + Results.Entities.WaterMeter wm; + + /// + /// Items to print + /// + string header; + IList commonItems1; + IList commonItems2; + IList commonItems3; + IList testItems; + IList testItems2; + IList belowItems1; + IList belowItems2; + IList belowItems3; + string footer; + + int nrPages; + int pageNr; /// Page number to be printed at the bottom of the page + + /// + /// Constructor + /// + /// Text to be printed + public OnePerMeterPrintDocument(Results.Entities.Batch batch, OnePerMeterPrinterCfg cfg, Results.Entities.WaterMeter wm, string documentName) + { + this.batch = batch; + this.cfg = cfg; + this.wm = wm; + DocumentName = documentName; + + topMargin = cfg.TopMargin; + bottomMargin = cfg.BottomMargin; + leftMargin = cfg.LeftMargin; + + header = string.IsNullOrEmpty(cfg.Header) ? string.Empty : cfg.Header.Replace("~", Environment.NewLine); + commonItems1 = Results.WMeterRsltItemSpec.FromStrArray(cfg.CommonItems1); + commonItems2 = Results.WMeterRsltItemSpec.FromStrArray(cfg.CommonItems2); + commonItems3 = Results.WMeterRsltItemSpec.FromStrArray(cfg.CommonItems3); + testItems = Results.WMeterRsltItemSpec.FromStrArray(cfg.TestItems); /// TestID info will be overwritten later on + testItems2 = Results.WMeterRsltItemSpec.FromStrArray(cfg.TestItems2); /// TestID info will be overwritten later on + belowItems1 = Results.WMeterRsltItemSpec.FromStrArray(cfg.BelowItems1); + belowItems2 = Results.WMeterRsltItemSpec.FromStrArray(cfg.BelowItems2); + belowItems3 = Results.WMeterRsltItemSpec.FromStrArray(cfg.BelowItems3); + footer = string.IsNullOrEmpty(cfg.Footer) ? string.Empty : cfg.Footer.Replace("~", Environment.NewLine); + + /// Initialize fonts + titleFont = new Font((cfg.TitFntFml != null ? cfg.TitFntFml : "Arial"), (cfg.TitFntSz > 0 ? cfg.TitFntSz : 10), (FontStyle)cfg.TitFntSty); + headerFont = new Font((cfg.HdrFntFml != null ? cfg.HdrFntFml : "Arial"), (cfg.HdrFntSz > 0 ? cfg.HdrFntSz : 10), (FontStyle)cfg.HdrFntSty); + font = new Font((cfg.BodyFntFml != null ? cfg.BodyFntFml : "Arial"), (cfg.BodyFntSz > 0 ? cfg.BodyFntSz : 10), (FontStyle)cfg.BodyFntSty); + footerFont = new Font((cfg.FooterFntFml != null ? cfg.FooterFntFml : "Arial"), (cfg.FooterFntSz > 0 ? cfg.FooterFntSz : 10), (FontStyle)cfg.FooterFntSty); + + /// Set print area size and margins (in dots using 100 dpi) + DefaultPageSettings.Landscape = (cfg.PageOrientation == PageOrientation.Landscape); + /// + if (DefaultPageSettings.Landscape) + { + printHeight = base.DefaultPageSettings.PaperSize.Width - topMargin - bottomMargin; + printWidth = base.DefaultPageSettings.PaperSize.Height - leftMargin - leftMargin; + } + else + { + printHeight = base.DefaultPageSettings.PaperSize.Height - topMargin - bottomMargin; + printWidth = base.DefaultPageSettings.PaperSize.Width - leftMargin - leftMargin; + } + + spacingOne = System.Windows.Forms.TextRenderer.MeasureText("Abcgq", font).Height; + spacingOne4Header = System.Windows.Forms.TextRenderer.MeasureText("Abcgq", headerFont).Height; + + /// Prepare document outline + TitleX = cfg.LeftMargin; + TitleY = cfg.TopMargin; + + pageNr = 1; + nrPages = (testItems2.Count != 0) ? 2 : 1; + } + + /// + /// Override the default onbeginPrint method of the PrintDocument Object + /// + /// + /// + protected override void OnBeginPrint(System.Drawing.Printing.PrintEventArgs e) + { + base.OnBeginPrint(e); + } + + /// + /// Override the default OnPrintPage method of the PrintDocument. + /// + /// + /// This provides the print logic for our document + protected override void OnPrintPage(System.Drawing.Printing.PrintPageEventArgs e) + { + /// Run base code + base.OnPrintPage(e); + + if (!string.IsNullOrEmpty(cfg.Template)) + { + string templatePath = Path.Combine("C:\\TBF\\Templates\\", cfg.Template); + if (File.Exists(templatePath)) + { + if (cfg.PageOrientation == PageOrientation.Portrait) + e.Graphics.DrawImage(new Bitmap(Image.FromFile(templatePath), 827, 1169), new Rectangle(0, 0, 827, 1169)); + else + e.Graphics.DrawImage(new Bitmap(Image.FromFile(templatePath), 1169, 827), new Rectangle(0, 0, 1169, 827)); + } + } + + float tableTop = cfg.TopMargin; + + if (pageNr == 1) + { + /// First page + + /// + /// Print water meter picture + /// + if (cfg.ImgWid != 0 && cfg.ImgHgh != 0 && cfg.ImgFullPathName != null) + { + try + { + e.Graphics.DrawImage(new Bitmap(Image.FromFile(cfg.ImgFullPathName), cfg.ImgWid, cfg.ImgHgh), + new Rectangle(cfg.ImgLeft, cfg.ImgTop, cfg.ImgWid, cfg.ImgHgh)); + } + catch (Exception) { } /// Cope with situations when file is missing or is not correct + } + + /// + /// Title + /// + RectangleF printArea = new RectangleF(TitleX, TitleY, printWidth, titleHeight); + e.Graphics.DrawString(header, titleFont, Brushes.Black, printArea); + + titleHeight = System.Windows.Forms.TextRenderer.MeasureText(header, titleFont).Height; + float commonTop = TitleY + titleHeight; + + ///---------------- + /// Common items + ///---------------- + commonTop += spacingOne4Header; /// Space above common part + float leftMarginCommon1 = leftMargin + printWidth * 0.01f * cfg.ColW0Pct; + float leftMarginCommon2 = leftMargin + printWidth * 0.01f * (cfg.ColW0Pct + cfg.ColW1Pct); + float leftMarginCommon3 = leftMargin + printWidth * 0.01f * (cfg.ColW0Pct + cfg.ColW1Pct + cfg.ColW2Pct); + + Alignment[] horizAlgn = new Alignment[] { Alignment.Left, Alignment.Left }; + VertAlignment[] vertAlgn = new VertAlignment[] { VertAlignment.Top, VertAlignment.Top }; + TableStyle commonTableStyle = new TableStyle { Font = font, MarginX = 5, MarginY = 3 }; + + Table table1 = new Table(2) { Style = commonTableStyle }; + foreach (var item in commonItems1) + { + string[] row = new string[] { item.Caption, item.Print(wm).Split(new char[] { '|' })[0] }; + table1.AddRow(row, horizAlgn, vertAlgn); + } + float bodyTop1 = table1.Draw(e, leftMarginCommon1, commonTop); + + + table1 = new Table(2) { Style = commonTableStyle }; + foreach (var item in commonItems2) + { + string[] row = new string[] { item.Caption, item.Print(wm).Split(new char[] { '|' })[0] }; + table1.AddRow(row, horizAlgn, vertAlgn); + } + float bodyTop2 = table1.Draw(e, leftMarginCommon2, commonTop); + + + table1 = new Table(2) { Style = commonTableStyle }; + foreach (var item in commonItems3) + { + string[] row = new string[] { item.Caption, item.Print(wm).Split(new char[] { '|' })[0] }; + table1.AddRow(row, horizAlgn, vertAlgn); + } + float bodyTop3 = table1.Draw(e, leftMarginCommon3, commonTop); + + float bodyTop12 = (bodyTop1 > bodyTop2) ? bodyTop1 : bodyTop2; + tableTop = (bodyTop12 > bodyTop3) ? bodyTop12 : bodyTop3; /// Max. of all three bodyTop-s + tableTop += spacingOne4Header; /// Space between the common part and the table + } + + + /// + /// Draw table (on the 1st, as well as on the 2nd page) + /// + float belowTop; + TableStyle style; + Table table; + switch (cfg.Form) + { + default: + case TableForm.Rows: + + style = new TableStyle + { + Font = font, + HeaderFont = headerFont, + MarginX = 5, + MarginY = 3, + LineWidth = 1, + TopHeadersCount = 1, + HorizLines = TableLines.All, + VertLines = TableLines.All + }; + table = Table.Create_TestsAreRows(wm, (pageNr == 1) ? testItems : testItems2, style); + break; + + case TableForm.Columns: + + style = new TableStyle + { + Font = font, + HeaderFont = headerFont, + MarginX = 5, + MarginY = 3, + LineWidth = 1, + LeftHeadersCount = 1, + HorizLines = TableLines.FirstSecondAndLast, + VertLines = TableLines.All + }; + table = Table.Create_TestsAreColumns(wm, (pageNr == 1) ? testItems : testItems2, style); + break; + + case TableForm.ColumnsPL: + + style = new TableStyle + { + Font = font, + HeaderFont = headerFont, + MarginX = 5, + MarginY = 3, + LineWidth = 1, + TopHeadersCount = 1, + HorizLines = TableLines.FirstSecondAndLast, + VertLines = TableLines.All + }; + table = Table.Create_TestsAreColumnsPL(wm, (pageNr == 1) ? testItems : testItems2, style); + break; + } + + SizeF size = table.Measure(e); + float tableLeft = (float)leftMargin + ((float)printWidth - size.Width) / 2; + belowTop = table.Draw(e, tableLeft, tableTop); + + if (pageNr == nrPages) + { + ///---------------- + /// Common items + ///---------------- + belowTop += spacingOne4Header; /// Space between the table and the bottom common part + float leftMarginBelow1 = leftMargin + printWidth * 0.01f * cfg.BelowW0Pct; + float leftMarginBelow2 = leftMargin + printWidth * 0.01f * (cfg.BelowW0Pct + cfg.BelowW1Pct); + float leftMarginBelow3 = leftMargin + printWidth * 0.01f * (cfg.BelowW0Pct + cfg.BelowW1Pct + cfg.BelowW2Pct); + + Alignment[] horizAlgn = new Alignment[] { Alignment.Left, Alignment.Left }; + VertAlignment[] vertAlgn = new VertAlignment[] { VertAlignment.Top, VertAlignment.Top }; + TableStyle commonTableStyle = new TableStyle { Font = font, MarginX = 5, MarginY = 3 }; + + Table table2 = new Table(2) { Style = commonTableStyle }; + foreach (var item in belowItems1) + { + string[] row = new string[] { item.Caption, item.Print(wm).Split(new char[] { '|' })[0] }; + table2.AddRow(row, horizAlgn, vertAlgn); + } + table2.Draw(e, leftMarginBelow1, belowTop); + + + table2 = new Table(2) { Style = commonTableStyle }; + foreach (var item in belowItems2) + { + string[] row = new string[] { item.Caption, item.Print(wm).Split(new char[] { '|' })[0] }; + table2.AddRow(row, horizAlgn, vertAlgn); + } + table2.Draw(e, leftMarginBelow2, belowTop); + + + table2 = new Table(2) { Style = commonTableStyle }; + foreach (var item in belowItems3) + { + string[] row = new string[] { item.Caption, item.Print(wm).Split(new char[] { '|' })[0] }; + table2.AddRow(row, horizAlgn, vertAlgn); + } + table2.Draw(e, leftMarginBelow3, belowTop); + + + /// + /// Footer on the last page + /// + float footerWidth = e.Graphics.MeasureString(footer, footerFont).Width; + PrintAt(e, footer, footerFont, leftMargin, topMargin + printHeight - 2 * spacingOne, 0, 0, Alignment.Left, VertAlignment.Top); + } + + /// + /// Page number on each page + /// + string pageNrText = string.Format("{0} {1}/{2}", Strings.Page, pageNr, nrPages); + float pageNrWidth = e.Graphics.MeasureString(pageNrText, font).Width; + PrintAt(e, pageNrText, font, leftMargin + (printWidth - pageNrWidth) / 2, topMargin + printHeight - spacingOne, 0, 0, Alignment.Left, VertAlignment.Top); + + e.HasMorePages = !(pageNr == nrPages); + + pageNr++; + } + } +} diff --git a/TBF_V2/Sources/TBF/Results/Output/Printers/OnePerMeter/OnePerMeterPrinterCfg.cs b/TBF_V2/Sources/TBF/Results/Output/Printers/OnePerMeter/OnePerMeterPrinterCfg.cs new file mode 100644 index 00000000..94700e6a --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Output/Printers/OnePerMeter/OnePerMeterPrinterCfg.cs @@ -0,0 +1,54 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// + +namespace Results.Output.Printers.OnePerMeter +{ + public class OnePerMeterPrinterCfg + { + public Config.Entities.PageOrientation PageOrientation; + public string Template; + public int TopMargin; + public int BottomMargin; + public int LeftMargin; + public string TitFntFml; + public int TitFntSz; + public int TitFntSty; + public string HdrFntFml; + public int HdrFntSz; + public int HdrFntSty; + public string BodyFntFml; + public int BodyFntSz; + public int BodyFntSty; + public string FooterFntFml; + public int FooterFntSz; + public int FooterFntSty; + public bool GoodOnly; + public bool SupressPrinting; /// Bypass printing when true + public System.Globalization.CultureInfo CultureInfo; + public string Header; /// =Title + public int ColW0Pct; + public int ColW1Pct; + public int ColW2Pct; + public string[] CommonItems1; + public string[] CommonItems2; + public string[] CommonItems3; + public Config.Entities.TableForm Form; + public string[] TestItems; + public Config.Entities.TableForm Form2; + public string[] TestItems2; + public int BelowW0Pct; + public int BelowW1Pct; + public int BelowW2Pct; + public string[] BelowItems1; + public string[] BelowItems2; + public string[] BelowItems3; + public string Footer; + public bool TestsAreRows; + public string ImgFullPathName; + public int ImgLeft; + public int ImgTop; + public int ImgWid; + public int ImgHgh; + } +} diff --git a/TBF_V2/Sources/TBF/Results/Output/Printers/PrintersCommon.cs b/TBF_V2/Sources/TBF/Results/Output/Printers/PrintersCommon.cs new file mode 100644 index 00000000..79f8c314 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Output/Printers/PrintersCommon.cs @@ -0,0 +1,85 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Printing; +using Config.Entities; + +namespace Results.Output.Printers +{ + public class PrintersCommon : PrintDocument + { + static Font lastFont = null; + static float lastSpacing = 0; + + /// + /// Measure the size of a paragraph of text, lines are separated by '~'. + /// + /// PrintPageEventArgs + /// Text, lines are separated by '~' + /// Font + /// Size of the paragraph of text + public static SizeF Measure(System.Drawing.Printing.PrintPageEventArgs e, string text, Font font) + { + if (font != lastFont) + { + lastFont = font; + lastSpacing = e.Graphics.MeasureString("Abcgq", font).Height; + } + + string[] lines = text.Split(new char[] { '~' }); + float width = 0; + foreach (var line in lines) + { + float lineWid = e.Graphics.MeasureString(line, font).Width; + if (lineWid > width) width = lineWid; + } + + return new SizeF(width, 0.8f * lines.Length * lastSpacing + 0.2f); + } + + /// + /// Print a paragraph of text, lines are separated by '~'. + /// + /// PrintPageEventArgs + /// Text, lines are separated by '~' + /// Font + /// Position x + /// Position y + /// Width (required when alignment=Alignment.Center or alignment=Aligmenr.Right + /// Height, 0 = no vertical centering + /// Horizontal alignment + /// Vertical alignment + public static void PrintAt(System.Drawing.Printing.PrintPageEventArgs e, string text, Font font, + float x, float y, float width, float height, + Alignment horizAlignment, VertAlignment vertAlignment) + { + SizeF size = PrintersCommon.Measure(e, text, font); + + string[] lines = text.Split(new char[] { '~' }); + + if (height <= size.Height) vertAlignment = VertAlignment.Top; + float y0; + switch (vertAlignment) + { + default: + case VertAlignment.Top: y0 = y; break; + case VertAlignment.Middle: y0 = y + (height - size.Height) / 2; break; + case VertAlignment.Bottom: y0 = y + (height - size.Height); break; + } + + foreach (var line in lines) + { + float x0; + switch (horizAlignment) + { + default: + case Alignment.Left: x0 = x; break; + case Alignment.Center: x0 = x + (width - e.Graphics.MeasureString(line, font).Width) / 2; break; + case Alignment.Right: x0 = x + width - e.Graphics.MeasureString(line, font).Width; break; + } + e.Graphics.DrawString(line, font, Brushes.Black, new PointF(x0, y0)); + y0 += 0.8f * lastSpacing; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/Results/Output/Printers/Table.cs b/TBF_V2/Sources/TBF/Results/Output/Printers/Table.cs new file mode 100644 index 00000000..0b8f5f5c --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Output/Printers/Table.cs @@ -0,0 +1,413 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Printing; +using Config.Entities; + +namespace Results.Output.Printers +{ + public enum TableLines + { + None, + FirstAndLast, + FirstSecondAndLast, + All, + } + + public class TableStyle + { + public float MarginX; + public float MarginY; + public Font Font; + public Font HeaderFont; + public int TopHeadersCount; + public int LeftHeadersCount; + public float LineWidth; + public TableLines HorizLines; + public TableLines VertLines; + } + + public class Table + { + public readonly int ColumnsCount; + public int RowsCount { get { return Rows.Count; } } + + public readonly IList Rows; + public readonly IList HorizAlignments; + public readonly IList VertAlignments; + public TableStyle Style; + + + public Table(int columnsCount) + { + ColumnsCount = columnsCount; + + Rows = new List(); + HorizAlignments = new List(); + VertAlignments = new List(); + Style = new TableStyle(); + } + + + public void AddRow(string[] texts, Alignment[] horizAlignment, VertAlignment[] vertAlignemnt) + { + Rows.Add(texts); + HorizAlignments.Add(horizAlignment); + VertAlignments.Add(vertAlignemnt); + } + + + public SizeF Measure(System.Drawing.Printing.PrintPageEventArgs e) + { + SizeF retVal = new SizeF(0, 0); + if (RowsCount == 0) return retVal; + + float[] columnWidth = new float[ColumnsCount]; + float[] rowHeight = new float[RowsCount]; + + /// + /// Measure table column widths and header height + /// + for (int colIx = 0; colIx < ColumnsCount; colIx++) + { + for (int rowIx = 0; rowIx < RowsCount; rowIx++) + { + if (Rows[rowIx] == null) + { + /// Separator row -> do nothing + } + else + { + bool isHeader = (colIx < Style.LeftHeadersCount) || (rowIx < Style.TopHeadersCount); + SizeF size = PrintersCommon.Measure(e, Rows[rowIx][colIx], isHeader ? Style.HeaderFont : Style.Font); + if (size.Width > columnWidth[colIx]) columnWidth[colIx] = size.Width; + if (size.Height > rowHeight[rowIx]) rowHeight[rowIx] = size.Height; + } + } + + bool hasLineToTheLeft = (Style.VertLines == TableLines.All) + || ((Style.VertLines == TableLines.FirstAndLast) && (colIx == 0)) + || ((Style.VertLines == TableLines.FirstSecondAndLast) && (colIx <= 1)); + + retVal.Width += columnWidth[colIx] + (hasLineToTheLeft ? (Style.LineWidth + Style.MarginX) : 0) + Style.MarginX; + } + for (int rowIx = 0; rowIx < RowsCount; rowIx++) + { + if (Rows[rowIx] == null) + { + /// Separator row -> do nothing + } + else + { + bool hasLineAbove = (Style.HorizLines == TableLines.All) + || ((Style.HorizLines == TableLines.FirstAndLast) && (rowIx == 0)) + || ((Style.HorizLines == TableLines.FirstSecondAndLast) && (rowIx <= 1)) + || ((rowIx >= 1) && (Rows[rowIx - 1] == null)); + + retVal.Height += rowHeight[rowIx] + (hasLineAbove ? (Style.LineWidth + Style.MarginY) : 0) + Style.MarginY; + } + } + + if (Style.VertLines == TableLines.None) retVal.Width -= Style.MarginX; + if (Style.HorizLines == TableLines.None) retVal.Height -= Style.MarginY; + + return retVal; + } + + + public float Draw(System.Drawing.Printing.PrintPageEventArgs e, float left, float top) + { + if (RowsCount == 0) return top; + + int tblColumnsCount = Rows[0].Length; + + float[] columnWidth = new float[tblColumnsCount]; + float[] columnPos = new float[tblColumnsCount]; + float[] vertLinePos = new float[tblColumnsCount + 1]; + + float[] rowHeight = new float[RowsCount]; + float[] rowPos = new float[RowsCount]; + float[] horizLinePos = new float[RowsCount + 1]; + + /// + /// Measure table column widths and header height + /// + vertLinePos[0] = left; + horizLinePos[0] = top; + for (int colIx = 0; colIx < tblColumnsCount; colIx++) + { + for (int rowIx = 0; rowIx < RowsCount; rowIx++) + { + if (Rows[rowIx] != null) + { + /// In not a separator line + bool isHeader = (colIx < Style.LeftHeadersCount) || (rowIx < Style.TopHeadersCount); + SizeF size = PrintersCommon.Measure(e, Rows[rowIx][colIx], isHeader ? Style.HeaderFont : Style.Font); + if (size.Width > columnWidth[colIx]) columnWidth[colIx] = size.Width; + if (size.Height > rowHeight[rowIx]) rowHeight[rowIx] = size.Height; + } + else + { + /// Separator line -> do nothing + rowHeight[rowIx] = 0; + } + } + + bool hasLineToTheLeft = (Style.VertLines == TableLines.All) + || ((Style.VertLines == TableLines.FirstAndLast) && (colIx == 0)) + || ((Style.VertLines == TableLines.FirstSecondAndLast) && (colIx <= 1)); + + columnPos[colIx] = vertLinePos[colIx] + (hasLineToTheLeft ? (Style.LineWidth + Style.MarginX) : 0); + vertLinePos[colIx + 1] = columnPos[colIx] + columnWidth[colIx] + Style.MarginX; + } + for (int rowIx = 0; rowIx < RowsCount; rowIx++) + { + if (Rows[rowIx] != null) + { + /// In not a separator line + bool hasLineAbove = (Style.HorizLines == TableLines.All) + || ((Style.HorizLines == TableLines.FirstAndLast) && (rowIx == 0)) + || ((Style.HorizLines == TableLines.FirstSecondAndLast) && (rowIx <= 1)) + || ((rowIx >= 1) && (Rows[rowIx - 1] == null)); + + rowPos[rowIx] = horizLinePos[rowIx] + (hasLineAbove ? Style.MarginY : 0); + horizLinePos[rowIx + 1] = rowPos[rowIx] + rowHeight[rowIx] + Style.LineWidth + Style.MarginY; + } + else if (rowIx > 0) + { + /// Separator line + rowPos[rowIx] = rowPos[rowIx - 1]; + horizLinePos[rowIx + 1] = horizLinePos[rowIx]; + } + } + + /// Horizontal lines + float tableLeftX = left; + float tableRightX = vertLinePos[tblColumnsCount] + Style.LineWidth; + if (Style.HorizLines != TableLines.None) + { + for (int rowIx = 0; rowIx <= RowsCount; rowIx++) + { + if (Style.HorizLines == TableLines.All || rowIx == 0 + || rowIx == RowsCount + || (Style.HorizLines == TableLines.FirstSecondAndLast && rowIx == 1) + || ((rowIx >= 1) && (Rows[rowIx - 1] == null))) + { + e.Graphics.DrawLine(new Pen(Color.Black, Style.LineWidth), new PointF(tableLeftX, horizLinePos[rowIx] + Style.LineWidth / 2), new PointF(tableRightX, horizLinePos[rowIx] + Style.LineWidth / 2)); + } + } + } + + /// Vertical lines + float tableTopY = top; + float tableBottomY = horizLinePos[RowsCount] + Style.LineWidth; + if (Style.VertLines != TableLines.None) + { + for (int colIx = 0; colIx <= tblColumnsCount; colIx++) + { + if (Style.VertLines == TableLines.All || colIx == 0 || colIx == ColumnsCount || (Style.VertLines == TableLines.FirstSecondAndLast && colIx == 1)) + { + e.Graphics.DrawLine(new Pen(Color.Black, Style.LineWidth), new PointF(vertLinePos[colIx] + Style.LineWidth / 2, tableTopY), new PointF(vertLinePos[colIx] + Style.LineWidth / 2, tableBottomY)); + } + } + } + + /// + /// Draw table body + /// + for (int rowIndex = 0; rowIndex < RowsCount; rowIndex++) + { + string[] oneTableRow = Rows[rowIndex]; + if (oneTableRow != null) + { + Alignment[] horizAlignment = HorizAlignments[(RowsCount > rowIndex) ? rowIndex : 0]; + VertAlignment[] vertAlignment = VertAlignments[(RowsCount > rowIndex) ? rowIndex : 0]; + for (int colIndex = 0; colIndex < tblColumnsCount; colIndex++) + { + bool isHeader = (colIndex < Style.LeftHeadersCount) || (rowIndex < Style.TopHeadersCount); + PrintersCommon.PrintAt(e, oneTableRow[colIndex], + isHeader ? Style.HeaderFont : Style.Font, + columnPos[colIndex], + rowPos[rowIndex], + columnWidth[colIndex], + rowHeight[rowIndex], + horizAlignment[colIndex], + vertAlignment[colIndex]); + } + } + } + + return tableBottomY; + } + + + public static Table Create_TestsAreRows(Results.Entities.WaterMeter wm, IList items, TableStyle style) + { + /// Top row contains column captions + + Table table = new Table(items.Count); + table.Style = style; + + string[] tableHeader = new string[table.ColumnsCount]; + Alignment[] horizAlignment = new Alignment[table.ColumnsCount]; + VertAlignment[] vertAlignment = new VertAlignment[table.ColumnsCount]; + for (int i = 0; i < table.ColumnsCount; i++) + { + tableHeader[i] = items[i].Caption; + horizAlignment[i] = Alignment.Center; + vertAlignment[i] = VertAlignment.Middle; + } + table.AddRow(tableHeader, horizAlignment, vertAlignment); + + WMeterRsltItemSpec.TableRowNr = 1; + foreach (var mtr in wm.MeterTestRslts) + { + if (mtr != null && mtr.IsPilotRslt() && mtr.Publish() == Config.Entities.Publish.Always) + { + string[] oneTableRow = new string[table.ColumnsCount]; + horizAlignment = new Alignment[table.ColumnsCount]; + vertAlignment = new VertAlignment[table.ColumnsCount]; + + for (int i = 0; i < table.ColumnsCount; i++) + { + WMeterRsltItemSpec.TableColumnNr = i + 1; + oneTableRow[i] = items[i].Print(wm, mtr.Name()).Split(new char[] { '|' })[0]; + horizAlignment[i] = items[i].Alignment; + vertAlignment[i] = VertAlignment.Middle; + } + + table.AddRow(oneTableRow, horizAlignment, vertAlignment); + + WMeterRsltItemSpec.TableRowNr++; + } + } + + return table; + } + + + public static Table Create_TestsAreColumns(Results.Entities.WaterMeter wm, IList items, TableStyle style) + { + /// Left column contains row captions + + /// + /// Calculate columns count + /// + int columnsCount = 1; /// Left column contains item caption + foreach (var mtr in wm.MeterTestRslts) + { + if (mtr != null && mtr.IsPilotRslt() && mtr.Publish() == Config.Entities.Publish.Always) + { + columnsCount++; /// One additional column for each test to be published + } + } + + Table table = new Table(columnsCount); + table.Style = style; + + /// + /// Table content + /// + WMeterRsltItemSpec.TableRowNr = 1; + for (int i = 0; i < items.Count; i++) + { + string[] oneTableRow = new string[columnsCount]; + Alignment[] horizAlignment = new Alignment[columnsCount]; + VertAlignment[] vertAlignment = new VertAlignment[columnsCount]; + + oneTableRow[0] = items[i].Caption; + horizAlignment[0] = Alignment.Center; + vertAlignment[0] = VertAlignment.Middle; + + WMeterRsltItemSpec.TableColumnNr = 1; + foreach (var mtr in wm.MeterTestRslts) + { + if (mtr != null && mtr.IsPilotRslt() && mtr.Publish() == Config.Entities.Publish.Always) + { + /// Strip color information + oneTableRow[WMeterRsltItemSpec.TableColumnNr] = + items[i].Print(wm, mtr.Name()).Split(new char[] { '|' })[0]; + horizAlignment[WMeterRsltItemSpec.TableColumnNr] = items[i].Alignment; + vertAlignment[WMeterRsltItemSpec.TableColumnNr] = VertAlignment.Middle; + + WMeterRsltItemSpec.TableColumnNr++; + } + } + + table.AddRow(oneTableRow, horizAlignment, vertAlignment); + + WMeterRsltItemSpec.TableRowNr++; + } + + return table; + } + + + public static Table Create_TestsAreColumnsPL(Results.Entities.WaterMeter wm, IList items, TableStyle style) + { + /// Left column contains row captions + + /// + /// Calculate columns count + /// + int columnsCount = 2; /// Left two columns contain item caption and units + foreach (var mtr in wm.MeterTestRslts) + { + if (mtr != null && mtr.IsPilotRslt() && mtr.Publish() == Config.Entities.Publish.Always) + { + columnsCount++; /// One additional column for each test to be published + } + } + + Table table = new Table(columnsCount); + table.Style = style; + + /// + /// Table content + /// + WMeterRsltItemSpec.TableRowNr = 1; + for (int i = 0; i < items.Count; i++) + { + if (items[i].Uid == (int)ItemID.Separator) + { + table.AddRow(null, null, null); /// 'separator' row + } + else + { + string[] oneTableRow = new string[columnsCount]; + Alignment[] horizAlignment = new Alignment[columnsCount]; + VertAlignment[] vertAlignment = new VertAlignment[columnsCount]; + + oneTableRow[0] = items[i].Caption; + horizAlignment[0] = Alignment.Center; + vertAlignment[0] = VertAlignment.Middle; + + oneTableRow[1] = (i == 0) ? "Jednostka" : items[i].Units.ToDescription(); + horizAlignment[1] = Alignment.Center; + vertAlignment[1] = VertAlignment.Middle; + + WMeterRsltItemSpec.TableColumnNr = 1; + foreach (var mtr in wm.MeterTestRslts) + { + if (mtr != null && mtr.IsPilotRslt() && mtr.Publish() == Config.Entities.Publish.Always) + { + int colIx = WMeterRsltItemSpec.TableColumnNr + 1; + + /// Strip color information + oneTableRow[colIx] = items[i].Print(wm, mtr.Name()).Split(new char[] { '|' })[0]; + horizAlignment[colIx] = items[i].Alignment; + vertAlignment[colIx] = VertAlignment.Middle; + + WMeterRsltItemSpec.TableColumnNr++; + } + } + + table.AddRow(oneTableRow, horizAlignment, vertAlignment); + } + WMeterRsltItemSpec.TableRowNr++; + } + + return table; + } + } +} diff --git a/TBF_V2/Sources/TBF/Results/Output/Printers/Zapiska/ZapiskaPrintDocument.cs b/TBF_V2/Sources/TBF/Results/Output/Printers/Zapiska/ZapiskaPrintDocument.cs new file mode 100644 index 00000000..ea4c9308 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Output/Printers/Zapiska/ZapiskaPrintDocument.cs @@ -0,0 +1,504 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Printing; +using System.IO; +using Config.Entities; +using Results; +using Results.Resources; + +namespace Results.Output.Printers.Zapiska +{ + public class ZapiskaPrintDocument : PrintDocument + { + const float GapBetweenTableColumns = 10.0f; + const float GapBetweenCommonColumns = 10.0f; + + /// Size of the printed area without margins, after taking into account 'pageOrientation' + readonly int printHeight; /// in 0.254 mm = 0.01 in + readonly int printWidth; /// in 0.254 mm = 0.01 in + + readonly int topMargin; /// in 0.254 mm = 0.01 in + readonly int bottomMargin; /// in 0.254 mm = 0.01 in + readonly int leftMargin; /// in 0.254 mm = 0.01 in + + readonly float leftMarginCommon1; + readonly float leftMarginCommon2; + readonly float leftMarginCommon3; + readonly float leftMarginBelow1; + readonly float leftMarginBelow2; + readonly float leftMarginBelow3; + + readonly float spacingOne; + readonly float spacingOne4Header; + + float commonTop; /// = TitleY + 60 + float bodyTop; /// = HdrTop + 160 + /// + float titleHeight; + float commonHeight; + + /// + /// Property variable for the Font the user wishes to use + /// + Font titleFont; + Font headerFont; + Font font; + Font footerFont; + + /// + /// Data to print + /// + Results.Entities.Batch batch; + + ZapiskaPrinterCfg cfg; + + /// + /// Items to print + /// + string header; + IList commonItems1; + IList commonItems2; + IList commonItems3; + IList selectedItems; + IList belowItems1; + IList belowItems2; + IList belowItems3; + string footer; + + /// + /// Layout and status + /// + int tablesOnFirstPage; + int tablesOnNextPage; + int nrPages; + int pageNr; /// Page number to be printed at the bottom of the page + + + /// + /// Constructor + /// + /// Text to be printed + public ZapiskaPrintDocument(Results.Entities.Batch batch, ZapiskaPrinterCfg cfg, string documentName) + { + this.batch = batch; + DocumentName = documentName; + + this.cfg = cfg; + topMargin = cfg.TopMargin; + bottomMargin = cfg.BottomMargin; + leftMargin = cfg.LeftMargin; + + header = string.IsNullOrEmpty(cfg.Header) ? string.Empty : cfg.Header.Replace("~", Environment.NewLine); + commonItems1 = Results.WMeterRsltItemSpec.FromStrArray(cfg.CommonItems1); + commonItems2 = Results.WMeterRsltItemSpec.FromStrArray(cfg.CommonItems2); + commonItems3 = Results.WMeterRsltItemSpec.FromStrArray(cfg.CommonItems3); + selectedItems = Results.WMeterRsltItemSpec.FromStrArray(cfg.SelectedItems); + belowItems1 = Results.WMeterRsltItemSpec.FromStrArray(cfg.BelowItems1); + belowItems2 = Results.WMeterRsltItemSpec.FromStrArray(cfg.BelowItems2); + belowItems3 = Results.WMeterRsltItemSpec.FromStrArray(cfg.BelowItems3); + footer = string.IsNullOrEmpty(cfg.Footer) ? string.Empty : cfg.Footer.Replace("~", Environment.NewLine); + + /// Initialize fonts + titleFont = new Font((cfg.TitFntFml != null ? cfg.TitFntFml : "Arial"), (cfg.TitFntSz > 0 ? cfg.TitFntSz : 10), (FontStyle)cfg.TitFntSty); + headerFont = new Font((cfg.HdrFntFml != null ? cfg.HdrFntFml : "Arial"), (cfg.HdrFntSz > 0 ? cfg.HdrFntSz : 10), (FontStyle)cfg.HdrFntSty); + font = new Font((cfg.BodyFntFml != null ? cfg.BodyFntFml : "Arial"), (cfg.BodyFntSz > 0 ? cfg.BodyFntSz : 10), (FontStyle)cfg.BodyFntSty); + footerFont = new Font((cfg.FooterFntFml != null ? cfg.FooterFntFml : "Arial"), (cfg.FooterFntSz > 0 ? cfg.FooterFntSz : 10), (FontStyle)cfg.FooterFntSty); + + /// Set print area size and margins (in dots using 100 dpi) + DefaultPageSettings.Landscape = (cfg.PageOrientation == PageOrientation.Landscape); + /// + if (DefaultPageSettings.Landscape) + { + printHeight = base.DefaultPageSettings.PaperSize.Width - topMargin - bottomMargin; + printWidth = base.DefaultPageSettings.PaperSize.Height - leftMargin - leftMargin; + } + else + { + printHeight = base.DefaultPageSettings.PaperSize.Height - topMargin - bottomMargin; + printWidth = base.DefaultPageSettings.PaperSize.Width - leftMargin - leftMargin; + } + + leftMarginCommon1 = leftMargin + printWidth * 0.01f * cfg.ColW0Pct; + leftMarginCommon2 = leftMargin + printWidth * 0.01f * (cfg.ColW0Pct + cfg.ColW1Pct); + leftMarginCommon3 = leftMargin + printWidth * 0.01f * (cfg.ColW0Pct + cfg.ColW1Pct + cfg.ColW2Pct); + + leftMarginBelow1 = leftMargin + printWidth * 0.01f * cfg.BelowW0Pct; + leftMarginBelow2 = leftMargin + printWidth * 0.01f * (cfg.BelowW0Pct + cfg.BelowW1Pct); + leftMarginBelow3 = leftMargin + printWidth * 0.01f * (cfg.BelowW0Pct + cfg.BelowW1Pct + cfg.BelowW2Pct); + + spacingOne = System.Windows.Forms.TextRenderer.MeasureText("Abcgq", font).Height; + spacingOne4Header = System.Windows.Forms.TextRenderer.MeasureText("Abcgq", headerFont).Height; + + pageNr = 1; + } + + /// + /// Override the default onbeginPrint method of the PrintDocument Object + /// + /// + /// + protected override void OnBeginPrint(System.Drawing.Printing.PrintEventArgs e) + { + base.OnBeginPrint(e); + } + + /// + /// Override the default OnPrintPage method of the PrintDocument. + /// + /// + /// This provides the print logic for our document + protected override void OnPrintPage(System.Drawing.Printing.PrintPageEventArgs e) + { + /// Run base code + base.OnPrintPage(e); + + if (pageNr == 1) + { + if (!string.IsNullOrEmpty(cfg.Template)) + { + string templatePath = Path.Combine("C:\\TBF\\Templates\\", cfg.Template); + if (File.Exists(templatePath)) + { + if (cfg.PageOrientation == PageOrientation.Portrait) + e.Graphics.DrawImage(new Bitmap(Image.FromFile(templatePath), 827, 1169), new Rectangle(0, 0, 827, 1169)); + else + e.Graphics.DrawImage(new Bitmap(Image.FromFile(templatePath), 1169, 827), new Rectangle(0, 0, 1169, 827)); + } + } + + /// Calculate the table rows count + int tableRowsCount = 0; + foreach (var wm in batch.WaterMeters) + { + if (!cfg.GoodOnly || wm.Passed) tableRowsCount++; + } + + /// Prepare document outline + titleHeight = System.Windows.Forms.TextRenderer.MeasureText(header, titleFont).Height; + commonTop = cfg.TopMargin + titleHeight + spacingOne4Header; + + int commonCount = Math.Max(commonItems1.Count, Math.Max(commonItems2.Count, commonItems3.Count)); + commonHeight = commonCount * spacingOne; + bodyTop = commonTop + commonHeight + spacingOne4Header; + + float wmSectionHeight = (tableRowsCount + 1) * spacingOne + 3 * spacingOne4Header; + + tablesOnFirstPage = (int)Math.Floor((printHeight - bodyTop + (float)cfg.TopMargin - 2 * spacingOne) / wmSectionHeight); + tablesOnNextPage = Math.Max(1, (int)Math.Floor((printHeight - 2 * spacingOne) / wmSectionHeight)); /// Min. 1, prevent division by zero + + if (tablesOnFirstPage >= 1) + nrPages = 1; + else + nrPages = 2; + } + + /// Use the StringFormat class for the text layout of our document + StringFormat format = new StringFormat(StringFormatFlags.LineLimit); + + if (pageNr == 1) + { + ///---------- + /// Title + ///---------- + float titleWid = e.Graphics.MeasureString(header, titleFont).Width; + RectangleF printArea = new RectangleF(cfg.LeftMargin + Math.Max(0, (printWidth - titleWid)) / 2, cfg.TopMargin, + titleWid, titleHeight); + e.Graphics.DrawString(header, titleFont, Brushes.Black, printArea); + + ///---------------- + /// Common items + ///---------------- + for (int n = 1; n <= 3; n++) + { + IList commonItems; + float lMargin; + switch (n) + { + default: + case 1: commonItems = commonItems1; lMargin = leftMarginCommon1; break; + case 2: commonItems = commonItems2; lMargin = leftMarginCommon2; break; + case 3: commonItems = commonItems3; lMargin = leftMarginCommon3; break; + } + + if (commonItems.Count == 0) continue; /// Common part is empty + + string[] leftColumn = new string[commonItems.Count]; + string[] rightColumn = new string[commonItems.Count]; + + int cnt = 0; + foreach (var v in commonItems) + { + leftColumn[cnt] = v.Caption; + rightColumn[cnt] = (batch.WaterMeters.Count > 0) ? v.Print(batch.WaterMeters[0]) : string.Empty; + cnt++; + } + + /// Determine left column width + float leftColWidth = 0; + foreach (var paragraph in leftColumn) + { + string[] lines = paragraph.Split(new char[] { '~' }); + foreach (var line in lines) + { + float itemWidth = Measure(e, paragraph, this.font).Width; + if (itemWidth > leftColWidth) + { + leftColWidth = itemWidth; + } + } + } + + /// Write aligned columns + for (int i = 0; i < Math.Min(leftColumn.Length, rightColumn.Length); i++) + { + PrintAt(e, lMargin, commonTop + spacingOne * i, leftColWidth, leftColumn[i], this.font, commonItems[i].Alignment); + PrintAt(e, lMargin + leftColWidth + GapBetweenCommonColumns, commonTop + spacingOne * i, 0, rightColumn[i], this.font, Alignment.Left); + } + } + } + + ///-------- + /// Body + ///-------- + + /// This variable represents the top coordinate of the area where WM results are printed + /// and it is updated (increased by) the value returned by PrintXyzWM() - the section size. + float nextTableTop = (pageNr == 1) ? bodyTop : cfg.TopMargin; + + if (tablesOnFirstPage > 0 || pageNr == 2) + { + nextTableTop += PrintWMs(e, batch.WaterMeters, nextTableTop); + } + + e.HasMorePages = (nrPages > 1) && (pageNr == 1); + + ///---------------- + /// Below items + ///---------------- + for (int n = 1; n <= 3; n++) + { + IList belowItems; + float lMargin; + switch (n) + { + default: + case 1: belowItems = belowItems1; lMargin = leftMarginBelow1; break; + case 2: belowItems = belowItems2; lMargin = leftMarginBelow2; break; + case 3: belowItems = belowItems3; lMargin = leftMarginBelow3; break; + } + + if (belowItems.Count == 0) continue; /// Below part is empty + + string[] leftColumn = new string[belowItems.Count]; + string[] rightColumn = new string[belowItems.Count]; + + int cnt = 0; + foreach (var v in belowItems) + { + leftColumn[cnt] = v.Caption; + rightColumn[cnt] = (batch.WaterMeters.Count > 0) ? v.Print(batch.WaterMeters[0]) : string.Empty; + cnt++; + } + + /// Determine left column width + float leftColWidth = 0; + foreach (var paragraph in leftColumn) + { + string[] lines = paragraph.Split(new char[] { '~' }); + foreach (var line in lines) + { + float itemWidth = e.Graphics.MeasureString(paragraph, font).Width + 1; + if (itemWidth > leftColWidth) leftColWidth = itemWidth; + } + } + + /// Write aligned columns + for (int i = 0; i < Math.Min(leftColumn.Length, rightColumn.Length); i++) + { + PrintAt(e, lMargin, nextTableTop + spacingOne * i, leftColWidth, leftColumn[i], this.font, belowItems[i].Alignment); + PrintAt(e, lMargin + leftColWidth + GapBetweenCommonColumns, nextTableTop + spacingOne * i, 0, rightColumn[i], this.font, Alignment.Left); + } + } + + ///---------- + /// Footer + ///---------- + float footerWidth = Measure(e, footer, footerFont).Width; + PrintAt(e, leftMargin + (printWidth - footerWidth) / 2, topMargin + printHeight - 2 * spacingOne, 0, footer, footerFont, Alignment.Left); + + string pageNrText = string.Format("{0} {1}/{2}", Strings.Page, pageNr++, nrPages); + float pageNrWidth = e.Graphics.MeasureString(pageNrText, font).Width; + PrintAt(e, leftMargin + (printWidth - pageNrWidth) / 2, topMargin + printHeight - spacingOne, 0, pageNrText, font, Alignment.Left); + } + + + /// + /// Print one water meter results + /// + /// Water meter + /// Number of the water meter printed + /// Top coordinate of watermeter data + /// The height of the printed section + float PrintWMs(System.Drawing.Printing.PrintPageEventArgs e, + IList wms, float top) + { + /// + /// Prepare table content + /// + int tableColumnsCount = selectedItems.Count; + /// + string[] tableHeader = new string[tableColumnsCount]; + IList tableRows = new List(); + Alignment[] itemAlignment = new Alignment[tableColumnsCount]; + /// + for (int i = 0; i < tableColumnsCount; i++) + { + tableHeader[i] = selectedItems[i].Caption; + itemAlignment[i] = selectedItems[i].Alignment; + } + /// + WMeterRsltItemSpec.TableRowNr = 0; + foreach (var wm in wms) + { + if (!cfg.GoodOnly || wm.Passed) + { + string[] oneTableRow = new string[tableColumnsCount]; + WMeterRsltItemSpec.TableRowNr++; + + for (int i = 0; i < tableColumnsCount; i++) + { + WMeterRsltItemSpec.TableColumnNr = i + 1; + oneTableRow[i] = selectedItems[i].Print(wm).Split(new char[] { '|' })[0]; /// Strip color information + } + + tableRows.Add(oneTableRow); + } + } + + return DrawTable(e, leftMargin, top, tableHeader, tableRows, itemAlignment); + } + + + float DrawTable(System.Drawing.Printing.PrintPageEventArgs e, float left, float top, string[] header, IList rows, Alignment[] alignment) + { + int tblColumnsCount = header.Length; + + float[] columnWidth = new float[tblColumnsCount]; + float[] columnPos = new float[tblColumnsCount + 1]; + columnPos[0] = left; + + /// + /// Measure table column widths and header height + /// + float headerHeight = 0; + for (int i = 0; i < tblColumnsCount; i++) + { + SizeF size = Measure(e, header[i], headerFont); + columnWidth[i] = size.Width; + if (size.Height > headerHeight) headerHeight = size.Height; + + foreach (var tableRow in rows) + { + float width = Measure(e, tableRow[i], font).Width + 1; + if (width > columnWidth[i]) columnWidth[i] = width; + } + columnPos[i + 1] = columnPos[i] + columnWidth[i] + GapBetweenTableColumns; + } + + float tableLeftX = columnPos[0]; + float tableRightX = columnPos[tblColumnsCount] - GapBetweenTableColumns; + + /// Horizontal line + float horY = top + 1.5f * spacingOne4Header; + e.Graphics.DrawLine(new Pen(Color.Black, 2), new PointF(tableLeftX, horY), new PointF(tableRightX, horY)); + + /// + /// Draw table header + /// + for (int i = 0; i < tblColumnsCount; i++) + { + PrintAt(e, columnPos[i], + top + 1.7f * spacingOne4Header, + columnWidth[i], + header[i], + headerFont, + Alignment.Center); + } + /// Horizontal line + horY = top + 2.1f * spacingOne4Header + headerHeight; + e.Graphics.DrawLine(new Pen(Color.Black, 2), new PointF(tableLeftX, horY), new PointF(tableRightX, horY)); + + /// + /// Draw table body + /// + int rowsCount = 0; + foreach (var oneTableRow in rows) + { + for (int i = 0; i < tblColumnsCount; i++) + { + PrintAt(e, columnPos[i], + horY + 0.2f * spacingOne4Header + spacingOne * rowsCount, + columnWidth[i], + oneTableRow[i], + font, + alignment[i]); + } + rowsCount++; + } + + /// Horizontal line + horY = horY + spacingOne * rowsCount + (3 * spacingOne4Header / 10); + e.Graphics.DrawLine(new Pen(Color.Black, 2), new PointF(tableLeftX, horY), new PointF(tableRightX, horY)); + + return horY - top + spacingOne; + } + + + static Font lastFont = null; + static float lastSpacing = 0; + + SizeF Measure(System.Drawing.Printing.PrintPageEventArgs e, string paragraph, Font font) + { + if (font != lastFont) + { + lastFont = font; + lastSpacing = e.Graphics.MeasureString("Abcgq", font).Height; + } + + string[] lines = paragraph.Split(new char[] { '~' }); + float width = 0; + foreach (var line in lines) + { + float lineWid = e.Graphics.MeasureString(line, font).Width; + if (lineWid > width) width = lineWid; + } + + return new SizeF(width, 0.8f * lines.Length * lastSpacing + 0.2f); + } + + + void PrintAt(System.Drawing.Printing.PrintPageEventArgs e, float x, float y, float width, string paragraph, Font font, Alignment alignment) + { + SizeF size = Measure(e, paragraph, font); + + string[] lines = paragraph.Split(new char[] { '~' }); + foreach (var line in lines) + { + float xx; + switch (alignment) + { + default: + case Alignment.Left: xx = x; break; + case Alignment.Center: xx = x + (width - e.Graphics.MeasureString(line, font).Width) / 2; break; + case Alignment.Right: xx = x + width - e.Graphics.MeasureString(line, font).Width; break; + } + e.Graphics.DrawString(line, font, Brushes.Black, new PointF(xx, y)); + y += 0.8f * lastSpacing; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/Results/Output/Printers/Zapiska/ZapiskaPrinterCfg.cs b/TBF_V2/Sources/TBF/Results/Output/Printers/Zapiska/ZapiskaPrinterCfg.cs new file mode 100644 index 00000000..80491825 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Output/Printers/Zapiska/ZapiskaPrinterCfg.cs @@ -0,0 +1,46 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// + +namespace Results.Output.Printers.Zapiska +{ + public class ZapiskaPrinterCfg + { + public Config.Entities.PageOrientation PageOrientation; + public string Template; + public int TopMargin; + public int BottomMargin; + public int LeftMargin; + public string TitFntFml; + public int TitFntSz; + public int TitFntSty; + public string HdrFntFml; + public int HdrFntSz; + public int HdrFntSty; + public string BodyFntFml; + public int BodyFntSz; + public int BodyFntSty; + public string FooterFntFml; + public int FooterFntSz; + public int FooterFntSty; + public bool SupressPrinting; /// Bypass printing when true + public bool GoodOnly; + public System.Globalization.CultureInfo CultureInfo; + + public string Header; /// =Title + public int ColW0Pct; + public int ColW1Pct; + public int ColW2Pct; + public string[] CommonItems1; + public string[] CommonItems2; + public string[] CommonItems3; + public string[] SelectedItems; + public int BelowW0Pct; + public int BelowW1Pct; + public int BelowW2Pct; + public string[] BelowItems1; + public string[] BelowItems2; + public string[] BelowItems3; + public string Footer; + } +} diff --git a/TBF_V2/Sources/TBF/Results/Properties/AssemblyInfo.cs b/TBF_V2/Sources/TBF/Results/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..cd072391 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Results")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Sensus")] +[assembly: AssemblyProduct("Results")] +[assembly: AssemblyCopyright("Copyright © 2013 - 2018 Sensus Slovensko, a.s.")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("5da980c4-8924-4762-9b72-91e011e08f6c")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("2.18.918.0")] +[assembly: AssemblyFileVersion("2.18.918.0")] diff --git a/TBF_V2/Sources/TBF/Results/Properties/Resources.Designer.cs b/TBF_V2/Sources/TBF/Results/Properties/Resources.Designer.cs new file mode 100644 index 00000000..a3febc1f --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Properties/Resources.Designer.cs @@ -0,0 +1,73 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Results.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Results.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Headpic { + get { + object obj = ResourceManager.GetObject("Headpic", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/Results/Properties/Resources.resx b/TBF_V2/Sources/TBF/Results/Properties/Resources.resx new file mode 100644 index 00000000..0191a707 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Properties/Resources.resx @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + ..\Resources\Headpic.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Results/Resources/Headpic.png b/TBF_V2/Sources/TBF/Results/Resources/Headpic.png new file mode 100644 index 00000000..9a764174 Binary files /dev/null and b/TBF_V2/Sources/TBF/Results/Resources/Headpic.png differ diff --git a/TBF_V2/Sources/TBF/Results/Resources/Strings.Designer.cs b/TBF_V2/Sources/TBF/Results/Resources/Strings.Designer.cs new file mode 100644 index 00000000..74511c82 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Resources/Strings.Designer.cs @@ -0,0 +1,1881 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Results.Resources { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Strings { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Strings() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Results.Resources.Strings", typeof(Strings).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Add >. + /// + internal static string Add { + get { + return ResourceManager.GetString("Add", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Alignment. + /// + internal static string Alignment { + get { + return ResourceManager.GetString("Alignment", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Approval. + /// + internal static string Approval { + get { + return ResourceManager.GetString("Approval", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to aux.. + /// + internal static string aux { + get { + return ResourceManager.GetString("aux", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Available results. + /// + internal static string Available_results { + get { + return ResourceManager.GetString("Available_results", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Batch nr.. + /// + internal static string Batch_nr { + get { + return ResourceManager.GetString("Batch_nr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Bench. + /// + internal static string Bench { + get { + return ResourceManager.GetString("Bench", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cancel. + /// + internal static string CancelBtnText { + get { + return ResourceManager.GetString("CancelBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Caption. + /// + internal static string Caption { + get { + return ResourceManager.GetString("Caption", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Category. + /// + internal static string Category { + get { + return ResourceManager.GetString("Category", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Compound. + /// + internal static string Compound { + get { + return ResourceManager.GetString("Compound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Configuration. + /// + internal static string Configuration { + get { + return ResourceManager.GetString("Configuration", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Density. + /// + internal static string Density { + get { + return ResourceManager.GetString("Density", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Density correction. + /// + internal static string Density_correction { + get { + return ResourceManager.GetString("Density_correction", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Down. + /// + internal static string DownBtnText { + get { + return ResourceManager.GetString("DownBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to End. + /// + internal static string End { + get { + return ResourceManager.GetString("End", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to End mass. + /// + internal static string End_mass { + get { + return ResourceManager.GetString("End_mass", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to End state. + /// + internal static string End_state { + get { + return ResourceManager.GetString("End_state", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to End volume. + /// + internal static string End_volume { + get { + return ResourceManager.GetString("End_volume", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to End volume aux. + /// + internal static string End_volume_aux { + get { + return ResourceManager.GetString("End_volume_aux", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to End volume main. + /// + internal static string End_volume_main { + get { + return ResourceManager.GetString("End_volume_main", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to End state aux.. + /// + internal static string EndState_aux { + get { + return ResourceManager.GetString("EndState_aux", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to End state main. + /// + internal static string EndState_main { + get { + return ResourceManager.GetString("EndState_main", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Energy. + /// + internal static string Energy { + get { + return ResourceManager.GetString("Energy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Energy ref.. + /// + internal static string Energy_ref { + get { + return ResourceManager.GetString("Energy_ref", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Err. aux.. + /// + internal static string Err_aux { + get { + return ResourceManager.GetString("Err_aux", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Err. main. + /// + internal static string Err_main { + get { + return ResourceManager.GetString("Err_main", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Err.Lim.Hi. + /// + internal static string ErrLimHi { + get { + return ResourceManager.GetString("ErrLimHi", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Err.Lim.Lo. + /// + internal static string ErrLimLo { + get { + return ResourceManager.GetString("ErrLimLo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error. + /// + internal static string Error { + get { + return ResourceManager.GetString("Error", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error flags. + /// + internal static string Error_flags { + get { + return ResourceManager.GetString("Error_flags", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to E rel. ref.. + /// + internal static string ErrRef { + get { + return ResourceManager.GetString("ErrRef", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Failed meters count. + /// + internal static string Failed_meters_count { + get { + return ResourceManager.GetString("Failed_meters_count", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to fall. + /// + internal static string fall { + get { + return ResourceManager.GetString("fall", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Flow. + /// + internal static string Flow { + get { + return ResourceManager.GetString("Flow", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Format. + /// + internal static string Format { + get { + return ResourceManager.GetString("Format", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to from. + /// + internal static string from { + get { + return ResourceManager.GetString("from", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to H amb. + /// + internal static string H_amb { + get { + return ResourceManager.GetString("H_amb", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Heat meter. + /// + internal static string Heat_meter { + get { + return ResourceManager.GetString("Heat_meter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Item. + /// + internal static string Item { + get { + return ResourceManager.GetString("Item", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Legalizator. + /// + internal static string Legalizator { + get { + return ResourceManager.GetString("Legalizator", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to main. + /// + internal static string main { + get { + return ResourceManager.GetString("main", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to M.Class. + /// + internal static string MClass { + get { + return ResourceManager.GetString("MClass", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Meter type. + /// + internal static string Meter_type { + get { + return ResourceManager.GetString("Meter_type", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mounting. + /// + internal static string Mounting { + get { + return ResourceManager.GetString("Mounting", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No. + /// + internal static string No { + get { + return ResourceManager.GetString("No", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to OK. + /// + internal static string OkBtnText { + get { + return ResourceManager.GetString("OkBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to P amb. + /// + internal static string P_amb { + get { + return ResourceManager.GetString("P_amb", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to P delta. + /// + internal static string P_delta { + get { + return ResourceManager.GetString("P_delta", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to P delta end. + /// + internal static string P_delta_end { + get { + return ResourceManager.GetString("P_delta_end", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to P delta mean. + /// + internal static string P_delta_mean { + get { + return ResourceManager.GetString("P_delta_mean", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to P delta start. + /// + internal static string P_delta_start { + get { + return ResourceManager.GetString("P_delta_start", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to P down. + /// + internal static string P_dn { + get { + return ResourceManager.GetString("P_dn", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to P down end. + /// + internal static string P_dn_end { + get { + return ResourceManager.GetString("P_dn_end", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to P down start. + /// + internal static string P_dn_start { + get { + return ResourceManager.GetString("P_dn_start", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to P up. + /// + internal static string P_up { + get { + return ResourceManager.GetString("P_up", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to P up end. + /// + internal static string P_up_end { + get { + return ResourceManager.GetString("P_up_end", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to P up start. + /// + internal static string P_up_start { + get { + return ResourceManager.GetString("P_up_start", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Page. + /// + internal static string Page { + get { + return ResourceManager.GetString("Page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Passed meters count. + /// + internal static string Passed_meters_count { + get { + return ResourceManager.GetString("Passed_meters_count", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PO. + /// + internal static string PO { + get { + return ResourceManager.GetString("PO", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pos.. + /// + internal static string Pos { + get { + return ResourceManager.GetString("Pos", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Precision. + /// + internal static string Precision { + get { + return ResourceManager.GetString("Precision", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Procedure. + /// + internal static string Procedure { + get { + return ResourceManager.GetString("Procedure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Producer. + /// + internal static string Producer { + get { + return ResourceManager.GetString("Producer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Protocol. + /// + internal static string Protocol { + get { + return ResourceManager.GetString("Protocol", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pulses. + /// + internal static string Pulses { + get { + return ResourceManager.GetString("Pulses", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pulses/l. + /// + internal static string PulsesLiter { + get { + return ResourceManager.GetString("PulsesLiter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Q fall. + /// + internal static string Q_fall { + get { + return ResourceManager.GetString("Q_fall", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Q from. + /// + internal static string Q_from { + get { + return ResourceManager.GetString("Q_from", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Q rise. + /// + internal static string Q_rise { + get { + return ResourceManager.GetString("Q_rise", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Q to. + /// + internal static string Q_to { + get { + return ResourceManager.GetString("Q_to", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Quantity. + /// + internal static string Quantity { + get { + return ResourceManager.GetString("Quantity", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ref.pulses. + /// + internal static string RefPulses { + get { + return ResourceManager.GetString("RefPulses", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remark. + /// + internal static string Remark { + get { + return ResourceManager.GetString("Remark", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to < Remove. + /// + internal static string Remove { + get { + return ResourceManager.GetString("Remove", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remove all. + /// + internal static string Remove_all { + get { + return ResourceManager.GetString("Remove_all", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Result. + /// + internal static string Result { + get { + return ResourceManager.GetString("Result", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Result code. + /// + internal static string Result_code { + get { + return ResourceManager.GetString("Result_code", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Results. + /// + internal static string Results { + get { + return ResourceManager.GetString("Results", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to rise. + /// + internal static string rise { + get { + return ResourceManager.GetString("rise", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Selected results. + /// + internal static string Selected_results { + get { + return ResourceManager.GetString("Selected_results", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to sensitivity. + /// + internal static string sensitivity { + get { + return ResourceManager.GetString("sensitivity", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Single. + /// + internal static string Single { + get { + return ResourceManager.GetString("Single", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to s/n. + /// + internal static string sn { + get { + return ResourceManager.GetString("sn", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to s/n aux.. + /// + internal static string sn_aux { + get { + return ResourceManager.GetString("sn_aux", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to s/n main. + /// + internal static string sn_main { + get { + return ResourceManager.GetString("sn_main", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Start. + /// + internal static string Start { + get { + return ResourceManager.GetString("Start", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Start mass. + /// + internal static string Start_mass { + get { + return ResourceManager.GetString("Start_mass", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Start volume. + /// + internal static string Start_volume { + get { + return ResourceManager.GetString("Start_volume", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Start volume aux. + /// + internal static string Start_volume_aux { + get { + return ResourceManager.GetString("Start_volume_aux", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Start volume main. + /// + internal static string Start_volume_main { + get { + return ResourceManager.GetString("Start_volume_main", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T amb. + /// + internal static string T_amb { + get { + return ResourceManager.GetString("T_amb", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T div. + /// + internal static string T_div { + get { + return ResourceManager.GetString("T_div", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T end. + /// + internal static string T_end { + get { + return ResourceManager.GetString("T_end", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T in. + /// + internal static string T_in { + get { + return ResourceManager.GetString("T_in", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T out. + /// + internal static string T_out { + get { + return ResourceManager.GetString("T_out", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T [s]. + /// + internal static string T_s { + get { + return ResourceManager.GetString("T_s", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T start. + /// + internal static string T_start { + get { + return ResourceManager.GetString("T_start", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test. + /// + internal static string Test { + get { + return ResourceManager.GetString("Test", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test done. + /// + internal static string Test_done { + get { + return ResourceManager.GetString("Test_done", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test ID. + /// + internal static string Test_ID { + get { + return ResourceManager.GetString("Test_ID", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test method. + /// + internal static string Test_method { + get { + return ResourceManager.GetString("Test_method", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test passed. + /// + internal static string Test_passed { + get { + return ResourceManager.GetString("Test_passed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test vol.. + /// + internal static string Test_vol { + get { + return ResourceManager.GetString("Test_vol", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to to. + /// + internal static string to { + get { + return ResourceManager.GetString("to", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Relative error of a meter. + /// + internal static string Tooltip_E_rel { + get { + return ResourceManager.GetString("Tooltip_E_rel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Relative error of the master meter. + /// + internal static string Tooltip_E_rel_ref { + get { + return ResourceManager.GetString("Tooltip_E_rel_ref", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ambient humidity during test. + /// + internal static string Tooltip_Hu_Amb_M { + get { + return ResourceManager.GetString("Tooltip_Hu_Amb_M", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ambient pressure during test. + /// + internal static string Tooltip_P_Amb_M { + get { + return ResourceManager.GetString("Tooltip_P_Amb_M", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pressure difference measured by delta P meter - actual. + /// + internal static string Tooltip_P_de_ac { + get { + return ResourceManager.GetString("Tooltip_P_de_ac", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pressure difference measured by delta P meter - average. + /// + internal static string Tooltip_P_de_avg { + get { + return ResourceManager.GetString("Tooltip_P_de_avg", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pressure difference measured by delta P meter - at the end of the test. + /// + internal static string Tooltip_P_de_en { + get { + return ResourceManager.GetString("Tooltip_P_de_en", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pressure difference measured by delta P meter - maximum during the test. + /// + internal static string Tooltip_P_de_max { + get { + return ResourceManager.GetString("Tooltip_P_de_max", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pressure difference measured by delta P meter - mean. + /// + internal static string Tooltip_P_de_me { + get { + return ResourceManager.GetString("Tooltip_P_de_me", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pressure difference measured by delta P meter - minimum during the test. + /// + internal static string Tooltip_P_de_min { + get { + return ResourceManager.GetString("Tooltip_P_de_min", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pressure difference measured by delta P meter - at the start of the test. + /// + internal static string Tooltip_P_de_st { + get { + return ResourceManager.GetString("Tooltip_P_de_st", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pressure at the outlet actual. + /// + internal static string Tooltip_P_dw_ac { + get { + return ResourceManager.GetString("Tooltip_P_dw_ac", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Average pressure at the outlet. + /// + internal static string Tooltip_P_dw_avg { + get { + return ResourceManager.GetString("Tooltip_P_dw_avg", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pressure at the outlet at end of the test. + /// + internal static string Tooltip_P_dw_en { + get { + return ResourceManager.GetString("Tooltip_P_dw_en", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Maximum pressure at the outlet during the test. + /// + internal static string Tooltip_P_dw_max { + get { + return ResourceManager.GetString("Tooltip_P_dw_max", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mean pressure at the outlet. + /// + internal static string Tooltip_P_dw_me { + get { + return ResourceManager.GetString("Tooltip_P_dw_me", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Minimum pressure at the outlet during the test. + /// + internal static string Tooltip_P_dw_min { + get { + return ResourceManager.GetString("Tooltip_P_dw_min", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pressure at the outlet at start of the test. + /// + internal static string Tooltip_P_dw_st { + get { + return ResourceManager.GetString("Tooltip_P_dw_st", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pressure at the inlet actual. + /// + internal static string Tooltip_P_up_ac { + get { + return ResourceManager.GetString("Tooltip_P_up_ac", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Average pressure at the inlet. + /// + internal static string Tooltip_P_up_avg { + get { + return ResourceManager.GetString("Tooltip_P_up_avg", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pressure at the inlet at end of the test. + /// + internal static string Tooltip_P_up_en { + get { + return ResourceManager.GetString("Tooltip_P_up_en", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Maximum pressure at the inlet during the test. + /// + internal static string Tooltip_P_up_max { + get { + return ResourceManager.GetString("Tooltip_P_up_max", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mean pressure at the inlet. + /// + internal static string Tooltip_P_up_me { + get { + return ResourceManager.GetString("Tooltip_P_up_me", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Minimum pressure at the inlet during the test. + /// + internal static string Tooltip_P_up_min { + get { + return ResourceManager.GetString("Tooltip_P_up_min", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pressure at the inlet at start of the test. + /// + internal static string Tooltip_P_up_st { + get { + return ResourceManager.GetString("Tooltip_P_up_st", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Flow obtained from the master meter - end. + /// + internal static string Tooltip_Q_end { + get { + return ResourceManager.GetString("Tooltip_Q_end", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Flow calculated from conventional true mass and time. + /// + internal static string Tooltip_Q_m_r { + get { + return ResourceManager.GetString("Tooltip_Q_m_r", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Flow obtained from the master meter - max. + /// + internal static string Tooltip_Q_max { + get { + return ResourceManager.GetString("Tooltip_Q_max", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Flow obtained from the master meter - min. + /// + internal static string Tooltip_Q_min { + get { + return ResourceManager.GetString("Tooltip_Q_min", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Flow obtained from the master meter - actual. + /// + internal static string Tooltip_Q_riac { + get { + return ResourceManager.GetString("Tooltip_Q_riac", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Flow obtained from the master meter - mean. + /// + internal static string Tooltip_Q_rim { + get { + return ResourceManager.GetString("Tooltip_Q_rim", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Flow obtained from the master meter - start. + /// + internal static string Tooltip_Q_start { + get { + return ResourceManager.GetString("Tooltip_Q_start", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Flow measured by the reference flow meter. + /// + internal static string Tooltip_Q_v_r { + get { + return ResourceManager.GetString("Tooltip_Q_v_r", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Calculated density of water from table or formula at water density calibration temperature (r). + /// + internal static string Tooltip_Rho_Wa_calc { + get { + return ResourceManager.GetString("Tooltip_Rho_Wa_calc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Serial number of the meter. + /// + internal static string Tooltip_sn { + get { + return ResourceManager.GetString("Tooltip_sn", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Serial number of the auxiliary meter of a compound water meter. + /// + internal static string Tooltip_sn_aux { + get { + return ResourceManager.GetString("Tooltip_sn_aux", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Serial number of the main meter of a compound water meter. + /// + internal static string Tooltip_sn_main { + get { + return ResourceManager.GetString("Tooltip_sn_main", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ambient temperature during test. + /// + internal static string Tooltip_T_Amb_M { + get { + return ResourceManager.GetString("Tooltip_T_Amb_M", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Actual temperature at the diverter. + /// + internal static string Tooltip_T_di_ac { + get { + return ResourceManager.GetString("Tooltip_T_di_ac", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Average temperature at the diverter. + /// + internal static string Tooltip_T_di_avg { + get { + return ResourceManager.GetString("Tooltip_T_di_avg", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Temperature at the diverter at end of the test – last 4 measurement before the end. + /// + internal static string Tooltip_T_di_en { + get { + return ResourceManager.GetString("Tooltip_T_di_en", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Maximum temperature at the diverter during the test. + /// + internal static string Tooltip_T_di_max { + get { + return ResourceManager.GetString("Tooltip_T_di_max", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mean temperature at diverter. + /// + internal static string Tooltip_T_di_me { + get { + return ResourceManager.GetString("Tooltip_T_di_me", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Minimum temperature at the diverter during the test. + /// + internal static string Tooltip_T_di_min { + get { + return ResourceManager.GetString("Tooltip_T_di_min", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Temperature at the diverter at start of the test – first 4 measurements after the start. + /// + internal static string Tooltip_T_di_st { + get { + return ResourceManager.GetString("Tooltip_T_di_st", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Actual temperature at the outlet. + /// + internal static string Tooltip_T_dw_ac { + get { + return ResourceManager.GetString("Tooltip_T_dw_ac", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Average temperature at the outlet. + /// + internal static string Tooltip_T_dw_avg { + get { + return ResourceManager.GetString("Tooltip_T_dw_avg", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Temperature at the outlet at end of the test – last 4 measurement before the end. + /// + internal static string Tooltip_T_dw_en { + get { + return ResourceManager.GetString("Tooltip_T_dw_en", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Maximum temperature at the outlet during the test. + /// + internal static string Tooltip_T_dw_max { + get { + return ResourceManager.GetString("Tooltip_T_dw_max", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mean temperature at outlet. + /// + internal static string Tooltip_T_dw_me { + get { + return ResourceManager.GetString("Tooltip_T_dw_me", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Minimum temperature at the outlet during the test. + /// + internal static string Tooltip_T_dw_min { + get { + return ResourceManager.GetString("Tooltip_T_dw_min", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Temperature at the outlet at start of the test – first 4 measurements after the start. + /// + internal static string Tooltip_T_dw_st { + get { + return ResourceManager.GetString("Tooltip_T_dw_st", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Actual temperature in the line. + /// + internal static string Tooltip_T_ln_ac { + get { + return ResourceManager.GetString("Tooltip_T_ln_ac", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Average temperature in the line during a test. + /// + internal static string Tooltip_T_ln_avg { + get { + return ResourceManager.GetString("Tooltip_T_ln_avg", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Temperature in the line at end of the test – last 4 measurement before the end. + /// + internal static string Tooltip_T_ln_en { + get { + return ResourceManager.GetString("Tooltip_T_ln_en", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Maximum temperature in the line during the test. + /// + internal static string Tooltip_T_ln_max { + get { + return ResourceManager.GetString("Tooltip_T_ln_max", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mean temperature in the line during a test. + /// + internal static string Tooltip_T_ln_me { + get { + return ResourceManager.GetString("Tooltip_T_ln_me", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Minimum temperature in the line during the test. + /// + internal static string Tooltip_T_ln_min { + get { + return ResourceManager.GetString("Tooltip_T_ln_min", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Temperature in the line at start of the test – first 4 measurements after the start. + /// + internal static string Tooltip_T_ln_st { + get { + return ResourceManager.GetString("Tooltip_T_ln_st", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Temperature of water sample at water density calibration. + /// + internal static string Tooltip_T_rho_0 { + get { + return ResourceManager.GetString("Tooltip_T_rho_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Actual temperature at the inlet. + /// + internal static string Tooltip_T_up_ac { + get { + return ResourceManager.GetString("Tooltip_T_up_ac", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Average temperature at the inlet during a test. + /// + internal static string Tooltip_T_up_avg { + get { + return ResourceManager.GetString("Tooltip_T_up_avg", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Temperature at the inlet at end of the test – last 4 measurement before the end. + /// + internal static string Tooltip_T_up_en { + get { + return ResourceManager.GetString("Tooltip_T_up_en", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Maximum temperature at the inlet during the test. + /// + internal static string Tooltip_T_up_max { + get { + return ResourceManager.GetString("Tooltip_T_up_max", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mean temperature at inlet during a test. + /// + internal static string Tooltip_T_up_me { + get { + return ResourceManager.GetString("Tooltip_T_up_me", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Minimum temperature at the inlet during the test. + /// + internal static string Tooltip_T_up_min { + get { + return ResourceManager.GetString("Tooltip_T_up_min", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Temperature at the inlet at start of the test – first 4 measurements after the start. + /// + internal static string Tooltip_T_up_st { + get { + return ResourceManager.GetString("Tooltip_T_up_st", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Volume measured by the tested meter. + /// + internal static string Tooltip_Vol_Mt { + get { + return ResourceManager.GetString("Tooltip_Vol_Mt", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reference volume for tested meter. + /// + internal static string Tooltip_Vol_rm { + get { + return ResourceManager.GetString("Tooltip_Vol_rm", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Uncertainty. + /// + internal static string Uncertainty { + get { + return ResourceManager.GetString("Uncertainty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unit. + /// + internal static string Unit { + get { + return ResourceManager.GetString("Unit", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Units. + /// + internal static string Units { + get { + return ResourceManager.GetString("Units", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Up. + /// + internal static string UpBtnText { + get { + return ResourceManager.GetString("UpBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to User. + /// + internal static string User { + get { + return ResourceManager.GetString("User", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to User description. + /// + internal static string User_description { + get { + return ResourceManager.GetString("User_description", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to User nr.. + /// + internal static string User_nr { + get { + return ResourceManager.GetString("User_nr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ver.. + /// + internal static string Ver { + get { + return ResourceManager.GetString("Ver", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ro. + /// + internal static string VName_Dens { + get { + return ResourceManager.GetString("VName_Dens", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to E. + /// + internal static string VName_Error { + get { + return ResourceManager.GetString("VName_Error", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Q. + /// + internal static string VName_Flow { + get { + return ResourceManager.GetString("VName_Flow", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hu.. + /// + internal static string VName_Humi { + get { + return ResourceManager.GetString("VName_Humi", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mass. + /// + internal static string VName_Mass { + get { + return ResourceManager.GetString("VName_Mass", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Press.. + /// + internal static string VName_Press { + get { + return ResourceManager.GetString("VName_Press", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Temp.. + /// + internal static string VName_Temp { + get { + return ResourceManager.GetString("VName_Temp", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tau. + /// + internal static string VName_TstTime { + get { + return ResourceManager.GetString("VName_TstTime", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Vol.. + /// + internal static string VName_Vol { + get { + return ResourceManager.GetString("VName_Vol", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Vol.ref.. + /// + internal static string VolRef { + get { + return ResourceManager.GetString("VolRef", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Volume. + /// + internal static string Volume { + get { + return ResourceManager.GetString("Volume", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Volume aux. + /// + internal static string Volume_aux { + get { + return ResourceManager.GetString("Volume_aux", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Volume main. + /// + internal static string Volume_main { + get { + return ResourceManager.GetString("Volume_main", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Water Meter. + /// + internal static string Water_Meter { + get { + return ResourceManager.GetString("Water_Meter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Width. + /// + internal static string Width { + get { + return ResourceManager.GetString("Width", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to WM Type. + /// + internal static string WM_Type { + get { + return ResourceManager.GetString("WM_Type", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to WMs. + /// + internal static string WMs { + get { + return ResourceManager.GetString("WMs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Year. + /// + internal static string Year { + get { + return ResourceManager.GetString("Year", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Yes. + /// + internal static string Yes { + get { + return ResourceManager.GetString("Yes", resourceCulture); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/Results/Resources/Strings.cs.resx b/TBF_V2/Sources/TBF/Results/Resources/Strings.cs.resx new file mode 100644 index 00000000..f352bf2e --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Resources/Strings.cs.resx @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Přidat > + + + Zarovnání + + + Dostupné výsledky + + + Zrušit + + + Nadpis + + + Konfigurace + + + Dolů + + + Formát + + + Položka + + + OK + + + Přesnost + + + Poznámka + + + < Odebrat + + + Odebrat vše + + + Výsledek + + + Výsledky + + + Kód výsledku + + + Vybrané výsledky + + + Test + + + Jednotky + + + Nahoru + + + Šířka + + + Montáž + + + str. + + + Kategorie + + + Veličina + + + sériové číslo + + + Vodoměr + + + Číslo dávky + + + od + + + do + + + Jednotka + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Results/Resources/Strings.de.resx b/TBF_V2/Sources/TBF/Results/Resources/Strings.de.resx new file mode 100644 index 00000000..3c3217b2 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Resources/Strings.de.resx @@ -0,0 +1,414 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Hinzufügen > + + + Ausrichtung + + + Zulassung + + + Ergebnisse + + + Stapel Nr. + + + Prüfstand + + + Abbrechen + + + Überschrift + + + Konfiguration + + + Dichte + + + Abwärts + + + Endzeit + + + Eindstand Nebenz. + + + Eindstand Hauptz. + + + Eindstand + + + Fehlergrenze hoch + + + Fehlergrenze niedrig + + + Fehler + + + Referenzfehler + + + Fehler Nebenz. + + + Fehler Hauptz. + + + Durchfluss + + + Format + + + H umgebung + + + Posten + + + Metr. Klasse + + + OK + + + Bestellung + + + Pos. + + + Präzision + + + Prüfvorlage + + + Protokoll + + + Impulse + + + Impulse/l + + + Dr umgebung + + + Dr aus ende + + + Dr aus + + + Dr aus start + + + Dr ein ende + + + Dr ein + + + Dr ein start + + + Q fall + + + Q von + + + Q steig + + + Q bis + + + Ref. Impulse + + + < Entfernen + + + Alles entfernen + + + Ergebnis + + + Ergebnisse ausgewählt + + + Seriennr. + + + Seriennr. Nebenz. + + + Seriennr. Hauptz. + + + Startzeit + + + Prüfpunkt + + + Prüfpunkt + + + Prüfart + + + Prüfvolumen + + + T umgebung + + + T div + + + Endzeit + + + T ein + + + T aus + + + Dauer [s] + + + Startzeit + + + Unsicherheit + + + Einheit + + + Aufwärts + + + Benutzer + + + Benutzer Nr. + + + Ver. + + + Ref. Volumen + + + Volumen + + + Breite + + + WZ + + + WZ Typ + + + Eichjahr + + + Ergebnisse + + + Bemerkung + + + Ergebniscode + + + Montage + + + Hersteller + + + Typ + + + Verbund + + + + + + Einzel + + + Kategorie + + + Größe + + + Blz. + + + Wasserzähler + + + Nebenz. + + + Hauptz. + + + fall + + + von + + + steig + + + bis + + + Masse + + + Dichtekorektur + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Results/Resources/Strings.it.resx b/TBF_V2/Sources/TBF/Results/Resources/Strings.it.resx new file mode 100644 index 00000000..b6281918 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Resources/Strings.it.resx @@ -0,0 +1,540 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + aggiungere > + + + allineamento + + + Approvazione + + + Risultati disponibili + + + lotto n. + + + banco + + + Annulla + + + didascalia + + + configurazione + + + densità + + + Giù + + + Fine + + + fine stato ausiliario + + + fine stato principale + + + fine stato + + + limite errore massimo + + + limite errore minimo + + + Errore + + + Err. Ref. + + + errore ausiliario + + + errore principale + + + flusso + + + formato + + + h ambiente + + + Oggetto + + + classe metrologica + + + ok + + + PO + + + pos. + + + posizione + + + procedura + + + produttore + + + protocollo + + + impulsi + + + impulsi /l + + + P ambiente + + + P verso il basso + + + P basso + + + P inizio discesa + + + P fine salita + + + P su + + + P inizio su + + + caduta di Q + + + da Q + + + Q aumento + + + Q a + + + riferimento impulsi + + + < rimuovere + + + rimuovere tutto + + + risultato + + + selezionare risultati + + + s/n + + + s/n ausiliari + + + s/n principale + + + avvio + + + test o prova + + + prova ID + + + metodo di prova + + + test vol + + + T amb + + + T div + + + T fine + + + T dentro + + + T fuori + + + T [s] + + + T inizio + + + incertezza + + + unità predefinite + + + Su + + + utente + + + utente nr. + + + ver + + + riferimento vol. + + + Volume + + + larghezza + + + WMs + + + WM tipo + + + Anno + + + risultati + + + nota + + + codice risultato + + + montaggio + + + energia + + + energia ref + + + P delta + + + P delta fine + + + P delta significa + + + P delta inizio + + + tipo misura + + + composto + + + calorimetro + + + singolo + + + pagina + + + fine volume + + + inizio volume + + + fine volume ausiliario + + + fine volume principale + + + inizio volume ausiliario + + + inizio volume principale + + + volume ausiliario + + + volume principale + + + Peso finale + + + Peso iniziale + + + Categoria + + + Quantita' + + + Contatore acqua + + + Q + + + Pressione + + + Temperatura + + + Ro + + + Hu. + + + Peso + + + Tau + + + Volume + + + Differenza di pressione misurata dal delta P del contatore - valore reale + + + Differenza di pressione misurata dal delta P del contatore - valore medio + + + Differenza di pressione misurata dal delta P del contatore - + + + Differenza di pressione misurata dal delta P del contatore - media ntegrata + + + Differenza di pressione misurata dal delta P del contatore - all'inizio del test + + + Pressione reale all'uscita + + + Pressione media all'uscita + + + Pressione all'uscita ala fine del test + + + Media integrata pressione all'uscita + + + Pressione all'uscita all'inizio del test + + + Pressione reale all'ingresso + + + Pressione media all'ingresso + + + Pressione all'ingresso alla fine del ttest + + + Pressione media integrata all'ingreso + + + Pressione all'ingresso all'inizio del test + + + Portata calcolata dalla massa e tempo + + + Portata ottenuta dal contatore master - reale + + + Portata ottenuta d contatore master - media integrata + + + Portata calcolata dalla massa e tempo convenzionale + + + Temperatura reale sul deviatore + + + Temperatura media sul deviatore + + + Temperatura sul deviatore alla fine del test + + + Test terminato + + + Test OK + + + No + + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Results/Resources/Strings.pl.resx b/TBF_V2/Sources/TBF/Results/Resources/Strings.pl.resx new file mode 100644 index 00000000..2077251b --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Resources/Strings.pl.resx @@ -0,0 +1,444 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Dodać > + + + Wyrównywanie + + + Zatwierdzenie + + + Dostępne wyniki: + + + Nr pakietu + + + Stanowisko + + + Anuluj + + + Podpis + + + Konfiguracja + + + Gęstość + + + W dół + + + Koniec + + + Stan końcowy dodatkowy + + + Stan końcowy podstawowy + + + Stan końcowy + + + Max. Dopuszczalny błąd + + + Min. Dopuszczalny błąd + + + Błąd + + + Zakres błędów + + + Błąd dopuszczalny + + + Błąd podstawowy + + + Przepływ + + + Format + + + H otoczenia + + + Pozycja + + + Klasa licznika + + + OK + + + Zamówienie + + + Pozycja + + + Dokładność + + + Procedura + + + Producent + + + Zapiska + + + Impulsy + + + imp./litr + + + P otoczenia + + + P w dół koniec + + + P w dół + + + P w dół start + + + P do góry koniec + + + P do góry + + + P do góry strat + + + Q obniżanie + + + Q od + + + Q zwiększanie + + + Q do + + + Wzorcowe impulsy + + + < usuń + + + Usunąć wszystko + + + Wyniki + + + Wybierz wyniki + + + Nr seryjny + + + Nr seryjny dodatkowy + + + Nr seryjny główny + + + Początek + + + Test + + + ID testu + + + Metoda badania + + + Objętość testu + + + T otoczenia + + + T różnica + + + T końcowa + + + T wejściowa + + + T wyjściowa + + + T [s] + + + T początkowa + + + Niepewność [%] + + + Jednostki + + + Do góry + + + Użytkownik + + + Nr Użytkownika + + + Wersja + + + Wzorzec objętości + + + Objętość + + + Szerokość + + + Liczniki + + + Typ licznika + + + Rok + + + Wyniki + + + Uwagi + + + Kod wyniku + + + Montaż + + + Energia + + + Wzorzec energii + + + P delta + + + P delta końcowe + + + P delta główne + + + P delta początkowe + + + Typ licznika + + + Sprzężony + + + Licznik ciepła + + + Pojedynczy + + + Strona + + + Objętość końcowa + + + Objętość początkowa + + + Dodatkowa objętość końcowa + + + Główna objętość końćowa + + + Dodatkowa objętość początkowa + + + Główna objętość początkowa + + + Objętość dodatkowa + + + Objętość główna + + + dodatkowy + + + główny + + + obniżanie + + + od + + + zwiększanie + + + do + + + Jednostka + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Results/Resources/Strings.resx b/TBF_V2/Sources/TBF/Results/Resources/Strings.resx new file mode 100644 index 00000000..201ab64b --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Resources/Strings.resx @@ -0,0 +1,726 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Add > + + + Alignment + + + Approval + + + Available results + + + Batch nr. + + + Bench + + + Cancel + + + Caption + + + Configuration + + + Density + + + Down + + + End + + + End state aux. + + + End state main + + + End state + + + Err.Lim.Hi + + + Err.Lim.Lo + + + Error + + + E rel. ref. + + + Err. aux. + + + Err. main + + + Flow + + + Format + + + H amb + + + Item + + + M.Class + + + OK + + + PO + + + Pos. + + + Precision + + + Procedure + + + Producer + + + Protocol + + + Pulses + + + Pulses/l + + + P amb + + + P down end + + + P down + + + P down start + + + P up end + + + P up + + + P up start + + + Q fall + + + Q from + + + Q rise + + + Q to + + + Ref.pulses + + + < Remove + + + Remove all + + + Result + + + Selected results + + + s/n + + + s/n aux. + + + s/n main + + + Start + + + Test + + + Test ID + + + Test method + + + Test vol. + + + T amb + + + T div + + + T end + + + T in + + + T out + + + T [s] + + + T start + + + Uncertainty + + + Units + + + Up + + + User + + + User nr. + + + Ver. + + + Vol.ref. + + + Volume + + + Width + + + WMs + + + WM Type + + + Year + + + Results + + + Remark + + + Result code + + + Mounting + + + Energy + + + Energy ref. + + + P delta + + + P delta end + + + P delta mean + + + P delta start + + + Meter type + + + Compound + + + Heat meter + + + Single + + + Page + + + End volume + + + Start volume + + + End volume aux + + + End volume main + + + Start volume aux + + + Start volume main + + + Volume aux + + + Volume main + + + End mass + + + Start mass + + + Category + + + Quantity + + + Water Meter + + + Q + + + Press. + + + Temp. + + + Ro + + + Hu. + + + Mass + + + Tau + + + Vol. + + + Pressure difference measured by delta P meter - actual + + + Pressure difference measured by delta P meter - average + + + Pressure difference measured by delta P meter - at the end of the test + + + Pressure difference measured by delta P meter - mean + + + Pressure difference measured by delta P meter - at the start of the test + + + Pressure at the outlet actual + + + Average pressure at the outlet + + + Pressure at the outlet at end of the test + + + Mean pressure at the outlet + + + Pressure at the outlet at start of the test + + + Pressure at the inlet actual + + + Average pressure at the inlet + + + Pressure at the inlet at end of the test + + + Mean pressure at the inlet + + + Pressure at the inlet at start of the test + + + Flow calculated from conventional true mass and time + + + Flow obtained from the master meter - actual + + + Flow obtained from the master meter - mean + + + Flow measured by the reference flow meter + + + Actual temperature at the diverter + + + Average temperature at the diverter + + + Temperature at the diverter at end of the test – last 4 measurement before the end + + + Mean temperature at diverter + + + Temperature at the diverter at start of the test – first 4 measurements after the start + + + Actual temperature at the outlet + + + Average temperature at the outlet + + + Temperature at the outlet at end of the test – last 4 measurement before the end + + + Mean temperature at outlet + + + Temperature at the outlet at start of the test – first 4 measurements after the start + + + Actual temperature at the inlet + + + Average temperature at the inlet during a test + + + Temperature at the inlet at end of the test – last 4 measurement before the end + + + Mean temperature at inlet during a test + + + Temperature at the inlet at start of the test – first 4 measurements after the start + + + aux. + + + main + + + Relative error of a meter + + + Relative error of the master meter + + + Serial number of the meter + + + Serial number of the auxiliary meter of a compound water meter + + + Serial number of the main meter of a compound water meter + + + Volume measured by the tested meter + + + Reference volume for tested meter + + + E + + + fall + + + from + + + rise + + + to + + + Ambient humidity during test + + + Ambient pressure during test + + + Ambient temperature during test + + + Test done + + + Test passed + + + No + + + Yes + + + Density correction + + + Error flags + + + Legalizator + + + User description + + + Failed meters count + + + Passed meters count + + + sensitivity + + + Flow obtained from the master meter - end + + + Flow obtained from the master meter - max + + + Flow obtained from the master meter - min + + + Flow obtained from the master meter - start + + + Maximum pressure at the outlet during the test + + + Minimum pressure at the outlet during the test + + + Maximum pressure at the inlet during the test + + + Minimum pressure at the inlet during the test + + + Maximum temperature at the diverter during the test + + + Minimum temperature at the diverter during the test + + + Maximum temperature at the outlet during the test + + + Minimum temperature at the outlet during the test + + + Maximum temperature at the inlet during the test + + + Minimum temperature at the inlet during the test + + + Pressure difference measured by delta P meter - maximum during the test + + + Pressure difference measured by delta P meter - minimum during the test + + + Calculated density of water from table or formula at water density calibration temperature (r) + + + Temperature of water sample at water density calibration + + + Actual temperature in the line + + + Average temperature in the line during a test + + + Temperature in the line at end of the test – last 4 measurement before the end + + + Maximum temperature in the line during the test + + + Mean temperature in the line during a test + + + Minimum temperature in the line during the test + + + Temperature in the line at start of the test – first 4 measurements after the start + + + Unit + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Results/Resources/Strings.ru.resx b/TBF_V2/Sources/TBF/Results/Resources/Strings.ru.resx new file mode 100644 index 00000000..a7d156a9 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Resources/Strings.ru.resx @@ -0,0 +1,441 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Добавить > + + + Выравнивание + + + Утверждение + + + Доступные результаты + + + № пакета + + + Установка + + + Отмена + + + Подпись + + + Конфигурация + + + Плотность + + + Вниз + + + Конец + + + Конечн. сост. доп. + + + Конечн. сост. главн. + + + Итог + + + Макс.допуст.погр. + + + Мин.доп.погр + + + Ошибка + + + Err.ref. + + + Погр.доп. + + + Погр.глав. + + + Расход + + + Формат + + + H amb + + + Item + + + M.Class + + + OK + + + PO + + + Pos. + + + Точность + + + Процедура + + + Производитель + + + Протокол + + + Импульсы + + + Импульсы/л + + + P amb + + + P вниз конец + + + P вниз + + + P вниз начало + + + P вверз конец + + + P вверх + + + P вверх начало + + + Q пониж + + + Q от + + + Q повыш + + + Q до + + + Эт.импульсы + + + < Удалить + + + Удалить все + + + Результат + + + Выбанные результаты + + + С/Н: + + + С/Н доп + + + С/Н главн + + + Начало + + + Тест + + + ID теста + + + Метод испытания + + + Тест.объем + + + T amb + + + T div + + + T оконч. + + + T вх + + + T вых + + + T [с] + + + T начала + + + Неопределенность + + + Единицы + + + Вверх + + + Пользователь + + + № пользователя + + + Эт. + + + Об.эт. + + + Объем + + + Ширина + + + Счетчики + + + Тип счетчика + + + Год + + + Результаты + + + Примечание + + + Код результата + + + Монтаж + + + Энергия + + + Эт. энергия + + + P дельта + + + P дельта кон + + + P дельта ср + + + P дельта нач + + + Тип счетчика + + + Комбинированный + + + Теплосчетчик + + + Единый + + + Страница + + + Кон. объем + + + Нач. объем + + + Кон. объем доп. + + + Кон. объем главн. + + + Нач. объем доп. + + + Нач. объем главн. + + + Объем доп. + + + Объем главн. + + + доп. + + + главн. + + + Объем + + + Нет + + + Да + + + Счетчик воды + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Results/Results.csproj b/TBF_V2/Sources/TBF/Results/Results.csproj new file mode 100644 index 00000000..64d4f875 --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Results.csproj @@ -0,0 +1,191 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB} + Library + Properties + Results + Results + v4.0 + 512 + + + true + full + false + bin\Debug\ + TRACE;DEBUG;GENESIS;IPERL;LANG_DE + prompt + 4 + x86 + + + pdbonly + true + bin\Release\ + TRACE;GENESIS;IPERL;LANG_DE + prompt + 4 + + + + ..\packages\ControlBoard\Genesis\ControlComponent3U.dll + + + ..\packages\FluentNHibernate.2.0.3.0\lib\net40\FluentNHibernate.dll + + + ..\packages\Iesi.Collections.4.0.0.4000\lib\net40\Iesi.Collections.dll + + + ..\packages\log4net.2.0.2\lib\net40-full\log4net.dll + + + ..\packages\MySql.Data.6.6.5\lib\net40\MySql.Data.dll + + + ..\packages\NHibernate.4.0.4.4000\lib\net40\NHibernate.dll + + + + + + + + + + + + + + + + + + + + + + + + Form + + + BatchResultsDlg.cs + + + Component + + + UserControl + + + ResultsConfigCtrl.cs + + + Form + + + ResultsConfigDlg.cs + + + + + + + + + + + Component + + + + Component + + + Component + + + Component + + + + + Component + + + + + True + True + Resources.resx + + + True + True + Strings.resx + + + + + + + {743DF7DB-C7B6-42EB-986D-0F485E5588E4} + Config + + + {6E5CB0E9-E1B6-4E5D-AC6E-B1049E180F2B} + Users + + + + + + + + + + BatchResultsDlg.cs + + + ListViewEx.cs + + + ResultsConfigCtrl.cs + + + ResultsConfigDlg.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + Designer + + + + + ResXFileCodeGenerator + Strings.Designer.cs + + + + + + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Results/Utils.cs b/TBF_V2/Sources/TBF/Results/Utils.cs new file mode 100644 index 00000000..8550046e --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/Utils.cs @@ -0,0 +1,70 @@ +/// +/// Copyright (c) 2016-2018 Sensus Slovensko a.s. +/// +using System; +using System.Text; +using Config.Entities; + +namespace Results +{ + public static class Utils + { + public static string GetTestName(string name, int repeats, int repetitionNr) + { + if (repeats == 1) return name; + return string.Format("{0} ({1}/{2})", name, repetitionNr, repeats); + } + + + public static int BenchIdOracle2Asc(int benchIdOracle) + { + switch (benchIdOracle) + { + case 4: return 35; /// WR9 + case 5: return 33; /// WR10 + case 6: return 34; /// WR11 + case 7: return 29; /// PT7, special + case 8: return 36; /// WR13 + case 9: return 37; /// WR15 + case 10: return 38; /// WR16 + default: return 0; + } + } + + + /// + /// Converts ErrorFlags integer to string. Supports up to 31 flags (E1..E31). + /// + /// Input + /// Output string + public static string ErrorFlagsStr(int errorFlags) + { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < 30; i++) + { + if ((errorFlags & (1 << i)) != 0) + { + sb.Append("E"); + sb.Append(i + 1); + sb.Append(" "); + } + } + return sb.ToString().TrimEnd(); + } + + public static string PassedColorStr(bool passed, bool useRedGreenColor) + { +#if PUCHONG_PT200 + return (useRedGreenColor) ? (passed ? "OK|Green" : "NG|Red") : (passed ? "OK|White" : "NG|White"); +#elif BAHRAIN_50 || DUBAJ_50 + return (useRedGreenColor) ? (passed ? "PASSED|Green" : "FAILED|Red") : (passed ? "PASSED|White" : "FAILED|White"); +#elif LANG_PL + return (useRedGreenColor) ? (passed ? "+|Green" : "-|Red") : (passed ? "+|White" : "-|White"); +#elif LANG_RU + return (useRedGreenColor) ? (passed ? "годен|Green" : "негоден|Red") : (passed ? "годен|White" : "негоден|White"); +#else + return (useRedGreenColor) ? (passed ? "OK|Green" : "NOK|Red") : (passed ? "OK|White" : "NOK|White"); +#endif + } + } +} diff --git a/TBF_V2/Sources/TBF/Results/WMeterRsltItemSpec.cs b/TBF_V2/Sources/TBF/Results/WMeterRsltItemSpec.cs new file mode 100644 index 00000000..015dc48a --- /dev/null +++ b/TBF_V2/Sources/TBF/Results/WMeterRsltItemSpec.cs @@ -0,0 +1,676 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using Config; +using Config.Entities; +using Results.Entities; +using Results.Resources; +using System.Globalization; + +namespace Results +{ + public class WMeterRsltItemSpec + { + /// + /// Public fields + /// + public readonly int Uid; + public readonly string OldUid; + public readonly string Name; /// Name-s of all items must be unique + public readonly string ToolTipText; /// Tool-Tip Text + public readonly Quantity Quantity; /// Quantity + public readonly ItemCategory Category; /// + public string Caption; /// Specifies item description to be printed as a caption (in the header, etc.) + public string TestID; /// Specifies the test + public Config.Unit Units; /// Specifies units for the output + public string Format; /// Specifies format for the output + public string Precision; /// Specifies precision for the output + public int Width; /// Specifies the number of characters of the output, 0 = automatic + public Config.Entities.Alignment Alignment; /// Specifies alignment for the output + + public WMeterRsltItemSpec Clone() + { + WMeterRsltItemSpec item2 = new WMeterRsltItemSpec((ItemID)Uid, Name, ToolTipText, Quantity, Category, printDlgt); + item2.Caption = Caption; + item2.TestID = TestID; + item2.Units = Units; + item2.Format = Format; + item2.Precision = Precision; + item2.Width = Width; + item2.Alignment = Alignment; + return item2; + } + + + public static double RealDensity; + public static double AtTemperature; + + + /// + /// Function to pick a MeterTestResult field and convert it into a string + /// + public delegate string PrintDlgt(WaterMeter waterMeterResult, string testID, Config.Unit units, string format, string precision); + + private readonly PrintDlgt printDlgt; + + /// Safe wrapper which replaces null-s by empty strings + public string Print(WaterMeter waterMeterResult) + { + return Print(waterMeterResult, TestID); + } + public string Print(WaterMeter waterMeterResult, string testId) + { + try + { + string str = printDlgt(waterMeterResult, testId, Units, Format, Precision); + if (str == null) str = string.Empty; + + int len = str.Length; + if (Width == 0 || len >= Width) + { + return str; + } + else if (Alignment == Config.Entities.Alignment.Left) + { + return str + new string(' ', Width - len); + } + else if (Alignment == Config.Entities.Alignment.Right) + { + return new string(' ', Width - len) + str; + } + else // Alignment.Center or Alignment.Justified + { + int nrSpaces = Width - len; + return new string(' ', nrSpaces / 2) + str + new string(' ', nrSpaces - (nrSpaces / 2)); + } + } + catch (Exception) + { + return string.Empty; + } + } + + /// + /// Public constructor + /// + public WMeterRsltItemSpec(ItemID itemId, string name, string toolTipText, Quantity quantity, ItemCategory category, PrintDlgt printDlgt) + { + Uid = (int)itemId; + OldUid = itemId.ToString().Replace("__", "/").Replace('_', ' '); + Name = name; + ToolTipText = toolTipText; + Quantity = quantity; + Category = category; + this.printDlgt = printDlgt; + + Format = string.Empty; + Precision = string.Empty; + TestID = string.Empty; + } + + /// + /// Constructor without ToolTip text + /// + public WMeterRsltItemSpec(ItemID itemId, string name, Quantity quantity, ItemCategory category, PrintDlgt printDlgt) + { + Uid = (int)itemId; + OldUid = itemId.ToString().Replace("__", "/").Replace('_', ' '); + Name = name; + ToolTipText = null; + Quantity = quantity; + Category = category; + this.printDlgt = printDlgt; + + Format = string.Empty; + Precision = string.Empty; + TestID = string.Empty; + } + + + /// Static list of all available items + public static readonly IList AllItems; + + /// + /// Initializes the class. + /// + /// Static constructor that initializes the list of all items + static WMeterRsltItemSpec() + { + AllItems = new List(); + + AllItems.Add(new WMeterRsltItemSpec(ItemID.String, "String", "", Quantity.String, ItemCategory.Other, (w, t, u, f, p) => f)); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Separator, "Separator", "", Quantity.String, ItemCategory.Other, (w, t, u, f, p) => string.Empty)); + + /// Common + AllItems.Add(new WMeterRsltItemSpec(ItemID.Test_name, Strings.Test + "()", Quantity.String, ItemCategory.TestData, (w, t, u, f, p) => FormatStr(f, (w.GetTestRslt(t) == null) ? "" : w.GetTestRslt(t).Name()))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Procedure_name, Strings.Procedure, Quantity.String, ItemCategory.Other, (w, t, u, f, p) => FormatStr(f, w.ProcedureName()))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Batch_number, Strings.Batch_nr, Quantity.Number, ItemCategory.Other, (w, t, u, f, p) => FormatInt(f, w.BatchNr()))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Test_method, Strings.Test_method + "()", Quantity.String, ItemCategory.TestData, (w, t, u, f, p) => FormatStr(f, (w.GetTestRslt(t) == null) ? "" : w.GetTestRslt(t).Method()))); + + /// + /// Volume + /// + AllItems.Add(new WMeterRsltItemSpec(ItemID.Test_volume, Strings.Test_vol + "()", Quantity.Volume, ItemCategory.TestData, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V2", w.GetTestRslt(t).TargetVolume()))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Volume, string.Format("{0} Mt. ()", Strings.VName_Vol), Strings.Tooltip_Vol_Mt, Quantity.Volume, ItemCategory.MeterResult, (w, t, u, f, p) => (w.GetMeterTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V4", w.GetMeterTestRslt(t).VolumeMeter))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Reference_volume, string.Format("{0} rm ()", Strings.VName_Vol), Strings.Tooltip_Vol_rm, Quantity.Volume, ItemCategory.MeterResult, (w, t, u, f, p) => (w.GetMeterTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V4", w.GetMeterTestRslt(t).VolumeRef))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Volume_main, string.Format("{0} {1} ()", Strings.VName_Vol, Strings.main), Quantity.Volume, ItemCategory.MeterResult, (w, t, u, f, p) => (w.GetMeterTestRslt(t, CompoundMeterId.CompoundMain) == null) ? "" : FormatDbl(u, f, p, "V4", w.GetMeterTestRslt(t).VolumeMeter))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Volume_aux, string.Format("{0} {1} ()", Strings.VName_Vol, Strings.aux), Quantity.Volume, ItemCategory.MeterResult, (w, t, u, f, p) => (w.GetMeterTestRslt(t, CompoundMeterId.CompoundAux) == null) ? "" : FormatDbl(u, f, p, "V4", w.GetMeterTestRslt(t).VolumeMeter))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Start_volume, Strings.Start_volume + "()", Quantity.Volume, ItemCategory.MeterResult, (w, t, u, f, p) => (w.GetMeterTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V4", w.GetMeterTestRslt(t).VolumeStart))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Start_volume_main, Strings.Start_volume_main + "()", Quantity.Volume, ItemCategory.MeterResult, (w, t, u, f, p) => (w.GetMeterTestRslt(t, CompoundMeterId.CompoundMain) == null) ? "" : FormatDbl(u, f, p, "V4", w.GetMeterTestRslt(t).VolumeStart))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Start_volume_aux, Strings.Start_volume_aux + "()", Quantity.Volume, ItemCategory.MeterResult, (w, t, u, f, p) => (w.GetMeterTestRslt(t, CompoundMeterId.CompoundAux) == null) ? "" : FormatDbl(u, f, p, "V4", w.GetMeterTestRslt(t).VolumeStart))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.End_volume, Strings.End_volume + "()", Quantity.Volume, ItemCategory.MeterResult, (w, t, u, f, p) => (w.GetMeterTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V4", w.GetMeterTestRslt(t).VolumeEnd))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.End_volume_main, Strings.End_volume_main + "()", Quantity.Volume, ItemCategory.MeterResult, (w, t, u, f, p) => (w.GetMeterTestRslt(t, CompoundMeterId.CompoundMain) == null) ? "" : FormatDbl(u, f, p, "V4", w.GetMeterTestRslt(t).VolumeEnd))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.End_volume_aux, Strings.End_volume_aux + "()", Quantity.Volume, ItemCategory.MeterResult, (w, t, u, f, p) => (w.GetMeterTestRslt(t, CompoundMeterId.CompoundAux) == null) ? "" : FormatDbl(u, f, p, "V4", w.GetMeterTestRslt(t).VolumeEnd))); + + /// + /// Mass + /// + AllItems.Add(new WMeterRsltItemSpec(ItemID.Mass_start_raw, string.Format("{0} ST raw ()", Strings.VName_Mass), Quantity.Mass, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V4", w.GetTestRslt(t).MassStartRaw))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Mass_start, string.Format("{0} ST ()", Strings.VName_Mass), Quantity.Mass, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V4", w.GetTestRslt(t).MassStart))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Mass_end_raw, string.Format("{0} EN raw ()", Strings.VName_Mass), Quantity.Mass, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V4", w.GetTestRslt(t).MassEndRaw))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Mass_end, string.Format("{0} EN ()", Strings.VName_Mass), Quantity.Mass, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V4", w.GetTestRslt(t).MassEnd))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Mass, string.Format("{0} ()", Strings.VName_Mass), Quantity.Mass, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V4", w.GetTestRslt(t).MassEnd - w.GetTestRslt(t).MassStart))); + + /// + /// Density + /// + AllItems.Add(new WMeterRsltItemSpec(ItemID.Density, Strings.Density + " ()", Quantity.Density, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V4", w.GetTestRslt(t).DensityLine))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Density_correction, Strings.Density_correction + " ()", Quantity.Density, ItemCategory.TestResult, (w, t, u, f, p) => FormatDbl(u, f, p, "V3", (w.Batch.DensityCorr)))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Rho_Wa_calc, string.Format("{0} of sample", Strings.Density), Quantity.Density, ItemCategory.TestResult, (w, t, u, f, p) => FormatDbl(u, f, p, "V4", RealDensity))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.RhoDistilledWtrAtMeLineTemp, string.Format("{0} of distilled water at T line", Strings.Density), Quantity.Density, ItemCategory.TestResult, (w, t, u, f, p) => FormatDbl(u, f, p, "V4", (w.GetTestRslt(t) == null) ? 0 : Config.Formulas.DistilledWaterDensityFromTemp((w.GetTestRslt(t).TempUpMean + w.GetTestRslt(t).TempDownMean) / 2)))); + + /// + /// Date and time + /// + AllItems.Add(new WMeterRsltItemSpec(ItemID.Test_start_time, Strings.T_start + "()", Quantity.DateTime, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : (string.IsNullOrEmpty(f) ? w.GetTestRslt(t).StartTime.ToString() : string.Format(f, w.GetTestRslt(t).StartTime)))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Test_end_time, Strings.T_end + "()", Quantity.DateTime, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : (string.IsNullOrEmpty(f) ? w.GetTestRslt(t).EndTime.ToString() : string.Format(f, w.GetTestRslt(t).EndTime)))); + + /// + /// Time (duration) + /// + AllItems.Add(new WMeterRsltItemSpec(ItemID.Timestamp_start, "Timestamp start ()", Quantity.Time, ItemCategory.MeterResult, (w, t, u, f, p) => (w.GetMeterTestRslt(t) == null || !w.GetTestRslt(t).IsRelErrTest()) ? "" : FormatDbl(u, f, p, "V4", w.GetMeterTestRslt(t).TimestampStart))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Timestamp_end, "Timestamp end ()", Quantity.Time, ItemCategory.MeterResult, (w, t, u, f, p) => (w.GetMeterTestRslt(t) == null || !w.GetTestRslt(t).IsRelErrTest()) ? "" : FormatDbl(u, f, p, "V4", w.GetMeterTestRslt(t).TimestampEnd))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Test_time_ni, Strings.T_s + "_ni()", Quantity.Time, ItemCategory.MeterResult, (w, t, u, f, p) => (w.GetMeterTestRslt(t) == null || !w.GetTestRslt(t).IsRelErrTest()) ? "" : FormatDbl(u, f, p, "V3", w.GetMeterTestRslt(t).TestTime))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Test_time, Strings.T_s + "()", Quantity.Time, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null || !w.GetTestRslt(t).IsRelErrTest()) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).TestTime))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.PMax_test_time, "Pressure test time ()", "Pressure test time", Quantity.Time, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null || !w.GetTestRslt(t).IsPMaxTest()) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).TestTime))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Diverter_start_time, "Diverter start time ()", "Diverter start time", Quantity.Time, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null || !w.GetTestRslt(t).IsDiverter()) ? "" : FormatDbl(u, f, p, "F3", w.GetTestRslt(t).DiverterStart))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Diverter_end_time, "Diverter end time ()", "Diverter end time", Quantity.Time, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null || !w.GetTestRslt(t).IsDiverter()) ? "" : FormatDbl(u, f, p, "F3", w.GetTestRslt(t).DiverterEnd))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Start_valve_open_time, "Start valve open time ()", "Start valve open time", Quantity.Time, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null || !w.GetTestRslt(t).IsStartStop()) ? "" : FormatDbl(u, f, p, "F3", w.GetTestRslt(t).DiverterStart))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Start_valve_close_time, "Start valve close time ()", "Start valve close time", Quantity.Time, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null || !w.GetTestRslt(t).IsStartStop()) ? "" : FormatDbl(u, f, p, "F3", w.GetTestRslt(t).DiverterEnd))); + + /// + /// Flow + /// + AllItems.Add(new WMeterRsltItemSpec(ItemID.Q_from, string.Format("{0} {1}", Strings.VName_Flow, Strings.from), Quantity.Flow, ItemCategory.TestData, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).Qfrom()))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Q_to, string.Format("{0} {1}", Strings.VName_Flow, Strings.to), Quantity.Flow, ItemCategory.TestData, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).Qto()))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Flow, string.Format("{0} v r", Strings.VName_Flow), Strings.Tooltip_Q_v_r, Quantity.Flow, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).FlowVolume))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Qc, string.Format("Qc"), "Calculated water meter flow", Quantity.Flow, ItemCategory.MeterResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).VolumeCTV / w.GetMeterTestRslt(t).TestTime * 3.6 * w.GetMeterTestRslt(t).PulsesMaster / w.GetTestRslt(t).PulsesMaster))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Q_ref_mean, string.Format("{0} rim ()", Strings.VName_Flow), Strings.Tooltip_Q_rim, Quantity.Flow, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).FlowMean))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Q_ref_min, string.Format("{0} ref min ()", Strings.VName_Flow), Strings.Tooltip_Q_min, Quantity.Flow, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).FlowMin))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Q_ref_max, string.Format("{0} ref max ()", Strings.VName_Flow), Strings.Tooltip_Q_max, Quantity.Flow, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).FlowMax))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Q_ref_start, string.Format("{0} ref start ()",Strings.VName_Flow),Strings.Tooltip_Q_start, Quantity.Flow, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).FlowStart))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Q_ref_end, string.Format("{0} ref end ()", Strings.VName_Flow), Strings.Tooltip_Q_end, Quantity.Flow, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).FlowEnd))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Flow_ctv, string.Format("{0} ctv ()", Strings.VName_Flow), "CTV of the flow (mean val.)",Quantity.Flow, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", (w.GetTestRslt(t).TestTime == 0) ? 0 : 3.6 * w.GetTestRslt(t).VolumeCTV / w.GetTestRslt(t).TestTime))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Flow_ctv_min, string.Format("{0} ctv min ()", Strings.VName_Flow), "Min. CTV of the flow", Quantity.Flow, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", (w.GetTestRslt(t).VolumeMaster == 0) ? 0 : w.GetTestRslt(t).VolumeCTV * w.GetTestRslt(t).FlowMin / w.GetTestRslt(t).VolumeMaster))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Flow_ctv_max, string.Format("{0} ctv max ()", Strings.VName_Flow), "Max. CTV of the flow", Quantity.Flow, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", (w.GetTestRslt(t).VolumeMaster == 0) ? 0 : w.GetTestRslt(t).VolumeCTV * w.GetTestRslt(t).FlowMax / w.GetTestRslt(t).VolumeMaster))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Flow_ctv_start, string.Format("{0} ctv start ()", Strings.VName_Flow), "Start flow CTV", Quantity.Flow, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", (w.GetTestRslt(t).VolumeMaster == 0) ? 0 : w.GetTestRslt(t).VolumeCTV * w.GetTestRslt(t).FlowStart / w.GetTestRslt(t).VolumeMaster))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Flow_ctv_end, string.Format("{0} ctv end ()", Strings.VName_Flow), "End flow CTV", Quantity.Flow, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", (w.GetTestRslt(t).VolumeMaster == 0) ? 0 : w.GetTestRslt(t).VolumeCTV * w.GetTestRslt(t).FlowEnd / w.GetTestRslt(t).VolumeMaster))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Q_rise, string.Format("{0} {1}", Strings.VName_Flow, Strings.rise), Quantity.Flow, ItemCategory.MeterResult, (w, t, u, f, p) => (string.IsNullOrEmpty(t) || (w.GetTestRslt(t) != null)) ? ((w.QRise == 0) ? "-" : FormatDbl(u, f, p, "V3", w.QRise)) : "")); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Q_fall, string.Format("{0} {1}", Strings.VName_Flow, Strings.fall), Quantity.Flow, ItemCategory.MeterResult, (w, t, u, f, p) => (string.IsNullOrEmpty(t) || (w.GetTestRslt(t) != null)) ? ((w.QFall == 0) ? "-" : FormatDbl(u, f, p, "V3", w.QFall)) : "")); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Q_sensitivity, string.Format("{0} {1}", Strings.VName_Flow, Strings.sensitivity), Quantity.Flow, ItemCategory.MeterResult, (w, t, u, f, p) => (string.IsNullOrEmpty(t) || (w.GetTestRslt(t) != null)) ? ((w.QRise == 0) ? "-" : FormatDbl(u, f, p, "V3", w.QRise)) : "")); + + AllItems.Add(new WMeterRsltItemSpec(ItemID.ConstMaster, string.Format("k MID ()"), "Const. of the reference flow meter", Quantity.PulsePerLtr, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", ((w.GetTestRslt(t).ConstMaster < float.Epsilon) ? 0 : (1 / w.GetTestRslt(t).ConstMaster))))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.ConstMasterRaw, string.Format("k MID raw ()"), "Const. of the ref. flow meter uncorrected",Quantity.PulsePerLtr, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", ((w.GetTestRslt(t).ConstMasterRaw < float.Epsilon) ? 0 : (1 / w.GetTestRslt(t).ConstMasterRaw))))); + + /// + /// Temperature + /// + AllItems.Add(new WMeterRsltItemSpec(ItemID.T_up_mean, string.Format("{0} UP ME ()", Strings.VName_Temp), Strings.Tooltip_T_up_me, Quantity.Temperature, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).TempUpMean))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.T_up_start, string.Format("{0} UP ST ()", Strings.VName_Temp), Strings.Tooltip_T_up_st, Quantity.Temperature, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).TempUpStart))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.T_up_end, string.Format("{0} UP EN ()", Strings.VName_Temp), Strings.Tooltip_T_up_en, Quantity.Temperature, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).TempUpEnd))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.T_up_avg, string.Format("{0} UP avg ()", Strings.VName_Temp), Strings.Tooltip_T_up_avg, Quantity.Temperature, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", (w.GetTestRslt(t).TempUpStart + w.GetTestRslt(t).TempUpEnd) / 2))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.T_up_min, string.Format("{0} UP min ()", Strings.VName_Temp), Strings.Tooltip_T_up_min, Quantity.Temperature, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).TempUpMin))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.T_up_max, string.Format("{0} UP max ()", Strings.VName_Temp), Strings.Tooltip_T_up_max, Quantity.Temperature, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).TempUpMax))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.T_line_mean, string.Format("{0} LN ME ()", Strings.VName_Temp), Strings.Tooltip_T_ln_me, Quantity.Temperature, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", (w.GetTestRslt(t).TempUpMean + w.GetTestRslt(t).TempDownMean) / 2))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.T_line_start, string.Format("{0} LN ST ()", Strings.VName_Temp), Strings.Tooltip_T_ln_st, Quantity.Temperature, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", (w.GetTestRslt(t).TempUpStart + w.GetTestRslt(t).TempDownStart) / 2))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.T_line_end, string.Format("{0} LN EN ()", Strings.VName_Temp), Strings.Tooltip_T_ln_en, Quantity.Temperature, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", (w.GetTestRslt(t).TempUpEnd + w.GetTestRslt(t).TempDownEnd) / 2))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.T_line_avg, string.Format("{0} LN avg ()", Strings.VName_Temp), Strings.Tooltip_T_ln_avg, Quantity.Temperature, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", (w.GetTestRslt(t).TempUpStart + w.GetTestRslt(t).TempDownStart + w.GetTestRslt(t).TempUpEnd + w.GetTestRslt(t).TempDownEnd) / 4))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.T_line_min, string.Format("{0} LN min ()", Strings.VName_Temp), Strings.Tooltip_T_ln_min, Quantity.Temperature, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", (w.GetTestRslt(t).TempUpMin + w.GetTestRslt(t).TempDownMin) / 2))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.T_line_max, string.Format("{0} LN max ()", Strings.VName_Temp), Strings.Tooltip_T_ln_max, Quantity.Temperature, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", (w.GetTestRslt(t).TempUpMax + w.GetTestRslt(t).TempDownMax) / 2))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.T_down_mean, string.Format("{0} DW ME ()", Strings.VName_Temp), Strings.Tooltip_T_dw_me, Quantity.Temperature, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).TempDownMean))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.T_down_start, string.Format("{0} DW ST ()", Strings.VName_Temp), Strings.Tooltip_T_dw_st, Quantity.Temperature, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).TempDownStart))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.T_down_end, string.Format("{0} DW EN ()", Strings.VName_Temp), Strings.Tooltip_T_dw_en, Quantity.Temperature, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).TempDownEnd))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.T_down_avg, string.Format("{0} DW avg ()", Strings.VName_Temp), Strings.Tooltip_T_dw_avg, Quantity.Temperature, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", (w.GetTestRslt(t).TempDownStart + w.GetTestRslt(t).TempDownEnd) / 2))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.T_down_min, string.Format("{0} DW min ()", Strings.VName_Temp), Strings.Tooltip_T_dw_min, Quantity.Temperature, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).TempDownMin))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.T_down_max, string.Format("{0} DW max ()", Strings.VName_Temp), Strings.Tooltip_T_dw_max, Quantity.Temperature, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).TempDownMax))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.T_div, string.Format("{0} DI ME ()", Strings.VName_Temp), Strings.Tooltip_T_di_me, Quantity.Temperature, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).TempDivMean))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.T_div_start, string.Format("{0} DI ST ()", Strings.VName_Temp), Strings.Tooltip_T_di_st, Quantity.Temperature, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).TempDivStart))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.T_div_end, string.Format("{0} DI EN ()", Strings.VName_Temp), Strings.Tooltip_T_di_en, Quantity.Temperature, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).TempDivEnd))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.T_div_avg, string.Format("{0} DI avg ()", Strings.VName_Temp), Strings.Tooltip_T_di_avg, Quantity.Temperature, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", (w.GetTestRslt(t).TempDivStart + w.GetTestRslt(t).TempDivEnd) / 2))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.T_div_min, string.Format("{0} DI min ()", Strings.VName_Temp), Strings.Tooltip_T_di_min, Quantity.Temperature, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).TempDivMin))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.T_div_max, string.Format("{0} DI max ()", Strings.VName_Temp), Strings.Tooltip_T_di_max, Quantity.Temperature, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).TempDivMax))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.T_rho_0, string.Format("{0} RO0", Strings.VName_Temp), Strings.Tooltip_T_rho_0, Quantity.Temperature, ItemCategory.TestResult, (w, t, u, f, p) => FormatDbl(u, f, p, "V3", AtTemperature))); +#if HEAT_METERS + AllItems.Add(new WMeterRsltItemSpec(ItemID.T_Hi_mean, string.Format("{0} hi me", Strings.VName_Temp), Quantity.Temperature, ItemCategory.Other, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "F3", w.GetTestRslt(t).Custom1))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.T_Hi_start, string.Format("{0} hi st", Strings.VName_Temp), Quantity.Temperature, ItemCategory.Other, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "F3", w.GetTestRslt(t).Custom2))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.T_Hi_end, string.Format("{0} hi en", Strings.VName_Temp), Quantity.Temperature, ItemCategory.Other, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "F3", w.GetTestRslt(t).Custom3))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.T_Hi_avg, string.Format("{0} hi av", Strings.VName_Temp), Quantity.Temperature, ItemCategory.Other, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "F3", (w.GetTestRslt(t).Custom2 + w.GetTestRslt(t).Custom3) / 2))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.T_Lo_mean, string.Format("{0} lo me", Strings.VName_Temp), Quantity.Temperature, ItemCategory.Other, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "F3", w.GetTestRslt(t).Custom6))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.T_Lo_start, string.Format("{0} lo st", Strings.VName_Temp), Quantity.Temperature, ItemCategory.Other, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "F3", w.GetTestRslt(t).Custom7))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.T_Lo_end, string.Format("{0} lo en", Strings.VName_Temp), Quantity.Temperature, ItemCategory.Other, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "F3", w.GetTestRslt(t).Custom8))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.T_Lo_avg, string.Format("{0} lo av", Strings.VName_Temp), Quantity.Temperature, ItemCategory.Other, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "F3", (w.GetTestRslt(t).Custom7 + w.GetTestRslt(t).Custom8) / 2))); +#endif + + /// + /// Pressure + /// + AllItems.Add(new WMeterRsltItemSpec(ItemID.P_up, string.Format("{0} UP ME ()", Strings.VName_Press), Strings.Tooltip_P_up_me, Quantity.Pressure, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).PressUpMean))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.P_up_start, string.Format("{0} UP ST ()", Strings.VName_Press), Strings.Tooltip_P_up_st, Quantity.Pressure, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).PressUpStart))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.P_up_end, string.Format("{0} UP EN ()", Strings.VName_Press), Strings.Tooltip_P_up_en, Quantity.Pressure, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).PressUpEnd))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.P_up_avg, string.Format("{0} UP avg ()", Strings.VName_Press), Strings.Tooltip_P_up_avg, Quantity.Pressure, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", (w.GetTestRslt(t).PressUpStart + w.GetTestRslt(t).PressUpEnd) / 2))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.P_up_min, string.Format("{0} UP min ()", Strings.VName_Press), Strings.Tooltip_P_up_min, Quantity.Pressure, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).PressUpMin))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.P_up_max, string.Format("{0} UP max ()", Strings.VName_Press), Strings.Tooltip_P_up_max, Quantity.Pressure, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).PressUpMax))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.P_down, string.Format("{0} DW ME ()", Strings.VName_Press), Strings.Tooltip_P_dw_me, Quantity.Pressure, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).PressDownMean))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.P_down_start, string.Format("{0} DW ST ()", Strings.VName_Press), Strings.Tooltip_P_dw_st, Quantity.Pressure, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).PressDownStart))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.P_down_end, string.Format("{0} DW EN ()", Strings.VName_Press), Strings.Tooltip_P_dw_en, Quantity.Pressure, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).PressDownEnd))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.P_down_avg, string.Format("{0} DW avg ()", Strings.VName_Press), Strings.Tooltip_P_dw_avg, Quantity.Pressure, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", (w.GetTestRslt(t).PressDownStart + w.GetTestRslt(t).PressDownEnd) / 2))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.P_down_min, string.Format("{0} DW min ()", Strings.VName_Press), Strings.Tooltip_P_dw_min, Quantity.Pressure, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).PressDownMin))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.P_down_max, string.Format("{0} DW max ()", Strings.VName_Press), Strings.Tooltip_P_dw_max, Quantity.Pressure, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).PressDownMax))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.P_delta_mean, string.Format("{0} DE ME ()", Strings.VName_Press), Strings.Tooltip_P_de_me, Quantity.Pressure, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).PressDeltaMean))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.P_delta_start, string.Format("{0} DE ST ()", Strings.VName_Press), Strings.Tooltip_P_de_st, Quantity.Pressure, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).PressDeltaStart))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.P_delta_end, string.Format("{0} DE EN ()", Strings.VName_Press), Strings.Tooltip_P_de_en, Quantity.Pressure, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).PressDeltaEnd))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.P_delta_avg, string.Format("{0} DE avg ()", Strings.VName_Press), Strings.Tooltip_P_de_avg, Quantity.Pressure, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", (w.GetTestRslt(t).PressDeltaStart + w.GetTestRslt(t).PressDeltaEnd) / 2))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.P_delta_min, string.Format("{0} DE min ()", Strings.VName_Press), Strings.Tooltip_P_de_min, Quantity.Pressure, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).PressDeltaMin))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.P_delta_max, string.Format("{0} DE max ()", Strings.VName_Press), Strings.Tooltip_P_de_max, Quantity.Pressure, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).PressDeltaMax))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.P_delta_mean_per_mtr, string.Format("{0} DE ME per mtr.()", Strings.VName_Press), "P delta mean per one meter", Quantity.Pressure, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).PressDeltaMean / Math.Max(1, w.GetTestRslt(t).Batch.WaterMeters.Count)))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.P_delta_mean_from_up_down, string.Format("{0} UP-DW ME ()", Strings.VName_Press), "P delta mean from UP/DW", Quantity.Pressure, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", w.GetTestRslt(t).PressUpMean - w.GetTestRslt(t).PressDownMean))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.P_delta_mean_from_up_down_per_mtr, string.Format("{0} UP-DW ME per mtr ()", Strings.VName_Press), "P delta mean from UP/DW per one meter", Quantity.Pressure, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V3", (w.GetTestRslt(t).PressUpMean - w.GetTestRslt(t).PressDownMean) / Math.Max(1, w.GetTestRslt(t).Batch.WaterMeters.Count)))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.P_PMax_test_mean, string.Format("{0} PMax mean ()", Strings.VName_Press), "Mean PMax test pressure", Quantity.Pressure, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null || !w.GetTestRslt(t).IsPMaxTest()) ? "" : FormatDbl(u, f, p, "V3", (w.GetTestRslt(t).PressUpMean + w.GetTestRslt(t).PressDownMean) / 2))); + + /// + /// Ambient temperature/pressure/humidity/Buoyancy + /// + AllItems.Add(new WMeterRsltItemSpec(ItemID.Ambient_temperature, string.Format("{0} Amb M", Strings.VName_Temp), Strings.Tooltip_T_Amb_M, Quantity.Temperature, ItemCategory.TestResult, (w, t, u, f, p) => FormatDbl(u, f, p, "V3", (w.GetTestRslt(t) == null) ? w.Batch.AmbTempMean() : w.GetTestRslt(t).AmbTempMean))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Ambient_pressure, string.Format("{0} Amb M", Strings.VName_Press), Strings.Tooltip_P_Amb_M, Quantity.Pressure, ItemCategory.TestResult, (w, t, u, f, p) => FormatDbl(u, f, p, "V4", (w.GetTestRslt(t) == null) ? w.Batch.AmbPressMean() : w.GetTestRslt(t).AmbPressMean))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Ambient_humidity, string.Format("{0} Amb M", Strings.VName_Humi), Strings.Tooltip_Hu_Amb_M, Quantity.Humidity, ItemCategory.TestResult, (w, t, u, f, p) => FormatDbl(u, f, p, "V2", (w.GetTestRslt(t) == null) ? w.Batch.AmbHumiMean() : w.GetTestRslt(t).AmbHumiMean))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Amb_temp_start_end, string.Format("{0} Amb ST/EN", Strings.VName_Temp), Quantity.Temperature, ItemCategory.TestResult, (w, t, u, f, p) => FormatDbl(u, f, p, "V3", (w.GetTestRslt(t) == null) ? w.Batch.AmbTempStart() : w.GetTestRslt(t).AmbTempStart, (w.GetTestRslt(t) == null) ? w.Batch.AmbTempEnd() : w.GetTestRslt(t).AmbTempEnd))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Amb_press_start_end, string.Format("{0} Amb ST/EN", Strings.VName_Press), Quantity.Pressure, ItemCategory.TestResult, (w, t, u, f, p) => FormatDbl(u, f, p, "V4", (w.GetTestRslt(t) == null) ? w.Batch.AmbPressStart(): w.GetTestRslt(t).AmbPressStart, (w.GetTestRslt(t) == null) ? w.Batch.AmbPressEnd() : w.GetTestRslt(t).AmbPressEnd))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Amb_humi_start_end, string.Format("{0} Amb ST/EN", Strings.VName_Humi), Quantity.Humidity, ItemCategory.TestResult, (w, t, u, f, p) => FormatDbl(u, f, p, "V2", (w.GetTestRslt(t) == null) ? w.Batch.AmbHumiStart() : w.GetTestRslt(t).AmbHumiStart, (w.GetTestRslt(t) == null) ? w.Batch.AmbHumiEnd() : w.GetTestRslt(t).AmbHumiEnd))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Buoyancy, "Buoyancy ()", Quantity.Number, ItemCategory.TestResult, (w, t, u, f, p) => string.IsNullOrEmpty(t) ? FormatDbl(u, f, p, "V6", w.Batch.Buoyancy()) : ((w.GetTestRslt(t) != null) ? FormatDbl(u, f, p, "V6", (w.GetTestRslt(t).Buoyancy)) : ""))); + + /// + /// Error + /// + AllItems.Add(new WMeterRsltItemSpec(ItemID.Error_limit_Lo, Strings.ErrLimLo + "()", Quantity.Error, ItemCategory.TestData, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V2", w.GetTestRslt(t).ErrLimLo()))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Error_limit_Hi, Strings.ErrLimHi + "()", Quantity.Error, ItemCategory.TestData, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V2", w.GetTestRslt(t).ErrLimHi()))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Uncertainty, Strings.Uncertainty + "()", Quantity.Error, ItemCategory.TestData, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V2", w.GetTestRslt(t).Uncertainty()))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Reference_error, string.Format("{0} rel.ref. ()", Strings.VName_Error), Strings.Tooltip_E_rel_ref, Quantity.Error, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V2", w.GetTestRslt(t).ErrorMaster))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Reference_error_corr, string.Format("{0} ref.corr. ()", Strings.VName_Error), "Relative error of the reference flow meter after correction using correction curve", Quantity.Error, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V2", Config.Formulas.ErrorFromVolumes(w.GetTestRslt(t).ConstMasterCorr, w.GetTestRslt(t).ConstMaster)))); +#if TURA_IPERL || TURA_SPECIAL + AllItems.Add(new WMeterRsltItemSpec(ItemID.Error, string.Format("{0} rel. ()", Strings.VName_Error), Strings.Tooltip_E_rel, Quantity.Error, ItemCategory.MeterResult, (w, t, u, f, p) => (w.GetMeterTestRslt(t) == null) ? "0" : FormatDbl(u, f, p, "V2", w.GetMeterTestRslt(t).Error))); +#else + AllItems.Add(new WMeterRsltItemSpec(ItemID.Error, string.Format("{0} rel. ()", Strings.VName_Error), Strings.Tooltip_E_rel, Quantity.Error, ItemCategory.MeterResult, (w, t, u, f, p) => (w.GetMeterTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V2", w.GetMeterTestRslt(t).Error))); +#endif + AllItems.Add(new WMeterRsltItemSpec(ItemID.Passed, Strings.Result, Quantity.Boolean, ItemCategory.MeterResult, (w, t, u, f, p) => string.IsNullOrEmpty(t) ? w.PassedColorStr() : ((w.GetMeterTestRslt(t) == null) ? "" : w.GetMeterTestRslt(t).PassedColorStr()))); + + AllItems.Add(new WMeterRsltItemSpec(ItemID.ResultOrErrorFlags, "Winiki lub E", Quantity.String, ItemCategory.MeterResult, (w, t, u, f, p) => FormatStr(f, w.PassedOrErrorFlagsStr()))); /// PL specific result + + /// + /// Water meter info + /// + AllItems.Add(new WMeterRsltItemSpec(ItemID.Watermeter_type, Strings.WM_Type, Quantity.String, ItemCategory.MeterData, (w, t, u, f, p) => FormatStr(f, w.WaterMeterData.ProductName))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Producer, Strings.Producer, Quantity.String, ItemCategory.MeterData, (w, t, u, f, p) => FormatStr(f, w.WaterMeterData.Producer))); + + AllItems.Add(new WMeterRsltItemSpec(ItemID.DN, "DN", Quantity.Length, ItemCategory.MeterData, (w, t, u, f, p) => FormatDbl(u, f, p, "V2", w.WaterMeterData.DN))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.L, "L", Quantity.Length, ItemCategory.MeterData, (w, t, u, f, p) => FormatDbl(u, f, p, "V3", w.WaterMeterData.L))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Mounting, Strings.Mounting, Quantity.String, ItemCategory.MeterData, (w, t, u, f, p) => FormatStr(f, w.WaterMeterData.Mounting.ToDescription()))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Q4, "Q4_Qmax", Quantity.Flow, ItemCategory.MeterData, (w, t, u, f, p) => FormatDbl(u, f, p, "V3", w.WaterMeterData.Q4_Qmax))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Q3, "Q3_Qn", Quantity.Flow, ItemCategory.MeterData, (w, t, u, f, p) => FormatDbl(u, f, p, "V2", w.WaterMeterData.Q3_Qn))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Q2, "Q2_Qt", Quantity.Flow, ItemCategory.MeterData, (w, t, u, f, p) => FormatDbl(u, f, p, "V3", w.WaterMeterData.Q2_Qt))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Q1, "Q1_Qmin", Quantity.Flow, ItemCategory.MeterData, (w, t, u, f, p) => FormatDbl(u, f, p, "V3", w.WaterMeterData.Q1_Qmin))); + + AllItems.Add(new WMeterRsltItemSpec(ItemID.Metrological_class, Strings.MClass, Quantity.String, ItemCategory.MeterData, (w, t, u, f, p) => FormatStr(f, w.WaterMeterData.MetrologicalClass))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Temperature_class, "Temperature class", Quantity.String, ItemCategory.MeterData, (w, t, u, f, p) => FormatStr(f, w.WaterMeterData.TemperatureClass.ToDescription()))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Pressure_loss_class, "Pressure loss class", Quantity.String, ItemCategory.MeterData, (w, t, u, f, p) => FormatStr(f, w.WaterMeterData.PressureLossClass.ToDescription()))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Max_admissible_pressure, "Max. admissible pressure", Quantity.String, ItemCategory.MeterData, (w, t, u, f, p) => FormatStr(f, w.WaterMeterData.MaxAdmissiblePressure.ToDescription()))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Flow_profile_sensitivity_class, "Flow profile sensitivity class", Quantity.String, ItemCategory.MeterData, (w, t, u, f, p) => FormatStr(f, w.WaterMeterData.FlowProfileSensitivityClass.ToDescription()))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Approval_info, Strings.Approval, Quantity.String, ItemCategory.MeterData, (w, t, u, f, p) => FormatStr(f, w.WaterMeterData.ApprovalInfo))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Certificate, "Certificate", Quantity.String, ItemCategory.MeterData, (w, t, u, f, p) => FormatStr(f, w.WaterMeterData.Certificate))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Medium, "Water cold/hot", Quantity.String, ItemCategory.MeterData, (w, t, u, f, p) => FormatStr(f, w.WaterMeterData.Medium.ToDescription()))); + + AllItems.Add(new WMeterRsltItemSpec(ItemID.Text1, "Text1", Quantity.String, ItemCategory.MeterData, (w, t, u, f, p) => FormatStr(f, w.WaterMeterData.Text1))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Text2, "Text2", Quantity.String, ItemCategory.MeterData, (w, t, u, f, p) => FormatStr(f, w.WaterMeterData.Text2))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Text3, "Text3", Quantity.String, ItemCategory.MeterData, (w, t, u, f, p) => FormatStr(f, w.WaterMeterData.Text3))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Text4, "Text4", Quantity.String, ItemCategory.MeterData, (w, t, u, f, p) => FormatStr(f, w.WaterMeterData.Text4))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Text5, "Text5", Quantity.String, ItemCategory.MeterData, (w, t, u, f, p) => FormatStr(f, w.WaterMeterData.Text5))); + + /// Water meters results + AllItems.Add(new WMeterRsltItemSpec(ItemID.Serial_Nr, Strings.sn, Strings.Tooltip_sn, Quantity.String, ItemCategory.MeterResult, (w, t, u, f, p) => FormatStr(f, w.SerialNr))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Purchase_order, Strings.PO, Quantity.String, ItemCategory.Other, (w, t, u, f, p) => FormatStr(f, w.PurchaseOrder))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Year_of_production, Strings.Year, Quantity.Number, ItemCategory.Other, (w, t, u, f, p) => FormatInt(f, w.YearOfProduction))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.WM_Position, Strings.Pos, Quantity.Number, ItemCategory.Other, (w, t, u, f, p) => FormatInt(f, w.WMPosition))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Formatted_WM_ID, "Formatted WM ID", Quantity.String, ItemCategory.MeterResult, (w, t, u, f, p) => string.IsNullOrEmpty(f) ? string.Format("{0}-{1}", w.BatchNr(), w.WMPosition) : string.Format(f, w.StartTime(), w.EndTime(), w.BatchNr(), w.WMPosition, w.SerialNr))); + + /// Water meters results (single) + AllItems.Add(new WMeterRsltItemSpec(ItemID.End_state, Strings.End_state, Quantity.String, ItemCategory.MeterResult, (w, t, u, f, p) => FormatStr(f, w.EndState))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Pulses, Strings.Pulses + "()", Quantity.Pulses, ItemCategory.MeterResult, (w, t, u, f, p) => (w.GetMeterTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "F0", w.GetMeterTestRslt(t).IsPulses() ? w.GetMeterTestRslt(t).PulsesMeter : 0))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Reference_pulses_ni, Strings.RefPulses + "_ni()", Quantity.Pulses, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetMeterTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "F0", w.GetMeterTestRslt(t).PulsesMaster))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Reference_pulses, Strings.RefPulses + "()", Quantity.Pulses, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "F0", w.GetTestRslt(t).PulsesMaster))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Camera_angle, "Angle ()", "Angle measured by a camera", Quantity.Pulses, ItemCategory.MeterResult, (w, t, u, f, p) => (w.GetMeterTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "F0", w.GetMeterTestRslt(t).IsCamera() ? w.GetMeterTestRslt(t).PulsesMeter : 0))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Camera_angle_start, "Start angle ()", "Start angle measured by a camera", Quantity.Pulses, ItemCategory.MeterResult, (w, t, u, f, p) => (w.GetMeterTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "F0", w.GetMeterTestRslt(t).IsCamera() ? w.GetMeterTestRslt(t).VolumeStart * w.GetMeterTestRslt(t).PulsesPerLiter : 0))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Camera_angle_end, "End angle ()", "End angle measured by a camera", Quantity.Pulses, ItemCategory.MeterResult, (w, t, u, f, p) => (w.GetMeterTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "F0", w.GetMeterTestRslt(t).IsCamera() ? w.GetMeterTestRslt(t).VolumeEnd * w.GetMeterTestRslt(t).PulsesPerLiter : 0))); + + AllItems.Add(new WMeterRsltItemSpec(ItemID.Pulses_per_liter, Strings.PulsesLiter, Quantity.PulsePerLtr, ItemCategory.MeterData, (w, t, u, f, p) => FormatDbl(u, f, p, "V4", w.WaterMeterData.PulsesPerLtr))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Pulse__liter, Strings.PulsesLiter + "()", Quantity.PulsePerLtr, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetMeterTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V4", w.GetMeterTestRslt(t).IsCamera() ? 0 : w.GetMeterTestRslt(t).PulsesPerLiter))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Degree__liter, "Degree per liter ()", Quantity.PulsePerLtr, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetMeterTestRslt(t) == null) ? "" : FormatDbl(u, f, p, "V4", w.GetMeterTestRslt(t).IsCamera() ? w.GetMeterTestRslt(t).PulsesPerLiter : 0))); + + /// Water meters results (combined) + AllItems.Add(new WMeterRsltItemSpec(ItemID.Error_main, Strings.Err_main + "()", Quantity.Error, ItemCategory.MeterResult, (w, t, u, f, p) => (w.GetMeterTestRslt(t, CompoundMeterId.CompoundMain) == null) ? "" : FormatDbl(u, f, p, "V2", w.GetMeterTestRslt(t, CompoundMeterId.CompoundMain).Error))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Error_aux, Strings.Err_aux + "()", Quantity.Error, ItemCategory.MeterResult, (w, t, u, f, p) => (w.GetMeterTestRslt(t, CompoundMeterId.CompoundAux) == null) ? "" : FormatDbl(u, f, p, "V2", w.GetMeterTestRslt(t, CompoundMeterId.CompoundAux).Error))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Serial_Nr_main, string.Format("{0} {1}", Strings.sn, Strings.main), Strings.Tooltip_sn_main, Quantity.String, ItemCategory.MeterResult, (w, t, u, f, p) => FormatStr(f, w.SerialNr))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Serial_Nr_aux, string.Format("{0} {1}", Strings.sn, Strings.aux), Strings.Tooltip_sn_aux, Quantity.String, ItemCategory.MeterResult, (w, t, u, f, p) => FormatStr(f, w.SerialNrAux))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.End_state_main, Strings.EndState_main, Quantity.String, ItemCategory.MeterResult, (w, t, u, f, p) => FormatStr(f, w.EndState))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.End_state_aux, Strings.EndState_aux, Quantity.String, ItemCategory.MeterResult, (w, t, u, f, p) => FormatStr(f, w.EndStateAux))); + + /// Batch info + AllItems.Add(new WMeterRsltItemSpec(ItemID.Test_bench_ID, Strings.Bench, Quantity.String, ItemCategory.Other, (w, t, u, f, p) => FormatStr(f, w.Batch.TestBenchId.ToString()))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Program_version, Strings.Ver, Quantity.String, ItemCategory.Other, (w, t, u, f, p) => FormatStr(f, w.Batch.ProgramVersion))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.User_nr, Strings.User_nr, Quantity.Number, ItemCategory.Other, (w, t, u, f, p) => FormatInt(f, w.Batch.UserNumber))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.User_name, Strings.User, Quantity.String, ItemCategory.Other, (w, t, u, f, p) => FormatStr(f, Users.Entities.User.EncodedStrToUserName(w.Batch.UserName)))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.User_description, Strings.User_description, Quantity.String, ItemCategory.Other, (w, t, u, f, p) => FormatStr(f, Users.Entities.User.EncodedStrToFullName(w.Batch.UserName)))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Legalizator, Strings.Legalizator, Quantity.String, ItemCategory.Other, (w, t, u, f, p) => FormatStr(f, Users.Entities.User.EncodedStrToLegalizator(w.Batch.UserName)))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Watermeters, Strings.WMs, Quantity.String, ItemCategory.Other, (w, t, u, f, p) => FormatStr(f, w.Batch.WatermetersStr))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Protocol_title, Strings.Protocol, Quantity.String, ItemCategory.Other, (w, t, u, f, p) => FormatStr(f, w.Batch.ProtocolTitle))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Batch_start_time, Strings.Start, Quantity.DateTime, ItemCategory.Other, (w, t, u, f, p) => string.IsNullOrEmpty(f) ? w.Batch.StartTime.ToString() : string.Format(f, w.Batch.StartTime))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Batch_end_time, Strings.End, Quantity.DateTime, ItemCategory.Other, (w, t, u, f, p) => string.IsNullOrEmpty(f) ? w.Batch.EndTime.ToString() : string.Format(f, w.Batch.EndTime))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Lite_per_pulse_Read, "1 / PlsPerLtr_Read", Quantity.PulsePerLtr, ItemCategory.Other, (w, t, u, f, p) => FormatDbl(u, f, p, "V4", (w.WaterMeterData.PulsesPerLtr != 0) ? 1/w.WaterMeterData.PulsesPerLtr : 0))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Passed_meters_count, Strings.Passed_meters_count, Quantity.Number, ItemCategory.Other, (w, t, u, f, p) => FormatInt(f, w.Batch.PassedMetersCount()))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Failed_meters_count, Strings.Failed_meters_count, Quantity.Number, ItemCategory.Other, (w, t, u, f, p) => FormatInt(f, w.Batch.FailedMetersCount()))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Passed_seals_count, "Seals count of passed meters", Quantity.Number, ItemCategory.Other, (w, t, u, f, p) => FormatInt(f, w.Batch.PassedMetersCount() * int.Parse(w.WaterMeterData.Text5)))); + + /// Extra water meter data + AllItems.Add(new WMeterRsltItemSpec(ItemID.Result_code, Strings.Result_code, Quantity.Number, ItemCategory.MeterResult, (w, t, u, f, p) => FormatInt(f, w.ResultCode))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Remark, Strings.Remark, Quantity.String, ItemCategory.TestResult, (w, t, u, f, p) => FormatStr(f, w.Batch.Remark))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Meter_type, Strings.Meter_type, Quantity.String, ItemCategory.Other, (w, t, u, f, p) => FormatStr(f, w.WaterMeterData.Compound ? Strings.Compound : (w.WaterMeterData.HeatMeter ? Strings.Heat_meter : Strings.Single)))); + +#if HEAT_METERS + AllItems.Add(new WMeterRsltItemSpec(ItemID.Energy, Strings.Energy + "()", Quantity.Energy, ItemCategory.Other, (w, t, u, f, p) => (w.GetMeterTestRslt(t, Config.Entities.CompoundMeterId.HeatMeterEnergy) == null) ? "" : FormatDbl(u, f, p, "F1", (w.GetMeterTestRslt(t, Config.Entities.CompoundMeterId.HeatMeterEnergy).VolumeMeter)))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Reference_energy, Strings.Energy_ref + "()", Quantity.Energy, ItemCategory.Other, (w, t, u, f, p) => (w.GetMeterTestRslt(t, Config.Entities.CompoundMeterId.HeatMeterEnergy) == null) ? "" : FormatDbl(u, f, p, "F1", (w.GetMeterTestRslt(t, Config.Entities.CompoundMeterId.HeatMeterEnergy).VolumeRef)))); +#endif + +#if IPERL + AllItems.Add(new WMeterRsltItemSpec(ItemID.OrigCalibFactor, "iPerl OrigCalibFactor", Quantity.Number, ItemCategory.MeterResult, (w, t, u, f, p) => FormatDbl(u, f, p, "V3", w.OrigCalibFactor))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.CalibFactor, "iPerl CalibFactor", Quantity.Number, ItemCategory.MeterResult, (w, t, u, f, p) => FormatDbl(u, f, p, "V3", w.CalibFactor))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Q2ErrWOCorrection, "iPerl Q2ErrWOCorrection", Quantity.Error, ItemCategory.MeterResult, (w, t, u, f, p) => FormatDbl(u, f, p, "V3", w.Q2ErrWOCorrection))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Q2CorrectionDone, "iPerl Q2CorrectionDone", Quantity.Boolean, ItemCategory.MeterResult, (w, t, u, f, p) => (w.Q2CorrectionDone ? Strings.Yes : Strings.No))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Q2CorrRFlow, "iPerl Q2CorrRFlow", Quantity.Number, ItemCategory.MeterResult, (w, t, u, f, p) => FormatInt(f, w.Q2CorrRFlow))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Q2CorrLFlow, "iPerl Q2CorrLFlow", Quantity.Number, ItemCategory.MeterResult, (w, t, u, f, p) => FormatInt(f, w.Q2CorrLFlow))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Q2CorrFlowRight, "iPerl Q2CorrFlowRight", Quantity.Volume, ItemCategory.MeterResult, (w, t, u, f, p) => FormatInt(f, w.Q2CorrFlowRight))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.FW_Version, "iPerl FW version", Quantity.String, ItemCategory.MeterResult, (w, t, u, f, p) => FormatStr(f, w.FWVersion))); +#endif + AllItems.Add(new WMeterRsltItemSpec(ItemID.TestDone, Strings.Test_done + "()", Quantity.Boolean, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetMeterTestRslt(t) != null && w.GetMeterTestRslt(t).TestDone) ? Strings.Yes : Strings.No)); + AllItems.Add(new WMeterRsltItemSpec(ItemID.TestPassed, Strings.Test_passed + "()", Quantity.Boolean, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetMeterTestRslt(t) != null && w.GetMeterTestRslt(t).Passed) ? Strings.Yes : Strings.No)); + AllItems.Add(new WMeterRsltItemSpec(ItemID.ErrorFlags, Strings.Error_flags + "()", Quantity.String, ItemCategory.TestResult, (w, t, u, f, p) => FormatStr(f, (w.GetTestRslt(t) != null) ? w.GetTestRslt(t).ErrorFlagsStr() : w.ErrorFlagsStr()))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.ErrorFlagsEx, Strings.Error_flags + "Ex", Quantity.String, ItemCategory.MeterResult, (w, t, u, f, p) => FormatStr(f, w.ErrorFlagsStrEx()))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.E1, "E1 ()", Quantity.Boolean, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) != null && (w.GetTestRslt(t).ErrorFlags & 0x0001) != 0) ? Strings.Yes : Strings.No)); + AllItems.Add(new WMeterRsltItemSpec(ItemID.E2, "E2 ()", Quantity.Boolean, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) != null && (w.GetTestRslt(t).ErrorFlags & 0x0002) != 0) ? Strings.Yes : Strings.No)); + AllItems.Add(new WMeterRsltItemSpec(ItemID.E3, "E3 ()", Quantity.Boolean, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) != null && (w.GetTestRslt(t).ErrorFlags & 0x0004) != 0) ? Strings.Yes : Strings.No)); + AllItems.Add(new WMeterRsltItemSpec(ItemID.E4, "E4 ()", Quantity.Boolean, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) != null && (w.GetTestRslt(t).ErrorFlags & 0x0008) != 0) ? Strings.Yes : Strings.No)); + AllItems.Add(new WMeterRsltItemSpec(ItemID.E5, "E5 ()", Quantity.Boolean, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) != null && (w.GetTestRslt(t).ErrorFlags & 0x0010) != 0) ? Strings.Yes : Strings.No)); + AllItems.Add(new WMeterRsltItemSpec(ItemID.E6, "E6 ()", Quantity.Boolean, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) != null && (w.GetTestRslt(t).ErrorFlags & 0x0020) != 0) ? Strings.Yes : Strings.No)); + AllItems.Add(new WMeterRsltItemSpec(ItemID.E7, "E7 ()", Quantity.Boolean, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) != null && (w.GetTestRslt(t).ErrorFlags & 0x0040) != 0) ? Strings.Yes : Strings.No)); + AllItems.Add(new WMeterRsltItemSpec(ItemID.E8, "E8 ()", Quantity.Boolean, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) != null && (w.GetTestRslt(t).ErrorFlags & 0x0080) != 0) ? Strings.Yes : Strings.No)); + AllItems.Add(new WMeterRsltItemSpec(ItemID.E9, "E9 ()", Quantity.Boolean, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) != null && (w.GetTestRslt(t).ErrorFlags & 0x0100) != 0) ? Strings.Yes : Strings.No)); + AllItems.Add(new WMeterRsltItemSpec(ItemID.E10, "E10 ()", Quantity.Boolean, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) != null && (w.GetTestRslt(t).ErrorFlags & 0x0200) != 0) ? Strings.Yes : Strings.No)); + AllItems.Add(new WMeterRsltItemSpec(ItemID.E11, "E11 ()", Quantity.Boolean, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) != null && (w.GetTestRslt(t).ErrorFlags & 0x0400) != 0) ? Strings.Yes : Strings.No)); + AllItems.Add(new WMeterRsltItemSpec(ItemID.E12, "E12 ()", Quantity.Boolean, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) != null && (w.GetTestRslt(t).ErrorFlags & 0x0800) != 0) ? Strings.Yes : Strings.No)); + AllItems.Add(new WMeterRsltItemSpec(ItemID.E13, "E13 ()", Quantity.Boolean, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) != null && (w.GetTestRslt(t).ErrorFlags & 0x1000) != 0) ? Strings.Yes : Strings.No)); + AllItems.Add(new WMeterRsltItemSpec(ItemID.E14, "E14 ()", Quantity.Boolean, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) != null && (w.GetTestRslt(t).ErrorFlags & 0x2000) != 0) ? Strings.Yes : Strings.No)); + AllItems.Add(new WMeterRsltItemSpec(ItemID.E15, "E15 ()", Quantity.Boolean, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) != null && (w.GetTestRslt(t).ErrorFlags & 0x4000) != 0) ? Strings.Yes : Strings.No)); + AllItems.Add(new WMeterRsltItemSpec(ItemID.E16, "E16 ()", Quantity.Boolean, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) != null && (w.GetTestRslt(t).ErrorFlags & 0x8000) != 0) ? Strings.Yes : Strings.No)); + AllItems.Add(new WMeterRsltItemSpec(ItemID.E21, "E21 ()", Quantity.Boolean, ItemCategory.TestResult, (w, t, u, f, p) => (w.GetTestRslt(t) != null && (w.GetTestRslt(t).ErrorFlags & 0x100000) != 0) ? Strings.Yes : Strings.No)); + + AllItems.Add(new WMeterRsltItemSpec(ItemID.Table_row_nr, "Table row #", Quantity.Number, ItemCategory.Other, (w, t, u, f, p) => string.IsNullOrEmpty(f) ? TableRowNr.ToString() : string.Format(f, TableRowNr))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.Table_column_nr, "Table column #", Quantity.Number, ItemCategory.Other, (w, t, u, f, p) => string.IsNullOrEmpty(f) ? TableColumnNr.ToString() : string.Format(f, TableColumnNr))); + AllItems.Add(new WMeterRsltItemSpec(ItemID.WMRemark, string.Format("{0} {1}", Strings.Water_Meter, Strings.Remark), Quantity.String, ItemCategory.MeterResult, (w, t, u, f, p) => FormatStr(f, w.Remark))); + } + + /// To be updated by Output.FileWriter or Output.Printer + public static int TableRowNr; + public static int TableColumnNr; + + + public static string FormatStr(string format, string value) + { + return string.IsNullOrEmpty(format) ? value : string.Format(format, value); + } + + public static string FormatInt(string format, int value) + { + return string.IsNullOrEmpty(format) ? value.ToString() : string.Format(format, value); + } + + public static string FormatDbl(Config.Unit units, string format, string precisionOrEmpty, string dfltPrecision, double v) + { + return FormatDbl(units, format, precisionOrEmpty, dfltPrecision, v, CultureInfo.CurrentCulture); + } + /// + public static string FormatDbl(Config.Unit units, string format, string precisionOrEmpty, string dfltPrecision, double v, CultureInfo ci) + { + double val = Config.Units.ConvertTo(units, v); + + string precision = string.IsNullOrEmpty(precisionOrEmpty) ? dfltPrecision : precisionOrEmpty; + + /// Modify "Vx" precision specification to an appropriate "Fx" format specification + if (precision.Contains("V")) + { + int significantDigits; + if (int.TryParse(precision.Substring(1), out significantDigits)) + { + precision = Config.Utils.SignificantDigitsToFmt(val, significantDigits); + } + } + + if (string.IsNullOrEmpty(format)) + { + if (-float.Epsilon <= val && val <= float.Epsilon) + return "0"; + else + return val.ToString(precision, ci); + } + else + { + if (-float.Epsilon <= val && val <= float.Epsilon) + return string.Format(format, "0"); + else + return string.Format(format, val.ToString(precision, ci)); + } + } + + public static string FormatDbl(Config.Unit units, string format, string precisionOrEmpty, string dfltPrecision, double v1, double v2) + { + return FormatDbl(units, format, precisionOrEmpty, dfltPrecision, v1, v2, CultureInfo.CurrentCulture); + } + /// + public static string FormatDbl(Config.Unit units, string format, string precisionOrEmpty, string dfltPrecision, double v1, double v2, CultureInfo ci) + { + double val1 = Config.Units.ConvertTo(units, v1); + double val2 = Config.Units.ConvertTo(units, v2); + + string precision = string.IsNullOrEmpty(precisionOrEmpty) ? dfltPrecision : precisionOrEmpty; + + /// Modify "Vx" precision specification to an appropriate "Fx" format specification + if (precision.Contains("V")) + { + int significantDigits; + if (int.TryParse(precision.Substring(1), out significantDigits)) + { + precision = Config.Utils.SignificantDigitsToFmt(val1, significantDigits); + } + } + + if (string.IsNullOrEmpty(format)) + { + return string.Format("{0} {1}", + (-float.Epsilon <= val1 && val1 <= float.Epsilon) ? "0" : val1.ToString(precision, ci), + (-float.Epsilon <= val2 && val2 <= float.Epsilon) ? "0" : val2.ToString(precision, ci)); + } + else + { + return string.Format(format, + (-float.Epsilon <= val1 && val1 <= float.Epsilon) ? "0" : val1.ToString(precision, ci), + (-float.Epsilon <= val2 && val2 <= float.Epsilon) ? "0" : val2.ToString(precision, ci)); + } + } + + + /// + /// Converts a list of 'Output item specifications' to a string array + /// + /// + /// + public static string[] ToStrArray(IList items) + { + int count = (items != null) ? items.Count : 0; + string[] result = new string[count]; + for (int i = 0; i < count; i++) + { + if (items[i].Caption == null) items[i].Caption = string.Empty; + if (items[i].TestID == null) items[i].TestID = string.Empty; + if (items[i].Format == null) items[i].Format = string.Empty; + if (items[i].Precision == null) items[i].Precision = string.Empty; + + result[i] = string.Format("{0}~{1}~{2}~{3}~{4}~{5}~{6}~{7}", + items[i].Uid, + items[i].Caption.Replace("~", "\n"), + items[i].TestID, + items[i].Units, + items[i].Format.Replace("~", "\n"), + items[i].Precision, + items[i].Width, + items[i].Alignment); + } + return result; + } + + /// + /// Converts a string array to a list of 'Output item specifications' + /// + /// + /// + public static IList FromStrArray(string[] strArray) + { + IList result = new List(); + + if (strArray != null) + { + for (int i = 0; i < strArray.Length; i++) + { + try + { + WMeterRsltItemSpec item; + string[] field = strArray[i].Split(new char[] { '~' }); + + if (!strArray[i].Contains("~")) + { + /// + /// Old style results item specification -> convert it + /// + bool added = false; + foreach (var it in AllItems) + { + if (strArray[i].Equals(it.OldUid)) + { + item = it.Clone(); + item.Caption = item.Name.Replace("()", "").Replace(" *", ""); + item.Units = 0; /// use default units + item.Format = null; /// the same like format string "{0}" + item.Precision = null; + item.Width = 0; /// do not ad any extra spaces + item.Alignment = Alignment.Left; + result.Add(item); + added = true; + break; + } + } + if (!added) + { + item = GetItem(0); + item.Caption = "Prs.Err."; + item.Format = string.Format("Parse error: {0}", strArray[i]); + result.Add(item); + } + } + else if ((item = GetItem(int.Parse(field[0]))) != null) + { + /// + /// Load the new style results item specification + /// + item.Caption = field[1].Replace("\n", "~"); + item.TestID = field[2]; + item.Units = 0; + for (Config.Unit u = 0; u < Config.Unit.Count; u++) + { + if (u.ToString().Equals(field[3])) { item.Units = u; break; } + } + item.Format = field[4].Replace("\n", "~"); + item.Precision = field[5]; + item.Width = int.Parse(field[6]); + item.Alignment = 0; + for (Config.Entities.Alignment a = 0; a < Config.Entities.Alignment.Count; a++) + { + if (a.ToString().Equals(field[7])) { item.Alignment = a; break; } + } + + result.Add(item); + } + else + { + /// + /// Create an item with parse error information + /// + WMeterRsltItemSpec item2 = GetItem(0); + item2.Caption = "Prs.Err."; + item2.Format = string.Format("Parse error: {0}", strArray[i]); + result.Add(item2); + } + } + catch + { + WMeterRsltItemSpec item = GetItem(0); + item.Caption = "Prs.Err."; + item.Format = string.Format("Parse error: {0}", strArray[i]); + result.Add(item); + } + } + } + return result; + } + + + public static WMeterRsltItemSpec GetItem(int uid) + { + foreach (var item in AllItems) + { + if (item.Uid == uid) return item.Clone(); + } + return null; + } + + + public static WMeterRsltItemSpec GetItem(ItemID itemId) + { + return GetItem((int)itemId); + } + + public override string ToString() + { + if (!string.IsNullOrEmpty(Caption)) + return Caption; + else + return ((ItemID)Uid).ToString(); + } + } +} diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Filters/DateFilter.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/DateFilter.cs new file mode 100644 index 00000000..f842a33e --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/DateFilter.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Windows.Forms; +using System.Xml.Serialization; +using NHibernate; +using Results.Entities; +using ResultsBrowser.Resources; + +namespace ResultsBrowser.Filters +{ + public class DateFilter : IFilter + { + public static string GetFilterID() { return "Date"; } + public static string GetFilterName() { return Strings.Date; } + + /// + /// Obligatory wrappers + /// + public string GetThisFilterID() { return GetFilterID(); } + public void Save(StringBuilder sb) { (new XmlSerializer(this.GetType())).Serialize(new StringWriter(sb), this); } + public void Data2UI() { userIface.Data2UI(); } + public void UI2Data() { userIface.UI2Data(); } + public UserControl GetFilterUI() { return userIface as UserControl; } + + /// + /// Serialized filter data + /// + public DateTime From; + public DateTime To; + + + private DateFilterUI userIface; + + public DateFilter() + { + userIface = new DateFilterUI(this); + } + + public IList ExecuteQuery(ISession[] sessions, IList waterMeters) + { + IList filteredWaterMeters = new List(); + + if (waterMeters == null) + { + foreach (var se in sessions) + { + IList batches = se.QueryOver() + .WhereRestrictionOn(x => x.EndTime) + .IsBetween(From) + .And(To) + .List(); + + foreach (var b in batches) + { + foreach (var wm in b.WaterMeters) filteredWaterMeters.Add(wm); + } + } + } + else + { + foreach (var wm in waterMeters) + { + if (wm.Batch.EndTime >= From && wm.Batch.EndTime <= To) filteredWaterMeters.Add(wm); + } + } + + return filteredWaterMeters; + } + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Filters/DateFilterUI.Designer.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/DateFilterUI.Designer.cs new file mode 100644 index 00000000..959ad711 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/DateFilterUI.Designer.cs @@ -0,0 +1,106 @@ +namespace ResultsBrowser.Filters +{ + partial class DateFilterUI + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.toLabel = new System.Windows.Forms.Label(); + this.toDateTimePicker = new System.Windows.Forms.DateTimePicker(); + this.fromLabel = new System.Windows.Forms.Label(); + this.fromDateTimePicker = new System.Windows.Forms.DateTimePicker(); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.toLabel); + this.groupBox1.Controls.Add(this.toDateTimePicker); + this.groupBox1.Controls.Add(this.fromLabel); + this.groupBox1.Controls.Add(this.fromDateTimePicker); + this.groupBox1.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupBox1.Location = new System.Drawing.Point(0, 0); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(835, 40); + this.groupBox1.TabIndex = 0; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Date"; + // + // toLabel + // + this.toLabel.AutoSize = true; + this.toLabel.Location = new System.Drawing.Point(390, 16); + this.toLabel.Name = "toLabel"; + this.toLabel.Size = new System.Drawing.Size(20, 13); + this.toLabel.TabIndex = 6; + this.toLabel.Text = "To"; + // + // toDateTimePicker + // + this.toDateTimePicker.Location = new System.Drawing.Point(430, 13); + this.toDateTimePicker.Name = "toDateTimePicker"; + this.toDateTimePicker.Size = new System.Drawing.Size(151, 20); + this.toDateTimePicker.TabIndex = 5; + // + // fromLabel + // + this.fromLabel.AutoSize = true; + this.fromLabel.Location = new System.Drawing.Point(128, 17); + this.fromLabel.Name = "fromLabel"; + this.fromLabel.Size = new System.Drawing.Size(30, 13); + this.fromLabel.TabIndex = 4; + this.fromLabel.Text = "From"; + // + // fromDateTimePicker + // + this.fromDateTimePicker.Location = new System.Drawing.Point(168, 13); + this.fromDateTimePicker.Name = "fromDateTimePicker"; + this.fromDateTimePicker.Size = new System.Drawing.Size(151, 20); + this.fromDateTimePicker.TabIndex = 3; + // + // DateFilter + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.groupBox1); + this.Name = "DateFilter"; + this.Size = new System.Drawing.Size(835, 40); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Label fromLabel; + private System.Windows.Forms.DateTimePicker fromDateTimePicker; + private System.Windows.Forms.Label toLabel; + private System.Windows.Forms.DateTimePicker toDateTimePicker; + } +} diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Filters/DateFilterUI.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/DateFilterUI.cs new file mode 100644 index 00000000..9a3eca28 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/DateFilterUI.cs @@ -0,0 +1,44 @@ +using System.Windows.Forms; +using ResultsBrowser.Resources; + +namespace ResultsBrowser.Filters +{ + public partial class DateFilterUI : UserControl + { + DateFilter data; + + /// Used only by Designer + public DateFilterUI() + { + InitializeComponent(); + Localize(); + } + + /// Used to create the control aby a filter + public DateFilterUI(DateFilter data) + { + this.data = data; + InitializeComponent(); + Localize(); + } + + void Localize() + { + groupBox1.Text = DateFilter.GetFilterName(); + fromLabel.Text = Strings.From; + toLabel.Text = Strings.To; + } + + public void Data2UI() + { + fromDateTimePicker.Value = data.From; + toDateTimePicker.Value = data.To; + } + + public void UI2Data() + { + data.From = fromDateTimePicker.Value.Date; + data.To = toDateTimePicker.Value.Date.AddDays(1).AddTicks(-1); + } + } +} diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Filters/DateFilterUI.resx b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/DateFilterUI.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/DateFilterUI.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Filters/Factory.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/Factory.cs new file mode 100644 index 00000000..e41ae52f --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/Factory.cs @@ -0,0 +1,75 @@ +using System; +using System.IO; +using System.Text; +using System.Windows.Forms; +using System.Xml.Serialization; + +namespace ResultsBrowser.Filters +{ + static class Factory + { + public static readonly string[] IDs; + public static readonly string[] Names; + public static readonly int Count; + + + static Factory() + { + IDs = new string[] + { + DateFilter.GetFilterID(), + ProcedureFilter.GetFilterID(), + ProtocolFilter.GetFilterID(), + QnFilter.GetFilterID(), + SerialNrFilter.GetFilterID(), + }; + + Names = new string[] + { + DateFilter.GetFilterName(), + ProcedureFilter.GetFilterName(), + ProtocolFilter.GetFilterName(), + QnFilter.GetFilterName(), + SerialNrFilter.GetFilterName(), + }; + + Count = IDs.Length; + } + + + public static IFilter GetFilter(string filterID) + { + if (filterID == DateFilter.GetFilterID()) return new DateFilter(); + else if (filterID == ProcedureFilter.GetFilterID()) return new ProcedureFilter(); + else if (filterID == ProtocolFilter.GetFilterID()) return new ProtocolFilter(); + else if (filterID == QnFilter.GetFilterID()) return new QnFilter(); + else if (filterID == SerialNrFilter.GetFilterID()) return new SerialNrFilter(); + else return null; + } + + + public static IFilter LoadFilter(string filterID, string serializedText) + { + try + { + Type type; + if (filterID == DateFilter.GetFilterID()) type = typeof(DateFilter); + else if (filterID == ProcedureFilter.GetFilterID()) type = typeof(ProcedureFilter); + else if (filterID == ProtocolFilter.GetFilterID()) type = typeof(ProtocolFilter); + else if (filterID == QnFilter.GetFilterID()) type = typeof(QnFilter); + else if (filterID == SerialNrFilter.GetFilterID()) type = typeof(SerialNrFilter); + else return null; + + IFilter filter = (new XmlSerializer(type)).Deserialize(new StringReader(serializedText)) as IFilter; + filter.Data2UI(); + return filter; + } + catch (Exception e) + { + string msg = e.Message; + MessageBox.Show(e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + return null; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Filters/IFilter.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/IFilter.cs new file mode 100644 index 00000000..f1f5ff27 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/IFilter.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using NHibernate; +using Results.Entities; + +namespace ResultsBrowser.Filters +{ + public interface IFilter + { + string GetThisFilterID(); /// Returns string identifying filter type + + void Save(StringBuilder sb); /// Saves filter parameters into a string + + void Data2UI(); + + void UI2Data(); /// Throws an exception with appropriate message if UI data are invalid + + UserControl GetFilterUI(); /// Returns filter's UI control to be added to the FlowLayoutPanel + + IList ExecuteQuery(ISession[] sessions, IList waterMeters); + } +} diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Filters/ProcedureFilter.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/ProcedureFilter.cs new file mode 100644 index 00000000..90e24afc --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/ProcedureFilter.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Windows.Forms; +using System.Xml.Serialization; +using NHibernate; +using Results.Entities; +using ResultsBrowser.Resources; + +namespace ResultsBrowser.Filters +{ + public class ProcedureFilter : IFilter + { + public static string GetFilterID() { return "Procedure"; } + public static string GetFilterName() { return Strings.Procedure; } + + /// + /// Obligatory wrappers + /// + public string GetThisFilterID() { return GetFilterID(); } + public void Save(StringBuilder sb) { (new XmlSerializer(this.GetType())).Serialize(new StringWriter(sb), this); } + public void Data2UI() { userIface.Data2UI(); } + public void UI2Data() { userIface.UI2Data(); } + public UserControl GetFilterUI() { return userIface as UserControl; } + + /// + /// Serialized filter data + /// + public string Procedure; + + + private ProcedureFilterUI userIface; + + public ProcedureFilter() + { + userIface = new ProcedureFilterUI(this); + } + + public IList ExecuteQuery(ISession[] sessions, IList waterMeters) + { + IList filteredWaterMeters = new List(); + + if (waterMeters == null) + { + foreach (var se in sessions) + { + IList batches = se.QueryOver() + .Where(x => (x.ProcedureName == Procedure)) + .List(); + + foreach (var b in batches) + { + foreach (var wm in b.WaterMeters) filteredWaterMeters.Add(wm); + } + } + } + else + { + foreach (var wm in waterMeters) + { + if (wm.Batch.ProcedureName == Procedure) filteredWaterMeters.Add(wm); + } + } + + return filteredWaterMeters; + } + } +} diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Filters/ProcedureFilterUI.Designer.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/ProcedureFilterUI.Designer.cs new file mode 100644 index 00000000..33811547 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/ProcedureFilterUI.Designer.cs @@ -0,0 +1,72 @@ +namespace ResultsBrowser.Filters +{ + partial class ProcedureFilterUI + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.procedureTextBox = new System.Windows.Forms.TextBox(); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.procedureTextBox); + this.groupBox1.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupBox1.Location = new System.Drawing.Point(0, 0); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(835, 40); + this.groupBox1.TabIndex = 0; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Procedure"; + // + // procedureTextBox + // + this.procedureTextBox.Location = new System.Drawing.Point(132, 13); + this.procedureTextBox.Name = "procedureTextBox"; + this.procedureTextBox.Size = new System.Drawing.Size(138, 20); + this.procedureTextBox.TabIndex = 0; + // + // ProcedureFilter + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.groupBox1); + this.Name = "ProcedureFilter"; + this.Size = new System.Drawing.Size(835, 40); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TextBox procedureTextBox; + } +} diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Filters/ProcedureFilterUI.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/ProcedureFilterUI.cs new file mode 100644 index 00000000..bb58e63c --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/ProcedureFilterUI.cs @@ -0,0 +1,39 @@ +using System.Windows.Forms; + +namespace ResultsBrowser.Filters +{ + public partial class ProcedureFilterUI : UserControl + { + ProcedureFilter data; + + /// Used only by Designer + public ProcedureFilterUI() + { + InitializeComponent(); + Localize(); + } + + /// Used to create the control aby a filter + public ProcedureFilterUI(ProcedureFilter data) + { + this.data = data; + InitializeComponent(); + Localize(); + } + + void Localize() + { + groupBox1.Text = ProcedureFilter.GetFilterName(); + } + + public void Data2UI() + { + procedureTextBox.Text = (data.Procedure != null) ? data.Procedure : string.Empty; + } + + public void UI2Data() + { + data.Procedure = procedureTextBox.Text; + } + } +} diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Filters/ProcedureFilterUI.resx b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/ProcedureFilterUI.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/ProcedureFilterUI.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Filters/ProtocolFilter.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/ProtocolFilter.cs new file mode 100644 index 00000000..2750f5bf --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/ProtocolFilter.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Windows.Forms; +using System.Xml.Serialization; +using NHibernate; +using Results.Entities; +using ResultsBrowser.Resources; + +namespace ResultsBrowser.Filters +{ + public class ProtocolFilter : IFilter + { + public static string GetFilterID() { return "Protocol"; } + public static string GetFilterName() { return Strings.Protocol; } + + /// + /// Obligatory wrappers + /// + public string GetThisFilterID() { return GetFilterID(); } + public void Save(StringBuilder sb) { (new XmlSerializer(this.GetType())).Serialize(new StringWriter(sb), this); } + public void Data2UI() { userIface.Data2UI(); } + public void UI2Data() { userIface.UI2Data(); } + public UserControl GetFilterUI() { return userIface as UserControl; } + + /// + /// Serialized filter data + /// + public string Protocol; + + + private ProtocolFilterUI userIface; + + public ProtocolFilter() + { + userIface = new ProtocolFilterUI(this); + } + + public IList ExecuteQuery(ISession[] sessions, IList waterMeters) + { + IList filteredWaterMeters = new List(); + + if (waterMeters == null) + { + foreach (var se in sessions) + { + IList batches = se.QueryOver() + .Where(x => (x.ProtocolTitle == Protocol)) + .List(); + + foreach (var b in batches) + { + foreach (var wm in b.WaterMeters) filteredWaterMeters.Add(wm); + } + } + } + else + { + foreach (var wm in waterMeters) + { + if (wm.Batch.ProtocolTitle == Protocol) filteredWaterMeters.Add(wm); + } + } + + return filteredWaterMeters; + } + } +} diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Filters/ProtocolFilterUI.Designer.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/ProtocolFilterUI.Designer.cs new file mode 100644 index 00000000..7217e895 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/ProtocolFilterUI.Designer.cs @@ -0,0 +1,72 @@ +namespace ResultsBrowser.Filters +{ + partial class ProtocolFilterUI + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.protocolTextBox = new System.Windows.Forms.TextBox(); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.protocolTextBox); + this.groupBox1.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupBox1.Location = new System.Drawing.Point(0, 0); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(835, 40); + this.groupBox1.TabIndex = 0; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Procedure"; + // + // procedureTextBox + // + this.protocolTextBox.Location = new System.Drawing.Point(132, 13); + this.protocolTextBox.Name = "procedureTextBox"; + this.protocolTextBox.Size = new System.Drawing.Size(138, 20); + this.protocolTextBox.TabIndex = 0; + // + // ProcedureFilter + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.groupBox1); + this.Name = "ProcedureFilter"; + this.Size = new System.Drawing.Size(835, 40); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TextBox protocolTextBox; + } +} diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Filters/ProtocolFilterUI.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/ProtocolFilterUI.cs new file mode 100644 index 00000000..4a974862 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/ProtocolFilterUI.cs @@ -0,0 +1,39 @@ +using System.Windows.Forms; + +namespace ResultsBrowser.Filters +{ + public partial class ProtocolFilterUI : UserControl + { + ProtocolFilter data; + + /// Used only by Designer + public ProtocolFilterUI() + { + InitializeComponent(); + Localize(); + } + + /// Used to create the control aby a filter + public ProtocolFilterUI(ProtocolFilter data) + { + this.data = data; + InitializeComponent(); + Localize(); + } + + void Localize() + { + groupBox1.Text = ProtocolFilter.GetFilterName(); + } + + public void Data2UI() + { + protocolTextBox.Text = (data.Protocol != null) ? data.Protocol : string.Empty; + } + + public void UI2Data() + { + data.Protocol = protocolTextBox.Text; + } + } +} diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Filters/ProtocolFilterUI.resx b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/ProtocolFilterUI.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/ProtocolFilterUI.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Filters/QnFilter.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/QnFilter.cs new file mode 100644 index 00000000..e1b14e23 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/QnFilter.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Windows.Forms; +using System.Xml.Serialization; +using NHibernate; +using Results.Entities; +using ResultsBrowser.Resources; + +namespace ResultsBrowser.Filters +{ + public class QnFilter : IFilter + { + public static string GetFilterID() { return "Qn"; } + public static string GetFilterName() { return "Qn"; } + + /// + /// Obligatory wrappers + /// + public string GetThisFilterID() { return GetFilterID(); } + public void Save(StringBuilder sb) { (new XmlSerializer(this.GetType())).Serialize(new StringWriter(sb), this); } + public void Data2UI() { userIface.Data2UI(); } + public void UI2Data() { userIface.UI2Data(); } + public UserControl GetFilterUI() { return userIface as UserControl; } + + /// + /// Serialized filter data + /// + public double Qn; + + + private QnFilterUI userIface; + + public QnFilter() + { + userIface = new QnFilterUI(this); + } + + public IList ExecuteQuery(ISession[] sessions, IList waterMeters) + { + IList filteredWaterMeters = new List(); + + if (waterMeters == null) + { + foreach (var se in sessions) + { + IList wms = se.QueryOver().List(); + + foreach (var wm in wms) + { + if (wm.Q3_Qn() == Qn) filteredWaterMeters.Add(wm); + } + } + } + else + { + foreach (var wm in waterMeters) + { + if (wm.Q3_Qn() == Qn) filteredWaterMeters.Add(wm); + } + } + + return filteredWaterMeters; + } + } +} diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Filters/QnFilterUI.Designer.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/QnFilterUI.Designer.cs new file mode 100644 index 00000000..2a8453fc --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/QnFilterUI.Designer.cs @@ -0,0 +1,72 @@ +namespace ResultsBrowser.Filters +{ + partial class QnFilterUI + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.procedureTextBox = new System.Windows.Forms.TextBox(); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.procedureTextBox); + this.groupBox1.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupBox1.Location = new System.Drawing.Point(0, 0); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(835, 40); + this.groupBox1.TabIndex = 0; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Qn"; + // + // procedureTextBox + // + this.procedureTextBox.Location = new System.Drawing.Point(132, 13); + this.procedureTextBox.Name = "procedureTextBox"; + this.procedureTextBox.Size = new System.Drawing.Size(138, 20); + this.procedureTextBox.TabIndex = 0; + // + // QnFilter + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.groupBox1); + this.Name = "QnFilter"; + this.Size = new System.Drawing.Size(835, 40); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TextBox procedureTextBox; + } +} diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Filters/QnFilterUI.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/QnFilterUI.cs new file mode 100644 index 00000000..539853fa --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/QnFilterUI.cs @@ -0,0 +1,39 @@ +using System.Windows.Forms; + +namespace ResultsBrowser.Filters +{ + public partial class QnFilterUI : UserControl + { + QnFilter data; + + /// Used only by Designer + public QnFilterUI() + { + InitializeComponent(); + Localize(); + } + + /// Used to create the control aby a filter + public QnFilterUI(QnFilter data) + { + this.data = data; + InitializeComponent(); + Localize(); + } + + void Localize() + { + groupBox1.Text = QnFilter.GetFilterName(); + } + + public void Data2UI() + { + procedureTextBox.Text = data.Qn.ToString(); + } + + public void UI2Data() + { + data.Qn = double.Parse(procedureTextBox.Text); + } + } +} diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Filters/QnFilterUI.resx b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/QnFilterUI.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/QnFilterUI.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Filters/SerialNrFilter.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/SerialNrFilter.cs new file mode 100644 index 00000000..f48e2b20 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/SerialNrFilter.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using System.Xml.Serialization; +using NHibernate; +using Results.Entities; +using ResultsBrowser.Resources; + +namespace ResultsBrowser.Filters +{ + public class SerialNrFilter : IFilter + { + public static string GetFilterID() { return "SerialNr"; } + public static string GetFilterName() { return Strings.Serial_Number; } + + /// + /// Obligatory wrappers + /// + public string GetThisFilterID() { return GetFilterID(); } + public void Save(StringBuilder sb) { (new XmlSerializer(this.GetType())).Serialize(new StringWriter(sb), this); } + public void Data2UI() { userIface.Data2UI(); } + public void UI2Data() { userIface.UI2Data(); } + public UserControl GetFilterUI() { return userIface as UserControl; } + + /// + /// Serialized filter data + /// + public string SerialNr; + + + private SerialNrFilterUI userIface; + + public SerialNrFilter() + { + userIface = new SerialNrFilterUI(this); + } + + public IList ExecuteQuery(ISession[] sessions, IList waterMeters) + { + IList filteredWaterMeters = new List(); + + if (waterMeters == null) + { + foreach (var se in sessions) + { + IList wms = se.QueryOver() + .Where(x => (x.SerialNr == SerialNr)) + .List(); + foreach (var wm in wms) filteredWaterMeters.Add(wm); + } + } + else + { + foreach (var wm in waterMeters) + { + if (wm.SerialNr == SerialNr) filteredWaterMeters.Add(wm); + } + } + + return filteredWaterMeters; + } + } +} diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Filters/SerialNrFilterUI.Designer.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/SerialNrFilterUI.Designer.cs new file mode 100644 index 00000000..06c98f1f --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/SerialNrFilterUI.Designer.cs @@ -0,0 +1,72 @@ +namespace ResultsBrowser.Filters +{ + partial class SerialNrFilterUI + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.serialNrTextBox = new System.Windows.Forms.TextBox(); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.serialNrTextBox); + this.groupBox1.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupBox1.Location = new System.Drawing.Point(0, 0); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(835, 40); + this.groupBox1.TabIndex = 0; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Serial number"; + // + // serialNrTextBox + // + this.serialNrTextBox.Location = new System.Drawing.Point(132, 13); + this.serialNrTextBox.Name = "serialNrTextBox"; + this.serialNrTextBox.Size = new System.Drawing.Size(138, 20); + this.serialNrTextBox.TabIndex = 0; + // + // SerialNrFilter + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.groupBox1); + this.Name = "SerialNrFilter"; + this.Size = new System.Drawing.Size(835, 40); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TextBox serialNrTextBox; + } +} diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Filters/SerialNrFilterUI.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/SerialNrFilterUI.cs new file mode 100644 index 00000000..009ed750 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/SerialNrFilterUI.cs @@ -0,0 +1,39 @@ +using System.Windows.Forms; + +namespace ResultsBrowser.Filters +{ + public partial class SerialNrFilterUI : UserControl + { + SerialNrFilter data; + + /// Used only by Designer + public SerialNrFilterUI() + { + InitializeComponent(); + Localize(); + } + + /// Used to create the control aby a filter + public SerialNrFilterUI(SerialNrFilter data) + { + this.data = data; + InitializeComponent(); + Localize(); + } + + void Localize() + { + groupBox1.Text = SerialNrFilter.GetFilterName(); + } + + public void Data2UI() + { + serialNrTextBox.Text = (data.SerialNr != null) ? data.SerialNr : string.Empty; + } + + public void UI2Data() + { + data.SerialNr = serialNrTextBox.Text; + } + } +} diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Filters/SerialNrFilterUI.resx b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/SerialNrFilterUI.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Filters/SerialNrFilterUI.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/FiltersConfig.cs b/TBF_V2/Sources/TBF/ResultsBrowser/FiltersConfig.cs new file mode 100644 index 00000000..61e09c81 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/FiltersConfig.cs @@ -0,0 +1,125 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using System.Windows.Forms; +using ResultsBrowser.Resources; + +namespace ResultsBrowser +{ + /// + /// Class to be serialized to an XML file... + /// Public members are filters / parts of a query. + /// + [XmlRootAttribute("Query")] + public class FiltersConfig + { + public string[] FilterID; + public string[] FilterData; + + [XmlIgnore] + public int FiltersCount { get { return Math.Min((FilterID != null) ? FilterID.Length : 0, + (FilterData != null) ? FilterData.Length : 0); } } + + public string[] ResultItems; + + public string PrinterClass; + public string PrinterCfg; + + [XmlArrayAttribute("ResultsClmnWidths")] + public int[] ResultsClmnWidths; + [XmlIgnore] + public int ResultsClmnCount { get { return (ResultsClmnWidths != null) ? ResultsClmnWidths.Length : 0; } } + + + public FiltersConfig() + { + } + + public FiltersConfig(int count) + { + if (count > 0) + { + FilterID = new string[count]; + FilterData = new string[count]; + } + } + + /// + /// Load public fields of this class from the XML file. + /// + public static FiltersConfig Load(string fileName) + { + try + { + using (TextReader reader = new StreamReader(fileName)) + { + FiltersConfig ls = (new XmlSerializer(typeof(FiltersConfig))).Deserialize(reader) as FiltersConfig; + // Copy the settings just in case De-serialize() completes OK + return ls; + } + } + catch (Exception e) + { + string msg = e.Message; + return null; + } + } + + /// + /// Updates public arrays FilterID[] and FilterData[] of this serializable class. + /// + /// + /// + public bool UpdateFromFilters(IList filters) + { + try + { + int cnt = filters.Count; + FilterID = new string[cnt]; + FilterData = new string[cnt]; + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < cnt; i++) + { + FilterID[i] = filters[i].GetThisFilterID(); + filters[i].UI2Data(); + sb.Clear(); + filters[i].Save(sb); + FilterData[i] = sb.ToString(); + } + + return true; /// All OK + } + catch (Exception exc) + { + MessageBox.Show(exc.Message, Strings.Error_serializing_filters, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + return false; + } + } + + /// + /// Save public fields of this class to the XML file. + /// + public bool Save(string fileName) + { + try + { + using (TextWriter writer = new StreamWriter(fileName)) + { + (new XmlSerializer(typeof(FiltersConfig))).Serialize(writer, this); + } + return true; + } + catch (Exception exc) + { + MessageBox.Show(exc.Message, Strings.Error_saving_file, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + return false; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Forms/AddFilterDlg.Designer.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/AddFilterDlg.Designer.cs new file mode 100644 index 00000000..f20ae016 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/AddFilterDlg.Designer.cs @@ -0,0 +1,103 @@ +namespace ResultsBrowser.Forms +{ + partial class AddFilterDlg + { + /// + /// 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() + { + this.availFiltersListBox = new System.Windows.Forms.ListBox(); + this.label1 = new System.Windows.Forms.Label(); + this.cancelButton = new System.Windows.Forms.Button(); + this.okButton = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // availFiltersListBox + // + this.availFiltersListBox.FormattingEnabled = true; + this.availFiltersListBox.Location = new System.Drawing.Point(12, 31); + this.availFiltersListBox.Name = "availFiltersListBox"; + this.availFiltersListBox.Size = new System.Drawing.Size(288, 264); + this.availFiltersListBox.TabIndex = 1; + this.availFiltersListBox.DoubleClick += new System.EventHandler(this.availFiltersListBox_DoubleClick); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 9); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(37, 13); + this.label1.TabIndex = 2; + this.label1.Text = "Filters:"; + // + // cancelButton + // + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cancelButton.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.cancelButton.Location = new System.Drawing.Point(201, 310); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(99, 25); + this.cancelButton.TabIndex = 10; + this.cancelButton.Text = "&Cancel"; + this.cancelButton.UseVisualStyleBackColor = true; + this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click); + // + // okButton + // + this.okButton.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.okButton.Location = new System.Drawing.Point(96, 310); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(99, 25); + this.okButton.TabIndex = 9; + this.okButton.Text = "&OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // AddFilterDlg + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(314, 350); + this.Controls.Add(this.cancelButton); + this.Controls.Add(this.okButton); + this.Controls.Add(this.label1); + this.Controls.Add(this.availFiltersListBox); + this.Name = "AddFilterDlg"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Select a filter"; + this.Load += new System.EventHandler(this.AddFilterDlg_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ListBox availFiltersListBox; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.Button okButton; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Forms/AddFilterDlg.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/AddFilterDlg.cs new file mode 100644 index 00000000..6515316d --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/AddFilterDlg.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using ResultsBrowser.Resources; + +namespace ResultsBrowser.Forms +{ + public partial class AddFilterDlg : Form + { + public string SelectedFilterID; + + private int selectedIndex = -1; + + public AddFilterDlg() + { + InitializeComponent(); + + foreach (var fName in Filters.Factory.Names) + { + availFiltersListBox.Items.Add(fName); + } + } + + private void AddFilterDlg_Load(object sender, EventArgs e) + { + Localize(); + } + + void Localize() + { + Text = Strings.Select_a_filter; + label1.Text = Strings.Filters; + okButton.Text = Strings.OkBtnText; + cancelButton.Text = Strings.CancelBtnText; + } + + private void availFiltersListBox_DoubleClick(object sender, EventArgs e) + { + okButton_Click(sender, e); + } + + private void okButton_Click(object sender, EventArgs e) + { + int ix = availFiltersListBox.SelectedIndex; + if (ix >= 0 && ix < Filters.Factory.Count) + { + selectedIndex = ix; + SelectedFilterID = (string)Filters.Factory.IDs[ix]; + DialogResult = DialogResult.OK; + Close(); + return; + } + + } + + private void cancelButton_Click(object sender, EventArgs e) + { + SelectedFilterID = null; + DialogResult = DialogResult.Cancel; + Close(); + return; + } + } +} diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Forms/AddFilterDlg.resx b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/AddFilterDlg.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/AddFilterDlg.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Forms/DatabaseSettingsDlg.Designer.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/DatabaseSettingsDlg.Designer.cs new file mode 100644 index 00000000..25dbed19 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/DatabaseSettingsDlg.Designer.cs @@ -0,0 +1,253 @@ +namespace ResultsBrowser.Forms +{ + partial class DatabaseSettingsDlg + { + /// + /// 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() + { + this.connectionStringTextBox1 = new System.Windows.Forms.TextBox(); + this.benchNameLabel = new System.Windows.Forms.Label(); + this.connectionStringLabel = new System.Windows.Forms.Label(); + this.connectionStringTextBox2 = new System.Windows.Forms.TextBox(); + this.connectionStringTextBox3 = new System.Windows.Forms.TextBox(); + this.okButton = new System.Windows.Forms.Button(); + this.cancelButton = new System.Windows.Forms.Button(); + this.benchNameTextBox1 = new System.Windows.Forms.TextBox(); + this.benchNameTextBox2 = new System.Windows.Forms.TextBox(); + this.benchNameTextBox3 = new System.Windows.Forms.TextBox(); + this.languageLabel = new System.Windows.Forms.Label(); + this.languageTextBox = new System.Windows.Forms.TextBox(); + this.formatLabel = new System.Windows.Forms.Label(); + this.timePeriodFormatTextBox = new System.Windows.Forms.TextBox(); + this.benchNameTextBox5 = new System.Windows.Forms.TextBox(); + this.benchNameTextBox4 = new System.Windows.Forms.TextBox(); + this.connectionStringTextBox5 = new System.Windows.Forms.TextBox(); + this.connectionStringTextBox4 = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // connectionStringTextBox1 + // + this.connectionStringTextBox1.Location = new System.Drawing.Point(157, 45); + this.connectionStringTextBox1.Name = "connectionStringTextBox1"; + this.connectionStringTextBox1.Size = new System.Drawing.Size(555, 20); + this.connectionStringTextBox1.TabIndex = 3; + // + // benchNameLabel + // + this.benchNameLabel.AutoSize = true; + this.benchNameLabel.Location = new System.Drawing.Point(26, 20); + this.benchNameLabel.Name = "benchNameLabel"; + this.benchNameLabel.Size = new System.Drawing.Size(67, 13); + this.benchNameLabel.TabIndex = 0; + this.benchNameLabel.Text = "Bench name"; + // + // connectionStringLabel + // + this.connectionStringLabel.AutoSize = true; + this.connectionStringLabel.Location = new System.Drawing.Point(154, 20); + this.connectionStringLabel.Name = "connectionStringLabel"; + this.connectionStringLabel.Size = new System.Drawing.Size(89, 13); + this.connectionStringLabel.TabIndex = 1; + this.connectionStringLabel.Text = "Connection string"; + // + // connectionStringTextBox2 + // + this.connectionStringTextBox2.Location = new System.Drawing.Point(157, 71); + this.connectionStringTextBox2.Name = "connectionStringTextBox2"; + this.connectionStringTextBox2.Size = new System.Drawing.Size(555, 20); + this.connectionStringTextBox2.TabIndex = 5; + // + // connectionStringTextBox3 + // + this.connectionStringTextBox3.Location = new System.Drawing.Point(157, 97); + this.connectionStringTextBox3.Name = "connectionStringTextBox3"; + this.connectionStringTextBox3.Size = new System.Drawing.Size(555, 20); + this.connectionStringTextBox3.TabIndex = 7; + // + // okButton + // + this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.okButton.Location = new System.Drawing.Point(506, 250); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(95, 38); + this.okButton.TabIndex = 18; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // cancelButton + // + this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cancelButton.Location = new System.Drawing.Point(617, 250); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(95, 38); + this.cancelButton.TabIndex = 19; + this.cancelButton.Text = "Cancel"; + this.cancelButton.UseVisualStyleBackColor = true; + this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click); + // + // benchNameTextBox1 + // + this.benchNameTextBox1.Location = new System.Drawing.Point(29, 45); + this.benchNameTextBox1.Name = "benchNameTextBox1"; + this.benchNameTextBox1.Size = new System.Drawing.Size(100, 20); + this.benchNameTextBox1.TabIndex = 2; + // + // benchNameTextBox2 + // + this.benchNameTextBox2.Location = new System.Drawing.Point(29, 71); + this.benchNameTextBox2.Name = "benchNameTextBox2"; + this.benchNameTextBox2.Size = new System.Drawing.Size(100, 20); + this.benchNameTextBox2.TabIndex = 4; + // + // benchNameTextBox3 + // + this.benchNameTextBox3.Location = new System.Drawing.Point(29, 97); + this.benchNameTextBox3.Name = "benchNameTextBox3"; + this.benchNameTextBox3.Size = new System.Drawing.Size(100, 20); + this.benchNameTextBox3.TabIndex = 6; + // + // languageLabel + // + this.languageLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.languageLabel.AutoSize = true; + this.languageLabel.Location = new System.Drawing.Point(26, 239); + this.languageLabel.Name = "languageLabel"; + this.languageLabel.Size = new System.Drawing.Size(55, 13); + this.languageLabel.TabIndex = 14; + this.languageLabel.Text = "Language"; + // + // languageTextBox + // + this.languageTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.languageTextBox.Location = new System.Drawing.Point(29, 263); + this.languageTextBox.Name = "languageTextBox"; + this.languageTextBox.Size = new System.Drawing.Size(100, 20); + this.languageTextBox.TabIndex = 15; + // + // formatLabel + // + this.formatLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.formatLabel.AutoSize = true; + this.formatLabel.Location = new System.Drawing.Point(26, 185); + this.formatLabel.Name = "formatLabel"; + this.formatLabel.Size = new System.Drawing.Size(94, 13); + this.formatLabel.TabIndex = 12; + this.formatLabel.Text = "Time period format"; + // + // timePeriodFormatTextBox + // + this.timePeriodFormatTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.timePeriodFormatTextBox.Location = new System.Drawing.Point(29, 207); + this.timePeriodFormatTextBox.Name = "timePeriodFormatTextBox"; + this.timePeriodFormatTextBox.Size = new System.Drawing.Size(683, 20); + this.timePeriodFormatTextBox.TabIndex = 13; + // + // benchNameTextBox5 + // + this.benchNameTextBox5.Location = new System.Drawing.Point(29, 149); + this.benchNameTextBox5.Name = "benchNameTextBox5"; + this.benchNameTextBox5.Size = new System.Drawing.Size(100, 20); + this.benchNameTextBox5.TabIndex = 10; + // + // benchNameTextBox4 + // + this.benchNameTextBox4.Location = new System.Drawing.Point(29, 123); + this.benchNameTextBox4.Name = "benchNameTextBox4"; + this.benchNameTextBox4.Size = new System.Drawing.Size(100, 20); + this.benchNameTextBox4.TabIndex = 8; + // + // connectionStringTextBox5 + // + this.connectionStringTextBox5.Location = new System.Drawing.Point(157, 149); + this.connectionStringTextBox5.Name = "connectionStringTextBox5"; + this.connectionStringTextBox5.Size = new System.Drawing.Size(555, 20); + this.connectionStringTextBox5.TabIndex = 11; + // + // connectionStringTextBox4 + // + this.connectionStringTextBox4.Location = new System.Drawing.Point(157, 123); + this.connectionStringTextBox4.Name = "connectionStringTextBox4"; + this.connectionStringTextBox4.Size = new System.Drawing.Size(555, 20); + this.connectionStringTextBox4.TabIndex = 9; + // + // DatabaseSettingsDlg + // + this.AcceptButton = this.okButton; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cancelButton; + this.ClientSize = new System.Drawing.Size(743, 310); + this.Controls.Add(this.benchNameTextBox5); + this.Controls.Add(this.benchNameTextBox4); + this.Controls.Add(this.connectionStringTextBox5); + this.Controls.Add(this.connectionStringTextBox4); + this.Controls.Add(this.timePeriodFormatTextBox); + this.Controls.Add(this.formatLabel); + this.Controls.Add(this.languageTextBox); + this.Controls.Add(this.languageLabel); + this.Controls.Add(this.benchNameTextBox3); + this.Controls.Add(this.benchNameTextBox2); + this.Controls.Add(this.benchNameTextBox1); + this.Controls.Add(this.cancelButton); + this.Controls.Add(this.okButton); + this.Controls.Add(this.connectionStringTextBox3); + this.Controls.Add(this.connectionStringLabel); + this.Controls.Add(this.connectionStringTextBox2); + this.Controls.Add(this.benchNameLabel); + this.Controls.Add(this.connectionStringTextBox1); + this.Name = "DatabaseSettingsDlg"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Settings"; + this.Load += new System.EventHandler(this.DatabaseSettings_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox connectionStringTextBox1; + private System.Windows.Forms.Label benchNameLabel; + private System.Windows.Forms.Label connectionStringLabel; + private System.Windows.Forms.TextBox connectionStringTextBox2; + private System.Windows.Forms.TextBox connectionStringTextBox3; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.TextBox benchNameTextBox1; + private System.Windows.Forms.TextBox benchNameTextBox2; + private System.Windows.Forms.TextBox benchNameTextBox3; + private System.Windows.Forms.Label languageLabel; + private System.Windows.Forms.TextBox languageTextBox; + private System.Windows.Forms.Label formatLabel; + private System.Windows.Forms.TextBox timePeriodFormatTextBox; + private System.Windows.Forms.TextBox benchNameTextBox5; + private System.Windows.Forms.TextBox benchNameTextBox4; + private System.Windows.Forms.TextBox connectionStringTextBox5; + private System.Windows.Forms.TextBox connectionStringTextBox4; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Forms/DatabaseSettingsDlg.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/DatabaseSettingsDlg.cs new file mode 100644 index 00000000..cec3bb06 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/DatabaseSettingsDlg.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using ResultsBrowser.Resources; +using TBF.BenchControl; + +namespace ResultsBrowser.Forms +{ + public partial class DatabaseSettingsDlg : Form + { + public DatabaseSettingsDlg() + { + InitializeComponent(); + } + + private void DatabaseSettings_Load(object sender, EventArgs e) + { + Localize(); + + benchNameTextBox1.Text = Program.LocalSettings.Bench1; + benchNameTextBox2.Text = Program.LocalSettings.Bench2; + benchNameTextBox3.Text = Program.LocalSettings.Bench3; + benchNameTextBox4.Text = Program.LocalSettings.Bench4; + benchNameTextBox5.Text = Program.LocalSettings.Bench5; + + connectionStringTextBox1.Text = Program.LocalSettings.ConnectionString1; + connectionStringTextBox2.Text = Program.LocalSettings.ConnectionString2; + connectionStringTextBox3.Text = Program.LocalSettings.ConnectionString3; + connectionStringTextBox4.Text = Program.LocalSettings.ConnectionString4; + connectionStringTextBox5.Text = Program.LocalSettings.ConnectionString5; + + timePeriodFormatTextBox.Text = Program.LocalSettings.TimePeriodFormat; + + languageTextBox.Text = Program.LocalSettings.Language; + } + + void Localize() + { + Text = Strings.Settings; + benchNameLabel.Text = Strings.Test_bench; + connectionStringLabel.Text = Strings.Connection_string; + formatLabel.Text = Strings.Format; + languageLabel.Text = Strings.Language; + okButton.Text = Strings.OkBtnText; + cancelButton.Text = Strings.CancelBtnText; + } + + private void okButton_Click(object sender, EventArgs e) + { + Program.LocalSettings.Bench1 = benchNameTextBox1.Text; + Program.LocalSettings.Bench2 = benchNameTextBox2.Text; + Program.LocalSettings.Bench3 = benchNameTextBox3.Text; + Program.LocalSettings.Bench4 = benchNameTextBox4.Text; + Program.LocalSettings.Bench5 = benchNameTextBox5.Text; + + Program.LocalSettings.ConnectionString1 = connectionStringTextBox1.Text; + Program.LocalSettings.ConnectionString2 = connectionStringTextBox2.Text; + Program.LocalSettings.ConnectionString3 = connectionStringTextBox3.Text; + Program.LocalSettings.ConnectionString4 = connectionStringTextBox4.Text; + Program.LocalSettings.ConnectionString5 = connectionStringTextBox5.Text; + + Program.LocalSettings.TimePeriodFormat = timePeriodFormatTextBox.Text; + + Program.LocalSettings.Language = languageTextBox.Text; + + Program.LocalSettings.Save(); + + DialogResult = DialogResult.OK; + Close(); + } + + private void cancelButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + } +} diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Forms/DatabaseSettingsDlg.resx b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/DatabaseSettingsDlg.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/DatabaseSettingsDlg.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Forms/NoBenchOrDatabaseDlg.Designer.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/NoBenchOrDatabaseDlg.Designer.cs new file mode 100644 index 00000000..17a85d63 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/NoBenchOrDatabaseDlg.Designer.cs @@ -0,0 +1,120 @@ +namespace ResultsBrowser.Forms +{ + partial class NoBenchOrDatabaseDlg + { + /// + /// 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(NoBenchOrDatabaseDlg)); + this.exitButton = new System.Windows.Forms.Button(); + this.retryButton = new System.Windows.Forms.Button(); + this.configureButton = new System.Windows.Forms.Button(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.errorMessageLabel = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.SuspendLayout(); + // + // exitButton + // + this.exitButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.exitButton.Location = new System.Drawing.Point(42, 68); + this.exitButton.Name = "exitButton"; + this.exitButton.Size = new System.Drawing.Size(246, 33); + this.exitButton.TabIndex = 0; + this.exitButton.Text = "Exit"; + this.exitButton.UseVisualStyleBackColor = true; + this.exitButton.Click += new System.EventHandler(this.exitButton_Click); + // + // retryButton + // + this.retryButton.Location = new System.Drawing.Point(42, 146); + this.retryButton.Name = "retryButton"; + this.retryButton.Size = new System.Drawing.Size(246, 33); + this.retryButton.TabIndex = 1; + this.retryButton.Text = "Retry database connection"; + this.retryButton.UseVisualStyleBackColor = true; + this.retryButton.Click += new System.EventHandler(this.retryButton_Click); + // + // configureButton + // + this.configureButton.Location = new System.Drawing.Point(42, 107); + this.configureButton.Name = "configureButton"; + this.configureButton.Size = new System.Drawing.Size(246, 33); + this.configureButton.TabIndex = 2; + this.configureButton.Text = "Configure test benches (password required)"; + this.configureButton.UseVisualStyleBackColor = true; + this.configureButton.Click += new System.EventHandler(this.configureButton_Click); + // + // pictureBox1 + // + this.pictureBox1.ErrorImage = ((System.Drawing.Image)(resources.GetObject("pictureBox1.ErrorImage"))); + this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image"))); + this.pictureBox1.InitialImage = null; + this.pictureBox1.Location = new System.Drawing.Point(42, 21); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(32, 32); + this.pictureBox1.TabIndex = 3; + this.pictureBox1.TabStop = false; + // + // errorMessageLabel + // + this.errorMessageLabel.AutoSize = true; + this.errorMessageLabel.Location = new System.Drawing.Point(80, 31); + this.errorMessageLabel.Name = "errorMessageLabel"; + this.errorMessageLabel.Size = new System.Drawing.Size(160, 13); + this.errorMessageLabel.TabIndex = 4; + this.errorMessageLabel.Text = "Cannot connect to the database"; + // + // NoBenchOrDatabaseDlg + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.exitButton; + this.ClientSize = new System.Drawing.Size(328, 194); + this.Controls.Add(this.errorMessageLabel); + this.Controls.Add(this.pictureBox1); + this.Controls.Add(this.configureButton); + this.Controls.Add(this.retryButton); + this.Controls.Add(this.exitButton); + this.Name = "NoBenchOrDatabaseDlg"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Error"; + this.Load += new System.EventHandler(this.NoDatabaseMsgDlg_Load); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button exitButton; + private System.Windows.Forms.Button retryButton; + private System.Windows.Forms.Button configureButton; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Label errorMessageLabel; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Forms/NoBenchOrDatabaseDlg.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/NoBenchOrDatabaseDlg.cs new file mode 100644 index 00000000..c4b4fc6f --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/NoBenchOrDatabaseDlg.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using ResultsBrowser.Resources; + +namespace ResultsBrowser.Forms +{ + public partial class NoBenchOrDatabaseDlg : Form + { + public string Message; + public bool ShowRetry; + + public NoBenchOrDatabaseDlg() + { + InitializeComponent(); + } + + private void NoDatabaseMsgDlg_Load(object sender, EventArgs e) + { + Text = Strings.Error; + errorMessageLabel.Text = (Message != null) ? Message : Strings.Error; + exitButton.Text = Strings.ExitBtnText; + retryButton.Text = Strings.RetryDatabaseText; + configureButton.Text = Strings.ConfigureDatabaseText; + if (!ShowRetry) retryButton.Enabled = false; + } + + private void exitButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Abort; + } + + private void retryButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Retry; + } + + private void configureButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.OK; + } + } +} diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Forms/NoBenchOrDatabaseDlg.resx b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/NoBenchOrDatabaseDlg.resx new file mode 100644 index 00000000..e42c6fc5 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/NoBenchOrDatabaseDlg.resx @@ -0,0 +1,272 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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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 + QBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqF + BwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQ + RuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEB + AKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRR + eAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAA + aRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQe + AEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAa + hQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcA + kEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbh + AQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCk + UXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgA + AGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkU + HgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBA + GoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUH + AJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG + 4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEA + pFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4 + AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABp + FB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4A + QBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqF + BwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQ + RuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEB + AKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRR + eAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAA + aRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQe + AEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAa + hQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcA + kEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbh + AQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCk + UXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgA + AGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkU + HgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBA + GoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUH + AJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG + 4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEA + pFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4 + AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABp + FB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4A + QBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqF + BwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQ + RuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEB + AKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRR + eAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAA + Wc6d+2/gNp2ukwoN8QAAAABJRU5ErkJggg== + + + + + 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 + YUP1lbK+/k8KJ49ubHudCAAAAABJRU5ErkJggg== + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Forms/PrinterConfigDlg.Designer.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/PrinterConfigDlg.Designer.cs new file mode 100644 index 00000000..4d4088e2 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/PrinterConfigDlg.Designer.cs @@ -0,0 +1,112 @@ +namespace ResultsBrowser.Forms +{ + partial class PrinterConfigDlg + { + /// + /// 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() + { + this.printerClassComboBox = new System.Windows.Forms.ComboBox(); + this.changePrinterClassButton = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.configureButton = new System.Windows.Forms.Button(); + this.cancelButton = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // printerClassComboBox + // + this.printerClassComboBox.Enabled = false; + this.printerClassComboBox.FormattingEnabled = true; + this.printerClassComboBox.Location = new System.Drawing.Point(12, 29); + this.printerClassComboBox.Name = "printerClassComboBox"; + this.printerClassComboBox.Size = new System.Drawing.Size(389, 21); + this.printerClassComboBox.TabIndex = 0; + // + // changePrinterClassButton + // + this.changePrinterClassButton.Location = new System.Drawing.Point(15, 67); + this.changePrinterClassButton.Name = "changePrinterClassButton"; + this.changePrinterClassButton.Size = new System.Drawing.Size(161, 43); + this.changePrinterClassButton.TabIndex = 1; + this.changePrinterClassButton.Text = "Change printer type (configuration will be deleted)"; + this.changePrinterClassButton.UseVisualStyleBackColor = true; + this.changePrinterClassButton.Click += new System.EventHandler(this.changePrinterClassButton_Click); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 9); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(60, 13); + this.label1.TabIndex = 2; + this.label1.Text = "Printer type"; + // + // configureButton + // + this.configureButton.Location = new System.Drawing.Point(196, 67); + this.configureButton.Name = "configureButton"; + this.configureButton.Size = new System.Drawing.Size(95, 43); + this.configureButton.TabIndex = 3; + this.configureButton.Text = "Configure"; + this.configureButton.UseVisualStyleBackColor = true; + this.configureButton.Click += new System.EventHandler(this.configureButton_Click); + // + // cancelButton + // + this.cancelButton.Location = new System.Drawing.Point(306, 67); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(95, 43); + this.cancelButton.TabIndex = 4; + this.cancelButton.Text = "Cancel"; + this.cancelButton.UseVisualStyleBackColor = true; + this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click); + // + // PrinterConfigDlg + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(416, 122); + this.Controls.Add(this.cancelButton); + this.Controls.Add(this.configureButton); + this.Controls.Add(this.label1); + this.Controls.Add(this.changePrinterClassButton); + this.Controls.Add(this.printerClassComboBox); + this.Name = "PrinterConfigDlg"; + this.Text = "Printer configuration"; + this.Load += new System.EventHandler(this.PrinterClassDlg_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ComboBox printerClassComboBox; + private System.Windows.Forms.Button changePrinterClassButton; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button configureButton; + private System.Windows.Forms.Button cancelButton; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Forms/PrinterConfigDlg.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/PrinterConfigDlg.cs new file mode 100644 index 00000000..04162e1f --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/PrinterConfigDlg.cs @@ -0,0 +1,126 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using TBF.BenchControl; +using TBF.BenchControl.Generic; + +namespace ResultsBrowser.Forms +{ + public partial class PrinterConfigDlg : Form + { + public string PrinterClass; /// To be initialized in the constructor + public string PrinterCfg; + + IList printerFactories; /// Printer components classes + IComponentFactory printerFactory; + + + public PrinterConfigDlg() + { + InitializeComponent(); + + printerFactories = new List(); + foreach (var fctry in TbfComponents.Factories) + { + if (fctry.ClassName.Contains("Output.Printers.")) printerFactories.Add(fctry); + } + } + + + private void PrinterClassDlg_Load(object sender, EventArgs e) + { + printerClassComboBox.Items.Add("---"); + foreach (var fctry in printerFactories) + { + printerClassComboBox.Items.Add(fctry.ClassName); + } + printerClassComboBox.Text = string.IsNullOrEmpty(PrinterClass) ? "---" : PrinterClass; + } + + + private void changePrinterClassButton_Click(object sender, EventArgs e) + { + printerClassComboBox.Enabled = true; + } + + + private void cancelButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + + private void configureButton_Click(object sender, EventArgs e) + { + string oriClassName = PrinterClass; + + PrinterClass = string.Empty; + if (printerClassComboBox.Text != "---") + { + foreach (var pc in printerFactories) + { + if (printerClassComboBox.Text == pc.ClassName) PrinterClass = pc.ClassName; + } + } + + printerFactory = GetFactory(PrinterClass); + if (printerFactory == null) + { + MessageBox.Show("Invalid printer"); + return; + } + + IComponentCfg printerCfg; + if ((oriClassName != printerFactory.ClassName) || string.IsNullOrEmpty(PrinterCfg)) + { + printerCfg = printerFactory.DefaultConfig(); + } + else + { + Config.Entities.Component cmpnt = new Config.Entities.Component(); + cmpnt.Name = "printer"; + cmpnt.ClassName = PrinterClass; + cmpnt.Parameters = PrinterCfg; + printerCfg = printerFactory.CmpntCfgFromCmpntEntity(cmpnt); + } + + IComponentCfgCtrl cfgControl = printerCfg.GetControl(); + cfgControl.Config = printerCfg; + cfgControl.Config.ItemNr = 0; + + TBF.ComponentParametersDlg cfgForm = new TBF.ComponentParametersDlg(); + cfgForm.TbfComponents = new List(); + + cfgForm.ComponentCfgCtrl = cfgControl; + cfgForm.UnlockAfterStart = true; + DialogResult dr = cfgForm.ShowDialog(); + if (dr != DialogResult.OK) return; + + PrinterCfg = (printerCfg != null) ? printerCfg.CreateDbEntity().Parameters : string.Empty; + + DialogResult = DialogResult.OK; + Close(); + } + + + /// + /// Updates component factory + /// + /// Component class name + /// Reference to a factory + /// true when factory changed + IComponentFactory GetFactory(string className) + { + if (!string.IsNullOrEmpty(className)) + { + foreach (var fac in TbfComponents.Factories) + { + if (fac.ClassName == className) return fac; + } + } + + return null; + } + } +} diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Forms/PrinterConfigDlg.resx b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/PrinterConfigDlg.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/PrinterConfigDlg.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Forms/ResultsConfig.Designer.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/ResultsConfig.Designer.cs new file mode 100644 index 00000000..165e74d0 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/ResultsConfig.Designer.cs @@ -0,0 +1,237 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace ResultsBrowser.Forms +{ + partial class ResultsConfig + { + /// + /// 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() + { + this.okButton = new System.Windows.Forms.Button(); + this.cancelButton = new System.Windows.Forms.Button(); + this.availableResultsListBox = new System.Windows.Forms.ListBox(); + this.selectedResultsListBox = new System.Windows.Forms.ListBox(); + this.availableResultsLabel = new System.Windows.Forms.Label(); + this.selectedResultsLabel = new System.Windows.Forms.Label(); + this.removeAllButton = new System.Windows.Forms.Button(); + this.removeButton = new System.Windows.Forms.Button(); + this.addButton = new System.Windows.Forms.Button(); + this.unlockButton = new System.Windows.Forms.Button(); + this.singleRadioButton = new System.Windows.Forms.RadioButton(); + this.combinedRadioButton = new System.Windows.Forms.RadioButton(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // okButton + // + this.okButton.Location = new System.Drawing.Point(283, 57); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(104, 30); + this.okButton.TabIndex = 4; + this.okButton.Text = "Close"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // cancelButton + // + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cancelButton.Location = new System.Drawing.Point(283, 94); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(104, 30); + this.cancelButton.TabIndex = 5; + this.cancelButton.Text = "Cancel"; + this.cancelButton.UseVisualStyleBackColor = true; + this.cancelButton.Visible = false; + // + // availableResultsListBox + // + this.availableResultsListBox.Enabled = false; + this.availableResultsListBox.FormattingEnabled = true; + this.availableResultsListBox.Location = new System.Drawing.Point(12, 162); + this.availableResultsListBox.Name = "availableResultsListBox"; + this.availableResultsListBox.Size = new System.Drawing.Size(135, 186); + this.availableResultsListBox.TabIndex = 6; + this.availableResultsListBox.DoubleClick += new System.EventHandler(this.availableResultsListBox_DoubleClick); + // + // selectedResultsListBox + // + this.selectedResultsListBox.Enabled = false; + this.selectedResultsListBox.FormattingEnabled = true; + this.selectedResultsListBox.Location = new System.Drawing.Point(252, 162); + this.selectedResultsListBox.Name = "selectedResultsListBox"; + this.selectedResultsListBox.Size = new System.Drawing.Size(135, 186); + this.selectedResultsListBox.TabIndex = 7; + this.selectedResultsListBox.DoubleClick += new System.EventHandler(this.selectedResultsListBox_DoubleClick); + // + // availableResultsLabel + // + this.availableResultsLabel.AutoSize = true; + this.availableResultsLabel.Location = new System.Drawing.Point(12, 140); + this.availableResultsLabel.Name = "availableResultsLabel"; + this.availableResultsLabel.Size = new System.Drawing.Size(86, 13); + this.availableResultsLabel.TabIndex = 8; + this.availableResultsLabel.Text = "Available results:"; + // + // selectedResultsLabel + // + this.selectedResultsLabel.AutoSize = true; + this.selectedResultsLabel.Location = new System.Drawing.Point(249, 140); + this.selectedResultsLabel.Name = "selectedResultsLabel"; + this.selectedResultsLabel.Size = new System.Drawing.Size(85, 13); + this.selectedResultsLabel.TabIndex = 9; + this.selectedResultsLabel.Text = "Selected results:"; + // + // removeAllButton + // + this.removeAllButton.Anchor = System.Windows.Forms.AnchorStyles.None; + this.removeAllButton.Enabled = false; + this.removeAllButton.Location = new System.Drawing.Point(153, 273); + this.removeAllButton.Name = "removeAllButton"; + this.removeAllButton.Size = new System.Drawing.Size(94, 30); + this.removeAllButton.TabIndex = 46; + this.removeAllButton.Text = "<< R&emove all"; + this.removeAllButton.UseVisualStyleBackColor = true; + this.removeAllButton.Click += new System.EventHandler(this.removeAllButton_Click); + // + // removeButton + // + this.removeButton.Anchor = System.Windows.Forms.AnchorStyles.None; + this.removeButton.Enabled = false; + this.removeButton.Location = new System.Drawing.Point(153, 238); + this.removeButton.Name = "removeButton"; + this.removeButton.Size = new System.Drawing.Size(93, 30); + this.removeButton.TabIndex = 45; + this.removeButton.Text = "< &Remove"; + this.removeButton.UseVisualStyleBackColor = true; + this.removeButton.Click += new System.EventHandler(this.removeButton_Click); + // + // addButton + // + this.addButton.Anchor = System.Windows.Forms.AnchorStyles.None; + this.addButton.Enabled = false; + this.addButton.Location = new System.Drawing.Point(153, 203); + this.addButton.Name = "addButton"; + this.addButton.Size = new System.Drawing.Size(93, 30); + this.addButton.TabIndex = 44; + this.addButton.Text = "&Add >"; + this.addButton.UseVisualStyleBackColor = true; + this.addButton.Click += new System.EventHandler(this.addButton_Click); + // + // unlockButton + // + this.unlockButton.Location = new System.Drawing.Point(283, 21); + this.unlockButton.Name = "unlockButton"; + this.unlockButton.Size = new System.Drawing.Size(104, 30); + this.unlockButton.TabIndex = 47; + this.unlockButton.Text = "Unlock"; + this.unlockButton.UseVisualStyleBackColor = true; + this.unlockButton.Click += new System.EventHandler(this.unlockButton_Click); + // + // singleRadioButton + // + this.singleRadioButton.Appearance = System.Windows.Forms.Appearance.Button; + this.singleRadioButton.AutoSize = true; + this.singleRadioButton.Checked = true; + this.singleRadioButton.Location = new System.Drawing.Point(19, 24); + this.singleRadioButton.Name = "singleRadioButton"; + this.singleRadioButton.Size = new System.Drawing.Size(46, 23); + this.singleRadioButton.TabIndex = 48; + this.singleRadioButton.TabStop = true; + this.singleRadioButton.Text = "Single"; + this.singleRadioButton.UseVisualStyleBackColor = true; + this.singleRadioButton.CheckedChanged += new System.EventHandler(this.singleRadioButton_CheckedChanged); + // + // combinedRadioButton + // + this.combinedRadioButton.Appearance = System.Windows.Forms.Appearance.Button; + this.combinedRadioButton.AutoSize = true; + this.combinedRadioButton.Location = new System.Drawing.Point(71, 24); + this.combinedRadioButton.Name = "combinedRadioButton"; + this.combinedRadioButton.Size = new System.Drawing.Size(64, 23); + this.combinedRadioButton.TabIndex = 49; + this.combinedRadioButton.Text = "Combined"; + this.combinedRadioButton.UseVisualStyleBackColor = true; + this.combinedRadioButton.CheckedChanged += new System.EventHandler(this.combinedRadioButton_CheckedChanged); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.combinedRadioButton); + this.groupBox1.Controls.Add(this.singleRadioButton); + this.groupBox1.Location = new System.Drawing.Point(12, 21); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(153, 60); + this.groupBox1.TabIndex = 52; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Water Meter"; + // + // ResultsConfig + // + this.AcceptButton = this.okButton; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cancelButton; + this.ClientSize = new System.Drawing.Size(399, 358); + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.unlockButton); + this.Controls.Add(this.removeAllButton); + this.Controls.Add(this.removeButton); + this.Controls.Add(this.addButton); + this.Controls.Add(this.selectedResultsLabel); + this.Controls.Add(this.availableResultsLabel); + this.Controls.Add(this.selectedResultsListBox); + this.Controls.Add(this.availableResultsListBox); + this.Controls.Add(this.cancelButton); + this.Controls.Add(this.okButton); + this.Name = "ResultsConfig"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "ResultsConfig"; + this.Load += new System.EventHandler(this.ResultsConfig_Load); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.ListBox availableResultsListBox; + private System.Windows.Forms.ListBox selectedResultsListBox; + private System.Windows.Forms.Label availableResultsLabel; + private System.Windows.Forms.Label selectedResultsLabel; + private System.Windows.Forms.Button removeAllButton; + private System.Windows.Forms.Button removeButton; + private System.Windows.Forms.Button addButton; + private System.Windows.Forms.Button unlockButton; + private System.Windows.Forms.RadioButton singleRadioButton; + private System.Windows.Forms.RadioButton combinedRadioButton; + private System.Windows.Forms.GroupBox groupBox1; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Forms/ResultsConfig.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/ResultsConfig.cs new file mode 100644 index 00000000..b56f0752 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/ResultsConfig.cs @@ -0,0 +1,219 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using Results.Entities; +using ResultsBrowser.Resources; + +namespace ResultsBrowser.Forms +{ + public partial class ResultsConfig : Form + { + /// + /// Required access rights to make changes with this form + /// + const Users.Grp.GID RequiredGroupMembership = Users.Grp.GID.Metrologists; + public Config.Entities.TestsArrangement TestsArrangement; + public Config.Entities.MetersArrangement MetersArrangement; + public int NrMetersInOneGroup; + + public IList currentlyAvailableItems; + public IList ReportItems_Single; + public IList ReportItems_Compound; + + bool combined; /// false = single meter items, true = combined meter items + Config.Entities.Device device; /// Screen, Printer or Disk + bool unlocked; /// true = changes enabled + + public ResultsConfig(bool combined) + { + InitializeComponent(); + + this.combined = combined; + device = Config.Entities.Device.Screen; + unlocked = false; + cancelButton.Visible = false; + } + + void Localize() + { + Text = Strings.Configuration; + groupBox1.Text = Strings.Water_Meter; + singleRadioButton.Text = Strings.SingleBtnText; + combinedRadioButton.Text = Strings.CombinedBtnText; + availableResultsLabel.Text = Strings.Available_results; + selectedResultsLabel.Text = Strings.Selected_results; + addButton.Text = Strings.Add; + removeButton.Text = Strings.Remove; + removeAllButton.Text = Strings.Remove_all; + unlockButton.Text = Strings.UnlockBtnText; + okButton.Text = Strings.CloseBtnText; + cancelButton.Text = Strings.CancelBtnText; + } + + void ResultsConfig_Load(object sender, EventArgs e) + { + Localize(); + + singleRadioButton.Checked = !combined; + combinedRadioButton.Checked = combined; + + RedrawAvailable(); + RedrawSelected(); + } + + /// + /// Gets the list of selected items based on watermeter type and device selections + /// + /// List of selected result items + IList GetSelectedItems() + { + if (combined) + { + return ReportItems_Compound; + } + else + { + return ReportItems_Single; + } + } + + /// + /// Redraw selected items (right hand side) + /// + void RedrawAvailable() + { + availableResultsListBox.Items.Clear(); + currentlyAvailableItems = new List(); + foreach (var item in Results.ItemSpec.AllItems) + { + if (!GetSelectedItems().Contains(item) && (combined ? item.CanPrintCompoundMeter : item.CanPrintSingle)) + { + currentlyAvailableItems.Add(item); + availableResultsListBox.Items.Add(item.Name); + } + } + } + + /// + /// Redraw selected items (right hand side) + /// + void RedrawSelected() + { + selectedResultsListBox.Items.Clear(); + foreach (var item in GetSelectedItems()) + { + selectedResultsListBox.Items.Add(item.Name); + } + } + + void unlockButton_Click(object sender, EventArgs e) + { + if (!unlocked) + { + //if (!User.CurrentUser.IsMemberOf(RequiredGroupMembership)) + //{ + // if ((new LoginDlg(RequiredGroupMembership)).ShowDialog() != DialogResult.OK) return; + //} + + unlocked = true; + + /// + /// Unlock user interface controls + /// + unlockButton.Enabled = false; + okButton.Text = Strings.OkBtnText; + cancelButton.Visible = true; + availableResultsListBox.Enabled = true; + selectedResultsListBox.Enabled = true; + addButton.Enabled = true; + removeButton.Enabled = true; + removeAllButton.Enabled = true; + } + } + + void okButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.OK; + Close(); + } + + void availableResultsListBox_DoubleClick(object sender, EventArgs e) + { + /// Double click works when just one item is selected + IList itemsToRemove = new List(); + if (availableResultsListBox.SelectedIndices.Count == 1) + { + var item = currentlyAvailableItems[availableResultsListBox.SelectedIndices[0]]; + GetSelectedItems().Add(item); + RedrawAvailable(); + RedrawSelected(); + } + } + + void addButton_Click(object sender, EventArgs e) + { + /// Append at the end, this code supports multiple selected items, + /// although ListBox control settings may limit the max.number of selected items to one. + + for (int i = availableResultsListBox.SelectedIndices.Count - 1; i >= 0; i--) + { + var item = currentlyAvailableItems[availableResultsListBox.SelectedIndices[i]]; + GetSelectedItems().Add(item); + } + RedrawAvailable(); + RedrawSelected(); + } + + private void selectedResultsListBox_DoubleClick(object sender, EventArgs e) + { + /// Double click works when just one item is selected + + if (selectedResultsListBox.SelectedIndices.Count == 1) + { + GetSelectedItems().RemoveAt(selectedResultsListBox.SelectedIndices[0]); + RedrawAvailable(); + RedrawSelected(); + } + } + + void removeButton_Click(object sender, EventArgs e) + { + /// Remove from the list (the last selected item first so that the indexes are not affected) + + for (int i = selectedResultsListBox.SelectedIndices.Count - 1; i >= 0; i--) + { + GetSelectedItems().RemoveAt(selectedResultsListBox.SelectedIndices[i]); + } + RedrawAvailable(); + RedrawSelected(); + } + + void removeAllButton_Click(object sender, EventArgs e) + { + /// Remove all items from 'Selected' list + + GetSelectedItems().Clear(); + RedrawAvailable(); + RedrawSelected(); + } + + private void singleRadioButton_CheckedChanged(object sender, EventArgs e) + { + } + + private void combinedRadioButton_CheckedChanged(object sender, EventArgs e) + { + combined = combinedRadioButton.Checked; + RedrawAvailable(); + RedrawSelected(); + } + } +} diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Forms/ResultsConfig.resx b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/ResultsConfig.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/ResultsConfig.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Forms/StatisticsDlg.Designer.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/StatisticsDlg.Designer.cs new file mode 100644 index 00000000..1ed00193 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/StatisticsDlg.Designer.cs @@ -0,0 +1,155 @@ +namespace ResultsBrowser.Forms +{ + partial class StatisticsDlg + { + /// + /// 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() + { + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.statisticsListView = new System.Windows.Forms.ListView(); + this.splitContainer2 = new System.Windows.Forms.SplitContainer(); + this.printButton = new System.Windows.Forms.Button(); + this.closeButton = new System.Windows.Forms.Button(); + this.exportButton = new System.Windows.Forms.Button(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).BeginInit(); + this.splitContainer2.Panel2.SuspendLayout(); + this.splitContainer2.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.statisticsListView); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.splitContainer2); + this.splitContainer1.Size = new System.Drawing.Size(572, 409); + this.splitContainer1.SplitterDistance = 320; + this.splitContainer1.TabIndex = 0; + // + // statisticsListView + // + this.statisticsListView.Dock = System.Windows.Forms.DockStyle.Fill; + this.statisticsListView.GridLines = true; + this.statisticsListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.statisticsListView.Location = new System.Drawing.Point(0, 0); + this.statisticsListView.Name = "statisticsListView"; + this.statisticsListView.Size = new System.Drawing.Size(572, 320); + this.statisticsListView.TabIndex = 0; + this.statisticsListView.UseCompatibleStateImageBehavior = false; + // + // splitContainer2 + // + this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer2.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.splitContainer2.Location = new System.Drawing.Point(0, 0); + this.splitContainer2.Name = "splitContainer2"; + // + // splitContainer2.Panel2 + // + this.splitContainer2.Panel2.Controls.Add(this.exportButton); + this.splitContainer2.Panel2.Controls.Add(this.printButton); + this.splitContainer2.Panel2.Controls.Add(this.closeButton); + this.splitContainer2.Size = new System.Drawing.Size(572, 85); + this.splitContainer2.SplitterDistance = 249; + this.splitContainer2.TabIndex = 0; + // + // printButton + // + this.printButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.printButton.Location = new System.Drawing.Point(4, 21); + this.printButton.Name = "printButton"; + this.printButton.Size = new System.Drawing.Size(94, 41); + this.printButton.TabIndex = 0; + this.printButton.Text = "Print"; + this.printButton.UseVisualStyleBackColor = true; + this.printButton.Click += new System.EventHandler(this.printButton_Click); + // + // closeButton + // + this.closeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.closeButton.Location = new System.Drawing.Point(203, 21); + this.closeButton.Name = "closeButton"; + this.closeButton.Size = new System.Drawing.Size(94, 41); + this.closeButton.TabIndex = 2; + this.closeButton.Text = "Close"; + this.closeButton.UseVisualStyleBackColor = true; + this.closeButton.Click += new System.EventHandler(this.closeButton_Click); + // + // exportButton + // + this.exportButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.exportButton.Location = new System.Drawing.Point(103, 21); + this.exportButton.Name = "exportButton"; + this.exportButton.Size = new System.Drawing.Size(94, 41); + this.exportButton.TabIndex = 1; + this.exportButton.Text = "Export"; + this.exportButton.UseVisualStyleBackColor = true; + this.exportButton.Click += new System.EventHandler(this.exportButton_Click); + // + // StatisticsDlg + // + this.AcceptButton = this.closeButton; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(572, 409); + this.Controls.Add(this.splitContainer1); + this.Name = "StatisticsDlg"; + this.Text = "StatisticsDlg"; + this.Load += new System.EventHandler(this.StatisticsDlg_Load); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + this.splitContainer2.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).EndInit(); + this.splitContainer2.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.ListView statisticsListView; + private System.Windows.Forms.SplitContainer splitContainer2; + private System.Windows.Forms.Button closeButton; + private System.Windows.Forms.Button printButton; + private System.Windows.Forms.Button exportButton; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Forms/StatisticsDlg.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/StatisticsDlg.cs new file mode 100644 index 00000000..272e1c8b --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/StatisticsDlg.cs @@ -0,0 +1,272 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using Results.Entities; +using ResultsBrowser.Resources; +using ResultsBrowser.Output.Printers.Statistics; +using System.IO; + +namespace ResultsBrowser.Forms +{ + public partial class StatisticsDlg : Form + { + IList waterMeters; + + bool twoDim; + + Results.WMeterRsltItemSpec rowItem; + Results.WMeterRsltItemSpec rowItem2; + Results.WMeterRsltItemSpec rowItem3; + Results.WMeterRsltItemSpec columnItem; + Results.WMeterRsltItemSpec columnItem2; + Results.WMeterRsltItemSpec columnItem3; + + string rowTestSpec; + string rowTestSpec2; + string rowTestSpec3; + string columnTestSpec; + string columnTestSpec2; + string columnTestSpec3; + + IList rowValues; + IList columnValues; + + int[,] occurances; + + string title; + + + public StatisticsDlg(IList waterMeters, bool twoDim, + Results.WMeterRsltItemSpec rowItem, + Results.WMeterRsltItemSpec rowItem2, + Results.WMeterRsltItemSpec rowItem3, + Results.WMeterRsltItemSpec columnItem, + Results.WMeterRsltItemSpec columnItem2, + Results.WMeterRsltItemSpec columnItem3, + string rowTestSpec, + string rowTestSpec2, + string rowTestSpec3, + string columnTestSpec, + string columnTestSpec2, + string columnTestSpec3, + DateTime startDate, DateTime endDate) + { + InitializeComponent(); + + if (!string.IsNullOrEmpty(Program.LocalSettings.TimePeriodFormat) && (startDate != new DateTime(0)) && (endDate != new DateTime(0))) + { + title = string.Format(Program.LocalSettings.TimePeriodFormat, startDate, endDate); + } + else + { + title = Strings.Statistics; + } + + Text = title; + + closeButton.Text = Strings.OkBtnText; + printButton.Text = Strings.Print; + + this.waterMeters = waterMeters; + + this.twoDim = twoDim; + + this.rowItem = rowItem; + this.rowItem2 = rowItem2; + this.rowItem3 = rowItem3; + + this.columnItem = columnItem; + this.columnItem2 = columnItem2; + this.columnItem3 = columnItem3; + + this.rowTestSpec = rowTestSpec; + this.rowTestSpec2 = rowTestSpec2; + this.rowTestSpec3 = rowTestSpec3; + + this.columnTestSpec = columnTestSpec; + this.columnTestSpec2 = columnTestSpec2; + this.columnTestSpec3 = columnTestSpec3; + } + + private void StatisticsDlg_Load(object sender, EventArgs e) + { + Calculate(); + } + + bool Calculate() + { + try + { + rowValues = new List(); + columnValues = new List(); + + /// + /// Find discrete values of rows and columns + /// + foreach (var wm in waterMeters) + { + string value = rowItem.Print(wm); + if (rowItem2 != null) value = value + " | " + rowItem2.Print(wm); + if (rowItem3 != null) value = value + " | " + rowItem3.Print(wm); + if (!rowValues.Contains(value)) rowValues.Add(value); + + if (twoDim) + { + value = columnItem.Print(wm); + if (columnItem2 != null) value = value + " | " + columnItem2.Print(wm); + if (columnItem3 != null) value = value + " | " + columnItem3.Print(wm); + if (!columnValues.Contains(value)) columnValues.Add(value); + } + } + + /// + /// Calculate occurances + /// + int columnsCount = Math.Max(1, columnValues.Count); + occurances = new int[rowValues.Count, columnsCount]; + + foreach (var wm in waterMeters) + { + for (int row = 0; row < rowValues.Count; row++) + { + string rowValue = rowItem.Print(wm); + if (rowItem2 != null) rowValue = rowValue + " | " + rowItem2.Print(wm); + if (rowItem3 != null) rowValue = rowValue + " | " + rowItem3.Print(wm); + + if (twoDim) + { + for (int column = 0; column < columnsCount; column++) + { + string columnValue = columnItem.Print(wm); + if (columnItem2 != null) columnValue = columnValue + " | " + columnItem2.Print(wm); + if (columnItem3 != null) columnValue = columnValue + " | " + columnItem3.Print(wm); + + if (rowValue == rowValues[row] && columnValue == columnValues[column]) + { + occurances[row, column]++; + } + } + } + else + { + if (rowValue == rowValues[row]) occurances[row, 0]++; + } + } + } + + /// + /// Update ListBox + /// + statisticsListView.View = View.Details; + statisticsListView.GridLines = true; + statisticsListView.FullRowSelect = true; + + statisticsListView.Columns.Add(" ", 200); + for (int column = 0; column < columnsCount; column++) + { + statisticsListView.Columns.Add((twoDim ? columnValues[column] : Strings.Count), 70); + } + + for (int row = 0; row < rowValues.Count; row++) + { + ListViewItem lvi = new ListViewItem(rowValues[row]); + for (int column = 0; column < columnsCount; column++) lvi.SubItems.Add(occurances[row, column].ToString()); + statisticsListView.Items.Add(lvi); + } + + return true; + } + catch (Exception exc) + { + MessageBox.Show(exc.Message, Strings.Error, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + return false; + } + } + + private void closeButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.OK; + Close(); + } + + private void printButton_Click(object sender, EventArgs e) + { + int columnsCount = Math.Max(1, columnValues.Count); + string[,] table = new string[rowValues.Count + 1, columnsCount + 1]; + + table[0, 0] = string.Empty; + for (int column = 0; column < columnsCount; column++) + { + table[0, column + 1] = (twoDim ? columnValues[column] : Strings.Count); + } + + for (int row = 0; row < rowValues.Count; row++) + { + table[row + 1, 0] = rowValues[row]; + for (int column = 0; column < columnsCount; column++) table[row + 1, column + 1] = occurances[row, column].ToString(); + } + + switch (MessageBox.Show(Strings.Yes_Portrait_No_Landscape, Strings.Page_orientation, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question)) + { + case DialogResult.Yes: + new StatisticsPrintDocument(title, table, Config.Entities.PageOrientation.Portrait).Print(); + break; + case DialogResult.No: + new StatisticsPrintDocument(title, table, Config.Entities.PageOrientation.Landscape).Print(); + break; + default: + break; + } + } + + private void exportButton_Click(object sender, EventArgs e) + { + if (rowValues == null || columnValues == null || occurances == null) return; + + SaveFileDialog dlg = new SaveFileDialog(); + dlg.Filter = "CSV files (*.csv)|*.csv|All files (*.*)|*.*"; + + if (dlg.ShowDialog() == DialogResult.OK) + { + //IList items = currentQR.ProjectedItems; + + try + { + using (TextWriter writer = new StreamWriter(dlg.FileName, false, System.Text.Encoding.UTF8)) + { + if (twoDim) + { + /// Write column headers + for (int i = 0; i < columnValues.Count; i++) + { + writer.Write(string.Format(";\"{0}\"", columnValues[i])); + } + writer.WriteLine(); + } + else + { + writer.WriteLine(string.Format("\"{0}\";\"{1}\"", rowItem.Caption, Strings.Count)); + } + + int nrColumns = Math.Max(1, columnValues.Count); + + /// Write rows, row header first + for (int j = 0; j < rowValues.Count; j++) + { + writer.Write(string.Format("\"{0}\"", rowValues[j])); + for (int i = 0; i < nrColumns; i++) + { + writer.Write(string.Format(";{0}", occurances[j,i])); + } + writer.WriteLine(); + } + } + } + catch (Exception exc) + { + MessageBox.Show(exc.Message, Strings.Error_exporting_results, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + } + } + } + } +} diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Forms/StatisticsDlg.resx b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/StatisticsDlg.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/StatisticsDlg.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Forms/StatisticsOptionsDlg.Designer.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/StatisticsOptionsDlg.Designer.cs new file mode 100644 index 00000000..a6b19e50 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/StatisticsOptionsDlg.Designer.cs @@ -0,0 +1,321 @@ +namespace ResultsBrowser.Forms +{ + partial class StatisticsOptionsDlg + { + /// + /// 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() + { + this.cancelButton = new System.Windows.Forms.Button(); + this.okButton = new System.Windows.Forms.Button(); + this.rowsGroupBox = new System.Windows.Forms.GroupBox(); + this.rowTestSpecTextBox2 = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.rowsComboBox2 = new System.Windows.Forms.ComboBox(); + this.rowTestSpecTextBox = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.rowsComboBox = new System.Windows.Forms.ComboBox(); + this.columnsGroupBox = new System.Windows.Forms.GroupBox(); + this.columnTestSpecTextBox2 = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.columnsComboBox2 = new System.Windows.Forms.ComboBox(); + this.columnTestSpecTextBox = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.columnsComboBox = new System.Windows.Forms.ComboBox(); + this.twoDimCheckBox = new System.Windows.Forms.CheckBox(); + this.rowTestSpecTextBox3 = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.rowsComboBox3 = new System.Windows.Forms.ComboBox(); + this.columnTestSpecTextBox3 = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.columnsComboBox3 = new System.Windows.Forms.ComboBox(); + this.rowsGroupBox.SuspendLayout(); + this.columnsGroupBox.SuspendLayout(); + this.SuspendLayout(); + // + // cancelButton + // + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cancelButton.Location = new System.Drawing.Point(368, 294); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(95, 38); + this.cancelButton.TabIndex = 9; + this.cancelButton.Text = "Cancel"; + this.cancelButton.UseVisualStyleBackColor = true; + this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click); + // + // okButton + // + this.okButton.Location = new System.Drawing.Point(257, 294); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(95, 38); + this.okButton.TabIndex = 8; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // rowsGroupBox + // + this.rowsGroupBox.Controls.Add(this.rowTestSpecTextBox3); + this.rowsGroupBox.Controls.Add(this.label5); + this.rowsGroupBox.Controls.Add(this.rowsComboBox3); + this.rowsGroupBox.Controls.Add(this.rowTestSpecTextBox2); + this.rowsGroupBox.Controls.Add(this.label4); + this.rowsGroupBox.Controls.Add(this.rowsComboBox2); + this.rowsGroupBox.Controls.Add(this.rowTestSpecTextBox); + this.rowsGroupBox.Controls.Add(this.label1); + this.rowsGroupBox.Controls.Add(this.rowsComboBox); + this.rowsGroupBox.Location = new System.Drawing.Point(38, 50); + this.rowsGroupBox.Name = "rowsGroupBox"; + this.rowsGroupBox.Size = new System.Drawing.Size(427, 112); + this.rowsGroupBox.TabIndex = 10; + this.rowsGroupBox.TabStop = false; + this.rowsGroupBox.Text = "Rows"; + // + // rowTestSpecTextBox2 + // + this.rowTestSpecTextBox2.Location = new System.Drawing.Point(326, 52); + this.rowTestSpecTextBox2.Name = "rowTestSpecTextBox2"; + this.rowTestSpecTextBox2.Size = new System.Drawing.Size(61, 20); + this.rowTestSpecTextBox2.TabIndex = 5; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(242, 55); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(35, 13); + this.label4.TabIndex = 4; + this.label4.Text = "label4"; + // + // rowsComboBox2 + // + this.rowsComboBox2.FormattingEnabled = true; + this.rowsComboBox2.Location = new System.Drawing.Point(32, 52); + this.rowsComboBox2.Name = "rowsComboBox2"; + this.rowsComboBox2.Size = new System.Drawing.Size(185, 21); + this.rowsComboBox2.TabIndex = 3; + // + // rowTestSpecTextBox + // + this.rowTestSpecTextBox.Location = new System.Drawing.Point(326, 24); + this.rowTestSpecTextBox.Name = "rowTestSpecTextBox"; + this.rowTestSpecTextBox.Size = new System.Drawing.Size(61, 20); + this.rowTestSpecTextBox.TabIndex = 2; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(242, 27); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(35, 13); + this.label1.TabIndex = 1; + this.label1.Text = "label1"; + // + // rowsComboBox + // + this.rowsComboBox.FormattingEnabled = true; + this.rowsComboBox.Location = new System.Drawing.Point(32, 24); + this.rowsComboBox.Name = "rowsComboBox"; + this.rowsComboBox.Size = new System.Drawing.Size(185, 21); + this.rowsComboBox.TabIndex = 0; + // + // columnsGroupBox + // + this.columnsGroupBox.Controls.Add(this.columnTestSpecTextBox3); + this.columnsGroupBox.Controls.Add(this.label6); + this.columnsGroupBox.Controls.Add(this.columnsComboBox3); + this.columnsGroupBox.Controls.Add(this.columnTestSpecTextBox2); + this.columnsGroupBox.Controls.Add(this.label3); + this.columnsGroupBox.Controls.Add(this.columnsComboBox2); + this.columnsGroupBox.Controls.Add(this.columnTestSpecTextBox); + this.columnsGroupBox.Controls.Add(this.label2); + this.columnsGroupBox.Controls.Add(this.columnsComboBox); + this.columnsGroupBox.Location = new System.Drawing.Point(38, 175); + this.columnsGroupBox.Name = "columnsGroupBox"; + this.columnsGroupBox.Size = new System.Drawing.Size(427, 112); + this.columnsGroupBox.TabIndex = 11; + this.columnsGroupBox.TabStop = false; + this.columnsGroupBox.Text = "Columns"; + // + // columnTestSpecTextBox2 + // + this.columnTestSpecTextBox2.Location = new System.Drawing.Point(326, 51); + this.columnTestSpecTextBox2.Name = "columnTestSpecTextBox2"; + this.columnTestSpecTextBox2.Size = new System.Drawing.Size(61, 20); + this.columnTestSpecTextBox2.TabIndex = 6; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(242, 54); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(35, 13); + this.label3.TabIndex = 5; + this.label3.Text = "label3"; + // + // columnsComboBox2 + // + this.columnsComboBox2.FormattingEnabled = true; + this.columnsComboBox2.Location = new System.Drawing.Point(32, 51); + this.columnsComboBox2.Name = "columnsComboBox2"; + this.columnsComboBox2.Size = new System.Drawing.Size(185, 21); + this.columnsComboBox2.TabIndex = 4; + // + // columnTestSpecTextBox + // + this.columnTestSpecTextBox.Location = new System.Drawing.Point(326, 23); + this.columnTestSpecTextBox.Name = "columnTestSpecTextBox"; + this.columnTestSpecTextBox.Size = new System.Drawing.Size(61, 20); + this.columnTestSpecTextBox.TabIndex = 3; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(242, 26); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(35, 13); + this.label2.TabIndex = 2; + this.label2.Text = "label2"; + // + // columnsComboBox + // + this.columnsComboBox.FormattingEnabled = true; + this.columnsComboBox.Location = new System.Drawing.Point(32, 23); + this.columnsComboBox.Name = "columnsComboBox"; + this.columnsComboBox.Size = new System.Drawing.Size(185, 21); + this.columnsComboBox.TabIndex = 1; + // + // twoDimCheckBox + // + this.twoDimCheckBox.AutoSize = true; + this.twoDimCheckBox.Location = new System.Drawing.Point(39, 21); + this.twoDimCheckBox.Name = "twoDimCheckBox"; + this.twoDimCheckBox.Size = new System.Drawing.Size(40, 17); + this.twoDimCheckBox.TabIndex = 12; + this.twoDimCheckBox.Text = "2D"; + this.twoDimCheckBox.UseVisualStyleBackColor = true; + this.twoDimCheckBox.CheckedChanged += new System.EventHandler(this.twoDimCheckBox_CheckedChanged); + // + // rowTestSpecTextBox3 + // + this.rowTestSpecTextBox3.Location = new System.Drawing.Point(326, 80); + this.rowTestSpecTextBox3.Name = "rowTestSpecTextBox3"; + this.rowTestSpecTextBox3.Size = new System.Drawing.Size(61, 20); + this.rowTestSpecTextBox3.TabIndex = 8; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(242, 83); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(35, 13); + this.label5.TabIndex = 7; + this.label5.Text = "label5"; + // + // rowsComboBox3 + // + this.rowsComboBox3.FormattingEnabled = true; + this.rowsComboBox3.Location = new System.Drawing.Point(32, 80); + this.rowsComboBox3.Name = "rowsComboBox3"; + this.rowsComboBox3.Size = new System.Drawing.Size(185, 21); + this.rowsComboBox3.TabIndex = 6; + // + // columnTestSpecTextBox3 + // + this.columnTestSpecTextBox3.Location = new System.Drawing.Point(326, 79); + this.columnTestSpecTextBox3.Name = "columnTestSpecTextBox3"; + this.columnTestSpecTextBox3.Size = new System.Drawing.Size(61, 20); + this.columnTestSpecTextBox3.TabIndex = 9; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(242, 82); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(35, 13); + this.label6.TabIndex = 8; + this.label6.Text = "label6"; + // + // columnsComboBox3 + // + this.columnsComboBox3.FormattingEnabled = true; + this.columnsComboBox3.Location = new System.Drawing.Point(32, 79); + this.columnsComboBox3.Name = "columnsComboBox3"; + this.columnsComboBox3.Size = new System.Drawing.Size(185, 21); + this.columnsComboBox3.TabIndex = 7; + // + // StatisticsOptionsDlg + // + this.AcceptButton = this.okButton; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cancelButton; + this.ClientSize = new System.Drawing.Size(503, 355); + this.Controls.Add(this.columnsGroupBox); + this.Controls.Add(this.twoDimCheckBox); + this.Controls.Add(this.rowsGroupBox); + this.Controls.Add(this.cancelButton); + this.Controls.Add(this.okButton); + this.Name = "StatisticsOptionsDlg"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "StatisticsOptionsDlg"; + this.Load += new System.EventHandler(this.StatisticsOptionsDlg_Load); + this.rowsGroupBox.ResumeLayout(false); + this.rowsGroupBox.PerformLayout(); + this.columnsGroupBox.ResumeLayout(false); + this.columnsGroupBox.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.GroupBox rowsGroupBox; + private System.Windows.Forms.ComboBox rowsComboBox; + private System.Windows.Forms.GroupBox columnsGroupBox; + private System.Windows.Forms.ComboBox columnsComboBox; + private System.Windows.Forms.CheckBox twoDimCheckBox; + private System.Windows.Forms.TextBox rowTestSpecTextBox; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox columnTestSpecTextBox; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox columnTestSpecTextBox2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.ComboBox columnsComboBox2; + private System.Windows.Forms.TextBox rowTestSpecTextBox2; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.ComboBox rowsComboBox2; + private System.Windows.Forms.TextBox rowTestSpecTextBox3; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.ComboBox rowsComboBox3; + private System.Windows.Forms.TextBox columnTestSpecTextBox3; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.ComboBox columnsComboBox3; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Forms/StatisticsOptionsDlg.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/StatisticsOptionsDlg.cs new file mode 100644 index 00000000..40094367 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/StatisticsOptionsDlg.cs @@ -0,0 +1,157 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using ResultsBrowser.Resources; + +namespace ResultsBrowser.Forms +{ + public partial class StatisticsOptionsDlg : Form + { + IList items; + + public bool TwoDim; + public Results.WMeterRsltItemSpec RowItem; + public Results.WMeterRsltItemSpec RowItem2; + public Results.WMeterRsltItemSpec RowItem3; + public Results.WMeterRsltItemSpec ColumnItem; + public Results.WMeterRsltItemSpec ColumnItem2; + public Results.WMeterRsltItemSpec ColumnItem3; + public string RowTestSpecifier; + public string RowTestSpecifier2; + public string RowTestSpecifier3; + public string ColumnTestSpecifier; + public string ColumnTestSpecifier2; + public string ColumnTestSpecifier3; + + + public StatisticsOptionsDlg(IList items) + { + InitializeComponent(); + this.items = items; + } + + private void StatisticsOptionsDlg_Load(object sender, EventArgs e) + { + Localize(); + + columnsGroupBox.Enabled = twoDimCheckBox.Checked = TwoDim = Program.LocalSettings.TwoDim; + + foreach (var item in items) + { + rowsComboBox.Items.Add(item.Caption); + rowsComboBox2.Items.Add(item.Caption); + rowsComboBox3.Items.Add(item.Caption); + columnsComboBox.Items.Add(item.Caption); + columnsComboBox2.Items.Add(item.Caption); + columnsComboBox3.Items.Add(item.Caption); + } + /// + rowsComboBox.Text = (!string.IsNullOrEmpty(Program.LocalSettings.RowItemCaption) && rowsComboBox.Items.Contains(Program.LocalSettings.RowItemCaption)) + ? Program.LocalSettings.RowItemCaption + : string.Empty; + rowsComboBox2.Text = (!string.IsNullOrEmpty(Program.LocalSettings.RowItemCaption2) && rowsComboBox2.Items.Contains(Program.LocalSettings.RowItemCaption2)) + ? Program.LocalSettings.RowItemCaption2 + : string.Empty; + rowsComboBox3.Text = (!string.IsNullOrEmpty(Program.LocalSettings.RowItemCaption3) && rowsComboBox3.Items.Contains(Program.LocalSettings.RowItemCaption3)) + ? Program.LocalSettings.RowItemCaption3 + : string.Empty; + columnsComboBox.Text = (!string.IsNullOrEmpty(Program.LocalSettings.ColumnItemCaption) && columnsComboBox.Items.Contains(Program.LocalSettings.ColumnItemCaption)) + ? Program.LocalSettings.ColumnItemCaption + : string.Empty; + columnsComboBox2.Text = (!string.IsNullOrEmpty(Program.LocalSettings.ColumnItemCaption2) && columnsComboBox2.Items.Contains(Program.LocalSettings.ColumnItemCaption2)) + ? Program.LocalSettings.ColumnItemCaption2 + : string.Empty; + columnsComboBox3.Text = (!string.IsNullOrEmpty(Program.LocalSettings.ColumnItemCaption3) && columnsComboBox3.Items.Contains(Program.LocalSettings.ColumnItemCaption3)) + ? Program.LocalSettings.ColumnItemCaption3 + : string.Empty; + + rowTestSpecTextBox.Text = RowTestSpecifier = string.IsNullOrEmpty(Program.LocalSettings.RowTestSpecifier) ? string.Empty : Program.LocalSettings.RowTestSpecifier; + rowTestSpecTextBox2.Text = RowTestSpecifier2 = string.IsNullOrEmpty(Program.LocalSettings.RowTestSpecifier2) ? string.Empty : Program.LocalSettings.RowTestSpecifier2; + rowTestSpecTextBox3.Text = RowTestSpecifier3 = string.IsNullOrEmpty(Program.LocalSettings.RowTestSpecifier3) ? string.Empty : Program.LocalSettings.RowTestSpecifier3; + columnTestSpecTextBox.Text = ColumnTestSpecifier = string.IsNullOrEmpty(Program.LocalSettings.ColumnTestSpecifier) ? string.Empty : Program.LocalSettings.ColumnTestSpecifier; + columnTestSpecTextBox2.Text = ColumnTestSpecifier2 = string.IsNullOrEmpty(Program.LocalSettings.ColumnTestSpecifier2) ? string.Empty : Program.LocalSettings.ColumnTestSpecifier2; + columnTestSpecTextBox3.Text = ColumnTestSpecifier3 = string.IsNullOrEmpty(Program.LocalSettings.ColumnTestSpecifier3) ? string.Empty : Program.LocalSettings.ColumnTestSpecifier3; + } + + void Localize() + { + Text = Strings.Statistics; + okButton.Text = Strings.OkBtnText; + cancelButton.Text = Strings.CancelBtnText; + rowsGroupBox.Text = Strings.Rows; + columnsGroupBox.Text = Strings.Columns; + label1.Text = Strings.Test; + label2.Text = Strings.Test; + label3.Text = Strings.Test; + label4.Text = Strings.Test; + label5.Text = Strings.Test; + label6.Text = Strings.Test; + } + + private void twoDimCheckBox_CheckedChanged(object sender, EventArgs e) + { + columnsGroupBox.Enabled = twoDimCheckBox.Checked; + } + + private void okButton_Click(object sender, EventArgs e) + { + TwoDim = twoDimCheckBox.Checked; + + RowTestSpecifier = rowTestSpecTextBox.Text; + RowTestSpecifier2 = rowTestSpecTextBox2.Text; + RowTestSpecifier3 = rowTestSpecTextBox3.Text; + ColumnTestSpecifier = columnTestSpecTextBox.Text; + ColumnTestSpecifier2 = columnTestSpecTextBox2.Text; + ColumnTestSpecifier3 = columnTestSpecTextBox3.Text; + + RowItem = null; + RowItem2 = null; + RowItem3 = null; + ColumnItem = null; + ColumnItem2 = null; + ColumnItem3 = null; + + foreach (var item in items) + { + if (!string.IsNullOrEmpty(rowsComboBox.Text) && rowsComboBox.Text.Equals(item.Caption)) RowItem = item; + if (!string.IsNullOrEmpty(rowsComboBox2.Text) && rowsComboBox2.Text.Equals(item.Caption)) RowItem2 = item; + if (!string.IsNullOrEmpty(rowsComboBox3.Text) && rowsComboBox3.Text.Equals(item.Caption)) RowItem3 = item; + if (!string.IsNullOrEmpty(columnsComboBox.Text) && TwoDim && columnsComboBox.Text.Equals(item.Caption)) ColumnItem = item; + if (!string.IsNullOrEmpty(columnsComboBox2.Text) && TwoDim && columnsComboBox2.Text.Equals(item.Caption)) ColumnItem2 = item; + if (!string.IsNullOrEmpty(columnsComboBox3.Text) && TwoDim && columnsComboBox3.Text.Equals(item.Caption)) ColumnItem3 = item; + } + + + if (RowItem == null || (TwoDim && ColumnItem == null)) + { + MessageBox.Show(Strings.Error, Strings.Error, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + DialogResult = DialogResult.Cancel; + Close(); + return; + } + + Program.LocalSettings.TwoDim = TwoDim; + Program.LocalSettings.RowItemCaption = RowItem.Caption; + Program.LocalSettings.RowItemCaption2 = (RowItem2 != null) ? RowItem2.Caption : string.Empty; + Program.LocalSettings.RowItemCaption3 = (RowItem3 != null) ? RowItem3.Caption : string.Empty; + Program.LocalSettings.ColumnItemCaption = (ColumnItem != null) ? ColumnItem.Caption : string.Empty; + Program.LocalSettings.ColumnItemCaption2 = (ColumnItem2 != null) ? ColumnItem2.Caption : string.Empty; + Program.LocalSettings.ColumnItemCaption3 = (ColumnItem3 != null) ? ColumnItem3.Caption : string.Empty; + Program.LocalSettings.RowTestSpecifier = RowTestSpecifier; + Program.LocalSettings.RowTestSpecifier2 = RowTestSpecifier2; + Program.LocalSettings.RowTestSpecifier3 = RowTestSpecifier3; + Program.LocalSettings.ColumnTestSpecifier = ColumnTestSpecifier; + Program.LocalSettings.ColumnTestSpecifier2 = ColumnTestSpecifier2; + Program.LocalSettings.ColumnTestSpecifier3 = ColumnTestSpecifier3; + Program.LocalSettings.Save(); + + DialogResult = DialogResult.OK; + Close(); + } + + private void cancelButton_Click(object sender, EventArgs e) + { + + } + } +} diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Forms/StatisticsOptionsDlg.resx b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/StatisticsOptionsDlg.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Forms/StatisticsOptionsDlg.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/LocalSettings.cs b/TBF_V2/Sources/TBF/ResultsBrowser/LocalSettings.cs new file mode 100644 index 00000000..c30bd914 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/LocalSettings.cs @@ -0,0 +1,197 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; + +namespace ResultsBrowser +{ + /// + /// Class to be serialized to an XML file... + /// Public members are local settings. + /// These settings are modified by dialogs invoked by menu items + /// Edit->Preferences ... PreferencesDlg ... S1.1(language, etc. local settings), and + /// Edit->Advanced settings ... AdvancedSettingsDlg ... S1.2(spec. where bench settings are stored) + /// + [XmlRootAttribute("ResultsBrowser")] + public class LocalSettings + { + /// + /// User interface language (used as CultureInfo(..) constructor argument). + /// + public string Language; + + /// Names of servers. + public string Bench1; + public string Bench2; + public string Bench3; + public string Bench4; + public string Bench5; + + /// Database settings of servers. + public string ConnectionString1; + public string ConnectionString2; + public string ConnectionString3; + public string ConnectionString4; + public string ConnectionString5; + + public bool Bench1Selected; + public bool Bench2Selected; + public bool Bench3Selected; + public bool Bench4Selected; + public bool Bench5Selected; + + public string TimePeriodFormat; + + /// Statistics options + public bool TwoDim; + public string RowItemCaption; + public string RowItemCaption2; + public string RowItemCaption3; + public string ColumnItemCaption; + public string ColumnItemCaption2; + public string ColumnItemCaption3; + public string RowTestSpecifier; + public string RowTestSpecifier2; + public string RowTestSpecifier3; + public string ColumnTestSpecifier; + public string ColumnTestSpecifier2; + public string ColumnTestSpecifier3; + + + public bool FilterPurchaseOrder; + public bool FilterProcedure; + public bool FilterBatchNr; + public bool FilterDate; + public bool ResolveManually; + + /// MainWnd + public int MainWndLeft; + public int MainWndTop; + public int MainWndWidth; + public int MainWndHeight; + public bool ManiWndMaximized; + public int SplitterDistance; + + /// Last configuration file name + public string LastConfigFileName; + + /// Purchase order history + public string LastPurchaseOrder; + public string[] PurchaseOrderHistory; + [XmlIgnore] + public int PurchaseOrderHistoryCount { get { return (PurchaseOrderHistory != null) ? PurchaseOrderHistory.Length : 0; } } + + /// Procedure history + public string LastProcedure; + public string[] ProcedureHistory; + [XmlIgnore] + public int ProcedureHistoryCount { get { return (ProcedureHistory != null) ? ProcedureHistory.Length : 0; } } + + /// BatchNr range + public string BatchFrom; + public string BatchTo; + + /// Report file name history + public string LastReportFileName; + public string[] ReportFileNameHistory; + [XmlIgnore] + public int ReportFileNameHistoryCount { get { return (ReportFileNameHistory != null) ? ReportFileNameHistory.Length : 0; } } + + /// Report configuration + public string[] ReportItems_Single; + public string[] ReportItems_Compound; + + public LocalSettings() + { + } + + /// + /// Load public fields of this class from the XML file. + /// + public static LocalSettings Load(string fileName) + { + try + { + using (TextReader reader = new StreamReader(fileName)) + { + LocalSettings ls = (new XmlSerializer(typeof(LocalSettings))).Deserialize(reader) as LocalSettings; + // Copy the settings just in case De-serialize() completes OK + return ls; + } + } + catch (Exception e) + { + string msg = e.Message; + return null; + } + } + + /// + /// Save public fields of this class to the XML file. + /// + public void Save() + { + try + { + using (TextWriter writer = new StreamWriter(Program.LocalSettingsFileName)) + { + (new XmlSerializer(typeof(LocalSettings))).Serialize(writer, this); + } + } + catch (Exception e) + { + string msg = e.Message; + } + } + + /// + /// Updates history stored in a string array by a new latest string. + /// + /// Lste entered string + /// true = updated and saved + public bool UpdateHistory(string lastStrValue, ref string[] history, int maxHistoryLen = 10) + { + if (string.IsNullOrEmpty(lastStrValue)) return false; + + int currentHistoryCount = (history != null) ? history.Length : 0; + + int match = -1; + for (int i = 0; i < currentHistoryCount; i++) + { + if (history[i] == lastStrValue) + { + match = i; + break; + } + } + + if (match >= 0 || currentHistoryCount >= maxHistoryLen) + { + /// History does not have to be (because of a match) or should not be extended (because of the lenght) + if (match < 0) match = currentHistoryCount - 1; + + for (int j = match; j > 0; j--) + { + history[j] = history[j - 1]; + } + history[0] = lastStrValue; + } + else + { + /// History wiil be extended, new item inserted at the beginning + string[] newHistory = new string[currentHistoryCount + 1]; + newHistory[0] = lastStrValue; + for (int j = 1; j <= currentHistoryCount; j++) + { + newHistory[j] = history[j - 1]; + } + history = newHistory; + } + Save(); + return true; + } + } +} diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Output/Printers/QueryResults/QueryResultsPrintDocument.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Output/Printers/QueryResults/QueryResultsPrintDocument.cs new file mode 100644 index 00000000..8444b5aa --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Output/Printers/QueryResults/QueryResultsPrintDocument.cs @@ -0,0 +1,386 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Printing; +using Config.Entities; + +namespace ResultsBrowser.Output.Printers.QueryResults +{ + public class QueryResultsPrintDocument : PrintDocument + { + const string FontFamilyName = "Arial"; //"Times New Roman"; + + const int SpacingOne = 18; + const int SpacingOneAndHalf = (3 * SpacingOne) / 2; + const int TitleX = 240; + const int TitleY = 180; /// Depends on the size of the header + const int FirstLineNr = 14; /// Depends on the size of the header + const int Tab1 = 80; /// Positions of columns above the table + const int Tab2 = 240; + const int Tab3 = 430; + const int Tab4 = 590; + const int BorderW = 1; /// Table border line width + const int MarginTop = 7; /// Margins of the text from table lines + const int MarginLeft = 4; /// Margins of the text from table lines + + /// + /// Data to print + /// + readonly string docVersion; + readonly Results.Entities.WaterMeter wm; + string zaehlertyp; + string pruefvorlage; + + readonly IList results; + readonly int resultsCount; + readonly bool compound; /// true when MetersKind is MetersKind.Combined + + readonly int secondTableOffset; /// Calculated in the constructor + + /// Top coordinate of the table + int top; + + /// + /// Property variable for the Font the user wishes to use + /// + Font font; + Font boldFont; + Font fontTitle; + + /// + /// Constructor + /// + /// Text to be printed + public QueryResultsPrintDocument(string docVersion, + Results.Entities.WaterMeter wm, + PageOrientation pageOrientation) + { + this.docVersion = docVersion; + this.wm = wm; + compound = wm.Compound(); + + string[] info = wm.ProductName().Split(new char[] { ';' }); + if (info.Length >= 2) + { + pruefvorlage = info[0]; + zaehlertyp = info[1]; + } + else if (info.Length == 1) + { + pruefvorlage = info[0]; + zaehlertyp = compound ? "Verbundzähler" : "Einzelzähler"; + } + else + { + pruefvorlage = wm.ProcedureName(); + zaehlertyp = compound ? "Verbundzähler" : "Einzelzähler"; + } + + results = wm.MeterTestRslts; + this.resultsCount = compound ? (results.Count / 3) : results.Count; + + int resultsCount = wm.MeterTestRslts.Count; + if (compound) resultsCount /= 3; + + secondTableOffset = (resultsCount + 2) * SpacingOneAndHalf; + + DefaultPageSettings.Landscape = (pageOrientation == PageOrientation.Landscape); + } + + /// + /// Override the default onbeginPrint method of the PrintDocument Object. + /// + /// + /// + protected override void OnBeginPrint(System.Drawing.Printing.PrintEventArgs e) + { + base.OnBeginPrint(e); + + if (font == null) { font = new Font(FontFamilyName, 10, FontStyle.Regular); } + if (boldFont == null) { boldFont = new Font(FontFamilyName, 10, FontStyle.Bold); } + if (fontTitle == null) { fontTitle = new Font(FontFamilyName, 24, FontStyle.Bold); } + } + + /// + /// Override the default OnPrintPage method of the PrintDocument. + /// + /// + /// This provides the print logic for our document + protected override void OnPrintPage(System.Drawing.Printing.PrintPageEventArgs e) + { + // Run base code + base.OnPrintPage(e); + + /// Set print area size and margins (in dots using 80 dpi) + int printHeight = base.DefaultPageSettings.PaperSize.Height - base.DefaultPageSettings.Margins.Top - base.DefaultPageSettings.Margins.Bottom; + int printWidth = base.DefaultPageSettings.PaperSize.Width - base.DefaultPageSettings.Margins.Left - base.DefaultPageSettings.Margins.Right; + int leftMargin = base.DefaultPageSettings.Margins.Left; /// X + int topMargin = base.DefaultPageSettings.Margins.Top; /// Y + + /// Check if the user selected to print in Landscape mode + /// if they did then we need to swap height/width parameters + if (base.DefaultPageSettings.Landscape) + { + int tmp = printHeight; + printHeight = printWidth; + printWidth = tmp; + } + + int x = leftMargin; + int y = topMargin; + + /// Use the StringFormat class for the text layout of our document + StringFormat format = new StringFormat(StringFormatFlags.LineLimit); + + RectangleF printArea = new RectangleF(TitleX, TitleY, 667, 50); + e.Graphics.DrawString(wm.Batch.ProtocolTitle, this.fontTitle, Brushes.Black, printArea); + + int lineNr = FirstLineNr; + PrintAt(e, Tab1, lineNr * SpacingOne, docVersion); + lineNr++; + PrintBoldAt(e, Tab1, lineNr * SpacingOne, "Prüfstand Nr :"); + PrintBoldAt(e, Tab2, lineNr * SpacingOne, wm.BenchId().ToString()); + PrintBoldAt(e, Tab3, lineNr * SpacingOne, "Datum :"); + PrintBoldAt(e, Tab4, lineNr * SpacingOne, wm.Batch.EndTime.Date.ToString("d")); + lineNr++; + PrintAt(e, Tab1, lineNr * SpacingOne, "Zählertyp :"); + PrintAt(e, Tab2, lineNr * SpacingOne, zaehlertyp); + PrintAt(e, Tab3, lineNr * SpacingOne, "Eichjahr :"); + PrintAt(e, Tab4, lineNr * SpacingOne, wm.YearOfProduction.ToString()); + lineNr++; + PrintAt(e, Tab1, lineNr * SpacingOne, "Prüfvorlage :"); + PrintAt(e, Tab2, lineNr * SpacingOne, pruefvorlage); + lineNr += 2; + + if (compound) + { + PrintBoldAt(e, Tab1, lineNr * SpacingOne, "Hauptzahler"); + PrintBoldAt(e, Tab3, lineNr * SpacingOne, "Nebenzahler"); + lineNr++; + } + + PrintAt(e, Tab1, lineNr * SpacingOne, "Hersteller :"); + PrintAt(e, Tab2, lineNr * SpacingOne, wm.Producer()); + if (compound) + { + PrintAt(e, Tab3, lineNr * SpacingOne, "Hersteller :"); + PrintAt(e, Tab4, lineNr * SpacingOne, wm.ProducerAux()); + } + lineNr++; + + PrintAt(e, Tab1, lineNr * SpacingOne, "Seriennummer :"); + PrintAt(e, Tab2, lineNr * SpacingOne, wm.SerialNr); + if (compound) + { + PrintAt(e, Tab3, lineNr * SpacingOne, "Seriennummer :"); + PrintAt(e, Tab4, lineNr * SpacingOne, wm.SerialNrAux); + } + lineNr++; + + PrintAt(e, Tab1, lineNr * SpacingOne, "Qn :"); + PrintAt(e, Tab2, lineNr * SpacingOne, wm.Q3_Qn().ToString()); + if (compound) + { + PrintAt(e, Tab3, lineNr * SpacingOne, "Qn :"); + PrintAt(e, Tab4, lineNr * SpacingOne, wm.Q3_Qn_Aux().ToString()); + } + lineNr++; + + PrintAt(e, Tab1, lineNr * SpacingOne, "Zulassungszeichen :"); + PrintAt(e, Tab2, lineNr * SpacingOne, wm.ApprovalInfo()); + if (compound) + { + PrintAt(e, Tab3, lineNr * SpacingOne, "Zulassungszeichen :"); + PrintAt(e, Tab4, lineNr * SpacingOne, wm.ApprovalInfoAux()); + } + lineNr++; + + PrintAt(e, Tab1, lineNr * SpacingOne, "Metr. klasse :"); + PrintAt(e, Tab2, lineNr * SpacingOne, wm.MetrologicalClass()); + if (compound) + { + PrintAt(e, Tab3, lineNr * SpacingOne, "Metr. klasse :"); + PrintAt(e, Tab4, lineNr * SpacingOne, wm.MetrologicalClassAux()); + } + lineNr++; + + PrintAt(e, Tab1, lineNr * SpacingOne, "Stand :"); + PrintAt(e, Tab2, lineNr * SpacingOne, wm.EndState); + if (compound) + { + PrintAt(e, Tab3, lineNr * SpacingOne, "Stand :"); + PrintAt(e, Tab4, lineNr * SpacingOne, wm.EndStateAux); + + lineNr += 2; + PrintAt(e, Tab1, lineNr * SpacingOne, "Umschaltpunkte :"); + lineNr++; + PrintAt(e, Tab1, lineNr * SpacingOne, "Qsteig"); + PrintAt(e, Tab2, lineNr * SpacingOne, (1000.0 * wm.QRise).ToString("F1") + " l/h"); + lineNr++; + PrintAt(e, Tab1, lineNr * SpacingOne, "Qfall"); + PrintAt(e, Tab2, lineNr * SpacingOne, (1000.0 * wm.QFall).ToString("F1") + " l/h"); + } + + lineNr += 2; + top = SpacingOne * lineNr; + + PrintTable(e); + DrawTable(e); + + lineNr += (secondTableOffset * 2) / SpacingOne; + PrintAt(e, Tab1, lineNr * SpacingOne, "Temperatur"); + PrintAt(e, Tab2, lineNr * SpacingOne, wm.Batch.AmbTempMean().ToString("F1") + " \x00b0C"); + lineNr++; + PrintAt(e, Tab1, lineNr * SpacingOne, "Feuchtigkeit"); + PrintAt(e, Tab2, lineNr * SpacingOne, wm.Batch.AmbHumiMean().ToString("F0") + " %"); + lineNr++; + PrintAt(e, Tab1, lineNr * SpacingOne, "Luftdruck"); + PrintAt(e, Tab2, lineNr * SpacingOne, wm.Batch.AmbPressMean().ToString("F0") + " mbar"); + + lineNr++; + PrintAt(e, Tab3, lineNr * SpacingOne, wm.Batch.EndTime.Date.ToString("d")); + lineNr ++; + PrintAt(e, Tab3, lineNr * SpacingOne, "Datum"); + PrintAt(e, Tab4, lineNr * SpacingOne, "Unterschrift"); + } + + /// + /// Print table texts. + /// + void PrintTable(System.Drawing.Printing.PrintPageEventArgs e) + { + PrintAt(e, FromTest(-1, -1), "Prüflauf"); + PrintAt(e, FromTest(-1, 0), "Q [l/h]"); + PrintAt(e, FromTest(-1, 1), "Prüf-Vol.[l]"); + PrintAt(e, FromTest(-1, 2), compound ? "HZ-Vol.[l]" : "Z-Vol.[l]"); + PrintAt(e, FromTest(-1, 3), compound ? "NZ-Vol.[l]" : "-"); + PrintAt(e, FromTest(-1, 4), "Fehler [%]"); + PrintAt(e, FromTest(-1, 5), "Ergebnis"); + + PrintAt(e, FromTest(-1, 6), "Q [l/h]"); + PrintAt(e, FromTest(-1, 7), "Temperatur"); + PrintAt(e, FromTest(-1, 8), "Dichte"); + PrintAt(e, FromTest(-1, 9), "Prüfzeit"); + PrintAt(e, FromTest(-1, 10), "Druck Eing."); + PrintAt(e, FromTest(-1, 11), "Druck Ausg."); + + int rowCnt = 0; + foreach (var mtr in wm.MeterTestRslts) + { + if (!compound || mtr.CompoundMeterId == (byte)CompoundMeterId.Compound) + { + Point p = FromTest(rowCnt, -1); + PrintAt(e, p.X, p.Y, mtr.Name()); + PrintAt(e, p.X, p.Y + (resultsCount + 2) * SpacingOneAndHalf, mtr.Name()); + + PrintAt(e, FromTest(rowCnt, 0), mtr.TestRslt.FlowMass.ToString("F1")); + PrintAt(e, FromTest(rowCnt, 1), mtr.TestRslt.VolumeCTV.ToString("F2")); + if (compound) + { + Results.Entities.MeterTestRslt mainMtr = wm.GetMeterTestRslt(mtr.Name(), CompoundMeterId.CompoundMain); + Results.Entities.MeterTestRslt auxMtr = wm.GetMeterTestRslt(mtr.Name(), CompoundMeterId.CompoundAux); + + PrintAt(e, FromTest(rowCnt, 2), mainMtr.VolumeMeter.ToString("F2")); + PrintAt(e, FromTest(rowCnt, 3), auxMtr.VolumeMeter.ToString("F2")); + PrintAt(e, FromTest(rowCnt, 4), mtr.Error.ToString("F2")); + PrintAt(e, FromTest(rowCnt, 5), mtr.Passed ? "iO" : "NiO"); + } + else + { + PrintAt(e, FromTest(rowCnt, 2), mtr.VolumeMeter.ToString("F2")); + PrintAt(e, FromTest(rowCnt, 3), "-"); + PrintAt(e, FromTest(rowCnt, 4), mtr.Error.ToString("F2")); + PrintAt(e, FromTest(rowCnt, 5), mtr.Passed ? "iO" : "NiO"); + } + PrintAt(e, FromTest(rowCnt, 6), mtr.TestRslt.FlowMass.ToString("F1")); + PrintAt(e, FromTest(rowCnt, 7), mtr.TestRslt.TempDownMean.ToString("F2")); + PrintAt(e, FromTest(rowCnt, 8), mtr.TestRslt.DensityDiv.ToString("F2")); + PrintAt(e, FromTest(rowCnt, 9), mtr.TestTime.ToString("F1")); + PrintAt(e, FromTest(rowCnt, 10), Config.Units.ConvertTo(Config.Unit.bar, mtr.TestRslt.PressUpMean).ToString("F3")); + PrintAt(e, FromTest(rowCnt, 11), Config.Units.ConvertTo(Config.Unit.bar, mtr.TestRslt.PressDownMean).ToString("F3")); + + rowCnt++; + } + } + } + + /// + /// Draw table lines. + /// + void DrawTable(System.Drawing.Printing.PrintPageEventArgs e) + { + int mid = top + SpacingOneAndHalf; + int bot = top + (resultsCount + 1) * SpacingOneAndHalf; + + int top2 = top + secondTableOffset; + int mid2 = mid + secondTableOffset; + int bot2 = bot + secondTableOffset; + + // Horizontal lines + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(80, top), new Point(747, top)); + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(80, mid), new Point(747, mid)); + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(80, bot), new Point(747, bot)); + + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(80, top2), new Point(747, top2)); + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(80, mid2), new Point(747, mid2)); + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(80, bot2), new Point(747, bot2)); + + // Vertical lines + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point( 80, top), new Point( 80, bot)); + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(267, top), new Point(267, bot)); + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(347, top), new Point(347, bot)); + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(427, top), new Point(427, bot)); + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(507, top), new Point(507, bot)); + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(587, top), new Point(587, bot)); + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(667, top), new Point(667, bot)); + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(747, top), new Point(747, bot)); + + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point( 80, top2), new Point( 80, bot2)); + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(267, top2), new Point(267, bot2)); + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(347, top2), new Point(347, bot2)); + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(427, top2), new Point(427, bot2)); + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(507, top2), new Point(507, bot2)); + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(587, top2), new Point(587, bot2)); + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(667, top2), new Point(667, bot2)); + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point(747, top2), new Point(747, bot2)); + } + + void PrintAt(System.Drawing.Printing.PrintPageEventArgs e, Point p, string text) + { + PrintAt(e, p.X, p.Y, text); + } + + void PrintAt(System.Drawing.Printing.PrintPageEventArgs e, int x, int y, string text) + { + RectangleF printArea = new RectangleF(x, y, 667, SpacingOne); + e.Graphics.DrawString(text, this.font, Brushes.Black, printArea); + } + + void PrintBoldAt(System.Drawing.Printing.PrintPageEventArgs e, Point p, string text) + { + PrintBoldAt(e, p.X, p.Y, text); + } + + void PrintBoldAt(System.Drawing.Printing.PrintPageEventArgs e, int x, int y, string text) + { + RectangleF printArea = new RectangleF(x, y, 667, SpacingOne); + e.Graphics.DrawString(text, this.boldFont, Brushes.Black, printArea); + } + + Point FromTest(int testNr, int parNr) + { + const int NrParamsInOneTableRow = 6; + + int x = 267 + (parNr % NrParamsInOneTableRow) * 80 + MarginLeft; + int y = top + SpacingOneAndHalf + MarginTop + testNr * SpacingOneAndHalf + + ((parNr >= NrParamsInOneTableRow) ? secondTableOffset : 0); + + if (parNr < 0) x = 80 + MarginLeft; /// When parNr == -1 return the left column x coordinate + + return new Point(x, y); + } + } +} diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Output/Printers/Statistics/StatisticsPrintDocument.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Output/Printers/Statistics/StatisticsPrintDocument.cs new file mode 100644 index 00000000..82f252c8 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Output/Printers/Statistics/StatisticsPrintDocument.cs @@ -0,0 +1,183 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Printing; +using Config.Entities; + +namespace ResultsBrowser.Output.Printers.Statistics +{ + public class StatisticsPrintDocument : PrintDocument + { + const string FontFamilyName = "Arial"; //"Times New Roman"; + + const int SpacingOne = 20; + const int BorderW = 1; /// Table border line width + const int TopPadding = 2; /// Margins of the text from table lines + const int LeftPadding = 2; /// Margins of the text from table lines + const int TableTop = 50; + + /// + /// Data to print + /// + string title; + string[,] table; + + /// + /// Property variable for the Font the user wishes to use + /// + Font font; + Font boldFont; + Font fontTitle; + + /// + /// Constructor + /// + /// Text to be printed + public StatisticsPrintDocument(string title, string[,] table, PageOrientation pageOrientation) + { + this.title = title; + this.table = table; + DefaultPageSettings.Landscape = (pageOrientation == PageOrientation.Landscape); + } + + /// + /// Override the default onbeginPrint method of the PrintDocument Object. + /// + /// + /// + protected override void OnBeginPrint(System.Drawing.Printing.PrintEventArgs e) + { + base.OnBeginPrint(e); + + if (font == null) { font = new Font(FontFamilyName, 10, FontStyle.Regular); } + if (boldFont == null) { boldFont = new Font(FontFamilyName, 10, FontStyle.Bold); } + if (fontTitle == null) { fontTitle = new Font(FontFamilyName, 14, FontStyle.Bold); } + } + + /// + /// Override the default OnPrintPage method of the PrintDocument. + /// + /// + /// This provides the print logic for our document + protected override void OnPrintPage(System.Drawing.Printing.PrintPageEventArgs e) + { + // Run base code + base.OnPrintPage(e); + + /// Set print area size and margins (in dots using 80 dpi) + int printHeight = base.DefaultPageSettings.PaperSize.Height - base.DefaultPageSettings.Margins.Top - base.DefaultPageSettings.Margins.Bottom; + int printWidth = base.DefaultPageSettings.PaperSize.Width - base.DefaultPageSettings.Margins.Left - base.DefaultPageSettings.Margins.Right; + int leftMargin = base.DefaultPageSettings.Margins.Left; /// X + int topMargin = base.DefaultPageSettings.Margins.Top; /// Y + + /// Check if the user selected to print in Landscape mode + /// if they did then we need to swap height/width parameters + if (base.DefaultPageSettings.Landscape) + { + int tmp = printHeight; + printHeight = printWidth; + printWidth = tmp; + } + + /// Use the StringFormat class for the text layout of our document + StringFormat format = new StringFormat(StringFormatFlags.LineLimit); + + RectangleF printArea = new RectangleF(leftMargin, topMargin, 667, TableTop); + e.Graphics.DrawString(title, this.fontTitle, Brushes.Black, printArea); + + /// Measure texts + float[] columnWidths = new float[table.GetLength(1)]; + for (int c = 0; c < columnWidths.Length; c++) + { + columnWidths[c] = e.Graphics.MeasureString(table[0, c], font).Width; + for (int r = 1; r < table.GetLength(0); r++) + { + float width = e.Graphics.MeasureString(table[r, c], font).Width; + if (width > columnWidths[c]) columnWidths[c] = width; + } + } + + float[] rowHeights = new float[table.GetLength(0)]; + for (int i = 0; i < rowHeights.Length; i++) rowHeights[i] = SpacingOne; + + float top = (float)(topMargin + TableTop); + + DrawTable(e, leftMargin, top, columnWidths, rowHeights); + + /// Print texts + for (int r = 0; r < table.GetLength(0); r++) + { + float left = leftMargin; + for (int c = 0; c < columnWidths.Length; c++) + { + float textWidth = e.Graphics.MeasureString(table[r, c], font).Width; + float leftOffset = (columnWidths[c] - textWidth) / 2; + PrintAt(e, new Point((int)(left + leftOffset + LeftPadding), (int)top + 2), table[r, c]); + left += columnWidths[c]; + } + + top += rowHeights[r]; + } + } + + /// + /// Draw table lines. + /// + void DrawTable(System.Drawing.Printing.PrintPageEventArgs e, float left, float top, float[] columnWidths, float[] rowHeights) + { + float width = 0; + foreach (var cw in columnWidths) width += cw; + + /// First horizontal line + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point((int)left, (int)top), new Point((int)(left + width), (int)top)); + + float height = 0; + foreach (var rh in rowHeights) + { + height += rh; + + /// Horizontal line + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point((int)left, (int)(top + height)), new Point((int)(left + width), (int)(top + height))); + } + + /// First vertical line + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point((int)left, (int)top), new Point((int)left, (int)(top + height))); + + + width = 0; + foreach (var cw in columnWidths) + { + width += cw; + + /// Vertical line + e.Graphics.DrawLine(new Pen(Color.Black, BorderW), new Point((int)(left + width), (int)top), new Point((int)(left + width), (int)(top + height))); + } + } + + + void PrintAt(System.Drawing.Printing.PrintPageEventArgs e, Point p, string text) + { + PrintAt(e, p.X, p.Y, text); + } + + void PrintAt(System.Drawing.Printing.PrintPageEventArgs e, int x, int y, string text) + { + RectangleF printArea = new RectangleF(x, y, 667, SpacingOne); + e.Graphics.DrawString(text, this.font, Brushes.Black, printArea); + } + + void PrintBoldAt(System.Drawing.Printing.PrintPageEventArgs e, Point p, string text) + { + PrintBoldAt(e, p.X, p.Y, text); + } + + void PrintBoldAt(System.Drawing.Printing.PrintPageEventArgs e, int x, int y, string text) + { + RectangleF printArea = new RectangleF(x, y, 667, SpacingOne); + e.Graphics.DrawString(text, this.boldFont, Brushes.Black, printArea); + } + } +} diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Program.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Program.cs new file mode 100644 index 00000000..8ddd4b7e --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Program.cs @@ -0,0 +1,160 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// +using System; +using System.IO; +using System.Collections.Generic; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using ResultsBrowser.Forms; +using ResultsBrowser.Resources; + +namespace ResultsBrowser +{ + public class Program + { + /// Program information + public static string Version; /// version string + public static DateTime BuildDateTime; /// date and time of program build + + /// Local settings + public static readonly string ExecutableDirectory; + public static readonly string ConfigDirectory; + public static readonly string LogDirectory; + public static readonly string LocalSettingsFileName; + public static readonly string LocalSettingsBackupName; + public static LocalSettings LocalSettings; + + + public static System.Globalization.CultureInfo AltCulture; + + static readonly ILog log; /// log4net + + static Program() + { + /// Program version string + System.Reflection.Assembly thisAssembly = System.Reflection.Assembly.GetExecutingAssembly(); + Version ver = thisAssembly.GetName().Version; + Version = string.Format("{0}.{1}.{2}", ver.Major, ver.Minor, ver.Build); + BuildDateTime = new System.IO.FileInfo(thisAssembly.Location).LastWriteTime; + + /// Local program configuration directory including the trailing backslash + ExecutableDirectory = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); + ConfigDirectory = Path.Combine(ExecutableDirectory, "..\\Cfg\\"); + LogDirectory = Path.Combine(ExecutableDirectory, "..\\Log\\"); + LocalSettingsFileName = ConfigDirectory + "config.xml"; + LocalSettingsBackupName = ConfigDirectory + "config.backup.xml"; + + /// Configue and start logging + log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(ConfigDirectory + "log4netConfig.xml")); + log = LogManager.GetLogger(typeof(Program)); + log.Fatal("------------------------------------------------------------------------------------------------"); + log.Fatal("started"); + } + + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main(string[] args) + { + /// + /// Load the local settings + /// + LocalSettings = LocalSettings.Load(Program.LocalSettingsFileName); + if (LocalSettings == null) + { + /// Loading local seetings from regular config file failed. Use the backup + LocalSettings = LocalSettings.Load(Program.LocalSettingsBackupName); + if (LocalSettings == null) + { + MessageBox.Show(Strings.No_program_settings_found + Strings.Using_default_settings, + string.Empty, + MessageBoxButtons.OK, + MessageBoxIcon.Information); + + /// Create new default settings and save them + LocalSettings = new LocalSettings(); + Directory.CreateDirectory(ConfigDirectory); + LocalSettings.Save(); + } + else + { + LocalSettings.Save(); /// Save the settings to overwrite the wrong file + } + } + else + { + /// Loading local seetings from the regular config file was successful. Update the backup + File.Copy(Program.LocalSettingsFileName, Program.LocalSettingsBackupName, true); + } + + try + { + string culture = LocalSettings.Language.Replace('_', '-'); + System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(culture); + } + catch (Exception e) + { + string msg = e.Message; + MessageBox.Show(Strings.Selected_language_not_supported + Environment.NewLine + Strings.Using_English, + Strings.Warning, + MessageBoxButtons.OK, + MessageBoxIcon.Asterisk); + System.Threading.Thread.CurrentThread.CurrentUICulture = + new System.Globalization.CultureInfo("en"); + } + + //AltCulture = null; + AltCulture = new System.Globalization.CultureInfo("SK"); + + + /// This belongs to Application.Run(new MainWnd()) ... + /// and should be executed before opening 'loginDlg' + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + + + try + { + /// Open the main application window + log.Info("Creating and opening the main window"); + Application.Run(new ResultsBrowserWnd(args)); + log.Info("The main window was closed"); + } + catch (Exception e) + { + LogException(log, "Exception in Application.Run(new ResultsBrowserWnd(args))", e); + } + finally + { + /// Save local settings + LocalSettings.Save(); + } + + /// Close Fluent NHibernate + /// Todo + + log.Info("Exiting application."); + } + + static void MyHandler(object sender, UnhandledExceptionEventArgs args) + { + LogException(log, "Unhandled exception", (Exception)args.ExceptionObject); + } + + static void LogException(ILog log, string description, Exception e) + { + log.FatalFormat("---------------( {0} )---------------", description); + log.FatalFormat("Message : {0}", e.Message); + if (e.InnerException != null) + { + log.FatalFormat("InnerMessage : {0}", e.InnerException.Message); + } + log.FatalFormat("StackTrace : {0}{1}", Environment.NewLine, e.StackTrace); + log.Fatal("--------------------------------------"); + } + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Properties/AssemblyInfo.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..18c75159 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ResultsBrowser")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Sensus")] +[assembly: AssemblyProduct("ResultsBrowser")] +[assembly: AssemblyCopyright("Copyright © 2015 - 2018 Sensus Slovensko a.s.")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("3bb098ac-f5d3-4eb1-90ea-7ba296ce8fd7")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("2.18.856.0")] +[assembly: AssemblyFileVersion("2.18.856.0")] diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Properties/Resources.Designer.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Properties/Resources.Designer.cs new file mode 100644 index 00000000..cbf92485 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.34209 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ResultsBrowser.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ResultsBrowser.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Properties/Resources.resx b/TBF_V2/Sources/TBF/ResultsBrowser/Properties/Resources.resx new file mode 100644 index 00000000..af7dbebb --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Properties/Settings.Designer.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Properties/Settings.Designer.cs new file mode 100644 index 00000000..6f19c405 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.34209 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ResultsBrowser.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Properties/Settings.settings b/TBF_V2/Sources/TBF/ResultsBrowser/Properties/Settings.settings new file mode 100644 index 00000000..39645652 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Resources/Strings.cs.resx b/TBF_V2/Sources/TBF/ResultsBrowser/Resources/Strings.cs.resx new file mode 100644 index 00000000..1de1cae2 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Resources/Strings.cs.resx @@ -0,0 +1,240 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Přidat filtr + + + Zrušit + + + Vymazat filtry + + + Slopuce + + + Kombinovaný + + + Řetězec pro spojní s databázou + + + Datum + + + Chyba + + + Chyba při zobrazování výsledků + + + Chyba při ukládáni souboru + + + Chyba při serializaci filtru + + + Vykonat dotaz + + + Exportovat výsledky + + + Filtry + + + Formát výsledků + + + Od + + + Jazyk + + + Nahrát filtry + + + OK + + + Vytisknout výsledky + + + Postup + + + Protokol + + + Výsledky dotazu + + + Prohlížeč výsledků + + + Obnovit spojení s databázou + + + Řádky + + + Uložit filtry + + + Vybrané výsledky + + + Vyberte filtr + + + Sériové číslo + + + Nastavení + + + Jednoduchý + + + Statistiky + + + Test + + + Zkušební stolice + + + Zkušební stolice + + + Do + + + Odemknout + + + Vodoměr + + + Vytisknout + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Resources/Strings.de.resx b/TBF_V2/Sources/TBF/ResultsBrowser/Resources/Strings.de.resx new file mode 100644 index 00000000..9021fe94 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Resources/Strings.de.resx @@ -0,0 +1,249 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Filter hinzufügen + + + Abbrechen + + + Filter löschen + + + Spalten + + + Datenbank-Verbindungszeichenfolge + + + Datum + + + Fehler + + + Abfrage ausführen + + + Ergebnise exportieren + + + Filter + + + Format der Ergebnisse + + + Bis + + + Sprache + + + Filter laden + + + OK + + + Ergebnise drucken + + + Prüfvorlage + + + Protokoll + + + Ergebnisse + + + Analyse der Ergebnisse + + + Datenbankverbindung wiederherstellen + + + Reihen + + + Filter speichern + + + Ergebnisse ausgewählt + + + Wählen Sie einen Filter + + + Seriennummer + + + Einstellungen + + + Einzel + + + Statistiken + + + Prüfpunkt + + + Prüfstand + + + Prüfstand + + + Zu + + + Ändern + + + Wasserzähler + + + Fehler beim Anzeigen der Ergebnisse + + + Fehler beim Speichern der Datei + + + Fehler Serialisierung Filter + + + Verbund + + + Anzahl + + + Seitenausrichtung + + + Ja = Porträt, Nein = Landschaft + + + Drucken + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Resources/Strings.it.resx b/TBF_V2/Sources/TBF/ResultsBrowser/Resources/Strings.it.resx new file mode 100644 index 00000000..37a9d569 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Resources/Strings.it.resx @@ -0,0 +1,813 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + conferma + + + vuoi salvare la procedura? + + + errore + + + errore del caricamento del data base + + + Impossibile creare un database di esempio: + + + impossibile esportare il database + + + utente password o banco non valido + + + banco prova + + + max _X_ caratteri alfanumerici + + + Chiudi + + + deviatore + + + valvola di svuotamento + + + nome + + + riferimento + + + regolazione valvola + + + bilancia + + + durata [s] + + + no + + + P banco + + + P di avanzamento + + + PQ + + + procedura + + + P sens + + + prova + + + Copia + + + correzione [g] + + + numero + + + massa [kg] + + + inserisci + + + Annulla + + + Chiudi + + + serratura + + + rimuovere + + + ok + + + correzione [l/h] + + + correzione [mbar] + + + flusso [m3/h] + + + Username o password non validi + + + copia + + + Giù + + + Modifica + + + Su + + + Impossibile collegarsi al database + + + configurare il banco prova (richiesta password) + + + uscita + + + password di ingresso + + + Password non valida + + + conflitto nome per banco prova, cambiare nome + + + Il database è stato creato con successo! + + + il database verrà sovrascritto + + + vuoi procedere? + + + notifica + + + nessun banco prova nella configurazione del programma + + + Descrizione + + + procedura + + + tester + + + corretto + + + misurato + + + il banco prova non è in funzionamento tuttavia è possibile modificare le impostazioni per risolvere il problema + + + svuotamento + + + banco + + + correzione errore - [%] + + + correzione errore + [%] + + + limite errore - [%] + + + limite errore + [%] + + + alimentazione + + + tipo rosso + + + errore durante la creazione del data base , motivi: + + + metrologia + + + (disconnesso) + + + Amministratore + + + esperto di calibrazione + + + capo del laboratorio + + + esperto in manutenzione + + + metrologista + + + chiudere la valvola di svuotamento + + + prendi la massa d'acqua nel serbatoio + + + Ignora + + + scarica la procedura + + + svuotare il serbatoio + + + misura la massa + + + pronto + + + < indietro + + + finire + + + avanti > + + + selezionare il flusso + + + metodo di prova + + + Q relativo da + + + Q relativo a + + + misuratori combinati + + + soglia di rilevazione [%] + + + tasso di cambio [%] + + + componenti + + + <none> + + + selezione del metodo di prova + + + cancella risultati + + + configurare + + + disposizioni di misuratori testati + + + disposizione dei test + + + orizzontalmente + + + configurazione + + + NOK + + + chiaro + + + svuotare il serbatorio + + + misurazione del peso + + + svuotamento {0}: passo {1}/{2} + + + Attività + + + Info approvazione + + + classe metrologica + + + produttore + + + stampante + + + versione + + + <niente da configurare> + + + riempire il banco prova con acqua? + + + no + + + domanda + + + parametri del banco + + + stringa di connessione + + + Crea DB + + + tipo di database + + + registrazione + + + modalità + + + nuova scheda + + + nuovo nome di transizione + + + rilevazione completata + + + STOP di emergenza + + + &Aggiungi > + + + Risultati disponibili: + + + < &rimuovere + + + r&imuovere tutto + + + messaggio + + + dflt + + + rilevazione fallita + + + errore della fotocamera + + + tempo restante + + + di meno + + + di più + + + le modifiche andranno perse vuoi procedere? + + + misuratore di flusso + + + combinato + + + Dispositivo + + + stampante + + + contatore acqua ausiliario + + + stato contatore acqua ausiliario + + + dati + + + fine stato + + + contatore acqua principale + + + stato contatore acqua principale + + + protocollo + + + Numero Seriale + + + numero seriale contatore acqua ausiliario + + + numero seriale contatore acqua principale + + + aggiustamento in corso + + + Errore [%] + + + durata delle perdite [s] + + + durata portata massima [s] + + + chiudere la valvola di ingresso spegnendo la pompa + + + ordine acquisto + + + Umidità dell'ambiente: + + + Pressione dell'ambiente: + + + Temperatura dell'ambiente: + + + Approvazione: + + + Data e ora: + + + Fine + + + @temperatura [gradiC] + + + densità [kg/m3] + + + densità + + + numero contatori di un gruppo: + + + condizioni finali + + + Comunicazione + + + ausiliario: + + + principale: + + + freddo + + + caldo + + + nome prodotto + + + Indirizzo + + + Data di approvazione + + + ID approvazione + + + Approvato da + + + Valuta + + + iPerl comunicazione in corso + + + lingua + + + componenti disponibili: + + + impostazioni del data base + + + informazioni circa la prova del banco + + + data di costruzione _BUILD_DATE_ + + + Copyright © 2013 - {0} + + + Copyright © 2013 - {0} + + + gruppi + + + Si è verificato un errore imprevisto + + + Ignora + + + aggiungi filtro + + + cancella filtro + + + fai il quesito + + + esporta il risultato del quesito + + + filtri + + + formato dei risultati + + + carica i filtri + + + stampa i risultati dei quesiti + + + risultati quesiti + + + browser dei risultati + + + salva filtri + + + impostazioni + + + banco di prova + + + riprova + + + selezionare risultati + + + singolo + + + sbloccare + + + contatore acqua + + + Data + + + da + + + a + + + statistiche + + + Colonne + + + righe + + + seleziona un filtro + + + Errore nella visualizzazione dei risultati + + + tutti i files + + + Errore nel salvataggio del file + + + errore durante la serializzazione dei filtri + + + files su quesiti + + + non è stata trovata nessuna impostazione del programma + + + utilizzo delle impostazione predefinite + + + lingua selezionata non supportata + + + usare inglese + + + Attenzione + + + contare + + + formato + + + orientamento della pagina + + + si = ritratto no = paesaggio + + + Stampa + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Resources/Strings.pl.resx b/TBF_V2/Sources/TBF/ResultsBrowser/Resources/Strings.pl.resx new file mode 100644 index 00000000..75fcfafa --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Resources/Strings.pl.resx @@ -0,0 +1,813 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Potwierdzenie + + + Zachować procedurę ? + + + Błąd + + + Błąd przy ładowaniu użytkowników z bazy danych: + + + Nie udało się utworzyć bazy danych: + + + Nie powódł się eksport bazy danych: + + + Niezgodny użytkownik, hasło lub stanowisko + + + Stanowisko pomiarowe + + + Max._X_znaków alfanumerycznych + + + Zamknąć + + + Zawór + + + Zawór spustowy + + + Imię + + + Odniesienie + + + Zawór regulacyjny + + + Waga + + + Czas trwania [s] + + + nie + + + P stanowisko + + + P zasilania + + + PQ + + + Procedura + + + P czujnków + + + Test + + + -Kopiuj' + + + Korekcja [r] + + + Nr + + + Masa [kg] + + + Dodać + + + Anuluj + + + Zamknąć + + + Zablokować + + + Usunąć + + + OK + + + Korekcja [l/h] + + + Korekcja [mBar] + + + Przepływ [m3/h] + + + Nieprawidłowa nazwa użytkownika lub hasło + + + Kupiuj + + + Na dół + + + Redagować + + + Do góry + + + Nie udane połaczenie z bazą danych + + + Konfiguracja testowa (wymagane hasło) + + + Wyjście + + + Wprowadź hasło + + + Nieprawidłowe hasło + + + Nazwa stanowiska nieprawidłowa, użyj innej nazwy + + + Utworzono bazę danych ! + + + Baza danych zostanie nadpisana + + + Chcesz kontynuować ? + + + Powiadomienie + + + W konfiguracji oprogramowania nie ma stanowiska + + + Opis + + + Procedura + + + Test + + + Poprawiono + + + Zmierzono + + + Stanowisko nie jest włączone ale można dokonać korekty nastaw dla usunięcia tego błedu. + + + Spust + + + Stanowisko + + + Błąd kor. - [%] + + + Błąd kor. +[%] + + + Błąd limit - [%] + + + Błąd limit + [%] + + + Zasilanie + + + Red. Type + + + Błąd przy tworzeniu bazy danych. Przyczyna: + + + Metrologia + + + Ofline + + + Administrator + + + Specjalista ds. kalibracji + + + Kierownik laboratorium + + + Konserwator + + + Metrolog + + + Zamknąć zawór spustowy + + + Uzyskaj masę wody w zbiorniku + + + Wyłączyć + + + Procedura ładowania + + + Opróżnić zbiornik + + + Pomiar masy + + + Gotowe + + + < z powrotem + + + Koniec + + + Następny > + + + Wybór przypływu + + + Metoda badania + + + Q względne od + + + Q względne do + + + Wodomierze sprzężone + + + Próg detekcji [%] + + + Prędkość zmiany [%] + + + Element + + + <nie> + + + Wybór metody badania + + + Usunąć wyniki + + + Konfigurować + + + Połozenie badanych liczników + + + Położenie badań + + + Poziomo + + + Konfiguracja + + + NOK + + + Usunąć + + + Opróżnianie zbiornika + + + Pomair wagi + + + Spust ({0}: krok {1} / {2} + + + Aktywny + + + Informacja o zatwierdzeniu + + + Klasa metrologiczna + + + Producent + + + Drukarka + + + Wersja + + + <nie konfigurować> + + + Napełnić stanowisko wodą ? + + + Nie + + + Pytanie + + + Parametry stanowiska + + + Parametry połączenia + + + Utwórz DB + + + Typ bazy danych + + + Logowanie + + + Cykl pracy + + + Nowa Tab + + + Nowa nazwa przejścia + + + Wykrywanie zakończono + + + Zatrzymanie awaryjne + + + &Dodać > + + + Dostępne wyniki: + + + <&Usunąć + + + <<Usunąć wszystko + + + Wiadomość + + + dflt + + + Nie udana próba wykrywania + + + Błąd kamery + + + pozostały czas + + + Mniej + + + Więcej + + + Zmiany zostaną stracone. Chcesz kontynuować ? + + + Przepływomierz + + + Sprzężony + + + Urządzenie + + + Drukarka + + + Wodomierz dodatkowy + + + Stan dodatkowego wodomierza + + + Dane + + + Stan końcowy + + + Główny wodomierz + + + Stan wodomierza głównego + + + Zapiska + + + Nr seryjny + + + Nr seryjny dodatkowego wodomierza + + + Nr seryjny głównego wodomierza + + + Regulacja trwa + + + Błąd [%] + + + Czas trwania przepływu [s] + + + Czas trwania Pmax [s] + + + Zamnięcie zaworu zasilania, wyłączenie pompy + + + Zamówienie + + + Wilgotność względna otoczenia + + + Ciśnienie względne: + + + Temperatura otoczenia: + + + Zatwierdzenie: + + + Data i czas: + + + Koniec + + + @temperatura [degC] + + + Gęstość [kg/m3] + + + Gęstość + + + Nr liczników w grupie + + + Stan końcowy + + + Połączenie + + + Dodadkowy + + + Główny + + + zimna + + + ciepła + + + Nazwa produktu + + + Adres + + + Data zatwierdzenia + + + ID Zatwierdzenia + + + Zatwierdzono + + + Ocena + + + Połączenie z iPERL w trakcie + + + Język + + + Dostępne elementy: + + + Ustawienia bazy danych: + + + O Framework stanowiska + + + Build Data _BUILD_Data_ + + + Praw autorskie © 2013 - {0} + + + Edytuj użytkownika + + + Grupy + + + Wystąpił nieobsługiwany błąd + + + Wyłączyć + + + Dodać filtr + + + Oczyścić filtr + + + Wykonaj zapytanie + + + Eksport wyników zapytania + + + Filtry + + + Format wyników + + + Załaduj filtry + + + Wydrukuj wyniki + + + Wyniki zapytania + + + Przegląd wyników + + + Zachować filtry + + + Ustawienia + + + Stanowiska pomiarowe + + + Powtórka + + + Wybrane wyniki: + + + Pojedynczy + + + Odblokować + + + Licznik wody + + + Data + + + Od + + + Do + + + Statystyka + + + Kolumny + + + Wiersze + + + Proszę wybrać filtr + + + Błąd przy wyśiwetlaniu wyników + + + Wszystkie pliki + + + Błąd zapisu pliku: + + + Błąd szeregowania plików + + + Pliki zapytania + + + Nie znaleziono ustawień programu + + + Ustawienia domyslne + + + Wybrany język jest nieobsługiwany + + + Wykorzystuje język angielski + + + Ostrzeżenie + + + Odliczanie + + + Format + + + Orientacja strony + + + Tak = pionowa, Nie = pozioma + + + Drukuj + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Resources/Strings.resx b/TBF_V2/Sources/TBF/ResultsBrowser/Resources/Strings.resx new file mode 100644 index 00000000..7e021aa9 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Resources/Strings.resx @@ -0,0 +1,828 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Confirmation + + + Do you want to save the procedure? + + + Error + + + Error loading users from the database: + + + Failed to create a sample database: + + + Failed to export the database: + + + Invalid user, password, or bench + + + Test bench + + + (max. _X_ alphanumeric characters) + + + close + + + Diverter + + + Emptying valve + + + Name + + + Reference + + + Reg. valve + + + Balance + + + Duration [s] + + + no + + + PBench + + + PFeed + + + PQ + + + Procedure + + + PSens + + + Test + + + - Copy + + + Correction [g] + + + Nr. + + + Mass [kg] + + + Add + + + Cancel + + + Close + + + Lock + + + Remove + + + OK + + + Correction [l/h] + + + Correction [mbar] + + + Flow [m3/h] + + + Invalid username or password + + + Copy + + + Down + + + Edit + + + Up + + + Cannot connect to the database. + + + Configure test benches (password required) + + + Exit + + + Enter password + + + Invalid password + + + Test bench name conflict, use another name please + + + The database was successfully created! + + + The database will be overwritten + + + Do you want to proceed? + + + Notification + + + No test bench in the program configuration. + + + Description + + + Procedure + + + Test + + + Corrected + + + Measured + + + Test bench is not running, however you can change the settings to resolve the problem. + + + Emptying + + + Bench + + + Err. cor. - [%] + + + Err. cor. +[%] + + + Err. Limit - [%] + + + Err. Limit + [%] + + + Feeding + + + Red. type + + + Error while creating the database. Reason: + + + Metrology + + + (offline) + + + Administrator + + + Calibration Specialist + + + Head of Lab + + + Maintenance Specialist + + + Metrologist + + + Close emptying valve + + + Get mass of water in the tank + + + Ignore + + + Loading the procedure + + + Make tank empty + + + Measure the mass + + + Ready + + + < Back + + + Finish + + + Next > + + + Flow Selection + + + Test method + + + Relative Q from + + + Relative Q to + + + Combined meters + + + Detection threshold [%] + + + Rate of change [%] + + + Component + + + <none> + + + Test method selection + + + Clear results + + + Configure + + + Arrangements of tested meters + + + Arrangement of tests + + + Horizontally + + + Configuration + + + NOK + + + Clear + + + Emptying the tank + + + Measuring the weight + + + Emptying ({0}: step {1}/{2}) + + + Activity + + + Approval info. + + + Metrological class + + + Producer + + + Printer + + + Version + + + <nothing to configure> + + + Fill the test bench with water? + + + No + + + Question + + + Bench parameters + + + Connection string + + + Create DB + + + Database type + + + Logging + + + Mode + + + New Tab + + + New transition name + + + Detection completed + + + Emergency STOP + + + &Add > + + + Available results: + + + < &Remove + + + << R&emove all + + + Message + + + dflt + + + Detection failed + + + Camera error + + + remaining time + + + Less + + + More + + + Changes will be lost. Do you want to proceed? + + + Flowmeter + + + Combined + + + Device + + + Printer + + + Aux Water Meter + + + Aux. WM State + + + Data + + + End State + + + Main Water Meter + + + Main WM State + + + Protocol + + + Serial Number + + + Aux. WM Serial Nr. + + + Main WM Serial Nr. + + + Adjustment in progress + + + Error [%] + + + Leak duration [s] + + + PMax duration [s] + + + Closing input valve, switching the pump off + + + Purchase Order + + + Ambient humidity: + + + Ambient pressure: + + + Ambient temperature: + + + Approval: + + + Date and time: + + + End + + + @temperature [degC] + + + Density [kg/m3] + + + Density + + + Nr. meters in a group: + + + End condition + + + Communication + + + Aux: + + + Main: + + + cold + + + hot + + + Product name + + + Address + + + Approval date + + + Approval ID + + + Approved by + + + Evaluate + + + iPerl Communication in progress + + + Language + + + Available Components: + + + Database Settings + + + About Test Bench Framework + + + Build date _BUILD_DATE_ + + + Copyright © 2013 - {0} + + + Edit User + + + Groups + + + An unhandled error occured + + + Ignore + + + Add filter + + + Clear filters + + + Execute query + + + Export query results + + + Filters + + + Configure output + + + Load filters + + + Print query results + + + Query results + + + Results Browser + + + Save filters + + + Settings + + + Test benches + + + Retry + + + Selected results + + + Single + + + Unlock + + + Water Meter + + + Date + + + From + + + To + + + Statistics + + + Columns + + + Rows + + + Select a filter + + + Error displaying results + + + All files + + + Error saving file + + + Error serializing filters + + + Query files + + + No program settings found. + + + Using default settings. + + + Selected language not supported. + + + Using English. + + + Warning + + + Count + + + Format + + + Page orientation + + + Yes = Portrait, No = Landscape + + + Print + + + Configure printer + + + No printer defined + + + Printing failed + + + Printing completed + + + Error exporting results + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Resources/Strings.ru.resx b/TBF_V2/Sources/TBF/ResultsBrowser/Resources/Strings.ru.resx new file mode 100644 index 00000000..0e4331fa --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Resources/Strings.ru.resx @@ -0,0 +1,813 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Подтверждение + + + Хотите сохранить процедуру? + + + Ошибка + + + Ошибка при загрузке пользователей из базы данных: + + + Не удалось создать базу данных: + + + Не удалось экспортировать базу данных: + + + Неверный пользователь, пароль, или установка + + + Поверочная установка + + + (Макс. _X_ Буквенно-цифровых символов) + + + закрыть + + + Клапан + + + Выпускной клапан + + + Имя + + + Ссылка + + + Рег. вентиль + + + Весы + + + Продолжительность [с] + + + нет + + + PУстановка + + + PFeed + + + PQ + + + Процедура + + + PSens + + + Тест + + + - Копировать + + + Коррекция [г] + + + + + + Масса [кг] + + + Добавить + + + Отмена + + + Закрыть + + + Заблокировать + + + Удалить + + + OK + + + Коррекция [л/ч] + + + Коррекция [мбар] + + + Расход [м3/ч] + + + Неправильное имя пользователя или пароль + + + Копировать + + + Вниз + + + Редактировать + + + Вверх + + + Не удается подключиться к базе данных. + + + Тестовая конфигурация установки (требуется пароль) + + + Выход + + + Введите пароль + + + Неверный пароль + + + Имя поверочной установки неверно, используйте другое имя, пожалуйста + + + База данных была успешно создана! + + + База данных будет перезаписана + + + Вы хотите продолжить? + + + Уведомление + + + Нет поверочной установки в конфигурации программы. + + + Описание + + + Процедура + + + Тест + + + Исправлено + + + Измерено + + + Поверочная установка не запущена, однако вы можете изменить настройки, чтобы решить эту проблему. + + + Выпуск + + + Установка + + + Err. cor. - [%] + + + Err. cor. +[%] + + + Err. Limit - [%] + + + Err. Limit + [%] + + + Feeding + + + Red. type + + + Ошибка при создании базы данных. Причина: + + + Метрология + + + (не в сети) + + + Администратор + + + Специалист по калибровке + + + Руководитель лаборатории + + + Специалист по техобслуживанию + + + Метролог + + + Закрыть выпускной клапан + + + Получить массу воды в резервуаре + + + Отклонить + + + Процедура загрузки + + + Оборожнить бак + + + Измерьте массу + + + Готов + + + < Назад + + + Завершить + + + Дальше > + + + Выбор расхода + + + Метод испытания + + + Относительный Q от + + + Относительный Q до + + + Комбинированные счетчики + + + Порог [%] + + + Скорость изменения [%] + + + Компонент + + + <нет> + + + Выбор метода испытаний + + + Очистить Результаты + + + Конфигурировать + + + Расположение испытуемых счетчиков + + + Расположение испытаний + + + Горизонтально + + + Конфигурация + + + NOK + + + Очистить + + + Опорожнение бака + + + Измерение веса + + + Слив ({0}: шаг {1} / {2}) + + + Активность + + + Информация об утверждении + + + Метрологический класс + + + Производитель + + + Принтер + + + Версия + + + <нечего настраивать> + + + Заполнить установку водой? + + + Нет + + + Вопрос + + + Установка параметров + + + Строка подключения БД + + + Создание БД + + + Тип БД + + + Логирование + + + Режим + + + Новая вкладка + + + Новое имя перехода + + + Обнаружение завершено + + + Аварийная остановка + + + &Добавить > + + + Доступные результаты + + + < &Удалить + + + << Удалить все + + + Сообщение + + + dflt + + + Обнаружение не удалось + + + Ошибка камеры + + + оставшееся время + + + Меньше + + + Больше + + + Изменения будут потеряны. Вы хотите продолжить? + + + Расходомер + + + Комбинированный + + + Устройство + + + Принтер + + + Доп.счетчик воды + + + Статус доп.счетчика + + + Данные + + + Конечное состояние + + + Главный счетчик воды + + + Статус главного счетчика + + + Протокол + + + Серийный номер + + + Сер. № доп. счетчика + + + Сер. № главн. счетчика + + + Настройка выполняется + + + Погрешность [%] + + + Продолжительность расхода [с] + + + Продолжительность Pмакс [с] + + + Закрытие впускного клапана, выключение насоса + + + Заказ + + + Относительная влажность окружающей среды: + + + Относительное давление: + + + Температура окружающей среды: + + + Утверждение: + + + Дата и время: + + + Конец + + + температура [degC] + + + Плотность [кг/м3] + + + Плотность + + + № счетчиков в группе + + + Конечное состояние + + + Соединение + + + Доп. + + + Главн: + + + холодный + + + горячий + + + Наименование продукта + + + Адрес + + + Дата утверждения + + + ID Утверждения + + + Утверждено + + + Оценка + + + Осуществляется связь с iPerl + + + Язык + + + Доступные компоненты: + + + Настройки Базы данных + + + О Framework поверочной установки + + + Build Data _BUILD_Data_ + + + Copyright © 2013 - {0} + + + Редактировать пользователя + + + Группы + + + Произошла необрабатываемая ошибка + + + Отклонить + + + Добавить фильтр + + + Очистить фильтры + + + Выполнить запрос + + + Экспорт результатов запроса + + + Фильтры + + + Формат результатов + + + Загрузка фильтров + + + Печать результатов + + + Результаты запроса + + + Результаты обозревателя + + + Сохранить фильтры + + + Установки + + + Поверочные установки + + + Повтор + + + Выбанные результаты + + + Единый + + + Разблокировать + + + Счетчик воды + + + Дата + + + От + + + До + + + Статистика + + + Столбцы + + + Строки + + + Выберите фильтр + + + Ошибка отображения результатов + + + Все файлы + + + Ошибка сохранения файла + + + Ошибка фильтров сериализации + + + Запрашиваемые файлы + + + Не найдены настройки программы + + + Использовать настройки по умолчанию + + + Выбранный язык не поддерживается. + + + Использование Английского языка + + + Предупреждение + + + Подсчет + + + Формат + + + Ориентация страницы + + + Да = Книжная, No = Альбомная + + + Печатать + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/Resources/Strings1.Designer.cs b/TBF_V2/Sources/TBF/ResultsBrowser/Resources/Strings1.Designer.cs new file mode 100644 index 00000000..32cdbc75 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/Resources/Strings1.Designer.cs @@ -0,0 +1,2187 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ResultsBrowser.Resources { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Strings { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Strings() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ResultsBrowser.Resources.Strings", typeof(Strings).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to <none>. + /// + internal static string _none_ { + get { + return ResourceManager.GetString("_none_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to (offline). + /// + internal static string _offline { + get { + return ResourceManager.GetString("_offline", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to About Test Bench Framework. + /// + internal static string About_Test_Bench_Framework { + get { + return ResourceManager.GetString("About_Test_Bench_Framework", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Activity. + /// + internal static string Activity { + get { + return ResourceManager.GetString("Activity", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to &Add >. + /// + internal static string Add { + get { + return ResourceManager.GetString("Add", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add filter. + /// + internal static string Add_filter { + get { + return ResourceManager.GetString("Add_filter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add. + /// + internal static string AddBtnText { + get { + return ResourceManager.GetString("AddBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Address. + /// + internal static string Address { + get { + return ResourceManager.GetString("Address", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Adjustment in progress. + /// + internal static string Adjustment_in_progress { + get { + return ResourceManager.GetString("Adjustment_in_progress", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Administrator. + /// + internal static string Administrator { + get { + return ResourceManager.GetString("Administrator", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to All files. + /// + internal static string All_files { + get { + return ResourceManager.GetString("All_files", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ambient humidity: . + /// + internal static string Ambient_humidity_ { + get { + return ResourceManager.GetString("Ambient_humidity_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ambient pressure: . + /// + internal static string Ambient_pressure_ { + get { + return ResourceManager.GetString("Ambient_pressure_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ambient temperature: . + /// + internal static string Ambient_temperature_ { + get { + return ResourceManager.GetString("Ambient_temperature_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to An unhandled error occured. + /// + internal static string An_unhandled_error_occured { + get { + return ResourceManager.GetString("An_unhandled_error_occured", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Approval: . + /// + internal static string Approval_ { + get { + return ResourceManager.GetString("Approval_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Approval date. + /// + internal static string Approval_date { + get { + return ResourceManager.GetString("Approval_date", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Approval ID. + /// + internal static string Approval_ID { + get { + return ResourceManager.GetString("Approval_ID", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Approval info.. + /// + internal static string Approval_info { + get { + return ResourceManager.GetString("Approval_info", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Approved by. + /// + internal static string Approved_by { + get { + return ResourceManager.GetString("Approved_by", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Arrangements of tested meters. + /// + internal static string Arrangement_of_meters { + get { + return ResourceManager.GetString("Arrangement_of_meters", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Arrangement of tests. + /// + internal static string Arrangement_of_tests { + get { + return ResourceManager.GetString("Arrangement_of_tests", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to @temperature [degC]. + /// + internal static string AtTemperature_C { + get { + return ResourceManager.GetString("AtTemperature_C", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Aux:. + /// + internal static string Aux_ { + get { + return ResourceManager.GetString("Aux_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Aux Water Meter. + /// + internal static string Aux_Water_Meter { + get { + return ResourceManager.GetString("Aux_Water_Meter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Aux. WM State. + /// + internal static string Aux_Water_Meter_State { + get { + return ResourceManager.GetString("Aux_Water_Meter_State", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Aux. WM Serial Nr.. + /// + internal static string Aux_WM_SerialNr { + get { + return ResourceManager.GetString("Aux_WM_SerialNr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Available Components:. + /// + internal static string Available_Components_ { + get { + return ResourceManager.GetString("Available_Components_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Available results:. + /// + internal static string Available_results { + get { + return ResourceManager.GetString("Available_results", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to < Back. + /// + internal static string BackBtnText { + get { + return ResourceManager.GetString("BackBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Balance. + /// + internal static string Balance { + get { + return ResourceManager.GetString("Balance", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Bench. + /// + internal static string Bench_chdr { + get { + return ResourceManager.GetString("Bench_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test bench is not running, however you can change the settings to resolve the problem.. + /// + internal static string Bench_is_not_running { + get { + return ResourceManager.GetString("Bench_is_not_running", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test bench name conflict, use another name please. + /// + internal static string Bench_name_conflict_Use_another_name_pls { + get { + return ResourceManager.GetString("Bench_name_conflict_Use_another_name_pls", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Bench parameters. + /// + internal static string Bench_parameters { + get { + return ResourceManager.GetString("Bench_parameters", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Build date _BUILD_DATE_. + /// + internal static string BuildDateStr { + get { + return ResourceManager.GetString("BuildDateStr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Calibration Specialist. + /// + internal static string Calibration_Specialist { + get { + return ResourceManager.GetString("Calibration_Specialist", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Camera error. + /// + internal static string Camera_error { + get { + return ResourceManager.GetString("Camera_error", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cancel. + /// + internal static string CancelBtnText { + get { + return ResourceManager.GetString("CancelBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Changes will be lost. Do you want to proceed?. + /// + internal static string Changes_will_be_lost_Do_you_want_to_proceed { + get { + return ResourceManager.GetString("Changes_will_be_lost_Do_you_want_to_proceed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Clear filters. + /// + internal static string Clear_filters { + get { + return ResourceManager.GetString("Clear_filters", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Clear results. + /// + internal static string Clear_results { + get { + return ResourceManager.GetString("Clear_results", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Clear. + /// + internal static string ClearBtnText { + get { + return ResourceManager.GetString("ClearBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to close. + /// + internal static string close { + get { + return ResourceManager.GetString("close", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Close emptying valve. + /// + internal static string Close_emptying_valve { + get { + return ResourceManager.GetString("Close_emptying_valve", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Close. + /// + internal static string CloseBtnText { + get { + return ResourceManager.GetString("CloseBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Closing input valve, switching the pump off. + /// + internal static string Closing_valve_Pump_off { + get { + return ResourceManager.GetString("Closing_valve_Pump_off", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to cold. + /// + internal static string cold { + get { + return ResourceManager.GetString("cold", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Columns. + /// + internal static string Columns { + get { + return ResourceManager.GetString("Columns", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Combined meters. + /// + internal static string Combined_meters { + get { + return ResourceManager.GetString("Combined_meters", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Combined. + /// + internal static string CombinedBtnText { + get { + return ResourceManager.GetString("CombinedBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Communication. + /// + internal static string Communication { + get { + return ResourceManager.GetString("Communication", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Component. + /// + internal static string Component { + get { + return ResourceManager.GetString("Component", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Configuration. + /// + internal static string Configuration { + get { + return ResourceManager.GetString("Configuration", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Configure. + /// + internal static string Configure { + get { + return ResourceManager.GetString("Configure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Configure printer. + /// + internal static string Configure_printer { + get { + return ResourceManager.GetString("Configure_printer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Configure test benches (password required). + /// + internal static string ConfigureDatabaseText { + get { + return ResourceManager.GetString("ConfigureDatabaseText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Confirmation. + /// + internal static string Confirmation { + get { + return ResourceManager.GetString("Confirmation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Connection string. + /// + internal static string Connection_string { + get { + return ResourceManager.GetString("Connection_string", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Copy. + /// + internal static string CopyBtnText { + get { + return ResourceManager.GetString("CopyBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Copyright © 2013 - {0}. + /// + internal static string CopyrightStr { + get { + return ResourceManager.GetString("CopyrightStr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Corrected. + /// + internal static string Corrected { + get { + return ResourceManager.GetString("Corrected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Correction [g]. + /// + internal static string Correction_g { + get { + return ResourceManager.GetString("Correction_g", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Correction [l/h]. + /// + internal static string Correction_lph { + get { + return ResourceManager.GetString("Correction_lph", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Correction [mbar]. + /// + internal static string Correction_mbar { + get { + return ResourceManager.GetString("Correction_mbar", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Count. + /// + internal static string Count { + get { + return ResourceManager.GetString("Count", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Create DB. + /// + internal static string Create_DB { + get { + return ResourceManager.GetString("Create_DB", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Data. + /// + internal static string Data { + get { + return ResourceManager.GetString("Data", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Database Settings. + /// + internal static string Database_Settings { + get { + return ResourceManager.GetString("Database_Settings", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Database type. + /// + internal static string Database_type { + get { + return ResourceManager.GetString("Database_type", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Date. + /// + internal static string Date { + get { + return ResourceManager.GetString("Date", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Date and time: . + /// + internal static string Date_and_time_ { + get { + return ResourceManager.GetString("Date_and_time_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The database was successfully created!. + /// + internal static string DB_was_successfully_created { + get { + return ResourceManager.GetString("DB_was_successfully_created", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The database will be overwritten. + /// + internal static string DB_will_be_overwritten { + get { + return ResourceManager.GetString("DB_will_be_overwritten", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Density. + /// + internal static string Density { + get { + return ResourceManager.GetString("Density", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Density [kg/m3]. + /// + internal static string Density_kg_m3 { + get { + return ResourceManager.GetString("Density_kg_m3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Description. + /// + internal static string DescriptionColHdr { + get { + return ResourceManager.GetString("DescriptionColHdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Detection completed. + /// + internal static string Detection_completed { + get { + return ResourceManager.GetString("Detection_completed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Detection failed. + /// + internal static string Detection_failed { + get { + return ResourceManager.GetString("Detection_failed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Detection threshold [%]. + /// + internal static string DetectionThresholdPct { + get { + return ResourceManager.GetString("DetectionThresholdPct", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device. + /// + internal static string Device { + get { + return ResourceManager.GetString("Device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to dflt. + /// + internal static string dflt { + get { + return ResourceManager.GetString("dflt", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Diverter. + /// + internal static string Diverter { + get { + return ResourceManager.GetString("Diverter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Do you want to proceed?. + /// + internal static string Do_you_want_to_proceed { + get { + return ResourceManager.GetString("Do_you_want_to_proceed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Do you want to save the procedure?. + /// + internal static string Do_you_want_to_save_the_procedure { + get { + return ResourceManager.GetString("Do_you_want_to_save_the_procedure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Down. + /// + internal static string DownBtnText { + get { + return ResourceManager.GetString("DownBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Leak duration [s]. + /// + internal static string Duration_Leak_s { + get { + return ResourceManager.GetString("Duration_Leak_s", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PMax duration [s]. + /// + internal static string Duration_PMax_s { + get { + return ResourceManager.GetString("Duration_PMax_s", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Duration [s]. + /// + internal static string Duration_s { + get { + return ResourceManager.GetString("Duration_s", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Edit User. + /// + internal static string Edit_User { + get { + return ResourceManager.GetString("Edit_User", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Edit. + /// + internal static string EditBtnText { + get { + return ResourceManager.GetString("EditBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Emergency STOP. + /// + internal static string Emergency_STOP { + get { + return ResourceManager.GetString("Emergency_STOP", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Emptying. + /// + internal static string Emptying_chdr { + get { + return ResourceManager.GetString("Emptying_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Emptying ({0}: step {1}/{2}). + /// + internal static string Emptying_i_n { + get { + return ResourceManager.GetString("Emptying_i_n", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Emptying the tank. + /// + internal static string Emptying_tank { + get { + return ResourceManager.GetString("Emptying_tank", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Emptying valve. + /// + internal static string Emptying_valve { + get { + return ResourceManager.GetString("Emptying_valve", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to End. + /// + internal static string End { + get { + return ResourceManager.GetString("End", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to End condition. + /// + internal static string End_Condition { + get { + return ResourceManager.GetString("End_Condition", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to End State. + /// + internal static string End_State { + get { + return ResourceManager.GetString("End_State", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enter password. + /// + internal static string Enter_password { + get { + return ResourceManager.GetString("Enter_password", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Err. cor. - [%]. + /// + internal static string Err_cor_neg_pct_chdr { + get { + return ResourceManager.GetString("Err_cor_neg_pct_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Err. cor. +[%]. + /// + internal static string Err_cor_pos_pct_chdr { + get { + return ResourceManager.GetString("Err_cor_pos_pct_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Err. Limit - [%]. + /// + internal static string Err_limit_neg_pct_chdr { + get { + return ResourceManager.GetString("Err_limit_neg_pct_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Err. Limit + [%]. + /// + internal static string Err_limit_pos_pct_chdr { + get { + return ResourceManager.GetString("Err_limit_pos_pct_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error. + /// + internal static string Error { + get { + return ResourceManager.GetString("Error", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error displaying results. + /// + internal static string Error_displaying_results { + get { + return ResourceManager.GetString("Error_displaying_results", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error exporting results. + /// + internal static string Error_exporting_results { + get { + return ResourceManager.GetString("Error_exporting_results", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error loading users from the database:. + /// + internal static string Error_loading_users_from_the_database { + get { + return ResourceManager.GetString("Error_loading_users_from_the_database", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error [%]. + /// + internal static string Error_pct { + get { + return ResourceManager.GetString("Error_pct", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error saving file. + /// + internal static string Error_saving_file { + get { + return ResourceManager.GetString("Error_saving_file", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error serializing filters. + /// + internal static string Error_serializing_filters { + get { + return ResourceManager.GetString("Error_serializing_filters", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error while creating the database. Reason: . + /// + internal static string Error_while_creating_DB_Reason { + get { + return ResourceManager.GetString("Error_while_creating_DB_Reason", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Evaluate. + /// + internal static string Evaluate { + get { + return ResourceManager.GetString("Evaluate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Execute query. + /// + internal static string Execute_query { + get { + return ResourceManager.GetString("Execute_query", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exit. + /// + internal static string ExitBtnText { + get { + return ResourceManager.GetString("ExitBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Export query results. + /// + internal static string Export_query_results { + get { + return ResourceManager.GetString("Export_query_results", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to NOK. + /// + internal static string Failed { + get { + return ResourceManager.GetString("Failed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Failed to create a sample database:. + /// + internal static string Failed_to_create_a_sample_database { + get { + return ResourceManager.GetString("Failed_to_create_a_sample_database", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Failed to export the database:. + /// + internal static string Failed_to_export_the_database { + get { + return ResourceManager.GetString("Failed_to_export_the_database", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Feeding. + /// + internal static string Feeding_chdr { + get { + return ResourceManager.GetString("Feeding_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Fill the test bench with water?. + /// + internal static string Fill_with_water { + get { + return ResourceManager.GetString("Fill_with_water", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Filters. + /// + internal static string Filters { + get { + return ResourceManager.GetString("Filters", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Finish. + /// + internal static string FinishBtnText { + get { + return ResourceManager.GetString("FinishBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Flow [m3/h]. + /// + internal static string Flow_m3h { + get { + return ResourceManager.GetString("Flow_m3h", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Flow Selection. + /// + internal static string Flow_selection { + get { + return ResourceManager.GetString("Flow_selection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Flowmeter. + /// + internal static string Flowmeter { + get { + return ResourceManager.GetString("Flowmeter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Format. + /// + internal static string Format { + get { + return ResourceManager.GetString("Format", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Configure output. + /// + internal static string Format_of_results { + get { + return ResourceManager.GetString("Format_of_results", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to From. + /// + internal static string From { + get { + return ResourceManager.GetString("From", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Get mass of water in the tank. + /// + internal static string Get_mass_of_water_in_the_tank { + get { + return ResourceManager.GetString("Get_mass_of_water_in_the_tank", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Groups. + /// + internal static string Groups { + get { + return ResourceManager.GetString("Groups", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Head of Lab. + /// + internal static string Head_of_Lab { + get { + return ResourceManager.GetString("Head_of_Lab", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Horizontally. + /// + internal static string Horizontally { + get { + return ResourceManager.GetString("Horizontally", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to hot. + /// + internal static string hot { + get { + return ResourceManager.GetString("hot", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ignore. + /// + internal static string Ignore { + get { + return ResourceManager.GetString("Ignore", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ignore. + /// + internal static string IgnoreBtnText { + get { + return ResourceManager.GetString("IgnoreBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid password. + /// + internal static string Invalid_password { + get { + return ResourceManager.GetString("Invalid_password", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid user, password, or bench. + /// + internal static string Invalid_user_password_or_bench { + get { + return ResourceManager.GetString("Invalid_user_password_or_bench", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid username or password. + /// + internal static string Invalid_username_or_password { + get { + return ResourceManager.GetString("Invalid_username_or_password", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to iPerl Communication in progress. + /// + internal static string iPerl_Communication_in_progress { + get { + return ResourceManager.GetString("iPerl_Communication_in_progress", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Language. + /// + internal static string Language { + get { + return ResourceManager.GetString("Language", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Less. + /// + internal static string LessBtnText { + get { + return ResourceManager.GetString("LessBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Load filters. + /// + internal static string Load_filters { + get { + return ResourceManager.GetString("Load_filters", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Loading the procedure. + /// + internal static string Loading_the_procedure { + get { + return ResourceManager.GetString("Loading_the_procedure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Lock. + /// + internal static string LockBtnText { + get { + return ResourceManager.GetString("LockBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Logging. + /// + internal static string Logging { + get { + return ResourceManager.GetString("Logging", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Main:. + /// + internal static string Main_ { + get { + return ResourceManager.GetString("Main_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Main Water Meter. + /// + internal static string Main_Water_Meter { + get { + return ResourceManager.GetString("Main_Water_Meter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Main WM State. + /// + internal static string Main_Water_Meter_State { + get { + return ResourceManager.GetString("Main_Water_Meter_State", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Main WM Serial Nr.. + /// + internal static string Main_WM_SerialNr { + get { + return ResourceManager.GetString("Main_WM_SerialNr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Maintenance Specialist. + /// + internal static string Maintenance_Specialist { + get { + return ResourceManager.GetString("Maintenance_Specialist", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Make tank empty. + /// + internal static string Make_tank_empty { + get { + return ResourceManager.GetString("Make_tank_empty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mass [kg]. + /// + internal static string Mass_kg { + get { + return ResourceManager.GetString("Mass_kg", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to (max. _X_ alphanumeric characters). + /// + internal static string MaxChars { + get { + return ResourceManager.GetString("MaxChars", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Measure the mass. + /// + internal static string Measure_the_mass { + get { + return ResourceManager.GetString("Measure_the_mass", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Measured. + /// + internal static string Measured { + get { + return ResourceManager.GetString("Measured", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Measuring the weight. + /// + internal static string Measuring_the_weight { + get { + return ResourceManager.GetString("Measuring_the_weight", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Message. + /// + internal static string Message { + get { + return ResourceManager.GetString("Message", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test method. + /// + internal static string Method_chdr { + get { + return ResourceManager.GetString("Method_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test method selection. + /// + internal static string Method_selection { + get { + return ResourceManager.GetString("Method_selection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Metrological class. + /// + internal static string Metrological_class { + get { + return ResourceManager.GetString("Metrological_class", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Metrologist. + /// + internal static string Metrologist { + get { + return ResourceManager.GetString("Metrologist", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Metrology. + /// + internal static string Metrology { + get { + return ResourceManager.GetString("Metrology", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mode. + /// + internal static string Mode { + get { + return ResourceManager.GetString("Mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to More. + /// + internal static string MoreBtnText { + get { + return ResourceManager.GetString("MoreBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Name. + /// + internal static string Name { + get { + return ResourceManager.GetString("Name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PBench. + /// + internal static string New_bench_path_name { + get { + return ResourceManager.GetString("New_bench_path_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PFeed. + /// + internal static string New_feeding_path_name { + get { + return ResourceManager.GetString("New_feeding_path_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to - Copy. + /// + internal static string New_name_copy { + get { + return ResourceManager.GetString("New_name_copy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PQ. + /// + internal static string New_output_path_name { + get { + return ResourceManager.GetString("New_output_path_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Procedure. + /// + internal static string New_procedure_name { + get { + return ResourceManager.GetString("New_procedure_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PSens. + /// + internal static string New_sensors_path_name { + get { + return ResourceManager.GetString("New_sensors_path_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test. + /// + internal static string New_test_name { + get { + return ResourceManager.GetString("New_test_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to New transition name. + /// + internal static string New_transition_name { + get { + return ResourceManager.GetString("New_transition_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to New Tab. + /// + internal static string NewTabBtnText { + get { + return ResourceManager.GetString("NewTabBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Next >. + /// + internal static string NextBtnText { + get { + return ResourceManager.GetString("NextBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to no. + /// + internal static string no { + get { + return ResourceManager.GetString("no", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No printer defined. + /// + internal static string No_printer_defined { + get { + return ResourceManager.GetString("No_printer_defined", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No program settings found. . + /// + internal static string No_program_settings_found { + get { + return ResourceManager.GetString("No_program_settings_found", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No test bench in the program configuration.. + /// + internal static string NoBenchMsg { + get { + return ResourceManager.GetString("NoBenchMsg", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No. + /// + internal static string NoBtn { + get { + return ResourceManager.GetString("NoBtn", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cannot connect to the database.. + /// + internal static string NoDatabaseMsg { + get { + return ResourceManager.GetString("NoDatabaseMsg", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to <nothing to configure>. + /// + internal static string nothing_to_configure { + get { + return ResourceManager.GetString("nothing_to_configure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Notification. + /// + internal static string Notification { + get { + return ResourceManager.GetString("Notification", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Nr.. + /// + internal static string Nr { + get { + return ResourceManager.GetString("Nr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Nr. meters in a group:. + /// + internal static string Nr_meters_in_a_group { + get { + return ResourceManager.GetString("Nr_meters_in_a_group", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to OK. + /// + internal static string OkBtnText { + get { + return ResourceManager.GetString("OkBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Page orientation. + /// + internal static string Page_orientation { + get { + return ResourceManager.GetString("Page_orientation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Print. + /// + internal static string Print { + get { + return ResourceManager.GetString("Print", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Print query results. + /// + internal static string Print_query_results { + get { + return ResourceManager.GetString("Print_query_results", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Printer. + /// + internal static string Printer { + get { + return ResourceManager.GetString("Printer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Printer. + /// + internal static string PrinterBtnText { + get { + return ResourceManager.GetString("PrinterBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Printing completed. + /// + internal static string Printing_completed { + get { + return ResourceManager.GetString("Printing_completed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Printing failed. + /// + internal static string Printing_failed { + get { + return ResourceManager.GetString("Printing_failed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Procedure. + /// + internal static string Procedure { + get { + return ResourceManager.GetString("Procedure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Producer. + /// + internal static string Producer { + get { + return ResourceManager.GetString("Producer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Product name. + /// + internal static string Product_name { + get { + return ResourceManager.GetString("Product_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Protocol. + /// + internal static string Protocol { + get { + return ResourceManager.GetString("Protocol", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Purchase Order. + /// + internal static string Purchase_Order { + get { + return ResourceManager.GetString("Purchase_Order", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Query files. + /// + internal static string Query_files { + get { + return ResourceManager.GetString("Query_files", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Query results. + /// + internal static string Query_results { + get { + return ResourceManager.GetString("Query_results", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Question. + /// + internal static string Question { + get { + return ResourceManager.GetString("Question", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Rate of change [%]. + /// + internal static string RateOfChangePct { + get { + return ResourceManager.GetString("RateOfChangePct", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ready. + /// + internal static string Ready { + get { + return ResourceManager.GetString("Ready", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Red. type. + /// + internal static string Red_type_chdr { + get { + return ResourceManager.GetString("Red_type_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reference. + /// + internal static string Reference { + get { + return ResourceManager.GetString("Reference", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reg. valve. + /// + internal static string Reg_valve { + get { + return ResourceManager.GetString("Reg_valve", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Relative Q from. + /// + internal static string RelativeQfrom { + get { + return ResourceManager.GetString("RelativeQfrom", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Relative Q to. + /// + internal static string RelativeQto { + get { + return ResourceManager.GetString("RelativeQto", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to remaining time. + /// + internal static string remaining_time { + get { + return ResourceManager.GetString("remaining_time", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to < &Remove. + /// + internal static string Remove { + get { + return ResourceManager.GetString("Remove", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to << R&emove all. + /// + internal static string Remove_all { + get { + return ResourceManager.GetString("Remove_all", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remove. + /// + internal static string RemoveBtnText { + get { + return ResourceManager.GetString("RemoveBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Results Browser. + /// + internal static string Results_Browser { + get { + return ResourceManager.GetString("Results_Browser", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Retry. + /// + internal static string RetryDatabaseText { + get { + return ResourceManager.GetString("RetryDatabaseText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Rows. + /// + internal static string Rows { + get { + return ResourceManager.GetString("Rows", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Save filters. + /// + internal static string Save_filters { + get { + return ResourceManager.GetString("Save_filters", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Select a filter. + /// + internal static string Select_a_filter { + get { + return ResourceManager.GetString("Select_a_filter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Selected language not supported.. + /// + internal static string Selected_language_not_supported { + get { + return ResourceManager.GetString("Selected_language_not_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Selected results. + /// + internal static string Selected_results { + get { + return ResourceManager.GetString("Selected_results", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Serial Number. + /// + internal static string Serial_Number { + get { + return ResourceManager.GetString("Serial_Number", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Settings. + /// + internal static string Settings { + get { + return ResourceManager.GetString("Settings", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Single. + /// + internal static string SingleBtnText { + get { + return ResourceManager.GetString("SingleBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Statistics. + /// + internal static string Statistics { + get { + return ResourceManager.GetString("Statistics", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test. + /// + internal static string Test { + get { + return ResourceManager.GetString("Test", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test bench. + /// + internal static string Test_bench { + get { + return ResourceManager.GetString("Test_bench", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test benches. + /// + internal static string Test_benches { + get { + return ResourceManager.GetString("Test_benches", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to To. + /// + internal static string To { + get { + return ResourceManager.GetString("To", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unlock. + /// + internal static string UnlockBtnText { + get { + return ResourceManager.GetString("UnlockBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Up. + /// + internal static string UpBtnText { + get { + return ResourceManager.GetString("UpBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Using default settings. . + /// + internal static string Using_default_settings { + get { + return ResourceManager.GetString("Using_default_settings", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Using English.. + /// + internal static string Using_English { + get { + return ResourceManager.GetString("Using_English", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Version. + /// + internal static string Version { + get { + return ResourceManager.GetString("Version", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Warning. + /// + internal static string Warning { + get { + return ResourceManager.GetString("Warning", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Water Meter. + /// + internal static string Water_Meter { + get { + return ResourceManager.GetString("Water_Meter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Yes = Portrait, No = Landscape. + /// + internal static string Yes_Portrait_No_Landscape { + get { + return ResourceManager.GetString("Yes_Portrait_No_Landscape", resourceCulture); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/ResultsBrowser.csproj b/TBF_V2/Sources/TBF/ResultsBrowser/ResultsBrowser.csproj new file mode 100644 index 00000000..c33b23a6 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/ResultsBrowser.csproj @@ -0,0 +1,262 @@ + + + + Debug + x86 + 8.0.30703 + 2.0 + {07BA543A-54CA-4A59-9AD9-DDE7038E1BF9} + WinExe + Properties + ResultsBrowser + ResultsBrowser + v4.0 + + + 512 + + + x86 + true + full + false + bin\Debug\ + TRACE;DEBUG;GENESIS;IPERL;LANG_DE + prompt + 4 + false + + + x86 + pdbonly + true + bin\Release\ + TRACE;GENESIS;IPERL;LANG_DE + prompt + 4 + + + ResultsBrowser.Program + + + + ..\packages\FluentNHibernate.2.0.3.0\lib\net40\FluentNHibernate.dll + + + ..\packages\Iesi.Collections.4.0.0.4000\lib\net40\Iesi.Collections.dll + + + ..\packages\log4net.2.0.2\lib\net40-full\log4net.dll + + + ..\packages\MySql.Data.6.6.5\lib\net40\MySql.Data.dll + + + ..\packages\NHibernate.4.0.4.4000\lib\net40\NHibernate.dll + + + False + ..\packages\Oracle\Oracle.DataAccess.dll + + + + + + + + + + + + + + + UserControl + + + DateFilterUI.cs + + + + + + + UserControl + + + ProcedureFilterUI.cs + + + + UserControl + + + ProtocolFilterUI.cs + + + + UserControl + + + QnFilterUI.cs + + + + UserControl + + + SerialNrFilterUI.cs + + + Form + + + AddFilterDlg.cs + + + Form + + + DatabaseSettingsDlg.cs + + + Form + + + NoBenchOrDatabaseDlg.cs + + + Form + + + PrinterConfigDlg.cs + + + Form + + + StatisticsDlg.cs + + + Form + + + StatisticsOptionsDlg.cs + + + + Component + + + + + + True + True + Strings.resx + + + Form + + + ResultsBrowserWnd.cs + + + DateFilterUI.cs + + + ProcedureFilterUI.cs + + + ProtocolFilterUI.cs + + + QnFilterUI.cs + + + SerialNrFilterUI.cs + + + AddFilterDlg.cs + + + DatabaseSettingsDlg.cs + + + NoBenchOrDatabaseDlg.cs + + + PrinterConfigDlg.cs + + + StatisticsDlg.cs + + + StatisticsOptionsDlg.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + + + + Designer + + + ResXFileCodeGenerator + Strings1.Designer.cs + Designer + + + Designer + + + ResultsBrowserWnd.cs + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + {743DF7DB-C7B6-42EB-986D-0F485E5588E4} + Config + + + {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB} + Results + + + {8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48} + TBF + + + {6E5CB0E9-E1B6-4E5D-AC6E-B1049E180F2B} + Users + + + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/ResultsBrowserWnd.Designer.cs b/TBF_V2/Sources/TBF/ResultsBrowser/ResultsBrowserWnd.Designer.cs new file mode 100644 index 00000000..a3d7a1dc --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/ResultsBrowserWnd.Designer.cs @@ -0,0 +1,391 @@ +namespace ResultsBrowser +{ + partial class ResultsBrowserWnd + { + /// + /// 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() + { + this.vSplitContainer = new System.Windows.Forms.SplitContainer(); + this.hSplitContainer = new System.Windows.Forms.SplitContainer(); + this.filtersGroupBox = new System.Windows.Forms.GroupBox(); + this.filtersFlowLayoutPanel = new System.Windows.Forms.FlowLayoutPanel(); + this.resultsGroupBox = new System.Windows.Forms.GroupBox(); + this.resultsListView = new System.Windows.Forms.ListView(); + this.printerConfigBtn = new System.Windows.Forms.Button(); + this.statisticsBtn = new System.Windows.Forms.Button(); + this.printQueryResultsBtn = new System.Windows.Forms.Button(); + this.exportQueryResultsBtn = new System.Windows.Forms.Button(); + this.formatOfResultsBtn = new System.Windows.Forms.Button(); + this.clearFiltersBtn = new System.Windows.Forms.Button(); + this.settingsBtn = new System.Windows.Forms.Button(); + this.saveConfigBtn = new System.Windows.Forms.Button(); + this.loadConfigBtn = new System.Windows.Forms.Button(); + this.executeQueryBtn = new System.Windows.Forms.Button(); + this.addFilterBtn = new System.Windows.Forms.Button(); + this.testBenchesGroupBox = new System.Windows.Forms.GroupBox(); + this.checkBox5 = new System.Windows.Forms.RadioButton(); + this.checkBox4 = new System.Windows.Forms.RadioButton(); + this.checkBox3 = new System.Windows.Forms.RadioButton(); + this.checkBox2 = new System.Windows.Forms.RadioButton(); + this.checkBox1 = new System.Windows.Forms.RadioButton(); + ((System.ComponentModel.ISupportInitialize)(this.vSplitContainer)).BeginInit(); + this.vSplitContainer.Panel1.SuspendLayout(); + this.vSplitContainer.Panel2.SuspendLayout(); + this.vSplitContainer.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.hSplitContainer)).BeginInit(); + this.hSplitContainer.Panel1.SuspendLayout(); + this.hSplitContainer.Panel2.SuspendLayout(); + this.hSplitContainer.SuspendLayout(); + this.filtersGroupBox.SuspendLayout(); + this.resultsGroupBox.SuspendLayout(); + this.testBenchesGroupBox.SuspendLayout(); + this.SuspendLayout(); + // + // vSplitContainer + // + this.vSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill; + this.vSplitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.vSplitContainer.Location = new System.Drawing.Point(0, 0); + this.vSplitContainer.Name = "vSplitContainer"; + // + // vSplitContainer.Panel1 + // + this.vSplitContainer.Panel1.Controls.Add(this.hSplitContainer); + this.vSplitContainer.Panel1MinSize = 100; + // + // vSplitContainer.Panel2 + // + this.vSplitContainer.Panel2.Controls.Add(this.printerConfigBtn); + this.vSplitContainer.Panel2.Controls.Add(this.statisticsBtn); + this.vSplitContainer.Panel2.Controls.Add(this.printQueryResultsBtn); + this.vSplitContainer.Panel2.Controls.Add(this.exportQueryResultsBtn); + this.vSplitContainer.Panel2.Controls.Add(this.formatOfResultsBtn); + this.vSplitContainer.Panel2.Controls.Add(this.clearFiltersBtn); + this.vSplitContainer.Panel2.Controls.Add(this.settingsBtn); + this.vSplitContainer.Panel2.Controls.Add(this.saveConfigBtn); + this.vSplitContainer.Panel2.Controls.Add(this.loadConfigBtn); + this.vSplitContainer.Panel2.Controls.Add(this.executeQueryBtn); + this.vSplitContainer.Panel2.Controls.Add(this.addFilterBtn); + this.vSplitContainer.Panel2.Controls.Add(this.testBenchesGroupBox); + this.vSplitContainer.Panel2MinSize = 100; + this.vSplitContainer.Size = new System.Drawing.Size(984, 712); + this.vSplitContainer.SplitterDistance = 840; + this.vSplitContainer.TabIndex = 0; + // + // hSplitContainer + // + this.hSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill; + this.hSplitContainer.Location = new System.Drawing.Point(0, 0); + this.hSplitContainer.Name = "hSplitContainer"; + this.hSplitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // hSplitContainer.Panel1 + // + this.hSplitContainer.Panel1.Controls.Add(this.filtersGroupBox); + // + // hSplitContainer.Panel2 + // + this.hSplitContainer.Panel2.Controls.Add(this.resultsGroupBox); + this.hSplitContainer.Size = new System.Drawing.Size(840, 712); + this.hSplitContainer.SplitterDistance = 280; + this.hSplitContainer.TabIndex = 0; + // + // filtersGroupBox + // + this.filtersGroupBox.Controls.Add(this.filtersFlowLayoutPanel); + this.filtersGroupBox.Dock = System.Windows.Forms.DockStyle.Fill; + this.filtersGroupBox.Location = new System.Drawing.Point(0, 0); + this.filtersGroupBox.Name = "filtersGroupBox"; + this.filtersGroupBox.Size = new System.Drawing.Size(840, 280); + this.filtersGroupBox.TabIndex = 1; + this.filtersGroupBox.TabStop = false; + this.filtersGroupBox.Text = "Filters"; + // + // filtersFlowLayoutPanel + // + this.filtersFlowLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.filtersFlowLayoutPanel.Location = new System.Drawing.Point(3, 16); + this.filtersFlowLayoutPanel.Name = "filtersFlowLayoutPanel"; + this.filtersFlowLayoutPanel.Size = new System.Drawing.Size(834, 261); + this.filtersFlowLayoutPanel.TabIndex = 0; + // + // resultsGroupBox + // + this.resultsGroupBox.Controls.Add(this.resultsListView); + this.resultsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill; + this.resultsGroupBox.Location = new System.Drawing.Point(0, 0); + this.resultsGroupBox.Name = "resultsGroupBox"; + this.resultsGroupBox.Size = new System.Drawing.Size(840, 428); + this.resultsGroupBox.TabIndex = 1; + this.resultsGroupBox.TabStop = false; + this.resultsGroupBox.Text = "Query results"; + // + // resultsListView + // + this.resultsListView.Dock = System.Windows.Forms.DockStyle.Fill; + this.resultsListView.Location = new System.Drawing.Point(3, 16); + this.resultsListView.Name = "resultsListView"; + this.resultsListView.Size = new System.Drawing.Size(834, 409); + this.resultsListView.TabIndex = 0; + this.resultsListView.UseCompatibleStateImageBehavior = false; + this.resultsListView.View = System.Windows.Forms.View.Details; + // + // printerConfigBtn + // + this.printerConfigBtn.Location = new System.Drawing.Point(8, 316); + this.printerConfigBtn.Name = "printerConfigBtn"; + this.printerConfigBtn.Size = new System.Drawing.Size(125, 35); + this.printerConfigBtn.TabIndex = 11; + this.printerConfigBtn.Text = "Configure printer"; + this.printerConfigBtn.UseVisualStyleBackColor = true; + this.printerConfigBtn.Click += new System.EventHandler(this.printerConfigBtn_Click); + // + // statisticsBtn + // + this.statisticsBtn.Location = new System.Drawing.Point(8, 621); + this.statisticsBtn.Name = "statisticsBtn"; + this.statisticsBtn.Size = new System.Drawing.Size(125, 35); + this.statisticsBtn.TabIndex = 10; + this.statisticsBtn.Text = "Statistics"; + this.statisticsBtn.UseVisualStyleBackColor = true; + this.statisticsBtn.Click += new System.EventHandler(this.statisticsBtn_Click); + // + // printQueryResultsBtn + // + this.printQueryResultsBtn.Location = new System.Drawing.Point(8, 548); + this.printQueryResultsBtn.Name = "printQueryResultsBtn"; + this.printQueryResultsBtn.Size = new System.Drawing.Size(125, 35); + this.printQueryResultsBtn.TabIndex = 9; + this.printQueryResultsBtn.Text = "Print query results"; + this.printQueryResultsBtn.UseVisualStyleBackColor = true; + this.printQueryResultsBtn.Click += new System.EventHandler(this.printQueryResultsBtn_Click); + // + // exportQueryResultsBtn + // + this.exportQueryResultsBtn.Location = new System.Drawing.Point(8, 508); + this.exportQueryResultsBtn.Name = "exportQueryResultsBtn"; + this.exportQueryResultsBtn.Size = new System.Drawing.Size(125, 35); + this.exportQueryResultsBtn.TabIndex = 8; + this.exportQueryResultsBtn.Text = "Export query results"; + this.exportQueryResultsBtn.UseVisualStyleBackColor = true; + this.exportQueryResultsBtn.Click += new System.EventHandler(this.exportQueryResultsBtn_Click); + // + // formatOfResultsBtn + // + this.formatOfResultsBtn.Location = new System.Drawing.Point(8, 276); + this.formatOfResultsBtn.Name = "formatOfResultsBtn"; + this.formatOfResultsBtn.Size = new System.Drawing.Size(125, 35); + this.formatOfResultsBtn.TabIndex = 7; + this.formatOfResultsBtn.Text = "Configure output"; + this.formatOfResultsBtn.UseVisualStyleBackColor = true; + this.formatOfResultsBtn.Click += new System.EventHandler(this.formatOfResultsBtn_Click); + // + // clearFiltersBtn + // + this.clearFiltersBtn.Location = new System.Drawing.Point(8, 196); + this.clearFiltersBtn.Name = "clearFiltersBtn"; + this.clearFiltersBtn.Size = new System.Drawing.Size(125, 35); + this.clearFiltersBtn.TabIndex = 2; + this.clearFiltersBtn.Text = "Clear filters"; + this.clearFiltersBtn.UseVisualStyleBackColor = true; + this.clearFiltersBtn.Click += new System.EventHandler(this.clearFiltersBtn_Click); + // + // settingsBtn + // + this.settingsBtn.Location = new System.Drawing.Point(8, 12); + this.settingsBtn.Name = "settingsBtn"; + this.settingsBtn.Size = new System.Drawing.Size(125, 33); + this.settingsBtn.TabIndex = 0; + this.settingsBtn.Text = "Settings"; + this.settingsBtn.UseVisualStyleBackColor = true; + this.settingsBtn.Click += new System.EventHandler(this.settingsBtn_Click); + // + // saveConfigBtn + // + this.saveConfigBtn.Location = new System.Drawing.Point(8, 356); + this.saveConfigBtn.Name = "saveConfigBtn"; + this.saveConfigBtn.Size = new System.Drawing.Size(125, 35); + this.saveConfigBtn.TabIndex = 5; + this.saveConfigBtn.Text = "Save configuration"; + this.saveConfigBtn.UseVisualStyleBackColor = true; + this.saveConfigBtn.Click += new System.EventHandler(this.saveConfigBtn_Click); + // + // loadConfigBtn + // + this.loadConfigBtn.Location = new System.Drawing.Point(8, 396); + this.loadConfigBtn.Name = "loadConfigBtn"; + this.loadConfigBtn.Size = new System.Drawing.Size(125, 35); + this.loadConfigBtn.TabIndex = 4; + this.loadConfigBtn.Text = "Load configuration"; + this.loadConfigBtn.UseVisualStyleBackColor = true; + this.loadConfigBtn.Click += new System.EventHandler(this.loadConfigBtn_Click); + // + // executeQueryBtn + // + this.executeQueryBtn.Location = new System.Drawing.Point(8, 468); + this.executeQueryBtn.Name = "executeQueryBtn"; + this.executeQueryBtn.Size = new System.Drawing.Size(125, 35); + this.executeQueryBtn.TabIndex = 6; + this.executeQueryBtn.Text = "Execute query"; + this.executeQueryBtn.UseVisualStyleBackColor = true; + this.executeQueryBtn.Click += new System.EventHandler(this.executeQueryBtn_Click); + // + // addFilterBtn + // + this.addFilterBtn.Location = new System.Drawing.Point(8, 236); + this.addFilterBtn.Name = "addFilterBtn"; + this.addFilterBtn.Size = new System.Drawing.Size(125, 35); + this.addFilterBtn.TabIndex = 3; + this.addFilterBtn.Text = "Add filter"; + this.addFilterBtn.UseVisualStyleBackColor = true; + this.addFilterBtn.Click += new System.EventHandler(this.addFilterBtn_Click); + // + // testBenchesGroupBox + // + this.testBenchesGroupBox.Controls.Add(this.checkBox5); + this.testBenchesGroupBox.Controls.Add(this.checkBox4); + this.testBenchesGroupBox.Controls.Add(this.checkBox3); + this.testBenchesGroupBox.Controls.Add(this.checkBox2); + this.testBenchesGroupBox.Controls.Add(this.checkBox1); + this.testBenchesGroupBox.Location = new System.Drawing.Point(8, 54); + this.testBenchesGroupBox.Name = "testBenchesGroupBox"; + this.testBenchesGroupBox.Size = new System.Drawing.Size(125, 135); + this.testBenchesGroupBox.TabIndex = 1; + this.testBenchesGroupBox.TabStop = false; + this.testBenchesGroupBox.Text = "Test benches"; + // + // checkBox5 + // + this.checkBox5.AutoSize = true; + this.checkBox5.Location = new System.Drawing.Point(23, 106); + this.checkBox5.Name = "checkBox5"; + this.checkBox5.Size = new System.Drawing.Size(85, 17); + this.checkBox5.TabIndex = 4; + this.checkBox5.TabStop = true; + this.checkBox5.Text = "radioButton5"; + this.checkBox5.UseVisualStyleBackColor = true; + this.checkBox5.CheckedChanged += new System.EventHandler(this.checkBox5_CheckedChanged); + // + // checkBox4 + // + this.checkBox4.AutoSize = true; + this.checkBox4.Location = new System.Drawing.Point(23, 86); + this.checkBox4.Name = "checkBox4"; + this.checkBox4.Size = new System.Drawing.Size(85, 17); + this.checkBox4.TabIndex = 3; + this.checkBox4.TabStop = true; + this.checkBox4.Text = "radioButton4"; + this.checkBox4.UseVisualStyleBackColor = true; + this.checkBox4.CheckedChanged += new System.EventHandler(this.checkBox4_CheckedChanged); + // + // checkBox3 + // + this.checkBox3.AutoSize = true; + this.checkBox3.Location = new System.Drawing.Point(23, 65); + this.checkBox3.Name = "checkBox3"; + this.checkBox3.Size = new System.Drawing.Size(85, 17); + this.checkBox3.TabIndex = 2; + this.checkBox3.TabStop = true; + this.checkBox3.Text = "radioButton3"; + this.checkBox3.UseVisualStyleBackColor = true; + this.checkBox3.CheckedChanged += new System.EventHandler(this.checkBox3_CheckedChanged); + // + // checkBox2 + // + this.checkBox2.AutoSize = true; + this.checkBox2.Location = new System.Drawing.Point(23, 44); + this.checkBox2.Name = "checkBox2"; + this.checkBox2.Size = new System.Drawing.Size(85, 17); + this.checkBox2.TabIndex = 1; + this.checkBox2.TabStop = true; + this.checkBox2.Text = "radioButton2"; + this.checkBox2.UseVisualStyleBackColor = true; + this.checkBox2.CheckedChanged += new System.EventHandler(this.checkBox2_CheckedChanged); + // + // checkBox1 + // + this.checkBox1.AutoSize = true; + this.checkBox1.Location = new System.Drawing.Point(23, 23); + this.checkBox1.Name = "checkBox1"; + this.checkBox1.Size = new System.Drawing.Size(85, 17); + this.checkBox1.TabIndex = 0; + this.checkBox1.TabStop = true; + this.checkBox1.Text = "radioButton1"; + this.checkBox1.UseVisualStyleBackColor = true; + this.checkBox1.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged); + // + // ResultsBrowserWnd + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(984, 712); + this.Controls.Add(this.vSplitContainer); + this.Name = "ResultsBrowserWnd"; + this.Text = "Results Browser"; + this.Load += new System.EventHandler(this.ResultsBrowserWnd_Load); + this.vSplitContainer.Panel1.ResumeLayout(false); + this.vSplitContainer.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.vSplitContainer)).EndInit(); + this.vSplitContainer.ResumeLayout(false); + this.hSplitContainer.Panel1.ResumeLayout(false); + this.hSplitContainer.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.hSplitContainer)).EndInit(); + this.hSplitContainer.ResumeLayout(false); + this.filtersGroupBox.ResumeLayout(false); + this.resultsGroupBox.ResumeLayout(false); + this.testBenchesGroupBox.ResumeLayout(false); + this.testBenchesGroupBox.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer vSplitContainer; + private System.Windows.Forms.SplitContainer hSplitContainer; + private System.Windows.Forms.FlowLayoutPanel filtersFlowLayoutPanel; + private System.Windows.Forms.GroupBox testBenchesGroupBox; + private System.Windows.Forms.Button saveConfigBtn; + private System.Windows.Forms.Button loadConfigBtn; + private System.Windows.Forms.Button executeQueryBtn; + private System.Windows.Forms.Button addFilterBtn; + private System.Windows.Forms.Button settingsBtn; + private System.Windows.Forms.GroupBox filtersGroupBox; + private System.Windows.Forms.GroupBox resultsGroupBox; + private System.Windows.Forms.RadioButton checkBox3; + private System.Windows.Forms.RadioButton checkBox2; + private System.Windows.Forms.RadioButton checkBox1; + private System.Windows.Forms.Button clearFiltersBtn; + private System.Windows.Forms.Button exportQueryResultsBtn; + private System.Windows.Forms.Button formatOfResultsBtn; + private System.Windows.Forms.Button printQueryResultsBtn; + private System.Windows.Forms.Button statisticsBtn; + private System.Windows.Forms.ListView resultsListView; + private System.Windows.Forms.RadioButton checkBox5; + private System.Windows.Forms.RadioButton checkBox4; + private System.Windows.Forms.Button printerConfigBtn; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/ResultsBrowserWnd.cs b/TBF_V2/Sources/TBF/ResultsBrowser/ResultsBrowserWnd.cs new file mode 100644 index 00000000..c91b27b6 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/ResultsBrowserWnd.cs @@ -0,0 +1,520 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Windows.Forms; +using NHibernate; +using Results.Entities; +using TBF.BenchControl; +using TBF.BenchControl.Generic; +using TBF.BenchControl.GenericDevices; +using ResultsBrowser.Filters; +using ResultsBrowser.Resources; + +namespace ResultsBrowser +{ + public partial class ResultsBrowserWnd : Form + { + const string OpenFileDlg_SaveFileDlg_Filter = "{0} (*.qry)|*.qry|{1} (*.*)|*.*"; + + string[] args; /// Comand line argument + + IList filters; /// Filters and the UI of filters + FiltersConfig filtersConfig; /// Serializable configuration of filters and displayed results + + IList waterMeters; + + DateTime timePeriodStart; + DateTime timePeriodEnd; + + static IList tbfComponents; + static IList tbfDevices; + + public ResultsBrowserWnd(string[] args) + { + InitializeComponent(); + + filters = new List(); + filtersConfig = new FiltersConfig(); + this.args = args; + + tbfComponents = new List(); + tbfDevices = new List(); + + timePeriodStart = new DateTime(0); + timePeriodEnd = new DateTime(0); + } + + private void ResultsBrowserWnd_Load(object sender, EventArgs e) + { + ResultsBrowser.LocalSettings ls = Program.LocalSettings; + Width = (ls.MainWndWidth > 0) ? ls.MainWndWidth : 1000; + Height = (ls.MainWndHeight > 0) ? ls.MainWndHeight : 750; + Left = (ls.MainWndLeft != 0) ? ls.MainWndLeft : 50; + Top = (ls.MainWndTop != 0) ? ls.MainWndTop : 50; + hSplitContainer.SplitterDistance = (ls.SplitterDistance != 0) ? ls.SplitterDistance : 280; + + Localize(); + + RedrawTestBenches(); + + checkBox1.Checked = Program.LocalSettings.Bench1Selected; + checkBox2.Checked = Program.LocalSettings.Bench2Selected; + checkBox3.Checked = Program.LocalSettings.Bench3Selected; + checkBox4.Checked = Program.LocalSettings.Bench4Selected; + checkBox5.Checked = Program.LocalSettings.Bench5Selected; + + if (args.Length == 1 && args[0].IndexOf(".qry") == args[0].Length - 4) + { + LoadConfigFromFile(args[0]); + } + else if (!string.IsNullOrEmpty(Program.LocalSettings.LastConfigFileName)) + { + LoadConfigFromFile(Program.LocalSettings.LastConfigFileName); + } + else + { + Text = string.Format("{0} ver.{1}", Strings.Results_Browser, Program.Version); + } + } + + void RedrawTestBenches() + { + checkBox1.Text = Program.LocalSettings.Bench1; + checkBox2.Text = Program.LocalSettings.Bench2; + checkBox3.Text = Program.LocalSettings.Bench3; + checkBox4.Text = Program.LocalSettings.Bench4; + checkBox5.Text = Program.LocalSettings.Bench5; + + checkBox1.Visible = !string.IsNullOrEmpty(checkBox1.Text); + checkBox2.Visible = !string.IsNullOrEmpty(checkBox2.Text); + checkBox3.Visible = !string.IsNullOrEmpty(checkBox3.Text); + checkBox4.Visible = !string.IsNullOrEmpty(checkBox4.Text); + checkBox5.Visible = !string.IsNullOrEmpty(checkBox5.Text); + } + + string BenchName() + { + return checkBox1.Checked ? Program.LocalSettings.Bench1 + : checkBox2.Checked ? Program.LocalSettings.Bench2 + : Program.LocalSettings.Bench3; + } + + void Localize() + { + filtersGroupBox.Text = Strings.Filters; + resultsGroupBox.Text = Strings.Query_results; + settingsBtn.Text = Strings.Settings; + testBenchesGroupBox.Text = Strings.Test_benches; + + clearFiltersBtn.Text = Strings.Clear_filters; + addFilterBtn.Text = Strings.Add_filter; + formatOfResultsBtn.Text = Strings.Format_of_results; + printerConfigBtn.Text = Strings.Configure_printer; + loadConfigBtn.Text = Strings.Load_filters; + saveConfigBtn.Text = Strings.Save_filters; + + executeQueryBtn.Text = Strings.Execute_query; + exportQueryResultsBtn.Text = Strings.Export_query_results; + printQueryResultsBtn.Text = Strings.Print_query_results; + + statisticsBtn.Text = Strings.Statistics; + } + + private void settingsBtn_Click(object sender, EventArgs e) + { + if (new Forms.DatabaseSettingsDlg().ShowDialog() == DialogResult.OK) + { + RedrawTestBenches(); + } + } + + private void checkBox1_CheckedChanged(object sender, EventArgs e) { SaveCheckBoxes(); } + private void checkBox2_CheckedChanged(object sender, EventArgs e) { SaveCheckBoxes(); } + private void checkBox3_CheckedChanged(object sender, EventArgs e) { SaveCheckBoxes(); } + private void checkBox4_CheckedChanged(object sender, EventArgs e) { SaveCheckBoxes(); } + private void checkBox5_CheckedChanged(object sender, EventArgs e) { SaveCheckBoxes(); } + + void SaveCheckBoxes() + { + Program.LocalSettings.Bench1Selected = checkBox1.Checked; + Program.LocalSettings.Bench2Selected = checkBox2.Checked; + Program.LocalSettings.Bench3Selected = checkBox3.Checked; + Program.LocalSettings.Bench4Selected = checkBox4.Checked; + Program.LocalSettings.Bench5Selected = checkBox5.Checked; + Program.LocalSettings.Save(); + } + + private void clearFiltersBtn_Click(object sender, EventArgs e) + { + filters.Clear(); + filtersFlowLayoutPanel.Controls.Clear(); + } + + private void addFilterBtn_Click(object sender, EventArgs e) + { + Forms.AddFilterDlg dlg = new Forms.AddFilterDlg(); + if (dlg.ShowDialog() == DialogResult.OK && dlg.SelectedFilterID != null) + { + Filters.IFilter filter = Factory.GetFilter(dlg.SelectedFilterID); + filters.Add(filter); + filtersFlowLayoutPanel.Controls.Add(filter.GetFilterUI()); + } + } + + private void formatOfResultsBtn_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg(); + dlg.MetersKind = Config.Entities.MetersKind.Single; + dlg.SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(filtersConfig.ResultItems); + + if (dlg.ShowDialog() == DialogResult.OK) + { + filtersConfig.ResultItems = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems); + RedrawResults(); + } + } + + private void printerConfigBtn_Click(object sender, EventArgs e) + { + Forms.PrinterConfigDlg dlg = new Forms.PrinterConfigDlg + { + PrinterClass = filtersConfig.PrinterClass, + PrinterCfg = filtersConfig.PrinterCfg + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + filtersConfig.PrinterClass = dlg.PrinterClass; + filtersConfig.PrinterCfg = dlg.PrinterCfg; + } + } + + private void loadConfigBtn_Click(object sender, EventArgs e) + { + OpenFileDialog dlg = new OpenFileDialog(); + dlg.Filter = string.Format("{0} (*.qry)|*.qry|{1} (*.*)|*.*", Strings.Query_files, Strings.All_files); + if (dlg.ShowDialog() == DialogResult.OK) + { + LoadConfigFromFile(dlg.FileName); + } + } + + void LoadConfigFromFile(string fileName) + { + FiltersConfig localFiltersConfig = FiltersConfig.Load(fileName); + if (localFiltersConfig != null) + { + filtersConfig = localFiltersConfig; + + filters.Clear(); + filtersFlowLayoutPanel.Controls.Clear(); + /// + for (int i = 0; i < filtersConfig.FiltersCount; i++) + { + Filters.IFilter filter = Factory.LoadFilter(filtersConfig.FilterID[i], filtersConfig.FilterData[i]); + filters.Add(filter); + filtersFlowLayoutPanel.Controls.Add(filter.GetFilterUI()); + } + } + + + Program.LocalSettings.LastConfigFileName = fileName; + Program.LocalSettings.Save(); + Text = string.Format("{0} ver.{1} ({2})", Strings.Results_Browser, Program.Version, Program.LocalSettings.LastConfigFileName); + } + + private void saveConfigBtn_Click(object sender, EventArgs e) + { + if (filtersConfig.UpdateFromFilters(filters)) /// filtersConfig members related to filters + { + /// Save column widths of the ListView into filtersConfig members + if (resultsListView.Columns.Count > 0) + { + filtersConfig.ResultsClmnWidths = new int[resultsListView.Columns.Count]; + for (int i = 0; i < resultsListView.Columns.Count; i++) + { + filtersConfig.ResultsClmnWidths[i] = resultsListView.Columns[i].Width; + } + } + + /// Save the file + SaveFileDialog dlg = new SaveFileDialog(); + dlg.Filter = string.Format(OpenFileDlg_SaveFileDlg_Filter, Strings.Query_files, Strings.All_files); + if (dlg.ShowDialog() == DialogResult.OK) + { + filtersConfig.Save(dlg.FileName); + + + Program.LocalSettings.LastConfigFileName = dlg.FileName; + Program.LocalSettings.Save(); + Text = string.Format("{0} ver.{1} ({2})", Strings.Results_Browser, Program.Version, Program.LocalSettings.LastConfigFileName); + } + } + } + + private void executeQueryBtn_Click(object sender, EventArgs e) + { + timePeriodStart = new DateTime(0); + timePeriodEnd = new DateTime(0); + + try + { + foreach (var filter in filters) filter.UI2Data(); /// Update filter data + + waterMeters = null; + IList waterMeters2; + + Results.DB.ConnectionString = checkBox1.Checked ? Program.LocalSettings.ConnectionString1 : + (checkBox2.Checked ? Program.LocalSettings.ConnectionString2 : + (checkBox3.Checked ? Program.LocalSettings.ConnectionString3 : + (checkBox4.Checked ? Program.LocalSettings.ConnectionString4 : + (checkBox5.Checked ? Program.LocalSettings.ConnectionString5 : + Program.LocalSettings.ConnectionString1)))); + + ISession[] sessions = new ISession[] { Results.DB.CreateSession() }; + + foreach (var filter in filters) + { + if (filter is DateFilter) + { + timePeriodStart = (filter as DateFilter).From; + timePeriodEnd = (filter as DateFilter).To; + } + waterMeters2 = filter.ExecuteQuery(sessions, waterMeters); + waterMeters = waterMeters2; + } + } + catch (Exception exc) + { + string message = exc.Message; + if (exc.InnerException != null) + message += string.Format("{0}Inner exception:{0}{1}", Environment.NewLine, exc.InnerException.Message); + + MessageBox.Show(message, Strings.Error, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + return; + } + + RedrawResults(); + } + + /// + /// Displays obtained results as configured by result items in the ListView + /// + void RedrawResults() + { + IList items = Results.WMeterRsltItemSpec.FromStrArray(filtersConfig.ResultItems); + + resultsListView.Clear(); + if (waterMeters == null || waterMeters.Count == 0 || items.Count == 0) return; + + try + { + for (int i = 0; i < items.Count; i++) + { + resultsListView.Columns.Add(items[i].Caption, (filtersConfig.ResultsClmnCount > i) ? filtersConfig.ResultsClmnWidths[i] : 70); + } + foreach (var wm in waterMeters) + { + ListViewItem lvi = null; + foreach (var item in items) + { + /// Get text and strip color information + string itemText = item.Print(wm); + string[] texts = itemText.Split(new char[] { '|' }); + if (texts.Length == 2) { itemText = texts[0]; } + + if (lvi == null) + lvi = new ListViewItem(itemText); + else + lvi.SubItems.Add(itemText); + } + if (lvi != null) resultsListView.Items.Add(lvi); + } + } + catch (Exception exc) + { + MessageBox.Show(exc.Message, Strings.Error_displaying_results, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + } + } + + private void exportQueryResultsBtn_Click(object sender, EventArgs e) + { + IList items = Results.WMeterRsltItemSpec.FromStrArray(filtersConfig.ResultItems); + + if (waterMeters == null || waterMeters.Count == 0 || items.Count == 0) return; + + SaveFileDialog dlg = new SaveFileDialog(); + dlg.Filter = "CSV files (*.csv)|*.csv|All files (*.*)|*.*"; + + if (dlg.ShowDialog() == DialogResult.OK) + { + try + { + using (TextWriter writer = new StreamWriter(dlg.FileName, false, System.Text.Encoding.UTF8)) + { + for (int i = 0; i < items.Count; i++) + { + writer.Write(items[i].Caption); + + if (i == items.Count - 1) + writer.WriteLine(); /// New line after the last item + else + writer.Write(";"); /// Semicolon between two items + } + + foreach (var wm in waterMeters) + { + for (int i = 0; i < items.Count; i++) + { + /// Get text and strip color information + string itemText = items[i].Print(wm); + string[] texts = itemText.Split(new char[] { '|' }); + if (texts.Length == 2) { itemText = texts[0]; } + + writer.Write(itemText); + + if (i == items.Count - 1) + writer.WriteLine(); /// New line after the last item + else + writer.Write(";"); /// Semicolon between two items + } + } + } + } + catch (Exception exc) + { + MessageBox.Show(exc.Message, Strings.Error_exporting_results, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + } + } + } + + + private void printQueryResultsBtn_Click(object sender, EventArgs e) + { + if (waterMeters == null || waterMeters.Count == 0) return; + +#if MUNICH + foreach (var wm in waterMeters) + { + new Results.Output.Printers.Munich.MunichPrintDocument(string.Format("4/13 - {0}", BenchName()), wm, Config.Entities.PageOrientation.Portrait).Print(); + } +#elif CEVAK_PT40_272 + IList batches = new List(); + foreach (var wm in waterMeters) + { + if (!batches.Contains(wm.Batch)) batches.Add(wm.Batch); + } + + foreach (var batch in batches) + { + new Results.Output.Printers.Cevak.PrintDocumentCevak(batch, + Config.Entities.PageOrientation.Portrait, + 60, 60, 60, + "PT40 Z/E-35-A", + "0111-OOP-C035-13").Print(); + } +#else + if (string.IsNullOrEmpty(filtersConfig.PrinterClass)) + { + MessageBox.Show(Strings.No_printer_defined); + return; + } + + try + { + Config.Entities.Component cmpnt = new Config.Entities.Component(); + cmpnt.Name = "printer"; + cmpnt.ClassName = filtersConfig.PrinterClass; + cmpnt.Parameters = filtersConfig.PrinterCfg; + + IComponentFactory printerFactory = GetFactory(filtersConfig.PrinterClass); + IComponentCfg printerCfg = printerFactory.CmpntCfgFromCmpntEntity(cmpnt); + IComponent component = printerFactory.GetComponent(printerCfg, tbfComponents); + IResultsPrinter printer = component as IResultsPrinter; + + if (printer== null) + { + MessageBox.Show(Strings.No_printer_defined); + return; + } + + tbfComponents.Clear(); + tbfDevices.Clear(); + tbfComponents.Add(component); + IDevice dev = component as IDevice; + if (dev != null) + { + dev.Initialize(); + tbfDevices.Add(dev); + } + + /// Find batches + IList batches = new List(); + foreach (var wm in waterMeters) + { + if (!batches.Contains(wm.Batch)) batches.Add(wm.Batch); + } + + foreach (var batch in batches) + { + IOperation printOp = printer.PrintResultsOp(batch); + printOp.Start(); + while (printOp.Run() != Event.ResultsPrinted) { } + printOp.Stop(); + } + + MessageBox.Show(Strings.Printing_completed); + } + catch (Exception) + { + MessageBox.Show(Strings.Printing_failed); + } +#endif + } + + + private void statisticsBtn_Click(object sender, EventArgs e) + { + if (waterMeters == null || waterMeters.Count == 0) return; + + IList items = Results.WMeterRsltItemSpec.FromStrArray(filtersConfig.ResultItems); + + /// + /// Enter options + /// + Forms.StatisticsOptionsDlg optionsDlg = new Forms.StatisticsOptionsDlg(items); + if (optionsDlg.ShowDialog() != DialogResult.OK) return; + + /// + /// Calculate statistics + /// + Forms.StatisticsDlg statisticsDlg = new Forms.StatisticsDlg(waterMeters, optionsDlg.TwoDim, + optionsDlg.RowItem, optionsDlg.RowItem2, optionsDlg.RowItem3, + optionsDlg.ColumnItem, optionsDlg.ColumnItem2, optionsDlg.ColumnItem3, + optionsDlg.RowTestSpecifier, optionsDlg.RowTestSpecifier2, optionsDlg.RowTestSpecifier3, + optionsDlg.ColumnTestSpecifier, optionsDlg.ColumnTestSpecifier2, optionsDlg.ColumnTestSpecifier3, + timePeriodStart, timePeriodEnd); + statisticsDlg.ShowDialog(); + } + + + /// + /// Updates component factory + /// + /// Component class name + /// Reference to a factory + /// true when factory changed + IComponentFactory GetFactory(string className) + { + if (!string.IsNullOrEmpty(className)) + { + foreach (var fac in TbfComponents.Factories) + { + if (fac.ClassName == className) return fac; + } + } + + return null; + } + } +} diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/ResultsBrowserWnd.resx b/TBF_V2/Sources/TBF/ResultsBrowser/ResultsBrowserWnd.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/ResultsBrowserWnd.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/ResultsBrowser/app.config b/TBF_V2/Sources/TBF/ResultsBrowser/app.config new file mode 100644 index 00000000..e3656033 --- /dev/null +++ b/TBF_V2/Sources/TBF/ResultsBrowser/app.config @@ -0,0 +1,3 @@ + + + diff --git a/TBF_V2/Sources/TBF/Statistics/Forms/ModelessForm.Designer.cs b/TBF_V2/Sources/TBF/Statistics/Forms/ModelessForm.Designer.cs new file mode 100644 index 00000000..9c2026e5 --- /dev/null +++ b/TBF_V2/Sources/TBF/Statistics/Forms/ModelessForm.Designer.cs @@ -0,0 +1,64 @@ +namespace Statistics.Forms +{ + partial class ModelessForm + { + /// + /// 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() + { + this.label1 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(47, 29); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(35, 13); + this.label1.TabIndex = 0; + this.label1.Text = "label1"; + // + // ModelessForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(191, 56); + this.Controls.Add(this.label1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Name = "ModelessForm"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "ModelessForm"; + this.Load += new System.EventHandler(this.ModelessForm_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label label1; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Statistics/Forms/ModelessForm.cs b/TBF_V2/Sources/TBF/Statistics/Forms/ModelessForm.cs new file mode 100644 index 00000000..2a327f8d --- /dev/null +++ b/TBF_V2/Sources/TBF/Statistics/Forms/ModelessForm.cs @@ -0,0 +1,68 @@ +using System; +using System.Drawing; +using System.Windows.Forms; + +namespace Statistics.Forms +{ + public partial class ModelessForm : Form + { + /// + /// Called from the state machine when an operation forces a modeless dialog close. + /// + public static void CloseForm() + { + if (CloseFormHandler == null) return; + try { CloseFormHandler(null, null); } + catch (Exception) { } + } + public static event EventHandler CloseFormHandler; + + void OnCloseForm(object sender, EventArgs args) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + + public string Title; + public string Message; + public Color BackgroundColor; + public Color TextColor; + public Font TextFont; + public string FontFamily; + public int FontSize; + public FontStyle FontStyle; + + + /// + /// Constructor to be used by the application + /// + /// Window title + /// Displayed message + public ModelessForm() + { + InitializeComponent(); + ControlBox = false; + + CloseFormHandler += delegate(object sender, EventArgs args) + { + if (InvokeRequired) { Invoke(new EventHandler(OnCloseForm), sender, args); } + else OnCloseForm(sender, args); + }; + } + + private void ModelessForm_Load(object sender, EventArgs e) + { + if (Title != null) Text = Title; + if (Message != null) label1.Text = Message; + if (BackgroundColor != null) BackColor = BackgroundColor; + if (TextColor != null) ForeColor = TextColor; + if (FontFamily != null) label1.Font = new Font(FontFamily, FontSize, FontStyle); + + float textWidth = Graphics.FromImage(new Bitmap(1, 1)).MeasureString(label1.Text, label1.Font).Width; + float textHeight = Graphics.FromImage(new Bitmap(1, 1)).MeasureString(label1.Text, label1.Font).Height; + Width = (int)textWidth + 120; /// Form width calculated from the text width + Height += (int)textHeight; /// Form height calculated from the text height + } + } +} diff --git a/TBF_V2/Sources/TBF/Statistics/Forms/ModelessForm.resx b/TBF_V2/Sources/TBF/Statistics/Forms/ModelessForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/Statistics/Forms/ModelessForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Statistics/LocalSettings.cs b/TBF_V2/Sources/TBF/Statistics/LocalSettings.cs new file mode 100644 index 00000000..82b337bd --- /dev/null +++ b/TBF_V2/Sources/TBF/Statistics/LocalSettings.cs @@ -0,0 +1,327 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; + +namespace Statistics +{ + /// + /// Class to be serialized to an XML file... + /// Public members are local settings. + /// These settings are modified by dialogs invoked by menu items + /// Edit->Preferences ... PreferencesDlg ... S1.1(language, etc. local settings), and + /// Edit->Advanced settings ... AdvancedSettingsDlg ... S1.2(spec. where bench settings are stored) + /// + [XmlRootAttribute("Statistics")] + public class LocalSettings + { + public const int FlowsCount = 5; + + + /// + /// User interface language (used as CultureInfo(..) constructor argument). + /// + public string Language; + + /// + /// Names of test benches + /// + public string[] BenchNames; + /// + public string GetBenchName(int i) + { + return ((BenchNames != null) && (i >= 0) && (i < BenchNames.Length)) ? BenchNames[i] : string.Empty; + } + + /// + /// Database settings of servers + /// + public string[] ConnectionStrings; + /// + public string GetConnectionString(int i) + { + return ((ConnectionStrings != null) && (i >= 0) && (i < ConnectionStrings.Length)) ? ConnectionStrings[i] : string.Empty; + } + + /// + /// MID-s + /// + public string[] MidNames; + + /// + /// Flow settings + /// + public bool[] FlowEnabledI1; + public bool[] FlowEnabledI2; + public bool[] FlowEnabledI3; + public bool[] FlowEnabledI4; + public bool[] FlowEnabledI5; + public bool[] FlowEnabledI6; + public bool[] FlowEnabledI7; + + + /// + /// Get flow enabled info + /// + /// 1-based MID id + /// 0-based flow id + /// true = enabled + public bool GetFlowEnabled(int midId, int i) + { + switch (midId) + { + case 1: return ((FlowEnabledI1 != null) && (i >= 0) && (i < FlowEnabledI1.Length)) ? FlowEnabledI1[i] : false; + case 2: return ((FlowEnabledI2 != null) && (i >= 0) && (i < FlowEnabledI2.Length)) ? FlowEnabledI2[i] : false; + case 3: return ((FlowEnabledI3 != null) && (i >= 0) && (i < FlowEnabledI3.Length)) ? FlowEnabledI3[i] : false; + case 4: return ((FlowEnabledI4 != null) && (i >= 0) && (i < FlowEnabledI4.Length)) ? FlowEnabledI4[i] : false; + case 5: return ((FlowEnabledI5 != null) && (i >= 0) && (i < FlowEnabledI5.Length)) ? FlowEnabledI5[i] : false; + case 6: return ((FlowEnabledI6 != null) && (i >= 0) && (i < FlowEnabledI6.Length)) ? FlowEnabledI6[i] : false; + case 7: return ((FlowEnabledI7 != null) && (i >= 0) && (i < FlowEnabledI7.Length)) ? FlowEnabledI7[i] : false; + default: + return false; + } + } + + /// + /// Set flow enabled info + /// + /// 1-based MID id + /// 0-based flow id + /// true = enabled + public void SetFlowEnabled(int midId, int i, bool value) + { + switch (midId) + { + case 1: if ((FlowEnabledI1 != null) && (i >= 0) && (i < FlowEnabledI1.Length)) { FlowEnabledI1[i] = value; }; break; + case 2: if ((FlowEnabledI2 != null) && (i >= 0) && (i < FlowEnabledI2.Length)) { FlowEnabledI2[i] = value; }; break; + case 3: if ((FlowEnabledI3 != null) && (i >= 0) && (i < FlowEnabledI3.Length)) { FlowEnabledI3[i] = value; }; break; + case 4: if ((FlowEnabledI4 != null) && (i >= 0) && (i < FlowEnabledI4.Length)) { FlowEnabledI4[i] = value; }; break; + case 5: if ((FlowEnabledI5 != null) && (i >= 0) && (i < FlowEnabledI5.Length)) { FlowEnabledI5[i] = value; }; break; + case 6: if ((FlowEnabledI6 != null) && (i >= 0) && (i < FlowEnabledI6.Length)) { FlowEnabledI6[i] = value; }; break; + case 7: if ((FlowEnabledI7 != null) && (i >= 0) && (i < FlowEnabledI7.Length)) { FlowEnabledI7[i] = value; }; break; + default: + break; + } + } + + public double[] FlowFromI1; + public double[] FlowFromI2; + public double[] FlowFromI3; + public double[] FlowFromI4; + public double[] FlowFromI5; + public double[] FlowFromI6; + public double[] FlowFromI7; + + /// + /// Get lower limit of the flow + /// + /// 1-based MID id + /// 0-based flow id + /// Flow in m3/h + public double GetFlowFrom(int midId, int i) + { + switch (midId) + { + case 1: return ((FlowFromI1 != null) && (i >= 0) && (i < FlowFromI1.Length)) ? FlowFromI1[i] : 0; + case 2: return ((FlowFromI2 != null) && (i >= 0) && (i < FlowFromI2.Length)) ? FlowFromI2[i] : 0; + case 3: return ((FlowFromI3 != null) && (i >= 0) && (i < FlowFromI3.Length)) ? FlowFromI3[i] : 0; + case 4: return ((FlowFromI4 != null) && (i >= 0) && (i < FlowFromI4.Length)) ? FlowFromI4[i] : 0; + case 5: return ((FlowFromI5 != null) && (i >= 0) && (i < FlowFromI5.Length)) ? FlowFromI5[i] : 0; + case 6: return ((FlowFromI6 != null) && (i >= 0) && (i < FlowFromI6.Length)) ? FlowFromI6[i] : 0; + case 7: return ((FlowFromI7 != null) && (i >= 0) && (i < FlowFromI7.Length)) ? FlowFromI7[i] : 0; + default: + return 0; + } + } + + /// + /// Set lower limit of the flow + /// + /// 1-based MID id + /// 0-based flow id + /// Flow in m3/h + public void SetFlowFrom(int midId, int i, double value) + { + switch (midId) + { + case 1: if ((FlowFromI1 != null) && (i >= 0) && (i < FlowFromI1.Length)) { FlowFromI1[i] = value; }; break; + case 2: if ((FlowFromI2 != null) && (i >= 0) && (i < FlowFromI2.Length)) { FlowFromI2[i] = value; }; break; + case 3: if ((FlowFromI3 != null) && (i >= 0) && (i < FlowFromI3.Length)) { FlowFromI3[i] = value; }; break; + case 4: if ((FlowFromI4 != null) && (i >= 0) && (i < FlowFromI4.Length)) { FlowFromI4[i] = value; }; break; + case 5: if ((FlowFromI5 != null) && (i >= 0) && (i < FlowFromI5.Length)) { FlowFromI5[i] = value; }; break; + case 6: if ((FlowFromI6 != null) && (i >= 0) && (i < FlowFromI6.Length)) { FlowFromI6[i] = value; }; break; + case 7: if ((FlowFromI7 != null) && (i >= 0) && (i < FlowFromI7.Length)) { FlowFromI7[i] = value; }; break; + default: + break; + } + } + + public double[] FlowToI1; + public double[] FlowToI2; + public double[] FlowToI3; + public double[] FlowToI4; + public double[] FlowToI5; + public double[] FlowToI6; + public double[] FlowToI7; + + /// + /// Get upper limit of the flow + /// + /// 1-based MID id + /// 0-based flow id + /// Flow in m3/h + public double GetFlowTo(int midId, int i) + { + switch (midId) + { + case 1: return ((FlowToI1 != null) && (i >= 0) && (i < FlowToI1.Length)) ? FlowToI1[i] : 0; + case 2: return ((FlowToI2 != null) && (i >= 0) && (i < FlowToI2.Length)) ? FlowToI2[i] : 0; + case 3: return ((FlowToI3 != null) && (i >= 0) && (i < FlowToI3.Length)) ? FlowToI3[i] : 0; + case 4: return ((FlowToI4 != null) && (i >= 0) && (i < FlowToI4.Length)) ? FlowToI4[i] : 0; + case 5: return ((FlowToI5 != null) && (i >= 0) && (i < FlowToI5.Length)) ? FlowToI5[i] : 0; + case 6: return ((FlowToI6 != null) && (i >= 0) && (i < FlowToI6.Length)) ? FlowToI6[i] : 0; + case 7: return ((FlowToI7 != null) && (i >= 0) && (i < FlowToI7.Length)) ? FlowToI7[i] : 0; + default: + return 0; + } + } + + /// + /// Set upper limit of the flow + /// + /// 1-based MID id + /// 0-based flow id + /// Flow in m3/h + public void SetFlowTo(int midId, int i, double value) + { + switch (midId) + { + case 1: if ((FlowToI1 != null) && (i >= 0) && (i < FlowToI1.Length)) { FlowToI1[i] = value; }; break; + case 2: if ((FlowToI2 != null) && (i >= 0) && (i < FlowToI2.Length)) { FlowToI2[i] = value; }; break; + case 3: if ((FlowToI3 != null) && (i >= 0) && (i < FlowToI3.Length)) { FlowToI3[i] = value; }; break; + case 4: if ((FlowToI4 != null) && (i >= 0) && (i < FlowToI4.Length)) { FlowToI4[i] = value; }; break; + case 5: if ((FlowToI5 != null) && (i >= 0) && (i < FlowToI5.Length)) { FlowToI5[i] = value; }; break; + case 6: if ((FlowToI6 != null) && (i >= 0) && (i < FlowToI6.Length)) { FlowToI6[i] = value; }; break; + case 7: if ((FlowToI7 != null) && (i >= 0) && (i < FlowToI7.Length)) { FlowToI7[i] = value; }; break; + default: + break; + } + } + + + /// StatisticsDlg UI + public int SelectedRadioButtonNumber; + + + /// MainWnd + public int MainWndLeft; + public int MainWndTop; + public int MainWndWidth; + public int MainWndHeight; + public bool ManiWndMaximized; + public int SplitterDistance; + + + /// + /// Default constructor which is used to create default settings + /// + public LocalSettings() + { +#if GENESIS + Language = "DE"; + + BenchNames = new string[] { "Genesis" }; + + ConnectionStrings = new string[] + { + "SERVER=localhost; DATABASE=genesis-r; UID=root; PASSWORD=; CHARSET=utf8;", + }; + + MidNames = new string[] { string.Empty, "I11", "I12", "I2", "I3", "I4", "I5" }; /// Index is MID-id +#else + Language = "SK"; + + BenchNames = new string[] { "WR10", "WR11", "WR13", "WR14", "WR15", "PT7" }; + + ConnectionStrings = new string[] + { + "SERVER=10.42.128.93; DATABASE=st-wr10-r; UID=vysledky; PASSWORD=GAqx76QUB6NbnpZP; CHARSET=utf8;", + "SERVER=10.42.128.102; DATABASE=st-wr11-r; UID=vysledky; PASSWORD=GAqx76QUB6NbnpZP; CHARSET=utf8;", + "SERVER=10.42.128.89; DATABASE=st-wr13-r; UID=vysledky; PASSWORD=GAqx76QUB6NbnpZP; CHARSET=utf8;", + "SERVER=10.42.128.213; DATABASE=st-wr14-r; UID=vysledky; PASSWORD=GAqx76QUB6NbnpZP; CHARSET=utf8;", + "SERVER=10.42.128.214; DATABASE=st-wr15-r; UID=vysledky; PASSWORD=GAqx76QUB6NbnpZP; CHARSET=utf8;", + "SERVER=10.42.129.26; DATABASE=iperlspecial-r; UID=vysledky; PASSWORD=GAqx76QUB6NbnpZP; CHARSET=utf8;", + }; + + MidNames = new string[] { string.Empty, "I1", "I2", "I3", "I4" }; /// Index is MID-id +#endif + FlowEnabledI1 = new bool[FlowsCount]; + FlowEnabledI2 = new bool[FlowsCount]; + FlowEnabledI3 = new bool[FlowsCount]; + FlowEnabledI4 = new bool[FlowsCount]; + FlowEnabledI5 = new bool[FlowsCount]; + FlowEnabledI6 = new bool[FlowsCount]; + FlowEnabledI7 = new bool[FlowsCount]; + + FlowFromI1 = new double[FlowsCount]; + FlowFromI2 = new double[FlowsCount]; + FlowFromI3 = new double[FlowsCount]; + FlowFromI4 = new double[FlowsCount]; + FlowFromI5 = new double[FlowsCount]; + FlowFromI6 = new double[FlowsCount]; + FlowFromI7 = new double[FlowsCount]; + + FlowToI1 = new double[FlowsCount]; + FlowToI2 = new double[FlowsCount]; + FlowToI3 = new double[FlowsCount]; + FlowToI4 = new double[FlowsCount]; + FlowToI5 = new double[FlowsCount]; + FlowToI6 = new double[FlowsCount]; + FlowToI7 = new double[FlowsCount]; + + SelectedRadioButtonNumber = 1; + } + + /// + /// Load local settings (public fields of this class) from the XML file. + /// + public static LocalSettings Load(string fileName) + { + try + { + using (TextReader reader = new StreamReader(fileName)) + { + LocalSettings ls = (new XmlSerializer(typeof(LocalSettings))).Deserialize(reader) as LocalSettings; + // Copy the settings just in case De-serialize() completes OK + return ls; + } + } + catch (Exception e) + { + string msg = e.Message; + return null; + } + } + + /// + /// Save local settings (public fields of this class) to the XML file. + /// + public void Save() + { + try + { + using (TextWriter writer = new StreamWriter(Program.LocalSettingsFileName)) + { + (new XmlSerializer(typeof(LocalSettings))).Serialize(writer, this); + } + } + catch (Exception e) + { + string msg = e.Message; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/Statistics/Program.cs b/TBF_V2/Sources/TBF/Statistics/Program.cs new file mode 100644 index 00000000..468e9d52 --- /dev/null +++ b/TBF_V2/Sources/TBF/Statistics/Program.cs @@ -0,0 +1,101 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.IO; +using System.Windows.Forms; +using Statistics.Resources; + +namespace Statistics +{ + static class Program + { + /// Program information + public static string Version; /// version string + public static DateTime BuildDateTime; /// date and time of program build + + /// Local settings + public static string ExecutableDirectory; + public static string ConfigDirectory; + public static string LocalSettingsFileName; + public static string LocalSettingsBackupName; + public static LocalSettings LocalSettings; + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main(string[] args) + { + /// Program version string + System.Reflection.Assembly thisAssembly = System.Reflection.Assembly.GetExecutingAssembly(); + Version ver = thisAssembly.GetName().Version; + Version = string.Format("{0}.{1}.{2}", ver.Major, ver.Minor, ver.Build); + BuildDateTime = new System.IO.FileInfo(thisAssembly.Location).LastWriteTime; + + /// Local program configuration directory including the trailing backslash + ExecutableDirectory = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); +#if false + /// Config directory is a sibling directory of the executable directory + ConfigDirectory = Path.Combine(ExecutableDirectory, "..", string.Format("Cfg{0}", (args.Length >= 1) ? args[0] : string.Empty)); +#else + /// Config directory is a directory in 'C:\Users\username\AppData\Local' folder + ConfigDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), + string.Format("Statistics{0}", (args.Length >= 1) ? args[0] : string.Empty)); +#endif + LocalSettingsFileName = Path.Combine(ConfigDirectory, "config.xml"); + LocalSettingsBackupName = Path.Combine(ConfigDirectory, "config.backup.xml"); + + /// + /// Load the local settings + /// + LocalSettings = LocalSettings.Load(Program.LocalSettingsFileName); + if (LocalSettings == null) + { + /// Loading local seetings from regular config file failed. Use the backup + LocalSettings = LocalSettings.Load(Program.LocalSettingsBackupName); + if (LocalSettings == null) + { + MessageBox.Show(Strings.No_program_settings_found + Strings.Using_default_settings, + string.Empty, + MessageBoxButtons.OK, + MessageBoxIcon.Information); + + /// Create new default settings and save them + LocalSettings = new LocalSettings(); + Directory.CreateDirectory(ConfigDirectory); + LocalSettings.Save(); + } + else + { + LocalSettings.Save(); /// Save the settings to overwrite the wrong file + } + } + else + { + /// Loading local seetings from the regular config file was successful. Update the backup + File.Copy(Program.LocalSettingsFileName, Program.LocalSettingsBackupName, true); + } + + try + { + string culture = LocalSettings.Language.Replace('_', '-'); + System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(culture); + } + catch (Exception e) + { + string msg = e.Message; + MessageBox.Show(Strings.Selected_language_not_supported + Environment.NewLine + Strings.Using_English, + Strings.Warning, + MessageBoxButtons.OK, + MessageBoxIcon.Asterisk); + System.Threading.Thread.CurrentThread.CurrentUICulture = + new System.Globalization.CultureInfo("en"); + } + + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new StatisticsDlg()); + } + } +} diff --git a/TBF_V2/Sources/TBF/Statistics/Properties/AssemblyInfo.cs b/TBF_V2/Sources/TBF/Statistics/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..fc68d920 --- /dev/null +++ b/TBF_V2/Sources/TBF/Statistics/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Statistics")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Statistics")] +[assembly: AssemblyCopyright("Copyright © 2018")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("9e674819-ed89-4d9a-a4e8-3bf2cc69cfc2")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("2.18.1154.0")] +[assembly: AssemblyFileVersion("2.18.1154.0")] diff --git a/TBF_V2/Sources/TBF/Statistics/Properties/Resources.Designer.cs b/TBF_V2/Sources/TBF/Statistics/Properties/Resources.Designer.cs new file mode 100644 index 00000000..0d3adebf --- /dev/null +++ b/TBF_V2/Sources/TBF/Statistics/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Statistics.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Statistics.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/Statistics/Properties/Resources.resx b/TBF_V2/Sources/TBF/Statistics/Properties/Resources.resx new file mode 100644 index 00000000..af7dbebb --- /dev/null +++ b/TBF_V2/Sources/TBF/Statistics/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Statistics/Properties/Settings.Designer.cs b/TBF_V2/Sources/TBF/Statistics/Properties/Settings.Designer.cs new file mode 100644 index 00000000..3497f209 --- /dev/null +++ b/TBF_V2/Sources/TBF/Statistics/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Statistics.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/Statistics/Properties/Settings.settings b/TBF_V2/Sources/TBF/Statistics/Properties/Settings.settings new file mode 100644 index 00000000..39645652 --- /dev/null +++ b/TBF_V2/Sources/TBF/Statistics/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/TBF_V2/Sources/TBF/Statistics/Resources/Strings.Designer.cs b/TBF_V2/Sources/TBF/Statistics/Resources/Strings.Designer.cs new file mode 100644 index 00000000..e710f538 --- /dev/null +++ b/TBF_V2/Sources/TBF/Statistics/Resources/Strings.Designer.cs @@ -0,0 +1,207 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Statistics.Resources { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Strings { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Strings() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Statistics.Resources.Strings", typeof(Strings).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Flow. + /// + internal static string Flow { + get { + return ResourceManager.GetString("Flow", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to From. + /// + internal static string From { + get { + return ResourceManager.GetString("From", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to From / to. + /// + internal static string From_to { + get { + return ResourceManager.GetString("From_to", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Last 3 months. + /// + internal static string Last_3_months { + get { + return ResourceManager.GetString("Last_3_months", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Last month. + /// + internal static string Last_month { + get { + return ResourceManager.GetString("Last_month", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Last week. + /// + internal static string Last_week { + get { + return ResourceManager.GetString("Last_week", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No program settings found.. + /// + internal static string No_program_settings_found { + get { + return ResourceManager.GetString("No_program_settings_found", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to searching.... + /// + internal static string searching_ { + get { + return ResourceManager.GetString("searching_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Selected language is not supported.. + /// + internal static string Selected_language_not_supported { + get { + return ResourceManager.GetString("Selected_language_not_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Statistics. + /// + internal static string Statistics { + get { + return ResourceManager.GetString("Statistics", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Time period. + /// + internal static string Time_period { + get { + return ResourceManager.GetString("Time_period", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to To. + /// + internal static string To { + get { + return ResourceManager.GetString("To", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Default settings are used.. + /// + internal static string Using_default_settings { + get { + return ResourceManager.GetString("Using_default_settings", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to English will be used.. + /// + internal static string Using_English { + get { + return ResourceManager.GetString("Using_English", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Warning. + /// + internal static string Warning { + get { + return ResourceManager.GetString("Warning", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Water meters. + /// + internal static string Water_meters { + get { + return ResourceManager.GetString("Water_meters", resourceCulture); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/Statistics/Resources/Strings.resx b/TBF_V2/Sources/TBF/Statistics/Resources/Strings.resx new file mode 100644 index 00000000..7f9013b7 --- /dev/null +++ b/TBF_V2/Sources/TBF/Statistics/Resources/Strings.resx @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Flow + + + From + + + searching... + + + Statistics + + + Time period + + + To + + + Water meters + + + From / to + + + Last 3 months + + + Last month + + + Last week + + + No program settings found. + + + Selected language is not supported. + + + Default settings are used. + + + English will be used. + + + Warning + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Statistics/Resources/Strings.sk.resx b/TBF_V2/Sources/TBF/Statistics/Resources/Strings.sk.resx new file mode 100644 index 00000000..78b6cd60 --- /dev/null +++ b/TBF_V2/Sources/TBF/Statistics/Resources/Strings.sk.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Prietok + + + Od + + + hľadám... + + + Štatistiky + + + Časový úsek + + + Do + + + Vodomery + + + Od / do + + + Posledné 3 mesiace + + + Posledný mesiac + + + Posledný týždeň + + + Nebola nájdená konfigurácia programu. + + + Použijú sa štandardné nastavenia. + + + Upozornenie + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Statistics/Statistics.csproj b/TBF_V2/Sources/TBF/Statistics/Statistics.csproj new file mode 100644 index 00000000..b4fcb650 --- /dev/null +++ b/TBF_V2/Sources/TBF/Statistics/Statistics.csproj @@ -0,0 +1,147 @@ + + + + Debug + x86 + 8.0.30703 + 2.0 + {36755E1D-6FC3-4D9C-8DD3-0250D51532E0} + WinExe + Properties + Statistics + Statistics + v4.0 + + + 512 + + + x86 + true + full + false + bin\Debug\ + TRACE;DEBUG;GENESIS + prompt + 4 + + + x86 + pdbonly + true + bin\Release\ + TRACE;GENESIS + prompt + 4 + + + + ..\packages\FluentNHibernate.2.0.3.0\lib\net40\FluentNHibernate.dll + + + ..\packages\Iesi.Collections.4.0.0.4000\lib\net40\Iesi.Collections.dll + + + ..\packages\MySql.Data.6.6.5\lib\net40\MySql.Data.dll + + + ..\packages\NHibernate.4.0.4.4000\lib\net40\NHibernate.dll + + + + + + + + + + + + + + + + Form + + + ModelessForm.cs + + + + True + True + Strings.resx + + + Form + + + StatisticsDlg.cs + + + + + UserControl + + + MidOrWaterMetersCtrl.cs + + + UserControl + + + StatisticsCtrl.cs + + + ModelessForm.cs + + + ResXFileCodeGenerator + Strings.Designer.cs + + + + StatisticsDlg.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + MidOrWaterMetersCtrl.cs + + + StatisticsCtrl.cs + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB} + Results + + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Statistics/StatisticsDlg.Designer.cs b/TBF_V2/Sources/TBF/Statistics/StatisticsDlg.Designer.cs new file mode 100644 index 00000000..12fede15 --- /dev/null +++ b/TBF_V2/Sources/TBF/Statistics/StatisticsDlg.Designer.cs @@ -0,0 +1,207 @@ +namespace Statistics +{ + partial class StatisticsDlg + { + /// + /// 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() + { + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.radioButton4 = new System.Windows.Forms.RadioButton(); + this.radioButton3 = new System.Windows.Forms.RadioButton(); + this.radioButton2 = new System.Windows.Forms.RadioButton(); + this.radioButton1 = new System.Windows.Forms.RadioButton(); + this.timePeriodGroupBox = new System.Windows.Forms.GroupBox(); + this.toLabel1 = new System.Windows.Forms.Label(); + this.fromLabel1 = new System.Windows.Forms.Label(); + this.dateTimeFromPicker = new System.Windows.Forms.DateTimePicker(); + this.dateTimeToPicker = new System.Windows.Forms.DateTimePicker(); + this.midsTabControl = new System.Windows.Forms.TabControl(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.timePeriodGroupBox.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer1.IsSplitterFixed = true; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.radioButton4); + this.splitContainer1.Panel1.Controls.Add(this.radioButton3); + this.splitContainer1.Panel1.Controls.Add(this.radioButton2); + this.splitContainer1.Panel1.Controls.Add(this.radioButton1); + this.splitContainer1.Panel1.Controls.Add(this.timePeriodGroupBox); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.midsTabControl); + this.splitContainer1.Size = new System.Drawing.Size(1368, 826); + this.splitContainer1.SplitterDistance = 90; + this.splitContainer1.TabIndex = 0; + // + // radioButton4 + // + this.radioButton4.AutoSize = true; + this.radioButton4.Location = new System.Drawing.Point(136, 12); + this.radioButton4.Name = "radioButton4"; + this.radioButton4.Size = new System.Drawing.Size(68, 17); + this.radioButton4.TabIndex = 6; + this.radioButton4.TabStop = true; + this.radioButton4.Text = "From / to"; + this.radioButton4.UseVisualStyleBackColor = true; + this.radioButton4.CheckedChanged += new System.EventHandler(this.radioButton4_CheckedChanged); + // + // radioButton3 + // + this.radioButton3.AutoSize = true; + this.radioButton3.Location = new System.Drawing.Point(12, 58); + this.radioButton3.Name = "radioButton3"; + this.radioButton3.Size = new System.Drawing.Size(91, 17); + this.radioButton3.TabIndex = 5; + this.radioButton3.TabStop = true; + this.radioButton3.Text = "Last 3 months"; + this.radioButton3.UseVisualStyleBackColor = true; + // + // radioButton2 + // + this.radioButton2.AutoSize = true; + this.radioButton2.Location = new System.Drawing.Point(12, 35); + this.radioButton2.Name = "radioButton2"; + this.radioButton2.Size = new System.Drawing.Size(77, 17); + this.radioButton2.TabIndex = 4; + this.radioButton2.TabStop = true; + this.radioButton2.Text = "Last month"; + this.radioButton2.UseVisualStyleBackColor = true; + // + // radioButton1 + // + this.radioButton1.AutoSize = true; + this.radioButton1.Location = new System.Drawing.Point(12, 12); + this.radioButton1.Name = "radioButton1"; + this.radioButton1.Size = new System.Drawing.Size(74, 17); + this.radioButton1.TabIndex = 3; + this.radioButton1.TabStop = true; + this.radioButton1.Text = "Last week"; + this.radioButton1.UseVisualStyleBackColor = true; + // + // timePeriodGroupBox + // + this.timePeriodGroupBox.Controls.Add(this.toLabel1); + this.timePeriodGroupBox.Controls.Add(this.fromLabel1); + this.timePeriodGroupBox.Controls.Add(this.dateTimeFromPicker); + this.timePeriodGroupBox.Controls.Add(this.dateTimeToPicker); + this.timePeriodGroupBox.Location = new System.Drawing.Point(210, 10); + this.timePeriodGroupBox.Name = "timePeriodGroupBox"; + this.timePeriodGroupBox.Size = new System.Drawing.Size(296, 74); + this.timePeriodGroupBox.TabIndex = 2; + this.timePeriodGroupBox.TabStop = false; + // + // toLabel1 + // + this.toLabel1.AutoSize = true; + this.toLabel1.Location = new System.Drawing.Point(31, 48); + this.toLabel1.Name = "toLabel1"; + this.toLabel1.Size = new System.Drawing.Size(20, 13); + this.toLabel1.TabIndex = 3; + this.toLabel1.Text = "To"; + // + // fromLabel1 + // + this.fromLabel1.AutoSize = true; + this.fromLabel1.Location = new System.Drawing.Point(31, 23); + this.fromLabel1.Name = "fromLabel1"; + this.fromLabel1.Size = new System.Drawing.Size(30, 13); + this.fromLabel1.TabIndex = 2; + this.fromLabel1.Text = "From"; + // + // dateTimeFromPicker + // + this.dateTimeFromPicker.Location = new System.Drawing.Point(81, 19); + this.dateTimeFromPicker.Name = "dateTimeFromPicker"; + this.dateTimeFromPicker.Size = new System.Drawing.Size(200, 20); + this.dateTimeFromPicker.TabIndex = 0; + // + // dateTimeToPicker + // + this.dateTimeToPicker.Location = new System.Drawing.Point(81, 44); + this.dateTimeToPicker.Name = "dateTimeToPicker"; + this.dateTimeToPicker.Size = new System.Drawing.Size(200, 20); + this.dateTimeToPicker.TabIndex = 1; + // + // midsTabControl + // + this.midsTabControl.Dock = System.Windows.Forms.DockStyle.Fill; + this.midsTabControl.Location = new System.Drawing.Point(0, 0); + this.midsTabControl.Name = "midsTabControl"; + this.midsTabControl.SelectedIndex = 0; + this.midsTabControl.Size = new System.Drawing.Size(1368, 732); + this.midsTabControl.TabIndex = 0; + // + // StatisticsDlg + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1368, 826); + this.Controls.Add(this.splitContainer1); + this.Name = "StatisticsDlg"; + this.Text = "MID Statistics"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.StatisticsDlg_FormClosing); + this.Load += new System.EventHandler(this.StatisticsDlg_Load); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel1.PerformLayout(); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + this.timePeriodGroupBox.ResumeLayout(false); + this.timePeriodGroupBox.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.GroupBox timePeriodGroupBox; + private System.Windows.Forms.DateTimePicker dateTimeFromPicker; + private System.Windows.Forms.DateTimePicker dateTimeToPicker; + private System.Windows.Forms.Label toLabel1; + private System.Windows.Forms.Label fromLabel1; + private System.Windows.Forms.RadioButton radioButton3; + private System.Windows.Forms.RadioButton radioButton2; + private System.Windows.Forms.RadioButton radioButton1; + private System.Windows.Forms.RadioButton radioButton4; + private System.Windows.Forms.TabControl midsTabControl; + } +} + diff --git a/TBF_V2/Sources/TBF/Statistics/StatisticsDlg.cs b/TBF_V2/Sources/TBF/Statistics/StatisticsDlg.cs new file mode 100644 index 00000000..fbc101db --- /dev/null +++ b/TBF_V2/Sources/TBF/Statistics/StatisticsDlg.cs @@ -0,0 +1,267 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using NHibernate; +using FluentNHibernate; +using FluentNHibernate.Cfg; +using FluentNHibernate.Cfg.Db; +using Results; +using Results.Entities; +using Statistics.Resources; +using Statistics.UserControls; +using System.Threading; +using System.Globalization; + +namespace Statistics +{ + public partial class StatisticsDlg : Form + { + static ISessionFactory[] sessionFactories = new ISessionFactory[Program.LocalSettings.ConnectionStrings.Length]; + + + public StatisticsDlg() + { + InitializeComponent(); + + ///ManageCheckGroupBox(timePeriodCheckBox, timePeriodGroupBox); + + for (int midId = 1; midId < Program.LocalSettings.MidNames.Length; midId++) + { + TabPage tp = new TabPage(); + tp.Text = Program.LocalSettings.MidNames[midId]; + + MidOrWaterMetersCtrl ctrl = new MidOrWaterMetersCtrl(); + ctrl.MidId = midId; + ctrl.Parent = this; + ctrl.Dock = DockStyle.Fill; + + tp.Controls.Add(ctrl); + midsTabControl.TabPages.Add(tp); + } + + radioButton1.Checked = true; + timePeriodGroupBox.Enabled = false; + + Localize(); + } + + void Localize() + { + Text = string.Format("MID {0}", Strings.Statistics); + //timePeriodCheckBox.Text = Strings.Time_period; + fromLabel1.Text = Strings.From; + toLabel1.Text = Strings.To; + radioButton1.Text = Strings.Last_week; + radioButton2.Text = Strings.Last_month; + radioButton3.Text = Strings.Last_3_months; + radioButton4.Text = Strings.From_to; + } + + private void StatisticsDlg_Load(object sender, EventArgs e) + { + Statistics.LocalSettings ls = Program.LocalSettings; + Width = (ls.MainWndWidth > 0) ? ls.MainWndWidth : 1000; + Height = (ls.MainWndHeight > 0) ? ls.MainWndHeight : 750; + Left = (ls.MainWndLeft != 0) ? ls.MainWndLeft : 50; + Top = (ls.MainWndTop != 0) ? ls.MainWndTop : 50; + + switch (ls.SelectedRadioButtonNumber) + { + case 1: radioButton1.Checked = true; break; + case 2: radioButton2.Checked = true; break; + case 3: radioButton3.Checked = true; break; + case 4: radioButton4.Checked = true; break; + } + + for (int i = 1; i < Program.LocalSettings.MidNames.Length; i++) + { + (midsTabControl.TabPages[i - 1].Controls[0] as MidOrWaterMetersCtrl).Data2UI(); + } + + for (int i = 0; i < Program.LocalSettings.ConnectionStrings.Length; i++) + { + if (!string.IsNullOrEmpty(Program.LocalSettings.GetConnectionString(i))) + { + sessionFactories[i] = null; + try + { + sessionFactories[i] = Fluently.Configure() + .Database(MySQLConfiguration.Standard.ConnectionString(Program.LocalSettings.GetConnectionString(i))) + .Mappings(m => m.FluentMappings.AddFromAssemblyOf()) + .ExposeConfiguration(BuildSchema) + .BuildSessionFactory(); + } + catch (Exception) + { + MessageBox.Show(string.Format("Cannot open one of database of {0}", Program.LocalSettings.GetBenchName(i)), "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + } + } + } + } + + void BuildSchema(NHibernate.Cfg.Configuration config) + { + /// This NHibernate tool takes a configuration with mapping info and exports a database schema + new NHibernate.Tool.hbm2ddl.SchemaExport(config).SetOutputFile("db_schema"); + } + + private void ManageCheckGroupBox(CheckBox chk, GroupBox grp) + { + /// Make sure the CheckBox isn't in the GroupBox. This will only happen the first time. + if (chk.Parent == grp) + { + grp.Parent.Controls.Add(chk); /// Reparent the CheckBox so it's not in the GroupBox. + chk.Location = new Point(chk.Left + grp.Left, chk.Top + grp.Top); /// Adjust the CheckBox's location. + chk.BringToFront(); /// Move the CheckBox to the top of the stacking order. + } + + /// Enable or disable the GroupBox. + grp.Enabled = chk.Checked; + } + + //private void timePeriodCheckBox_CheckedChanged(object sender, EventArgs e) + //{ + // ManageCheckGroupBox(timePeriodCheckBox, timePeriodGroupBox); + //} + + + /// + /// Called by a child form. + /// Reads and returns results from DB required by the child form to update it's content. + /// + /// 0-based bench Id. + /// 1-based MID Id. + /// Required test results + public IList UpdateRequest(int benchId, int midId) + { + if ((benchId < 0) || (benchId >= Program.LocalSettings.BenchNames.Length) || (sessionFactories[benchId] == null)) + { + MessageBox.Show(string.Format("Cannot load statistics of {0}", Program.LocalSettings.GetBenchName(benchId))); + return null; + } + + Thread thread = new Thread(() => Application.Run(new Forms.ModelessForm() + { + Title = string.Empty, + Message = Strings.searching_, + BackgroundColor = Color.LightGreen, + FontFamily = "Arial", + FontSize = 14, + FontStyle = FontStyle.Regular, + })); + thread.CurrentCulture = CultureInfo.CurrentCulture; + thread.CurrentUICulture = CultureInfo.CurrentUICulture; + thread.Start(); + + DateTime from; + DateTime to; + GetDateRange(out from, out to); + + try + { + ISession session = sessionFactories[benchId].OpenSession(); + var listOfComponentsWithFlowmeter = session.QueryOver() + .Where(x => (x.Flowmeter == Program.LocalSettings.MidNames[midId])) + .List(); + IList testRslts = new List(); + foreach (var cmpnts in listOfComponentsWithFlowmeter) + { + var listOfRslts = session.QueryOver() + .Where(x => ((x.EndTime >= from) && (x.EndTime <= to))) + .And(x => (x.Components == cmpnts)) + .List(); + foreach (var tr in listOfRslts) testRslts.Add(tr); + } + + Forms.ModelessForm.CloseForm(); + session.Close(); + return testRslts; + } + catch (Exception exc) + { + Forms.ModelessForm.CloseForm(); + MessageBox.Show(string.Format("Error loading statistics of {0}\r\n{1}", Program.LocalSettings.GetBenchName(benchId), exc.Message)); + return null; + } + } + + void GetDateRange(out DateTime from, out DateTime to) + { + if (radioButton1.Checked) + { + /// Last week + from = DateTime.Now.Date.AddDays(-7); + to = DateTime.Now; + } + else if (radioButton2.Checked) + { + /// Last month + from = DateTime.Now.Date.AddDays(-31); + to = DateTime.Now; + } + else if (radioButton3.Checked) + { + /// Last 3 months + from = DateTime.Now.Date.AddDays(-91); + to = DateTime.Now; + } + else + { + /// From / to + from = dateTimeFromPicker.Value.Date; + to = dateTimeToPicker.Value.Date.AddDays(1).AddTicks(-1); + } + } + + private void radioButton4_CheckedChanged(object sender, EventArgs e) + { + timePeriodGroupBox.Enabled = radioButton4.Checked; + } + + private void StatisticsDlg_FormClosing(object sender, FormClosingEventArgs e) + { + LocalSettings ls = Program.LocalSettings; + + ls.ManiWndMaximized = (WindowState == FormWindowState.Maximized); + if (WindowState == FormWindowState.Normal) + { + ls.MainWndLeft = Location.X; + ls.MainWndTop = Location.Y; + ls.MainWndWidth = Size.Width; + ls.MainWndHeight = Size.Height; + } + else + { + /// Maximized or minimized (when restarted, minimized window is restored as normal) + ls.MainWndLeft = RestoreBounds.Left; + ls.MainWndTop = RestoreBounds.Top; + ls.MainWndWidth = RestoreBounds.Width; + ls.MainWndHeight = RestoreBounds.Height; + } + + if (radioButton1.Checked) ls.SelectedRadioButtonNumber = 1; + else if (radioButton2.Checked) ls.SelectedRadioButtonNumber = 2; + else if (radioButton3.Checked) ls.SelectedRadioButtonNumber = 3; + else if (radioButton4.Checked) ls.SelectedRadioButtonNumber = 4; + else ls.SelectedRadioButtonNumber = 0; + + for (int i = 1; i < Math.Min(Program.LocalSettings.MidNames.Length, midsTabControl.TabPages.Count + 1); i++) + { + if (midsTabControl.TabPages[i - 1].Controls.Count > 0 && midsTabControl.TabPages[i - 1].Controls[0] is MidOrWaterMetersCtrl) + { + (midsTabControl.TabPages[i - 1].Controls[0] as MidOrWaterMetersCtrl).UI2Data(); + } + } + + ls.Save(); + } + } +} diff --git a/TBF_V2/Sources/TBF/Statistics/StatisticsDlg.resx b/TBF_V2/Sources/TBF/Statistics/StatisticsDlg.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/Statistics/StatisticsDlg.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Statistics/UserControls/MidOrWaterMetersCtrl.Designer.cs b/TBF_V2/Sources/TBF/Statistics/UserControls/MidOrWaterMetersCtrl.Designer.cs new file mode 100644 index 00000000..fc3c9939 --- /dev/null +++ b/TBF_V2/Sources/TBF/Statistics/UserControls/MidOrWaterMetersCtrl.Designer.cs @@ -0,0 +1,717 @@ +namespace Statistics.UserControls +{ + partial class MidOrWaterMetersCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.flow5GroupBox = new System.Windows.Forms.GroupBox(); + this.flow5ToExclamation = new System.Windows.Forms.Label(); + this.flow5FromExclamation = new System.Windows.Forms.Label(); + this.label9 = new System.Windows.Forms.Label(); + this.label10 = new System.Windows.Forms.Label(); + this.toLabel6 = new System.Windows.Forms.Label(); + this.fromLabel6 = new System.Windows.Forms.Label(); + this.flow5ToTextBox = new System.Windows.Forms.TextBox(); + this.flow5FromTextBox = new System.Windows.Forms.TextBox(); + this.flow5CheckBox = new System.Windows.Forms.CheckBox(); + this.flow4GroupBox = new System.Windows.Forms.GroupBox(); + this.flow4ToExclamation = new System.Windows.Forms.Label(); + this.flow4FromExclamation = new System.Windows.Forms.Label(); + this.label7 = new System.Windows.Forms.Label(); + this.label8 = new System.Windows.Forms.Label(); + this.toLabel5 = new System.Windows.Forms.Label(); + this.fromLabel5 = new System.Windows.Forms.Label(); + this.flow4ToTextBox = new System.Windows.Forms.TextBox(); + this.flow4FromTextBox = new System.Windows.Forms.TextBox(); + this.flow4CheckBox = new System.Windows.Forms.CheckBox(); + this.flow3GroupBox = new System.Windows.Forms.GroupBox(); + this.flow3ToExclamation = new System.Windows.Forms.Label(); + this.flow3FromExclamation = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.toLabel4 = new System.Windows.Forms.Label(); + this.fromLabel4 = new System.Windows.Forms.Label(); + this.flow3ToTextBox = new System.Windows.Forms.TextBox(); + this.flow3FromTextBox = new System.Windows.Forms.TextBox(); + this.flow3CheckBox = new System.Windows.Forms.CheckBox(); + this.flow2GroupBox = new System.Windows.Forms.GroupBox(); + this.flow2ToExclamation = new System.Windows.Forms.Label(); + this.flow2FromExclamation = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.toLabel3 = new System.Windows.Forms.Label(); + this.fromLabel3 = new System.Windows.Forms.Label(); + this.flow2ToTextBox = new System.Windows.Forms.TextBox(); + this.flow2FromTextBox = new System.Windows.Forms.TextBox(); + this.flow2CheckBox = new System.Windows.Forms.CheckBox(); + this.flow1GroupBox = new System.Windows.Forms.GroupBox(); + this.flow1ToExclamation = new System.Windows.Forms.Label(); + this.flow1FromExclamation = new System.Windows.Forms.Label(); + this.m3hLabel2 = new System.Windows.Forms.Label(); + this.m3hLabel1 = new System.Windows.Forms.Label(); + this.toLabel2 = new System.Windows.Forms.Label(); + this.fromLabel2 = new System.Windows.Forms.Label(); + this.flow1ToTextBox = new System.Windows.Forms.TextBox(); + this.flow1FromTextBox = new System.Windows.Forms.TextBox(); + this.flow1CheckBox = new System.Windows.Forms.CheckBox(); + this.benchesTabControl = new System.Windows.Forms.TabControl(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.flow5GroupBox.SuspendLayout(); + this.flow4GroupBox.SuspendLayout(); + this.flow3GroupBox.SuspendLayout(); + this.flow2GroupBox.SuspendLayout(); + this.flow1GroupBox.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer1.IsSplitterFixed = true; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.flow5GroupBox); + this.splitContainer1.Panel1.Controls.Add(this.flow4GroupBox); + this.splitContainer1.Panel1.Controls.Add(this.flow3GroupBox); + this.splitContainer1.Panel1.Controls.Add(this.flow2GroupBox); + this.splitContainer1.Panel1.Controls.Add(this.flow1GroupBox); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.benchesTabControl); + this.splitContainer1.Size = new System.Drawing.Size(1202, 450); + this.splitContainer1.SplitterDistance = 90; + this.splitContainer1.TabIndex = 0; + // + // flow5GroupBox + // + this.flow5GroupBox.Controls.Add(this.flow5ToExclamation); + this.flow5GroupBox.Controls.Add(this.flow5FromExclamation); + this.flow5GroupBox.Controls.Add(this.label9); + this.flow5GroupBox.Controls.Add(this.label10); + this.flow5GroupBox.Controls.Add(this.toLabel6); + this.flow5GroupBox.Controls.Add(this.fromLabel6); + this.flow5GroupBox.Controls.Add(this.flow5ToTextBox); + this.flow5GroupBox.Controls.Add(this.flow5FromTextBox); + this.flow5GroupBox.Controls.Add(this.flow5CheckBox); + this.flow5GroupBox.Location = new System.Drawing.Point(939, 7); + this.flow5GroupBox.Name = "flow5GroupBox"; + this.flow5GroupBox.Size = new System.Drawing.Size(221, 77); + this.flow5GroupBox.TabIndex = 8; + this.flow5GroupBox.TabStop = false; + // + // flow5ToExclamation + // + this.flow5ToExclamation.AutoSize = true; + this.flow5ToExclamation.ForeColor = System.Drawing.Color.Red; + this.flow5ToExclamation.Location = new System.Drawing.Point(167, 48); + this.flow5ToExclamation.Name = "flow5ToExclamation"; + this.flow5ToExclamation.Size = new System.Drawing.Size(10, 13); + this.flow5ToExclamation.TabIndex = 9; + this.flow5ToExclamation.Text = "!"; + this.flow5ToExclamation.Visible = false; + // + // flow5FromExclamation + // + this.flow5FromExclamation.AutoSize = true; + this.flow5FromExclamation.ForeColor = System.Drawing.Color.Red; + this.flow5FromExclamation.Location = new System.Drawing.Point(167, 24); + this.flow5FromExclamation.Name = "flow5FromExclamation"; + this.flow5FromExclamation.Size = new System.Drawing.Size(10, 13); + this.flow5FromExclamation.TabIndex = 8; + this.flow5FromExclamation.Text = "!"; + this.flow5FromExclamation.Visible = false; + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Location = new System.Drawing.Point(178, 48); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(32, 13); + this.label9.TabIndex = 6; + this.label9.Text = "m3/h"; + // + // label10 + // + this.label10.AutoSize = true; + this.label10.Location = new System.Drawing.Point(177, 23); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(32, 13); + this.label10.TabIndex = 5; + this.label10.Text = "m3/h"; + // + // toLabel6 + // + this.toLabel6.AutoSize = true; + this.toLabel6.Location = new System.Drawing.Point(14, 48); + this.toLabel6.Name = "toLabel6"; + this.toLabel6.Size = new System.Drawing.Size(20, 13); + this.toLabel6.TabIndex = 4; + this.toLabel6.Text = "To"; + // + // fromLabel6 + // + this.fromLabel6.AutoSize = true; + this.fromLabel6.Location = new System.Drawing.Point(14, 23); + this.fromLabel6.Name = "fromLabel6"; + this.fromLabel6.Size = new System.Drawing.Size(30, 13); + this.fromLabel6.TabIndex = 3; + this.fromLabel6.Text = "From"; + // + // flow5ToTextBox + // + this.flow5ToTextBox.Location = new System.Drawing.Point(65, 45); + this.flow5ToTextBox.Name = "flow5ToTextBox"; + this.flow5ToTextBox.Size = new System.Drawing.Size(100, 20); + this.flow5ToTextBox.TabIndex = 2; + this.flow5ToTextBox.TextChanged += new System.EventHandler(this.flow5ToTextBox_TextChanged); + // + // flow5FromTextBox + // + this.flow5FromTextBox.Location = new System.Drawing.Point(65, 20); + this.flow5FromTextBox.Name = "flow5FromTextBox"; + this.flow5FromTextBox.Size = new System.Drawing.Size(100, 20); + this.flow5FromTextBox.TabIndex = 1; + this.flow5FromTextBox.TextChanged += new System.EventHandler(this.flow5FromTextBox_TextChanged); + // + // flow5CheckBox + // + this.flow5CheckBox.AutoSize = true; + this.flow5CheckBox.Location = new System.Drawing.Point(10, 0); + this.flow5CheckBox.Name = "flow5CheckBox"; + this.flow5CheckBox.Size = new System.Drawing.Size(57, 17); + this.flow5CheckBox.TabIndex = 0; + this.flow5CheckBox.Text = "Flow 5"; + this.flow5CheckBox.UseVisualStyleBackColor = true; + this.flow5CheckBox.CheckedChanged += new System.EventHandler(this.flow5CheckBox_CheckedChanged); + // + // flow4GroupBox + // + this.flow4GroupBox.Controls.Add(this.flow4ToExclamation); + this.flow4GroupBox.Controls.Add(this.flow4FromExclamation); + this.flow4GroupBox.Controls.Add(this.label7); + this.flow4GroupBox.Controls.Add(this.label8); + this.flow4GroupBox.Controls.Add(this.toLabel5); + this.flow4GroupBox.Controls.Add(this.fromLabel5); + this.flow4GroupBox.Controls.Add(this.flow4ToTextBox); + this.flow4GroupBox.Controls.Add(this.flow4FromTextBox); + this.flow4GroupBox.Controls.Add(this.flow4CheckBox); + this.flow4GroupBox.Location = new System.Drawing.Point(706, 7); + this.flow4GroupBox.Name = "flow4GroupBox"; + this.flow4GroupBox.Size = new System.Drawing.Size(221, 77); + this.flow4GroupBox.TabIndex = 7; + this.flow4GroupBox.TabStop = false; + // + // flow4ToExclamation + // + this.flow4ToExclamation.AutoSize = true; + this.flow4ToExclamation.ForeColor = System.Drawing.Color.Red; + this.flow4ToExclamation.Location = new System.Drawing.Point(167, 48); + this.flow4ToExclamation.Name = "flow4ToExclamation"; + this.flow4ToExclamation.Size = new System.Drawing.Size(10, 13); + this.flow4ToExclamation.TabIndex = 9; + this.flow4ToExclamation.Text = "!"; + this.flow4ToExclamation.Visible = false; + // + // flow4FromExclamation + // + this.flow4FromExclamation.AutoSize = true; + this.flow4FromExclamation.ForeColor = System.Drawing.Color.Red; + this.flow4FromExclamation.Location = new System.Drawing.Point(167, 24); + this.flow4FromExclamation.Name = "flow4FromExclamation"; + this.flow4FromExclamation.Size = new System.Drawing.Size(10, 13); + this.flow4FromExclamation.TabIndex = 8; + this.flow4FromExclamation.Text = "!"; + this.flow4FromExclamation.Visible = false; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(178, 48); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(32, 13); + this.label7.TabIndex = 6; + this.label7.Text = "m3/h"; + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Location = new System.Drawing.Point(177, 23); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(32, 13); + this.label8.TabIndex = 5; + this.label8.Text = "m3/h"; + // + // toLabel5 + // + this.toLabel5.AutoSize = true; + this.toLabel5.Location = new System.Drawing.Point(14, 48); + this.toLabel5.Name = "toLabel5"; + this.toLabel5.Size = new System.Drawing.Size(20, 13); + this.toLabel5.TabIndex = 4; + this.toLabel5.Text = "To"; + // + // fromLabel5 + // + this.fromLabel5.AutoSize = true; + this.fromLabel5.Location = new System.Drawing.Point(14, 23); + this.fromLabel5.Name = "fromLabel5"; + this.fromLabel5.Size = new System.Drawing.Size(30, 13); + this.fromLabel5.TabIndex = 3; + this.fromLabel5.Text = "From"; + // + // flow4ToTextBox + // + this.flow4ToTextBox.Location = new System.Drawing.Point(65, 45); + this.flow4ToTextBox.Name = "flow4ToTextBox"; + this.flow4ToTextBox.Size = new System.Drawing.Size(100, 20); + this.flow4ToTextBox.TabIndex = 2; + this.flow4ToTextBox.TextChanged += new System.EventHandler(this.flow4ToTextBox_TextChanged); + // + // flow4FromTextBox + // + this.flow4FromTextBox.Location = new System.Drawing.Point(65, 20); + this.flow4FromTextBox.Name = "flow4FromTextBox"; + this.flow4FromTextBox.Size = new System.Drawing.Size(100, 20); + this.flow4FromTextBox.TabIndex = 1; + this.flow4FromTextBox.TextChanged += new System.EventHandler(this.flow4FromTextBox_TextChanged); + // + // flow4CheckBox + // + this.flow4CheckBox.AutoSize = true; + this.flow4CheckBox.Location = new System.Drawing.Point(10, 0); + this.flow4CheckBox.Name = "flow4CheckBox"; + this.flow4CheckBox.Size = new System.Drawing.Size(57, 17); + this.flow4CheckBox.TabIndex = 0; + this.flow4CheckBox.Text = "Flow 4"; + this.flow4CheckBox.UseVisualStyleBackColor = true; + this.flow4CheckBox.CheckedChanged += new System.EventHandler(this.flow4CheckBox_CheckedChanged); + // + // flow3GroupBox + // + this.flow3GroupBox.Controls.Add(this.flow3ToExclamation); + this.flow3GroupBox.Controls.Add(this.flow3FromExclamation); + this.flow3GroupBox.Controls.Add(this.label3); + this.flow3GroupBox.Controls.Add(this.label4); + this.flow3GroupBox.Controls.Add(this.toLabel4); + this.flow3GroupBox.Controls.Add(this.fromLabel4); + this.flow3GroupBox.Controls.Add(this.flow3ToTextBox); + this.flow3GroupBox.Controls.Add(this.flow3FromTextBox); + this.flow3GroupBox.Controls.Add(this.flow3CheckBox); + this.flow3GroupBox.Location = new System.Drawing.Point(473, 7); + this.flow3GroupBox.Name = "flow3GroupBox"; + this.flow3GroupBox.Size = new System.Drawing.Size(221, 77); + this.flow3GroupBox.TabIndex = 6; + this.flow3GroupBox.TabStop = false; + // + // flow3ToExclamation + // + this.flow3ToExclamation.AutoSize = true; + this.flow3ToExclamation.ForeColor = System.Drawing.Color.Red; + this.flow3ToExclamation.Location = new System.Drawing.Point(167, 48); + this.flow3ToExclamation.Name = "flow3ToExclamation"; + this.flow3ToExclamation.Size = new System.Drawing.Size(10, 13); + this.flow3ToExclamation.TabIndex = 9; + this.flow3ToExclamation.Text = "!"; + this.flow3ToExclamation.Visible = false; + // + // flow3FromExclamation + // + this.flow3FromExclamation.AutoSize = true; + this.flow3FromExclamation.ForeColor = System.Drawing.Color.Red; + this.flow3FromExclamation.Location = new System.Drawing.Point(167, 24); + this.flow3FromExclamation.Name = "flow3FromExclamation"; + this.flow3FromExclamation.Size = new System.Drawing.Size(10, 13); + this.flow3FromExclamation.TabIndex = 8; + this.flow3FromExclamation.Text = "!"; + this.flow3FromExclamation.Visible = false; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(178, 48); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(32, 13); + this.label3.TabIndex = 6; + this.label3.Text = "m3/h"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(177, 23); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(32, 13); + this.label4.TabIndex = 5; + this.label4.Text = "m3/h"; + // + // toLabel4 + // + this.toLabel4.AutoSize = true; + this.toLabel4.Location = new System.Drawing.Point(14, 48); + this.toLabel4.Name = "toLabel4"; + this.toLabel4.Size = new System.Drawing.Size(20, 13); + this.toLabel4.TabIndex = 4; + this.toLabel4.Text = "To"; + // + // fromLabel4 + // + this.fromLabel4.AutoSize = true; + this.fromLabel4.Location = new System.Drawing.Point(14, 23); + this.fromLabel4.Name = "fromLabel4"; + this.fromLabel4.Size = new System.Drawing.Size(30, 13); + this.fromLabel4.TabIndex = 3; + this.fromLabel4.Text = "From"; + // + // flow3ToTextBox + // + this.flow3ToTextBox.Location = new System.Drawing.Point(65, 45); + this.flow3ToTextBox.Name = "flow3ToTextBox"; + this.flow3ToTextBox.Size = new System.Drawing.Size(100, 20); + this.flow3ToTextBox.TabIndex = 2; + this.flow3ToTextBox.TextChanged += new System.EventHandler(this.flow3ToTextBox_TextChanged); + // + // flow3FromTextBox + // + this.flow3FromTextBox.Location = new System.Drawing.Point(65, 20); + this.flow3FromTextBox.Name = "flow3FromTextBox"; + this.flow3FromTextBox.Size = new System.Drawing.Size(100, 20); + this.flow3FromTextBox.TabIndex = 1; + this.flow3FromTextBox.TextChanged += new System.EventHandler(this.flow3FromTextBox_TextChanged); + // + // flow3CheckBox + // + this.flow3CheckBox.AutoSize = true; + this.flow3CheckBox.Location = new System.Drawing.Point(10, 0); + this.flow3CheckBox.Name = "flow3CheckBox"; + this.flow3CheckBox.Size = new System.Drawing.Size(57, 17); + this.flow3CheckBox.TabIndex = 0; + this.flow3CheckBox.Text = "Flow 3"; + this.flow3CheckBox.UseVisualStyleBackColor = true; + this.flow3CheckBox.CheckedChanged += new System.EventHandler(this.flow3CheckBox_CheckedChanged); + // + // flow2GroupBox + // + this.flow2GroupBox.Controls.Add(this.flow2ToExclamation); + this.flow2GroupBox.Controls.Add(this.flow2FromExclamation); + this.flow2GroupBox.Controls.Add(this.label1); + this.flow2GroupBox.Controls.Add(this.label2); + this.flow2GroupBox.Controls.Add(this.toLabel3); + this.flow2GroupBox.Controls.Add(this.fromLabel3); + this.flow2GroupBox.Controls.Add(this.flow2ToTextBox); + this.flow2GroupBox.Controls.Add(this.flow2FromTextBox); + this.flow2GroupBox.Controls.Add(this.flow2CheckBox); + this.flow2GroupBox.Location = new System.Drawing.Point(240, 7); + this.flow2GroupBox.Name = "flow2GroupBox"; + this.flow2GroupBox.Size = new System.Drawing.Size(221, 77); + this.flow2GroupBox.TabIndex = 5; + this.flow2GroupBox.TabStop = false; + // + // flow2ToExclamation + // + this.flow2ToExclamation.AutoSize = true; + this.flow2ToExclamation.ForeColor = System.Drawing.Color.Red; + this.flow2ToExclamation.Location = new System.Drawing.Point(167, 49); + this.flow2ToExclamation.Name = "flow2ToExclamation"; + this.flow2ToExclamation.Size = new System.Drawing.Size(10, 13); + this.flow2ToExclamation.TabIndex = 9; + this.flow2ToExclamation.Text = "!"; + this.flow2ToExclamation.Visible = false; + // + // flow2FromExclamation + // + this.flow2FromExclamation.AutoSize = true; + this.flow2FromExclamation.ForeColor = System.Drawing.Color.Red; + this.flow2FromExclamation.Location = new System.Drawing.Point(167, 24); + this.flow2FromExclamation.Name = "flow2FromExclamation"; + this.flow2FromExclamation.Size = new System.Drawing.Size(10, 13); + this.flow2FromExclamation.TabIndex = 8; + this.flow2FromExclamation.Text = "!"; + this.flow2FromExclamation.Visible = false; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(178, 48); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(32, 13); + this.label1.TabIndex = 6; + this.label1.Text = "m3/h"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(177, 23); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(32, 13); + this.label2.TabIndex = 5; + this.label2.Text = "m3/h"; + // + // toLabel3 + // + this.toLabel3.AutoSize = true; + this.toLabel3.Location = new System.Drawing.Point(14, 48); + this.toLabel3.Name = "toLabel3"; + this.toLabel3.Size = new System.Drawing.Size(20, 13); + this.toLabel3.TabIndex = 4; + this.toLabel3.Text = "To"; + // + // fromLabel3 + // + this.fromLabel3.AutoSize = true; + this.fromLabel3.Location = new System.Drawing.Point(14, 23); + this.fromLabel3.Name = "fromLabel3"; + this.fromLabel3.Size = new System.Drawing.Size(30, 13); + this.fromLabel3.TabIndex = 3; + this.fromLabel3.Text = "From"; + // + // flow2ToTextBox + // + this.flow2ToTextBox.Location = new System.Drawing.Point(65, 45); + this.flow2ToTextBox.Name = "flow2ToTextBox"; + this.flow2ToTextBox.Size = new System.Drawing.Size(100, 20); + this.flow2ToTextBox.TabIndex = 2; + this.flow2ToTextBox.TextChanged += new System.EventHandler(this.flow2ToTextBox_TextChanged); + // + // flow2FromTextBox + // + this.flow2FromTextBox.Location = new System.Drawing.Point(65, 20); + this.flow2FromTextBox.Name = "flow2FromTextBox"; + this.flow2FromTextBox.Size = new System.Drawing.Size(100, 20); + this.flow2FromTextBox.TabIndex = 1; + this.flow2FromTextBox.TextChanged += new System.EventHandler(this.flow2FromTextBox_TextChanged); + // + // flow2CheckBox + // + this.flow2CheckBox.AutoSize = true; + this.flow2CheckBox.Location = new System.Drawing.Point(6, 0); + this.flow2CheckBox.Name = "flow2CheckBox"; + this.flow2CheckBox.Size = new System.Drawing.Size(57, 17); + this.flow2CheckBox.TabIndex = 0; + this.flow2CheckBox.Text = "Flow 2"; + this.flow2CheckBox.UseVisualStyleBackColor = true; + this.flow2CheckBox.CheckedChanged += new System.EventHandler(this.flow2CheckBox_CheckedChanged); + // + // flow1GroupBox + // + this.flow1GroupBox.Controls.Add(this.flow1ToExclamation); + this.flow1GroupBox.Controls.Add(this.flow1FromExclamation); + this.flow1GroupBox.Controls.Add(this.m3hLabel2); + this.flow1GroupBox.Controls.Add(this.m3hLabel1); + this.flow1GroupBox.Controls.Add(this.toLabel2); + this.flow1GroupBox.Controls.Add(this.fromLabel2); + this.flow1GroupBox.Controls.Add(this.flow1ToTextBox); + this.flow1GroupBox.Controls.Add(this.flow1FromTextBox); + this.flow1GroupBox.Controls.Add(this.flow1CheckBox); + this.flow1GroupBox.Location = new System.Drawing.Point(7, 7); + this.flow1GroupBox.Name = "flow1GroupBox"; + this.flow1GroupBox.Size = new System.Drawing.Size(221, 77); + this.flow1GroupBox.TabIndex = 4; + this.flow1GroupBox.TabStop = false; + // + // flow1ToExclamation + // + this.flow1ToExclamation.AutoSize = true; + this.flow1ToExclamation.ForeColor = System.Drawing.Color.Red; + this.flow1ToExclamation.Location = new System.Drawing.Point(167, 49); + this.flow1ToExclamation.Name = "flow1ToExclamation"; + this.flow1ToExclamation.Size = new System.Drawing.Size(10, 13); + this.flow1ToExclamation.TabIndex = 8; + this.flow1ToExclamation.Text = "!"; + this.flow1ToExclamation.Visible = false; + // + // flow1FromExclamation + // + this.flow1FromExclamation.AutoSize = true; + this.flow1FromExclamation.ForeColor = System.Drawing.Color.Red; + this.flow1FromExclamation.Location = new System.Drawing.Point(167, 24); + this.flow1FromExclamation.Name = "flow1FromExclamation"; + this.flow1FromExclamation.Size = new System.Drawing.Size(10, 13); + this.flow1FromExclamation.TabIndex = 7; + this.flow1FromExclamation.Text = "!"; + this.flow1FromExclamation.Visible = false; + // + // m3hLabel2 + // + this.m3hLabel2.AutoSize = true; + this.m3hLabel2.Location = new System.Drawing.Point(178, 48); + this.m3hLabel2.Name = "m3hLabel2"; + this.m3hLabel2.Size = new System.Drawing.Size(32, 13); + this.m3hLabel2.TabIndex = 6; + this.m3hLabel2.Text = "m3/h"; + // + // m3hLabel1 + // + this.m3hLabel1.AutoSize = true; + this.m3hLabel1.Location = new System.Drawing.Point(177, 23); + this.m3hLabel1.Name = "m3hLabel1"; + this.m3hLabel1.Size = new System.Drawing.Size(32, 13); + this.m3hLabel1.TabIndex = 5; + this.m3hLabel1.Text = "m3/h"; + // + // toLabel2 + // + this.toLabel2.AutoSize = true; + this.toLabel2.Location = new System.Drawing.Point(14, 48); + this.toLabel2.Name = "toLabel2"; + this.toLabel2.Size = new System.Drawing.Size(20, 13); + this.toLabel2.TabIndex = 4; + this.toLabel2.Text = "To"; + // + // fromLabel2 + // + this.fromLabel2.AutoSize = true; + this.fromLabel2.Location = new System.Drawing.Point(14, 23); + this.fromLabel2.Name = "fromLabel2"; + this.fromLabel2.Size = new System.Drawing.Size(30, 13); + this.fromLabel2.TabIndex = 3; + this.fromLabel2.Text = "From"; + // + // flow1ToTextBox + // + this.flow1ToTextBox.Location = new System.Drawing.Point(65, 45); + this.flow1ToTextBox.Name = "flow1ToTextBox"; + this.flow1ToTextBox.Size = new System.Drawing.Size(100, 20); + this.flow1ToTextBox.TabIndex = 2; + this.flow1ToTextBox.TextChanged += new System.EventHandler(this.flow1ToTextBox_TextChanged); + // + // flow1FromTextBox + // + this.flow1FromTextBox.Location = new System.Drawing.Point(65, 20); + this.flow1FromTextBox.Name = "flow1FromTextBox"; + this.flow1FromTextBox.Size = new System.Drawing.Size(100, 20); + this.flow1FromTextBox.TabIndex = 1; + this.flow1FromTextBox.TextChanged += new System.EventHandler(this.flow1FromTextBox_TextChanged); + // + // flow1CheckBox + // + this.flow1CheckBox.AutoSize = true; + this.flow1CheckBox.Location = new System.Drawing.Point(6, 0); + this.flow1CheckBox.Name = "flow1CheckBox"; + this.flow1CheckBox.Size = new System.Drawing.Size(57, 17); + this.flow1CheckBox.TabIndex = 0; + this.flow1CheckBox.Text = "Flow 1"; + this.flow1CheckBox.UseVisualStyleBackColor = true; + this.flow1CheckBox.CheckedChanged += new System.EventHandler(this.flow1CheckBox_CheckedChanged); + // + // benchesTabControl + // + this.benchesTabControl.Dock = System.Windows.Forms.DockStyle.Fill; + this.benchesTabControl.Location = new System.Drawing.Point(0, 0); + this.benchesTabControl.Name = "benchesTabControl"; + this.benchesTabControl.SelectedIndex = 0; + this.benchesTabControl.Size = new System.Drawing.Size(1202, 356); + this.benchesTabControl.TabIndex = 0; + // + // MidOrWaterMetersCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.splitContainer1); + this.Name = "MidOrWaterMetersCtrl"; + this.Size = new System.Drawing.Size(1202, 450); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + this.flow5GroupBox.ResumeLayout(false); + this.flow5GroupBox.PerformLayout(); + this.flow4GroupBox.ResumeLayout(false); + this.flow4GroupBox.PerformLayout(); + this.flow3GroupBox.ResumeLayout(false); + this.flow3GroupBox.PerformLayout(); + this.flow2GroupBox.ResumeLayout(false); + this.flow2GroupBox.PerformLayout(); + this.flow1GroupBox.ResumeLayout(false); + this.flow1GroupBox.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.TabControl benchesTabControl; + private System.Windows.Forms.GroupBox flow3GroupBox; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label toLabel4; + private System.Windows.Forms.Label fromLabel4; + private System.Windows.Forms.TextBox flow3ToTextBox; + private System.Windows.Forms.TextBox flow3FromTextBox; + private System.Windows.Forms.CheckBox flow3CheckBox; + private System.Windows.Forms.GroupBox flow2GroupBox; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label toLabel3; + private System.Windows.Forms.Label fromLabel3; + private System.Windows.Forms.TextBox flow2ToTextBox; + private System.Windows.Forms.TextBox flow2FromTextBox; + private System.Windows.Forms.CheckBox flow2CheckBox; + private System.Windows.Forms.GroupBox flow1GroupBox; + private System.Windows.Forms.Label m3hLabel2; + private System.Windows.Forms.Label m3hLabel1; + private System.Windows.Forms.Label toLabel2; + private System.Windows.Forms.Label fromLabel2; + private System.Windows.Forms.TextBox flow1ToTextBox; + private System.Windows.Forms.TextBox flow1FromTextBox; + private System.Windows.Forms.CheckBox flow1CheckBox; + private System.Windows.Forms.Label flow1ToExclamation; + private System.Windows.Forms.Label flow1FromExclamation; + private System.Windows.Forms.Label flow3ToExclamation; + private System.Windows.Forms.Label flow3FromExclamation; + private System.Windows.Forms.Label flow2ToExclamation; + private System.Windows.Forms.Label flow2FromExclamation; + private System.Windows.Forms.GroupBox flow5GroupBox; + private System.Windows.Forms.Label flow5ToExclamation; + private System.Windows.Forms.Label flow5FromExclamation; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.Label toLabel6; + private System.Windows.Forms.Label fromLabel6; + private System.Windows.Forms.TextBox flow5ToTextBox; + private System.Windows.Forms.TextBox flow5FromTextBox; + private System.Windows.Forms.CheckBox flow5CheckBox; + private System.Windows.Forms.GroupBox flow4GroupBox; + private System.Windows.Forms.Label flow4ToExclamation; + private System.Windows.Forms.Label flow4FromExclamation; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.Label toLabel5; + private System.Windows.Forms.Label fromLabel5; + private System.Windows.Forms.TextBox flow4ToTextBox; + private System.Windows.Forms.TextBox flow4FromTextBox; + private System.Windows.Forms.CheckBox flow4CheckBox; + } +} diff --git a/TBF_V2/Sources/TBF/Statistics/UserControls/MidOrWaterMetersCtrl.cs b/TBF_V2/Sources/TBF/Statistics/UserControls/MidOrWaterMetersCtrl.cs new file mode 100644 index 00000000..d21cc58f --- /dev/null +++ b/TBF_V2/Sources/TBF/Statistics/UserControls/MidOrWaterMetersCtrl.cs @@ -0,0 +1,335 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Windows.Forms; +using Results.Entities; +using Statistics.Resources; +using System.Globalization; + +namespace Statistics.UserControls +{ + public partial class MidOrWaterMetersCtrl : UserControl + { + public int MidId; /// 1-based MID Id. + public StatisticsDlg Parent; + + + public bool IsFlowEnabled(int i) + { + switch (i) + { + case 1: return flow1CheckBox.Checked; + case 2: return flow2CheckBox.Checked; + case 3: return flow3CheckBox.Checked; + case 4: return flow4CheckBox.Checked; + case 5: return flow5CheckBox.Checked; + default: return false; + } + } + + public double FlowFrom(int i) + { + switch (i) + { + case 1: return flow1From; + case 2: return flow2From; + case 3: return flow3From; + case 4: return flow4From; + case 5: return flow5From; + default: return 0; + } + } + + public double FlowTo(int i) + { + switch (i) + { + case 1: return flow1To; + case 2: return flow2To; + case 3: return flow3To; + case 4: return flow4To; + case 5: return flow5To; + default: return 0; + } + } + + + /// All flows are in m3/h + double flow1From; + double flow1To; + double flow2From; + double flow2To; + double flow3From; + double flow3To; + double flow4From; + double flow4To; + double flow5From; + double flow5To; + + + StatisticsCtrl GetStatistics(int i) + { + if ((i >= 0) && (i < benchesTabControl.TabPages.Count) && benchesTabControl.TabPages[i].Controls.Count > 0) + { + return benchesTabControl.TabPages[i].Controls[0] as StatisticsCtrl; + } + else return null; + } + + + public IList UpdateRequest(int benchId) + { + return Parent.UpdateRequest(benchId, MidId); + } + + + public MidOrWaterMetersCtrl() + { + InitializeComponent(); + + ManageCheckGroupBox(flow1CheckBox, flow1GroupBox); + ManageCheckGroupBox(flow2CheckBox, flow2GroupBox); + ManageCheckGroupBox(flow3CheckBox, flow3GroupBox); + ManageCheckGroupBox(flow4CheckBox, flow4GroupBox); + ManageCheckGroupBox(flow5CheckBox, flow5GroupBox); + + for (int i = 0; i < Program.LocalSettings.BenchNames.Length; i++) + { + TabPage tp = new TabPage(); + tp.Text = Program.LocalSettings.BenchNames[i]; + StatisticsCtrl statistics = new StatisticsCtrl(); + statistics.Id = i; + statistics.MidCtrl = this; + statistics.Dock = DockStyle.Fill; + tp.Controls.Add(statistics); + benchesTabControl.TabPages.Add(tp); + } + } + + void Localize() + { + flow1CheckBox.Text = string.Format("{0} 1", Strings.Flow); + flow2CheckBox.Text = string.Format("{0} 2", Strings.Flow); + flow3CheckBox.Text = string.Format("{0} 3", Strings.Flow); + flow4CheckBox.Text = string.Format("{0} 4", Strings.Flow); + flow5CheckBox.Text = string.Format("{0} 5", Strings.Flow); + fromLabel2.Text = Strings.From; + fromLabel3.Text = Strings.From; + fromLabel4.Text = Strings.From; + fromLabel5.Text = Strings.From; + fromLabel6.Text = Strings.From; + toLabel2.Text = Strings.To; + toLabel3.Text = Strings.To; + toLabel4.Text = Strings.To; + toLabel5.Text = Strings.To; + toLabel6.Text = Strings.To; + } + + public void Data2UI() + { + LocalSettings ls = Program.LocalSettings; + flow1CheckBox.Checked = ls.GetFlowEnabled(MidId, 0); + flow2CheckBox.Checked = ls.GetFlowEnabled(MidId, 1); + flow3CheckBox.Checked = ls.GetFlowEnabled(MidId, 2); + flow4CheckBox.Checked = ls.GetFlowEnabled(MidId, 3); + flow5CheckBox.Checked = ls.GetFlowEnabled(MidId, 4); + flow1From = ls.GetFlowFrom(MidId, 0); + flow2From = ls.GetFlowFrom(MidId, 1); + flow3From = ls.GetFlowFrom(MidId, 2); + flow4From = ls.GetFlowFrom(MidId, 3); + flow5From = ls.GetFlowFrom(MidId, 4); + flow1FromTextBox.Text = flow1From.ToString(); + flow2FromTextBox.Text = flow2From.ToString(); + flow3FromTextBox.Text = flow3From.ToString(); + flow4FromTextBox.Text = flow4From.ToString(); + flow5FromTextBox.Text = flow5From.ToString(); + flow1To = ls.GetFlowTo(MidId, 0); + flow2To = ls.GetFlowTo(MidId, 1); + flow3To = ls.GetFlowTo(MidId, 2); + flow4To = ls.GetFlowTo(MidId, 3); + flow5To = ls.GetFlowTo(MidId, 4); + flow1ToTextBox.Text = flow1To.ToString(); + flow2ToTextBox.Text = flow2To.ToString(); + flow3ToTextBox.Text = flow3To.ToString(); + flow4ToTextBox.Text = flow4To.ToString(); + flow5ToTextBox.Text = flow5To.ToString(); + } + + /// + /// + /// + /// true when successful + public void UI2Data() + { + LocalSettings ls = Program.LocalSettings; + ls.SetFlowEnabled(MidId, 0, flow1CheckBox.Checked); + ls.SetFlowEnabled(MidId, 1, flow2CheckBox.Checked); + ls.SetFlowEnabled(MidId, 2, flow3CheckBox.Checked); + ls.SetFlowEnabled(MidId, 3, flow4CheckBox.Checked); + ls.SetFlowEnabled(MidId, 4, flow5CheckBox.Checked); + ls.SetFlowFrom(MidId, 0, flow1From); + ls.SetFlowFrom(MidId, 1, flow2From); + ls.SetFlowFrom(MidId, 2, flow3From); + ls.SetFlowFrom(MidId, 3, flow4From); + ls.SetFlowFrom(MidId, 4, flow5From); + ls.SetFlowTo(MidId, 0, flow1To); + ls.SetFlowTo(MidId, 1, flow2To); + ls.SetFlowTo(MidId, 2, flow3To); + ls.SetFlowTo(MidId, 3, flow4To); + ls.SetFlowTo(MidId, 4, flow5To); + } + + private void flow1CheckBox_CheckedChanged(object sender, EventArgs e) { ManageCheckGroupBox(flow1CheckBox, flow1GroupBox); } + private void flow2CheckBox_CheckedChanged(object sender, EventArgs e) { ManageCheckGroupBox(flow2CheckBox, flow2GroupBox); } + private void flow3CheckBox_CheckedChanged(object sender, EventArgs e) { ManageCheckGroupBox(flow3CheckBox, flow3GroupBox); } + private void flow4CheckBox_CheckedChanged(object sender, EventArgs e) { ManageCheckGroupBox(flow4CheckBox, flow4GroupBox); } + private void flow5CheckBox_CheckedChanged(object sender, EventArgs e) { ManageCheckGroupBox(flow5CheckBox, flow5GroupBox); } + + private void ManageCheckGroupBox(CheckBox chk, GroupBox grp) + { + /// Make sure the CheckBox isn't in the GroupBox. This will only happen the first time. + if (chk.Parent == grp) + { + grp.Parent.Controls.Add(chk); /// Reparent the CheckBox so it's not in the GroupBox. + chk.Location = new Point(chk.Left + grp.Left, chk.Top + grp.Top); /// Adjust the CheckBox's location. + chk.BringToFront(); /// Move the CheckBox to the top of the stacking order. + } + + /// Enable or disable the GroupBox. + grp.Enabled = chk.Checked; + } + + private void flow1FromTextBox_TextChanged(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(flow1FromTextBox.Text)) + { + flow1From = 0; + flow1FromExclamation.Visible = false; + } + else + flow1FromExclamation.Visible = !((double.TryParse(flow1FromTextBox.Text, NumberStyles.AllowDecimalPoint, CultureInfo.CurrentCulture, out flow1From) || + double.TryParse(flow1FromTextBox.Text, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out flow1From)) && + (flow1From >= 0)); + } + + private void flow1ToTextBox_TextChanged(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(flow1ToTextBox.Text)) + { + flow1To = 0; + flow1ToExclamation.Visible = false; + } + else + flow1ToExclamation.Visible = !((double.TryParse(flow1ToTextBox.Text, NumberStyles.AllowDecimalPoint, CultureInfo.CurrentCulture, out flow1To) || + double.TryParse(flow1ToTextBox.Text, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out flow1To)) && + (flow1To >= 0)); + } + + private void flow2FromTextBox_TextChanged(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(flow2FromTextBox.Text)) + { + flow2From = 0; + flow2FromExclamation.Visible = false; + } + else + flow2FromExclamation.Visible = !((double.TryParse(flow2FromTextBox.Text, NumberStyles.AllowDecimalPoint, CultureInfo.CurrentCulture, out flow2From) || + double.TryParse(flow2FromTextBox.Text, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out flow2From)) && + (flow2From >= 0)); + } + + private void flow2ToTextBox_TextChanged(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(flow2ToTextBox.Text)) + { + flow2To = 0; + flow2ToExclamation.Visible = false; + } + else + flow2ToExclamation.Visible = !((double.TryParse(flow2ToTextBox.Text, NumberStyles.AllowDecimalPoint, CultureInfo.CurrentCulture, out flow2To) || + double.TryParse(flow2ToTextBox.Text, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out flow2To)) && + (flow2To >= 0)); + } + + private void flow3FromTextBox_TextChanged(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(flow3FromTextBox.Text)) + { + flow3From = 0; + flow3FromExclamation.Visible = false; + } + else + flow3FromExclamation.Visible = !((double.TryParse(flow3FromTextBox.Text, NumberStyles.AllowDecimalPoint, CultureInfo.CurrentCulture, out flow3From) || + double.TryParse(flow3FromTextBox.Text, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out flow3From)) && + (flow3From >= 0)); + } + + private void flow3ToTextBox_TextChanged(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(flow3ToTextBox.Text)) + { + flow3To = 0; + flow3ToExclamation.Visible = false; + } + else + flow3ToExclamation.Visible = !((double.TryParse(flow3ToTextBox.Text, NumberStyles.AllowDecimalPoint, CultureInfo.CurrentCulture, out flow3To) || + double.TryParse(flow3ToTextBox.Text, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out flow3To)) && + (flow3To >= 0)); + } + + private void flow4FromTextBox_TextChanged(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(flow4FromTextBox.Text)) + { + flow4From = 0; + flow4FromExclamation.Visible = false; + } + else + flow4FromExclamation.Visible = !((double.TryParse(flow4FromTextBox.Text, NumberStyles.AllowDecimalPoint, CultureInfo.CurrentCulture, out flow4From) || + double.TryParse(flow4FromTextBox.Text, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out flow4From)) && + (flow4From >= 0)); + } + + private void flow4ToTextBox_TextChanged(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(flow4ToTextBox.Text)) + { + flow4To = 0; + flow4ToExclamation.Visible = false; + } + else + flow4ToExclamation.Visible = !((double.TryParse(flow4ToTextBox.Text, NumberStyles.AllowDecimalPoint, CultureInfo.CurrentCulture, out flow4To) || + double.TryParse(flow4ToTextBox.Text, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out flow4To)) && + (flow4To >= 0)); + } + + private void flow5FromTextBox_TextChanged(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(flow5FromTextBox.Text)) + { + flow5From = 0; + flow5FromExclamation.Visible = false; + } + else + flow5FromExclamation.Visible = !((double.TryParse(flow5FromTextBox.Text, NumberStyles.AllowDecimalPoint, CultureInfo.CurrentCulture, out flow5From) || + double.TryParse(flow5FromTextBox.Text, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out flow5From)) && + (flow5From >= 0)); + } + + private void flow5ToTextBox_TextChanged(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(flow5ToTextBox.Text)) + { + flow5To = 0; + flow5ToExclamation.Visible = false; + } + else + flow5ToExclamation.Visible = !((double.TryParse(flow5ToTextBox.Text, NumberStyles.AllowDecimalPoint, CultureInfo.CurrentCulture, out flow5To) || + double.TryParse(flow5ToTextBox.Text, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out flow5To)) && + (flow5To >= 0)); + } + } +} diff --git a/TBF_V2/Sources/TBF/Statistics/UserControls/MidOrWaterMetersCtrl.resx b/TBF_V2/Sources/TBF/Statistics/UserControls/MidOrWaterMetersCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/Statistics/UserControls/MidOrWaterMetersCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Statistics/UserControls/StatisticsCtrl.Designer.cs b/TBF_V2/Sources/TBF/Statistics/UserControls/StatisticsCtrl.Designer.cs new file mode 100644 index 00000000..4e86ffe1 --- /dev/null +++ b/TBF_V2/Sources/TBF/Statistics/UserControls/StatisticsCtrl.Designer.cs @@ -0,0 +1,158 @@ +namespace Statistics.UserControls +{ + partial class StatisticsCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea2 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); + System.Windows.Forms.DataVisualization.Charting.Legend legend2 = new System.Windows.Forms.DataVisualization.Charting.Legend(); + System.Windows.Forms.DataVisualization.Charting.Series series6 = new System.Windows.Forms.DataVisualization.Charting.Series(); + System.Windows.Forms.DataVisualization.Charting.Series series7 = new System.Windows.Forms.DataVisualization.Charting.Series(); + System.Windows.Forms.DataVisualization.Charting.Series series8 = new System.Windows.Forms.DataVisualization.Charting.Series(); + System.Windows.Forms.DataVisualization.Charting.Series series9 = new System.Windows.Forms.DataVisualization.Charting.Series(); + System.Windows.Forms.DataVisualization.Charting.Series series10 = new System.Windows.Forms.DataVisualization.Charting.Series(); + this.updateButton = new System.Windows.Forms.Button(); + this.chart1 = new System.Windows.Forms.DataVisualization.Charting.Chart(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.exportButton = new System.Windows.Forms.Button(); + ((System.ComponentModel.ISupportInitialize)(this.chart1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.SuspendLayout(); + // + // updateButton + // + this.updateButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.updateButton.Location = new System.Drawing.Point(3, 7); + this.updateButton.Name = "updateButton"; + this.updateButton.Size = new System.Drawing.Size(90, 43); + this.updateButton.TabIndex = 4; + this.updateButton.Text = "Update data"; + this.updateButton.UseVisualStyleBackColor = true; + this.updateButton.Click += new System.EventHandler(this.updateButton_Click); + // + // chart1 + // + chartArea2.Name = "ChartArea1"; + this.chart1.ChartAreas.Add(chartArea2); + this.chart1.Dock = System.Windows.Forms.DockStyle.Fill; + legend2.Name = "Legend1"; + this.chart1.Legends.Add(legend2); + this.chart1.Location = new System.Drawing.Point(0, 0); + this.chart1.Name = "chart1"; + series6.ChartArea = "ChartArea1"; + series6.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Point; + series6.Color = System.Drawing.Color.ForestGreen; + series6.Legend = "Legend1"; + series6.Name = "Flow 1"; + series7.ChartArea = "ChartArea1"; + series7.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Point; + series7.Color = System.Drawing.Color.Red; + series7.Legend = "Legend1"; + series7.Name = "Flow 2"; + series8.ChartArea = "ChartArea1"; + series8.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Point; + series8.Color = System.Drawing.Color.Blue; + series8.Legend = "Legend1"; + series8.Name = "Flow 3"; + series9.ChartArea = "ChartArea1"; + series9.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Point; + series9.Color = System.Drawing.Color.DarkOrange; + series9.Legend = "Legend1"; + series9.Name = "Flow 4"; + series10.ChartArea = "ChartArea1"; + series10.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Point; + series10.Color = System.Drawing.Color.Fuchsia; + series10.Legend = "Legend1"; + series10.Name = "Flow 5"; + this.chart1.Series.Add(series6); + this.chart1.Series.Add(series7); + this.chart1.Series.Add(series8); + this.chart1.Series.Add(series9); + this.chart1.Series.Add(series10); + this.chart1.Size = new System.Drawing.Size(476, 381); + this.chart1.TabIndex = 5; + this.chart1.Text = "chart1"; + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.splitContainer1.IsSplitterFixed = true; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.chart1); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.exportButton); + this.splitContainer1.Panel2.Controls.Add(this.updateButton); + this.splitContainer1.Size = new System.Drawing.Size(577, 381); + this.splitContainer1.SplitterDistance = 476; + this.splitContainer1.SplitterWidth = 1; + this.splitContainer1.TabIndex = 6; + // + // exportButton + // + this.exportButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.exportButton.Location = new System.Drawing.Point(3, 56); + this.exportButton.Name = "exportButton"; + this.exportButton.Size = new System.Drawing.Size(90, 43); + this.exportButton.TabIndex = 5; + this.exportButton.Text = "Export"; + this.exportButton.UseVisualStyleBackColor = true; + this.exportButton.Click += new System.EventHandler(this.exportButton_Click); + // + // StatisticsCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.splitContainer1); + this.Name = "StatisticsCtrl"; + this.Size = new System.Drawing.Size(577, 381); + ((System.ComponentModel.ISupportInitialize)(this.chart1)).EndInit(); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button updateButton; + private System.Windows.Forms.DataVisualization.Charting.Chart chart1; + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.Button exportButton; + } +} diff --git a/TBF_V2/Sources/TBF/Statistics/UserControls/StatisticsCtrl.cs b/TBF_V2/Sources/TBF/Statistics/UserControls/StatisticsCtrl.cs new file mode 100644 index 00000000..a2f06bdb --- /dev/null +++ b/TBF_V2/Sources/TBF/Statistics/UserControls/StatisticsCtrl.cs @@ -0,0 +1,62 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using System.Windows.Forms.DataVisualization.Charting; +using Results.Entities; +using Statistics.Resources; + +namespace Statistics.UserControls +{ + public partial class StatisticsCtrl : UserControl + { + public int Id; /// Index of the tab page + public MidOrWaterMetersCtrl MidCtrl; /// Reference to the parent control + + public StatisticsCtrl() + { + InitializeComponent(); + chart1.ChartAreas[0].AxisX.LabelStyle.Format = "dd.MM.yy"; + chart1.ChartAreas[0].AxisX.Interval = 1; + chart1.ChartAreas[0].AxisX.IntervalType = DateTimeIntervalType.Days; + } + + private void updateButton_Click(object sender, EventArgs e) + { + if (MidCtrl != null) + { + for (int i = 1; i <= 5; i++) + { + chart1.Series[string.Format("Flow {0}", i)].Points.Clear(); + } + + IList results = MidCtrl.UpdateRequest(Id); + + if (results != null) + { + foreach (var r in results) + { + if (r.ErrorMaster != 0) + { + for (int i = 1; i <= 5; i++) + { + if (MidCtrl.IsFlowEnabled(i) && (MidCtrl.FlowFrom(i) <= r.FlowMean) && (r.FlowMean <= MidCtrl.FlowTo(i))) + { + chart1.Series[string.Format("Flow {0}", i)].Points.AddXY(r.StartTime, r.ErrorMaster); + } + } + } + } + return; + } + } + } + + private void exportButton_Click(object sender, EventArgs e) + { + + } + } +} diff --git a/TBF_V2/Sources/TBF/Statistics/UserControls/StatisticsCtrl.resx b/TBF_V2/Sources/TBF/Statistics/UserControls/StatisticsCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/Statistics/UserControls/StatisticsCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Statistics/app.config b/TBF_V2/Sources/TBF/Statistics/app.config new file mode 100644 index 00000000..e3656033 --- /dev/null +++ b/TBF_V2/Sources/TBF/Statistics/app.config @@ -0,0 +1,3 @@ + + + diff --git a/TBF_V2/Sources/TBF/TBF.sln b/TBF_V2/Sources/TBF/TBF.sln new file mode 100644 index 00000000..395826cc --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF.sln @@ -0,0 +1,195 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TBF", "TBF\TBF.csproj", "{8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48}" + ProjectSection(ProjectDependencies) = postProject + {EFEC8A31-3022-4DA7-A8F6-16D30A94C3FF} = {EFEC8A31-3022-4DA7-A8F6-16D30A94C3FF} + {0C0A1F4D-1363-4544-A7C5-196C76D26CCA} = {0C0A1F4D-1363-4544-A7C5-196C76D26CCA} + EndProjectSection +EndProject +Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "TBFSetup", "TBFSetup\TBFSetup.vdproj", "{4890DE5C-9F68-40D7-B075-92C8EAB79833}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Results", "Results\Results.csproj", "{9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Config", "Config\Config.csproj", "{743DF7DB-C7B6-42EB-986D-0F485E5588E4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ResultsBrowser", "ResultsBrowser\ResultsBrowser.csproj", "{07BA543A-54CA-4A59-9AD9-DDE7038E1BF9}" + ProjectSection(ProjectDependencies) = postProject + {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB} = {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB} + {8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48} = {8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48} + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DeviceTest", "DeviceTest\DeviceTest.csproj", "{6D3384DC-4638-4A92-91A8-F39D900377C6}" + ProjectSection(ProjectDependencies) = postProject + {439D0878-C76E-452B-B17D-209A89E91D36} = {439D0878-C76E-452B-B17D-209A89E91D36} + {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB} = {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB} + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dirichlet.Numerics", "Dirichlet.Numerics\Dirichlet.Numerics.csproj", "{439D0878-C76E-452B-B17D-209A89E91D36}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Users", "Users\Users.csproj", "{6E5CB0E9-E1B6-4E5D-AC6E-B1049E180F2B}" + ProjectSection(ProjectDependencies) = postProject + {8B10D15A-39DE-4B56-8DD1-710C1EB3A697} = {8B10D15A-39DE-4B56-8DD1-710C1EB3A697} + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UserManagement", "UserManagement\UserManagement.csproj", "{B2CD81B3-AF09-4978-996C-02EDB5F819B7}" + ProjectSection(ProjectDependencies) = postProject + {743DF7DB-C7B6-42EB-986D-0F485E5588E4} = {743DF7DB-C7B6-42EB-986D-0F485E5588E4} + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GraphLib", "GraphLib\GraphLib.csproj", "{0C0A1F4D-1363-4544-A7C5-196C76D26CCA}" + ProjectSection(ProjectDependencies) = postProject + {743DF7DB-C7B6-42EB-986D-0F485E5588E4} = {743DF7DB-C7B6-42EB-986D-0F485E5588E4} + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MonitoringDB", "MonitoringDB\MonitoringDB.csproj", "{EFEC8A31-3022-4DA7-A8F6-16D30A94C3FF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GemCard", "GemCard\GemCard.csproj", "{8B10D15A-39DE-4B56-8DD1-710C1EB3A697}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Statistics", "Statistics\Statistics.csproj", "{36755E1D-6FC3-4D9C-8DD3-0250D51532E0}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|Mixed Platforms = Release|Mixed Platforms + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48}.Debug|x86.ActiveCfg = Debug|Any CPU + {8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48}.Debug|x86.Build.0 = Debug|Any CPU + {8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48}.Release|Any CPU.Build.0 = Release|Any CPU + {8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48}.Release|Mixed Platforms.Build.0 = Release|x86 + {8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48}.Release|x86.ActiveCfg = Release|x86 + {8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48}.Release|x86.Build.0 = Release|x86 + {4890DE5C-9F68-40D7-B075-92C8EAB79833}.Debug|Any CPU.ActiveCfg = Debug + {4890DE5C-9F68-40D7-B075-92C8EAB79833}.Debug|Mixed Platforms.ActiveCfg = Debug + {4890DE5C-9F68-40D7-B075-92C8EAB79833}.Debug|x86.ActiveCfg = Debug + {4890DE5C-9F68-40D7-B075-92C8EAB79833}.Release|Any CPU.ActiveCfg = Release + {4890DE5C-9F68-40D7-B075-92C8EAB79833}.Release|Mixed Platforms.ActiveCfg = Release + {4890DE5C-9F68-40D7-B075-92C8EAB79833}.Release|x86.ActiveCfg = Release + {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}.Debug|x86.ActiveCfg = Debug|Any CPU + {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB}.Release|x86.ActiveCfg = Release|Any CPU + {743DF7DB-C7B6-42EB-986D-0F485E5588E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {743DF7DB-C7B6-42EB-986D-0F485E5588E4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {743DF7DB-C7B6-42EB-986D-0F485E5588E4}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {743DF7DB-C7B6-42EB-986D-0F485E5588E4}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {743DF7DB-C7B6-42EB-986D-0F485E5588E4}.Debug|x86.ActiveCfg = Debug|Any CPU + {743DF7DB-C7B6-42EB-986D-0F485E5588E4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {743DF7DB-C7B6-42EB-986D-0F485E5588E4}.Release|Any CPU.Build.0 = Release|Any CPU + {743DF7DB-C7B6-42EB-986D-0F485E5588E4}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {743DF7DB-C7B6-42EB-986D-0F485E5588E4}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {743DF7DB-C7B6-42EB-986D-0F485E5588E4}.Release|x86.ActiveCfg = Release|Any CPU + {07BA543A-54CA-4A59-9AD9-DDE7038E1BF9}.Debug|Any CPU.ActiveCfg = Debug|x86 + {07BA543A-54CA-4A59-9AD9-DDE7038E1BF9}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {07BA543A-54CA-4A59-9AD9-DDE7038E1BF9}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {07BA543A-54CA-4A59-9AD9-DDE7038E1BF9}.Debug|x86.ActiveCfg = Debug|x86 + {07BA543A-54CA-4A59-9AD9-DDE7038E1BF9}.Debug|x86.Build.0 = Debug|x86 + {07BA543A-54CA-4A59-9AD9-DDE7038E1BF9}.Release|Any CPU.ActiveCfg = Release|x86 + {07BA543A-54CA-4A59-9AD9-DDE7038E1BF9}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {07BA543A-54CA-4A59-9AD9-DDE7038E1BF9}.Release|Mixed Platforms.Build.0 = Release|x86 + {07BA543A-54CA-4A59-9AD9-DDE7038E1BF9}.Release|x86.ActiveCfg = Release|x86 + {07BA543A-54CA-4A59-9AD9-DDE7038E1BF9}.Release|x86.Build.0 = Release|x86 + {6D3384DC-4638-4A92-91A8-F39D900377C6}.Debug|Any CPU.ActiveCfg = Debug|x86 + {6D3384DC-4638-4A92-91A8-F39D900377C6}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {6D3384DC-4638-4A92-91A8-F39D900377C6}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {6D3384DC-4638-4A92-91A8-F39D900377C6}.Debug|x86.ActiveCfg = Debug|x86 + {6D3384DC-4638-4A92-91A8-F39D900377C6}.Debug|x86.Build.0 = Debug|x86 + {6D3384DC-4638-4A92-91A8-F39D900377C6}.Release|Any CPU.ActiveCfg = Release|x86 + {6D3384DC-4638-4A92-91A8-F39D900377C6}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {6D3384DC-4638-4A92-91A8-F39D900377C6}.Release|Mixed Platforms.Build.0 = Release|x86 + {6D3384DC-4638-4A92-91A8-F39D900377C6}.Release|x86.ActiveCfg = Release|x86 + {6D3384DC-4638-4A92-91A8-F39D900377C6}.Release|x86.Build.0 = Release|x86 + {439D0878-C76E-452B-B17D-209A89E91D36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {439D0878-C76E-452B-B17D-209A89E91D36}.Debug|Any CPU.Build.0 = Debug|Any CPU + {439D0878-C76E-452B-B17D-209A89E91D36}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {439D0878-C76E-452B-B17D-209A89E91D36}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {439D0878-C76E-452B-B17D-209A89E91D36}.Debug|x86.ActiveCfg = Debug|Any CPU + {439D0878-C76E-452B-B17D-209A89E91D36}.Release|Any CPU.ActiveCfg = Release|Any CPU + {439D0878-C76E-452B-B17D-209A89E91D36}.Release|Any CPU.Build.0 = Release|Any CPU + {439D0878-C76E-452B-B17D-209A89E91D36}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {439D0878-C76E-452B-B17D-209A89E91D36}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {439D0878-C76E-452B-B17D-209A89E91D36}.Release|x86.ActiveCfg = Release|Any CPU + {6E5CB0E9-E1B6-4E5D-AC6E-B1049E180F2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6E5CB0E9-E1B6-4E5D-AC6E-B1049E180F2B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6E5CB0E9-E1B6-4E5D-AC6E-B1049E180F2B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {6E5CB0E9-E1B6-4E5D-AC6E-B1049E180F2B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {6E5CB0E9-E1B6-4E5D-AC6E-B1049E180F2B}.Debug|x86.ActiveCfg = Debug|Any CPU + {6E5CB0E9-E1B6-4E5D-AC6E-B1049E180F2B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6E5CB0E9-E1B6-4E5D-AC6E-B1049E180F2B}.Release|Any CPU.Build.0 = Release|Any CPU + {6E5CB0E9-E1B6-4E5D-AC6E-B1049E180F2B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {6E5CB0E9-E1B6-4E5D-AC6E-B1049E180F2B}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {6E5CB0E9-E1B6-4E5D-AC6E-B1049E180F2B}.Release|x86.ActiveCfg = Release|Any CPU + {B2CD81B3-AF09-4978-996C-02EDB5F819B7}.Debug|Any CPU.ActiveCfg = Debug|x86 + {B2CD81B3-AF09-4978-996C-02EDB5F819B7}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {B2CD81B3-AF09-4978-996C-02EDB5F819B7}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {B2CD81B3-AF09-4978-996C-02EDB5F819B7}.Debug|x86.ActiveCfg = Debug|x86 + {B2CD81B3-AF09-4978-996C-02EDB5F819B7}.Debug|x86.Build.0 = Debug|x86 + {B2CD81B3-AF09-4978-996C-02EDB5F819B7}.Release|Any CPU.ActiveCfg = Release|x86 + {B2CD81B3-AF09-4978-996C-02EDB5F819B7}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {B2CD81B3-AF09-4978-996C-02EDB5F819B7}.Release|Mixed Platforms.Build.0 = Release|x86 + {B2CD81B3-AF09-4978-996C-02EDB5F819B7}.Release|x86.ActiveCfg = Release|x86 + {B2CD81B3-AF09-4978-996C-02EDB5F819B7}.Release|x86.Build.0 = Release|x86 + {0C0A1F4D-1363-4544-A7C5-196C76D26CCA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0C0A1F4D-1363-4544-A7C5-196C76D26CCA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0C0A1F4D-1363-4544-A7C5-196C76D26CCA}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {0C0A1F4D-1363-4544-A7C5-196C76D26CCA}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {0C0A1F4D-1363-4544-A7C5-196C76D26CCA}.Debug|x86.ActiveCfg = Debug|Any CPU + {0C0A1F4D-1363-4544-A7C5-196C76D26CCA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0C0A1F4D-1363-4544-A7C5-196C76D26CCA}.Release|Any CPU.Build.0 = Release|Any CPU + {0C0A1F4D-1363-4544-A7C5-196C76D26CCA}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {0C0A1F4D-1363-4544-A7C5-196C76D26CCA}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {0C0A1F4D-1363-4544-A7C5-196C76D26CCA}.Release|x86.ActiveCfg = Release|Any CPU + {EFEC8A31-3022-4DA7-A8F6-16D30A94C3FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EFEC8A31-3022-4DA7-A8F6-16D30A94C3FF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EFEC8A31-3022-4DA7-A8F6-16D30A94C3FF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {EFEC8A31-3022-4DA7-A8F6-16D30A94C3FF}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {EFEC8A31-3022-4DA7-A8F6-16D30A94C3FF}.Debug|x86.ActiveCfg = Debug|Any CPU + {EFEC8A31-3022-4DA7-A8F6-16D30A94C3FF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EFEC8A31-3022-4DA7-A8F6-16D30A94C3FF}.Release|Any CPU.Build.0 = Release|Any CPU + {EFEC8A31-3022-4DA7-A8F6-16D30A94C3FF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {EFEC8A31-3022-4DA7-A8F6-16D30A94C3FF}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {EFEC8A31-3022-4DA7-A8F6-16D30A94C3FF}.Release|x86.ActiveCfg = Release|Any CPU + {8B10D15A-39DE-4B56-8DD1-710C1EB3A697}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8B10D15A-39DE-4B56-8DD1-710C1EB3A697}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8B10D15A-39DE-4B56-8DD1-710C1EB3A697}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {8B10D15A-39DE-4B56-8DD1-710C1EB3A697}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {8B10D15A-39DE-4B56-8DD1-710C1EB3A697}.Debug|x86.ActiveCfg = Debug|x86 + {8B10D15A-39DE-4B56-8DD1-710C1EB3A697}.Debug|x86.Build.0 = Debug|x86 + {8B10D15A-39DE-4B56-8DD1-710C1EB3A697}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8B10D15A-39DE-4B56-8DD1-710C1EB3A697}.Release|Any CPU.Build.0 = Release|Any CPU + {8B10D15A-39DE-4B56-8DD1-710C1EB3A697}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {8B10D15A-39DE-4B56-8DD1-710C1EB3A697}.Release|Mixed Platforms.Build.0 = Release|x86 + {8B10D15A-39DE-4B56-8DD1-710C1EB3A697}.Release|x86.ActiveCfg = Release|x86 + {8B10D15A-39DE-4B56-8DD1-710C1EB3A697}.Release|x86.Build.0 = Release|x86 + {36755E1D-6FC3-4D9C-8DD3-0250D51532E0}.Debug|Any CPU.ActiveCfg = Debug|x86 + {36755E1D-6FC3-4D9C-8DD3-0250D51532E0}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {36755E1D-6FC3-4D9C-8DD3-0250D51532E0}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {36755E1D-6FC3-4D9C-8DD3-0250D51532E0}.Debug|x86.ActiveCfg = Debug|x86 + {36755E1D-6FC3-4D9C-8DD3-0250D51532E0}.Debug|x86.Build.0 = Debug|x86 + {36755E1D-6FC3-4D9C-8DD3-0250D51532E0}.Release|Any CPU.ActiveCfg = Release|x86 + {36755E1D-6FC3-4D9C-8DD3-0250D51532E0}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {36755E1D-6FC3-4D9C-8DD3-0250D51532E0}.Release|Mixed Platforms.Build.0 = Release|x86 + {36755E1D-6FC3-4D9C-8DD3-0250D51532E0}.Release|x86.ActiveCfg = Release|x86 + {36755E1D-6FC3-4D9C-8DD3-0250D51532E0}.Release|x86.Build.0 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/TBF_V2/Sources/TBF/TBF/AboutDlg.Designer.cs b/TBF_V2/Sources/TBF/TBF/AboutDlg.Designer.cs new file mode 100644 index 00000000..603ad55c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/AboutDlg.Designer.cs @@ -0,0 +1,120 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TestBenchFramework +{ + partial class AboutDlg + { + /// + /// 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() + { + this.copyrightLabel = new System.Windows.Forms.Label(); + this.versionLabel = new System.Windows.Forms.Label(); + this.buildDateLabel = new System.Windows.Forms.Label(); + this.closeButton = new System.Windows.Forms.Button(); + this.logoPictureBox = new System.Windows.Forms.PictureBox(); + ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).BeginInit(); + this.SuspendLayout(); + // + // copyrightLabel + // + this.copyrightLabel.AutoSize = true; + this.copyrightLabel.Location = new System.Drawing.Point(145, 19); + this.copyrightLabel.Name = "copyrightLabel"; + this.copyrightLabel.Size = new System.Drawing.Size(90, 13); + this.copyrightLabel.TabIndex = 4; + this.copyrightLabel.Text = "Copyright 2013"; + // + // versionLabel + // + this.versionLabel.AutoSize = true; + this.versionLabel.Location = new System.Drawing.Point(145, 41); + this.versionLabel.Name = "versionLabel"; + this.versionLabel.Size = new System.Drawing.Size(105, 13); + this.versionLabel.TabIndex = 5; + this.versionLabel.Text = "Version _VERSION_"; + // + // buildDateLabel + // + this.buildDateLabel.AutoSize = true; + this.buildDateLabel.Location = new System.Drawing.Point(145, 64); + this.buildDateLabel.Name = "buildDateLabel"; + this.buildDateLabel.Size = new System.Drawing.Size(136, 13); + this.buildDateLabel.TabIndex = 6; + this.buildDateLabel.Text = "Build date _BUILD_DATE_"; + // + // closeButton + // + this.closeButton.DialogResult = System.Windows.Forms.DialogResult.OK; + this.closeButton.Location = new System.Drawing.Point(341, 36); + this.closeButton.Name = "closeButton"; + this.closeButton.Size = new System.Drawing.Size(105, 28); + this.closeButton.TabIndex = 11; + this.closeButton.Text = "&Close"; + this.closeButton.UseVisualStyleBackColor = true; + // + // logoPictureBox + // + this.logoPictureBox.BackgroundImage = global::TestBenchFramework.Properties.Resources.sensus_logo; + this.logoPictureBox.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.logoPictureBox.InitialImage = null; + this.logoPictureBox.Location = new System.Drawing.Point(12, 34); + this.logoPictureBox.Name = "logoPictureBox"; + this.logoPictureBox.Size = new System.Drawing.Size(103, 30); + this.logoPictureBox.TabIndex = 12; + this.logoPictureBox.TabStop = false; + // + // AboutDlg + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.Window; + this.ClientSize = new System.Drawing.Size(458, 99); + this.Controls.Add(this.logoPictureBox); + this.Controls.Add(this.closeButton); + this.Controls.Add(this.buildDateLabel); + this.Controls.Add(this.versionLabel); + this.Controls.Add(this.copyrightLabel); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Name = "AboutDlg"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "About Test Bench Framework"; + ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label copyrightLabel; + private System.Windows.Forms.Label versionLabel; + private System.Windows.Forms.Label buildDateLabel; + private System.Windows.Forms.Button closeButton; + private System.Windows.Forms.PictureBox logoPictureBox; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/AboutDlg.cs b/TBF_V2/Sources/TBF/TBF/AboutDlg.cs new file mode 100644 index 00000000..283cda5e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/AboutDlg.cs @@ -0,0 +1,31 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace TestBenchFramework +{ + /// + /// About dialog + /// + public partial class AboutDlg : Form + { + /// + /// Contsructor + /// + /// Language neutral version string + /// Regionally formated build date string + public AboutDlg(string version, string buildDate) + { + InitializeComponent(); + versionLabel.Text = versionLabel.Text.Replace("_VERSION_", version); + buildDateLabel.Text = buildDateLabel.Text.Replace("_BUILD_DATE_", buildDate); + } + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/AboutDlg.resx b/TBF_V2/Sources/TBF/TBF/AboutDlg.resx new file mode 100644 index 00000000..62664e0d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/AboutDlg.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + True + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/AttachedTextBoxes.cs b/TBF_V2/Sources/TBF/TBF/AttachedTextBoxes.cs new file mode 100644 index 00000000..fe6bd77d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/AttachedTextBoxes.cs @@ -0,0 +1,176 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; + +namespace TBF +{ + /// + /// Data types and orientation of the table layout panel attached data. + /// + public enum Arrangement + { + RowOfIntegers, + RowOfDoubles, + RowOfStrings, + ColumnOfIntegers, + ColumnOfDoubles, + ColumnOfStrings, + } + + /// + /// This class represents TextBox controls and data modified by them + /// that are attached to (=displayed inside) a TableLayoutPanel control. + /// + public class AttachedTextBoxes + { + /// + /// Private fields + /// + int count; /// Number of attached TextBoxes / cells + Arrangement arngmnt; /// Type of attachemnt (see above) + bool isRow; /// true if it is a row + TextBox[] textBoxes; /// TextBox controls to be aded to TableLayoutPanel + int[] intData; /// integer data | + double[] doubleData; /// double data |-> one of these three arrays is used + string[] stringData; /// string data | + + /// + /// Constructor, which creates TextBox controls and adds them to the table layout panel. + /// + public AttachedTextBoxes(TableLayoutPanel tblLtPnl, Arrangement arngmnt, int firstColumn, int firstRow, int size) + { + this.count = size; + this.arngmnt = arngmnt; + isRow = (arngmnt == Arrangement.RowOfIntegers || arngmnt == Arrangement.RowOfDoubles || arngmnt == Arrangement.RowOfStrings); + + textBoxes = new TextBox[count]; + intData = new int[count]; + doubleData = new double[count]; + stringData = new string[count]; + + for (int i = 0; i < count; i++) + { + textBoxes[i] = new TextBox(); /// Crete a new TextBox control + + if (isRow) + { + tblLtPnl.Controls.Add(textBoxes[i], firstColumn + i, firstRow); + } + else + { + tblLtPnl.Controls.Add(textBoxes[i], firstColumn, firstRow + i); + } + } + } + + /// + /// Attached data array size + /// + public int Count { get { return count; } } + + /// + /// Indexer returning a TextBox + /// + /// Index + /// TextBox object reference + public TextBox this[int index] + { + get + { + if (index < 0 || index >= count) + { + return null; + } + else + { + return textBoxes[index]; + } + } + } + + /// + /// Retrieves data from the controls or detects a format error. + /// Wrong format in a cell interrupts data retrieving, so when the first control + /// contains data with wrong format, no data are retrieved at all. + /// + /// true if all data have correct format + public bool ValidateData() + { + switch (arngmnt) + { + case Arrangement.RowOfIntegers: + case Arrangement.ColumnOfIntegers: + for (int i = 0; i < count; i++) + { + if (!Int32.TryParse(textBoxes[i].Text, out intData[i])) return false; + } + return true; + + case Arrangement.RowOfDoubles: + case Arrangement.ColumnOfDoubles: + for (int i = 0; i < count; i++) + { + if (!Double.TryParse(textBoxes[i].Text, out doubleData[i])) return false; + } + return true; + + case Arrangement.RowOfStrings: + case Arrangement.ColumnOfStrings: + default: + return true; + } + } + + /// + /// The following three methods provide initialization of controls with original data. + /// + + public void SetData(int index, int value) + { + if (index < 0 || index >= count) return; + intData[index] = value; + textBoxes[index].Text = value.ToString(); + } + + public void SetData(int index, double value) + { + if (index < 0 || index >= count) return; + doubleData[index] = value; + textBoxes[index].Text = value.ToString(); + } + + public void SetData(int index, string value) + { + if (index < 0 || index >= count) return; + stringData[index] = value; + textBoxes[index].Text = value; + } + + /// + /// The following three methods provide retrieving data from controls. + /// ValidateData() must be called first. The return value must be true. + /// + + public int GetIntData(int index) + { + if (index < 0 || index >= count) return 0; + return intData[index]; + } + + public double GetDoubleData(int index) + { + if (index < 0 || index >= count) return 0; + return doubleData[index]; + } + + public string GetStringData(int index) + { + if (index < 0 || index >= count) return null; + return textBoxes[index].Text; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BarGraph.cs b/TBF_V2/Sources/TBF/TBF/BarGraph.cs new file mode 100644 index 00000000..0b62a596 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BarGraph.cs @@ -0,0 +1,75 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Drawing; +using System.Windows.Forms; + +namespace TBF +{ + public class BarGraph + { + int originX; /// Left coordinate of the bar + int originY; /// Top coordinate of the bar + int barWidth; /// Bar width, the bar is actualy 1 pixel wider + int barHeight; /// Bar height the bat is actualy 1 pixel higher + Color barColor; /// Bar color + Color backColor; /// Background color (above the bar) + /// Bar border is always black, 1 pixel wide + int barValue; /// The actual bar size (the bar is drawn from bottom) + + System.Windows.Forms.Control control; + Rectangle rect; + + + /// Use this setter to update the bar size + public float FValue + { + get { return (float)barValue/(float)barHeight; } + set + { + Value = (int)(value * (float)barHeight); + control.Invalidate(); + } + } + + /// Use this setter to update the bar size + public int Value + { + get { return barValue; } + set + { + if (value < 0) barValue = 0; + else if (value >= barHeight) barValue = barHeight; + else barValue = value; + control.Invalidate(); + } + } + + /// + /// Constructor + /// + public BarGraph(System.Windows.Forms.Control control, int originX, int originY, int barWidth, int barHeight, Color barColor, Color backColor) + { + this.control = control; + this.originX = originX; + this.originY = originY; + this.barWidth = barWidth; + this.barHeight = barHeight; + this.barColor = barColor; + this.backColor = backColor; + rect = new Rectangle(originX, originY, barWidth + 1, barHeight + 1); + barValue = 0; + } + + /// + /// Call this function in Form1_Paint(..), pass the arguments without any modifications + /// + public void Paint(Graphics g) + { + g.FillRectangle(new SolidBrush(backColor), originX + 1, originY + 1, barWidth, barHeight - barValue); + g.FillRectangle(new SolidBrush(barColor), originX + 1, originY + barHeight + 1 - barValue, barWidth, barValue); + g.DrawRectangle(new Pen(Color.Black, 2.0F), originX, originY, barWidth + 1, barHeight + 1); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Comet/Ambient.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Comet/Ambient.cs new file mode 100644 index 00000000..596ea880 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Comet/Ambient.cs @@ -0,0 +1,240 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO.Ports; +using log4net; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Boxes; + +namespace TBF.BenchControl.Ambient.Comet +{ + /// + /// Ambient temperature / humidity / pressure meter 'Greco' connected via serial interface (RS232) + /// Connection settings: 9600 Bd 8-bits No-parity 2-stop-bits Flow control: none. + /// + public class Ambient : ComponentBase, IDevice, IOperation, GenericDevices.IAmbient + { + private static readonly ILog log = LogManager.GetLogger(typeof(Ambient)); + public override string ToString() { return string.Format("Ambient({0})", Cfg.ToString(1)); } + + private readonly AmbientCfg ambientCfg; + + /// Private fields + SerialPort serialPort; + + /// The state of the measurement + MsrmntState msrmntState; + + /// + /// Measured values when MsrmntState == MsrmntState.Valid + /// + float temperature; /// [°C] + float pressure; /// [bar] + float humidity; /// [R%] + + /// Measurement time stamp when MsrmntState == MsrmntState.Valid + int msrmntTimeStamp; + + public Ambient() + { + } + + /// + /// Ambient temperature / humidity / pressure meter 'Greco' connected via serial interface (RS232) + /// + public Ambient(AmbientCfg cfg, IList components) + : this(cfg) + { + } + + public Ambient(Generic.IComponentCfg cfg) + : base(cfg) + { + ambientCfg = cfg as AmbientCfg; + log.Debug(this.ToString()); + } + + public void Initialize() + { + if (ambientCfg.DebugLevel == DebugMode.Simulate) + { + temperature = 20.0f; + humidity = 40.0f; + pressure = 1.0f; + msrmntTimeStamp = StateMachine.Time; + msrmntState = MsrmntState.Valid; + return; + } + + string comPortName = "COM" + ambientCfg.ComPortNr.ToString(); + serialPort = new SerialPort(comPortName, ambientCfg.BaudRate, ambientCfg.Parity, ambientCfg.DataBits, ambientCfg.StopBits); + serialPort.Handshake = ambientCfg.Handshake; + serialPort.Open(); + msrmntState = MsrmntState.Busy; + + log.FatalFormat("Successfully initialized device {0}", ToString()); + } + + /// Run this device + public void RunDeviceBefore() + { + if (ambientCfg.DebugLevel == DebugMode.Simulate || + ambientCfg.DebugLevel == DebugMode.FailureDuringOperation) + { + msrmntTimeStamp = StateMachine.Time; + return; + } + + if (serialPort == null) + { + log.ErrorFormat("{0} - RunDeviceBefore() - serial port closed", Name); + return; + } + + try + { + int receivedBytes = serialPort.BytesToRead; + + if (receivedBytes >= 13) + { + byte[] byteArr = new byte[receivedBytes]; + for (int i = 0; i < receivedBytes; i++) byteArr[i] = (byte)serialPort.ReadByte(); + log.Debug(Telegram.LogTelegram("Received ", byteArr)); + + if ((receivedBytes == 13) && (byteArr[0] == 1) && (byteArr[1] == 3) && (byteArr[2] == 8) && Telegram.VerifyTelegramCRC(byteArr)) + { + int value = (int)byteArr[3] * 256 + (int)byteArr[4]; + temperature = (float)value / 10.0f; + + value = (int)byteArr[5] * 256 + (int)byteArr[6]; + humidity = (float)value / 10.0f; + + value = (int)byteArr[9] * 256 + (int)byteArr[10]; + pressure = (float)value / 10000.0f; + + msrmntTimeStamp = StateMachine.Time; + msrmntState = MsrmntState.Valid; + log.InfoFormat("Ambient: temperature = {0:F1} C, humidity = {1:F1} %, pressure = {2:F0} mbar", temperature, humidity, 1000 * pressure); + } + } + } + catch (Exception e) + { + DebugLevel = DebugMode.FailureDuringOperation; + serialPort = null; + + log.FatalFormat("Ambient: Serail port read failure : {0}", e.Message); + if (e.InnerException != null) + { + log.FatalFormat("InnerMessage : {0}", e.InnerException.Message); + } + } + } + + /// Run this device + public void RunDeviceAfter() + { + if (ambientCfg.DebugLevel == DebugMode.Simulate || + ambientCfg.DebugLevel == DebugMode.FailureDuringOperation) + { + return; + } + + if (serialPort == null) + { + log.ErrorFormat("{0} - RunDeviceAfter() - serial port closed", Name); + return; + } + + try + { + /// Each 10 seconds + if ((StateMachine.Time % 10) == 0) + { + /// Read four registers: 0x31, 0x32, 0x33, 0x34 + UInt16 regAddr = 0x0030; /// register addr. = 0x31 (Modbus!) + UInt16 count = 4; + + /// Prepare data to be sent + byte[] msg = new byte[8]; + msg[0] = 1; /// (byte)ambientCfg.BusAddress; + msg[1] = 3; /// CMD = Read registers + msg[2] = (byte)(regAddr >> 8); /// Control Word Hi + msg[3] = (byte)(regAddr & 0xFF); /// Control Word Lo + msg[4] = (byte)(count >> 8); /// Serial Com Reference Hi + msg[5] = (byte)(count & 0xFF); /// Serial Com Reference Lo + Telegram.UpdateTelegramCRC(msg); + + log.Debug(Telegram.LogTelegram("Sending ", msg)); + serialPort.Write(msg, 0, msg.Length); + } + } + catch (Exception e) + { + DebugLevel = DebugMode.FailureDuringOperation; + serialPort = null; + + log.FatalFormat("Ambient: Serail port read failure : {0}", e.Message); + if (e.InnerException != null) + { + log.FatalFormat("InnerMessage : {0}", e.InnerException.Message); + } + } + } + + /// Stop this device + public void StopDevice() + { + if (serialPort != null) + { + serialPort.Close(); + serialPort = null; + } + } + + public void StopDevice2() { } + + /// + /// Boxes for the operation result + /// + FloatBox tempBox; + FloatBox pressureBox; + FloatBox humiBox; + + public IOperation ReadAmbientOp(FloatBox temperature, FloatBox pressure, FloatBox humidity) + { + this.tempBox = temperature; + this.pressureBox = pressure; + this.humiBox = humidity; + return this; + } + + /// Start this operation + public void Start() + { + if (tempBox != null) tempBox.Val = temperature; + if (pressureBox != null) pressureBox.Val = pressure; + if (humiBox != null) humiBox.Val = humidity; + } + + /// Run this operation + /// + /// Event.FlowInDone or Event.FlowOutDone + /// + public Event Run() + { + if (tempBox != null) tempBox.Val = temperature; + if (pressureBox != null) pressureBox.Val = pressure; + if (humiBox != null) humiBox.Val = humidity; + return Event.AmbientDone; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Comet/AmbientCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Comet/AmbientCfg.cs new file mode 100644 index 00000000..43564b4d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Comet/AmbientCfg.cs @@ -0,0 +1,54 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.IO; +using System.Collections.Generic; +using System.IO.Ports; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Ambient.Comet +{ + public class AmbientCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(AmbientCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new AmbientCfgCtrl(); } + + /// + /// Serialized parameters + /// + public int ComPortNr; + public int BaudRate; + public Parity Parity; + public int DataBits; + public StopBits StopBits; + public Handshake Handshake; + + /// Private parameterless constructor invoked by all other (public) constructors + AmbientCfg() + { + Name = "Ambient"; + ParentName = string.Empty; + ComPortNr = 6; + BaudRate = 9600; + Parity = System.IO.Ports.Parity.None; + DataBits = 8; + StopBits = System.IO.Ports.StopBits.Two; + Handshake = System.IO.Ports.Handshake.None; + } + + public AmbientCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Com{1}, {2}Bd, {3}-bits, parity={4}, stopBits={5}, {6}", + Name, ComPortNr, BaudRate, DataBits, Parity, StopBits, Handshake); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Comet/AmbientCfgCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Comet/AmbientCfgCtrl.Designer.cs new file mode 100644 index 00000000..9a724f81 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Comet/AmbientCfgCtrl.Designer.cs @@ -0,0 +1,229 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.Ambient.Comet +{ + partial class AmbientCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.comPortNrTextBox = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.baudRateLabel = new System.Windows.Forms.Label(); + this.baudRateTextBox = new System.Windows.Forms.TextBox(); + this.partityLabel = new System.Windows.Forms.Label(); + this.dataBitsLabel = new System.Windows.Forms.Label(); + this.dataBitsTextBox = new System.Windows.Forms.TextBox(); + this.stopBitsLabel = new System.Windows.Forms.Label(); + this.handshakeLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.parityComboBox = new System.Windows.Forms.ComboBox(); + this.stopBitsComboBox = new System.Windows.Forms.ComboBox(); + this.handshakeComboBox = new System.Windows.Forms.ComboBox(); + this.SuspendLayout(); + // + // comPortNrTextBox + // + this.comPortNrTextBox.Enabled = false; + this.comPortNrTextBox.Location = new System.Drawing.Point(140, 52); + this.comPortNrTextBox.Name = "comPortNrTextBox"; + this.comPortNrTextBox.Size = new System.Drawing.Size(34, 20); + this.comPortNrTextBox.TabIndex = 4; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(29, 55); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(98, 13); + this.label1.TabIndex = 3; + this.label1.Text = "Serial Port Number:"; + // + // baudRateLabel + // + this.baudRateLabel.AutoSize = true; + this.baudRateLabel.Location = new System.Drawing.Point(29, 79); + this.baudRateLabel.Name = "baudRateLabel"; + this.baudRateLabel.Size = new System.Drawing.Size(58, 13); + this.baudRateLabel.TabIndex = 5; + this.baudRateLabel.Text = "Baud Rate"; + // + // baudRateTextBox + // + this.baudRateTextBox.Enabled = false; + this.baudRateTextBox.Location = new System.Drawing.Point(140, 76); + this.baudRateTextBox.Name = "baudRateTextBox"; + this.baudRateTextBox.Size = new System.Drawing.Size(130, 20); + this.baudRateTextBox.TabIndex = 6; + // + // partityLabel + // + this.partityLabel.AutoSize = true; + this.partityLabel.Location = new System.Drawing.Point(29, 103); + this.partityLabel.Name = "partityLabel"; + this.partityLabel.Size = new System.Drawing.Size(33, 13); + this.partityLabel.TabIndex = 7; + this.partityLabel.Text = "Parity"; + // + // dataBitsLabel + // + this.dataBitsLabel.AutoSize = true; + this.dataBitsLabel.Location = new System.Drawing.Point(29, 127); + this.dataBitsLabel.Name = "dataBitsLabel"; + this.dataBitsLabel.Size = new System.Drawing.Size(50, 13); + this.dataBitsLabel.TabIndex = 9; + this.dataBitsLabel.Text = "Data Bits"; + // + // dataBitsTextBox + // + this.dataBitsTextBox.Enabled = false; + this.dataBitsTextBox.Location = new System.Drawing.Point(140, 124); + this.dataBitsTextBox.Name = "dataBitsTextBox"; + this.dataBitsTextBox.Size = new System.Drawing.Size(34, 20); + this.dataBitsTextBox.TabIndex = 10; + // + // stopBitsLabel + // + this.stopBitsLabel.AutoSize = true; + this.stopBitsLabel.Location = new System.Drawing.Point(29, 151); + this.stopBitsLabel.Name = "stopBitsLabel"; + this.stopBitsLabel.Size = new System.Drawing.Size(49, 13); + this.stopBitsLabel.TabIndex = 11; + this.stopBitsLabel.Text = "Stop Bits"; + // + // handshakeLabel + // + this.handshakeLabel.AutoSize = true; + this.handshakeLabel.Location = new System.Drawing.Point(29, 175); + this.handshakeLabel.Name = "handshakeLabel"; + this.handshakeLabel.Size = new System.Drawing.Size(62, 13); + this.handshakeLabel.TabIndex = 13; + this.handshakeLabel.Text = "Handshake"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(140, 28); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(30, 31); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(137, 7); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // parityComboBox + // + this.parityComboBox.Enabled = false; + this.parityComboBox.FormattingEnabled = true; + this.parityComboBox.Location = new System.Drawing.Point(140, 100); + this.parityComboBox.Name = "parityComboBox"; + this.parityComboBox.Size = new System.Drawing.Size(130, 21); + this.parityComboBox.TabIndex = 8; + // + // stopBitsComboBox + // + this.stopBitsComboBox.Enabled = false; + this.stopBitsComboBox.FormattingEnabled = true; + this.stopBitsComboBox.Location = new System.Drawing.Point(140, 148); + this.stopBitsComboBox.Name = "stopBitsComboBox"; + this.stopBitsComboBox.Size = new System.Drawing.Size(130, 21); + this.stopBitsComboBox.TabIndex = 12; + // + // handshakeComboBox + // + this.handshakeComboBox.Enabled = false; + this.handshakeComboBox.FormattingEnabled = true; + this.handshakeComboBox.Location = new System.Drawing.Point(140, 172); + this.handshakeComboBox.Name = "handshakeComboBox"; + this.handshakeComboBox.Size = new System.Drawing.Size(130, 21); + this.handshakeComboBox.TabIndex = 14; + // + // AmbientCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.Control; + this.Controls.Add(this.handshakeComboBox); + this.Controls.Add(this.stopBitsComboBox); + this.Controls.Add(this.parityComboBox); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Controls.Add(this.handshakeLabel); + this.Controls.Add(this.stopBitsLabel); + this.Controls.Add(this.dataBitsTextBox); + this.Controls.Add(this.dataBitsLabel); + this.Controls.Add(this.partityLabel); + this.Controls.Add(this.baudRateTextBox); + this.Controls.Add(this.baudRateLabel); + this.Controls.Add(this.comPortNrTextBox); + this.Controls.Add(this.label1); + this.Name = "AmbientCfgCtrl"; + this.Size = new System.Drawing.Size(300, 240); + this.Load += new System.EventHandler(this.AbbientCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox comPortNrTextBox; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label baudRateLabel; + private System.Windows.Forms.TextBox baudRateTextBox; + private System.Windows.Forms.Label partityLabel; + private System.Windows.Forms.Label dataBitsLabel; + private System.Windows.Forms.TextBox dataBitsTextBox; + private System.Windows.Forms.Label stopBitsLabel; + private System.Windows.Forms.Label handshakeLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.ComboBox parityComboBox; + private System.Windows.Forms.ComboBox stopBitsComboBox; + private System.Windows.Forms.ComboBox handshakeComboBox; + + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Comet/AmbientCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Comet/AmbientCfgCtrl.cs new file mode 100644 index 00000000..776d32b9 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Comet/AmbientCfgCtrl.cs @@ -0,0 +1,169 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using System.IO.Ports; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Ambient.Comet +{ + public partial class AmbientCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + AmbientCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as AmbientCfg; + Redraw(); + } + } + + public AmbientCfgCtrl() + { + InitializeComponent(); + + parityComboBox.Items.Add(Parity.None.ToString()); + parityComboBox.Items.Add(Parity.Even.ToString()); + parityComboBox.Items.Add(Parity.Odd.ToString()); + + stopBitsComboBox.Items.Add(StopBits.None.ToString()); + stopBitsComboBox.Items.Add(StopBits.One.ToString()); + stopBitsComboBox.Items.Add(StopBits.OnePointFive.ToString()); + stopBitsComboBox.Items.Add(StopBits.Two.ToString()); + + handshakeComboBox.Items.Add(Handshake.None.ToString()); + handshakeComboBox.Items.Add(Handshake.RequestToSend.ToString()); + handshakeComboBox.Items.Add(Handshake.XOnXOff.ToString()); + } + + int GetParityIx(Parity par) + { + if (par == Parity.None) return 0; + if (par == Parity.Even) return 0; + if (par == Parity.Odd) return 0; + return -1; + } + Parity GetParity(string str) + { + if (str.Equals(Parity.None.ToString())) return Parity.None; + if (str.Equals(Parity.Even.ToString())) return Parity.Even; + if (str.Equals(Parity.Odd.ToString())) return Parity.Odd; + return (Parity)(-1); + } + + int GetStopBitsIx(StopBits sb) + { + if (sb == StopBits.None) return 0; + if (sb == StopBits.One) return 1; + if (sb == StopBits.OnePointFive) return 2; + if (sb == StopBits.Two) return 3; + return -1; + } + StopBits GetStopBits(string str) + { + if (str.Equals(StopBits.None.ToString())) return StopBits.None; + if (str.Equals(StopBits.One.ToString())) return StopBits.One; + if (str.Equals(StopBits.OnePointFive.ToString())) return StopBits.OnePointFive; + if (str.Equals(StopBits.Two.ToString())) return StopBits.Two; + return (StopBits)(-1); + } + + int GetHandshakeIx(Handshake par) + { + if (par == Handshake.None) return 0; + if (par == Handshake.RequestToSend) return 0; + if (par == Handshake.XOnXOff) return 0; + return -1; + } + Handshake GetHandshake(string str) + { + if (str.Equals(Handshake.None.ToString())) return Handshake.None; + if (str.Equals(Handshake.RequestToSend.ToString())) return Handshake.RequestToSend; + if (str.Equals(Handshake.XOnXOff.ToString())) return Handshake.XOnXOff; + return (Handshake)(-1); + } + + private void AbbientCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + comPortNrTextBox.Text = config.ComPortNr.ToString(); + baudRateTextBox.Text = config.BaudRate.ToString(); + parityComboBox.Text = config.Parity.ToString(); + dataBitsTextBox.Text = config.DataBits.ToString(); + stopBitsComboBox.Text = config.StopBits.ToString(); + handshakeComboBox.Text = config.Handshake.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + comPortNrTextBox.Enabled = true; + baudRateTextBox.Enabled = true; + parityComboBox.Enabled = true; + dataBitsTextBox.Enabled = true; + stopBitsComboBox.Enabled = true; + handshakeComboBox.Enabled = true; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.ComPortNr = int.Parse(comPortNrTextBox.Text); + config.BaudRate = int.Parse(baudRateTextBox.Text); + config.Parity = GetParity(parityComboBox.SelectedItem.ToString()); + config.DataBits = int.Parse(dataBitsTextBox.Text); + config.StopBits = GetStopBits(stopBitsComboBox.SelectedItem.ToString()); + config.Handshake = GetHandshake(handshakeComboBox.SelectedItem.ToString()); + + return flags; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!int.TryParse(comPortNrTextBox.Text, out dummy) || dummy < 1 || dummy > 999) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Serial Port Number' is not valid"; + } + + if (!int.TryParse(baudRateTextBox.Text, out dummy) || dummy < 150 || dummy > 115200) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Baud Rate' is not valid"; + } + + if (!int.TryParse(dataBitsTextBox.Text, out dummy) || dummy < 7 || dummy > 8) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Data Bits' is not valid"; + } + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Comet/AmbientCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Comet/AmbientCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Comet/AmbientCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Comet/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Comet/Factory.cs new file mode 100644 index 00000000..49ce5862 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Comet/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Ambient.Comet +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return "Comet-Ambient"; } } + + public void ResetStaticProperties() { Ambient.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Ambient(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Ambient(cfg); } + + public IComponentCfg DefaultConfig() { return new AmbientCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(AmbientCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Greco/Ambient.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Greco/Ambient.cs new file mode 100644 index 00000000..5fbd9929 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Greco/Ambient.cs @@ -0,0 +1,213 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO.Ports; +using System.Text; +using log4net; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Boxes; + +namespace TBF.BenchControl.Ambient.Greco +{ + /// + /// Ambient temperature / humidity / pressure meter 'Greco' connected via serial interface (RS232) + /// Connection settings: 19200 Bd 8-bits No-parity 1-stop-bit Flow control: none or hardware. + /// + public class Ambient : ComponentBase, IDevice, IOperation, GenericDevices.IAmbient + { + private static readonly ILog log = LogManager.GetLogger(typeof(Ambient)); + public override string ToString() { return string.Format("Ambient({0})", Cfg.ToString(1)); } + + private readonly AmbientCfg ambientCfg; + + /// Private fields + SerialPort serialPort; + StringBuilder measurementBuilder; + + /// The state of the measurement + MsrmntState msrmntState; + + /// + /// Measured values when MsrmntState == MsrmntState.Valid + /// + float temperature; /// [°C] + float pressure; /// [bar] + float humidity; /// [R%] + + /// Measurement time stamp when MsrmntState == MsrmntState.Valid + int msrmntTimeStamp; + + public Ambient() + { + } + + /// + /// Ambient temperature / humidity / pressure meter 'Greco' connected via serial interface (RS232) + /// Connection settings: 19200 Bd 8-bits No-parity 1-stop-bit Flow control: none or hardware. + /// + public Ambient(AmbientCfg cfg, IList components) + : this(cfg) + { + } + + public Ambient(Generic.IComponentCfg cfg) + : base(cfg) + { + ambientCfg = cfg as AmbientCfg; + log.Debug(this.ToString()); + } + + public void Initialize() + { + if (ambientCfg.DebugLevel == DebugMode.Simulate) + { + temperature = 20.0f; + humidity = 40.0f; + pressure = 1.0f; + msrmntTimeStamp = StateMachine.Time; + msrmntState = MsrmntState.Valid; + return; + } + + string comPortName = "COM" + ambientCfg.ComPortNr.ToString(); + serialPort = new SerialPort(comPortName, ambientCfg.BaudRate, ambientCfg.Parity, ambientCfg.DataBits, ambientCfg.StopBits); + serialPort.Handshake = ambientCfg.Handshake; + serialPort.Open(); + measurementBuilder = new StringBuilder(40); + msrmntState = MsrmntState.Busy; + + log.FatalFormat("Successfully initialized device {0}", ToString()); + } + + /// Run this device + public void RunDeviceBefore() + { + if (ambientCfg.DebugLevel == DebugMode.Simulate || + ambientCfg.DebugLevel == DebugMode.FailureDuringOperation) + { + msrmntTimeStamp = StateMachine.Time; + return; + } + + try + { + measurementBuilder.Append(serialPort.ReadExisting()); + int len = measurementBuilder.Length; + + /// + /// Device sends each 20 sec one line of ASCII text with data in the following format: + /// (temp) 6 characters, two decimal digits, with leading spaces + /// TAB 1 character + /// (humi) 6 characters, two decimal digits, with leading spaces + /// TAB 1 character + /// (pressure) 6 characters, one decimal digits, with leading spaces is LT 1000 + /// CR + LF 2 characters + /// Example: + /// 23.42 38.08 1061.1 + /// 23.39 38.04 1060.8 + /// 23.39 38.08 1061.4 + /// + if (len >= 22) + { + string measurement = measurementBuilder.ToString(); + measurementBuilder.Clear(); + + float t = 0; + float h = 0; + float p = 0; + if (float.TryParse(measurement.Substring(len - 22, 6), NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingWhite, + CultureInfo.InvariantCulture, out t) && + measurement[len - 16] == '\t' && + float.TryParse(measurement.Substring(len - 15, 6), NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingWhite, + CultureInfo.InvariantCulture, out h) && + measurement[len - 9] == '\t' && + float.TryParse(measurement.Substring(len - 8, 6), NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingWhite, + CultureInfo.InvariantCulture, out p) && + measurement[len - 2] == '\r' && + measurement[len - 1] == '\n') + { + temperature = t; + humidity = h; + pressure = p / 1000.0F; + msrmntTimeStamp = StateMachine.Time; + msrmntState = MsrmntState.Valid; + + log.InfoFormat("Ambient: temperature = {0:F1} C, humidity = {1:F1} %, pressure = {2:F0} mbar", temperature, humidity, 1000 * pressure); + } + else + { + log.Warn("Invalid string received: " + measurement); + } + } + } + catch (Exception e) + { + DebugLevel = DebugMode.FailureDuringOperation; + serialPort = null; + + log.FatalFormat("Ambient: Serail port read failure : {0}", e.Message); + if (e.InnerException != null) + { + log.FatalFormat("InnerMessage : {0}", e.InnerException.Message); + } + } + } + + /// Run this device + public void RunDeviceAfter() + { + } + + /// Stop this device + public void StopDevice() + { + if (serialPort != null) serialPort.Close(); + } + + public void StopDevice2() { } + + /// + /// Boxes for the operation result + /// + FloatBox tempBox; + FloatBox pressureBox; + FloatBox humiBox; + + public IOperation ReadAmbientOp(FloatBox temperature, FloatBox pressure, FloatBox humidity) + { + this.tempBox = temperature; + this.pressureBox = pressure; + this.humiBox = humidity; + return this; + } + + /// Start this operation + public void Start() + { + if (tempBox != null) tempBox.Val = temperature; + if (pressureBox != null) pressureBox.Val = pressure; + if (humiBox != null) humiBox.Val = humidity; + } + + /// Run this operation + /// + /// Event.FlowInDone or Event.FlowOutDone + /// + public Event Run() + { + if (tempBox != null) tempBox.Val = temperature; + if (pressureBox != null) pressureBox.Val = pressure; + if (humiBox != null) humiBox.Val = humidity; + return Event.AmbientDone; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Greco/AmbientCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Greco/AmbientCfg.cs new file mode 100644 index 00000000..a3a6d94e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Greco/AmbientCfg.cs @@ -0,0 +1,54 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.IO; +using System.Collections.Generic; +using System.IO.Ports; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Ambient.Greco +{ + public class AmbientCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(AmbientCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new AmbientCfgCtrl(); } + + /// + /// Serialized parameters + /// + public int ComPortNr; + public int BaudRate; + public Parity Parity; + public int DataBits; + public StopBits StopBits; + public Handshake Handshake; + + /// Private parameterless constructor invoked by all other (public) constructors + AmbientCfg() + { + Name = "Ambient"; + ParentName = string.Empty; + ComPortNr = 6; + BaudRate = 19200; + Parity = System.IO.Ports.Parity.None; + DataBits = 8; + StopBits = System.IO.Ports.StopBits.One; + Handshake = System.IO.Ports.Handshake.None; + } + + public AmbientCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Com{1}, {2}Bd, {3}-bits, parity={4}, stopBits={5}, {6}", + Name, ComPortNr, BaudRate, DataBits, Parity, StopBits, Handshake); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Greco/AmbientCfgCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Greco/AmbientCfgCtrl.Designer.cs new file mode 100644 index 00000000..27dbfdd2 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Greco/AmbientCfgCtrl.Designer.cs @@ -0,0 +1,229 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.Ambient.Greco +{ + partial class AmbientCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.comPortNrTextBox = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.baudRateLabel = new System.Windows.Forms.Label(); + this.baudRateTextBox = new System.Windows.Forms.TextBox(); + this.partityLabel = new System.Windows.Forms.Label(); + this.dataBitsLabel = new System.Windows.Forms.Label(); + this.dataBitsTextBox = new System.Windows.Forms.TextBox(); + this.stopBitsLabel = new System.Windows.Forms.Label(); + this.handshakeLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.parityComboBox = new System.Windows.Forms.ComboBox(); + this.stopBitsComboBox = new System.Windows.Forms.ComboBox(); + this.handshakeComboBox = new System.Windows.Forms.ComboBox(); + this.SuspendLayout(); + // + // comPortNrTextBox + // + this.comPortNrTextBox.Enabled = false; + this.comPortNrTextBox.Location = new System.Drawing.Point(140, 52); + this.comPortNrTextBox.Name = "comPortNrTextBox"; + this.comPortNrTextBox.Size = new System.Drawing.Size(34, 20); + this.comPortNrTextBox.TabIndex = 4; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(29, 55); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(98, 13); + this.label1.TabIndex = 3; + this.label1.Text = "Serial Port Number:"; + // + // baudRateLabel + // + this.baudRateLabel.AutoSize = true; + this.baudRateLabel.Location = new System.Drawing.Point(29, 79); + this.baudRateLabel.Name = "baudRateLabel"; + this.baudRateLabel.Size = new System.Drawing.Size(58, 13); + this.baudRateLabel.TabIndex = 5; + this.baudRateLabel.Text = "Baud Rate"; + // + // baudRateTextBox + // + this.baudRateTextBox.Enabled = false; + this.baudRateTextBox.Location = new System.Drawing.Point(140, 76); + this.baudRateTextBox.Name = "baudRateTextBox"; + this.baudRateTextBox.Size = new System.Drawing.Size(130, 20); + this.baudRateTextBox.TabIndex = 6; + // + // partityLabel + // + this.partityLabel.AutoSize = true; + this.partityLabel.Location = new System.Drawing.Point(29, 103); + this.partityLabel.Name = "partityLabel"; + this.partityLabel.Size = new System.Drawing.Size(33, 13); + this.partityLabel.TabIndex = 7; + this.partityLabel.Text = "Parity"; + // + // dataBitsLabel + // + this.dataBitsLabel.AutoSize = true; + this.dataBitsLabel.Location = new System.Drawing.Point(29, 127); + this.dataBitsLabel.Name = "dataBitsLabel"; + this.dataBitsLabel.Size = new System.Drawing.Size(50, 13); + this.dataBitsLabel.TabIndex = 9; + this.dataBitsLabel.Text = "Data Bits"; + // + // dataBitsTextBox + // + this.dataBitsTextBox.Enabled = false; + this.dataBitsTextBox.Location = new System.Drawing.Point(140, 124); + this.dataBitsTextBox.Name = "dataBitsTextBox"; + this.dataBitsTextBox.Size = new System.Drawing.Size(34, 20); + this.dataBitsTextBox.TabIndex = 10; + // + // stopBitsLabel + // + this.stopBitsLabel.AutoSize = true; + this.stopBitsLabel.Location = new System.Drawing.Point(29, 151); + this.stopBitsLabel.Name = "stopBitsLabel"; + this.stopBitsLabel.Size = new System.Drawing.Size(49, 13); + this.stopBitsLabel.TabIndex = 11; + this.stopBitsLabel.Text = "Stop Bits"; + // + // handshakeLabel + // + this.handshakeLabel.AutoSize = true; + this.handshakeLabel.Location = new System.Drawing.Point(29, 175); + this.handshakeLabel.Name = "handshakeLabel"; + this.handshakeLabel.Size = new System.Drawing.Size(62, 13); + this.handshakeLabel.TabIndex = 13; + this.handshakeLabel.Text = "Handshake"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(140, 28); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(30, 31); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(137, 7); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // parityComboBox + // + this.parityComboBox.Enabled = false; + this.parityComboBox.FormattingEnabled = true; + this.parityComboBox.Location = new System.Drawing.Point(140, 100); + this.parityComboBox.Name = "parityComboBox"; + this.parityComboBox.Size = new System.Drawing.Size(130, 21); + this.parityComboBox.TabIndex = 8; + // + // stopBitsComboBox + // + this.stopBitsComboBox.Enabled = false; + this.stopBitsComboBox.FormattingEnabled = true; + this.stopBitsComboBox.Location = new System.Drawing.Point(140, 148); + this.stopBitsComboBox.Name = "stopBitsComboBox"; + this.stopBitsComboBox.Size = new System.Drawing.Size(130, 21); + this.stopBitsComboBox.TabIndex = 12; + // + // handshakeComboBox + // + this.handshakeComboBox.Enabled = false; + this.handshakeComboBox.FormattingEnabled = true; + this.handshakeComboBox.Location = new System.Drawing.Point(140, 172); + this.handshakeComboBox.Name = "handshakeComboBox"; + this.handshakeComboBox.Size = new System.Drawing.Size(130, 21); + this.handshakeComboBox.TabIndex = 14; + // + // AmbientCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.Control; + this.Controls.Add(this.handshakeComboBox); + this.Controls.Add(this.stopBitsComboBox); + this.Controls.Add(this.parityComboBox); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Controls.Add(this.handshakeLabel); + this.Controls.Add(this.stopBitsLabel); + this.Controls.Add(this.dataBitsTextBox); + this.Controls.Add(this.dataBitsLabel); + this.Controls.Add(this.partityLabel); + this.Controls.Add(this.baudRateTextBox); + this.Controls.Add(this.baudRateLabel); + this.Controls.Add(this.comPortNrTextBox); + this.Controls.Add(this.label1); + this.Name = "AmbientCfgCtrl"; + this.Size = new System.Drawing.Size(300, 240); + this.Load += new System.EventHandler(this.AbbientCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox comPortNrTextBox; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label baudRateLabel; + private System.Windows.Forms.TextBox baudRateTextBox; + private System.Windows.Forms.Label partityLabel; + private System.Windows.Forms.Label dataBitsLabel; + private System.Windows.Forms.TextBox dataBitsTextBox; + private System.Windows.Forms.Label stopBitsLabel; + private System.Windows.Forms.Label handshakeLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.ComboBox parityComboBox; + private System.Windows.Forms.ComboBox stopBitsComboBox; + private System.Windows.Forms.ComboBox handshakeComboBox; + + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Greco/AmbientCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Greco/AmbientCfgCtrl.cs new file mode 100644 index 00000000..aa5c6c37 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Greco/AmbientCfgCtrl.cs @@ -0,0 +1,169 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using System.IO.Ports; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Ambient.Greco +{ + public partial class AmbientCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + AmbientCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as AmbientCfg; + Redraw(); + } + } + + public AmbientCfgCtrl() + { + InitializeComponent(); + + parityComboBox.Items.Add(Parity.None.ToString()); + parityComboBox.Items.Add(Parity.Even.ToString()); + parityComboBox.Items.Add(Parity.Odd.ToString()); + + stopBitsComboBox.Items.Add(StopBits.None.ToString()); + stopBitsComboBox.Items.Add(StopBits.One.ToString()); + stopBitsComboBox.Items.Add(StopBits.OnePointFive.ToString()); + stopBitsComboBox.Items.Add(StopBits.Two.ToString()); + + handshakeComboBox.Items.Add(Handshake.None.ToString()); + handshakeComboBox.Items.Add(Handshake.RequestToSend.ToString()); + handshakeComboBox.Items.Add(Handshake.XOnXOff.ToString()); + } + + int GetParityIx(Parity par) + { + if (par == Parity.None) return 0; + if (par == Parity.Even) return 0; + if (par == Parity.Odd) return 0; + return -1; + } + Parity GetParity(string str) + { + if (str.Equals(Parity.None.ToString())) return Parity.None; + if (str.Equals(Parity.Even.ToString())) return Parity.Even; + if (str.Equals(Parity.Odd.ToString())) return Parity.Odd; + return (Parity)(-1); + } + + int GetStopBitsIx(StopBits sb) + { + if (sb == StopBits.None) return 0; + if (sb == StopBits.One) return 1; + if (sb == StopBits.OnePointFive) return 2; + if (sb == StopBits.Two) return 3; + return -1; + } + StopBits GetStopBits(string str) + { + if (str.Equals(StopBits.None.ToString())) return StopBits.None; + if (str.Equals(StopBits.One.ToString())) return StopBits.One; + if (str.Equals(StopBits.OnePointFive.ToString())) return StopBits.OnePointFive; + if (str.Equals(StopBits.Two.ToString())) return StopBits.Two; + return (StopBits)(-1); + } + + int GetHandshakeIx(Handshake par) + { + if (par == Handshake.None) return 0; + if (par == Handshake.RequestToSend) return 0; + if (par == Handshake.XOnXOff) return 0; + return -1; + } + Handshake GetHandshake(string str) + { + if (str.Equals(Handshake.None.ToString())) return Handshake.None; + if (str.Equals(Handshake.RequestToSend.ToString())) return Handshake.RequestToSend; + if (str.Equals(Handshake.XOnXOff.ToString())) return Handshake.XOnXOff; + return (Handshake)(-1); + } + + private void AbbientCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + comPortNrTextBox.Text = config.ComPortNr.ToString(); + baudRateTextBox.Text = config.BaudRate.ToString(); + parityComboBox.Text = config.Parity.ToString(); + dataBitsTextBox.Text = config.DataBits.ToString(); + stopBitsComboBox.Text = config.StopBits.ToString(); + handshakeComboBox.Text = config.Handshake.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + comPortNrTextBox.Enabled = true; + baudRateTextBox.Enabled = true; + parityComboBox.Enabled = true; + dataBitsTextBox.Enabled = true; + stopBitsComboBox.Enabled = true; + handshakeComboBox.Enabled = true; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.ComPortNr = int.Parse(comPortNrTextBox.Text); + config.BaudRate = int.Parse(baudRateTextBox.Text); + config.Parity = GetParity(parityComboBox.SelectedItem.ToString()); + config.DataBits = int.Parse(dataBitsTextBox.Text); + config.StopBits = GetStopBits(stopBitsComboBox.SelectedItem.ToString()); + config.Handshake = GetHandshake(handshakeComboBox.SelectedItem.ToString()); + + return flags; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!int.TryParse(comPortNrTextBox.Text, out dummy) || dummy < 1 || dummy > 999) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Serial Port Number' is not valid"; + } + + if (!int.TryParse(baudRateTextBox.Text, out dummy) || dummy < 150 || dummy > 115200) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Baud Rate' is not valid"; + } + + if (!int.TryParse(dataBitsTextBox.Text, out dummy) || dummy < 7 || dummy > 8) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Data Bits' is not valid"; + } + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Greco/AmbientCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Greco/AmbientCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Greco/AmbientCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Greco/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Greco/Factory.cs new file mode 100644 index 00000000..1b45b2e1 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Ambient/Greco/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Ambient.Greco +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return "Greco Ambient"; } } + + public void ResetStaticProperties() { Ambient.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Ambient(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Ambient(cfg); } + + public IComponentCfg DefaultConfig() { return new AmbientCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(AmbientCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Extended/Component.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Extended/Component.cs new file mode 100644 index 00000000..1e5a8734 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Extended/Component.cs @@ -0,0 +1,39 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Xml.Serialization; +using log4net; +using Config.Entities; +using TBF.BenchControl; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.BenchInfo.Extended +{ + /// + /// Holds information identifying the test bench. + /// + public class Component : ComponentBase, GenericDevices.IBenchInfo + { + private static readonly ILog log = LogManager.GetLogger(typeof(Component)); + public override string ToString() { return string.Format("BenchInfoEx({0})", Cfg.ToString(1)); } + + readonly ComponentCfg myCfg; + + public string TestBenchName { get { return myCfg.TestBenchName; } } + public int TestBenchId { get { return myCfg.TestBenchId; } } + public RemoteDBUse RemoteDBUse { get { return myCfg.RemoteDBUse; } } + + public Component() + { + } + + public Component(Generic.IComponentCfg cfg) + : base(cfg) + { + myCfg = cfg as ComponentCfg; + log.Debug(this.ToString()); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Extended/ComponentCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Extended/ComponentCfg.cs new file mode 100644 index 00000000..9299824c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Extended/ComponentCfg.cs @@ -0,0 +1,223 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.BenchInfo.Extended +{ + /// + /// Holds information identifying the test bench - serializable configuration. + /// + public class ComponentCfg : ComponentCfgBase, Generic.IComponentCfg, Config.Entities.IParamsProvider + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ComponentCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new Configs.ParamsProvider.ComponentCfgCtrl(this, null); } + + /// + /// Serialized parameters + /// + public string TestBenchName; + public int TestBenchId; + public string Address1; + public string Address2; + public string Address3; + public string Address4; + public string Address5; + public string ApprovalId; + public string ApprovalDate; + public string ApprovedBy; + public RemoteDBUse RemoteDBUse; + + /// Private parameterless constructor invoked by all other (public) constructors + ComponentCfg() {} + + public ComponentCfg(IComponentFactory factory) + : this() + { + Factory = factory; + Name = "BenchInfoEx"; + ParentName = string.Empty; + InitializeAll(); + } + + public string ToString(char a) + { + return string.Format("Name={0}, Parent={1}, ...", Name, ParentName); + } + + public string ComponentName { get { return Name; } } + + public void InitializeAll() + { + TestBenchName = "1"; + TestBenchId = 1; + + Address1 = string.Empty; + Address2 = string.Empty; + Address3 = string.Empty; + Address4 = string.Empty; + Address5 = string.Empty; + + ApprovalId = string.Empty; + ApprovalDate = string.Empty; + ApprovedBy = string.Empty; + + RemoteDBUse = RemoteDBUse.LocalDBOnly; + } + + string[] paramNames = new string[] + { + "Test bench name", + "Test bench ID", + "Address 1", + "Address 2", + "Address 3", + "Address 4", + "Address 5", + "Approval", + "Approval date", + "Approved by", + "Remote DB use", + }; + public string ParamName(int i) { return paramNames[i]; } + public int ParamsCount() { return paramNames.Length; } + + public IList ParamValues(int i) + { + if (i == 10) + { + IList list = new List(); + for (RemoteDBUse rdbu = 0; rdbu < RemoteDBUse.Count; rdbu++) list.Add(rdbu.ToDescription()); + return list; + } + else + { + return null; + } + } + + public string ToString(int i) + { + switch (i) + { + case 0: return TestBenchName; + case 1: return TestBenchId.ToString(); + case 2: return Address1; + case 3: return Address2; + case 4: return Address3; + case 5: return Address4; + case 6: return Address5; + case 7: return ApprovalId; + case 8: return ApprovalDate; + case 9: return ApprovedBy; + case 10: return RemoteDBUse.ToDescription(); + default: return string.Empty; + } + } + + public CfgUpdateFlags UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: TestBenchName = strValue; return CfgUpdateFlags.RestartRqrd; + case 1: TestBenchId = int.Parse(strValue); return CfgUpdateFlags.RestartRqrd; + case 2: Address1 = strValue; return CfgUpdateFlags.RestartRqrd; + case 3: Address2 = strValue; return CfgUpdateFlags.RestartRqrd; + case 4: Address3 = strValue; return CfgUpdateFlags.RestartRqrd; + case 5: Address4 = strValue; return CfgUpdateFlags.RestartRqrd; + case 6: Address5 = strValue; return CfgUpdateFlags.RestartRqrd; + case 7: ApprovalId = strValue; return CfgUpdateFlags.RestartRqrd; + case 8: ApprovalDate = strValue; return CfgUpdateFlags.RestartRqrd; + case 9: ApprovedBy = strValue; return CfgUpdateFlags.RestartRqrd; + + case 10: + for (RemoteDBUse rdbu = 0; rdbu < RemoteDBUse.Count; rdbu++) + { + if (strValue == rdbu.ToDescription()) + { + if (RemoteDBUse != rdbu) + { + RemoteDBUse = rdbu; + return CfgUpdateFlags.RestartRqrd; + } + else + { + return CfgUpdateFlags.None; + } + } + } + return CfgUpdateFlags.Error; + + default: return CfgUpdateFlags.None; + } + } + + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + int idummy; + + switch (i) + { + case 0: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + return true; + case 1: + if (int.TryParse(strValue, out idummy) && (idummy >= 0)) return true; + break; + case 10: + for (RemoteDBUse rdbu = 0; rdbu < RemoteDBUse.Count; rdbu++) + { + if (strValue == rdbu.ToDescription()) return true; + } + return false; + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(ComponentCfg prms) + { + prms.TestBenchName = this.TestBenchName; + prms.TestBenchId = this.TestBenchId; + prms.Address1 = this.Address1; + prms.Address2 = this.Address2; + prms.Address3 = this.Address3; + prms.Address4 = this.Address4; + prms.Address5 = this.Address5; + prms.ApprovalId = this.ApprovalId; + prms.ApprovalDate = this.ApprovalDate; + prms.ApprovedBy = this.ApprovedBy; + prms.RemoteDBUse = this.RemoteDBUse; + } + + public Config.Entities.IParamsProvider Clone() + { + ComponentCfg pars = new ComponentCfg(); + CopyContentTo(pars); + return pars; + } + + public void UpdateEmbeddedDbEntity() + { + /// Do nothing + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Extended/ComponentFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Extended/ComponentFactory.cs new file mode 100644 index 00000000..a2330c01 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Extended/ComponentFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.BenchInfo.Extended +{ + public class ComponentFactory : IComponentFactory + { + public string ClassName { get { return "BenchInfoEx"; } } + + public void ResetStaticProperties() { Component.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Component(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Component(cfg); } + + public IComponentCfg DefaultConfig() { return new ComponentCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(ComponentCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Munich/Component.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Munich/Component.cs new file mode 100644 index 00000000..37040289 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Munich/Component.cs @@ -0,0 +1,39 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Xml.Serialization; +using log4net; +using Config.Entities; +using TBF.BenchControl; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.BenchInfo.Munich +{ + /// + /// Holds information identifying the test bench. + /// + public class Component : ComponentBase, GenericDevices.IBenchInfo + { + private static readonly ILog log = LogManager.GetLogger(typeof(Component)); + public override string ToString() { return string.Format("BenchInfo({0})", Cfg.ToString(1)); } + + readonly ComponentCfg benchInfoCfg; + + public string TestBenchName { get { return benchInfoCfg.TestBenchName; } } + public int TestBenchId { get { return benchInfoCfg.TestBenchId; } } + public RemoteDBUse RemoteDBUse { get { return RemoteDBUse.LocalDBOnly; } } + + public Component() + { + } + + public Component(Generic.IComponentCfg cfg) + : base(cfg) + { + benchInfoCfg = cfg as ComponentCfg; + log.Debug(this.ToString()); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Munich/ComponentCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Munich/ComponentCfg.cs new file mode 100644 index 00000000..fe7d5369 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Munich/ComponentCfg.cs @@ -0,0 +1,48 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// Author: Milan Hanajík +/// +using System; +using System.Collections.Generic; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.BenchInfo.Munich +{ + /// + /// Holds information identifying the test bench - serializable configuration. + /// + public class ComponentCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ComponentCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new ComponentCfgCtrl(); } + + /// + /// Serialized parameters + /// + public string TestBenchName; + public int TestBenchId; + + /// Private parameterless constructor invoked by all other (public) constructors + ComponentCfg() + { + Name = "BenchInfo"; + ParentName = string.Empty; + TestBenchName = "1"; + TestBenchId = 1; + } + + public ComponentCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Bench name={1}, Bench Id={2}", Name, TestBenchName, TestBenchId); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Munich/ComponentCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Munich/ComponentCfgCtrl.cs new file mode 100644 index 00000000..da08cf69 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Munich/ComponentCfgCtrl.cs @@ -0,0 +1,88 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// Author: Milan Hanajík +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.BenchInfo.Munich +{ + public partial class ComponentCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + ComponentCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as ComponentCfg; + Redraw(); + } + } + + public ComponentCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + nameLabel.Text = Strings.Name; + benchNameLabel.Text = Strings.Test_bench_name; + benchIdLabel.Text = Strings.Test_bench_number; + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + benchNameTextBox.Text = config.TestBenchName; + benchIdTextBox.Text = config.TestBenchId.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + benchNameTextBox.Enabled = true; + benchIdTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!int.TryParse(benchIdTextBox.Text, out dummy) || dummy < 0) + { + flags = CfgUpdateFlags.Error; + message = string.Format("Invalid {0} parameter", Strings.Test_bench_number); + } + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + /// + config.Name = nameTextBox.Text; + config.TestBenchName = benchNameTextBox.Text; + config.TestBenchId = int.Parse(benchIdTextBox.Text); + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Munich/ComponentCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Munich/ComponentCfgCtrl.designer.cs new file mode 100644 index 00000000..d714ecd6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Munich/ComponentCfgCtrl.designer.cs @@ -0,0 +1,132 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.BenchInfo.Munich +{ + partial class ComponentCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.benchNameLabel = new System.Windows.Forms.Label(); + this.benchNameTextBox = new System.Windows.Forms.TextBox(); + this.benchIdTextBox = new System.Windows.Forms.TextBox(); + this.benchIdLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(140, 55); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 5; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(25, 58); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 4; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(137, 31); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(60, 13); + this.classNameLabel.TabIndex = 3; + this.classNameLabel.Text = "ClassName"; + // + // benchNameLabel + // + this.benchNameLabel.AutoSize = true; + this.benchNameLabel.Location = new System.Drawing.Point(25, 84); + this.benchNameLabel.Name = "benchNameLabel"; + this.benchNameLabel.Size = new System.Drawing.Size(90, 13); + this.benchNameLabel.TabIndex = 6; + this.benchNameLabel.Text = "Test bench name"; + // + // benchNameTextBox + // + this.benchNameTextBox.Enabled = false; + this.benchNameTextBox.Location = new System.Drawing.Point(140, 81); + this.benchNameTextBox.Name = "benchNameTextBox"; + this.benchNameTextBox.Size = new System.Drawing.Size(67, 20); + this.benchNameTextBox.TabIndex = 7; + // + // benchIdTextBox + // + this.benchIdTextBox.Enabled = false; + this.benchIdTextBox.Location = new System.Drawing.Point(140, 107); + this.benchIdTextBox.Name = "benchIdTextBox"; + this.benchIdTextBox.Size = new System.Drawing.Size(67, 20); + this.benchIdTextBox.TabIndex = 9; + // + // benchIdLabel + // + this.benchIdLabel.AutoSize = true; + this.benchIdLabel.Location = new System.Drawing.Point(25, 110); + this.benchIdLabel.Name = "benchIdLabel"; + this.benchIdLabel.Size = new System.Drawing.Size(99, 13); + this.benchIdLabel.TabIndex = 8; + this.benchIdLabel.Text = "Test bench number"; + // + // ComponentCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.benchIdTextBox); + this.Controls.Add(this.benchIdLabel); + this.Controls.Add(this.benchNameTextBox); + this.Controls.Add(this.benchNameLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "ComponentCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.Label benchNameLabel; + private System.Windows.Forms.TextBox benchNameTextBox; + private System.Windows.Forms.TextBox benchIdTextBox; + private System.Windows.Forms.Label benchIdLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Munich/ComponentCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Munich/ComponentCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Munich/ComponentCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Munich/ComponentFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Munich/ComponentFactory.cs new file mode 100644 index 00000000..f863e6f0 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Munich/ComponentFactory.cs @@ -0,0 +1,27 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// Author: Milan Hanajík +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.BenchInfo.Munich +{ + public class ComponentFactory : IComponentFactory + { + public string ClassName { get { return "Bench-ID"; } } + + public void ResetStaticProperties() { Component.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Component(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Component(cfg); } + + public IComponentCfg DefaultConfig() { return new ComponentCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(ComponentCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Polska/Component.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Polska/Component.cs new file mode 100644 index 00000000..3b7ccca6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Polska/Component.cs @@ -0,0 +1,39 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// Author: Milan Hanajík +/// +using System; +using System.Collections.Generic; +using System.Xml.Serialization; +using log4net; +using Config.Entities; +using TBF.BenchControl; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.BenchInfo.Polska +{ + /// + /// Holds information identifying the test bench. + /// + public class Component : ComponentBase, GenericDevices.IBenchInfo + { + private static readonly ILog log = LogManager.GetLogger(typeof(Component)); + public override string ToString() { return string.Format("BenchInfoEx({0})", Cfg.ToString(1)); } + + public readonly ComponentCfg BenchInfoCfg; + + public string TestBenchName { get { return BenchInfoCfg.TestBenchName; } } + public int TestBenchId { get { return BenchInfoCfg.TestBenchId; } } + + public Component() + { + } + + public Component(Generic.IComponentCfg cfg) + : base(cfg) + { + BenchInfoCfg = cfg as ComponentCfg; + log.Debug(this.ToString()); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Polska/ComponentCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Polska/ComponentCfg.cs new file mode 100644 index 00000000..3ffb8924 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Polska/ComponentCfg.cs @@ -0,0 +1,66 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// Author: Milan Hanajík +/// +using System; +using System.Collections.Generic; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.BenchInfo.Polska +{ + /// + /// Holds information identifying the test bench - serializable configuration. + /// + public class ComponentCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ComponentCfg) })[0]; + protected override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new ComponentCfgCtrl(); } + + /// + /// Serialized parameters + /// + public string TestBenchName; + public int TestBenchId; + public string Address1; + public string Address2; + public string Address3; + public string Address4; + public string Address5; + public string ApprovalId; + public string ApprovalDate; + public string ApprovedBy; + + /// Private parameterless constructor invoked by all other (public) constructors + ComponentCfg() + { + Name = "BenchInfoEx"; + ParentName = string.Empty; + TestBenchName = "1"; + TestBenchId = 1; + + Address1 = string.Empty; + Address2 = string.Empty; + Address3 = string.Empty; + Address4 = string.Empty; + Address5 = string.Empty; + + ApprovalId = string.Empty; + ApprovalDate = string.Empty; + ApprovedBy = string.Empty; + } + + public ComponentCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Bench name={1}, Bench Id={2}", Name, TestBenchName, TestBenchId); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Polska/ComponentCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Polska/ComponentCfgCtrl.cs new file mode 100644 index 00000000..ef92b14f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Polska/ComponentCfgCtrl.cs @@ -0,0 +1,130 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// Author: Milan Hanajík +/// +using System; +using System.Windows.Forms; +using log4net; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.BenchInfo.Polska +{ + public partial class ComponentCfgCtrl : UserControl, IComponentCfgCtrl + { + static readonly ILog log = LogManager.GetLogger(typeof(ComponentCfgCtrl)); + + public bool ShowMore { get { return false; } } + + ComponentCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as ComponentCfg; + Redraw(); + } + } + + public ComponentCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + nameLabel.Text = Strings.Name; + benchNameLabel.Text = Strings.Test_bench_name; + benchIdLabel.Text = Strings.Test_bench_number; + + address1Label.Text = Strings.Address + " 1"; + address2Label.Text = Strings.Address + " 2"; + address3Label.Text = Strings.Address + " 3"; + address4Label.Text = Strings.Address + " 4"; + address5Label.Text = Strings.Address + " 5"; + + approvalIdLabel.Text = Strings.Approval_ID; + approvalDateLabel.Text = Strings.Approval_date; + approvedByLabel.Text = Strings.Approved_by; + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + benchNameTextBox.Text = config.TestBenchName; + benchIdTextBox.Text = config.TestBenchId.ToString(); + + address1TextBox.Text = config.Address1; + address2TextBox.Text = config.Address2; + address3TextBox.Text = config.Address3; + address4TextBox.Text = config.Address4; + address5TextBox.Text = config.Address5; + + approvalIdTextBox.Text = config.ApprovalId; + approvalDateTextBox.Text = config.ApprovalDate; + approvedByTextBox.Text = config.ApprovedBy; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + benchNameTextBox.Enabled = true; + benchIdTextBox.Enabled = true; + + address1TextBox.Enabled = true; + address2TextBox.Enabled = true; + address3TextBox.Enabled = true; + address4TextBox.Enabled = true; + address5TextBox.Enabled = true; + + approvalIdTextBox.Enabled = true; + approvalDateTextBox.Enabled = true; + approvedByTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!int.TryParse(benchIdTextBox.Text, out dummy) || dummy < 0) + { + flags = CfgUpdateFlags.Error; + message = string.Format("Invalid {0} parameter", Strings.Test_bench_number); + } + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + /// + config.Name = nameTextBox.Text; + config.TestBenchName = benchNameTextBox.Text; + config.TestBenchId = int.Parse(benchIdTextBox.Text); + + config.Address1 = address1TextBox.Text; + config.Address2 = address2TextBox.Text; + config.Address3 = address3TextBox.Text; + config.Address4 = address4TextBox.Text; + config.Address5 = address5TextBox.Text; + + config.ApprovalId = approvalIdTextBox.Text; + config.ApprovalDate = approvalDateTextBox.Text; + config.ApprovedBy = approvedByTextBox.Text; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Polska/ComponentCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Polska/ComponentCfgCtrl.designer.cs new file mode 100644 index 00000000..d8beed28 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Polska/ComponentCfgCtrl.designer.cs @@ -0,0 +1,316 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.BenchInfo.Polska +{ + partial class ComponentCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.benchIdLabel = new System.Windows.Forms.Label(); + this.benchIdTextBox = new System.Windows.Forms.TextBox(); + this.address1TextBox = new System.Windows.Forms.TextBox(); + this.address1Label = new System.Windows.Forms.Label(); + this.address2TextBox = new System.Windows.Forms.TextBox(); + this.address2Label = new System.Windows.Forms.Label(); + this.address3TextBox = new System.Windows.Forms.TextBox(); + this.address3Label = new System.Windows.Forms.Label(); + this.address4TextBox = new System.Windows.Forms.TextBox(); + this.address4Label = new System.Windows.Forms.Label(); + this.address5TextBox = new System.Windows.Forms.TextBox(); + this.address5Label = new System.Windows.Forms.Label(); + this.approvedByTextBox = new System.Windows.Forms.TextBox(); + this.approvedByLabel = new System.Windows.Forms.Label(); + this.approvalDateTextBox = new System.Windows.Forms.TextBox(); + this.approvalDateLabel = new System.Windows.Forms.Label(); + this.approvalIdTextBox = new System.Windows.Forms.TextBox(); + this.approvalIdLabel = new System.Windows.Forms.Label(); + this.benchNameTextBox = new System.Windows.Forms.TextBox(); + this.benchNameLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(113, 24); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(180, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(6, 27); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(110, 6); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(60, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ClassName"; + // + // benchIdLabel + // + this.benchIdLabel.AutoSize = true; + this.benchIdLabel.Location = new System.Drawing.Point(6, 66); + this.benchIdLabel.Name = "benchIdLabel"; + this.benchIdLabel.Size = new System.Drawing.Size(99, 13); + this.benchIdLabel.TabIndex = 5; + this.benchIdLabel.Text = "Test bench number"; + // + // benchIdTextBox + // + this.benchIdTextBox.Enabled = false; + this.benchIdTextBox.Location = new System.Drawing.Point(113, 64); + this.benchIdTextBox.Name = "benchIdTextBox"; + this.benchIdTextBox.Size = new System.Drawing.Size(57, 20); + this.benchIdTextBox.TabIndex = 6; + // + // address1TextBox + // + this.address1TextBox.Enabled = false; + this.address1TextBox.Location = new System.Drawing.Point(73, 86); + this.address1TextBox.Name = "address1TextBox"; + this.address1TextBox.Size = new System.Drawing.Size(220, 20); + this.address1TextBox.TabIndex = 8; + // + // address1Label + // + this.address1Label.AutoSize = true; + this.address1Label.Location = new System.Drawing.Point(6, 89); + this.address1Label.Name = "address1Label"; + this.address1Label.Size = new System.Drawing.Size(54, 13); + this.address1Label.TabIndex = 7; + this.address1Label.Text = "Address 1"; + // + // address2TextBox + // + this.address2TextBox.Enabled = false; + this.address2TextBox.Location = new System.Drawing.Point(73, 106); + this.address2TextBox.Name = "address2TextBox"; + this.address2TextBox.Size = new System.Drawing.Size(220, 20); + this.address2TextBox.TabIndex = 10; + // + // address2Label + // + this.address2Label.AutoSize = true; + this.address2Label.Location = new System.Drawing.Point(6, 109); + this.address2Label.Name = "address2Label"; + this.address2Label.Size = new System.Drawing.Size(54, 13); + this.address2Label.TabIndex = 9; + this.address2Label.Text = "Address 2"; + // + // address3TextBox + // + this.address3TextBox.Enabled = false; + this.address3TextBox.Location = new System.Drawing.Point(73, 126); + this.address3TextBox.Name = "address3TextBox"; + this.address3TextBox.Size = new System.Drawing.Size(220, 20); + this.address3TextBox.TabIndex = 12; + // + // address3Label + // + this.address3Label.AutoSize = true; + this.address3Label.Location = new System.Drawing.Point(6, 129); + this.address3Label.Name = "address3Label"; + this.address3Label.Size = new System.Drawing.Size(54, 13); + this.address3Label.TabIndex = 11; + this.address3Label.Text = "Address 3"; + // + // address4TextBox + // + this.address4TextBox.Enabled = false; + this.address4TextBox.Location = new System.Drawing.Point(73, 146); + this.address4TextBox.Name = "address4TextBox"; + this.address4TextBox.Size = new System.Drawing.Size(220, 20); + this.address4TextBox.TabIndex = 14; + // + // address4Label + // + this.address4Label.AutoSize = true; + this.address4Label.Location = new System.Drawing.Point(6, 149); + this.address4Label.Name = "address4Label"; + this.address4Label.Size = new System.Drawing.Size(54, 13); + this.address4Label.TabIndex = 13; + this.address4Label.Text = "Address 4"; + // + // address5TextBox + // + this.address5TextBox.Enabled = false; + this.address5TextBox.Location = new System.Drawing.Point(73, 166); + this.address5TextBox.Name = "address5TextBox"; + this.address5TextBox.Size = new System.Drawing.Size(220, 20); + this.address5TextBox.TabIndex = 16; + // + // address5Label + // + this.address5Label.AutoSize = true; + this.address5Label.Location = new System.Drawing.Point(6, 169); + this.address5Label.Name = "address5Label"; + this.address5Label.Size = new System.Drawing.Size(54, 13); + this.address5Label.TabIndex = 15; + this.address5Label.Text = "Address 5"; + // + // approvedByTextBox + // + this.approvedByTextBox.Enabled = false; + this.approvedByTextBox.Location = new System.Drawing.Point(113, 227); + this.approvedByTextBox.Name = "approvedByTextBox"; + this.approvedByTextBox.Size = new System.Drawing.Size(180, 20); + this.approvedByTextBox.TabIndex = 22; + // + // approvedByLabel + // + this.approvedByLabel.AutoSize = true; + this.approvedByLabel.Location = new System.Drawing.Point(6, 230); + this.approvedByLabel.Name = "approvedByLabel"; + this.approvedByLabel.Size = new System.Drawing.Size(67, 13); + this.approvedByLabel.TabIndex = 21; + this.approvedByLabel.Text = "Approved by"; + // + // approvalDateTextBox + // + this.approvalDateTextBox.Enabled = false; + this.approvalDateTextBox.Location = new System.Drawing.Point(113, 207); + this.approvalDateTextBox.Name = "approvalDateTextBox"; + this.approvalDateTextBox.Size = new System.Drawing.Size(180, 20); + this.approvalDateTextBox.TabIndex = 20; + // + // approvalDateLabel + // + this.approvalDateLabel.AutoSize = true; + this.approvalDateLabel.Location = new System.Drawing.Point(6, 210); + this.approvalDateLabel.Name = "approvalDateLabel"; + this.approvalDateLabel.Size = new System.Drawing.Size(73, 13); + this.approvalDateLabel.TabIndex = 19; + this.approvalDateLabel.Text = "Approval date"; + // + // approvalIdTextBox + // + this.approvalIdTextBox.Enabled = false; + this.approvalIdTextBox.Location = new System.Drawing.Point(113, 187); + this.approvalIdTextBox.Name = "approvalIdTextBox"; + this.approvalIdTextBox.Size = new System.Drawing.Size(180, 20); + this.approvalIdTextBox.TabIndex = 18; + // + // approvalIdLabel + // + this.approvalIdLabel.AutoSize = true; + this.approvalIdLabel.Location = new System.Drawing.Point(6, 190); + this.approvalIdLabel.Name = "approvalIdLabel"; + this.approvalIdLabel.Size = new System.Drawing.Size(61, 13); + this.approvalIdLabel.TabIndex = 17; + this.approvalIdLabel.Text = "Approval Id"; + // + // benchNameTextBox + // + this.benchNameTextBox.Enabled = false; + this.benchNameTextBox.Location = new System.Drawing.Point(113, 44); + this.benchNameTextBox.Name = "benchNameTextBox"; + this.benchNameTextBox.Size = new System.Drawing.Size(180, 20); + this.benchNameTextBox.TabIndex = 4; + // + // benchNameLabel + // + this.benchNameLabel.AutoSize = true; + this.benchNameLabel.Location = new System.Drawing.Point(6, 46); + this.benchNameLabel.Name = "benchNameLabel"; + this.benchNameLabel.Size = new System.Drawing.Size(90, 13); + this.benchNameLabel.TabIndex = 3; + this.benchNameLabel.Text = "Test bench name"; + // + // ComponentCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.benchNameTextBox); + this.Controls.Add(this.benchNameLabel); + this.Controls.Add(this.approvedByTextBox); + this.Controls.Add(this.approvedByLabel); + this.Controls.Add(this.approvalDateTextBox); + this.Controls.Add(this.approvalDateLabel); + this.Controls.Add(this.approvalIdTextBox); + this.Controls.Add(this.approvalIdLabel); + this.Controls.Add(this.address5TextBox); + this.Controls.Add(this.address5Label); + this.Controls.Add(this.address4TextBox); + this.Controls.Add(this.address4Label); + this.Controls.Add(this.address3TextBox); + this.Controls.Add(this.address3Label); + this.Controls.Add(this.address2TextBox); + this.Controls.Add(this.address2Label); + this.Controls.Add(this.address1TextBox); + this.Controls.Add(this.address1Label); + this.Controls.Add(this.benchIdTextBox); + this.Controls.Add(this.benchIdLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "ComponentCfgCtrl"; + this.Size = new System.Drawing.Size(300, 250); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.Label benchIdLabel; + private System.Windows.Forms.TextBox benchIdTextBox; + private System.Windows.Forms.TextBox address1TextBox; + private System.Windows.Forms.Label address1Label; + private System.Windows.Forms.TextBox address2TextBox; + private System.Windows.Forms.Label address2Label; + private System.Windows.Forms.TextBox address3TextBox; + private System.Windows.Forms.Label address3Label; + private System.Windows.Forms.TextBox address4TextBox; + private System.Windows.Forms.Label address4Label; + private System.Windows.Forms.TextBox address5TextBox; + private System.Windows.Forms.Label address5Label; + private System.Windows.Forms.TextBox approvedByTextBox; + private System.Windows.Forms.Label approvedByLabel; + private System.Windows.Forms.TextBox approvalDateTextBox; + private System.Windows.Forms.Label approvalDateLabel; + private System.Windows.Forms.TextBox approvalIdTextBox; + private System.Windows.Forms.Label approvalIdLabel; + private System.Windows.Forms.TextBox benchNameTextBox; + private System.Windows.Forms.Label benchNameLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Polska/ComponentCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Polska/ComponentCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Polska/ComponentCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Polska/ComponentFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Polska/ComponentFactory.cs new file mode 100644 index 00000000..b5d150e2 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/BenchInfo/Polska/ComponentFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.BenchInfo.Polska +{ + public class ComponentFactory : IComponentFactory + { + public string ClassName { get { return "BenchInfoEx"; } } + + public void ResetStaticProperties() { Component.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Component(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Component(cfg); } + + public IComponentCfg DefaultConfig() { return new ComponentCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(ComponentCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/BenchPath.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/BenchPath.cs new file mode 100644 index 00000000..04995df0 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/BenchPath.cs @@ -0,0 +1,62 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl +{ + public class BenchPath + { + public int ItemNr; + public string Name; + public float Qfrom; + public float Qto; + public ITempMeter TempMtrUp; + public ITempMeter TempMtrDown; + public IPressureMeter PressMtrUp; + public IPressureMeter PressMtrDown; + public IPressureMeter PressMtrDelta; + public IValve StopBFValve; + public IList ValvesOpen; + public IList ValvesClose; + + /// Constructor from name, the rest is empty + public BenchPath(string name, int itemNr) + { + ItemNr = itemNr; + Name = name; + ValvesOpen = new List(); + ValvesClose = new List(); + } + + /// Constructor from data entity + public BenchPath(Config.Entities.BenchPath entity, IList components) + : this(entity.Name, entity.ItemNr) + { + Qfrom = entity.Qfrom; + Qto = entity.Qto; + TempMtrUp = TbfComponents.FindComponent(entity.TempMtrUp, components) as ITempMeter; + TempMtrDown = TbfComponents.FindComponent(entity.TempMtrDown, components) as ITempMeter; + PressMtrUp = TbfComponents.FindComponent(entity.PressMtrUp, components) as IPressureMeter; + PressMtrDown = TbfComponents.FindComponent(entity.PressMtrDown, components) as IPressureMeter; + PressMtrDelta = TbfComponents.FindComponent(entity.PressMtrDelta, components) as IPressureMeter; + StopBFValve = TbfComponents.FindComponent(entity.StopBFValve, components) as IValve; + + string[] vOpen = entity.ValvesOpen.Split(new char[] { ';' }); + ValvesOpen = new List(); + foreach (var vName in vOpen) ValvesOpen.Add((IValve)TbfComponents.FindComponent(vName, components)); + + string[] vClose = entity.ValvesClose.Split(new char[] { ';' }); + ValvesClose = new List(); + foreach (var vName in vClose) ValvesClose.Add((IValve)TbfComponents.FindComponent(vName, components)); + } + + public override string ToString() + { + return string.Format("{0} StopBF={1}", + Name, + (StopBFValve != null) ? StopBFValve.Name : "---"); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/CfgChangeArgs.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/CfgChangeArgs.cs new file mode 100644 index 00000000..29752f86 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/CfgChangeArgs.cs @@ -0,0 +1,19 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; + +namespace TBF.BenchControl +{ + public class CfgChangeArgs : EventArgs + { + public CfgChangeCmd Command; + public Generic.IComponentCfg Cfg; + + public CfgChangeArgs(CfgChangeCmd command, Generic.IComponentCfg cfg) + { + Command = command; + Cfg = cfg; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/CmdResponseArgs.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/CmdResponseArgs.cs new file mode 100644 index 00000000..c62ad75c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/CmdResponseArgs.cs @@ -0,0 +1,21 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; + +namespace TBF.BenchControl +{ + public class CmdResponseArgs : EventArgs + { + public CfgChangeCmd Command; + public int Id; /// Either Idx1(RV) or BitPosition (Div) to identify the component + public int Response; + + public CmdResponseArgs(CfgChangeCmd command, int id, int response) + { + Command = command; + Id = id; + Response = response; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/ComponentBase.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/ComponentBase.cs new file mode 100644 index 00000000..ddfc734e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/ComponentBase.cs @@ -0,0 +1,50 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl +{ + public class ComponentBase : IComponent + { + readonly Generic.IComponentCfg cfg; + public Generic.IComponentCfg Cfg { get { return cfg; } } + + public string Name { get { return cfg.Name; } } + public string ClassName { get { return cfg.Factory.ClassName; } } + public string ParentName { get { return cfg.ParentName; } } + public Generic.IComponentFactory Factory { get { return cfg.Factory; } } + public int ItemNr { get { return cfg.ItemNr; } } + public DebugMode DebugLevel { get { return cfg.DebugLevel; } set { cfg.DebugLevel = value; } } + public LogLevel LogLevel { get { return cfg.LogLevel; } } + public IList Corrections { get { return cfg.Corrections; } } + + + /// Constructor, components created in this way is used by + /// IComponentFactory.DummyComponent() function. Such dummy component should be used + /// only for runtime class type identification (e.g. object is iValve) + public ComponentBase() + { + cfg = null; + } + + /// Constructor with configuration as an argument + public ComponentBase(IComponentCfg cfg) + { + if (cfg == null) throw new ArgumentNullException("cfg"); + this.cfg = cfg; + } + + /// Empty implementation, might be overriden in derived classes + public static void ResetStaticProperties() { } + + /// Empty implementation, might be overriden in derived classes + public virtual void StartChangeHandler() { } + + /// Empty implementation, might be overriden in derived classes + public virtual void StopChangeHandler() { } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/ComponentCfgBase.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/ComponentCfgBase.cs new file mode 100644 index 00000000..f1aedf6c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/ComponentCfgBase.cs @@ -0,0 +1,269 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl +{ + public class ComponentCfgBase + { + [XmlIgnore] + public string Name + { + get { return name; } + set { name = value; } + } + string name; + + [XmlIgnore] + public Generic.IComponentFactory Factory + { + get { return factory; } + set { factory = value; } + } + Generic.IComponentFactory factory; + + [XmlIgnore] + public string ParentName + { + get { return parentName; } + set { parentName = value; } + } + string parentName; + + [XmlIgnore] + public int ItemNr + { + get { return itemNr; } + set { itemNr = value; } + } + int itemNr; + + [XmlIgnore] + public DebugMode DebugLevel + { + get { return debugLevel; } + set { debugLevel = value; } + } + DebugMode debugLevel; + + [XmlIgnore] + public LogLevel LogLevel + { + get { return logLevel; } + set { logLevel = value; } + } + LogLevel logLevel; + + [XmlIgnore] + public IList Corrections + { + get { return corrections; } + set { corrections = value; } + } + IList corrections; + + protected ComponentCfgBase() + { + itemNr = 0; + debugLevel = DebugMode.Normal; + logLevel = LogLevel.Off; + } + + protected ComponentCfgBase(Generic.IComponentFactory factory) + : this() + { + this.factory = factory; + } + + protected ComponentCfgBase(Generic.IComponentFactory factory, string name) + : this(factory) + { + this.name = name; + } + + protected ComponentCfgBase(Generic.IComponentFactory factory, string name, string parentName) + : this(factory, name) + { + this.parentName = parentName; + } + + + public virtual XmlSerializer GetSerializer() { return new XmlSerializer(GetType()); } + + public Component CreateDbEntity() + { + using (var writer = new StringWriter()) + { + GetSerializer().Serialize(writer, this); + return Component.CreateFromCfg(Name, factory.ClassName, ParentName, ItemNr, DebugLevel, LogLevel, writer.ToString()); + } + } + + public static IComponentCfg CreateFromDbEntity(XmlSerializer s, Component cmpntEntity, IComponentFactory factory) + { + using (var reader = new StringReader(cmpntEntity.Parameters)) + { + IComponentCfg config = s.Deserialize(reader) as IComponentCfg; + if (config != null) + { + config.Name = cmpntEntity.Name; + config.ParentName = cmpntEntity.ParentName; + config.ItemNr = cmpntEntity.ItemNr; + config.DebugLevel = cmpntEntity.Mode; + config.LogLevel = cmpntEntity.Logging; + config.Corrections = cmpntEntity.Corrections; + config.Factory = factory; + } + return config; + } + } + + + public void LoadTestParamsFromDB(Test test) + { + ITestParams tstPrms = (GetRuntimeTestParamsProvider() as ITestParams); + if (tstPrms != null) + { + tstPrms.FromDbEntity(Name, test); + } + } + + + public void LoadProcedureParamsFromDB(Procedure procedure) + { + IProcedureParams procPrms = (GetRuntimeProcParamsProvider() as IProcedureParams); + if (procPrms != null) + { + procPrms.FromDbEntity(Name, procedure); + } + } + + + /// + /// If there are any procedure parameters, this function should be overriden + /// by one returning a reference to a newly created object + /// implementing IParamsProvider and IProcedureParams. + /// + /// This default implementation returns null = no procedure parameters. + /// + /// Procedure parameters provider for this component or null + public virtual IParamsProvider CreateProcParamsProvider() + { + return null; + } + + /// + /// If there are any procedure parameters, this function should be overriden + /// by one returning a reference to an object + /// implementing IParamsProvider and IProcedureParams used in runtime. + /// + /// This default implementation returns null = no procedure parameters. + /// + /// Procedure parameters provider for this component or null + public virtual IParamsProvider GetRuntimeProcParamsProvider() + { + return null; + } + + public virtual IParamsProvider GetUIProcParamsProvider(Procedure procedure) + { + if (GetRuntimeProcParamsProvider() == null) + { + /// Component has no test parametes + return null; + } + + ComponentProcedure procParamsEntity = procedure.GetProcedureParamsEntity(Name); + + if (procParamsEntity != null) + { + if (procParamsEntity.GetParamsProvider() != null) + { + /// Parameters provider for this entity already fetched - return it + return procParamsEntity.GetParamsProvider(); + } + else + { + /// Parameters provider for this entity will be created and updated from the entity later on + IParamsProvider paramsProvider = CreateProcParamsProvider(); + (paramsProvider as IProcedureParams).UpdateFromDbEntity(procParamsEntity); + procParamsEntity.SetParamsProvider(paramsProvider); + return paramsProvider; + } + } + else + { + IParamsProvider paramsProvider = CreateProcParamsProvider(); + (paramsProvider as IProcedureParams).FromDbEntity(Name, procedure); + return paramsProvider; + } + } + + + /// + /// If there are any procedure parameters, this function should be overriden + /// by one returning a reference to a newly created object + /// implementing IParamsProvider and ITestParams. + /// + /// This default implementation returns null = no test parameters. + /// + /// Procedure parameters provider for this component or null + public virtual IParamsProvider CreateTestParamsProvider() + { + return null; + } + + /// + /// If there are any test parameters, this function should be overriden + /// by one returning a reference to an object + /// implementing IParamsProvider and ITestParams used in runtime. + /// + /// This default implementation returns null = no test parameters. + /// + /// Test parameters provider for this component or null + public virtual IParamsProvider GetRuntimeTestParamsProvider() + { + return null; + } + + public virtual IParamsProvider GetUITestParamsProvider(Test test) + { + if (GetRuntimeTestParamsProvider() == null) + { + /// Component has no test parametes + return null; + } + + ComponentTest testParamsEntity = test.GetTestParamsEntity(Name); + + if (testParamsEntity != null) + { + if (testParamsEntity.GetParamsProvider() != null) + { + /// Parameters provider for this entity already fetched - return it + return testParamsEntity.GetParamsProvider(); + } + else + { + /// Parameters provider for this entity will be created and updated from the entity later on + IParamsProvider paramsProvider = CreateTestParamsProvider(); + (paramsProvider as ITestParams).UpdateFromDbEntity(testParamsEntity); + testParamsEntity.SetParamsProvider(paramsProvider); + return paramsProvider; + } + } + else + { + IParamsProvider paramsProvider = CreateTestParamsProvider(); + (paramsProvider as ITestParams).FromDbEntity(Name, test); + return paramsProvider; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Configs/ConfigCtrlUtils.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Configs/ConfigCtrlUtils.cs new file mode 100644 index 00000000..8de35ae7 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Configs/ConfigCtrlUtils.cs @@ -0,0 +1,126 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl; + +namespace TBF.BenchControl.Configs +{ + public class ConfigCtrlUtils : UserControl + { + protected PageOrientation GetOrientation(string str) + { + if (str.Equals(PageOrientation.Landscape.ToString())) return PageOrientation.Landscape; + if (str.Equals(PageOrientation.Portrait.ToString())) return PageOrientation.Portrait; + return (PageOrientation)(-1); + } + + /// + /// Updates destination variable when its value differes from the source value. + /// Returns appropriate flags + /// + /// Reference to destination variable + /// Source value + /// Flags returned when an update occurs + /// Flags or 0 + protected CfgUpdateFlags UpdateDifferent(ref int cfgVar, int intVal, CfgUpdateFlags flagsWhenUpdated) + { + if (cfgVar != intVal) { cfgVar = intVal; return flagsWhenUpdated; } else return 0; + } + + /// + /// Updates destination variable when its value differes from the source value. + /// Returns appropriate flags + /// + /// Reference to destination variable + /// Source integer value is obtained by parsing this string + /// Flags returned when an update occurs + /// Flags or 0 + protected CfgUpdateFlags UpdateDifferent(ref int cfgVar, string toBeParsedString, CfgUpdateFlags flagsWhenUpdated) + { + int itmp = int.Parse(toBeParsedString); + if (cfgVar != itmp) { cfgVar = itmp; return flagsWhenUpdated; } else return 0; + } + + /// + /// Updates destination variable when its value differes from the source value. + /// Returns appropriate flags + /// + /// Reference to destination variable + /// Source integer value is obtained by parsing this string + /// Flags returned when an update occurs + /// Flags or 0 + protected CfgUpdateFlags UpdateDifferent(ref float cfgVar, string toBeParsedString, CfgUpdateFlags flagsWhenUpdated) + { + float ftmp = Utils.ParseSFloat(toBeParsedString); + if (cfgVar != ftmp) { cfgVar = ftmp; return flagsWhenUpdated; } else return 0; + } + + /// + /// Updates destination variable when its value differes from the source value. + /// Returns appropriate flags + /// + /// Reference to destination variable + /// Source integer value is obtained by parsing this string + /// Flags returned when an update occurs + /// Flags or 0 + protected CfgUpdateFlags UpdateDifferent(ref double cfgVar, string toBeParsedString, CfgUpdateFlags flagsWhenUpdated) + { + double dtmp = Utils.ParseSDouble(toBeParsedString); + if (cfgVar != dtmp) { cfgVar = dtmp; return flagsWhenUpdated; } else return 0; + } + + /// + /// Updates destination variable when its value differes from the source value. + /// Returns appropriate flags + /// + /// Reference to destination variable + /// Source value + /// Flags returned when an update occurs + /// Flags or 0 + protected CfgUpdateFlags UpdateDifferent(ref bool cfgVar, bool boolVal, CfgUpdateFlags flagsWhenUpdated) + { + if (cfgVar != boolVal) { cfgVar = boolVal; return flagsWhenUpdated; } else return 0; + } + + /// + /// Updates destination variable when its value differes from the source value. + /// Returns appropriate flags + /// + /// Reference to destination variable + /// Source value + /// Flags returned when an update occurs + /// Flags or 0 + protected CfgUpdateFlags UpdateDifferent(ref string cfgVar, string stringVal, CfgUpdateFlags flagsWhenUpdated) + { + if (cfgVar != stringVal) { cfgVar = stringVal; return flagsWhenUpdated; } else return 0; + } + + /// + /// Updates destination variable when its value differes from the source value. + /// Returns appropriate flags + /// + /// Reference to destination array + /// Source array of strings + /// Flags returned when an update occurs + /// Flags or 0 + protected CfgUpdateFlags UpdateDifferent(ref string[] cfgVar, string[] stringArrVal, CfgUpdateFlags flagsWhenUpdated) + { + if (cfgVar == null && stringArrVal == null) + { + return 0; + } + else if (cfgVar == null || stringArrVal == null || !cfgVar.SequenceEqual(stringArrVal)) + { + cfgVar = stringArrVal; + return flagsWhenUpdated; + } + else + { + return 0; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Configs/NameOnly/TestMethodCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Configs/NameOnly/TestMethodCfg.cs new file mode 100644 index 00000000..a8b7645e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Configs/NameOnly/TestMethodCfg.cs @@ -0,0 +1,32 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using TBF.BenchControl.Generic; +using System.Xml.Serialization; + +namespace TBF.BenchControl.Configs.NameOnly +{ + public class TestMethodCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestMethodCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new TestMethodCfgCtrl(); } + + /// Private parameterless constructor invoked by all other (public) constructors + TestMethodCfg() { } + + public TestMethodCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + Factory = factory; + ParentName = string.Empty; + } + + public string ToString(int i) + { + return string.Format("Name={0}", Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Configs/NameOnly/TestMethodCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Configs/NameOnly/TestMethodCfgCtrl.cs new file mode 100644 index 00000000..79562fde --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Configs/NameOnly/TestMethodCfgCtrl.cs @@ -0,0 +1,69 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Configs.NameOnly +{ + public partial class TestMethodCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + TestMethodCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as TestMethodCfg; + Redraw(); + } + } + + public TestMethodCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Configs/NameOnly/TestMethodCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Configs/NameOnly/TestMethodCfgCtrl.designer.cs new file mode 100644 index 00000000..2ab72a9f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Configs/NameOnly/TestMethodCfgCtrl.designer.cs @@ -0,0 +1,86 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +namespace TBF.BenchControl.Configs.NameOnly +{ + partial class TestMethodCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(137, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 5; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(27, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 4; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(134, 33); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 3; + this.classNameLabel.Text = "ComonentName"; + // + // BasicPrinterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "BasicPrinterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Configs/NameOnly/TestMethodCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Configs/NameOnly/TestMethodCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Configs/NameOnly/TestMethodCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Configs/ParamsProvider/ComponentCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Configs/ParamsProvider/ComponentCfgCtrl.cs new file mode 100644 index 00000000..6f0de35f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Configs/ParamsProvider/ComponentCfgCtrl.cs @@ -0,0 +1,193 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.Configs.ParamsProvider +{ + public partial class ComponentCfgCtrl : UserControl, IComponentCfgCtrl + { + static readonly ILog log = LogManager.GetLogger(typeof(ComponentCfgCtrl)); + + public bool ShowMore { get { return false; } } + + + IParamsProvider paramsProvider; + /// + public IComponentCfg Config + { + get + { + return paramsProvider as IComponentCfg; + } + set + { + paramsProvider = value as IParamsProvider; + Redraw(); + } + } + + IList parents; + Control[] editors; + CfgUpdateFlags flags; + + public ComponentCfgCtrl() + { + InitializeComponent(); + } + + /// + /// Constructor + /// + /// Parameters provider implementing IComponentCfg and IParamsProvider + /// A list of parents or null, null hides parentComboBox + public ComponentCfgCtrl(IParamsProvider paramsProvider, IList parents) + : this() + { + this.paramsProvider = paramsProvider; + this.parents = parents; + + if (parents == null) + { + parentLabel.Visible = false; + parentComboBox.Visible = false; + } + + editors = new Control[paramsProvider.ParamsCount()]; + for (int i = 0; i < paramsProvider.ParamsCount(); i++) + { + IList values = paramsProvider.ParamValues(i); + if (values == null) + { + editors[i] = new TextBox(); + } + else + { + ComboBox cb = new ComboBox(); + foreach (var v in values) cb.Items.Add(v); + editors[i] = cb; + } + editors[i].Visible = false; + this.Controls.Add(editors[i]); + } + + flags = CfgUpdateFlags.None; + + paramsListViewEx.SubItemClicked += new Results.Forms.SubItemEventHandler(paramsListViewEx_SubItemClicked); + paramsListViewEx.SubItemEndEditing += new Results.Forms.SubItemEndEditingEventHandler(paramsListViewEx_SubItemEndEditing); + } + + void Localize() + { + componentClassLabel.Text = Strings.Component_class; + nameLabel.Text = Strings.Name; + parentLabel.Text = Strings.Parent_name; + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Localize(); + paramsListViewEx.Columns.Add(Strings.Parameter, 210); + paramsListViewEx.Columns.Add(Strings.Value, 210); + if (parents != null) + { + foreach (var p in parents) parentComboBox.Items.Add(p); + } + Redraw(); + } + + public void Closing() + { + /// Close CmdResponse handlers here + } + + void Redraw() + { + if (paramsProvider == null) return; /// Control was not loaded, settings were not changed + + componentClassTextBox.Text = Config.Factory.ClassName; + nameTextBox.Text = Config.Name; + + if (parents != null) parentComboBox.Text = Config.ParentName; + + paramsListViewEx.Items.Clear(); + for (int i = 0; i < paramsProvider.ParamsCount(); i++) + { + ListViewItem lvi = new ListViewItem(paramsProvider.ParamName(i)); + lvi.SubItems.Add(paramsProvider.ToString(i)); + lvi.Tag = i; + paramsListViewEx.Items.Add(lvi); + } + } + + public void Unlock() + { + nameTextBox.Enabled = true; + if (parents != null) parentComboBox.Enabled = true; + paramsListViewEx.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + if (parents == null) return CfgUpdateFlags.None; + + /// Verify the parent + foreach (var item in parentComboBox.Items) + { + if (parentComboBox.Text == item.ToString()) return CfgUpdateFlags.None; + } + + message += Environment.NewLine + string.Format(Strings.Invalid_0, parentLabel.Text); + return CfgUpdateFlags.Error; + } + + public CfgUpdateFlags UpdateCfg() + { + if (paramsProvider == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + CfgUpdateFlags f = this.flags; + + if (Config.Name != nameTextBox.Text) + { + Config.Name = nameTextBox.Text; + f |= CfgUpdateFlags.RestartRqrd; + } + + if (parents != null) + { + if (Config.ParentName != parentComboBox.Text) + { + Config.ParentName = parentComboBox.Text; + f |= CfgUpdateFlags.RestartRqrd; + } + } + + return f; + } + + private void paramsListViewEx_SubItemClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (e.SubItem != 1) return; + int itemNr = (int)e.Item.Tag; + paramsListViewEx.StartEditing(editors[itemNr], e.Item, e.SubItem); + } + + private void paramsListViewEx_SubItemEndEditing(object sender, Results.Forms.SubItemEndEditingEventArgs e) + { + if (e.SubItem != 1) return; + int itemNr = (int)e.Item.Tag; + + string message; + if (paramsProvider.ValidateParam(itemNr, e.DisplayText, out message)) + { + flags |= paramsProvider.UpdateParam(itemNr, e.DisplayText); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Configs/ParamsProvider/ComponentCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Configs/ParamsProvider/ComponentCfgCtrl.designer.cs new file mode 100644 index 00000000..20890096 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Configs/ParamsProvider/ComponentCfgCtrl.designer.cs @@ -0,0 +1,171 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +namespace TBF.BenchControl.Configs.ParamsProvider +{ + partial class ComponentCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.parentComboBox = new System.Windows.Forms.ComboBox(); + this.parentLabel = new System.Windows.Forms.Label(); + this.componentClassLabel = new System.Windows.Forms.Label(); + this.componentClassTextBox = new System.Windows.Forms.TextBox(); + this.paramsListViewEx = new Results.Forms.ListViewEx(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(161, 30); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(262, 20); + this.nameTextBox.TabIndex = 5; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(6, 33); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 4; + this.nameLabel.Text = "Name"; + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer1.IsSplitterFixed = true; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.parentComboBox); + this.splitContainer1.Panel1.Controls.Add(this.parentLabel); + this.splitContainer1.Panel1.Controls.Add(this.componentClassLabel); + this.splitContainer1.Panel1.Controls.Add(this.componentClassTextBox); + this.splitContainer1.Panel1.Controls.Add(this.nameLabel); + this.splitContainer1.Panel1.Controls.Add(this.nameTextBox); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.paramsListViewEx); + this.splitContainer1.Size = new System.Drawing.Size(444, 353); + this.splitContainer1.SplitterDistance = 80; + this.splitContainer1.TabIndex = 6; + // + // parentComboBox + // + this.parentComboBox.Enabled = false; + this.parentComboBox.FormattingEnabled = true; + this.parentComboBox.Location = new System.Drawing.Point(161, 52); + this.parentComboBox.Name = "parentComboBox"; + this.parentComboBox.Size = new System.Drawing.Size(262, 21); + this.parentComboBox.TabIndex = 9; + // + // parentLabel + // + this.parentLabel.AutoSize = true; + this.parentLabel.Location = new System.Drawing.Point(6, 55); + this.parentLabel.Name = "parentLabel"; + this.parentLabel.Size = new System.Drawing.Size(38, 13); + this.parentLabel.TabIndex = 8; + this.parentLabel.Text = "Parent"; + // + // componentClassLabel + // + this.componentClassLabel.AutoSize = true; + this.componentClassLabel.Location = new System.Drawing.Point(6, 11); + this.componentClassLabel.Name = "componentClassLabel"; + this.componentClassLabel.Size = new System.Drawing.Size(89, 13); + this.componentClassLabel.TabIndex = 7; + this.componentClassLabel.Text = "Component Class"; + // + // componentClassTextBox + // + this.componentClassTextBox.Enabled = false; + this.componentClassTextBox.Location = new System.Drawing.Point(161, 8); + this.componentClassTextBox.Name = "componentClassTextBox"; + this.componentClassTextBox.Size = new System.Drawing.Size(262, 20); + this.componentClassTextBox.TabIndex = 6; + // + // paramsListViewEx + // + this.paramsListViewEx.AllowColumnReorder = true; + this.paramsListViewEx.Dock = System.Windows.Forms.DockStyle.Fill; + this.paramsListViewEx.DoubleClickActivation = false; + this.paramsListViewEx.Enabled = false; + this.paramsListViewEx.FullRowSelect = true; + this.paramsListViewEx.GridLines = true; + this.paramsListViewEx.LabelWrap = false; + this.paramsListViewEx.Location = new System.Drawing.Point(0, 0); + this.paramsListViewEx.Name = "paramsListViewEx"; + this.paramsListViewEx.Size = new System.Drawing.Size(444, 269); + this.paramsListViewEx.TabIndex = 0; + this.paramsListViewEx.UseCompatibleStateImageBehavior = false; + this.paramsListViewEx.View = System.Windows.Forms.View.Details; + this.paramsListViewEx.SubItemClicked += new Results.Forms.SubItemEventHandler(this.paramsListViewEx_SubItemClicked); + this.paramsListViewEx.SubItemEndEditing += new Results.Forms.SubItemEndEditingEventHandler(this.paramsListViewEx_SubItemEndEditing); + // + // ComponentCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.splitContainer1); + this.Name = "ComponentCfgCtrl"; + this.Size = new System.Drawing.Size(444, 353); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel1.PerformLayout(); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.ComboBox parentComboBox; + private System.Windows.Forms.Label parentLabel; + private System.Windows.Forms.Label componentClassLabel; + private System.Windows.Forms.TextBox componentClassTextBox; + private Results.Forms.ListViewEx paramsListViewEx; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Configs/ParamsProvider/ComponentCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Configs/ParamsProvider/ComponentCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Configs/ParamsProvider/ComponentCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Constants.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Constants.cs new file mode 100644 index 00000000..4ff42b7d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Constants.cs @@ -0,0 +1,14 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +namespace TBF.BenchControl +{ + public static class Constants + { + /// + /// A fraction of the tank volume that is considered to be safe. + /// When the estimated test end tank volume exceeds this fraction, tank emptying is forced. + /// + public const float TankFullFactor = 0.95f; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLa/Database.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLa/Database.cs new file mode 100644 index 00000000..d21a29fb --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLa/Database.cs @@ -0,0 +1,337 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using log4net; +using Oracle.DataAccess.Client; +using Config; +using Config.Entities; +using System.Data.SqlClient; +using System.Text; +using System.Globalization; +using Results.Entities; + +namespace TBF.BenchControl.DB.SensusLa +{ + public enum Retv + { + OK, + Error, + } + + public class Database : ComponentBase, IOperation, GenericDevices.IResultsWriter, Generic.IDevice + { + private static readonly ILog log = LogManager.GetLogger(typeof(Database)); + public override string ToString() { return string.Format("Sensus-La-Database({0})", Cfg.ToString(1)); } + + + enum CurrentOp + { + None, + CreateBatchNr, + WriteResults, + FinishBatch + + } + CurrentOp currentOp; + bool opCompleted; + bool anyError; + + String connectionString; /// ms database connection + + + + public static DatabaseCfg DBCfg; + private static SqlDataAccess connection; + + + + /// + /// Results to print + /// + Results.Entities.Batch batch; + + public Database() { } + + public Database(Generic.IComponentCfg cfg) + : base(cfg) + { + DBCfg = cfg as DatabaseCfg; + + currentOp = CurrentOp.None; + + log.Debug(this.ToString()); + } + + public void Initialize() + { + switch (DBCfg.DBUsed) + { + case DBUsed.Production: + connectionString = "Data Source=SLASQL01;Database=Auftrag;User Id=PrgPruefstation;Password=PrgPruefstation;"; + break; + case DBUsed.Test: + connectionString = "Data Source=SLASQL01;Database=Testreplikation;User Id=PrgPruefstation;Password=PrgPruefstation;"; + break; + default: + connectionString = null; + break; + } + + connection = new SqlDataAccess(connectionString); + + if (DBCfg.DebugLevel == DebugMode.Simulate) return; + + + } + + public void RunDeviceBefore() { } + public void RunDeviceAfter() { } + + public void StopDevice() + { + connection.Dispose(); + } + + public void StopDevice2() { } + + + + + /// Start this operation + public void Start() + { + opCompleted = false; + anyError = false; + } + + /// Run this operation + /// Event.ResultsWritten or Event.Error + public Event Run() + { + if (currentOp == CurrentOp.WriteResults) + { + if (!opCompleted) + { + if (batch.WaterMeters.Count == 0) return Event.ResultsWritten; + + if (DBCfg.DebugLevel != DebugMode.Simulate && connection != null) + { + if (BatchRslts != null && TestResults != null) + { + if (SaveBatchData() == Retv.Error) anyError = true; + } + + } + + opCompleted = true; + } + + if (anyError) + return Event.ResultsNotWritten; + else + return Event.ResultsWritten; + } + else + { + return Event.None; + } + } + + /// Stop this operation + public void Stop() + { + currentOp = CurrentOp.None; + } + static Results.Entities.TestRslt TestResults; + static Results.BatchResults BatchRslts; + public IOperation WriteResultsOp(Results.Entities.TestRslt testResults, Results.BatchResults batchRslts) + { + if (currentOp != CurrentOp.None) + throw new Exception("Sequence error"); + else + { + TestResults = testResults; + BatchRslts = batchRslts; + currentOp = CurrentOp.WriteResults; + } + return this; + } + /// + /// Save common batch data + /// + /// Batch + static Retv SaveBatchData() + { + var ret = Retv.OK; + try + { + Results.Entities.Batch Batch = TestResults.Batch; + + var PruefgangNr = GetOrCreatePruefgangNr(Batch.BatchNr); + //DBCfg.TesterId + var sb = new StringBuilder(); + sb.AppendLine("if not EXISTS(select PruefgangNr from [dbo].[Pruefgang] where PruefgangNr = " + PruefgangNr + " and [PruefstationNr] = " + DBCfg.TestBenchId + ")"); + sb.AppendLine("begin"); + sb.AppendLine(" insert into[dbo].[Pruefgang]"); + sb.AppendLine(" ([PruefgangNr] "); + sb.AppendLine(" ,[PruefstationNr] "); + sb.AppendLine(" ,[PrueferNr] "); + sb.AppendLine(" ,[PruefgangLang] "); + sb.AppendLine(" ,[Datum] "); + sb.AppendLine(" ,[Einbaulage_alt] "); + sb.AppendLine(" ,[Anzahl] "); + sb.AppendLine(" ,[KalibrierID] "); + sb.AppendLine(" ,[Metrolog] "); + sb.AppendLine(" ,[FPP] "); + sb.AppendLine(" ,[Korrigiert] "); + sb.AppendLine(" ,[Typzusatz] "); + sb.AppendLine(" ,[Baulaenge] "); + sb.AppendLine(" ) "); + sb.AppendLine(" values "); + sb.AppendLine(" ( "); + sb.AppendLine(PruefgangNr.ToString()).Append(","); + sb.AppendLine(DBCfg.TestBenchId.ToString()).Append(","); + sb.AppendLine(DBCfg.TesterId.ToString()).Append(","); + sb.AppendLine(" 0, "); + sb.AppendLine(" CURRENT_TIMESTAMP, "); + sb.AppendLine(" null, "); + sb.AppendLine(" 0, "); + sb.AppendLine(" null, "); + sb.AppendLine(" null, "); + sb.AppendLine(" 0, "); + sb.AppendLine(" '', "); + sb.AppendLine(" null) "); + sb.AppendLine("end "); + + + sb.AppendLine("select [Anzahl] from [dbo].[Pruefgang] where"); + sb.AppendLine("PruefgangNr = ").Append(PruefgangNr); + sb.AppendLine("PruefstationNr = ").Append(DBCfg.TestBenchId.ToString()); + + + var Pruefgang = connection.ExecuteQuery(sb.ToString()); + var CurrentAnzahl = 0; + if (Pruefgang.Rows.Count >= 1) + { + int.TryParse(Pruefgang.Rows[0].ToString(), out CurrentAnzahl); + } + + if (CurrentAnzahl < 10) + { + CurrentAnzahl = CurrentAnzahl++; + } + + + + var time = (int)TestResults.TestTime; + + + + + var sollQ = ((TestResults.Qto() + TestResults.Qfrom()) / 2); + + sb.Clear(); + sb.AppendLine(" update[dbo].[Pruefgang] "); + sb.AppendLine(" set "); + sb.AppendLine(" [PP" + CurrentAnzahl + "_Zeit] = ").Append(time); + sb.AppendLine(" and [PP" + CurrentAnzahl + "_Soll] = ").Append(sollQ); + sb.AppendLine(" and [PP" + CurrentAnzahl + "_Ist] = ").Append(TestResults.FlowMean.ToString(CultureInfo.InvariantCulture)); + sb.AppendLine(" and [PP" + CurrentAnzahl + "_RefZSerienNr] = 0"); + sb.AppendLine(" and [PP" + CurrentAnzahl + "_RefFehl] = ").Append(TestResults.ErrorMaster.ToString(CultureInfo.InvariantCulture)); + sb.AppendLine(" and [PP" + CurrentAnzahl + "_Ist_V] = ").Append(TestResults.FlowVolume.ToString(CultureInfo.InvariantCulture)); + sb.AppendLine(" and [PP" + CurrentAnzahl + "_Waage] = ").Append(TestResults.FlowMass.ToString(CultureInfo.InvariantCulture)); + sb.AppendLine(" and [PP" + CurrentAnzahl + "_Info] = 'TBF'"); + sb.AppendLine(" and [PP" + CurrentAnzahl + "_T_Start] = ").Append(TestResults.TempUpStart.ToString(CultureInfo.InvariantCulture)); + sb.AppendLine(" and [PP" + CurrentAnzahl + "_T_Ende] = ").Append(TestResults.TempUpEnd.ToString(CultureInfo.InvariantCulture)); + sb.AppendLine(" where "); + sb.AppendLine(" PruefgangNr = ").Append(PruefgangNr); + sb.AppendLine(" and PruefstationNr = ").Append(DBCfg.TestBenchId.ToString()); + + connection.ExecuteQuery(sb.ToString()); + + foreach (var item in Batch.WaterMeters) + { + var meterRslt = BatchRslts.GetMeterTestRslt(TestResults.TestData.Name, item.WMPosition, Config.Entities.CompoundMeterId.Single); + + + sb = new StringBuilder(); + sb.AppendLine("if not EXISTS(select PruefgangNr from [dbo].[Prueffehler] where PruefgangNr = " + PruefgangNr + " and SerienNr= " + item.SerialNr.ToString() + ")"); + sb.AppendLine("begin"); + sb.AppendLine(" insert into[dbo].[Prueffehler]"); + sb.AppendLine(" ([PruefgangNr] "); + sb.AppendLine(" ,[SerienNr]) "); + sb.AppendLine(" values "); + sb.AppendLine(" ( "); + sb.AppendLine( PruefgangNr.ToString()).Append(","); + sb.AppendLine( item.SerialNr.ToString()); + sb.AppendLine(" )"); + sb.AppendLine("end "); + + connection.ExecuteQuery(sb.ToString()); + sb = new StringBuilder(); + sb.AppendLine("update [dbo].[Prueffehler] "); + sb.AppendLine(" set "); + sb.AppendLine(" [PP" + CurrentAnzahl + "_Fehler] = ").Append(meterRslt.Error.ToString(CultureInfo.InvariantCulture)); + sb.AppendLine(" [PruefDatum] = CURRENT_TIMESTAMP"); + sb.AppendLine(" where "); + sb.AppendLine(" PruefgangNr = ").Append(PruefgangNr); + sb.AppendLine(" and SerienNr = ").Append(item.SerialNr.ToString()); + + connection.ExecuteQuery(sb.ToString()); + } + } + catch (Exception EX) + { + ret = Retv.Error; + } + + + TestResults = null; + BatchRslts = null; + + + return ret; + + } + + + + + static int GetOrCreatePruefgangNr(int BatchNR) + { + var sb = new StringBuilder(); + sb.AppendLine("declare @batchNR as Int"); + sb.AppendLine("declare @PruefStationNr as Int"); + sb.AppendLine("declare @PruefgangNr as Int;"); + + sb.AppendLine("set @batchNR = ").Append(BatchNR); + sb.AppendLine("set @PruefStationNr = ").Append(DBCfg.TestBenchId); + sb.AppendLine("set @PruefgangNr = (@PruefStationNr * 1000000) + @batchNR;"); + + sb.AppendLine("if not EXISTS(select TbfBatchPruefgang_PruefgangNr from [dbo].[TbfBatchPruefgang] where TbfBatchPruefgang_PruefgangNr = @PruefgangNr)"); + sb.AppendLine("begin"); + sb.AppendLine("insert into [dbo].[TbfBatchPruefgang]"); + sb.AppendLine("select @batchNR, @PruefgangNr, @PruefStationNr"); + sb.AppendLine("end"); + + sb.AppendLine("select @PruefgangNr as [Result]"); + int ret = 0; + var result = connection.ExecuteQuery(sb.ToString()); + if (result.Rows.Count >= 1) + { + int.TryParse(result.Rows[0].ToString(), out ret); + } + + return ret; + + } + + public IOperation WriteResultsOp(Batch batchResults) + { + return this; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLa/DatabaseCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLa/DatabaseCfg.cs new file mode 100644 index 00000000..36a7a94a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLa/DatabaseCfg.cs @@ -0,0 +1,63 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DB.SensusLa +{ + public enum DBUsed + { + None, + Production, + Test + } + + + public class DatabaseCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(DatabaseCfg) })[0]; + protected override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new DatabaseCfgCtrl(); } + + + public int TestBenchId; + public DBUsed DBUsed; + public int Baujahr; + + public int TesterId { get; internal set; } + + /// Written to the database + + + /// Private parameterless constructor invoked by all other (public) constructors + DatabaseCfg() + { + Name = "Sensus-Oracle-DB"; + ParentName = string.Empty; + TestBenchId = 1; + DBUsed = DBUsed.Test; + Baujahr = 2015; + } + + public DatabaseCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, BenchId={1}, DBUsed={2}, Baujahr={3}", + Name, + TestBenchId, + DBUsed, + Baujahr + ); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLa/DatabaseCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLa/DatabaseCfgCtrl.cs new file mode 100644 index 00000000..f206f2c9 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLa/DatabaseCfgCtrl.cs @@ -0,0 +1,136 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// Author: Milan Hanajík +/// +using System; +using System.Windows.Forms; +using log4net; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DB.SensusLa +{ + public partial class DatabaseCfgCtrl : UserControl, IComponentCfgCtrl + { + static readonly ILog log = LogManager.GetLogger(typeof(DatabaseCfgCtrl)); + + public bool ShowMore { get { return false; } } + + DatabaseCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as DatabaseCfg; + Redraw(); + } + } + + public DatabaseCfgCtrl() + { + InitializeComponent(); + } + + private void WriterCfgCtrl_Load(object sender, EventArgs e) + { + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + benchIdTextBox.Text = config.TestBenchId.ToString(); + dbUsedComboBox.Text = config.DBUsed.ToString(); + + } + + public void Unlock() + { + nameTextBox.Enabled = true; + benchIdTextBox.Enabled = true; + dbUsedComboBox.Enabled = true; + + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int tmp; + if (!int.TryParse(benchIdTextBox.Text, out tmp) || tmp <= 0) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Test bench ID'"; + } + + + + if (!dbUsedComboBox.Items.Contains(dbUsedComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Database used' item"; + } + + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.None; /// <------------------- !!! + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + if (config.Name != nameTextBox.Text) + { + config.Name = nameTextBox.Text; + flags = CfgUpdateFlags.RestartRqrd; + } + + int benchId = int.Parse(benchIdTextBox.Text); + if (config.TestBenchId != benchId) + { + config.TestBenchId = benchId; + flags = CfgUpdateFlags.RestartRqrd; + } + + int testerId = int.Parse(testerIdTextBox.Text); + if (config.TesterId != testerId) + { + config.TesterId = testerId; + flags = CfgUpdateFlags.RestartRqrd; + } + + + + for (int i = 0; i < 2; i++) + { + if (((DBUsed)i).ToString().Equals(dbUsedComboBox.Text) && (config.DBUsed != (DBUsed)i)) + { + config.DBUsed = (DBUsed)i; + flags = CfgUpdateFlags.RestartRqrd; + break; + } + } + + return flags; + } + + private void destinationButton_Click(object sender, EventArgs e) + { + + } + + private void logsFolderButton_Click(object sender, EventArgs e) + { + + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLa/DatabaseCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLa/DatabaseCfgCtrl.designer.cs new file mode 100644 index 00000000..b0c3e68a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLa/DatabaseCfgCtrl.designer.cs @@ -0,0 +1,157 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// Author: Milan Hanajík +/// +namespace TBF.BenchControl.DB.SensusLa +{ + partial class DatabaseCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.benchIdTextBox = new System.Windows.Forms.TextBox(); + this.benchIdLabel = new System.Windows.Forms.Label(); + this.dbUsedComboBox = new System.Windows.Forms.ComboBox(); + this.dbUsedLabel = new System.Windows.Forms.Label(); + this.testerIdTextBox = new System.Windows.Forms.TextBox(); + this.TestIdLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(110, 30); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(146, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(19, 33); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(107, 8); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // benchIdTextBox + // + this.benchIdTextBox.Enabled = false; + this.benchIdTextBox.Location = new System.Drawing.Point(110, 51); + this.benchIdTextBox.Name = "benchIdTextBox"; + this.benchIdTextBox.Size = new System.Drawing.Size(57, 20); + this.benchIdTextBox.TabIndex = 4; + // + // benchIdLabel + // + this.benchIdLabel.AutoSize = true; + this.benchIdLabel.Location = new System.Drawing.Point(19, 54); + this.benchIdLabel.Name = "benchIdLabel"; + this.benchIdLabel.Size = new System.Drawing.Size(76, 13); + this.benchIdLabel.TabIndex = 3; + this.benchIdLabel.Text = "Test Bench ID"; + // + // dbUsedComboBox + // + this.dbUsedComboBox.Enabled = false; + this.dbUsedComboBox.FormattingEnabled = true; + this.dbUsedComboBox.Location = new System.Drawing.Point(110, 97); + this.dbUsedComboBox.Name = "dbUsedComboBox"; + this.dbUsedComboBox.Size = new System.Drawing.Size(145, 21); + this.dbUsedComboBox.TabIndex = 6; + // + // dbUsedLabel + // + this.dbUsedLabel.AutoSize = true; + this.dbUsedLabel.Location = new System.Drawing.Point(19, 100); + this.dbUsedLabel.Name = "dbUsedLabel"; + this.dbUsedLabel.Size = new System.Drawing.Size(79, 13); + this.dbUsedLabel.TabIndex = 5; + this.dbUsedLabel.Text = "Database used"; + // + // testerIdTextBox + // + this.testerIdTextBox.Enabled = false; + this.testerIdTextBox.Location = new System.Drawing.Point(110, 74); + this.testerIdTextBox.Name = "testerIdTextBox"; + this.testerIdTextBox.Size = new System.Drawing.Size(57, 20); + this.testerIdTextBox.TabIndex = 8; + // + // TestIdLabel + // + this.TestIdLabel.AutoSize = true; + this.TestIdLabel.Location = new System.Drawing.Point(19, 77); + this.TestIdLabel.Name = "TestIdLabel"; + this.TestIdLabel.Size = new System.Drawing.Size(51, 13); + this.TestIdLabel.TabIndex = 7; + this.TestIdLabel.Text = "Tester ID"; + // + // DatabaseCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.testerIdTextBox); + this.Controls.Add(this.TestIdLabel); + this.Controls.Add(this.dbUsedComboBox); + this.Controls.Add(this.dbUsedLabel); + this.Controls.Add(this.benchIdTextBox); + this.Controls.Add(this.benchIdLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "DatabaseCfgCtrl"; + this.Size = new System.Drawing.Size(300, 173); + this.Load += new System.EventHandler(this.WriterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.TextBox benchIdTextBox; + private System.Windows.Forms.Label benchIdLabel; + private System.Windows.Forms.ComboBox dbUsedComboBox; + private System.Windows.Forms.Label dbUsedLabel; + private System.Windows.Forms.TextBox testerIdTextBox; + private System.Windows.Forms.Label TestIdLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLa/DatabaseCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLa/DatabaseCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLa/DatabaseCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLa/DatabaseFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLa/DatabaseFactory.cs new file mode 100644 index 00000000..ad5a0943 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLa/DatabaseFactory.cs @@ -0,0 +1,27 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// Author: Milan Hanajík +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DB.SensusLa +{ + public class DatabaseFactory : IComponentFactory + { + public string ClassName { get { return "Sensus-La-Database"; } } + + public void ResetStaticProperties() { Database.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Database(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Database(cfg); } + + public IComponentCfg DefaultConfig() { return new DatabaseCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(DatabaseCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLa/SqlDataAccess.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLa/SqlDataAccess.cs new file mode 100644 index 00000000..cfc96ecd --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLa/SqlDataAccess.cs @@ -0,0 +1,243 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; + +namespace TBF.BenchControl.DB.SensusLa +{ + public class SqlDataAccess + { + private string _connectionString = ""; + + public SqlDataAccess(string connectionString) + { + _connectionString = connectionString; + + } + + private SqlConnection _con; + + /// + /// Creating a database connection if there is none. + /// + /// Working with a global connection variable to make sure the connection would be closed at the end of working with it. + private void CreateConnection() + { + if (_con == null) + { + _con = new SqlConnection(_connectionString); + + } + if (_con != null && _con.State == ConnectionState.Closed) + { + _con.Open(); + } + } + + public DataTable ExecuteQuery(string sqlStatement) + { + DataTable ret; + SqlConnection connection = null; + SqlDataReader reader = null; + + try + { + connection = new SqlConnection(_connectionString); + if (connection.State != ConnectionState.Open) + { + connection.Open(); + } + var cmd = connection.CreateCommand(); + cmd.CommandText = sqlStatement; + reader = cmd.ExecuteReader(); + var entries = new object[reader.FieldCount]; + ret = new DataTable(); + + var jcount = 0; + try + { + while (reader.Read()) + { + if (jcount == 0) + { + for (var i = 0; i < reader.FieldCount; i++) + { + var headline = reader.GetName(i); + ret.Columns.Add(headline, Type.GetType("System.Object")); + + } + } + for (var i = 0; i < reader.FieldCount; i++) + { + entries[i] = reader[i]; + } + jcount++; + ret.Rows.Add(entries); + } + } + catch (Exception ex) + { + throw (new Exception(ex.Message, ex)); + } + } + catch (Exception ex) + { + throw (new Exception(ex.Message, ex)); + } + finally + { + try + { + if (reader != null) + { + try + { + reader.Dispose(); + } + catch { } + } + if (connection != null && connection.State == ConnectionState.Open) + { + connection.Close(); + } + } + catch (Exception ex) { throw (new Exception("Unhandled exception within finally: " + ex.Message)); } + } + return ret; + } + /// + /// Executing Stored Procedure + /// + /// The Name of Stored Procedure + /// Parameter names and values + /// Result Set + + + /// + /// Closing and disposing the connection. + /// + private void CloseConnection() + { + if (_con != null) + { + if (_con.State != ConnectionState.Closed) + { + _con.Close(); + } + _con.Dispose(); + } + } + + /// + /// Generating a list of comma seperated parameters by a given string array. + /// + /// array to work on + /// comma seperated string with parameters. + private string GenerateParameter(string[] parameter) + { + var list = new StringBuilder(); + var ret = ""; + var first = true; + + foreach (var param in parameter) + { + if (list.ToString().Length > 0) + { + list.Append(","); + } + + var result = param; + var content = param; + const string mitpat = @"(?:^@\w[\w_\s]*=[\s]*(?:'(.*)'$|(.*)$)|^(?:'(.*)'$|(.*)$))"; + const string numbpat = @"^[+-]?(?:\d+\.?|,?\d*|\d*(\.?|,?)\d+)[\r\n]*$"; + + if (!first || !result.Contains(",")) + { + first = false; + + var mtch = Regex.Match(content, mitpat); + if (mtch.Groups[1].Success) + { + var orig = mtch.Groups[1].Value; + var mch = Regex.Replace(orig, "[']+", "'"); + mch = Regex.Replace(mch, "[']+", "''"); + + result = !String.IsNullOrEmpty(mch) ? content.Replace(orig, mch) : content; + } + else if (mtch.Groups[2].Success) + { + var orig = mtch.Groups[2].Value; + var mch = Regex.Replace(orig, "[']+", "'"); + mch = Regex.Replace(mch, "[']+", "''"); + + if (!String.IsNullOrEmpty(mch)) + { + if (Regex.IsMatch(mch, numbpat) || mch.ToLower() == "null") + { + result = content; + } + else + { + result = content.Replace(orig, "'" + mch + "'"); + } + } + else + { + result = content; + } + } + else if (mtch.Groups[3].Success) + { + var orig = mtch.Groups[3].Value; + var mch = Regex.Replace(orig, "[']+", "'"); + mch = Regex.Replace(mch, "[']+", "''"); + + result = !String.IsNullOrEmpty(mch) ? content.Replace(orig, mch) : content; + } + else if (mtch.Groups[4].Success) + { + var orig = mtch.Groups[4].Value; + var mch = Regex.Replace(orig, "[']+", "'"); + mch = Regex.Replace(mch, "[']+", "''"); + + if (!String.IsNullOrEmpty(mch)) + { + if (Regex.IsMatch(mch, numbpat) || mch.ToLower() == "null") + { + result = content; + } + else + { + result = content.Replace(orig, "'" + mch + "'"); + } + } + else + { + result = content; + } + } + } + + list.Append(result); + } + if (list.ToString().Length > 0) + { + ret = " " + list; + } + + return ret; + } + public string GetConnectionString() + { + return _connectionString; + } + public void Dispose() + { + CloseConnection(); + GC.SuppressFinalize(this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLaDb/Database.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLaDb/Database.cs new file mode 100644 index 00000000..ed2eb52d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLaDb/Database.cs @@ -0,0 +1,419 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using log4net; +using Oracle.DataAccess.Client; +using Config; +using Config.Entities; +using System.Data.SqlClient; +using System.Text; +using System.Globalization; +using Results.Entities; + +namespace TBF.BenchControl.DB.SensusLa +{ + public enum Retv + { + OK, + Error, + } + + public class Database : ComponentBase, IOperation, GenericDevices.IResultsWriter, Generic.IDevice + { + private static readonly ILog log = LogManager.GetLogger(typeof(Database)); + public override string ToString() { return string.Format("Sensus-La-Database({0})", Cfg.ToString(1)); } + + + enum CurrentOp + { + None, + CreateBatchNr, + WriteResults, + FinishBatch + + } + CurrentOp currentOp; + bool opCompleted; + bool anyError; + + String connectionString; /// ms database connection + + + + public static DatabaseCfg DBCfg; + private static SqlDataAccess connection; + + + + /// + /// Results to print + /// + Results.Entities.Batch batch; + + public Database() { } + + public Database(Generic.IComponentCfg cfg) + : base(cfg) + { + DBCfg = cfg as DatabaseCfg; + + currentOp = CurrentOp.None; + + log.Debug(this.ToString()); + } + + public void Initialize() + { + switch (DBCfg.DBUsed) + { + case DBUsed.Production: + connectionString = "Data Source=SLASQL01;Database=Auftrag;User Id=PrgPruefstation;Password=PrgPruefstation;"; + break; + case DBUsed.Test: + connectionString = "Data Source=SLASQL01;Database=Testreplikation;User Id=PrgPruefstation;Password=PrgPruefstation;"; + break; + default: + connectionString = null; + break; + } + + connection = new SqlDataAccess(connectionString); + + if (DBCfg.DebugLevel == DebugMode.Simulate) return; + + + } + + public void RunDeviceBefore() { } + public void RunDeviceAfter() { } + + public void StopDevice() + { + connection.Dispose(); + } + + public void StopDevice2() { } + + + + + /// Start this operation + public void Start() + { + opCompleted = false; + anyError = false; + } + + /// Run this operation + /// Event.ResultsWritten or Event.Error + public Event Run() + { + if (currentOp == CurrentOp.WriteResults) + { + if (!opCompleted) + { + if (DBCfg.DebugLevel != DebugMode.Simulate && connection != null) + { + if (BatchRslts != null && TestResults != null) + { + if (SaveBatchData() == Retv.Error) anyError = true; + } + + } + + opCompleted = true; + } + + if (anyError) + return Event.ResultsNotWritten; + else + return Event.ResultsWritten; + } + else + { + return Event.None; + } + } + + /// Stop this operation + public void Stop() + { + currentOp = CurrentOp.None; + } + static Results.Entities.TestRslt TestResults; + static Results.BatchResults BatchRslts; + public IOperation WriteResultsOp(Results.Entities.TestRslt testResults, Results.BatchResults batchRslts) + { + if (currentOp != CurrentOp.None) + throw new Exception("Sequence error"); + else + { + TestResults = testResults; + BatchRslts = batchRslts; + currentOp = CurrentOp.WriteResults; + } + return this; + } + /// + /// Save common batch data + /// + /// Batch + static Retv SaveBatchData() + { + var ret = Retv.OK; + try + { + Results.Entities.Batch Batch = TestResults.Batch; + + var PruefgangNr = GetOrCreatePruefgangNr(Batch.BatchNr, TestResults.RepetitionNr); + //DBCfg.TesterId + var sb = new StringBuilder(); + sb.AppendLine("if not EXISTS(select PruefgangNr from [dbo].[Pruefgang] where PruefgangNr = " + PruefgangNr + " and [PruefstationNr] = " + DBCfg.TestBenchId + ")"); + sb.AppendLine("begin"); + sb.AppendLine(" insert into[dbo].[Pruefgang]"); + sb.AppendLine(" ([PruefgangNr] "); + sb.AppendLine(" ,[PruefstationNr] "); + sb.AppendLine(" ,[PrueferNr] "); + sb.AppendLine(" ,[PruefgangLang] "); + sb.AppendLine(" ,[Datum] "); + sb.AppendLine(" ,[Einbaulage_alt] "); + sb.AppendLine(" ,[Anzahl] "); + sb.AppendLine(" ,[KalibrierID] "); + sb.AppendLine(" ,[Metrolog] "); + sb.AppendLine(" ,[FPP] "); + sb.AppendLine(" ,[Korrigiert] "); + sb.AppendLine(" ,[Typzusatz] "); + sb.AppendLine(" ,[Baulaenge] "); + sb.AppendLine(" ) "); + sb.AppendLine(" values "); + sb.AppendLine(" ( "); + sb.Append(PruefgangNr.ToString()).AppendLine(","); + sb.Append(DBCfg.TestBenchId.ToString()).AppendLine(","); + sb.Append(DBCfg.TesterId.ToString()).AppendLine(","); + sb.AppendLine(" 0, "); + sb.AppendLine(" CURRENT_TIMESTAMP, "); + sb.AppendLine(" NULL, "); + sb.AppendLine(" 0, "); + sb.AppendLine(" 0, "); + sb.AppendLine(" NULL, "); + sb.AppendLine(" NULL, "); + sb.AppendLine(" 0, "); + sb.AppendLine(" NULL, "); + sb.AppendLine(" NULL) "); + sb.AppendLine("end "); + + connection.ExecuteQuery(sb.ToString()); + + sb = new StringBuilder(); + sb.AppendLine("select [Anzahl] from [dbo].[Pruefgang] where PruefgangNr = ").Append(PruefgangNr.ToString()).Append(" and PruefstationNr = ").Append(DBCfg.TestBenchId.ToString()); ; + + + var Pruefgang = connection.ExecuteQuery(sb.ToString()); + var CurrentAnzahl = 0; + if (Pruefgang.Rows.Count >= 1) + { + int.TryParse(Pruefgang.Rows[0]["Anzahl"].ToString(), out CurrentAnzahl); + } + + if (CurrentAnzahl < 10) + { + CurrentAnzahl = CurrentAnzahl + 1; + var time = (int)TestResults.TestTime; + var sollQ = ((TestResults.Qto() + TestResults.Qfrom()) / 2); + + sb = new StringBuilder(); + sb.AppendLine(" update [dbo].[Pruefgang] "); + sb.AppendLine(" set "); + sb.Append(" [Anzahl] = ").AppendLine(CurrentAnzahl.ToString()); + sb.Append(" , [PP" + CurrentAnzahl + "_Zeit] = ").AppendLine(time.ToString()); + sb.Append(" , [PP" + CurrentAnzahl + "_Soll] = ").AppendLine(sollQ.ToString(CultureInfo.InvariantCulture)); + sb.Append(" , [PP" + CurrentAnzahl + "_Ist] = ").AppendLine(TestResults.FlowMean.ToString(CultureInfo.InvariantCulture)); + sb.AppendLine(" , [PP" + CurrentAnzahl + "_RefZSerienNr] = 0"); + sb.Append(" , [PP" + CurrentAnzahl + "_RefFehl] = ").AppendLine(TestResults.ErrorMaster.ToString(CultureInfo.InvariantCulture)); + sb.Append(" , [PP" + CurrentAnzahl + "_Ist_V] = ").AppendLine(TestResults.FlowVolume.CompareTo(double.NaN) == 0 ? "0" : TestResults.FlowVolume.ToString(CultureInfo.InvariantCulture)); + sb.AppendLine(" , [PP" + CurrentAnzahl + "_Waage] = 0"); + sb.Append(" , [PP" + CurrentAnzahl + "_Info] = 'T'"); + sb.Append(" , [PP" + CurrentAnzahl + "_T_Start] = ").AppendLine(TestResults.TempUpStart.ToString(CultureInfo.InvariantCulture)); + sb.Append(" , [PP" + CurrentAnzahl + "_T_Ende] = ").AppendLine(TestResults.TempUpEnd.ToString(CultureInfo.InvariantCulture)); + sb.AppendLine(" where ").Append(" PruefgangNr = ").Append(PruefgangNr.ToString()).Append(" and PruefstationNr = ").Append(DBCfg.TestBenchId.ToString()); + + connection.ExecuteQuery(sb.ToString()); + + foreach (var item in BatchRslts.WaterMeters) + { + var meterResults = item.GetMeterTestRslt(TestResults.Name(), Config.Entities.CompoundMeterId.Single); + + if (meterResults != null && meterResults.TestDone) + { + sb = new StringBuilder(); + sb.AppendLine("if not EXISTS(select PruefgangNr from [dbo].[Prueffehler] where PruefgangNr = " + PruefgangNr + " and SerienNr= " + item.SerialNr.ToString() + ")"); + sb.AppendLine("begin"); + sb.AppendLine(" insert into [dbo].[Prueffehler]"); + sb.AppendLine(" ([PruefgangNr] "); + sb.AppendLine(" ,[SerienNr] "); + sb.AppendLine(" ,[Info]) "); + sb.AppendLine(" values "); + sb.AppendLine(" ( "); + sb.AppendLine(PruefgangNr.ToString()).Append(","); + sb.AppendLine(item.SerialNr.ToString()).Append(",'"); + sb.AppendLine(item.Remark.ToString()).Append("'"); + sb.AppendLine(" )"); + sb.AppendLine("end "); + + connection.ExecuteQuery(sb.ToString()); + sb = new StringBuilder(); + sb.AppendLine("update [dbo].[Prueffehler] "); + sb.AppendLine(" set "); + sb.Append(" [PP" + CurrentAnzahl + "_Fehler] = ").AppendLine(meterResults.Error.CompareTo(double.NaN) == 0 ? "0" : meterResults.Error.ToString(CultureInfo.InvariantCulture)); + sb.AppendLine(" ,[PruefDatum] = CURRENT_TIMESTAMP"); + sb.AppendLine(" where "); + sb.Append(" PruefgangNr = ").AppendLine(PruefgangNr.ToString()); + sb.Append(" and SerienNr = ").AppendLine(item.SerialNr.ToString()); + + connection.ExecuteQuery(sb.ToString()); + CheckAndCreateAuftragPos(item.SerialNr, Program.LocalSettings.PurchaseOrderHistory[0], PruefgangNr, item.WMPosition, DBCfg.TesterId); + + } + } + + + + } + } + catch (Exception EX) + { + ret = Retv.Error; + } + + + TestResults = null; + BatchRslts = null; + + + return ret; + + } + + static void CheckAndCreateAuftragPos(string SerienNr, string AuftragNr, int PruefgangNr, int Einbauplatz, int AnlageMitarbeiterNr) + { + var sb = new StringBuilder(); + + + sb.AppendLine("declare @SerienNr int"); + sb.AppendLine("declare @AuftragNr int"); + sb.AppendLine("declare @PruefgangNr int"); + sb.AppendLine("declare @Einbauplatz int"); + sb.AppendLine("declare @Wiederholung int"); + sb.AppendLine("declare @PositionNr int"); + sb.AppendLine("declare @AnlageMitarbeiterNr int"); + sb.AppendLine(""); + + sb.AppendLine("set @SerienNr = " + SerienNr); + //sb.AppendLine("set @AuftragNr = " + AuftragNr); + sb.AppendLine("set @PruefgangNr =" + PruefgangNr); + sb.AppendLine("set @Einbauplatz = " + Einbauplatz); + sb.AppendLine("set @AnlageMitarbeiterNr = " + AnlageMitarbeiterNr); + + sb.AppendLine(""); + sb.AppendLine("SELECT top 1 @PositionNr = [PositionNr], @AuftragNr = [AuftragNr]"); + sb.AppendLine(" FROM [Auftrag].[dbo].[AuftragPosition]"); + sb.AppendLine(" where @SerienNr between [SerienNrVon] and [SerienNrBis]"); + //sb.AppendLine(" and AuftragNr = @AuftragNr"); + sb.AppendLine(""); + sb.AppendLine("select @Wiederholung = MAx(Wiederholungen) from [dbo].[AuftragPositionSerienNr] where [SerienNr] = @SerienNr"); + sb.AppendLine(""); + sb.AppendLine("if not EXISTS(select PruefgangNr from [dbo].[AuftragPositionSerienNr] where PruefgangNr = @PruefgangNr and AuftragNr = @AuftragNr and[SerienNr] = @SerienNr)"); + sb.AppendLine("begin"); + sb.AppendLine("INSERT INTO [dbo].[AuftragPositionSerienNr]"); + sb.AppendLine(" ([SerienNr]"); + sb.AppendLine(" ,[Pruefgangnr]"); + sb.AppendLine(" ,[AuftragNr]"); + sb.AppendLine(" ,[PositionNr]"); + sb.AppendLine(" ,[PruefgangDatum]"); + sb.AppendLine(" ,[Wiederholungen]"); + sb.AppendLine(" ,[Einbauplatz]"); + sb.AppendLine(" ,[Bemerkung]"); + sb.AppendLine(" ,[gesichertDatum]"); + sb.AppendLine(" ,[AnlageDatum]"); + sb.AppendLine(" ,[AnlageMitarbeiterNr]"); + sb.AppendLine(" ,[AenderungDatum]"); + sb.AppendLine(" ,[AenderungMitarbeiterNr]"); + sb.AppendLine(" ,[StatusFertigung]"); + sb.AppendLine(" ,[Metrolog]"); + sb.AppendLine(" ,[FabNr]"); + sb.AppendLine(" ,[StatusFlag]"); + sb.AppendLine(" ,[KundeneigeneSerienNr]"); + sb.AppendLine(" ,[Einbaulage]"); + sb.AppendLine(" ,[NichtFuerTrefferquote]"); + sb.AppendLine(" ,[Garantieschein])"); + sb.AppendLine(" VALUES"); + sb.AppendLine(" (@SerienNr"); + sb.AppendLine(" , @PruefgangNr"); + sb.AppendLine(" , @AuftragNr"); + sb.AppendLine(" , @PositionNr"); + sb.AppendLine(" , CURRENT_TIMESTAMP"); + sb.AppendLine(" , @Wiederholung"); + sb.AppendLine(" , @Einbauplatz"); + sb.AppendLine(" ,'Testet by TBF'"); + sb.AppendLine(" , CURRENT_TIMESTAMP"); + sb.AppendLine(" , CURRENT_TIMESTAMP"); + sb.AppendLine(" , @AnlageMitarbeiterNr"); + sb.AppendLine(" , CURRENT_TIMESTAMP"); + sb.AppendLine(" , @AnlageMitarbeiterNr"); + sb.AppendLine(" ,22"); + sb.AppendLine(" ,''"); + sb.AppendLine(" ,null"); + sb.AppendLine(" ,0"); + sb.AppendLine(" , @SerienNr"); + sb.AppendLine(" ,null"); + sb.AppendLine(" ,0"); + sb.AppendLine(" ,0)"); + sb.AppendLine("end"); + + connection.ExecuteQuery(sb.ToString()); + + } + + + static int GetOrCreatePruefgangNr(int BatchNR, int Repetition) + { + var sb = new StringBuilder(); + sb.AppendLine("declare @batchNR as Int"); + sb.AppendLine("declare @PruefStationNr as Int"); + sb.AppendLine("declare @PruefgangNr as Int;"); + sb.AppendLine("declare @Repetition as Int;"); + + + + sb.Append("set @Repetition =").AppendLine(Repetition.ToString()); + sb.Append("set @batchNR = ").AppendLine(BatchNR.ToString()); + sb.Append("set @PruefStationNr = ").AppendLine(DBCfg.TestBenchId.ToString()); + sb.Append("set @PruefgangNr = (@PruefStationNr * 1000000) + (@batchNR * 100) + @Repetition;"); + + sb.AppendLine("if not EXISTS(select TbfBatchPruefgang_PruefgangNr from [dbo].[TbfBatchPruefgang] where TbfBatchPruefgang_PruefgangNr = @PruefgangNr)"); + sb.AppendLine("begin"); + sb.AppendLine("insert into [dbo].[TbfBatchPruefgang]"); + sb.AppendLine("select @batchNR, @PruefgangNr,@Repetition, @PruefStationNr"); + sb.AppendLine("end"); + + sb.AppendLine("select @PruefgangNr as [Result]"); + int ret = 0; + var result = connection.ExecuteQuery(sb.ToString()); + if (result.Rows.Count >= 1) + { + int.TryParse(result.Rows[0]["Result"].ToString(), out ret); + } + + return ret; + + } + + public IOperation WriteResultsOp(Batch batchResults) + { + return this; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLaDb/DatabaseCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLaDb/DatabaseCfg.cs new file mode 100644 index 00000000..f2bfc4b2 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLaDb/DatabaseCfg.cs @@ -0,0 +1,63 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DB.SensusLa +{ + public enum DBUsed + { + None, + Production, + Test + } + + + public class DatabaseCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(DatabaseCfg) })[0]; + protected override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new DatabaseCfgCtrl(); } + + + public int TestBenchId; + public DBUsed DBUsed; + public int Baujahr; + + public int TesterId; + + /// Written to the database + + + /// Private parameterless constructor invoked by all other (public) constructors + DatabaseCfg() + { + Name = "Sensus-Oracle-DB"; + ParentName = string.Empty; + TestBenchId = 2022; + DBUsed = DBUsed.Test; + Baujahr = 2015; + } + + public DatabaseCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, BenchId={1}, DBUsed={2}, Baujahr={3}", + Name, + TestBenchId, + DBUsed, + Baujahr + ); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLaDb/DatabaseCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLaDb/DatabaseCfgCtrl.cs new file mode 100644 index 00000000..9f9bb959 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLaDb/DatabaseCfgCtrl.cs @@ -0,0 +1,141 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// Author: Milan Hanajík +/// +using System; +using System.Windows.Forms; +using log4net; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DB.SensusLa +{ + public partial class DatabaseCfgCtrl : UserControl, IComponentCfgCtrl + { + static readonly ILog log = LogManager.GetLogger(typeof(DatabaseCfgCtrl)); + + public bool ShowMore { get { return false; } } + + DatabaseCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as DatabaseCfg; + Redraw(); + } + } + + public DatabaseCfgCtrl() + { + InitializeComponent(); + } + + private void WriterCfgCtrl_Load(object sender, EventArgs e) + { + for (int i = 0; i < 3; i++) + { + dbUsedComboBox.Items.Add(((DBUsed)i).ToString()); + } + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + benchIdTextBox.Text = config.TestBenchId.ToString(); + testerIdTextBox.Text = config.TesterId.ToString(); + dbUsedComboBox.Text = config.DBUsed.ToString(); + + } + + public void Unlock() + { + nameTextBox.Enabled = true; + benchIdTextBox.Enabled = true; + dbUsedComboBox.Enabled = true; + benchIdTextBox.Enabled = true; + + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int tmp; + if (!int.TryParse(benchIdTextBox.Text, out tmp) || tmp <= 0) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Test bench ID'"; + } + + + + if (!dbUsedComboBox.Items.Contains(dbUsedComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Database used' item"; + } + + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.None; /// <------------------- !!! + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + if (config.Name != nameTextBox.Text) + { + config.Name = nameTextBox.Text; + flags = CfgUpdateFlags.RestartRqrd; + } + + int benchId = int.Parse(benchIdTextBox.Text); + if (config.TestBenchId != benchId) + { + config.TestBenchId = benchId; + flags = CfgUpdateFlags.RestartRqrd; + } + + int testerId = int.Parse(testerIdTextBox.Text); + if (config.TesterId != testerId) + { + config.TesterId = testerId; + flags = CfgUpdateFlags.RestartRqrd; + } + + + + for (int i = 0; i < 3; i++) + { + if (((DBUsed)i).ToString().Equals(dbUsedComboBox.Text) && (config.DBUsed != (DBUsed)i)) + { + config.DBUsed = (DBUsed)i; + flags = CfgUpdateFlags.RestartRqrd; + break; + } + } + + return flags; + } + + private void destinationButton_Click(object sender, EventArgs e) + { + + } + + private void logsFolderButton_Click(object sender, EventArgs e) + { + + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLaDb/DatabaseCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLaDb/DatabaseCfgCtrl.designer.cs new file mode 100644 index 00000000..b0c3e68a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLaDb/DatabaseCfgCtrl.designer.cs @@ -0,0 +1,157 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// Author: Milan Hanajík +/// +namespace TBF.BenchControl.DB.SensusLa +{ + partial class DatabaseCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.benchIdTextBox = new System.Windows.Forms.TextBox(); + this.benchIdLabel = new System.Windows.Forms.Label(); + this.dbUsedComboBox = new System.Windows.Forms.ComboBox(); + this.dbUsedLabel = new System.Windows.Forms.Label(); + this.testerIdTextBox = new System.Windows.Forms.TextBox(); + this.TestIdLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(110, 30); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(146, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(19, 33); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(107, 8); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // benchIdTextBox + // + this.benchIdTextBox.Enabled = false; + this.benchIdTextBox.Location = new System.Drawing.Point(110, 51); + this.benchIdTextBox.Name = "benchIdTextBox"; + this.benchIdTextBox.Size = new System.Drawing.Size(57, 20); + this.benchIdTextBox.TabIndex = 4; + // + // benchIdLabel + // + this.benchIdLabel.AutoSize = true; + this.benchIdLabel.Location = new System.Drawing.Point(19, 54); + this.benchIdLabel.Name = "benchIdLabel"; + this.benchIdLabel.Size = new System.Drawing.Size(76, 13); + this.benchIdLabel.TabIndex = 3; + this.benchIdLabel.Text = "Test Bench ID"; + // + // dbUsedComboBox + // + this.dbUsedComboBox.Enabled = false; + this.dbUsedComboBox.FormattingEnabled = true; + this.dbUsedComboBox.Location = new System.Drawing.Point(110, 97); + this.dbUsedComboBox.Name = "dbUsedComboBox"; + this.dbUsedComboBox.Size = new System.Drawing.Size(145, 21); + this.dbUsedComboBox.TabIndex = 6; + // + // dbUsedLabel + // + this.dbUsedLabel.AutoSize = true; + this.dbUsedLabel.Location = new System.Drawing.Point(19, 100); + this.dbUsedLabel.Name = "dbUsedLabel"; + this.dbUsedLabel.Size = new System.Drawing.Size(79, 13); + this.dbUsedLabel.TabIndex = 5; + this.dbUsedLabel.Text = "Database used"; + // + // testerIdTextBox + // + this.testerIdTextBox.Enabled = false; + this.testerIdTextBox.Location = new System.Drawing.Point(110, 74); + this.testerIdTextBox.Name = "testerIdTextBox"; + this.testerIdTextBox.Size = new System.Drawing.Size(57, 20); + this.testerIdTextBox.TabIndex = 8; + // + // TestIdLabel + // + this.TestIdLabel.AutoSize = true; + this.TestIdLabel.Location = new System.Drawing.Point(19, 77); + this.TestIdLabel.Name = "TestIdLabel"; + this.TestIdLabel.Size = new System.Drawing.Size(51, 13); + this.TestIdLabel.TabIndex = 7; + this.TestIdLabel.Text = "Tester ID"; + // + // DatabaseCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.testerIdTextBox); + this.Controls.Add(this.TestIdLabel); + this.Controls.Add(this.dbUsedComboBox); + this.Controls.Add(this.dbUsedLabel); + this.Controls.Add(this.benchIdTextBox); + this.Controls.Add(this.benchIdLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "DatabaseCfgCtrl"; + this.Size = new System.Drawing.Size(300, 173); + this.Load += new System.EventHandler(this.WriterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.TextBox benchIdTextBox; + private System.Windows.Forms.Label benchIdLabel; + private System.Windows.Forms.ComboBox dbUsedComboBox; + private System.Windows.Forms.Label dbUsedLabel; + private System.Windows.Forms.TextBox testerIdTextBox; + private System.Windows.Forms.Label TestIdLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLaDb/DatabaseCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLaDb/DatabaseCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLaDb/DatabaseCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLaDb/DatabaseFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLaDb/DatabaseFactory.cs new file mode 100644 index 00000000..ad5a0943 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLaDb/DatabaseFactory.cs @@ -0,0 +1,27 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// Author: Milan Hanajík +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DB.SensusLa +{ + public class DatabaseFactory : IComponentFactory + { + public string ClassName { get { return "Sensus-La-Database"; } } + + public void ResetStaticProperties() { Database.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Database(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Database(cfg); } + + public IComponentCfg DefaultConfig() { return new DatabaseCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(DatabaseCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLaDb/SqlDataAccess.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLaDb/SqlDataAccess.cs new file mode 100644 index 00000000..cfc96ecd --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusLaDb/SqlDataAccess.cs @@ -0,0 +1,243 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; + +namespace TBF.BenchControl.DB.SensusLa +{ + public class SqlDataAccess + { + private string _connectionString = ""; + + public SqlDataAccess(string connectionString) + { + _connectionString = connectionString; + + } + + private SqlConnection _con; + + /// + /// Creating a database connection if there is none. + /// + /// Working with a global connection variable to make sure the connection would be closed at the end of working with it. + private void CreateConnection() + { + if (_con == null) + { + _con = new SqlConnection(_connectionString); + + } + if (_con != null && _con.State == ConnectionState.Closed) + { + _con.Open(); + } + } + + public DataTable ExecuteQuery(string sqlStatement) + { + DataTable ret; + SqlConnection connection = null; + SqlDataReader reader = null; + + try + { + connection = new SqlConnection(_connectionString); + if (connection.State != ConnectionState.Open) + { + connection.Open(); + } + var cmd = connection.CreateCommand(); + cmd.CommandText = sqlStatement; + reader = cmd.ExecuteReader(); + var entries = new object[reader.FieldCount]; + ret = new DataTable(); + + var jcount = 0; + try + { + while (reader.Read()) + { + if (jcount == 0) + { + for (var i = 0; i < reader.FieldCount; i++) + { + var headline = reader.GetName(i); + ret.Columns.Add(headline, Type.GetType("System.Object")); + + } + } + for (var i = 0; i < reader.FieldCount; i++) + { + entries[i] = reader[i]; + } + jcount++; + ret.Rows.Add(entries); + } + } + catch (Exception ex) + { + throw (new Exception(ex.Message, ex)); + } + } + catch (Exception ex) + { + throw (new Exception(ex.Message, ex)); + } + finally + { + try + { + if (reader != null) + { + try + { + reader.Dispose(); + } + catch { } + } + if (connection != null && connection.State == ConnectionState.Open) + { + connection.Close(); + } + } + catch (Exception ex) { throw (new Exception("Unhandled exception within finally: " + ex.Message)); } + } + return ret; + } + /// + /// Executing Stored Procedure + /// + /// The Name of Stored Procedure + /// Parameter names and values + /// Result Set + + + /// + /// Closing and disposing the connection. + /// + private void CloseConnection() + { + if (_con != null) + { + if (_con.State != ConnectionState.Closed) + { + _con.Close(); + } + _con.Dispose(); + } + } + + /// + /// Generating a list of comma seperated parameters by a given string array. + /// + /// array to work on + /// comma seperated string with parameters. + private string GenerateParameter(string[] parameter) + { + var list = new StringBuilder(); + var ret = ""; + var first = true; + + foreach (var param in parameter) + { + if (list.ToString().Length > 0) + { + list.Append(","); + } + + var result = param; + var content = param; + const string mitpat = @"(?:^@\w[\w_\s]*=[\s]*(?:'(.*)'$|(.*)$)|^(?:'(.*)'$|(.*)$))"; + const string numbpat = @"^[+-]?(?:\d+\.?|,?\d*|\d*(\.?|,?)\d+)[\r\n]*$"; + + if (!first || !result.Contains(",")) + { + first = false; + + var mtch = Regex.Match(content, mitpat); + if (mtch.Groups[1].Success) + { + var orig = mtch.Groups[1].Value; + var mch = Regex.Replace(orig, "[']+", "'"); + mch = Regex.Replace(mch, "[']+", "''"); + + result = !String.IsNullOrEmpty(mch) ? content.Replace(orig, mch) : content; + } + else if (mtch.Groups[2].Success) + { + var orig = mtch.Groups[2].Value; + var mch = Regex.Replace(orig, "[']+", "'"); + mch = Regex.Replace(mch, "[']+", "''"); + + if (!String.IsNullOrEmpty(mch)) + { + if (Regex.IsMatch(mch, numbpat) || mch.ToLower() == "null") + { + result = content; + } + else + { + result = content.Replace(orig, "'" + mch + "'"); + } + } + else + { + result = content; + } + } + else if (mtch.Groups[3].Success) + { + var orig = mtch.Groups[3].Value; + var mch = Regex.Replace(orig, "[']+", "'"); + mch = Regex.Replace(mch, "[']+", "''"); + + result = !String.IsNullOrEmpty(mch) ? content.Replace(orig, mch) : content; + } + else if (mtch.Groups[4].Success) + { + var orig = mtch.Groups[4].Value; + var mch = Regex.Replace(orig, "[']+", "'"); + mch = Regex.Replace(mch, "[']+", "''"); + + if (!String.IsNullOrEmpty(mch)) + { + if (Regex.IsMatch(mch, numbpat) || mch.ToLower() == "null") + { + result = content; + } + else + { + result = content.Replace(orig, "'" + mch + "'"); + } + } + else + { + result = content; + } + } + } + + list.Append(result); + } + if (list.ToString().Length > 0) + { + ret = " " + list; + } + + return ret; + } + public string GetConnectionString() + { + return _connectionString; + } + public void Dispose() + { + CloseConnection(); + GC.SuppressFinalize(this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusOracle/Database.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusOracle/Database.cs new file mode 100644 index 00000000..23807a35 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusOracle/Database.cs @@ -0,0 +1,1175 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using log4net; +using Oracle.DataAccess.Client; +using Config; +using Config.Entities; + +namespace TBF.BenchControl.DB.SensusOracle +{ + public enum Retv + { + OK, + Error, + } + + public class Database : ComponentBase, IOperation, GenericDevices.IResultsWriter, Generic.IDevice + { + private static readonly ILog log = LogManager.GetLogger(typeof(Database)); + public override string ToString() { return string.Format("Sensus-Oracle-Database({0})", Cfg.ToString(1)); } + + + enum CurrentOp + { + None, + CheckBarcodeScanning, + WriteResults, + } + CurrentOp currentOp; + bool opCompleted; + bool anyError; + + + /// + /// iPerls to verify + /// + GenericDevices.IRegisterReader[] iperlHeads; + + /// + /// Results to print + /// + Results.Entities.Batch batch; + + OracleConnection connection; /// Oracle database connection + StreamWriter writer; /// Results to disk + StreamWriter logger; /// Logs specified by LU + + + const int Anbid_StaraTura = 4; + + public static DatabaseCfg DBCfg; + string separatorStr; + + + /// + /// Information extracted from VT_PRUEFPUNKT_SOLL_SD for a given watermeter by query: + /// SELECT * FROM VT_PRUEFPUNKT_SOLL_SD WHERE ANBID=4 AND ID_WZTyp=x AND Rev_WZTyp=y + /// + class TestInfo + { + public int PruefungsNr; + public string QBezeichnung; + + public TestInfo(int p, string q) { PruefungsNr = p; QBezeichnung = q; } + + public override string ToString() { return string.Format("({0},{1})", PruefungsNr, QBezeichnung); } + } + /// + static int id_WZTyp; + static int rev_WZTyp; + static IList testInfos = new List(); + + + public Database() {} + + public Database(Generic.IComponentCfg cfg) + : base(cfg) + { + DBCfg = cfg as DatabaseCfg; + + currentOp = CurrentOp.None; + + switch (DBCfg.Separator) + { + default: + case Separator.None: separatorStr = string.Empty; break; + case Separator.Space: separatorStr = " "; break; + case Separator.Tabulator: separatorStr = "\t"; break; + case Separator.Comma: separatorStr = ","; break; + case Separator.Semicolon: separatorStr = ";"; break; + } + + log.Debug(this.ToString()); + } + + public void Initialize() + { + switch (DBCfg.DBUsed) + { + case DBUsed.Production: + connection = new OracleConnection("Data Source=STARA01.WORLD;User Id=deltachef;Password=deltachef;"); + break; + case DBUsed.Quality: + connection = new OracleConnection("Data Source=STARA_TEST.WORLD;User Id=deltachef;Password=deltachef;"); /// TODO: Quality database specification + break; + case DBUsed.Test: + connection = new OracleConnection("Data Source=STARA_TEST.WORLD;User Id=deltachef;Password=deltachef;"); + break; + default: + connection = null; + break; + } + + if (DBCfg.DebugLevel == DebugMode.Simulate) return; + + /// + /// Do something with the database to see if the connection works well + /// + if (connection != null) + { + connection.Open(); + + string rslt = "none"; + OracleCommand cmd = new OracleCommand("select Standort from ANBIETER_SD where ANBID = 4", connection); + OracleDataReader dr = cmd.ExecuteReader(); + if (dr.Read()) rslt = dr.GetString(0); + dr.Close(); + + connection.Close(); + } + } + + public void RunDeviceBefore() {} + public void RunDeviceAfter() {} + + public void StopDevice() + { + if (connection != null) connection.Dispose(); + } + + public void StopDevice2() { } + + + /// + /// Eliminate spaces conditionally, depesing on bool WriterCfg.EliminateSpaces + /// + /// Input string + /// Output string + string ElSpaces(string item) + { + if (DBCfg.EliminateSpaces) + return item.Replace(" ", string.Empty); + else + return item; + } + + + /// + /// Returns a file name derived from a DateTime structure. + /// Creates directories on this path as a side effect. + /// + /// Date and time + /// File name + string GetFileName(DateTime time) + { + string directory = DBCfg.DestinationPath; /// Ends with "\\"; + Directory.CreateDirectory(directory); + + if (DBCfg.YearFolders) + { + directory = string.Format("{0}{1}\\", directory, time.Year.ToString()); + Directory.CreateDirectory(directory); + } + + if (DBCfg.MonthFolders) + { + directory = string.Format("{0}{1}\\", directory, time.Month.ToString("D2")); + Directory.CreateDirectory(directory); + } + + if (DBCfg.DayFolders) + { + directory = string.Format("{0}{1}\\", directory, time.Day.ToString("D2")); + Directory.CreateDirectory(directory); + } + + return string.Format("{0}{1}{2}{3}-{4}{5}.txt", directory, (time.Year % 100).ToString("D2"), + time.Month.ToString("D2"), time.Day.ToString("D2"), time.Hour.ToString("D2"), time.Minute.ToString("D2")); + } + + + /// + /// Returns a file name derived from a DateTime structure. + /// Creates directories on this path as a side effect. + /// + /// Date and time + /// File name + string GetLogFileName(DateTime time) + { + string directory = DBCfg.LogFolderPath; /// Ends with "\\"; + Directory.CreateDirectory(directory); + + if (DBCfg.YearFolders) + { + directory = string.Format("{0}{1}\\", directory, time.Year.ToString()); + Directory.CreateDirectory(directory); + } + + if (DBCfg.MonthFolders) + { + directory = string.Format("{0}{1}\\", directory, time.Month.ToString("D2")); + Directory.CreateDirectory(directory); + } + + if (DBCfg.DayFolders) + { + directory = string.Format("{0}{1}\\", directory, time.Day.ToString("D2")); + Directory.CreateDirectory(directory); + } + + return string.Format("{0}{1}_{2}.log", directory, time.Hour.ToString("D2"), time.Minute.ToString("D2")); + } + + + /// + /// Writes the test cycle results into a file, Events: Event.ResultsWritten + /// + /// Procedure to print the results of + /// Results to write into the file + /// Reference to the operation + public IOperation WriteResultsOp(Results.Entities.Batch batch) + { + if (currentOp != CurrentOp.None) + throw new Exception("Sequence error"); + else + currentOp = CurrentOp.WriteResults; + + this.batch = batch; + + string fname = GetLogFileName(batch.StartTime); + + try + { + logger = new StreamWriter(System.IO.File.Create(fname)); + } + catch + { + logger = null; + log.ErrorFormat("Was not able to open LU log file {0}", fname); + } + + return this; + } + + public IOperation CheckBarcodeScanningOp(GenericDevices.IRegisterReader[] iperlHeads) + { + if (currentOp != CurrentOp.None) + throw new Exception("Sequence error"); + else + currentOp = CurrentOp.CheckBarcodeScanning; + + this.iperlHeads = iperlHeads; + + return this; + } + + /// Start this operation + public void Start() + { + opCompleted = false; + anyError = false; + } + + /// Run this operation + /// Event.ResultsWritten or Event.Error + public Event Run() + { + if (currentOp == CurrentOp.WriteResults) + { + if (!opCompleted) + { + if (batch.WaterMeters.Count == 0) return Event.ResultsWritten; +#if ORACLE_DB + if (DBCfg.DebugLevel != DebugMode.Simulate && connection != null) + { + if (WriteResultsToDatabase(connection, batch, false) == Retv.Error) anyError = true; + } +#endif + WriteLogsToDisk(logger, batch); + + opCompleted = true; + } + + if (anyError) + return Event.ResultsNotWritten; + else + return Event.ResultsWritten; + } + else if (currentOp == CurrentOp.CheckBarcodeScanning) + { + if (!opCompleted) + { +#if ORACLE_DB + if (DBCfg.DebugLevel != DebugMode.Simulate && connection != null) + { + if (CheckBarcodeScanning(connection, iperlHeads) == Retv.Error) anyError = true; ; + } +#endif + opCompleted = true; + } + + if (anyError) + return Event.CheckNotDone; + else + return Event.CheckDone; + } + else + { + return Event.None; + } + } + + /// Stop this operation + public void Stop() + { + currentOp = CurrentOp.None; + } + + + public static Retv WriteLogsToDisk(StreamWriter logger, Results.Entities.Batch batch) + { +#if TURA_IPERL || TURA_SPECIAL + if (logger == null) return Retv.Error; + + Results.Entities.WaterMeter wm0 = null; + foreach (var wm in batch.WaterMeters) if (wm != null) { wm0 = wm; break; } + if (wm0 == null) return Retv.Error; + + Results.Entities.WaterMeterData wmData = wm0.WaterMeterData; + + Results.Entities.MeterTestRslt adj = wm0.GetMeterTestRslt(string.Format("Adjustment")); + Results.Entities.MeterTestRslt q1 = wm0.GetMeterTestRslt(string.Format("Q1")); + Results.Entities.MeterTestRslt q2 = wm0.GetMeterTestRslt(string.Format("Q2")); + Results.Entities.MeterTestRslt q3 = wm0.GetMeterTestRslt(string.Format("Q3")); + if (adj == null || q1 == null || q2 == null || q3 == null) return Retv.Error; + + try + { + logger.WriteLine("[Wasserzähler-Daten]"); + logger.WriteLine(string.Format("PruefPunkte={0}", 3)); + logger.WriteLine(string.Format("Typ={0}", batch.ProcedureName)); /// iP 020 Q3_4 R160 A XXXX + logger.WriteLine(string.Format("MetroKlasse={0}", wmData.MetrologicalClass)); + logger.WriteLine(string.Format("Zulassungszeichen={0}", wmData.ApprovalInfo)); + logger.WriteLine(string.Format("Qn={0}", wmData.Q3_Qn.ToString("F1", Program.AltCulture))); + logger.WriteLine(string.Format("Impulsrate={0}", q3.PulsesPerLiter.ToString(Program.AltCulture))); /// 50,000 + logger.WriteLine(string.Format("WZid={0}", wmData.WMTypeId)); + logger.WriteLine(string.Format("RevWzTyp={0}", wmData.WMTypeRev)); + logger.WriteLine(string.Format("RevPruefstandWzTyp=2")); /// 2 + + logger.WriteLine(string.Format("Durchfluss-5=0,0")); /// 0,0 + logger.WriteLine(string.Format("Prüfzeit-5=0")); /// 0 + logger.WriteLine(string.Format("Prüfbereich100_110-5=0")); /// 0 + logger.WriteLine(string.Format("PrüfbereichMin-5=0")); /// 0 + logger.WriteLine(string.Format("PrüfbereichMax-5=0")); /// 0 + logger.WriteLine(string.Format("QBezeichnung-5=")); /// + + logger.WriteLine(string.Format("Durchfluss-4=0,0")); /// 0,0 + logger.WriteLine(string.Format("Prüfzeit-4=0")); /// 0 + logger.WriteLine(string.Format("Prüfbereich100_110-4=0")); /// 0 + logger.WriteLine(string.Format("PrüfbereichMin-4=0")); /// 0 + logger.WriteLine(string.Format("PrüfbereichMax-4=0")); /// 0 + logger.WriteLine(string.Format("QBezeichnung-4=")); /// + + logger.WriteLine(string.Format("Durchfluss-3=0,0")); /// 0,0 + logger.WriteLine(string.Format("Prüfzeit-3=0")); /// 0 + logger.WriteLine(string.Format("Prüfbereich100_110-3=0")); /// 0 + logger.WriteLine(string.Format("PrüfbereichMin-3=0")); /// 0 + logger.WriteLine(string.Format("PrüfbereichMax-3=0")); /// 0 + logger.WriteLine(string.Format("QBezeichnung-3=")); /// + + logger.WriteLine(string.Format("Durchfluss-2=0,0")); /// 0,0 + logger.WriteLine(string.Format("Prüfzeit-2=0")); /// 0 + logger.WriteLine(string.Format("Prüfbereich100_110-2=0")); /// 0 + logger.WriteLine(string.Format("PrüfbereichMin-2=0")); /// 0 + logger.WriteLine(string.Format("PrüfbereichMax-2=0")); /// 0 + logger.WriteLine(string.Format("QBezeichnung-2=")); /// + + logger.WriteLine(string.Format("Durchfluss-1={0}", Units.ConvertTo(Unit.lph, adj.Qto()).ToString("F1", Program.AltCulture))); + logger.WriteLine(string.Format("Prüfzeit-1={0}", adj.TargetTime().ToString("F0"))); + logger.WriteLine(string.Format("Prüfbereich100_110-1={0}", 0)); + logger.WriteLine(string.Format("PrüfbereichMin-1={0}", 90)); + logger.WriteLine(string.Format("PrüfbereichMax-1={0}", 100)); + logger.WriteLine(string.Format("QBezeichnung-1=Just")); + + logger.WriteLine(string.Format("Durchfluss-0=0,0")); + logger.WriteLine(string.Format("Prüfzeit-0=0")); + logger.WriteLine(string.Format("Prüfbereich100_110-0=0")); + logger.WriteLine(string.Format("PrüfbereichMin-0=0")); + logger.WriteLine(string.Format("PrüfbereichMax-0=0")); + logger.WriteLine(string.Format("QBezeichnung-0=")); + + logger.WriteLine(string.Format("Durchfluss1={0}", Units.ConvertTo(Unit.lph, q1.Qfrom()).ToString("F1", Program.AltCulture))); + logger.WriteLine(string.Format("Prüfzeit1={0}", q1.TargetTime().ToString("F0"))); + logger.WriteLine(string.Format("Prüfbereich100_1101={0}", 1)); + logger.WriteLine(string.Format("PrüfbereichMin1={0}", 100)); + logger.WriteLine(string.Format("PrüfbereichMax1={0}", 110)); + logger.WriteLine(string.Format("QBezeichnung1=Q1")); + logger.WriteLine(string.Format("PosFehlergrenze1={0}", q1.ErrLimHi().ToString("F1", Program.AltCulture))); + logger.WriteLine(string.Format("NegFehlergrenze1={0}", q1.ErrLimLo().ToString("F1", Program.AltCulture))); + logger.WriteLine(string.Format("PosFehlergrenzeWarm1=0,0")); + logger.WriteLine(string.Format("NegFehlergrenzeWarm1=0,0")); + + logger.WriteLine(string.Format("Durchfluss2={0}", Units.ConvertTo(Unit.lph, q2.Qfrom()).ToString("F1", Program.AltCulture))); + logger.WriteLine(string.Format("Prüfzeit2={0}", q2.TargetTime().ToString("F0"))); + logger.WriteLine(string.Format("Prüfbereich100_1102={0}", 1)); + logger.WriteLine(string.Format("PrüfbereichMin2={0}", 100)); + logger.WriteLine(string.Format("PrüfbereichMax2={0}", 110)); + logger.WriteLine(string.Format("QBezeichnung2=Q2")); + logger.WriteLine(string.Format("PosFehlergrenze2={0}", q2.ErrLimHi().ToString("F1", Program.AltCulture))); + logger.WriteLine(string.Format("NegFehlergrenze2={0}", q2.ErrLimLo().ToString("F1", Program.AltCulture))); + logger.WriteLine(string.Format("PosFehlergrenzeWarm2=0,0")); + logger.WriteLine(string.Format("NegFehlergrenzeWarm2=0,0")); + + logger.WriteLine(string.Format("Durchfluss3={0}", Units.ConvertTo(Unit.lph, q3.Qto()).ToString("F1", Program.AltCulture))); + logger.WriteLine(string.Format("Prüfzeit3={0}", q3.TargetTime().ToString("F0"))); + logger.WriteLine(string.Format("Prüfbereich100_1103={0}", 0)); + logger.WriteLine(string.Format("PrüfbereichMin3={0}", 90)); + logger.WriteLine(string.Format("PrüfbereichMax3={0}", 100)); + logger.WriteLine(string.Format("QBezeichnung3=Q3")); + logger.WriteLine(string.Format("PosFehlergrenze3={0}", q3.ErrLimHi().ToString("F1", Program.AltCulture))); + logger.WriteLine(string.Format("NegFehlergrenze3={0}", q3.ErrLimLo().ToString("F1", Program.AltCulture))); + logger.WriteLine(string.Format("PosFehlergrenzeWarm3=0,0")); + logger.WriteLine(string.Format("NegFehlergrenzeWarm3=0,0")); + + logger.WriteLine(string.Format("Durchfluss4=0,0")); + logger.WriteLine(string.Format("Prüfzeit4=0")); + logger.WriteLine(string.Format("Prüfbereich100_1104=0")); + logger.WriteLine(string.Format("PrüfbereichMin4=0")); + logger.WriteLine(string.Format("PrüfbereichMax4=0")); + logger.WriteLine(string.Format("QBezeichnung4=")); + logger.WriteLine(string.Format("PosFehlergrenze4=0,0")); + logger.WriteLine(string.Format("NegFehlergrenze4=0,0")); + logger.WriteLine(string.Format("PosFehlergrenzeWarm4=0,0")); + logger.WriteLine(string.Format("NegFehlergrenzeWarm4=0,0")); + + logger.WriteLine(string.Format("Durchfluss5=0,0")); + logger.WriteLine(string.Format("Prüfzeit5=0")); + logger.WriteLine(string.Format("Prüfbereich100_1105=0")); + logger.WriteLine(string.Format("PrüfbereichMin5=0")); + logger.WriteLine(string.Format("PrüfbereichMax5=0")); + logger.WriteLine(string.Format("QBezeichnung5=")); + logger.WriteLine(string.Format("PosFehlergrenze5=0,0")); + logger.WriteLine(string.Format("NegFehlergrenze5=0,0")); + logger.WriteLine(string.Format("PosFehlergrenzeWarm5=0,0")); + logger.WriteLine(string.Format("NegFehlergrenzeWarm5=0,0")); + + logger.WriteLine(string.Format("GetriebeImpulse=2,000")); /// 2,000 + logger.WriteLine(string.Format("OptikAufsetzen=0")); /// 0 + logger.WriteLine(string.Format("Warm_Kalt=0")); /// 0 + logger.WriteLine(string.Format("Füllzeit=0")); /// 0 + logger.WriteLine(string.Format("EvakVorneZeit=0")); /// 0 + logger.WriteLine(string.Format("EvakHintenZeit={0}", 0)); /// 90 + logger.WriteLine(string.Format("Spüllzeit={0}", 0)); /// 60 + logger.WriteLine(string.Format("Spüldurchfluss={0}", 0)); /// 5000,0 + logger.WriteLine(string.Format("Abpresszeit={0}", 0)); /// 60 + logger.WriteLine(string.Format("Abpressdruck={0}", 0)); /// 0,0 + logger.WriteLine(string.Format("Entwässerzeit={0}", 0)); /// 10 + logger.WriteLine(string.Format("DinA4_Format={0}", 0)); /// 0 + logger.WriteLine(string.Format("Netzwerk_Format={0}", 0)); /// 0 + logger.WriteLine(string.Format("Zählernr_Format={0}", 0)); /// 1 + logger.WriteLine(string.Format("WZ_Gruppe=24")); /// 24 - iPerl + logger.WriteLine(string.Format("MittelwertTiefe={0}", 0)); /// 1 + logger.WriteLine(string.Format("EndKriterium={0}", 0)); /// 0 + logger.WriteLine(string.Format("Justieren={0}", 1)); /// 1 + logger.WriteLine(string.Format("Bemerkung=")); /// + logger.WriteLine(string.Format("Gesamtprüfzeit={0}", (adj.TargetTime() + q1.TargetTime() + q2.TargetTime() + q3.TargetTime()).ToString("F0"))); + logger.WriteLine(string.Format("Gegenprüfung={0}", 0)); /// 0 + logger.WriteLine(string.Format("Geändert_von={0}", 6)); /// 4459 + logger.WriteLine(string.Format("Geändert_am={0:dd.MM.yyyy HH:mm:ss}", DateTime.Now)); /// 29.05.2015 13:46:17 + + for (int i = 0; i < batch.WaterMeters.Count; i++) + { + Results.Entities.WaterMeter wMtr = batch.WaterMeters[i]; + + adj = wMtr.GetMeterTestRslt(string.Format("Adjustment")); + q1 = wMtr.GetMeterTestRslt(string.Format("Q1")); + q2 = wMtr.GetMeterTestRslt(string.Format("Q2")); + q3 = wMtr.GetMeterTestRslt(string.Format("Q3")); + + logger.WriteLine(); + logger.WriteLine(string.Format("[Zählerdaten_{0}]", i + 1)); + + if (wMtr == null || adj == null || q1 == null || q2 == null || q3 == null) + { + logger.WriteLine("geprüft=0"); + } + else + { + logger.WriteLine("geprüft=1"); + logger.WriteLine(string.Format("Zählernummer=")); + logger.WriteLine(string.Format("FertigsNr={0}", wMtr.SerialNr)); + logger.WriteLine(string.Format("bestanden={0}", wMtr.Passed ? 1 : 0)); /// 1 + logger.WriteLine(string.Format("Prüfflag={0}", wMtr.HydrPruefung)); /// 96 + logger.WriteLine(string.Format("FestWertWZ=0")); /// 0 + logger.WriteLine(string.Format("Dicht={0}", 1)); /// 1 + logger.WriteLine(string.Format("PrüfIndex={0}", wMtr.Pruefindex)); /// 7301 + logger.WriteLine(string.Format("GeprüftIndex=1")); /// 1 + + logger.WriteLine(string.Format("Q-1bestanden=1")); + logger.WriteLine(string.Format("Durchfluss-1={0}", Utils.DoubleToStr(Units.ConvertTo(Unit.lph, adj.FlowVolume()), 5, true))); + logger.WriteLine(string.Format("Fehler-1={0}", adj.Error.ToString(Program.AltCulture))); + logger.WriteLine(string.Format("ZeitImpulse-1={0}", adj.TestTime.ToString(Program.AltCulture))); + logger.WriteLine(string.Format("Impulse-1=0")); + logger.WriteLine(string.Format("Volumen-1={0}", adj.VolumeMeter.ToString(Program.AltCulture))); + logger.WriteLine(string.Format("KorrFehler-1={0}", adj.Error.ToString(Program.AltCulture))); + logger.WriteLine(string.Format("KorrDurchfluss-1={0}", 0)); + logger.WriteLine(string.Format("Q-1KorrBestanden={0}", 0)); + logger.WriteLine(string.Format("Anfangsstand-1={0}", 0)); /// TODO + logger.WriteLine(string.Format("Endstand-1={0}", 0)); /// TODO + logger.WriteLine(string.Format("QMittelwert-1={0}", Utils.DoubleToStr(Units.ConvertTo(Unit.lph, adj.FlowVolume()), 5, true))); + logger.WriteLine(string.Format("QStandardAbweichung-1={0}", 0)); + logger.WriteLine(string.Format("ImpedanzMittelwert-1=0,00000")); + logger.WriteLine(string.Format("AusfallGrund-1={0}", 0)); + + logger.WriteLine(string.Format("Q1bestanden={0}", q1.Passed ? 1 : 0)); + logger.WriteLine(string.Format("Durchfluss1={0}", Utils.DoubleToStr(Units.ConvertTo(Unit.lph, q1.FlowVolume()), 5, true))); + logger.WriteLine(string.Format("Fehler1={0}", q1.Error.ToString(Program.AltCulture))); + logger.WriteLine(string.Format("ZeitImpulse1={0}", q1.TestTime.ToString(Program.AltCulture))); + logger.WriteLine(string.Format("Impulse1={0}", 0)); + logger.WriteLine(string.Format("Volumen1={0}", q1.VolumeMeter.ToString(Program.AltCulture))); + logger.WriteLine(string.Format("KorrFehler1={0}", q1.Error.ToString(Program.AltCulture))); + logger.WriteLine(string.Format("KorrDurchfluss1={0}", 0)); + logger.WriteLine(string.Format("Q1KorrBestanden={0}", 0)); + logger.WriteLine(string.Format("Anfangsstand1={0}", 0)); /// TODO + logger.WriteLine(string.Format("Endstand1={0}", 0)); /// TODO + logger.WriteLine(string.Format("QMittelwert1={0}", Utils.DoubleToStr(Units.ConvertTo(Unit.lph, q1.FlowVolume()), 5, true))); + logger.WriteLine(string.Format("QStandardAbweichung1={0}", 0)); + logger.WriteLine(string.Format("ImpedanzMittelwert1=0,00000")); + logger.WriteLine(string.Format("AusfallGrund1={0}", 0)); + + logger.WriteLine(string.Format("Q2bestanden={0}", q2.Passed ? 1 : 0)); + logger.WriteLine(string.Format("Durchfluss2={0}", Utils.DoubleToStr(Units.ConvertTo(Unit.lph, q2.FlowVolume()), 5, true))); + logger.WriteLine(string.Format("Fehler2={0}", q2.Error.ToString(Program.AltCulture))); + logger.WriteLine(string.Format("ZeitImpulse2={0}", q2.TestTime.ToString(Program.AltCulture))); + logger.WriteLine(string.Format("Impulse2={0}", 0)); + logger.WriteLine(string.Format("Volumen2={0}", q2.VolumeMeter.ToString(Program.AltCulture))); + logger.WriteLine(string.Format("KorrFehler2={0}", q2.WaterMeter.Q2CorrectionDone ? q2.WaterMeter.Q2ErrWOCorrection.ToString(Program.AltCulture) + : q2.Error.ToString(Program.AltCulture))); + logger.WriteLine(string.Format("KorrDurchfluss2={0}", 0)); + logger.WriteLine(string.Format("Q2KorrBestanden={0}", 0)); + logger.WriteLine(string.Format("Anfangsstand2={0}", 0)); /// TODO + logger.WriteLine(string.Format("Endstand2={0}", 0)); /// TODO + logger.WriteLine(string.Format("QMittelwert2={0}", Utils.DoubleToStr(Units.ConvertTo(Unit.lph, q2.FlowVolume()), 5, true))); + logger.WriteLine(string.Format("QStandardAbweichung2={0}", 0)); + logger.WriteLine(string.Format("ImpedanzMittelwert2=0,00000")); + logger.WriteLine(string.Format("AusfallGrund2={0}", 0)); + + logger.WriteLine(string.Format("Q3bestanden={0}", q3.Passed ? 1 : 0)); + logger.WriteLine(string.Format("Durchfluss3={0}", Utils.DoubleToStr(Units.ConvertTo(Unit.lph, q3.FlowVolume()), 5, true))); + logger.WriteLine(string.Format("Fehler3={0}", q3.Error.ToString(Program.AltCulture))); + logger.WriteLine(string.Format("ZeitImpulse3={0}", q3.TestTime.ToString(Program.AltCulture))); + logger.WriteLine(string.Format("Impulse3={0}", 0)); + logger.WriteLine(string.Format("Volumen3={0}", q3.VolumeMeter.ToString(Program.AltCulture))); + logger.WriteLine(string.Format("KorrFehler3={0}", q3.Error.ToString(Program.AltCulture))); + logger.WriteLine(string.Format("KorrDurchfluss3={0}", 0)); + logger.WriteLine(string.Format("Q3KorrBestanden={0}", 0)); + logger.WriteLine(string.Format("Anfangsstand3={0}", 0)); /// TODO + logger.WriteLine(string.Format("Endstand3={0}", 0)); /// TODO + logger.WriteLine(string.Format("QMittelwert3={0}", Utils.DoubleToStr(Units.ConvertTo(Unit.lph, q3.FlowVolume()), 5, true))); + logger.WriteLine(string.Format("QStandardAbweichung3={0}", 0)); + logger.WriteLine(string.Format("ImpedanzMittelwert3=0,00000")); + logger.WriteLine(string.Format("AusfallGrund3={0}", 0)); + + logger.WriteLine(string.Format("AusfallGrundGesamt={0}", 0)); + logger.WriteLine(string.Format("AuftragNum={0}", wMtr.PurchaseOrder)); + logger.WriteLine(string.Format("MaterialNum={0}", 38140500)); + logger.WriteLine(string.Format("Prefix={0}", "8SEN01")); + logger.WriteLine(string.Format("Suffix=")); + logger.WriteLine(string.Format("Palette={0}", 0)); + logger.WriteLine(string.Format("Umkarton={0}", 0)); + logger.WriteLine(string.Format("ZNr_komplett=")); + logger.WriteLine(string.Format("OptikBewertung=0,00000")); + logger.WriteLine(string.Format("IdProduziert={0}", 0)); /// 61 + logger.WriteLine(string.Format("Calibration_alt={0}", wMtr.OrigCalibFactor)); + logger.WriteLine(string.Format("Calibration={0}", wMtr.CalibFactor)); + logger.WriteLine(string.Format("Firmware={0}", wMtr.FWVersion)); /// 5.066 + logger.WriteLine(string.Format("FlexFlowFehler={0}", 0)); /// 0 + logger.WriteLine(string.Format("FlexFlowAuftrag={0}", 0)); /// 4248189 + logger.WriteLine(string.Format("JustierWert=0,2")); /// 0,2 + logger.WriteLine(string.Format("Corrected2Hz={0}", wMtr.Hz2CorrectionDone ? 1 : 0)); + logger.WriteLine(string.Format("Q2Corrected={0}", wMtr.Q2CorrectionDone ? 1 : 0)); + logger.WriteLine(string.Format("Q2CorrectionRight={0}", wMtr.Q2CorrRFlow)); + logger.WriteLine(string.Format("Q2CorrectionLeft={0}", wMtr.Q2CorrLFlow)); + logger.WriteLine(string.Format("Q2CorrectionFlowRight={0}", wMtr.Q2CorrFlowRight)); + logger.WriteLine(string.Format("FlowDirectionRight={0}", wMtr.Q2CorrFlowRight)); + logger.WriteLine(string.Format("Position={0}", wMtr.WMPosition)); + } + } + + + logger.WriteLine(); + logger.WriteLine("[Prüfdaten]"); + /// + logger.WriteLine(string.Format("Startzeit={0}", batch.StartTime.ToString("HH:mm:ss"))); + logger.WriteLine(string.Format("Endezeit={0}", batch.EndTime.ToString("HH:mm:ss"))); + logger.WriteLine(string.Format("Datum={0}", batch.StartTime.ToString("dd.MM.yyyy"))); + logger.WriteLine(string.Format("GesamtDauer={0}", batch.EndTime.Subtract(batch.StartTime).TotalSeconds)); + logger.WriteLine(string.Format("Dichtprüfung={0}", 0)); /// 1 + + for (int i = -5; i <= 5; i++) + { + Results.Entities.TestRslt tr; + + if (i == -1) tr = wm0.GetTestRslt("Adjustment"); + else if (i >= 1 && i <= 3) tr = wm0.GetTestRslt(string.Format("Q{0}", i)); + else tr = null; + + if (tr != null) + { + logger.WriteLine(string.Format("Q{0}_geprüft=1", i)); + WriteOneToDisk(logger, i, tr); + } + else + { + logger.WriteLine(string.Format("Q{0}_geprüft=0", i)); + } + } + /// + logger.WriteLine(string.Format("FüllenDruck={0}", 0)); /// 0,00 + logger.WriteLine(string.Format("EvakVorneDruck={0}", 0)); /// 0,00 + logger.WriteLine(string.Format("EvakHintenDruck={0}", 0)); /// -1,00 + logger.WriteLine(string.Format("Spüldurchfluss={0}", 0)); /// 4722,00 + logger.WriteLine(string.Format("AbpressDruck={0}", 0)); /// 20,13 + logger.WriteLine(string.Format("AbpressDruckVorne={0}", 0)); /// 20,16 + logger.WriteLine(string.Format("AbpressDruckBeginn={0}", 0)); /// 0,00 + logger.WriteLine(string.Format("EntwässernDruck={0}", 0)); /// -1,00 + logger.WriteLine(string.Format("ZaehlwerktestAnfang={0}", 0)); /// 0,00000 + logger.WriteLine(string.Format("ZaehlwerktestEnde={0}", 0)); /// 0,00000 + logger.WriteLine(string.Format("ZaehlwerktestImpulse={0}", 0)); /// 0 + logger.WriteLine(string.Format("MeldungZaehler={0}", 0)); /// 0 + + + logger.WriteLine(); + logger.WriteLine("[allgemein]"); + /// + logger.WriteLine(string.Format("Prüfer={0}", batch.UserName)); + logger.WriteLine(string.Format("PrüferID={0}", batch.UserNumber)); + logger.WriteLine(string.Format("AuftragKompakt={0}", 0)); /// 4248189 + logger.WriteLine(string.Format("VariantenCode={0}", "IP")); /// IPRO04CMECAZDKAMMXB1AA2011201101AEUAA1XX314NM1XXXLX + logger.WriteLine(string.Format("SollStückzahl={0}", 3)); /// 1000 + logger.WriteLine(string.Format("IstStückzahl={0}", 3)); /// 61 + logger.WriteLine(string.Format("Bemerkung=§")); /// § + logger.WriteLine(string.Format("BetriebsArt={0}", 3)); /// C + logger.WriteLine(string.Format("BuchstabenVorEtikett=8SEN01")); /// 8SEN01 + logger.WriteLine(string.Format("BuchstabenNachEtikett=")); /// + logger.WriteLine(string.Format("StehenderStartStop={0}", 0)); /// 0 + logger.WriteLine(string.Format("ID_WzPruefreihe={0}", batch.BatchNr)); /// 2583 + logger.WriteLine(string.Format("ID_Pruefstand={0}", 18000 + batch.TestBenchId)); /// 18004 + logger.WriteLine(string.Format("DichteKorrektur=0,00000")); /// 0,00000 + logger.WriteLine(string.Format("LuftauftriebsKorrekturfaktor=1,00000")); /// 1,00100 + logger.WriteLine(string.Format("ProgrammVersion={0}", Program.Version)); + logger.WriteLine(string.Format("LetzteAenderung={0}", Program.BuildDateTime.ToShortDateString())); + logger.WriteLine(string.Format("QuarzTakt={0}", 0)); /// 1953,125 + + /// Close the file + logger.Close(); + logger = null; + } + catch (Exception exc) + { + log.ErrorFormat("Results not saved to disk: {0}", exc.Message); + return Retv.Error; + } +#endif + return Retv.OK; /// OK + } + + + static void WriteOneToDisk(StreamWriter logger, int i, Results.Entities.TestRslt tr) + { + logger.WriteLine(string.Format("Prüfvolumen{0}={1}", i, Config.Units.ConvertTo(Unit.l, tr.TestData.TargetVolume).ToString(Program.AltCulture))); + logger.WriteLine(string.Format("Prüfmasse{0}={1}", i, 0)); /// 3,72610 + logger.WriteLine(string.Format("Temp1_P{0}={1}", i, 0)); /// 20,0 + logger.WriteLine(string.Format("Temp2_P{0}={1}", i, 0)); /// 20,0 + logger.WriteLine(string.Format("Temp3_P{0}={1}", i, 0)); /// 20,0 + logger.WriteLine(string.Format("Temp4_P{0}={1}", i, 0)); /// 20,0 + logger.WriteLine(string.Format("Temp5_P{0}={1}", i, 0)); /// 20,0 + logger.WriteLine(string.Format("Temp6_P{0}={1}", i, 0)); /// 20,0 + logger.WriteLine(string.Format("Temp7_P{0}={1}", i, 0)); /// 0,0 + logger.WriteLine(string.Format("Temp8_P{0}={1}", i, 0)); /// 0,0 + logger.WriteLine(string.Format("Druck1_P{0}={1}", i, Config.Units.ConvertTo(Unit.bar, tr.PressUpMean).ToString(Program.AltCulture))); + logger.WriteLine(string.Format("Druck2_P{0}={1}", i, Config.Units.ConvertTo(Unit.bar, tr.PressDownMean).ToString(Program.AltCulture))); + logger.WriteLine(string.Format("K-Faktor{0}={1}", i, 0)); /// 0,99820080 + logger.WriteLine(string.Format("Q_Waage{0}={1}", i, 0)); /// 26,89887 + logger.WriteLine(string.Format("Q_Vergleich{0}={1}", i, 0)); /// 26,83427 + logger.WriteLine(string.Format("Fehler_Vergleich{0}={1}", i, 0)); /// -0,24014 + logger.WriteLine(string.Format("VZ_ZeitImpulse{0}={1}", i, 0)); /// 500,07962 + logger.WriteLine(string.Format("VZ_Impulse{0}={1}", i, 0)); /// 4473091 + logger.WriteLine(string.Format("ZeitImpulse_VZ{0}={1}", i, 0)); /// 976718 + logger.WriteLine(string.Format("VorwahlZähler{0}={1}", i, 0)); /// 0,00000 + logger.WriteLine(string.Format("VZ_Nummer{0}={1}", i, 0)); /// 3 + logger.WriteLine(string.Format("Anfangsgewicht{0}={1}", i, 0)); /// 4,66535 + logger.WriteLine(string.Format("Endgewicht{0}={1}", i, 0)); /// 8,39145 + logger.WriteLine(string.Format("MinDurchfluss{0}={1}", i, Config.Units.ConvertTo(Unit.lph, tr.FlowMin).ToString(Program.AltCulture))); + logger.WriteLine(string.Format("MaxDurchfluss{0}={1}", i, Config.Units.ConvertTo(Unit.lph, tr.FlowMax).ToString(Program.AltCulture))); + logger.WriteLine(string.Format("Q_Einstellzeit{0}={1}", i, 0)); /// 4,17 + logger.WriteLine(string.Format("Pumpennummer{0}={1}", i, 0)); /// 3 + logger.WriteLine(string.Format("Drehzahl{0}={1}", i, 0)); /// 1743 + logger.WriteLine(string.Format("DAW_Wert{0}={1}", i, 0)); /// 2700 + logger.WriteLine(string.Format("Leitfähigkeit{0}={1}", i, 0)); /// 543,10 + logger.WriteLine(string.Format("LuftDruck{0}={1}", i, 0)); /// 0,0 + logger.WriteLine(string.Format("LuftFeuchtigkeit{0}={1}", i, 0)); /// 0,0 + logger.WriteLine(string.Format("HyDruck{0}={1}", i, 0)); /// 6,2 + logger.WriteLine(string.Format("VorratsDruckHy{0}={1}", i, 0)); /// 6,3 + logger.WriteLine(string.Format("Anfangsgewicht2_{0}={1}", i, 0)); /// 37,94400 + logger.WriteLine(string.Format("Endgewicht2_{0}={1}", i, 0)); /// 37,94200 + logger.WriteLine(string.Format("Prüfmasse2_{0}={1}", i, 0)); /// -0,00200 + logger.WriteLine(string.Format("GegenWaage{0}={1}", i, 0)); /// 1 + } + + +#if ORACLE_DB + public static Retv CheckBarcodeScanning(OracleConnection conn, GenericDevices.IRegisterReader[] iPerlHeads) + { + try + { + conn.Open(); /// Open the Oracle database + + foreach (var rr in iPerlHeads) + { + //WaterMeters.iPerl.WaterMeter iPerlHead = rr as WaterMeters.iPerl.WaterMeter; + + //if (iPerlHead != null) + //{ + // OracleCommand cmd = new OracleCommand("select * from IP_ENDTEST_PD where PCBNUMBER = :1 and TESTSTATIONNAME = :2", conn); + // OracleParameter param; + // param = new OracleParameter("PCBNUMBER", OracleDbType.Varchar2); param.Value = iPerlHead.SerialNr; cmd.Parameters.Add(param); + // param = new OracleParameter("TESTSTATIONNAME", OracleDbType.Varchar2); param.Value = "STAWL001"; cmd.Parameters.Add(param); + + // bool exists = false; /// true = RF_Power record exists + // OracleDataReader dr1 = cmd.ExecuteReader(); + // if (dr1.Read()) { exists = true; } + // dr1.Close(); + + // if (!exists) + // { + // iPerlHead.CommFailed = true; + // } + //} + } + } + catch (Exception exc) + { + log.ErrorFormat("Barcode scanning records were not checked: {1}", exc.Message); + + conn.Close(); + return Retv.Error; + } + + conn.Close(); + return Retv.OK; + } + + + public static Retv WriteResultsToDatabase(OracleConnection conn, Results.Entities.Batch batch, bool safeMode) + { + OracleTransaction transaction = null; + + try + { + conn.Open(); /// Open the Oracle database + transaction = conn.BeginTransaction(); + + SaveBatchData(conn, batch); + + foreach (var wMtr in batch.WaterMeters) + { + SaveSingleWM2DB(conn, wMtr, safeMode); + } + + transaction.Commit(); + } + catch (Exception exc) + { + if (transaction != null) transaction.Rollback(); + + log.ErrorFormat("Results of batch {0} not written to ORACLE database: {1}", + batch.BatchNr, exc.Message); + + conn.Close(); + return Retv.Error; + } + + conn.Close(); + return Retv.OK; + } + + + /// + /// Write one meter results into the database + /// + /// 0-based water meter number + /// Sorted list of results to save + static void SaveSingleWM2DB(OracleConnection conn, Results.Entities.WaterMeter wm, bool safeMode) + { + if (string.IsNullOrEmpty(wm.SerialNr)) return; /// No database activity possible w/o PCB number + + if (safeMode && !wm.Passed) return; + + /// + /// Read a list of all prufindexes for a given PCB Number + /// + IList pruefindexes = new List(); + { + OracleParameter parm = new OracleParameter(); + parm.OracleDbType = OracleDbType.Varchar2; + parm.Value = wm.SerialNr; + + OracleCommand cmd1 = new OracleCommand("SELECT Pruefindex FROM VT_ZAEHLER_PINDEX_PD WHERE VT_Fernum = :1 AND ANBID = 4", conn); + cmd1.Parameters.Add(parm); + + OracleDataReader dr = cmd1.ExecuteReader(); + while (dr.Read()) { pruefindexes.Add(dr.GetInt32(0)); } + dr.Close(); + } + { + OracleParameter parm = new OracleParameter(); + parm.OracleDbType = OracleDbType.Varchar2; + parm.Value = wm.SerialNr; + + OracleCommand cmd1 = new OracleCommand("SELECT Max_Pruefindex FROM VT_ZAEHLER_PD WHERE VT_Fernum = :1 AND ANBID = 4", conn); + cmd1.Parameters.Add(parm); + + OracleDataReader dr = cmd1.ExecuteReader(); + while (dr.Read()) { pruefindexes.Add(dr.GetInt32(0)); } + dr.Close(); + } + + /// + /// Determine MAX_Pruefindex + /// + int maxpruefindexLowPart = 0; + foreach (var v in pruefindexes) + { + if ((v % 100) > maxpruefindexLowPart) maxpruefindexLowPart = (v % 100); + } + int MAX_Pruefindex = 100 * DBCfg.TestBenchId + maxpruefindexLowPart + 1; + + + int Hydr_Pruefung; + if (wm.Passed) + { + /// Passed + if (maxpruefindexLowPart == 0) + Hydr_Pruefung = 96; + else + Hydr_Pruefung = 224; + } + else + { + /// Failed + Hydr_Pruefung = 97; /// Hydr. test failed, Pressure test passed + } + + wm.Pruefindex = MAX_Pruefindex; + wm.HydrPruefung = Hydr_Pruefung; + SaveOrUpdateWM(conn, wm, MAX_Pruefindex, Hydr_Pruefung); + } + + + /// + /// Save common batch data + /// + /// Batch + static void SaveBatchData(OracleConnection conn, Results.Entities.Batch b) + { + OracleParameter parm; + + OracleCommand cmd = new OracleCommand("INSERT INTO VT_PRUEFREIHE_PD(" + + "ANBID, ID_Pruefstand, ID_WzPruefreihe, ID_WZTyp, Rev_WZTyp, Rev_Pruefstand_WZTyp, " + + "StartDatumZeit, EndDatumZeit, Betriebsart, QVzKontakt, " + + "FuellenBegDruck, DruckEvakVorne, DruckEvakHinten, DruckBeiAbpressen, " + + "Druckentwaessern, SpuelDurchflussIst, ProgrammVersion)" + + " VALUES (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11, :12, :13, :14, :15, :16, :17)", conn); + parm = new OracleParameter("ANBID", OracleDbType.Int32); parm.Value = Anbid_StaraTura; cmd.Parameters.Add(parm); ///:1 + parm = new OracleParameter("ID_Pruefstand", OracleDbType.Int32); parm.Value = 18000 + b.TestBenchId; cmd.Parameters.Add(parm); ///:2 + parm = new OracleParameter("ID_WzPruefreihe", OracleDbType.Int32); parm.Value = b.BatchNr; cmd.Parameters.Add(parm); ///:3 + parm = new OracleParameter("ID_WZTyp", OracleDbType.Int32); parm.Value = b.WaterMeters[0].WaterMeterData.WMTypeId; cmd.Parameters.Add(parm); ///:4 + parm = new OracleParameter("Rev_WZTyp", OracleDbType.Int32); parm.Value = b.WaterMeters[0].WaterMeterData.WMTypeRev; cmd.Parameters.Add(parm); ///:5 + parm = new OracleParameter("Rev_Pruefstand_WZTyp", OracleDbType.Int32); parm.Value = 1; cmd.Parameters.Add(parm); ///:6 + + parm = new OracleParameter("StartDatumZeit", OracleDbType.TimeStamp); parm.Value = b.StartTime; cmd.Parameters.Add(parm); ///:7 + parm = new OracleParameter("EndDatumZeit", OracleDbType.TimeStamp); parm.Value = b.EndTime; cmd.Parameters.Add(parm); ///:8 + parm = new OracleParameter("Betriebsart", OracleDbType.Varchar2); parm.Value = ""; cmd.Parameters.Add(parm); ///:9 + parm = new OracleParameter("QVzKontakt", OracleDbType.Double); parm.Value = 0; cmd.Parameters.Add(parm); ///:10 + + parm = new OracleParameter("FuellenBegDruck", OracleDbType.Double); parm.Value = 0; cmd.Parameters.Add(parm); ///:11 + parm = new OracleParameter("DruckEvakVorne", OracleDbType.Double); parm.Value = 0; cmd.Parameters.Add(parm); ///:12 + parm = new OracleParameter("DruckEvakHinten", OracleDbType.Double); parm.Value = 0; cmd.Parameters.Add(parm); ///:13 + parm = new OracleParameter("DruckBeiAbpressen", OracleDbType.Double); parm.Value = 0; /*TODO*/ cmd.Parameters.Add(parm); ///:14 + + parm = new OracleParameter("Druckentwaessern", OracleDbType.Double); parm.Value = 0; cmd.Parameters.Add(parm); ///:15 + parm = new OracleParameter("SpuelDurchflussIst", OracleDbType.Double); parm.Value = 0; /*TODO*/ cmd.Parameters.Add(parm); ///:16 + parm = new OracleParameter("ProgrammVersion", OracleDbType.Varchar2); parm.Value = "TBF v." + b.ProgramVersion; cmd.Parameters.Add(parm); ///:17 + + cmd.ExecuteNonQuery(); /// Returns nr. of updated rows + + if ((id_WZTyp != b.WaterMeters[0].WaterMeterData.WMTypeId) || (rev_WZTyp != b.WaterMeters[0].WaterMeterData.WMTypeRev) || testInfos.Count == 0) + { + testInfos.Clear(); + id_WZTyp = b.WaterMeters[0].WaterMeterData.WMTypeId; + rev_WZTyp = b.WaterMeters[0].WaterMeterData.WMTypeRev; + + OracleCommand cmd1 = new OracleCommand("SELECT PruefungsNr, PosFehlerKalt, QBezeichnung FROM VT_PRUEFPUNKT_SOLL_SD WHERE ANBID=4 AND ID_WZTyp=:1 AND Rev_WZTyp=:2", conn); + parm = new OracleParameter("ID_WZTyp", OracleDbType.Int32); parm.Value = id_WZTyp; cmd1.Parameters.Add(parm); ///:1 + parm = new OracleParameter("Rev_WZTyp", OracleDbType.Int32); parm.Value = rev_WZTyp; cmd1.Parameters.Add(parm); ///:2 + + OracleDataReader dr = cmd1.ExecuteReader(); + while (dr.Read()) + { + int pruefungsNr = dr.GetInt32(0); + double errLimHi = dr.GetDouble(1); + string qBezeichnung = dr.GetString(2); + if (qBezeichnung == "Q2" && errLimHi > 2.0) qBezeichnung = "Q2adj"; + if (qBezeichnung.ToLower().Contains("just") && pruefungsNr == -1) qBezeichnung = "Adjustment"; + + if (qBezeichnung.Contains("Q") || qBezeichnung == "Adjustment") + { + testInfos.Add(new TestInfo(pruefungsNr, qBezeichnung)); + log.WarnFormat("VT_PRUEFPUNKT_SOLL_SD info : ID_WZTyp={0} Rev_WZTyp={1} PruefungsNr={2} PosFehlerKalt={3} QBezeichnung={4}", + id_WZTyp, rev_WZTyp, pruefungsNr, errLimHi, qBezeichnung); + } + } + dr.Close(); + } + + foreach (var testInfo in testInfos) + { + Results.Entities.TestRslt tr = b.GetTestRslt(testInfo.QBezeichnung, 0); + + if (tr == null) tr = b.GetTestRslt(testInfo.QBezeichnung, 1); /// TODO: Remove this workaround for large watermeters with multiple parts at Q3 + + if (tr == null) continue; + + OracleCommand cmd2 = new OracleCommand("INSERT INTO VT_PRUEFDURCHFLUSS_PD(" + + "ANBID, ID_Pruefstand, ID_WzPruefreihe, PruefungsNr, " + + "PVOL, PMasse, MinDurchfluss, MaxDurchfluss, " + + "Q_ist, KFaktor, Q_VZ, F_VZ, RegelEinstellZeit, Drehzahl, " + + "BeginnDruck_Vorne, BeginnDruck_Hinten, EndDruck_Vorne, EndDruck_Hinten, " + + "TVWZ, IVWZ, Verwendeter_VZ, BeginnGewicht, EndGewicht)" + + " VALUES (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11, :12, :13, :14, :15, " + + ":16, :17, :18, :19, :20, :21, :22, :23)", conn); + + parm = new OracleParameter("ANBID", OracleDbType.Int32); parm.Value = Anbid_StaraTura; cmd2.Parameters.Add(parm); ///:1 + parm = new OracleParameter("ID_Pruefstand", OracleDbType.Int32); parm.Value = 18000 + b.TestBenchId; cmd2.Parameters.Add(parm); ///:2 + parm = new OracleParameter("ID_WzPruefreihe", OracleDbType.Int32); parm.Value = b.BatchNr; cmd2.Parameters.Add(parm); ///:3 + parm = new OracleParameter("PruefungsNr", OracleDbType.Int32); parm.Value = testInfo.PruefungsNr; cmd2.Parameters.Add(parm); ///:4 + /// + parm = new OracleParameter("PVOL", OracleDbType.Double); parm.Value = Units.ConvertTo(Unit.l, tr.VolumeCTV); cmd2.Parameters.Add(parm); ///:5 + parm = new OracleParameter("PMasse", OracleDbType.Double); parm.Value = Units.ConvertTo(Unit.kg, tr.MassEnd-tr.MassStart); cmd2.Parameters.Add(parm); ///:6 + parm = new OracleParameter("MinDurchfluss", OracleDbType.Double); parm.Value = Units.ConvertTo(Unit.lph, tr.FlowMin); cmd2.Parameters.Add(parm); ///:7 + parm = new OracleParameter("MaxDurchfluss", OracleDbType.Double); parm.Value = Units.ConvertTo(Unit.lph, tr.FlowMax); cmd2.Parameters.Add(parm); ///:8 + + double Q_ist = (tr.VolumeMaster != 0) ? (tr.FlowVolume * tr.VolumeCTV / tr.VolumeMaster) : (double)tr.FlowVolume; + parm = new OracleParameter("Q_ist", OracleDbType.Double); parm.Value = Units.ConvertTo(Unit.lph, Q_ist); cmd2.Parameters.Add(parm); ///:9 + parm = new OracleParameter("KFaktor", OracleDbType.Double); parm.Value = tr.ConstMaster; cmd2.Parameters.Add(parm); ///:10 + parm = new OracleParameter("Q_VZ", OracleDbType.Double); parm.Value = Units.ConvertTo(Unit.lph, tr.FlowVolume); cmd2.Parameters.Add(parm); ///:11 + parm = new OracleParameter("F_VZ", OracleDbType.Double); parm.Value = tr.ErrorMaster; cmd2.Parameters.Add(parm); ///:12 + parm = new OracleParameter("RegelEinstellZeit", OracleDbType.Double); parm.Value = (double)tr.FlowSetTime; cmd2.Parameters.Add(parm); ///:13 + parm = new OracleParameter("Drehzahl", OracleDbType.Int32); parm.Value = 0; /* TODO */ cmd2.Parameters.Add(parm); ///:14 + /// + parm = new OracleParameter("BeginnDruck_Vorne", OracleDbType.Double); parm.Value = Units.ConvertTo(Unit.bar, tr.PressUpStart); cmd2.Parameters.Add(parm); ///:15 + parm = new OracleParameter("BeginnDruck_Hinten", OracleDbType.Double); parm.Value = Units.ConvertTo(Unit.bar, tr.PressDownStart); cmd2.Parameters.Add(parm); ///:16 + parm = new OracleParameter("EndDruck_Vorne", OracleDbType.Double); parm.Value = Units.ConvertTo(Unit.bar, tr.PressUpEnd); cmd2.Parameters.Add(parm); ///:17 + parm = new OracleParameter("EndDruck_Hinten", OracleDbType.Double); parm.Value = Units.ConvertTo(Unit.bar, tr.PressDownEnd); cmd2.Parameters.Add(parm); ///:18 + /// + parm = new OracleParameter("TVWZ", OracleDbType.Double); parm.Value = tr.TestTime; cmd2.Parameters.Add(parm); ///:19 + parm = new OracleParameter("IVWZ", OracleDbType.Int32); parm.Value = tr.PulsesMaster; cmd2.Parameters.Add(parm); ///:20 + parm = new OracleParameter("Verwendeter_VZ", OracleDbType.Int32); parm.Value = 0; /* TODO */ cmd2.Parameters.Add(parm); ///:21 + parm = new OracleParameter("BeginnGewicht", OracleDbType.Double); parm.Value = Units.ConvertTo(Unit.kg, tr.MassStart); cmd2.Parameters.Add(parm); ///:22 + parm = new OracleParameter("EndGewicht", OracleDbType.Double); parm.Value = Units.ConvertTo(Unit.kg, tr.MassEnd); cmd2.Parameters.Add(parm); ///:23 + + cmd2.ExecuteNonQuery(); /// Returns nr. of updated rows + } + + log.InfoFormat("Batch data saved, batchNr={0}", b.BatchNr); + } + + + static void SaveOrUpdateWM(OracleConnection conn, Results.Entities.WaterMeter wm, int max_Pruefindex, int hydr_Pruefung) + { + int sekundaere_Adr = wm.Passed ? 1 : 0; + int idBenutzer = 6; // = wm.Batch.UserNumber; + + if (max_Pruefindex % 100 == 1) + { + OracleCommand cmd = new OracleCommand("INSERT INTO VT_ZAEHLER_PD(Auftragsnummer, VT_Identnummer, VT_Fernum, Max_Pruefindex, Zaehlernummer, Sekundaere_Adr, Hydr_Pruefung, ID_Benutzer, ANBID, Baujahr) VALUES (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10)", conn); + + OracleParameter parm; + parm = new OracleParameter("Auftragsnummer", OracleDbType.Varchar2); parm.Value = wm.PurchaseOrder; cmd.Parameters.Add(parm); + parm = new OracleParameter("VT_Identnummer", OracleDbType.Varchar2); parm.Value = "IPBATMXX"; cmd.Parameters.Add(parm); + parm = new OracleParameter("VT_Fernum", OracleDbType.Varchar2); parm.Value = wm.SerialNr; cmd.Parameters.Add(parm); + parm = new OracleParameter("Max_Pruefindex", OracleDbType.Int32); parm.Value = max_Pruefindex; cmd.Parameters.Add(parm); + parm = new OracleParameter("Zaehlernummer", OracleDbType.Int32); parm.Value = -1; cmd.Parameters.Add(parm); + parm = new OracleParameter("Sekundaere_Adr", OracleDbType.Int32); parm.Value = sekundaere_Adr; cmd.Parameters.Add(parm); + parm = new OracleParameter("Hydr_Pruefung", OracleDbType.Int32); parm.Value = hydr_Pruefung; cmd.Parameters.Add(parm); + parm = new OracleParameter("ID_Benutzer", OracleDbType.Int32); parm.Value = idBenutzer; cmd.Parameters.Add(parm); + parm = new OracleParameter("ANBID", OracleDbType.Int32); parm.Value = Anbid_StaraTura; cmd.Parameters.Add(parm); + parm = new OracleParameter("Baujahr", OracleDbType.Int32); parm.Value = DBCfg.Baujahr; cmd.Parameters.Add(parm); + + cmd.ExecuteNonQuery(); + log.InfoFormat("VT_ZAEHLER_PD inserted, PcbNr={0}, pos={1}, maxPruefix={2}", wm.SerialNr, wm.WMPosition, max_Pruefindex); + } + else + { + OracleCommand cmd = new OracleCommand("UPDATE VT_ZAEHLER_PD SET Auftragsnummer = :1, VT_Identnummer = :2, Max_Pruefindex = :3, Hydr_Pruefung= :4, ID_Benutzer= :5, Baujahr= :6 WHERE VT_Fernum = :7 and ANBID = :8", conn); + + OracleParameter parm; + parm = new OracleParameter("Auftragsnummer", OracleDbType.Varchar2); parm.Value = wm.PurchaseOrder; cmd.Parameters.Add(parm); + parm = new OracleParameter("VT_Identnummer", OracleDbType.Varchar2); parm.Value = "IPBATMXX"; cmd.Parameters.Add(parm); + parm = new OracleParameter("Max_Pruefindex", OracleDbType.Int32); parm.Value = max_Pruefindex; cmd.Parameters.Add(parm); + parm = new OracleParameter("Hydr_Pruefung", OracleDbType.Int32); parm.Value = hydr_Pruefung; cmd.Parameters.Add(parm); + parm = new OracleParameter("ID_Benutzer", OracleDbType.Int32); parm.Value = idBenutzer; cmd.Parameters.Add(parm); + parm = new OracleParameter("Baujahr", OracleDbType.Int32); parm.Value = DBCfg.Baujahr; cmd.Parameters.Add(parm); + parm = new OracleParameter("VT_Fernum", OracleDbType.Varchar2); parm.Value = wm.SerialNr; cmd.Parameters.Add(parm); + parm = new OracleParameter("ANBID", OracleDbType.Int32); parm.Value = Anbid_StaraTura; cmd.Parameters.Add(parm); + + cmd.ExecuteNonQuery(); + log.InfoFormat("VT_ZAEHLER_PD updated, PcbNr={0}, pos={1}, maxPruefix={2}", wm.SerialNr, wm.WMPosition, max_Pruefindex); + } + + { + OracleCommand cmd = new OracleCommand("INSERT INTO VT_ZAEHLER_PINDEX_PD(" + + "VT_Fernum, Pruefindex, ANBID, ID_Pruefstand, ID_WzPruefreihe, Hydr_Pruefung, " + + "ReedKontakt, ReedKontaktOK, ReedKontaktZeit, KorrImprate, FestWertWZ, PtestOK, " + + "Zaehlerstand, WT_Platz_NR, WZgut, ID_Benutzer, AnzahlPruefungen)" + + " VALUES (:1, :2, :3, :4, :5, :6, 0, 0, 0, :7, 0, :8, 0, :9, :10, :11, :12)", conn); + OracleParameter parm; + parm = new OracleParameter("VT_Fernum", OracleDbType.Varchar2); parm.Value = wm.SerialNr; cmd.Parameters.Add(parm); + parm = new OracleParameter("Pruefindex", OracleDbType.Int32); parm.Value = max_Pruefindex; cmd.Parameters.Add(parm); + parm = new OracleParameter("ANBID", OracleDbType.Int32); parm.Value = Anbid_StaraTura; cmd.Parameters.Add(parm); + parm = new OracleParameter("ID_Pruefstand", OracleDbType.Int32); parm.Value = 18000 + wm.Batch.TestBenchId; cmd.Parameters.Add(parm); + parm = new OracleParameter("ID_WzPruefreihe", OracleDbType.Int32); parm.Value = wm.Batch.BatchNr; cmd.Parameters.Add(parm); + parm = new OracleParameter("Hydr_Pruefung", OracleDbType.Int32); parm.Value = hydr_Pruefung; cmd.Parameters.Add(parm); + // ReedKontakt + // ReedKontaktOK + // ReedKontaktZeit + parm = new OracleParameter("KorrImprate", OracleDbType.Double); parm.Value = wm.OrigCalibFactor; cmd.Parameters.Add(parm); + // FestWertWZ + parm = new OracleParameter("PtestOK", OracleDbType.Int32); parm.Value = 0;/*TODO*/ cmd.Parameters.Add(parm); + // Zaehlerstand + parm = new OracleParameter("WT_Platz_NR", OracleDbType.Int32); parm.Value = wm.WMPosition; cmd.Parameters.Add(parm); + parm = new OracleParameter("WZgut", OracleDbType.Int32); parm.Value = wm.Passed ? 1 : 0; cmd.Parameters.Add(parm); + parm = new OracleParameter("ID_Benutzer", OracleDbType.Int32); parm.Value = idBenutzer; cmd.Parameters.Add(parm); + parm = new OracleParameter("AnzahlPruefungen", OracleDbType.Int32); parm.Value = 3; cmd.Parameters.Add(parm); + + cmd.ExecuteNonQuery(); + log.InfoFormat("VT_ZAEHLER_PINDEX_PD inserted, PcbNr={0}, pos={1}, pruefix={2}", wm.SerialNr, wm.WMPosition, max_Pruefindex % 100); + } + + + foreach (var testInfo in testInfos) + { + Results.Entities.TestData tData = wm.GetTestData(testInfo.QBezeichnung); + Results.Entities.MeterTestRslt mtr; + if (tData == null) + { + throw new Exception(string.Format("'{0}' test results missing, watermeter {1}", testInfo.QBezeichnung, wm.WMPosition)); + } + else if (tData.Repeats == 1) + { + mtr = wm.GetMeterTestRslt(testInfo.QBezeichnung); + if (mtr == null) throw new Exception(string.Format("'{0}' test results missing, watermeter {1}", testInfo.QBezeichnung, wm.WMPosition)); + } + else + { + Results.Entities.MeterTestRslt firstMtr = wm.GetMeterTestRslt(Utils.TestTitle(tData, 1)); + if (firstMtr == null) throw new Exception(string.Format("'{0}' test results missing, watermeter {1}", Utils.TestTitle(tData, 1), wm.WMPosition)); + + mtr = new Results.Entities.MeterTestRslt(); + mtr.CopyContentFrom(firstMtr); + mtr.TestRslt = firstMtr.TestRslt; + mtr.WaterMeter = firstMtr.WaterMeter; + for (int i = 2; i <= tData.Repeats; i++) + { + Results.Entities.MeterTestRslt nextMtr = wm.GetMeterTestRslt(Utils.TestTitle(tData, i)); + if (nextMtr == null) throw new Exception(string.Format("'{0}' test results missing, watermeter {1}", Utils.TestTitle(tData, i), wm.WMPosition)); + + mtr.TestTime += nextMtr.TestTime; + mtr.VolumeMeter += nextMtr.VolumeMeter; + mtr.VolumeRef += nextMtr.VolumeRef; + mtr.VolumeEnd = nextMtr.VolumeEnd; + mtr.Passed = (mtr.Passed && nextMtr.Passed); + } + mtr.Error = Formulas.ErrorFromVolumes(mtr.VolumeMeter, mtr.VolumeRef); + } + + SaveMeterTestResult(conn, mtr, testInfo.PruefungsNr, max_Pruefindex); + } + + + { + double q2ErrWOCorrection = Math.Min(100.0, Math.Max(-100.0, wm.Q2ErrWOCorrection)); + + OracleCommand cmd = new OracleCommand("INSERT INTO VT_IP_ZAEHLER_PINDEX_PD(" + + "VT_Fernum, Pruefindex, ANBID, WITHCORRECTION2HZ, CORRECTION2HZ, DIFF2HZ8HZ, " + + "WITHQ2CORRECTION, ERRQ2, Q2CORRECTIONFLOWRIGHT, Q2CORRECTIONLEFT, Q2CORRECTIONRIGHT)" + + " VALUES (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11)", conn); + OracleParameter parm; + parm = new OracleParameter("VT_Fernum", OracleDbType.Varchar2); parm.Value = wm.SerialNr; cmd.Parameters.Add(parm); ///:1 + parm = new OracleParameter("Pruefindex", OracleDbType.Int32); parm.Value = max_Pruefindex; cmd.Parameters.Add(parm); ///:2 + parm = new OracleParameter("ANBID", OracleDbType.Int32); parm.Value = Anbid_StaraTura; cmd.Parameters.Add(parm); ///:3 + parm = new OracleParameter("WITHCORRECTION2HZ", OracleDbType.Int32); parm.Value = wm.Hz2CorrectionDone ? 1 : 0; cmd.Parameters.Add(parm); ///:4 + parm = new OracleParameter("CORRECTION2HZ", OracleDbType.Double); parm.Value = wm.Hz2Correction; cmd.Parameters.Add(parm); ///:5 + parm = new OracleParameter("DIFF2HZ8HZ", OracleDbType.Double); parm.Value = Math.Min(99.0, Math.Max(-99.0, wm.Diff2Hz8Hz)); cmd.Parameters.Add(parm); ///:6 + parm = new OracleParameter("WITHQ2CORRECTION", OracleDbType.Int32); parm.Value = wm.Q2CorrectionDone ? 1 : 0; cmd.Parameters.Add(parm); ///:7 + parm = new OracleParameter("ERRQ2", OracleDbType.Double); parm.Value = q2ErrWOCorrection; cmd.Parameters.Add(parm); ///:8 + parm = new OracleParameter("Q2CORRECTIONFLOWRIGHT", OracleDbType.Int32);parm.Value = wm.Q2CorrFlowRight;/*1=right to left*/ cmd.Parameters.Add(parm); ///:9 + parm = new OracleParameter("Q2CORRECTIONLEFT", OracleDbType.Int32); parm.Value = wm.Q2CorrLFlow; cmd.Parameters.Add(parm); ///:10 + parm = new OracleParameter("Q2CORRECTIONRIGHT", OracleDbType.Int32); parm.Value = wm.Q2CorrRFlow; cmd.Parameters.Add(parm); ///:11 + + int rowsUpdated = cmd.ExecuteNonQuery(); + log.InfoFormat("VT_IP_ZAEHLER_PINDEX_PD inserted, PcbNr={0}, pruefix={1}", wm.SerialNr, max_Pruefindex); + } + } + + + /// + /// Saves a water meter result of a single test + /// + /// q = 0, 1, 2 or 3 (Adj., Q1, Q2, Q3) + /// Nr. of rows updated + static int SaveMeterTestResult(OracleConnection conn, Results.Entities.MeterTestRslt mtr, int pruefungsNr, int max_Pruefindex) /// + { + double Q_wm = 3600.0 * mtr.VolumeMeter / mtr.TestTime; /// in [l/hour] + double Q_wm_with_upper_bound = Math.Min(2 * 1000 * mtr.TestRslt.FlowVolume, Math.Max(0.0, Q_wm)); + + OracleCommand cmd = new OracleCommand("INSERT INTO VT_PRUEFREIHE_IST_PD(" + + "VT_Fernum, Pruefindex, PruefungsNr, ANBID, ID_WZTyp, Rev_WZTyp, Rev_WZPruefpunkt, " + + "Q_WZ, Q_Fehler, Q_Best, NIZ, AnfangZStand, EndZStand, " + + "KorrErrQok, KorrErrQ, KorrQWz, TIZ, Vol_WZ_US, TempMittel_US)" + + " VALUES (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11, :12, :13, 0, :14, 0, :15, 0, 0)", conn); + OracleParameter parm; + parm = new OracleParameter("VT_Fernum", OracleDbType.Varchar2); parm.Value = mtr.WaterMeter.SerialNr; cmd.Parameters.Add(parm); ///:1 + parm = new OracleParameter("Pruefindex", OracleDbType.Int32); parm.Value = max_Pruefindex; cmd.Parameters.Add(parm); ///:2 + parm = new OracleParameter("PruefungsNr", OracleDbType.Int32); parm.Value = pruefungsNr; cmd.Parameters.Add(parm); ///:3 + parm = new OracleParameter("ANBID", OracleDbType.Int32); parm.Value = Anbid_StaraTura; cmd.Parameters.Add(parm); ///:4 + parm = new OracleParameter("ID_WZTyp", OracleDbType.Int32); parm.Value = mtr.WaterMeter.WaterMeterData.WMTypeId; cmd.Parameters.Add(parm); ///:5 + parm = new OracleParameter("Rev_WZTyp", OracleDbType.Int32); parm.Value = mtr.WaterMeter.WaterMeterData.WMTypeRev; cmd.Parameters.Add(parm); ///:6 + parm = new OracleParameter("Rev_WZPruefpunkt", OracleDbType.Int32); parm.Value = 1; cmd.Parameters.Add(parm); ///:7 + parm = new OracleParameter("Q_WZ", OracleDbType.Double); parm.Value = Q_wm_with_upper_bound; cmd.Parameters.Add(parm); ///:8 + parm = new OracleParameter("Q_Fehler", OracleDbType.Double); parm.Value = Math.Min(100.0, Math.Max(-100.0, mtr.Error)); cmd.Parameters.Add(parm); ///:9 + parm = new OracleParameter("Q_Best", OracleDbType.Int32); parm.Value = mtr.Passed ? 1 : 0; cmd.Parameters.Add(parm); ///:10 + parm = new OracleParameter("NIZ", OracleDbType.Int32); parm.Value = 0; cmd.Parameters.Add(parm); ///:11 + parm = new OracleParameter("AnfangZStand", OracleDbType.Double); parm.Value = mtr.VolumeStart; cmd.Parameters.Add(parm); ///:12 + parm = new OracleParameter("EndZStand", OracleDbType.Double); parm.Value = mtr.VolumeEnd; cmd.Parameters.Add(parm); ///:13 + /// KorrErrQok bool true = Q2 within limits, 'passed' in case of Q1, Q3, Q4 + parm = new OracleParameter("KorrErrQ", OracleDbType.Double); parm.Value = Math.Min(100.0, Math.Max(-100.0, mtr.KorrErrQ)); cmd.Parameters.Add(parm); ///:14 + /// KorrErrQ double 'Q2 error before correction' when correction done or 'Q2 error' when correction not done + /// = q2.WaterMeter.Q2CorrectionDone ? q2.WaterMeter.Q2ErrWOCorrection.ToString(Program.AltCulture) : q2.Error.ToString(Program.AltCulture))); + /// KorrQWz double + parm = new OracleParameter("TIZ", OracleDbType.Double); parm.Value = Math.Min(100000, mtr.TestTime); cmd.Parameters.Add(parm); ///:15 + /// Vol_WZ_US + /// TempMittel_US + + int retv = cmd.ExecuteNonQuery(); + log.DebugFormat("VT_PRUEFREIHE_IST_PD inserted, PcbNr={0}, pruefungsNr={1}, error={2}", mtr.WaterMeter.SerialNr, pruefungsNr, mtr.Error); + return retv; + } +#endif + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusOracle/DatabaseCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusOracle/DatabaseCfg.cs new file mode 100644 index 00000000..06db2c04 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusOracle/DatabaseCfg.cs @@ -0,0 +1,90 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DB.SensusOracle +{ + public enum DBUsed + { + None, + Production, + Test, + Quality, + Count + } + + public enum Separator + { + None, + Space, + Tabulator, + Comma, + Semicolon, + Count + } + + public class DatabaseCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(DatabaseCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new DatabaseCfgCtrl(); } + + + public int TestBenchId; + public DBUsed DBUsed; + public int Baujahr; /// Written to the database + public string DestinationPath; /// Directory path into which the results will be saved + public string LogFolderPath; /// Directory path into which the results will be saved + public bool YearFolders; + public bool MonthFolders; + public bool DayFolders; + public Separator Separator; + public bool EliminateSpaces; + + + /// Private parameterless constructor invoked by all other (public) constructors + DatabaseCfg() + { + Name = "Sensus-Oracle-DB"; + ParentName = string.Empty; + TestBenchId = 1; + DBUsed = DBUsed.Test; + Baujahr = 2015; + DestinationPath = Program.HomeDir + "Results\\"; + LogFolderPath = Program.HomeDir + "Logs\\"; + YearFolders = true; + MonthFolders = true; + DayFolders = false; + Separator = Separator.None; + EliminateSpaces = false; + } + + public DatabaseCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, BenchId={1}, DBUsed={2}, Baujahr={3}, Results={4}, Logs={5}, Y={6}, M={7}, D={8}, Elim.spaces={9}, Separator={10}", + Name, + TestBenchId, + DBUsed, + Baujahr, + DestinationPath, + LogFolderPath, + YearFolders, + MonthFolders, + DayFolders, + EliminateSpaces, + Separator); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusOracle/DatabaseCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusOracle/DatabaseCfgCtrl.cs new file mode 100644 index 00000000..77c87f66 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusOracle/DatabaseCfgCtrl.cs @@ -0,0 +1,208 @@ +using Config.Entities; +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DB.SensusOracle +{ + public partial class DatabaseCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + DatabaseCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as DatabaseCfg; + Redraw(); + } + } + + public DatabaseCfgCtrl() + { + InitializeComponent(); + } + + private void WriterCfgCtrl_Load(object sender, EventArgs e) + { + for (int i = 0; i < (int)DBUsed.Count; i++) + { + dbUsedComboBox.Items.Add(((DBUsed)i).ToString()); + } + for (int i = 0; i < (int)Separator.Count; i++) + { + separatorComboBox.Items.Add(((Separator)i).ToString()); + } + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + benchIdTextBox.Text = config.TestBenchId.ToString(); + dbUsedComboBox.Text = config.DBUsed.ToString(); + baujahrTextBox.Text = config.Baujahr.ToString(); + destinationTextBox.Text = config.DestinationPath; + logsFolderTextBox.Text = config.LogFolderPath; + yearFoldersCheckBox.Checked = config.YearFolders; + monthFoldersCheckBox.Checked = config.MonthFolders; + dayFoldersCheckBox.Checked = config.DayFolders; + separatorComboBox.Text = config.Separator.ToString(); + eliminateSpacesCheckBox.Checked = config.EliminateSpaces; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + benchIdTextBox.Enabled = true; + dbUsedComboBox.Enabled = true; + baujahrTextBox.Enabled = true; + destinationTextBox.Enabled = true; + destinationButton.Enabled = true; + logsFolderTextBox.Enabled = true; + logsFolderButton.Enabled = true; + yearFoldersCheckBox.Enabled = true; + monthFoldersCheckBox.Enabled = true; + dayFoldersCheckBox.Enabled = true; + separatorComboBox.Enabled = true; + eliminateSpacesCheckBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int tmp; + if (!int.TryParse(benchIdTextBox.Text, out tmp) || tmp <= 0) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Test bench ID'"; + } + + if (!int.TryParse(baujahrTextBox.Text, out tmp) || tmp < 2015 || tmp > 2099) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Bujahr'"; + } + + if (!dbUsedComboBox.Items.Contains(dbUsedComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Database used' item"; + } + + if (!separatorComboBox.Items.Contains(separatorComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid separator"; + } + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.None; /// <------------------- !!! + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + if (config.Name != nameTextBox.Text) + { + config.Name = nameTextBox.Text; + flags = CfgUpdateFlags.RestartRqrd; + } + + int benchId = int.Parse(benchIdTextBox.Text); + if (config.TestBenchId != benchId) + { + config.TestBenchId = benchId; + flags = CfgUpdateFlags.RestartRqrd; + } + + int baujahr = int.Parse(baujahrTextBox.Text); + if (config.Baujahr != baujahr) + { + config.Baujahr = baujahr; + flags = CfgUpdateFlags.RestartRqrd; + } + + for (int i = 0; i < (int)DBUsed.Count; i++) + { + if (((DBUsed)i).ToString().Equals(dbUsedComboBox.Text) && (config.DBUsed != (DBUsed)i)) + { + config.DBUsed = (DBUsed)i; + flags = CfgUpdateFlags.RestartRqrd; + break; + } + } + + if (config.DestinationPath != destinationTextBox.Text) + { + config.DestinationPath = destinationTextBox.Text; + if (!config.DestinationPath.EndsWith("\\")) config.DestinationPath += "\\"; + flags = CfgUpdateFlags.RestartRqrd; + } + + if (config.LogFolderPath != logsFolderTextBox.Text) + { + config.LogFolderPath = logsFolderTextBox.Text; + if (!config.LogFolderPath.EndsWith("\\")) config.LogFolderPath += "\\"; + flags = CfgUpdateFlags.RestartRqrd; + } + + if (yearFoldersCheckBox.Checked != config.YearFolders) + { + config.YearFolders = yearFoldersCheckBox.Checked; + flags = CfgUpdateFlags.RestartRqrd; + } + if (monthFoldersCheckBox.Checked != config.MonthFolders) + { + config.MonthFolders = monthFoldersCheckBox.Checked; + flags = CfgUpdateFlags.RestartRqrd; + } + if (dayFoldersCheckBox.Checked != config.DayFolders) + { + config.DayFolders = dayFoldersCheckBox.Checked; + flags = CfgUpdateFlags.RestartRqrd; + } + + for (int i = 0; i < (int)Separator.Count; i++) + { + if (((Separator)i).ToString().Equals(separatorComboBox.Text) && (config.Separator != (Separator)i)) + { + config.Separator = (Separator)i; + flags = CfgUpdateFlags.RestartRqrd; + break; + } + } + + if (eliminateSpacesCheckBox.Checked != config.EliminateSpaces) + { + config.EliminateSpaces = eliminateSpacesCheckBox.Checked; + flags = CfgUpdateFlags.RestartRqrd; + } + + return flags; + } + + private void destinationButton_Click(object sender, EventArgs e) + { + + } + + private void logsFolderButton_Click(object sender, EventArgs e) + { + + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusOracle/DatabaseCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusOracle/DatabaseCfgCtrl.designer.cs new file mode 100644 index 00000000..74c429bc --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusOracle/DatabaseCfgCtrl.designer.cs @@ -0,0 +1,311 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// Author: Milan Hanajík +/// +namespace TBF.BenchControl.DB.SensusOracle +{ + partial class DatabaseCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.destinationTextBox = new System.Windows.Forms.TextBox(); + this.destinationLabel = new System.Windows.Forms.Label(); + this.dayFoldersCheckBox = new System.Windows.Forms.CheckBox(); + this.destinationButton = new System.Windows.Forms.Button(); + this.yearFoldersCheckBox = new System.Windows.Forms.CheckBox(); + this.monthFoldersCheckBox = new System.Windows.Forms.CheckBox(); + this.eliminateSpacesCheckBox = new System.Windows.Forms.CheckBox(); + this.separatorLabel = new System.Windows.Forms.Label(); + this.separatorComboBox = new System.Windows.Forms.ComboBox(); + this.benchIdTextBox = new System.Windows.Forms.TextBox(); + this.benchIdLabel = new System.Windows.Forms.Label(); + this.dbUsedComboBox = new System.Windows.Forms.ComboBox(); + this.dbUsedLabel = new System.Windows.Forms.Label(); + this.baujahrTextBox = new System.Windows.Forms.TextBox(); + this.baujahrLabel = new System.Windows.Forms.Label(); + this.logsFolderButton = new System.Windows.Forms.Button(); + this.logsFolderTextBox = new System.Windows.Forms.TextBox(); + this.logsFolderLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(110, 30); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(146, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(19, 33); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(107, 8); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // destinationTextBox + // + this.destinationTextBox.Enabled = false; + this.destinationTextBox.Location = new System.Drawing.Point(110, 117); + this.destinationTextBox.Name = "destinationTextBox"; + this.destinationTextBox.Size = new System.Drawing.Size(145, 20); + this.destinationTextBox.TabIndex = 10; + // + // destinationLabel + // + this.destinationLabel.AutoSize = true; + this.destinationLabel.Location = new System.Drawing.Point(19, 120); + this.destinationLabel.Name = "destinationLabel"; + this.destinationLabel.Size = new System.Drawing.Size(71, 13); + this.destinationLabel.TabIndex = 9; + this.destinationLabel.Text = "Results folder"; + // + // dayFoldersCheckBox + // + this.dayFoldersCheckBox.AutoSize = true; + this.dayFoldersCheckBox.Enabled = false; + this.dayFoldersCheckBox.Location = new System.Drawing.Point(207, 166); + this.dayFoldersCheckBox.Name = "dayFoldersCheckBox"; + this.dayFoldersCheckBox.Size = new System.Drawing.Size(79, 17); + this.dayFoldersCheckBox.TabIndex = 17; + this.dayFoldersCheckBox.Text = "Day folders"; + this.dayFoldersCheckBox.UseVisualStyleBackColor = true; + // + // destinationButton + // + this.destinationButton.Enabled = false; + this.destinationButton.Location = new System.Drawing.Point(261, 117); + this.destinationButton.Name = "destinationButton"; + this.destinationButton.Size = new System.Drawing.Size(30, 20); + this.destinationButton.TabIndex = 11; + this.destinationButton.Text = "..."; + this.destinationButton.UseVisualStyleBackColor = true; + this.destinationButton.Click += new System.EventHandler(this.destinationButton_Click); + // + // yearFoldersCheckBox + // + this.yearFoldersCheckBox.AutoSize = true; + this.yearFoldersCheckBox.Enabled = false; + this.yearFoldersCheckBox.Location = new System.Drawing.Point(23, 166); + this.yearFoldersCheckBox.Name = "yearFoldersCheckBox"; + this.yearFoldersCheckBox.Size = new System.Drawing.Size(82, 17); + this.yearFoldersCheckBox.TabIndex = 15; + this.yearFoldersCheckBox.Text = "Year folders"; + this.yearFoldersCheckBox.UseVisualStyleBackColor = true; + // + // monthFoldersCheckBox + // + this.monthFoldersCheckBox.AutoSize = true; + this.monthFoldersCheckBox.Enabled = false; + this.monthFoldersCheckBox.Location = new System.Drawing.Point(111, 166); + this.monthFoldersCheckBox.Name = "monthFoldersCheckBox"; + this.monthFoldersCheckBox.Size = new System.Drawing.Size(90, 17); + this.monthFoldersCheckBox.TabIndex = 16; + this.monthFoldersCheckBox.Text = "Month folders"; + this.monthFoldersCheckBox.UseVisualStyleBackColor = true; + // + // eliminateSpacesCheckBox + // + this.eliminateSpacesCheckBox.AutoSize = true; + this.eliminateSpacesCheckBox.Enabled = false; + this.eliminateSpacesCheckBox.Location = new System.Drawing.Point(111, 208); + this.eliminateSpacesCheckBox.Name = "eliminateSpacesCheckBox"; + this.eliminateSpacesCheckBox.Size = new System.Drawing.Size(165, 17); + this.eliminateSpacesCheckBox.TabIndex = 20; + this.eliminateSpacesCheckBox.Text = "Eliminate spaces in each field"; + this.eliminateSpacesCheckBox.UseVisualStyleBackColor = true; + // + // separatorLabel + // + this.separatorLabel.AutoSize = true; + this.separatorLabel.Location = new System.Drawing.Point(19, 188); + this.separatorLabel.Name = "separatorLabel"; + this.separatorLabel.Size = new System.Drawing.Size(53, 13); + this.separatorLabel.TabIndex = 18; + this.separatorLabel.Text = "Separator"; + // + // separatorComboBox + // + this.separatorComboBox.Enabled = false; + this.separatorComboBox.FormattingEnabled = true; + this.separatorComboBox.Location = new System.Drawing.Point(110, 185); + this.separatorComboBox.Name = "separatorComboBox"; + this.separatorComboBox.Size = new System.Drawing.Size(146, 21); + this.separatorComboBox.TabIndex = 19; + // + // benchIdTextBox + // + this.benchIdTextBox.Enabled = false; + this.benchIdTextBox.Location = new System.Drawing.Point(110, 51); + this.benchIdTextBox.Name = "benchIdTextBox"; + this.benchIdTextBox.Size = new System.Drawing.Size(57, 20); + this.benchIdTextBox.TabIndex = 4; + // + // benchIdLabel + // + this.benchIdLabel.AutoSize = true; + this.benchIdLabel.Location = new System.Drawing.Point(19, 54); + this.benchIdLabel.Name = "benchIdLabel"; + this.benchIdLabel.Size = new System.Drawing.Size(76, 13); + this.benchIdLabel.TabIndex = 3; + this.benchIdLabel.Text = "Test Bench ID"; + // + // dbUsedComboBox + // + this.dbUsedComboBox.Enabled = false; + this.dbUsedComboBox.FormattingEnabled = true; + this.dbUsedComboBox.Location = new System.Drawing.Point(110, 73); + this.dbUsedComboBox.Name = "dbUsedComboBox"; + this.dbUsedComboBox.Size = new System.Drawing.Size(145, 21); + this.dbUsedComboBox.TabIndex = 6; + // + // dbUsedLabel + // + this.dbUsedLabel.AutoSize = true; + this.dbUsedLabel.Location = new System.Drawing.Point(19, 76); + this.dbUsedLabel.Name = "dbUsedLabel"; + this.dbUsedLabel.Size = new System.Drawing.Size(79, 13); + this.dbUsedLabel.TabIndex = 5; + this.dbUsedLabel.Text = "Database used"; + // + // baujahrTextBox + // + this.baujahrTextBox.Enabled = false; + this.baujahrTextBox.Location = new System.Drawing.Point(110, 95); + this.baujahrTextBox.Name = "baujahrTextBox"; + this.baujahrTextBox.Size = new System.Drawing.Size(57, 20); + this.baujahrTextBox.TabIndex = 8; + // + // baujahrLabel + // + this.baujahrLabel.AutoSize = true; + this.baujahrLabel.Location = new System.Drawing.Point(19, 98); + this.baujahrLabel.Name = "baujahrLabel"; + this.baujahrLabel.Size = new System.Drawing.Size(43, 13); + this.baujahrLabel.TabIndex = 7; + this.baujahrLabel.Text = "Baujahr"; + // + // logsFolderButton + // + this.logsFolderButton.Enabled = false; + this.logsFolderButton.Location = new System.Drawing.Point(261, 139); + this.logsFolderButton.Name = "logsFolderButton"; + this.logsFolderButton.Size = new System.Drawing.Size(30, 20); + this.logsFolderButton.TabIndex = 14; + this.logsFolderButton.Text = "..."; + this.logsFolderButton.UseVisualStyleBackColor = true; + this.logsFolderButton.Click += new System.EventHandler(this.logsFolderButton_Click); + // + // logsFolderTextBox + // + this.logsFolderTextBox.Enabled = false; + this.logsFolderTextBox.Location = new System.Drawing.Point(110, 139); + this.logsFolderTextBox.Name = "logsFolderTextBox"; + this.logsFolderTextBox.Size = new System.Drawing.Size(145, 20); + this.logsFolderTextBox.TabIndex = 13; + // + // logsFolderLabel + // + this.logsFolderLabel.AutoSize = true; + this.logsFolderLabel.Location = new System.Drawing.Point(19, 142); + this.logsFolderLabel.Name = "logsFolderLabel"; + this.logsFolderLabel.Size = new System.Drawing.Size(59, 13); + this.logsFolderLabel.TabIndex = 12; + this.logsFolderLabel.Text = "Logs folder"; + // + // DatabaseCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.logsFolderButton); + this.Controls.Add(this.logsFolderTextBox); + this.Controls.Add(this.logsFolderLabel); + this.Controls.Add(this.baujahrTextBox); + this.Controls.Add(this.baujahrLabel); + this.Controls.Add(this.dbUsedComboBox); + this.Controls.Add(this.dbUsedLabel); + this.Controls.Add(this.benchIdTextBox); + this.Controls.Add(this.benchIdLabel); + this.Controls.Add(this.separatorComboBox); + this.Controls.Add(this.separatorLabel); + this.Controls.Add(this.eliminateSpacesCheckBox); + this.Controls.Add(this.monthFoldersCheckBox); + this.Controls.Add(this.yearFoldersCheckBox); + this.Controls.Add(this.destinationButton); + this.Controls.Add(this.dayFoldersCheckBox); + this.Controls.Add(this.destinationTextBox); + this.Controls.Add(this.destinationLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "DatabaseCfgCtrl"; + this.Size = new System.Drawing.Size(300, 230); + this.Load += new System.EventHandler(this.WriterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.TextBox destinationTextBox; + private System.Windows.Forms.Label destinationLabel; + private System.Windows.Forms.CheckBox dayFoldersCheckBox; + private System.Windows.Forms.Button destinationButton; + private System.Windows.Forms.CheckBox yearFoldersCheckBox; + private System.Windows.Forms.CheckBox monthFoldersCheckBox; + private System.Windows.Forms.CheckBox eliminateSpacesCheckBox; + private System.Windows.Forms.Label separatorLabel; + private System.Windows.Forms.ComboBox separatorComboBox; + private System.Windows.Forms.TextBox benchIdTextBox; + private System.Windows.Forms.Label benchIdLabel; + private System.Windows.Forms.ComboBox dbUsedComboBox; + private System.Windows.Forms.Label dbUsedLabel; + private System.Windows.Forms.TextBox baujahrTextBox; + private System.Windows.Forms.Label baujahrLabel; + private System.Windows.Forms.Button logsFolderButton; + private System.Windows.Forms.TextBox logsFolderTextBox; + private System.Windows.Forms.Label logsFolderLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusOracle/DatabaseCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusOracle/DatabaseCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusOracle/DatabaseCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusOracle/DatabaseFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusOracle/DatabaseFactory.cs new file mode 100644 index 00000000..42fd856a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusOracle/DatabaseFactory.cs @@ -0,0 +1,27 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// Author: Milan Hanajík +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DB.SensusOracle +{ + public class DatabaseFactory : IComponentFactory + { + public string ClassName { get { return "Sensus-Oracle-Database"; } } + + public void ResetStaticProperties() { Database.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Database(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Database(cfg); } + + public IComponentCfg DefaultConfig() { return new DatabaseCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(DatabaseCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusSql/Database.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusSql/Database.cs new file mode 100644 index 00000000..917eea3a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusSql/Database.cs @@ -0,0 +1,570 @@ +using Config; +using Config.Entities; +using log4net; +using Results.Entities; +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using Xylem.Common.Metrology.Measurements; + +namespace TBF.BenchControl.DB.SensusLa +{ + public enum Retv + { + OK, + Error, + } + + public class Database : ComponentBase, IOperation, GenericDevices.IResultsWriter, Generic.IDevice + { + private static readonly ILog log = LogManager.GetLogger(typeof(Database)); + public override string ToString() { return string.Format("Sensus-La-Database({0})", Cfg.ToString(1)); } + + private enum CurrentOp + { + None, + CreateBatchNr, + WriteResults, + FinishBatch + + } + + private CurrentOp currentOp; + + public static Dictionary> DetailtResults { get; private set; } + + private bool opCompleted; + private bool anyError; + private String connectionString; /// ms database connection + + + + public static DatabaseCfg DBCfg; + private static SqlDataAccess connection; + + + + /// + /// Results to print + /// + private Results.Entities.Batch batch; + + public Database() { } + + public Database(Generic.IComponentCfg cfg) + : base(cfg) + { + DBCfg = cfg as DatabaseCfg; + + currentOp = CurrentOp.None; + + log.Debug(this.ToString()); + } + + public void Initialize() + { + switch (DBCfg.DBUsed) + { + case DBUsed.Production: + connectionString = "Data Source=SLASQL01;Database=Auftrag;User Id=PrgPruefstation;Password=PrgPruefstation;"; + break; + case DBUsed.Test: + connectionString = "Data Source=SLASQL01;Database=Testreplikation;User Id=PrgPruefstation;Password=PrgPruefstation;"; + break; + default: + connectionString = null; + break; + } + + connection = new SqlDataAccess(connectionString); + + if (DBCfg.DebugLevel == DebugMode.Simulate) + { + return; + } + } + + public void RunDeviceBefore() { } + public void RunDeviceAfter() { } + + public void StopDevice() + { + connection.Dispose(); + } + + public void StopDevice2() { } + + + + + /// Start this operation + public void Start() + { + opCompleted = false; + anyError = false; + } + + /// Run this operation + /// Event.ResultsWritten or Event.Error + public Event Run() + { + if (currentOp == CurrentOp.WriteResults) + { + if (!opCompleted) + { + if (DBCfg.DebugLevel != DebugMode.Simulate && connection != null) + { + if (BatchRslts != null && TestResults != null) + { + if (SaveBatchData() == Retv.Error) + { + anyError = true; + } + } + + } + + opCompleted = true; + } + + if (anyError) + { + return Event.ResultsNotWritten; + } + else + { + return Event.ResultsWritten; + } + } + else + { + return Event.None; + } + } + + /// Stop this operation + public void Stop() + { + currentOp = CurrentOp.None; + } + + private static Results.Entities.TestRslt TestResults; + private static Results.BatchResults BatchRslts; + public IOperation WriteResultsOp(Results.Entities.TestRslt testResults, Results.BatchResults batchRslts, Dictionary> detailtResults) + { + if (currentOp != CurrentOp.None) + { + throw new Exception("Sequence error"); + } + else + { + TestResults = testResults; + BatchRslts = batchRslts; + currentOp = CurrentOp.WriteResults; + DetailtResults = detailtResults; + } + return this; + } + + /// + /// Save common batch data + /// + /// Batch + private static Retv SaveBatchData() + { + var ret = Retv.OK; + try + { + Results.Entities.Batch Batch = TestResults.Batch; + + var PruefgangNr = GetOrCreatePruefgangNr(Batch.BatchNr, TestResults.RepetitionNr); + var sb = new StringBuilder(); + + + //DBCfg.TesterId + sb = new StringBuilder(); + sb.AppendLine("if not EXISTS(select PruefgangNr from [dbo].[Pruefgang] where PruefgangNr = " + PruefgangNr + " and [PruefstationNr] = " + DBCfg.TestBenchId + ")"); + sb.AppendLine("begin"); + sb.AppendLine(" insert into[dbo].[Pruefgang]"); + sb.AppendLine(" ([PruefgangNr] "); + sb.AppendLine(" ,[PruefstationNr] "); + sb.AppendLine(" ,[PrueferNr] "); + sb.AppendLine(" ,[PruefgangLang] "); + sb.AppendLine(" ,[Datum] "); + sb.AppendLine(" ,[Einbaulage_alt] "); + sb.AppendLine(" ,[Anzahl] "); + sb.AppendLine(" ,[KalibrierID] "); + sb.AppendLine(" ,[Metrolog] "); + sb.AppendLine(" ,[FPP] "); + sb.AppendLine(" ,[Korrigiert] "); + sb.AppendLine(" ,[Typzusatz] "); + sb.AppendLine(" ,[Baulaenge] "); + sb.AppendLine(" ,[Vorlauftemperatur] "); + sb.AppendLine(" ) "); + sb.AppendLine(" values "); + sb.AppendLine(" ( "); + sb.Append(PruefgangNr.ToString()).AppendLine(","); + sb.Append(DBCfg.TestBenchId.ToString()).AppendLine(","); + sb.Append(DBCfg.TesterId.ToString()).AppendLine(","); + sb.AppendLine(" 0, "); + sb.AppendLine(" CURRENT_TIMESTAMP, "); + sb.AppendLine(" NULL, "); + sb.AppendLine(" 0, "); + sb.AppendLine(" 0, "); + sb.AppendLine(" NULL, "); + sb.AppendLine(" NULL, "); + sb.AppendLine(" 0, "); + sb.AppendLine(" NULL, "); + sb.AppendLine(" NULL, "); + sb.AppendLine(" " + TestResults.TempUpMean.ToString(CultureInfo.InvariantCulture) + " ) "); + sb.AppendLine("end "); + + connection.ExecuteQuery(sb.ToString()); + + sb = new StringBuilder(); + sb.AppendLine("select [Anzahl] from [dbo].[Pruefgang] where PruefgangNr = ").Append(PruefgangNr.ToString()).Append(" and PruefstationNr = ").Append(DBCfg.TestBenchId.ToString()); ; + + + var Pruefgang = connection.ExecuteQuery(sb.ToString()); + var CurrentAnzahl = 0; + if (Pruefgang.Rows.Count >= 1) + { + int.TryParse(Pruefgang.Rows[0]["Anzahl"].ToString(), out CurrentAnzahl); + } + + if (CurrentAnzahl < 10) + { + CurrentAnzahl = CurrentAnzahl + 1; + var time = (int)TestResults.TestTime; + var sollQ = ((TestResults.Qto() + TestResults.Qfrom()) / 2); + + sb = new StringBuilder(); + sb.AppendLine(" update [dbo].[Pruefgang] "); + sb.AppendLine(" set "); + + sb.Append(" [Anzahl] = ").AppendLine(CurrentAnzahl.ToString()); + sb.Append(" , [PP" + CurrentAnzahl + "_Zeit] = ").AppendLine(time.ToString()); + sb.Append(" , [PP" + CurrentAnzahl + "_Soll] = ").AppendLine(sollQ.ToString(CultureInfo.InvariantCulture)); + sb.Append(" , [PP" + CurrentAnzahl + "_Ist] = ").AppendLine(TestResults.FlowMean.ToString(CultureInfo.InvariantCulture)); + sb.AppendLine(" , [PP" + CurrentAnzahl + "_RefZSerienNr] = 0"); + sb.Append(" , [PP" + CurrentAnzahl + "_RefFehl] = ").AppendLine(TestResults.ErrorMaster.ToString(CultureInfo.InvariantCulture)); + sb.Append(" , [PP" + CurrentAnzahl + "_Ist_V] = ").AppendLine(TestResults.FlowVolume.CompareTo(double.NaN) == 0 ? "0" : TestResults.FlowVolume.ToString(CultureInfo.InvariantCulture)); + sb.AppendLine(" , [PP" + CurrentAnzahl + "_Waage] = 0"); + sb.Append(" , [PP" + CurrentAnzahl + "_Info] = 'T'"); + sb.Append(" , [PP" + CurrentAnzahl + "_T_Start] = ").AppendLine(TestResults.TempUpStart.ToString(CultureInfo.InvariantCulture)); + sb.Append(" , [PP" + CurrentAnzahl + "_T_Ende] = ").AppendLine(TestResults.TempUpEnd.ToString(CultureInfo.InvariantCulture)); + sb.AppendLine(" where ").Append(" PruefgangNr = ").Append(PruefgangNr.ToString()).Append(" and PruefstationNr = ").Append(DBCfg.TestBenchId.ToString()); + + connection.ExecuteQuery(sb.ToString()); + + foreach (var item in BatchRslts.WaterMeters) + { + var meterResults = item.GetMeterTestRslt(TestResults.Name(), Config.Entities.CompoundMeterId.Single); + + if (meterResults != null && meterResults.TestDone) + { + // + + try + { + if (item.SerialNr.StartsWith("7518") || item.SerialNr.StartsWith("7519") || item.SerialNr.StartsWith("7520") || item.SerialNr.StartsWith("7521") || item.Remark.ToLower().Contains("zulassung") || TestResults.Remark.ToLower().Contains("zulassung")) + { + sb = new StringBuilder(); + var sollQA = ((TestResults.Qto() + TestResults.Qfrom()) / 2); + + var Actualflowrate = TestResults.FlowVolume; ; // Volume Ref / test time + var InitialSupplyPressure = (TestResults.PressUpStart + TestResults.PressDownStart) / 2; + var WaterTemp = (TestResults.TempUpMean + TestResults.TempDownMean) / 2; + var Indicatedvolume = meterResults.VolumeMeter;//VolumeRefMeter + var Actualvolume = meterResults.VolumeRef;// item.GetMeterTestRslt().FlowVolume(); + var MeterError = meterResults.Error; + var LuftTemp = TestResults.AmbTempMean; + var Luftfeuchte = TestResults.AmbHumiMean; + var Luftfdruck = TestResults.AmbPressMean * 1000; + //Bei Luft- feuchte, temp und druck nehmen ich immer den Mean für den Prüfpunkt + + sb.AppendLine("INSERT INTO [dbo].[Zulassungspruefdaten] "); + sb.AppendLine("([Seriennr] "); + sb.AppendLine(",[Pruefgangnr] "); + sb.AppendLine(",[Solldurchfluss] "); + sb.AppendLine(",[Actualflowrate] "); + sb.AppendLine(",[InitialSupplyPressure] "); + sb.AppendLine(",[WaterTemp] "); + sb.AppendLine(",[Indicatedvolume] "); + sb.AppendLine(",[Actualvolume] "); + sb.AppendLine(",[MeterError] "); + sb.AppendLine(",[AnlageDatum] "); + sb.AppendLine(",[LuftTemp] "); + sb.AppendLine(",[Luftfeuchte] "); + sb.AppendLine(",[Luftdruck] "); + sb.AppendLine(",[PruefartWaage] "); + sb.AppendLine(",[Bemerkung]) "); + sb.AppendLine("VALUES ( "); + sb.Append(item.SerialNr).AppendLine(","); + sb.Append(PruefgangNr).AppendLine(","); + sb.Append(sollQA.ToString(CultureInfo.InvariantCulture)).AppendLine(","); + sb.Append(Actualflowrate.ToString(CultureInfo.InvariantCulture)).AppendLine(","); + sb.Append(InitialSupplyPressure.ToString(CultureInfo.InvariantCulture)).AppendLine(","); + sb.Append(WaterTemp.ToString(CultureInfo.InvariantCulture)).AppendLine(","); + sb.Append(Indicatedvolume.ToString(CultureInfo.InvariantCulture)).AppendLine(","); + sb.Append(Actualvolume.ToString(CultureInfo.InvariantCulture)).AppendLine(","); + sb.Append(MeterError.ToString(CultureInfo.InvariantCulture)).AppendLine(","); + sb.Append("CURRENT_TIMESTAMP").AppendLine(","); + sb.Append(LuftTemp.ToString(CultureInfo.InvariantCulture)).AppendLine(","); + sb.Append(Luftfeuchte.ToString(CultureInfo.InvariantCulture)).AppendLine(","); + sb.Append(Luftfdruck.ToString(CultureInfo.InvariantCulture)).AppendLine(","); + sb.Append("1").AppendLine(","); + sb.Append("'").Append(item.Remark).Append("'"); + sb.Append(") "); + + connection.ExecuteQuery(sb.ToString()); + + } + } + catch (Exception) + { + + } + + + sb = new StringBuilder(); + sb.AppendLine("if not EXISTS(select PruefgangNr from [dbo].[Prueffehler] where PruefgangNr = " + PruefgangNr + " and SerienNr= " + item.SerialNr.ToString() + ")"); + sb.AppendLine("begin"); + sb.AppendLine(" insert into [dbo].[Prueffehler]"); + sb.AppendLine(" ([PruefgangNr] "); + sb.AppendLine(" ,[SerienNr] "); + sb.AppendLine(" ,[Info]) "); + sb.AppendLine(" values "); + sb.AppendLine(" ( "); + sb.AppendLine(PruefgangNr.ToString()).Append(","); + sb.AppendLine(item.SerialNr.ToString()).Append(",'"); + if (item.Remark == null) + { + sb.AppendLine("'"); + } + else + { + sb.AppendLine(item.Remark.ToString()).Append("'"); + } + + sb.AppendLine(" )"); + sb.AppendLine("end "); + + connection.ExecuteQuery(sb.ToString()); + sb = new StringBuilder(); + sb.AppendLine("update [dbo].[Prueffehler] "); + sb.AppendLine(" set "); + sb.Append(" [PP" + CurrentAnzahl + "_Fehler] = ").AppendLine(meterResults.Error.CompareTo(double.NaN) == 0 ? "0" : meterResults.Error.ToString(CultureInfo.InvariantCulture)); + sb.AppendLine(" ,[PruefDatum] = CURRENT_TIMESTAMP"); + sb.AppendLine(" where "); + sb.Append(" PruefgangNr = ").AppendLine(PruefgangNr.ToString()); + sb.Append(" and SerienNr = ").AppendLine(item.SerialNr.ToString()); + + connection.ExecuteQuery(sb.ToString()); + CheckAndCreateAuftragPos(item.SerialNr, Program.LocalSettings.PurchaseOrderHistory[0], PruefgangNr, item.WMPosition, DBCfg.TesterId); + try + { + if (DetailtResults != null && DetailtResults.ContainsKey(item.SerialNr)) + { + + var listofDetailtResultsForMeter = new List(); + DetailtResults.TryGetValue(item.SerialNr, out listofDetailtResultsForMeter); + + foreach (var detailChannelResult in listofDetailtResultsForMeter.Where(w => w.Channel != 0)) + { + + + sb = new StringBuilder(); + sb.AppendLine("if not EXISTS(select PruefgangNr from [dbo].[PrueffehlerGenesisPfade] where PruefgangNr = " + PruefgangNr + " and SerienNr= " + item.SerialNr.ToString() + "and Pfad="+ detailChannelResult.Channel.ToString() + " )"); + sb.AppendLine("begin"); + sb.AppendLine(" insert into [dbo].[PrueffehlerGenesisPfade]"); + sb.AppendLine(" ([PruefgangNr] "); + sb.AppendLine(" ,[SerienNr] "); + sb.AppendLine(" ,[Pfad]) "); + sb.AppendLine(" values "); + sb.AppendLine(" ( "); + sb.AppendLine(PruefgangNr.ToString()).Append(","); + sb.AppendLine(item.SerialNr.ToString()).Append(","); + sb.AppendLine(detailChannelResult.Channel.ToString()); + sb.AppendLine(" )"); + sb.AppendLine("end "); + + connection.ExecuteQuery(sb.ToString()); + + var calError = detailChannelResult.DeviationDutToRefPer.HasValue ? detailChannelResult.DeviationDutToRefPer.Value : 0; + var calErrorDutVolumeCm = Formulas.ErrorFromVolumes(detailChannelResult.DutVolumeCm * 1000, meterResults.VolumeRef); + var calErrorCorrectedDutVolumeCm = Formulas.ErrorFromVolumes(detailChannelResult.CorrectedDutVolumeCm *1000, meterResults.VolumeRef); + + log.Error("Srn="+ item.SerialNr.ToString() + "C="+ detailChannelResult.Channel.ToString() + "calError = " + calError); + log.Error("Srn="+ item.SerialNr.ToString() + "C="+ detailChannelResult.Channel.ToString() + "calErrorDutVolumeCm = " + calErrorDutVolumeCm); + log.Error("Srn="+ item.SerialNr.ToString() + "C="+ detailChannelResult.Channel.ToString() + "calErrorCorrectedDutVolumeCm = " + calErrorCorrectedDutVolumeCm); + + + sb = new StringBuilder(); + sb.AppendLine("update [dbo].[PrueffehlerGenesisPfade] "); + sb.AppendLine(" set "); + sb.Append(" [PP" + CurrentAnzahl + "_Fehler] = ") + .AppendLine(calErrorCorrectedDutVolumeCm.CompareTo(double.NaN) == 0 ? "0" : calErrorCorrectedDutVolumeCm.ToString(CultureInfo.InvariantCulture)); + sb.AppendLine(" where "); + sb.Append(" PruefgangNr = ").AppendLine(PruefgangNr.ToString()); + sb.Append(" and SerienNr = ").AppendLine(item.SerialNr.ToString()); + sb.Append(" and Pfad = ").AppendLine(detailChannelResult.Channel.ToString()); + + + connection.ExecuteQuery(sb.ToString()); + } + DetailtResults.Remove(item.SerialNr); + } + } + catch (Exception ex) + { + //ignor + log.Error(ex); + } + + } + } + + + + } + } + catch (Exception EX) + { + ret = Retv.Error; + log.Error(EX); + } + + + TestResults = null; + BatchRslts = null; + + + return ret; + + } + + private static void CheckAndCreateAuftragPos(string SerienNr, string AuftragNr, int PruefgangNr, int Einbauplatz, int AnlageMitarbeiterNr) + { + var sb = new StringBuilder(); + + + sb.AppendLine("declare @SerienNr int"); + sb.AppendLine("declare @AuftragNr int"); + sb.AppendLine("declare @PruefgangNr int"); + sb.AppendLine("declare @Einbauplatz int"); + sb.AppendLine("declare @Wiederholung int"); + sb.AppendLine("declare @PositionNr int"); + sb.AppendLine("declare @AnlageMitarbeiterNr int"); + sb.AppendLine(""); + + sb.AppendLine("set @SerienNr = " + SerienNr); + //sb.AppendLine("set @AuftragNr = " + AuftragNr); + sb.AppendLine("set @PruefgangNr =" + PruefgangNr); + sb.AppendLine("set @Einbauplatz = " + Einbauplatz); + sb.AppendLine("set @AnlageMitarbeiterNr = " + AnlageMitarbeiterNr); + + sb.AppendLine(""); + sb.AppendLine("SELECT top 1 @PositionNr = [PositionNr], @AuftragNr = [AuftragNr]"); + sb.AppendLine(" FROM [Auftrag].[dbo].[AuftragPosition_Gesamt]"); + sb.AppendLine(" where @SerienNr between [SerienNrVon] and [SerienNrBis]"); + //sb.AppendLine(" and AuftragNr = @AuftragNr"); + sb.AppendLine(""); + sb.AppendLine("select @Wiederholung = MAx(Wiederholungen) from [dbo].[AuftragPositionSerienNr] where [SerienNr] = @SerienNr"); + sb.AppendLine(""); + sb.AppendLine("if not EXISTS(select PruefgangNr from [dbo].[AuftragPositionSerienNr] where PruefgangNr = @PruefgangNr and AuftragNr = @AuftragNr and[SerienNr] = @SerienNr)"); + sb.AppendLine("begin"); + sb.AppendLine("INSERT INTO [dbo].[AuftragPositionSerienNr]"); + sb.AppendLine(" ([SerienNr]"); + sb.AppendLine(" ,[Pruefgangnr]"); + sb.AppendLine(" ,[AuftragNr]"); + sb.AppendLine(" ,[PositionNr]"); + sb.AppendLine(" ,[PruefgangDatum]"); + sb.AppendLine(" ,[Wiederholungen]"); + sb.AppendLine(" ,[Einbauplatz]"); + sb.AppendLine(" ,[Bemerkung]"); + sb.AppendLine(" ,[gesichertDatum]"); + sb.AppendLine(" ,[AnlageDatum]"); + sb.AppendLine(" ,[AnlageMitarbeiterNr]"); + sb.AppendLine(" ,[AenderungDatum]"); + sb.AppendLine(" ,[AenderungMitarbeiterNr]"); + sb.AppendLine(" ,[StatusFertigung]"); + sb.AppendLine(" ,[Metrolog]"); + sb.AppendLine(" ,[FabNr]"); + sb.AppendLine(" ,[StatusFlag]"); + sb.AppendLine(" ,[KundeneigeneSerienNr]"); + sb.AppendLine(" ,[Einbaulage]"); + sb.AppendLine(" ,[NichtFuerTrefferquote]"); + sb.AppendLine(" ,[Garantieschein])"); + sb.AppendLine(" VALUES"); + sb.AppendLine(" (@SerienNr"); + sb.AppendLine(" , @PruefgangNr"); + sb.AppendLine(" , @AuftragNr"); + sb.AppendLine(" , @PositionNr"); + sb.AppendLine(" , CURRENT_TIMESTAMP"); + sb.AppendLine(" , @Wiederholung"); + sb.AppendLine(" , @Einbauplatz"); + sb.AppendLine(" ,'Testet by TBF'"); + sb.AppendLine(" , CURRENT_TIMESTAMP"); + sb.AppendLine(" , CURRENT_TIMESTAMP"); + sb.AppendLine(" , @AnlageMitarbeiterNr"); + sb.AppendLine(" , CURRENT_TIMESTAMP"); + sb.AppendLine(" , @AnlageMitarbeiterNr"); + sb.AppendLine(" ,22"); + sb.AppendLine(" ,'Cordonel'"); + sb.AppendLine(" ,null"); + sb.AppendLine(" ,0"); + sb.AppendLine(" , @SerienNr"); + sb.AppendLine(" ,null"); + sb.AppendLine(" ,0"); + sb.AppendLine(" ,0)"); + sb.AppendLine("end"); + + connection.ExecuteQuery(sb.ToString()); + + } + + private static int GetOrCreatePruefgangNr(int BatchNR, int Repetition) + { + var sb = new StringBuilder(); + sb.AppendLine("declare @batchNR as Int"); + sb.AppendLine("declare @PruefStationNr as Int"); + sb.AppendLine("declare @PruefgangNr as Int;"); + sb.AppendLine("declare @Repetition as Int;"); + + + + sb.Append("set @Repetition =").AppendLine(Repetition.ToString()); + sb.Append("set @batchNR = ").AppendLine(BatchNR.ToString()); + sb.Append("set @PruefStationNr = ").AppendLine(DBCfg.TestBenchId.ToString()); + sb.Append("set @PruefgangNr = (@PruefStationNr * 1000000) + (@batchNR * 100) + @Repetition;"); + + sb.AppendLine("if not EXISTS(select TbfBatchPruefgang_PruefgangNr from [dbo].[TbfBatchPruefgang] where TbfBatchPruefgang_PruefgangNr = @PruefgangNr)"); + sb.AppendLine("begin"); + sb.AppendLine("insert into [dbo].[TbfBatchPruefgang]"); + sb.AppendLine("select @batchNR, @PruefgangNr,@Repetition, @PruefStationNr"); + sb.AppendLine("end"); + + sb.AppendLine("select @PruefgangNr as [Result]"); + int ret = 0; + var result = connection.ExecuteQuery(sb.ToString()); + if (result.Rows.Count >= 1) + { + int.TryParse(result.Rows[0]["Result"].ToString(), out ret); + } + + return ret; + + } + + public IOperation WriteResultsOp(Batch batchResults) + { + return this; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusSql/DatabaseCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusSql/DatabaseCfg.cs new file mode 100644 index 00000000..2395e821 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusSql/DatabaseCfg.cs @@ -0,0 +1,63 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DB.SensusLa +{ + public enum DBUsed + { + None, + Production, + Test + } + + + public class DatabaseCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(DatabaseCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new DatabaseCfgCtrl(); } + + + public int TestBenchId; + public DBUsed DBUsed; + public int Baujahr; + + public int TesterId; + + /// Written to the database + + + /// Private parameterless constructor invoked by all other (public) constructors + DatabaseCfg() + { + Name = "Sensus-Oracle-DB"; + ParentName = string.Empty; + TestBenchId = 2022; + DBUsed = DBUsed.Test; + Baujahr = 2015; + } + + public DatabaseCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, BenchId={1}, DBUsed={2}, Baujahr={3}", + Name, + TestBenchId, + DBUsed, + Baujahr + ); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusSql/DatabaseCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusSql/DatabaseCfgCtrl.cs new file mode 100644 index 00000000..790ad3b9 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusSql/DatabaseCfgCtrl.cs @@ -0,0 +1,152 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// Author: Milan Hanajík +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using log4net; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DB.SensusLa +{ + public partial class DatabaseCfgCtrl : UserControl, IComponentCfgCtrl + { + static readonly ILog log = LogManager.GetLogger(typeof(DatabaseCfgCtrl)); + + public bool ShowMore { get { return false; } } + + DatabaseCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as DatabaseCfg; + Redraw(); + } + } + + public DatabaseCfgCtrl() + { + InitializeComponent(); + } + + private void WriterCfgCtrl_Load(object sender, EventArgs e) + { + for (int i = 0; i < 3; i++) + { + dbUsedComboBox.Items.Add(((DBUsed)i).ToString()); + } + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + benchIdTextBox.Text = config.TestBenchId.ToString(); + testerIdTextBox.Text = config.TesterId.ToString(); + dbUsedComboBox.Text = config.DBUsed.ToString(); + + } + + public void Unlock() + { + nameTextBox.Enabled = true; + benchIdTextBox.Enabled = true; + dbUsedComboBox.Enabled = true; + benchIdTextBox.Enabled = true; + + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int tmp; + if (!int.TryParse(benchIdTextBox.Text, out tmp) || tmp <= 0) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Test bench ID'"; + } + + + + if (!dbUsedComboBox.Items.Contains(dbUsedComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Database used' item"; + } + + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.None; /// <------------------- !!! + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + if (config.Name != nameTextBox.Text) + { + config.Name = nameTextBox.Text; + flags = CfgUpdateFlags.RestartRqrd; + } + + int benchId = int.Parse(benchIdTextBox.Text); + if (config.TestBenchId != benchId) + { + config.TestBenchId = benchId; + flags = CfgUpdateFlags.RestartRqrd; + } + + int testerId = int.Parse(testerIdTextBox.Text); + if (config.TesterId != testerId) + { + config.TesterId = testerId; + flags = CfgUpdateFlags.RestartRqrd; + } + + + + for (int i = 0; i < 3; i++) + { + if (((DBUsed)i).ToString().Equals(dbUsedComboBox.Text) && (config.DBUsed != (DBUsed)i)) + { + config.DBUsed = (DBUsed)i; + flags = CfgUpdateFlags.RestartRqrd; + break; + } + } + + return flags; + } + + private void destinationButton_Click(object sender, EventArgs e) + { + + } + + private void logsFolderButton_Click(object sender, EventArgs e) + { + + } + + CfgUpdateFlags IComponentCfgCtrl.VerifyCfg(ref string message) + { + throw new NotImplementedException(); + } + + CfgUpdateFlags IComponentCfgCtrl.UpdateCfg() + { + throw new NotImplementedException(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusSql/DatabaseCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusSql/DatabaseCfgCtrl.designer.cs new file mode 100644 index 00000000..b0c3e68a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusSql/DatabaseCfgCtrl.designer.cs @@ -0,0 +1,157 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// Author: Milan Hanajík +/// +namespace TBF.BenchControl.DB.SensusLa +{ + partial class DatabaseCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.benchIdTextBox = new System.Windows.Forms.TextBox(); + this.benchIdLabel = new System.Windows.Forms.Label(); + this.dbUsedComboBox = new System.Windows.Forms.ComboBox(); + this.dbUsedLabel = new System.Windows.Forms.Label(); + this.testerIdTextBox = new System.Windows.Forms.TextBox(); + this.TestIdLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(110, 30); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(146, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(19, 33); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(107, 8); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // benchIdTextBox + // + this.benchIdTextBox.Enabled = false; + this.benchIdTextBox.Location = new System.Drawing.Point(110, 51); + this.benchIdTextBox.Name = "benchIdTextBox"; + this.benchIdTextBox.Size = new System.Drawing.Size(57, 20); + this.benchIdTextBox.TabIndex = 4; + // + // benchIdLabel + // + this.benchIdLabel.AutoSize = true; + this.benchIdLabel.Location = new System.Drawing.Point(19, 54); + this.benchIdLabel.Name = "benchIdLabel"; + this.benchIdLabel.Size = new System.Drawing.Size(76, 13); + this.benchIdLabel.TabIndex = 3; + this.benchIdLabel.Text = "Test Bench ID"; + // + // dbUsedComboBox + // + this.dbUsedComboBox.Enabled = false; + this.dbUsedComboBox.FormattingEnabled = true; + this.dbUsedComboBox.Location = new System.Drawing.Point(110, 97); + this.dbUsedComboBox.Name = "dbUsedComboBox"; + this.dbUsedComboBox.Size = new System.Drawing.Size(145, 21); + this.dbUsedComboBox.TabIndex = 6; + // + // dbUsedLabel + // + this.dbUsedLabel.AutoSize = true; + this.dbUsedLabel.Location = new System.Drawing.Point(19, 100); + this.dbUsedLabel.Name = "dbUsedLabel"; + this.dbUsedLabel.Size = new System.Drawing.Size(79, 13); + this.dbUsedLabel.TabIndex = 5; + this.dbUsedLabel.Text = "Database used"; + // + // testerIdTextBox + // + this.testerIdTextBox.Enabled = false; + this.testerIdTextBox.Location = new System.Drawing.Point(110, 74); + this.testerIdTextBox.Name = "testerIdTextBox"; + this.testerIdTextBox.Size = new System.Drawing.Size(57, 20); + this.testerIdTextBox.TabIndex = 8; + // + // TestIdLabel + // + this.TestIdLabel.AutoSize = true; + this.TestIdLabel.Location = new System.Drawing.Point(19, 77); + this.TestIdLabel.Name = "TestIdLabel"; + this.TestIdLabel.Size = new System.Drawing.Size(51, 13); + this.TestIdLabel.TabIndex = 7; + this.TestIdLabel.Text = "Tester ID"; + // + // DatabaseCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.testerIdTextBox); + this.Controls.Add(this.TestIdLabel); + this.Controls.Add(this.dbUsedComboBox); + this.Controls.Add(this.dbUsedLabel); + this.Controls.Add(this.benchIdTextBox); + this.Controls.Add(this.benchIdLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "DatabaseCfgCtrl"; + this.Size = new System.Drawing.Size(300, 173); + this.Load += new System.EventHandler(this.WriterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.TextBox benchIdTextBox; + private System.Windows.Forms.Label benchIdLabel; + private System.Windows.Forms.ComboBox dbUsedComboBox; + private System.Windows.Forms.Label dbUsedLabel; + private System.Windows.Forms.TextBox testerIdTextBox; + private System.Windows.Forms.Label TestIdLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusSql/DatabaseCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusSql/DatabaseCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusSql/DatabaseCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusSql/DatabaseFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusSql/DatabaseFactory.cs new file mode 100644 index 00000000..ad5a0943 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusSql/DatabaseFactory.cs @@ -0,0 +1,27 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// Author: Milan Hanajík +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DB.SensusLa +{ + public class DatabaseFactory : IComponentFactory + { + public string ClassName { get { return "Sensus-La-Database"; } } + + public void ResetStaticProperties() { Database.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Database(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Database(cfg); } + + public IComponentCfg DefaultConfig() { return new DatabaseCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(DatabaseCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusSql/SqlDataAccess.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusSql/SqlDataAccess.cs new file mode 100644 index 00000000..cfc96ecd --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DB/SensusSql/SqlDataAccess.cs @@ -0,0 +1,243 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; + +namespace TBF.BenchControl.DB.SensusLa +{ + public class SqlDataAccess + { + private string _connectionString = ""; + + public SqlDataAccess(string connectionString) + { + _connectionString = connectionString; + + } + + private SqlConnection _con; + + /// + /// Creating a database connection if there is none. + /// + /// Working with a global connection variable to make sure the connection would be closed at the end of working with it. + private void CreateConnection() + { + if (_con == null) + { + _con = new SqlConnection(_connectionString); + + } + if (_con != null && _con.State == ConnectionState.Closed) + { + _con.Open(); + } + } + + public DataTable ExecuteQuery(string sqlStatement) + { + DataTable ret; + SqlConnection connection = null; + SqlDataReader reader = null; + + try + { + connection = new SqlConnection(_connectionString); + if (connection.State != ConnectionState.Open) + { + connection.Open(); + } + var cmd = connection.CreateCommand(); + cmd.CommandText = sqlStatement; + reader = cmd.ExecuteReader(); + var entries = new object[reader.FieldCount]; + ret = new DataTable(); + + var jcount = 0; + try + { + while (reader.Read()) + { + if (jcount == 0) + { + for (var i = 0; i < reader.FieldCount; i++) + { + var headline = reader.GetName(i); + ret.Columns.Add(headline, Type.GetType("System.Object")); + + } + } + for (var i = 0; i < reader.FieldCount; i++) + { + entries[i] = reader[i]; + } + jcount++; + ret.Rows.Add(entries); + } + } + catch (Exception ex) + { + throw (new Exception(ex.Message, ex)); + } + } + catch (Exception ex) + { + throw (new Exception(ex.Message, ex)); + } + finally + { + try + { + if (reader != null) + { + try + { + reader.Dispose(); + } + catch { } + } + if (connection != null && connection.State == ConnectionState.Open) + { + connection.Close(); + } + } + catch (Exception ex) { throw (new Exception("Unhandled exception within finally: " + ex.Message)); } + } + return ret; + } + /// + /// Executing Stored Procedure + /// + /// The Name of Stored Procedure + /// Parameter names and values + /// Result Set + + + /// + /// Closing and disposing the connection. + /// + private void CloseConnection() + { + if (_con != null) + { + if (_con.State != ConnectionState.Closed) + { + _con.Close(); + } + _con.Dispose(); + } + } + + /// + /// Generating a list of comma seperated parameters by a given string array. + /// + /// array to work on + /// comma seperated string with parameters. + private string GenerateParameter(string[] parameter) + { + var list = new StringBuilder(); + var ret = ""; + var first = true; + + foreach (var param in parameter) + { + if (list.ToString().Length > 0) + { + list.Append(","); + } + + var result = param; + var content = param; + const string mitpat = @"(?:^@\w[\w_\s]*=[\s]*(?:'(.*)'$|(.*)$)|^(?:'(.*)'$|(.*)$))"; + const string numbpat = @"^[+-]?(?:\d+\.?|,?\d*|\d*(\.?|,?)\d+)[\r\n]*$"; + + if (!first || !result.Contains(",")) + { + first = false; + + var mtch = Regex.Match(content, mitpat); + if (mtch.Groups[1].Success) + { + var orig = mtch.Groups[1].Value; + var mch = Regex.Replace(orig, "[']+", "'"); + mch = Regex.Replace(mch, "[']+", "''"); + + result = !String.IsNullOrEmpty(mch) ? content.Replace(orig, mch) : content; + } + else if (mtch.Groups[2].Success) + { + var orig = mtch.Groups[2].Value; + var mch = Regex.Replace(orig, "[']+", "'"); + mch = Regex.Replace(mch, "[']+", "''"); + + if (!String.IsNullOrEmpty(mch)) + { + if (Regex.IsMatch(mch, numbpat) || mch.ToLower() == "null") + { + result = content; + } + else + { + result = content.Replace(orig, "'" + mch + "'"); + } + } + else + { + result = content; + } + } + else if (mtch.Groups[3].Success) + { + var orig = mtch.Groups[3].Value; + var mch = Regex.Replace(orig, "[']+", "'"); + mch = Regex.Replace(mch, "[']+", "''"); + + result = !String.IsNullOrEmpty(mch) ? content.Replace(orig, mch) : content; + } + else if (mtch.Groups[4].Success) + { + var orig = mtch.Groups[4].Value; + var mch = Regex.Replace(orig, "[']+", "'"); + mch = Regex.Replace(mch, "[']+", "''"); + + if (!String.IsNullOrEmpty(mch)) + { + if (Regex.IsMatch(mch, numbpat) || mch.ToLower() == "null") + { + result = content; + } + else + { + result = content.Replace(orig, "'" + mch + "'"); + } + } + else + { + result = content; + } + } + } + + list.Append(result); + } + if (list.ToString().Length > 0) + { + ret = " " + list; + } + + return ret; + } + public string GetConnectionString() + { + return _connectionString; + } + public void Dispose() + { + CloseConnection(); + GC.SuppressFinalize(this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Danfoss/VLT2800/Pump.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Danfoss/VLT2800/Pump.cs new file mode 100644 index 00000000..1d1d662b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Danfoss/VLT2800/Pump.cs @@ -0,0 +1,370 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO.Ports; +using System.Text; +using log4net; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Boxes; +using Dirichlet.Numerics; + +namespace TBF.BenchControl.Danfoss.VLT2800 +{ + /// + /// See page 20 of MG10S202 Operational Instructions Modbus RTU + /// + public enum CW : ushort + { + PresetRefLsb = (1 << 0), + PresetRefMsb = (1 << 1), + Not_DcBraking = (1 << 2), + Not_CoastingStop = (1 << 3), + Not_QuickStop = (1 << 4), + Not_FreezeFreq = (1 << 5), + Start_NotRampStop = (1 << 6), + Reset = (1 << 7), + Jog = (1 << 8), + Ramp2_NotRamp1 = (1 << 9), + DataValid = (1 << 10), + Relay01Activ = (1 << 11), + DOut46Activ = (1 << 12), + SelectSetupLsb = (1 << 13), + SelectSetupMsb = (1 << 14), + Reversing = (1 << 15), + } + + /// + /// See page 22 of MG10S202 Operational Instructions Modbus RTU + /// + public enum SW : ushort + { + ControlReady = (1 << 0), + DriveReady = (1 << 1), + CoastingStop = (1 << 2), + Trip = (1 << 3), + TripLock = (1 << 6), + Warning = (1 << 7), + SpeedEqRef = (1 << 8), + RemoteCtrl = (1 << 9), + FreqLimitOK = (1 << 10), + MotorRunning = (1 << 11), + VoltageWarn = (1 << 13), + CurrentLimit = (1 << 14), + ThermalWarn = (1 << 15), + } + + public enum Function : byte + { + ReadCoilStatus = 0x01, + ForceSingleCoil = 0x05, + ForceMultipleCoils = 0x0F, + ReadHoldingRegisters = 0x03, + PresetSingleRegister = 0x06, + PresetMultipleRegisters = 0x10, + } + + + public class Pump : ComponentBase, IDevice, IOperation, GenericDevices.IPumpFM, GenericDevices.IValve + { + private static readonly ILog log = LogManager.GetLogger(typeof(Pump)); + public override string ToString() { return string.Format("Pump-Danfoss-VLT2800({0})", Cfg.ToString(1)); } + + private readonly PumpCfg pumpCfg; + + public int Delay { get { return pumpCfg.Delay; } } + public ValveCategory Category { get { return ValveCategory.Feeding; } } /// Pump category is Feeding + public GenericDevices.IValve CoupledTo { get { return null; } } + public bool InvertCouple { get { return false; } } + public int LagOpening { get { return 0; } } + public int LagClosing { get { return 0; } } + + /// + /// Pump power in [%] in range 0 .. 100.0f + /// + private float power; + public float Power + { + get { return power; } + } + + + readonly Elde.ControlBoardDev controlBoard; + readonly int bitPosition; /// 0 .. 63 + + public readonly UInt128 Mask; /// derived from bitPosition in the constructor + + public bool State + { + get { return (controlBoard.Route & Mask) != 0; } + } + + /// Private fields + SerialPort serialPort; + bool dataToSendReady; + byte[] dataToSend; + StringBuilder responseBuilder; + + + public Pump() + { + } + + /// + /// Ambient temperature / humidity / pressure meter 'Greco' connected via serial interface (RS232) + /// Connection settings: 19200 Bd 8-bits No-parity 1-stop-bit Flow control: none or hardware. + /// + public Pump(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + pumpCfg = cfg as PumpCfg; + + controlBoard = (Elde.ControlBoardDev)TbfComponents.FindComponent("CB", components); /// TODO: replace "CB" + if (controlBoard == null) throw new Exception("Cannot find " + Name + " parent"); + + bitPosition = pumpCfg.BitPosition; + Mask = (((UInt128)1) << bitPosition); + Mask |= (((UInt128)1) << (bitPosition + 1)); + + log.Debug(this.ToString()); + } + + public void Initialize() + { + if (pumpCfg.DebugLevel == DebugMode.Simulate) + { + return; + } + + string comPortName = "COM" + pumpCfg.ComPortNr.ToString(); + serialPort = new SerialPort(comPortName, pumpCfg.BaudRate, pumpCfg.Parity, pumpCfg.DataBits, pumpCfg.StopBits); + serialPort.Handshake = Handshake.None; + serialPort.Open(); + responseBuilder = new StringBuilder(40); + + log.FatalFormat("Successfully initialized device {0}", ToString()); + } + + /// Run this device + public void RunDeviceBefore() + { + if (pumpCfg.DebugLevel == DebugMode.Simulate) return; + + responseBuilder.Append(serialPort.ReadExisting()); + + /// Check if the response is complete + if (responseBuilder.Length >= 8) + { + string response = responseBuilder.ToString(); + responseBuilder.Clear(); + + log.Info(Telegram.LogTelegram("Received ", response)); + } + } + + /// + /// Prepares data to be sent in RunDeviceAfter() function + /// + bool SendData(byte[] data) + { + if (dataToSendReady) return false; + dataToSend = data; + dataToSendReady = true; + + log.Info(Telegram.LogTelegram("Sending ", data)); + + return true; + } + + /// Run this device + public void RunDeviceAfter() + { + if (dataToSendReady) + { + if (pumpCfg.DebugLevel != DebugMode.Simulate) + { + serialPort.Write(dataToSend, 0, dataToSend.Length); + } + dataToSendReady = false; + } + } + + /// Stop this device + public void StopDevice() + { + if (serialPort != null) serialPort.Close(); + } + + public void StopDevice2() { } + + + /// + /// Turn the pmp on using Modbus commad, use the variable frequency + /// + /// Frequency in percent (-200.0 .. 200.0) + public void TurnOn(float powerArg) + { + log.DebugFormat("{0}.TurnOn({1})", Name, powerArg); + + this.power = powerArg; + + //UInt16 controlWord = 0x047C; + UInt16 controlWord = (UInt16)(CW.Not_DcBraking | + CW.Not_CoastingStop | + CW.Not_QuickStop | + CW.Not_FreezeFreq | + CW.Start_NotRampStop | + CW.DataValid); + + UInt16 serialComReference = (UInt16)(Int16)((float)0x4000 * powerArg / 100.0f + 0.5f); + + byte[] msg; + if (pumpCfg.Protocol == PumpProtocol.Modbus) + { + msg = new byte[13]; + msg[0] = (byte)pumpCfg.BusAddress; + msg[1] = (byte)Function.ForceMultipleCoils; + msg[2] = 0; /// Data Hi + msg[3] = 0; /// Data Lo + msg[4] = 0; /// Nr. of coils Hi + msg[5] = 0x20; /// Nr. of coils Lo + msg[6] = 4; /// Byte count + msg[7] = (byte)(controlWord & 0xFF); /// Control Word Lo + msg[8] = (byte)(controlWord >> 8); /// Control Word Hi + msg[9] = (byte)(serialComReference & 0xFF); /// Serial Com Reference Lo + msg[10] = (byte)(serialComReference >> 8); /// Serial Com Reference Hi + Telegram.UpdateTelegramCRC(msg); + } + else /// if (pumpCfg.Protocol == PumpProtocol.FC) + { + msg = new byte[8]; + msg[0] = 0x02; /// STX + msg[1] = 6; /// lenght (6 bytes following this one) + msg[2] = (byte)pumpCfg.BusAddress; + msg[3] = (byte)(controlWord >> 8); /// Control Word Hi + msg[4] = (byte)(controlWord & 0xFF); /// Control Word Lo + msg[5] = (byte)(serialComReference >> 8); /// Serial Com Reference Hi + msg[6] = (byte)(serialComReference & 0xFF); /// Serial Com Reference Lo + Telegram.UpdateTelegramChecksum(msg); + } + SendData(msg); + } + + + /// + /// Turn the pmp off using Modbus command + /// + public void TurnOff() + { + log.DebugFormat("{0}.TurnOff()", Name); + + this.power = 0; + + UInt16 controlWord = (UInt16)(CW.Not_DcBraking | + CW.Not_CoastingStop | + CW.Not_QuickStop | + CW.Not_FreezeFreq | + //CW.Start_NotRampStop | + CW.DataValid); + + UInt16 serialComReference = 0; + + byte[] msg; + if (pumpCfg.Protocol == PumpProtocol.Modbus) + { + msg = new byte[13]; + msg[0] = (byte)pumpCfg.BusAddress; + msg[1] = (byte)Function.ForceMultipleCoils; + msg[2] = 0; /// Data Hi + msg[3] = 0; /// Data Lo + msg[4] = 0; /// Nr. of coils Hi + msg[5] = 0x20; /// Nr. of coils Lo + msg[6] = 4; /// Byte count + msg[7] = (byte)(controlWord & 0xFF); /// Control Word Lo + msg[8] = (byte)(controlWord >> 8); /// Control Word Hi + msg[9] = (byte)(serialComReference & 0xFF); /// Serial Com Reference Lo + msg[10] = (byte)(serialComReference >> 8); /// Serial Com Reference Hi + Telegram.UpdateTelegramCRC(msg); + } + else /// if (pumpCfg.Protocol == PumpProtocol.FC) + { + msg = new byte[8]; + msg[0] = 0x02; /// STX + msg[1] = 6; /// lenght (6 bytes following this one) + msg[2] = (byte)pumpCfg.BusAddress; + msg[3] = (byte)(controlWord >> 8); /// Control Word Hi + msg[4] = (byte)(controlWord & 0xFF); /// Control Word Lo + msg[5] = (byte)(serialComReference >> 8); /// Serial Com Reference Hi + msg[6] = (byte)(serialComReference & 0xFF); /// Serial Com Reference Lo + Telegram.UpdateTelegramChecksum(msg); + } + SendData(msg); + } + + + /// + /// The currently running operation. + /// + public enum CurrentOp + { + None, + TurnOn, + TurnOff, + } + /// + CurrentOp currentOp; + + float powerForOp; + + /// + /// Turn the pump frequency inverter on. + /// + public IOperation TurnOnOp(float powerArg) + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.TurnOn; + powerForOp = powerArg; + return this; + } + + /// + /// Turn the pump frequency inverter on. + /// + public IOperation TurnOffOp() + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.TurnOff; + return this; + } + + /// Start the operation + public void Start() + { + switch (currentOp) + { + case CurrentOp.TurnOn: + TurnOn(powerForOp); + return; + case CurrentOp.TurnOff: + default: + TurnOff(); + return; + } + } + + /// Run the operation + public Event Run() + { + return Event.TurnPumpOnOffDone; + } + + /// Stop the operation + public void Stop() + { + currentOp = CurrentOp.None; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Danfoss/VLT2800/PumpCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Danfoss/VLT2800/PumpCfg.cs new file mode 100644 index 00000000..553a3ff1 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Danfoss/VLT2800/PumpCfg.cs @@ -0,0 +1,61 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.IO; +using System.Collections.Generic; +using System.IO.Ports; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Danfoss.VLT2800 +{ + public class PumpCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(PumpCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new PumpCfgCtrl(); } + + /// + /// Serialized parameters + /// + public int Delay; // Delay of the pump function in [s] (affects the duration of transition sequence steps) + public PumpProtocol Protocol; // Modbus or FC with Siemens address + public int BitPosition; + public int BusAddress; // Modbus or FC address in range 1..247 (Modbus) or 1..31 (FC with Siemens address) + public int ComPortNr; + public int BaudRate; + public Parity Parity; + public int DataBits; + public StopBits StopBits; + + /// Private parameterless constructor invoked by all other (public) constructors + PumpCfg() + { + Name = "Pump-Danfoss"; + ParentName = string.Empty; + Delay = 1; + ComPortNr = 3; + + /// Default protocol settings (the same as Danfoss VLT2800 factory settings) + Protocol = PumpProtocol.FC; + BusAddress = 1; + BaudRate = 9600; + DataBits = 8; + Parity = System.IO.Ports.Parity.Even; /// 'Parity.None' is the default value for Protocol = PumpProtocol.Modbus + StopBits = System.IO.Ports.StopBits.One; + } + + public PumpCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Delay={1}s, Protocol={2}, BusAddress={3}, Com{4}, {5}Bd, {6}-bits, parity={7}, stopBits={8}", + Name, Delay, Protocol, BusAddress, ComPortNr, BaudRate, DataBits, Parity, StopBits); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Danfoss/VLT2800/PumpCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Danfoss/VLT2800/PumpCfgCtrl.cs new file mode 100644 index 00000000..70043558 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Danfoss/VLT2800/PumpCfgCtrl.cs @@ -0,0 +1,201 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using System.IO.Ports; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Danfoss.VLT2800 +{ + public partial class PumpCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + PumpCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as PumpCfg; + Redraw(); + } + } + + public PumpCfgCtrl() + { + InitializeComponent(); + + protocolComboBox.Items.Add(PumpProtocol.Modbus.ToString()); + protocolComboBox.Items.Add(PumpProtocol.FC.ToString()); + + parityComboBox.Items.Add(Parity.None.ToString()); + parityComboBox.Items.Add(Parity.Even.ToString()); + parityComboBox.Items.Add(Parity.Odd.ToString()); + + stopBitsComboBox.Items.Add(StopBits.None.ToString()); + stopBitsComboBox.Items.Add(StopBits.One.ToString()); + stopBitsComboBox.Items.Add(StopBits.OnePointFive.ToString()); + stopBitsComboBox.Items.Add(StopBits.Two.ToString()); + } + + int GetParityIx(Parity par) + { + if (par == Parity.None) return 0; + if (par == Parity.Even) return 0; + if (par == Parity.Odd) return 0; + return -1; + } + Parity GetParity(string str) + { + if (str.Equals(Parity.None.ToString())) return Parity.None; + if (str.Equals(Parity.Even.ToString())) return Parity.Even; + if (str.Equals(Parity.Odd.ToString())) return Parity.Odd; + return (Parity)(-1); + } + + int GetStopBitsIx(StopBits sb) + { + if (sb == StopBits.None) return 0; + if (sb == StopBits.One) return 1; + if (sb == StopBits.OnePointFive) return 2; + if (sb == StopBits.Two) return 3; + return -1; + } + StopBits GetStopBits(string str) + { + if (str.Equals(StopBits.None.ToString())) return StopBits.None; + if (str.Equals(StopBits.One.ToString())) return StopBits.One; + if (str.Equals(StopBits.OnePointFive.ToString())) return StopBits.OnePointFive; + if (str.Equals(StopBits.Two.ToString())) return StopBits.Two; + return (StopBits)(-1); + } + + int GetHandshakeIx(Handshake par) + { + if (par == Handshake.None) return 0; + if (par == Handshake.RequestToSend) return 0; + if (par == Handshake.XOnXOff) return 0; + return -1; + } + Handshake GetHandshake(string str) + { + if (str.Equals(Handshake.None.ToString())) return Handshake.None; + if (str.Equals(Handshake.RequestToSend.ToString())) return Handshake.RequestToSend; + if (str.Equals(Handshake.XOnXOff.ToString())) return Handshake.XOnXOff; + return (Handshake)(-1); + } + + private void AbbientCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + delayTextBox.Text = config.Delay.ToString(); + bitPositionTextBox.Text = config.BitPosition.ToString(); + protocolComboBox.Text = config.Protocol.ToString(); + busAddressTextBox.Text = config.BusAddress.ToString(); + comPortNrTextBox.Text = config.ComPortNr.ToString(); + baudRateTextBox.Text = config.BaudRate.ToString(); + parityComboBox.Text = config.Parity.ToString(); + dataBitsTextBox.Text = config.DataBits.ToString(); + stopBitsComboBox.Text = config.StopBits.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + delayTextBox.Enabled = true; + bitPositionTextBox.Enabled = true; + protocolComboBox.Enabled = true; + busAddressTextBox.Enabled = true; + comPortNrTextBox.Enabled = true; + baudRateTextBox.Enabled = true; + parityComboBox.Enabled = true; + dataBitsTextBox.Enabled = true; + stopBitsComboBox.Enabled = true; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.Delay = int.Parse(delayTextBox.Text); + config.BitPosition = int.Parse(bitPositionTextBox.Text); + config.Protocol = protocolComboBox.Text.Equals(PumpProtocol.Modbus.ToString()) ? PumpProtocol.Modbus : PumpProtocol.FC; + config.BusAddress = int.Parse(busAddressTextBox.Text); + config.ComPortNr = int.Parse(comPortNrTextBox.Text); + config.BaudRate = int.Parse(baudRateTextBox.Text); + config.Parity = GetParity(parityComboBox.SelectedItem.ToString()); + config.DataBits = int.Parse(dataBitsTextBox.Text); + config.StopBits = GetStopBits(stopBitsComboBox.SelectedItem.ToString()); + + return flags; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!int.TryParse(delayTextBox.Text, out dummy) || dummy < 0 || dummy > 300) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Delay' is not valid"; + } + + if (!int.TryParse(bitPositionTextBox.Text, out dummy) || dummy < 0 || dummy >= 128) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Bit Position' should be between 0 and 127"; + } + + if (!protocolComboBox.Items.Contains(protocolComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Protocol' should Modbus or FC"; + } + + if (!int.TryParse(busAddressTextBox.Text, out dummy) || dummy < 1 || dummy > 247) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Bus Address' should be in range 1..247"; + } + + if (!int.TryParse(comPortNrTextBox.Text, out dummy) || dummy < 1 || dummy > 999) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Serial Port Number' is not valid"; + } + + if (!int.TryParse(baudRateTextBox.Text, out dummy) || dummy < 150 || dummy > 115200) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Baud Rate' is not valid"; + } + + if (!int.TryParse(dataBitsTextBox.Text, out dummy) || dummy < 7 || dummy > 8) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Data Bits' is not valid"; + } + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Danfoss/VLT2800/PumpCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Danfoss/VLT2800/PumpCfgCtrl.designer.cs new file mode 100644 index 00000000..ebe5797f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Danfoss/VLT2800/PumpCfgCtrl.designer.cs @@ -0,0 +1,298 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.Danfoss.VLT2800 +{ + partial class PumpCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.comPortNrTextBox = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.baudRateLabel = new System.Windows.Forms.Label(); + this.baudRateTextBox = new System.Windows.Forms.TextBox(); + this.partityLabel = new System.Windows.Forms.Label(); + this.dataBitsLabel = new System.Windows.Forms.Label(); + this.dataBitsTextBox = new System.Windows.Forms.TextBox(); + this.stopBitsLabel = new System.Windows.Forms.Label(); + this.busAddressLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.parityComboBox = new System.Windows.Forms.ComboBox(); + this.stopBitsComboBox = new System.Windows.Forms.ComboBox(); + this.busAddressTextBox = new System.Windows.Forms.TextBox(); + this.delayTextBox = new System.Windows.Forms.TextBox(); + this.delayLabel = new System.Windows.Forms.Label(); + this.protocolLabel = new System.Windows.Forms.Label(); + this.protocolComboBox = new System.Windows.Forms.ComboBox(); + this.bitPositionTextBox = new System.Windows.Forms.TextBox(); + this.bitPositionLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // comPortNrTextBox + // + this.comPortNrTextBox.Enabled = false; + this.comPortNrTextBox.Location = new System.Drawing.Point(140, 129); + this.comPortNrTextBox.Name = "comPortNrTextBox"; + this.comPortNrTextBox.Size = new System.Drawing.Size(34, 20); + this.comPortNrTextBox.TabIndex = 6; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(29, 132); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(98, 13); + this.label1.TabIndex = 5; + this.label1.Text = "Serial Port Number:"; + // + // baudRateLabel + // + this.baudRateLabel.AutoSize = true; + this.baudRateLabel.Location = new System.Drawing.Point(29, 153); + this.baudRateLabel.Name = "baudRateLabel"; + this.baudRateLabel.Size = new System.Drawing.Size(58, 13); + this.baudRateLabel.TabIndex = 7; + this.baudRateLabel.Text = "Baud Rate"; + // + // baudRateTextBox + // + this.baudRateTextBox.Enabled = false; + this.baudRateTextBox.Location = new System.Drawing.Point(140, 150); + this.baudRateTextBox.Name = "baudRateTextBox"; + this.baudRateTextBox.Size = new System.Drawing.Size(130, 20); + this.baudRateTextBox.TabIndex = 8; + // + // partityLabel + // + this.partityLabel.AutoSize = true; + this.partityLabel.Location = new System.Drawing.Point(29, 174); + this.partityLabel.Name = "partityLabel"; + this.partityLabel.Size = new System.Drawing.Size(33, 13); + this.partityLabel.TabIndex = 9; + this.partityLabel.Text = "Parity"; + // + // dataBitsLabel + // + this.dataBitsLabel.AutoSize = true; + this.dataBitsLabel.Location = new System.Drawing.Point(29, 196); + this.dataBitsLabel.Name = "dataBitsLabel"; + this.dataBitsLabel.Size = new System.Drawing.Size(50, 13); + this.dataBitsLabel.TabIndex = 11; + this.dataBitsLabel.Text = "Data Bits"; + // + // dataBitsTextBox + // + this.dataBitsTextBox.Enabled = false; + this.dataBitsTextBox.Location = new System.Drawing.Point(140, 193); + this.dataBitsTextBox.Name = "dataBitsTextBox"; + this.dataBitsTextBox.Size = new System.Drawing.Size(34, 20); + this.dataBitsTextBox.TabIndex = 12; + // + // stopBitsLabel + // + this.stopBitsLabel.AutoSize = true; + this.stopBitsLabel.Location = new System.Drawing.Point(29, 217); + this.stopBitsLabel.Name = "stopBitsLabel"; + this.stopBitsLabel.Size = new System.Drawing.Size(49, 13); + this.stopBitsLabel.TabIndex = 13; + this.stopBitsLabel.Text = "Stop Bits"; + // + // busAddressLabel + // + this.busAddressLabel.AutoSize = true; + this.busAddressLabel.Location = new System.Drawing.Point(29, 110); + this.busAddressLabel.Name = "busAddressLabel"; + this.busAddressLabel.Size = new System.Drawing.Size(66, 13); + this.busAddressLabel.TabIndex = 3; + this.busAddressLabel.Text = "Bus Address"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(140, 23); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(30, 26); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(137, 5); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // parityComboBox + // + this.parityComboBox.Enabled = false; + this.parityComboBox.FormattingEnabled = true; + this.parityComboBox.Location = new System.Drawing.Point(140, 171); + this.parityComboBox.Name = "parityComboBox"; + this.parityComboBox.Size = new System.Drawing.Size(130, 21); + this.parityComboBox.TabIndex = 10; + // + // stopBitsComboBox + // + this.stopBitsComboBox.Enabled = false; + this.stopBitsComboBox.FormattingEnabled = true; + this.stopBitsComboBox.Location = new System.Drawing.Point(140, 214); + this.stopBitsComboBox.Name = "stopBitsComboBox"; + this.stopBitsComboBox.Size = new System.Drawing.Size(130, 21); + this.stopBitsComboBox.TabIndex = 14; + // + // busAddressTextBox + // + this.busAddressTextBox.Enabled = false; + this.busAddressTextBox.Location = new System.Drawing.Point(140, 108); + this.busAddressTextBox.Name = "busAddressTextBox"; + this.busAddressTextBox.Size = new System.Drawing.Size(34, 20); + this.busAddressTextBox.TabIndex = 4; + // + // delayTextBox + // + this.delayTextBox.Enabled = false; + this.delayTextBox.Location = new System.Drawing.Point(140, 44); + this.delayTextBox.Name = "delayTextBox"; + this.delayTextBox.Size = new System.Drawing.Size(34, 20); + this.delayTextBox.TabIndex = 16; + // + // delayLabel + // + this.delayLabel.AutoSize = true; + this.delayLabel.Location = new System.Drawing.Point(29, 46); + this.delayLabel.Name = "delayLabel"; + this.delayLabel.Size = new System.Drawing.Size(45, 13); + this.delayLabel.TabIndex = 15; + this.delayLabel.Text = "Delay[s]"; + // + // protocolLabel + // + this.protocolLabel.AutoSize = true; + this.protocolLabel.Location = new System.Drawing.Point(29, 89); + this.protocolLabel.Name = "protocolLabel"; + this.protocolLabel.Size = new System.Drawing.Size(46, 13); + this.protocolLabel.TabIndex = 17; + this.protocolLabel.Text = "Protocol"; + // + // protocolComboBox + // + this.protocolComboBox.Enabled = false; + this.protocolComboBox.FormattingEnabled = true; + this.protocolComboBox.Location = new System.Drawing.Point(140, 86); + this.protocolComboBox.Name = "protocolComboBox"; + this.protocolComboBox.Size = new System.Drawing.Size(130, 21); + this.protocolComboBox.TabIndex = 18; + // + // bitPositionTextBox + // + this.bitPositionTextBox.Enabled = false; + this.bitPositionTextBox.Location = new System.Drawing.Point(140, 65); + this.bitPositionTextBox.Name = "bitPositionTextBox"; + this.bitPositionTextBox.Size = new System.Drawing.Size(34, 20); + this.bitPositionTextBox.TabIndex = 20; + // + // bitPositionLabel + // + this.bitPositionLabel.AutoSize = true; + this.bitPositionLabel.Location = new System.Drawing.Point(30, 68); + this.bitPositionLabel.Name = "bitPositionLabel"; + this.bitPositionLabel.Size = new System.Drawing.Size(89, 13); + this.bitPositionLabel.TabIndex = 19; + this.bitPositionLabel.Text = "Valve Bit Position"; + // + // PumpCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.Control; + this.Controls.Add(this.bitPositionTextBox); + this.Controls.Add(this.bitPositionLabel); + this.Controls.Add(this.protocolComboBox); + this.Controls.Add(this.protocolLabel); + this.Controls.Add(this.delayTextBox); + this.Controls.Add(this.delayLabel); + this.Controls.Add(this.busAddressTextBox); + this.Controls.Add(this.stopBitsComboBox); + this.Controls.Add(this.parityComboBox); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Controls.Add(this.busAddressLabel); + this.Controls.Add(this.stopBitsLabel); + this.Controls.Add(this.dataBitsTextBox); + this.Controls.Add(this.dataBitsLabel); + this.Controls.Add(this.partityLabel); + this.Controls.Add(this.baudRateTextBox); + this.Controls.Add(this.baudRateLabel); + this.Controls.Add(this.comPortNrTextBox); + this.Controls.Add(this.label1); + this.Name = "PumpCfgCtrl"; + this.Size = new System.Drawing.Size(300, 240); + this.Load += new System.EventHandler(this.AbbientCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox comPortNrTextBox; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label baudRateLabel; + private System.Windows.Forms.TextBox baudRateTextBox; + private System.Windows.Forms.Label partityLabel; + private System.Windows.Forms.Label dataBitsLabel; + private System.Windows.Forms.TextBox dataBitsTextBox; + private System.Windows.Forms.Label stopBitsLabel; + private System.Windows.Forms.Label busAddressLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.ComboBox parityComboBox; + private System.Windows.Forms.ComboBox stopBitsComboBox; + private System.Windows.Forms.TextBox busAddressTextBox; + private System.Windows.Forms.TextBox delayTextBox; + private System.Windows.Forms.Label delayLabel; + private System.Windows.Forms.Label protocolLabel; + private System.Windows.Forms.ComboBox protocolComboBox; + private System.Windows.Forms.TextBox bitPositionTextBox; + private System.Windows.Forms.Label bitPositionLabel; + + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Danfoss/VLT2800/PumpCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Danfoss/VLT2800/PumpCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Danfoss/VLT2800/PumpCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Danfoss/VLT2800/PumpFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Danfoss/VLT2800/PumpFactory.cs new file mode 100644 index 00000000..14003044 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Danfoss/VLT2800/PumpFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Danfoss.VLT2800 +{ + public class PumpFactory : IComponentFactory + { + public string ClassName { get { return "Pump-Danfoss-VLT2800"; } } + + public void ResetStaticProperties() { Pump.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Pump(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Pump(cfg, components); } + + public IComponentCfg DefaultConfig() { return new PumpCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(PumpCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/CycleBeginningForm.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/CycleBeginningForm.Designer.cs new file mode 100644 index 00000000..2f21da6f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/CycleBeginningForm.Designer.cs @@ -0,0 +1,381 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.Combined +{ + partial class CycleBeginningForm + { + /// + /// 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() + { + this.okButton = new System.Windows.Forms.Button(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.aux1ComboBox = new System.Windows.Forms.ComboBox(); + this.main1ComboBox = new System.Windows.Forms.ComboBox(); + this.checkBox1 = new System.Windows.Forms.CheckBox(); + this.auxSN1Label = new System.Windows.Forms.Label(); + this.mainSN1Label = new System.Windows.Forms.Label(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.aux2ComboBox = new System.Windows.Forms.ComboBox(); + this.main2ComboBox = new System.Windows.Forms.ComboBox(); + this.checkBox2 = new System.Windows.Forms.CheckBox(); + this.auxSN2Label = new System.Windows.Forms.Label(); + this.mainSN2Label = new System.Windows.Forms.Label(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.aux3ComboBox = new System.Windows.Forms.ComboBox(); + this.main3ComboBox = new System.Windows.Forms.ComboBox(); + this.checkBox3 = new System.Windows.Forms.CheckBox(); + this.auxSN3Label = new System.Windows.Forms.Label(); + this.mainSN3Label = new System.Windows.Forms.Label(); + this.clearButton = new System.Windows.Forms.Button(); + this.orderGroupBox = new System.Windows.Forms.GroupBox(); + this.orderComboBox = new System.Windows.Forms.ComboBox(); + this.groupBox1.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.orderGroupBox.SuspendLayout(); + this.SuspendLayout(); + // + // okButton + // + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(589, 33); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(117, 63); + this.okButton.TabIndex = 0; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.aux1ComboBox); + this.groupBox1.Controls.Add(this.main1ComboBox); + this.groupBox1.Controls.Add(this.checkBox1); + this.groupBox1.Controls.Add(this.auxSN1Label); + this.groupBox1.Controls.Add(this.mainSN1Label); + this.groupBox1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox1.ForeColor = System.Drawing.Color.Black; + this.groupBox1.Location = new System.Drawing.Point(28, 118); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(533, 137); + this.groupBox1.TabIndex = 1; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Water Meter 1"; + this.groupBox1.Visible = false; + // + // aux1ComboBox + // + this.aux1ComboBox.FormattingEnabled = true; + this.aux1ComboBox.Location = new System.Drawing.Point(287, 83); + this.aux1ComboBox.Name = "aux1ComboBox"; + this.aux1ComboBox.Size = new System.Drawing.Size(175, 31); + this.aux1ComboBox.TabIndex = 6; + this.aux1ComboBox.Visible = false; + this.aux1ComboBox.SelectedIndexChanged += new System.EventHandler(this.aux1ComboBox_SelectedIndexChanged); + this.aux1ComboBox.TextChanged += new System.EventHandler(this.aux1ComboBox_TextChanged); + this.aux1ComboBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.aux1ComboBox_KeyPress); + // + // main1ComboBox + // + this.main1ComboBox.FormattingEnabled = true; + this.main1ComboBox.Location = new System.Drawing.Point(287, 37); + this.main1ComboBox.Name = "main1ComboBox"; + this.main1ComboBox.Size = new System.Drawing.Size(175, 31); + this.main1ComboBox.TabIndex = 5; + this.main1ComboBox.Visible = false; + this.main1ComboBox.SelectedIndexChanged += new System.EventHandler(this.main1ComboBox_SelectedIndexChanged); + this.main1ComboBox.TextChanged += new System.EventHandler(this.main1ComboBox_TextChanged); + this.main1ComboBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.main1ComboBox_KeyPress); + // + // checkBox1 + // + this.checkBox1.AutoSize = true; + this.checkBox1.Font = new System.Drawing.Font("Verdana", 27.75F); + this.checkBox1.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.checkBox1.Location = new System.Drawing.Point(490, 69); + this.checkBox1.Name = "checkBox1"; + this.checkBox1.Size = new System.Drawing.Size(15, 14); + this.checkBox1.TabIndex = 4; + this.checkBox1.UseVisualStyleBackColor = true; + this.checkBox1.Visible = false; + // + // auxSN1Label + // + this.auxSN1Label.AutoSize = true; + this.auxSN1Label.Location = new System.Drawing.Point(21, 86); + this.auxSN1Label.Name = "auxSN1Label"; + this.auxSN1Label.Size = new System.Drawing.Size(193, 23); + this.auxSN1Label.TabIndex = 2; + this.auxSN1Label.Text = "Aux. WM Serial Nr."; + this.auxSN1Label.Visible = false; + // + // mainSN1Label + // + this.mainSN1Label.AutoSize = true; + this.mainSN1Label.Location = new System.Drawing.Point(21, 40); + this.mainSN1Label.Name = "mainSN1Label"; + this.mainSN1Label.Size = new System.Drawing.Size(195, 23); + this.mainSN1Label.TabIndex = 0; + this.mainSN1Label.Text = "Main WM Serial Nr."; + this.mainSN1Label.Visible = false; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.aux2ComboBox); + this.groupBox2.Controls.Add(this.main2ComboBox); + this.groupBox2.Controls.Add(this.checkBox2); + this.groupBox2.Controls.Add(this.auxSN2Label); + this.groupBox2.Controls.Add(this.mainSN2Label); + this.groupBox2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox2.ForeColor = System.Drawing.Color.Black; + this.groupBox2.Location = new System.Drawing.Point(28, 275); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(533, 137); + this.groupBox2.TabIndex = 2; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Water Meter 2"; + this.groupBox2.Visible = false; + // + // aux2ComboBox + // + this.aux2ComboBox.FormattingEnabled = true; + this.aux2ComboBox.Location = new System.Drawing.Point(287, 83); + this.aux2ComboBox.Name = "aux2ComboBox"; + this.aux2ComboBox.Size = new System.Drawing.Size(175, 31); + this.aux2ComboBox.TabIndex = 10; + this.aux2ComboBox.Visible = false; + this.aux2ComboBox.SelectedIndexChanged += new System.EventHandler(this.aux2ComboBox_SelectedIndexChanged); + this.aux2ComboBox.TextChanged += new System.EventHandler(this.aux2ComboBox_TextChanged); + this.aux2ComboBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.aux2ComboBox_KeyPress); + // + // main2ComboBox + // + this.main2ComboBox.FormattingEnabled = true; + this.main2ComboBox.Location = new System.Drawing.Point(287, 37); + this.main2ComboBox.Name = "main2ComboBox"; + this.main2ComboBox.Size = new System.Drawing.Size(175, 31); + this.main2ComboBox.TabIndex = 9; + this.main2ComboBox.Visible = false; + this.main2ComboBox.SelectedIndexChanged += new System.EventHandler(this.main2ComboBox_SelectedIndexChanged); + this.main2ComboBox.TextChanged += new System.EventHandler(this.main2ComboBox_TextChanged); + this.main2ComboBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.main2ComboBox_KeyPress); + // + // checkBox2 + // + this.checkBox2.AutoSize = true; + this.checkBox2.Font = new System.Drawing.Font("Verdana", 27.75F); + this.checkBox2.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.checkBox2.Location = new System.Drawing.Point(490, 69); + this.checkBox2.Name = "checkBox2"; + this.checkBox2.Size = new System.Drawing.Size(15, 14); + this.checkBox2.TabIndex = 8; + this.checkBox2.UseVisualStyleBackColor = true; + this.checkBox2.Visible = false; + // + // auxSN2Label + // + this.auxSN2Label.AutoSize = true; + this.auxSN2Label.Location = new System.Drawing.Point(21, 86); + this.auxSN2Label.Name = "auxSN2Label"; + this.auxSN2Label.Size = new System.Drawing.Size(193, 23); + this.auxSN2Label.TabIndex = 2; + this.auxSN2Label.Text = "Aux. WM Serial Nr."; + this.auxSN2Label.Visible = false; + // + // mainSN2Label + // + this.mainSN2Label.AutoSize = true; + this.mainSN2Label.Location = new System.Drawing.Point(21, 40); + this.mainSN2Label.Name = "mainSN2Label"; + this.mainSN2Label.Size = new System.Drawing.Size(195, 23); + this.mainSN2Label.TabIndex = 0; + this.mainSN2Label.Text = "Main WM Serial Nr."; + this.mainSN2Label.Visible = false; + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.aux3ComboBox); + this.groupBox3.Controls.Add(this.main3ComboBox); + this.groupBox3.Controls.Add(this.checkBox3); + this.groupBox3.Controls.Add(this.auxSN3Label); + this.groupBox3.Controls.Add(this.mainSN3Label); + this.groupBox3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox3.ForeColor = System.Drawing.Color.Black; + this.groupBox3.Location = new System.Drawing.Point(28, 430); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(533, 137); + this.groupBox3.TabIndex = 3; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "Water Meter 3"; + this.groupBox3.Visible = false; + // + // aux3ComboBox + // + this.aux3ComboBox.FormattingEnabled = true; + this.aux3ComboBox.Location = new System.Drawing.Point(287, 83); + this.aux3ComboBox.Name = "aux3ComboBox"; + this.aux3ComboBox.Size = new System.Drawing.Size(175, 31); + this.aux3ComboBox.TabIndex = 10; + this.aux3ComboBox.Visible = false; + this.aux3ComboBox.SelectedIndexChanged += new System.EventHandler(this.aux3ComboBox_SelectedIndexChanged); + this.aux3ComboBox.TextChanged += new System.EventHandler(this.aux3ComboBox_TextChanged); + this.aux3ComboBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.aux3ComboBox_KeyPress); + // + // main3ComboBox + // + this.main3ComboBox.FormattingEnabled = true; + this.main3ComboBox.Location = new System.Drawing.Point(287, 37); + this.main3ComboBox.Name = "main3ComboBox"; + this.main3ComboBox.Size = new System.Drawing.Size(175, 31); + this.main3ComboBox.TabIndex = 9; + this.main3ComboBox.Visible = false; + this.main3ComboBox.SelectedIndexChanged += new System.EventHandler(this.main3ComboBox_SelectedIndexChanged); + this.main3ComboBox.TextChanged += new System.EventHandler(this.main3ComboBox_TextChanged); + this.main3ComboBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.main3ComboBox_KeyPress); + // + // checkBox3 + // + this.checkBox3.AutoSize = true; + this.checkBox3.Font = new System.Drawing.Font("Verdana", 27.75F); + this.checkBox3.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.checkBox3.Location = new System.Drawing.Point(490, 68); + this.checkBox3.Name = "checkBox3"; + this.checkBox3.Size = new System.Drawing.Size(15, 14); + this.checkBox3.TabIndex = 8; + this.checkBox3.UseVisualStyleBackColor = true; + this.checkBox3.Visible = false; + // + // auxSN3Label + // + this.auxSN3Label.AutoSize = true; + this.auxSN3Label.Location = new System.Drawing.Point(21, 86); + this.auxSN3Label.Name = "auxSN3Label"; + this.auxSN3Label.Size = new System.Drawing.Size(193, 23); + this.auxSN3Label.TabIndex = 2; + this.auxSN3Label.Text = "Aux. WM Serial Nr."; + this.auxSN3Label.Visible = false; + // + // mainSN3Label + // + this.mainSN3Label.AutoSize = true; + this.mainSN3Label.Location = new System.Drawing.Point(21, 40); + this.mainSN3Label.Name = "mainSN3Label"; + this.mainSN3Label.Size = new System.Drawing.Size(195, 23); + this.mainSN3Label.TabIndex = 0; + this.mainSN3Label.Text = "Main WM Serial Nr."; + this.mainSN3Label.Visible = false; + // + // clearButton + // + this.clearButton.Font = new System.Drawing.Font("Verdana", 14.25F); + this.clearButton.ForeColor = System.Drawing.Color.Black; + this.clearButton.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.clearButton.Location = new System.Drawing.Point(589, 116); + this.clearButton.Name = "clearButton"; + this.clearButton.Size = new System.Drawing.Size(117, 63); + this.clearButton.TabIndex = 9; + this.clearButton.Text = "Clear"; + this.clearButton.UseVisualStyleBackColor = true; + this.clearButton.Click += new System.EventHandler(this.clearButton_Click); + // + // orderGroupBox + // + this.orderGroupBox.Controls.Add(this.orderComboBox); + this.orderGroupBox.Font = new System.Drawing.Font("Verdana", 14.25F); + this.orderGroupBox.ForeColor = System.Drawing.Color.Black; + this.orderGroupBox.Location = new System.Drawing.Point(28, 16); + this.orderGroupBox.Name = "orderGroupBox"; + this.orderGroupBox.Size = new System.Drawing.Size(533, 82); + this.orderGroupBox.TabIndex = 10; + this.orderGroupBox.TabStop = false; + this.orderGroupBox.Text = "Order"; + // + // orderComboBox + // + this.orderComboBox.FormattingEnabled = true; + this.orderComboBox.Location = new System.Drawing.Point(165, 30); + this.orderComboBox.Name = "orderComboBox"; + this.orderComboBox.Size = new System.Drawing.Size(297, 31); + this.orderComboBox.TabIndex = 0; + // + // CycleBeginningForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.AutoSize = true; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.ClientSize = new System.Drawing.Size(732, 593); + this.Controls.Add(this.orderGroupBox); + this.Controls.Add(this.clearButton); + this.Controls.Add(this.groupBox3); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.okButton); + this.ForeColor = System.Drawing.Color.Black; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "CycleBeginningForm"; + this.Text = "Daten"; + this.TopMost = true; + this.Load += new System.EventHandler(this.CycleBeginningForm_Load); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.orderGroupBox.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Label mainSN1Label; + private System.Windows.Forms.Label auxSN1Label; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.Label auxSN2Label; + private System.Windows.Forms.Label mainSN2Label; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.Label auxSN3Label; + private System.Windows.Forms.Label mainSN3Label; + private System.Windows.Forms.Button clearButton; + private System.Windows.Forms.CheckBox checkBox1; + private System.Windows.Forms.CheckBox checkBox2; + private System.Windows.Forms.CheckBox checkBox3; + private System.Windows.Forms.GroupBox orderGroupBox; + private System.Windows.Forms.ComboBox orderComboBox; + private System.Windows.Forms.ComboBox aux1ComboBox; + private System.Windows.Forms.ComboBox main1ComboBox; + private System.Windows.Forms.ComboBox aux2ComboBox; + private System.Windows.Forms.ComboBox main2ComboBox; + private System.Windows.Forms.ComboBox aux3ComboBox; + private System.Windows.Forms.ComboBox main3ComboBox; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/CycleBeginningForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/CycleBeginningForm.cs new file mode 100644 index 00000000..fe681552 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/CycleBeginningForm.cs @@ -0,0 +1,312 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using log4net; +using TBF.Resources; + +#pragma warning disable 162 /// Disables 'Unreachable code detected' warning + +namespace TBF.BenchControl.DataEntry.Combined +{ + public partial class CycleBeginningForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(CycleBeginningForm)); + + /// Number of water meters + public readonly int WaterMetersCount; + + // To be retrieved after the form closes + public string PurchaseOrder; + public string[] MainSNText; + public string[] AuxSNText; + public bool[] Disabled; + + // Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + /// Number of text boxes for serial numbers + int TextBoxesCount; + Label[] mainLabels; + Label[] auxLabels; + ComboBox[] mainComboBoxes; + ComboBox[] auxComboBoxes; + CheckBox[] checkBoxes; + IList enabledComboBoxes; + + + public CycleBeginningForm() + { + InitializeComponent(); + ControlBox = false; + + TextBoxesCount = 3; + mainLabels = new Label[] { mainSN1Label, mainSN2Label, mainSN3Label }; + auxLabels = new Label[] { auxSN1Label, auxSN2Label, auxSN3Label }; + mainComboBoxes = new ComboBox[] { main1ComboBox, main2ComboBox, main3ComboBox }; + auxComboBoxes = new ComboBox[] { aux1ComboBox, aux2ComboBox, aux3ComboBox }; + checkBoxes = new CheckBox[] { checkBox1, checkBox2, checkBox3 }; + enabledComboBoxes = new List(); + + this.WaterMetersCount = Config.Data.CompoundWMsCount; /// Default number of compound water meters + + completed = false; + StartForceCloseHandler(); + } + + /// + /// Constructor + /// + /// Number of text boxes for serial numbers + public CycleBeginningForm(int compoundWaterMetersCount) + : this() + { + this.WaterMetersCount = compoundWaterMetersCount; /// = Program.CompondWMsCount + MainSNText = new string[compoundWaterMetersCount]; + AuxSNText = new string[compoundWaterMetersCount]; + Disabled = new bool[compoundWaterMetersCount]; + + ShuffleTextBoxes(compoundWaterMetersCount); + + Height = 110 + WaterMetersCount * 157; + } + + /// + /// Make sure the layout of labels/text boxes on the screen + /// corresponds to the layout of watermeters of the test bench. + /// + /// Numebr of combined watermeters + void ShuffleTextBoxes(int compoundWMsCount) + { + if (compoundWMsCount < TextBoxesCount) TextBoxesCount = compoundWMsCount; + } + + private void CycleBeginningForm_Load(object sender, EventArgs e) + { + Localize(); + + PrepareOrderCombo(orderComboBox); + + if (WaterMetersCount >= 1) groupBox1.Visible = true; + if (WaterMetersCount >= 2) groupBox2.Visible = true; + if (WaterMetersCount >= 3) groupBox3.Visible = true; + + for (int i = 0; i < TextBoxesCount; i++) + { + mainLabels[i].Visible = mainComboBoxes[i].Visible = true; + auxLabels[i].Visible = auxComboBoxes[i].Visible = true; + checkBoxes[i].Visible = true; + enabledComboBoxes.Add(mainComboBoxes[i]); + enabledComboBoxes.Add(auxComboBoxes[i]); + + if (Program.LocalSettings.LastMainSNTextsCount == TextBoxesCount && + Program.LocalSettings.LastAuxSNTextsCount == TextBoxesCount) + { + mainComboBoxes[i].Items.Add((Program.LocalSettings.LastMainSNTexts[i] == null) ? string.Empty : Program.LocalSettings.LastMainSNTexts[i]); + auxComboBoxes[i].Items.Add((Program.LocalSettings.LastAuxSNTexts[i] == null) ? string.Empty : Program.LocalSettings.LastAuxSNTexts[i]); + } + } + } + + void Localize() + { + Text = Strings.Data; + orderGroupBox.Text = Strings.Purchase_order; + groupBox1.Text = Strings.Water_Meter + " 1"; + groupBox2.Text = Strings.Water_Meter + " 2"; + groupBox3.Text = Strings.Water_Meter + " 3"; + mainSN1Label.Text = Strings.Main_WM_SerialNr; + mainSN2Label.Text = Strings.Main_WM_SerialNr; + mainSN3Label.Text = Strings.Main_WM_SerialNr; + auxSN1Label.Text = Strings.Aux_WM_SerialNr; + auxSN2Label.Text = Strings.Aux_WM_SerialNr; + auxSN3Label.Text = Strings.Aux_WM_SerialNr; + okButton.Text = Strings.OkBtnText; + clearButton.Text = Strings.ClearBtnText; + } + + /// + /// Load Purchase order combo box items from the LocalSettings PurchaseOrderHistory array + /// + /// Puchase order ComboBox + void PrepareOrderCombo(ComboBox orderComboBox) + { + for (int i = 0; i < Program.LocalSettings.PurchaseOrderHistoryCount; i++) + { + orderComboBox.Items.Add(Program.LocalSettings.PurchaseOrderHistory[i]); + } + + if (orderComboBox.Items.Count > 0) + { + orderComboBox.Text = orderComboBox.Items[0].ToString(); + } + } + + private void okButton_Click(object sender, EventArgs e) + { + PurchaseOrder = orderComboBox.Text; + Program.LocalSettings.UpdateHistory(orderComboBox.Text, + ref Program.LocalSettings.PurchaseOrderHistory +#if FUZHOU150 || FUZHOU300 + , 20 +#endif + ); + + Program.LocalSettings.LastMainSNTexts = MainSNText; + Program.LocalSettings.LastAuxSNTexts = AuxSNText; + + for (int i = 0; i < TextBoxesCount; i++) + { + MainSNText[i] = mainComboBoxes[i].Text; + AuxSNText[i] = auxComboBoxes[i].Text; + Disabled[i] = !checkBoxes[i].Checked; + } + + completed = true; + Close(); + } + + private void clearButton_Click(object sender, EventArgs e) + { + for (int i = 0; i < TextBoxesCount; i++) + { + mainComboBoxes[i].Text = string.Empty; + auxComboBoxes[i].Text = string.Empty; + checkBoxes[i].Checked = false; + } + + } + + + /// + /// When one combo box is updated using drop-down menu, all combo boxes + /// are updated by this function. + /// + private void UpdateAllCombos() + { + for (int i = 0; i < TextBoxesCount; i++) + { + mainComboBoxes[i].Text = Program.LocalSettings.LastMainSNTexts[i]; + auxComboBoxes[i].Text = Program.LocalSettings.LastAuxSNTexts[i]; + checkBoxes[i].Checked = !string.IsNullOrEmpty(mainComboBoxes[i].Text) + || !string.IsNullOrEmpty(auxComboBoxes[i].Text); + } + } + + + private void main1ComboBox_TextChanged(object sender, EventArgs e) { checkBox1.Checked = true; } + private void main1ComboBox_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastMainSNTextsCount == WaterMetersCount) + { + if (main1ComboBox.Text.Equals(main1ComboBox.Items[0])) UpdateAllCombos(); + } + } + + private void aux1ComboBox_TextChanged(object sender, EventArgs e) { checkBox1.Checked = true; } + private void aux1ComboBox_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastAuxSNTextsCount == WaterMetersCount) + { + if (aux1ComboBox.Text.Equals(aux1ComboBox.Items[0])) UpdateAllCombos(); + } + } + + private void main2ComboBox_TextChanged(object sender, EventArgs e) { checkBox2.Checked = true; } + private void main2ComboBox_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastMainSNTextsCount == WaterMetersCount) + { + if (main2ComboBox.Text.Equals(main2ComboBox.Items[0])) UpdateAllCombos(); + } + } + + private void aux2ComboBox_TextChanged(object sender, EventArgs e) { checkBox2.Checked = true; } + private void aux2ComboBox_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastAuxSNTextsCount == WaterMetersCount) + { + if (aux2ComboBox.Text.Equals(aux2ComboBox.Items[0])) UpdateAllCombos(); + } + } + + private void main3ComboBox_TextChanged(object sender, EventArgs e) { checkBox3.Checked = true; } + private void main3ComboBox_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastMainSNTextsCount == WaterMetersCount) + { + if (main3ComboBox.Text.Equals(main3ComboBox.Items[0])) UpdateAllCombos(); + } + } + + private void aux3ComboBox_TextChanged(object sender, EventArgs e) { checkBox3.Checked = true; } + private void aux3ComboBox_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastAuxSNTextsCount == WaterMetersCount) + { + if (aux3ComboBox.Text.Equals(aux3ComboBox.Items[0])) UpdateAllCombos(); + } + } + + + #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) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + + + /// + /// Process a key press within any enabled text boxe + /// + /// + /// + /// TextBox control which received the event + private void ProcKeyPress(object sender, KeyPressEventArgs e, ComboBox currentFocusOwner) + { + if (e.KeyChar == '+') + { + /// Process '+' key ..... Form completed + okButton_Click(sender, e); + } + if (e.KeyChar == '\r') + { + /// Process key ..... Next text field + if (enabledComboBoxes.Count < 2) return; /// There is just one enabled textbox + + for (int i = 0; i < enabledComboBoxes.Count; i++) + { + if (enabledComboBoxes[i] == currentFocusOwner) + { + /// Change focus to the next enabled text box + enabledComboBoxes[(i + 1) % enabledComboBoxes.Count].Focus(); + return; + } + } + } + } + + private void main1ComboBox_KeyPress(object sender, KeyPressEventArgs e) { ProcKeyPress(sender, e, main1ComboBox); } + private void main2ComboBox_KeyPress(object sender, KeyPressEventArgs e) { ProcKeyPress(sender, e, main2ComboBox); } + private void main3ComboBox_KeyPress(object sender, KeyPressEventArgs e) { ProcKeyPress(sender, e, main3ComboBox); } + private void aux1ComboBox_KeyPress(object sender, KeyPressEventArgs e) { ProcKeyPress(sender, e, aux1ComboBox); } + private void aux2ComboBox_KeyPress(object sender, KeyPressEventArgs e) { ProcKeyPress(sender, e, aux2ComboBox); } + private void aux3ComboBox_KeyPress(object sender, KeyPressEventArgs e) { ProcKeyPress(sender, e, aux3ComboBox); } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/CycleBeginningForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/CycleBeginningForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/CycleBeginningForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/CycleEndForm.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/CycleEndForm.Designer.cs new file mode 100644 index 00000000..a51f9fde --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/CycleEndForm.Designer.cs @@ -0,0 +1,443 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.Combined +{ + partial class CycleEndForm + { + /// + /// 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() + { + this.mainState1TextBox = new System.Windows.Forms.TextBox(); + this.mainState1Label = new System.Windows.Forms.Label(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.qFall1Label = new System.Windows.Forms.Label(); + this.qFall1TextBox = new System.Windows.Forms.TextBox(); + this.qRise1Label = new System.Windows.Forms.Label(); + this.qRise1TextBox = new System.Windows.Forms.TextBox(); + this.auxState1TextBox = new System.Windows.Forms.TextBox(); + this.auxState1Label = new System.Windows.Forms.Label(); + this.okButton = new System.Windows.Forms.Button(); + this.protocolGroupBox = new System.Windows.Forms.GroupBox(); + this.radioButton3 = new System.Windows.Forms.RadioButton(); + this.radioButton2 = new System.Windows.Forms.RadioButton(); + this.radioButton1 = new System.Windows.Forms.RadioButton(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.qFall2Label = new System.Windows.Forms.Label(); + this.qFall2TextBox = new System.Windows.Forms.TextBox(); + this.qRise2Label = new System.Windows.Forms.Label(); + this.qRise2TextBox = new System.Windows.Forms.TextBox(); + this.mainState2TextBox = new System.Windows.Forms.TextBox(); + this.mainState2Label = new System.Windows.Forms.Label(); + this.auxState2TextBox = new System.Windows.Forms.TextBox(); + this.auxState2Label = new System.Windows.Forms.Label(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.qFall3Label = new System.Windows.Forms.Label(); + this.qFall3TextBox = new System.Windows.Forms.TextBox(); + this.qRise3Label = new System.Windows.Forms.Label(); + this.qRise3TextBox = new System.Windows.Forms.TextBox(); + this.mainState3TextBox = new System.Windows.Forms.TextBox(); + this.mainState3Label = new System.Windows.Forms.Label(); + this.auxState3TextBox = new System.Windows.Forms.TextBox(); + this.auxState3Label = new System.Windows.Forms.Label(); + this.groupBox1.SuspendLayout(); + this.protocolGroupBox.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.SuspendLayout(); + // + // mainState1TextBox + // + this.mainState1TextBox.Location = new System.Drawing.Point(211, 42); + this.mainState1TextBox.Name = "mainState1TextBox"; + this.mainState1TextBox.Size = new System.Drawing.Size(135, 31); + this.mainState1TextBox.TabIndex = 1; + // + // mainState1Label + // + this.mainState1Label.AutoSize = true; + this.mainState1Label.Location = new System.Drawing.Point(18, 45); + this.mainState1Label.Name = "mainState1Label"; + this.mainState1Label.Size = new System.Drawing.Size(153, 23); + this.mainState1Label.TabIndex = 0; + this.mainState1Label.Text = "Main WM State"; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.qFall1Label); + this.groupBox1.Controls.Add(this.qFall1TextBox); + this.groupBox1.Controls.Add(this.qRise1Label); + this.groupBox1.Controls.Add(this.qRise1TextBox); + this.groupBox1.Controls.Add(this.mainState1TextBox); + this.groupBox1.Controls.Add(this.mainState1Label); + this.groupBox1.Controls.Add(this.auxState1TextBox); + this.groupBox1.Controls.Add(this.auxState1Label); + this.groupBox1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox1.ForeColor = System.Drawing.Color.Black; + this.groupBox1.Location = new System.Drawing.Point(25, 23); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(375, 237); + this.groupBox1.TabIndex = 1; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Water Meter 1"; + // + // qFall1Label + // + this.qFall1Label.AutoSize = true; + this.qFall1Label.Location = new System.Drawing.Point(18, 184); + this.qFall1Label.Name = "qFall1Label"; + this.qFall1Label.Size = new System.Drawing.Size(55, 23); + this.qFall1Label.TabIndex = 6; + this.qFall1Label.Text = "Qfall"; + // + // qFall1TextBox + // + this.qFall1TextBox.Location = new System.Drawing.Point(211, 177); + this.qFall1TextBox.Name = "qFall1TextBox"; + this.qFall1TextBox.Size = new System.Drawing.Size(135, 31); + this.qFall1TextBox.TabIndex = 7; + // + // qRise1Label + // + this.qRise1Label.AutoSize = true; + this.qRise1Label.Location = new System.Drawing.Point(18, 135); + this.qRise1Label.Name = "qRise1Label"; + this.qRise1Label.Size = new System.Drawing.Size(60, 23); + this.qRise1Label.TabIndex = 4; + this.qRise1Label.Text = "Qrise"; + // + // qRise1TextBox + // + this.qRise1TextBox.Location = new System.Drawing.Point(211, 132); + this.qRise1TextBox.Name = "qRise1TextBox"; + this.qRise1TextBox.Size = new System.Drawing.Size(135, 31); + this.qRise1TextBox.TabIndex = 5; + // + // auxState1TextBox + // + this.auxState1TextBox.Location = new System.Drawing.Point(211, 87); + this.auxState1TextBox.Name = "auxState1TextBox"; + this.auxState1TextBox.Size = new System.Drawing.Size(135, 31); + this.auxState1TextBox.TabIndex = 3; + // + // auxState1Label + // + this.auxState1Label.AutoSize = true; + this.auxState1Label.Location = new System.Drawing.Point(18, 90); + this.auxState1Label.Name = "auxState1Label"; + this.auxState1Label.Size = new System.Drawing.Size(151, 23); + this.auxState1Label.TabIndex = 2; + this.auxState1Label.Text = "Aux. WM State"; + // + // okButton + // + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(699, 33); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(98, 63); + this.okButton.TabIndex = 0; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // protocolGroupBox + // + this.protocolGroupBox.Controls.Add(this.radioButton3); + this.protocolGroupBox.Controls.Add(this.radioButton2); + this.protocolGroupBox.Controls.Add(this.radioButton1); + this.protocolGroupBox.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.protocolGroupBox.Location = new System.Drawing.Point(422, 118); + this.protocolGroupBox.Name = "protocolGroupBox"; + this.protocolGroupBox.Size = new System.Drawing.Size(375, 142); + this.protocolGroupBox.TabIndex = 4; + this.protocolGroupBox.TabStop = false; + this.protocolGroupBox.Text = "Protocol"; + // + // radioButton3 + // + this.radioButton3.AutoSize = true; + this.radioButton3.Location = new System.Drawing.Point(34, 100); + this.radioButton3.Name = "radioButton3"; + this.radioButton3.Size = new System.Drawing.Size(152, 27); + this.radioButton3.TabIndex = 2; + this.radioButton3.Text = "radioButton3"; + this.radioButton3.UseVisualStyleBackColor = true; + // + // radioButton2 + // + this.radioButton2.AutoSize = true; + this.radioButton2.Location = new System.Drawing.Point(34, 67); + this.radioButton2.Name = "radioButton2"; + this.radioButton2.Size = new System.Drawing.Size(152, 27); + this.radioButton2.TabIndex = 1; + this.radioButton2.Text = "radioButton2"; + this.radioButton2.UseVisualStyleBackColor = true; + // + // radioButton1 + // + this.radioButton1.AutoSize = true; + this.radioButton1.Checked = true; + this.radioButton1.Location = new System.Drawing.Point(34, 34); + this.radioButton1.Name = "radioButton1"; + this.radioButton1.Size = new System.Drawing.Size(152, 27); + this.radioButton1.TabIndex = 0; + this.radioButton1.TabStop = true; + this.radioButton1.Text = "radioButton1"; + this.radioButton1.UseVisualStyleBackColor = true; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.qFall2Label); + this.groupBox2.Controls.Add(this.qFall2TextBox); + this.groupBox2.Controls.Add(this.qRise2Label); + this.groupBox2.Controls.Add(this.qRise2TextBox); + this.groupBox2.Controls.Add(this.mainState2TextBox); + this.groupBox2.Controls.Add(this.mainState2Label); + this.groupBox2.Controls.Add(this.auxState2TextBox); + this.groupBox2.Controls.Add(this.auxState2Label); + this.groupBox2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox2.ForeColor = System.Drawing.Color.Black; + this.groupBox2.Location = new System.Drawing.Point(25, 282); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(375, 237); + this.groupBox2.TabIndex = 2; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Water Meter 2"; + // + // qFall2Label + // + this.qFall2Label.AutoSize = true; + this.qFall2Label.Location = new System.Drawing.Point(18, 184); + this.qFall2Label.Name = "qFall2Label"; + this.qFall2Label.Size = new System.Drawing.Size(55, 23); + this.qFall2Label.TabIndex = 6; + this.qFall2Label.Text = "Qfall"; + // + // qFall2TextBox + // + this.qFall2TextBox.Location = new System.Drawing.Point(211, 177); + this.qFall2TextBox.Name = "qFall2TextBox"; + this.qFall2TextBox.Size = new System.Drawing.Size(135, 31); + this.qFall2TextBox.TabIndex = 7; + // + // qRise2Label + // + this.qRise2Label.AutoSize = true; + this.qRise2Label.Location = new System.Drawing.Point(18, 135); + this.qRise2Label.Name = "qRise2Label"; + this.qRise2Label.Size = new System.Drawing.Size(60, 23); + this.qRise2Label.TabIndex = 4; + this.qRise2Label.Text = "Qrise"; + // + // qRise2TextBox + // + this.qRise2TextBox.Location = new System.Drawing.Point(211, 132); + this.qRise2TextBox.Name = "qRise2TextBox"; + this.qRise2TextBox.Size = new System.Drawing.Size(135, 31); + this.qRise2TextBox.TabIndex = 5; + // + // mainState2TextBox + // + this.mainState2TextBox.Location = new System.Drawing.Point(211, 42); + this.mainState2TextBox.Name = "mainState2TextBox"; + this.mainState2TextBox.Size = new System.Drawing.Size(135, 31); + this.mainState2TextBox.TabIndex = 1; + // + // mainState2Label + // + this.mainState2Label.AutoSize = true; + this.mainState2Label.Location = new System.Drawing.Point(17, 45); + this.mainState2Label.Name = "mainState2Label"; + this.mainState2Label.Size = new System.Drawing.Size(153, 23); + this.mainState2Label.TabIndex = 0; + this.mainState2Label.Text = "Main WM State"; + // + // auxState2TextBox + // + this.auxState2TextBox.Location = new System.Drawing.Point(211, 87); + this.auxState2TextBox.Name = "auxState2TextBox"; + this.auxState2TextBox.Size = new System.Drawing.Size(135, 31); + this.auxState2TextBox.TabIndex = 3; + // + // auxState2Label + // + this.auxState2Label.AutoSize = true; + this.auxState2Label.Location = new System.Drawing.Point(18, 90); + this.auxState2Label.Name = "auxState2Label"; + this.auxState2Label.Size = new System.Drawing.Size(151, 23); + this.auxState2Label.TabIndex = 2; + this.auxState2Label.Text = "Aux. WM State"; + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.qFall3Label); + this.groupBox3.Controls.Add(this.qFall3TextBox); + this.groupBox3.Controls.Add(this.qRise3Label); + this.groupBox3.Controls.Add(this.qRise3TextBox); + this.groupBox3.Controls.Add(this.mainState3TextBox); + this.groupBox3.Controls.Add(this.mainState3Label); + this.groupBox3.Controls.Add(this.auxState3TextBox); + this.groupBox3.Controls.Add(this.auxState3Label); + this.groupBox3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox3.ForeColor = System.Drawing.Color.Black; + this.groupBox3.Location = new System.Drawing.Point(422, 282); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(375, 237); + this.groupBox3.TabIndex = 3; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "Water Meter 3"; + // + // qFall3Label + // + this.qFall3Label.AutoSize = true; + this.qFall3Label.Location = new System.Drawing.Point(18, 184); + this.qFall3Label.Name = "qFall3Label"; + this.qFall3Label.Size = new System.Drawing.Size(55, 23); + this.qFall3Label.TabIndex = 6; + this.qFall3Label.Text = "Qfall"; + // + // qFall3TextBox + // + this.qFall3TextBox.Location = new System.Drawing.Point(211, 177); + this.qFall3TextBox.Name = "qFall3TextBox"; + this.qFall3TextBox.Size = new System.Drawing.Size(135, 31); + this.qFall3TextBox.TabIndex = 7; + // + // qRise3Label + // + this.qRise3Label.AutoSize = true; + this.qRise3Label.Location = new System.Drawing.Point(18, 135); + this.qRise3Label.Name = "qRise3Label"; + this.qRise3Label.Size = new System.Drawing.Size(60, 23); + this.qRise3Label.TabIndex = 4; + this.qRise3Label.Text = "Qrise"; + // + // qRise3TextBox + // + this.qRise3TextBox.Location = new System.Drawing.Point(211, 132); + this.qRise3TextBox.Name = "qRise3TextBox"; + this.qRise3TextBox.Size = new System.Drawing.Size(135, 31); + this.qRise3TextBox.TabIndex = 5; + // + // mainState3TextBox + // + this.mainState3TextBox.Location = new System.Drawing.Point(211, 42); + this.mainState3TextBox.Name = "mainState3TextBox"; + this.mainState3TextBox.Size = new System.Drawing.Size(135, 31); + this.mainState3TextBox.TabIndex = 1; + // + // mainState3Label + // + this.mainState3Label.AutoSize = true; + this.mainState3Label.Location = new System.Drawing.Point(18, 45); + this.mainState3Label.Name = "mainState3Label"; + this.mainState3Label.Size = new System.Drawing.Size(153, 23); + this.mainState3Label.TabIndex = 0; + this.mainState3Label.Text = "Main WM State"; + // + // auxState3TextBox + // + this.auxState3TextBox.Location = new System.Drawing.Point(211, 87); + this.auxState3TextBox.Name = "auxState3TextBox"; + this.auxState3TextBox.Size = new System.Drawing.Size(135, 31); + this.auxState3TextBox.TabIndex = 3; + // + // auxState3Label + // + this.auxState3Label.AutoSize = true; + this.auxState3Label.Location = new System.Drawing.Point(18, 90); + this.auxState3Label.Name = "auxState3Label"; + this.auxState3Label.Size = new System.Drawing.Size(151, 23); + this.auxState3Label.TabIndex = 2; + this.auxState3Label.Text = "Aux. WM State"; + // + // CycleEndForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.ClientSize = new System.Drawing.Size(822, 542); + this.Controls.Add(this.groupBox3); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.protocolGroupBox); + this.Controls.Add(this.okButton); + this.Controls.Add(this.groupBox1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "CycleEndForm"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "Daten"; + this.TopMost = true; + this.Load += new System.EventHandler(this.CycleEndForm_Load); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.protocolGroupBox.ResumeLayout(false); + this.protocolGroupBox.PerformLayout(); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TextBox mainState1TextBox; + private System.Windows.Forms.Label mainState1Label; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TextBox auxState1TextBox; + private System.Windows.Forms.Label auxState1Label; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.GroupBox protocolGroupBox; + private System.Windows.Forms.RadioButton radioButton3; + private System.Windows.Forms.RadioButton radioButton2; + private System.Windows.Forms.RadioButton radioButton1; + private System.Windows.Forms.Label qFall1Label; + private System.Windows.Forms.TextBox qFall1TextBox; + private System.Windows.Forms.Label qRise1Label; + private System.Windows.Forms.TextBox qRise1TextBox; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.Label qFall2Label; + private System.Windows.Forms.TextBox qFall2TextBox; + private System.Windows.Forms.Label qRise2Label; + private System.Windows.Forms.TextBox qRise2TextBox; + private System.Windows.Forms.TextBox mainState2TextBox; + private System.Windows.Forms.Label mainState2Label; + private System.Windows.Forms.TextBox auxState2TextBox; + private System.Windows.Forms.Label auxState2Label; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.Label qFall3Label; + private System.Windows.Forms.TextBox qFall3TextBox; + private System.Windows.Forms.Label qRise3Label; + private System.Windows.Forms.TextBox qRise3TextBox; + private System.Windows.Forms.TextBox mainState3TextBox; + private System.Windows.Forms.Label mainState3Label; + private System.Windows.Forms.TextBox auxState3TextBox; + private System.Windows.Forms.Label auxState3Label; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/CycleEndForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/CycleEndForm.cs new file mode 100644 index 00000000..cb549533 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/CycleEndForm.cs @@ -0,0 +1,158 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using log4net; +using TBF.Resources; + +#pragma warning disable 162 /// Disables 'Unreachable code detected' warning + +namespace TBF.BenchControl.DataEntry.Combined +{ + public partial class CycleEndForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(CycleEndForm)); + + // To be set before the form opens + public string ProtocolName1; + public string ProtocolName2; + public string ProtocolName3; + + // To be retrieved after the form closes + public string[] MainStateText; + public string[] AuxStateText; + public float[] QRise; + public float[] QFall; + public string ProtocolTitle; + + // Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + public CycleEndForm() + { + InitializeComponent(); + ControlBox = false; + + MainStateText = new string[Config.Data.CompoundWMsCount]; + AuxStateText = new string[Config.Data.CompoundWMsCount]; + QRise = new float[Config.Data.CompoundWMsCount]; + QFall = new float[Config.Data.CompoundWMsCount]; + completed = false; + StartForceCloseHandler(); + + Localize(); + } + + void Localize() + { + Text = Strings.Data; + protocolGroupBox.Text = Strings.Protocol; + groupBox1.Text = Strings.Water_Meter + " 1"; + mainState1Label.Text = Strings.Main_Water_Meter_State; + auxState1Label.Text = Strings.Aux_Water_Meter_State; + qRise1Label.Text = Strings.Qrise; + qFall1Label.Text = Strings.Qfall; + + groupBox2.Text = Strings.Water_Meter + " 2"; + mainState2Label.Text = Strings.Main_Water_Meter_State; + auxState2Label.Text = Strings.Aux_Water_Meter_State; + qRise2Label.Text = Strings.Qrise; + qFall2Label.Text = Strings.Qfall; + + groupBox3.Text = Strings.Water_Meter + " 3"; + mainState3Label.Text = Strings.Main_Water_Meter_State; + auxState3Label.Text = Strings.Aux_Water_Meter_State; + qRise3Label.Text = Strings.Qrise; + qFall3Label.Text = Strings.Qfall; + } + + private void CycleEndForm_Load(object sender, EventArgs e) + { + radioButton1.Text = ProtocolName1; + radioButton2.Text = ProtocolName2; + radioButton3.Text = ProtocolName3; + + qRise1TextBox.Text = Utils.DoubleToStr(Sequences.SequenceBase.Qrise, 3); + qFall1TextBox.Text = Utils.DoubleToStr(Sequences.SequenceBase.Qfall, 3); + + if (Config.Data.CompoundWMsCount >= 2) + { + qRise2TextBox.Text = Utils.DoubleToStr(Sequences.SequenceBase.Qrise, 3); + qFall2TextBox.Text = Utils.DoubleToStr(Sequences.SequenceBase.Qfall, 3); + } + else + { + groupBox2.Visible = false; + Height = 305; + } + + if (Config.Data.CompoundWMsCount >= 3) + { + qRise3TextBox.Text = Utils.DoubleToStr(Sequences.SequenceBase.Qrise, 3); + qFall3TextBox.Text = Utils.DoubleToStr(Sequences.SequenceBase.Qfall, 3); + } + else + { + groupBox3.Visible = false; + } + } + + private void okButton_Click(object sender, EventArgs e) + { + float ftmp; + bool allOK = true; + + MainStateText[0] = mainState1TextBox.Text; + AuxStateText[0] = auxState1TextBox.Text; + if (Utils.TryParseUFloat(qRise1TextBox.Text, out ftmp)) { QRise[0] = ftmp; } else { allOK = false; } + if (Utils.TryParseUFloat(qFall1TextBox.Text, out ftmp)) { QFall[0] = ftmp; } else { allOK = false; } + + if (Config.Data.CompoundWMsCount >= 2) + { + MainStateText[1] = mainState2TextBox.Text; + AuxStateText[1] = auxState2TextBox.Text; + if (Utils.TryParseUFloat(qRise2TextBox.Text, out ftmp)) { QRise[1] = ftmp; } else { allOK = false; } + if (Utils.TryParseUFloat(qFall2TextBox.Text, out ftmp)) { QFall[1] = ftmp; } else { allOK = false; } + } + + if (Config.Data.CompoundWMsCount >= 3) + { + MainStateText[2] = mainState3TextBox.Text; + AuxStateText[2] = auxState3TextBox.Text; + if (Utils.TryParseUFloat(qRise3TextBox.Text, out ftmp)) { QRise[2] = ftmp; } else { allOK = false; } + if (Utils.TryParseUFloat(qFall3TextBox.Text, out ftmp)) { QFall[2] = ftmp; } else { allOK = false; } + } + + if (radioButton1.Checked) ProtocolTitle = ProtocolName1; + else if (radioButton2.Checked) ProtocolTitle = ProtocolName2; + else if (radioButton3.Checked) ProtocolTitle = ProtocolName3; + + if (allOK) + { + completed = true; + 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) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/CycleEndForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/CycleEndForm.resx new file mode 100644 index 00000000..e2e65bce --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/CycleEndForm.resx @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/EntryForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/EntryForm.cs new file mode 100644 index 00000000..7848e189 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/EntryForm.cs @@ -0,0 +1,281 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; +using TBF.BenchControl; +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl.DataEntry.Combined +{ + public class EntryForm : ComponentBase, IOperation, IDataEntry, IHasCycleBeginForm, IHasCycleEndForm, IHasWMStatesForm + { + private static readonly ILog log = LogManager.GetLogger(typeof(EntryForm)); + public override string ToString() { return string.Format("DataEntry.Combined({0})", Cfg.ToString(1)); } + + public bool UsesCameras() { return false; } + + readonly EntryFormCfg entryFormCfg; + IRegisterReader[] regReaders; + + /// + /// Properties set by the Begin and the End form + /// + string purchaseOrder; + public string PurchaseOrder { get { return purchaseOrder; } } + + bool[] disabled; /// This array is shared between forms + + string[] wmCycleEndState; + public string WMCycleEndState(int wmNr) { return (wmNr >= 0 && wmNr < wmCycleEndState.Length) ? wmCycleEndState[wmNr] : string.Empty; } + + double[] wmStartState; + public double WMStartState(int wmNr) { return (wmNr >= 0 && wmNr < wmStartState.Length) ? wmStartState[wmNr] : 0; } + + double[] wmEndState; + public double WMEndState(int wmNr) { return (wmNr >= 0 && wmNr < wmEndState.Length) ? wmEndState[wmNr] : 0; } + + string[] wmStartStateStr; + + + System.Windows.Forms.Form modelessDlg; + + double refVolume; + double errLimLo; + double errLimHi; + + bool resultSaved; /// Set in Run() when results are saved + + Results.Entities.WaterMeter[] waterMeters; /// Reference to ...ProcessData.BatchRslts.WaterMeters[] + + public enum CurrentOp + { + None, + ShowFormAtCycleBeginning, + ShowFormAtCycleEnd, + EnterTestStartStates, + EnterTestEndStates, + } + + CurrentOp currentOp; + + + public EntryForm() + { + } + + public EntryForm(Generic.IComponentCfg cfg) + : base(cfg) + { + entryFormCfg = cfg as EntryFormCfg; + + disabled = new bool[Config.Data.CompoundWMsCount]; + wmStartState = new double[Config.Data.CompoundWMsCount * 2]; + wmStartStateStr = new string[Config.Data.CompoundWMsCount * 2]; + wmEndState = new double[Config.Data.CompoundWMsCount * 2]; + wmCycleEndState = new string[Config.Data.CompoundWMsCount * 2]; + + currentOp = CurrentOp.None; + log.Debug(this.ToString()); + } + + /// Reference to the operation + public IOperation ShowCycleBeginFormOp() + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.ShowFormAtCycleBeginning; + this.waterMeters = TBF.BenchControl.Sequences.ProcessData.BatchRslts.WaterMeters; + return this; + } + + /// Reference to the operation + public IOperation ShowCycleEndFormOp() + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.ShowFormAtCycleEnd; + this.waterMeters = TBF.BenchControl.Sequences.ProcessData.BatchRslts.WaterMeters; + return this; + } + + /// Reference to the operation + public IOperation ShowTestStartFormOp(IRegisterReader[] regReaders) + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.EnterTestStartStates; + this.regReaders = regReaders; + return this; + } + + /// Reference to the operation + public IOperation ShowTestEndFormOp(IRegisterReader[] regReaders, double refVolume, double errLimLo, double errLimHi) + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.EnterTestEndStates; + this.regReaders = regReaders; + this.refVolume = refVolume; + this.errLimLo = errLimLo; + this.errLimHi = errLimHi; + return this; + } + + delegate void EntryFormDlgt(EntryForm myRef); + /// + void OpenBeginningDlg(EntryForm myRef) + { + myRef.modelessDlg = new CycleBeginningForm(Config.Data.CompoundWMsCount); + modelessDlg.Show(); + } + /// + void OpenEndDlg(EntryForm myRef) + { + CycleEndForm endForm = new CycleEndForm(); + myRef.modelessDlg = endForm; + modelessDlg.Show(); + } + /// + void OpenTestStartStatesDlg(EntryForm myRef) + { + myRef.modelessDlg = new TestStartEndForm(Config.Data.CompoundWMsCount, myRef.regReaders, myRef.disabled); + modelessDlg.Show(); + } + /// + void OpenTestEndStatesDlg(EntryForm myRef) + { + string[] mainStartStateStr = new string[Config.Data.CompoundWMsCount]; + string[] auxStartStateStr = new string[Config.Data.CompoundWMsCount]; + for (int i = 0; i < Config.Data.CompoundWMsCount; i++) + { + mainStartStateStr[i] = wmStartStateStr[2 * i]; + auxStartStateStr[i] = wmStartStateStr[2 * i + 1]; + } + myRef.modelessDlg = new TestStartEndForm(Config.Data.CompoundWMsCount, myRef.regReaders, mainStartStateStr, auxStartStateStr, disabled, refVolume, errLimLo, errLimHi); + modelessDlg.Show(); + } + + /// Start this operation + public void Start() + { + resultSaved = false; + switch (currentOp) + { + case CurrentOp.ShowFormAtCycleBeginning: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenBeginningDlg), this); + break; + case CurrentOp.ShowFormAtCycleEnd: + if (entryFormCfg.ShowCycleEndForm) + { + Program.MainWnd.Invoke(new EntryFormDlgt(OpenEndDlg), this); + } + break; + case CurrentOp.EnterTestStartStates: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenTestStartStatesDlg), this); + break; + case CurrentOp.EnterTestEndStates: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenTestEndStatesDlg), this); + break; + } + } + + /// Run this operation + /// Event.ResultsPrinted + public Event Run() + { + if ((modelessDlg is IHasCompleted) && !(modelessDlg as IHasCompleted).Completed) + { + return Event.ModelessFormIsOpen; + } + + if (!resultSaved) /// This is to save the result only once + { + if (currentOp == CurrentOp.ShowFormAtCycleBeginning) + { + CycleBeginningForm dlg = (modelessDlg as CycleBeginningForm); + + if (dlg != null) + { + purchaseOrder = dlg.PurchaseOrder; + + for (int i = 0; i < Math.Min(dlg.WaterMetersCount, waterMeters.Length); i++) + { + if (waterMeters[i] != null) + { + waterMeters[i].SerialNr = dlg.MainSNText[i]; + waterMeters[i].SerialNrAux = dlg.AuxSNText[i]; + + disabled[i] = waterMeters[i].Disabled = dlg.Disabled[i]; + } + } + } + } + else if (currentOp == CurrentOp.ShowFormAtCycleEnd) + { + //CycleEndForm dlg = (modelessDlg as CycleEndForm); + //int count = waterMeters.Count; + //if ((dlg != null) && (count > dlg.WaterMetersCount)) count = dlg.WaterMetersCount; + + //for (int i = 0; i < count; i++) + //{ + // if (waterMeters[i] != null) + // { + // /// In case entryFormCfg.ShowCycleEndForm == false dlg would be null, values would be string.Empty + // wmCycleEndState[i] = waterMeters[i].EndState = (dlg != null) ? dlg.EndStateText[i] : string.Empty; + // } + //} + } + else if (modelessDlg is TestStartEndForm && currentOp == CurrentOp.EnterTestStartStates) + { + /// Fixed start test - start + TestStartEndForm dlg = (modelessDlg as TestStartEndForm); + + for (int i = 0; i < dlg.WaterMetersCount; i++) + { + wmStartState[2 * i] = dlg.MainStartState[i]; + wmStartStateStr[2 * i] = dlg.MainStartStateStr[i]; + wmStartState[2 * i + 1] = dlg.AuxStartState[i]; + wmStartStateStr[2 * i + 1] = dlg.AuxStartStateStr[i]; + } + } + else if (modelessDlg is TestStartEndForm && currentOp == CurrentOp.EnterTestEndStates) + { + /// Fixed start test - end + TestStartEndForm dlg = (modelessDlg as TestStartEndForm); + + for (int i = 0; i < dlg.WaterMetersCount; i++) + { + wmEndState[2 * i] = dlg.MainEndState[i]; + wmEndState[2 * i + 1] = dlg.AuxEndState[i]; + } + } + resultSaved = true; + modelessDlg = null; + } + + return Event.ModelessFormClosed; /// Form closed + } + + /// Stop this operation + public void Stop() + { + if (modelessDlg is IHasCompleted) + { + UiBridge.Bridge.OnCloseModelessForm(this, null); + modelessDlg = null; + } + currentOp = CurrentOp.None; + } + + /// + /// Updates test results with the information collected in watermeters. + /// + /// Test results to be updated with the information + public void UpdateTestResults(Results.BatchResults batchResults) + { + foreach (var wm in batchResults.WaterMeters) + { + if (wm != null && !wm.Disabled) wm.PurchaseOrder = PurchaseOrder; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/EntryFormCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/EntryFormCfg.cs new file mode 100644 index 00000000..20133f6a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/EntryFormCfg.cs @@ -0,0 +1,43 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DataEntry.Combined +{ + public class EntryFormCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(EntryFormCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new EntryFormCfgCtrl(); } + + /// + /// Serialized parameters + /// + public bool ShowCycleEndForm; + + /// Private parameterless constructor invoked by all other (public) constructors + EntryFormCfg() + { + Name = "DataEntry-Combined"; + ParentName = string.Empty; + ShowCycleEndForm = false; + } + + public EntryFormCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, ShowEndForm={1}", Name, ShowCycleEndForm); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/EntryFormCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/EntryFormCfgCtrl.cs new file mode 100644 index 00000000..bec8b578 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/EntryFormCfgCtrl.cs @@ -0,0 +1,79 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.Combined +{ + public partial class EntryFormCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + EntryFormCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as EntryFormCfg; + Redraw(); + } + } + + public EntryFormCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Localize(); + Redraw(); + } + + void Localize() + { + showCycleEndFormCheckBox.Text = Strings.Show_cycle_end_form; + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + showCycleEndFormCheckBox.Checked = config.ShowCycleEndForm; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + showCycleEndFormCheckBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.ShowCycleEndForm = showCycleEndFormCheckBox.Checked; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/EntryFormCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/EntryFormCfgCtrl.designer.cs new file mode 100644 index 00000000..9091a61b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/EntryFormCfgCtrl.designer.cs @@ -0,0 +1,100 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.Combined +{ + partial class EntryFormCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.showCycleEndFormCheckBox = new System.Windows.Forms.CheckBox(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(137, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 5; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(27, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 4; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(134, 33); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 3; + this.classNameLabel.Text = "ComonentName"; + // + // showCycleEndFormCheckBox + // + this.showCycleEndFormCheckBox.AutoSize = true; + this.showCycleEndFormCheckBox.Enabled = false; + this.showCycleEndFormCheckBox.Location = new System.Drawing.Point(137, 90); + this.showCycleEndFormCheckBox.Name = "showCycleEndFormCheckBox"; + this.showCycleEndFormCheckBox.Size = new System.Drawing.Size(125, 17); + this.showCycleEndFormCheckBox.TabIndex = 14; + this.showCycleEndFormCheckBox.Text = "Show cycle end form"; + this.showCycleEndFormCheckBox.UseVisualStyleBackColor = true; + // + // EntryFormCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.showCycleEndFormCheckBox); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "EntryFormCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.CheckBox showCycleEndFormCheckBox; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/EntryFormCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/EntryFormCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/EntryFormCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/EntryFormFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/EntryFormFactory.cs new file mode 100644 index 00000000..f1384294 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/EntryFormFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DataEntry.Combined +{ + public class EntryFormFactory : IComponentFactory + { + public string ClassName { get { return "DataEntry-Combined"; } } + + public void ResetStaticProperties() { EntryForm.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new EntryForm(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new EntryForm(cfg); } + + public IComponentCfg DefaultConfig() { return new EntryFormCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(EntryFormCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/TestStartEndForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/TestStartEndForm.cs new file mode 100644 index 00000000..b976126d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/TestStartEndForm.cs @@ -0,0 +1,426 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using log4net; +using TBF.BenchControl.GenericDevices; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.Combined +{ + public partial class TestStartEndForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(TestStartEndForm)); + + // Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + /// Number of water meters + public readonly int WaterMetersCount; /// Main + Aux water meter count as one (combined) water meter + readonly IRegisterReader[] regReaders; + readonly bool[] disabled; + + // To be retrieved after the form closes + public double[] MainStartState; + public double[] AuxStartState; + + // To be retrieved after the form closes + public readonly string[] MainStartStateStr; + public readonly string[] AuxStartStateStr; + + // To be retrieved after the form closes + public double[] MainEndState; + public double[] AuxEndState; + + bool endStates; /// false=start states, true=end states + double refVolume; + double warningLimLo; /// limit to display exclamation mark, typically 2x errLimLo + double warningLimHi; /// limit to display exclamation mark, typically 2x errLimHi + + int TextBoxesCount; + /// + Label[] mainLabels; + Label[] auxLabels; + TextBox[] mainStartTextBoxes; + TextBox[] auxStartTextBoxes; + TextBox[] mainEndTextBoxes; + TextBox[] auxEndTextBoxes; + IList enabledTextBoxes; + + /// + /// Parameterless constructor initializing common part for start and endstate form + /// + public TestStartEndForm() + { + InitializeComponent(); + ControlBox = false; + + TextBoxesCount = 3; + + endStates = false; + mainLabels = new Label[] { main1Label, main2Label, main3Label, }; + auxLabels = new Label[] { aux1Label, aux2Label, aux3Label, }; + mainStartTextBoxes = new TextBox[] { main1StartTextBox, main2StartTextBox, main3StartTextBox, }; + auxStartTextBoxes = new TextBox[] { aux1StartTextBox, aux2StartTextBox, aux3StartTextBox, }; + mainEndTextBoxes = new TextBox[] { main1EndTextBox, main2EndTextBox, main3EndTextBox, }; + auxEndTextBoxes = new TextBox[] { aux1EndTextBox, aux2EndTextBox, aux3EndTextBox, }; + enabledTextBoxes = new List(); + + completed = false; + StartForceCloseHandler(); + } + + /// + /// Constructor to fill in start states + /// + /// Number of water meters + /// Information from CycleBeginningForm about availability of water meters + public TestStartEndForm(int waterMetersCount, IRegisterReader[] regReaders, bool[] disabled) + : this() + { + endStates = false; + + this.WaterMetersCount = waterMetersCount; + this.regReaders = regReaders; + this.disabled = disabled; + + ShuffleTextBoxes(); + + MainStartState = new double[waterMetersCount]; + AuxStartState = new double[waterMetersCount]; + MainStartStateStr = new string[waterMetersCount]; + AuxStartStateStr = new string[waterMetersCount]; + } + + /// + /// Constructor to fill in end states + /// + /// Number of water meters + /// Information entered on test start (main) + /// Information entered on test start (aux) + /// Information from CycleBeginningForm about availability of water meters + /// Reference volume, it is used to verify the end state, show/hide exclamation if necessary + /// Error limit low, it is used to verify the end state, show/hide exclamation if necessary + /// Error limit high, it is used to verify the end state, show/hide exclamation if necessary + public TestStartEndForm(int waterMetersCount, IRegisterReader[] regReaders, string[] mainStartStateStr, string[] auxStartStateStr, + bool[] disabled, double refVolume, double errLimLo, double errLimHi) + : this() + { + endStates = true; + + this.WaterMetersCount = waterMetersCount; + this.regReaders = regReaders; + if (mainStartStateStr == null || mainStartStateStr.Length != waterMetersCount) + throw (new Exception("Invalid 'mainStartStateStr' argument")); + this.MainStartStateStr = mainStartStateStr; + if (auxStartStateStr == null || auxStartStateStr.Length != waterMetersCount) + throw (new Exception("Invalid 'auxStartStateStr' argument")); + this.AuxStartStateStr = auxStartStateStr; + this.disabled = disabled; + this.refVolume = refVolume; + this.warningLimLo = 2 * errLimLo; + this.warningLimHi = 2 * errLimHi; + + ShuffleTextBoxes(); + + MainEndState = new double[waterMetersCount]; + AuxEndState = new double[waterMetersCount]; + } + + /// + /// Make sure the layout of labels/text boxes on the screen + /// corresponds to the layout of watermeters of the test bench. + /// + void ShuffleTextBoxes() + { + if (Config.Data.CompoundWMsCount < TextBoxesCount) + { + TextBoxesCount = Config.Data.CompoundWMsCount; + } + } + + private void CycleEndForm_Load(object sender, EventArgs e) + { + Localize(); + + //Height = 115 + 90 * WaterMetersCount; + + for (int i = 0; i < TextBoxesCount; i++) + { + if (i < WaterMetersCount) + { + mainLabels[i].Visible = mainStartTextBoxes[i].Visible = mainEndTextBoxes[i].Visible = true; + auxLabels[i].Visible = auxStartTextBoxes[i].Visible = auxEndTextBoxes[i].Visible = true; + } + } + if (TextBoxesCount >= 1) groupBox1.Visible = true; + if (TextBoxesCount >= 2) groupBox2.Visible = true; + if (TextBoxesCount >= 3) groupBox3.Visible = true; + + if (endStates) + { + for (int i = 0; i < TextBoxesCount; i++) + { + if (MainStartStateStr != null && i < MainStartStateStr.Length) + { + mainStartTextBoxes[i].Text = MainStartStateStr[i]; + } + if (AuxStartStateStr != null && i < AuxStartStateStr.Length) + { + auxStartTextBoxes[i].Text = AuxStartStateStr[i]; + } + + if (disabled != null && i < disabled.Length && disabled[i]) + { + mainEndTextBoxes[i].Enabled = false; + auxEndTextBoxes[i].Enabled = false; + } + else + { + mainEndTextBoxes[i].Enabled = true; + auxEndTextBoxes[i].Enabled = true; + enabledTextBoxes.Add(mainEndTextBoxes[i]); + enabledTextBoxes.Add(auxEndTextBoxes[i]); + } + } + } + else + { + for (int i = 0; i < TextBoxesCount; i++) + { + if (disabled != null && i < disabled.Length && disabled[i]) + { + mainStartTextBoxes[i].Enabled = false; + auxStartTextBoxes[i].Enabled = false; + } + else + { + mainStartTextBoxes[i].Enabled = true; + auxStartTextBoxes[i].Enabled = true; + enabledTextBoxes.Add(mainStartTextBoxes[i]); + enabledTextBoxes.Add(auxStartTextBoxes[i]); + } + } + } + } + + void Localize() + { + Text = Strings.Water_Meter_States; + groupBox1.Text = Strings.Water_Meter + " 1"; + groupBox2.Text = Strings.Water_Meter + " 2"; + groupBox3.Text = Strings.Water_Meter + " 3"; + for (int i = 0; i < TextBoxesCount; i++) + { + mainLabels[i].Text = Strings.Main_; + auxLabels[i].Text = Strings.Aux_; + } + startLabel.Text = Strings.Start; + endLabel.Text = Strings.End; + okButton.Text = Strings.OkBtnText; + } + + private void okButton_Click(object sender, EventArgs eArgs) + { + try + { + if (endStates) + { + for (int i = 0; i < Math.Min(WaterMetersCount, TextBoxesCount); i++) + { + if (mainEndTextBoxes[i].Visible && mainEndTextBoxes[i].Enabled) + { + MainEndState[i] = Utils.ParseUDouble(mainEndTextBoxes[i].Text); + } + if (auxEndTextBoxes[i].Visible && auxEndTextBoxes[i].Enabled) + { + AuxEndState[i] = Utils.ParseUDouble(auxEndTextBoxes[i].Text); + } + } + } + else + { + for (int i = 0; i < Math.Min(WaterMetersCount, TextBoxesCount); i++) + { + if (mainStartTextBoxes[i].Visible && mainStartTextBoxes[i].Enabled) + { + MainStartStateStr[i] = mainStartTextBoxes[i].Text; + MainStartState[i] = Utils.ParseUDouble(mainStartTextBoxes[i].Text); + } + if (auxStartTextBoxes[i].Visible && auxStartTextBoxes[i].Enabled) + { + AuxStartStateStr[i] = auxStartTextBoxes[i].Text; + AuxStartState[i] = Utils.ParseUDouble(auxStartTextBoxes[i].Text); + } + } + } + } + catch (Exception e) + { + log.ErrorFormat("Exception: {0}", e.Message); + return; + } + + completed = true; + 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) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + + /// + /// Calculate the approximate error and verify whether it is within limits. + /// Make an exclamation mark visible if out of range. + /// Similar event handler is implemented for all main/auxEndTextBoxes (1..3). + /// + private void main1EndTextBox_TextChanged(object sender, EventArgs e) + { + //double err = 0; + //try + //{ + // double endState = Utils.ParseUDouble(main1EndTextBox.Text); + // double startState = Utils.ParseUDouble(main1StartTextBox.Text); + // err = 100.0 * (endState - startState - refVolume) / refVolume; + //} + //catch { }; + + //main1Exclamation.Visible = (err < warningLimLo) || (warningLimHi < err); + } + + private void aux1EndTextBox_TextChanged(object sender, EventArgs e) + { + //double err = 0; + //try + //{ + // double endState = Utils.ParseUDouble(aux1EndTextBox.Text); + // double startState = Utils.ParseUDouble(aux1StartTextBox.Text); + // err = 100.0 * (endState - startState - refVolume) / refVolume; + //} + //catch { err = 1000.0f; }; + + //aux1Exclamation.Visible = (err < warningLimLo) || (warningLimHi < err); + } + + private void main2EndTextBox_TextChanged(object sender, EventArgs e) + { + //double err = 0; + //try + //{ + // double endState = Utils.ParseUDouble(main2EndTextBox.Text); + // double startState = Utils.ParseUDouble(main2StartTextBox.Text); + // err = 100.0 * (endState - startState - refVolume) / refVolume; + //} + //catch { err = 1000.0f; }; + + //main2Exclamation.Visible = (err < warningLimLo) || (warningLimHi < err); + } + + private void aux2EndTextBox_TextChanged(object sender, EventArgs e) + { + //double err = 0; + //try + //{ + // double endState = Utils.ParseUDouble(aux2EndTextBox.Text); + // double startState = Utils.ParseUDouble(aux2StartTextBox.Text); + // err = 100.0 * (endState - startState - refVolume) / refVolume; + //} + //catch { err = 1000.0f; }; + + //aux2Exclamation.Visible = (err < warningLimLo) || (warningLimHi < err); + } + + private void main3EndTextBox_TextChanged(object sender, EventArgs e) + { + //double err = 0; + //try + //{ + // double endState = Utils.ParseUDouble(main3EndTextBox.Text); + // double startState = Utils.ParseUDouble(main3StartTextBox.Text); + // err = 100.0 * (endState - startState - refVolume) / refVolume; + //} + //catch { err = 1000.0f; }; + + //main3Exclamation.Visible = (err < warningLimLo) || (warningLimHi < err); + } + + private void aux3EndTextBox_TextChanged(object sender, EventArgs e) + { + //double err = 0; + //try + //{ + // double endState = Utils.ParseUDouble(aux3EndTextBox.Text); + // double startState = Utils.ParseUDouble(aux3StartTextBox.Text); + // err = 100.0 * (endState - startState - refVolume) / refVolume; + //} + //catch { err = 1000.0f; }; + + //aux3Exclamation.Visible = (err < warningLimLo) || (warningLimHi < err); + } + + + /// + /// Process a key press within any enabled text boxe + /// + /// + /// + /// TextBox control which received the event + private void ProcKeyPress(object sender, KeyPressEventArgs e, TextBox currentFocusOwner) + { + if (e.KeyChar == '+') + { + /// Process '+' key ..... Form completed + okButton_Click(sender, e); + } + if (e.KeyChar == '\r') + { + /// Process key ..... Next text field + if (enabledTextBoxes.Count < 2) return; /// There is just one enabled textbox + + for (int i = 0; i < enabledTextBoxes.Count; i++) + { + if (enabledTextBoxes[i] == currentFocusOwner) + { + /// Change focus to the next enabled text box + enabledTextBoxes[(i + 1) % enabledTextBoxes.Count].Focus(); + return; + } + } + } + } + + private void main1StartTextBox_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, main1StartTextBox); } + private void main2StartTextBox_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, main2StartTextBox); } + private void main3StartTextBox_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, main3StartTextBox); } + + private void aux1StartTextBox_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, aux1StartTextBox); } + private void aux2StartTextBox_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, aux2StartTextBox); } + private void aux3StartTextBox_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, aux3StartTextBox); } + + private void main1EndTextBox_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, main1EndTextBox); } + private void main2EndTextBox_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, main2EndTextBox); } + private void main3EndTextBox_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, main3EndTextBox); } + + private void aux1EndTextBox_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, aux1EndTextBox); } + private void aux2EndTextBox_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, aux2EndTextBox); } + private void aux3EndTextBox_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, aux3EndTextBox); } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/TestStartEndForm.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/TestStartEndForm.designer.cs new file mode 100644 index 00000000..4cd8bb43 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/TestStartEndForm.designer.cs @@ -0,0 +1,482 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.Combined +{ + partial class TestStartEndForm + { + /// + /// 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() + { + this.aux1Exclamation = new System.Windows.Forms.Label(); + this.aux1StartTextBox = new System.Windows.Forms.TextBox(); + this.aux1EndTextBox = new System.Windows.Forms.TextBox(); + this.aux1Label = new System.Windows.Forms.Label(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.main1Exclamation = new System.Windows.Forms.Label(); + this.main1StartTextBox = new System.Windows.Forms.TextBox(); + this.main1EndTextBox = new System.Windows.Forms.TextBox(); + this.main1Label = new System.Windows.Forms.Label(); + this.okButton = new System.Windows.Forms.Button(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.aux2Exclamation = new System.Windows.Forms.Label(); + this.main2Exclamation = new System.Windows.Forms.Label(); + this.aux2StartTextBox = new System.Windows.Forms.TextBox(); + this.main2StartTextBox = new System.Windows.Forms.TextBox(); + this.aux2EndTextBox = new System.Windows.Forms.TextBox(); + this.aux2Label = new System.Windows.Forms.Label(); + this.main2EndTextBox = new System.Windows.Forms.TextBox(); + this.main2Label = new System.Windows.Forms.Label(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.aux3Exclamation = new System.Windows.Forms.Label(); + this.main3Exclamation = new System.Windows.Forms.Label(); + this.aux3StartTextBox = new System.Windows.Forms.TextBox(); + this.main3StartTextBox = new System.Windows.Forms.TextBox(); + this.aux3EndTextBox = new System.Windows.Forms.TextBox(); + this.aux3Label = new System.Windows.Forms.Label(); + this.main3EndTextBox = new System.Windows.Forms.TextBox(); + this.main3Label = new System.Windows.Forms.Label(); + this.startLabel = new System.Windows.Forms.Label(); + this.endLabel = new System.Windows.Forms.Label(); + this.groupBox1.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.SuspendLayout(); + // + // aux1Exclamation + // + this.aux1Exclamation.AutoSize = true; + this.aux1Exclamation.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.aux1Exclamation.ForeColor = System.Drawing.Color.Red; + this.aux1Exclamation.Location = new System.Drawing.Point(515, 71); + this.aux1Exclamation.Name = "aux1Exclamation"; + this.aux1Exclamation.Size = new System.Drawing.Size(30, 38); + this.aux1Exclamation.TabIndex = 4; + this.aux1Exclamation.Text = "!"; + this.aux1Exclamation.Visible = false; + // + // aux1StartTextBox + // + this.aux1StartTextBox.Enabled = false; + this.aux1StartTextBox.Location = new System.Drawing.Point(164, 75); + this.aux1StartTextBox.Name = "aux1StartTextBox"; + this.aux1StartTextBox.Size = new System.Drawing.Size(163, 31); + this.aux1StartTextBox.TabIndex = 1; + this.aux1StartTextBox.Visible = false; + this.aux1StartTextBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.aux1StartTextBox_KeyPress); + // + // aux1EndTextBox + // + this.aux1EndTextBox.Enabled = false; + this.aux1EndTextBox.Location = new System.Drawing.Point(350, 75); + this.aux1EndTextBox.Name = "aux1EndTextBox"; + this.aux1EndTextBox.Size = new System.Drawing.Size(163, 31); + this.aux1EndTextBox.TabIndex = 3; + this.aux1EndTextBox.Visible = false; + this.aux1EndTextBox.TextChanged += new System.EventHandler(this.aux1EndTextBox_TextChanged); + this.aux1EndTextBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.aux1EndTextBox_KeyPress); + // + // aux1Label + // + this.aux1Label.AutoSize = true; + this.aux1Label.Location = new System.Drawing.Point(18, 78); + this.aux1Label.Name = "aux1Label"; + this.aux1Label.Size = new System.Drawing.Size(55, 23); + this.aux1Label.TabIndex = 0; + this.aux1Label.Text = "Aux:"; + this.aux1Label.Visible = false; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.aux1Exclamation); + this.groupBox1.Controls.Add(this.main1Exclamation); + this.groupBox1.Controls.Add(this.aux1StartTextBox); + this.groupBox1.Controls.Add(this.aux1EndTextBox); + this.groupBox1.Controls.Add(this.main1StartTextBox); + this.groupBox1.Controls.Add(this.aux1Label); + this.groupBox1.Controls.Add(this.main1EndTextBox); + this.groupBox1.Controls.Add(this.main1Label); + this.groupBox1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox1.ForeColor = System.Drawing.Color.Black; + this.groupBox1.Location = new System.Drawing.Point(25, 32); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(547, 124); + this.groupBox1.TabIndex = 1; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Water Meter 1"; + this.groupBox1.Visible = false; + // + // main1Exclamation + // + this.main1Exclamation.AutoSize = true; + this.main1Exclamation.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.main1Exclamation.ForeColor = System.Drawing.Color.Red; + this.main1Exclamation.Location = new System.Drawing.Point(515, 27); + this.main1Exclamation.Name = "main1Exclamation"; + this.main1Exclamation.Size = new System.Drawing.Size(30, 38); + this.main1Exclamation.TabIndex = 3; + this.main1Exclamation.Text = "!"; + this.main1Exclamation.Visible = false; + // + // main1StartTextBox + // + this.main1StartTextBox.Enabled = false; + this.main1StartTextBox.Location = new System.Drawing.Point(164, 31); + this.main1StartTextBox.Name = "main1StartTextBox"; + this.main1StartTextBox.Size = new System.Drawing.Size(163, 31); + this.main1StartTextBox.TabIndex = 0; + this.main1StartTextBox.Visible = false; + this.main1StartTextBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.main1StartTextBox_KeyPress); + // + // main1EndTextBox + // + this.main1EndTextBox.Enabled = false; + this.main1EndTextBox.Location = new System.Drawing.Point(350, 31); + this.main1EndTextBox.Name = "main1EndTextBox"; + this.main1EndTextBox.Size = new System.Drawing.Size(163, 31); + this.main1EndTextBox.TabIndex = 2; + this.main1EndTextBox.Visible = false; + this.main1EndTextBox.TextChanged += new System.EventHandler(this.main1EndTextBox_TextChanged); + this.main1EndTextBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.main1EndTextBox_KeyPress); + // + // main1Label + // + this.main1Label.AutoSize = true; + this.main1Label.Location = new System.Drawing.Point(18, 34); + this.main1Label.Name = "main1Label"; + this.main1Label.Size = new System.Drawing.Size(64, 23); + this.main1Label.TabIndex = 0; + this.main1Label.Text = "Main:"; + this.main1Label.Visible = false; + // + // okButton + // + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(603, 46); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(98, 63); + this.okButton.TabIndex = 4; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.aux2Exclamation); + this.groupBox2.Controls.Add(this.main2Exclamation); + this.groupBox2.Controls.Add(this.aux2StartTextBox); + this.groupBox2.Controls.Add(this.main2StartTextBox); + this.groupBox2.Controls.Add(this.aux2EndTextBox); + this.groupBox2.Controls.Add(this.aux2Label); + this.groupBox2.Controls.Add(this.main2EndTextBox); + this.groupBox2.Controls.Add(this.main2Label); + this.groupBox2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox2.ForeColor = System.Drawing.Color.Black; + this.groupBox2.Location = new System.Drawing.Point(25, 177); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(547, 124); + this.groupBox2.TabIndex = 2; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Water Meter 2"; + this.groupBox2.Visible = false; + // + // aux2Exclamation + // + this.aux2Exclamation.AutoSize = true; + this.aux2Exclamation.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.aux2Exclamation.ForeColor = System.Drawing.Color.Red; + this.aux2Exclamation.Location = new System.Drawing.Point(515, 70); + this.aux2Exclamation.Name = "aux2Exclamation"; + this.aux2Exclamation.Size = new System.Drawing.Size(30, 38); + this.aux2Exclamation.TabIndex = 5; + this.aux2Exclamation.Text = "!"; + this.aux2Exclamation.Visible = false; + // + // main2Exclamation + // + this.main2Exclamation.AutoSize = true; + this.main2Exclamation.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.main2Exclamation.ForeColor = System.Drawing.Color.Red; + this.main2Exclamation.Location = new System.Drawing.Point(515, 27); + this.main2Exclamation.Name = "main2Exclamation"; + this.main2Exclamation.Size = new System.Drawing.Size(30, 38); + this.main2Exclamation.TabIndex = 5; + this.main2Exclamation.Text = "!"; + this.main2Exclamation.Visible = false; + // + // aux2StartTextBox + // + this.aux2StartTextBox.Enabled = false; + this.aux2StartTextBox.Location = new System.Drawing.Point(164, 74); + this.aux2StartTextBox.Name = "aux2StartTextBox"; + this.aux2StartTextBox.Size = new System.Drawing.Size(163, 31); + this.aux2StartTextBox.TabIndex = 1; + this.aux2StartTextBox.Visible = false; + this.aux2StartTextBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.aux2StartTextBox_KeyPress); + // + // main2StartTextBox + // + this.main2StartTextBox.Enabled = false; + this.main2StartTextBox.Location = new System.Drawing.Point(164, 31); + this.main2StartTextBox.Name = "main2StartTextBox"; + this.main2StartTextBox.Size = new System.Drawing.Size(163, 31); + this.main2StartTextBox.TabIndex = 0; + this.main2StartTextBox.Visible = false; + this.main2StartTextBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.main2StartTextBox_KeyPress); + // + // aux2EndTextBox + // + this.aux2EndTextBox.Enabled = false; + this.aux2EndTextBox.Location = new System.Drawing.Point(350, 74); + this.aux2EndTextBox.Name = "aux2EndTextBox"; + this.aux2EndTextBox.Size = new System.Drawing.Size(163, 31); + this.aux2EndTextBox.TabIndex = 3; + this.aux2EndTextBox.Visible = false; + this.aux2EndTextBox.TextChanged += new System.EventHandler(this.aux2EndTextBox_TextChanged); + this.aux2EndTextBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.aux2EndTextBox_KeyPress); + // + // aux2Label + // + this.aux2Label.AutoSize = true; + this.aux2Label.Location = new System.Drawing.Point(18, 77); + this.aux2Label.Name = "aux2Label"; + this.aux2Label.Size = new System.Drawing.Size(55, 23); + this.aux2Label.TabIndex = 0; + this.aux2Label.Text = "Aux:"; + this.aux2Label.Visible = false; + // + // main2EndTextBox + // + this.main2EndTextBox.Enabled = false; + this.main2EndTextBox.Location = new System.Drawing.Point(350, 31); + this.main2EndTextBox.Name = "main2EndTextBox"; + this.main2EndTextBox.Size = new System.Drawing.Size(163, 31); + this.main2EndTextBox.TabIndex = 2; + this.main2EndTextBox.Visible = false; + this.main2EndTextBox.TextChanged += new System.EventHandler(this.main2EndTextBox_TextChanged); + this.main2EndTextBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.main2EndTextBox_KeyPress); + // + // main2Label + // + this.main2Label.AutoSize = true; + this.main2Label.Location = new System.Drawing.Point(18, 34); + this.main2Label.Name = "main2Label"; + this.main2Label.Size = new System.Drawing.Size(64, 23); + this.main2Label.TabIndex = 0; + this.main2Label.Text = "Main:"; + this.main2Label.Visible = false; + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.aux3Exclamation); + this.groupBox3.Controls.Add(this.main3Exclamation); + this.groupBox3.Controls.Add(this.aux3StartTextBox); + this.groupBox3.Controls.Add(this.main3StartTextBox); + this.groupBox3.Controls.Add(this.aux3EndTextBox); + this.groupBox3.Controls.Add(this.aux3Label); + this.groupBox3.Controls.Add(this.main3EndTextBox); + this.groupBox3.Controls.Add(this.main3Label); + this.groupBox3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox3.ForeColor = System.Drawing.Color.Black; + this.groupBox3.Location = new System.Drawing.Point(25, 321); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(547, 124); + this.groupBox3.TabIndex = 3; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "Water Meter 3"; + this.groupBox3.Visible = false; + // + // aux3Exclamation + // + this.aux3Exclamation.AutoSize = true; + this.aux3Exclamation.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.aux3Exclamation.ForeColor = System.Drawing.Color.Red; + this.aux3Exclamation.Location = new System.Drawing.Point(515, 70); + this.aux3Exclamation.Name = "aux3Exclamation"; + this.aux3Exclamation.Size = new System.Drawing.Size(30, 38); + this.aux3Exclamation.TabIndex = 5; + this.aux3Exclamation.Text = "!"; + this.aux3Exclamation.Visible = false; + // + // main3Exclamation + // + this.main3Exclamation.AutoSize = true; + this.main3Exclamation.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.main3Exclamation.ForeColor = System.Drawing.Color.Red; + this.main3Exclamation.Location = new System.Drawing.Point(515, 27); + this.main3Exclamation.Name = "main3Exclamation"; + this.main3Exclamation.Size = new System.Drawing.Size(30, 38); + this.main3Exclamation.TabIndex = 5; + this.main3Exclamation.Text = "!"; + this.main3Exclamation.Visible = false; + // + // aux3StartTextBox + // + this.aux3StartTextBox.Enabled = false; + this.aux3StartTextBox.Location = new System.Drawing.Point(164, 74); + this.aux3StartTextBox.Name = "aux3StartTextBox"; + this.aux3StartTextBox.Size = new System.Drawing.Size(163, 31); + this.aux3StartTextBox.TabIndex = 1; + this.aux3StartTextBox.Visible = false; + this.aux3StartTextBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.aux3StartTextBox_KeyPress); + // + // main3StartTextBox + // + this.main3StartTextBox.Enabled = false; + this.main3StartTextBox.Location = new System.Drawing.Point(164, 31); + this.main3StartTextBox.Name = "main3StartTextBox"; + this.main3StartTextBox.Size = new System.Drawing.Size(163, 31); + this.main3StartTextBox.TabIndex = 0; + this.main3StartTextBox.Visible = false; + this.main3StartTextBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.main3StartTextBox_KeyPress); + // + // aux3EndTextBox + // + this.aux3EndTextBox.Enabled = false; + this.aux3EndTextBox.Location = new System.Drawing.Point(350, 74); + this.aux3EndTextBox.Name = "aux3EndTextBox"; + this.aux3EndTextBox.Size = new System.Drawing.Size(163, 31); + this.aux3EndTextBox.TabIndex = 3; + this.aux3EndTextBox.Visible = false; + this.aux3EndTextBox.TextChanged += new System.EventHandler(this.aux3EndTextBox_TextChanged); + this.aux3EndTextBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.aux3EndTextBox_KeyPress); + // + // aux3Label + // + this.aux3Label.AutoSize = true; + this.aux3Label.Location = new System.Drawing.Point(18, 77); + this.aux3Label.Name = "aux3Label"; + this.aux3Label.Size = new System.Drawing.Size(55, 23); + this.aux3Label.TabIndex = 0; + this.aux3Label.Text = "Aux:"; + this.aux3Label.Visible = false; + // + // main3EndTextBox + // + this.main3EndTextBox.Enabled = false; + this.main3EndTextBox.Location = new System.Drawing.Point(350, 31); + this.main3EndTextBox.Name = "main3EndTextBox"; + this.main3EndTextBox.Size = new System.Drawing.Size(163, 31); + this.main3EndTextBox.TabIndex = 2; + this.main3EndTextBox.Visible = false; + this.main3EndTextBox.TextChanged += new System.EventHandler(this.main3EndTextBox_TextChanged); + this.main3EndTextBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.main3EndTextBox_KeyPress); + // + // main3Label + // + this.main3Label.AutoSize = true; + this.main3Label.Location = new System.Drawing.Point(18, 34); + this.main3Label.Name = "main3Label"; + this.main3Label.Size = new System.Drawing.Size(64, 23); + this.main3Label.TabIndex = 0; + this.main3Label.Text = "Main:"; + this.main3Label.Visible = false; + // + // startLabel + // + this.startLabel.AutoSize = true; + this.startLabel.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startLabel.Location = new System.Drawing.Point(245, 11); + this.startLabel.Name = "startLabel"; + this.startLabel.Size = new System.Drawing.Size(56, 23); + this.startLabel.TabIndex = 5; + this.startLabel.Text = "Start"; + // + // endLabel + // + this.endLabel.AutoSize = true; + this.endLabel.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endLabel.Location = new System.Drawing.Point(431, 11); + this.endLabel.Name = "endLabel"; + this.endLabel.Size = new System.Drawing.Size(46, 23); + this.endLabel.TabIndex = 5; + this.endLabel.Text = "End"; + // + // TestStartEndForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.ClientSize = new System.Drawing.Size(729, 471); + this.Controls.Add(this.endLabel); + this.Controls.Add(this.startLabel); + this.Controls.Add(this.groupBox3); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.okButton); + this.Controls.Add(this.groupBox1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "TestStartEndForm"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "End States"; + this.TopMost = true; + this.Load += new System.EventHandler(this.CycleEndForm_Load); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox aux1EndTextBox; + private System.Windows.Forms.Label aux1Label; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TextBox main1EndTextBox; + private System.Windows.Forms.Label main1Label; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TextBox main2EndTextBox; + private System.Windows.Forms.Label main2Label; + private System.Windows.Forms.TextBox aux2EndTextBox; + private System.Windows.Forms.Label aux2Label; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.TextBox main3EndTextBox; + private System.Windows.Forms.Label main3Label; + private System.Windows.Forms.TextBox aux3EndTextBox; + private System.Windows.Forms.Label aux3Label; + private System.Windows.Forms.TextBox aux1StartTextBox; + private System.Windows.Forms.TextBox main1StartTextBox; + private System.Windows.Forms.TextBox main2StartTextBox; + private System.Windows.Forms.TextBox aux2StartTextBox; + private System.Windows.Forms.TextBox main3StartTextBox; + private System.Windows.Forms.TextBox aux3StartTextBox; + private System.Windows.Forms.Label startLabel; + private System.Windows.Forms.Label endLabel; + private System.Windows.Forms.Label aux1Exclamation; + private System.Windows.Forms.Label main1Exclamation; + private System.Windows.Forms.Label main2Exclamation; + private System.Windows.Forms.Label aux2Exclamation; + private System.Windows.Forms.Label main3Exclamation; + private System.Windows.Forms.Label aux3Exclamation; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/TestStartEndForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/TestStartEndForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Combined/TestStartEndForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/CycleBeginningForm.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/CycleBeginningForm.Designer.cs new file mode 100644 index 00000000..40dc59e7 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/CycleBeginningForm.Designer.cs @@ -0,0 +1,730 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.HeatMeters12 +{ + partial class CycleBeginningForm + { + /// + /// 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(CycleBeginningForm)); + this.okButton = new System.Windows.Forms.Button(); + this.orderGroupBox = new System.Windows.Forms.GroupBox(); + this.orderComboBox = new System.Windows.Forms.ComboBox(); + this.clearButton = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.checkBox1 = new System.Windows.Forms.CheckBox(); + this.checkBox2 = new System.Windows.Forms.CheckBox(); + this.comboBox2 = new System.Windows.Forms.ComboBox(); + this.label2 = new System.Windows.Forms.Label(); + this.checkBox3 = new System.Windows.Forms.CheckBox(); + this.comboBox3 = new System.Windows.Forms.ComboBox(); + this.label3 = new System.Windows.Forms.Label(); + this.checkBox4 = new System.Windows.Forms.CheckBox(); + this.comboBox4 = new System.Windows.Forms.ComboBox(); + this.label4 = new System.Windows.Forms.Label(); + this.checkBox5 = new System.Windows.Forms.CheckBox(); + this.comboBox5 = new System.Windows.Forms.ComboBox(); + this.label5 = new System.Windows.Forms.Label(); + this.checkBox6 = new System.Windows.Forms.CheckBox(); + this.comboBox6 = new System.Windows.Forms.ComboBox(); + this.label6 = new System.Windows.Forms.Label(); + this.checkBox7 = new System.Windows.Forms.CheckBox(); + this.comboBox7 = new System.Windows.Forms.ComboBox(); + this.label7 = new System.Windows.Forms.Label(); + this.checkBox8 = new System.Windows.Forms.CheckBox(); + this.comboBox8 = new System.Windows.Forms.ComboBox(); + this.label8 = new System.Windows.Forms.Label(); + this.checkBox9 = new System.Windows.Forms.CheckBox(); + this.comboBox9 = new System.Windows.Forms.ComboBox(); + this.label9 = new System.Windows.Forms.Label(); + this.checkBox10 = new System.Windows.Forms.CheckBox(); + this.comboBox10 = new System.Windows.Forms.ComboBox(); + this.label10 = new System.Windows.Forms.Label(); + this.checkBox11 = new System.Windows.Forms.CheckBox(); + this.comboBox11 = new System.Windows.Forms.ComboBox(); + this.label11 = new System.Windows.Forms.Label(); + this.checkBox12 = new System.Windows.Forms.CheckBox(); + this.comboBox12 = new System.Windows.Forms.ComboBox(); + this.label12 = new System.Windows.Forms.Label(); + this.extensionsGroupBox = new System.Windows.Forms.GroupBox(); + this.remarkTextBox = new System.Windows.Forms.TextBox(); + this.label16 = new System.Windows.Forms.Label(); + this.snSuffixTextBox = new System.Windows.Forms.TextBox(); + this.label15 = new System.Windows.Forms.Label(); + this.snPrefixTextBox = new System.Windows.Forms.TextBox(); + this.label14 = new System.Windows.Forms.Label(); + this.idNumberTextBox = new System.Windows.Forms.TextBox(); + this.label13 = new System.Windows.Forms.Label(); + this.ext4Label = new System.Windows.Forms.Label(); + this.ext4TextBox = new System.Windows.Forms.TextBox(); + this.ext3Label = new System.Windows.Forms.Label(); + this.ext3TextBox = new System.Windows.Forms.TextBox(); + this.ext2Label = new System.Windows.Forms.Label(); + this.ext2TextBox = new System.Windows.Forms.TextBox(); + this.ext1Label = new System.Windows.Forms.Label(); + this.ext1TextBox = new System.Windows.Forms.TextBox(); + this.autoSNButton = new System.Windows.Forms.Button(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.pictureBox2 = new System.Windows.Forms.PictureBox(); + this.pictureBox3 = new System.Windows.Forms.PictureBox(); + this.pictureBox4 = new System.Windows.Forms.PictureBox(); + this.pictureBox5 = new System.Windows.Forms.PictureBox(); + this.pictureBox6 = new System.Windows.Forms.PictureBox(); + this.pictureBox7 = new System.Windows.Forms.PictureBox(); + this.pictureBox8 = new System.Windows.Forms.PictureBox(); + this.pictureBox9 = new System.Windows.Forms.PictureBox(); + this.pictureBox10 = new System.Windows.Forms.PictureBox(); + this.pictureBox11 = new System.Windows.Forms.PictureBox(); + this.pictureBox12 = new System.Windows.Forms.PictureBox(); + this.orderGroupBox.SuspendLayout(); + this.extensionsGroupBox.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox5)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox6)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox7)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox8)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox9)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox10)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox11)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox12)).BeginInit(); + this.SuspendLayout(); + // + // okButton + // + resources.ApplyResources(this.okButton, "okButton"); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Name = "okButton"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // orderGroupBox + // + this.orderGroupBox.Controls.Add(this.orderComboBox); + resources.ApplyResources(this.orderGroupBox, "orderGroupBox"); + this.orderGroupBox.ForeColor = System.Drawing.Color.Black; + this.orderGroupBox.Name = "orderGroupBox"; + this.orderGroupBox.TabStop = false; + // + // orderComboBox + // + this.orderComboBox.FormattingEnabled = true; + resources.ApplyResources(this.orderComboBox, "orderComboBox"); + this.orderComboBox.Name = "orderComboBox"; + // + // clearButton + // + resources.ApplyResources(this.clearButton, "clearButton"); + this.clearButton.ForeColor = System.Drawing.Color.Black; + this.clearButton.Name = "clearButton"; + this.clearButton.UseVisualStyleBackColor = true; + this.clearButton.Click += new System.EventHandler(this.clearButton_Click); + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // comboBox1 + // + resources.ApplyResources(this.comboBox1, "comboBox1"); + this.comboBox1.FormattingEnabled = true; + this.comboBox1.Name = "comboBox1"; + this.comboBox1.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged); + this.comboBox1.TextChanged += new System.EventHandler(this.comboBox1_TextChanged); + this.comboBox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox1_KeyPress); + // + // checkBox1 + // + resources.ApplyResources(this.checkBox1, "checkBox1"); + this.checkBox1.Name = "checkBox1"; + this.checkBox1.UseVisualStyleBackColor = true; + // + // checkBox2 + // + resources.ApplyResources(this.checkBox2, "checkBox2"); + this.checkBox2.Name = "checkBox2"; + this.checkBox2.UseVisualStyleBackColor = true; + // + // comboBox2 + // + resources.ApplyResources(this.comboBox2, "comboBox2"); + this.comboBox2.FormattingEnabled = true; + this.comboBox2.Name = "comboBox2"; + this.comboBox2.SelectedIndexChanged += new System.EventHandler(this.comboBox2_SelectedIndexChanged); + this.comboBox2.TextChanged += new System.EventHandler(this.comboBox2_TextChanged); + this.comboBox2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox2_KeyPress); + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // checkBox3 + // + resources.ApplyResources(this.checkBox3, "checkBox3"); + this.checkBox3.Name = "checkBox3"; + this.checkBox3.UseVisualStyleBackColor = true; + // + // comboBox3 + // + resources.ApplyResources(this.comboBox3, "comboBox3"); + this.comboBox3.FormattingEnabled = true; + this.comboBox3.Name = "comboBox3"; + this.comboBox3.SelectedIndexChanged += new System.EventHandler(this.comboBox3_SelectedIndexChanged); + this.comboBox3.TextChanged += new System.EventHandler(this.comboBox3_TextChanged); + this.comboBox3.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox3_KeyPress); + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // + // checkBox4 + // + resources.ApplyResources(this.checkBox4, "checkBox4"); + this.checkBox4.Name = "checkBox4"; + this.checkBox4.UseVisualStyleBackColor = true; + // + // comboBox4 + // + resources.ApplyResources(this.comboBox4, "comboBox4"); + this.comboBox4.FormattingEnabled = true; + this.comboBox4.Name = "comboBox4"; + this.comboBox4.SelectedIndexChanged += new System.EventHandler(this.comboBox4_SelectedIndexChanged); + this.comboBox4.TextChanged += new System.EventHandler(this.comboBox4_TextChanged); + this.comboBox4.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox4_KeyPress); + // + // label4 + // + resources.ApplyResources(this.label4, "label4"); + this.label4.Name = "label4"; + // + // checkBox5 + // + resources.ApplyResources(this.checkBox5, "checkBox5"); + this.checkBox5.Name = "checkBox5"; + this.checkBox5.UseVisualStyleBackColor = true; + // + // comboBox5 + // + resources.ApplyResources(this.comboBox5, "comboBox5"); + this.comboBox5.FormattingEnabled = true; + this.comboBox5.Name = "comboBox5"; + this.comboBox5.SelectedIndexChanged += new System.EventHandler(this.comboBox5_SelectedIndexChanged); + this.comboBox5.TextChanged += new System.EventHandler(this.comboBox5_TextChanged); + this.comboBox5.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox5_KeyPress); + // + // label5 + // + resources.ApplyResources(this.label5, "label5"); + this.label5.Name = "label5"; + // + // checkBox6 + // + resources.ApplyResources(this.checkBox6, "checkBox6"); + this.checkBox6.Name = "checkBox6"; + this.checkBox6.UseVisualStyleBackColor = true; + // + // comboBox6 + // + resources.ApplyResources(this.comboBox6, "comboBox6"); + this.comboBox6.FormattingEnabled = true; + this.comboBox6.Name = "comboBox6"; + this.comboBox6.SelectedIndexChanged += new System.EventHandler(this.comboBox6_SelectedIndexChanged); + this.comboBox6.TextChanged += new System.EventHandler(this.comboBox6_TextChanged); + this.comboBox6.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox6_KeyPress); + // + // label6 + // + resources.ApplyResources(this.label6, "label6"); + this.label6.Name = "label6"; + // + // checkBox7 + // + resources.ApplyResources(this.checkBox7, "checkBox7"); + this.checkBox7.Name = "checkBox7"; + this.checkBox7.UseVisualStyleBackColor = true; + // + // comboBox7 + // + resources.ApplyResources(this.comboBox7, "comboBox7"); + this.comboBox7.FormattingEnabled = true; + this.comboBox7.Name = "comboBox7"; + this.comboBox7.SelectedIndexChanged += new System.EventHandler(this.comboBox7_SelectedIndexChanged); + this.comboBox7.TextChanged += new System.EventHandler(this.comboBox7_TextChanged); + this.comboBox7.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox7_KeyPress); + // + // label7 + // + resources.ApplyResources(this.label7, "label7"); + this.label7.Name = "label7"; + // + // checkBox8 + // + resources.ApplyResources(this.checkBox8, "checkBox8"); + this.checkBox8.Name = "checkBox8"; + this.checkBox8.UseVisualStyleBackColor = true; + // + // comboBox8 + // + resources.ApplyResources(this.comboBox8, "comboBox8"); + this.comboBox8.FormattingEnabled = true; + this.comboBox8.Name = "comboBox8"; + this.comboBox8.SelectedIndexChanged += new System.EventHandler(this.comboBox8_SelectedIndexChanged); + this.comboBox8.TextChanged += new System.EventHandler(this.comboBox8_TextChanged); + this.comboBox8.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox8_KeyPress); + // + // label8 + // + resources.ApplyResources(this.label8, "label8"); + this.label8.Name = "label8"; + // + // checkBox9 + // + resources.ApplyResources(this.checkBox9, "checkBox9"); + this.checkBox9.Name = "checkBox9"; + this.checkBox9.UseVisualStyleBackColor = true; + // + // comboBox9 + // + resources.ApplyResources(this.comboBox9, "comboBox9"); + this.comboBox9.FormattingEnabled = true; + this.comboBox9.Name = "comboBox9"; + this.comboBox9.SelectedIndexChanged += new System.EventHandler(this.comboBox9_SelectedIndexChanged); + this.comboBox9.TextChanged += new System.EventHandler(this.comboBox9_TextChanged); + this.comboBox9.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox9_KeyPress); + // + // label9 + // + resources.ApplyResources(this.label9, "label9"); + this.label9.Name = "label9"; + // + // checkBox10 + // + resources.ApplyResources(this.checkBox10, "checkBox10"); + this.checkBox10.Name = "checkBox10"; + this.checkBox10.UseVisualStyleBackColor = true; + // + // comboBox10 + // + resources.ApplyResources(this.comboBox10, "comboBox10"); + this.comboBox10.FormattingEnabled = true; + this.comboBox10.Name = "comboBox10"; + this.comboBox10.SelectedIndexChanged += new System.EventHandler(this.comboBox10_SelectedIndexChanged); + this.comboBox10.TextChanged += new System.EventHandler(this.comboBox10_TextChanged); + this.comboBox10.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox10_KeyPress); + // + // label10 + // + resources.ApplyResources(this.label10, "label10"); + this.label10.Name = "label10"; + // + // checkBox11 + // + resources.ApplyResources(this.checkBox11, "checkBox11"); + this.checkBox11.Name = "checkBox11"; + this.checkBox11.UseVisualStyleBackColor = true; + // + // comboBox11 + // + resources.ApplyResources(this.comboBox11, "comboBox11"); + this.comboBox11.FormattingEnabled = true; + this.comboBox11.Name = "comboBox11"; + this.comboBox11.SelectedIndexChanged += new System.EventHandler(this.comboBox11_SelectedIndexChanged); + this.comboBox11.TextChanged += new System.EventHandler(this.comboBox11_TextChanged); + this.comboBox11.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox11_KeyPress); + // + // label11 + // + resources.ApplyResources(this.label11, "label11"); + this.label11.Name = "label11"; + // + // checkBox12 + // + resources.ApplyResources(this.checkBox12, "checkBox12"); + this.checkBox12.Name = "checkBox12"; + this.checkBox12.UseVisualStyleBackColor = true; + // + // comboBox12 + // + resources.ApplyResources(this.comboBox12, "comboBox12"); + this.comboBox12.FormattingEnabled = true; + this.comboBox12.Name = "comboBox12"; + this.comboBox12.SelectedIndexChanged += new System.EventHandler(this.comboBox12_SelectedIndexChanged); + this.comboBox12.TextChanged += new System.EventHandler(this.comboBox12_TextChanged); + this.comboBox12.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox12_KeyPress); + // + // label12 + // + resources.ApplyResources(this.label12, "label12"); + this.label12.Name = "label12"; + // + // extensionsGroupBox + // + this.extensionsGroupBox.Controls.Add(this.remarkTextBox); + this.extensionsGroupBox.Controls.Add(this.label16); + this.extensionsGroupBox.Controls.Add(this.snSuffixTextBox); + this.extensionsGroupBox.Controls.Add(this.label15); + this.extensionsGroupBox.Controls.Add(this.snPrefixTextBox); + this.extensionsGroupBox.Controls.Add(this.label14); + this.extensionsGroupBox.Controls.Add(this.idNumberTextBox); + this.extensionsGroupBox.Controls.Add(this.label13); + this.extensionsGroupBox.Controls.Add(this.ext4Label); + this.extensionsGroupBox.Controls.Add(this.ext4TextBox); + this.extensionsGroupBox.Controls.Add(this.ext3Label); + this.extensionsGroupBox.Controls.Add(this.ext3TextBox); + this.extensionsGroupBox.Controls.Add(this.ext2Label); + this.extensionsGroupBox.Controls.Add(this.ext2TextBox); + this.extensionsGroupBox.Controls.Add(this.ext1Label); + this.extensionsGroupBox.Controls.Add(this.ext1TextBox); + resources.ApplyResources(this.extensionsGroupBox, "extensionsGroupBox"); + this.extensionsGroupBox.Name = "extensionsGroupBox"; + this.extensionsGroupBox.TabStop = false; + // + // remarkTextBox + // + resources.ApplyResources(this.remarkTextBox, "remarkTextBox"); + this.remarkTextBox.Name = "remarkTextBox"; + // + // label16 + // + resources.ApplyResources(this.label16, "label16"); + this.label16.Name = "label16"; + // + // snSuffixTextBox + // + resources.ApplyResources(this.snSuffixTextBox, "snSuffixTextBox"); + this.snSuffixTextBox.Name = "snSuffixTextBox"; + // + // label15 + // + resources.ApplyResources(this.label15, "label15"); + this.label15.Name = "label15"; + // + // snPrefixTextBox + // + resources.ApplyResources(this.snPrefixTextBox, "snPrefixTextBox"); + this.snPrefixTextBox.Name = "snPrefixTextBox"; + // + // label14 + // + resources.ApplyResources(this.label14, "label14"); + this.label14.Name = "label14"; + // + // idNumberTextBox + // + resources.ApplyResources(this.idNumberTextBox, "idNumberTextBox"); + this.idNumberTextBox.Name = "idNumberTextBox"; + // + // label13 + // + resources.ApplyResources(this.label13, "label13"); + this.label13.Name = "label13"; + // + // ext4Label + // + resources.ApplyResources(this.ext4Label, "ext4Label"); + this.ext4Label.Name = "ext4Label"; + // + // ext4TextBox + // + resources.ApplyResources(this.ext4TextBox, "ext4TextBox"); + this.ext4TextBox.Name = "ext4TextBox"; + // + // ext3Label + // + resources.ApplyResources(this.ext3Label, "ext3Label"); + this.ext3Label.Name = "ext3Label"; + // + // ext3TextBox + // + resources.ApplyResources(this.ext3TextBox, "ext3TextBox"); + this.ext3TextBox.Name = "ext3TextBox"; + // + // ext2Label + // + resources.ApplyResources(this.ext2Label, "ext2Label"); + this.ext2Label.Name = "ext2Label"; + // + // ext2TextBox + // + resources.ApplyResources(this.ext2TextBox, "ext2TextBox"); + this.ext2TextBox.Name = "ext2TextBox"; + // + // ext1Label + // + resources.ApplyResources(this.ext1Label, "ext1Label"); + this.ext1Label.Name = "ext1Label"; + // + // ext1TextBox + // + resources.ApplyResources(this.ext1TextBox, "ext1TextBox"); + this.ext1TextBox.Name = "ext1TextBox"; + this.ext1TextBox.TextChanged += new System.EventHandler(this.ext1TextBox_TextChanged); + // + // autoSNButton + // + resources.ApplyResources(this.autoSNButton, "autoSNButton"); + this.autoSNButton.ForeColor = System.Drawing.Color.Black; + this.autoSNButton.Name = "autoSNButton"; + this.autoSNButton.UseVisualStyleBackColor = true; + this.autoSNButton.Click += new System.EventHandler(this.autoSNButton_Click); + // + // pictureBox1 + // + resources.ApplyResources(this.pictureBox1, "pictureBox1"); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.TabStop = false; + // + // pictureBox2 + // + resources.ApplyResources(this.pictureBox2, "pictureBox2"); + this.pictureBox2.Name = "pictureBox2"; + this.pictureBox2.TabStop = false; + // + // pictureBox3 + // + resources.ApplyResources(this.pictureBox3, "pictureBox3"); + this.pictureBox3.Name = "pictureBox3"; + this.pictureBox3.TabStop = false; + // + // pictureBox4 + // + resources.ApplyResources(this.pictureBox4, "pictureBox4"); + this.pictureBox4.Name = "pictureBox4"; + this.pictureBox4.TabStop = false; + // + // pictureBox5 + // + resources.ApplyResources(this.pictureBox5, "pictureBox5"); + this.pictureBox5.Name = "pictureBox5"; + this.pictureBox5.TabStop = false; + // + // pictureBox6 + // + resources.ApplyResources(this.pictureBox6, "pictureBox6"); + this.pictureBox6.Name = "pictureBox6"; + this.pictureBox6.TabStop = false; + // + // pictureBox7 + // + resources.ApplyResources(this.pictureBox7, "pictureBox7"); + this.pictureBox7.Name = "pictureBox7"; + this.pictureBox7.TabStop = false; + // + // pictureBox8 + // + resources.ApplyResources(this.pictureBox8, "pictureBox8"); + this.pictureBox8.Name = "pictureBox8"; + this.pictureBox8.TabStop = false; + // + // pictureBox9 + // + resources.ApplyResources(this.pictureBox9, "pictureBox9"); + this.pictureBox9.Name = "pictureBox9"; + this.pictureBox9.TabStop = false; + // + // pictureBox10 + // + resources.ApplyResources(this.pictureBox10, "pictureBox10"); + this.pictureBox10.Name = "pictureBox10"; + this.pictureBox10.TabStop = false; + // + // pictureBox11 + // + resources.ApplyResources(this.pictureBox11, "pictureBox11"); + this.pictureBox11.Name = "pictureBox11"; + this.pictureBox11.TabStop = false; + // + // pictureBox12 + // + resources.ApplyResources(this.pictureBox12, "pictureBox12"); + this.pictureBox12.Name = "pictureBox12"; + this.pictureBox12.TabStop = false; + // + // CycleBeginningForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + 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.autoSNButton); + this.Controls.Add(this.extensionsGroupBox); + this.Controls.Add(this.checkBox12); + this.Controls.Add(this.comboBox12); + this.Controls.Add(this.label12); + this.Controls.Add(this.checkBox11); + this.Controls.Add(this.comboBox11); + this.Controls.Add(this.label11); + this.Controls.Add(this.checkBox10); + this.Controls.Add(this.comboBox10); + this.Controls.Add(this.label10); + this.Controls.Add(this.checkBox9); + this.Controls.Add(this.comboBox9); + this.Controls.Add(this.label9); + this.Controls.Add(this.checkBox8); + this.Controls.Add(this.comboBox8); + this.Controls.Add(this.label8); + this.Controls.Add(this.checkBox7); + this.Controls.Add(this.comboBox7); + this.Controls.Add(this.label7); + this.Controls.Add(this.checkBox6); + this.Controls.Add(this.comboBox6); + this.Controls.Add(this.label6); + this.Controls.Add(this.checkBox5); + this.Controls.Add(this.comboBox5); + this.Controls.Add(this.label5); + this.Controls.Add(this.checkBox4); + this.Controls.Add(this.comboBox4); + this.Controls.Add(this.label4); + this.Controls.Add(this.checkBox3); + this.Controls.Add(this.comboBox3); + this.Controls.Add(this.label3); + this.Controls.Add(this.checkBox2); + this.Controls.Add(this.comboBox2); + this.Controls.Add(this.label2); + this.Controls.Add(this.checkBox1); + this.Controls.Add(this.comboBox1); + this.Controls.Add(this.label1); + this.Controls.Add(this.clearButton); + this.Controls.Add(this.orderGroupBox); + this.Controls.Add(this.okButton); + this.ForeColor = System.Drawing.Color.Black; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "CycleBeginningForm"; + this.TopMost = true; + this.Load += new System.EventHandler(this.CycleBeginningForm_Load); + this.orderGroupBox.ResumeLayout(false); + this.extensionsGroupBox.ResumeLayout(false); + this.extensionsGroupBox.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox5)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox6)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox7)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox8)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox9)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox10)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox11)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox12)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.GroupBox orderGroupBox; + private System.Windows.Forms.ComboBox orderComboBox; + private System.Windows.Forms.Button clearButton; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox comboBox1; + private System.Windows.Forms.CheckBox checkBox1; + private System.Windows.Forms.CheckBox checkBox2; + private System.Windows.Forms.ComboBox comboBox2; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.CheckBox checkBox3; + private System.Windows.Forms.ComboBox comboBox3; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.CheckBox checkBox4; + private System.Windows.Forms.ComboBox comboBox4; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.CheckBox checkBox5; + private System.Windows.Forms.ComboBox comboBox5; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.CheckBox checkBox6; + private System.Windows.Forms.ComboBox comboBox6; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.CheckBox checkBox7; + private System.Windows.Forms.ComboBox comboBox7; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.CheckBox checkBox8; + private System.Windows.Forms.ComboBox comboBox8; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.CheckBox checkBox9; + private System.Windows.Forms.ComboBox comboBox9; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.CheckBox checkBox10; + private System.Windows.Forms.ComboBox comboBox10; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.CheckBox checkBox11; + private System.Windows.Forms.ComboBox comboBox11; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.CheckBox checkBox12; + private System.Windows.Forms.ComboBox comboBox12; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.GroupBox extensionsGroupBox; + private System.Windows.Forms.Label ext4Label; + private System.Windows.Forms.TextBox ext4TextBox; + private System.Windows.Forms.Label ext3Label; + private System.Windows.Forms.TextBox ext3TextBox; + private System.Windows.Forms.Label ext2Label; + private System.Windows.Forms.TextBox ext2TextBox; + private System.Windows.Forms.Label ext1Label; + private System.Windows.Forms.TextBox ext1TextBox; + private System.Windows.Forms.TextBox remarkTextBox; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.TextBox snSuffixTextBox; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.TextBox snPrefixTextBox; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.TextBox idNumberTextBox; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.Button autoSNButton; + 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; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/CycleBeginningForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/CycleBeginningForm.cs new file mode 100644 index 00000000..f2296f80 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/CycleBeginningForm.cs @@ -0,0 +1,530 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Windows.Forms; +using log4net; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.HeatMeters12 +{ + public partial class CycleBeginningForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(CycleBeginningForm)); + + readonly Results.Entities.WaterMeter[] WaterMeters; + + /// Number of water meters + public readonly int WaterMetersCount; + public readonly bool AtTheEnd; + public readonly bool SensusExtensions; + + /// To be retrieved after the form is closed + public string PurchaseOrder; + public string[] SNText; + public bool[] Disabled; + + public string IdNumber; + public string SnPrefix; + public string SnSuffix; + public string Remark; + + /// Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + /// Number of text boxes for serial numbers + int textBoxesCount; + Label[] labels; + ComboBox[] comboBoxes; + CheckBox[] checkBoxes; + PictureBox[] pictureBoxes; + IList enabledComboBoxes; + + + /// Parameterless constructor for common functionality + public CycleBeginningForm() + { + InitializeComponent(); + ControlBox = false; + + labels = new Label[] { label1, label2, label3, label4, label5, label6, + label7, label8, label9, label10, label11, label12 }; + + comboBoxes = new ComboBox[] { comboBox1, comboBox2, comboBox3, comboBox4, comboBox5, comboBox6, + comboBox7, comboBox8, comboBox9, comboBox10, comboBox11, comboBox12 }; + + checkBoxes = new CheckBox[] { checkBox1, checkBox2, checkBox3, checkBox4, checkBox5, checkBox6, + checkBox7, checkBox8, checkBox9, checkBox10, checkBox11, checkBox12 }; + + pictureBoxes = new PictureBox[] { pictureBox1, pictureBox2, pictureBox3, pictureBox4, pictureBox5, pictureBox6, + pictureBox7, pictureBox8, pictureBox9, pictureBox10, pictureBox11, pictureBox12 }; + + if (labels.Length != comboBoxes.Length || labels.Length != checkBoxes.Length) throw new Exception("Error in CycleBeginningForm()"); + + textBoxesCount = labels.Length; + + enabledComboBoxes = new List(); + + completed = false; + StartForceCloseHandler(); + } + + /// + /// Constructor + /// + /// Number of text boxes for serial numbers + public CycleBeginningForm(Results.Entities.WaterMeter[] waterMeters, bool atTheEnd, bool sensusExtensions) + : this() + { + this.WaterMeters = waterMeters; + this.WaterMetersCount = waterMeters.Length; + this.AtTheEnd = atTheEnd; + this.SensusExtensions = sensusExtensions; + SNText = new string[WaterMetersCount]; + Disabled = new bool[WaterMetersCount]; + + ShuffleTextBoxes(Config.Data.WMsCount, Config.Data.LineSize); + + foreach (var wm in WaterMeters) if (wm != null) wm.Passed = wm.PassedFromTests(); + + Height = 147 + WaterMetersCount * 45; /// Adjust the window size + + if (sensusExtensions) + { + if (Height < 605) Height = 605; /// Minimum height for the extensionsGroupBox + } + else + { + /// Hide extensionsGroupBox, etc. + int delta = extensionsGroupBox.Width + 45; + okButton.Left -= delta; + clearButton.Left -= delta; + Width -= delta; + extensionsGroupBox.Visible = false; + autoSNButton.Visible = false; + } + } + + /// + /// 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) + { + if (wmsCount < textBoxesCount && lineSize > 0) + { + int nrLines = (wmsCount + lineSize - 1) / lineSize; + int gap = (textBoxesCount - wmsCount) / nrLines; + + int dest = 0; + for (int l = 0; l < nrLines; l++) + { + for (int i = 0; i < lineSize; i++) + { + labels[dest] = labels[l * lineSize + l * gap + i]; + comboBoxes[dest] = comboBoxes[l * lineSize + l * gap + i]; + checkBoxes[dest] = checkBoxes[l * lineSize + l * gap + i]; + pictureBoxes[dest] = pictureBoxes[l * lineSize + l * gap + i]; + dest++; + } + } + textBoxesCount = wmsCount; + } + } + + private void CycleBeginningForm_Load(object sender, EventArgs e) + { + Localize(); + + PrepareOrderCombo(orderComboBox); + + for (int i = 0; i < textBoxesCount; i++) + { + if (Program.LocalSettings.LastSNTextsCount == textBoxesCount) + { + comboBoxes[i].Items.Add((Program.LocalSettings.LastSNTexts[i] == null) ? string.Empty : Program.LocalSettings.LastSNTexts[i]); + } + labels[i].Visible = comboBoxes[i].Visible = checkBoxes[i].Visible = true; + enabledComboBoxes.Add(comboBoxes[i]); + if (AtTheEnd) + { + pictureBoxes[i].Visible = true; + } + } + + UpdateIcons(); + + if (SensusExtensions) + { + idNumberTextBox.Text = (Program.LocalSettings.LastText1 == null) ? string.Empty : Program.LocalSettings.LastText1; + snPrefixTextBox.Text = (Program.LocalSettings.LastText2 == null) ? string.Empty : Program.LocalSettings.LastText2; + snSuffixTextBox.Text = (Program.LocalSettings.LastText3 == null) ? string.Empty : Program.LocalSettings.LastText3; + remarkTextBox.Text = (Program.LocalSettings.LastRemark == null) ? string.Empty : Program.LocalSettings.LastRemark; + } + } + + void Localize() + { + Text = Strings.Data; + orderGroupBox.Text = Strings.Purchase_order; + for (int i = 0; i < textBoxesCount; i++) + { + labels[i].Text = Strings.Serial_Number + " " + (i + 1).ToString(); + } + okButton.Text = Strings.OkBtnText; + clearButton.Text = Strings.ClearBtnText; + } + + /// + /// Load Purchase order combo box items from the LocalSettings PurchaseOrderHistory array + /// + /// Puchase order ComboBox + void PrepareOrderCombo(ComboBox orderComboBox) + { + for (int i = 0; i < Program.LocalSettings.PurchaseOrderHistoryCount; i++) + { + orderComboBox.Items.Add(Program.LocalSettings.PurchaseOrderHistory[i]); + } + + if (orderComboBox.Items.Count > 0) + { + orderComboBox.Text = orderComboBox.Items[0].ToString(); + } + } + + void UpdateIcons() + { + Image imgP = null; + Image imgF = null; + Image imgP2 = null; + Image imgF2 = null; + + int nrRedone = 0; + if (SensusExtensions) + { + if (!int.TryParse(ext1TextBox.Text, out nrRedone) || nrRedone < 0 || nrRedone > WaterMetersCount) + { + nrRedone = 0; + } + } + + for (int i = 0; i < WaterMetersCount; i++) + { + Results.Entities.WaterMeter wm = WaterMeters[i]; + if (wm == null) + { + checkBoxes[i].Checked = true; + } + else if (AtTheEnd) + { + if (imgP == null || imgF == null || imgP2 == null || imgF2 == null) + { + imgP = Properties.Resources.TestPassedImage; /// Passed + imgF = Properties.Resources.TestFailedImage; /// Failed + imgP2 = Properties.Resources.TestPassedImage2; /// Passed after re-work + imgF2 = Properties.Resources.TestFailedImage2; /// Failed after re-work + } + + pictureBoxes[i].Image = (WaterMetersCount - i > nrRedone) ? (wm.Passed ? imgP : imgF) : (wm.Passed ? imgP2 : imgF2); + } + } + } + + private void okButton_Click(object sender, EventArgs e) + { + PurchaseOrder = orderComboBox.Text; + Program.LocalSettings.UpdateHistory(orderComboBox.Text, + ref Program.LocalSettings.PurchaseOrderHistory +#if FUZHOU150 || FUZHOU300 + , 20 +#endif + ); + + Program.LocalSettings.LastSNTexts = SNText; + + for (int i = 0; i < Math.Min(WaterMetersCount, textBoxesCount); i++) + { + SNText[i] = comboBoxes[i].Text; + Disabled[i] = !checkBoxes[i].Checked; + } + + if (SensusExtensions) + { + int nrRedone = 0; + if (SensusExtensions) + { + if (!int.TryParse(ext1TextBox.Text, out nrRedone) || nrRedone < 0 || nrRedone > WaterMetersCount) + { + nrRedone = 0; + } + } + + Program.LocalSettings.LastText1 = IdNumber = string.IsNullOrEmpty(idNumberTextBox.Text) ? null : idNumberTextBox.Text; + Program.LocalSettings.LastText2 = SnPrefix = string.IsNullOrEmpty(snPrefixTextBox.Text) ? null : snPrefixTextBox.Text; + Program.LocalSettings.LastText3 = SnSuffix = string.IsNullOrEmpty(snSuffixTextBox.Text) ? null : snSuffixTextBox.Text; + Program.LocalSettings.LastRemark = Remark = string.IsNullOrEmpty(remarkTextBox.Text) ? null : remarkTextBox.Text; + + for (int i = 0; i < WaterMetersCount; i++) + { + Results.Entities.WaterMeter wm = WaterMeters[i]; + { + if (wm != null) + { + bool pressureTestPassed = false; + foreach (var mtr in wm.MeterTestRslts) + { + if ((mtr.Method().Equals("PMax-Test") || mtr.Method().Equals("Leak-Test")) && mtr.Passed) + { + pressureTestPassed = true; + break; + } + } + wm.WaterMeterData.Text1 = IdNumber; + wm.WaterMeterData.Text2 = SnPrefix; + wm.WaterMeterData.Text3 = SnSuffix; + wm.Batch.Remark = Remark; + wm.ResultCode = 32 + (wm.Passed ? 0 : 1) + (pressureTestPassed ? 64 : 0) + ((WaterMetersCount - i <= nrRedone) ? 128 : 0); + } + } + } + } + + completed = true; + Close(); + } + + /// + /// When one combo box is updated using drop-down menu, all combo boxes + /// are updated by this function. + /// + private void UpdateAllCombos() + { + for (int i = 0; i < Math.Min(WaterMetersCount, textBoxesCount); i++) + { + comboBoxes[i].Text = Program.LocalSettings.LastSNTexts[i]; + checkBoxes[i].Checked = !string.IsNullOrEmpty(comboBoxes[i].Text); + } + } + + private void clearButton_Click(object sender, EventArgs e) + { + for (int i = 0; i < Math.Min(WaterMetersCount, textBoxesCount); i++) + { + comboBoxes[i].Text = string.Empty; + checkBoxes[i].Checked = false; + } + } + + + private void comboBox1_TextChanged(object sender, EventArgs e) { checkBox1.Checked = true; } + private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox1.Text.Equals(comboBox1.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox2_TextChanged(object sender, EventArgs e) { checkBox2.Checked = true; } + private void comboBox2_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox2.Text.Equals(comboBox2.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox3_TextChanged(object sender, EventArgs e) { checkBox3.Checked = true; } + private void comboBox3_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox3.Text.Equals(comboBox3.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox4_TextChanged(object sender, EventArgs e) { checkBox4.Checked = true; } + private void comboBox4_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox4.Text.Equals(comboBox4.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox5_TextChanged(object sender, EventArgs e) { checkBox5.Checked = true; } + private void comboBox5_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox5.Text.Equals(comboBox5.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox6_TextChanged(object sender, EventArgs e) { checkBox6.Checked = true; } + private void comboBox6_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox6.Text.Equals(comboBox6.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox7_TextChanged(object sender, EventArgs e) { checkBox7.Checked = true; } + private void comboBox7_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox7.Text.Equals(comboBox7.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox8_TextChanged(object sender, EventArgs e) { checkBox8.Checked = true; } + private void comboBox8_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox8.Text.Equals(comboBox8.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox9_TextChanged(object sender, EventArgs e) { checkBox9.Checked = true; } + private void comboBox9_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox9.Text.Equals(comboBox9.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox10_TextChanged(object sender, EventArgs e) { checkBox10.Checked = true; } + private void comboBox10_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox10.Text.Equals(comboBox10.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox11_TextChanged(object sender, EventArgs e) { checkBox11.Checked = true; } + private void comboBox11_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox11.Text.Equals(comboBox11.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox12_TextChanged(object sender, EventArgs e) { checkBox12.Checked = true; } + private void comboBox12_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox12.Text.Equals(comboBox12.Items[0])) UpdateAllCombos(); + } + } + + #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); + }; + } + + private void OnForceClose(object sender, EventArgs args) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + + /// + /// Process a key press within any enabled text boxe + /// + /// + /// + /// TextBox control which received the event + private void ProcKeyPress(object sender, KeyPressEventArgs e, ComboBox currentFocusOwner) + { + if (e.KeyChar == '+') + { + /// Process '+' key ..... Form completed + okButton_Click(sender, e); + } + if (e.KeyChar == '\r') + { + /// Process key ..... Next text field + if (enabledComboBoxes.Count < 2) return; /// There is just one enabled textbox + + for (int i = 0; i < enabledComboBoxes.Count; i++) + { + if (enabledComboBoxes[i] == currentFocusOwner) + { + /// Change focus to the next enabled text box + enabledComboBoxes[(i + 1) % enabledComboBoxes.Count].Focus(); + return; + } + } + } + } + + private void comboBox1_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox1); } + private void comboBox2_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox2); } + private void comboBox3_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox3); } + private void comboBox4_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox4); } + private void comboBox5_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox5); } + private void comboBox6_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox6); } + private void comboBox7_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox7); } + private void comboBox8_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox8); } + private void comboBox9_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox9); } + private void comboBox10_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox10); } + private void comboBox11_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox11); } + private void comboBox12_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox12); } + + private void autoSNButton_Click(object sender, EventArgs e) + { + try + { + bool snFound = false; + int sn = 1; + + for (int i = 0; i < textBoxesCount; i++) + { + if (!AtTheEnd || WaterMeters[i].Passed) + { + if (!snFound) + { + sn = int.Parse(comboBoxes[i].Text); /// S/N from the first combo box + snFound = true; + } + else + { + sn++; + comboBoxes[i].Text = sn.ToString(); /// Update combo boxes of other 'good' water meters + } + } + } + } + catch + { + /// Don't do anything if int.Parse fails + } + } + + private void ext1TextBox_TextChanged(object sender, EventArgs e) + { + UpdateIcons(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/CycleBeginningForm.pl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/CycleBeginningForm.pl.resx new file mode 100644 index 00000000..f2d94860 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/CycleBeginningForm.pl.resx @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + OK + + + Kolejność + + + Usunąć + + + Nr seryjny 1 + + + Nr seryjny 2 + + + Nr seryjny 3 + + + Nr seryjny 4 + + + Nr seryjny 5 + + + Nr seryjny 6 + + + Nr seryjny 7 + + + Nr seryjny 8 + + + Nr seryjny 9 + + + Nr seryjny 10 + + + Nr seryjny 11 + + + Nr seryjny 12 + + + Uwaga: + + + Uzupełnienie za nr seryjnym + + + Uzupełnienie przed nr seryjnym + + + Nr identyfikacyjny: + + + ? + + + ? + + + ? + + + naprawionych + + + # sztuk + + + Auto nr seryjny + + + Dane partii + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/CycleBeginningForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/CycleBeginningForm.resx new file mode 100644 index 00000000..ff6f022e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/CycleBeginningForm.resx @@ -0,0 +1,2139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + Verdana, 14.25pt + + + 886, 24 + + + 140, 54 + + + + 7 + + + OK + + + okButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 52 + + + 90, 31 + + + 260, 31 + + + 0 + + + orderComboBox + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + orderGroupBox + + + 0 + + + Verdana, 14.25pt + + + 28, 12 + + + 447, 82 + + + 0 + + + Order + + + orderGroupBox + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 51 + + + Verdana, 14.25pt + + + + NoControl + + + 886, 124 + + + 140, 54 + + + 8 + + + Clear + + + clearButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 50 + + + True + + + Verdana, 14.25pt + + + 24, 127 + + + 166, 23 + + + 9 + + + Serial Number 1 + + + False + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 49 + + + Verdana, 14.25pt + + + 215, 124 + + + 163, 31 + + + 10 + + + False + + + comboBox1 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 48 + + + True + + + 460, 135 + + + 15, 14 + + + 11 + + + False + + + checkBox1 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 47 + + + True + + + NoControl + + + 460, 179 + + + 15, 14 + + + 14 + + + False + + + checkBox2 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 44 + + + Verdana, 14.25pt + + + 215, 168 + + + 163, 31 + + + 13 + + + False + + + comboBox2 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 45 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 171 + + + 166, 23 + + + 12 + + + Serial Number 2 + + + False + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 46 + + + True + + + NoControl + + + 460, 223 + + + 15, 14 + + + 17 + + + False + + + checkBox3 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 41 + + + Verdana, 14.25pt + + + 215, 212 + + + 163, 31 + + + 16 + + + False + + + comboBox3 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 42 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 215 + + + 166, 23 + + + 15 + + + Serial Number 3 + + + False + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 43 + + + True + + + NoControl + + + 460, 267 + + + 15, 14 + + + 20 + + + False + + + checkBox4 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 38 + + + Verdana, 14.25pt + + + 215, 256 + + + 163, 31 + + + 19 + + + False + + + comboBox4 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 39 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 259 + + + 166, 23 + + + 18 + + + Serial Number 4 + + + False + + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 40 + + + True + + + NoControl + + + 460, 311 + + + 15, 14 + + + 23 + + + False + + + checkBox5 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 35 + + + Verdana, 14.25pt + + + 215, 300 + + + 163, 31 + + + 22 + + + False + + + comboBox5 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 36 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 303 + + + 166, 23 + + + 21 + + + Serial Number 5 + + + False + + + label5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 37 + + + True + + + NoControl + + + 460, 355 + + + 15, 14 + + + 26 + + + False + + + checkBox6 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 32 + + + Verdana, 14.25pt + + + 215, 344 + + + 163, 31 + + + 25 + + + False + + + comboBox6 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 33 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 347 + + + 166, 23 + + + 24 + + + Serial Number 6 + + + False + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 34 + + + True + + + NoControl + + + 460, 399 + + + 15, 14 + + + 29 + + + False + + + checkBox7 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 29 + + + Verdana, 14.25pt + + + 215, 388 + + + 163, 31 + + + 28 + + + False + + + comboBox7 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 30 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 391 + + + 166, 23 + + + 27 + + + Serial Number 7 + + + False + + + label7 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 31 + + + True + + + NoControl + + + 460, 443 + + + 15, 14 + + + 32 + + + False + + + checkBox8 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 26 + + + Verdana, 14.25pt + + + 215, 432 + + + 163, 31 + + + 31 + + + False + + + comboBox8 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 27 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 435 + + + 166, 23 + + + 30 + + + Serial Number 8 + + + False + + + label8 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 28 + + + True + + + NoControl + + + 460, 487 + + + 15, 14 + + + 35 + + + False + + + checkBox9 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 23 + + + Verdana, 14.25pt + + + 215, 476 + + + 163, 31 + + + 34 + + + False + + + comboBox9 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 24 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 479 + + + 166, 23 + + + 33 + + + Serial Number 9 + + + False + + + label9 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 25 + + + True + + + NoControl + + + 460, 531 + + + 15, 14 + + + 38 + + + False + + + checkBox10 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 20 + + + Verdana, 14.25pt + + + 215, 520 + + + 163, 31 + + + 37 + + + False + + + comboBox10 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 21 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 523 + + + 178, 23 + + + 36 + + + Serial Number 10 + + + False + + + label10 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 22 + + + True + + + NoControl + + + 460, 575 + + + 15, 14 + + + 41 + + + False + + + checkBox11 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 17 + + + Verdana, 14.25pt + + + 215, 564 + + + 163, 31 + + + 40 + + + False + + + comboBox11 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 18 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 567 + + + 178, 23 + + + 39 + + + Serial Number 11 + + + False + + + label11 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 19 + + + True + + + NoControl + + + 460, 619 + + + 15, 14 + + + 44 + + + False + + + checkBox12 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 14 + + + Verdana, 14.25pt + + + 215, 608 + + + 163, 31 + + + 43 + + + False + + + comboBox12 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 15 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 611 + + + 178, 23 + + + 42 + + + Serial Number 12 + + + False + + + label12 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 16 + + + 23, 502 + + + 274, 31 + + + 15 + + + remarkTextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 0 + + + True + + + NoControl + + + 9, 468 + + + 115, 23 + + + 14 + + + Poznámka: + + + label16 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 1 + + + 23, 415 + + + 274, 31 + + + 13 + + + snSuffixTextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 2 + + + True + + + NoControl + + + 9, 381 + + + 165, 23 + + + 12 + + + Dodatok za s/n: + + + label15 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 3 + + + 23, 326 + + + 274, 31 + + + 11 + + + snPrefixTextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 4 + + + True + + + NoControl + + + 9, 292 + + + 187, 23 + + + 10 + + + Dodatok pred s/n: + + + label14 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 5 + + + 23, 245 + + + 274, 31 + + + 9 + + + idNumberTextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 6 + + + True + + + 9, 211 + + + 194, 23 + + + 8 + + + Identifikačné číslo: + + + label13 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 7 + + + True + + + NoControl + + + 73, 159 + + + 20, 23 + + + 7 + + + ? + + + ext4Label + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 8 + + + 23, 156 + + + 32, 31 + + + 6 + + + ext4TextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 9 + + + True + + + NoControl + + + 73, 120 + + + 20, 23 + + + 5 + + + ? + + + ext3Label + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 10 + + + 23, 117 + + + 32, 31 + + + 4 + + + ext3TextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 11 + + + True + + + NoControl + + + 73, 81 + + + 20, 23 + + + 3 + + + ? + + + ext2Label + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 12 + + + 23, 78 + + + 32, 31 + + + 2 + + + ext2TextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 13 + + + True + + + 73, 42 + + + 120, 23 + + + 1 + + + opravených + + + ext1Label + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 14 + + + 23, 39 + + + 32, 31 + + + 0 + + + ext1TextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 15 + + + Verdana, 14.25pt + + + 520, 12 + + + 322, 551 + + + 45 + + + # pieces + + + extensionsGroupBox + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 13 + + + Verdana, 14.25pt + + + NoControl + + + 886, 189 + + + 140, 54 + + + 46 + + + Auto S/N + + + autoSNButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 12 + + + 404, 124 + + + 32, 32 + + + 47 + + + False + + + pictureBox1 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 11 + + + NoControl + + + 404, 168 + + + 32, 32 + + + 48 + + + False + + + pictureBox2 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 10 + + + NoControl + + + 404, 212 + + + 32, 32 + + + 49 + + + False + + + pictureBox3 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 9 + + + NoControl + + + 404, 256 + + + 32, 32 + + + 50 + + + False + + + pictureBox4 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 8 + + + NoControl + + + 404, 300 + + + 32, 32 + + + 51 + + + False + + + pictureBox5 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 7 + + + NoControl + + + 404, 344 + + + 32, 32 + + + 52 + + + False + + + pictureBox6 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 6 + + + NoControl + + + 404, 388 + + + 32, 32 + + + 53 + + + False + + + pictureBox7 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 5 + + + NoControl + + + 404, 432 + + + 32, 32 + + + 54 + + + False + + + pictureBox8 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + + + NoControl + + + 404, 476 + + + 32, 32 + + + 55 + + + False + + + pictureBox9 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + NoControl + + + 404, 520 + + + 32, 32 + + + 56 + + + False + + + pictureBox10 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + NoControl + + + 404, 564 + + + 32, 32 + + + 57 + + + False + + + pictureBox11 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + NoControl + + + 404, 608 + + + 32, 32 + + + 58 + + + False + + + pictureBox12 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + + + 6, 13 + + + True + + + 1067, 651 + + + Batch data + + + CycleBeginningForm + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/CycleBeginningForm.ru.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/CycleBeginningForm.ru.resx new file mode 100644 index 00000000..93e13478 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/CycleBeginningForm.ru.resx @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + OK + + + Порядок + + + Очистить + + + Серийный номер 1 + + + Серийный номер 2 + + + Серийный номер 3 + + + Серийный номер 4 + + + Серийный номер 5 + + + Серийный номер 6 + + + Серийный номер 7 + + + Серийный номер8 + + + Серийный номер 9 + + + Серийный номер 10 + + + Серийный номер 11 + + + Серийный номер 12 + + + Примечание: + + + Дополнить за с/н + + + Дополнить перед с/н + + + Идентификационный номер: + + + ? + + + ? + + + ? + + + отремонтированных + + + # штук + + + Авто с/н + + + Пакетные данные + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/CycleEndForm.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/CycleEndForm.Designer.cs new file mode 100644 index 00000000..8d3f228a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/CycleEndForm.Designer.cs @@ -0,0 +1,305 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.HeatMeters12 +{ + partial class CycleEndForm + { + /// + /// 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() + { + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.textBox2 = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.okButton = new System.Windows.Forms.Button(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.textBox3 = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.textBox4 = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.groupBox5 = new System.Windows.Forms.GroupBox(); + this.textBox5 = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.groupBox6 = new System.Windows.Forms.GroupBox(); + this.textBox6 = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.groupBox2.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.groupBox4.SuspendLayout(); + this.groupBox5.SuspendLayout(); + this.groupBox6.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.textBox2); + this.groupBox2.Controls.Add(this.label2); + this.groupBox2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox2.ForeColor = System.Drawing.Color.Black; + this.groupBox2.Location = new System.Drawing.Point(25, 104); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(362, 81); + this.groupBox2.TabIndex = 2; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Wasserzähler 2"; + // + // textBox2 + // + this.textBox2.Location = new System.Drawing.Point(183, 31); + this.textBox2.Name = "textBox2"; + this.textBox2.Size = new System.Drawing.Size(163, 31); + this.textBox2.TabIndex = 1; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(18, 34); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(74, 23); + this.label2.TabIndex = 0; + this.label2.Text = "Stand:"; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.textBox1); + this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox1.ForeColor = System.Drawing.Color.Black; + this.groupBox1.Location = new System.Drawing.Point(25, 14); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(362, 81); + this.groupBox1.TabIndex = 1; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Wasserzähler 1"; + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(183, 31); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(163, 31); + this.textBox1.TabIndex = 1; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(18, 34); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(74, 23); + this.label1.TabIndex = 0; + this.label1.Text = "Stand:"; + // + // okButton + // + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(425, 23); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(98, 63); + this.okButton.TabIndex = 7; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.textBox3); + this.groupBox3.Controls.Add(this.label3); + this.groupBox3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox3.ForeColor = System.Drawing.Color.Black; + this.groupBox3.Location = new System.Drawing.Point(25, 194); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(362, 81); + this.groupBox3.TabIndex = 3; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "Wasserzähler 3"; + // + // textBox3 + // + this.textBox3.Location = new System.Drawing.Point(183, 31); + this.textBox3.Name = "textBox3"; + this.textBox3.Size = new System.Drawing.Size(163, 31); + this.textBox3.TabIndex = 1; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(18, 34); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(74, 23); + this.label3.TabIndex = 0; + this.label3.Text = "Stand:"; + // + // groupBox4 + // + this.groupBox4.Controls.Add(this.textBox4); + this.groupBox4.Controls.Add(this.label4); + this.groupBox4.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox4.ForeColor = System.Drawing.Color.Black; + this.groupBox4.Location = new System.Drawing.Point(25, 284); + this.groupBox4.Name = "groupBox4"; + this.groupBox4.Size = new System.Drawing.Size(362, 81); + this.groupBox4.TabIndex = 4; + this.groupBox4.TabStop = false; + this.groupBox4.Text = "Wasserzähler 4"; + // + // textBox4 + // + this.textBox4.Location = new System.Drawing.Point(183, 31); + this.textBox4.Name = "textBox4"; + this.textBox4.Size = new System.Drawing.Size(163, 31); + this.textBox4.TabIndex = 1; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(18, 34); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(74, 23); + this.label4.TabIndex = 0; + this.label4.Text = "Stand:"; + // + // groupBox5 + // + this.groupBox5.Controls.Add(this.textBox5); + this.groupBox5.Controls.Add(this.label5); + this.groupBox5.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox5.ForeColor = System.Drawing.Color.Black; + this.groupBox5.Location = new System.Drawing.Point(25, 374); + this.groupBox5.Name = "groupBox5"; + this.groupBox5.Size = new System.Drawing.Size(362, 81); + this.groupBox5.TabIndex = 5; + this.groupBox5.TabStop = false; + this.groupBox5.Text = "Wasserzähler 5"; + // + // textBox5 + // + this.textBox5.Location = new System.Drawing.Point(183, 31); + this.textBox5.Name = "textBox5"; + this.textBox5.Size = new System.Drawing.Size(163, 31); + this.textBox5.TabIndex = 1; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(18, 34); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(74, 23); + this.label5.TabIndex = 0; + this.label5.Text = "Stand:"; + // + // groupBox6 + // + this.groupBox6.Controls.Add(this.textBox6); + this.groupBox6.Controls.Add(this.label6); + this.groupBox6.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox6.ForeColor = System.Drawing.Color.Black; + this.groupBox6.Location = new System.Drawing.Point(25, 464); + this.groupBox6.Name = "groupBox6"; + this.groupBox6.Size = new System.Drawing.Size(362, 81); + this.groupBox6.TabIndex = 6; + this.groupBox6.TabStop = false; + this.groupBox6.Text = "Wasserzähler 6"; + // + // textBox6 + // + this.textBox6.Location = new System.Drawing.Point(183, 31); + this.textBox6.Name = "textBox6"; + this.textBox6.Size = new System.Drawing.Size(163, 31); + this.textBox6.TabIndex = 1; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(18, 34); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(74, 23); + this.label6.TabIndex = 0; + this.label6.Text = "Stand:"; + // + // CycleEndForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.ClientSize = new System.Drawing.Size(559, 566); + this.Controls.Add(this.groupBox6); + this.Controls.Add(this.groupBox5); + this.Controls.Add(this.groupBox4); + this.Controls.Add(this.groupBox3); + this.Controls.Add(this.okButton); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.groupBox1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "CycleEndForm"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "Daten"; + this.TopMost = true; + this.Load += new System.EventHandler(this.CycleEndForm_Load); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.groupBox4.ResumeLayout(false); + this.groupBox4.PerformLayout(); + this.groupBox5.ResumeLayout(false); + this.groupBox5.PerformLayout(); + this.groupBox6.ResumeLayout(false); + this.groupBox6.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TextBox textBox2; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.TextBox textBox3; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.GroupBox groupBox4; + private System.Windows.Forms.TextBox textBox4; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.GroupBox groupBox5; + private System.Windows.Forms.TextBox textBox5; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.GroupBox groupBox6; + private System.Windows.Forms.TextBox textBox6; + private System.Windows.Forms.Label label6; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/CycleEndForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/CycleEndForm.cs new file mode 100644 index 00000000..f68bcf51 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/CycleEndForm.cs @@ -0,0 +1,110 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using log4net; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.HeatMeters12 +{ + public partial class CycleEndForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(CycleEndForm)); + + /// Number of text boxes for serial numbers + public readonly int WaterMetersCount; + + // To be retrieved after the form closes + public string[] EndStateText; + + // Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + /// + /// Constructor + /// + /// Number of text boxes for serial numbers + public CycleEndForm(int waterMetersCount) + { + InitializeComponent(); + ControlBox = false; + + this.WaterMetersCount = waterMetersCount; + EndStateText = new string[WaterMetersCount]; + completed = false; + StartForceCloseHandler(); + } + + /// Parameterless constructor for 3 watermeters + public CycleEndForm() + : this(3) + { + } + + private void CycleEndForm_Load(object sender, EventArgs e) + { + Localize(); + + Height = 50 + 90 * WaterMetersCount; + + if (WaterMetersCount < 1) groupBox1.Visible = false; + if (WaterMetersCount < 2) groupBox2.Visible = false; + if (WaterMetersCount < 3) groupBox3.Visible = false; + if (WaterMetersCount < 4) groupBox4.Visible = false; + if (WaterMetersCount < 5) groupBox5.Visible = false; + if (WaterMetersCount < 6) groupBox6.Visible = false; + } + + void Localize() + { + Text = Strings.Data; + groupBox1.Text = Strings.Water_Meter + " 1"; + groupBox2.Text = Strings.Water_Meter + " 2"; + groupBox3.Text = Strings.Water_Meter + " 3"; + groupBox4.Text = Strings.Water_Meter + " 4"; + groupBox5.Text = Strings.Water_Meter + " 5"; + groupBox6.Text = Strings.Water_Meter + " 6"; + label1.Text = Strings.State; + label2.Text = Strings.State; + label3.Text = Strings.State; + label4.Text = Strings.State; + label5.Text = Strings.State; + label6.Text = Strings.State; + okButton.Text = Strings.OkBtnText; + } + + private void okButton_Click(object sender, EventArgs e) + { + if (WaterMetersCount >= 1) EndStateText[0] = textBox1.Text; + if (WaterMetersCount >= 2) EndStateText[1] = textBox3.Text; + if (WaterMetersCount >= 3) EndStateText[2] = textBox4.Text; + if (WaterMetersCount >= 4) EndStateText[3] = textBox5.Text; + if (WaterMetersCount >= 5) EndStateText[4] = textBox6.Text; + if (WaterMetersCount >= 6) EndStateText[5] = textBox6.Text; + + completed = true; + 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) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/CycleEndForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/CycleEndForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/CycleEndForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/EntryForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/EntryForm.cs new file mode 100644 index 00000000..99d702c0 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/EntryForm.cs @@ -0,0 +1,320 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; +using TBF.BenchControl; +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl.DataEntry.HeatMeters12 +{ + public class EntryForm : ComponentBase, IOperation, IDataEntry, IHasCycleBeginForm, IHasCycleEndForm, IHasHeatMtrStatesForm + { + private static readonly ILog log = LogManager.GetLogger(typeof(EntryForm)); + public override string ToString() + { + return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); + } + + public bool UsesCameras() { return false; } + + readonly EntryFormCfg entryFormCfg; + IRegisterReader[] regReaders; + + /// + /// Properties set by the Begin, End and WMStates form + /// + string purchaseOrder; + public string PurchaseOrder { get { return purchaseOrder; } } + + bool[] disabled; /// This array is shared between forms + + string[] wmCycleEndState; + public string WMCycleEndState(int wmNr) { return (wmNr >= 0 && wmNr < wmCycleEndState.Length) ? wmCycleEndState[wmNr] : string.Empty; } + + double[] wmStartState; + public double WMStartState(int wmNr) { return (wmNr >= 0 && wmNr < wmStartState.Length) ? wmStartState[wmNr] : 0; } + + double[] wmEndState; + public double WMEndState(int wmNr) { return (wmNr >= 0 && wmNr < wmEndState.Length) ? wmEndState[wmNr] : 0; } + + string[] wmStartStateStr; + + double[] energyStartState; + public double EnergyStartState(int wmNr) { return (wmNr >= 0 && wmNr < energyStartState.Length) ? energyStartState[wmNr] : 0; } + + double[] energyEndState; + public double EnergyEndState(int wmNr) { return (wmNr >= 0 && wmNr < energyEndState.Length) ? energyEndState[wmNr] : 0; } + + string[] energyStartStateStr; + + + System.Windows.Forms.Form modelessDlg; + + double refVolume; + double errLimLo; + double errLimHi; + + double refEnergy; + double energyErrLimLo; + double energyErrLimHi; + + bool resultSaved; /// Set in Run() when results are saved + + Results.Entities.WaterMeter[] waterMeters; /// Reference to ...ProcessData.BatchRslts.WaterMeters[] + + public enum CurrentOp + { + None, + ShowFormAtCycleBeginning, + ShowFormAtCycleEnd, + EnterTestStartStates, + EnterTestEndStates, + } + + CurrentOp currentOp; + + + public EntryForm() + { + } + + public EntryForm(Generic.IComponentCfg cfg) + : base(cfg) + { + entryFormCfg = cfg as EntryFormCfg; + + disabled = new bool[Config.Data.HeatMetersCount]; + wmStartState = new double[Config.Data.HeatMetersCount]; + wmStartStateStr = new string[Config.Data.HeatMetersCount]; + wmEndState = new double[Config.Data.HeatMetersCount]; + energyStartState = new double[Config.Data.HeatMetersCount]; + energyStartStateStr = new string[Config.Data.HeatMetersCount]; + energyEndState = new double[Config.Data.HeatMetersCount]; + wmCycleEndState = new string[Config.Data.HeatMetersCount]; + + currentOp = CurrentOp.None; + log.Debug(this.ToString()); + } + + /// Reference to the operation + public IOperation ShowCycleBeginFormOp() + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.ShowFormAtCycleBeginning; + this.waterMeters = TBF.BenchControl.Sequences.ProcessData.BatchRslts.WaterMeters; + return this; + } + + /// Reference to the operation + public IOperation ShowCycleEndFormOp() + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.ShowFormAtCycleEnd; + this.waterMeters = TBF.BenchControl.Sequences.ProcessData.BatchRslts.WaterMeters; + return this; + } + + /// Reference to the operation + public IOperation ShowTestStartFormOp(IRegisterReader[] regReaders) + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.EnterTestStartStates; + this.regReaders = regReaders; + return this; + } + + /// Reference to the operation + public IOperation ShowTestEndFormOp(IRegisterReader[] regReaders, double refVolume, double errLimLo, double errLimHi) + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.EnterTestEndStates; + this.regReaders = regReaders; + this.refVolume = refVolume; + this.errLimLo = errLimLo; + this.errLimHi = errLimHi; + this.refEnergy = 0; + this.energyErrLimLo = 0; + this.energyErrLimHi = 0; + return this; + } + + /// Reference to the operation + public IOperation ShowTestEndFormOp(IRegisterReader[] regReaders, double refVolume, double errLimLo, double errLimHi, + double refEnergy, double energyErrLimLo, double energyErrLimHi) + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.EnterTestEndStates; + this.regReaders = regReaders; + this.refVolume = refVolume; + this.errLimLo = errLimLo; + this.errLimHi = errLimHi; + this.refEnergy = refEnergy; + this.energyErrLimLo = energyErrLimLo; + this.energyErrLimHi = energyErrLimHi; + return this; + } + + delegate void EntryFormDlgt(EntryForm myRef); + /// + void OpenBeginningDlg(EntryForm myRef) + { + myRef.modelessDlg = new CycleBeginningForm(myRef.waterMeters, entryFormCfg.EnterSerialNrsAtTheEnd, entryFormCfg.SensusExtensions); + modelessDlg.Show(); + } + /// + void OpenEndDlg(EntryForm myRef) + { + myRef.modelessDlg = new CycleEndForm(myRef.waterMeters.Length); + modelessDlg.Show(); + } + /// + void OpenTestStartStatesDlg(EntryForm myRef) + { + myRef.modelessDlg = new TestStartEndForm(entryFormCfg, myRef.waterMeters.Length, myRef.regReaders, myRef.disabled); + modelessDlg.Show(); + } + /// + void OpenTestEndStatesDlg(EntryForm myRef) + { + myRef.modelessDlg = new TestStartEndForm(entryFormCfg, myRef.waterMeters.Length, myRef.regReaders, wmStartStateStr, energyStartStateStr, + disabled, refVolume, errLimLo, errLimHi, refEnergy, energyErrLimLo, energyErrLimHi); + modelessDlg.Show(); + } + + /// Start this operation + public void Start() + { + resultSaved = false; + switch (currentOp) + { + case CurrentOp.ShowFormAtCycleBeginning: + if (!entryFormCfg.EnterSerialNrsAtTheEnd) + { + Program.MainWnd.Invoke(new EntryFormDlgt(OpenBeginningDlg), this); + } + break; + case CurrentOp.ShowFormAtCycleEnd: + if (entryFormCfg.EnterSerialNrsAtTheEnd) + { + Program.MainWnd.Invoke(new EntryFormDlgt(OpenBeginningDlg), this); + } + else if (entryFormCfg.ShowCycleEndForm) + { + Program.MainWnd.Invoke(new EntryFormDlgt(OpenEndDlg), this); + } + break; + case CurrentOp.EnterTestStartStates: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenTestStartStatesDlg), this); + break; + case CurrentOp.EnterTestEndStates: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenTestEndStatesDlg), this); + break; + } + } + + /// Run this operation + /// Event.ResultsPrinted + public Event Run() + { + if ((modelessDlg is IHasCompleted) && !(modelessDlg as IHasCompleted).Completed) + { + return Event.ModelessFormIsOpen; + } + + if (!resultSaved) /// This is to save the result only once + { + if ((!entryFormCfg.EnterSerialNrsAtTheEnd && currentOp == CurrentOp.ShowFormAtCycleBeginning) || + (entryFormCfg.EnterSerialNrsAtTheEnd && currentOp == CurrentOp.ShowFormAtCycleEnd)) + { + CycleBeginningForm dlg = (modelessDlg as CycleBeginningForm); + if (dlg != null) + { + purchaseOrder = dlg.PurchaseOrder; + + for (int i = 0; i < Math.Min(dlg.WaterMetersCount, waterMeters.Length); i++) + { + if (waterMeters[i] != null) + { + waterMeters[i].SerialNr = dlg.SNText[i]; + disabled[i] = waterMeters[i].Disabled = dlg.Disabled[i]; + } + } + } + } + else if (entryFormCfg.ShowCycleEndForm && currentOp == CurrentOp.ShowFormAtCycleEnd) + { + CycleEndForm dlg = (modelessDlg as CycleEndForm); + int count = Math.Min(waterMeters.Length, Config.Data.HeatMetersCount); + if ((dlg != null) && (count > dlg.WaterMetersCount)) count = dlg.WaterMetersCount; + + for (int i = 0; i < count; i++) + { + if (waterMeters[i] != null) + { + /// In case entryFormCfg.ShowCycleEndForm == false dlg would be null, values would be string.Empty + wmCycleEndState[i] = waterMeters[i].EndState = (dlg != null) ? dlg.EndStateText[i] : string.Empty; + } + } + } + else if (modelessDlg is TestStartEndForm && currentOp == CurrentOp.EnterTestStartStates) + { + /// Fixed start test - start + TestStartEndForm dlg = (modelessDlg as TestStartEndForm); + if (dlg != null) + { + for (int i = 0; i < Math.Min(waterMeters.Length, Config.Data.HeatMetersCount); i++) + { + wmStartState[i] = dlg.WMStartState[i]; + wmStartStateStr[i] = dlg.WMStartStateStr[i]; + energyStartState[i] = dlg.EnergyStartState[i]; + energyStartStateStr[i] = dlg.EnergyStartStateStr[i]; + } + } + } + else if (modelessDlg is TestStartEndForm && currentOp == CurrentOp.EnterTestEndStates) + { + /// Fixed start test - end + TestStartEndForm dlg = (modelessDlg as TestStartEndForm); + if (dlg != null) + { + for (int i = 0; i < Math.Min(waterMeters.Length, Config.Data.HeatMetersCount); i++) + { + wmEndState[i] = dlg.WMEndState[i]; + energyEndState[i] = dlg.EnergyEndState[i]; + } + } + } + resultSaved = true; + modelessDlg = null; + } + + return Event.ModelessFormClosed; /// Form closed + } + + /// Stop this operation + public void Stop() + { + if (modelessDlg is IHasCompleted) + { + UiBridge.Bridge.OnCloseModelessForm(this, null); + modelessDlg = null; + } + currentOp = CurrentOp.None; + } + + /// + /// Updates test results with the information collected in watermeters. + /// + /// Test results to be updated with the information + public void UpdateTestResults(Results.BatchResults batchResults) + { + foreach (var wm in batchResults.WaterMeters) + { + if (wm != null && !wm.Disabled) wm.PurchaseOrder = PurchaseOrder; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/EntryFormCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/EntryFormCfg.cs new file mode 100644 index 00000000..753a6f4c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/EntryFormCfg.cs @@ -0,0 +1,53 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DataEntry.HeatMeters12 +{ + public class EntryFormCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(EntryFormCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new EntryFormCfgCtrl(); } + + /// + /// Serialized parameters + /// + public Config.Unit DefaultUnits; + public bool EnterSerialNrsAtTheEnd; + public bool ShowCycleEndForm; + public bool SensusExtensions; + + [XmlIgnore] + public Config.Unit Units; + + /// Private parameterless constructor invoked by all other (public) constructors + EntryFormCfg() + { + } + + public EntryFormCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + Factory = factory; + ParentName = string.Empty; + + DefaultUnits = Config.Unit.kWh; + EnterSerialNrsAtTheEnd = false; + ShowCycleEndForm = false; + SensusExtensions = false; + } + + public string ToString(int i) + { + return string.Format("Name={0}, EnterSNsAtTheEnd={1}, ShowEndForm={2}, SensusExt={3}", Name, EnterSerialNrsAtTheEnd, ShowCycleEndForm, SensusExtensions); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/EntryFormCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/EntryFormCfgCtrl.cs new file mode 100644 index 00000000..69577f48 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/EntryFormCfgCtrl.cs @@ -0,0 +1,108 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; +using Config; + +namespace TBF.BenchControl.DataEntry.HeatMeters12 +{ + public partial class EntryFormCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + EntryFormCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as EntryFormCfg; + Redraw(); + } + } + + public EntryFormCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Localize(); + + for (Unit units = 0; units < Unit.Count; units++) + { + if (Units.IsEnergy(units)) defaultUnitsComboBox.Items.Add(units.ToString()); + } + + Redraw(); + } + + void Localize() + { + defaultUnitsLabel.Text = Strings.Default_units; + enterSNsAtTheEndCheckBox.Text = Strings.Enter_SNs_at_the_end; + showEndStateFormCheckBox.Text = Strings.Show_cycle_end_form; + sensusExtensionsCheckBox.Text = Strings.Sensus_extensions; + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + enterSNsAtTheEndCheckBox.Checked = config.EnterSerialNrsAtTheEnd; + showEndStateFormCheckBox.Checked = config.ShowCycleEndForm; + sensusExtensionsCheckBox.Checked = config.SensusExtensions; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + enterSNsAtTheEndCheckBox.Enabled = true; + showEndStateFormCheckBox.Enabled = true; + sensusExtensionsCheckBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + foreach (var v in defaultUnitsComboBox.Items) + { + if (v.ToString() == defaultUnitsComboBox.Text) return flags; + } + + message = string.Format(Strings.Invalid_0, Strings.Default_units); + return CfgUpdateFlags.Error; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + + for (Unit u = 0; u < Unit.Count; u++) + { + if (u.ToString() == defaultUnitsComboBox.Text) config.DefaultUnits = u; + } + + config.EnterSerialNrsAtTheEnd = enterSNsAtTheEndCheckBox.Checked; + config.ShowCycleEndForm = showEndStateFormCheckBox.Checked; + config.SensusExtensions = sensusExtensionsCheckBox.Checked; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/EntryFormCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/EntryFormCfgCtrl.designer.cs new file mode 100644 index 00000000..f0bf05ef --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/EntryFormCfgCtrl.designer.cs @@ -0,0 +1,151 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.HeatMeters12 +{ + partial class EntryFormCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.showEndStateFormCheckBox = new System.Windows.Forms.CheckBox(); + this.enterSNsAtTheEndCheckBox = new System.Windows.Forms.CheckBox(); + this.sensusExtensionsCheckBox = new System.Windows.Forms.CheckBox(); + this.defaultUnitsLabel = new System.Windows.Forms.Label(); + this.defaultUnitsComboBox = new System.Windows.Forms.ComboBox(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(113, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(23, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(110, 33); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // showEndStateFormCheckBox + // + this.showEndStateFormCheckBox.AutoSize = true; + this.showEndStateFormCheckBox.Enabled = false; + this.showEndStateFormCheckBox.Location = new System.Drawing.Point(113, 139); + this.showEndStateFormCheckBox.Name = "showEndStateFormCheckBox"; + this.showEndStateFormCheckBox.Size = new System.Drawing.Size(151, 17); + this.showEndStateFormCheckBox.TabIndex = 4; + this.showEndStateFormCheckBox.Text = "Watermeter end state form"; + this.showEndStateFormCheckBox.UseVisualStyleBackColor = true; + // + // enterSNsAtTheEndCheckBox + // + this.enterSNsAtTheEndCheckBox.AutoSize = true; + this.enterSNsAtTheEndCheckBox.Enabled = false; + this.enterSNsAtTheEndCheckBox.Location = new System.Drawing.Point(113, 116); + this.enterSNsAtTheEndCheckBox.Name = "enterSNsAtTheEndCheckBox"; + this.enterSNsAtTheEndCheckBox.Size = new System.Drawing.Size(167, 17); + this.enterSNsAtTheEndCheckBox.TabIndex = 3; + this.enterSNsAtTheEndCheckBox.Text = "Enter serial number at the end"; + this.enterSNsAtTheEndCheckBox.UseVisualStyleBackColor = true; + // + // sensusExtensionsCheckBox + // + this.sensusExtensionsCheckBox.AutoSize = true; + this.sensusExtensionsCheckBox.Enabled = false; + this.sensusExtensionsCheckBox.Location = new System.Drawing.Point(113, 162); + this.sensusExtensionsCheckBox.Name = "sensusExtensionsCheckBox"; + this.sensusExtensionsCheckBox.Size = new System.Drawing.Size(114, 17); + this.sensusExtensionsCheckBox.TabIndex = 5; + this.sensusExtensionsCheckBox.Text = "Sensus extensions"; + this.sensusExtensionsCheckBox.UseVisualStyleBackColor = true; + // + // defaultUnitsLabel + // + this.defaultUnitsLabel.AutoSize = true; + this.defaultUnitsLabel.Location = new System.Drawing.Point(23, 87); + this.defaultUnitsLabel.Name = "defaultUnitsLabel"; + this.defaultUnitsLabel.Size = new System.Drawing.Size(66, 13); + this.defaultUnitsLabel.TabIndex = 6; + this.defaultUnitsLabel.Text = "Default units"; + // + // defaultUnitsComboBox + // + this.defaultUnitsComboBox.FormattingEnabled = true; + this.defaultUnitsComboBox.Location = new System.Drawing.Point(113, 84); + this.defaultUnitsComboBox.Name = "defaultUnitsComboBox"; + this.defaultUnitsComboBox.Size = new System.Drawing.Size(130, 21); + this.defaultUnitsComboBox.TabIndex = 7; + // + // EntryFormCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.defaultUnitsComboBox); + this.Controls.Add(this.defaultUnitsLabel); + this.Controls.Add(this.sensusExtensionsCheckBox); + this.Controls.Add(this.enterSNsAtTheEndCheckBox); + this.Controls.Add(this.showEndStateFormCheckBox); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "EntryFormCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.CheckBox showEndStateFormCheckBox; + private System.Windows.Forms.CheckBox enterSNsAtTheEndCheckBox; + private System.Windows.Forms.CheckBox sensusExtensionsCheckBox; + private System.Windows.Forms.Label defaultUnitsLabel; + private System.Windows.Forms.ComboBox defaultUnitsComboBox; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/EntryFormCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/EntryFormCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/EntryFormCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/Factory.cs new file mode 100644 index 00000000..71d746b4 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/Factory.cs @@ -0,0 +1,31 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DataEntry.HeatMeters12 +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring("TBF.BenchControl.".Length); } } + + public void ResetStaticProperties() { EntryForm.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new EntryForm(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new EntryForm(cfg); } + + public IComponentCfg DefaultConfig() + { + return new EntryFormCfg(this.GetType().Namespace.Substring("TBF.BenchControl.DataEntry.".Length), this); + } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + IComponentCfg cfg = ComponentCfgBase.CreateFromDbEntity(EntryFormCfg.Serializer, component, this); + (cfg as EntryFormCfg).Units = (cfg as EntryFormCfg).DefaultUnits; + return cfg; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/TestStartEndForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/TestStartEndForm.cs new file mode 100644 index 00000000..09dc3048 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/TestStartEndForm.cs @@ -0,0 +1,730 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using log4net; +using TBF.BenchControl.GenericDevices; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.HeatMeters12 +{ + public partial class TestStartEndForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(TestStartEndForm)); + + // Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + readonly EntryFormCfg entryFormCfg; + + /// Number of text boxes for serial numbers + public readonly int WaterMetersCount; + readonly IRegisterReader[] regReaders; + readonly bool[] disabled; + + // To be retrieved after the form closes + public double[] WMStartState; + public readonly string[] WMStartStateStr; + public double[] WMEndState; + + // To be retrieved after the form closes + public double[] EnergyStartState; + public readonly string[] EnergyStartStateStr; + public double[] EnergyEndState; + + bool endStates; /// false=start states, true=end states + + double refVolume; + double warningLimLo; /// limit to display exclamation mark, typically 2x errLimLo + double warningLimHi; /// limit to display exclamation mark, typically 2x errLimHi + + double refEnergy; + double energyWarningLimLo; /// limit to display exclamation mark, typically 2x energyErrLimLo + double energyWarningLimHi; /// limit to display exclamation mark, typically 2x energyErrLimHi + + int TextBoxesCount; + /// + Label[] labels; + TextBox[] startTextBoxes; + TextBox[] endTextBoxes; + Label[] energyLabels; + TextBox[] energyStartTextBoxes; + TextBox[] energyEndTextBoxes; + IList enabledTextBoxes; + + /// + /// Parameterless constructor initializing common part for start and endstate form + /// + public TestStartEndForm() + { + InitializeComponent(); + ControlBox = false; + + TextBoxesCount = 12; + + labels = new Label[] + { + label1, label2, label3, label4, label5, label6, label7, label8, label9, label10, label11, label12, + }; + startTextBoxes = new TextBox[] + { + startTextBox1, startTextBox2, startTextBox3, startTextBox4, startTextBox5, startTextBox6, + startTextBox7, startTextBox8, startTextBox9, startTextBox10, startTextBox11, startTextBox12, + }; + endTextBoxes = new TextBox[] + { + endTextBox1, endTextBox2, endTextBox3, endTextBox4, endTextBox5, endTextBox6, + endTextBox7, endTextBox8, endTextBox9, endTextBox10, endTextBox11, endTextBox12, + }; + + energyLabels = new Label[] + { + label13, label14, label15, label16, label17, label18, label19, label20, label21, label22, label23, label24, + }; + energyStartTextBoxes = new TextBox[] + { + startTextBox13, startTextBox14, startTextBox15, startTextBox16, startTextBox17, startTextBox18, + startTextBox19, startTextBox20, startTextBox21, startTextBox22, startTextBox23, startTextBox24, + }; + energyEndTextBoxes = new TextBox[] + { + endTextBox13, endTextBox14, endTextBox15, endTextBox16, endTextBox17, endTextBox18, + endTextBox19, endTextBox20, endTextBox21, endTextBox22, endTextBox23, endTextBox24, + }; + + enabledTextBoxes = new List(); + + completed = false; + StartForceCloseHandler(); + } + + /// + /// Constructor to fill in start states + /// + /// Number of water meters + /// Information from CycleBeginningForm about availability of water meters + public TestStartEndForm(EntryFormCfg cfg, int waterMetersCount, IRegisterReader[] regReaders, bool[] disabled) + : this() + { + endStates = false; + + entryFormCfg = cfg; + + this.WaterMetersCount = waterMetersCount; + this.regReaders = regReaders; + this.disabled = disabled; + + ShuffleTextBoxes(); + + WMStartState = new double[waterMetersCount]; + WMStartStateStr = new string[waterMetersCount]; + + EnergyStartState = new double[waterMetersCount]; + EnergyStartStateStr = new string[waterMetersCount]; + } + + /// + /// Constructor to fill in end states + /// + /// Number of water meters + /// Information entered on test start + /// Information from CycleBeginningForm about availability of water meters + /// Reference volume, it is used to verify the end state, show/hide exclamation if necessary + /// Error limit low, it is used to verify the end state, show/hide exclamation if necessary + /// Error limit high, it is used to verify the end state, show/hide exclamation if necessary + public TestStartEndForm(EntryFormCfg cfg, int waterMetersCount, IRegisterReader[] regReaders, string[] wmStartStateStr, string[] energyStartStateStr, + bool[] disabled, double refVolume, double errLimLo, double errLimHi, + double refEnergy, double energyErrLimLo, double energyErrLimHi) + : this() + { + endStates = true; + + entryFormCfg = cfg; + + this.WaterMetersCount = waterMetersCount; + this.regReaders = regReaders; + + if (wmStartStateStr == null || wmStartStateStr.Length != waterMetersCount) + throw (new Exception("Invalid 'wmStartStateStr' argument")); + this.WMStartStateStr = wmStartStateStr; + + if (energyStartStateStr == null || energyStartStateStr.Length != waterMetersCount) + throw (new Exception("Invalid 'energyStartStateStr' argument")); + this.EnergyStartStateStr = energyStartStateStr; + + this.disabled = disabled; + + this.refVolume = refVolume; + this.warningLimLo = 2 * errLimLo; + this.warningLimHi = 2 * errLimHi; + + this.refEnergy = refEnergy; + this.energyWarningLimLo = 2 * energyErrLimLo; + this.energyWarningLimHi = 2 * energyErrLimHi; + + ShuffleTextBoxes(); + + WMEndState = new double[waterMetersCount]; + EnergyEndState = new double[waterMetersCount]; + } + + /// + /// Make sure the layout of labels/text boxes on the screen + /// corresponds to the layout of watermeters of the test bench. + /// + void ShuffleTextBoxes() + { + if (Config.Data.HeatMetersCount < TextBoxesCount) + { + int nrLines = Math.Max(1, Config.Data.HeatMetersCount / Config.Data.LineSize); + int gap = (TextBoxesCount - Config.Data.HeatMetersCount) / nrLines; + + int dest = 0; + for (int l = 0; l < nrLines; l++) + { + for (int i = 0; i < Config.Data.LineSize; i++) + { + labels[dest] = labels[l * Config.Data.LineSize + l * gap + i]; + startTextBoxes[dest] = startTextBoxes[l * Config.Data.LineSize + l * gap + i]; + endTextBoxes[dest] = endTextBoxes[l * Config.Data.LineSize + l * gap + i]; + energyLabels[dest] = energyLabels[l * Config.Data.LineSize + l * gap + i]; + energyStartTextBoxes[dest] = energyStartTextBoxes[l * Config.Data.LineSize + l * gap + i]; + energyEndTextBoxes[dest] = energyEndTextBoxes[l * Config.Data.LineSize + l * gap + i]; + dest++; + } + } + TextBoxesCount = Config.Data.HeatMetersCount; + } + } + + private void TestStartEndForm_Load(object sender, EventArgs e) + { + Localize(); + + for (Config.Unit units = 0; units < Config.Unit.Count; units++) + { + if (Config.Units.IsEnergy(units)) unitsComboBox.Items.Add(units.ToString()); + } + unitsComboBox.Text = entryFormCfg.Units.ToString(); + + //Height = 115 + 90 * WaterMetersCount; + + for (int i = 0; i < TextBoxesCount; i++) + { + if (i < WaterMetersCount) + { + labels[i].Visible = startTextBoxes[i].Visible = endTextBoxes[i].Visible = true; + energyLabels[i].Visible = energyStartTextBoxes[i].Visible = energyEndTextBoxes[i].Visible = true; + } + } + + if (endStates) + { + for (int i = 0; i < TextBoxesCount; i++) + { + if (WMStartStateStr != null && i < WMStartStateStr.Length) + { + startTextBoxes[i].Text = WMStartStateStr[i]; + } + if (EnergyStartStateStr != null && i < EnergyStartStateStr.Length) + { + energyStartTextBoxes[i].Text = EnergyStartStateStr[i]; + } + + if (disabled != null && i < disabled.Length && disabled[i]) + { + endTextBoxes[i].Enabled = false; + energyEndTextBoxes[i].Enabled = false; + } + else + { + endTextBoxes[i].Enabled = true; + energyEndTextBoxes[i].Enabled = true; + enabledTextBoxes.Add(endTextBoxes[i]); + enabledTextBoxes.Add(energyEndTextBoxes[i]); + } + } + } + else + { + for (int i = 0; i < TextBoxesCount; i++) + { + if (disabled != null && i < disabled.Length && disabled[i]) + { + startTextBoxes[i].Enabled = false; + energyStartTextBoxes[i].Enabled = false; + } + else + { + startTextBoxes[i].Enabled = true; + energyStartTextBoxes[i].Enabled = true; + enabledTextBoxes.Add(startTextBoxes[i]); + enabledTextBoxes.Add(energyStartTextBoxes[i]); + } + } + } + } + + void Localize() + { + Text = Strings.Water_Meter_States; + for (int i = 0; i < TextBoxesCount; i++) + { + labels[i].Text = string.Format("{0} {1} [l]", Strings.Volume + " ", i + 1); + energyLabels[i].Text = string.Format("{0} {1}", Strings.Energy + " ", i + 1); + } + startLabel.Text = Strings.Start; + endLabel.Text = Strings.End; + okButton.Text = Strings.OkBtnText; + } + + private void unitsComboBox_SelectedIndexChanged(object sender, EventArgs e) + { + for (Config.Unit u = 0; u < Config.Unit.Count; u++) + { + if (u.ToString() == unitsComboBox.Text) + { + entryFormCfg.Units = u; + break; + } + } + } + + private void okButton_Click(object sender, EventArgs eArgs) + { + try + { + if (endStates) + { + for (int i = 0; i < Math.Min(WaterMetersCount, TextBoxesCount); i++) + { + if (endTextBoxes[i].Visible && endTextBoxes[i].Enabled) + { + WMEndState[i] = Utils.ParseUDouble(endTextBoxes[i].Text); + EnergyEndState[i] = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(energyEndTextBoxes[i].Text)); + } + } + } + else + { + for (int i = 0; i < Math.Min(WaterMetersCount, TextBoxesCount); i++) + { + if (startTextBoxes[i].Visible && startTextBoxes[i].Enabled) + { + WMStartStateStr[i] = startTextBoxes[i].Text; + WMStartState[i] = Utils.ParseUDouble(startTextBoxes[i].Text); + EnergyStartStateStr[i] = energyStartTextBoxes[i].Text; + EnergyStartState[i] = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(energyStartTextBoxes[i].Text)); + } + } + } + } + catch(Exception e) + { + log.ErrorFormat("Exception: {0}", e.Message); + return; + } + + completed = true; + 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) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + + /// + /// Calculate the approximate error and verify whether it is within limits. + /// Make an exclamation mark visible if out of range. + /// Similar event handler is implemented for all endTextBoxes (1..24). + /// + private void endTextBox1_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox1.Text); + double startState = Utils.ParseUDouble(startTextBox1.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { }; + exclamation1.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox2_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox2.Text); + double startState = Utils.ParseUDouble(startTextBox2.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation2.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox3_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox3.Text); + double startState = Utils.ParseUDouble(startTextBox3.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation3.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox4_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox4.Text); + double startState = Utils.ParseUDouble(startTextBox4.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation4.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox5_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox5.Text); + double startState = Utils.ParseUDouble(startTextBox5.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation5.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox6_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox6.Text); + double startState = Utils.ParseUDouble(startTextBox6.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation6.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox7_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox7.Text); + double startState = Utils.ParseUDouble(startTextBox7.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation7.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox8_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox8.Text); + double startState = Utils.ParseUDouble(startTextBox8.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation8.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox9_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox9.Text); + double startState = Utils.ParseUDouble(startTextBox9.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation9.Visible = (err < warningLimLo) || (warningLimHi < err); + } + + private void endTextBox10_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox10.Text); + double startState = Utils.ParseUDouble(startTextBox10.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation10.Visible = (err < warningLimLo) || (warningLimHi < err); + } + + private void endTextBox11_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox11.Text); + double startState = Utils.ParseUDouble(startTextBox11.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation11.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox12_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox12.Text); + double startState = Utils.ParseUDouble(startTextBox12.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation12.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox13_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(endTextBox13.Text)); + double startState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(startTextBox13.Text)); + err = 100.0 * (endState - startState - refEnergy) / refEnergy; + } + catch { err = 1000.0f; }; + exclamation13.Visible = (err < energyWarningLimLo) || (energyWarningLimHi < err); + } + private void endTextBox14_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(endTextBox14.Text)); + double startState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(startTextBox14.Text)); + err = 100.0 * (endState - startState - refEnergy) / refEnergy; + } + catch { err = 1000.0f; }; + exclamation14.Visible = (err < energyWarningLimLo) || (energyWarningLimHi < err); + } + private void endTextBox15_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(endTextBox15.Text)); + double startState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(startTextBox15.Text)); + err = 100.0 * (endState - startState - refEnergy) / refEnergy; + } + catch { err = 1000.0f; }; + exclamation15.Visible = (err < energyWarningLimLo) || (energyWarningLimHi < err); + } + private void endTextBox16_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(endTextBox16.Text)); + double startState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(startTextBox16.Text)); + err = 100.0 * (endState - startState - refEnergy) / refEnergy; + } + catch { err = 1000.0f; }; + exclamation16.Visible = (err < energyWarningLimLo) || (energyWarningLimHi < err); + } + private void endTextBox17_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(endTextBox17.Text)); + double startState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(startTextBox17.Text)); + err = 100.0 * (endState - startState - refEnergy) / refEnergy; + } + catch { err = 1000.0f; }; + exclamation17.Visible = (err < energyWarningLimLo) || (energyWarningLimHi < err); + } + private void endTextBox18_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(endTextBox18.Text)); + double startState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(startTextBox18.Text)); + err = 100.0 * (endState - startState - refEnergy) / refEnergy; + } + catch { err = 1000.0f; }; + exclamation18.Visible = (err < energyWarningLimLo) || (energyWarningLimHi < err); + } + private void endTextBox19_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(endTextBox19.Text)); + double startState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(startTextBox19.Text)); + err = 100.0 * (endState - startState - refEnergy) / refEnergy; + } + catch { err = 1000.0f; }; + exclamation19.Visible = (err < energyWarningLimLo) || (energyWarningLimHi < err); + } + private void endTextBox20_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(endTextBox20.Text)); + double startState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(startTextBox20.Text)); + err = 100.0 * (endState - startState - refEnergy) / refEnergy; + } + catch { err = 1000.0f; }; + exclamation20.Visible = (err < energyWarningLimLo) || (energyWarningLimHi < err); + } + private void endTextBox21_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(endTextBox21.Text)); + double startState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(startTextBox21.Text)); + err = 100.0 * (endState - startState - refEnergy) / refEnergy; + } + catch { err = 1000.0f; }; + exclamation21.Visible = (err < energyWarningLimLo) || (energyWarningLimHi < err); + } + private void endTextBox22_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(endTextBox22.Text)); + double startState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(startTextBox22.Text)); + err = 100.0 * (endState - startState - refEnergy) / refEnergy; + } + catch { err = 1000.0f; }; + exclamation22.Visible = (err < energyWarningLimLo) || (energyWarningLimHi < err); + } + private void endTextBox23_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(endTextBox23.Text)); + double startState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(startTextBox23.Text)); + err = 100.0 * (endState - startState - refEnergy) / refEnergy; + } + catch { err = 1000.0f; }; + exclamation23.Visible = (err < energyWarningLimLo) || (energyWarningLimHi < err); + } + private void endTextBox24_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(endTextBox24.Text)); + double startState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(startTextBox24.Text)); + err = 100.0 * (endState - startState - refEnergy) / refEnergy; + } + catch { err = 1000.0f; }; + exclamation24.Visible = (err < energyWarningLimLo) || (energyWarningLimHi < err); + } + + /// + /// Process a key press within any enabled text boxe + /// + /// + /// + /// TextBox control which received the event + private void ProcKeyPress(object sender, KeyPressEventArgs e, TextBox currentFocusOwner) + { + if (e.KeyChar == '+') + { + /// Process '+' key ..... Form completed + okButton_Click(sender, e); + } + if (e.KeyChar == '\r') + { + /// Process key ..... Next text field + if (enabledTextBoxes.Count < 2) return; /// There is just one enabled textbox + + for (int i = 0; i < enabledTextBoxes.Count; i++) + { + if (enabledTextBoxes[i] == currentFocusOwner) + { + /// Change focus to the next enabled text box + enabledTextBoxes[(i + 1) % enabledTextBoxes.Count].Focus(); + return; + } + } + } + } + + private void startTextBox1_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox1); } + private void startTextBox2_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox2); } + private void startTextBox3_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox3); } + private void startTextBox4_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox4); } + private void startTextBox5_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox5); } + private void startTextBox6_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox6); } + private void startTextBox7_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox7); } + private void startTextBox8_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox8); } + private void startTextBox9_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox9); } + private void startTextBox10_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox10); } + private void startTextBox11_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox11); } + private void startTextBox12_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox12); } + private void startTextBox13_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox13); } + private void startTextBox14_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox14); } + private void startTextBox15_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox15); } + private void startTextBox16_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox16); } + private void startTextBox17_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox17); } + private void startTextBox18_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox18); } + private void startTextBox19_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox19); } + private void startTextBox20_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox20); } + private void startTextBox21_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox21); } + private void startTextBox22_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox22); } + private void startTextBox23_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox23); } + private void startTextBox24_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox24); } + + private void endTextBox1_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox1); } + private void endTextBox2_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox2); } + private void endTextBox3_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox3); } + private void endTextBox4_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox4); } + private void endTextBox5_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox5); } + private void endTextBox6_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox6); } + private void endTextBox7_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox7); } + private void endTextBox8_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox8); } + private void endTextBox9_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox9); } + private void endTextBox10_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox10); } + private void endTextBox11_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox11); } + private void endTextBox12_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox12); } + private void endTextBox13_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox13); } + private void endTextBox14_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox14); } + private void endTextBox15_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox15); } + private void endTextBox16_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox16); } + private void endTextBox17_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox17); } + private void endTextBox18_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox18); } + private void endTextBox19_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox19); } + private void endTextBox20_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox20); } + private void endTextBox21_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox21); } + private void endTextBox22_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox22); } + private void endTextBox23_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox23); } + private void endTextBox24_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox24); } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/TestStartEndForm.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/TestStartEndForm.designer.cs new file mode 100644 index 00000000..9908241b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/TestStartEndForm.designer.cs @@ -0,0 +1,1542 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.HeatMeters12 +{ + partial class TestStartEndForm + { + /// + /// 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() + { + this.exclamation1 = new System.Windows.Forms.Label(); + this.startTextBox1 = new System.Windows.Forms.TextBox(); + this.endTextBox1 = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.okButton = new System.Windows.Forms.Button(); + this.exclamation3 = new System.Windows.Forms.Label(); + this.startTextBox3 = new System.Windows.Forms.TextBox(); + this.endTextBox3 = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.exclamation4 = new System.Windows.Forms.Label(); + this.startTextBox4 = new System.Windows.Forms.TextBox(); + this.endTextBox4 = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.exclamation5 = new System.Windows.Forms.Label(); + this.startTextBox5 = new System.Windows.Forms.TextBox(); + this.endTextBox5 = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.exclamation6 = new System.Windows.Forms.Label(); + this.startTextBox6 = new System.Windows.Forms.TextBox(); + this.endTextBox6 = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.startLabel = new System.Windows.Forms.Label(); + this.endLabel = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.endTextBox2 = new System.Windows.Forms.TextBox(); + this.startTextBox2 = new System.Windows.Forms.TextBox(); + this.exclamation2 = new System.Windows.Forms.Label(); + this.exclamation7 = new System.Windows.Forms.Label(); + this.startTextBox7 = new System.Windows.Forms.TextBox(); + this.endTextBox7 = new System.Windows.Forms.TextBox(); + this.label7 = new System.Windows.Forms.Label(); + this.exclamation8 = new System.Windows.Forms.Label(); + this.startTextBox8 = new System.Windows.Forms.TextBox(); + this.endTextBox8 = new System.Windows.Forms.TextBox(); + this.label8 = new System.Windows.Forms.Label(); + this.exclamation9 = new System.Windows.Forms.Label(); + this.startTextBox9 = new System.Windows.Forms.TextBox(); + this.endTextBox9 = new System.Windows.Forms.TextBox(); + this.label9 = new System.Windows.Forms.Label(); + this.exclamation10 = new System.Windows.Forms.Label(); + this.startTextBox10 = new System.Windows.Forms.TextBox(); + this.endTextBox10 = new System.Windows.Forms.TextBox(); + this.label10 = new System.Windows.Forms.Label(); + this.exclamation11 = new System.Windows.Forms.Label(); + this.startTextBox11 = new System.Windows.Forms.TextBox(); + this.endTextBox11 = new System.Windows.Forms.TextBox(); + this.label11 = new System.Windows.Forms.Label(); + this.exclamation12 = new System.Windows.Forms.Label(); + this.startTextBox12 = new System.Windows.Forms.TextBox(); + this.endTextBox12 = new System.Windows.Forms.TextBox(); + this.label12 = new System.Windows.Forms.Label(); + this.exclamation24 = new System.Windows.Forms.Label(); + this.startTextBox24 = new System.Windows.Forms.TextBox(); + this.endTextBox24 = new System.Windows.Forms.TextBox(); + this.label24 = new System.Windows.Forms.Label(); + this.exclamation23 = new System.Windows.Forms.Label(); + this.startTextBox23 = new System.Windows.Forms.TextBox(); + this.endTextBox23 = new System.Windows.Forms.TextBox(); + this.label23 = new System.Windows.Forms.Label(); + this.exclamation22 = new System.Windows.Forms.Label(); + this.startTextBox22 = new System.Windows.Forms.TextBox(); + this.endTextBox22 = new System.Windows.Forms.TextBox(); + this.label22 = new System.Windows.Forms.Label(); + this.exclamation21 = new System.Windows.Forms.Label(); + this.startTextBox21 = new System.Windows.Forms.TextBox(); + this.endTextBox21 = new System.Windows.Forms.TextBox(); + this.label21 = new System.Windows.Forms.Label(); + this.exclamation20 = new System.Windows.Forms.Label(); + this.startTextBox20 = new System.Windows.Forms.TextBox(); + this.endTextBox20 = new System.Windows.Forms.TextBox(); + this.label20 = new System.Windows.Forms.Label(); + this.exclamation19 = new System.Windows.Forms.Label(); + this.startTextBox19 = new System.Windows.Forms.TextBox(); + this.endTextBox19 = new System.Windows.Forms.TextBox(); + this.label19 = new System.Windows.Forms.Label(); + this.exclamation18 = new System.Windows.Forms.Label(); + this.exclamation17 = new System.Windows.Forms.Label(); + this.startTextBox18 = new System.Windows.Forms.TextBox(); + this.exclamation16 = new System.Windows.Forms.Label(); + this.endTextBox18 = new System.Windows.Forms.TextBox(); + this.label18 = new System.Windows.Forms.Label(); + this.startTextBox17 = new System.Windows.Forms.TextBox(); + this.exclamation15 = new System.Windows.Forms.Label(); + this.endTextBox17 = new System.Windows.Forms.TextBox(); + this.label17 = new System.Windows.Forms.Label(); + this.startTextBox16 = new System.Windows.Forms.TextBox(); + this.exclamation14 = new System.Windows.Forms.Label(); + this.endTextBox16 = new System.Windows.Forms.TextBox(); + this.label16 = new System.Windows.Forms.Label(); + this.startTextBox15 = new System.Windows.Forms.TextBox(); + this.exclamation13 = new System.Windows.Forms.Label(); + this.endTextBox15 = new System.Windows.Forms.TextBox(); + this.label15 = new System.Windows.Forms.Label(); + this.startTextBox14 = new System.Windows.Forms.TextBox(); + this.label35 = new System.Windows.Forms.Label(); + this.endTextBox14 = new System.Windows.Forms.TextBox(); + this.label14 = new System.Windows.Forms.Label(); + this.startTextBox13 = new System.Windows.Forms.TextBox(); + this.label37 = new System.Windows.Forms.Label(); + this.endTextBox13 = new System.Windows.Forms.TextBox(); + this.label13 = new System.Windows.Forms.Label(); + this.unitsComboBox = new System.Windows.Forms.ComboBox(); + this.unitsLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // exclamation1 + // + this.exclamation1.AutoSize = true; + this.exclamation1.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation1.ForeColor = System.Drawing.Color.Red; + this.exclamation1.Location = new System.Drawing.Point(532, 56); + this.exclamation1.Name = "exclamation1"; + this.exclamation1.Size = new System.Drawing.Size(30, 38); + this.exclamation1.TabIndex = 5; + this.exclamation1.Text = "!"; + this.exclamation1.Visible = false; + // + // startTextBox1 + // + this.startTextBox1.Enabled = false; + this.startTextBox1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox1.Location = new System.Drawing.Point(185, 60); + this.startTextBox1.Name = "startTextBox1"; + this.startTextBox1.Size = new System.Drawing.Size(163, 31); + this.startTextBox1.TabIndex = 3; + this.startTextBox1.Visible = false; + this.startTextBox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox1_KeyPress); + // + // endTextBox1 + // + this.endTextBox1.Enabled = false; + this.endTextBox1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox1.Location = new System.Drawing.Point(367, 60); + this.endTextBox1.Name = "endTextBox1"; + this.endTextBox1.Size = new System.Drawing.Size(163, 31); + this.endTextBox1.TabIndex = 4; + this.endTextBox1.Visible = false; + this.endTextBox1.TextChanged += new System.EventHandler(this.endTextBox1_TextChanged); + this.endTextBox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox1_KeyPress); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label1.Location = new System.Drawing.Point(23, 63); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(132, 23); + this.label1.TabIndex = 2; + this.label1.Text = "Volume 1 [l]"; + this.label1.Visible = false; + // + // okButton + // + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(1159, 60); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(98, 63); + this.okButton.TabIndex = 100; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // exclamation3 + // + this.exclamation3.AutoSize = true; + this.exclamation3.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation3.ForeColor = System.Drawing.Color.Red; + this.exclamation3.Location = new System.Drawing.Point(532, 144); + this.exclamation3.Name = "exclamation3"; + this.exclamation3.Size = new System.Drawing.Size(30, 38); + this.exclamation3.TabIndex = 13; + this.exclamation3.Text = "!"; + this.exclamation3.Visible = false; + // + // startTextBox3 + // + this.startTextBox3.Enabled = false; + this.startTextBox3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox3.Location = new System.Drawing.Point(185, 148); + this.startTextBox3.Name = "startTextBox3"; + this.startTextBox3.Size = new System.Drawing.Size(163, 31); + this.startTextBox3.TabIndex = 11; + this.startTextBox3.Visible = false; + this.startTextBox3.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox3_KeyPress); + // + // endTextBox3 + // + this.endTextBox3.Enabled = false; + this.endTextBox3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox3.Location = new System.Drawing.Point(367, 148); + this.endTextBox3.Name = "endTextBox3"; + this.endTextBox3.Size = new System.Drawing.Size(163, 31); + this.endTextBox3.TabIndex = 12; + this.endTextBox3.Visible = false; + this.endTextBox3.TextChanged += new System.EventHandler(this.endTextBox3_TextChanged); + this.endTextBox3.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox3_KeyPress); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label3.Location = new System.Drawing.Point(23, 151); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(132, 23); + this.label3.TabIndex = 10; + this.label3.Text = "Volume 3 [l]"; + this.label3.Visible = false; + // + // exclamation4 + // + this.exclamation4.AutoSize = true; + this.exclamation4.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation4.ForeColor = System.Drawing.Color.Red; + this.exclamation4.Location = new System.Drawing.Point(532, 188); + this.exclamation4.Name = "exclamation4"; + this.exclamation4.Size = new System.Drawing.Size(30, 38); + this.exclamation4.TabIndex = 17; + this.exclamation4.Text = "!"; + this.exclamation4.Visible = false; + // + // startTextBox4 + // + this.startTextBox4.Enabled = false; + this.startTextBox4.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox4.Location = new System.Drawing.Point(185, 192); + this.startTextBox4.Name = "startTextBox4"; + this.startTextBox4.Size = new System.Drawing.Size(163, 31); + this.startTextBox4.TabIndex = 15; + this.startTextBox4.Visible = false; + this.startTextBox4.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox4_KeyPress); + // + // endTextBox4 + // + this.endTextBox4.Enabled = false; + this.endTextBox4.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox4.Location = new System.Drawing.Point(367, 192); + this.endTextBox4.Name = "endTextBox4"; + this.endTextBox4.Size = new System.Drawing.Size(163, 31); + this.endTextBox4.TabIndex = 16; + this.endTextBox4.Visible = false; + this.endTextBox4.TextChanged += new System.EventHandler(this.endTextBox4_TextChanged); + this.endTextBox4.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox4_KeyPress); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label4.Location = new System.Drawing.Point(23, 195); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(132, 23); + this.label4.TabIndex = 14; + this.label4.Text = "Volume 4 [l]"; + this.label4.Visible = false; + // + // exclamation5 + // + this.exclamation5.AutoSize = true; + this.exclamation5.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation5.ForeColor = System.Drawing.Color.Red; + this.exclamation5.Location = new System.Drawing.Point(532, 232); + this.exclamation5.Name = "exclamation5"; + this.exclamation5.Size = new System.Drawing.Size(30, 38); + this.exclamation5.TabIndex = 21; + this.exclamation5.Text = "!"; + this.exclamation5.Visible = false; + // + // startTextBox5 + // + this.startTextBox5.Enabled = false; + this.startTextBox5.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox5.Location = new System.Drawing.Point(185, 236); + this.startTextBox5.Name = "startTextBox5"; + this.startTextBox5.Size = new System.Drawing.Size(163, 31); + this.startTextBox5.TabIndex = 19; + this.startTextBox5.Visible = false; + this.startTextBox5.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox5_KeyPress); + // + // endTextBox5 + // + this.endTextBox5.Enabled = false; + this.endTextBox5.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox5.Location = new System.Drawing.Point(367, 236); + this.endTextBox5.Name = "endTextBox5"; + this.endTextBox5.Size = new System.Drawing.Size(163, 31); + this.endTextBox5.TabIndex = 20; + this.endTextBox5.Visible = false; + this.endTextBox5.TextChanged += new System.EventHandler(this.endTextBox5_TextChanged); + this.endTextBox5.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox5_KeyPress); + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label5.Location = new System.Drawing.Point(23, 239); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(132, 23); + this.label5.TabIndex = 18; + this.label5.Text = "Volume 5 [l]"; + this.label5.Visible = false; + // + // exclamation6 + // + this.exclamation6.AutoSize = true; + this.exclamation6.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation6.ForeColor = System.Drawing.Color.Red; + this.exclamation6.Location = new System.Drawing.Point(532, 276); + this.exclamation6.Name = "exclamation6"; + this.exclamation6.Size = new System.Drawing.Size(30, 38); + this.exclamation6.TabIndex = 25; + this.exclamation6.Text = "!"; + this.exclamation6.Visible = false; + // + // startTextBox6 + // + this.startTextBox6.Enabled = false; + this.startTextBox6.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox6.Location = new System.Drawing.Point(185, 280); + this.startTextBox6.Name = "startTextBox6"; + this.startTextBox6.Size = new System.Drawing.Size(163, 31); + this.startTextBox6.TabIndex = 23; + this.startTextBox6.Visible = false; + this.startTextBox6.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox6_KeyPress); + // + // endTextBox6 + // + this.endTextBox6.Enabled = false; + this.endTextBox6.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox6.Location = new System.Drawing.Point(367, 280); + this.endTextBox6.Name = "endTextBox6"; + this.endTextBox6.Size = new System.Drawing.Size(163, 31); + this.endTextBox6.TabIndex = 24; + this.endTextBox6.Visible = false; + this.endTextBox6.TextChanged += new System.EventHandler(this.endTextBox6_TextChanged); + this.endTextBox6.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox6_KeyPress); + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label6.Location = new System.Drawing.Point(23, 283); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(132, 23); + this.label6.TabIndex = 22; + this.label6.Text = "Volume 6 [l]"; + this.label6.Visible = false; + // + // startLabel + // + this.startLabel.AutoSize = true; + this.startLabel.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startLabel.Location = new System.Drawing.Point(237, 21); + this.startLabel.Name = "startLabel"; + this.startLabel.Size = new System.Drawing.Size(56, 23); + this.startLabel.TabIndex = 0; + this.startLabel.Text = "Start"; + // + // endLabel + // + this.endLabel.AutoSize = true; + this.endLabel.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endLabel.Location = new System.Drawing.Point(423, 21); + this.endLabel.Name = "endLabel"; + this.endLabel.Size = new System.Drawing.Size(46, 23); + this.endLabel.TabIndex = 1; + this.endLabel.Text = "End"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label2.Location = new System.Drawing.Point(23, 107); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(132, 23); + this.label2.TabIndex = 6; + this.label2.Text = "Volume 2 [l]"; + this.label2.Visible = false; + // + // endTextBox2 + // + this.endTextBox2.Enabled = false; + this.endTextBox2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox2.Location = new System.Drawing.Point(367, 104); + this.endTextBox2.Name = "endTextBox2"; + this.endTextBox2.Size = new System.Drawing.Size(163, 31); + this.endTextBox2.TabIndex = 8; + this.endTextBox2.Visible = false; + this.endTextBox2.TextChanged += new System.EventHandler(this.endTextBox2_TextChanged); + this.endTextBox2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox2_KeyPress); + // + // startTextBox2 + // + this.startTextBox2.Enabled = false; + this.startTextBox2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox2.Location = new System.Drawing.Point(185, 104); + this.startTextBox2.Name = "startTextBox2"; + this.startTextBox2.Size = new System.Drawing.Size(163, 31); + this.startTextBox2.TabIndex = 7; + this.startTextBox2.Visible = false; + this.startTextBox2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox2_KeyPress); + // + // exclamation2 + // + this.exclamation2.AutoSize = true; + this.exclamation2.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation2.ForeColor = System.Drawing.Color.Red; + this.exclamation2.Location = new System.Drawing.Point(532, 100); + this.exclamation2.Name = "exclamation2"; + this.exclamation2.Size = new System.Drawing.Size(30, 38); + this.exclamation2.TabIndex = 9; + this.exclamation2.Text = "!"; + this.exclamation2.Visible = false; + // + // exclamation7 + // + this.exclamation7.AutoSize = true; + this.exclamation7.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation7.ForeColor = System.Drawing.Color.Red; + this.exclamation7.Location = new System.Drawing.Point(532, 320); + this.exclamation7.Name = "exclamation7"; + this.exclamation7.Size = new System.Drawing.Size(30, 38); + this.exclamation7.TabIndex = 29; + this.exclamation7.Text = "!"; + this.exclamation7.Visible = false; + // + // startTextBox7 + // + this.startTextBox7.Enabled = false; + this.startTextBox7.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox7.Location = new System.Drawing.Point(185, 324); + this.startTextBox7.Name = "startTextBox7"; + this.startTextBox7.Size = new System.Drawing.Size(163, 31); + this.startTextBox7.TabIndex = 27; + this.startTextBox7.Visible = false; + this.startTextBox7.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox7_KeyPress); + // + // endTextBox7 + // + this.endTextBox7.Enabled = false; + this.endTextBox7.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox7.Location = new System.Drawing.Point(367, 324); + this.endTextBox7.Name = "endTextBox7"; + this.endTextBox7.Size = new System.Drawing.Size(163, 31); + this.endTextBox7.TabIndex = 28; + this.endTextBox7.Visible = false; + this.endTextBox7.TextChanged += new System.EventHandler(this.endTextBox7_TextChanged); + this.endTextBox7.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox7_KeyPress); + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label7.Location = new System.Drawing.Point(23, 327); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(132, 23); + this.label7.TabIndex = 26; + this.label7.Text = "Volume 7 [l]"; + this.label7.Visible = false; + // + // exclamation8 + // + this.exclamation8.AutoSize = true; + this.exclamation8.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation8.ForeColor = System.Drawing.Color.Red; + this.exclamation8.Location = new System.Drawing.Point(532, 364); + this.exclamation8.Name = "exclamation8"; + this.exclamation8.Size = new System.Drawing.Size(30, 38); + this.exclamation8.TabIndex = 33; + this.exclamation8.Text = "!"; + this.exclamation8.Visible = false; + // + // startTextBox8 + // + this.startTextBox8.Enabled = false; + this.startTextBox8.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox8.Location = new System.Drawing.Point(185, 368); + this.startTextBox8.Name = "startTextBox8"; + this.startTextBox8.Size = new System.Drawing.Size(163, 31); + this.startTextBox8.TabIndex = 31; + this.startTextBox8.Visible = false; + this.startTextBox8.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox8_KeyPress); + // + // endTextBox8 + // + this.endTextBox8.Enabled = false; + this.endTextBox8.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox8.Location = new System.Drawing.Point(367, 368); + this.endTextBox8.Name = "endTextBox8"; + this.endTextBox8.Size = new System.Drawing.Size(163, 31); + this.endTextBox8.TabIndex = 32; + this.endTextBox8.Visible = false; + this.endTextBox8.TextChanged += new System.EventHandler(this.endTextBox8_TextChanged); + this.endTextBox8.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox8_KeyPress); + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label8.Location = new System.Drawing.Point(23, 371); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(132, 23); + this.label8.TabIndex = 30; + this.label8.Text = "Volume 8 [l]"; + this.label8.Visible = false; + // + // exclamation9 + // + this.exclamation9.AutoSize = true; + this.exclamation9.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation9.ForeColor = System.Drawing.Color.Red; + this.exclamation9.Location = new System.Drawing.Point(532, 408); + this.exclamation9.Name = "exclamation9"; + this.exclamation9.Size = new System.Drawing.Size(30, 38); + this.exclamation9.TabIndex = 37; + this.exclamation9.Text = "!"; + this.exclamation9.Visible = false; + // + // startTextBox9 + // + this.startTextBox9.Enabled = false; + this.startTextBox9.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox9.Location = new System.Drawing.Point(185, 412); + this.startTextBox9.Name = "startTextBox9"; + this.startTextBox9.Size = new System.Drawing.Size(163, 31); + this.startTextBox9.TabIndex = 35; + this.startTextBox9.Visible = false; + this.startTextBox9.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox9_KeyPress); + // + // endTextBox9 + // + this.endTextBox9.Enabled = false; + this.endTextBox9.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox9.Location = new System.Drawing.Point(367, 412); + this.endTextBox9.Name = "endTextBox9"; + this.endTextBox9.Size = new System.Drawing.Size(163, 31); + this.endTextBox9.TabIndex = 36; + this.endTextBox9.Visible = false; + this.endTextBox9.TextChanged += new System.EventHandler(this.endTextBox9_TextChanged); + this.endTextBox9.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox9_KeyPress); + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label9.Location = new System.Drawing.Point(23, 415); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(132, 23); + this.label9.TabIndex = 34; + this.label9.Text = "Volume 9 [l]"; + this.label9.Visible = false; + // + // exclamation10 + // + this.exclamation10.AutoSize = true; + this.exclamation10.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation10.ForeColor = System.Drawing.Color.Red; + this.exclamation10.Location = new System.Drawing.Point(532, 452); + this.exclamation10.Name = "exclamation10"; + this.exclamation10.Size = new System.Drawing.Size(30, 38); + this.exclamation10.TabIndex = 41; + this.exclamation10.Text = "!"; + this.exclamation10.Visible = false; + // + // startTextBox10 + // + this.startTextBox10.Enabled = false; + this.startTextBox10.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox10.Location = new System.Drawing.Point(185, 456); + this.startTextBox10.Name = "startTextBox10"; + this.startTextBox10.Size = new System.Drawing.Size(163, 31); + this.startTextBox10.TabIndex = 39; + this.startTextBox10.Visible = false; + this.startTextBox10.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox10_KeyPress); + // + // endTextBox10 + // + this.endTextBox10.Enabled = false; + this.endTextBox10.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox10.Location = new System.Drawing.Point(367, 456); + this.endTextBox10.Name = "endTextBox10"; + this.endTextBox10.Size = new System.Drawing.Size(163, 31); + this.endTextBox10.TabIndex = 40; + this.endTextBox10.Visible = false; + this.endTextBox10.TextChanged += new System.EventHandler(this.endTextBox10_TextChanged); + this.endTextBox10.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox10_KeyPress); + // + // label10 + // + this.label10.AutoSize = true; + this.label10.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label10.Location = new System.Drawing.Point(23, 459); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(144, 23); + this.label10.TabIndex = 38; + this.label10.Text = "Volume 10 [l]"; + this.label10.Visible = false; + // + // exclamation11 + // + this.exclamation11.AutoSize = true; + this.exclamation11.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation11.ForeColor = System.Drawing.Color.Red; + this.exclamation11.Location = new System.Drawing.Point(532, 496); + this.exclamation11.Name = "exclamation11"; + this.exclamation11.Size = new System.Drawing.Size(30, 38); + this.exclamation11.TabIndex = 45; + this.exclamation11.Text = "!"; + this.exclamation11.Visible = false; + // + // startTextBox11 + // + this.startTextBox11.Enabled = false; + this.startTextBox11.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox11.Location = new System.Drawing.Point(185, 500); + this.startTextBox11.Name = "startTextBox11"; + this.startTextBox11.Size = new System.Drawing.Size(163, 31); + this.startTextBox11.TabIndex = 43; + this.startTextBox11.Visible = false; + this.startTextBox11.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox11_KeyPress); + // + // endTextBox11 + // + this.endTextBox11.Enabled = false; + this.endTextBox11.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox11.Location = new System.Drawing.Point(367, 500); + this.endTextBox11.Name = "endTextBox11"; + this.endTextBox11.Size = new System.Drawing.Size(163, 31); + this.endTextBox11.TabIndex = 44; + this.endTextBox11.Visible = false; + this.endTextBox11.TextChanged += new System.EventHandler(this.endTextBox11_TextChanged); + this.endTextBox11.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox11_KeyPress); + // + // label11 + // + this.label11.AutoSize = true; + this.label11.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label11.Location = new System.Drawing.Point(23, 503); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(144, 23); + this.label11.TabIndex = 42; + this.label11.Text = "Volume 11 [l]"; + this.label11.Visible = false; + // + // exclamation12 + // + this.exclamation12.AutoSize = true; + this.exclamation12.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation12.ForeColor = System.Drawing.Color.Red; + this.exclamation12.Location = new System.Drawing.Point(532, 540); + this.exclamation12.Name = "exclamation12"; + this.exclamation12.Size = new System.Drawing.Size(30, 38); + this.exclamation12.TabIndex = 49; + this.exclamation12.Text = "!"; + this.exclamation12.Visible = false; + // + // startTextBox12 + // + this.startTextBox12.Enabled = false; + this.startTextBox12.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox12.Location = new System.Drawing.Point(185, 544); + this.startTextBox12.Name = "startTextBox12"; + this.startTextBox12.Size = new System.Drawing.Size(163, 31); + this.startTextBox12.TabIndex = 47; + this.startTextBox12.Visible = false; + this.startTextBox12.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox12_KeyPress); + // + // endTextBox12 + // + this.endTextBox12.Enabled = false; + this.endTextBox12.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox12.Location = new System.Drawing.Point(367, 544); + this.endTextBox12.Name = "endTextBox12"; + this.endTextBox12.Size = new System.Drawing.Size(163, 31); + this.endTextBox12.TabIndex = 48; + this.endTextBox12.Visible = false; + this.endTextBox12.TextChanged += new System.EventHandler(this.endTextBox12_TextChanged); + this.endTextBox12.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox12_KeyPress); + // + // label12 + // + this.label12.AutoSize = true; + this.label12.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label12.Location = new System.Drawing.Point(23, 547); + this.label12.Name = "label12"; + this.label12.Size = new System.Drawing.Size(144, 23); + this.label12.TabIndex = 46; + this.label12.Text = "Volume 12 [l]"; + this.label12.Visible = false; + // + // exclamation24 + // + this.exclamation24.AutoSize = true; + this.exclamation24.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation24.ForeColor = System.Drawing.Color.Red; + this.exclamation24.Location = new System.Drawing.Point(1101, 540); + this.exclamation24.Name = "exclamation24"; + this.exclamation24.Size = new System.Drawing.Size(30, 38); + this.exclamation24.TabIndex = 99; + this.exclamation24.Text = "!"; + this.exclamation24.Visible = false; + // + // startTextBox24 + // + this.startTextBox24.Enabled = false; + this.startTextBox24.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox24.Location = new System.Drawing.Point(754, 544); + this.startTextBox24.Name = "startTextBox24"; + this.startTextBox24.Size = new System.Drawing.Size(163, 31); + this.startTextBox24.TabIndex = 97; + this.startTextBox24.Visible = false; + this.startTextBox24.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox24_KeyPress); + // + // endTextBox24 + // + this.endTextBox24.Enabled = false; + this.endTextBox24.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox24.Location = new System.Drawing.Point(936, 544); + this.endTextBox24.Name = "endTextBox24"; + this.endTextBox24.Size = new System.Drawing.Size(163, 31); + this.endTextBox24.TabIndex = 98; + this.endTextBox24.Visible = false; + this.endTextBox24.TextChanged += new System.EventHandler(this.endTextBox24_TextChanged); + this.endTextBox24.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox24_KeyPress); + // + // label24 + // + this.label24.AutoSize = true; + this.label24.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label24.Location = new System.Drawing.Point(592, 547); + this.label24.Name = "label24"; + this.label24.Size = new System.Drawing.Size(107, 23); + this.label24.TabIndex = 96; + this.label24.Text = "Energy 12"; + this.label24.Visible = false; + // + // exclamation23 + // + this.exclamation23.AutoSize = true; + this.exclamation23.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation23.ForeColor = System.Drawing.Color.Red; + this.exclamation23.Location = new System.Drawing.Point(1101, 496); + this.exclamation23.Name = "exclamation23"; + this.exclamation23.Size = new System.Drawing.Size(30, 38); + this.exclamation23.TabIndex = 95; + this.exclamation23.Text = "!"; + this.exclamation23.Visible = false; + // + // startTextBox23 + // + this.startTextBox23.Enabled = false; + this.startTextBox23.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox23.Location = new System.Drawing.Point(754, 500); + this.startTextBox23.Name = "startTextBox23"; + this.startTextBox23.Size = new System.Drawing.Size(163, 31); + this.startTextBox23.TabIndex = 93; + this.startTextBox23.Visible = false; + this.startTextBox23.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox23_KeyPress); + // + // endTextBox23 + // + this.endTextBox23.Enabled = false; + this.endTextBox23.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox23.Location = new System.Drawing.Point(936, 500); + this.endTextBox23.Name = "endTextBox23"; + this.endTextBox23.Size = new System.Drawing.Size(163, 31); + this.endTextBox23.TabIndex = 94; + this.endTextBox23.Visible = false; + this.endTextBox23.TextChanged += new System.EventHandler(this.endTextBox23_TextChanged); + this.endTextBox23.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox23_KeyPress); + // + // label23 + // + this.label23.AutoSize = true; + this.label23.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label23.Location = new System.Drawing.Point(592, 503); + this.label23.Name = "label23"; + this.label23.Size = new System.Drawing.Size(107, 23); + this.label23.TabIndex = 92; + this.label23.Text = "Energy 11"; + this.label23.Visible = false; + // + // exclamation22 + // + this.exclamation22.AutoSize = true; + this.exclamation22.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation22.ForeColor = System.Drawing.Color.Red; + this.exclamation22.Location = new System.Drawing.Point(1101, 452); + this.exclamation22.Name = "exclamation22"; + this.exclamation22.Size = new System.Drawing.Size(30, 38); + this.exclamation22.TabIndex = 91; + this.exclamation22.Text = "!"; + this.exclamation22.Visible = false; + // + // startTextBox22 + // + this.startTextBox22.Enabled = false; + this.startTextBox22.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox22.Location = new System.Drawing.Point(754, 456); + this.startTextBox22.Name = "startTextBox22"; + this.startTextBox22.Size = new System.Drawing.Size(163, 31); + this.startTextBox22.TabIndex = 89; + this.startTextBox22.Visible = false; + this.startTextBox22.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox22_KeyPress); + // + // endTextBox22 + // + this.endTextBox22.Enabled = false; + this.endTextBox22.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox22.Location = new System.Drawing.Point(936, 456); + this.endTextBox22.Name = "endTextBox22"; + this.endTextBox22.Size = new System.Drawing.Size(163, 31); + this.endTextBox22.TabIndex = 90; + this.endTextBox22.Visible = false; + this.endTextBox22.TextChanged += new System.EventHandler(this.endTextBox22_TextChanged); + this.endTextBox22.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox22_KeyPress); + // + // label22 + // + this.label22.AutoSize = true; + this.label22.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label22.Location = new System.Drawing.Point(592, 459); + this.label22.Name = "label22"; + this.label22.Size = new System.Drawing.Size(107, 23); + this.label22.TabIndex = 88; + this.label22.Text = "Energy 10"; + this.label22.Visible = false; + // + // exclamation21 + // + this.exclamation21.AutoSize = true; + this.exclamation21.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation21.ForeColor = System.Drawing.Color.Red; + this.exclamation21.Location = new System.Drawing.Point(1101, 408); + this.exclamation21.Name = "exclamation21"; + this.exclamation21.Size = new System.Drawing.Size(30, 38); + this.exclamation21.TabIndex = 87; + this.exclamation21.Text = "!"; + this.exclamation21.Visible = false; + // + // startTextBox21 + // + this.startTextBox21.Enabled = false; + this.startTextBox21.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox21.Location = new System.Drawing.Point(754, 412); + this.startTextBox21.Name = "startTextBox21"; + this.startTextBox21.Size = new System.Drawing.Size(163, 31); + this.startTextBox21.TabIndex = 85; + this.startTextBox21.Visible = false; + this.startTextBox21.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox21_KeyPress); + // + // endTextBox21 + // + this.endTextBox21.Enabled = false; + this.endTextBox21.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox21.Location = new System.Drawing.Point(936, 412); + this.endTextBox21.Name = "endTextBox21"; + this.endTextBox21.Size = new System.Drawing.Size(163, 31); + this.endTextBox21.TabIndex = 86; + this.endTextBox21.Visible = false; + this.endTextBox21.TextChanged += new System.EventHandler(this.endTextBox21_TextChanged); + this.endTextBox21.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox21_KeyPress); + // + // label21 + // + this.label21.AutoSize = true; + this.label21.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label21.Location = new System.Drawing.Point(592, 415); + this.label21.Name = "label21"; + this.label21.Size = new System.Drawing.Size(95, 23); + this.label21.TabIndex = 84; + this.label21.Text = "Energy 9"; + this.label21.Visible = false; + // + // exclamation20 + // + this.exclamation20.AutoSize = true; + this.exclamation20.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation20.ForeColor = System.Drawing.Color.Red; + this.exclamation20.Location = new System.Drawing.Point(1101, 364); + this.exclamation20.Name = "exclamation20"; + this.exclamation20.Size = new System.Drawing.Size(30, 38); + this.exclamation20.TabIndex = 83; + this.exclamation20.Text = "!"; + this.exclamation20.Visible = false; + // + // startTextBox20 + // + this.startTextBox20.Enabled = false; + this.startTextBox20.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox20.Location = new System.Drawing.Point(754, 368); + this.startTextBox20.Name = "startTextBox20"; + this.startTextBox20.Size = new System.Drawing.Size(163, 31); + this.startTextBox20.TabIndex = 81; + this.startTextBox20.Visible = false; + this.startTextBox20.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox20_KeyPress); + // + // endTextBox20 + // + this.endTextBox20.Enabled = false; + this.endTextBox20.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox20.Location = new System.Drawing.Point(936, 368); + this.endTextBox20.Name = "endTextBox20"; + this.endTextBox20.Size = new System.Drawing.Size(163, 31); + this.endTextBox20.TabIndex = 82; + this.endTextBox20.Visible = false; + this.endTextBox20.TextChanged += new System.EventHandler(this.endTextBox20_TextChanged); + this.endTextBox20.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox20_KeyPress); + // + // label20 + // + this.label20.AutoSize = true; + this.label20.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label20.Location = new System.Drawing.Point(592, 371); + this.label20.Name = "label20"; + this.label20.Size = new System.Drawing.Size(95, 23); + this.label20.TabIndex = 80; + this.label20.Text = "Energy 8"; + this.label20.Visible = false; + // + // exclamation19 + // + this.exclamation19.AutoSize = true; + this.exclamation19.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation19.ForeColor = System.Drawing.Color.Red; + this.exclamation19.Location = new System.Drawing.Point(1101, 320); + this.exclamation19.Name = "exclamation19"; + this.exclamation19.Size = new System.Drawing.Size(30, 38); + this.exclamation19.TabIndex = 79; + this.exclamation19.Text = "!"; + this.exclamation19.Visible = false; + // + // startTextBox19 + // + this.startTextBox19.Enabled = false; + this.startTextBox19.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox19.Location = new System.Drawing.Point(754, 324); + this.startTextBox19.Name = "startTextBox19"; + this.startTextBox19.Size = new System.Drawing.Size(163, 31); + this.startTextBox19.TabIndex = 77; + this.startTextBox19.Visible = false; + this.startTextBox19.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox19_KeyPress); + // + // endTextBox19 + // + this.endTextBox19.Enabled = false; + this.endTextBox19.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox19.Location = new System.Drawing.Point(936, 324); + this.endTextBox19.Name = "endTextBox19"; + this.endTextBox19.Size = new System.Drawing.Size(163, 31); + this.endTextBox19.TabIndex = 78; + this.endTextBox19.Visible = false; + this.endTextBox19.TextChanged += new System.EventHandler(this.endTextBox19_TextChanged); + this.endTextBox19.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox19_KeyPress); + // + // label19 + // + this.label19.AutoSize = true; + this.label19.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label19.Location = new System.Drawing.Point(592, 327); + this.label19.Name = "label19"; + this.label19.Size = new System.Drawing.Size(95, 23); + this.label19.TabIndex = 76; + this.label19.Text = "Energy 7"; + this.label19.Visible = false; + // + // exclamation18 + // + this.exclamation18.AutoSize = true; + this.exclamation18.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation18.ForeColor = System.Drawing.Color.Red; + this.exclamation18.Location = new System.Drawing.Point(1101, 276); + this.exclamation18.Name = "exclamation18"; + this.exclamation18.Size = new System.Drawing.Size(30, 38); + this.exclamation18.TabIndex = 75; + this.exclamation18.Text = "!"; + this.exclamation18.Visible = false; + // + // exclamation17 + // + this.exclamation17.AutoSize = true; + this.exclamation17.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation17.ForeColor = System.Drawing.Color.Red; + this.exclamation17.Location = new System.Drawing.Point(1101, 232); + this.exclamation17.Name = "exclamation17"; + this.exclamation17.Size = new System.Drawing.Size(30, 38); + this.exclamation17.TabIndex = 71; + this.exclamation17.Text = "!"; + this.exclamation17.Visible = false; + // + // startTextBox18 + // + this.startTextBox18.Enabled = false; + this.startTextBox18.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox18.Location = new System.Drawing.Point(754, 280); + this.startTextBox18.Name = "startTextBox18"; + this.startTextBox18.Size = new System.Drawing.Size(163, 31); + this.startTextBox18.TabIndex = 73; + this.startTextBox18.Visible = false; + this.startTextBox18.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox18_KeyPress); + // + // exclamation16 + // + this.exclamation16.AutoSize = true; + this.exclamation16.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation16.ForeColor = System.Drawing.Color.Red; + this.exclamation16.Location = new System.Drawing.Point(1101, 188); + this.exclamation16.Name = "exclamation16"; + this.exclamation16.Size = new System.Drawing.Size(30, 38); + this.exclamation16.TabIndex = 67; + this.exclamation16.Text = "!"; + this.exclamation16.Visible = false; + // + // endTextBox18 + // + this.endTextBox18.Enabled = false; + this.endTextBox18.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox18.Location = new System.Drawing.Point(936, 280); + this.endTextBox18.Name = "endTextBox18"; + this.endTextBox18.Size = new System.Drawing.Size(163, 31); + this.endTextBox18.TabIndex = 74; + this.endTextBox18.Visible = false; + this.endTextBox18.TextChanged += new System.EventHandler(this.endTextBox18_TextChanged); + this.endTextBox18.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox18_KeyPress); + // + // label18 + // + this.label18.AutoSize = true; + this.label18.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label18.Location = new System.Drawing.Point(592, 283); + this.label18.Name = "label18"; + this.label18.Size = new System.Drawing.Size(95, 23); + this.label18.TabIndex = 72; + this.label18.Text = "Energy 6"; + this.label18.Visible = false; + // + // startTextBox17 + // + this.startTextBox17.Enabled = false; + this.startTextBox17.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox17.Location = new System.Drawing.Point(754, 236); + this.startTextBox17.Name = "startTextBox17"; + this.startTextBox17.Size = new System.Drawing.Size(163, 31); + this.startTextBox17.TabIndex = 69; + this.startTextBox17.Visible = false; + this.startTextBox17.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox17_KeyPress); + // + // exclamation15 + // + this.exclamation15.AutoSize = true; + this.exclamation15.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation15.ForeColor = System.Drawing.Color.Red; + this.exclamation15.Location = new System.Drawing.Point(1101, 144); + this.exclamation15.Name = "exclamation15"; + this.exclamation15.Size = new System.Drawing.Size(30, 38); + this.exclamation15.TabIndex = 63; + this.exclamation15.Text = "!"; + this.exclamation15.Visible = false; + // + // endTextBox17 + // + this.endTextBox17.Enabled = false; + this.endTextBox17.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox17.Location = new System.Drawing.Point(936, 236); + this.endTextBox17.Name = "endTextBox17"; + this.endTextBox17.Size = new System.Drawing.Size(163, 31); + this.endTextBox17.TabIndex = 70; + this.endTextBox17.Visible = false; + this.endTextBox17.TextChanged += new System.EventHandler(this.endTextBox17_TextChanged); + this.endTextBox17.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox17_KeyPress); + // + // label17 + // + this.label17.AutoSize = true; + this.label17.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label17.Location = new System.Drawing.Point(592, 239); + this.label17.Name = "label17"; + this.label17.Size = new System.Drawing.Size(95, 23); + this.label17.TabIndex = 68; + this.label17.Text = "Energy 5"; + this.label17.Visible = false; + // + // startTextBox16 + // + this.startTextBox16.Enabled = false; + this.startTextBox16.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox16.Location = new System.Drawing.Point(754, 192); + this.startTextBox16.Name = "startTextBox16"; + this.startTextBox16.Size = new System.Drawing.Size(163, 31); + this.startTextBox16.TabIndex = 65; + this.startTextBox16.Visible = false; + this.startTextBox16.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox16_KeyPress); + // + // exclamation14 + // + this.exclamation14.AutoSize = true; + this.exclamation14.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation14.ForeColor = System.Drawing.Color.Red; + this.exclamation14.Location = new System.Drawing.Point(1101, 100); + this.exclamation14.Name = "exclamation14"; + this.exclamation14.Size = new System.Drawing.Size(30, 38); + this.exclamation14.TabIndex = 59; + this.exclamation14.Text = "!"; + this.exclamation14.Visible = false; + // + // endTextBox16 + // + this.endTextBox16.Enabled = false; + this.endTextBox16.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox16.Location = new System.Drawing.Point(936, 192); + this.endTextBox16.Name = "endTextBox16"; + this.endTextBox16.Size = new System.Drawing.Size(163, 31); + this.endTextBox16.TabIndex = 66; + this.endTextBox16.Visible = false; + this.endTextBox16.TextChanged += new System.EventHandler(this.endTextBox16_TextChanged); + this.endTextBox16.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox16_KeyPress); + // + // label16 + // + this.label16.AutoSize = true; + this.label16.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label16.Location = new System.Drawing.Point(592, 195); + this.label16.Name = "label16"; + this.label16.Size = new System.Drawing.Size(95, 23); + this.label16.TabIndex = 64; + this.label16.Text = "Energy 4"; + this.label16.Visible = false; + // + // startTextBox15 + // + this.startTextBox15.Enabled = false; + this.startTextBox15.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox15.Location = new System.Drawing.Point(754, 148); + this.startTextBox15.Name = "startTextBox15"; + this.startTextBox15.Size = new System.Drawing.Size(163, 31); + this.startTextBox15.TabIndex = 61; + this.startTextBox15.Visible = false; + this.startTextBox15.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox15_KeyPress); + // + // exclamation13 + // + this.exclamation13.AutoSize = true; + this.exclamation13.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation13.ForeColor = System.Drawing.Color.Red; + this.exclamation13.Location = new System.Drawing.Point(1101, 56); + this.exclamation13.Name = "exclamation13"; + this.exclamation13.Size = new System.Drawing.Size(30, 38); + this.exclamation13.TabIndex = 55; + this.exclamation13.Text = "!"; + this.exclamation13.Visible = false; + // + // endTextBox15 + // + this.endTextBox15.Enabled = false; + this.endTextBox15.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox15.Location = new System.Drawing.Point(936, 148); + this.endTextBox15.Name = "endTextBox15"; + this.endTextBox15.Size = new System.Drawing.Size(163, 31); + this.endTextBox15.TabIndex = 62; + this.endTextBox15.Visible = false; + this.endTextBox15.TextChanged += new System.EventHandler(this.endTextBox15_TextChanged); + this.endTextBox15.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox15_KeyPress); + // + // label15 + // + this.label15.AutoSize = true; + this.label15.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label15.Location = new System.Drawing.Point(592, 151); + this.label15.Name = "label15"; + this.label15.Size = new System.Drawing.Size(95, 23); + this.label15.TabIndex = 60; + this.label15.Text = "Energy 3"; + this.label15.Visible = false; + // + // startTextBox14 + // + this.startTextBox14.Enabled = false; + this.startTextBox14.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox14.Location = new System.Drawing.Point(754, 104); + this.startTextBox14.Name = "startTextBox14"; + this.startTextBox14.Size = new System.Drawing.Size(163, 31); + this.startTextBox14.TabIndex = 57; + this.startTextBox14.Visible = false; + this.startTextBox14.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox14_KeyPress); + // + // label35 + // + this.label35.AutoSize = true; + this.label35.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label35.Location = new System.Drawing.Point(992, 21); + this.label35.Name = "label35"; + this.label35.Size = new System.Drawing.Size(46, 23); + this.label35.TabIndex = 51; + this.label35.Text = "End"; + // + // endTextBox14 + // + this.endTextBox14.Enabled = false; + this.endTextBox14.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox14.Location = new System.Drawing.Point(936, 104); + this.endTextBox14.Name = "endTextBox14"; + this.endTextBox14.Size = new System.Drawing.Size(163, 31); + this.endTextBox14.TabIndex = 58; + this.endTextBox14.Visible = false; + this.endTextBox14.TextChanged += new System.EventHandler(this.endTextBox14_TextChanged); + this.endTextBox14.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox14_KeyPress); + // + // label14 + // + this.label14.AutoSize = true; + this.label14.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label14.Location = new System.Drawing.Point(592, 107); + this.label14.Name = "label14"; + this.label14.Size = new System.Drawing.Size(95, 23); + this.label14.TabIndex = 56; + this.label14.Text = "Energy 2"; + this.label14.Visible = false; + // + // startTextBox13 + // + this.startTextBox13.Enabled = false; + this.startTextBox13.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox13.Location = new System.Drawing.Point(754, 60); + this.startTextBox13.Name = "startTextBox13"; + this.startTextBox13.Size = new System.Drawing.Size(163, 31); + this.startTextBox13.TabIndex = 53; + this.startTextBox13.Visible = false; + this.startTextBox13.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox13_KeyPress); + // + // label37 + // + this.label37.AutoSize = true; + this.label37.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label37.Location = new System.Drawing.Point(806, 21); + this.label37.Name = "label37"; + this.label37.Size = new System.Drawing.Size(56, 23); + this.label37.TabIndex = 50; + this.label37.Text = "Start"; + // + // endTextBox13 + // + this.endTextBox13.Enabled = false; + this.endTextBox13.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox13.Location = new System.Drawing.Point(936, 60); + this.endTextBox13.Name = "endTextBox13"; + this.endTextBox13.Size = new System.Drawing.Size(163, 31); + this.endTextBox13.TabIndex = 54; + this.endTextBox13.Visible = false; + this.endTextBox13.TextChanged += new System.EventHandler(this.endTextBox13_TextChanged); + this.endTextBox13.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox13_KeyPress); + // + // label13 + // + this.label13.AutoSize = true; + this.label13.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label13.Location = new System.Drawing.Point(592, 63); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(95, 23); + this.label13.TabIndex = 52; + this.label13.Text = "Energy 1"; + this.label13.Visible = false; + // + // unitsComboBox + // + this.unitsComboBox.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.unitsComboBox.FormattingEnabled = true; + this.unitsComboBox.Location = new System.Drawing.Point(1159, 192); + this.unitsComboBox.Name = "unitsComboBox"; + this.unitsComboBox.Size = new System.Drawing.Size(98, 31); + this.unitsComboBox.TabIndex = 101; + this.unitsComboBox.SelectedIndexChanged += new System.EventHandler(this.unitsComboBox_SelectedIndexChanged); + // + // unitsLabel + // + this.unitsLabel.AutoSize = true; + this.unitsLabel.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.unitsLabel.Location = new System.Drawing.Point(1155, 159); + this.unitsLabel.Name = "unitsLabel"; + this.unitsLabel.Size = new System.Drawing.Size(68, 23); + this.unitsLabel.TabIndex = 102; + this.unitsLabel.Text = "Units:"; + // + // TestStartEndForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.ClientSize = new System.Drawing.Size(1292, 613); + this.Controls.Add(this.unitsLabel); + this.Controls.Add(this.unitsComboBox); + this.Controls.Add(this.exclamation24); + this.Controls.Add(this.startTextBox24); + this.Controls.Add(this.endTextBox24); + this.Controls.Add(this.label24); + this.Controls.Add(this.exclamation23); + this.Controls.Add(this.startTextBox23); + this.Controls.Add(this.endTextBox23); + this.Controls.Add(this.label23); + this.Controls.Add(this.exclamation22); + this.Controls.Add(this.startTextBox22); + this.Controls.Add(this.endTextBox22); + this.Controls.Add(this.label22); + this.Controls.Add(this.exclamation21); + this.Controls.Add(this.startTextBox21); + this.Controls.Add(this.endTextBox21); + this.Controls.Add(this.label21); + this.Controls.Add(this.exclamation20); + this.Controls.Add(this.startTextBox20); + this.Controls.Add(this.endTextBox20); + this.Controls.Add(this.label20); + this.Controls.Add(this.exclamation19); + this.Controls.Add(this.startTextBox19); + this.Controls.Add(this.endTextBox19); + this.Controls.Add(this.label19); + this.Controls.Add(this.exclamation18); + this.Controls.Add(this.exclamation17); + this.Controls.Add(this.startTextBox18); + this.Controls.Add(this.exclamation16); + this.Controls.Add(this.endTextBox18); + this.Controls.Add(this.label18); + this.Controls.Add(this.startTextBox17); + this.Controls.Add(this.exclamation15); + this.Controls.Add(this.endTextBox17); + this.Controls.Add(this.label17); + this.Controls.Add(this.startTextBox16); + this.Controls.Add(this.exclamation14); + this.Controls.Add(this.endTextBox16); + this.Controls.Add(this.label16); + this.Controls.Add(this.startTextBox15); + this.Controls.Add(this.exclamation13); + this.Controls.Add(this.endTextBox15); + this.Controls.Add(this.label15); + this.Controls.Add(this.startTextBox14); + this.Controls.Add(this.label35); + this.Controls.Add(this.endTextBox14); + this.Controls.Add(this.label14); + this.Controls.Add(this.startTextBox13); + this.Controls.Add(this.label37); + this.Controls.Add(this.endTextBox13); + this.Controls.Add(this.label13); + this.Controls.Add(this.exclamation12); + this.Controls.Add(this.startTextBox12); + this.Controls.Add(this.endTextBox12); + this.Controls.Add(this.label12); + this.Controls.Add(this.exclamation11); + this.Controls.Add(this.startTextBox11); + this.Controls.Add(this.endTextBox11); + this.Controls.Add(this.label11); + this.Controls.Add(this.exclamation10); + this.Controls.Add(this.startTextBox10); + this.Controls.Add(this.endTextBox10); + this.Controls.Add(this.label10); + this.Controls.Add(this.exclamation9); + this.Controls.Add(this.startTextBox9); + this.Controls.Add(this.endTextBox9); + this.Controls.Add(this.label9); + this.Controls.Add(this.exclamation8); + this.Controls.Add(this.startTextBox8); + this.Controls.Add(this.endTextBox8); + this.Controls.Add(this.label8); + this.Controls.Add(this.exclamation7); + this.Controls.Add(this.startTextBox7); + this.Controls.Add(this.endTextBox7); + this.Controls.Add(this.label7); + this.Controls.Add(this.exclamation6); + this.Controls.Add(this.exclamation5); + this.Controls.Add(this.startTextBox6); + this.Controls.Add(this.exclamation4); + this.Controls.Add(this.endTextBox6); + this.Controls.Add(this.label6); + this.Controls.Add(this.startTextBox5); + this.Controls.Add(this.exclamation3); + this.Controls.Add(this.endTextBox5); + this.Controls.Add(this.label5); + this.Controls.Add(this.startTextBox4); + this.Controls.Add(this.exclamation2); + this.Controls.Add(this.endTextBox4); + this.Controls.Add(this.label4); + this.Controls.Add(this.startTextBox3); + this.Controls.Add(this.exclamation1); + this.Controls.Add(this.endTextBox3); + this.Controls.Add(this.label3); + this.Controls.Add(this.startTextBox2); + this.Controls.Add(this.endLabel); + this.Controls.Add(this.endTextBox2); + this.Controls.Add(this.label2); + this.Controls.Add(this.startTextBox1); + this.Controls.Add(this.startLabel); + this.Controls.Add(this.endTextBox1); + this.Controls.Add(this.label1); + this.Controls.Add(this.okButton); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "TestStartEndForm"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "End States"; + this.TopMost = true; + this.Load += new System.EventHandler(this.TestStartEndForm_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox endTextBox1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.TextBox endTextBox3; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox endTextBox4; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox endTextBox5; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.TextBox endTextBox6; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TextBox startTextBox1; + private System.Windows.Forms.TextBox startTextBox3; + private System.Windows.Forms.TextBox startTextBox4; + private System.Windows.Forms.TextBox startTextBox5; + private System.Windows.Forms.TextBox startTextBox6; + private System.Windows.Forms.Label startLabel; + private System.Windows.Forms.Label endLabel; + private System.Windows.Forms.Label exclamation1; + private System.Windows.Forms.Label exclamation3; + private System.Windows.Forms.Label exclamation4; + private System.Windows.Forms.Label exclamation5; + private System.Windows.Forms.Label exclamation6; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox endTextBox2; + private System.Windows.Forms.TextBox startTextBox2; + private System.Windows.Forms.Label exclamation2; + private System.Windows.Forms.Label exclamation7; + private System.Windows.Forms.TextBox startTextBox7; + private System.Windows.Forms.TextBox endTextBox7; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.Label exclamation8; + private System.Windows.Forms.TextBox startTextBox8; + private System.Windows.Forms.TextBox endTextBox8; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.Label exclamation9; + private System.Windows.Forms.TextBox startTextBox9; + private System.Windows.Forms.TextBox endTextBox9; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.Label exclamation10; + private System.Windows.Forms.TextBox startTextBox10; + private System.Windows.Forms.TextBox endTextBox10; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.Label exclamation11; + private System.Windows.Forms.TextBox startTextBox11; + private System.Windows.Forms.TextBox endTextBox11; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.Label exclamation12; + private System.Windows.Forms.TextBox startTextBox12; + private System.Windows.Forms.TextBox endTextBox12; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.Label exclamation24; + private System.Windows.Forms.TextBox startTextBox24; + private System.Windows.Forms.TextBox endTextBox24; + private System.Windows.Forms.Label label24; + private System.Windows.Forms.Label exclamation23; + private System.Windows.Forms.TextBox startTextBox23; + private System.Windows.Forms.TextBox endTextBox23; + private System.Windows.Forms.Label label23; + private System.Windows.Forms.Label exclamation22; + private System.Windows.Forms.TextBox startTextBox22; + private System.Windows.Forms.TextBox endTextBox22; + private System.Windows.Forms.Label label22; + private System.Windows.Forms.Label exclamation21; + private System.Windows.Forms.TextBox startTextBox21; + private System.Windows.Forms.TextBox endTextBox21; + private System.Windows.Forms.Label label21; + private System.Windows.Forms.Label exclamation20; + private System.Windows.Forms.TextBox startTextBox20; + private System.Windows.Forms.TextBox endTextBox20; + private System.Windows.Forms.Label label20; + private System.Windows.Forms.Label exclamation19; + private System.Windows.Forms.TextBox startTextBox19; + private System.Windows.Forms.TextBox endTextBox19; + private System.Windows.Forms.Label label19; + private System.Windows.Forms.Label exclamation18; + private System.Windows.Forms.Label exclamation17; + private System.Windows.Forms.TextBox startTextBox18; + private System.Windows.Forms.Label exclamation16; + private System.Windows.Forms.TextBox endTextBox18; + private System.Windows.Forms.Label label18; + private System.Windows.Forms.TextBox startTextBox17; + private System.Windows.Forms.Label exclamation15; + private System.Windows.Forms.TextBox endTextBox17; + private System.Windows.Forms.Label label17; + private System.Windows.Forms.TextBox startTextBox16; + private System.Windows.Forms.Label exclamation14; + private System.Windows.Forms.TextBox endTextBox16; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.TextBox startTextBox15; + private System.Windows.Forms.Label exclamation13; + private System.Windows.Forms.TextBox endTextBox15; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.TextBox startTextBox14; + private System.Windows.Forms.Label label35; + private System.Windows.Forms.TextBox endTextBox14; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.TextBox startTextBox13; + private System.Windows.Forms.Label label37; + private System.Windows.Forms.TextBox endTextBox13; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.ComboBox unitsComboBox; + private System.Windows.Forms.Label unitsLabel; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/TestStartEndForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/TestStartEndForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters12/TestStartEndForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/CycleBeginningForm.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/CycleBeginningForm.Designer.cs new file mode 100644 index 00000000..352d5f94 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/CycleBeginningForm.Designer.cs @@ -0,0 +1,490 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.HeatMeters6 +{ + partial class CycleBeginningForm + { + /// + /// 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(CycleBeginningForm)); + this.okButton = new System.Windows.Forms.Button(); + this.orderGroupBox = new System.Windows.Forms.GroupBox(); + this.orderComboBox = new System.Windows.Forms.ComboBox(); + this.clearButton = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.checkBox1 = new System.Windows.Forms.CheckBox(); + this.checkBox2 = new System.Windows.Forms.CheckBox(); + this.comboBox2 = new System.Windows.Forms.ComboBox(); + this.label2 = new System.Windows.Forms.Label(); + this.checkBox3 = new System.Windows.Forms.CheckBox(); + this.comboBox3 = new System.Windows.Forms.ComboBox(); + this.label3 = new System.Windows.Forms.Label(); + this.checkBox4 = new System.Windows.Forms.CheckBox(); + this.comboBox4 = new System.Windows.Forms.ComboBox(); + this.label4 = new System.Windows.Forms.Label(); + this.checkBox5 = new System.Windows.Forms.CheckBox(); + this.comboBox5 = new System.Windows.Forms.ComboBox(); + this.label5 = new System.Windows.Forms.Label(); + this.checkBox6 = new System.Windows.Forms.CheckBox(); + this.comboBox6 = new System.Windows.Forms.ComboBox(); + this.label6 = new System.Windows.Forms.Label(); + this.extensionsGroupBox = new System.Windows.Forms.GroupBox(); + this.remarkTextBox = new System.Windows.Forms.TextBox(); + this.label16 = new System.Windows.Forms.Label(); + this.snSuffixTextBox = new System.Windows.Forms.TextBox(); + this.label15 = new System.Windows.Forms.Label(); + this.snPrefixTextBox = new System.Windows.Forms.TextBox(); + this.label14 = new System.Windows.Forms.Label(); + this.idNumberTextBox = new System.Windows.Forms.TextBox(); + this.label13 = new System.Windows.Forms.Label(); + this.ext4Label = new System.Windows.Forms.Label(); + this.ext4TextBox = new System.Windows.Forms.TextBox(); + this.ext3Label = new System.Windows.Forms.Label(); + this.ext3TextBox = new System.Windows.Forms.TextBox(); + this.ext2Label = new System.Windows.Forms.Label(); + this.ext2TextBox = new System.Windows.Forms.TextBox(); + this.ext1Label = new System.Windows.Forms.Label(); + this.ext1TextBox = new System.Windows.Forms.TextBox(); + this.autoSNButton = new System.Windows.Forms.Button(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.pictureBox2 = new System.Windows.Forms.PictureBox(); + this.pictureBox3 = new System.Windows.Forms.PictureBox(); + this.pictureBox4 = new System.Windows.Forms.PictureBox(); + this.pictureBox5 = new System.Windows.Forms.PictureBox(); + this.pictureBox6 = new System.Windows.Forms.PictureBox(); + this.orderGroupBox.SuspendLayout(); + this.extensionsGroupBox.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox5)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox6)).BeginInit(); + this.SuspendLayout(); + // + // okButton + // + resources.ApplyResources(this.okButton, "okButton"); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Name = "okButton"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // orderGroupBox + // + this.orderGroupBox.Controls.Add(this.orderComboBox); + resources.ApplyResources(this.orderGroupBox, "orderGroupBox"); + this.orderGroupBox.ForeColor = System.Drawing.Color.Black; + this.orderGroupBox.Name = "orderGroupBox"; + this.orderGroupBox.TabStop = false; + // + // orderComboBox + // + this.orderComboBox.FormattingEnabled = true; + resources.ApplyResources(this.orderComboBox, "orderComboBox"); + this.orderComboBox.Name = "orderComboBox"; + // + // clearButton + // + resources.ApplyResources(this.clearButton, "clearButton"); + this.clearButton.ForeColor = System.Drawing.Color.Black; + this.clearButton.Name = "clearButton"; + this.clearButton.UseVisualStyleBackColor = true; + this.clearButton.Click += new System.EventHandler(this.clearButton_Click); + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // comboBox1 + // + resources.ApplyResources(this.comboBox1, "comboBox1"); + this.comboBox1.FormattingEnabled = true; + this.comboBox1.Name = "comboBox1"; + this.comboBox1.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged); + this.comboBox1.TextChanged += new System.EventHandler(this.comboBox1_TextChanged); + this.comboBox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox1_KeyPress); + // + // checkBox1 + // + resources.ApplyResources(this.checkBox1, "checkBox1"); + this.checkBox1.Name = "checkBox1"; + this.checkBox1.UseVisualStyleBackColor = true; + // + // checkBox2 + // + resources.ApplyResources(this.checkBox2, "checkBox2"); + this.checkBox2.Name = "checkBox2"; + this.checkBox2.UseVisualStyleBackColor = true; + // + // comboBox2 + // + resources.ApplyResources(this.comboBox2, "comboBox2"); + this.comboBox2.FormattingEnabled = true; + this.comboBox2.Name = "comboBox2"; + this.comboBox2.SelectedIndexChanged += new System.EventHandler(this.comboBox2_SelectedIndexChanged); + this.comboBox2.TextChanged += new System.EventHandler(this.comboBox2_TextChanged); + this.comboBox2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox2_KeyPress); + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // checkBox3 + // + resources.ApplyResources(this.checkBox3, "checkBox3"); + this.checkBox3.Name = "checkBox3"; + this.checkBox3.UseVisualStyleBackColor = true; + // + // comboBox3 + // + resources.ApplyResources(this.comboBox3, "comboBox3"); + this.comboBox3.FormattingEnabled = true; + this.comboBox3.Name = "comboBox3"; + this.comboBox3.SelectedIndexChanged += new System.EventHandler(this.comboBox3_SelectedIndexChanged); + this.comboBox3.TextChanged += new System.EventHandler(this.comboBox3_TextChanged); + this.comboBox3.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox3_KeyPress); + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // + // checkBox4 + // + resources.ApplyResources(this.checkBox4, "checkBox4"); + this.checkBox4.Name = "checkBox4"; + this.checkBox4.UseVisualStyleBackColor = true; + // + // comboBox4 + // + resources.ApplyResources(this.comboBox4, "comboBox4"); + this.comboBox4.FormattingEnabled = true; + this.comboBox4.Name = "comboBox4"; + this.comboBox4.SelectedIndexChanged += new System.EventHandler(this.comboBox4_SelectedIndexChanged); + this.comboBox4.TextChanged += new System.EventHandler(this.comboBox4_TextChanged); + this.comboBox4.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox4_KeyPress); + // + // label4 + // + resources.ApplyResources(this.label4, "label4"); + this.label4.Name = "label4"; + // + // checkBox5 + // + resources.ApplyResources(this.checkBox5, "checkBox5"); + this.checkBox5.Name = "checkBox5"; + this.checkBox5.UseVisualStyleBackColor = true; + // + // comboBox5 + // + resources.ApplyResources(this.comboBox5, "comboBox5"); + this.comboBox5.FormattingEnabled = true; + this.comboBox5.Name = "comboBox5"; + this.comboBox5.SelectedIndexChanged += new System.EventHandler(this.comboBox5_SelectedIndexChanged); + this.comboBox5.TextChanged += new System.EventHandler(this.comboBox5_TextChanged); + this.comboBox5.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox5_KeyPress); + // + // label5 + // + resources.ApplyResources(this.label5, "label5"); + this.label5.Name = "label5"; + // + // checkBox6 + // + resources.ApplyResources(this.checkBox6, "checkBox6"); + this.checkBox6.Name = "checkBox6"; + this.checkBox6.UseVisualStyleBackColor = true; + // + // comboBox6 + // + resources.ApplyResources(this.comboBox6, "comboBox6"); + this.comboBox6.FormattingEnabled = true; + this.comboBox6.Name = "comboBox6"; + this.comboBox6.SelectedIndexChanged += new System.EventHandler(this.comboBox6_SelectedIndexChanged); + this.comboBox6.TextChanged += new System.EventHandler(this.comboBox6_TextChanged); + this.comboBox6.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox6_KeyPress); + // + // label6 + // + resources.ApplyResources(this.label6, "label6"); + this.label6.Name = "label6"; + // + // extensionsGroupBox + // + this.extensionsGroupBox.Controls.Add(this.remarkTextBox); + this.extensionsGroupBox.Controls.Add(this.label16); + this.extensionsGroupBox.Controls.Add(this.snSuffixTextBox); + this.extensionsGroupBox.Controls.Add(this.label15); + this.extensionsGroupBox.Controls.Add(this.snPrefixTextBox); + this.extensionsGroupBox.Controls.Add(this.label14); + this.extensionsGroupBox.Controls.Add(this.idNumberTextBox); + this.extensionsGroupBox.Controls.Add(this.label13); + this.extensionsGroupBox.Controls.Add(this.ext4Label); + this.extensionsGroupBox.Controls.Add(this.ext4TextBox); + this.extensionsGroupBox.Controls.Add(this.ext3Label); + this.extensionsGroupBox.Controls.Add(this.ext3TextBox); + this.extensionsGroupBox.Controls.Add(this.ext2Label); + this.extensionsGroupBox.Controls.Add(this.ext2TextBox); + this.extensionsGroupBox.Controls.Add(this.ext1Label); + this.extensionsGroupBox.Controls.Add(this.ext1TextBox); + resources.ApplyResources(this.extensionsGroupBox, "extensionsGroupBox"); + this.extensionsGroupBox.Name = "extensionsGroupBox"; + this.extensionsGroupBox.TabStop = false; + // + // remarkTextBox + // + resources.ApplyResources(this.remarkTextBox, "remarkTextBox"); + this.remarkTextBox.Name = "remarkTextBox"; + // + // label16 + // + resources.ApplyResources(this.label16, "label16"); + this.label16.Name = "label16"; + // + // snSuffixTextBox + // + resources.ApplyResources(this.snSuffixTextBox, "snSuffixTextBox"); + this.snSuffixTextBox.Name = "snSuffixTextBox"; + // + // label15 + // + resources.ApplyResources(this.label15, "label15"); + this.label15.Name = "label15"; + // + // snPrefixTextBox + // + resources.ApplyResources(this.snPrefixTextBox, "snPrefixTextBox"); + this.snPrefixTextBox.Name = "snPrefixTextBox"; + // + // label14 + // + resources.ApplyResources(this.label14, "label14"); + this.label14.Name = "label14"; + // + // idNumberTextBox + // + resources.ApplyResources(this.idNumberTextBox, "idNumberTextBox"); + this.idNumberTextBox.Name = "idNumberTextBox"; + // + // label13 + // + resources.ApplyResources(this.label13, "label13"); + this.label13.Name = "label13"; + // + // ext4Label + // + resources.ApplyResources(this.ext4Label, "ext4Label"); + this.ext4Label.Name = "ext4Label"; + // + // ext4TextBox + // + resources.ApplyResources(this.ext4TextBox, "ext4TextBox"); + this.ext4TextBox.Name = "ext4TextBox"; + // + // ext3Label + // + resources.ApplyResources(this.ext3Label, "ext3Label"); + this.ext3Label.Name = "ext3Label"; + // + // ext3TextBox + // + resources.ApplyResources(this.ext3TextBox, "ext3TextBox"); + this.ext3TextBox.Name = "ext3TextBox"; + // + // ext2Label + // + resources.ApplyResources(this.ext2Label, "ext2Label"); + this.ext2Label.Name = "ext2Label"; + // + // ext2TextBox + // + resources.ApplyResources(this.ext2TextBox, "ext2TextBox"); + this.ext2TextBox.Name = "ext2TextBox"; + // + // ext1Label + // + resources.ApplyResources(this.ext1Label, "ext1Label"); + this.ext1Label.Name = "ext1Label"; + // + // ext1TextBox + // + resources.ApplyResources(this.ext1TextBox, "ext1TextBox"); + this.ext1TextBox.Name = "ext1TextBox"; + this.ext1TextBox.TextChanged += new System.EventHandler(this.ext1TextBox_TextChanged); + // + // autoSNButton + // + resources.ApplyResources(this.autoSNButton, "autoSNButton"); + this.autoSNButton.ForeColor = System.Drawing.Color.Black; + this.autoSNButton.Name = "autoSNButton"; + this.autoSNButton.UseVisualStyleBackColor = true; + this.autoSNButton.Click += new System.EventHandler(this.autoSNButton_Click); + // + // pictureBox1 + // + resources.ApplyResources(this.pictureBox1, "pictureBox1"); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.TabStop = false; + // + // pictureBox2 + // + resources.ApplyResources(this.pictureBox2, "pictureBox2"); + this.pictureBox2.Name = "pictureBox2"; + this.pictureBox2.TabStop = false; + // + // pictureBox3 + // + resources.ApplyResources(this.pictureBox3, "pictureBox3"); + this.pictureBox3.Name = "pictureBox3"; + this.pictureBox3.TabStop = false; + // + // pictureBox4 + // + resources.ApplyResources(this.pictureBox4, "pictureBox4"); + this.pictureBox4.Name = "pictureBox4"; + this.pictureBox4.TabStop = false; + // + // pictureBox5 + // + resources.ApplyResources(this.pictureBox5, "pictureBox5"); + this.pictureBox5.Name = "pictureBox5"; + this.pictureBox5.TabStop = false; + // + // pictureBox6 + // + resources.ApplyResources(this.pictureBox6, "pictureBox6"); + this.pictureBox6.Name = "pictureBox6"; + this.pictureBox6.TabStop = false; + // + // CycleBeginningForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + 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.autoSNButton); + this.Controls.Add(this.extensionsGroupBox); + this.Controls.Add(this.checkBox6); + this.Controls.Add(this.comboBox6); + this.Controls.Add(this.label6); + this.Controls.Add(this.checkBox5); + this.Controls.Add(this.comboBox5); + this.Controls.Add(this.label5); + this.Controls.Add(this.checkBox4); + this.Controls.Add(this.comboBox4); + this.Controls.Add(this.label4); + this.Controls.Add(this.checkBox3); + this.Controls.Add(this.comboBox3); + this.Controls.Add(this.label3); + this.Controls.Add(this.checkBox2); + this.Controls.Add(this.comboBox2); + this.Controls.Add(this.label2); + this.Controls.Add(this.checkBox1); + this.Controls.Add(this.comboBox1); + this.Controls.Add(this.label1); + this.Controls.Add(this.clearButton); + this.Controls.Add(this.orderGroupBox); + this.Controls.Add(this.okButton); + this.ForeColor = System.Drawing.Color.Black; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "CycleBeginningForm"; + this.TopMost = true; + this.Load += new System.EventHandler(this.CycleBeginningForm_Load); + this.orderGroupBox.ResumeLayout(false); + this.extensionsGroupBox.ResumeLayout(false); + this.extensionsGroupBox.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox5)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox6)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.GroupBox orderGroupBox; + private System.Windows.Forms.ComboBox orderComboBox; + private System.Windows.Forms.Button clearButton; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox comboBox1; + private System.Windows.Forms.CheckBox checkBox1; + private System.Windows.Forms.CheckBox checkBox2; + private System.Windows.Forms.ComboBox comboBox2; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.CheckBox checkBox3; + private System.Windows.Forms.ComboBox comboBox3; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.CheckBox checkBox4; + private System.Windows.Forms.ComboBox comboBox4; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.CheckBox checkBox5; + private System.Windows.Forms.ComboBox comboBox5; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.CheckBox checkBox6; + private System.Windows.Forms.ComboBox comboBox6; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.GroupBox extensionsGroupBox; + private System.Windows.Forms.Label ext4Label; + private System.Windows.Forms.TextBox ext4TextBox; + private System.Windows.Forms.Label ext3Label; + private System.Windows.Forms.TextBox ext3TextBox; + private System.Windows.Forms.Label ext2Label; + private System.Windows.Forms.TextBox ext2TextBox; + private System.Windows.Forms.Label ext1Label; + private System.Windows.Forms.TextBox ext1TextBox; + private System.Windows.Forms.TextBox remarkTextBox; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.TextBox snSuffixTextBox; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.TextBox snPrefixTextBox; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.TextBox idNumberTextBox; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.Button autoSNButton; + 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; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/CycleBeginningForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/CycleBeginningForm.cs new file mode 100644 index 00000000..00627cce --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/CycleBeginningForm.cs @@ -0,0 +1,463 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Windows.Forms; +using log4net; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.HeatMeters6 +{ + public partial class CycleBeginningForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(CycleBeginningForm)); + + readonly Results.Entities.WaterMeter[] WaterMeters; + + /// Number of water meters + public readonly int WaterMetersCount; + public readonly bool AtTheEnd; + public readonly bool SensusExtensions; + + /// To be retrieved after the form is closed + public string PurchaseOrder; + public string[] SNText; + public bool[] Disabled; + + public string IdNumber; + public string SnPrefix; + public string SnSuffix; + public string Remark; + + /// Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + /// Number of text boxes for serial numbers + int textBoxesCount; + Label[] labels; + ComboBox[] comboBoxes; + CheckBox[] checkBoxes; + PictureBox[] pictureBoxes; + IList enabledComboBoxes; + + + /// Parameterless constructor for common functionality + public CycleBeginningForm() + { + InitializeComponent(); + ControlBox = false; + + labels = new Label[] { label1, label2, label3, label4, label5, label6 }; + comboBoxes = new ComboBox[] { comboBox1, comboBox2, comboBox3, comboBox4, comboBox5, comboBox6 }; + checkBoxes = new CheckBox[] { checkBox1, checkBox2, checkBox3, checkBox4, checkBox5, checkBox6 }; + pictureBoxes = new PictureBox[] { pictureBox1, pictureBox2, pictureBox3, pictureBox4, pictureBox5, pictureBox6 }; + + if (labels.Length != comboBoxes.Length || labels.Length != checkBoxes.Length) throw new Exception("Error in CycleBeginningForm()"); + + textBoxesCount = labels.Length; + + enabledComboBoxes = new List(); + + completed = false; + StartForceCloseHandler(); + } + + /// + /// Constructor + /// + /// Number of text boxes for serial numbers + public CycleBeginningForm(Results.Entities.WaterMeter[] waterMeters, bool atTheEnd, bool sensusExtensions) + : this() + { + this.WaterMeters = waterMeters; + this.WaterMetersCount = waterMeters.Length; + this.AtTheEnd = atTheEnd; + this.SensusExtensions = sensusExtensions; + SNText = new string[WaterMetersCount]; + Disabled = new bool[WaterMetersCount]; + + ShuffleTextBoxes(Config.Data.WMsCount, Config.Data.LineSize); + + foreach (var wm in WaterMeters) if (wm != null) wm.Passed = wm.PassedFromTests(); + + Height = 147 + WaterMetersCount * 45; /// Adjust the window size + + if (sensusExtensions) + { + if (Height < 605) Height = 605; /// Minimum height for the extensionsGroupBox + } + else + { + /// Hide extensionsGroupBox, etc. + int delta = extensionsGroupBox.Width + 45; + okButton.Left -= delta; + clearButton.Left -= delta; + Width -= delta; + extensionsGroupBox.Visible = false; + autoSNButton.Visible = false; + } + } + + /// + /// 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) + { + if (wmsCount < textBoxesCount && lineSize > 0) + { + int nrLines = (wmsCount + lineSize - 1) / lineSize; + int gap = (textBoxesCount - wmsCount) / nrLines; + + int dest = 0; + for (int l = 0; l < nrLines; l++) + { + for (int i = 0; i < lineSize; i++) + { + labels[dest] = labels[l * lineSize + l * gap + i]; + comboBoxes[dest] = comboBoxes[l * lineSize + l * gap + i]; + checkBoxes[dest] = checkBoxes[l * lineSize + l * gap + i]; + pictureBoxes[dest] = pictureBoxes[l * lineSize + l * gap + i]; + dest++; + } + } + textBoxesCount = wmsCount; + } + } + + private void CycleBeginningForm_Load(object sender, EventArgs e) + { + Localize(); + + PrepareOrderCombo(orderComboBox); + + for (int i = 0; i < textBoxesCount; i++) + { + if (Program.LocalSettings.LastSNTextsCount == textBoxesCount) + { + comboBoxes[i].Items.Add((Program.LocalSettings.LastSNTexts[i] == null) ? string.Empty : Program.LocalSettings.LastSNTexts[i]); + } + labels[i].Visible = comboBoxes[i].Visible = checkBoxes[i].Visible = true; + enabledComboBoxes.Add(comboBoxes[i]); + if (AtTheEnd) + { + pictureBoxes[i].Visible = true; + } + } + + UpdateIcons(); + + if (SensusExtensions) + { + idNumberTextBox.Text = (Program.LocalSettings.LastText1 == null) ? string.Empty : Program.LocalSettings.LastText1; + snPrefixTextBox.Text = (Program.LocalSettings.LastText2 == null) ? string.Empty : Program.LocalSettings.LastText2; + snSuffixTextBox.Text = (Program.LocalSettings.LastText3 == null) ? string.Empty : Program.LocalSettings.LastText3; + remarkTextBox.Text = (Program.LocalSettings.LastRemark == null) ? string.Empty : Program.LocalSettings.LastRemark; + } + } + + void Localize() + { + Text = Strings.Data; + orderGroupBox.Text = Strings.Purchase_order; + for (int i = 0; i < textBoxesCount; i++) + { + labels[i].Text = Strings.Serial_Number + " " + (i + 1).ToString(); + } + okButton.Text = Strings.OkBtnText; + clearButton.Text = Strings.ClearBtnText; + } + + /// + /// Load Purchase order combo box items from the LocalSettings PurchaseOrderHistory array + /// + /// Puchase order ComboBox + void PrepareOrderCombo(ComboBox orderComboBox) + { + for (int i = 0; i < Program.LocalSettings.PurchaseOrderHistoryCount; i++) + { + orderComboBox.Items.Add(Program.LocalSettings.PurchaseOrderHistory[i]); + } + + if (orderComboBox.Items.Count > 0) + { + orderComboBox.Text = orderComboBox.Items[0].ToString(); + } + } + + void UpdateIcons() + { + Image imgP = null; + Image imgF = null; + Image imgP2 = null; + Image imgF2 = null; + + int nrRedone = 0; + if (SensusExtensions) + { + if (!int.TryParse(ext1TextBox.Text, out nrRedone) || nrRedone < 0 || nrRedone > WaterMetersCount) + { + nrRedone = 0; + } + } + + for (int i = 0; i < WaterMetersCount; i++) + { + Results.Entities.WaterMeter wm = WaterMeters[i]; + if (wm == null) + { + checkBoxes[i].Checked = true; + } + else if (AtTheEnd) + { + if (imgP == null || imgF == null || imgP2 == null || imgF2 == null) + { + imgP = Properties.Resources.TestPassedImage; /// Passed + imgF = Properties.Resources.TestFailedImage; /// Failed + imgP2 = Properties.Resources.TestPassedImage2; /// Passed after re-work + imgF2 = Properties.Resources.TestFailedImage2; /// Failed after re-work + } + + pictureBoxes[i].Image = (WaterMetersCount - i > nrRedone) ? (wm.Passed ? imgP : imgF) : (wm.Passed ? imgP2 : imgF2); + } + } + } + + private void okButton_Click(object sender, EventArgs e) + { + PurchaseOrder = orderComboBox.Text; + Program.LocalSettings.UpdateHistory(orderComboBox.Text, + ref Program.LocalSettings.PurchaseOrderHistory +#if FUZHOU150 || FUZHOU300 + , 20 +#endif + ); + + Program.LocalSettings.LastSNTexts = SNText; + + for (int i = 0; i < Math.Min(WaterMetersCount, textBoxesCount); i++) + { + SNText[i] = comboBoxes[i].Text; + Disabled[i] = !checkBoxes[i].Checked; + } + + if (SensusExtensions) + { + int nrRedone = 0; + if (SensusExtensions) + { + if (!int.TryParse(ext1TextBox.Text, out nrRedone) || nrRedone < 0 || nrRedone > WaterMetersCount) + { + nrRedone = 0; + } + } + + Program.LocalSettings.LastText1 = IdNumber = string.IsNullOrEmpty(idNumberTextBox.Text) ? null : idNumberTextBox.Text; + Program.LocalSettings.LastText2 = SnPrefix = string.IsNullOrEmpty(snPrefixTextBox.Text) ? null : snPrefixTextBox.Text; + Program.LocalSettings.LastText3 = SnSuffix = string.IsNullOrEmpty(snSuffixTextBox.Text) ? null : snSuffixTextBox.Text; + Program.LocalSettings.LastRemark = Remark = string.IsNullOrEmpty(remarkTextBox.Text) ? null : remarkTextBox.Text; + + for (int i = 0; i < WaterMetersCount; i++) + { + Results.Entities.WaterMeter wm = WaterMeters[i]; + { + if (wm != null) + { + bool pressureTestPassed = false; + foreach (var mtr in wm.MeterTestRslts) + { + if ((mtr.Method().Equals("PMax-Test") || mtr.Method().Equals("Leak-Test")) && mtr.Passed) + { + pressureTestPassed = true; + break; + } + } + wm.WaterMeterData.Text1 = IdNumber; + wm.WaterMeterData.Text2 = SnPrefix; + wm.WaterMeterData.Text3 = SnSuffix; + wm.Batch.Remark = Remark; + wm.ResultCode = 32 + (wm.Passed ? 0 : 1) + (pressureTestPassed ? 64 : 0) + ((WaterMetersCount - i <= nrRedone) ? 128 : 0); + } + } + } + } + + completed = true; + Close(); + } + + /// + /// When one combo box is updated using drop-down menu, all combo boxes + /// are updated by this function. + /// + private void UpdateAllCombos() + { + for (int i = 0; i < Math.Min(WaterMetersCount, textBoxesCount); i++) + { + comboBoxes[i].Text = Program.LocalSettings.LastSNTexts[i]; + checkBoxes[i].Checked = !string.IsNullOrEmpty(comboBoxes[i].Text); + } + } + + private void clearButton_Click(object sender, EventArgs e) + { + for (int i = 0; i < Math.Min(WaterMetersCount, textBoxesCount); i++) + { + comboBoxes[i].Text = string.Empty; + checkBoxes[i].Checked = false; + } + } + + + private void comboBox1_TextChanged(object sender, EventArgs e) { checkBox1.Checked = true; } + private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox1.Text.Equals(comboBox1.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox2_TextChanged(object sender, EventArgs e) { checkBox2.Checked = true; } + private void comboBox2_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox2.Text.Equals(comboBox2.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox3_TextChanged(object sender, EventArgs e) { checkBox3.Checked = true; } + private void comboBox3_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox3.Text.Equals(comboBox3.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox4_TextChanged(object sender, EventArgs e) { checkBox4.Checked = true; } + private void comboBox4_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox4.Text.Equals(comboBox4.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox5_TextChanged(object sender, EventArgs e) { checkBox5.Checked = true; } + private void comboBox5_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox5.Text.Equals(comboBox5.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox6_TextChanged(object sender, EventArgs e) { checkBox6.Checked = true; } + private void comboBox6_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox6.Text.Equals(comboBox6.Items[0])) UpdateAllCombos(); + } + } + + #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); + }; + } + + private void OnForceClose(object sender, EventArgs args) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + + /// + /// Process a key press within any enabled text boxe + /// + /// + /// + /// TextBox control which received the event + private void ProcKeyPress(object sender, KeyPressEventArgs e, ComboBox currentFocusOwner) + { + if (e.KeyChar == '+') + { + /// Process '+' key ..... Form completed + okButton_Click(sender, e); + } + if (e.KeyChar == '\r') + { + /// Process key ..... Next text field + if (enabledComboBoxes.Count < 2) return; /// There is just one enabled textbox + + for (int i = 0; i < enabledComboBoxes.Count; i++) + { + if (enabledComboBoxes[i] == currentFocusOwner) + { + /// Change focus to the next enabled text box + enabledComboBoxes[(i + 1) % enabledComboBoxes.Count].Focus(); + return; + } + } + } + } + + private void comboBox1_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox1); } + private void comboBox2_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox2); } + private void comboBox3_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox3); } + private void comboBox4_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox4); } + private void comboBox5_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox5); } + private void comboBox6_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox6); } + + private void autoSNButton_Click(object sender, EventArgs e) + { + try + { + bool snFound = false; + int sn = 1; + + for (int i = 0; i < textBoxesCount; i++) + { + if (!AtTheEnd || WaterMeters[i].Passed) + { + if (!snFound) + { + sn = int.Parse(comboBoxes[i].Text); /// S/N from the first combo box + snFound = true; + } + else + { + sn++; + comboBoxes[i].Text = sn.ToString(); /// Update combo boxes of other 'good' water meters + } + } + } + } + catch + { + /// Don't do anything if int.Parse fails + } + } + + private void ext1TextBox_TextChanged(object sender, EventArgs e) + { + UpdateIcons(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/CycleBeginningForm.pl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/CycleBeginningForm.pl.resx new file mode 100644 index 00000000..96a81f5e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/CycleBeginningForm.pl.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + OK + + + Kolejność + + + Usunąć + + + Nr seryjny 1 + + + Nr seryjny 2 + + + Nr seryjny 3 + + + Nr seryjny 4 + + + Nr seryjny 5 + + + Nr seryjny 6 + + + Uwaga: + + + Uzupełnienie za nr seryjnym + + + Uzupełnienie przed nr seryjnym + + + Nr identyfikacyjny: + + + ? + + + ? + + + ? + + + naprawionych + + + # sztuk + + + Auto nr seryjny + + + Dane partii + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/CycleBeginningForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/CycleBeginningForm.resx new file mode 100644 index 00000000..b305a930 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/CycleBeginningForm.resx @@ -0,0 +1,1419 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + Verdana, 14.25pt + + + 886, 24 + + + 140, 54 + + + + 7 + + + OK + + + okButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 28 + + + 90, 31 + + + 260, 31 + + + 0 + + + orderComboBox + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + orderGroupBox + + + 0 + + + Verdana, 14.25pt + + + 28, 12 + + + 447, 82 + + + 0 + + + Order + + + orderGroupBox + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 27 + + + Verdana, 14.25pt + + + + NoControl + + + 886, 124 + + + 140, 54 + + + 8 + + + Clear + + + clearButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 26 + + + True + + + Verdana, 14.25pt + + + 24, 127 + + + 166, 23 + + + 9 + + + Serial Number 1 + + + False + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 25 + + + Verdana, 14.25pt + + + 215, 124 + + + 163, 31 + + + 10 + + + False + + + comboBox1 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 24 + + + True + + + 460, 135 + + + 15, 14 + + + 11 + + + False + + + checkBox1 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 23 + + + True + + + NoControl + + + 460, 179 + + + 15, 14 + + + 14 + + + False + + + checkBox2 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 20 + + + Verdana, 14.25pt + + + 215, 168 + + + 163, 31 + + + 13 + + + False + + + comboBox2 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 21 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 171 + + + 166, 23 + + + 12 + + + Serial Number 2 + + + False + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 22 + + + True + + + NoControl + + + 460, 223 + + + 15, 14 + + + 17 + + + False + + + checkBox3 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 17 + + + Verdana, 14.25pt + + + 215, 212 + + + 163, 31 + + + 16 + + + False + + + comboBox3 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 18 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 215 + + + 166, 23 + + + 15 + + + Serial Number 3 + + + False + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 19 + + + True + + + NoControl + + + 460, 267 + + + 15, 14 + + + 20 + + + False + + + checkBox4 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 14 + + + Verdana, 14.25pt + + + 215, 256 + + + 163, 31 + + + 19 + + + False + + + comboBox4 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 15 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 259 + + + 166, 23 + + + 18 + + + Serial Number 4 + + + False + + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 16 + + + True + + + NoControl + + + 460, 311 + + + 15, 14 + + + 23 + + + False + + + checkBox5 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 11 + + + Verdana, 14.25pt + + + 215, 300 + + + 163, 31 + + + 22 + + + False + + + comboBox5 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 12 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 303 + + + 166, 23 + + + 21 + + + Serial Number 5 + + + False + + + label5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 13 + + + True + + + NoControl + + + 460, 355 + + + 15, 14 + + + 26 + + + False + + + checkBox6 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 8 + + + Verdana, 14.25pt + + + 215, 344 + + + 163, 31 + + + 25 + + + False + + + comboBox6 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 9 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 347 + + + 166, 23 + + + 24 + + + Serial Number 6 + + + False + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 10 + + + 23, 502 + + + 274, 31 + + + 15 + + + remarkTextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 0 + + + True + + + NoControl + + + 9, 468 + + + 115, 23 + + + 14 + + + Poznámka: + + + label16 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 1 + + + 23, 415 + + + 274, 31 + + + 13 + + + snSuffixTextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 2 + + + True + + + NoControl + + + 9, 381 + + + 165, 23 + + + 12 + + + Dodatok za s/n: + + + label15 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 3 + + + 23, 326 + + + 274, 31 + + + 11 + + + snPrefixTextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 4 + + + True + + + NoControl + + + 9, 292 + + + 187, 23 + + + 10 + + + Dodatok pred s/n: + + + label14 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 5 + + + 23, 245 + + + 274, 31 + + + 9 + + + idNumberTextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 6 + + + True + + + 9, 211 + + + 194, 23 + + + 8 + + + Identifikačné číslo: + + + label13 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 7 + + + True + + + NoControl + + + 73, 159 + + + 20, 23 + + + 7 + + + ? + + + ext4Label + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 8 + + + 23, 156 + + + 32, 31 + + + 6 + + + ext4TextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 9 + + + True + + + NoControl + + + 73, 120 + + + 20, 23 + + + 5 + + + ? + + + ext3Label + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 10 + + + 23, 117 + + + 32, 31 + + + 4 + + + ext3TextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 11 + + + True + + + NoControl + + + 73, 81 + + + 20, 23 + + + 3 + + + ? + + + ext2Label + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 12 + + + 23, 78 + + + 32, 31 + + + 2 + + + ext2TextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 13 + + + True + + + 73, 42 + + + 120, 23 + + + 1 + + + opravených + + + ext1Label + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 14 + + + 23, 39 + + + 32, 31 + + + 0 + + + ext1TextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 15 + + + Verdana, 14.25pt + + + 520, 12 + + + 322, 551 + + + 45 + + + # pieces + + + extensionsGroupBox + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 7 + + + Verdana, 14.25pt + + + NoControl + + + 886, 189 + + + 140, 54 + + + 46 + + + Auto S/N + + + autoSNButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 6 + + + 404, 124 + + + 32, 32 + + + 47 + + + False + + + pictureBox1 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 5 + + + NoControl + + + 404, 168 + + + 32, 32 + + + 48 + + + False + + + pictureBox2 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + + + NoControl + + + 404, 212 + + + 32, 32 + + + 49 + + + False + + + pictureBox3 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + NoControl + + + 404, 256 + + + 32, 32 + + + 50 + + + False + + + pictureBox4 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + NoControl + + + 404, 300 + + + 32, 32 + + + 51 + + + False + + + pictureBox5 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + NoControl + + + 404, 344 + + + 32, 32 + + + 52 + + + False + + + pictureBox6 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + + + 6, 13 + + + True + + + 1067, 577 + + + Batch data + + + CycleBeginningForm + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/CycleBeginningForm.ru.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/CycleBeginningForm.ru.resx new file mode 100644 index 00000000..7530d5e9 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/CycleBeginningForm.ru.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + OK + + + Порядок + + + Очистить + + + Серийный номер 1 + + + Серийный номер 2 + + + Серийный номер 3 + + + Серийный номер 4 + + + Серийный номер 5 + + + Серийный номер 6 + + + Примечание: + + + Дополнить за с/н + + + Дополнить перед с/н + + + Идентификационный номер: + + + ? + + + ? + + + ? + + + отремонтированных + + + # штук + + + Авто с/н + + + Пакетные данные + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/CycleEndForm.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/CycleEndForm.Designer.cs new file mode 100644 index 00000000..43fac2f6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/CycleEndForm.Designer.cs @@ -0,0 +1,305 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.HeatMeters6 +{ + partial class CycleEndForm + { + /// + /// 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() + { + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.textBox2 = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.okButton = new System.Windows.Forms.Button(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.textBox3 = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.textBox4 = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.groupBox5 = new System.Windows.Forms.GroupBox(); + this.textBox5 = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.groupBox6 = new System.Windows.Forms.GroupBox(); + this.textBox6 = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.groupBox2.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.groupBox4.SuspendLayout(); + this.groupBox5.SuspendLayout(); + this.groupBox6.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.textBox2); + this.groupBox2.Controls.Add(this.label2); + this.groupBox2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox2.ForeColor = System.Drawing.Color.Black; + this.groupBox2.Location = new System.Drawing.Point(25, 104); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(362, 81); + this.groupBox2.TabIndex = 2; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Wasserzähler 2"; + // + // textBox2 + // + this.textBox2.Location = new System.Drawing.Point(183, 31); + this.textBox2.Name = "textBox2"; + this.textBox2.Size = new System.Drawing.Size(163, 31); + this.textBox2.TabIndex = 1; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(18, 34); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(74, 23); + this.label2.TabIndex = 0; + this.label2.Text = "Stand:"; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.textBox1); + this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox1.ForeColor = System.Drawing.Color.Black; + this.groupBox1.Location = new System.Drawing.Point(25, 14); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(362, 81); + this.groupBox1.TabIndex = 1; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Wasserzähler 1"; + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(183, 31); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(163, 31); + this.textBox1.TabIndex = 1; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(18, 34); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(74, 23); + this.label1.TabIndex = 0; + this.label1.Text = "Stand:"; + // + // okButton + // + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(425, 23); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(98, 63); + this.okButton.TabIndex = 7; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.textBox3); + this.groupBox3.Controls.Add(this.label3); + this.groupBox3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox3.ForeColor = System.Drawing.Color.Black; + this.groupBox3.Location = new System.Drawing.Point(25, 194); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(362, 81); + this.groupBox3.TabIndex = 3; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "Wasserzähler 3"; + // + // textBox3 + // + this.textBox3.Location = new System.Drawing.Point(183, 31); + this.textBox3.Name = "textBox3"; + this.textBox3.Size = new System.Drawing.Size(163, 31); + this.textBox3.TabIndex = 1; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(18, 34); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(74, 23); + this.label3.TabIndex = 0; + this.label3.Text = "Stand:"; + // + // groupBox4 + // + this.groupBox4.Controls.Add(this.textBox4); + this.groupBox4.Controls.Add(this.label4); + this.groupBox4.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox4.ForeColor = System.Drawing.Color.Black; + this.groupBox4.Location = new System.Drawing.Point(25, 284); + this.groupBox4.Name = "groupBox4"; + this.groupBox4.Size = new System.Drawing.Size(362, 81); + this.groupBox4.TabIndex = 4; + this.groupBox4.TabStop = false; + this.groupBox4.Text = "Wasserzähler 4"; + // + // textBox4 + // + this.textBox4.Location = new System.Drawing.Point(183, 31); + this.textBox4.Name = "textBox4"; + this.textBox4.Size = new System.Drawing.Size(163, 31); + this.textBox4.TabIndex = 1; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(18, 34); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(74, 23); + this.label4.TabIndex = 0; + this.label4.Text = "Stand:"; + // + // groupBox5 + // + this.groupBox5.Controls.Add(this.textBox5); + this.groupBox5.Controls.Add(this.label5); + this.groupBox5.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox5.ForeColor = System.Drawing.Color.Black; + this.groupBox5.Location = new System.Drawing.Point(25, 374); + this.groupBox5.Name = "groupBox5"; + this.groupBox5.Size = new System.Drawing.Size(362, 81); + this.groupBox5.TabIndex = 5; + this.groupBox5.TabStop = false; + this.groupBox5.Text = "Wasserzähler 5"; + // + // textBox5 + // + this.textBox5.Location = new System.Drawing.Point(183, 31); + this.textBox5.Name = "textBox5"; + this.textBox5.Size = new System.Drawing.Size(163, 31); + this.textBox5.TabIndex = 1; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(18, 34); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(74, 23); + this.label5.TabIndex = 0; + this.label5.Text = "Stand:"; + // + // groupBox6 + // + this.groupBox6.Controls.Add(this.textBox6); + this.groupBox6.Controls.Add(this.label6); + this.groupBox6.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox6.ForeColor = System.Drawing.Color.Black; + this.groupBox6.Location = new System.Drawing.Point(25, 464); + this.groupBox6.Name = "groupBox6"; + this.groupBox6.Size = new System.Drawing.Size(362, 81); + this.groupBox6.TabIndex = 6; + this.groupBox6.TabStop = false; + this.groupBox6.Text = "Wasserzähler 6"; + // + // textBox6 + // + this.textBox6.Location = new System.Drawing.Point(183, 31); + this.textBox6.Name = "textBox6"; + this.textBox6.Size = new System.Drawing.Size(163, 31); + this.textBox6.TabIndex = 1; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(18, 34); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(74, 23); + this.label6.TabIndex = 0; + this.label6.Text = "Stand:"; + // + // CycleEndForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.ClientSize = new System.Drawing.Size(559, 566); + this.Controls.Add(this.groupBox6); + this.Controls.Add(this.groupBox5); + this.Controls.Add(this.groupBox4); + this.Controls.Add(this.groupBox3); + this.Controls.Add(this.okButton); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.groupBox1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "CycleEndForm"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "Daten"; + this.TopMost = true; + this.Load += new System.EventHandler(this.CycleEndForm_Load); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.groupBox4.ResumeLayout(false); + this.groupBox4.PerformLayout(); + this.groupBox5.ResumeLayout(false); + this.groupBox5.PerformLayout(); + this.groupBox6.ResumeLayout(false); + this.groupBox6.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TextBox textBox2; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.TextBox textBox3; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.GroupBox groupBox4; + private System.Windows.Forms.TextBox textBox4; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.GroupBox groupBox5; + private System.Windows.Forms.TextBox textBox5; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.GroupBox groupBox6; + private System.Windows.Forms.TextBox textBox6; + private System.Windows.Forms.Label label6; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/CycleEndForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/CycleEndForm.cs new file mode 100644 index 00000000..5e7dd74a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/CycleEndForm.cs @@ -0,0 +1,110 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using log4net; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.HeatMeters6 +{ + public partial class CycleEndForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(CycleEndForm)); + + /// Number of text boxes for serial numbers + public readonly int WaterMetersCount; + + // To be retrieved after the form closes + public string[] EndStateText; + + // Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + /// + /// Constructor + /// + /// Number of text boxes for serial numbers + public CycleEndForm(int waterMetersCount) + { + InitializeComponent(); + ControlBox = false; + + this.WaterMetersCount = waterMetersCount; + EndStateText = new string[WaterMetersCount]; + completed = false; + StartForceCloseHandler(); + } + + /// Parameterless constructor for 3 watermeters + public CycleEndForm() + : this(3) + { + } + + private void CycleEndForm_Load(object sender, EventArgs e) + { + Localize(); + + Height = 50 + 90 * WaterMetersCount; + + if (WaterMetersCount < 1) groupBox1.Visible = false; + if (WaterMetersCount < 2) groupBox2.Visible = false; + if (WaterMetersCount < 3) groupBox3.Visible = false; + if (WaterMetersCount < 4) groupBox4.Visible = false; + if (WaterMetersCount < 5) groupBox5.Visible = false; + if (WaterMetersCount < 6) groupBox6.Visible = false; + } + + void Localize() + { + Text = Strings.Data; + groupBox1.Text = Strings.Water_Meter + " 1"; + groupBox2.Text = Strings.Water_Meter + " 2"; + groupBox3.Text = Strings.Water_Meter + " 3"; + groupBox4.Text = Strings.Water_Meter + " 4"; + groupBox5.Text = Strings.Water_Meter + " 5"; + groupBox6.Text = Strings.Water_Meter + " 6"; + label1.Text = Strings.State; + label2.Text = Strings.State; + label3.Text = Strings.State; + label4.Text = Strings.State; + label5.Text = Strings.State; + label6.Text = Strings.State; + okButton.Text = Strings.OkBtnText; + } + + private void okButton_Click(object sender, EventArgs e) + { + if (WaterMetersCount >= 1) EndStateText[0] = textBox1.Text; + if (WaterMetersCount >= 2) EndStateText[1] = textBox3.Text; + if (WaterMetersCount >= 3) EndStateText[2] = textBox4.Text; + if (WaterMetersCount >= 4) EndStateText[3] = textBox5.Text; + if (WaterMetersCount >= 5) EndStateText[4] = textBox6.Text; + if (WaterMetersCount >= 6) EndStateText[5] = textBox6.Text; + + completed = true; + 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) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/CycleEndForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/CycleEndForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/CycleEndForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/EntryForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/EntryForm.cs new file mode 100644 index 00000000..5042e29c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/EntryForm.cs @@ -0,0 +1,320 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; +using TBF.BenchControl; +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl.DataEntry.HeatMeters6 +{ + public class EntryForm : ComponentBase, IOperation, IDataEntry, IHasCycleBeginForm, IHasCycleEndForm, IHasHeatMtrStatesForm + { + private static readonly ILog log = LogManager.GetLogger(typeof(EntryForm)); + public override string ToString() + { + return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); + } + + public bool UsesCameras() { return false; } + + readonly EntryFormCfg entryFormCfg; + IRegisterReader[] regReaders; + + /// + /// Properties set by the Begin, End and WMStates form + /// + string purchaseOrder; + public string PurchaseOrder { get { return purchaseOrder; } } + + bool[] disabled; /// This array is shared between forms + + string[] wmCycleEndState; + public string WMCycleEndState(int wmNr) { return (wmNr >= 0 && wmNr < wmCycleEndState.Length) ? wmCycleEndState[wmNr] : string.Empty; } + + double[] wmStartState; + public double WMStartState(int wmNr) { return (wmNr >= 0 && wmNr < wmStartState.Length) ? wmStartState[wmNr] : 0; } + + double[] wmEndState; + public double WMEndState(int wmNr) { return (wmNr >= 0 && wmNr < wmEndState.Length) ? wmEndState[wmNr] : 0; } + + string[] wmStartStateStr; + + double[] energyStartState; + public double EnergyStartState(int wmNr) { return (wmNr >= 0 && wmNr < energyStartState.Length) ? energyStartState[wmNr] : 0; } + + double[] energyEndState; + public double EnergyEndState(int wmNr) { return (wmNr >= 0 && wmNr < energyEndState.Length) ? energyEndState[wmNr] : 0; } + + string[] energyStartStateStr; + + + System.Windows.Forms.Form modelessDlg; + + double refVolume; + double errLimLo; + double errLimHi; + + double refEnergy; + double energyErrLimLo; + double energyErrLimHi; + + bool resultSaved; /// Set in Run() when results are saved + + Results.Entities.WaterMeter[] waterMeters; /// Reference to ...ProcessData.BatchRslts.WaterMeters[] + + public enum CurrentOp + { + None, + ShowFormAtCycleBeginning, + ShowFormAtCycleEnd, + EnterTestStartStates, + EnterTestEndStates, + } + + CurrentOp currentOp; + + + public EntryForm() + { + } + + public EntryForm(Generic.IComponentCfg cfg) + : base(cfg) + { + entryFormCfg = cfg as EntryFormCfg; + + disabled = new bool[Config.Data.HeatMetersCount]; + wmStartState = new double[Config.Data.HeatMetersCount]; + wmStartStateStr = new string[Config.Data.HeatMetersCount]; + wmEndState = new double[Config.Data.HeatMetersCount]; + energyStartState = new double[Config.Data.HeatMetersCount]; + energyStartStateStr = new string[Config.Data.HeatMetersCount]; + energyEndState = new double[Config.Data.HeatMetersCount]; + wmCycleEndState = new string[Config.Data.HeatMetersCount]; + + currentOp = CurrentOp.None; + log.Debug(this.ToString()); + } + + /// Reference to the operation + public IOperation ShowCycleBeginFormOp() + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.ShowFormAtCycleBeginning; + this.waterMeters = TBF.BenchControl.Sequences.ProcessData.BatchRslts.WaterMeters; + return this; + } + + /// Reference to the operation + public IOperation ShowCycleEndFormOp() + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.ShowFormAtCycleEnd; + this.waterMeters = TBF.BenchControl.Sequences.ProcessData.BatchRslts.WaterMeters; + return this; + } + + /// Reference to the operation + public IOperation ShowTestStartFormOp(IRegisterReader[] regReaders) + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.EnterTestStartStates; + this.regReaders = regReaders; + return this; + } + + /// Reference to the operation + public IOperation ShowTestEndFormOp(IRegisterReader[] regReaders, double refVolume, double errLimLo, double errLimHi) + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.EnterTestEndStates; + this.regReaders = regReaders; + this.refVolume = refVolume; + this.errLimLo = errLimLo; + this.errLimHi = errLimHi; + this.refEnergy = 0; + this.energyErrLimLo = 0; + this.energyErrLimHi = 0; + return this; + } + + /// Reference to the operation + public IOperation ShowTestEndFormOp(IRegisterReader[] regReaders, double refVolume, double errLimLo, double errLimHi, + double refEnergy, double energyErrLimLo, double energyErrLimHi) + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.EnterTestEndStates; + this.regReaders = regReaders; + this.refVolume = refVolume; + this.errLimLo = errLimLo; + this.errLimHi = errLimHi; + this.refEnergy = refEnergy; + this.energyErrLimLo = energyErrLimLo; + this.energyErrLimHi = energyErrLimHi; + return this; + } + + delegate void EntryFormDlgt(EntryForm myRef); + /// + void OpenBeginningDlg(EntryForm myRef) + { + myRef.modelessDlg = new CycleBeginningForm(myRef.waterMeters, entryFormCfg.EnterSerialNrsAtTheEnd, entryFormCfg.SensusExtensions); + modelessDlg.Show(); + } + /// + void OpenEndDlg(EntryForm myRef) + { + myRef.modelessDlg = new CycleEndForm(myRef.waterMeters.Length); + modelessDlg.Show(); + } + /// + void OpenTestStartStatesDlg(EntryForm myRef) + { + myRef.modelessDlg = new TestStartEndForm(entryFormCfg, myRef.waterMeters.Length, myRef.regReaders, disabled); + modelessDlg.Show(); + } + /// + void OpenTestEndStatesDlg(EntryForm myRef) + { + myRef.modelessDlg = new TestStartEndForm(entryFormCfg, myRef.waterMeters.Length, myRef.regReaders, wmStartStateStr, energyStartStateStr, + disabled, refVolume, errLimLo, errLimHi, refEnergy, energyErrLimLo, energyErrLimHi); + modelessDlg.Show(); + } + + /// Start this operation + public void Start() + { + resultSaved = false; + switch (currentOp) + { + case CurrentOp.ShowFormAtCycleBeginning: + if (!entryFormCfg.EnterSerialNrsAtTheEnd) + { + Program.MainWnd.Invoke(new EntryFormDlgt(OpenBeginningDlg), this); + } + break; + case CurrentOp.ShowFormAtCycleEnd: + if (entryFormCfg.EnterSerialNrsAtTheEnd) + { + Program.MainWnd.Invoke(new EntryFormDlgt(OpenBeginningDlg), this); + } + else if (entryFormCfg.ShowCycleEndForm) + { + Program.MainWnd.Invoke(new EntryFormDlgt(OpenEndDlg), this); + } + break; + case CurrentOp.EnterTestStartStates: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenTestStartStatesDlg), this); + break; + case CurrentOp.EnterTestEndStates: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenTestEndStatesDlg), this); + break; + } + } + + /// Run this operation + /// Event.ResultsPrinted + public Event Run() + { + if ((modelessDlg is IHasCompleted) && !(modelessDlg as IHasCompleted).Completed) + { + return Event.ModelessFormIsOpen; + } + + if (!resultSaved) /// This is to save the result only once + { + if ((!entryFormCfg.EnterSerialNrsAtTheEnd && currentOp == CurrentOp.ShowFormAtCycleBeginning) || + (entryFormCfg.EnterSerialNrsAtTheEnd && currentOp == CurrentOp.ShowFormAtCycleEnd)) + { + CycleBeginningForm dlg = (modelessDlg as CycleBeginningForm); + if (dlg != null) + { + purchaseOrder = dlg.PurchaseOrder; + + for (int i = 0; i < Math.Min(dlg.WaterMetersCount, waterMeters.Length); i++) + { + if (waterMeters[i] != null) + { + waterMeters[i].SerialNr = dlg.SNText[i]; + disabled[i] = waterMeters[i].Disabled = dlg.Disabled[i]; + } + } + } + } + else if (entryFormCfg.ShowCycleEndForm && currentOp == CurrentOp.ShowFormAtCycleEnd) + { + CycleEndForm dlg = (modelessDlg as CycleEndForm); + int count = Math.Min(waterMeters.Length, Config.Data.HeatMetersCount); + if ((dlg != null) && (count > dlg.WaterMetersCount)) count = dlg.WaterMetersCount; + + for (int i = 0; i < count; i++) + { + if (waterMeters[i] != null) + { + /// In case entryFormCfg.ShowCycleEndForm == false dlg would be null, values would be string.Empty + wmCycleEndState[i] = waterMeters[i].EndState = (dlg != null) ? dlg.EndStateText[i] : string.Empty; + } + } + } + else if (modelessDlg is TestStartEndForm && currentOp == CurrentOp.EnterTestStartStates) + { + /// Fixed start test - start + TestStartEndForm dlg = (modelessDlg as TestStartEndForm); + if (dlg != null) + { + for (int i = 0; i < Math.Min(waterMeters.Length, Config.Data.HeatMetersCount); i++) + { + wmStartState[i] = dlg.WMStartState[i]; + wmStartStateStr[i] = dlg.WMStartStateStr[i]; + energyStartState[i] = dlg.EnergyStartState[i]; + energyStartStateStr[i] = dlg.EnergyStartStateStr[i]; + } + } + } + else if (modelessDlg is TestStartEndForm && currentOp == CurrentOp.EnterTestEndStates) + { + /// Fixed start test - end + TestStartEndForm dlg = (modelessDlg as TestStartEndForm); + if (dlg != null) + { + for (int i = 0; i < Math.Min(waterMeters.Length, Config.Data.HeatMetersCount); i++) + { + wmEndState[i] = dlg.WMEndState[i]; + energyEndState[i] = dlg.EnergyEndState[i]; + } + } + } + resultSaved = true; + modelessDlg = null; + } + + return Event.ModelessFormClosed; /// Form closed + } + + /// Stop this operation + public void Stop() + { + if (modelessDlg is IHasCompleted) + { + UiBridge.Bridge.OnCloseModelessForm(this, null); + modelessDlg = null; + } + currentOp = CurrentOp.None; + } + + /// + /// Updates test results with the information collected in watermeters. + /// + /// Test results to be updated with the information + public void UpdateTestResults(Results.BatchResults batchResults) + { + foreach (var wm in batchResults.WaterMeters) + { + if (wm != null && !wm.Disabled) wm.PurchaseOrder = PurchaseOrder; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/EntryFormCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/EntryFormCfg.cs new file mode 100644 index 00000000..1aaef19e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/EntryFormCfg.cs @@ -0,0 +1,53 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DataEntry.HeatMeters6 +{ + public class EntryFormCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(EntryFormCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new EntryFormCfgCtrl(); } + + /// + /// Serialized parameters + /// + public Config.Unit DefaultUnits; + public bool EnterSerialNrsAtTheEnd; + public bool ShowCycleEndForm; + public bool SensusExtensions; + + [XmlIgnore] + public Config.Unit Units; + + /// Private parameterless constructor invoked by all other (public) constructors + EntryFormCfg() + { + } + + public EntryFormCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + Factory = factory; + ParentName = string.Empty; + + DefaultUnits = Config.Unit.kWh; + EnterSerialNrsAtTheEnd = false; + ShowCycleEndForm = false; + SensusExtensions = false; + } + + public string ToString(int i) + { + return string.Format("Name={0}, EnterSNsAtTheEnd={1}, ShowEndForm={2}, SensusExt={3}", Name, EnterSerialNrsAtTheEnd, ShowCycleEndForm, SensusExtensions); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/EntryFormCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/EntryFormCfgCtrl.cs new file mode 100644 index 00000000..4ff8b89f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/EntryFormCfgCtrl.cs @@ -0,0 +1,108 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; +using Config; + +namespace TBF.BenchControl.DataEntry.HeatMeters6 +{ + public partial class EntryFormCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + EntryFormCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as EntryFormCfg; + Redraw(); + } + } + + public EntryFormCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Localize(); + + for (Unit units = 0; units < Unit.Count; units++) + { + if (Units.IsEnergy(units)) defaultUnitsComboBox.Items.Add(units.ToString()); + } + + Redraw(); + } + + void Localize() + { + defaultUnitsLabel.Text = Strings.Default_units; + enterSNsAtTheEndCheckBox.Text = Strings.Enter_SNs_at_the_end; + showEndStateFormCheckBox.Text = Strings.Show_cycle_end_form; + sensusExtensionsCheckBox.Text = Strings.Sensus_extensions; + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + enterSNsAtTheEndCheckBox.Checked = config.EnterSerialNrsAtTheEnd; + showEndStateFormCheckBox.Checked = config.ShowCycleEndForm; + sensusExtensionsCheckBox.Checked = config.SensusExtensions; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + enterSNsAtTheEndCheckBox.Enabled = true; + showEndStateFormCheckBox.Enabled = true; + sensusExtensionsCheckBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + foreach (var v in defaultUnitsComboBox.Items) + { + if (v.ToString() == defaultUnitsComboBox.Text) return flags; + } + + message = string.Format(Strings.Invalid_0, Strings.Default_units); + return CfgUpdateFlags.Error; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + + for (Unit u = 0; u < Unit.Count; u++) + { + if (u.ToString() == defaultUnitsComboBox.Text) config.DefaultUnits = u; + } + + config.EnterSerialNrsAtTheEnd = enterSNsAtTheEndCheckBox.Checked; + config.ShowCycleEndForm = showEndStateFormCheckBox.Checked; + config.SensusExtensions = sensusExtensionsCheckBox.Checked; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/EntryFormCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/EntryFormCfgCtrl.designer.cs new file mode 100644 index 00000000..74e92f2f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/EntryFormCfgCtrl.designer.cs @@ -0,0 +1,151 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.HeatMeters6 +{ + partial class EntryFormCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.showEndStateFormCheckBox = new System.Windows.Forms.CheckBox(); + this.enterSNsAtTheEndCheckBox = new System.Windows.Forms.CheckBox(); + this.sensusExtensionsCheckBox = new System.Windows.Forms.CheckBox(); + this.defaultUnitsLabel = new System.Windows.Forms.Label(); + this.defaultUnitsComboBox = new System.Windows.Forms.ComboBox(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(113, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(23, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(110, 33); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // showEndStateFormCheckBox + // + this.showEndStateFormCheckBox.AutoSize = true; + this.showEndStateFormCheckBox.Enabled = false; + this.showEndStateFormCheckBox.Location = new System.Drawing.Point(113, 139); + this.showEndStateFormCheckBox.Name = "showEndStateFormCheckBox"; + this.showEndStateFormCheckBox.Size = new System.Drawing.Size(151, 17); + this.showEndStateFormCheckBox.TabIndex = 4; + this.showEndStateFormCheckBox.Text = "Watermeter end state form"; + this.showEndStateFormCheckBox.UseVisualStyleBackColor = true; + // + // enterSNsAtTheEndCheckBox + // + this.enterSNsAtTheEndCheckBox.AutoSize = true; + this.enterSNsAtTheEndCheckBox.Enabled = false; + this.enterSNsAtTheEndCheckBox.Location = new System.Drawing.Point(113, 116); + this.enterSNsAtTheEndCheckBox.Name = "enterSNsAtTheEndCheckBox"; + this.enterSNsAtTheEndCheckBox.Size = new System.Drawing.Size(167, 17); + this.enterSNsAtTheEndCheckBox.TabIndex = 3; + this.enterSNsAtTheEndCheckBox.Text = "Enter serial number at the end"; + this.enterSNsAtTheEndCheckBox.UseVisualStyleBackColor = true; + // + // sensusExtensionsCheckBox + // + this.sensusExtensionsCheckBox.AutoSize = true; + this.sensusExtensionsCheckBox.Enabled = false; + this.sensusExtensionsCheckBox.Location = new System.Drawing.Point(113, 162); + this.sensusExtensionsCheckBox.Name = "sensusExtensionsCheckBox"; + this.sensusExtensionsCheckBox.Size = new System.Drawing.Size(114, 17); + this.sensusExtensionsCheckBox.TabIndex = 5; + this.sensusExtensionsCheckBox.Text = "Sensus extensions"; + this.sensusExtensionsCheckBox.UseVisualStyleBackColor = true; + // + // defaultUnitsLabel + // + this.defaultUnitsLabel.AutoSize = true; + this.defaultUnitsLabel.Location = new System.Drawing.Point(23, 87); + this.defaultUnitsLabel.Name = "defaultUnitsLabel"; + this.defaultUnitsLabel.Size = new System.Drawing.Size(66, 13); + this.defaultUnitsLabel.TabIndex = 6; + this.defaultUnitsLabel.Text = "Default units"; + // + // defaultUnitsComboBox + // + this.defaultUnitsComboBox.FormattingEnabled = true; + this.defaultUnitsComboBox.Location = new System.Drawing.Point(113, 84); + this.defaultUnitsComboBox.Name = "defaultUnitsComboBox"; + this.defaultUnitsComboBox.Size = new System.Drawing.Size(130, 21); + this.defaultUnitsComboBox.TabIndex = 7; + // + // EntryFormCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.defaultUnitsComboBox); + this.Controls.Add(this.defaultUnitsLabel); + this.Controls.Add(this.sensusExtensionsCheckBox); + this.Controls.Add(this.enterSNsAtTheEndCheckBox); + this.Controls.Add(this.showEndStateFormCheckBox); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "EntryFormCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.CheckBox showEndStateFormCheckBox; + private System.Windows.Forms.CheckBox enterSNsAtTheEndCheckBox; + private System.Windows.Forms.CheckBox sensusExtensionsCheckBox; + private System.Windows.Forms.Label defaultUnitsLabel; + private System.Windows.Forms.ComboBox defaultUnitsComboBox; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/EntryFormCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/EntryFormCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/EntryFormCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/Factory.cs new file mode 100644 index 00000000..63545b17 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/Factory.cs @@ -0,0 +1,31 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DataEntry.HeatMeters6 +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring("TBF.BenchControl.".Length); } } + + public void ResetStaticProperties() { EntryForm.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new EntryForm(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new EntryForm(cfg); } + + public IComponentCfg DefaultConfig() + { + return new EntryFormCfg(this.GetType().Namespace.Substring("TBF.BenchControl.DataEntry.".Length), this); + } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + IComponentCfg cfg = ComponentCfgBase.CreateFromDbEntity(EntryFormCfg.Serializer, component, this); + (cfg as EntryFormCfg).Units = (cfg as EntryFormCfg).DefaultUnits; + return cfg; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/TestStartEndForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/TestStartEndForm.cs new file mode 100644 index 00000000..7747f8d3 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/TestStartEndForm.cs @@ -0,0 +1,553 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using log4net; +using TBF.BenchControl.GenericDevices; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.HeatMeters6 +{ + public partial class TestStartEndForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(TestStartEndForm)); + + // Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + readonly EntryFormCfg entryFormCfg; + + /// Number of text boxes for serial numbers + public readonly int WaterMetersCount; + readonly IRegisterReader[] regReaders; + readonly bool[] disabled; + + // To be retrieved after the form closes + public double[] WMStartState; + public readonly string[] WMStartStateStr; + public double[] WMEndState; + + // To be retrieved after the form closes + public double[] EnergyStartState; + public readonly string[] EnergyStartStateStr; + public double[] EnergyEndState; + + bool endStates; /// false=start states, true=end states + + double refVolume; + double warningLimLo; /// limit to display exclamation mark, typically 2x errLimLo + double warningLimHi; /// limit to display exclamation mark, typically 2x errLimHi + + double refEnergy; + double energyWarningLimLo; /// limit to display exclamation mark, typically 2x energyErrLimLo + double energyWarningLimHi; /// limit to display exclamation mark, typically 2x energyErrLimHi + + int TextBoxesCount; + /// + Label[] labels; + TextBox[] startTextBoxes; + TextBox[] endTextBoxes; + Label[] energyLabels; + TextBox[] energyStartTextBoxes; + TextBox[] energyEndTextBoxes; + IList enabledTextBoxes; + + /// + /// Parameterless constructor initializing common part for start and endstate form + /// + public TestStartEndForm() + { + InitializeComponent(); + ControlBox = false; + + TextBoxesCount = 6; + + labels = new Label[] { label1, label2, label3, label4, label5, label6 }; + + startTextBoxes = new TextBox[] + { + startTextBox1, startTextBox2, startTextBox3, startTextBox4, startTextBox5, startTextBox6, + }; + endTextBoxes = new TextBox[] + { + endTextBox1, endTextBox2, endTextBox3, endTextBox4, endTextBox5, endTextBox6, + }; + + energyLabels = new Label[] { label13, label14, label15, label16, label17, label18 }; + + energyStartTextBoxes = new TextBox[] + { + startTextBox13, startTextBox14, startTextBox15, startTextBox16, startTextBox17, startTextBox18, + }; + energyEndTextBoxes = new TextBox[] + { + endTextBox13, endTextBox14, endTextBox15, endTextBox16, endTextBox17, endTextBox18, + }; + + enabledTextBoxes = new List(); + + completed = false; + StartForceCloseHandler(); + } + + /// + /// Constructor to fill in start states + /// + /// Number of water meters + /// Information from CycleBeginningForm about availability of water meters + public TestStartEndForm(EntryFormCfg cfg, int waterMetersCount, IRegisterReader[] regReaders, bool[] disabled) + : this() + { + endStates = false; + + entryFormCfg = cfg; + + this.WaterMetersCount = waterMetersCount; + this.regReaders = regReaders; + this.disabled = disabled; + + ShuffleTextBoxes(); + + WMStartState = new double[waterMetersCount]; + WMStartStateStr = new string[waterMetersCount]; + + EnergyStartState = new double[waterMetersCount]; + EnergyStartStateStr = new string[waterMetersCount]; + } + + /// + /// Constructor to fill in end states + /// + /// Number of water meters + /// Information entered on test start + /// Information from CycleBeginningForm about availability of water meters + /// Reference volume, it is used to verify the end state, show/hide exclamation if necessary + /// Error limit low, it is used to verify the end state, show/hide exclamation if necessary + /// Error limit high, it is used to verify the end state, show/hide exclamation if necessary + public TestStartEndForm(EntryFormCfg cfg, int waterMetersCount, IRegisterReader[] regReaders, string[] wmStartStateStr, string[] energyStartStateStr, + bool[] disabled, double refVolume, double errLimLo, double errLimHi, + double refEnergy, double energyErrLimLo, double energyErrLimHi) + : this() + { + endStates = true; + + entryFormCfg = cfg; + + this.WaterMetersCount = waterMetersCount; + this.regReaders = regReaders; + + if (wmStartStateStr == null || wmStartStateStr.Length != waterMetersCount) + throw (new Exception("Invalid 'wmStartStateStr' argument")); + this.WMStartStateStr = wmStartStateStr; + + if (energyStartStateStr == null || energyStartStateStr.Length != waterMetersCount) + throw (new Exception("Invalid 'energyStartStateStr' argument")); + this.EnergyStartStateStr = energyStartStateStr; + + this.disabled = disabled; + + this.refVolume = refVolume; + this.warningLimLo = 2 * errLimLo; + this.warningLimHi = 2 * errLimHi; + + this.refEnergy = refEnergy; + this.energyWarningLimLo = 2 * energyErrLimLo; + this.energyWarningLimHi = 2 * energyErrLimHi; + + ShuffleTextBoxes(); + + WMEndState = new double[waterMetersCount]; + EnergyEndState = new double[waterMetersCount]; + } + + /// + /// Make sure the layout of labels/text boxes on the screen + /// corresponds to the layout of watermeters of the test bench. + /// + void ShuffleTextBoxes() + { + if (Config.Data.HeatMetersCount < TextBoxesCount) + { + int nrLines = Math.Max(1, Config.Data.HeatMetersCount / Config.Data.LineSize); + int gap = (TextBoxesCount - Config.Data.HeatMetersCount) / nrLines; + + int dest = 0; + for (int l = 0; l < nrLines; l++) + { + for (int i = 0; i < Config.Data.LineSize; i++) + { + labels[dest] = labels[l * Config.Data.LineSize + l * gap + i]; + startTextBoxes[dest] = startTextBoxes[l * Config.Data.LineSize + l * gap + i]; + endTextBoxes[dest] = endTextBoxes[l * Config.Data.LineSize + l * gap + i]; + energyLabels[dest] = energyLabels[l * Config.Data.LineSize + l * gap + i]; + energyStartTextBoxes[dest] = energyStartTextBoxes[l * Config.Data.LineSize + l * gap + i]; + energyEndTextBoxes[dest] = energyEndTextBoxes[l * Config.Data.LineSize + l * gap + i]; + dest++; + } + } + TextBoxesCount = Config.Data.HeatMetersCount; + } + } + + private void TestStartEndForm_Load(object sender, EventArgs e) + { + Localize(); + + for (Config.Unit units = 0; units < Config.Unit.Count; units++) + { + if (Config.Units.IsEnergy(units)) unitsComboBox.Items.Add(units.ToString()); + } + unitsComboBox.Text = entryFormCfg.Units.ToString(); + + //Height = 115 + 90 * WaterMetersCount; + + for (int i = 0; i < TextBoxesCount; i++) + { + if (i < WaterMetersCount) + { + labels[i].Visible = startTextBoxes[i].Visible = endTextBoxes[i].Visible = true; + energyLabels[i].Visible = energyStartTextBoxes[i].Visible = energyEndTextBoxes[i].Visible = true; + } + } + + if (endStates) + { + for (int i = 0; i < TextBoxesCount; i++) + { + if (WMStartStateStr != null && i < WMStartStateStr.Length) + { + startTextBoxes[i].Text = WMStartStateStr[i]; + } + if (EnergyStartStateStr != null && i < EnergyStartStateStr.Length) + { + energyStartTextBoxes[i].Text = EnergyStartStateStr[i]; + } + + if (disabled != null && i < disabled.Length && disabled[i]) + { + endTextBoxes[i].Enabled = false; + energyEndTextBoxes[i].Enabled = false; + } + else + { + endTextBoxes[i].Enabled = true; + energyEndTextBoxes[i].Enabled = true; + enabledTextBoxes.Add(endTextBoxes[i]); + enabledTextBoxes.Add(energyEndTextBoxes[i]); + } + } + } + else + { + for (int i = 0; i < TextBoxesCount; i++) + { + if (disabled != null && i < disabled.Length && disabled[i]) + { + startTextBoxes[i].Enabled = false; + energyStartTextBoxes[i].Enabled = false; + } + else + { + startTextBoxes[i].Enabled = true; + energyStartTextBoxes[i].Enabled = true; + enabledTextBoxes.Add(startTextBoxes[i]); + enabledTextBoxes.Add(energyStartTextBoxes[i]); + } + } + } + } + + void Localize() + { + Text = Strings.Water_Meter_States; + for (int i = 0; i < TextBoxesCount; i++) + { + labels[i].Text = string.Format("{0} {1} [l]", Strings.Volume + " ", i + 1); + energyLabels[i].Text = string.Format("{0} {1}", Strings.Energy + " ", i + 1); + } + startLabel.Text = Strings.Start; + endLabel.Text = Strings.End; + okButton.Text = Strings.OkBtnText; + } + + private void unitsComboBox_SelectedIndexChanged(object sender, EventArgs e) + { + for (Config.Unit u = 0; u < Config.Unit.Count; u++) + { + if (u.ToString() == unitsComboBox.Text) + { + entryFormCfg.Units = u; + break; + } + } + } + + private void okButton_Click(object sender, EventArgs eArgs) + { + try + { + if (endStates) + { + for (int i = 0; i < Math.Min(WaterMetersCount, TextBoxesCount); i++) + { + if (endTextBoxes[i].Visible && endTextBoxes[i].Enabled) + { + WMEndState[i] = Utils.ParseUDouble(endTextBoxes[i].Text); + EnergyEndState[i] = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(energyEndTextBoxes[i].Text)); + } + } + } + else + { + for (int i = 0; i < Math.Min(WaterMetersCount, TextBoxesCount); i++) + { + if (startTextBoxes[i].Visible && startTextBoxes[i].Enabled) + { + WMStartStateStr[i] = startTextBoxes[i].Text; + WMStartState[i] = Utils.ParseUDouble(startTextBoxes[i].Text); + EnergyStartStateStr[i] = energyStartTextBoxes[i].Text; + EnergyStartState[i] = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(energyStartTextBoxes[i].Text)); + } + } + } + } + catch(Exception e) + { + log.ErrorFormat("Exception: {0}", e.Message); + return; + } + + completed = true; + 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) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + + /// + /// Calculate the approximate error and verify whether it is within limits. + /// Make an exclamation mark visible if out of range. + /// Similar event handler is implemented for all endTextBoxes (1..24). + /// + private void endTextBox1_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox1.Text); + double startState = Utils.ParseUDouble(startTextBox1.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { }; + exclamation1.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox2_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox2.Text); + double startState = Utils.ParseUDouble(startTextBox2.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation2.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox3_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox3.Text); + double startState = Utils.ParseUDouble(startTextBox3.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation3.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox4_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox4.Text); + double startState = Utils.ParseUDouble(startTextBox4.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation4.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox5_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox5.Text); + double startState = Utils.ParseUDouble(startTextBox5.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation5.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox6_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox6.Text); + double startState = Utils.ParseUDouble(startTextBox6.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation6.Visible = (err < warningLimLo) || (warningLimHi < err); + } + + private void endTextBox13_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(endTextBox13.Text)); + double startState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(startTextBox13.Text)); + err = 100.0 * (endState - startState - refEnergy) / refEnergy; + } + catch { err = 1000.0f; }; + exclamation13.Visible = (err < energyWarningLimLo) || (energyWarningLimHi < err); + } + private void endTextBox14_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(endTextBox14.Text)); + double startState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(startTextBox14.Text)); + err = 100.0 * (endState - startState - refEnergy) / refEnergy; + } + catch { err = 1000.0f; }; + exclamation14.Visible = (err < energyWarningLimLo) || (energyWarningLimHi < err); + } + private void endTextBox15_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(endTextBox15.Text)); + double startState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(startTextBox15.Text)); + err = 100.0 * (endState - startState - refEnergy) / refEnergy; + } + catch { err = 1000.0f; }; + exclamation15.Visible = (err < energyWarningLimLo) || (energyWarningLimHi < err); + } + private void endTextBox16_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(endTextBox16.Text)); + double startState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(startTextBox16.Text)); + err = 100.0 * (endState - startState - refEnergy) / refEnergy; + } + catch { err = 1000.0f; }; + exclamation16.Visible = (err < energyWarningLimLo) || (energyWarningLimHi < err); + } + private void endTextBox17_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(endTextBox17.Text)); + double startState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(startTextBox17.Text)); + err = 100.0 * (endState - startState - refEnergy) / refEnergy; + } + catch { err = 1000.0f; }; + exclamation17.Visible = (err < energyWarningLimLo) || (energyWarningLimHi < err); + } + private void endTextBox18_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(endTextBox18.Text)); + double startState = Config.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(startTextBox18.Text)); + err = 100.0 * (endState - startState - refEnergy) / refEnergy; + } + catch { err = 1000.0f; }; + exclamation18.Visible = (err < energyWarningLimLo) || (energyWarningLimHi < err); + } + + /// + /// Process a key press within any enabled text boxe + /// + /// + /// + /// TextBox control which received the event + private void ProcKeyPress(object sender, KeyPressEventArgs e, TextBox currentFocusOwner) + { + if (e.KeyChar == '+') + { + /// Process '+' key ..... Form completed + okButton_Click(sender, e); + } + if (e.KeyChar == '\r') + { + /// Process key ..... Next text field + if (enabledTextBoxes.Count < 2) return; /// There is just one enabled textbox + + for (int i = 0; i < enabledTextBoxes.Count; i++) + { + if (enabledTextBoxes[i] == currentFocusOwner) + { + /// Change focus to the next enabled text box + enabledTextBoxes[(i + 1) % enabledTextBoxes.Count].Focus(); + return; + } + } + } + } + + private void startTextBox1_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox1); } + private void startTextBox2_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox2); } + private void startTextBox3_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox3); } + private void startTextBox4_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox4); } + private void startTextBox5_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox5); } + private void startTextBox6_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox6); } + private void startTextBox13_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox13); } + private void startTextBox14_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox14); } + private void startTextBox15_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox15); } + private void startTextBox16_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox16); } + private void startTextBox17_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox17); } + private void startTextBox18_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox18); } + + private void endTextBox1_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox1); } + private void endTextBox2_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox2); } + private void endTextBox3_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox3); } + private void endTextBox4_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox4); } + private void endTextBox5_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox5); } + private void endTextBox6_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox6); } + private void endTextBox13_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox13); } + private void endTextBox14_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox14); } + private void endTextBox15_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox15); } + private void endTextBox16_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox16); } + private void endTextBox17_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox17); } + private void endTextBox18_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox18); } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/TestStartEndForm.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/TestStartEndForm.designer.cs new file mode 100644 index 00000000..7d2baa3c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/TestStartEndForm.designer.cs @@ -0,0 +1,846 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.HeatMeters6 +{ + partial class TestStartEndForm + { + /// + /// 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() + { + this.exclamation1 = new System.Windows.Forms.Label(); + this.startTextBox1 = new System.Windows.Forms.TextBox(); + this.endTextBox1 = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.okButton = new System.Windows.Forms.Button(); + this.exclamation3 = new System.Windows.Forms.Label(); + this.startTextBox3 = new System.Windows.Forms.TextBox(); + this.endTextBox3 = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.exclamation4 = new System.Windows.Forms.Label(); + this.startTextBox4 = new System.Windows.Forms.TextBox(); + this.endTextBox4 = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.exclamation5 = new System.Windows.Forms.Label(); + this.startTextBox5 = new System.Windows.Forms.TextBox(); + this.endTextBox5 = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.exclamation6 = new System.Windows.Forms.Label(); + this.startTextBox6 = new System.Windows.Forms.TextBox(); + this.endTextBox6 = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.startLabel = new System.Windows.Forms.Label(); + this.endLabel = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.endTextBox2 = new System.Windows.Forms.TextBox(); + this.startTextBox2 = new System.Windows.Forms.TextBox(); + this.exclamation2 = new System.Windows.Forms.Label(); + this.exclamation18 = new System.Windows.Forms.Label(); + this.exclamation17 = new System.Windows.Forms.Label(); + this.startTextBox18 = new System.Windows.Forms.TextBox(); + this.exclamation16 = new System.Windows.Forms.Label(); + this.endTextBox18 = new System.Windows.Forms.TextBox(); + this.label18 = new System.Windows.Forms.Label(); + this.startTextBox17 = new System.Windows.Forms.TextBox(); + this.exclamation15 = new System.Windows.Forms.Label(); + this.endTextBox17 = new System.Windows.Forms.TextBox(); + this.label17 = new System.Windows.Forms.Label(); + this.startTextBox16 = new System.Windows.Forms.TextBox(); + this.exclamation14 = new System.Windows.Forms.Label(); + this.endTextBox16 = new System.Windows.Forms.TextBox(); + this.label16 = new System.Windows.Forms.Label(); + this.startTextBox15 = new System.Windows.Forms.TextBox(); + this.exclamation13 = new System.Windows.Forms.Label(); + this.endTextBox15 = new System.Windows.Forms.TextBox(); + this.label15 = new System.Windows.Forms.Label(); + this.startTextBox14 = new System.Windows.Forms.TextBox(); + this.label35 = new System.Windows.Forms.Label(); + this.endTextBox14 = new System.Windows.Forms.TextBox(); + this.label14 = new System.Windows.Forms.Label(); + this.startTextBox13 = new System.Windows.Forms.TextBox(); + this.label37 = new System.Windows.Forms.Label(); + this.endTextBox13 = new System.Windows.Forms.TextBox(); + this.label13 = new System.Windows.Forms.Label(); + this.unitsComboBox = new System.Windows.Forms.ComboBox(); + this.unitsLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // exclamation1 + // + this.exclamation1.AutoSize = true; + this.exclamation1.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation1.ForeColor = System.Drawing.Color.Red; + this.exclamation1.Location = new System.Drawing.Point(532, 56); + this.exclamation1.Name = "exclamation1"; + this.exclamation1.Size = new System.Drawing.Size(30, 38); + this.exclamation1.TabIndex = 5; + this.exclamation1.Text = "!"; + this.exclamation1.Visible = false; + // + // startTextBox1 + // + this.startTextBox1.Enabled = false; + this.startTextBox1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox1.Location = new System.Drawing.Point(185, 60); + this.startTextBox1.Name = "startTextBox1"; + this.startTextBox1.Size = new System.Drawing.Size(163, 31); + this.startTextBox1.TabIndex = 3; + this.startTextBox1.Visible = false; + this.startTextBox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox1_KeyPress); + // + // endTextBox1 + // + this.endTextBox1.Enabled = false; + this.endTextBox1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox1.Location = new System.Drawing.Point(367, 60); + this.endTextBox1.Name = "endTextBox1"; + this.endTextBox1.Size = new System.Drawing.Size(163, 31); + this.endTextBox1.TabIndex = 4; + this.endTextBox1.Visible = false; + this.endTextBox1.TextChanged += new System.EventHandler(this.endTextBox1_TextChanged); + this.endTextBox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox1_KeyPress); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label1.Location = new System.Drawing.Point(23, 63); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(132, 23); + this.label1.TabIndex = 2; + this.label1.Text = "Volume 1 [l]"; + this.label1.Visible = false; + // + // okButton + // + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(1159, 60); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(98, 63); + this.okButton.TabIndex = 100; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // exclamation3 + // + this.exclamation3.AutoSize = true; + this.exclamation3.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation3.ForeColor = System.Drawing.Color.Red; + this.exclamation3.Location = new System.Drawing.Point(532, 144); + this.exclamation3.Name = "exclamation3"; + this.exclamation3.Size = new System.Drawing.Size(30, 38); + this.exclamation3.TabIndex = 13; + this.exclamation3.Text = "!"; + this.exclamation3.Visible = false; + // + // startTextBox3 + // + this.startTextBox3.Enabled = false; + this.startTextBox3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox3.Location = new System.Drawing.Point(185, 148); + this.startTextBox3.Name = "startTextBox3"; + this.startTextBox3.Size = new System.Drawing.Size(163, 31); + this.startTextBox3.TabIndex = 11; + this.startTextBox3.Visible = false; + this.startTextBox3.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox3_KeyPress); + // + // endTextBox3 + // + this.endTextBox3.Enabled = false; + this.endTextBox3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox3.Location = new System.Drawing.Point(367, 148); + this.endTextBox3.Name = "endTextBox3"; + this.endTextBox3.Size = new System.Drawing.Size(163, 31); + this.endTextBox3.TabIndex = 12; + this.endTextBox3.Visible = false; + this.endTextBox3.TextChanged += new System.EventHandler(this.endTextBox3_TextChanged); + this.endTextBox3.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox3_KeyPress); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label3.Location = new System.Drawing.Point(23, 151); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(132, 23); + this.label3.TabIndex = 10; + this.label3.Text = "Volume 3 [l]"; + this.label3.Visible = false; + // + // exclamation4 + // + this.exclamation4.AutoSize = true; + this.exclamation4.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation4.ForeColor = System.Drawing.Color.Red; + this.exclamation4.Location = new System.Drawing.Point(532, 188); + this.exclamation4.Name = "exclamation4"; + this.exclamation4.Size = new System.Drawing.Size(30, 38); + this.exclamation4.TabIndex = 17; + this.exclamation4.Text = "!"; + this.exclamation4.Visible = false; + // + // startTextBox4 + // + this.startTextBox4.Enabled = false; + this.startTextBox4.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox4.Location = new System.Drawing.Point(185, 192); + this.startTextBox4.Name = "startTextBox4"; + this.startTextBox4.Size = new System.Drawing.Size(163, 31); + this.startTextBox4.TabIndex = 15; + this.startTextBox4.Visible = false; + this.startTextBox4.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox4_KeyPress); + // + // endTextBox4 + // + this.endTextBox4.Enabled = false; + this.endTextBox4.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox4.Location = new System.Drawing.Point(367, 192); + this.endTextBox4.Name = "endTextBox4"; + this.endTextBox4.Size = new System.Drawing.Size(163, 31); + this.endTextBox4.TabIndex = 16; + this.endTextBox4.Visible = false; + this.endTextBox4.TextChanged += new System.EventHandler(this.endTextBox4_TextChanged); + this.endTextBox4.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox4_KeyPress); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label4.Location = new System.Drawing.Point(23, 195); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(132, 23); + this.label4.TabIndex = 14; + this.label4.Text = "Volume 4 [l]"; + this.label4.Visible = false; + // + // exclamation5 + // + this.exclamation5.AutoSize = true; + this.exclamation5.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation5.ForeColor = System.Drawing.Color.Red; + this.exclamation5.Location = new System.Drawing.Point(532, 232); + this.exclamation5.Name = "exclamation5"; + this.exclamation5.Size = new System.Drawing.Size(30, 38); + this.exclamation5.TabIndex = 21; + this.exclamation5.Text = "!"; + this.exclamation5.Visible = false; + // + // startTextBox5 + // + this.startTextBox5.Enabled = false; + this.startTextBox5.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox5.Location = new System.Drawing.Point(185, 236); + this.startTextBox5.Name = "startTextBox5"; + this.startTextBox5.Size = new System.Drawing.Size(163, 31); + this.startTextBox5.TabIndex = 19; + this.startTextBox5.Visible = false; + this.startTextBox5.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox5_KeyPress); + // + // endTextBox5 + // + this.endTextBox5.Enabled = false; + this.endTextBox5.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox5.Location = new System.Drawing.Point(367, 236); + this.endTextBox5.Name = "endTextBox5"; + this.endTextBox5.Size = new System.Drawing.Size(163, 31); + this.endTextBox5.TabIndex = 20; + this.endTextBox5.Visible = false; + this.endTextBox5.TextChanged += new System.EventHandler(this.endTextBox5_TextChanged); + this.endTextBox5.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox5_KeyPress); + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label5.Location = new System.Drawing.Point(23, 239); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(132, 23); + this.label5.TabIndex = 18; + this.label5.Text = "Volume 5 [l]"; + this.label5.Visible = false; + // + // exclamation6 + // + this.exclamation6.AutoSize = true; + this.exclamation6.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation6.ForeColor = System.Drawing.Color.Red; + this.exclamation6.Location = new System.Drawing.Point(532, 276); + this.exclamation6.Name = "exclamation6"; + this.exclamation6.Size = new System.Drawing.Size(30, 38); + this.exclamation6.TabIndex = 25; + this.exclamation6.Text = "!"; + this.exclamation6.Visible = false; + // + // startTextBox6 + // + this.startTextBox6.Enabled = false; + this.startTextBox6.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox6.Location = new System.Drawing.Point(185, 280); + this.startTextBox6.Name = "startTextBox6"; + this.startTextBox6.Size = new System.Drawing.Size(163, 31); + this.startTextBox6.TabIndex = 23; + this.startTextBox6.Visible = false; + this.startTextBox6.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox6_KeyPress); + // + // endTextBox6 + // + this.endTextBox6.Enabled = false; + this.endTextBox6.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox6.Location = new System.Drawing.Point(367, 280); + this.endTextBox6.Name = "endTextBox6"; + this.endTextBox6.Size = new System.Drawing.Size(163, 31); + this.endTextBox6.TabIndex = 24; + this.endTextBox6.Visible = false; + this.endTextBox6.TextChanged += new System.EventHandler(this.endTextBox6_TextChanged); + this.endTextBox6.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox6_KeyPress); + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label6.Location = new System.Drawing.Point(23, 283); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(132, 23); + this.label6.TabIndex = 22; + this.label6.Text = "Volume 6 [l]"; + this.label6.Visible = false; + // + // startLabel + // + this.startLabel.AutoSize = true; + this.startLabel.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startLabel.Location = new System.Drawing.Point(237, 21); + this.startLabel.Name = "startLabel"; + this.startLabel.Size = new System.Drawing.Size(56, 23); + this.startLabel.TabIndex = 0; + this.startLabel.Text = "Start"; + // + // endLabel + // + this.endLabel.AutoSize = true; + this.endLabel.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endLabel.Location = new System.Drawing.Point(423, 21); + this.endLabel.Name = "endLabel"; + this.endLabel.Size = new System.Drawing.Size(46, 23); + this.endLabel.TabIndex = 1; + this.endLabel.Text = "End"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label2.Location = new System.Drawing.Point(23, 107); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(132, 23); + this.label2.TabIndex = 6; + this.label2.Text = "Volume 2 [l]"; + this.label2.Visible = false; + // + // endTextBox2 + // + this.endTextBox2.Enabled = false; + this.endTextBox2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox2.Location = new System.Drawing.Point(367, 104); + this.endTextBox2.Name = "endTextBox2"; + this.endTextBox2.Size = new System.Drawing.Size(163, 31); + this.endTextBox2.TabIndex = 8; + this.endTextBox2.Visible = false; + this.endTextBox2.TextChanged += new System.EventHandler(this.endTextBox2_TextChanged); + this.endTextBox2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox2_KeyPress); + // + // startTextBox2 + // + this.startTextBox2.Enabled = false; + this.startTextBox2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox2.Location = new System.Drawing.Point(185, 104); + this.startTextBox2.Name = "startTextBox2"; + this.startTextBox2.Size = new System.Drawing.Size(163, 31); + this.startTextBox2.TabIndex = 7; + this.startTextBox2.Visible = false; + this.startTextBox2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox2_KeyPress); + // + // exclamation2 + // + this.exclamation2.AutoSize = true; + this.exclamation2.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation2.ForeColor = System.Drawing.Color.Red; + this.exclamation2.Location = new System.Drawing.Point(532, 100); + this.exclamation2.Name = "exclamation2"; + this.exclamation2.Size = new System.Drawing.Size(30, 38); + this.exclamation2.TabIndex = 9; + this.exclamation2.Text = "!"; + this.exclamation2.Visible = false; + // + // exclamation18 + // + this.exclamation18.AutoSize = true; + this.exclamation18.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation18.ForeColor = System.Drawing.Color.Red; + this.exclamation18.Location = new System.Drawing.Point(1101, 276); + this.exclamation18.Name = "exclamation18"; + this.exclamation18.Size = new System.Drawing.Size(30, 38); + this.exclamation18.TabIndex = 75; + this.exclamation18.Text = "!"; + this.exclamation18.Visible = false; + // + // exclamation17 + // + this.exclamation17.AutoSize = true; + this.exclamation17.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation17.ForeColor = System.Drawing.Color.Red; + this.exclamation17.Location = new System.Drawing.Point(1101, 232); + this.exclamation17.Name = "exclamation17"; + this.exclamation17.Size = new System.Drawing.Size(30, 38); + this.exclamation17.TabIndex = 71; + this.exclamation17.Text = "!"; + this.exclamation17.Visible = false; + // + // startTextBox18 + // + this.startTextBox18.Enabled = false; + this.startTextBox18.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox18.Location = new System.Drawing.Point(754, 280); + this.startTextBox18.Name = "startTextBox18"; + this.startTextBox18.Size = new System.Drawing.Size(163, 31); + this.startTextBox18.TabIndex = 73; + this.startTextBox18.Visible = false; + this.startTextBox18.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox18_KeyPress); + // + // exclamation16 + // + this.exclamation16.AutoSize = true; + this.exclamation16.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation16.ForeColor = System.Drawing.Color.Red; + this.exclamation16.Location = new System.Drawing.Point(1101, 188); + this.exclamation16.Name = "exclamation16"; + this.exclamation16.Size = new System.Drawing.Size(30, 38); + this.exclamation16.TabIndex = 67; + this.exclamation16.Text = "!"; + this.exclamation16.Visible = false; + // + // endTextBox18 + // + this.endTextBox18.Enabled = false; + this.endTextBox18.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox18.Location = new System.Drawing.Point(936, 280); + this.endTextBox18.Name = "endTextBox18"; + this.endTextBox18.Size = new System.Drawing.Size(163, 31); + this.endTextBox18.TabIndex = 74; + this.endTextBox18.Visible = false; + this.endTextBox18.TextChanged += new System.EventHandler(this.endTextBox18_TextChanged); + this.endTextBox18.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox18_KeyPress); + // + // label18 + // + this.label18.AutoSize = true; + this.label18.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label18.Location = new System.Drawing.Point(592, 283); + this.label18.Name = "label18"; + this.label18.Size = new System.Drawing.Size(95, 23); + this.label18.TabIndex = 72; + this.label18.Text = "Energy 6"; + this.label18.Visible = false; + // + // startTextBox17 + // + this.startTextBox17.Enabled = false; + this.startTextBox17.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox17.Location = new System.Drawing.Point(754, 236); + this.startTextBox17.Name = "startTextBox17"; + this.startTextBox17.Size = new System.Drawing.Size(163, 31); + this.startTextBox17.TabIndex = 69; + this.startTextBox17.Visible = false; + this.startTextBox17.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox17_KeyPress); + // + // exclamation15 + // + this.exclamation15.AutoSize = true; + this.exclamation15.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation15.ForeColor = System.Drawing.Color.Red; + this.exclamation15.Location = new System.Drawing.Point(1101, 144); + this.exclamation15.Name = "exclamation15"; + this.exclamation15.Size = new System.Drawing.Size(30, 38); + this.exclamation15.TabIndex = 63; + this.exclamation15.Text = "!"; + this.exclamation15.Visible = false; + // + // endTextBox17 + // + this.endTextBox17.Enabled = false; + this.endTextBox17.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox17.Location = new System.Drawing.Point(936, 236); + this.endTextBox17.Name = "endTextBox17"; + this.endTextBox17.Size = new System.Drawing.Size(163, 31); + this.endTextBox17.TabIndex = 70; + this.endTextBox17.Visible = false; + this.endTextBox17.TextChanged += new System.EventHandler(this.endTextBox17_TextChanged); + this.endTextBox17.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox17_KeyPress); + // + // label17 + // + this.label17.AutoSize = true; + this.label17.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label17.Location = new System.Drawing.Point(592, 239); + this.label17.Name = "label17"; + this.label17.Size = new System.Drawing.Size(95, 23); + this.label17.TabIndex = 68; + this.label17.Text = "Energy 5"; + this.label17.Visible = false; + // + // startTextBox16 + // + this.startTextBox16.Enabled = false; + this.startTextBox16.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox16.Location = new System.Drawing.Point(754, 192); + this.startTextBox16.Name = "startTextBox16"; + this.startTextBox16.Size = new System.Drawing.Size(163, 31); + this.startTextBox16.TabIndex = 65; + this.startTextBox16.Visible = false; + this.startTextBox16.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox16_KeyPress); + // + // exclamation14 + // + this.exclamation14.AutoSize = true; + this.exclamation14.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation14.ForeColor = System.Drawing.Color.Red; + this.exclamation14.Location = new System.Drawing.Point(1101, 100); + this.exclamation14.Name = "exclamation14"; + this.exclamation14.Size = new System.Drawing.Size(30, 38); + this.exclamation14.TabIndex = 59; + this.exclamation14.Text = "!"; + this.exclamation14.Visible = false; + // + // endTextBox16 + // + this.endTextBox16.Enabled = false; + this.endTextBox16.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox16.Location = new System.Drawing.Point(936, 192); + this.endTextBox16.Name = "endTextBox16"; + this.endTextBox16.Size = new System.Drawing.Size(163, 31); + this.endTextBox16.TabIndex = 66; + this.endTextBox16.Visible = false; + this.endTextBox16.TextChanged += new System.EventHandler(this.endTextBox16_TextChanged); + this.endTextBox16.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox16_KeyPress); + // + // label16 + // + this.label16.AutoSize = true; + this.label16.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label16.Location = new System.Drawing.Point(592, 195); + this.label16.Name = "label16"; + this.label16.Size = new System.Drawing.Size(95, 23); + this.label16.TabIndex = 64; + this.label16.Text = "Energy 4"; + this.label16.Visible = false; + // + // startTextBox15 + // + this.startTextBox15.Enabled = false; + this.startTextBox15.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox15.Location = new System.Drawing.Point(754, 148); + this.startTextBox15.Name = "startTextBox15"; + this.startTextBox15.Size = new System.Drawing.Size(163, 31); + this.startTextBox15.TabIndex = 61; + this.startTextBox15.Visible = false; + this.startTextBox15.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox15_KeyPress); + // + // exclamation13 + // + this.exclamation13.AutoSize = true; + this.exclamation13.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation13.ForeColor = System.Drawing.Color.Red; + this.exclamation13.Location = new System.Drawing.Point(1101, 56); + this.exclamation13.Name = "exclamation13"; + this.exclamation13.Size = new System.Drawing.Size(30, 38); + this.exclamation13.TabIndex = 55; + this.exclamation13.Text = "!"; + this.exclamation13.Visible = false; + // + // endTextBox15 + // + this.endTextBox15.Enabled = false; + this.endTextBox15.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox15.Location = new System.Drawing.Point(936, 148); + this.endTextBox15.Name = "endTextBox15"; + this.endTextBox15.Size = new System.Drawing.Size(163, 31); + this.endTextBox15.TabIndex = 62; + this.endTextBox15.Visible = false; + this.endTextBox15.TextChanged += new System.EventHandler(this.endTextBox15_TextChanged); + this.endTextBox15.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox15_KeyPress); + // + // label15 + // + this.label15.AutoSize = true; + this.label15.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label15.Location = new System.Drawing.Point(592, 151); + this.label15.Name = "label15"; + this.label15.Size = new System.Drawing.Size(95, 23); + this.label15.TabIndex = 60; + this.label15.Text = "Energy 3"; + this.label15.Visible = false; + // + // startTextBox14 + // + this.startTextBox14.Enabled = false; + this.startTextBox14.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox14.Location = new System.Drawing.Point(754, 104); + this.startTextBox14.Name = "startTextBox14"; + this.startTextBox14.Size = new System.Drawing.Size(163, 31); + this.startTextBox14.TabIndex = 57; + this.startTextBox14.Visible = false; + this.startTextBox14.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox14_KeyPress); + // + // label35 + // + this.label35.AutoSize = true; + this.label35.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label35.Location = new System.Drawing.Point(992, 21); + this.label35.Name = "label35"; + this.label35.Size = new System.Drawing.Size(46, 23); + this.label35.TabIndex = 51; + this.label35.Text = "End"; + // + // endTextBox14 + // + this.endTextBox14.Enabled = false; + this.endTextBox14.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox14.Location = new System.Drawing.Point(936, 104); + this.endTextBox14.Name = "endTextBox14"; + this.endTextBox14.Size = new System.Drawing.Size(163, 31); + this.endTextBox14.TabIndex = 58; + this.endTextBox14.Visible = false; + this.endTextBox14.TextChanged += new System.EventHandler(this.endTextBox14_TextChanged); + this.endTextBox14.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox14_KeyPress); + // + // label14 + // + this.label14.AutoSize = true; + this.label14.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label14.Location = new System.Drawing.Point(592, 107); + this.label14.Name = "label14"; + this.label14.Size = new System.Drawing.Size(95, 23); + this.label14.TabIndex = 56; + this.label14.Text = "Energy 2"; + this.label14.Visible = false; + // + // startTextBox13 + // + this.startTextBox13.Enabled = false; + this.startTextBox13.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox13.Location = new System.Drawing.Point(754, 60); + this.startTextBox13.Name = "startTextBox13"; + this.startTextBox13.Size = new System.Drawing.Size(163, 31); + this.startTextBox13.TabIndex = 53; + this.startTextBox13.Visible = false; + this.startTextBox13.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox13_KeyPress); + // + // label37 + // + this.label37.AutoSize = true; + this.label37.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label37.Location = new System.Drawing.Point(806, 21); + this.label37.Name = "label37"; + this.label37.Size = new System.Drawing.Size(56, 23); + this.label37.TabIndex = 50; + this.label37.Text = "Start"; + // + // endTextBox13 + // + this.endTextBox13.Enabled = false; + this.endTextBox13.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox13.Location = new System.Drawing.Point(936, 60); + this.endTextBox13.Name = "endTextBox13"; + this.endTextBox13.Size = new System.Drawing.Size(163, 31); + this.endTextBox13.TabIndex = 54; + this.endTextBox13.Visible = false; + this.endTextBox13.TextChanged += new System.EventHandler(this.endTextBox13_TextChanged); + this.endTextBox13.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox13_KeyPress); + // + // label13 + // + this.label13.AutoSize = true; + this.label13.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label13.Location = new System.Drawing.Point(592, 63); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(95, 23); + this.label13.TabIndex = 52; + this.label13.Text = "Energy 1"; + this.label13.Visible = false; + // + // unitsComboBox + // + this.unitsComboBox.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.unitsComboBox.FormattingEnabled = true; + this.unitsComboBox.Location = new System.Drawing.Point(1159, 192); + this.unitsComboBox.Name = "unitsComboBox"; + this.unitsComboBox.Size = new System.Drawing.Size(98, 31); + this.unitsComboBox.TabIndex = 101; + this.unitsComboBox.SelectedIndexChanged += new System.EventHandler(this.unitsComboBox_SelectedIndexChanged); + // + // unitsLabel + // + this.unitsLabel.AutoSize = true; + this.unitsLabel.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.unitsLabel.Location = new System.Drawing.Point(1155, 159); + this.unitsLabel.Name = "unitsLabel"; + this.unitsLabel.Size = new System.Drawing.Size(68, 23); + this.unitsLabel.TabIndex = 102; + this.unitsLabel.Text = "Units:"; + // + // TestStartEndForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.ClientSize = new System.Drawing.Size(1292, 338); + this.Controls.Add(this.unitsLabel); + this.Controls.Add(this.unitsComboBox); + this.Controls.Add(this.exclamation18); + this.Controls.Add(this.exclamation17); + this.Controls.Add(this.startTextBox18); + this.Controls.Add(this.exclamation16); + this.Controls.Add(this.endTextBox18); + this.Controls.Add(this.label18); + this.Controls.Add(this.startTextBox17); + this.Controls.Add(this.exclamation15); + this.Controls.Add(this.endTextBox17); + this.Controls.Add(this.label17); + this.Controls.Add(this.startTextBox16); + this.Controls.Add(this.exclamation14); + this.Controls.Add(this.endTextBox16); + this.Controls.Add(this.label16); + this.Controls.Add(this.startTextBox15); + this.Controls.Add(this.exclamation13); + this.Controls.Add(this.endTextBox15); + this.Controls.Add(this.label15); + this.Controls.Add(this.startTextBox14); + this.Controls.Add(this.label35); + this.Controls.Add(this.endTextBox14); + this.Controls.Add(this.label14); + this.Controls.Add(this.startTextBox13); + this.Controls.Add(this.label37); + this.Controls.Add(this.endTextBox13); + this.Controls.Add(this.label13); + this.Controls.Add(this.exclamation6); + this.Controls.Add(this.exclamation5); + this.Controls.Add(this.startTextBox6); + this.Controls.Add(this.exclamation4); + this.Controls.Add(this.endTextBox6); + this.Controls.Add(this.label6); + this.Controls.Add(this.startTextBox5); + this.Controls.Add(this.exclamation3); + this.Controls.Add(this.endTextBox5); + this.Controls.Add(this.label5); + this.Controls.Add(this.startTextBox4); + this.Controls.Add(this.exclamation2); + this.Controls.Add(this.endTextBox4); + this.Controls.Add(this.label4); + this.Controls.Add(this.startTextBox3); + this.Controls.Add(this.exclamation1); + this.Controls.Add(this.endTextBox3); + this.Controls.Add(this.label3); + this.Controls.Add(this.startTextBox2); + this.Controls.Add(this.endLabel); + this.Controls.Add(this.endTextBox2); + this.Controls.Add(this.label2); + this.Controls.Add(this.startTextBox1); + this.Controls.Add(this.startLabel); + this.Controls.Add(this.endTextBox1); + this.Controls.Add(this.label1); + this.Controls.Add(this.okButton); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "TestStartEndForm"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "End States"; + this.TopMost = true; + this.Load += new System.EventHandler(this.TestStartEndForm_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox endTextBox1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.TextBox endTextBox3; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox endTextBox4; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox endTextBox5; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.TextBox endTextBox6; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TextBox startTextBox1; + private System.Windows.Forms.TextBox startTextBox3; + private System.Windows.Forms.TextBox startTextBox4; + private System.Windows.Forms.TextBox startTextBox5; + private System.Windows.Forms.TextBox startTextBox6; + private System.Windows.Forms.Label startLabel; + private System.Windows.Forms.Label endLabel; + private System.Windows.Forms.Label exclamation1; + private System.Windows.Forms.Label exclamation3; + private System.Windows.Forms.Label exclamation4; + private System.Windows.Forms.Label exclamation5; + private System.Windows.Forms.Label exclamation6; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox endTextBox2; + private System.Windows.Forms.TextBox startTextBox2; + private System.Windows.Forms.Label exclamation2; + private System.Windows.Forms.Label exclamation18; + private System.Windows.Forms.Label exclamation17; + private System.Windows.Forms.TextBox startTextBox18; + private System.Windows.Forms.Label exclamation16; + private System.Windows.Forms.TextBox endTextBox18; + private System.Windows.Forms.Label label18; + private System.Windows.Forms.TextBox startTextBox17; + private System.Windows.Forms.Label exclamation15; + private System.Windows.Forms.TextBox endTextBox17; + private System.Windows.Forms.Label label17; + private System.Windows.Forms.TextBox startTextBox16; + private System.Windows.Forms.Label exclamation14; + private System.Windows.Forms.TextBox endTextBox16; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.TextBox startTextBox15; + private System.Windows.Forms.Label exclamation13; + private System.Windows.Forms.TextBox endTextBox15; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.TextBox startTextBox14; + private System.Windows.Forms.Label label35; + private System.Windows.Forms.TextBox endTextBox14; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.TextBox startTextBox13; + private System.Windows.Forms.Label label37; + private System.Windows.Forms.TextBox endTextBox13; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.ComboBox unitsComboBox; + private System.Windows.Forms.Label unitsLabel; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/TestStartEndForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/TestStartEndForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/HeatMeters6/TestStartEndForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/CycleBeginningForm.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/CycleBeginningForm.Designer.cs new file mode 100644 index 00000000..0b560588 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/CycleBeginningForm.Designer.cs @@ -0,0 +1,254 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.Munich +{ + partial class CycleBeginningForm + { + /// + /// 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() + { + this.okButton = new System.Windows.Forms.Button(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.auxSN1TextBox = new System.Windows.Forms.TextBox(); + this.auxSN1Label = new System.Windows.Forms.Label(); + this.mainSN1TextBox = new System.Windows.Forms.TextBox(); + this.mainSN1Label = new System.Windows.Forms.Label(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.auxSN2TextBox = new System.Windows.Forms.TextBox(); + this.auxSN2Label = new System.Windows.Forms.Label(); + this.mainSN2TextBox = new System.Windows.Forms.TextBox(); + this.mainSN2Label = new System.Windows.Forms.Label(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.auxSN3TextBox = new System.Windows.Forms.TextBox(); + this.auxSN3Label = new System.Windows.Forms.Label(); + this.mainSN3TextBox = new System.Windows.Forms.TextBox(); + this.mainSN3Label = new System.Windows.Forms.Label(); + this.groupBox1.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.SuspendLayout(); + // + // okButton + // + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(557, 43); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(98, 63); + this.okButton.TabIndex = 0; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.auxSN1TextBox); + this.groupBox1.Controls.Add(this.auxSN1Label); + this.groupBox1.Controls.Add(this.mainSN1TextBox); + this.groupBox1.Controls.Add(this.mainSN1Label); + this.groupBox1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox1.ForeColor = System.Drawing.Color.Black; + this.groupBox1.Location = new System.Drawing.Point(28, 18); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(494, 137); + this.groupBox1.TabIndex = 1; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Water Meter 1"; + // + // auxSN1TextBox + // + this.auxSN1TextBox.Location = new System.Drawing.Point(300, 83); + this.auxSN1TextBox.Name = "auxSN1TextBox"; + this.auxSN1TextBox.Size = new System.Drawing.Size(163, 31); + this.auxSN1TextBox.TabIndex = 3; + // + // auxSN1Label + // + this.auxSN1Label.AutoSize = true; + this.auxSN1Label.Location = new System.Drawing.Point(21, 86); + this.auxSN1Label.Name = "auxSN1Label"; + this.auxSN1Label.Size = new System.Drawing.Size(193, 23); + this.auxSN1Label.TabIndex = 2; + this.auxSN1Label.Text = "Aux. WM Serial Nr."; + // + // mainSN1TextBox + // + this.mainSN1TextBox.Location = new System.Drawing.Point(300, 37); + this.mainSN1TextBox.Name = "mainSN1TextBox"; + this.mainSN1TextBox.Size = new System.Drawing.Size(163, 31); + this.mainSN1TextBox.TabIndex = 1; + // + // mainSN1Label + // + this.mainSN1Label.AutoSize = true; + this.mainSN1Label.Location = new System.Drawing.Point(21, 40); + this.mainSN1Label.Name = "mainSN1Label"; + this.mainSN1Label.Size = new System.Drawing.Size(195, 23); + this.mainSN1Label.TabIndex = 0; + this.mainSN1Label.Text = "Main WM Serial Nr."; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.auxSN2TextBox); + this.groupBox2.Controls.Add(this.auxSN2Label); + this.groupBox2.Controls.Add(this.mainSN2TextBox); + this.groupBox2.Controls.Add(this.mainSN2Label); + this.groupBox2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox2.ForeColor = System.Drawing.Color.Black; + this.groupBox2.Location = new System.Drawing.Point(28, 175); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(494, 137); + this.groupBox2.TabIndex = 2; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Water Meter 2"; + // + // auxSN2TextBox + // + this.auxSN2TextBox.Location = new System.Drawing.Point(300, 83); + this.auxSN2TextBox.Name = "auxSN2TextBox"; + this.auxSN2TextBox.Size = new System.Drawing.Size(163, 31); + this.auxSN2TextBox.TabIndex = 3; + // + // auxSN2Label + // + this.auxSN2Label.AutoSize = true; + this.auxSN2Label.Location = new System.Drawing.Point(21, 86); + this.auxSN2Label.Name = "auxSN2Label"; + this.auxSN2Label.Size = new System.Drawing.Size(193, 23); + this.auxSN2Label.TabIndex = 2; + this.auxSN2Label.Text = "Aux. WM Serial Nr."; + // + // mainSN2TextBox + // + this.mainSN2TextBox.Location = new System.Drawing.Point(300, 37); + this.mainSN2TextBox.Name = "mainSN2TextBox"; + this.mainSN2TextBox.Size = new System.Drawing.Size(163, 31); + this.mainSN2TextBox.TabIndex = 1; + // + // mainSN2Label + // + this.mainSN2Label.AutoSize = true; + this.mainSN2Label.Location = new System.Drawing.Point(21, 40); + this.mainSN2Label.Name = "mainSN2Label"; + this.mainSN2Label.Size = new System.Drawing.Size(195, 23); + this.mainSN2Label.TabIndex = 0; + this.mainSN2Label.Text = "Main WM Serial Nr."; + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.auxSN3TextBox); + this.groupBox3.Controls.Add(this.auxSN3Label); + this.groupBox3.Controls.Add(this.mainSN3TextBox); + this.groupBox3.Controls.Add(this.mainSN3Label); + this.groupBox3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox3.ForeColor = System.Drawing.Color.Black; + this.groupBox3.Location = new System.Drawing.Point(28, 330); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(494, 137); + this.groupBox3.TabIndex = 3; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "Water Meter 3"; + // + // auxSN3TextBox + // + this.auxSN3TextBox.Location = new System.Drawing.Point(300, 83); + this.auxSN3TextBox.Name = "auxSN3TextBox"; + this.auxSN3TextBox.Size = new System.Drawing.Size(163, 31); + this.auxSN3TextBox.TabIndex = 3; + // + // auxSN3Label + // + this.auxSN3Label.AutoSize = true; + this.auxSN3Label.Location = new System.Drawing.Point(21, 86); + this.auxSN3Label.Name = "auxSN3Label"; + this.auxSN3Label.Size = new System.Drawing.Size(193, 23); + this.auxSN3Label.TabIndex = 2; + this.auxSN3Label.Text = "Aux. WM Serial Nr."; + // + // mainSN3TextBox + // + this.mainSN3TextBox.Location = new System.Drawing.Point(300, 37); + this.mainSN3TextBox.Name = "mainSN3TextBox"; + this.mainSN3TextBox.Size = new System.Drawing.Size(163, 31); + this.mainSN3TextBox.TabIndex = 1; + // + // mainSN3Label + // + this.mainSN3Label.AutoSize = true; + this.mainSN3Label.Location = new System.Drawing.Point(21, 40); + this.mainSN3Label.Name = "mainSN3Label"; + this.mainSN3Label.Size = new System.Drawing.Size(195, 23); + this.mainSN3Label.TabIndex = 0; + this.mainSN3Label.Text = "Main WM Serial Nr."; + // + // CycleBeginningForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.AutoSize = true; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.ClientSize = new System.Drawing.Size(687, 492); + this.Controls.Add(this.groupBox3); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.okButton); + this.ForeColor = System.Drawing.Color.Black; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "CycleBeginningForm"; + this.Text = "Daten"; + this.TopMost = true; + this.Load += new System.EventHandler(this.CycleBeginningForm_Load); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Label mainSN1Label; + private System.Windows.Forms.TextBox mainSN1TextBox; + private System.Windows.Forms.TextBox auxSN1TextBox; + private System.Windows.Forms.Label auxSN1Label; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TextBox auxSN2TextBox; + private System.Windows.Forms.Label auxSN2Label; + private System.Windows.Forms.TextBox mainSN2TextBox; + private System.Windows.Forms.Label mainSN2Label; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.TextBox auxSN3TextBox; + private System.Windows.Forms.Label auxSN3Label; + private System.Windows.Forms.TextBox mainSN3TextBox; + private System.Windows.Forms.Label mainSN3Label; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/CycleBeginningForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/CycleBeginningForm.cs new file mode 100644 index 00000000..1fa2dfb8 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/CycleBeginningForm.cs @@ -0,0 +1,111 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using log4net; +using TBF.Resources; + +#pragma warning disable 162 /// Disables 'Unreachable code detected' warning + +namespace TBF.BenchControl.DataEntry.Munich +{ + public partial class CycleBeginningForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(CycleBeginningForm)); + + // To be retrieved after the form closes + public string[] MainSNText; + public string[] AuxSNText; + + // Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + public CycleBeginningForm() + { + InitializeComponent(); + ControlBox = false; + + MainSNText = new string[Config.Data.CompoundWMsCount]; + AuxSNText = new string[Config.Data.CompoundWMsCount]; + completed = false; + + StartForceCloseHandler(); + } + + private void CycleBeginningForm_Load(object sender, EventArgs e) + { + Localize(); + + if (Config.Data.CompoundWMsCount < 2) + { + groupBox2.Visible = groupBox3.Visible = false; + Height = 200; + } + else if (Config.Data.CompoundWMsCount < 3) + { + groupBox3.Visible = false; + Height = 355; + } + } + + void Localize() + { + Text = Strings.Data; + okButton.Text = Strings.OkBtnText; + + groupBox1.Text = string.Format("{0} {1}", Strings.Water_Meter, 1); + mainSN1Label.Text = Strings.Main_WM_SerialNr; + auxSN1Label.Text = Strings.Aux_WM_SerialNr; + + groupBox2.Text = string.Format("{0} {1}", Strings.Water_Meter, 2); + mainSN2Label.Text = Strings.Main_WM_SerialNr; + auxSN2Label.Text = Strings.Aux_WM_SerialNr; + + groupBox3.Text = string.Format("{0} {1}", Strings.Water_Meter, 3); + mainSN3Label.Text = Strings.Main_WM_SerialNr; + auxSN3Label.Text = Strings.Aux_WM_SerialNr; + } + + private void okButton_Click(object sender, EventArgs e) + { + MainSNText[0] = mainSN1TextBox.Text; + AuxSNText[0] = auxSN1TextBox.Text; + + if (Config.Data.CompoundWMsCount >= 2) + { + MainSNText[1] = mainSN2TextBox.Text; + AuxSNText[1] = auxSN2TextBox.Text; + } + + if (Config.Data.CompoundWMsCount >= 3) + { + MainSNText[2] = mainSN3TextBox.Text; + AuxSNText[2] = auxSN3TextBox.Text; + } + + completed = true; + 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) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/CycleBeginningForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/CycleBeginningForm.resx new file mode 100644 index 00000000..04ebfb99 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/CycleBeginningForm.resx @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/CycleEndForm.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/CycleEndForm.Designer.cs new file mode 100644 index 00000000..71e0779e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/CycleEndForm.Designer.cs @@ -0,0 +1,526 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.Munich +{ + partial class CycleEndForm + { + /// + /// 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() + { + this.mainState1TextBox = new System.Windows.Forms.TextBox(); + this.mainState1Label = new System.Windows.Forms.Label(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.yearOfProduction1Label = new System.Windows.Forms.Label(); + this.yearOfProduction1TextBox = new System.Windows.Forms.TextBox(); + this.qFall1Label = new System.Windows.Forms.Label(); + this.qFall1TextBox = new System.Windows.Forms.TextBox(); + this.qRise1Label = new System.Windows.Forms.Label(); + this.qRise1TextBox = new System.Windows.Forms.TextBox(); + this.auxState1TextBox = new System.Windows.Forms.TextBox(); + this.auxState1Label = new System.Windows.Forms.Label(); + this.okButton = new System.Windows.Forms.Button(); + this.protocolGroupBox = new System.Windows.Forms.GroupBox(); + this.radioButton4 = new System.Windows.Forms.RadioButton(); + this.radioButton3 = new System.Windows.Forms.RadioButton(); + this.radioButton2 = new System.Windows.Forms.RadioButton(); + this.radioButton1 = new System.Windows.Forms.RadioButton(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.yearOfProduction2Label = new System.Windows.Forms.Label(); + this.yearOfProduction2TextBox = new System.Windows.Forms.TextBox(); + this.qFall2Label = new System.Windows.Forms.Label(); + this.qFall2TextBox = new System.Windows.Forms.TextBox(); + this.qRise2Label = new System.Windows.Forms.Label(); + this.qRise2TextBox = new System.Windows.Forms.TextBox(); + this.mainState2TextBox = new System.Windows.Forms.TextBox(); + this.mainState2Label = new System.Windows.Forms.Label(); + this.auxState2TextBox = new System.Windows.Forms.TextBox(); + this.auxState2Label = new System.Windows.Forms.Label(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.yearOfProduction3Label = new System.Windows.Forms.Label(); + this.yearOfProduction3TextBox = new System.Windows.Forms.TextBox(); + this.qFall3Label = new System.Windows.Forms.Label(); + this.qFall3TextBox = new System.Windows.Forms.TextBox(); + this.qRise3Label = new System.Windows.Forms.Label(); + this.qRise3TextBox = new System.Windows.Forms.TextBox(); + this.mainState3TextBox = new System.Windows.Forms.TextBox(); + this.mainState3Label = new System.Windows.Forms.Label(); + this.auxState3TextBox = new System.Windows.Forms.TextBox(); + this.auxState3Label = new System.Windows.Forms.Label(); + this.groupBox1.SuspendLayout(); + this.protocolGroupBox.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.SuspendLayout(); + // + // mainState1TextBox + // + this.mainState1TextBox.Location = new System.Drawing.Point(211, 34); + this.mainState1TextBox.Name = "mainState1TextBox"; + this.mainState1TextBox.Size = new System.Drawing.Size(135, 31); + this.mainState1TextBox.TabIndex = 1; + // + // mainState1Label + // + this.mainState1Label.AutoSize = true; + this.mainState1Label.Location = new System.Drawing.Point(18, 37); + this.mainState1Label.Name = "mainState1Label"; + this.mainState1Label.Size = new System.Drawing.Size(153, 23); + this.mainState1Label.TabIndex = 0; + this.mainState1Label.Text = "Main WM State"; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.yearOfProduction1Label); + this.groupBox1.Controls.Add(this.yearOfProduction1TextBox); + this.groupBox1.Controls.Add(this.qFall1Label); + this.groupBox1.Controls.Add(this.qFall1TextBox); + this.groupBox1.Controls.Add(this.qRise1Label); + this.groupBox1.Controls.Add(this.qRise1TextBox); + this.groupBox1.Controls.Add(this.mainState1TextBox); + this.groupBox1.Controls.Add(this.mainState1Label); + this.groupBox1.Controls.Add(this.auxState1TextBox); + this.groupBox1.Controls.Add(this.auxState1Label); + this.groupBox1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox1.ForeColor = System.Drawing.Color.Black; + this.groupBox1.Location = new System.Drawing.Point(25, 23); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(375, 237); + this.groupBox1.TabIndex = 1; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Water Meter 1"; + // + // yearOfProduction1Label + // + this.yearOfProduction1Label.AutoSize = true; + this.yearOfProduction1Label.Location = new System.Drawing.Point(18, 197); + this.yearOfProduction1Label.Name = "yearOfProduction1Label"; + this.yearOfProduction1Label.Size = new System.Drawing.Size(188, 23); + this.yearOfProduction1Label.TabIndex = 8; + this.yearOfProduction1Label.Text = "Year of production"; + // + // yearOfProduction1TextBox + // + this.yearOfProduction1TextBox.Location = new System.Drawing.Point(211, 190); + this.yearOfProduction1TextBox.Name = "yearOfProduction1TextBox"; + this.yearOfProduction1TextBox.Size = new System.Drawing.Size(135, 31); + this.yearOfProduction1TextBox.TabIndex = 9; + // + // qFall1Label + // + this.qFall1Label.AutoSize = true; + this.qFall1Label.Location = new System.Drawing.Point(18, 158); + this.qFall1Label.Name = "qFall1Label"; + this.qFall1Label.Size = new System.Drawing.Size(55, 23); + this.qFall1Label.TabIndex = 6; + this.qFall1Label.Text = "Qfall"; + // + // qFall1TextBox + // + this.qFall1TextBox.Location = new System.Drawing.Point(211, 151); + this.qFall1TextBox.Name = "qFall1TextBox"; + this.qFall1TextBox.Size = new System.Drawing.Size(135, 31); + this.qFall1TextBox.TabIndex = 7; + // + // qRise1Label + // + this.qRise1Label.AutoSize = true; + this.qRise1Label.Location = new System.Drawing.Point(18, 115); + this.qRise1Label.Name = "qRise1Label"; + this.qRise1Label.Size = new System.Drawing.Size(60, 23); + this.qRise1Label.TabIndex = 4; + this.qRise1Label.Text = "Qrise"; + // + // qRise1TextBox + // + this.qRise1TextBox.Location = new System.Drawing.Point(211, 112); + this.qRise1TextBox.Name = "qRise1TextBox"; + this.qRise1TextBox.Size = new System.Drawing.Size(135, 31); + this.qRise1TextBox.TabIndex = 5; + // + // auxState1TextBox + // + this.auxState1TextBox.Location = new System.Drawing.Point(211, 73); + this.auxState1TextBox.Name = "auxState1TextBox"; + this.auxState1TextBox.Size = new System.Drawing.Size(135, 31); + this.auxState1TextBox.TabIndex = 3; + // + // auxState1Label + // + this.auxState1Label.AutoSize = true; + this.auxState1Label.Location = new System.Drawing.Point(18, 76); + this.auxState1Label.Name = "auxState1Label"; + this.auxState1Label.Size = new System.Drawing.Size(151, 23); + this.auxState1Label.TabIndex = 2; + this.auxState1Label.Text = "Aux. WM State"; + // + // okButton + // + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(699, 23); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(98, 55); + this.okButton.TabIndex = 0; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // protocolGroupBox + // + this.protocolGroupBox.Controls.Add(this.radioButton4); + this.protocolGroupBox.Controls.Add(this.radioButton3); + this.protocolGroupBox.Controls.Add(this.radioButton2); + this.protocolGroupBox.Controls.Add(this.radioButton1); + this.protocolGroupBox.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.protocolGroupBox.Location = new System.Drawing.Point(422, 87); + this.protocolGroupBox.Name = "protocolGroupBox"; + this.protocolGroupBox.Size = new System.Drawing.Size(375, 173); + this.protocolGroupBox.TabIndex = 4; + this.protocolGroupBox.TabStop = false; + this.protocolGroupBox.Text = "Protocol"; + // + // radioButton4 + // + this.radioButton4.AutoSize = true; + this.radioButton4.Location = new System.Drawing.Point(34, 133); + this.radioButton4.Name = "radioButton4"; + this.radioButton4.Size = new System.Drawing.Size(152, 27); + this.radioButton4.TabIndex = 3; + this.radioButton4.Text = "radioButton4"; + this.radioButton4.UseVisualStyleBackColor = true; + this.radioButton4.CheckedChanged += new System.EventHandler(this.radioButton4_CheckedChanged); + // + // radioButton3 + // + this.radioButton3.AutoSize = true; + this.radioButton3.Location = new System.Drawing.Point(34, 100); + this.radioButton3.Name = "radioButton3"; + this.radioButton3.Size = new System.Drawing.Size(152, 27); + this.radioButton3.TabIndex = 2; + this.radioButton3.Text = "radioButton3"; + this.radioButton3.UseVisualStyleBackColor = true; + this.radioButton3.CheckedChanged += new System.EventHandler(this.radioButton3_CheckedChanged); + // + // radioButton2 + // + this.radioButton2.AutoSize = true; + this.radioButton2.Location = new System.Drawing.Point(34, 67); + this.radioButton2.Name = "radioButton2"; + this.radioButton2.Size = new System.Drawing.Size(152, 27); + this.radioButton2.TabIndex = 1; + this.radioButton2.Text = "radioButton2"; + this.radioButton2.UseVisualStyleBackColor = true; + this.radioButton2.CheckedChanged += new System.EventHandler(this.radioButton2_CheckedChanged); + // + // radioButton1 + // + this.radioButton1.AutoSize = true; + this.radioButton1.Checked = true; + this.radioButton1.Location = new System.Drawing.Point(34, 34); + this.radioButton1.Name = "radioButton1"; + this.radioButton1.Size = new System.Drawing.Size(152, 27); + this.radioButton1.TabIndex = 0; + this.radioButton1.TabStop = true; + this.radioButton1.Text = "radioButton1"; + this.radioButton1.UseVisualStyleBackColor = true; + this.radioButton1.CheckedChanged += new System.EventHandler(this.radioButton1_CheckedChanged); + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.yearOfProduction2Label); + this.groupBox2.Controls.Add(this.yearOfProduction2TextBox); + this.groupBox2.Controls.Add(this.qFall2Label); + this.groupBox2.Controls.Add(this.qFall2TextBox); + this.groupBox2.Controls.Add(this.qRise2Label); + this.groupBox2.Controls.Add(this.qRise2TextBox); + this.groupBox2.Controls.Add(this.mainState2TextBox); + this.groupBox2.Controls.Add(this.mainState2Label); + this.groupBox2.Controls.Add(this.auxState2TextBox); + this.groupBox2.Controls.Add(this.auxState2Label); + this.groupBox2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox2.ForeColor = System.Drawing.Color.Black; + this.groupBox2.Location = new System.Drawing.Point(25, 282); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(375, 237); + this.groupBox2.TabIndex = 2; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Water Meter 2"; + // + // yearOfProduction2Label + // + this.yearOfProduction2Label.AutoSize = true; + this.yearOfProduction2Label.Location = new System.Drawing.Point(18, 197); + this.yearOfProduction2Label.Name = "yearOfProduction2Label"; + this.yearOfProduction2Label.Size = new System.Drawing.Size(188, 23); + this.yearOfProduction2Label.TabIndex = 8; + this.yearOfProduction2Label.Text = "Year of production"; + // + // yearOfProduction2TextBox + // + this.yearOfProduction2TextBox.Location = new System.Drawing.Point(211, 190); + this.yearOfProduction2TextBox.Name = "yearOfProduction2TextBox"; + this.yearOfProduction2TextBox.Size = new System.Drawing.Size(135, 31); + this.yearOfProduction2TextBox.TabIndex = 9; + // + // qFall2Label + // + this.qFall2Label.AutoSize = true; + this.qFall2Label.Location = new System.Drawing.Point(18, 158); + this.qFall2Label.Name = "qFall2Label"; + this.qFall2Label.Size = new System.Drawing.Size(55, 23); + this.qFall2Label.TabIndex = 6; + this.qFall2Label.Text = "Qfall"; + // + // qFall2TextBox + // + this.qFall2TextBox.Location = new System.Drawing.Point(211, 151); + this.qFall2TextBox.Name = "qFall2TextBox"; + this.qFall2TextBox.Size = new System.Drawing.Size(135, 31); + this.qFall2TextBox.TabIndex = 7; + // + // qRise2Label + // + this.qRise2Label.AutoSize = true; + this.qRise2Label.Location = new System.Drawing.Point(18, 115); + this.qRise2Label.Name = "qRise2Label"; + this.qRise2Label.Size = new System.Drawing.Size(60, 23); + this.qRise2Label.TabIndex = 4; + this.qRise2Label.Text = "Qrise"; + // + // qRise2TextBox + // + this.qRise2TextBox.Location = new System.Drawing.Point(211, 112); + this.qRise2TextBox.Name = "qRise2TextBox"; + this.qRise2TextBox.Size = new System.Drawing.Size(135, 31); + this.qRise2TextBox.TabIndex = 5; + // + // mainState2TextBox + // + this.mainState2TextBox.Location = new System.Drawing.Point(211, 34); + this.mainState2TextBox.Name = "mainState2TextBox"; + this.mainState2TextBox.Size = new System.Drawing.Size(135, 31); + this.mainState2TextBox.TabIndex = 1; + // + // mainState2Label + // + this.mainState2Label.AutoSize = true; + this.mainState2Label.Location = new System.Drawing.Point(17, 37); + this.mainState2Label.Name = "mainState2Label"; + this.mainState2Label.Size = new System.Drawing.Size(153, 23); + this.mainState2Label.TabIndex = 0; + this.mainState2Label.Text = "Main WM State"; + // + // auxState2TextBox + // + this.auxState2TextBox.Location = new System.Drawing.Point(211, 73); + this.auxState2TextBox.Name = "auxState2TextBox"; + this.auxState2TextBox.Size = new System.Drawing.Size(135, 31); + this.auxState2TextBox.TabIndex = 3; + // + // auxState2Label + // + this.auxState2Label.AutoSize = true; + this.auxState2Label.Location = new System.Drawing.Point(18, 76); + this.auxState2Label.Name = "auxState2Label"; + this.auxState2Label.Size = new System.Drawing.Size(151, 23); + this.auxState2Label.TabIndex = 2; + this.auxState2Label.Text = "Aux. WM State"; + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.yearOfProduction3Label); + this.groupBox3.Controls.Add(this.yearOfProduction3TextBox); + this.groupBox3.Controls.Add(this.qFall3Label); + this.groupBox3.Controls.Add(this.qFall3TextBox); + this.groupBox3.Controls.Add(this.qRise3Label); + this.groupBox3.Controls.Add(this.qRise3TextBox); + this.groupBox3.Controls.Add(this.mainState3TextBox); + this.groupBox3.Controls.Add(this.mainState3Label); + this.groupBox3.Controls.Add(this.auxState3TextBox); + this.groupBox3.Controls.Add(this.auxState3Label); + this.groupBox3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox3.ForeColor = System.Drawing.Color.Black; + this.groupBox3.Location = new System.Drawing.Point(422, 282); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(375, 237); + this.groupBox3.TabIndex = 3; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "Water Meter 3"; + // + // yearOfProduction3Label + // + this.yearOfProduction3Label.AutoSize = true; + this.yearOfProduction3Label.Location = new System.Drawing.Point(18, 197); + this.yearOfProduction3Label.Name = "yearOfProduction3Label"; + this.yearOfProduction3Label.Size = new System.Drawing.Size(188, 23); + this.yearOfProduction3Label.TabIndex = 8; + this.yearOfProduction3Label.Text = "Year of production"; + // + // yearOfProduction3TextBox + // + this.yearOfProduction3TextBox.Location = new System.Drawing.Point(211, 190); + this.yearOfProduction3TextBox.Name = "yearOfProduction3TextBox"; + this.yearOfProduction3TextBox.Size = new System.Drawing.Size(135, 31); + this.yearOfProduction3TextBox.TabIndex = 9; + // + // qFall3Label + // + this.qFall3Label.AutoSize = true; + this.qFall3Label.Location = new System.Drawing.Point(18, 158); + this.qFall3Label.Name = "qFall3Label"; + this.qFall3Label.Size = new System.Drawing.Size(55, 23); + this.qFall3Label.TabIndex = 6; + this.qFall3Label.Text = "Qfall"; + // + // qFall3TextBox + // + this.qFall3TextBox.Location = new System.Drawing.Point(211, 151); + this.qFall3TextBox.Name = "qFall3TextBox"; + this.qFall3TextBox.Size = new System.Drawing.Size(135, 31); + this.qFall3TextBox.TabIndex = 7; + // + // qRise3Label + // + this.qRise3Label.AutoSize = true; + this.qRise3Label.Location = new System.Drawing.Point(18, 115); + this.qRise3Label.Name = "qRise3Label"; + this.qRise3Label.Size = new System.Drawing.Size(60, 23); + this.qRise3Label.TabIndex = 4; + this.qRise3Label.Text = "Qrise"; + // + // qRise3TextBox + // + this.qRise3TextBox.Location = new System.Drawing.Point(211, 112); + this.qRise3TextBox.Name = "qRise3TextBox"; + this.qRise3TextBox.Size = new System.Drawing.Size(135, 31); + this.qRise3TextBox.TabIndex = 5; + // + // mainState3TextBox + // + this.mainState3TextBox.Location = new System.Drawing.Point(211, 34); + this.mainState3TextBox.Name = "mainState3TextBox"; + this.mainState3TextBox.Size = new System.Drawing.Size(135, 31); + this.mainState3TextBox.TabIndex = 1; + // + // mainState3Label + // + this.mainState3Label.AutoSize = true; + this.mainState3Label.Location = new System.Drawing.Point(18, 37); + this.mainState3Label.Name = "mainState3Label"; + this.mainState3Label.Size = new System.Drawing.Size(153, 23); + this.mainState3Label.TabIndex = 0; + this.mainState3Label.Text = "Main WM State"; + // + // auxState3TextBox + // + this.auxState3TextBox.Location = new System.Drawing.Point(211, 73); + this.auxState3TextBox.Name = "auxState3TextBox"; + this.auxState3TextBox.Size = new System.Drawing.Size(135, 31); + this.auxState3TextBox.TabIndex = 3; + // + // auxState3Label + // + this.auxState3Label.AutoSize = true; + this.auxState3Label.Location = new System.Drawing.Point(18, 76); + this.auxState3Label.Name = "auxState3Label"; + this.auxState3Label.Size = new System.Drawing.Size(151, 23); + this.auxState3Label.TabIndex = 2; + this.auxState3Label.Text = "Aux. WM State"; + // + // CycleEndForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.ClientSize = new System.Drawing.Size(822, 542); + this.Controls.Add(this.groupBox3); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.protocolGroupBox); + this.Controls.Add(this.okButton); + this.Controls.Add(this.groupBox1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "CycleEndForm"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "Daten"; + this.TopMost = true; + this.Load += new System.EventHandler(this.CycleEndForm_Load); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.protocolGroupBox.ResumeLayout(false); + this.protocolGroupBox.PerformLayout(); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TextBox mainState1TextBox; + private System.Windows.Forms.Label mainState1Label; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TextBox auxState1TextBox; + private System.Windows.Forms.Label auxState1Label; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.GroupBox protocolGroupBox; + private System.Windows.Forms.RadioButton radioButton3; + private System.Windows.Forms.RadioButton radioButton2; + private System.Windows.Forms.RadioButton radioButton1; + private System.Windows.Forms.Label qFall1Label; + private System.Windows.Forms.TextBox qFall1TextBox; + private System.Windows.Forms.Label qRise1Label; + private System.Windows.Forms.TextBox qRise1TextBox; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.Label qFall2Label; + private System.Windows.Forms.TextBox qFall2TextBox; + private System.Windows.Forms.Label qRise2Label; + private System.Windows.Forms.TextBox qRise2TextBox; + private System.Windows.Forms.TextBox mainState2TextBox; + private System.Windows.Forms.Label mainState2Label; + private System.Windows.Forms.TextBox auxState2TextBox; + private System.Windows.Forms.Label auxState2Label; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.Label qFall3Label; + private System.Windows.Forms.TextBox qFall3TextBox; + private System.Windows.Forms.Label qRise3Label; + private System.Windows.Forms.TextBox qRise3TextBox; + private System.Windows.Forms.TextBox mainState3TextBox; + private System.Windows.Forms.Label mainState3Label; + private System.Windows.Forms.TextBox auxState3TextBox; + private System.Windows.Forms.Label auxState3Label; + private System.Windows.Forms.RadioButton radioButton4; + private System.Windows.Forms.Label yearOfProduction1Label; + private System.Windows.Forms.TextBox yearOfProduction1TextBox; + private System.Windows.Forms.Label yearOfProduction2Label; + private System.Windows.Forms.TextBox yearOfProduction2TextBox; + private System.Windows.Forms.Label yearOfProduction3Label; + private System.Windows.Forms.TextBox yearOfProduction3TextBox; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/CycleEndForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/CycleEndForm.cs new file mode 100644 index 00000000..4c1f2779 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/CycleEndForm.cs @@ -0,0 +1,206 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using log4net; +using TBF.Resources; + +#pragma warning disable 162 /// Disables 'Unreachable code detected' warning + +namespace TBF.BenchControl.DataEntry.Munich +{ + public partial class CycleEndForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(CycleEndForm)); + + // To be set before the form opens + public string ProtocolName1; + public string ProtocolName2; + public string ProtocolName3; + public string ProtocolName4; + + // To be retrieved after the form closes + public string ProtocolTitle; + public string[] MainStateText; + public string[] AuxStateText; + public float[] QRise; + public float[] QFall; + public int[] YearOfProduction; + + // Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + public CycleEndForm() + { + InitializeComponent(); + ControlBox = false; + + MainStateText = new string[Config.Data.CompoundWMsCount]; + AuxStateText = new string[Config.Data.CompoundWMsCount]; + QRise = new float[Config.Data.CompoundWMsCount]; + QFall = new float[Config.Data.CompoundWMsCount]; + YearOfProduction = new int[Config.Data.CompoundWMsCount]; + completed = false; + StartForceCloseHandler(); + + Localize(); + } + + void Localize() + { + Text = Strings.Data; + protocolGroupBox.Text = Strings.Protocol; + groupBox1.Text = Strings.Water_Meter + " 1"; + mainState1Label.Text = Strings.Main_Water_Meter_State; + auxState1Label.Text = Strings.Aux_Water_Meter_State; + qRise1Label.Text = Strings.Qrise; + qFall1Label.Text = Strings.Qfall; + yearOfProduction1Label.Text = Strings.Year_of_production; + + groupBox2.Text = Strings.Water_Meter + " 2"; + mainState2Label.Text = Strings.Main_Water_Meter_State; + auxState2Label.Text = Strings.Aux_Water_Meter_State; + qRise2Label.Text = Strings.Qrise; + qFall2Label.Text = Strings.Qfall; + yearOfProduction2Label.Text = Strings.Year_of_production; + + groupBox3.Text = Strings.Water_Meter + " 3"; + mainState3Label.Text = Strings.Main_Water_Meter_State; + auxState3Label.Text = Strings.Aux_Water_Meter_State; + qRise3Label.Text = Strings.Qrise; + qFall3Label.Text = Strings.Qfall; + yearOfProduction3Label.Text = Strings.Year_of_production; + + AnyRadioButtonChanged(); + } + + private void CycleEndForm_Load(object sender, EventArgs e) + { + radioButton1.Text = ProtocolName1; + radioButton2.Text = ProtocolName2; + radioButton3.Text = ProtocolName3; + radioButton4.Text = ProtocolName4; + + if (Sequences.ProcessData.BatchRslts.WaterMeters.Length >= 1) + { + qRise1TextBox.Text = Utils.DoubleToStr(Sequences.ProcessData.BatchRslts.WaterMeters[0].QRise, 3); + qFall1TextBox.Text = Utils.DoubleToStr(Sequences.ProcessData.BatchRslts.WaterMeters[0].QFall, 3); + YearOfProduction[0] = Sequences.ProcessData.BatchRslts.WaterMeters[0].YearOfProduction; + yearOfProduction1TextBox.Text = YearOfProduction[0].ToString(); + } + + if (Sequences.ProcessData.BatchRslts.WaterMeters.Length >= 2) + { + qRise2TextBox.Text = Utils.DoubleToStr(Sequences.ProcessData.BatchRslts.WaterMeters[1].QRise, 3); + qFall2TextBox.Text = Utils.DoubleToStr(Sequences.ProcessData.BatchRslts.WaterMeters[1].QFall, 3); + YearOfProduction[1] = Sequences.ProcessData.BatchRslts.WaterMeters[1].YearOfProduction; + yearOfProduction2TextBox.Text = YearOfProduction[1].ToString(); + } + else + { + groupBox2.Visible = false; + Height = 305; + } + + if (Sequences.ProcessData.BatchRslts.WaterMeters.Length >= 3) + { + qRise3TextBox.Text = Utils.DoubleToStr(Sequences.ProcessData.BatchRslts.WaterMeters[2].QRise, 3); + qFall3TextBox.Text = Utils.DoubleToStr(Sequences.ProcessData.BatchRslts.WaterMeters[2].QFall, 3); + YearOfProduction[2] = Sequences.ProcessData.BatchRslts.WaterMeters[2].YearOfProduction; + yearOfProduction3TextBox.Text = YearOfProduction[2].ToString(); + } + else + { + groupBox3.Visible = false; + } + } + + private void okButton_Click(object sender, EventArgs e) + { + float ftmp; + int year; + bool allOK = true; + + MainStateText[0] = mainState1TextBox.Text; + AuxStateText[0] = auxState1TextBox.Text; + if (Utils.TryParseUFloat(qRise1TextBox.Text, out ftmp)) { QRise[0] = ftmp; } else { allOK = false; } + if (Utils.TryParseUFloat(qFall1TextBox.Text, out ftmp)) { QFall[0] = ftmp; } else { allOK = false; } + if (ShowYear() && int.TryParse(yearOfProduction1TextBox.Text, out year)) + { + YearOfProduction[0] = year; + } + + if (Config.Data.CompoundWMsCount >= 2) + { + MainStateText[1] = mainState2TextBox.Text; + AuxStateText[1] = auxState2TextBox.Text; + if (Utils.TryParseUFloat(qRise2TextBox.Text, out ftmp)) { QRise[1] = ftmp; } else { allOK = false; } + if (Utils.TryParseUFloat(qFall2TextBox.Text, out ftmp)) { QFall[1] = ftmp; } else { allOK = false; } + if (ShowYear() && int.TryParse(yearOfProduction2TextBox.Text, out year)) + { + YearOfProduction[1] = year; + } + } + + if (Config.Data.CompoundWMsCount >= 3) + { + MainStateText[2] = mainState3TextBox.Text; + AuxStateText[2] = auxState3TextBox.Text; + if (Utils.TryParseUFloat(qRise3TextBox.Text, out ftmp)) { QRise[2] = ftmp; } else { allOK = false; } + if (Utils.TryParseUFloat(qFall3TextBox.Text, out ftmp)) { QFall[2] = ftmp; } else { allOK = false; } + if (ShowYear() && int.TryParse(yearOfProduction3TextBox.Text, out year)) + { + YearOfProduction[2] = year; + } + } + + if (radioButton1.Checked) ProtocolTitle = ProtocolName1; + else if (radioButton2.Checked) ProtocolTitle = ProtocolName2; + else if (radioButton3.Checked) ProtocolTitle = ProtocolName3; + else if (radioButton4.Checked) ProtocolTitle = ProtocolName4; + + if (allOK) + { + completed = true; + 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) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + + private void radioButton1_CheckedChanged(object sender, EventArgs e) { AnyRadioButtonChanged(); } + private void radioButton2_CheckedChanged(object sender, EventArgs e) { AnyRadioButtonChanged(); } + private void radioButton3_CheckedChanged(object sender, EventArgs e) { AnyRadioButtonChanged(); } + private void radioButton4_CheckedChanged(object sender, EventArgs e) { AnyRadioButtonChanged(); } + + bool ShowYear() + { + return radioButton2.Checked || radioButton3.Checked || radioButton4.Checked; + } + + void AnyRadioButtonChanged() + { + yearOfProduction1TextBox.Visible = yearOfProduction2TextBox.Visible = yearOfProduction3TextBox.Visible = + yearOfProduction1Label.Visible = yearOfProduction2Label.Visible = yearOfProduction3Label.Visible = ShowYear(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/CycleEndForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/CycleEndForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/CycleEndForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/EntryForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/EntryForm.cs new file mode 100644 index 00000000..2f8ca735 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/EntryForm.cs @@ -0,0 +1,211 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; +using TBF.BenchControl; +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl.DataEntry.Munich +{ + public class EntryForm : ComponentBase, IOperation, IDataEntry, IHasCycleBeginForm, IHasCycleEndForm + { + private static readonly ILog log = LogManager.GetLogger(typeof(EntryForm)); + public override string ToString() { return string.Format("DataEntry.Munich({0})", Cfg.ToString(1)); } + + public bool UsesCameras() { return false; } + + readonly EntryFormCfg entryFormCfg; + + /// + /// Properties set by the Begin and the End form + /// + public string PurchaseOrder { get { return string.Empty; } } /// Not supported in Munich + + string[] serialNr; + public string SerialNr(int wmNr) { return (wmNr >= 0 && wmNr < serialNr.Length) ? serialNr[wmNr] : string.Empty; } + + public bool Disabled(int wmNr) { return false; } /// Not supported in Munich + + string[] wmEndState; + public string WMCycleEndState(int wmNr) { return (wmNr >= 0 && wmNr < wmEndState.Length) ? wmEndState[wmNr] : string.Empty; } + + public float WMState(int wmNr) + { + float retVal; + if (wmNr >= 0 && wmNr < wmEndState.Length && Utils.TryParseUFloat(wmEndState[wmNr], out retVal)) return retVal; + return 0; + } + + + System.Windows.Forms.Form modelessDlg; + + bool resultSaved; /// Set in Run() when results are saved + + Results.Entities.WaterMeter[] wMeters; /// Reference to ...ProcessData.BatchRslts.WaterMeters[] + + public enum CurrentOp + { + None, + ShowFormAtCycleBeginning, + ShowFormAtCycleEnd, + } + + CurrentOp currentOp; + + + public EntryForm() + { + } + + public EntryForm(Generic.IComponentCfg cfg) + : base(cfg) + { + entryFormCfg = cfg as EntryFormCfg; + + serialNr = new string[Config.Data.CompoundWMsCount]; + wmEndState = new string[Config.Data.CompoundWMsCount]; + + currentOp = CurrentOp.None; + log.Debug(this.ToString()); + } + + /// Reference to the operation + public IOperation ShowCycleBeginFormOp() + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.ShowFormAtCycleBeginning; + this.wMeters = TBF.BenchControl.Sequences.ProcessData.BatchRslts.WaterMeters; + return this; + } + + /// Reference to the operation + public IOperation ShowCycleEndFormOp() + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.ShowFormAtCycleEnd; + this.wMeters = TBF.BenchControl.Sequences.ProcessData.BatchRslts.WaterMeters; + return this; + } + + /// Reference to the operation + public IOperation ShowWMSNsAndStatesFormOp() + { + return null; + } + + delegate void EntryFormDlgt(EntryForm myRef); + /// + void OpenBeginningDlg(EntryForm myRef) + { + myRef.modelessDlg = new CycleBeginningForm(); + modelessDlg.Show(); + } + /// + void OpenEndDlg(EntryForm myRef) + { + CycleEndForm endForm = new CycleEndForm(); + endForm.ProtocolName1 = entryFormCfg.ProtocolTitle1; + endForm.ProtocolName2 = entryFormCfg.ProtocolTitle2; + endForm.ProtocolName3 = entryFormCfg.ProtocolTitle3; + endForm.ProtocolName4 = entryFormCfg.ProtocolTitle4; + myRef.modelessDlg = endForm; + modelessDlg.Show(); + } + + /// Start this operation + public void Start() + { + resultSaved = false; + switch (currentOp) + { + case CurrentOp.ShowFormAtCycleBeginning: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenBeginningDlg), this); + break; + case CurrentOp.ShowFormAtCycleEnd: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenEndDlg), this); + break; + } + } + + /// Run this operation + /// Event.ResultsPrinted + public Event Run() + { + if ((modelessDlg is IHasCompleted) && !(modelessDlg as IHasCompleted).Completed) + { + return Event.ModelessFormIsOpen; + } + + if (!resultSaved) /// This is to save the result only once + { + int count = Math.Min(3, Math.Min(wMeters.Length, Config.Data.CompoundWMsCount)); + if (modelessDlg is CycleBeginningForm) + { + if (count >= 1 && wMeters[0] != null) wMeters[0].SerialNr = (modelessDlg as CycleBeginningForm).MainSNText[0]; + if (count >= 1 && wMeters[0] != null) wMeters[0].SerialNrAux = (modelessDlg as CycleBeginningForm).AuxSNText[0]; + if (count >= 2 && wMeters[1] != null) wMeters[1].SerialNr = (modelessDlg as CycleBeginningForm).MainSNText[1]; + if (count >= 2 && wMeters[1] != null) wMeters[1].SerialNrAux = (modelessDlg as CycleBeginningForm).AuxSNText[1]; + if (count >= 3 && wMeters[2] != null) wMeters[2].SerialNr = (modelessDlg as CycleBeginningForm).MainSNText[2]; + if (count >= 3 && wMeters[2] != null) wMeters[2].SerialNrAux = (modelessDlg as CycleBeginningForm).AuxSNText[2]; + } + else if (modelessDlg is CycleEndForm) + { + Sequences.ProcessData.BatchRslts.Batch.ProtocolTitle = (modelessDlg as CycleEndForm).ProtocolTitle; + + if (count >= 1 && wMeters[0] != null) + { + wMeters[0].EndState = (modelessDlg as CycleEndForm).MainStateText[0]; + wMeters[0].EndStateAux = (modelessDlg as CycleEndForm).AuxStateText[0]; + wMeters[0].QRise = (modelessDlg as CycleEndForm).QRise[0]; + wMeters[0].QFall = (modelessDlg as CycleEndForm).QFall[0]; + wMeters[0].YearOfProduction = (modelessDlg as CycleEndForm).YearOfProduction[0]; + } + if (count >= 2 && wMeters[1] != null) + { + wMeters[1].EndState = (modelessDlg as CycleEndForm).MainStateText[1]; + wMeters[1].EndStateAux = (modelessDlg as CycleEndForm).AuxStateText[1]; + wMeters[1].QRise = (modelessDlg as CycleEndForm).QRise[1]; + wMeters[1].QFall = (modelessDlg as CycleEndForm).QFall[1]; + wMeters[1].YearOfProduction = (modelessDlg as CycleEndForm).YearOfProduction[1]; + } + if (count >= 3 && wMeters[2] != null) + { + wMeters[2].EndState = (modelessDlg as CycleEndForm).MainStateText[2]; + wMeters[2].EndStateAux = (modelessDlg as CycleEndForm).AuxStateText[2]; + wMeters[2].QRise = (modelessDlg as CycleEndForm).QRise[2]; + wMeters[2].QFall = (modelessDlg as CycleEndForm).QFall[2]; + wMeters[2].YearOfProduction = (modelessDlg as CycleEndForm).YearOfProduction[2]; + } + } + resultSaved = true; + modelessDlg = null; + } + + return Event.ModelessFormClosed; /// Form closed + } + + /// Stop this operation + public void Stop() + { + if (modelessDlg is IHasCompleted) + { + UiBridge.Bridge.OnCloseModelessForm(this, null); + modelessDlg = null; + } + currentOp = CurrentOp.None; + } + + /// + /// Updates test results with the information collected in watermeters. + /// + /// Watermetes with information entered in the forms + /// Test results to be updated with the information + public void UpdateTestResults(Results.BatchResults results) + { + /// Nothing to be done + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/EntryFormCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/EntryFormCfg.cs new file mode 100644 index 00000000..412717c7 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/EntryFormCfg.cs @@ -0,0 +1,54 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DataEntry.Munich +{ + public class EntryFormCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(EntryFormCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new EntryFormCfgCtrl(); } + + /// + /// Serialized parameters + /// + public string ProtocolTitle1; + public string ProtocolTitle2; + public string ProtocolTitle3; + public string ProtocolTitle4; + + /// Private parameterless constructor invoked by all other (public) constructors + EntryFormCfg() + { + Name = "DataEntryForm-Munich"; + ParentName = string.Empty; + ProtocolTitle1 = "Protokoll 1"; + ProtocolTitle2 = "Protokoll 2"; + ProtocolTitle3 = "Protokoll 3"; + ProtocolTitle4 = "Protokoll 4"; + } + + public EntryFormCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, P1={1}, P2={2}, P3={3}, P4={4}", + Name, + (string.IsNullOrEmpty(ProtocolTitle1) ? "-" : ProtocolTitle1), + (string.IsNullOrEmpty(ProtocolTitle2) ? "-" : ProtocolTitle2), + (string.IsNullOrEmpty(ProtocolTitle3) ? "-" : ProtocolTitle3), + (string.IsNullOrEmpty(ProtocolTitle4) ? "-" : ProtocolTitle4)); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/EntryFormCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/EntryFormCfgCtrl.cs new file mode 100644 index 00000000..4fcf58cf --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/EntryFormCfgCtrl.cs @@ -0,0 +1,81 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DataEntry.Munich +{ + public partial class EntryFormCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + EntryFormCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as EntryFormCfg; + Redraw(); + } + } + + public EntryFormCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + protocolTitle1TextBox.Text = config.ProtocolTitle1; + protocolTitle2TextBox.Text = config.ProtocolTitle2; + protocolTitle3TextBox.Text = config.ProtocolTitle3; + protocolTitle4TextBox.Text = config.ProtocolTitle4; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + protocolTitle1TextBox.Enabled = true; + protocolTitle2TextBox.Enabled = true; + protocolTitle3TextBox.Enabled = true; + protocolTitle4TextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.ProtocolTitle1 = protocolTitle1TextBox.Text; + config.ProtocolTitle2 = protocolTitle2TextBox.Text; + config.ProtocolTitle3 = protocolTitle3TextBox.Text; + config.ProtocolTitle4 = protocolTitle4TextBox.Text; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/EntryFormCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/EntryFormCfgCtrl.designer.cs new file mode 100644 index 00000000..eada7a24 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/EntryFormCfgCtrl.designer.cs @@ -0,0 +1,178 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.Munich +{ + partial class EntryFormCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.protocolTitle1TextBox = new System.Windows.Forms.TextBox(); + this.protocolTitle2TextBox = new System.Windows.Forms.TextBox(); + this.protocolTitle3TextBox = new System.Windows.Forms.TextBox(); + this.protocolTitle4TextBox = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(137, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 5; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(27, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 4; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(134, 33); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 3; + this.classNameLabel.Text = "ComonentName"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(27, 86); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(74, 13); + this.label1.TabIndex = 6; + this.label1.Text = "Protocol title 1"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(27, 112); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(74, 13); + this.label2.TabIndex = 7; + this.label2.Text = "Protocol title 2"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(27, 138); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(74, 13); + this.label3.TabIndex = 8; + this.label3.Text = "Protocol title 3"; + // + // protocolTitle1TextBox + // + this.protocolTitle1TextBox.Enabled = false; + this.protocolTitle1TextBox.Location = new System.Drawing.Point(137, 83); + this.protocolTitle1TextBox.Name = "protocolTitle1TextBox"; + this.protocolTitle1TextBox.Size = new System.Drawing.Size(130, 20); + this.protocolTitle1TextBox.TabIndex = 9; + // + // protocolTitle2TextBox + // + this.protocolTitle2TextBox.Enabled = false; + this.protocolTitle2TextBox.Location = new System.Drawing.Point(137, 109); + this.protocolTitle2TextBox.Name = "protocolTitle2TextBox"; + this.protocolTitle2TextBox.Size = new System.Drawing.Size(130, 20); + this.protocolTitle2TextBox.TabIndex = 10; + // + // protocolTitle3TextBox + // + this.protocolTitle3TextBox.Enabled = false; + this.protocolTitle3TextBox.Location = new System.Drawing.Point(137, 135); + this.protocolTitle3TextBox.Name = "protocolTitle3TextBox"; + this.protocolTitle3TextBox.Size = new System.Drawing.Size(130, 20); + this.protocolTitle3TextBox.TabIndex = 11; + // + // protocolTitle4TextBox + // + this.protocolTitle4TextBox.Enabled = false; + this.protocolTitle4TextBox.Location = new System.Drawing.Point(137, 161); + this.protocolTitle4TextBox.Name = "protocolTitle4TextBox"; + this.protocolTitle4TextBox.Size = new System.Drawing.Size(130, 20); + this.protocolTitle4TextBox.TabIndex = 13; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(27, 164); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(74, 13); + this.label4.TabIndex = 12; + this.label4.Text = "Protocol title 4"; + // + // EntryFormCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.protocolTitle4TextBox); + this.Controls.Add(this.label4); + this.Controls.Add(this.protocolTitle3TextBox); + this.Controls.Add(this.protocolTitle2TextBox); + this.Controls.Add(this.protocolTitle1TextBox); + this.Controls.Add(this.label3); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "EntryFormCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox protocolTitle1TextBox; + private System.Windows.Forms.TextBox protocolTitle2TextBox; + private System.Windows.Forms.TextBox protocolTitle3TextBox; + private System.Windows.Forms.TextBox protocolTitle4TextBox; + private System.Windows.Forms.Label label4; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/EntryFormCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/EntryFormCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/EntryFormCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/EntryFormFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/EntryFormFactory.cs new file mode 100644 index 00000000..57af5a73 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich/EntryFormFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DataEntry.Munich +{ + public class EntryFormFactory : IComponentFactory + { + public string ClassName { get { return "DataEntryForm-Munich"; } } + + public void ResetStaticProperties() { EntryForm.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new EntryForm(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new EntryForm(cfg); } + + public IComponentCfg DefaultConfig() { return new EntryFormCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(EntryFormCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/CycleBeginningForm.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/CycleBeginningForm.Designer.cs new file mode 100644 index 00000000..51878fcf --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/CycleBeginningForm.Designer.cs @@ -0,0 +1,299 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.Munich3 +{ + partial class CycleBeginningForm + { + /// + /// 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(CycleBeginningForm)); + this.okButton = new System.Windows.Forms.Button(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.textBox2 = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.textBox3 = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.textBox4 = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.groupBox5 = new System.Windows.Forms.GroupBox(); + this.textBox5 = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.groupBox6 = new System.Windows.Forms.GroupBox(); + this.textBox6 = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.checkBox1 = new System.Windows.Forms.CheckBox(); + this.checkBox2 = new System.Windows.Forms.CheckBox(); + this.checkBox3 = new System.Windows.Forms.CheckBox(); + this.checkBox4 = new System.Windows.Forms.CheckBox(); + this.checkBox5 = new System.Windows.Forms.CheckBox(); + this.checkBox6 = new System.Windows.Forms.CheckBox(); + this.groupBox1.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.groupBox4.SuspendLayout(); + this.groupBox5.SuspendLayout(); + this.groupBox6.SuspendLayout(); + this.SuspendLayout(); + // + // okButton + // + resources.ApplyResources(this.okButton, "okButton"); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Name = "okButton"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.checkBox1); + this.groupBox1.Controls.Add(this.textBox1); + this.groupBox1.Controls.Add(this.label1); + resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.ForeColor = System.Drawing.Color.Black; + this.groupBox1.Name = "groupBox1"; + this.groupBox1.TabStop = false; + // + // textBox1 + // + resources.ApplyResources(this.textBox1, "textBox1"); + this.textBox1.Name = "textBox1"; + this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged); + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.checkBox2); + this.groupBox2.Controls.Add(this.textBox2); + this.groupBox2.Controls.Add(this.label2); + resources.ApplyResources(this.groupBox2, "groupBox2"); + this.groupBox2.ForeColor = System.Drawing.Color.Black; + this.groupBox2.Name = "groupBox2"; + this.groupBox2.TabStop = false; + // + // textBox2 + // + resources.ApplyResources(this.textBox2, "textBox2"); + this.textBox2.Name = "textBox2"; + this.textBox2.TextChanged += new System.EventHandler(this.textBox2_TextChanged); + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.checkBox3); + this.groupBox3.Controls.Add(this.textBox3); + this.groupBox3.Controls.Add(this.label3); + resources.ApplyResources(this.groupBox3, "groupBox3"); + this.groupBox3.ForeColor = System.Drawing.Color.Black; + this.groupBox3.Name = "groupBox3"; + this.groupBox3.TabStop = false; + // + // textBox3 + // + resources.ApplyResources(this.textBox3, "textBox3"); + this.textBox3.Name = "textBox3"; + this.textBox3.TextChanged += new System.EventHandler(this.textBox3_TextChanged); + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // + // groupBox4 + // + this.groupBox4.Controls.Add(this.checkBox4); + this.groupBox4.Controls.Add(this.textBox4); + this.groupBox4.Controls.Add(this.label4); + resources.ApplyResources(this.groupBox4, "groupBox4"); + this.groupBox4.ForeColor = System.Drawing.Color.Black; + this.groupBox4.Name = "groupBox4"; + this.groupBox4.TabStop = false; + // + // textBox4 + // + resources.ApplyResources(this.textBox4, "textBox4"); + this.textBox4.Name = "textBox4"; + this.textBox4.TextChanged += new System.EventHandler(this.textBox4_TextChanged); + // + // label4 + // + resources.ApplyResources(this.label4, "label4"); + this.label4.Name = "label4"; + // + // groupBox5 + // + this.groupBox5.Controls.Add(this.checkBox5); + this.groupBox5.Controls.Add(this.textBox5); + this.groupBox5.Controls.Add(this.label5); + resources.ApplyResources(this.groupBox5, "groupBox5"); + this.groupBox5.ForeColor = System.Drawing.Color.Black; + this.groupBox5.Name = "groupBox5"; + this.groupBox5.TabStop = false; + // + // textBox5 + // + resources.ApplyResources(this.textBox5, "textBox5"); + this.textBox5.Name = "textBox5"; + this.textBox5.TextChanged += new System.EventHandler(this.textBox5_TextChanged); + // + // label5 + // + resources.ApplyResources(this.label5, "label5"); + this.label5.Name = "label5"; + // + // groupBox6 + // + this.groupBox6.Controls.Add(this.checkBox6); + this.groupBox6.Controls.Add(this.textBox6); + this.groupBox6.Controls.Add(this.label6); + resources.ApplyResources(this.groupBox6, "groupBox6"); + this.groupBox6.ForeColor = System.Drawing.Color.Black; + this.groupBox6.Name = "groupBox6"; + this.groupBox6.TabStop = false; + // + // textBox6 + // + resources.ApplyResources(this.textBox6, "textBox6"); + this.textBox6.Name = "textBox6"; + this.textBox6.TextChanged += new System.EventHandler(this.textBox6_TextChanged); + // + // label6 + // + resources.ApplyResources(this.label6, "label6"); + this.label6.Name = "label6"; + // + // checkBox1 + // + resources.ApplyResources(this.checkBox1, "checkBox1"); + this.checkBox1.Name = "checkBox1"; + this.checkBox1.UseVisualStyleBackColor = true; + // + // checkBox2 + // + resources.ApplyResources(this.checkBox2, "checkBox2"); + this.checkBox2.Name = "checkBox2"; + this.checkBox2.UseVisualStyleBackColor = true; + // + // checkBox3 + // + resources.ApplyResources(this.checkBox3, "checkBox3"); + this.checkBox3.Name = "checkBox3"; + this.checkBox3.UseVisualStyleBackColor = true; + // + // checkBox4 + // + resources.ApplyResources(this.checkBox4, "checkBox4"); + this.checkBox4.Name = "checkBox4"; + this.checkBox4.UseVisualStyleBackColor = true; + // + // checkBox5 + // + resources.ApplyResources(this.checkBox5, "checkBox5"); + this.checkBox5.Name = "checkBox5"; + this.checkBox5.UseVisualStyleBackColor = true; + // + // checkBox6 + // + resources.ApplyResources(this.checkBox6, "checkBox6"); + this.checkBox6.Name = "checkBox6"; + this.checkBox6.UseVisualStyleBackColor = true; + // + // CycleBeginningForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.Controls.Add(this.groupBox6); + this.Controls.Add(this.groupBox5); + this.Controls.Add(this.groupBox4); + this.Controls.Add(this.groupBox3); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.okButton); + this.ForeColor = System.Drawing.Color.Black; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "CycleBeginningForm"; + this.TopMost = true; + this.Load += new System.EventHandler(this.CycleBeginningForm_Load); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.groupBox4.ResumeLayout(false); + this.groupBox4.PerformLayout(); + this.groupBox5.ResumeLayout(false); + this.groupBox5.PerformLayout(); + this.groupBox6.ResumeLayout(false); + this.groupBox6.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TextBox textBox2; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.TextBox textBox3; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.GroupBox groupBox4; + private System.Windows.Forms.TextBox textBox4; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.GroupBox groupBox5; + private System.Windows.Forms.TextBox textBox5; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.GroupBox groupBox6; + private System.Windows.Forms.TextBox textBox6; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.CheckBox checkBox1; + private System.Windows.Forms.CheckBox checkBox2; + private System.Windows.Forms.CheckBox checkBox3; + private System.Windows.Forms.CheckBox checkBox4; + private System.Windows.Forms.CheckBox checkBox5; + private System.Windows.Forms.CheckBox checkBox6; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/CycleBeginningForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/CycleBeginningForm.cs new file mode 100644 index 00000000..c48dde1c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/CycleBeginningForm.cs @@ -0,0 +1,119 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using log4net; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.Munich3 +{ + public partial class CycleBeginningForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(CycleBeginningForm)); + + /// Number of text boxes for serial numbers + public readonly int WaterMetersCount; + + /// To be retrieved after the form is closed + public string[] SNText; + public bool[] Disabled; + + /// Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + /// + /// Constructor + /// + /// Number of text boxes for serial numbers + public CycleBeginningForm(int waterMetersCount) + { + InitializeComponent(); + ControlBox = false; + + this.WaterMetersCount = waterMetersCount; + SNText = new string[WaterMetersCount]; + Disabled = new bool[WaterMetersCount]; + completed = false; + StartForceCloseHandler(); + } + + /// Parameterless constructor for all watermeters + public CycleBeginningForm() + : this(Config.Data.WMsCount) + { + } + + private void CycleBeginningForm_Load(object sender, EventArgs e) + { + Localize(); + + if (WaterMetersCount < 1) groupBox1.Visible = false; + if (WaterMetersCount < 2) groupBox2.Visible = false; + if (WaterMetersCount < 3) groupBox3.Visible = false; + if (WaterMetersCount < 4) groupBox4.Visible = false; + if (WaterMetersCount < 5) groupBox5.Visible = false; + if (WaterMetersCount < 6) groupBox6.Visible = false; + + Height = 55 + WaterMetersCount * 105; + } + + void Localize() + { + Text = Strings.Data; + groupBox1.Text = Strings.Water_Meter + " 1"; + groupBox2.Text = Strings.Water_Meter + " 2"; + groupBox3.Text = Strings.Water_Meter + " 3"; + groupBox4.Text = Strings.Water_Meter + " 4"; + groupBox5.Text = Strings.Water_Meter + " 5"; + groupBox6.Text = Strings.Water_Meter + " 6"; + label1.Text = Strings.Serial_Number; + label2.Text = Strings.Serial_Number; + label3.Text = Strings.Serial_Number; + label4.Text = Strings.Serial_Number; + label5.Text = Strings.Serial_Number; + label6.Text = Strings.Serial_Number; + okButton.Text = Strings.OkBtnText; + } + + private void textBox1_TextChanged(object sender, EventArgs e) { checkBox1.Checked = true; } + private void textBox2_TextChanged(object sender, EventArgs e) { checkBox2.Checked = true; } + private void textBox3_TextChanged(object sender, EventArgs e) { checkBox3.Checked = true; } + private void textBox4_TextChanged(object sender, EventArgs e) { checkBox4.Checked = true; } + private void textBox5_TextChanged(object sender, EventArgs e) { checkBox5.Checked = true; } + private void textBox6_TextChanged(object sender, EventArgs e) { checkBox6.Checked = true; } + + private void okButton_Click(object sender, EventArgs e) + { + if (WaterMetersCount >= 1) { SNText[0] = textBox1.Text; Disabled[0] = !checkBox1.Checked; } + if (WaterMetersCount >= 2) { SNText[1] = textBox2.Text; Disabled[1] = !checkBox2.Checked; } + if (WaterMetersCount >= 3) { SNText[2] = textBox3.Text; Disabled[2] = !checkBox3.Checked; } + if (WaterMetersCount >= 4) { SNText[3] = textBox4.Text; Disabled[3] = !checkBox4.Checked; } + if (WaterMetersCount >= 5) { SNText[4] = textBox5.Text; Disabled[4] = !checkBox5.Checked; } + if (WaterMetersCount >= 6) { SNText[5] = textBox6.Text; Disabled[5] = !checkBox6.Checked; } + + completed = true; + 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); + }; + } + + private void OnForceClose(object sender, EventArgs args) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/CycleBeginningForm.pl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/CycleBeginningForm.pl.resx new file mode 100644 index 00000000..fcb02f81 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/CycleBeginningForm.pl.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + OK + + + Wodomierz 1 + + + Nr seryjny: + + + Wodomierz 2 + + + Nr seryjny: + + + Wodomierz 3 + + + Nr seryjny: + + + Wodomierz 4 + + + Nr seryjny: + + + Wodomierz 5 + + + Nr seryjny: + + + Wodomierz 6 + + + Nr seryjny: + + + Data + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/CycleBeginningForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/CycleBeginningForm.resx new file mode 100644 index 00000000..9c33553f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/CycleBeginningForm.resx @@ -0,0 +1,987 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + Top, Right + + + + Verdana, 14.25pt + + + 583, 38 + + + 98, 63 + + + + 0 + + + OK + + + okButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 6 + + + checkBox1 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + textBox1 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 2 + + + Verdana, 14.25pt + + + 28, 18 + + + 485, 92 + + + 1 + + + Wasserzähler 1 + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 5 + + + 213, 37 + + + 163, 31 + + + 1 + + + textBox1 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + True + + + 18, 40 + + + 159, 23 + + + 0 + + + Seriennummer: + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 2 + + + checkBox2 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 + + + textBox2 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 1 + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 2 + + + Verdana, 14.25pt + + + 28, 123 + + + 485, 92 + + + 2 + + + Wasserzähler 2 + + + groupBox2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + + + 213, 37 + + + 163, 31 + + + 1 + + + textBox2 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 1 + + + True + + + 18, 40 + + + 159, 23 + + + 0 + + + Seriennummer: + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 2 + + + checkBox3 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox3 + + + 0 + + + textBox3 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox3 + + + 1 + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox3 + + + 2 + + + Verdana, 14.25pt + + + 28, 228 + + + 485, 92 + + + 3 + + + Wasserzähler 3 + + + groupBox3 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + 213, 37 + + + 163, 31 + + + 1 + + + textBox3 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox3 + + + 1 + + + True + + + NoControl + + + 18, 40 + + + 159, 23 + + + 0 + + + Seriennummer: + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox3 + + + 2 + + + checkBox4 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox4 + + + 0 + + + textBox4 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox4 + + + 1 + + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox4 + + + 2 + + + Verdana, 14.25pt + + + 28, 333 + + + 485, 92 + + + 4 + + + Wasserzähler 4 + + + groupBox4 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + 213, 37 + + + 163, 31 + + + 1 + + + textBox4 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox4 + + + 1 + + + True + + + 18, 40 + + + 159, 23 + + + 0 + + + Seriennummer: + + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox4 + + + 2 + + + checkBox5 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox5 + + + 0 + + + textBox5 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox5 + + + 1 + + + label5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox5 + + + 2 + + + Verdana, 14.25pt + + + 28, 438 + + + 485, 92 + + + 5 + + + Wasserzähler 5 + + + groupBox5 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + 213, 37 + + + 163, 31 + + + 1 + + + textBox5 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox5 + + + 1 + + + True + + + 18, 40 + + + 159, 23 + + + 0 + + + Seriennummer: + + + label5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox5 + + + 2 + + + True + + + Verdana, 27.75pt + + + NoControl + + + 424, 49 + + + 15, 14 + + + 8 + + + checkBox6 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox6 + + + 0 + + + 213, 37 + + + 163, 31 + + + 1 + + + textBox6 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox6 + + + 1 + + + True + + + 18, 40 + + + 159, 23 + + + 0 + + + Seriennummer: + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox6 + + + 2 + + + Verdana, 14.25pt + + + 28, 543 + + + 485, 92 + + + 6 + + + Wasserzähler 6 + + + groupBox6 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + + + Verdana, 27.75pt + + + NoControl + + + 424, 49 + + + 15, 14 + + + 3 + + + checkBox1 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + True + + + Verdana, 27.75pt + + + NoControl + + + 424, 49 + + + 15, 14 + + + 8 + + + checkBox2 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 + + + True + + + Verdana, 27.75pt + + + NoControl + + + 424, 49 + + + 15, 14 + + + 8 + + + checkBox3 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox3 + + + 0 + + + True + + + Verdana, 27.75pt + + + NoControl + + + 424, 49 + + + 15, 14 + + + 8 + + + checkBox4 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox4 + + + 0 + + + True + + + Verdana, 27.75pt + + + NoControl + + + 424, 49 + + + 15, 14 + + + 8 + + + checkBox5 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox5 + + + 0 + + + True + + + 6, 13 + + + True + + + 715, 656 + + + Daten + + + CycleBeginningForm + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/CycleBeginningForm.ru.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/CycleBeginningForm.ru.resx new file mode 100644 index 00000000..c93c92f5 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/CycleBeginningForm.ru.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + OK + + + Водосчетчик 1 + + + Серийный номер: + + + Водосчетчик 2 + + + Серийный номер: + + + Водосчетчик 3 + + + Серийный номер: + + + Водосчетчик 4 + + + Серийный номер: + + + Водосчетчик 5 + + + Серийный номер: + + + Серийный номер: + + + Водосчетчик 6 + + + Дата + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/CycleEndForm.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/CycleEndForm.Designer.cs new file mode 100644 index 00000000..3b50d179 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/CycleEndForm.Designer.cs @@ -0,0 +1,514 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.Munich3 +{ + partial class CycleEndForm + { + /// + /// 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() + { + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.textBox2 = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.okButton = new System.Windows.Forms.Button(); + this.protocolGroupBox = new System.Windows.Forms.GroupBox(); + this.radioButton3 = new System.Windows.Forms.RadioButton(); + this.radioButton2 = new System.Windows.Forms.RadioButton(); + this.radioButton1 = new System.Windows.Forms.RadioButton(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.textBox3 = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.textBox4 = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.groupBox5 = new System.Windows.Forms.GroupBox(); + this.textBox5 = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.groupBox6 = new System.Windows.Forms.GroupBox(); + this.textBox6 = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.radioButton4 = new System.Windows.Forms.RadioButton(); + this.yearOfProduction1Label = new System.Windows.Forms.Label(); + this.yearOfProduction2Label = new System.Windows.Forms.Label(); + this.yearOfProduction3Label = new System.Windows.Forms.Label(); + this.yearOfProduction4Label = new System.Windows.Forms.Label(); + this.yearOfProduction5Label = new System.Windows.Forms.Label(); + this.yearOfProduction6Label = new System.Windows.Forms.Label(); + this.yearOfProduction1TextBox = new System.Windows.Forms.TextBox(); + this.yearOfProduction2TextBox = new System.Windows.Forms.TextBox(); + this.yearOfProduction3TextBox = new System.Windows.Forms.TextBox(); + this.yearOfProduction4TextBox = new System.Windows.Forms.TextBox(); + this.yearOfProduction5TextBox = new System.Windows.Forms.TextBox(); + this.yearOfProduction6TextBox = new System.Windows.Forms.TextBox(); + this.groupBox2.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.protocolGroupBox.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.groupBox4.SuspendLayout(); + this.groupBox5.SuspendLayout(); + this.groupBox6.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.yearOfProduction2TextBox); + this.groupBox2.Controls.Add(this.yearOfProduction2Label); + this.groupBox2.Controls.Add(this.textBox2); + this.groupBox2.Controls.Add(this.label2); + this.groupBox2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox2.ForeColor = System.Drawing.Color.Black; + this.groupBox2.Location = new System.Drawing.Point(25, 284); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(682, 81); + this.groupBox2.TabIndex = 2; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Wasserzähler 2"; + // + // textBox2 + // + this.textBox2.Location = new System.Drawing.Point(160, 31); + this.textBox2.Name = "textBox2"; + this.textBox2.Size = new System.Drawing.Size(163, 31); + this.textBox2.TabIndex = 1; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(18, 34); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(74, 23); + this.label2.TabIndex = 0; + this.label2.Text = "Stand:"; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.yearOfProduction1TextBox); + this.groupBox1.Controls.Add(this.yearOfProduction1Label); + this.groupBox1.Controls.Add(this.textBox1); + this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox1.ForeColor = System.Drawing.Color.Black; + this.groupBox1.Location = new System.Drawing.Point(25, 194); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(682, 81); + this.groupBox1.TabIndex = 1; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Wasserzähler 1"; + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(160, 31); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(163, 31); + this.textBox1.TabIndex = 1; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(18, 34); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(74, 23); + this.label1.TabIndex = 0; + this.label1.Text = "Stand:"; + // + // okButton + // + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(584, 29); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(98, 63); + this.okButton.TabIndex = 7; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // protocolGroupBox + // + this.protocolGroupBox.Controls.Add(this.radioButton4); + this.protocolGroupBox.Controls.Add(this.radioButton3); + this.protocolGroupBox.Controls.Add(this.radioButton2); + this.protocolGroupBox.Controls.Add(this.radioButton1); + this.protocolGroupBox.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.protocolGroupBox.Location = new System.Drawing.Point(25, 13); + this.protocolGroupBox.Name = "protocolGroupBox"; + this.protocolGroupBox.Size = new System.Drawing.Size(362, 175); + this.protocolGroupBox.TabIndex = 0; + this.protocolGroupBox.TabStop = false; + this.protocolGroupBox.Text = "Protokoll"; + // + // radioButton3 + // + this.radioButton3.AutoSize = true; + this.radioButton3.Location = new System.Drawing.Point(34, 100); + this.radioButton3.Name = "radioButton3"; + this.radioButton3.Size = new System.Drawing.Size(152, 27); + this.radioButton3.TabIndex = 2; + this.radioButton3.TabStop = true; + this.radioButton3.Text = "radioButton3"; + this.radioButton3.UseVisualStyleBackColor = true; + this.radioButton3.CheckedChanged += new System.EventHandler(this.radioButton3_CheckedChanged); + // + // radioButton2 + // + this.radioButton2.AutoSize = true; + this.radioButton2.Location = new System.Drawing.Point(34, 67); + this.radioButton2.Name = "radioButton2"; + this.radioButton2.Size = new System.Drawing.Size(152, 27); + this.radioButton2.TabIndex = 1; + this.radioButton2.TabStop = true; + this.radioButton2.Text = "radioButton2"; + this.radioButton2.UseVisualStyleBackColor = true; + this.radioButton2.CheckedChanged += new System.EventHandler(this.radioButton2_CheckedChanged); + // + // radioButton1 + // + this.radioButton1.AutoSize = true; + this.radioButton1.Checked = true; + this.radioButton1.Location = new System.Drawing.Point(34, 34); + this.radioButton1.Name = "radioButton1"; + this.radioButton1.Size = new System.Drawing.Size(152, 27); + this.radioButton1.TabIndex = 0; + this.radioButton1.TabStop = true; + this.radioButton1.Text = "radioButton1"; + this.radioButton1.UseVisualStyleBackColor = true; + this.radioButton1.CheckedChanged += new System.EventHandler(this.radioButton1_CheckedChanged); + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.yearOfProduction3TextBox); + this.groupBox3.Controls.Add(this.yearOfProduction3Label); + this.groupBox3.Controls.Add(this.textBox3); + this.groupBox3.Controls.Add(this.label3); + this.groupBox3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox3.ForeColor = System.Drawing.Color.Black; + this.groupBox3.Location = new System.Drawing.Point(25, 374); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(682, 81); + this.groupBox3.TabIndex = 3; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "Wasserzähler 3"; + // + // textBox3 + // + this.textBox3.Location = new System.Drawing.Point(160, 31); + this.textBox3.Name = "textBox3"; + this.textBox3.Size = new System.Drawing.Size(163, 31); + this.textBox3.TabIndex = 1; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(18, 34); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(74, 23); + this.label3.TabIndex = 0; + this.label3.Text = "Stand:"; + // + // groupBox4 + // + this.groupBox4.Controls.Add(this.yearOfProduction4TextBox); + this.groupBox4.Controls.Add(this.yearOfProduction4Label); + this.groupBox4.Controls.Add(this.textBox4); + this.groupBox4.Controls.Add(this.label4); + this.groupBox4.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox4.ForeColor = System.Drawing.Color.Black; + this.groupBox4.Location = new System.Drawing.Point(25, 464); + this.groupBox4.Name = "groupBox4"; + this.groupBox4.Size = new System.Drawing.Size(682, 81); + this.groupBox4.TabIndex = 4; + this.groupBox4.TabStop = false; + this.groupBox4.Text = "Wasserzähler 4"; + // + // textBox4 + // + this.textBox4.Location = new System.Drawing.Point(160, 31); + this.textBox4.Name = "textBox4"; + this.textBox4.Size = new System.Drawing.Size(163, 31); + this.textBox4.TabIndex = 1; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(18, 34); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(74, 23); + this.label4.TabIndex = 0; + this.label4.Text = "Stand:"; + // + // groupBox5 + // + this.groupBox5.Controls.Add(this.yearOfProduction5TextBox); + this.groupBox5.Controls.Add(this.yearOfProduction5Label); + this.groupBox5.Controls.Add(this.textBox5); + this.groupBox5.Controls.Add(this.label5); + this.groupBox5.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox5.ForeColor = System.Drawing.Color.Black; + this.groupBox5.Location = new System.Drawing.Point(25, 554); + this.groupBox5.Name = "groupBox5"; + this.groupBox5.Size = new System.Drawing.Size(682, 81); + this.groupBox5.TabIndex = 5; + this.groupBox5.TabStop = false; + this.groupBox5.Text = "Wasserzähler 5"; + // + // textBox5 + // + this.textBox5.Location = new System.Drawing.Point(160, 31); + this.textBox5.Name = "textBox5"; + this.textBox5.Size = new System.Drawing.Size(163, 31); + this.textBox5.TabIndex = 1; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(18, 34); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(74, 23); + this.label5.TabIndex = 0; + this.label5.Text = "Stand:"; + // + // groupBox6 + // + this.groupBox6.Controls.Add(this.yearOfProduction6TextBox); + this.groupBox6.Controls.Add(this.yearOfProduction6Label); + this.groupBox6.Controls.Add(this.textBox6); + this.groupBox6.Controls.Add(this.label6); + this.groupBox6.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox6.ForeColor = System.Drawing.Color.Black; + this.groupBox6.Location = new System.Drawing.Point(25, 644); + this.groupBox6.Name = "groupBox6"; + this.groupBox6.Size = new System.Drawing.Size(682, 81); + this.groupBox6.TabIndex = 6; + this.groupBox6.TabStop = false; + this.groupBox6.Text = "Wasserzähler 6"; + // + // textBox6 + // + this.textBox6.Location = new System.Drawing.Point(160, 31); + this.textBox6.Name = "textBox6"; + this.textBox6.Size = new System.Drawing.Size(163, 31); + this.textBox6.TabIndex = 1; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(18, 34); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(74, 23); + this.label6.TabIndex = 0; + this.label6.Text = "Stand:"; + // + // radioButton4 + // + this.radioButton4.AutoSize = true; + this.radioButton4.Location = new System.Drawing.Point(34, 133); + this.radioButton4.Name = "radioButton4"; + this.radioButton4.Size = new System.Drawing.Size(152, 27); + this.radioButton4.TabIndex = 3; + this.radioButton4.TabStop = true; + this.radioButton4.Text = "radioButton4"; + this.radioButton4.UseVisualStyleBackColor = true; + this.radioButton4.CheckedChanged += new System.EventHandler(this.radioButton4_CheckedChanged); + // + // yearOfProduction1Label + // + this.yearOfProduction1Label.AutoSize = true; + this.yearOfProduction1Label.Location = new System.Drawing.Point(351, 34); + this.yearOfProduction1Label.Name = "yearOfProduction1Label"; + this.yearOfProduction1Label.Size = new System.Drawing.Size(188, 23); + this.yearOfProduction1Label.TabIndex = 9; + this.yearOfProduction1Label.Text = "Year of production"; + // + // yearOfProduction2Label + // + this.yearOfProduction2Label.AutoSize = true; + this.yearOfProduction2Label.Location = new System.Drawing.Point(351, 34); + this.yearOfProduction2Label.Name = "yearOfProduction2Label"; + this.yearOfProduction2Label.Size = new System.Drawing.Size(188, 23); + this.yearOfProduction2Label.TabIndex = 10; + this.yearOfProduction2Label.Text = "Year of production"; + // + // yearOfProduction3Label + // + this.yearOfProduction3Label.AutoSize = true; + this.yearOfProduction3Label.Location = new System.Drawing.Point(351, 34); + this.yearOfProduction3Label.Name = "yearOfProduction3Label"; + this.yearOfProduction3Label.Size = new System.Drawing.Size(188, 23); + this.yearOfProduction3Label.TabIndex = 10; + this.yearOfProduction3Label.Text = "Year of production"; + // + // yearOfProduction4Label + // + this.yearOfProduction4Label.AutoSize = true; + this.yearOfProduction4Label.Location = new System.Drawing.Point(351, 34); + this.yearOfProduction4Label.Name = "yearOfProduction4Label"; + this.yearOfProduction4Label.Size = new System.Drawing.Size(188, 23); + this.yearOfProduction4Label.TabIndex = 10; + this.yearOfProduction4Label.Text = "Year of production"; + // + // yearOfProduction5Label + // + this.yearOfProduction5Label.AutoSize = true; + this.yearOfProduction5Label.Location = new System.Drawing.Point(351, 34); + this.yearOfProduction5Label.Name = "yearOfProduction5Label"; + this.yearOfProduction5Label.Size = new System.Drawing.Size(188, 23); + this.yearOfProduction5Label.TabIndex = 10; + this.yearOfProduction5Label.Text = "Year of production"; + // + // yearOfProduction6Label + // + this.yearOfProduction6Label.AutoSize = true; + this.yearOfProduction6Label.Location = new System.Drawing.Point(351, 34); + this.yearOfProduction6Label.Name = "yearOfProduction6Label"; + this.yearOfProduction6Label.Size = new System.Drawing.Size(188, 23); + this.yearOfProduction6Label.TabIndex = 10; + this.yearOfProduction6Label.Text = "Year of production"; + // + // yearOfProduction1TextBox + // + this.yearOfProduction1TextBox.Location = new System.Drawing.Point(559, 31); + this.yearOfProduction1TextBox.Name = "yearOfProduction1TextBox"; + this.yearOfProduction1TextBox.Size = new System.Drawing.Size(98, 31); + this.yearOfProduction1TextBox.TabIndex = 10; + // + // yearOfProduction2TextBox + // + this.yearOfProduction2TextBox.Location = new System.Drawing.Point(559, 31); + this.yearOfProduction2TextBox.Name = "yearOfProduction2TextBox"; + this.yearOfProduction2TextBox.Size = new System.Drawing.Size(98, 31); + this.yearOfProduction2TextBox.TabIndex = 11; + // + // yearOfProduction3TextBox + // + this.yearOfProduction3TextBox.Location = new System.Drawing.Point(559, 31); + this.yearOfProduction3TextBox.Name = "yearOfProduction3TextBox"; + this.yearOfProduction3TextBox.Size = new System.Drawing.Size(98, 31); + this.yearOfProduction3TextBox.TabIndex = 11; + // + // yearOfProduction4TextBox + // + this.yearOfProduction4TextBox.Location = new System.Drawing.Point(559, 31); + this.yearOfProduction4TextBox.Name = "yearOfProduction4TextBox"; + this.yearOfProduction4TextBox.Size = new System.Drawing.Size(98, 31); + this.yearOfProduction4TextBox.TabIndex = 11; + // + // yearOfProduction5TextBox + // + this.yearOfProduction5TextBox.Location = new System.Drawing.Point(559, 31); + this.yearOfProduction5TextBox.Name = "yearOfProduction5TextBox"; + this.yearOfProduction5TextBox.Size = new System.Drawing.Size(98, 31); + this.yearOfProduction5TextBox.TabIndex = 11; + // + // yearOfProduction6TextBox + // + this.yearOfProduction6TextBox.Location = new System.Drawing.Point(559, 31); + this.yearOfProduction6TextBox.Name = "yearOfProduction6TextBox"; + this.yearOfProduction6TextBox.Size = new System.Drawing.Size(98, 31); + this.yearOfProduction6TextBox.TabIndex = 11; + // + // CycleEndForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.ClientSize = new System.Drawing.Size(719, 746); + this.Controls.Add(this.groupBox6); + this.Controls.Add(this.groupBox5); + this.Controls.Add(this.groupBox4); + this.Controls.Add(this.groupBox3); + this.Controls.Add(this.protocolGroupBox); + this.Controls.Add(this.okButton); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.groupBox1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "CycleEndForm"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "Daten"; + this.TopMost = true; + this.Load += new System.EventHandler(this.CycleEndForm_Load); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.protocolGroupBox.ResumeLayout(false); + this.protocolGroupBox.PerformLayout(); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.groupBox4.ResumeLayout(false); + this.groupBox4.PerformLayout(); + this.groupBox5.ResumeLayout(false); + this.groupBox5.PerformLayout(); + this.groupBox6.ResumeLayout(false); + this.groupBox6.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TextBox textBox2; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.GroupBox protocolGroupBox; + private System.Windows.Forms.RadioButton radioButton3; + private System.Windows.Forms.RadioButton radioButton2; + private System.Windows.Forms.RadioButton radioButton1; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.TextBox textBox3; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.GroupBox groupBox4; + private System.Windows.Forms.TextBox textBox4; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.GroupBox groupBox5; + private System.Windows.Forms.TextBox textBox5; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.GroupBox groupBox6; + private System.Windows.Forms.TextBox textBox6; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.RadioButton radioButton4; + private System.Windows.Forms.Label yearOfProduction1Label; + private System.Windows.Forms.TextBox yearOfProduction2TextBox; + private System.Windows.Forms.Label yearOfProduction2Label; + private System.Windows.Forms.TextBox yearOfProduction1TextBox; + private System.Windows.Forms.TextBox yearOfProduction3TextBox; + private System.Windows.Forms.Label yearOfProduction3Label; + private System.Windows.Forms.TextBox yearOfProduction4TextBox; + private System.Windows.Forms.Label yearOfProduction4Label; + private System.Windows.Forms.TextBox yearOfProduction5TextBox; + private System.Windows.Forms.Label yearOfProduction5Label; + private System.Windows.Forms.TextBox yearOfProduction6TextBox; + private System.Windows.Forms.Label yearOfProduction6Label; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/CycleEndForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/CycleEndForm.cs new file mode 100644 index 00000000..ed6220ae --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/CycleEndForm.cs @@ -0,0 +1,194 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using log4net; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.Munich3 +{ + public partial class CycleEndForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(CycleEndForm)); + + /// Number of text boxes for serial numbers + public readonly int WaterMetersCount; + + // To be set before the form opens + public string ProtocolName1; + public string ProtocolName2; + public string ProtocolName3; + public string ProtocolName4; + + // To be retrieved after the form closes + public string ProtocolTitle; + public string[] EndStateText; + public int[] YearOfProduction; + + // Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + /// + /// Constructor + /// + /// Number of text boxes for serial numbers + public CycleEndForm(int waterMetersCount) + { + InitializeComponent(); + ControlBox = false; + + this.WaterMetersCount = waterMetersCount; + EndStateText = new string[WaterMetersCount]; + YearOfProduction = new int[WaterMetersCount]; + completed = false; + StartForceCloseHandler(); + } + + /// Parameterless constructor for 3 watermeters + public CycleEndForm() + : this(3) + { + } + + private void CycleEndForm_Load(object sender, EventArgs e) + { + Localize(); + + radioButton1.Text = ProtocolName1; + radioButton2.Text = ProtocolName2; + radioButton3.Text = ProtocolName3; + radioButton4.Text = ProtocolName4; + + if (WaterMetersCount < 1) groupBox1.Visible = false; + if (WaterMetersCount < 2) groupBox2.Visible = false; + if (WaterMetersCount < 3) groupBox3.Visible = false; + if (WaterMetersCount < 4) groupBox4.Visible = false; + if (WaterMetersCount < 5) groupBox5.Visible = false; + if (WaterMetersCount < 6) groupBox6.Visible = false; + + if (Sequences.ProcessData.BatchRslts.WaterMeters.Length >= 1) + { + YearOfProduction[0] = Sequences.ProcessData.BatchRslts.WaterMeters[0].YearOfProduction; + yearOfProduction1TextBox.Text = YearOfProduction[0].ToString(); + } + if (Sequences.ProcessData.BatchRslts.WaterMeters.Length >= 2) + { + YearOfProduction[1] = Sequences.ProcessData.BatchRslts.WaterMeters[1].YearOfProduction; + yearOfProduction2TextBox.Text = YearOfProduction[1].ToString(); + } + if (Sequences.ProcessData.BatchRslts.WaterMeters.Length >= 3) + { + YearOfProduction[2] = Sequences.ProcessData.BatchRslts.WaterMeters[2].YearOfProduction; + yearOfProduction3TextBox.Text = YearOfProduction[2].ToString(); + } + if (Sequences.ProcessData.BatchRslts.WaterMeters.Length >= 4) + { + YearOfProduction[3] = Sequences.ProcessData.BatchRslts.WaterMeters[3].YearOfProduction; + yearOfProduction4TextBox.Text = YearOfProduction[3].ToString(); + } + if (Sequences.ProcessData.BatchRslts.WaterMeters.Length >= 5) + { + YearOfProduction[4] = Sequences.ProcessData.BatchRslts.WaterMeters[4].YearOfProduction; + yearOfProduction5TextBox.Text = YearOfProduction[4].ToString(); + } + if (Sequences.ProcessData.BatchRslts.WaterMeters.Length >= 6) + { + YearOfProduction[5] = Sequences.ProcessData.BatchRslts.WaterMeters[5].YearOfProduction; + yearOfProduction6TextBox.Text = YearOfProduction[5].ToString(); + } + + Height = 228 + 90 * WaterMetersCount; + + AnyRadioButtonChanged(); + } + + void Localize() + { + Text = Strings.Data; + protocolGroupBox.Text = Strings.Protocol; + okButton.Text = Strings.OkBtnText; + + groupBox1.Text = Strings.Water_Meter + " 1"; + groupBox2.Text = Strings.Water_Meter + " 2"; + groupBox3.Text = Strings.Water_Meter + " 3"; + groupBox4.Text = Strings.Water_Meter + " 4"; + groupBox5.Text = Strings.Water_Meter + " 5"; + groupBox6.Text = Strings.Water_Meter + " 6"; + + label1.Text = label2.Text = label3.Text = label4.Text + = label5.Text = label6.Text = Strings.State; + + yearOfProduction1Label.Text = yearOfProduction2Label.Text + = yearOfProduction3Label.Text = yearOfProduction4Label.Text + = yearOfProduction5Label.Text = yearOfProduction6Label.Text = Strings.Year_of_production; + } + + private void okButton_Click(object sender, EventArgs e) + { + if (radioButton1.Checked) ProtocolTitle = ProtocolName1; + else if (radioButton2.Checked) ProtocolTitle = ProtocolName2; + else if (radioButton3.Checked) ProtocolTitle = ProtocolName3; + else if (radioButton4.Checked) ProtocolTitle = ProtocolName4; + + if (WaterMetersCount >= 1) EndStateText[0] = textBox1.Text; + if (WaterMetersCount >= 2) EndStateText[1] = textBox2.Text; + if (WaterMetersCount >= 3) EndStateText[2] = textBox3.Text; + if (WaterMetersCount >= 4) EndStateText[3] = textBox4.Text; + if (WaterMetersCount >= 5) EndStateText[4] = textBox5.Text; + if (WaterMetersCount >= 6) EndStateText[5] = textBox6.Text; + + if (ShowYear()) + { + int year; + if (WaterMetersCount >= 1 && int.TryParse(yearOfProduction1TextBox.Text, out year)) YearOfProduction[0] = year; + if (WaterMetersCount >= 2 && int.TryParse(yearOfProduction2TextBox.Text, out year)) YearOfProduction[1] = year; + if (WaterMetersCount >= 3 && int.TryParse(yearOfProduction3TextBox.Text, out year)) YearOfProduction[2] = year; + if (WaterMetersCount >= 4 && int.TryParse(yearOfProduction4TextBox.Text, out year)) YearOfProduction[3] = year; + if (WaterMetersCount >= 5 && int.TryParse(yearOfProduction5TextBox.Text, out year)) YearOfProduction[4] = year; + if (WaterMetersCount >= 6 && int.TryParse(yearOfProduction6TextBox.Text, out year)) YearOfProduction[5] = year; + } + + completed = true; + 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) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + + private void radioButton1_CheckedChanged(object sender, EventArgs e) { AnyRadioButtonChanged(); } + private void radioButton2_CheckedChanged(object sender, EventArgs e) { AnyRadioButtonChanged(); } + private void radioButton3_CheckedChanged(object sender, EventArgs e) { AnyRadioButtonChanged(); } + private void radioButton4_CheckedChanged(object sender, EventArgs e) { AnyRadioButtonChanged(); } + + bool ShowYear() + { + return radioButton2.Checked || radioButton3.Checked || radioButton4.Checked; + } + + void AnyRadioButtonChanged() + { + yearOfProduction1TextBox.Visible = yearOfProduction2TextBox.Visible = yearOfProduction3TextBox.Visible = + yearOfProduction4TextBox.Visible = yearOfProduction5TextBox.Visible = yearOfProduction6TextBox.Visible = + yearOfProduction1Label.Visible = yearOfProduction2Label.Visible = yearOfProduction3Label.Visible = + yearOfProduction4Label.Visible = yearOfProduction5Label.Visible = yearOfProduction6Label.Visible = ShowYear(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/CycleEndForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/CycleEndForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/CycleEndForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/EntryForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/EntryForm.cs new file mode 100644 index 00000000..0830b58c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/EntryForm.cs @@ -0,0 +1,271 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; +using TBF.BenchControl; +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl.DataEntry.Munich3 +{ + public class EntryForm : ComponentBase, IOperation, IDataEntry, IHasCycleBeginForm, IHasCycleEndForm, IHasWMStatesForm + { + private static readonly ILog log = LogManager.GetLogger(typeof(EntryForm)); + public override string ToString() { return string.Format("DataEntry.Munich3({0})", Cfg.ToString(1)); } + + public bool UsesCameras() { return false; } + + readonly EntryFormCfg entryFormCfg; + IRegisterReader[] regReaders; + + /// + /// Properties set by the Begin and the End form + /// + public string PurchaseOrder { get { return string.Empty; } } /// Not supported in Munich + + string[] serialNr; + public string SerialNr(int wmNr) { return (wmNr >= 0 && wmNr < serialNr.Length) ? serialNr[wmNr] : string.Empty; } + + bool[] disabled; + public bool Disabled(int wmNr) { return (wmNr >= 0 && wmNr < disabled.Length) ? disabled[wmNr] : false; } + + string[] wmCycleEndState; + public string WMCycleEndState(int wmNr) { return (wmNr >= 0 && wmNr < wmCycleEndState.Length) ? wmCycleEndState[wmNr] : string.Empty; } + + double[] wmStartState; + public double WMStartState(int wmNr) { return (wmNr >= 0 && wmNr < wmStartState.Length) ? wmStartState[wmNr] : 0; } + + double[] wmEndState; + public double WMEndState(int wmNr) { return (wmNr >= 0 && wmNr < wmEndState.Length) ? wmEndState[wmNr] : 0; } + + string[] wmStartStateStr; + + + System.Windows.Forms.Form modelessDlg; + + double refVolume; + double errLimLo; + double errLimHi; + + bool resultSaved; + + Results.Entities.WaterMeter[] waterMeters; /// Reference to ...ProcessData.BatchRslts.WaterMeters[] + + public enum CurrentOp + { + None, + ShowFormAtCycleBeginning, + ShowFormAtCycleEnd, + EnterTestStartStates, + EnterTestEndStates, + } + + CurrentOp currentOp; + + + public EntryForm() + { + } + + public EntryForm(Generic.IComponentCfg cfg) + : base(cfg) + { + entryFormCfg = cfg as EntryFormCfg; + + serialNr = new string[Config.Data.WMsCount]; + disabled = new bool[Config.Data.WMsCount]; + wmStartState = new double[Config.Data.WMsCount]; + wmStartStateStr = new string[Config.Data.WMsCount]; + wmEndState = new double[Config.Data.WMsCount]; + wmCycleEndState = new string[Config.Data.WMsCount]; + + currentOp = CurrentOp.None; + log.Debug(this.ToString()); + } + + /// Reference to the operation + public IOperation ShowCycleBeginFormOp() + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.ShowFormAtCycleBeginning; + this.waterMeters = TBF.BenchControl.Sequences.ProcessData.BatchRslts.WaterMeters; + return this; + } + + /// Reference to the operation + public IOperation ShowCycleEndFormOp() + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.ShowFormAtCycleEnd; + this.waterMeters = TBF.BenchControl.Sequences.ProcessData.BatchRslts.WaterMeters; + return this; + } + + /// Reference to the operation + public IOperation ShowTestStartFormOp(IRegisterReader[] regReaders) + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.EnterTestStartStates; + this.regReaders = regReaders; + return this; + } + + /// Reference to the operation + public IOperation ShowTestEndFormOp(IRegisterReader[] regReaders, double refVolume, double errLimLo, double errLimHi) + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.EnterTestEndStates; + this.regReaders = regReaders; + this.refVolume = refVolume; + this.errLimLo = errLimLo; + this.errLimHi = errLimHi; + return this; + } + + delegate void EntryFormDlgt(EntryForm myRef); + /// + void OpenBeginningDlg(EntryForm myRef) + { + myRef.modelessDlg = new CycleBeginningForm(Config.Data.WMsCount); + modelessDlg.Show(); + } + /// + void OpenEndDlg(EntryForm myRef) + { + CycleEndForm endForm = new CycleEndForm(Config.Data.WMsCount); + endForm.ProtocolName1 = entryFormCfg.ProtocolTitle1; + endForm.ProtocolName2 = entryFormCfg.ProtocolTitle2; + endForm.ProtocolName3 = entryFormCfg.ProtocolTitle3; + endForm.ProtocolName4 = entryFormCfg.ProtocolTitle4; + myRef.modelessDlg = endForm; + modelessDlg.Show(); + } + /// + void OpenTestStartStatesDlg(EntryForm myRef) + { + myRef.modelessDlg = new TestStartEndForm(myRef.waterMeters.Length, myRef.regReaders, disabled); + modelessDlg.Show(); + } + /// + void OpenTestEndStatesDlg(EntryForm myRef) + { + myRef.modelessDlg = new TestStartEndForm(Config.Data.WMsCount, myRef.regReaders, wmStartStateStr, disabled, refVolume, errLimLo, errLimHi); + modelessDlg.Show(); + } + + /// Start this operation + public void Start() + { + resultSaved = false; + switch (currentOp) + { + case CurrentOp.ShowFormAtCycleBeginning: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenBeginningDlg), this); + break; + case CurrentOp.ShowFormAtCycleEnd: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenEndDlg), this); + break; + case CurrentOp.EnterTestStartStates: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenTestStartStatesDlg), this); + break; + case CurrentOp.EnterTestEndStates: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenTestEndStatesDlg), this); + break; + } + } + + /// Run this operation + /// Event.ResultsPrinted + public Event Run() + { + if ((modelessDlg is IHasCompleted) && !(modelessDlg as IHasCompleted).Completed) + { + return Event.ModelessFormIsOpen; + } + + if (!resultSaved) /// This is to save the result only once + { + if (modelessDlg is CycleBeginningForm) + { + CycleBeginningForm dlg = (modelessDlg as CycleBeginningForm); + + for (int i = 0; i < Math.Min(dlg.WaterMetersCount, waterMeters.Length); i++) + { + if (waterMeters[i] != null) + { + serialNr[i] = waterMeters[i].SerialNr = dlg.SNText[i]; + disabled[i] = waterMeters[i].Disabled = dlg.Disabled[i]; + } + } + } + else if (modelessDlg is CycleEndForm) + { + CycleEndForm dlg = (modelessDlg as CycleEndForm); + + Sequences.ProcessData.BatchRslts.Batch.ProtocolTitle = dlg.ProtocolTitle; + + for (int i = 0; i < Math.Min(dlg.WaterMetersCount, waterMeters.Length); i++) + { + if (waterMeters[i] != null) + { + wmCycleEndState[i] = waterMeters[i].EndState = dlg.EndStateText[i]; + waterMeters[i].YearOfProduction = dlg.YearOfProduction[i]; + } + } + } + else if (modelessDlg is TestStartEndForm && currentOp == CurrentOp.EnterTestStartStates) + { + /// Fixed start test - start + TestStartEndForm dlg = (modelessDlg as TestStartEndForm); + if (dlg != null) + { + for (int i = 0; i < dlg.WaterMetersCount; i++) + { + wmStartState[i] = dlg.WMStartState[i]; + wmStartStateStr[i] = dlg.WMStartStateStr[i]; + } + } + } + else if (modelessDlg is TestStartEndForm && currentOp == CurrentOp.EnterTestEndStates) + { + /// Fixed start test - end + TestStartEndForm dlg = (modelessDlg as TestStartEndForm); + if (dlg != null) + { + for (int i = 0; i < dlg.WaterMetersCount; i++) + { + wmEndState[i] = dlg.WMEndState[i]; + } + } + } + resultSaved = true; + modelessDlg = null; + } + + return Event.ModelessFormClosed; /// Form closed + } + + /// Stop this operation + public void Stop() + { + if (modelessDlg is IHasCompleted) + { + UiBridge.Bridge.OnCloseModelessForm(this, null); + modelessDlg = null; + } + currentOp = CurrentOp.None; + } + + /// + /// Updates test results with the information collected in watermeters. + /// + /// Watermetes with information entered in the forms + /// Test results to be updated with the information + public void UpdateTestResults(Results.BatchResults results) + { + /// Nothing to be done + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/EntryFormCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/EntryFormCfg.cs new file mode 100644 index 00000000..d6879cea --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/EntryFormCfg.cs @@ -0,0 +1,54 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DataEntry.Munich3 +{ + public class EntryFormCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(EntryFormCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new EntryFormCfgCtrl(); } + + /// + /// Serialized parameters + /// + public string ProtocolTitle1; + public string ProtocolTitle2; + public string ProtocolTitle3; + public string ProtocolTitle4; + + /// Private parameterless constructor invoked by all other (public) constructors + EntryFormCfg() + { + Name = "DataEntryForm-3"; + ParentName = string.Empty; + ProtocolTitle1 = "Protokoll 1"; + ProtocolTitle2 = "Protokoll 2"; + ProtocolTitle3 = "Protokoll 3"; + ProtocolTitle4 = "Protokoll 4"; + } + + public EntryFormCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, P1={1}, P2={2}, P3={3}, P4={4}", + Name, + (string.IsNullOrEmpty(ProtocolTitle1) ? "-" : ProtocolTitle1), + (string.IsNullOrEmpty(ProtocolTitle2) ? "-" : ProtocolTitle2), + (string.IsNullOrEmpty(ProtocolTitle3) ? "-" : ProtocolTitle3), + (string.IsNullOrEmpty(ProtocolTitle4) ? "-" : ProtocolTitle4)); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/EntryFormCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/EntryFormCfgCtrl.cs new file mode 100644 index 00000000..257b1d98 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/EntryFormCfgCtrl.cs @@ -0,0 +1,81 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DataEntry.Munich3 +{ + public partial class EntryFormCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + EntryFormCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as EntryFormCfg; + Redraw(); + } + } + + public EntryFormCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + protocolTitle1TextBox.Text = config.ProtocolTitle1; + protocolTitle2TextBox.Text = config.ProtocolTitle2; + protocolTitle3TextBox.Text = config.ProtocolTitle3; + protocolTitle4TextBox.Text = config.ProtocolTitle4; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + protocolTitle1TextBox.Enabled = true; + protocolTitle2TextBox.Enabled = true; + protocolTitle3TextBox.Enabled = true; + protocolTitle4TextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.ProtocolTitle1 = protocolTitle1TextBox.Text; + config.ProtocolTitle2 = protocolTitle2TextBox.Text; + config.ProtocolTitle3 = protocolTitle3TextBox.Text; + config.ProtocolTitle4 = protocolTitle4TextBox.Text; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/EntryFormCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/EntryFormCfgCtrl.designer.cs new file mode 100644 index 00000000..13f2ecc4 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/EntryFormCfgCtrl.designer.cs @@ -0,0 +1,178 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.Munich3 +{ + partial class EntryFormCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.protocolTitle1TextBox = new System.Windows.Forms.TextBox(); + this.protocolTitle2TextBox = new System.Windows.Forms.TextBox(); + this.protocolTitle3TextBox = new System.Windows.Forms.TextBox(); + this.protocolTitle4TextBox = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(137, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 5; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(27, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 4; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(134, 33); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 3; + this.classNameLabel.Text = "ComonentName"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(27, 86); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(74, 13); + this.label1.TabIndex = 6; + this.label1.Text = "Protocol title 1"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(27, 112); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(74, 13); + this.label2.TabIndex = 7; + this.label2.Text = "Protocol title 2"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(27, 138); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(74, 13); + this.label3.TabIndex = 8; + this.label3.Text = "Protocol title 3"; + // + // protocolTitle1TextBox + // + this.protocolTitle1TextBox.Enabled = false; + this.protocolTitle1TextBox.Location = new System.Drawing.Point(137, 83); + this.protocolTitle1TextBox.Name = "protocolTitle1TextBox"; + this.protocolTitle1TextBox.Size = new System.Drawing.Size(130, 20); + this.protocolTitle1TextBox.TabIndex = 9; + // + // protocolTitle2TextBox + // + this.protocolTitle2TextBox.Enabled = false; + this.protocolTitle2TextBox.Location = new System.Drawing.Point(137, 109); + this.protocolTitle2TextBox.Name = "protocolTitle2TextBox"; + this.protocolTitle2TextBox.Size = new System.Drawing.Size(130, 20); + this.protocolTitle2TextBox.TabIndex = 10; + // + // protocolTitle3TextBox + // + this.protocolTitle3TextBox.Enabled = false; + this.protocolTitle3TextBox.Location = new System.Drawing.Point(137, 135); + this.protocolTitle3TextBox.Name = "protocolTitle3TextBox"; + this.protocolTitle3TextBox.Size = new System.Drawing.Size(130, 20); + this.protocolTitle3TextBox.TabIndex = 11; + // + // protocolTitle4TextBox + // + this.protocolTitle4TextBox.Enabled = false; + this.protocolTitle4TextBox.Location = new System.Drawing.Point(137, 161); + this.protocolTitle4TextBox.Name = "protocolTitle4TextBox"; + this.protocolTitle4TextBox.Size = new System.Drawing.Size(130, 20); + this.protocolTitle4TextBox.TabIndex = 13; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(27, 164); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(74, 13); + this.label4.TabIndex = 12; + this.label4.Text = "Protocol title 4"; + // + // EntryFormCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.protocolTitle4TextBox); + this.Controls.Add(this.label4); + this.Controls.Add(this.protocolTitle3TextBox); + this.Controls.Add(this.protocolTitle2TextBox); + this.Controls.Add(this.protocolTitle1TextBox); + this.Controls.Add(this.label3); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "EntryFormCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox protocolTitle1TextBox; + private System.Windows.Forms.TextBox protocolTitle2TextBox; + private System.Windows.Forms.TextBox protocolTitle3TextBox; + private System.Windows.Forms.TextBox protocolTitle4TextBox; + private System.Windows.Forms.Label label4; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/EntryFormCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/EntryFormCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/EntryFormCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/EntryFormFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/EntryFormFactory.cs new file mode 100644 index 00000000..8f44aa91 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/EntryFormFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DataEntry.Munich3 +{ + public class EntryFormFactory : IComponentFactory + { + public string ClassName { get { return "DataEntryForm-3"; } } + + public void ResetStaticProperties() { EntryForm.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new EntryForm(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new EntryForm(cfg); } + + public IComponentCfg DefaultConfig() { return new EntryFormCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(EntryFormCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/TestStartEndForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/TestStartEndForm.cs new file mode 100644 index 00000000..e064967f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/TestStartEndForm.cs @@ -0,0 +1,405 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using log4net; +using TBF.BenchControl.GenericDevices; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.Munich3 +{ + public partial class TestStartEndForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(TestStartEndForm)); + + // Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + /// Number of water meters + public readonly int WaterMetersCount; + readonly IRegisterReader[] regReaders; + readonly bool[] disabled; + + // To be retrieved after the form closes + public double[] WMStartState; + + // To be retrieved after the form closes + public readonly string[] WMStartStateStr; + + // To be retrieved after the form closes + public double[] WMEndState; + + bool endStates; /// false=start states, true=end states + double refVolume; + double warningLimLo; /// limit to display exclamation mark, typically 2x errLimLo + double warningLimHi; /// limit to display exclamation mark, typically 2x errLimHi + + GroupBox[] groupBoxes; + Label[] labels; + TextBox[] startTextBoxes; + TextBox[] endTextBoxes; + Label[] exclamations; + + + public TestStartEndForm() + { + InitializeComponent(); + ControlBox = false; + + groupBoxes = new GroupBox[] { groupBox1, groupBox2, groupBox3, groupBox4, groupBox5, groupBox6 }; + labels = new Label[] { label1, label2, label3, label4, label5, label6 }; + startTextBoxes = new TextBox[] { startTextBox1, startTextBox2, startTextBox3, startTextBox4, startTextBox5, startTextBox6 }; + endTextBoxes = new TextBox[] { endTextBox1, endTextBox2, endTextBox3, endTextBox4, endTextBox5, endTextBox6 }; + exclamations = new Label[] { exclamation1, exclamation2, exclamation3, exclamation3, exclamation4, exclamation5 }; + + completed = false; + StartForceCloseHandler(); + } + + /// + /// Constructor to fill in start states + /// + /// Number of text boxes for serial numbers + public TestStartEndForm(int waterMetersCount, IRegisterReader[] regReaders, bool[] disabled) + : this() + { + endStates = false; + + this.regReaders = regReaders; + this.WaterMetersCount = Math.Min(waterMetersCount, regReaders.Length); + this.disabled = disabled; + + WMStartState = new double[waterMetersCount]; + WMStartStateStr = new string[waterMetersCount]; + + Height = 70 + 90 * WaterMetersCount; + } + + /// + /// Constructor to fill in end states + /// + /// Number of text boxes for serial numbers + public TestStartEndForm(int waterMetersCount, IRegisterReader[] regReaders, string[] wmStartStateStr, bool[] disabled, + double refVolume, double errLimLo, double errLimHi) + : this() + { + endStates = true; + + this.regReaders = regReaders; + this.WaterMetersCount = Math.Min(waterMetersCount, regReaders.Length); + this.WMStartStateStr = wmStartStateStr; + if (wmStartStateStr == null || wmStartStateStr.Length != this.WaterMetersCount) + throw (new Exception("Invalid 'wmStartStateStr' argument")); + this.disabled = disabled; + this.refVolume = refVolume; + this.warningLimLo = 2 * errLimLo; + this.warningLimHi = 2 * errLimHi; + + WMEndState = new double[waterMetersCount]; + + Height = 70 + 90 * WaterMetersCount; + } + + private void TestStartEndForm_Load(object sender, EventArgs e) + { + /// First 'WaterMetersCount' positions + for (int i = 0; i < WaterMetersCount; i++) + { + if (disabled.Length > i && regReaders[i] == null) disabled[i] = true; + + if (endStates) + { + startTextBoxes[i].Text = WMStartStateStr[i]; + endTextBoxes[i].Enabled = (disabled.Length > i && !disabled[i]); + } + else + { + startTextBoxes[i].Enabled = (disabled.Length > i && !disabled[i]); + } + } + + /// Remaining positions + for (int i = WaterMetersCount; i < 6; i++) + { + groupBoxes[i].Visible = false; + } + + Localize(); + } + + void Localize() + { + Text = Strings.Water_Meter_States; + startLabel.Text = Strings.Start; + endLabel.Text = Strings.End; + okButton.Text = Strings.OkBtnText; + + for (int i = 0; i < WaterMetersCount; i++) + { + groupBoxes[i].Text = string.Format("{0} {1}", Strings.Water_Meter, i + 1); + if (disabled.Length > i && !disabled[i]) + { + labels[i].Text = string.Format("{0} [{1}]", Strings.State, GetUnitStr(regReaders[i].PulsesPerLtr)); + } + else + { + labels[i].Text = string.Empty; + } + } + } + + + string GetUnitStr(double pulsesPerLtr) + { + if (pulsesPerLtr == 1 || pulsesPerLtr <= float.Epsilon) + { + return "l"; + } + else if (pulsesPerLtr == 0.001) + { + return "m3"; + } + else if (pulsesPerLtr == 1000) + { + return "ml"; + } + else + { + return string.Format("{0} l", 1/pulsesPerLtr); + } + } + + + private void okButton_Click(object sender, EventArgs e) + { + try + { + if (endStates) + { + for (int i = 0; i < WaterMetersCount; i++) + { + if (endTextBoxes[i].Enabled) WMEndState[i] = Utils.ParseUDouble(endTextBoxes[i].Text) * regReaders[i].LtrsPerPulse; + } + } + else + { + for (int i = 0; i < WaterMetersCount; i++) + { + if (startTextBoxes[i].Enabled) + { + WMStartStateStr[i] = startTextBoxes[i].Text; + WMStartState[i] = Utils.ParseUDouble(startTextBoxes[i].Text) * regReaders[i].LtrsPerPulse; + } + } + } + } + catch + { + return; + } + + completed = true; + 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) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + + + private void endTextBox1_TextChanged(object sender, EventArgs e) { EndTextChanged(0); } + private void endTextBox2_TextChanged(object sender, EventArgs e) { EndTextChanged(1); } + private void endTextBox3_TextChanged(object sender, EventArgs e) { EndTextChanged(2); } + private void endTextBox4_TextChanged(object sender, EventArgs e) { EndTextChanged(3); } + private void endTextBox5_TextChanged(object sender, EventArgs e) { EndTextChanged(4); } + private void endTextBox6_TextChanged(object sender, EventArgs e) { EndTextChanged(5); } + + void EndTextChanged(int i) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBoxes[i].Text) * regReaders[i].LtrsPerPulse; ; + double startState = Utils.ParseUDouble(startTextBoxes[i].Text) * regReaders[i].LtrsPerPulse; ; + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + + exclamations[i].Visible = (err < warningLimLo) || (warningLimHi < err); + } + + + private void startTextBox1_KeyPress(object sender, KeyPressEventArgs e) + { + if (e.KeyChar == '\r') + { + if (startTextBox2.Enabled) startTextBox2.Focus(); + else if (startTextBox3.Enabled) startTextBox3.Focus(); + else if (startTextBox4.Enabled) startTextBox4.Focus(); + else if (startTextBox5.Enabled) startTextBox5.Focus(); + else if (startTextBox6.Enabled) startTextBox6.Focus(); + } + else if (e.KeyChar == '+') okButton_Click(sender, e); + } + + private void startTextBox2_KeyPress(object sender, KeyPressEventArgs e) + { + if (e.KeyChar == '\r') + { + if (startTextBox3.Enabled) startTextBox3.Focus(); + else if (startTextBox4.Enabled) startTextBox4.Focus(); + else if (startTextBox5.Enabled) startTextBox5.Focus(); + else if (startTextBox6.Enabled) startTextBox6.Focus(); + else if (startTextBox1.Enabled) startTextBox1.Focus(); + } + else if (e.KeyChar == '+') okButton_Click(sender, e); + } + + private void startTextBox3_KeyPress(object sender, KeyPressEventArgs e) + { + if (e.KeyChar == '\r') + { + if (startTextBox4.Enabled) startTextBox4.Focus(); + else if (startTextBox5.Enabled) startTextBox5.Focus(); + else if (startTextBox6.Enabled) startTextBox6.Focus(); + else if (startTextBox1.Enabled) startTextBox1.Focus(); + else if (startTextBox2.Enabled) startTextBox2.Focus(); + } + else if (e.KeyChar == '+') okButton_Click(sender, e); + } + + private void startTextBox4_KeyPress(object sender, KeyPressEventArgs e) + { + if (e.KeyChar == '\r') + { + if (startTextBox5.Enabled) startTextBox5.Focus(); + else if (startTextBox6.Enabled) startTextBox6.Focus(); + else if (startTextBox1.Enabled) startTextBox1.Focus(); + else if (startTextBox2.Enabled) startTextBox2.Focus(); + else if (startTextBox3.Enabled) startTextBox3.Focus(); + } + else if (e.KeyChar == '+') okButton_Click(sender, e); + } + + private void startTextBox5_KeyPress(object sender, KeyPressEventArgs e) + { + if (e.KeyChar == '\r') + { + if (startTextBox6.Enabled) startTextBox6.Focus(); + else if (startTextBox1.Enabled) startTextBox1.Focus(); + else if (startTextBox2.Enabled) startTextBox2.Focus(); + else if (startTextBox3.Enabled) startTextBox3.Focus(); + else if (startTextBox4.Enabled) startTextBox4.Focus(); + } + else if (e.KeyChar == '+') okButton_Click(sender, e); + } + + private void startTextBox6_KeyPress(object sender, KeyPressEventArgs e) + { + if (e.KeyChar == '\r') + { + if (startTextBox1.Enabled) startTextBox1.Focus(); + else if (startTextBox1.Enabled) startTextBox1.Focus(); + else if (startTextBox3.Enabled) startTextBox3.Focus(); + else if (startTextBox4.Enabled) startTextBox4.Focus(); + else if (startTextBox5.Enabled) startTextBox5.Focus(); + } + else if (e.KeyChar == '+') okButton_Click(sender, e); + } + + private void endTextBox1_KeyPress(object sender, KeyPressEventArgs e) + { + if (e.KeyChar == '\r') + { + if (endTextBox2.Enabled) endTextBox2.Focus(); + else if (endTextBox3.Enabled) endTextBox3.Focus(); + else if (endTextBox4.Enabled) endTextBox4.Focus(); + else if (endTextBox5.Enabled) endTextBox5.Focus(); + else if (endTextBox6.Enabled) endTextBox6.Focus(); + } + else if (e.KeyChar == '+') okButton_Click(sender, e); + } + + private void endTextBox2_KeyPress(object sender, KeyPressEventArgs e) + { + if (e.KeyChar == '\r') + { + if (endTextBox3.Enabled) endTextBox3.Focus(); + else if (endTextBox4.Enabled) endTextBox4.Focus(); + else if (endTextBox5.Enabled) endTextBox5.Focus(); + else if (endTextBox6.Enabled) endTextBox6.Focus(); + else if (endTextBox1.Enabled) endTextBox1.Focus(); + } + else if (e.KeyChar == '+') okButton_Click(sender, e); + } + + private void endTextBox3_KeyPress(object sender, KeyPressEventArgs e) + { + if (e.KeyChar == '\r') + { + if (endTextBox4.Enabled) endTextBox4.Focus(); + else if (endTextBox5.Enabled) endTextBox5.Focus(); + else if (endTextBox6.Enabled) endTextBox6.Focus(); + else if (endTextBox1.Enabled) endTextBox1.Focus(); + else if (endTextBox2.Enabled) endTextBox2.Focus(); + } + else if (e.KeyChar == '+') okButton_Click(sender, e); + } + + private void endTextBox4_KeyPress(object sender, KeyPressEventArgs e) + { + if (e.KeyChar == '\r') + { + if (endTextBox5.Enabled) endTextBox5.Focus(); + else if (endTextBox6.Enabled) endTextBox6.Focus(); + else if (endTextBox1.Enabled) endTextBox1.Focus(); + else if (endTextBox2.Enabled) endTextBox2.Focus(); + else if (endTextBox3.Enabled) endTextBox3.Focus(); + } + else if (e.KeyChar == '+') okButton_Click(sender, e); + } + + private void endTextBox5_KeyPress(object sender, KeyPressEventArgs e) + { + if (e.KeyChar == '\r') + { + if (endTextBox6.Enabled) endTextBox6.Focus(); + else if (endTextBox1.Enabled) endTextBox1.Focus(); + else if (endTextBox2.Enabled) endTextBox2.Focus(); + else if (endTextBox3.Enabled) endTextBox3.Focus(); + else if (endTextBox4.Enabled) endTextBox4.Focus(); + } + else if (e.KeyChar == '+') okButton_Click(sender, e); + } + + private void endTextBox6_KeyPress(object sender, KeyPressEventArgs e) + { + if (e.KeyChar == '\r') + { + if (endTextBox1.Enabled) endTextBox1.Focus(); + else if (endTextBox1.Enabled) endTextBox1.Focus(); + else if (endTextBox3.Enabled) endTextBox3.Focus(); + else if (endTextBox4.Enabled) endTextBox4.Focus(); + else if (endTextBox5.Enabled) endTextBox5.Focus(); + } + else if (e.KeyChar == '+') okButton_Click(sender, e); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/TestStartEndForm.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/TestStartEndForm.designer.cs new file mode 100644 index 00000000..01c24c82 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/TestStartEndForm.designer.cs @@ -0,0 +1,512 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.Munich3 +{ + partial class TestStartEndForm + { + /// + /// 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() + { + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.exclamation2 = new System.Windows.Forms.Label(); + this.startTextBox2 = new System.Windows.Forms.TextBox(); + this.endTextBox2 = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.exclamation1 = new System.Windows.Forms.Label(); + this.startTextBox1 = new System.Windows.Forms.TextBox(); + this.endTextBox1 = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.okButton = new System.Windows.Forms.Button(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.exclamation3 = new System.Windows.Forms.Label(); + this.startTextBox3 = new System.Windows.Forms.TextBox(); + this.endTextBox3 = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.exclamation4 = new System.Windows.Forms.Label(); + this.startTextBox4 = new System.Windows.Forms.TextBox(); + this.endTextBox4 = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.groupBox5 = new System.Windows.Forms.GroupBox(); + this.exclamation5 = new System.Windows.Forms.Label(); + this.startTextBox5 = new System.Windows.Forms.TextBox(); + this.endTextBox5 = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.groupBox6 = new System.Windows.Forms.GroupBox(); + this.exclamation6 = new System.Windows.Forms.Label(); + this.startTextBox6 = new System.Windows.Forms.TextBox(); + this.endTextBox6 = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.startLabel = new System.Windows.Forms.Label(); + this.endLabel = new System.Windows.Forms.Label(); + this.groupBox2.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.groupBox4.SuspendLayout(); + this.groupBox5.SuspendLayout(); + this.groupBox6.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.exclamation2); + this.groupBox2.Controls.Add(this.startTextBox2); + this.groupBox2.Controls.Add(this.endTextBox2); + this.groupBox2.Controls.Add(this.label2); + this.groupBox2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox2.ForeColor = System.Drawing.Color.Black; + this.groupBox2.Location = new System.Drawing.Point(25, 122); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(547, 81); + this.groupBox2.TabIndex = 2; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Water Meter 2"; + // + // exclamation2 + // + this.exclamation2.AutoSize = true; + this.exclamation2.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation2.ForeColor = System.Drawing.Color.Red; + this.exclamation2.Location = new System.Drawing.Point(515, 27); + this.exclamation2.Name = "exclamation2"; + this.exclamation2.Size = new System.Drawing.Size(30, 38); + this.exclamation2.TabIndex = 4; + this.exclamation2.Text = "!"; + this.exclamation2.Visible = false; + // + // wmStartStateTextBox2 + // + this.startTextBox2.Enabled = false; + this.startTextBox2.Location = new System.Drawing.Point(164, 31); + this.startTextBox2.Name = "wmStartStateTextBox2"; + this.startTextBox2.Size = new System.Drawing.Size(163, 31); + this.startTextBox2.TabIndex = 3; + this.startTextBox2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox2_KeyPress); + // + // wmEndStateTextBox2 + // + this.endTextBox2.Enabled = false; + this.endTextBox2.Location = new System.Drawing.Point(350, 31); + this.endTextBox2.Name = "wmEndStateTextBox2"; + this.endTextBox2.Size = new System.Drawing.Size(163, 31); + this.endTextBox2.TabIndex = 1; + this.endTextBox2.TextChanged += new System.EventHandler(this.endTextBox2_TextChanged); + this.endTextBox2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox2_KeyPress); + // + // wmStateLabel2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(18, 34); + this.label2.Name = "wmStateLabel2"; + this.label2.Size = new System.Drawing.Size(68, 23); + this.label2.TabIndex = 0; + this.label2.Text = "State:"; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.exclamation1); + this.groupBox1.Controls.Add(this.startTextBox1); + this.groupBox1.Controls.Add(this.endTextBox1); + this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox1.ForeColor = System.Drawing.Color.Black; + this.groupBox1.Location = new System.Drawing.Point(25, 32); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(547, 81); + this.groupBox1.TabIndex = 1; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Water Meter 1"; + // + // exclamation1 + // + this.exclamation1.AutoSize = true; + this.exclamation1.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation1.ForeColor = System.Drawing.Color.Red; + this.exclamation1.Location = new System.Drawing.Point(515, 27); + this.exclamation1.Name = "exclamation1"; + this.exclamation1.Size = new System.Drawing.Size(30, 38); + this.exclamation1.TabIndex = 3; + this.exclamation1.Text = "!"; + this.exclamation1.Visible = false; + // + // wmStartStateTextBox1 + // + this.startTextBox1.Enabled = false; + this.startTextBox1.Location = new System.Drawing.Point(164, 31); + this.startTextBox1.Name = "wmStartStateTextBox1"; + this.startTextBox1.Size = new System.Drawing.Size(163, 31); + this.startTextBox1.TabIndex = 2; + this.startTextBox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox1_KeyPress); + // + // wmEndStateTextBox1 + // + this.endTextBox1.Enabled = false; + this.endTextBox1.Location = new System.Drawing.Point(350, 31); + this.endTextBox1.Name = "wmEndStateTextBox1"; + this.endTextBox1.Size = new System.Drawing.Size(163, 31); + this.endTextBox1.TabIndex = 1; + this.endTextBox1.TextChanged += new System.EventHandler(this.endTextBox1_TextChanged); + this.endTextBox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox1_KeyPress); + // + // wmStateLabel1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(18, 34); + this.label1.Name = "wmStateLabel1"; + this.label1.Size = new System.Drawing.Size(68, 23); + this.label1.TabIndex = 0; + this.label1.Text = "State:"; + // + // okButton + // + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(603, 46); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(98, 63); + this.okButton.TabIndex = 7; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.exclamation3); + this.groupBox3.Controls.Add(this.startTextBox3); + this.groupBox3.Controls.Add(this.endTextBox3); + this.groupBox3.Controls.Add(this.label3); + this.groupBox3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox3.ForeColor = System.Drawing.Color.Black; + this.groupBox3.Location = new System.Drawing.Point(25, 212); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(547, 81); + this.groupBox3.TabIndex = 3; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "Water Meter 3"; + // + // exclamation3 + // + this.exclamation3.AutoSize = true; + this.exclamation3.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation3.ForeColor = System.Drawing.Color.Red; + this.exclamation3.Location = new System.Drawing.Point(515, 27); + this.exclamation3.Name = "exclamation3"; + this.exclamation3.Size = new System.Drawing.Size(30, 38); + this.exclamation3.TabIndex = 5; + this.exclamation3.Text = "!"; + this.exclamation3.Visible = false; + // + // wmStartStateTextBox3 + // + this.startTextBox3.Enabled = false; + this.startTextBox3.Location = new System.Drawing.Point(164, 31); + this.startTextBox3.Name = "wmStartStateTextBox3"; + this.startTextBox3.Size = new System.Drawing.Size(163, 31); + this.startTextBox3.TabIndex = 4; + this.startTextBox3.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox3_KeyPress); + // + // wmEndStateTextBox3 + // + this.endTextBox3.Enabled = false; + this.endTextBox3.Location = new System.Drawing.Point(350, 31); + this.endTextBox3.Name = "wmEndStateTextBox3"; + this.endTextBox3.Size = new System.Drawing.Size(163, 31); + this.endTextBox3.TabIndex = 1; + this.endTextBox3.TextChanged += new System.EventHandler(this.endTextBox3_TextChanged); + this.endTextBox3.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox3_KeyPress); + // + // wmStateLabel3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(18, 34); + this.label3.Name = "wmStateLabel3"; + this.label3.Size = new System.Drawing.Size(68, 23); + this.label3.TabIndex = 0; + this.label3.Text = "State:"; + // + // groupBox4 + // + this.groupBox4.Controls.Add(this.exclamation4); + this.groupBox4.Controls.Add(this.startTextBox4); + this.groupBox4.Controls.Add(this.endTextBox4); + this.groupBox4.Controls.Add(this.label4); + this.groupBox4.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox4.ForeColor = System.Drawing.Color.Black; + this.groupBox4.Location = new System.Drawing.Point(25, 302); + this.groupBox4.Name = "groupBox4"; + this.groupBox4.Size = new System.Drawing.Size(547, 81); + this.groupBox4.TabIndex = 4; + this.groupBox4.TabStop = false; + this.groupBox4.Text = "Water Meter 4"; + // + // exclamation4 + // + this.exclamation4.AutoSize = true; + this.exclamation4.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation4.ForeColor = System.Drawing.Color.Red; + this.exclamation4.Location = new System.Drawing.Point(515, 27); + this.exclamation4.Name = "exclamation4"; + this.exclamation4.Size = new System.Drawing.Size(30, 38); + this.exclamation4.TabIndex = 5; + this.exclamation4.Text = "!"; + this.exclamation4.Visible = false; + // + // wmStartStateTextBox4 + // + this.startTextBox4.Enabled = false; + this.startTextBox4.Location = new System.Drawing.Point(164, 31); + this.startTextBox4.Name = "wmStartStateTextBox4"; + this.startTextBox4.Size = new System.Drawing.Size(163, 31); + this.startTextBox4.TabIndex = 4; + this.startTextBox4.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox4_KeyPress); + // + // wmEndStateTextBox4 + // + this.endTextBox4.Enabled = false; + this.endTextBox4.Location = new System.Drawing.Point(350, 31); + this.endTextBox4.Name = "wmEndStateTextBox4"; + this.endTextBox4.Size = new System.Drawing.Size(163, 31); + this.endTextBox4.TabIndex = 1; + this.endTextBox4.TextChanged += new System.EventHandler(this.endTextBox4_TextChanged); + this.endTextBox4.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox4_KeyPress); + // + // wmStateLabel4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(18, 34); + this.label4.Name = "wmStateLabel4"; + this.label4.Size = new System.Drawing.Size(68, 23); + this.label4.TabIndex = 0; + this.label4.Text = "State:"; + // + // groupBox5 + // + this.groupBox5.Controls.Add(this.exclamation5); + this.groupBox5.Controls.Add(this.startTextBox5); + this.groupBox5.Controls.Add(this.endTextBox5); + this.groupBox5.Controls.Add(this.label5); + this.groupBox5.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox5.ForeColor = System.Drawing.Color.Black; + this.groupBox5.Location = new System.Drawing.Point(25, 392); + this.groupBox5.Name = "groupBox5"; + this.groupBox5.Size = new System.Drawing.Size(547, 81); + this.groupBox5.TabIndex = 5; + this.groupBox5.TabStop = false; + this.groupBox5.Text = "Water Meter 5"; + // + // exclamation5 + // + this.exclamation5.AutoSize = true; + this.exclamation5.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation5.ForeColor = System.Drawing.Color.Red; + this.exclamation5.Location = new System.Drawing.Point(515, 27); + this.exclamation5.Name = "exclamation5"; + this.exclamation5.Size = new System.Drawing.Size(30, 38); + this.exclamation5.TabIndex = 5; + this.exclamation5.Text = "!"; + this.exclamation5.Visible = false; + // + // wmStartStateTextBox5 + // + this.startTextBox5.Enabled = false; + this.startTextBox5.Location = new System.Drawing.Point(164, 31); + this.startTextBox5.Name = "wmStartStateTextBox5"; + this.startTextBox5.Size = new System.Drawing.Size(163, 31); + this.startTextBox5.TabIndex = 4; + this.startTextBox5.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox5_KeyPress); + // + // wmEndStateTextBox5 + // + this.endTextBox5.Enabled = false; + this.endTextBox5.Location = new System.Drawing.Point(350, 31); + this.endTextBox5.Name = "wmEndStateTextBox5"; + this.endTextBox5.Size = new System.Drawing.Size(163, 31); + this.endTextBox5.TabIndex = 1; + this.endTextBox5.TextChanged += new System.EventHandler(this.endTextBox5_TextChanged); + this.endTextBox5.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox5_KeyPress); + // + // wmStateLabel5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(18, 34); + this.label5.Name = "wmStateLabel5"; + this.label5.Size = new System.Drawing.Size(68, 23); + this.label5.TabIndex = 0; + this.label5.Text = "State:"; + // + // groupBox6 + // + this.groupBox6.Controls.Add(this.exclamation6); + this.groupBox6.Controls.Add(this.startTextBox6); + this.groupBox6.Controls.Add(this.endTextBox6); + this.groupBox6.Controls.Add(this.label6); + this.groupBox6.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox6.ForeColor = System.Drawing.Color.Black; + this.groupBox6.Location = new System.Drawing.Point(25, 482); + this.groupBox6.Name = "groupBox6"; + this.groupBox6.Size = new System.Drawing.Size(547, 81); + this.groupBox6.TabIndex = 6; + this.groupBox6.TabStop = false; + this.groupBox6.Text = "Water Meter 6"; + // + // exclamation6 + // + this.exclamation6.AutoSize = true; + this.exclamation6.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation6.ForeColor = System.Drawing.Color.Red; + this.exclamation6.Location = new System.Drawing.Point(515, 27); + this.exclamation6.Name = "exclamation6"; + this.exclamation6.Size = new System.Drawing.Size(30, 38); + this.exclamation6.TabIndex = 5; + this.exclamation6.Text = "!"; + this.exclamation6.Visible = false; + // + // wmStartStateTextBox6 + // + this.startTextBox6.Enabled = false; + this.startTextBox6.Location = new System.Drawing.Point(164, 31); + this.startTextBox6.Name = "wmStartStateTextBox6"; + this.startTextBox6.Size = new System.Drawing.Size(163, 31); + this.startTextBox6.TabIndex = 4; + this.startTextBox6.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox6_KeyPress); + // + // wmEndStateTextBox6 + // + this.endTextBox6.Enabled = false; + this.endTextBox6.Location = new System.Drawing.Point(350, 31); + this.endTextBox6.Name = "wmEndStateTextBox6"; + this.endTextBox6.Size = new System.Drawing.Size(163, 31); + this.endTextBox6.TabIndex = 1; + this.endTextBox6.TextChanged += new System.EventHandler(this.endTextBox6_TextChanged); + this.endTextBox6.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox6_KeyPress); + // + // wmStateLabel6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(18, 34); + this.label6.Name = "wmStateLabel6"; + this.label6.Size = new System.Drawing.Size(68, 23); + this.label6.TabIndex = 0; + this.label6.Text = "State:"; + // + // startLabel + // + this.startLabel.AutoSize = true; + this.startLabel.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startLabel.Location = new System.Drawing.Point(245, 11); + this.startLabel.Name = "startLabel"; + this.startLabel.Size = new System.Drawing.Size(56, 23); + this.startLabel.TabIndex = 8; + this.startLabel.Text = "Start"; + // + // endLabel + // + this.endLabel.AutoSize = true; + this.endLabel.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endLabel.Location = new System.Drawing.Point(431, 11); + this.endLabel.Name = "endLabel"; + this.endLabel.Size = new System.Drawing.Size(46, 23); + this.endLabel.TabIndex = 9; + this.endLabel.Text = "End"; + // + // TestStartEndForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.ClientSize = new System.Drawing.Size(729, 586); + this.Controls.Add(this.endLabel); + this.Controls.Add(this.startLabel); + this.Controls.Add(this.groupBox6); + this.Controls.Add(this.groupBox5); + this.Controls.Add(this.groupBox4); + this.Controls.Add(this.groupBox3); + this.Controls.Add(this.okButton); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.groupBox1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "TestStartEndForm"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "End States"; + this.TopMost = true; + this.Load += new System.EventHandler(this.TestStartEndForm_Load); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.groupBox4.ResumeLayout(false); + this.groupBox4.PerformLayout(); + this.groupBox5.ResumeLayout(false); + this.groupBox5.PerformLayout(); + this.groupBox6.ResumeLayout(false); + this.groupBox6.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TextBox endTextBox2; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TextBox endTextBox1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.TextBox endTextBox3; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.GroupBox groupBox4; + private System.Windows.Forms.TextBox endTextBox4; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.GroupBox groupBox5; + private System.Windows.Forms.TextBox endTextBox5; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.GroupBox groupBox6; + private System.Windows.Forms.TextBox endTextBox6; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TextBox startTextBox2; + private System.Windows.Forms.TextBox startTextBox1; + private System.Windows.Forms.TextBox startTextBox3; + private System.Windows.Forms.TextBox startTextBox4; + private System.Windows.Forms.TextBox startTextBox5; + private System.Windows.Forms.TextBox startTextBox6; + private System.Windows.Forms.Label startLabel; + private System.Windows.Forms.Label endLabel; + private System.Windows.Forms.Label exclamation2; + private System.Windows.Forms.Label exclamation1; + private System.Windows.Forms.Label exclamation3; + private System.Windows.Forms.Label exclamation4; + private System.Windows.Forms.Label exclamation5; + private System.Windows.Forms.Label exclamation6; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/TestStartEndForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/TestStartEndForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Munich3/TestStartEndForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/CycleBeginningForm.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/CycleBeginningForm.Designer.cs new file mode 100644 index 00000000..64125700 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/CycleBeginningForm.Designer.cs @@ -0,0 +1,730 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.Standard12 +{ + partial class CycleBeginningForm + { + /// + /// 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(CycleBeginningForm)); + this.okButton = new System.Windows.Forms.Button(); + this.orderGroupBox = new System.Windows.Forms.GroupBox(); + this.orderComboBox = new System.Windows.Forms.ComboBox(); + this.clearButton = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.checkBox1 = new System.Windows.Forms.CheckBox(); + this.checkBox2 = new System.Windows.Forms.CheckBox(); + this.comboBox2 = new System.Windows.Forms.ComboBox(); + this.label2 = new System.Windows.Forms.Label(); + this.checkBox3 = new System.Windows.Forms.CheckBox(); + this.comboBox3 = new System.Windows.Forms.ComboBox(); + this.label3 = new System.Windows.Forms.Label(); + this.checkBox4 = new System.Windows.Forms.CheckBox(); + this.comboBox4 = new System.Windows.Forms.ComboBox(); + this.label4 = new System.Windows.Forms.Label(); + this.checkBox5 = new System.Windows.Forms.CheckBox(); + this.comboBox5 = new System.Windows.Forms.ComboBox(); + this.label5 = new System.Windows.Forms.Label(); + this.checkBox6 = new System.Windows.Forms.CheckBox(); + this.comboBox6 = new System.Windows.Forms.ComboBox(); + this.label6 = new System.Windows.Forms.Label(); + this.checkBox7 = new System.Windows.Forms.CheckBox(); + this.comboBox7 = new System.Windows.Forms.ComboBox(); + this.label7 = new System.Windows.Forms.Label(); + this.checkBox8 = new System.Windows.Forms.CheckBox(); + this.comboBox8 = new System.Windows.Forms.ComboBox(); + this.label8 = new System.Windows.Forms.Label(); + this.checkBox9 = new System.Windows.Forms.CheckBox(); + this.comboBox9 = new System.Windows.Forms.ComboBox(); + this.label9 = new System.Windows.Forms.Label(); + this.checkBox10 = new System.Windows.Forms.CheckBox(); + this.comboBox10 = new System.Windows.Forms.ComboBox(); + this.label10 = new System.Windows.Forms.Label(); + this.checkBox11 = new System.Windows.Forms.CheckBox(); + this.comboBox11 = new System.Windows.Forms.ComboBox(); + this.label11 = new System.Windows.Forms.Label(); + this.checkBox12 = new System.Windows.Forms.CheckBox(); + this.comboBox12 = new System.Windows.Forms.ComboBox(); + this.label12 = new System.Windows.Forms.Label(); + this.extensionsGroupBox = new System.Windows.Forms.GroupBox(); + this.remarkTextBox = new System.Windows.Forms.TextBox(); + this.label16 = new System.Windows.Forms.Label(); + this.snSuffixTextBox = new System.Windows.Forms.TextBox(); + this.label15 = new System.Windows.Forms.Label(); + this.snPrefixTextBox = new System.Windows.Forms.TextBox(); + this.label14 = new System.Windows.Forms.Label(); + this.idNumberTextBox = new System.Windows.Forms.TextBox(); + this.label13 = new System.Windows.Forms.Label(); + this.ext4Label = new System.Windows.Forms.Label(); + this.ext4TextBox = new System.Windows.Forms.TextBox(); + this.ext3Label = new System.Windows.Forms.Label(); + this.ext3TextBox = new System.Windows.Forms.TextBox(); + this.ext2Label = new System.Windows.Forms.Label(); + this.ext2TextBox = new System.Windows.Forms.TextBox(); + this.ext1Label = new System.Windows.Forms.Label(); + this.ext1TextBox = new System.Windows.Forms.TextBox(); + this.autoSNButton = new System.Windows.Forms.Button(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.pictureBox2 = new System.Windows.Forms.PictureBox(); + this.pictureBox3 = new System.Windows.Forms.PictureBox(); + this.pictureBox4 = new System.Windows.Forms.PictureBox(); + this.pictureBox5 = new System.Windows.Forms.PictureBox(); + this.pictureBox6 = new System.Windows.Forms.PictureBox(); + this.pictureBox7 = new System.Windows.Forms.PictureBox(); + this.pictureBox8 = new System.Windows.Forms.PictureBox(); + this.pictureBox9 = new System.Windows.Forms.PictureBox(); + this.pictureBox10 = new System.Windows.Forms.PictureBox(); + this.pictureBox11 = new System.Windows.Forms.PictureBox(); + this.pictureBox12 = new System.Windows.Forms.PictureBox(); + this.orderGroupBox.SuspendLayout(); + this.extensionsGroupBox.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox5)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox6)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox7)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox8)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox9)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox10)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox11)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox12)).BeginInit(); + this.SuspendLayout(); + // + // okButton + // + resources.ApplyResources(this.okButton, "okButton"); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Name = "okButton"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // orderGroupBox + // + this.orderGroupBox.Controls.Add(this.orderComboBox); + resources.ApplyResources(this.orderGroupBox, "orderGroupBox"); + this.orderGroupBox.ForeColor = System.Drawing.Color.Black; + this.orderGroupBox.Name = "orderGroupBox"; + this.orderGroupBox.TabStop = false; + // + // orderComboBox + // + this.orderComboBox.FormattingEnabled = true; + resources.ApplyResources(this.orderComboBox, "orderComboBox"); + this.orderComboBox.Name = "orderComboBox"; + // + // clearButton + // + resources.ApplyResources(this.clearButton, "clearButton"); + this.clearButton.ForeColor = System.Drawing.Color.Black; + this.clearButton.Name = "clearButton"; + this.clearButton.UseVisualStyleBackColor = true; + this.clearButton.Click += new System.EventHandler(this.clearButton_Click); + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // comboBox1 + // + resources.ApplyResources(this.comboBox1, "comboBox1"); + this.comboBox1.FormattingEnabled = true; + this.comboBox1.Name = "comboBox1"; + this.comboBox1.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged); + this.comboBox1.TextChanged += new System.EventHandler(this.comboBox1_TextChanged); + this.comboBox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox1_KeyPress); + // + // checkBox1 + // + resources.ApplyResources(this.checkBox1, "checkBox1"); + this.checkBox1.Name = "checkBox1"; + this.checkBox1.UseVisualStyleBackColor = true; + // + // checkBox2 + // + resources.ApplyResources(this.checkBox2, "checkBox2"); + this.checkBox2.Name = "checkBox2"; + this.checkBox2.UseVisualStyleBackColor = true; + // + // comboBox2 + // + resources.ApplyResources(this.comboBox2, "comboBox2"); + this.comboBox2.FormattingEnabled = true; + this.comboBox2.Name = "comboBox2"; + this.comboBox2.SelectedIndexChanged += new System.EventHandler(this.comboBox2_SelectedIndexChanged); + this.comboBox2.TextChanged += new System.EventHandler(this.comboBox2_TextChanged); + this.comboBox2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox2_KeyPress); + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // checkBox3 + // + resources.ApplyResources(this.checkBox3, "checkBox3"); + this.checkBox3.Name = "checkBox3"; + this.checkBox3.UseVisualStyleBackColor = true; + // + // comboBox3 + // + resources.ApplyResources(this.comboBox3, "comboBox3"); + this.comboBox3.FormattingEnabled = true; + this.comboBox3.Name = "comboBox3"; + this.comboBox3.SelectedIndexChanged += new System.EventHandler(this.comboBox3_SelectedIndexChanged); + this.comboBox3.TextChanged += new System.EventHandler(this.comboBox3_TextChanged); + this.comboBox3.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox3_KeyPress); + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // + // checkBox4 + // + resources.ApplyResources(this.checkBox4, "checkBox4"); + this.checkBox4.Name = "checkBox4"; + this.checkBox4.UseVisualStyleBackColor = true; + // + // comboBox4 + // + resources.ApplyResources(this.comboBox4, "comboBox4"); + this.comboBox4.FormattingEnabled = true; + this.comboBox4.Name = "comboBox4"; + this.comboBox4.SelectedIndexChanged += new System.EventHandler(this.comboBox4_SelectedIndexChanged); + this.comboBox4.TextChanged += new System.EventHandler(this.comboBox4_TextChanged); + this.comboBox4.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox4_KeyPress); + // + // label4 + // + resources.ApplyResources(this.label4, "label4"); + this.label4.Name = "label4"; + // + // checkBox5 + // + resources.ApplyResources(this.checkBox5, "checkBox5"); + this.checkBox5.Name = "checkBox5"; + this.checkBox5.UseVisualStyleBackColor = true; + // + // comboBox5 + // + resources.ApplyResources(this.comboBox5, "comboBox5"); + this.comboBox5.FormattingEnabled = true; + this.comboBox5.Name = "comboBox5"; + this.comboBox5.SelectedIndexChanged += new System.EventHandler(this.comboBox5_SelectedIndexChanged); + this.comboBox5.TextChanged += new System.EventHandler(this.comboBox5_TextChanged); + this.comboBox5.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox5_KeyPress); + // + // label5 + // + resources.ApplyResources(this.label5, "label5"); + this.label5.Name = "label5"; + // + // checkBox6 + // + resources.ApplyResources(this.checkBox6, "checkBox6"); + this.checkBox6.Name = "checkBox6"; + this.checkBox6.UseVisualStyleBackColor = true; + // + // comboBox6 + // + resources.ApplyResources(this.comboBox6, "comboBox6"); + this.comboBox6.FormattingEnabled = true; + this.comboBox6.Name = "comboBox6"; + this.comboBox6.SelectedIndexChanged += new System.EventHandler(this.comboBox6_SelectedIndexChanged); + this.comboBox6.TextChanged += new System.EventHandler(this.comboBox6_TextChanged); + this.comboBox6.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox6_KeyPress); + // + // label6 + // + resources.ApplyResources(this.label6, "label6"); + this.label6.Name = "label6"; + // + // checkBox7 + // + resources.ApplyResources(this.checkBox7, "checkBox7"); + this.checkBox7.Name = "checkBox7"; + this.checkBox7.UseVisualStyleBackColor = true; + // + // comboBox7 + // + resources.ApplyResources(this.comboBox7, "comboBox7"); + this.comboBox7.FormattingEnabled = true; + this.comboBox7.Name = "comboBox7"; + this.comboBox7.SelectedIndexChanged += new System.EventHandler(this.comboBox7_SelectedIndexChanged); + this.comboBox7.TextChanged += new System.EventHandler(this.comboBox7_TextChanged); + this.comboBox7.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox7_KeyPress); + // + // label7 + // + resources.ApplyResources(this.label7, "label7"); + this.label7.Name = "label7"; + // + // checkBox8 + // + resources.ApplyResources(this.checkBox8, "checkBox8"); + this.checkBox8.Name = "checkBox8"; + this.checkBox8.UseVisualStyleBackColor = true; + // + // comboBox8 + // + resources.ApplyResources(this.comboBox8, "comboBox8"); + this.comboBox8.FormattingEnabled = true; + this.comboBox8.Name = "comboBox8"; + this.comboBox8.SelectedIndexChanged += new System.EventHandler(this.comboBox8_SelectedIndexChanged); + this.comboBox8.TextChanged += new System.EventHandler(this.comboBox8_TextChanged); + this.comboBox8.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox8_KeyPress); + // + // label8 + // + resources.ApplyResources(this.label8, "label8"); + this.label8.Name = "label8"; + // + // checkBox9 + // + resources.ApplyResources(this.checkBox9, "checkBox9"); + this.checkBox9.Name = "checkBox9"; + this.checkBox9.UseVisualStyleBackColor = true; + // + // comboBox9 + // + resources.ApplyResources(this.comboBox9, "comboBox9"); + this.comboBox9.FormattingEnabled = true; + this.comboBox9.Name = "comboBox9"; + this.comboBox9.SelectedIndexChanged += new System.EventHandler(this.comboBox9_SelectedIndexChanged); + this.comboBox9.TextChanged += new System.EventHandler(this.comboBox9_TextChanged); + this.comboBox9.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox9_KeyPress); + // + // label9 + // + resources.ApplyResources(this.label9, "label9"); + this.label9.Name = "label9"; + // + // checkBox10 + // + resources.ApplyResources(this.checkBox10, "checkBox10"); + this.checkBox10.Name = "checkBox10"; + this.checkBox10.UseVisualStyleBackColor = true; + // + // comboBox10 + // + resources.ApplyResources(this.comboBox10, "comboBox10"); + this.comboBox10.FormattingEnabled = true; + this.comboBox10.Name = "comboBox10"; + this.comboBox10.SelectedIndexChanged += new System.EventHandler(this.comboBox10_SelectedIndexChanged); + this.comboBox10.TextChanged += new System.EventHandler(this.comboBox10_TextChanged); + this.comboBox10.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox10_KeyPress); + // + // label10 + // + resources.ApplyResources(this.label10, "label10"); + this.label10.Name = "label10"; + // + // checkBox11 + // + resources.ApplyResources(this.checkBox11, "checkBox11"); + this.checkBox11.Name = "checkBox11"; + this.checkBox11.UseVisualStyleBackColor = true; + // + // comboBox11 + // + resources.ApplyResources(this.comboBox11, "comboBox11"); + this.comboBox11.FormattingEnabled = true; + this.comboBox11.Name = "comboBox11"; + this.comboBox11.SelectedIndexChanged += new System.EventHandler(this.comboBox11_SelectedIndexChanged); + this.comboBox11.TextChanged += new System.EventHandler(this.comboBox11_TextChanged); + this.comboBox11.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox11_KeyPress); + // + // label11 + // + resources.ApplyResources(this.label11, "label11"); + this.label11.Name = "label11"; + // + // checkBox12 + // + resources.ApplyResources(this.checkBox12, "checkBox12"); + this.checkBox12.Name = "checkBox12"; + this.checkBox12.UseVisualStyleBackColor = true; + // + // comboBox12 + // + resources.ApplyResources(this.comboBox12, "comboBox12"); + this.comboBox12.FormattingEnabled = true; + this.comboBox12.Name = "comboBox12"; + this.comboBox12.SelectedIndexChanged += new System.EventHandler(this.comboBox12_SelectedIndexChanged); + this.comboBox12.TextChanged += new System.EventHandler(this.comboBox12_TextChanged); + this.comboBox12.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox12_KeyPress); + // + // label12 + // + resources.ApplyResources(this.label12, "label12"); + this.label12.Name = "label12"; + // + // extensionsGroupBox + // + this.extensionsGroupBox.Controls.Add(this.remarkTextBox); + this.extensionsGroupBox.Controls.Add(this.label16); + this.extensionsGroupBox.Controls.Add(this.snSuffixTextBox); + this.extensionsGroupBox.Controls.Add(this.label15); + this.extensionsGroupBox.Controls.Add(this.snPrefixTextBox); + this.extensionsGroupBox.Controls.Add(this.label14); + this.extensionsGroupBox.Controls.Add(this.idNumberTextBox); + this.extensionsGroupBox.Controls.Add(this.label13); + this.extensionsGroupBox.Controls.Add(this.ext4Label); + this.extensionsGroupBox.Controls.Add(this.ext4TextBox); + this.extensionsGroupBox.Controls.Add(this.ext3Label); + this.extensionsGroupBox.Controls.Add(this.ext3TextBox); + this.extensionsGroupBox.Controls.Add(this.ext2Label); + this.extensionsGroupBox.Controls.Add(this.ext2TextBox); + this.extensionsGroupBox.Controls.Add(this.ext1Label); + this.extensionsGroupBox.Controls.Add(this.ext1TextBox); + resources.ApplyResources(this.extensionsGroupBox, "extensionsGroupBox"); + this.extensionsGroupBox.Name = "extensionsGroupBox"; + this.extensionsGroupBox.TabStop = false; + // + // remarkTextBox + // + resources.ApplyResources(this.remarkTextBox, "remarkTextBox"); + this.remarkTextBox.Name = "remarkTextBox"; + // + // label16 + // + resources.ApplyResources(this.label16, "label16"); + this.label16.Name = "label16"; + // + // snSuffixTextBox + // + resources.ApplyResources(this.snSuffixTextBox, "snSuffixTextBox"); + this.snSuffixTextBox.Name = "snSuffixTextBox"; + // + // label15 + // + resources.ApplyResources(this.label15, "label15"); + this.label15.Name = "label15"; + // + // snPrefixTextBox + // + resources.ApplyResources(this.snPrefixTextBox, "snPrefixTextBox"); + this.snPrefixTextBox.Name = "snPrefixTextBox"; + // + // label14 + // + resources.ApplyResources(this.label14, "label14"); + this.label14.Name = "label14"; + // + // idNumberTextBox + // + resources.ApplyResources(this.idNumberTextBox, "idNumberTextBox"); + this.idNumberTextBox.Name = "idNumberTextBox"; + // + // label13 + // + resources.ApplyResources(this.label13, "label13"); + this.label13.Name = "label13"; + // + // ext4Label + // + resources.ApplyResources(this.ext4Label, "ext4Label"); + this.ext4Label.Name = "ext4Label"; + // + // ext4TextBox + // + resources.ApplyResources(this.ext4TextBox, "ext4TextBox"); + this.ext4TextBox.Name = "ext4TextBox"; + // + // ext3Label + // + resources.ApplyResources(this.ext3Label, "ext3Label"); + this.ext3Label.Name = "ext3Label"; + // + // ext3TextBox + // + resources.ApplyResources(this.ext3TextBox, "ext3TextBox"); + this.ext3TextBox.Name = "ext3TextBox"; + // + // ext2Label + // + resources.ApplyResources(this.ext2Label, "ext2Label"); + this.ext2Label.Name = "ext2Label"; + // + // ext2TextBox + // + resources.ApplyResources(this.ext2TextBox, "ext2TextBox"); + this.ext2TextBox.Name = "ext2TextBox"; + // + // ext1Label + // + resources.ApplyResources(this.ext1Label, "ext1Label"); + this.ext1Label.Name = "ext1Label"; + // + // ext1TextBox + // + resources.ApplyResources(this.ext1TextBox, "ext1TextBox"); + this.ext1TextBox.Name = "ext1TextBox"; + this.ext1TextBox.TextChanged += new System.EventHandler(this.ext1TextBox_TextChanged); + // + // autoSNButton + // + resources.ApplyResources(this.autoSNButton, "autoSNButton"); + this.autoSNButton.ForeColor = System.Drawing.Color.Black; + this.autoSNButton.Name = "autoSNButton"; + this.autoSNButton.UseVisualStyleBackColor = true; + this.autoSNButton.Click += new System.EventHandler(this.autoSNButton_Click); + // + // pictureBox1 + // + resources.ApplyResources(this.pictureBox1, "pictureBox1"); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.TabStop = false; + // + // pictureBox2 + // + resources.ApplyResources(this.pictureBox2, "pictureBox2"); + this.pictureBox2.Name = "pictureBox2"; + this.pictureBox2.TabStop = false; + // + // pictureBox3 + // + resources.ApplyResources(this.pictureBox3, "pictureBox3"); + this.pictureBox3.Name = "pictureBox3"; + this.pictureBox3.TabStop = false; + // + // pictureBox4 + // + resources.ApplyResources(this.pictureBox4, "pictureBox4"); + this.pictureBox4.Name = "pictureBox4"; + this.pictureBox4.TabStop = false; + // + // pictureBox5 + // + resources.ApplyResources(this.pictureBox5, "pictureBox5"); + this.pictureBox5.Name = "pictureBox5"; + this.pictureBox5.TabStop = false; + // + // pictureBox6 + // + resources.ApplyResources(this.pictureBox6, "pictureBox6"); + this.pictureBox6.Name = "pictureBox6"; + this.pictureBox6.TabStop = false; + // + // pictureBox7 + // + resources.ApplyResources(this.pictureBox7, "pictureBox7"); + this.pictureBox7.Name = "pictureBox7"; + this.pictureBox7.TabStop = false; + // + // pictureBox8 + // + resources.ApplyResources(this.pictureBox8, "pictureBox8"); + this.pictureBox8.Name = "pictureBox8"; + this.pictureBox8.TabStop = false; + // + // pictureBox9 + // + resources.ApplyResources(this.pictureBox9, "pictureBox9"); + this.pictureBox9.Name = "pictureBox9"; + this.pictureBox9.TabStop = false; + // + // pictureBox10 + // + resources.ApplyResources(this.pictureBox10, "pictureBox10"); + this.pictureBox10.Name = "pictureBox10"; + this.pictureBox10.TabStop = false; + // + // pictureBox11 + // + resources.ApplyResources(this.pictureBox11, "pictureBox11"); + this.pictureBox11.Name = "pictureBox11"; + this.pictureBox11.TabStop = false; + // + // pictureBox12 + // + resources.ApplyResources(this.pictureBox12, "pictureBox12"); + this.pictureBox12.Name = "pictureBox12"; + this.pictureBox12.TabStop = false; + // + // CycleBeginningForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + 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.autoSNButton); + this.Controls.Add(this.extensionsGroupBox); + this.Controls.Add(this.checkBox12); + this.Controls.Add(this.comboBox12); + this.Controls.Add(this.label12); + this.Controls.Add(this.checkBox11); + this.Controls.Add(this.comboBox11); + this.Controls.Add(this.label11); + this.Controls.Add(this.checkBox10); + this.Controls.Add(this.comboBox10); + this.Controls.Add(this.label10); + this.Controls.Add(this.checkBox9); + this.Controls.Add(this.comboBox9); + this.Controls.Add(this.label9); + this.Controls.Add(this.checkBox8); + this.Controls.Add(this.comboBox8); + this.Controls.Add(this.label8); + this.Controls.Add(this.checkBox7); + this.Controls.Add(this.comboBox7); + this.Controls.Add(this.label7); + this.Controls.Add(this.checkBox6); + this.Controls.Add(this.comboBox6); + this.Controls.Add(this.label6); + this.Controls.Add(this.checkBox5); + this.Controls.Add(this.comboBox5); + this.Controls.Add(this.label5); + this.Controls.Add(this.checkBox4); + this.Controls.Add(this.comboBox4); + this.Controls.Add(this.label4); + this.Controls.Add(this.checkBox3); + this.Controls.Add(this.comboBox3); + this.Controls.Add(this.label3); + this.Controls.Add(this.checkBox2); + this.Controls.Add(this.comboBox2); + this.Controls.Add(this.label2); + this.Controls.Add(this.checkBox1); + this.Controls.Add(this.comboBox1); + this.Controls.Add(this.label1); + this.Controls.Add(this.clearButton); + this.Controls.Add(this.orderGroupBox); + this.Controls.Add(this.okButton); + this.ForeColor = System.Drawing.Color.Black; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "CycleBeginningForm"; + this.TopMost = true; + this.Load += new System.EventHandler(this.CycleBeginningForm_Load); + this.orderGroupBox.ResumeLayout(false); + this.extensionsGroupBox.ResumeLayout(false); + this.extensionsGroupBox.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox5)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox6)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox7)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox8)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox9)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox10)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox11)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox12)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.GroupBox orderGroupBox; + private System.Windows.Forms.ComboBox orderComboBox; + private System.Windows.Forms.Button clearButton; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox comboBox1; + private System.Windows.Forms.CheckBox checkBox1; + private System.Windows.Forms.CheckBox checkBox2; + private System.Windows.Forms.ComboBox comboBox2; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.CheckBox checkBox3; + private System.Windows.Forms.ComboBox comboBox3; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.CheckBox checkBox4; + private System.Windows.Forms.ComboBox comboBox4; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.CheckBox checkBox5; + private System.Windows.Forms.ComboBox comboBox5; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.CheckBox checkBox6; + private System.Windows.Forms.ComboBox comboBox6; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.CheckBox checkBox7; + private System.Windows.Forms.ComboBox comboBox7; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.CheckBox checkBox8; + private System.Windows.Forms.ComboBox comboBox8; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.CheckBox checkBox9; + private System.Windows.Forms.ComboBox comboBox9; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.CheckBox checkBox10; + private System.Windows.Forms.ComboBox comboBox10; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.CheckBox checkBox11; + private System.Windows.Forms.ComboBox comboBox11; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.CheckBox checkBox12; + private System.Windows.Forms.ComboBox comboBox12; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.GroupBox extensionsGroupBox; + private System.Windows.Forms.Label ext4Label; + private System.Windows.Forms.TextBox ext4TextBox; + private System.Windows.Forms.Label ext3Label; + private System.Windows.Forms.TextBox ext3TextBox; + private System.Windows.Forms.Label ext2Label; + private System.Windows.Forms.TextBox ext2TextBox; + private System.Windows.Forms.Label ext1Label; + private System.Windows.Forms.TextBox ext1TextBox; + private System.Windows.Forms.TextBox remarkTextBox; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.TextBox snSuffixTextBox; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.TextBox snPrefixTextBox; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.TextBox idNumberTextBox; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.Button autoSNButton; + 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; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/CycleBeginningForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/CycleBeginningForm.cs new file mode 100644 index 00000000..e9ac94a9 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/CycleBeginningForm.cs @@ -0,0 +1,530 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Windows.Forms; +using log4net; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.Standard12 +{ + public partial class CycleBeginningForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(CycleBeginningForm)); + + readonly Results.Entities.WaterMeter[] WaterMeters; + + /// Number of water meters + public readonly int WaterMetersCount; + public readonly bool AtTheEnd; + public readonly bool SensusExtensions; + + /// To be retrieved after the form is closed + public string PurchaseOrder; + public string[] SNText; + public bool[] Disabled; + + public string IdNumber; + public string SnPrefix; + public string SnSuffix; + public string Remark; + + /// Is set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + /// Number of text boxes for serial numbers + int textBoxesCount; + Label[] labels; + ComboBox[] comboBoxes; + CheckBox[] checkBoxes; + PictureBox[] pictureBoxes; + IList enabledComboBoxes; + + + /// Parameterless constructor for common functionality + public CycleBeginningForm() + { + InitializeComponent(); + ControlBox = false; + + labels = new Label[] { label1, label2, label3, label4, label5, label6, + label7, label8, label9, label10, label11, label12 }; + + comboBoxes = new ComboBox[] { comboBox1, comboBox2, comboBox3, comboBox4, comboBox5, comboBox6, + comboBox7, comboBox8, comboBox9, comboBox10, comboBox11, comboBox12 }; + + checkBoxes = new CheckBox[] { checkBox1, checkBox2, checkBox3, checkBox4, checkBox5, checkBox6, + checkBox7, checkBox8, checkBox9, checkBox10, checkBox11, checkBox12 }; + + pictureBoxes = new PictureBox[] { pictureBox1, pictureBox2, pictureBox3, pictureBox4, pictureBox5, pictureBox6, + pictureBox7, pictureBox8, pictureBox9, pictureBox10, pictureBox11, pictureBox12 }; + + if (labels.Length != comboBoxes.Length || labels.Length != checkBoxes.Length) throw new Exception("Error in CycleBeginningForm()"); + + textBoxesCount = labels.Length; + + enabledComboBoxes = new List(); + + completed = false; + StartForceCloseHandler(); + } + + /// + /// Constructor + /// + /// Number of text boxes for serial numbers + public CycleBeginningForm(Results.Entities.WaterMeter[] waterMeters, bool atTheEnd, bool sensusExtensions) + : this() + { + this.WaterMeters = waterMeters; + this.WaterMetersCount = waterMeters.Length; + this.AtTheEnd = atTheEnd; + this.SensusExtensions = sensusExtensions; + SNText = new string[WaterMetersCount]; + Disabled = new bool[WaterMetersCount]; + + ShuffleTextBoxes(Config.Data.WMsCount, Config.Data.LineSize); + + foreach (var wm in WaterMeters) if (wm != null) wm.Passed = wm.PassedFromTests(); + + Height = 147 + WaterMetersCount * 45; /// Adjust the window size + + if (sensusExtensions) + { + if (Height < 605) Height = 605; /// Minimum height for the extensionsGroupBox + } + else + { + /// Hide extensionsGroupBox, etc. + int delta = extensionsGroupBox.Width + 45; + okButton.Left -= delta; + clearButton.Left -= delta; + Width -= delta; + extensionsGroupBox.Visible = false; + autoSNButton.Visible = false; + } + } + + /// + /// 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) + { + if (wmsCount < textBoxesCount && lineSize > 0) + { + int nrLines = (wmsCount + lineSize - 1) / lineSize; + int gap = (textBoxesCount - wmsCount) / nrLines; + + int dest = 0; + for (int l = 0; l < nrLines; l++) + { + for (int i = 0; i < lineSize; i++) + { + labels[dest] = labels[l * lineSize + l * gap + i]; + comboBoxes[dest] = comboBoxes[l * lineSize + l * gap + i]; + checkBoxes[dest] = checkBoxes[l * lineSize + l * gap + i]; + pictureBoxes[dest] = pictureBoxes[l * lineSize + l * gap + i]; + dest++; + } + } + textBoxesCount = wmsCount; + } + } + + private void CycleBeginningForm_Load(object sender, EventArgs e) + { + Localize(); + + PrepareOrderCombo(orderComboBox); + + for (int i = 0; i < textBoxesCount; i++) + { + if (Program.LocalSettings.LastSNTextsCount == textBoxesCount) + { + comboBoxes[i].Items.Add((Program.LocalSettings.LastSNTexts[i] == null) ? string.Empty : Program.LocalSettings.LastSNTexts[i]); + } + labels[i].Visible = comboBoxes[i].Visible = checkBoxes[i].Visible = true; + enabledComboBoxes.Add(comboBoxes[i]); + if (AtTheEnd) + { + pictureBoxes[i].Visible = true; + } + } + + UpdateIcons(); + + if (SensusExtensions) + { + idNumberTextBox.Text = (Program.LocalSettings.LastText1 == null) ? string.Empty : Program.LocalSettings.LastText1; + snPrefixTextBox.Text = (Program.LocalSettings.LastText2 == null) ? string.Empty : Program.LocalSettings.LastText2; + snSuffixTextBox.Text = (Program.LocalSettings.LastText3 == null) ? string.Empty : Program.LocalSettings.LastText3; + remarkTextBox.Text = (Program.LocalSettings.LastRemark == null) ? string.Empty : Program.LocalSettings.LastRemark; + } + } + + void Localize() + { + Text = Strings.Data; + orderGroupBox.Text = Strings.Purchase_order; + for (int i = 0; i < textBoxesCount; i++) + { + labels[i].Text = Strings.Serial_Number + " " + (i + 1).ToString(); + } + okButton.Text = Strings.OkBtnText; + clearButton.Text = Strings.ClearBtnText; + } + + /// + /// Load Purchase order combo box items from the LocalSettings PurchaseOrderHistory array + /// + /// Puchase order ComboBox + void PrepareOrderCombo(ComboBox orderComboBox) + { + for (int i = 0; i < Program.LocalSettings.PurchaseOrderHistoryCount; i++) + { + orderComboBox.Items.Add(Program.LocalSettings.PurchaseOrderHistory[i]); + } + + if (orderComboBox.Items.Count > 0) + { + orderComboBox.Text = orderComboBox.Items[0].ToString(); + } + } + + void UpdateIcons() + { + Image imgP = null; + Image imgF = null; + Image imgP2 = null; + Image imgF2 = null; + + int nrRedone = 0; + if (SensusExtensions) + { + if (!int.TryParse(ext1TextBox.Text, out nrRedone) || nrRedone < 0 || nrRedone > WaterMetersCount) + { + nrRedone = 0; + } + } + + for (int i = 0; i < WaterMetersCount; i++) + { + Results.Entities.WaterMeter wm = WaterMeters[i]; + if (wm == null) + { + checkBoxes[i].Checked = true; + } + else if (AtTheEnd) + { + if (imgP == null || imgF == null || imgP2 == null || imgF2 == null) + { + imgP = Properties.Resources.TestPassedImage; /// Passed + imgF = Properties.Resources.TestFailedImage; /// Failed + imgP2 = Properties.Resources.TestPassedImage2; /// Passed after re-work + imgF2 = Properties.Resources.TestFailedImage2; /// Failed after re-work + } + + pictureBoxes[i].Image = (WaterMetersCount - i > nrRedone) ? (wm.Passed ? imgP : imgF) : (wm.Passed ? imgP2 : imgF2); + } + } + } + + private void okButton_Click(object sender, EventArgs e) + { + PurchaseOrder = orderComboBox.Text; + Program.LocalSettings.UpdateHistory(orderComboBox.Text, + ref Program.LocalSettings.PurchaseOrderHistory +#if FUZHOU150 || FUZHOU300 + , 20 +#endif + ); + + Program.LocalSettings.LastSNTexts = SNText; + + for (int i = 0; i < Math.Min(WaterMetersCount, textBoxesCount); i++) + { + SNText[i] = comboBoxes[i].Text; + Disabled[i] = !checkBoxes[i].Checked; + } + + if (SensusExtensions) + { + int nrRedone = 0; + if (SensusExtensions) + { + if (!int.TryParse(ext1TextBox.Text, out nrRedone) || nrRedone < 0 || nrRedone > WaterMetersCount) + { + nrRedone = 0; + } + } + + Program.LocalSettings.LastText1 = IdNumber = string.IsNullOrEmpty(idNumberTextBox.Text) ? null : idNumberTextBox.Text; + Program.LocalSettings.LastText2 = SnPrefix = string.IsNullOrEmpty(snPrefixTextBox.Text) ? null : snPrefixTextBox.Text; + Program.LocalSettings.LastText3 = SnSuffix = string.IsNullOrEmpty(snSuffixTextBox.Text) ? null : snSuffixTextBox.Text; + Program.LocalSettings.LastRemark = Remark = string.IsNullOrEmpty(remarkTextBox.Text) ? null : remarkTextBox.Text; + + for (int i = 0; i < WaterMetersCount; i++) + { + Results.Entities.WaterMeter wm = WaterMeters[i]; + { + if (wm != null) + { + bool pressureTestPassed = false; + foreach (var mtr in wm.MeterTestRslts) + { + if ((mtr.Method().Equals("PMax-Test") || mtr.Method().Equals("Leak-Test")) && mtr.Passed) + { + pressureTestPassed = true; + break; + } + } + wm.WaterMeterData.Text1 = IdNumber; + wm.WaterMeterData.Text2 = SnPrefix; + wm.WaterMeterData.Text3 = SnSuffix; + wm.Batch.Remark = Remark; + wm.ResultCode = 32 + (wm.Passed ? 0 : 1) + (pressureTestPassed ? 64 : 0) + ((WaterMetersCount - i <= nrRedone) ? 128 : 0); + } + } + } + } + + completed = true; + Close(); + } + + /// + /// When one combo box is updated using drop-down menu, all combo boxes + /// are updated by this function. + /// + private void UpdateAllCombos() + { + for (int i = 0; i < Math.Min(WaterMetersCount, textBoxesCount); i++) + { + comboBoxes[i].Text = Program.LocalSettings.LastSNTexts[i]; + checkBoxes[i].Checked = !string.IsNullOrEmpty(comboBoxes[i].Text); + } + } + + private void clearButton_Click(object sender, EventArgs e) + { + for (int i = 0; i < Math.Min(WaterMetersCount, textBoxesCount); i++) + { + comboBoxes[i].Text = string.Empty; + checkBoxes[i].Checked = false; + } + } + + + private void comboBox1_TextChanged(object sender, EventArgs e) { checkBox1.Checked = true; } + private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox1.Text.Equals(comboBox1.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox2_TextChanged(object sender, EventArgs e) { checkBox2.Checked = true; } + private void comboBox2_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox2.Text.Equals(comboBox2.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox3_TextChanged(object sender, EventArgs e) { checkBox3.Checked = true; } + private void comboBox3_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox3.Text.Equals(comboBox3.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox4_TextChanged(object sender, EventArgs e) { checkBox4.Checked = true; } + private void comboBox4_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox4.Text.Equals(comboBox4.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox5_TextChanged(object sender, EventArgs e) { checkBox5.Checked = true; } + private void comboBox5_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox5.Text.Equals(comboBox5.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox6_TextChanged(object sender, EventArgs e) { checkBox6.Checked = true; } + private void comboBox6_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox6.Text.Equals(comboBox6.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox7_TextChanged(object sender, EventArgs e) { checkBox7.Checked = true; } + private void comboBox7_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox7.Text.Equals(comboBox7.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox8_TextChanged(object sender, EventArgs e) { checkBox8.Checked = true; } + private void comboBox8_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox8.Text.Equals(comboBox8.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox9_TextChanged(object sender, EventArgs e) { checkBox9.Checked = true; } + private void comboBox9_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox9.Text.Equals(comboBox9.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox10_TextChanged(object sender, EventArgs e) { checkBox10.Checked = true; } + private void comboBox10_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox10.Text.Equals(comboBox10.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox11_TextChanged(object sender, EventArgs e) { checkBox11.Checked = true; } + private void comboBox11_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox11.Text.Equals(comboBox11.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox12_TextChanged(object sender, EventArgs e) { checkBox12.Checked = true; } + private void comboBox12_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox12.Text.Equals(comboBox12.Items[0])) UpdateAllCombos(); + } + } + + #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); + }; + } + + private void OnForceClose(object sender, EventArgs args) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + + /// + /// Process a key press within any enabled text boxe + /// + /// + /// + /// TextBox control which received the event + private void ProcKeyPress(object sender, KeyPressEventArgs e, ComboBox currentFocusOwner) + { + if (e.KeyChar == '+') + { + /// Process '+' key ..... Form completed + okButton_Click(sender, e); + } + if (e.KeyChar == '\r') + { + /// Process key ..... Next text field + if (enabledComboBoxes.Count < 2) return; /// There is just one enabled textbox + + for (int i = 0; i < enabledComboBoxes.Count; i++) + { + if (enabledComboBoxes[i] == currentFocusOwner) + { + /// Change focus to the next enabled text box + enabledComboBoxes[(i + 1) % enabledComboBoxes.Count].Focus(); + return; + } + } + } + } + + private void comboBox1_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox1); } + private void comboBox2_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox2); } + private void comboBox3_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox3); } + private void comboBox4_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox4); } + private void comboBox5_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox5); } + private void comboBox6_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox6); } + private void comboBox7_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox7); } + private void comboBox8_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox8); } + private void comboBox9_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox9); } + private void comboBox10_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox10); } + private void comboBox11_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox11); } + private void comboBox12_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox12); } + + private void autoSNButton_Click(object sender, EventArgs e) + { + try + { + bool snFound = false; + int sn = 1; + + for (int i = 0; i < textBoxesCount; i++) + { + if (!AtTheEnd || WaterMeters[i].Passed) + { + if (!snFound) + { + sn = int.Parse(comboBoxes[i].Text); /// S/N from the first combo box + snFound = true; + } + else + { + sn++; + comboBoxes[i].Text = sn.ToString(); /// Update combo boxes of other 'good' water meters + } + } + } + } + catch + { + /// Don't do anything if int.Parse fails + } + } + + private void ext1TextBox_TextChanged(object sender, EventArgs e) + { + UpdateIcons(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/CycleBeginningForm.pl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/CycleBeginningForm.pl.resx new file mode 100644 index 00000000..f2d94860 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/CycleBeginningForm.pl.resx @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + OK + + + Kolejność + + + Usunąć + + + Nr seryjny 1 + + + Nr seryjny 2 + + + Nr seryjny 3 + + + Nr seryjny 4 + + + Nr seryjny 5 + + + Nr seryjny 6 + + + Nr seryjny 7 + + + Nr seryjny 8 + + + Nr seryjny 9 + + + Nr seryjny 10 + + + Nr seryjny 11 + + + Nr seryjny 12 + + + Uwaga: + + + Uzupełnienie za nr seryjnym + + + Uzupełnienie przed nr seryjnym + + + Nr identyfikacyjny: + + + ? + + + ? + + + ? + + + naprawionych + + + # sztuk + + + Auto nr seryjny + + + Dane partii + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/CycleBeginningForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/CycleBeginningForm.resx new file mode 100644 index 00000000..38a8b76a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/CycleBeginningForm.resx @@ -0,0 +1,2139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + Verdana, 14.25pt + + + 886, 24 + + + 140, 54 + + + + 7 + + + OK + + + okButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 52 + + + 90, 31 + + + 260, 31 + + + 0 + + + orderComboBox + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + orderGroupBox + + + 0 + + + Verdana, 14.25pt + + + 28, 12 + + + 447, 82 + + + 0 + + + Order + + + orderGroupBox + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 51 + + + Verdana, 14.25pt + + + + NoControl + + + 886, 124 + + + 140, 54 + + + 8 + + + Clear + + + clearButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 50 + + + True + + + Verdana, 14.25pt + + + 24, 127 + + + 166, 23 + + + 9 + + + Serial Number 1 + + + False + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 49 + + + Verdana, 14.25pt + + + 225, 124 + + + 163, 31 + + + 10 + + + False + + + comboBox1 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 48 + + + True + + + 460, 135 + + + 15, 14 + + + 11 + + + False + + + checkBox1 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 47 + + + True + + + NoControl + + + 460, 179 + + + 15, 14 + + + 14 + + + False + + + checkBox2 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 44 + + + Verdana, 14.25pt + + + 225, 168 + + + 163, 31 + + + 13 + + + False + + + comboBox2 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 45 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 171 + + + 166, 23 + + + 12 + + + Serial Number 2 + + + False + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 46 + + + True + + + NoControl + + + 460, 223 + + + 15, 14 + + + 17 + + + False + + + checkBox3 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 41 + + + Verdana, 14.25pt + + + 225, 212 + + + 163, 31 + + + 16 + + + False + + + comboBox3 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 42 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 215 + + + 166, 23 + + + 15 + + + Serial Number 3 + + + False + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 43 + + + True + + + NoControl + + + 460, 267 + + + 15, 14 + + + 20 + + + False + + + checkBox4 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 38 + + + Verdana, 14.25pt + + + 225, 256 + + + 163, 31 + + + 19 + + + False + + + comboBox4 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 39 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 259 + + + 166, 23 + + + 18 + + + Serial Number 4 + + + False + + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 40 + + + True + + + NoControl + + + 460, 311 + + + 15, 14 + + + 23 + + + False + + + checkBox5 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 35 + + + Verdana, 14.25pt + + + 225, 300 + + + 163, 31 + + + 22 + + + False + + + comboBox5 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 36 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 303 + + + 166, 23 + + + 21 + + + Serial Number 5 + + + False + + + label5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 37 + + + True + + + NoControl + + + 460, 355 + + + 15, 14 + + + 26 + + + False + + + checkBox6 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 32 + + + Verdana, 14.25pt + + + 225, 344 + + + 163, 31 + + + 25 + + + False + + + comboBox6 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 33 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 347 + + + 166, 23 + + + 24 + + + Serial Number 6 + + + False + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 34 + + + True + + + NoControl + + + 460, 399 + + + 15, 14 + + + 29 + + + False + + + checkBox7 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 29 + + + Verdana, 14.25pt + + + 225, 388 + + + 163, 31 + + + 28 + + + False + + + comboBox7 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 30 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 391 + + + 166, 23 + + + 27 + + + Serial Number 7 + + + False + + + label7 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 31 + + + True + + + NoControl + + + 460, 443 + + + 15, 14 + + + 32 + + + False + + + checkBox8 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 26 + + + Verdana, 14.25pt + + + 225, 432 + + + 163, 31 + + + 31 + + + False + + + comboBox8 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 27 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 435 + + + 166, 23 + + + 30 + + + Serial Number 8 + + + False + + + label8 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 28 + + + True + + + NoControl + + + 460, 487 + + + 15, 14 + + + 35 + + + False + + + checkBox9 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 23 + + + Verdana, 14.25pt + + + 225, 476 + + + 163, 31 + + + 34 + + + False + + + comboBox9 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 24 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 479 + + + 166, 23 + + + 33 + + + Serial Number 9 + + + False + + + label9 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 25 + + + True + + + NoControl + + + 460, 531 + + + 15, 14 + + + 38 + + + False + + + checkBox10 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 20 + + + Verdana, 14.25pt + + + 225, 520 + + + 163, 31 + + + 37 + + + False + + + comboBox10 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 21 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 523 + + + 178, 23 + + + 36 + + + Serial Number 10 + + + False + + + label10 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 22 + + + True + + + NoControl + + + 460, 575 + + + 15, 14 + + + 41 + + + False + + + checkBox11 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 17 + + + Verdana, 14.25pt + + + 225, 564 + + + 163, 31 + + + 40 + + + False + + + comboBox11 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 18 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 567 + + + 178, 23 + + + 39 + + + Serial Number 11 + + + False + + + label11 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 19 + + + True + + + NoControl + + + 460, 619 + + + 15, 14 + + + 44 + + + False + + + checkBox12 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 14 + + + Verdana, 14.25pt + + + 225, 608 + + + 163, 31 + + + 43 + + + False + + + comboBox12 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 15 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 611 + + + 178, 23 + + + 42 + + + Serial Number 12 + + + False + + + label12 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 16 + + + 23, 502 + + + 274, 31 + + + 15 + + + remarkTextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 0 + + + True + + + NoControl + + + 9, 468 + + + 115, 23 + + + 14 + + + Poznámka: + + + label16 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 1 + + + 23, 415 + + + 274, 31 + + + 13 + + + snSuffixTextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 2 + + + True + + + NoControl + + + 9, 381 + + + 165, 23 + + + 12 + + + Dodatok za s/n: + + + label15 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 3 + + + 23, 326 + + + 274, 31 + + + 11 + + + snPrefixTextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 4 + + + True + + + NoControl + + + 9, 292 + + + 187, 23 + + + 10 + + + Dodatok pred s/n: + + + label14 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 5 + + + 23, 245 + + + 274, 31 + + + 9 + + + idNumberTextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 6 + + + True + + + 9, 211 + + + 194, 23 + + + 8 + + + Identifikačné číslo: + + + label13 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 7 + + + True + + + NoControl + + + 73, 159 + + + 20, 23 + + + 7 + + + ? + + + ext4Label + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 8 + + + 23, 156 + + + 32, 31 + + + 6 + + + ext4TextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 9 + + + True + + + NoControl + + + 73, 120 + + + 20, 23 + + + 5 + + + ? + + + ext3Label + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 10 + + + 23, 117 + + + 32, 31 + + + 4 + + + ext3TextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 11 + + + True + + + NoControl + + + 73, 81 + + + 20, 23 + + + 3 + + + ? + + + ext2Label + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 12 + + + 23, 78 + + + 32, 31 + + + 2 + + + ext2TextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 13 + + + True + + + 73, 42 + + + 120, 23 + + + 1 + + + opravených + + + ext1Label + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 14 + + + 23, 39 + + + 32, 31 + + + 0 + + + ext1TextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extensionsGroupBox + + + 15 + + + Verdana, 14.25pt + + + 520, 12 + + + 322, 551 + + + 45 + + + # pieces + + + extensionsGroupBox + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 13 + + + Verdana, 14.25pt + + + NoControl + + + 886, 189 + + + 140, 54 + + + 46 + + + Auto S/N + + + autoSNButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 12 + + + 404, 124 + + + 32, 32 + + + 47 + + + False + + + pictureBox1 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 11 + + + NoControl + + + 404, 168 + + + 32, 32 + + + 48 + + + False + + + pictureBox2 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 10 + + + NoControl + + + 404, 212 + + + 32, 32 + + + 49 + + + False + + + pictureBox3 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 9 + + + NoControl + + + 404, 256 + + + 32, 32 + + + 50 + + + False + + + pictureBox4 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 8 + + + NoControl + + + 404, 300 + + + 32, 32 + + + 51 + + + False + + + pictureBox5 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 7 + + + NoControl + + + 404, 344 + + + 32, 32 + + + 52 + + + False + + + pictureBox6 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 6 + + + NoControl + + + 404, 388 + + + 32, 32 + + + 53 + + + False + + + pictureBox7 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 5 + + + NoControl + + + 404, 432 + + + 32, 32 + + + 54 + + + False + + + pictureBox8 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + + + NoControl + + + 404, 476 + + + 32, 32 + + + 55 + + + False + + + pictureBox9 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + NoControl + + + 404, 520 + + + 32, 32 + + + 56 + + + False + + + pictureBox10 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + NoControl + + + 404, 564 + + + 32, 32 + + + 57 + + + False + + + pictureBox11 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + NoControl + + + 404, 608 + + + 32, 32 + + + 58 + + + False + + + pictureBox12 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + + + 6, 13 + + + True + + + 1067, 651 + + + Batch data + + + CycleBeginningForm + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/CycleBeginningForm.ru.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/CycleBeginningForm.ru.resx new file mode 100644 index 00000000..50a35e7c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/CycleBeginningForm.ru.resx @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + OK + + + Порядок + + + Очистить + + + Серийный номер 1 + + + Серийный номер 2 + + + Серийный номер 3 + + + Серийный номер 4 + + + Серийный номер 5 + + + Серийный номер 6 + + + Серийный номер 7 + + + Серийный номер 8 + + + Серийный номер 9 + + + Серийный номер 10 + + + Серийный номер 11 + + + Серийный номер 12 + + + Примечание: + + + Дополнить за с/н + + + Дополнить перед с/н + + + Идентификационный номер: + + + ? + + + ? + + + ? + + + отремонтированных + + + # штук + + + Авто с/н + + + Пакетные данные + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/CycleEndForm.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/CycleEndForm.Designer.cs new file mode 100644 index 00000000..5f8a2da9 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/CycleEndForm.Designer.cs @@ -0,0 +1,364 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// +namespace TBF.BenchControl.DataEntry.Standard12 +{ + partial class CycleEndForm + { + /// + /// 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() + { + this.textBox2 = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.okButton = new System.Windows.Forms.Button(); + this.textBox3 = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.textBox4 = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.textBox5 = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.textBox6 = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.textBox7 = new System.Windows.Forms.TextBox(); + this.label7 = new System.Windows.Forms.Label(); + this.textBox8 = new System.Windows.Forms.TextBox(); + this.label8 = new System.Windows.Forms.Label(); + this.textBox9 = new System.Windows.Forms.TextBox(); + this.label9 = new System.Windows.Forms.Label(); + this.textBox10 = new System.Windows.Forms.TextBox(); + this.label10 = new System.Windows.Forms.Label(); + this.textBox11 = new System.Windows.Forms.TextBox(); + this.label11 = new System.Windows.Forms.Label(); + this.textBox12 = new System.Windows.Forms.TextBox(); + this.label12 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // textBox2 + // + this.textBox2.Location = new System.Drawing.Point(205, 66); + this.textBox2.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox2.Name = "textBox2"; + this.textBox2.Size = new System.Drawing.Size(169, 27); + this.textBox2.TabIndex = 1; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(38, 71); + this.label2.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(62, 18); + this.label2.TabIndex = 0; + this.label2.Text = "Stand:"; + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(205, 30); + this.textBox1.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(169, 27); + this.textBox1.TabIndex = 1; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(38, 35); + this.label1.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(62, 18); + this.label1.TabIndex = 0; + this.label1.Text = "Stand:"; + // + // okButton + // + this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(415, 30); + this.okButton.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(90, 60); + this.okButton.TabIndex = 7; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // textBox3 + // + this.textBox3.Location = new System.Drawing.Point(205, 102); + this.textBox3.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox3.Name = "textBox3"; + this.textBox3.Size = new System.Drawing.Size(169, 27); + this.textBox3.TabIndex = 1; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(38, 107); + this.label3.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(62, 18); + this.label3.TabIndex = 0; + this.label3.Text = "Stand:"; + // + // textBox4 + // + this.textBox4.Location = new System.Drawing.Point(205, 138); + this.textBox4.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox4.Name = "textBox4"; + this.textBox4.Size = new System.Drawing.Size(169, 27); + this.textBox4.TabIndex = 1; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(38, 143); + this.label4.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(62, 18); + this.label4.TabIndex = 0; + this.label4.Text = "Stand:"; + // + // textBox5 + // + this.textBox5.Location = new System.Drawing.Point(205, 174); + this.textBox5.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox5.Name = "textBox5"; + this.textBox5.Size = new System.Drawing.Size(169, 27); + this.textBox5.TabIndex = 1; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(38, 179); + this.label5.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(62, 18); + this.label5.TabIndex = 0; + this.label5.Text = "Stand:"; + // + // textBox6 + // + this.textBox6.Location = new System.Drawing.Point(205, 210); + this.textBox6.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox6.Name = "textBox6"; + this.textBox6.Size = new System.Drawing.Size(169, 27); + this.textBox6.TabIndex = 1; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(38, 215); + this.label6.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(62, 18); + this.label6.TabIndex = 0; + this.label6.Text = "Stand:"; + // + // textBox7 + // + this.textBox7.Location = new System.Drawing.Point(205, 246); + this.textBox7.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox7.Name = "textBox7"; + this.textBox7.Size = new System.Drawing.Size(169, 27); + this.textBox7.TabIndex = 9; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(38, 251); + this.label7.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(62, 18); + this.label7.TabIndex = 8; + this.label7.Text = "Stand:"; + // + // textBox8 + // + this.textBox8.Location = new System.Drawing.Point(205, 282); + this.textBox8.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox8.Name = "textBox8"; + this.textBox8.Size = new System.Drawing.Size(169, 27); + this.textBox8.TabIndex = 11; + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Location = new System.Drawing.Point(38, 287); + this.label8.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(62, 18); + this.label8.TabIndex = 10; + this.label8.Text = "Stand:"; + // + // textBox9 + // + this.textBox9.Location = new System.Drawing.Point(205, 318); + this.textBox9.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox9.Name = "textBox9"; + this.textBox9.Size = new System.Drawing.Size(169, 27); + this.textBox9.TabIndex = 13; + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Location = new System.Drawing.Point(38, 323); + this.label9.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(62, 18); + this.label9.TabIndex = 12; + this.label9.Text = "Stand:"; + // + // textBox10 + // + this.textBox10.Location = new System.Drawing.Point(205, 354); + this.textBox10.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox10.Name = "textBox10"; + this.textBox10.Size = new System.Drawing.Size(169, 27); + this.textBox10.TabIndex = 15; + // + // label10 + // + this.label10.AutoSize = true; + this.label10.Location = new System.Drawing.Point(38, 359); + this.label10.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(62, 18); + this.label10.TabIndex = 14; + this.label10.Text = "Stand:"; + // + // textBox11 + // + this.textBox11.Location = new System.Drawing.Point(205, 390); + this.textBox11.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox11.Name = "textBox11"; + this.textBox11.Size = new System.Drawing.Size(169, 27); + this.textBox11.TabIndex = 17; + // + // label11 + // + this.label11.AutoSize = true; + this.label11.Location = new System.Drawing.Point(38, 395); + this.label11.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(62, 18); + this.label11.TabIndex = 16; + this.label11.Text = "Stand:"; + // + // textBox12 + // + this.textBox12.Location = new System.Drawing.Point(205, 426); + this.textBox12.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox12.Name = "textBox12"; + this.textBox12.Size = new System.Drawing.Size(169, 27); + this.textBox12.TabIndex = 19; + // + // label12 + // + this.label12.AutoSize = true; + this.label12.Location = new System.Drawing.Point(38, 431); + this.label12.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label12.Name = "label12"; + this.label12.Size = new System.Drawing.Size(62, 18); + this.label12.TabIndex = 18; + this.label12.Text = "Stand:"; + // + // CycleEndForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 18F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.ClientSize = new System.Drawing.Size(542, 489); + this.Controls.Add(this.textBox12); + this.Controls.Add(this.label12); + this.Controls.Add(this.textBox11); + this.Controls.Add(this.label11); + this.Controls.Add(this.textBox10); + this.Controls.Add(this.label10); + this.Controls.Add(this.textBox9); + this.Controls.Add(this.label9); + this.Controls.Add(this.textBox8); + this.Controls.Add(this.label8); + this.Controls.Add(this.textBox7); + this.Controls.Add(this.label7); + this.Controls.Add(this.textBox6); + this.Controls.Add(this.label6); + this.Controls.Add(this.textBox5); + this.Controls.Add(this.label5); + this.Controls.Add(this.textBox4); + this.Controls.Add(this.label4); + this.Controls.Add(this.textBox3); + this.Controls.Add(this.label3); + this.Controls.Add(this.textBox2); + this.Controls.Add(this.label2); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.label1); + this.Controls.Add(this.okButton); + this.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.Name = "CycleEndForm"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "Daten"; + this.TopMost = true; + this.Load += new System.EventHandler(this.CycleEndForm_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox textBox2; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.TextBox textBox3; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox textBox4; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox textBox5; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.TextBox textBox6; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TextBox textBox7; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.TextBox textBox8; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.TextBox textBox9; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.TextBox textBox10; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.TextBox textBox11; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.TextBox textBox12; + private System.Windows.Forms.Label label12; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/CycleEndForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/CycleEndForm.cs new file mode 100644 index 00000000..559d70c7 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/CycleEndForm.cs @@ -0,0 +1,121 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// +using System; +using System.Windows.Forms; +using log4net; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.Standard12 +{ + public partial class CycleEndForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(CycleEndForm)); + + /// Number of text boxes for serial numbers + public readonly int WaterMetersCount; + + // To be retrieved after the form closes + public string[] EndStateText; + + // Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + int textBoxesCount; + Label[] labels; + TextBox[] textBoxes; + + + /// + /// Constructor + /// + /// Number of text boxes for serial numbers + public CycleEndForm() + { + InitializeComponent(); + ControlBox = false; + + labels = new Label[] + { + label1, label2, label3, label4, label5, label6, + label7, label8, label9, label10, label11, label12, + }; + textBoxes = new TextBox[] + { + textBox1, textBox2, textBox3, textBox4, textBox5, textBox6, + textBox7, textBox8, textBox9, textBox10, textBox11, textBox12, + }; + textBoxesCount = textBoxes.Length; + this.WaterMetersCount = textBoxesCount; + + completed = false; + StartForceCloseHandler(); + } + + /// Parameterless constructor for 3 watermeters + public CycleEndForm(int waterMetersCount) + : this() + { + this.WaterMetersCount = waterMetersCount; + EndStateText = new string[WaterMetersCount]; + } + + private void CycleEndForm_Load(object sender, EventArgs e) + { + Localize(); + + Height = 60 + 36 * WaterMetersCount; + + for (int i = 0; i < textBoxesCount; i++) + { + if (i >= WaterMetersCount) + { + labels[i].Visible = false; + textBoxes[i].Visible = false; + } + } + } + + void Localize() + { + Text = Strings.Data; + okButton.Text = Strings.OkBtnText; + + for (int i = 0; i < WaterMetersCount; i++) + { + labels[i].Text = string.Format("{0} {1}:", Strings.Water_Meter, (i + 1).ToString()); + } + } + + private void okButton_Click(object sender, EventArgs e) + { + for (int i = 0; i < WaterMetersCount; i++) + { + EndStateText[i] = textBoxes[i].Text; + } + + completed = true; + 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) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/CycleEndForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/CycleEndForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/CycleEndForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/EntryForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/EntryForm.cs new file mode 100644 index 00000000..d16321c4 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/EntryForm.cs @@ -0,0 +1,20 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl.DataEntry.Standard12 +{ + public class EntryForm : EntryFormNoStartEnd, IHasWMStatesForm + { + public EntryForm() + : base() + { + } + + public EntryForm(Generic.IComponentCfg cfg) + : base(cfg) + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/EntryFormCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/EntryFormCfg.cs new file mode 100644 index 00000000..0f5b2c90 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/EntryFormCfg.cs @@ -0,0 +1,47 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DataEntry.Standard12 +{ + public class EntryFormCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(EntryFormCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new EntryFormCfgCtrl(); } + + /// + /// Serialized parameters + /// + public bool EnterSerialNrsAtTheEnd; + public bool ShowCycleEndForm; + public bool SensusExtensions; + + /// Private parameterless constructor invoked by all other (public) constructors + EntryFormCfg() + { + Name = "DataEntry-Standard-12"; + ParentName = string.Empty; + EnterSerialNrsAtTheEnd = false; + ShowCycleEndForm = false; + SensusExtensions = false; + } + + public EntryFormCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, EnterSNsAtTheEnd={1}, ShowEndForm={2}, SensusExt={3}", Name, EnterSerialNrsAtTheEnd, ShowCycleEndForm, SensusExtensions); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/EntryFormCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/EntryFormCfgCtrl.cs new file mode 100644 index 00000000..1c15660b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/EntryFormCfgCtrl.cs @@ -0,0 +1,87 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.Standard12 +{ + public partial class EntryFormCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + EntryFormCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as EntryFormCfg; + Redraw(); + } + } + + public EntryFormCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Localize(); + Redraw(); + } + + void Localize() + { + enterSNsAtTheEndCheckBox.Text = Strings.Enter_SNs_at_the_end; + showEndStateFormCheckBox.Text = Strings.Show_cycle_end_form; + sensusExtensionsCheckBox.Text = Strings.Sensus_extensions; + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + enterSNsAtTheEndCheckBox.Checked = config.EnterSerialNrsAtTheEnd; + showEndStateFormCheckBox.Checked = config.ShowCycleEndForm; + sensusExtensionsCheckBox.Checked = config.SensusExtensions; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + enterSNsAtTheEndCheckBox.Enabled = true; + showEndStateFormCheckBox.Enabled = true; + sensusExtensionsCheckBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.EnterSerialNrsAtTheEnd = enterSNsAtTheEndCheckBox.Checked; + config.ShowCycleEndForm = showEndStateFormCheckBox.Checked; + config.SensusExtensions = sensusExtensionsCheckBox.Checked; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/EntryFormCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/EntryFormCfgCtrl.designer.cs new file mode 100644 index 00000000..86e5f66e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/EntryFormCfgCtrl.designer.cs @@ -0,0 +1,128 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.Standard12 +{ + partial class EntryFormCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.showEndStateFormCheckBox = new System.Windows.Forms.CheckBox(); + this.enterSNsAtTheEndCheckBox = new System.Windows.Forms.CheckBox(); + this.sensusExtensionsCheckBox = new System.Windows.Forms.CheckBox(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(99, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(35, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(96, 33); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // showEndStateFormCheckBox + // + this.showEndStateFormCheckBox.AutoSize = true; + this.showEndStateFormCheckBox.Enabled = false; + this.showEndStateFormCheckBox.Location = new System.Drawing.Point(99, 112); + this.showEndStateFormCheckBox.Name = "showEndStateFormCheckBox"; + this.showEndStateFormCheckBox.Size = new System.Drawing.Size(151, 17); + this.showEndStateFormCheckBox.TabIndex = 4; + this.showEndStateFormCheckBox.Text = "Watermeter end state form"; + this.showEndStateFormCheckBox.UseVisualStyleBackColor = true; + // + // enterSNsAtTheEndCheckBox + // + this.enterSNsAtTheEndCheckBox.AutoSize = true; + this.enterSNsAtTheEndCheckBox.Enabled = false; + this.enterSNsAtTheEndCheckBox.Location = new System.Drawing.Point(99, 89); + this.enterSNsAtTheEndCheckBox.Name = "enterSNsAtTheEndCheckBox"; + this.enterSNsAtTheEndCheckBox.Size = new System.Drawing.Size(167, 17); + this.enterSNsAtTheEndCheckBox.TabIndex = 3; + this.enterSNsAtTheEndCheckBox.Text = "Enter serial number at the end"; + this.enterSNsAtTheEndCheckBox.UseVisualStyleBackColor = true; + // + // sensusExtensionsCheckBox + // + this.sensusExtensionsCheckBox.AutoSize = true; + this.sensusExtensionsCheckBox.Enabled = false; + this.sensusExtensionsCheckBox.Location = new System.Drawing.Point(99, 135); + this.sensusExtensionsCheckBox.Name = "sensusExtensionsCheckBox"; + this.sensusExtensionsCheckBox.Size = new System.Drawing.Size(114, 17); + this.sensusExtensionsCheckBox.TabIndex = 5; + this.sensusExtensionsCheckBox.Text = "Sensus extensions"; + this.sensusExtensionsCheckBox.UseVisualStyleBackColor = true; + // + // EntryFormCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.sensusExtensionsCheckBox); + this.Controls.Add(this.enterSNsAtTheEndCheckBox); + this.Controls.Add(this.showEndStateFormCheckBox); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "EntryFormCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.CheckBox showEndStateFormCheckBox; + private System.Windows.Forms.CheckBox enterSNsAtTheEndCheckBox; + private System.Windows.Forms.CheckBox sensusExtensionsCheckBox; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/EntryFormCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/EntryFormCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/EntryFormCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/EntryFormNoStartEnd.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/EntryFormNoStartEnd.cs new file mode 100644 index 00000000..7a773c5e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/EntryFormNoStartEnd.cs @@ -0,0 +1,279 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; +using TBF.BenchControl; +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl.DataEntry.Standard12 +{ + public class EntryFormNoStartEnd : ComponentBase, IOperation, IDataEntry, IHasCycleBeginForm, IHasCycleEndForm + { + private static readonly ILog log = LogManager.GetLogger(typeof(EntryFormNoStartEnd)); + public override string ToString() { return string.Format("DataEntry.Standard12({0})", Cfg.ToString(1)); } + + public bool UsesCameras() { return false; } + + readonly EntryFormCfg entryFormCfg; + IRegisterReader[] regReaders; + + /// + /// Properties set by the Begin, End and WMStates form + /// + string purchaseOrder; + public string PurchaseOrder { get { return purchaseOrder; } } + + bool[] disabled; /// This array is shared between forms + + string[] wmCycleEndState; + public string WMCycleEndState(int wmNr) { return (wmNr >= 0 && wmNr < wmCycleEndState.Length) ? wmCycleEndState[wmNr] : string.Empty; } + + double[] wmStartState; + public double WMStartState(int wmNr) { return (wmNr >= 0 && wmNr < wmStartState.Length) ? wmStartState[wmNr] : 0; } + + double[] wmEndState; + public double WMEndState(int wmNr) { return (wmNr >= 0 && wmNr < wmEndState.Length) ? wmEndState[wmNr] : 0; } + + string[] wmStartStateStr; + + + System.Windows.Forms.Form modelessDlg; + + double refVolume; + double errLimLo; + double errLimHi; + + bool resultSaved; /// Set in Run() when results are saved + + Results.Entities.WaterMeter[] waterMeters; /// Reference to ...ProcessData.BatchRslts.WaterMeters[] + + public enum CurrentOp + { + None, + ShowFormAtCycleBeginning, + ShowFormAtCycleEnd, + EnterTestStartStates, + EnterTestEndStates, + } + + CurrentOp currentOp; + + + public EntryFormNoStartEnd() + { + } + + public EntryFormNoStartEnd(Generic.IComponentCfg cfg) + : base(cfg) + { + entryFormCfg = cfg as EntryFormCfg; + + disabled = new bool[Config.Data.WMsCount]; + wmStartState = new double[Config.Data.WMsCount]; + wmStartStateStr = new string[Config.Data.WMsCount]; + wmEndState = new double[Config.Data.WMsCount]; + wmCycleEndState = new string[Config.Data.WMsCount]; + + currentOp = CurrentOp.None; + log.Debug(this.ToString()); + } + + /// Reference to the operation + public IOperation ShowCycleBeginFormOp() + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.ShowFormAtCycleBeginning; + this.waterMeters = TBF.BenchControl.Sequences.ProcessData.BatchRslts.WaterMeters; + return this; + } + + /// Reference to the operation + public IOperation ShowCycleEndFormOp() + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.ShowFormAtCycleEnd; + this.waterMeters = TBF.BenchControl.Sequences.ProcessData.BatchRslts.WaterMeters; + return this; + } + + /// Reference to the operation + public IOperation ShowTestStartFormOp(IRegisterReader[] regReaders) + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.EnterTestStartStates; + this.regReaders = regReaders; + return this; + } + + /// Reference to the operation + public IOperation ShowTestEndFormOp(IRegisterReader[] regReaders, double refVolume, double errLimLo, double errLimHi) + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.EnterTestEndStates; + this.regReaders = regReaders; + this.refVolume = refVolume; + this.errLimLo = errLimLo; + this.errLimHi = errLimHi; + return this; + } + + delegate void EntryFormDlgt(EntryFormNoStartEnd myRef); + /// + void OpenBeginningDlg(EntryFormNoStartEnd myRef) + { + myRef.modelessDlg = new CycleBeginningForm(myRef.waterMeters, entryFormCfg.EnterSerialNrsAtTheEnd, entryFormCfg.SensusExtensions); + modelessDlg.Show(); + } + /// + void OpenEndDlg(EntryFormNoStartEnd myRef) + { + myRef.modelessDlg = new CycleEndForm(Config.Data.WMsCount); + modelessDlg.Show(); + } + /// + void OpenTestStartStatesDlg(EntryFormNoStartEnd myRef) + { + myRef.modelessDlg = new TestStartEndForm(myRef.waterMeters.Length, myRef.regReaders, disabled); + modelessDlg.Show(); + } + /// + void OpenTestEndStatesDlg(EntryFormNoStartEnd myRef) + { + myRef.modelessDlg = new TestStartEndForm(Config.Data.WMsCount, myRef.regReaders, wmStartStateStr, disabled, refVolume, errLimLo, errLimHi); + modelessDlg.Show(); + } + + /// Start this operation + public void Start() + { + resultSaved = false; + switch (currentOp) + { + case CurrentOp.ShowFormAtCycleBeginning: + if (!entryFormCfg.EnterSerialNrsAtTheEnd) + { + Program.MainWnd.Invoke(new EntryFormDlgt(OpenBeginningDlg), this); + } + break; + case CurrentOp.ShowFormAtCycleEnd: + if (entryFormCfg.EnterSerialNrsAtTheEnd) + { + Program.MainWnd.Invoke(new EntryFormDlgt(OpenBeginningDlg), this); + } + else if (entryFormCfg.ShowCycleEndForm) + { + Program.MainWnd.Invoke(new EntryFormDlgt(OpenEndDlg), this); + } + break; + case CurrentOp.EnterTestStartStates: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenTestStartStatesDlg), this); + break; + case CurrentOp.EnterTestEndStates: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenTestEndStatesDlg), this); + break; + } + } + + /// Run this operation + /// Event.ResultsPrinted + public Event Run() + { + if ((modelessDlg is IHasCompleted) && !(modelessDlg as IHasCompleted).Completed) + { + return Event.ModelessFormIsOpen; + } + + if (!resultSaved) /// This is to save the result only once + { + if ((!entryFormCfg.EnterSerialNrsAtTheEnd && currentOp == CurrentOp.ShowFormAtCycleBeginning) || + (entryFormCfg.EnterSerialNrsAtTheEnd && currentOp == CurrentOp.ShowFormAtCycleEnd)) + { + CycleBeginningForm dlg = (modelessDlg as CycleBeginningForm); + if (dlg != null) + { + purchaseOrder = dlg.PurchaseOrder; + + for (int i = 0; i < Math.Min(dlg.WaterMetersCount, waterMeters.Length); i++) + { + if (waterMeters[i] != null) + { + waterMeters[i].SerialNr = dlg.SNText[i]; + disabled[i] = waterMeters[i].Disabled = dlg.Disabled[i]; + } + } + } + } + else if (entryFormCfg.ShowCycleEndForm && currentOp == CurrentOp.ShowFormAtCycleEnd) + { + CycleEndForm dlg = (modelessDlg as CycleEndForm); + int count = waterMeters.Length; + if ((dlg != null) && (count > dlg.WaterMetersCount)) count = dlg.WaterMetersCount; + + for (int i = 0; i < count; i++) + { + if (waterMeters[i] != null) + { + /// In case entryFormCfg.ShowCycleEndForm == false dlg would be null, values would be string.Empty + wmCycleEndState[i] = waterMeters[i].EndState = (dlg != null) ? dlg.EndStateText[i] : string.Empty; + } + } + } + else if (modelessDlg is TestStartEndForm && currentOp == CurrentOp.EnterTestStartStates) + { + /// Fixed start test - start + TestStartEndForm dlg = (modelessDlg as TestStartEndForm); + if (dlg != null) + { + for (int i = 0; i < dlg.WaterMetersCount; i++) + { + wmStartState[i] = dlg.WMStartState[i]; + wmStartStateStr[i] = dlg.WMStartStateStr[i]; + } + } + } + else if (modelessDlg is TestStartEndForm && currentOp == CurrentOp.EnterTestEndStates) + { + /// Fixed start test - end + TestStartEndForm dlg = (modelessDlg as TestStartEndForm); + if (dlg != null) + { + for (int i = 0; i < dlg.WaterMetersCount; i++) + { + wmEndState[i] = dlg.WMEndState[i]; + } + } + } + resultSaved = true; + modelessDlg = null; + } + + return Event.ModelessFormClosed; /// Form closed + } + + /// Stop this operation + public void Stop() + { + if (modelessDlg is IHasCompleted) + { + UiBridge.Bridge.OnCloseModelessForm(this, null); + modelessDlg = null; + } + currentOp = CurrentOp.None; + } + + /// + /// Updates test results with the information collected in watermeters. + /// + /// Test results to be updated with the information + public void UpdateTestResults(Results.BatchResults batchResults) + { + foreach (var wm in batchResults.WaterMeters) + { + if (wm != null && !wm.Disabled) wm.PurchaseOrder = PurchaseOrder; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/Factory.cs new file mode 100644 index 00000000..3b4214a2 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DataEntry.Standard12 +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return "DataEntry-Standard-12"; } } + + public void ResetStaticProperties() { EntryFormNoStartEnd.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new EntryFormNoStartEnd(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new EntryForm(cfg); } + + public IComponentCfg DefaultConfig() { return new EntryFormCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(EntryFormCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/FactoryNoStartEnd.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/FactoryNoStartEnd.cs new file mode 100644 index 00000000..7837940e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/FactoryNoStartEnd.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DataEntry.Standard12 +{ + public class FactoryNoStartEnd : IComponentFactory + { + public string ClassName { get { return "DataEntry-Standard-12-NoStartEnd"; } } + + public void ResetStaticProperties() { EntryFormNoStartEnd.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new EntryFormNoStartEnd(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new EntryFormNoStartEnd(cfg); } + + public IComponentCfg DefaultConfig() { return new EntryFormCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(EntryFormCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/TestStartEndForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/TestStartEndForm.cs new file mode 100644 index 00000000..a8d363e7 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/TestStartEndForm.cs @@ -0,0 +1,482 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using log4net; +using TBF.BenchControl.GenericDevices; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.Standard12 +{ + public partial class TestStartEndForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(TestStartEndForm)); + + // Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + /// Number of text boxes for serial numbers + public readonly int WaterMetersCount; + readonly IRegisterReader[] regReaders; + readonly bool[] disabled; + + // To be retrieved after the form closes + public double[] WMStartState; + + // To be retrieved after the form closes + public readonly string[] WMStartStateStr; + + // To be retrieved after the form closes + public double[] WMEndState; + + bool endStates; /// false=start states, true=end states + double refVolume; + double warningLimLo; /// limit to display exclamation mark, typically 2x errLimLo + double warningLimHi; /// limit to display exclamation mark, typically 2x errLimHi + + int TextBoxesCount; + /// + Label[] labels; + TextBox[] startTextBoxes; + TextBox[] endTextBoxes; + IList enabledTextBoxes; + + /// + /// Parameterless constructor initializing common part for start and endstate form + /// + public TestStartEndForm() + { + InitializeComponent(); + ControlBox = false; + + TextBoxesCount = 12; + + labels = new Label[] + { + label1, label2, label3, label4, label5, label6, + label7, label8, label9, label10, label11, label12, + }; + startTextBoxes = new TextBox[] + { + startTextBox1, startTextBox2, startTextBox3, startTextBox4, startTextBox5, startTextBox6, + startTextBox7, startTextBox8, startTextBox9, startTextBox10, startTextBox11, startTextBox12, + }; + endTextBoxes = new TextBox[] + { + endTextBox1, endTextBox2, endTextBox3, endTextBox4, endTextBox5, endTextBox6, + endTextBox7, endTextBox8, endTextBox9, endTextBox10, endTextBox11, endTextBox12, + }; + enabledTextBoxes = new List(); + + completed = false; + StartForceCloseHandler(); + } + + /// + /// Constructor to fill in start states + /// + /// Number of water meters + /// Information from CycleBeginningForm about availability of water meters + public TestStartEndForm(int waterMetersCount, IRegisterReader[] regReaders, bool[] disabled) + : this() + { + endStates = false; + + this.WaterMetersCount = waterMetersCount; + this.regReaders = regReaders; + this.disabled = disabled; + + ShuffleTextBoxes(); + + WMStartState = new double[waterMetersCount]; + WMStartStateStr = new string[waterMetersCount]; + } + + /// + /// Constructor to fill in end states + /// + /// Number of water meters + /// Information entered on test start + /// Information from CycleBeginningForm about availability of water meters + /// Reference volume, it is used to verify the end state, show/hide exclamation if necessary + /// Error limit low, it is used to verify the end state, show/hide exclamation if necessary + /// Error limit high, it is used to verify the end state, show/hide exclamation if necessary + public TestStartEndForm(int waterMetersCount, IRegisterReader[] regReaders, string[] wmStartStateStr, bool[] disabled, + double refVolume, double errLimLo, double errLimHi) + : this() + { + endStates = true; + + this.WaterMetersCount = waterMetersCount; + this.regReaders = regReaders; + if (wmStartStateStr == null || wmStartStateStr.Length != waterMetersCount) + throw (new Exception("Invalid 'wmStartStateStr' argument")); + this.WMStartStateStr = wmStartStateStr; + this.disabled = disabled; + this.refVolume = refVolume; + this.warningLimLo = 2 * errLimLo; + this.warningLimHi = 2 * errLimHi; + + ShuffleTextBoxes(); + + WMEndState = new double[waterMetersCount]; + } + + /// + /// Make sure the layout of labels/text boxes on the screen + /// corresponds to the layout of watermeters of the test bench. + /// + void ShuffleTextBoxes() + { + if (Config.Data.WMsCount < TextBoxesCount) + { + int nrLines = Config.Data.WMsCount / Config.Data.LineSize; + int gap = (TextBoxesCount - Config.Data.WMsCount) / nrLines; + + int dest = 0; + for (int l = 0; l < nrLines; l++) + { + for (int i = 0; i < Config.Data.LineSize; i++) + { + labels[dest] = labels[l * Config.Data.LineSize + l * gap + i]; + startTextBoxes[dest] = startTextBoxes[l * Config.Data.LineSize + l * gap + i]; + endTextBoxes[dest] = endTextBoxes[l * Config.Data.LineSize + l * gap + i]; + dest++; + } + } + TextBoxesCount = Config.Data.WMsCount; + } + } + + private void CycleEndForm_Load(object sender, EventArgs e) + { + Localize(); + + for (int i = 0; i < TextBoxesCount; i++) + { + if (i < WaterMetersCount) + { + labels[i].Visible = startTextBoxes[i].Visible = endTextBoxes[i].Visible = true; + } + } + + if (endStates) + { + for (int i = 0; i < TextBoxesCount; i++) + { + if (WMStartStateStr != null && i < WMStartStateStr.Length) + { + startTextBoxes[i].Text = WMStartStateStr[i]; + } + + if (disabled != null && i < disabled.Length && disabled[i]) + { + endTextBoxes[i].Enabled = false; + } + else + { + endTextBoxes[i].Enabled = true; + enabledTextBoxes.Add(endTextBoxes[i]); + } + } + } + else + { + for (int i = 0; i < TextBoxesCount; i++) + { + if (disabled != null && i < disabled.Length && disabled[i]) + { + startTextBoxes[i].Enabled = false; + } + else + { + startTextBoxes[i].Enabled = true; + enabledTextBoxes.Add(startTextBoxes[i]); + } + } + } + + //Height = 85 + 44 * WaterMetersCount; + } + + void Localize() + { + Text = Strings.Water_Meter_States; + for (int i = 0; i < TextBoxesCount; i++) + { + labels[i].Text = Strings.Water_Meter + " " + (i + 1).ToString(); + } + startLabel.Text = Strings.Start; + endLabel.Text = Strings.End; + okButton.Text = Strings.OkBtnText; + } + + private void okButton_Click(object sender, EventArgs eArgs) + { + log.Debug("okButton_Click(..)"); + + try + { + if (endStates) + { + for (int i = 0; i < Math.Min(WaterMetersCount, TextBoxesCount); i++) + { + if (endTextBoxes[i].Visible && endTextBoxes[i].Enabled) + { + WMEndState[i] = Utils.ParseUDouble(endTextBoxes[i].Text); + } + } + } + else + { + for (int i = 0; i < Math.Min(WaterMetersCount, TextBoxesCount); i++) + { + if (startTextBoxes[i].Visible && startTextBoxes[i].Enabled) + { + WMStartStateStr[i] = startTextBoxes[i].Text; + WMStartState[i] = Utils.ParseUDouble(startTextBoxes[i].Text); + } + } + } + } + catch (Exception e) + { + log.ErrorFormat("Exception: {0}", e.Message); + return; + } + + completed = true; + 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) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + + /// + /// Calculate the approximate error and verify whether it is within limits. + /// Make an exclamation mark visible if out of range. + /// Similar event handler is implemented for all endTextBoxes (1..24). + /// + private void endTextBox1_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox1.Text); + double startState = Utils.ParseUDouble(startTextBox1.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { }; + exclamation1.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox2_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox2.Text); + double startState = Utils.ParseUDouble(startTextBox2.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation2.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox3_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox3.Text); + double startState = Utils.ParseUDouble(startTextBox3.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation3.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox4_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox4.Text); + double startState = Utils.ParseUDouble(startTextBox4.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation4.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox5_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox5.Text); + double startState = Utils.ParseUDouble(startTextBox5.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation5.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox6_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox6.Text); + double startState = Utils.ParseUDouble(startTextBox6.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation6.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox7_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox7.Text); + double startState = Utils.ParseUDouble(startTextBox7.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation7.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox8_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox8.Text); + double startState = Utils.ParseUDouble(startTextBox8.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation8.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox9_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox9.Text); + double startState = Utils.ParseUDouble(startTextBox9.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation9.Visible = (err < warningLimLo) || (warningLimHi < err); + } + + private void endTextBox10_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox10.Text); + double startState = Utils.ParseUDouble(startTextBox10.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation10.Visible = (err < warningLimLo) || (warningLimHi < err); + } + + private void endTextBox11_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox11.Text); + double startState = Utils.ParseUDouble(startTextBox11.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation11.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox12_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox12.Text); + double startState = Utils.ParseUDouble(startTextBox12.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation12.Visible = (err < warningLimLo) || (warningLimHi < err); + } + + /// + /// Process a key press within any enabled text boxe + /// + /// + /// + /// TextBox control which received the event + private void ProcKeyPress(object sender, KeyPressEventArgs e, TextBox currentFocusOwner) + { + if (e.KeyChar == '+') + { + /// Process '+' key ..... Form completed + okButton_Click(sender, e); + } + if (e.KeyChar == '\r') + { + /// Process key ..... Next text field + if (enabledTextBoxes.Count < 2) return; /// There is just one enabled textbox + + for (int i = 0; i < enabledTextBoxes.Count; i++) + { + if (enabledTextBoxes[i] == currentFocusOwner) + { + /// Change focus to the next enabled text box + enabledTextBoxes[(i + 1) % enabledTextBoxes.Count].Focus(); + return; + } + } + } + } + + private void startTextBox1_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox1); } + private void startTextBox2_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox2); } + private void startTextBox3_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox3); } + private void startTextBox4_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox4); } + private void startTextBox5_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox5); } + private void startTextBox6_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox6); } + private void startTextBox7_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox7); } + private void startTextBox8_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox8); } + private void startTextBox9_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox9); } + private void startTextBox10_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox10); } + private void startTextBox11_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox11); } + private void startTextBox12_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox12); } + + private void endTextBox1_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox1); } + private void endTextBox2_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox2); } + private void endTextBox3_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox3); } + private void endTextBox4_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox4); } + private void endTextBox5_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox5); } + private void endTextBox6_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox6); } + private void endTextBox7_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox7); } + private void endTextBox8_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox8); } + private void endTextBox9_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox9); } + private void endTextBox10_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox10); } + private void endTextBox11_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox11); } + private void endTextBox12_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox12); } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/TestStartEndForm.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/TestStartEndForm.designer.cs new file mode 100644 index 00000000..450d0445 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/TestStartEndForm.designer.cs @@ -0,0 +1,794 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.Standard12 +{ + partial class TestStartEndForm + { + /// + /// 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() + { + this.exclamation1 = new System.Windows.Forms.Label(); + this.startTextBox1 = new System.Windows.Forms.TextBox(); + this.endTextBox1 = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.okButton = new System.Windows.Forms.Button(); + this.exclamation3 = new System.Windows.Forms.Label(); + this.startTextBox3 = new System.Windows.Forms.TextBox(); + this.endTextBox3 = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.exclamation4 = new System.Windows.Forms.Label(); + this.startTextBox4 = new System.Windows.Forms.TextBox(); + this.endTextBox4 = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.exclamation5 = new System.Windows.Forms.Label(); + this.startTextBox5 = new System.Windows.Forms.TextBox(); + this.endTextBox5 = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.exclamation6 = new System.Windows.Forms.Label(); + this.startTextBox6 = new System.Windows.Forms.TextBox(); + this.endTextBox6 = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.startLabel = new System.Windows.Forms.Label(); + this.endLabel = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.endTextBox2 = new System.Windows.Forms.TextBox(); + this.startTextBox2 = new System.Windows.Forms.TextBox(); + this.exclamation2 = new System.Windows.Forms.Label(); + this.exclamation7 = new System.Windows.Forms.Label(); + this.startTextBox7 = new System.Windows.Forms.TextBox(); + this.endTextBox7 = new System.Windows.Forms.TextBox(); + this.label7 = new System.Windows.Forms.Label(); + this.exclamation8 = new System.Windows.Forms.Label(); + this.startTextBox8 = new System.Windows.Forms.TextBox(); + this.endTextBox8 = new System.Windows.Forms.TextBox(); + this.label8 = new System.Windows.Forms.Label(); + this.exclamation9 = new System.Windows.Forms.Label(); + this.startTextBox9 = new System.Windows.Forms.TextBox(); + this.endTextBox9 = new System.Windows.Forms.TextBox(); + this.label9 = new System.Windows.Forms.Label(); + this.exclamation10 = new System.Windows.Forms.Label(); + this.startTextBox10 = new System.Windows.Forms.TextBox(); + this.endTextBox10 = new System.Windows.Forms.TextBox(); + this.label10 = new System.Windows.Forms.Label(); + this.exclamation11 = new System.Windows.Forms.Label(); + this.startTextBox11 = new System.Windows.Forms.TextBox(); + this.endTextBox11 = new System.Windows.Forms.TextBox(); + this.label11 = new System.Windows.Forms.Label(); + this.exclamation12 = new System.Windows.Forms.Label(); + this.startTextBox12 = new System.Windows.Forms.TextBox(); + this.endTextBox12 = new System.Windows.Forms.TextBox(); + this.label12 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // exclamation1 + // + this.exclamation1.AutoSize = true; + this.exclamation1.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation1.ForeColor = System.Drawing.Color.Red; + this.exclamation1.Location = new System.Drawing.Point(532, 56); + this.exclamation1.Name = "exclamation1"; + this.exclamation1.Size = new System.Drawing.Size(30, 38); + this.exclamation1.TabIndex = 5; + this.exclamation1.Text = "!"; + this.exclamation1.Visible = false; + // + // startTextBox1 + // + this.startTextBox1.Enabled = false; + this.startTextBox1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox1.Location = new System.Drawing.Point(185, 60); + this.startTextBox1.Name = "startTextBox1"; + this.startTextBox1.Size = new System.Drawing.Size(163, 31); + this.startTextBox1.TabIndex = 3; + this.startTextBox1.Visible = false; + this.startTextBox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox1_KeyPress); + // + // endTextBox1 + // + this.endTextBox1.Enabled = false; + this.endTextBox1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox1.Location = new System.Drawing.Point(367, 60); + this.endTextBox1.Name = "endTextBox1"; + this.endTextBox1.Size = new System.Drawing.Size(163, 31); + this.endTextBox1.TabIndex = 4; + this.endTextBox1.Visible = false; + this.endTextBox1.TextChanged += new System.EventHandler(this.endTextBox1_TextChanged); + this.endTextBox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox1_KeyPress); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label1.Location = new System.Drawing.Point(23, 63); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(145, 23); + this.label1.TabIndex = 2; + this.label1.Text = "Water Meter 1"; + this.label1.Visible = false; + // + // okButton + // + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(603, 60); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(98, 63); + this.okButton.TabIndex = 100; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // exclamation3 + // + this.exclamation3.AutoSize = true; + this.exclamation3.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation3.ForeColor = System.Drawing.Color.Red; + this.exclamation3.Location = new System.Drawing.Point(532, 144); + this.exclamation3.Name = "exclamation3"; + this.exclamation3.Size = new System.Drawing.Size(30, 38); + this.exclamation3.TabIndex = 13; + this.exclamation3.Text = "!"; + this.exclamation3.Visible = false; + // + // startTextBox3 + // + this.startTextBox3.Enabled = false; + this.startTextBox3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox3.Location = new System.Drawing.Point(185, 148); + this.startTextBox3.Name = "startTextBox3"; + this.startTextBox3.Size = new System.Drawing.Size(163, 31); + this.startTextBox3.TabIndex = 11; + this.startTextBox3.Visible = false; + this.startTextBox3.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox3_KeyPress); + // + // endTextBox3 + // + this.endTextBox3.Enabled = false; + this.endTextBox3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox3.Location = new System.Drawing.Point(367, 148); + this.endTextBox3.Name = "endTextBox3"; + this.endTextBox3.Size = new System.Drawing.Size(163, 31); + this.endTextBox3.TabIndex = 12; + this.endTextBox3.Visible = false; + this.endTextBox3.TextChanged += new System.EventHandler(this.endTextBox3_TextChanged); + this.endTextBox3.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox3_KeyPress); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label3.Location = new System.Drawing.Point(23, 151); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(145, 23); + this.label3.TabIndex = 10; + this.label3.Text = "Water Meter 3"; + this.label3.Visible = false; + // + // exclamation4 + // + this.exclamation4.AutoSize = true; + this.exclamation4.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation4.ForeColor = System.Drawing.Color.Red; + this.exclamation4.Location = new System.Drawing.Point(532, 188); + this.exclamation4.Name = "exclamation4"; + this.exclamation4.Size = new System.Drawing.Size(30, 38); + this.exclamation4.TabIndex = 17; + this.exclamation4.Text = "!"; + this.exclamation4.Visible = false; + // + // startTextBox4 + // + this.startTextBox4.Enabled = false; + this.startTextBox4.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox4.Location = new System.Drawing.Point(185, 192); + this.startTextBox4.Name = "startTextBox4"; + this.startTextBox4.Size = new System.Drawing.Size(163, 31); + this.startTextBox4.TabIndex = 15; + this.startTextBox4.Visible = false; + this.startTextBox4.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox4_KeyPress); + // + // endTextBox4 + // + this.endTextBox4.Enabled = false; + this.endTextBox4.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox4.Location = new System.Drawing.Point(367, 192); + this.endTextBox4.Name = "endTextBox4"; + this.endTextBox4.Size = new System.Drawing.Size(163, 31); + this.endTextBox4.TabIndex = 16; + this.endTextBox4.Visible = false; + this.endTextBox4.TextChanged += new System.EventHandler(this.endTextBox4_TextChanged); + this.endTextBox4.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox4_KeyPress); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label4.Location = new System.Drawing.Point(23, 195); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(145, 23); + this.label4.TabIndex = 14; + this.label4.Text = "Water Meter 4"; + this.label4.Visible = false; + // + // exclamation5 + // + this.exclamation5.AutoSize = true; + this.exclamation5.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation5.ForeColor = System.Drawing.Color.Red; + this.exclamation5.Location = new System.Drawing.Point(532, 232); + this.exclamation5.Name = "exclamation5"; + this.exclamation5.Size = new System.Drawing.Size(30, 38); + this.exclamation5.TabIndex = 21; + this.exclamation5.Text = "!"; + this.exclamation5.Visible = false; + // + // startTextBox5 + // + this.startTextBox5.Enabled = false; + this.startTextBox5.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox5.Location = new System.Drawing.Point(185, 236); + this.startTextBox5.Name = "startTextBox5"; + this.startTextBox5.Size = new System.Drawing.Size(163, 31); + this.startTextBox5.TabIndex = 19; + this.startTextBox5.Visible = false; + this.startTextBox5.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox5_KeyPress); + // + // endTextBox5 + // + this.endTextBox5.Enabled = false; + this.endTextBox5.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox5.Location = new System.Drawing.Point(367, 236); + this.endTextBox5.Name = "endTextBox5"; + this.endTextBox5.Size = new System.Drawing.Size(163, 31); + this.endTextBox5.TabIndex = 20; + this.endTextBox5.Visible = false; + this.endTextBox5.TextChanged += new System.EventHandler(this.endTextBox5_TextChanged); + this.endTextBox5.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox5_KeyPress); + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label5.Location = new System.Drawing.Point(23, 239); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(145, 23); + this.label5.TabIndex = 18; + this.label5.Text = "Water Meter 5"; + this.label5.Visible = false; + // + // exclamation6 + // + this.exclamation6.AutoSize = true; + this.exclamation6.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation6.ForeColor = System.Drawing.Color.Red; + this.exclamation6.Location = new System.Drawing.Point(532, 276); + this.exclamation6.Name = "exclamation6"; + this.exclamation6.Size = new System.Drawing.Size(30, 38); + this.exclamation6.TabIndex = 25; + this.exclamation6.Text = "!"; + this.exclamation6.Visible = false; + // + // startTextBox6 + // + this.startTextBox6.Enabled = false; + this.startTextBox6.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox6.Location = new System.Drawing.Point(185, 280); + this.startTextBox6.Name = "startTextBox6"; + this.startTextBox6.Size = new System.Drawing.Size(163, 31); + this.startTextBox6.TabIndex = 23; + this.startTextBox6.Visible = false; + this.startTextBox6.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox6_KeyPress); + // + // endTextBox6 + // + this.endTextBox6.Enabled = false; + this.endTextBox6.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox6.Location = new System.Drawing.Point(367, 280); + this.endTextBox6.Name = "endTextBox6"; + this.endTextBox6.Size = new System.Drawing.Size(163, 31); + this.endTextBox6.TabIndex = 24; + this.endTextBox6.Visible = false; + this.endTextBox6.TextChanged += new System.EventHandler(this.endTextBox6_TextChanged); + this.endTextBox6.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox6_KeyPress); + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label6.Location = new System.Drawing.Point(23, 283); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(145, 23); + this.label6.TabIndex = 22; + this.label6.Text = "Water Meter 6"; + this.label6.Visible = false; + // + // startLabel + // + this.startLabel.AutoSize = true; + this.startLabel.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startLabel.Location = new System.Drawing.Point(237, 21); + this.startLabel.Name = "startLabel"; + this.startLabel.Size = new System.Drawing.Size(56, 23); + this.startLabel.TabIndex = 0; + this.startLabel.Text = "Start"; + // + // endLabel + // + this.endLabel.AutoSize = true; + this.endLabel.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endLabel.Location = new System.Drawing.Point(423, 21); + this.endLabel.Name = "endLabel"; + this.endLabel.Size = new System.Drawing.Size(46, 23); + this.endLabel.TabIndex = 1; + this.endLabel.Text = "End"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label2.Location = new System.Drawing.Point(23, 107); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(145, 23); + this.label2.TabIndex = 6; + this.label2.Text = "Water Meter 2"; + this.label2.Visible = false; + // + // endTextBox2 + // + this.endTextBox2.Enabled = false; + this.endTextBox2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox2.Location = new System.Drawing.Point(367, 104); + this.endTextBox2.Name = "endTextBox2"; + this.endTextBox2.Size = new System.Drawing.Size(163, 31); + this.endTextBox2.TabIndex = 8; + this.endTextBox2.Visible = false; + this.endTextBox2.TextChanged += new System.EventHandler(this.endTextBox2_TextChanged); + this.endTextBox2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox2_KeyPress); + // + // startTextBox2 + // + this.startTextBox2.Enabled = false; + this.startTextBox2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox2.Location = new System.Drawing.Point(185, 104); + this.startTextBox2.Name = "startTextBox2"; + this.startTextBox2.Size = new System.Drawing.Size(163, 31); + this.startTextBox2.TabIndex = 7; + this.startTextBox2.Visible = false; + this.startTextBox2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox2_KeyPress); + // + // exclamation2 + // + this.exclamation2.AutoSize = true; + this.exclamation2.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation2.ForeColor = System.Drawing.Color.Red; + this.exclamation2.Location = new System.Drawing.Point(532, 100); + this.exclamation2.Name = "exclamation2"; + this.exclamation2.Size = new System.Drawing.Size(30, 38); + this.exclamation2.TabIndex = 9; + this.exclamation2.Text = "!"; + this.exclamation2.Visible = false; + // + // exclamation7 + // + this.exclamation7.AutoSize = true; + this.exclamation7.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation7.ForeColor = System.Drawing.Color.Red; + this.exclamation7.Location = new System.Drawing.Point(532, 320); + this.exclamation7.Name = "exclamation7"; + this.exclamation7.Size = new System.Drawing.Size(30, 38); + this.exclamation7.TabIndex = 29; + this.exclamation7.Text = "!"; + this.exclamation7.Visible = false; + // + // startTextBox7 + // + this.startTextBox7.Enabled = false; + this.startTextBox7.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox7.Location = new System.Drawing.Point(185, 324); + this.startTextBox7.Name = "startTextBox7"; + this.startTextBox7.Size = new System.Drawing.Size(163, 31); + this.startTextBox7.TabIndex = 27; + this.startTextBox7.Visible = false; + this.startTextBox7.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox7_KeyPress); + // + // endTextBox7 + // + this.endTextBox7.Enabled = false; + this.endTextBox7.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox7.Location = new System.Drawing.Point(367, 324); + this.endTextBox7.Name = "endTextBox7"; + this.endTextBox7.Size = new System.Drawing.Size(163, 31); + this.endTextBox7.TabIndex = 28; + this.endTextBox7.Visible = false; + this.endTextBox7.TextChanged += new System.EventHandler(this.endTextBox7_TextChanged); + this.endTextBox7.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox7_KeyPress); + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label7.Location = new System.Drawing.Point(23, 327); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(145, 23); + this.label7.TabIndex = 26; + this.label7.Text = "Water Meter 7"; + this.label7.Visible = false; + // + // exclamation8 + // + this.exclamation8.AutoSize = true; + this.exclamation8.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation8.ForeColor = System.Drawing.Color.Red; + this.exclamation8.Location = new System.Drawing.Point(532, 364); + this.exclamation8.Name = "exclamation8"; + this.exclamation8.Size = new System.Drawing.Size(30, 38); + this.exclamation8.TabIndex = 33; + this.exclamation8.Text = "!"; + this.exclamation8.Visible = false; + // + // startTextBox8 + // + this.startTextBox8.Enabled = false; + this.startTextBox8.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox8.Location = new System.Drawing.Point(185, 368); + this.startTextBox8.Name = "startTextBox8"; + this.startTextBox8.Size = new System.Drawing.Size(163, 31); + this.startTextBox8.TabIndex = 31; + this.startTextBox8.Visible = false; + this.startTextBox8.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox8_KeyPress); + // + // endTextBox8 + // + this.endTextBox8.Enabled = false; + this.endTextBox8.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox8.Location = new System.Drawing.Point(367, 368); + this.endTextBox8.Name = "endTextBox8"; + this.endTextBox8.Size = new System.Drawing.Size(163, 31); + this.endTextBox8.TabIndex = 32; + this.endTextBox8.Visible = false; + this.endTextBox8.TextChanged += new System.EventHandler(this.endTextBox8_TextChanged); + this.endTextBox8.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox8_KeyPress); + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label8.Location = new System.Drawing.Point(23, 371); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(145, 23); + this.label8.TabIndex = 30; + this.label8.Text = "Water Meter 8"; + this.label8.Visible = false; + // + // exclamation9 + // + this.exclamation9.AutoSize = true; + this.exclamation9.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation9.ForeColor = System.Drawing.Color.Red; + this.exclamation9.Location = new System.Drawing.Point(532, 408); + this.exclamation9.Name = "exclamation9"; + this.exclamation9.Size = new System.Drawing.Size(30, 38); + this.exclamation9.TabIndex = 37; + this.exclamation9.Text = "!"; + this.exclamation9.Visible = false; + // + // startTextBox9 + // + this.startTextBox9.Enabled = false; + this.startTextBox9.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox9.Location = new System.Drawing.Point(185, 412); + this.startTextBox9.Name = "startTextBox9"; + this.startTextBox9.Size = new System.Drawing.Size(163, 31); + this.startTextBox9.TabIndex = 35; + this.startTextBox9.Visible = false; + this.startTextBox9.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox9_KeyPress); + // + // endTextBox9 + // + this.endTextBox9.Enabled = false; + this.endTextBox9.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox9.Location = new System.Drawing.Point(367, 412); + this.endTextBox9.Name = "endTextBox9"; + this.endTextBox9.Size = new System.Drawing.Size(163, 31); + this.endTextBox9.TabIndex = 36; + this.endTextBox9.Visible = false; + this.endTextBox9.TextChanged += new System.EventHandler(this.endTextBox9_TextChanged); + this.endTextBox9.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox9_KeyPress); + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label9.Location = new System.Drawing.Point(23, 415); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(145, 23); + this.label9.TabIndex = 34; + this.label9.Text = "Water Meter 9"; + this.label9.Visible = false; + // + // exclamation10 + // + this.exclamation10.AutoSize = true; + this.exclamation10.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation10.ForeColor = System.Drawing.Color.Red; + this.exclamation10.Location = new System.Drawing.Point(532, 452); + this.exclamation10.Name = "exclamation10"; + this.exclamation10.Size = new System.Drawing.Size(30, 38); + this.exclamation10.TabIndex = 41; + this.exclamation10.Text = "!"; + this.exclamation10.Visible = false; + // + // startTextBox10 + // + this.startTextBox10.Enabled = false; + this.startTextBox10.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox10.Location = new System.Drawing.Point(185, 456); + this.startTextBox10.Name = "startTextBox10"; + this.startTextBox10.Size = new System.Drawing.Size(163, 31); + this.startTextBox10.TabIndex = 39; + this.startTextBox10.Visible = false; + this.startTextBox10.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox10_KeyPress); + // + // endTextBox10 + // + this.endTextBox10.Enabled = false; + this.endTextBox10.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox10.Location = new System.Drawing.Point(367, 456); + this.endTextBox10.Name = "endTextBox10"; + this.endTextBox10.Size = new System.Drawing.Size(163, 31); + this.endTextBox10.TabIndex = 40; + this.endTextBox10.Visible = false; + this.endTextBox10.TextChanged += new System.EventHandler(this.endTextBox10_TextChanged); + this.endTextBox10.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox10_KeyPress); + // + // label10 + // + this.label10.AutoSize = true; + this.label10.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label10.Location = new System.Drawing.Point(23, 459); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(157, 23); + this.label10.TabIndex = 38; + this.label10.Text = "Water Meter 10"; + this.label10.Visible = false; + // + // exclamation11 + // + this.exclamation11.AutoSize = true; + this.exclamation11.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation11.ForeColor = System.Drawing.Color.Red; + this.exclamation11.Location = new System.Drawing.Point(532, 496); + this.exclamation11.Name = "exclamation11"; + this.exclamation11.Size = new System.Drawing.Size(30, 38); + this.exclamation11.TabIndex = 45; + this.exclamation11.Text = "!"; + this.exclamation11.Visible = false; + // + // startTextBox11 + // + this.startTextBox11.Enabled = false; + this.startTextBox11.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox11.Location = new System.Drawing.Point(185, 500); + this.startTextBox11.Name = "startTextBox11"; + this.startTextBox11.Size = new System.Drawing.Size(163, 31); + this.startTextBox11.TabIndex = 43; + this.startTextBox11.Visible = false; + this.startTextBox11.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox11_KeyPress); + // + // endTextBox11 + // + this.endTextBox11.Enabled = false; + this.endTextBox11.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox11.Location = new System.Drawing.Point(367, 500); + this.endTextBox11.Name = "endTextBox11"; + this.endTextBox11.Size = new System.Drawing.Size(163, 31); + this.endTextBox11.TabIndex = 44; + this.endTextBox11.Visible = false; + this.endTextBox11.TextChanged += new System.EventHandler(this.endTextBox11_TextChanged); + this.endTextBox11.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox11_KeyPress); + // + // label11 + // + this.label11.AutoSize = true; + this.label11.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label11.Location = new System.Drawing.Point(23, 503); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(157, 23); + this.label11.TabIndex = 42; + this.label11.Text = "Water Meter 11"; + this.label11.Visible = false; + // + // exclamation12 + // + this.exclamation12.AutoSize = true; + this.exclamation12.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation12.ForeColor = System.Drawing.Color.Red; + this.exclamation12.Location = new System.Drawing.Point(532, 540); + this.exclamation12.Name = "exclamation12"; + this.exclamation12.Size = new System.Drawing.Size(30, 38); + this.exclamation12.TabIndex = 49; + this.exclamation12.Text = "!"; + this.exclamation12.Visible = false; + // + // startTextBox12 + // + this.startTextBox12.Enabled = false; + this.startTextBox12.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox12.Location = new System.Drawing.Point(185, 544); + this.startTextBox12.Name = "startTextBox12"; + this.startTextBox12.Size = new System.Drawing.Size(163, 31); + this.startTextBox12.TabIndex = 47; + this.startTextBox12.Visible = false; + this.startTextBox12.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox12_KeyPress); + // + // endTextBox12 + // + this.endTextBox12.Enabled = false; + this.endTextBox12.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox12.Location = new System.Drawing.Point(367, 544); + this.endTextBox12.Name = "endTextBox12"; + this.endTextBox12.Size = new System.Drawing.Size(163, 31); + this.endTextBox12.TabIndex = 48; + this.endTextBox12.Visible = false; + this.endTextBox12.TextChanged += new System.EventHandler(this.endTextBox12_TextChanged); + this.endTextBox12.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox12_KeyPress); + // + // label12 + // + this.label12.AutoSize = true; + this.label12.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label12.Location = new System.Drawing.Point(23, 547); + this.label12.Name = "label12"; + this.label12.Size = new System.Drawing.Size(157, 23); + this.label12.TabIndex = 46; + this.label12.Text = "Water Meter 12"; + this.label12.Visible = false; + // + // TestStartEndForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.ClientSize = new System.Drawing.Size(753, 613); + this.Controls.Add(this.exclamation12); + this.Controls.Add(this.startTextBox12); + this.Controls.Add(this.endTextBox12); + this.Controls.Add(this.label12); + this.Controls.Add(this.exclamation11); + this.Controls.Add(this.startTextBox11); + this.Controls.Add(this.endTextBox11); + this.Controls.Add(this.label11); + this.Controls.Add(this.exclamation10); + this.Controls.Add(this.startTextBox10); + this.Controls.Add(this.endTextBox10); + this.Controls.Add(this.label10); + this.Controls.Add(this.exclamation9); + this.Controls.Add(this.startTextBox9); + this.Controls.Add(this.endTextBox9); + this.Controls.Add(this.label9); + this.Controls.Add(this.exclamation8); + this.Controls.Add(this.startTextBox8); + this.Controls.Add(this.endTextBox8); + this.Controls.Add(this.label8); + this.Controls.Add(this.exclamation7); + this.Controls.Add(this.startTextBox7); + this.Controls.Add(this.endTextBox7); + this.Controls.Add(this.label7); + this.Controls.Add(this.exclamation6); + this.Controls.Add(this.exclamation5); + this.Controls.Add(this.startTextBox6); + this.Controls.Add(this.exclamation4); + this.Controls.Add(this.endTextBox6); + this.Controls.Add(this.label6); + this.Controls.Add(this.startTextBox5); + this.Controls.Add(this.exclamation3); + this.Controls.Add(this.endTextBox5); + this.Controls.Add(this.label5); + this.Controls.Add(this.startTextBox4); + this.Controls.Add(this.exclamation2); + this.Controls.Add(this.endTextBox4); + this.Controls.Add(this.label4); + this.Controls.Add(this.startTextBox3); + this.Controls.Add(this.exclamation1); + this.Controls.Add(this.endTextBox3); + this.Controls.Add(this.label3); + this.Controls.Add(this.startTextBox2); + this.Controls.Add(this.endLabel); + this.Controls.Add(this.endTextBox2); + this.Controls.Add(this.label2); + this.Controls.Add(this.startTextBox1); + this.Controls.Add(this.startLabel); + this.Controls.Add(this.endTextBox1); + this.Controls.Add(this.label1); + this.Controls.Add(this.okButton); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "TestStartEndForm"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "End States"; + this.TopMost = true; + this.Load += new System.EventHandler(this.CycleEndForm_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox endTextBox1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.TextBox endTextBox3; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox endTextBox4; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox endTextBox5; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.TextBox endTextBox6; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TextBox startTextBox1; + private System.Windows.Forms.TextBox startTextBox3; + private System.Windows.Forms.TextBox startTextBox4; + private System.Windows.Forms.TextBox startTextBox5; + private System.Windows.Forms.TextBox startTextBox6; + private System.Windows.Forms.Label startLabel; + private System.Windows.Forms.Label endLabel; + private System.Windows.Forms.Label exclamation1; + private System.Windows.Forms.Label exclamation3; + private System.Windows.Forms.Label exclamation4; + private System.Windows.Forms.Label exclamation5; + private System.Windows.Forms.Label exclamation6; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox endTextBox2; + private System.Windows.Forms.TextBox startTextBox2; + private System.Windows.Forms.Label exclamation2; + private System.Windows.Forms.Label exclamation7; + private System.Windows.Forms.TextBox startTextBox7; + private System.Windows.Forms.TextBox endTextBox7; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.Label exclamation8; + private System.Windows.Forms.TextBox startTextBox8; + private System.Windows.Forms.TextBox endTextBox8; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.Label exclamation9; + private System.Windows.Forms.TextBox startTextBox9; + private System.Windows.Forms.TextBox endTextBox9; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.Label exclamation10; + private System.Windows.Forms.TextBox startTextBox10; + private System.Windows.Forms.TextBox endTextBox10; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.Label exclamation11; + private System.Windows.Forms.TextBox startTextBox11; + private System.Windows.Forms.TextBox endTextBox11; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.Label exclamation12; + private System.Windows.Forms.TextBox startTextBox12; + private System.Windows.Forms.TextBox endTextBox12; + private System.Windows.Forms.Label label12; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/TestStartEndForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/TestStartEndForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard12/TestStartEndForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/AdvancedFixedStartTestForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/AdvancedFixedStartTestForm.cs new file mode 100644 index 00000000..e181d735 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/AdvancedFixedStartTestForm.cs @@ -0,0 +1,668 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using log4net; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.Standard24 +{ + public partial class AdvancedFixedStartTestForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(AdvancedFixedStartTestForm)); + + // Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + /// Number of text boxes for serial numbers + public readonly int WaterMetersCount; + + readonly bool[] disabled; + + // To be retrieved after the form closes + public float[] WMStartState; + + // To be retrieved after the form closes + public readonly string[] WMStartStateStr; + + // To be retrieved after the form closes + public float[] WMEndState; + + bool endStates; /// false=start states, true=end states + double refVolume; + double warningLimLo; /// limit to display exclamation mark, typically 2x errLimLo + double warningLimHi; /// limit to display exclamation mark, typically 2x errLimHi + + int TextBoxesCount; + /// + Label[] labels; + TextBox[] startTextBoxes; + TextBox[] mid1TextBoxes; + TextBox[] mid2TextBoxes; + TextBox[] endTextBoxes; + IList enabledTextBoxes; + + /// + /// Parameterless constructor initializing common part for start and endstate form + /// + public AdvancedFixedStartTestForm() + { + InitializeComponent(); + ControlBox = false; + + TextBoxesCount = 24; + + labels = new Label[] + { + label1, label2, label3, label4, label5, label6, label7, label8, label9, label10, + label11, label12, label13, label14, label15, label16, label17, label18, label19, label20, + label21, label22, label23, label24, + }; + startTextBoxes = new TextBox[] + { + startTextBox1, startTextBox2, startTextBox3, startTextBox4, startTextBox5, startTextBox6, + startTextBox7, startTextBox8, startTextBox9, startTextBox10, startTextBox11, startTextBox12, + startTextBox13, startTextBox14, startTextBox15, startTextBox16, startTextBox17, startTextBox18, + startTextBox19, startTextBox20, startTextBox21, startTextBox22, startTextBox23, startTextBox24, + }; + mid1TextBoxes = new TextBox[] + { + mid1TextBox1, mid1TextBox2, mid1TextBox3, mid1TextBox4, mid1TextBox5, mid1TextBox6, + mid1TextBox7, mid1TextBox8, mid1TextBox9, mid1TextBox10, mid1TextBox11, mid1TextBox12, + mid1TextBox13, mid1TextBox14, mid1TextBox15, mid1TextBox16, mid1TextBox17, mid1TextBox18, + mid1TextBox19, mid1TextBox20, mid1TextBox21, mid1TextBox22, mid1TextBox23, mid1TextBox24, + }; + mid2TextBoxes = new TextBox[] + { + mid2TextBox1, mid2TextBox2, mid2TextBox3, mid2TextBox4, mid2TextBox5, mid2TextBox6, + mid2TextBox7, mid2TextBox8, mid2TextBox9, mid2TextBox10, mid2TextBox11, mid2TextBox12, + mid2TextBox13, mid2TextBox14, mid2TextBox15, mid2TextBox16, mid2TextBox17, mid2TextBox18, + mid2TextBox19, mid2TextBox20, mid2TextBox21, mid2TextBox22, mid2TextBox23, mid2TextBox24, + }; + endTextBoxes = new TextBox[] + { + endTextBox1, endTextBox2, endTextBox3, endTextBox4, endTextBox5, endTextBox6, + endTextBox7, endTextBox8, endTextBox9, endTextBox10, endTextBox11, endTextBox12, + endTextBox13, endTextBox14, endTextBox15, endTextBox16, endTextBox17, endTextBox18, + endTextBox19, endTextBox20, endTextBox21, endTextBox22, endTextBox23, endTextBox24, + }; + enabledTextBoxes = new List(); + + completed = false; + StartForceCloseHandler(); + } + + /// + /// Constructor to fill in start states + /// + /// Number of water meters + /// Information from CycleBeginningForm about availability of water meters + public AdvancedFixedStartTestForm(int waterMetersCount, bool[] disabled) + : this() + { + endStates = false; + + this.WaterMetersCount = waterMetersCount; + this.disabled = disabled; + + ShuffleTextBoxes(); + + WMStartState = new float[waterMetersCount]; + WMStartStateStr = new string[waterMetersCount]; + } + + /// + /// Constructor to fill in end states + /// + /// Number of water meters + /// Information entered on test start + /// Information from CycleBeginningForm about availability of water meters + /// Reference volume, it is used to verify the end state, show/hide exclamation if necessary + /// Error limit low, it is used to verify the end state, show/hide exclamation if necessary + /// Error limit high, it is used to verify the end state, show/hide exclamation if necessary + public AdvancedFixedStartTestForm(int waterMetersCount, string[] wmStartStateStr, bool[] disabled, + double refVolume, double errLimLo, double errLimHi) + : this() + { + endStates = true; + + this.WaterMetersCount = waterMetersCount; + if (wmStartStateStr == null || wmStartStateStr.Length != waterMetersCount) + throw (new Exception("Invalid 'wmStartStateStr' argument")); + this.WMStartStateStr = wmStartStateStr; + this.disabled = disabled; + this.refVolume = refVolume; + this.warningLimLo = 2 * errLimLo; + this.warningLimHi = 2 * errLimHi; + + ShuffleTextBoxes(); + + WMEndState = new float[waterMetersCount]; + } + + /// + /// Make sure the layout of labels/text boxes on the screen + /// corresponds to the layout of watermeters of the test bench. + /// + void ShuffleTextBoxes() + { + if (Config.Data.WMsCount < TextBoxesCount) + { + int nrLines = Config.Data.WMsCount / Config.Data.LineSize; + int gap = (TextBoxesCount - Config.Data.WMsCount) / nrLines; + + int dest = 0; + for (int l = 0; l < nrLines; l++) + { + for (int i = 0; i < Config.Data.LineSize; i++) + { + labels[dest] = labels[l * Config.Data.LineSize + l * gap + i]; + startTextBoxes[dest] = startTextBoxes[l * Config.Data.LineSize + l * gap + i]; + mid1TextBoxes[dest] = mid1TextBoxes[l * Config.Data.LineSize + l * gap + i]; + mid2TextBoxes[dest] = mid2TextBoxes[l * Config.Data.LineSize + l * gap + i]; + endTextBoxes[dest] = endTextBoxes[l * Config.Data.LineSize + l * gap + i]; + dest++; + } + } + TextBoxesCount = Config.Data.WMsCount; + } + } + + private void CycleEndForm_Load(object sender, EventArgs e) + { + Localize(); + + //Height = 115 + 90 * WaterMetersCount; + + for (int i = 0; i < TextBoxesCount; i++) + { + if (i < WaterMetersCount) + { + labels[i].Visible = startTextBoxes[i].Visible = mid1TextBoxes[i].Visible = mid2TextBoxes[i].Visible = endTextBoxes[i].Visible = true; + } + } + + if (endStates) + { + for (int i = 0; i < TextBoxesCount; i++) + { + if (WMStartStateStr != null && i < WMStartStateStr.Length) + { + startTextBoxes[i].Text = WMStartStateStr[i]; + } + + if (disabled != null && i < disabled.Length && disabled[i]) + { + endTextBoxes[i].Enabled = false; + } + else + { + endTextBoxes[i].Enabled = true; + enabledTextBoxes.Add(endTextBoxes[i]); + } + } + } + else + { + for (int i = 0; i < TextBoxesCount; i++) + { + if (disabled != null && i < disabled.Length && disabled[i]) + { + startTextBoxes[i].Enabled = false; + } + else + { + startTextBoxes[i].Enabled = true; + enabledTextBoxes.Add(startTextBoxes[i]); + } + } + } + } + + void Localize() + { + Text = Strings.Water_Meter_States; + for (int i = 0; i < TextBoxesCount; i++) + { + labels[i].Text = Strings.Water_Meter + " " + (i + 1).ToString(); + } + startLabel.Text = Strings.Start; + endLabel.Text = Strings.End; + okButton.Text = Strings.OkBtnText; + } + + private void okButton_Click(object sender, EventArgs eArgs) + { + try + { + if (endStates) + { + for (int i = 0; i < Math.Min(WaterMetersCount, TextBoxesCount); i++) + { + if (endTextBoxes[i].Visible && endTextBoxes[i].Enabled) + { + WMEndState[i] = Utils.ParseUFloat(endTextBoxes[i].Text); + } + } + } + else + { + for (int i = 0; i < Math.Min(WaterMetersCount, TextBoxesCount); i++) + { + if (startTextBoxes[i].Visible && startTextBoxes[i].Enabled) + { + WMStartStateStr[i] = startTextBoxes[i].Text; + WMStartState[i] = Utils.ParseUFloat(startTextBoxes[i].Text); + } + } + } + } + catch(Exception e) + { + log.ErrorFormat("Exception: {0}", e.Message); + return; + } + + completed = true; + 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) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + + /// + /// Calculate the approximate error and verify whether it is within limits. + /// Make an exclamation mark visible if out of range. + /// Similar event handler is implemented for all endTextBoxes (1..24). + /// + private void endTextBox1_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + float endState = Utils.ParseUFloat(endTextBox1.Text); + float startState = Utils.ParseUFloat(startTextBox1.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { }; + exclamation1.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox2_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + float endState = Utils.ParseUFloat(endTextBox2.Text); + float startState = Utils.ParseUFloat(startTextBox2.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation2.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox3_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + float endState = Utils.ParseUFloat(endTextBox3.Text); + float startState = Utils.ParseUFloat(startTextBox3.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation3.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox4_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + float endState = Utils.ParseUFloat(endTextBox4.Text); + float startState = Utils.ParseUFloat(startTextBox4.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation4.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox5_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + float endState = Utils.ParseUFloat(endTextBox5.Text); + float startState = Utils.ParseUFloat(startTextBox5.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation5.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox6_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + float endState = Utils.ParseUFloat(endTextBox6.Text); + float startState = Utils.ParseUFloat(startTextBox6.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation6.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox7_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + float endState = Utils.ParseUFloat(endTextBox7.Text); + float startState = Utils.ParseUFloat(startTextBox7.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation7.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox8_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + float endState = Utils.ParseUFloat(endTextBox8.Text); + float startState = Utils.ParseUFloat(startTextBox8.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation8.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox9_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + float endState = Utils.ParseUFloat(endTextBox9.Text); + float startState = Utils.ParseUFloat(startTextBox9.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation9.Visible = (err < warningLimLo) || (warningLimHi < err); + } + + private void endTextBox10_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + float endState = Utils.ParseUFloat(endTextBox10.Text); + float startState = Utils.ParseUFloat(startTextBox10.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation10.Visible = (err < warningLimLo) || (warningLimHi < err); + } + + private void endTextBox11_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + float endState = Utils.ParseUFloat(endTextBox11.Text); + float startState = Utils.ParseUFloat(startTextBox11.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation11.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox12_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + float endState = Utils.ParseUFloat(endTextBox12.Text); + float startState = Utils.ParseUFloat(startTextBox12.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation12.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox13_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + float endState = Utils.ParseUFloat(endTextBox13.Text); + float startState = Utils.ParseUFloat(startTextBox13.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation13.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox14_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + float endState = Utils.ParseUFloat(endTextBox14.Text); + float startState = Utils.ParseUFloat(startTextBox14.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation14.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox15_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + float endState = Utils.ParseUFloat(endTextBox15.Text); + float startState = Utils.ParseUFloat(startTextBox15.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation15.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox16_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + float endState = Utils.ParseUFloat(endTextBox16.Text); + float startState = Utils.ParseUFloat(startTextBox16.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation16.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox17_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + float endState = Utils.ParseUFloat(endTextBox17.Text); + float startState = Utils.ParseUFloat(startTextBox17.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation17.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox18_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + float endState = Utils.ParseUFloat(endTextBox18.Text); + float startState = Utils.ParseUFloat(startTextBox18.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation18.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox19_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + float endState = Utils.ParseUFloat(endTextBox19.Text); + float startState = Utils.ParseUFloat(startTextBox19.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation19.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox20_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + float endState = Utils.ParseUFloat(endTextBox20.Text); + float startState = Utils.ParseUFloat(startTextBox20.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation20.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox21_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + float endState = Utils.ParseUFloat(endTextBox21.Text); + float startState = Utils.ParseUFloat(startTextBox21.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation21.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox22_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + float endState = Utils.ParseUFloat(endTextBox22.Text); + float startState = Utils.ParseUFloat(startTextBox22.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation22.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox23_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + float endState = Utils.ParseUFloat(endTextBox23.Text); + float startState = Utils.ParseUFloat(startTextBox23.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation23.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox24_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + float endState = Utils.ParseUFloat(endTextBox24.Text); + float startState = Utils.ParseUFloat(startTextBox24.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation24.Visible = (err < warningLimLo) || (warningLimHi < err); + } + + /// + /// Process a key press within any enabled text boxe + /// + /// + /// + /// TextBox control which received the event + private void ProcKeyPress(object sender, KeyPressEventArgs e, TextBox currentFocusOwner) + { + if (e.KeyChar == '+') + { + /// Process '+' key ..... Form completed + okButton_Click(sender, e); + } + if (e.KeyChar == '\r') + { + /// Process key ..... Next text field + if (enabledTextBoxes.Count < 2) return; /// There is just one enabled textbox + + for (int i = 0; i < enabledTextBoxes.Count; i++) + { + if (enabledTextBoxes[i] == currentFocusOwner) + { + /// Change focus to the next enabled text box + enabledTextBoxes[(i + 1) % enabledTextBoxes.Count].Focus(); + return; + } + } + } + } + + private void startTextBox1_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox1); } + private void startTextBox2_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox2); } + private void startTextBox3_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox3); } + private void startTextBox4_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox4); } + private void startTextBox5_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox5); } + private void startTextBox6_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox6); } + private void startTextBox7_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox7); } + private void startTextBox8_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox8); } + private void startTextBox9_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox9); } + private void startTextBox10_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox10); } + private void startTextBox11_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox11); } + private void startTextBox12_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox12); } + private void startTextBox13_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox13); } + private void startTextBox14_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox14); } + private void startTextBox15_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox15); } + private void startTextBox16_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox16); } + private void startTextBox17_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox17); } + private void startTextBox18_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox18); } + private void startTextBox19_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox19); } + private void startTextBox20_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox20); } + private void startTextBox21_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox21); } + private void startTextBox22_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox22); } + private void startTextBox23_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox23); } + private void startTextBox24_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox24); } + + private void endTextBox1_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox1); } + private void endTextBox2_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox2); } + private void endTextBox3_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox3); } + private void endTextBox4_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox4); } + private void endTextBox5_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox5); } + private void endTextBox6_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox6); } + private void endTextBox7_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox7); } + private void endTextBox8_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox8); } + private void endTextBox9_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox9); } + private void endTextBox10_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox10); } + private void endTextBox11_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox11); } + private void endTextBox12_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox12); } + private void endTextBox13_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox13); } + private void endTextBox14_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox14); } + private void endTextBox15_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox15); } + private void endTextBox16_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox16); } + private void endTextBox17_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox17); } + private void endTextBox18_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox18); } + private void endTextBox19_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox19); } + private void endTextBox20_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox20); } + private void endTextBox21_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox21); } + private void endTextBox22_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox22); } + private void endTextBox23_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox23); } + private void endTextBox24_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox24); } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/AdvancedFixedStartTestForm.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/AdvancedFixedStartTestForm.designer.cs new file mode 100644 index 00000000..d226c20e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/AdvancedFixedStartTestForm.designer.cs @@ -0,0 +1,2140 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.Standard24 +{ + partial class AdvancedFixedStartTestForm + { + /// + /// 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() + { + this.exclamation1 = new System.Windows.Forms.Label(); + this.startTextBox1 = new System.Windows.Forms.TextBox(); + this.endTextBox1 = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.okButton = new System.Windows.Forms.Button(); + this.exclamation3 = new System.Windows.Forms.Label(); + this.startTextBox3 = new System.Windows.Forms.TextBox(); + this.endTextBox3 = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.exclamation4 = new System.Windows.Forms.Label(); + this.startTextBox4 = new System.Windows.Forms.TextBox(); + this.endTextBox4 = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.exclamation5 = new System.Windows.Forms.Label(); + this.startTextBox5 = new System.Windows.Forms.TextBox(); + this.endTextBox5 = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.exclamation6 = new System.Windows.Forms.Label(); + this.startTextBox6 = new System.Windows.Forms.TextBox(); + this.endTextBox6 = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.startLabel = new System.Windows.Forms.Label(); + this.endLabel = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.endTextBox2 = new System.Windows.Forms.TextBox(); + this.startTextBox2 = new System.Windows.Forms.TextBox(); + this.exclamation2 = new System.Windows.Forms.Label(); + this.exclamation7 = new System.Windows.Forms.Label(); + this.startTextBox7 = new System.Windows.Forms.TextBox(); + this.endTextBox7 = new System.Windows.Forms.TextBox(); + this.label7 = new System.Windows.Forms.Label(); + this.exclamation8 = new System.Windows.Forms.Label(); + this.startTextBox8 = new System.Windows.Forms.TextBox(); + this.endTextBox8 = new System.Windows.Forms.TextBox(); + this.label8 = new System.Windows.Forms.Label(); + this.exclamation9 = new System.Windows.Forms.Label(); + this.startTextBox9 = new System.Windows.Forms.TextBox(); + this.endTextBox9 = new System.Windows.Forms.TextBox(); + this.label9 = new System.Windows.Forms.Label(); + this.exclamation10 = new System.Windows.Forms.Label(); + this.startTextBox10 = new System.Windows.Forms.TextBox(); + this.endTextBox10 = new System.Windows.Forms.TextBox(); + this.label10 = new System.Windows.Forms.Label(); + this.exclamation11 = new System.Windows.Forms.Label(); + this.startTextBox11 = new System.Windows.Forms.TextBox(); + this.endTextBox11 = new System.Windows.Forms.TextBox(); + this.label11 = new System.Windows.Forms.Label(); + this.exclamation12 = new System.Windows.Forms.Label(); + this.startTextBox12 = new System.Windows.Forms.TextBox(); + this.endTextBox12 = new System.Windows.Forms.TextBox(); + this.label12 = new System.Windows.Forms.Label(); + this.exclamation24 = new System.Windows.Forms.Label(); + this.startTextBox24 = new System.Windows.Forms.TextBox(); + this.endTextBox24 = new System.Windows.Forms.TextBox(); + this.label24 = new System.Windows.Forms.Label(); + this.exclamation23 = new System.Windows.Forms.Label(); + this.startTextBox23 = new System.Windows.Forms.TextBox(); + this.endTextBox23 = new System.Windows.Forms.TextBox(); + this.label23 = new System.Windows.Forms.Label(); + this.exclamation22 = new System.Windows.Forms.Label(); + this.startTextBox22 = new System.Windows.Forms.TextBox(); + this.endTextBox22 = new System.Windows.Forms.TextBox(); + this.label22 = new System.Windows.Forms.Label(); + this.exclamation21 = new System.Windows.Forms.Label(); + this.startTextBox21 = new System.Windows.Forms.TextBox(); + this.endTextBox21 = new System.Windows.Forms.TextBox(); + this.label21 = new System.Windows.Forms.Label(); + this.exclamation20 = new System.Windows.Forms.Label(); + this.startTextBox20 = new System.Windows.Forms.TextBox(); + this.endTextBox20 = new System.Windows.Forms.TextBox(); + this.label20 = new System.Windows.Forms.Label(); + this.exclamation19 = new System.Windows.Forms.Label(); + this.startTextBox19 = new System.Windows.Forms.TextBox(); + this.endTextBox19 = new System.Windows.Forms.TextBox(); + this.label19 = new System.Windows.Forms.Label(); + this.exclamation18 = new System.Windows.Forms.Label(); + this.exclamation17 = new System.Windows.Forms.Label(); + this.startTextBox18 = new System.Windows.Forms.TextBox(); + this.exclamation16 = new System.Windows.Forms.Label(); + this.endTextBox18 = new System.Windows.Forms.TextBox(); + this.label18 = new System.Windows.Forms.Label(); + this.startTextBox17 = new System.Windows.Forms.TextBox(); + this.exclamation15 = new System.Windows.Forms.Label(); + this.endTextBox17 = new System.Windows.Forms.TextBox(); + this.label17 = new System.Windows.Forms.Label(); + this.startTextBox16 = new System.Windows.Forms.TextBox(); + this.exclamation14 = new System.Windows.Forms.Label(); + this.endTextBox16 = new System.Windows.Forms.TextBox(); + this.label16 = new System.Windows.Forms.Label(); + this.startTextBox15 = new System.Windows.Forms.TextBox(); + this.exclamation13 = new System.Windows.Forms.Label(); + this.endTextBox15 = new System.Windows.Forms.TextBox(); + this.label15 = new System.Windows.Forms.Label(); + this.startTextBox14 = new System.Windows.Forms.TextBox(); + this.label35 = new System.Windows.Forms.Label(); + this.endTextBox14 = new System.Windows.Forms.TextBox(); + this.label14 = new System.Windows.Forms.Label(); + this.startTextBox13 = new System.Windows.Forms.TextBox(); + this.label37 = new System.Windows.Forms.Label(); + this.endTextBox13 = new System.Windows.Forms.TextBox(); + this.label13 = new System.Windows.Forms.Label(); + this.mid1TextBox1 = new System.Windows.Forms.TextBox(); + this.mid1TextBox2 = new System.Windows.Forms.TextBox(); + this.mid1TextBox3 = new System.Windows.Forms.TextBox(); + this.mid1TextBox4 = new System.Windows.Forms.TextBox(); + this.mid1TextBox5 = new System.Windows.Forms.TextBox(); + this.mid1TextBox6 = new System.Windows.Forms.TextBox(); + this.mid1TextBox7 = new System.Windows.Forms.TextBox(); + this.mid1TextBox8 = new System.Windows.Forms.TextBox(); + this.mid1TextBox9 = new System.Windows.Forms.TextBox(); + this.mid1TextBox10 = new System.Windows.Forms.TextBox(); + this.mid1TextBox11 = new System.Windows.Forms.TextBox(); + this.mid1TextBox12 = new System.Windows.Forms.TextBox(); + this.mid1TextBox13 = new System.Windows.Forms.TextBox(); + this.mid1TextBox14 = new System.Windows.Forms.TextBox(); + this.mid1TextBox15 = new System.Windows.Forms.TextBox(); + this.mid1TextBox16 = new System.Windows.Forms.TextBox(); + this.mid1TextBox17 = new System.Windows.Forms.TextBox(); + this.mid1TextBox18 = new System.Windows.Forms.TextBox(); + this.mid1TextBox19 = new System.Windows.Forms.TextBox(); + this.mid1TextBox20 = new System.Windows.Forms.TextBox(); + this.mid1TextBox21 = new System.Windows.Forms.TextBox(); + this.mid1TextBox22 = new System.Windows.Forms.TextBox(); + this.mid1TextBox23 = new System.Windows.Forms.TextBox(); + this.mid1TextBox24 = new System.Windows.Forms.TextBox(); + this.mid2TextBox1 = new System.Windows.Forms.TextBox(); + this.mid2TextBox2 = new System.Windows.Forms.TextBox(); + this.mid2TextBox3 = new System.Windows.Forms.TextBox(); + this.mid2TextBox4 = new System.Windows.Forms.TextBox(); + this.mid2TextBox5 = new System.Windows.Forms.TextBox(); + this.mid2TextBox6 = new System.Windows.Forms.TextBox(); + this.mid2TextBox7 = new System.Windows.Forms.TextBox(); + this.mid2TextBox8 = new System.Windows.Forms.TextBox(); + this.mid2TextBox9 = new System.Windows.Forms.TextBox(); + this.mid2TextBox10 = new System.Windows.Forms.TextBox(); + this.mid2TextBox11 = new System.Windows.Forms.TextBox(); + this.mid2TextBox12 = new System.Windows.Forms.TextBox(); + this.mid2TextBox13 = new System.Windows.Forms.TextBox(); + this.mid2TextBox14 = new System.Windows.Forms.TextBox(); + this.mid2TextBox15 = new System.Windows.Forms.TextBox(); + this.mid2TextBox16 = new System.Windows.Forms.TextBox(); + this.mid2TextBox17 = new System.Windows.Forms.TextBox(); + this.mid2TextBox18 = new System.Windows.Forms.TextBox(); + this.mid2TextBox19 = new System.Windows.Forms.TextBox(); + this.mid2TextBox20 = new System.Windows.Forms.TextBox(); + this.mid2TextBox21 = new System.Windows.Forms.TextBox(); + this.mid2TextBox22 = new System.Windows.Forms.TextBox(); + this.mid2TextBox23 = new System.Windows.Forms.TextBox(); + this.mid2TextBox24 = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // exclamation1 + // + this.exclamation1.AutoSize = true; + this.exclamation1.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation1.ForeColor = System.Drawing.Color.Red; + this.exclamation1.Location = new System.Drawing.Point(615, 91); + this.exclamation1.Name = "exclamation1"; + this.exclamation1.Size = new System.Drawing.Size(30, 38); + this.exclamation1.TabIndex = 5; + this.exclamation1.Text = "!"; + this.exclamation1.Visible = false; + // + // startTextBox1 + // + this.startTextBox1.Enabled = false; + this.startTextBox1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox1.Location = new System.Drawing.Point(168, 95); + this.startTextBox1.Name = "startTextBox1"; + this.startTextBox1.Size = new System.Drawing.Size(100, 31); + this.startTextBox1.TabIndex = 3; + this.startTextBox1.Visible = false; + this.startTextBox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox1_KeyPress); + // + // endTextBox1 + // + this.endTextBox1.Enabled = false; + this.endTextBox1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox1.Location = new System.Drawing.Point(513, 95); + this.endTextBox1.Name = "endTextBox1"; + this.endTextBox1.Size = new System.Drawing.Size(100, 31); + this.endTextBox1.TabIndex = 4; + this.endTextBox1.Visible = false; + this.endTextBox1.TextChanged += new System.EventHandler(this.endTextBox1_TextChanged); + this.endTextBox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox1_KeyPress); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label1.Location = new System.Drawing.Point(6, 98); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(145, 23); + this.label1.TabIndex = 2; + this.label1.Text = "Water Meter 1"; + this.label1.Visible = false; + // + // okButton + // + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(1265, 16); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(74, 50); + this.okButton.TabIndex = 100; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // exclamation3 + // + this.exclamation3.AutoSize = true; + this.exclamation3.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation3.ForeColor = System.Drawing.Color.Red; + this.exclamation3.Location = new System.Drawing.Point(615, 179); + this.exclamation3.Name = "exclamation3"; + this.exclamation3.Size = new System.Drawing.Size(30, 38); + this.exclamation3.TabIndex = 13; + this.exclamation3.Text = "!"; + this.exclamation3.Visible = false; + // + // startTextBox3 + // + this.startTextBox3.Enabled = false; + this.startTextBox3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox3.Location = new System.Drawing.Point(168, 183); + this.startTextBox3.Name = "startTextBox3"; + this.startTextBox3.Size = new System.Drawing.Size(100, 31); + this.startTextBox3.TabIndex = 11; + this.startTextBox3.Visible = false; + this.startTextBox3.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox3_KeyPress); + // + // endTextBox3 + // + this.endTextBox3.Enabled = false; + this.endTextBox3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox3.Location = new System.Drawing.Point(513, 183); + this.endTextBox3.Name = "endTextBox3"; + this.endTextBox3.Size = new System.Drawing.Size(100, 31); + this.endTextBox3.TabIndex = 12; + this.endTextBox3.Visible = false; + this.endTextBox3.TextChanged += new System.EventHandler(this.endTextBox3_TextChanged); + this.endTextBox3.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox3_KeyPress); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label3.Location = new System.Drawing.Point(6, 186); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(145, 23); + this.label3.TabIndex = 10; + this.label3.Text = "Water Meter 3"; + this.label3.Visible = false; + // + // exclamation4 + // + this.exclamation4.AutoSize = true; + this.exclamation4.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation4.ForeColor = System.Drawing.Color.Red; + this.exclamation4.Location = new System.Drawing.Point(615, 223); + this.exclamation4.Name = "exclamation4"; + this.exclamation4.Size = new System.Drawing.Size(30, 38); + this.exclamation4.TabIndex = 17; + this.exclamation4.Text = "!"; + this.exclamation4.Visible = false; + // + // startTextBox4 + // + this.startTextBox4.Enabled = false; + this.startTextBox4.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox4.Location = new System.Drawing.Point(168, 227); + this.startTextBox4.Name = "startTextBox4"; + this.startTextBox4.Size = new System.Drawing.Size(100, 31); + this.startTextBox4.TabIndex = 15; + this.startTextBox4.Visible = false; + this.startTextBox4.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox4_KeyPress); + // + // endTextBox4 + // + this.endTextBox4.Enabled = false; + this.endTextBox4.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox4.Location = new System.Drawing.Point(513, 227); + this.endTextBox4.Name = "endTextBox4"; + this.endTextBox4.Size = new System.Drawing.Size(100, 31); + this.endTextBox4.TabIndex = 16; + this.endTextBox4.Visible = false; + this.endTextBox4.TextChanged += new System.EventHandler(this.endTextBox4_TextChanged); + this.endTextBox4.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox4_KeyPress); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label4.Location = new System.Drawing.Point(6, 230); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(145, 23); + this.label4.TabIndex = 14; + this.label4.Text = "Water Meter 4"; + this.label4.Visible = false; + // + // exclamation5 + // + this.exclamation5.AutoSize = true; + this.exclamation5.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation5.ForeColor = System.Drawing.Color.Red; + this.exclamation5.Location = new System.Drawing.Point(615, 267); + this.exclamation5.Name = "exclamation5"; + this.exclamation5.Size = new System.Drawing.Size(30, 38); + this.exclamation5.TabIndex = 21; + this.exclamation5.Text = "!"; + this.exclamation5.Visible = false; + // + // startTextBox5 + // + this.startTextBox5.Enabled = false; + this.startTextBox5.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox5.Location = new System.Drawing.Point(168, 271); + this.startTextBox5.Name = "startTextBox5"; + this.startTextBox5.Size = new System.Drawing.Size(100, 31); + this.startTextBox5.TabIndex = 19; + this.startTextBox5.Visible = false; + this.startTextBox5.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox5_KeyPress); + // + // endTextBox5 + // + this.endTextBox5.Enabled = false; + this.endTextBox5.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox5.Location = new System.Drawing.Point(513, 271); + this.endTextBox5.Name = "endTextBox5"; + this.endTextBox5.Size = new System.Drawing.Size(100, 31); + this.endTextBox5.TabIndex = 20; + this.endTextBox5.Visible = false; + this.endTextBox5.TextChanged += new System.EventHandler(this.endTextBox5_TextChanged); + this.endTextBox5.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox5_KeyPress); + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label5.Location = new System.Drawing.Point(6, 274); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(145, 23); + this.label5.TabIndex = 18; + this.label5.Text = "Water Meter 5"; + this.label5.Visible = false; + // + // exclamation6 + // + this.exclamation6.AutoSize = true; + this.exclamation6.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation6.ForeColor = System.Drawing.Color.Red; + this.exclamation6.Location = new System.Drawing.Point(615, 311); + this.exclamation6.Name = "exclamation6"; + this.exclamation6.Size = new System.Drawing.Size(30, 38); + this.exclamation6.TabIndex = 25; + this.exclamation6.Text = "!"; + this.exclamation6.Visible = false; + // + // startTextBox6 + // + this.startTextBox6.Enabled = false; + this.startTextBox6.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox6.Location = new System.Drawing.Point(168, 315); + this.startTextBox6.Name = "startTextBox6"; + this.startTextBox6.Size = new System.Drawing.Size(100, 31); + this.startTextBox6.TabIndex = 23; + this.startTextBox6.Visible = false; + this.startTextBox6.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox6_KeyPress); + // + // endTextBox6 + // + this.endTextBox6.Enabled = false; + this.endTextBox6.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox6.Location = new System.Drawing.Point(513, 315); + this.endTextBox6.Name = "endTextBox6"; + this.endTextBox6.Size = new System.Drawing.Size(100, 31); + this.endTextBox6.TabIndex = 24; + this.endTextBox6.Visible = false; + this.endTextBox6.TextChanged += new System.EventHandler(this.endTextBox6_TextChanged); + this.endTextBox6.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox6_KeyPress); + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label6.Location = new System.Drawing.Point(6, 318); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(145, 23); + this.label6.TabIndex = 22; + this.label6.Text = "Water Meter 6"; + this.label6.Visible = false; + // + // startLabel + // + this.startLabel.AutoSize = true; + this.startLabel.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startLabel.Location = new System.Drawing.Point(195, 56); + this.startLabel.Name = "startLabel"; + this.startLabel.Size = new System.Drawing.Size(56, 23); + this.startLabel.TabIndex = 0; + this.startLabel.Text = "Start"; + // + // endLabel + // + this.endLabel.AutoSize = true; + this.endLabel.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endLabel.Location = new System.Drawing.Point(530, 56); + this.endLabel.Name = "endLabel"; + this.endLabel.Size = new System.Drawing.Size(46, 23); + this.endLabel.TabIndex = 1; + this.endLabel.Text = "End"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label2.Location = new System.Drawing.Point(6, 142); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(145, 23); + this.label2.TabIndex = 6; + this.label2.Text = "Water Meter 2"; + this.label2.Visible = false; + // + // endTextBox2 + // + this.endTextBox2.Enabled = false; + this.endTextBox2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox2.Location = new System.Drawing.Point(513, 139); + this.endTextBox2.Name = "endTextBox2"; + this.endTextBox2.Size = new System.Drawing.Size(100, 31); + this.endTextBox2.TabIndex = 8; + this.endTextBox2.Visible = false; + this.endTextBox2.TextChanged += new System.EventHandler(this.endTextBox2_TextChanged); + this.endTextBox2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox2_KeyPress); + // + // startTextBox2 + // + this.startTextBox2.Enabled = false; + this.startTextBox2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox2.Location = new System.Drawing.Point(168, 139); + this.startTextBox2.Name = "startTextBox2"; + this.startTextBox2.Size = new System.Drawing.Size(100, 31); + this.startTextBox2.TabIndex = 7; + this.startTextBox2.Visible = false; + this.startTextBox2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox2_KeyPress); + // + // exclamation2 + // + this.exclamation2.AutoSize = true; + this.exclamation2.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation2.ForeColor = System.Drawing.Color.Red; + this.exclamation2.Location = new System.Drawing.Point(615, 135); + this.exclamation2.Name = "exclamation2"; + this.exclamation2.Size = new System.Drawing.Size(30, 38); + this.exclamation2.TabIndex = 9; + this.exclamation2.Text = "!"; + this.exclamation2.Visible = false; + // + // exclamation7 + // + this.exclamation7.AutoSize = true; + this.exclamation7.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation7.ForeColor = System.Drawing.Color.Red; + this.exclamation7.Location = new System.Drawing.Point(615, 355); + this.exclamation7.Name = "exclamation7"; + this.exclamation7.Size = new System.Drawing.Size(30, 38); + this.exclamation7.TabIndex = 29; + this.exclamation7.Text = "!"; + this.exclamation7.Visible = false; + // + // startTextBox7 + // + this.startTextBox7.Enabled = false; + this.startTextBox7.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox7.Location = new System.Drawing.Point(168, 359); + this.startTextBox7.Name = "startTextBox7"; + this.startTextBox7.Size = new System.Drawing.Size(100, 31); + this.startTextBox7.TabIndex = 27; + this.startTextBox7.Visible = false; + this.startTextBox7.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox7_KeyPress); + // + // endTextBox7 + // + this.endTextBox7.Enabled = false; + this.endTextBox7.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox7.Location = new System.Drawing.Point(513, 359); + this.endTextBox7.Name = "endTextBox7"; + this.endTextBox7.Size = new System.Drawing.Size(100, 31); + this.endTextBox7.TabIndex = 28; + this.endTextBox7.Visible = false; + this.endTextBox7.TextChanged += new System.EventHandler(this.endTextBox7_TextChanged); + this.endTextBox7.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox7_KeyPress); + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label7.Location = new System.Drawing.Point(6, 362); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(145, 23); + this.label7.TabIndex = 26; + this.label7.Text = "Water Meter 7"; + this.label7.Visible = false; + // + // exclamation8 + // + this.exclamation8.AutoSize = true; + this.exclamation8.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation8.ForeColor = System.Drawing.Color.Red; + this.exclamation8.Location = new System.Drawing.Point(615, 399); + this.exclamation8.Name = "exclamation8"; + this.exclamation8.Size = new System.Drawing.Size(30, 38); + this.exclamation8.TabIndex = 33; + this.exclamation8.Text = "!"; + this.exclamation8.Visible = false; + // + // startTextBox8 + // + this.startTextBox8.Enabled = false; + this.startTextBox8.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox8.Location = new System.Drawing.Point(168, 403); + this.startTextBox8.Name = "startTextBox8"; + this.startTextBox8.Size = new System.Drawing.Size(100, 31); + this.startTextBox8.TabIndex = 31; + this.startTextBox8.Visible = false; + this.startTextBox8.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox8_KeyPress); + // + // endTextBox8 + // + this.endTextBox8.Enabled = false; + this.endTextBox8.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox8.Location = new System.Drawing.Point(513, 403); + this.endTextBox8.Name = "endTextBox8"; + this.endTextBox8.Size = new System.Drawing.Size(100, 31); + this.endTextBox8.TabIndex = 32; + this.endTextBox8.Visible = false; + this.endTextBox8.TextChanged += new System.EventHandler(this.endTextBox8_TextChanged); + this.endTextBox8.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox8_KeyPress); + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label8.Location = new System.Drawing.Point(6, 406); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(145, 23); + this.label8.TabIndex = 30; + this.label8.Text = "Water Meter 8"; + this.label8.Visible = false; + // + // exclamation9 + // + this.exclamation9.AutoSize = true; + this.exclamation9.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation9.ForeColor = System.Drawing.Color.Red; + this.exclamation9.Location = new System.Drawing.Point(615, 443); + this.exclamation9.Name = "exclamation9"; + this.exclamation9.Size = new System.Drawing.Size(30, 38); + this.exclamation9.TabIndex = 37; + this.exclamation9.Text = "!"; + this.exclamation9.Visible = false; + // + // startTextBox9 + // + this.startTextBox9.Enabled = false; + this.startTextBox9.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox9.Location = new System.Drawing.Point(168, 447); + this.startTextBox9.Name = "startTextBox9"; + this.startTextBox9.Size = new System.Drawing.Size(100, 31); + this.startTextBox9.TabIndex = 35; + this.startTextBox9.Visible = false; + this.startTextBox9.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox9_KeyPress); + // + // endTextBox9 + // + this.endTextBox9.Enabled = false; + this.endTextBox9.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox9.Location = new System.Drawing.Point(513, 447); + this.endTextBox9.Name = "endTextBox9"; + this.endTextBox9.Size = new System.Drawing.Size(100, 31); + this.endTextBox9.TabIndex = 36; + this.endTextBox9.Visible = false; + this.endTextBox9.TextChanged += new System.EventHandler(this.endTextBox9_TextChanged); + this.endTextBox9.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox9_KeyPress); + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label9.Location = new System.Drawing.Point(6, 450); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(145, 23); + this.label9.TabIndex = 34; + this.label9.Text = "Water Meter 9"; + this.label9.Visible = false; + // + // exclamation10 + // + this.exclamation10.AutoSize = true; + this.exclamation10.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation10.ForeColor = System.Drawing.Color.Red; + this.exclamation10.Location = new System.Drawing.Point(615, 487); + this.exclamation10.Name = "exclamation10"; + this.exclamation10.Size = new System.Drawing.Size(30, 38); + this.exclamation10.TabIndex = 41; + this.exclamation10.Text = "!"; + this.exclamation10.Visible = false; + // + // startTextBox10 + // + this.startTextBox10.Enabled = false; + this.startTextBox10.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox10.Location = new System.Drawing.Point(168, 491); + this.startTextBox10.Name = "startTextBox10"; + this.startTextBox10.Size = new System.Drawing.Size(100, 31); + this.startTextBox10.TabIndex = 39; + this.startTextBox10.Visible = false; + this.startTextBox10.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox10_KeyPress); + // + // endTextBox10 + // + this.endTextBox10.Enabled = false; + this.endTextBox10.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox10.Location = new System.Drawing.Point(513, 491); + this.endTextBox10.Name = "endTextBox10"; + this.endTextBox10.Size = new System.Drawing.Size(100, 31); + this.endTextBox10.TabIndex = 40; + this.endTextBox10.Visible = false; + this.endTextBox10.TextChanged += new System.EventHandler(this.endTextBox10_TextChanged); + this.endTextBox10.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox10_KeyPress); + // + // label10 + // + this.label10.AutoSize = true; + this.label10.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label10.Location = new System.Drawing.Point(6, 494); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(157, 23); + this.label10.TabIndex = 38; + this.label10.Text = "Water Meter 10"; + this.label10.Visible = false; + // + // exclamation11 + // + this.exclamation11.AutoSize = true; + this.exclamation11.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation11.ForeColor = System.Drawing.Color.Red; + this.exclamation11.Location = new System.Drawing.Point(615, 531); + this.exclamation11.Name = "exclamation11"; + this.exclamation11.Size = new System.Drawing.Size(30, 38); + this.exclamation11.TabIndex = 45; + this.exclamation11.Text = "!"; + this.exclamation11.Visible = false; + // + // startTextBox11 + // + this.startTextBox11.Enabled = false; + this.startTextBox11.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox11.Location = new System.Drawing.Point(168, 535); + this.startTextBox11.Name = "startTextBox11"; + this.startTextBox11.Size = new System.Drawing.Size(100, 31); + this.startTextBox11.TabIndex = 43; + this.startTextBox11.Visible = false; + this.startTextBox11.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox11_KeyPress); + // + // endTextBox11 + // + this.endTextBox11.Enabled = false; + this.endTextBox11.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox11.Location = new System.Drawing.Point(513, 535); + this.endTextBox11.Name = "endTextBox11"; + this.endTextBox11.Size = new System.Drawing.Size(100, 31); + this.endTextBox11.TabIndex = 44; + this.endTextBox11.Visible = false; + this.endTextBox11.TextChanged += new System.EventHandler(this.endTextBox11_TextChanged); + this.endTextBox11.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox11_KeyPress); + // + // label11 + // + this.label11.AutoSize = true; + this.label11.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label11.Location = new System.Drawing.Point(6, 538); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(157, 23); + this.label11.TabIndex = 42; + this.label11.Text = "Water Meter 11"; + this.label11.Visible = false; + // + // exclamation12 + // + this.exclamation12.AutoSize = true; + this.exclamation12.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation12.ForeColor = System.Drawing.Color.Red; + this.exclamation12.Location = new System.Drawing.Point(615, 575); + this.exclamation12.Name = "exclamation12"; + this.exclamation12.Size = new System.Drawing.Size(30, 38); + this.exclamation12.TabIndex = 49; + this.exclamation12.Text = "!"; + this.exclamation12.Visible = false; + // + // startTextBox12 + // + this.startTextBox12.Enabled = false; + this.startTextBox12.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox12.Location = new System.Drawing.Point(168, 579); + this.startTextBox12.Name = "startTextBox12"; + this.startTextBox12.Size = new System.Drawing.Size(100, 31); + this.startTextBox12.TabIndex = 47; + this.startTextBox12.Visible = false; + this.startTextBox12.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox12_KeyPress); + // + // endTextBox12 + // + this.endTextBox12.Enabled = false; + this.endTextBox12.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox12.Location = new System.Drawing.Point(513, 579); + this.endTextBox12.Name = "endTextBox12"; + this.endTextBox12.Size = new System.Drawing.Size(100, 31); + this.endTextBox12.TabIndex = 48; + this.endTextBox12.Visible = false; + this.endTextBox12.TextChanged += new System.EventHandler(this.endTextBox12_TextChanged); + this.endTextBox12.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox12_KeyPress); + // + // label12 + // + this.label12.AutoSize = true; + this.label12.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label12.Location = new System.Drawing.Point(6, 582); + this.label12.Name = "label12"; + this.label12.Size = new System.Drawing.Size(157, 23); + this.label12.TabIndex = 46; + this.label12.Text = "Water Meter 12"; + this.label12.Visible = false; + // + // exclamation24 + // + this.exclamation24.AutoSize = true; + this.exclamation24.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation24.ForeColor = System.Drawing.Color.Red; + this.exclamation24.Location = new System.Drawing.Point(1292, 575); + this.exclamation24.Name = "exclamation24"; + this.exclamation24.Size = new System.Drawing.Size(30, 38); + this.exclamation24.TabIndex = 99; + this.exclamation24.Text = "!"; + this.exclamation24.Visible = false; + // + // startTextBox24 + // + this.startTextBox24.Enabled = false; + this.startTextBox24.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox24.Location = new System.Drawing.Point(845, 579); + this.startTextBox24.Name = "startTextBox24"; + this.startTextBox24.Size = new System.Drawing.Size(100, 31); + this.startTextBox24.TabIndex = 97; + this.startTextBox24.Visible = false; + this.startTextBox24.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox24_KeyPress); + // + // endTextBox24 + // + this.endTextBox24.Enabled = false; + this.endTextBox24.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox24.Location = new System.Drawing.Point(1190, 579); + this.endTextBox24.Name = "endTextBox24"; + this.endTextBox24.Size = new System.Drawing.Size(100, 31); + this.endTextBox24.TabIndex = 98; + this.endTextBox24.Visible = false; + this.endTextBox24.TextChanged += new System.EventHandler(this.endTextBox24_TextChanged); + this.endTextBox24.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox24_KeyPress); + // + // label24 + // + this.label24.AutoSize = true; + this.label24.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label24.Location = new System.Drawing.Point(683, 582); + this.label24.Name = "label24"; + this.label24.Size = new System.Drawing.Size(157, 23); + this.label24.TabIndex = 96; + this.label24.Text = "Water Meter 24"; + this.label24.Visible = false; + // + // exclamation23 + // + this.exclamation23.AutoSize = true; + this.exclamation23.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation23.ForeColor = System.Drawing.Color.Red; + this.exclamation23.Location = new System.Drawing.Point(1292, 531); + this.exclamation23.Name = "exclamation23"; + this.exclamation23.Size = new System.Drawing.Size(30, 38); + this.exclamation23.TabIndex = 95; + this.exclamation23.Text = "!"; + this.exclamation23.Visible = false; + // + // startTextBox23 + // + this.startTextBox23.Enabled = false; + this.startTextBox23.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox23.Location = new System.Drawing.Point(845, 535); + this.startTextBox23.Name = "startTextBox23"; + this.startTextBox23.Size = new System.Drawing.Size(100, 31); + this.startTextBox23.TabIndex = 93; + this.startTextBox23.Visible = false; + this.startTextBox23.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox23_KeyPress); + // + // endTextBox23 + // + this.endTextBox23.Enabled = false; + this.endTextBox23.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox23.Location = new System.Drawing.Point(1190, 535); + this.endTextBox23.Name = "endTextBox23"; + this.endTextBox23.Size = new System.Drawing.Size(100, 31); + this.endTextBox23.TabIndex = 94; + this.endTextBox23.Visible = false; + this.endTextBox23.TextChanged += new System.EventHandler(this.endTextBox23_TextChanged); + this.endTextBox23.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox23_KeyPress); + // + // label23 + // + this.label23.AutoSize = true; + this.label23.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label23.Location = new System.Drawing.Point(683, 538); + this.label23.Name = "label23"; + this.label23.Size = new System.Drawing.Size(157, 23); + this.label23.TabIndex = 92; + this.label23.Text = "Water Meter 23"; + this.label23.Visible = false; + // + // exclamation22 + // + this.exclamation22.AutoSize = true; + this.exclamation22.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation22.ForeColor = System.Drawing.Color.Red; + this.exclamation22.Location = new System.Drawing.Point(1292, 487); + this.exclamation22.Name = "exclamation22"; + this.exclamation22.Size = new System.Drawing.Size(30, 38); + this.exclamation22.TabIndex = 91; + this.exclamation22.Text = "!"; + this.exclamation22.Visible = false; + // + // startTextBox22 + // + this.startTextBox22.Enabled = false; + this.startTextBox22.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox22.Location = new System.Drawing.Point(845, 491); + this.startTextBox22.Name = "startTextBox22"; + this.startTextBox22.Size = new System.Drawing.Size(100, 31); + this.startTextBox22.TabIndex = 89; + this.startTextBox22.Visible = false; + this.startTextBox22.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox22_KeyPress); + // + // endTextBox22 + // + this.endTextBox22.Enabled = false; + this.endTextBox22.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox22.Location = new System.Drawing.Point(1190, 491); + this.endTextBox22.Name = "endTextBox22"; + this.endTextBox22.Size = new System.Drawing.Size(100, 31); + this.endTextBox22.TabIndex = 90; + this.endTextBox22.Visible = false; + this.endTextBox22.TextChanged += new System.EventHandler(this.endTextBox22_TextChanged); + this.endTextBox22.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox22_KeyPress); + // + // label22 + // + this.label22.AutoSize = true; + this.label22.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label22.Location = new System.Drawing.Point(683, 494); + this.label22.Name = "label22"; + this.label22.Size = new System.Drawing.Size(157, 23); + this.label22.TabIndex = 88; + this.label22.Text = "Water Meter 22"; + this.label22.Visible = false; + // + // exclamation21 + // + this.exclamation21.AutoSize = true; + this.exclamation21.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation21.ForeColor = System.Drawing.Color.Red; + this.exclamation21.Location = new System.Drawing.Point(1292, 443); + this.exclamation21.Name = "exclamation21"; + this.exclamation21.Size = new System.Drawing.Size(30, 38); + this.exclamation21.TabIndex = 87; + this.exclamation21.Text = "!"; + this.exclamation21.Visible = false; + // + // startTextBox21 + // + this.startTextBox21.Enabled = false; + this.startTextBox21.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox21.Location = new System.Drawing.Point(845, 447); + this.startTextBox21.Name = "startTextBox21"; + this.startTextBox21.Size = new System.Drawing.Size(100, 31); + this.startTextBox21.TabIndex = 85; + this.startTextBox21.Visible = false; + this.startTextBox21.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox21_KeyPress); + // + // endTextBox21 + // + this.endTextBox21.Enabled = false; + this.endTextBox21.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox21.Location = new System.Drawing.Point(1190, 447); + this.endTextBox21.Name = "endTextBox21"; + this.endTextBox21.Size = new System.Drawing.Size(100, 31); + this.endTextBox21.TabIndex = 86; + this.endTextBox21.Visible = false; + this.endTextBox21.TextChanged += new System.EventHandler(this.endTextBox21_TextChanged); + this.endTextBox21.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox21_KeyPress); + // + // label21 + // + this.label21.AutoSize = true; + this.label21.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label21.Location = new System.Drawing.Point(683, 450); + this.label21.Name = "label21"; + this.label21.Size = new System.Drawing.Size(157, 23); + this.label21.TabIndex = 84; + this.label21.Text = "Water Meter 21"; + this.label21.Visible = false; + // + // exclamation20 + // + this.exclamation20.AutoSize = true; + this.exclamation20.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation20.ForeColor = System.Drawing.Color.Red; + this.exclamation20.Location = new System.Drawing.Point(1292, 399); + this.exclamation20.Name = "exclamation20"; + this.exclamation20.Size = new System.Drawing.Size(30, 38); + this.exclamation20.TabIndex = 83; + this.exclamation20.Text = "!"; + this.exclamation20.Visible = false; + // + // startTextBox20 + // + this.startTextBox20.Enabled = false; + this.startTextBox20.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox20.Location = new System.Drawing.Point(845, 403); + this.startTextBox20.Name = "startTextBox20"; + this.startTextBox20.Size = new System.Drawing.Size(100, 31); + this.startTextBox20.TabIndex = 81; + this.startTextBox20.Visible = false; + this.startTextBox20.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox20_KeyPress); + // + // endTextBox20 + // + this.endTextBox20.Enabled = false; + this.endTextBox20.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox20.Location = new System.Drawing.Point(1190, 403); + this.endTextBox20.Name = "endTextBox20"; + this.endTextBox20.Size = new System.Drawing.Size(100, 31); + this.endTextBox20.TabIndex = 82; + this.endTextBox20.Visible = false; + this.endTextBox20.TextChanged += new System.EventHandler(this.endTextBox20_TextChanged); + this.endTextBox20.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox20_KeyPress); + // + // label20 + // + this.label20.AutoSize = true; + this.label20.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label20.Location = new System.Drawing.Point(683, 406); + this.label20.Name = "label20"; + this.label20.Size = new System.Drawing.Size(157, 23); + this.label20.TabIndex = 80; + this.label20.Text = "Water Meter 20"; + this.label20.Visible = false; + // + // exclamation19 + // + this.exclamation19.AutoSize = true; + this.exclamation19.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation19.ForeColor = System.Drawing.Color.Red; + this.exclamation19.Location = new System.Drawing.Point(1292, 355); + this.exclamation19.Name = "exclamation19"; + this.exclamation19.Size = new System.Drawing.Size(30, 38); + this.exclamation19.TabIndex = 79; + this.exclamation19.Text = "!"; + this.exclamation19.Visible = false; + // + // startTextBox19 + // + this.startTextBox19.Enabled = false; + this.startTextBox19.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox19.Location = new System.Drawing.Point(845, 359); + this.startTextBox19.Name = "startTextBox19"; + this.startTextBox19.Size = new System.Drawing.Size(100, 31); + this.startTextBox19.TabIndex = 77; + this.startTextBox19.Visible = false; + this.startTextBox19.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox19_KeyPress); + // + // endTextBox19 + // + this.endTextBox19.Enabled = false; + this.endTextBox19.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox19.Location = new System.Drawing.Point(1190, 359); + this.endTextBox19.Name = "endTextBox19"; + this.endTextBox19.Size = new System.Drawing.Size(100, 31); + this.endTextBox19.TabIndex = 78; + this.endTextBox19.Visible = false; + this.endTextBox19.TextChanged += new System.EventHandler(this.endTextBox19_TextChanged); + this.endTextBox19.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox19_KeyPress); + // + // label19 + // + this.label19.AutoSize = true; + this.label19.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label19.Location = new System.Drawing.Point(683, 362); + this.label19.Name = "label19"; + this.label19.Size = new System.Drawing.Size(157, 23); + this.label19.TabIndex = 76; + this.label19.Text = "Water Meter 19"; + this.label19.Visible = false; + // + // exclamation18 + // + this.exclamation18.AutoSize = true; + this.exclamation18.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation18.ForeColor = System.Drawing.Color.Red; + this.exclamation18.Location = new System.Drawing.Point(1292, 311); + this.exclamation18.Name = "exclamation18"; + this.exclamation18.Size = new System.Drawing.Size(30, 38); + this.exclamation18.TabIndex = 75; + this.exclamation18.Text = "!"; + this.exclamation18.Visible = false; + // + // exclamation17 + // + this.exclamation17.AutoSize = true; + this.exclamation17.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation17.ForeColor = System.Drawing.Color.Red; + this.exclamation17.Location = new System.Drawing.Point(1292, 267); + this.exclamation17.Name = "exclamation17"; + this.exclamation17.Size = new System.Drawing.Size(30, 38); + this.exclamation17.TabIndex = 71; + this.exclamation17.Text = "!"; + this.exclamation17.Visible = false; + // + // startTextBox18 + // + this.startTextBox18.Enabled = false; + this.startTextBox18.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox18.Location = new System.Drawing.Point(845, 315); + this.startTextBox18.Name = "startTextBox18"; + this.startTextBox18.Size = new System.Drawing.Size(100, 31); + this.startTextBox18.TabIndex = 73; + this.startTextBox18.Visible = false; + this.startTextBox18.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox18_KeyPress); + // + // exclamation16 + // + this.exclamation16.AutoSize = true; + this.exclamation16.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation16.ForeColor = System.Drawing.Color.Red; + this.exclamation16.Location = new System.Drawing.Point(1292, 223); + this.exclamation16.Name = "exclamation16"; + this.exclamation16.Size = new System.Drawing.Size(30, 38); + this.exclamation16.TabIndex = 67; + this.exclamation16.Text = "!"; + this.exclamation16.Visible = false; + // + // endTextBox18 + // + this.endTextBox18.Enabled = false; + this.endTextBox18.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox18.Location = new System.Drawing.Point(1190, 315); + this.endTextBox18.Name = "endTextBox18"; + this.endTextBox18.Size = new System.Drawing.Size(100, 31); + this.endTextBox18.TabIndex = 74; + this.endTextBox18.Visible = false; + this.endTextBox18.TextChanged += new System.EventHandler(this.endTextBox18_TextChanged); + this.endTextBox18.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox18_KeyPress); + // + // label18 + // + this.label18.AutoSize = true; + this.label18.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label18.Location = new System.Drawing.Point(683, 318); + this.label18.Name = "label18"; + this.label18.Size = new System.Drawing.Size(157, 23); + this.label18.TabIndex = 72; + this.label18.Text = "Water Meter 18"; + this.label18.Visible = false; + // + // startTextBox17 + // + this.startTextBox17.Enabled = false; + this.startTextBox17.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox17.Location = new System.Drawing.Point(845, 271); + this.startTextBox17.Name = "startTextBox17"; + this.startTextBox17.Size = new System.Drawing.Size(100, 31); + this.startTextBox17.TabIndex = 69; + this.startTextBox17.Visible = false; + this.startTextBox17.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox17_KeyPress); + // + // exclamation15 + // + this.exclamation15.AutoSize = true; + this.exclamation15.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation15.ForeColor = System.Drawing.Color.Red; + this.exclamation15.Location = new System.Drawing.Point(1292, 179); + this.exclamation15.Name = "exclamation15"; + this.exclamation15.Size = new System.Drawing.Size(30, 38); + this.exclamation15.TabIndex = 63; + this.exclamation15.Text = "!"; + this.exclamation15.Visible = false; + // + // endTextBox17 + // + this.endTextBox17.Enabled = false; + this.endTextBox17.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox17.Location = new System.Drawing.Point(1190, 271); + this.endTextBox17.Name = "endTextBox17"; + this.endTextBox17.Size = new System.Drawing.Size(100, 31); + this.endTextBox17.TabIndex = 70; + this.endTextBox17.Visible = false; + this.endTextBox17.TextChanged += new System.EventHandler(this.endTextBox17_TextChanged); + this.endTextBox17.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox17_KeyPress); + // + // label17 + // + this.label17.AutoSize = true; + this.label17.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label17.Location = new System.Drawing.Point(683, 274); + this.label17.Name = "label17"; + this.label17.Size = new System.Drawing.Size(157, 23); + this.label17.TabIndex = 68; + this.label17.Text = "Water Meter 17"; + this.label17.Visible = false; + // + // startTextBox16 + // + this.startTextBox16.Enabled = false; + this.startTextBox16.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox16.Location = new System.Drawing.Point(845, 227); + this.startTextBox16.Name = "startTextBox16"; + this.startTextBox16.Size = new System.Drawing.Size(100, 31); + this.startTextBox16.TabIndex = 65; + this.startTextBox16.Visible = false; + this.startTextBox16.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox16_KeyPress); + // + // exclamation14 + // + this.exclamation14.AutoSize = true; + this.exclamation14.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation14.ForeColor = System.Drawing.Color.Red; + this.exclamation14.Location = new System.Drawing.Point(1292, 135); + this.exclamation14.Name = "exclamation14"; + this.exclamation14.Size = new System.Drawing.Size(30, 38); + this.exclamation14.TabIndex = 59; + this.exclamation14.Text = "!"; + this.exclamation14.Visible = false; + // + // endTextBox16 + // + this.endTextBox16.Enabled = false; + this.endTextBox16.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox16.Location = new System.Drawing.Point(1190, 227); + this.endTextBox16.Name = "endTextBox16"; + this.endTextBox16.Size = new System.Drawing.Size(100, 31); + this.endTextBox16.TabIndex = 66; + this.endTextBox16.Visible = false; + this.endTextBox16.TextChanged += new System.EventHandler(this.endTextBox16_TextChanged); + this.endTextBox16.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox16_KeyPress); + // + // label16 + // + this.label16.AutoSize = true; + this.label16.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label16.Location = new System.Drawing.Point(683, 230); + this.label16.Name = "label16"; + this.label16.Size = new System.Drawing.Size(157, 23); + this.label16.TabIndex = 64; + this.label16.Text = "Water Meter 16"; + this.label16.Visible = false; + // + // startTextBox15 + // + this.startTextBox15.Enabled = false; + this.startTextBox15.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox15.Location = new System.Drawing.Point(845, 183); + this.startTextBox15.Name = "startTextBox15"; + this.startTextBox15.Size = new System.Drawing.Size(100, 31); + this.startTextBox15.TabIndex = 61; + this.startTextBox15.Visible = false; + this.startTextBox15.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox15_KeyPress); + // + // exclamation13 + // + this.exclamation13.AutoSize = true; + this.exclamation13.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation13.ForeColor = System.Drawing.Color.Red; + this.exclamation13.Location = new System.Drawing.Point(1292, 91); + this.exclamation13.Name = "exclamation13"; + this.exclamation13.Size = new System.Drawing.Size(30, 38); + this.exclamation13.TabIndex = 55; + this.exclamation13.Text = "!"; + this.exclamation13.Visible = false; + // + // endTextBox15 + // + this.endTextBox15.Enabled = false; + this.endTextBox15.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox15.Location = new System.Drawing.Point(1190, 183); + this.endTextBox15.Name = "endTextBox15"; + this.endTextBox15.Size = new System.Drawing.Size(100, 31); + this.endTextBox15.TabIndex = 62; + this.endTextBox15.Visible = false; + this.endTextBox15.TextChanged += new System.EventHandler(this.endTextBox15_TextChanged); + this.endTextBox15.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox15_KeyPress); + // + // label15 + // + this.label15.AutoSize = true; + this.label15.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label15.Location = new System.Drawing.Point(683, 186); + this.label15.Name = "label15"; + this.label15.Size = new System.Drawing.Size(157, 23); + this.label15.TabIndex = 60; + this.label15.Text = "Water Meter 15"; + this.label15.Visible = false; + // + // startTextBox14 + // + this.startTextBox14.Enabled = false; + this.startTextBox14.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox14.Location = new System.Drawing.Point(845, 139); + this.startTextBox14.Name = "startTextBox14"; + this.startTextBox14.Size = new System.Drawing.Size(100, 31); + this.startTextBox14.TabIndex = 57; + this.startTextBox14.Visible = false; + this.startTextBox14.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox14_KeyPress); + // + // label35 + // + this.label35.AutoSize = true; + this.label35.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label35.Location = new System.Drawing.Point(1207, 56); + this.label35.Name = "label35"; + this.label35.Size = new System.Drawing.Size(46, 23); + this.label35.TabIndex = 51; + this.label35.Text = "End"; + // + // endTextBox14 + // + this.endTextBox14.Enabled = false; + this.endTextBox14.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox14.Location = new System.Drawing.Point(1190, 139); + this.endTextBox14.Name = "endTextBox14"; + this.endTextBox14.Size = new System.Drawing.Size(100, 31); + this.endTextBox14.TabIndex = 58; + this.endTextBox14.Visible = false; + this.endTextBox14.TextChanged += new System.EventHandler(this.endTextBox14_TextChanged); + this.endTextBox14.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox14_KeyPress); + // + // label14 + // + this.label14.AutoSize = true; + this.label14.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label14.Location = new System.Drawing.Point(683, 142); + this.label14.Name = "label14"; + this.label14.Size = new System.Drawing.Size(157, 23); + this.label14.TabIndex = 56; + this.label14.Text = "Water Meter 14"; + this.label14.Visible = false; + // + // startTextBox13 + // + this.startTextBox13.Enabled = false; + this.startTextBox13.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox13.Location = new System.Drawing.Point(845, 95); + this.startTextBox13.Name = "startTextBox13"; + this.startTextBox13.Size = new System.Drawing.Size(100, 31); + this.startTextBox13.TabIndex = 53; + this.startTextBox13.Visible = false; + this.startTextBox13.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox13_KeyPress); + // + // label37 + // + this.label37.AutoSize = true; + this.label37.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label37.Location = new System.Drawing.Point(872, 56); + this.label37.Name = "label37"; + this.label37.Size = new System.Drawing.Size(56, 23); + this.label37.TabIndex = 50; + this.label37.Text = "Start"; + // + // endTextBox13 + // + this.endTextBox13.Enabled = false; + this.endTextBox13.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox13.Location = new System.Drawing.Point(1190, 95); + this.endTextBox13.Name = "endTextBox13"; + this.endTextBox13.Size = new System.Drawing.Size(100, 31); + this.endTextBox13.TabIndex = 54; + this.endTextBox13.Visible = false; + this.endTextBox13.TextChanged += new System.EventHandler(this.endTextBox13_TextChanged); + this.endTextBox13.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox13_KeyPress); + // + // label13 + // + this.label13.AutoSize = true; + this.label13.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label13.Location = new System.Drawing.Point(683, 98); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(157, 23); + this.label13.TabIndex = 52; + this.label13.Text = "Water Meter 13"; + this.label13.Visible = false; + // + // mid1TextBox1 + // + this.mid1TextBox1.Enabled = false; + this.mid1TextBox1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid1TextBox1.Location = new System.Drawing.Point(283, 95); + this.mid1TextBox1.Name = "mid1TextBox1"; + this.mid1TextBox1.Size = new System.Drawing.Size(100, 31); + this.mid1TextBox1.TabIndex = 101; + this.mid1TextBox1.Visible = false; + // + // mid1TextBox2 + // + this.mid1TextBox2.Enabled = false; + this.mid1TextBox2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid1TextBox2.Location = new System.Drawing.Point(283, 139); + this.mid1TextBox2.Name = "mid1TextBox2"; + this.mid1TextBox2.Size = new System.Drawing.Size(100, 31); + this.mid1TextBox2.TabIndex = 102; + this.mid1TextBox2.Visible = false; + // + // mid1TextBox3 + // + this.mid1TextBox3.Enabled = false; + this.mid1TextBox3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid1TextBox3.Location = new System.Drawing.Point(283, 183); + this.mid1TextBox3.Name = "mid1TextBox3"; + this.mid1TextBox3.Size = new System.Drawing.Size(100, 31); + this.mid1TextBox3.TabIndex = 103; + this.mid1TextBox3.Visible = false; + // + // mid1TextBox4 + // + this.mid1TextBox4.Enabled = false; + this.mid1TextBox4.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid1TextBox4.Location = new System.Drawing.Point(283, 227); + this.mid1TextBox4.Name = "mid1TextBox4"; + this.mid1TextBox4.Size = new System.Drawing.Size(100, 31); + this.mid1TextBox4.TabIndex = 104; + this.mid1TextBox4.Visible = false; + // + // mid1TextBox5 + // + this.mid1TextBox5.Enabled = false; + this.mid1TextBox5.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid1TextBox5.Location = new System.Drawing.Point(283, 271); + this.mid1TextBox5.Name = "mid1TextBox5"; + this.mid1TextBox5.Size = new System.Drawing.Size(100, 31); + this.mid1TextBox5.TabIndex = 105; + this.mid1TextBox5.Visible = false; + // + // mid1TextBox6 + // + this.mid1TextBox6.Enabled = false; + this.mid1TextBox6.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid1TextBox6.Location = new System.Drawing.Point(283, 315); + this.mid1TextBox6.Name = "mid1TextBox6"; + this.mid1TextBox6.Size = new System.Drawing.Size(100, 31); + this.mid1TextBox6.TabIndex = 106; + this.mid1TextBox6.Visible = false; + // + // mid1TextBox7 + // + this.mid1TextBox7.Enabled = false; + this.mid1TextBox7.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid1TextBox7.Location = new System.Drawing.Point(283, 359); + this.mid1TextBox7.Name = "mid1TextBox7"; + this.mid1TextBox7.Size = new System.Drawing.Size(100, 31); + this.mid1TextBox7.TabIndex = 107; + this.mid1TextBox7.Visible = false; + // + // mid1TextBox8 + // + this.mid1TextBox8.Enabled = false; + this.mid1TextBox8.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid1TextBox8.Location = new System.Drawing.Point(283, 403); + this.mid1TextBox8.Name = "mid1TextBox8"; + this.mid1TextBox8.Size = new System.Drawing.Size(100, 31); + this.mid1TextBox8.TabIndex = 108; + this.mid1TextBox8.Visible = false; + // + // mid1TextBox9 + // + this.mid1TextBox9.Enabled = false; + this.mid1TextBox9.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid1TextBox9.Location = new System.Drawing.Point(283, 447); + this.mid1TextBox9.Name = "mid1TextBox9"; + this.mid1TextBox9.Size = new System.Drawing.Size(100, 31); + this.mid1TextBox9.TabIndex = 109; + this.mid1TextBox9.Visible = false; + // + // mid1TextBox10 + // + this.mid1TextBox10.Enabled = false; + this.mid1TextBox10.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid1TextBox10.Location = new System.Drawing.Point(283, 491); + this.mid1TextBox10.Name = "mid1TextBox10"; + this.mid1TextBox10.Size = new System.Drawing.Size(100, 31); + this.mid1TextBox10.TabIndex = 110; + this.mid1TextBox10.Visible = false; + // + // mid1TextBox11 + // + this.mid1TextBox11.Enabled = false; + this.mid1TextBox11.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid1TextBox11.Location = new System.Drawing.Point(283, 535); + this.mid1TextBox11.Name = "mid1TextBox11"; + this.mid1TextBox11.Size = new System.Drawing.Size(100, 31); + this.mid1TextBox11.TabIndex = 111; + this.mid1TextBox11.Visible = false; + // + // mid1TextBox12 + // + this.mid1TextBox12.Enabled = false; + this.mid1TextBox12.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid1TextBox12.Location = new System.Drawing.Point(283, 579); + this.mid1TextBox12.Name = "mid1TextBox12"; + this.mid1TextBox12.Size = new System.Drawing.Size(100, 31); + this.mid1TextBox12.TabIndex = 112; + this.mid1TextBox12.Visible = false; + // + // mid1TextBox13 + // + this.mid1TextBox13.Enabled = false; + this.mid1TextBox13.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid1TextBox13.Location = new System.Drawing.Point(960, 95); + this.mid1TextBox13.Name = "mid1TextBox13"; + this.mid1TextBox13.Size = new System.Drawing.Size(100, 31); + this.mid1TextBox13.TabIndex = 113; + this.mid1TextBox13.Visible = false; + // + // mid1TextBox14 + // + this.mid1TextBox14.Enabled = false; + this.mid1TextBox14.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid1TextBox14.Location = new System.Drawing.Point(960, 139); + this.mid1TextBox14.Name = "mid1TextBox14"; + this.mid1TextBox14.Size = new System.Drawing.Size(100, 31); + this.mid1TextBox14.TabIndex = 114; + this.mid1TextBox14.Visible = false; + // + // mid1TextBox15 + // + this.mid1TextBox15.Enabled = false; + this.mid1TextBox15.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid1TextBox15.Location = new System.Drawing.Point(960, 183); + this.mid1TextBox15.Name = "mid1TextBox15"; + this.mid1TextBox15.Size = new System.Drawing.Size(100, 31); + this.mid1TextBox15.TabIndex = 115; + this.mid1TextBox15.Visible = false; + // + // mid1TextBox16 + // + this.mid1TextBox16.Enabled = false; + this.mid1TextBox16.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid1TextBox16.Location = new System.Drawing.Point(960, 227); + this.mid1TextBox16.Name = "mid1TextBox16"; + this.mid1TextBox16.Size = new System.Drawing.Size(100, 31); + this.mid1TextBox16.TabIndex = 116; + this.mid1TextBox16.Visible = false; + // + // mid1TextBox17 + // + this.mid1TextBox17.Enabled = false; + this.mid1TextBox17.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid1TextBox17.Location = new System.Drawing.Point(960, 271); + this.mid1TextBox17.Name = "mid1TextBox17"; + this.mid1TextBox17.Size = new System.Drawing.Size(100, 31); + this.mid1TextBox17.TabIndex = 117; + this.mid1TextBox17.Visible = false; + // + // mid1TextBox18 + // + this.mid1TextBox18.Enabled = false; + this.mid1TextBox18.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid1TextBox18.Location = new System.Drawing.Point(960, 315); + this.mid1TextBox18.Name = "mid1TextBox18"; + this.mid1TextBox18.Size = new System.Drawing.Size(100, 31); + this.mid1TextBox18.TabIndex = 118; + this.mid1TextBox18.Visible = false; + // + // mid1TextBox19 + // + this.mid1TextBox19.Enabled = false; + this.mid1TextBox19.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid1TextBox19.Location = new System.Drawing.Point(960, 359); + this.mid1TextBox19.Name = "mid1TextBox19"; + this.mid1TextBox19.Size = new System.Drawing.Size(100, 31); + this.mid1TextBox19.TabIndex = 119; + this.mid1TextBox19.Visible = false; + // + // mid1TextBox20 + // + this.mid1TextBox20.Enabled = false; + this.mid1TextBox20.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid1TextBox20.Location = new System.Drawing.Point(960, 403); + this.mid1TextBox20.Name = "mid1TextBox20"; + this.mid1TextBox20.Size = new System.Drawing.Size(100, 31); + this.mid1TextBox20.TabIndex = 120; + this.mid1TextBox20.Visible = false; + // + // mid1TextBox21 + // + this.mid1TextBox21.Enabled = false; + this.mid1TextBox21.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid1TextBox21.Location = new System.Drawing.Point(960, 447); + this.mid1TextBox21.Name = "mid1TextBox21"; + this.mid1TextBox21.Size = new System.Drawing.Size(100, 31); + this.mid1TextBox21.TabIndex = 121; + this.mid1TextBox21.Visible = false; + // + // mid1TextBox22 + // + this.mid1TextBox22.Enabled = false; + this.mid1TextBox22.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid1TextBox22.Location = new System.Drawing.Point(960, 491); + this.mid1TextBox22.Name = "mid1TextBox22"; + this.mid1TextBox22.Size = new System.Drawing.Size(100, 31); + this.mid1TextBox22.TabIndex = 122; + this.mid1TextBox22.Visible = false; + // + // mid1TextBox23 + // + this.mid1TextBox23.Enabled = false; + this.mid1TextBox23.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid1TextBox23.Location = new System.Drawing.Point(960, 535); + this.mid1TextBox23.Name = "mid1TextBox23"; + this.mid1TextBox23.Size = new System.Drawing.Size(100, 31); + this.mid1TextBox23.TabIndex = 123; + this.mid1TextBox23.Visible = false; + // + // mid1TextBox24 + // + this.mid1TextBox24.Enabled = false; + this.mid1TextBox24.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid1TextBox24.Location = new System.Drawing.Point(960, 579); + this.mid1TextBox24.Name = "mid1TextBox24"; + this.mid1TextBox24.Size = new System.Drawing.Size(100, 31); + this.mid1TextBox24.TabIndex = 124; + this.mid1TextBox24.Visible = false; + // + // mid2TextBox1 + // + this.mid2TextBox1.Enabled = false; + this.mid2TextBox1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid2TextBox1.Location = new System.Drawing.Point(398, 95); + this.mid2TextBox1.Name = "mid2TextBox1"; + this.mid2TextBox1.Size = new System.Drawing.Size(100, 31); + this.mid2TextBox1.TabIndex = 125; + this.mid2TextBox1.Visible = false; + // + // mid2TextBox2 + // + this.mid2TextBox2.Enabled = false; + this.mid2TextBox2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid2TextBox2.Location = new System.Drawing.Point(398, 139); + this.mid2TextBox2.Name = "mid2TextBox2"; + this.mid2TextBox2.Size = new System.Drawing.Size(100, 31); + this.mid2TextBox2.TabIndex = 126; + this.mid2TextBox2.Visible = false; + // + // mid2TextBox3 + // + this.mid2TextBox3.Enabled = false; + this.mid2TextBox3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid2TextBox3.Location = new System.Drawing.Point(398, 183); + this.mid2TextBox3.Name = "mid2TextBox3"; + this.mid2TextBox3.Size = new System.Drawing.Size(100, 31); + this.mid2TextBox3.TabIndex = 127; + this.mid2TextBox3.Visible = false; + // + // mid2TextBox4 + // + this.mid2TextBox4.Enabled = false; + this.mid2TextBox4.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid2TextBox4.Location = new System.Drawing.Point(398, 227); + this.mid2TextBox4.Name = "mid2TextBox4"; + this.mid2TextBox4.Size = new System.Drawing.Size(100, 31); + this.mid2TextBox4.TabIndex = 128; + this.mid2TextBox4.Visible = false; + // + // mid2TextBox5 + // + this.mid2TextBox5.Enabled = false; + this.mid2TextBox5.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid2TextBox5.Location = new System.Drawing.Point(398, 271); + this.mid2TextBox5.Name = "mid2TextBox5"; + this.mid2TextBox5.Size = new System.Drawing.Size(100, 31); + this.mid2TextBox5.TabIndex = 129; + this.mid2TextBox5.Visible = false; + // + // mid2TextBox6 + // + this.mid2TextBox6.Enabled = false; + this.mid2TextBox6.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid2TextBox6.Location = new System.Drawing.Point(398, 315); + this.mid2TextBox6.Name = "mid2TextBox6"; + this.mid2TextBox6.Size = new System.Drawing.Size(100, 31); + this.mid2TextBox6.TabIndex = 130; + this.mid2TextBox6.Visible = false; + // + // mid2TextBox7 + // + this.mid2TextBox7.Enabled = false; + this.mid2TextBox7.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid2TextBox7.Location = new System.Drawing.Point(398, 359); + this.mid2TextBox7.Name = "mid2TextBox7"; + this.mid2TextBox7.Size = new System.Drawing.Size(100, 31); + this.mid2TextBox7.TabIndex = 131; + this.mid2TextBox7.Visible = false; + // + // mid2TextBox8 + // + this.mid2TextBox8.Enabled = false; + this.mid2TextBox8.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid2TextBox8.Location = new System.Drawing.Point(398, 403); + this.mid2TextBox8.Name = "mid2TextBox8"; + this.mid2TextBox8.Size = new System.Drawing.Size(100, 31); + this.mid2TextBox8.TabIndex = 132; + this.mid2TextBox8.Visible = false; + // + // mid2TextBox9 + // + this.mid2TextBox9.Enabled = false; + this.mid2TextBox9.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid2TextBox9.Location = new System.Drawing.Point(398, 447); + this.mid2TextBox9.Name = "mid2TextBox9"; + this.mid2TextBox9.Size = new System.Drawing.Size(100, 31); + this.mid2TextBox9.TabIndex = 133; + this.mid2TextBox9.Visible = false; + // + // mid2TextBox10 + // + this.mid2TextBox10.Enabled = false; + this.mid2TextBox10.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid2TextBox10.Location = new System.Drawing.Point(398, 491); + this.mid2TextBox10.Name = "mid2TextBox10"; + this.mid2TextBox10.Size = new System.Drawing.Size(100, 31); + this.mid2TextBox10.TabIndex = 134; + this.mid2TextBox10.Visible = false; + // + // mid2TextBox11 + // + this.mid2TextBox11.Enabled = false; + this.mid2TextBox11.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid2TextBox11.Location = new System.Drawing.Point(398, 535); + this.mid2TextBox11.Name = "mid2TextBox11"; + this.mid2TextBox11.Size = new System.Drawing.Size(100, 31); + this.mid2TextBox11.TabIndex = 135; + this.mid2TextBox11.Visible = false; + // + // mid2TextBox12 + // + this.mid2TextBox12.Enabled = false; + this.mid2TextBox12.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid2TextBox12.Location = new System.Drawing.Point(398, 579); + this.mid2TextBox12.Name = "mid2TextBox12"; + this.mid2TextBox12.Size = new System.Drawing.Size(100, 31); + this.mid2TextBox12.TabIndex = 136; + this.mid2TextBox12.Visible = false; + // + // mid2TextBox13 + // + this.mid2TextBox13.Enabled = false; + this.mid2TextBox13.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid2TextBox13.Location = new System.Drawing.Point(1075, 95); + this.mid2TextBox13.Name = "mid2TextBox13"; + this.mid2TextBox13.Size = new System.Drawing.Size(100, 31); + this.mid2TextBox13.TabIndex = 137; + this.mid2TextBox13.Visible = false; + // + // mid2TextBox14 + // + this.mid2TextBox14.Enabled = false; + this.mid2TextBox14.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid2TextBox14.Location = new System.Drawing.Point(1075, 139); + this.mid2TextBox14.Name = "mid2TextBox14"; + this.mid2TextBox14.Size = new System.Drawing.Size(100, 31); + this.mid2TextBox14.TabIndex = 138; + this.mid2TextBox14.Visible = false; + // + // mid2TextBox15 + // + this.mid2TextBox15.Enabled = false; + this.mid2TextBox15.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid2TextBox15.Location = new System.Drawing.Point(1075, 183); + this.mid2TextBox15.Name = "mid2TextBox15"; + this.mid2TextBox15.Size = new System.Drawing.Size(100, 31); + this.mid2TextBox15.TabIndex = 139; + this.mid2TextBox15.Visible = false; + // + // mid2TextBox16 + // + this.mid2TextBox16.Enabled = false; + this.mid2TextBox16.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid2TextBox16.Location = new System.Drawing.Point(1075, 227); + this.mid2TextBox16.Name = "mid2TextBox16"; + this.mid2TextBox16.Size = new System.Drawing.Size(100, 31); + this.mid2TextBox16.TabIndex = 140; + this.mid2TextBox16.Visible = false; + // + // mid2TextBox17 + // + this.mid2TextBox17.Enabled = false; + this.mid2TextBox17.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid2TextBox17.Location = new System.Drawing.Point(1075, 271); + this.mid2TextBox17.Name = "mid2TextBox17"; + this.mid2TextBox17.Size = new System.Drawing.Size(100, 31); + this.mid2TextBox17.TabIndex = 141; + this.mid2TextBox17.Visible = false; + // + // mid2TextBox18 + // + this.mid2TextBox18.Enabled = false; + this.mid2TextBox18.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid2TextBox18.Location = new System.Drawing.Point(1075, 315); + this.mid2TextBox18.Name = "mid2TextBox18"; + this.mid2TextBox18.Size = new System.Drawing.Size(100, 31); + this.mid2TextBox18.TabIndex = 142; + this.mid2TextBox18.Visible = false; + // + // mid2TextBox19 + // + this.mid2TextBox19.Enabled = false; + this.mid2TextBox19.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid2TextBox19.Location = new System.Drawing.Point(1075, 359); + this.mid2TextBox19.Name = "mid2TextBox19"; + this.mid2TextBox19.Size = new System.Drawing.Size(100, 31); + this.mid2TextBox19.TabIndex = 143; + this.mid2TextBox19.Visible = false; + // + // mid2TextBox20 + // + this.mid2TextBox20.Enabled = false; + this.mid2TextBox20.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid2TextBox20.Location = new System.Drawing.Point(1075, 403); + this.mid2TextBox20.Name = "mid2TextBox20"; + this.mid2TextBox20.Size = new System.Drawing.Size(100, 31); + this.mid2TextBox20.TabIndex = 144; + this.mid2TextBox20.Visible = false; + // + // mid2TextBox21 + // + this.mid2TextBox21.Enabled = false; + this.mid2TextBox21.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid2TextBox21.Location = new System.Drawing.Point(1075, 447); + this.mid2TextBox21.Name = "mid2TextBox21"; + this.mid2TextBox21.Size = new System.Drawing.Size(100, 31); + this.mid2TextBox21.TabIndex = 145; + this.mid2TextBox21.Visible = false; + // + // mid2TextBox22 + // + this.mid2TextBox22.Enabled = false; + this.mid2TextBox22.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid2TextBox22.Location = new System.Drawing.Point(1075, 491); + this.mid2TextBox22.Name = "mid2TextBox22"; + this.mid2TextBox22.Size = new System.Drawing.Size(100, 31); + this.mid2TextBox22.TabIndex = 146; + this.mid2TextBox22.Visible = false; + // + // mid2TextBox23 + // + this.mid2TextBox23.Enabled = false; + this.mid2TextBox23.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid2TextBox23.Location = new System.Drawing.Point(1075, 535); + this.mid2TextBox23.Name = "mid2TextBox23"; + this.mid2TextBox23.Size = new System.Drawing.Size(100, 31); + this.mid2TextBox23.TabIndex = 147; + this.mid2TextBox23.Visible = false; + // + // mid2TextBox24 + // + this.mid2TextBox24.Enabled = false; + this.mid2TextBox24.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.mid2TextBox24.Location = new System.Drawing.Point(1075, 579); + this.mid2TextBox24.Name = "mid2TextBox24"; + this.mid2TextBox24.Size = new System.Drawing.Size(100, 31); + this.mid2TextBox24.TabIndex = 148; + this.mid2TextBox24.Visible = false; + // + // AdvancedFixedStartTestForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.ClientSize = new System.Drawing.Size(1354, 630); + this.Controls.Add(this.mid2TextBox24); + this.Controls.Add(this.mid2TextBox23); + this.Controls.Add(this.mid2TextBox22); + this.Controls.Add(this.mid2TextBox21); + this.Controls.Add(this.mid2TextBox20); + this.Controls.Add(this.mid2TextBox19); + this.Controls.Add(this.mid2TextBox18); + this.Controls.Add(this.mid2TextBox17); + this.Controls.Add(this.mid2TextBox16); + this.Controls.Add(this.mid2TextBox15); + this.Controls.Add(this.mid2TextBox14); + this.Controls.Add(this.mid2TextBox13); + this.Controls.Add(this.mid2TextBox12); + this.Controls.Add(this.mid2TextBox11); + this.Controls.Add(this.mid2TextBox10); + this.Controls.Add(this.mid2TextBox9); + this.Controls.Add(this.mid2TextBox8); + this.Controls.Add(this.mid2TextBox7); + this.Controls.Add(this.mid2TextBox6); + this.Controls.Add(this.mid2TextBox5); + this.Controls.Add(this.mid2TextBox4); + this.Controls.Add(this.mid2TextBox3); + this.Controls.Add(this.mid2TextBox2); + this.Controls.Add(this.mid2TextBox1); + this.Controls.Add(this.mid1TextBox24); + this.Controls.Add(this.mid1TextBox23); + this.Controls.Add(this.mid1TextBox22); + this.Controls.Add(this.mid1TextBox21); + this.Controls.Add(this.mid1TextBox20); + this.Controls.Add(this.mid1TextBox19); + this.Controls.Add(this.mid1TextBox18); + this.Controls.Add(this.mid1TextBox17); + this.Controls.Add(this.mid1TextBox16); + this.Controls.Add(this.mid1TextBox15); + this.Controls.Add(this.mid1TextBox14); + this.Controls.Add(this.mid1TextBox13); + this.Controls.Add(this.mid1TextBox12); + this.Controls.Add(this.mid1TextBox11); + this.Controls.Add(this.mid1TextBox10); + this.Controls.Add(this.mid1TextBox9); + this.Controls.Add(this.mid1TextBox8); + this.Controls.Add(this.mid1TextBox7); + this.Controls.Add(this.mid1TextBox6); + this.Controls.Add(this.mid1TextBox5); + this.Controls.Add(this.mid1TextBox4); + this.Controls.Add(this.mid1TextBox3); + this.Controls.Add(this.mid1TextBox2); + this.Controls.Add(this.mid1TextBox1); + this.Controls.Add(this.exclamation24); + this.Controls.Add(this.startTextBox24); + this.Controls.Add(this.endTextBox24); + this.Controls.Add(this.label24); + this.Controls.Add(this.exclamation23); + this.Controls.Add(this.startTextBox23); + this.Controls.Add(this.endTextBox23); + this.Controls.Add(this.label23); + this.Controls.Add(this.exclamation22); + this.Controls.Add(this.startTextBox22); + this.Controls.Add(this.endTextBox22); + this.Controls.Add(this.label22); + this.Controls.Add(this.exclamation21); + this.Controls.Add(this.startTextBox21); + this.Controls.Add(this.endTextBox21); + this.Controls.Add(this.label21); + this.Controls.Add(this.exclamation20); + this.Controls.Add(this.startTextBox20); + this.Controls.Add(this.endTextBox20); + this.Controls.Add(this.label20); + this.Controls.Add(this.exclamation19); + this.Controls.Add(this.startTextBox19); + this.Controls.Add(this.endTextBox19); + this.Controls.Add(this.label19); + this.Controls.Add(this.exclamation18); + this.Controls.Add(this.exclamation17); + this.Controls.Add(this.startTextBox18); + this.Controls.Add(this.exclamation16); + this.Controls.Add(this.endTextBox18); + this.Controls.Add(this.label18); + this.Controls.Add(this.startTextBox17); + this.Controls.Add(this.exclamation15); + this.Controls.Add(this.endTextBox17); + this.Controls.Add(this.label17); + this.Controls.Add(this.startTextBox16); + this.Controls.Add(this.exclamation14); + this.Controls.Add(this.endTextBox16); + this.Controls.Add(this.label16); + this.Controls.Add(this.startTextBox15); + this.Controls.Add(this.exclamation13); + this.Controls.Add(this.endTextBox15); + this.Controls.Add(this.label15); + this.Controls.Add(this.startTextBox14); + this.Controls.Add(this.label35); + this.Controls.Add(this.endTextBox14); + this.Controls.Add(this.label14); + this.Controls.Add(this.startTextBox13); + this.Controls.Add(this.label37); + this.Controls.Add(this.endTextBox13); + this.Controls.Add(this.label13); + this.Controls.Add(this.exclamation12); + this.Controls.Add(this.startTextBox12); + this.Controls.Add(this.endTextBox12); + this.Controls.Add(this.label12); + this.Controls.Add(this.exclamation11); + this.Controls.Add(this.startTextBox11); + this.Controls.Add(this.endTextBox11); + this.Controls.Add(this.label11); + this.Controls.Add(this.exclamation10); + this.Controls.Add(this.startTextBox10); + this.Controls.Add(this.endTextBox10); + this.Controls.Add(this.label10); + this.Controls.Add(this.exclamation9); + this.Controls.Add(this.startTextBox9); + this.Controls.Add(this.endTextBox9); + this.Controls.Add(this.label9); + this.Controls.Add(this.exclamation8); + this.Controls.Add(this.startTextBox8); + this.Controls.Add(this.endTextBox8); + this.Controls.Add(this.label8); + this.Controls.Add(this.exclamation7); + this.Controls.Add(this.startTextBox7); + this.Controls.Add(this.endTextBox7); + this.Controls.Add(this.label7); + this.Controls.Add(this.exclamation6); + this.Controls.Add(this.exclamation5); + this.Controls.Add(this.startTextBox6); + this.Controls.Add(this.exclamation4); + this.Controls.Add(this.endTextBox6); + this.Controls.Add(this.label6); + this.Controls.Add(this.startTextBox5); + this.Controls.Add(this.exclamation3); + this.Controls.Add(this.endTextBox5); + this.Controls.Add(this.label5); + this.Controls.Add(this.startTextBox4); + this.Controls.Add(this.exclamation2); + this.Controls.Add(this.endTextBox4); + this.Controls.Add(this.label4); + this.Controls.Add(this.startTextBox3); + this.Controls.Add(this.exclamation1); + this.Controls.Add(this.endTextBox3); + this.Controls.Add(this.label3); + this.Controls.Add(this.startTextBox2); + this.Controls.Add(this.endLabel); + this.Controls.Add(this.endTextBox2); + this.Controls.Add(this.label2); + this.Controls.Add(this.startTextBox1); + this.Controls.Add(this.startLabel); + this.Controls.Add(this.endTextBox1); + this.Controls.Add(this.label1); + this.Controls.Add(this.okButton); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "AdvancedFixedStartTestForm"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "End States"; + this.TopMost = true; + this.Load += new System.EventHandler(this.CycleEndForm_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox endTextBox1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.TextBox endTextBox3; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox endTextBox4; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox endTextBox5; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.TextBox endTextBox6; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TextBox startTextBox1; + private System.Windows.Forms.TextBox startTextBox3; + private System.Windows.Forms.TextBox startTextBox4; + private System.Windows.Forms.TextBox startTextBox5; + private System.Windows.Forms.TextBox startTextBox6; + private System.Windows.Forms.Label startLabel; + private System.Windows.Forms.Label endLabel; + private System.Windows.Forms.Label exclamation1; + private System.Windows.Forms.Label exclamation3; + private System.Windows.Forms.Label exclamation4; + private System.Windows.Forms.Label exclamation5; + private System.Windows.Forms.Label exclamation6; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox endTextBox2; + private System.Windows.Forms.TextBox startTextBox2; + private System.Windows.Forms.Label exclamation2; + private System.Windows.Forms.Label exclamation7; + private System.Windows.Forms.TextBox startTextBox7; + private System.Windows.Forms.TextBox endTextBox7; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.Label exclamation8; + private System.Windows.Forms.TextBox startTextBox8; + private System.Windows.Forms.TextBox endTextBox8; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.Label exclamation9; + private System.Windows.Forms.TextBox startTextBox9; + private System.Windows.Forms.TextBox endTextBox9; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.Label exclamation10; + private System.Windows.Forms.TextBox startTextBox10; + private System.Windows.Forms.TextBox endTextBox10; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.Label exclamation11; + private System.Windows.Forms.TextBox startTextBox11; + private System.Windows.Forms.TextBox endTextBox11; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.Label exclamation12; + private System.Windows.Forms.TextBox startTextBox12; + private System.Windows.Forms.TextBox endTextBox12; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.Label exclamation24; + private System.Windows.Forms.TextBox startTextBox24; + private System.Windows.Forms.TextBox endTextBox24; + private System.Windows.Forms.Label label24; + private System.Windows.Forms.Label exclamation23; + private System.Windows.Forms.TextBox startTextBox23; + private System.Windows.Forms.TextBox endTextBox23; + private System.Windows.Forms.Label label23; + private System.Windows.Forms.Label exclamation22; + private System.Windows.Forms.TextBox startTextBox22; + private System.Windows.Forms.TextBox endTextBox22; + private System.Windows.Forms.Label label22; + private System.Windows.Forms.Label exclamation21; + private System.Windows.Forms.TextBox startTextBox21; + private System.Windows.Forms.TextBox endTextBox21; + private System.Windows.Forms.Label label21; + private System.Windows.Forms.Label exclamation20; + private System.Windows.Forms.TextBox startTextBox20; + private System.Windows.Forms.TextBox endTextBox20; + private System.Windows.Forms.Label label20; + private System.Windows.Forms.Label exclamation19; + private System.Windows.Forms.TextBox startTextBox19; + private System.Windows.Forms.TextBox endTextBox19; + private System.Windows.Forms.Label label19; + private System.Windows.Forms.Label exclamation18; + private System.Windows.Forms.Label exclamation17; + private System.Windows.Forms.TextBox startTextBox18; + private System.Windows.Forms.Label exclamation16; + private System.Windows.Forms.TextBox endTextBox18; + private System.Windows.Forms.Label label18; + private System.Windows.Forms.TextBox startTextBox17; + private System.Windows.Forms.Label exclamation15; + private System.Windows.Forms.TextBox endTextBox17; + private System.Windows.Forms.Label label17; + private System.Windows.Forms.TextBox startTextBox16; + private System.Windows.Forms.Label exclamation14; + private System.Windows.Forms.TextBox endTextBox16; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.TextBox startTextBox15; + private System.Windows.Forms.Label exclamation13; + private System.Windows.Forms.TextBox endTextBox15; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.TextBox startTextBox14; + private System.Windows.Forms.Label label35; + private System.Windows.Forms.TextBox endTextBox14; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.TextBox startTextBox13; + private System.Windows.Forms.Label label37; + private System.Windows.Forms.TextBox endTextBox13; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.TextBox mid1TextBox1; + private System.Windows.Forms.TextBox mid1TextBox2; + private System.Windows.Forms.TextBox mid1TextBox3; + private System.Windows.Forms.TextBox mid1TextBox4; + private System.Windows.Forms.TextBox mid1TextBox5; + private System.Windows.Forms.TextBox mid1TextBox6; + private System.Windows.Forms.TextBox mid1TextBox7; + private System.Windows.Forms.TextBox mid1TextBox8; + private System.Windows.Forms.TextBox mid1TextBox9; + private System.Windows.Forms.TextBox mid1TextBox10; + private System.Windows.Forms.TextBox mid1TextBox11; + private System.Windows.Forms.TextBox mid1TextBox12; + private System.Windows.Forms.TextBox mid1TextBox13; + private System.Windows.Forms.TextBox mid1TextBox14; + private System.Windows.Forms.TextBox mid1TextBox15; + private System.Windows.Forms.TextBox mid1TextBox16; + private System.Windows.Forms.TextBox mid1TextBox17; + private System.Windows.Forms.TextBox mid1TextBox18; + private System.Windows.Forms.TextBox mid1TextBox19; + private System.Windows.Forms.TextBox mid1TextBox20; + private System.Windows.Forms.TextBox mid1TextBox21; + private System.Windows.Forms.TextBox mid1TextBox22; + private System.Windows.Forms.TextBox mid1TextBox23; + private System.Windows.Forms.TextBox mid1TextBox24; + private System.Windows.Forms.TextBox mid2TextBox1; + private System.Windows.Forms.TextBox mid2TextBox2; + private System.Windows.Forms.TextBox mid2TextBox3; + private System.Windows.Forms.TextBox mid2TextBox4; + private System.Windows.Forms.TextBox mid2TextBox5; + private System.Windows.Forms.TextBox mid2TextBox6; + private System.Windows.Forms.TextBox mid2TextBox7; + private System.Windows.Forms.TextBox mid2TextBox8; + private System.Windows.Forms.TextBox mid2TextBox9; + private System.Windows.Forms.TextBox mid2TextBox10; + private System.Windows.Forms.TextBox mid2TextBox11; + private System.Windows.Forms.TextBox mid2TextBox12; + private System.Windows.Forms.TextBox mid2TextBox13; + private System.Windows.Forms.TextBox mid2TextBox14; + private System.Windows.Forms.TextBox mid2TextBox15; + private System.Windows.Forms.TextBox mid2TextBox16; + private System.Windows.Forms.TextBox mid2TextBox17; + private System.Windows.Forms.TextBox mid2TextBox18; + private System.Windows.Forms.TextBox mid2TextBox19; + private System.Windows.Forms.TextBox mid2TextBox20; + private System.Windows.Forms.TextBox mid2TextBox21; + private System.Windows.Forms.TextBox mid2TextBox22; + private System.Windows.Forms.TextBox mid2TextBox23; + private System.Windows.Forms.TextBox mid2TextBox24; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/AdvancedFixedStartTestForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/AdvancedFixedStartTestForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/AdvancedFixedStartTestForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/CycleBeginningForm.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/CycleBeginningForm.Designer.cs new file mode 100644 index 00000000..537af4f5 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/CycleBeginningForm.Designer.cs @@ -0,0 +1,794 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.Standard24 +{ + partial class CycleBeginningForm + { + /// + /// 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(CycleBeginningForm)); + this.okButton = new System.Windows.Forms.Button(); + this.orderGroupBox = new System.Windows.Forms.GroupBox(); + this.orderComboBox = new System.Windows.Forms.ComboBox(); + this.clearButton = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.checkBox1 = new System.Windows.Forms.CheckBox(); + this.checkBox2 = new System.Windows.Forms.CheckBox(); + this.comboBox2 = new System.Windows.Forms.ComboBox(); + this.label2 = new System.Windows.Forms.Label(); + this.checkBox3 = new System.Windows.Forms.CheckBox(); + this.comboBox3 = new System.Windows.Forms.ComboBox(); + this.label3 = new System.Windows.Forms.Label(); + this.checkBox4 = new System.Windows.Forms.CheckBox(); + this.comboBox4 = new System.Windows.Forms.ComboBox(); + this.label4 = new System.Windows.Forms.Label(); + this.checkBox5 = new System.Windows.Forms.CheckBox(); + this.comboBox5 = new System.Windows.Forms.ComboBox(); + this.label5 = new System.Windows.Forms.Label(); + this.checkBox6 = new System.Windows.Forms.CheckBox(); + this.comboBox6 = new System.Windows.Forms.ComboBox(); + this.label6 = new System.Windows.Forms.Label(); + this.checkBox7 = new System.Windows.Forms.CheckBox(); + this.comboBox7 = new System.Windows.Forms.ComboBox(); + this.label7 = new System.Windows.Forms.Label(); + this.checkBox8 = new System.Windows.Forms.CheckBox(); + this.comboBox8 = new System.Windows.Forms.ComboBox(); + this.label8 = new System.Windows.Forms.Label(); + this.checkBox9 = new System.Windows.Forms.CheckBox(); + this.comboBox9 = new System.Windows.Forms.ComboBox(); + this.label9 = new System.Windows.Forms.Label(); + this.checkBox10 = new System.Windows.Forms.CheckBox(); + this.comboBox10 = new System.Windows.Forms.ComboBox(); + this.label10 = new System.Windows.Forms.Label(); + this.checkBox11 = new System.Windows.Forms.CheckBox(); + this.comboBox11 = new System.Windows.Forms.ComboBox(); + this.label11 = new System.Windows.Forms.Label(); + this.checkBox12 = new System.Windows.Forms.CheckBox(); + this.comboBox12 = new System.Windows.Forms.ComboBox(); + this.label12 = new System.Windows.Forms.Label(); + this.checkBox13 = new System.Windows.Forms.CheckBox(); + this.comboBox13 = new System.Windows.Forms.ComboBox(); + this.label13 = new System.Windows.Forms.Label(); + this.checkBox14 = new System.Windows.Forms.CheckBox(); + this.comboBox14 = new System.Windows.Forms.ComboBox(); + this.label14 = new System.Windows.Forms.Label(); + this.checkBox15 = new System.Windows.Forms.CheckBox(); + this.comboBox15 = new System.Windows.Forms.ComboBox(); + this.label15 = new System.Windows.Forms.Label(); + this.checkBox16 = new System.Windows.Forms.CheckBox(); + this.comboBox16 = new System.Windows.Forms.ComboBox(); + this.label16 = new System.Windows.Forms.Label(); + this.checkBox17 = new System.Windows.Forms.CheckBox(); + this.comboBox17 = new System.Windows.Forms.ComboBox(); + this.label17 = new System.Windows.Forms.Label(); + this.checkBox18 = new System.Windows.Forms.CheckBox(); + this.comboBox18 = new System.Windows.Forms.ComboBox(); + this.label18 = new System.Windows.Forms.Label(); + this.checkBox19 = new System.Windows.Forms.CheckBox(); + this.comboBox19 = new System.Windows.Forms.ComboBox(); + this.label19 = new System.Windows.Forms.Label(); + this.checkBox20 = new System.Windows.Forms.CheckBox(); + this.comboBox20 = new System.Windows.Forms.ComboBox(); + this.label20 = new System.Windows.Forms.Label(); + this.checkBox21 = new System.Windows.Forms.CheckBox(); + this.comboBox21 = new System.Windows.Forms.ComboBox(); + this.label21 = new System.Windows.Forms.Label(); + this.checkBox22 = new System.Windows.Forms.CheckBox(); + this.comboBox22 = new System.Windows.Forms.ComboBox(); + this.label22 = new System.Windows.Forms.Label(); + this.checkBox23 = new System.Windows.Forms.CheckBox(); + this.comboBox23 = new System.Windows.Forms.ComboBox(); + this.label23 = new System.Windows.Forms.Label(); + this.checkBox24 = new System.Windows.Forms.CheckBox(); + this.comboBox24 = new System.Windows.Forms.ComboBox(); + this.label24 = new System.Windows.Forms.Label(); + this.orderGroupBox.SuspendLayout(); + this.SuspendLayout(); + // + // okButton + // + resources.ApplyResources(this.okButton, "okButton"); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Name = "okButton"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // orderGroupBox + // + this.orderGroupBox.Controls.Add(this.orderComboBox); + resources.ApplyResources(this.orderGroupBox, "orderGroupBox"); + this.orderGroupBox.ForeColor = System.Drawing.Color.Black; + this.orderGroupBox.Name = "orderGroupBox"; + this.orderGroupBox.TabStop = false; + // + // orderComboBox + // + this.orderComboBox.FormattingEnabled = true; + resources.ApplyResources(this.orderComboBox, "orderComboBox"); + this.orderComboBox.Name = "orderComboBox"; + // + // clearButton + // + resources.ApplyResources(this.clearButton, "clearButton"); + this.clearButton.ForeColor = System.Drawing.Color.Black; + this.clearButton.Name = "clearButton"; + this.clearButton.UseVisualStyleBackColor = true; + this.clearButton.Click += new System.EventHandler(this.clearButton_Click); + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // comboBox1 + // + resources.ApplyResources(this.comboBox1, "comboBox1"); + this.comboBox1.FormattingEnabled = true; + this.comboBox1.Name = "comboBox1"; + this.comboBox1.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged); + this.comboBox1.TextChanged += new System.EventHandler(this.comboBox1_TextChanged); + this.comboBox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox1_KeyPress); + // + // checkBox1 + // + resources.ApplyResources(this.checkBox1, "checkBox1"); + this.checkBox1.Name = "checkBox1"; + this.checkBox1.UseVisualStyleBackColor = true; + // + // checkBox2 + // + resources.ApplyResources(this.checkBox2, "checkBox2"); + this.checkBox2.Name = "checkBox2"; + this.checkBox2.UseVisualStyleBackColor = true; + // + // comboBox2 + // + resources.ApplyResources(this.comboBox2, "comboBox2"); + this.comboBox2.FormattingEnabled = true; + this.comboBox2.Name = "comboBox2"; + this.comboBox2.SelectedIndexChanged += new System.EventHandler(this.comboBox2_SelectedIndexChanged); + this.comboBox2.TextChanged += new System.EventHandler(this.comboBox2_TextChanged); + this.comboBox2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox2_KeyPress); + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // checkBox3 + // + resources.ApplyResources(this.checkBox3, "checkBox3"); + this.checkBox3.Name = "checkBox3"; + this.checkBox3.UseVisualStyleBackColor = true; + // + // comboBox3 + // + resources.ApplyResources(this.comboBox3, "comboBox3"); + this.comboBox3.FormattingEnabled = true; + this.comboBox3.Name = "comboBox3"; + this.comboBox3.SelectedIndexChanged += new System.EventHandler(this.comboBox3_SelectedIndexChanged); + this.comboBox3.TextChanged += new System.EventHandler(this.comboBox3_TextChanged); + this.comboBox3.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox3_KeyPress); + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // + // checkBox4 + // + resources.ApplyResources(this.checkBox4, "checkBox4"); + this.checkBox4.Name = "checkBox4"; + this.checkBox4.UseVisualStyleBackColor = true; + // + // comboBox4 + // + resources.ApplyResources(this.comboBox4, "comboBox4"); + this.comboBox4.FormattingEnabled = true; + this.comboBox4.Name = "comboBox4"; + this.comboBox4.SelectedIndexChanged += new System.EventHandler(this.comboBox4_SelectedIndexChanged); + this.comboBox4.TextChanged += new System.EventHandler(this.comboBox4_TextChanged); + this.comboBox4.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox4_KeyPress); + // + // label4 + // + resources.ApplyResources(this.label4, "label4"); + this.label4.Name = "label4"; + // + // checkBox5 + // + resources.ApplyResources(this.checkBox5, "checkBox5"); + this.checkBox5.Name = "checkBox5"; + this.checkBox5.UseVisualStyleBackColor = true; + // + // comboBox5 + // + resources.ApplyResources(this.comboBox5, "comboBox5"); + this.comboBox5.FormattingEnabled = true; + this.comboBox5.Name = "comboBox5"; + this.comboBox5.SelectedIndexChanged += new System.EventHandler(this.comboBox5_SelectedIndexChanged); + this.comboBox5.TextChanged += new System.EventHandler(this.comboBox5_TextChanged); + this.comboBox5.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox5_KeyPress); + // + // label5 + // + resources.ApplyResources(this.label5, "label5"); + this.label5.Name = "label5"; + // + // checkBox6 + // + resources.ApplyResources(this.checkBox6, "checkBox6"); + this.checkBox6.Name = "checkBox6"; + this.checkBox6.UseVisualStyleBackColor = true; + // + // comboBox6 + // + resources.ApplyResources(this.comboBox6, "comboBox6"); + this.comboBox6.FormattingEnabled = true; + this.comboBox6.Name = "comboBox6"; + this.comboBox6.SelectedIndexChanged += new System.EventHandler(this.comboBox6_SelectedIndexChanged); + this.comboBox6.TextChanged += new System.EventHandler(this.comboBox6_TextChanged); + this.comboBox6.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox6_KeyPress); + // + // label6 + // + resources.ApplyResources(this.label6, "label6"); + this.label6.Name = "label6"; + // + // checkBox7 + // + resources.ApplyResources(this.checkBox7, "checkBox7"); + this.checkBox7.Name = "checkBox7"; + this.checkBox7.UseVisualStyleBackColor = true; + // + // comboBox7 + // + resources.ApplyResources(this.comboBox7, "comboBox7"); + this.comboBox7.FormattingEnabled = true; + this.comboBox7.Name = "comboBox7"; + this.comboBox7.SelectedIndexChanged += new System.EventHandler(this.comboBox7_SelectedIndexChanged); + this.comboBox7.TextChanged += new System.EventHandler(this.comboBox7_TextChanged); + this.comboBox7.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox7_KeyPress); + // + // label7 + // + resources.ApplyResources(this.label7, "label7"); + this.label7.Name = "label7"; + // + // checkBox8 + // + resources.ApplyResources(this.checkBox8, "checkBox8"); + this.checkBox8.Name = "checkBox8"; + this.checkBox8.UseVisualStyleBackColor = true; + // + // comboBox8 + // + resources.ApplyResources(this.comboBox8, "comboBox8"); + this.comboBox8.FormattingEnabled = true; + this.comboBox8.Name = "comboBox8"; + this.comboBox8.SelectedIndexChanged += new System.EventHandler(this.comboBox8_SelectedIndexChanged); + this.comboBox8.TextChanged += new System.EventHandler(this.comboBox8_TextChanged); + this.comboBox8.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox8_KeyPress); + // + // label8 + // + resources.ApplyResources(this.label8, "label8"); + this.label8.Name = "label8"; + // + // checkBox9 + // + resources.ApplyResources(this.checkBox9, "checkBox9"); + this.checkBox9.Name = "checkBox9"; + this.checkBox9.UseVisualStyleBackColor = true; + // + // comboBox9 + // + resources.ApplyResources(this.comboBox9, "comboBox9"); + this.comboBox9.FormattingEnabled = true; + this.comboBox9.Name = "comboBox9"; + this.comboBox9.SelectedIndexChanged += new System.EventHandler(this.comboBox9_SelectedIndexChanged); + this.comboBox9.TextChanged += new System.EventHandler(this.comboBox9_TextChanged); + this.comboBox9.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox9_KeyPress); + // + // label9 + // + resources.ApplyResources(this.label9, "label9"); + this.label9.Name = "label9"; + // + // checkBox10 + // + resources.ApplyResources(this.checkBox10, "checkBox10"); + this.checkBox10.Name = "checkBox10"; + this.checkBox10.UseVisualStyleBackColor = true; + // + // comboBox10 + // + resources.ApplyResources(this.comboBox10, "comboBox10"); + this.comboBox10.FormattingEnabled = true; + this.comboBox10.Name = "comboBox10"; + this.comboBox10.SelectedIndexChanged += new System.EventHandler(this.comboBox10_SelectedIndexChanged); + this.comboBox10.TextChanged += new System.EventHandler(this.comboBox10_TextChanged); + this.comboBox10.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox10_KeyPress); + // + // label10 + // + resources.ApplyResources(this.label10, "label10"); + this.label10.Name = "label10"; + // + // checkBox11 + // + resources.ApplyResources(this.checkBox11, "checkBox11"); + this.checkBox11.Name = "checkBox11"; + this.checkBox11.UseVisualStyleBackColor = true; + // + // comboBox11 + // + resources.ApplyResources(this.comboBox11, "comboBox11"); + this.comboBox11.FormattingEnabled = true; + this.comboBox11.Name = "comboBox11"; + this.comboBox11.SelectedIndexChanged += new System.EventHandler(this.comboBox11_SelectedIndexChanged); + this.comboBox11.TextChanged += new System.EventHandler(this.comboBox11_TextChanged); + this.comboBox11.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox11_KeyPress); + // + // label11 + // + resources.ApplyResources(this.label11, "label11"); + this.label11.Name = "label11"; + // + // checkBox12 + // + resources.ApplyResources(this.checkBox12, "checkBox12"); + this.checkBox12.Name = "checkBox12"; + this.checkBox12.UseVisualStyleBackColor = true; + // + // comboBox12 + // + resources.ApplyResources(this.comboBox12, "comboBox12"); + this.comboBox12.FormattingEnabled = true; + this.comboBox12.Name = "comboBox12"; + this.comboBox12.SelectedIndexChanged += new System.EventHandler(this.comboBox12_SelectedIndexChanged); + this.comboBox12.TextChanged += new System.EventHandler(this.comboBox12_TextChanged); + this.comboBox12.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox12_KeyPress); + // + // label12 + // + resources.ApplyResources(this.label12, "label12"); + this.label12.Name = "label12"; + // + // checkBox13 + // + resources.ApplyResources(this.checkBox13, "checkBox13"); + this.checkBox13.Name = "checkBox13"; + this.checkBox13.UseVisualStyleBackColor = true; + // + // comboBox13 + // + resources.ApplyResources(this.comboBox13, "comboBox13"); + this.comboBox13.FormattingEnabled = true; + this.comboBox13.Name = "comboBox13"; + this.comboBox13.SelectedIndexChanged += new System.EventHandler(this.comboBox13_SelectedIndexChanged); + this.comboBox13.TextChanged += new System.EventHandler(this.comboBox13_TextChanged); + this.comboBox13.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox13_KeyPress); + // + // label13 + // + resources.ApplyResources(this.label13, "label13"); + this.label13.Name = "label13"; + // + // checkBox14 + // + resources.ApplyResources(this.checkBox14, "checkBox14"); + this.checkBox14.Name = "checkBox14"; + this.checkBox14.UseVisualStyleBackColor = true; + // + // comboBox14 + // + resources.ApplyResources(this.comboBox14, "comboBox14"); + this.comboBox14.FormattingEnabled = true; + this.comboBox14.Name = "comboBox14"; + this.comboBox14.SelectedIndexChanged += new System.EventHandler(this.comboBox14_SelectedIndexChanged); + this.comboBox14.TextChanged += new System.EventHandler(this.comboBox14_TextChanged); + this.comboBox14.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox14_KeyPress); + // + // label14 + // + resources.ApplyResources(this.label14, "label14"); + this.label14.Name = "label14"; + // + // checkBox15 + // + resources.ApplyResources(this.checkBox15, "checkBox15"); + this.checkBox15.Name = "checkBox15"; + this.checkBox15.UseVisualStyleBackColor = true; + // + // comboBox15 + // + resources.ApplyResources(this.comboBox15, "comboBox15"); + this.comboBox15.FormattingEnabled = true; + this.comboBox15.Name = "comboBox15"; + this.comboBox15.SelectedIndexChanged += new System.EventHandler(this.comboBox15_SelectedIndexChanged); + this.comboBox15.TextChanged += new System.EventHandler(this.comboBox15_TextChanged); + this.comboBox15.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox15_KeyPress); + // + // label15 + // + resources.ApplyResources(this.label15, "label15"); + this.label15.Name = "label15"; + // + // checkBox16 + // + resources.ApplyResources(this.checkBox16, "checkBox16"); + this.checkBox16.Name = "checkBox16"; + this.checkBox16.UseVisualStyleBackColor = true; + // + // comboBox16 + // + resources.ApplyResources(this.comboBox16, "comboBox16"); + this.comboBox16.FormattingEnabled = true; + this.comboBox16.Name = "comboBox16"; + this.comboBox16.SelectedIndexChanged += new System.EventHandler(this.comboBox16_SelectedIndexChanged); + this.comboBox16.TextChanged += new System.EventHandler(this.comboBox16_TextChanged); + this.comboBox16.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox16_KeyPress); + // + // label16 + // + resources.ApplyResources(this.label16, "label16"); + this.label16.Name = "label16"; + // + // checkBox17 + // + resources.ApplyResources(this.checkBox17, "checkBox17"); + this.checkBox17.Name = "checkBox17"; + this.checkBox17.UseVisualStyleBackColor = true; + // + // comboBox17 + // + resources.ApplyResources(this.comboBox17, "comboBox17"); + this.comboBox17.FormattingEnabled = true; + this.comboBox17.Name = "comboBox17"; + this.comboBox17.SelectedIndexChanged += new System.EventHandler(this.comboBox17_SelectedIndexChanged); + this.comboBox17.TextChanged += new System.EventHandler(this.comboBox17_TextChanged); + this.comboBox17.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox17_KeyPress); + // + // label17 + // + resources.ApplyResources(this.label17, "label17"); + this.label17.Name = "label17"; + // + // checkBox18 + // + resources.ApplyResources(this.checkBox18, "checkBox18"); + this.checkBox18.Name = "checkBox18"; + this.checkBox18.UseVisualStyleBackColor = true; + // + // comboBox18 + // + resources.ApplyResources(this.comboBox18, "comboBox18"); + this.comboBox18.FormattingEnabled = true; + this.comboBox18.Name = "comboBox18"; + this.comboBox18.SelectedIndexChanged += new System.EventHandler(this.comboBox18_SelectedIndexChanged); + this.comboBox18.TextChanged += new System.EventHandler(this.comboBox18_TextChanged); + this.comboBox18.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox18_KeyPress); + // + // label18 + // + resources.ApplyResources(this.label18, "label18"); + this.label18.Name = "label18"; + // + // checkBox19 + // + resources.ApplyResources(this.checkBox19, "checkBox19"); + this.checkBox19.Name = "checkBox19"; + this.checkBox19.UseVisualStyleBackColor = true; + // + // comboBox19 + // + resources.ApplyResources(this.comboBox19, "comboBox19"); + this.comboBox19.FormattingEnabled = true; + this.comboBox19.Name = "comboBox19"; + this.comboBox19.SelectedIndexChanged += new System.EventHandler(this.comboBox19_SelectedIndexChanged); + this.comboBox19.TextChanged += new System.EventHandler(this.comboBox19_TextChanged); + this.comboBox19.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox19_KeyPress); + // + // label19 + // + resources.ApplyResources(this.label19, "label19"); + this.label19.Name = "label19"; + // + // checkBox20 + // + resources.ApplyResources(this.checkBox20, "checkBox20"); + this.checkBox20.Name = "checkBox20"; + this.checkBox20.UseVisualStyleBackColor = true; + // + // comboBox20 + // + resources.ApplyResources(this.comboBox20, "comboBox20"); + this.comboBox20.FormattingEnabled = true; + this.comboBox20.Name = "comboBox20"; + this.comboBox20.SelectedIndexChanged += new System.EventHandler(this.comboBox20_SelectedIndexChanged); + this.comboBox20.TextChanged += new System.EventHandler(this.comboBox20_TextChanged); + this.comboBox20.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox20_KeyPress); + // + // label20 + // + resources.ApplyResources(this.label20, "label20"); + this.label20.Name = "label20"; + // + // checkBox21 + // + resources.ApplyResources(this.checkBox21, "checkBox21"); + this.checkBox21.Name = "checkBox21"; + this.checkBox21.UseVisualStyleBackColor = true; + // + // comboBox21 + // + resources.ApplyResources(this.comboBox21, "comboBox21"); + this.comboBox21.FormattingEnabled = true; + this.comboBox21.Name = "comboBox21"; + this.comboBox21.SelectedIndexChanged += new System.EventHandler(this.comboBox21_SelectedIndexChanged); + this.comboBox21.TextChanged += new System.EventHandler(this.comboBox21_TextChanged); + this.comboBox21.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox21_KeyPress); + // + // label21 + // + resources.ApplyResources(this.label21, "label21"); + this.label21.Name = "label21"; + // + // checkBox22 + // + resources.ApplyResources(this.checkBox22, "checkBox22"); + this.checkBox22.Name = "checkBox22"; + this.checkBox22.UseVisualStyleBackColor = true; + // + // comboBox22 + // + resources.ApplyResources(this.comboBox22, "comboBox22"); + this.comboBox22.FormattingEnabled = true; + this.comboBox22.Name = "comboBox22"; + this.comboBox22.SelectedIndexChanged += new System.EventHandler(this.comboBox22_SelectedIndexChanged); + this.comboBox22.TextChanged += new System.EventHandler(this.comboBox22_TextChanged); + this.comboBox22.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox22_KeyPress); + // + // label22 + // + resources.ApplyResources(this.label22, "label22"); + this.label22.Name = "label22"; + // + // checkBox23 + // + resources.ApplyResources(this.checkBox23, "checkBox23"); + this.checkBox23.Name = "checkBox23"; + this.checkBox23.UseVisualStyleBackColor = true; + // + // comboBox23 + // + resources.ApplyResources(this.comboBox23, "comboBox23"); + this.comboBox23.FormattingEnabled = true; + this.comboBox23.Name = "comboBox23"; + this.comboBox23.SelectedIndexChanged += new System.EventHandler(this.comboBox23_SelectedIndexChanged); + this.comboBox23.TextChanged += new System.EventHandler(this.comboBox23_TextChanged); + this.comboBox23.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox23_KeyPress); + // + // label23 + // + resources.ApplyResources(this.label23, "label23"); + this.label23.Name = "label23"; + // + // checkBox24 + // + resources.ApplyResources(this.checkBox24, "checkBox24"); + this.checkBox24.Name = "checkBox24"; + this.checkBox24.UseVisualStyleBackColor = true; + // + // comboBox24 + // + resources.ApplyResources(this.comboBox24, "comboBox24"); + this.comboBox24.FormattingEnabled = true; + this.comboBox24.Name = "comboBox24"; + this.comboBox24.SelectedIndexChanged += new System.EventHandler(this.comboBox24_SelectedIndexChanged); + this.comboBox24.TextChanged += new System.EventHandler(this.comboBox24_TextChanged); + this.comboBox24.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox24_KeyPress); + // + // label24 + // + resources.ApplyResources(this.label24, "label24"); + this.label24.Name = "label24"; + // + // CycleBeginningForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.Controls.Add(this.checkBox24); + this.Controls.Add(this.comboBox24); + this.Controls.Add(this.label24); + this.Controls.Add(this.checkBox23); + this.Controls.Add(this.comboBox23); + this.Controls.Add(this.label23); + this.Controls.Add(this.checkBox22); + this.Controls.Add(this.comboBox22); + this.Controls.Add(this.label22); + this.Controls.Add(this.checkBox21); + this.Controls.Add(this.comboBox21); + this.Controls.Add(this.label21); + this.Controls.Add(this.checkBox20); + this.Controls.Add(this.comboBox20); + this.Controls.Add(this.label20); + this.Controls.Add(this.checkBox19); + this.Controls.Add(this.comboBox19); + this.Controls.Add(this.label19); + this.Controls.Add(this.checkBox18); + this.Controls.Add(this.comboBox18); + this.Controls.Add(this.label18); + this.Controls.Add(this.checkBox17); + this.Controls.Add(this.comboBox17); + this.Controls.Add(this.label17); + this.Controls.Add(this.checkBox16); + this.Controls.Add(this.comboBox16); + this.Controls.Add(this.label16); + this.Controls.Add(this.checkBox15); + this.Controls.Add(this.comboBox15); + this.Controls.Add(this.label15); + this.Controls.Add(this.checkBox14); + this.Controls.Add(this.comboBox14); + this.Controls.Add(this.label14); + this.Controls.Add(this.checkBox13); + this.Controls.Add(this.comboBox13); + this.Controls.Add(this.label13); + this.Controls.Add(this.checkBox12); + this.Controls.Add(this.comboBox12); + this.Controls.Add(this.label12); + this.Controls.Add(this.checkBox11); + this.Controls.Add(this.comboBox11); + this.Controls.Add(this.label11); + this.Controls.Add(this.checkBox10); + this.Controls.Add(this.comboBox10); + this.Controls.Add(this.label10); + this.Controls.Add(this.checkBox9); + this.Controls.Add(this.comboBox9); + this.Controls.Add(this.label9); + this.Controls.Add(this.checkBox8); + this.Controls.Add(this.comboBox8); + this.Controls.Add(this.label8); + this.Controls.Add(this.checkBox7); + this.Controls.Add(this.comboBox7); + this.Controls.Add(this.label7); + this.Controls.Add(this.checkBox6); + this.Controls.Add(this.comboBox6); + this.Controls.Add(this.label6); + this.Controls.Add(this.checkBox5); + this.Controls.Add(this.comboBox5); + this.Controls.Add(this.label5); + this.Controls.Add(this.checkBox4); + this.Controls.Add(this.comboBox4); + this.Controls.Add(this.label4); + this.Controls.Add(this.checkBox3); + this.Controls.Add(this.comboBox3); + this.Controls.Add(this.label3); + this.Controls.Add(this.checkBox2); + this.Controls.Add(this.comboBox2); + this.Controls.Add(this.label2); + this.Controls.Add(this.checkBox1); + this.Controls.Add(this.comboBox1); + this.Controls.Add(this.label1); + this.Controls.Add(this.clearButton); + this.Controls.Add(this.orderGroupBox); + this.Controls.Add(this.okButton); + this.ForeColor = System.Drawing.Color.Black; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "CycleBeginningForm"; + this.TopMost = true; + this.Load += new System.EventHandler(this.CycleBeginningForm_Load); + this.orderGroupBox.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.GroupBox orderGroupBox; + private System.Windows.Forms.ComboBox orderComboBox; + private System.Windows.Forms.Button clearButton; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox comboBox1; + private System.Windows.Forms.CheckBox checkBox1; + private System.Windows.Forms.CheckBox checkBox2; + private System.Windows.Forms.ComboBox comboBox2; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.CheckBox checkBox3; + private System.Windows.Forms.ComboBox comboBox3; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.CheckBox checkBox4; + private System.Windows.Forms.ComboBox comboBox4; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.CheckBox checkBox5; + private System.Windows.Forms.ComboBox comboBox5; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.CheckBox checkBox6; + private System.Windows.Forms.ComboBox comboBox6; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.CheckBox checkBox7; + private System.Windows.Forms.ComboBox comboBox7; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.CheckBox checkBox8; + private System.Windows.Forms.ComboBox comboBox8; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.CheckBox checkBox9; + private System.Windows.Forms.ComboBox comboBox9; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.CheckBox checkBox10; + private System.Windows.Forms.ComboBox comboBox10; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.CheckBox checkBox11; + private System.Windows.Forms.ComboBox comboBox11; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.CheckBox checkBox12; + private System.Windows.Forms.ComboBox comboBox12; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.CheckBox checkBox13; + private System.Windows.Forms.ComboBox comboBox13; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.CheckBox checkBox14; + private System.Windows.Forms.ComboBox comboBox14; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.CheckBox checkBox15; + private System.Windows.Forms.ComboBox comboBox15; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.CheckBox checkBox16; + private System.Windows.Forms.ComboBox comboBox16; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.CheckBox checkBox17; + private System.Windows.Forms.ComboBox comboBox17; + private System.Windows.Forms.Label label17; + private System.Windows.Forms.CheckBox checkBox18; + private System.Windows.Forms.ComboBox comboBox18; + private System.Windows.Forms.Label label18; + private System.Windows.Forms.CheckBox checkBox19; + private System.Windows.Forms.ComboBox comboBox19; + private System.Windows.Forms.Label label19; + private System.Windows.Forms.CheckBox checkBox20; + private System.Windows.Forms.ComboBox comboBox20; + private System.Windows.Forms.Label label20; + private System.Windows.Forms.CheckBox checkBox21; + private System.Windows.Forms.ComboBox comboBox21; + private System.Windows.Forms.Label label21; + private System.Windows.Forms.CheckBox checkBox22; + private System.Windows.Forms.ComboBox comboBox22; + private System.Windows.Forms.Label label22; + private System.Windows.Forms.CheckBox checkBox23; + private System.Windows.Forms.ComboBox comboBox23; + private System.Windows.Forms.Label label23; + private System.Windows.Forms.CheckBox checkBox24; + private System.Windows.Forms.ComboBox comboBox24; + private System.Windows.Forms.Label label24; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/CycleBeginningForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/CycleBeginningForm.cs new file mode 100644 index 00000000..ee5f1067 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/CycleBeginningForm.cs @@ -0,0 +1,494 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using log4net; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.Standard24 +{ + public partial class CycleBeginningForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(CycleBeginningForm)); + + /// Number of water meters + public readonly int WaterMetersCount; + + /// To be retrieved after the form is closed + public string PurchaseOrder; + public string[] SNText; + public bool[] Disabled; + + /// Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + /// Number of text boxes for serial numbers + int textBoxesCount; + Label[] labels; + ComboBox[] comboBoxes; + CheckBox[] checkBoxes; + IList enabledComboBoxes; + + + /// Parameterless constructor for common functionality + public CycleBeginningForm() + { + InitializeComponent(); + ControlBox = false; + + textBoxesCount = 24; + labels = new Label[] + { + label1, label2, label3, label4, label5, label6, label7, label8, label9, label10, + label11, label12, label13, label14, label15, label16, label17, label18, label19, label20, + label21, label22, label23, label24, + }; + comboBoxes = new ComboBox[] + { + comboBox1, comboBox2, comboBox3, comboBox4, comboBox5, comboBox6, + comboBox7, comboBox8, comboBox9, comboBox10, comboBox11, comboBox12, + comboBox13, comboBox14, comboBox15, comboBox16, comboBox17, comboBox18, + comboBox19, comboBox20, comboBox21, comboBox22, comboBox23, comboBox24, + }; + checkBoxes = new CheckBox[] + { + checkBox1, checkBox2, checkBox3, checkBox4, checkBox5, checkBox6, + checkBox7, checkBox8, checkBox9, checkBox10, checkBox11, checkBox12, + checkBox13, checkBox14, checkBox15, checkBox16, checkBox17, checkBox18, + checkBox19, checkBox20, checkBox21, checkBox22, checkBox23, checkBox24, + }; + enabledComboBoxes = new List(); + + completed = false; + StartForceCloseHandler(); + } + + /// + /// Constructor + /// + /// Number of text boxes for serial numbers + public CycleBeginningForm(int waterMetersCount) + : this() + { + this.WaterMetersCount = waterMetersCount; + SNText = new string[WaterMetersCount]; + Disabled = new bool[WaterMetersCount]; + + ShuffleTextBoxes(Config.Data.WMsCount, Config.Data.LineSize); + + //Height = 147 + WaterMetersCount * 90; + } + + /// + /// 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) + { + if (wmsCount < textBoxesCount && lineSize > 0) + { + int nrLines = (wmsCount + lineSize - 1) / lineSize; + int gap = (textBoxesCount - wmsCount) / nrLines; + + int dest = 0; + for (int l = 0; l < nrLines; l++) + { + for (int i = 0; i < lineSize; i++) + { + labels[dest] = labels[l * lineSize + l * gap + i]; + comboBoxes[dest] = comboBoxes[l * lineSize + l * gap + i]; + checkBoxes[dest] = checkBoxes[l * lineSize + l * gap + i]; + dest++; + } + } + textBoxesCount = wmsCount; + } + } + + private void CycleBeginningForm_Load(object sender, EventArgs e) + { + Localize(); + + PrepareOrderCombo(orderComboBox); + + for (int i = 0; i < textBoxesCount; i++) + { + if (Program.LocalSettings.LastSNTextsCount == textBoxesCount) + { + comboBoxes[i].Items.Add((Program.LocalSettings.LastSNTexts[i] == null) ? string.Empty : Program.LocalSettings.LastSNTexts[i]); + } + labels[i].Visible = comboBoxes[i].Visible = checkBoxes[i].Visible = true; + enabledComboBoxes.Add(comboBoxes[i]); + } + } + + void Localize() + { + Text = Strings.Data; + orderGroupBox.Text = Strings.Purchase_order; + for (int i = 0; i < textBoxesCount; i++) + { + labels[i].Text = Strings.Serial_Number + " " + (i + 1).ToString(); + } + okButton.Text = Strings.OkBtnText; + clearButton.Text = Strings.ClearBtnText; + } + + /// + /// Load Purchase order combo box items from the LocalSettings PurchaseOrderHistory array + /// + /// Puchase order ComboBox + void PrepareOrderCombo(ComboBox orderComboBox) + { + for (int i = 0; i < Program.LocalSettings.PurchaseOrderHistoryCount; i++) + { + orderComboBox.Items.Add(Program.LocalSettings.PurchaseOrderHistory[i]); + } + + if (orderComboBox.Items.Count > 0) + { + orderComboBox.Text = orderComboBox.Items[0].ToString(); + } + } + + private void okButton_Click(object sender, EventArgs e) + { + PurchaseOrder = orderComboBox.Text; + Program.LocalSettings.UpdateHistory(orderComboBox.Text, + ref Program.LocalSettings.PurchaseOrderHistory +#if FUZHOU150 || FUZHOU300 + , 20 +#endif + ); + + Program.LocalSettings.LastSNTexts = SNText; + + for (int i = 0; i < Math.Min(WaterMetersCount, textBoxesCount); i++) + { + SNText[i] = comboBoxes[i].Text; + Disabled[i] = !checkBoxes[i].Checked; + } + + completed = true; + Close(); + } + + /// + /// When one combo box is updated using drop-down menu, all combo boxes + /// are updated by this function. + /// + private void UpdateAllCombos() + { + for (int i = 0; i < Math.Min(WaterMetersCount, textBoxesCount); i++) + { + comboBoxes[i].Text = Program.LocalSettings.LastSNTexts[i]; + checkBoxes[i].Checked = !string.IsNullOrEmpty(comboBoxes[i].Text); + } + } + + private void clearButton_Click(object sender, EventArgs e) + { + for (int i = 0; i < Math.Min(WaterMetersCount, textBoxesCount); i++) + { + comboBoxes[i].Text = string.Empty; + checkBoxes[i].Checked = false; + } + } + + + private void comboBox1_TextChanged(object sender, EventArgs e) { checkBox1.Checked = true; } + private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox1.Text.Equals(comboBox1.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox2_TextChanged(object sender, EventArgs e) { checkBox2.Checked = true; } + private void comboBox2_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox2.Text.Equals(comboBox2.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox3_TextChanged(object sender, EventArgs e) { checkBox3.Checked = true; } + private void comboBox3_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox3.Text.Equals(comboBox3.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox4_TextChanged(object sender, EventArgs e) { checkBox4.Checked = true; } + private void comboBox4_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox4.Text.Equals(comboBox4.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox5_TextChanged(object sender, EventArgs e) { checkBox5.Checked = true; } + private void comboBox5_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox5.Text.Equals(comboBox5.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox6_TextChanged(object sender, EventArgs e) { checkBox6.Checked = true; } + private void comboBox6_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox6.Text.Equals(comboBox6.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox7_TextChanged(object sender, EventArgs e) { checkBox7.Checked = true; } + private void comboBox7_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox7.Text.Equals(comboBox7.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox8_TextChanged(object sender, EventArgs e) { checkBox8.Checked = true; } + private void comboBox8_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox8.Text.Equals(comboBox8.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox9_TextChanged(object sender, EventArgs e) { checkBox9.Checked = true; } + private void comboBox9_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox9.Text.Equals(comboBox9.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox10_TextChanged(object sender, EventArgs e) { checkBox10.Checked = true; } + private void comboBox10_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox10.Text.Equals(comboBox10.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox11_TextChanged(object sender, EventArgs e) { checkBox11.Checked = true; } + private void comboBox11_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox11.Text.Equals(comboBox11.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox12_TextChanged(object sender, EventArgs e) { checkBox12.Checked = true; } + private void comboBox12_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox12.Text.Equals(comboBox12.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox13_TextChanged(object sender, EventArgs e) { checkBox13.Checked = true; } + private void comboBox13_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox13.Text.Equals(comboBox13.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox14_TextChanged(object sender, EventArgs e) { checkBox14.Checked = true; } + private void comboBox14_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox14.Text.Equals(comboBox14.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox15_TextChanged(object sender, EventArgs e) { checkBox15.Checked = true; } + private void comboBox15_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox15.Text.Equals(comboBox15.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox16_TextChanged(object sender, EventArgs e) { checkBox16.Checked = true; } + private void comboBox16_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox16.Text.Equals(comboBox16.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox17_TextChanged(object sender, EventArgs e) { checkBox17.Checked = true; } + private void comboBox17_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox17.Text.Equals(comboBox17.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox18_TextChanged(object sender, EventArgs e) { checkBox18.Checked = true; } + private void comboBox18_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox18.Text.Equals(comboBox18.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox19_TextChanged(object sender, EventArgs e) { checkBox19.Checked = true; } + private void comboBox19_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox19.Text.Equals(comboBox19.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox20_TextChanged(object sender, EventArgs e) { checkBox20.Checked = true; } + private void comboBox20_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox20.Text.Equals(comboBox20.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox21_TextChanged(object sender, EventArgs e) { checkBox21.Checked = true; } + private void comboBox21_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox21.Text.Equals(comboBox21.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox22_TextChanged(object sender, EventArgs e) { checkBox22.Checked = true; } + private void comboBox22_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox22.Text.Equals(comboBox22.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox23_TextChanged(object sender, EventArgs e) { checkBox23.Checked = true; } + private void comboBox23_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox23.Text.Equals(comboBox23.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox24_TextChanged(object sender, EventArgs e) { checkBox24.Checked = true; } + private void comboBox24_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox24.Text.Equals(comboBox24.Items[0])) UpdateAllCombos(); + } + } + + #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); + }; + } + + private void OnForceClose(object sender, EventArgs args) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + + /// + /// Process a key press within any enabled text boxe + /// + /// + /// + /// TextBox control which received the event + private void ProcKeyPress(object sender, KeyPressEventArgs e, ComboBox currentFocusOwner) + { + if (e.KeyChar == '+') + { + /// Process '+' key ..... Form completed + okButton_Click(sender, e); + } + if (e.KeyChar == '\r') + { + /// Process key ..... Next text field + if (enabledComboBoxes.Count < 2) return; /// There is just one enabled textbox + + for (int i = 0; i < enabledComboBoxes.Count; i++) + { + if (enabledComboBoxes[i] == currentFocusOwner) + { + /// Change focus to the next enabled text box + enabledComboBoxes[(i + 1) % enabledComboBoxes.Count].Focus(); + return; + } + } + } + } + + private void comboBox1_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox1); } + private void comboBox2_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox2); } + private void comboBox3_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox3); } + private void comboBox4_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox4); } + private void comboBox5_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox5); } + private void comboBox6_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox6); } + private void comboBox7_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox7); } + private void comboBox8_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox8); } + private void comboBox9_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox9); } + private void comboBox10_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox10); } + private void comboBox11_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox11); } + private void comboBox12_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox12); } + private void comboBox13_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox13); } + private void comboBox14_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox14); } + private void comboBox15_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox15); } + private void comboBox16_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox16); } + private void comboBox17_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox17); } + private void comboBox18_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox18); } + private void comboBox19_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox19); } + private void comboBox20_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox20); } + private void comboBox21_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox21); } + private void comboBox22_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox22); } + private void comboBox23_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox23); } + private void comboBox24_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox24); } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/CycleBeginningForm.pl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/CycleBeginningForm.pl.resx new file mode 100644 index 00000000..05823ddc --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/CycleBeginningForm.pl.resx @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + OK + + + Kolejność + + + Usunąć + + + Nr seryjny 1 + + + Nr seryjny 2 + + + Nr seryjny 3 + + + Nr seryjny 4 + + + Nr seryjny 5 + + + Nr seryjny 6 + + + Nr seryjny 7 + + + Nr seryjny 8 + + + Nr seryjny 9 + + + Nr seryjny 10 + + + Nr seryjny 11 + + + Nr seryjny 12 + + + Nr seryjny 13 + + + Nr seryjny 14 + + + Nr seryjny 15 + + + Nr seryjny 16 + + + Nr seryjny 17 + + + Nr seryjny 18 + + + Nr seryjny 19 + + + Nr seryjny 20 + + + Nr seryjny 21 + + + Nr seryjny 22 + + + Nr seryjny 23 + + + Nr seryjny 24 + + + Dane partii + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/CycleBeginningForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/CycleBeginningForm.resx new file mode 100644 index 00000000..7b686f23 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/CycleBeginningForm.resx @@ -0,0 +1,2475 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + Verdana, 14.25pt + + + 729, 26 + + + 112, 63 + + + + 7 + + + OK + + + okButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 74 + + + 90, 31 + + + 260, 31 + + + 0 + + + orderComboBox + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + orderGroupBox + + + 0 + + + Verdana, 14.25pt + + + 28, 12 + + + 397, 82 + + + 0 + + + Order + + + orderGroupBox + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 73 + + + Verdana, 14.25pt + + + + NoControl + + + 582, 26 + + + 112, 63 + + + 8 + + + Clear + + + clearButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 72 + + + True + + + Verdana, 14.25pt + + + 24, 127 + + + 166, 23 + + + 9 + + + Serial Number 1 + + + False + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 71 + + + Verdana, 14.25pt + + + 225, 124 + + + 163, 31 + + + 10 + + + False + + + comboBox1 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 70 + + + True + + + 410, 135 + + + 15, 14 + + + 11 + + + False + + + checkBox1 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 69 + + + True + + + NoControl + + + 410, 179 + + + 15, 14 + + + 14 + + + False + + + checkBox2 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 66 + + + Verdana, 14.25pt + + + 225, 168 + + + 163, 31 + + + 13 + + + False + + + comboBox2 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 67 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 171 + + + 166, 23 + + + 12 + + + Serial Number 2 + + + False + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 68 + + + True + + + NoControl + + + 410, 223 + + + 15, 14 + + + 17 + + + False + + + checkBox3 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 63 + + + Verdana, 14.25pt + + + 225, 212 + + + 163, 31 + + + 16 + + + False + + + comboBox3 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 64 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 215 + + + 166, 23 + + + 15 + + + Serial Number 3 + + + False + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 65 + + + True + + + NoControl + + + 410, 267 + + + 15, 14 + + + 20 + + + False + + + checkBox4 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 60 + + + Verdana, 14.25pt + + + 225, 256 + + + 163, 31 + + + 19 + + + False + + + comboBox4 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 61 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 259 + + + 166, 23 + + + 18 + + + Serial Number 4 + + + False + + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 62 + + + True + + + NoControl + + + 410, 311 + + + 15, 14 + + + 23 + + + False + + + checkBox5 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 57 + + + Verdana, 14.25pt + + + 225, 300 + + + 163, 31 + + + 22 + + + False + + + comboBox5 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 58 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 303 + + + 166, 23 + + + 21 + + + Serial Number 5 + + + False + + + label5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 59 + + + True + + + NoControl + + + 410, 355 + + + 15, 14 + + + 26 + + + False + + + checkBox6 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 54 + + + Verdana, 14.25pt + + + 225, 344 + + + 163, 31 + + + 25 + + + False + + + comboBox6 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 55 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 347 + + + 166, 23 + + + 24 + + + Serial Number 6 + + + False + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 56 + + + True + + + NoControl + + + 410, 399 + + + 15, 14 + + + 29 + + + False + + + checkBox7 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 51 + + + Verdana, 14.25pt + + + 225, 388 + + + 163, 31 + + + 28 + + + False + + + comboBox7 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 52 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 391 + + + 166, 23 + + + 27 + + + Serial Number 7 + + + False + + + label7 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 53 + + + True + + + NoControl + + + 410, 443 + + + 15, 14 + + + 32 + + + False + + + checkBox8 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 48 + + + Verdana, 14.25pt + + + 225, 432 + + + 163, 31 + + + 31 + + + False + + + comboBox8 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 49 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 435 + + + 166, 23 + + + 30 + + + Serial Number 8 + + + False + + + label8 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 50 + + + True + + + NoControl + + + 410, 487 + + + 15, 14 + + + 35 + + + False + + + checkBox9 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 45 + + + Verdana, 14.25pt + + + 225, 476 + + + 163, 31 + + + 34 + + + False + + + comboBox9 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 46 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 479 + + + 166, 23 + + + 33 + + + Serial Number 9 + + + False + + + label9 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 47 + + + True + + + NoControl + + + 410, 531 + + + 15, 14 + + + 38 + + + False + + + checkBox10 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 42 + + + Verdana, 14.25pt + + + 225, 520 + + + 163, 31 + + + 37 + + + False + + + comboBox10 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 43 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 523 + + + 178, 23 + + + 36 + + + Serial Number 10 + + + False + + + label10 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 44 + + + True + + + NoControl + + + 410, 575 + + + 15, 14 + + + 41 + + + False + + + checkBox11 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 39 + + + Verdana, 14.25pt + + + 225, 564 + + + 163, 31 + + + 40 + + + False + + + comboBox11 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 40 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 567 + + + 178, 23 + + + 39 + + + Serial Number 11 + + + False + + + label11 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 41 + + + True + + + NoControl + + + 410, 619 + + + 15, 14 + + + 44 + + + False + + + checkBox12 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 36 + + + Verdana, 14.25pt + + + 225, 608 + + + 163, 31 + + + 43 + + + False + + + comboBox12 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 37 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 611 + + + 178, 23 + + + 42 + + + Serial Number 12 + + + False + + + label12 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 38 + + + True + + + NoControl + + + 871, 135 + + + 15, 14 + + + 47 + + + False + + + checkBox13 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 33 + + + Verdana, 14.25pt + + + 686, 124 + + + 163, 31 + + + 46 + + + False + + + comboBox13 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 34 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 481, 127 + + + 178, 23 + + + 45 + + + Serial Number 13 + + + False + + + label13 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 35 + + + True + + + NoControl + + + 871, 179 + + + 15, 14 + + + 50 + + + False + + + checkBox14 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 30 + + + Verdana, 14.25pt + + + 686, 168 + + + 163, 31 + + + 49 + + + False + + + comboBox14 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 31 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 481, 171 + + + 178, 23 + + + 48 + + + Serial Number 14 + + + False + + + label14 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 32 + + + True + + + NoControl + + + 871, 223 + + + 15, 14 + + + 53 + + + False + + + checkBox15 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 27 + + + Verdana, 14.25pt + + + 686, 212 + + + 163, 31 + + + 52 + + + False + + + comboBox15 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 28 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 481, 215 + + + 178, 23 + + + 51 + + + Serial Number 15 + + + False + + + label15 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 29 + + + True + + + NoControl + + + 871, 267 + + + 15, 14 + + + 56 + + + False + + + checkBox16 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 24 + + + Verdana, 14.25pt + + + 686, 256 + + + 163, 31 + + + 55 + + + False + + + comboBox16 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 25 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 481, 259 + + + 178, 23 + + + 54 + + + Serial Number 16 + + + False + + + label16 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 26 + + + True + + + NoControl + + + 871, 311 + + + 15, 14 + + + 59 + + + False + + + checkBox17 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 21 + + + Verdana, 14.25pt + + + 686, 300 + + + 163, 31 + + + 58 + + + False + + + comboBox17 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 22 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 481, 303 + + + 178, 23 + + + 57 + + + Serial Number 17 + + + False + + + label17 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 23 + + + True + + + NoControl + + + 871, 355 + + + 15, 14 + + + 62 + + + False + + + checkBox18 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 18 + + + Verdana, 14.25pt + + + 686, 344 + + + 163, 31 + + + 61 + + + False + + + comboBox18 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 19 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 481, 347 + + + 178, 23 + + + 60 + + + Serial Number 18 + + + False + + + label18 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 20 + + + True + + + NoControl + + + 871, 399 + + + 15, 14 + + + 65 + + + False + + + checkBox19 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 15 + + + Verdana, 14.25pt + + + 686, 388 + + + 163, 31 + + + 64 + + + False + + + comboBox19 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 16 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 481, 391 + + + 178, 23 + + + 63 + + + Serial Number 19 + + + False + + + label19 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 17 + + + True + + + NoControl + + + 871, 443 + + + 15, 14 + + + 68 + + + False + + + checkBox20 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 12 + + + Verdana, 14.25pt + + + 686, 432 + + + 163, 31 + + + 67 + + + False + + + comboBox20 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 13 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 481, 435 + + + 178, 23 + + + 66 + + + Serial Number 20 + + + False + + + label20 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 14 + + + True + + + NoControl + + + 871, 487 + + + 15, 14 + + + 71 + + + False + + + checkBox21 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 9 + + + Verdana, 14.25pt + + + 686, 476 + + + 163, 31 + + + 70 + + + False + + + comboBox21 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 10 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 481, 479 + + + 178, 23 + + + 69 + + + Serial Number 21 + + + False + + + label21 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 11 + + + True + + + NoControl + + + 871, 531 + + + 15, 14 + + + 74 + + + False + + + checkBox22 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 6 + + + Verdana, 14.25pt + + + 686, 520 + + + 163, 31 + + + 73 + + + False + + + comboBox22 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 7 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 481, 523 + + + 178, 23 + + + 72 + + + Serial Number 22 + + + False + + + label22 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 8 + + + True + + + NoControl + + + 871, 575 + + + 15, 14 + + + 77 + + + False + + + checkBox23 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + Verdana, 14.25pt + + + 686, 564 + + + 163, 31 + + + 76 + + + False + + + comboBox23 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 481, 567 + + + 178, 23 + + + 75 + + + Serial Number 23 + + + False + + + label23 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 5 + + + True + + + NoControl + + + 871, 619 + + + 15, 14 + + + 80 + + + False + + + checkBox24 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + Verdana, 14.25pt + + + 686, 608 + + + 163, 31 + + + 79 + + + False + + + comboBox24 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 481, 611 + + + 178, 23 + + + 78 + + + Serial Number 24 + + + False + + + label24 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + True + + + 6, 13 + + + True + + + 919, 656 + + + Batch data + + + CycleBeginningForm + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/CycleBeginningForm.ru.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/CycleBeginningForm.ru.resx new file mode 100644 index 00000000..09c3aab7 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/CycleBeginningForm.ru.resx @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + OK + + + Порядок + + + Очистить + + + Серийный номер 1 + + + Серийный номер 2 + + + Серийный номер 3 + + + Серийный номер 4 + + + Серийный номер 5 + + + Серийный номер 6 + + + Серийный номер 7 + + + Серийный номер 8 + + + Серийный номер 9 + + + Серийный номер 10 + + + Серийный номер 11 + + + Серийный номер 12 + + + Серийный номер 13 + + + Серийный номер 14 + + + Серийный номер 15 + + + Серийный номер 16 + + + Серийный номер 17 + + + Серийный номер 18 + + + Серийный номер 19 + + + Серийный номер 20 + + + Серийный номер 21 + + + Серийный номер 22 + + + Серийный номер 23 + + + Серийный номер 24 + + + Пакетные данные + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/CycleEndForm.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/CycleEndForm.Designer.cs new file mode 100644 index 00000000..16800ead --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/CycleEndForm.Designer.cs @@ -0,0 +1,652 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.Standard24 +{ + partial class CycleEndForm + { + /// + /// 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() + { + this.textBox2 = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.okButton = new System.Windows.Forms.Button(); + this.textBox3 = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.textBox4 = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.textBox5 = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.textBox6 = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.textBox7 = new System.Windows.Forms.TextBox(); + this.label7 = new System.Windows.Forms.Label(); + this.textBox8 = new System.Windows.Forms.TextBox(); + this.label8 = new System.Windows.Forms.Label(); + this.textBox9 = new System.Windows.Forms.TextBox(); + this.label9 = new System.Windows.Forms.Label(); + this.textBox10 = new System.Windows.Forms.TextBox(); + this.label10 = new System.Windows.Forms.Label(); + this.textBox11 = new System.Windows.Forms.TextBox(); + this.label11 = new System.Windows.Forms.Label(); + this.textBox12 = new System.Windows.Forms.TextBox(); + this.label12 = new System.Windows.Forms.Label(); + this.textBox13 = new System.Windows.Forms.TextBox(); + this.label13 = new System.Windows.Forms.Label(); + this.textBox14 = new System.Windows.Forms.TextBox(); + this.label14 = new System.Windows.Forms.Label(); + this.textBox15 = new System.Windows.Forms.TextBox(); + this.label15 = new System.Windows.Forms.Label(); + this.textBox16 = new System.Windows.Forms.TextBox(); + this.label16 = new System.Windows.Forms.Label(); + this.textBox17 = new System.Windows.Forms.TextBox(); + this.label17 = new System.Windows.Forms.Label(); + this.textBox18 = new System.Windows.Forms.TextBox(); + this.label18 = new System.Windows.Forms.Label(); + this.textBox19 = new System.Windows.Forms.TextBox(); + this.label19 = new System.Windows.Forms.Label(); + this.textBox20 = new System.Windows.Forms.TextBox(); + this.label20 = new System.Windows.Forms.Label(); + this.textBox21 = new System.Windows.Forms.TextBox(); + this.label21 = new System.Windows.Forms.Label(); + this.textBox22 = new System.Windows.Forms.TextBox(); + this.label22 = new System.Windows.Forms.Label(); + this.textBox23 = new System.Windows.Forms.TextBox(); + this.label23 = new System.Windows.Forms.Label(); + this.textBox24 = new System.Windows.Forms.TextBox(); + this.label24 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // textBox2 + // + this.textBox2.Location = new System.Drawing.Point(205, 66); + this.textBox2.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox2.Name = "textBox2"; + this.textBox2.Size = new System.Drawing.Size(169, 27); + this.textBox2.TabIndex = 1; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(38, 71); + this.label2.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(62, 18); + this.label2.TabIndex = 0; + this.label2.Text = "Stand:"; + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(205, 30); + this.textBox1.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(169, 27); + this.textBox1.TabIndex = 1; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(38, 35); + this.label1.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(62, 18); + this.label1.TabIndex = 0; + this.label1.Text = "Stand:"; + // + // okButton + // + this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(832, 30); + this.okButton.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(90, 60); + this.okButton.TabIndex = 7; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // textBox3 + // + this.textBox3.Location = new System.Drawing.Point(205, 102); + this.textBox3.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox3.Name = "textBox3"; + this.textBox3.Size = new System.Drawing.Size(169, 27); + this.textBox3.TabIndex = 1; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(38, 107); + this.label3.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(62, 18); + this.label3.TabIndex = 0; + this.label3.Text = "Stand:"; + // + // textBox4 + // + this.textBox4.Location = new System.Drawing.Point(205, 138); + this.textBox4.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox4.Name = "textBox4"; + this.textBox4.Size = new System.Drawing.Size(169, 27); + this.textBox4.TabIndex = 1; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(38, 143); + this.label4.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(62, 18); + this.label4.TabIndex = 0; + this.label4.Text = "Stand:"; + // + // textBox5 + // + this.textBox5.Location = new System.Drawing.Point(205, 174); + this.textBox5.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox5.Name = "textBox5"; + this.textBox5.Size = new System.Drawing.Size(169, 27); + this.textBox5.TabIndex = 1; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(38, 179); + this.label5.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(62, 18); + this.label5.TabIndex = 0; + this.label5.Text = "Stand:"; + // + // textBox6 + // + this.textBox6.Location = new System.Drawing.Point(205, 210); + this.textBox6.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox6.Name = "textBox6"; + this.textBox6.Size = new System.Drawing.Size(169, 27); + this.textBox6.TabIndex = 1; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(38, 215); + this.label6.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(62, 18); + this.label6.TabIndex = 0; + this.label6.Text = "Stand:"; + // + // textBox7 + // + this.textBox7.Location = new System.Drawing.Point(205, 246); + this.textBox7.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox7.Name = "textBox7"; + this.textBox7.Size = new System.Drawing.Size(169, 27); + this.textBox7.TabIndex = 9; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(38, 251); + this.label7.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(62, 18); + this.label7.TabIndex = 8; + this.label7.Text = "Stand:"; + // + // textBox8 + // + this.textBox8.Location = new System.Drawing.Point(205, 282); + this.textBox8.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox8.Name = "textBox8"; + this.textBox8.Size = new System.Drawing.Size(169, 27); + this.textBox8.TabIndex = 11; + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Location = new System.Drawing.Point(38, 287); + this.label8.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(62, 18); + this.label8.TabIndex = 10; + this.label8.Text = "Stand:"; + // + // textBox9 + // + this.textBox9.Location = new System.Drawing.Point(205, 318); + this.textBox9.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox9.Name = "textBox9"; + this.textBox9.Size = new System.Drawing.Size(169, 27); + this.textBox9.TabIndex = 13; + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Location = new System.Drawing.Point(38, 323); + this.label9.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(62, 18); + this.label9.TabIndex = 12; + this.label9.Text = "Stand:"; + // + // textBox10 + // + this.textBox10.Location = new System.Drawing.Point(205, 354); + this.textBox10.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox10.Name = "textBox10"; + this.textBox10.Size = new System.Drawing.Size(169, 27); + this.textBox10.TabIndex = 15; + // + // label10 + // + this.label10.AutoSize = true; + this.label10.Location = new System.Drawing.Point(38, 359); + this.label10.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(62, 18); + this.label10.TabIndex = 14; + this.label10.Text = "Stand:"; + // + // textBox11 + // + this.textBox11.Location = new System.Drawing.Point(205, 390); + this.textBox11.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox11.Name = "textBox11"; + this.textBox11.Size = new System.Drawing.Size(169, 27); + this.textBox11.TabIndex = 17; + // + // label11 + // + this.label11.AutoSize = true; + this.label11.Location = new System.Drawing.Point(38, 395); + this.label11.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(62, 18); + this.label11.TabIndex = 16; + this.label11.Text = "Stand:"; + // + // textBox12 + // + this.textBox12.Location = new System.Drawing.Point(205, 426); + this.textBox12.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox12.Name = "textBox12"; + this.textBox12.Size = new System.Drawing.Size(169, 27); + this.textBox12.TabIndex = 19; + // + // label12 + // + this.label12.AutoSize = true; + this.label12.Location = new System.Drawing.Point(38, 431); + this.label12.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label12.Name = "label12"; + this.label12.Size = new System.Drawing.Size(62, 18); + this.label12.TabIndex = 18; + this.label12.Text = "Stand:"; + // + // textBox13 + // + this.textBox13.Location = new System.Drawing.Point(623, 30); + this.textBox13.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox13.Name = "textBox13"; + this.textBox13.Size = new System.Drawing.Size(169, 27); + this.textBox13.TabIndex = 21; + // + // label13 + // + this.label13.AutoSize = true; + this.label13.Location = new System.Drawing.Point(456, 35); + this.label13.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(62, 18); + this.label13.TabIndex = 20; + this.label13.Text = "Stand:"; + // + // textBox14 + // + this.textBox14.Location = new System.Drawing.Point(623, 66); + this.textBox14.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox14.Name = "textBox14"; + this.textBox14.Size = new System.Drawing.Size(169, 27); + this.textBox14.TabIndex = 23; + // + // label14 + // + this.label14.AutoSize = true; + this.label14.Location = new System.Drawing.Point(456, 71); + this.label14.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label14.Name = "label14"; + this.label14.Size = new System.Drawing.Size(62, 18); + this.label14.TabIndex = 22; + this.label14.Text = "Stand:"; + // + // textBox15 + // + this.textBox15.Location = new System.Drawing.Point(623, 102); + this.textBox15.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox15.Name = "textBox15"; + this.textBox15.Size = new System.Drawing.Size(169, 27); + this.textBox15.TabIndex = 25; + // + // label15 + // + this.label15.AutoSize = true; + this.label15.Location = new System.Drawing.Point(456, 107); + this.label15.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label15.Name = "label15"; + this.label15.Size = new System.Drawing.Size(62, 18); + this.label15.TabIndex = 24; + this.label15.Text = "Stand:"; + // + // textBox16 + // + this.textBox16.Location = new System.Drawing.Point(623, 138); + this.textBox16.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox16.Name = "textBox16"; + this.textBox16.Size = new System.Drawing.Size(169, 27); + this.textBox16.TabIndex = 27; + // + // label16 + // + this.label16.AutoSize = true; + this.label16.Location = new System.Drawing.Point(456, 143); + this.label16.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label16.Name = "label16"; + this.label16.Size = new System.Drawing.Size(62, 18); + this.label16.TabIndex = 26; + this.label16.Text = "Stand:"; + // + // textBox17 + // + this.textBox17.Location = new System.Drawing.Point(623, 174); + this.textBox17.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox17.Name = "textBox17"; + this.textBox17.Size = new System.Drawing.Size(169, 27); + this.textBox17.TabIndex = 29; + // + // label17 + // + this.label17.AutoSize = true; + this.label17.Location = new System.Drawing.Point(456, 179); + this.label17.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label17.Name = "label17"; + this.label17.Size = new System.Drawing.Size(62, 18); + this.label17.TabIndex = 28; + this.label17.Text = "Stand:"; + // + // textBox18 + // + this.textBox18.Location = new System.Drawing.Point(623, 210); + this.textBox18.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox18.Name = "textBox18"; + this.textBox18.Size = new System.Drawing.Size(169, 27); + this.textBox18.TabIndex = 31; + // + // label18 + // + this.label18.AutoSize = true; + this.label18.Location = new System.Drawing.Point(456, 215); + this.label18.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label18.Name = "label18"; + this.label18.Size = new System.Drawing.Size(62, 18); + this.label18.TabIndex = 30; + this.label18.Text = "Stand:"; + // + // textBox19 + // + this.textBox19.Location = new System.Drawing.Point(623, 246); + this.textBox19.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox19.Name = "textBox19"; + this.textBox19.Size = new System.Drawing.Size(169, 27); + this.textBox19.TabIndex = 33; + // + // label19 + // + this.label19.AutoSize = true; + this.label19.Location = new System.Drawing.Point(456, 251); + this.label19.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label19.Name = "label19"; + this.label19.Size = new System.Drawing.Size(62, 18); + this.label19.TabIndex = 32; + this.label19.Text = "Stand:"; + // + // textBox20 + // + this.textBox20.Location = new System.Drawing.Point(623, 282); + this.textBox20.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox20.Name = "textBox20"; + this.textBox20.Size = new System.Drawing.Size(169, 27); + this.textBox20.TabIndex = 35; + // + // label20 + // + this.label20.AutoSize = true; + this.label20.Location = new System.Drawing.Point(456, 287); + this.label20.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label20.Name = "label20"; + this.label20.Size = new System.Drawing.Size(62, 18); + this.label20.TabIndex = 34; + this.label20.Text = "Stand:"; + // + // textBox21 + // + this.textBox21.Location = new System.Drawing.Point(623, 318); + this.textBox21.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox21.Name = "textBox21"; + this.textBox21.Size = new System.Drawing.Size(169, 27); + this.textBox21.TabIndex = 37; + // + // label21 + // + this.label21.AutoSize = true; + this.label21.Location = new System.Drawing.Point(456, 323); + this.label21.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label21.Name = "label21"; + this.label21.Size = new System.Drawing.Size(62, 18); + this.label21.TabIndex = 36; + this.label21.Text = "Stand:"; + // + // textBox22 + // + this.textBox22.Location = new System.Drawing.Point(623, 354); + this.textBox22.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox22.Name = "textBox22"; + this.textBox22.Size = new System.Drawing.Size(169, 27); + this.textBox22.TabIndex = 39; + // + // label22 + // + this.label22.AutoSize = true; + this.label22.Location = new System.Drawing.Point(456, 359); + this.label22.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label22.Name = "label22"; + this.label22.Size = new System.Drawing.Size(62, 18); + this.label22.TabIndex = 38; + this.label22.Text = "Stand:"; + // + // textBox23 + // + this.textBox23.Location = new System.Drawing.Point(623, 390); + this.textBox23.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox23.Name = "textBox23"; + this.textBox23.Size = new System.Drawing.Size(169, 27); + this.textBox23.TabIndex = 41; + // + // label23 + // + this.label23.AutoSize = true; + this.label23.Location = new System.Drawing.Point(456, 395); + this.label23.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label23.Name = "label23"; + this.label23.Size = new System.Drawing.Size(62, 18); + this.label23.TabIndex = 40; + this.label23.Text = "Stand:"; + // + // textBox24 + // + this.textBox24.Location = new System.Drawing.Point(623, 426); + this.textBox24.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox24.Name = "textBox24"; + this.textBox24.Size = new System.Drawing.Size(169, 27); + this.textBox24.TabIndex = 43; + // + // label24 + // + this.label24.AutoSize = true; + this.label24.Location = new System.Drawing.Point(456, 431); + this.label24.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label24.Name = "label24"; + this.label24.Size = new System.Drawing.Size(62, 18); + this.label24.TabIndex = 42; + this.label24.Text = "Stand:"; + // + // CycleEndForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 18F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.ClientSize = new System.Drawing.Size(959, 489); + this.Controls.Add(this.textBox24); + this.Controls.Add(this.label24); + this.Controls.Add(this.textBox23); + this.Controls.Add(this.label23); + this.Controls.Add(this.textBox22); + this.Controls.Add(this.label22); + this.Controls.Add(this.textBox21); + this.Controls.Add(this.label21); + this.Controls.Add(this.textBox20); + this.Controls.Add(this.label20); + this.Controls.Add(this.textBox19); + this.Controls.Add(this.label19); + this.Controls.Add(this.textBox18); + this.Controls.Add(this.label18); + this.Controls.Add(this.textBox17); + this.Controls.Add(this.label17); + this.Controls.Add(this.textBox16); + this.Controls.Add(this.label16); + this.Controls.Add(this.textBox15); + this.Controls.Add(this.label15); + this.Controls.Add(this.textBox14); + this.Controls.Add(this.label14); + this.Controls.Add(this.textBox13); + this.Controls.Add(this.label13); + this.Controls.Add(this.textBox12); + this.Controls.Add(this.label12); + this.Controls.Add(this.textBox11); + this.Controls.Add(this.label11); + this.Controls.Add(this.textBox10); + this.Controls.Add(this.label10); + this.Controls.Add(this.textBox9); + this.Controls.Add(this.label9); + this.Controls.Add(this.textBox8); + this.Controls.Add(this.label8); + this.Controls.Add(this.textBox7); + this.Controls.Add(this.label7); + this.Controls.Add(this.textBox6); + this.Controls.Add(this.label6); + this.Controls.Add(this.textBox5); + this.Controls.Add(this.label5); + this.Controls.Add(this.textBox4); + this.Controls.Add(this.label4); + this.Controls.Add(this.textBox3); + this.Controls.Add(this.label3); + this.Controls.Add(this.textBox2); + this.Controls.Add(this.label2); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.label1); + this.Controls.Add(this.okButton); + this.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.Name = "CycleEndForm"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "Daten"; + this.TopMost = true; + this.Load += new System.EventHandler(this.CycleEndForm_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox textBox2; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.TextBox textBox3; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox textBox4; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox textBox5; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.TextBox textBox6; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TextBox textBox7; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.TextBox textBox8; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.TextBox textBox9; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.TextBox textBox10; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.TextBox textBox11; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.TextBox textBox12; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.TextBox textBox13; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.TextBox textBox14; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.TextBox textBox15; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.TextBox textBox16; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.TextBox textBox17; + private System.Windows.Forms.Label label17; + private System.Windows.Forms.TextBox textBox18; + private System.Windows.Forms.Label label18; + private System.Windows.Forms.TextBox textBox19; + private System.Windows.Forms.Label label19; + private System.Windows.Forms.TextBox textBox20; + private System.Windows.Forms.Label label20; + private System.Windows.Forms.TextBox textBox21; + private System.Windows.Forms.Label label21; + private System.Windows.Forms.TextBox textBox22; + private System.Windows.Forms.Label label22; + private System.Windows.Forms.TextBox textBox23; + private System.Windows.Forms.Label label23; + private System.Windows.Forms.TextBox textBox24; + private System.Windows.Forms.Label label24; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/CycleEndForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/CycleEndForm.cs new file mode 100644 index 00000000..cb152493 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/CycleEndForm.cs @@ -0,0 +1,155 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// +using System; +using System.Windows.Forms; +using log4net; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.Standard24 +{ + public partial class CycleEndForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(CycleEndForm)); + + /// Number of text boxes for serial numbers + public readonly int WaterMetersCount; + readonly int lineSize; + + // To be retrieved after the form closes + public string[] EndStateText; + + // Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + int textBoxesCount; + Label[] labels; + TextBox[] textBoxes; + + + /// + /// Constructor + /// + /// Number of text boxes for serial numbers + public CycleEndForm() + { + InitializeComponent(); + ControlBox = false; + + labels = new Label[] + { + label1, label2, label3, label4, label5, label6, label7, label8, label9, label10, + label11, label12, label13, label14, label15, label16, label17, label18, label19, label20, + label21, label22, label23, label24, + }; + textBoxes = new TextBox[] + { + textBox1, textBox2, textBox3, textBox4, textBox5, textBox6, + textBox7, textBox8, textBox9, textBox10, textBox11, textBox12, + textBox13, textBox14, textBox15, textBox16, textBox17, textBox18, + textBox19, textBox20, textBox21, textBox22, textBox23, textBox24, + }; + textBoxesCount = textBoxes.Length; + this.WaterMetersCount = textBoxesCount; + this.lineSize = textBoxesCount / 2; + + completed = false; + StartForceCloseHandler(); + } + + /// Parameterless constructor for 3 watermeters + public CycleEndForm(int waterMetersCount, int lineSize) + : this() + { + this.WaterMetersCount = waterMetersCount; + this.lineSize = lineSize; + ShuffleTextBoxes(waterMetersCount, lineSize); + EndStateText = new string[WaterMetersCount]; + } + + /// + /// 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) + { + if (wmsCount < textBoxesCount && lineSize > 0) + { + int nrLines = (wmsCount + lineSize - 1) / lineSize; + int gap = (textBoxesCount - wmsCount) / nrLines; + + int dest = 0; + for (int l = 0; l < nrLines; l++) + { + for (int i = 0; i < lineSize; i++) + { + labels[dest] = labels[l * lineSize + l * gap + i]; + textBoxes[dest] = textBoxes[l * lineSize + l * gap + i]; + dest++; + } + } + textBoxesCount = wmsCount; + } + } + + private void CycleEndForm_Load(object sender, EventArgs e) + { + Localize(); + + Height = 60 + 36 * lineSize; + + for (int i = 0; i < textBoxesCount; i++) + { + if (i >= WaterMetersCount) + { + labels[i].Visible = false; + textBoxes[i].Visible = false; + } + } + } + + void Localize() + { + Text = Strings.Data; + okButton.Text = Strings.OkBtnText; + + for (int i = 0; i < WaterMetersCount; i++) + { + labels[i].Text = string.Format("{0} {1}:", Strings.Water_Meter, (i + 1).ToString()); + } + } + + private void okButton_Click(object sender, EventArgs e) + { + for (int i = 0; i < WaterMetersCount; i++) + { + EndStateText[i] = textBoxes[i].Text; + } + + completed = true; + 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) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/CycleEndForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/CycleEndForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/CycleEndForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/EntryForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/EntryForm.cs new file mode 100644 index 00000000..594bd590 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/EntryForm.cs @@ -0,0 +1,20 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl.DataEntry.Standard24 +{ + public class EntryForm : EntryFormNoStartEnd, IHasWMStatesForm + { + public EntryForm() + : base() + { + } + + public EntryForm(Generic.IComponentCfg cfg) + : base(cfg) + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/EntryFormCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/EntryFormCfg.cs new file mode 100644 index 00000000..343c173a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/EntryFormCfg.cs @@ -0,0 +1,45 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DataEntry.Standard24 +{ + public class EntryFormCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(EntryFormCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new EntryFormCfgCtrl(); } + + /// + /// Serialized parameters + /// + public bool EnterSerialNrsAtTheEnd; + public bool ShowCycleEndForm; + + /// Private parameterless constructor invoked by all other (public) constructors + EntryFormCfg() + { + Name = "DataEntry-Standard-24"; + ParentName = string.Empty; + EnterSerialNrsAtTheEnd = false; + ShowCycleEndForm = false; + } + + public EntryFormCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, EnterSNsAtTheEnd={1}, ShowEndForm={2}", Name, EnterSerialNrsAtTheEnd, ShowCycleEndForm); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/EntryFormCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/EntryFormCfgCtrl.cs new file mode 100644 index 00000000..a7bce7d2 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/EntryFormCfgCtrl.cs @@ -0,0 +1,83 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.Standard24 +{ + public partial class EntryFormCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + EntryFormCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as EntryFormCfg; + Redraw(); + } + } + + public EntryFormCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Localize(); + Redraw(); + } + + void Localize() + { + enterSNsAtTheEndCheckBox.Text = Strings.Enter_SNs_at_the_end; + showEndStateFormCheckBox.Text = Strings.Show_cycle_end_form; + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + enterSNsAtTheEndCheckBox.Checked = config.EnterSerialNrsAtTheEnd; + showEndStateFormCheckBox.Checked = config.ShowCycleEndForm; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + enterSNsAtTheEndCheckBox.Enabled = true; + showEndStateFormCheckBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.EnterSerialNrsAtTheEnd = enterSNsAtTheEndCheckBox.Checked; + config.ShowCycleEndForm = showEndStateFormCheckBox.Checked; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/EntryFormCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/EntryFormCfgCtrl.designer.cs new file mode 100644 index 00000000..bb7627ab --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/EntryFormCfgCtrl.designer.cs @@ -0,0 +1,114 @@ +/// +/// Copyright (c) 2015-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.Standard24 +{ + partial class EntryFormCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.showEndStateFormCheckBox = new System.Windows.Forms.CheckBox(); + this.enterSNsAtTheEndCheckBox = new System.Windows.Forms.CheckBox(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(99, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(35, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(96, 33); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // showEndStateFormCheckBox + // + this.showEndStateFormCheckBox.AutoSize = true; + this.showEndStateFormCheckBox.Enabled = false; + this.showEndStateFormCheckBox.Location = new System.Drawing.Point(99, 112); + this.showEndStateFormCheckBox.Name = "showEndStateFormCheckBox"; + this.showEndStateFormCheckBox.Size = new System.Drawing.Size(151, 17); + this.showEndStateFormCheckBox.TabIndex = 4; + this.showEndStateFormCheckBox.Text = "Watermeter end state form"; + this.showEndStateFormCheckBox.UseVisualStyleBackColor = true; + // + // enterSNsAtTheEndCheckBox + // + this.enterSNsAtTheEndCheckBox.AutoSize = true; + this.enterSNsAtTheEndCheckBox.Enabled = false; + this.enterSNsAtTheEndCheckBox.Location = new System.Drawing.Point(99, 89); + this.enterSNsAtTheEndCheckBox.Name = "enterSNsAtTheEndCheckBox"; + this.enterSNsAtTheEndCheckBox.Size = new System.Drawing.Size(167, 17); + this.enterSNsAtTheEndCheckBox.TabIndex = 3; + this.enterSNsAtTheEndCheckBox.Text = "Enter serial number at the end"; + this.enterSNsAtTheEndCheckBox.UseVisualStyleBackColor = true; + // + // EntryFormCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.enterSNsAtTheEndCheckBox); + this.Controls.Add(this.showEndStateFormCheckBox); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "EntryFormCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.CheckBox showEndStateFormCheckBox; + private System.Windows.Forms.CheckBox enterSNsAtTheEndCheckBox; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/EntryFormCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/EntryFormCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/EntryFormCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/EntryFormNoStartEnd.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/EntryFormNoStartEnd.cs new file mode 100644 index 00000000..f70fe9b4 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/EntryFormNoStartEnd.cs @@ -0,0 +1,279 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; +using TBF.BenchControl; +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl.DataEntry.Standard24 +{ + public class EntryFormNoStartEnd : ComponentBase, IOperation, IDataEntry, IHasCycleBeginForm, IHasCycleEndForm + { + private static readonly ILog log = LogManager.GetLogger(typeof(EntryFormNoStartEnd)); + public override string ToString() { return string.Format("DataEntry.Standard24({0})", Cfg.ToString(1)); } + + public bool UsesCameras() { return false; } + + readonly EntryFormCfg entryFormCfg; + IRegisterReader[] regReaders; + + /// + /// Properties set by the Begin, End and WMStates form + /// + string purchaseOrder; + public string PurchaseOrder { get { return purchaseOrder; } } + + bool[] disabled; /// This array is shared between forms + + string[] wmCycleEndState; + public string WMCycleEndState(int wmNr) { return (wmNr >= 0 && wmNr < wmCycleEndState.Length) ? wmCycleEndState[wmNr] : string.Empty; } + + double[] wmStartState; + public double WMStartState(int wmNr) { return (wmNr >= 0 && wmNr < wmStartState.Length) ? wmStartState[wmNr] : 0; } + + double[] wmEndState; + public double WMEndState(int wmNr) { return (wmNr >= 0 && wmNr < wmEndState.Length) ? wmEndState[wmNr] : 0; } + + string[] wmStartStateStr; + + + System.Windows.Forms.Form modelessDlg; + + double refVolume; + double errLimLo; + double errLimHi; + + bool resultSaved; /// Set in Run() when results are saved + + Results.Entities.WaterMeter[] waterMeters; /// Reference to ...ProcessData.BatchRslts.WaterMeters[] + + public enum CurrentOp + { + None, + ShowFormAtCycleBeginning, + ShowFormAtCycleEnd, + EnterTestStartStates, + EnterTestEndStates, + } + + CurrentOp currentOp; + + + public EntryFormNoStartEnd() + { + } + + public EntryFormNoStartEnd(Generic.IComponentCfg cfg) + : base(cfg) + { + entryFormCfg = cfg as EntryFormCfg; + + disabled = new bool[Config.Data.WMsCount]; + wmStartState = new double[Config.Data.WMsCount]; + wmStartStateStr = new string[Config.Data.WMsCount]; + wmEndState = new double[Config.Data.WMsCount]; + wmCycleEndState = new string[Config.Data.WMsCount]; + + currentOp = CurrentOp.None; + log.Debug(this.ToString()); + } + + /// Reference to the operation + public IOperation ShowCycleBeginFormOp() + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.ShowFormAtCycleBeginning; + this.waterMeters = TBF.BenchControl.Sequences.ProcessData.BatchRslts.WaterMeters; + return this; + } + + /// Reference to the operation + public IOperation ShowCycleEndFormOp() + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.ShowFormAtCycleEnd; + this.waterMeters = TBF.BenchControl.Sequences.ProcessData.BatchRslts.WaterMeters; + return this; + } + + /// Reference to the operation + public IOperation ShowTestStartFormOp(IRegisterReader[] regReaders) + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.EnterTestStartStates; + this.regReaders = regReaders; + return this; + } + + /// Reference to the operation + public IOperation ShowTestEndFormOp(IRegisterReader[] regReaders, double refVolume, double errLimLo, double errLimHi) + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.EnterTestEndStates; + this.regReaders = regReaders; + this.refVolume = refVolume; + this.errLimLo = errLimLo; + this.errLimHi = errLimHi; + return this; + } + + delegate void EntryFormDlgt(EntryFormNoStartEnd myRef); + /// + void OpenBeginningDlg(EntryFormNoStartEnd myRef) + { + myRef.modelessDlg = new CycleBeginningForm(Config.Data.WMsCount); + modelessDlg.Show(); + } + /// + void OpenEndDlg(EntryFormNoStartEnd myRef) + { + myRef.modelessDlg = new CycleEndForm(Config.Data.WMsCount, Config.Data.LineSize); + modelessDlg.Show(); + } + /// + void OpenTestStartStatesDlg(EntryFormNoStartEnd myRef) + { + myRef.modelessDlg = new TestStartEndForm(myRef.waterMeters.Length, myRef.regReaders, myRef.disabled); + modelessDlg.Show(); + } + /// + void OpenTestEndStatesDlg(EntryFormNoStartEnd myRef) + { + myRef.modelessDlg = new TestStartEndForm(Config.Data.WMsCount, myRef.regReaders, wmStartStateStr, disabled, refVolume, errLimLo, errLimHi); + modelessDlg.Show(); + } + + /// Start this operation + public void Start() + { + resultSaved = false; + switch (currentOp) + { + case CurrentOp.ShowFormAtCycleBeginning: + if (!entryFormCfg.EnterSerialNrsAtTheEnd) + { + Program.MainWnd.Invoke(new EntryFormDlgt(OpenBeginningDlg), this); + } + break; + case CurrentOp.ShowFormAtCycleEnd: + if (entryFormCfg.EnterSerialNrsAtTheEnd) + { + Program.MainWnd.Invoke(new EntryFormDlgt(OpenBeginningDlg), this); + } + else if (entryFormCfg.ShowCycleEndForm) + { + Program.MainWnd.Invoke(new EntryFormDlgt(OpenEndDlg), this); + } + break; + case CurrentOp.EnterTestStartStates: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenTestStartStatesDlg), this); + break; + case CurrentOp.EnterTestEndStates: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenTestEndStatesDlg), this); + break; + } + } + + /// Run this operation + /// Event.ResultsPrinted + public Event Run() + { + if ((modelessDlg is IHasCompleted) && !(modelessDlg as IHasCompleted).Completed) + { + return Event.ModelessFormIsOpen; + } + + if (!resultSaved) /// This is to save the result only once + { + if ((!entryFormCfg.EnterSerialNrsAtTheEnd && currentOp == CurrentOp.ShowFormAtCycleBeginning) || + (entryFormCfg.EnterSerialNrsAtTheEnd && currentOp == CurrentOp.ShowFormAtCycleEnd)) + { + CycleBeginningForm dlg = (modelessDlg as CycleBeginningForm); + if (dlg != null) + { + purchaseOrder = dlg.PurchaseOrder; + + for (int i = 0; i < Math.Min(dlg.WaterMetersCount, waterMeters.Length); i++) + { + if (waterMeters[i] != null) + { + waterMeters[i].SerialNr = dlg.SNText[i]; + disabled[i] = waterMeters[i].Disabled = dlg.Disabled[i]; + } + } + } + } + else if (entryFormCfg.ShowCycleEndForm && currentOp == CurrentOp.ShowFormAtCycleEnd) + { + CycleEndForm dlg = (modelessDlg as CycleEndForm); + int count = waterMeters.Length; + if ((dlg != null) && (count > dlg.WaterMetersCount)) count = dlg.WaterMetersCount; + + for (int i = 0; i < count; i++) + { + if (waterMeters[i] != null) + { + /// In case entryFormCfg.ShowCycleEndForm == false dlg would be null, values would be string.Empty + wmCycleEndState[i] = waterMeters[i].EndState = (dlg != null) ? dlg.EndStateText[i] : string.Empty; + } + } + } + else if (modelessDlg is TestStartEndForm && currentOp == CurrentOp.EnterTestStartStates) + { + /// Fixed start test - start + TestStartEndForm dlg = (modelessDlg as TestStartEndForm); + if (dlg != null) + { + for (int i = 0; i < dlg.WaterMetersCount; i++) + { + wmStartState[i] = dlg.WMStartState[i]; + wmStartStateStr[i] = dlg.WMStartStateStr[i]; + } + } + } + else if (modelessDlg is TestStartEndForm && currentOp == CurrentOp.EnterTestEndStates) + { + /// Fixed start test - end + TestStartEndForm dlg = (modelessDlg as TestStartEndForm); + if (dlg != null) + { + for (int i = 0; i < dlg.WaterMetersCount; i++) + { + wmEndState[i] = dlg.WMEndState[i]; + } + } + } + resultSaved = true; + modelessDlg = null; + } + + return Event.ModelessFormClosed; /// Form closed + } + + /// Stop this operation + public void Stop() + { + if (modelessDlg is IHasCompleted) + { + UiBridge.Bridge.OnCloseModelessForm(this, null); + modelessDlg = null; + } + currentOp = CurrentOp.None; + } + + /// + /// Updates test results with the information collected in watermeters. + /// + /// Test results to be updated with the information + public void UpdateTestResults(Results.BatchResults batchResults) + { + foreach (var wm in batchResults.WaterMeters) + { + if (wm != null && !wm.Disabled) wm.PurchaseOrder = PurchaseOrder; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/Factory.cs new file mode 100644 index 00000000..3c7d2f25 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DataEntry.Standard24 +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return "DataEntry-Standard-24"; } } + + public void ResetStaticProperties() { EntryFormNoStartEnd.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new EntryFormNoStartEnd(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new EntryForm(cfg); } + + public IComponentCfg DefaultConfig() { return new EntryFormCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(EntryFormCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/FactoryNoStartEnd.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/FactoryNoStartEnd.cs new file mode 100644 index 00000000..272d0ff5 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/FactoryNoStartEnd.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DataEntry.Standard24 +{ + public class FactoryNoStartEnd : IComponentFactory + { + public string ClassName { get { return "DataEntry-Standard-24-NoStartEnd"; } } + + public void ResetStaticProperties() { EntryFormNoStartEnd.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new EntryFormNoStartEnd(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new EntryFormNoStartEnd(cfg); } + + public IComponentCfg DefaultConfig() { return new EntryFormCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(EntryFormCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/TestStartEndForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/TestStartEndForm.cs new file mode 100644 index 00000000..655dd6ca --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/TestStartEndForm.cs @@ -0,0 +1,653 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using log4net; +using TBF.BenchControl.GenericDevices; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.Standard24 +{ + public partial class TestStartEndForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(TestStartEndForm)); + + // Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + /// Number of text boxes for serial numbers + public readonly int WaterMetersCount; + readonly IRegisterReader[] regReaders; + readonly bool[] disabled; + + // To be retrieved after the form closes + public double[] WMStartState; + + // To be retrieved after the form closes + public readonly string[] WMStartStateStr; + + // To be retrieved after the form closes + public double[] WMEndState; + + bool endStates; /// false=start states, true=end states + double refVolume; + double warningLimLo; /// limit to display exclamation mark, typically 2x errLimLo + double warningLimHi; /// limit to display exclamation mark, typically 2x errLimHi + + int TextBoxesCount; + /// + Label[] labels; + TextBox[] startTextBoxes; + TextBox[] endTextBoxes; + IList enabledTextBoxes; + + /// + /// Parameterless constructor initializing common part for start and endstate form + /// + public TestStartEndForm() + { + InitializeComponent(); + ControlBox = false; + + TextBoxesCount = 24; + + labels = new Label[] + { + label1, label2, label3, label4, label5, label6, label7, label8, label9, label10, + label11, label12, label13, label14, label15, label16, label17, label18, label19, label20, + label21, label22, label23, label24, + }; + startTextBoxes = new TextBox[] + { + startTextBox1, startTextBox2, startTextBox3, startTextBox4, startTextBox5, startTextBox6, + startTextBox7, startTextBox8, startTextBox9, startTextBox10, startTextBox11, startTextBox12, + startTextBox13, startTextBox14, startTextBox15, startTextBox16, startTextBox17, startTextBox18, + startTextBox19, startTextBox20, startTextBox21, startTextBox22, startTextBox23, startTextBox24, + }; + endTextBoxes = new TextBox[] + { + endTextBox1, endTextBox2, endTextBox3, endTextBox4, endTextBox5, endTextBox6, + endTextBox7, endTextBox8, endTextBox9, endTextBox10, endTextBox11, endTextBox12, + endTextBox13, endTextBox14, endTextBox15, endTextBox16, endTextBox17, endTextBox18, + endTextBox19, endTextBox20, endTextBox21, endTextBox22, endTextBox23, endTextBox24, + }; + enabledTextBoxes = new List(); + + completed = false; + StartForceCloseHandler(); + } + + /// + /// Constructor to fill in start states + /// + /// Number of water meters + /// Information from CycleBeginningForm about availability of water meters + public TestStartEndForm(int waterMetersCount, IRegisterReader[] regReaders, bool[] disabled) + : this() + { + endStates = false; + + this.WaterMetersCount = waterMetersCount; + this.regReaders = regReaders; + this.disabled = disabled; + + ShuffleTextBoxes(); + + WMStartState = new double[waterMetersCount]; + WMStartStateStr = new string[waterMetersCount]; + } + + /// + /// Constructor to fill in end states + /// + /// Number of water meters + /// Information entered on test start + /// Information from CycleBeginningForm about availability of water meters + /// Reference volume, it is used to verify the end state, show/hide exclamation if necessary + /// Error limit low, it is used to verify the end state, show/hide exclamation if necessary + /// Error limit high, it is used to verify the end state, show/hide exclamation if necessary + public TestStartEndForm(int waterMetersCount, IRegisterReader[] regReaders, string[] wmStartStateStr, bool[] disabled, + double refVolume, double errLimLo, double errLimHi) + : this() + { + endStates = true; + + this.WaterMetersCount = waterMetersCount; + this.regReaders = regReaders; + if (wmStartStateStr == null || wmStartStateStr.Length != waterMetersCount) + throw (new Exception("Invalid 'wmStartStateStr' argument")); + this.WMStartStateStr = wmStartStateStr; + this.disabled = disabled; + this.refVolume = refVolume; + this.warningLimLo = 2 * errLimLo; + this.warningLimHi = 2 * errLimHi; + + ShuffleTextBoxes(); + + WMEndState = new double[waterMetersCount]; + } + + /// + /// Make sure the layout of labels/text boxes on the screen + /// corresponds to the layout of watermeters of the test bench. + /// + void ShuffleTextBoxes() + { + if (Config.Data.WMsCount < TextBoxesCount) + { + int nrLines = Config.Data.WMsCount / Config.Data.LineSize; + int gap = (TextBoxesCount - Config.Data.WMsCount) / nrLines; + + int dest = 0; + for (int l = 0; l < nrLines; l++) + { + for (int i = 0; i < Config.Data.LineSize; i++) + { + labels[dest] = labels[l * Config.Data.LineSize + l * gap + i]; + startTextBoxes[dest] = startTextBoxes[l * Config.Data.LineSize + l * gap + i]; + endTextBoxes[dest] = endTextBoxes[l * Config.Data.LineSize + l * gap + i]; + dest++; + } + } + TextBoxesCount = Config.Data.WMsCount; + } + } + + private void CycleEndForm_Load(object sender, EventArgs e) + { + Localize(); + + //Height = 115 + 90 * WaterMetersCount; + + for (int i = 0; i < TextBoxesCount; i++) + { + if (i < WaterMetersCount) + { + labels[i].Visible = startTextBoxes[i].Visible = endTextBoxes[i].Visible = true; + } + } + + if (endStates) + { + for (int i = 0; i < TextBoxesCount; i++) + { + if (WMStartStateStr != null && i < WMStartStateStr.Length) + { + startTextBoxes[i].Text = WMStartStateStr[i]; + } + + if (disabled != null && i < disabled.Length && disabled[i]) + { + endTextBoxes[i].Enabled = false; + } + else + { + endTextBoxes[i].Enabled = true; + enabledTextBoxes.Add(endTextBoxes[i]); + } + } + } + else + { + for (int i = 0; i < TextBoxesCount; i++) + { + if (disabled != null && i < disabled.Length && disabled[i]) + { + startTextBoxes[i].Enabled = false; + } + else + { + startTextBoxes[i].Enabled = true; + enabledTextBoxes.Add(startTextBoxes[i]); + } + } + } + } + + void Localize() + { + Text = Strings.Water_Meter_States; + for (int i = 0; i < TextBoxesCount; i++) + { + labels[i].Text = Strings.Water_Meter + " " + (i + 1).ToString(); + } + startLabel.Text = startLabel2.Text = Strings.Start; + endLabel.Text = endLabel2.Text = Strings.End; + okButton.Text = Strings.OkBtnText; + } + + private void okButton_Click(object sender, EventArgs eArgs) + { + try + { + if (endStates) + { + for (int i = 0; i < Math.Min(WaterMetersCount, TextBoxesCount); i++) + { + if (endTextBoxes[i].Visible && endTextBoxes[i].Enabled) + { + WMEndState[i] = Utils.ParseUDouble(endTextBoxes[i].Text); + } + } + } + else + { + for (int i = 0; i < Math.Min(WaterMetersCount, TextBoxesCount); i++) + { + if (startTextBoxes[i].Visible && startTextBoxes[i].Enabled) + { + WMStartStateStr[i] = startTextBoxes[i].Text; + WMStartState[i] = Utils.ParseUDouble(startTextBoxes[i].Text); + } + } + } + } + catch(Exception e) + { + log.ErrorFormat("Exception: {0}", e.Message); + return; + } + + completed = true; + 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) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + + /// + /// Calculate the approximate error and verify whether it is within limits. + /// Make an exclamation mark visible if out of range. + /// Similar event handler is implemented for all endTextBoxes (1..24). + /// + private void endTextBox1_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox1.Text); + double startState = Utils.ParseUDouble(startTextBox1.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { }; + exclamation1.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox2_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox2.Text); + double startState = Utils.ParseUDouble(startTextBox2.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation2.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox3_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox3.Text); + double startState = Utils.ParseUDouble(startTextBox3.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation3.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox4_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox4.Text); + double startState = Utils.ParseUDouble(startTextBox4.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation4.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox5_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox5.Text); + double startState = Utils.ParseUDouble(startTextBox5.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation5.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox6_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox6.Text); + double startState = Utils.ParseUDouble(startTextBox6.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation6.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox7_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox7.Text); + double startState = Utils.ParseUDouble(startTextBox7.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation7.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox8_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox8.Text); + double startState = Utils.ParseUDouble(startTextBox8.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation8.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox9_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox9.Text); + double startState = Utils.ParseUDouble(startTextBox9.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation9.Visible = (err < warningLimLo) || (warningLimHi < err); + } + + private void endTextBox10_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox10.Text); + double startState = Utils.ParseUDouble(startTextBox10.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation10.Visible = (err < warningLimLo) || (warningLimHi < err); + } + + private void endTextBox11_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox11.Text); + double startState = Utils.ParseUDouble(startTextBox11.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation11.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox12_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox12.Text); + double startState = Utils.ParseUDouble(startTextBox12.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation12.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox13_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox13.Text); + double startState = Utils.ParseUDouble(startTextBox13.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation13.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox14_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox14.Text); + double startState = Utils.ParseUDouble(startTextBox14.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation14.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox15_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox15.Text); + double startState = Utils.ParseUDouble(startTextBox15.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation15.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox16_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox16.Text); + double startState = Utils.ParseUDouble(startTextBox16.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation16.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox17_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox17.Text); + double startState = Utils.ParseUDouble(startTextBox17.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation17.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox18_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox18.Text); + double startState = Utils.ParseUDouble(startTextBox18.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation18.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox19_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox19.Text); + double startState = Utils.ParseUDouble(startTextBox19.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation19.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox20_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox20.Text); + double startState = Utils.ParseUDouble(startTextBox20.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation20.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox21_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox21.Text); + double startState = Utils.ParseUDouble(startTextBox21.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation21.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox22_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox22.Text); + double startState = Utils.ParseUDouble(startTextBox22.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation22.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox23_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox23.Text); + double startState = Utils.ParseUDouble(startTextBox23.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation23.Visible = (err < warningLimLo) || (warningLimHi < err); + } + private void endTextBox24_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endTextBox24.Text); + double startState = Utils.ParseUDouble(startTextBox24.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation24.Visible = (err < warningLimLo) || (warningLimHi < err); + } + + /// + /// Process a key press within any enabled text boxe + /// + /// + /// + /// TextBox control which received the event + private void ProcKeyPress(object sender, KeyPressEventArgs e, TextBox currentFocusOwner) + { + if (e.KeyChar == '+') + { + /// Process '+' key ..... Form completed + okButton_Click(sender, e); + } + if (e.KeyChar == '\r') + { + /// Process key ..... Next text field + if (enabledTextBoxes.Count < 2) return; /// There is just one enabled textbox + + for (int i = 0; i < enabledTextBoxes.Count; i++) + { + if (enabledTextBoxes[i] == currentFocusOwner) + { + /// Change focus to the next enabled text box + enabledTextBoxes[(i + 1) % enabledTextBoxes.Count].Focus(); + return; + } + } + } + } + + private void startTextBox1_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox1); } + private void startTextBox2_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox2); } + private void startTextBox3_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox3); } + private void startTextBox4_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox4); } + private void startTextBox5_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox5); } + private void startTextBox6_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox6); } + private void startTextBox7_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox7); } + private void startTextBox8_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox8); } + private void startTextBox9_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox9); } + private void startTextBox10_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox10); } + private void startTextBox11_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox11); } + private void startTextBox12_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox12); } + private void startTextBox13_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox13); } + private void startTextBox14_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox14); } + private void startTextBox15_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox15); } + private void startTextBox16_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox16); } + private void startTextBox17_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox17); } + private void startTextBox18_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox18); } + private void startTextBox19_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox19); } + private void startTextBox20_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox20); } + private void startTextBox21_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox21); } + private void startTextBox22_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox22); } + private void startTextBox23_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox23); } + private void startTextBox24_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox24); } + + private void endTextBox1_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox1); } + private void endTextBox2_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox2); } + private void endTextBox3_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox3); } + private void endTextBox4_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox4); } + private void endTextBox5_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox5); } + private void endTextBox6_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox6); } + private void endTextBox7_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox7); } + private void endTextBox8_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox8); } + private void endTextBox9_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox9); } + private void endTextBox10_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox10); } + private void endTextBox11_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox11); } + private void endTextBox12_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox12); } + private void endTextBox13_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox13); } + private void endTextBox14_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox14); } + private void endTextBox15_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox15); } + private void endTextBox16_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox16); } + private void endTextBox17_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox17); } + private void endTextBox18_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox18); } + private void endTextBox19_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox19); } + private void endTextBox20_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox20); } + private void endTextBox21_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox21); } + private void endTextBox22_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox22); } + private void endTextBox23_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox23); } + private void endTextBox24_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox24); } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/TestStartEndForm.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/TestStartEndForm.designer.cs new file mode 100644 index 00000000..9441a0ff --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/TestStartEndForm.designer.cs @@ -0,0 +1,1516 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.Standard24 +{ + partial class TestStartEndForm + { + /// + /// 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() + { + this.exclamation1 = new System.Windows.Forms.Label(); + this.startTextBox1 = new System.Windows.Forms.TextBox(); + this.endTextBox1 = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.okButton = new System.Windows.Forms.Button(); + this.exclamation3 = new System.Windows.Forms.Label(); + this.startTextBox3 = new System.Windows.Forms.TextBox(); + this.endTextBox3 = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.exclamation4 = new System.Windows.Forms.Label(); + this.startTextBox4 = new System.Windows.Forms.TextBox(); + this.endTextBox4 = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.exclamation5 = new System.Windows.Forms.Label(); + this.startTextBox5 = new System.Windows.Forms.TextBox(); + this.endTextBox5 = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.exclamation6 = new System.Windows.Forms.Label(); + this.startTextBox6 = new System.Windows.Forms.TextBox(); + this.endTextBox6 = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.startLabel = new System.Windows.Forms.Label(); + this.endLabel = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.endTextBox2 = new System.Windows.Forms.TextBox(); + this.startTextBox2 = new System.Windows.Forms.TextBox(); + this.exclamation2 = new System.Windows.Forms.Label(); + this.exclamation7 = new System.Windows.Forms.Label(); + this.startTextBox7 = new System.Windows.Forms.TextBox(); + this.endTextBox7 = new System.Windows.Forms.TextBox(); + this.label7 = new System.Windows.Forms.Label(); + this.exclamation8 = new System.Windows.Forms.Label(); + this.startTextBox8 = new System.Windows.Forms.TextBox(); + this.endTextBox8 = new System.Windows.Forms.TextBox(); + this.label8 = new System.Windows.Forms.Label(); + this.exclamation9 = new System.Windows.Forms.Label(); + this.startTextBox9 = new System.Windows.Forms.TextBox(); + this.endTextBox9 = new System.Windows.Forms.TextBox(); + this.label9 = new System.Windows.Forms.Label(); + this.exclamation10 = new System.Windows.Forms.Label(); + this.startTextBox10 = new System.Windows.Forms.TextBox(); + this.endTextBox10 = new System.Windows.Forms.TextBox(); + this.label10 = new System.Windows.Forms.Label(); + this.exclamation11 = new System.Windows.Forms.Label(); + this.startTextBox11 = new System.Windows.Forms.TextBox(); + this.endTextBox11 = new System.Windows.Forms.TextBox(); + this.label11 = new System.Windows.Forms.Label(); + this.exclamation12 = new System.Windows.Forms.Label(); + this.startTextBox12 = new System.Windows.Forms.TextBox(); + this.endTextBox12 = new System.Windows.Forms.TextBox(); + this.label12 = new System.Windows.Forms.Label(); + this.exclamation24 = new System.Windows.Forms.Label(); + this.startTextBox24 = new System.Windows.Forms.TextBox(); + this.endTextBox24 = new System.Windows.Forms.TextBox(); + this.label24 = new System.Windows.Forms.Label(); + this.exclamation23 = new System.Windows.Forms.Label(); + this.startTextBox23 = new System.Windows.Forms.TextBox(); + this.endTextBox23 = new System.Windows.Forms.TextBox(); + this.label23 = new System.Windows.Forms.Label(); + this.exclamation22 = new System.Windows.Forms.Label(); + this.startTextBox22 = new System.Windows.Forms.TextBox(); + this.endTextBox22 = new System.Windows.Forms.TextBox(); + this.label22 = new System.Windows.Forms.Label(); + this.exclamation21 = new System.Windows.Forms.Label(); + this.startTextBox21 = new System.Windows.Forms.TextBox(); + this.endTextBox21 = new System.Windows.Forms.TextBox(); + this.label21 = new System.Windows.Forms.Label(); + this.exclamation20 = new System.Windows.Forms.Label(); + this.startTextBox20 = new System.Windows.Forms.TextBox(); + this.endTextBox20 = new System.Windows.Forms.TextBox(); + this.label20 = new System.Windows.Forms.Label(); + this.exclamation19 = new System.Windows.Forms.Label(); + this.startTextBox19 = new System.Windows.Forms.TextBox(); + this.endTextBox19 = new System.Windows.Forms.TextBox(); + this.label19 = new System.Windows.Forms.Label(); + this.exclamation18 = new System.Windows.Forms.Label(); + this.exclamation17 = new System.Windows.Forms.Label(); + this.startTextBox18 = new System.Windows.Forms.TextBox(); + this.exclamation16 = new System.Windows.Forms.Label(); + this.endTextBox18 = new System.Windows.Forms.TextBox(); + this.label18 = new System.Windows.Forms.Label(); + this.startTextBox17 = new System.Windows.Forms.TextBox(); + this.exclamation15 = new System.Windows.Forms.Label(); + this.endTextBox17 = new System.Windows.Forms.TextBox(); + this.label17 = new System.Windows.Forms.Label(); + this.startTextBox16 = new System.Windows.Forms.TextBox(); + this.exclamation14 = new System.Windows.Forms.Label(); + this.endTextBox16 = new System.Windows.Forms.TextBox(); + this.label16 = new System.Windows.Forms.Label(); + this.startTextBox15 = new System.Windows.Forms.TextBox(); + this.exclamation13 = new System.Windows.Forms.Label(); + this.endTextBox15 = new System.Windows.Forms.TextBox(); + this.label15 = new System.Windows.Forms.Label(); + this.startTextBox14 = new System.Windows.Forms.TextBox(); + this.endLabel2 = new System.Windows.Forms.Label(); + this.endTextBox14 = new System.Windows.Forms.TextBox(); + this.label14 = new System.Windows.Forms.Label(); + this.startTextBox13 = new System.Windows.Forms.TextBox(); + this.startLabel2 = new System.Windows.Forms.Label(); + this.endTextBox13 = new System.Windows.Forms.TextBox(); + this.label13 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // exclamation1 + // + this.exclamation1.AutoSize = true; + this.exclamation1.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation1.ForeColor = System.Drawing.Color.Red; + this.exclamation1.Location = new System.Drawing.Point(547, 56); + this.exclamation1.Name = "exclamation1"; + this.exclamation1.Size = new System.Drawing.Size(30, 38); + this.exclamation1.TabIndex = 5; + this.exclamation1.Text = "!"; + this.exclamation1.Visible = false; + // + // startTextBox1 + // + this.startTextBox1.Enabled = false; + this.startTextBox1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox1.Location = new System.Drawing.Point(200, 60); + this.startTextBox1.Name = "startTextBox1"; + this.startTextBox1.Size = new System.Drawing.Size(163, 31); + this.startTextBox1.TabIndex = 3; + this.startTextBox1.Visible = false; + this.startTextBox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox1_KeyPress); + // + // endTextBox1 + // + this.endTextBox1.Enabled = false; + this.endTextBox1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox1.Location = new System.Drawing.Point(382, 60); + this.endTextBox1.Name = "endTextBox1"; + this.endTextBox1.Size = new System.Drawing.Size(163, 31); + this.endTextBox1.TabIndex = 4; + this.endTextBox1.Visible = false; + this.endTextBox1.TextChanged += new System.EventHandler(this.endTextBox1_TextChanged); + this.endTextBox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox1_KeyPress); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label1.Location = new System.Drawing.Point(23, 63); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(145, 23); + this.label1.TabIndex = 2; + this.label1.Text = "Water Meter 1"; + this.label1.Visible = false; + // + // okButton + // + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(1159, 60); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(98, 63); + this.okButton.TabIndex = 100; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // exclamation3 + // + this.exclamation3.AutoSize = true; + this.exclamation3.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation3.ForeColor = System.Drawing.Color.Red; + this.exclamation3.Location = new System.Drawing.Point(547, 144); + this.exclamation3.Name = "exclamation3"; + this.exclamation3.Size = new System.Drawing.Size(30, 38); + this.exclamation3.TabIndex = 13; + this.exclamation3.Text = "!"; + this.exclamation3.Visible = false; + // + // startTextBox3 + // + this.startTextBox3.Enabled = false; + this.startTextBox3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox3.Location = new System.Drawing.Point(200, 148); + this.startTextBox3.Name = "startTextBox3"; + this.startTextBox3.Size = new System.Drawing.Size(163, 31); + this.startTextBox3.TabIndex = 11; + this.startTextBox3.Visible = false; + this.startTextBox3.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox3_KeyPress); + // + // endTextBox3 + // + this.endTextBox3.Enabled = false; + this.endTextBox3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox3.Location = new System.Drawing.Point(382, 148); + this.endTextBox3.Name = "endTextBox3"; + this.endTextBox3.Size = new System.Drawing.Size(163, 31); + this.endTextBox3.TabIndex = 12; + this.endTextBox3.Visible = false; + this.endTextBox3.TextChanged += new System.EventHandler(this.endTextBox3_TextChanged); + this.endTextBox3.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox3_KeyPress); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label3.Location = new System.Drawing.Point(23, 151); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(145, 23); + this.label3.TabIndex = 10; + this.label3.Text = "Water Meter 3"; + this.label3.Visible = false; + // + // exclamation4 + // + this.exclamation4.AutoSize = true; + this.exclamation4.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation4.ForeColor = System.Drawing.Color.Red; + this.exclamation4.Location = new System.Drawing.Point(547, 188); + this.exclamation4.Name = "exclamation4"; + this.exclamation4.Size = new System.Drawing.Size(30, 38); + this.exclamation4.TabIndex = 17; + this.exclamation4.Text = "!"; + this.exclamation4.Visible = false; + // + // startTextBox4 + // + this.startTextBox4.Enabled = false; + this.startTextBox4.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox4.Location = new System.Drawing.Point(200, 192); + this.startTextBox4.Name = "startTextBox4"; + this.startTextBox4.Size = new System.Drawing.Size(163, 31); + this.startTextBox4.TabIndex = 15; + this.startTextBox4.Visible = false; + this.startTextBox4.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox4_KeyPress); + // + // endTextBox4 + // + this.endTextBox4.Enabled = false; + this.endTextBox4.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox4.Location = new System.Drawing.Point(382, 192); + this.endTextBox4.Name = "endTextBox4"; + this.endTextBox4.Size = new System.Drawing.Size(163, 31); + this.endTextBox4.TabIndex = 16; + this.endTextBox4.Visible = false; + this.endTextBox4.TextChanged += new System.EventHandler(this.endTextBox4_TextChanged); + this.endTextBox4.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox4_KeyPress); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label4.Location = new System.Drawing.Point(23, 195); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(145, 23); + this.label4.TabIndex = 14; + this.label4.Text = "Water Meter 4"; + this.label4.Visible = false; + // + // exclamation5 + // + this.exclamation5.AutoSize = true; + this.exclamation5.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation5.ForeColor = System.Drawing.Color.Red; + this.exclamation5.Location = new System.Drawing.Point(547, 232); + this.exclamation5.Name = "exclamation5"; + this.exclamation5.Size = new System.Drawing.Size(30, 38); + this.exclamation5.TabIndex = 21; + this.exclamation5.Text = "!"; + this.exclamation5.Visible = false; + // + // startTextBox5 + // + this.startTextBox5.Enabled = false; + this.startTextBox5.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox5.Location = new System.Drawing.Point(200, 236); + this.startTextBox5.Name = "startTextBox5"; + this.startTextBox5.Size = new System.Drawing.Size(163, 31); + this.startTextBox5.TabIndex = 19; + this.startTextBox5.Visible = false; + this.startTextBox5.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox5_KeyPress); + // + // endTextBox5 + // + this.endTextBox5.Enabled = false; + this.endTextBox5.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox5.Location = new System.Drawing.Point(382, 236); + this.endTextBox5.Name = "endTextBox5"; + this.endTextBox5.Size = new System.Drawing.Size(163, 31); + this.endTextBox5.TabIndex = 20; + this.endTextBox5.Visible = false; + this.endTextBox5.TextChanged += new System.EventHandler(this.endTextBox5_TextChanged); + this.endTextBox5.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox5_KeyPress); + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label5.Location = new System.Drawing.Point(23, 239); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(145, 23); + this.label5.TabIndex = 18; + this.label5.Text = "Water Meter 5"; + this.label5.Visible = false; + // + // exclamation6 + // + this.exclamation6.AutoSize = true; + this.exclamation6.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation6.ForeColor = System.Drawing.Color.Red; + this.exclamation6.Location = new System.Drawing.Point(547, 276); + this.exclamation6.Name = "exclamation6"; + this.exclamation6.Size = new System.Drawing.Size(30, 38); + this.exclamation6.TabIndex = 25; + this.exclamation6.Text = "!"; + this.exclamation6.Visible = false; + // + // startTextBox6 + // + this.startTextBox6.Enabled = false; + this.startTextBox6.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox6.Location = new System.Drawing.Point(200, 280); + this.startTextBox6.Name = "startTextBox6"; + this.startTextBox6.Size = new System.Drawing.Size(163, 31); + this.startTextBox6.TabIndex = 23; + this.startTextBox6.Visible = false; + this.startTextBox6.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox6_KeyPress); + // + // endTextBox6 + // + this.endTextBox6.Enabled = false; + this.endTextBox6.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox6.Location = new System.Drawing.Point(382, 280); + this.endTextBox6.Name = "endTextBox6"; + this.endTextBox6.Size = new System.Drawing.Size(163, 31); + this.endTextBox6.TabIndex = 24; + this.endTextBox6.Visible = false; + this.endTextBox6.TextChanged += new System.EventHandler(this.endTextBox6_TextChanged); + this.endTextBox6.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox6_KeyPress); + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label6.Location = new System.Drawing.Point(23, 283); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(145, 23); + this.label6.TabIndex = 22; + this.label6.Text = "Water Meter 6"; + this.label6.Visible = false; + // + // startLabel + // + this.startLabel.AutoSize = true; + this.startLabel.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startLabel.Location = new System.Drawing.Point(252, 21); + this.startLabel.Name = "startLabel"; + this.startLabel.Size = new System.Drawing.Size(56, 23); + this.startLabel.TabIndex = 0; + this.startLabel.Text = "Start"; + // + // endLabel + // + this.endLabel.AutoSize = true; + this.endLabel.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endLabel.Location = new System.Drawing.Point(438, 21); + this.endLabel.Name = "endLabel"; + this.endLabel.Size = new System.Drawing.Size(46, 23); + this.endLabel.TabIndex = 1; + this.endLabel.Text = "End"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label2.Location = new System.Drawing.Point(23, 107); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(145, 23); + this.label2.TabIndex = 6; + this.label2.Text = "Water Meter 2"; + this.label2.Visible = false; + // + // endTextBox2 + // + this.endTextBox2.Enabled = false; + this.endTextBox2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox2.Location = new System.Drawing.Point(382, 104); + this.endTextBox2.Name = "endTextBox2"; + this.endTextBox2.Size = new System.Drawing.Size(163, 31); + this.endTextBox2.TabIndex = 8; + this.endTextBox2.Visible = false; + this.endTextBox2.TextChanged += new System.EventHandler(this.endTextBox2_TextChanged); + this.endTextBox2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox2_KeyPress); + // + // startTextBox2 + // + this.startTextBox2.Enabled = false; + this.startTextBox2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox2.Location = new System.Drawing.Point(200, 104); + this.startTextBox2.Name = "startTextBox2"; + this.startTextBox2.Size = new System.Drawing.Size(163, 31); + this.startTextBox2.TabIndex = 7; + this.startTextBox2.Visible = false; + this.startTextBox2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox2_KeyPress); + // + // exclamation2 + // + this.exclamation2.AutoSize = true; + this.exclamation2.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation2.ForeColor = System.Drawing.Color.Red; + this.exclamation2.Location = new System.Drawing.Point(547, 100); + this.exclamation2.Name = "exclamation2"; + this.exclamation2.Size = new System.Drawing.Size(30, 38); + this.exclamation2.TabIndex = 9; + this.exclamation2.Text = "!"; + this.exclamation2.Visible = false; + // + // exclamation7 + // + this.exclamation7.AutoSize = true; + this.exclamation7.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation7.ForeColor = System.Drawing.Color.Red; + this.exclamation7.Location = new System.Drawing.Point(547, 320); + this.exclamation7.Name = "exclamation7"; + this.exclamation7.Size = new System.Drawing.Size(30, 38); + this.exclamation7.TabIndex = 29; + this.exclamation7.Text = "!"; + this.exclamation7.Visible = false; + // + // startTextBox7 + // + this.startTextBox7.Enabled = false; + this.startTextBox7.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox7.Location = new System.Drawing.Point(200, 324); + this.startTextBox7.Name = "startTextBox7"; + this.startTextBox7.Size = new System.Drawing.Size(163, 31); + this.startTextBox7.TabIndex = 27; + this.startTextBox7.Visible = false; + this.startTextBox7.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox7_KeyPress); + // + // endTextBox7 + // + this.endTextBox7.Enabled = false; + this.endTextBox7.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox7.Location = new System.Drawing.Point(382, 324); + this.endTextBox7.Name = "endTextBox7"; + this.endTextBox7.Size = new System.Drawing.Size(163, 31); + this.endTextBox7.TabIndex = 28; + this.endTextBox7.Visible = false; + this.endTextBox7.TextChanged += new System.EventHandler(this.endTextBox7_TextChanged); + this.endTextBox7.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox7_KeyPress); + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label7.Location = new System.Drawing.Point(23, 327); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(145, 23); + this.label7.TabIndex = 26; + this.label7.Text = "Water Meter 7"; + this.label7.Visible = false; + // + // exclamation8 + // + this.exclamation8.AutoSize = true; + this.exclamation8.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation8.ForeColor = System.Drawing.Color.Red; + this.exclamation8.Location = new System.Drawing.Point(547, 364); + this.exclamation8.Name = "exclamation8"; + this.exclamation8.Size = new System.Drawing.Size(30, 38); + this.exclamation8.TabIndex = 33; + this.exclamation8.Text = "!"; + this.exclamation8.Visible = false; + // + // startTextBox8 + // + this.startTextBox8.Enabled = false; + this.startTextBox8.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox8.Location = new System.Drawing.Point(200, 368); + this.startTextBox8.Name = "startTextBox8"; + this.startTextBox8.Size = new System.Drawing.Size(163, 31); + this.startTextBox8.TabIndex = 31; + this.startTextBox8.Visible = false; + this.startTextBox8.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox8_KeyPress); + // + // endTextBox8 + // + this.endTextBox8.Enabled = false; + this.endTextBox8.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox8.Location = new System.Drawing.Point(382, 368); + this.endTextBox8.Name = "endTextBox8"; + this.endTextBox8.Size = new System.Drawing.Size(163, 31); + this.endTextBox8.TabIndex = 32; + this.endTextBox8.Visible = false; + this.endTextBox8.TextChanged += new System.EventHandler(this.endTextBox8_TextChanged); + this.endTextBox8.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox8_KeyPress); + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label8.Location = new System.Drawing.Point(23, 371); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(145, 23); + this.label8.TabIndex = 30; + this.label8.Text = "Water Meter 8"; + this.label8.Visible = false; + // + // exclamation9 + // + this.exclamation9.AutoSize = true; + this.exclamation9.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation9.ForeColor = System.Drawing.Color.Red; + this.exclamation9.Location = new System.Drawing.Point(547, 408); + this.exclamation9.Name = "exclamation9"; + this.exclamation9.Size = new System.Drawing.Size(30, 38); + this.exclamation9.TabIndex = 37; + this.exclamation9.Text = "!"; + this.exclamation9.Visible = false; + // + // startTextBox9 + // + this.startTextBox9.Enabled = false; + this.startTextBox9.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox9.Location = new System.Drawing.Point(200, 412); + this.startTextBox9.Name = "startTextBox9"; + this.startTextBox9.Size = new System.Drawing.Size(163, 31); + this.startTextBox9.TabIndex = 35; + this.startTextBox9.Visible = false; + this.startTextBox9.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox9_KeyPress); + // + // endTextBox9 + // + this.endTextBox9.Enabled = false; + this.endTextBox9.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox9.Location = new System.Drawing.Point(382, 412); + this.endTextBox9.Name = "endTextBox9"; + this.endTextBox9.Size = new System.Drawing.Size(163, 31); + this.endTextBox9.TabIndex = 36; + this.endTextBox9.Visible = false; + this.endTextBox9.TextChanged += new System.EventHandler(this.endTextBox9_TextChanged); + this.endTextBox9.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox9_KeyPress); + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label9.Location = new System.Drawing.Point(23, 415); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(145, 23); + this.label9.TabIndex = 34; + this.label9.Text = "Water Meter 9"; + this.label9.Visible = false; + // + // exclamation10 + // + this.exclamation10.AutoSize = true; + this.exclamation10.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation10.ForeColor = System.Drawing.Color.Red; + this.exclamation10.Location = new System.Drawing.Point(547, 452); + this.exclamation10.Name = "exclamation10"; + this.exclamation10.Size = new System.Drawing.Size(30, 38); + this.exclamation10.TabIndex = 41; + this.exclamation10.Text = "!"; + this.exclamation10.Visible = false; + // + // startTextBox10 + // + this.startTextBox10.Enabled = false; + this.startTextBox10.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox10.Location = new System.Drawing.Point(200, 456); + this.startTextBox10.Name = "startTextBox10"; + this.startTextBox10.Size = new System.Drawing.Size(163, 31); + this.startTextBox10.TabIndex = 39; + this.startTextBox10.Visible = false; + this.startTextBox10.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox10_KeyPress); + // + // endTextBox10 + // + this.endTextBox10.Enabled = false; + this.endTextBox10.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox10.Location = new System.Drawing.Point(382, 456); + this.endTextBox10.Name = "endTextBox10"; + this.endTextBox10.Size = new System.Drawing.Size(163, 31); + this.endTextBox10.TabIndex = 40; + this.endTextBox10.Visible = false; + this.endTextBox10.TextChanged += new System.EventHandler(this.endTextBox10_TextChanged); + this.endTextBox10.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox10_KeyPress); + // + // label10 + // + this.label10.AutoSize = true; + this.label10.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label10.Location = new System.Drawing.Point(23, 459); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(157, 23); + this.label10.TabIndex = 38; + this.label10.Text = "Water Meter 10"; + this.label10.Visible = false; + // + // exclamation11 + // + this.exclamation11.AutoSize = true; + this.exclamation11.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation11.ForeColor = System.Drawing.Color.Red; + this.exclamation11.Location = new System.Drawing.Point(547, 496); + this.exclamation11.Name = "exclamation11"; + this.exclamation11.Size = new System.Drawing.Size(30, 38); + this.exclamation11.TabIndex = 45; + this.exclamation11.Text = "!"; + this.exclamation11.Visible = false; + // + // startTextBox11 + // + this.startTextBox11.Enabled = false; + this.startTextBox11.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox11.Location = new System.Drawing.Point(200, 500); + this.startTextBox11.Name = "startTextBox11"; + this.startTextBox11.Size = new System.Drawing.Size(163, 31); + this.startTextBox11.TabIndex = 43; + this.startTextBox11.Visible = false; + this.startTextBox11.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox11_KeyPress); + // + // endTextBox11 + // + this.endTextBox11.Enabled = false; + this.endTextBox11.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox11.Location = new System.Drawing.Point(382, 500); + this.endTextBox11.Name = "endTextBox11"; + this.endTextBox11.Size = new System.Drawing.Size(163, 31); + this.endTextBox11.TabIndex = 44; + this.endTextBox11.Visible = false; + this.endTextBox11.TextChanged += new System.EventHandler(this.endTextBox11_TextChanged); + this.endTextBox11.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox11_KeyPress); + // + // label11 + // + this.label11.AutoSize = true; + this.label11.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label11.Location = new System.Drawing.Point(23, 503); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(157, 23); + this.label11.TabIndex = 42; + this.label11.Text = "Water Meter 11"; + this.label11.Visible = false; + // + // exclamation12 + // + this.exclamation12.AutoSize = true; + this.exclamation12.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation12.ForeColor = System.Drawing.Color.Red; + this.exclamation12.Location = new System.Drawing.Point(547, 540); + this.exclamation12.Name = "exclamation12"; + this.exclamation12.Size = new System.Drawing.Size(30, 38); + this.exclamation12.TabIndex = 49; + this.exclamation12.Text = "!"; + this.exclamation12.Visible = false; + // + // startTextBox12 + // + this.startTextBox12.Enabled = false; + this.startTextBox12.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox12.Location = new System.Drawing.Point(200, 544); + this.startTextBox12.Name = "startTextBox12"; + this.startTextBox12.Size = new System.Drawing.Size(163, 31); + this.startTextBox12.TabIndex = 47; + this.startTextBox12.Visible = false; + this.startTextBox12.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox12_KeyPress); + // + // endTextBox12 + // + this.endTextBox12.Enabled = false; + this.endTextBox12.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox12.Location = new System.Drawing.Point(382, 544); + this.endTextBox12.Name = "endTextBox12"; + this.endTextBox12.Size = new System.Drawing.Size(163, 31); + this.endTextBox12.TabIndex = 48; + this.endTextBox12.Visible = false; + this.endTextBox12.TextChanged += new System.EventHandler(this.endTextBox12_TextChanged); + this.endTextBox12.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox12_KeyPress); + // + // label12 + // + this.label12.AutoSize = true; + this.label12.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label12.Location = new System.Drawing.Point(23, 547); + this.label12.Name = "label12"; + this.label12.Size = new System.Drawing.Size(157, 23); + this.label12.TabIndex = 46; + this.label12.Text = "Water Meter 12"; + this.label12.Visible = false; + // + // exclamation24 + // + this.exclamation24.AutoSize = true; + this.exclamation24.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation24.ForeColor = System.Drawing.Color.Red; + this.exclamation24.Location = new System.Drawing.Point(1116, 540); + this.exclamation24.Name = "exclamation24"; + this.exclamation24.Size = new System.Drawing.Size(30, 38); + this.exclamation24.TabIndex = 99; + this.exclamation24.Text = "!"; + this.exclamation24.Visible = false; + // + // startTextBox24 + // + this.startTextBox24.Enabled = false; + this.startTextBox24.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox24.Location = new System.Drawing.Point(769, 544); + this.startTextBox24.Name = "startTextBox24"; + this.startTextBox24.Size = new System.Drawing.Size(163, 31); + this.startTextBox24.TabIndex = 97; + this.startTextBox24.Visible = false; + this.startTextBox24.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox24_KeyPress); + // + // endTextBox24 + // + this.endTextBox24.Enabled = false; + this.endTextBox24.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox24.Location = new System.Drawing.Point(951, 544); + this.endTextBox24.Name = "endTextBox24"; + this.endTextBox24.Size = new System.Drawing.Size(163, 31); + this.endTextBox24.TabIndex = 98; + this.endTextBox24.Visible = false; + this.endTextBox24.TextChanged += new System.EventHandler(this.endTextBox24_TextChanged); + this.endTextBox24.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox24_KeyPress); + // + // label24 + // + this.label24.AutoSize = true; + this.label24.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label24.Location = new System.Drawing.Point(592, 547); + this.label24.Name = "label24"; + this.label24.Size = new System.Drawing.Size(157, 23); + this.label24.TabIndex = 96; + this.label24.Text = "Water Meter 24"; + this.label24.Visible = false; + // + // exclamation23 + // + this.exclamation23.AutoSize = true; + this.exclamation23.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation23.ForeColor = System.Drawing.Color.Red; + this.exclamation23.Location = new System.Drawing.Point(1116, 496); + this.exclamation23.Name = "exclamation23"; + this.exclamation23.Size = new System.Drawing.Size(30, 38); + this.exclamation23.TabIndex = 95; + this.exclamation23.Text = "!"; + this.exclamation23.Visible = false; + // + // startTextBox23 + // + this.startTextBox23.Enabled = false; + this.startTextBox23.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox23.Location = new System.Drawing.Point(769, 500); + this.startTextBox23.Name = "startTextBox23"; + this.startTextBox23.Size = new System.Drawing.Size(163, 31); + this.startTextBox23.TabIndex = 93; + this.startTextBox23.Visible = false; + this.startTextBox23.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox23_KeyPress); + // + // endTextBox23 + // + this.endTextBox23.Enabled = false; + this.endTextBox23.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox23.Location = new System.Drawing.Point(951, 500); + this.endTextBox23.Name = "endTextBox23"; + this.endTextBox23.Size = new System.Drawing.Size(163, 31); + this.endTextBox23.TabIndex = 94; + this.endTextBox23.Visible = false; + this.endTextBox23.TextChanged += new System.EventHandler(this.endTextBox23_TextChanged); + this.endTextBox23.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox23_KeyPress); + // + // label23 + // + this.label23.AutoSize = true; + this.label23.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label23.Location = new System.Drawing.Point(592, 503); + this.label23.Name = "label23"; + this.label23.Size = new System.Drawing.Size(157, 23); + this.label23.TabIndex = 92; + this.label23.Text = "Water Meter 23"; + this.label23.Visible = false; + // + // exclamation22 + // + this.exclamation22.AutoSize = true; + this.exclamation22.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation22.ForeColor = System.Drawing.Color.Red; + this.exclamation22.Location = new System.Drawing.Point(1116, 452); + this.exclamation22.Name = "exclamation22"; + this.exclamation22.Size = new System.Drawing.Size(30, 38); + this.exclamation22.TabIndex = 91; + this.exclamation22.Text = "!"; + this.exclamation22.Visible = false; + // + // startTextBox22 + // + this.startTextBox22.Enabled = false; + this.startTextBox22.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox22.Location = new System.Drawing.Point(769, 456); + this.startTextBox22.Name = "startTextBox22"; + this.startTextBox22.Size = new System.Drawing.Size(163, 31); + this.startTextBox22.TabIndex = 89; + this.startTextBox22.Visible = false; + this.startTextBox22.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox22_KeyPress); + // + // endTextBox22 + // + this.endTextBox22.Enabled = false; + this.endTextBox22.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox22.Location = new System.Drawing.Point(951, 456); + this.endTextBox22.Name = "endTextBox22"; + this.endTextBox22.Size = new System.Drawing.Size(163, 31); + this.endTextBox22.TabIndex = 90; + this.endTextBox22.Visible = false; + this.endTextBox22.TextChanged += new System.EventHandler(this.endTextBox22_TextChanged); + this.endTextBox22.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox22_KeyPress); + // + // label22 + // + this.label22.AutoSize = true; + this.label22.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label22.Location = new System.Drawing.Point(592, 459); + this.label22.Name = "label22"; + this.label22.Size = new System.Drawing.Size(157, 23); + this.label22.TabIndex = 88; + this.label22.Text = "Water Meter 22"; + this.label22.Visible = false; + // + // exclamation21 + // + this.exclamation21.AutoSize = true; + this.exclamation21.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation21.ForeColor = System.Drawing.Color.Red; + this.exclamation21.Location = new System.Drawing.Point(1116, 408); + this.exclamation21.Name = "exclamation21"; + this.exclamation21.Size = new System.Drawing.Size(30, 38); + this.exclamation21.TabIndex = 87; + this.exclamation21.Text = "!"; + this.exclamation21.Visible = false; + // + // startTextBox21 + // + this.startTextBox21.Enabled = false; + this.startTextBox21.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox21.Location = new System.Drawing.Point(769, 412); + this.startTextBox21.Name = "startTextBox21"; + this.startTextBox21.Size = new System.Drawing.Size(163, 31); + this.startTextBox21.TabIndex = 85; + this.startTextBox21.Visible = false; + this.startTextBox21.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox21_KeyPress); + // + // endTextBox21 + // + this.endTextBox21.Enabled = false; + this.endTextBox21.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox21.Location = new System.Drawing.Point(951, 412); + this.endTextBox21.Name = "endTextBox21"; + this.endTextBox21.Size = new System.Drawing.Size(163, 31); + this.endTextBox21.TabIndex = 86; + this.endTextBox21.Visible = false; + this.endTextBox21.TextChanged += new System.EventHandler(this.endTextBox21_TextChanged); + this.endTextBox21.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox21_KeyPress); + // + // label21 + // + this.label21.AutoSize = true; + this.label21.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label21.Location = new System.Drawing.Point(592, 415); + this.label21.Name = "label21"; + this.label21.Size = new System.Drawing.Size(157, 23); + this.label21.TabIndex = 84; + this.label21.Text = "Water Meter 21"; + this.label21.Visible = false; + // + // exclamation20 + // + this.exclamation20.AutoSize = true; + this.exclamation20.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation20.ForeColor = System.Drawing.Color.Red; + this.exclamation20.Location = new System.Drawing.Point(1116, 364); + this.exclamation20.Name = "exclamation20"; + this.exclamation20.Size = new System.Drawing.Size(30, 38); + this.exclamation20.TabIndex = 83; + this.exclamation20.Text = "!"; + this.exclamation20.Visible = false; + // + // startTextBox20 + // + this.startTextBox20.Enabled = false; + this.startTextBox20.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox20.Location = new System.Drawing.Point(769, 368); + this.startTextBox20.Name = "startTextBox20"; + this.startTextBox20.Size = new System.Drawing.Size(163, 31); + this.startTextBox20.TabIndex = 81; + this.startTextBox20.Visible = false; + this.startTextBox20.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox20_KeyPress); + // + // endTextBox20 + // + this.endTextBox20.Enabled = false; + this.endTextBox20.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox20.Location = new System.Drawing.Point(951, 368); + this.endTextBox20.Name = "endTextBox20"; + this.endTextBox20.Size = new System.Drawing.Size(163, 31); + this.endTextBox20.TabIndex = 82; + this.endTextBox20.Visible = false; + this.endTextBox20.TextChanged += new System.EventHandler(this.endTextBox20_TextChanged); + this.endTextBox20.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox20_KeyPress); + // + // label20 + // + this.label20.AutoSize = true; + this.label20.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label20.Location = new System.Drawing.Point(592, 371); + this.label20.Name = "label20"; + this.label20.Size = new System.Drawing.Size(157, 23); + this.label20.TabIndex = 80; + this.label20.Text = "Water Meter 20"; + this.label20.Visible = false; + // + // exclamation19 + // + this.exclamation19.AutoSize = true; + this.exclamation19.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation19.ForeColor = System.Drawing.Color.Red; + this.exclamation19.Location = new System.Drawing.Point(1116, 320); + this.exclamation19.Name = "exclamation19"; + this.exclamation19.Size = new System.Drawing.Size(30, 38); + this.exclamation19.TabIndex = 79; + this.exclamation19.Text = "!"; + this.exclamation19.Visible = false; + // + // startTextBox19 + // + this.startTextBox19.Enabled = false; + this.startTextBox19.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox19.Location = new System.Drawing.Point(769, 324); + this.startTextBox19.Name = "startTextBox19"; + this.startTextBox19.Size = new System.Drawing.Size(163, 31); + this.startTextBox19.TabIndex = 77; + this.startTextBox19.Visible = false; + this.startTextBox19.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox19_KeyPress); + // + // endTextBox19 + // + this.endTextBox19.Enabled = false; + this.endTextBox19.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox19.Location = new System.Drawing.Point(951, 324); + this.endTextBox19.Name = "endTextBox19"; + this.endTextBox19.Size = new System.Drawing.Size(163, 31); + this.endTextBox19.TabIndex = 78; + this.endTextBox19.Visible = false; + this.endTextBox19.TextChanged += new System.EventHandler(this.endTextBox19_TextChanged); + this.endTextBox19.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox19_KeyPress); + // + // label19 + // + this.label19.AutoSize = true; + this.label19.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label19.Location = new System.Drawing.Point(592, 327); + this.label19.Name = "label19"; + this.label19.Size = new System.Drawing.Size(157, 23); + this.label19.TabIndex = 76; + this.label19.Text = "Water Meter 19"; + this.label19.Visible = false; + // + // exclamation18 + // + this.exclamation18.AutoSize = true; + this.exclamation18.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation18.ForeColor = System.Drawing.Color.Red; + this.exclamation18.Location = new System.Drawing.Point(1116, 276); + this.exclamation18.Name = "exclamation18"; + this.exclamation18.Size = new System.Drawing.Size(30, 38); + this.exclamation18.TabIndex = 75; + this.exclamation18.Text = "!"; + this.exclamation18.Visible = false; + // + // exclamation17 + // + this.exclamation17.AutoSize = true; + this.exclamation17.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation17.ForeColor = System.Drawing.Color.Red; + this.exclamation17.Location = new System.Drawing.Point(1116, 232); + this.exclamation17.Name = "exclamation17"; + this.exclamation17.Size = new System.Drawing.Size(30, 38); + this.exclamation17.TabIndex = 71; + this.exclamation17.Text = "!"; + this.exclamation17.Visible = false; + // + // startTextBox18 + // + this.startTextBox18.Enabled = false; + this.startTextBox18.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox18.Location = new System.Drawing.Point(769, 280); + this.startTextBox18.Name = "startTextBox18"; + this.startTextBox18.Size = new System.Drawing.Size(163, 31); + this.startTextBox18.TabIndex = 73; + this.startTextBox18.Visible = false; + this.startTextBox18.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox18_KeyPress); + // + // exclamation16 + // + this.exclamation16.AutoSize = true; + this.exclamation16.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation16.ForeColor = System.Drawing.Color.Red; + this.exclamation16.Location = new System.Drawing.Point(1116, 188); + this.exclamation16.Name = "exclamation16"; + this.exclamation16.Size = new System.Drawing.Size(30, 38); + this.exclamation16.TabIndex = 67; + this.exclamation16.Text = "!"; + this.exclamation16.Visible = false; + // + // endTextBox18 + // + this.endTextBox18.Enabled = false; + this.endTextBox18.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox18.Location = new System.Drawing.Point(951, 280); + this.endTextBox18.Name = "endTextBox18"; + this.endTextBox18.Size = new System.Drawing.Size(163, 31); + this.endTextBox18.TabIndex = 74; + this.endTextBox18.Visible = false; + this.endTextBox18.TextChanged += new System.EventHandler(this.endTextBox18_TextChanged); + this.endTextBox18.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox18_KeyPress); + // + // label18 + // + this.label18.AutoSize = true; + this.label18.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label18.Location = new System.Drawing.Point(592, 283); + this.label18.Name = "label18"; + this.label18.Size = new System.Drawing.Size(157, 23); + this.label18.TabIndex = 72; + this.label18.Text = "Water Meter 18"; + this.label18.Visible = false; + // + // startTextBox17 + // + this.startTextBox17.Enabled = false; + this.startTextBox17.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox17.Location = new System.Drawing.Point(769, 236); + this.startTextBox17.Name = "startTextBox17"; + this.startTextBox17.Size = new System.Drawing.Size(163, 31); + this.startTextBox17.TabIndex = 69; + this.startTextBox17.Visible = false; + this.startTextBox17.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox17_KeyPress); + // + // exclamation15 + // + this.exclamation15.AutoSize = true; + this.exclamation15.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation15.ForeColor = System.Drawing.Color.Red; + this.exclamation15.Location = new System.Drawing.Point(1116, 144); + this.exclamation15.Name = "exclamation15"; + this.exclamation15.Size = new System.Drawing.Size(30, 38); + this.exclamation15.TabIndex = 63; + this.exclamation15.Text = "!"; + this.exclamation15.Visible = false; + // + // endTextBox17 + // + this.endTextBox17.Enabled = false; + this.endTextBox17.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox17.Location = new System.Drawing.Point(951, 236); + this.endTextBox17.Name = "endTextBox17"; + this.endTextBox17.Size = new System.Drawing.Size(163, 31); + this.endTextBox17.TabIndex = 70; + this.endTextBox17.Visible = false; + this.endTextBox17.TextChanged += new System.EventHandler(this.endTextBox17_TextChanged); + this.endTextBox17.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox17_KeyPress); + // + // label17 + // + this.label17.AutoSize = true; + this.label17.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label17.Location = new System.Drawing.Point(592, 239); + this.label17.Name = "label17"; + this.label17.Size = new System.Drawing.Size(157, 23); + this.label17.TabIndex = 68; + this.label17.Text = "Water Meter 17"; + this.label17.Visible = false; + // + // startTextBox16 + // + this.startTextBox16.Enabled = false; + this.startTextBox16.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox16.Location = new System.Drawing.Point(769, 192); + this.startTextBox16.Name = "startTextBox16"; + this.startTextBox16.Size = new System.Drawing.Size(163, 31); + this.startTextBox16.TabIndex = 65; + this.startTextBox16.Visible = false; + this.startTextBox16.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox16_KeyPress); + // + // exclamation14 + // + this.exclamation14.AutoSize = true; + this.exclamation14.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation14.ForeColor = System.Drawing.Color.Red; + this.exclamation14.Location = new System.Drawing.Point(1116, 100); + this.exclamation14.Name = "exclamation14"; + this.exclamation14.Size = new System.Drawing.Size(30, 38); + this.exclamation14.TabIndex = 59; + this.exclamation14.Text = "!"; + this.exclamation14.Visible = false; + // + // endTextBox16 + // + this.endTextBox16.Enabled = false; + this.endTextBox16.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox16.Location = new System.Drawing.Point(951, 192); + this.endTextBox16.Name = "endTextBox16"; + this.endTextBox16.Size = new System.Drawing.Size(163, 31); + this.endTextBox16.TabIndex = 66; + this.endTextBox16.Visible = false; + this.endTextBox16.TextChanged += new System.EventHandler(this.endTextBox16_TextChanged); + this.endTextBox16.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox16_KeyPress); + // + // label16 + // + this.label16.AutoSize = true; + this.label16.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label16.Location = new System.Drawing.Point(592, 195); + this.label16.Name = "label16"; + this.label16.Size = new System.Drawing.Size(157, 23); + this.label16.TabIndex = 64; + this.label16.Text = "Water Meter 16"; + this.label16.Visible = false; + // + // startTextBox15 + // + this.startTextBox15.Enabled = false; + this.startTextBox15.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox15.Location = new System.Drawing.Point(769, 148); + this.startTextBox15.Name = "startTextBox15"; + this.startTextBox15.Size = new System.Drawing.Size(163, 31); + this.startTextBox15.TabIndex = 61; + this.startTextBox15.Visible = false; + this.startTextBox15.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox15_KeyPress); + // + // exclamation13 + // + this.exclamation13.AutoSize = true; + this.exclamation13.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation13.ForeColor = System.Drawing.Color.Red; + this.exclamation13.Location = new System.Drawing.Point(1116, 56); + this.exclamation13.Name = "exclamation13"; + this.exclamation13.Size = new System.Drawing.Size(30, 38); + this.exclamation13.TabIndex = 55; + this.exclamation13.Text = "!"; + this.exclamation13.Visible = false; + // + // endTextBox15 + // + this.endTextBox15.Enabled = false; + this.endTextBox15.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox15.Location = new System.Drawing.Point(951, 148); + this.endTextBox15.Name = "endTextBox15"; + this.endTextBox15.Size = new System.Drawing.Size(163, 31); + this.endTextBox15.TabIndex = 62; + this.endTextBox15.Visible = false; + this.endTextBox15.TextChanged += new System.EventHandler(this.endTextBox15_TextChanged); + this.endTextBox15.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox15_KeyPress); + // + // label15 + // + this.label15.AutoSize = true; + this.label15.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label15.Location = new System.Drawing.Point(592, 151); + this.label15.Name = "label15"; + this.label15.Size = new System.Drawing.Size(157, 23); + this.label15.TabIndex = 60; + this.label15.Text = "Water Meter 15"; + this.label15.Visible = false; + // + // startTextBox14 + // + this.startTextBox14.Enabled = false; + this.startTextBox14.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox14.Location = new System.Drawing.Point(769, 104); + this.startTextBox14.Name = "startTextBox14"; + this.startTextBox14.Size = new System.Drawing.Size(163, 31); + this.startTextBox14.TabIndex = 57; + this.startTextBox14.Visible = false; + this.startTextBox14.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox14_KeyPress); + // + // endLabel2 + // + this.endLabel2.AutoSize = true; + this.endLabel2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endLabel2.Location = new System.Drawing.Point(1007, 21); + this.endLabel2.Name = "endLabel2"; + this.endLabel2.Size = new System.Drawing.Size(46, 23); + this.endLabel2.TabIndex = 51; + this.endLabel2.Text = "End"; + // + // endTextBox14 + // + this.endTextBox14.Enabled = false; + this.endTextBox14.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox14.Location = new System.Drawing.Point(951, 104); + this.endTextBox14.Name = "endTextBox14"; + this.endTextBox14.Size = new System.Drawing.Size(163, 31); + this.endTextBox14.TabIndex = 58; + this.endTextBox14.Visible = false; + this.endTextBox14.TextChanged += new System.EventHandler(this.endTextBox14_TextChanged); + this.endTextBox14.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox14_KeyPress); + // + // label14 + // + this.label14.AutoSize = true; + this.label14.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label14.Location = new System.Drawing.Point(592, 107); + this.label14.Name = "label14"; + this.label14.Size = new System.Drawing.Size(157, 23); + this.label14.TabIndex = 56; + this.label14.Text = "Water Meter 14"; + this.label14.Visible = false; + // + // startTextBox13 + // + this.startTextBox13.Enabled = false; + this.startTextBox13.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox13.Location = new System.Drawing.Point(769, 60); + this.startTextBox13.Name = "startTextBox13"; + this.startTextBox13.Size = new System.Drawing.Size(163, 31); + this.startTextBox13.TabIndex = 53; + this.startTextBox13.Visible = false; + this.startTextBox13.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox13_KeyPress); + // + // startLabel2 + // + this.startLabel2.AutoSize = true; + this.startLabel2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startLabel2.Location = new System.Drawing.Point(821, 21); + this.startLabel2.Name = "startLabel2"; + this.startLabel2.Size = new System.Drawing.Size(56, 23); + this.startLabel2.TabIndex = 50; + this.startLabel2.Text = "Start"; + // + // endTextBox13 + // + this.endTextBox13.Enabled = false; + this.endTextBox13.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox13.Location = new System.Drawing.Point(951, 60); + this.endTextBox13.Name = "endTextBox13"; + this.endTextBox13.Size = new System.Drawing.Size(163, 31); + this.endTextBox13.TabIndex = 54; + this.endTextBox13.Visible = false; + this.endTextBox13.TextChanged += new System.EventHandler(this.endTextBox13_TextChanged); + this.endTextBox13.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox13_KeyPress); + // + // label13 + // + this.label13.AutoSize = true; + this.label13.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label13.Location = new System.Drawing.Point(592, 63); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(157, 23); + this.label13.TabIndex = 52; + this.label13.Text = "Water Meter 13"; + this.label13.Visible = false; + // + // TestStartEndForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.ClientSize = new System.Drawing.Size(1292, 613); + this.Controls.Add(this.exclamation24); + this.Controls.Add(this.startTextBox24); + this.Controls.Add(this.endTextBox24); + this.Controls.Add(this.label24); + this.Controls.Add(this.exclamation23); + this.Controls.Add(this.startTextBox23); + this.Controls.Add(this.endTextBox23); + this.Controls.Add(this.label23); + this.Controls.Add(this.exclamation22); + this.Controls.Add(this.startTextBox22); + this.Controls.Add(this.endTextBox22); + this.Controls.Add(this.label22); + this.Controls.Add(this.exclamation21); + this.Controls.Add(this.startTextBox21); + this.Controls.Add(this.endTextBox21); + this.Controls.Add(this.label21); + this.Controls.Add(this.exclamation20); + this.Controls.Add(this.startTextBox20); + this.Controls.Add(this.endTextBox20); + this.Controls.Add(this.label20); + this.Controls.Add(this.exclamation19); + this.Controls.Add(this.startTextBox19); + this.Controls.Add(this.endTextBox19); + this.Controls.Add(this.label19); + this.Controls.Add(this.exclamation18); + this.Controls.Add(this.exclamation17); + this.Controls.Add(this.startTextBox18); + this.Controls.Add(this.exclamation16); + this.Controls.Add(this.endTextBox18); + this.Controls.Add(this.label18); + this.Controls.Add(this.startTextBox17); + this.Controls.Add(this.exclamation15); + this.Controls.Add(this.endTextBox17); + this.Controls.Add(this.label17); + this.Controls.Add(this.startTextBox16); + this.Controls.Add(this.exclamation14); + this.Controls.Add(this.endTextBox16); + this.Controls.Add(this.label16); + this.Controls.Add(this.startTextBox15); + this.Controls.Add(this.exclamation13); + this.Controls.Add(this.endTextBox15); + this.Controls.Add(this.label15); + this.Controls.Add(this.startTextBox14); + this.Controls.Add(this.endLabel2); + this.Controls.Add(this.endTextBox14); + this.Controls.Add(this.label14); + this.Controls.Add(this.startTextBox13); + this.Controls.Add(this.startLabel2); + this.Controls.Add(this.endTextBox13); + this.Controls.Add(this.label13); + this.Controls.Add(this.exclamation12); + this.Controls.Add(this.startTextBox12); + this.Controls.Add(this.endTextBox12); + this.Controls.Add(this.label12); + this.Controls.Add(this.exclamation11); + this.Controls.Add(this.startTextBox11); + this.Controls.Add(this.endTextBox11); + this.Controls.Add(this.label11); + this.Controls.Add(this.exclamation10); + this.Controls.Add(this.startTextBox10); + this.Controls.Add(this.endTextBox10); + this.Controls.Add(this.label10); + this.Controls.Add(this.exclamation9); + this.Controls.Add(this.startTextBox9); + this.Controls.Add(this.endTextBox9); + this.Controls.Add(this.label9); + this.Controls.Add(this.exclamation8); + this.Controls.Add(this.startTextBox8); + this.Controls.Add(this.endTextBox8); + this.Controls.Add(this.label8); + this.Controls.Add(this.exclamation7); + this.Controls.Add(this.startTextBox7); + this.Controls.Add(this.endTextBox7); + this.Controls.Add(this.label7); + this.Controls.Add(this.exclamation6); + this.Controls.Add(this.exclamation5); + this.Controls.Add(this.startTextBox6); + this.Controls.Add(this.exclamation4); + this.Controls.Add(this.endTextBox6); + this.Controls.Add(this.label6); + this.Controls.Add(this.startTextBox5); + this.Controls.Add(this.exclamation3); + this.Controls.Add(this.endTextBox5); + this.Controls.Add(this.label5); + this.Controls.Add(this.startTextBox4); + this.Controls.Add(this.exclamation2); + this.Controls.Add(this.endTextBox4); + this.Controls.Add(this.label4); + this.Controls.Add(this.startTextBox3); + this.Controls.Add(this.exclamation1); + this.Controls.Add(this.endTextBox3); + this.Controls.Add(this.label3); + this.Controls.Add(this.startTextBox2); + this.Controls.Add(this.endLabel); + this.Controls.Add(this.endTextBox2); + this.Controls.Add(this.label2); + this.Controls.Add(this.startTextBox1); + this.Controls.Add(this.startLabel); + this.Controls.Add(this.endTextBox1); + this.Controls.Add(this.label1); + this.Controls.Add(this.okButton); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "TestStartEndForm"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "End States"; + this.TopMost = true; + this.Load += new System.EventHandler(this.CycleEndForm_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox endTextBox1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.TextBox endTextBox3; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox endTextBox4; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox endTextBox5; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.TextBox endTextBox6; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TextBox startTextBox1; + private System.Windows.Forms.TextBox startTextBox3; + private System.Windows.Forms.TextBox startTextBox4; + private System.Windows.Forms.TextBox startTextBox5; + private System.Windows.Forms.TextBox startTextBox6; + private System.Windows.Forms.Label startLabel; + private System.Windows.Forms.Label endLabel; + private System.Windows.Forms.Label exclamation1; + private System.Windows.Forms.Label exclamation3; + private System.Windows.Forms.Label exclamation4; + private System.Windows.Forms.Label exclamation5; + private System.Windows.Forms.Label exclamation6; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox endTextBox2; + private System.Windows.Forms.TextBox startTextBox2; + private System.Windows.Forms.Label exclamation2; + private System.Windows.Forms.Label exclamation7; + private System.Windows.Forms.TextBox startTextBox7; + private System.Windows.Forms.TextBox endTextBox7; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.Label exclamation8; + private System.Windows.Forms.TextBox startTextBox8; + private System.Windows.Forms.TextBox endTextBox8; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.Label exclamation9; + private System.Windows.Forms.TextBox startTextBox9; + private System.Windows.Forms.TextBox endTextBox9; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.Label exclamation10; + private System.Windows.Forms.TextBox startTextBox10; + private System.Windows.Forms.TextBox endTextBox10; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.Label exclamation11; + private System.Windows.Forms.TextBox startTextBox11; + private System.Windows.Forms.TextBox endTextBox11; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.Label exclamation12; + private System.Windows.Forms.TextBox startTextBox12; + private System.Windows.Forms.TextBox endTextBox12; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.Label exclamation24; + private System.Windows.Forms.TextBox startTextBox24; + private System.Windows.Forms.TextBox endTextBox24; + private System.Windows.Forms.Label label24; + private System.Windows.Forms.Label exclamation23; + private System.Windows.Forms.TextBox startTextBox23; + private System.Windows.Forms.TextBox endTextBox23; + private System.Windows.Forms.Label label23; + private System.Windows.Forms.Label exclamation22; + private System.Windows.Forms.TextBox startTextBox22; + private System.Windows.Forms.TextBox endTextBox22; + private System.Windows.Forms.Label label22; + private System.Windows.Forms.Label exclamation21; + private System.Windows.Forms.TextBox startTextBox21; + private System.Windows.Forms.TextBox endTextBox21; + private System.Windows.Forms.Label label21; + private System.Windows.Forms.Label exclamation20; + private System.Windows.Forms.TextBox startTextBox20; + private System.Windows.Forms.TextBox endTextBox20; + private System.Windows.Forms.Label label20; + private System.Windows.Forms.Label exclamation19; + private System.Windows.Forms.TextBox startTextBox19; + private System.Windows.Forms.TextBox endTextBox19; + private System.Windows.Forms.Label label19; + private System.Windows.Forms.Label exclamation18; + private System.Windows.Forms.Label exclamation17; + private System.Windows.Forms.TextBox startTextBox18; + private System.Windows.Forms.Label exclamation16; + private System.Windows.Forms.TextBox endTextBox18; + private System.Windows.Forms.Label label18; + private System.Windows.Forms.TextBox startTextBox17; + private System.Windows.Forms.Label exclamation15; + private System.Windows.Forms.TextBox endTextBox17; + private System.Windows.Forms.Label label17; + private System.Windows.Forms.TextBox startTextBox16; + private System.Windows.Forms.Label exclamation14; + private System.Windows.Forms.TextBox endTextBox16; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.TextBox startTextBox15; + private System.Windows.Forms.Label exclamation13; + private System.Windows.Forms.TextBox endTextBox15; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.TextBox startTextBox14; + private System.Windows.Forms.Label endLabel2; + private System.Windows.Forms.TextBox endTextBox14; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.TextBox startTextBox13; + private System.Windows.Forms.Label startLabel2; + private System.Windows.Forms.TextBox endTextBox13; + private System.Windows.Forms.Label label13; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/TestStartEndForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/TestStartEndForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard24/TestStartEndForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/CycleBeginningForm.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/CycleBeginningForm.Designer.cs new file mode 100644 index 00000000..1af9fb9d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/CycleBeginningForm.Designer.cs @@ -0,0 +1,1489 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.Standard48 +{ + partial class CycleBeginningForm + { + /// + /// 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(CycleBeginningForm)); + this.okButton = new System.Windows.Forms.Button(); + this.orderGroupBox = new System.Windows.Forms.GroupBox(); + this.orderComboBox = new System.Windows.Forms.ComboBox(); + this.clearButton = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.checkBox1 = new System.Windows.Forms.CheckBox(); + this.checkBox2 = new System.Windows.Forms.CheckBox(); + this.comboBox2 = new System.Windows.Forms.ComboBox(); + this.label2 = new System.Windows.Forms.Label(); + this.checkBox3 = new System.Windows.Forms.CheckBox(); + this.comboBox3 = new System.Windows.Forms.ComboBox(); + this.label3 = new System.Windows.Forms.Label(); + this.checkBox4 = new System.Windows.Forms.CheckBox(); + this.comboBox4 = new System.Windows.Forms.ComboBox(); + this.label4 = new System.Windows.Forms.Label(); + this.checkBox5 = new System.Windows.Forms.CheckBox(); + this.comboBox5 = new System.Windows.Forms.ComboBox(); + this.label5 = new System.Windows.Forms.Label(); + this.checkBox6 = new System.Windows.Forms.CheckBox(); + this.comboBox6 = new System.Windows.Forms.ComboBox(); + this.label6 = new System.Windows.Forms.Label(); + this.checkBox7 = new System.Windows.Forms.CheckBox(); + this.comboBox7 = new System.Windows.Forms.ComboBox(); + this.label7 = new System.Windows.Forms.Label(); + this.checkBox8 = new System.Windows.Forms.CheckBox(); + this.comboBox8 = new System.Windows.Forms.ComboBox(); + this.label8 = new System.Windows.Forms.Label(); + this.checkBox9 = new System.Windows.Forms.CheckBox(); + this.comboBox9 = new System.Windows.Forms.ComboBox(); + this.label9 = new System.Windows.Forms.Label(); + this.checkBox10 = new System.Windows.Forms.CheckBox(); + this.comboBox10 = new System.Windows.Forms.ComboBox(); + this.label10 = new System.Windows.Forms.Label(); + this.checkBox11 = new System.Windows.Forms.CheckBox(); + this.comboBox11 = new System.Windows.Forms.ComboBox(); + this.label11 = new System.Windows.Forms.Label(); + this.checkBox12 = new System.Windows.Forms.CheckBox(); + this.comboBox12 = new System.Windows.Forms.ComboBox(); + this.label12 = new System.Windows.Forms.Label(); + this.checkBox13 = new System.Windows.Forms.CheckBox(); + this.comboBox13 = new System.Windows.Forms.ComboBox(); + this.label13 = new System.Windows.Forms.Label(); + this.checkBox14 = new System.Windows.Forms.CheckBox(); + this.comboBox14 = new System.Windows.Forms.ComboBox(); + this.label14 = new System.Windows.Forms.Label(); + this.checkBox15 = new System.Windows.Forms.CheckBox(); + this.comboBox15 = new System.Windows.Forms.ComboBox(); + this.label15 = new System.Windows.Forms.Label(); + this.checkBox16 = new System.Windows.Forms.CheckBox(); + this.comboBox16 = new System.Windows.Forms.ComboBox(); + this.label16 = new System.Windows.Forms.Label(); + this.checkBox17 = new System.Windows.Forms.CheckBox(); + this.comboBox17 = new System.Windows.Forms.ComboBox(); + this.label17 = new System.Windows.Forms.Label(); + this.checkBox18 = new System.Windows.Forms.CheckBox(); + this.comboBox18 = new System.Windows.Forms.ComboBox(); + this.label18 = new System.Windows.Forms.Label(); + this.checkBox19 = new System.Windows.Forms.CheckBox(); + this.comboBox19 = new System.Windows.Forms.ComboBox(); + this.label19 = new System.Windows.Forms.Label(); + this.checkBox20 = new System.Windows.Forms.CheckBox(); + this.comboBox20 = new System.Windows.Forms.ComboBox(); + this.label20 = new System.Windows.Forms.Label(); + this.checkBox21 = new System.Windows.Forms.CheckBox(); + this.comboBox21 = new System.Windows.Forms.ComboBox(); + this.label21 = new System.Windows.Forms.Label(); + this.checkBox22 = new System.Windows.Forms.CheckBox(); + this.comboBox22 = new System.Windows.Forms.ComboBox(); + this.label22 = new System.Windows.Forms.Label(); + this.checkBox23 = new System.Windows.Forms.CheckBox(); + this.comboBox23 = new System.Windows.Forms.ComboBox(); + this.label23 = new System.Windows.Forms.Label(); + this.checkBox24 = new System.Windows.Forms.CheckBox(); + this.comboBox24 = new System.Windows.Forms.ComboBox(); + this.label24 = new System.Windows.Forms.Label(); + this.checkBox48 = new System.Windows.Forms.CheckBox(); + this.comboBox48 = new System.Windows.Forms.ComboBox(); + this.label48 = new System.Windows.Forms.Label(); + this.checkBox47 = new System.Windows.Forms.CheckBox(); + this.comboBox47 = new System.Windows.Forms.ComboBox(); + this.label47 = new System.Windows.Forms.Label(); + this.checkBox46 = new System.Windows.Forms.CheckBox(); + this.comboBox46 = new System.Windows.Forms.ComboBox(); + this.label46 = new System.Windows.Forms.Label(); + this.checkBox45 = new System.Windows.Forms.CheckBox(); + this.comboBox45 = new System.Windows.Forms.ComboBox(); + this.label45 = new System.Windows.Forms.Label(); + this.checkBox44 = new System.Windows.Forms.CheckBox(); + this.comboBox44 = new System.Windows.Forms.ComboBox(); + this.label44 = new System.Windows.Forms.Label(); + this.checkBox43 = new System.Windows.Forms.CheckBox(); + this.comboBox43 = new System.Windows.Forms.ComboBox(); + this.label43 = new System.Windows.Forms.Label(); + this.checkBox42 = new System.Windows.Forms.CheckBox(); + this.comboBox42 = new System.Windows.Forms.ComboBox(); + this.label42 = new System.Windows.Forms.Label(); + this.checkBox41 = new System.Windows.Forms.CheckBox(); + this.comboBox41 = new System.Windows.Forms.ComboBox(); + this.label41 = new System.Windows.Forms.Label(); + this.checkBox40 = new System.Windows.Forms.CheckBox(); + this.comboBox40 = new System.Windows.Forms.ComboBox(); + this.label40 = new System.Windows.Forms.Label(); + this.checkBox39 = new System.Windows.Forms.CheckBox(); + this.comboBox39 = new System.Windows.Forms.ComboBox(); + this.label39 = new System.Windows.Forms.Label(); + this.checkBox38 = new System.Windows.Forms.CheckBox(); + this.comboBox38 = new System.Windows.Forms.ComboBox(); + this.label38 = new System.Windows.Forms.Label(); + this.checkBox37 = new System.Windows.Forms.CheckBox(); + this.comboBox37 = new System.Windows.Forms.ComboBox(); + this.label37 = new System.Windows.Forms.Label(); + this.checkBox36 = new System.Windows.Forms.CheckBox(); + this.comboBox36 = new System.Windows.Forms.ComboBox(); + this.label36 = new System.Windows.Forms.Label(); + this.checkBox35 = new System.Windows.Forms.CheckBox(); + this.comboBox35 = new System.Windows.Forms.ComboBox(); + this.label35 = new System.Windows.Forms.Label(); + this.checkBox34 = new System.Windows.Forms.CheckBox(); + this.comboBox34 = new System.Windows.Forms.ComboBox(); + this.label34 = new System.Windows.Forms.Label(); + this.checkBox33 = new System.Windows.Forms.CheckBox(); + this.comboBox33 = new System.Windows.Forms.ComboBox(); + this.label33 = new System.Windows.Forms.Label(); + this.checkBox32 = new System.Windows.Forms.CheckBox(); + this.comboBox32 = new System.Windows.Forms.ComboBox(); + this.label32 = new System.Windows.Forms.Label(); + this.checkBox31 = new System.Windows.Forms.CheckBox(); + this.comboBox31 = new System.Windows.Forms.ComboBox(); + this.label31 = new System.Windows.Forms.Label(); + this.checkBox30 = new System.Windows.Forms.CheckBox(); + this.comboBox30 = new System.Windows.Forms.ComboBox(); + this.label30 = new System.Windows.Forms.Label(); + this.checkBox29 = new System.Windows.Forms.CheckBox(); + this.comboBox29 = new System.Windows.Forms.ComboBox(); + this.label29 = new System.Windows.Forms.Label(); + this.checkBox28 = new System.Windows.Forms.CheckBox(); + this.comboBox28 = new System.Windows.Forms.ComboBox(); + this.label28 = new System.Windows.Forms.Label(); + this.checkBox27 = new System.Windows.Forms.CheckBox(); + this.comboBox27 = new System.Windows.Forms.ComboBox(); + this.label27 = new System.Windows.Forms.Label(); + this.checkBox26 = new System.Windows.Forms.CheckBox(); + this.comboBox26 = new System.Windows.Forms.ComboBox(); + this.label26 = new System.Windows.Forms.Label(); + this.checkBox25 = new System.Windows.Forms.CheckBox(); + this.comboBox25 = new System.Windows.Forms.ComboBox(); + this.label25 = new System.Windows.Forms.Label(); + this.orderGroupBox.SuspendLayout(); + this.SuspendLayout(); + // + // okButton + // + resources.ApplyResources(this.okButton, "okButton"); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Name = "okButton"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // orderGroupBox + // + this.orderGroupBox.Controls.Add(this.orderComboBox); + resources.ApplyResources(this.orderGroupBox, "orderGroupBox"); + this.orderGroupBox.ForeColor = System.Drawing.Color.Black; + this.orderGroupBox.Name = "orderGroupBox"; + this.orderGroupBox.TabStop = false; + // + // orderComboBox + // + this.orderComboBox.FormattingEnabled = true; + resources.ApplyResources(this.orderComboBox, "orderComboBox"); + this.orderComboBox.Name = "orderComboBox"; + // + // clearButton + // + resources.ApplyResources(this.clearButton, "clearButton"); + this.clearButton.ForeColor = System.Drawing.Color.Black; + this.clearButton.Name = "clearButton"; + this.clearButton.UseVisualStyleBackColor = true; + this.clearButton.Click += new System.EventHandler(this.clearButton_Click); + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // comboBox1 + // + resources.ApplyResources(this.comboBox1, "comboBox1"); + this.comboBox1.FormattingEnabled = true; + this.comboBox1.Name = "comboBox1"; + this.comboBox1.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged); + this.comboBox1.TextChanged += new System.EventHandler(this.comboBox1_TextChanged); + this.comboBox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox1_KeyPress); + // + // checkBox1 + // + resources.ApplyResources(this.checkBox1, "checkBox1"); + this.checkBox1.Name = "checkBox1"; + this.checkBox1.UseVisualStyleBackColor = true; + // + // checkBox2 + // + resources.ApplyResources(this.checkBox2, "checkBox2"); + this.checkBox2.Name = "checkBox2"; + this.checkBox2.UseVisualStyleBackColor = true; + // + // comboBox2 + // + resources.ApplyResources(this.comboBox2, "comboBox2"); + this.comboBox2.FormattingEnabled = true; + this.comboBox2.Name = "comboBox2"; + this.comboBox2.SelectedIndexChanged += new System.EventHandler(this.comboBox2_SelectedIndexChanged); + this.comboBox2.TextChanged += new System.EventHandler(this.comboBox2_TextChanged); + this.comboBox2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox2_KeyPress); + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // checkBox3 + // + resources.ApplyResources(this.checkBox3, "checkBox3"); + this.checkBox3.Name = "checkBox3"; + this.checkBox3.UseVisualStyleBackColor = true; + // + // comboBox3 + // + resources.ApplyResources(this.comboBox3, "comboBox3"); + this.comboBox3.FormattingEnabled = true; + this.comboBox3.Name = "comboBox3"; + this.comboBox3.SelectedIndexChanged += new System.EventHandler(this.comboBox3_SelectedIndexChanged); + this.comboBox3.TextChanged += new System.EventHandler(this.comboBox3_TextChanged); + this.comboBox3.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox3_KeyPress); + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // + // checkBox4 + // + resources.ApplyResources(this.checkBox4, "checkBox4"); + this.checkBox4.Name = "checkBox4"; + this.checkBox4.UseVisualStyleBackColor = true; + // + // comboBox4 + // + resources.ApplyResources(this.comboBox4, "comboBox4"); + this.comboBox4.FormattingEnabled = true; + this.comboBox4.Name = "comboBox4"; + this.comboBox4.SelectedIndexChanged += new System.EventHandler(this.comboBox4_SelectedIndexChanged); + this.comboBox4.TextChanged += new System.EventHandler(this.comboBox4_TextChanged); + this.comboBox4.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox4_KeyPress); + // + // label4 + // + resources.ApplyResources(this.label4, "label4"); + this.label4.Name = "label4"; + // + // checkBox5 + // + resources.ApplyResources(this.checkBox5, "checkBox5"); + this.checkBox5.Name = "checkBox5"; + this.checkBox5.UseVisualStyleBackColor = true; + // + // comboBox5 + // + resources.ApplyResources(this.comboBox5, "comboBox5"); + this.comboBox5.FormattingEnabled = true; + this.comboBox5.Name = "comboBox5"; + this.comboBox5.SelectedIndexChanged += new System.EventHandler(this.comboBox5_SelectedIndexChanged); + this.comboBox5.TextChanged += new System.EventHandler(this.comboBox5_TextChanged); + this.comboBox5.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox5_KeyPress); + // + // label5 + // + resources.ApplyResources(this.label5, "label5"); + this.label5.Name = "label5"; + // + // checkBox6 + // + resources.ApplyResources(this.checkBox6, "checkBox6"); + this.checkBox6.Name = "checkBox6"; + this.checkBox6.UseVisualStyleBackColor = true; + // + // comboBox6 + // + resources.ApplyResources(this.comboBox6, "comboBox6"); + this.comboBox6.FormattingEnabled = true; + this.comboBox6.Name = "comboBox6"; + this.comboBox6.SelectedIndexChanged += new System.EventHandler(this.comboBox6_SelectedIndexChanged); + this.comboBox6.TextChanged += new System.EventHandler(this.comboBox6_TextChanged); + this.comboBox6.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox6_KeyPress); + // + // label6 + // + resources.ApplyResources(this.label6, "label6"); + this.label6.Name = "label6"; + // + // checkBox7 + // + resources.ApplyResources(this.checkBox7, "checkBox7"); + this.checkBox7.Name = "checkBox7"; + this.checkBox7.UseVisualStyleBackColor = true; + // + // comboBox7 + // + resources.ApplyResources(this.comboBox7, "comboBox7"); + this.comboBox7.FormattingEnabled = true; + this.comboBox7.Name = "comboBox7"; + this.comboBox7.SelectedIndexChanged += new System.EventHandler(this.comboBox7_SelectedIndexChanged); + this.comboBox7.TextChanged += new System.EventHandler(this.comboBox7_TextChanged); + this.comboBox7.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox7_KeyPress); + // + // label7 + // + resources.ApplyResources(this.label7, "label7"); + this.label7.Name = "label7"; + // + // checkBox8 + // + resources.ApplyResources(this.checkBox8, "checkBox8"); + this.checkBox8.Name = "checkBox8"; + this.checkBox8.UseVisualStyleBackColor = true; + // + // comboBox8 + // + resources.ApplyResources(this.comboBox8, "comboBox8"); + this.comboBox8.FormattingEnabled = true; + this.comboBox8.Name = "comboBox8"; + this.comboBox8.SelectedIndexChanged += new System.EventHandler(this.comboBox8_SelectedIndexChanged); + this.comboBox8.TextChanged += new System.EventHandler(this.comboBox8_TextChanged); + this.comboBox8.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox8_KeyPress); + // + // label8 + // + resources.ApplyResources(this.label8, "label8"); + this.label8.Name = "label8"; + // + // checkBox9 + // + resources.ApplyResources(this.checkBox9, "checkBox9"); + this.checkBox9.Name = "checkBox9"; + this.checkBox9.UseVisualStyleBackColor = true; + // + // comboBox9 + // + resources.ApplyResources(this.comboBox9, "comboBox9"); + this.comboBox9.FormattingEnabled = true; + this.comboBox9.Name = "comboBox9"; + this.comboBox9.SelectedIndexChanged += new System.EventHandler(this.comboBox9_SelectedIndexChanged); + this.comboBox9.TextChanged += new System.EventHandler(this.comboBox9_TextChanged); + this.comboBox9.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox9_KeyPress); + // + // label9 + // + resources.ApplyResources(this.label9, "label9"); + this.label9.Name = "label9"; + // + // checkBox10 + // + resources.ApplyResources(this.checkBox10, "checkBox10"); + this.checkBox10.Name = "checkBox10"; + this.checkBox10.UseVisualStyleBackColor = true; + // + // comboBox10 + // + resources.ApplyResources(this.comboBox10, "comboBox10"); + this.comboBox10.FormattingEnabled = true; + this.comboBox10.Name = "comboBox10"; + this.comboBox10.SelectedIndexChanged += new System.EventHandler(this.comboBox10_SelectedIndexChanged); + this.comboBox10.TextChanged += new System.EventHandler(this.comboBox10_TextChanged); + this.comboBox10.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox10_KeyPress); + // + // label10 + // + resources.ApplyResources(this.label10, "label10"); + this.label10.Name = "label10"; + // + // checkBox11 + // + resources.ApplyResources(this.checkBox11, "checkBox11"); + this.checkBox11.Name = "checkBox11"; + this.checkBox11.UseVisualStyleBackColor = true; + // + // comboBox11 + // + resources.ApplyResources(this.comboBox11, "comboBox11"); + this.comboBox11.FormattingEnabled = true; + this.comboBox11.Name = "comboBox11"; + this.comboBox11.SelectedIndexChanged += new System.EventHandler(this.comboBox11_SelectedIndexChanged); + this.comboBox11.TextChanged += new System.EventHandler(this.comboBox11_TextChanged); + this.comboBox11.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox11_KeyPress); + // + // label11 + // + resources.ApplyResources(this.label11, "label11"); + this.label11.Name = "label11"; + // + // checkBox12 + // + resources.ApplyResources(this.checkBox12, "checkBox12"); + this.checkBox12.Name = "checkBox12"; + this.checkBox12.UseVisualStyleBackColor = true; + // + // comboBox12 + // + resources.ApplyResources(this.comboBox12, "comboBox12"); + this.comboBox12.FormattingEnabled = true; + this.comboBox12.Name = "comboBox12"; + this.comboBox12.SelectedIndexChanged += new System.EventHandler(this.comboBox12_SelectedIndexChanged); + this.comboBox12.TextChanged += new System.EventHandler(this.comboBox12_TextChanged); + this.comboBox12.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox12_KeyPress); + // + // label12 + // + resources.ApplyResources(this.label12, "label12"); + this.label12.Name = "label12"; + // + // checkBox13 + // + resources.ApplyResources(this.checkBox13, "checkBox13"); + this.checkBox13.Name = "checkBox13"; + this.checkBox13.UseVisualStyleBackColor = true; + // + // comboBox13 + // + resources.ApplyResources(this.comboBox13, "comboBox13"); + this.comboBox13.FormattingEnabled = true; + this.comboBox13.Name = "comboBox13"; + this.comboBox13.SelectedIndexChanged += new System.EventHandler(this.comboBox13_SelectedIndexChanged); + this.comboBox13.TextChanged += new System.EventHandler(this.comboBox13_TextChanged); + this.comboBox13.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox13_KeyPress); + // + // label13 + // + resources.ApplyResources(this.label13, "label13"); + this.label13.Name = "label13"; + // + // checkBox14 + // + resources.ApplyResources(this.checkBox14, "checkBox14"); + this.checkBox14.Name = "checkBox14"; + this.checkBox14.UseVisualStyleBackColor = true; + // + // comboBox14 + // + resources.ApplyResources(this.comboBox14, "comboBox14"); + this.comboBox14.FormattingEnabled = true; + this.comboBox14.Name = "comboBox14"; + this.comboBox14.SelectedIndexChanged += new System.EventHandler(this.comboBox14_SelectedIndexChanged); + this.comboBox14.TextChanged += new System.EventHandler(this.comboBox14_TextChanged); + this.comboBox14.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox14_KeyPress); + // + // label14 + // + resources.ApplyResources(this.label14, "label14"); + this.label14.Name = "label14"; + // + // checkBox15 + // + resources.ApplyResources(this.checkBox15, "checkBox15"); + this.checkBox15.Name = "checkBox15"; + this.checkBox15.UseVisualStyleBackColor = true; + // + // comboBox15 + // + resources.ApplyResources(this.comboBox15, "comboBox15"); + this.comboBox15.FormattingEnabled = true; + this.comboBox15.Name = "comboBox15"; + this.comboBox15.SelectedIndexChanged += new System.EventHandler(this.comboBox15_SelectedIndexChanged); + this.comboBox15.TextChanged += new System.EventHandler(this.comboBox15_TextChanged); + this.comboBox15.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox15_KeyPress); + // + // label15 + // + resources.ApplyResources(this.label15, "label15"); + this.label15.Name = "label15"; + // + // checkBox16 + // + resources.ApplyResources(this.checkBox16, "checkBox16"); + this.checkBox16.Name = "checkBox16"; + this.checkBox16.UseVisualStyleBackColor = true; + // + // comboBox16 + // + resources.ApplyResources(this.comboBox16, "comboBox16"); + this.comboBox16.FormattingEnabled = true; + this.comboBox16.Name = "comboBox16"; + this.comboBox16.SelectedIndexChanged += new System.EventHandler(this.comboBox16_SelectedIndexChanged); + this.comboBox16.TextChanged += new System.EventHandler(this.comboBox16_TextChanged); + this.comboBox16.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox16_KeyPress); + // + // label16 + // + resources.ApplyResources(this.label16, "label16"); + this.label16.Name = "label16"; + // + // checkBox17 + // + resources.ApplyResources(this.checkBox17, "checkBox17"); + this.checkBox17.Name = "checkBox17"; + this.checkBox17.UseVisualStyleBackColor = true; + // + // comboBox17 + // + resources.ApplyResources(this.comboBox17, "comboBox17"); + this.comboBox17.FormattingEnabled = true; + this.comboBox17.Name = "comboBox17"; + this.comboBox17.SelectedIndexChanged += new System.EventHandler(this.comboBox17_SelectedIndexChanged); + this.comboBox17.TextChanged += new System.EventHandler(this.comboBox17_TextChanged); + this.comboBox17.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox17_KeyPress); + // + // label17 + // + resources.ApplyResources(this.label17, "label17"); + this.label17.Name = "label17"; + // + // checkBox18 + // + resources.ApplyResources(this.checkBox18, "checkBox18"); + this.checkBox18.Name = "checkBox18"; + this.checkBox18.UseVisualStyleBackColor = true; + // + // comboBox18 + // + resources.ApplyResources(this.comboBox18, "comboBox18"); + this.comboBox18.FormattingEnabled = true; + this.comboBox18.Name = "comboBox18"; + this.comboBox18.SelectedIndexChanged += new System.EventHandler(this.comboBox18_SelectedIndexChanged); + this.comboBox18.TextChanged += new System.EventHandler(this.comboBox18_TextChanged); + this.comboBox18.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox18_KeyPress); + // + // label18 + // + resources.ApplyResources(this.label18, "label18"); + this.label18.Name = "label18"; + // + // checkBox19 + // + resources.ApplyResources(this.checkBox19, "checkBox19"); + this.checkBox19.Name = "checkBox19"; + this.checkBox19.UseVisualStyleBackColor = true; + // + // comboBox19 + // + resources.ApplyResources(this.comboBox19, "comboBox19"); + this.comboBox19.FormattingEnabled = true; + this.comboBox19.Name = "comboBox19"; + this.comboBox19.SelectedIndexChanged += new System.EventHandler(this.comboBox19_SelectedIndexChanged); + this.comboBox19.TextChanged += new System.EventHandler(this.comboBox19_TextChanged); + this.comboBox19.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox19_KeyPress); + // + // label19 + // + resources.ApplyResources(this.label19, "label19"); + this.label19.Name = "label19"; + // + // checkBox20 + // + resources.ApplyResources(this.checkBox20, "checkBox20"); + this.checkBox20.Name = "checkBox20"; + this.checkBox20.UseVisualStyleBackColor = true; + // + // comboBox20 + // + resources.ApplyResources(this.comboBox20, "comboBox20"); + this.comboBox20.FormattingEnabled = true; + this.comboBox20.Name = "comboBox20"; + this.comboBox20.SelectedIndexChanged += new System.EventHandler(this.comboBox20_SelectedIndexChanged); + this.comboBox20.TextChanged += new System.EventHandler(this.comboBox20_TextChanged); + this.comboBox20.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox20_KeyPress); + // + // label20 + // + resources.ApplyResources(this.label20, "label20"); + this.label20.Name = "label20"; + // + // checkBox21 + // + resources.ApplyResources(this.checkBox21, "checkBox21"); + this.checkBox21.Name = "checkBox21"; + this.checkBox21.UseVisualStyleBackColor = true; + // + // comboBox21 + // + resources.ApplyResources(this.comboBox21, "comboBox21"); + this.comboBox21.FormattingEnabled = true; + this.comboBox21.Name = "comboBox21"; + this.comboBox21.SelectedIndexChanged += new System.EventHandler(this.comboBox21_SelectedIndexChanged); + this.comboBox21.TextChanged += new System.EventHandler(this.comboBox21_TextChanged); + this.comboBox21.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox21_KeyPress); + // + // label21 + // + resources.ApplyResources(this.label21, "label21"); + this.label21.Name = "label21"; + // + // checkBox22 + // + resources.ApplyResources(this.checkBox22, "checkBox22"); + this.checkBox22.Name = "checkBox22"; + this.checkBox22.UseVisualStyleBackColor = true; + // + // comboBox22 + // + resources.ApplyResources(this.comboBox22, "comboBox22"); + this.comboBox22.FormattingEnabled = true; + this.comboBox22.Name = "comboBox22"; + this.comboBox22.SelectedIndexChanged += new System.EventHandler(this.comboBox22_SelectedIndexChanged); + this.comboBox22.TextChanged += new System.EventHandler(this.comboBox22_TextChanged); + this.comboBox22.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox22_KeyPress); + // + // label22 + // + resources.ApplyResources(this.label22, "label22"); + this.label22.Name = "label22"; + // + // checkBox23 + // + resources.ApplyResources(this.checkBox23, "checkBox23"); + this.checkBox23.Name = "checkBox23"; + this.checkBox23.UseVisualStyleBackColor = true; + // + // comboBox23 + // + resources.ApplyResources(this.comboBox23, "comboBox23"); + this.comboBox23.FormattingEnabled = true; + this.comboBox23.Name = "comboBox23"; + this.comboBox23.SelectedIndexChanged += new System.EventHandler(this.comboBox23_SelectedIndexChanged); + this.comboBox23.TextChanged += new System.EventHandler(this.comboBox23_TextChanged); + this.comboBox23.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox23_KeyPress); + // + // label23 + // + resources.ApplyResources(this.label23, "label23"); + this.label23.Name = "label23"; + // + // checkBox24 + // + resources.ApplyResources(this.checkBox24, "checkBox24"); + this.checkBox24.Name = "checkBox24"; + this.checkBox24.UseVisualStyleBackColor = true; + // + // comboBox24 + // + resources.ApplyResources(this.comboBox24, "comboBox24"); + this.comboBox24.FormattingEnabled = true; + this.comboBox24.Name = "comboBox24"; + this.comboBox24.SelectedIndexChanged += new System.EventHandler(this.comboBox24_SelectedIndexChanged); + this.comboBox24.TextChanged += new System.EventHandler(this.comboBox24_TextChanged); + this.comboBox24.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox24_KeyPress); + // + // label24 + // + resources.ApplyResources(this.label24, "label24"); + this.label24.Name = "label24"; + // + // checkBox48 + // + resources.ApplyResources(this.checkBox48, "checkBox48"); + this.checkBox48.Name = "checkBox48"; + this.checkBox48.UseVisualStyleBackColor = true; + // + // comboBox48 + // + resources.ApplyResources(this.comboBox48, "comboBox48"); + this.comboBox48.FormattingEnabled = true; + this.comboBox48.Name = "comboBox48"; + this.comboBox48.SelectedIndexChanged += new System.EventHandler(this.comboBox48_SelectedIndexChanged); + this.comboBox48.TextChanged += new System.EventHandler(this.comboBox48_TextChanged); + this.comboBox48.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox48_KeyPress); + // + // label48 + // + resources.ApplyResources(this.label48, "label48"); + this.label48.Name = "label48"; + // + // checkBox47 + // + resources.ApplyResources(this.checkBox47, "checkBox47"); + this.checkBox47.Name = "checkBox47"; + this.checkBox47.UseVisualStyleBackColor = true; + // + // comboBox47 + // + resources.ApplyResources(this.comboBox47, "comboBox47"); + this.comboBox47.FormattingEnabled = true; + this.comboBox47.Name = "comboBox47"; + this.comboBox47.SelectedIndexChanged += new System.EventHandler(this.comboBox47_SelectedIndexChanged); + this.comboBox47.TextChanged += new System.EventHandler(this.comboBox47_TextChanged); + this.comboBox47.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox47_KeyPress); + // + // label47 + // + resources.ApplyResources(this.label47, "label47"); + this.label47.Name = "label47"; + // + // checkBox46 + // + resources.ApplyResources(this.checkBox46, "checkBox46"); + this.checkBox46.Name = "checkBox46"; + this.checkBox46.UseVisualStyleBackColor = true; + // + // comboBox46 + // + resources.ApplyResources(this.comboBox46, "comboBox46"); + this.comboBox46.FormattingEnabled = true; + this.comboBox46.Name = "comboBox46"; + this.comboBox46.SelectedIndexChanged += new System.EventHandler(this.comboBox46_SelectedIndexChanged); + this.comboBox46.TextChanged += new System.EventHandler(this.comboBox46_TextChanged); + this.comboBox46.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox46_KeyPress); + // + // label46 + // + resources.ApplyResources(this.label46, "label46"); + this.label46.Name = "label46"; + // + // checkBox45 + // + resources.ApplyResources(this.checkBox45, "checkBox45"); + this.checkBox45.Name = "checkBox45"; + this.checkBox45.UseVisualStyleBackColor = true; + // + // comboBox45 + // + resources.ApplyResources(this.comboBox45, "comboBox45"); + this.comboBox45.FormattingEnabled = true; + this.comboBox45.Name = "comboBox45"; + this.comboBox45.SelectedIndexChanged += new System.EventHandler(this.comboBox45_SelectedIndexChanged); + this.comboBox45.TextChanged += new System.EventHandler(this.comboBox45_TextChanged); + this.comboBox45.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox45_KeyPress); + // + // label45 + // + resources.ApplyResources(this.label45, "label45"); + this.label45.Name = "label45"; + // + // checkBox44 + // + resources.ApplyResources(this.checkBox44, "checkBox44"); + this.checkBox44.Name = "checkBox44"; + this.checkBox44.UseVisualStyleBackColor = true; + // + // comboBox44 + // + resources.ApplyResources(this.comboBox44, "comboBox44"); + this.comboBox44.FormattingEnabled = true; + this.comboBox44.Name = "comboBox44"; + this.comboBox44.SelectedIndexChanged += new System.EventHandler(this.comboBox44_SelectedIndexChanged); + this.comboBox44.TextChanged += new System.EventHandler(this.comboBox44_TextChanged); + this.comboBox44.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox44_KeyPress); + // + // label44 + // + resources.ApplyResources(this.label44, "label44"); + this.label44.Name = "label44"; + // + // checkBox43 + // + resources.ApplyResources(this.checkBox43, "checkBox43"); + this.checkBox43.Name = "checkBox43"; + this.checkBox43.UseVisualStyleBackColor = true; + // + // comboBox43 + // + resources.ApplyResources(this.comboBox43, "comboBox43"); + this.comboBox43.FormattingEnabled = true; + this.comboBox43.Name = "comboBox43"; + this.comboBox43.SelectedIndexChanged += new System.EventHandler(this.comboBox43_SelectedIndexChanged); + this.comboBox43.TextChanged += new System.EventHandler(this.comboBox43_TextChanged); + this.comboBox43.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox43_KeyPress); + // + // label43 + // + resources.ApplyResources(this.label43, "label43"); + this.label43.Name = "label43"; + // + // checkBox42 + // + resources.ApplyResources(this.checkBox42, "checkBox42"); + this.checkBox42.Name = "checkBox42"; + this.checkBox42.UseVisualStyleBackColor = true; + // + // comboBox42 + // + resources.ApplyResources(this.comboBox42, "comboBox42"); + this.comboBox42.FormattingEnabled = true; + this.comboBox42.Name = "comboBox42"; + this.comboBox42.SelectedIndexChanged += new System.EventHandler(this.comboBox42_SelectedIndexChanged); + this.comboBox42.TextChanged += new System.EventHandler(this.comboBox42_TextChanged); + this.comboBox42.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox42_KeyPress); + // + // label42 + // + resources.ApplyResources(this.label42, "label42"); + this.label42.Name = "label42"; + // + // checkBox41 + // + resources.ApplyResources(this.checkBox41, "checkBox41"); + this.checkBox41.Name = "checkBox41"; + this.checkBox41.UseVisualStyleBackColor = true; + // + // comboBox41 + // + resources.ApplyResources(this.comboBox41, "comboBox41"); + this.comboBox41.FormattingEnabled = true; + this.comboBox41.Name = "comboBox41"; + this.comboBox41.SelectedIndexChanged += new System.EventHandler(this.comboBox41_SelectedIndexChanged); + this.comboBox41.TextChanged += new System.EventHandler(this.comboBox41_TextChanged); + this.comboBox41.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox41_KeyPress); + // + // label41 + // + resources.ApplyResources(this.label41, "label41"); + this.label41.Name = "label41"; + // + // checkBox40 + // + resources.ApplyResources(this.checkBox40, "checkBox40"); + this.checkBox40.Name = "checkBox40"; + this.checkBox40.UseVisualStyleBackColor = true; + // + // comboBox40 + // + resources.ApplyResources(this.comboBox40, "comboBox40"); + this.comboBox40.FormattingEnabled = true; + this.comboBox40.Name = "comboBox40"; + this.comboBox40.SelectedIndexChanged += new System.EventHandler(this.comboBox40_SelectedIndexChanged); + this.comboBox40.TextChanged += new System.EventHandler(this.comboBox40_TextChanged); + this.comboBox40.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox40_KeyPress); + // + // label40 + // + resources.ApplyResources(this.label40, "label40"); + this.label40.Name = "label40"; + // + // checkBox39 + // + resources.ApplyResources(this.checkBox39, "checkBox39"); + this.checkBox39.Name = "checkBox39"; + this.checkBox39.UseVisualStyleBackColor = true; + // + // comboBox39 + // + resources.ApplyResources(this.comboBox39, "comboBox39"); + this.comboBox39.FormattingEnabled = true; + this.comboBox39.Name = "comboBox39"; + this.comboBox39.SelectedIndexChanged += new System.EventHandler(this.comboBox39_SelectedIndexChanged); + this.comboBox39.TextChanged += new System.EventHandler(this.comboBox39_TextChanged); + this.comboBox39.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox39_KeyPress); + // + // label39 + // + resources.ApplyResources(this.label39, "label39"); + this.label39.Name = "label39"; + // + // checkBox38 + // + resources.ApplyResources(this.checkBox38, "checkBox38"); + this.checkBox38.Name = "checkBox38"; + this.checkBox38.UseVisualStyleBackColor = true; + // + // comboBox38 + // + resources.ApplyResources(this.comboBox38, "comboBox38"); + this.comboBox38.FormattingEnabled = true; + this.comboBox38.Name = "comboBox38"; + this.comboBox38.SelectedIndexChanged += new System.EventHandler(this.comboBox38_SelectedIndexChanged); + this.comboBox38.TextChanged += new System.EventHandler(this.comboBox38_TextChanged); + this.comboBox38.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox38_KeyPress); + // + // label38 + // + resources.ApplyResources(this.label38, "label38"); + this.label38.Name = "label38"; + // + // checkBox37 + // + resources.ApplyResources(this.checkBox37, "checkBox37"); + this.checkBox37.Name = "checkBox37"; + this.checkBox37.UseVisualStyleBackColor = true; + // + // comboBox37 + // + resources.ApplyResources(this.comboBox37, "comboBox37"); + this.comboBox37.FormattingEnabled = true; + this.comboBox37.Name = "comboBox37"; + this.comboBox37.SelectedIndexChanged += new System.EventHandler(this.comboBox37_SelectedIndexChanged); + this.comboBox37.TextChanged += new System.EventHandler(this.comboBox37_TextChanged); + this.comboBox37.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox37_KeyPress); + // + // label37 + // + resources.ApplyResources(this.label37, "label37"); + this.label37.Name = "label37"; + // + // checkBox36 + // + resources.ApplyResources(this.checkBox36, "checkBox36"); + this.checkBox36.Name = "checkBox36"; + this.checkBox36.UseVisualStyleBackColor = true; + // + // comboBox36 + // + resources.ApplyResources(this.comboBox36, "comboBox36"); + this.comboBox36.FormattingEnabled = true; + this.comboBox36.Name = "comboBox36"; + this.comboBox36.SelectedIndexChanged += new System.EventHandler(this.comboBox36_SelectedIndexChanged); + this.comboBox36.TextChanged += new System.EventHandler(this.comboBox36_TextChanged); + this.comboBox36.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox36_KeyPress); + // + // label36 + // + resources.ApplyResources(this.label36, "label36"); + this.label36.Name = "label36"; + // + // checkBox35 + // + resources.ApplyResources(this.checkBox35, "checkBox35"); + this.checkBox35.Name = "checkBox35"; + this.checkBox35.UseVisualStyleBackColor = true; + // + // comboBox35 + // + resources.ApplyResources(this.comboBox35, "comboBox35"); + this.comboBox35.FormattingEnabled = true; + this.comboBox35.Name = "comboBox35"; + this.comboBox35.SelectedIndexChanged += new System.EventHandler(this.comboBox35_SelectedIndexChanged); + this.comboBox35.TextChanged += new System.EventHandler(this.comboBox35_TextChanged); + this.comboBox35.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox35_KeyPress); + // + // label35 + // + resources.ApplyResources(this.label35, "label35"); + this.label35.Name = "label35"; + // + // checkBox34 + // + resources.ApplyResources(this.checkBox34, "checkBox34"); + this.checkBox34.Name = "checkBox34"; + this.checkBox34.UseVisualStyleBackColor = true; + // + // comboBox34 + // + resources.ApplyResources(this.comboBox34, "comboBox34"); + this.comboBox34.FormattingEnabled = true; + this.comboBox34.Name = "comboBox34"; + this.comboBox34.SelectedIndexChanged += new System.EventHandler(this.comboBox34_SelectedIndexChanged); + this.comboBox34.TextChanged += new System.EventHandler(this.comboBox34_TextChanged); + this.comboBox34.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox34_KeyPress); + // + // label34 + // + resources.ApplyResources(this.label34, "label34"); + this.label34.Name = "label34"; + // + // checkBox33 + // + resources.ApplyResources(this.checkBox33, "checkBox33"); + this.checkBox33.Name = "checkBox33"; + this.checkBox33.UseVisualStyleBackColor = true; + // + // comboBox33 + // + resources.ApplyResources(this.comboBox33, "comboBox33"); + this.comboBox33.FormattingEnabled = true; + this.comboBox33.Name = "comboBox33"; + this.comboBox33.TextChanged += new System.EventHandler(this.comboBox33_TextChanged); + this.comboBox33.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox33_KeyPress); + // + // label33 + // + resources.ApplyResources(this.label33, "label33"); + this.label33.Name = "label33"; + // + // checkBox32 + // + resources.ApplyResources(this.checkBox32, "checkBox32"); + this.checkBox32.Name = "checkBox32"; + this.checkBox32.UseVisualStyleBackColor = true; + // + // comboBox32 + // + resources.ApplyResources(this.comboBox32, "comboBox32"); + this.comboBox32.FormattingEnabled = true; + this.comboBox32.Name = "comboBox32"; + this.comboBox32.SelectedIndexChanged += new System.EventHandler(this.comboBox32_SelectedIndexChanged); + this.comboBox32.TextChanged += new System.EventHandler(this.comboBox32_TextChanged); + this.comboBox32.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox32_KeyPress); + // + // label32 + // + resources.ApplyResources(this.label32, "label32"); + this.label32.Name = "label32"; + // + // checkBox31 + // + resources.ApplyResources(this.checkBox31, "checkBox31"); + this.checkBox31.Name = "checkBox31"; + this.checkBox31.UseVisualStyleBackColor = true; + // + // comboBox31 + // + resources.ApplyResources(this.comboBox31, "comboBox31"); + this.comboBox31.FormattingEnabled = true; + this.comboBox31.Name = "comboBox31"; + this.comboBox31.SelectedIndexChanged += new System.EventHandler(this.comboBox31_SelectedIndexChanged); + this.comboBox31.TextChanged += new System.EventHandler(this.comboBox31_TextChanged); + this.comboBox31.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox31_KeyPress); + // + // label31 + // + resources.ApplyResources(this.label31, "label31"); + this.label31.Name = "label31"; + // + // checkBox30 + // + resources.ApplyResources(this.checkBox30, "checkBox30"); + this.checkBox30.Name = "checkBox30"; + this.checkBox30.UseVisualStyleBackColor = true; + // + // comboBox30 + // + resources.ApplyResources(this.comboBox30, "comboBox30"); + this.comboBox30.FormattingEnabled = true; + this.comboBox30.Name = "comboBox30"; + this.comboBox30.SelectedIndexChanged += new System.EventHandler(this.comboBox30_SelectedIndexChanged); + this.comboBox30.TextChanged += new System.EventHandler(this.comboBox30_TextChanged); + this.comboBox30.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox30_KeyPress); + // + // label30 + // + resources.ApplyResources(this.label30, "label30"); + this.label30.Name = "label30"; + // + // checkBox29 + // + resources.ApplyResources(this.checkBox29, "checkBox29"); + this.checkBox29.Name = "checkBox29"; + this.checkBox29.UseVisualStyleBackColor = true; + // + // comboBox29 + // + resources.ApplyResources(this.comboBox29, "comboBox29"); + this.comboBox29.FormattingEnabled = true; + this.comboBox29.Name = "comboBox29"; + this.comboBox29.SelectedIndexChanged += new System.EventHandler(this.comboBox29_SelectedIndexChanged); + this.comboBox29.TextChanged += new System.EventHandler(this.comboBox29_TextChanged); + this.comboBox29.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox29_KeyPress); + // + // label29 + // + resources.ApplyResources(this.label29, "label29"); + this.label29.Name = "label29"; + // + // checkBox28 + // + resources.ApplyResources(this.checkBox28, "checkBox28"); + this.checkBox28.Name = "checkBox28"; + this.checkBox28.UseVisualStyleBackColor = true; + // + // comboBox28 + // + resources.ApplyResources(this.comboBox28, "comboBox28"); + this.comboBox28.FormattingEnabled = true; + this.comboBox28.Name = "comboBox28"; + this.comboBox28.SelectedIndexChanged += new System.EventHandler(this.comboBox28_SelectedIndexChanged); + this.comboBox28.TextChanged += new System.EventHandler(this.comboBox28_TextChanged); + this.comboBox28.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox28_KeyPress); + // + // label28 + // + resources.ApplyResources(this.label28, "label28"); + this.label28.Name = "label28"; + // + // checkBox27 + // + resources.ApplyResources(this.checkBox27, "checkBox27"); + this.checkBox27.Name = "checkBox27"; + this.checkBox27.UseVisualStyleBackColor = true; + // + // comboBox27 + // + resources.ApplyResources(this.comboBox27, "comboBox27"); + this.comboBox27.FormattingEnabled = true; + this.comboBox27.Name = "comboBox27"; + this.comboBox27.SelectedIndexChanged += new System.EventHandler(this.comboBox27_SelectedIndexChanged); + this.comboBox27.TextChanged += new System.EventHandler(this.comboBox27_TextChanged); + this.comboBox27.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox27_KeyPress); + // + // label27 + // + resources.ApplyResources(this.label27, "label27"); + this.label27.Name = "label27"; + // + // checkBox26 + // + resources.ApplyResources(this.checkBox26, "checkBox26"); + this.checkBox26.Name = "checkBox26"; + this.checkBox26.UseVisualStyleBackColor = true; + // + // comboBox26 + // + resources.ApplyResources(this.comboBox26, "comboBox26"); + this.comboBox26.FormattingEnabled = true; + this.comboBox26.Name = "comboBox26"; + this.comboBox26.SelectedIndexChanged += new System.EventHandler(this.comboBox26_SelectedIndexChanged); + this.comboBox26.TextChanged += new System.EventHandler(this.comboBox26_TextChanged); + this.comboBox26.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox26_KeyPress); + // + // label26 + // + resources.ApplyResources(this.label26, "label26"); + this.label26.Name = "label26"; + // + // checkBox25 + // + resources.ApplyResources(this.checkBox25, "checkBox25"); + this.checkBox25.Name = "checkBox25"; + this.checkBox25.UseVisualStyleBackColor = true; + // + // comboBox25 + // + resources.ApplyResources(this.comboBox25, "comboBox25"); + this.comboBox25.FormattingEnabled = true; + this.comboBox25.Name = "comboBox25"; + this.comboBox25.SelectedIndexChanged += new System.EventHandler(this.comboBox25_SelectedIndexChanged); + this.comboBox25.TextChanged += new System.EventHandler(this.comboBox25_TextChanged); + this.comboBox25.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox25_KeyPress); + // + // label25 + // + resources.ApplyResources(this.label25, "label25"); + this.label25.Name = "label25"; + // + // CycleBeginningForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.Controls.Add(this.checkBox48); + this.Controls.Add(this.comboBox48); + this.Controls.Add(this.label48); + this.Controls.Add(this.checkBox47); + this.Controls.Add(this.comboBox47); + this.Controls.Add(this.label47); + this.Controls.Add(this.checkBox46); + this.Controls.Add(this.comboBox46); + this.Controls.Add(this.label46); + this.Controls.Add(this.checkBox45); + this.Controls.Add(this.comboBox45); + this.Controls.Add(this.label45); + this.Controls.Add(this.checkBox44); + this.Controls.Add(this.comboBox44); + this.Controls.Add(this.label44); + this.Controls.Add(this.checkBox43); + this.Controls.Add(this.comboBox43); + this.Controls.Add(this.label43); + this.Controls.Add(this.checkBox42); + this.Controls.Add(this.comboBox42); + this.Controls.Add(this.label42); + this.Controls.Add(this.checkBox41); + this.Controls.Add(this.comboBox41); + this.Controls.Add(this.label41); + this.Controls.Add(this.checkBox40); + this.Controls.Add(this.comboBox40); + this.Controls.Add(this.label40); + this.Controls.Add(this.checkBox39); + this.Controls.Add(this.comboBox39); + this.Controls.Add(this.label39); + this.Controls.Add(this.checkBox38); + this.Controls.Add(this.comboBox38); + this.Controls.Add(this.label38); + this.Controls.Add(this.checkBox37); + this.Controls.Add(this.comboBox37); + this.Controls.Add(this.label37); + this.Controls.Add(this.checkBox36); + this.Controls.Add(this.comboBox36); + this.Controls.Add(this.label36); + this.Controls.Add(this.checkBox35); + this.Controls.Add(this.comboBox35); + this.Controls.Add(this.label35); + this.Controls.Add(this.checkBox34); + this.Controls.Add(this.comboBox34); + this.Controls.Add(this.label34); + this.Controls.Add(this.checkBox33); + this.Controls.Add(this.comboBox33); + this.Controls.Add(this.label33); + this.Controls.Add(this.checkBox32); + this.Controls.Add(this.comboBox32); + this.Controls.Add(this.label32); + this.Controls.Add(this.checkBox31); + this.Controls.Add(this.comboBox31); + this.Controls.Add(this.label31); + this.Controls.Add(this.checkBox30); + this.Controls.Add(this.comboBox30); + this.Controls.Add(this.label30); + this.Controls.Add(this.checkBox29); + this.Controls.Add(this.comboBox29); + this.Controls.Add(this.label29); + this.Controls.Add(this.checkBox28); + this.Controls.Add(this.comboBox28); + this.Controls.Add(this.label28); + this.Controls.Add(this.checkBox27); + this.Controls.Add(this.comboBox27); + this.Controls.Add(this.label27); + this.Controls.Add(this.checkBox26); + this.Controls.Add(this.comboBox26); + this.Controls.Add(this.label26); + this.Controls.Add(this.checkBox25); + this.Controls.Add(this.comboBox25); + this.Controls.Add(this.label25); + this.Controls.Add(this.checkBox24); + this.Controls.Add(this.comboBox24); + this.Controls.Add(this.label24); + this.Controls.Add(this.checkBox23); + this.Controls.Add(this.comboBox23); + this.Controls.Add(this.label23); + this.Controls.Add(this.checkBox22); + this.Controls.Add(this.comboBox22); + this.Controls.Add(this.label22); + this.Controls.Add(this.checkBox21); + this.Controls.Add(this.comboBox21); + this.Controls.Add(this.label21); + this.Controls.Add(this.checkBox20); + this.Controls.Add(this.comboBox20); + this.Controls.Add(this.label20); + this.Controls.Add(this.checkBox19); + this.Controls.Add(this.comboBox19); + this.Controls.Add(this.label19); + this.Controls.Add(this.checkBox18); + this.Controls.Add(this.comboBox18); + this.Controls.Add(this.label18); + this.Controls.Add(this.checkBox17); + this.Controls.Add(this.comboBox17); + this.Controls.Add(this.label17); + this.Controls.Add(this.checkBox16); + this.Controls.Add(this.comboBox16); + this.Controls.Add(this.label16); + this.Controls.Add(this.checkBox15); + this.Controls.Add(this.comboBox15); + this.Controls.Add(this.label15); + this.Controls.Add(this.checkBox14); + this.Controls.Add(this.comboBox14); + this.Controls.Add(this.label14); + this.Controls.Add(this.checkBox13); + this.Controls.Add(this.comboBox13); + this.Controls.Add(this.label13); + this.Controls.Add(this.checkBox12); + this.Controls.Add(this.comboBox12); + this.Controls.Add(this.label12); + this.Controls.Add(this.checkBox11); + this.Controls.Add(this.comboBox11); + this.Controls.Add(this.label11); + this.Controls.Add(this.checkBox10); + this.Controls.Add(this.comboBox10); + this.Controls.Add(this.label10); + this.Controls.Add(this.checkBox9); + this.Controls.Add(this.comboBox9); + this.Controls.Add(this.label9); + this.Controls.Add(this.checkBox8); + this.Controls.Add(this.comboBox8); + this.Controls.Add(this.label8); + this.Controls.Add(this.checkBox7); + this.Controls.Add(this.comboBox7); + this.Controls.Add(this.label7); + this.Controls.Add(this.checkBox6); + this.Controls.Add(this.comboBox6); + this.Controls.Add(this.label6); + this.Controls.Add(this.checkBox5); + this.Controls.Add(this.comboBox5); + this.Controls.Add(this.label5); + this.Controls.Add(this.checkBox4); + this.Controls.Add(this.comboBox4); + this.Controls.Add(this.label4); + this.Controls.Add(this.checkBox3); + this.Controls.Add(this.comboBox3); + this.Controls.Add(this.label3); + this.Controls.Add(this.checkBox2); + this.Controls.Add(this.comboBox2); + this.Controls.Add(this.label2); + this.Controls.Add(this.checkBox1); + this.Controls.Add(this.comboBox1); + this.Controls.Add(this.label1); + this.Controls.Add(this.clearButton); + this.Controls.Add(this.orderGroupBox); + this.Controls.Add(this.okButton); + this.ForeColor = System.Drawing.Color.Black; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "CycleBeginningForm"; + this.TopMost = true; + this.Load += new System.EventHandler(this.CycleBeginningForm_Load); + this.orderGroupBox.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.GroupBox orderGroupBox; + private System.Windows.Forms.ComboBox orderComboBox; + private System.Windows.Forms.Button clearButton; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox comboBox1; + private System.Windows.Forms.CheckBox checkBox1; + private System.Windows.Forms.CheckBox checkBox2; + private System.Windows.Forms.ComboBox comboBox2; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.CheckBox checkBox3; + private System.Windows.Forms.ComboBox comboBox3; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.CheckBox checkBox4; + private System.Windows.Forms.ComboBox comboBox4; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.CheckBox checkBox5; + private System.Windows.Forms.ComboBox comboBox5; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.CheckBox checkBox6; + private System.Windows.Forms.ComboBox comboBox6; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.CheckBox checkBox7; + private System.Windows.Forms.ComboBox comboBox7; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.CheckBox checkBox8; + private System.Windows.Forms.ComboBox comboBox8; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.CheckBox checkBox9; + private System.Windows.Forms.ComboBox comboBox9; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.CheckBox checkBox10; + private System.Windows.Forms.ComboBox comboBox10; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.CheckBox checkBox11; + private System.Windows.Forms.ComboBox comboBox11; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.CheckBox checkBox12; + private System.Windows.Forms.ComboBox comboBox12; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.CheckBox checkBox13; + private System.Windows.Forms.ComboBox comboBox13; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.CheckBox checkBox14; + private System.Windows.Forms.ComboBox comboBox14; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.CheckBox checkBox15; + private System.Windows.Forms.ComboBox comboBox15; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.CheckBox checkBox16; + private System.Windows.Forms.ComboBox comboBox16; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.CheckBox checkBox17; + private System.Windows.Forms.ComboBox comboBox17; + private System.Windows.Forms.Label label17; + private System.Windows.Forms.CheckBox checkBox18; + private System.Windows.Forms.ComboBox comboBox18; + private System.Windows.Forms.Label label18; + private System.Windows.Forms.CheckBox checkBox19; + private System.Windows.Forms.ComboBox comboBox19; + private System.Windows.Forms.Label label19; + private System.Windows.Forms.CheckBox checkBox20; + private System.Windows.Forms.ComboBox comboBox20; + private System.Windows.Forms.Label label20; + private System.Windows.Forms.CheckBox checkBox21; + private System.Windows.Forms.ComboBox comboBox21; + private System.Windows.Forms.Label label21; + private System.Windows.Forms.CheckBox checkBox22; + private System.Windows.Forms.ComboBox comboBox22; + private System.Windows.Forms.Label label22; + private System.Windows.Forms.CheckBox checkBox23; + private System.Windows.Forms.ComboBox comboBox23; + private System.Windows.Forms.Label label23; + private System.Windows.Forms.CheckBox checkBox24; + private System.Windows.Forms.ComboBox comboBox24; + private System.Windows.Forms.Label label24; + private System.Windows.Forms.CheckBox checkBox48; + private System.Windows.Forms.ComboBox comboBox48; + private System.Windows.Forms.Label label48; + private System.Windows.Forms.CheckBox checkBox47; + private System.Windows.Forms.ComboBox comboBox47; + private System.Windows.Forms.Label label47; + private System.Windows.Forms.CheckBox checkBox46; + private System.Windows.Forms.ComboBox comboBox46; + private System.Windows.Forms.Label label46; + private System.Windows.Forms.CheckBox checkBox45; + private System.Windows.Forms.ComboBox comboBox45; + private System.Windows.Forms.Label label45; + private System.Windows.Forms.CheckBox checkBox44; + private System.Windows.Forms.ComboBox comboBox44; + private System.Windows.Forms.Label label44; + private System.Windows.Forms.CheckBox checkBox43; + private System.Windows.Forms.ComboBox comboBox43; + private System.Windows.Forms.Label label43; + private System.Windows.Forms.CheckBox checkBox42; + private System.Windows.Forms.ComboBox comboBox42; + private System.Windows.Forms.Label label42; + private System.Windows.Forms.CheckBox checkBox41; + private System.Windows.Forms.ComboBox comboBox41; + private System.Windows.Forms.Label label41; + private System.Windows.Forms.CheckBox checkBox40; + private System.Windows.Forms.ComboBox comboBox40; + private System.Windows.Forms.Label label40; + private System.Windows.Forms.CheckBox checkBox39; + private System.Windows.Forms.ComboBox comboBox39; + private System.Windows.Forms.Label label39; + private System.Windows.Forms.CheckBox checkBox38; + private System.Windows.Forms.ComboBox comboBox38; + private System.Windows.Forms.Label label38; + private System.Windows.Forms.CheckBox checkBox37; + private System.Windows.Forms.ComboBox comboBox37; + private System.Windows.Forms.Label label37; + private System.Windows.Forms.CheckBox checkBox36; + private System.Windows.Forms.ComboBox comboBox36; + private System.Windows.Forms.Label label36; + private System.Windows.Forms.CheckBox checkBox35; + private System.Windows.Forms.ComboBox comboBox35; + private System.Windows.Forms.Label label35; + private System.Windows.Forms.CheckBox checkBox34; + private System.Windows.Forms.ComboBox comboBox34; + private System.Windows.Forms.Label label34; + private System.Windows.Forms.CheckBox checkBox33; + private System.Windows.Forms.ComboBox comboBox33; + private System.Windows.Forms.Label label33; + private System.Windows.Forms.CheckBox checkBox32; + private System.Windows.Forms.ComboBox comboBox32; + private System.Windows.Forms.Label label32; + private System.Windows.Forms.CheckBox checkBox31; + private System.Windows.Forms.ComboBox comboBox31; + private System.Windows.Forms.Label label31; + private System.Windows.Forms.CheckBox checkBox30; + private System.Windows.Forms.ComboBox comboBox30; + private System.Windows.Forms.Label label30; + private System.Windows.Forms.CheckBox checkBox29; + private System.Windows.Forms.ComboBox comboBox29; + private System.Windows.Forms.Label label29; + private System.Windows.Forms.CheckBox checkBox28; + private System.Windows.Forms.ComboBox comboBox28; + private System.Windows.Forms.Label label28; + private System.Windows.Forms.CheckBox checkBox27; + private System.Windows.Forms.ComboBox comboBox27; + private System.Windows.Forms.Label label27; + private System.Windows.Forms.CheckBox checkBox26; + private System.Windows.Forms.ComboBox comboBox26; + private System.Windows.Forms.Label label26; + private System.Windows.Forms.CheckBox checkBox25; + private System.Windows.Forms.ComboBox comboBox25; + private System.Windows.Forms.Label label25; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/CycleBeginningForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/CycleBeginningForm.cs new file mode 100644 index 00000000..97630e0b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/CycleBeginningForm.cs @@ -0,0 +1,739 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using log4net; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.Standard48 +{ + public partial class CycleBeginningForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(CycleBeginningForm)); + + /// Number of water meters + public readonly int WaterMetersCount; + + /// To be retrieved after the form is closed + public string PurchaseOrder; + public string[] SNText; + public bool[] Disabled; + + /// Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + /// Number of text boxes for serial numbers + int textBoxesCount; + Label[] labels; + ComboBox[] comboBoxes; + CheckBox[] checkBoxes; + IList enabledComboBoxes; + + + /// Parameterless constructor for common functionality + public CycleBeginningForm() + { + InitializeComponent(); + ControlBox = false; + + textBoxesCount = 48; + labels = new Label[] + { + label1, label2, label3, label4, label5, label6, label7, label8, label9, label10, + label11, label12, label13, label14, label15, label16, label17, label18, label19, label20, + label21, label22, label23, label24, label25, label26, label27, label28, label29, label30, + label31, label32, label33, label34, label35, label36, label37, label38, label39, label40, + label41, label42, label43, label44, label45, label46, label47, label48, + }; + comboBoxes = new ComboBox[] + { + comboBox1, comboBox2, comboBox3, comboBox4, comboBox5, comboBox6, comboBox7, comboBox8, comboBox9, comboBox10, + comboBox11, comboBox12, comboBox13, comboBox14, comboBox15, comboBox16, comboBox17, comboBox18, comboBox19, comboBox20, + comboBox21, comboBox22, comboBox23, comboBox24, comboBox25, comboBox26, comboBox27, comboBox28, comboBox29, comboBox30, + comboBox31, comboBox32, comboBox33, comboBox34, comboBox35, comboBox36, comboBox37, comboBox38, comboBox39, comboBox40, + comboBox41, comboBox42, comboBox43, comboBox44, comboBox45, comboBox46, comboBox47, comboBox48, + }; + checkBoxes = new CheckBox[] + { + checkBox1, checkBox2, checkBox3, checkBox4, checkBox5, checkBox6, checkBox7, checkBox8, checkBox9, checkBox10, + checkBox11, checkBox12, checkBox13, checkBox14, checkBox15, checkBox16, checkBox17, checkBox18, checkBox19, checkBox20, + checkBox21, checkBox22, checkBox23, checkBox24, checkBox25, checkBox26, checkBox27, checkBox28, checkBox29, checkBox30, + checkBox31, checkBox32, checkBox33, checkBox34, checkBox35, checkBox36, checkBox37, checkBox38, checkBox39, checkBox40, + checkBox41, checkBox42, checkBox43, checkBox44, checkBox45, checkBox46, checkBox47, checkBox48, + }; + enabledComboBoxes = new List(); + + completed = false; + StartForceCloseHandler(); + } + + /// + /// Constructor + /// + /// Number of text boxes for serial numbers + public CycleBeginningForm(int waterMetersCount) + : this() + { + this.WaterMetersCount = waterMetersCount; + SNText = new string[WaterMetersCount]; + Disabled = new bool[WaterMetersCount]; + + ShuffleTextBoxes(Config.Data.WMsCount, Config.Data.LineSize); + + //Height = 147 + WaterMetersCount * 90; + } + + /// + /// 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) + { + if (wmsCount < textBoxesCount && lineSize > 0) + { + int nrLines = (wmsCount + lineSize - 1) / lineSize; + int gap = (textBoxesCount - wmsCount) / nrLines; + + int dest = 0; + for (int l = 0; l < nrLines; l++) + { + for (int i = 0; i < lineSize; i++) + { + labels[dest] = labels[l * lineSize + l * gap + i]; + comboBoxes[dest] = comboBoxes[l * lineSize + l * gap + i]; + checkBoxes[dest] = checkBoxes[l * lineSize + l * gap + i]; + dest++; + } + } + textBoxesCount = wmsCount; + } + } + + private void CycleBeginningForm_Load(object sender, EventArgs e) + { + Localize(); + + PrepareOrderCombo(orderComboBox); + + for (int i = 0; i < textBoxesCount; i++) + { + if (Program.LocalSettings.LastSNTextsCount == textBoxesCount) + { + comboBoxes[i].Items.Add((Program.LocalSettings.LastSNTexts[i] == null) ? string.Empty : Program.LocalSettings.LastSNTexts[i]); + } + labels[i].Visible = comboBoxes[i].Visible = checkBoxes[i].Visible = true; + enabledComboBoxes.Add(comboBoxes[i]); + } + } + + void Localize() + { + Text = Strings.Data; + orderGroupBox.Text = Strings.Purchase_order; + for (int i = 0; i < textBoxesCount; i++) + { + labels[i].Text = Strings.Serial_Number + " " + (i + 1).ToString(); + } + okButton.Text = Strings.OkBtnText; + clearButton.Text = Strings.ClearBtnText; + } + + /// + /// Load Purchase order combo box items from the LocalSettings PurchaseOrderHistory array + /// + /// Puchase order ComboBox + void PrepareOrderCombo(ComboBox orderComboBox) + { + for (int i = 0; i < Program.LocalSettings.PurchaseOrderHistoryCount; i++) + { + orderComboBox.Items.Add(Program.LocalSettings.PurchaseOrderHistory[i]); + } + + if (orderComboBox.Items.Count > 0) + { + orderComboBox.Text = orderComboBox.Items[0].ToString(); + } + } + + private void okButton_Click(object sender, EventArgs e) + { + PurchaseOrder = orderComboBox.Text; + Program.LocalSettings.UpdateHistory(orderComboBox.Text, + ref Program.LocalSettings.PurchaseOrderHistory +#if FUZHOU150 || FUZHOU300 + , 20 +#endif + ); + + Program.LocalSettings.LastSNTexts = SNText; + + for (int i = 0; i < Math.Min(WaterMetersCount, textBoxesCount); i++) + { + SNText[i] = comboBoxes[i].Text; + Disabled[i] = !checkBoxes[i].Checked; + } + + completed = true; + Close(); + } + + /// + /// When one combo box is updated using drop-down menu, all combo boxes + /// are updated by this function. + /// + private void UpdateAllCombos() + { + for (int i = 0; i < Math.Min(WaterMetersCount, textBoxesCount); i++) + { + comboBoxes[i].Text = Program.LocalSettings.LastSNTexts[i]; + checkBoxes[i].Checked = !string.IsNullOrEmpty(comboBoxes[i].Text); + } + } + + private void clearButton_Click(object sender, EventArgs e) + { + for (int i = 0; i < Math.Min(WaterMetersCount, textBoxesCount); i++) + { + comboBoxes[i].Text = string.Empty; + checkBoxes[i].Checked = false; + } + } + + + private void comboBox1_TextChanged(object sender, EventArgs e) { checkBox1.Checked = true; } + private void comboBox2_TextChanged(object sender, EventArgs e) { checkBox2.Checked = true; } + private void comboBox3_TextChanged(object sender, EventArgs e) { checkBox3.Checked = true; } + private void comboBox4_TextChanged(object sender, EventArgs e) { checkBox4.Checked = true; } + private void comboBox5_TextChanged(object sender, EventArgs e) { checkBox5.Checked = true; } + private void comboBox6_TextChanged(object sender, EventArgs e) { checkBox6.Checked = true; } + private void comboBox7_TextChanged(object sender, EventArgs e) { checkBox7.Checked = true; } + private void comboBox8_TextChanged(object sender, EventArgs e) { checkBox8.Checked = true; } + private void comboBox9_TextChanged(object sender, EventArgs e) { checkBox9.Checked = true; } + private void comboBox10_TextChanged(object sender, EventArgs e) { checkBox10.Checked = true; } + private void comboBox11_TextChanged(object sender, EventArgs e) { checkBox11.Checked = true; } + private void comboBox12_TextChanged(object sender, EventArgs e) { checkBox12.Checked = true; } + private void comboBox13_TextChanged(object sender, EventArgs e) { checkBox13.Checked = true; } + private void comboBox14_TextChanged(object sender, EventArgs e) { checkBox14.Checked = true; } + private void comboBox15_TextChanged(object sender, EventArgs e) { checkBox15.Checked = true; } + private void comboBox16_TextChanged(object sender, EventArgs e) { checkBox16.Checked = true; } + private void comboBox17_TextChanged(object sender, EventArgs e) { checkBox17.Checked = true; } + private void comboBox18_TextChanged(object sender, EventArgs e) { checkBox18.Checked = true; } + private void comboBox19_TextChanged(object sender, EventArgs e) { checkBox19.Checked = true; } + private void comboBox20_TextChanged(object sender, EventArgs e) { checkBox20.Checked = true; } + private void comboBox21_TextChanged(object sender, EventArgs e) { checkBox21.Checked = true; } + private void comboBox22_TextChanged(object sender, EventArgs e) { checkBox22.Checked = true; } + private void comboBox23_TextChanged(object sender, EventArgs e) { checkBox23.Checked = true; } + private void comboBox24_TextChanged(object sender, EventArgs e) { checkBox24.Checked = true; } + private void comboBox25_TextChanged(object sender, EventArgs e) { checkBox25.Checked = true; } + private void comboBox26_TextChanged(object sender, EventArgs e) { checkBox26.Checked = true; } + private void comboBox27_TextChanged(object sender, EventArgs e) { checkBox27.Checked = true; } + private void comboBox28_TextChanged(object sender, EventArgs e) { checkBox28.Checked = true; } + private void comboBox29_TextChanged(object sender, EventArgs e) { checkBox29.Checked = true; } + private void comboBox30_TextChanged(object sender, EventArgs e) { checkBox30.Checked = true; } + private void comboBox31_TextChanged(object sender, EventArgs e) { checkBox31.Checked = true; } + private void comboBox32_TextChanged(object sender, EventArgs e) { checkBox32.Checked = true; } + private void comboBox33_TextChanged(object sender, EventArgs e) { checkBox33.Checked = true; } + private void comboBox34_TextChanged(object sender, EventArgs e) { checkBox34.Checked = true; } + private void comboBox35_TextChanged(object sender, EventArgs e) { checkBox35.Checked = true; } + private void comboBox36_TextChanged(object sender, EventArgs e) { checkBox36.Checked = true; } + private void comboBox37_TextChanged(object sender, EventArgs e) { checkBox37.Checked = true; } + private void comboBox38_TextChanged(object sender, EventArgs e) { checkBox38.Checked = true; } + private void comboBox39_TextChanged(object sender, EventArgs e) { checkBox39.Checked = true; } + private void comboBox40_TextChanged(object sender, EventArgs e) { checkBox40.Checked = true; } + private void comboBox41_TextChanged(object sender, EventArgs e) { checkBox41.Checked = true; } + private void comboBox42_TextChanged(object sender, EventArgs e) { checkBox42.Checked = true; } + private void comboBox43_TextChanged(object sender, EventArgs e) { checkBox43.Checked = true; } + private void comboBox44_TextChanged(object sender, EventArgs e) { checkBox44.Checked = true; } + private void comboBox45_TextChanged(object sender, EventArgs e) { checkBox45.Checked = true; } + private void comboBox46_TextChanged(object sender, EventArgs e) { checkBox46.Checked = true; } + private void comboBox47_TextChanged(object sender, EventArgs e) { checkBox47.Checked = true; } + private void comboBox48_TextChanged(object sender, EventArgs e) { checkBox48.Checked = true; } + + private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox1.Text.Equals(comboBox1.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox2_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox2.Text.Equals(comboBox2.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox3_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox3.Text.Equals(comboBox3.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox4_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox4.Text.Equals(comboBox4.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox5_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox5.Text.Equals(comboBox5.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox6_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox6.Text.Equals(comboBox6.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox7_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox7.Text.Equals(comboBox7.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox8_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox8.Text.Equals(comboBox8.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox9_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox9.Text.Equals(comboBox9.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox10_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox10.Text.Equals(comboBox10.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox11_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox11.Text.Equals(comboBox11.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox12_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox12.Text.Equals(comboBox12.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox13_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox13.Text.Equals(comboBox13.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox14_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox14.Text.Equals(comboBox14.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox15_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox15.Text.Equals(comboBox15.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox16_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox16.Text.Equals(comboBox16.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox17_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox17.Text.Equals(comboBox17.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox18_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox18.Text.Equals(comboBox18.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox19_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox19.Text.Equals(comboBox19.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox20_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox20.Text.Equals(comboBox20.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox21_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox21.Text.Equals(comboBox21.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox22_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox22.Text.Equals(comboBox22.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox23_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox23.Text.Equals(comboBox23.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox24_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox24.Text.Equals(comboBox24.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox25_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox25.Text.Equals(comboBox25.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox26_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox26.Text.Equals(comboBox26.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox27_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox27.Text.Equals(comboBox27.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox28_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox28.Text.Equals(comboBox28.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox29_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox29.Text.Equals(comboBox29.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox30_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox30.Text.Equals(comboBox30.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox31_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox31.Text.Equals(comboBox31.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox32_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox32.Text.Equals(comboBox32.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox33_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox33.Text.Equals(comboBox33.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox34_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox34.Text.Equals(comboBox34.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox35_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox35.Text.Equals(comboBox35.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox36_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox36.Text.Equals(comboBox36.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox37_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox37.Text.Equals(comboBox37.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox38_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox38.Text.Equals(comboBox38.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox39_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox39.Text.Equals(comboBox39.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox40_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox40.Text.Equals(comboBox40.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox41_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox41.Text.Equals(comboBox41.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox42_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox42.Text.Equals(comboBox42.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox43_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox43.Text.Equals(comboBox43.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox44_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox44.Text.Equals(comboBox44.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox45_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox45.Text.Equals(comboBox45.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox46_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox46.Text.Equals(comboBox46.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox47_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox47.Text.Equals(comboBox47.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox48_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox48.Text.Equals(comboBox48.Items[0])) UpdateAllCombos(); + } + } + + #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); + }; + } + + private void OnForceClose(object sender, EventArgs args) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + + /// + /// Process a key press within any enabled text boxe + /// + /// + /// + /// TextBox control which received the event + private void ProcKeyPress(object sender, KeyPressEventArgs e, ComboBox currentFocusOwner) + { + if (e.KeyChar == '+') + { + /// Process '+' key ..... Form completed + okButton_Click(sender, e); + } + if (e.KeyChar == '\r') + { + /// Process key ..... Next text field + if (enabledComboBoxes.Count < 2) return; /// There is just one enabled textbox + + for (int i = 0; i < enabledComboBoxes.Count; i++) + { + if (enabledComboBoxes[i] == currentFocusOwner) + { + /// Change focus to the next enabled text box + enabledComboBoxes[(i + 1) % enabledComboBoxes.Count].Focus(); + return; + } + } + } + } + + private void comboBox1_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox1); } + private void comboBox2_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox2); } + private void comboBox3_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox3); } + private void comboBox4_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox4); } + private void comboBox5_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox5); } + private void comboBox6_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox6); } + private void comboBox7_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox7); } + private void comboBox8_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox8); } + private void comboBox9_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox9); } + private void comboBox10_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox10); } + private void comboBox11_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox11); } + private void comboBox12_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox12); } + private void comboBox13_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox13); } + private void comboBox14_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox14); } + private void comboBox15_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox15); } + private void comboBox16_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox16); } + private void comboBox17_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox17); } + private void comboBox18_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox18); } + private void comboBox19_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox19); } + private void comboBox20_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox20); } + private void comboBox21_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox21); } + private void comboBox22_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox22); } + private void comboBox23_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox23); } + private void comboBox24_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox24); } + private void comboBox25_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox25); } + private void comboBox26_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox26); } + private void comboBox27_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox27); } + private void comboBox28_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox28); } + private void comboBox29_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox29); } + private void comboBox30_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox30); } + private void comboBox31_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox31); } + private void comboBox32_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox32); } + private void comboBox33_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox33); } + private void comboBox34_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox34); } + private void comboBox35_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox35); } + private void comboBox36_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox36); } + private void comboBox37_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox37); } + private void comboBox38_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox38); } + private void comboBox39_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox39); } + private void comboBox40_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox40); } + private void comboBox41_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox41); } + private void comboBox42_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox42); } + private void comboBox43_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox43); } + private void comboBox44_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox44); } + private void comboBox45_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox45); } + private void comboBox46_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox46); } + private void comboBox47_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox47); } + private void comboBox48_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox48); } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/CycleBeginningForm.pl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/CycleBeginningForm.pl.resx new file mode 100644 index 00000000..94a1178c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/CycleBeginningForm.pl.resx @@ -0,0 +1,276 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + OK + + + Kolejność + + + Usunąć + + + Nr seryjny 1 + + + Nr seryjny 2 + + + Nr seryjny 3 + + + Nr seryjny 4 + + + Nr seryjny 5 + + + Nr seryjny 6 + + + Nr seryjny 7 + + + Nr seryjny 8 + + + Nr seryjny 9 + + + Nr seryjny 10 + + + Nr seryjny 11 + + + Nr seryjny 12 + + + Nr seryjny 13 + + + Nr seryjny 14 + + + Nr seryjny 15 + + + Nr seryjny 16 + + + Nr seryjny 17 + + + Nr seryjny 18 + + + Nr seryjny 19 + + + Nr seryjny 20 + + + Nr seryjny 21 + + + Nr seryjny 22 + + + Nr seryjny 23 + + + Nr seryjny 24 + + + Nr seryjny 48 + + + Nr seryjny 47 + + + Nr seryjny 46 + + + Nr seryjny 45 + + + Nr seryjny 44 + + + Nr seryjny 43 + + + Nr seryjny 42 + + + Nr seryjny 41 + + + Nr seryjny 40 + + + Nr seryjny 39 + + + Nr seryjny 38 + + + Nr seryjny 37 + + + Nr seryjny 36 + + + Nr seryjny 35 + + + Nr seryjny 34 + + + Nr seryjny 16 + + + Nr seryjny 17 + + + Nr seryjny 18 + + + Nr seryjny 19 + + + Nr seryjny 20 + + + Nr seryjny 21 + + + Nr seryjny 22 + + + Nr seryjny 23 + + + Nr seryjny 24 + + + Dane partii + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/CycleBeginningForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/CycleBeginningForm.resx new file mode 100644 index 00000000..4f0a4524 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/CycleBeginningForm.resx @@ -0,0 +1,4719 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + Verdana, 14.25pt + + + 729, 16 + + + 112, 63 + + + + 7 + + + OK + + + okButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 146 + + + orderComboBox + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + orderGroupBox + + + 0 + + + Verdana, 14.25pt + + + 28, 5 + + + 397, 77 + + + 0 + + + Order + + + orderGroupBox + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 145 + + + 90, 28 + + + 260, 31 + + + 0 + + + orderComboBox + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + orderGroupBox + + + 0 + + + Verdana, 14.25pt + + + + NoControl + + + 582, 16 + + + 112, 63 + + + 8 + + + Clear + + + clearButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 144 + + + True + + + Verdana, 9.75pt + + + 24, 97 + + + 111, 16 + + + 9 + + + Serial Number 1 + + + False + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 143 + + + Verdana, 9.75pt + + + 215, 94 + + + 163, 24 + + + 10 + + + False + + + comboBox1 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 142 + + + True + + + 410, 99 + + + 15, 14 + + + 11 + + + False + + + checkBox1 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 141 + + + True + + + NoControl + + + 410, 128 + + + 15, 14 + + + 14 + + + False + + + checkBox2 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 138 + + + Verdana, 9.75pt + + + 215, 123 + + + 163, 24 + + + 13 + + + False + + + comboBox2 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 139 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 24, 126 + + + 111, 16 + + + 12 + + + Serial Number 2 + + + False + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 140 + + + True + + + NoControl + + + 410, 157 + + + 15, 14 + + + 17 + + + False + + + checkBox3 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 135 + + + Verdana, 9.75pt + + + 215, 152 + + + 163, 24 + + + 16 + + + False + + + comboBox3 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 136 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 24, 155 + + + 111, 16 + + + 15 + + + Serial Number 3 + + + False + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 137 + + + True + + + NoControl + + + 410, 186 + + + 15, 14 + + + 20 + + + False + + + checkBox4 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 132 + + + Verdana, 9.75pt + + + 215, 181 + + + 163, 24 + + + 19 + + + False + + + comboBox4 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 133 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 24, 184 + + + 111, 16 + + + 18 + + + Serial Number 4 + + + False + + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 134 + + + True + + + NoControl + + + 410, 215 + + + 15, 14 + + + 23 + + + False + + + checkBox5 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 129 + + + Verdana, 9.75pt + + + 215, 210 + + + 163, 24 + + + 22 + + + False + + + comboBox5 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 130 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 24, 213 + + + 111, 16 + + + 21 + + + Serial Number 5 + + + False + + + label5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 131 + + + True + + + NoControl + + + 410, 244 + + + 15, 14 + + + 26 + + + False + + + checkBox6 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 126 + + + Verdana, 9.75pt + + + 215, 239 + + + 163, 24 + + + 25 + + + False + + + comboBox6 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 127 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 24, 242 + + + 111, 16 + + + 24 + + + Serial Number 6 + + + False + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 128 + + + True + + + NoControl + + + 410, 273 + + + 15, 14 + + + 29 + + + False + + + checkBox7 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 123 + + + Verdana, 9.75pt + + + 215, 268 + + + 163, 24 + + + 28 + + + False + + + comboBox7 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 124 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 24, 271 + + + 111, 16 + + + 27 + + + Serial Number 7 + + + False + + + label7 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 125 + + + True + + + NoControl + + + 410, 302 + + + 15, 14 + + + 32 + + + False + + + checkBox8 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 120 + + + Verdana, 9.75pt + + + 215, 297 + + + 163, 24 + + + 31 + + + False + + + comboBox8 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 121 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 24, 300 + + + 111, 16 + + + 30 + + + Serial Number 8 + + + False + + + label8 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 122 + + + True + + + NoControl + + + 410, 331 + + + 15, 14 + + + 35 + + + False + + + checkBox9 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 117 + + + Verdana, 9.75pt + + + 215, 326 + + + 163, 24 + + + 34 + + + False + + + comboBox9 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 118 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 24, 329 + + + 111, 16 + + + 33 + + + Serial Number 9 + + + False + + + label9 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 119 + + + True + + + NoControl + + + 410, 360 + + + 15, 14 + + + 38 + + + False + + + checkBox10 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 114 + + + Verdana, 9.75pt + + + 215, 355 + + + 163, 24 + + + 37 + + + False + + + comboBox10 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 115 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 24, 358 + + + 119, 16 + + + 36 + + + Serial Number 10 + + + False + + + label10 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 116 + + + True + + + NoControl + + + 410, 389 + + + 15, 14 + + + 41 + + + False + + + checkBox11 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 111 + + + Verdana, 9.75pt + + + 215, 384 + + + 163, 24 + + + 40 + + + False + + + comboBox11 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 112 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 24, 387 + + + 119, 16 + + + 39 + + + Serial Number 11 + + + False + + + label11 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 113 + + + True + + + NoControl + + + 410, 418 + + + 15, 14 + + + 44 + + + False + + + checkBox12 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 108 + + + Verdana, 9.75pt + + + 215, 413 + + + 163, 24 + + + 43 + + + False + + + comboBox12 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 109 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 24, 416 + + + 119, 16 + + + 42 + + + Serial Number 12 + + + False + + + label12 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 110 + + + True + + + NoControl + + + 410, 447 + + + 15, 14 + + + 47 + + + False + + + checkBox13 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 105 + + + Verdana, 9.75pt + + + 215, 442 + + + 163, 24 + + + 46 + + + False + + + comboBox13 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 106 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 24, 445 + + + 119, 16 + + + 45 + + + Serial Number 13 + + + False + + + label13 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 107 + + + True + + + NoControl + + + 410, 476 + + + 15, 14 + + + 50 + + + False + + + checkBox14 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 102 + + + Verdana, 9.75pt + + + 215, 471 + + + 163, 24 + + + 49 + + + False + + + comboBox14 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 103 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 24, 474 + + + 119, 16 + + + 48 + + + Serial Number 14 + + + False + + + label14 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 104 + + + True + + + NoControl + + + 410, 505 + + + 15, 14 + + + 53 + + + False + + + checkBox15 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 99 + + + Verdana, 9.75pt + + + 215, 500 + + + 163, 24 + + + 52 + + + False + + + comboBox15 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 100 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 24, 503 + + + 119, 16 + + + 51 + + + Serial Number 15 + + + False + + + label15 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 101 + + + True + + + NoControl + + + 410, 534 + + + 15, 14 + + + 56 + + + False + + + checkBox16 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 96 + + + Verdana, 9.75pt + + + 215, 529 + + + 163, 24 + + + 55 + + + False + + + comboBox16 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 97 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 24, 532 + + + 119, 16 + + + 54 + + + Serial Number 16 + + + False + + + label16 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 98 + + + True + + + NoControl + + + 410, 563 + + + 15, 14 + + + 59 + + + False + + + checkBox17 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 93 + + + Verdana, 9.75pt + + + 215, 558 + + + 163, 24 + + + 58 + + + False + + + comboBox17 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 94 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 24, 561 + + + 119, 16 + + + 57 + + + Serial Number 17 + + + False + + + label17 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 95 + + + True + + + NoControl + + + 410, 592 + + + 15, 14 + + + 62 + + + False + + + checkBox18 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 90 + + + Verdana, 9.75pt + + + 215, 587 + + + 163, 24 + + + 61 + + + False + + + comboBox18 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 91 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 24, 590 + + + 119, 16 + + + 60 + + + Serial Number 18 + + + False + + + label18 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 92 + + + True + + + NoControl + + + 410, 621 + + + 15, 14 + + + 65 + + + False + + + checkBox19 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 87 + + + Verdana, 9.75pt + + + 215, 616 + + + 163, 24 + + + 64 + + + False + + + comboBox19 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 88 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 24, 619 + + + 119, 16 + + + 63 + + + Serial Number 19 + + + False + + + label19 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 89 + + + True + + + NoControl + + + 410, 650 + + + 15, 14 + + + 68 + + + False + + + checkBox20 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 84 + + + Verdana, 9.75pt + + + 215, 645 + + + 163, 24 + + + 67 + + + False + + + comboBox20 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 85 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 24, 648 + + + 119, 16 + + + 66 + + + Serial Number 20 + + + False + + + label20 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 86 + + + True + + + NoControl + + + 410, 679 + + + 15, 14 + + + 71 + + + False + + + checkBox21 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 81 + + + Verdana, 9.75pt + + + 215, 674 + + + 163, 24 + + + 70 + + + False + + + comboBox21 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 82 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 24, 677 + + + 119, 16 + + + 69 + + + Serial Number 21 + + + False + + + label21 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 83 + + + True + + + NoControl + + + 410, 708 + + + 15, 14 + + + 74 + + + False + + + checkBox22 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 78 + + + Verdana, 9.75pt + + + 215, 703 + + + 163, 24 + + + 73 + + + False + + + comboBox22 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 79 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 24, 706 + + + 119, 16 + + + 72 + + + Serial Number 22 + + + False + + + label22 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 80 + + + True + + + NoControl + + + 410, 737 + + + 15, 14 + + + 77 + + + False + + + checkBox23 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 75 + + + Verdana, 9.75pt + + + 215, 732 + + + 163, 24 + + + 76 + + + False + + + comboBox23 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 76 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 24, 735 + + + 119, 16 + + + 75 + + + Serial Number 23 + + + False + + + label23 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 77 + + + True + + + NoControl + + + 410, 766 + + + 15, 14 + + + 80 + + + False + + + checkBox24 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 72 + + + Verdana, 9.75pt + + + 215, 761 + + + 163, 24 + + + 79 + + + False + + + comboBox24 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 73 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 24, 764 + + + 119, 16 + + + 78 + + + Serial Number 24 + + + False + + + label24 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 74 + + + True + + + NoControl + + + 873, 766 + + + 15, 14 + + + 152 + + + False + + + checkBox48 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + Verdana, 9.75pt + + + 678, 761 + + + 163, 24 + + + 151 + + + False + + + comboBox48 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 487, 764 + + + 119, 16 + + + 150 + + + Serial Number 48 + + + False + + + label48 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + True + + + NoControl + + + 873, 737 + + + 15, 14 + + + 149 + + + False + + + checkBox47 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + Verdana, 9.75pt + + + 678, 732 + + + 163, 24 + + + 148 + + + False + + + comboBox47 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 487, 735 + + + 119, 16 + + + 147 + + + Serial Number 47 + + + False + + + label47 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 5 + + + True + + + NoControl + + + 873, 708 + + + 15, 14 + + + 146 + + + False + + + checkBox46 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 6 + + + Verdana, 9.75pt + + + 678, 703 + + + 163, 24 + + + 145 + + + False + + + comboBox46 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 7 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 487, 706 + + + 119, 16 + + + 144 + + + Serial Number 46 + + + False + + + label46 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 8 + + + True + + + NoControl + + + 873, 679 + + + 15, 14 + + + 143 + + + False + + + checkBox45 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 9 + + + Verdana, 9.75pt + + + 678, 674 + + + 163, 24 + + + 142 + + + False + + + comboBox45 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 10 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 487, 677 + + + 119, 16 + + + 141 + + + Serial Number 45 + + + False + + + label45 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 11 + + + True + + + NoControl + + + 873, 650 + + + 15, 14 + + + 140 + + + False + + + checkBox44 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 12 + + + Verdana, 9.75pt + + + 678, 645 + + + 163, 24 + + + 139 + + + False + + + comboBox44 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 13 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 487, 648 + + + 119, 16 + + + 138 + + + Serial Number 44 + + + False + + + label44 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 14 + + + True + + + NoControl + + + 873, 621 + + + 15, 14 + + + 137 + + + False + + + checkBox43 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 15 + + + Verdana, 9.75pt + + + 678, 616 + + + 163, 24 + + + 136 + + + False + + + comboBox43 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 16 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 487, 619 + + + 119, 16 + + + 135 + + + Serial Number 43 + + + False + + + label43 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 17 + + + True + + + NoControl + + + 873, 592 + + + 15, 14 + + + 134 + + + False + + + checkBox42 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 18 + + + Verdana, 9.75pt + + + 678, 587 + + + 163, 24 + + + 133 + + + False + + + comboBox42 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 19 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 487, 590 + + + 119, 16 + + + 132 + + + Serial Number 42 + + + False + + + label42 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 20 + + + True + + + NoControl + + + 873, 563 + + + 15, 14 + + + 131 + + + False + + + checkBox41 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 21 + + + Verdana, 9.75pt + + + 678, 558 + + + 163, 24 + + + 130 + + + False + + + comboBox41 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 22 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 487, 561 + + + 119, 16 + + + 129 + + + Serial Number 41 + + + False + + + label41 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 23 + + + True + + + NoControl + + + 873, 534 + + + 15, 14 + + + 128 + + + False + + + checkBox40 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 24 + + + Verdana, 9.75pt + + + 678, 529 + + + 163, 24 + + + 127 + + + False + + + comboBox40 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 25 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 487, 532 + + + 119, 16 + + + 126 + + + Serial Number 40 + + + False + + + label40 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 26 + + + True + + + NoControl + + + 873, 505 + + + 15, 14 + + + 125 + + + False + + + checkBox39 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 27 + + + Verdana, 9.75pt + + + 678, 500 + + + 163, 24 + + + 124 + + + False + + + comboBox39 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 28 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 487, 503 + + + 119, 16 + + + 123 + + + Serial Number 39 + + + False + + + label39 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 29 + + + True + + + NoControl + + + 873, 476 + + + 15, 14 + + + 122 + + + False + + + checkBox38 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 30 + + + Verdana, 9.75pt + + + 678, 471 + + + 163, 24 + + + 121 + + + False + + + comboBox38 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 31 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 487, 474 + + + 119, 16 + + + 120 + + + Serial Number 38 + + + False + + + label38 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 32 + + + True + + + NoControl + + + 873, 447 + + + 15, 14 + + + 119 + + + False + + + checkBox37 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 33 + + + Verdana, 9.75pt + + + 678, 442 + + + 163, 24 + + + 118 + + + False + + + comboBox37 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 34 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 487, 445 + + + 119, 16 + + + 117 + + + Serial Number 37 + + + False + + + label37 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 35 + + + True + + + NoControl + + + 873, 418 + + + 15, 14 + + + 116 + + + False + + + checkBox36 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 36 + + + Verdana, 9.75pt + + + 678, 413 + + + 163, 24 + + + 115 + + + False + + + comboBox36 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 37 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 487, 416 + + + 119, 16 + + + 114 + + + Serial Number 36 + + + False + + + label36 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 38 + + + True + + + NoControl + + + 873, 389 + + + 15, 14 + + + 113 + + + False + + + checkBox35 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 39 + + + Verdana, 9.75pt + + + 678, 384 + + + 163, 24 + + + 112 + + + False + + + comboBox35 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 40 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 487, 387 + + + 119, 16 + + + 111 + + + Serial Number 35 + + + False + + + label35 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 41 + + + True + + + NoControl + + + 873, 360 + + + 15, 14 + + + 110 + + + False + + + checkBox34 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 42 + + + Verdana, 9.75pt + + + 678, 355 + + + 163, 24 + + + 109 + + + False + + + comboBox34 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 43 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 487, 358 + + + 119, 16 + + + 108 + + + Serial Number 34 + + + False + + + label34 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 44 + + + True + + + NoControl + + + 873, 331 + + + 15, 14 + + + 107 + + + False + + + checkBox33 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 45 + + + Verdana, 9.75pt + + + 678, 326 + + + 163, 24 + + + 106 + + + False + + + comboBox33 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 46 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 487, 329 + + + 119, 16 + + + 105 + + + Serial Number 33 + + + False + + + label33 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 47 + + + True + + + NoControl + + + 873, 302 + + + 15, 14 + + + 104 + + + False + + + checkBox32 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 48 + + + Verdana, 9.75pt + + + 678, 297 + + + 163, 24 + + + 103 + + + False + + + comboBox32 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 49 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 487, 300 + + + 119, 16 + + + 102 + + + Serial Number 32 + + + False + + + label32 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 50 + + + True + + + NoControl + + + 873, 273 + + + 15, 14 + + + 101 + + + False + + + checkBox31 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 51 + + + Verdana, 9.75pt + + + 678, 268 + + + 163, 24 + + + 100 + + + False + + + comboBox31 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 52 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 487, 271 + + + 119, 16 + + + 99 + + + Serial Number 31 + + + False + + + label31 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 53 + + + True + + + NoControl + + + 873, 244 + + + 15, 14 + + + 98 + + + False + + + checkBox30 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 54 + + + Verdana, 9.75pt + + + 678, 239 + + + 163, 24 + + + 97 + + + False + + + comboBox30 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 55 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 487, 242 + + + 119, 16 + + + 96 + + + Serial Number 30 + + + False + + + label30 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 56 + + + True + + + NoControl + + + 873, 215 + + + 15, 14 + + + 95 + + + False + + + checkBox29 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 57 + + + Verdana, 9.75pt + + + 678, 210 + + + 163, 24 + + + 94 + + + False + + + comboBox29 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 58 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 487, 213 + + + 119, 16 + + + 93 + + + Serial Number 29 + + + False + + + label29 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 59 + + + True + + + NoControl + + + 873, 186 + + + 15, 14 + + + 92 + + + False + + + checkBox28 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 60 + + + Verdana, 9.75pt + + + 678, 181 + + + 163, 24 + + + 91 + + + False + + + comboBox28 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 61 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 487, 184 + + + 119, 16 + + + 90 + + + Serial Number 28 + + + False + + + label28 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 62 + + + True + + + NoControl + + + 873, 157 + + + 15, 14 + + + 89 + + + False + + + checkBox27 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 63 + + + Verdana, 9.75pt + + + 678, 152 + + + 163, 24 + + + 88 + + + False + + + comboBox27 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 64 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 487, 155 + + + 119, 16 + + + 87 + + + Serial Number 27 + + + False + + + label27 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 65 + + + True + + + NoControl + + + 873, 128 + + + 15, 14 + + + 86 + + + False + + + checkBox26 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 66 + + + Verdana, 9.75pt + + + 678, 123 + + + 163, 24 + + + 85 + + + False + + + comboBox26 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 67 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 487, 126 + + + 119, 16 + + + 84 + + + Serial Number 26 + + + False + + + label26 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 68 + + + True + + + NoControl + + + 873, 99 + + + 15, 14 + + + 83 + + + False + + + checkBox25 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 69 + + + Verdana, 9.75pt + + + 678, 94 + + + 163, 24 + + + 82 + + + False + + + comboBox25 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 70 + + + True + + + Verdana, 9.75pt + + + NoControl + + + 487, 97 + + + 119, 16 + + + 81 + + + Serial Number 25 + + + False + + + label25 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 71 + + + True + + + 6, 13 + + + True + + + 919, 798 + + + Batch data + + + CycleBeginningForm + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/CycleBeginningForm.ru.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/CycleBeginningForm.ru.resx new file mode 100644 index 00000000..23293d04 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/CycleBeginningForm.ru.resx @@ -0,0 +1,276 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + OK + + + Порядок + + + Очистить + + + Серийный номер 1 + + + Серийный номер 2 + + + Серийный номер 3 + + + Серийный номер 4 + + + Серийный номер 5 + + + Серийный номер 6 + + + Серийный номер 7 + + + Серийный номер 8 + + + Серийный номер 9 + + + Серийный номер 10 + + + Серийный номер 11 + + + Серийный номер 12 + + + Серийный номер 13 + + + Серийный номер 14 + + + Серийный номер 15 + + + Серийный номер 16 + + + Серийный номер 17 + + + Серийный номер 18 + + + Серийный номер 19 + + + Серийный номер 20 + + + Серийный номер 21 + + + Серийный номер 22 + + + Серийный номер 23 + + + Серийный номер 24 + + + Серийный номер 48 + + + Серийный номер 47 + + + Серийный номер 46 + + + Серийный номер 45 + + + Серийный номер 44 + + + Серийный номер 43 + + + Серийный номер 42 + + + Серийный номер 41 + + + Серийный номер 40 + + + Серийный номер 39 + + + Серийный номер 38 + + + Серийный номер 37 + + + Серийный номер 36 + + + Серийный номер 35 + + + Серийный номер 34 + + + Серийный номер 33 + + + Серийный номер 32 + + + Серийный номер 31 + + + Серийный номер 30 + + + Серийный номер 29 + + + Серийный номер 28 + + + Серийный номер 27 + + + Серийный номер 26 + + + Серийный номер 25 + + + Пакетные данные + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/CycleEndForm.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/CycleEndForm.Designer.cs new file mode 100644 index 00000000..6c7f6fc7 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/CycleEndForm.Designer.cs @@ -0,0 +1,305 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.Standard48 +{ + partial class CycleEndForm + { + /// + /// 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() + { + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.textBox2 = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.okButton = new System.Windows.Forms.Button(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.textBox3 = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.textBox4 = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.groupBox5 = new System.Windows.Forms.GroupBox(); + this.textBox5 = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.groupBox6 = new System.Windows.Forms.GroupBox(); + this.textBox6 = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.groupBox2.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.groupBox4.SuspendLayout(); + this.groupBox5.SuspendLayout(); + this.groupBox6.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.textBox2); + this.groupBox2.Controls.Add(this.label2); + this.groupBox2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox2.ForeColor = System.Drawing.Color.Black; + this.groupBox2.Location = new System.Drawing.Point(25, 104); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(362, 81); + this.groupBox2.TabIndex = 2; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Wasserzähler 2"; + // + // textBox2 + // + this.textBox2.Location = new System.Drawing.Point(183, 31); + this.textBox2.Name = "textBox2"; + this.textBox2.Size = new System.Drawing.Size(163, 31); + this.textBox2.TabIndex = 1; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(18, 34); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(74, 23); + this.label2.TabIndex = 0; + this.label2.Text = "Stand:"; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.textBox1); + this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox1.ForeColor = System.Drawing.Color.Black; + this.groupBox1.Location = new System.Drawing.Point(25, 14); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(362, 81); + this.groupBox1.TabIndex = 1; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Wasserzähler 1"; + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(183, 31); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(163, 31); + this.textBox1.TabIndex = 1; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(18, 34); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(74, 23); + this.label1.TabIndex = 0; + this.label1.Text = "Stand:"; + // + // okButton + // + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(425, 23); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(98, 63); + this.okButton.TabIndex = 7; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.textBox3); + this.groupBox3.Controls.Add(this.label3); + this.groupBox3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox3.ForeColor = System.Drawing.Color.Black; + this.groupBox3.Location = new System.Drawing.Point(25, 194); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(362, 81); + this.groupBox3.TabIndex = 3; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "Wasserzähler 3"; + // + // textBox3 + // + this.textBox3.Location = new System.Drawing.Point(183, 31); + this.textBox3.Name = "textBox3"; + this.textBox3.Size = new System.Drawing.Size(163, 31); + this.textBox3.TabIndex = 1; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(18, 34); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(74, 23); + this.label3.TabIndex = 0; + this.label3.Text = "Stand:"; + // + // groupBox4 + // + this.groupBox4.Controls.Add(this.textBox4); + this.groupBox4.Controls.Add(this.label4); + this.groupBox4.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox4.ForeColor = System.Drawing.Color.Black; + this.groupBox4.Location = new System.Drawing.Point(25, 284); + this.groupBox4.Name = "groupBox4"; + this.groupBox4.Size = new System.Drawing.Size(362, 81); + this.groupBox4.TabIndex = 4; + this.groupBox4.TabStop = false; + this.groupBox4.Text = "Wasserzähler 4"; + // + // textBox4 + // + this.textBox4.Location = new System.Drawing.Point(183, 31); + this.textBox4.Name = "textBox4"; + this.textBox4.Size = new System.Drawing.Size(163, 31); + this.textBox4.TabIndex = 1; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(18, 34); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(74, 23); + this.label4.TabIndex = 0; + this.label4.Text = "Stand:"; + // + // groupBox5 + // + this.groupBox5.Controls.Add(this.textBox5); + this.groupBox5.Controls.Add(this.label5); + this.groupBox5.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox5.ForeColor = System.Drawing.Color.Black; + this.groupBox5.Location = new System.Drawing.Point(25, 374); + this.groupBox5.Name = "groupBox5"; + this.groupBox5.Size = new System.Drawing.Size(362, 81); + this.groupBox5.TabIndex = 5; + this.groupBox5.TabStop = false; + this.groupBox5.Text = "Wasserzähler 5"; + // + // textBox5 + // + this.textBox5.Location = new System.Drawing.Point(183, 31); + this.textBox5.Name = "textBox5"; + this.textBox5.Size = new System.Drawing.Size(163, 31); + this.textBox5.TabIndex = 1; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(18, 34); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(74, 23); + this.label5.TabIndex = 0; + this.label5.Text = "Stand:"; + // + // groupBox6 + // + this.groupBox6.Controls.Add(this.textBox6); + this.groupBox6.Controls.Add(this.label6); + this.groupBox6.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox6.ForeColor = System.Drawing.Color.Black; + this.groupBox6.Location = new System.Drawing.Point(25, 464); + this.groupBox6.Name = "groupBox6"; + this.groupBox6.Size = new System.Drawing.Size(362, 81); + this.groupBox6.TabIndex = 6; + this.groupBox6.TabStop = false; + this.groupBox6.Text = "Wasserzähler 6"; + // + // textBox6 + // + this.textBox6.Location = new System.Drawing.Point(183, 31); + this.textBox6.Name = "textBox6"; + this.textBox6.Size = new System.Drawing.Size(163, 31); + this.textBox6.TabIndex = 1; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(18, 34); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(74, 23); + this.label6.TabIndex = 0; + this.label6.Text = "Stand:"; + // + // CycleEndForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.ClientSize = new System.Drawing.Size(559, 566); + this.Controls.Add(this.groupBox6); + this.Controls.Add(this.groupBox5); + this.Controls.Add(this.groupBox4); + this.Controls.Add(this.groupBox3); + this.Controls.Add(this.okButton); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.groupBox1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "CycleEndForm"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "Daten"; + this.TopMost = true; + this.Load += new System.EventHandler(this.CycleEndForm_Load); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.groupBox4.ResumeLayout(false); + this.groupBox4.PerformLayout(); + this.groupBox5.ResumeLayout(false); + this.groupBox5.PerformLayout(); + this.groupBox6.ResumeLayout(false); + this.groupBox6.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TextBox textBox2; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.TextBox textBox3; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.GroupBox groupBox4; + private System.Windows.Forms.TextBox textBox4; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.GroupBox groupBox5; + private System.Windows.Forms.TextBox textBox5; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.GroupBox groupBox6; + private System.Windows.Forms.TextBox textBox6; + private System.Windows.Forms.Label label6; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/CycleEndForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/CycleEndForm.cs new file mode 100644 index 00000000..4ed18bdb --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/CycleEndForm.cs @@ -0,0 +1,111 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using log4net; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.Standard48 +{ + public partial class CycleEndForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(CycleEndForm)); + + /// Number of text boxes for serial numbers + public readonly int WaterMetersCount; + + // To be retrieved after the form closes + public string[] EndStateText; + + // Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + /// + /// Constructor + /// + /// Number of text boxes for serial numbers + public CycleEndForm(int waterMetersCount) + { + InitializeComponent(); + ControlBox = false; + + this.WaterMetersCount = waterMetersCount; + EndStateText = new string[WaterMetersCount]; + + completed = false; + StartForceCloseHandler(); + } + + /// Parameterless constructor for 3 watermeters + public CycleEndForm() + : this(3) + { + } + + private void CycleEndForm_Load(object sender, EventArgs e) + { + Localize(); + + Height = 50 + 90 * WaterMetersCount; + + if (WaterMetersCount < 1) groupBox1.Visible = false; + if (WaterMetersCount < 2) groupBox2.Visible = false; + if (WaterMetersCount < 3) groupBox3.Visible = false; + if (WaterMetersCount < 4) groupBox4.Visible = false; + if (WaterMetersCount < 5) groupBox5.Visible = false; + if (WaterMetersCount < 6) groupBox6.Visible = false; + } + + void Localize() + { + Text = Strings.Data; + groupBox1.Text = Strings.Water_Meter + " 1"; + groupBox2.Text = Strings.Water_Meter + " 2"; + groupBox3.Text = Strings.Water_Meter + " 3"; + groupBox4.Text = Strings.Water_Meter + " 4"; + groupBox5.Text = Strings.Water_Meter + " 5"; + groupBox6.Text = Strings.Water_Meter + " 6"; + label1.Text = Strings.State; + label2.Text = Strings.State; + label3.Text = Strings.State; + label4.Text = Strings.State; + label5.Text = Strings.State; + label6.Text = Strings.State; + okButton.Text = Strings.OkBtnText; + } + + private void okButton_Click(object sender, EventArgs e) + { + if (WaterMetersCount >= 1) EndStateText[0] = textBox1.Text; + if (WaterMetersCount >= 2) EndStateText[1] = textBox3.Text; + if (WaterMetersCount >= 3) EndStateText[2] = textBox4.Text; + if (WaterMetersCount >= 4) EndStateText[3] = textBox5.Text; + if (WaterMetersCount >= 5) EndStateText[4] = textBox6.Text; + if (WaterMetersCount >= 6) EndStateText[5] = textBox6.Text; + + completed = true; + 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) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/CycleEndForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/CycleEndForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/CycleEndForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/EntryForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/EntryForm.cs new file mode 100644 index 00000000..d9a8264f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/EntryForm.cs @@ -0,0 +1,20 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl.DataEntry.Standard48 +{ + public class EntryForm : EntryFormNoStartEnd, IHasWMStatesForm + { + public EntryForm() + : base() + { + } + + public EntryForm(Generic.IComponentCfg cfg) + : base(cfg) + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/EntryFormCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/EntryFormCfg.cs new file mode 100644 index 00000000..7e6b6e35 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/EntryFormCfg.cs @@ -0,0 +1,47 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DataEntry.Standard48 +{ + public class EntryFormCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(EntryFormCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new EntryFormCfgCtrl(); } + + /// + /// Serialized parameters + /// + public bool EnterSerialNrsAtTheEnd; + public bool ShowCycleEndForm; + public bool SensusExtensions; + + /// Private parameterless constructor invoked by all other (public) constructors + EntryFormCfg() + { + Name = "DataEntry-Standard-48"; + ParentName = string.Empty; + EnterSerialNrsAtTheEnd = false; + ShowCycleEndForm = false; + SensusExtensions = false; + } + + public EntryFormCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, EnterSNsAtTheEnd={1}, ShowEndForm={2}, SensusExt={3}", Name, EnterSerialNrsAtTheEnd, ShowCycleEndForm, SensusExtensions); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/EntryFormCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/EntryFormCfgCtrl.cs new file mode 100644 index 00000000..5be7590b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/EntryFormCfgCtrl.cs @@ -0,0 +1,87 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.Standard48 +{ + public partial class EntryFormCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + EntryFormCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as EntryFormCfg; + Redraw(); + } + } + + public EntryFormCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Localize(); + Redraw(); + } + + void Localize() + { + enterSNsAtTheEndCheckBox.Text = Strings.Enter_SNs_at_the_end; + showEndStateFormCheckBox.Text = Strings.Show_cycle_end_form; + sensusExtensionsCheckBox.Text = Strings.Sensus_extensions; + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + enterSNsAtTheEndCheckBox.Checked = config.EnterSerialNrsAtTheEnd; + showEndStateFormCheckBox.Checked = config.ShowCycleEndForm; + sensusExtensionsCheckBox.Checked = config.SensusExtensions; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + enterSNsAtTheEndCheckBox.Enabled = true; + showEndStateFormCheckBox.Enabled = true; + sensusExtensionsCheckBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.EnterSerialNrsAtTheEnd = enterSNsAtTheEndCheckBox.Checked; + config.ShowCycleEndForm = showEndStateFormCheckBox.Checked; + config.SensusExtensions = sensusExtensionsCheckBox.Checked; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/EntryFormCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/EntryFormCfgCtrl.designer.cs new file mode 100644 index 00000000..1dad4c60 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/EntryFormCfgCtrl.designer.cs @@ -0,0 +1,128 @@ +/// +/// Copyright (c) 2015-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.Standard48 +{ + partial class EntryFormCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.showEndStateFormCheckBox = new System.Windows.Forms.CheckBox(); + this.enterSNsAtTheEndCheckBox = new System.Windows.Forms.CheckBox(); + this.sensusExtensionsCheckBox = new System.Windows.Forms.CheckBox(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(99, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(35, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(96, 33); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // showEndStateFormCheckBox + // + this.showEndStateFormCheckBox.AutoSize = true; + this.showEndStateFormCheckBox.Enabled = false; + this.showEndStateFormCheckBox.Location = new System.Drawing.Point(99, 112); + this.showEndStateFormCheckBox.Name = "showEndStateFormCheckBox"; + this.showEndStateFormCheckBox.Size = new System.Drawing.Size(151, 17); + this.showEndStateFormCheckBox.TabIndex = 4; + this.showEndStateFormCheckBox.Text = "Watermeter end state form"; + this.showEndStateFormCheckBox.UseVisualStyleBackColor = true; + // + // enterSNsAtTheEndCheckBox + // + this.enterSNsAtTheEndCheckBox.AutoSize = true; + this.enterSNsAtTheEndCheckBox.Enabled = false; + this.enterSNsAtTheEndCheckBox.Location = new System.Drawing.Point(99, 89); + this.enterSNsAtTheEndCheckBox.Name = "enterSNsAtTheEndCheckBox"; + this.enterSNsAtTheEndCheckBox.Size = new System.Drawing.Size(167, 17); + this.enterSNsAtTheEndCheckBox.TabIndex = 3; + this.enterSNsAtTheEndCheckBox.Text = "Enter serial number at the end"; + this.enterSNsAtTheEndCheckBox.UseVisualStyleBackColor = true; + // + // sensusExtensionsCheckBox + // + this.sensusExtensionsCheckBox.AutoSize = true; + this.sensusExtensionsCheckBox.Enabled = false; + this.sensusExtensionsCheckBox.Location = new System.Drawing.Point(99, 135); + this.sensusExtensionsCheckBox.Name = "sensusExtensionsCheckBox"; + this.sensusExtensionsCheckBox.Size = new System.Drawing.Size(167, 17); + this.sensusExtensionsCheckBox.TabIndex = 5; + this.sensusExtensionsCheckBox.Text = "Sensus production extensions"; + this.sensusExtensionsCheckBox.UseVisualStyleBackColor = true; + // + // EntryFormCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.sensusExtensionsCheckBox); + this.Controls.Add(this.enterSNsAtTheEndCheckBox); + this.Controls.Add(this.showEndStateFormCheckBox); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "EntryFormCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.CheckBox showEndStateFormCheckBox; + private System.Windows.Forms.CheckBox enterSNsAtTheEndCheckBox; + private System.Windows.Forms.CheckBox sensusExtensionsCheckBox; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/EntryFormCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/EntryFormCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/EntryFormCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/EntryFormNoStartEnd.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/EntryFormNoStartEnd.cs new file mode 100644 index 00000000..d90d2d3a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/EntryFormNoStartEnd.cs @@ -0,0 +1,279 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; +using TBF.BenchControl; +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl.DataEntry.Standard48 +{ + public class EntryFormNoStartEnd : ComponentBase, IOperation, IDataEntry, IHasCycleBeginForm, IHasCycleEndForm + { + private static readonly ILog log = LogManager.GetLogger(typeof(EntryFormNoStartEnd)); + public override string ToString() { return string.Format("DataEntry.Standard48({0})", Cfg.ToString(1)); } + + public bool UsesCameras() { return false; } + + readonly EntryFormCfg entryFormCfg; + IRegisterReader[] regReaders; + + /// + /// Properties set by the Begin, End and WMStates form + /// + string purchaseOrder; + public string PurchaseOrder { get { return purchaseOrder; } } + + bool[] disabled; /// This array is shared between forms + + string[] wmCycleEndState; + public string WMCycleEndState(int wmNr) { return (wmNr >= 0 && wmNr < wmCycleEndState.Length) ? wmCycleEndState[wmNr] : string.Empty; } + + double[] wmStartState; + public double WMStartState(int wmNr) { return (wmNr >= 0 && wmNr < wmStartState.Length) ? wmStartState[wmNr] : 0; } + + double[] wmEndState; + public double WMEndState(int wmNr) { return (wmNr >= 0 && wmNr < wmEndState.Length) ? wmEndState[wmNr] : 0; } + + string[] wmStartStateStr; + + + System.Windows.Forms.Form modelessDlg; + + double refVolume; + double errLimLo; + double errLimHi; + + bool resultSaved; /// Set in Run() when results are saved + + Results.Entities.WaterMeter[] waterMeters; /// Reference to ...ProcessData.BatchRslts.WaterMeters[] + + public enum CurrentOp + { + None, + ShowFormAtCycleBeginning, + ShowFormAtCycleEnd, + EnterTestStartStates, + EnterTestEndStates, + } + + CurrentOp currentOp; + + + public EntryFormNoStartEnd() + { + } + + public EntryFormNoStartEnd(Generic.IComponentCfg cfg) + : base(cfg) + { + entryFormCfg = cfg as EntryFormCfg; + + disabled = new bool[Config.Data.WMsCount]; + wmStartState = new double[Config.Data.WMsCount]; + wmStartStateStr = new string[Config.Data.WMsCount]; + wmEndState = new double[Config.Data.WMsCount]; + wmCycleEndState = new string[Config.Data.WMsCount]; + + currentOp = CurrentOp.None; + log.Debug(this.ToString()); + } + + /// Reference to the operation + public IOperation ShowCycleBeginFormOp() + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.ShowFormAtCycleBeginning; + this.waterMeters = TBF.BenchControl.Sequences.ProcessData.BatchRslts.WaterMeters; + return this; + } + + /// Reference to the operation + public IOperation ShowCycleEndFormOp() + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.ShowFormAtCycleEnd; + this.waterMeters = TBF.BenchControl.Sequences.ProcessData.BatchRslts.WaterMeters; + return this; + } + + /// Reference to the operation + public IOperation ShowTestStartFormOp(IRegisterReader[] regReaders) + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.EnterTestStartStates; + this.regReaders = regReaders; + return this; + } + + /// Reference to the operation + public IOperation ShowTestEndFormOp(IRegisterReader[] regReaders, double refVolume, double errLimLo, double errLimHi) + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.EnterTestEndStates; + this.regReaders = regReaders; + this.refVolume = refVolume; + this.errLimLo = errLimLo; + this.errLimHi = errLimHi; + return this; + } + + delegate void EntryFormDlgt(EntryFormNoStartEnd myRef); + /// + void OpenBeginningDlg(EntryFormNoStartEnd myRef) + { + myRef.modelessDlg = new CycleBeginningForm(Config.Data.WMsCount); + modelessDlg.Show(); + } + /// + void OpenEndDlg(EntryFormNoStartEnd myRef) + { + myRef.modelessDlg = new CycleEndForm(Config.Data.WMsCount); + modelessDlg.Show(); + } + /// + void OpenTestStartStatesDlg(EntryFormNoStartEnd myRef) + { + myRef.modelessDlg = new TestStartEndForm(myRef.waterMeters.Length, myRef.regReaders, disabled); + modelessDlg.Show(); + } + /// + void OpenTestEndStatesDlg(EntryFormNoStartEnd myRef) + { + myRef.modelessDlg = new TestStartEndForm(Config.Data.WMsCount, myRef.regReaders, wmStartStateStr, disabled, refVolume, errLimLo, errLimHi); + modelessDlg.Show(); + } + + /// Start this operation + public void Start() + { + resultSaved = false; + switch (currentOp) + { + case CurrentOp.ShowFormAtCycleBeginning: + if (!entryFormCfg.EnterSerialNrsAtTheEnd) + { + Program.MainWnd.Invoke(new EntryFormDlgt(OpenBeginningDlg), this); + } + break; + case CurrentOp.ShowFormAtCycleEnd: + if (entryFormCfg.EnterSerialNrsAtTheEnd) + { + Program.MainWnd.Invoke(new EntryFormDlgt(OpenBeginningDlg), this); + } + else if (entryFormCfg.ShowCycleEndForm) + { + Program.MainWnd.Invoke(new EntryFormDlgt(OpenEndDlg), this); + } + break; + case CurrentOp.EnterTestStartStates: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenTestStartStatesDlg), this); + break; + case CurrentOp.EnterTestEndStates: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenTestEndStatesDlg), this); + break; + } + } + + /// Run this operation + /// Event.ResultsPrinted + public Event Run() + { + if ((modelessDlg is IHasCompleted) && !(modelessDlg as IHasCompleted).Completed) + { + return Event.ModelessFormIsOpen; + } + + if (!resultSaved) /// This is to save the result only once + { + if ((!entryFormCfg.EnterSerialNrsAtTheEnd && currentOp == CurrentOp.ShowFormAtCycleBeginning) || + (entryFormCfg.EnterSerialNrsAtTheEnd && currentOp == CurrentOp.ShowFormAtCycleEnd)) + { + CycleBeginningForm dlg = (modelessDlg as CycleBeginningForm); + if (dlg != null) + { + purchaseOrder = dlg.PurchaseOrder; + + for (int i = 0; i < Math.Min(dlg.WaterMetersCount, waterMeters.Length); i++) + { + if (waterMeters[i] != null) + { + waterMeters[i].SerialNr = dlg.SNText[i]; + disabled[i] = waterMeters[i].Disabled = dlg.Disabled[i]; + } + } + } + } + else if (entryFormCfg.ShowCycleEndForm && currentOp == CurrentOp.ShowFormAtCycleEnd) + { + CycleEndForm dlg = (modelessDlg as CycleEndForm); + int count = waterMeters.Length; + if ((dlg != null) && (count > dlg.WaterMetersCount)) count = dlg.WaterMetersCount; + + for (int i = 0; i < count; i++) + { + if (waterMeters[i] != null) + { + /// In case entryFormCfg.ShowCycleEndForm == false dlg would be null, values would be string.Empty + wmCycleEndState[i] = waterMeters[i].EndState = (dlg != null) ? dlg.EndStateText[i] : string.Empty; + } + } + } + else if (modelessDlg is TestStartEndForm && currentOp == CurrentOp.EnterTestStartStates) + { + /// Fixed start test - start + TestStartEndForm dlg = (modelessDlg as TestStartEndForm); + if (dlg != null) + { + for (int i = 0; i < dlg.WaterMetersCount; i++) + { + wmStartState[i] = dlg.WMStartState[i]; + wmStartStateStr[i] = dlg.WMStartStateStr[i]; + } + } + } + else if (modelessDlg is TestStartEndForm && currentOp == CurrentOp.EnterTestEndStates) + { + /// Fixed start test - end + TestStartEndForm dlg = (modelessDlg as TestStartEndForm); + if (dlg != null) + { + for (int i = 0; i < dlg.WaterMetersCount; i++) + { + wmEndState[i] = dlg.WMEndState[i]; + } + } + } + resultSaved = true; + modelessDlg = null; + } + + return Event.ModelessFormClosed; /// Form closed + } + + /// Stop this operation + public void Stop() + { + if (modelessDlg is IHasCompleted) + { + UiBridge.Bridge.OnCloseModelessForm(this, null); + modelessDlg = null; + } + currentOp = CurrentOp.None; + } + + /// + /// Updates test results with the information collected in watermeters. + /// + /// Test results to be updated with the information + public void UpdateTestResults(Results.BatchResults batchResults) + { + foreach (var wm in batchResults.WaterMeters) + { + if (wm != null && !wm.Disabled) wm.PurchaseOrder = PurchaseOrder; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/Factory.cs new file mode 100644 index 00000000..53c6c500 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DataEntry.Standard48 +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return "DataEntry-Standard-48"; } } + + public void ResetStaticProperties() { EntryFormNoStartEnd.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new EntryFormNoStartEnd(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new EntryForm(cfg); } + + public IComponentCfg DefaultConfig() { return new EntryFormCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(EntryFormCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/FactoryNoStartEnd.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/FactoryNoStartEnd.cs new file mode 100644 index 00000000..b120dec6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/FactoryNoStartEnd.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DataEntry.Standard48 +{ + public class FactoryNoStartEnd : IComponentFactory + { + public string ClassName { get { return "DataEntry-Standard-48-NoStartEnd"; } } + + public void ResetStaticProperties() { EntryFormNoStartEnd.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new EntryFormNoStartEnd(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new EntryFormNoStartEnd(cfg); } + + public IComponentCfg DefaultConfig() { return new EntryFormCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(EntryFormCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/TestStartEndForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/TestStartEndForm.cs new file mode 100644 index 00000000..c25dc82e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/TestStartEndForm.cs @@ -0,0 +1,478 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using log4net; +using TBF.BenchControl.GenericDevices; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.Standard48 +{ + public partial class TestStartEndForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(TestStartEndForm)); + + // Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + /// Number of text boxes for serial numbers + public readonly int WaterMetersCount; + readonly IRegisterReader[] regReaders; + readonly bool[] disabled; + + // To be retrieved after the form closes + public double[] WMStartState; + + // To be retrieved after the form closes + public readonly string[] WMStartStateStr; + + // To be retrieved after the form closes + public double[] WMEndState; + + bool endStates; /// false=start states, true=end states + double refVolume; + double warningLimLo; /// limit to display exclamation mark, typically 2x errLimLo + double warningLimHi; /// limit to display exclamation mark, typically 2x errLimHi + + int TextBoxesCount; + /// + Label[] labels; + TextBox[] startTextBoxes; + TextBox[] endTextBoxes; + IList enabledTextBoxes; + + /// + /// Parameterless constructor initializing common part for start and endstate form + /// + public TestStartEndForm() + { + InitializeComponent(); + ControlBox = false; + + TextBoxesCount = 48; + + labels = new Label[] + { + label1, label2, label3, label4, label5, label6, label7, label8, label9, label10, + label11, label12, label13, label14, label15, label16, label17, label18, label19, label20, + label21, label22, label23, label24, label25, label26, label27, label28, label29, label30, + label31, label32, label33, label34, label35, label36, label37, label38, label39, label40, + label41, label42, label43, label44, label45, label46, label47, label48, + }; + startTextBoxes = new TextBox[] + { + startTextBox1, startTextBox2, startTextBox3, startTextBox4, startTextBox5, startTextBox6, startTextBox7, startTextBox8, startTextBox9, startTextBox10, + startTextBox11, startTextBox12, startTextBox13, startTextBox14, startTextBox15, startTextBox16, startTextBox17, startTextBox18, startTextBox19, startTextBox20, + startTextBox21, startTextBox22, startTextBox23, startTextBox24, startTextBox25, startTextBox26, startTextBox27, startTextBox28, startTextBox29, startTextBox30, + startTextBox31, startTextBox32, startTextBox33, startTextBox34, startTextBox35, startTextBox36, startTextBox37, startTextBox38, startTextBox39, startTextBox40, + startTextBox41, startTextBox42, startTextBox43, startTextBox44, startTextBox45, startTextBox46, startTextBox47, startTextBox48, + }; + endTextBoxes = new TextBox[] + { + endTextBox1, endTextBox2, endTextBox3, endTextBox4, endTextBox5, endTextBox6, endTextBox7, endTextBox8, endTextBox9, endTextBox10, + endTextBox11, endTextBox12, endTextBox13, endTextBox14, endTextBox15, endTextBox16, endTextBox17, endTextBox18, endTextBox19, endTextBox20, + endTextBox21, endTextBox22, endTextBox23, endTextBox24, endTextBox25, endTextBox26, endTextBox27, endTextBox28, endTextBox29, endTextBox30, + endTextBox31, endTextBox32, endTextBox33, endTextBox34, endTextBox35, endTextBox36, endTextBox37, endTextBox38, endTextBox39, endTextBox40, + endTextBox41, endTextBox42, endTextBox43, endTextBox44, endTextBox45, endTextBox46, endTextBox47, endTextBox48, + }; + enabledTextBoxes = new List(); + + completed = false; + StartForceCloseHandler(); + } + + /// + /// Constructor to fill in start states + /// + /// Number of water meters + /// Information from CycleBeginningForm about availability of water meters + public TestStartEndForm(int waterMetersCount, IRegisterReader[] regReaders, bool[] disabled) + : this() + { + endStates = false; + + this.WaterMetersCount = waterMetersCount; + this.regReaders = regReaders; + this.disabled = disabled; + + ShuffleTextBoxes(); + + WMStartState = new double[waterMetersCount]; + WMStartStateStr = new string[waterMetersCount]; + } + + /// + /// Constructor to fill in end states + /// + /// Number of water meters + /// Information entered on test start + /// Information from CycleBeginningForm about availability of water meters + /// Reference volume, it is used to verify the end state, show/hide exclamation if necessary + /// Error limit low, it is used to verify the end state, show/hide exclamation if necessary + /// Error limit high, it is used to verify the end state, show/hide exclamation if necessary + public TestStartEndForm(int waterMetersCount, IRegisterReader[] regReaders, string[] wmStartStateStr, bool[] disabled, + double refVolume, double errLimLo, double errLimHi) + : this() + { + endStates = true; + + this.WaterMetersCount = waterMetersCount; + this.regReaders = regReaders; + if (wmStartStateStr == null || wmStartStateStr.Length != waterMetersCount) + throw (new Exception("Invalid 'wmStartStateStr' argument")); + this.WMStartStateStr = wmStartStateStr; + this.disabled = disabled; + this.refVolume = refVolume; + this.warningLimLo = 2 * errLimLo; + this.warningLimHi = 2 * errLimHi; + + ShuffleTextBoxes(); + + WMEndState = new double[waterMetersCount]; + } + + /// + /// Make sure the layout of labels/text boxes on the screen + /// corresponds to the layout of watermeters of the test bench. + /// + void ShuffleTextBoxes() + { + if (Config.Data.WMsCount < TextBoxesCount) + { + int nrLines = Config.Data.WMsCount / Config.Data.LineSize; + int gap = (TextBoxesCount - Config.Data.WMsCount) / nrLines; + + int dest = 0; + for (int l = 0; l < nrLines; l++) + { + for (int i = 0; i < Config.Data.LineSize; i++) + { + labels[dest] = labels[l * Config.Data.LineSize + l * gap + i]; + startTextBoxes[dest] = startTextBoxes[l * Config.Data.LineSize + l * gap + i]; + endTextBoxes[dest] = endTextBoxes[l * Config.Data.LineSize + l * gap + i]; + dest++; + } + } + TextBoxesCount = Config.Data.WMsCount; + } + } + + private void CycleEndForm_Load(object sender, EventArgs e) + { + Localize(); + + //Height = 115 + 90 * WaterMetersCount; + + for (int i = 0; i < TextBoxesCount; i++) + { + if (i < WaterMetersCount) + { + labels[i].Visible = startTextBoxes[i].Visible = endTextBoxes[i].Visible = true; + } + } + + if (endStates) + { + for (int i = 0; i < TextBoxesCount; i++) + { + if (WMStartStateStr != null && i < WMStartStateStr.Length) + { + startTextBoxes[i].Text = WMStartStateStr[i]; + } + + if (disabled != null && i < disabled.Length && disabled[i]) + { + endTextBoxes[i].Enabled = false; + } + else + { + endTextBoxes[i].Enabled = true; + enabledTextBoxes.Add(endTextBoxes[i]); + } + } + } + else + { + for (int i = 0; i < TextBoxesCount; i++) + { + if (disabled != null && i < disabled.Length && disabled[i]) + { + startTextBoxes[i].Enabled = false; + } + else + { + startTextBoxes[i].Enabled = true; + enabledTextBoxes.Add(startTextBoxes[i]); + } + } + } + } + + void Localize() + { + Text = Strings.Water_Meter_States; + for (int i = 0; i < TextBoxesCount; i++) + { + labels[i].Text = string.Format("{0} {1}", Strings.Water_Meter, i + 1); + } + startLabel.Text = start2Label.Text = Strings.Start; + endLabel.Text = end2Label.Text = Strings.End; + okButton.Text = Strings.OkBtnText; + } + + private void okButton_Click(object sender, EventArgs eArgs) + { + try + { + if (endStates) + { + for (int i = 0; i < Math.Min(WaterMetersCount, TextBoxesCount); i++) + { + if (endTextBoxes[i].Visible && endTextBoxes[i].Enabled) + { + WMEndState[i] = Utils.ParseUDouble(endTextBoxes[i].Text); + } + } + } + else + { + for (int i = 0; i < Math.Min(WaterMetersCount, TextBoxesCount); i++) + { + if (startTextBoxes[i].Visible && startTextBoxes[i].Enabled) + { + WMStartStateStr[i] = startTextBoxes[i].Text; + WMStartState[i] = Utils.ParseUDouble(startTextBoxes[i].Text); + } + } + } + } + catch(Exception e) + { + log.ErrorFormat("Exception: {0}", e.Message); + return; + } + + completed = true; + 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) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + + + /// + /// Calculate the approximate error and verify whether it is within limits. + /// Make an exclamation mark visible if out of range. + /// Similar event handler is implemented for all endTextBoxes (1..24). + /// + private void ProcTextChanged(object sender, EventArgs e, TextBox endStateTB, TextBox startStateTB, Label exclamation) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endStateTB.Text); + double startState = Utils.ParseUDouble(startStateTB.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation.Visible = (err < warningLimLo) || (warningLimHi < err); + } + + private void endTextBox1_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox1, startTextBox1, exclamation1); } + private void endTextBox2_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox2, startTextBox2, exclamation2); } + private void endTextBox3_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox3, startTextBox3, exclamation3); } + private void endTextBox4_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox4, startTextBox4, exclamation4); } + private void endTextBox5_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox5, startTextBox5, exclamation5); } + private void endTextBox6_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox6, startTextBox6, exclamation6); } + private void endTextBox7_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox7, startTextBox7, exclamation7); } + private void endTextBox8_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox8, startTextBox8, exclamation8); } + private void endTextBox9_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox9, startTextBox9, exclamation9); } + private void endTextBox10_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox10, startTextBox10, exclamation10); } + private void endTextBox11_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox11, startTextBox11, exclamation11); } + private void endTextBox12_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox12, startTextBox12, exclamation12); } + private void endTextBox13_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox13, startTextBox13, exclamation13); } + private void endTextBox14_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox14, startTextBox14, exclamation14); } + private void endTextBox15_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox15, startTextBox15, exclamation15); } + private void endTextBox16_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox16, startTextBox16, exclamation16); } + private void endTextBox17_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox17, startTextBox17, exclamation17); } + private void endTextBox18_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox18, startTextBox18, exclamation18); } + private void endTextBox19_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox19, startTextBox19, exclamation19); } + private void endTextBox20_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox20, startTextBox20, exclamation20); } + private void endTextBox21_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox21, startTextBox21, exclamation21); } + private void endTextBox22_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox22, startTextBox22, exclamation22); } + private void endTextBox23_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox23, startTextBox23, exclamation23); } + private void endTextBox24_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox24, startTextBox24, exclamation24); } + private void endTextBox25_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox25, startTextBox25, exclamation25); } + private void endTextBox26_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox26, startTextBox26, exclamation26); } + private void endTextBox27_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox27, startTextBox27, exclamation27); } + private void endTextBox28_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox28, startTextBox28, exclamation28); } + private void endTextBox29_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox29, startTextBox29, exclamation29); } + private void endTextBox30_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox30, startTextBox30, exclamation30); } + private void endTextBox31_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox31, startTextBox31, exclamation31); } + private void endTextBox32_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox32, startTextBox32, exclamation32); } + private void endTextBox33_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox33, startTextBox33, exclamation33); } + private void endTextBox34_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox34, startTextBox34, exclamation34); } + private void endTextBox35_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox35, startTextBox35, exclamation35); } + private void endTextBox36_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox36, startTextBox36, exclamation36); } + private void endTextBox37_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox37, startTextBox37, exclamation37); } + private void endTextBox38_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox38, startTextBox38, exclamation38); } + private void endTextBox39_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox39, startTextBox39, exclamation39); } + private void endTextBox40_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox40, startTextBox40, exclamation40); } + private void endTextBox41_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox41, startTextBox41, exclamation41); } + private void endTextBox42_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox42, startTextBox42, exclamation42); } + private void endTextBox43_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox43, startTextBox43, exclamation43); } + private void endTextBox44_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox44, startTextBox44, exclamation44); } + private void endTextBox45_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox45, startTextBox45, exclamation45); } + private void endTextBox46_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox46, startTextBox46, exclamation46); } + private void endTextBox47_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox47, startTextBox47, exclamation47); } + private void endTextBox48_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox48, startTextBox48, exclamation48); } + + + /// + /// Process a key press within any enabled text boxe + /// + /// + /// + /// TextBox control which received the event + private void ProcKeyPress(object sender, KeyPressEventArgs e, TextBox currentFocusOwner) + { + if (e.KeyChar == '+') + { + /// Process '+' key ..... Form completed + okButton_Click(sender, e); + } + if (e.KeyChar == '\r') + { + /// Process key ..... Next text field + if (enabledTextBoxes.Count < 2) return; /// There is just one enabled textbox + + for (int i = 0; i < enabledTextBoxes.Count; i++) + { + if (enabledTextBoxes[i] == currentFocusOwner) + { + /// Change focus to the next enabled text box + enabledTextBoxes[(i + 1) % enabledTextBoxes.Count].Focus(); + return; + } + } + } + } + + private void startTextBox1_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox1); } + private void startTextBox2_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox2); } + private void startTextBox3_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox3); } + private void startTextBox4_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox4); } + private void startTextBox5_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox5); } + private void startTextBox6_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox6); } + private void startTextBox7_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox7); } + private void startTextBox8_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox8); } + private void startTextBox9_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox9); } + private void startTextBox10_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox10); } + private void startTextBox11_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox11); } + private void startTextBox12_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox12); } + private void startTextBox13_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox13); } + private void startTextBox14_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox14); } + private void startTextBox15_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox15); } + private void startTextBox16_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox16); } + private void startTextBox17_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox17); } + private void startTextBox18_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox18); } + private void startTextBox19_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox19); } + private void startTextBox20_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox20); } + private void startTextBox21_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox21); } + private void startTextBox22_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox22); } + private void startTextBox23_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox23); } + private void startTextBox24_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox24); } + private void startTextBox25_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox25); } + private void startTextBox26_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox26); } + private void startTextBox27_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox27); } + private void startTextBox28_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox28); } + private void startTextBox29_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox29); } + private void startTextBox30_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox30); } + private void startTextBox31_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox31); } + private void startTextBox32_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox32); } + private void startTextBox33_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox33); } + private void startTextBox34_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox34); } + private void startTextBox35_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox35); } + private void startTextBox36_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox36); } + private void startTextBox37_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox37); } + private void startTextBox38_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox38); } + private void startTextBox39_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox39); } + private void startTextBox40_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox40); } + private void startTextBox41_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox41); } + private void startTextBox42_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox42); } + private void startTextBox43_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox43); } + private void startTextBox44_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox44); } + private void startTextBox45_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox45); } + private void startTextBox46_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox46); } + private void startTextBox47_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox47); } + private void startTextBox48_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox48); } + + private void endTextBox1_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox1); } + private void endTextBox2_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox2); } + private void endTextBox3_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox3); } + private void endTextBox4_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox4); } + private void endTextBox5_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox5); } + private void endTextBox6_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox6); } + private void endTextBox7_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox7); } + private void endTextBox8_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox8); } + private void endTextBox9_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox9); } + private void endTextBox10_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox10); } + private void endTextBox11_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox11); } + private void endTextBox12_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox12); } + private void endTextBox13_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox13); } + private void endTextBox14_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox14); } + private void endTextBox15_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox15); } + private void endTextBox16_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox16); } + private void endTextBox17_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox17); } + private void endTextBox18_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox18); } + private void endTextBox19_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox19); } + private void endTextBox20_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox20); } + private void endTextBox21_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox21); } + private void endTextBox22_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox22); } + private void endTextBox23_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox23); } + private void endTextBox24_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox24); } + private void endTextBox25_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox25); } + private void endTextBox26_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox26); } + private void endTextBox27_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox27); } + private void endTextBox28_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox28); } + private void endTextBox29_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox29); } + private void endTextBox30_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox30); } + private void endTextBox31_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox31); } + private void endTextBox32_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox32); } + private void endTextBox33_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox33); } + private void endTextBox34_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox34); } + private void endTextBox35_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox35); } + private void endTextBox36_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox36); } + private void endTextBox37_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox37); } + private void endTextBox38_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox38); } + private void endTextBox39_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox39); } + private void endTextBox40_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox40); } + private void endTextBox41_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox41); } + private void endTextBox42_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox42); } + private void endTextBox43_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox43); } + private void endTextBox44_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox44); } + private void endTextBox45_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox45); } + private void endTextBox46_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox46); } + private void endTextBox47_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox47); } + private void endTextBox48_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox48); } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/TestStartEndForm.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/TestStartEndForm.designer.cs new file mode 100644 index 00000000..2748d141 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/TestStartEndForm.designer.cs @@ -0,0 +1,2908 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.Standard48 +{ + partial class TestStartEndForm + { + /// + /// 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() + { + this.exclamation1 = new System.Windows.Forms.Label(); + this.startTextBox1 = new System.Windows.Forms.TextBox(); + this.endTextBox1 = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.okButton = new System.Windows.Forms.Button(); + this.exclamation3 = new System.Windows.Forms.Label(); + this.startTextBox3 = new System.Windows.Forms.TextBox(); + this.endTextBox3 = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.exclamation4 = new System.Windows.Forms.Label(); + this.startTextBox4 = new System.Windows.Forms.TextBox(); + this.endTextBox4 = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.exclamation5 = new System.Windows.Forms.Label(); + this.startTextBox5 = new System.Windows.Forms.TextBox(); + this.endTextBox5 = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.exclamation6 = new System.Windows.Forms.Label(); + this.startTextBox6 = new System.Windows.Forms.TextBox(); + this.endTextBox6 = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.startLabel = new System.Windows.Forms.Label(); + this.endLabel = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.endTextBox2 = new System.Windows.Forms.TextBox(); + this.startTextBox2 = new System.Windows.Forms.TextBox(); + this.exclamation2 = new System.Windows.Forms.Label(); + this.exclamation7 = new System.Windows.Forms.Label(); + this.startTextBox7 = new System.Windows.Forms.TextBox(); + this.endTextBox7 = new System.Windows.Forms.TextBox(); + this.label7 = new System.Windows.Forms.Label(); + this.exclamation8 = new System.Windows.Forms.Label(); + this.startTextBox8 = new System.Windows.Forms.TextBox(); + this.endTextBox8 = new System.Windows.Forms.TextBox(); + this.label8 = new System.Windows.Forms.Label(); + this.exclamation9 = new System.Windows.Forms.Label(); + this.startTextBox9 = new System.Windows.Forms.TextBox(); + this.endTextBox9 = new System.Windows.Forms.TextBox(); + this.label9 = new System.Windows.Forms.Label(); + this.exclamation10 = new System.Windows.Forms.Label(); + this.startTextBox10 = new System.Windows.Forms.TextBox(); + this.endTextBox10 = new System.Windows.Forms.TextBox(); + this.label10 = new System.Windows.Forms.Label(); + this.exclamation11 = new System.Windows.Forms.Label(); + this.startTextBox11 = new System.Windows.Forms.TextBox(); + this.endTextBox11 = new System.Windows.Forms.TextBox(); + this.label11 = new System.Windows.Forms.Label(); + this.exclamation12 = new System.Windows.Forms.Label(); + this.startTextBox12 = new System.Windows.Forms.TextBox(); + this.endTextBox12 = new System.Windows.Forms.TextBox(); + this.label12 = new System.Windows.Forms.Label(); + this.exclamation24 = new System.Windows.Forms.Label(); + this.startTextBox24 = new System.Windows.Forms.TextBox(); + this.endTextBox24 = new System.Windows.Forms.TextBox(); + this.label24 = new System.Windows.Forms.Label(); + this.exclamation23 = new System.Windows.Forms.Label(); + this.startTextBox23 = new System.Windows.Forms.TextBox(); + this.endTextBox23 = new System.Windows.Forms.TextBox(); + this.label23 = new System.Windows.Forms.Label(); + this.exclamation22 = new System.Windows.Forms.Label(); + this.startTextBox22 = new System.Windows.Forms.TextBox(); + this.endTextBox22 = new System.Windows.Forms.TextBox(); + this.label22 = new System.Windows.Forms.Label(); + this.exclamation21 = new System.Windows.Forms.Label(); + this.startTextBox21 = new System.Windows.Forms.TextBox(); + this.endTextBox21 = new System.Windows.Forms.TextBox(); + this.label21 = new System.Windows.Forms.Label(); + this.exclamation20 = new System.Windows.Forms.Label(); + this.startTextBox20 = new System.Windows.Forms.TextBox(); + this.endTextBox20 = new System.Windows.Forms.TextBox(); + this.label20 = new System.Windows.Forms.Label(); + this.exclamation19 = new System.Windows.Forms.Label(); + this.startTextBox19 = new System.Windows.Forms.TextBox(); + this.endTextBox19 = new System.Windows.Forms.TextBox(); + this.label19 = new System.Windows.Forms.Label(); + this.exclamation18 = new System.Windows.Forms.Label(); + this.exclamation17 = new System.Windows.Forms.Label(); + this.startTextBox18 = new System.Windows.Forms.TextBox(); + this.exclamation16 = new System.Windows.Forms.Label(); + this.endTextBox18 = new System.Windows.Forms.TextBox(); + this.label18 = new System.Windows.Forms.Label(); + this.startTextBox17 = new System.Windows.Forms.TextBox(); + this.exclamation15 = new System.Windows.Forms.Label(); + this.endTextBox17 = new System.Windows.Forms.TextBox(); + this.label17 = new System.Windows.Forms.Label(); + this.startTextBox16 = new System.Windows.Forms.TextBox(); + this.exclamation14 = new System.Windows.Forms.Label(); + this.endTextBox16 = new System.Windows.Forms.TextBox(); + this.label16 = new System.Windows.Forms.Label(); + this.startTextBox15 = new System.Windows.Forms.TextBox(); + this.exclamation13 = new System.Windows.Forms.Label(); + this.endTextBox15 = new System.Windows.Forms.TextBox(); + this.label15 = new System.Windows.Forms.Label(); + this.startTextBox14 = new System.Windows.Forms.TextBox(); + this.end2Label = new System.Windows.Forms.Label(); + this.endTextBox14 = new System.Windows.Forms.TextBox(); + this.label14 = new System.Windows.Forms.Label(); + this.startTextBox13 = new System.Windows.Forms.TextBox(); + this.start2Label = new System.Windows.Forms.Label(); + this.endTextBox13 = new System.Windows.Forms.TextBox(); + this.label13 = new System.Windows.Forms.Label(); + this.exclamation25 = new System.Windows.Forms.Label(); + this.startTextBox25 = new System.Windows.Forms.TextBox(); + this.endTextBox25 = new System.Windows.Forms.TextBox(); + this.label25 = new System.Windows.Forms.Label(); + this.label26 = new System.Windows.Forms.Label(); + this.label27 = new System.Windows.Forms.Label(); + this.label28 = new System.Windows.Forms.Label(); + this.label29 = new System.Windows.Forms.Label(); + this.label30 = new System.Windows.Forms.Label(); + this.label31 = new System.Windows.Forms.Label(); + this.label32 = new System.Windows.Forms.Label(); + this.label33 = new System.Windows.Forms.Label(); + this.label34 = new System.Windows.Forms.Label(); + this.label35 = new System.Windows.Forms.Label(); + this.label36 = new System.Windows.Forms.Label(); + this.label37 = new System.Windows.Forms.Label(); + this.label38 = new System.Windows.Forms.Label(); + this.label39 = new System.Windows.Forms.Label(); + this.label40 = new System.Windows.Forms.Label(); + this.label41 = new System.Windows.Forms.Label(); + this.label42 = new System.Windows.Forms.Label(); + this.label43 = new System.Windows.Forms.Label(); + this.label44 = new System.Windows.Forms.Label(); + this.label45 = new System.Windows.Forms.Label(); + this.label46 = new System.Windows.Forms.Label(); + this.label47 = new System.Windows.Forms.Label(); + this.label48 = new System.Windows.Forms.Label(); + this.startTextBox48 = new System.Windows.Forms.TextBox(); + this.startTextBox47 = new System.Windows.Forms.TextBox(); + this.startTextBox46 = new System.Windows.Forms.TextBox(); + this.startTextBox45 = new System.Windows.Forms.TextBox(); + this.startTextBox44 = new System.Windows.Forms.TextBox(); + this.startTextBox43 = new System.Windows.Forms.TextBox(); + this.startTextBox42 = new System.Windows.Forms.TextBox(); + this.startTextBox41 = new System.Windows.Forms.TextBox(); + this.startTextBox40 = new System.Windows.Forms.TextBox(); + this.startTextBox39 = new System.Windows.Forms.TextBox(); + this.startTextBox38 = new System.Windows.Forms.TextBox(); + this.startTextBox37 = new System.Windows.Forms.TextBox(); + this.startTextBox36 = new System.Windows.Forms.TextBox(); + this.startTextBox35 = new System.Windows.Forms.TextBox(); + this.startTextBox34 = new System.Windows.Forms.TextBox(); + this.startTextBox33 = new System.Windows.Forms.TextBox(); + this.startTextBox32 = new System.Windows.Forms.TextBox(); + this.startTextBox31 = new System.Windows.Forms.TextBox(); + this.startTextBox30 = new System.Windows.Forms.TextBox(); + this.startTextBox29 = new System.Windows.Forms.TextBox(); + this.startTextBox28 = new System.Windows.Forms.TextBox(); + this.startTextBox27 = new System.Windows.Forms.TextBox(); + this.startTextBox26 = new System.Windows.Forms.TextBox(); + this.exclamation48 = new System.Windows.Forms.Label(); + this.endTextBox48 = new System.Windows.Forms.TextBox(); + this.exclamation47 = new System.Windows.Forms.Label(); + this.endTextBox47 = new System.Windows.Forms.TextBox(); + this.exclamation46 = new System.Windows.Forms.Label(); + this.endTextBox46 = new System.Windows.Forms.TextBox(); + this.exclamation45 = new System.Windows.Forms.Label(); + this.endTextBox45 = new System.Windows.Forms.TextBox(); + this.exclamation44 = new System.Windows.Forms.Label(); + this.endTextBox44 = new System.Windows.Forms.TextBox(); + this.exclamation43 = new System.Windows.Forms.Label(); + this.endTextBox43 = new System.Windows.Forms.TextBox(); + this.exclamation42 = new System.Windows.Forms.Label(); + this.exclamation41 = new System.Windows.Forms.Label(); + this.exclamation40 = new System.Windows.Forms.Label(); + this.endTextBox42 = new System.Windows.Forms.TextBox(); + this.exclamation39 = new System.Windows.Forms.Label(); + this.endTextBox41 = new System.Windows.Forms.TextBox(); + this.exclamation38 = new System.Windows.Forms.Label(); + this.endTextBox40 = new System.Windows.Forms.TextBox(); + this.exclamation37 = new System.Windows.Forms.Label(); + this.endTextBox39 = new System.Windows.Forms.TextBox(); + this.endTextBox38 = new System.Windows.Forms.TextBox(); + this.endTextBox37 = new System.Windows.Forms.TextBox(); + this.exclamation36 = new System.Windows.Forms.Label(); + this.endTextBox36 = new System.Windows.Forms.TextBox(); + this.exclamation35 = new System.Windows.Forms.Label(); + this.endTextBox35 = new System.Windows.Forms.TextBox(); + this.exclamation34 = new System.Windows.Forms.Label(); + this.endTextBox34 = new System.Windows.Forms.TextBox(); + this.exclamation33 = new System.Windows.Forms.Label(); + this.endTextBox33 = new System.Windows.Forms.TextBox(); + this.exclamation32 = new System.Windows.Forms.Label(); + this.endTextBox32 = new System.Windows.Forms.TextBox(); + this.exclamation31 = new System.Windows.Forms.Label(); + this.endTextBox31 = new System.Windows.Forms.TextBox(); + this.exclamation30 = new System.Windows.Forms.Label(); + this.exclamation29 = new System.Windows.Forms.Label(); + this.exclamation28 = new System.Windows.Forms.Label(); + this.endTextBox30 = new System.Windows.Forms.TextBox(); + this.exclamation27 = new System.Windows.Forms.Label(); + this.endTextBox29 = new System.Windows.Forms.TextBox(); + this.exclamation26 = new System.Windows.Forms.Label(); + this.endTextBox28 = new System.Windows.Forms.TextBox(); + this.endTextBox27 = new System.Windows.Forms.TextBox(); + this.endTextBox26 = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // exclamation1 + // + this.exclamation1.AutoSize = true; + this.exclamation1.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation1.ForeColor = System.Drawing.Color.Red; + this.exclamation1.Location = new System.Drawing.Point(532, 30); + this.exclamation1.Name = "exclamation1"; + this.exclamation1.Size = new System.Drawing.Size(26, 32); + this.exclamation1.TabIndex = 5; + this.exclamation1.Text = "!"; + this.exclamation1.Visible = false; + // + // startTextBox1 + // + this.startTextBox1.Enabled = false; + this.startTextBox1.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox1.Location = new System.Drawing.Point(185, 34); + this.startTextBox1.Name = "startTextBox1"; + this.startTextBox1.Size = new System.Drawing.Size(163, 27); + this.startTextBox1.TabIndex = 3; + this.startTextBox1.Visible = false; + this.startTextBox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox1_KeyPress); + // + // endTextBox1 + // + this.endTextBox1.Enabled = false; + this.endTextBox1.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox1.Location = new System.Drawing.Point(367, 34); + this.endTextBox1.Name = "endTextBox1"; + this.endTextBox1.Size = new System.Drawing.Size(163, 27); + this.endTextBox1.TabIndex = 4; + this.endTextBox1.Visible = false; + this.endTextBox1.TextChanged += new System.EventHandler(this.endTextBox1_TextChanged); + this.endTextBox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox1_KeyPress); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label1.Location = new System.Drawing.Point(23, 37); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(126, 18); + this.label1.TabIndex = 2; + this.label1.Text = "Water Meter 1"; + this.label1.Visible = false; + // + // okButton + // + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(1138, 34); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(98, 63); + this.okButton.TabIndex = 100; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // exclamation3 + // + this.exclamation3.AutoSize = true; + this.exclamation3.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation3.ForeColor = System.Drawing.Color.Red; + this.exclamation3.Location = new System.Drawing.Point(532, 90); + this.exclamation3.Name = "exclamation3"; + this.exclamation3.Size = new System.Drawing.Size(26, 32); + this.exclamation3.TabIndex = 13; + this.exclamation3.Text = "!"; + this.exclamation3.Visible = false; + // + // startTextBox3 + // + this.startTextBox3.Enabled = false; + this.startTextBox3.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox3.Location = new System.Drawing.Point(185, 94); + this.startTextBox3.Name = "startTextBox3"; + this.startTextBox3.Size = new System.Drawing.Size(163, 27); + this.startTextBox3.TabIndex = 11; + this.startTextBox3.Visible = false; + this.startTextBox3.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox3_KeyPress); + // + // endTextBox3 + // + this.endTextBox3.Enabled = false; + this.endTextBox3.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox3.Location = new System.Drawing.Point(367, 94); + this.endTextBox3.Name = "endTextBox3"; + this.endTextBox3.Size = new System.Drawing.Size(163, 27); + this.endTextBox3.TabIndex = 12; + this.endTextBox3.Visible = false; + this.endTextBox3.TextChanged += new System.EventHandler(this.endTextBox3_TextChanged); + this.endTextBox3.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox3_KeyPress); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label3.Location = new System.Drawing.Point(23, 97); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(126, 18); + this.label3.TabIndex = 10; + this.label3.Text = "Water Meter 3"; + this.label3.Visible = false; + // + // exclamation4 + // + this.exclamation4.AutoSize = true; + this.exclamation4.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation4.ForeColor = System.Drawing.Color.Red; + this.exclamation4.Location = new System.Drawing.Point(532, 120); + this.exclamation4.Name = "exclamation4"; + this.exclamation4.Size = new System.Drawing.Size(26, 32); + this.exclamation4.TabIndex = 17; + this.exclamation4.Text = "!"; + this.exclamation4.Visible = false; + // + // startTextBox4 + // + this.startTextBox4.Enabled = false; + this.startTextBox4.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox4.Location = new System.Drawing.Point(185, 124); + this.startTextBox4.Name = "startTextBox4"; + this.startTextBox4.Size = new System.Drawing.Size(163, 27); + this.startTextBox4.TabIndex = 15; + this.startTextBox4.Visible = false; + this.startTextBox4.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox4_KeyPress); + // + // endTextBox4 + // + this.endTextBox4.Enabled = false; + this.endTextBox4.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox4.Location = new System.Drawing.Point(367, 124); + this.endTextBox4.Name = "endTextBox4"; + this.endTextBox4.Size = new System.Drawing.Size(163, 27); + this.endTextBox4.TabIndex = 16; + this.endTextBox4.Visible = false; + this.endTextBox4.TextChanged += new System.EventHandler(this.endTextBox4_TextChanged); + this.endTextBox4.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox4_KeyPress); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label4.Location = new System.Drawing.Point(23, 127); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(126, 18); + this.label4.TabIndex = 14; + this.label4.Text = "Water Meter 4"; + this.label4.Visible = false; + // + // exclamation5 + // + this.exclamation5.AutoSize = true; + this.exclamation5.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation5.ForeColor = System.Drawing.Color.Red; + this.exclamation5.Location = new System.Drawing.Point(532, 150); + this.exclamation5.Name = "exclamation5"; + this.exclamation5.Size = new System.Drawing.Size(26, 32); + this.exclamation5.TabIndex = 21; + this.exclamation5.Text = "!"; + this.exclamation5.Visible = false; + // + // startTextBox5 + // + this.startTextBox5.Enabled = false; + this.startTextBox5.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox5.Location = new System.Drawing.Point(185, 154); + this.startTextBox5.Name = "startTextBox5"; + this.startTextBox5.Size = new System.Drawing.Size(163, 27); + this.startTextBox5.TabIndex = 19; + this.startTextBox5.Visible = false; + this.startTextBox5.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox5_KeyPress); + // + // endTextBox5 + // + this.endTextBox5.Enabled = false; + this.endTextBox5.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox5.Location = new System.Drawing.Point(367, 154); + this.endTextBox5.Name = "endTextBox5"; + this.endTextBox5.Size = new System.Drawing.Size(163, 27); + this.endTextBox5.TabIndex = 20; + this.endTextBox5.Visible = false; + this.endTextBox5.TextChanged += new System.EventHandler(this.endTextBox5_TextChanged); + this.endTextBox5.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox5_KeyPress); + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label5.Location = new System.Drawing.Point(23, 157); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(126, 18); + this.label5.TabIndex = 18; + this.label5.Text = "Water Meter 5"; + this.label5.Visible = false; + // + // exclamation6 + // + this.exclamation6.AutoSize = true; + this.exclamation6.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation6.ForeColor = System.Drawing.Color.Red; + this.exclamation6.Location = new System.Drawing.Point(532, 180); + this.exclamation6.Name = "exclamation6"; + this.exclamation6.Size = new System.Drawing.Size(26, 32); + this.exclamation6.TabIndex = 25; + this.exclamation6.Text = "!"; + this.exclamation6.Visible = false; + // + // startTextBox6 + // + this.startTextBox6.Enabled = false; + this.startTextBox6.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox6.Location = new System.Drawing.Point(185, 184); + this.startTextBox6.Name = "startTextBox6"; + this.startTextBox6.Size = new System.Drawing.Size(163, 27); + this.startTextBox6.TabIndex = 23; + this.startTextBox6.Visible = false; + this.startTextBox6.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox6_KeyPress); + // + // endTextBox6 + // + this.endTextBox6.Enabled = false; + this.endTextBox6.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox6.Location = new System.Drawing.Point(367, 184); + this.endTextBox6.Name = "endTextBox6"; + this.endTextBox6.Size = new System.Drawing.Size(163, 27); + this.endTextBox6.TabIndex = 24; + this.endTextBox6.Visible = false; + this.endTextBox6.TextChanged += new System.EventHandler(this.endTextBox6_TextChanged); + this.endTextBox6.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox6_KeyPress); + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label6.Location = new System.Drawing.Point(23, 187); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(126, 18); + this.label6.TabIndex = 22; + this.label6.Text = "Water Meter 6"; + this.label6.Visible = false; + // + // startLabel + // + this.startLabel.AutoSize = true; + this.startLabel.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startLabel.Location = new System.Drawing.Point(237, 6); + this.startLabel.Name = "startLabel"; + this.startLabel.Size = new System.Drawing.Size(56, 23); + this.startLabel.TabIndex = 0; + this.startLabel.Text = "Start"; + // + // endLabel + // + this.endLabel.AutoSize = true; + this.endLabel.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endLabel.Location = new System.Drawing.Point(423, 6); + this.endLabel.Name = "endLabel"; + this.endLabel.Size = new System.Drawing.Size(46, 23); + this.endLabel.TabIndex = 1; + this.endLabel.Text = "End"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label2.Location = new System.Drawing.Point(23, 67); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(126, 18); + this.label2.TabIndex = 6; + this.label2.Text = "Water Meter 2"; + this.label2.Visible = false; + // + // endTextBox2 + // + this.endTextBox2.Enabled = false; + this.endTextBox2.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox2.Location = new System.Drawing.Point(367, 64); + this.endTextBox2.Name = "endTextBox2"; + this.endTextBox2.Size = new System.Drawing.Size(163, 27); + this.endTextBox2.TabIndex = 8; + this.endTextBox2.Visible = false; + this.endTextBox2.TextChanged += new System.EventHandler(this.endTextBox2_TextChanged); + this.endTextBox2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox2_KeyPress); + // + // startTextBox2 + // + this.startTextBox2.Enabled = false; + this.startTextBox2.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox2.Location = new System.Drawing.Point(185, 64); + this.startTextBox2.Name = "startTextBox2"; + this.startTextBox2.Size = new System.Drawing.Size(163, 27); + this.startTextBox2.TabIndex = 7; + this.startTextBox2.Visible = false; + this.startTextBox2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox2_KeyPress); + // + // exclamation2 + // + this.exclamation2.AutoSize = true; + this.exclamation2.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation2.ForeColor = System.Drawing.Color.Red; + this.exclamation2.Location = new System.Drawing.Point(532, 60); + this.exclamation2.Name = "exclamation2"; + this.exclamation2.Size = new System.Drawing.Size(26, 32); + this.exclamation2.TabIndex = 9; + this.exclamation2.Text = "!"; + this.exclamation2.Visible = false; + // + // exclamation7 + // + this.exclamation7.AutoSize = true; + this.exclamation7.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation7.ForeColor = System.Drawing.Color.Red; + this.exclamation7.Location = new System.Drawing.Point(532, 210); + this.exclamation7.Name = "exclamation7"; + this.exclamation7.Size = new System.Drawing.Size(26, 32); + this.exclamation7.TabIndex = 29; + this.exclamation7.Text = "!"; + this.exclamation7.Visible = false; + // + // startTextBox7 + // + this.startTextBox7.Enabled = false; + this.startTextBox7.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox7.Location = new System.Drawing.Point(185, 214); + this.startTextBox7.Name = "startTextBox7"; + this.startTextBox7.Size = new System.Drawing.Size(163, 27); + this.startTextBox7.TabIndex = 27; + this.startTextBox7.Visible = false; + this.startTextBox7.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox7_KeyPress); + // + // endTextBox7 + // + this.endTextBox7.Enabled = false; + this.endTextBox7.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox7.Location = new System.Drawing.Point(367, 214); + this.endTextBox7.Name = "endTextBox7"; + this.endTextBox7.Size = new System.Drawing.Size(163, 27); + this.endTextBox7.TabIndex = 28; + this.endTextBox7.Visible = false; + this.endTextBox7.TextChanged += new System.EventHandler(this.endTextBox7_TextChanged); + this.endTextBox7.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox7_KeyPress); + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label7.Location = new System.Drawing.Point(23, 217); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(126, 18); + this.label7.TabIndex = 26; + this.label7.Text = "Water Meter 7"; + this.label7.Visible = false; + // + // exclamation8 + // + this.exclamation8.AutoSize = true; + this.exclamation8.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation8.ForeColor = System.Drawing.Color.Red; + this.exclamation8.Location = new System.Drawing.Point(532, 240); + this.exclamation8.Name = "exclamation8"; + this.exclamation8.Size = new System.Drawing.Size(26, 32); + this.exclamation8.TabIndex = 33; + this.exclamation8.Text = "!"; + this.exclamation8.Visible = false; + // + // startTextBox8 + // + this.startTextBox8.Enabled = false; + this.startTextBox8.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox8.Location = new System.Drawing.Point(185, 244); + this.startTextBox8.Name = "startTextBox8"; + this.startTextBox8.Size = new System.Drawing.Size(163, 27); + this.startTextBox8.TabIndex = 31; + this.startTextBox8.Visible = false; + this.startTextBox8.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox8_KeyPress); + // + // endTextBox8 + // + this.endTextBox8.Enabled = false; + this.endTextBox8.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox8.Location = new System.Drawing.Point(367, 244); + this.endTextBox8.Name = "endTextBox8"; + this.endTextBox8.Size = new System.Drawing.Size(163, 27); + this.endTextBox8.TabIndex = 32; + this.endTextBox8.Visible = false; + this.endTextBox8.TextChanged += new System.EventHandler(this.endTextBox8_TextChanged); + this.endTextBox8.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox8_KeyPress); + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label8.Location = new System.Drawing.Point(23, 247); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(126, 18); + this.label8.TabIndex = 30; + this.label8.Text = "Water Meter 8"; + this.label8.Visible = false; + // + // exclamation9 + // + this.exclamation9.AutoSize = true; + this.exclamation9.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation9.ForeColor = System.Drawing.Color.Red; + this.exclamation9.Location = new System.Drawing.Point(532, 270); + this.exclamation9.Name = "exclamation9"; + this.exclamation9.Size = new System.Drawing.Size(26, 32); + this.exclamation9.TabIndex = 37; + this.exclamation9.Text = "!"; + this.exclamation9.Visible = false; + // + // startTextBox9 + // + this.startTextBox9.Enabled = false; + this.startTextBox9.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox9.Location = new System.Drawing.Point(185, 274); + this.startTextBox9.Name = "startTextBox9"; + this.startTextBox9.Size = new System.Drawing.Size(163, 27); + this.startTextBox9.TabIndex = 35; + this.startTextBox9.Visible = false; + this.startTextBox9.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox9_KeyPress); + // + // endTextBox9 + // + this.endTextBox9.Enabled = false; + this.endTextBox9.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox9.Location = new System.Drawing.Point(367, 274); + this.endTextBox9.Name = "endTextBox9"; + this.endTextBox9.Size = new System.Drawing.Size(163, 27); + this.endTextBox9.TabIndex = 36; + this.endTextBox9.Visible = false; + this.endTextBox9.TextChanged += new System.EventHandler(this.endTextBox9_TextChanged); + this.endTextBox9.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox9_KeyPress); + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label9.Location = new System.Drawing.Point(23, 277); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(126, 18); + this.label9.TabIndex = 34; + this.label9.Text = "Water Meter 9"; + this.label9.Visible = false; + // + // exclamation10 + // + this.exclamation10.AutoSize = true; + this.exclamation10.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation10.ForeColor = System.Drawing.Color.Red; + this.exclamation10.Location = new System.Drawing.Point(532, 300); + this.exclamation10.Name = "exclamation10"; + this.exclamation10.Size = new System.Drawing.Size(26, 32); + this.exclamation10.TabIndex = 41; + this.exclamation10.Text = "!"; + this.exclamation10.Visible = false; + // + // startTextBox10 + // + this.startTextBox10.Enabled = false; + this.startTextBox10.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox10.Location = new System.Drawing.Point(185, 304); + this.startTextBox10.Name = "startTextBox10"; + this.startTextBox10.Size = new System.Drawing.Size(163, 27); + this.startTextBox10.TabIndex = 39; + this.startTextBox10.Visible = false; + this.startTextBox10.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox10_KeyPress); + // + // endTextBox10 + // + this.endTextBox10.Enabled = false; + this.endTextBox10.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox10.Location = new System.Drawing.Point(367, 304); + this.endTextBox10.Name = "endTextBox10"; + this.endTextBox10.Size = new System.Drawing.Size(163, 27); + this.endTextBox10.TabIndex = 40; + this.endTextBox10.Visible = false; + this.endTextBox10.TextChanged += new System.EventHandler(this.endTextBox10_TextChanged); + this.endTextBox10.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox10_KeyPress); + // + // label10 + // + this.label10.AutoSize = true; + this.label10.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label10.Location = new System.Drawing.Point(23, 307); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(136, 18); + this.label10.TabIndex = 38; + this.label10.Text = "Water Meter 10"; + this.label10.Visible = false; + // + // exclamation11 + // + this.exclamation11.AutoSize = true; + this.exclamation11.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation11.ForeColor = System.Drawing.Color.Red; + this.exclamation11.Location = new System.Drawing.Point(532, 330); + this.exclamation11.Name = "exclamation11"; + this.exclamation11.Size = new System.Drawing.Size(26, 32); + this.exclamation11.TabIndex = 45; + this.exclamation11.Text = "!"; + this.exclamation11.Visible = false; + // + // startTextBox11 + // + this.startTextBox11.Enabled = false; + this.startTextBox11.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox11.Location = new System.Drawing.Point(185, 334); + this.startTextBox11.Name = "startTextBox11"; + this.startTextBox11.Size = new System.Drawing.Size(163, 27); + this.startTextBox11.TabIndex = 43; + this.startTextBox11.Visible = false; + this.startTextBox11.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox11_KeyPress); + // + // endTextBox11 + // + this.endTextBox11.Enabled = false; + this.endTextBox11.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox11.Location = new System.Drawing.Point(367, 334); + this.endTextBox11.Name = "endTextBox11"; + this.endTextBox11.Size = new System.Drawing.Size(163, 27); + this.endTextBox11.TabIndex = 44; + this.endTextBox11.Visible = false; + this.endTextBox11.TextChanged += new System.EventHandler(this.endTextBox11_TextChanged); + this.endTextBox11.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox11_KeyPress); + // + // label11 + // + this.label11.AutoSize = true; + this.label11.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label11.Location = new System.Drawing.Point(23, 337); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(136, 18); + this.label11.TabIndex = 42; + this.label11.Text = "Water Meter 11"; + this.label11.Visible = false; + // + // exclamation12 + // + this.exclamation12.AutoSize = true; + this.exclamation12.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation12.ForeColor = System.Drawing.Color.Red; + this.exclamation12.Location = new System.Drawing.Point(532, 360); + this.exclamation12.Name = "exclamation12"; + this.exclamation12.Size = new System.Drawing.Size(26, 32); + this.exclamation12.TabIndex = 49; + this.exclamation12.Text = "!"; + this.exclamation12.Visible = false; + // + // startTextBox12 + // + this.startTextBox12.Enabled = false; + this.startTextBox12.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox12.Location = new System.Drawing.Point(185, 364); + this.startTextBox12.Name = "startTextBox12"; + this.startTextBox12.Size = new System.Drawing.Size(163, 27); + this.startTextBox12.TabIndex = 47; + this.startTextBox12.Visible = false; + this.startTextBox12.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox12_KeyPress); + // + // endTextBox12 + // + this.endTextBox12.Enabled = false; + this.endTextBox12.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox12.Location = new System.Drawing.Point(367, 364); + this.endTextBox12.Name = "endTextBox12"; + this.endTextBox12.Size = new System.Drawing.Size(163, 27); + this.endTextBox12.TabIndex = 48; + this.endTextBox12.Visible = false; + this.endTextBox12.TextChanged += new System.EventHandler(this.endTextBox12_TextChanged); + this.endTextBox12.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox12_KeyPress); + // + // label12 + // + this.label12.AutoSize = true; + this.label12.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label12.Location = new System.Drawing.Point(23, 367); + this.label12.Name = "label12"; + this.label12.Size = new System.Drawing.Size(136, 18); + this.label12.TabIndex = 46; + this.label12.Text = "Water Meter 12"; + this.label12.Visible = false; + // + // exclamation24 + // + this.exclamation24.AutoSize = true; + this.exclamation24.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation24.ForeColor = System.Drawing.Color.Red; + this.exclamation24.Location = new System.Drawing.Point(532, 720); + this.exclamation24.Name = "exclamation24"; + this.exclamation24.Size = new System.Drawing.Size(26, 32); + this.exclamation24.TabIndex = 99; + this.exclamation24.Text = "!"; + this.exclamation24.Visible = false; + // + // startTextBox24 + // + this.startTextBox24.Enabled = false; + this.startTextBox24.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox24.Location = new System.Drawing.Point(185, 724); + this.startTextBox24.Name = "startTextBox24"; + this.startTextBox24.Size = new System.Drawing.Size(163, 27); + this.startTextBox24.TabIndex = 97; + this.startTextBox24.Visible = false; + this.startTextBox24.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox24_KeyPress); + // + // endTextBox24 + // + this.endTextBox24.Enabled = false; + this.endTextBox24.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox24.Location = new System.Drawing.Point(367, 724); + this.endTextBox24.Name = "endTextBox24"; + this.endTextBox24.Size = new System.Drawing.Size(163, 27); + this.endTextBox24.TabIndex = 98; + this.endTextBox24.Visible = false; + this.endTextBox24.TextChanged += new System.EventHandler(this.endTextBox24_TextChanged); + this.endTextBox24.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox24_KeyPress); + // + // label24 + // + this.label24.AutoSize = true; + this.label24.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label24.Location = new System.Drawing.Point(23, 727); + this.label24.Name = "label24"; + this.label24.Size = new System.Drawing.Size(136, 18); + this.label24.TabIndex = 96; + this.label24.Text = "Water Meter 24"; + this.label24.Visible = false; + // + // exclamation23 + // + this.exclamation23.AutoSize = true; + this.exclamation23.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation23.ForeColor = System.Drawing.Color.Red; + this.exclamation23.Location = new System.Drawing.Point(532, 690); + this.exclamation23.Name = "exclamation23"; + this.exclamation23.Size = new System.Drawing.Size(26, 32); + this.exclamation23.TabIndex = 95; + this.exclamation23.Text = "!"; + this.exclamation23.Visible = false; + // + // startTextBox23 + // + this.startTextBox23.Enabled = false; + this.startTextBox23.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox23.Location = new System.Drawing.Point(185, 694); + this.startTextBox23.Name = "startTextBox23"; + this.startTextBox23.Size = new System.Drawing.Size(163, 27); + this.startTextBox23.TabIndex = 93; + this.startTextBox23.Visible = false; + this.startTextBox23.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox23_KeyPress); + // + // endTextBox23 + // + this.endTextBox23.Enabled = false; + this.endTextBox23.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox23.Location = new System.Drawing.Point(367, 694); + this.endTextBox23.Name = "endTextBox23"; + this.endTextBox23.Size = new System.Drawing.Size(163, 27); + this.endTextBox23.TabIndex = 94; + this.endTextBox23.Visible = false; + this.endTextBox23.TextChanged += new System.EventHandler(this.endTextBox23_TextChanged); + this.endTextBox23.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox23_KeyPress); + // + // label23 + // + this.label23.AutoSize = true; + this.label23.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label23.Location = new System.Drawing.Point(23, 697); + this.label23.Name = "label23"; + this.label23.Size = new System.Drawing.Size(136, 18); + this.label23.TabIndex = 92; + this.label23.Text = "Water Meter 23"; + this.label23.Visible = false; + // + // exclamation22 + // + this.exclamation22.AutoSize = true; + this.exclamation22.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation22.ForeColor = System.Drawing.Color.Red; + this.exclamation22.Location = new System.Drawing.Point(532, 660); + this.exclamation22.Name = "exclamation22"; + this.exclamation22.Size = new System.Drawing.Size(26, 32); + this.exclamation22.TabIndex = 91; + this.exclamation22.Text = "!"; + this.exclamation22.Visible = false; + // + // startTextBox22 + // + this.startTextBox22.Enabled = false; + this.startTextBox22.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox22.Location = new System.Drawing.Point(185, 664); + this.startTextBox22.Name = "startTextBox22"; + this.startTextBox22.Size = new System.Drawing.Size(163, 27); + this.startTextBox22.TabIndex = 89; + this.startTextBox22.Visible = false; + this.startTextBox22.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox22_KeyPress); + // + // endTextBox22 + // + this.endTextBox22.Enabled = false; + this.endTextBox22.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox22.Location = new System.Drawing.Point(367, 664); + this.endTextBox22.Name = "endTextBox22"; + this.endTextBox22.Size = new System.Drawing.Size(163, 27); + this.endTextBox22.TabIndex = 90; + this.endTextBox22.Visible = false; + this.endTextBox22.TextChanged += new System.EventHandler(this.endTextBox22_TextChanged); + this.endTextBox22.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox22_KeyPress); + // + // label22 + // + this.label22.AutoSize = true; + this.label22.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label22.Location = new System.Drawing.Point(23, 667); + this.label22.Name = "label22"; + this.label22.Size = new System.Drawing.Size(136, 18); + this.label22.TabIndex = 88; + this.label22.Text = "Water Meter 22"; + this.label22.Visible = false; + // + // exclamation21 + // + this.exclamation21.AutoSize = true; + this.exclamation21.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation21.ForeColor = System.Drawing.Color.Red; + this.exclamation21.Location = new System.Drawing.Point(532, 630); + this.exclamation21.Name = "exclamation21"; + this.exclamation21.Size = new System.Drawing.Size(26, 32); + this.exclamation21.TabIndex = 87; + this.exclamation21.Text = "!"; + this.exclamation21.Visible = false; + // + // startTextBox21 + // + this.startTextBox21.Enabled = false; + this.startTextBox21.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox21.Location = new System.Drawing.Point(185, 634); + this.startTextBox21.Name = "startTextBox21"; + this.startTextBox21.Size = new System.Drawing.Size(163, 27); + this.startTextBox21.TabIndex = 85; + this.startTextBox21.Visible = false; + this.startTextBox21.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox21_KeyPress); + // + // endTextBox21 + // + this.endTextBox21.Enabled = false; + this.endTextBox21.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox21.Location = new System.Drawing.Point(367, 634); + this.endTextBox21.Name = "endTextBox21"; + this.endTextBox21.Size = new System.Drawing.Size(163, 27); + this.endTextBox21.TabIndex = 86; + this.endTextBox21.Visible = false; + this.endTextBox21.TextChanged += new System.EventHandler(this.endTextBox21_TextChanged); + this.endTextBox21.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox21_KeyPress); + // + // label21 + // + this.label21.AutoSize = true; + this.label21.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label21.Location = new System.Drawing.Point(23, 637); + this.label21.Name = "label21"; + this.label21.Size = new System.Drawing.Size(136, 18); + this.label21.TabIndex = 84; + this.label21.Text = "Water Meter 21"; + this.label21.Visible = false; + // + // exclamation20 + // + this.exclamation20.AutoSize = true; + this.exclamation20.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation20.ForeColor = System.Drawing.Color.Red; + this.exclamation20.Location = new System.Drawing.Point(532, 600); + this.exclamation20.Name = "exclamation20"; + this.exclamation20.Size = new System.Drawing.Size(26, 32); + this.exclamation20.TabIndex = 83; + this.exclamation20.Text = "!"; + this.exclamation20.Visible = false; + // + // startTextBox20 + // + this.startTextBox20.Enabled = false; + this.startTextBox20.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox20.Location = new System.Drawing.Point(185, 604); + this.startTextBox20.Name = "startTextBox20"; + this.startTextBox20.Size = new System.Drawing.Size(163, 27); + this.startTextBox20.TabIndex = 81; + this.startTextBox20.Visible = false; + this.startTextBox20.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox20_KeyPress); + // + // endTextBox20 + // + this.endTextBox20.Enabled = false; + this.endTextBox20.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox20.Location = new System.Drawing.Point(367, 604); + this.endTextBox20.Name = "endTextBox20"; + this.endTextBox20.Size = new System.Drawing.Size(163, 27); + this.endTextBox20.TabIndex = 82; + this.endTextBox20.Visible = false; + this.endTextBox20.TextChanged += new System.EventHandler(this.endTextBox20_TextChanged); + this.endTextBox20.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox20_KeyPress); + // + // label20 + // + this.label20.AutoSize = true; + this.label20.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label20.Location = new System.Drawing.Point(23, 607); + this.label20.Name = "label20"; + this.label20.Size = new System.Drawing.Size(136, 18); + this.label20.TabIndex = 80; + this.label20.Text = "Water Meter 20"; + this.label20.Visible = false; + // + // exclamation19 + // + this.exclamation19.AutoSize = true; + this.exclamation19.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation19.ForeColor = System.Drawing.Color.Red; + this.exclamation19.Location = new System.Drawing.Point(532, 570); + this.exclamation19.Name = "exclamation19"; + this.exclamation19.Size = new System.Drawing.Size(26, 32); + this.exclamation19.TabIndex = 79; + this.exclamation19.Text = "!"; + this.exclamation19.Visible = false; + // + // startTextBox19 + // + this.startTextBox19.Enabled = false; + this.startTextBox19.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox19.Location = new System.Drawing.Point(185, 574); + this.startTextBox19.Name = "startTextBox19"; + this.startTextBox19.Size = new System.Drawing.Size(163, 27); + this.startTextBox19.TabIndex = 77; + this.startTextBox19.Visible = false; + this.startTextBox19.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox19_KeyPress); + // + // endTextBox19 + // + this.endTextBox19.Enabled = false; + this.endTextBox19.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox19.Location = new System.Drawing.Point(367, 574); + this.endTextBox19.Name = "endTextBox19"; + this.endTextBox19.Size = new System.Drawing.Size(163, 27); + this.endTextBox19.TabIndex = 78; + this.endTextBox19.Visible = false; + this.endTextBox19.TextChanged += new System.EventHandler(this.endTextBox19_TextChanged); + this.endTextBox19.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox19_KeyPress); + // + // label19 + // + this.label19.AutoSize = true; + this.label19.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label19.Location = new System.Drawing.Point(23, 577); + this.label19.Name = "label19"; + this.label19.Size = new System.Drawing.Size(136, 18); + this.label19.TabIndex = 76; + this.label19.Text = "Water Meter 19"; + this.label19.Visible = false; + // + // exclamation18 + // + this.exclamation18.AutoSize = true; + this.exclamation18.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation18.ForeColor = System.Drawing.Color.Red; + this.exclamation18.Location = new System.Drawing.Point(532, 540); + this.exclamation18.Name = "exclamation18"; + this.exclamation18.Size = new System.Drawing.Size(26, 32); + this.exclamation18.TabIndex = 75; + this.exclamation18.Text = "!"; + this.exclamation18.Visible = false; + // + // exclamation17 + // + this.exclamation17.AutoSize = true; + this.exclamation17.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation17.ForeColor = System.Drawing.Color.Red; + this.exclamation17.Location = new System.Drawing.Point(532, 510); + this.exclamation17.Name = "exclamation17"; + this.exclamation17.Size = new System.Drawing.Size(26, 32); + this.exclamation17.TabIndex = 71; + this.exclamation17.Text = "!"; + this.exclamation17.Visible = false; + // + // startTextBox18 + // + this.startTextBox18.Enabled = false; + this.startTextBox18.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox18.Location = new System.Drawing.Point(185, 544); + this.startTextBox18.Name = "startTextBox18"; + this.startTextBox18.Size = new System.Drawing.Size(163, 27); + this.startTextBox18.TabIndex = 73; + this.startTextBox18.Visible = false; + this.startTextBox18.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox18_KeyPress); + // + // exclamation16 + // + this.exclamation16.AutoSize = true; + this.exclamation16.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation16.ForeColor = System.Drawing.Color.Red; + this.exclamation16.Location = new System.Drawing.Point(532, 480); + this.exclamation16.Name = "exclamation16"; + this.exclamation16.Size = new System.Drawing.Size(26, 32); + this.exclamation16.TabIndex = 67; + this.exclamation16.Text = "!"; + this.exclamation16.Visible = false; + // + // endTextBox18 + // + this.endTextBox18.Enabled = false; + this.endTextBox18.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox18.Location = new System.Drawing.Point(367, 544); + this.endTextBox18.Name = "endTextBox18"; + this.endTextBox18.Size = new System.Drawing.Size(163, 27); + this.endTextBox18.TabIndex = 74; + this.endTextBox18.Visible = false; + this.endTextBox18.TextChanged += new System.EventHandler(this.endTextBox18_TextChanged); + this.endTextBox18.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox18_KeyPress); + // + // label18 + // + this.label18.AutoSize = true; + this.label18.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label18.Location = new System.Drawing.Point(23, 547); + this.label18.Name = "label18"; + this.label18.Size = new System.Drawing.Size(136, 18); + this.label18.TabIndex = 72; + this.label18.Text = "Water Meter 18"; + this.label18.Visible = false; + // + // startTextBox17 + // + this.startTextBox17.Enabled = false; + this.startTextBox17.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox17.Location = new System.Drawing.Point(185, 514); + this.startTextBox17.Name = "startTextBox17"; + this.startTextBox17.Size = new System.Drawing.Size(163, 27); + this.startTextBox17.TabIndex = 69; + this.startTextBox17.Visible = false; + this.startTextBox17.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox17_KeyPress); + // + // exclamation15 + // + this.exclamation15.AutoSize = true; + this.exclamation15.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation15.ForeColor = System.Drawing.Color.Red; + this.exclamation15.Location = new System.Drawing.Point(532, 450); + this.exclamation15.Name = "exclamation15"; + this.exclamation15.Size = new System.Drawing.Size(26, 32); + this.exclamation15.TabIndex = 63; + this.exclamation15.Text = "!"; + this.exclamation15.Visible = false; + // + // endTextBox17 + // + this.endTextBox17.Enabled = false; + this.endTextBox17.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox17.Location = new System.Drawing.Point(367, 514); + this.endTextBox17.Name = "endTextBox17"; + this.endTextBox17.Size = new System.Drawing.Size(163, 27); + this.endTextBox17.TabIndex = 70; + this.endTextBox17.Visible = false; + this.endTextBox17.TextChanged += new System.EventHandler(this.endTextBox17_TextChanged); + this.endTextBox17.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox17_KeyPress); + // + // label17 + // + this.label17.AutoSize = true; + this.label17.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label17.Location = new System.Drawing.Point(23, 517); + this.label17.Name = "label17"; + this.label17.Size = new System.Drawing.Size(136, 18); + this.label17.TabIndex = 68; + this.label17.Text = "Water Meter 17"; + this.label17.Visible = false; + // + // startTextBox16 + // + this.startTextBox16.Enabled = false; + this.startTextBox16.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox16.Location = new System.Drawing.Point(185, 484); + this.startTextBox16.Name = "startTextBox16"; + this.startTextBox16.Size = new System.Drawing.Size(163, 27); + this.startTextBox16.TabIndex = 65; + this.startTextBox16.Visible = false; + this.startTextBox16.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox16_KeyPress); + // + // exclamation14 + // + this.exclamation14.AutoSize = true; + this.exclamation14.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation14.ForeColor = System.Drawing.Color.Red; + this.exclamation14.Location = new System.Drawing.Point(532, 420); + this.exclamation14.Name = "exclamation14"; + this.exclamation14.Size = new System.Drawing.Size(26, 32); + this.exclamation14.TabIndex = 59; + this.exclamation14.Text = "!"; + this.exclamation14.Visible = false; + // + // endTextBox16 + // + this.endTextBox16.Enabled = false; + this.endTextBox16.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox16.Location = new System.Drawing.Point(367, 484); + this.endTextBox16.Name = "endTextBox16"; + this.endTextBox16.Size = new System.Drawing.Size(163, 27); + this.endTextBox16.TabIndex = 66; + this.endTextBox16.Visible = false; + this.endTextBox16.TextChanged += new System.EventHandler(this.endTextBox16_TextChanged); + this.endTextBox16.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox16_KeyPress); + // + // label16 + // + this.label16.AutoSize = true; + this.label16.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label16.Location = new System.Drawing.Point(23, 487); + this.label16.Name = "label16"; + this.label16.Size = new System.Drawing.Size(136, 18); + this.label16.TabIndex = 64; + this.label16.Text = "Water Meter 16"; + this.label16.Visible = false; + // + // startTextBox15 + // + this.startTextBox15.Enabled = false; + this.startTextBox15.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox15.Location = new System.Drawing.Point(185, 454); + this.startTextBox15.Name = "startTextBox15"; + this.startTextBox15.Size = new System.Drawing.Size(163, 27); + this.startTextBox15.TabIndex = 61; + this.startTextBox15.Visible = false; + this.startTextBox15.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox15_KeyPress); + // + // exclamation13 + // + this.exclamation13.AutoSize = true; + this.exclamation13.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation13.ForeColor = System.Drawing.Color.Red; + this.exclamation13.Location = new System.Drawing.Point(532, 390); + this.exclamation13.Name = "exclamation13"; + this.exclamation13.Size = new System.Drawing.Size(26, 32); + this.exclamation13.TabIndex = 55; + this.exclamation13.Text = "!"; + this.exclamation13.Visible = false; + // + // endTextBox15 + // + this.endTextBox15.Enabled = false; + this.endTextBox15.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox15.Location = new System.Drawing.Point(367, 454); + this.endTextBox15.Name = "endTextBox15"; + this.endTextBox15.Size = new System.Drawing.Size(163, 27); + this.endTextBox15.TabIndex = 62; + this.endTextBox15.Visible = false; + this.endTextBox15.TextChanged += new System.EventHandler(this.endTextBox15_TextChanged); + this.endTextBox15.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox15_KeyPress); + // + // label15 + // + this.label15.AutoSize = true; + this.label15.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label15.Location = new System.Drawing.Point(23, 457); + this.label15.Name = "label15"; + this.label15.Size = new System.Drawing.Size(136, 18); + this.label15.TabIndex = 60; + this.label15.Text = "Water Meter 15"; + this.label15.Visible = false; + // + // startTextBox14 + // + this.startTextBox14.Enabled = false; + this.startTextBox14.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox14.Location = new System.Drawing.Point(185, 424); + this.startTextBox14.Name = "startTextBox14"; + this.startTextBox14.Size = new System.Drawing.Size(163, 27); + this.startTextBox14.TabIndex = 57; + this.startTextBox14.Visible = false; + this.startTextBox14.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox14_KeyPress); + // + // end2Label + // + this.end2Label.AutoSize = true; + this.end2Label.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.end2Label.Location = new System.Drawing.Point(992, 6); + this.end2Label.Name = "end2Label"; + this.end2Label.Size = new System.Drawing.Size(46, 23); + this.end2Label.TabIndex = 51; + this.end2Label.Text = "End"; + // + // endTextBox14 + // + this.endTextBox14.Enabled = false; + this.endTextBox14.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox14.Location = new System.Drawing.Point(367, 424); + this.endTextBox14.Name = "endTextBox14"; + this.endTextBox14.Size = new System.Drawing.Size(163, 27); + this.endTextBox14.TabIndex = 58; + this.endTextBox14.Visible = false; + this.endTextBox14.TextChanged += new System.EventHandler(this.endTextBox14_TextChanged); + this.endTextBox14.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox14_KeyPress); + // + // label14 + // + this.label14.AutoSize = true; + this.label14.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label14.Location = new System.Drawing.Point(23, 427); + this.label14.Name = "label14"; + this.label14.Size = new System.Drawing.Size(136, 18); + this.label14.TabIndex = 56; + this.label14.Text = "Water Meter 14"; + this.label14.Visible = false; + // + // startTextBox13 + // + this.startTextBox13.Enabled = false; + this.startTextBox13.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox13.Location = new System.Drawing.Point(185, 394); + this.startTextBox13.Name = "startTextBox13"; + this.startTextBox13.Size = new System.Drawing.Size(163, 27); + this.startTextBox13.TabIndex = 53; + this.startTextBox13.Visible = false; + this.startTextBox13.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox13_KeyPress); + // + // start2Label + // + this.start2Label.AutoSize = true; + this.start2Label.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.start2Label.Location = new System.Drawing.Point(802, 6); + this.start2Label.Name = "start2Label"; + this.start2Label.Size = new System.Drawing.Size(56, 23); + this.start2Label.TabIndex = 50; + this.start2Label.Text = "Start"; + // + // endTextBox13 + // + this.endTextBox13.Enabled = false; + this.endTextBox13.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox13.Location = new System.Drawing.Point(367, 394); + this.endTextBox13.Name = "endTextBox13"; + this.endTextBox13.Size = new System.Drawing.Size(163, 27); + this.endTextBox13.TabIndex = 54; + this.endTextBox13.Visible = false; + this.endTextBox13.TextChanged += new System.EventHandler(this.endTextBox13_TextChanged); + this.endTextBox13.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox13_KeyPress); + // + // label13 + // + this.label13.AutoSize = true; + this.label13.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label13.Location = new System.Drawing.Point(23, 397); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(136, 18); + this.label13.TabIndex = 52; + this.label13.Text = "Water Meter 13"; + this.label13.Visible = false; + // + // exclamation25 + // + this.exclamation25.AutoSize = true; + this.exclamation25.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation25.ForeColor = System.Drawing.Color.Red; + this.exclamation25.Location = new System.Drawing.Point(1095, 30); + this.exclamation25.Name = "exclamation25"; + this.exclamation25.Size = new System.Drawing.Size(26, 32); + this.exclamation25.TabIndex = 104; + this.exclamation25.Text = "!"; + this.exclamation25.Visible = false; + // + // startTextBox25 + // + this.startTextBox25.Enabled = false; + this.startTextBox25.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox25.Location = new System.Drawing.Point(748, 34); + this.startTextBox25.Name = "startTextBox25"; + this.startTextBox25.Size = new System.Drawing.Size(163, 27); + this.startTextBox25.TabIndex = 102; + this.startTextBox25.Visible = false; + this.startTextBox25.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox25_KeyPress); + // + // endTextBox25 + // + this.endTextBox25.Enabled = false; + this.endTextBox25.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox25.Location = new System.Drawing.Point(930, 34); + this.endTextBox25.Name = "endTextBox25"; + this.endTextBox25.Size = new System.Drawing.Size(163, 27); + this.endTextBox25.TabIndex = 103; + this.endTextBox25.Visible = false; + this.endTextBox25.TextChanged += new System.EventHandler(this.endTextBox25_TextChanged); + this.endTextBox25.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox25_KeyPress); + // + // label25 + // + this.label25.AutoSize = true; + this.label25.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label25.Location = new System.Drawing.Point(586, 37); + this.label25.Name = "label25"; + this.label25.Size = new System.Drawing.Size(136, 18); + this.label25.TabIndex = 101; + this.label25.Text = "Water Meter 25"; + this.label25.Visible = false; + // + // label26 + // + this.label26.AutoSize = true; + this.label26.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label26.Location = new System.Drawing.Point(586, 67); + this.label26.Name = "label26"; + this.label26.Size = new System.Drawing.Size(136, 18); + this.label26.TabIndex = 105; + this.label26.Text = "Water Meter 26"; + this.label26.Visible = false; + // + // label27 + // + this.label27.AutoSize = true; + this.label27.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label27.Location = new System.Drawing.Point(586, 97); + this.label27.Name = "label27"; + this.label27.Size = new System.Drawing.Size(136, 18); + this.label27.TabIndex = 106; + this.label27.Text = "Water Meter 27"; + this.label27.Visible = false; + // + // label28 + // + this.label28.AutoSize = true; + this.label28.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label28.Location = new System.Drawing.Point(586, 127); + this.label28.Name = "label28"; + this.label28.Size = new System.Drawing.Size(136, 18); + this.label28.TabIndex = 107; + this.label28.Text = "Water Meter 28"; + this.label28.Visible = false; + // + // label29 + // + this.label29.AutoSize = true; + this.label29.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label29.Location = new System.Drawing.Point(586, 157); + this.label29.Name = "label29"; + this.label29.Size = new System.Drawing.Size(136, 18); + this.label29.TabIndex = 108; + this.label29.Text = "Water Meter 29"; + this.label29.Visible = false; + // + // label30 + // + this.label30.AutoSize = true; + this.label30.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label30.Location = new System.Drawing.Point(586, 187); + this.label30.Name = "label30"; + this.label30.Size = new System.Drawing.Size(136, 18); + this.label30.TabIndex = 109; + this.label30.Text = "Water Meter 30"; + this.label30.Visible = false; + // + // label31 + // + this.label31.AutoSize = true; + this.label31.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label31.Location = new System.Drawing.Point(586, 217); + this.label31.Name = "label31"; + this.label31.Size = new System.Drawing.Size(136, 18); + this.label31.TabIndex = 110; + this.label31.Text = "Water Meter 31"; + this.label31.Visible = false; + // + // label32 + // + this.label32.AutoSize = true; + this.label32.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label32.Location = new System.Drawing.Point(586, 247); + this.label32.Name = "label32"; + this.label32.Size = new System.Drawing.Size(136, 18); + this.label32.TabIndex = 111; + this.label32.Text = "Water Meter 32"; + this.label32.Visible = false; + // + // label33 + // + this.label33.AutoSize = true; + this.label33.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label33.Location = new System.Drawing.Point(586, 277); + this.label33.Name = "label33"; + this.label33.Size = new System.Drawing.Size(136, 18); + this.label33.TabIndex = 112; + this.label33.Text = "Water Meter 33"; + this.label33.Visible = false; + // + // label34 + // + this.label34.AutoSize = true; + this.label34.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label34.Location = new System.Drawing.Point(586, 307); + this.label34.Name = "label34"; + this.label34.Size = new System.Drawing.Size(136, 18); + this.label34.TabIndex = 113; + this.label34.Text = "Water Meter 34"; + this.label34.Visible = false; + // + // label35 + // + this.label35.AutoSize = true; + this.label35.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label35.Location = new System.Drawing.Point(586, 337); + this.label35.Name = "label35"; + this.label35.Size = new System.Drawing.Size(136, 18); + this.label35.TabIndex = 114; + this.label35.Text = "Water Meter 35"; + this.label35.Visible = false; + // + // label36 + // + this.label36.AutoSize = true; + this.label36.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label36.Location = new System.Drawing.Point(586, 367); + this.label36.Name = "label36"; + this.label36.Size = new System.Drawing.Size(136, 18); + this.label36.TabIndex = 115; + this.label36.Text = "Water Meter 36"; + this.label36.Visible = false; + // + // label37 + // + this.label37.AutoSize = true; + this.label37.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label37.Location = new System.Drawing.Point(586, 397); + this.label37.Name = "label37"; + this.label37.Size = new System.Drawing.Size(136, 18); + this.label37.TabIndex = 116; + this.label37.Text = "Water Meter 37"; + this.label37.Visible = false; + // + // label38 + // + this.label38.AutoSize = true; + this.label38.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label38.Location = new System.Drawing.Point(586, 427); + this.label38.Name = "label38"; + this.label38.Size = new System.Drawing.Size(136, 18); + this.label38.TabIndex = 117; + this.label38.Text = "Water Meter 38"; + this.label38.Visible = false; + // + // label39 + // + this.label39.AutoSize = true; + this.label39.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label39.Location = new System.Drawing.Point(586, 457); + this.label39.Name = "label39"; + this.label39.Size = new System.Drawing.Size(136, 18); + this.label39.TabIndex = 118; + this.label39.Text = "Water Meter 39"; + this.label39.Visible = false; + // + // label40 + // + this.label40.AutoSize = true; + this.label40.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label40.Location = new System.Drawing.Point(586, 487); + this.label40.Name = "label40"; + this.label40.Size = new System.Drawing.Size(136, 18); + this.label40.TabIndex = 119; + this.label40.Text = "Water Meter 40"; + this.label40.Visible = false; + // + // label41 + // + this.label41.AutoSize = true; + this.label41.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label41.Location = new System.Drawing.Point(586, 517); + this.label41.Name = "label41"; + this.label41.Size = new System.Drawing.Size(136, 18); + this.label41.TabIndex = 120; + this.label41.Text = "Water Meter 41"; + this.label41.Visible = false; + // + // label42 + // + this.label42.AutoSize = true; + this.label42.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label42.Location = new System.Drawing.Point(586, 547); + this.label42.Name = "label42"; + this.label42.Size = new System.Drawing.Size(136, 18); + this.label42.TabIndex = 121; + this.label42.Text = "Water Meter 42"; + this.label42.Visible = false; + // + // label43 + // + this.label43.AutoSize = true; + this.label43.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label43.Location = new System.Drawing.Point(586, 577); + this.label43.Name = "label43"; + this.label43.Size = new System.Drawing.Size(136, 18); + this.label43.TabIndex = 122; + this.label43.Text = "Water Meter 43"; + this.label43.Visible = false; + // + // label44 + // + this.label44.AutoSize = true; + this.label44.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label44.Location = new System.Drawing.Point(586, 607); + this.label44.Name = "label44"; + this.label44.Size = new System.Drawing.Size(136, 18); + this.label44.TabIndex = 123; + this.label44.Text = "Water Meter 44"; + this.label44.Visible = false; + // + // label45 + // + this.label45.AutoSize = true; + this.label45.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label45.Location = new System.Drawing.Point(586, 637); + this.label45.Name = "label45"; + this.label45.Size = new System.Drawing.Size(136, 18); + this.label45.TabIndex = 124; + this.label45.Text = "Water Meter 45"; + this.label45.Visible = false; + // + // label46 + // + this.label46.AutoSize = true; + this.label46.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label46.Location = new System.Drawing.Point(586, 667); + this.label46.Name = "label46"; + this.label46.Size = new System.Drawing.Size(136, 18); + this.label46.TabIndex = 125; + this.label46.Text = "Water Meter 46"; + this.label46.Visible = false; + // + // label47 + // + this.label47.AutoSize = true; + this.label47.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label47.Location = new System.Drawing.Point(586, 697); + this.label47.Name = "label47"; + this.label47.Size = new System.Drawing.Size(136, 18); + this.label47.TabIndex = 126; + this.label47.Text = "Water Meter 47"; + this.label47.Visible = false; + // + // label48 + // + this.label48.AutoSize = true; + this.label48.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label48.Location = new System.Drawing.Point(586, 727); + this.label48.Name = "label48"; + this.label48.Size = new System.Drawing.Size(136, 18); + this.label48.TabIndex = 127; + this.label48.Text = "Water Meter 48"; + this.label48.Visible = false; + // + // startTextBox48 + // + this.startTextBox48.Enabled = false; + this.startTextBox48.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox48.Location = new System.Drawing.Point(748, 724); + this.startTextBox48.Name = "startTextBox48"; + this.startTextBox48.Size = new System.Drawing.Size(163, 27); + this.startTextBox48.TabIndex = 150; + this.startTextBox48.Visible = false; + this.startTextBox48.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox48_KeyPress); + // + // startTextBox47 + // + this.startTextBox47.Enabled = false; + this.startTextBox47.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox47.Location = new System.Drawing.Point(748, 694); + this.startTextBox47.Name = "startTextBox47"; + this.startTextBox47.Size = new System.Drawing.Size(163, 27); + this.startTextBox47.TabIndex = 149; + this.startTextBox47.Visible = false; + this.startTextBox47.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox47_KeyPress); + // + // startTextBox46 + // + this.startTextBox46.Enabled = false; + this.startTextBox46.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox46.Location = new System.Drawing.Point(748, 664); + this.startTextBox46.Name = "startTextBox46"; + this.startTextBox46.Size = new System.Drawing.Size(163, 27); + this.startTextBox46.TabIndex = 148; + this.startTextBox46.Visible = false; + this.startTextBox46.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox46_KeyPress); + // + // startTextBox45 + // + this.startTextBox45.Enabled = false; + this.startTextBox45.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox45.Location = new System.Drawing.Point(748, 634); + this.startTextBox45.Name = "startTextBox45"; + this.startTextBox45.Size = new System.Drawing.Size(163, 27); + this.startTextBox45.TabIndex = 147; + this.startTextBox45.Visible = false; + this.startTextBox45.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox45_KeyPress); + // + // startTextBox44 + // + this.startTextBox44.Enabled = false; + this.startTextBox44.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox44.Location = new System.Drawing.Point(748, 604); + this.startTextBox44.Name = "startTextBox44"; + this.startTextBox44.Size = new System.Drawing.Size(163, 27); + this.startTextBox44.TabIndex = 146; + this.startTextBox44.Visible = false; + this.startTextBox44.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox44_KeyPress); + // + // startTextBox43 + // + this.startTextBox43.Enabled = false; + this.startTextBox43.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox43.Location = new System.Drawing.Point(748, 574); + this.startTextBox43.Name = "startTextBox43"; + this.startTextBox43.Size = new System.Drawing.Size(163, 27); + this.startTextBox43.TabIndex = 145; + this.startTextBox43.Visible = false; + this.startTextBox43.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox43_KeyPress); + // + // startTextBox42 + // + this.startTextBox42.Enabled = false; + this.startTextBox42.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox42.Location = new System.Drawing.Point(748, 544); + this.startTextBox42.Name = "startTextBox42"; + this.startTextBox42.Size = new System.Drawing.Size(163, 27); + this.startTextBox42.TabIndex = 144; + this.startTextBox42.Visible = false; + this.startTextBox42.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox42_KeyPress); + // + // startTextBox41 + // + this.startTextBox41.Enabled = false; + this.startTextBox41.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox41.Location = new System.Drawing.Point(748, 514); + this.startTextBox41.Name = "startTextBox41"; + this.startTextBox41.Size = new System.Drawing.Size(163, 27); + this.startTextBox41.TabIndex = 143; + this.startTextBox41.Visible = false; + this.startTextBox41.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox41_KeyPress); + // + // startTextBox40 + // + this.startTextBox40.Enabled = false; + this.startTextBox40.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox40.Location = new System.Drawing.Point(748, 484); + this.startTextBox40.Name = "startTextBox40"; + this.startTextBox40.Size = new System.Drawing.Size(163, 27); + this.startTextBox40.TabIndex = 142; + this.startTextBox40.Visible = false; + this.startTextBox40.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox40_KeyPress); + // + // startTextBox39 + // + this.startTextBox39.Enabled = false; + this.startTextBox39.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox39.Location = new System.Drawing.Point(748, 454); + this.startTextBox39.Name = "startTextBox39"; + this.startTextBox39.Size = new System.Drawing.Size(163, 27); + this.startTextBox39.TabIndex = 141; + this.startTextBox39.Visible = false; + this.startTextBox39.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox39_KeyPress); + // + // startTextBox38 + // + this.startTextBox38.Enabled = false; + this.startTextBox38.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox38.Location = new System.Drawing.Point(748, 424); + this.startTextBox38.Name = "startTextBox38"; + this.startTextBox38.Size = new System.Drawing.Size(163, 27); + this.startTextBox38.TabIndex = 140; + this.startTextBox38.Visible = false; + this.startTextBox38.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox38_KeyPress); + // + // startTextBox37 + // + this.startTextBox37.Enabled = false; + this.startTextBox37.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox37.Location = new System.Drawing.Point(748, 394); + this.startTextBox37.Name = "startTextBox37"; + this.startTextBox37.Size = new System.Drawing.Size(163, 27); + this.startTextBox37.TabIndex = 139; + this.startTextBox37.Visible = false; + this.startTextBox37.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox37_KeyPress); + // + // startTextBox36 + // + this.startTextBox36.Enabled = false; + this.startTextBox36.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox36.Location = new System.Drawing.Point(748, 364); + this.startTextBox36.Name = "startTextBox36"; + this.startTextBox36.Size = new System.Drawing.Size(163, 27); + this.startTextBox36.TabIndex = 138; + this.startTextBox36.Visible = false; + this.startTextBox36.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox36_KeyPress); + // + // startTextBox35 + // + this.startTextBox35.Enabled = false; + this.startTextBox35.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox35.Location = new System.Drawing.Point(748, 334); + this.startTextBox35.Name = "startTextBox35"; + this.startTextBox35.Size = new System.Drawing.Size(163, 27); + this.startTextBox35.TabIndex = 137; + this.startTextBox35.Visible = false; + this.startTextBox35.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox35_KeyPress); + // + // startTextBox34 + // + this.startTextBox34.Enabled = false; + this.startTextBox34.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox34.Location = new System.Drawing.Point(748, 304); + this.startTextBox34.Name = "startTextBox34"; + this.startTextBox34.Size = new System.Drawing.Size(163, 27); + this.startTextBox34.TabIndex = 136; + this.startTextBox34.Visible = false; + this.startTextBox34.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox34_KeyPress); + // + // startTextBox33 + // + this.startTextBox33.Enabled = false; + this.startTextBox33.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox33.Location = new System.Drawing.Point(748, 274); + this.startTextBox33.Name = "startTextBox33"; + this.startTextBox33.Size = new System.Drawing.Size(163, 27); + this.startTextBox33.TabIndex = 135; + this.startTextBox33.Visible = false; + this.startTextBox33.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox33_KeyPress); + // + // startTextBox32 + // + this.startTextBox32.Enabled = false; + this.startTextBox32.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox32.Location = new System.Drawing.Point(748, 244); + this.startTextBox32.Name = "startTextBox32"; + this.startTextBox32.Size = new System.Drawing.Size(163, 27); + this.startTextBox32.TabIndex = 134; + this.startTextBox32.Visible = false; + this.startTextBox32.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox32_KeyPress); + // + // startTextBox31 + // + this.startTextBox31.Enabled = false; + this.startTextBox31.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox31.Location = new System.Drawing.Point(748, 214); + this.startTextBox31.Name = "startTextBox31"; + this.startTextBox31.Size = new System.Drawing.Size(163, 27); + this.startTextBox31.TabIndex = 133; + this.startTextBox31.Visible = false; + this.startTextBox31.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox31_KeyPress); + // + // startTextBox30 + // + this.startTextBox30.Enabled = false; + this.startTextBox30.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox30.Location = new System.Drawing.Point(748, 184); + this.startTextBox30.Name = "startTextBox30"; + this.startTextBox30.Size = new System.Drawing.Size(163, 27); + this.startTextBox30.TabIndex = 132; + this.startTextBox30.Visible = false; + this.startTextBox30.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox30_KeyPress); + // + // startTextBox29 + // + this.startTextBox29.Enabled = false; + this.startTextBox29.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox29.Location = new System.Drawing.Point(748, 154); + this.startTextBox29.Name = "startTextBox29"; + this.startTextBox29.Size = new System.Drawing.Size(163, 27); + this.startTextBox29.TabIndex = 131; + this.startTextBox29.Visible = false; + this.startTextBox29.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox29_KeyPress); + // + // startTextBox28 + // + this.startTextBox28.Enabled = false; + this.startTextBox28.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox28.Location = new System.Drawing.Point(748, 124); + this.startTextBox28.Name = "startTextBox28"; + this.startTextBox28.Size = new System.Drawing.Size(163, 27); + this.startTextBox28.TabIndex = 130; + this.startTextBox28.Visible = false; + this.startTextBox28.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox28_KeyPress); + // + // startTextBox27 + // + this.startTextBox27.Enabled = false; + this.startTextBox27.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox27.Location = new System.Drawing.Point(748, 94); + this.startTextBox27.Name = "startTextBox27"; + this.startTextBox27.Size = new System.Drawing.Size(163, 27); + this.startTextBox27.TabIndex = 129; + this.startTextBox27.Visible = false; + this.startTextBox27.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox27_KeyPress); + // + // startTextBox26 + // + this.startTextBox26.Enabled = false; + this.startTextBox26.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox26.Location = new System.Drawing.Point(748, 64); + this.startTextBox26.Name = "startTextBox26"; + this.startTextBox26.Size = new System.Drawing.Size(163, 27); + this.startTextBox26.TabIndex = 128; + this.startTextBox26.Visible = false; + this.startTextBox26.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox26_KeyPress); + // + // exclamation48 + // + this.exclamation48.AutoSize = true; + this.exclamation48.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation48.ForeColor = System.Drawing.Color.Red; + this.exclamation48.Location = new System.Drawing.Point(1095, 720); + this.exclamation48.Name = "exclamation48"; + this.exclamation48.Size = new System.Drawing.Size(26, 32); + this.exclamation48.TabIndex = 196; + this.exclamation48.Text = "!"; + this.exclamation48.Visible = false; + // + // endTextBox48 + // + this.endTextBox48.Enabled = false; + this.endTextBox48.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox48.Location = new System.Drawing.Point(930, 724); + this.endTextBox48.Name = "endTextBox48"; + this.endTextBox48.Size = new System.Drawing.Size(163, 27); + this.endTextBox48.TabIndex = 195; + this.endTextBox48.Visible = false; + this.endTextBox48.TextChanged += new System.EventHandler(this.endTextBox48_TextChanged); + this.endTextBox48.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox48_KeyPress); + // + // exclamation47 + // + this.exclamation47.AutoSize = true; + this.exclamation47.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation47.ForeColor = System.Drawing.Color.Red; + this.exclamation47.Location = new System.Drawing.Point(1095, 690); + this.exclamation47.Name = "exclamation47"; + this.exclamation47.Size = new System.Drawing.Size(26, 32); + this.exclamation47.TabIndex = 194; + this.exclamation47.Text = "!"; + this.exclamation47.Visible = false; + // + // endTextBox47 + // + this.endTextBox47.Enabled = false; + this.endTextBox47.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox47.Location = new System.Drawing.Point(930, 694); + this.endTextBox47.Name = "endTextBox47"; + this.endTextBox47.Size = new System.Drawing.Size(163, 27); + this.endTextBox47.TabIndex = 193; + this.endTextBox47.Visible = false; + this.endTextBox47.TextChanged += new System.EventHandler(this.endTextBox47_TextChanged); + this.endTextBox47.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox47_KeyPress); + // + // exclamation46 + // + this.exclamation46.AutoSize = true; + this.exclamation46.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation46.ForeColor = System.Drawing.Color.Red; + this.exclamation46.Location = new System.Drawing.Point(1095, 660); + this.exclamation46.Name = "exclamation46"; + this.exclamation46.Size = new System.Drawing.Size(26, 32); + this.exclamation46.TabIndex = 192; + this.exclamation46.Text = "!"; + this.exclamation46.Visible = false; + // + // endTextBox46 + // + this.endTextBox46.Enabled = false; + this.endTextBox46.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox46.Location = new System.Drawing.Point(930, 664); + this.endTextBox46.Name = "endTextBox46"; + this.endTextBox46.Size = new System.Drawing.Size(163, 27); + this.endTextBox46.TabIndex = 191; + this.endTextBox46.Visible = false; + this.endTextBox46.TextChanged += new System.EventHandler(this.endTextBox46_TextChanged); + this.endTextBox46.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox46_KeyPress); + // + // exclamation45 + // + this.exclamation45.AutoSize = true; + this.exclamation45.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation45.ForeColor = System.Drawing.Color.Red; + this.exclamation45.Location = new System.Drawing.Point(1095, 630); + this.exclamation45.Name = "exclamation45"; + this.exclamation45.Size = new System.Drawing.Size(26, 32); + this.exclamation45.TabIndex = 190; + this.exclamation45.Text = "!"; + this.exclamation45.Visible = false; + // + // endTextBox45 + // + this.endTextBox45.Enabled = false; + this.endTextBox45.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox45.Location = new System.Drawing.Point(930, 634); + this.endTextBox45.Name = "endTextBox45"; + this.endTextBox45.Size = new System.Drawing.Size(163, 27); + this.endTextBox45.TabIndex = 189; + this.endTextBox45.Visible = false; + this.endTextBox45.TextChanged += new System.EventHandler(this.endTextBox45_TextChanged); + this.endTextBox45.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox45_KeyPress); + // + // exclamation44 + // + this.exclamation44.AutoSize = true; + this.exclamation44.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation44.ForeColor = System.Drawing.Color.Red; + this.exclamation44.Location = new System.Drawing.Point(1095, 600); + this.exclamation44.Name = "exclamation44"; + this.exclamation44.Size = new System.Drawing.Size(26, 32); + this.exclamation44.TabIndex = 188; + this.exclamation44.Text = "!"; + this.exclamation44.Visible = false; + // + // endTextBox44 + // + this.endTextBox44.Enabled = false; + this.endTextBox44.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox44.Location = new System.Drawing.Point(930, 604); + this.endTextBox44.Name = "endTextBox44"; + this.endTextBox44.Size = new System.Drawing.Size(163, 27); + this.endTextBox44.TabIndex = 187; + this.endTextBox44.Visible = false; + this.endTextBox44.TextChanged += new System.EventHandler(this.endTextBox44_TextChanged); + this.endTextBox44.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox44_KeyPress); + // + // exclamation43 + // + this.exclamation43.AutoSize = true; + this.exclamation43.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation43.ForeColor = System.Drawing.Color.Red; + this.exclamation43.Location = new System.Drawing.Point(1095, 570); + this.exclamation43.Name = "exclamation43"; + this.exclamation43.Size = new System.Drawing.Size(26, 32); + this.exclamation43.TabIndex = 186; + this.exclamation43.Text = "!"; + this.exclamation43.Visible = false; + // + // endTextBox43 + // + this.endTextBox43.Enabled = false; + this.endTextBox43.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox43.Location = new System.Drawing.Point(930, 574); + this.endTextBox43.Name = "endTextBox43"; + this.endTextBox43.Size = new System.Drawing.Size(163, 27); + this.endTextBox43.TabIndex = 185; + this.endTextBox43.Visible = false; + this.endTextBox43.TextChanged += new System.EventHandler(this.endTextBox43_TextChanged); + this.endTextBox43.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox43_KeyPress); + // + // exclamation42 + // + this.exclamation42.AutoSize = true; + this.exclamation42.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation42.ForeColor = System.Drawing.Color.Red; + this.exclamation42.Location = new System.Drawing.Point(1095, 540); + this.exclamation42.Name = "exclamation42"; + this.exclamation42.Size = new System.Drawing.Size(26, 32); + this.exclamation42.TabIndex = 184; + this.exclamation42.Text = "!"; + this.exclamation42.Visible = false; + // + // exclamation41 + // + this.exclamation41.AutoSize = true; + this.exclamation41.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation41.ForeColor = System.Drawing.Color.Red; + this.exclamation41.Location = new System.Drawing.Point(1095, 510); + this.exclamation41.Name = "exclamation41"; + this.exclamation41.Size = new System.Drawing.Size(26, 32); + this.exclamation41.TabIndex = 182; + this.exclamation41.Text = "!"; + this.exclamation41.Visible = false; + // + // exclamation40 + // + this.exclamation40.AutoSize = true; + this.exclamation40.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation40.ForeColor = System.Drawing.Color.Red; + this.exclamation40.Location = new System.Drawing.Point(1095, 480); + this.exclamation40.Name = "exclamation40"; + this.exclamation40.Size = new System.Drawing.Size(26, 32); + this.exclamation40.TabIndex = 180; + this.exclamation40.Text = "!"; + this.exclamation40.Visible = false; + // + // endTextBox42 + // + this.endTextBox42.Enabled = false; + this.endTextBox42.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox42.Location = new System.Drawing.Point(930, 544); + this.endTextBox42.Name = "endTextBox42"; + this.endTextBox42.Size = new System.Drawing.Size(163, 27); + this.endTextBox42.TabIndex = 183; + this.endTextBox42.Visible = false; + this.endTextBox42.TextChanged += new System.EventHandler(this.endTextBox42_TextChanged); + this.endTextBox42.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox42_KeyPress); + // + // exclamation39 + // + this.exclamation39.AutoSize = true; + this.exclamation39.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation39.ForeColor = System.Drawing.Color.Red; + this.exclamation39.Location = new System.Drawing.Point(1095, 450); + this.exclamation39.Name = "exclamation39"; + this.exclamation39.Size = new System.Drawing.Size(26, 32); + this.exclamation39.TabIndex = 178; + this.exclamation39.Text = "!"; + this.exclamation39.Visible = false; + // + // endTextBox41 + // + this.endTextBox41.Enabled = false; + this.endTextBox41.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox41.Location = new System.Drawing.Point(930, 514); + this.endTextBox41.Name = "endTextBox41"; + this.endTextBox41.Size = new System.Drawing.Size(163, 27); + this.endTextBox41.TabIndex = 181; + this.endTextBox41.Visible = false; + this.endTextBox41.TextChanged += new System.EventHandler(this.endTextBox41_TextChanged); + this.endTextBox41.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox41_KeyPress); + // + // exclamation38 + // + this.exclamation38.AutoSize = true; + this.exclamation38.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation38.ForeColor = System.Drawing.Color.Red; + this.exclamation38.Location = new System.Drawing.Point(1095, 420); + this.exclamation38.Name = "exclamation38"; + this.exclamation38.Size = new System.Drawing.Size(26, 32); + this.exclamation38.TabIndex = 176; + this.exclamation38.Text = "!"; + this.exclamation38.Visible = false; + // + // endTextBox40 + // + this.endTextBox40.Enabled = false; + this.endTextBox40.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox40.Location = new System.Drawing.Point(930, 484); + this.endTextBox40.Name = "endTextBox40"; + this.endTextBox40.Size = new System.Drawing.Size(163, 27); + this.endTextBox40.TabIndex = 179; + this.endTextBox40.Visible = false; + this.endTextBox40.TextChanged += new System.EventHandler(this.endTextBox40_TextChanged); + this.endTextBox40.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox40_KeyPress); + // + // exclamation37 + // + this.exclamation37.AutoSize = true; + this.exclamation37.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation37.ForeColor = System.Drawing.Color.Red; + this.exclamation37.Location = new System.Drawing.Point(1095, 390); + this.exclamation37.Name = "exclamation37"; + this.exclamation37.Size = new System.Drawing.Size(26, 32); + this.exclamation37.TabIndex = 174; + this.exclamation37.Text = "!"; + this.exclamation37.Visible = false; + // + // endTextBox39 + // + this.endTextBox39.Enabled = false; + this.endTextBox39.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox39.Location = new System.Drawing.Point(930, 454); + this.endTextBox39.Name = "endTextBox39"; + this.endTextBox39.Size = new System.Drawing.Size(163, 27); + this.endTextBox39.TabIndex = 177; + this.endTextBox39.Visible = false; + this.endTextBox39.TextChanged += new System.EventHandler(this.endTextBox39_TextChanged); + this.endTextBox39.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox39_KeyPress); + // + // endTextBox38 + // + this.endTextBox38.Enabled = false; + this.endTextBox38.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox38.Location = new System.Drawing.Point(930, 424); + this.endTextBox38.Name = "endTextBox38"; + this.endTextBox38.Size = new System.Drawing.Size(163, 27); + this.endTextBox38.TabIndex = 175; + this.endTextBox38.Visible = false; + this.endTextBox38.TextChanged += new System.EventHandler(this.endTextBox38_TextChanged); + this.endTextBox38.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox38_KeyPress); + // + // endTextBox37 + // + this.endTextBox37.Enabled = false; + this.endTextBox37.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox37.Location = new System.Drawing.Point(930, 394); + this.endTextBox37.Name = "endTextBox37"; + this.endTextBox37.Size = new System.Drawing.Size(163, 27); + this.endTextBox37.TabIndex = 173; + this.endTextBox37.Visible = false; + this.endTextBox37.TextChanged += new System.EventHandler(this.endTextBox37_TextChanged); + this.endTextBox37.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox37_KeyPress); + // + // exclamation36 + // + this.exclamation36.AutoSize = true; + this.exclamation36.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation36.ForeColor = System.Drawing.Color.Red; + this.exclamation36.Location = new System.Drawing.Point(1095, 360); + this.exclamation36.Name = "exclamation36"; + this.exclamation36.Size = new System.Drawing.Size(26, 32); + this.exclamation36.TabIndex = 172; + this.exclamation36.Text = "!"; + this.exclamation36.Visible = false; + // + // endTextBox36 + // + this.endTextBox36.Enabled = false; + this.endTextBox36.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox36.Location = new System.Drawing.Point(930, 364); + this.endTextBox36.Name = "endTextBox36"; + this.endTextBox36.Size = new System.Drawing.Size(163, 27); + this.endTextBox36.TabIndex = 171; + this.endTextBox36.Visible = false; + this.endTextBox36.TextChanged += new System.EventHandler(this.endTextBox36_TextChanged); + this.endTextBox36.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox36_KeyPress); + // + // exclamation35 + // + this.exclamation35.AutoSize = true; + this.exclamation35.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation35.ForeColor = System.Drawing.Color.Red; + this.exclamation35.Location = new System.Drawing.Point(1095, 330); + this.exclamation35.Name = "exclamation35"; + this.exclamation35.Size = new System.Drawing.Size(26, 32); + this.exclamation35.TabIndex = 170; + this.exclamation35.Text = "!"; + this.exclamation35.Visible = false; + // + // endTextBox35 + // + this.endTextBox35.Enabled = false; + this.endTextBox35.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox35.Location = new System.Drawing.Point(930, 334); + this.endTextBox35.Name = "endTextBox35"; + this.endTextBox35.Size = new System.Drawing.Size(163, 27); + this.endTextBox35.TabIndex = 169; + this.endTextBox35.Visible = false; + this.endTextBox35.TextChanged += new System.EventHandler(this.endTextBox35_TextChanged); + this.endTextBox35.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox35_KeyPress); + // + // exclamation34 + // + this.exclamation34.AutoSize = true; + this.exclamation34.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation34.ForeColor = System.Drawing.Color.Red; + this.exclamation34.Location = new System.Drawing.Point(1095, 300); + this.exclamation34.Name = "exclamation34"; + this.exclamation34.Size = new System.Drawing.Size(26, 32); + this.exclamation34.TabIndex = 168; + this.exclamation34.Text = "!"; + this.exclamation34.Visible = false; + // + // endTextBox34 + // + this.endTextBox34.Enabled = false; + this.endTextBox34.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox34.Location = new System.Drawing.Point(930, 304); + this.endTextBox34.Name = "endTextBox34"; + this.endTextBox34.Size = new System.Drawing.Size(163, 27); + this.endTextBox34.TabIndex = 167; + this.endTextBox34.Visible = false; + this.endTextBox34.TextChanged += new System.EventHandler(this.endTextBox34_TextChanged); + this.endTextBox34.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox34_KeyPress); + // + // exclamation33 + // + this.exclamation33.AutoSize = true; + this.exclamation33.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation33.ForeColor = System.Drawing.Color.Red; + this.exclamation33.Location = new System.Drawing.Point(1095, 270); + this.exclamation33.Name = "exclamation33"; + this.exclamation33.Size = new System.Drawing.Size(26, 32); + this.exclamation33.TabIndex = 166; + this.exclamation33.Text = "!"; + this.exclamation33.Visible = false; + // + // endTextBox33 + // + this.endTextBox33.Enabled = false; + this.endTextBox33.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox33.Location = new System.Drawing.Point(930, 274); + this.endTextBox33.Name = "endTextBox33"; + this.endTextBox33.Size = new System.Drawing.Size(163, 27); + this.endTextBox33.TabIndex = 165; + this.endTextBox33.Visible = false; + this.endTextBox33.TextChanged += new System.EventHandler(this.endTextBox33_TextChanged); + this.endTextBox33.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox33_KeyPress); + // + // exclamation32 + // + this.exclamation32.AutoSize = true; + this.exclamation32.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation32.ForeColor = System.Drawing.Color.Red; + this.exclamation32.Location = new System.Drawing.Point(1095, 240); + this.exclamation32.Name = "exclamation32"; + this.exclamation32.Size = new System.Drawing.Size(26, 32); + this.exclamation32.TabIndex = 164; + this.exclamation32.Text = "!"; + this.exclamation32.Visible = false; + // + // endTextBox32 + // + this.endTextBox32.Enabled = false; + this.endTextBox32.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox32.Location = new System.Drawing.Point(930, 244); + this.endTextBox32.Name = "endTextBox32"; + this.endTextBox32.Size = new System.Drawing.Size(163, 27); + this.endTextBox32.TabIndex = 163; + this.endTextBox32.Visible = false; + this.endTextBox32.TextChanged += new System.EventHandler(this.endTextBox32_TextChanged); + this.endTextBox32.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox32_KeyPress); + // + // exclamation31 + // + this.exclamation31.AutoSize = true; + this.exclamation31.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation31.ForeColor = System.Drawing.Color.Red; + this.exclamation31.Location = new System.Drawing.Point(1095, 210); + this.exclamation31.Name = "exclamation31"; + this.exclamation31.Size = new System.Drawing.Size(26, 32); + this.exclamation31.TabIndex = 162; + this.exclamation31.Text = "!"; + this.exclamation31.Visible = false; + // + // endTextBox31 + // + this.endTextBox31.Enabled = false; + this.endTextBox31.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox31.Location = new System.Drawing.Point(930, 214); + this.endTextBox31.Name = "endTextBox31"; + this.endTextBox31.Size = new System.Drawing.Size(163, 27); + this.endTextBox31.TabIndex = 161; + this.endTextBox31.Visible = false; + this.endTextBox31.TextChanged += new System.EventHandler(this.endTextBox31_TextChanged); + this.endTextBox31.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox31_KeyPress); + // + // exclamation30 + // + this.exclamation30.AutoSize = true; + this.exclamation30.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation30.ForeColor = System.Drawing.Color.Red; + this.exclamation30.Location = new System.Drawing.Point(1095, 180); + this.exclamation30.Name = "exclamation30"; + this.exclamation30.Size = new System.Drawing.Size(26, 32); + this.exclamation30.TabIndex = 160; + this.exclamation30.Text = "!"; + this.exclamation30.Visible = false; + // + // exclamation29 + // + this.exclamation29.AutoSize = true; + this.exclamation29.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation29.ForeColor = System.Drawing.Color.Red; + this.exclamation29.Location = new System.Drawing.Point(1095, 150); + this.exclamation29.Name = "exclamation29"; + this.exclamation29.Size = new System.Drawing.Size(26, 32); + this.exclamation29.TabIndex = 158; + this.exclamation29.Text = "!"; + this.exclamation29.Visible = false; + // + // exclamation28 + // + this.exclamation28.AutoSize = true; + this.exclamation28.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation28.ForeColor = System.Drawing.Color.Red; + this.exclamation28.Location = new System.Drawing.Point(1095, 120); + this.exclamation28.Name = "exclamation28"; + this.exclamation28.Size = new System.Drawing.Size(26, 32); + this.exclamation28.TabIndex = 156; + this.exclamation28.Text = "!"; + this.exclamation28.Visible = false; + // + // endTextBox30 + // + this.endTextBox30.Enabled = false; + this.endTextBox30.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox30.Location = new System.Drawing.Point(930, 184); + this.endTextBox30.Name = "endTextBox30"; + this.endTextBox30.Size = new System.Drawing.Size(163, 27); + this.endTextBox30.TabIndex = 159; + this.endTextBox30.Visible = false; + this.endTextBox30.TextChanged += new System.EventHandler(this.endTextBox30_TextChanged); + this.endTextBox30.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox30_KeyPress); + // + // exclamation27 + // + this.exclamation27.AutoSize = true; + this.exclamation27.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation27.ForeColor = System.Drawing.Color.Red; + this.exclamation27.Location = new System.Drawing.Point(1095, 90); + this.exclamation27.Name = "exclamation27"; + this.exclamation27.Size = new System.Drawing.Size(26, 32); + this.exclamation27.TabIndex = 154; + this.exclamation27.Text = "!"; + this.exclamation27.Visible = false; + // + // endTextBox29 + // + this.endTextBox29.Enabled = false; + this.endTextBox29.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox29.Location = new System.Drawing.Point(930, 154); + this.endTextBox29.Name = "endTextBox29"; + this.endTextBox29.Size = new System.Drawing.Size(163, 27); + this.endTextBox29.TabIndex = 157; + this.endTextBox29.Visible = false; + this.endTextBox29.TextChanged += new System.EventHandler(this.endTextBox29_TextChanged); + this.endTextBox29.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox29_KeyPress); + // + // exclamation26 + // + this.exclamation26.AutoSize = true; + this.exclamation26.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation26.ForeColor = System.Drawing.Color.Red; + this.exclamation26.Location = new System.Drawing.Point(1095, 60); + this.exclamation26.Name = "exclamation26"; + this.exclamation26.Size = new System.Drawing.Size(26, 32); + this.exclamation26.TabIndex = 152; + this.exclamation26.Text = "!"; + this.exclamation26.Visible = false; + // + // endTextBox28 + // + this.endTextBox28.Enabled = false; + this.endTextBox28.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox28.Location = new System.Drawing.Point(930, 124); + this.endTextBox28.Name = "endTextBox28"; + this.endTextBox28.Size = new System.Drawing.Size(163, 27); + this.endTextBox28.TabIndex = 155; + this.endTextBox28.Visible = false; + this.endTextBox28.TextChanged += new System.EventHandler(this.endTextBox28_TextChanged); + this.endTextBox28.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox28_KeyPress); + // + // endTextBox27 + // + this.endTextBox27.Enabled = false; + this.endTextBox27.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox27.Location = new System.Drawing.Point(930, 94); + this.endTextBox27.Name = "endTextBox27"; + this.endTextBox27.Size = new System.Drawing.Size(163, 27); + this.endTextBox27.TabIndex = 153; + this.endTextBox27.Visible = false; + this.endTextBox27.TextChanged += new System.EventHandler(this.endTextBox27_TextChanged); + this.endTextBox27.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox27_KeyPress); + // + // endTextBox26 + // + this.endTextBox26.Enabled = false; + this.endTextBox26.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox26.Location = new System.Drawing.Point(930, 64); + this.endTextBox26.Name = "endTextBox26"; + this.endTextBox26.Size = new System.Drawing.Size(163, 27); + this.endTextBox26.TabIndex = 151; + this.endTextBox26.Visible = false; + this.endTextBox26.TextChanged += new System.EventHandler(this.endTextBox26_TextChanged); + this.endTextBox26.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox26_KeyPress); + // + // TestStartEndForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.ClientSize = new System.Drawing.Size(1267, 758); + this.Controls.Add(this.exclamation48); + this.Controls.Add(this.endTextBox48); + this.Controls.Add(this.exclamation47); + this.Controls.Add(this.endTextBox47); + this.Controls.Add(this.exclamation46); + this.Controls.Add(this.endTextBox46); + this.Controls.Add(this.exclamation45); + this.Controls.Add(this.endTextBox45); + this.Controls.Add(this.exclamation44); + this.Controls.Add(this.endTextBox44); + this.Controls.Add(this.exclamation43); + this.Controls.Add(this.endTextBox43); + this.Controls.Add(this.exclamation42); + this.Controls.Add(this.exclamation41); + this.Controls.Add(this.exclamation40); + this.Controls.Add(this.endTextBox42); + this.Controls.Add(this.exclamation39); + this.Controls.Add(this.endTextBox41); + this.Controls.Add(this.exclamation38); + this.Controls.Add(this.endTextBox40); + this.Controls.Add(this.exclamation37); + this.Controls.Add(this.endTextBox39); + this.Controls.Add(this.endTextBox38); + this.Controls.Add(this.endTextBox37); + this.Controls.Add(this.exclamation36); + this.Controls.Add(this.endTextBox36); + this.Controls.Add(this.exclamation35); + this.Controls.Add(this.endTextBox35); + this.Controls.Add(this.exclamation34); + this.Controls.Add(this.endTextBox34); + this.Controls.Add(this.exclamation33); + this.Controls.Add(this.endTextBox33); + this.Controls.Add(this.exclamation32); + this.Controls.Add(this.endTextBox32); + this.Controls.Add(this.exclamation31); + this.Controls.Add(this.endTextBox31); + this.Controls.Add(this.exclamation30); + this.Controls.Add(this.exclamation29); + this.Controls.Add(this.exclamation28); + this.Controls.Add(this.endTextBox30); + this.Controls.Add(this.exclamation27); + this.Controls.Add(this.endTextBox29); + this.Controls.Add(this.exclamation26); + this.Controls.Add(this.endTextBox28); + this.Controls.Add(this.endTextBox27); + this.Controls.Add(this.endTextBox26); + this.Controls.Add(this.startTextBox48); + this.Controls.Add(this.startTextBox47); + this.Controls.Add(this.startTextBox46); + this.Controls.Add(this.startTextBox45); + this.Controls.Add(this.startTextBox44); + this.Controls.Add(this.startTextBox43); + this.Controls.Add(this.startTextBox42); + this.Controls.Add(this.startTextBox41); + this.Controls.Add(this.startTextBox40); + this.Controls.Add(this.startTextBox39); + this.Controls.Add(this.startTextBox38); + this.Controls.Add(this.startTextBox37); + this.Controls.Add(this.startTextBox36); + this.Controls.Add(this.startTextBox35); + this.Controls.Add(this.startTextBox34); + this.Controls.Add(this.startTextBox33); + this.Controls.Add(this.startTextBox32); + this.Controls.Add(this.startTextBox31); + this.Controls.Add(this.startTextBox30); + this.Controls.Add(this.startTextBox29); + this.Controls.Add(this.startTextBox28); + this.Controls.Add(this.startTextBox27); + this.Controls.Add(this.startTextBox26); + this.Controls.Add(this.label48); + this.Controls.Add(this.label47); + this.Controls.Add(this.label46); + this.Controls.Add(this.label45); + this.Controls.Add(this.label44); + this.Controls.Add(this.label43); + this.Controls.Add(this.label42); + this.Controls.Add(this.label41); + this.Controls.Add(this.label40); + this.Controls.Add(this.label39); + this.Controls.Add(this.label38); + this.Controls.Add(this.label37); + this.Controls.Add(this.label36); + this.Controls.Add(this.label35); + this.Controls.Add(this.label34); + this.Controls.Add(this.label33); + this.Controls.Add(this.label32); + this.Controls.Add(this.label31); + this.Controls.Add(this.label30); + this.Controls.Add(this.label29); + this.Controls.Add(this.label28); + this.Controls.Add(this.label27); + this.Controls.Add(this.label26); + this.Controls.Add(this.exclamation25); + this.Controls.Add(this.startTextBox25); + this.Controls.Add(this.endTextBox25); + this.Controls.Add(this.label25); + this.Controls.Add(this.exclamation24); + this.Controls.Add(this.startTextBox24); + this.Controls.Add(this.endTextBox24); + this.Controls.Add(this.label24); + this.Controls.Add(this.exclamation23); + this.Controls.Add(this.startTextBox23); + this.Controls.Add(this.endTextBox23); + this.Controls.Add(this.label23); + this.Controls.Add(this.exclamation22); + this.Controls.Add(this.startTextBox22); + this.Controls.Add(this.endTextBox22); + this.Controls.Add(this.label22); + this.Controls.Add(this.exclamation21); + this.Controls.Add(this.startTextBox21); + this.Controls.Add(this.endTextBox21); + this.Controls.Add(this.label21); + this.Controls.Add(this.exclamation20); + this.Controls.Add(this.startTextBox20); + this.Controls.Add(this.endTextBox20); + this.Controls.Add(this.label20); + this.Controls.Add(this.exclamation19); + this.Controls.Add(this.startTextBox19); + this.Controls.Add(this.endTextBox19); + this.Controls.Add(this.label19); + this.Controls.Add(this.exclamation18); + this.Controls.Add(this.exclamation17); + this.Controls.Add(this.startTextBox18); + this.Controls.Add(this.exclamation16); + this.Controls.Add(this.endTextBox18); + this.Controls.Add(this.label18); + this.Controls.Add(this.startTextBox17); + this.Controls.Add(this.exclamation15); + this.Controls.Add(this.endTextBox17); + this.Controls.Add(this.label17); + this.Controls.Add(this.startTextBox16); + this.Controls.Add(this.exclamation14); + this.Controls.Add(this.endTextBox16); + this.Controls.Add(this.label16); + this.Controls.Add(this.startTextBox15); + this.Controls.Add(this.exclamation13); + this.Controls.Add(this.endTextBox15); + this.Controls.Add(this.label15); + this.Controls.Add(this.startTextBox14); + this.Controls.Add(this.end2Label); + this.Controls.Add(this.endTextBox14); + this.Controls.Add(this.label14); + this.Controls.Add(this.startTextBox13); + this.Controls.Add(this.start2Label); + this.Controls.Add(this.endTextBox13); + this.Controls.Add(this.label13); + this.Controls.Add(this.exclamation12); + this.Controls.Add(this.startTextBox12); + this.Controls.Add(this.endTextBox12); + this.Controls.Add(this.label12); + this.Controls.Add(this.exclamation11); + this.Controls.Add(this.startTextBox11); + this.Controls.Add(this.endTextBox11); + this.Controls.Add(this.label11); + this.Controls.Add(this.exclamation10); + this.Controls.Add(this.startTextBox10); + this.Controls.Add(this.endTextBox10); + this.Controls.Add(this.label10); + this.Controls.Add(this.exclamation9); + this.Controls.Add(this.startTextBox9); + this.Controls.Add(this.endTextBox9); + this.Controls.Add(this.label9); + this.Controls.Add(this.exclamation8); + this.Controls.Add(this.startTextBox8); + this.Controls.Add(this.endTextBox8); + this.Controls.Add(this.label8); + this.Controls.Add(this.exclamation7); + this.Controls.Add(this.startTextBox7); + this.Controls.Add(this.endTextBox7); + this.Controls.Add(this.label7); + this.Controls.Add(this.exclamation6); + this.Controls.Add(this.exclamation5); + this.Controls.Add(this.startTextBox6); + this.Controls.Add(this.exclamation4); + this.Controls.Add(this.endTextBox6); + this.Controls.Add(this.label6); + this.Controls.Add(this.startTextBox5); + this.Controls.Add(this.exclamation3); + this.Controls.Add(this.endTextBox5); + this.Controls.Add(this.label5); + this.Controls.Add(this.startTextBox4); + this.Controls.Add(this.exclamation2); + this.Controls.Add(this.endTextBox4); + this.Controls.Add(this.label4); + this.Controls.Add(this.startTextBox3); + this.Controls.Add(this.exclamation1); + this.Controls.Add(this.endTextBox3); + this.Controls.Add(this.label3); + this.Controls.Add(this.startTextBox2); + this.Controls.Add(this.endLabel); + this.Controls.Add(this.endTextBox2); + this.Controls.Add(this.label2); + this.Controls.Add(this.startTextBox1); + this.Controls.Add(this.startLabel); + this.Controls.Add(this.endTextBox1); + this.Controls.Add(this.label1); + this.Controls.Add(this.okButton); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "TestStartEndForm"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "End States"; + this.TopMost = true; + this.Load += new System.EventHandler(this.CycleEndForm_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox endTextBox1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.TextBox endTextBox3; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox endTextBox4; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox endTextBox5; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.TextBox endTextBox6; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TextBox startTextBox1; + private System.Windows.Forms.TextBox startTextBox3; + private System.Windows.Forms.TextBox startTextBox4; + private System.Windows.Forms.TextBox startTextBox5; + private System.Windows.Forms.TextBox startTextBox6; + private System.Windows.Forms.Label startLabel; + private System.Windows.Forms.Label endLabel; + private System.Windows.Forms.Label exclamation1; + private System.Windows.Forms.Label exclamation3; + private System.Windows.Forms.Label exclamation4; + private System.Windows.Forms.Label exclamation5; + private System.Windows.Forms.Label exclamation6; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox endTextBox2; + private System.Windows.Forms.TextBox startTextBox2; + private System.Windows.Forms.Label exclamation2; + private System.Windows.Forms.Label exclamation7; + private System.Windows.Forms.TextBox startTextBox7; + private System.Windows.Forms.TextBox endTextBox7; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.Label exclamation8; + private System.Windows.Forms.TextBox startTextBox8; + private System.Windows.Forms.TextBox endTextBox8; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.Label exclamation9; + private System.Windows.Forms.TextBox startTextBox9; + private System.Windows.Forms.TextBox endTextBox9; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.Label exclamation10; + private System.Windows.Forms.TextBox startTextBox10; + private System.Windows.Forms.TextBox endTextBox10; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.Label exclamation11; + private System.Windows.Forms.TextBox startTextBox11; + private System.Windows.Forms.TextBox endTextBox11; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.Label exclamation12; + private System.Windows.Forms.TextBox startTextBox12; + private System.Windows.Forms.TextBox endTextBox12; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.Label exclamation24; + private System.Windows.Forms.TextBox startTextBox24; + private System.Windows.Forms.TextBox endTextBox24; + private System.Windows.Forms.Label label24; + private System.Windows.Forms.Label exclamation23; + private System.Windows.Forms.TextBox startTextBox23; + private System.Windows.Forms.TextBox endTextBox23; + private System.Windows.Forms.Label label23; + private System.Windows.Forms.Label exclamation22; + private System.Windows.Forms.TextBox startTextBox22; + private System.Windows.Forms.TextBox endTextBox22; + private System.Windows.Forms.Label label22; + private System.Windows.Forms.Label exclamation21; + private System.Windows.Forms.TextBox startTextBox21; + private System.Windows.Forms.TextBox endTextBox21; + private System.Windows.Forms.Label label21; + private System.Windows.Forms.Label exclamation20; + private System.Windows.Forms.TextBox startTextBox20; + private System.Windows.Forms.TextBox endTextBox20; + private System.Windows.Forms.Label label20; + private System.Windows.Forms.Label exclamation19; + private System.Windows.Forms.TextBox startTextBox19; + private System.Windows.Forms.TextBox endTextBox19; + private System.Windows.Forms.Label label19; + private System.Windows.Forms.Label exclamation18; + private System.Windows.Forms.Label exclamation17; + private System.Windows.Forms.TextBox startTextBox18; + private System.Windows.Forms.Label exclamation16; + private System.Windows.Forms.TextBox endTextBox18; + private System.Windows.Forms.Label label18; + private System.Windows.Forms.TextBox startTextBox17; + private System.Windows.Forms.Label exclamation15; + private System.Windows.Forms.TextBox endTextBox17; + private System.Windows.Forms.Label label17; + private System.Windows.Forms.TextBox startTextBox16; + private System.Windows.Forms.Label exclamation14; + private System.Windows.Forms.TextBox endTextBox16; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.TextBox startTextBox15; + private System.Windows.Forms.Label exclamation13; + private System.Windows.Forms.TextBox endTextBox15; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.TextBox startTextBox14; + private System.Windows.Forms.Label end2Label; + private System.Windows.Forms.TextBox endTextBox14; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.TextBox startTextBox13; + private System.Windows.Forms.Label start2Label; + private System.Windows.Forms.TextBox endTextBox13; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.Label exclamation25; + private System.Windows.Forms.TextBox startTextBox25; + private System.Windows.Forms.TextBox endTextBox25; + private System.Windows.Forms.Label label25; + private System.Windows.Forms.Label label26; + private System.Windows.Forms.Label label27; + private System.Windows.Forms.Label label28; + private System.Windows.Forms.Label label29; + private System.Windows.Forms.Label label30; + private System.Windows.Forms.Label label31; + private System.Windows.Forms.Label label32; + private System.Windows.Forms.Label label33; + private System.Windows.Forms.Label label34; + private System.Windows.Forms.Label label35; + private System.Windows.Forms.Label label36; + private System.Windows.Forms.Label label37; + private System.Windows.Forms.Label label38; + private System.Windows.Forms.Label label39; + private System.Windows.Forms.Label label40; + private System.Windows.Forms.Label label41; + private System.Windows.Forms.Label label42; + private System.Windows.Forms.Label label43; + private System.Windows.Forms.Label label44; + private System.Windows.Forms.Label label45; + private System.Windows.Forms.Label label46; + private System.Windows.Forms.Label label47; + private System.Windows.Forms.Label label48; + private System.Windows.Forms.TextBox startTextBox48; + private System.Windows.Forms.TextBox startTextBox47; + private System.Windows.Forms.TextBox startTextBox46; + private System.Windows.Forms.TextBox startTextBox45; + private System.Windows.Forms.TextBox startTextBox44; + private System.Windows.Forms.TextBox startTextBox43; + private System.Windows.Forms.TextBox startTextBox42; + private System.Windows.Forms.TextBox startTextBox41; + private System.Windows.Forms.TextBox startTextBox40; + private System.Windows.Forms.TextBox startTextBox39; + private System.Windows.Forms.TextBox startTextBox38; + private System.Windows.Forms.TextBox startTextBox37; + private System.Windows.Forms.TextBox startTextBox36; + private System.Windows.Forms.TextBox startTextBox35; + private System.Windows.Forms.TextBox startTextBox34; + private System.Windows.Forms.TextBox startTextBox33; + private System.Windows.Forms.TextBox startTextBox32; + private System.Windows.Forms.TextBox startTextBox31; + private System.Windows.Forms.TextBox startTextBox30; + private System.Windows.Forms.TextBox startTextBox29; + private System.Windows.Forms.TextBox startTextBox28; + private System.Windows.Forms.TextBox startTextBox27; + private System.Windows.Forms.TextBox startTextBox26; + private System.Windows.Forms.Label exclamation48; + private System.Windows.Forms.TextBox endTextBox48; + private System.Windows.Forms.Label exclamation47; + private System.Windows.Forms.TextBox endTextBox47; + private System.Windows.Forms.Label exclamation46; + private System.Windows.Forms.TextBox endTextBox46; + private System.Windows.Forms.Label exclamation45; + private System.Windows.Forms.TextBox endTextBox45; + private System.Windows.Forms.Label exclamation44; + private System.Windows.Forms.TextBox endTextBox44; + private System.Windows.Forms.Label exclamation43; + private System.Windows.Forms.TextBox endTextBox43; + private System.Windows.Forms.Label exclamation42; + private System.Windows.Forms.Label exclamation41; + private System.Windows.Forms.Label exclamation40; + private System.Windows.Forms.TextBox endTextBox42; + private System.Windows.Forms.Label exclamation39; + private System.Windows.Forms.TextBox endTextBox41; + private System.Windows.Forms.Label exclamation38; + private System.Windows.Forms.TextBox endTextBox40; + private System.Windows.Forms.Label exclamation37; + private System.Windows.Forms.TextBox endTextBox39; + private System.Windows.Forms.TextBox endTextBox38; + private System.Windows.Forms.TextBox endTextBox37; + private System.Windows.Forms.Label exclamation36; + private System.Windows.Forms.TextBox endTextBox36; + private System.Windows.Forms.Label exclamation35; + private System.Windows.Forms.TextBox endTextBox35; + private System.Windows.Forms.Label exclamation34; + private System.Windows.Forms.TextBox endTextBox34; + private System.Windows.Forms.Label exclamation33; + private System.Windows.Forms.TextBox endTextBox33; + private System.Windows.Forms.Label exclamation32; + private System.Windows.Forms.TextBox endTextBox32; + private System.Windows.Forms.Label exclamation31; + private System.Windows.Forms.TextBox endTextBox31; + private System.Windows.Forms.Label exclamation30; + private System.Windows.Forms.Label exclamation29; + private System.Windows.Forms.Label exclamation28; + private System.Windows.Forms.TextBox endTextBox30; + private System.Windows.Forms.Label exclamation27; + private System.Windows.Forms.TextBox endTextBox29; + private System.Windows.Forms.Label exclamation26; + private System.Windows.Forms.TextBox endTextBox28; + private System.Windows.Forms.TextBox endTextBox27; + private System.Windows.Forms.TextBox endTextBox26; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/TestStartEndForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/TestStartEndForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard48/TestStartEndForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/CycleBeginningForm.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/CycleBeginningForm.Designer.cs new file mode 100644 index 00000000..0bc3b69d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/CycleBeginningForm.Designer.cs @@ -0,0 +1,417 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.Standard6 +{ + partial class CycleBeginningForm + { + /// + /// 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(CycleBeginningForm)); + this.okButton = new System.Windows.Forms.Button(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.checkBox1 = new System.Windows.Forms.CheckBox(); + this.label1 = new System.Windows.Forms.Label(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.comboBox2 = new System.Windows.Forms.ComboBox(); + this.checkBox2 = new System.Windows.Forms.CheckBox(); + this.label2 = new System.Windows.Forms.Label(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.comboBox3 = new System.Windows.Forms.ComboBox(); + this.checkBox7 = new System.Windows.Forms.CheckBox(); + this.checkBox3 = new System.Windows.Forms.CheckBox(); + this.label3 = new System.Windows.Forms.Label(); + this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.comboBox4 = new System.Windows.Forms.ComboBox(); + this.checkBox4 = new System.Windows.Forms.CheckBox(); + this.label4 = new System.Windows.Forms.Label(); + this.groupBox5 = new System.Windows.Forms.GroupBox(); + this.comboBox5 = new System.Windows.Forms.ComboBox(); + this.checkBox5 = new System.Windows.Forms.CheckBox(); + this.label5 = new System.Windows.Forms.Label(); + this.groupBox6 = new System.Windows.Forms.GroupBox(); + this.comboBox6 = new System.Windows.Forms.ComboBox(); + this.checkBox6 = new System.Windows.Forms.CheckBox(); + this.label6 = new System.Windows.Forms.Label(); + this.orderGroupBox = new System.Windows.Forms.GroupBox(); + this.orderComboBox = new System.Windows.Forms.ComboBox(); + this.clearButton = new System.Windows.Forms.Button(); + this.batchRemarkButton = new System.Windows.Forms.Button(); + this.remarkTextBox1 = new System.Windows.Forms.TextBox(); + this.remarkTextBox2 = new System.Windows.Forms.TextBox(); + this.remarkTextBox3 = new System.Windows.Forms.TextBox(); + this.remarkTextBox4 = new System.Windows.Forms.TextBox(); + this.remarkTextBox5 = new System.Windows.Forms.TextBox(); + this.remarkTextBox6 = new System.Windows.Forms.TextBox(); + this.groupBox1.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.groupBox4.SuspendLayout(); + this.groupBox5.SuspendLayout(); + this.groupBox6.SuspendLayout(); + this.orderGroupBox.SuspendLayout(); + this.SuspendLayout(); + // + // okButton + // + resources.ApplyResources(this.okButton, "okButton"); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Name = "okButton"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.remarkTextBox1); + this.groupBox1.Controls.Add(this.comboBox1); + this.groupBox1.Controls.Add(this.checkBox1); + this.groupBox1.Controls.Add(this.label1); + resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.ForeColor = System.Drawing.Color.Black; + this.groupBox1.Name = "groupBox1"; + this.groupBox1.TabStop = false; + // + // comboBox1 + // + this.comboBox1.FormattingEnabled = true; + resources.ApplyResources(this.comboBox1, "comboBox1"); + this.comboBox1.Name = "comboBox1"; + this.comboBox1.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged); + this.comboBox1.TextChanged += new System.EventHandler(this.comboBox1_TextChanged); + this.comboBox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox1_KeyPress); + // + // checkBox1 + // + resources.ApplyResources(this.checkBox1, "checkBox1"); + this.checkBox1.Name = "checkBox1"; + this.checkBox1.UseVisualStyleBackColor = true; + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.remarkTextBox2); + this.groupBox2.Controls.Add(this.comboBox2); + this.groupBox2.Controls.Add(this.checkBox2); + this.groupBox2.Controls.Add(this.label2); + resources.ApplyResources(this.groupBox2, "groupBox2"); + this.groupBox2.ForeColor = System.Drawing.Color.Black; + this.groupBox2.Name = "groupBox2"; + this.groupBox2.TabStop = false; + // + // comboBox2 + // + this.comboBox2.FormattingEnabled = true; + resources.ApplyResources(this.comboBox2, "comboBox2"); + this.comboBox2.Name = "comboBox2"; + this.comboBox2.SelectedIndexChanged += new System.EventHandler(this.comboBox2_SelectedIndexChanged); + this.comboBox2.TextChanged += new System.EventHandler(this.comboBox2_TextChanged); + this.comboBox2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox2_KeyPress); + // + // checkBox2 + // + resources.ApplyResources(this.checkBox2, "checkBox2"); + this.checkBox2.Name = "checkBox2"; + this.checkBox2.UseVisualStyleBackColor = true; + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.remarkTextBox3); + this.groupBox3.Controls.Add(this.comboBox3); + this.groupBox3.Controls.Add(this.checkBox7); + this.groupBox3.Controls.Add(this.checkBox3); + this.groupBox3.Controls.Add(this.label3); + resources.ApplyResources(this.groupBox3, "groupBox3"); + this.groupBox3.ForeColor = System.Drawing.Color.Black; + this.groupBox3.Name = "groupBox3"; + this.groupBox3.TabStop = false; + // + // comboBox3 + // + this.comboBox3.FormattingEnabled = true; + resources.ApplyResources(this.comboBox3, "comboBox3"); + this.comboBox3.Name = "comboBox3"; + this.comboBox3.SelectedIndexChanged += new System.EventHandler(this.comboBox3_SelectedIndexChanged); + this.comboBox3.TextChanged += new System.EventHandler(this.comboBox3_TextChanged); + this.comboBox3.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox3_KeyPress); + // + // checkBox7 + // + resources.ApplyResources(this.checkBox7, "checkBox7"); + this.checkBox7.Name = "checkBox7"; + this.checkBox7.UseVisualStyleBackColor = true; + // + // checkBox3 + // + resources.ApplyResources(this.checkBox3, "checkBox3"); + this.checkBox3.Name = "checkBox3"; + this.checkBox3.UseVisualStyleBackColor = true; + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // + // groupBox4 + // + this.groupBox4.Controls.Add(this.remarkTextBox4); + this.groupBox4.Controls.Add(this.comboBox4); + this.groupBox4.Controls.Add(this.checkBox4); + this.groupBox4.Controls.Add(this.label4); + resources.ApplyResources(this.groupBox4, "groupBox4"); + this.groupBox4.ForeColor = System.Drawing.Color.Black; + this.groupBox4.Name = "groupBox4"; + this.groupBox4.TabStop = false; + // + // comboBox4 + // + this.comboBox4.FormattingEnabled = true; + resources.ApplyResources(this.comboBox4, "comboBox4"); + this.comboBox4.Name = "comboBox4"; + this.comboBox4.SelectedIndexChanged += new System.EventHandler(this.comboBox4_SelectedIndexChanged); + this.comboBox4.TextChanged += new System.EventHandler(this.comboBox4_TextChanged); + this.comboBox4.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox4_KeyPress); + // + // checkBox4 + // + resources.ApplyResources(this.checkBox4, "checkBox4"); + this.checkBox4.Name = "checkBox4"; + this.checkBox4.UseVisualStyleBackColor = true; + // + // label4 + // + resources.ApplyResources(this.label4, "label4"); + this.label4.Name = "label4"; + // + // groupBox5 + // + this.groupBox5.Controls.Add(this.remarkTextBox5); + this.groupBox5.Controls.Add(this.comboBox5); + this.groupBox5.Controls.Add(this.checkBox5); + this.groupBox5.Controls.Add(this.label5); + resources.ApplyResources(this.groupBox5, "groupBox5"); + this.groupBox5.ForeColor = System.Drawing.Color.Black; + this.groupBox5.Name = "groupBox5"; + this.groupBox5.TabStop = false; + // + // comboBox5 + // + this.comboBox5.FormattingEnabled = true; + resources.ApplyResources(this.comboBox5, "comboBox5"); + this.comboBox5.Name = "comboBox5"; + this.comboBox5.SelectedIndexChanged += new System.EventHandler(this.comboBox5_SelectedIndexChanged); + this.comboBox5.TextChanged += new System.EventHandler(this.comboBox5_TextChanged); + this.comboBox5.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox5_KeyPress); + // + // checkBox5 + // + resources.ApplyResources(this.checkBox5, "checkBox5"); + this.checkBox5.Name = "checkBox5"; + this.checkBox5.UseVisualStyleBackColor = true; + // + // label5 + // + resources.ApplyResources(this.label5, "label5"); + this.label5.Name = "label5"; + // + // groupBox6 + // + this.groupBox6.Controls.Add(this.remarkTextBox6); + this.groupBox6.Controls.Add(this.comboBox6); + this.groupBox6.Controls.Add(this.checkBox6); + this.groupBox6.Controls.Add(this.label6); + resources.ApplyResources(this.groupBox6, "groupBox6"); + this.groupBox6.ForeColor = System.Drawing.Color.Black; + this.groupBox6.Name = "groupBox6"; + this.groupBox6.TabStop = false; + // + // comboBox6 + // + this.comboBox6.FormattingEnabled = true; + resources.ApplyResources(this.comboBox6, "comboBox6"); + this.comboBox6.Name = "comboBox6"; + this.comboBox6.SelectedIndexChanged += new System.EventHandler(this.comboBox6_SelectedIndexChanged); + this.comboBox6.TextChanged += new System.EventHandler(this.comboBox6_TextChanged); + this.comboBox6.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox6_KeyPress); + // + // checkBox6 + // + resources.ApplyResources(this.checkBox6, "checkBox6"); + this.checkBox6.Name = "checkBox6"; + this.checkBox6.UseVisualStyleBackColor = true; + // + // label6 + // + resources.ApplyResources(this.label6, "label6"); + this.label6.Name = "label6"; + // + // orderGroupBox + // + this.orderGroupBox.Controls.Add(this.orderComboBox); + resources.ApplyResources(this.orderGroupBox, "orderGroupBox"); + this.orderGroupBox.ForeColor = System.Drawing.Color.Black; + this.orderGroupBox.Name = "orderGroupBox"; + this.orderGroupBox.TabStop = false; + // + // orderComboBox + // + this.orderComboBox.FormattingEnabled = true; + resources.ApplyResources(this.orderComboBox, "orderComboBox"); + this.orderComboBox.Name = "orderComboBox"; + // + // clearButton + // + resources.ApplyResources(this.clearButton, "clearButton"); + this.clearButton.ForeColor = System.Drawing.Color.Black; + this.clearButton.Name = "clearButton"; + this.clearButton.UseVisualStyleBackColor = true; + this.clearButton.Click += new System.EventHandler(this.clearButton_Click); + // + // batchRemarkButton + // + resources.ApplyResources(this.batchRemarkButton, "batchRemarkButton"); + this.batchRemarkButton.ForeColor = System.Drawing.Color.Black; + this.batchRemarkButton.Name = "batchRemarkButton"; + this.batchRemarkButton.UseVisualStyleBackColor = true; + this.batchRemarkButton.Click += new System.EventHandler(this.batchRemarkButton_Click); + // + // remarkTextBox1 + // + resources.ApplyResources(this.remarkTextBox1, "remarkTextBox1"); + this.remarkTextBox1.Name = "remarkTextBox1"; + // + // remarkTextBox2 + // + resources.ApplyResources(this.remarkTextBox2, "remarkTextBox2"); + this.remarkTextBox2.Name = "remarkTextBox2"; + // + // remarkTextBox3 + // + resources.ApplyResources(this.remarkTextBox3, "remarkTextBox3"); + this.remarkTextBox3.Name = "remarkTextBox3"; + // + // remarkTextBox4 + // + resources.ApplyResources(this.remarkTextBox4, "remarkTextBox4"); + this.remarkTextBox4.Name = "remarkTextBox4"; + // + // remarkTextBox5 + // + resources.ApplyResources(this.remarkTextBox5, "remarkTextBox5"); + this.remarkTextBox5.Name = "remarkTextBox5"; + // + // remarkTextBox6 + // + resources.ApplyResources(this.remarkTextBox6, "remarkTextBox6"); + this.remarkTextBox6.Name = "remarkTextBox6"; + // + // CycleBeginningForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.Controls.Add(this.batchRemarkButton); + this.Controls.Add(this.clearButton); + this.Controls.Add(this.orderGroupBox); + this.Controls.Add(this.groupBox6); + this.Controls.Add(this.groupBox5); + this.Controls.Add(this.groupBox4); + this.Controls.Add(this.groupBox3); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.okButton); + this.ForeColor = System.Drawing.Color.Black; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "CycleBeginningForm"; + this.TopMost = true; + this.Load += new System.EventHandler(this.CycleBeginningForm_Load); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.groupBox4.ResumeLayout(false); + this.groupBox4.PerformLayout(); + this.groupBox5.ResumeLayout(false); + this.groupBox5.PerformLayout(); + this.groupBox6.ResumeLayout(false); + this.groupBox6.PerformLayout(); + this.orderGroupBox.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.GroupBox groupBox4; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.GroupBox groupBox5; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.GroupBox groupBox6; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.CheckBox checkBox1; + private System.Windows.Forms.CheckBox checkBox2; + private System.Windows.Forms.CheckBox checkBox7; + private System.Windows.Forms.CheckBox checkBox3; + private System.Windows.Forms.CheckBox checkBox4; + private System.Windows.Forms.CheckBox checkBox5; + private System.Windows.Forms.CheckBox checkBox6; + private System.Windows.Forms.GroupBox orderGroupBox; + private System.Windows.Forms.ComboBox orderComboBox; + private System.Windows.Forms.ComboBox comboBox1; + private System.Windows.Forms.ComboBox comboBox2; + private System.Windows.Forms.ComboBox comboBox3; + private System.Windows.Forms.ComboBox comboBox4; + private System.Windows.Forms.ComboBox comboBox5; + private System.Windows.Forms.ComboBox comboBox6; + private System.Windows.Forms.Button clearButton; + private System.Windows.Forms.TextBox remarkTextBox1; + private System.Windows.Forms.TextBox remarkTextBox2; + private System.Windows.Forms.TextBox remarkTextBox3; + private System.Windows.Forms.TextBox remarkTextBox4; + private System.Windows.Forms.TextBox remarkTextBox5; + private System.Windows.Forms.TextBox remarkTextBox6; + private System.Windows.Forms.Button batchRemarkButton; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/CycleBeginningForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/CycleBeginningForm.cs new file mode 100644 index 00000000..469a0b07 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/CycleBeginningForm.cs @@ -0,0 +1,322 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using log4net; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.Standard6 +{ + public partial class CycleBeginningForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(CycleBeginningForm)); + + /// Number of text boxes for serial numbers + public readonly int WaterMetersCount; + + /// To be retrieved after the form is closed + public string PurchaseOrder; + public string[] SNText; + public bool[] Disabled; + public string[] Remark; + public string BatchRemark; + + /// Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + IList enabledComboBoxes; + + /// + /// Constructor + /// + /// Number of text boxes for serial numbers + public CycleBeginningForm(int waterMetersCount) + { + InitializeComponent(); + ControlBox = false; + + this.WaterMetersCount = waterMetersCount; + SNText = new string[WaterMetersCount]; + Remark = new string[WaterMetersCount]; + Disabled = new bool[WaterMetersCount]; + enabledComboBoxes = new List(); + + Height = 147 + WaterMetersCount * 90; + + completed = false; + StartForceCloseHandler(); + } + + /// Parameterless constructor for all watermeters + public CycleBeginningForm() + : this(Config.Data.WMsCount) + { + } + + private void CycleBeginningForm_Load(object sender, EventArgs e) + { + Localize(); + + PrepareOrderCombo(orderComboBox); + + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (WaterMetersCount >= 1) comboBox1.Items.Add((Program.LocalSettings.LastSNTexts[0] == null) ? string.Empty : Program.LocalSettings.LastSNTexts[0]); + if (WaterMetersCount >= 2) comboBox2.Items.Add((Program.LocalSettings.LastSNTexts[1] == null) ? string.Empty : Program.LocalSettings.LastSNTexts[1]); + if (WaterMetersCount >= 3) comboBox3.Items.Add((Program.LocalSettings.LastSNTexts[2] == null) ? string.Empty : Program.LocalSettings.LastSNTexts[2]); + if (WaterMetersCount >= 4) comboBox4.Items.Add((Program.LocalSettings.LastSNTexts[3] == null) ? string.Empty : Program.LocalSettings.LastSNTexts[3]); + if (WaterMetersCount >= 5) comboBox5.Items.Add((Program.LocalSettings.LastSNTexts[4] == null) ? string.Empty : Program.LocalSettings.LastSNTexts[4]); + if (WaterMetersCount >= 6) comboBox6.Items.Add((Program.LocalSettings.LastSNTexts[5] == null) ? string.Empty : Program.LocalSettings.LastSNTexts[5]); + } + + if (WaterMetersCount < 1) { groupBox1.Visible = false; } else { enabledComboBoxes.Add(comboBox1); } + if (WaterMetersCount < 2) { groupBox2.Visible = false; } else { enabledComboBoxes.Add(comboBox2); } + if (WaterMetersCount < 3) { groupBox3.Visible = false; } else { enabledComboBoxes.Add(comboBox3); } + if (WaterMetersCount < 4) { groupBox4.Visible = false; } else { enabledComboBoxes.Add(comboBox4); } + if (WaterMetersCount < 5) { groupBox5.Visible = false; } else { enabledComboBoxes.Add(comboBox5); } + if (WaterMetersCount < 6) { groupBox6.Visible = false; } else { enabledComboBoxes.Add(comboBox6); } + + Height = 147 + WaterMetersCount * 90; + } + + void Localize() + { + Text = Strings.Data; + orderGroupBox.Text = Strings.Purchase_order; + + groupBox1.Text = Strings.Water_Meter + " 1"; + groupBox2.Text = Strings.Water_Meter + " 2"; + groupBox3.Text = Strings.Water_Meter + " 3"; + groupBox4.Text = Strings.Water_Meter + " 4"; + groupBox5.Text = Strings.Water_Meter + " 5"; + groupBox6.Text = Strings.Water_Meter + " 6"; + + label1.Text = Strings.Serial_Number; + label2.Text = Strings.Serial_Number; + label3.Text = Strings.Serial_Number; + label4.Text = Strings.Serial_Number; + label5.Text = Strings.Serial_Number; + label6.Text = Strings.Serial_Number; + + okButton.Text = Strings.OkBtnText; + clearButton.Text = Strings.ClearBtnText; + } + + /// + /// Load Purchase order combo box items from the LocalSettings PurchaseOrderHistory array + /// + /// Puchase order ComboBox + void PrepareOrderCombo(ComboBox orderComboBox) + { + for (int i = 0; i < Program.LocalSettings.PurchaseOrderHistoryCount; i++) + { + orderComboBox.Items.Add(Program.LocalSettings.PurchaseOrderHistory[i]); + } + + if (orderComboBox.Items.Count > 0) + { + orderComboBox.Text = orderComboBox.Items[0].ToString(); + } + } + + private void okButton_Click(object sender, EventArgs e) + { + PurchaseOrder = orderComboBox.Text; + Program.LocalSettings.UpdateHistory(orderComboBox.Text, + ref Program.LocalSettings.PurchaseOrderHistory +#if FUZHOU150 || FUZHOU300 + , 20 +#endif + ); + + + + if (WaterMetersCount >= 1) { SNText[0] = comboBox1.Text; Disabled[0] = !checkBox1.Checked; Remark[0] = remarkTextBox1.Text; } + if (WaterMetersCount >= 2) { SNText[1] = comboBox2.Text; Disabled[1] = !checkBox2.Checked; Remark[1] = remarkTextBox2.Text; } + if (WaterMetersCount >= 3) { SNText[2] = comboBox3.Text; Disabled[2] = !checkBox3.Checked; Remark[2] = remarkTextBox3.Text; } + if (WaterMetersCount >= 4) { SNText[3] = comboBox4.Text; Disabled[3] = !checkBox4.Checked; Remark[3] = remarkTextBox4.Text; } + if (WaterMetersCount >= 5) { SNText[4] = comboBox5.Text; Disabled[4] = !checkBox5.Checked; Remark[4] = remarkTextBox5.Text; } + if (WaterMetersCount >= 6) { SNText[5] = comboBox6.Text; Disabled[5] = !checkBox6.Checked; Remark[5] = remarkTextBox6.Text; } + + + Program.LocalSettings.LastSNTexts = SNText; + + + completed = true; + Close(); + } + + + private void UpdateAllCombos() + { + if (WaterMetersCount >= 1) + { + comboBox1.Text = Program.LocalSettings.LastSNTexts[0]; + checkBox1.Checked = !string.IsNullOrEmpty(comboBox1.Text); + } + if (WaterMetersCount >= 2) + { + comboBox2.Text = Program.LocalSettings.LastSNTexts[1]; + checkBox2.Checked = !string.IsNullOrEmpty(comboBox2.Text); + } + if (WaterMetersCount >= 3) + { + comboBox3.Text = Program.LocalSettings.LastSNTexts[2]; + checkBox3.Checked = !string.IsNullOrEmpty(comboBox3.Text); + } + if (WaterMetersCount >= 4) + { + comboBox4.Text = Program.LocalSettings.LastSNTexts[3]; + checkBox4.Checked = !string.IsNullOrEmpty(comboBox4.Text); + } + if (WaterMetersCount >= 5) + { + comboBox5.Text = Program.LocalSettings.LastSNTexts[4]; + checkBox5.Checked = !string.IsNullOrEmpty(comboBox5.Text); + } + if (WaterMetersCount >= 6) + { + comboBox6.Text = Program.LocalSettings.LastSNTexts[5]; + checkBox6.Checked = !string.IsNullOrEmpty(comboBox6.Text); + } + } + + private void comboBox1_TextChanged(object sender, EventArgs e) { checkBox1.Checked = true; } + private void comboBox2_TextChanged(object sender, EventArgs e) { checkBox2.Checked = true; } + private void comboBox3_TextChanged(object sender, EventArgs e) { checkBox3.Checked = true; } + private void comboBox4_TextChanged(object sender, EventArgs e) { checkBox4.Checked = true; } + private void comboBox5_TextChanged(object sender, EventArgs e) { checkBox5.Checked = true; } + private void comboBox6_TextChanged(object sender, EventArgs e) { checkBox6.Checked = true; } + + private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox1.Text.Equals(Program.LocalSettings.LastSNTexts[0])) + UpdateAllCombos(); + } + } + private void comboBox2_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox2.Text.Equals(Program.LocalSettings.LastSNTexts[1])) + UpdateAllCombos(); + } + } + private void comboBox3_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox3.Text.Equals(Program.LocalSettings.LastSNTexts[2])) + UpdateAllCombos(); + } + } + private void comboBox4_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox4.Text.Equals(Program.LocalSettings.LastSNTexts[3])) + UpdateAllCombos(); + } + } + private void comboBox5_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox5.Text.Equals(Program.LocalSettings.LastSNTexts[4])) + UpdateAllCombos(); + } + } + private void comboBox6_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox6.Text.Equals(Program.LocalSettings.LastSNTexts[5])) + UpdateAllCombos(); + } + } + + + private void clearButton_Click(object sender, EventArgs e) + { + if (WaterMetersCount >= 1) { comboBox1.Text = string.Empty; checkBox1.Checked = false; } + if (WaterMetersCount >= 2) { comboBox2.Text = string.Empty; checkBox2.Checked = false; } + if (WaterMetersCount >= 3) { comboBox3.Text = string.Empty; checkBox3.Checked = false; } + if (WaterMetersCount >= 4) { comboBox4.Text = string.Empty; checkBox4.Checked = false; } + if (WaterMetersCount >= 5) { comboBox5.Text = string.Empty; checkBox5.Checked = false; } + if (WaterMetersCount >= 6) { comboBox6.Text = string.Empty; checkBox6.Checked = false; } + } + + + #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); + }; + } + + private void OnForceClose(object sender, EventArgs args) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + + + /// + /// Process a key press within any enabled text boxe + /// + /// + /// + /// TextBox control which received the event + private void ProcKeyPress(object sender, KeyPressEventArgs e, ComboBox currentFocusOwner) + { + if (e.KeyChar == '+') + { + /// Process '+' key ..... Form completed + okButton_Click(sender, e); + } + if (e.KeyChar == '\r') + { + /// Process key ..... Next text field + if (enabledComboBoxes.Count < 2) return; /// There is just one enabled textbox + + for (int i = 0; i < enabledComboBoxes.Count; i++) + { + if (enabledComboBoxes[i] == currentFocusOwner) + { + /// Change focus to the next enabled text box + enabledComboBoxes[(i + 1) % enabledComboBoxes.Count].Focus(); + return; + } + } + } + } + + private void comboBox1_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox1); } + private void comboBox2_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox2); } + private void comboBox3_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox3); } + private void comboBox4_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox4); } + private void comboBox5_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox5); } + private void comboBox6_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox6); } + + + private void batchRemarkButton_Click(object sender, EventArgs e) + { + TBF.Forms.RemarkDlg dlg = new TBF.Forms.RemarkDlg() { Remark = ((BatchRemark == null) ? string.Empty : BatchRemark) }; + if (dlg.ShowDialog() == DialogResult.OK) + { + BatchRemark = dlg.Remark; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/CycleBeginningForm.pl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/CycleBeginningForm.pl.resx new file mode 100644 index 00000000..6ee50872 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/CycleBeginningForm.pl.resx @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + OK + + + Wodomierz 1 + + + Nr seryjny + + + Wodomierz 2 + + + Nr seryjny + + + Wodomierz 3 + + + Nr seryjny + + + Wodomierz 4 + + + Nr seryjny + + + Wodomierz 5 + + + Nr seryjny + + + Nr seryjny + + + Wodomierz 6 + + + Kolejność + + + Usunąć + + + Dane partii + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/CycleBeginningForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/CycleBeginningForm.resx new file mode 100644 index 00000000..975a5791 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/CycleBeginningForm.resx @@ -0,0 +1,1401 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + Verdana, 14.25pt + + + 691, 31 + + + 98, 63 + + + + 7 + + + OK + + + okButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 9 + + + remarkTextBox1 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + comboBox1 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + checkBox1 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 2 + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 3 + + + Verdana, 14.25pt + + + 28, 110 + + + 1030, 77 + + + 1 + + + Watermeter 1 + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 8 + + + 187, 29 + + + 163, 31 + + + 3 + + + comboBox1 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + True + + + Verdana, 27.75pt + + + 391, 40 + + + 15, 14 + + + 2 + + + checkBox1 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 2 + + + True + + + 18, 32 + + + 156, 23 + + + 0 + + + Serial Number: + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 3 + + + remarkTextBox2 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 + + + comboBox2 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 1 + + + checkBox2 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 2 + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 3 + + + Verdana, 14.25pt + + + 28, 200 + + + 1030, 77 + + + 2 + + + Watermeter 2 + + + groupBox2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 7 + + + 187, 29 + + + 163, 31 + + + 8 + + + comboBox2 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 1 + + + True + + + Verdana, 27.75pt + + + + NoControl + + + 391, 40 + + + 15, 14 + + + 7 + + + checkBox2 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 2 + + + True + + + 18, 32 + + + 156, 23 + + + 0 + + + Serial Number: + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 3 + + + remarkTextBox3 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox3 + + + 0 + + + comboBox3 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox3 + + + 1 + + + checkBox7 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox3 + + + 2 + + + checkBox3 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox3 + + + 3 + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox3 + + + 4 + + + Verdana, 14.25pt + + + 28, 290 + + + 1030, 77 + + + 3 + + + Watermeter 3 + + + groupBox3 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 6 + + + 187, 31 + + + 163, 31 + + + 8 + + + comboBox3 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox3 + + + 1 + + + True + + + Verdana, 27.75pt + + + NoControl + + + 391, -161 + + + 15, 14 + + + 2 + + + checkBox7 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox3 + + + 2 + + + True + + + Verdana, 27.75pt + + + NoControl + + + 391, 40 + + + 15, 14 + + + 7 + + + checkBox3 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox3 + + + 3 + + + True + + + NoControl + + + 18, 32 + + + 156, 23 + + + 0 + + + Serial Number: + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox3 + + + 4 + + + remarkTextBox4 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox4 + + + 0 + + + comboBox4 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox4 + + + 1 + + + checkBox4 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox4 + + + 2 + + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox4 + + + 3 + + + Verdana, 14.25pt + + + 28, 380 + + + 1030, 77 + + + 4 + + + Watermeter 4 + + + groupBox4 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 5 + + + 187, 29 + + + 163, 31 + + + 8 + + + comboBox4 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox4 + + + 1 + + + True + + + Verdana, 27.75pt + + + NoControl + + + 391, 40 + + + 15, 14 + + + 7 + + + checkBox4 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox4 + + + 2 + + + True + + + 18, 32 + + + 156, 23 + + + 0 + + + Serial Number: + + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox4 + + + 3 + + + remarkTextBox5 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox5 + + + 0 + + + comboBox5 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox5 + + + 1 + + + checkBox5 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox5 + + + 2 + + + label5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox5 + + + 3 + + + Verdana, 14.25pt + + + 28, 470 + + + 1030, 77 + + + 5 + + + Watermeter 5 + + + groupBox5 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + + + 187, 29 + + + 163, 31 + + + 8 + + + comboBox5 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox5 + + + 1 + + + True + + + Verdana, 27.75pt + + + NoControl + + + 391, 40 + + + 15, 14 + + + 7 + + + checkBox5 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox5 + + + 2 + + + True + + + 18, 32 + + + 156, 23 + + + 0 + + + Serial Number: + + + label5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox5 + + + 3 + + + remarkTextBox6 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox6 + + + 0 + + + comboBox6 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox6 + + + 1 + + + checkBox6 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox6 + + + 2 + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox6 + + + 3 + + + Verdana, 14.25pt + + + 28, 560 + + + 1030, 77 + + + 6 + + + Watermeter 6 + + + groupBox6 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + 187, 29 + + + 163, 31 + + + 8 + + + comboBox6 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox6 + + + 1 + + + True + + + Verdana, 27.75pt + + + NoControl + + + 391, 40 + + + 15, 14 + + + 7 + + + checkBox6 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox6 + + + 2 + + + True + + + 18, 32 + + + 156, 23 + + + 0 + + + Serial Number: + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox6 + + + 3 + + + orderComboBox + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + orderGroupBox + + + 0 + + + Verdana, 14.25pt + + + 28, 12 + + + 444, 82 + + + 0 + + + Order + + + orderGroupBox + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + 90, 31 + + + 260, 31 + + + 0 + + + orderComboBox + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + orderGroupBox + + + 0 + + + Verdana, 14.25pt + + + NoControl + + + 795, 31 + + + 98, 63 + + + 8 + + + Clear + + + clearButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + Top, Right + + + Verdana, 14.25pt + + + 902, 31 + + + 6, 5, 6, 5 + + + 108, 63 + + + 23 + + + Batch remark + + + False + + + batchRemarkButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + 446, 24 + + + 6, 5, 6, 5 + + + 575, 31 + + + 18 + + + remarkTextBox1 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + 446, 29 + + + 6, 5, 6, 5 + + + 575, 31 + + + 19 + + + remarkTextBox2 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 + + + 446, 29 + + + 6, 5, 6, 5 + + + 575, 31 + + + 20 + + + remarkTextBox3 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox3 + + + 0 + + + 446, 29 + + + 6, 5, 6, 5 + + + 575, 31 + + + 21 + + + remarkTextBox4 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox4 + + + 0 + + + 446, 29 + + + 6, 5, 6, 5 + + + 575, 31 + + + 22 + + + remarkTextBox5 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox5 + + + 0 + + + 446, 29 + + + 6, 5, 6, 5 + + + 575, 31 + + + 23 + + + remarkTextBox6 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox6 + + + 0 + + + True + + + 6, 13 + + + True + + + 1076, 656 + + + Batch data + + + CycleBeginningForm + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/CycleBeginningForm.ru.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/CycleBeginningForm.ru.resx new file mode 100644 index 00000000..951dc982 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/CycleBeginningForm.ru.resx @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + OK + + + Водосчетчик 1 + + + Серийный номер: + + + Водосчетчик 2 + + + Серийный номер: + + + Водосчетчик 3 + + + Серийный номер: + + + Водосчетчик 4 + + + Серийный номер: + + + Водосчетчик 5 + + + Серийный номер: + + + Серийный номер: + + + Водосчетчик 6 + + + Порядок + + + Очистить + + + Пакетные данные + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/CycleEndForm.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/CycleEndForm.Designer.cs new file mode 100644 index 00000000..995c9b00 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/CycleEndForm.Designer.cs @@ -0,0 +1,327 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// +namespace TBF.BenchControl.DataEntry.Standard6 +{ + partial class CycleEndForm + { + /// + /// 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() + { + this.textBox2 = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.okButton = new System.Windows.Forms.Button(); + this.textBox3 = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.textBox4 = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.textBox5 = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.textBox6 = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.remarkTextBox1 = new System.Windows.Forms.TextBox(); + this.stateLabel = new System.Windows.Forms.Label(); + this.remarkLabel = new System.Windows.Forms.Label(); + this.remarkTextBox2 = new System.Windows.Forms.TextBox(); + this.remarkTextBox3 = new System.Windows.Forms.TextBox(); + this.remarkTextBox4 = new System.Windows.Forms.TextBox(); + this.remarkTextBox5 = new System.Windows.Forms.TextBox(); + this.remarkTextBox6 = new System.Windows.Forms.TextBox(); + this.batchRemarkButton = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // textBox2 + // + this.textBox2.Location = new System.Drawing.Point(200, 107); + this.textBox2.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.textBox2.Name = "textBox2"; + this.textBox2.Size = new System.Drawing.Size(159, 31); + this.textBox2.TabIndex = 1; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(26, 110); + this.label2.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(147, 23); + this.label2.TabIndex = 0; + this.label2.Text = "Water meter 2"; + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(200, 61); + this.textBox1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(159, 31); + this.textBox1.TabIndex = 1; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(26, 64); + this.label1.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(147, 23); + this.label1.TabIndex = 0; + this.label1.Text = "Water meter 1"; + // + // okButton + // + this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(858, 32); + this.okButton.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(108, 60); + this.okButton.TabIndex = 7; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // textBox3 + // + this.textBox3.Location = new System.Drawing.Point(200, 153); + this.textBox3.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.textBox3.Name = "textBox3"; + this.textBox3.Size = new System.Drawing.Size(159, 31); + this.textBox3.TabIndex = 1; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(26, 156); + this.label3.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(147, 23); + this.label3.TabIndex = 0; + this.label3.Text = "Water meter 3"; + // + // textBox4 + // + this.textBox4.Location = new System.Drawing.Point(200, 199); + this.textBox4.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.textBox4.Name = "textBox4"; + this.textBox4.Size = new System.Drawing.Size(159, 31); + this.textBox4.TabIndex = 1; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(26, 202); + this.label4.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(147, 23); + this.label4.TabIndex = 0; + this.label4.Text = "Water meter 4"; + // + // textBox5 + // + this.textBox5.Location = new System.Drawing.Point(200, 245); + this.textBox5.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.textBox5.Name = "textBox5"; + this.textBox5.Size = new System.Drawing.Size(159, 31); + this.textBox5.TabIndex = 1; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(26, 248); + this.label5.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(147, 23); + this.label5.TabIndex = 0; + this.label5.Text = "Water meter 5"; + // + // textBox6 + // + this.textBox6.Location = new System.Drawing.Point(200, 291); + this.textBox6.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.textBox6.Name = "textBox6"; + this.textBox6.Size = new System.Drawing.Size(159, 31); + this.textBox6.TabIndex = 1; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(26, 294); + this.label6.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(147, 23); + this.label6.TabIndex = 0; + this.label6.Text = "Water meter 6"; + // + // remarkTextBox1 + // + this.remarkTextBox1.Location = new System.Drawing.Point(400, 61); + this.remarkTextBox1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.remarkTextBox1.Name = "remarkTextBox1"; + this.remarkTextBox1.Size = new System.Drawing.Size(421, 31); + this.remarkTextBox1.TabIndex = 8; + // + // stateLabel + // + this.stateLabel.AutoSize = true; + this.stateLabel.Location = new System.Drawing.Point(196, 24); + this.stateLabel.Name = "stateLabel"; + this.stateLabel.Size = new System.Drawing.Size(68, 23); + this.stateLabel.TabIndex = 9; + this.stateLabel.Text = "State:"; + // + // remarkLabel + // + this.remarkLabel.AutoSize = true; + this.remarkLabel.Location = new System.Drawing.Point(396, 24); + this.remarkLabel.Name = "remarkLabel"; + this.remarkLabel.Size = new System.Drawing.Size(211, 23); + this.remarkLabel.TabIndex = 10; + this.remarkLabel.Text = "Water meter remark:"; + // + // remarkTextBox2 + // + this.remarkTextBox2.Location = new System.Drawing.Point(400, 107); + this.remarkTextBox2.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.remarkTextBox2.Name = "remarkTextBox2"; + this.remarkTextBox2.Size = new System.Drawing.Size(421, 31); + this.remarkTextBox2.TabIndex = 11; + // + // remarkTextBox3 + // + this.remarkTextBox3.Location = new System.Drawing.Point(400, 153); + this.remarkTextBox3.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.remarkTextBox3.Name = "remarkTextBox3"; + this.remarkTextBox3.Size = new System.Drawing.Size(421, 31); + this.remarkTextBox3.TabIndex = 12; + // + // remarkTextBox4 + // + this.remarkTextBox4.Location = new System.Drawing.Point(400, 199); + this.remarkTextBox4.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.remarkTextBox4.Name = "remarkTextBox4"; + this.remarkTextBox4.Size = new System.Drawing.Size(421, 31); + this.remarkTextBox4.TabIndex = 13; + // + // remarkTextBox5 + // + this.remarkTextBox5.Location = new System.Drawing.Point(400, 245); + this.remarkTextBox5.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.remarkTextBox5.Name = "remarkTextBox5"; + this.remarkTextBox5.Size = new System.Drawing.Size(421, 31); + this.remarkTextBox5.TabIndex = 14; + // + // remarkTextBox6 + // + this.remarkTextBox6.Location = new System.Drawing.Point(400, 291); + this.remarkTextBox6.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.remarkTextBox6.Name = "remarkTextBox6"; + this.remarkTextBox6.Size = new System.Drawing.Size(421, 31); + this.remarkTextBox6.TabIndex = 15; + // + // batchRemarkButton + // + this.batchRemarkButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.batchRemarkButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.batchRemarkButton.ForeColor = System.Drawing.Color.Black; + this.batchRemarkButton.Location = new System.Drawing.Point(858, 107); + this.batchRemarkButton.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.batchRemarkButton.Name = "batchRemarkButton"; + this.batchRemarkButton.Size = new System.Drawing.Size(108, 60); + this.batchRemarkButton.TabIndex = 16; + this.batchRemarkButton.Text = "Batch remark"; + this.batchRemarkButton.UseVisualStyleBackColor = true; + this.batchRemarkButton.Click += new System.EventHandler(this.batchRemarkButton_Click); + // + // CycleEndForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(12F, 23F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.ClientSize = new System.Drawing.Size(1001, 349); + this.Controls.Add(this.batchRemarkButton); + this.Controls.Add(this.remarkTextBox6); + this.Controls.Add(this.remarkTextBox5); + this.Controls.Add(this.remarkTextBox4); + this.Controls.Add(this.remarkTextBox3); + this.Controls.Add(this.remarkTextBox2); + this.Controls.Add(this.remarkLabel); + this.Controls.Add(this.stateLabel); + this.Controls.Add(this.remarkTextBox1); + this.Controls.Add(this.textBox6); + this.Controls.Add(this.label6); + this.Controls.Add(this.textBox5); + this.Controls.Add(this.label5); + this.Controls.Add(this.textBox4); + this.Controls.Add(this.label4); + this.Controls.Add(this.textBox3); + this.Controls.Add(this.label3); + this.Controls.Add(this.textBox2); + this.Controls.Add(this.label2); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.label1); + this.Controls.Add(this.okButton); + this.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.Name = "CycleEndForm"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "Daten"; + this.TopMost = true; + this.Load += new System.EventHandler(this.CycleEndForm_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox textBox2; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.TextBox textBox3; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox textBox4; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox textBox5; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.TextBox textBox6; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TextBox remarkTextBox1; + private System.Windows.Forms.Label stateLabel; + private System.Windows.Forms.Label remarkLabel; + private System.Windows.Forms.TextBox remarkTextBox2; + private System.Windows.Forms.TextBox remarkTextBox3; + private System.Windows.Forms.TextBox remarkTextBox4; + private System.Windows.Forms.TextBox remarkTextBox5; + private System.Windows.Forms.TextBox remarkTextBox6; + private System.Windows.Forms.Button batchRemarkButton; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/CycleEndForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/CycleEndForm.cs new file mode 100644 index 00000000..0fbf215b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/CycleEndForm.cs @@ -0,0 +1,144 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// +using System; +using System.Windows.Forms; +using log4net; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.Standard6 +{ + public partial class CycleEndForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(CycleEndForm)); + + /// Number of text boxes for serial numbers + public readonly int WaterMetersCount; + public readonly bool RemarkEnabled; + + // To be retrieved after the form closes + public string[] EndStateText; + public string[] Remark; + public string BatchRemark; + + // Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + int textBoxesCount; + Label[] labels; + TextBox[] stateBoxes; + TextBox[] remarkBoxes; + + + /// + /// Constructor + /// + /// Number of text boxes for serial numbers + public CycleEndForm() + { + InitializeComponent(); + ControlBox = false; + + labels = new Label[] { label1, label2, label3, label4, label5, label6 }; + stateBoxes = new TextBox[] { textBox1, textBox2, textBox3, textBox4, textBox5, textBox6 }; + remarkBoxes = new TextBox[] { remarkTextBox1, remarkTextBox2, remarkTextBox3, + remarkTextBox4, remarkTextBox5, remarkTextBox6 }; + textBoxesCount = stateBoxes.Length; + this.WaterMetersCount = textBoxesCount; + + completed = false; + StartForceCloseHandler(); + } + + /// Parameterless constructor for 3 watermeters + public CycleEndForm(int waterMetersCount, bool remarkEnabled) + : this() + { + this.WaterMetersCount = waterMetersCount; + this.RemarkEnabled = remarkEnabled; + EndStateText = new string[WaterMetersCount]; + Remark = new string[WaterMetersCount]; + } + + private void CycleEndForm_Load(object sender, EventArgs e) + { + Localize(); + + Height = 100 + 46 * WaterMetersCount; + + if (!RemarkEnabled) + { + remarkLabel.Visible = false; + batchRemarkButton.Visible = false; + Width -= remarkTextBox1.Width; + } + + for (int i = 0; i < textBoxesCount; i++) + { + if (!RemarkEnabled) remarkBoxes[i].Visible = false; + + if (i >= WaterMetersCount) + { + labels[i].Visible = false; + stateBoxes[i].Visible = false; + remarkBoxes[i].Visible = false; + } + } + } + + void Localize() + { + Text = Strings.Data; + okButton.Text = Strings.OkBtnText; + + for (int i = 0; i < WaterMetersCount; i++) + { + labels[i].Text = string.Format("{0} {1}:", Strings.Water_Meter, i + 1); + } + + stateLabel.Text = string.Format("{0}:", Strings.State); + remarkLabel.Text = string.Format("{0} {1}:", Strings.Water_Meter, Strings.Remark); + } + + private void okButton_Click(object sender, EventArgs e) + { + for (int i = 0; i < WaterMetersCount; i++) + { + EndStateText[i] = stateBoxes[i].Text; + Remark[i] = remarkBoxes[i].Text; + } + + completed = true; + 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) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + + private void batchRemarkButton_Click(object sender, EventArgs e) + { + TBF.Forms.RemarkDlg dlg = new TBF.Forms.RemarkDlg() { Remark = ((BatchRemark == null) ? string.Empty : BatchRemark) }; + if (dlg.ShowDialog() == DialogResult.OK) + { + BatchRemark = dlg.Remark; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/CycleEndForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/CycleEndForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/CycleEndForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/EntryForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/EntryForm.cs new file mode 100644 index 00000000..b34b51ab --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/EntryForm.cs @@ -0,0 +1,20 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl.DataEntry.Standard6 +{ + public class EntryForm : EntryFormNoStartEnd, IHasWMStatesForm + { + public EntryForm() + : base() + { + } + + public EntryForm(Generic.IComponentCfg cfg) + : base(cfg) + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/EntryFormCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/EntryFormCfg.cs new file mode 100644 index 00000000..21938a5e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/EntryFormCfg.cs @@ -0,0 +1,50 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DataEntry.Standard6 +{ + public class EntryFormCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(EntryFormCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new EntryFormCfgCtrl(); } + + /// + /// Serialized parameters + /// + public bool EnterSerialNrsAtTheEnd; + public bool ShowCycleEndForm; + public bool RemarkEnabled; + public bool SensusExtensions; + + /// Private parameterless constructor invoked by all other (public) constructors + EntryFormCfg() + { + Name = "DataEntry-Standard"; + ParentName = string.Empty; + EnterSerialNrsAtTheEnd = false; + ShowCycleEndForm = false; + RemarkEnabled = false; + SensusExtensions = false; + } + + public EntryFormCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, EnterSNsAtTheEnd={1}, ShowEndForm={2}, Remark={3}, SensusExt={4}", + Name, EnterSerialNrsAtTheEnd, ShowCycleEndForm, RemarkEnabled, SensusExtensions); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/EntryFormCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/EntryFormCfgCtrl.cs new file mode 100644 index 00000000..087c5686 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/EntryFormCfgCtrl.cs @@ -0,0 +1,91 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.Standard6 +{ + public partial class EntryFormCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + EntryFormCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as EntryFormCfg; + Redraw(); + } + } + + public EntryFormCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Localize(); + Redraw(); + } + + void Localize() + { + enterSNsAtTheEndCheckBox.Text = Strings.Enter_SNs_at_the_end; + showEndStateFormCheckBox.Text = Strings.Show_cycle_end_form; + remarkEnabledCheckBox.Text = Strings.Enable_Remark; + sensusExtensionsCheckBox.Text = Strings.Sensus_extensions; + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + enterSNsAtTheEndCheckBox.Checked = config.EnterSerialNrsAtTheEnd; + showEndStateFormCheckBox.Checked = config.ShowCycleEndForm; + remarkEnabledCheckBox.Checked = config.RemarkEnabled; + sensusExtensionsCheckBox.Checked = config.SensusExtensions; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + enterSNsAtTheEndCheckBox.Enabled = true; + showEndStateFormCheckBox.Enabled = true; + remarkEnabledCheckBox.Enabled = true; + sensusExtensionsCheckBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.EnterSerialNrsAtTheEnd = enterSNsAtTheEndCheckBox.Checked; + config.ShowCycleEndForm = showEndStateFormCheckBox.Checked; + config.RemarkEnabled = remarkEnabledCheckBox.Checked; + config.SensusExtensions = sensusExtensionsCheckBox.Checked; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/EntryFormCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/EntryFormCfgCtrl.designer.cs new file mode 100644 index 00000000..3407daa4 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/EntryFormCfgCtrl.designer.cs @@ -0,0 +1,142 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.Standard6 +{ + partial class EntryFormCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.showEndStateFormCheckBox = new System.Windows.Forms.CheckBox(); + this.enterSNsAtTheEndCheckBox = new System.Windows.Forms.CheckBox(); + this.sensusExtensionsCheckBox = new System.Windows.Forms.CheckBox(); + this.remarkEnabledCheckBox = new System.Windows.Forms.CheckBox(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(99, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(35, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(96, 33); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // showEndStateFormCheckBox + // + this.showEndStateFormCheckBox.AutoSize = true; + this.showEndStateFormCheckBox.Enabled = false; + this.showEndStateFormCheckBox.Location = new System.Drawing.Point(99, 112); + this.showEndStateFormCheckBox.Name = "showEndStateFormCheckBox"; + this.showEndStateFormCheckBox.Size = new System.Drawing.Size(151, 17); + this.showEndStateFormCheckBox.TabIndex = 4; + this.showEndStateFormCheckBox.Text = "Watermeter end state form"; + this.showEndStateFormCheckBox.UseVisualStyleBackColor = true; + // + // enterSNsAtTheEndCheckBox + // + this.enterSNsAtTheEndCheckBox.AutoSize = true; + this.enterSNsAtTheEndCheckBox.Enabled = false; + this.enterSNsAtTheEndCheckBox.Location = new System.Drawing.Point(99, 89); + this.enterSNsAtTheEndCheckBox.Name = "enterSNsAtTheEndCheckBox"; + this.enterSNsAtTheEndCheckBox.Size = new System.Drawing.Size(167, 17); + this.enterSNsAtTheEndCheckBox.TabIndex = 3; + this.enterSNsAtTheEndCheckBox.Text = "Enter serial number at the end"; + this.enterSNsAtTheEndCheckBox.UseVisualStyleBackColor = true; + // + // sensusExtensionsCheckBox + // + this.sensusExtensionsCheckBox.AutoSize = true; + this.sensusExtensionsCheckBox.Enabled = false; + this.sensusExtensionsCheckBox.Location = new System.Drawing.Point(99, 158); + this.sensusExtensionsCheckBox.Name = "sensusExtensionsCheckBox"; + this.sensusExtensionsCheckBox.Size = new System.Drawing.Size(167, 17); + this.sensusExtensionsCheckBox.TabIndex = 6; + this.sensusExtensionsCheckBox.Text = "Sensus production extensions"; + this.sensusExtensionsCheckBox.UseVisualStyleBackColor = true; + // + // remarkEnabledCheckBox + // + this.remarkEnabledCheckBox.AutoSize = true; + this.remarkEnabledCheckBox.Enabled = false; + this.remarkEnabledCheckBox.Location = new System.Drawing.Point(99, 135); + this.remarkEnabledCheckBox.Name = "remarkEnabledCheckBox"; + this.remarkEnabledCheckBox.Size = new System.Drawing.Size(99, 17); + this.remarkEnabledCheckBox.TabIndex = 5; + this.remarkEnabledCheckBox.Text = "Enable remarks"; + this.remarkEnabledCheckBox.UseVisualStyleBackColor = true; + // + // EntryFormCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.remarkEnabledCheckBox); + this.Controls.Add(this.sensusExtensionsCheckBox); + this.Controls.Add(this.enterSNsAtTheEndCheckBox); + this.Controls.Add(this.showEndStateFormCheckBox); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "EntryFormCfgCtrl"; + this.Size = new System.Drawing.Size(450, 300); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.CheckBox showEndStateFormCheckBox; + private System.Windows.Forms.CheckBox enterSNsAtTheEndCheckBox; + private System.Windows.Forms.CheckBox sensusExtensionsCheckBox; + private System.Windows.Forms.CheckBox remarkEnabledCheckBox; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/EntryFormCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/EntryFormCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/EntryFormCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/EntryFormNoStartEnd.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/EntryFormNoStartEnd.cs new file mode 100644 index 00000000..d7fd738c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/EntryFormNoStartEnd.cs @@ -0,0 +1,294 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; +using TBF.BenchControl; +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl.DataEntry.Standard6 +{ + public class EntryFormNoStartEnd : ComponentBase, IOperation, IDataEntry, IHasCycleBeginForm, IHasCycleEndForm + { + private static readonly ILog log = LogManager.GetLogger(typeof(EntryFormNoStartEnd)); + public override string ToString() { return string.Format("DataEntry.Standard6({0})", Cfg.ToString(1)); } + + public bool UsesCameras() { return false; } + + readonly EntryFormCfg entryFormCfg; + IRegisterReader[] regReaders; + + /// + /// Properties set by the Begin, End and WMStates form + /// + string purchaseOrder; + public string PurchaseOrder { get { return purchaseOrder; } } + + string batchRemark; + + bool[] disabled; /// This array is shared between forms + + double[] wmStartState; + public double WMStartState(int wmNr) { return (wmNr >= 0 && wmNr < wmStartState.Length) ? wmStartState[wmNr] : 0; } + + double[] wmEndState; + public double WMEndState(int wmNr) { return (wmNr >= 0 && wmNr < wmEndState.Length) ? wmEndState[wmNr] : 0; } + + string[] wmStartStateStr; + + + System.Windows.Forms.Form modelessDlg; + + double refVolume; + double errLimLo; + double errLimHi; + + bool resultSaved; /// Set in Run() when results are saved + + Results.Entities.WaterMeter[] waterMeters; /// Reference to ...ProcessData.BatchRslts.WaterMeters[] + + public enum CurrentOp + { + None, + ShowFormAtCycleBeginning, + ShowFormAtCycleEnd, + EnterTestStartStates, + EnterTestEndStates, + } + + CurrentOp currentOp; + + + public EntryFormNoStartEnd() + { + } + + public EntryFormNoStartEnd(Generic.IComponentCfg cfg) + : base(cfg) + { + entryFormCfg = cfg as EntryFormCfg; + + disabled = new bool[Config.Data.WMsCount]; + wmStartState = new double[Config.Data.WMsCount]; + wmStartStateStr = new string[Config.Data.WMsCount]; + wmEndState = new double[Config.Data.WMsCount]; + batchRemark = null; + + currentOp = CurrentOp.None; + log.Debug(this.ToString()); + } + + /// Reference to the operation + public IOperation ShowCycleBeginFormOp() + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.ShowFormAtCycleBeginning; + this.waterMeters = TBF.BenchControl.Sequences.ProcessData.BatchRslts.WaterMeters; + return this; + } + + /// Reference to the operation + public IOperation ShowCycleEndFormOp() + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.ShowFormAtCycleEnd; + this.waterMeters = TBF.BenchControl.Sequences.ProcessData.BatchRslts.WaterMeters; + return this; + } + + /// Reference to the operation + public IOperation ShowTestStartFormOp(IRegisterReader[] regReaders) + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.EnterTestStartStates; + this.regReaders = regReaders; + return this; + } + + /// Reference to the operation + public IOperation ShowTestEndFormOp(IRegisterReader[] regReaders, double refVolume, double errLimLo, double errLimHi) + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.EnterTestEndStates; + this.regReaders = regReaders; + this.refVolume = refVolume; + this.errLimLo = errLimLo; + this.errLimHi = errLimHi; + return this; + } + + delegate void EntryFormDlgt(EntryFormNoStartEnd myRef); + /// + void OpenBeginningDlg(EntryFormNoStartEnd myRef) + { + myRef.modelessDlg = new CycleBeginningForm(myRef.waterMeters.Length); + modelessDlg.Show(); + } + /// + void OpenEndDlg(EntryFormNoStartEnd myRef) + { + myRef.modelessDlg = new CycleEndForm(myRef.waterMeters.Length, entryFormCfg.RemarkEnabled); + modelessDlg.Show(); + } + /// + void OpenTestStartStatesDlg(EntryFormNoStartEnd myRef) + { + myRef.modelessDlg = new TestStartEndForm(myRef.waterMeters.Length, myRef.regReaders, myRef.disabled); + modelessDlg.Show(); + } + /// + void OpenTestEndStatesDlg(EntryFormNoStartEnd myRef) + { + myRef.modelessDlg = new TestStartEndForm(myRef.waterMeters.Length, myRef.regReaders, wmStartStateStr, disabled, refVolume, errLimLo, errLimHi); + modelessDlg.Show(); + } + + /// Start this operation + public void Start() + { + resultSaved = false; + switch (currentOp) + { + case CurrentOp.ShowFormAtCycleBeginning: + if (!entryFormCfg.EnterSerialNrsAtTheEnd) + { + Program.MainWnd.Invoke(new EntryFormDlgt(OpenBeginningDlg), this); + } + break; + case CurrentOp.ShowFormAtCycleEnd: + if (entryFormCfg.EnterSerialNrsAtTheEnd) + { + Program.MainWnd.Invoke(new EntryFormDlgt(OpenBeginningDlg), this); + } + else if (entryFormCfg.ShowCycleEndForm) + { + Program.MainWnd.Invoke(new EntryFormDlgt(OpenEndDlg), this); + } + break; + case CurrentOp.EnterTestStartStates: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenTestStartStatesDlg), this); + break; + case CurrentOp.EnterTestEndStates: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenTestEndStatesDlg), this); + break; + } + } + + /// Run this operation + /// Event.ResultsPrinted + public Event Run() + { + if ((modelessDlg is IHasCompleted) && !(modelessDlg as IHasCompleted).Completed) + { + return Event.ModelessFormIsOpen; + } + + if (!resultSaved) /// This is to save the result only once + { + if ((!entryFormCfg.EnterSerialNrsAtTheEnd && currentOp == CurrentOp.ShowFormAtCycleBeginning) || + (entryFormCfg.EnterSerialNrsAtTheEnd && currentOp == CurrentOp.ShowFormAtCycleEnd)) + { + CycleBeginningForm dlg = (modelessDlg as CycleBeginningForm); + if (dlg != null) + { + purchaseOrder = dlg.PurchaseOrder; + + for (int i = 0; i < Math.Min(dlg.WaterMetersCount, waterMeters.Length); i++) + { + if (waterMeters[i] != null) + { + waterMeters[i].SerialNr = dlg.SNText[i]; + disabled[i] = waterMeters[i].Disabled = dlg.Disabled[i]; + waterMeters[i].Remark = dlg.Remark[i]; + waterMeters[i].Batch.Remark = dlg.BatchRemark; + } + } + } + } + else if (entryFormCfg.ShowCycleEndForm && currentOp == CurrentOp.ShowFormAtCycleEnd) + { + CycleEndForm dlg = (modelessDlg as CycleEndForm); + int count = waterMeters.Length; + if ((dlg != null) && (count > dlg.WaterMetersCount)) count = dlg.WaterMetersCount; + + for (int i = 0; i < count; i++) + { + if (waterMeters[i] != null) + { + /// In case entryFormCfg.ShowCycleEndForm == false dlg would be null, values would be string.Empty + waterMeters[i].EndState = (dlg != null) ? dlg.EndStateText[i] : string.Empty; + if (entryFormCfg.RemarkEnabled) + { + waterMeters[i].Remark = (dlg != null) ? dlg.Remark[i] : string.Empty; + } + } + } + + if (entryFormCfg.RemarkEnabled) + { + batchRemark = dlg.BatchRemark; + } + } + else if (modelessDlg is TestStartEndForm && currentOp == CurrentOp.EnterTestStartStates) + { + /// Fixed start test - start + TestStartEndForm dlg = (modelessDlg as TestStartEndForm); + if (dlg != null) + { + for (int i = 0; i < dlg.WaterMetersCount; i++) + { + wmStartState[i] = dlg.WMStartState[i]; + wmStartStateStr[i] = dlg.WMStartStateStr[i]; + } + } + } + else if (modelessDlg is TestStartEndForm && currentOp == CurrentOp.EnterTestEndStates) + { + /// Fixed start test - end + TestStartEndForm dlg = (modelessDlg as TestStartEndForm); + if (dlg != null) + { + for (int i = 0; i < dlg.WaterMetersCount; i++) + { + wmEndState[i] = dlg.WMEndState[i]; + } + } + } + resultSaved = true; + modelessDlg = null; + } + + return Event.ModelessFormClosed; /// Form closed + } + + /// Stop this operation + public void Stop() + { + if (modelessDlg is IHasCompleted) + { + UiBridge.Bridge.OnCloseModelessForm(this, null); + modelessDlg = null; + } + currentOp = CurrentOp.None; + } + + /// + /// Updates test results with the information collected in watermeters. + /// + /// Test results to be updated with the information + public void UpdateTestResults(Results.BatchResults batchResults) + { + if (batchRemark != null) + { + batchResults.Batch.Remark = batchRemark; + } + + foreach (var wm in batchResults.WaterMeters) + { + if (wm != null && !wm.Disabled) wm.PurchaseOrder = PurchaseOrder; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/Factory.cs new file mode 100644 index 00000000..e9a061f0 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DataEntry.Standard6 +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return "DataEntry-Standard"; } } + + public void ResetStaticProperties() { EntryFormNoStartEnd.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new EntryFormNoStartEnd(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new EntryForm(cfg); } + + public IComponentCfg DefaultConfig() { return new EntryFormCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(EntryFormCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/FactoryNoStartEnd.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/FactoryNoStartEnd.cs new file mode 100644 index 00000000..01782623 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/FactoryNoStartEnd.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DataEntry.Standard6 +{ + public class FactoryNoStartEnd : IComponentFactory + { + public string ClassName { get { return "DataEntry-Standard-6-NoStartEnd"; } } + + public void ResetStaticProperties() { EntryFormNoStartEnd.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new EntryFormNoStartEnd(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new EntryFormNoStartEnd(cfg); } + + public IComponentCfg DefaultConfig() { return new EntryFormCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(EntryFormCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/TestStartEndForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/TestStartEndForm.cs new file mode 100644 index 00000000..a04689d7 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/TestStartEndForm.cs @@ -0,0 +1,450 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using log4net; +using TBF.BenchControl.GenericDevices; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.Standard6 +{ + public partial class TestStartEndForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(TestStartEndForm)); + + // Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + /// Number of water meters + public readonly int WaterMetersCount; + readonly IRegisterReader[] regReaders; + readonly bool[] disabled; + + // To be retrieved after the form closes + public double[] WMStartState; + + // To be retrieved after the form closes + public readonly string[] WMStartStateStr; + + // To be retrieved after the form closes + public double[] WMEndState; + + bool endStates; /// false=start states, true=end states + double refVolume; + double warningLimLo; /// limit to display exclamation mark, typically 2x errLimLo + double warningLimHi; /// limit to display exclamation mark, typically 2x errLimHi + + + + + /// + /// Constructor to fill in start states + /// + /// Number of text boxes for serial numbers + public TestStartEndForm(int waterMetersCount, IRegisterReader[] regReaders, bool[] disabled) + { + InitializeComponent(); + ControlBox = false; + + endStates = false; + this.WaterMetersCount = waterMetersCount; + this.regReaders = regReaders; + this.disabled = disabled; + WMStartState = new double[waterMetersCount]; + WMStartStateStr = new string[waterMetersCount]; + + completed = false; + StartForceCloseHandler(); + } + + /// + /// Constructor to fill in end states + /// + /// Number of text boxes for serial numbers + public TestStartEndForm(int waterMetersCount, IRegisterReader[] regReaders, string[] wmStartStateStr, bool[] disabled, + double refVolume, double errLimLo, double errLimHi) + { + endStates = true; + + this.WaterMetersCount = waterMetersCount; + this.regReaders = regReaders; + if (wmStartStateStr == null || wmStartStateStr.Length < waterMetersCount) + throw (new Exception("Invalid 'wmStartStateStr' argument")); + this.WMStartStateStr = wmStartStateStr; + this.disabled = disabled; + this.refVolume = refVolume; + this.warningLimLo = 2 * errLimLo; + this.warningLimHi = 2 * errLimHi; + + InitializeComponent(); + WMEndState = new double[waterMetersCount]; + completed = false; + StartForceCloseHandler(); + } + + /// Parameterless constructor for all watermeters + public TestStartEndForm() + : this(Config.Data.WMsCount, null, null) + { + } + + private void CycleEndForm_Load(object sender, EventArgs e) + { + Localize(); + + Height = 70 + 90 * WaterMetersCount; + + if (WaterMetersCount < 1) groupBox1.Visible = false; + if (WaterMetersCount < 2) groupBox2.Visible = false; + if (WaterMetersCount < 3) groupBox3.Visible = false; + if (WaterMetersCount < 4) groupBox4.Visible = false; + if (WaterMetersCount < 5) groupBox5.Visible = false; + if (WaterMetersCount < 6) groupBox6.Visible = false; + + if (endStates) + { + if (WaterMetersCount >= 1) wmStartStateTextBox1.Text = WMStartStateStr[0]; + if (WaterMetersCount >= 2) wmStartStateTextBox2.Text = WMStartStateStr[1]; + if (WaterMetersCount >= 3) wmStartStateTextBox3.Text = WMStartStateStr[2]; + if (WaterMetersCount >= 4) wmStartStateTextBox4.Text = WMStartStateStr[3]; + if (WaterMetersCount >= 5) wmStartStateTextBox5.Text = WMStartStateStr[4]; + if (WaterMetersCount >= 6) wmStartStateTextBox6.Text = WMStartStateStr[5]; + + wmEndStateTextBox1.Enabled = (disabled.Length >= 1 && !disabled[0]); + wmEndStateTextBox2.Enabled = (disabled.Length >= 2 && !disabled[1]); + wmEndStateTextBox3.Enabled = (disabled.Length >= 3 && !disabled[2]); + wmEndStateTextBox4.Enabled = (disabled.Length >= 4 && !disabled[3]); + wmEndStateTextBox5.Enabled = (disabled.Length >= 5 && !disabled[4]); + wmEndStateTextBox6.Enabled = (disabled.Length >= 6 && !disabled[5]); + } + else + { + wmStartStateTextBox1.Enabled = (disabled.Length >= 1 && !disabled[0]); + wmStartStateTextBox2.Enabled = (disabled.Length >= 2 && !disabled[1]); + wmStartStateTextBox3.Enabled = (disabled.Length >= 3 && !disabled[2]); + wmStartStateTextBox4.Enabled = (disabled.Length >= 4 && !disabled[3]); + wmStartStateTextBox5.Enabled = (disabled.Length >= 5 && !disabled[4]); + wmStartStateTextBox6.Enabled = (disabled.Length >= 6 && !disabled[5]); + } + } + + void Localize() + { + Text = Strings.Water_Meter_States; + + groupBox1.Text = Strings.Water_Meter + " 1"; + groupBox2.Text = Strings.Water_Meter + " 2"; + groupBox3.Text = Strings.Water_Meter + " 3"; + groupBox4.Text = Strings.Water_Meter + " 4"; + groupBox5.Text = Strings.Water_Meter + " 5"; + groupBox6.Text = Strings.Water_Meter + " 6"; + + wmStateLabel1.Text = Strings.WMState; + wmStateLabel2.Text = Strings.WMState; + wmStateLabel3.Text = Strings.WMState; + wmStateLabel4.Text = Strings.WMState; + wmStateLabel5.Text = Strings.WMState; + wmStateLabel6.Text = Strings.WMState; + + startLabel.Text = Strings.Start; + endLabel.Text = Strings.End; + okButton.Text = Strings.OkBtnText; + } + + private void okButton_Click(object sender, EventArgs eArgs) + { + log.Debug("okButton_Click(..)"); + + try + { + if (endStates) + { + if (wmEndStateTextBox1.Enabled && WaterMetersCount >= 1) WMEndState[0] = Utils.ParseUDouble(wmEndStateTextBox1.Text); + if (wmEndStateTextBox2.Enabled && WaterMetersCount >= 2) WMEndState[1] = Utils.ParseUDouble(wmEndStateTextBox2.Text); + if (wmEndStateTextBox3.Enabled && WaterMetersCount >= 3) WMEndState[2] = Utils.ParseUDouble(wmEndStateTextBox3.Text); + if (wmEndStateTextBox4.Enabled && WaterMetersCount >= 4) WMEndState[3] = Utils.ParseUDouble(wmEndStateTextBox4.Text); + if (wmEndStateTextBox5.Enabled && WaterMetersCount >= 5) WMEndState[4] = Utils.ParseUDouble(wmEndStateTextBox5.Text); + if (wmEndStateTextBox6.Enabled && WaterMetersCount >= 6) WMEndState[5] = Utils.ParseUDouble(wmEndStateTextBox6.Text); + } + else + { + if (wmStartStateTextBox1.Enabled && WaterMetersCount >= 1) { WMStartStateStr[0] = wmStartStateTextBox1.Text; WMStartState[0] = Utils.ParseUDouble(wmStartStateTextBox1.Text); } + if (wmStartStateTextBox2.Enabled && WaterMetersCount >= 2) { WMStartStateStr[1] = wmStartStateTextBox2.Text; WMStartState[1] = Utils.ParseUDouble(wmStartStateTextBox2.Text); } + if (wmStartStateTextBox3.Enabled && WaterMetersCount >= 3) { WMStartStateStr[2] = wmStartStateTextBox3.Text; WMStartState[2] = Utils.ParseUDouble(wmStartStateTextBox3.Text); } + if (wmStartStateTextBox4.Enabled && WaterMetersCount >= 4) { WMStartStateStr[3] = wmStartStateTextBox4.Text; WMStartState[3] = Utils.ParseUDouble(wmStartStateTextBox4.Text); } + if (wmStartStateTextBox5.Enabled && WaterMetersCount >= 5) { WMStartStateStr[4] = wmStartStateTextBox5.Text; WMStartState[4] = Utils.ParseUDouble(wmStartStateTextBox5.Text); } + if (wmStartStateTextBox6.Enabled && WaterMetersCount >= 6) { WMStartStateStr[5] = wmStartStateTextBox6.Text; WMStartState[5] = Utils.ParseUDouble(wmStartStateTextBox6.Text); } + } + } + catch (Exception e) + { + log.ErrorFormat("Exception: {0}", e.Message); + return; + } + + completed = true; + 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) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + + private void wmEndStateTextBox1_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(wmEndStateTextBox1.Text); + double startState = Utils.ParseUDouble(wmStartStateTextBox1.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { }; + + exclamation1.Visible = (err < warningLimLo) || (warningLimHi < err); + } + + private void wmEndStateTextBox2_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(wmEndStateTextBox2.Text); + double startState = Utils.ParseUDouble(wmStartStateTextBox2.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + + exclamation2.Visible = (err < warningLimLo) || (warningLimHi < err); + } + + private void wmEndStateTextBox3_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(wmEndStateTextBox3.Text); + double startState = Utils.ParseUDouble(wmStartStateTextBox3.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + + exclamation3.Visible = (err < warningLimLo) || (warningLimHi < err); + } + + private void wmEndStateTextBox4_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(wmEndStateTextBox4.Text); + double startState = Utils.ParseUDouble(wmStartStateTextBox4.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + + exclamation4.Visible = (err < warningLimLo) || (warningLimHi < err); + } + + private void wmEndStateTextBox5_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(wmEndStateTextBox5.Text); + double startState = Utils.ParseUDouble(wmStartStateTextBox5.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + + exclamation5.Visible = (err < warningLimLo) || (warningLimHi < err); + } + + private void wmEndStateTextBox6_TextChanged(object sender, EventArgs e) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(wmEndStateTextBox6.Text); + double startState = Utils.ParseUDouble(wmStartStateTextBox6.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + + exclamation6.Visible = (err < warningLimLo) || (warningLimHi < err); + } + + private void wmStartStateTextBox1_KeyPress(object sender, KeyPressEventArgs e) + { + if (e.KeyChar == '\r') + { + if (wmStartStateTextBox2.Enabled) wmStartStateTextBox2.Focus(); + else if (wmStartStateTextBox3.Enabled) wmStartStateTextBox3.Focus(); + else if (wmStartStateTextBox4.Enabled) wmStartStateTextBox4.Focus(); + else if (wmStartStateTextBox5.Enabled) wmStartStateTextBox5.Focus(); + else if (wmStartStateTextBox6.Enabled) wmStartStateTextBox6.Focus(); + } + else if (e.KeyChar == '+') okButton_Click(sender, e); + } + + private void wmStartStateTextBox2_KeyPress(object sender, KeyPressEventArgs e) + { + if (e.KeyChar == '\r') + { + if (wmStartStateTextBox3.Enabled) wmStartStateTextBox3.Focus(); + else if (wmStartStateTextBox4.Enabled) wmStartStateTextBox4.Focus(); + else if (wmStartStateTextBox5.Enabled) wmStartStateTextBox5.Focus(); + else if (wmStartStateTextBox6.Enabled) wmStartStateTextBox6.Focus(); + else if (wmStartStateTextBox1.Enabled) wmStartStateTextBox1.Focus(); + } + else if (e.KeyChar == '+') okButton_Click(sender, e); + } + + private void wmStartStateTextBox3_KeyPress(object sender, KeyPressEventArgs e) + { + if (e.KeyChar == '\r') + { + if (wmStartStateTextBox4.Enabled) wmStartStateTextBox4.Focus(); + else if (wmStartStateTextBox5.Enabled) wmStartStateTextBox5.Focus(); + else if (wmStartStateTextBox6.Enabled) wmStartStateTextBox6.Focus(); + else if (wmStartStateTextBox1.Enabled) wmStartStateTextBox1.Focus(); + else if (wmStartStateTextBox2.Enabled) wmStartStateTextBox2.Focus(); + } + else if (e.KeyChar == '+') okButton_Click(sender, e); + } + + private void wmStartStateTextBox4_KeyPress(object sender, KeyPressEventArgs e) + { + if (e.KeyChar == '\r') + { + if (wmStartStateTextBox5.Enabled) wmStartStateTextBox5.Focus(); + else if (wmStartStateTextBox6.Enabled) wmStartStateTextBox6.Focus(); + else if (wmStartStateTextBox1.Enabled) wmStartStateTextBox1.Focus(); + else if (wmStartStateTextBox2.Enabled) wmStartStateTextBox2.Focus(); + else if (wmStartStateTextBox3.Enabled) wmStartStateTextBox3.Focus(); + } + else if (e.KeyChar == '+') okButton_Click(sender, e); + } + + private void wmStartStateTextBox5_KeyPress(object sender, KeyPressEventArgs e) + { + if (e.KeyChar == '\r') + { + if (wmStartStateTextBox6.Enabled) wmStartStateTextBox6.Focus(); + else if (wmStartStateTextBox1.Enabled) wmStartStateTextBox1.Focus(); + else if (wmStartStateTextBox2.Enabled) wmStartStateTextBox2.Focus(); + else if (wmStartStateTextBox3.Enabled) wmStartStateTextBox3.Focus(); + else if (wmStartStateTextBox4.Enabled) wmStartStateTextBox4.Focus(); + } + else if (e.KeyChar == '+') okButton_Click(sender, e); + } + + private void wmStartStateTextBox6_KeyPress(object sender, KeyPressEventArgs e) + { + if (e.KeyChar == '\r') + { + if (wmStartStateTextBox1.Enabled) wmStartStateTextBox1.Focus(); + else if (wmStartStateTextBox2.Enabled) wmStartStateTextBox2.Focus(); + else if (wmStartStateTextBox3.Enabled) wmStartStateTextBox3.Focus(); + else if (wmStartStateTextBox4.Enabled) wmStartStateTextBox4.Focus(); + else if (wmStartStateTextBox5.Enabled) wmStartStateTextBox5.Focus(); + } + else if (e.KeyChar == '+') okButton_Click(sender, e); + } + + private void wmEndStateTextBox1_KeyPress(object sender, KeyPressEventArgs e) + { + if (e.KeyChar == '\r') + { + if (wmEndStateTextBox2.Enabled) wmEndStateTextBox2.Focus(); + else if (wmEndStateTextBox3.Enabled) wmEndStateTextBox3.Focus(); + else if (wmEndStateTextBox4.Enabled) wmEndStateTextBox4.Focus(); + else if (wmEndStateTextBox5.Enabled) wmEndStateTextBox5.Focus(); + else if (wmEndStateTextBox6.Enabled) wmEndStateTextBox6.Focus(); + } + else if (e.KeyChar == '+') okButton_Click(sender, e); + } + + private void wmEndStateTextBox2_KeyPress(object sender, KeyPressEventArgs e) + { + if (e.KeyChar == '\r') + { + if (wmEndStateTextBox3.Enabled) wmEndStateTextBox3.Focus(); + else if (wmEndStateTextBox4.Enabled) wmEndStateTextBox4.Focus(); + else if (wmEndStateTextBox5.Enabled) wmEndStateTextBox5.Focus(); + else if (wmEndStateTextBox6.Enabled) wmEndStateTextBox6.Focus(); + else if (wmEndStateTextBox1.Enabled) wmEndStateTextBox1.Focus(); + } + else if (e.KeyChar == '+') okButton_Click(sender, e); + } + + private void wmEndStateTextBox3_KeyPress(object sender, KeyPressEventArgs e) + { + if (e.KeyChar == '\r') + { + if (wmEndStateTextBox4.Enabled) wmEndStateTextBox4.Focus(); + else if (wmEndStateTextBox5.Enabled) wmEndStateTextBox5.Focus(); + else if (wmEndStateTextBox6.Enabled) wmEndStateTextBox6.Focus(); + else if (wmEndStateTextBox1.Enabled) wmEndStateTextBox1.Focus(); + else if (wmEndStateTextBox2.Enabled) wmEndStateTextBox2.Focus(); + } + else if (e.KeyChar == '+') okButton_Click(sender, e); + } + + private void wmEndStateTextBox4_KeyPress(object sender, KeyPressEventArgs e) + { + if (e.KeyChar == '\r') + { + if (wmEndStateTextBox5.Enabled) wmEndStateTextBox5.Focus(); + else if (wmEndStateTextBox6.Enabled) wmEndStateTextBox6.Focus(); + else if (wmEndStateTextBox1.Enabled) wmEndStateTextBox1.Focus(); + else if (wmEndStateTextBox2.Enabled) wmEndStateTextBox2.Focus(); + else if (wmEndStateTextBox3.Enabled) wmEndStateTextBox3.Focus(); + } + else if (e.KeyChar == '+') okButton_Click(sender, e); + } + + private void wmEndStateTextBox5_KeyPress(object sender, KeyPressEventArgs e) + { + if (e.KeyChar == '\r') + { + if (wmEndStateTextBox6.Enabled) wmEndStateTextBox6.Focus(); + else if (wmEndStateTextBox1.Enabled) wmEndStateTextBox1.Focus(); + else if (wmEndStateTextBox2.Enabled) wmEndStateTextBox2.Focus(); + else if (wmEndStateTextBox3.Enabled) wmEndStateTextBox3.Focus(); + else if (wmEndStateTextBox4.Enabled) wmEndStateTextBox4.Focus(); + } + else if (e.KeyChar == '+') okButton_Click(sender, e); + } + + private void wmEndStateTextBox6_KeyPress(object sender, KeyPressEventArgs e) + { + if (e.KeyChar == '\r') + { + if (wmEndStateTextBox1.Enabled) wmEndStateTextBox1.Focus(); + else if (wmEndStateTextBox2.Enabled) wmEndStateTextBox2.Focus(); + else if (wmEndStateTextBox3.Enabled) wmEndStateTextBox3.Focus(); + else if (wmEndStateTextBox4.Enabled) wmEndStateTextBox4.Focus(); + else if (wmEndStateTextBox5.Enabled) wmEndStateTextBox5.Focus(); + } + else if (e.KeyChar == '+') okButton_Click(sender, e); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/TestStartEndForm.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/TestStartEndForm.designer.cs new file mode 100644 index 00000000..464d0ab5 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/TestStartEndForm.designer.cs @@ -0,0 +1,512 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.Standard6 +{ + partial class TestStartEndForm + { + /// + /// 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() + { + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.exclamation2 = new System.Windows.Forms.Label(); + this.wmStartStateTextBox2 = new System.Windows.Forms.TextBox(); + this.wmEndStateTextBox2 = new System.Windows.Forms.TextBox(); + this.wmStateLabel2 = new System.Windows.Forms.Label(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.exclamation1 = new System.Windows.Forms.Label(); + this.wmStartStateTextBox1 = new System.Windows.Forms.TextBox(); + this.wmEndStateTextBox1 = new System.Windows.Forms.TextBox(); + this.wmStateLabel1 = new System.Windows.Forms.Label(); + this.okButton = new System.Windows.Forms.Button(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.exclamation3 = new System.Windows.Forms.Label(); + this.wmStartStateTextBox3 = new System.Windows.Forms.TextBox(); + this.wmEndStateTextBox3 = new System.Windows.Forms.TextBox(); + this.wmStateLabel3 = new System.Windows.Forms.Label(); + this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.exclamation4 = new System.Windows.Forms.Label(); + this.wmStartStateTextBox4 = new System.Windows.Forms.TextBox(); + this.wmEndStateTextBox4 = new System.Windows.Forms.TextBox(); + this.wmStateLabel4 = new System.Windows.Forms.Label(); + this.groupBox5 = new System.Windows.Forms.GroupBox(); + this.exclamation5 = new System.Windows.Forms.Label(); + this.wmStartStateTextBox5 = new System.Windows.Forms.TextBox(); + this.wmEndStateTextBox5 = new System.Windows.Forms.TextBox(); + this.wmStateLabel5 = new System.Windows.Forms.Label(); + this.groupBox6 = new System.Windows.Forms.GroupBox(); + this.exclamation6 = new System.Windows.Forms.Label(); + this.wmStartStateTextBox6 = new System.Windows.Forms.TextBox(); + this.wmEndStateTextBox6 = new System.Windows.Forms.TextBox(); + this.wmStateLabel6 = new System.Windows.Forms.Label(); + this.startLabel = new System.Windows.Forms.Label(); + this.endLabel = new System.Windows.Forms.Label(); + this.groupBox2.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.groupBox4.SuspendLayout(); + this.groupBox5.SuspendLayout(); + this.groupBox6.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.exclamation2); + this.groupBox2.Controls.Add(this.wmStartStateTextBox2); + this.groupBox2.Controls.Add(this.wmEndStateTextBox2); + this.groupBox2.Controls.Add(this.wmStateLabel2); + this.groupBox2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox2.ForeColor = System.Drawing.Color.Black; + this.groupBox2.Location = new System.Drawing.Point(25, 122); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(547, 81); + this.groupBox2.TabIndex = 2; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Water Meter 2"; + // + // exclamation2 + // + this.exclamation2.AutoSize = true; + this.exclamation2.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation2.ForeColor = System.Drawing.Color.Red; + this.exclamation2.Location = new System.Drawing.Point(515, 27); + this.exclamation2.Name = "exclamation2"; + this.exclamation2.Size = new System.Drawing.Size(30, 38); + this.exclamation2.TabIndex = 4; + this.exclamation2.Text = "!"; + this.exclamation2.Visible = false; + // + // wmStartStateTextBox2 + // + this.wmStartStateTextBox2.Enabled = false; + this.wmStartStateTextBox2.Location = new System.Drawing.Point(164, 31); + this.wmStartStateTextBox2.Name = "wmStartStateTextBox2"; + this.wmStartStateTextBox2.Size = new System.Drawing.Size(163, 31); + this.wmStartStateTextBox2.TabIndex = 3; + this.wmStartStateTextBox2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.wmStartStateTextBox2_KeyPress); + // + // wmEndStateTextBox2 + // + this.wmEndStateTextBox2.Enabled = false; + this.wmEndStateTextBox2.Location = new System.Drawing.Point(350, 31); + this.wmEndStateTextBox2.Name = "wmEndStateTextBox2"; + this.wmEndStateTextBox2.Size = new System.Drawing.Size(163, 31); + this.wmEndStateTextBox2.TabIndex = 1; + this.wmEndStateTextBox2.TextChanged += new System.EventHandler(this.wmEndStateTextBox2_TextChanged); + this.wmEndStateTextBox2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.wmEndStateTextBox2_KeyPress); + // + // wmStateLabel2 + // + this.wmStateLabel2.AutoSize = true; + this.wmStateLabel2.Location = new System.Drawing.Point(18, 34); + this.wmStateLabel2.Name = "wmStateLabel2"; + this.wmStateLabel2.Size = new System.Drawing.Size(68, 23); + this.wmStateLabel2.TabIndex = 0; + this.wmStateLabel2.Text = "State:"; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.exclamation1); + this.groupBox1.Controls.Add(this.wmStartStateTextBox1); + this.groupBox1.Controls.Add(this.wmEndStateTextBox1); + this.groupBox1.Controls.Add(this.wmStateLabel1); + this.groupBox1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox1.ForeColor = System.Drawing.Color.Black; + this.groupBox1.Location = new System.Drawing.Point(25, 32); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(547, 81); + this.groupBox1.TabIndex = 1; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Water Meter 1"; + // + // exclamation1 + // + this.exclamation1.AutoSize = true; + this.exclamation1.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation1.ForeColor = System.Drawing.Color.Red; + this.exclamation1.Location = new System.Drawing.Point(515, 27); + this.exclamation1.Name = "exclamation1"; + this.exclamation1.Size = new System.Drawing.Size(30, 38); + this.exclamation1.TabIndex = 3; + this.exclamation1.Text = "!"; + this.exclamation1.Visible = false; + // + // wmStartStateTextBox1 + // + this.wmStartStateTextBox1.Enabled = false; + this.wmStartStateTextBox1.Location = new System.Drawing.Point(164, 31); + this.wmStartStateTextBox1.Name = "wmStartStateTextBox1"; + this.wmStartStateTextBox1.Size = new System.Drawing.Size(163, 31); + this.wmStartStateTextBox1.TabIndex = 2; + this.wmStartStateTextBox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.wmStartStateTextBox1_KeyPress); + // + // wmEndStateTextBox1 + // + this.wmEndStateTextBox1.Enabled = false; + this.wmEndStateTextBox1.Location = new System.Drawing.Point(350, 31); + this.wmEndStateTextBox1.Name = "wmEndStateTextBox1"; + this.wmEndStateTextBox1.Size = new System.Drawing.Size(163, 31); + this.wmEndStateTextBox1.TabIndex = 1; + this.wmEndStateTextBox1.TextChanged += new System.EventHandler(this.wmEndStateTextBox1_TextChanged); + this.wmEndStateTextBox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.wmEndStateTextBox1_KeyPress); + // + // wmStateLabel1 + // + this.wmStateLabel1.AutoSize = true; + this.wmStateLabel1.Location = new System.Drawing.Point(18, 34); + this.wmStateLabel1.Name = "wmStateLabel1"; + this.wmStateLabel1.Size = new System.Drawing.Size(68, 23); + this.wmStateLabel1.TabIndex = 0; + this.wmStateLabel1.Text = "State:"; + // + // okButton + // + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(603, 46); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(98, 63); + this.okButton.TabIndex = 7; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.exclamation3); + this.groupBox3.Controls.Add(this.wmStartStateTextBox3); + this.groupBox3.Controls.Add(this.wmEndStateTextBox3); + this.groupBox3.Controls.Add(this.wmStateLabel3); + this.groupBox3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox3.ForeColor = System.Drawing.Color.Black; + this.groupBox3.Location = new System.Drawing.Point(25, 212); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(547, 81); + this.groupBox3.TabIndex = 3; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "Water Meter 3"; + // + // exclamation3 + // + this.exclamation3.AutoSize = true; + this.exclamation3.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation3.ForeColor = System.Drawing.Color.Red; + this.exclamation3.Location = new System.Drawing.Point(515, 27); + this.exclamation3.Name = "exclamation3"; + this.exclamation3.Size = new System.Drawing.Size(30, 38); + this.exclamation3.TabIndex = 5; + this.exclamation3.Text = "!"; + this.exclamation3.Visible = false; + // + // wmStartStateTextBox3 + // + this.wmStartStateTextBox3.Enabled = false; + this.wmStartStateTextBox3.Location = new System.Drawing.Point(164, 31); + this.wmStartStateTextBox3.Name = "wmStartStateTextBox3"; + this.wmStartStateTextBox3.Size = new System.Drawing.Size(163, 31); + this.wmStartStateTextBox3.TabIndex = 4; + this.wmStartStateTextBox3.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.wmStartStateTextBox3_KeyPress); + // + // wmEndStateTextBox3 + // + this.wmEndStateTextBox3.Enabled = false; + this.wmEndStateTextBox3.Location = new System.Drawing.Point(350, 31); + this.wmEndStateTextBox3.Name = "wmEndStateTextBox3"; + this.wmEndStateTextBox3.Size = new System.Drawing.Size(163, 31); + this.wmEndStateTextBox3.TabIndex = 1; + this.wmEndStateTextBox3.TextChanged += new System.EventHandler(this.wmEndStateTextBox3_TextChanged); + this.wmEndStateTextBox3.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.wmEndStateTextBox3_KeyPress); + // + // wmStateLabel3 + // + this.wmStateLabel3.AutoSize = true; + this.wmStateLabel3.Location = new System.Drawing.Point(18, 34); + this.wmStateLabel3.Name = "wmStateLabel3"; + this.wmStateLabel3.Size = new System.Drawing.Size(68, 23); + this.wmStateLabel3.TabIndex = 0; + this.wmStateLabel3.Text = "State:"; + // + // groupBox4 + // + this.groupBox4.Controls.Add(this.exclamation4); + this.groupBox4.Controls.Add(this.wmStartStateTextBox4); + this.groupBox4.Controls.Add(this.wmEndStateTextBox4); + this.groupBox4.Controls.Add(this.wmStateLabel4); + this.groupBox4.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox4.ForeColor = System.Drawing.Color.Black; + this.groupBox4.Location = new System.Drawing.Point(25, 302); + this.groupBox4.Name = "groupBox4"; + this.groupBox4.Size = new System.Drawing.Size(547, 81); + this.groupBox4.TabIndex = 4; + this.groupBox4.TabStop = false; + this.groupBox4.Text = "Water Meter 4"; + // + // exclamation4 + // + this.exclamation4.AutoSize = true; + this.exclamation4.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation4.ForeColor = System.Drawing.Color.Red; + this.exclamation4.Location = new System.Drawing.Point(515, 27); + this.exclamation4.Name = "exclamation4"; + this.exclamation4.Size = new System.Drawing.Size(30, 38); + this.exclamation4.TabIndex = 5; + this.exclamation4.Text = "!"; + this.exclamation4.Visible = false; + // + // wmStartStateTextBox4 + // + this.wmStartStateTextBox4.Enabled = false; + this.wmStartStateTextBox4.Location = new System.Drawing.Point(164, 31); + this.wmStartStateTextBox4.Name = "wmStartStateTextBox4"; + this.wmStartStateTextBox4.Size = new System.Drawing.Size(163, 31); + this.wmStartStateTextBox4.TabIndex = 4; + this.wmStartStateTextBox4.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.wmStartStateTextBox4_KeyPress); + // + // wmEndStateTextBox4 + // + this.wmEndStateTextBox4.Enabled = false; + this.wmEndStateTextBox4.Location = new System.Drawing.Point(350, 31); + this.wmEndStateTextBox4.Name = "wmEndStateTextBox4"; + this.wmEndStateTextBox4.Size = new System.Drawing.Size(163, 31); + this.wmEndStateTextBox4.TabIndex = 1; + this.wmEndStateTextBox4.TextChanged += new System.EventHandler(this.wmEndStateTextBox4_TextChanged); + this.wmEndStateTextBox4.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.wmEndStateTextBox4_KeyPress); + // + // wmStateLabel4 + // + this.wmStateLabel4.AutoSize = true; + this.wmStateLabel4.Location = new System.Drawing.Point(18, 34); + this.wmStateLabel4.Name = "wmStateLabel4"; + this.wmStateLabel4.Size = new System.Drawing.Size(68, 23); + this.wmStateLabel4.TabIndex = 0; + this.wmStateLabel4.Text = "State:"; + // + // groupBox5 + // + this.groupBox5.Controls.Add(this.exclamation5); + this.groupBox5.Controls.Add(this.wmStartStateTextBox5); + this.groupBox5.Controls.Add(this.wmEndStateTextBox5); + this.groupBox5.Controls.Add(this.wmStateLabel5); + this.groupBox5.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox5.ForeColor = System.Drawing.Color.Black; + this.groupBox5.Location = new System.Drawing.Point(25, 392); + this.groupBox5.Name = "groupBox5"; + this.groupBox5.Size = new System.Drawing.Size(547, 81); + this.groupBox5.TabIndex = 5; + this.groupBox5.TabStop = false; + this.groupBox5.Text = "Water Meter 5"; + // + // exclamation5 + // + this.exclamation5.AutoSize = true; + this.exclamation5.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation5.ForeColor = System.Drawing.Color.Red; + this.exclamation5.Location = new System.Drawing.Point(515, 27); + this.exclamation5.Name = "exclamation5"; + this.exclamation5.Size = new System.Drawing.Size(30, 38); + this.exclamation5.TabIndex = 5; + this.exclamation5.Text = "!"; + this.exclamation5.Visible = false; + // + // wmStartStateTextBox5 + // + this.wmStartStateTextBox5.Enabled = false; + this.wmStartStateTextBox5.Location = new System.Drawing.Point(164, 31); + this.wmStartStateTextBox5.Name = "wmStartStateTextBox5"; + this.wmStartStateTextBox5.Size = new System.Drawing.Size(163, 31); + this.wmStartStateTextBox5.TabIndex = 4; + this.wmStartStateTextBox5.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.wmStartStateTextBox5_KeyPress); + // + // wmEndStateTextBox5 + // + this.wmEndStateTextBox5.Enabled = false; + this.wmEndStateTextBox5.Location = new System.Drawing.Point(350, 31); + this.wmEndStateTextBox5.Name = "wmEndStateTextBox5"; + this.wmEndStateTextBox5.Size = new System.Drawing.Size(163, 31); + this.wmEndStateTextBox5.TabIndex = 1; + this.wmEndStateTextBox5.TextChanged += new System.EventHandler(this.wmEndStateTextBox5_TextChanged); + this.wmEndStateTextBox5.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.wmEndStateTextBox5_KeyPress); + // + // wmStateLabel5 + // + this.wmStateLabel5.AutoSize = true; + this.wmStateLabel5.Location = new System.Drawing.Point(18, 34); + this.wmStateLabel5.Name = "wmStateLabel5"; + this.wmStateLabel5.Size = new System.Drawing.Size(68, 23); + this.wmStateLabel5.TabIndex = 0; + this.wmStateLabel5.Text = "State:"; + // + // groupBox6 + // + this.groupBox6.Controls.Add(this.exclamation6); + this.groupBox6.Controls.Add(this.wmStartStateTextBox6); + this.groupBox6.Controls.Add(this.wmEndStateTextBox6); + this.groupBox6.Controls.Add(this.wmStateLabel6); + this.groupBox6.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox6.ForeColor = System.Drawing.Color.Black; + this.groupBox6.Location = new System.Drawing.Point(25, 482); + this.groupBox6.Name = "groupBox6"; + this.groupBox6.Size = new System.Drawing.Size(547, 81); + this.groupBox6.TabIndex = 6; + this.groupBox6.TabStop = false; + this.groupBox6.Text = "Water Meter 6"; + // + // exclamation6 + // + this.exclamation6.AutoSize = true; + this.exclamation6.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation6.ForeColor = System.Drawing.Color.Red; + this.exclamation6.Location = new System.Drawing.Point(515, 27); + this.exclamation6.Name = "exclamation6"; + this.exclamation6.Size = new System.Drawing.Size(30, 38); + this.exclamation6.TabIndex = 5; + this.exclamation6.Text = "!"; + this.exclamation6.Visible = false; + // + // wmStartStateTextBox6 + // + this.wmStartStateTextBox6.Enabled = false; + this.wmStartStateTextBox6.Location = new System.Drawing.Point(164, 31); + this.wmStartStateTextBox6.Name = "wmStartStateTextBox6"; + this.wmStartStateTextBox6.Size = new System.Drawing.Size(163, 31); + this.wmStartStateTextBox6.TabIndex = 4; + this.wmStartStateTextBox6.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.wmStartStateTextBox6_KeyPress); + // + // wmEndStateTextBox6 + // + this.wmEndStateTextBox6.Enabled = false; + this.wmEndStateTextBox6.Location = new System.Drawing.Point(350, 31); + this.wmEndStateTextBox6.Name = "wmEndStateTextBox6"; + this.wmEndStateTextBox6.Size = new System.Drawing.Size(163, 31); + this.wmEndStateTextBox6.TabIndex = 1; + this.wmEndStateTextBox6.TextChanged += new System.EventHandler(this.wmEndStateTextBox6_TextChanged); + this.wmEndStateTextBox6.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.wmEndStateTextBox6_KeyPress); + // + // wmStateLabel6 + // + this.wmStateLabel6.AutoSize = true; + this.wmStateLabel6.Location = new System.Drawing.Point(18, 34); + this.wmStateLabel6.Name = "wmStateLabel6"; + this.wmStateLabel6.Size = new System.Drawing.Size(68, 23); + this.wmStateLabel6.TabIndex = 0; + this.wmStateLabel6.Text = "State:"; + // + // startLabel + // + this.startLabel.AutoSize = true; + this.startLabel.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startLabel.Location = new System.Drawing.Point(245, 11); + this.startLabel.Name = "startLabel"; + this.startLabel.Size = new System.Drawing.Size(56, 23); + this.startLabel.TabIndex = 8; + this.startLabel.Text = "Start"; + // + // endLabel + // + this.endLabel.AutoSize = true; + this.endLabel.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endLabel.Location = new System.Drawing.Point(431, 11); + this.endLabel.Name = "endLabel"; + this.endLabel.Size = new System.Drawing.Size(46, 23); + this.endLabel.TabIndex = 9; + this.endLabel.Text = "End"; + // + // TestStartEndForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.ClientSize = new System.Drawing.Size(729, 586); + this.Controls.Add(this.endLabel); + this.Controls.Add(this.startLabel); + this.Controls.Add(this.groupBox6); + this.Controls.Add(this.groupBox5); + this.Controls.Add(this.groupBox4); + this.Controls.Add(this.groupBox3); + this.Controls.Add(this.okButton); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.groupBox1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "TestStartEndForm"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "End States"; + this.TopMost = true; + this.Load += new System.EventHandler(this.CycleEndForm_Load); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.groupBox4.ResumeLayout(false); + this.groupBox4.PerformLayout(); + this.groupBox5.ResumeLayout(false); + this.groupBox5.PerformLayout(); + this.groupBox6.ResumeLayout(false); + this.groupBox6.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TextBox wmEndStateTextBox2; + private System.Windows.Forms.Label wmStateLabel2; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TextBox wmEndStateTextBox1; + private System.Windows.Forms.Label wmStateLabel1; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.TextBox wmEndStateTextBox3; + private System.Windows.Forms.Label wmStateLabel3; + private System.Windows.Forms.GroupBox groupBox4; + private System.Windows.Forms.TextBox wmEndStateTextBox4; + private System.Windows.Forms.Label wmStateLabel4; + private System.Windows.Forms.GroupBox groupBox5; + private System.Windows.Forms.TextBox wmEndStateTextBox5; + private System.Windows.Forms.Label wmStateLabel5; + private System.Windows.Forms.GroupBox groupBox6; + private System.Windows.Forms.TextBox wmEndStateTextBox6; + private System.Windows.Forms.Label wmStateLabel6; + private System.Windows.Forms.TextBox wmStartStateTextBox2; + private System.Windows.Forms.TextBox wmStartStateTextBox1; + private System.Windows.Forms.TextBox wmStartStateTextBox3; + private System.Windows.Forms.TextBox wmStartStateTextBox4; + private System.Windows.Forms.TextBox wmStartStateTextBox5; + private System.Windows.Forms.TextBox wmStartStateTextBox6; + private System.Windows.Forms.Label startLabel; + private System.Windows.Forms.Label endLabel; + private System.Windows.Forms.Label exclamation2; + private System.Windows.Forms.Label exclamation1; + private System.Windows.Forms.Label exclamation3; + private System.Windows.Forms.Label exclamation4; + private System.Windows.Forms.Label exclamation5; + private System.Windows.Forms.Label exclamation6; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/TestStartEndForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/TestStartEndForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/Standard6/TestStartEndForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/CycleBeginningForm.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/CycleBeginningForm.Designer.cs new file mode 100644 index 00000000..219fc354 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/CycleBeginningForm.Designer.cs @@ -0,0 +1,794 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.StandardCamera +{ + partial class CycleBeginningForm + { + /// + /// 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(CycleBeginningForm)); + this.okButton = new System.Windows.Forms.Button(); + this.orderGroupBox = new System.Windows.Forms.GroupBox(); + this.orderComboBox = new System.Windows.Forms.ComboBox(); + this.clearButton = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.checkBox1 = new System.Windows.Forms.CheckBox(); + this.checkBox2 = new System.Windows.Forms.CheckBox(); + this.comboBox2 = new System.Windows.Forms.ComboBox(); + this.label2 = new System.Windows.Forms.Label(); + this.checkBox3 = new System.Windows.Forms.CheckBox(); + this.comboBox3 = new System.Windows.Forms.ComboBox(); + this.label3 = new System.Windows.Forms.Label(); + this.checkBox4 = new System.Windows.Forms.CheckBox(); + this.comboBox4 = new System.Windows.Forms.ComboBox(); + this.label4 = new System.Windows.Forms.Label(); + this.checkBox5 = new System.Windows.Forms.CheckBox(); + this.comboBox5 = new System.Windows.Forms.ComboBox(); + this.label5 = new System.Windows.Forms.Label(); + this.checkBox6 = new System.Windows.Forms.CheckBox(); + this.comboBox6 = new System.Windows.Forms.ComboBox(); + this.label6 = new System.Windows.Forms.Label(); + this.checkBox7 = new System.Windows.Forms.CheckBox(); + this.comboBox7 = new System.Windows.Forms.ComboBox(); + this.label7 = new System.Windows.Forms.Label(); + this.checkBox8 = new System.Windows.Forms.CheckBox(); + this.comboBox8 = new System.Windows.Forms.ComboBox(); + this.label8 = new System.Windows.Forms.Label(); + this.checkBox9 = new System.Windows.Forms.CheckBox(); + this.comboBox9 = new System.Windows.Forms.ComboBox(); + this.label9 = new System.Windows.Forms.Label(); + this.checkBox10 = new System.Windows.Forms.CheckBox(); + this.comboBox10 = new System.Windows.Forms.ComboBox(); + this.label10 = new System.Windows.Forms.Label(); + this.checkBox11 = new System.Windows.Forms.CheckBox(); + this.comboBox11 = new System.Windows.Forms.ComboBox(); + this.label11 = new System.Windows.Forms.Label(); + this.checkBox12 = new System.Windows.Forms.CheckBox(); + this.comboBox12 = new System.Windows.Forms.ComboBox(); + this.label12 = new System.Windows.Forms.Label(); + this.checkBox13 = new System.Windows.Forms.CheckBox(); + this.comboBox13 = new System.Windows.Forms.ComboBox(); + this.label13 = new System.Windows.Forms.Label(); + this.checkBox14 = new System.Windows.Forms.CheckBox(); + this.comboBox14 = new System.Windows.Forms.ComboBox(); + this.label14 = new System.Windows.Forms.Label(); + this.checkBox15 = new System.Windows.Forms.CheckBox(); + this.comboBox15 = new System.Windows.Forms.ComboBox(); + this.label15 = new System.Windows.Forms.Label(); + this.checkBox16 = new System.Windows.Forms.CheckBox(); + this.comboBox16 = new System.Windows.Forms.ComboBox(); + this.label16 = new System.Windows.Forms.Label(); + this.checkBox17 = new System.Windows.Forms.CheckBox(); + this.comboBox17 = new System.Windows.Forms.ComboBox(); + this.label17 = new System.Windows.Forms.Label(); + this.checkBox18 = new System.Windows.Forms.CheckBox(); + this.comboBox18 = new System.Windows.Forms.ComboBox(); + this.label18 = new System.Windows.Forms.Label(); + this.checkBox19 = new System.Windows.Forms.CheckBox(); + this.comboBox19 = new System.Windows.Forms.ComboBox(); + this.label19 = new System.Windows.Forms.Label(); + this.checkBox20 = new System.Windows.Forms.CheckBox(); + this.comboBox20 = new System.Windows.Forms.ComboBox(); + this.label20 = new System.Windows.Forms.Label(); + this.checkBox21 = new System.Windows.Forms.CheckBox(); + this.comboBox21 = new System.Windows.Forms.ComboBox(); + this.label21 = new System.Windows.Forms.Label(); + this.checkBox22 = new System.Windows.Forms.CheckBox(); + this.comboBox22 = new System.Windows.Forms.ComboBox(); + this.label22 = new System.Windows.Forms.Label(); + this.checkBox23 = new System.Windows.Forms.CheckBox(); + this.comboBox23 = new System.Windows.Forms.ComboBox(); + this.label23 = new System.Windows.Forms.Label(); + this.checkBox24 = new System.Windows.Forms.CheckBox(); + this.comboBox24 = new System.Windows.Forms.ComboBox(); + this.label24 = new System.Windows.Forms.Label(); + this.orderGroupBox.SuspendLayout(); + this.SuspendLayout(); + // + // okButton + // + resources.ApplyResources(this.okButton, "okButton"); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Name = "okButton"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // orderGroupBox + // + this.orderGroupBox.Controls.Add(this.orderComboBox); + resources.ApplyResources(this.orderGroupBox, "orderGroupBox"); + this.orderGroupBox.ForeColor = System.Drawing.Color.Black; + this.orderGroupBox.Name = "orderGroupBox"; + this.orderGroupBox.TabStop = false; + // + // orderComboBox + // + this.orderComboBox.FormattingEnabled = true; + resources.ApplyResources(this.orderComboBox, "orderComboBox"); + this.orderComboBox.Name = "orderComboBox"; + // + // clearButton + // + resources.ApplyResources(this.clearButton, "clearButton"); + this.clearButton.ForeColor = System.Drawing.Color.Black; + this.clearButton.Name = "clearButton"; + this.clearButton.UseVisualStyleBackColor = true; + this.clearButton.Click += new System.EventHandler(this.clearButton_Click); + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // comboBox1 + // + resources.ApplyResources(this.comboBox1, "comboBox1"); + this.comboBox1.FormattingEnabled = true; + this.comboBox1.Name = "comboBox1"; + this.comboBox1.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged); + this.comboBox1.TextChanged += new System.EventHandler(this.comboBox1_TextChanged); + this.comboBox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox1_KeyPress); + // + // checkBox1 + // + resources.ApplyResources(this.checkBox1, "checkBox1"); + this.checkBox1.Name = "checkBox1"; + this.checkBox1.UseVisualStyleBackColor = true; + // + // checkBox2 + // + resources.ApplyResources(this.checkBox2, "checkBox2"); + this.checkBox2.Name = "checkBox2"; + this.checkBox2.UseVisualStyleBackColor = true; + // + // comboBox2 + // + resources.ApplyResources(this.comboBox2, "comboBox2"); + this.comboBox2.FormattingEnabled = true; + this.comboBox2.Name = "comboBox2"; + this.comboBox2.SelectedIndexChanged += new System.EventHandler(this.comboBox2_SelectedIndexChanged); + this.comboBox2.TextChanged += new System.EventHandler(this.comboBox2_TextChanged); + this.comboBox2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox2_KeyPress); + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // checkBox3 + // + resources.ApplyResources(this.checkBox3, "checkBox3"); + this.checkBox3.Name = "checkBox3"; + this.checkBox3.UseVisualStyleBackColor = true; + // + // comboBox3 + // + resources.ApplyResources(this.comboBox3, "comboBox3"); + this.comboBox3.FormattingEnabled = true; + this.comboBox3.Name = "comboBox3"; + this.comboBox3.SelectedIndexChanged += new System.EventHandler(this.comboBox3_SelectedIndexChanged); + this.comboBox3.TextChanged += new System.EventHandler(this.comboBox3_TextChanged); + this.comboBox3.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox3_KeyPress); + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // + // checkBox4 + // + resources.ApplyResources(this.checkBox4, "checkBox4"); + this.checkBox4.Name = "checkBox4"; + this.checkBox4.UseVisualStyleBackColor = true; + // + // comboBox4 + // + resources.ApplyResources(this.comboBox4, "comboBox4"); + this.comboBox4.FormattingEnabled = true; + this.comboBox4.Name = "comboBox4"; + this.comboBox4.SelectedIndexChanged += new System.EventHandler(this.comboBox4_SelectedIndexChanged); + this.comboBox4.TextChanged += new System.EventHandler(this.comboBox4_TextChanged); + this.comboBox4.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox4_KeyPress); + // + // label4 + // + resources.ApplyResources(this.label4, "label4"); + this.label4.Name = "label4"; + // + // checkBox5 + // + resources.ApplyResources(this.checkBox5, "checkBox5"); + this.checkBox5.Name = "checkBox5"; + this.checkBox5.UseVisualStyleBackColor = true; + // + // comboBox5 + // + resources.ApplyResources(this.comboBox5, "comboBox5"); + this.comboBox5.FormattingEnabled = true; + this.comboBox5.Name = "comboBox5"; + this.comboBox5.SelectedIndexChanged += new System.EventHandler(this.comboBox5_SelectedIndexChanged); + this.comboBox5.TextChanged += new System.EventHandler(this.comboBox5_TextChanged); + this.comboBox5.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox5_KeyPress); + // + // label5 + // + resources.ApplyResources(this.label5, "label5"); + this.label5.Name = "label5"; + // + // checkBox6 + // + resources.ApplyResources(this.checkBox6, "checkBox6"); + this.checkBox6.Name = "checkBox6"; + this.checkBox6.UseVisualStyleBackColor = true; + // + // comboBox6 + // + resources.ApplyResources(this.comboBox6, "comboBox6"); + this.comboBox6.FormattingEnabled = true; + this.comboBox6.Name = "comboBox6"; + this.comboBox6.SelectedIndexChanged += new System.EventHandler(this.comboBox6_SelectedIndexChanged); + this.comboBox6.TextChanged += new System.EventHandler(this.comboBox6_TextChanged); + this.comboBox6.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox6_KeyPress); + // + // label6 + // + resources.ApplyResources(this.label6, "label6"); + this.label6.Name = "label6"; + // + // checkBox7 + // + resources.ApplyResources(this.checkBox7, "checkBox7"); + this.checkBox7.Name = "checkBox7"; + this.checkBox7.UseVisualStyleBackColor = true; + // + // comboBox7 + // + resources.ApplyResources(this.comboBox7, "comboBox7"); + this.comboBox7.FormattingEnabled = true; + this.comboBox7.Name = "comboBox7"; + this.comboBox7.SelectedIndexChanged += new System.EventHandler(this.comboBox7_SelectedIndexChanged); + this.comboBox7.TextChanged += new System.EventHandler(this.comboBox7_TextChanged); + this.comboBox7.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox7_KeyPress); + // + // label7 + // + resources.ApplyResources(this.label7, "label7"); + this.label7.Name = "label7"; + // + // checkBox8 + // + resources.ApplyResources(this.checkBox8, "checkBox8"); + this.checkBox8.Name = "checkBox8"; + this.checkBox8.UseVisualStyleBackColor = true; + // + // comboBox8 + // + resources.ApplyResources(this.comboBox8, "comboBox8"); + this.comboBox8.FormattingEnabled = true; + this.comboBox8.Name = "comboBox8"; + this.comboBox8.SelectedIndexChanged += new System.EventHandler(this.comboBox8_SelectedIndexChanged); + this.comboBox8.TextChanged += new System.EventHandler(this.comboBox8_TextChanged); + this.comboBox8.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox8_KeyPress); + // + // label8 + // + resources.ApplyResources(this.label8, "label8"); + this.label8.Name = "label8"; + // + // checkBox9 + // + resources.ApplyResources(this.checkBox9, "checkBox9"); + this.checkBox9.Name = "checkBox9"; + this.checkBox9.UseVisualStyleBackColor = true; + // + // comboBox9 + // + resources.ApplyResources(this.comboBox9, "comboBox9"); + this.comboBox9.FormattingEnabled = true; + this.comboBox9.Name = "comboBox9"; + this.comboBox9.SelectedIndexChanged += new System.EventHandler(this.comboBox9_SelectedIndexChanged); + this.comboBox9.TextChanged += new System.EventHandler(this.comboBox9_TextChanged); + this.comboBox9.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox9_KeyPress); + // + // label9 + // + resources.ApplyResources(this.label9, "label9"); + this.label9.Name = "label9"; + // + // checkBox10 + // + resources.ApplyResources(this.checkBox10, "checkBox10"); + this.checkBox10.Name = "checkBox10"; + this.checkBox10.UseVisualStyleBackColor = true; + // + // comboBox10 + // + resources.ApplyResources(this.comboBox10, "comboBox10"); + this.comboBox10.FormattingEnabled = true; + this.comboBox10.Name = "comboBox10"; + this.comboBox10.SelectedIndexChanged += new System.EventHandler(this.comboBox10_SelectedIndexChanged); + this.comboBox10.TextChanged += new System.EventHandler(this.comboBox10_TextChanged); + this.comboBox10.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox10_KeyPress); + // + // label10 + // + resources.ApplyResources(this.label10, "label10"); + this.label10.Name = "label10"; + // + // checkBox11 + // + resources.ApplyResources(this.checkBox11, "checkBox11"); + this.checkBox11.Name = "checkBox11"; + this.checkBox11.UseVisualStyleBackColor = true; + // + // comboBox11 + // + resources.ApplyResources(this.comboBox11, "comboBox11"); + this.comboBox11.FormattingEnabled = true; + this.comboBox11.Name = "comboBox11"; + this.comboBox11.SelectedIndexChanged += new System.EventHandler(this.comboBox11_SelectedIndexChanged); + this.comboBox11.TextChanged += new System.EventHandler(this.comboBox11_TextChanged); + this.comboBox11.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox11_KeyPress); + // + // label11 + // + resources.ApplyResources(this.label11, "label11"); + this.label11.Name = "label11"; + // + // checkBox12 + // + resources.ApplyResources(this.checkBox12, "checkBox12"); + this.checkBox12.Name = "checkBox12"; + this.checkBox12.UseVisualStyleBackColor = true; + // + // comboBox12 + // + resources.ApplyResources(this.comboBox12, "comboBox12"); + this.comboBox12.FormattingEnabled = true; + this.comboBox12.Name = "comboBox12"; + this.comboBox12.SelectedIndexChanged += new System.EventHandler(this.comboBox12_SelectedIndexChanged); + this.comboBox12.TextChanged += new System.EventHandler(this.comboBox12_TextChanged); + this.comboBox12.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox12_KeyPress); + // + // label12 + // + resources.ApplyResources(this.label12, "label12"); + this.label12.Name = "label12"; + // + // checkBox13 + // + resources.ApplyResources(this.checkBox13, "checkBox13"); + this.checkBox13.Name = "checkBox13"; + this.checkBox13.UseVisualStyleBackColor = true; + // + // comboBox13 + // + resources.ApplyResources(this.comboBox13, "comboBox13"); + this.comboBox13.FormattingEnabled = true; + this.comboBox13.Name = "comboBox13"; + this.comboBox13.SelectedIndexChanged += new System.EventHandler(this.comboBox13_SelectedIndexChanged); + this.comboBox13.TextChanged += new System.EventHandler(this.comboBox13_TextChanged); + this.comboBox13.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox13_KeyPress); + // + // label13 + // + resources.ApplyResources(this.label13, "label13"); + this.label13.Name = "label13"; + // + // checkBox14 + // + resources.ApplyResources(this.checkBox14, "checkBox14"); + this.checkBox14.Name = "checkBox14"; + this.checkBox14.UseVisualStyleBackColor = true; + // + // comboBox14 + // + resources.ApplyResources(this.comboBox14, "comboBox14"); + this.comboBox14.FormattingEnabled = true; + this.comboBox14.Name = "comboBox14"; + this.comboBox14.SelectedIndexChanged += new System.EventHandler(this.comboBox14_SelectedIndexChanged); + this.comboBox14.TextChanged += new System.EventHandler(this.comboBox14_TextChanged); + this.comboBox14.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox14_KeyPress); + // + // label14 + // + resources.ApplyResources(this.label14, "label14"); + this.label14.Name = "label14"; + // + // checkBox15 + // + resources.ApplyResources(this.checkBox15, "checkBox15"); + this.checkBox15.Name = "checkBox15"; + this.checkBox15.UseVisualStyleBackColor = true; + // + // comboBox15 + // + resources.ApplyResources(this.comboBox15, "comboBox15"); + this.comboBox15.FormattingEnabled = true; + this.comboBox15.Name = "comboBox15"; + this.comboBox15.SelectedIndexChanged += new System.EventHandler(this.comboBox15_SelectedIndexChanged); + this.comboBox15.TextChanged += new System.EventHandler(this.comboBox15_TextChanged); + this.comboBox15.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox15_KeyPress); + // + // label15 + // + resources.ApplyResources(this.label15, "label15"); + this.label15.Name = "label15"; + // + // checkBox16 + // + resources.ApplyResources(this.checkBox16, "checkBox16"); + this.checkBox16.Name = "checkBox16"; + this.checkBox16.UseVisualStyleBackColor = true; + // + // comboBox16 + // + resources.ApplyResources(this.comboBox16, "comboBox16"); + this.comboBox16.FormattingEnabled = true; + this.comboBox16.Name = "comboBox16"; + this.comboBox16.SelectedIndexChanged += new System.EventHandler(this.comboBox16_SelectedIndexChanged); + this.comboBox16.TextChanged += new System.EventHandler(this.comboBox16_TextChanged); + this.comboBox16.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox16_KeyPress); + // + // label16 + // + resources.ApplyResources(this.label16, "label16"); + this.label16.Name = "label16"; + // + // checkBox17 + // + resources.ApplyResources(this.checkBox17, "checkBox17"); + this.checkBox17.Name = "checkBox17"; + this.checkBox17.UseVisualStyleBackColor = true; + // + // comboBox17 + // + resources.ApplyResources(this.comboBox17, "comboBox17"); + this.comboBox17.FormattingEnabled = true; + this.comboBox17.Name = "comboBox17"; + this.comboBox17.SelectedIndexChanged += new System.EventHandler(this.comboBox17_SelectedIndexChanged); + this.comboBox17.TextChanged += new System.EventHandler(this.comboBox17_TextChanged); + this.comboBox17.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox17_KeyPress); + // + // label17 + // + resources.ApplyResources(this.label17, "label17"); + this.label17.Name = "label17"; + // + // checkBox18 + // + resources.ApplyResources(this.checkBox18, "checkBox18"); + this.checkBox18.Name = "checkBox18"; + this.checkBox18.UseVisualStyleBackColor = true; + // + // comboBox18 + // + resources.ApplyResources(this.comboBox18, "comboBox18"); + this.comboBox18.FormattingEnabled = true; + this.comboBox18.Name = "comboBox18"; + this.comboBox18.SelectedIndexChanged += new System.EventHandler(this.comboBox18_SelectedIndexChanged); + this.comboBox18.TextChanged += new System.EventHandler(this.comboBox18_TextChanged); + this.comboBox18.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox18_KeyPress); + // + // label18 + // + resources.ApplyResources(this.label18, "label18"); + this.label18.Name = "label18"; + // + // checkBox19 + // + resources.ApplyResources(this.checkBox19, "checkBox19"); + this.checkBox19.Name = "checkBox19"; + this.checkBox19.UseVisualStyleBackColor = true; + // + // comboBox19 + // + resources.ApplyResources(this.comboBox19, "comboBox19"); + this.comboBox19.FormattingEnabled = true; + this.comboBox19.Name = "comboBox19"; + this.comboBox19.SelectedIndexChanged += new System.EventHandler(this.comboBox19_SelectedIndexChanged); + this.comboBox19.TextChanged += new System.EventHandler(this.comboBox19_TextChanged); + this.comboBox19.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox19_KeyPress); + // + // label19 + // + resources.ApplyResources(this.label19, "label19"); + this.label19.Name = "label19"; + // + // checkBox20 + // + resources.ApplyResources(this.checkBox20, "checkBox20"); + this.checkBox20.Name = "checkBox20"; + this.checkBox20.UseVisualStyleBackColor = true; + // + // comboBox20 + // + resources.ApplyResources(this.comboBox20, "comboBox20"); + this.comboBox20.FormattingEnabled = true; + this.comboBox20.Name = "comboBox20"; + this.comboBox20.SelectedIndexChanged += new System.EventHandler(this.comboBox20_SelectedIndexChanged); + this.comboBox20.TextChanged += new System.EventHandler(this.comboBox20_TextChanged); + this.comboBox20.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox20_KeyPress); + // + // label20 + // + resources.ApplyResources(this.label20, "label20"); + this.label20.Name = "label20"; + // + // checkBox21 + // + resources.ApplyResources(this.checkBox21, "checkBox21"); + this.checkBox21.Name = "checkBox21"; + this.checkBox21.UseVisualStyleBackColor = true; + // + // comboBox21 + // + resources.ApplyResources(this.comboBox21, "comboBox21"); + this.comboBox21.FormattingEnabled = true; + this.comboBox21.Name = "comboBox21"; + this.comboBox21.SelectedIndexChanged += new System.EventHandler(this.comboBox21_SelectedIndexChanged); + this.comboBox21.TextChanged += new System.EventHandler(this.comboBox21_TextChanged); + this.comboBox21.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox21_KeyPress); + // + // label21 + // + resources.ApplyResources(this.label21, "label21"); + this.label21.Name = "label21"; + // + // checkBox22 + // + resources.ApplyResources(this.checkBox22, "checkBox22"); + this.checkBox22.Name = "checkBox22"; + this.checkBox22.UseVisualStyleBackColor = true; + // + // comboBox22 + // + resources.ApplyResources(this.comboBox22, "comboBox22"); + this.comboBox22.FormattingEnabled = true; + this.comboBox22.Name = "comboBox22"; + this.comboBox22.SelectedIndexChanged += new System.EventHandler(this.comboBox22_SelectedIndexChanged); + this.comboBox22.TextChanged += new System.EventHandler(this.comboBox22_TextChanged); + this.comboBox22.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox22_KeyPress); + // + // label22 + // + resources.ApplyResources(this.label22, "label22"); + this.label22.Name = "label22"; + // + // checkBox23 + // + resources.ApplyResources(this.checkBox23, "checkBox23"); + this.checkBox23.Name = "checkBox23"; + this.checkBox23.UseVisualStyleBackColor = true; + // + // comboBox23 + // + resources.ApplyResources(this.comboBox23, "comboBox23"); + this.comboBox23.FormattingEnabled = true; + this.comboBox23.Name = "comboBox23"; + this.comboBox23.SelectedIndexChanged += new System.EventHandler(this.comboBox23_SelectedIndexChanged); + this.comboBox23.TextChanged += new System.EventHandler(this.comboBox23_TextChanged); + this.comboBox23.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox23_KeyPress); + // + // label23 + // + resources.ApplyResources(this.label23, "label23"); + this.label23.Name = "label23"; + // + // checkBox24 + // + resources.ApplyResources(this.checkBox24, "checkBox24"); + this.checkBox24.Name = "checkBox24"; + this.checkBox24.UseVisualStyleBackColor = true; + // + // comboBox24 + // + resources.ApplyResources(this.comboBox24, "comboBox24"); + this.comboBox24.FormattingEnabled = true; + this.comboBox24.Name = "comboBox24"; + this.comboBox24.SelectedIndexChanged += new System.EventHandler(this.comboBox24_SelectedIndexChanged); + this.comboBox24.TextChanged += new System.EventHandler(this.comboBox24_TextChanged); + this.comboBox24.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBox24_KeyPress); + // + // label24 + // + resources.ApplyResources(this.label24, "label24"); + this.label24.Name = "label24"; + // + // CycleBeginningForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.Controls.Add(this.checkBox24); + this.Controls.Add(this.comboBox24); + this.Controls.Add(this.label24); + this.Controls.Add(this.checkBox23); + this.Controls.Add(this.comboBox23); + this.Controls.Add(this.label23); + this.Controls.Add(this.checkBox22); + this.Controls.Add(this.comboBox22); + this.Controls.Add(this.label22); + this.Controls.Add(this.checkBox21); + this.Controls.Add(this.comboBox21); + this.Controls.Add(this.label21); + this.Controls.Add(this.checkBox20); + this.Controls.Add(this.comboBox20); + this.Controls.Add(this.label20); + this.Controls.Add(this.checkBox19); + this.Controls.Add(this.comboBox19); + this.Controls.Add(this.label19); + this.Controls.Add(this.checkBox18); + this.Controls.Add(this.comboBox18); + this.Controls.Add(this.label18); + this.Controls.Add(this.checkBox17); + this.Controls.Add(this.comboBox17); + this.Controls.Add(this.label17); + this.Controls.Add(this.checkBox16); + this.Controls.Add(this.comboBox16); + this.Controls.Add(this.label16); + this.Controls.Add(this.checkBox15); + this.Controls.Add(this.comboBox15); + this.Controls.Add(this.label15); + this.Controls.Add(this.checkBox14); + this.Controls.Add(this.comboBox14); + this.Controls.Add(this.label14); + this.Controls.Add(this.checkBox13); + this.Controls.Add(this.comboBox13); + this.Controls.Add(this.label13); + this.Controls.Add(this.checkBox12); + this.Controls.Add(this.comboBox12); + this.Controls.Add(this.label12); + this.Controls.Add(this.checkBox11); + this.Controls.Add(this.comboBox11); + this.Controls.Add(this.label11); + this.Controls.Add(this.checkBox10); + this.Controls.Add(this.comboBox10); + this.Controls.Add(this.label10); + this.Controls.Add(this.checkBox9); + this.Controls.Add(this.comboBox9); + this.Controls.Add(this.label9); + this.Controls.Add(this.checkBox8); + this.Controls.Add(this.comboBox8); + this.Controls.Add(this.label8); + this.Controls.Add(this.checkBox7); + this.Controls.Add(this.comboBox7); + this.Controls.Add(this.label7); + this.Controls.Add(this.checkBox6); + this.Controls.Add(this.comboBox6); + this.Controls.Add(this.label6); + this.Controls.Add(this.checkBox5); + this.Controls.Add(this.comboBox5); + this.Controls.Add(this.label5); + this.Controls.Add(this.checkBox4); + this.Controls.Add(this.comboBox4); + this.Controls.Add(this.label4); + this.Controls.Add(this.checkBox3); + this.Controls.Add(this.comboBox3); + this.Controls.Add(this.label3); + this.Controls.Add(this.checkBox2); + this.Controls.Add(this.comboBox2); + this.Controls.Add(this.label2); + this.Controls.Add(this.checkBox1); + this.Controls.Add(this.comboBox1); + this.Controls.Add(this.label1); + this.Controls.Add(this.clearButton); + this.Controls.Add(this.orderGroupBox); + this.Controls.Add(this.okButton); + this.ForeColor = System.Drawing.Color.Black; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "CycleBeginningForm"; + this.TopMost = true; + this.Load += new System.EventHandler(this.CycleBeginningForm_Load); + this.orderGroupBox.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.GroupBox orderGroupBox; + private System.Windows.Forms.ComboBox orderComboBox; + private System.Windows.Forms.Button clearButton; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox comboBox1; + private System.Windows.Forms.CheckBox checkBox1; + private System.Windows.Forms.CheckBox checkBox2; + private System.Windows.Forms.ComboBox comboBox2; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.CheckBox checkBox3; + private System.Windows.Forms.ComboBox comboBox3; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.CheckBox checkBox4; + private System.Windows.Forms.ComboBox comboBox4; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.CheckBox checkBox5; + private System.Windows.Forms.ComboBox comboBox5; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.CheckBox checkBox6; + private System.Windows.Forms.ComboBox comboBox6; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.CheckBox checkBox7; + private System.Windows.Forms.ComboBox comboBox7; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.CheckBox checkBox8; + private System.Windows.Forms.ComboBox comboBox8; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.CheckBox checkBox9; + private System.Windows.Forms.ComboBox comboBox9; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.CheckBox checkBox10; + private System.Windows.Forms.ComboBox comboBox10; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.CheckBox checkBox11; + private System.Windows.Forms.ComboBox comboBox11; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.CheckBox checkBox12; + private System.Windows.Forms.ComboBox comboBox12; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.CheckBox checkBox13; + private System.Windows.Forms.ComboBox comboBox13; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.CheckBox checkBox14; + private System.Windows.Forms.ComboBox comboBox14; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.CheckBox checkBox15; + private System.Windows.Forms.ComboBox comboBox15; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.CheckBox checkBox16; + private System.Windows.Forms.ComboBox comboBox16; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.CheckBox checkBox17; + private System.Windows.Forms.ComboBox comboBox17; + private System.Windows.Forms.Label label17; + private System.Windows.Forms.CheckBox checkBox18; + private System.Windows.Forms.ComboBox comboBox18; + private System.Windows.Forms.Label label18; + private System.Windows.Forms.CheckBox checkBox19; + private System.Windows.Forms.ComboBox comboBox19; + private System.Windows.Forms.Label label19; + private System.Windows.Forms.CheckBox checkBox20; + private System.Windows.Forms.ComboBox comboBox20; + private System.Windows.Forms.Label label20; + private System.Windows.Forms.CheckBox checkBox21; + private System.Windows.Forms.ComboBox comboBox21; + private System.Windows.Forms.Label label21; + private System.Windows.Forms.CheckBox checkBox22; + private System.Windows.Forms.ComboBox comboBox22; + private System.Windows.Forms.Label label22; + private System.Windows.Forms.CheckBox checkBox23; + private System.Windows.Forms.ComboBox comboBox23; + private System.Windows.Forms.Label label23; + private System.Windows.Forms.CheckBox checkBox24; + private System.Windows.Forms.ComboBox comboBox24; + private System.Windows.Forms.Label label24; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/CycleBeginningForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/CycleBeginningForm.cs new file mode 100644 index 00000000..704a1523 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/CycleBeginningForm.cs @@ -0,0 +1,500 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using log4net; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.StandardCamera +{ + public partial class CycleBeginningForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(CycleBeginningForm)); + + /// Number of water meters + public readonly int WaterMetersCount; + + /// To be retrieved after the form is closed + public string PurchaseOrder; + public string[] SNText; + public bool[] Disabled; + + /// Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + /// Number of text boxes for serial numbers + int textBoxesCount; + Label[] labels; + ComboBox[] comboBoxes; + CheckBox[] checkBoxes; + IList enabledComboBoxes; + + + /// Parameterless constructor for common functionality + public CycleBeginningForm() + { + InitializeComponent(); + ControlBox = false; + + textBoxesCount = 24; + labels = new Label[] + { + label1, label2, label3, label4, label5, label6, label7, label8, label9, label10, + label11, label12, label13, label14, label15, label16, label17, label18, label19, label20, + label21, label22, label23, label24, + }; + comboBoxes = new ComboBox[] + { + comboBox1, comboBox2, comboBox3, comboBox4, comboBox5, comboBox6, + comboBox7, comboBox8, comboBox9, comboBox10, comboBox11, comboBox12, + comboBox13, comboBox14, comboBox15, comboBox16, comboBox17, comboBox18, + comboBox19, comboBox20, comboBox21, comboBox22, comboBox23, comboBox24, + }; + checkBoxes = new CheckBox[] + { + checkBox1, checkBox2, checkBox3, checkBox4, checkBox5, checkBox6, + checkBox7, checkBox8, checkBox9, checkBox10, checkBox11, checkBox12, + checkBox13, checkBox14, checkBox15, checkBox16, checkBox17, checkBox18, + checkBox19, checkBox20, checkBox21, checkBox22, checkBox23, checkBox24, + }; + enabledComboBoxes = new List(); + + completed = false; + StartForceCloseHandler(); + } + + /// + /// Constructor + /// + /// Number of text boxes for serial numbers + public CycleBeginningForm(int waterMetersCount, bool hideOrder) + : this() + { + this.WaterMetersCount = waterMetersCount; + SNText = new string[WaterMetersCount]; + Disabled = new bool[WaterMetersCount]; + + int lineSize = (WaterMetersCount <= 6) ? WaterMetersCount : Config.Data.LineSize; + ShuffleTextBoxes(Config.Data.WMsCount, lineSize); + + if (hideOrder) orderGroupBox.Visible = false; + + Height = 155 + lineSize * 44; + } + + /// + /// 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) + { + if (wmsCount < textBoxesCount && lineSize > 0) + { + int nrLines = (wmsCount + lineSize - 1) / lineSize; + int gap = (textBoxesCount - wmsCount) / nrLines; + + int dest = 0; + for (int l = 0; l < nrLines; l++) + { + for (int i = 0; i < lineSize; i++) + { + labels[dest] = labels[l * lineSize + l * gap + i]; + comboBoxes[dest] = comboBoxes[l * lineSize + l * gap + i]; + checkBoxes[dest] = checkBoxes[l * lineSize + l * gap + i]; + dest++; + } + } + textBoxesCount = wmsCount; + } + } + + private void CycleBeginningForm_Load(object sender, EventArgs e) + { + Localize(); + + if (orderGroupBox.Visible) PrepareOrderCombo(orderComboBox); + + for (int i = 0; i < textBoxesCount; i++) + { + if (Program.LocalSettings.LastSNTextsCount == textBoxesCount) + { + comboBoxes[i].Items.Add((Program.LocalSettings.LastSNTexts[i] == null) ? string.Empty : Program.LocalSettings.LastSNTexts[i]); + } + labels[i].Visible = comboBoxes[i].Visible = checkBoxes[i].Visible = true; + enabledComboBoxes.Add(comboBoxes[i]); + } + } + + void Localize() + { + Text = Strings.Data; + orderGroupBox.Text = Strings.Purchase_order; + for (int i = 0; i < textBoxesCount; i++) + { + labels[i].Text = Strings.Serial_Number + " " + (i + 1).ToString(); + } + okButton.Text = Strings.OkBtnText; + clearButton.Text = Strings.ClearBtnText; + } + + /// + /// Load Purchase order combo box items from the LocalSettings PurchaseOrderHistory array + /// + /// Puchase order ComboBox + void PrepareOrderCombo(ComboBox orderComboBox) + { + for (int i = 0; i < Program.LocalSettings.PurchaseOrderHistoryCount; i++) + { + orderComboBox.Items.Add(Program.LocalSettings.PurchaseOrderHistory[i]); + } + + if (orderComboBox.Items.Count > 0) + { + orderComboBox.Text = orderComboBox.Items[0].ToString(); + } + } + + private void okButton_Click(object sender, EventArgs e) + { + if (orderGroupBox.Visible) + { + PurchaseOrder = orderComboBox.Text; + Program.LocalSettings.UpdateHistory(orderComboBox.Text, + ref Program.LocalSettings.PurchaseOrderHistory +#if FUZHOU150 || FUZHOU300 + , 20 +#endif + ); + } + + Program.LocalSettings.LastSNTexts = SNText; + + for (int i = 0; i < Math.Min(WaterMetersCount, textBoxesCount); i++) + { + SNText[i] = comboBoxes[i].Text; + Disabled[i] = !checkBoxes[i].Checked; + } + + completed = true; + Close(); + } + + /// + /// When one combo box is updated using drop-down menu, all combo boxes + /// are updated by this function. + /// + private void UpdateAllCombos() + { + for (int i = 0; i < Math.Min(WaterMetersCount, textBoxesCount); i++) + { + comboBoxes[i].Text = Program.LocalSettings.LastSNTexts[i]; + checkBoxes[i].Checked = !string.IsNullOrEmpty(comboBoxes[i].Text); + } + } + + private void clearButton_Click(object sender, EventArgs e) + { + for (int i = 0; i < Math.Min(WaterMetersCount, textBoxesCount); i++) + { + comboBoxes[i].Text = string.Empty; + checkBoxes[i].Checked = false; + } + } + + + private void comboBox1_TextChanged(object sender, EventArgs e) { checkBox1.Checked = true; } + private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox1.Text.Equals(comboBox1.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox2_TextChanged(object sender, EventArgs e) { checkBox2.Checked = true; } + private void comboBox2_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox2.Text.Equals(comboBox2.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox3_TextChanged(object sender, EventArgs e) { checkBox3.Checked = true; } + private void comboBox3_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox3.Text.Equals(comboBox3.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox4_TextChanged(object sender, EventArgs e) { checkBox4.Checked = true; } + private void comboBox4_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox4.Text.Equals(comboBox4.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox5_TextChanged(object sender, EventArgs e) { checkBox5.Checked = true; } + private void comboBox5_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox5.Text.Equals(comboBox5.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox6_TextChanged(object sender, EventArgs e) { checkBox6.Checked = true; } + private void comboBox6_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox6.Text.Equals(comboBox6.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox7_TextChanged(object sender, EventArgs e) { checkBox7.Checked = true; } + private void comboBox7_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox7.Text.Equals(comboBox7.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox8_TextChanged(object sender, EventArgs e) { checkBox8.Checked = true; } + private void comboBox8_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox8.Text.Equals(comboBox8.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox9_TextChanged(object sender, EventArgs e) { checkBox9.Checked = true; } + private void comboBox9_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox9.Text.Equals(comboBox9.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox10_TextChanged(object sender, EventArgs e) { checkBox10.Checked = true; } + private void comboBox10_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox10.Text.Equals(comboBox10.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox11_TextChanged(object sender, EventArgs e) { checkBox11.Checked = true; } + private void comboBox11_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox11.Text.Equals(comboBox11.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox12_TextChanged(object sender, EventArgs e) { checkBox12.Checked = true; } + private void comboBox12_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox12.Text.Equals(comboBox12.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox13_TextChanged(object sender, EventArgs e) { checkBox13.Checked = true; } + private void comboBox13_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox13.Text.Equals(comboBox13.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox14_TextChanged(object sender, EventArgs e) { checkBox14.Checked = true; } + private void comboBox14_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox14.Text.Equals(comboBox14.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox15_TextChanged(object sender, EventArgs e) { checkBox15.Checked = true; } + private void comboBox15_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox15.Text.Equals(comboBox15.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox16_TextChanged(object sender, EventArgs e) { checkBox16.Checked = true; } + private void comboBox16_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox16.Text.Equals(comboBox16.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox17_TextChanged(object sender, EventArgs e) { checkBox17.Checked = true; } + private void comboBox17_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox17.Text.Equals(comboBox17.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox18_TextChanged(object sender, EventArgs e) { checkBox18.Checked = true; } + private void comboBox18_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox18.Text.Equals(comboBox18.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox19_TextChanged(object sender, EventArgs e) { checkBox19.Checked = true; } + private void comboBox19_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox19.Text.Equals(comboBox19.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox20_TextChanged(object sender, EventArgs e) { checkBox20.Checked = true; } + private void comboBox20_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox20.Text.Equals(comboBox20.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox21_TextChanged(object sender, EventArgs e) { checkBox21.Checked = true; } + private void comboBox21_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox21.Text.Equals(comboBox21.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox22_TextChanged(object sender, EventArgs e) { checkBox22.Checked = true; } + private void comboBox22_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox22.Text.Equals(comboBox22.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox23_TextChanged(object sender, EventArgs e) { checkBox23.Checked = true; } + private void comboBox23_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox23.Text.Equals(comboBox23.Items[0])) UpdateAllCombos(); + } + } + + private void comboBox24_TextChanged(object sender, EventArgs e) { checkBox24.Checked = true; } + private void comboBox24_SelectedIndexChanged(object sender, EventArgs e) + { + if (Program.LocalSettings.LastSNTextsCount == WaterMetersCount) + { + if (comboBox24.Text.Equals(comboBox24.Items[0])) UpdateAllCombos(); + } + } + + #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); + }; + } + + private void OnForceClose(object sender, EventArgs args) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + + /// + /// Process a key press within any enabled text boxe + /// + /// + /// + /// TextBox control which received the event + private void ProcKeyPress(object sender, KeyPressEventArgs e, ComboBox currentFocusOwner) + { + if (e.KeyChar == '+') + { + /// Process '+' key ..... Form completed + okButton_Click(sender, e); + } + if (e.KeyChar == '\r') + { + /// Process key ..... Next text field + if (enabledComboBoxes.Count < 2) return; /// There is just one enabled textbox + + for (int i = 0; i < enabledComboBoxes.Count; i++) + { + if (enabledComboBoxes[i] == currentFocusOwner) + { + /// Change focus to the next enabled text box + enabledComboBoxes[(i + 1) % enabledComboBoxes.Count].Focus(); + return; + } + } + } + } + + private void comboBox1_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox1); } + private void comboBox2_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox2); } + private void comboBox3_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox3); } + private void comboBox4_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox4); } + private void comboBox5_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox5); } + private void comboBox6_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox6); } + private void comboBox7_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox7); } + private void comboBox8_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox8); } + private void comboBox9_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox9); } + private void comboBox10_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox10); } + private void comboBox11_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox11); } + private void comboBox12_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox12); } + private void comboBox13_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox13); } + private void comboBox14_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox14); } + private void comboBox15_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox15); } + private void comboBox16_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox16); } + private void comboBox17_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox17); } + private void comboBox18_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox18); } + private void comboBox19_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox19); } + private void comboBox20_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox20); } + private void comboBox21_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox21); } + private void comboBox22_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox22); } + private void comboBox23_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox23); } + private void comboBox24_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, comboBox24); } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/CycleBeginningForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/CycleBeginningForm.resx new file mode 100644 index 00000000..314b3173 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/CycleBeginningForm.resx @@ -0,0 +1,2475 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + Verdana, 14.25pt + + + 729, 26 + + + 112, 63 + + + + 7 + + + OK + + + okButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 74 + + + 90, 31 + + + 260, 31 + + + 0 + + + orderComboBox + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + orderGroupBox + + + 0 + + + Verdana, 14.25pt + + + 28, 12 + + + 397, 82 + + + 0 + + + Order + + + orderGroupBox + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 73 + + + Verdana, 14.25pt + + + + NoControl + + + 582, 26 + + + 112, 63 + + + 8 + + + Clear + + + clearButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 72 + + + True + + + Verdana, 14.25pt + + + 24, 127 + + + 166, 23 + + + 9 + + + Serial Number 1 + + + False + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 71 + + + Verdana, 14.25pt + + + 225, 124 + + + 163, 31 + + + 10 + + + False + + + comboBox1 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 70 + + + True + + + 410, 135 + + + 15, 14 + + + 11 + + + False + + + checkBox1 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 69 + + + True + + + NoControl + + + 410, 179 + + + 15, 14 + + + 14 + + + False + + + checkBox2 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 66 + + + Verdana, 14.25pt + + + 225, 168 + + + 163, 31 + + + 13 + + + False + + + comboBox2 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 67 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 171 + + + 166, 23 + + + 12 + + + Serial Number 2 + + + False + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 68 + + + True + + + NoControl + + + 410, 223 + + + 15, 14 + + + 17 + + + False + + + checkBox3 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 63 + + + Verdana, 14.25pt + + + 225, 212 + + + 163, 31 + + + 16 + + + False + + + comboBox3 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 64 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 215 + + + 166, 23 + + + 15 + + + Serial Number 3 + + + False + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 65 + + + True + + + NoControl + + + 410, 267 + + + 15, 14 + + + 20 + + + False + + + checkBox4 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 60 + + + Verdana, 14.25pt + + + 225, 256 + + + 163, 31 + + + 19 + + + False + + + comboBox4 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 61 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 259 + + + 166, 23 + + + 18 + + + Serial Number 4 + + + False + + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 62 + + + True + + + NoControl + + + 410, 311 + + + 15, 14 + + + 23 + + + False + + + checkBox5 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 57 + + + Verdana, 14.25pt + + + 225, 300 + + + 163, 31 + + + 22 + + + False + + + comboBox5 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 58 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 303 + + + 166, 23 + + + 21 + + + Serial Number 5 + + + False + + + label5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 59 + + + True + + + NoControl + + + 410, 355 + + + 15, 14 + + + 26 + + + False + + + checkBox6 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 54 + + + Verdana, 14.25pt + + + 225, 344 + + + 163, 31 + + + 25 + + + False + + + comboBox6 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 55 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 347 + + + 166, 23 + + + 24 + + + Serial Number 6 + + + False + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 56 + + + True + + + NoControl + + + 410, 399 + + + 15, 14 + + + 29 + + + False + + + checkBox7 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 51 + + + Verdana, 14.25pt + + + 225, 388 + + + 163, 31 + + + 28 + + + False + + + comboBox7 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 52 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 391 + + + 166, 23 + + + 27 + + + Serial Number 7 + + + False + + + label7 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 53 + + + True + + + NoControl + + + 410, 443 + + + 15, 14 + + + 32 + + + False + + + checkBox8 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 48 + + + Verdana, 14.25pt + + + 225, 432 + + + 163, 31 + + + 31 + + + False + + + comboBox8 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 49 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 435 + + + 166, 23 + + + 30 + + + Serial Number 8 + + + False + + + label8 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 50 + + + True + + + NoControl + + + 410, 487 + + + 15, 14 + + + 35 + + + False + + + checkBox9 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 45 + + + Verdana, 14.25pt + + + 225, 476 + + + 163, 31 + + + 34 + + + False + + + comboBox9 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 46 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 479 + + + 166, 23 + + + 33 + + + Serial Number 9 + + + False + + + label9 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 47 + + + True + + + NoControl + + + 410, 531 + + + 15, 14 + + + 38 + + + False + + + checkBox10 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 42 + + + Verdana, 14.25pt + + + 225, 520 + + + 163, 31 + + + 37 + + + False + + + comboBox10 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 43 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 523 + + + 178, 23 + + + 36 + + + Serial Number 10 + + + False + + + label10 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 44 + + + True + + + NoControl + + + 410, 575 + + + 15, 14 + + + 41 + + + False + + + checkBox11 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 39 + + + Verdana, 14.25pt + + + 225, 564 + + + 163, 31 + + + 40 + + + False + + + comboBox11 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 40 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 567 + + + 178, 23 + + + 39 + + + Serial Number 11 + + + False + + + label11 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 41 + + + True + + + NoControl + + + 410, 619 + + + 15, 14 + + + 44 + + + False + + + checkBox12 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 36 + + + Verdana, 14.25pt + + + 225, 608 + + + 163, 31 + + + 43 + + + False + + + comboBox12 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 37 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 24, 611 + + + 178, 23 + + + 42 + + + Serial Number 12 + + + False + + + label12 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 38 + + + True + + + NoControl + + + 871, 135 + + + 15, 14 + + + 47 + + + False + + + checkBox13 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 33 + + + Verdana, 14.25pt + + + 686, 124 + + + 163, 31 + + + 46 + + + False + + + comboBox13 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 34 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 481, 127 + + + 178, 23 + + + 45 + + + Serial Number 13 + + + False + + + label13 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 35 + + + True + + + NoControl + + + 871, 179 + + + 15, 14 + + + 50 + + + False + + + checkBox14 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 30 + + + Verdana, 14.25pt + + + 686, 168 + + + 163, 31 + + + 49 + + + False + + + comboBox14 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 31 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 481, 171 + + + 178, 23 + + + 48 + + + Serial Number 14 + + + False + + + label14 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 32 + + + True + + + NoControl + + + 871, 223 + + + 15, 14 + + + 53 + + + False + + + checkBox15 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 27 + + + Verdana, 14.25pt + + + 686, 212 + + + 163, 31 + + + 52 + + + False + + + comboBox15 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 28 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 481, 215 + + + 178, 23 + + + 51 + + + Serial Number 15 + + + False + + + label15 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 29 + + + True + + + NoControl + + + 871, 267 + + + 15, 14 + + + 56 + + + False + + + checkBox16 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 24 + + + Verdana, 14.25pt + + + 686, 256 + + + 163, 31 + + + 55 + + + False + + + comboBox16 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 25 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 481, 259 + + + 178, 23 + + + 54 + + + Serial Number 16 + + + False + + + label16 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 26 + + + True + + + NoControl + + + 871, 311 + + + 15, 14 + + + 59 + + + False + + + checkBox17 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 21 + + + Verdana, 14.25pt + + + 686, 300 + + + 163, 31 + + + 58 + + + False + + + comboBox17 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 22 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 481, 303 + + + 178, 23 + + + 57 + + + Serial Number 17 + + + False + + + label17 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 23 + + + True + + + NoControl + + + 871, 355 + + + 15, 14 + + + 62 + + + False + + + checkBox18 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 18 + + + Verdana, 14.25pt + + + 686, 344 + + + 163, 31 + + + 61 + + + False + + + comboBox18 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 19 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 481, 347 + + + 178, 23 + + + 60 + + + Serial Number 18 + + + False + + + label18 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 20 + + + True + + + NoControl + + + 871, 399 + + + 15, 14 + + + 65 + + + False + + + checkBox19 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 15 + + + Verdana, 14.25pt + + + 686, 388 + + + 163, 31 + + + 64 + + + False + + + comboBox19 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 16 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 481, 391 + + + 178, 23 + + + 63 + + + Serial Number 19 + + + False + + + label19 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 17 + + + True + + + NoControl + + + 871, 443 + + + 15, 14 + + + 68 + + + False + + + checkBox20 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 12 + + + Verdana, 14.25pt + + + 686, 432 + + + 163, 31 + + + 67 + + + False + + + comboBox20 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 13 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 481, 435 + + + 178, 23 + + + 66 + + + Serial Number 20 + + + False + + + label20 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 14 + + + True + + + NoControl + + + 871, 487 + + + 15, 14 + + + 71 + + + False + + + checkBox21 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 9 + + + Verdana, 14.25pt + + + 686, 476 + + + 163, 31 + + + 70 + + + False + + + comboBox21 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 10 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 481, 479 + + + 178, 23 + + + 69 + + + Serial Number 21 + + + False + + + label21 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 11 + + + True + + + NoControl + + + 871, 531 + + + 15, 14 + + + 74 + + + False + + + checkBox22 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 6 + + + Verdana, 14.25pt + + + 686, 520 + + + 163, 31 + + + 73 + + + False + + + comboBox22 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 7 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 481, 523 + + + 178, 23 + + + 72 + + + Serial Number 22 + + + False + + + label22 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 8 + + + True + + + NoControl + + + 871, 575 + + + 15, 14 + + + 77 + + + False + + + checkBox23 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + Verdana, 14.25pt + + + 686, 564 + + + 163, 31 + + + 76 + + + False + + + comboBox23 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 481, 567 + + + 178, 23 + + + 75 + + + Serial Number 23 + + + False + + + label23 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 5 + + + True + + + NoControl + + + 871, 619 + + + 15, 14 + + + 80 + + + False + + + checkBox24 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + Verdana, 14.25pt + + + 686, 608 + + + 163, 31 + + + 79 + + + False + + + comboBox24 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + True + + + Verdana, 14.25pt + + + NoControl + + + 481, 611 + + + 178, 23 + + + 78 + + + Serial Number 24 + + + False + + + label24 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + True + + + 6, 13 + + + True + + + 919, 649 + + + Batch data + + + CycleBeginningForm + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/CycleEndForm.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/CycleEndForm.Designer.cs new file mode 100644 index 00000000..eab7d023 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/CycleEndForm.Designer.cs @@ -0,0 +1,652 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.StandardCamera +{ + partial class CycleEndForm + { + /// + /// 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() + { + this.textBox2 = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.okButton = new System.Windows.Forms.Button(); + this.textBox3 = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.textBox4 = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.textBox5 = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.textBox6 = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.textBox7 = new System.Windows.Forms.TextBox(); + this.label7 = new System.Windows.Forms.Label(); + this.textBox8 = new System.Windows.Forms.TextBox(); + this.label8 = new System.Windows.Forms.Label(); + this.textBox9 = new System.Windows.Forms.TextBox(); + this.label9 = new System.Windows.Forms.Label(); + this.textBox10 = new System.Windows.Forms.TextBox(); + this.label10 = new System.Windows.Forms.Label(); + this.textBox11 = new System.Windows.Forms.TextBox(); + this.label11 = new System.Windows.Forms.Label(); + this.textBox12 = new System.Windows.Forms.TextBox(); + this.label12 = new System.Windows.Forms.Label(); + this.textBox13 = new System.Windows.Forms.TextBox(); + this.label13 = new System.Windows.Forms.Label(); + this.textBox14 = new System.Windows.Forms.TextBox(); + this.label14 = new System.Windows.Forms.Label(); + this.textBox15 = new System.Windows.Forms.TextBox(); + this.label15 = new System.Windows.Forms.Label(); + this.textBox16 = new System.Windows.Forms.TextBox(); + this.label16 = new System.Windows.Forms.Label(); + this.textBox17 = new System.Windows.Forms.TextBox(); + this.label17 = new System.Windows.Forms.Label(); + this.textBox18 = new System.Windows.Forms.TextBox(); + this.label18 = new System.Windows.Forms.Label(); + this.textBox19 = new System.Windows.Forms.TextBox(); + this.label19 = new System.Windows.Forms.Label(); + this.textBox20 = new System.Windows.Forms.TextBox(); + this.label20 = new System.Windows.Forms.Label(); + this.textBox21 = new System.Windows.Forms.TextBox(); + this.label21 = new System.Windows.Forms.Label(); + this.textBox22 = new System.Windows.Forms.TextBox(); + this.label22 = new System.Windows.Forms.Label(); + this.textBox23 = new System.Windows.Forms.TextBox(); + this.label23 = new System.Windows.Forms.Label(); + this.textBox24 = new System.Windows.Forms.TextBox(); + this.label24 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // textBox2 + // + this.textBox2.Location = new System.Drawing.Point(205, 66); + this.textBox2.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox2.Name = "textBox2"; + this.textBox2.Size = new System.Drawing.Size(169, 27); + this.textBox2.TabIndex = 1; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(38, 71); + this.label2.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(62, 18); + this.label2.TabIndex = 0; + this.label2.Text = "Stand:"; + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(205, 30); + this.textBox1.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(169, 27); + this.textBox1.TabIndex = 1; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(38, 35); + this.label1.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(62, 18); + this.label1.TabIndex = 0; + this.label1.Text = "Stand:"; + // + // okButton + // + this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(832, 30); + this.okButton.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(90, 60); + this.okButton.TabIndex = 7; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // textBox3 + // + this.textBox3.Location = new System.Drawing.Point(205, 102); + this.textBox3.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox3.Name = "textBox3"; + this.textBox3.Size = new System.Drawing.Size(169, 27); + this.textBox3.TabIndex = 1; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(38, 107); + this.label3.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(62, 18); + this.label3.TabIndex = 0; + this.label3.Text = "Stand:"; + // + // textBox4 + // + this.textBox4.Location = new System.Drawing.Point(205, 138); + this.textBox4.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox4.Name = "textBox4"; + this.textBox4.Size = new System.Drawing.Size(169, 27); + this.textBox4.TabIndex = 1; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(38, 143); + this.label4.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(62, 18); + this.label4.TabIndex = 0; + this.label4.Text = "Stand:"; + // + // textBox5 + // + this.textBox5.Location = new System.Drawing.Point(205, 174); + this.textBox5.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox5.Name = "textBox5"; + this.textBox5.Size = new System.Drawing.Size(169, 27); + this.textBox5.TabIndex = 1; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(38, 179); + this.label5.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(62, 18); + this.label5.TabIndex = 0; + this.label5.Text = "Stand:"; + // + // textBox6 + // + this.textBox6.Location = new System.Drawing.Point(205, 210); + this.textBox6.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox6.Name = "textBox6"; + this.textBox6.Size = new System.Drawing.Size(169, 27); + this.textBox6.TabIndex = 1; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(38, 215); + this.label6.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(62, 18); + this.label6.TabIndex = 0; + this.label6.Text = "Stand:"; + // + // textBox7 + // + this.textBox7.Location = new System.Drawing.Point(205, 246); + this.textBox7.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox7.Name = "textBox7"; + this.textBox7.Size = new System.Drawing.Size(169, 27); + this.textBox7.TabIndex = 9; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(38, 251); + this.label7.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(62, 18); + this.label7.TabIndex = 8; + this.label7.Text = "Stand:"; + // + // textBox8 + // + this.textBox8.Location = new System.Drawing.Point(205, 282); + this.textBox8.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox8.Name = "textBox8"; + this.textBox8.Size = new System.Drawing.Size(169, 27); + this.textBox8.TabIndex = 11; + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Location = new System.Drawing.Point(38, 287); + this.label8.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(62, 18); + this.label8.TabIndex = 10; + this.label8.Text = "Stand:"; + // + // textBox9 + // + this.textBox9.Location = new System.Drawing.Point(205, 318); + this.textBox9.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox9.Name = "textBox9"; + this.textBox9.Size = new System.Drawing.Size(169, 27); + this.textBox9.TabIndex = 13; + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Location = new System.Drawing.Point(38, 323); + this.label9.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(62, 18); + this.label9.TabIndex = 12; + this.label9.Text = "Stand:"; + // + // textBox10 + // + this.textBox10.Location = new System.Drawing.Point(205, 354); + this.textBox10.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox10.Name = "textBox10"; + this.textBox10.Size = new System.Drawing.Size(169, 27); + this.textBox10.TabIndex = 15; + // + // label10 + // + this.label10.AutoSize = true; + this.label10.Location = new System.Drawing.Point(38, 359); + this.label10.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(62, 18); + this.label10.TabIndex = 14; + this.label10.Text = "Stand:"; + // + // textBox11 + // + this.textBox11.Location = new System.Drawing.Point(205, 390); + this.textBox11.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox11.Name = "textBox11"; + this.textBox11.Size = new System.Drawing.Size(169, 27); + this.textBox11.TabIndex = 17; + // + // label11 + // + this.label11.AutoSize = true; + this.label11.Location = new System.Drawing.Point(38, 395); + this.label11.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(62, 18); + this.label11.TabIndex = 16; + this.label11.Text = "Stand:"; + // + // textBox12 + // + this.textBox12.Location = new System.Drawing.Point(205, 426); + this.textBox12.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox12.Name = "textBox12"; + this.textBox12.Size = new System.Drawing.Size(169, 27); + this.textBox12.TabIndex = 19; + // + // label12 + // + this.label12.AutoSize = true; + this.label12.Location = new System.Drawing.Point(38, 431); + this.label12.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label12.Name = "label12"; + this.label12.Size = new System.Drawing.Size(62, 18); + this.label12.TabIndex = 18; + this.label12.Text = "Stand:"; + // + // textBox13 + // + this.textBox13.Location = new System.Drawing.Point(623, 30); + this.textBox13.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox13.Name = "textBox13"; + this.textBox13.Size = new System.Drawing.Size(169, 27); + this.textBox13.TabIndex = 21; + // + // label13 + // + this.label13.AutoSize = true; + this.label13.Location = new System.Drawing.Point(456, 35); + this.label13.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(62, 18); + this.label13.TabIndex = 20; + this.label13.Text = "Stand:"; + // + // textBox14 + // + this.textBox14.Location = new System.Drawing.Point(623, 66); + this.textBox14.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox14.Name = "textBox14"; + this.textBox14.Size = new System.Drawing.Size(169, 27); + this.textBox14.TabIndex = 23; + // + // label14 + // + this.label14.AutoSize = true; + this.label14.Location = new System.Drawing.Point(456, 71); + this.label14.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label14.Name = "label14"; + this.label14.Size = new System.Drawing.Size(62, 18); + this.label14.TabIndex = 22; + this.label14.Text = "Stand:"; + // + // textBox15 + // + this.textBox15.Location = new System.Drawing.Point(623, 102); + this.textBox15.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox15.Name = "textBox15"; + this.textBox15.Size = new System.Drawing.Size(169, 27); + this.textBox15.TabIndex = 25; + // + // label15 + // + this.label15.AutoSize = true; + this.label15.Location = new System.Drawing.Point(456, 107); + this.label15.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label15.Name = "label15"; + this.label15.Size = new System.Drawing.Size(62, 18); + this.label15.TabIndex = 24; + this.label15.Text = "Stand:"; + // + // textBox16 + // + this.textBox16.Location = new System.Drawing.Point(623, 138); + this.textBox16.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox16.Name = "textBox16"; + this.textBox16.Size = new System.Drawing.Size(169, 27); + this.textBox16.TabIndex = 27; + // + // label16 + // + this.label16.AutoSize = true; + this.label16.Location = new System.Drawing.Point(456, 143); + this.label16.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label16.Name = "label16"; + this.label16.Size = new System.Drawing.Size(62, 18); + this.label16.TabIndex = 26; + this.label16.Text = "Stand:"; + // + // textBox17 + // + this.textBox17.Location = new System.Drawing.Point(623, 174); + this.textBox17.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox17.Name = "textBox17"; + this.textBox17.Size = new System.Drawing.Size(169, 27); + this.textBox17.TabIndex = 29; + // + // label17 + // + this.label17.AutoSize = true; + this.label17.Location = new System.Drawing.Point(456, 179); + this.label17.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label17.Name = "label17"; + this.label17.Size = new System.Drawing.Size(62, 18); + this.label17.TabIndex = 28; + this.label17.Text = "Stand:"; + // + // textBox18 + // + this.textBox18.Location = new System.Drawing.Point(623, 210); + this.textBox18.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox18.Name = "textBox18"; + this.textBox18.Size = new System.Drawing.Size(169, 27); + this.textBox18.TabIndex = 31; + // + // label18 + // + this.label18.AutoSize = true; + this.label18.Location = new System.Drawing.Point(456, 215); + this.label18.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label18.Name = "label18"; + this.label18.Size = new System.Drawing.Size(62, 18); + this.label18.TabIndex = 30; + this.label18.Text = "Stand:"; + // + // textBox19 + // + this.textBox19.Location = new System.Drawing.Point(623, 246); + this.textBox19.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox19.Name = "textBox19"; + this.textBox19.Size = new System.Drawing.Size(169, 27); + this.textBox19.TabIndex = 33; + // + // label19 + // + this.label19.AutoSize = true; + this.label19.Location = new System.Drawing.Point(456, 251); + this.label19.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label19.Name = "label19"; + this.label19.Size = new System.Drawing.Size(62, 18); + this.label19.TabIndex = 32; + this.label19.Text = "Stand:"; + // + // textBox20 + // + this.textBox20.Location = new System.Drawing.Point(623, 282); + this.textBox20.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox20.Name = "textBox20"; + this.textBox20.Size = new System.Drawing.Size(169, 27); + this.textBox20.TabIndex = 35; + // + // label20 + // + this.label20.AutoSize = true; + this.label20.Location = new System.Drawing.Point(456, 287); + this.label20.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label20.Name = "label20"; + this.label20.Size = new System.Drawing.Size(62, 18); + this.label20.TabIndex = 34; + this.label20.Text = "Stand:"; + // + // textBox21 + // + this.textBox21.Location = new System.Drawing.Point(623, 318); + this.textBox21.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox21.Name = "textBox21"; + this.textBox21.Size = new System.Drawing.Size(169, 27); + this.textBox21.TabIndex = 37; + // + // label21 + // + this.label21.AutoSize = true; + this.label21.Location = new System.Drawing.Point(456, 323); + this.label21.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label21.Name = "label21"; + this.label21.Size = new System.Drawing.Size(62, 18); + this.label21.TabIndex = 36; + this.label21.Text = "Stand:"; + // + // textBox22 + // + this.textBox22.Location = new System.Drawing.Point(623, 354); + this.textBox22.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox22.Name = "textBox22"; + this.textBox22.Size = new System.Drawing.Size(169, 27); + this.textBox22.TabIndex = 39; + // + // label22 + // + this.label22.AutoSize = true; + this.label22.Location = new System.Drawing.Point(456, 359); + this.label22.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label22.Name = "label22"; + this.label22.Size = new System.Drawing.Size(62, 18); + this.label22.TabIndex = 38; + this.label22.Text = "Stand:"; + // + // textBox23 + // + this.textBox23.Location = new System.Drawing.Point(623, 390); + this.textBox23.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox23.Name = "textBox23"; + this.textBox23.Size = new System.Drawing.Size(169, 27); + this.textBox23.TabIndex = 41; + // + // label23 + // + this.label23.AutoSize = true; + this.label23.Location = new System.Drawing.Point(456, 395); + this.label23.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label23.Name = "label23"; + this.label23.Size = new System.Drawing.Size(62, 18); + this.label23.TabIndex = 40; + this.label23.Text = "Stand:"; + // + // textBox24 + // + this.textBox24.Location = new System.Drawing.Point(623, 426); + this.textBox24.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.textBox24.Name = "textBox24"; + this.textBox24.Size = new System.Drawing.Size(169, 27); + this.textBox24.TabIndex = 43; + // + // label24 + // + this.label24.AutoSize = true; + this.label24.Location = new System.Drawing.Point(456, 431); + this.label24.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); + this.label24.Name = "label24"; + this.label24.Size = new System.Drawing.Size(62, 18); + this.label24.TabIndex = 42; + this.label24.Text = "Stand:"; + // + // CycleEndForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 18F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.ClientSize = new System.Drawing.Size(959, 489); + this.Controls.Add(this.textBox24); + this.Controls.Add(this.label24); + this.Controls.Add(this.textBox23); + this.Controls.Add(this.label23); + this.Controls.Add(this.textBox22); + this.Controls.Add(this.label22); + this.Controls.Add(this.textBox21); + this.Controls.Add(this.label21); + this.Controls.Add(this.textBox20); + this.Controls.Add(this.label20); + this.Controls.Add(this.textBox19); + this.Controls.Add(this.label19); + this.Controls.Add(this.textBox18); + this.Controls.Add(this.label18); + this.Controls.Add(this.textBox17); + this.Controls.Add(this.label17); + this.Controls.Add(this.textBox16); + this.Controls.Add(this.label16); + this.Controls.Add(this.textBox15); + this.Controls.Add(this.label15); + this.Controls.Add(this.textBox14); + this.Controls.Add(this.label14); + this.Controls.Add(this.textBox13); + this.Controls.Add(this.label13); + this.Controls.Add(this.textBox12); + this.Controls.Add(this.label12); + this.Controls.Add(this.textBox11); + this.Controls.Add(this.label11); + this.Controls.Add(this.textBox10); + this.Controls.Add(this.label10); + this.Controls.Add(this.textBox9); + this.Controls.Add(this.label9); + this.Controls.Add(this.textBox8); + this.Controls.Add(this.label8); + this.Controls.Add(this.textBox7); + this.Controls.Add(this.label7); + this.Controls.Add(this.textBox6); + this.Controls.Add(this.label6); + this.Controls.Add(this.textBox5); + this.Controls.Add(this.label5); + this.Controls.Add(this.textBox4); + this.Controls.Add(this.label4); + this.Controls.Add(this.textBox3); + this.Controls.Add(this.label3); + this.Controls.Add(this.textBox2); + this.Controls.Add(this.label2); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.label1); + this.Controls.Add(this.okButton); + this.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.Name = "CycleEndForm"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "Daten"; + this.TopMost = true; + this.Load += new System.EventHandler(this.CycleEndForm_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox textBox2; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.TextBox textBox3; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox textBox4; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox textBox5; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.TextBox textBox6; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TextBox textBox7; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.TextBox textBox8; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.TextBox textBox9; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.TextBox textBox10; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.TextBox textBox11; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.TextBox textBox12; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.TextBox textBox13; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.TextBox textBox14; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.TextBox textBox15; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.TextBox textBox16; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.TextBox textBox17; + private System.Windows.Forms.Label label17; + private System.Windows.Forms.TextBox textBox18; + private System.Windows.Forms.Label label18; + private System.Windows.Forms.TextBox textBox19; + private System.Windows.Forms.Label label19; + private System.Windows.Forms.TextBox textBox20; + private System.Windows.Forms.Label label20; + private System.Windows.Forms.TextBox textBox21; + private System.Windows.Forms.Label label21; + private System.Windows.Forms.TextBox textBox22; + private System.Windows.Forms.Label label22; + private System.Windows.Forms.TextBox textBox23; + private System.Windows.Forms.Label label23; + private System.Windows.Forms.TextBox textBox24; + private System.Windows.Forms.Label label24; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/CycleEndForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/CycleEndForm.cs new file mode 100644 index 00000000..a5e3d421 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/CycleEndForm.cs @@ -0,0 +1,165 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// +using System; +using System.Windows.Forms; +using log4net; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.StandardCamera +{ + public partial class CycleEndForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(CycleEndForm)); + + /// Number of text boxes for serial numbers + public readonly int WaterMetersCount; + readonly int lineSize; + + // To be retrieved after the form closes + public string[] EndStateText; + + // Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + int textBoxesCount; + Label[] labels; + TextBox[] textBoxes; + + + /// + /// Constructor + /// + /// Number of text boxes for serial numbers + public CycleEndForm() + { + InitializeComponent(); + ControlBox = false; + + labels = new Label[] + { + label1, label2, label3, label4, label5, label6, label7, label8, label9, label10, + label11, label12, label13, label14, label15, label16, label17, label18, label19, label20, + label21, label22, label23, label24, + }; + textBoxes = new TextBox[] + { + textBox1, textBox2, textBox3, textBox4, textBox5, textBox6, + textBox7, textBox8, textBox9, textBox10, textBox11, textBox12, + textBox13, textBox14, textBox15, textBox16, textBox17, textBox18, + textBox19, textBox20, textBox21, textBox22, textBox23, textBox24, + }; + textBoxesCount = textBoxes.Length; + this.WaterMetersCount = textBoxesCount; + this.lineSize = textBoxesCount / 2; + + completed = false; + StartForceCloseHandler(); + } + + /// Parameterless constructor for 3 watermeters + public CycleEndForm(int waterMetersCount, int lineSize) + : this() + { + this.WaterMetersCount = waterMetersCount; + this.lineSize = lineSize; + ShuffleTextBoxes(waterMetersCount, lineSize); + EndStateText = new string[WaterMetersCount]; + } + + /// + /// 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) + { + for (int i = 0; i < textBoxesCount; i++) + { + labels[i].Visible = false; + textBoxes[i].Visible = false; + } + + if (wmsCount < textBoxesCount && lineSize > 0) + { + int nrLines; + int realLineSize; + if (WaterMetersCount <= 6) + { + realLineSize = WaterMetersCount; + nrLines = 1; + } + else + { + nrLines = (wmsCount + lineSize - 1) / lineSize; + realLineSize = lineSize; + } + int gap = (textBoxesCount - wmsCount) / nrLines; + + int dest = 0; + for (int l = 0; l < nrLines; l++) + { + for (int i = 0; i < realLineSize; i++) + { + labels[dest] = labels[l * lineSize + l * gap + i]; + textBoxes[dest] = textBoxes[l * lineSize + l * gap + i]; + labels[dest].Visible = true; + textBoxes[dest].Visible = true; + dest++; + } + } + textBoxesCount = wmsCount; + + Height = 60 + 36 * realLineSize; + } + } + + private void CycleEndForm_Load(object sender, EventArgs e) + { + Localize(); + } + + void Localize() + { + Text = Strings.Data; + okButton.Text = Strings.OkBtnText; + + for (int i = 0; i < WaterMetersCount; i++) + { + labels[i].Text = string.Format("{0} {1}:", Strings.Water_Meter, (i + 1).ToString()); + } + } + + private void okButton_Click(object sender, EventArgs e) + { + for (int i = 0; i < WaterMetersCount; i++) + { + EndStateText[i] = textBoxes[i].Text; + } + + completed = true; + 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) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/CycleEndForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/CycleEndForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/CycleEndForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/CycleEndFormMunich.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/CycleEndFormMunich.cs new file mode 100644 index 00000000..dc651e59 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/CycleEndFormMunich.cs @@ -0,0 +1,194 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using log4net; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.StandardCamera +{ + public partial class CycleEndFormMunich : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(CycleEndFormMunich)); + + /// Number of text boxes for serial numbers + public readonly int WaterMetersCount; + + // To be set before the form opens + public string ProtocolName1; + public string ProtocolName2; + public string ProtocolName3; + public string ProtocolName4; + + // To be retrieved after the form closes + public string ProtocolTitle; + public string[] EndStateText; + public int[] YearOfProduction; + + // Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + /// + /// Constructor + /// + /// Number of text boxes for serial numbers + public CycleEndFormMunich(int waterMetersCount) + { + InitializeComponent(); + ControlBox = false; + + this.WaterMetersCount = waterMetersCount; + EndStateText = new string[WaterMetersCount]; + YearOfProduction = new int[WaterMetersCount]; + completed = false; + StartForceCloseHandler(); + } + + /// Parameterless constructor for 3 watermeters + public CycleEndFormMunich() + : this(3) + { + } + + private void CycleEndForm_Load(object sender, EventArgs e) + { + Localize(); + + radioButton1.Text = ProtocolName1; + radioButton2.Text = ProtocolName2; + radioButton3.Text = ProtocolName3; + radioButton4.Text = ProtocolName4; + + if (WaterMetersCount < 1) groupBox1.Visible = false; + if (WaterMetersCount < 2) groupBox2.Visible = false; + if (WaterMetersCount < 3) groupBox3.Visible = false; + if (WaterMetersCount < 4) groupBox4.Visible = false; + if (WaterMetersCount < 5) groupBox5.Visible = false; + if (WaterMetersCount < 6) groupBox6.Visible = false; + + if (Sequences.ProcessData.BatchRslts.WaterMeters.Length >= 1) + { + YearOfProduction[0] = Sequences.ProcessData.BatchRslts.WaterMeters[0].YearOfProduction; + yearOfProduction1TextBox.Text = YearOfProduction[0].ToString(); + } + if (Sequences.ProcessData.BatchRslts.WaterMeters.Length >= 2) + { + YearOfProduction[1] = Sequences.ProcessData.BatchRslts.WaterMeters[1].YearOfProduction; + yearOfProduction2TextBox.Text = YearOfProduction[1].ToString(); + } + if (Sequences.ProcessData.BatchRslts.WaterMeters.Length >= 3) + { + YearOfProduction[2] = Sequences.ProcessData.BatchRslts.WaterMeters[2].YearOfProduction; + yearOfProduction3TextBox.Text = YearOfProduction[2].ToString(); + } + if (Sequences.ProcessData.BatchRslts.WaterMeters.Length >= 4) + { + YearOfProduction[3] = Sequences.ProcessData.BatchRslts.WaterMeters[3].YearOfProduction; + yearOfProduction4TextBox.Text = YearOfProduction[3].ToString(); + } + if (Sequences.ProcessData.BatchRslts.WaterMeters.Length >= 5) + { + YearOfProduction[4] = Sequences.ProcessData.BatchRslts.WaterMeters[4].YearOfProduction; + yearOfProduction5TextBox.Text = YearOfProduction[4].ToString(); + } + if (Sequences.ProcessData.BatchRslts.WaterMeters.Length >= 6) + { + YearOfProduction[5] = Sequences.ProcessData.BatchRslts.WaterMeters[5].YearOfProduction; + yearOfProduction6TextBox.Text = YearOfProduction[5].ToString(); + } + + Height = 228 + 90 * WaterMetersCount; + + AnyRadioButtonChanged(); + } + + void Localize() + { + Text = Strings.Data; + protocolGroupBox.Text = Strings.Protocol; + okButton.Text = Strings.OkBtnText; + + groupBox1.Text = Strings.Water_Meter + " 1"; + groupBox2.Text = Strings.Water_Meter + " 2"; + groupBox3.Text = Strings.Water_Meter + " 3"; + groupBox4.Text = Strings.Water_Meter + " 4"; + groupBox5.Text = Strings.Water_Meter + " 5"; + groupBox6.Text = Strings.Water_Meter + " 6"; + + label1.Text = label2.Text = label3.Text = label4.Text + = label5.Text = label6.Text = Strings.State; + + yearOfProduction1Label.Text = yearOfProduction2Label.Text + = yearOfProduction3Label.Text = yearOfProduction4Label.Text + = yearOfProduction5Label.Text = yearOfProduction6Label.Text = Strings.Year_of_production; + } + + private void okButton_Click(object sender, EventArgs e) + { + if (radioButton1.Checked) ProtocolTitle = ProtocolName1; + else if (radioButton2.Checked) ProtocolTitle = ProtocolName2; + else if (radioButton3.Checked) ProtocolTitle = ProtocolName3; + else if (radioButton4.Checked) ProtocolTitle = ProtocolName4; + + if (WaterMetersCount >= 1) EndStateText[0] = textBox1.Text; + if (WaterMetersCount >= 2) EndStateText[1] = textBox2.Text; + if (WaterMetersCount >= 3) EndStateText[2] = textBox3.Text; + if (WaterMetersCount >= 4) EndStateText[3] = textBox4.Text; + if (WaterMetersCount >= 5) EndStateText[4] = textBox5.Text; + if (WaterMetersCount >= 6) EndStateText[5] = textBox6.Text; + + if (ShowYear()) + { + int year; + if (WaterMetersCount >= 1 && int.TryParse(yearOfProduction1TextBox.Text, out year)) YearOfProduction[0] = year; + if (WaterMetersCount >= 2 && int.TryParse(yearOfProduction2TextBox.Text, out year)) YearOfProduction[1] = year; + if (WaterMetersCount >= 3 && int.TryParse(yearOfProduction3TextBox.Text, out year)) YearOfProduction[2] = year; + if (WaterMetersCount >= 4 && int.TryParse(yearOfProduction4TextBox.Text, out year)) YearOfProduction[3] = year; + if (WaterMetersCount >= 5 && int.TryParse(yearOfProduction5TextBox.Text, out year)) YearOfProduction[4] = year; + if (WaterMetersCount >= 6 && int.TryParse(yearOfProduction6TextBox.Text, out year)) YearOfProduction[5] = year; + } + + completed = true; + 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) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + + private void radioButton1_CheckedChanged(object sender, EventArgs e) { AnyRadioButtonChanged(); } + private void radioButton2_CheckedChanged(object sender, EventArgs e) { AnyRadioButtonChanged(); } + private void radioButton3_CheckedChanged(object sender, EventArgs e) { AnyRadioButtonChanged(); } + private void radioButton4_CheckedChanged(object sender, EventArgs e) { AnyRadioButtonChanged(); } + + bool ShowYear() + { + return radioButton2.Checked || radioButton3.Checked || radioButton4.Checked; + } + + void AnyRadioButtonChanged() + { + yearOfProduction1TextBox.Visible = yearOfProduction2TextBox.Visible = yearOfProduction3TextBox.Visible = + yearOfProduction4TextBox.Visible = yearOfProduction5TextBox.Visible = yearOfProduction6TextBox.Visible = + yearOfProduction1Label.Visible = yearOfProduction2Label.Visible = yearOfProduction3Label.Visible = + yearOfProduction4Label.Visible = yearOfProduction5Label.Visible = yearOfProduction6Label.Visible = ShowYear(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/CycleEndFormMunich.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/CycleEndFormMunich.designer.cs new file mode 100644 index 00000000..f47144fe --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/CycleEndFormMunich.designer.cs @@ -0,0 +1,514 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.StandardCamera +{ + partial class CycleEndFormMunich + { + /// + /// 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() + { + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.yearOfProduction2TextBox = new System.Windows.Forms.TextBox(); + this.yearOfProduction2Label = new System.Windows.Forms.Label(); + this.textBox2 = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.yearOfProduction1TextBox = new System.Windows.Forms.TextBox(); + this.yearOfProduction1Label = new System.Windows.Forms.Label(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.okButton = new System.Windows.Forms.Button(); + this.protocolGroupBox = new System.Windows.Forms.GroupBox(); + this.radioButton4 = new System.Windows.Forms.RadioButton(); + this.radioButton3 = new System.Windows.Forms.RadioButton(); + this.radioButton2 = new System.Windows.Forms.RadioButton(); + this.radioButton1 = new System.Windows.Forms.RadioButton(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.yearOfProduction3TextBox = new System.Windows.Forms.TextBox(); + this.yearOfProduction3Label = new System.Windows.Forms.Label(); + this.textBox3 = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.yearOfProduction4TextBox = new System.Windows.Forms.TextBox(); + this.yearOfProduction4Label = new System.Windows.Forms.Label(); + this.textBox4 = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.groupBox5 = new System.Windows.Forms.GroupBox(); + this.yearOfProduction5TextBox = new System.Windows.Forms.TextBox(); + this.yearOfProduction5Label = new System.Windows.Forms.Label(); + this.textBox5 = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.groupBox6 = new System.Windows.Forms.GroupBox(); + this.yearOfProduction6TextBox = new System.Windows.Forms.TextBox(); + this.yearOfProduction6Label = new System.Windows.Forms.Label(); + this.textBox6 = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.groupBox2.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.protocolGroupBox.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.groupBox4.SuspendLayout(); + this.groupBox5.SuspendLayout(); + this.groupBox6.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.yearOfProduction2TextBox); + this.groupBox2.Controls.Add(this.yearOfProduction2Label); + this.groupBox2.Controls.Add(this.textBox2); + this.groupBox2.Controls.Add(this.label2); + this.groupBox2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox2.ForeColor = System.Drawing.Color.Black; + this.groupBox2.Location = new System.Drawing.Point(25, 284); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(682, 81); + this.groupBox2.TabIndex = 2; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Wasserzähler 2"; + // + // yearOfProduction2TextBox + // + this.yearOfProduction2TextBox.Location = new System.Drawing.Point(559, 31); + this.yearOfProduction2TextBox.Name = "yearOfProduction2TextBox"; + this.yearOfProduction2TextBox.Size = new System.Drawing.Size(98, 31); + this.yearOfProduction2TextBox.TabIndex = 11; + // + // yearOfProduction2Label + // + this.yearOfProduction2Label.AutoSize = true; + this.yearOfProduction2Label.Location = new System.Drawing.Point(351, 34); + this.yearOfProduction2Label.Name = "yearOfProduction2Label"; + this.yearOfProduction2Label.Size = new System.Drawing.Size(188, 23); + this.yearOfProduction2Label.TabIndex = 10; + this.yearOfProduction2Label.Text = "Year of production"; + // + // textBox2 + // + this.textBox2.Location = new System.Drawing.Point(160, 31); + this.textBox2.Name = "textBox2"; + this.textBox2.Size = new System.Drawing.Size(163, 31); + this.textBox2.TabIndex = 1; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(18, 34); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(74, 23); + this.label2.TabIndex = 0; + this.label2.Text = "Stand:"; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.yearOfProduction1TextBox); + this.groupBox1.Controls.Add(this.yearOfProduction1Label); + this.groupBox1.Controls.Add(this.textBox1); + this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox1.ForeColor = System.Drawing.Color.Black; + this.groupBox1.Location = new System.Drawing.Point(25, 194); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(682, 81); + this.groupBox1.TabIndex = 1; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Wasserzähler 1"; + // + // yearOfProduction1TextBox + // + this.yearOfProduction1TextBox.Location = new System.Drawing.Point(559, 31); + this.yearOfProduction1TextBox.Name = "yearOfProduction1TextBox"; + this.yearOfProduction1TextBox.Size = new System.Drawing.Size(98, 31); + this.yearOfProduction1TextBox.TabIndex = 10; + // + // yearOfProduction1Label + // + this.yearOfProduction1Label.AutoSize = true; + this.yearOfProduction1Label.Location = new System.Drawing.Point(351, 34); + this.yearOfProduction1Label.Name = "yearOfProduction1Label"; + this.yearOfProduction1Label.Size = new System.Drawing.Size(188, 23); + this.yearOfProduction1Label.TabIndex = 9; + this.yearOfProduction1Label.Text = "Year of production"; + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(160, 31); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(163, 31); + this.textBox1.TabIndex = 1; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(18, 34); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(74, 23); + this.label1.TabIndex = 0; + this.label1.Text = "Stand:"; + // + // okButton + // + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(584, 29); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(98, 63); + this.okButton.TabIndex = 7; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // protocolGroupBox + // + this.protocolGroupBox.Controls.Add(this.radioButton4); + this.protocolGroupBox.Controls.Add(this.radioButton3); + this.protocolGroupBox.Controls.Add(this.radioButton2); + this.protocolGroupBox.Controls.Add(this.radioButton1); + this.protocolGroupBox.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.protocolGroupBox.Location = new System.Drawing.Point(25, 13); + this.protocolGroupBox.Name = "protocolGroupBox"; + this.protocolGroupBox.Size = new System.Drawing.Size(362, 175); + this.protocolGroupBox.TabIndex = 0; + this.protocolGroupBox.TabStop = false; + this.protocolGroupBox.Text = "Protokoll"; + // + // radioButton4 + // + this.radioButton4.AutoSize = true; + this.radioButton4.Location = new System.Drawing.Point(34, 133); + this.radioButton4.Name = "radioButton4"; + this.radioButton4.Size = new System.Drawing.Size(152, 27); + this.radioButton4.TabIndex = 3; + this.radioButton4.TabStop = true; + this.radioButton4.Text = "radioButton4"; + this.radioButton4.UseVisualStyleBackColor = true; + this.radioButton4.CheckedChanged += new System.EventHandler(this.radioButton4_CheckedChanged); + // + // radioButton3 + // + this.radioButton3.AutoSize = true; + this.radioButton3.Location = new System.Drawing.Point(34, 100); + this.radioButton3.Name = "radioButton3"; + this.radioButton3.Size = new System.Drawing.Size(152, 27); + this.radioButton3.TabIndex = 2; + this.radioButton3.TabStop = true; + this.radioButton3.Text = "radioButton3"; + this.radioButton3.UseVisualStyleBackColor = true; + this.radioButton3.CheckedChanged += new System.EventHandler(this.radioButton3_CheckedChanged); + // + // radioButton2 + // + this.radioButton2.AutoSize = true; + this.radioButton2.Location = new System.Drawing.Point(34, 67); + this.radioButton2.Name = "radioButton2"; + this.radioButton2.Size = new System.Drawing.Size(152, 27); + this.radioButton2.TabIndex = 1; + this.radioButton2.TabStop = true; + this.radioButton2.Text = "radioButton2"; + this.radioButton2.UseVisualStyleBackColor = true; + this.radioButton2.CheckedChanged += new System.EventHandler(this.radioButton2_CheckedChanged); + // + // radioButton1 + // + this.radioButton1.AutoSize = true; + this.radioButton1.Checked = true; + this.radioButton1.Location = new System.Drawing.Point(34, 34); + this.radioButton1.Name = "radioButton1"; + this.radioButton1.Size = new System.Drawing.Size(152, 27); + this.radioButton1.TabIndex = 0; + this.radioButton1.TabStop = true; + this.radioButton1.Text = "radioButton1"; + this.radioButton1.UseVisualStyleBackColor = true; + this.radioButton1.CheckedChanged += new System.EventHandler(this.radioButton1_CheckedChanged); + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.yearOfProduction3TextBox); + this.groupBox3.Controls.Add(this.yearOfProduction3Label); + this.groupBox3.Controls.Add(this.textBox3); + this.groupBox3.Controls.Add(this.label3); + this.groupBox3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox3.ForeColor = System.Drawing.Color.Black; + this.groupBox3.Location = new System.Drawing.Point(25, 374); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(682, 81); + this.groupBox3.TabIndex = 3; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "Wasserzähler 3"; + // + // yearOfProduction3TextBox + // + this.yearOfProduction3TextBox.Location = new System.Drawing.Point(559, 31); + this.yearOfProduction3TextBox.Name = "yearOfProduction3TextBox"; + this.yearOfProduction3TextBox.Size = new System.Drawing.Size(98, 31); + this.yearOfProduction3TextBox.TabIndex = 11; + // + // yearOfProduction3Label + // + this.yearOfProduction3Label.AutoSize = true; + this.yearOfProduction3Label.Location = new System.Drawing.Point(351, 34); + this.yearOfProduction3Label.Name = "yearOfProduction3Label"; + this.yearOfProduction3Label.Size = new System.Drawing.Size(188, 23); + this.yearOfProduction3Label.TabIndex = 10; + this.yearOfProduction3Label.Text = "Year of production"; + // + // textBox3 + // + this.textBox3.Location = new System.Drawing.Point(160, 31); + this.textBox3.Name = "textBox3"; + this.textBox3.Size = new System.Drawing.Size(163, 31); + this.textBox3.TabIndex = 1; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(18, 34); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(74, 23); + this.label3.TabIndex = 0; + this.label3.Text = "Stand:"; + // + // groupBox4 + // + this.groupBox4.Controls.Add(this.yearOfProduction4TextBox); + this.groupBox4.Controls.Add(this.yearOfProduction4Label); + this.groupBox4.Controls.Add(this.textBox4); + this.groupBox4.Controls.Add(this.label4); + this.groupBox4.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox4.ForeColor = System.Drawing.Color.Black; + this.groupBox4.Location = new System.Drawing.Point(25, 464); + this.groupBox4.Name = "groupBox4"; + this.groupBox4.Size = new System.Drawing.Size(682, 81); + this.groupBox4.TabIndex = 4; + this.groupBox4.TabStop = false; + this.groupBox4.Text = "Wasserzähler 4"; + // + // yearOfProduction4TextBox + // + this.yearOfProduction4TextBox.Location = new System.Drawing.Point(559, 31); + this.yearOfProduction4TextBox.Name = "yearOfProduction4TextBox"; + this.yearOfProduction4TextBox.Size = new System.Drawing.Size(98, 31); + this.yearOfProduction4TextBox.TabIndex = 11; + // + // yearOfProduction4Label + // + this.yearOfProduction4Label.AutoSize = true; + this.yearOfProduction4Label.Location = new System.Drawing.Point(351, 34); + this.yearOfProduction4Label.Name = "yearOfProduction4Label"; + this.yearOfProduction4Label.Size = new System.Drawing.Size(188, 23); + this.yearOfProduction4Label.TabIndex = 10; + this.yearOfProduction4Label.Text = "Year of production"; + // + // textBox4 + // + this.textBox4.Location = new System.Drawing.Point(160, 31); + this.textBox4.Name = "textBox4"; + this.textBox4.Size = new System.Drawing.Size(163, 31); + this.textBox4.TabIndex = 1; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(18, 34); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(74, 23); + this.label4.TabIndex = 0; + this.label4.Text = "Stand:"; + // + // groupBox5 + // + this.groupBox5.Controls.Add(this.yearOfProduction5TextBox); + this.groupBox5.Controls.Add(this.yearOfProduction5Label); + this.groupBox5.Controls.Add(this.textBox5); + this.groupBox5.Controls.Add(this.label5); + this.groupBox5.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox5.ForeColor = System.Drawing.Color.Black; + this.groupBox5.Location = new System.Drawing.Point(25, 554); + this.groupBox5.Name = "groupBox5"; + this.groupBox5.Size = new System.Drawing.Size(682, 81); + this.groupBox5.TabIndex = 5; + this.groupBox5.TabStop = false; + this.groupBox5.Text = "Wasserzähler 5"; + // + // yearOfProduction5TextBox + // + this.yearOfProduction5TextBox.Location = new System.Drawing.Point(559, 31); + this.yearOfProduction5TextBox.Name = "yearOfProduction5TextBox"; + this.yearOfProduction5TextBox.Size = new System.Drawing.Size(98, 31); + this.yearOfProduction5TextBox.TabIndex = 11; + // + // yearOfProduction5Label + // + this.yearOfProduction5Label.AutoSize = true; + this.yearOfProduction5Label.Location = new System.Drawing.Point(351, 34); + this.yearOfProduction5Label.Name = "yearOfProduction5Label"; + this.yearOfProduction5Label.Size = new System.Drawing.Size(188, 23); + this.yearOfProduction5Label.TabIndex = 10; + this.yearOfProduction5Label.Text = "Year of production"; + // + // textBox5 + // + this.textBox5.Location = new System.Drawing.Point(160, 31); + this.textBox5.Name = "textBox5"; + this.textBox5.Size = new System.Drawing.Size(163, 31); + this.textBox5.TabIndex = 1; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(18, 34); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(74, 23); + this.label5.TabIndex = 0; + this.label5.Text = "Stand:"; + // + // groupBox6 + // + this.groupBox6.Controls.Add(this.yearOfProduction6TextBox); + this.groupBox6.Controls.Add(this.yearOfProduction6Label); + this.groupBox6.Controls.Add(this.textBox6); + this.groupBox6.Controls.Add(this.label6); + this.groupBox6.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox6.ForeColor = System.Drawing.Color.Black; + this.groupBox6.Location = new System.Drawing.Point(25, 644); + this.groupBox6.Name = "groupBox6"; + this.groupBox6.Size = new System.Drawing.Size(682, 81); + this.groupBox6.TabIndex = 6; + this.groupBox6.TabStop = false; + this.groupBox6.Text = "Wasserzähler 6"; + // + // yearOfProduction6TextBox + // + this.yearOfProduction6TextBox.Location = new System.Drawing.Point(559, 31); + this.yearOfProduction6TextBox.Name = "yearOfProduction6TextBox"; + this.yearOfProduction6TextBox.Size = new System.Drawing.Size(98, 31); + this.yearOfProduction6TextBox.TabIndex = 11; + // + // yearOfProduction6Label + // + this.yearOfProduction6Label.AutoSize = true; + this.yearOfProduction6Label.Location = new System.Drawing.Point(351, 34); + this.yearOfProduction6Label.Name = "yearOfProduction6Label"; + this.yearOfProduction6Label.Size = new System.Drawing.Size(188, 23); + this.yearOfProduction6Label.TabIndex = 10; + this.yearOfProduction6Label.Text = "Year of production"; + // + // textBox6 + // + this.textBox6.Location = new System.Drawing.Point(160, 31); + this.textBox6.Name = "textBox6"; + this.textBox6.Size = new System.Drawing.Size(163, 31); + this.textBox6.TabIndex = 1; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(18, 34); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(74, 23); + this.label6.TabIndex = 0; + this.label6.Text = "Stand:"; + // + // CycleEndFormMunich + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.ClientSize = new System.Drawing.Size(719, 746); + this.Controls.Add(this.groupBox6); + this.Controls.Add(this.groupBox5); + this.Controls.Add(this.groupBox4); + this.Controls.Add(this.groupBox3); + this.Controls.Add(this.protocolGroupBox); + this.Controls.Add(this.okButton); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.groupBox1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "CycleEndFormMunich"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "Daten"; + this.TopMost = true; + this.Load += new System.EventHandler(this.CycleEndForm_Load); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.protocolGroupBox.ResumeLayout(false); + this.protocolGroupBox.PerformLayout(); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.groupBox4.ResumeLayout(false); + this.groupBox4.PerformLayout(); + this.groupBox5.ResumeLayout(false); + this.groupBox5.PerformLayout(); + this.groupBox6.ResumeLayout(false); + this.groupBox6.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TextBox textBox2; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.GroupBox protocolGroupBox; + private System.Windows.Forms.RadioButton radioButton3; + private System.Windows.Forms.RadioButton radioButton2; + private System.Windows.Forms.RadioButton radioButton1; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.TextBox textBox3; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.GroupBox groupBox4; + private System.Windows.Forms.TextBox textBox4; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.GroupBox groupBox5; + private System.Windows.Forms.TextBox textBox5; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.GroupBox groupBox6; + private System.Windows.Forms.TextBox textBox6; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.RadioButton radioButton4; + private System.Windows.Forms.Label yearOfProduction1Label; + private System.Windows.Forms.TextBox yearOfProduction2TextBox; + private System.Windows.Forms.Label yearOfProduction2Label; + private System.Windows.Forms.TextBox yearOfProduction1TextBox; + private System.Windows.Forms.TextBox yearOfProduction3TextBox; + private System.Windows.Forms.Label yearOfProduction3Label; + private System.Windows.Forms.TextBox yearOfProduction4TextBox; + private System.Windows.Forms.Label yearOfProduction4Label; + private System.Windows.Forms.TextBox yearOfProduction5TextBox; + private System.Windows.Forms.Label yearOfProduction5Label; + private System.Windows.Forms.TextBox yearOfProduction6TextBox; + private System.Windows.Forms.Label yearOfProduction6Label; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/CycleEndFormMunich.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/CycleEndFormMunich.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/CycleEndFormMunich.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/EntryForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/EntryForm.cs new file mode 100644 index 00000000..f7e911b2 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/EntryForm.cs @@ -0,0 +1,404 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; +using TBF.BenchControl; +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl.DataEntry.StandardCamera +{ + public class EntryForm : ComponentBase, IOperation, IDataEntryForCamera, IHasWMStatesForm, IHasCycleBeginForm, IHasCycleEndForm + { + private static readonly ILog log = LogManager.GetLogger(typeof(EntryForm)); + public override string ToString() { return string.Format("DataEntry.Standard24({0})", Cfg.ToString(1)); } + + + readonly EntryFormCfg entryFormCfg; + IRegisterReader[] regReaders; + + + public string[] StartImages + { + get { return startImages; } + set + { + if (entryFormCfg.DebugLevel == DebugMode.Simulate) + { + startImages = new string[] { "C:\\TBF\\Images\\Test\\Image1.jpg", + "C:\\TBF\\Images\\Test\\Image2.jpg", + "C:\\TBF\\Images\\Test\\Image3.jpg", + "C:\\TBF\\Images\\Test\\Image4.jpg", + "C:\\TBF\\Images\\Test\\Image5.jpg", + "C:\\TBF\\Images\\Test\\Image1.jpg", + "C:\\TBF\\Images\\Test\\Image2.jpg", + "C:\\TBF\\Images\\Test\\Image3.jpg", + "C:\\TBF\\Images\\Test\\Image4.jpg", + "C:\\TBF\\Images\\Test\\Image5.jpg", + "C:\\TBF\\Images\\Test\\Image1.jpg", + "C:\\TBF\\Images\\Test\\Image2.jpg", + "C:\\TBF\\Images\\Test\\Image3.jpg", + "C:\\TBF\\Images\\Test\\Image4.jpg", + "C:\\TBF\\Images\\Test\\Image5.jpg", + "C:\\TBF\\Images\\Test\\Image1.jpg", + "C:\\TBF\\Images\\Test\\Image2.jpg", + "C:\\TBF\\Images\\Test\\Image3.jpg", + "C:\\TBF\\Images\\Test\\Image4.jpg", + "C:\\TBF\\Images\\Test\\Image5.jpg" }; + } + else + { + startImages = value; + } + } + } + string[] startImages; + + public string[] EndImages + { + get { return endImages; } + set { endImages = value; } + } + string[] endImages; + + public bool SaveImages + { + get { return entryFormCfg.SaveImages; } + } + + + /// + /// Properties set by the Begin, End and WMStates form + /// + string purchaseOrder; + public string PurchaseOrder { get { return purchaseOrder; } } + + bool[] disabled; /// This array is shared between forms + + string[] wmCycleEndState; + public string WMCycleEndState(int wmNr) { return (wmNr >= 0 && wmNr < wmCycleEndState.Length) ? wmCycleEndState[wmNr] : string.Empty; } + + double[] wmStartState; + public double WMStartState(int wmNr) { return (wmNr >= 0 && wmNr < wmStartState.Length) ? wmStartState[wmNr] : 0; } + + double[] wmEndState; + public double WMEndState(int wmNr) { return (wmNr >= 0 && wmNr < wmEndState.Length) ? wmEndState[wmNr] : 0; } + + string[] wmStartStateStr; + + + System.Windows.Forms.Form modelessDlg; + + double refVolume; + double errLimLo; + double errLimHi; + + bool resultSaved; /// Set in Run() when results are saved + + Results.Entities.WaterMeter[] waterMeters; /// Reference to ...ProcessData.BatchRslts.WaterMeters[] + + public enum CurrentOp + { + None, + ShowFormAtCycleBeginning, + ShowFormAtCycleEnd, + TestStartStates, + TestEndStates, + DeferredTestEval, + } + + CurrentOp currentOp; + + + public EntryForm() + { + } + + public EntryForm(Generic.IComponentCfg cfg) + : base(cfg) + { + entryFormCfg = cfg as EntryFormCfg; + + disabled = new bool[Config.Data.WMsCount]; + wmStartState = new double[Config.Data.WMsCount]; + wmStartStateStr = new string[Config.Data.WMsCount]; + wmEndState = new double[Config.Data.WMsCount]; + wmCycleEndState = new string[Config.Data.WMsCount]; + + currentOp = CurrentOp.None; + log.Debug(this.ToString()); + } + + /// Reference to the operation + public IOperation ShowCycleBeginFormOp() + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.ShowFormAtCycleBeginning; + this.waterMeters = TBF.BenchControl.Sequences.ProcessData.BatchRslts.WaterMeters; + return this; + } + + /// Reference to the operation + public IOperation ShowCycleEndFormOp() + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.ShowFormAtCycleEnd; + this.waterMeters = TBF.BenchControl.Sequences.ProcessData.BatchRslts.WaterMeters; + return this; + } + + /// Reference to the operation + public IOperation ShowTestStartFormOp(IRegisterReader[] regReaders) + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.TestStartStates; + this.regReaders = regReaders; + return this; + } + + /// Reference to the operation + public IOperation ShowTestEndFormOp(IRegisterReader[] regReaders, double refVolume, double errLimLo, double errLimHi) + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.TestEndStates; + this.regReaders = regReaders; + this.refVolume = refVolume; + this.errLimLo = errLimLo; + this.errLimHi = errLimHi; + return this; + } + + /// Reference to the operation + public IOperation ShowDeferredTestEvalFormOp(IRegisterReader[] regReaders, double refVolume, double errLimLo, double errLimHi) + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.DeferredTestEval; + this.regReaders = regReaders; + this.refVolume = refVolume; + this.errLimLo = errLimLo; + this.errLimHi = errLimHi; + return this; + } + + delegate void EntryFormDlgt(EntryForm myRef); + /// + void OpenBeginningDlg(EntryForm myRef) + { + myRef.modelessDlg = new CycleBeginningForm(Config.Data.WMsCount, entryFormCfg.HideOrder); + modelessDlg.Show(); + } + /// + void OpenEndDlg(EntryForm myRef) + { + if (!string.IsNullOrEmpty(entryFormCfg.ProtocolTitle1) || + !string.IsNullOrEmpty(entryFormCfg.ProtocolTitle2) || + !string.IsNullOrEmpty(entryFormCfg.ProtocolTitle3) || + !string.IsNullOrEmpty(entryFormCfg.ProtocolTitle4)) + { + myRef.modelessDlg = new CycleEndFormMunich(Config.Data.WMsCount); + (myRef.modelessDlg as CycleEndFormMunich).ProtocolName1 = entryFormCfg.ProtocolTitle1; + (myRef.modelessDlg as CycleEndFormMunich).ProtocolName2 = entryFormCfg.ProtocolTitle2; + (myRef.modelessDlg as CycleEndFormMunich).ProtocolName3 = entryFormCfg.ProtocolTitle3; + (myRef.modelessDlg as CycleEndFormMunich).ProtocolName4 = entryFormCfg.ProtocolTitle4; + } + else + { + myRef.modelessDlg = new CycleEndForm(Config.Data.WMsCount, Config.Data.LineSize); + } + + myRef.modelessDlg.Show(); + } + /// + void OpenTestStartStatesDlg(EntryForm myRef) + { + myRef.modelessDlg = new TestStartEndForm(Config.Data.WMsCount, myRef.regReaders, startImages, disabled); + modelessDlg.Show(); + } + /// + void OpenTestEndStatesDlg(EntryForm myRef) + { + myRef.modelessDlg = new TestStartEndForm(Config.Data.WMsCount, myRef.regReaders, endImages, wmStartState, wmStartStateStr, disabled, refVolume, errLimLo, errLimHi); + modelessDlg.Show(); + } + /// + void OpenDeferredTestEvalDlg(EntryForm myRef) + { + myRef.modelessDlg = new TestStartEndForm(Config.Data.WMsCount, myRef.regReaders, startImages, endImages, disabled, refVolume, errLimLo, errLimHi); + modelessDlg.Show(); + } + + /// Start this operation + public void Start() + { + resultSaved = false; + switch (currentOp) + { + case CurrentOp.ShowFormAtCycleBeginning: + if (!entryFormCfg.EnterSerialNrsAtTheEnd) + { + Program.MainWnd.Invoke(new EntryFormDlgt(OpenBeginningDlg), this); + } + break; + + case CurrentOp.ShowFormAtCycleEnd: + if (entryFormCfg.EnterSerialNrsAtTheEnd) + { + Program.MainWnd.Invoke(new EntryFormDlgt(OpenBeginningDlg), this); + } + else if (entryFormCfg.ShowCycleEndForm) + { + Program.MainWnd.Invoke(new EntryFormDlgt(OpenEndDlg), this); + } + break; + + case CurrentOp.TestStartStates: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenTestStartStatesDlg), this); + break; + + case CurrentOp.TestEndStates: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenTestEndStatesDlg), this); + break; + + case CurrentOp.DeferredTestEval: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenDeferredTestEvalDlg), this); + break; + } + } + + /// Run this operation + /// Event.ResultsPrinted + public Event Run() + { + if ((modelessDlg is IHasCompleted) && !(modelessDlg as IHasCompleted).Completed) + { + return Event.ModelessFormIsOpen; + } + + if (!resultSaved) /// This is to save the result only once + { + if ((!entryFormCfg.EnterSerialNrsAtTheEnd && currentOp == CurrentOp.ShowFormAtCycleBeginning) || + (entryFormCfg.EnterSerialNrsAtTheEnd && currentOp == CurrentOp.ShowFormAtCycleEnd)) + { + CycleBeginningForm dlg = (modelessDlg as CycleBeginningForm); + if (dlg != null) + { + if (!entryFormCfg.HideOrder) + { + purchaseOrder = dlg.PurchaseOrder; + } + + for (int i = 0; i < Math.Min(dlg.WaterMetersCount, waterMeters.Length); i++) + { + if (waterMeters[i] != null) + { + waterMeters[i].SerialNr = dlg.SNText[i]; + disabled[i] = waterMeters[i].Disabled = dlg.Disabled[i]; + } + } + } + } + else if (currentOp == CurrentOp.ShowFormAtCycleEnd) + { + if (modelessDlg is CycleEndForm) + { + CycleEndForm dlg = (modelessDlg as CycleEndForm); + int count = waterMeters.Length; + if ((dlg != null) && (count > dlg.WaterMetersCount)) count = dlg.WaterMetersCount; + + for (int i = 0; i < count; i++) + { + if (waterMeters[i] != null) + { + /// In case entryFormCfg.ShowCycleEndForm == false dlg would be null, values would be string.Empty + wmCycleEndState[i] = waterMeters[i].EndState = (dlg != null) ? dlg.EndStateText[i] : string.Empty; + } + } + } + else if (modelessDlg is CycleEndFormMunich) + { + CycleEndFormMunich dlg = (modelessDlg as CycleEndFormMunich); + + Sequences.ProcessData.BatchRslts.Batch.ProtocolTitle = dlg.ProtocolTitle; + + for (int i = 0; i < Math.Min(waterMeters.Length, dlg.WaterMetersCount); i++) + { + if (waterMeters[i] != null) + { + wmCycleEndState[i] = waterMeters[i].EndState = dlg.EndStateText[i]; + waterMeters[i].YearOfProduction = dlg.YearOfProduction[i]; + } + } + } + } + else if (modelessDlg is TestStartEndForm && currentOp == CurrentOp.TestStartStates) + { + /// Fixed start/stop: test start + TestStartEndForm dlg = (modelessDlg as TestStartEndForm); + if (dlg != null) + { + for (int i = 0; i < dlg.WaterMetersCount; i++) + { + wmStartState[i] = dlg.WMStartState[i]; + wmStartStateStr[i] = dlg.WMStartStateStr[i]; + } + } + } + else if (modelessDlg is TestStartEndForm && currentOp == CurrentOp.TestEndStates) + { + /// Fixed start/stop: test end + TestStartEndForm dlg = (modelessDlg as TestStartEndForm); + if (dlg != null) + { + for (int i = 0; i < dlg.WaterMetersCount; i++) + { + wmEndState[i] = dlg.WMEndState[i]; + } + } + } + else if (modelessDlg is TestStartEndForm && currentOp == CurrentOp.DeferredTestEval) + { + /// Fixed start/stop: deferred test evaluation + TestStartEndForm dlg = (modelessDlg as TestStartEndForm); + if (dlg != null) + { + for (int i = 0; i < dlg.WaterMetersCount; i++) + { + wmStartState[i] = dlg.WMStartState[i]; + wmStartStateStr[i] = dlg.WMStartStateStr[i]; + wmEndState[i] = dlg.WMEndState[i]; + } + } + } + resultSaved = true; + modelessDlg = null; + } + + return Event.ModelessFormClosed; /// Form closed + } + + /// Stop this operation + public void Stop() + { + if (modelessDlg is IHasCompleted) + { + UiBridge.Bridge.OnCloseModelessForm(this, null); + modelessDlg = null; + } + currentOp = CurrentOp.None; + } + + /// + /// Updates test results with the information collected in watermeters. + /// + /// Test results to be updated with the information + public void UpdateTestResults(Results.BatchResults batchResults) + { + foreach (var wm in batchResults.WaterMeters) + { + if (wm != null && !wm.Disabled) wm.PurchaseOrder = PurchaseOrder; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/EntryFormCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/EntryFormCfg.cs new file mode 100644 index 00000000..74b4bc3e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/EntryFormCfg.cs @@ -0,0 +1,55 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DataEntry.StandardCamera +{ + public class EntryFormCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(EntryFormCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new EntryFormCfgCtrl(); } + + /// + /// Serialized parameters + /// + public bool HideOrder; + public bool EnterSerialNrsAtTheEnd; + public bool ShowCycleEndForm; + public bool SaveImages; + public string ProtocolTitle1; + public string ProtocolTitle2; + public string ProtocolTitle3; + public string ProtocolTitle4; + + /// Private parameterless constructor invoked by all other (public) constructors + EntryFormCfg() + { + Name = "DataEntry-for-Camera"; + ParentName = string.Empty; + HideOrder = false; + EnterSerialNrsAtTheEnd = false; + ShowCycleEndForm = false; + SaveImages = false; + ProtocolTitle1 = string.Empty; + ProtocolTitle2 = string.Empty; + ProtocolTitle3 = string.Empty; + ProtocolTitle4 = string.Empty; + } + + public EntryFormCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, HideOrder={1} SNsAtTheEnd={2}, EndForm={3}, SaveImages={4}", Name, HideOrder, EnterSerialNrsAtTheEnd, ShowCycleEndForm, SaveImages); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/EntryFormCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/EntryFormCfgCtrl.cs new file mode 100644 index 00000000..649b510d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/EntryFormCfgCtrl.cs @@ -0,0 +1,102 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.StandardCamera +{ + public partial class EntryFormCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + EntryFormCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as EntryFormCfg; + Redraw(); + } + } + + public EntryFormCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Localize(); + Redraw(); + } + + void Localize() + { + enterSNsAtTheEndCheckBox.Text = Strings.Enter_SNs_at_the_end; + showEndStateFormCheckBox.Text = Strings.Show_cycle_end_form; + saveImagesCheckBox.Text = "Save images"; + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + hideOrderCheckBox.Checked = config.HideOrder; + enterSNsAtTheEndCheckBox.Checked = config.EnterSerialNrsAtTheEnd; + showEndStateFormCheckBox.Checked = config.ShowCycleEndForm; + saveImagesCheckBox.Checked = config.SaveImages; + protocolTitle1TextBox.Text = config.ProtocolTitle1; + protocolTitle2TextBox.Text = config.ProtocolTitle2; + protocolTitle3TextBox.Text = config.ProtocolTitle3; + protocolTitle4TextBox.Text = config.ProtocolTitle4; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + hideOrderCheckBox.Enabled = true; + enterSNsAtTheEndCheckBox.Enabled = true; + showEndStateFormCheckBox.Enabled = true; + saveImagesCheckBox.Enabled = true; + protocolTitle1TextBox.Enabled = true; + protocolTitle2TextBox.Enabled = true; + protocolTitle3TextBox.Enabled = true; + protocolTitle4TextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.HideOrder = hideOrderCheckBox.Checked; + config.EnterSerialNrsAtTheEnd = enterSNsAtTheEndCheckBox.Checked; + config.ShowCycleEndForm = showEndStateFormCheckBox.Checked; + config.SaveImages = saveImagesCheckBox.Checked; + config.ProtocolTitle1 = protocolTitle1TextBox.Text; + config.ProtocolTitle2 = protocolTitle2TextBox.Text; + config.ProtocolTitle3 = protocolTitle3TextBox.Text; + config.ProtocolTitle4 = protocolTitle4TextBox.Text; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/EntryFormCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/EntryFormCfgCtrl.designer.cs new file mode 100644 index 00000000..db54d92e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/EntryFormCfgCtrl.designer.cs @@ -0,0 +1,234 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.StandardCamera +{ + partial class EntryFormCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.showEndStateFormCheckBox = new System.Windows.Forms.CheckBox(); + this.enterSNsAtTheEndCheckBox = new System.Windows.Forms.CheckBox(); + this.saveImagesCheckBox = new System.Windows.Forms.CheckBox(); + this.protocolTitle4TextBox = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.protocolTitle3TextBox = new System.Windows.Forms.TextBox(); + this.protocolTitle2TextBox = new System.Windows.Forms.TextBox(); + this.protocolTitle1TextBox = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.hideOrderCheckBox = new System.Windows.Forms.CheckBox(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(136, 31); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(26, 34); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(133, 10); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(61, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "Class name"; + // + // showEndStateFormCheckBox + // + this.showEndStateFormCheckBox.AutoSize = true; + this.showEndStateFormCheckBox.Enabled = false; + this.showEndStateFormCheckBox.Location = new System.Drawing.Point(136, 103); + this.showEndStateFormCheckBox.Name = "showEndStateFormCheckBox"; + this.showEndStateFormCheckBox.Size = new System.Drawing.Size(151, 17); + this.showEndStateFormCheckBox.TabIndex = 5; + this.showEndStateFormCheckBox.Text = "Watermeter end state form"; + this.showEndStateFormCheckBox.UseVisualStyleBackColor = true; + // + // enterSNsAtTheEndCheckBox + // + this.enterSNsAtTheEndCheckBox.AutoSize = true; + this.enterSNsAtTheEndCheckBox.Enabled = false; + this.enterSNsAtTheEndCheckBox.Location = new System.Drawing.Point(136, 82); + this.enterSNsAtTheEndCheckBox.Name = "enterSNsAtTheEndCheckBox"; + this.enterSNsAtTheEndCheckBox.Size = new System.Drawing.Size(167, 17); + this.enterSNsAtTheEndCheckBox.TabIndex = 4; + this.enterSNsAtTheEndCheckBox.Text = "Enter serial number at the end"; + this.enterSNsAtTheEndCheckBox.UseVisualStyleBackColor = true; + // + // saveImagesCheckBox + // + this.saveImagesCheckBox.AutoSize = true; + this.saveImagesCheckBox.Enabled = false; + this.saveImagesCheckBox.Location = new System.Drawing.Point(136, 124); + this.saveImagesCheckBox.Name = "saveImagesCheckBox"; + this.saveImagesCheckBox.Size = new System.Drawing.Size(87, 17); + this.saveImagesCheckBox.TabIndex = 6; + this.saveImagesCheckBox.Text = "Save images"; + this.saveImagesCheckBox.UseVisualStyleBackColor = true; + // + // protocolTitle4TextBox + // + this.protocolTitle4TextBox.Enabled = false; + this.protocolTitle4TextBox.Location = new System.Drawing.Point(136, 228); + this.protocolTitle4TextBox.Name = "protocolTitle4TextBox"; + this.protocolTitle4TextBox.Size = new System.Drawing.Size(130, 20); + this.protocolTitle4TextBox.TabIndex = 14; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(26, 231); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(74, 13); + this.label4.TabIndex = 13; + this.label4.Text = "Protocol title 4"; + // + // protocolTitle3TextBox + // + this.protocolTitle3TextBox.Enabled = false; + this.protocolTitle3TextBox.Location = new System.Drawing.Point(136, 202); + this.protocolTitle3TextBox.Name = "protocolTitle3TextBox"; + this.protocolTitle3TextBox.Size = new System.Drawing.Size(130, 20); + this.protocolTitle3TextBox.TabIndex = 12; + // + // protocolTitle2TextBox + // + this.protocolTitle2TextBox.Enabled = false; + this.protocolTitle2TextBox.Location = new System.Drawing.Point(136, 176); + this.protocolTitle2TextBox.Name = "protocolTitle2TextBox"; + this.protocolTitle2TextBox.Size = new System.Drawing.Size(130, 20); + this.protocolTitle2TextBox.TabIndex = 10; + // + // protocolTitle1TextBox + // + this.protocolTitle1TextBox.Enabled = false; + this.protocolTitle1TextBox.Location = new System.Drawing.Point(136, 150); + this.protocolTitle1TextBox.Name = "protocolTitle1TextBox"; + this.protocolTitle1TextBox.Size = new System.Drawing.Size(130, 20); + this.protocolTitle1TextBox.TabIndex = 8; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(26, 205); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(74, 13); + this.label3.TabIndex = 11; + this.label3.Text = "Protocol title 3"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(26, 179); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(74, 13); + this.label2.TabIndex = 9; + this.label2.Text = "Protocol title 2"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(26, 153); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(74, 13); + this.label1.TabIndex = 7; + this.label1.Text = "Protocol title 1"; + // + // hideOrderCheckBox + // + this.hideOrderCheckBox.AutoSize = true; + this.hideOrderCheckBox.Enabled = false; + this.hideOrderCheckBox.Location = new System.Drawing.Point(136, 61); + this.hideOrderCheckBox.Name = "hideOrderCheckBox"; + this.hideOrderCheckBox.Size = new System.Drawing.Size(103, 17); + this.hideOrderCheckBox.TabIndex = 3; + this.hideOrderCheckBox.Text = "Hide \'Order\' field"; + this.hideOrderCheckBox.UseVisualStyleBackColor = true; + // + // EntryFormCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.hideOrderCheckBox); + this.Controls.Add(this.protocolTitle4TextBox); + this.Controls.Add(this.label4); + this.Controls.Add(this.protocolTitle3TextBox); + this.Controls.Add(this.protocolTitle2TextBox); + this.Controls.Add(this.protocolTitle1TextBox); + this.Controls.Add(this.label3); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.saveImagesCheckBox); + this.Controls.Add(this.enterSNsAtTheEndCheckBox); + this.Controls.Add(this.showEndStateFormCheckBox); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "EntryFormCfgCtrl"; + this.Size = new System.Drawing.Size(359, 275); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.CheckBox showEndStateFormCheckBox; + private System.Windows.Forms.CheckBox enterSNsAtTheEndCheckBox; + private System.Windows.Forms.CheckBox saveImagesCheckBox; + private System.Windows.Forms.TextBox protocolTitle4TextBox; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox protocolTitle3TextBox; + private System.Windows.Forms.TextBox protocolTitle2TextBox; + private System.Windows.Forms.TextBox protocolTitle1TextBox; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.CheckBox hideOrderCheckBox; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/EntryFormCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/EntryFormCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/EntryFormCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/Factory.cs new file mode 100644 index 00000000..abdf1136 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DataEntry.StandardCamera +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return "DataEntry-Camera"; } } + + public void ResetStaticProperties() { EntryForm.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new EntryForm(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new EntryForm(cfg); } + + public IComponentCfg DefaultConfig() { return new EntryFormCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(EntryFormCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/TestStartEndForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/TestStartEndForm.cs new file mode 100644 index 00000000..ed79e71e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/TestStartEndForm.cs @@ -0,0 +1,891 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Windows.Forms; +using log4net; +using TBF.BenchControl.GenericDevices; +using TBF.Resources; +using System.IO; + +namespace TBF.BenchControl.DataEntry.StandardCamera +{ + /// Type for argument that identifies images + enum Tst + { + Start, + End, + Both, + } + + enum Rotation + { + R0, + R90, + R180, + R270, + Count + } + + public partial class TestStartEndForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(TestStartEndForm)); + + // Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + /// Number of text boxes for serial numbers + readonly Tst mode; /// Start, End or Deferred + public readonly int WaterMetersCount; + readonly IRegisterReader[] regReaders; + readonly bool[] disabled; + readonly string[] startImages; + readonly string[] endImages; + readonly double refVolume; + readonly double warningLimLo; /// limit to display exclamation mark, typically 2x errLimLo + readonly double warningLimHi; /// limit to display exclamation mark, typically 2x errLimHi + + // To be retrieved after the form closes + public double[] WMStartState; + + // To be retrieved after the form closes + public readonly string[] WMStartStateStr; + + // To be retrieved after the form closes + public double[] WMEndState; + + + const int TextBoxesCount = 24; + + + string lastImageName; + Bitmap lastImage; /// non-zoomed image + Bitmap zoomedImage; + + static int wmNr0b; + static Rotation[] imageRotation; + static bool[] isZoomed; + static Point[] zoomCenterLoc; + /// + static TestStartEndForm() + { + wmNr0b = 0; + imageRotation = new Rotation[TextBoxesCount]; + isZoomed = new bool[TextBoxesCount]; + zoomCenterLoc = new Point[TextBoxesCount]; + } + + readonly Label[] labels; + readonly TextBox[] startTextBoxes; + readonly TextBox[] endTextBoxes; + readonly Label[] exclamations; + + int[] phys2wm; /// Array: index is physical position 0..23, value is water meter position 1..X or 0 (controls hidden) + int[] wm2phys; /// Array: index is water meters position 1..X (item at ix=0 is not used), value is physical position 0..23 + + IList enabledTextBoxes; + + /// + /// Parameterless constructor initializing common part for start and endstate form + /// + public TestStartEndForm() + { + InitializeComponent(); + ControlBox = false; + + labels = new Label[] + { + label1, label2, label3, label4, label5, label6, + label7, label8, label9, label10, label11, label12, + label13, label14, label15, label16, label17, label18, + label19, label20, label21, label22, label23, label24, + }; + startTextBoxes = new TextBox[] + { + startTextBox1, startTextBox2, startTextBox3, startTextBox4, startTextBox5, startTextBox6, + startTextBox7, startTextBox8, startTextBox9, startTextBox10, startTextBox11, startTextBox12, + startTextBox13, startTextBox14, startTextBox15, startTextBox16, startTextBox17, startTextBox18, + startTextBox19, startTextBox20, startTextBox21, startTextBox22, startTextBox23, startTextBox24, + }; + endTextBoxes = new TextBox[] + { + endTextBox1, endTextBox2, endTextBox3, endTextBox4, endTextBox5, endTextBox6, + endTextBox7, endTextBox8, endTextBox9, endTextBox10, endTextBox11, endTextBox12, + endTextBox13, endTextBox14, endTextBox15, endTextBox16, endTextBox17, endTextBox18, + endTextBox19, endTextBox20, endTextBox21, endTextBox22, endTextBox23, endTextBox24, + }; + exclamations = new Label[] + { + exclamation1, exclamation2, exclamation3, exclamation4, exclamation5, exclamation6, + exclamation7, exclamation8, exclamation9, exclamation10, exclamation11, exclamation12, + exclamation13, exclamation14, exclamation15, exclamation16, exclamation17, exclamation18, + exclamation19, exclamation20, exclamation21, exclamation22, exclamation23, exclamation24, + }; + + enabledTextBoxes = new List(); + + completed = false; + StartForceCloseHandler(); + } + + /// + /// Constructor to fill in start states + /// + /// Number of water meters + /// Information from CycleBeginningForm about availability of water meters + public TestStartEndForm(int waterMetersCount, IRegisterReader[] regReaders, string[] startImages, bool[] disabled) + : this() + { + mode = Tst.Start; + + this.regReaders = regReaders; + this.WaterMetersCount = Math.Min(waterMetersCount, regReaders.Length); + + this.startImages = startImages; + this.disabled = disabled; + + if (startImages == null || startImages.Length != waterMetersCount) + { + throw (new Exception("Invalid 'startImages' argument")); + } + + this.endImages = new string[waterMetersCount]; + + /// For large benches with WaterMetersCount LE 6 is Config.Data.LineSize==1 (compound meters) + int lineSize = (WaterMetersCount <= 6) ? WaterMetersCount : Config.Data.LineSize; + + DeterminePhysPosWMPos(TextBoxesCount, WaterMetersCount, lineSize, out phys2wm, out wm2phys); + + Height = 555 + 30 * WaterMetersCount; + + WMStartState = new double[waterMetersCount]; + WMStartStateStr = new string[waterMetersCount]; + } + + /// + /// Constructor to fill in end states + /// + /// Number of water meters + /// Information entered on test start + /// Information from CycleBeginningForm about availability of water meters + /// Reference volume, it is used to verify the end state, show/hide exclamation if necessary + /// Error limit low, it is used to verify the end state, show/hide exclamation if necessary + /// Error limit high, it is used to verify the end state, show/hide exclamation if necessary + public TestStartEndForm(int waterMetersCount, IRegisterReader[] regReaders, string[] endImages, double[] wmStartState, string[] wmStartStateStr, bool[] disabled, + double refVolume, double errLimLo, double errLimHi) + : this() + { + mode = Tst.End; + + this.regReaders = regReaders; + this.WaterMetersCount = Math.Min(waterMetersCount, regReaders.Length); + + if (endImages == null || endImages.Length != waterMetersCount || + wmStartState == null || wmStartState.Length != waterMetersCount || + wmStartStateStr == null || wmStartStateStr.Length != waterMetersCount) + { + throw (new Exception("Invalid argument(s)")); + } + + this.endImages = endImages; + this.WMStartState = wmStartState; + this.WMStartStateStr = wmStartStateStr; + this.disabled = disabled; + this.refVolume = refVolume; + this.warningLimLo = 2 * errLimLo; + this.warningLimHi = 2 * errLimHi; + + this.startImages = new string[waterMetersCount]; + + /// For large benches with WaterMetersCount LE 6 is Config.Data.LineSize==1 (compound meters) + int lineSize = (WaterMetersCount <= 6) ? WaterMetersCount : Config.Data.LineSize; + + DeterminePhysPosWMPos(TextBoxesCount, WaterMetersCount, lineSize, out phys2wm, out wm2phys); + + Height = 555 + 30 * WaterMetersCount; + + WMEndState = new double[waterMetersCount]; + } + + public TestStartEndForm(int waterMetersCount, IRegisterReader[] regReaders, string[] startImages, string[] endImages, + bool[] disabled, double refVolume, double errLimLo, double errLimHi) + : this() + { + mode = Tst.Both; + + this.regReaders = regReaders; + this.WaterMetersCount = Math.Min(waterMetersCount, regReaders.Length); + + if (startImages == null || startImages.Length != waterMetersCount || + endImages == null || endImages.Length != waterMetersCount) + { + throw (new Exception("Invalid argument(s)")); + } + + this.startImages = startImages; + this.endImages = endImages; + this.disabled = disabled; + this.refVolume = refVolume; + this.warningLimLo = 2 * errLimLo; + this.warningLimHi = 2 * errLimHi; + + /// For large benches with WaterMetersCount LE 6 is Config.Data.LineSize==1 (compound meters) + int lineSize = (WaterMetersCount <= 6) ? WaterMetersCount : Config.Data.LineSize; + + DeterminePhysPosWMPos(TextBoxesCount, WaterMetersCount, lineSize, out phys2wm, out wm2phys); + + Height = 555 + 30 * WaterMetersCount; + + WMStartState = new double[waterMetersCount]; + WMStartStateStr = new string[waterMetersCount]; + WMEndState = new double[waterMetersCount]; + } + + /// + /// Make sure the layout of labels/text boxes on the screen + /// corresponds to the layout of watermeters of the test bench. + /// + void DeterminePhysPosWMPos(int textBoxesCount, int waterMetersCount, int lineSize, out int[] physPos2wmPos, out int[] wmPos2PhysPos) + { + physPos2wmPos = new int[textBoxesCount]; /// already initialized to 0-s + wmPos2PhysPos = new int[waterMetersCount + 1]; + for (int i = 0; i < waterMetersCount + 1; i++) wmPos2PhysPos[i] = -1; /// initialize to -1 + + if (waterMetersCount < textBoxesCount) + { + int nrLines = waterMetersCount / lineSize; + int gap = (textBoxesCount - waterMetersCount) / nrLines; + + int wmPos = 1; + for (int ln = 0; ln < nrLines; ln++) + { + for (int i = 0; i < lineSize; i++, wmPos++) + { + physPos2wmPos[ln * lineSize + ln * gap + i] = wmPos; + wmPos2PhysPos[wmPos] = ln * lineSize + ln * gap + i; + } + } + } + else + { + int wmPos = 1; + for (int i = 0; i < textBoxesCount; i++, wmPos++) + { + physPos2wmPos[i] = wmPos; + wmPos2PhysPos[wmPos] = i; + } + } + } + + private void TestStartEndForm_Load(object sender, EventArgs e) + { + Localize(); + + for (int i = 0; i < TextBoxesCount; i++) + { + int wmPos = phys2wm[i]; + + labels[i].Visible = startTextBoxes[i].Visible = endTextBoxes[i].Visible = (wmPos > 0); + + if (wmPos > 0) + { + labels[i].Text = string.Format("{0} {1}", Strings.Water_Meter, wmPos); + + switch (mode) + { + case Tst.Start: + if (disabled != null && wmPos <= disabled.Length && disabled[wmPos - 1]) + { + startTextBoxes[i].Enabled = false; + } + else + { + startTextBoxes[i].Enabled = true; + enabledTextBoxes.Add(startTextBoxes[i]); + } + break; + + case Tst.End: + if (disabled != null && wmPos <= disabled.Length && disabled[wmPos - 1]) + { + startTextBoxes[i].Enabled = false; + endTextBoxes[i].Enabled = false; + } + else + { + endTextBoxes[i].Enabled = true; + enabledTextBoxes.Add(endTextBoxes[i]); + startTextBoxes[i].Enabled = false; + startTextBoxes[i].Text = WMStartStateStr[wmPos - 1]; + } + break; + + case Tst.Both: + if (disabled != null && wmPos <= disabled.Length && disabled[wmPos - 1]) + { + startTextBoxes[i].Enabled = false; + endTextBoxes[i].Enabled = false; + } + else + { + startTextBoxes[i].Enabled = true; + endTextBoxes[i].Enabled = true; + enabledTextBoxes.Add(startTextBoxes[i]); + enabledTextBoxes.Add(endTextBoxes[i]); + } + break; + } + } + } + } + + void Localize() + { + Text = Strings.Water_Meter_States; + startLabel.Text = startLabel2.Text = Strings.Start; + endLabel.Text = endLabel2.Text = Strings.End; + okButton.Text = Strings.OkBtnText; + } + + private void okButton_Click(object sender, EventArgs eArgs) + { + try + { + for (int i = 0; i < TextBoxesCount; i++) + { + int wmPos = phys2wm[i]; + + if (wmPos > 0) + { + if (startTextBoxes[i].Enabled) + { + WMStartStateStr[wmPos - 1] = startTextBoxes[i].Text; + WMStartState[wmPos - 1] = Utils.ParseUDouble(startTextBoxes[i].Text) * regReaders[wmPos - 1].LtrsPerPulse; + } + + if (endTextBoxes[i].Enabled) + { + WMEndState[wmPos - 1] = Utils.ParseUDouble(endTextBoxes[i].Text) * regReaders[wmPos - 1].LtrsPerPulse; + } + } + } + } + catch(Exception e) + { + log.ErrorFormat("Exception: {0}", e.Message); + return; + } + + completed = true; + Close(); + } + + private void previousButton_Click(object sender, EventArgs e) + { + + } + + private void nextButton_Click(object sender, EventArgs e) + { + + } + + + #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) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + + + /// + /// Calculate the approximate error and verify whether it is within limits. + /// Make an exclamation mark visible if out of range. + /// Similar event handler is implemented for all endTextBoxes (1..24). + /// + private void startTextBox1_TextChanged(object sender, EventArgs e) { UpdateExclamation(0); } + private void startTextBox2_TextChanged(object sender, EventArgs e) { UpdateExclamation(1); } + private void startTextBox3_TextChanged(object sender, EventArgs e) { UpdateExclamation(2); } + private void startTextBox4_TextChanged(object sender, EventArgs e) { UpdateExclamation(3); } + private void startTextBox5_TextChanged(object sender, EventArgs e) { UpdateExclamation(4); } + private void startTextBox6_TextChanged(object sender, EventArgs e) { UpdateExclamation(5); } + private void startTextBox7_TextChanged(object sender, EventArgs e) { UpdateExclamation(6); } + private void startTextBox8_TextChanged(object sender, EventArgs e) { UpdateExclamation(7); } + private void startTextBox9_TextChanged(object sender, EventArgs e) { UpdateExclamation(8); } + private void startTextBox10_TextChanged(object sender, EventArgs e) { UpdateExclamation(9); } + private void startTextBox11_TextChanged(object sender, EventArgs e) { UpdateExclamation(10); } + private void startTextBox12_TextChanged(object sender, EventArgs e) { UpdateExclamation(11); } + private void startTextBox13_TextChanged(object sender, EventArgs e) { UpdateExclamation(12); } + private void startTextBox14_TextChanged(object sender, EventArgs e) { UpdateExclamation(13); } + private void startTextBox15_TextChanged(object sender, EventArgs e) { UpdateExclamation(14); } + private void startTextBox16_TextChanged(object sender, EventArgs e) { UpdateExclamation(15); } + private void startTextBox17_TextChanged(object sender, EventArgs e) { UpdateExclamation(16); } + private void startTextBox18_TextChanged(object sender, EventArgs e) { UpdateExclamation(17); } + private void startTextBox19_TextChanged(object sender, EventArgs e) { UpdateExclamation(18); } + private void startTextBox20_TextChanged(object sender, EventArgs e) { UpdateExclamation(19); } + private void startTextBox21_TextChanged(object sender, EventArgs e) { UpdateExclamation(20); } + private void startTextBox22_TextChanged(object sender, EventArgs e) { UpdateExclamation(21); } + private void startTextBox23_TextChanged(object sender, EventArgs e) { UpdateExclamation(22); } + private void startTextBox24_TextChanged(object sender, EventArgs e) { UpdateExclamation(23); } + + private void endTextBox1_TextChanged(object sender, EventArgs e) { UpdateExclamation(0); } + private void endTextBox2_TextChanged(object sender, EventArgs e) { UpdateExclamation(1); } + private void endTextBox3_TextChanged(object sender, EventArgs e) { UpdateExclamation(2); } + private void endTextBox4_TextChanged(object sender, EventArgs e) { UpdateExclamation(3); } + private void endTextBox5_TextChanged(object sender, EventArgs e) { UpdateExclamation(4); } + private void endTextBox6_TextChanged(object sender, EventArgs e) { UpdateExclamation(5); } + private void endTextBox7_TextChanged(object sender, EventArgs e) { UpdateExclamation(6); } + private void endTextBox8_TextChanged(object sender, EventArgs e) { UpdateExclamation(7); } + private void endTextBox9_TextChanged(object sender, EventArgs e) { UpdateExclamation(8); } + private void endTextBox10_TextChanged(object sender, EventArgs e) { UpdateExclamation(9); } + private void endTextBox11_TextChanged(object sender, EventArgs e) { UpdateExclamation(10); } + private void endTextBox12_TextChanged(object sender, EventArgs e) { UpdateExclamation(11); } + private void endTextBox13_TextChanged(object sender, EventArgs e) { UpdateExclamation(12); } + private void endTextBox14_TextChanged(object sender, EventArgs e) { UpdateExclamation(13); } + private void endTextBox15_TextChanged(object sender, EventArgs e) { UpdateExclamation(14); } + private void endTextBox16_TextChanged(object sender, EventArgs e) { UpdateExclamation(15); } + private void endTextBox17_TextChanged(object sender, EventArgs e) { UpdateExclamation(16); } + private void endTextBox18_TextChanged(object sender, EventArgs e) { UpdateExclamation(17); } + private void endTextBox19_TextChanged(object sender, EventArgs e) { UpdateExclamation(18); } + private void endTextBox20_TextChanged(object sender, EventArgs e) { UpdateExclamation(19); } + private void endTextBox21_TextChanged(object sender, EventArgs e) { UpdateExclamation(20); } + private void endTextBox22_TextChanged(object sender, EventArgs e) { UpdateExclamation(21); } + private void endTextBox23_TextChanged(object sender, EventArgs e) { UpdateExclamation(22); } + private void endTextBox24_TextChanged(object sender, EventArgs e) { UpdateExclamation(23); } + /// + void UpdateExclamation(int uiCtrlPos) /// uiCtrlPos = 0 .. TextBoxesCount-1 + { + try + { + double startVolumeLtr = Utils.ParseUDouble(startTextBoxes[uiCtrlPos].Text) * regReaders[phys2wm[uiCtrlPos] - 1].LtrsPerPulse; + double endVolumeLtr = Utils.ParseUDouble(endTextBoxes[uiCtrlPos].Text) * regReaders[phys2wm[uiCtrlPos] - 1].LtrsPerPulse; + double err = 100.0 * (endVolumeLtr - startVolumeLtr - refVolume) / refVolume; + exclamations[uiCtrlPos].Visible = (err < warningLimLo) || (err > warningLimHi); + } + catch + { + exclamations[uiCtrlPos].Visible = false; + } + } + + + private void startTextBox1_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox1); } + private void startTextBox2_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox2); } + private void startTextBox3_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox3); } + private void startTextBox4_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox4); } + private void startTextBox5_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox5); } + private void startTextBox6_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox6); } + private void startTextBox7_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox7); } + private void startTextBox8_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox8); } + private void startTextBox9_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox9); } + private void startTextBox10_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox10); } + private void startTextBox11_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox11); } + private void startTextBox12_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox12); } + private void startTextBox13_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox13); } + private void startTextBox14_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox14); } + private void startTextBox15_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox15); } + private void startTextBox16_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox16); } + private void startTextBox17_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox17); } + private void startTextBox18_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox18); } + private void startTextBox19_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox19); } + private void startTextBox20_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox20); } + private void startTextBox21_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox21); } + private void startTextBox22_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox22); } + private void startTextBox23_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox23); } + private void startTextBox24_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox24); } + + private void endTextBox1_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox1); } + private void endTextBox2_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox2); } + private void endTextBox3_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox3); } + private void endTextBox4_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox4); } + private void endTextBox5_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox5); } + private void endTextBox6_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox6); } + private void endTextBox7_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox7); } + private void endTextBox8_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox8); } + private void endTextBox9_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox9); } + private void endTextBox10_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox10); } + private void endTextBox11_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox11); } + private void endTextBox12_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox12); } + private void endTextBox13_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox13); } + private void endTextBox14_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox14); } + private void endTextBox15_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox15); } + private void endTextBox16_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox16); } + private void endTextBox17_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox17); } + private void endTextBox18_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox18); } + private void endTextBox19_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox19); } + private void endTextBox20_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox20); } + private void endTextBox21_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox21); } + private void endTextBox22_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox22); } + private void endTextBox23_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox23); } + private void endTextBox24_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox24); } + /// + /// + /// Process a key press within any enabled text boxe + /// + /// + /// + /// TextBox control which received the event + private void ProcKeyPress(object sender, KeyPressEventArgs e, TextBox currentFocusOwner) + { + if (e.KeyChar == '+') + { + /// Process '+' key ..... Form completed + okButton_Click(sender, e); + } + if (e.KeyChar == '\r') + { + /// Process key ..... Next text field + if (enabledTextBoxes.Count < 2) return; /// There is just one enabled textbox + + for (int i = 0; i < enabledTextBoxes.Count; i++) + { + if (enabledTextBoxes[i] == currentFocusOwner) + { + /// Change focus to the next enabled text box + enabledTextBoxes[(i + 1) % enabledTextBoxes.Count].Focus(); + return; + } + } + } + } + + + private void startTextBox1_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.Start, 0); } + private void startTextBox2_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.Start, 1); } + private void startTextBox3_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.Start, 2); } + private void startTextBox4_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.Start, 3); } + private void startTextBox5_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.Start, 4); } + private void startTextBox6_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.Start, 5); } + private void startTextBox7_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.Start, 6); } + private void startTextBox8_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.Start, 7); } + private void startTextBox9_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.Start, 8); } + private void startTextBox10_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.Start, 9); } + private void startTextBox11_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.Start, 10); } + private void startTextBox12_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.Start, 11); } + private void startTextBox13_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.Start, 12); } + private void startTextBox14_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.Start, 13); } + private void startTextBox15_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.Start, 14); } + private void startTextBox16_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.Start, 15); } + private void startTextBox17_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.Start, 16); } + private void startTextBox18_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.Start, 17); } + private void startTextBox19_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.Start, 18); } + private void startTextBox20_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.Start, 19); } + private void startTextBox21_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.Start, 20); } + private void startTextBox22_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.Start, 21); } + private void startTextBox23_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.Start, 22); } + private void startTextBox24_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.Start, 23); } + private void startTextBox1_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.Start, 0); } + private void startTextBox2_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.Start, 1); } + private void startTextBox3_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.Start, 2); } + private void startTextBox4_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.Start, 3); } + private void startTextBox5_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.Start, 4); } + private void startTextBox6_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.Start, 5); } + private void startTextBox7_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.Start, 6); } + private void startTextBox8_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.Start, 7); } + private void startTextBox9_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.Start, 8); } + private void startTextBox10_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.Start, 9); } + private void startTextBox11_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.Start, 10); } + private void startTextBox12_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.Start, 11); } + private void startTextBox13_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.Start, 12); } + private void startTextBox14_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.Start, 13); } + private void startTextBox15_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.Start, 14); } + private void startTextBox16_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.Start, 15); } + private void startTextBox17_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.Start, 16); } + private void startTextBox18_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.Start, 17); } + private void startTextBox19_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.Start, 18); } + private void startTextBox20_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.Start, 19); } + private void startTextBox21_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.Start, 20); } + private void startTextBox22_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.Start, 21); } + private void startTextBox23_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.Start, 22); } + private void startTextBox24_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.Start, 23); } + + private void endTextBox1_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.End, 0); } + private void endTextBox2_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.End, 1); } + private void endTextBox3_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.End, 2); } + private void endTextBox4_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.End, 3); } + private void endTextBox5_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.End, 4); } + private void endTextBox6_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.End, 5); } + private void endTextBox7_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.End, 6); } + private void endTextBox8_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.End, 7); } + private void endTextBox9_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.End, 8); } + private void endTextBox10_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.End, 9); } + private void endTextBox11_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.End, 10); } + private void endTextBox12_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.End, 11); } + private void endTextBox13_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.End, 12); } + private void endTextBox14_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.End, 13); } + private void endTextBox15_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.End, 14); } + private void endTextBox16_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.End, 15); } + private void endTextBox17_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.End, 16); } + private void endTextBox18_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.End, 17); } + private void endTextBox19_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.End, 18); } + private void endTextBox20_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.End, 19); } + private void endTextBox21_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.End, 20); } + private void endTextBox22_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.End, 21); } + private void endTextBox24_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.End, 22); } + private void endTextBox23_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(Tst.End, 23); } + private void endTextBox1_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.End, 0); } + private void endTextBox2_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.End, 1); } + private void endTextBox3_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.End, 2); } + private void endTextBox4_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.End, 3); } + private void endTextBox5_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.End, 4); } + private void endTextBox6_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.End, 5); } + private void endTextBox7_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.End, 6); } + private void endTextBox8_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.End, 7); } + private void endTextBox9_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.End, 8); } + private void endTextBox10_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.End, 9); } + private void endTextBox11_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.End, 10); } + private void endTextBox12_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.End, 11); } + private void endTextBox13_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.End, 12); } + private void endTextBox14_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.End, 13); } + private void endTextBox15_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.End, 14); } + private void endTextBox16_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.End, 15); } + private void endTextBox17_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.End, 16); } + private void endTextBox18_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.End, 17); } + private void endTextBox19_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.End, 18); } + private void endTextBox20_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.End, 19); } + private void endTextBox21_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.End, 20); } + private void endTextBox22_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.End, 21); } + private void endTextBox23_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.End, 22); } + private void endTextBox24_MouseDown(object sender, MouseEventArgs e) { LoadImage(Tst.End, 23); } + + /// + /// Loads appropriate image into pictureBox1.Image + /// Handles mouse clicks and Tab-changes inside text boxes. + /// + /// Tst.Start or Tst.End + /// 0..23 + void LoadImage(Tst startOrEnd, int physPos) + { + ShowUnits(startOrEnd, physPos); + + int wmNr1b = phys2wm[physPos]; /// 0 means no WM + wmNr0b = Math.Max(0, wmNr1b - 1); + + string imageFileName; + if ((startOrEnd == Tst.Start) && (wmNr1b > 0) && (startImages[wmNr0b] != null)) + imageFileName = startImages[wmNr0b]; + else if ((startOrEnd == Tst.End) && (wmNr1b > 0) && (endImages[wmNr0b] != null)) + imageFileName = endImages[wmNr0b]; + else + imageFileName = string.Empty; + + if (imageFileName == lastImageName) + { + return; + } + + lastImageName = imageFileName; + + if (string.IsNullOrEmpty(imageFileName) || !File.Exists(imageFileName)) + { + lastImage = null; + } + else + { + using (Bitmap tempBmp = Image.FromFile(imageFileName) as Bitmap) + { + int hght = tempBmp.Height; + int leftMargin = (tempBmp.Width - hght) / 2; + lastImage = new Bitmap(tempBmp.Clone(new Rectangle(leftMargin, 0, hght, hght), tempBmp.PixelFormat)); + if (isZoomed[wmNr0b]) + { + zoomedImage = MakeZoomedImage(lastImage, zoomCenterLoc[wmNr0b]); + } + } + } + + ShowImage(); + } + + + /// + /// Left click = Zoom, Right click = Unzoom + /// + private void pictureBox1_Click(object sender, EventArgs e) + { + if (lastImage == null) return; + + MouseEventArgs me = (MouseEventArgs)e; + + if (me.Button == MouseButtons.Left && !isZoomed[wmNr0b]) + { + switch (imageRotation[wmNr0b]) + { + case Rotation.R0: + zoomCenterLoc[wmNr0b] = me.Location; + break; + case Rotation.R90: + zoomCenterLoc[wmNr0b].X = pictureBox1.Size.Height - me.Location.Y - 1; + zoomCenterLoc[wmNr0b].Y = me.Location.X; + break; + case Rotation.R180: + zoomCenterLoc[wmNr0b].X = pictureBox1.Size.Width - me.Location.X - 1; + zoomCenterLoc[wmNr0b].Y = pictureBox1.Size.Height - me.Location.Y - 1; + break; + case Rotation.R270: + zoomCenterLoc[wmNr0b].X = me.Location.Y; + zoomCenterLoc[wmNr0b].Y = pictureBox1.Size.Width - me.Location.X - 1; + break; + } + + zoomedImage = MakeZoomedImage(lastImage, zoomCenterLoc[wmNr0b]); + isZoomed[wmNr0b] = true; + ShowImage(); + } + else if (me.Button == MouseButtons.Right) + { + isZoomed[wmNr0b] = false; + ShowImage(); + } + } + + private void rotateImageButton_Click(object sender, EventArgs e) + { + if (lastImage == null) return; + + if (++imageRotation[wmNr0b] == Rotation.Count) + { + imageRotation[wmNr0b] = Rotation.R0; + } + ShowImage(); + } + + Bitmap MakeZoomedImage(Bitmap oriImage, Point centerLoc) + { + float picBoxW = (float)pictureBox1.Size.Width; + float picBoxH = (float)pictureBox1.Size.Height; + float newRelX = Math.Max(0, Math.Min(centerLoc.X / picBoxW - 0.25f, 0.5f)); + float newRelY = Math.Max(0, Math.Min(centerLoc.Y / picBoxH - 0.25f, 0.5f)); + + Rectangle newRect = new Rectangle((int)(newRelX * oriImage.Width), + (int)(newRelY * oriImage.Height), + oriImage.Width / 2, + oriImage.Height / 2); /// image resolution, 1280 x 960 + return lastImage.Clone(newRect, oriImage.PixelFormat); + } + + /// + /// Show selected image in the picture box. + /// lastImage, zoomedImage, isZoomed and imageRotation are used. + /// + void ShowImage() + { + if (lastImage == null) + { + pictureBox1.Image = new Bitmap(TBF.Properties.Resources.Empty); + return; + } + + Bitmap tempBmp = isZoomed[wmNr0b] + ? new Bitmap(zoomedImage.Clone(new Rectangle(0, 0, zoomedImage.Width, zoomedImage.Height), zoomedImage.PixelFormat)) + : new Bitmap(lastImage.Clone(new Rectangle(0, 0, lastImage.Width, lastImage.Height), lastImage.PixelFormat)); + + switch (imageRotation[wmNr0b]) + { + case Rotation.R90: tempBmp.RotateFlip(RotateFlipType.Rotate270FlipNone); break; + case Rotation.R180: tempBmp.RotateFlip(RotateFlipType.Rotate180FlipNone); break; + case Rotation.R270: tempBmp.RotateFlip(RotateFlipType.Rotate90FlipNone); break; + } + + pictureBox1.Image = tempBmp; + } + + + /// + /// Updates startLabel.Text, startLabel2.Text, endLabel.Text, endLabel2.Text + /// Appends appropriate units of volume. + /// Handles mouse clicks and Tab-changes inside text boxes. + /// + /// Tst.Start or Tst.End + /// 0..24 + void ShowUnits(Tst startEnd, int physPos) + { + int wmNr = phys2wm[physPos]; + + if (wmNr > 0 && startEnd == Tst.Start) + { + if (regReaders[wmNr - 1] != null) + { + if (physPos < 12) + { + startLabel.Text = string.Format("{0} [{1}]", Strings.Start, GetUnitStr(regReaders[wmNr - 1].PulsesPerLtr)); + startLabel2.Text = Strings.Start; + } + else + { + startLabel.Text = Strings.Start; + startLabel2.Text = string.Format("{0} [{1}]", Strings.Start, GetUnitStr(regReaders[wmNr - 1].PulsesPerLtr)); + } + } + else + { + startLabel.Text = startLabel2.Text = Strings.Start; + } + endLabel.Text = endLabel2.Text = Strings.End; + } + else if (wmNr > 0 && startEnd == Tst.End) + { + startLabel.Text = startLabel2.Text = Strings.Start; + + if (regReaders[wmNr - 1] != null) + { + if (physPos < 12) + { + endLabel.Text = string.Format("{0} [{1}]", Strings.End, GetUnitStr(regReaders[wmNr - 1].PulsesPerLtr)); + endLabel2.Text = Strings.End; + } + else + { + endLabel.Text = Strings.End; + endLabel2.Text = string.Format("{0} [{1}]", Strings.End, GetUnitStr(regReaders[wmNr - 1].PulsesPerLtr)); + } + } + else + { + endLabel.Text = endLabel2.Text = Strings.End; + } + } + else + { + startLabel.Text = startLabel2.Text = Strings.Start; + endLabel.Text = endLabel2.Text = Strings.End; + } + } + /// + string GetUnitStr(double pulsesPerLtr) + { + if (pulsesPerLtr == 1 || pulsesPerLtr <= float.Epsilon) + { + return "l"; + } + else if (pulsesPerLtr == 0.001) + { + return "m3"; + } + else if (pulsesPerLtr == 1000) + { + return "ml"; + } + else + { + return string.Format("{0} l", 1 / pulsesPerLtr); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/TestStartEndForm.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/TestStartEndForm.designer.cs new file mode 100644 index 00000000..5fbb9f1e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/TestStartEndForm.designer.cs @@ -0,0 +1,1665 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.StandardCamera +{ + partial class TestStartEndForm + { + /// + /// 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() + { + this.exclamation1 = new System.Windows.Forms.Label(); + this.startTextBox1 = new System.Windows.Forms.TextBox(); + this.endTextBox1 = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.okButton = new System.Windows.Forms.Button(); + this.exclamation3 = new System.Windows.Forms.Label(); + this.startTextBox3 = new System.Windows.Forms.TextBox(); + this.endTextBox3 = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.exclamation4 = new System.Windows.Forms.Label(); + this.startTextBox4 = new System.Windows.Forms.TextBox(); + this.endTextBox4 = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.exclamation5 = new System.Windows.Forms.Label(); + this.startTextBox5 = new System.Windows.Forms.TextBox(); + this.endTextBox5 = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.exclamation6 = new System.Windows.Forms.Label(); + this.startTextBox6 = new System.Windows.Forms.TextBox(); + this.endTextBox6 = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.startLabel = new System.Windows.Forms.Label(); + this.endLabel = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.endTextBox2 = new System.Windows.Forms.TextBox(); + this.startTextBox2 = new System.Windows.Forms.TextBox(); + this.exclamation2 = new System.Windows.Forms.Label(); + this.exclamation7 = new System.Windows.Forms.Label(); + this.startTextBox7 = new System.Windows.Forms.TextBox(); + this.endTextBox7 = new System.Windows.Forms.TextBox(); + this.label7 = new System.Windows.Forms.Label(); + this.exclamation8 = new System.Windows.Forms.Label(); + this.startTextBox8 = new System.Windows.Forms.TextBox(); + this.endTextBox8 = new System.Windows.Forms.TextBox(); + this.label8 = new System.Windows.Forms.Label(); + this.exclamation9 = new System.Windows.Forms.Label(); + this.startTextBox9 = new System.Windows.Forms.TextBox(); + this.endTextBox9 = new System.Windows.Forms.TextBox(); + this.label9 = new System.Windows.Forms.Label(); + this.exclamation10 = new System.Windows.Forms.Label(); + this.startTextBox10 = new System.Windows.Forms.TextBox(); + this.endTextBox10 = new System.Windows.Forms.TextBox(); + this.label10 = new System.Windows.Forms.Label(); + this.exclamation11 = new System.Windows.Forms.Label(); + this.startTextBox11 = new System.Windows.Forms.TextBox(); + this.endTextBox11 = new System.Windows.Forms.TextBox(); + this.label11 = new System.Windows.Forms.Label(); + this.exclamation12 = new System.Windows.Forms.Label(); + this.startTextBox12 = new System.Windows.Forms.TextBox(); + this.endTextBox12 = new System.Windows.Forms.TextBox(); + this.label12 = new System.Windows.Forms.Label(); + this.exclamation24 = new System.Windows.Forms.Label(); + this.startTextBox24 = new System.Windows.Forms.TextBox(); + this.endTextBox24 = new System.Windows.Forms.TextBox(); + this.label24 = new System.Windows.Forms.Label(); + this.exclamation23 = new System.Windows.Forms.Label(); + this.startTextBox23 = new System.Windows.Forms.TextBox(); + this.endTextBox23 = new System.Windows.Forms.TextBox(); + this.label23 = new System.Windows.Forms.Label(); + this.exclamation22 = new System.Windows.Forms.Label(); + this.startTextBox22 = new System.Windows.Forms.TextBox(); + this.endTextBox22 = new System.Windows.Forms.TextBox(); + this.label22 = new System.Windows.Forms.Label(); + this.exclamation21 = new System.Windows.Forms.Label(); + this.startTextBox21 = new System.Windows.Forms.TextBox(); + this.endTextBox21 = new System.Windows.Forms.TextBox(); + this.label21 = new System.Windows.Forms.Label(); + this.exclamation20 = new System.Windows.Forms.Label(); + this.startTextBox20 = new System.Windows.Forms.TextBox(); + this.endTextBox20 = new System.Windows.Forms.TextBox(); + this.label20 = new System.Windows.Forms.Label(); + this.exclamation19 = new System.Windows.Forms.Label(); + this.startTextBox19 = new System.Windows.Forms.TextBox(); + this.endTextBox19 = new System.Windows.Forms.TextBox(); + this.label19 = new System.Windows.Forms.Label(); + this.exclamation18 = new System.Windows.Forms.Label(); + this.exclamation17 = new System.Windows.Forms.Label(); + this.startTextBox18 = new System.Windows.Forms.TextBox(); + this.exclamation16 = new System.Windows.Forms.Label(); + this.endTextBox18 = new System.Windows.Forms.TextBox(); + this.label18 = new System.Windows.Forms.Label(); + this.startTextBox17 = new System.Windows.Forms.TextBox(); + this.exclamation15 = new System.Windows.Forms.Label(); + this.endTextBox17 = new System.Windows.Forms.TextBox(); + this.label17 = new System.Windows.Forms.Label(); + this.startTextBox16 = new System.Windows.Forms.TextBox(); + this.exclamation14 = new System.Windows.Forms.Label(); + this.endTextBox16 = new System.Windows.Forms.TextBox(); + this.label16 = new System.Windows.Forms.Label(); + this.startTextBox15 = new System.Windows.Forms.TextBox(); + this.exclamation13 = new System.Windows.Forms.Label(); + this.endTextBox15 = new System.Windows.Forms.TextBox(); + this.label15 = new System.Windows.Forms.Label(); + this.startTextBox14 = new System.Windows.Forms.TextBox(); + this.endLabel2 = new System.Windows.Forms.Label(); + this.endTextBox14 = new System.Windows.Forms.TextBox(); + this.label14 = new System.Windows.Forms.Label(); + this.startTextBox13 = new System.Windows.Forms.TextBox(); + this.startLabel2 = new System.Windows.Forms.Label(); + this.endTextBox13 = new System.Windows.Forms.TextBox(); + this.label13 = new System.Windows.Forms.Label(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.rotateImageButton = new System.Windows.Forms.Button(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.SuspendLayout(); + // + // exclamation1 + // + this.exclamation1.AutoSize = true; + this.exclamation1.Font = new System.Drawing.Font("Verdana", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation1.ForeColor = System.Drawing.Color.Red; + this.exclamation1.Location = new System.Drawing.Point(538, 521); + this.exclamation1.Name = "exclamation1"; + this.exclamation1.Size = new System.Drawing.Size(23, 29); + this.exclamation1.TabIndex = 5; + this.exclamation1.Text = "!"; + this.exclamation1.Visible = false; + // + // startTextBox1 + // + this.startTextBox1.Enabled = false; + this.startTextBox1.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox1.Location = new System.Drawing.Point(191, 525); + this.startTextBox1.Name = "startTextBox1"; + this.startTextBox1.Size = new System.Drawing.Size(163, 27); + this.startTextBox1.TabIndex = 3; + this.startTextBox1.Visible = false; + this.startTextBox1.AcceptsTabChanged += new System.EventHandler(this.startTextBox1_AcceptsTabChanged); + this.startTextBox1.TextChanged += new System.EventHandler(this.startTextBox1_TextChanged); + this.startTextBox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox1_KeyPress); + this.startTextBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.startTextBox1_MouseDown); + // + // endTextBox1 + // + this.endTextBox1.Enabled = false; + this.endTextBox1.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox1.Location = new System.Drawing.Point(373, 525); + this.endTextBox1.Name = "endTextBox1"; + this.endTextBox1.Size = new System.Drawing.Size(163, 27); + this.endTextBox1.TabIndex = 4; + this.endTextBox1.Visible = false; + this.endTextBox1.AcceptsTabChanged += new System.EventHandler(this.endTextBox1_AcceptsTabChanged); + this.endTextBox1.TextChanged += new System.EventHandler(this.endTextBox1_TextChanged); + this.endTextBox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox1_KeyPress); + this.endTextBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.endTextBox1_MouseDown); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label1.Location = new System.Drawing.Point(29, 528); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(126, 18); + this.label1.TabIndex = 2; + this.label1.Text = "Water Meter 1"; + this.label1.Visible = false; + // + // okButton + // + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(937, 54); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(98, 63); + this.okButton.TabIndex = 100; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // exclamation3 + // + this.exclamation3.AutoSize = true; + this.exclamation3.Font = new System.Drawing.Font("Verdana", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation3.ForeColor = System.Drawing.Color.Red; + this.exclamation3.Location = new System.Drawing.Point(538, 581); + this.exclamation3.Name = "exclamation3"; + this.exclamation3.Size = new System.Drawing.Size(23, 29); + this.exclamation3.TabIndex = 13; + this.exclamation3.Text = "!"; + this.exclamation3.Visible = false; + // + // startTextBox3 + // + this.startTextBox3.Enabled = false; + this.startTextBox3.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox3.Location = new System.Drawing.Point(191, 585); + this.startTextBox3.Name = "startTextBox3"; + this.startTextBox3.Size = new System.Drawing.Size(163, 27); + this.startTextBox3.TabIndex = 11; + this.startTextBox3.Visible = false; + this.startTextBox3.AcceptsTabChanged += new System.EventHandler(this.startTextBox3_AcceptsTabChanged); + this.startTextBox3.TextChanged += new System.EventHandler(this.startTextBox3_TextChanged); + this.startTextBox3.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox3_KeyPress); + this.startTextBox3.MouseDown += new System.Windows.Forms.MouseEventHandler(this.startTextBox3_MouseDown); + // + // endTextBox3 + // + this.endTextBox3.Enabled = false; + this.endTextBox3.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox3.Location = new System.Drawing.Point(373, 585); + this.endTextBox3.Name = "endTextBox3"; + this.endTextBox3.Size = new System.Drawing.Size(163, 27); + this.endTextBox3.TabIndex = 12; + this.endTextBox3.Visible = false; + this.endTextBox3.AcceptsTabChanged += new System.EventHandler(this.endTextBox3_AcceptsTabChanged); + this.endTextBox3.TextChanged += new System.EventHandler(this.endTextBox3_TextChanged); + this.endTextBox3.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox3_KeyPress); + this.endTextBox3.MouseDown += new System.Windows.Forms.MouseEventHandler(this.endTextBox3_MouseDown); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label3.Location = new System.Drawing.Point(29, 588); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(126, 18); + this.label3.TabIndex = 10; + this.label3.Text = "Water Meter 3"; + this.label3.Visible = false; + // + // exclamation4 + // + this.exclamation4.AutoSize = true; + this.exclamation4.Font = new System.Drawing.Font("Verdana", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation4.ForeColor = System.Drawing.Color.Red; + this.exclamation4.Location = new System.Drawing.Point(538, 611); + this.exclamation4.Name = "exclamation4"; + this.exclamation4.Size = new System.Drawing.Size(23, 29); + this.exclamation4.TabIndex = 17; + this.exclamation4.Text = "!"; + this.exclamation4.Visible = false; + // + // startTextBox4 + // + this.startTextBox4.Enabled = false; + this.startTextBox4.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox4.Location = new System.Drawing.Point(191, 615); + this.startTextBox4.Name = "startTextBox4"; + this.startTextBox4.Size = new System.Drawing.Size(163, 27); + this.startTextBox4.TabIndex = 15; + this.startTextBox4.Visible = false; + this.startTextBox4.AcceptsTabChanged += new System.EventHandler(this.startTextBox4_AcceptsTabChanged); + this.startTextBox4.TextChanged += new System.EventHandler(this.startTextBox4_TextChanged); + this.startTextBox4.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox4_KeyPress); + this.startTextBox4.MouseDown += new System.Windows.Forms.MouseEventHandler(this.startTextBox4_MouseDown); + // + // endTextBox4 + // + this.endTextBox4.Enabled = false; + this.endTextBox4.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox4.Location = new System.Drawing.Point(373, 615); + this.endTextBox4.Name = "endTextBox4"; + this.endTextBox4.Size = new System.Drawing.Size(163, 27); + this.endTextBox4.TabIndex = 16; + this.endTextBox4.Visible = false; + this.endTextBox4.AcceptsTabChanged += new System.EventHandler(this.endTextBox4_AcceptsTabChanged); + this.endTextBox4.TextChanged += new System.EventHandler(this.endTextBox4_TextChanged); + this.endTextBox4.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox4_KeyPress); + this.endTextBox4.MouseDown += new System.Windows.Forms.MouseEventHandler(this.endTextBox4_MouseDown); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label4.Location = new System.Drawing.Point(29, 618); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(126, 18); + this.label4.TabIndex = 14; + this.label4.Text = "Water Meter 4"; + this.label4.Visible = false; + // + // exclamation5 + // + this.exclamation5.AutoSize = true; + this.exclamation5.Font = new System.Drawing.Font("Verdana", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation5.ForeColor = System.Drawing.Color.Red; + this.exclamation5.Location = new System.Drawing.Point(538, 641); + this.exclamation5.Name = "exclamation5"; + this.exclamation5.Size = new System.Drawing.Size(23, 29); + this.exclamation5.TabIndex = 21; + this.exclamation5.Text = "!"; + this.exclamation5.Visible = false; + // + // startTextBox5 + // + this.startTextBox5.Enabled = false; + this.startTextBox5.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox5.Location = new System.Drawing.Point(191, 645); + this.startTextBox5.Name = "startTextBox5"; + this.startTextBox5.Size = new System.Drawing.Size(163, 27); + this.startTextBox5.TabIndex = 19; + this.startTextBox5.Visible = false; + this.startTextBox5.AcceptsTabChanged += new System.EventHandler(this.startTextBox5_AcceptsTabChanged); + this.startTextBox5.TextChanged += new System.EventHandler(this.startTextBox5_TextChanged); + this.startTextBox5.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox5_KeyPress); + this.startTextBox5.MouseDown += new System.Windows.Forms.MouseEventHandler(this.startTextBox5_MouseDown); + // + // endTextBox5 + // + this.endTextBox5.Enabled = false; + this.endTextBox5.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox5.Location = new System.Drawing.Point(373, 645); + this.endTextBox5.Name = "endTextBox5"; + this.endTextBox5.Size = new System.Drawing.Size(163, 27); + this.endTextBox5.TabIndex = 20; + this.endTextBox5.Visible = false; + this.endTextBox5.AcceptsTabChanged += new System.EventHandler(this.endTextBox5_AcceptsTabChanged); + this.endTextBox5.TextChanged += new System.EventHandler(this.endTextBox5_TextChanged); + this.endTextBox5.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox5_KeyPress); + this.endTextBox5.MouseDown += new System.Windows.Forms.MouseEventHandler(this.endTextBox5_MouseDown); + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label5.Location = new System.Drawing.Point(29, 648); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(126, 18); + this.label5.TabIndex = 18; + this.label5.Text = "Water Meter 5"; + this.label5.Visible = false; + // + // exclamation6 + // + this.exclamation6.AutoSize = true; + this.exclamation6.Font = new System.Drawing.Font("Verdana", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation6.ForeColor = System.Drawing.Color.Red; + this.exclamation6.Location = new System.Drawing.Point(538, 671); + this.exclamation6.Name = "exclamation6"; + this.exclamation6.Size = new System.Drawing.Size(23, 29); + this.exclamation6.TabIndex = 25; + this.exclamation6.Text = "!"; + this.exclamation6.Visible = false; + // + // startTextBox6 + // + this.startTextBox6.Enabled = false; + this.startTextBox6.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox6.Location = new System.Drawing.Point(191, 675); + this.startTextBox6.Name = "startTextBox6"; + this.startTextBox6.Size = new System.Drawing.Size(163, 27); + this.startTextBox6.TabIndex = 23; + this.startTextBox6.Visible = false; + this.startTextBox6.AcceptsTabChanged += new System.EventHandler(this.startTextBox6_AcceptsTabChanged); + this.startTextBox6.TextChanged += new System.EventHandler(this.startTextBox6_TextChanged); + this.startTextBox6.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox6_KeyPress); + this.startTextBox6.MouseDown += new System.Windows.Forms.MouseEventHandler(this.startTextBox6_MouseDown); + // + // endTextBox6 + // + this.endTextBox6.Enabled = false; + this.endTextBox6.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox6.Location = new System.Drawing.Point(373, 675); + this.endTextBox6.Name = "endTextBox6"; + this.endTextBox6.Size = new System.Drawing.Size(163, 27); + this.endTextBox6.TabIndex = 24; + this.endTextBox6.Visible = false; + this.endTextBox6.AcceptsTabChanged += new System.EventHandler(this.endTextBox6_AcceptsTabChanged); + this.endTextBox6.TextChanged += new System.EventHandler(this.endTextBox6_TextChanged); + this.endTextBox6.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox6_KeyPress); + this.endTextBox6.MouseDown += new System.Windows.Forms.MouseEventHandler(this.endTextBox6_MouseDown); + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label6.Location = new System.Drawing.Point(29, 678); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(126, 18); + this.label6.TabIndex = 22; + this.label6.Text = "Water Meter 6"; + this.label6.Visible = false; + // + // startLabel + // + this.startLabel.AutoSize = true; + this.startLabel.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startLabel.Location = new System.Drawing.Point(237, 500); + this.startLabel.Name = "startLabel"; + this.startLabel.Size = new System.Drawing.Size(48, 18); + this.startLabel.TabIndex = 0; + this.startLabel.Text = "Start"; + // + // endLabel + // + this.endLabel.AutoSize = true; + this.endLabel.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endLabel.Location = new System.Drawing.Point(423, 500); + this.endLabel.Name = "endLabel"; + this.endLabel.Size = new System.Drawing.Size(38, 18); + this.endLabel.TabIndex = 1; + this.endLabel.Text = "End"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label2.Location = new System.Drawing.Point(29, 558); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(126, 18); + this.label2.TabIndex = 6; + this.label2.Text = "Water Meter 2"; + this.label2.Visible = false; + // + // endTextBox2 + // + this.endTextBox2.Enabled = false; + this.endTextBox2.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox2.Location = new System.Drawing.Point(373, 555); + this.endTextBox2.Name = "endTextBox2"; + this.endTextBox2.Size = new System.Drawing.Size(163, 27); + this.endTextBox2.TabIndex = 8; + this.endTextBox2.Visible = false; + this.endTextBox2.AcceptsTabChanged += new System.EventHandler(this.endTextBox2_AcceptsTabChanged); + this.endTextBox2.TextChanged += new System.EventHandler(this.endTextBox2_TextChanged); + this.endTextBox2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox2_KeyPress); + this.endTextBox2.MouseDown += new System.Windows.Forms.MouseEventHandler(this.endTextBox2_MouseDown); + // + // startTextBox2 + // + this.startTextBox2.Enabled = false; + this.startTextBox2.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox2.Location = new System.Drawing.Point(191, 555); + this.startTextBox2.Name = "startTextBox2"; + this.startTextBox2.Size = new System.Drawing.Size(163, 27); + this.startTextBox2.TabIndex = 7; + this.startTextBox2.Visible = false; + this.startTextBox2.AcceptsTabChanged += new System.EventHandler(this.startTextBox2_AcceptsTabChanged); + this.startTextBox2.TextChanged += new System.EventHandler(this.startTextBox2_TextChanged); + this.startTextBox2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox2_KeyPress); + this.startTextBox2.MouseDown += new System.Windows.Forms.MouseEventHandler(this.startTextBox2_MouseDown); + // + // exclamation2 + // + this.exclamation2.AutoSize = true; + this.exclamation2.Font = new System.Drawing.Font("Verdana", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation2.ForeColor = System.Drawing.Color.Red; + this.exclamation2.Location = new System.Drawing.Point(538, 551); + this.exclamation2.Name = "exclamation2"; + this.exclamation2.Size = new System.Drawing.Size(23, 29); + this.exclamation2.TabIndex = 9; + this.exclamation2.Text = "!"; + this.exclamation2.Visible = false; + // + // exclamation7 + // + this.exclamation7.AutoSize = true; + this.exclamation7.Font = new System.Drawing.Font("Verdana", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation7.ForeColor = System.Drawing.Color.Red; + this.exclamation7.Location = new System.Drawing.Point(538, 701); + this.exclamation7.Name = "exclamation7"; + this.exclamation7.Size = new System.Drawing.Size(23, 29); + this.exclamation7.TabIndex = 29; + this.exclamation7.Text = "!"; + this.exclamation7.Visible = false; + // + // startTextBox7 + // + this.startTextBox7.Enabled = false; + this.startTextBox7.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox7.Location = new System.Drawing.Point(191, 705); + this.startTextBox7.Name = "startTextBox7"; + this.startTextBox7.Size = new System.Drawing.Size(163, 27); + this.startTextBox7.TabIndex = 27; + this.startTextBox7.Visible = false; + this.startTextBox7.AcceptsTabChanged += new System.EventHandler(this.startTextBox7_AcceptsTabChanged); + this.startTextBox7.TextChanged += new System.EventHandler(this.startTextBox7_TextChanged); + this.startTextBox7.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox7_KeyPress); + this.startTextBox7.MouseDown += new System.Windows.Forms.MouseEventHandler(this.startTextBox7_MouseDown); + // + // endTextBox7 + // + this.endTextBox7.Enabled = false; + this.endTextBox7.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox7.Location = new System.Drawing.Point(373, 705); + this.endTextBox7.Name = "endTextBox7"; + this.endTextBox7.Size = new System.Drawing.Size(163, 27); + this.endTextBox7.TabIndex = 28; + this.endTextBox7.Visible = false; + this.endTextBox7.AcceptsTabChanged += new System.EventHandler(this.endTextBox7_AcceptsTabChanged); + this.endTextBox7.TextChanged += new System.EventHandler(this.endTextBox7_TextChanged); + this.endTextBox7.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox7_KeyPress); + this.endTextBox7.MouseDown += new System.Windows.Forms.MouseEventHandler(this.endTextBox7_MouseDown); + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label7.Location = new System.Drawing.Point(29, 708); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(126, 18); + this.label7.TabIndex = 26; + this.label7.Text = "Water Meter 7"; + this.label7.Visible = false; + // + // exclamation8 + // + this.exclamation8.AutoSize = true; + this.exclamation8.Font = new System.Drawing.Font("Verdana", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation8.ForeColor = System.Drawing.Color.Red; + this.exclamation8.Location = new System.Drawing.Point(538, 731); + this.exclamation8.Name = "exclamation8"; + this.exclamation8.Size = new System.Drawing.Size(23, 29); + this.exclamation8.TabIndex = 33; + this.exclamation8.Text = "!"; + this.exclamation8.Visible = false; + // + // startTextBox8 + // + this.startTextBox8.Enabled = false; + this.startTextBox8.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox8.Location = new System.Drawing.Point(191, 735); + this.startTextBox8.Name = "startTextBox8"; + this.startTextBox8.Size = new System.Drawing.Size(163, 27); + this.startTextBox8.TabIndex = 31; + this.startTextBox8.Visible = false; + this.startTextBox8.AcceptsTabChanged += new System.EventHandler(this.startTextBox8_AcceptsTabChanged); + this.startTextBox8.TextChanged += new System.EventHandler(this.startTextBox8_TextChanged); + this.startTextBox8.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox8_KeyPress); + this.startTextBox8.MouseDown += new System.Windows.Forms.MouseEventHandler(this.startTextBox8_MouseDown); + // + // endTextBox8 + // + this.endTextBox8.Enabled = false; + this.endTextBox8.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox8.Location = new System.Drawing.Point(373, 735); + this.endTextBox8.Name = "endTextBox8"; + this.endTextBox8.Size = new System.Drawing.Size(163, 27); + this.endTextBox8.TabIndex = 32; + this.endTextBox8.Visible = false; + this.endTextBox8.AcceptsTabChanged += new System.EventHandler(this.endTextBox8_AcceptsTabChanged); + this.endTextBox8.TextChanged += new System.EventHandler(this.endTextBox8_TextChanged); + this.endTextBox8.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox8_KeyPress); + this.endTextBox8.MouseDown += new System.Windows.Forms.MouseEventHandler(this.endTextBox8_MouseDown); + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label8.Location = new System.Drawing.Point(29, 738); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(126, 18); + this.label8.TabIndex = 30; + this.label8.Text = "Water Meter 8"; + this.label8.Visible = false; + // + // exclamation9 + // + this.exclamation9.AutoSize = true; + this.exclamation9.Font = new System.Drawing.Font("Verdana", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation9.ForeColor = System.Drawing.Color.Red; + this.exclamation9.Location = new System.Drawing.Point(538, 761); + this.exclamation9.Name = "exclamation9"; + this.exclamation9.Size = new System.Drawing.Size(23, 29); + this.exclamation9.TabIndex = 37; + this.exclamation9.Text = "!"; + this.exclamation9.Visible = false; + // + // startTextBox9 + // + this.startTextBox9.Enabled = false; + this.startTextBox9.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox9.Location = new System.Drawing.Point(191, 765); + this.startTextBox9.Name = "startTextBox9"; + this.startTextBox9.Size = new System.Drawing.Size(163, 27); + this.startTextBox9.TabIndex = 35; + this.startTextBox9.Visible = false; + this.startTextBox9.AcceptsTabChanged += new System.EventHandler(this.startTextBox9_AcceptsTabChanged); + this.startTextBox9.TextChanged += new System.EventHandler(this.startTextBox9_TextChanged); + this.startTextBox9.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox9_KeyPress); + this.startTextBox9.MouseDown += new System.Windows.Forms.MouseEventHandler(this.startTextBox9_MouseDown); + // + // endTextBox9 + // + this.endTextBox9.Enabled = false; + this.endTextBox9.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox9.Location = new System.Drawing.Point(373, 765); + this.endTextBox9.Name = "endTextBox9"; + this.endTextBox9.Size = new System.Drawing.Size(163, 27); + this.endTextBox9.TabIndex = 36; + this.endTextBox9.Visible = false; + this.endTextBox9.AcceptsTabChanged += new System.EventHandler(this.endTextBox9_AcceptsTabChanged); + this.endTextBox9.TextChanged += new System.EventHandler(this.endTextBox9_TextChanged); + this.endTextBox9.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox9_KeyPress); + this.endTextBox9.MouseDown += new System.Windows.Forms.MouseEventHandler(this.endTextBox9_MouseDown); + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label9.Location = new System.Drawing.Point(29, 768); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(126, 18); + this.label9.TabIndex = 34; + this.label9.Text = "Water Meter 9"; + this.label9.Visible = false; + // + // exclamation10 + // + this.exclamation10.AutoSize = true; + this.exclamation10.Font = new System.Drawing.Font("Verdana", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation10.ForeColor = System.Drawing.Color.Red; + this.exclamation10.Location = new System.Drawing.Point(538, 791); + this.exclamation10.Name = "exclamation10"; + this.exclamation10.Size = new System.Drawing.Size(23, 29); + this.exclamation10.TabIndex = 41; + this.exclamation10.Text = "!"; + this.exclamation10.Visible = false; + // + // startTextBox10 + // + this.startTextBox10.Enabled = false; + this.startTextBox10.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox10.Location = new System.Drawing.Point(191, 795); + this.startTextBox10.Name = "startTextBox10"; + this.startTextBox10.Size = new System.Drawing.Size(163, 27); + this.startTextBox10.TabIndex = 39; + this.startTextBox10.Visible = false; + this.startTextBox10.AcceptsTabChanged += new System.EventHandler(this.startTextBox10_AcceptsTabChanged); + this.startTextBox10.TextChanged += new System.EventHandler(this.startTextBox10_TextChanged); + this.startTextBox10.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox10_KeyPress); + this.startTextBox10.MouseDown += new System.Windows.Forms.MouseEventHandler(this.startTextBox10_MouseDown); + // + // endTextBox10 + // + this.endTextBox10.Enabled = false; + this.endTextBox10.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox10.Location = new System.Drawing.Point(373, 795); + this.endTextBox10.Name = "endTextBox10"; + this.endTextBox10.Size = new System.Drawing.Size(163, 27); + this.endTextBox10.TabIndex = 40; + this.endTextBox10.Visible = false; + this.endTextBox10.AcceptsTabChanged += new System.EventHandler(this.endTextBox10_AcceptsTabChanged); + this.endTextBox10.TextChanged += new System.EventHandler(this.endTextBox10_TextChanged); + this.endTextBox10.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox10_KeyPress); + this.endTextBox10.MouseDown += new System.Windows.Forms.MouseEventHandler(this.endTextBox10_MouseDown); + // + // label10 + // + this.label10.AutoSize = true; + this.label10.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label10.Location = new System.Drawing.Point(29, 798); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(136, 18); + this.label10.TabIndex = 38; + this.label10.Text = "Water Meter 10"; + this.label10.Visible = false; + // + // exclamation11 + // + this.exclamation11.AutoSize = true; + this.exclamation11.Font = new System.Drawing.Font("Verdana", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation11.ForeColor = System.Drawing.Color.Red; + this.exclamation11.Location = new System.Drawing.Point(538, 821); + this.exclamation11.Name = "exclamation11"; + this.exclamation11.Size = new System.Drawing.Size(23, 29); + this.exclamation11.TabIndex = 45; + this.exclamation11.Text = "!"; + this.exclamation11.Visible = false; + // + // startTextBox11 + // + this.startTextBox11.Enabled = false; + this.startTextBox11.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox11.Location = new System.Drawing.Point(191, 825); + this.startTextBox11.Name = "startTextBox11"; + this.startTextBox11.Size = new System.Drawing.Size(163, 27); + this.startTextBox11.TabIndex = 43; + this.startTextBox11.Visible = false; + this.startTextBox11.AcceptsTabChanged += new System.EventHandler(this.startTextBox11_AcceptsTabChanged); + this.startTextBox11.TextChanged += new System.EventHandler(this.startTextBox11_TextChanged); + this.startTextBox11.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox11_KeyPress); + this.startTextBox11.MouseDown += new System.Windows.Forms.MouseEventHandler(this.startTextBox11_MouseDown); + // + // endTextBox11 + // + this.endTextBox11.Enabled = false; + this.endTextBox11.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox11.Location = new System.Drawing.Point(373, 825); + this.endTextBox11.Name = "endTextBox11"; + this.endTextBox11.Size = new System.Drawing.Size(163, 27); + this.endTextBox11.TabIndex = 44; + this.endTextBox11.Visible = false; + this.endTextBox11.AcceptsTabChanged += new System.EventHandler(this.endTextBox11_AcceptsTabChanged); + this.endTextBox11.TextChanged += new System.EventHandler(this.endTextBox11_TextChanged); + this.endTextBox11.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox11_KeyPress); + this.endTextBox11.MouseDown += new System.Windows.Forms.MouseEventHandler(this.endTextBox11_MouseDown); + // + // label11 + // + this.label11.AutoSize = true; + this.label11.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label11.Location = new System.Drawing.Point(29, 828); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(136, 18); + this.label11.TabIndex = 42; + this.label11.Text = "Water Meter 11"; + this.label11.Visible = false; + // + // exclamation12 + // + this.exclamation12.AutoSize = true; + this.exclamation12.Font = new System.Drawing.Font("Verdana", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation12.ForeColor = System.Drawing.Color.Red; + this.exclamation12.Location = new System.Drawing.Point(538, 851); + this.exclamation12.Name = "exclamation12"; + this.exclamation12.Size = new System.Drawing.Size(23, 29); + this.exclamation12.TabIndex = 49; + this.exclamation12.Text = "!"; + this.exclamation12.Visible = false; + // + // startTextBox12 + // + this.startTextBox12.Enabled = false; + this.startTextBox12.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox12.Location = new System.Drawing.Point(191, 855); + this.startTextBox12.Name = "startTextBox12"; + this.startTextBox12.Size = new System.Drawing.Size(163, 27); + this.startTextBox12.TabIndex = 47; + this.startTextBox12.Visible = false; + this.startTextBox12.AcceptsTabChanged += new System.EventHandler(this.startTextBox12_AcceptsTabChanged); + this.startTextBox12.TextChanged += new System.EventHandler(this.startTextBox12_TextChanged); + this.startTextBox12.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox12_KeyPress); + this.startTextBox12.MouseDown += new System.Windows.Forms.MouseEventHandler(this.startTextBox12_MouseDown); + // + // endTextBox12 + // + this.endTextBox12.Enabled = false; + this.endTextBox12.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox12.Location = new System.Drawing.Point(373, 855); + this.endTextBox12.Name = "endTextBox12"; + this.endTextBox12.Size = new System.Drawing.Size(163, 27); + this.endTextBox12.TabIndex = 48; + this.endTextBox12.Visible = false; + this.endTextBox12.AcceptsTabChanged += new System.EventHandler(this.endTextBox12_AcceptsTabChanged); + this.endTextBox12.TextChanged += new System.EventHandler(this.endTextBox12_TextChanged); + this.endTextBox12.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox12_KeyPress); + this.endTextBox12.MouseDown += new System.Windows.Forms.MouseEventHandler(this.endTextBox12_MouseDown); + // + // label12 + // + this.label12.AutoSize = true; + this.label12.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label12.Location = new System.Drawing.Point(29, 858); + this.label12.Name = "label12"; + this.label12.Size = new System.Drawing.Size(136, 18); + this.label12.TabIndex = 46; + this.label12.Text = "Water Meter 12"; + this.label12.Visible = false; + // + // exclamation24 + // + this.exclamation24.AutoSize = true; + this.exclamation24.Font = new System.Drawing.Font("Verdana", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation24.ForeColor = System.Drawing.Color.Red; + this.exclamation24.Location = new System.Drawing.Point(1107, 851); + this.exclamation24.Name = "exclamation24"; + this.exclamation24.Size = new System.Drawing.Size(23, 29); + this.exclamation24.TabIndex = 99; + this.exclamation24.Text = "!"; + this.exclamation24.Visible = false; + // + // startTextBox24 + // + this.startTextBox24.Enabled = false; + this.startTextBox24.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox24.Location = new System.Drawing.Point(760, 855); + this.startTextBox24.Name = "startTextBox24"; + this.startTextBox24.Size = new System.Drawing.Size(163, 27); + this.startTextBox24.TabIndex = 97; + this.startTextBox24.Visible = false; + this.startTextBox24.AcceptsTabChanged += new System.EventHandler(this.startTextBox24_AcceptsTabChanged); + this.startTextBox24.TextChanged += new System.EventHandler(this.startTextBox24_TextChanged); + this.startTextBox24.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox24_KeyPress); + this.startTextBox24.MouseDown += new System.Windows.Forms.MouseEventHandler(this.startTextBox24_MouseDown); + // + // endTextBox24 + // + this.endTextBox24.Enabled = false; + this.endTextBox24.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox24.Location = new System.Drawing.Point(942, 855); + this.endTextBox24.Name = "endTextBox24"; + this.endTextBox24.Size = new System.Drawing.Size(163, 27); + this.endTextBox24.TabIndex = 98; + this.endTextBox24.Visible = false; + this.endTextBox24.AcceptsTabChanged += new System.EventHandler(this.endTextBox24_AcceptsTabChanged); + this.endTextBox24.TextChanged += new System.EventHandler(this.endTextBox24_TextChanged); + this.endTextBox24.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox24_KeyPress); + this.endTextBox24.MouseDown += new System.Windows.Forms.MouseEventHandler(this.endTextBox24_MouseDown); + // + // label24 + // + this.label24.AutoSize = true; + this.label24.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label24.Location = new System.Drawing.Point(598, 858); + this.label24.Name = "label24"; + this.label24.Size = new System.Drawing.Size(136, 18); + this.label24.TabIndex = 96; + this.label24.Text = "Water Meter 24"; + this.label24.Visible = false; + // + // exclamation23 + // + this.exclamation23.AutoSize = true; + this.exclamation23.Font = new System.Drawing.Font("Verdana", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation23.ForeColor = System.Drawing.Color.Red; + this.exclamation23.Location = new System.Drawing.Point(1107, 821); + this.exclamation23.Name = "exclamation23"; + this.exclamation23.Size = new System.Drawing.Size(23, 29); + this.exclamation23.TabIndex = 95; + this.exclamation23.Text = "!"; + this.exclamation23.Visible = false; + // + // startTextBox23 + // + this.startTextBox23.Enabled = false; + this.startTextBox23.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox23.Location = new System.Drawing.Point(760, 825); + this.startTextBox23.Name = "startTextBox23"; + this.startTextBox23.Size = new System.Drawing.Size(163, 27); + this.startTextBox23.TabIndex = 93; + this.startTextBox23.Visible = false; + this.startTextBox23.AcceptsTabChanged += new System.EventHandler(this.startTextBox23_AcceptsTabChanged); + this.startTextBox23.TextChanged += new System.EventHandler(this.startTextBox23_TextChanged); + this.startTextBox23.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox23_KeyPress); + this.startTextBox23.MouseDown += new System.Windows.Forms.MouseEventHandler(this.startTextBox23_MouseDown); + // + // endTextBox23 + // + this.endTextBox23.Enabled = false; + this.endTextBox23.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox23.Location = new System.Drawing.Point(942, 825); + this.endTextBox23.Name = "endTextBox23"; + this.endTextBox23.Size = new System.Drawing.Size(163, 27); + this.endTextBox23.TabIndex = 94; + this.endTextBox23.Visible = false; + this.endTextBox23.AcceptsTabChanged += new System.EventHandler(this.endTextBox23_AcceptsTabChanged); + this.endTextBox23.TextChanged += new System.EventHandler(this.endTextBox23_TextChanged); + this.endTextBox23.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox23_KeyPress); + this.endTextBox23.MouseDown += new System.Windows.Forms.MouseEventHandler(this.endTextBox23_MouseDown); + // + // label23 + // + this.label23.AutoSize = true; + this.label23.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label23.Location = new System.Drawing.Point(598, 828); + this.label23.Name = "label23"; + this.label23.Size = new System.Drawing.Size(136, 18); + this.label23.TabIndex = 92; + this.label23.Text = "Water Meter 23"; + this.label23.Visible = false; + // + // exclamation22 + // + this.exclamation22.AutoSize = true; + this.exclamation22.Font = new System.Drawing.Font("Verdana", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation22.ForeColor = System.Drawing.Color.Red; + this.exclamation22.Location = new System.Drawing.Point(1107, 791); + this.exclamation22.Name = "exclamation22"; + this.exclamation22.Size = new System.Drawing.Size(23, 29); + this.exclamation22.TabIndex = 91; + this.exclamation22.Text = "!"; + this.exclamation22.Visible = false; + // + // startTextBox22 + // + this.startTextBox22.Enabled = false; + this.startTextBox22.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox22.Location = new System.Drawing.Point(760, 795); + this.startTextBox22.Name = "startTextBox22"; + this.startTextBox22.Size = new System.Drawing.Size(163, 27); + this.startTextBox22.TabIndex = 89; + this.startTextBox22.Visible = false; + this.startTextBox22.AcceptsTabChanged += new System.EventHandler(this.startTextBox22_AcceptsTabChanged); + this.startTextBox22.TextChanged += new System.EventHandler(this.startTextBox22_TextChanged); + this.startTextBox22.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox22_KeyPress); + this.startTextBox22.MouseDown += new System.Windows.Forms.MouseEventHandler(this.startTextBox22_MouseDown); + // + // endTextBox22 + // + this.endTextBox22.Enabled = false; + this.endTextBox22.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox22.Location = new System.Drawing.Point(942, 795); + this.endTextBox22.Name = "endTextBox22"; + this.endTextBox22.Size = new System.Drawing.Size(163, 27); + this.endTextBox22.TabIndex = 90; + this.endTextBox22.Visible = false; + this.endTextBox22.AcceptsTabChanged += new System.EventHandler(this.endTextBox22_AcceptsTabChanged); + this.endTextBox22.TextChanged += new System.EventHandler(this.endTextBox22_TextChanged); + this.endTextBox22.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox22_KeyPress); + this.endTextBox22.MouseDown += new System.Windows.Forms.MouseEventHandler(this.endTextBox22_MouseDown); + // + // label22 + // + this.label22.AutoSize = true; + this.label22.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label22.Location = new System.Drawing.Point(598, 798); + this.label22.Name = "label22"; + this.label22.Size = new System.Drawing.Size(136, 18); + this.label22.TabIndex = 88; + this.label22.Text = "Water Meter 22"; + this.label22.Visible = false; + // + // exclamation21 + // + this.exclamation21.AutoSize = true; + this.exclamation21.Font = new System.Drawing.Font("Verdana", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation21.ForeColor = System.Drawing.Color.Red; + this.exclamation21.Location = new System.Drawing.Point(1107, 761); + this.exclamation21.Name = "exclamation21"; + this.exclamation21.Size = new System.Drawing.Size(23, 29); + this.exclamation21.TabIndex = 87; + this.exclamation21.Text = "!"; + this.exclamation21.Visible = false; + // + // startTextBox21 + // + this.startTextBox21.Enabled = false; + this.startTextBox21.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox21.Location = new System.Drawing.Point(760, 765); + this.startTextBox21.Name = "startTextBox21"; + this.startTextBox21.Size = new System.Drawing.Size(163, 27); + this.startTextBox21.TabIndex = 85; + this.startTextBox21.Visible = false; + this.startTextBox21.AcceptsTabChanged += new System.EventHandler(this.startTextBox21_AcceptsTabChanged); + this.startTextBox21.TextChanged += new System.EventHandler(this.startTextBox21_TextChanged); + this.startTextBox21.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox21_KeyPress); + this.startTextBox21.MouseDown += new System.Windows.Forms.MouseEventHandler(this.startTextBox21_MouseDown); + // + // endTextBox21 + // + this.endTextBox21.Enabled = false; + this.endTextBox21.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox21.Location = new System.Drawing.Point(942, 765); + this.endTextBox21.Name = "endTextBox21"; + this.endTextBox21.Size = new System.Drawing.Size(163, 27); + this.endTextBox21.TabIndex = 86; + this.endTextBox21.Visible = false; + this.endTextBox21.AcceptsTabChanged += new System.EventHandler(this.endTextBox21_AcceptsTabChanged); + this.endTextBox21.TextChanged += new System.EventHandler(this.endTextBox21_TextChanged); + this.endTextBox21.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox21_KeyPress); + this.endTextBox21.MouseDown += new System.Windows.Forms.MouseEventHandler(this.endTextBox21_MouseDown); + // + // label21 + // + this.label21.AutoSize = true; + this.label21.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label21.Location = new System.Drawing.Point(598, 768); + this.label21.Name = "label21"; + this.label21.Size = new System.Drawing.Size(136, 18); + this.label21.TabIndex = 84; + this.label21.Text = "Water Meter 21"; + this.label21.Visible = false; + // + // exclamation20 + // + this.exclamation20.AutoSize = true; + this.exclamation20.Font = new System.Drawing.Font("Verdana", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation20.ForeColor = System.Drawing.Color.Red; + this.exclamation20.Location = new System.Drawing.Point(1107, 731); + this.exclamation20.Name = "exclamation20"; + this.exclamation20.Size = new System.Drawing.Size(23, 29); + this.exclamation20.TabIndex = 83; + this.exclamation20.Text = "!"; + this.exclamation20.Visible = false; + // + // startTextBox20 + // + this.startTextBox20.Enabled = false; + this.startTextBox20.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox20.Location = new System.Drawing.Point(760, 735); + this.startTextBox20.Name = "startTextBox20"; + this.startTextBox20.Size = new System.Drawing.Size(163, 27); + this.startTextBox20.TabIndex = 81; + this.startTextBox20.Visible = false; + this.startTextBox20.AcceptsTabChanged += new System.EventHandler(this.startTextBox20_AcceptsTabChanged); + this.startTextBox20.TextChanged += new System.EventHandler(this.startTextBox20_TextChanged); + this.startTextBox20.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox20_KeyPress); + this.startTextBox20.MouseDown += new System.Windows.Forms.MouseEventHandler(this.startTextBox20_MouseDown); + // + // endTextBox20 + // + this.endTextBox20.Enabled = false; + this.endTextBox20.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox20.Location = new System.Drawing.Point(942, 735); + this.endTextBox20.Name = "endTextBox20"; + this.endTextBox20.Size = new System.Drawing.Size(163, 27); + this.endTextBox20.TabIndex = 82; + this.endTextBox20.Visible = false; + this.endTextBox20.AcceptsTabChanged += new System.EventHandler(this.endTextBox20_AcceptsTabChanged); + this.endTextBox20.TextChanged += new System.EventHandler(this.endTextBox20_TextChanged); + this.endTextBox20.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox20_KeyPress); + this.endTextBox20.MouseDown += new System.Windows.Forms.MouseEventHandler(this.endTextBox20_MouseDown); + // + // label20 + // + this.label20.AutoSize = true; + this.label20.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label20.Location = new System.Drawing.Point(598, 738); + this.label20.Name = "label20"; + this.label20.Size = new System.Drawing.Size(136, 18); + this.label20.TabIndex = 80; + this.label20.Text = "Water Meter 20"; + this.label20.Visible = false; + // + // exclamation19 + // + this.exclamation19.AutoSize = true; + this.exclamation19.Font = new System.Drawing.Font("Verdana", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation19.ForeColor = System.Drawing.Color.Red; + this.exclamation19.Location = new System.Drawing.Point(1107, 701); + this.exclamation19.Name = "exclamation19"; + this.exclamation19.Size = new System.Drawing.Size(23, 29); + this.exclamation19.TabIndex = 79; + this.exclamation19.Text = "!"; + this.exclamation19.Visible = false; + // + // startTextBox19 + // + this.startTextBox19.Enabled = false; + this.startTextBox19.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox19.Location = new System.Drawing.Point(760, 705); + this.startTextBox19.Name = "startTextBox19"; + this.startTextBox19.Size = new System.Drawing.Size(163, 27); + this.startTextBox19.TabIndex = 77; + this.startTextBox19.Visible = false; + this.startTextBox19.AcceptsTabChanged += new System.EventHandler(this.startTextBox19_AcceptsTabChanged); + this.startTextBox19.TextChanged += new System.EventHandler(this.startTextBox19_TextChanged); + this.startTextBox19.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox19_KeyPress); + this.startTextBox19.MouseDown += new System.Windows.Forms.MouseEventHandler(this.startTextBox19_MouseDown); + // + // endTextBox19 + // + this.endTextBox19.Enabled = false; + this.endTextBox19.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox19.Location = new System.Drawing.Point(942, 705); + this.endTextBox19.Name = "endTextBox19"; + this.endTextBox19.Size = new System.Drawing.Size(163, 27); + this.endTextBox19.TabIndex = 78; + this.endTextBox19.Visible = false; + this.endTextBox19.AcceptsTabChanged += new System.EventHandler(this.endTextBox19_AcceptsTabChanged); + this.endTextBox19.TextChanged += new System.EventHandler(this.endTextBox19_TextChanged); + this.endTextBox19.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox19_KeyPress); + this.endTextBox19.MouseDown += new System.Windows.Forms.MouseEventHandler(this.endTextBox19_MouseDown); + // + // label19 + // + this.label19.AutoSize = true; + this.label19.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label19.Location = new System.Drawing.Point(598, 708); + this.label19.Name = "label19"; + this.label19.Size = new System.Drawing.Size(136, 18); + this.label19.TabIndex = 76; + this.label19.Text = "Water Meter 19"; + this.label19.Visible = false; + // + // exclamation18 + // + this.exclamation18.AutoSize = true; + this.exclamation18.Font = new System.Drawing.Font("Verdana", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation18.ForeColor = System.Drawing.Color.Red; + this.exclamation18.Location = new System.Drawing.Point(1107, 671); + this.exclamation18.Name = "exclamation18"; + this.exclamation18.Size = new System.Drawing.Size(23, 29); + this.exclamation18.TabIndex = 75; + this.exclamation18.Text = "!"; + this.exclamation18.Visible = false; + // + // exclamation17 + // + this.exclamation17.AutoSize = true; + this.exclamation17.Font = new System.Drawing.Font("Verdana", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation17.ForeColor = System.Drawing.Color.Red; + this.exclamation17.Location = new System.Drawing.Point(1107, 641); + this.exclamation17.Name = "exclamation17"; + this.exclamation17.Size = new System.Drawing.Size(23, 29); + this.exclamation17.TabIndex = 71; + this.exclamation17.Text = "!"; + this.exclamation17.Visible = false; + // + // startTextBox18 + // + this.startTextBox18.Enabled = false; + this.startTextBox18.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox18.Location = new System.Drawing.Point(760, 675); + this.startTextBox18.Name = "startTextBox18"; + this.startTextBox18.Size = new System.Drawing.Size(163, 27); + this.startTextBox18.TabIndex = 73; + this.startTextBox18.Visible = false; + this.startTextBox18.AcceptsTabChanged += new System.EventHandler(this.startTextBox18_AcceptsTabChanged); + this.startTextBox18.TextChanged += new System.EventHandler(this.startTextBox18_TextChanged); + this.startTextBox18.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox18_KeyPress); + this.startTextBox18.MouseDown += new System.Windows.Forms.MouseEventHandler(this.startTextBox18_MouseDown); + // + // exclamation16 + // + this.exclamation16.AutoSize = true; + this.exclamation16.Font = new System.Drawing.Font("Verdana", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation16.ForeColor = System.Drawing.Color.Red; + this.exclamation16.Location = new System.Drawing.Point(1107, 611); + this.exclamation16.Name = "exclamation16"; + this.exclamation16.Size = new System.Drawing.Size(23, 29); + this.exclamation16.TabIndex = 67; + this.exclamation16.Text = "!"; + this.exclamation16.Visible = false; + // + // endTextBox18 + // + this.endTextBox18.Enabled = false; + this.endTextBox18.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox18.Location = new System.Drawing.Point(942, 675); + this.endTextBox18.Name = "endTextBox18"; + this.endTextBox18.Size = new System.Drawing.Size(163, 27); + this.endTextBox18.TabIndex = 74; + this.endTextBox18.Visible = false; + this.endTextBox18.AcceptsTabChanged += new System.EventHandler(this.endTextBox18_AcceptsTabChanged); + this.endTextBox18.TextChanged += new System.EventHandler(this.endTextBox18_TextChanged); + this.endTextBox18.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox18_KeyPress); + this.endTextBox18.MouseDown += new System.Windows.Forms.MouseEventHandler(this.endTextBox18_MouseDown); + // + // label18 + // + this.label18.AutoSize = true; + this.label18.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label18.Location = new System.Drawing.Point(598, 678); + this.label18.Name = "label18"; + this.label18.Size = new System.Drawing.Size(136, 18); + this.label18.TabIndex = 72; + this.label18.Text = "Water Meter 18"; + this.label18.Visible = false; + // + // startTextBox17 + // + this.startTextBox17.Enabled = false; + this.startTextBox17.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox17.Location = new System.Drawing.Point(760, 645); + this.startTextBox17.Name = "startTextBox17"; + this.startTextBox17.Size = new System.Drawing.Size(163, 27); + this.startTextBox17.TabIndex = 69; + this.startTextBox17.Visible = false; + this.startTextBox17.AcceptsTabChanged += new System.EventHandler(this.startTextBox17_AcceptsTabChanged); + this.startTextBox17.TextChanged += new System.EventHandler(this.startTextBox17_TextChanged); + this.startTextBox17.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox17_KeyPress); + this.startTextBox17.MouseDown += new System.Windows.Forms.MouseEventHandler(this.startTextBox17_MouseDown); + // + // exclamation15 + // + this.exclamation15.AutoSize = true; + this.exclamation15.Font = new System.Drawing.Font("Verdana", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation15.ForeColor = System.Drawing.Color.Red; + this.exclamation15.Location = new System.Drawing.Point(1107, 581); + this.exclamation15.Name = "exclamation15"; + this.exclamation15.Size = new System.Drawing.Size(23, 29); + this.exclamation15.TabIndex = 63; + this.exclamation15.Text = "!"; + this.exclamation15.Visible = false; + // + // endTextBox17 + // + this.endTextBox17.Enabled = false; + this.endTextBox17.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox17.Location = new System.Drawing.Point(942, 645); + this.endTextBox17.Name = "endTextBox17"; + this.endTextBox17.Size = new System.Drawing.Size(163, 27); + this.endTextBox17.TabIndex = 70; + this.endTextBox17.Visible = false; + this.endTextBox17.AcceptsTabChanged += new System.EventHandler(this.endTextBox17_AcceptsTabChanged); + this.endTextBox17.TextChanged += new System.EventHandler(this.endTextBox17_TextChanged); + this.endTextBox17.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox17_KeyPress); + this.endTextBox17.MouseDown += new System.Windows.Forms.MouseEventHandler(this.endTextBox17_MouseDown); + // + // label17 + // + this.label17.AutoSize = true; + this.label17.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label17.Location = new System.Drawing.Point(598, 648); + this.label17.Name = "label17"; + this.label17.Size = new System.Drawing.Size(136, 18); + this.label17.TabIndex = 68; + this.label17.Text = "Water Meter 17"; + this.label17.Visible = false; + // + // startTextBox16 + // + this.startTextBox16.Enabled = false; + this.startTextBox16.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox16.Location = new System.Drawing.Point(760, 615); + this.startTextBox16.Name = "startTextBox16"; + this.startTextBox16.Size = new System.Drawing.Size(163, 27); + this.startTextBox16.TabIndex = 65; + this.startTextBox16.Visible = false; + this.startTextBox16.AcceptsTabChanged += new System.EventHandler(this.startTextBox16_AcceptsTabChanged); + this.startTextBox16.TextChanged += new System.EventHandler(this.startTextBox16_TextChanged); + this.startTextBox16.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox16_KeyPress); + this.startTextBox16.MouseDown += new System.Windows.Forms.MouseEventHandler(this.startTextBox16_MouseDown); + // + // exclamation14 + // + this.exclamation14.AutoSize = true; + this.exclamation14.Font = new System.Drawing.Font("Verdana", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation14.ForeColor = System.Drawing.Color.Red; + this.exclamation14.Location = new System.Drawing.Point(1107, 551); + this.exclamation14.Name = "exclamation14"; + this.exclamation14.Size = new System.Drawing.Size(23, 29); + this.exclamation14.TabIndex = 59; + this.exclamation14.Text = "!"; + this.exclamation14.Visible = false; + // + // endTextBox16 + // + this.endTextBox16.Enabled = false; + this.endTextBox16.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox16.Location = new System.Drawing.Point(942, 615); + this.endTextBox16.Name = "endTextBox16"; + this.endTextBox16.Size = new System.Drawing.Size(163, 27); + this.endTextBox16.TabIndex = 66; + this.endTextBox16.Visible = false; + this.endTextBox16.AcceptsTabChanged += new System.EventHandler(this.endTextBox16_AcceptsTabChanged); + this.endTextBox16.TextChanged += new System.EventHandler(this.endTextBox16_TextChanged); + this.endTextBox16.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox16_KeyPress); + this.endTextBox16.MouseDown += new System.Windows.Forms.MouseEventHandler(this.endTextBox16_MouseDown); + // + // label16 + // + this.label16.AutoSize = true; + this.label16.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label16.Location = new System.Drawing.Point(598, 618); + this.label16.Name = "label16"; + this.label16.Size = new System.Drawing.Size(136, 18); + this.label16.TabIndex = 64; + this.label16.Text = "Water Meter 16"; + this.label16.Visible = false; + // + // startTextBox15 + // + this.startTextBox15.Enabled = false; + this.startTextBox15.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox15.Location = new System.Drawing.Point(760, 585); + this.startTextBox15.Name = "startTextBox15"; + this.startTextBox15.Size = new System.Drawing.Size(163, 27); + this.startTextBox15.TabIndex = 61; + this.startTextBox15.Visible = false; + this.startTextBox15.AcceptsTabChanged += new System.EventHandler(this.startTextBox15_AcceptsTabChanged); + this.startTextBox15.TextChanged += new System.EventHandler(this.startTextBox15_TextChanged); + this.startTextBox15.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox15_KeyPress); + this.startTextBox15.MouseDown += new System.Windows.Forms.MouseEventHandler(this.startTextBox15_MouseDown); + // + // exclamation13 + // + this.exclamation13.AutoSize = true; + this.exclamation13.Font = new System.Drawing.Font("Verdana", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation13.ForeColor = System.Drawing.Color.Red; + this.exclamation13.Location = new System.Drawing.Point(1107, 521); + this.exclamation13.Name = "exclamation13"; + this.exclamation13.Size = new System.Drawing.Size(23, 29); + this.exclamation13.TabIndex = 55; + this.exclamation13.Text = "!"; + this.exclamation13.Visible = false; + // + // endTextBox15 + // + this.endTextBox15.Enabled = false; + this.endTextBox15.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox15.Location = new System.Drawing.Point(942, 585); + this.endTextBox15.Name = "endTextBox15"; + this.endTextBox15.Size = new System.Drawing.Size(163, 27); + this.endTextBox15.TabIndex = 62; + this.endTextBox15.Visible = false; + this.endTextBox15.AcceptsTabChanged += new System.EventHandler(this.endTextBox15_AcceptsTabChanged); + this.endTextBox15.TextChanged += new System.EventHandler(this.endTextBox15_TextChanged); + this.endTextBox15.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox15_KeyPress); + this.endTextBox15.MouseDown += new System.Windows.Forms.MouseEventHandler(this.endTextBox15_MouseDown); + // + // label15 + // + this.label15.AutoSize = true; + this.label15.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label15.Location = new System.Drawing.Point(598, 588); + this.label15.Name = "label15"; + this.label15.Size = new System.Drawing.Size(136, 18); + this.label15.TabIndex = 60; + this.label15.Text = "Water Meter 15"; + this.label15.Visible = false; + // + // startTextBox14 + // + this.startTextBox14.Enabled = false; + this.startTextBox14.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox14.Location = new System.Drawing.Point(760, 555); + this.startTextBox14.Name = "startTextBox14"; + this.startTextBox14.Size = new System.Drawing.Size(163, 27); + this.startTextBox14.TabIndex = 57; + this.startTextBox14.Visible = false; + this.startTextBox14.AcceptsTabChanged += new System.EventHandler(this.startTextBox14_AcceptsTabChanged); + this.startTextBox14.TextChanged += new System.EventHandler(this.startTextBox14_TextChanged); + this.startTextBox14.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox14_KeyPress); + this.startTextBox14.MouseDown += new System.Windows.Forms.MouseEventHandler(this.startTextBox14_MouseDown); + // + // endLabel2 + // + this.endLabel2.AutoSize = true; + this.endLabel2.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endLabel2.Location = new System.Drawing.Point(992, 500); + this.endLabel2.Name = "endLabel2"; + this.endLabel2.Size = new System.Drawing.Size(38, 18); + this.endLabel2.TabIndex = 51; + this.endLabel2.Text = "End"; + // + // endTextBox14 + // + this.endTextBox14.Enabled = false; + this.endTextBox14.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox14.Location = new System.Drawing.Point(942, 555); + this.endTextBox14.Name = "endTextBox14"; + this.endTextBox14.Size = new System.Drawing.Size(163, 27); + this.endTextBox14.TabIndex = 58; + this.endTextBox14.Visible = false; + this.endTextBox14.AcceptsTabChanged += new System.EventHandler(this.endTextBox14_AcceptsTabChanged); + this.endTextBox14.TextChanged += new System.EventHandler(this.endTextBox14_TextChanged); + this.endTextBox14.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox14_KeyPress); + this.endTextBox14.MouseDown += new System.Windows.Forms.MouseEventHandler(this.endTextBox14_MouseDown); + // + // label14 + // + this.label14.AutoSize = true; + this.label14.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label14.Location = new System.Drawing.Point(598, 558); + this.label14.Name = "label14"; + this.label14.Size = new System.Drawing.Size(136, 18); + this.label14.TabIndex = 56; + this.label14.Text = "Water Meter 14"; + this.label14.Visible = false; + // + // startTextBox13 + // + this.startTextBox13.Enabled = false; + this.startTextBox13.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox13.Location = new System.Drawing.Point(760, 525); + this.startTextBox13.Name = "startTextBox13"; + this.startTextBox13.Size = new System.Drawing.Size(163, 27); + this.startTextBox13.TabIndex = 53; + this.startTextBox13.Visible = false; + this.startTextBox13.AcceptsTabChanged += new System.EventHandler(this.startTextBox13_AcceptsTabChanged); + this.startTextBox13.TextChanged += new System.EventHandler(this.startTextBox13_TextChanged); + this.startTextBox13.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox13_KeyPress); + this.startTextBox13.MouseDown += new System.Windows.Forms.MouseEventHandler(this.startTextBox13_MouseDown); + // + // startLabel2 + // + this.startLabel2.AutoSize = true; + this.startLabel2.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startLabel2.Location = new System.Drawing.Point(806, 500); + this.startLabel2.Name = "startLabel2"; + this.startLabel2.Size = new System.Drawing.Size(48, 18); + this.startLabel2.TabIndex = 50; + this.startLabel2.Text = "Start"; + // + // endTextBox13 + // + this.endTextBox13.Enabled = false; + this.endTextBox13.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox13.Location = new System.Drawing.Point(942, 525); + this.endTextBox13.Name = "endTextBox13"; + this.endTextBox13.Size = new System.Drawing.Size(163, 27); + this.endTextBox13.TabIndex = 54; + this.endTextBox13.Visible = false; + this.endTextBox13.AcceptsTabChanged += new System.EventHandler(this.endTextBox13_AcceptsTabChanged); + this.endTextBox13.TextChanged += new System.EventHandler(this.endTextBox13_TextChanged); + this.endTextBox13.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox13_KeyPress); + this.endTextBox13.MouseDown += new System.Windows.Forms.MouseEventHandler(this.endTextBox13_MouseDown); + // + // label13 + // + this.label13.AutoSize = true; + this.label13.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label13.Location = new System.Drawing.Point(598, 528); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(136, 18); + this.label13.TabIndex = 52; + this.label13.Text = "Water Meter 13"; + this.label13.Visible = false; + // + // pictureBox1 + // + this.pictureBox1.Location = new System.Drawing.Point(335, 5); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(480, 480); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.pictureBox1.TabIndex = 101; + this.pictureBox1.TabStop = false; + this.pictureBox1.Click += new System.EventHandler(this.pictureBox1_Click); + // + // rotateImageButton + // + this.rotateImageButton.Font = new System.Drawing.Font("Arial", 27.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.rotateImageButton.Location = new System.Drawing.Point(826, 435); + this.rotateImageButton.Name = "rotateImageButton"; + this.rotateImageButton.Size = new System.Drawing.Size(50, 50); + this.rotateImageButton.TabIndex = 102; + this.rotateImageButton.Text = "↺"; + this.rotateImageButton.UseVisualStyleBackColor = true; + this.rotateImageButton.Click += new System.EventHandler(this.rotateImageButton_Click); + // + // TestStartEndForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.ClientSize = new System.Drawing.Size(1146, 885); + this.Controls.Add(this.rotateImageButton); + this.Controls.Add(this.pictureBox1); + this.Controls.Add(this.exclamation24); + this.Controls.Add(this.startTextBox24); + this.Controls.Add(this.endTextBox24); + this.Controls.Add(this.label24); + this.Controls.Add(this.exclamation23); + this.Controls.Add(this.startTextBox23); + this.Controls.Add(this.endTextBox23); + this.Controls.Add(this.label23); + this.Controls.Add(this.exclamation22); + this.Controls.Add(this.startTextBox22); + this.Controls.Add(this.endTextBox22); + this.Controls.Add(this.label22); + this.Controls.Add(this.exclamation21); + this.Controls.Add(this.startTextBox21); + this.Controls.Add(this.endTextBox21); + this.Controls.Add(this.label21); + this.Controls.Add(this.exclamation20); + this.Controls.Add(this.startTextBox20); + this.Controls.Add(this.endTextBox20); + this.Controls.Add(this.label20); + this.Controls.Add(this.exclamation19); + this.Controls.Add(this.startTextBox19); + this.Controls.Add(this.endTextBox19); + this.Controls.Add(this.label19); + this.Controls.Add(this.exclamation18); + this.Controls.Add(this.exclamation17); + this.Controls.Add(this.startTextBox18); + this.Controls.Add(this.exclamation16); + this.Controls.Add(this.endTextBox18); + this.Controls.Add(this.label18); + this.Controls.Add(this.startTextBox17); + this.Controls.Add(this.exclamation15); + this.Controls.Add(this.endTextBox17); + this.Controls.Add(this.label17); + this.Controls.Add(this.startTextBox16); + this.Controls.Add(this.exclamation14); + this.Controls.Add(this.endTextBox16); + this.Controls.Add(this.label16); + this.Controls.Add(this.startTextBox15); + this.Controls.Add(this.exclamation13); + this.Controls.Add(this.endTextBox15); + this.Controls.Add(this.label15); + this.Controls.Add(this.startTextBox14); + this.Controls.Add(this.endLabel2); + this.Controls.Add(this.endTextBox14); + this.Controls.Add(this.label14); + this.Controls.Add(this.startTextBox13); + this.Controls.Add(this.startLabel2); + this.Controls.Add(this.endTextBox13); + this.Controls.Add(this.label13); + this.Controls.Add(this.exclamation12); + this.Controls.Add(this.startTextBox12); + this.Controls.Add(this.endTextBox12); + this.Controls.Add(this.label12); + this.Controls.Add(this.exclamation11); + this.Controls.Add(this.startTextBox11); + this.Controls.Add(this.endTextBox11); + this.Controls.Add(this.label11); + this.Controls.Add(this.exclamation10); + this.Controls.Add(this.startTextBox10); + this.Controls.Add(this.endTextBox10); + this.Controls.Add(this.label10); + this.Controls.Add(this.exclamation9); + this.Controls.Add(this.startTextBox9); + this.Controls.Add(this.endTextBox9); + this.Controls.Add(this.label9); + this.Controls.Add(this.exclamation8); + this.Controls.Add(this.startTextBox8); + this.Controls.Add(this.endTextBox8); + this.Controls.Add(this.label8); + this.Controls.Add(this.exclamation7); + this.Controls.Add(this.startTextBox7); + this.Controls.Add(this.endTextBox7); + this.Controls.Add(this.label7); + this.Controls.Add(this.exclamation6); + this.Controls.Add(this.exclamation5); + this.Controls.Add(this.startTextBox6); + this.Controls.Add(this.exclamation4); + this.Controls.Add(this.endTextBox6); + this.Controls.Add(this.label6); + this.Controls.Add(this.startTextBox5); + this.Controls.Add(this.exclamation3); + this.Controls.Add(this.endTextBox5); + this.Controls.Add(this.label5); + this.Controls.Add(this.startTextBox4); + this.Controls.Add(this.exclamation2); + this.Controls.Add(this.endTextBox4); + this.Controls.Add(this.label4); + this.Controls.Add(this.startTextBox3); + this.Controls.Add(this.exclamation1); + this.Controls.Add(this.endTextBox3); + this.Controls.Add(this.label3); + this.Controls.Add(this.startTextBox2); + this.Controls.Add(this.endLabel); + this.Controls.Add(this.endTextBox2); + this.Controls.Add(this.label2); + this.Controls.Add(this.startTextBox1); + this.Controls.Add(this.startLabel); + this.Controls.Add(this.endTextBox1); + this.Controls.Add(this.label1); + this.Controls.Add(this.okButton); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "TestStartEndForm"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "End States"; + this.TopMost = true; + this.Load += new System.EventHandler(this.TestStartEndForm_Load); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox endTextBox1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.TextBox endTextBox3; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox endTextBox4; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox endTextBox5; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.TextBox endTextBox6; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TextBox startTextBox1; + private System.Windows.Forms.TextBox startTextBox3; + private System.Windows.Forms.TextBox startTextBox4; + private System.Windows.Forms.TextBox startTextBox5; + private System.Windows.Forms.TextBox startTextBox6; + private System.Windows.Forms.Label startLabel; + private System.Windows.Forms.Label endLabel; + private System.Windows.Forms.Label exclamation1; + private System.Windows.Forms.Label exclamation3; + private System.Windows.Forms.Label exclamation4; + private System.Windows.Forms.Label exclamation5; + private System.Windows.Forms.Label exclamation6; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox endTextBox2; + private System.Windows.Forms.TextBox startTextBox2; + private System.Windows.Forms.Label exclamation2; + private System.Windows.Forms.Label exclamation7; + private System.Windows.Forms.TextBox startTextBox7; + private System.Windows.Forms.TextBox endTextBox7; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.Label exclamation8; + private System.Windows.Forms.TextBox startTextBox8; + private System.Windows.Forms.TextBox endTextBox8; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.Label exclamation9; + private System.Windows.Forms.TextBox startTextBox9; + private System.Windows.Forms.TextBox endTextBox9; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.Label exclamation10; + private System.Windows.Forms.TextBox startTextBox10; + private System.Windows.Forms.TextBox endTextBox10; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.Label exclamation11; + private System.Windows.Forms.TextBox startTextBox11; + private System.Windows.Forms.TextBox endTextBox11; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.Label exclamation12; + private System.Windows.Forms.TextBox startTextBox12; + private System.Windows.Forms.TextBox endTextBox12; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.Label exclamation24; + private System.Windows.Forms.TextBox startTextBox24; + private System.Windows.Forms.TextBox endTextBox24; + private System.Windows.Forms.Label label24; + private System.Windows.Forms.Label exclamation23; + private System.Windows.Forms.TextBox startTextBox23; + private System.Windows.Forms.TextBox endTextBox23; + private System.Windows.Forms.Label label23; + private System.Windows.Forms.Label exclamation22; + private System.Windows.Forms.TextBox startTextBox22; + private System.Windows.Forms.TextBox endTextBox22; + private System.Windows.Forms.Label label22; + private System.Windows.Forms.Label exclamation21; + private System.Windows.Forms.TextBox startTextBox21; + private System.Windows.Forms.TextBox endTextBox21; + private System.Windows.Forms.Label label21; + private System.Windows.Forms.Label exclamation20; + private System.Windows.Forms.TextBox startTextBox20; + private System.Windows.Forms.TextBox endTextBox20; + private System.Windows.Forms.Label label20; + private System.Windows.Forms.Label exclamation19; + private System.Windows.Forms.TextBox startTextBox19; + private System.Windows.Forms.TextBox endTextBox19; + private System.Windows.Forms.Label label19; + private System.Windows.Forms.Label exclamation18; + private System.Windows.Forms.Label exclamation17; + private System.Windows.Forms.TextBox startTextBox18; + private System.Windows.Forms.Label exclamation16; + private System.Windows.Forms.TextBox endTextBox18; + private System.Windows.Forms.Label label18; + private System.Windows.Forms.TextBox startTextBox17; + private System.Windows.Forms.Label exclamation15; + private System.Windows.Forms.TextBox endTextBox17; + private System.Windows.Forms.Label label17; + private System.Windows.Forms.TextBox startTextBox16; + private System.Windows.Forms.Label exclamation14; + private System.Windows.Forms.TextBox endTextBox16; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.TextBox startTextBox15; + private System.Windows.Forms.Label exclamation13; + private System.Windows.Forms.TextBox endTextBox15; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.TextBox startTextBox14; + private System.Windows.Forms.Label endLabel2; + private System.Windows.Forms.TextBox endTextBox14; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.TextBox startTextBox13; + private System.Windows.Forms.Label startLabel2; + private System.Windows.Forms.TextBox endTextBox13; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Button rotateImageButton; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/TestStartEndForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/TestStartEndForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/StandardCamera/TestStartEndForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/EntryForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/EntryForm.cs new file mode 100644 index 00000000..a6cbca22 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/EntryForm.cs @@ -0,0 +1,215 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; +using TBF.BenchControl; +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl.DataEntry.WMStates +{ + public class EntryForm : ComponentBase, IOperation, IDataEntry, IHasWMStatesForm + { + private static readonly ILog log = LogManager.GetLogger(typeof(EntryForm)); + public override string ToString() { return string.Format("DataEntry.WMStates({0})", Cfg.ToString(1)); } + + public bool UsesCameras() { return false; } + + readonly EntryFormCfg entryFormCfg; + IRegisterReader[] regReaders; + + /// + /// Test start water meter states set by forms + /// + double[] wmStartState; + public double WMStartState(int wmNr) + { + if (wmStartState == null || wmStartState.Length <= wmNr) return 0; + return wmStartState[wmNr]; + } + + /// + /// Test end water meter states set by forms + /// + double[] wmEndState; + public double WMEndState(int wmNr) + { + if (wmEndState == null || wmEndState.Length <= wmNr) return 0; + return wmEndState[wmNr]; + } + + /// Not supported + public void UpdateTestResults(Results.BatchResults results) + { + } + + + System.Windows.Forms.Form modelessDlg; + + bool resultSaved; + + public enum CurrentOp + { + None, + EnterWMSNsAndStates, + EnterTestStartStates, + EnterTestEndStates, + } + + CurrentOp currentOp; + + + public EntryForm() + { + } + + public EntryForm(Generic.IComponentCfg cfg) + : base(cfg) + { + entryFormCfg = cfg as EntryFormCfg; + wmStartState = new double[Config.Data.WMsCount]; + currentOp = CurrentOp.None; + log.Debug(this.ToString()); + } + + /// Reference to the operation + public IOperation ShowCycleBeginFormOp(IList waterMeters) + { + return null; + } + + /// Reference to the operation + public IOperation ShowCycleEndFormOp(IList waterMeters) + { + return null; + } + + /// Reference to the operation + public IOperation ShowWMSNsAndStatesFormOp() + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.EnterWMSNsAndStates; + return this; + } + + /// Reference to the operation + public IOperation ShowTestStartFormOp(IRegisterReader[] regReaders) + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.EnterTestStartStates; + this.regReaders = regReaders; + return this; + } + + /// Reference to the operation + public IOperation ShowTestEndFormOp(IRegisterReader[] regReaders, double refVolume, double errLimLo, double errLimHi) + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.EnterTestEndStates; + return this; + } + + delegate void EntryFormDlgt(EntryForm myRef); + /// + void OpenWMSNsAndStatesDlg(EntryForm myRef) + { + myRef.modelessDlg = new WMSNsAndStatesForm(Config.Data.WMsCount); + modelessDlg.Show(); + } + /// + void OpenWMStatesDlg(EntryForm myRef) + { + myRef.modelessDlg = new WMStatesForm(Config.Data.WMsCount); + modelessDlg.Show(); + } + + /// Start this operation + public void Start() + { + resultSaved = false; + switch (currentOp) + { + case CurrentOp.EnterWMSNsAndStates: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenWMSNsAndStatesDlg), this); + break; + case CurrentOp.EnterTestStartStates: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenWMStatesDlg), this); + break; + case CurrentOp.EnterTestEndStates: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenWMStatesDlg), this); + break; + } + } + + /// Run this operation + /// Event.ResultsPrinted + public Event Run() + { + if ((modelessDlg is IHasCompleted) && !(modelessDlg as IHasCompleted).Completed) + { + return Event.ModelessFormIsOpen; + } + + if (!resultSaved) /// This is to save the result only once + { + if (modelessDlg is WMSNsAndStatesForm) + { + WMSNsAndStatesForm dlg = (modelessDlg as WMSNsAndStatesForm); + + if (dlg.WaterMetersCount > 0) wmStartState[0] = dlg.WMState[0]; + if (dlg.WaterMetersCount > 1) wmStartState[1] = dlg.WMState[1]; + if (dlg.WaterMetersCount > 2) wmStartState[2] = dlg.WMState[2]; + if (dlg.WaterMetersCount > 3) wmStartState[3] = dlg.WMState[3]; + if (dlg.WaterMetersCount > 4) wmStartState[4] = dlg.WMState[4]; + if (dlg.WaterMetersCount > 5) wmStartState[5] = dlg.WMState[5]; + + //if (dlg.WaterMetersCount > 0) serialNr[0] = dlg.SNText[0]; + //if (dlg.WaterMetersCount > 1) serialNr[1] = dlg.SNText[1]; + //if (dlg.WaterMetersCount > 2) serialNr[2] = dlg.SNText[2]; + //if (dlg.WaterMetersCount > 3) serialNr[3] = dlg.SNText[3]; + //if (dlg.WaterMetersCount > 4) serialNr[4] = dlg.SNText[4]; + //if (dlg.WaterMetersCount > 5) serialNr[5] = dlg.SNText[5]; + } + else if (modelessDlg is WMStatesForm && currentOp == CurrentOp.EnterTestStartStates) + { + WMStatesForm dlg = (modelessDlg as WMStatesForm); + + if (dlg.WaterMetersCount > 0) wmStartState[0] = dlg.WMState[0]; + if (dlg.WaterMetersCount > 1) wmStartState[1] = dlg.WMState[1]; + if (dlg.WaterMetersCount > 2) wmStartState[2] = dlg.WMState[2]; + if (dlg.WaterMetersCount > 3) wmStartState[3] = dlg.WMState[3]; + if (dlg.WaterMetersCount > 4) wmStartState[4] = dlg.WMState[4]; + if (dlg.WaterMetersCount > 5) wmStartState[5] = dlg.WMState[5]; + } + else if (modelessDlg is WMStatesForm && currentOp == CurrentOp.EnterTestEndStates) + { + WMStatesForm dlg = (modelessDlg as WMStatesForm); + + if (dlg.WaterMetersCount > 0) wmEndState[0] = dlg.WMState[0]; + if (dlg.WaterMetersCount > 1) wmEndState[1] = dlg.WMState[1]; + if (dlg.WaterMetersCount > 2) wmEndState[2] = dlg.WMState[2]; + if (dlg.WaterMetersCount > 3) wmEndState[3] = dlg.WMState[3]; + if (dlg.WaterMetersCount > 4) wmEndState[4] = dlg.WMState[4]; + if (dlg.WaterMetersCount > 5) wmEndState[5] = dlg.WMState[5]; + } + resultSaved = true; + modelessDlg = null; + } + + return Event.ModelessFormClosed; /// Form closed + } + + /// Stop this operation + public void Stop() + { + if (modelessDlg is IHasCompleted) + { + UiBridge.Bridge.OnCloseModelessForm(this, null); + modelessDlg = null; + } + currentOp = CurrentOp.None; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/EntryFormCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/EntryFormCfg.cs new file mode 100644 index 00000000..99aec543 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/EntryFormCfg.cs @@ -0,0 +1,37 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DataEntry.WMStates +{ + public class EntryFormCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(EntryFormCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new EntryFormCfgCtrl(); } + + /// Private parameterless constructor invoked by all other (public) constructors + EntryFormCfg() + { + Name = "Generic-WM-States-Form"; + ParentName = string.Empty; + } + + public EntryFormCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}", Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/EntryFormCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/EntryFormCfgCtrl.cs new file mode 100644 index 00000000..182fd932 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/EntryFormCfgCtrl.cs @@ -0,0 +1,69 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DataEntry.WMStates +{ + public partial class EntryFormCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + EntryFormCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as EntryFormCfg; + Redraw(); + } + } + + public EntryFormCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/EntryFormCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/EntryFormCfgCtrl.designer.cs new file mode 100644 index 00000000..1b5df36a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/EntryFormCfgCtrl.designer.cs @@ -0,0 +1,86 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.WMStates +{ + partial class EntryFormCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(137, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 5; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(27, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 4; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(134, 33); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 3; + this.classNameLabel.Text = "ComonentName"; + // + // EntryFormCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "EntryFormCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/EntryFormCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/EntryFormCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/EntryFormCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/EntryFormFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/EntryFormFactory.cs new file mode 100644 index 00000000..fd77c2e2 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/EntryFormFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DataEntry.WMStates +{ + public class EntryFormFactory : IComponentFactory + { + public string ClassName { get { return "Generic-WM-States-Form"; } } + + public void ResetStaticProperties() { EntryForm.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new EntryForm(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new EntryForm(cfg); } + + public IComponentCfg DefaultConfig() { return new EntryFormCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(EntryFormCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/WMSNsAndStatesForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/WMSNsAndStatesForm.cs new file mode 100644 index 00000000..6b56038f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/WMSNsAndStatesForm.cs @@ -0,0 +1,135 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using log4net; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.WMStates +{ + public partial class WMSNsAndStatesForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(WMSNsAndStatesForm)); + + /// Number of text boxes for serial numbers + public readonly int WaterMetersCount; + + /// To be retrieved after the form is closed + public string[] SNText; + + // To be retrieved after the form closes + public float[] WMState; + + /// Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + /// + /// Constructor + /// + /// Number of text boxes for serial numbers + public WMSNsAndStatesForm(int waterMetersCount) + { + InitializeComponent(); + ControlBox = false; + + this.WaterMetersCount = waterMetersCount; + SNText = new string[WaterMetersCount]; + WMState = new float[WaterMetersCount]; + + completed = false; + StartForceCloseHandler(); + + //Height = 55 + WaterMetersCount * 105; + } + + /// Parameterless constructor for 3 watermeters + public WMSNsAndStatesForm() + : this(Config.Data.WMsCount) + { + } + + void Localize() + { + Text = Strings.Water_Meter_SNs_States; + groupBox1.Text = Strings.Water_Meter + " 1"; + groupBox2.Text = Strings.Water_Meter + " 2"; + groupBox3.Text = Strings.Water_Meter + " 3"; + groupBox4.Text = Strings.Water_Meter + " 4"; + groupBox5.Text = Strings.Water_Meter + " 5"; + groupBox6.Text = Strings.Water_Meter + " 6"; + snLabel1.Text = Strings.SerialNr; + snLabel2.Text = Strings.SerialNr; + snLabel3.Text = Strings.SerialNr; + snLabel4.Text = Strings.SerialNr; + snLabel5.Text = Strings.SerialNr; + snLabel6.Text = Strings.SerialNr; + wmStateLabel1.Text = Strings.WMState; + wmStateLabel2.Text = Strings.WMState; + wmStateLabel3.Text = Strings.WMState; + wmStateLabel4.Text = Strings.WMState; + wmStateLabel5.Text = Strings.WMState; + wmStateLabel6.Text = Strings.WMState; + okButton.Text = Strings.OkBtnText; + } + + private void CycleBeginningForm_Load(object sender, EventArgs e) + { + // TODO: localize strings + + if (WaterMetersCount < 1) groupBox1.Visible = false; + if (WaterMetersCount < 2) groupBox2.Visible = false; + if (WaterMetersCount < 3) groupBox3.Visible = false; + if (WaterMetersCount < 4) groupBox4.Visible = false; + if (WaterMetersCount < 5) groupBox5.Visible = false; + if (WaterMetersCount < 6) groupBox6.Visible = false; + } + + private void okButton_Click(object sender, EventArgs e) + { + try + { + if (WaterMetersCount >= 1) SNText[0] = snTextBox1.Text; + if (WaterMetersCount >= 2) SNText[1] = snTextBox2.Text; + if (WaterMetersCount >= 3) SNText[2] = snTextBox3.Text; + if (WaterMetersCount >= 4) SNText[3] = snTextBox4.Text; + if (WaterMetersCount >= 5) SNText[4] = snTextBox5.Text; + if (WaterMetersCount >= 6) SNText[5] = snTextBox6.Text; + + if (WaterMetersCount >= 1) WMState[0] = Utils.ParseUFloat(wmStateTextBox1.Text); + if (WaterMetersCount >= 2) WMState[1] = Utils.ParseUFloat(wmStateTextBox2.Text); + if (WaterMetersCount >= 3) WMState[2] = Utils.ParseUFloat(wmStateTextBox3.Text); + if (WaterMetersCount >= 4) WMState[3] = Utils.ParseUFloat(wmStateTextBox4.Text); + if (WaterMetersCount >= 5) WMState[4] = Utils.ParseUFloat(wmStateTextBox5.Text); + if (WaterMetersCount >= 6) WMState[5] = Utils.ParseUFloat(wmStateTextBox6.Text); + } + catch + { + return; + } + + completed = true; + 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) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/WMSNsAndStatesForm.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/WMSNsAndStatesForm.designer.cs new file mode 100644 index 00000000..662c6d7b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/WMSNsAndStatesForm.designer.cs @@ -0,0 +1,335 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.WMStates +{ + partial class WMSNsAndStatesForm + { + /// + /// 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(WMSNsAndStatesForm)); + this.okButton = new System.Windows.Forms.Button(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.wmStateTextBox1 = new System.Windows.Forms.TextBox(); + this.wmStateLabel1 = new System.Windows.Forms.Label(); + this.snTextBox1 = new System.Windows.Forms.TextBox(); + this.snLabel1 = new System.Windows.Forms.Label(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.wmStateTextBox2 = new System.Windows.Forms.TextBox(); + this.wmStateLabel2 = new System.Windows.Forms.Label(); + this.snTextBox2 = new System.Windows.Forms.TextBox(); + this.snLabel2 = new System.Windows.Forms.Label(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.wmStateTextBox3 = new System.Windows.Forms.TextBox(); + this.wmStateLabel3 = new System.Windows.Forms.Label(); + this.snTextBox3 = new System.Windows.Forms.TextBox(); + this.snLabel3 = new System.Windows.Forms.Label(); + this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.wmStateTextBox4 = new System.Windows.Forms.TextBox(); + this.wmStateLabel4 = new System.Windows.Forms.Label(); + this.snTextBox4 = new System.Windows.Forms.TextBox(); + this.snLabel4 = new System.Windows.Forms.Label(); + this.groupBox5 = new System.Windows.Forms.GroupBox(); + this.wmStateTextBox5 = new System.Windows.Forms.TextBox(); + this.wmStateLabel5 = new System.Windows.Forms.Label(); + this.snTextBox5 = new System.Windows.Forms.TextBox(); + this.snLabel5 = new System.Windows.Forms.Label(); + this.groupBox6 = new System.Windows.Forms.GroupBox(); + this.wmStateTextBox6 = new System.Windows.Forms.TextBox(); + this.wmStateLabel6 = new System.Windows.Forms.Label(); + this.snTextBox6 = new System.Windows.Forms.TextBox(); + this.snLabel6 = new System.Windows.Forms.Label(); + this.groupBox1.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.groupBox4.SuspendLayout(); + this.groupBox5.SuspendLayout(); + this.groupBox6.SuspendLayout(); + this.SuspendLayout(); + // + // okButton + // + resources.ApplyResources(this.okButton, "okButton"); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Name = "okButton"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.wmStateTextBox1); + this.groupBox1.Controls.Add(this.wmStateLabel1); + this.groupBox1.Controls.Add(this.snTextBox1); + this.groupBox1.Controls.Add(this.snLabel1); + resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.ForeColor = System.Drawing.Color.Black; + this.groupBox1.Name = "groupBox1"; + this.groupBox1.TabStop = false; + // + // wmStateTextBox1 + // + resources.ApplyResources(this.wmStateTextBox1, "wmStateTextBox1"); + this.wmStateTextBox1.Name = "wmStateTextBox1"; + // + // wmStateLabel1 + // + resources.ApplyResources(this.wmStateLabel1, "wmStateLabel1"); + this.wmStateLabel1.Name = "wmStateLabel1"; + // + // snTextBox1 + // + resources.ApplyResources(this.snTextBox1, "snTextBox1"); + this.snTextBox1.Name = "snTextBox1"; + // + // snLabel1 + // + resources.ApplyResources(this.snLabel1, "snLabel1"); + this.snLabel1.Name = "snLabel1"; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.wmStateTextBox2); + this.groupBox2.Controls.Add(this.wmStateLabel2); + this.groupBox2.Controls.Add(this.snTextBox2); + this.groupBox2.Controls.Add(this.snLabel2); + resources.ApplyResources(this.groupBox2, "groupBox2"); + this.groupBox2.ForeColor = System.Drawing.Color.Black; + this.groupBox2.Name = "groupBox2"; + this.groupBox2.TabStop = false; + // + // wmStateTextBox2 + // + resources.ApplyResources(this.wmStateTextBox2, "wmStateTextBox2"); + this.wmStateTextBox2.Name = "wmStateTextBox2"; + // + // wmStateLabel2 + // + resources.ApplyResources(this.wmStateLabel2, "wmStateLabel2"); + this.wmStateLabel2.Name = "wmStateLabel2"; + // + // snTextBox2 + // + resources.ApplyResources(this.snTextBox2, "snTextBox2"); + this.snTextBox2.Name = "snTextBox2"; + // + // snLabel2 + // + resources.ApplyResources(this.snLabel2, "snLabel2"); + this.snLabel2.Name = "snLabel2"; + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.wmStateTextBox3); + this.groupBox3.Controls.Add(this.wmStateLabel3); + this.groupBox3.Controls.Add(this.snTextBox3); + this.groupBox3.Controls.Add(this.snLabel3); + resources.ApplyResources(this.groupBox3, "groupBox3"); + this.groupBox3.ForeColor = System.Drawing.Color.Black; + this.groupBox3.Name = "groupBox3"; + this.groupBox3.TabStop = false; + // + // wmStateTextBox3 + // + resources.ApplyResources(this.wmStateTextBox3, "wmStateTextBox3"); + this.wmStateTextBox3.Name = "wmStateTextBox3"; + // + // wmStateLabel3 + // + resources.ApplyResources(this.wmStateLabel3, "wmStateLabel3"); + this.wmStateLabel3.Name = "wmStateLabel3"; + // + // snTextBox3 + // + resources.ApplyResources(this.snTextBox3, "snTextBox3"); + this.snTextBox3.Name = "snTextBox3"; + // + // snLabel3 + // + resources.ApplyResources(this.snLabel3, "snLabel3"); + this.snLabel3.Name = "snLabel3"; + // + // groupBox4 + // + this.groupBox4.Controls.Add(this.wmStateTextBox4); + this.groupBox4.Controls.Add(this.wmStateLabel4); + this.groupBox4.Controls.Add(this.snTextBox4); + this.groupBox4.Controls.Add(this.snLabel4); + resources.ApplyResources(this.groupBox4, "groupBox4"); + this.groupBox4.ForeColor = System.Drawing.Color.Black; + this.groupBox4.Name = "groupBox4"; + this.groupBox4.TabStop = false; + // + // wmStateTextBox4 + // + resources.ApplyResources(this.wmStateTextBox4, "wmStateTextBox4"); + this.wmStateTextBox4.Name = "wmStateTextBox4"; + // + // wmStateLabel4 + // + resources.ApplyResources(this.wmStateLabel4, "wmStateLabel4"); + this.wmStateLabel4.Name = "wmStateLabel4"; + // + // snTextBox4 + // + resources.ApplyResources(this.snTextBox4, "snTextBox4"); + this.snTextBox4.Name = "snTextBox4"; + // + // snLabel4 + // + resources.ApplyResources(this.snLabel4, "snLabel4"); + this.snLabel4.Name = "snLabel4"; + // + // groupBox5 + // + this.groupBox5.Controls.Add(this.wmStateTextBox5); + this.groupBox5.Controls.Add(this.wmStateLabel5); + this.groupBox5.Controls.Add(this.snTextBox5); + this.groupBox5.Controls.Add(this.snLabel5); + resources.ApplyResources(this.groupBox5, "groupBox5"); + this.groupBox5.ForeColor = System.Drawing.Color.Black; + this.groupBox5.Name = "groupBox5"; + this.groupBox5.TabStop = false; + // + // wmStateTextBox5 + // + resources.ApplyResources(this.wmStateTextBox5, "wmStateTextBox5"); + this.wmStateTextBox5.Name = "wmStateTextBox5"; + // + // wmStateLabel5 + // + resources.ApplyResources(this.wmStateLabel5, "wmStateLabel5"); + this.wmStateLabel5.Name = "wmStateLabel5"; + // + // snTextBox5 + // + resources.ApplyResources(this.snTextBox5, "snTextBox5"); + this.snTextBox5.Name = "snTextBox5"; + // + // snLabel5 + // + resources.ApplyResources(this.snLabel5, "snLabel5"); + this.snLabel5.Name = "snLabel5"; + // + // groupBox6 + // + this.groupBox6.Controls.Add(this.wmStateTextBox6); + this.groupBox6.Controls.Add(this.wmStateLabel6); + this.groupBox6.Controls.Add(this.snTextBox6); + this.groupBox6.Controls.Add(this.snLabel6); + resources.ApplyResources(this.groupBox6, "groupBox6"); + this.groupBox6.ForeColor = System.Drawing.Color.Black; + this.groupBox6.Name = "groupBox6"; + this.groupBox6.TabStop = false; + // + // wmStateTextBox6 + // + resources.ApplyResources(this.wmStateTextBox6, "wmStateTextBox6"); + this.wmStateTextBox6.Name = "wmStateTextBox6"; + // + // wmStateLabel6 + // + resources.ApplyResources(this.wmStateLabel6, "wmStateLabel6"); + this.wmStateLabel6.Name = "wmStateLabel6"; + // + // snTextBox6 + // + resources.ApplyResources(this.snTextBox6, "snTextBox6"); + this.snTextBox6.Name = "snTextBox6"; + // + // snLabel6 + // + resources.ApplyResources(this.snLabel6, "snLabel6"); + this.snLabel6.Name = "snLabel6"; + // + // WMSNsAndStatesForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.Controls.Add(this.groupBox6); + this.Controls.Add(this.groupBox5); + this.Controls.Add(this.groupBox4); + this.Controls.Add(this.groupBox3); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.okButton); + this.ForeColor = System.Drawing.Color.Black; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "WMSNsAndStatesForm"; + this.TopMost = true; + this.Load += new System.EventHandler(this.CycleBeginningForm_Load); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.groupBox4.ResumeLayout(false); + this.groupBox4.PerformLayout(); + this.groupBox5.ResumeLayout(false); + this.groupBox5.PerformLayout(); + this.groupBox6.ResumeLayout(false); + this.groupBox6.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Label snLabel1; + private System.Windows.Forms.TextBox snTextBox1; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TextBox snTextBox2; + private System.Windows.Forms.Label snLabel2; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.TextBox snTextBox3; + private System.Windows.Forms.Label snLabel3; + private System.Windows.Forms.GroupBox groupBox4; + private System.Windows.Forms.TextBox snTextBox4; + private System.Windows.Forms.Label snLabel4; + private System.Windows.Forms.GroupBox groupBox5; + private System.Windows.Forms.TextBox snTextBox5; + private System.Windows.Forms.Label snLabel5; + private System.Windows.Forms.GroupBox groupBox6; + private System.Windows.Forms.TextBox snTextBox6; + private System.Windows.Forms.Label snLabel6; + private System.Windows.Forms.TextBox wmStateTextBox1; + private System.Windows.Forms.Label wmStateLabel1; + private System.Windows.Forms.TextBox wmStateTextBox2; + private System.Windows.Forms.Label wmStateLabel2; + private System.Windows.Forms.TextBox wmStateTextBox3; + private System.Windows.Forms.Label wmStateLabel3; + private System.Windows.Forms.TextBox wmStateTextBox4; + private System.Windows.Forms.Label wmStateLabel4; + private System.Windows.Forms.TextBox wmStateTextBox5; + private System.Windows.Forms.Label wmStateLabel5; + private System.Windows.Forms.TextBox wmStateTextBox6; + private System.Windows.Forms.Label wmStateLabel6; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/WMSNsAndStatesForm.pl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/WMSNsAndStatesForm.pl.resx new file mode 100644 index 00000000..aba5fa7c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/WMSNsAndStatesForm.pl.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + OK + + + Stan + + + Nr seryjny + + + Wodomierz 1 + + + Stan + + + Nr seryjny + + + Wodomierz 2 + + + Stan + + + Nr seryjny + + + Wodomierz 3 + + + Stan + + + Nr seryjny + + + Wodomierz 4 + + + Stan + + + Nr seryjny + + + Wodomierz 5 + + + Stan + + + Nr seryjny + + + Wodomierz 6 + + + Nr seryjny i stan + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/WMSNsAndStatesForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/WMSNsAndStatesForm.resx new file mode 100644 index 00000000..ad22c669 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/WMSNsAndStatesForm.resx @@ -0,0 +1,924 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + Verdana, 14.25pt + + + 640, 27 + + + 98, 63 + + + + 0 + + + OK + + + okButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 6 + + + 386, 37 + + + 163, 31 + + + 3 + + + wmStateTextBox1 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + True + + + 302, 40 + + + 68, 23 + + + 2 + + + State: + + + wmStateLabel1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + 100, 37 + + + 163, 31 + + + 1 + + + snTextBox1 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 2 + + + True + + + 38, 40 + + + 55, 23 + + + 0 + + + S/N: + + + snLabel1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 3 + + + Verdana, 14.25pt + + + 28, 18 + + + 575, 92 + + + 1 + + + Water Meter 1 + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 5 + + + 386, 37 + + + 163, 31 + + + 3 + + + wmStateTextBox2 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 + + + True + + + + NoControl + + + 302, 40 + + + 68, 23 + + + 2 + + + State: + + + wmStateLabel2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 1 + + + 100, 37 + + + 163, 31 + + + 1 + + + snTextBox2 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 2 + + + True + + + 38, 40 + + + 55, 23 + + + 0 + + + S/N: + + + snLabel2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 3 + + + Verdana, 14.25pt + + + 28, 123 + + + 575, 92 + + + 2 + + + Water Meter 2 + + + groupBox2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + + + 386, 37 + + + 163, 31 + + + 3 + + + wmStateTextBox3 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox3 + + + 0 + + + True + + + NoControl + + + 302, 40 + + + 68, 23 + + + 2 + + + State: + + + wmStateLabel3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox3 + + + 1 + + + 100, 37 + + + 163, 31 + + + 1 + + + snTextBox3 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox3 + + + 2 + + + True + + + 38, 40 + + + 55, 23 + + + 0 + + + S/N: + + + snLabel3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox3 + + + 3 + + + Verdana, 14.25pt + + + 28, 228 + + + 575, 92 + + + 3 + + + Water Meter 3 + + + groupBox3 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + 386, 37 + + + 163, 31 + + + 3 + + + wmStateTextBox4 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox4 + + + 0 + + + True + + + NoControl + + + 302, 40 + + + 68, 23 + + + 2 + + + State: + + + wmStateLabel4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox4 + + + 1 + + + 100, 37 + + + 163, 31 + + + 1 + + + snTextBox4 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox4 + + + 2 + + + True + + + 38, 40 + + + 55, 23 + + + 0 + + + S/N: + + + snLabel4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox4 + + + 3 + + + Verdana, 14.25pt + + + 28, 333 + + + 575, 92 + + + 4 + + + Water Meter 4 + + + groupBox4 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + 386, 32 + + + 163, 31 + + + 3 + + + wmStateTextBox5 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox5 + + + 0 + + + True + + + NoControl + + + 302, 35 + + + 68, 23 + + + 2 + + + State: + + + wmStateLabel5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox5 + + + 1 + + + 100, 37 + + + 163, 31 + + + 1 + + + snTextBox5 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox5 + + + 2 + + + True + + + 38, 40 + + + 55, 23 + + + 0 + + + S/N: + + + snLabel5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox5 + + + 3 + + + Verdana, 14.25pt + + + 28, 438 + + + 575, 92 + + + 5 + + + Water Meter 5 + + + groupBox5 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + 386, 37 + + + 163, 31 + + + 3 + + + wmStateTextBox6 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox6 + + + 0 + + + True + + + NoControl + + + 302, 40 + + + 68, 23 + + + 2 + + + State: + + + wmStateLabel6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox6 + + + 1 + + + 100, 37 + + + 163, 31 + + + 1 + + + snTextBox6 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox6 + + + 2 + + + True + + + 38, 40 + + + 55, 23 + + + 0 + + + S/N: + + + snLabel6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox6 + + + 3 + + + Verdana, 14.25pt + + + 28, 543 + + + 575, 92 + + + 6 + + + Water Meter 6 + + + groupBox6 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + + + 6, 13 + + + True + + + 773, 661 + + + Water Meter Serial Numbers and States + + + WMSNsAndStatesForm + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/WMSNsAndStatesForm.ru.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/WMSNsAndStatesForm.ru.resx new file mode 100644 index 00000000..9a2fd775 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/WMSNsAndStatesForm.ru.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + OK + + + Состояние: + + + С/Н: + + + Счетчик воды 1 + + + Состояние: + + + С/Н: + + + Счетчик воды 2 + + + Состояние: + + + С/Н: + + + Счетчик воды 3 + + + Состояние: + + + С/Н: + + + Счетчик воды 4 + + + Состояние: + + + С/Н: + + + Счетчик воды 5 + + + Состояние: + + + С/Н: + + + Счетчик воды 6 + + + Счетчик воды серийный номер и состояние + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/WMStatesForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/WMStatesForm.cs new file mode 100644 index 00000000..1ab050c7 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/WMStatesForm.cs @@ -0,0 +1,118 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using log4net; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.WMStates +{ + public partial class WMStatesForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(WMStatesForm)); + + /// Number of text boxes for serial numbers + public readonly int WaterMetersCount; + + // To be retrieved after the form closes + public double[] WMState; + + // Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + /// + /// Constructor + /// + /// Number of text boxes for serial numbers + public WMStatesForm(int waterMetersCount) + { + InitializeComponent(); + ControlBox = false; + + this.WaterMetersCount = waterMetersCount; + WMState = new double[WaterMetersCount]; + + completed = false; + StartForceCloseHandler(); + } + + /// Parameterless constructor for 3 watermeters + public WMStatesForm() + : this(Config.Data.WMsCount) + { + } + + void Localize() + { + Text = Strings.Water_Meter_States; + groupBox1.Text = Strings.Water_Meter + " 1"; + groupBox2.Text = Strings.Water_Meter + " 2"; + groupBox3.Text = Strings.Water_Meter + " 3"; + groupBox4.Text = Strings.Water_Meter + " 4"; + groupBox5.Text = Strings.Water_Meter + " 5"; + groupBox6.Text = Strings.Water_Meter + " 6"; + wmStateLabel1.Text = Strings.WMState; + wmStateLabel2.Text = Strings.WMState; + wmStateLabel3.Text = Strings.WMState; + wmStateLabel4.Text = Strings.WMState; + wmStateLabel5.Text = Strings.WMState; + wmStateLabel6.Text = Strings.WMState; + okButton.Text = Strings.OkBtnText; + } + + private void CycleEndForm_Load(object sender, EventArgs e) + { + Localize(); + + Height = 195 + 90 * WaterMetersCount; + + if (WaterMetersCount < 1) groupBox1.Visible = false; + if (WaterMetersCount < 2) groupBox2.Visible = false; + if (WaterMetersCount < 3) groupBox3.Visible = false; + if (WaterMetersCount < 4) groupBox4.Visible = false; + if (WaterMetersCount < 5) groupBox5.Visible = false; + if (WaterMetersCount < 6) groupBox6.Visible = false; + } + + private void okButton_Click(object sender, EventArgs e) + { + try + { + if (WaterMetersCount >= 1) WMState[0] = Utils.ParseUDouble(wmStateTextBox1.Text); + if (WaterMetersCount >= 2) WMState[1] = Utils.ParseUDouble(wmStateTextBox2.Text); + if (WaterMetersCount >= 3) WMState[2] = Utils.ParseUDouble(wmStateTextBox3.Text); + if (WaterMetersCount >= 4) WMState[3] = Utils.ParseUDouble(wmStateTextBox4.Text); + if (WaterMetersCount >= 5) WMState[4] = Utils.ParseUDouble(wmStateTextBox5.Text); + if (WaterMetersCount >= 6) WMState[5] = Utils.ParseUDouble(wmStateTextBox6.Text); + } + catch + { + return; + } + + completed = true; + 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) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/WMStatesForm.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/WMStatesForm.designer.cs new file mode 100644 index 00000000..dca642fd --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/WMStatesForm.designer.cs @@ -0,0 +1,305 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.WMStates +{ + partial class WMStatesForm + { + /// + /// 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() + { + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.wmStateTextBox2 = new System.Windows.Forms.TextBox(); + this.wmStateLabel2 = new System.Windows.Forms.Label(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.wmStateTextBox1 = new System.Windows.Forms.TextBox(); + this.wmStateLabel1 = new System.Windows.Forms.Label(); + this.okButton = new System.Windows.Forms.Button(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.wmStateTextBox3 = new System.Windows.Forms.TextBox(); + this.wmStateLabel3 = new System.Windows.Forms.Label(); + this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.wmStateTextBox4 = new System.Windows.Forms.TextBox(); + this.wmStateLabel4 = new System.Windows.Forms.Label(); + this.groupBox5 = new System.Windows.Forms.GroupBox(); + this.wmStateTextBox5 = new System.Windows.Forms.TextBox(); + this.wmStateLabel5 = new System.Windows.Forms.Label(); + this.groupBox6 = new System.Windows.Forms.GroupBox(); + this.wmStateTextBox6 = new System.Windows.Forms.TextBox(); + this.wmStateLabel6 = new System.Windows.Forms.Label(); + this.groupBox2.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.groupBox4.SuspendLayout(); + this.groupBox5.SuspendLayout(); + this.groupBox6.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.wmStateTextBox2); + this.groupBox2.Controls.Add(this.wmStateLabel2); + this.groupBox2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox2.ForeColor = System.Drawing.Color.Black; + this.groupBox2.Location = new System.Drawing.Point(25, 102); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(362, 81); + this.groupBox2.TabIndex = 2; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Water Meter 2"; + // + // wmStateTextBox2 + // + this.wmStateTextBox2.Location = new System.Drawing.Point(183, 31); + this.wmStateTextBox2.Name = "wmStateTextBox2"; + this.wmStateTextBox2.Size = new System.Drawing.Size(163, 31); + this.wmStateTextBox2.TabIndex = 1; + // + // wmStateLabel2 + // + this.wmStateLabel2.AutoSize = true; + this.wmStateLabel2.Location = new System.Drawing.Point(18, 34); + this.wmStateLabel2.Name = "wmStateLabel2"; + this.wmStateLabel2.Size = new System.Drawing.Size(68, 23); + this.wmStateLabel2.TabIndex = 0; + this.wmStateLabel2.Text = "State:"; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.wmStateTextBox1); + this.groupBox1.Controls.Add(this.wmStateLabel1); + this.groupBox1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox1.ForeColor = System.Drawing.Color.Black; + this.groupBox1.Location = new System.Drawing.Point(25, 12); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(362, 81); + this.groupBox1.TabIndex = 1; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Water Meter 1"; + // + // wmStateTextBox1 + // + this.wmStateTextBox1.Location = new System.Drawing.Point(183, 31); + this.wmStateTextBox1.Name = "wmStateTextBox1"; + this.wmStateTextBox1.Size = new System.Drawing.Size(163, 31); + this.wmStateTextBox1.TabIndex = 1; + // + // wmStateLabel1 + // + this.wmStateLabel1.AutoSize = true; + this.wmStateLabel1.Location = new System.Drawing.Point(18, 34); + this.wmStateLabel1.Name = "wmStateLabel1"; + this.wmStateLabel1.Size = new System.Drawing.Size(68, 23); + this.wmStateLabel1.TabIndex = 0; + this.wmStateLabel1.Text = "State:"; + // + // okButton + // + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(425, 21); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(98, 63); + this.okButton.TabIndex = 7; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.wmStateTextBox3); + this.groupBox3.Controls.Add(this.wmStateLabel3); + this.groupBox3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox3.ForeColor = System.Drawing.Color.Black; + this.groupBox3.Location = new System.Drawing.Point(25, 192); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(362, 81); + this.groupBox3.TabIndex = 3; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "Water Meter 3"; + // + // wmStateTextBox3 + // + this.wmStateTextBox3.Location = new System.Drawing.Point(183, 31); + this.wmStateTextBox3.Name = "wmStateTextBox3"; + this.wmStateTextBox3.Size = new System.Drawing.Size(163, 31); + this.wmStateTextBox3.TabIndex = 1; + // + // wmStateLabel3 + // + this.wmStateLabel3.AutoSize = true; + this.wmStateLabel3.Location = new System.Drawing.Point(18, 34); + this.wmStateLabel3.Name = "wmStateLabel3"; + this.wmStateLabel3.Size = new System.Drawing.Size(68, 23); + this.wmStateLabel3.TabIndex = 0; + this.wmStateLabel3.Text = "State:"; + // + // groupBox4 + // + this.groupBox4.Controls.Add(this.wmStateTextBox4); + this.groupBox4.Controls.Add(this.wmStateLabel4); + this.groupBox4.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox4.ForeColor = System.Drawing.Color.Black; + this.groupBox4.Location = new System.Drawing.Point(25, 282); + this.groupBox4.Name = "groupBox4"; + this.groupBox4.Size = new System.Drawing.Size(362, 81); + this.groupBox4.TabIndex = 4; + this.groupBox4.TabStop = false; + this.groupBox4.Text = "Water Meter 4"; + // + // wmStateTextBox4 + // + this.wmStateTextBox4.Location = new System.Drawing.Point(183, 31); + this.wmStateTextBox4.Name = "wmStateTextBox4"; + this.wmStateTextBox4.Size = new System.Drawing.Size(163, 31); + this.wmStateTextBox4.TabIndex = 1; + // + // wmStateLabel4 + // + this.wmStateLabel4.AutoSize = true; + this.wmStateLabel4.Location = new System.Drawing.Point(18, 34); + this.wmStateLabel4.Name = "wmStateLabel4"; + this.wmStateLabel4.Size = new System.Drawing.Size(68, 23); + this.wmStateLabel4.TabIndex = 0; + this.wmStateLabel4.Text = "State:"; + // + // groupBox5 + // + this.groupBox5.Controls.Add(this.wmStateTextBox5); + this.groupBox5.Controls.Add(this.wmStateLabel5); + this.groupBox5.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox5.ForeColor = System.Drawing.Color.Black; + this.groupBox5.Location = new System.Drawing.Point(25, 372); + this.groupBox5.Name = "groupBox5"; + this.groupBox5.Size = new System.Drawing.Size(362, 81); + this.groupBox5.TabIndex = 5; + this.groupBox5.TabStop = false; + this.groupBox5.Text = "Water Meter 5"; + // + // wmStateTextBox5 + // + this.wmStateTextBox5.Location = new System.Drawing.Point(183, 31); + this.wmStateTextBox5.Name = "wmStateTextBox5"; + this.wmStateTextBox5.Size = new System.Drawing.Size(163, 31); + this.wmStateTextBox5.TabIndex = 1; + // + // wmStateLabel5 + // + this.wmStateLabel5.AutoSize = true; + this.wmStateLabel5.Location = new System.Drawing.Point(18, 34); + this.wmStateLabel5.Name = "wmStateLabel5"; + this.wmStateLabel5.Size = new System.Drawing.Size(68, 23); + this.wmStateLabel5.TabIndex = 0; + this.wmStateLabel5.Text = "State:"; + // + // groupBox6 + // + this.groupBox6.Controls.Add(this.wmStateTextBox6); + this.groupBox6.Controls.Add(this.wmStateLabel6); + this.groupBox6.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox6.ForeColor = System.Drawing.Color.Black; + this.groupBox6.Location = new System.Drawing.Point(25, 462); + this.groupBox6.Name = "groupBox6"; + this.groupBox6.Size = new System.Drawing.Size(362, 81); + this.groupBox6.TabIndex = 6; + this.groupBox6.TabStop = false; + this.groupBox6.Text = "Water Meter 6"; + // + // wmStateTextBox6 + // + this.wmStateTextBox6.Location = new System.Drawing.Point(183, 31); + this.wmStateTextBox6.Name = "wmStateTextBox6"; + this.wmStateTextBox6.Size = new System.Drawing.Size(163, 31); + this.wmStateTextBox6.TabIndex = 1; + // + // wmStateLabel6 + // + this.wmStateLabel6.AutoSize = true; + this.wmStateLabel6.Location = new System.Drawing.Point(18, 34); + this.wmStateLabel6.Name = "wmStateLabel6"; + this.wmStateLabel6.Size = new System.Drawing.Size(68, 23); + this.wmStateLabel6.TabIndex = 0; + this.wmStateLabel6.Text = "State:"; + // + // CycleEndForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.ClientSize = new System.Drawing.Size(559, 565); + this.Controls.Add(this.groupBox6); + this.Controls.Add(this.groupBox5); + this.Controls.Add(this.groupBox4); + this.Controls.Add(this.groupBox3); + this.Controls.Add(this.okButton); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.groupBox1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "CycleEndForm"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "Water Meter States"; + this.TopMost = true; + this.Load += new System.EventHandler(this.CycleEndForm_Load); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.groupBox4.ResumeLayout(false); + this.groupBox4.PerformLayout(); + this.groupBox5.ResumeLayout(false); + this.groupBox5.PerformLayout(); + this.groupBox6.ResumeLayout(false); + this.groupBox6.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TextBox wmStateTextBox2; + private System.Windows.Forms.Label wmStateLabel2; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TextBox wmStateTextBox1; + private System.Windows.Forms.Label wmStateLabel1; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.TextBox wmStateTextBox3; + private System.Windows.Forms.Label wmStateLabel3; + private System.Windows.Forms.GroupBox groupBox4; + private System.Windows.Forms.TextBox wmStateTextBox4; + private System.Windows.Forms.Label wmStateLabel4; + private System.Windows.Forms.GroupBox groupBox5; + private System.Windows.Forms.TextBox wmStateTextBox5; + private System.Windows.Forms.Label wmStateLabel5; + private System.Windows.Forms.GroupBox groupBox6; + private System.Windows.Forms.TextBox wmStateTextBox6; + private System.Windows.Forms.Label wmStateLabel6; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/WMStatesForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/WMStatesForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/WMStates/WMStatesForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/CycleBeginningForm.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/CycleBeginningForm.Designer.cs new file mode 100644 index 00000000..e7d8ae36 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/CycleBeginningForm.Designer.cs @@ -0,0 +1,86 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.iPerl +{ + partial class CycleBeginningForm + { + /// + /// 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(CycleBeginningForm)); + this.okButton = new System.Windows.Forms.Button(); + this.orderGroupBox = new System.Windows.Forms.GroupBox(); + this.orderComboBox = new System.Windows.Forms.ComboBox(); + this.orderGroupBox.SuspendLayout(); + this.SuspendLayout(); + // + // okButton + // + resources.ApplyResources(this.okButton, "okButton"); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Name = "okButton"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // orderGroupBox + // + this.orderGroupBox.Controls.Add(this.orderComboBox); + resources.ApplyResources(this.orderGroupBox, "orderGroupBox"); + this.orderGroupBox.ForeColor = System.Drawing.Color.Black; + this.orderGroupBox.Name = "orderGroupBox"; + this.orderGroupBox.TabStop = false; + // + // orderComboBox + // + this.orderComboBox.FormattingEnabled = true; + resources.ApplyResources(this.orderComboBox, "orderComboBox"); + this.orderComboBox.Name = "orderComboBox"; + // + // CycleBeginningForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.Controls.Add(this.orderGroupBox); + this.Controls.Add(this.okButton); + this.ForeColor = System.Drawing.Color.Black; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "CycleBeginningForm"; + this.TopMost = true; + this.Load += new System.EventHandler(this.CycleBeginningForm_Load); + this.orderGroupBox.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.GroupBox orderGroupBox; + private System.Windows.Forms.ComboBox orderComboBox; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/CycleBeginningForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/CycleBeginningForm.cs new file mode 100644 index 00000000..00baa453 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/CycleBeginningForm.cs @@ -0,0 +1,118 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using log4net; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.iPerl +{ + public partial class CycleBeginningForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(CycleBeginningForm)); + + /// Number of water meters + public readonly int WaterMetersCount; + + /// To be retrieved after the form is closed + public string PurchaseOrder; + public string[] SNText; + public bool[] Disabled; + + /// Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + + /// Parameterless constructor for common functionality + public CycleBeginningForm() + { + InitializeComponent(); + ControlBox = false; + + completed = false; + StartForceCloseHandler(); + } + + + /// + /// Constructor + /// + /// Number of text boxes for serial numbers + public CycleBeginningForm(int waterMetersCount) + : this() + { + this.WaterMetersCount = waterMetersCount; + SNText = null; + Disabled = null; + } + + + private void CycleBeginningForm_Load(object sender, EventArgs e) + { + Text = Strings.Data; + orderGroupBox.Text = Strings.Purchase_order; + okButton.Text = Strings.OkBtnText; + PrepareOrderCombo(orderComboBox); + } + + /// + /// Load Purchase order combo box items from the LocalSettings PurchaseOrderHistory array + /// + /// Puchase order ComboBox + void PrepareOrderCombo(ComboBox orderComboBox) + { + for (int i = 0; i < Program.LocalSettings.PurchaseOrderHistoryCount; i++) + { + orderComboBox.Items.Add(Program.LocalSettings.PurchaseOrderHistory[i]); + } + + if (orderComboBox.Items.Count > 0) + { + orderComboBox.Text = orderComboBox.Items[0].ToString(); + } + } + + + private void okButton_Click(object sender, EventArgs e) + { + if (orderComboBox.Text.Length > 8) + { + MessageBox.Show(string.Format(Strings.Purchase_order_may_have_max_N_characters, 8), + Strings.Error, + MessageBoxButtons.OK, + MessageBoxIcon.Exclamation); + } + else + { + PurchaseOrder = orderComboBox.Text; + Program.LocalSettings.UpdateHistory(orderComboBox.Text, ref Program.LocalSettings.PurchaseOrderHistory); + + completed = true; + 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); + }; + } + + private void OnForceClose(object sender, EventArgs args) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/CycleBeginningForm.pl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/CycleBeginningForm.pl.resx new file mode 100644 index 00000000..2aa89ae0 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/CycleBeginningForm.pl.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + OK + + + Kolejność + + + Dane partii + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/CycleBeginningForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/CycleBeginningForm.resx new file mode 100644 index 00000000..36ef9cca --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/CycleBeginningForm.resx @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + Verdana, 14.25pt + + + 627, 26 + + + 112, 63 + + + + 7 + + + OK + + + okButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + 90, 31 + + + 376, 31 + + + 0 + + + orderComboBox + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + orderGroupBox + + + 0 + + + Verdana, 14.25pt + + + 28, 12 + + + 537, 82 + + + 0 + + + Order + + + orderGroupBox + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + + + 6, 13 + + + True + + + 801, 119 + + + Batch data + + + CycleBeginningForm + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/CycleBeginningForm.ru.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/CycleBeginningForm.ru.resx new file mode 100644 index 00000000..4dd9a348 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/CycleBeginningForm.ru.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + OK + + + Порядок + + + Пакетные данные + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/CycleEndForm.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/CycleEndForm.Designer.cs new file mode 100644 index 00000000..29d7200a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/CycleEndForm.Designer.cs @@ -0,0 +1,305 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.iPerl +{ + partial class CycleEndForm + { + /// + /// 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() + { + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.textBox2 = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.okButton = new System.Windows.Forms.Button(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.textBox3 = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.textBox4 = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.groupBox5 = new System.Windows.Forms.GroupBox(); + this.textBox5 = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.groupBox6 = new System.Windows.Forms.GroupBox(); + this.textBox6 = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.groupBox2.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.groupBox4.SuspendLayout(); + this.groupBox5.SuspendLayout(); + this.groupBox6.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.textBox2); + this.groupBox2.Controls.Add(this.label2); + this.groupBox2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox2.ForeColor = System.Drawing.Color.Black; + this.groupBox2.Location = new System.Drawing.Point(25, 104); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(362, 81); + this.groupBox2.TabIndex = 2; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Wasserzähler 2"; + // + // textBox2 + // + this.textBox2.Location = new System.Drawing.Point(183, 31); + this.textBox2.Name = "textBox2"; + this.textBox2.Size = new System.Drawing.Size(163, 31); + this.textBox2.TabIndex = 1; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(18, 34); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(74, 23); + this.label2.TabIndex = 0; + this.label2.Text = "Stand:"; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.textBox1); + this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox1.ForeColor = System.Drawing.Color.Black; + this.groupBox1.Location = new System.Drawing.Point(25, 14); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(362, 81); + this.groupBox1.TabIndex = 1; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Wasserzähler 1"; + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(183, 31); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(163, 31); + this.textBox1.TabIndex = 1; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(18, 34); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(74, 23); + this.label1.TabIndex = 0; + this.label1.Text = "Stand:"; + // + // okButton + // + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(425, 23); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(98, 63); + this.okButton.TabIndex = 7; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.textBox3); + this.groupBox3.Controls.Add(this.label3); + this.groupBox3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox3.ForeColor = System.Drawing.Color.Black; + this.groupBox3.Location = new System.Drawing.Point(25, 194); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(362, 81); + this.groupBox3.TabIndex = 3; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "Wasserzähler 3"; + // + // textBox3 + // + this.textBox3.Location = new System.Drawing.Point(183, 31); + this.textBox3.Name = "textBox3"; + this.textBox3.Size = new System.Drawing.Size(163, 31); + this.textBox3.TabIndex = 1; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(18, 34); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(74, 23); + this.label3.TabIndex = 0; + this.label3.Text = "Stand:"; + // + // groupBox4 + // + this.groupBox4.Controls.Add(this.textBox4); + this.groupBox4.Controls.Add(this.label4); + this.groupBox4.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox4.ForeColor = System.Drawing.Color.Black; + this.groupBox4.Location = new System.Drawing.Point(25, 284); + this.groupBox4.Name = "groupBox4"; + this.groupBox4.Size = new System.Drawing.Size(362, 81); + this.groupBox4.TabIndex = 4; + this.groupBox4.TabStop = false; + this.groupBox4.Text = "Wasserzähler 4"; + // + // textBox4 + // + this.textBox4.Location = new System.Drawing.Point(183, 31); + this.textBox4.Name = "textBox4"; + this.textBox4.Size = new System.Drawing.Size(163, 31); + this.textBox4.TabIndex = 1; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(18, 34); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(74, 23); + this.label4.TabIndex = 0; + this.label4.Text = "Stand:"; + // + // groupBox5 + // + this.groupBox5.Controls.Add(this.textBox5); + this.groupBox5.Controls.Add(this.label5); + this.groupBox5.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox5.ForeColor = System.Drawing.Color.Black; + this.groupBox5.Location = new System.Drawing.Point(25, 374); + this.groupBox5.Name = "groupBox5"; + this.groupBox5.Size = new System.Drawing.Size(362, 81); + this.groupBox5.TabIndex = 5; + this.groupBox5.TabStop = false; + this.groupBox5.Text = "Wasserzähler 5"; + // + // textBox5 + // + this.textBox5.Location = new System.Drawing.Point(183, 31); + this.textBox5.Name = "textBox5"; + this.textBox5.Size = new System.Drawing.Size(163, 31); + this.textBox5.TabIndex = 1; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(18, 34); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(74, 23); + this.label5.TabIndex = 0; + this.label5.Text = "Stand:"; + // + // groupBox6 + // + this.groupBox6.Controls.Add(this.textBox6); + this.groupBox6.Controls.Add(this.label6); + this.groupBox6.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox6.ForeColor = System.Drawing.Color.Black; + this.groupBox6.Location = new System.Drawing.Point(25, 464); + this.groupBox6.Name = "groupBox6"; + this.groupBox6.Size = new System.Drawing.Size(362, 81); + this.groupBox6.TabIndex = 6; + this.groupBox6.TabStop = false; + this.groupBox6.Text = "Wasserzähler 6"; + // + // textBox6 + // + this.textBox6.Location = new System.Drawing.Point(183, 31); + this.textBox6.Name = "textBox6"; + this.textBox6.Size = new System.Drawing.Size(163, 31); + this.textBox6.TabIndex = 1; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(18, 34); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(74, 23); + this.label6.TabIndex = 0; + this.label6.Text = "Stand:"; + // + // CycleEndForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.ClientSize = new System.Drawing.Size(559, 566); + this.Controls.Add(this.groupBox6); + this.Controls.Add(this.groupBox5); + this.Controls.Add(this.groupBox4); + this.Controls.Add(this.groupBox3); + this.Controls.Add(this.okButton); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.groupBox1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "CycleEndForm"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "Daten"; + this.TopMost = true; + this.Load += new System.EventHandler(this.CycleEndForm_Load); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.groupBox4.ResumeLayout(false); + this.groupBox4.PerformLayout(); + this.groupBox5.ResumeLayout(false); + this.groupBox5.PerformLayout(); + this.groupBox6.ResumeLayout(false); + this.groupBox6.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TextBox textBox2; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.TextBox textBox3; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.GroupBox groupBox4; + private System.Windows.Forms.TextBox textBox4; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.GroupBox groupBox5; + private System.Windows.Forms.TextBox textBox5; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.GroupBox groupBox6; + private System.Windows.Forms.TextBox textBox6; + private System.Windows.Forms.Label label6; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/CycleEndForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/CycleEndForm.cs new file mode 100644 index 00000000..bb66845e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/CycleEndForm.cs @@ -0,0 +1,110 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using log4net; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.iPerl +{ + public partial class CycleEndForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(CycleEndForm)); + + /// Number of text boxes for serial numbers + public readonly int WaterMetersCount; + + // To be retrieved after the form closes + public string[] EndStateText; + + // Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + /// + /// Constructor + /// + /// Number of text boxes for serial numbers + public CycleEndForm(int waterMetersCount) + { + InitializeComponent(); + ControlBox = false; + + this.WaterMetersCount = waterMetersCount; + EndStateText = new string[WaterMetersCount]; + completed = false; + StartForceCloseHandler(); + } + + /// Parameterless constructor for 3 watermeters + public CycleEndForm() + : this(3) + { + } + + private void CycleEndForm_Load(object sender, EventArgs e) + { + Localize(); + + Height = 50 + 90 * WaterMetersCount; + + if (WaterMetersCount < 1) groupBox1.Visible = false; + if (WaterMetersCount < 2) groupBox2.Visible = false; + if (WaterMetersCount < 3) groupBox3.Visible = false; + if (WaterMetersCount < 4) groupBox4.Visible = false; + if (WaterMetersCount < 5) groupBox5.Visible = false; + if (WaterMetersCount < 6) groupBox6.Visible = false; + } + + void Localize() + { + Text = Strings.Data; + groupBox1.Text = Strings.Water_Meter + " 1"; + groupBox2.Text = Strings.Water_Meter + " 2"; + groupBox3.Text = Strings.Water_Meter + " 3"; + groupBox4.Text = Strings.Water_Meter + " 4"; + groupBox5.Text = Strings.Water_Meter + " 5"; + groupBox6.Text = Strings.Water_Meter + " 6"; + label1.Text = Strings.State; + label2.Text = Strings.State; + label3.Text = Strings.State; + label4.Text = Strings.State; + label5.Text = Strings.State; + label6.Text = Strings.State; + okButton.Text = Strings.OkBtnText; + } + + private void okButton_Click(object sender, EventArgs e) + { + if (WaterMetersCount >= 1) EndStateText[0] = textBox1.Text; + if (WaterMetersCount >= 2) EndStateText[1] = textBox3.Text; + if (WaterMetersCount >= 3) EndStateText[2] = textBox4.Text; + if (WaterMetersCount >= 4) EndStateText[3] = textBox5.Text; + if (WaterMetersCount >= 5) EndStateText[4] = textBox6.Text; + if (WaterMetersCount >= 6) EndStateText[5] = textBox6.Text; + + completed = true; + 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) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/CycleEndForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/CycleEndForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/CycleEndForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/EntryForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/EntryForm.cs new file mode 100644 index 00000000..a26f3e8b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/EntryForm.cs @@ -0,0 +1,264 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; +using TBF.BenchControl; +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl.DataEntry.iPerl +{ + public class EntryForm : ComponentBase, IOperation, IDataEntry, IHasCycleBeginForm, IHasCycleEndForm, IHasWMStatesForm + { + private static readonly ILog log = LogManager.GetLogger(typeof(EntryForm)); + public override string ToString() { return string.Format("DataEntry.iPerl({0})", Cfg.ToString(1)); } + + public bool UsesCameras() { return false; } + + readonly EntryFormCfg entryFormCfg; + IRegisterReader[] regReaders; + + /// + /// Properties set by the Begin, End and WMStates form + /// + string purchaseOrder; + public string PurchaseOrder { get { return purchaseOrder; } } + + bool[] disabled; /// This array is shared between forms + + string[] wmCycleEndState; + public string WMCycleEndState(int wmNr) { return (wmNr >= 0 && wmNr < wmCycleEndState.Length) ? wmCycleEndState[wmNr] : string.Empty; } + + double[] wmStartState; + public double WMStartState(int wmNr) { return (wmNr >= 0 && wmNr < wmStartState.Length) ? wmStartState[wmNr] : 0; } + + double[] wmEndState; + public double WMEndState(int wmNr) { return (wmNr >= 0 && wmNr < wmEndState.Length) ? wmEndState[wmNr] : 0; } + + string[] wmStartStateStr; + + + System.Windows.Forms.Form modelessDlg; + + double refVolume; + double errLimLo; + double errLimHi; + + bool resultSaved; /// Set in Run() when results are saved + + Results.Entities.WaterMeter[] waterMeters; /// Reference to ...ProcessData.BatchRslts.WaterMeters[] + + public enum CurrentOp + { + None, + ShowFormAtCycleBeginning, + ShowFormAtCycleEnd, + EnterTestStartStates, + EnterTestEndStates, + } + + CurrentOp currentOp; + + + public EntryForm() + { + } + + public EntryForm(Generic.IComponentCfg cfg) + : base(cfg) + { + entryFormCfg = cfg as EntryFormCfg; + + disabled = new bool[Config.Data.WMsCount]; + wmStartState = new double[Config.Data.WMsCount]; + wmStartStateStr = new string[Config.Data.WMsCount]; + wmEndState = new double[Config.Data.WMsCount]; + wmCycleEndState = new string[Config.Data.WMsCount]; + + currentOp = CurrentOp.None; + log.Debug(this.ToString()); + } + + /// Reference to the operation + public IOperation ShowCycleBeginFormOp() + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.ShowFormAtCycleBeginning; + this.waterMeters = TBF.BenchControl.Sequences.ProcessData.BatchRslts.WaterMeters; + return this; + } + + /// Reference to the operation + public IOperation ShowCycleEndFormOp() + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.ShowFormAtCycleEnd; + this.waterMeters = TBF.BenchControl.Sequences.ProcessData.BatchRslts.WaterMeters; + return this; + } + + /// Reference to the operation + public IOperation ShowTestStartFormOp(IRegisterReader[] regReaders) + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.EnterTestStartStates; + this.regReaders = regReaders; + return this; + } + + /// Reference to the operation + public IOperation ShowTestEndFormOp(IRegisterReader[] regReaders, double refVolume, double errLimLo, double errLimHi) + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.EnterTestEndStates; + this.regReaders = regReaders; + this.refVolume = refVolume; + this.errLimLo = errLimLo; + this.errLimHi = errLimHi; + return this; + } + + delegate void EntryFormDlgt(EntryForm myRef); + /// + void OpenBeginningDlg(EntryForm myRef) + { + myRef.modelessDlg = new CycleBeginningForm(Config.Data.WMsCount); + modelessDlg.Show(); + } + /// + void OpenEndDlg(EntryForm myRef) + { + myRef.modelessDlg = new CycleEndForm(Config.Data.WMsCount); + modelessDlg.Show(); + } + /// + void OpenTestStartStatesDlg(EntryForm myRef) + { + myRef.modelessDlg = new TestStartEndForm(myRef.waterMeters.Length, myRef.regReaders, disabled); + modelessDlg.Show(); + } + /// + void OpenTestEndStatesDlg(EntryForm myRef) + { + myRef.modelessDlg = new TestStartEndForm(Config.Data.WMsCount, myRef.regReaders, wmStartStateStr, disabled, refVolume, errLimLo, errLimHi); + modelessDlg.Show(); + } + + /// Start this operation + public void Start() + { + resultSaved = false; + switch (currentOp) + { + case CurrentOp.ShowFormAtCycleBeginning: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenBeginningDlg), this); + break; + case CurrentOp.ShowFormAtCycleEnd: + if (entryFormCfg.ShowCycleEndForm) + { + Program.MainWnd.Invoke(new EntryFormDlgt(OpenEndDlg), this); + } + break; + case CurrentOp.EnterTestStartStates: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenTestStartStatesDlg), this); + break; + case CurrentOp.EnterTestEndStates: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenTestEndStatesDlg), this); + break; + } + } + + /// Run this operation + /// Event.ResultsPrinted + public Event Run() + { + if ((modelessDlg is IHasCompleted) && !(modelessDlg as IHasCompleted).Completed) + { + return Event.ModelessFormIsOpen; + } + + if (!resultSaved) /// This is to save the result only once + { + if (currentOp == CurrentOp.ShowFormAtCycleBeginning) + { + CycleBeginningForm dlg = (modelessDlg as CycleBeginningForm); + + if (dlg != null) + { + purchaseOrder = dlg.PurchaseOrder; + } + } + else if (entryFormCfg.ShowCycleEndForm && currentOp == CurrentOp.ShowFormAtCycleEnd) + { + CycleEndForm dlg = (modelessDlg as CycleEndForm); + int count = waterMeters.Length; + if ((dlg != null) && (count > dlg.WaterMetersCount)) count = dlg.WaterMetersCount; + + for (int i = 0; i < count; i++) + { + if (waterMeters[i] != null) + { + /// In case entryFormCfg.ShowCycleEndForm == false dlg would be null, values would be string.Empty + wmCycleEndState[i] = waterMeters[i].EndState = (dlg != null) ? dlg.EndStateText[i] : string.Empty; + } + } + } + else if (modelessDlg is TestStartEndForm && currentOp == CurrentOp.EnterTestStartStates) + { + /// Fixed start test - start + TestStartEndForm dlg = (modelessDlg as TestStartEndForm); + if (dlg != null) + { + for (int i = 0; i < dlg.WaterMetersCount; i++) + { + wmStartState[i] = dlg.WMStartState[i]; + wmStartStateStr[i] = dlg.WMStartStateStr[i]; + } + } + } + else if (modelessDlg is TestStartEndForm && currentOp == CurrentOp.EnterTestEndStates) + { + /// Fixed start test - end + TestStartEndForm dlg = (modelessDlg as TestStartEndForm); + if (dlg != null) + { + for (int i = 0; i < dlg.WaterMetersCount; i++) + { + wmEndState[i] = dlg.WMEndState[i]; + } + } + } + resultSaved = true; + modelessDlg = null; + } + + return Event.ModelessFormClosed; /// Form closed + } + + /// Stop this operation + public void Stop() + { + if (modelessDlg is IHasCompleted) + { + UiBridge.Bridge.OnCloseModelessForm(this, null); + modelessDlg = null; + } + currentOp = CurrentOp.None; + } + + /// + /// Updates test results with the information collected in watermeters. + /// + /// Watermetes with information entered in the forms + /// Test results to be updated with the information + public void UpdateTestResults(Results.BatchResults batchResults) + { + foreach (var wm in batchResults.WaterMeters) + { + if (wm != null && !wm.Disabled) wm.PurchaseOrder = PurchaseOrder; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/EntryFormCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/EntryFormCfg.cs new file mode 100644 index 00000000..33aaa089 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/EntryFormCfg.cs @@ -0,0 +1,43 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DataEntry.iPerl +{ + public class EntryFormCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(EntryFormCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new EntryFormCfgCtrl(); } + + /// + /// Serialized parameters + /// + public bool ShowCycleEndForm; + + /// Private parameterless constructor invoked by all other (public) constructors + EntryFormCfg() + { + Name = "DataEntry-iPerl"; + ParentName = string.Empty; + ShowCycleEndForm = false; + } + + public EntryFormCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, ShowEndForm={1}", Name, ShowCycleEndForm); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/EntryFormCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/EntryFormCfgCtrl.cs new file mode 100644 index 00000000..efc3a31f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/EntryFormCfgCtrl.cs @@ -0,0 +1,79 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.iPerl +{ + public partial class EntryFormCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + EntryFormCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as EntryFormCfg; + Redraw(); + } + } + + public EntryFormCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Localize(); + Redraw(); + } + + void Localize() + { + showCycleEndFormCheckBox.Text = Strings.Show_cycle_end_form; + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + showCycleEndFormCheckBox.Checked = config.ShowCycleEndForm; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + showCycleEndFormCheckBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.ShowCycleEndForm = showCycleEndFormCheckBox.Checked; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/EntryFormCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/EntryFormCfgCtrl.designer.cs new file mode 100644 index 00000000..9f835435 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/EntryFormCfgCtrl.designer.cs @@ -0,0 +1,100 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.iPerl +{ + partial class EntryFormCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.showCycleEndFormCheckBox = new System.Windows.Forms.CheckBox(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(131, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 5; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(32, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 4; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(128, 32); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 3; + this.classNameLabel.Text = "ComonentName"; + // + // showCycleEndFormCheckBox + // + this.showCycleEndFormCheckBox.AutoSize = true; + this.showCycleEndFormCheckBox.Enabled = false; + this.showCycleEndFormCheckBox.Location = new System.Drawing.Point(131, 90); + this.showCycleEndFormCheckBox.Name = "showCycleEndFormCheckBox"; + this.showCycleEndFormCheckBox.Size = new System.Drawing.Size(125, 17); + this.showCycleEndFormCheckBox.TabIndex = 13; + this.showCycleEndFormCheckBox.Text = "Show cycle end form"; + this.showCycleEndFormCheckBox.UseVisualStyleBackColor = true; + // + // EntryFormCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.showCycleEndFormCheckBox); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "EntryFormCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.CheckBox showCycleEndFormCheckBox; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/EntryFormCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/EntryFormCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/EntryFormCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/EntryFormFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/EntryFormFactory.cs new file mode 100644 index 00000000..1a2f8ebf --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/EntryFormFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.DataEntry.iPerl +{ + public class EntryFormFactory : IComponentFactory + { + public string ClassName { get { return "DataEntry-iPerl"; } } + + public void ResetStaticProperties() { EntryForm.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new EntryForm(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new EntryForm(cfg); } + + public IComponentCfg DefaultConfig() { return new EntryFormCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(EntryFormCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/TestStartEndForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/TestStartEndForm.cs new file mode 100644 index 00000000..61851be3 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/TestStartEndForm.cs @@ -0,0 +1,478 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using log4net; +using TBF.BenchControl.GenericDevices; +using TBF.Resources; + +namespace TBF.BenchControl.DataEntry.iPerl +{ + public partial class TestStartEndForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(TestStartEndForm)); + + // Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + /// Number of text boxes for serial numbers + public readonly int WaterMetersCount; + readonly IRegisterReader[] regReaders; + readonly bool[] disabled; + + // To be retrieved after the form closes + public double[] WMStartState; + + // To be retrieved after the form closes + public readonly string[] WMStartStateStr; + + // To be retrieved after the form closes + public double[] WMEndState; + + bool endStates; /// false=start states, true=end states + double refVolume; + double warningLimLo; /// limit to display exclamation mark, typically 2x errLimLo + double warningLimHi; /// limit to display exclamation mark, typically 2x errLimHi + + int TextBoxesCount; + /// + Label[] labels; + TextBox[] startTextBoxes; + TextBox[] endTextBoxes; + IList enabledTextBoxes; + + /// + /// Parameterless constructor initializing common part for start and endstate form + /// + public TestStartEndForm() + { + InitializeComponent(); + ControlBox = false; + + TextBoxesCount = 48; + + labels = new Label[] + { + label1, label2, label3, label4, label5, label6, label7, label8, label9, label10, + label11, label12, label13, label14, label15, label16, label17, label18, label19, label20, + label21, label22, label23, label24, label25, label26, label27, label28, label29, label30, + label31, label32, label33, label34, label35, label36, label37, label38, label39, label40, + label41, label42, label43, label44, label45, label46, label47, label48, + }; + startTextBoxes = new TextBox[] + { + startTextBox1, startTextBox2, startTextBox3, startTextBox4, startTextBox5, startTextBox6, startTextBox7, startTextBox8, startTextBox9, startTextBox10, + startTextBox11, startTextBox12, startTextBox13, startTextBox14, startTextBox15, startTextBox16, startTextBox17, startTextBox18, startTextBox19, startTextBox20, + startTextBox21, startTextBox22, startTextBox23, startTextBox24, startTextBox25, startTextBox26, startTextBox27, startTextBox28, startTextBox29, startTextBox30, + startTextBox31, startTextBox32, startTextBox33, startTextBox34, startTextBox35, startTextBox36, startTextBox37, startTextBox38, startTextBox39, startTextBox40, + startTextBox41, startTextBox42, startTextBox43, startTextBox44, startTextBox45, startTextBox46, startTextBox47, startTextBox48, + }; + endTextBoxes = new TextBox[] + { + endTextBox1, endTextBox2, endTextBox3, endTextBox4, endTextBox5, endTextBox6, endTextBox7, endTextBox8, endTextBox9, endTextBox10, + endTextBox11, endTextBox12, endTextBox13, endTextBox14, endTextBox15, endTextBox16, endTextBox17, endTextBox18, endTextBox19, endTextBox20, + endTextBox21, endTextBox22, endTextBox23, endTextBox24, endTextBox25, endTextBox26, endTextBox27, endTextBox28, endTextBox29, endTextBox30, + endTextBox31, endTextBox32, endTextBox33, endTextBox34, endTextBox35, endTextBox36, endTextBox37, endTextBox38, endTextBox39, endTextBox40, + endTextBox41, endTextBox42, endTextBox43, endTextBox44, endTextBox45, endTextBox46, endTextBox47, endTextBox48, + }; + enabledTextBoxes = new List(); + + completed = false; + StartForceCloseHandler(); + } + + /// + /// Constructor to fill in start states + /// + /// Number of water meters + /// Information from CycleBeginningForm about availability of water meters + public TestStartEndForm(int waterMetersCount, IRegisterReader[] regReaders, bool[] disabled) + : this() + { + endStates = false; + + this.WaterMetersCount = waterMetersCount; + this.regReaders = regReaders; + this.disabled = disabled; + + ShuffleTextBoxes(); + + WMStartState = new double[waterMetersCount]; + WMStartStateStr = new string[waterMetersCount]; + } + + /// + /// Constructor to fill in end states + /// + /// Number of water meters + /// Information entered on test start + /// Information from CycleBeginningForm about availability of water meters + /// Reference volume, it is used to verify the end state, show/hide exclamation if necessary + /// Error limit low, it is used to verify the end state, show/hide exclamation if necessary + /// Error limit high, it is used to verify the end state, show/hide exclamation if necessary + public TestStartEndForm(int waterMetersCount, IRegisterReader[] regReaders, string[] wmStartStateStr, bool[] disabled, + double refVolume, double errLimLo, double errLimHi) + : this() + { + endStates = true; + + this.WaterMetersCount = waterMetersCount; + this.regReaders = regReaders; + if (wmStartStateStr == null || wmStartStateStr.Length != waterMetersCount) + throw (new Exception("Invalid 'wmStartStateStr' argument")); + this.WMStartStateStr = wmStartStateStr; + this.disabled = disabled; + this.refVolume = refVolume; + this.warningLimLo = 2 * errLimLo; + this.warningLimHi = 2 * errLimHi; + + ShuffleTextBoxes(); + + WMEndState = new double[waterMetersCount]; + } + + /// + /// Make sure the layout of labels/text boxes on the screen + /// corresponds to the layout of watermeters of the test bench. + /// + void ShuffleTextBoxes() + { + if (Config.Data.WMsCount < TextBoxesCount) + { + int nrLines = Config.Data.WMsCount / Config.Data.LineSize; + int gap = (TextBoxesCount - Config.Data.WMsCount) / nrLines; + + int dest = 0; + for (int l = 0; l < nrLines; l++) + { + for (int i = 0; i < Config.Data.LineSize; i++) + { + labels[dest] = labels[l * Config.Data.LineSize + l * gap + i]; + startTextBoxes[dest] = startTextBoxes[l * Config.Data.LineSize + l * gap + i]; + endTextBoxes[dest] = endTextBoxes[l * Config.Data.LineSize + l * gap + i]; + dest++; + } + } + TextBoxesCount = Config.Data.WMsCount; + } + } + + private void CycleEndForm_Load(object sender, EventArgs e) + { + Localize(); + + //Height = 115 + 90 * WaterMetersCount; + + for (int i = 0; i < TextBoxesCount; i++) + { + if (i < WaterMetersCount) + { + labels[i].Visible = startTextBoxes[i].Visible = endTextBoxes[i].Visible = true; + } + } + + if (endStates) + { + for (int i = 0; i < TextBoxesCount; i++) + { + if (WMStartStateStr != null && i < WMStartStateStr.Length) + { + startTextBoxes[i].Text = WMStartStateStr[i]; + } + + if (disabled != null && i < disabled.Length && disabled[i]) + { + endTextBoxes[i].Enabled = false; + } + else + { + endTextBoxes[i].Enabled = true; + enabledTextBoxes.Add(endTextBoxes[i]); + } + } + } + else + { + for (int i = 0; i < TextBoxesCount; i++) + { + if (disabled != null && i < disabled.Length && disabled[i]) + { + startTextBoxes[i].Enabled = false; + } + else + { + startTextBoxes[i].Enabled = true; + enabledTextBoxes.Add(startTextBoxes[i]); + } + } + } + } + + void Localize() + { + Text = Strings.Water_Meter_States; + for (int i = 0; i < TextBoxesCount; i++) + { + labels[i].Text = string.Format("{0} {1}", Strings.Water_Meter, i + 1); + } + startLabel.Text = start2Label.Text = Strings.Start; + endLabel.Text = end2Label.Text = Strings.End; + okButton.Text = Strings.OkBtnText; + } + + private void okButton_Click(object sender, EventArgs eArgs) + { + try + { + if (endStates) + { + for (int i = 0; i < Math.Min(WaterMetersCount, TextBoxesCount); i++) + { + if (endTextBoxes[i].Visible && endTextBoxes[i].Enabled) + { + WMEndState[i] = Utils.ParseUDouble(endTextBoxes[i].Text); + } + } + } + else + { + for (int i = 0; i < Math.Min(WaterMetersCount, TextBoxesCount); i++) + { + if (startTextBoxes[i].Visible && startTextBoxes[i].Enabled) + { + WMStartStateStr[i] = startTextBoxes[i].Text; + WMStartState[i] = Utils.ParseUDouble(startTextBoxes[i].Text); + } + } + } + } + catch(Exception e) + { + log.ErrorFormat("Exception: {0}", e.Message); + return; + } + + completed = true; + 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) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + + + /// + /// Calculate the approximate error and verify whether it is within limits. + /// Make an exclamation mark visible if out of range. + /// Similar event handler is implemented for all endTextBoxes (1..24). + /// + private void ProcTextChanged(object sender, EventArgs e, TextBox endStateTB, TextBox startStateTB, Label exclamation) + { + double err = 0; + try + { + double endState = Utils.ParseUDouble(endStateTB.Text); + double startState = Utils.ParseUDouble(startStateTB.Text); + err = 100.0 * (endState - startState - refVolume) / refVolume; + } + catch { err = 1000.0f; }; + exclamation.Visible = (err < warningLimLo) || (warningLimHi < err); + } + + private void endTextBox1_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox1, startTextBox1, exclamation1); } + private void endTextBox2_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox2, startTextBox2, exclamation2); } + private void endTextBox3_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox3, startTextBox3, exclamation3); } + private void endTextBox4_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox4, startTextBox4, exclamation4); } + private void endTextBox5_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox5, startTextBox5, exclamation5); } + private void endTextBox6_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox6, startTextBox6, exclamation6); } + private void endTextBox7_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox7, startTextBox7, exclamation7); } + private void endTextBox8_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox8, startTextBox8, exclamation8); } + private void endTextBox9_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox9, startTextBox9, exclamation9); } + private void endTextBox10_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox10, startTextBox10, exclamation10); } + private void endTextBox11_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox11, startTextBox11, exclamation11); } + private void endTextBox12_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox12, startTextBox12, exclamation12); } + private void endTextBox13_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox13, startTextBox13, exclamation13); } + private void endTextBox14_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox14, startTextBox14, exclamation14); } + private void endTextBox15_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox15, startTextBox15, exclamation15); } + private void endTextBox16_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox16, startTextBox16, exclamation16); } + private void endTextBox17_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox17, startTextBox17, exclamation17); } + private void endTextBox18_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox18, startTextBox18, exclamation18); } + private void endTextBox19_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox19, startTextBox19, exclamation19); } + private void endTextBox20_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox20, startTextBox20, exclamation20); } + private void endTextBox21_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox21, startTextBox21, exclamation21); } + private void endTextBox22_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox22, startTextBox22, exclamation22); } + private void endTextBox23_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox23, startTextBox23, exclamation23); } + private void endTextBox24_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox24, startTextBox24, exclamation24); } + private void endTextBox25_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox25, startTextBox25, exclamation25); } + private void endTextBox26_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox26, startTextBox26, exclamation26); } + private void endTextBox27_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox27, startTextBox27, exclamation27); } + private void endTextBox28_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox28, startTextBox28, exclamation28); } + private void endTextBox29_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox29, startTextBox29, exclamation29); } + private void endTextBox30_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox30, startTextBox30, exclamation30); } + private void endTextBox31_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox31, startTextBox31, exclamation31); } + private void endTextBox32_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox32, startTextBox32, exclamation32); } + private void endTextBox33_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox33, startTextBox33, exclamation33); } + private void endTextBox34_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox34, startTextBox34, exclamation34); } + private void endTextBox35_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox35, startTextBox35, exclamation35); } + private void endTextBox36_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox36, startTextBox36, exclamation36); } + private void endTextBox37_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox37, startTextBox37, exclamation37); } + private void endTextBox38_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox38, startTextBox38, exclamation38); } + private void endTextBox39_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox39, startTextBox39, exclamation39); } + private void endTextBox40_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox40, startTextBox40, exclamation40); } + private void endTextBox41_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox41, startTextBox41, exclamation41); } + private void endTextBox42_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox42, startTextBox42, exclamation42); } + private void endTextBox43_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox43, startTextBox43, exclamation43); } + private void endTextBox44_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox44, startTextBox44, exclamation44); } + private void endTextBox45_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox45, startTextBox45, exclamation45); } + private void endTextBox46_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox46, startTextBox46, exclamation46); } + private void endTextBox47_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox47, startTextBox47, exclamation47); } + private void endTextBox48_TextChanged(object sndr, EventArgs e) { ProcTextChanged(sndr, e, endTextBox48, startTextBox48, exclamation48); } + + + /// + /// Process a key press within any enabled text boxe + /// + /// + /// + /// TextBox control which received the event + private void ProcKeyPress(object sender, KeyPressEventArgs e, TextBox currentFocusOwner) + { + if (e.KeyChar == '+') + { + /// Process '+' key ..... Form completed + okButton_Click(sender, e); + } + if (e.KeyChar == '\r') + { + /// Process key ..... Next text field + if (enabledTextBoxes.Count < 2) return; /// There is just one enabled textbox + + for (int i = 0; i < enabledTextBoxes.Count; i++) + { + if (enabledTextBoxes[i] == currentFocusOwner) + { + /// Change focus to the next enabled text box + enabledTextBoxes[(i + 1) % enabledTextBoxes.Count].Focus(); + return; + } + } + } + } + + private void startTextBox1_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox1); } + private void startTextBox2_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox2); } + private void startTextBox3_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox3); } + private void startTextBox4_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox4); } + private void startTextBox5_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox5); } + private void startTextBox6_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox6); } + private void startTextBox7_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox7); } + private void startTextBox8_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox8); } + private void startTextBox9_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox9); } + private void startTextBox10_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox10); } + private void startTextBox11_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox11); } + private void startTextBox12_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox12); } + private void startTextBox13_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox13); } + private void startTextBox14_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox14); } + private void startTextBox15_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox15); } + private void startTextBox16_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox16); } + private void startTextBox17_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox17); } + private void startTextBox18_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox18); } + private void startTextBox19_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox19); } + private void startTextBox20_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox20); } + private void startTextBox21_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox21); } + private void startTextBox22_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox22); } + private void startTextBox23_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox23); } + private void startTextBox24_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox24); } + private void startTextBox25_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox25); } + private void startTextBox26_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox26); } + private void startTextBox27_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox27); } + private void startTextBox28_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox28); } + private void startTextBox29_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox29); } + private void startTextBox30_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox30); } + private void startTextBox31_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox31); } + private void startTextBox32_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox32); } + private void startTextBox33_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox33); } + private void startTextBox34_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox34); } + private void startTextBox35_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox35); } + private void startTextBox36_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox36); } + private void startTextBox37_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox37); } + private void startTextBox38_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox38); } + private void startTextBox39_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox39); } + private void startTextBox40_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox40); } + private void startTextBox41_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox41); } + private void startTextBox42_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox42); } + private void startTextBox43_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox43); } + private void startTextBox44_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox44); } + private void startTextBox45_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox45); } + private void startTextBox46_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox46); } + private void startTextBox47_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox47); } + private void startTextBox48_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox48); } + + private void endTextBox1_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox1); } + private void endTextBox2_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox2); } + private void endTextBox3_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox3); } + private void endTextBox4_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox4); } + private void endTextBox5_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox5); } + private void endTextBox6_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox6); } + private void endTextBox7_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox7); } + private void endTextBox8_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox8); } + private void endTextBox9_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox9); } + private void endTextBox10_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox10); } + private void endTextBox11_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox11); } + private void endTextBox12_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox12); } + private void endTextBox13_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox13); } + private void endTextBox14_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox14); } + private void endTextBox15_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox15); } + private void endTextBox16_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox16); } + private void endTextBox17_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox17); } + private void endTextBox18_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox18); } + private void endTextBox19_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox19); } + private void endTextBox20_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox20); } + private void endTextBox21_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox21); } + private void endTextBox22_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox22); } + private void endTextBox23_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox23); } + private void endTextBox24_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox24); } + private void endTextBox25_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox25); } + private void endTextBox26_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox26); } + private void endTextBox27_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox27); } + private void endTextBox28_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox28); } + private void endTextBox29_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox29); } + private void endTextBox30_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox30); } + private void endTextBox31_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox31); } + private void endTextBox32_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox32); } + private void endTextBox33_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox33); } + private void endTextBox34_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox34); } + private void endTextBox35_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox35); } + private void endTextBox36_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox36); } + private void endTextBox37_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox37); } + private void endTextBox38_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox38); } + private void endTextBox39_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox39); } + private void endTextBox40_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox40); } + private void endTextBox41_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox41); } + private void endTextBox42_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox42); } + private void endTextBox43_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox43); } + private void endTextBox44_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox44); } + private void endTextBox45_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox45); } + private void endTextBox46_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox46); } + private void endTextBox47_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox47); } + private void endTextBox48_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox48); } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/TestStartEndForm.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/TestStartEndForm.designer.cs new file mode 100644 index 00000000..2c8b9b73 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/TestStartEndForm.designer.cs @@ -0,0 +1,2908 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.DataEntry.iPerl +{ + partial class TestStartEndForm + { + /// + /// 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() + { + this.exclamation1 = new System.Windows.Forms.Label(); + this.startTextBox1 = new System.Windows.Forms.TextBox(); + this.endTextBox1 = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.okButton = new System.Windows.Forms.Button(); + this.exclamation3 = new System.Windows.Forms.Label(); + this.startTextBox3 = new System.Windows.Forms.TextBox(); + this.endTextBox3 = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.exclamation4 = new System.Windows.Forms.Label(); + this.startTextBox4 = new System.Windows.Forms.TextBox(); + this.endTextBox4 = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.exclamation5 = new System.Windows.Forms.Label(); + this.startTextBox5 = new System.Windows.Forms.TextBox(); + this.endTextBox5 = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.exclamation6 = new System.Windows.Forms.Label(); + this.startTextBox6 = new System.Windows.Forms.TextBox(); + this.endTextBox6 = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.startLabel = new System.Windows.Forms.Label(); + this.endLabel = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.endTextBox2 = new System.Windows.Forms.TextBox(); + this.startTextBox2 = new System.Windows.Forms.TextBox(); + this.exclamation2 = new System.Windows.Forms.Label(); + this.exclamation7 = new System.Windows.Forms.Label(); + this.startTextBox7 = new System.Windows.Forms.TextBox(); + this.endTextBox7 = new System.Windows.Forms.TextBox(); + this.label7 = new System.Windows.Forms.Label(); + this.exclamation8 = new System.Windows.Forms.Label(); + this.startTextBox8 = new System.Windows.Forms.TextBox(); + this.endTextBox8 = new System.Windows.Forms.TextBox(); + this.label8 = new System.Windows.Forms.Label(); + this.exclamation9 = new System.Windows.Forms.Label(); + this.startTextBox9 = new System.Windows.Forms.TextBox(); + this.endTextBox9 = new System.Windows.Forms.TextBox(); + this.label9 = new System.Windows.Forms.Label(); + this.exclamation10 = new System.Windows.Forms.Label(); + this.startTextBox10 = new System.Windows.Forms.TextBox(); + this.endTextBox10 = new System.Windows.Forms.TextBox(); + this.label10 = new System.Windows.Forms.Label(); + this.exclamation11 = new System.Windows.Forms.Label(); + this.startTextBox11 = new System.Windows.Forms.TextBox(); + this.endTextBox11 = new System.Windows.Forms.TextBox(); + this.label11 = new System.Windows.Forms.Label(); + this.exclamation12 = new System.Windows.Forms.Label(); + this.startTextBox12 = new System.Windows.Forms.TextBox(); + this.endTextBox12 = new System.Windows.Forms.TextBox(); + this.label12 = new System.Windows.Forms.Label(); + this.exclamation24 = new System.Windows.Forms.Label(); + this.startTextBox24 = new System.Windows.Forms.TextBox(); + this.endTextBox24 = new System.Windows.Forms.TextBox(); + this.label24 = new System.Windows.Forms.Label(); + this.exclamation23 = new System.Windows.Forms.Label(); + this.startTextBox23 = new System.Windows.Forms.TextBox(); + this.endTextBox23 = new System.Windows.Forms.TextBox(); + this.label23 = new System.Windows.Forms.Label(); + this.exclamation22 = new System.Windows.Forms.Label(); + this.startTextBox22 = new System.Windows.Forms.TextBox(); + this.endTextBox22 = new System.Windows.Forms.TextBox(); + this.label22 = new System.Windows.Forms.Label(); + this.exclamation21 = new System.Windows.Forms.Label(); + this.startTextBox21 = new System.Windows.Forms.TextBox(); + this.endTextBox21 = new System.Windows.Forms.TextBox(); + this.label21 = new System.Windows.Forms.Label(); + this.exclamation20 = new System.Windows.Forms.Label(); + this.startTextBox20 = new System.Windows.Forms.TextBox(); + this.endTextBox20 = new System.Windows.Forms.TextBox(); + this.label20 = new System.Windows.Forms.Label(); + this.exclamation19 = new System.Windows.Forms.Label(); + this.startTextBox19 = new System.Windows.Forms.TextBox(); + this.endTextBox19 = new System.Windows.Forms.TextBox(); + this.label19 = new System.Windows.Forms.Label(); + this.exclamation18 = new System.Windows.Forms.Label(); + this.exclamation17 = new System.Windows.Forms.Label(); + this.startTextBox18 = new System.Windows.Forms.TextBox(); + this.exclamation16 = new System.Windows.Forms.Label(); + this.endTextBox18 = new System.Windows.Forms.TextBox(); + this.label18 = new System.Windows.Forms.Label(); + this.startTextBox17 = new System.Windows.Forms.TextBox(); + this.exclamation15 = new System.Windows.Forms.Label(); + this.endTextBox17 = new System.Windows.Forms.TextBox(); + this.label17 = new System.Windows.Forms.Label(); + this.startTextBox16 = new System.Windows.Forms.TextBox(); + this.exclamation14 = new System.Windows.Forms.Label(); + this.endTextBox16 = new System.Windows.Forms.TextBox(); + this.label16 = new System.Windows.Forms.Label(); + this.startTextBox15 = new System.Windows.Forms.TextBox(); + this.exclamation13 = new System.Windows.Forms.Label(); + this.endTextBox15 = new System.Windows.Forms.TextBox(); + this.label15 = new System.Windows.Forms.Label(); + this.startTextBox14 = new System.Windows.Forms.TextBox(); + this.end2Label = new System.Windows.Forms.Label(); + this.endTextBox14 = new System.Windows.Forms.TextBox(); + this.label14 = new System.Windows.Forms.Label(); + this.startTextBox13 = new System.Windows.Forms.TextBox(); + this.start2Label = new System.Windows.Forms.Label(); + this.endTextBox13 = new System.Windows.Forms.TextBox(); + this.label13 = new System.Windows.Forms.Label(); + this.exclamation25 = new System.Windows.Forms.Label(); + this.startTextBox25 = new System.Windows.Forms.TextBox(); + this.endTextBox25 = new System.Windows.Forms.TextBox(); + this.label25 = new System.Windows.Forms.Label(); + this.label26 = new System.Windows.Forms.Label(); + this.label27 = new System.Windows.Forms.Label(); + this.label28 = new System.Windows.Forms.Label(); + this.label29 = new System.Windows.Forms.Label(); + this.label30 = new System.Windows.Forms.Label(); + this.label31 = new System.Windows.Forms.Label(); + this.label32 = new System.Windows.Forms.Label(); + this.label33 = new System.Windows.Forms.Label(); + this.label34 = new System.Windows.Forms.Label(); + this.label35 = new System.Windows.Forms.Label(); + this.label36 = new System.Windows.Forms.Label(); + this.label37 = new System.Windows.Forms.Label(); + this.label38 = new System.Windows.Forms.Label(); + this.label39 = new System.Windows.Forms.Label(); + this.label40 = new System.Windows.Forms.Label(); + this.label41 = new System.Windows.Forms.Label(); + this.label42 = new System.Windows.Forms.Label(); + this.label43 = new System.Windows.Forms.Label(); + this.label44 = new System.Windows.Forms.Label(); + this.label45 = new System.Windows.Forms.Label(); + this.label46 = new System.Windows.Forms.Label(); + this.label47 = new System.Windows.Forms.Label(); + this.label48 = new System.Windows.Forms.Label(); + this.startTextBox48 = new System.Windows.Forms.TextBox(); + this.startTextBox47 = new System.Windows.Forms.TextBox(); + this.startTextBox46 = new System.Windows.Forms.TextBox(); + this.startTextBox45 = new System.Windows.Forms.TextBox(); + this.startTextBox44 = new System.Windows.Forms.TextBox(); + this.startTextBox43 = new System.Windows.Forms.TextBox(); + this.startTextBox42 = new System.Windows.Forms.TextBox(); + this.startTextBox41 = new System.Windows.Forms.TextBox(); + this.startTextBox40 = new System.Windows.Forms.TextBox(); + this.startTextBox39 = new System.Windows.Forms.TextBox(); + this.startTextBox38 = new System.Windows.Forms.TextBox(); + this.startTextBox37 = new System.Windows.Forms.TextBox(); + this.startTextBox36 = new System.Windows.Forms.TextBox(); + this.startTextBox35 = new System.Windows.Forms.TextBox(); + this.startTextBox34 = new System.Windows.Forms.TextBox(); + this.startTextBox33 = new System.Windows.Forms.TextBox(); + this.startTextBox32 = new System.Windows.Forms.TextBox(); + this.startTextBox31 = new System.Windows.Forms.TextBox(); + this.startTextBox30 = new System.Windows.Forms.TextBox(); + this.startTextBox29 = new System.Windows.Forms.TextBox(); + this.startTextBox28 = new System.Windows.Forms.TextBox(); + this.startTextBox27 = new System.Windows.Forms.TextBox(); + this.startTextBox26 = new System.Windows.Forms.TextBox(); + this.exclamation48 = new System.Windows.Forms.Label(); + this.endTextBox48 = new System.Windows.Forms.TextBox(); + this.exclamation47 = new System.Windows.Forms.Label(); + this.endTextBox47 = new System.Windows.Forms.TextBox(); + this.exclamation46 = new System.Windows.Forms.Label(); + this.endTextBox46 = new System.Windows.Forms.TextBox(); + this.exclamation45 = new System.Windows.Forms.Label(); + this.endTextBox45 = new System.Windows.Forms.TextBox(); + this.exclamation44 = new System.Windows.Forms.Label(); + this.endTextBox44 = new System.Windows.Forms.TextBox(); + this.exclamation43 = new System.Windows.Forms.Label(); + this.endTextBox43 = new System.Windows.Forms.TextBox(); + this.exclamation42 = new System.Windows.Forms.Label(); + this.exclamation41 = new System.Windows.Forms.Label(); + this.exclamation40 = new System.Windows.Forms.Label(); + this.endTextBox42 = new System.Windows.Forms.TextBox(); + this.exclamation39 = new System.Windows.Forms.Label(); + this.endTextBox41 = new System.Windows.Forms.TextBox(); + this.exclamation38 = new System.Windows.Forms.Label(); + this.endTextBox40 = new System.Windows.Forms.TextBox(); + this.exclamation37 = new System.Windows.Forms.Label(); + this.endTextBox39 = new System.Windows.Forms.TextBox(); + this.endTextBox38 = new System.Windows.Forms.TextBox(); + this.endTextBox37 = new System.Windows.Forms.TextBox(); + this.exclamation36 = new System.Windows.Forms.Label(); + this.endTextBox36 = new System.Windows.Forms.TextBox(); + this.exclamation35 = new System.Windows.Forms.Label(); + this.endTextBox35 = new System.Windows.Forms.TextBox(); + this.exclamation34 = new System.Windows.Forms.Label(); + this.endTextBox34 = new System.Windows.Forms.TextBox(); + this.exclamation33 = new System.Windows.Forms.Label(); + this.endTextBox33 = new System.Windows.Forms.TextBox(); + this.exclamation32 = new System.Windows.Forms.Label(); + this.endTextBox32 = new System.Windows.Forms.TextBox(); + this.exclamation31 = new System.Windows.Forms.Label(); + this.endTextBox31 = new System.Windows.Forms.TextBox(); + this.exclamation30 = new System.Windows.Forms.Label(); + this.exclamation29 = new System.Windows.Forms.Label(); + this.exclamation28 = new System.Windows.Forms.Label(); + this.endTextBox30 = new System.Windows.Forms.TextBox(); + this.exclamation27 = new System.Windows.Forms.Label(); + this.endTextBox29 = new System.Windows.Forms.TextBox(); + this.exclamation26 = new System.Windows.Forms.Label(); + this.endTextBox28 = new System.Windows.Forms.TextBox(); + this.endTextBox27 = new System.Windows.Forms.TextBox(); + this.endTextBox26 = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // exclamation1 + // + this.exclamation1.AutoSize = true; + this.exclamation1.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation1.ForeColor = System.Drawing.Color.Red; + this.exclamation1.Location = new System.Drawing.Point(532, 30); + this.exclamation1.Name = "exclamation1"; + this.exclamation1.Size = new System.Drawing.Size(26, 32); + this.exclamation1.TabIndex = 5; + this.exclamation1.Text = "!"; + this.exclamation1.Visible = false; + // + // startTextBox1 + // + this.startTextBox1.Enabled = false; + this.startTextBox1.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox1.Location = new System.Drawing.Point(185, 34); + this.startTextBox1.Name = "startTextBox1"; + this.startTextBox1.Size = new System.Drawing.Size(163, 27); + this.startTextBox1.TabIndex = 3; + this.startTextBox1.Visible = false; + this.startTextBox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox1_KeyPress); + // + // endTextBox1 + // + this.endTextBox1.Enabled = false; + this.endTextBox1.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox1.Location = new System.Drawing.Point(367, 34); + this.endTextBox1.Name = "endTextBox1"; + this.endTextBox1.Size = new System.Drawing.Size(163, 27); + this.endTextBox1.TabIndex = 4; + this.endTextBox1.Visible = false; + this.endTextBox1.TextChanged += new System.EventHandler(this.endTextBox1_TextChanged); + this.endTextBox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox1_KeyPress); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label1.Location = new System.Drawing.Point(23, 37); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(126, 18); + this.label1.TabIndex = 2; + this.label1.Text = "Water Meter 1"; + this.label1.Visible = false; + // + // okButton + // + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(1138, 34); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(98, 63); + this.okButton.TabIndex = 100; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // exclamation3 + // + this.exclamation3.AutoSize = true; + this.exclamation3.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation3.ForeColor = System.Drawing.Color.Red; + this.exclamation3.Location = new System.Drawing.Point(532, 90); + this.exclamation3.Name = "exclamation3"; + this.exclamation3.Size = new System.Drawing.Size(26, 32); + this.exclamation3.TabIndex = 13; + this.exclamation3.Text = "!"; + this.exclamation3.Visible = false; + // + // startTextBox3 + // + this.startTextBox3.Enabled = false; + this.startTextBox3.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox3.Location = new System.Drawing.Point(185, 94); + this.startTextBox3.Name = "startTextBox3"; + this.startTextBox3.Size = new System.Drawing.Size(163, 27); + this.startTextBox3.TabIndex = 11; + this.startTextBox3.Visible = false; + this.startTextBox3.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox3_KeyPress); + // + // endTextBox3 + // + this.endTextBox3.Enabled = false; + this.endTextBox3.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox3.Location = new System.Drawing.Point(367, 94); + this.endTextBox3.Name = "endTextBox3"; + this.endTextBox3.Size = new System.Drawing.Size(163, 27); + this.endTextBox3.TabIndex = 12; + this.endTextBox3.Visible = false; + this.endTextBox3.TextChanged += new System.EventHandler(this.endTextBox3_TextChanged); + this.endTextBox3.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox3_KeyPress); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label3.Location = new System.Drawing.Point(23, 97); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(126, 18); + this.label3.TabIndex = 10; + this.label3.Text = "Water Meter 3"; + this.label3.Visible = false; + // + // exclamation4 + // + this.exclamation4.AutoSize = true; + this.exclamation4.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation4.ForeColor = System.Drawing.Color.Red; + this.exclamation4.Location = new System.Drawing.Point(532, 120); + this.exclamation4.Name = "exclamation4"; + this.exclamation4.Size = new System.Drawing.Size(26, 32); + this.exclamation4.TabIndex = 17; + this.exclamation4.Text = "!"; + this.exclamation4.Visible = false; + // + // startTextBox4 + // + this.startTextBox4.Enabled = false; + this.startTextBox4.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox4.Location = new System.Drawing.Point(185, 124); + this.startTextBox4.Name = "startTextBox4"; + this.startTextBox4.Size = new System.Drawing.Size(163, 27); + this.startTextBox4.TabIndex = 15; + this.startTextBox4.Visible = false; + this.startTextBox4.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox4_KeyPress); + // + // endTextBox4 + // + this.endTextBox4.Enabled = false; + this.endTextBox4.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox4.Location = new System.Drawing.Point(367, 124); + this.endTextBox4.Name = "endTextBox4"; + this.endTextBox4.Size = new System.Drawing.Size(163, 27); + this.endTextBox4.TabIndex = 16; + this.endTextBox4.Visible = false; + this.endTextBox4.TextChanged += new System.EventHandler(this.endTextBox4_TextChanged); + this.endTextBox4.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox4_KeyPress); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label4.Location = new System.Drawing.Point(23, 127); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(126, 18); + this.label4.TabIndex = 14; + this.label4.Text = "Water Meter 4"; + this.label4.Visible = false; + // + // exclamation5 + // + this.exclamation5.AutoSize = true; + this.exclamation5.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation5.ForeColor = System.Drawing.Color.Red; + this.exclamation5.Location = new System.Drawing.Point(532, 150); + this.exclamation5.Name = "exclamation5"; + this.exclamation5.Size = new System.Drawing.Size(26, 32); + this.exclamation5.TabIndex = 21; + this.exclamation5.Text = "!"; + this.exclamation5.Visible = false; + // + // startTextBox5 + // + this.startTextBox5.Enabled = false; + this.startTextBox5.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox5.Location = new System.Drawing.Point(185, 154); + this.startTextBox5.Name = "startTextBox5"; + this.startTextBox5.Size = new System.Drawing.Size(163, 27); + this.startTextBox5.TabIndex = 19; + this.startTextBox5.Visible = false; + this.startTextBox5.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox5_KeyPress); + // + // endTextBox5 + // + this.endTextBox5.Enabled = false; + this.endTextBox5.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox5.Location = new System.Drawing.Point(367, 154); + this.endTextBox5.Name = "endTextBox5"; + this.endTextBox5.Size = new System.Drawing.Size(163, 27); + this.endTextBox5.TabIndex = 20; + this.endTextBox5.Visible = false; + this.endTextBox5.TextChanged += new System.EventHandler(this.endTextBox5_TextChanged); + this.endTextBox5.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox5_KeyPress); + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label5.Location = new System.Drawing.Point(23, 157); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(126, 18); + this.label5.TabIndex = 18; + this.label5.Text = "Water Meter 5"; + this.label5.Visible = false; + // + // exclamation6 + // + this.exclamation6.AutoSize = true; + this.exclamation6.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation6.ForeColor = System.Drawing.Color.Red; + this.exclamation6.Location = new System.Drawing.Point(532, 180); + this.exclamation6.Name = "exclamation6"; + this.exclamation6.Size = new System.Drawing.Size(26, 32); + this.exclamation6.TabIndex = 25; + this.exclamation6.Text = "!"; + this.exclamation6.Visible = false; + // + // startTextBox6 + // + this.startTextBox6.Enabled = false; + this.startTextBox6.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox6.Location = new System.Drawing.Point(185, 184); + this.startTextBox6.Name = "startTextBox6"; + this.startTextBox6.Size = new System.Drawing.Size(163, 27); + this.startTextBox6.TabIndex = 23; + this.startTextBox6.Visible = false; + this.startTextBox6.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox6_KeyPress); + // + // endTextBox6 + // + this.endTextBox6.Enabled = false; + this.endTextBox6.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox6.Location = new System.Drawing.Point(367, 184); + this.endTextBox6.Name = "endTextBox6"; + this.endTextBox6.Size = new System.Drawing.Size(163, 27); + this.endTextBox6.TabIndex = 24; + this.endTextBox6.Visible = false; + this.endTextBox6.TextChanged += new System.EventHandler(this.endTextBox6_TextChanged); + this.endTextBox6.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox6_KeyPress); + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label6.Location = new System.Drawing.Point(23, 187); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(126, 18); + this.label6.TabIndex = 22; + this.label6.Text = "Water Meter 6"; + this.label6.Visible = false; + // + // startLabel + // + this.startLabel.AutoSize = true; + this.startLabel.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startLabel.Location = new System.Drawing.Point(237, 6); + this.startLabel.Name = "startLabel"; + this.startLabel.Size = new System.Drawing.Size(56, 23); + this.startLabel.TabIndex = 0; + this.startLabel.Text = "Start"; + // + // endLabel + // + this.endLabel.AutoSize = true; + this.endLabel.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endLabel.Location = new System.Drawing.Point(423, 6); + this.endLabel.Name = "endLabel"; + this.endLabel.Size = new System.Drawing.Size(46, 23); + this.endLabel.TabIndex = 1; + this.endLabel.Text = "End"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label2.Location = new System.Drawing.Point(23, 67); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(126, 18); + this.label2.TabIndex = 6; + this.label2.Text = "Water Meter 2"; + this.label2.Visible = false; + // + // endTextBox2 + // + this.endTextBox2.Enabled = false; + this.endTextBox2.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox2.Location = new System.Drawing.Point(367, 64); + this.endTextBox2.Name = "endTextBox2"; + this.endTextBox2.Size = new System.Drawing.Size(163, 27); + this.endTextBox2.TabIndex = 8; + this.endTextBox2.Visible = false; + this.endTextBox2.TextChanged += new System.EventHandler(this.endTextBox2_TextChanged); + this.endTextBox2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox2_KeyPress); + // + // startTextBox2 + // + this.startTextBox2.Enabled = false; + this.startTextBox2.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox2.Location = new System.Drawing.Point(185, 64); + this.startTextBox2.Name = "startTextBox2"; + this.startTextBox2.Size = new System.Drawing.Size(163, 27); + this.startTextBox2.TabIndex = 7; + this.startTextBox2.Visible = false; + this.startTextBox2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox2_KeyPress); + // + // exclamation2 + // + this.exclamation2.AutoSize = true; + this.exclamation2.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation2.ForeColor = System.Drawing.Color.Red; + this.exclamation2.Location = new System.Drawing.Point(532, 60); + this.exclamation2.Name = "exclamation2"; + this.exclamation2.Size = new System.Drawing.Size(26, 32); + this.exclamation2.TabIndex = 9; + this.exclamation2.Text = "!"; + this.exclamation2.Visible = false; + // + // exclamation7 + // + this.exclamation7.AutoSize = true; + this.exclamation7.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation7.ForeColor = System.Drawing.Color.Red; + this.exclamation7.Location = new System.Drawing.Point(532, 210); + this.exclamation7.Name = "exclamation7"; + this.exclamation7.Size = new System.Drawing.Size(26, 32); + this.exclamation7.TabIndex = 29; + this.exclamation7.Text = "!"; + this.exclamation7.Visible = false; + // + // startTextBox7 + // + this.startTextBox7.Enabled = false; + this.startTextBox7.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox7.Location = new System.Drawing.Point(185, 214); + this.startTextBox7.Name = "startTextBox7"; + this.startTextBox7.Size = new System.Drawing.Size(163, 27); + this.startTextBox7.TabIndex = 27; + this.startTextBox7.Visible = false; + this.startTextBox7.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox7_KeyPress); + // + // endTextBox7 + // + this.endTextBox7.Enabled = false; + this.endTextBox7.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox7.Location = new System.Drawing.Point(367, 214); + this.endTextBox7.Name = "endTextBox7"; + this.endTextBox7.Size = new System.Drawing.Size(163, 27); + this.endTextBox7.TabIndex = 28; + this.endTextBox7.Visible = false; + this.endTextBox7.TextChanged += new System.EventHandler(this.endTextBox7_TextChanged); + this.endTextBox7.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox7_KeyPress); + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label7.Location = new System.Drawing.Point(23, 217); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(126, 18); + this.label7.TabIndex = 26; + this.label7.Text = "Water Meter 7"; + this.label7.Visible = false; + // + // exclamation8 + // + this.exclamation8.AutoSize = true; + this.exclamation8.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation8.ForeColor = System.Drawing.Color.Red; + this.exclamation8.Location = new System.Drawing.Point(532, 240); + this.exclamation8.Name = "exclamation8"; + this.exclamation8.Size = new System.Drawing.Size(26, 32); + this.exclamation8.TabIndex = 33; + this.exclamation8.Text = "!"; + this.exclamation8.Visible = false; + // + // startTextBox8 + // + this.startTextBox8.Enabled = false; + this.startTextBox8.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox8.Location = new System.Drawing.Point(185, 244); + this.startTextBox8.Name = "startTextBox8"; + this.startTextBox8.Size = new System.Drawing.Size(163, 27); + this.startTextBox8.TabIndex = 31; + this.startTextBox8.Visible = false; + this.startTextBox8.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox8_KeyPress); + // + // endTextBox8 + // + this.endTextBox8.Enabled = false; + this.endTextBox8.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox8.Location = new System.Drawing.Point(367, 244); + this.endTextBox8.Name = "endTextBox8"; + this.endTextBox8.Size = new System.Drawing.Size(163, 27); + this.endTextBox8.TabIndex = 32; + this.endTextBox8.Visible = false; + this.endTextBox8.TextChanged += new System.EventHandler(this.endTextBox8_TextChanged); + this.endTextBox8.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox8_KeyPress); + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label8.Location = new System.Drawing.Point(23, 247); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(126, 18); + this.label8.TabIndex = 30; + this.label8.Text = "Water Meter 8"; + this.label8.Visible = false; + // + // exclamation9 + // + this.exclamation9.AutoSize = true; + this.exclamation9.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation9.ForeColor = System.Drawing.Color.Red; + this.exclamation9.Location = new System.Drawing.Point(532, 270); + this.exclamation9.Name = "exclamation9"; + this.exclamation9.Size = new System.Drawing.Size(26, 32); + this.exclamation9.TabIndex = 37; + this.exclamation9.Text = "!"; + this.exclamation9.Visible = false; + // + // startTextBox9 + // + this.startTextBox9.Enabled = false; + this.startTextBox9.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox9.Location = new System.Drawing.Point(185, 274); + this.startTextBox9.Name = "startTextBox9"; + this.startTextBox9.Size = new System.Drawing.Size(163, 27); + this.startTextBox9.TabIndex = 35; + this.startTextBox9.Visible = false; + this.startTextBox9.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox9_KeyPress); + // + // endTextBox9 + // + this.endTextBox9.Enabled = false; + this.endTextBox9.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox9.Location = new System.Drawing.Point(367, 274); + this.endTextBox9.Name = "endTextBox9"; + this.endTextBox9.Size = new System.Drawing.Size(163, 27); + this.endTextBox9.TabIndex = 36; + this.endTextBox9.Visible = false; + this.endTextBox9.TextChanged += new System.EventHandler(this.endTextBox9_TextChanged); + this.endTextBox9.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox9_KeyPress); + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label9.Location = new System.Drawing.Point(23, 277); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(126, 18); + this.label9.TabIndex = 34; + this.label9.Text = "Water Meter 9"; + this.label9.Visible = false; + // + // exclamation10 + // + this.exclamation10.AutoSize = true; + this.exclamation10.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation10.ForeColor = System.Drawing.Color.Red; + this.exclamation10.Location = new System.Drawing.Point(532, 300); + this.exclamation10.Name = "exclamation10"; + this.exclamation10.Size = new System.Drawing.Size(26, 32); + this.exclamation10.TabIndex = 41; + this.exclamation10.Text = "!"; + this.exclamation10.Visible = false; + // + // startTextBox10 + // + this.startTextBox10.Enabled = false; + this.startTextBox10.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox10.Location = new System.Drawing.Point(185, 304); + this.startTextBox10.Name = "startTextBox10"; + this.startTextBox10.Size = new System.Drawing.Size(163, 27); + this.startTextBox10.TabIndex = 39; + this.startTextBox10.Visible = false; + this.startTextBox10.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox10_KeyPress); + // + // endTextBox10 + // + this.endTextBox10.Enabled = false; + this.endTextBox10.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox10.Location = new System.Drawing.Point(367, 304); + this.endTextBox10.Name = "endTextBox10"; + this.endTextBox10.Size = new System.Drawing.Size(163, 27); + this.endTextBox10.TabIndex = 40; + this.endTextBox10.Visible = false; + this.endTextBox10.TextChanged += new System.EventHandler(this.endTextBox10_TextChanged); + this.endTextBox10.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox10_KeyPress); + // + // label10 + // + this.label10.AutoSize = true; + this.label10.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label10.Location = new System.Drawing.Point(23, 307); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(136, 18); + this.label10.TabIndex = 38; + this.label10.Text = "Water Meter 10"; + this.label10.Visible = false; + // + // exclamation11 + // + this.exclamation11.AutoSize = true; + this.exclamation11.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation11.ForeColor = System.Drawing.Color.Red; + this.exclamation11.Location = new System.Drawing.Point(532, 330); + this.exclamation11.Name = "exclamation11"; + this.exclamation11.Size = new System.Drawing.Size(26, 32); + this.exclamation11.TabIndex = 45; + this.exclamation11.Text = "!"; + this.exclamation11.Visible = false; + // + // startTextBox11 + // + this.startTextBox11.Enabled = false; + this.startTextBox11.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox11.Location = new System.Drawing.Point(185, 334); + this.startTextBox11.Name = "startTextBox11"; + this.startTextBox11.Size = new System.Drawing.Size(163, 27); + this.startTextBox11.TabIndex = 43; + this.startTextBox11.Visible = false; + this.startTextBox11.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox11_KeyPress); + // + // endTextBox11 + // + this.endTextBox11.Enabled = false; + this.endTextBox11.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox11.Location = new System.Drawing.Point(367, 334); + this.endTextBox11.Name = "endTextBox11"; + this.endTextBox11.Size = new System.Drawing.Size(163, 27); + this.endTextBox11.TabIndex = 44; + this.endTextBox11.Visible = false; + this.endTextBox11.TextChanged += new System.EventHandler(this.endTextBox11_TextChanged); + this.endTextBox11.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox11_KeyPress); + // + // label11 + // + this.label11.AutoSize = true; + this.label11.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label11.Location = new System.Drawing.Point(23, 337); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(136, 18); + this.label11.TabIndex = 42; + this.label11.Text = "Water Meter 11"; + this.label11.Visible = false; + // + // exclamation12 + // + this.exclamation12.AutoSize = true; + this.exclamation12.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation12.ForeColor = System.Drawing.Color.Red; + this.exclamation12.Location = new System.Drawing.Point(532, 360); + this.exclamation12.Name = "exclamation12"; + this.exclamation12.Size = new System.Drawing.Size(26, 32); + this.exclamation12.TabIndex = 49; + this.exclamation12.Text = "!"; + this.exclamation12.Visible = false; + // + // startTextBox12 + // + this.startTextBox12.Enabled = false; + this.startTextBox12.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox12.Location = new System.Drawing.Point(185, 364); + this.startTextBox12.Name = "startTextBox12"; + this.startTextBox12.Size = new System.Drawing.Size(163, 27); + this.startTextBox12.TabIndex = 47; + this.startTextBox12.Visible = false; + this.startTextBox12.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox12_KeyPress); + // + // endTextBox12 + // + this.endTextBox12.Enabled = false; + this.endTextBox12.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox12.Location = new System.Drawing.Point(367, 364); + this.endTextBox12.Name = "endTextBox12"; + this.endTextBox12.Size = new System.Drawing.Size(163, 27); + this.endTextBox12.TabIndex = 48; + this.endTextBox12.Visible = false; + this.endTextBox12.TextChanged += new System.EventHandler(this.endTextBox12_TextChanged); + this.endTextBox12.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox12_KeyPress); + // + // label12 + // + this.label12.AutoSize = true; + this.label12.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label12.Location = new System.Drawing.Point(23, 367); + this.label12.Name = "label12"; + this.label12.Size = new System.Drawing.Size(136, 18); + this.label12.TabIndex = 46; + this.label12.Text = "Water Meter 12"; + this.label12.Visible = false; + // + // exclamation24 + // + this.exclamation24.AutoSize = true; + this.exclamation24.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation24.ForeColor = System.Drawing.Color.Red; + this.exclamation24.Location = new System.Drawing.Point(532, 720); + this.exclamation24.Name = "exclamation24"; + this.exclamation24.Size = new System.Drawing.Size(26, 32); + this.exclamation24.TabIndex = 99; + this.exclamation24.Text = "!"; + this.exclamation24.Visible = false; + // + // startTextBox24 + // + this.startTextBox24.Enabled = false; + this.startTextBox24.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox24.Location = new System.Drawing.Point(185, 724); + this.startTextBox24.Name = "startTextBox24"; + this.startTextBox24.Size = new System.Drawing.Size(163, 27); + this.startTextBox24.TabIndex = 97; + this.startTextBox24.Visible = false; + this.startTextBox24.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox24_KeyPress); + // + // endTextBox24 + // + this.endTextBox24.Enabled = false; + this.endTextBox24.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox24.Location = new System.Drawing.Point(367, 724); + this.endTextBox24.Name = "endTextBox24"; + this.endTextBox24.Size = new System.Drawing.Size(163, 27); + this.endTextBox24.TabIndex = 98; + this.endTextBox24.Visible = false; + this.endTextBox24.TextChanged += new System.EventHandler(this.endTextBox24_TextChanged); + this.endTextBox24.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox24_KeyPress); + // + // label24 + // + this.label24.AutoSize = true; + this.label24.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label24.Location = new System.Drawing.Point(23, 727); + this.label24.Name = "label24"; + this.label24.Size = new System.Drawing.Size(136, 18); + this.label24.TabIndex = 96; + this.label24.Text = "Water Meter 24"; + this.label24.Visible = false; + // + // exclamation23 + // + this.exclamation23.AutoSize = true; + this.exclamation23.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation23.ForeColor = System.Drawing.Color.Red; + this.exclamation23.Location = new System.Drawing.Point(532, 690); + this.exclamation23.Name = "exclamation23"; + this.exclamation23.Size = new System.Drawing.Size(26, 32); + this.exclamation23.TabIndex = 95; + this.exclamation23.Text = "!"; + this.exclamation23.Visible = false; + // + // startTextBox23 + // + this.startTextBox23.Enabled = false; + this.startTextBox23.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox23.Location = new System.Drawing.Point(185, 694); + this.startTextBox23.Name = "startTextBox23"; + this.startTextBox23.Size = new System.Drawing.Size(163, 27); + this.startTextBox23.TabIndex = 93; + this.startTextBox23.Visible = false; + this.startTextBox23.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox23_KeyPress); + // + // endTextBox23 + // + this.endTextBox23.Enabled = false; + this.endTextBox23.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox23.Location = new System.Drawing.Point(367, 694); + this.endTextBox23.Name = "endTextBox23"; + this.endTextBox23.Size = new System.Drawing.Size(163, 27); + this.endTextBox23.TabIndex = 94; + this.endTextBox23.Visible = false; + this.endTextBox23.TextChanged += new System.EventHandler(this.endTextBox23_TextChanged); + this.endTextBox23.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox23_KeyPress); + // + // label23 + // + this.label23.AutoSize = true; + this.label23.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label23.Location = new System.Drawing.Point(23, 697); + this.label23.Name = "label23"; + this.label23.Size = new System.Drawing.Size(136, 18); + this.label23.TabIndex = 92; + this.label23.Text = "Water Meter 23"; + this.label23.Visible = false; + // + // exclamation22 + // + this.exclamation22.AutoSize = true; + this.exclamation22.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation22.ForeColor = System.Drawing.Color.Red; + this.exclamation22.Location = new System.Drawing.Point(532, 660); + this.exclamation22.Name = "exclamation22"; + this.exclamation22.Size = new System.Drawing.Size(26, 32); + this.exclamation22.TabIndex = 91; + this.exclamation22.Text = "!"; + this.exclamation22.Visible = false; + // + // startTextBox22 + // + this.startTextBox22.Enabled = false; + this.startTextBox22.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox22.Location = new System.Drawing.Point(185, 664); + this.startTextBox22.Name = "startTextBox22"; + this.startTextBox22.Size = new System.Drawing.Size(163, 27); + this.startTextBox22.TabIndex = 89; + this.startTextBox22.Visible = false; + this.startTextBox22.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox22_KeyPress); + // + // endTextBox22 + // + this.endTextBox22.Enabled = false; + this.endTextBox22.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox22.Location = new System.Drawing.Point(367, 664); + this.endTextBox22.Name = "endTextBox22"; + this.endTextBox22.Size = new System.Drawing.Size(163, 27); + this.endTextBox22.TabIndex = 90; + this.endTextBox22.Visible = false; + this.endTextBox22.TextChanged += new System.EventHandler(this.endTextBox22_TextChanged); + this.endTextBox22.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox22_KeyPress); + // + // label22 + // + this.label22.AutoSize = true; + this.label22.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label22.Location = new System.Drawing.Point(23, 667); + this.label22.Name = "label22"; + this.label22.Size = new System.Drawing.Size(136, 18); + this.label22.TabIndex = 88; + this.label22.Text = "Water Meter 22"; + this.label22.Visible = false; + // + // exclamation21 + // + this.exclamation21.AutoSize = true; + this.exclamation21.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation21.ForeColor = System.Drawing.Color.Red; + this.exclamation21.Location = new System.Drawing.Point(532, 630); + this.exclamation21.Name = "exclamation21"; + this.exclamation21.Size = new System.Drawing.Size(26, 32); + this.exclamation21.TabIndex = 87; + this.exclamation21.Text = "!"; + this.exclamation21.Visible = false; + // + // startTextBox21 + // + this.startTextBox21.Enabled = false; + this.startTextBox21.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox21.Location = new System.Drawing.Point(185, 634); + this.startTextBox21.Name = "startTextBox21"; + this.startTextBox21.Size = new System.Drawing.Size(163, 27); + this.startTextBox21.TabIndex = 85; + this.startTextBox21.Visible = false; + this.startTextBox21.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox21_KeyPress); + // + // endTextBox21 + // + this.endTextBox21.Enabled = false; + this.endTextBox21.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox21.Location = new System.Drawing.Point(367, 634); + this.endTextBox21.Name = "endTextBox21"; + this.endTextBox21.Size = new System.Drawing.Size(163, 27); + this.endTextBox21.TabIndex = 86; + this.endTextBox21.Visible = false; + this.endTextBox21.TextChanged += new System.EventHandler(this.endTextBox21_TextChanged); + this.endTextBox21.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox21_KeyPress); + // + // label21 + // + this.label21.AutoSize = true; + this.label21.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label21.Location = new System.Drawing.Point(23, 637); + this.label21.Name = "label21"; + this.label21.Size = new System.Drawing.Size(136, 18); + this.label21.TabIndex = 84; + this.label21.Text = "Water Meter 21"; + this.label21.Visible = false; + // + // exclamation20 + // + this.exclamation20.AutoSize = true; + this.exclamation20.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation20.ForeColor = System.Drawing.Color.Red; + this.exclamation20.Location = new System.Drawing.Point(532, 600); + this.exclamation20.Name = "exclamation20"; + this.exclamation20.Size = new System.Drawing.Size(26, 32); + this.exclamation20.TabIndex = 83; + this.exclamation20.Text = "!"; + this.exclamation20.Visible = false; + // + // startTextBox20 + // + this.startTextBox20.Enabled = false; + this.startTextBox20.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox20.Location = new System.Drawing.Point(185, 604); + this.startTextBox20.Name = "startTextBox20"; + this.startTextBox20.Size = new System.Drawing.Size(163, 27); + this.startTextBox20.TabIndex = 81; + this.startTextBox20.Visible = false; + this.startTextBox20.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox20_KeyPress); + // + // endTextBox20 + // + this.endTextBox20.Enabled = false; + this.endTextBox20.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox20.Location = new System.Drawing.Point(367, 604); + this.endTextBox20.Name = "endTextBox20"; + this.endTextBox20.Size = new System.Drawing.Size(163, 27); + this.endTextBox20.TabIndex = 82; + this.endTextBox20.Visible = false; + this.endTextBox20.TextChanged += new System.EventHandler(this.endTextBox20_TextChanged); + this.endTextBox20.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox20_KeyPress); + // + // label20 + // + this.label20.AutoSize = true; + this.label20.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label20.Location = new System.Drawing.Point(23, 607); + this.label20.Name = "label20"; + this.label20.Size = new System.Drawing.Size(136, 18); + this.label20.TabIndex = 80; + this.label20.Text = "Water Meter 20"; + this.label20.Visible = false; + // + // exclamation19 + // + this.exclamation19.AutoSize = true; + this.exclamation19.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation19.ForeColor = System.Drawing.Color.Red; + this.exclamation19.Location = new System.Drawing.Point(532, 570); + this.exclamation19.Name = "exclamation19"; + this.exclamation19.Size = new System.Drawing.Size(26, 32); + this.exclamation19.TabIndex = 79; + this.exclamation19.Text = "!"; + this.exclamation19.Visible = false; + // + // startTextBox19 + // + this.startTextBox19.Enabled = false; + this.startTextBox19.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox19.Location = new System.Drawing.Point(185, 574); + this.startTextBox19.Name = "startTextBox19"; + this.startTextBox19.Size = new System.Drawing.Size(163, 27); + this.startTextBox19.TabIndex = 77; + this.startTextBox19.Visible = false; + this.startTextBox19.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox19_KeyPress); + // + // endTextBox19 + // + this.endTextBox19.Enabled = false; + this.endTextBox19.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox19.Location = new System.Drawing.Point(367, 574); + this.endTextBox19.Name = "endTextBox19"; + this.endTextBox19.Size = new System.Drawing.Size(163, 27); + this.endTextBox19.TabIndex = 78; + this.endTextBox19.Visible = false; + this.endTextBox19.TextChanged += new System.EventHandler(this.endTextBox19_TextChanged); + this.endTextBox19.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox19_KeyPress); + // + // label19 + // + this.label19.AutoSize = true; + this.label19.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label19.Location = new System.Drawing.Point(23, 577); + this.label19.Name = "label19"; + this.label19.Size = new System.Drawing.Size(136, 18); + this.label19.TabIndex = 76; + this.label19.Text = "Water Meter 19"; + this.label19.Visible = false; + // + // exclamation18 + // + this.exclamation18.AutoSize = true; + this.exclamation18.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation18.ForeColor = System.Drawing.Color.Red; + this.exclamation18.Location = new System.Drawing.Point(532, 540); + this.exclamation18.Name = "exclamation18"; + this.exclamation18.Size = new System.Drawing.Size(26, 32); + this.exclamation18.TabIndex = 75; + this.exclamation18.Text = "!"; + this.exclamation18.Visible = false; + // + // exclamation17 + // + this.exclamation17.AutoSize = true; + this.exclamation17.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation17.ForeColor = System.Drawing.Color.Red; + this.exclamation17.Location = new System.Drawing.Point(532, 510); + this.exclamation17.Name = "exclamation17"; + this.exclamation17.Size = new System.Drawing.Size(26, 32); + this.exclamation17.TabIndex = 71; + this.exclamation17.Text = "!"; + this.exclamation17.Visible = false; + // + // startTextBox18 + // + this.startTextBox18.Enabled = false; + this.startTextBox18.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox18.Location = new System.Drawing.Point(185, 544); + this.startTextBox18.Name = "startTextBox18"; + this.startTextBox18.Size = new System.Drawing.Size(163, 27); + this.startTextBox18.TabIndex = 73; + this.startTextBox18.Visible = false; + this.startTextBox18.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox18_KeyPress); + // + // exclamation16 + // + this.exclamation16.AutoSize = true; + this.exclamation16.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation16.ForeColor = System.Drawing.Color.Red; + this.exclamation16.Location = new System.Drawing.Point(532, 480); + this.exclamation16.Name = "exclamation16"; + this.exclamation16.Size = new System.Drawing.Size(26, 32); + this.exclamation16.TabIndex = 67; + this.exclamation16.Text = "!"; + this.exclamation16.Visible = false; + // + // endTextBox18 + // + this.endTextBox18.Enabled = false; + this.endTextBox18.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox18.Location = new System.Drawing.Point(367, 544); + this.endTextBox18.Name = "endTextBox18"; + this.endTextBox18.Size = new System.Drawing.Size(163, 27); + this.endTextBox18.TabIndex = 74; + this.endTextBox18.Visible = false; + this.endTextBox18.TextChanged += new System.EventHandler(this.endTextBox18_TextChanged); + this.endTextBox18.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox18_KeyPress); + // + // label18 + // + this.label18.AutoSize = true; + this.label18.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label18.Location = new System.Drawing.Point(23, 547); + this.label18.Name = "label18"; + this.label18.Size = new System.Drawing.Size(136, 18); + this.label18.TabIndex = 72; + this.label18.Text = "Water Meter 18"; + this.label18.Visible = false; + // + // startTextBox17 + // + this.startTextBox17.Enabled = false; + this.startTextBox17.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox17.Location = new System.Drawing.Point(185, 514); + this.startTextBox17.Name = "startTextBox17"; + this.startTextBox17.Size = new System.Drawing.Size(163, 27); + this.startTextBox17.TabIndex = 69; + this.startTextBox17.Visible = false; + this.startTextBox17.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox17_KeyPress); + // + // exclamation15 + // + this.exclamation15.AutoSize = true; + this.exclamation15.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation15.ForeColor = System.Drawing.Color.Red; + this.exclamation15.Location = new System.Drawing.Point(532, 450); + this.exclamation15.Name = "exclamation15"; + this.exclamation15.Size = new System.Drawing.Size(26, 32); + this.exclamation15.TabIndex = 63; + this.exclamation15.Text = "!"; + this.exclamation15.Visible = false; + // + // endTextBox17 + // + this.endTextBox17.Enabled = false; + this.endTextBox17.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox17.Location = new System.Drawing.Point(367, 514); + this.endTextBox17.Name = "endTextBox17"; + this.endTextBox17.Size = new System.Drawing.Size(163, 27); + this.endTextBox17.TabIndex = 70; + this.endTextBox17.Visible = false; + this.endTextBox17.TextChanged += new System.EventHandler(this.endTextBox17_TextChanged); + this.endTextBox17.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox17_KeyPress); + // + // label17 + // + this.label17.AutoSize = true; + this.label17.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label17.Location = new System.Drawing.Point(23, 517); + this.label17.Name = "label17"; + this.label17.Size = new System.Drawing.Size(136, 18); + this.label17.TabIndex = 68; + this.label17.Text = "Water Meter 17"; + this.label17.Visible = false; + // + // startTextBox16 + // + this.startTextBox16.Enabled = false; + this.startTextBox16.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox16.Location = new System.Drawing.Point(185, 484); + this.startTextBox16.Name = "startTextBox16"; + this.startTextBox16.Size = new System.Drawing.Size(163, 27); + this.startTextBox16.TabIndex = 65; + this.startTextBox16.Visible = false; + this.startTextBox16.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox16_KeyPress); + // + // exclamation14 + // + this.exclamation14.AutoSize = true; + this.exclamation14.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation14.ForeColor = System.Drawing.Color.Red; + this.exclamation14.Location = new System.Drawing.Point(532, 420); + this.exclamation14.Name = "exclamation14"; + this.exclamation14.Size = new System.Drawing.Size(26, 32); + this.exclamation14.TabIndex = 59; + this.exclamation14.Text = "!"; + this.exclamation14.Visible = false; + // + // endTextBox16 + // + this.endTextBox16.Enabled = false; + this.endTextBox16.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox16.Location = new System.Drawing.Point(367, 484); + this.endTextBox16.Name = "endTextBox16"; + this.endTextBox16.Size = new System.Drawing.Size(163, 27); + this.endTextBox16.TabIndex = 66; + this.endTextBox16.Visible = false; + this.endTextBox16.TextChanged += new System.EventHandler(this.endTextBox16_TextChanged); + this.endTextBox16.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox16_KeyPress); + // + // label16 + // + this.label16.AutoSize = true; + this.label16.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label16.Location = new System.Drawing.Point(23, 487); + this.label16.Name = "label16"; + this.label16.Size = new System.Drawing.Size(136, 18); + this.label16.TabIndex = 64; + this.label16.Text = "Water Meter 16"; + this.label16.Visible = false; + // + // startTextBox15 + // + this.startTextBox15.Enabled = false; + this.startTextBox15.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox15.Location = new System.Drawing.Point(185, 454); + this.startTextBox15.Name = "startTextBox15"; + this.startTextBox15.Size = new System.Drawing.Size(163, 27); + this.startTextBox15.TabIndex = 61; + this.startTextBox15.Visible = false; + this.startTextBox15.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox15_KeyPress); + // + // exclamation13 + // + this.exclamation13.AutoSize = true; + this.exclamation13.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation13.ForeColor = System.Drawing.Color.Red; + this.exclamation13.Location = new System.Drawing.Point(532, 390); + this.exclamation13.Name = "exclamation13"; + this.exclamation13.Size = new System.Drawing.Size(26, 32); + this.exclamation13.TabIndex = 55; + this.exclamation13.Text = "!"; + this.exclamation13.Visible = false; + // + // endTextBox15 + // + this.endTextBox15.Enabled = false; + this.endTextBox15.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox15.Location = new System.Drawing.Point(367, 454); + this.endTextBox15.Name = "endTextBox15"; + this.endTextBox15.Size = new System.Drawing.Size(163, 27); + this.endTextBox15.TabIndex = 62; + this.endTextBox15.Visible = false; + this.endTextBox15.TextChanged += new System.EventHandler(this.endTextBox15_TextChanged); + this.endTextBox15.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox15_KeyPress); + // + // label15 + // + this.label15.AutoSize = true; + this.label15.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label15.Location = new System.Drawing.Point(23, 457); + this.label15.Name = "label15"; + this.label15.Size = new System.Drawing.Size(136, 18); + this.label15.TabIndex = 60; + this.label15.Text = "Water Meter 15"; + this.label15.Visible = false; + // + // startTextBox14 + // + this.startTextBox14.Enabled = false; + this.startTextBox14.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox14.Location = new System.Drawing.Point(185, 424); + this.startTextBox14.Name = "startTextBox14"; + this.startTextBox14.Size = new System.Drawing.Size(163, 27); + this.startTextBox14.TabIndex = 57; + this.startTextBox14.Visible = false; + this.startTextBox14.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox14_KeyPress); + // + // end2Label + // + this.end2Label.AutoSize = true; + this.end2Label.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.end2Label.Location = new System.Drawing.Point(992, 6); + this.end2Label.Name = "end2Label"; + this.end2Label.Size = new System.Drawing.Size(46, 23); + this.end2Label.TabIndex = 51; + this.end2Label.Text = "End"; + // + // endTextBox14 + // + this.endTextBox14.Enabled = false; + this.endTextBox14.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox14.Location = new System.Drawing.Point(367, 424); + this.endTextBox14.Name = "endTextBox14"; + this.endTextBox14.Size = new System.Drawing.Size(163, 27); + this.endTextBox14.TabIndex = 58; + this.endTextBox14.Visible = false; + this.endTextBox14.TextChanged += new System.EventHandler(this.endTextBox14_TextChanged); + this.endTextBox14.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox14_KeyPress); + // + // label14 + // + this.label14.AutoSize = true; + this.label14.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label14.Location = new System.Drawing.Point(23, 427); + this.label14.Name = "label14"; + this.label14.Size = new System.Drawing.Size(136, 18); + this.label14.TabIndex = 56; + this.label14.Text = "Water Meter 14"; + this.label14.Visible = false; + // + // startTextBox13 + // + this.startTextBox13.Enabled = false; + this.startTextBox13.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox13.Location = new System.Drawing.Point(185, 394); + this.startTextBox13.Name = "startTextBox13"; + this.startTextBox13.Size = new System.Drawing.Size(163, 27); + this.startTextBox13.TabIndex = 53; + this.startTextBox13.Visible = false; + this.startTextBox13.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox13_KeyPress); + // + // start2Label + // + this.start2Label.AutoSize = true; + this.start2Label.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.start2Label.Location = new System.Drawing.Point(802, 6); + this.start2Label.Name = "start2Label"; + this.start2Label.Size = new System.Drawing.Size(56, 23); + this.start2Label.TabIndex = 50; + this.start2Label.Text = "Start"; + // + // endTextBox13 + // + this.endTextBox13.Enabled = false; + this.endTextBox13.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox13.Location = new System.Drawing.Point(367, 394); + this.endTextBox13.Name = "endTextBox13"; + this.endTextBox13.Size = new System.Drawing.Size(163, 27); + this.endTextBox13.TabIndex = 54; + this.endTextBox13.Visible = false; + this.endTextBox13.TextChanged += new System.EventHandler(this.endTextBox13_TextChanged); + this.endTextBox13.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox13_KeyPress); + // + // label13 + // + this.label13.AutoSize = true; + this.label13.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label13.Location = new System.Drawing.Point(23, 397); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(136, 18); + this.label13.TabIndex = 52; + this.label13.Text = "Water Meter 13"; + this.label13.Visible = false; + // + // exclamation25 + // + this.exclamation25.AutoSize = true; + this.exclamation25.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation25.ForeColor = System.Drawing.Color.Red; + this.exclamation25.Location = new System.Drawing.Point(1095, 30); + this.exclamation25.Name = "exclamation25"; + this.exclamation25.Size = new System.Drawing.Size(26, 32); + this.exclamation25.TabIndex = 104; + this.exclamation25.Text = "!"; + this.exclamation25.Visible = false; + // + // startTextBox25 + // + this.startTextBox25.Enabled = false; + this.startTextBox25.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox25.Location = new System.Drawing.Point(748, 34); + this.startTextBox25.Name = "startTextBox25"; + this.startTextBox25.Size = new System.Drawing.Size(163, 27); + this.startTextBox25.TabIndex = 102; + this.startTextBox25.Visible = false; + this.startTextBox25.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox25_KeyPress); + // + // endTextBox25 + // + this.endTextBox25.Enabled = false; + this.endTextBox25.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox25.Location = new System.Drawing.Point(930, 34); + this.endTextBox25.Name = "endTextBox25"; + this.endTextBox25.Size = new System.Drawing.Size(163, 27); + this.endTextBox25.TabIndex = 103; + this.endTextBox25.Visible = false; + this.endTextBox25.TextChanged += new System.EventHandler(this.endTextBox25_TextChanged); + this.endTextBox25.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox25_KeyPress); + // + // label25 + // + this.label25.AutoSize = true; + this.label25.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label25.Location = new System.Drawing.Point(586, 37); + this.label25.Name = "label25"; + this.label25.Size = new System.Drawing.Size(136, 18); + this.label25.TabIndex = 101; + this.label25.Text = "Water Meter 25"; + this.label25.Visible = false; + // + // label26 + // + this.label26.AutoSize = true; + this.label26.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label26.Location = new System.Drawing.Point(586, 67); + this.label26.Name = "label26"; + this.label26.Size = new System.Drawing.Size(136, 18); + this.label26.TabIndex = 105; + this.label26.Text = "Water Meter 26"; + this.label26.Visible = false; + // + // label27 + // + this.label27.AutoSize = true; + this.label27.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label27.Location = new System.Drawing.Point(586, 97); + this.label27.Name = "label27"; + this.label27.Size = new System.Drawing.Size(136, 18); + this.label27.TabIndex = 106; + this.label27.Text = "Water Meter 27"; + this.label27.Visible = false; + // + // label28 + // + this.label28.AutoSize = true; + this.label28.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label28.Location = new System.Drawing.Point(586, 127); + this.label28.Name = "label28"; + this.label28.Size = new System.Drawing.Size(136, 18); + this.label28.TabIndex = 107; + this.label28.Text = "Water Meter 28"; + this.label28.Visible = false; + // + // label29 + // + this.label29.AutoSize = true; + this.label29.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label29.Location = new System.Drawing.Point(586, 157); + this.label29.Name = "label29"; + this.label29.Size = new System.Drawing.Size(136, 18); + this.label29.TabIndex = 108; + this.label29.Text = "Water Meter 29"; + this.label29.Visible = false; + // + // label30 + // + this.label30.AutoSize = true; + this.label30.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label30.Location = new System.Drawing.Point(586, 187); + this.label30.Name = "label30"; + this.label30.Size = new System.Drawing.Size(136, 18); + this.label30.TabIndex = 109; + this.label30.Text = "Water Meter 30"; + this.label30.Visible = false; + // + // label31 + // + this.label31.AutoSize = true; + this.label31.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label31.Location = new System.Drawing.Point(586, 217); + this.label31.Name = "label31"; + this.label31.Size = new System.Drawing.Size(136, 18); + this.label31.TabIndex = 110; + this.label31.Text = "Water Meter 31"; + this.label31.Visible = false; + // + // label32 + // + this.label32.AutoSize = true; + this.label32.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label32.Location = new System.Drawing.Point(586, 247); + this.label32.Name = "label32"; + this.label32.Size = new System.Drawing.Size(136, 18); + this.label32.TabIndex = 111; + this.label32.Text = "Water Meter 32"; + this.label32.Visible = false; + // + // label33 + // + this.label33.AutoSize = true; + this.label33.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label33.Location = new System.Drawing.Point(586, 277); + this.label33.Name = "label33"; + this.label33.Size = new System.Drawing.Size(136, 18); + this.label33.TabIndex = 112; + this.label33.Text = "Water Meter 33"; + this.label33.Visible = false; + // + // label34 + // + this.label34.AutoSize = true; + this.label34.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label34.Location = new System.Drawing.Point(586, 307); + this.label34.Name = "label34"; + this.label34.Size = new System.Drawing.Size(136, 18); + this.label34.TabIndex = 113; + this.label34.Text = "Water Meter 34"; + this.label34.Visible = false; + // + // label35 + // + this.label35.AutoSize = true; + this.label35.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label35.Location = new System.Drawing.Point(586, 337); + this.label35.Name = "label35"; + this.label35.Size = new System.Drawing.Size(136, 18); + this.label35.TabIndex = 114; + this.label35.Text = "Water Meter 35"; + this.label35.Visible = false; + // + // label36 + // + this.label36.AutoSize = true; + this.label36.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label36.Location = new System.Drawing.Point(586, 367); + this.label36.Name = "label36"; + this.label36.Size = new System.Drawing.Size(136, 18); + this.label36.TabIndex = 115; + this.label36.Text = "Water Meter 36"; + this.label36.Visible = false; + // + // label37 + // + this.label37.AutoSize = true; + this.label37.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label37.Location = new System.Drawing.Point(586, 397); + this.label37.Name = "label37"; + this.label37.Size = new System.Drawing.Size(136, 18); + this.label37.TabIndex = 116; + this.label37.Text = "Water Meter 37"; + this.label37.Visible = false; + // + // label38 + // + this.label38.AutoSize = true; + this.label38.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label38.Location = new System.Drawing.Point(586, 427); + this.label38.Name = "label38"; + this.label38.Size = new System.Drawing.Size(136, 18); + this.label38.TabIndex = 117; + this.label38.Text = "Water Meter 38"; + this.label38.Visible = false; + // + // label39 + // + this.label39.AutoSize = true; + this.label39.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label39.Location = new System.Drawing.Point(586, 457); + this.label39.Name = "label39"; + this.label39.Size = new System.Drawing.Size(136, 18); + this.label39.TabIndex = 118; + this.label39.Text = "Water Meter 39"; + this.label39.Visible = false; + // + // label40 + // + this.label40.AutoSize = true; + this.label40.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label40.Location = new System.Drawing.Point(586, 487); + this.label40.Name = "label40"; + this.label40.Size = new System.Drawing.Size(136, 18); + this.label40.TabIndex = 119; + this.label40.Text = "Water Meter 40"; + this.label40.Visible = false; + // + // label41 + // + this.label41.AutoSize = true; + this.label41.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label41.Location = new System.Drawing.Point(586, 517); + this.label41.Name = "label41"; + this.label41.Size = new System.Drawing.Size(136, 18); + this.label41.TabIndex = 120; + this.label41.Text = "Water Meter 41"; + this.label41.Visible = false; + // + // label42 + // + this.label42.AutoSize = true; + this.label42.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label42.Location = new System.Drawing.Point(586, 547); + this.label42.Name = "label42"; + this.label42.Size = new System.Drawing.Size(136, 18); + this.label42.TabIndex = 121; + this.label42.Text = "Water Meter 42"; + this.label42.Visible = false; + // + // label43 + // + this.label43.AutoSize = true; + this.label43.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label43.Location = new System.Drawing.Point(586, 577); + this.label43.Name = "label43"; + this.label43.Size = new System.Drawing.Size(136, 18); + this.label43.TabIndex = 122; + this.label43.Text = "Water Meter 43"; + this.label43.Visible = false; + // + // label44 + // + this.label44.AutoSize = true; + this.label44.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label44.Location = new System.Drawing.Point(586, 607); + this.label44.Name = "label44"; + this.label44.Size = new System.Drawing.Size(136, 18); + this.label44.TabIndex = 123; + this.label44.Text = "Water Meter 44"; + this.label44.Visible = false; + // + // label45 + // + this.label45.AutoSize = true; + this.label45.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label45.Location = new System.Drawing.Point(586, 637); + this.label45.Name = "label45"; + this.label45.Size = new System.Drawing.Size(136, 18); + this.label45.TabIndex = 124; + this.label45.Text = "Water Meter 45"; + this.label45.Visible = false; + // + // label46 + // + this.label46.AutoSize = true; + this.label46.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label46.Location = new System.Drawing.Point(586, 667); + this.label46.Name = "label46"; + this.label46.Size = new System.Drawing.Size(136, 18); + this.label46.TabIndex = 125; + this.label46.Text = "Water Meter 46"; + this.label46.Visible = false; + // + // label47 + // + this.label47.AutoSize = true; + this.label47.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label47.Location = new System.Drawing.Point(586, 697); + this.label47.Name = "label47"; + this.label47.Size = new System.Drawing.Size(136, 18); + this.label47.TabIndex = 126; + this.label47.Text = "Water Meter 47"; + this.label47.Visible = false; + // + // label48 + // + this.label48.AutoSize = true; + this.label48.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label48.Location = new System.Drawing.Point(586, 727); + this.label48.Name = "label48"; + this.label48.Size = new System.Drawing.Size(136, 18); + this.label48.TabIndex = 127; + this.label48.Text = "Water Meter 48"; + this.label48.Visible = false; + // + // startTextBox48 + // + this.startTextBox48.Enabled = false; + this.startTextBox48.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox48.Location = new System.Drawing.Point(748, 724); + this.startTextBox48.Name = "startTextBox48"; + this.startTextBox48.Size = new System.Drawing.Size(163, 27); + this.startTextBox48.TabIndex = 150; + this.startTextBox48.Visible = false; + this.startTextBox48.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox48_KeyPress); + // + // startTextBox47 + // + this.startTextBox47.Enabled = false; + this.startTextBox47.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox47.Location = new System.Drawing.Point(748, 694); + this.startTextBox47.Name = "startTextBox47"; + this.startTextBox47.Size = new System.Drawing.Size(163, 27); + this.startTextBox47.TabIndex = 149; + this.startTextBox47.Visible = false; + this.startTextBox47.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox47_KeyPress); + // + // startTextBox46 + // + this.startTextBox46.Enabled = false; + this.startTextBox46.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox46.Location = new System.Drawing.Point(748, 664); + this.startTextBox46.Name = "startTextBox46"; + this.startTextBox46.Size = new System.Drawing.Size(163, 27); + this.startTextBox46.TabIndex = 148; + this.startTextBox46.Visible = false; + this.startTextBox46.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox46_KeyPress); + // + // startTextBox45 + // + this.startTextBox45.Enabled = false; + this.startTextBox45.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox45.Location = new System.Drawing.Point(748, 634); + this.startTextBox45.Name = "startTextBox45"; + this.startTextBox45.Size = new System.Drawing.Size(163, 27); + this.startTextBox45.TabIndex = 147; + this.startTextBox45.Visible = false; + this.startTextBox45.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox45_KeyPress); + // + // startTextBox44 + // + this.startTextBox44.Enabled = false; + this.startTextBox44.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox44.Location = new System.Drawing.Point(748, 604); + this.startTextBox44.Name = "startTextBox44"; + this.startTextBox44.Size = new System.Drawing.Size(163, 27); + this.startTextBox44.TabIndex = 146; + this.startTextBox44.Visible = false; + this.startTextBox44.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox44_KeyPress); + // + // startTextBox43 + // + this.startTextBox43.Enabled = false; + this.startTextBox43.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox43.Location = new System.Drawing.Point(748, 574); + this.startTextBox43.Name = "startTextBox43"; + this.startTextBox43.Size = new System.Drawing.Size(163, 27); + this.startTextBox43.TabIndex = 145; + this.startTextBox43.Visible = false; + this.startTextBox43.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox43_KeyPress); + // + // startTextBox42 + // + this.startTextBox42.Enabled = false; + this.startTextBox42.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox42.Location = new System.Drawing.Point(748, 544); + this.startTextBox42.Name = "startTextBox42"; + this.startTextBox42.Size = new System.Drawing.Size(163, 27); + this.startTextBox42.TabIndex = 144; + this.startTextBox42.Visible = false; + this.startTextBox42.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox42_KeyPress); + // + // startTextBox41 + // + this.startTextBox41.Enabled = false; + this.startTextBox41.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox41.Location = new System.Drawing.Point(748, 514); + this.startTextBox41.Name = "startTextBox41"; + this.startTextBox41.Size = new System.Drawing.Size(163, 27); + this.startTextBox41.TabIndex = 143; + this.startTextBox41.Visible = false; + this.startTextBox41.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox41_KeyPress); + // + // startTextBox40 + // + this.startTextBox40.Enabled = false; + this.startTextBox40.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox40.Location = new System.Drawing.Point(748, 484); + this.startTextBox40.Name = "startTextBox40"; + this.startTextBox40.Size = new System.Drawing.Size(163, 27); + this.startTextBox40.TabIndex = 142; + this.startTextBox40.Visible = false; + this.startTextBox40.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox40_KeyPress); + // + // startTextBox39 + // + this.startTextBox39.Enabled = false; + this.startTextBox39.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox39.Location = new System.Drawing.Point(748, 454); + this.startTextBox39.Name = "startTextBox39"; + this.startTextBox39.Size = new System.Drawing.Size(163, 27); + this.startTextBox39.TabIndex = 141; + this.startTextBox39.Visible = false; + this.startTextBox39.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox39_KeyPress); + // + // startTextBox38 + // + this.startTextBox38.Enabled = false; + this.startTextBox38.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox38.Location = new System.Drawing.Point(748, 424); + this.startTextBox38.Name = "startTextBox38"; + this.startTextBox38.Size = new System.Drawing.Size(163, 27); + this.startTextBox38.TabIndex = 140; + this.startTextBox38.Visible = false; + this.startTextBox38.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox38_KeyPress); + // + // startTextBox37 + // + this.startTextBox37.Enabled = false; + this.startTextBox37.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox37.Location = new System.Drawing.Point(748, 394); + this.startTextBox37.Name = "startTextBox37"; + this.startTextBox37.Size = new System.Drawing.Size(163, 27); + this.startTextBox37.TabIndex = 139; + this.startTextBox37.Visible = false; + this.startTextBox37.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox37_KeyPress); + // + // startTextBox36 + // + this.startTextBox36.Enabled = false; + this.startTextBox36.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox36.Location = new System.Drawing.Point(748, 364); + this.startTextBox36.Name = "startTextBox36"; + this.startTextBox36.Size = new System.Drawing.Size(163, 27); + this.startTextBox36.TabIndex = 138; + this.startTextBox36.Visible = false; + this.startTextBox36.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox36_KeyPress); + // + // startTextBox35 + // + this.startTextBox35.Enabled = false; + this.startTextBox35.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox35.Location = new System.Drawing.Point(748, 334); + this.startTextBox35.Name = "startTextBox35"; + this.startTextBox35.Size = new System.Drawing.Size(163, 27); + this.startTextBox35.TabIndex = 137; + this.startTextBox35.Visible = false; + this.startTextBox35.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox35_KeyPress); + // + // startTextBox34 + // + this.startTextBox34.Enabled = false; + this.startTextBox34.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox34.Location = new System.Drawing.Point(748, 304); + this.startTextBox34.Name = "startTextBox34"; + this.startTextBox34.Size = new System.Drawing.Size(163, 27); + this.startTextBox34.TabIndex = 136; + this.startTextBox34.Visible = false; + this.startTextBox34.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox34_KeyPress); + // + // startTextBox33 + // + this.startTextBox33.Enabled = false; + this.startTextBox33.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox33.Location = new System.Drawing.Point(748, 274); + this.startTextBox33.Name = "startTextBox33"; + this.startTextBox33.Size = new System.Drawing.Size(163, 27); + this.startTextBox33.TabIndex = 135; + this.startTextBox33.Visible = false; + this.startTextBox33.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox33_KeyPress); + // + // startTextBox32 + // + this.startTextBox32.Enabled = false; + this.startTextBox32.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox32.Location = new System.Drawing.Point(748, 244); + this.startTextBox32.Name = "startTextBox32"; + this.startTextBox32.Size = new System.Drawing.Size(163, 27); + this.startTextBox32.TabIndex = 134; + this.startTextBox32.Visible = false; + this.startTextBox32.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox32_KeyPress); + // + // startTextBox31 + // + this.startTextBox31.Enabled = false; + this.startTextBox31.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox31.Location = new System.Drawing.Point(748, 214); + this.startTextBox31.Name = "startTextBox31"; + this.startTextBox31.Size = new System.Drawing.Size(163, 27); + this.startTextBox31.TabIndex = 133; + this.startTextBox31.Visible = false; + this.startTextBox31.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox31_KeyPress); + // + // startTextBox30 + // + this.startTextBox30.Enabled = false; + this.startTextBox30.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox30.Location = new System.Drawing.Point(748, 184); + this.startTextBox30.Name = "startTextBox30"; + this.startTextBox30.Size = new System.Drawing.Size(163, 27); + this.startTextBox30.TabIndex = 132; + this.startTextBox30.Visible = false; + this.startTextBox30.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox30_KeyPress); + // + // startTextBox29 + // + this.startTextBox29.Enabled = false; + this.startTextBox29.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox29.Location = new System.Drawing.Point(748, 154); + this.startTextBox29.Name = "startTextBox29"; + this.startTextBox29.Size = new System.Drawing.Size(163, 27); + this.startTextBox29.TabIndex = 131; + this.startTextBox29.Visible = false; + this.startTextBox29.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox29_KeyPress); + // + // startTextBox28 + // + this.startTextBox28.Enabled = false; + this.startTextBox28.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox28.Location = new System.Drawing.Point(748, 124); + this.startTextBox28.Name = "startTextBox28"; + this.startTextBox28.Size = new System.Drawing.Size(163, 27); + this.startTextBox28.TabIndex = 130; + this.startTextBox28.Visible = false; + this.startTextBox28.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox28_KeyPress); + // + // startTextBox27 + // + this.startTextBox27.Enabled = false; + this.startTextBox27.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox27.Location = new System.Drawing.Point(748, 94); + this.startTextBox27.Name = "startTextBox27"; + this.startTextBox27.Size = new System.Drawing.Size(163, 27); + this.startTextBox27.TabIndex = 129; + this.startTextBox27.Visible = false; + this.startTextBox27.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox27_KeyPress); + // + // startTextBox26 + // + this.startTextBox26.Enabled = false; + this.startTextBox26.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.startTextBox26.Location = new System.Drawing.Point(748, 64); + this.startTextBox26.Name = "startTextBox26"; + this.startTextBox26.Size = new System.Drawing.Size(163, 27); + this.startTextBox26.TabIndex = 128; + this.startTextBox26.Visible = false; + this.startTextBox26.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBox26_KeyPress); + // + // exclamation48 + // + this.exclamation48.AutoSize = true; + this.exclamation48.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation48.ForeColor = System.Drawing.Color.Red; + this.exclamation48.Location = new System.Drawing.Point(1095, 720); + this.exclamation48.Name = "exclamation48"; + this.exclamation48.Size = new System.Drawing.Size(26, 32); + this.exclamation48.TabIndex = 196; + this.exclamation48.Text = "!"; + this.exclamation48.Visible = false; + // + // endTextBox48 + // + this.endTextBox48.Enabled = false; + this.endTextBox48.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox48.Location = new System.Drawing.Point(930, 724); + this.endTextBox48.Name = "endTextBox48"; + this.endTextBox48.Size = new System.Drawing.Size(163, 27); + this.endTextBox48.TabIndex = 195; + this.endTextBox48.Visible = false; + this.endTextBox48.TextChanged += new System.EventHandler(this.endTextBox48_TextChanged); + this.endTextBox48.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox48_KeyPress); + // + // exclamation47 + // + this.exclamation47.AutoSize = true; + this.exclamation47.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation47.ForeColor = System.Drawing.Color.Red; + this.exclamation47.Location = new System.Drawing.Point(1095, 690); + this.exclamation47.Name = "exclamation47"; + this.exclamation47.Size = new System.Drawing.Size(26, 32); + this.exclamation47.TabIndex = 194; + this.exclamation47.Text = "!"; + this.exclamation47.Visible = false; + // + // endTextBox47 + // + this.endTextBox47.Enabled = false; + this.endTextBox47.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox47.Location = new System.Drawing.Point(930, 694); + this.endTextBox47.Name = "endTextBox47"; + this.endTextBox47.Size = new System.Drawing.Size(163, 27); + this.endTextBox47.TabIndex = 193; + this.endTextBox47.Visible = false; + this.endTextBox47.TextChanged += new System.EventHandler(this.endTextBox47_TextChanged); + this.endTextBox47.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox47_KeyPress); + // + // exclamation46 + // + this.exclamation46.AutoSize = true; + this.exclamation46.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation46.ForeColor = System.Drawing.Color.Red; + this.exclamation46.Location = new System.Drawing.Point(1095, 660); + this.exclamation46.Name = "exclamation46"; + this.exclamation46.Size = new System.Drawing.Size(26, 32); + this.exclamation46.TabIndex = 192; + this.exclamation46.Text = "!"; + this.exclamation46.Visible = false; + // + // endTextBox46 + // + this.endTextBox46.Enabled = false; + this.endTextBox46.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox46.Location = new System.Drawing.Point(930, 664); + this.endTextBox46.Name = "endTextBox46"; + this.endTextBox46.Size = new System.Drawing.Size(163, 27); + this.endTextBox46.TabIndex = 191; + this.endTextBox46.Visible = false; + this.endTextBox46.TextChanged += new System.EventHandler(this.endTextBox46_TextChanged); + this.endTextBox46.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox46_KeyPress); + // + // exclamation45 + // + this.exclamation45.AutoSize = true; + this.exclamation45.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation45.ForeColor = System.Drawing.Color.Red; + this.exclamation45.Location = new System.Drawing.Point(1095, 630); + this.exclamation45.Name = "exclamation45"; + this.exclamation45.Size = new System.Drawing.Size(26, 32); + this.exclamation45.TabIndex = 190; + this.exclamation45.Text = "!"; + this.exclamation45.Visible = false; + // + // endTextBox45 + // + this.endTextBox45.Enabled = false; + this.endTextBox45.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox45.Location = new System.Drawing.Point(930, 634); + this.endTextBox45.Name = "endTextBox45"; + this.endTextBox45.Size = new System.Drawing.Size(163, 27); + this.endTextBox45.TabIndex = 189; + this.endTextBox45.Visible = false; + this.endTextBox45.TextChanged += new System.EventHandler(this.endTextBox45_TextChanged); + this.endTextBox45.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox45_KeyPress); + // + // exclamation44 + // + this.exclamation44.AutoSize = true; + this.exclamation44.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation44.ForeColor = System.Drawing.Color.Red; + this.exclamation44.Location = new System.Drawing.Point(1095, 600); + this.exclamation44.Name = "exclamation44"; + this.exclamation44.Size = new System.Drawing.Size(26, 32); + this.exclamation44.TabIndex = 188; + this.exclamation44.Text = "!"; + this.exclamation44.Visible = false; + // + // endTextBox44 + // + this.endTextBox44.Enabled = false; + this.endTextBox44.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox44.Location = new System.Drawing.Point(930, 604); + this.endTextBox44.Name = "endTextBox44"; + this.endTextBox44.Size = new System.Drawing.Size(163, 27); + this.endTextBox44.TabIndex = 187; + this.endTextBox44.Visible = false; + this.endTextBox44.TextChanged += new System.EventHandler(this.endTextBox44_TextChanged); + this.endTextBox44.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox44_KeyPress); + // + // exclamation43 + // + this.exclamation43.AutoSize = true; + this.exclamation43.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation43.ForeColor = System.Drawing.Color.Red; + this.exclamation43.Location = new System.Drawing.Point(1095, 570); + this.exclamation43.Name = "exclamation43"; + this.exclamation43.Size = new System.Drawing.Size(26, 32); + this.exclamation43.TabIndex = 186; + this.exclamation43.Text = "!"; + this.exclamation43.Visible = false; + // + // endTextBox43 + // + this.endTextBox43.Enabled = false; + this.endTextBox43.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox43.Location = new System.Drawing.Point(930, 574); + this.endTextBox43.Name = "endTextBox43"; + this.endTextBox43.Size = new System.Drawing.Size(163, 27); + this.endTextBox43.TabIndex = 185; + this.endTextBox43.Visible = false; + this.endTextBox43.TextChanged += new System.EventHandler(this.endTextBox43_TextChanged); + this.endTextBox43.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox43_KeyPress); + // + // exclamation42 + // + this.exclamation42.AutoSize = true; + this.exclamation42.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation42.ForeColor = System.Drawing.Color.Red; + this.exclamation42.Location = new System.Drawing.Point(1095, 540); + this.exclamation42.Name = "exclamation42"; + this.exclamation42.Size = new System.Drawing.Size(26, 32); + this.exclamation42.TabIndex = 184; + this.exclamation42.Text = "!"; + this.exclamation42.Visible = false; + // + // exclamation41 + // + this.exclamation41.AutoSize = true; + this.exclamation41.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation41.ForeColor = System.Drawing.Color.Red; + this.exclamation41.Location = new System.Drawing.Point(1095, 510); + this.exclamation41.Name = "exclamation41"; + this.exclamation41.Size = new System.Drawing.Size(26, 32); + this.exclamation41.TabIndex = 182; + this.exclamation41.Text = "!"; + this.exclamation41.Visible = false; + // + // exclamation40 + // + this.exclamation40.AutoSize = true; + this.exclamation40.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation40.ForeColor = System.Drawing.Color.Red; + this.exclamation40.Location = new System.Drawing.Point(1095, 480); + this.exclamation40.Name = "exclamation40"; + this.exclamation40.Size = new System.Drawing.Size(26, 32); + this.exclamation40.TabIndex = 180; + this.exclamation40.Text = "!"; + this.exclamation40.Visible = false; + // + // endTextBox42 + // + this.endTextBox42.Enabled = false; + this.endTextBox42.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox42.Location = new System.Drawing.Point(930, 544); + this.endTextBox42.Name = "endTextBox42"; + this.endTextBox42.Size = new System.Drawing.Size(163, 27); + this.endTextBox42.TabIndex = 183; + this.endTextBox42.Visible = false; + this.endTextBox42.TextChanged += new System.EventHandler(this.endTextBox42_TextChanged); + this.endTextBox42.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox42_KeyPress); + // + // exclamation39 + // + this.exclamation39.AutoSize = true; + this.exclamation39.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation39.ForeColor = System.Drawing.Color.Red; + this.exclamation39.Location = new System.Drawing.Point(1095, 450); + this.exclamation39.Name = "exclamation39"; + this.exclamation39.Size = new System.Drawing.Size(26, 32); + this.exclamation39.TabIndex = 178; + this.exclamation39.Text = "!"; + this.exclamation39.Visible = false; + // + // endTextBox41 + // + this.endTextBox41.Enabled = false; + this.endTextBox41.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox41.Location = new System.Drawing.Point(930, 514); + this.endTextBox41.Name = "endTextBox41"; + this.endTextBox41.Size = new System.Drawing.Size(163, 27); + this.endTextBox41.TabIndex = 181; + this.endTextBox41.Visible = false; + this.endTextBox41.TextChanged += new System.EventHandler(this.endTextBox41_TextChanged); + this.endTextBox41.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox41_KeyPress); + // + // exclamation38 + // + this.exclamation38.AutoSize = true; + this.exclamation38.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation38.ForeColor = System.Drawing.Color.Red; + this.exclamation38.Location = new System.Drawing.Point(1095, 420); + this.exclamation38.Name = "exclamation38"; + this.exclamation38.Size = new System.Drawing.Size(26, 32); + this.exclamation38.TabIndex = 176; + this.exclamation38.Text = "!"; + this.exclamation38.Visible = false; + // + // endTextBox40 + // + this.endTextBox40.Enabled = false; + this.endTextBox40.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox40.Location = new System.Drawing.Point(930, 484); + this.endTextBox40.Name = "endTextBox40"; + this.endTextBox40.Size = new System.Drawing.Size(163, 27); + this.endTextBox40.TabIndex = 179; + this.endTextBox40.Visible = false; + this.endTextBox40.TextChanged += new System.EventHandler(this.endTextBox40_TextChanged); + this.endTextBox40.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox40_KeyPress); + // + // exclamation37 + // + this.exclamation37.AutoSize = true; + this.exclamation37.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation37.ForeColor = System.Drawing.Color.Red; + this.exclamation37.Location = new System.Drawing.Point(1095, 390); + this.exclamation37.Name = "exclamation37"; + this.exclamation37.Size = new System.Drawing.Size(26, 32); + this.exclamation37.TabIndex = 174; + this.exclamation37.Text = "!"; + this.exclamation37.Visible = false; + // + // endTextBox39 + // + this.endTextBox39.Enabled = false; + this.endTextBox39.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox39.Location = new System.Drawing.Point(930, 454); + this.endTextBox39.Name = "endTextBox39"; + this.endTextBox39.Size = new System.Drawing.Size(163, 27); + this.endTextBox39.TabIndex = 177; + this.endTextBox39.Visible = false; + this.endTextBox39.TextChanged += new System.EventHandler(this.endTextBox39_TextChanged); + this.endTextBox39.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox39_KeyPress); + // + // endTextBox38 + // + this.endTextBox38.Enabled = false; + this.endTextBox38.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox38.Location = new System.Drawing.Point(930, 424); + this.endTextBox38.Name = "endTextBox38"; + this.endTextBox38.Size = new System.Drawing.Size(163, 27); + this.endTextBox38.TabIndex = 175; + this.endTextBox38.Visible = false; + this.endTextBox38.TextChanged += new System.EventHandler(this.endTextBox38_TextChanged); + this.endTextBox38.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox38_KeyPress); + // + // endTextBox37 + // + this.endTextBox37.Enabled = false; + this.endTextBox37.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox37.Location = new System.Drawing.Point(930, 394); + this.endTextBox37.Name = "endTextBox37"; + this.endTextBox37.Size = new System.Drawing.Size(163, 27); + this.endTextBox37.TabIndex = 173; + this.endTextBox37.Visible = false; + this.endTextBox37.TextChanged += new System.EventHandler(this.endTextBox37_TextChanged); + this.endTextBox37.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox37_KeyPress); + // + // exclamation36 + // + this.exclamation36.AutoSize = true; + this.exclamation36.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation36.ForeColor = System.Drawing.Color.Red; + this.exclamation36.Location = new System.Drawing.Point(1095, 360); + this.exclamation36.Name = "exclamation36"; + this.exclamation36.Size = new System.Drawing.Size(26, 32); + this.exclamation36.TabIndex = 172; + this.exclamation36.Text = "!"; + this.exclamation36.Visible = false; + // + // endTextBox36 + // + this.endTextBox36.Enabled = false; + this.endTextBox36.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox36.Location = new System.Drawing.Point(930, 364); + this.endTextBox36.Name = "endTextBox36"; + this.endTextBox36.Size = new System.Drawing.Size(163, 27); + this.endTextBox36.TabIndex = 171; + this.endTextBox36.Visible = false; + this.endTextBox36.TextChanged += new System.EventHandler(this.endTextBox36_TextChanged); + this.endTextBox36.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox36_KeyPress); + // + // exclamation35 + // + this.exclamation35.AutoSize = true; + this.exclamation35.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation35.ForeColor = System.Drawing.Color.Red; + this.exclamation35.Location = new System.Drawing.Point(1095, 330); + this.exclamation35.Name = "exclamation35"; + this.exclamation35.Size = new System.Drawing.Size(26, 32); + this.exclamation35.TabIndex = 170; + this.exclamation35.Text = "!"; + this.exclamation35.Visible = false; + // + // endTextBox35 + // + this.endTextBox35.Enabled = false; + this.endTextBox35.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox35.Location = new System.Drawing.Point(930, 334); + this.endTextBox35.Name = "endTextBox35"; + this.endTextBox35.Size = new System.Drawing.Size(163, 27); + this.endTextBox35.TabIndex = 169; + this.endTextBox35.Visible = false; + this.endTextBox35.TextChanged += new System.EventHandler(this.endTextBox35_TextChanged); + this.endTextBox35.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox35_KeyPress); + // + // exclamation34 + // + this.exclamation34.AutoSize = true; + this.exclamation34.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation34.ForeColor = System.Drawing.Color.Red; + this.exclamation34.Location = new System.Drawing.Point(1095, 300); + this.exclamation34.Name = "exclamation34"; + this.exclamation34.Size = new System.Drawing.Size(26, 32); + this.exclamation34.TabIndex = 168; + this.exclamation34.Text = "!"; + this.exclamation34.Visible = false; + // + // endTextBox34 + // + this.endTextBox34.Enabled = false; + this.endTextBox34.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox34.Location = new System.Drawing.Point(930, 304); + this.endTextBox34.Name = "endTextBox34"; + this.endTextBox34.Size = new System.Drawing.Size(163, 27); + this.endTextBox34.TabIndex = 167; + this.endTextBox34.Visible = false; + this.endTextBox34.TextChanged += new System.EventHandler(this.endTextBox34_TextChanged); + this.endTextBox34.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox34_KeyPress); + // + // exclamation33 + // + this.exclamation33.AutoSize = true; + this.exclamation33.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation33.ForeColor = System.Drawing.Color.Red; + this.exclamation33.Location = new System.Drawing.Point(1095, 270); + this.exclamation33.Name = "exclamation33"; + this.exclamation33.Size = new System.Drawing.Size(26, 32); + this.exclamation33.TabIndex = 166; + this.exclamation33.Text = "!"; + this.exclamation33.Visible = false; + // + // endTextBox33 + // + this.endTextBox33.Enabled = false; + this.endTextBox33.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox33.Location = new System.Drawing.Point(930, 274); + this.endTextBox33.Name = "endTextBox33"; + this.endTextBox33.Size = new System.Drawing.Size(163, 27); + this.endTextBox33.TabIndex = 165; + this.endTextBox33.Visible = false; + this.endTextBox33.TextChanged += new System.EventHandler(this.endTextBox33_TextChanged); + this.endTextBox33.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox33_KeyPress); + // + // exclamation32 + // + this.exclamation32.AutoSize = true; + this.exclamation32.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation32.ForeColor = System.Drawing.Color.Red; + this.exclamation32.Location = new System.Drawing.Point(1095, 240); + this.exclamation32.Name = "exclamation32"; + this.exclamation32.Size = new System.Drawing.Size(26, 32); + this.exclamation32.TabIndex = 164; + this.exclamation32.Text = "!"; + this.exclamation32.Visible = false; + // + // endTextBox32 + // + this.endTextBox32.Enabled = false; + this.endTextBox32.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox32.Location = new System.Drawing.Point(930, 244); + this.endTextBox32.Name = "endTextBox32"; + this.endTextBox32.Size = new System.Drawing.Size(163, 27); + this.endTextBox32.TabIndex = 163; + this.endTextBox32.Visible = false; + this.endTextBox32.TextChanged += new System.EventHandler(this.endTextBox32_TextChanged); + this.endTextBox32.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox32_KeyPress); + // + // exclamation31 + // + this.exclamation31.AutoSize = true; + this.exclamation31.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation31.ForeColor = System.Drawing.Color.Red; + this.exclamation31.Location = new System.Drawing.Point(1095, 210); + this.exclamation31.Name = "exclamation31"; + this.exclamation31.Size = new System.Drawing.Size(26, 32); + this.exclamation31.TabIndex = 162; + this.exclamation31.Text = "!"; + this.exclamation31.Visible = false; + // + // endTextBox31 + // + this.endTextBox31.Enabled = false; + this.endTextBox31.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox31.Location = new System.Drawing.Point(930, 214); + this.endTextBox31.Name = "endTextBox31"; + this.endTextBox31.Size = new System.Drawing.Size(163, 27); + this.endTextBox31.TabIndex = 161; + this.endTextBox31.Visible = false; + this.endTextBox31.TextChanged += new System.EventHandler(this.endTextBox31_TextChanged); + this.endTextBox31.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox31_KeyPress); + // + // exclamation30 + // + this.exclamation30.AutoSize = true; + this.exclamation30.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation30.ForeColor = System.Drawing.Color.Red; + this.exclamation30.Location = new System.Drawing.Point(1095, 180); + this.exclamation30.Name = "exclamation30"; + this.exclamation30.Size = new System.Drawing.Size(26, 32); + this.exclamation30.TabIndex = 160; + this.exclamation30.Text = "!"; + this.exclamation30.Visible = false; + // + // exclamation29 + // + this.exclamation29.AutoSize = true; + this.exclamation29.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation29.ForeColor = System.Drawing.Color.Red; + this.exclamation29.Location = new System.Drawing.Point(1095, 150); + this.exclamation29.Name = "exclamation29"; + this.exclamation29.Size = new System.Drawing.Size(26, 32); + this.exclamation29.TabIndex = 158; + this.exclamation29.Text = "!"; + this.exclamation29.Visible = false; + // + // exclamation28 + // + this.exclamation28.AutoSize = true; + this.exclamation28.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation28.ForeColor = System.Drawing.Color.Red; + this.exclamation28.Location = new System.Drawing.Point(1095, 120); + this.exclamation28.Name = "exclamation28"; + this.exclamation28.Size = new System.Drawing.Size(26, 32); + this.exclamation28.TabIndex = 156; + this.exclamation28.Text = "!"; + this.exclamation28.Visible = false; + // + // endTextBox30 + // + this.endTextBox30.Enabled = false; + this.endTextBox30.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox30.Location = new System.Drawing.Point(930, 184); + this.endTextBox30.Name = "endTextBox30"; + this.endTextBox30.Size = new System.Drawing.Size(163, 27); + this.endTextBox30.TabIndex = 159; + this.endTextBox30.Visible = false; + this.endTextBox30.TextChanged += new System.EventHandler(this.endTextBox30_TextChanged); + this.endTextBox30.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox30_KeyPress); + // + // exclamation27 + // + this.exclamation27.AutoSize = true; + this.exclamation27.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation27.ForeColor = System.Drawing.Color.Red; + this.exclamation27.Location = new System.Drawing.Point(1095, 90); + this.exclamation27.Name = "exclamation27"; + this.exclamation27.Size = new System.Drawing.Size(26, 32); + this.exclamation27.TabIndex = 154; + this.exclamation27.Text = "!"; + this.exclamation27.Visible = false; + // + // endTextBox29 + // + this.endTextBox29.Enabled = false; + this.endTextBox29.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox29.Location = new System.Drawing.Point(930, 154); + this.endTextBox29.Name = "endTextBox29"; + this.endTextBox29.Size = new System.Drawing.Size(163, 27); + this.endTextBox29.TabIndex = 157; + this.endTextBox29.Visible = false; + this.endTextBox29.TextChanged += new System.EventHandler(this.endTextBox29_TextChanged); + this.endTextBox29.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox29_KeyPress); + // + // exclamation26 + // + this.exclamation26.AutoSize = true; + this.exclamation26.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.exclamation26.ForeColor = System.Drawing.Color.Red; + this.exclamation26.Location = new System.Drawing.Point(1095, 60); + this.exclamation26.Name = "exclamation26"; + this.exclamation26.Size = new System.Drawing.Size(26, 32); + this.exclamation26.TabIndex = 152; + this.exclamation26.Text = "!"; + this.exclamation26.Visible = false; + // + // endTextBox28 + // + this.endTextBox28.Enabled = false; + this.endTextBox28.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox28.Location = new System.Drawing.Point(930, 124); + this.endTextBox28.Name = "endTextBox28"; + this.endTextBox28.Size = new System.Drawing.Size(163, 27); + this.endTextBox28.TabIndex = 155; + this.endTextBox28.Visible = false; + this.endTextBox28.TextChanged += new System.EventHandler(this.endTextBox28_TextChanged); + this.endTextBox28.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox28_KeyPress); + // + // endTextBox27 + // + this.endTextBox27.Enabled = false; + this.endTextBox27.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox27.Location = new System.Drawing.Point(930, 94); + this.endTextBox27.Name = "endTextBox27"; + this.endTextBox27.Size = new System.Drawing.Size(163, 27); + this.endTextBox27.TabIndex = 153; + this.endTextBox27.Visible = false; + this.endTextBox27.TextChanged += new System.EventHandler(this.endTextBox27_TextChanged); + this.endTextBox27.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox27_KeyPress); + // + // endTextBox26 + // + this.endTextBox26.Enabled = false; + this.endTextBox26.Font = new System.Drawing.Font("Verdana", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.endTextBox26.Location = new System.Drawing.Point(930, 64); + this.endTextBox26.Name = "endTextBox26"; + this.endTextBox26.Size = new System.Drawing.Size(163, 27); + this.endTextBox26.TabIndex = 151; + this.endTextBox26.Visible = false; + this.endTextBox26.TextChanged += new System.EventHandler(this.endTextBox26_TextChanged); + this.endTextBox26.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBox26_KeyPress); + // + // TestStartEndForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.ClientSize = new System.Drawing.Size(1267, 758); + this.Controls.Add(this.exclamation48); + this.Controls.Add(this.endTextBox48); + this.Controls.Add(this.exclamation47); + this.Controls.Add(this.endTextBox47); + this.Controls.Add(this.exclamation46); + this.Controls.Add(this.endTextBox46); + this.Controls.Add(this.exclamation45); + this.Controls.Add(this.endTextBox45); + this.Controls.Add(this.exclamation44); + this.Controls.Add(this.endTextBox44); + this.Controls.Add(this.exclamation43); + this.Controls.Add(this.endTextBox43); + this.Controls.Add(this.exclamation42); + this.Controls.Add(this.exclamation41); + this.Controls.Add(this.exclamation40); + this.Controls.Add(this.endTextBox42); + this.Controls.Add(this.exclamation39); + this.Controls.Add(this.endTextBox41); + this.Controls.Add(this.exclamation38); + this.Controls.Add(this.endTextBox40); + this.Controls.Add(this.exclamation37); + this.Controls.Add(this.endTextBox39); + this.Controls.Add(this.endTextBox38); + this.Controls.Add(this.endTextBox37); + this.Controls.Add(this.exclamation36); + this.Controls.Add(this.endTextBox36); + this.Controls.Add(this.exclamation35); + this.Controls.Add(this.endTextBox35); + this.Controls.Add(this.exclamation34); + this.Controls.Add(this.endTextBox34); + this.Controls.Add(this.exclamation33); + this.Controls.Add(this.endTextBox33); + this.Controls.Add(this.exclamation32); + this.Controls.Add(this.endTextBox32); + this.Controls.Add(this.exclamation31); + this.Controls.Add(this.endTextBox31); + this.Controls.Add(this.exclamation30); + this.Controls.Add(this.exclamation29); + this.Controls.Add(this.exclamation28); + this.Controls.Add(this.endTextBox30); + this.Controls.Add(this.exclamation27); + this.Controls.Add(this.endTextBox29); + this.Controls.Add(this.exclamation26); + this.Controls.Add(this.endTextBox28); + this.Controls.Add(this.endTextBox27); + this.Controls.Add(this.endTextBox26); + this.Controls.Add(this.startTextBox48); + this.Controls.Add(this.startTextBox47); + this.Controls.Add(this.startTextBox46); + this.Controls.Add(this.startTextBox45); + this.Controls.Add(this.startTextBox44); + this.Controls.Add(this.startTextBox43); + this.Controls.Add(this.startTextBox42); + this.Controls.Add(this.startTextBox41); + this.Controls.Add(this.startTextBox40); + this.Controls.Add(this.startTextBox39); + this.Controls.Add(this.startTextBox38); + this.Controls.Add(this.startTextBox37); + this.Controls.Add(this.startTextBox36); + this.Controls.Add(this.startTextBox35); + this.Controls.Add(this.startTextBox34); + this.Controls.Add(this.startTextBox33); + this.Controls.Add(this.startTextBox32); + this.Controls.Add(this.startTextBox31); + this.Controls.Add(this.startTextBox30); + this.Controls.Add(this.startTextBox29); + this.Controls.Add(this.startTextBox28); + this.Controls.Add(this.startTextBox27); + this.Controls.Add(this.startTextBox26); + this.Controls.Add(this.label48); + this.Controls.Add(this.label47); + this.Controls.Add(this.label46); + this.Controls.Add(this.label45); + this.Controls.Add(this.label44); + this.Controls.Add(this.label43); + this.Controls.Add(this.label42); + this.Controls.Add(this.label41); + this.Controls.Add(this.label40); + this.Controls.Add(this.label39); + this.Controls.Add(this.label38); + this.Controls.Add(this.label37); + this.Controls.Add(this.label36); + this.Controls.Add(this.label35); + this.Controls.Add(this.label34); + this.Controls.Add(this.label33); + this.Controls.Add(this.label32); + this.Controls.Add(this.label31); + this.Controls.Add(this.label30); + this.Controls.Add(this.label29); + this.Controls.Add(this.label28); + this.Controls.Add(this.label27); + this.Controls.Add(this.label26); + this.Controls.Add(this.exclamation25); + this.Controls.Add(this.startTextBox25); + this.Controls.Add(this.endTextBox25); + this.Controls.Add(this.label25); + this.Controls.Add(this.exclamation24); + this.Controls.Add(this.startTextBox24); + this.Controls.Add(this.endTextBox24); + this.Controls.Add(this.label24); + this.Controls.Add(this.exclamation23); + this.Controls.Add(this.startTextBox23); + this.Controls.Add(this.endTextBox23); + this.Controls.Add(this.label23); + this.Controls.Add(this.exclamation22); + this.Controls.Add(this.startTextBox22); + this.Controls.Add(this.endTextBox22); + this.Controls.Add(this.label22); + this.Controls.Add(this.exclamation21); + this.Controls.Add(this.startTextBox21); + this.Controls.Add(this.endTextBox21); + this.Controls.Add(this.label21); + this.Controls.Add(this.exclamation20); + this.Controls.Add(this.startTextBox20); + this.Controls.Add(this.endTextBox20); + this.Controls.Add(this.label20); + this.Controls.Add(this.exclamation19); + this.Controls.Add(this.startTextBox19); + this.Controls.Add(this.endTextBox19); + this.Controls.Add(this.label19); + this.Controls.Add(this.exclamation18); + this.Controls.Add(this.exclamation17); + this.Controls.Add(this.startTextBox18); + this.Controls.Add(this.exclamation16); + this.Controls.Add(this.endTextBox18); + this.Controls.Add(this.label18); + this.Controls.Add(this.startTextBox17); + this.Controls.Add(this.exclamation15); + this.Controls.Add(this.endTextBox17); + this.Controls.Add(this.label17); + this.Controls.Add(this.startTextBox16); + this.Controls.Add(this.exclamation14); + this.Controls.Add(this.endTextBox16); + this.Controls.Add(this.label16); + this.Controls.Add(this.startTextBox15); + this.Controls.Add(this.exclamation13); + this.Controls.Add(this.endTextBox15); + this.Controls.Add(this.label15); + this.Controls.Add(this.startTextBox14); + this.Controls.Add(this.end2Label); + this.Controls.Add(this.endTextBox14); + this.Controls.Add(this.label14); + this.Controls.Add(this.startTextBox13); + this.Controls.Add(this.start2Label); + this.Controls.Add(this.endTextBox13); + this.Controls.Add(this.label13); + this.Controls.Add(this.exclamation12); + this.Controls.Add(this.startTextBox12); + this.Controls.Add(this.endTextBox12); + this.Controls.Add(this.label12); + this.Controls.Add(this.exclamation11); + this.Controls.Add(this.startTextBox11); + this.Controls.Add(this.endTextBox11); + this.Controls.Add(this.label11); + this.Controls.Add(this.exclamation10); + this.Controls.Add(this.startTextBox10); + this.Controls.Add(this.endTextBox10); + this.Controls.Add(this.label10); + this.Controls.Add(this.exclamation9); + this.Controls.Add(this.startTextBox9); + this.Controls.Add(this.endTextBox9); + this.Controls.Add(this.label9); + this.Controls.Add(this.exclamation8); + this.Controls.Add(this.startTextBox8); + this.Controls.Add(this.endTextBox8); + this.Controls.Add(this.label8); + this.Controls.Add(this.exclamation7); + this.Controls.Add(this.startTextBox7); + this.Controls.Add(this.endTextBox7); + this.Controls.Add(this.label7); + this.Controls.Add(this.exclamation6); + this.Controls.Add(this.exclamation5); + this.Controls.Add(this.startTextBox6); + this.Controls.Add(this.exclamation4); + this.Controls.Add(this.endTextBox6); + this.Controls.Add(this.label6); + this.Controls.Add(this.startTextBox5); + this.Controls.Add(this.exclamation3); + this.Controls.Add(this.endTextBox5); + this.Controls.Add(this.label5); + this.Controls.Add(this.startTextBox4); + this.Controls.Add(this.exclamation2); + this.Controls.Add(this.endTextBox4); + this.Controls.Add(this.label4); + this.Controls.Add(this.startTextBox3); + this.Controls.Add(this.exclamation1); + this.Controls.Add(this.endTextBox3); + this.Controls.Add(this.label3); + this.Controls.Add(this.startTextBox2); + this.Controls.Add(this.endLabel); + this.Controls.Add(this.endTextBox2); + this.Controls.Add(this.label2); + this.Controls.Add(this.startTextBox1); + this.Controls.Add(this.startLabel); + this.Controls.Add(this.endTextBox1); + this.Controls.Add(this.label1); + this.Controls.Add(this.okButton); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "TestStartEndForm"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "End States"; + this.TopMost = true; + this.Load += new System.EventHandler(this.CycleEndForm_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox endTextBox1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.TextBox endTextBox3; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox endTextBox4; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox endTextBox5; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.TextBox endTextBox6; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TextBox startTextBox1; + private System.Windows.Forms.TextBox startTextBox3; + private System.Windows.Forms.TextBox startTextBox4; + private System.Windows.Forms.TextBox startTextBox5; + private System.Windows.Forms.TextBox startTextBox6; + private System.Windows.Forms.Label startLabel; + private System.Windows.Forms.Label endLabel; + private System.Windows.Forms.Label exclamation1; + private System.Windows.Forms.Label exclamation3; + private System.Windows.Forms.Label exclamation4; + private System.Windows.Forms.Label exclamation5; + private System.Windows.Forms.Label exclamation6; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox endTextBox2; + private System.Windows.Forms.TextBox startTextBox2; + private System.Windows.Forms.Label exclamation2; + private System.Windows.Forms.Label exclamation7; + private System.Windows.Forms.TextBox startTextBox7; + private System.Windows.Forms.TextBox endTextBox7; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.Label exclamation8; + private System.Windows.Forms.TextBox startTextBox8; + private System.Windows.Forms.TextBox endTextBox8; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.Label exclamation9; + private System.Windows.Forms.TextBox startTextBox9; + private System.Windows.Forms.TextBox endTextBox9; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.Label exclamation10; + private System.Windows.Forms.TextBox startTextBox10; + private System.Windows.Forms.TextBox endTextBox10; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.Label exclamation11; + private System.Windows.Forms.TextBox startTextBox11; + private System.Windows.Forms.TextBox endTextBox11; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.Label exclamation12; + private System.Windows.Forms.TextBox startTextBox12; + private System.Windows.Forms.TextBox endTextBox12; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.Label exclamation24; + private System.Windows.Forms.TextBox startTextBox24; + private System.Windows.Forms.TextBox endTextBox24; + private System.Windows.Forms.Label label24; + private System.Windows.Forms.Label exclamation23; + private System.Windows.Forms.TextBox startTextBox23; + private System.Windows.Forms.TextBox endTextBox23; + private System.Windows.Forms.Label label23; + private System.Windows.Forms.Label exclamation22; + private System.Windows.Forms.TextBox startTextBox22; + private System.Windows.Forms.TextBox endTextBox22; + private System.Windows.Forms.Label label22; + private System.Windows.Forms.Label exclamation21; + private System.Windows.Forms.TextBox startTextBox21; + private System.Windows.Forms.TextBox endTextBox21; + private System.Windows.Forms.Label label21; + private System.Windows.Forms.Label exclamation20; + private System.Windows.Forms.TextBox startTextBox20; + private System.Windows.Forms.TextBox endTextBox20; + private System.Windows.Forms.Label label20; + private System.Windows.Forms.Label exclamation19; + private System.Windows.Forms.TextBox startTextBox19; + private System.Windows.Forms.TextBox endTextBox19; + private System.Windows.Forms.Label label19; + private System.Windows.Forms.Label exclamation18; + private System.Windows.Forms.Label exclamation17; + private System.Windows.Forms.TextBox startTextBox18; + private System.Windows.Forms.Label exclamation16; + private System.Windows.Forms.TextBox endTextBox18; + private System.Windows.Forms.Label label18; + private System.Windows.Forms.TextBox startTextBox17; + private System.Windows.Forms.Label exclamation15; + private System.Windows.Forms.TextBox endTextBox17; + private System.Windows.Forms.Label label17; + private System.Windows.Forms.TextBox startTextBox16; + private System.Windows.Forms.Label exclamation14; + private System.Windows.Forms.TextBox endTextBox16; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.TextBox startTextBox15; + private System.Windows.Forms.Label exclamation13; + private System.Windows.Forms.TextBox endTextBox15; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.TextBox startTextBox14; + private System.Windows.Forms.Label end2Label; + private System.Windows.Forms.TextBox endTextBox14; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.TextBox startTextBox13; + private System.Windows.Forms.Label start2Label; + private System.Windows.Forms.TextBox endTextBox13; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.Label exclamation25; + private System.Windows.Forms.TextBox startTextBox25; + private System.Windows.Forms.TextBox endTextBox25; + private System.Windows.Forms.Label label25; + private System.Windows.Forms.Label label26; + private System.Windows.Forms.Label label27; + private System.Windows.Forms.Label label28; + private System.Windows.Forms.Label label29; + private System.Windows.Forms.Label label30; + private System.Windows.Forms.Label label31; + private System.Windows.Forms.Label label32; + private System.Windows.Forms.Label label33; + private System.Windows.Forms.Label label34; + private System.Windows.Forms.Label label35; + private System.Windows.Forms.Label label36; + private System.Windows.Forms.Label label37; + private System.Windows.Forms.Label label38; + private System.Windows.Forms.Label label39; + private System.Windows.Forms.Label label40; + private System.Windows.Forms.Label label41; + private System.Windows.Forms.Label label42; + private System.Windows.Forms.Label label43; + private System.Windows.Forms.Label label44; + private System.Windows.Forms.Label label45; + private System.Windows.Forms.Label label46; + private System.Windows.Forms.Label label47; + private System.Windows.Forms.Label label48; + private System.Windows.Forms.TextBox startTextBox48; + private System.Windows.Forms.TextBox startTextBox47; + private System.Windows.Forms.TextBox startTextBox46; + private System.Windows.Forms.TextBox startTextBox45; + private System.Windows.Forms.TextBox startTextBox44; + private System.Windows.Forms.TextBox startTextBox43; + private System.Windows.Forms.TextBox startTextBox42; + private System.Windows.Forms.TextBox startTextBox41; + private System.Windows.Forms.TextBox startTextBox40; + private System.Windows.Forms.TextBox startTextBox39; + private System.Windows.Forms.TextBox startTextBox38; + private System.Windows.Forms.TextBox startTextBox37; + private System.Windows.Forms.TextBox startTextBox36; + private System.Windows.Forms.TextBox startTextBox35; + private System.Windows.Forms.TextBox startTextBox34; + private System.Windows.Forms.TextBox startTextBox33; + private System.Windows.Forms.TextBox startTextBox32; + private System.Windows.Forms.TextBox startTextBox31; + private System.Windows.Forms.TextBox startTextBox30; + private System.Windows.Forms.TextBox startTextBox29; + private System.Windows.Forms.TextBox startTextBox28; + private System.Windows.Forms.TextBox startTextBox27; + private System.Windows.Forms.TextBox startTextBox26; + private System.Windows.Forms.Label exclamation48; + private System.Windows.Forms.TextBox endTextBox48; + private System.Windows.Forms.Label exclamation47; + private System.Windows.Forms.TextBox endTextBox47; + private System.Windows.Forms.Label exclamation46; + private System.Windows.Forms.TextBox endTextBox46; + private System.Windows.Forms.Label exclamation45; + private System.Windows.Forms.TextBox endTextBox45; + private System.Windows.Forms.Label exclamation44; + private System.Windows.Forms.TextBox endTextBox44; + private System.Windows.Forms.Label exclamation43; + private System.Windows.Forms.TextBox endTextBox43; + private System.Windows.Forms.Label exclamation42; + private System.Windows.Forms.Label exclamation41; + private System.Windows.Forms.Label exclamation40; + private System.Windows.Forms.TextBox endTextBox42; + private System.Windows.Forms.Label exclamation39; + private System.Windows.Forms.TextBox endTextBox41; + private System.Windows.Forms.Label exclamation38; + private System.Windows.Forms.TextBox endTextBox40; + private System.Windows.Forms.Label exclamation37; + private System.Windows.Forms.TextBox endTextBox39; + private System.Windows.Forms.TextBox endTextBox38; + private System.Windows.Forms.TextBox endTextBox37; + private System.Windows.Forms.Label exclamation36; + private System.Windows.Forms.TextBox endTextBox36; + private System.Windows.Forms.Label exclamation35; + private System.Windows.Forms.TextBox endTextBox35; + private System.Windows.Forms.Label exclamation34; + private System.Windows.Forms.TextBox endTextBox34; + private System.Windows.Forms.Label exclamation33; + private System.Windows.Forms.TextBox endTextBox33; + private System.Windows.Forms.Label exclamation32; + private System.Windows.Forms.TextBox endTextBox32; + private System.Windows.Forms.Label exclamation31; + private System.Windows.Forms.TextBox endTextBox31; + private System.Windows.Forms.Label exclamation30; + private System.Windows.Forms.Label exclamation29; + private System.Windows.Forms.Label exclamation28; + private System.Windows.Forms.TextBox endTextBox30; + private System.Windows.Forms.Label exclamation27; + private System.Windows.Forms.TextBox endTextBox29; + private System.Windows.Forms.Label exclamation26; + private System.Windows.Forms.TextBox endTextBox28; + private System.Windows.Forms.TextBox endTextBox27; + private System.Windows.Forms.TextBox endTextBox26; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/TestStartEndForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/TestStartEndForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/DataEntry/iPerl/TestStartEndForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/Balance/Component.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/Balance/Component.cs new file mode 100644 index 00000000..ac0a6588 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/Balance/Component.cs @@ -0,0 +1,79 @@ +/// +/// Copyright (c) 2016-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; + +namespace TBF.BenchControl.Dummy.Balance +{ + public class Component : ComponentBase, GenericDevices.IScale, IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(Component)); + public override string ToString() + { + return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); + } + + public Component() + { + } + + public Component(Generic.IComponentCfg cfg) + : base(cfg) + { + log.Debug(this.ToString()); + } + + public int ScaleNr { get { return 0; } } + public double Capacity { get { return 10000.0; } } + public GenericDevices.IValve DrainValve { get { return null; } } + public bool IsEmpty(double mass) { return true; } + public bool IsEmpty() { return true; } + public string Format { get { return "F3"; } } + public int EmptyTimeSec { get { return 5; } } + public float BuoyancyTemp { get { return 20.0f; } } + public float BuoyancyPress { get { return 1.013f; } } + public float BuoyancyHumi { get { return 50.0f; } } + + public IOperation TaringOp(ref TBF.Boxes.DoubleBox tara) + { + tara.Val = 0; + return this; + } + + public IOperation ReadMassOp(ref TBF.Boxes.DoubleBox mass) + { + mass.Val = 0; + return this; + } + + public IOperation ReadStableMassOp(ref TBF.Boxes.DoubleBox mass, int readingsCount, double maxSpread, Config.Entities.MassMethod method) + { + mass.Val = 0; + return this; + } + + public IOperation GetSerNumOp(ref string serialNumber) + { + return null; + } + + /// Start this operation + public void Start() + { + } + + /// Run this operation + public Event Run() + { + return Event.BalanceDone; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/Balance/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/Balance/Factory.cs new file mode 100644 index 00000000..e2f6097f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/Balance/Factory.cs @@ -0,0 +1,27 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; +using TBF.BenchControl.Configs.NameOnly; + +namespace TBF.BenchControl.Dummy.Balance +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { } + + public IComponent DummyComponent() { return new Component(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Component(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this.GetType().Namespace.Substring(23), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/Diverter/Component.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/Diverter/Component.cs new file mode 100644 index 00000000..6794d091 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/Diverter/Component.cs @@ -0,0 +1,36 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl.Dummy.Diverter +{ + public class Component : ComponentBase, IDiverter + { + private static readonly ILog log = LogManager.GetLogger(typeof(Component)); + public override string ToString() + { + return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); + } + + public Component() + { + } + + public Component(Generic.IComponentCfg cfg) + : base(cfg) + { + log.Debug(this.ToString()); + } + + public int DiverterNr { get { return 0; } } + public bool State { get { return false; } } + public int ThresholdGate { get { return 50; } } + public int ThresholdLo { get { return 10; } } + public int ThresholdHi { get { return 90; } } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/Diverter/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/Diverter/Factory.cs new file mode 100644 index 00000000..b401dd63 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/Diverter/Factory.cs @@ -0,0 +1,27 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; +using TBF.BenchControl.Configs.NameOnly; + +namespace TBF.BenchControl.Dummy.Diverter +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { } + + public IComponent DummyComponent() { return new Component(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Component(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this.GetType().Namespace.Substring(23), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/FlowMeter/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/FlowMeter/Factory.cs new file mode 100644 index 00000000..0d4c7669 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/FlowMeter/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Dummy.FlowMeter +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { FlowMeter.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new FlowMeter(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new FlowMeter(cfg, components); } + + public IComponentCfg DefaultConfig() { return new FlowMeterCfg(this.GetType().Namespace.Substring(23), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(FlowMeterCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/FlowMeter/FlowMeter.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/FlowMeter/FlowMeter.cs new file mode 100644 index 00000000..d683ca6b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/FlowMeter/FlowMeter.cs @@ -0,0 +1,67 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.Boxes; + +namespace TBF.BenchControl.Dummy.FlowMeter +{ + public class FlowMeter : ComponentBase, GenericDevices.IFlowMeter + { + private static readonly ILog log = LogManager.GetLogger(typeof(FlowMeter)); + public override string ToString() { return string.Format("FlowMeter({0})", Cfg.ToString(1)); } + + readonly FlowMeterCfg flowMeterCfg; + + public float NominalFlow { get { return flowMeterCfg.NominalFlow; } } + + public float LtrPerPulse { get { return flowMeterCfg.NominalFlow / 7200.0f; } } + + public float LtrPerPulseCorrected(double flow, int rangeIx) + { + return (float)flow; + } + + public int Idx1 { get { return 1; } } + + + public FlowMeter() + { + } + + public FlowMeter(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + flowMeterCfg = cfg as FlowMeterCfg; + + log.Debug(this.ToString()); + } + + + public double ReadFlow() { return 1.23; } + public double ReadFrequency() { return 1.23 * 2000.0 / (double)NominalFlow; } + + /// + /// Events: FlowDone, Error + /// + /// Reference to a variable for the flow in Bar + /// ReadFlowOp instance reference casted to IOperaton + public IOperation ReadFlowOp(ref DoubleBox flow) + { + return new ReadFlowOp(this, ref flow); + } + + /// + /// Events: flowDone, Error + /// + /// Reference to a variable for the flow in Bar + /// Event returned when measurement done + /// ReadFlowOp instance reference casted to IOperaton + public IOperation ReadFlowOp(ref DoubleBox flow, Event flowDone) + { + return new ReadFlowOp(this, ref flow, flowDone); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/FlowMeter/FlowMeterCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/FlowMeter/FlowMeterCfg.cs new file mode 100644 index 00000000..9289f010 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/FlowMeter/FlowMeterCfg.cs @@ -0,0 +1,43 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Dummy.FlowMeter +{ + public class FlowMeterCfg : ComponentCfgBase, IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(FlowMeterCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new FlowMeterCfgCtrl(); } + + /// + /// Serialized parameters + /// + public float NominalFlow; /// Nominal flow in m3/h at output frequency 2000 Hz + + + /// Private parameterless constructor invoked by all other (public) constructors + FlowMeterCfg() + { + } + + public FlowMeterCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + Factory = factory; + NominalFlow = 1.0f; + } + + public string ToString(int i) + { + return string.Format("Name={0}, NominalFlow={1}", Name, NominalFlow); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/FlowMeter/FlowMeterCfgCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/FlowMeter/FlowMeterCfgCtrl.Designer.cs new file mode 100644 index 00000000..e38f8f75 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/FlowMeter/FlowMeterCfgCtrl.Designer.cs @@ -0,0 +1,109 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.Dummy.FlowMeter +{ + partial class FlowMeterCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.nominalFlowTextBox = new System.Windows.Forms.TextBox(); + this.nominalFlowLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(140, 61); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(30, 64); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(137, 37); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // nominalFlowTextBox + // + this.nominalFlowTextBox.Enabled = false; + this.nominalFlowTextBox.Location = new System.Drawing.Point(224, 87); + this.nominalFlowTextBox.Name = "nominalFlowTextBox"; + this.nominalFlowTextBox.Size = new System.Drawing.Size(46, 20); + this.nominalFlowTextBox.TabIndex = 8; + // + // nominalFlowLabel + // + this.nominalFlowLabel.AutoSize = true; + this.nominalFlowLabel.Location = new System.Drawing.Point(30, 90); + this.nominalFlowLabel.Name = "nominalFlowLabel"; + this.nominalFlowLabel.Size = new System.Drawing.Size(140, 13); + this.nominalFlowLabel.TabIndex = 7; + this.nominalFlowLabel.Text = "Nominal flow [m3/h @2kHz]"; + // + // FlowMeterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.nominalFlowTextBox); + this.Controls.Add(this.nominalFlowLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "FlowMeterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.FlowMeterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.TextBox nominalFlowTextBox; + private System.Windows.Forms.Label nominalFlowLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/FlowMeter/FlowMeterCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/FlowMeter/FlowMeterCfgCtrl.cs new file mode 100644 index 00000000..edfd17c4 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/FlowMeter/FlowMeterCfgCtrl.cs @@ -0,0 +1,86 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Globalization; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Dummy.FlowMeter +{ + public partial class FlowMeterCfgCtrl : UserControl, IComponentCfgCtrl + { + ComponentParametersDlg parent; + + public bool ShowMore { get { return false; } } + + FlowMeterCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as FlowMeterCfg; + Redraw(); + } + } + + public FlowMeterCfgCtrl() + { + InitializeComponent(); + } + + private void FlowMeterCfgCtrl_Load(object sender, EventArgs e) + { + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + nominalFlowTextBox.Text = config.NominalFlow.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + nominalFlowTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + float fdummy; + if (!Utils.TryParseUFloat(nominalFlowTextBox.Text, out fdummy) || fdummy < 0.01 || fdummy > 1600) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Nominal flow' should be between 0.01 and 1600"; + } + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + Utils.TryParseUFloat(nominalFlowTextBox.Text, out config.NominalFlow); + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/FlowMeter/FlowMeterCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/FlowMeter/FlowMeterCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/FlowMeter/FlowMeterCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/FlowMeter/ReadFlowOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/FlowMeter/ReadFlowOp.cs new file mode 100644 index 00000000..ef15bf0b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/FlowMeter/ReadFlowOp.cs @@ -0,0 +1,61 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using log4net; +using TBF.Boxes; + +namespace TBF.BenchControl.Dummy.FlowMeter +{ + public class ReadFlowOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(ReadFlowOp)); + public override string ToString() { return string.Format("ReadFlowOp(.,{0},{1},.)", eventDone); } + + /// Set by the constructor + readonly FlowMeter flowMeter; + readonly DoubleBox flowBox; + readonly Event eventDone; + + /// + /// Events: FlowInDone, FlowOutDone or Error + /// + /// Flow meter reference + /// Reference to the measured flow variable, value is in bar + /// Event to be returned by Run() when completed OK + public ReadFlowOp(FlowMeter flowMeter, ref DoubleBox flowBox, Event eventDone) + { + if (flowMeter == null) throw new ArgumentNullException("flowMeter"); + + this.flowMeter = flowMeter; + this.eventDone = eventDone; + this.flowBox = flowBox; + + log.Debug(this.ToString()); + } + public ReadFlowOp(FlowMeter flowMeter, ref DoubleBox flow) + : this(flowMeter, ref flow, Event.FlowMeasurementDone) + { + } + + /// Start this operation + public void Start() + { + } + + /// Run this operation + /// + /// Event.FlowInDone or Event.FlowOutDone + /// + public Event Run() + { + if (flowBox != null) flowBox.Val = flowMeter.ReadFlow(); + return eventDone; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/RegulValve/ChangeValvePositionOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/RegulValve/ChangeValvePositionOp.cs new file mode 100644 index 00000000..2c2b9b65 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/RegulValve/ChangeValvePositionOp.cs @@ -0,0 +1,60 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using log4net; + +namespace TBF.BenchControl.Dummy.RegulValve +{ + public class ChangeRegulValvePositionOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(ChangeRegulValvePositionOp)); + public override string ToString() + { + return string.Format("ChangeRegulValvePositionOp({0},{1}s)", regulValve.Name, timePulseSec.ToString("F2")); + } + + /// Set by the constructor + readonly RegulValve regulValve; + readonly float timePulseSec; + + /// + /// Set required water flow. + /// Events: FlowSet, FlowTimeOut + /// + /// Control board device + /// Regulation valve component + /// Lower limit of the position to be achieved + /// Upper limit of the position to be achieved + /// Timeout in sec. for setting the flow + /// Only Elde.Valve flow are used, other flow on the lists are ignored + public ChangeRegulValvePositionOp(RegulValve regulValve, float timePulseSec) + { + this.regulValve = regulValve as RegulValve; + if (this.regulValve == null) throw new ArgumentNullException("regValve is null or not Elde"); + + this.timePulseSec = timePulseSec; + + log.Debug(this.ToString()); + } + + /// Start this operation + public void Start() + { + } + + /// Run this operation + /// + /// Event.SetFlowDone + /// + public Event Run() + { + return Event.PositionReached; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/RegulValve/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/RegulValve/Factory.cs new file mode 100644 index 00000000..ebee99b5 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/RegulValve/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Dummy.RegulValve +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { RegulValve.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new RegulValve(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new RegulValve(cfg, components); } + + public IComponentCfg DefaultConfig() { return new RegulValveCfg(this.GetType().Namespace.Substring(23), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(RegulValveCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/RegulValve/RegulValve.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/RegulValve/RegulValve.cs new file mode 100644 index 00000000..0b21de68 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/RegulValve/RegulValve.cs @@ -0,0 +1,99 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using log4net; +using TBF.BenchControl.Generic; +using TBF.Boxes; + +namespace TBF.BenchControl.Dummy.RegulValve +{ + public class RegulValve : ComponentBase, IDevice, GenericDevices.IRegulValve + { + private static readonly ILog log = LogManager.GetLogger(typeof(RegulValve)); + public override string ToString() { return string.Format("RegulValve({0})", Cfg.ToString(1)); } + + + public readonly RegulValveCfg RegulValveCfg; + + public ValveCategory Category { get { return RegulValveCfg.Category; } } + /// + public bool IsCoax { get { return false; } } + + public float Position { get { return 50.0f; } } + + + IDictionary dict; + public IDictionary Dict { get { return dict; } } + + + public RegulValve() + { + } + + public RegulValve(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + RegulValveCfg = cfg as RegulValveCfg; + dict = new Dictionary(); + + log.Debug(this.ToString()); + } + + public void Initialize() { } + public void RunDeviceBefore() { } + public void RunDeviceAfter() { } + public void StopDevice() { } + public void StopDevice2() { } + + + /// + /// Operation to set the water flow within tolerances + /// Events: Event.None, Event.FlowReached, Event.FlowTimeOut + /// + /// Flowmeter component + /// Lower limit of the required flow [m3/h] + /// Higher limit of the required flow [m3/h] + /// Measured flow [m3/h] + /// Timeout in [s] + /// SetFlowOp instance + public IOperation SetFlowOp(GenericDevices.IFlowMeter flowMeter, float requiredFlowLo, float requiredFlowHi, + float pidCoef, DoubleBox measuredFlow, int timeout) + { + return new SetFlowOp(this, flowMeter, requiredFlowLo, requiredFlowHi, pidCoef, measuredFlow, timeout); + } + + /// + /// Operation to set the water flow within tolerances. Leave the measurement running. + /// Events: Event.None, Event.FlowReached, Event.FlowTimeOut + /// + /// Flowmeter component + /// Lower limit of the required flow [m3/h] + /// Higher limit of the required flow [m3/h] + /// Measured flow [m3/h] + /// Timeout in [s] + /// SetFlowOp instance + public IOperation SetFlowAndMeasureOp(GenericDevices.IFlowMeter flowMeter, float requiredFlowLo, float requiredFlowHi, + float pidCoef, DoubleBox measuredFlow, int timeout, float filterConstant) + { + return new SetFlowOp(this, flowMeter, requiredFlowLo, requiredFlowHi, pidCoef, measuredFlow, timeout, true); + } + + /// + /// Operation to set the regulation valve to a required position + /// Events: Event.None + /// + /// Lower limit of the required valve position in [%] + /// Higher limit of the required valve position in [%] + /// SetPositionOp instance + public IOperation SetRegulValvePositionOp(float pctLo, float pctHi, int timeoutMs) + { + return new SetRegulValvePositionOp(this, pctLo, pctHi, timeoutMs); + } + + public IOperation ChangeRegulValvePositionOp(float timePulseSec) + { + return new ChangeRegulValvePositionOp(this, timePulseSec); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/RegulValve/RegulValveCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/RegulValve/RegulValveCfg.cs new file mode 100644 index 00000000..978a2bb2 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/RegulValve/RegulValveCfg.cs @@ -0,0 +1,39 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using TBF.BenchControl.Generic; +using System.Xml.Serialization; + +namespace TBF.BenchControl.Dummy.RegulValve +{ + public class RegulValveCfg : ComponentCfgBase, IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(RegulValveCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new RegulValveCfgCtrl(); } + + /// + /// Serialized parameters + /// + public ValveCategory Category; /// Feeding, Output or All + + /// Private parameterless constructor invoked by all other (public) constructors + RegulValveCfg() + { + } + + public RegulValveCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + Factory = factory; + Category = ValveCategory.Output; + } + + public string ToString(int i) + { + return string.Format("Name={0}", Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/RegulValve/RegulValveCfgCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/RegulValve/RegulValveCfgCtrl.Designer.cs new file mode 100644 index 00000000..6b2b539b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/RegulValve/RegulValveCfgCtrl.Designer.cs @@ -0,0 +1,110 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.Dummy.RegulValve +{ + partial class RegulValveCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.categoryComboBox = new System.Windows.Forms.ComboBox(); + this.categoryLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(138, 41); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(28, 44); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(135, 14); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(89, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComponentName"; + // + // categoryComboBox + // + this.categoryComboBox.Enabled = false; + this.categoryComboBox.FormattingEnabled = true; + this.categoryComboBox.Location = new System.Drawing.Point(138, 65); + this.categoryComboBox.Name = "categoryComboBox"; + this.categoryComboBox.Size = new System.Drawing.Size(130, 21); + this.categoryComboBox.TabIndex = 6; + // + // categoryLabel + // + this.categoryLabel.AutoSize = true; + this.categoryLabel.Location = new System.Drawing.Point(28, 68); + this.categoryLabel.Name = "categoryLabel"; + this.categoryLabel.Size = new System.Drawing.Size(49, 13); + this.categoryLabel.TabIndex = 5; + this.categoryLabel.Text = "Category"; + // + // RegulValveCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.categoryComboBox); + this.Controls.Add(this.categoryLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "RegulValveCfgCtrl"; + this.Size = new System.Drawing.Size(423, 292); + this.Load += new System.EventHandler(this.RegulationValveCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.ComboBox categoryComboBox; + private System.Windows.Forms.Label categoryLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/RegulValve/RegulValveCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/RegulValve/RegulValveCfgCtrl.cs new file mode 100644 index 00000000..eadf9028 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/RegulValve/RegulValveCfgCtrl.cs @@ -0,0 +1,103 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Dummy.RegulValve +{ + public partial class RegulValveCfgCtrl : UserControl, IComponentCfgCtrl + { + ComponentParametersDlg parent; + + public bool ShowMore { get { return true; } } + + RegulValveCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as RegulValveCfg; + Redraw(); + } + } + + public RegulValveCfgCtrl() + { + InitializeComponent(); + } + + private void RegulationValveCfgCtrl_Load(object sender, EventArgs e) + { + categoryComboBox.Items.Add(ValveCategory.All.ToString()); + categoryComboBox.Items.Add(ValveCategory.Feeding.ToString()); + categoryComboBox.Items.Add(ValveCategory.Output.ToString()); + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + categoryComboBox.Text = config.Category.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + categoryComboBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (!categoryComboBox.Text.Equals(ValveCategory.All.ToString()) && + !categoryComboBox.Text.Equals(ValveCategory.Feeding.ToString()) && + !categoryComboBox.Text.Equals(ValveCategory.Output.ToString())) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Category'"; + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + /// + if (!config.Name.Equals(nameTextBox.Text)) + { + config.Name = nameTextBox.Text; + flags |= CfgUpdateFlags.RestartRqrd; + } + + ValveCategory newCategory; + if (categoryComboBox.Text.Equals(ValveCategory.All.ToString())) newCategory = ValveCategory.All; + else if (categoryComboBox.Text.Equals(ValveCategory.Feeding.ToString())) newCategory = ValveCategory.Feeding; + else if (categoryComboBox.Text.Equals(ValveCategory.Bench.ToString())) newCategory = ValveCategory.Bench; + else if (categoryComboBox.Text.Equals(ValveCategory.Output.ToString())) newCategory = ValveCategory.Output; + else newCategory = ValveCategory.None; + if (newCategory != config.Category) + { + config.Category = newCategory; + flags |= CfgUpdateFlags.RestartRqrd; + } + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/RegulValve/RegulValveCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/RegulValve/RegulValveCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/RegulValve/RegulValveCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/RegulValve/SetFlowOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/RegulValve/SetFlowOp.cs new file mode 100644 index 00000000..582f1f67 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/RegulValve/SetFlowOp.cs @@ -0,0 +1,118 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.BenchControl.GenericDevices; +using TBF.Boxes; + +namespace TBF.BenchControl.Dummy.RegulValve +{ + public class SetFlowOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(SetFlowOp)); + public override string ToString() + { + return string.Format("SetFlowOp({0}, Qfrom={1}, Qto={2}, PID={3})", regulValve.Name, reqFlowLo, reqFlowHi, pidCoef); + } + + const int CoaxValveNr = 7; /// Coax. valve has number 7 + + + /// Set by the constructor + readonly RegulValve regulValve; + readonly int flowMeterNr; + readonly float reqFlowLo; + readonly float reqFlowHi; + readonly float reqFlowAve; + readonly float pidCoef; + readonly int timeout; + readonly bool leaveMeasurementRunning; + readonly bool reTryCommands; + + readonly float nominalFlow; + + float targetPositionLo; + float targetPositionHi; + + int expireTime; + DoubleBox measuredFlow; + int flowWithinBoundsTime; + + + /// + /// Set required water flow. Conditionally leave the measurement running. + /// Events: FlowSet, FlowTimeOut + /// + /// Regulation valve component + /// Flowmeter component + /// Lower limit of the flow to be achieved in [m3/h] + /// Upper limit of the flow to be achieved in [m3/h] + /// PID coefficient (float) + /// Timeout for the flow setting in [s] + /// true = Leave the measurement running after op. stop + /// Only Elde.Valve flow are used, other flow on the lists are ignored + public SetFlowOp(IRegulValve regulValve, IFlowMeter flowMeter, float requiredFlowLo, float requiredFlowHi, + float pidCoef, DoubleBox measuredFlow, int timeout, bool leaveMeasurementRunning) + { + this.regulValve = regulValve as RegulValve; + if (this.regulValve == null) throw new ArgumentNullException("regValve is null or not Dummy.RegulValve"); + + nominalFlow = flowMeter.NominalFlow; + + this.reqFlowLo = requiredFlowLo; + this.reqFlowHi = requiredFlowHi; + this.reqFlowAve = (reqFlowLo + reqFlowHi) / 2.0f; + this.measuredFlow = measuredFlow; + + this.timeout = timeout; + + this.leaveMeasurementRunning = leaveMeasurementRunning; + + log.Debug(this.ToString()); + } + + /// + /// Set required water flow - Do not leave the measurement running. + /// Events: FlowSet + /// + public SetFlowOp(IRegulValve regValve, IFlowMeter flowMeter, float requiredFlowLo, float requiredFlowHi, + float pidCoef, DoubleBox measuredFlow, int timeout) + : this(regValve, flowMeter, requiredFlowLo, requiredFlowHi, pidCoef, measuredFlow, timeout, false) + { + } + + /// + /// Set required water flow - No timeout. + /// Events: FlowSet + /// + public SetFlowOp(IRegulValve regValve, IFlowMeter flowMeter, float requiredFlowLo, float requiredFlowHi, + float pidCoef, DoubleBox measuredFlow) + : this(regValve, flowMeter, requiredFlowLo, requiredFlowHi, pidCoef, measuredFlow, int.MaxValue, false) + { + } + + /// Start this operation + public void Start() + { + expireTime = StateMachine.Time + timeout; + if (expireTime < 0) expireTime = int.MaxValue; + } + + /// Run this operation + /// + /// Event.None, Event.FlowReached, Event.RegulValveTimeOut, Event.OpArgumentError + /// + public Event Run() + { + measuredFlow.Val = reqFlowAve; + return Event.FlowReached; + } + + /// Start this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/RegulValve/SetRegulValvePositionOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/RegulValve/SetRegulValvePositionOp.cs new file mode 100644 index 00000000..3e4f7e56 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/RegulValve/SetRegulValvePositionOp.cs @@ -0,0 +1,120 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl.Dummy.RegulValve +{ + public class SetRegulValvePositionOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(SetRegulValvePositionOp)); + public override string ToString() + { + return string.Format("SetRegulValvePositionOp({0},{1},{2})", regulValve.Name, posLoPct, posHiPct); + } + + const int CoaxValveNr = 7; /// Coax. valve has number 7 + + /// + /// Internal states of this operation + /// + enum OpState + { + Idle = 0, + MoveToPosition, /// Send commend to move to position + CheckState, /// Check RV state by reading statos word + MovingToPosition, /// Command passed OK, RV is moving to a position + } + OpState opState; + + /// Set by the constructor + readonly RegulValve regulValve; + readonly float posLoPct; + readonly float posHiPct; + readonly int timeout; + + /// Process values + bool firstRun; + int expireTime; + bool positionReached; + + /// + /// Set required water flow. + /// Events: FlowSet, FlowTimeOut + /// + /// Control board device + /// Regulation valve component + /// Lower limit of the position to be achieved + /// Upper limit of the position to be achieved + /// Timeout in sec. for setting the flow + /// Only Elde.Valve flow are used, other flow on the lists are ignored + public SetRegulValvePositionOp(RegulValve regulValve, float posLoPct, float posHiPct, int timeout) + { + this.regulValve = regulValve as RegulValve; + if (regulValve == null) throw new ArgumentNullException("regValve is null or not Elde"); + + this.posLoPct = posLoPct; + this.posHiPct = posHiPct; + + this.timeout = timeout; + + log.Debug(this.ToString()); + } + + /// + /// Set required water flow - no timeout. + /// Events: FlowSet + /// + public SetRegulValvePositionOp(RegulValve regValve, float posLoPct, float posHiPct) + : this(regValve, posLoPct, posHiPct, int.MaxValue) + { + } + + /// Start this operation + public void Start() + { + firstRun = true; + positionReached = false; + expireTime = StateMachine.Time + timeout; + log.InfoFormat("Start(): RV#={0}, reqPosLo={1}%, reqPosHi={2}%", posLoPct.ToString("F1"), posHiPct.ToString("F1")); + opState = OpState.MoveToPosition; + } + + /// Run this operation + /// + /// Event.None . . . . . . . busy adjusting position + /// Event.PositionReached . . position reached + /// Event.OpArgumentError . . invalid required position + /// + public Event Run() + { + if (opState == OpState.MoveToPosition) + { + opState = OpState.CheckState; + return Event.None; + } + + if (positionReached) return Event.PositionReached; + + if (opState == OpState.CheckState) + { + opState = OpState.MovingToPosition; + return Event.None; + } + else if (opState == OpState.MovingToPosition) + { + positionReached = true; + return Event.PositionReached; + } + return Event.None; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/Valve/Component.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/Valve/Component.cs new file mode 100644 index 00000000..ccbcc9dc --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/Valve/Component.cs @@ -0,0 +1,40 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl.Dummy.Valve +{ + public class Component : ComponentBase, IValve + { + private static readonly ILog log = LogManager.GetLogger(typeof(Component)); + public override string ToString() + { + return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); + } + + public Component() + { + } + + public Component(Generic.IComponentCfg cfg) + : base(cfg) + { + log.Debug(this.ToString()); + } + + bool state; + + public bool State { get { return state; } } + public ValveCategory Category { get { return ValveCategory.None; } } + public int Delay { get { return 1; } } + public IValve CoupledTo { get { return null; } } + public bool InvertCouple { get { return false; } } + public int LagOpening { get { return 0; } } + public int LagClosing { get { return 0; } } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/Valve/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/Valve/Factory.cs new file mode 100644 index 00000000..fa10c5e4 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Dummy/Valve/Factory.cs @@ -0,0 +1,27 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; +using TBF.BenchControl.Configs.NameOnly; + +namespace TBF.BenchControl.Dummy.Valve +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { } + + public IComponent DummyComponent() { return new Component(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Component(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this.GetType().Namespace.Substring(23), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Common.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Common.cs new file mode 100644 index 00000000..9e7fac6c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Common.cs @@ -0,0 +1,112 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; + +namespace TBF.BenchControl.Elde +{ + public enum Command + { + None = 0, /// Do nothing, just transfer data (route, etc.) + Start = 1, /// Start the measurement + Stop = 2, /// Stop the measurement + ReadDivTransition = 4, + ReadExtremasOfPulses = 6, + ReadShapesOfPulses = 7, + ResetShapesOfPulses = 8, + EnduranceCycleParamsUpload = 11, + EnduranceCycleStart = 12, + EnduranceCycleStop = 13, + } + +#if FUZHOU300 || PT200IL || TORINO50 || BADGER_MALA_TRAT || BADGER_STREDNA_TRAT || TURA_IPERL || TURA_SPECIAL || BADGER_VELKA_TRAT || PUCHONG_PT200 || SLM_50 || GENESIS || MALTA_WSD25 || SLM_END || WARSAW_END || BERLIN || SLM_150 || PETERSBURG_50 || PETERSBURG_200 || KEMPNO_50 || BAHRAIN_50 || RUM_MOB || KRAKOW_50 || JUZNA_AFRIKA_50 || ZAMBIA || SENTEC || FUZHOU100 || CEVAK_200 || DUBAJ_50 + public enum StatusP : ulong + { + RefFlowMeterMask = 0x7, /// bits 0,1,2 + TestCompleted = 0x10, /// bit 4 + TestInProgress = 0x20, /// bit 5 + //DiverterError = 0x20, + MsrmntWithDivrtr = 0x80, /// bit 7 + RefPulsesMsrmnt = 0x100, /// bit 8 + SynchroMethod = 0x800, /// bit 11 + WaterMeterCalib = 0x1000, /// bit 12 + EmgcyStopActive = 0x2000, /// bit 13 + MsrmntGateActive = 0x4000, /// bit 14 + TimeMeasurement = 0x8000, /// bit 15 + FrequencyMeasured = 0x80000, /// bit 19 + CoaxRegValveBusy = 0x200000, /// bit 21 + ADCError = 0x80000000, /// bit 31 + TimeoutOccured = 0x100000000, /// bit 32 + MeretAddresses = 0x200000000, /// bit 33 + SampleBuferFull = 0x400000000, /// bit 34 + ErrorTempMeter = 0x10000000000, /// bit 40 + ErrorPressMeter1 = 0x1000000000000, /// bit 48 + ErrorPressMeter2 = 0x2000000000000, /// bit 49 + ErrorPressMeter3 = 0x4000000000000, /// bit 50 + ErrorPressMeter4 = 0x8000000000000, /// bit 51 + EndurCycleRunning = 0x200000000000000, /// bit 57 + } +#else // DN100 || MUNICH || FUZHOU150 || TORUN_PT50_2015 || CEVAK_PT40_272 || MURES_PT40 || FUZHOU_40 + public enum StatusP : ulong + { + RefFlowMeterMask = 0x7, + TestInProgress = 0x8, + TestCompleted = 0x10, + DiverterError = 0x20, + MsrmntWithDivrtr = 0x80, + RefPulsesMsrmnt = 0x100, + SynchroMethod = 0x800, + WaterMeterCalib = 0x1000, + EmgcyStopActive = 0x2000, + MsrmntGateActive = 0x4000, + TimeMeasurement = 0x8000, + FrequencyMeasured = 0x80000, + CoaxRegValveBusy = 0x200000, /// bit 21 + ADCError = 0x80000000, + TimeoutOccured = 0x100000000, + MeretAddresses = 0x200000000, + SampleBuferFull = 0x400000000, + ErrorTempMeter = 0x10000000000, + ErrorPressMeter1 = 0x1000000000000, + ErrorPressMeter2 = 0x2000000000000, + ErrorPressMeter3 = 0x4000000000000, + ErrorPressMeter4 = 0x8000000000000, + } +#endif + + public enum StopDevs + { + None = 0, + Reference = 0x01, /// bit 0 + Diverter = 0x02, /// bit 1 + GatePulse = 0x08, /// bit 3 + TimeMeasurement = 0x10, /// bit 4 + BypassDevCoupled2Div = 0x20, /// bit 5 + RegValveRegulation = 0x80, /// bit 7 + All = 0xFF, + } + + public enum TestMethods + { + Diverter = 0x01, /// bit 0: 1=Mass method (diverters are used), 0=Volume method + FixedStart = 0x02, /// bit 1: 1=fixed start method, 0=flying start method + Synchro = 0x04, /// bit 2: 1=Synchro method, 0=Pulse counting + MassAndContinue = 0x10, /// bit 4: 1=Method with mass measurement followed by a volume method + } + + public enum RegulValveMode : byte + { + None = 0, + PulseWidth = 1, /// Pulse width 0.05 .. 2 sec. + TargetPosition = 2, /// Low and high position (=DAC value) limits (0..100%) are specified + TargetFrequency = 3, /// Low and high frequency limits (0..2000Hz,0..2200Hz) are specified + Stop = 4, /// Stop regulation + } + + public enum RegulValveState + { + Idle = 0, + PwOrFreqRegul = 2, + DacValueRegul = 3, + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ControlBoardCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ControlBoardCfg.cs new file mode 100644 index 00000000..14ce8c71 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ControlBoardCfg.cs @@ -0,0 +1,46 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.IO; +using System.Collections.Generic; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde +{ + public class ControlBoardCfg : ComponentCfgBase, IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ControlBoardCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new ControlBoardCfgCtrl(); } + + /// + /// Serialized parameters + /// + public int ComPortNr; + public int VirtualValvesRangeLo; + public int VirtualValvesRangeHi; + + /// Private parameterless constructor invoked by all other (public) constructors + ControlBoardCfg() + { + Name = "CB"; + ParentName = string.Empty; + ComPortNr = 1; + VirtualValvesRangeLo = 50; + VirtualValvesRangeHi = 59; + } + + public ControlBoardCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Com{1}, VVRangeLo={2}, VVRangeHi={3}", Name, ComPortNr, VirtualValvesRangeLo, VirtualValvesRangeHi); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ControlBoardCfgCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ControlBoardCfgCtrl.Designer.cs new file mode 100644 index 00000000..cf34a7ff --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ControlBoardCfgCtrl.Designer.cs @@ -0,0 +1,155 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.Elde +{ + partial class ControlBoardCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.comPortNrLabel = new System.Windows.Forms.Label(); + this.comPortNrTextBox = new System.Windows.Forms.TextBox(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.nameLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.vValveRangeLoTextBox = new System.Windows.Forms.TextBox(); + this.vValveRangeLoLabel = new System.Windows.Forms.Label(); + this.vValveRangeHiTextBox = new System.Windows.Forms.TextBox(); + this.vValveRangeHiLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // comPortNrLabel + // + this.comPortNrLabel.AutoSize = true; + this.comPortNrLabel.Location = new System.Drawing.Point(42, 85); + this.comPortNrLabel.Name = "comPortNrLabel"; + this.comPortNrLabel.Size = new System.Drawing.Size(95, 13); + this.comPortNrLabel.TabIndex = 0; + this.comPortNrLabel.Text = "Serial port number:"; + // + // comPortNrTextBox + // + this.comPortNrTextBox.Enabled = false; + this.comPortNrTextBox.Location = new System.Drawing.Point(166, 82); + this.comPortNrTextBox.Name = "comPortNrTextBox"; + this.comPortNrTextBox.Size = new System.Drawing.Size(80, 20); + this.comPortNrTextBox.TabIndex = 1; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(163, 26); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 2; + this.classNameLabel.Text = "ComonentName"; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(42, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 3; + this.nameLabel.Text = "Name"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(166, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(80, 20); + this.nameTextBox.TabIndex = 4; + // + // vValveRangeLoTextBox + // + this.vValveRangeLoTextBox.Enabled = false; + this.vValveRangeLoTextBox.Location = new System.Drawing.Point(166, 107); + this.vValveRangeLoTextBox.Name = "vValveRangeLoTextBox"; + this.vValveRangeLoTextBox.Size = new System.Drawing.Size(80, 20); + this.vValveRangeLoTextBox.TabIndex = 6; + // + // vValveRangeLoLabel + // + this.vValveRangeLoLabel.AutoSize = true; + this.vValveRangeLoLabel.Location = new System.Drawing.Point(42, 110); + this.vValveRangeLoLabel.Name = "vValveRangeLoLabel"; + this.vValveRangeLoLabel.Size = new System.Drawing.Size(118, 13); + this.vValveRangeLoLabel.TabIndex = 5; + this.vValveRangeLoLabel.Text = "Virtual valves range Lo:"; + // + // vValveRangeHiTextBox + // + this.vValveRangeHiTextBox.Enabled = false; + this.vValveRangeHiTextBox.Location = new System.Drawing.Point(166, 132); + this.vValveRangeHiTextBox.Name = "vValveRangeHiTextBox"; + this.vValveRangeHiTextBox.Size = new System.Drawing.Size(80, 20); + this.vValveRangeHiTextBox.TabIndex = 8; + // + // vValveRangeHiLabel + // + this.vValveRangeHiLabel.AutoSize = true; + this.vValveRangeHiLabel.Location = new System.Drawing.Point(42, 135); + this.vValveRangeHiLabel.Name = "vValveRangeHiLabel"; + this.vValveRangeHiLabel.Size = new System.Drawing.Size(116, 13); + this.vValveRangeHiLabel.TabIndex = 7; + this.vValveRangeHiLabel.Text = "Virtual valves range Hi:"; + // + // ControlBoardCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.vValveRangeHiTextBox); + this.Controls.Add(this.vValveRangeHiLabel); + this.Controls.Add(this.vValveRangeLoTextBox); + this.Controls.Add(this.vValveRangeLoLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Controls.Add(this.comPortNrTextBox); + this.Controls.Add(this.comPortNrLabel); + this.Name = "ControlBoardCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.ControlBoardCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label comPortNrLabel; + private System.Windows.Forms.TextBox comPortNrTextBox; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.TextBox vValveRangeLoTextBox; + private System.Windows.Forms.Label vValveRangeLoLabel; + private System.Windows.Forms.TextBox vValveRangeHiTextBox; + private System.Windows.Forms.Label vValveRangeHiLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ControlBoardCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ControlBoardCfgCtrl.cs new file mode 100644 index 00000000..c1cca827 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ControlBoardCfgCtrl.cs @@ -0,0 +1,105 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde +{ + public partial class ControlBoardCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + ControlBoardCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as ControlBoardCfg; + Redraw(); + } + } + + public ControlBoardCfgCtrl() + { + InitializeComponent(); + } + + private void ControlBoardCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + comPortNrTextBox.Text = config.ComPortNr.ToString(); + vValveRangeLoTextBox.Text = config.VirtualValvesRangeLo.ToString(); + vValveRangeHiTextBox.Text = config.VirtualValvesRangeHi.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + comPortNrTextBox.Enabled = true; + vValveRangeLoTextBox.Enabled = true; + vValveRangeHiTextBox.Enabled = true; + } + + /// + /// Verify current user controls for validity. + /// Called when user wants to close/save the configuration. + /// + /// See VerifyFlags + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!int.TryParse(comPortNrTextBox.Text, out dummy) || dummy <= 0 || dummy > 999) + { + message += "Control board serial port number is invalid"; + flags |= CfgUpdateFlags.Error; + } + if (!int.TryParse(vValveRangeLoTextBox.Text, out dummy) || dummy < 0 || dummy > 63) + { + message += "Virtual valves range Lo is invalid"; + flags |= CfgUpdateFlags.Error; + } + if (!int.TryParse(vValveRangeHiTextBox.Text, out dummy) || dummy < 0 || dummy > 63) + { + message += "Virtual valves range Hi is invalid"; + flags |= CfgUpdateFlags.Error; + } + + return flags; + } + + /// + /// Save settings to the configuration class. + /// + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + this.Name = nameTextBox.Text; + this.config.ComPortNr = int.Parse(comPortNrTextBox.Text); + this.config.VirtualValvesRangeLo = int.Parse(vValveRangeLoTextBox.Text); + this.config.VirtualValvesRangeHi = int.Parse(vValveRangeHiTextBox.Text); + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ControlBoardCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ControlBoardCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ControlBoardCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ControlBoardDev.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ControlBoardDev.cs new file mode 100644 index 00000000..d9cde5da --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ControlBoardDev.cs @@ -0,0 +1,669 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Text; +using System.IO.Ports; +using System.Collections.Generic; +using Config.Entities; +using Dirichlet.Numerics; +using TBF.BenchControl.Generic; +using TBF.BenchControl.GenericDevices; +using log4net; + +namespace TBF.BenchControl.Elde +{ + public class ControlBoardDev : ComponentBase, IDevice, IValveControl + { + private static readonly ILog log = LogManager.GetLogger(typeof(ControlBoardDev)); + public override string ToString() { return string.Format("ControlBoard({0})", Cfg.ToString(1)); } + + readonly ControlBoardCfg controlBoardCfg; + + /// + /// Reference to the control board component + /// + IControlCom controlCom; + + /// + /// Emergency stop signal state updated by RunDevice(). + /// 'modelessDlg' is notified about the changes and uses this information to change its visibility. + /// + //UiBridge.EmergencyStopEventArgs.State emergencyStopState; + + + /// + /// Public read only wrappers for Elde software component fields + /// + /// rvNr1 = 1 .. nrRegulValves (one based) + /// wmNr0 = 0 .. nrWaterMeters-1 (zero based) + /// tmpNr0 = 0 .. nrTempMeters-1 (zero based) + /// prsNr0 = 0 .. nrPressureMeters-1 (zero based) + /// + public StatusP StatusP { get { return controlCom.StatusP; } } + public double ReferenceFreq { get { return controlCom.ReferenceFreq; } } /// In [Hz] 0..2500, nom.=2000 + public int EtPulses(int wmNr1) { return controlCom.EtPulses(wmNr1); } + public int EtPulsesK { get { return controlCom.EtPulsesK; } } + public UInt16 WMeterPulses(int wmNr1) { return controlCom.WMeterPulses(wmNr1); } + public int WMeterReference(int wmNr0) { return controlCom.WMeterReference(wmNr0); } + public uint RegulValveDAC { get { return controlCom.RegulValveDAC; } } + public float Pressure(int prsNr0) { return controlCom.Pressure(prsNr0); } + public float Temperature(int tmpNr0) { return controlCom.Temperature(tmpNr0); } + public RegulValveState RegulValveState(int rvNr1) { return (RegulValveState)controlCom.RegulValveState(rvNr1); } + public UInt128 RRoute { get { return controlCom.RRoute; } } + public uint DivTime(int id) { return controlCom.DivTime(id); } + public float TTime { get { return controlCom.TTime; } } + public float ImpulseTime(int wmNr1) { return controlCom.ImpulseTime(wmNr1); } + public uint FmState { get { return controlCom.FmState; } } + public uint BeginState(int wmNr0) { return controlCom.BeginState(wmNr0); } + public double ReferenceFlow { get { return controlCom.ReferenceFlow; } } + public float RValvePosition(int rvNr1) { return controlCom.RValvePosition(rvNr1); } + public float DivSamples(int time, int divIx0) { return controlCom.DivSamples(time, divIx0); } /// Time unit is 2 ms + public int ScopeSamples(int i, int j, int k) { return controlCom.ScopeSamples(i, j, k); } + public ulong DigitalInputs { get { return controlCom.DigitalInputs; } } + public float AnalogInput(int adcNr0) { return controlCom.AnalogInput(adcNr0); } + public uint AnalogInputRaw(int adcNr0, int bank) { return controlCom.AnalogInputRaw(adcNr0, bank); } /// adcNr0: 0=RV1, 1=RV2,... bank: 0=RV, 1=Temp + public float ReferenceVolume { get { return controlCom.TotalRefVolume; } } + public float VyslExt(int wmNr0, int what) { return controlCom.VyslExt(wmNr0, what); } + public uint[] CyclePar { get { return controlCom.CyclePar; } set { controlCom.CyclePar = value; } } + public uint[] WMeterCont { get { return controlCom.WMeterCont; } } + public bool ManualUIAllowed { get { return controlCom.ManualUIAllowed; } set { controlCom.ManualUIAllowed = value; } } + public float ValveOpenCloseTime { get { return controlCom.ValveOpenCloseTime; } } + + /// Extracted from the StatusP in RunDeviceBefore + public bool EmergencyStop { get { return emergencyStop; } } + bool emergencyStop; + bool previousEmergencyStop; + + + + private int flowmeterNr4DiverterTest; + private bool scheduleDiverterToTank; + private bool scheduleDiverterToSink; + private bool scheduleReadDiverterTransition; + private bool pumpPowerChanged; + /// + public void DiverterToTank(int flowmeterNr) + { + if (!scheduleDiverterToSink && !scheduleReadDiverterTransition && !emergencyStop) + { + flowmeterNr4DiverterTest = flowmeterNr; + scheduleDiverterToTank = true; + } + } + /// + public void DiverterToSink(int flowmeterNr) + { + if (!scheduleDiverterToTank && !scheduleReadDiverterTransition && !emergencyStop) + { + flowmeterNr4DiverterTest = flowmeterNr; + scheduleDiverterToSink = true; + } + } + /// + public void ReadDiverterTransition(int flowmeterNr) + { + if (!scheduleDiverterToTank && !scheduleDiverterToSink && !emergencyStop) + { + flowmeterNr4DiverterTest = flowmeterNr; + scheduleReadDiverterTransition = true; + } + } + + + + /// State of valves sent out - buffered by the last SendCommand() + public UInt128 Route { get { return benchModelRoute; } } + + UInt128 valvesToInvert; /// Route = valesToInvert ^ RequiredRouteWithoutInvertedVlaves + readonly UInt128 routeMask; /// This mask masks out virtual valves, routeMask is set in the constructor + + /// + /// Initialization data updated by constructors of children components + /// and sent to 'controlCom2panel' by SendCalibData() method. + /// + public float[,] TempCalibData = new float[8, 5]; + public uint[] DiverterEdge; /// Created and initialized in this.Initialize() + + // Array length is the reference flowmeters count plus one +#if DN100 || FUZHOU150 || FUZHOU300 || PT200IL || PUCHONG_PT200 || SLM_150 || SENTEC || CEVAK_200 + public uint[,] RegValveCalib = new uint[8,2] {{100,500},{100,500},{100,500},{100,500},{100,500},{100,500},{100,500},{100,500}}; + public byte[] MeretRS485Address = new byte[4]; + public float[] EtCalib = new float[6] { 1, 1, 1, 1, 1, 1 }; +#elif GENESIS || BERLIN || PETERSBURG_200 || RUM_MOB + public uint[,] RegValveCalib = new uint[16, 2] { {100,500}, {100,500}, {100,500}, {100,500}, + {100,500}, {100,500}, {100,500}, {100,500}, + {100,500}, {100,500}, {100,500}, {100,500}, + {100,500}, {100,500}, {100,500}, {100,500} }; + public byte[] MeretRS485Address = new byte[4]; + public float[] EtCalib = new float[7] { 1, 1, 1, 1, 1, 1, 1 }; +#elif MUNICH || TORINO50 || BADGER_MALA_TRAT || BADGER_STREDNA_TRAT || TORUN_PT50_2015 || CEVAK_PT40_272 || TURA_IPERL || TURA_SPECIAL || MURES_PT40 || FUZHOU_40 || SLM_50 || PETERSBURG_50 || KEMPNO_50 || BAHRAIN_50 || KRAKOW_50 || JUZNA_AFRIKA_50 || ZAMBIA || FUZHOU100 || DUBAJ_50 + public uint[,] RegValveCalib = new uint[8,2] {{100,500},{100,500},{100,500},{100,500},{100,500},{100,500},{100,500},{100,500}}; + public byte[] MeretRS485Address = new byte[4]; + public float[] EtCalib = new float[5] { 1, 1, 1, 1, 1 }; +#elif SLM_END || WARSAW_END + public uint[,] RegValveCalib = new uint[8,2] {{100,500},{100,500},{100,500},{100,500},{100,500},{100,500},{100,500},{100,500}}; + public byte[] MeretRS485Address = new byte[4]; + public float[] EtCalib = new float[5] { 1, 1, 1, 1, 1 }; +#elif MALTA_WSD25 + public uint[,] RegValveCalib = new uint[8,2] {{100,500},{100,500},{100,500},{100,500},{100,500},{100,500},{100,500},{100,500}}; + public byte[] MeretRS485Address = new byte[12]; + public float[] EtCalib = new float[9] { 1, 1, 1, 1, 1, 1, 1, 1, 1 }; +#elif BADGER_VELKA_TRAT + public uint[,] RegValveCalib = new uint[8,2] {{100,500},{100,500},{100,500},{100,500},{100,500},{100,500},{100,500},{100,500}}; + public byte[] MeretRS485Address = new byte[4]; + public float[] EtCalib = new float[8] { 1, 1, 1, 1, 1, 1, 1, 1 }; +#endif + + public uint[] BalanceRange = new uint[2]; + + + /// + /// Private values sent by the last SendCommand() + /// + bool sendCommandFlag; + Command cmd; + int refNr; + UInt128 benchModelRoute; + int totalRefPulses; + int massRefPulses; + TestMethods testMethods; + float filterConstant; + float[] FMFreq; + int regConst; + int shortImp; + StopDevs stopDevs; + + /// + /// Sets the power of the selected pump + /// + /// Pump index 0 .. 5, invalid pump index sets all pumps to 0% + /// Power (0.0f .. 100.0f) + public void SetFMFreq(int index, float power) + { +#if DN100 || MUNICH || FUZHOU150 + if ((FMFreq == null) || (FMFreq.Length != 2)) + { + FMFreq = new float[2]; + pumpPowerChanged = true; /// Forces sending a command using Command.None + } +#elif SLM_END || WARSAW_END + if ((FMFreq == null) || (FMFreq.Length != 4)) + { + FMFreq = new float[4]; + pumpPowerChanged = true; /// Forces sending a command using Command.None + } +#else /// all newer benches + if ((FMFreq == null) || (FMFreq.Length != 6)) + { + FMFreq = new float[6]; + pumpPowerChanged = true; /// Forces sending a command using Command.None + } +#endif + + if (index >= 0 && index < FMFreq.Length && FMFreq[index] != power) + { + FMFreq[index] = power; + + pumpPowerChanged = true; /// Forces sending a command using Command.None + + log.DebugFormat("FMFreq=[{0}{1}{2}{3}{4}{5}]", + FMFreq[0].ToString(), + (FMFreq.Length > 1) ? ("," + FMFreq[1].ToString()) : "", + (FMFreq.Length > 2) ? ("," + FMFreq[2].ToString()) : "", + (FMFreq.Length > 3) ? ("," + FMFreq[3].ToString()) : "", + (FMFreq.Length > 4) ? ("," + FMFreq[4].ToString()) : "", + (FMFreq.Length > 5) ? ("," + FMFreq[5].ToString()) : ""); + } + } + + public void UpdateWeights() + { + for (int i = 0; i < MettlerToledo.Standard.BalanceDev.BalancesCount; i++) + { + controlCom.SetWeight(i, MettlerToledo.Standard.BalanceDev.Masses[i]); + } + + for (int i = 0; i < MettlerToledo.Multi.BalanceDev.BalancesCount; i++) + { + controlCom.SetWeight(i, MettlerToledo.Multi.BalanceDev.Masses[i]); + } + } + + public void SetReservoirTemp(int nr, float temp) + { + controlCom.SetReservoirTemp(nr, temp); + } + + public ControlBoardDev() + { + } + + /// + /// Constructor + /// + public ControlBoardDev(Generic.IComponentCfg cfg) + : base(cfg) + { + controlBoardCfg = cfg as ControlBoardCfg; + +#if DN100 || MUNICH || FUZHOU150 + FMFreq = new float[2] { 0, 0 }; /// Nr. of pumps: Fuzhou150=2, Fuzhou300=6, newer=6 +#elif SLM_END || WARSAW_END + FMFreq = new float[4] { 0, 0, 0, 0 }; +#else /// all newer benches + FMFreq = new float[6] { 0, 0, 0, 0, 0, 0 }; +#endif + emergencyStop = false; + previousEmergencyStop = false; + + routeMask = 0; + for (int i = 0; i < 128; i++) + { + if (i < controlBoardCfg.VirtualValvesRangeLo || i > controlBoardCfg.VirtualValvesRangeHi) + { + routeMask = routeMask | ((UInt128)1 << i); + } + } + + log.Debug(this.ToString()); + } + + /// + /// Specific pre-initialization for control board only + /// + /// + public void InitializeComponent( +#if DN100 + ControlCom2VB.ControlCom2panel ctrlBrdComponent, +#elif MUNICH || FUZHOU150 + ControlComponent3Munich.UserControl1 ctrlBrdComponent, +#elif FUZHOU300 + ControlComponent3F300.UserControl1 ctrlBrdComponent, +#elif PT200IL || PUCHONG_PT200 || GENESIS || BERLIN || SLM_150 || PETERSBURG_200 || CEVAK_200 + ControlComponent_Izrael2014.UserControl1 ctrlBrdComponent, +#else /// all newer benches + ControlComponent_Torino2015.UserControl1 ctrlBrdComponent, +#endif + UInt128 valvesToInvert, + double[] tankCapacities) + { + this.valvesToInvert = valvesToInvert; + this.benchModelRoute = valvesToInvert; + + if (controlBoardCfg.DebugLevel == DebugMode.Simulate) + { + controlCom = new ControlComSim(); + } + else + { + /// Default number of scales (and BalanceRange length) is 2. + /// If there are more scales, BalanceRange length is larger. + int scalesCnt = Math.Max(2, tankCapacities.Length); + BalanceRange = new uint[scalesCnt]; + for (int i = 0; i < scalesCnt; i++) + { + BalanceRange[i] = (uint)((i < tankCapacities.Length) ? tankCapacities[i] : 0); + } + controlCom = new ControlComWrap(ctrlBrdComponent); + } + } + + /// Initialize this device + public void Initialize() + { + int divertersCount = BenchControl.Elde.Diverter.Diverter.DivertersCount; + + DiverterEdge = new uint[divertersCount]; + for (int i = 0; i < divertersCount; i++) + { + DiverterEdge[i] = (uint)BenchControl.Elde.Diverter.Diverter.Diverters[i].ThresholdGate; + controlCom.SetDivLimit(i, (uint)BenchControl.Elde.Diverter.Diverter.Diverters[i].ThresholdLo, + (uint)BenchControl.Elde.Diverter.Diverter.Diverters[i].ThresholdHi); + } + + controlCom.SendCalibData(RegValveCalib, + MeretRS485Address, + controlBoardCfg.ComPortNr, + TempCalibData, + EtCalib, + DiverterEdge, + BalanceRange); + + log.FatalFormat("Successfully initialized device {0}", ToString()); + } + + /// Run this device + public void RunDeviceBefore() + { + if (DebugLevel == DebugMode.Simulate) return; + + controlCom.RunDeviceBefore(); + + previousEmergencyStop = emergencyStop; + emergencyStop = (controlCom.StatusP & StatusP.EmgcyStopActive) != 0; + + if (emergencyStop && !previousEmergencyStop) + { + Program.MainWnd.Invoke(new ShowEmergencyStopFormDlgt(ShowEmergencyStopForm)); + + /// Stop the cycle - Press 'STOP' button in the BenchControlPanel + TBF.UiBridge.Bridge.Ui2Bench(TBF.UiBridge.UI2BenchCmd.Stop); + } + else if (!emergencyStop && previousEmergencyStop) + { + UiBridge.Bridge.OnEmergencyStopChanged(this,UiBridge.EmergencyStopEventArgs.State.CloseForm); + } + + if (emergencyStop) + { + /// SendCommand() arguments to clear the emergency stop state + sendCommandFlag = true; + this.refNr = 0; + this.totalRefPulses = 0; + this.massRefPulses = 0; + this.cmd = Command.Stop; + this.testMethods = 0; + this.stopDevs = StopDevs.All; + } + else if (scheduleDiverterToTank) + { + /// Reset all SendCommand() arguments + sendCommandFlag = true; + this.cmd = Command.Start; + this.refNr = flowmeterNr4DiverterTest; + this.totalRefPulses = int.MaxValue; + this.massRefPulses = int.MaxValue; + this.testMethods = TestMethods.Diverter; + this.stopDevs = 0; + scheduleDiverterToTank = false; + } + else if (scheduleDiverterToSink) + { + /// Reset all SendCommand() arguments + sendCommandFlag = true; + this.cmd = Command.Stop; + this.refNr = flowmeterNr4DiverterTest; + this.totalRefPulses = 0; + this.massRefPulses = 0; + this.testMethods = TestMethods.Diverter; + this.stopDevs = StopDevs.Diverter; + scheduleDiverterToSink = false; + } + else if (scheduleReadDiverterTransition) + { + /// Reset all SendCommand() arguments + sendCommandFlag = true; + this.cmd = Command.ReadDivTransition; + this.refNr = flowmeterNr4DiverterTest; + this.totalRefPulses = 0; + this.massRefPulses = 0; + this.testMethods = TestMethods.Diverter; + this.stopDevs = 0; + scheduleReadDiverterTransition = false; + } + else if (pumpPowerChanged) + { + /// Reset all SendCommand() arguments + sendCommandFlag = true; + this.cmd = Command.None; + pumpPowerChanged = false; + } + else + { + /// Reset all SendCommand() arguments + sendCommandFlag = false; + this.cmd = Command.None; + this.refNr = 0; + this.totalRefPulses = 0; + this.massRefPulses = 0; + this.testMethods = 0; + this.stopDevs = 0; + } + this.filterConstant = 0; + this.regConst = 0; + this.shortImp = 0; + } + + /// Run this device + public void RunDeviceAfter() + { + if (DebugLevel == DebugMode.Simulate) return; + + uint filter = Convert.ToUInt32(filterConstant); + /// + if (sendCommandFlag) + { + controlCom.SendCommand(cmd, refNr, (benchModelRoute & routeMask), + totalRefPulses, massRefPulses, testMethods, + new uint[] { filter, filter, filter, filter, filter, filter, filter, filter }, + FMFreq, regConst, shortImp, stopDevs); + } + + controlCom.RunDeviceAfter(); + } + + /// Stop this device + public void StopDevice() { } + public void StopDevice2() { } + + + delegate void ShowEmergencyStopFormDlgt(); + /// + void ShowEmergencyStopForm() + { + (new TBF.Forms.EmergencyStopForm()).Show(); + } + + + /// + /// Sends a command to the control board. + /// + /// See ControlBoard.Command enum + /// Number of the etalon/reference (1..5) + /// Route: 64-bit installation specific number + /// kolko impulzov ma trvat skuska + /// See ControlBoard.TestMethods enum + /// 0 = No filtering (0..255) + /// Coefficient used to control reg. valves (1..100) + /// 0 = default value, 1 = spec. processing of very short pulses + /// What to stop + public void SendCommand(Command cmd, int refFlowmtrNr, UInt128 route, + int totalRefPulses, int massRefPulses, TestMethods testMethods, + float filterConstant, int regConst, int shortImp, StopDevs stopDevs) + { + this.cmd = cmd; + this.refNr = refFlowmtrNr; + this.benchModelRoute = route; + this.totalRefPulses = totalRefPulses; + this.massRefPulses = massRefPulses; + this.testMethods = testMethods; + this.filterConstant = filterConstant; + this.regConst = regConst; + this.shortImp = shortImp; + this.stopDevs = stopDevs; + + sendCommandFlag = true; + } + + /// + /// Set valves to new positions. + /// + /// 'ulong' with bits of valves to open set to '1' + /// 'ulong' with bits of valves to close set to '1' + /// 'ulong' with bits of valves that have changed set to '1' + public UInt128 SetValves(UInt128 valvesToOpen, UInt128 valvesToClose, IList extendedValves) + { + UInt128 oldRoute = benchModelRoute; + benchModelRoute = (((benchModelRoute ^ valvesToInvert) | valvesToOpen) & (~valvesToClose)) ^ valvesToInvert; + foreach (var extV in extendedValves) extV.UpdateRoute(ref benchModelRoute); + log.DebugFormat("SetValves(x,x), new route = {0}", Utils.RouteToStr(benchModelRoute)); + sendCommandFlag = true; + return oldRoute ^ benchModelRoute; + } + + /// + /// Set Route to value returned by RRoute. Take virtual valves into account. + /// + /// 'ulong' with bits of valves that have changed set to '1' + public UInt128 SyncRoute() + { + UInt128 oldRoute = benchModelRoute; + benchModelRoute = (RRoute & routeMask) | (benchModelRoute & (~routeMask)); + log.DebugFormat("SyncRoute(), new route = {0}", Utils.RouteToStr(benchModelRoute)); + return oldRoute ^ benchModelRoute; + } + + /// + /// Regulation valves control. + /// + /// Regulation valve nr. (1..5) + /// Valve regulation mode, see the enum + /// Target position or target frequency or pulse duration + /// Stabilization time when setting the flow: 0=200ms, step 50ms, max. 1.5 sec. + public void ValveMove(int valveNo, RegulValveMode valveMode, float[] valveValue, int stableTime) + { + controlCom.ValveMove(valveNo, valveMode, valveValue, stableTime); + } + + + /// + /// Open one valve and/or close one valve. + /// Events: ValvesSet + /// + /// Valve to be opened + /// Valve to be closed + /// Created operation + public IOperation SetValvesOp(IValve valveOpen, IValve valveClose) + { + return new SetValvesOp(this, valveOpen, valveClose); + } + + /// + /// Open and/or close multiple valves. + /// Events: ValvesSet + /// + /// A list of valves to be opened + /// A list of valves to be closed + /// Created operation + public IOperation SetValvesOp(IList valvesOpen, IList valvesClose) + { + return new SetValvesOp(this, valvesOpen, valvesClose); + } + + /// + /// Starts the measurement. + /// Events: MeasurementStarted + /// + /// Flow meter + /// An array of register readers + /// Number of reference pulses to complete the test + /// Created operation + public IOperation StartMeasurementOp(OutputPath outputPath, TestMethods method, + float requiredFlowLo, float requiredFlowHi, + int refPulses, float filterConstant) + { + if (controlBoardCfg.DebugLevel == DebugMode.Simulate) + { + return new Operations.ReturnGivenEventOp(Event.MeasurementStarted); + } + else + { + return new StartMeasurementOp(this, outputPath, method, requiredFlowLo, requiredFlowHi, + refPulses, filterConstant); + } + } + + /// + /// Starts the measurement. + /// Events: MeasurementStarted + /// + /// Flow meter + /// An array of register readers + /// Number of reference pulses to complete the test + /// Created operation + public IOperation StartProlongedMeasurementOp(OutputPath outputPath, TestMethods method, + float requiredFlowLo, float requiredFlowHi, + int totalRefPulses, int massRefPulses, float filterConstant) + { + if (controlBoardCfg.DebugLevel == DebugMode.Simulate) + { + return new Operations.ReturnGivenEventOp(Event.MeasurementStarted); + } + else + { + return new StartMeasurementOp(this, outputPath, method, requiredFlowLo, requiredFlowHi, + totalRefPulses, massRefPulses, filterConstant); + } + } + + /// + /// Read diverter samples from the control board and calculated the transition time. + /// Events: Event.None + /// + /// Diverter + /// State machine ticks from test start/end when diverter read command is issued (obsolete) + /// State machine ticks from test start/end when diverter samples are read + /// FloatBox for the resulting transition time in s + /// Statistics for plotting diverter transitions + /// Batch number + /// Test name (without repetitions) + /// Repetition number + /// Created operation + public IOperation ReadDiverterTransitionOp(IDiverter div, int runsCountWhenSendingCmd, int runsCountWhenReadingDiv, TBF.Boxes.FloatBox transitionTimeSec, + Sequences.Statistics plotter, int batchNr, string testName, int repetition) + { + if (controlBoardCfg.DebugLevel == DebugMode.Simulate) + { + return new Operations.ReturnGivenEventOp(Event.None); + } + else + { + return new ReadDiverterTransitionOp(this, div, runsCountWhenSendingCmd, runsCountWhenReadingDiv, transitionTimeSec, plotter, batchNr, testName, repetition); + } + } + + /// + /// Queries th econtrol board whether the measurement was completed. + /// Events: MeasurementCompleted or None + /// + /// Created operation + public IOperation QueryMeasurementEndOp() + { + return new QueryMeasurementEndOp(this); + } + + /// + /// Stop the previous control board operation (diverter, gate, etc.) + /// Events: PreviousStopped + /// + /// Created operation + public IOperation StopPreviousOp() + { + return new StopPreviousOp(this); + } + + /// + /// Sends commands to the control board. + /// Events: Event.None, Event.CommandCompleted + /// + /// Command sent to CB when this operation starts + /// Command sent to CB when this operation stops + /// Test method parameter + /// Created operation + public IOperation ExecuteCommandOp(Command commandOnStartOp, Command commandOnStopOp, TestMethods testMethod) + { + return new ExecuteCommandOp(this, commandOnStartOp, commandOnStopOp, testMethod); + } + + /// + /// Updates the tank drawing and weight value in Elde software component. + /// + /// Current mass in [kg] or approx. volume in [l] + /// Created operation + public IOperation UpdateTankWeightOp() + { + return new UpdateTankWeightOp(this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ControlBoardFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ControlBoardFactory.cs new file mode 100644 index 00000000..f43213c8 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ControlBoardFactory.cs @@ -0,0 +1,36 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde +{ + public class ControlBoardFactory : IComponentFactory + { + public string ClassName { get { return "ControlBoard"; } } + + /// Max. number of components of this class in the system + public int MaxCount { get { return 1; } } + + public IComponent DummyComponent() { return new ControlBoardDev(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new ControlBoardDev(cfg); } + + public IComponentCfg DefaultConfig() { return new ControlBoardCfg(this); } + + public IComponentCfgCtrl CreateCfgCtrl() { return new ControlBoardCfgCtrl(); } + + public IComponent ComponentFromCmpntCfg(IComponentCfg config, IList components) + { + return new ControlBoardDev((ControlBoardCfg)config); + } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(Elde.ControlBoardCfg.Serializer, component, this); + } + + public void ResetStaticProperties() { ControlBoardDev.ResetStaticProperties(); } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ControlComSim.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ControlComSim.cs new file mode 100644 index 00000000..d7985a34 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ControlComSim.cs @@ -0,0 +1,386 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Text; +using Dirichlet.Numerics; +using log4net; + +namespace TBF.BenchControl.Elde +{ + public class ControlComSim : IControlCom + { + private static readonly ILog log = LogManager.GetLogger(typeof(ControlComSim)); + public override string ToString() { return string.Format("ControlComSim"); } + + StatusP statusP; + public StatusP StatusP { get { return statusP; } } + + float referenceFreq = 650.0f; + public float ReferenceFreq { get { return referenceFreq; } } + + int[] etPulses = new int[Config.Data.WMsCount + 1]; + public int EtPulses(int wmNr1) + { + return etPulses[wmNr1]; + } + + public int EtPulsesK { get { return 1; } } + + float[] errFactor = new float[Config.Data.WMsCount + 1]; /// Internal + float[] wMeterPulsesF = new float[Config.Data.WMsCount + 1]; /// Internal + + UInt16[] wMeterPulses = new UInt16[Config.Data.WMsCount + 1]; /// Rounded from wMeterPulsesF + public UInt16 WMeterPulses(int wmNr1) + { + return wMeterPulses[wmNr1]; + } + + int[] wMeterReference = new int[Config.Data.WMsCount + 1]; + public int WMeterReference(int wmNr1) + { + return wMeterReference[wmNr1]; + } + + public uint RegulValveDAC { get { return 0; } } + + public float Pressure(int prsNr0) { return 0; } + public float Temperature(int tmpNr0) { return (float)(20 + tmpNr0); } + public RegulValveState RegulValveState(int rvNr1) { return 0; } + + public UInt128 RRoute { get { return simRoute; } } + + public uint DivTime(int id) { return 0; } + public void SetDivLimit(int divNo, uint limLoPct, uint limHiPct) { } + + float tTime = 1; + public float TTime { get { return tTime; } } + public float ImpulseTime(int wmNr1) { return tTime; } + + public uint FmState { get { return 0; } } + public uint BeginState(int wmNr0) { return 0; } + + float referenceFlow; + public float ReferenceFlow { get { return referenceFlow; } } + + public float RValvePosition(int rvNr1) { return 0; } + public float DivSamples(int ms, int divIx0) { return 0; } + public int ScopeSamples(int i, int j, int k) { return 0; } + public ulong DigitalInputs { get { return 0; } } + public float AnalogInput(int adcNr0) { return 0; } + public uint AnalogInputRaw(int adcNr0, int bank) { return 0; } /// bank0=RV, bank1=Temp + public float TotalRefVolume { get { return 0; } } + public float VyslExt(int wmNr0, int what) { return 0; } + public void SetWeight(int pos, double mass) { return; } /// not available in sim. mode + + public uint[] CyclePar { get { return cyclePar; } set { cyclePar = value; } } /// dummy + public uint[] WMeterCont { get { return wMeterCont; } } /// dummy + + public float ValveOpenCloseTime { get { return 0.001f; } } + /// + public bool ManualUIAllowed + { + get { return manualUIAllowed; } + set { manualUIAllowed = value; } + } + bool manualUIAllowed = true; + + public void SetReservoirTemp(int nr, float temp) { } + + + /// + /// Private initialization data updated by contructors of children components + /// and sent to 'controlCom2panel' by SendCalibData() method. + /// + uint[,] regValveCalib; + byte[] meretRS485Address; + float[,] tempCalibData; + float[] etCalib; + uint[] diverterEdge; + uint[] balanceRange; + + + uint[] cyclePar; + uint[] wMeterCont; + + /// + /// Private values set by SendCommand() + /// + Command cmd; + int refFlowmtrNr; + UInt128 simRoute; + int totalRefPulses; + int massRefPulses; + TestMethods testMethods; + uint[] filterConstants; + float[] FMFreq; + int regConst; + int shortImp; + StopDevs stopDevs; + + /// + /// Private values set by ValveMove() + /// + int regulValveNo; + RegulValveMode regulValveMode; + float[] regulValveValue; + + Random rand; + + /// + /// Constructor + /// + public ControlComSim() + { + rand = new Random(); + cyclePar = new uint[163]; + wMeterCont = new uint[3] { 1, 2, 3 }; + } + + /// + /// Sends calibration and configuration data to the control board. + /// + /// Regulating valves calib.coefs, ix1 = valve nr. (1..5), ix2 = coef.nr. (0..1), values typ. c0 = 0, c1 = 0.2 + /// Meret address, index = 0..1, value typ. 99 and 100 + /// COM port number of the control board (typ. 1) + /// Temp.calc.coefs, ix1 = temp.sens.nr. (0..7 ???), ix2 = coef.nr + /// Etalon nominal values + /// Percentages for switching of diverters, ix = diverter nr.(0,1), typ.value 50 (%) + public void SendCalibData(uint[,] rvCalib, byte[] meretA, int usedCom, float[,] tempCalib, float[] etCalib, uint[] divEdge, uint[] balanceRange) + { + log.Info("SendCalibData(...)"); + + this.regValveCalib = rvCalib; + this.meretRS485Address = meretA; + this.tempCalibData = tempCalib; + this.etCalib = etCalib; + this.diverterEdge = divEdge; + this.balanceRange = balanceRange; + } + + /// + /// Sends a command to the control board. + /// + /// See ControlBoard.Command enum + /// Number of the etalon/reference (1..5) + /// Route: 64-bit installation specific number + /// kolko impulzov ma trvat skuska + /// See ControlBoard.TestMethods enum + /// 0 = No filtering (0..255) + /// Freq.inverter control (not applicable in DT100, Munich) + /// Coefficient used to control reg. valves (1..100) + /// 0 = default value, 1 = spec. processing of very short pulses + /// What to stop + public void SendCommand(Command cmd, int refFlowmtrNr, UInt128 route, + int totalRefPulses, int massRefPulses, TestMethods testMethods, + uint[] filterConstants, float[] fmFreq, int regConst, int shortImp, StopDevs stopDevs) + { + log.InfoFormat("SendCommand(Cmd={0},Ref#={1},Route={2} {3} {4} {5},TotalPls={6},MassPls={7},TstM={8},filt={9},FM=[{10}{11}{12}{13}{14}{15}],Reg={16},ShrtImp={17},Stop={18})", + cmd, refFlowmtrNr, /// 0, 1 + ((route >> 48) & 0xFFFF).ToString("X4"), /// 2 + ((route >> 32) & 0xFFFF).ToString("X4"), /// 3 + ((route >> 16) & 0xFFFF).ToString("X4"), /// 4 + (route & 0xFFFF).ToString("X4"), /// 5 + totalRefPulses, massRefPulses, testMethods, filterConstants, /// 6, 7, 8, 9 + fmFreq[0].ToString(), /// 10 + (fmFreq.Length > 1) ? ("," + fmFreq[1].ToString()) : "", /// 11 + (fmFreq.Length > 2) ? ("," + fmFreq[2].ToString()) : "", /// 12 + (fmFreq.Length > 3) ? ("," + fmFreq[3].ToString()) : "", /// 13 + (fmFreq.Length > 4) ? ("," + fmFreq[4].ToString()) : "", /// 14 + (fmFreq.Length > 5) ? ("," + fmFreq[5].ToString()) : "", /// 15 + regConst, shortImp, stopDevs); /// 16, 17, 18 + /// + /// Simulation + /// + Command lastCmd = this.cmd; + this.cmd = cmd; + this.refFlowmtrNr = refFlowmtrNr; + +#if FUZHOU300 + /// + /// The following code deals with the situation that all FM controlled pums share bit #39. + /// In settings the bits of pumps should be sent as follows: P1=50, P2=51, P3=52, P4=53, P5=54 and P7=55 + /// (in FUZHOU300 the FM pump bit should be set set to value FMIndex+50). + /// + bool bit39 = (route & 0x00FC000000000000) != 0; /// true if any of bits 50 through 55 is set + route = route & 0xFF03FFFFFFFFFFFF; + if (bit39) route = route | 0x0000008000000000; + log.DebugFormat("SendCommand route = {0}", Utils.RouteToStr(route)); +#endif + TestBenchSim.SimRoute = this.simRoute = route; + this.totalRefPulses = totalRefPulses; + this.massRefPulses = massRefPulses; + this.testMethods = testMethods; + this.filterConstants = filterConstants; + this.FMFreq = fmFreq; + this.regConst = regConst; + this.shortImp = shortImp; + this.stopDevs = stopDevs; + +#pragma warning disable + statusP = (StatusP)(((ulong)statusP & (ulong)0xFFFFFFFFFFFFFFF8L) | (ulong)refFlowmtrNr); +#pragma warning restore + + if (cmd == Command.Start && lastCmd != Command.Start ) + { + statusP |= StatusP.TestInProgress; + /// + /// Clear all counters + /// + if (etPulses != null) { for (int i = 0; i < etPulses.Length; i++) etPulses[i] = 0; } + if (wMeterPulses != null) { for (int i = 0; i < wMeterPulses.Length; i++) wMeterPulses[i] = 0; } + if (wMeterPulsesF != null) { for (int i = 0; i < wMeterPulsesF.Length; i++) wMeterPulsesF[i] = 0; } + if (wMeterReference != null) { for (int i = 0; i < wMeterReference.Length; i++) wMeterReference[i] = 0; } + if (errFactor != null) + { + for (int i = 0; i < errFactor.Length; i++) errFactor[i] = ((float)rand.Next(100) + 950.0f) / 1000.0f; + } + tTime = 0; + } + else if (cmd == Command.Stop) + { + statusP = 0; + //statusP &= ~StatusP.Running; + } + } + + /// + /// Control of regulating valves. + /// + /// Regulating valve nr. (1..5) + /// ??? + /// ??? + /// Stabilization time when setting the flow: 0=200ms, step 50ms, max. 1.5 sec. + public void ValveMove(int regulValveNo, RegulValveMode regulValveMode, float[] regulValveValue, int stableTime) + { + log.InfoFormat("ValveMove({0}, {1}, [{2},{3}], {4})", regulValveNo, regulValveMode, regulValveValue[0], regulValveValue[1], stableTime); + + this.regulValveNo = regulValveNo; + this.regulValveMode = regulValveMode; + this.regulValveValue = regulValveValue; + } + + public void RunDeviceBefore() + { + log.DebugFormat("RunDeviceBefore() ... regV#={0}, flowM#{1}, statusP={2}", regulValveNo, refFlowmtrNr, statusP.ToString("X")); + TestBenchSim.RunDevice(regulValveNo, refFlowmtrNr, statusP); + + log.DebugFormat("refFreq={0}", referenceFreq); + + tTime += 1.0f; + + float Qnom = (regulValveNo > 0) ? etCalib[regulValveNo] : 0; + + switch (cmd) + { + case Command.None: + break; + + case Command.Start: + if ((testMethods & TestMethods.Diverter) == TestMethods.Diverter) + { + TestBenchSim.SetSimDiverter(true); + } + break; + + case Command.Stop: + if ((testMethods & TestMethods.Diverter) == TestMethods.Diverter) + { + TestBenchSim.SetSimDiverter(false); + } + break; + } + + switch (regulValveMode) + { + case RegulValveMode.TargetFrequency: + float targetFlow = ((regulValveValue[0] + regulValveValue[1]) / 2.0f) * (Qnom / 2000.0f); + TestBenchSim.UpdateSimFlow(targetFlow); + + //if (referenceFreq < valveValue[0]) referenceFreq += ((float)rand.Next(20) + 10.0f) / 2.0f; + //else if (referenceFreq > valveValue[1]) referenceFreq -= ((float)rand.Next(20) + 10.0f) / 2.0f; + //else referenceFreq += ((float)rand.Next(10) - 5.0f) / 2.0f; + referenceFreq = TestBenchSim.GetSimFlow() * 2000.0f / Qnom; + if (referenceFreq < 0) referenceFreq = 0; + if (referenceFreq > 2500) referenceFreq = 2500; + break; + + default: + break; + } + + referenceFlow = referenceFreq / 2000; + + bool stopTest = false; + if (cmd == Command.Start) + { + float pwFactor = 1.0f; + + /// Increment reference flow meters + for (int i = 0; i <= Config.Data.WMsCount; i++) + { + etPulses[i] += (int)referenceFreq; + if (etPulses[i] > totalRefPulses) + { + pwFactor = 1.0f - (float)(etPulses[i] - totalRefPulses) / referenceFreq; + etPulses[i] = totalRefPulses; + stopTest = true; + } + } + + /// Increment water meters + float flowLtrPerSec = TestBenchSim.GetSimFlow() / 1800.0f; + for (int i = 1; i <= Config.Data.WMsCount; i++) + { + float wmPulsesPerLiter = 0; + if ((BenchControl.Sequences.ProcessData.RegisterReaders[i - 1] != null) && + (BenchControl.Sequences.ProcessData.BatchRslts.WaterMeters.Length >= i) && + (BenchControl.Sequences.ProcessData.BatchRslts.WaterMeters[i - 1] != null)) + { + wmPulsesPerLiter = (float)BenchControl.Sequences.ProcessData.RegisterReaders[i-1].PulsesPerLtr; + } + wMeterPulsesF[i] += errFactor[i] * pwFactor * ((float)rand.Next(100) + 450.0f) * wmPulsesPerLiter * flowLtrPerSec; + wMeterPulses[i] = (UInt16)wMeterPulsesF[i]; + } + + if (etPulses[0] > totalRefPulses) + { + statusP |= StatusP.TestCompleted; + statusP &= ~StatusP.TestInProgress; + } + } + + if (stopTest) + { + TestBenchSim.SetSimDiverter(false); + statusP = (statusP | StatusP.TestCompleted); + statusP = (statusP & ~StatusP.TestInProgress); + } + } + + StatusP lastStatusP; + UInt128 lastRoute; + + public void RunDeviceAfter() + { + StatusP bufferedStatusP = StatusP; + if (lastStatusP != bufferedStatusP) + { + string statusPStr = ((ulong)bufferedStatusP).ToString("x16"); + log.InfoFormat("RunDeviceAfter() StatusP = {0}", statusPStr); + Program.MainWnd.UpdateStatusP(statusPStr); + lastStatusP = bufferedStatusP; + } + + UInt128 bufferedRoute = simRoute; + if (lastRoute != bufferedRoute) + { + string routeStr = bufferedRoute.ToString("x16"); + log.InfoFormat("RunDeviceAfter() Route = {0}", routeStr); + Program.MainWnd.UpdateRoute(routeStr); + lastRoute = bufferedRoute; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ControlComWrap.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ControlComWrap.cs new file mode 100644 index 00000000..c45d59e3 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ControlComWrap.cs @@ -0,0 +1,465 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using Dirichlet.Numerics; +using log4net; + +namespace TBF.BenchControl.Elde +{ + public class ControlComWrap : IControlCom + { + private static readonly ILog log = LogManager.GetLogger(typeof(ControlComWrap)); + /// Fatal: SendCalibData(), DoSendCalibData() + /// Info: SendCommand(), ValveMove(), StatusP + /// Debug: Weight[ix] + + /// + /// Properties + /// + public StatusP StatusP { get { return (StatusP)ctrlBrdComponent.StatusP; } } + +#if DN100 || MUNICH || FUZHOU150 + public float ReferenceFreq { get { return 1000.0f * ctrlBrdComponent.referenceFreq; } } /// In [Hz] 0..2500, nom.=2000 +#else /// all newer benches + /// + /// In case of I11, I12 + /// referenceFreq[0] = I11 + I12 + /// referenceFreq[1] = I11 + /// referenceFreq[2] = I12 + /// otherwise + /// referenceFreq[0] = I2 or I3 or I4 + /// + public float ReferenceFreq { get { return 1000.0f * ctrlBrdComponent.referenceFreq[0]; } } /// In [Hz] 0..2500, nom.=2000 +#endif + + public int EtPulses(int wmNr1) { return (int)ctrlBrdComponent.etPulses[wmNr1]; } + +#if GENESIS || BERLIN || SLM_150 || PETERSBURG_50 || PETERSBURG_200 || KEMPNO_50 || BAHRAIN_50 || RUM_MOB || KRAKOW_50 || JUZNA_AFRIKA_50 || ZAMBIA || SENTEC || FUZHOU100 || CEVAK_200 || DUBAJ_50 + public int EtPulsesK { get { return (int)ctrlBrdComponent.etPulsesK; } } +#else + public int EtPulsesK { get { return 1; } } +#endif + + public UInt16 WMeterPulses(int wmNr1) { return (UInt16)ctrlBrdComponent.wMeterPuls[wmNr1]; } + public int WMeterReference(int wmNr0) { return (int)ctrlBrdComponent.wMeterReference[wmNr0]; } + public uint RegulValveDAC { get { return ctrlBrdComponent.StavDA; } } + public float Pressure(int prsNr0) { return ctrlBrdComponent.pressure[prsNr0]; } + public float Temperature(int tmpNr0) { return ctrlBrdComponent.temperature[tmpNr0]; } + public RegulValveState RegulValveState(int rvNr1) { return (RegulValveState)ctrlBrdComponent.rValveStatus[rvNr1 - 1]; } +#if GENESIS || BERLIN || PETERSBURG_200 + public UInt128 RRoute { get { return ((UInt128)ctrlBrdComponent.rRouteH << 64) | (UInt128)ctrlBrdComponent.rRoute; } } +#else + public UInt128 RRoute { get { return ctrlBrdComponent.rRoute; } } +#endif + +#if GENESIS || KEMPNO_50 || KRAKOW_50 || BAHRAIN_50 || BADGER_STREDNA_TRAT || JUZNA_AFRIKA_50 || ZAMBIA || SENTEC || FUZHOU100 || DUBAJ_50 + public uint DivTime(int id) { return ctrlBrdComponent.divTime[id]; } + public void SetDivLimit(int divNo, uint limLoPct, uint limHiPct) + { + ctrlBrdComponent.DIVLimit[divNo, 0] = limLoPct; + ctrlBrdComponent.DIVLimit[divNo, 1] = limHiPct; + } +#else + public uint DivTime(int id) { return ctrlBrdComponent.divTime; } + public void SetDivLimit(int divNo, uint limLoPct, uint limHiPct) { } +#endif + + public float TTime { get { return ctrlBrdComponent.Ttime; } } +#if DN100 || MUNICH + public float ImpulseTime(int wmNr1) { return ctrlBrdComponent.Ttime; } +#else + public float ImpulseTime(int wmNr1) { return ctrlBrdComponent.ImpulseTime[wmNr1]; } +#endif + +#if DN100 || MUNICH || FUZHOU150 + public uint FmState { get { return ctrlBrdComponent.fMState; } } +#else //if everything newer + public uint FmState { get { return ctrlBrdComponent.fMState[0]; } } /// TODO: index +#endif + public uint BeginState(int wmNr0) { return ctrlBrdComponent.beginSt[wmNr0]; } + public float ReferenceFlow { get { return ctrlBrdComponent.referenceFlow; } } + public float RValvePosition(int rvNr1) + { + //return ctrlBrdComponent.RValvePosition[rvNr1 - 1]; + return ctrlBrdComponent.Analogy[rvNr1 - 1]; /// Fixes bug: RValvePosition returns 0 all the time + } + public float DivSamples(int time, int divIx0) + { +#if MUNICH + return ctrlBrdComponent.DIVSamples[time, 0]; +#else + return ctrlBrdComponent.DIVSamples[time, divIx0]; +#endif + } /// Time unit is 2 ms + public int ScopeSamples(int i, int j, int k) { return ctrlBrdComponent.ScopeSamples[i, j, k]; } + public ulong DigitalInputs { get { return (ulong)ctrlBrdComponent.Vstupy; } } + public float AnalogInput(int adcNr0) { return ctrlBrdComponent.Analogy[adcNr0]; } + public uint AnalogInputRaw(int adcNr0, int bank) { return ctrlBrdComponent.AnalogyRaw[adcNr0, bank]; } /// bank0=RV, bank1=Temp + +#if DN100 || MUNICH || BADGER_MALA_TRAT || BADGER_VELKA_TRAT || FUZHOU_40 || FUZHOU150 || FUZHOU300 || PT200IL || PUCHONG_PT200 || TORINO50 || TORUN_PT50_2015 || CEVAK_PT40_272 || MURES_PT40 + public float TotalRefVolume { get { return ctrlBrdComponent.ReferenceVolume; } } + public float MassRefVolume { get { return ctrlBrdComponent.ReferenceVolume; } } +#else /// all new test benches + public float TotalRefVolume { get { return ctrlBrdComponent.ReferenceVolume[0]; } } + public float MassRefVolume { get { return ctrlBrdComponent.ReferenceVolume[1]; } } +#endif + +#if SLM_END || WARSAW_END + public uint[] CyclePar { get { return ctrlBrdComponent.CyclePar; } set { ctrlBrdComponent.CyclePar = value; } } + public uint[] WMeterCont { get { return ctrlBrdComponent.wMeterCont; } } +#else + public uint[] CyclePar { get { return new uint[163]; } set { return; }} /// Dummy + public uint[] WMeterCont { get { return new uint[3]; } } /// Dummy +#endif + +#if KEMPNO_50 || KRAKOW_50 || JUZNA_AFRIKA_50 || ZAMBIA || FUZHOU100 + public float ValveOpenCloseTime { get { return ctrlBrdComponent.ValveMoveTime[0]; } } +#else + public float ValveOpenCloseTime { get { return 0.001f; } } +#endif + + public bool ManualUIAllowed + { + get { return ctrlBrdComponent.Dovolene; } + set { ctrlBrdComponent.Dovolene = value; } + } + + public float VyslExt(int wmNr0, int what) { return ctrlBrdComponent.VyslExt[wmNr0, what]; } + public void SetWeight(int pos, double mass) + { + ctrlBrdComponent.Weight[pos] = (float)mass; + log.DebugFormat("SetWeight(pos={0}, mass={1}", pos, mass); + } + + public void SetReservoirTemp(int nr, float temp) + { +#if GENESIS + if (nr > 0 && nr <= 3) ctrlBrdComponent.TankTemp[nr - 1] = temp; +#endif + } + + + /// + /// Reference to the control board component + /// +#if DN100 + private ControlCom2VB.ControlCom2panel ctrlBrdComponent; +#elif MUNICH || FUZHOU150 + private ControlComponent3Munich.UserControl1 ctrlBrdComponent; +#elif FUZHOU300 + private ControlComponent3F300.UserControl1 ctrlBrdComponent; +#elif PT200IL || PUCHONG_PT200 || GENESIS || BERLIN || SLM_150 || PETERSBURG_200 || CEVAK_200 + private ControlComponent_Izrael2014.UserControl1 ctrlBrdComponent; +#else /// newer benches + private ControlComponent_Torino2015.UserControl1 ctrlBrdComponent; +#endif + + /// + /// Constructor that initializes the control board component reference + /// + /// +#if DN100 + public ControlComWrap(ControlCom2VB.ControlCom2panel ctrlBrdComponent) +#elif MUNICH || FUZHOU150 + public ControlComWrap(ControlComponent3Munich.UserControl1 ctrlBrdComponent) +#elif FUZHOU300 + public ControlComWrap(ControlComponent3F300.UserControl1 ctrlBrdComponent) +#elif PT200IL || PUCHONG_PT200 || GENESIS || BERLIN || SLM_150 || PETERSBURG_200 || CEVAK_200 + public ControlComWrap(ControlComponent_Izrael2014.UserControl1 ctrlBrdComponent) +#else /// all newer benches + public ControlComWrap(ControlComponent_Torino2015.UserControl1 ctrlBrdComponent) +#endif + { + this.ctrlBrdComponent = ctrlBrdComponent; + } + + + /// + /// Sends calibration and configuration data to the control board. + /// + /// Regulating valves calib.coefs, ix1 = valve nr. (1..5), ix2 = coef.nr. (0..1), values typ. c0 = 0, c1 = 0.2 + /// Meret address, index = 0..1, value typ. 99 and 100 + /// COM port number of the control board (typ. 1) + /// Temp.calc.coefs, ix1 = temp.sens.nr. (0..7 ???), ix2 = coef.nr + /// Etalon nominal values + /// Percentages for switching of diverters, ix = diverter nr.(0,1), typ.value 50 (%) + /// Balance range = volume of the tanks on the balaces (ix=0,1) + public void SendCalibData(uint[,] rvCalib, byte[] meretA, int usedCom, float[,] tempCalib, + float[] etCalib, uint[] divEdge, uint[] balanceRange) + { + if (Program.MainWnd.InvokeRequired) + { + /// When SendCalibData(...) called from the worker thread + object[] args = new object[] { rvCalib, meretA, usedCom, tempCalib, etCalib, divEdge, balanceRange }; + Program.MainWnd.Invoke((SendCalibDataDlgt)DoSendCalibData, args); /// Invoke required as component was created in UI thread + } + else + { + /// When SendCalibData(...) called from the UI thread + DoSendCalibData(rvCalib, meretA, usedCom, tempCalib, etCalib, divEdge, balanceRange); + } + } + /// + delegate void SendCalibDataDlgt(uint[,] rvCalib, byte[] meretA, int usedCom, float[,] tempCalib, + float[] etCalib, uint[] divEdge, uint[] balanceRange); + /// + private void DoSendCalibData(uint[,] rvCalib, byte[] meretA, int usedCom, float[,] tempCalib, + float[] etCalib, uint[] divEdge, uint[] balanceRange) + { + //TBF.UiBridge.Bridge.OnLog(this, string.Format("{0} SendCalibData(COM{1}) rvCalib[0,0]={2} rvCalib[0,1]={3} rvCalib[1,0]={4} rvCalib[1,1]={5}\r\n", + // DateTime.Now.ToLongTimeString(), usedCom, + // rvCalib[0,0], rvCalib[0,1], rvCalib[1,0], rvCalib[1,1])); +#if DN100 + log.FatalFormat("Component: {0}", ControlCom2VB.ControlCom2panel.ProgVersion); +#elif MUNICH || FUZHOU150 + log.FatalFormat("Component: {0}", ControlComponent3Munich.UserControl1.ProgVersion); +#elif FUZHOU300 + log.FatalFormat("Component: {0}", ControlComponent3F300.UserControl1.ProgVersion); +#elif PT200IL || PUCHONG_PT200 || GENESIS || BERLIN || SLM_150 || PETERSBURG_200 || CEVAK_200 + log.FatalFormat("Component: {0}", ControlComponent_Izrael2014.UserControl1.ProgVersion); +#else /// newer benches + log.FatalFormat("Component: {0}", ControlComponent_Torino2015.UserControl1.ProgVersion); +#endif + log.Fatal("SendCalibData(...)"); + for (int i = 0; i < rvCalib.GetLength(0); i++) + for (int j = 0; j < rvCalib.GetLength(1); j++) + log.FatalFormat(" rvCalib[{0},{1}] = {2}", i, j, rvCalib[i,j]); + for (int i = 0; i < meretA.Length; i++) log.FatalFormat(" meretA[{0}] = {1}", i, meretA[i]); + log.FatalFormat(" usedCom = {0}", usedCom); + for (int i = 0; i < tempCalib.GetLength(0); i++) + for (int j = 0; j < tempCalib.GetLength(1); j++) + log.FatalFormat(" tempCalib[{0},{1}] = {2}", i, j, tempCalib[i, j]); + for (int i = 0; i < etCalib.Length; i++) log.FatalFormat(" etCalib[{0}] = {1}", i, etCalib[i]); + for (int i = 0; i < divEdge.Length; i++) log.FatalFormat(" divEdge[{0}] = {1}", i, divEdge[i]); + for (int i = 0; i < balanceRange.Length; i++) log.FatalFormat(" balanceRange[{0}] = {1}", i, balanceRange[i]); + + ctrlBrdComponent.ExternalCom = true; + +#if SENTEC + ctrlBrdComponent.SendCalibData(rvCalib, meretA, (byte)usedCom, tempCalib, etCalib, divEdge, balanceRange, (byte)123); +#else + ctrlBrdComponent.SendCalibData(rvCalib, meretA, (byte)usedCom, tempCalib, etCalib, divEdge, balanceRange); +#endif + } + + /// + /// Control of regulating valves. + /// + /// + /// Regulating valve nr. (1..5) + /// Valve regulation mode, see the enum + /// Target position or target frequency or pulse duration + /// Stabilization time when setting the flow: 0=200ms, step 50ms, max. 1.5 sec. + public void ValveMove(int valveNo, RegulValveMode valveMode, float[] valveValue, int stableTime) + { + if (Program.MainWnd.InvokeRequired) + { + /// When ValveMove(...) called from the worker thread + object[] args = new object[] { valveNo, valveMode, valveValue, stableTime }; + Program.MainWnd.Invoke((ValveMoveDlgt)DoValveMove, args); /// When ValveMove called from a worker thread + } + else + { + /// When ValveMove(...) called from the UI thread + DoValveMove(valveNo, valveMode, valveValue, stableTime); /// When ValveMove called from the UI thread + } + } + /// + delegate void ValveMoveDlgt(int valveNo, RegulValveMode valveMode, float[] valveValue, int stableTime); + /// + private void DoValveMove(int valveNo, RegulValveMode valveMode, float[] valveValue, int stableTime) + { +#if DN100 || MUNICH || FUZHOU150 + log.InfoFormat("ValveMove(#={0}, md={1}, [{2}, {3}])", valveNo, valveMode, valveValue[0], valveValue[1]); + ctrlBrdComponent.ValveMove((byte)valveNo, (byte)valveMode, valveValue); +#else /// all newer benches + log.InfoFormat("ValveMove(#={0}, md={1}, [{2}, {3}], {4})", valveNo, valveMode, valveValue[0], valveValue[1], stableTime); + ctrlBrdComponent.ValveMove((byte)valveNo, (byte)valveMode, valveValue, stableTime); +#endif + } + + + /// + /// Sends a command to the control board. + /// + /// See ControlBoard.Command enum + /// Reference flow meter number (1..5) + /// Route: 64-bit installation specific number + /// Test duration as a number of reference flow meter pulses + /// See ControlBoard.TestMethods enum + /// 0 = No filtering (0..255) + /// Freq.inverter control (not applicable in DT100, Munich) + /// Coefficient used to control the regulation valve (1..100) + /// 0 = default value, 1 = spec. processing of very short pulses + /// What to stop + public void SendCommand(Command cmd, int refFlowMeterNr, UInt128 route, + int totalRefPulses, int massRefPulses, TestMethods testMethods, + uint[] filterConstants, float[] fmFreq, int regConst, int shortImp, StopDevs stopDevs) + { + if (Program.MainWnd.InvokeRequired) + { + /// When SendCommand(...) called from the worker thread + object[] args = new object[] { cmd, refFlowMeterNr, route, totalRefPulses, massRefPulses, + testMethods, filterConstants, fmFreq, regConst, shortImp, stopDevs }; + Program.MainWnd.Invoke((SendCommandDlgt)DoSendCommand, args); /// Component was created in UI thread - use Invoke() + } + else + { + /// When SendCommand(...) called from the UI thread + DoSendCommand(cmd, refFlowMeterNr, route, totalRefPulses, massRefPulses, testMethods, + filterConstants, fmFreq, regConst, shortImp, stopDevs); + } + } + /// + delegate void SendCommandDlgt(Command cmd, int refFlowmtrNr, UInt128 route, + int totalRefPulses, int massRefPulses, TestMethods testMethods, + uint[] filterConstants, float[] fmFreq, int regConst, int shortImp, StopDevs stopDevs); + /// + private void DoSendCommand(Command cmd, int refFlowMeterNr, UInt128 route, + int totalRefPulses, int massRefPulses, TestMethods testMethods, + uint[] filterConstants, float[] fmFreq, int regConst, int shortImp, StopDevs stopDevs) + { + //TBF.UiBridge.Bridge.OnLog(this, string.Format("{0} SendCommand({1}, {2}, {3}, {4}, {5}, {6}, [{7},{8}], {9}, {10}, {11})\r\n", + // DateTime.Now.ToLongTimeString(), + // cmd, + // refFlowMeterNr, + // route.ToString("X"), + // totalRefPulses, + // testMethods, + // filterConstant, + // fmFreq[0], + // fmFreq[1], + // regConst, + // shortImp, + // stopDevs)); + + +#if FUZHOU300 + /// + /// The following code deals with the situation that all FM controlled pumps share bit #39. + /// In settings the bits of pumps should be sent as follows: P1=50, P2=51, P3=52, P4=53, P5=54 and P7=55 + /// (in FUZHOU300 the FM pump bit should be set set to value FMIndex+50). + /// + bool bit39 = (route & 0x00FC000000000000) != 0; /// true if any of bits 50 through 55 is set + route = route & 0xFF03FFFFFFFFFFFF; + if (bit39) route = route | 0x0000008000000000; +#elif PETERSBURG_200 + /// + /// The following code deals with the situation that all pumps share bit #80. + /// In settings the bits of pumps should be sent as follows: P1=64, P2=65, P3=66, P4=67 and P5=68 + /// + bool bit80 = (route & (((UInt128)0x1F) << 64)) != 0; /// true if any of bits 64 through 68 is set + if (bit80) + route = route | (((UInt128)1) << 80); + else + route = route & (~(((UInt128)1) << 80)); +#endif + + log.InfoFormat("SendCommand(Cmd={0},Ref#={1},Route={2},TotalPls={3},MassPls={4},TM={5},filt={6},FM=[{7}{8}{9}{10}{11}{12}],Reg={13},ShrtImp={14},Stop={15})", + cmd, /// 0 + refFlowMeterNr, /// 1 + Utils.RouteToStr(route), /// 2 + totalRefPulses, massRefPulses, testMethods, filterConstants, /// 3, 4, 5, 6 + fmFreq[0].ToString(), /// 7 + (fmFreq.Length > 1) ? ("," + fmFreq[1].ToString()) : "", /// 8 + (fmFreq.Length > 2) ? ("," + fmFreq[2].ToString()) : "", /// 9 + (fmFreq.Length > 3) ? ("," + fmFreq[3].ToString()) : "", /// 10 + (fmFreq.Length > 4) ? ("," + fmFreq[4].ToString()) : "", /// 11 + (fmFreq.Length > 5) ? ("," + fmFreq[5].ToString()) : "", /// 12 + regConst, shortImp, stopDevs); /// 13, 14, 15 + +#if DN100 || MUNICH + ctrlBrdComponent.SendCommand((uint)cmd, (byte)refFlowMeterNr, (ulong)route, (uint)totalRefPulses, (uint)testMethods, + Convert.ToSingle(filterConstants[0]), fmFreq[0], (uint)regConst, (uint)shortImp, (uint)stopDevs); +#elif BADGER_MALA_TRAT || BADGER_VELKA_TRAT || FUZHOU_40 || FUZHOU150 || FUZHOU300 || PT200IL || PUCHONG_PT200 || TORINO50 || TORUN_PT50_2015 || CEVAK_PT40_272 || MURES_PT40 + ctrlBrdComponent.SendCommand((uint)cmd, (byte)refFlowMeterNr, (ulong)route, (uint)totalRefPulses, (uint)testMethods, + Convert.ToSingle(filterConstants[0]), fmFreq, (uint)regConst, (uint)shortImp, (uint)stopDevs); +#elif BERLIN || SLM_150 || PETERSBURG_200 || CEVAK_200 + uint[] pulsesArr = new uint[] { (uint)totalRefPulses, (uint)massRefPulses }; + ctrlBrdComponent.SendCommand((uint)cmd, (byte)refFlowMeterNr, (ulong)(route & (UInt128)0xFFFFFFFFFFFFFFFF), (ulong)(route >> 64), pulsesArr, (uint)testMethods, + Convert.ToSingle(filterConstants[0]), fmFreq, (uint)regConst, (uint)shortImp, (uint)stopDevs); +#elif GENESIS + uint[] pulsesArr = new uint[] { (uint)totalRefPulses, (uint)massRefPulses }; + ctrlBrdComponent.SendCommand((uint)cmd, (byte)refFlowMeterNr, (ulong)(route & (UInt128)0xFFFFFFFFFFFFFFFF), (ulong)(route >> 64), pulsesArr, (uint)testMethods, + filterConstants, fmFreq, (uint)regConst, (uint)shortImp, (uint)stopDevs); +#elif JUZNA_AFRIKA_50 || ZAMBIA || SENTEC || FUZHOU100 + uint[] pulsesArr = new uint[] { (uint)totalRefPulses, (uint)massRefPulses }; + ctrlBrdComponent.SendCommand((uint)cmd, (byte)refFlowMeterNr, (ulong)route, pulsesArr, (uint)testMethods, + filterConstants, fmFreq, (uint)regConst, (uint)shortImp, (uint)stopDevs); +#else /// if TURA_IPERL || TURA_SPECIAL || MALTA_WSD25 || SLM_50 || SLM_END || WARSAW_END || PETERSBURG_50 || KEMPNO_50 || BAHRAIN_50 || RUM_MOB || KRAKOW_50 || BADGER_STREDNA_TRAT || DUBAJ_50 + uint[] pulsesArr = new uint[] { (uint)totalRefPulses, (uint)massRefPulses }; + ctrlBrdComponent.SendCommand((uint)cmd, (byte)refFlowMeterNr, (ulong)route, pulsesArr, (uint)testMethods, + Convert.ToSingle(filterConstants[0]), fmFreq, (uint)regConst, (uint)shortImp, (uint)stopDevs); +#endif + log.InfoFormat("DoSendCommand() Route = {0}", Utils.RouteToStr(route)); + + if (lastRoute != route) /// This is to update the MainWnd status bar on changes only + { + UInt128 rRoute = RRoute; + Program.MainWnd.UpdateRoute(string.Format("{0} ({1})", Utils.RouteToStr(route), Utils.RouteToStr(rRoute))); + lastRoute = route; + } + } + + + enum CommType + { + Rx, /// Receive data only + TxRx, /// Transmit and receive data + } + + + private StatusP lastStatusP; /// This is to update the MainWnd status bar on changes only + private UInt128 lastRoute; /// This is to update the MainWnd status bar on changes only + + + public void RunDeviceBefore() + { + object[] args = new object[] { CommType.Rx }; + MakeCommDlgt dlgt = MakeComm; + Program.MainWnd.Invoke(dlgt, args); /// Invoke MakeExtComm(.) in the UI thread + + StatusP bufferedStatusP = StatusP; + if (lastStatusP != bufferedStatusP) + { + string statusPStr = ((ulong)bufferedStatusP).ToString("x16"); + log.InfoFormat("RunDeviceBefore() StatusP = {0}", statusPStr); + //Program.MainWnd.UpdateStatusP(statusPStr); /// TODO 170309 + lastStatusP = bufferedStatusP; + } + } + + public void RunDeviceAfter() + { + object[] args = new object[] { CommType.TxRx }; + MakeCommDlgt dlgt = MakeComm; + Program.MainWnd.Invoke(dlgt, args); /// Invoke MakeExtComm(.) in the UI thread + + StatusP bufferedStatusP = StatusP; + if (lastStatusP != bufferedStatusP) + { + string statusPStr = ((ulong)bufferedStatusP).ToString("x16"); + log.InfoFormat("RunDeviceAfter() StatusP = {0}", statusPStr); + //Program.MainWnd.UpdateStatusP(statusPStr); /// TODO 170309 + lastStatusP = bufferedStatusP; + } + } + + /// + /// A delegate to execute the SendCommand() in the UI thread + /// + delegate void MakeCommDlgt(CommType extComm); + + /// + /// Executes the SendCommand(...) and MakeExtCom() in the UI thread + /// + void MakeComm(CommType commType) + { + if (ctrlBrdComponent.ExternalCom) + { + ctrlBrdComponent.MakeExtCom((commType == CommType.Rx) ? false : true); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/CoverTest/CoverTest.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/CoverTest/CoverTest.cs new file mode 100644 index 00000000..516645d5 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/CoverTest/CoverTest.cs @@ -0,0 +1,137 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using Dirichlet.Numerics; +using log4net; +using TBF.BenchControl.GenericDevices; +using TBF.Resources; + +namespace TBF.BenchControl.Elde.CoverTest +{ + public class CoverTest : ComponentBase, IOperation, ISequenceCondition + { + private static readonly ILog log = LogManager.GetLogger(typeof(CoverTest)); + private static readonly ILog bypassLog = LogManager.GetLogger("BypassLog"); + + public override string ToString() { return string.Format("CoverTest({0})", Cfg.ToString(1)); } + + readonly CoverTestCfg coverTestCfg; + + readonly ControlBoardDev controlBoard; + readonly int bitPosition; /// 0 .. 63 + readonly ulong mask; /// derived from bitPosition in the constructor + readonly ulong target; + readonly string message; + readonly Users.Grp.GID bypassLevel; + + public CoverTest() + { + } + + public CoverTest(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + coverTestCfg = cfg as CoverTestCfg; + + controlBoard = (ControlBoardDev)TbfComponents.FindComponent(cfg.ParentName, components); + if (controlBoard == null) throw new Exception("Cannot find " + Name + " parent"); + + bitPosition = coverTestCfg.BitPosition; + mask = (((ulong)1) << coverTestCfg.BitPosition); + target = coverTestCfg.Invert ? 0 : mask; + message = coverTestCfg.Message; + bypassLevel = coverTestCfg.BypassLevel; + + log.Debug(this.ToString()); + } + + + public int ConditionsCount { get { return 1; } } + + /// Strings are added to the combo-box for transition sequence condition selection + public string ConditionName(int i) + { + if (i < 1 && i >= 0) + return Name; + else + return string.Empty; + } + + /// Operation to be executed as a part of a transition sequence + public IOperation ConditionOp(int i) + { + if (i < 1 && i >= 0) + return this; + else + return null; + } + + + CoverTestForm modelessDlg; + bool completed = false; + + + delegate void CoverTestFormDlgt(CoverTest myRef); + /// + void OpenFormDlg(CoverTest myRef) + { + myRef.modelessDlg = new CoverTestForm(message, bypassLevel, bypassLog); + modelessDlg.Show(); + } + + + public IOperation CoverTestOp() + { + return this; + } + + /// Start this operation + public void Start() + { + log.DebugFormat("Start()"); + completed = false; + Program.MainWnd.Invoke(new CoverTestFormDlgt(OpenFormDlg), this); + } + + /// Run this operation + /// Event.ResultsPrinted + public Event Run() + { + bool conditionMet = ((controlBoard.DigitalInputs & mask) == target); + + if (completed || conditionMet) + { + completed = true; + } + + if (completed || modelessDlg.Completed) + { + completed = true; + CloseModelessDlg(); + log.DebugFormat("Run() ... conditionMet={0} completed={1} ... Event.ConditionMet", conditionMet, completed); + return Event.ConditionMet; + } + + log.DebugFormat("Run() ... conditionMet={0} completed={1} ... Event.ConditionNotMet", conditionMet, completed); + return Event.ConditionNotMet; + } + + /// Stop this operation + public void Stop() + { + log.DebugFormat("Stop()"); + CloseModelessDlg(); + } + + void CloseModelessDlg() + { + if (modelessDlg is GenericDevices.IHasCompleted) + { + UiBridge.Bridge.OnCloseQandAForm(this, null); + modelessDlg = null; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/CoverTest/CoverTestCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/CoverTest/CoverTestCfg.cs new file mode 100644 index 00000000..5ccc7f40 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/CoverTest/CoverTestCfg.cs @@ -0,0 +1,58 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.IO; +using System.Collections.Generic; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.Elde.CoverTest +{ + public class CoverTestCfg : ComponentCfgBase, IChildComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(CoverTestCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new CoverTestCfgCtrl(); } + + /// + /// Serialized parameters + /// + public int BitPosition; + public bool Invert; + public string Message; + public Users.Grp.GID BypassLevel; + + /// Private parameterless constructor invoked by all other (public) constructors + CoverTestCfg() + { + Name = "CoverTest"; + ParentName = "CB"; + + /// Default values for closed cover test + BitPosition = 22; + Invert = false; + Message = Strings.Close_the_cover; + + BypassLevel = Users.Grp.GID.TestingSpecialists; + } + + public CoverTestCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("{0} ({1}) Bit={2}, Inv={3}, Message={4}, BypassLelvel={5}", + Name, + (string.IsNullOrEmpty(ParentName) ? "-" : ParentName), + BitPosition, + Invert ? "yes" : "no", + Message, + BypassLevel); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/CoverTest/CoverTestCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/CoverTest/CoverTestCfgCtrl.cs new file mode 100644 index 00000000..ee1fd26b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/CoverTest/CoverTestCfgCtrl.cs @@ -0,0 +1,131 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.CoverTest +{ + public partial class CoverTestCfgCtrl : UserControl, IComponentCfgCtrl + { + ComponentParametersDlg parent; + + public bool ShowMore { get { return false; } } + + CoverTestCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as CoverTestCfg; + Redraw(); + } + } + + public CoverTestCfgCtrl() + { + InitializeComponent(); + } + + private void PumpCfgCtrl_Load(object sender, EventArgs e) + { + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + + if (parent.TbfComponents != null) + { + foreach (var cmpnt in parent.TbfComponents) + { + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is Elde.ControlBoardFactory) + { + parentNameComboBox.Items.Add(cmpnt.Name); + } + } + } + + for (Users.Grp.GID gid = 0; gid < Users.Grp.GID.NrOfGroups; gid++) + { + bypassLevelComboBox.Items.Add(gid.ToString()); + } + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + parentNameComboBox.Text = string.IsNullOrEmpty(config.ParentName) ? "---" : config.ParentName; + bitPositionTextBox.Text = config.BitPosition.ToString(); + invertCheckBox.Checked = config.Invert; + messageTextBox.Text = config.Message; + bypassLevelComboBox.Text = config.BypassLevel.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + parentNameComboBox.Enabled = true; + bitPositionTextBox.Enabled = true; + invertCheckBox.Enabled = true; + messageTextBox.Enabled = true; + bypassLevelComboBox.Enabled = true; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.ParentName = parentNameComboBox.Text.Equals("---") ? string.Empty : parentNameComboBox.Text; + config.BitPosition = int.Parse(bitPositionTextBox.Text); + config.Invert = invertCheckBox.Checked; + config.Message = messageTextBox.Text; + + for (Users.Grp.GID gid = 0; gid < Users.Grp.GID.NrOfGroups; gid++) + { + if (bypassLevelComboBox.Text == gid.ToString()) + { + config.BypassLevel = gid; + break; + } + } + + return flags; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!parentNameComboBox.Items.Contains(parentNameComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Parent name'"; + } + if (!int.TryParse(bitPositionTextBox.Text, out dummy) || dummy < 0 || dummy >= 64) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Bit position' should be between 0 and 63"; + } + if (!bypassLevelComboBox.Items.Contains(bypassLevelComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Bypass level'"; + } + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/CoverTest/CoverTestCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/CoverTest/CoverTestCfgCtrl.designer.cs new file mode 100644 index 00000000..ac0f080e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/CoverTest/CoverTestCfgCtrl.designer.cs @@ -0,0 +1,194 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.Elde.CoverTest +{ + partial class CoverTestCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.bitPositionTextBox = new System.Windows.Forms.TextBox(); + this.bitPositionLabel = new System.Windows.Forms.Label(); + this.parentNameLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.parentNameComboBox = new System.Windows.Forms.ComboBox(); + this.delayLabel = new System.Windows.Forms.Label(); + this.messageTextBox = new System.Windows.Forms.TextBox(); + this.bypassLevelComboBox = new System.Windows.Forms.ComboBox(); + this.bypassLevelLabel = new System.Windows.Forms.Label(); + this.invertCheckBox = new System.Windows.Forms.CheckBox(); + this.SuspendLayout(); + // + // bitPositionTextBox + // + this.bitPositionTextBox.Enabled = false; + this.bitPositionTextBox.Location = new System.Drawing.Point(122, 99); + this.bitPositionTextBox.Name = "bitPositionTextBox"; + this.bitPositionTextBox.Size = new System.Drawing.Size(46, 20); + this.bitPositionTextBox.TabIndex = 6; + // + // bitPositionLabel + // + this.bitPositionLabel.AutoSize = true; + this.bitPositionLabel.Location = new System.Drawing.Point(36, 102); + this.bitPositionLabel.Name = "bitPositionLabel"; + this.bitPositionLabel.Size = new System.Drawing.Size(58, 13); + this.bitPositionLabel.TabIndex = 5; + this.bitPositionLabel.Text = "Bit position"; + // + // parentNameLabel + // + this.parentNameLabel.AutoSize = true; + this.parentNameLabel.Location = new System.Drawing.Point(36, 76); + this.parentNameLabel.Name = "parentNameLabel"; + this.parentNameLabel.Size = new System.Drawing.Size(67, 13); + this.parentNameLabel.TabIndex = 3; + this.parentNameLabel.Text = "Parent name"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(122, 47); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(36, 50); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(119, 21); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // parentNameComboBox + // + this.parentNameComboBox.Enabled = false; + this.parentNameComboBox.FormattingEnabled = true; + this.parentNameComboBox.Location = new System.Drawing.Point(122, 73); + this.parentNameComboBox.Name = "parentNameComboBox"; + this.parentNameComboBox.Size = new System.Drawing.Size(130, 21); + this.parentNameComboBox.TabIndex = 4; + // + // delayLabel + // + this.delayLabel.AutoSize = true; + this.delayLabel.Location = new System.Drawing.Point(36, 127); + this.delayLabel.Name = "delayLabel"; + this.delayLabel.Size = new System.Drawing.Size(50, 13); + this.delayLabel.TabIndex = 8; + this.delayLabel.Text = "Message"; + // + // messageTextBox + // + this.messageTextBox.Enabled = false; + this.messageTextBox.Location = new System.Drawing.Point(122, 124); + this.messageTextBox.Name = "messageTextBox"; + this.messageTextBox.Size = new System.Drawing.Size(130, 20); + this.messageTextBox.TabIndex = 9; + // + // bypassLevelComboBox + // + this.bypassLevelComboBox.Enabled = false; + this.bypassLevelComboBox.FormattingEnabled = true; + this.bypassLevelComboBox.Location = new System.Drawing.Point(122, 150); + this.bypassLevelComboBox.Name = "bypassLevelComboBox"; + this.bypassLevelComboBox.Size = new System.Drawing.Size(130, 21); + this.bypassLevelComboBox.TabIndex = 11; + // + // bypassLevelLabel + // + this.bypassLevelLabel.AutoSize = true; + this.bypassLevelLabel.Location = new System.Drawing.Point(36, 153); + this.bypassLevelLabel.Name = "bypassLevelLabel"; + this.bypassLevelLabel.Size = new System.Drawing.Size(66, 13); + this.bypassLevelLabel.TabIndex = 10; + this.bypassLevelLabel.Text = "Bypass level"; + // + // invertCheckBox + // + this.invertCheckBox.AutoSize = true; + this.invertCheckBox.Enabled = false; + this.invertCheckBox.Location = new System.Drawing.Point(190, 101); + this.invertCheckBox.Name = "invertCheckBox"; + this.invertCheckBox.Size = new System.Drawing.Size(67, 17); + this.invertCheckBox.TabIndex = 7; + this.invertCheckBox.Text = "Invert bit"; + this.invertCheckBox.UseVisualStyleBackColor = true; + // + // CoverTestCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.invertCheckBox); + this.Controls.Add(this.bypassLevelComboBox); + this.Controls.Add(this.bypassLevelLabel); + this.Controls.Add(this.messageTextBox); + this.Controls.Add(this.delayLabel); + this.Controls.Add(this.parentNameComboBox); + this.Controls.Add(this.bitPositionTextBox); + this.Controls.Add(this.bitPositionLabel); + this.Controls.Add(this.parentNameLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "CoverTestCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.PumpCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox bitPositionTextBox; + private System.Windows.Forms.Label bitPositionLabel; + private System.Windows.Forms.Label parentNameLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.ComboBox parentNameComboBox; + private System.Windows.Forms.Label delayLabel; + private System.Windows.Forms.TextBox messageTextBox; + private System.Windows.Forms.ComboBox bypassLevelComboBox; + private System.Windows.Forms.Label bypassLevelLabel; + private System.Windows.Forms.CheckBox invertCheckBox; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/CoverTest/CoverTestCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/CoverTest/CoverTestCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/CoverTest/CoverTestCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/CoverTest/CoverTestForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/CoverTest/CoverTestForm.cs new file mode 100644 index 00000000..13a3959f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/CoverTest/CoverTestForm.cs @@ -0,0 +1,94 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Drawing; +using System.Windows.Forms; +using log4net; +using TBF.Resources; + +namespace TBF.BenchControl.Elde.CoverTest +{ + public partial class CoverTestForm : Form, GenericDevices.IHasCompleted + { + ILog bypassLog; + string message; + + /// Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + Users.Grp.GID bypassLevel; + + public CoverTestForm(string message, Users.Grp.GID bypassLevel, ILog bypassLog) + { + InitializeComponent(); + ControlBox = false; + + this.message = message; + this.bypassLevel = bypassLevel; + this.bypassLog = bypassLog; + + Localize(); + messageLabel.Text = this.message; + + float textWidth = Graphics.FromImage(new Bitmap(1, 1)).MeasureString(messageLabel.Text, messageLabel.Font).Width; + int rqrdFormWidth = (int)textWidth + 80; /// Form width calculated from the text width + + if (rqrdFormWidth > Width) + { + int shift = (rqrdFormWidth - Width) / 2; + Width = rqrdFormWidth; + bypassButton.Left += shift; + } + + completed = false; + StartForceCloseHandler(); + } + + void Localize() + { + Text = Strings.Message; + bypassButton.Text = Strings.Bypass; + } + + private void bypassButton_Click(object sender, EventArgs e) + { + if (!Users.GlobalData.CurrentUser.IsMemberOf(bypassLevel)) + { + if ((new Users.Forms.LoginDlg(bypassLevel)).ShowDialog() != DialogResult.OK) + { + return; + } + else + { + if (Program.MainWnd != null) Program.MainWnd.UpdateUser(); + } + } + + bypassLog.InfoFormat("{0} bypassed by {1}", message, Users.GlobalData.CurrentUser.UserName); + + completed = true; + Close(); + } + + #region Forced close handling + + public void StartForceCloseHandler() + { + UiBridge.Bridge.CloseQandAFormHandler += delegate(object sender, EventArgs args) + { + if (InvokeRequired) { Invoke(new EventHandler(OnForceClose), sender, args); } + else OnForceClose(sender, args); + }; + } + + private void OnForceClose(object sender, EventArgs args) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/CoverTest/CoverTestForm.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/CoverTest/CoverTestForm.designer.cs new file mode 100644 index 00000000..af8d8978 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/CoverTest/CoverTestForm.designer.cs @@ -0,0 +1,81 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.Elde.CoverTest +{ + partial class CoverTestForm + { + /// + /// 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() + { + this.bypassButton = new System.Windows.Forms.Button(); + this.messageLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // bypassButton + // + this.bypassButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.bypassButton.ForeColor = System.Drawing.Color.Black; + this.bypassButton.Location = new System.Drawing.Point(126, 99); + this.bypassButton.Name = "bypassButton"; + this.bypassButton.Size = new System.Drawing.Size(200, 63); + this.bypassButton.TabIndex = 1; + this.bypassButton.Text = "Bypass"; + this.bypassButton.UseVisualStyleBackColor = true; + this.bypassButton.Click += new System.EventHandler(this.bypassButton_Click); + // + // messageLabel + // + this.messageLabel.AutoSize = true; + this.messageLabel.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.messageLabel.Location = new System.Drawing.Point(34, 39); + this.messageLabel.Name = "messageLabel"; + this.messageLabel.Size = new System.Drawing.Size(91, 23); + this.messageLabel.TabIndex = 4; + this.messageLabel.Text = "Message"; + // + // CoverTestForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkOrange; + this.ClientSize = new System.Drawing.Size(454, 201); + this.Controls.Add(this.messageLabel); + this.Controls.Add(this.bypassButton); + this.Name = "CoverTestForm"; + this.Text = "Message"; + this.TopMost = true; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button bypassButton; + private System.Windows.Forms.Label messageLabel; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/CoverTest/CoverTestForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/CoverTest/CoverTestForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/CoverTest/CoverTestForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/CoverTest/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/CoverTest/Factory.cs new file mode 100644 index 00000000..b70255ed --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/CoverTest/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.CoverTest +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return "Elde.CoverTest"; } } + + public void ResetStaticProperties() { CoverTest.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new CoverTest(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new CoverTest(cfg, components); } + + public IComponentCfg DefaultConfig() { return new CoverTestCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(CoverTestCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Diverter/Diverter.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Diverter/Diverter.cs new file mode 100644 index 00000000..47a1ec10 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Diverter/Diverter.cs @@ -0,0 +1,194 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using log4net; +using Dirichlet.Numerics; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.Elde.Diverter +{ + public class Diverter : ComponentBase, IDevice, GenericDevices.IDiverter, GenericDevices.ISequenceCondition + { + private static readonly ILog log = LogManager.GetLogger(typeof(Diverter)); + public override string ToString() { return string.Format("Diverter({0})", Cfg.ToString(1)); } + + + /// + /// Enumeration of balances via static fields and methods + /// + static int nextIdx = 0; + public static new void ResetStaticProperties() + { + nextIdx = 0; + } + public static int DivertersCount { get { return nextIdx; } } + public static GenericDevices.IDiverter[] Diverters; + + readonly int diverterNr0; /// 0-based diverter number + public int DiverterNr { get { return diverterNr0 + 1; } } /// 1-based public diverter number + + readonly DiverterCfg diverterCfg; + readonly ControlBoardDev controlBoard; + readonly UInt128 mask; /// derived from bitPosition in the constructor + public int AdcNr { get { return diverterCfg.AdcNr; } } + + readonly int flowMtrNr4Cmd; + readonly IOperation diverterToTankOp; + readonly IOperation diverterToSinkOp; + + + public bool State { get { return (controlBoard.Route & mask) != 0; } } + public int ThresholdGate { get { return diverterCfg.StartingLevel; } } + public int ThresholdLo { get { return diverterCfg.ThresholdLo; } } + public int ThresholdHi { get { return diverterCfg.ThresholdHi; } } + + + public Diverter() + { + } + + public Diverter(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + diverterCfg = cfg as DiverterCfg; + + controlBoard = (ControlBoardDev)TbfComponents.FindComponent(cfg.ParentName, components); + if (controlBoard == null) throw new Exception("Cannot find " + Name + " parent"); + + if (diverterCfg.BitPosition < 0 || diverterCfg.BitPosition >= 64) throw new ArgumentOutOfRangeException("position"); + this.mask = (((UInt128)1) << diverterCfg.BitPosition); + + + + diverterNr0 = nextIdx++; + /// + if (Diverters == null || Diverters.Length < nextIdx) + { + GenericDevices.IDiverter[] divertersSoFar = Diverters; + + Diverters = new GenericDevices.IDiverter[nextIdx]; + + if (divertersSoFar != null) + { + for (int i = 0; i < divertersSoFar.Length; i++) Diverters[i] = divertersSoFar[i]; + } + + Diverters[nextIdx - 1] = this; + } + + /// Prepare arguments of SendCalibData() + if (diverterCfg.AdcNr >= 0 && diverterCfg.AdcNr < controlBoard.RegValveCalib.GetLength(0)) + { + controlBoard.RegValveCalib[diverterCfg.AdcNr, 0] = (uint)diverterCfg.AdcValueToSink; + controlBoard.RegValveCalib[diverterCfg.AdcNr, 1] = (uint)diverterCfg.AdcValueToTank; + } + else + { + log.ErrorFormat("Unable to set {0} ADC levels: RegValveCalib array size={1}, diverter AdcNr={2}", + Name, controlBoard.RegValveCalib.GetLength(0), diverterCfg.AdcNr); + } + + + int divNrFromName; + if (!int.TryParse(Name.Substring(3), out divNrFromName)) + { + divNrFromName = nextIdx; + } +#if GENESIS || PETERSBURG_50 || PETERSBURG_200 || FUZHOU_40 || FUZHOU150 || FUZHOU300 + flowMtrNr4Cmd = divNrFromName + 1; +#elif BADGER_STREDNA_TRAT + flowMtrNr4Cmd = (divNrFromName == 1) ? 1 : ((divNrFromName == 2) ? 9 : 20); +#elif BADGER_VELKA_TRAT + flowMtrNr4Cmd = ((divNrFromName % 10) == 1) ? 0x11 : (((divNrFromName % 10) == 2) ? 0x22 : 0x33); +#else + flowMtrNr4Cmd = (divNrFromName == 1) ? 1 : 3; +#endif + diverterToTankOp = new SwitchDiverterOp(controlBoard, true, flowMtrNr4Cmd); + diverterToSinkOp = new SwitchDiverterOp(controlBoard, false, flowMtrNr4Cmd); + + + log.Debug(this.ToString()); + } + + + /// + /// IDevice interface implementation + /// + public void Initialize() { } + public void RunDeviceBefore() + { + int adcValue = (int)StateMachine.ControlBoard.AnalogInputRaw(diverterCfg.AdcNr, 0); + Handlers.OnAdcChanged(this, new CmdResponseArgs(CfgChangeCmd.GetAdc, diverterCfg.BitPosition, adcValue)); + } + public void RunDeviceAfter() { } + public void StopDevice() { } + public void StopDevice2() { } + + + /// + /// ISequenceCondition interface implementation + /// + public int ConditionsCount { get { return 2; } } + + /// Returned strings are added to the combo-box + public string ConditionName(int i) + { + if (i == 0) return string.Format("{0} {1}", Name, Strings.Start); + else return string.Format("{0} {1}", Name, Strings.End); + } + + public IOperation ConditionOp(int i) + { + if (i == 0) return diverterToTankOp; + else return diverterToSinkOp; + } + + + #region Configuration Change Handling + + public static void OnCfgChange(object sender, CfgChangeArgs args) + { + if (CfgChangeHandler == null) return; + try { CfgChangeHandler(sender, args); } + catch (Exception e) { log.Error("CfgChangeHandler(...) failed", e); } + } + + public static event EventHandler CfgChangeHandler; + + public override void StartChangeHandler() + { + CfgChangeHandler += delegate(object sender, CfgChangeArgs args) + { + DiverterCfg tmpcfg = args.Cfg as DiverterCfg; + if (tmpcfg != null && tmpcfg.Name.Equals(Name)) + { + if (args.Command == CfgChangeCmd.CfgChange) + { + } + else if (args.Command == CfgChangeCmd.GetAdc1 || args.Command == CfgChangeCmd.GetAdc2) + { + int adcValue = (int)controlBoard.AnalogInputRaw(diverterCfg.AdcNr, 0); + DiverterCfgCtrl.OnCmdResponse(this, new CmdResponseArgs(args.Command, diverterCfg.BitPosition, adcValue)); + } + else if (args.Command == CfgChangeCmd.DivToTank) + { + controlBoard.DiverterToTank(flowMtrNr4Cmd); + } + else if (args.Command == CfgChangeCmd.DivToSink) + { + controlBoard.DiverterToSink(flowMtrNr4Cmd); + } + else if (args.Command == CfgChangeCmd.ReadDivTransition) + { + controlBoard.ReadDiverterTransition(flowMtrNr4Cmd); + } + } + }; + } + + #endregion Configuration Change Handling + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Diverter/DiverterCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Diverter/DiverterCfg.cs new file mode 100644 index 00000000..4d04c77a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Diverter/DiverterCfg.cs @@ -0,0 +1,63 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.IO; +using System.Collections.Generic; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.Diverter +{ + public class DiverterCfg : ComponentCfgBase, IChildComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(DiverterCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new DiverterCfgCtrl(); } + + /// + /// Serialized parameters + /// + public int BitPosition; /// 0..63 + public int AdcNr; /// 0..15(?), number of the analog input + public int AdcValueToSink; /// 0..1023 + public int AdcValueToTank; /// 0..1023 + public int StartingLevel; /// 0..100 in %, threshold for the ADC value to start the test + public int ThresholdLo; /// 0..100 in %, threshold for low level when diverter transition time is measured + public int ThresholdHi; /// 0..100 in %, threshold for high level when diverter transition time is measured + + /// Private parameterless constructor invoked by all other (public) constructors + DiverterCfg() + { + Name = "Div"; + ParentName = "CB"; + BitPosition = 0; + AdcNr = 5; /// Div1: AdcNr=5 , Div2: AdcNr=6 + AdcValueToSink = 100; + AdcValueToTank = 500; + StartingLevel = 50; + ThresholdLo = 10; + ThresholdHi = 90; + } + + public DiverterCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Parent={1}, Bit={2}, ADC#={3}, ADC2Sink={4}, ADC2Tank={5}, Gate={6}%, Lo={7}%, Lo={8}%", + Name, + (string.IsNullOrEmpty(ParentName) ? "-" : ParentName), + BitPosition, + AdcNr, + AdcValueToSink, + AdcValueToTank, + StartingLevel, + ThresholdLo, + ThresholdHi); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Diverter/DiverterCfgCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Diverter/DiverterCfgCtrl.Designer.cs new file mode 100644 index 00000000..daa6bd76 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Diverter/DiverterCfgCtrl.Designer.cs @@ -0,0 +1,553 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.Elde.Diverter +{ + partial class DiverterCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.parentNameLabel = new System.Windows.Forms.Label(); + this.bitPositionLabel = new System.Windows.Forms.Label(); + this.bitPositionTextBox = new System.Windows.Forms.TextBox(); + this.parentNameComboBox = new System.Windows.Forms.ComboBox(); + this.startingEdgeTextBox = new System.Windows.Forms.TextBox(); + this.startingEdgeLabel = new System.Windows.Forms.Label(); + this.thresholdLoTextBox = new System.Windows.Forms.TextBox(); + this.thresholdLoLabel = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.startButton = new System.Windows.Forms.Button(); + this.stopButton = new System.Windows.Forms.Button(); + this.updateButton = new System.Windows.Forms.Button(); + this.adcToTankTextBox = new System.Windows.Forms.TextBox(); + this.adcTankLabel = new System.Windows.Forms.Label(); + this.adcToSinkTextBox = new System.Windows.Forms.TextBox(); + this.adcSinkLabel = new System.Windows.Forms.Label(); + this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.label4 = new System.Windows.Forms.Label(); + this.adcTextBox = new System.Windows.Forms.TextBox(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.setButton2 = new System.Windows.Forms.Button(); + this.label3 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.getButton2 = new System.Windows.Forms.Button(); + this.pctTextBox2 = new System.Windows.Forms.TextBox(); + this.adcTextBox2 = new System.Windows.Forms.TextBox(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.setButton1 = new System.Windows.Forms.Button(); + this.label6 = new System.Windows.Forms.Label(); + this.ADC = new System.Windows.Forms.Label(); + this.getButton1 = new System.Windows.Forms.Button(); + this.pctTextBox1 = new System.Windows.Forms.TextBox(); + this.adcTextBox1 = new System.Windows.Forms.TextBox(); + this.adcNrTextBox = new System.Windows.Forms.TextBox(); + this.label7 = new System.Windows.Forms.Label(); + this.label8 = new System.Windows.Forms.Label(); + this.thresholdHiTextBox = new System.Windows.Forms.TextBox(); + this.thresholdHiLabel = new System.Windows.Forms.Label(); + this.groupBox4.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(137, 41); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(27, 44); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(134, 17); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // parentNameLabel + // + this.parentNameLabel.AutoSize = true; + this.parentNameLabel.Location = new System.Drawing.Point(27, 67); + this.parentNameLabel.Name = "parentNameLabel"; + this.parentNameLabel.Size = new System.Drawing.Size(69, 13); + this.parentNameLabel.TabIndex = 3; + this.parentNameLabel.Text = "Parent Name"; + // + // bitPositionLabel + // + this.bitPositionLabel.AutoSize = true; + this.bitPositionLabel.Location = new System.Drawing.Point(27, 91); + this.bitPositionLabel.Name = "bitPositionLabel"; + this.bitPositionLabel.Size = new System.Drawing.Size(59, 13); + this.bitPositionLabel.TabIndex = 5; + this.bitPositionLabel.Text = "Bit Position"; + // + // bitPositionTextBox + // + this.bitPositionTextBox.Enabled = false; + this.bitPositionTextBox.Location = new System.Drawing.Point(137, 88); + this.bitPositionTextBox.Name = "bitPositionTextBox"; + this.bitPositionTextBox.Size = new System.Drawing.Size(46, 20); + this.bitPositionTextBox.TabIndex = 6; + // + // parentNameComboBox + // + this.parentNameComboBox.Enabled = false; + this.parentNameComboBox.FormattingEnabled = true; + this.parentNameComboBox.Location = new System.Drawing.Point(137, 64); + this.parentNameComboBox.Name = "parentNameComboBox"; + this.parentNameComboBox.Size = new System.Drawing.Size(130, 21); + this.parentNameComboBox.TabIndex = 4; + // + // startingEdgeTextBox + // + this.startingEdgeTextBox.Enabled = false; + this.startingEdgeTextBox.Location = new System.Drawing.Point(137, 180); + this.startingEdgeTextBox.Name = "startingEdgeTextBox"; + this.startingEdgeTextBox.Size = new System.Drawing.Size(46, 20); + this.startingEdgeTextBox.TabIndex = 14; + // + // startingEdgeLabel + // + this.startingEdgeLabel.AutoSize = true; + this.startingEdgeLabel.Location = new System.Drawing.Point(27, 183); + this.startingEdgeLabel.Name = "startingEdgeLabel"; + this.startingEdgeLabel.Size = new System.Drawing.Size(68, 13); + this.startingEdgeLabel.TabIndex = 13; + this.startingEdgeLabel.Text = "Starting level"; + // + // thresholdLoTextBox + // + this.thresholdLoTextBox.Enabled = false; + this.thresholdLoTextBox.Location = new System.Drawing.Point(137, 203); + this.thresholdLoTextBox.Name = "thresholdLoTextBox"; + this.thresholdLoTextBox.Size = new System.Drawing.Size(46, 20); + this.thresholdLoTextBox.TabIndex = 17; + // + // thresholdLoLabel + // + this.thresholdLoLabel.AutoSize = true; + this.thresholdLoLabel.Location = new System.Drawing.Point(27, 206); + this.thresholdLoLabel.Name = "thresholdLoLabel"; + this.thresholdLoLabel.Size = new System.Drawing.Size(69, 13); + this.thresholdLoLabel.TabIndex = 16; + this.thresholdLoLabel.Text = "Threshold Lo"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(190, 205); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(15, 13); + this.label2.TabIndex = 18; + this.label2.Text = "%"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(190, 183); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(15, 13); + this.label1.TabIndex = 15; + this.label1.Text = "%"; + // + // startButton + // + this.startButton.Location = new System.Drawing.Point(10, 557); + this.startButton.Name = "startButton"; + this.startButton.Size = new System.Drawing.Size(55, 31); + this.startButton.TabIndex = 22; + this.startButton.Text = "Start"; + this.startButton.UseVisualStyleBackColor = true; + this.startButton.Click += new System.EventHandler(this.startButton_Click); + // + // stopButton + // + this.stopButton.Location = new System.Drawing.Point(71, 557); + this.stopButton.Name = "stopButton"; + this.stopButton.Size = new System.Drawing.Size(55, 31); + this.stopButton.TabIndex = 23; + this.stopButton.Text = "Stop"; + this.stopButton.UseVisualStyleBackColor = true; + this.stopButton.Click += new System.EventHandler(this.stopButton_Click); + // + // updateButton + // + this.updateButton.Enabled = false; + this.updateButton.Location = new System.Drawing.Point(206, 557); + this.updateButton.Name = "updateButton"; + this.updateButton.Size = new System.Drawing.Size(85, 31); + this.updateButton.TabIndex = 26; + this.updateButton.Text = "Update Edge"; + this.updateButton.UseVisualStyleBackColor = true; + this.updateButton.Click += new System.EventHandler(this.updateButton_Click); + // + // adcToTankTextBox + // + this.adcToTankTextBox.Enabled = false; + this.adcToTankTextBox.Location = new System.Drawing.Point(137, 157); + this.adcToTankTextBox.Name = "adcToTankTextBox"; + this.adcToTankTextBox.Size = new System.Drawing.Size(46, 20); + this.adcToTankTextBox.TabIndex = 12; + // + // adcTankLabel + // + this.adcTankLabel.AutoSize = true; + this.adcTankLabel.Location = new System.Drawing.Point(27, 160); + this.adcTankLabel.Name = "adcTankLabel"; + this.adcTankLabel.Size = new System.Drawing.Size(94, 13); + this.adcTankLabel.TabIndex = 11; + this.adcTankLabel.Text = "ADC when to tank"; + // + // adcToSinkTextBox + // + this.adcToSinkTextBox.Enabled = false; + this.adcToSinkTextBox.Location = new System.Drawing.Point(137, 134); + this.adcToSinkTextBox.Name = "adcToSinkTextBox"; + this.adcToSinkTextBox.Size = new System.Drawing.Size(46, 20); + this.adcToSinkTextBox.TabIndex = 10; + // + // adcSinkLabel + // + this.adcSinkLabel.AutoSize = true; + this.adcSinkLabel.Location = new System.Drawing.Point(27, 137); + this.adcSinkLabel.Name = "adcSinkLabel"; + this.adcSinkLabel.Size = new System.Drawing.Size(92, 13); + this.adcSinkLabel.TabIndex = 9; + this.adcSinkLabel.Text = "ADC when to sink"; + // + // groupBox4 + // + this.groupBox4.Controls.Add(this.label4); + this.groupBox4.Controls.Add(this.adcTextBox); + this.groupBox4.Location = new System.Drawing.Point(10, 352); + this.groupBox4.Name = "groupBox4"; + this.groupBox4.Size = new System.Drawing.Size(279, 40); + this.groupBox4.TabIndex = 19; + this.groupBox4.TabStop = false; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(11, 17); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(32, 13); + this.label4.TabIndex = 22; + this.label4.Text = "ADC:"; + // + // adcTextBox + // + this.adcTextBox.Location = new System.Drawing.Point(47, 14); + this.adcTextBox.Name = "adcTextBox"; + this.adcTextBox.Size = new System.Drawing.Size(44, 20); + this.adcTextBox.TabIndex = 21; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.setButton2); + this.groupBox2.Controls.Add(this.label3); + this.groupBox2.Controls.Add(this.label5); + this.groupBox2.Controls.Add(this.getButton2); + this.groupBox2.Controls.Add(this.pctTextBox2); + this.groupBox2.Controls.Add(this.adcTextBox2); + this.groupBox2.Location = new System.Drawing.Point(10, 462); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(280, 59); + this.groupBox2.TabIndex = 21; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Measured value 2"; + // + // setButton2 + // + this.setButton2.Location = new System.Drawing.Point(229, 17); + this.setButton2.Name = "setButton2"; + this.setButton2.Size = new System.Drawing.Size(38, 33); + this.setButton2.TabIndex = 5; + this.setButton2.Text = "Set"; + this.setButton2.UseVisualStyleBackColor = true; + this.setButton2.Click += new System.EventHandler(this.setButton_Click); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(209, 28); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(15, 13); + this.label3.TabIndex = 4; + this.label3.Text = "%"; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(11, 27); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(32, 13); + this.label5.TabIndex = 3; + this.label5.Text = "ADC:"; + // + // getButton2 + // + this.getButton2.Location = new System.Drawing.Point(101, 18); + this.getButton2.Name = "getButton2"; + this.getButton2.Size = new System.Drawing.Size(38, 33); + this.getButton2.TabIndex = 2; + this.getButton2.Text = "Get"; + this.getButton2.UseVisualStyleBackColor = true; + this.getButton2.Click += new System.EventHandler(this.getButton2_Click); + // + // pctTextBox2 + // + this.pctTextBox2.Location = new System.Drawing.Point(160, 24); + this.pctTextBox2.Name = "pctTextBox2"; + this.pctTextBox2.Size = new System.Drawing.Size(46, 20); + this.pctTextBox2.TabIndex = 1; + // + // adcTextBox2 + // + this.adcTextBox2.Location = new System.Drawing.Point(47, 24); + this.adcTextBox2.Name = "adcTextBox2"; + this.adcTextBox2.Size = new System.Drawing.Size(44, 20); + this.adcTextBox2.TabIndex = 0; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.setButton1); + this.groupBox1.Controls.Add(this.label6); + this.groupBox1.Controls.Add(this.ADC); + this.groupBox1.Controls.Add(this.getButton1); + this.groupBox1.Controls.Add(this.pctTextBox1); + this.groupBox1.Controls.Add(this.adcTextBox1); + this.groupBox1.Location = new System.Drawing.Point(10, 398); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(280, 59); + this.groupBox1.TabIndex = 20; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Measured value 1"; + // + // setButton1 + // + this.setButton1.Location = new System.Drawing.Point(229, 17); + this.setButton1.Name = "setButton1"; + this.setButton1.Size = new System.Drawing.Size(38, 33); + this.setButton1.TabIndex = 5; + this.setButton1.Text = "Set"; + this.setButton1.UseVisualStyleBackColor = true; + this.setButton1.Click += new System.EventHandler(this.setButton_Click); + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(209, 28); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(15, 13); + this.label6.TabIndex = 4; + this.label6.Text = "%"; + // + // ADC + // + this.ADC.AutoSize = true; + this.ADC.Location = new System.Drawing.Point(11, 28); + this.ADC.Name = "ADC"; + this.ADC.Size = new System.Drawing.Size(32, 13); + this.ADC.TabIndex = 3; + this.ADC.Text = "ADC:"; + // + // getButton1 + // + this.getButton1.Location = new System.Drawing.Point(101, 18); + this.getButton1.Name = "getButton1"; + this.getButton1.Size = new System.Drawing.Size(38, 33); + this.getButton1.TabIndex = 2; + this.getButton1.Text = "Get"; + this.getButton1.UseVisualStyleBackColor = true; + this.getButton1.Click += new System.EventHandler(this.getButton1_Click); + // + // pctTextBox1 + // + this.pctTextBox1.Location = new System.Drawing.Point(160, 24); + this.pctTextBox1.Name = "pctTextBox1"; + this.pctTextBox1.Size = new System.Drawing.Size(46, 20); + this.pctTextBox1.TabIndex = 1; + // + // adcTextBox1 + // + this.adcTextBox1.Location = new System.Drawing.Point(47, 24); + this.adcTextBox1.Name = "adcTextBox1"; + this.adcTextBox1.Size = new System.Drawing.Size(44, 20); + this.adcTextBox1.TabIndex = 0; + // + // adcNrTextBox + // + this.adcNrTextBox.Enabled = false; + this.adcNrTextBox.Location = new System.Drawing.Point(137, 111); + this.adcNrTextBox.Name = "adcNrTextBox"; + this.adcNrTextBox.Size = new System.Drawing.Size(46, 20); + this.adcNrTextBox.TabIndex = 8; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(27, 114); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(76, 13); + this.label7.TabIndex = 7; + this.label7.Text = "Analog input #"; + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Location = new System.Drawing.Point(190, 228); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(15, 13); + this.label8.TabIndex = 29; + this.label8.Text = "%"; + // + // thresholdHiTextBox + // + this.thresholdHiTextBox.Enabled = false; + this.thresholdHiTextBox.Location = new System.Drawing.Point(137, 226); + this.thresholdHiTextBox.Name = "thresholdHiTextBox"; + this.thresholdHiTextBox.Size = new System.Drawing.Size(46, 20); + this.thresholdHiTextBox.TabIndex = 28; + // + // thresholdHiLabel + // + this.thresholdHiLabel.AutoSize = true; + this.thresholdHiLabel.Location = new System.Drawing.Point(27, 229); + this.thresholdHiLabel.Name = "thresholdHiLabel"; + this.thresholdHiLabel.Size = new System.Drawing.Size(67, 13); + this.thresholdHiLabel.TabIndex = 27; + this.thresholdHiLabel.Text = "Threshold Hi"; + // + // DiverterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.label8); + this.Controls.Add(this.thresholdHiTextBox); + this.Controls.Add(this.thresholdHiLabel); + this.Controls.Add(this.adcNrTextBox); + this.Controls.Add(this.label7); + this.Controls.Add(this.groupBox4); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.adcToTankTextBox); + this.Controls.Add(this.adcTankLabel); + this.Controls.Add(this.adcToSinkTextBox); + this.Controls.Add(this.adcSinkLabel); + this.Controls.Add(this.updateButton); + this.Controls.Add(this.stopButton); + this.Controls.Add(this.startButton); + this.Controls.Add(this.label1); + this.Controls.Add(this.label2); + this.Controls.Add(this.thresholdLoTextBox); + this.Controls.Add(this.thresholdLoLabel); + this.Controls.Add(this.startingEdgeTextBox); + this.Controls.Add(this.startingEdgeLabel); + this.Controls.Add(this.parentNameComboBox); + this.Controls.Add(this.bitPositionTextBox); + this.Controls.Add(this.bitPositionLabel); + this.Controls.Add(this.parentNameLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "DiverterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 700); + this.Load += new System.EventHandler(this.DiverterCfgCtrl_Load); + this.groupBox4.ResumeLayout(false); + this.groupBox4.PerformLayout(); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.Label parentNameLabel; + private System.Windows.Forms.Label bitPositionLabel; + private System.Windows.Forms.TextBox bitPositionTextBox; + private System.Windows.Forms.ComboBox parentNameComboBox; + private System.Windows.Forms.TextBox startingEdgeTextBox; + private System.Windows.Forms.Label startingEdgeLabel; + private System.Windows.Forms.TextBox thresholdLoTextBox; + private System.Windows.Forms.Label thresholdLoLabel; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button startButton; + private System.Windows.Forms.Button stopButton; + private System.Windows.Forms.Button updateButton; + private System.Windows.Forms.TextBox adcToTankTextBox; + private System.Windows.Forms.Label adcTankLabel; + private System.Windows.Forms.TextBox adcToSinkTextBox; + private System.Windows.Forms.Label adcSinkLabel; + private System.Windows.Forms.GroupBox groupBox4; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox adcTextBox; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.Button setButton2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Button getButton2; + private System.Windows.Forms.TextBox pctTextBox2; + private System.Windows.Forms.TextBox adcTextBox2; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Button setButton1; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Label ADC; + private System.Windows.Forms.Button getButton1; + private System.Windows.Forms.TextBox pctTextBox1; + private System.Windows.Forms.TextBox adcTextBox1; + private System.Windows.Forms.TextBox adcNrTextBox; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.TextBox thresholdHiTextBox; + private System.Windows.Forms.Label thresholdHiLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Diverter/DiverterCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Diverter/DiverterCfgCtrl.cs new file mode 100644 index 00000000..73bc89de --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Diverter/DiverterCfgCtrl.cs @@ -0,0 +1,340 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.Diverter +{ + public partial class DiverterCfgCtrl : UserControl, IComponentCfgCtrl + { + static readonly ILog log = LogManager.GetLogger(typeof(DiverterCfgCtrl)); + + ComponentParametersDlg parent; + + public bool ShowMore { get { return true; } } + + DiverterCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as DiverterCfg; + Redraw(); + } + } + + public DiverterCfgCtrl() + { + InitializeComponent(); + } + + private void DiverterCfgCtrl_Load(object sender, EventArgs e) + { + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + + if (parent.TbfComponents != null) + { + foreach (var cmpnt in parent.TbfComponents) + { + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is Elde.ControlBoardFactory) + { + parentNameComboBox.Items.Add(cmpnt.Name); + } + } + } + + if (config != null) + { + adc1 = config.AdcValueToSink; + pct1 = 0; + adc2 = config.AdcValueToTank; + pct2 = 100; + } + + Redraw(); + StartResponseHandler(); + } + + public void Closing() + { + StopResponseHandler(); + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + parentNameComboBox.Text = string.IsNullOrEmpty(config.ParentName) ? "---" : config.ParentName; + nameTextBox.Text = config.Name; + bitPositionTextBox.Text = config.BitPosition.ToString(); + adcNrTextBox.Text = config.AdcNr.ToString(); + adcToSinkTextBox.Text = config.AdcValueToSink.ToString(); + adcToTankTextBox.Text = config.AdcValueToTank.ToString(); + startingEdgeTextBox.Text = config.StartingLevel.ToString(); + thresholdLoTextBox.Text = config.ThresholdLo.ToString(); + thresholdHiTextBox.Text = config.ThresholdHi.ToString(); + + adcTextBox1.Text = adc1.ToString(); + adcTextBox2.Text = adc2.ToString(); + pctTextBox1.Text = pct1.ToString(); + pctTextBox2.Text = pct2.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + parentNameComboBox.Enabled = true; + bitPositionTextBox.Enabled = true; + adcNrTextBox.Enabled = true; + adcToSinkTextBox.Enabled = true; + adcToTankTextBox.Enabled = true; + startingEdgeTextBox.Enabled = true; + thresholdLoTextBox.Enabled = true; + thresholdHiTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!parentNameComboBox.Items.Contains(parentNameComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Parent Name'"; + } + + if (!int.TryParse(bitPositionTextBox.Text, out dummy) || dummy < 0 || dummy > 127) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Bit Position' should be between 0 and 127"; + } + + if (!int.TryParse(adcNrTextBox.Text, out dummy) || dummy < 0 || dummy > 15) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Analog input #' should be between 0 and 15"; + } + + if (!int.TryParse(adcToSinkTextBox.Text, out dummy) || dummy < 0 || dummy > 1023) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'ADC when to sink' should be between 0 and 1023"; + } + + if (!int.TryParse(adcToTankTextBox.Text, out dummy) || dummy < 0 || dummy > 1023) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'ADC when to tank' should be between 0 and 1023"; + } + + if (!int.TryParse(startingEdgeTextBox.Text, out dummy) || dummy < 0 || dummy > 100) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Starting Edge' should be between 0 and 100%"; + } + if (!int.TryParse(thresholdLoTextBox.Text, out dummy) || dummy < 0 || dummy > 100) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Threshold LO' should be between 0 and 100%"; + } + if (!int.TryParse(thresholdHiTextBox.Text, out dummy) || dummy < 0 || dummy > 100) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Threshold HI' should be between 0 and 100%"; + } + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.None; +// CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + if (!config.Name.Equals(nameTextBox.Text)) + { + config.Name = nameTextBox.Text; + flags |= CfgUpdateFlags.RestartRqrd; + } + + string parentname = parentNameComboBox.Text.Equals("---") ? string.Empty : parentNameComboBox.Text; + if (!config.ParentName.Equals(parentname)) + { + config.ParentName = parentname; + flags |= CfgUpdateFlags.RestartRqrd; + } + + int tmp = int.Parse(bitPositionTextBox.Text); + if (config.BitPosition != tmp) + { + config.BitPosition = tmp; + flags |= CfgUpdateFlags.RestartRqrd; + } + + tmp = int.Parse(adcNrTextBox.Text); + if (config.AdcNr != tmp) + { + config.AdcNr = tmp; + flags |= CfgUpdateFlags.RestartRqrd; + } + + tmp = int.Parse(adcToSinkTextBox.Text); + if (config.AdcValueToSink != tmp) + { + config.AdcValueToSink = tmp; + flags |= CfgUpdateFlags.RestartRqrd; + } + + tmp = int.Parse(adcToTankTextBox.Text); + if (config.AdcValueToTank != tmp) + { + config.AdcValueToTank = tmp; + flags |= CfgUpdateFlags.RestartRqrd; + } + + tmp = int.Parse(startingEdgeTextBox.Text); + if (config.StartingLevel != tmp) + { + config.StartingLevel = tmp; + flags |= CfgUpdateFlags.RestartRqrd; + } + + tmp = int.Parse(thresholdLoTextBox.Text); + if (config.ThresholdLo != tmp) + { + config.ThresholdLo = tmp; + flags |= CfgUpdateFlags.RestartRqrd; + } + + tmp = int.Parse(thresholdHiTextBox.Text); + if (config.ThresholdHi != tmp) + { + config.ThresholdHi = tmp; + flags |= CfgUpdateFlags.RestartRqrd; + } + + return flags; + } + + int adc1; + int pct1; + + int adc2; + int pct2; + + + private void getButton1_Click(object sender, EventArgs e) + { + Diverter.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.GetAdc1, config)); + } + + private void getButton2_Click(object sender, EventArgs e) + { + Diverter.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.GetAdc2, config)); + } + + private void setButton_Click(object sender, EventArgs e) + { + int tmpPct1; + int tmpPct2; + if ((int.TryParse(pctTextBox1.Text, out tmpPct1) && (tmpPct1 >= 0) && (tmpPct1 <= 100)) && + (int.TryParse(pctTextBox2.Text, out tmpPct2) && (tmpPct2 >= 0) && (tmpPct2 <= 100))) + { + pct1 = tmpPct1; + pct2 = tmpPct2; + UpdateDivAdc(); + } + } + + void UpdateDivAdc() + { + if ((adc1 == adc2) || (pct1 == pct2)) return; + + double factor = (float)(adc2 - adc1) / (float)(pct2 - pct1); + int adcToSink = (int)((float)(0 - pct1) * factor + (float)adc1 + 0.5f); + int adcToTank = (int)((float)(100 - pct1) * factor + (float)adc1 + 0.5f); + + if ((adcToSink >= 0) && (adcToTank >= 0)) + { + adcToSinkTextBox.Text = adcToSink.ToString(); + adcToTankTextBox.Text = adcToTank.ToString(); + } + } + + + private void startButton_Click(object sender, EventArgs e) + { + Diverter.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.DivToTank, config)); + } + + private void stopButton_Click(object sender, EventArgs e) + { + Diverter.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.DivToSink, config)); + + } + + private void updateButton_Click(object sender, EventArgs e) + { + Diverter.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.ReadDivTransition, config)); + } + + + #region Configuration Change Handling + + public static void OnCmdResponse(object sender, CmdResponseArgs args) + { + if (CmdResponseHandler == null) return; + try { CmdResponseHandler(sender, args); } + catch (Exception e) { log.Error("CmdResponseHandler(...) failed", e); } + } + + public static event EventHandler CmdResponseHandler; + + public void StartResponseHandler() + { + Handlers.AdcChangedHandler += delegate(object sndr, CmdResponseArgs args) + { + if (InvokeRequired) { Invoke(new EventHandler(OnAdcChanged), sndr, args); } + else OnAdcChanged(sndr, args); + }; + + CmdResponseHandler += delegate(object sender, CmdResponseArgs args) + { + if (args.Command == CfgChangeCmd.GetAdc1) + { + adc1 = args.Response; + adcTextBox1.Text = adc1.ToString(); + } + else if (args.Command == CfgChangeCmd.GetAdc2) + { + adc2 = args.Response; + adcTextBox2.Text = adc2.ToString(); + } + }; + } + + public void StopResponseHandler() + { + CmdResponseHandler = null; + } + + void OnAdcChanged(object sender, CmdResponseArgs data) + { + if (data.Command == CfgChangeCmd.GetAdc && data.Id == config.BitPosition) + { + adcTextBox.Text = data.Response.ToString(); + } + } + + #endregion Configuration Change Handling + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Diverter/DiverterCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Diverter/DiverterCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Diverter/DiverterCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Diverter/DiverterFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Diverter/DiverterFactory.cs new file mode 100644 index 00000000..1e44c3fe --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Diverter/DiverterFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.Diverter +{ + public class DiverterFactory : IComponentFactory + { + public string ClassName { get { return "Diverter"; } } + + public void ResetStaticProperties() { Diverter.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Diverter(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Diverter(cfg, components); } + + public IComponentCfg DefaultConfig() { return new DiverterCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(DiverterCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Diverter/Handlers.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Diverter/Handlers.cs new file mode 100644 index 00000000..d779e8c8 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Diverter/Handlers.cs @@ -0,0 +1,36 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using log4net; + +namespace TBF.BenchControl.Elde.Diverter +{ + static class Handlers + { + static readonly ILog log = LogManager.GetLogger(typeof(Handlers)); + + static Handlers() + { + } + + /// + /// Called from the state machine when a procedure is selected and UI needs to be updated. + /// + public static void OnAdcChanged(object sender, CmdResponseArgs data) + { + if (AdcChangedHandler == null) + return; + + try + { + AdcChangedHandler(sender, data); + } + catch (Exception e) + { + log.Error("AdcChangedHandler(...) failed", e); + } + } + public static event EventHandler AdcChangedHandler; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Diverter/SwitchDiverterOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Diverter/SwitchDiverterOp.cs new file mode 100644 index 00000000..1e43c778 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Diverter/SwitchDiverterOp.cs @@ -0,0 +1,42 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; + +namespace TBF.BenchControl.Elde.Diverter +{ + public class SwitchDiverterOp : IOperation + { + ControlBoardDev controlBoard; + bool start; + int flowMtrNr; + + public SwitchDiverterOp(ControlBoardDev controlBoard, bool start, int flowMtrNr) + { + this.controlBoard = controlBoard; + this.start = start; + this.flowMtrNr = flowMtrNr; + } + + public void Start() + { + if (start) + { + controlBoard.DiverterToTank(flowMtrNr); + } + else + { + controlBoard.DiverterToSink(flowMtrNr); + } + } + + public Event Run() + { + return Event.ConditionMet; + } + + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ExecuteCommandOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ExecuteCommandOp.cs new file mode 100644 index 00000000..7cb4b7ba --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ExecuteCommandOp.cs @@ -0,0 +1,106 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using log4net; + +namespace TBF.BenchControl.Elde +{ + public class ExecuteCommandOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(ExecuteCommandOp)); + public override string ToString() { return string.Format("ExecuteCommandOp( command={0}, testMethod={1} )", commandOnStartOp, testMethod); } + + /// Set by the constructor + readonly ControlBoardDev controlBoard; + readonly Command commandOnStartOp; + readonly Command commandOnStopOp; + readonly TestMethods testMethod; + + bool started = false; + + /// + /// Internal states of this operation + /// + enum OpState + { + StartingCommand, + CommandStarted, + OpCompleted, + } + OpState opState; + + + /// + /// Starts the measurement. + /// Events: MeasurementStarted + /// + /// Control board component reference + /// Specifies used components + /// Test method + /// Test duration in number of reference flowmeter pulses + /// Specifies filter for watermeter pulses + public ExecuteCommandOp(ControlBoardDev controlBoard, Command commandOnStartOp, Command commandOnStopOp, TestMethods testMethod) + { + if (controlBoard == null) throw new ArgumentNullException("controlBoardDev"); + + this.controlBoard = controlBoard; + this.commandOnStartOp = commandOnStartOp; + this.commandOnStopOp = commandOnStopOp; + this.testMethod = testMethod; + + log.Debug(this.ToString()); + } + + /// Start this operation + public void Start() + { + controlBoard.SyncRoute(); + controlBoard.SendCommand(commandOnStartOp, 0, controlBoard.Route, 0, 0, testMethod, 0, 20, 0, StopDevs.None); + opState = OpState.StartingCommand; + } + + /// Run this operation + /// + /// Event.FlowInDone or Event.FlowOutDone + /// + public Event Run() + { + if (opState == OpState.StartingCommand) + { + StatusP statusP = controlBoard.StatusP; + log.DebugFormat("statusP = {0} {1} {2} {3}", + (((ulong)statusP >> 48) & 0xFFFF).ToString("X4"), + (((ulong)statusP >> 32) & 0xFFFF).ToString("X4"), + (((ulong)statusP >> 16) & 0xFFFF).ToString("X4"), + ((ulong)statusP & 0xFFFF).ToString("X4")); + + log.Info("Run() - StartingCommand"); + opState = OpState.CommandStarted; + return Event.None; + } + else if (opState == OpState.CommandStarted) + { + log.InfoFormat("Run() - CommandStarted"); + opState = OpState.OpCompleted; + return Event.None; + } + else if (opState == OpState.OpCompleted) + { + return Event.CommandCompleted; + } + + return Event.None; + } + + /// Stop this operation + public void Stop() + { + if (commandOnStopOp != Command.None) + { + controlBoard.SyncRoute(); + controlBoard.SendCommand(commandOnStopOp, 0, controlBoard.Route, 0, 0, testMethod, 0, 20, 0, StopDevs.None); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FixedStartRegisterReader/RRProcedureParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FixedStartRegisterReader/RRProcedureParams.cs new file mode 100644 index 00000000..13bfcfe0 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FixedStartRegisterReader/RRProcedureParams.cs @@ -0,0 +1,118 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.Elde.FixedStartRegisterReader +{ + public class RRProcedureParams : ProcedureParamsBase, IParamsProvider, IProcedureParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(RRProcedureParams) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public double PulsesPerLtr; /// Target low limit of the flow increase or decrease + + public override void InitializeAll() + { + PulsesPerLtr = 1.0; + } + + string[] paramNames = new string[] + { + Strings.PulsesPerLtr, + }; + public override string ParamName(int i) { return paramNames[i]; } + public override int ParamsCount() { return paramNames.Length; } + + public override string ToString(int i) + { + switch (i) + { + case 0: return PulsesPerLtr.ToString(); + default: return string.Empty; + } + } + + /// Retrieves parameters from UI controls + public CfgUpdateFlags UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: PulsesPerLtr = Utils.ParseUDouble(strValue); return CfgUpdateFlags.None; + default: return CfgUpdateFlags.None; + } + } + + /// Verifies whether strings in UI controls represent valid parameters + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + + double dummy; + switch (i) + { + case 0: + if (Utils.TryParseUDouble(strValue, out dummy)) return true; + break; + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(RRProcedureParams prms) + { + prms.PulsesPerLtr = this.PulsesPerLtr; + } + + public IParamsProvider Clone() + { + RRProcedureParams pars = new RRProcedureParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateFromDbEntity(ComponentProcedure dbEntity) + { + if (dbEntity == null) return; + try + { + RRProcedureParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as RRProcedureParams; + + procedureParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + procedure = dbEntity.Procedure; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + + public RRProcedureParams() + { + } + + public RRProcedureParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public RRProcedureParams(ComponentProcedure procedureParamsEntity, string componentName, Procedure procedure) + { + this.procedureParamsEntity = procedureParamsEntity; + this.componentName = componentName; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FixedStartRegisterReader/RegisterReader.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FixedStartRegisterReader/RegisterReader.cs new file mode 100644 index 00000000..95419c1e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FixedStartRegisterReader/RegisterReader.cs @@ -0,0 +1,114 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.Boxes; + +namespace TBF.BenchControl.Elde.FixedStartRegisterReader +{ + public class RegisterReader : ComponentBase, GenericDevices.IRegisterReader, IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(RegisterReader)); + public override string ToString() { return string.Format("FixedStartRegisterReader({0})", Cfg.ToString(1)); } + + readonly RegisterReaderCfg registerReaderCfg; + readonly ControlBoardDev controlBoard; + + + public Config.Entities.RegisterReaderType RegisterReaderType { get { return Config.Entities.RegisterReaderType.Manual; } } + public double PulsesPerLtr { get { return registerReaderCfg.ProcParams.PulsesPerLtr; } } + public double LtrsPerPulse { get { return (PulsesPerLtr <= float.Epsilon) ? 1.0 : (1 / PulsesPerLtr); } } + + + double beginWMState; + public double BeginWMState + { + get { return beginWMState; } + set { beginWMState = value; } + } + + double endWMState; + public double EndWMState + { + get { return endWMState; } + set { endWMState = value; } + } + + public double WMVolume { get { return endWMState - beginWMState; } } + + public int WMPulses { get { return (int)(WMVolume / LtrsPerPulse); } } + + int wmRefPulses; + public int WMRefPulses { get { return wmRefPulses; } } + + + + public RegisterReader() + { + } + + public RegisterReader(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + registerReaderCfg = cfg as RegisterReaderCfg; + + /// Control board is used to read reference flowmeter pulses + controlBoard = (ControlBoardDev)TbfComponents.FindComponent(cfg.ParentName, components); + if (controlBoard == null) throw new Exception("Cannot find " + Name + " parent"); + + Clear(); + + log.Debug(this.ToString()); + } + + public void Clear() + { + log.DebugFormat("{0}:Clear()", Name); + beginWMState = 0; + endWMState = 0; + wmRefPulses = 0; + } + + + public void TestCompleted() + { + log.DebugFormat("{0}:TestCompleted()", Name); + ReadPulses(); + } + + /// + /// Events: Event.ReadRegisterDone + /// + /// ReadWaterMeter instance reference casted to IOperaton + public IOperation ReadRegisterOp() + { + return this; + } + + private void ReadPulses() + { + wmRefPulses = (int)controlBoard.EtPulses(0); + } + + /// Start this operation + public void Start() + { + ReadPulses(); + } + + /// Run this operation + /// eventDone + public Event Run() + { + ReadPulses(); + return Event.ReadRegisterDone; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FixedStartRegisterReader/RegisterReaderCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FixedStartRegisterReader/RegisterReaderCfg.cs new file mode 100644 index 00000000..c02480ac --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FixedStartRegisterReader/RegisterReaderCfg.cs @@ -0,0 +1,47 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.FixedStartRegisterReader +{ + public class RegisterReaderCfg : ComponentCfgBase, Generic.IChildComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(RegisterReaderCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new RegisterReaderCfgCtrl(); } + + /// Procedure parameters + [XmlIgnore] + public RRProcedureParams ProcParams; + public override IParamsProvider GetRuntimeProcParamsProvider() { return ProcParams; } + public override IParamsProvider CreateProcParamsProvider() { return new RRProcedureParams(true); } + + /// Private parameterless constructor invoked by all other (public) constructors + RegisterReaderCfg() + { + Name = "Dummy"; + ParentName = "CB"; + ProcParams = new RRProcedureParams(true); + } + + public RegisterReaderCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Parent={1}", + Name, + (string.IsNullOrEmpty(ParentName) ? "-" : ParentName)); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FixedStartRegisterReader/RegisterReaderCfgCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FixedStartRegisterReader/RegisterReaderCfgCtrl.Designer.cs new file mode 100644 index 00000000..52c4a378 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FixedStartRegisterReader/RegisterReaderCfgCtrl.Designer.cs @@ -0,0 +1,110 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.Elde.FixedStartRegisterReader +{ + partial class RegisterReaderCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.parentNameLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.componentNameLabel = new System.Windows.Forms.Label(); + this.parentNameComboBox = new System.Windows.Forms.ComboBox(); + this.SuspendLayout(); + // + // parentNameLabel + // + this.parentNameLabel.AutoSize = true; + this.parentNameLabel.Location = new System.Drawing.Point(26, 96); + this.parentNameLabel.Name = "parentNameLabel"; + this.parentNameLabel.Size = new System.Drawing.Size(69, 13); + this.parentNameLabel.TabIndex = 3; + this.parentNameLabel.Text = "Parent Name"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(136, 67); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(26, 70); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // componentNameLabel + // + this.componentNameLabel.AutoSize = true; + this.componentNameLabel.Location = new System.Drawing.Point(133, 43); + this.componentNameLabel.Name = "componentNameLabel"; + this.componentNameLabel.Size = new System.Drawing.Size(83, 13); + this.componentNameLabel.TabIndex = 0; + this.componentNameLabel.Text = "ComonentName"; + // + // parentNameComboBox + // + this.parentNameComboBox.Enabled = false; + this.parentNameComboBox.FormattingEnabled = true; + this.parentNameComboBox.Location = new System.Drawing.Point(136, 93); + this.parentNameComboBox.Name = "parentNameComboBox"; + this.parentNameComboBox.Size = new System.Drawing.Size(130, 21); + this.parentNameComboBox.TabIndex = 4; + // + // RegisterReaderCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.parentNameComboBox); + this.Controls.Add(this.parentNameLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.componentNameLabel); + this.Name = "RegisterReaderCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.RegisterReaderCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label parentNameLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label componentNameLabel; + private System.Windows.Forms.ComboBox parentNameComboBox; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FixedStartRegisterReader/RegisterReaderCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FixedStartRegisterReader/RegisterReaderCfgCtrl.cs new file mode 100644 index 00000000..d1160c69 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FixedStartRegisterReader/RegisterReaderCfgCtrl.cs @@ -0,0 +1,95 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.FixedStartRegisterReader +{ + public partial class RegisterReaderCfgCtrl : UserControl, IComponentCfgCtrl + { + ComponentParametersDlg parent; + + public bool ShowMore { get { return false; } } + + RegisterReaderCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as RegisterReaderCfg; + Redraw(); + } + } + + public RegisterReaderCfgCtrl() + { + InitializeComponent(); + } + + private void RegisterReaderCfgCtrl_Load(object sender, EventArgs e) + { + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + + if (parent.TbfComponents != null) + { + foreach (var cmpnt in parent.TbfComponents) + { + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is Elde.ControlBoardFactory) + { + parentNameComboBox.Items.Add(cmpnt.Name); + } + } + } + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + componentNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + parentNameComboBox.Text = string.IsNullOrEmpty(config.ParentName) ? "---" : config.ParentName; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + parentNameComboBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (!parentNameComboBox.Items.Contains(parentNameComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Parent Name'"; + } + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.ParentName = parentNameComboBox.Text.Equals("---") ? string.Empty : parentNameComboBox.Text; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FixedStartRegisterReader/RegisterReaderCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FixedStartRegisterReader/RegisterReaderCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FixedStartRegisterReader/RegisterReaderCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FixedStartRegisterReader/RegisterReaderFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FixedStartRegisterReader/RegisterReaderFactory.cs new file mode 100644 index 00000000..00dde1c8 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FixedStartRegisterReader/RegisterReaderFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.FixedStartRegisterReader +{ + public class RegisterReaderFactory : IComponentFactory + { + public string ClassName { get { return "RegisterReader for standing start/stop"; } } + + public void ResetStaticProperties() { RegisterReader.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new RegisterReader(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new RegisterReader(cfg, components); } + + public IComponentCfg DefaultConfig() { return new RegisterReaderCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(RegisterReaderCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeter/FlowMeter.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeter/FlowMeter.cs new file mode 100644 index 00000000..d40e1111 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeter/FlowMeter.cs @@ -0,0 +1,86 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.Boxes; + +namespace TBF.BenchControl.Elde.FlowMeter +{ + public class FlowMeter : ComponentBase, GenericDevices.IFlowMeter + { + private static readonly ILog log = LogManager.GetLogger(typeof(FlowMeter)); + public override string ToString() { return string.Format("FlowMeter({0})", Cfg.ToString(1)); } + + readonly FlowMeterCfg flowMeterCfg; + readonly ControlBoardDev controlBoard; + + public int Idx1 { get { return flowMeterCfg.Idx1; } } + public float NominalFlow { get { return flowMeterCfg.NominalFlow; } } + public float LtrPerPulse { get { return flowMeterCfg.NominalFlow / 7200.0f; } } /// Nominal frequency is 2000 Hz + + public float LtrPerPulseCorrected(double flow, int rangeIx) + { + /// Apply correction + var rangeCorrections = new List(); + foreach (var corr in Corrections) + { + if (corr.RangeIx == rangeIx) rangeCorrections.Add(corr); + } + double correctedFlow = Config.Formulas.CorrectedValue(flow, rangeCorrections); + return (float)(LtrPerPulse * correctedFlow / flow); + } + + + public bool RangeEnabled(int ix) { return flowMeterCfg.RangeEnabled(ix); } + public double GetTempLo(int ix) { return flowMeterCfg.GetTempLo(ix); } + public double GetTempHi(int ix) { return flowMeterCfg.GetTempHi(ix); } + public double GetPressLo(int ix) { return flowMeterCfg.GetPressLo(ix); } + public double GetPressHi(int ix) { return flowMeterCfg.GetPressHi(ix); } + + + public FlowMeter() + { + } + + public FlowMeter(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + flowMeterCfg = cfg as FlowMeterCfg; + + controlBoard = (ControlBoardDev)TbfComponents.FindComponent(cfg.ParentName, components); + if (controlBoard == null) throw new Exception("Cannot find " + Name + " parent"); + + /// Prepare data for SendCalibData() control board component method + if (Idx1 >= controlBoard.EtCalib.Length) throw new Exception("Flowmeter " + Name + " parameter 'Idx1' is out of range"); + controlBoard.EtCalib[Idx1] = flowMeterCfg.NominalFlow; + + log.Debug(this.ToString()); + } + + public double ReadFlow() { return controlBoard.ReferenceFlow; } + public double ReadFrequency() { return controlBoard.ReferenceFreq; } + + /// + /// Events: FlowDone, Error + /// + /// Reference to a variable for the flow in Bar + /// ReadFlowOp instance reference casted to IOperaton + public IOperation ReadFlowOp(ref DoubleBox flow) + { + return new ReadFlowOp(this, controlBoard, ref flow); + } + + /// + /// Events: flowDone, Error + /// + /// Reference to a variable for the flow in Bar + /// Event returned when measurement done + /// ReadFlowOp instance reference casted to IOperaton + public IOperation ReadFlowOp(ref DoubleBox flow, Event flowDone) + { + return new ReadFlowOp(this, controlBoard, ref flow, flowDone); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeter/FlowMeterCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeter/FlowMeterCfg.cs new file mode 100644 index 00000000..32d7e8cc --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeter/FlowMeterCfg.cs @@ -0,0 +1,250 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.FlowMeter +{ + public class FlowMeterCfg : ComponentCfgBase, GenericDevices.ICalibInfoCfg, IChildComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(FlowMeterCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new FlowMeterCfgCtrl(); } + + /// + /// Serialized parameters + /// + public int Idx1; /// 1..7 + public float NominalFlow; /// Nominal flow in m3/h at output frequency 2000 Hz + + public double Temp1Lo; /// 4x zero means the range is disabled + public double Temp1Hi; + public double Press1Lo; + public double Press1Hi; + + public double Temp2Lo; /// 4x zero means the range is disabled + public double Temp2Hi; + public double Press2Lo; + public double Press2Hi; + + public double Temp3Lo; /// 4x zero means the range is disabled + public double Temp3Hi; + public double Press3Lo; + public double Press3Hi; + + public double Temp4Lo; /// 4x zero means the range is disabled + public double Temp4Hi; + public double Press4Lo; + public double Press4Hi; + + public double Temp5Lo; /// 4x zero means the range is disabled + public double Temp5Hi; + public double Press5Lo; + public double Press5Hi; + + /// Calibration info serialized parameters displayed in Metrology tab page + public string CalibCertificateNr; + public string CalibCertificate1; + public string CalibCertificate2; + public string CalibCertificate3; + public string CalibCertificate4; + public string CalibCertificate5; + public DateTime CalibDate; + public DateTime CalibDate1; + public DateTime CalibDate2; + public DateTime CalibDate3; + public DateTime CalibDate4; + public DateTime CalibDate5; + public DateTime CalibValidDate; + public DateTime CalibValidDate1; + public DateTime CalibValidDate2; + public DateTime CalibValidDate3; + public DateTime CalibValidDate4; + public DateTime CalibValidDate5; + + + public bool RangeEnabled(int rangeIx1) + { + switch (rangeIx1) + { + default: + case 0: return !(RangeEnabled(1) || RangeEnabled(2) || RangeEnabled(3) || RangeEnabled(4) || RangeEnabled(5)); + case 1: return (Temp1Lo != 0) || (Temp1Hi != 0) || (Press1Lo != 0) || (Press1Hi != 0); + case 2: return (Temp2Lo != 0) || (Temp2Hi != 0) || (Press2Lo != 0) || (Press2Hi != 0); + case 3: return (Temp3Lo != 0) || (Temp3Hi != 0) || (Press3Lo != 0) || (Press3Hi != 0); + case 4: return (Temp4Lo != 0) || (Temp4Hi != 0) || (Press4Lo != 0) || (Press4Hi != 0); + case 5: return (Temp5Lo != 0) || (Temp5Hi != 0) || (Press5Lo != 0) || (Press5Hi != 0); + } + } + + public double GetTempLo(int rangeIx1) + { + switch (rangeIx1) + { + default: + case 0: return 5.0; /// °C + case 1: return Temp1Lo; + case 2: return Temp2Lo; + case 3: return Temp3Lo; + case 4: return Temp4Lo; + case 5: return Temp5Lo; + } + } + + public double GetTempHi(int rangeIx1) + { + switch (rangeIx1) + { + default: + case 0: return 95.0; /// °C + case 1: return Temp1Hi; + case 2: return Temp2Hi; + case 3: return Temp3Hi; + case 4: return Temp4Hi; + case 5: return Temp5Hi; + } + } + + public double GetPressLo(int rangeIx1) + { + switch (rangeIx1) + { + default: + case 0: return 0; /// bar + case 1: return Press1Lo; + case 2: return Press2Lo; + case 3: return Press3Lo; + case 4: return Press4Lo; + case 5: return Press5Lo; + } + } + + public double GetPressHi(int rangeIx1) + { + switch (rangeIx1) + { + default: + case 0: return 16.0; /// bar + case 1: return Press1Hi; + case 2: return Press2Hi; + case 3: return Press3Hi; + case 4: return Press4Hi; + case 5: return Press5Hi; + } + } + + public string GetCalibCertificate(int rangeIx1) + { + switch (rangeIx1) + { + default: + case 0: return CalibCertificateNr; + case 1: return CalibCertificate1; + case 2: return CalibCertificate2; + case 3: return CalibCertificate3; + case 4: return CalibCertificate4; + case 5: return CalibCertificate5; + } + } + + public void SetCalibCertificate(int rangeIx1, string certificate) + { + switch (rangeIx1) + { + default: + case 0: CalibCertificateNr = certificate; return; + case 1: CalibCertificate1 = certificate; return; + case 2: CalibCertificate2 = certificate; return; + case 3: CalibCertificate3 = certificate; return; + case 4: CalibCertificate4 = certificate; return; + case 5: CalibCertificate5 = certificate; return; + } + } + + public DateTime GetCalibDate(int rangeIx1) + { + switch (rangeIx1) + { + default: + case 0: return CalibDate; + case 1: return CalibDate1; + case 2: return CalibDate2; + case 3: return CalibDate3; + case 4: return CalibDate4; + case 5: return CalibDate5; + } + } + + public void SetCalibDate(int rangeIx1, DateTime calibDate) + { + switch (rangeIx1) + { + default: + case 0: CalibDate = calibDate; return; + case 1: CalibDate1 = calibDate; return; + case 2: CalibDate2 = calibDate; return; + case 3: CalibDate3 = calibDate; return; + case 4: CalibDate4 = calibDate; return; + case 5: CalibDate5 = calibDate; return; + } + } + + public DateTime GetCalibValidDate(int rangeIx1) + { + switch (rangeIx1) + { + default: + case 0: return CalibValidDate; + case 1: return CalibValidDate1; + case 2: return CalibValidDate2; + case 3: return CalibValidDate3; + case 4: return CalibValidDate4; + case 5: return CalibValidDate5; + } + } + + public void SetCalibValidDate(int rangeIx1, DateTime calibValidDate) + { + switch (rangeIx1) + { + default: + case 0: CalibValidDate = calibValidDate; return; + case 1: CalibValidDate1 = calibValidDate; return; + case 2: CalibValidDate2 = calibValidDate; return; + case 3: CalibValidDate3 = calibValidDate; return; + case 4: CalibValidDate4 = calibValidDate; return; + case 5: CalibValidDate5 = calibValidDate; return; + } + } + + + /// Private parameterless constructor invoked by all other (public) constructors + FlowMeterCfg() + { + Name = "FlowMeter"; + ParentName = "CB"; + Idx1 = 1; + NominalFlow = 1; + } + + public FlowMeterCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Parent={1}, Idx1={2}, NominalFlow={3}", + Name, + (string.IsNullOrEmpty(ParentName) ? "-" : ParentName), + Idx1, + NominalFlow); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeter/FlowMeterCfgCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeter/FlowMeterCfgCtrl.Designer.cs new file mode 100644 index 00000000..158ef581 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeter/FlowMeterCfgCtrl.Designer.cs @@ -0,0 +1,504 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.Elde.FlowMeter +{ + partial class FlowMeterCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.positionTextBox = new System.Windows.Forms.TextBox(); + this.positionLabel = new System.Windows.Forms.Label(); + this.parentNameLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.nominalFlowTextBox = new System.Windows.Forms.TextBox(); + this.nominalFlowLabel = new System.Windows.Forms.Label(); + this.parentNameComboBox = new System.Windows.Forms.ComboBox(); + this.tempLo1TextBox = new System.Windows.Forms.TextBox(); + this.tempHi1TextBox = new System.Windows.Forms.TextBox(); + this.pressLo1TextBox = new System.Windows.Forms.TextBox(); + this.pressHi1TextBox = new System.Windows.Forms.TextBox(); + this.pressHi2TextBox = new System.Windows.Forms.TextBox(); + this.pressLo2TextBox = new System.Windows.Forms.TextBox(); + this.tempHi2TextBox = new System.Windows.Forms.TextBox(); + this.tempLo2TextBox = new System.Windows.Forms.TextBox(); + this.pressHi3TextBox = new System.Windows.Forms.TextBox(); + this.pressLo3TextBox = new System.Windows.Forms.TextBox(); + this.tempHi3TextBox = new System.Windows.Forms.TextBox(); + this.tempLo3TextBox = new System.Windows.Forms.TextBox(); + this.pressHi4TextBox = new System.Windows.Forms.TextBox(); + this.pressLo4TextBox = new System.Windows.Forms.TextBox(); + this.tempHi4TextBox = new System.Windows.Forms.TextBox(); + this.tempLo4TextBox = new System.Windows.Forms.TextBox(); + this.pressHi5TextBox = new System.Windows.Forms.TextBox(); + this.pressLo5TextBox = new System.Windows.Forms.TextBox(); + this.tempHi5TextBox = new System.Windows.Forms.TextBox(); + this.tempLo5TextBox = new System.Windows.Forms.TextBox(); + this.rangeCheckBox1 = new System.Windows.Forms.CheckBox(); + this.rangeCheckBox2 = new System.Windows.Forms.CheckBox(); + this.rangeCheckBox3 = new System.Windows.Forms.CheckBox(); + this.rangeCheckBox4 = new System.Windows.Forms.CheckBox(); + this.rangeCheckBox5 = new System.Windows.Forms.CheckBox(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // positionTextBox + // + this.positionTextBox.Enabled = false; + this.positionTextBox.Location = new System.Drawing.Point(224, 113); + this.positionTextBox.Name = "positionTextBox"; + this.positionTextBox.Size = new System.Drawing.Size(46, 20); + this.positionTextBox.TabIndex = 6; + // + // positionLabel + // + this.positionLabel.AutoSize = true; + this.positionLabel.Location = new System.Drawing.Point(30, 116); + this.positionLabel.Name = "positionLabel"; + this.positionLabel.Size = new System.Drawing.Size(44, 13); + this.positionLabel.TabIndex = 5; + this.positionLabel.Text = "Position"; + // + // parentNameLabel + // + this.parentNameLabel.AutoSize = true; + this.parentNameLabel.Location = new System.Drawing.Point(30, 90); + this.parentNameLabel.Name = "parentNameLabel"; + this.parentNameLabel.Size = new System.Drawing.Size(69, 13); + this.parentNameLabel.TabIndex = 3; + this.parentNameLabel.Text = "Parent Name"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(140, 61); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(30, 64); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(137, 37); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // nominalFlowTextBox + // + this.nominalFlowTextBox.Enabled = false; + this.nominalFlowTextBox.Location = new System.Drawing.Point(224, 138); + this.nominalFlowTextBox.Name = "nominalFlowTextBox"; + this.nominalFlowTextBox.Size = new System.Drawing.Size(46, 20); + this.nominalFlowTextBox.TabIndex = 8; + // + // nominalFlowLabel + // + this.nominalFlowLabel.AutoSize = true; + this.nominalFlowLabel.Location = new System.Drawing.Point(30, 141); + this.nominalFlowLabel.Name = "nominalFlowLabel"; + this.nominalFlowLabel.Size = new System.Drawing.Size(140, 13); + this.nominalFlowLabel.TabIndex = 7; + this.nominalFlowLabel.Text = "Nominal flow [m3/h @2kHz]"; + // + // parentNameComboBox + // + this.parentNameComboBox.Enabled = false; + this.parentNameComboBox.FormattingEnabled = true; + this.parentNameComboBox.Location = new System.Drawing.Point(140, 87); + this.parentNameComboBox.Name = "parentNameComboBox"; + this.parentNameComboBox.Size = new System.Drawing.Size(130, 21); + this.parentNameComboBox.TabIndex = 4; + // + // tempLo1TextBox + // + this.tempLo1TextBox.Enabled = false; + this.tempLo1TextBox.Location = new System.Drawing.Point(140, 205); + this.tempLo1TextBox.Name = "tempLo1TextBox"; + this.tempLo1TextBox.Size = new System.Drawing.Size(68, 20); + this.tempLo1TextBox.TabIndex = 10; + // + // tempHi1TextBox + // + this.tempHi1TextBox.Enabled = false; + this.tempHi1TextBox.Location = new System.Drawing.Point(220, 205); + this.tempHi1TextBox.Name = "tempHi1TextBox"; + this.tempHi1TextBox.Size = new System.Drawing.Size(68, 20); + this.tempHi1TextBox.TabIndex = 11; + // + // pressLo1TextBox + // + this.pressLo1TextBox.Enabled = false; + this.pressLo1TextBox.Location = new System.Drawing.Point(300, 205); + this.pressLo1TextBox.Name = "pressLo1TextBox"; + this.pressLo1TextBox.Size = new System.Drawing.Size(68, 20); + this.pressLo1TextBox.TabIndex = 12; + // + // pressHi1TextBox + // + this.pressHi1TextBox.Enabled = false; + this.pressHi1TextBox.Location = new System.Drawing.Point(380, 205); + this.pressHi1TextBox.Name = "pressHi1TextBox"; + this.pressHi1TextBox.Size = new System.Drawing.Size(68, 20); + this.pressHi1TextBox.TabIndex = 13; + // + // pressHi2TextBox + // + this.pressHi2TextBox.Enabled = false; + this.pressHi2TextBox.Location = new System.Drawing.Point(380, 228); + this.pressHi2TextBox.Name = "pressHi2TextBox"; + this.pressHi2TextBox.Size = new System.Drawing.Size(68, 20); + this.pressHi2TextBox.TabIndex = 18; + // + // pressLo2TextBox + // + this.pressLo2TextBox.Enabled = false; + this.pressLo2TextBox.Location = new System.Drawing.Point(300, 228); + this.pressLo2TextBox.Name = "pressLo2TextBox"; + this.pressLo2TextBox.Size = new System.Drawing.Size(68, 20); + this.pressLo2TextBox.TabIndex = 17; + // + // tempHi2TextBox + // + this.tempHi2TextBox.Enabled = false; + this.tempHi2TextBox.Location = new System.Drawing.Point(220, 228); + this.tempHi2TextBox.Name = "tempHi2TextBox"; + this.tempHi2TextBox.Size = new System.Drawing.Size(68, 20); + this.tempHi2TextBox.TabIndex = 16; + // + // tempLo2TextBox + // + this.tempLo2TextBox.Enabled = false; + this.tempLo2TextBox.Location = new System.Drawing.Point(140, 228); + this.tempLo2TextBox.Name = "tempLo2TextBox"; + this.tempLo2TextBox.Size = new System.Drawing.Size(68, 20); + this.tempLo2TextBox.TabIndex = 15; + // + // pressHi3TextBox + // + this.pressHi3TextBox.Enabled = false; + this.pressHi3TextBox.Location = new System.Drawing.Point(380, 251); + this.pressHi3TextBox.Name = "pressHi3TextBox"; + this.pressHi3TextBox.Size = new System.Drawing.Size(68, 20); + this.pressHi3TextBox.TabIndex = 23; + // + // pressLo3TextBox + // + this.pressLo3TextBox.Enabled = false; + this.pressLo3TextBox.Location = new System.Drawing.Point(300, 251); + this.pressLo3TextBox.Name = "pressLo3TextBox"; + this.pressLo3TextBox.Size = new System.Drawing.Size(68, 20); + this.pressLo3TextBox.TabIndex = 22; + // + // tempHi3TextBox + // + this.tempHi3TextBox.Enabled = false; + this.tempHi3TextBox.Location = new System.Drawing.Point(220, 251); + this.tempHi3TextBox.Name = "tempHi3TextBox"; + this.tempHi3TextBox.Size = new System.Drawing.Size(68, 20); + this.tempHi3TextBox.TabIndex = 21; + // + // tempLo3TextBox + // + this.tempLo3TextBox.Enabled = false; + this.tempLo3TextBox.Location = new System.Drawing.Point(140, 251); + this.tempLo3TextBox.Name = "tempLo3TextBox"; + this.tempLo3TextBox.Size = new System.Drawing.Size(68, 20); + this.tempLo3TextBox.TabIndex = 20; + // + // pressHi4TextBox + // + this.pressHi4TextBox.Enabled = false; + this.pressHi4TextBox.Location = new System.Drawing.Point(380, 274); + this.pressHi4TextBox.Name = "pressHi4TextBox"; + this.pressHi4TextBox.Size = new System.Drawing.Size(68, 20); + this.pressHi4TextBox.TabIndex = 28; + // + // pressLo4TextBox + // + this.pressLo4TextBox.Enabled = false; + this.pressLo4TextBox.Location = new System.Drawing.Point(300, 274); + this.pressLo4TextBox.Name = "pressLo4TextBox"; + this.pressLo4TextBox.Size = new System.Drawing.Size(68, 20); + this.pressLo4TextBox.TabIndex = 27; + // + // tempHi4TextBox + // + this.tempHi4TextBox.Enabled = false; + this.tempHi4TextBox.Location = new System.Drawing.Point(220, 274); + this.tempHi4TextBox.Name = "tempHi4TextBox"; + this.tempHi4TextBox.Size = new System.Drawing.Size(68, 20); + this.tempHi4TextBox.TabIndex = 26; + // + // tempLo4TextBox + // + this.tempLo4TextBox.Enabled = false; + this.tempLo4TextBox.Location = new System.Drawing.Point(140, 274); + this.tempLo4TextBox.Name = "tempLo4TextBox"; + this.tempLo4TextBox.Size = new System.Drawing.Size(68, 20); + this.tempLo4TextBox.TabIndex = 25; + // + // pressHi5TextBox + // + this.pressHi5TextBox.Enabled = false; + this.pressHi5TextBox.Location = new System.Drawing.Point(380, 297); + this.pressHi5TextBox.Name = "pressHi5TextBox"; + this.pressHi5TextBox.Size = new System.Drawing.Size(68, 20); + this.pressHi5TextBox.TabIndex = 33; + // + // pressLo5TextBox + // + this.pressLo5TextBox.Enabled = false; + this.pressLo5TextBox.Location = new System.Drawing.Point(300, 297); + this.pressLo5TextBox.Name = "pressLo5TextBox"; + this.pressLo5TextBox.Size = new System.Drawing.Size(68, 20); + this.pressLo5TextBox.TabIndex = 32; + // + // tempHi5TextBox + // + this.tempHi5TextBox.Enabled = false; + this.tempHi5TextBox.Location = new System.Drawing.Point(220, 297); + this.tempHi5TextBox.Name = "tempHi5TextBox"; + this.tempHi5TextBox.Size = new System.Drawing.Size(68, 20); + this.tempHi5TextBox.TabIndex = 31; + // + // tempLo5TextBox + // + this.tempLo5TextBox.Enabled = false; + this.tempLo5TextBox.Location = new System.Drawing.Point(140, 297); + this.tempLo5TextBox.Name = "tempLo5TextBox"; + this.tempLo5TextBox.Size = new System.Drawing.Size(68, 20); + this.tempLo5TextBox.TabIndex = 30; + // + // rangeCheckBox1 + // + this.rangeCheckBox1.AutoSize = true; + this.rangeCheckBox1.CheckAlign = System.Drawing.ContentAlignment.MiddleRight; + this.rangeCheckBox1.Enabled = false; + this.rangeCheckBox1.Location = new System.Drawing.Point(32, 207); + this.rangeCheckBox1.Name = "rangeCheckBox1"; + this.rangeCheckBox1.Size = new System.Drawing.Size(67, 17); + this.rangeCheckBox1.TabIndex = 34; + this.rangeCheckBox1.Text = "Range 1"; + this.rangeCheckBox1.UseVisualStyleBackColor = true; + this.rangeCheckBox1.CheckedChanged += new System.EventHandler(this.rangeCheckBox1_CheckedChanged); + // + // rangeCheckBox2 + // + this.rangeCheckBox2.AutoSize = true; + this.rangeCheckBox2.CheckAlign = System.Drawing.ContentAlignment.MiddleRight; + this.rangeCheckBox2.Enabled = false; + this.rangeCheckBox2.Location = new System.Drawing.Point(32, 230); + this.rangeCheckBox2.Name = "rangeCheckBox2"; + this.rangeCheckBox2.Size = new System.Drawing.Size(67, 17); + this.rangeCheckBox2.TabIndex = 35; + this.rangeCheckBox2.Text = "Range 2"; + this.rangeCheckBox2.UseVisualStyleBackColor = true; + this.rangeCheckBox2.CheckedChanged += new System.EventHandler(this.rangeCheckBox2_CheckedChanged); + // + // rangeCheckBox3 + // + this.rangeCheckBox3.AutoSize = true; + this.rangeCheckBox3.CheckAlign = System.Drawing.ContentAlignment.MiddleRight; + this.rangeCheckBox3.Enabled = false; + this.rangeCheckBox3.Location = new System.Drawing.Point(32, 253); + this.rangeCheckBox3.Name = "rangeCheckBox3"; + this.rangeCheckBox3.Size = new System.Drawing.Size(67, 17); + this.rangeCheckBox3.TabIndex = 36; + this.rangeCheckBox3.Text = "Range 3"; + this.rangeCheckBox3.UseVisualStyleBackColor = true; + this.rangeCheckBox3.CheckedChanged += new System.EventHandler(this.rangeCheckBox3_CheckedChanged); + // + // rangeCheckBox4 + // + this.rangeCheckBox4.AutoSize = true; + this.rangeCheckBox4.CheckAlign = System.Drawing.ContentAlignment.MiddleRight; + this.rangeCheckBox4.Enabled = false; + this.rangeCheckBox4.Location = new System.Drawing.Point(32, 276); + this.rangeCheckBox4.Name = "rangeCheckBox4"; + this.rangeCheckBox4.Size = new System.Drawing.Size(67, 17); + this.rangeCheckBox4.TabIndex = 37; + this.rangeCheckBox4.Text = "Range 4"; + this.rangeCheckBox4.UseVisualStyleBackColor = true; + this.rangeCheckBox4.CheckedChanged += new System.EventHandler(this.rangeCheckBox4_CheckedChanged); + // + // rangeCheckBox5 + // + this.rangeCheckBox5.AutoSize = true; + this.rangeCheckBox5.CheckAlign = System.Drawing.ContentAlignment.MiddleRight; + this.rangeCheckBox5.Enabled = false; + this.rangeCheckBox5.Location = new System.Drawing.Point(32, 299); + this.rangeCheckBox5.Name = "rangeCheckBox5"; + this.rangeCheckBox5.Size = new System.Drawing.Size(67, 17); + this.rangeCheckBox5.TabIndex = 38; + this.rangeCheckBox5.Text = "Range 5"; + this.rangeCheckBox5.UseVisualStyleBackColor = true; + this.rangeCheckBox5.CheckedChanged += new System.EventHandler(this.rangeCheckBox5_CheckedChanged); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(149, 186); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(52, 13); + this.label1.TabIndex = 39; + this.label1.Text = "Temp. Lo"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(229, 186); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(50, 13); + this.label2.TabIndex = 40; + this.label2.Text = "Temp. Hi"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(309, 186); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(51, 13); + this.label3.TabIndex = 41; + this.label3.Text = "Press. Lo"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(389, 186); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(49, 13); + this.label4.TabIndex = 42; + this.label4.Text = "Press. Hi"; + // + // FlowMeterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.label4); + this.Controls.Add(this.label3); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.rangeCheckBox5); + this.Controls.Add(this.rangeCheckBox4); + this.Controls.Add(this.rangeCheckBox3); + this.Controls.Add(this.rangeCheckBox2); + this.Controls.Add(this.rangeCheckBox1); + this.Controls.Add(this.pressHi5TextBox); + this.Controls.Add(this.pressLo5TextBox); + this.Controls.Add(this.tempHi5TextBox); + this.Controls.Add(this.tempLo5TextBox); + this.Controls.Add(this.pressHi4TextBox); + this.Controls.Add(this.pressLo4TextBox); + this.Controls.Add(this.tempHi4TextBox); + this.Controls.Add(this.tempLo4TextBox); + this.Controls.Add(this.pressHi3TextBox); + this.Controls.Add(this.pressLo3TextBox); + this.Controls.Add(this.tempHi3TextBox); + this.Controls.Add(this.tempLo3TextBox); + this.Controls.Add(this.pressHi2TextBox); + this.Controls.Add(this.pressLo2TextBox); + this.Controls.Add(this.tempHi2TextBox); + this.Controls.Add(this.tempLo2TextBox); + this.Controls.Add(this.pressHi1TextBox); + this.Controls.Add(this.pressLo1TextBox); + this.Controls.Add(this.tempHi1TextBox); + this.Controls.Add(this.tempLo1TextBox); + this.Controls.Add(this.parentNameComboBox); + this.Controls.Add(this.nominalFlowTextBox); + this.Controls.Add(this.nominalFlowLabel); + this.Controls.Add(this.positionTextBox); + this.Controls.Add(this.positionLabel); + this.Controls.Add(this.parentNameLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "FlowMeterCfgCtrl"; + this.Size = new System.Drawing.Size(492, 350); + this.Load += new System.EventHandler(this.FlowMeterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox positionTextBox; + private System.Windows.Forms.Label positionLabel; + private System.Windows.Forms.Label parentNameLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.TextBox nominalFlowTextBox; + private System.Windows.Forms.Label nominalFlowLabel; + private System.Windows.Forms.ComboBox parentNameComboBox; + private System.Windows.Forms.TextBox tempLo1TextBox; + private System.Windows.Forms.TextBox tempHi1TextBox; + private System.Windows.Forms.TextBox pressLo1TextBox; + private System.Windows.Forms.TextBox pressHi1TextBox; + private System.Windows.Forms.TextBox pressHi2TextBox; + private System.Windows.Forms.TextBox pressLo2TextBox; + private System.Windows.Forms.TextBox tempHi2TextBox; + private System.Windows.Forms.TextBox tempLo2TextBox; + private System.Windows.Forms.TextBox pressHi3TextBox; + private System.Windows.Forms.TextBox pressLo3TextBox; + private System.Windows.Forms.TextBox tempHi3TextBox; + private System.Windows.Forms.TextBox tempLo3TextBox; + private System.Windows.Forms.TextBox pressHi4TextBox; + private System.Windows.Forms.TextBox pressLo4TextBox; + private System.Windows.Forms.TextBox tempHi4TextBox; + private System.Windows.Forms.TextBox tempLo4TextBox; + private System.Windows.Forms.TextBox pressHi5TextBox; + private System.Windows.Forms.TextBox pressLo5TextBox; + private System.Windows.Forms.TextBox tempHi5TextBox; + private System.Windows.Forms.TextBox tempLo5TextBox; + private System.Windows.Forms.CheckBox rangeCheckBox1; + private System.Windows.Forms.CheckBox rangeCheckBox2; + private System.Windows.Forms.CheckBox rangeCheckBox3; + private System.Windows.Forms.CheckBox rangeCheckBox4; + private System.Windows.Forms.CheckBox rangeCheckBox5; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label4; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeter/FlowMeterCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeter/FlowMeterCfgCtrl.cs new file mode 100644 index 00000000..674bf245 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeter/FlowMeterCfgCtrl.cs @@ -0,0 +1,345 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.Globalization; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Configs; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.FlowMeter +{ + public partial class FlowMeterCfgCtrl : ConfigCtrlUtils, IComponentCfgCtrl + { + ComponentParametersDlg parent; + + public bool ShowMore { get { return false; } } + + FlowMeterCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as FlowMeterCfg; + Redraw(); + } + } + + + public FlowMeterCfgCtrl() + { + InitializeComponent(); + } + + private void FlowMeterCfgCtrl_Load(object sender, EventArgs e) + { + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + + if (parent.TbfComponents != null) + { + foreach (var cmpnt in parent.TbfComponents) + { + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is Elde.ControlBoardFactory) + { + parentNameComboBox.Items.Add(cmpnt.Name); + } + } + } + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + parentNameComboBox.Text = string.IsNullOrEmpty(config.ParentName) ? "---" : config.ParentName; + positionTextBox.Text = config.Idx1.ToString(); + nominalFlowTextBox.Text = config.NominalFlow.ToString(); + + rangeCheckBox1.Checked = config.RangeEnabled(1); + tempLo1TextBox.Text = config.Temp1Lo.ToString(); + tempHi1TextBox.Text = config.Temp1Hi.ToString(); + pressLo1TextBox.Text = config.Press1Lo.ToString(); + pressHi1TextBox.Text = config.Press1Hi.ToString(); + + rangeCheckBox2.Checked = config.RangeEnabled(2); + tempLo2TextBox.Text = config.Temp2Lo.ToString(); + tempHi2TextBox.Text = config.Temp2Hi.ToString(); + pressLo2TextBox.Text = config.Press2Lo.ToString(); + pressHi2TextBox.Text = config.Press2Hi.ToString(); + + rangeCheckBox3.Checked = config.RangeEnabled(3); + tempLo3TextBox.Text = config.Temp3Lo.ToString(); + tempHi3TextBox.Text = config.Temp3Hi.ToString(); + pressLo3TextBox.Text = config.Press3Lo.ToString(); + pressHi3TextBox.Text = config.Press3Hi.ToString(); + + rangeCheckBox4.Checked = config.RangeEnabled(4); + tempLo4TextBox.Text = config.Temp4Lo.ToString(); + tempHi4TextBox.Text = config.Temp4Hi.ToString(); + pressLo4TextBox.Text = config.Press4Lo.ToString(); + pressHi4TextBox.Text = config.Press4Hi.ToString(); + + rangeCheckBox5.Checked = config.RangeEnabled(5); + tempLo5TextBox.Text = config.Temp5Lo.ToString(); + tempHi5TextBox.Text = config.Temp5Hi.ToString(); + pressLo5TextBox.Text = config.Press5Lo.ToString(); + pressHi5TextBox.Text = config.Press5Hi.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + parentNameComboBox.Enabled = true; + positionTextBox.Enabled = true; + nominalFlowTextBox.Enabled = true; + + rangeCheckBox1.Enabled = true; + tempLo1TextBox.Enabled = rangeCheckBox1.Checked; + tempHi1TextBox.Enabled = rangeCheckBox1.Checked; + pressLo1TextBox.Enabled = rangeCheckBox1.Checked; + pressHi1TextBox.Enabled = rangeCheckBox1.Checked; + + rangeCheckBox2.Enabled = true; + tempLo2TextBox.Enabled = rangeCheckBox2.Checked; + tempHi2TextBox.Enabled = rangeCheckBox2.Checked; + pressLo2TextBox.Enabled = rangeCheckBox2.Checked; + pressHi2TextBox.Enabled = rangeCheckBox2.Checked; + + rangeCheckBox3.Enabled = true; + tempLo3TextBox.Enabled = rangeCheckBox3.Checked; + tempHi3TextBox.Enabled = rangeCheckBox3.Checked; + pressLo3TextBox.Enabled = rangeCheckBox3.Checked; + pressHi3TextBox.Enabled = rangeCheckBox3.Checked; + + rangeCheckBox4.Enabled = true; + tempLo4TextBox.Enabled = rangeCheckBox4.Checked; + tempHi4TextBox.Enabled = rangeCheckBox4.Checked; + pressLo4TextBox.Enabled = rangeCheckBox4.Checked; + pressHi4TextBox.Enabled = rangeCheckBox4.Checked; + + rangeCheckBox5.Enabled = true; + tempLo5TextBox.Enabled = rangeCheckBox5.Checked; + tempHi5TextBox.Enabled = rangeCheckBox5.Checked; + pressLo5TextBox.Enabled = rangeCheckBox5.Checked; + pressHi5TextBox.Enabled = rangeCheckBox5.Checked; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!parentNameComboBox.Items.Contains(parentNameComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Parent Name'"; + } +#if MALTA_WSD25 + if (!int.TryParse(positionTextBox.Text, out dummy) || dummy < 0 || dummy > 8) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Idx1' should be between 0 and 8"; + } +#else + if (!int.TryParse(positionTextBox.Text, out dummy) || dummy < 1 || dummy > 7) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Idx1' should be between 1 and 7"; + } +#endif + float fdummy; + if (!Utils.TryParseUFloat(nominalFlowTextBox.Text, out fdummy) || fdummy < 0.01 || fdummy > 1600) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Nominal flow' should be between 0.01 and 1600"; + } + + double ddummy; + if (rangeCheckBox1.Checked) + { + if (!Utils.TryParseUDouble(tempLo1TextBox.Text, out ddummy) || !Utils.TryParseUDouble(tempHi1TextBox.Text, out ddummy) || + !Utils.TryParseUDouble(pressLo1TextBox.Text, out ddummy) || !Utils.TryParseUDouble(pressHi1TextBox.Text, out ddummy)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Ivalid 'Range 1'"; + } + } + if (rangeCheckBox2.Checked) + { + if (!Utils.TryParseUDouble(tempLo2TextBox.Text, out ddummy) || !Utils.TryParseUDouble(tempHi2TextBox.Text, out ddummy) || + !Utils.TryParseUDouble(pressLo2TextBox.Text, out ddummy) || !Utils.TryParseUDouble(pressHi2TextBox.Text, out ddummy)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Ivalid 'Range 2'"; + } + } + if (rangeCheckBox3.Checked) + { + if (!Utils.TryParseUDouble(tempLo3TextBox.Text, out ddummy) || !Utils.TryParseUDouble(tempHi3TextBox.Text, out ddummy) || + !Utils.TryParseUDouble(pressLo3TextBox.Text, out ddummy) || !Utils.TryParseUDouble(pressHi3TextBox.Text, out ddummy)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Ivalid 'Range 3'"; + } + } + if (rangeCheckBox4.Checked) + { + if (!Utils.TryParseUDouble(tempLo4TextBox.Text, out ddummy) || !Utils.TryParseUDouble(tempHi4TextBox.Text, out ddummy) || + !Utils.TryParseUDouble(pressLo4TextBox.Text, out ddummy) || !Utils.TryParseUDouble(pressHi4TextBox.Text, out ddummy)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Ivalid 'Range 4'"; + } + } + if (rangeCheckBox5.Checked) + { + if (!Utils.TryParseUDouble(tempLo5TextBox.Text, out ddummy) || !Utils.TryParseUDouble(tempHi5TextBox.Text, out ddummy) || + !Utils.TryParseUDouble(pressLo5TextBox.Text, out ddummy) || !Utils.TryParseUDouble(pressHi5TextBox.Text, out ddummy)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Ivalid 'Range 5'"; + } + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + if (config.Name != nameTextBox.Text) + { + config.Name = nameTextBox.Text; + flags |= (CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + } + + string parentName = parentNameComboBox.Text.Equals("---") ? string.Empty : parentNameComboBox.Text; + if (config.ParentName != parentName) + { + config.ParentName = parentName; + flags |= (CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + } + + flags |= UpdateDifferent(ref config.Idx1, positionTextBox.Text, CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.NominalFlow, nominalFlowTextBox.Text, CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + + if (rangeCheckBox1.Checked) + { + flags |= UpdateDifferent(ref config.Temp1Lo, tempLo1TextBox.Text, CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.Temp1Hi, tempHi1TextBox.Text, CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.Press1Lo, pressLo1TextBox.Text, CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.Press1Hi, pressHi1TextBox.Text, CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + } + else + { + flags |= UpdateDifferent(ref config.Temp1Lo, "0", CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.Temp1Hi, "0", CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.Press1Lo, "0", CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.Press1Hi, "0", CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + } + + if (rangeCheckBox2.Checked) + { + flags |= UpdateDifferent(ref config.Temp2Lo, tempLo2TextBox.Text, CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.Temp2Hi, tempHi2TextBox.Text, CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.Press2Lo, pressLo2TextBox.Text, CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.Press2Hi, pressHi2TextBox.Text, CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + } + else + { + flags |= UpdateDifferent(ref config.Temp2Lo, "0", CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.Temp2Hi, "0", CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.Press2Lo, "0", CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.Press2Hi, "0", CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + } + + if (rangeCheckBox3.Checked) + { + flags |= UpdateDifferent(ref config.Temp3Lo, tempLo3TextBox.Text, CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.Temp3Hi, tempHi3TextBox.Text, CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.Press3Lo, pressLo3TextBox.Text, CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.Press3Hi, pressHi3TextBox.Text, CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + } + else + { + flags |= UpdateDifferent(ref config.Temp3Lo, "0", CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.Temp3Hi, "0", CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.Press3Lo, "0", CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.Press3Hi, "0", CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + } + + if (rangeCheckBox4.Checked) + { + flags |= UpdateDifferent(ref config.Temp4Lo, tempLo4TextBox.Text, CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.Temp4Hi, tempHi4TextBox.Text, CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.Press4Lo, pressLo4TextBox.Text, CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.Press4Hi, pressHi4TextBox.Text, CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + } + else + { + flags |= UpdateDifferent(ref config.Temp4Lo, "0", CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.Temp4Hi, "0", CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.Press4Lo, "0", CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.Press4Hi, "0", CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + } + + if (rangeCheckBox5.Checked) + { + flags |= UpdateDifferent(ref config.Temp5Lo, tempLo5TextBox.Text, CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.Temp5Hi, tempHi5TextBox.Text, CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.Press5Lo, pressLo5TextBox.Text, CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.Press5Hi, pressHi5TextBox.Text, CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + } + else + { + flags |= UpdateDifferent(ref config.Temp5Lo, "0", CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.Temp5Hi, "0", CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.Press5Lo, "0", CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.Press5Hi, "0", CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + } + + return flags; + } + + + private void rangeCheckBox1_CheckedChanged(object sender, EventArgs e) + { + tempLo1TextBox.Enabled = tempHi1TextBox.Enabled = pressLo1TextBox.Enabled = pressHi1TextBox.Enabled = + (rangeCheckBox1.Enabled && rangeCheckBox1.Checked); + } + private void rangeCheckBox2_CheckedChanged(object sender, EventArgs e) + { + tempLo2TextBox.Enabled = tempHi2TextBox.Enabled = pressLo2TextBox.Enabled = pressHi2TextBox.Enabled = + (rangeCheckBox2.Enabled && rangeCheckBox2.Checked); + } + private void rangeCheckBox3_CheckedChanged(object sender, EventArgs e) + { + tempLo3TextBox.Enabled = tempHi3TextBox.Enabled = pressLo3TextBox.Enabled = pressHi3TextBox.Enabled = + (rangeCheckBox3.Enabled && rangeCheckBox3.Checked); + } + private void rangeCheckBox4_CheckedChanged(object sender, EventArgs e) + { + tempLo4TextBox.Enabled = tempHi4TextBox.Enabled = pressLo4TextBox.Enabled = pressHi4TextBox.Enabled = + (rangeCheckBox4.Enabled && rangeCheckBox4.Checked); + } + private void rangeCheckBox5_CheckedChanged(object sender, EventArgs e) + { + tempLo5TextBox.Enabled = tempHi5TextBox.Enabled = pressLo5TextBox.Enabled = pressHi5TextBox.Enabled = + (rangeCheckBox5.Enabled && rangeCheckBox5.Checked); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeter/FlowMeterCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeter/FlowMeterCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeter/FlowMeterCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeter/FlowMeterFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeter/FlowMeterFactory.cs new file mode 100644 index 00000000..c43f1ae1 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeter/FlowMeterFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.FlowMeter +{ + public class FlowMeterFactory : IComponentFactory + { + public string ClassName { get { return "FlowMeter"; } } + + public void ResetStaticProperties() { FlowMeter.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new FlowMeter(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new FlowMeter(cfg, components); } + + public IComponentCfg DefaultConfig() { return new FlowMeterCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(FlowMeterCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTriplet/FlowMeter.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTriplet/FlowMeter.cs new file mode 100644 index 00000000..dc2a9df2 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTriplet/FlowMeter.cs @@ -0,0 +1,75 @@ +/// +/// Copyright (c) 2017-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.Boxes; + +namespace TBF.BenchControl.Elde.FlowMeterTriplet +{ + public class FlowMeter : ComponentBase, GenericDevices.IFlowMeter + { + private static readonly ILog log = LogManager.GetLogger(typeof(FlowMeter)); + public override string ToString() { return string.Format("FlowMeter({0})", Cfg.ToString(1)); } + + readonly FlowMeterCfg flowMeterCfg; + readonly ControlBoardDev controlBoard; + + public int Idx1 { get { return flowMeterCfg.Idx1; } } + public float NominalFlow { get { return flowMeterCfg.NominalFlow; } } + public float LtrPerPulse { get { return flowMeterCfg.NominalFlow / 21600.0f; } } /// Nominal frequency is 6000 Hz + + public float LtrPerPulseCorrected(double flow, int rangeIx) + { + if (flow < 0.1 * NominalFlow) return LtrPerPulse; /// No correction for small flow + + /// Apply correction + double correctedFlow = Config.Formulas.CorrectedValue(flow, Corrections); + return (float)(LtrPerPulse * correctedFlow / flow); + } + + public FlowMeter() + { + } + + public FlowMeter(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + flowMeterCfg = cfg as FlowMeterCfg; + + controlBoard = (ControlBoardDev)TbfComponents.FindComponent(cfg.ParentName, components); + if (controlBoard == null) throw new Exception("Cannot find " + Name + " parent"); + + /// Prepare data for SendCalibData() control board component method + if (Idx1 >= controlBoard.EtCalib.Length) throw new Exception("Flowmeter " + Name + " parameter 'Idx1' is out of range"); + controlBoard.EtCalib[Idx1] = flowMeterCfg.NominalFlow; + + log.Debug(this.ToString()); + } + + public double ReadFlow() { return controlBoard.ReferenceFlow; } + public double ReadFrequency() { return controlBoard.ReferenceFreq; } + + /// + /// Events: FlowDone, Error + /// + /// Reference to a variable for the flow in Bar + /// ReadFlowOp instance reference casted to IOperaton + public IOperation ReadFlowOp(ref DoubleBox flow) + { + return new ReadFlowOp(this, controlBoard, ref flow); + } + + /// + /// Events: flowDone, Error + /// + /// Reference to a variable for the flow in Bar + /// Event returned when measurement done + /// ReadFlowOp instance reference casted to IOperaton + public IOperation ReadFlowOp(ref DoubleBox flow, Event flowDone) + { + return new ReadFlowOp(this, controlBoard, ref flow, flowDone); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTriplet/FlowMeterCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTriplet/FlowMeterCfg.cs new file mode 100644 index 00000000..91f42115 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTriplet/FlowMeterCfg.cs @@ -0,0 +1,50 @@ +/// +/// Copyright (c) 2017-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.FlowMeterTriplet +{ + public class FlowMeterCfg : ComponentCfgBase, IChildComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(FlowMeterCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new FlowMeterCfgCtrl(); } + + /// + /// Serialized parameters + /// + public int Idx1; /// 1..7 + public float NominalFlow; /// Nominal flow in m3/h at output frequency 6000 Hz (= 3 * 2000 Hz) + + + /// Private parameterless constructor invoked by all other (public) constructors + FlowMeterCfg() + { + Name = "FlowMeter"; + ParentName = "CB"; + Idx1 = 1; + NominalFlow = 1; + } + + public FlowMeterCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Parent={1}, Idx1={2}, NominalFlow={3}", + Name, + (string.IsNullOrEmpty(ParentName) ? "-" : ParentName), + Idx1, + NominalFlow); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTriplet/FlowMeterCfgCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTriplet/FlowMeterCfgCtrl.Designer.cs new file mode 100644 index 00000000..13736d72 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTriplet/FlowMeterCfgCtrl.Designer.cs @@ -0,0 +1,156 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// +namespace TBF.BenchControl.Elde.FlowMeterTriplet +{ + partial class FlowMeterCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.positionTextBox = new System.Windows.Forms.TextBox(); + this.positionLabel = new System.Windows.Forms.Label(); + this.parentNameLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.nominalFlowTextBox = new System.Windows.Forms.TextBox(); + this.nominalFlowLabel = new System.Windows.Forms.Label(); + this.parentNameComboBox = new System.Windows.Forms.ComboBox(); + this.SuspendLayout(); + // + // positionTextBox + // + this.positionTextBox.Enabled = false; + this.positionTextBox.Location = new System.Drawing.Point(224, 113); + this.positionTextBox.Name = "positionTextBox"; + this.positionTextBox.Size = new System.Drawing.Size(46, 20); + this.positionTextBox.TabIndex = 6; + // + // positionLabel + // + this.positionLabel.AutoSize = true; + this.positionLabel.Location = new System.Drawing.Point(30, 116); + this.positionLabel.Name = "positionLabel"; + this.positionLabel.Size = new System.Drawing.Size(44, 13); + this.positionLabel.TabIndex = 5; + this.positionLabel.Text = "Position"; + // + // parentNameLabel + // + this.parentNameLabel.AutoSize = true; + this.parentNameLabel.Location = new System.Drawing.Point(30, 90); + this.parentNameLabel.Name = "parentNameLabel"; + this.parentNameLabel.Size = new System.Drawing.Size(69, 13); + this.parentNameLabel.TabIndex = 3; + this.parentNameLabel.Text = "Parent Name"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(140, 61); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(30, 64); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(137, 37); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // nominalFlowTextBox + // + this.nominalFlowTextBox.Enabled = false; + this.nominalFlowTextBox.Location = new System.Drawing.Point(224, 138); + this.nominalFlowTextBox.Name = "nominalFlowTextBox"; + this.nominalFlowTextBox.Size = new System.Drawing.Size(46, 20); + this.nominalFlowTextBox.TabIndex = 8; + // + // nominalFlowLabel + // + this.nominalFlowLabel.AutoSize = true; + this.nominalFlowLabel.Location = new System.Drawing.Point(30, 141); + this.nominalFlowLabel.Name = "nominalFlowLabel"; + this.nominalFlowLabel.Size = new System.Drawing.Size(174, 13); + this.nominalFlowLabel.TabIndex = 7; + this.nominalFlowLabel.Text = "Nominal flow (=sum) [m3/h @6kHz]"; + // + // parentNameComboBox + // + this.parentNameComboBox.Enabled = false; + this.parentNameComboBox.FormattingEnabled = true; + this.parentNameComboBox.Location = new System.Drawing.Point(140, 87); + this.parentNameComboBox.Name = "parentNameComboBox"; + this.parentNameComboBox.Size = new System.Drawing.Size(130, 21); + this.parentNameComboBox.TabIndex = 4; + // + // FlowMeterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.parentNameComboBox); + this.Controls.Add(this.nominalFlowTextBox); + this.Controls.Add(this.nominalFlowLabel); + this.Controls.Add(this.positionTextBox); + this.Controls.Add(this.positionLabel); + this.Controls.Add(this.parentNameLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "FlowMeterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.FlowMeterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox positionTextBox; + private System.Windows.Forms.Label positionLabel; + private System.Windows.Forms.Label parentNameLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.TextBox nominalFlowTextBox; + private System.Windows.Forms.Label nominalFlowLabel; + private System.Windows.Forms.ComboBox parentNameComboBox; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTriplet/FlowMeterCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTriplet/FlowMeterCfgCtrl.cs new file mode 100644 index 00000000..a3e9dcf1 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTriplet/FlowMeterCfgCtrl.cs @@ -0,0 +1,122 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// +using System; +using System.Globalization; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.FlowMeterTriplet +{ + public partial class FlowMeterCfgCtrl : UserControl, IComponentCfgCtrl + { + ComponentParametersDlg parent; + + public bool ShowMore { get { return false; } } + + FlowMeterCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as FlowMeterCfg; + Redraw(); + } + } + + public FlowMeterCfgCtrl() + { + InitializeComponent(); + } + + private void FlowMeterCfgCtrl_Load(object sender, EventArgs e) + { + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + + if (parent.TbfComponents != null) + { + foreach (var cmpnt in parent.TbfComponents) + { + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is Elde.ControlBoardFactory) + { + parentNameComboBox.Items.Add(cmpnt.Name); + } + } + } + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + parentNameComboBox.Text = string.IsNullOrEmpty(config.ParentName) ? "---" : config.ParentName; + positionTextBox.Text = config.Idx1.ToString(); + nominalFlowTextBox.Text = config.NominalFlow.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + parentNameComboBox.Enabled = true; + positionTextBox.Enabled = true; + nominalFlowTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!parentNameComboBox.Items.Contains(parentNameComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Parent Name'"; + } +#if MALTA_WSD25 + if (!int.TryParse(positionTextBox.Text, out dummy) || dummy < 0 || dummy > 8) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Idx1' should be between 0 and 8"; + } +#else + if (!int.TryParse(positionTextBox.Text, out dummy) || dummy < 1 || dummy > 7) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Idx1' should be between 1 and 7"; + } +#endif + float fdummy; + if (!Utils.TryParseUFloat(nominalFlowTextBox.Text, out fdummy) || fdummy < 0.01 || fdummy > 1600) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Nominal flow' should be between 0.01 and 1600"; + } + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.ParentName = parentNameComboBox.Text.Equals("---") ? string.Empty : parentNameComboBox.Text; + config.Idx1 = int.Parse(positionTextBox.Text); + Utils.TryParseUFloat(nominalFlowTextBox.Text, out config.NominalFlow); + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTriplet/FlowMeterCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTriplet/FlowMeterCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTriplet/FlowMeterCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTriplet/FlowMeterFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTriplet/FlowMeterFactory.cs new file mode 100644 index 00000000..ef0cb671 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTriplet/FlowMeterFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.FlowMeterTriplet +{ + public class FlowMeterFactory : IComponentFactory + { + public string ClassName { get { return "FlowMeterTriplet"; } } + + public void ResetStaticProperties() { FlowMeter.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new FlowMeter(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new FlowMeter(cfg, components); } + + public IComponentCfg DefaultConfig() { return new FlowMeterCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(FlowMeterCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTwins/FlowMeter.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTwins/FlowMeter.cs new file mode 100644 index 00000000..97ba2f7b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTwins/FlowMeter.cs @@ -0,0 +1,84 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.Boxes; + +namespace TBF.BenchControl.Elde.FlowMeterTwins +{ + public class FlowMeter : ComponentBase, GenericDevices.IFlowMeter + { + private static readonly ILog log = LogManager.GetLogger(typeof(FlowMeter)); + public override string ToString() { return string.Format("FlowMeterTwins({0})", Cfg.ToString(1)); } + + readonly FlowMeterCfg flowMeterCfg; + readonly ControlBoardDev controlBoard; + public readonly TBF.BenchControl.Elde.FlowMeter.FlowMeter FlowMeter1; + public readonly TBF.BenchControl.Elde.FlowMeter.FlowMeter FlowMeter2; + + public int Idx1 { get { return 0; } } + public float NominalFlow { get { return flowMeterCfg.NominalFlow; } } + + /// The nominal flowed of a pair of flow meters is reached at 4000Hz + public float LtrPerPulse { get { return flowMeterCfg.NominalFlow / 14400.0f; } } + + /// Calculates the average of values of two flowmeters. Assumes the flow is divided evenly. + public float LtrPerPulseCorrected(double flow, int rangeIx) + { + double flow2 = flow / 2.0; + return (FlowMeter1.LtrPerPulseCorrected(flow2, rangeIx) + FlowMeter2.LtrPerPulseCorrected(flow2, rangeIx)) / 2; + } + + + public FlowMeter() + { + } + + public FlowMeter(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + flowMeterCfg = cfg as FlowMeterCfg; + + controlBoard = (ControlBoardDev)TbfComponents.FindComponent(cfg.ParentName, components); + if (controlBoard == null) throw new Exception("Cannot find " + Name + " parent"); + + FlowMeter1 = (TBF.BenchControl.Elde.FlowMeter.FlowMeter)TbfComponents.FindComponent(flowMeterCfg.FlowMeter1, components); + if (FlowMeter1 == null) throw new Exception("Cannot find FlowMeter1 component"); + + FlowMeter2 = (TBF.BenchControl.Elde.FlowMeter.FlowMeter)TbfComponents.FindComponent(flowMeterCfg.FlowMeter2, components); + if (FlowMeter2 == null) throw new Exception("Cannot find FlowMeter2 component"); + + controlBoard.EtCalib[Idx1] = flowMeterCfg.NominalFlow; /// Idx1==0 for FlowMeterTwins + + /// Prepare data for SendCalibData() control board component method + + log.Debug(this.ToString()); + } + + public double ReadFlow() { return controlBoard.ReferenceFlow; } + public double ReadFrequency() { return controlBoard.ReferenceFreq; } + + /// + /// Events: FlowDone, Error + /// + /// Reference to a variable for the flow in Bar + /// ReadFlowOp instance reference casted to IOperaton + public IOperation ReadFlowOp(ref DoubleBox flow) + { + return new ReadFlowOp(this, controlBoard, ref flow); + } + + /// + /// Events: flowDone, Error + /// + /// Reference to a variable for the flow in Bar + /// Event returned when measurement done + /// ReadFlowOp instance reference casted to IOperaton + public IOperation ReadFlowOp(ref DoubleBox flow, Event flowDone) + { + return new ReadFlowOp(this, controlBoard, ref flow, flowDone); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTwins/FlowMeterCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTwins/FlowMeterCfg.cs new file mode 100644 index 00000000..e040dd4e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTwins/FlowMeterCfg.cs @@ -0,0 +1,52 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.FlowMeterTwins +{ + public class FlowMeterCfg : ComponentCfgBase, Generic.IChildComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(FlowMeterCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new FlowMeterCfgCtrl(); } + + /// + /// Serialized parameters + /// + public float NominalFlow; /// Nominal flow in m3/h at output frequency 2000 Hz + public string FlowMeter1; /// Name of the flow meter 1 component + public string FlowMeter2; /// Name of the flow meter 2 component + + /// Private parameterless constructor invoked by all other (public) constructors + FlowMeterCfg() + { + Name = "FlowMeterTwins"; + ParentName = "CB"; + NominalFlow = 1600; + FlowMeter1 = string.Empty; + FlowMeter2 = string.Empty; + } + + public FlowMeterCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Parent={1}, NominalFlow={2}, Flowmeter1={3}, Flowmeter2={4}", + Name, + string.IsNullOrEmpty(ParentName) ? "-" : ParentName, + NominalFlow, + string.IsNullOrEmpty(FlowMeter1) ? "-" : FlowMeter1, + string.IsNullOrEmpty(FlowMeter2) ? "-" : FlowMeter2); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTwins/FlowMeterCfgCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTwins/FlowMeterCfgCtrl.Designer.cs new file mode 100644 index 00000000..d70f7b04 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTwins/FlowMeterCfgCtrl.Designer.cs @@ -0,0 +1,181 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.Elde.FlowMeterTwins +{ + partial class FlowMeterCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.parentNameLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.nominalFlowTextBox = new System.Windows.Forms.TextBox(); + this.nominalFlowLabel = new System.Windows.Forms.Label(); + this.parentNameComboBox = new System.Windows.Forms.ComboBox(); + this.flowMeter1ComboBox = new System.Windows.Forms.ComboBox(); + this.flowMeter1Label = new System.Windows.Forms.Label(); + this.flowMeter2ComboBox = new System.Windows.Forms.ComboBox(); + this.flowMeter2Label = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // parentNameLabel + // + this.parentNameLabel.AutoSize = true; + this.parentNameLabel.Location = new System.Drawing.Point(30, 72); + this.parentNameLabel.Name = "parentNameLabel"; + this.parentNameLabel.Size = new System.Drawing.Size(69, 13); + this.parentNameLabel.TabIndex = 3; + this.parentNameLabel.Text = "Parent Name"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(140, 43); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(30, 46); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(137, 19); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // nominalFlowTextBox + // + this.nominalFlowTextBox.Enabled = false; + this.nominalFlowTextBox.Location = new System.Drawing.Point(224, 150); + this.nominalFlowTextBox.Name = "nominalFlowTextBox"; + this.nominalFlowTextBox.Size = new System.Drawing.Size(46, 20); + this.nominalFlowTextBox.TabIndex = 10; + // + // nominalFlowLabel + // + this.nominalFlowLabel.AutoSize = true; + this.nominalFlowLabel.Location = new System.Drawing.Point(30, 153); + this.nominalFlowLabel.Name = "nominalFlowLabel"; + this.nominalFlowLabel.Size = new System.Drawing.Size(179, 13); + this.nominalFlowLabel.TabIndex = 9; + this.nominalFlowLabel.Text = "Sum of nominal flows [m3/h @4kHz]"; + // + // parentNameComboBox + // + this.parentNameComboBox.Enabled = false; + this.parentNameComboBox.FormattingEnabled = true; + this.parentNameComboBox.Location = new System.Drawing.Point(140, 69); + this.parentNameComboBox.Name = "parentNameComboBox"; + this.parentNameComboBox.Size = new System.Drawing.Size(130, 21); + this.parentNameComboBox.TabIndex = 4; + // + // flowMeter1ComboBox + // + this.flowMeter1ComboBox.Enabled = false; + this.flowMeter1ComboBox.FormattingEnabled = true; + this.flowMeter1ComboBox.Location = new System.Drawing.Point(140, 96); + this.flowMeter1ComboBox.Name = "flowMeter1ComboBox"; + this.flowMeter1ComboBox.Size = new System.Drawing.Size(130, 21); + this.flowMeter1ComboBox.TabIndex = 6; + // + // flowMeter1Label + // + this.flowMeter1Label.AutoSize = true; + this.flowMeter1Label.Location = new System.Drawing.Point(30, 99); + this.flowMeter1Label.Name = "flowMeter1Label"; + this.flowMeter1Label.Size = new System.Drawing.Size(68, 13); + this.flowMeter1Label.TabIndex = 5; + this.flowMeter1Label.Text = "Flow Meter 1"; + // + // flowMeter2ComboBox + // + this.flowMeter2ComboBox.Enabled = false; + this.flowMeter2ComboBox.FormattingEnabled = true; + this.flowMeter2ComboBox.Location = new System.Drawing.Point(140, 123); + this.flowMeter2ComboBox.Name = "flowMeter2ComboBox"; + this.flowMeter2ComboBox.Size = new System.Drawing.Size(130, 21); + this.flowMeter2ComboBox.TabIndex = 8; + // + // flowMeter2Label + // + this.flowMeter2Label.AutoSize = true; + this.flowMeter2Label.Location = new System.Drawing.Point(30, 126); + this.flowMeter2Label.Name = "flowMeter2Label"; + this.flowMeter2Label.Size = new System.Drawing.Size(68, 13); + this.flowMeter2Label.TabIndex = 7; + this.flowMeter2Label.Text = "Flow Meter 2"; + // + // FlowMeterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.flowMeter2ComboBox); + this.Controls.Add(this.flowMeter2Label); + this.Controls.Add(this.flowMeter1ComboBox); + this.Controls.Add(this.flowMeter1Label); + this.Controls.Add(this.parentNameComboBox); + this.Controls.Add(this.nominalFlowTextBox); + this.Controls.Add(this.nominalFlowLabel); + this.Controls.Add(this.parentNameLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "FlowMeterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.FlowMeterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label parentNameLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.TextBox nominalFlowTextBox; + private System.Windows.Forms.Label nominalFlowLabel; + private System.Windows.Forms.ComboBox parentNameComboBox; + private System.Windows.Forms.ComboBox flowMeter1ComboBox; + private System.Windows.Forms.Label flowMeter1Label; + private System.Windows.Forms.ComboBox flowMeter2ComboBox; + private System.Windows.Forms.Label flowMeter2Label; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTwins/FlowMeterCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTwins/FlowMeterCfgCtrl.cs new file mode 100644 index 00000000..9d117301 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTwins/FlowMeterCfgCtrl.cs @@ -0,0 +1,126 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Globalization; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.FlowMeterTwins +{ + public partial class FlowMeterCfgCtrl : UserControl, IComponentCfgCtrl + { + ComponentParametersDlg parentDlg; + + public bool ShowMore { get { return false; } } + + FlowMeterCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as FlowMeterCfg; + Redraw(); + } + } + + public FlowMeterCfgCtrl() + { + InitializeComponent(); + } + + private void FlowMeterCfgCtrl_Load(object sender, EventArgs e) + { + parentDlg = ParentForm as ComponentParametersDlg; + if (parentDlg == null) return; + + if (parentDlg.TbfComponents != null) + { + foreach (var cmpnt in parentDlg.TbfComponents) + { + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is Elde.ControlBoardFactory) + { + parentNameComboBox.Items.Add(cmpnt.Name); + } + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is Elde.FlowMeter.FlowMeterFactory) + { + flowMeter1ComboBox.Items.Add(cmpnt.Name); + flowMeter2ComboBox.Items.Add(cmpnt.Name); + } + } + } + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + parentNameComboBox.Text = string.IsNullOrEmpty(config.ParentName) ? "---" : config.ParentName; + flowMeter1ComboBox.Text = string.IsNullOrEmpty(config.FlowMeter1) ? "---" : config.FlowMeter1; + flowMeter2ComboBox.Text = string.IsNullOrEmpty(config.FlowMeter2) ? "---" : config.FlowMeter2; + nominalFlowTextBox.Text = config.NominalFlow.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + parentNameComboBox.Enabled = true; + flowMeter1ComboBox.Enabled = true; + flowMeter2ComboBox.Enabled = true; + nominalFlowTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (!parentNameComboBox.Items.Contains(parentNameComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Parent Name'"; + } + if (!flowMeter1ComboBox.Items.Contains(flowMeter1ComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Flow Meter 1'"; + } + if (!flowMeter2ComboBox.Items.Contains(flowMeter2ComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Flow Meter 2'"; + } + float fdummy; + if (!Utils.TryParseUFloat(nominalFlowTextBox.Text, out fdummy) || fdummy < 0.2 || fdummy > 1600) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Nominal flow' should be between 0.2 and 1600"; + } + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.ParentName = parentNameComboBox.Text.Equals("---") ? string.Empty : parentNameComboBox.Text; + config.FlowMeter1 = flowMeter1ComboBox.Text.Equals("---") ? string.Empty : flowMeter1ComboBox.Text; + config.FlowMeter2 = flowMeter2ComboBox.Text.Equals("---") ? string.Empty : flowMeter2ComboBox.Text; + Utils.TryParseUFloat(nominalFlowTextBox.Text, out config.NominalFlow); + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTwins/FlowMeterCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTwins/FlowMeterCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTwins/FlowMeterCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTwins/FlowMeterFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTwins/FlowMeterFactory.cs new file mode 100644 index 00000000..c81361ae --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/FlowMeterTwins/FlowMeterFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.FlowMeterTwins +{ + public class FlowMeterFactory : IComponentFactory + { + public string ClassName { get { return "FlowMeterTwins"; } } + + public void ResetStaticProperties() { FlowMeter.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new FlowMeter(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new FlowMeter(cfg, components); } + + public IComponentCfg DefaultConfig() { return new FlowMeterCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(FlowMeterCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/IControlCom.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/IControlCom.cs new file mode 100644 index 00000000..54d850b4 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/IControlCom.cs @@ -0,0 +1,85 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using Dirichlet.Numerics; + +namespace TBF.BenchControl.Elde +{ + interface IControlCom + { + StatusP StatusP { get; } + float ReferenceFreq { get; } + int EtPulses(int wmNr1); + int EtPulsesK { get; } + UInt16 WMeterPulses(int wmNr1); + int WMeterReference(int wmNr0); + uint RegulValveDAC { get; } + float Pressure(int prsNr0); + float Temperature(int tmpNr0); + RegulValveState RegulValveState(int rvNr1); + UInt128 RRoute { get; } + uint DivTime(int id); /// 50% id=0, 10% id=1, 90% id=2 + float TTime { get; } + float ImpulseTime(int WMNr1); + uint FmState { get; } + uint BeginState(int wmNr0); + float ReferenceFlow { get; } + float RValvePosition(int rvNr1); + float DivSamples(int time, int divIx0); /// time unit is 2 ms + int ScopeSamples(int i, int j, int k); + ulong DigitalInputs { get; } + float AnalogInput(int adcNr0); + uint AnalogInputRaw(int adcNr0, int bank); + float TotalRefVolume { get; } + float VyslExt(int wmNr0, int what); + void SetWeight(int pos, double mass); + uint[] CyclePar { get; set; } + uint[] WMeterCont { get; } + bool ManualUIAllowed { get; set; } + float ValveOpenCloseTime { get; } + void SetDivLimit(int divNr, uint limLoPct, uint limHiPct); + + void SetReservoirTemp(int nr, float temp); + + /// + /// Sends calibration and configuration data to the control board. + /// + /// Regulating valves calib.coefs, ix1 = valve nr. (1..5), ix2 = coef.nr. (0..1), values typ. c0 = 0, c1 = 0.2 + /// Meret address, index = 0..1, value typ. 99 and 100 + /// COM port number of the control board (typ. 1) + /// Temp.calc.coefs, ix1 = temp.sens.nr. (0..7 ???), ix2 = coef.nr + /// Etalon nominal values + /// Percentages for switching of diverters, ix = diverter nr.(0,1), typ.value 50 (%) + void SendCalibData(uint[,] rvCalib, byte[] meretA, int usedCom, float[,] tempCalib, float[] etCalib, uint[] divEdge, uint[] balanceRange); + + /// + /// Updates a command that is regularly sent to the control board by SendCommand. + /// + /// See ControlBoard.Command enum + /// Number of the etalon/reference (1..5) + /// Route: 64-bit installation specific number + /// Kolko impulzov ma trvat skuska + /// Pri 'MassAndContinue' metode kolko impulzov ma trvat mass measurement + /// See ControlBoard.TestMethods enum + /// 0 = No filtering (0..255) + /// Freq.inverter control (not applicable in DT100, Munich) + /// Coefficient used to control reg. valves (1..100) + /// 0 = default value, 1 = spec. processing of very short pulses + /// What to stop + void SendCommand(Command cmd, int refNr, UInt128 route, int totalRefPulses, int massRefPulses, TestMethods testMethods, + uint[] filterConstants, float[] fmFreq, int regConst, int shortImp, StopDevs stopDevs); + + /// + /// Control of regulating valves. + /// + /// Regulating valve nr. (1..5) + /// ??? + /// ??? + /// Stabilization time when setting the flow: 0=200ms, step 50ms, max. 1.5 sec. + void ValveMove(int valveNo, RegulValveMode valveMode, float[] valveValue, int stableTime); + + void RunDeviceBefore(); + void RunDeviceAfter(); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeter/PressureMeter.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeter/PressureMeter.cs new file mode 100644 index 00000000..65c7739d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeter/PressureMeter.cs @@ -0,0 +1,77 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.BenchControl.Generic; +using TBF.Boxes; + +namespace TBF.BenchControl.Elde.PressureMeter +{ + public class PressureMeter : ComponentBase, GenericDevices.IPressureMeter + { + private static readonly ILog log = LogManager.GetLogger(typeof(PressureMeter)); + public override string ToString() { return string.Format("PressureMeter({0})", Cfg.ToString(1)); } + + readonly PressureMeterCfg pressureMeterCfg; + + public readonly ControlBoardDev ControlBoard; + + public readonly int Idx0; /// 0..3 + public readonly byte RS485Address; /// 0..255 + + public PressureMeter() + { + } + + public PressureMeter(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + pressureMeterCfg = cfg as PressureMeterCfg; + + ControlBoard = (ControlBoardDev)TbfComponents.FindComponent(cfg.ParentName, components); + if (ControlBoard == null) throw new Exception("Cannot find " + Name + " parent"); + + Idx0 = pressureMeterCfg.Idx0; + RS485Address = pressureMeterCfg.RS485Address; + + /// Prepare data for SendCalibData() control board component method + ControlBoard.MeretRS485Address[Idx0] = RS485Address; + + log.Debug(this.ToString()); + } + + + /// + /// Returns the water pressure + /// + /// Pressure in mBar + public float ReadPressure() + { + return (float)Config.Units.ConvertFrom(Config.Unit.kPa, ControlBoard.Pressure(Idx0)); + } + + + /// + /// Events: PressureDone, Error + /// + /// Reference to a variable for the pressure in Bar + /// ReadPressureOp instance reference casted to IOperaton + public IOperation ReadPressureOp(ref FloatBox pressure) + { + return new ReadPressureOp(this, ref pressure); + } + + /// + /// Events: pressureDone, Error + /// + /// Reference to a variable for the pressure in Bar + /// Event returned when measurement done + /// ReadPressureOp instance reference casted to IOperaton + public IOperation ReadPressureOp(ref FloatBox pressure, Event pressureDone) + { + return new ReadPressureOp(this, ref pressure, pressureDone); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeter/PressureMeterCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeter/PressureMeterCfg.cs new file mode 100644 index 00000000..b4059895 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeter/PressureMeterCfg.cs @@ -0,0 +1,49 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.PressureMeter +{ + public class PressureMeterCfg : ComponentCfgBase, Generic.IChildComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(PressureMeterCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new PressureMeterCfgCtrl(); } + + /// + /// Serialized parameters + /// + public int Idx0; /// 0..3 + public byte RS485Address; /// 0..255 + + /// Private parameterless constructor invoked by all other (public) constructors + PressureMeterCfg() + { + Name = "Pr"; + ParentName = "CB"; + Idx0 = 0; + RS485Address = 99; + } + + public PressureMeterCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Parent={1}, Idx0={2}, Address={3}", + Name, + (string.IsNullOrEmpty(ParentName) ? "-" : ParentName), + Idx0, + RS485Address); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeter/PressureMeterCfgCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeter/PressureMeterCfgCtrl.Designer.cs new file mode 100644 index 00000000..ea1781e5 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeter/PressureMeterCfgCtrl.Designer.cs @@ -0,0 +1,156 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.Elde.PressureMeter +{ + partial class PressureMeterCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.positionTextBox = new System.Windows.Forms.TextBox(); + this.positionLabel = new System.Windows.Forms.Label(); + this.parentNameLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.componentNameLabel = new System.Windows.Forms.Label(); + this.rs485AddressLabel = new System.Windows.Forms.Label(); + this.rs485AddressTextBox = new System.Windows.Forms.TextBox(); + this.parentNameComboBox = new System.Windows.Forms.ComboBox(); + this.SuspendLayout(); + // + // positionTextBox + // + this.positionTextBox.Enabled = false; + this.positionTextBox.Location = new System.Drawing.Point(138, 104); + this.positionTextBox.Name = "positionTextBox"; + this.positionTextBox.Size = new System.Drawing.Size(46, 20); + this.positionTextBox.TabIndex = 6; + // + // positionLabel + // + this.positionLabel.AutoSize = true; + this.positionLabel.Location = new System.Drawing.Point(28, 107); + this.positionLabel.Name = "positionLabel"; + this.positionLabel.Size = new System.Drawing.Size(44, 13); + this.positionLabel.TabIndex = 5; + this.positionLabel.Text = "Position"; + // + // parentNameLabel + // + this.parentNameLabel.AutoSize = true; + this.parentNameLabel.Location = new System.Drawing.Point(28, 81); + this.parentNameLabel.Name = "parentNameLabel"; + this.parentNameLabel.Size = new System.Drawing.Size(69, 13); + this.parentNameLabel.TabIndex = 3; + this.parentNameLabel.Text = "Parent Name"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(138, 52); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(28, 55); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // componentNameLabel + // + this.componentNameLabel.AutoSize = true; + this.componentNameLabel.Location = new System.Drawing.Point(135, 28); + this.componentNameLabel.Name = "componentNameLabel"; + this.componentNameLabel.Size = new System.Drawing.Size(83, 13); + this.componentNameLabel.TabIndex = 0; + this.componentNameLabel.Text = "ComonentName"; + // + // rs485AddressLabel + // + this.rs485AddressLabel.AutoSize = true; + this.rs485AddressLabel.Location = new System.Drawing.Point(28, 133); + this.rs485AddressLabel.Name = "rs485AddressLabel"; + this.rs485AddressLabel.Size = new System.Drawing.Size(81, 13); + this.rs485AddressLabel.TabIndex = 7; + this.rs485AddressLabel.Text = "RS485 Address"; + // + // rs485AddressTextBox + // + this.rs485AddressTextBox.Enabled = false; + this.rs485AddressTextBox.Location = new System.Drawing.Point(138, 130); + this.rs485AddressTextBox.Name = "rs485AddressTextBox"; + this.rs485AddressTextBox.Size = new System.Drawing.Size(46, 20); + this.rs485AddressTextBox.TabIndex = 8; + // + // parentNameComboBox + // + this.parentNameComboBox.Enabled = false; + this.parentNameComboBox.FormattingEnabled = true; + this.parentNameComboBox.Location = new System.Drawing.Point(138, 78); + this.parentNameComboBox.Name = "parentNameComboBox"; + this.parentNameComboBox.Size = new System.Drawing.Size(130, 21); + this.parentNameComboBox.TabIndex = 4; + // + // PressureMeterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.parentNameComboBox); + this.Controls.Add(this.rs485AddressTextBox); + this.Controls.Add(this.rs485AddressLabel); + this.Controls.Add(this.positionTextBox); + this.Controls.Add(this.positionLabel); + this.Controls.Add(this.parentNameLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.componentNameLabel); + this.Name = "PressureMeterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.PressureMeterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox positionTextBox; + private System.Windows.Forms.Label positionLabel; + private System.Windows.Forms.Label parentNameLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label componentNameLabel; + private System.Windows.Forms.Label rs485AddressLabel; + private System.Windows.Forms.TextBox rs485AddressTextBox; + private System.Windows.Forms.ComboBox parentNameComboBox; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeter/PressureMeterCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeter/PressureMeterCfgCtrl.cs new file mode 100644 index 00000000..72aef1e2 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeter/PressureMeterCfgCtrl.cs @@ -0,0 +1,112 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.PressureMeter +{ + public partial class PressureMeterCfgCtrl : UserControl, IComponentCfgCtrl + { + ComponentParametersDlg parent; + + public bool ShowMore { get { return false; } } + + PressureMeterCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as PressureMeterCfg; + Redraw(); + } + } + + public PressureMeterCfgCtrl() + { + InitializeComponent(); + } + + private void PressureMeterCfgCtrl_Load(object sender, EventArgs e) + { + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + + if (parent.TbfComponents != null) + { + foreach (var cmpnt in parent.TbfComponents) + { + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is Elde.ControlBoardFactory) + { + parentNameComboBox.Items.Add(cmpnt.Name); + } + } + } + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + componentNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + parentNameComboBox.Text = string.IsNullOrEmpty(config.ParentName) ? "---" : config.ParentName; + positionTextBox.Text = config.Idx0.ToString(); + rs485AddressTextBox.Text = config.RS485Address.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + parentNameComboBox.Enabled = true; + positionTextBox.Enabled = true; + rs485AddressTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!parentNameComboBox.Items.Contains(parentNameComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Parent Name'"; + } + if (!int.TryParse(positionTextBox.Text, out dummy) || dummy < 0 || dummy > 15) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Position' should be between 0 and 15"; + } + if (!int.TryParse(rs485AddressTextBox.Text, out dummy) || dummy < 0 || dummy > 255) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'RS485 Address' should be between 0 and 255"; + } + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.ParentName = parentNameComboBox.Text.Equals("---") ? string.Empty : parentNameComboBox.Text; + config.Idx0 = int.Parse(positionTextBox.Text); + config.RS485Address = (byte)int.Parse(rs485AddressTextBox.Text); + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeter/PressureMeterCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeter/PressureMeterCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeter/PressureMeterCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeter/PressureMeterFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeter/PressureMeterFactory.cs new file mode 100644 index 00000000..993c10ec --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeter/PressureMeterFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.PressureMeter +{ + public class PressureMeterFactory : IComponentFactory + { + public string ClassName { get { return "PressureMeter"; } } + + public void ResetStaticProperties() { PressureMeter.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new PressureMeter(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new PressureMeter(cfg, components); } + + public IComponentCfg DefaultConfig() { return new PressureMeterCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(PressureMeterCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeter/ReadPressureOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeter/ReadPressureOp.cs new file mode 100644 index 00000000..d87b8d69 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeter/ReadPressureOp.cs @@ -0,0 +1,64 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using log4net; +using TBF.Boxes; + +namespace TBF.BenchControl.Elde.PressureMeter +{ + public class ReadPressureOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(ReadPressureOp)); + public override string ToString() { return string.Format("ReadPressureOp(.,{0},{1},.)", eventDone, pressureMeter.Idx0); } + + /// Set by the constructor + readonly PressureMeter pressureMeter; + readonly Event eventDone; + + /// Measured value + FloatBox pressure; + + /// + /// Events: PressureInDone, PressureOutDone or Error + /// + /// Pressure meter reference + /// Reference to the measured pressure variable, value is in bar + /// Event to be returned by Run() when completed OK + public ReadPressureOp(PressureMeter pressureMeter, ref FloatBox pressure, Event eventDone) + { + if (pressureMeter == null) throw new ArgumentNullException("pressureMeter"); + this.pressureMeter = pressureMeter; + this.pressure = pressure; + this.eventDone = eventDone; + + log.Debug(this.ToString()); + } + public ReadPressureOp(PressureMeter pressureMeter, ref FloatBox pressure) + : this(pressureMeter, ref pressure, Event.PressureDone) + { + } + + + /// Start this operation + public void Start() + { + pressure.Val = pressureMeter.ReadPressure(); + } + + /// Run this operation + /// + /// Event.PressureInDone or Event.PressureOutDone + /// + public Event Run() + { + pressure.Val = pressureMeter.ReadPressure(); + return eventDone; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeterInternal/PressureMeter.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeterInternal/PressureMeter.cs new file mode 100644 index 00000000..f4cb2972 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeterInternal/PressureMeter.cs @@ -0,0 +1,68 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// Author: Milan Hanajik +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.BenchControl.Generic; +using TBF.Boxes; + +namespace TBF.BenchControl.Elde.PressureMeterInternal +{ + public class PressureMeter : ComponentBase, GenericDevices.IPressureMeter + { + private static readonly ILog log = LogManager.GetLogger(typeof(PressureMeter)); + public override string ToString() { return string.Format("PressureMeter({0})", Cfg.ToString(1)); } + + readonly PressureMeterCfg pressureMeterCfg; + + public readonly ControlBoardDev ControlBoard; + + public int Idx0 { get { return pressureMeterCfg.Idx0; } } /// 0..7 + + public PressureMeter() + { + } + + public PressureMeter(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + pressureMeterCfg = cfg as PressureMeterCfg; + + ControlBoard = (ControlBoardDev)TbfComponents.FindComponent(cfg.ParentName, components); + if (ControlBoard == null) throw new Exception("Cannot find " + Name + " parent"); + + /// Prepare data for SendCalibData() control board component method + ControlBoard.TempCalibData[pressureMeterCfg.CoefsIdx0, 0] = pressureMeterCfg.A1; + ControlBoard.TempCalibData[pressureMeterCfg.CoefsIdx0, 1] = pressureMeterCfg.A2; + ControlBoard.TempCalibData[pressureMeterCfg.CoefsIdx0, 2] = pressureMeterCfg.A3; + ControlBoard.TempCalibData[pressureMeterCfg.CoefsIdx0, 3] = pressureMeterCfg.A4; + ControlBoard.TempCalibData[pressureMeterCfg.CoefsIdx0, 4] = pressureMeterCfg.A5; + + ControlBoard.MeretRS485Address[0] = 0; /// This disables Merets, Groch temperatures, enables on-board A/D pressure and temperature + log.Debug(this.ToString()); + } + + /// + /// Events: PressureDone, Error + /// + /// Reference to a variable for the pressure in Bar + /// ReadPressureOp instance reference casted to IOperaton + public IOperation ReadPressureOp(ref FloatBox pressure) + { + return new ReadPressureOp(this, ref pressure); + } + + /// + /// Events: pressureDone, Error + /// + /// Reference to a variable for the pressure in Bar + /// Event returned when measurement done + /// ReadPressureOp instance reference casted to IOperaton + public IOperation ReadPressureOp(ref FloatBox pressure, Event pressureDone) + { + return new ReadPressureOp(this, ref pressure, pressureDone); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeterInternal/PressureMeterCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeterInternal/PressureMeterCfg.cs new file mode 100644 index 00000000..4e0ecc04 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeterInternal/PressureMeterCfg.cs @@ -0,0 +1,59 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.PressureMeterInternal +{ + public class PressureMeterCfg : ComponentCfgBase, IChildComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(PressureMeterCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new PressureMeterCfgCtrl(); } + + /// + /// Serialized parameters + /// + public int Idx0; /// 0..7 + public int CoefsIdx0; /// 0..7 + public float A1; + public float A2; + public float A3; + public float A4; + public float A5; + + /// Private parameterless constructor invoked by all other (public) constructors + PressureMeterCfg() + { + Name = "Pr"; + ParentName = "CB"; + Idx0 = 0; + CoefsIdx0 = 0; + A1 = 0; + A2 = 0; + A3 = 0; + A4 = 0; + A5 = 0; + } + + public PressureMeterCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Parent={1}, Idx0={2}, CoefsIdx0={3}, A1={4}, A2={5}, A3={6}, A4={7}, A5={8}", + Name, + (string.IsNullOrEmpty(ParentName) ? "-" : ParentName), + Idx0, CoefsIdx0, + A1, A2, A3, A4, A5); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeterInternal/PressureMeterCfgCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeterInternal/PressureMeterCfgCtrl.Designer.cs new file mode 100644 index 00000000..d65fd6c3 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeterInternal/PressureMeterCfgCtrl.Designer.cs @@ -0,0 +1,272 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// Author: Milan Hanajik +/// +namespace TBF.BenchControl.Elde.PressureMeterInternal +{ + partial class PressureMeterCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.positionTextBox = new System.Windows.Forms.TextBox(); + this.positionLabel = new System.Windows.Forms.Label(); + this.parentNameLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.a1TextBox = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.a2TextBox = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.a3TextBox = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.a5TextBox = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.a4TextBox = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.parentNameComboBox = new System.Windows.Forms.ComboBox(); + this.coefsIdxTextBox = new System.Windows.Forms.TextBox(); + this.coefsIdxLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // positionTextBox + // + this.positionTextBox.Enabled = false; + this.positionTextBox.Location = new System.Drawing.Point(130, 81); + this.positionTextBox.Name = "positionTextBox"; + this.positionTextBox.Size = new System.Drawing.Size(46, 20); + this.positionTextBox.TabIndex = 6; + // + // positionLabel + // + this.positionLabel.AutoSize = true; + this.positionLabel.Location = new System.Drawing.Point(20, 84); + this.positionLabel.Name = "positionLabel"; + this.positionLabel.Size = new System.Drawing.Size(44, 13); + this.positionLabel.TabIndex = 5; + this.positionLabel.Text = "Position"; + // + // parentNameLabel + // + this.parentNameLabel.AutoSize = true; + this.parentNameLabel.Location = new System.Drawing.Point(20, 60); + this.parentNameLabel.Name = "parentNameLabel"; + this.parentNameLabel.Size = new System.Drawing.Size(69, 13); + this.parentNameLabel.TabIndex = 3; + this.parentNameLabel.Text = "Parent Name"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(130, 34); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(20, 37); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(127, 10); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // a1TextBox + // + this.a1TextBox.Enabled = false; + this.a1TextBox.Location = new System.Drawing.Point(130, 127); + this.a1TextBox.Name = "a1TextBox"; + this.a1TextBox.Size = new System.Drawing.Size(130, 20); + this.a1TextBox.TabIndex = 10; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(20, 130); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(20, 13); + this.label1.TabIndex = 9; + this.label1.Text = "A1"; + // + // a2TextBox + // + this.a2TextBox.Enabled = false; + this.a2TextBox.Location = new System.Drawing.Point(130, 148); + this.a2TextBox.Name = "a2TextBox"; + this.a2TextBox.Size = new System.Drawing.Size(130, 20); + this.a2TextBox.TabIndex = 12; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(20, 151); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(20, 13); + this.label2.TabIndex = 11; + this.label2.Text = "A2"; + // + // a3TextBox + // + this.a3TextBox.Enabled = false; + this.a3TextBox.Location = new System.Drawing.Point(130, 169); + this.a3TextBox.Name = "a3TextBox"; + this.a3TextBox.Size = new System.Drawing.Size(130, 20); + this.a3TextBox.TabIndex = 14; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(20, 172); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(20, 13); + this.label3.TabIndex = 13; + this.label3.Text = "A3"; + // + // a5TextBox + // + this.a5TextBox.Enabled = false; + this.a5TextBox.Location = new System.Drawing.Point(130, 211); + this.a5TextBox.Name = "a5TextBox"; + this.a5TextBox.Size = new System.Drawing.Size(130, 20); + this.a5TextBox.TabIndex = 18; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(20, 214); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(20, 13); + this.label5.TabIndex = 17; + this.label5.Text = "A5"; + // + // a4TextBox + // + this.a4TextBox.Enabled = false; + this.a4TextBox.Location = new System.Drawing.Point(130, 190); + this.a4TextBox.Name = "a4TextBox"; + this.a4TextBox.Size = new System.Drawing.Size(130, 20); + this.a4TextBox.TabIndex = 16; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(20, 193); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(20, 13); + this.label4.TabIndex = 15; + this.label4.Text = "A4"; + // + // parentNameComboBox + // + this.parentNameComboBox.Enabled = false; + this.parentNameComboBox.FormattingEnabled = true; + this.parentNameComboBox.Location = new System.Drawing.Point(130, 57); + this.parentNameComboBox.Name = "parentNameComboBox"; + this.parentNameComboBox.Size = new System.Drawing.Size(130, 21); + this.parentNameComboBox.TabIndex = 4; + // + // coefsIdxTextBox + // + this.coefsIdxTextBox.Enabled = false; + this.coefsIdxTextBox.Location = new System.Drawing.Point(130, 104); + this.coefsIdxTextBox.Name = "coefsIdxTextBox"; + this.coefsIdxTextBox.Size = new System.Drawing.Size(46, 20); + this.coefsIdxTextBox.TabIndex = 8; + // + // coefsIdxLabel + // + this.coefsIdxLabel.AutoSize = true; + this.coefsIdxLabel.Location = new System.Drawing.Point(20, 107); + this.coefsIdxLabel.Name = "coefsIdxLabel"; + this.coefsIdxLabel.Size = new System.Drawing.Size(78, 13); + this.coefsIdxLabel.TabIndex = 7; + this.coefsIdxLabel.Text = "Coeficients idx."; + // + // TempMeterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.coefsIdxTextBox); + this.Controls.Add(this.coefsIdxLabel); + this.Controls.Add(this.parentNameComboBox); + this.Controls.Add(this.a5TextBox); + this.Controls.Add(this.label5); + this.Controls.Add(this.a4TextBox); + this.Controls.Add(this.label4); + this.Controls.Add(this.a3TextBox); + this.Controls.Add(this.label3); + this.Controls.Add(this.a2TextBox); + this.Controls.Add(this.label2); + this.Controls.Add(this.a1TextBox); + this.Controls.Add(this.label1); + this.Controls.Add(this.positionTextBox); + this.Controls.Add(this.positionLabel); + this.Controls.Add(this.parentNameLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "TempMeterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 240); + this.Load += new System.EventHandler(this.TempMeterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox positionTextBox; + private System.Windows.Forms.Label positionLabel; + private System.Windows.Forms.Label parentNameLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.TextBox a1TextBox; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox a2TextBox; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox a3TextBox; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox a5TextBox; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.TextBox a4TextBox; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.ComboBox parentNameComboBox; + private System.Windows.Forms.TextBox coefsIdxTextBox; + private System.Windows.Forms.Label coefsIdxLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeterInternal/PressureMeterCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeterInternal/PressureMeterCfgCtrl.cs new file mode 100644 index 00000000..68279c21 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeterInternal/PressureMeterCfgCtrl.cs @@ -0,0 +1,160 @@ +/// +/// Copyright (c) 2015-2018 Sensus Slovensko a.s. +/// +using System; +using System.Globalization; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.PressureMeterInternal +{ + public partial class PressureMeterCfgCtrl : UserControl, IComponentCfgCtrl + { + ComponentParametersDlg parent; + + public bool ShowMore { get { return false; } } + + PressureMeterCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as PressureMeterCfg; + Redraw(); + } + } + + public PressureMeterCfgCtrl() + { + InitializeComponent(); + } + + private void TempMeterCfgCtrl_Load(object sender, EventArgs e) + { + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + + if (parent.TbfComponents != null) + { + foreach (var cmpnt in parent.TbfComponents) + { + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is Elde.ControlBoardFactory) + { + parentNameComboBox.Items.Add(cmpnt.Name); + } + } + } + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + parentNameComboBox.Text = string.IsNullOrEmpty(config.ParentName) ? "---" : config.ParentName; + positionTextBox.Text = config.Idx0.ToString(); + coefsIdxTextBox.Text = config.CoefsIdx0.ToString(); + a1TextBox.Text = config.A1.ToString(); + a2TextBox.Text = config.A2.ToString(); + a3TextBox.Text = config.A3.ToString(); + a4TextBox.Text = config.A4.ToString(); + a5TextBox.Text = config.A5.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + parentNameComboBox.Enabled = true; + positionTextBox.Enabled = true; + coefsIdxTextBox.Enabled = true; + a1TextBox.Enabled = true; + a2TextBox.Enabled = true; + a3TextBox.Enabled = true; + a4TextBox.Enabled = true; + a5TextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!parentNameComboBox.Items.Contains(parentNameComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Parent Name'"; + } + if (!int.TryParse(positionTextBox.Text, out dummy) || dummy < 0 || dummy > 7) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Position' should be between 0 and 7"; + } + if (!int.TryParse(coefsIdxTextBox.Text, out dummy) || dummy < 0 || dummy > 7) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Coeficients idx.' should be between 0 and 7"; + } + + float fdummy; + if (!Utils.TryParseEFloat(a1TextBox.Text, out fdummy)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'A1' is not valid"; + } + + if (!Utils.TryParseEFloat(a2TextBox.Text, out fdummy)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'A2' is not valid"; + } + + if (!Utils.TryParseEFloat(a3TextBox.Text, out fdummy)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'A3' is not valid"; + } + + if (!Utils.TryParseEFloat(a4TextBox.Text, out fdummy)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'A4' is not valid"; + } + + if (!Utils.TryParseEFloat(a5TextBox.Text, out fdummy)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'A5' is not valid"; + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.ParentName = parentNameComboBox.Text.Equals("---") ? string.Empty : parentNameComboBox.Text; + config.Idx0 = int.Parse(positionTextBox.Text); + config.CoefsIdx0 = int.Parse(coefsIdxTextBox.Text); + bool updateOk = Utils.TryParseEFloat(a1TextBox.Text, out config.A1) && + Utils.TryParseEFloat(a2TextBox.Text, out config.A2) && + Utils.TryParseEFloat(a3TextBox.Text, out config.A3) && + Utils.TryParseEFloat(a4TextBox.Text, out config.A4) && + Utils.TryParseEFloat(a5TextBox.Text, out config.A5); + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeterInternal/PressureMeterCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeterInternal/PressureMeterCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeterInternal/PressureMeterCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeterInternal/PressureMeterFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeterInternal/PressureMeterFactory.cs new file mode 100644 index 00000000..91959c27 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeterInternal/PressureMeterFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.PressureMeterInternal +{ + public class PressureMeterFactory : IComponentFactory + { + public string ClassName { get { return "PressureMeterInternal"; } } + + public void ResetStaticProperties() { PressureMeter.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new PressureMeter(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new PressureMeter(cfg, components); } + + public IComponentCfg DefaultConfig() { return new PressureMeterCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(PressureMeterCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeterInternal/ReadPressureOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeterInternal/ReadPressureOp.cs new file mode 100644 index 00000000..38440bd2 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PressureMeterInternal/ReadPressureOp.cs @@ -0,0 +1,64 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// Author: Milan Hanajik +/// +using System; +using log4net; +using TBF.Boxes; + +namespace TBF.BenchControl.Elde.PressureMeterInternal +{ + public class ReadPressureOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(ReadPressureOp)); + public override string ToString() { return string.Format("ReadPressureOp(.,{0},{1},.)", eventDone, pressureMeterNr); } + + /// Set by the constructor + readonly ControlBoardDev controlBoardDev; + readonly int pressureMeterNr; + readonly Event eventDone; + FloatBox pressure; + + /// + /// Events: PressureInDone, PressureOutDone or Error + /// + /// Pressure meter reference + /// Reference to the measured pressure variable, value is in bar + /// Event to be returned by Run() when completed OK + public ReadPressureOp(PressureMeter pressureMeter, ref FloatBox pressure, Event eventDone) + { + if (pressureMeter == null) throw new ArgumentNullException("pressureMeter"); + this.controlBoardDev = pressureMeter.ControlBoard; + this.pressureMeterNr = pressureMeter.Idx0; + this.eventDone = eventDone; + this.pressure = pressure; + + log.Debug(this.ToString()); + } + public ReadPressureOp(PressureMeter pressureMeter, ref FloatBox pressure) + : this(pressureMeter, ref pressure, Event.PressureDone) + { + } + + /// Start this operation + public void Start() + { + pressure.Val = 0.01F * controlBoardDev.Pressure(pressureMeterNr); /// converted from [kPa] to [bar] + } + + /// Run this operation + /// + /// Event.PressureInDone or Event.PressureOutDone + /// + public Event Run() + { + pressure.Val = 0.01F * controlBoardDev.Pressure(pressureMeterNr); /// converted from [kPa] to [bar] + return eventDone; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Pump/Pump.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Pump/Pump.cs new file mode 100644 index 00000000..ffc1dd7d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Pump/Pump.cs @@ -0,0 +1,59 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using Dirichlet.Numerics; +using log4net; + +namespace TBF.BenchControl.Elde.Pump +{ + public class Pump : ComponentBase, GenericDevices.IPump, GenericDevices.IValve + { + private static readonly ILog log = LogManager.GetLogger(typeof(Pump)); + public override string ToString() { return string.Format("Pump({0})", Cfg.ToString(1)); } + + readonly PumpCfg pumpCfg; + + public int Delay { get { return pumpCfg.Delay; } } + + public ValveCategory Category { get { return ValveCategory.Feeding; } } /// Pump category is Feeding + + public GenericDevices.IValve CoupledTo { get { return null; } } + public bool InvertCouple { get { return false; } } + public int LagOpening { get { return 0; } } + public int LagClosing { get { return 0; } } + + public float Power { get { return State ? 100.0f : 0; } } + + + readonly ControlBoardDev controlBoard; + readonly int bitPosition; /// 0 .. 127 + + public readonly UInt128 Mask; /// derived from bitPosition in the constructor + + + public Pump() + { + } + + public Pump(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + pumpCfg = cfg as PumpCfg; + + controlBoard = (ControlBoardDev)TbfComponents.FindComponent(cfg.ParentName, components); + if (controlBoard == null) throw new Exception("Cannot find " + Name + " parent"); + + bitPosition = pumpCfg.BitPosition; + Mask = (((UInt128)1) << pumpCfg.BitPosition); + + log.Debug(this.ToString()); + } + + public bool State + { + get { return (controlBoard.Route & Mask) != 0; } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Pump/PumpCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Pump/PumpCfg.cs new file mode 100644 index 00000000..9aa64bf7 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Pump/PumpCfg.cs @@ -0,0 +1,48 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.IO; +using System.Collections.Generic; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.Pump +{ + public class PumpCfg : ComponentCfgBase, IChildComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(PumpCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new PumpCfgCtrl(); } + + /// + /// Serialized parameters + /// + public int BitPosition; + public int Delay; + + /// Private parameterless constructor invoked by all other (public) constructors + PumpCfg() + { + Name = "P"; + ParentName = "CB"; + BitPosition = 0; + Delay = 1; + } + + public PumpCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Parent={1}, Bit={2}, Delay={3}", + Name, + (string.IsNullOrEmpty(ParentName) ? "-" : ParentName), + BitPosition, + Delay); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Pump/PumpCfgCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Pump/PumpCfgCtrl.Designer.cs new file mode 100644 index 00000000..060f48b5 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Pump/PumpCfgCtrl.Designer.cs @@ -0,0 +1,156 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.Elde.Pump +{ + partial class PumpCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.bitPositionTextBox = new System.Windows.Forms.TextBox(); + this.bitPositionLabel = new System.Windows.Forms.Label(); + this.parentNameLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.parentNameComboBox = new System.Windows.Forms.ComboBox(); + this.delayTextBox = new System.Windows.Forms.TextBox(); + this.delayLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // bitPositionTextBox + // + this.bitPositionTextBox.Enabled = false; + this.bitPositionTextBox.Location = new System.Drawing.Point(122, 99); + this.bitPositionTextBox.Name = "bitPositionTextBox"; + this.bitPositionTextBox.Size = new System.Drawing.Size(46, 20); + this.bitPositionTextBox.TabIndex = 6; + // + // bitPositionLabel + // + this.bitPositionLabel.AutoSize = true; + this.bitPositionLabel.Location = new System.Drawing.Point(36, 102); + this.bitPositionLabel.Name = "bitPositionLabel"; + this.bitPositionLabel.Size = new System.Drawing.Size(59, 13); + this.bitPositionLabel.TabIndex = 5; + this.bitPositionLabel.Text = "Bit Position"; + // + // parentNameLabel + // + this.parentNameLabel.AutoSize = true; + this.parentNameLabel.Location = new System.Drawing.Point(36, 76); + this.parentNameLabel.Name = "parentNameLabel"; + this.parentNameLabel.Size = new System.Drawing.Size(69, 13); + this.parentNameLabel.TabIndex = 3; + this.parentNameLabel.Text = "Parent Name"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(122, 47); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(36, 50); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(119, 21); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // parentNameComboBox + // + this.parentNameComboBox.Enabled = false; + this.parentNameComboBox.FormattingEnabled = true; + this.parentNameComboBox.Location = new System.Drawing.Point(122, 73); + this.parentNameComboBox.Name = "parentNameComboBox"; + this.parentNameComboBox.Size = new System.Drawing.Size(130, 21); + this.parentNameComboBox.TabIndex = 4; + // + // delayTextBox + // + this.delayTextBox.Enabled = false; + this.delayTextBox.Location = new System.Drawing.Point(122, 124); + this.delayTextBox.Name = "delayTextBox"; + this.delayTextBox.Size = new System.Drawing.Size(46, 20); + this.delayTextBox.TabIndex = 8; + // + // delayLabel + // + this.delayLabel.AutoSize = true; + this.delayLabel.Location = new System.Drawing.Point(36, 127); + this.delayLabel.Name = "delayLabel"; + this.delayLabel.Size = new System.Drawing.Size(48, 13); + this.delayLabel.TabIndex = 7; + this.delayLabel.Text = "Delay [s]"; + // + // PumpCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.delayTextBox); + this.Controls.Add(this.delayLabel); + this.Controls.Add(this.parentNameComboBox); + this.Controls.Add(this.bitPositionTextBox); + this.Controls.Add(this.bitPositionLabel); + this.Controls.Add(this.parentNameLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "PumpCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.PumpCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox bitPositionTextBox; + private System.Windows.Forms.Label bitPositionLabel; + private System.Windows.Forms.Label parentNameLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.ComboBox parentNameComboBox; + private System.Windows.Forms.TextBox delayTextBox; + private System.Windows.Forms.Label delayLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Pump/PumpCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Pump/PumpCfgCtrl.cs new file mode 100644 index 00000000..b003c401 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Pump/PumpCfgCtrl.cs @@ -0,0 +1,112 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.Pump +{ + public partial class PumpCfgCtrl : UserControl, IComponentCfgCtrl + { + ComponentParametersDlg parent; + + public bool ShowMore { get { return false; } } + + PumpCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as PumpCfg; + Redraw(); + } + } + + public PumpCfgCtrl() + { + InitializeComponent(); + } + + private void PumpCfgCtrl_Load(object sender, EventArgs e) + { + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + + if (parent.TbfComponents != null) + { + foreach (var cmpnt in parent.TbfComponents) + { + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is Elde.ControlBoardFactory) + { + parentNameComboBox.Items.Add(cmpnt.Name); + } + } + } + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + parentNameComboBox.Text = string.IsNullOrEmpty(config.ParentName) ? "---" : config.ParentName; + bitPositionTextBox.Text = config.BitPosition.ToString(); + delayTextBox.Text = config.Delay.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + parentNameComboBox.Enabled = true; + bitPositionTextBox.Enabled = true; + delayTextBox.Enabled = true; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.ParentName = parentNameComboBox.Text.Equals("---") ? string.Empty : parentNameComboBox.Text; + config.BitPosition = int.Parse(bitPositionTextBox.Text); + config.Delay = int.Parse(delayTextBox.Text); + + return flags; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!parentNameComboBox.Items.Contains(parentNameComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Parent Name'"; + } + if (!int.TryParse(bitPositionTextBox.Text, out dummy) || dummy < 0 || dummy >= 128) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Bit Position' should be between 0 and 127"; + } + if (!int.TryParse(delayTextBox.Text, out dummy) || dummy < 0 || dummy >= 300 || (dummy % StateMachine.Period) != 0) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Delay' should be between 0 and 300s (5min)"; + } + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Pump/PumpCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Pump/PumpCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Pump/PumpCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Pump/PumpFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Pump/PumpFactory.cs new file mode 100644 index 00000000..05a5f3bd --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Pump/PumpFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.Pump +{ + public class PumpFactory : IComponentFactory + { + public string ClassName { get { return "Pump"; } } + + public void ResetStaticProperties() { Pump.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Pump(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Pump(cfg, components); } + + public IComponentCfg DefaultConfig() { return new PumpCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(PumpCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpTandem/Pump.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpTandem/Pump.cs new file mode 100644 index 00000000..b2c6309c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpTandem/Pump.cs @@ -0,0 +1,178 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using Dirichlet.Numerics; +using log4net; + +namespace TBF.BenchControl.Elde.PumpTandem +{ + public class Pump : ComponentBase, GenericDevices.IPumpFM, GenericDevices.IValve, IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(Pump)); + public override string ToString() { return string.Format("PumpTandem({0})", Cfg.ToString(1)); } + + readonly PumpCfg pumpCfg; + + readonly GenericDevices.IPump pump1; + readonly GenericDevices.IPump pump2; + + readonly GenericDevices.IPumpFM pumpFm1; + readonly GenericDevices.IPumpFM pumpFm2; + + public bool State { get { return pump1.State || pump2.State; } } + public int Delay { get { return Math.Max(pump1.Delay, pump2.Delay); } } + public ValveCategory Category { get { return ValveCategory.Feeding; } } /// Pump category is Feeding + public GenericDevices.IValve CoupledTo { get { return null; } } + public bool InvertCouple { get { return false; } } + public int LagOpening { get { return 0; } } + public int LagClosing { get { return 0; } } + + /// + /// Pump power in [%] in range 0 .. 100.0f + /// + public float Power + { + get { return (pump1.Power + pump2.Power) / 2.0f; } + } + + + readonly UInt128 mask1; + readonly UInt128 mask2; + public UInt128 Mask { get { return mask1 | mask2; } } /// derived from masks of two pumps + + + public Pump() + { + } + + public Pump(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + pumpCfg = cfg as PumpCfg; + + pump1 = (GenericDevices.IPump)TbfComponents.FindComponent(pumpCfg.Pump1, components); + if (pump1 == null) throw new Exception("Cannot find component Pump 1"); + + pump2 = (GenericDevices.IPump)TbfComponents.FindComponent(pumpCfg.Pump2, components); + if (pump2 == null) throw new Exception("Cannot find component Pump 2"); + + pumpFm1 = pump1 as GenericDevices.IPumpFM; + pumpFm2 = pump2 as GenericDevices.IPumpFM; + + if (pump1 is Elde.Pump.Pump) { mask1 = (pump1 as Elde.Pump.Pump).Mask; } + else if (pump1 is Elde.PumpWithFM.Pump) { mask1 = (pump1 as Elde.PumpWithFM.Pump).Mask; } + else if (pump1 is Danfoss.VLT2800.Pump) { mask1 = (pump1 as Danfoss.VLT2800.Pump).Mask; } + else { mask1 = 0; } + + if (pump2 is Elde.Pump.Pump) { mask2 = (pump2 as Elde.Pump.Pump).Mask; } + else if (pump2 is Elde.PumpWithFM.Pump) { mask2 = (pump2 as Elde.PumpWithFM.Pump).Mask; } + else if (pump2 is Danfoss.VLT2800.Pump) { mask2 = (pump2 as Danfoss.VLT2800.Pump).Mask; } + else { mask2 = 0; } + + log.Debug(this.ToString()); + } + + + public void TurnOn(float powerArg) + { + if ((pumpFm1 != null) && (pumpFm2 != null)) + { + pumpFm1.TurnOn(powerArg); + pumpFm2.TurnOn(powerArg); + } + else if ((pumpFm1 != null) && (pumpFm2 == null)) + { + // TODO + if (powerArg >= 50) + { + pumpFm1.TurnOn(2 * (powerArg - 50.0f)); + //pump2. + } + else + { + pumpFm1.TurnOn(2 * powerArg); + //pump2. + } + // TODO + } + } + + public void TurnOff() + { + if ((pumpFm1 != null) && (pumpFm2 != null)) + { + pumpFm1.TurnOff(); + pumpFm2.TurnOff(); + } + else + { + // TODO + } + } + + + /// + /// The currently running operation. + /// + public enum CurrentOp + { + None, + TurnOn, + TurnOff, + } + /// + CurrentOp currentOp; + + float powerForOp; + + /// + /// Turn the pump frequency inverter on. + /// + public IOperation TurnOnOp(float powerArg) + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.TurnOn; + powerForOp = powerArg; + return this; + } + + /// + /// Turn the pump frequency inverter on. + /// + public IOperation TurnOffOp() + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.TurnOff; + return this; + } + + /// Start the operation + public void Start() + { + switch (currentOp) + { + case CurrentOp.TurnOn: + TurnOn(powerForOp); + return; + case CurrentOp.TurnOff: + default: + TurnOff(); + return; + } + } + + /// Run the operation + public Event Run() + { + return Event.TurnPumpOnOffDone; + } + + /// Stop the operation + public void Stop() + { + currentOp = CurrentOp.None; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpTandem/PumpCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpTandem/PumpCfg.cs new file mode 100644 index 00000000..58cc202b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpTandem/PumpCfg.cs @@ -0,0 +1,47 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.IO; +using System.Collections.Generic; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.PumpTandem +{ + public class PumpCfg : ComponentCfgBase, IChildComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(PumpCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new PumpCfgCtrl(); } + + /// + /// Serialized parameters + /// + public string Pump1; /// Name of the pump 1 component + public string Pump2; /// Name of the pump 2 component + + /// Private parameterless constructor invoked by all other (public) constructors + PumpCfg() + { + Name = "PumpTandem"; + ParentName = string.Empty; + Pump1 = string.Empty; + Pump2 = string.Empty; + } + + public PumpCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Pump1={1}, Pump2={2}", + Name, + string.IsNullOrEmpty(Pump1) ? "-" : Pump1, + string.IsNullOrEmpty(Pump2) ? "-" : Pump2); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpTandem/PumpCfgCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpTandem/PumpCfgCtrl.Designer.cs new file mode 100644 index 00000000..b7d55423 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpTandem/PumpCfgCtrl.Designer.cs @@ -0,0 +1,134 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.Elde.PumpTandem +{ + partial class PumpCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.pump2ComboBox = new System.Windows.Forms.ComboBox(); + this.pump2Label = new System.Windows.Forms.Label(); + this.pump1ComboBox = new System.Windows.Forms.ComboBox(); + this.pump1Label = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(140, 47); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(30, 50); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(119, 21); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // pump2ComboBox + // + this.pump2ComboBox.Enabled = false; + this.pump2ComboBox.FormattingEnabled = true; + this.pump2ComboBox.Location = new System.Drawing.Point(140, 96); + this.pump2ComboBox.Name = "pump2ComboBox"; + this.pump2ComboBox.Size = new System.Drawing.Size(130, 21); + this.pump2ComboBox.TabIndex = 12; + // + // pump2Label + // + this.pump2Label.AutoSize = true; + this.pump2Label.Location = new System.Drawing.Point(30, 99); + this.pump2Label.Name = "pump2Label"; + this.pump2Label.Size = new System.Drawing.Size(43, 13); + this.pump2Label.TabIndex = 11; + this.pump2Label.Text = "Pump 2"; + // + // pump1ComboBox + // + this.pump1ComboBox.Enabled = false; + this.pump1ComboBox.FormattingEnabled = true; + this.pump1ComboBox.Location = new System.Drawing.Point(140, 71); + this.pump1ComboBox.Name = "pump1ComboBox"; + this.pump1ComboBox.Size = new System.Drawing.Size(130, 21); + this.pump1ComboBox.TabIndex = 10; + // + // pump1Label + // + this.pump1Label.AutoSize = true; + this.pump1Label.Location = new System.Drawing.Point(30, 74); + this.pump1Label.Name = "pump1Label"; + this.pump1Label.Size = new System.Drawing.Size(43, 13); + this.pump1Label.TabIndex = 9; + this.pump1Label.Text = "Pump 1"; + // + // PumpCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.pump2ComboBox); + this.Controls.Add(this.pump2Label); + this.Controls.Add(this.pump1ComboBox); + this.Controls.Add(this.pump1Label); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "PumpCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.PumpCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.ComboBox pump2ComboBox; + private System.Windows.Forms.Label pump2Label; + private System.Windows.Forms.ComboBox pump1ComboBox; + private System.Windows.Forms.Label pump1Label; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpTandem/PumpCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpTandem/PumpCfgCtrl.cs new file mode 100644 index 00000000..d780f0d7 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpTandem/PumpCfgCtrl.cs @@ -0,0 +1,107 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.PumpTandem +{ + public partial class PumpCfgCtrl : UserControl, IComponentCfgCtrl + { + ComponentParametersDlg parentDlg; + + public bool ShowMore { get { return false; } } + + PumpCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as PumpCfg; + Redraw(); + } + } + + public PumpCfgCtrl() + { + InitializeComponent(); + } + + private void PumpCfgCtrl_Load(object sender, EventArgs e) + { + parentDlg = ParentForm as ComponentParametersDlg; + if (parentDlg == null) return; + + if (parentDlg.TbfComponents != null) + { + foreach (var cmpnt in parentDlg.TbfComponents) + { + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is Elde.Pump.PumpFactory || + TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is Elde.PumpWithFM.PumpFactory || + TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is Danfoss.VLT2800.PumpFactory || + TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is Elde.PumpTandem.PumpFactory) + { + pump1ComboBox.Items.Add(cmpnt.Name); + pump2ComboBox.Items.Add(cmpnt.Name); + } + } + } + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + pump1ComboBox.Text = string.IsNullOrEmpty(config.Pump1) ? "---" : config.Pump1; + pump2ComboBox.Text = string.IsNullOrEmpty(config.Pump2) ? "---" : config.Pump2; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + pump1ComboBox.Enabled = true; + pump2ComboBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (!pump1ComboBox.Items.Contains(pump1ComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Pump 1'"; + } + if (!pump2ComboBox.Items.Contains(pump2ComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Pump 2'"; + } + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.Pump1 = pump1ComboBox.Text.Equals("---") ? string.Empty : pump1ComboBox.Text; + config.Pump2 = pump2ComboBox.Text.Equals("---") ? string.Empty : pump2ComboBox.Text; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpTandem/PumpCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpTandem/PumpCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpTandem/PumpCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpTandem/PumpFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpTandem/PumpFactory.cs new file mode 100644 index 00000000..7bf37b0f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpTandem/PumpFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.PumpTandem +{ + public class PumpFactory : IComponentFactory + { + public string ClassName { get { return "PumpTandem"; } } + + public void ResetStaticProperties() { Pump.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Pump(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Pump(cfg, components); } + + public IComponentCfg DefaultConfig() { return new PumpCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(PumpCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpWithFM/Pump.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpWithFM/Pump.cs new file mode 100644 index 00000000..0ef0439f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpWithFM/Pump.cs @@ -0,0 +1,148 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using Dirichlet.Numerics; +using log4net; + +namespace TBF.BenchControl.Elde.PumpWithFM +{ + public class Pump : ComponentBase, GenericDevices.IPumpFM, GenericDevices.IValve, IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(Pump)); + public override string ToString() { return string.Format("PumpWithFM({0})", Cfg.ToString(1)); } + + readonly PumpCfg pumpCfg; + + public int Delay { get { return pumpCfg.Delay; } } + public ValveCategory Category { get { return ValveCategory.Feeding; } } /// Pump category is Feeding + public GenericDevices.IValve CoupledTo { get { return null; } } + public bool InvertCouple { get { return false; } } + public int LagOpening { get { return 0; } } + public int LagClosing { get { return 0; } } + + readonly ControlBoardDev controlBoard; + readonly int bitPosition; /// 0 .. 63 + int FMIndex; /// 0 .. FMPumpsCount-1 + + public readonly UInt128 Mask; /// derived from bitPosition in the constructor + + public bool State + { + get { return (controlBoard.Route & Mask) != 0; } + } + + /// + /// Pump power in [%] in range 0 .. 100.0f + /// + private float power; + public float Power + { + get { return power; } + } + + + public Pump() + { + } + + /// + /// Constructor + /// + /// Pump configuration object + /// List of all components (used to find the control board) + public Pump(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + pumpCfg = cfg as PumpCfg; + + controlBoard = (ControlBoardDev)TbfComponents.FindComponent(cfg.ParentName, components); + if (controlBoard == null) throw new Exception("Cannot find " + Name + " parent"); + + bitPosition = pumpCfg.BitPosition; + Mask = (((UInt128)1) << pumpCfg.BitPosition); + FMIndex = pumpCfg.FMIndex; + + log.Debug(this.ToString()); + } + + + public void TurnOn(float powerArg) + { + log.InfoFormat("{0}.TurnOn({1})", Name, powerArg); + this.power = powerArg; + controlBoard.SetFMFreq(FMIndex, powerArg); + } + + public void TurnOff() + { + log.InfoFormat("{0}.TurnOff()", Name); + this.power = 0.0f; + controlBoard.SetFMFreq(FMIndex, 0.0f); + } + + + /// + /// The currently running operation. + /// + public enum CurrentOp + { + None, + TurnOn, + TurnOff, + } + /// + CurrentOp currentOp; + + float powerForOp; + + /// + /// Turn the pump frequency inverter on. + /// + public IOperation TurnOnOp(float powerArg) + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.TurnOn; + powerForOp = powerArg; + return this; + } + + /// + /// Turn the pump frequency inverter on. + /// + public IOperation TurnOffOp() + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + currentOp = CurrentOp.TurnOff; + return this; + } + + /// Start the operation + public void Start() + { + switch (currentOp) + { + case CurrentOp.TurnOn: + TurnOn(powerForOp); + return; + case CurrentOp.TurnOff: + default: + TurnOff(); + return; + } + } + + /// Run the operation + public Event Run() + { + return Event.TurnPumpOnOffDone; + } + + /// Stop the operation + public void Stop() + { + currentOp = CurrentOp.None; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpWithFM/PumpCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpWithFM/PumpCfg.cs new file mode 100644 index 00000000..70c59281 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpWithFM/PumpCfg.cs @@ -0,0 +1,51 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.IO; +using System.Collections.Generic; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.PumpWithFM +{ + public class PumpCfg : ComponentCfgBase, IChildComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(PumpCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new PumpCfgCtrl(); } + + /// + /// Serialized parameters + /// + public int BitPosition; + public int FMIndex; + public int Delay; + + /// Private parameterless constructor invoked by all other (public) constructors + PumpCfg() + { + Name = "P"; + ParentName = "CB"; + BitPosition = 0; + FMIndex = 0; + Delay = 1; + } + + public PumpCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Parent={1}, Bit={2}, FMIndex={3}, Delay={4}", + Name, + (string.IsNullOrEmpty(ParentName) ? "-" : ParentName), + BitPosition, + FMIndex, + Delay); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpWithFM/PumpCfgCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpWithFM/PumpCfgCtrl.Designer.cs new file mode 100644 index 00000000..1acae680 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpWithFM/PumpCfgCtrl.Designer.cs @@ -0,0 +1,179 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.Elde.PumpWithFM +{ + partial class PumpCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.bitPositionTextBox = new System.Windows.Forms.TextBox(); + this.bitPositionLabel = new System.Windows.Forms.Label(); + this.parentNameLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.parentNameComboBox = new System.Windows.Forms.ComboBox(); + this.fmIndexTextBox = new System.Windows.Forms.TextBox(); + this.fmIndexLabel = new System.Windows.Forms.Label(); + this.delayTextBox = new System.Windows.Forms.TextBox(); + this.delayLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // bitPositionTextBox + // + this.bitPositionTextBox.Enabled = false; + this.bitPositionTextBox.Location = new System.Drawing.Point(122, 99); + this.bitPositionTextBox.Name = "bitPositionTextBox"; + this.bitPositionTextBox.Size = new System.Drawing.Size(46, 20); + this.bitPositionTextBox.TabIndex = 6; + // + // bitPositionLabel + // + this.bitPositionLabel.AutoSize = true; + this.bitPositionLabel.Location = new System.Drawing.Point(36, 102); + this.bitPositionLabel.Name = "bitPositionLabel"; + this.bitPositionLabel.Size = new System.Drawing.Size(59, 13); + this.bitPositionLabel.TabIndex = 5; + this.bitPositionLabel.Text = "Bit Position"; + // + // parentNameLabel + // + this.parentNameLabel.AutoSize = true; + this.parentNameLabel.Location = new System.Drawing.Point(36, 76); + this.parentNameLabel.Name = "parentNameLabel"; + this.parentNameLabel.Size = new System.Drawing.Size(69, 13); + this.parentNameLabel.TabIndex = 3; + this.parentNameLabel.Text = "Parent Name"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(122, 47); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(36, 50); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(119, 21); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // parentNameComboBox + // + this.parentNameComboBox.Enabled = false; + this.parentNameComboBox.FormattingEnabled = true; + this.parentNameComboBox.Location = new System.Drawing.Point(122, 73); + this.parentNameComboBox.Name = "parentNameComboBox"; + this.parentNameComboBox.Size = new System.Drawing.Size(130, 21); + this.parentNameComboBox.TabIndex = 4; + // + // fmIndexTextBox + // + this.fmIndexTextBox.Enabled = false; + this.fmIndexTextBox.Location = new System.Drawing.Point(122, 124); + this.fmIndexTextBox.Name = "fmIndexTextBox"; + this.fmIndexTextBox.Size = new System.Drawing.Size(46, 20); + this.fmIndexTextBox.TabIndex = 8; + // + // fmIndexLabel + // + this.fmIndexLabel.AutoSize = true; + this.fmIndexLabel.Location = new System.Drawing.Point(36, 127); + this.fmIndexLabel.Name = "fmIndexLabel"; + this.fmIndexLabel.Size = new System.Drawing.Size(51, 13); + this.fmIndexLabel.TabIndex = 7; + this.fmIndexLabel.Text = "FM Index"; + // + // delayTextBox + // + this.delayTextBox.Enabled = false; + this.delayTextBox.Location = new System.Drawing.Point(122, 149); + this.delayTextBox.Name = "delayTextBox"; + this.delayTextBox.Size = new System.Drawing.Size(46, 20); + this.delayTextBox.TabIndex = 10; + // + // delayLabel + // + this.delayLabel.AutoSize = true; + this.delayLabel.Location = new System.Drawing.Point(36, 152); + this.delayLabel.Name = "delayLabel"; + this.delayLabel.Size = new System.Drawing.Size(48, 13); + this.delayLabel.TabIndex = 9; + this.delayLabel.Text = "Delay [s]"; + // + // PumpCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.delayTextBox); + this.Controls.Add(this.delayLabel); + this.Controls.Add(this.fmIndexTextBox); + this.Controls.Add(this.fmIndexLabel); + this.Controls.Add(this.parentNameComboBox); + this.Controls.Add(this.bitPositionTextBox); + this.Controls.Add(this.bitPositionLabel); + this.Controls.Add(this.parentNameLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "PumpCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.PumpCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox bitPositionTextBox; + private System.Windows.Forms.Label bitPositionLabel; + private System.Windows.Forms.Label parentNameLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.ComboBox parentNameComboBox; + private System.Windows.Forms.TextBox fmIndexTextBox; + private System.Windows.Forms.Label fmIndexLabel; + private System.Windows.Forms.TextBox delayTextBox; + private System.Windows.Forms.Label delayLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpWithFM/PumpCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpWithFM/PumpCfgCtrl.cs new file mode 100644 index 00000000..493de0b7 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpWithFM/PumpCfgCtrl.cs @@ -0,0 +1,120 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.PumpWithFM +{ + public partial class PumpCfgCtrl : UserControl, IComponentCfgCtrl + { + ComponentParametersDlg parent; + + public bool ShowMore { get { return false; } } + + PumpCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as PumpCfg; + Redraw(); + } + } + + public PumpCfgCtrl() + { + InitializeComponent(); + } + + private void PumpCfgCtrl_Load(object sender, EventArgs e) + { + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + + if (parent.TbfComponents != null) + { + foreach (var cmpnt in parent.TbfComponents) + { + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is Elde.ControlBoardFactory) + { + parentNameComboBox.Items.Add(cmpnt.Name); + } + } + } + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + parentNameComboBox.Text = string.IsNullOrEmpty(config.ParentName) ? "---" : config.ParentName; + bitPositionTextBox.Text = config.BitPosition.ToString(); + fmIndexTextBox.Text = config.FMIndex.ToString(); + delayTextBox.Text = config.Delay.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + parentNameComboBox.Enabled = true; + bitPositionTextBox.Enabled = true; + fmIndexTextBox.Enabled = true; + delayTextBox.Enabled = true; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.ParentName = parentNameComboBox.Text.Equals("---") ? string.Empty : parentNameComboBox.Text; + config.BitPosition = int.Parse(bitPositionTextBox.Text); + config.FMIndex = int.Parse(fmIndexTextBox.Text); + config.Delay = int.Parse(delayTextBox.Text); + + return flags; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!parentNameComboBox.Items.Contains(parentNameComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Parent Name'"; + } + if (!int.TryParse(bitPositionTextBox.Text, out dummy) || dummy < 0 || dummy >= 128) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Bit Position' should be between 0 and 127"; + } + if (!int.TryParse(fmIndexTextBox.Text, out dummy) || dummy < 0) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'FM Index' should be between 0 and FMPumpsCount - 1"; + } + if (!int.TryParse(delayTextBox.Text, out dummy) || dummy < 0 || dummy >= 300 || (dummy % StateMachine.Period) != 0) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Delay' should be between 0 and 300s (5min)"; + } + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpWithFM/PumpCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpWithFM/PumpCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpWithFM/PumpCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpWithFM/PumpFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpWithFM/PumpFactory.cs new file mode 100644 index 00000000..dec81e7d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/PumpWithFM/PumpFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.PumpWithFM +{ + public class PumpFactory : IComponentFactory + { + public string ClassName { get { return "PumpWithFM"; } } + + public void ResetStaticProperties() { Pump.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Pump(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Pump(cfg, components); } + + public IComponentCfg DefaultConfig() { return new PumpCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(PumpCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/QueryMeasurementEndOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/QueryMeasurementEndOp.cs new file mode 100644 index 00000000..f98d7a99 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/QueryMeasurementEndOp.cs @@ -0,0 +1,62 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using log4net; + +namespace TBF.BenchControl.Elde +{ + public class QueryMeasurementEndOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(QueryMeasurementEndOp)); + public override string ToString() { return string.Format("QueryMeasurementEndOp(.,{0})", eventDone); } + + /// Set by the constructor + readonly ControlBoardDev controlBoard; + readonly Event eventDone; + + bool done = false; + + /// + /// Events: MeasurementCompleted + /// + /// Event to be returned by Run() when completed OK + public QueryMeasurementEndOp(ControlBoardDev controlBoardDev, Event eventDone) + { + if (controlBoardDev == null) throw new ArgumentNullException("controlBoardDev"); + this.controlBoard = controlBoardDev; + this.eventDone = eventDone; + + log.Debug(this.ToString()); + } + public QueryMeasurementEndOp(ControlBoardDev controlBoardDev) + : this(controlBoardDev, Event.MeasurementCompleted) + { + } + + /// Start this operation + public void Start() + { + } + + /// Run this operation + /// + /// Event.FlowInDone or Event.FlowOutDone + /// + public Event Run() + { + if (done) return eventDone; + if (0 != (controlBoard.StatusP & StatusP.TestCompleted)) + { + done = true; + return eventDone; + } + return Event.None; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ReadDiverterTransitionOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ReadDiverterTransitionOp.cs new file mode 100644 index 00000000..77467e3d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ReadDiverterTransitionOp.cs @@ -0,0 +1,203 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using log4net; +using TBF.Boxes; + +namespace TBF.BenchControl.Elde +{ + public class ReadDiverterTransitionOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(ReadDiverterTransitionOp)); + public override string ToString() + { + return string.Format("ReadDiverterTransitionOp(.,{0},{1},{2},...)", div.Name, runsCountWhenSendingCmd, runsCountWhenReadingDiv); + } + + const int SamplesCount = 240; /// Should be less then or equal to 256 + float[] samples; + + /// Set by the constructor + readonly ControlBoardDev controlBoard; + readonly GenericDevices.IDiverter div; + readonly int runsCountWhenSendingCmd; + readonly int runsCountWhenReadingDiv; + readonly FloatBox transitionTimeSec; + readonly Sequences.Statistics plotter; + readonly int batchNr; + readonly string testName; + readonly int repetition; + + int counter; + bool cmdSent = false; + bool divRead = false; + + + /// + /// Starts the measurement. + /// Events: MeasurementStarted + /// + /// Control board component reference + /// Specifies used components + /// Test method + /// Test duration in number of reference flowmeter pulses + /// Specifies filter for watermeter pulses + public ReadDiverterTransitionOp(ControlBoardDev controlBoard, GenericDevices.IDiverter div, int runsCountWhenSendingCmd, int runsCountWhenReadingDiv, + FloatBox transitionTimeSec, Sequences.Statistics plotter, int batchNr, string testName, int repetition) + { + if (controlBoard == null) throw new ArgumentNullException("controlBoardDev"); + if (runsCountWhenSendingCmd < 0) throw new ArgumentNullException("runsCountWhenSendingCmd"); + if (runsCountWhenReadingDiv <= runsCountWhenSendingCmd) throw new ArgumentNullException("runsCountWhenReadingDiv"); + if (transitionTimeSec == null) throw new ArgumentNullException("transitionTimeSec"); + + this.controlBoard = controlBoard; + this.div = div; + this.runsCountWhenSendingCmd = runsCountWhenSendingCmd; + this.runsCountWhenReadingDiv = runsCountWhenReadingDiv; + this.transitionTimeSec = transitionTimeSec; + this.plotter = plotter; + this.batchNr = batchNr; + this.testName = testName; + this.repetition = repetition; + + samples = new float[SamplesCount]; + + log.Debug(this.ToString()); + } + + /// Start this operation + public void Start() + { + counter = 0; + + if (runsCountWhenSendingCmd == 0 && div.DiverterNr > 0) + { + SendCommand(); + log.DebugFormat("Start() ... Sending a command to read diverter {0}", div.Name); + } + + if (plotter != null) + { + plotter.Start(batchNr, testName, repetition); + log.DebugFormat("Start() ... plotter.Start({0}, {1}, {2})", batchNr, testName, repetition); + } + } + + /// Run this operation + /// + /// Event.FlowInDone or Event.FlowOutDone + /// + public Event Run() + { + counter++; + + if (counter == runsCountWhenSendingCmd && div.DiverterNr > 0) + { + SendCommand(); + log.DebugFormat("Run() ... Sending a command to read diverter {0}", div.Name); + } + else if (counter == runsCountWhenReadingDiv && div.DiverterNr > 0) + { + if (plotter == null) + { + ReadDiverterTransitionTimes(); + log.DebugFormat("Run() ... Reading diverter {0} transition times: {1}s", div.Name, transitionTimeSec.Val); + } + else + { + log.DebugFormat("Run() ... Reading diverter {0} samples", div.Name); + for (int i = 0; i < SamplesCount; i++) + { + float oneSample = controlBoard.DivSamples(i, div.DiverterNr - 1); + samples[i] = oneSample; + plotter.Update(oneSample); + } + plotter.Stop(); + + log.DebugFormat("Run() ... Calculating diverter {0} transition times: {1}s", div.Name, transitionTimeSec.Val); + CalculateDiverterTransitionTimes(); + } + } + + return Event.None; + } + + /// Stop this operation + public void Stop() + { + log.DebugFormat("Stop()"); + } + + void SendCommand() + { + controlBoard.SyncRoute(); + controlBoard.SendCommand(Command.ReadDivTransition, 0, controlBoard.Route, 0, 0, 0, 0, 0, 0, StopDevs.None); + cmdSent = true; + } + + /// + /// Diverter transition time is read from the control board + /// + /// true (always) + bool ReadDiverterTransitionTimes() + { + transitionTimeSec.Val = (float)controlBoard.DivTime(2) - (float)controlBoard.DivTime(1); + return true; + } + + /// + /// Diverter transition time is calculated from ADC samples and threshold levels + /// + /// true when transition time calculated OK + bool CalculateDiverterTransitionTimes() + { + bool startedRising = false; + bool startedFalling = false; + bool stopped = false; + + int transitionStartIdx = 0; + int transitionEndIdx = 0; + + float level = samples[0]; + for (int i = 1; i < SamplesCount; i++) + { + if (!startedRising && !startedFalling) + { + if (level <= div.ThresholdLo && samples[i] > div.ThresholdLo) + { + transitionStartIdx = i; + startedRising = true; + } + else if (level >= div.ThresholdHi && samples[i] < div.ThresholdHi) + { + transitionStartIdx = i; + startedFalling = true; + } + } + else if (startedRising && !stopped && level < div.ThresholdHi && samples[i] >= div.ThresholdHi) + { + transitionEndIdx = i; + stopped = true; + break; + } + else if (startedFalling && !stopped && level > div.ThresholdLo && samples[i] <= div.ThresholdLo) + { + transitionEndIdx = i; + stopped = true; + break; + } + } + + if ((startedRising || startedFalling) && stopped) + { + transitionTimeSec.Val = 0.002f * (float)(transitionEndIdx - transitionStartIdx); /// 2 ms per sample + return true; + } + else + { + return false; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ReadFlowOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ReadFlowOp.cs new file mode 100644 index 00000000..4e46d466 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ReadFlowOp.cs @@ -0,0 +1,70 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// +using System; +using log4net; +using TBF.Boxes; + +namespace TBF.BenchControl.Elde +{ + public class ReadFlowOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(ReadFlowOp)); + public override string ToString() { return string.Format("ReadFlowOp({0},.,.,{1})", flowMeter.Idx1, eventDone); } + + /// Set by the constructor + readonly GenericDevices.IFlowMeter flowMeter; + readonly ControlBoardDev controlBoard; + readonly DoubleBox flowBox; + readonly Event eventDone; + + /// + /// Events: FlowInDone, FlowOutDone or Error + /// + /// Flow meter reference + /// Reference to the measured flow variable, value is in bar + /// Event to be returned by Run() when completed OK + public ReadFlowOp(GenericDevices.IFlowMeter flowMeter, ControlBoardDev controlBoard, ref DoubleBox flowBox, Event eventDone) + { + if (flowMeter == null || controlBoard == null) throw new ArgumentNullException(); + + this.flowMeter = flowMeter; + this.controlBoard = controlBoard; + this.eventDone = eventDone; + this.flowBox = flowBox; + + log.Debug(this.ToString()); + } + public ReadFlowOp(GenericDevices.IFlowMeter flowMeter, ControlBoardDev controlBoard, ref DoubleBox flowBox) + : this(flowMeter, controlBoard, ref flowBox, Event.FlowMeasurementDone) + { + } + + /// Start this operation + public void Start() + { + } + + /// Run this operation + /// + /// Event.FlowInDone or Event.FlowOutDone + /// + public Event Run() + { + if ((int)(controlBoard.StatusP & StatusP.RefFlowMeterMask) == flowMeter.Idx1) + { + flowBox.Val = flowMeter.ReadFlow(); + return eventDone; + } + else + { + return Event.Error; + } + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegisterReader/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegisterReader/Factory.cs new file mode 100644 index 00000000..833b83aa --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegisterReader/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.RegisterReader +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return "RegisterReader"; } } + + public void ResetStaticProperties() { RegisterReader.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new RegisterReader(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new RegisterReader(cfg, components); } + + public IComponentCfg DefaultConfig() { return new RegisterReaderCfg("Sick", this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(RegisterReaderCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegisterReader/RRProcedureParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegisterReader/RRProcedureParams.cs new file mode 100644 index 00000000..be9b00a3 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegisterReader/RRProcedureParams.cs @@ -0,0 +1,119 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.Elde.RegisterReader +{ + public class RRProcedureParams : ProcedureParamsBase, IParamsProvider, IProcedureParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(RRProcedureParams) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public double PulsesPerLtr; /// [l^-1] + + public override void InitializeAll() + { + PulsesPerLtr = 1.0; + } + + string[] paramNames = new string[] + { + Strings.PulsesPerLtr, + }; + public override string ParamName(int i) { return paramNames[i]; } + public override int ParamsCount() { return paramNames.Length; } + + public override string ToString(int i) + { + switch (i) + { + case 0: return PulsesPerLtr.ToString(); + default: return string.Empty; + } + } + + /// Retrieves parameters from UI controls + public CfgUpdateFlags UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: PulsesPerLtr = Utils.ParseUDouble(strValue); return CfgUpdateFlags.None; + default: return CfgUpdateFlags.None; + } + } + + /// Verifies whether strings in UI controls represent valid parameters + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + + double dummy; + switch (i) + { + case 0: + if (Utils.TryParseUDouble(strValue, out dummy)) return true; + break; + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(RRProcedureParams prms) + { + prms.PulsesPerLtr = this.PulsesPerLtr; + } + + public IParamsProvider Clone() + { + RRProcedureParams pars = new RRProcedureParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateFromDbEntity(ComponentProcedure dbEntity) + { + if (dbEntity == null) return; + try + { + RRProcedureParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as RRProcedureParams; + + procedureParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + procedure = dbEntity.Procedure; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + + public RRProcedureParams() + { + } + + public RRProcedureParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public RRProcedureParams(ComponentProcedure procedureParamsEntity, string componentName, Procedure procedure) + { + this.procedureParamsEntity = procedureParamsEntity; + this.componentName = componentName; + this.procedure = procedure; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegisterReader/RegisterReader.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegisterReader/RegisterReader.cs new file mode 100644 index 00000000..48288845 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegisterReader/RegisterReader.cs @@ -0,0 +1,138 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.Boxes; + +namespace TBF.BenchControl.Elde.RegisterReader +{ + public class RegisterReader : ComponentBase, GenericDevices.IRegisterReader, IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(RegisterReader)); + public override string ToString() { return string.Format("RegisterReader({0})", Cfg.ToString(1)); } + + readonly RegisterReaderCfg registerReaderCfg; + + public int Position { get { return registerReaderCfg.Position; } } /// 1 .. inf + /// + public Config.Entities.RegisterReaderType RegisterReaderType { get { return Config.Entities.RegisterReaderType.Pulses; } } + public double PulsesPerLtr { get { return registerReaderCfg.ProcParams.PulsesPerLtr; } } + public double LtrsPerPulse { get { return (PulsesPerLtr <= float.Epsilon) ? 1.0 : (1 / PulsesPerLtr); ; } } + + public int WMPulses { get { return wmPulses; } } + public int WMRefPulses { get { return wmRefPulses; } } + public double WMVolume { get { return LtrsPerPulse * (double)wmPulses; } } + + public double BeginWMState { get { return 0; } } /// Always 0 + public double EndWMState { get { return WMVolume; } } /// Derived from WMVolume + + int wmPulses; + int wmRefPulses; + + /// This is to cope with counter overflow + int lastPulses; + bool lastPulsesValid; + + readonly ControlBoardDev controlBoard; + + + public RegisterReader() + { + } + + public RegisterReader(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + registerReaderCfg = cfg as RegisterReaderCfg; + + controlBoard = (ControlBoardDev)TbfComponents.FindComponent(cfg.ParentName, components); + if (controlBoard == null) throw new Exception("Cannot find " + Name + " parent"); + + Clear(); + + /// Prepare data for SendCalibData() control board component method + + log.Debug(this.ToString()); + } + + public void Clear() + { + log.DebugFormat("{0}:Clear()", Name); + wmPulses = 0; + wmRefPulses = 0; + lastPulsesValid = false; + } + + public void TestCompleted() + { + log.DebugFormat("{0}:TestCompleted()", Name); + ReadPulses(); + } + + /// + /// Events: Event.ReadRegisterDone, Event.Error + /// + /// ReadWaterMeter instance reference casted to IOperaton + public IOperation ReadRegisterOp() + { + return this; + } + + private void ReadPulses() + { + log.DebugFormat("{0}:ReadPulses() started, lastPulses={1}, lastPulsesValid={2}", Name, lastPulses, lastPulsesValid); + if (!lastPulsesValid) + { + lastPulses = (int)controlBoard.WMeterPulses(Position); + lastPulsesValid = true; + } + else + { + UInt16 lowerWord = controlBoard.WMeterPulses(Position); + int uncorrected = (int)(((uint)lastPulses & 0xFFFF0000) | lowerWord); + if (Math.Abs(uncorrected - lastPulses) <= Int16.MaxValue) + { + lastPulses = uncorrected; + } + else if (Math.Abs(uncorrected + 65536 - lastPulses) <= Int16.MaxValue) + { + lastPulses = uncorrected + 65536; + } + else if (Math.Abs(uncorrected - 65536 - lastPulses) <= Int16.MaxValue) + { + lastPulses = uncorrected - 65536; + } + } + + wmPulses = lastPulses; + wmRefPulses = (int)controlBoard.EtPulses(Position); + + log.DebugFormat("{0}:ReadPulses() completed, wmPulses={1} wmRefPulses={2} cb.EtPulses(0)={3}", Name, wmPulses, wmRefPulses, (int)controlBoard.EtPulses(0)); + } + + /// Start this operation + public void Start() + { + log.DebugFormat("{0}:Start()", Name); + lastPulsesValid = false; + ReadPulses(); + } + + /// Run this operation + /// eventDone + public Event Run() + { + log.DebugFormat("{0}:Run()", Name); + ReadPulses(); + return Event.ReadRegisterDone; + } + + /// Stop this operation + public void Stop() + { + log.DebugFormat("{0}:Stop()", Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegisterReader/RegisterReaderCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegisterReader/RegisterReaderCfg.cs new file mode 100644 index 00000000..a16fdfe4 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegisterReader/RegisterReaderCfg.cs @@ -0,0 +1,51 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.RegisterReader +{ + public class RegisterReaderCfg : ComponentCfgBase, Generic.IChildComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(RegisterReaderCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new RegisterReaderCfgCtrl(); } + + /// + /// Serialized parameters + /// + public int Position; /// 1..nrWaterMeters + + /// Procedure parameters + [XmlIgnore] + public RRProcedureParams ProcParams; + public override IParamsProvider GetRuntimeProcParamsProvider() { return ProcParams; } + public override IParamsProvider CreateProcParamsProvider() { return new RRProcedureParams(true); } + + /// Private parameterless constructor invoked by all other (public) constructors + RegisterReaderCfg() + { + ProcParams = new RRProcedureParams(true); + } + + public RegisterReaderCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + Factory = factory; + ParentName = "CB"; + Position = 1; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Parent={1}, Position={2}", + Name, + (string.IsNullOrEmpty(ParentName) ? "-" : ParentName), + Position); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegisterReader/RegisterReaderCfgCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegisterReader/RegisterReaderCfgCtrl.Designer.cs new file mode 100644 index 00000000..f094f992 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegisterReader/RegisterReaderCfgCtrl.Designer.cs @@ -0,0 +1,133 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.Elde.RegisterReader +{ + partial class RegisterReaderCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.positionTextBox = new System.Windows.Forms.TextBox(); + this.positionLabel = new System.Windows.Forms.Label(); + this.parentNameLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.componentNameLabel = new System.Windows.Forms.Label(); + this.parentNameComboBox = new System.Windows.Forms.ComboBox(); + this.SuspendLayout(); + // + // positionTextBox + // + this.positionTextBox.Enabled = false; + this.positionTextBox.Location = new System.Drawing.Point(136, 119); + this.positionTextBox.Name = "positionTextBox"; + this.positionTextBox.Size = new System.Drawing.Size(46, 20); + this.positionTextBox.TabIndex = 6; + // + // positionLabel + // + this.positionLabel.AutoSize = true; + this.positionLabel.Location = new System.Drawing.Point(26, 122); + this.positionLabel.Name = "positionLabel"; + this.positionLabel.Size = new System.Drawing.Size(44, 13); + this.positionLabel.TabIndex = 5; + this.positionLabel.Text = "Position"; + // + // parentNameLabel + // + this.parentNameLabel.AutoSize = true; + this.parentNameLabel.Location = new System.Drawing.Point(26, 96); + this.parentNameLabel.Name = "parentNameLabel"; + this.parentNameLabel.Size = new System.Drawing.Size(69, 13); + this.parentNameLabel.TabIndex = 3; + this.parentNameLabel.Text = "Parent Name"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(136, 67); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(26, 70); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // componentNameLabel + // + this.componentNameLabel.AutoSize = true; + this.componentNameLabel.Location = new System.Drawing.Point(133, 43); + this.componentNameLabel.Name = "componentNameLabel"; + this.componentNameLabel.Size = new System.Drawing.Size(83, 13); + this.componentNameLabel.TabIndex = 0; + this.componentNameLabel.Text = "ComonentName"; + // + // parentNameComboBox + // + this.parentNameComboBox.Enabled = false; + this.parentNameComboBox.FormattingEnabled = true; + this.parentNameComboBox.Location = new System.Drawing.Point(136, 93); + this.parentNameComboBox.Name = "parentNameComboBox"; + this.parentNameComboBox.Size = new System.Drawing.Size(130, 21); + this.parentNameComboBox.TabIndex = 4; + // + // RegisterReaderCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.parentNameComboBox); + this.Controls.Add(this.positionTextBox); + this.Controls.Add(this.positionLabel); + this.Controls.Add(this.parentNameLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.componentNameLabel); + this.Name = "RegisterReaderCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.RegisterReaderCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox positionTextBox; + private System.Windows.Forms.Label positionLabel; + private System.Windows.Forms.Label parentNameLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label componentNameLabel; + private System.Windows.Forms.ComboBox parentNameComboBox; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegisterReader/RegisterReaderCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegisterReader/RegisterReaderCfgCtrl.cs new file mode 100644 index 00000000..30feff70 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegisterReader/RegisterReaderCfgCtrl.cs @@ -0,0 +1,104 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.RegisterReader +{ + public partial class RegisterReaderCfgCtrl : UserControl, IComponentCfgCtrl + { + ComponentParametersDlg parent; + + public bool ShowMore { get { return false; } } + + RegisterReaderCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as RegisterReaderCfg; + Redraw(); + } + } + + public RegisterReaderCfgCtrl() + { + InitializeComponent(); + } + + private void RegisterReaderCfgCtrl_Load(object sender, EventArgs e) + { + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + + if (parent.TbfComponents != null) + { + foreach (var cmpnt in parent.TbfComponents) + { + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is Elde.ControlBoardFactory) + { + parentNameComboBox.Items.Add(cmpnt.Name); + } + } + } + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + componentNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + parentNameComboBox.Text = string.IsNullOrEmpty(config.ParentName) ? "---" : config.ParentName; + positionTextBox.Text = config.Position.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + parentNameComboBox.Enabled = true; + positionTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!parentNameComboBox.Items.Contains(parentNameComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Parent Name'"; + } + if (!int.TryParse(positionTextBox.Text, out dummy) || (dummy < 1)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Position' should be >= 1"; + } + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.ParentName = parentNameComboBox.Text.Equals("---") ? string.Empty : parentNameComboBox.Text; + config.Position = int.Parse(positionTextBox.Text); + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegisterReader/RegisterReaderCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegisterReader/RegisterReaderCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegisterReader/RegisterReaderCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValve/ChangeValvePositionOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValve/ChangeValvePositionOp.cs new file mode 100644 index 00000000..70670419 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValve/ChangeValvePositionOp.cs @@ -0,0 +1,78 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl.Elde.RegulValve +{ + public class ChangeRegulValvePositionOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(ChangeRegulValvePositionOp)); + public override string ToString() + { + return string.Format("ChangeRegulValvePositionOp({0},{1}s)", regulValve.Name, timePulseSec.ToString("F2")); + } + + /// Set by the constructor + readonly ControlBoardDev controlBoard; + readonly RegulValve regulValve; + readonly int regulValveNr; + readonly float timePulseSec; + + /// + /// Set required water flow. + /// Events: FlowSet, FlowTimeOut + /// + /// Control board device + /// Regulation valve component + /// Lower limit of the position to be achieved + /// Upper limit of the position to be achieved + /// Timeout in sec. for setting the flow + /// Only Elde.Valve flow are used, other flow on the lists are ignored + public ChangeRegulValvePositionOp(ControlBoardDev controlBoard, RegulValve _regulValve, float timePulseSec) + { + if (controlBoard == null) throw new ArgumentNullException("ctrlBoard"); + this.controlBoard = controlBoard; + + regulValve = _regulValve as RegulValve; + if (regulValve == null) throw new ArgumentNullException("regValve is null or not Elde"); + regulValveNr = this.regulValve.Idx1; + + this.timePulseSec = timePulseSec; + + log.Debug(this.ToString()); + } + + /// Start this operation + public void Start() + { + float positionPct = controlBoard.RValvePosition(regulValveNr); + log.WarnFormat("RV#={0}, actPos={1}%", regulValveNr, positionPct.ToString("F1")); + + controlBoard.ValveMove(regulValveNr, + RegulValveMode.PulseWidth, + new float[2] { timePulseSec, timePulseSec }, + regulValve.StableTime); + } + + /// Run this operation + /// + /// Event.SetFlowDone + /// + public Event Run() + { + float positionPct = controlBoard.RValvePosition(regulValveNr); + log.WarnFormat("RV#={0}, actPos={1}%", regulValveNr, positionPct.ToString("F1")); + + return Event.PositionReached; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValve/Handlers.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValve/Handlers.cs new file mode 100644 index 00000000..acf76b5d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValve/Handlers.cs @@ -0,0 +1,36 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using log4net; + +namespace TBF.BenchControl.Elde.RegulValve +{ + static class Handlers + { + static readonly ILog log = LogManager.GetLogger(typeof(Handlers)); + + static Handlers() + { + } + + /// + /// Called from the state machine when a procedure is selected and UI needs to be updated. + /// + public static void OnAdcChanged(object sender, CmdResponseArgs data) + { + if (AdcChangedHandler == null) + return; + + try + { + AdcChangedHandler(sender, data); + } + catch (Exception e) + { + log.Error("AdcChangedHandler(...) failed", e); + } + } + public static event EventHandler AdcChangedHandler; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValve/RegulValve.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValve/RegulValve.cs new file mode 100644 index 00000000..c7100571 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValve/RegulValve.cs @@ -0,0 +1,187 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.BenchControl.Generic; +using TBF.Boxes; + +namespace TBF.BenchControl.Elde.RegulValve +{ + public class RegulValve : ComponentBase, IDevice, GenericDevices.IRegulValve + { + private static readonly ILog log = LogManager.GetLogger(typeof(RegulValve)); + public override string ToString() { return string.Format("RegulValve({0})", Cfg.ToString(1)); } + + + public readonly RegulValveCfg RegulValveCfg; + + IDictionary dict; + public IDictionary Dict { get { return dict; } } + + public readonly ControlBoardDev ControlBoard; + + public ValveCategory Category { get { return RegulValveCfg.Category; } } + public int Idx1 { get { return RegulValveCfg.Idx1; } } /// 1..7 + public int DacValueClosed { get { return RegulValveCfg.AdcValueClosed; } } /// 0..1023 + public int DacValueOpen { get { return RegulValveCfg.AdcValueOpen; } } /// 0..1023 + public int StableTime { get { return RegulValveCfg.StableTime; } } /// 0=200ms, step=50ms, max. 1500ms (max.26) + public int FlowStableSec { get { return RegulValveCfg.FlowStableSec; } } /// 0..60 sec + /// + public bool IsCoax { get { return false; } } + /// + public float Position { get { return ControlBoard.RValvePosition(Idx1); } } + /// + int adcChannel; + + + #region Configuration Change Handling + + public static void OnCfgChange(object sender, CfgChangeArgs args) + { + if (CfgChangeHandler == null) return; + try { CfgChangeHandler(sender, args); } + catch (Exception e) { log.Error("CfgChangeHandler(...) failed", e); } + } + + public static event EventHandler CfgChangeHandler; + + public override void StartChangeHandler() + { + CfgChangeHandler += delegate(object sender, CfgChangeArgs args) + { + RegulValveCfg tmpcfg = args.Cfg as RegulValveCfg; + if (tmpcfg != null && tmpcfg.Name.Equals(Name)) + { + if (args.Command == CfgChangeCmd.CfgChange) + { + RegulValveCfg.StableTimeMs = tmpcfg.StableTimeMs; + RegulValveCfg.FlowStableSec = tmpcfg.FlowStableSec; + } + else if (args.Command == CfgChangeCmd.RVOpenStep) + { + ControlBoard.ValveMove(Idx1, RegulValveMode.PulseWidth, new float[2] { 2.0f, 2.0f }, StableTime); + // TODO: avoid conflicts + // TOTEST + } + else if (args.Command == CfgChangeCmd.RVCloseStep) + { + ControlBoard.ValveMove(Idx1, RegulValveMode.PulseWidth, new float[2] { -2.0f, -2.0f }, StableTime); + // TODO: avoid conflicts + // TOTEST + } + else if (args.Command == CfgChangeCmd.GetAdc1 || args.Command == CfgChangeCmd.GetAdc2) + { + int adcValue = (int)ControlBoard.AnalogInputRaw(adcChannel, 0); + RegulValveCfgCtrl.OnCmdResponse(this, new CmdResponseArgs(args.Command, Idx1, adcValue)); + } + } + }; + } + + #endregion Configuration Change Handling + + + public RegulValve() + { + } + + public RegulValve(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + RegulValveCfg = cfg as RegulValveCfg; + + ControlBoard = (ControlBoardDev)TbfComponents.FindComponent(cfg.ParentName, components); + if (ControlBoard == null) throw new Exception("Cannot find " + Name + " parent"); + + this.dict = new Dictionary(); + + if (Idx1 < ControlBoard.RegValveCalib.GetLength(0)) + { + this.ControlBoard.RegValveCalib[Idx1 - 1, 0] = (uint)DacValueClosed; + this.ControlBoard.RegValveCalib[Idx1 - 1, 1] = (uint)DacValueOpen; + } + else + { + log.ErrorFormat("Unable to set {0} ADC levels: RegValveCalib array size={1}, RV Idx1={2}, RV AdcNr={3}", + Name, ControlBoard.RegValveCalib.GetLength(0), Idx1, Idx1 - 1); + } + +#if GENESIS + adcChannel = (Idx1 < 6) ? (Idx1 - 1) : (Idx1 - 2); +#elif SENTEC + adcChannel = (Idx1 < 3) ? (Idx1 - 1) : (Idx1 - 2); +#else + adcChannel = Idx1 - 1; +#endif + + StartChangeHandler(); + + log.Debug(this.ToString()); + } + + + /// + /// IDevice interface implementation + /// + public void Initialize() { } + public void RunDeviceBefore() + { + int adcValue = (int)ControlBoard.AnalogInputRaw(adcChannel, 0); + Handlers.OnAdcChanged(this, new CmdResponseArgs(CfgChangeCmd.GetAdc, Idx1, adcValue)); + } + public void RunDeviceAfter() { } + public void StopDevice() { } + public void StopDevice2() { } + + + /// + /// Operation to set the water flow within tolerances + /// Events: Event.None, Event.FlowReached, Event.FlowTimeOut + /// + /// Flowmeter component + /// Lower limit of the required flow [m3/h] + /// Higher limit of the required flow [m3/h] + /// PID coefficient (float) + /// Measured flow [m3/h] + /// Timeout in [s] + /// SetFlowOp instance + public IOperation SetFlowOp(GenericDevices.IFlowMeter flowMeter, float requiredFlowLo, float requiredFlowHi, float pidCoef, DoubleBox measuredFlow, int timeout) + { + return new SetFlowOp(ControlBoard, this, flowMeter, requiredFlowLo, requiredFlowHi, pidCoef, measuredFlow, RegulValveCfg.ReTryCommands, timeout); + } + + /// + /// Operation to set the water flow within tolerances. Leave the measurement running. + /// Events: Event.None, Event.FlowReached, Event.FlowTimeOut + /// + /// Flowmeter component + /// Lower limit of the required flow [m3/h] + /// Higher limit of the required flow [m3/h] + /// Measured flow [m3/h] + /// Timeout in [s] + /// SetFlowOp instance + public IOperation SetFlowAndMeasureOp(GenericDevices.IFlowMeter flowMeter, float requiredFlowLo, float requiredFlowHi, float pidCoef, DoubleBox measuredFlow, int timeout, float filterConstant) + { + return new SetFlowOp(ControlBoard, this, flowMeter, requiredFlowLo, requiredFlowHi, pidCoef, measuredFlow, RegulValveCfg.ReTryCommands, timeout, true); + } + + /// + /// Operation to set the regulation valve to a required position + /// Events: Event.None + /// + /// Lower limit of the required valve position in [%] + /// Higher limit of the required valve position in [%] + /// SetPositionOp instance + public IOperation SetRegulValvePositionOp(float pctLo, float pctHi, int timeoutMs) + { + return new SetRegulValvePositionOp(ControlBoard, this, pctLo, pctHi, timeoutMs); + } + + public IOperation ChangeRegulValvePositionOp(float timePulseSec) + { + return new ChangeRegulValvePositionOp(ControlBoard, this, timePulseSec); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValve/RegulValveCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValve/RegulValveCfg.cs new file mode 100644 index 00000000..9a080116 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValve/RegulValveCfg.cs @@ -0,0 +1,72 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.RegulValve +{ + public class RegulValveCfg : ComponentCfgBase, IChildComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(RegulValveCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new RegulValveCfgCtrl(); } + + /// + /// Serialized parameters + /// + public int Idx1; /// 1..8 + public ValveCategory Category; /// Feeding, Output or All + public int AdcValueClosed; /// 0..1023 + public int AdcValueOpen; /// 0..1023 + public int StableTimeMs; /// 200..1500 ms + public int FlowStableSec; /// 0..60 sec + public bool StoredPositionReuse; /// true = store and re-use previous regulation valve positions + public bool ReTryCommands; + + /// + /// Stabilization time when setting the flow: 0=200ms, step 50ms, max. 1.5 sec. + /// + public int StableTime { get { return (StableTimeMs - 200) / 50; } } + + /// Private parameterless constructor invoked by all other (public) constructors + RegulValveCfg() + { + } + + public RegulValveCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + Factory = factory; + ParentName = "CB"; + Category = ValveCategory.Output; + Idx1 = 1; + AdcValueClosed = 100; + AdcValueOpen = 500; + StableTimeMs = 500; + FlowStableSec = 5; + StoredPositionReuse = false; + ReTryCommands = false; + } + + public string ToString(int i) + { + return string.Format("Name={0} ({1}), Idx1={2}, Cat.={3}, ADC-Closed={4}, ADC-Open={5}, StabTm={6}ms, FlowStable={7}s, PosReuse={8}, ReTryCmds={9}", + Name, + (string.IsNullOrEmpty(ParentName) ? "-" : ParentName), + Idx1, + Category, + AdcValueClosed, + AdcValueOpen, + StableTimeMs, + FlowStableSec, + StoredPositionReuse, + ReTryCommands); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValve/RegulValveCfgChangeArgs.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValve/RegulValveCfgChangeArgs.cs new file mode 100644 index 00000000..80bfb340 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValve/RegulValveCfgChangeArgs.cs @@ -0,0 +1,19 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; + +namespace TBF.BenchControl.Elde.RegulValve +{ + public class RegulValveCfgChangeArgs : EventArgs + { + public CfgChangeCmd Command; + public Generic.IComponentCfg Cfg; + + public RegulValveCfgChangeArgs(CfgChangeCmd command, Generic.IComponentCfg cfg) + { + Command = command; + Cfg = cfg; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValve/RegulValveCfgCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValve/RegulValveCfgCtrl.Designer.cs new file mode 100644 index 00000000..173760d2 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValve/RegulValveCfgCtrl.Designer.cs @@ -0,0 +1,523 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.Elde.RegulValve +{ + partial class RegulValveCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.positionTextBox = new System.Windows.Forms.TextBox(); + this.positionLabel = new System.Windows.Forms.Label(); + this.parentNameLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.adcClosedLabel = new System.Windows.Forms.Label(); + this.adcClosedTextBox = new System.Windows.Forms.TextBox(); + this.adcOpenTextBox = new System.Windows.Forms.TextBox(); + this.adcOpenLabel = new System.Windows.Forms.Label(); + this.parentNameComboBox = new System.Windows.Forms.ComboBox(); + this.storedPosReuseCheckBox = new System.Windows.Forms.CheckBox(); + this.stableTimeTextBox = new System.Windows.Forms.TextBox(); + this.stableTimeLabel = new System.Windows.Forms.Label(); + this.flowStableSecTextBox = new System.Windows.Forms.TextBox(); + this.flowStableSecLabel = new System.Windows.Forms.Label(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.setButton1 = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.ADC = new System.Windows.Forms.Label(); + this.getButton1 = new System.Windows.Forms.Button(); + this.pctTextBox1 = new System.Windows.Forms.TextBox(); + this.adcTextBox1 = new System.Windows.Forms.TextBox(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.setButton2 = new System.Windows.Forms.Button(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.getButton2 = new System.Windows.Forms.Button(); + this.pctTextBox2 = new System.Windows.Forms.TextBox(); + this.adcTextBox2 = new System.Windows.Forms.TextBox(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.closeButton = new System.Windows.Forms.Button(); + this.openButton = new System.Windows.Forms.Button(); + this.adcTextBox = new System.Windows.Forms.TextBox(); + this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.label4 = new System.Windows.Forms.Label(); + this.categoryComboBox = new System.Windows.Forms.ComboBox(); + this.categoryLabel = new System.Windows.Forms.Label(); + this.reTryCommandsCheckBox = new System.Windows.Forms.CheckBox(); + this.groupBox1.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.groupBox4.SuspendLayout(); + this.SuspendLayout(); + // + // positionTextBox + // + this.positionTextBox.Enabled = false; + this.positionTextBox.Location = new System.Drawing.Point(138, 114); + this.positionTextBox.Name = "positionTextBox"; + this.positionTextBox.Size = new System.Drawing.Size(46, 20); + this.positionTextBox.TabIndex = 8; + // + // positionLabel + // + this.positionLabel.AutoSize = true; + this.positionLabel.Location = new System.Drawing.Point(28, 117); + this.positionLabel.Name = "positionLabel"; + this.positionLabel.Size = new System.Drawing.Size(18, 13); + this.positionLabel.TabIndex = 7; + this.positionLabel.Text = "ID"; + // + // parentNameLabel + // + this.parentNameLabel.AutoSize = true; + this.parentNameLabel.Location = new System.Drawing.Point(28, 68); + this.parentNameLabel.Name = "parentNameLabel"; + this.parentNameLabel.Size = new System.Drawing.Size(69, 13); + this.parentNameLabel.TabIndex = 3; + this.parentNameLabel.Text = "Parent Name"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(138, 41); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(28, 44); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(135, 14); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(89, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComponentName"; + // + // adcClosedLabel + // + this.adcClosedLabel.AutoSize = true; + this.adcClosedLabel.Location = new System.Drawing.Point(28, 141); + this.adcClosedLabel.Name = "adcClosedLabel"; + this.adcClosedLabel.Size = new System.Drawing.Size(93, 13); + this.adcClosedLabel.TabIndex = 9; + this.adcClosedLabel.Text = "ADC when Closed"; + // + // adcClosedTextBox + // + this.adcClosedTextBox.Enabled = false; + this.adcClosedTextBox.Location = new System.Drawing.Point(138, 138); + this.adcClosedTextBox.Name = "adcClosedTextBox"; + this.adcClosedTextBox.Size = new System.Drawing.Size(46, 20); + this.adcClosedTextBox.TabIndex = 10; + // + // adcOpenTextBox + // + this.adcOpenTextBox.Enabled = false; + this.adcOpenTextBox.Location = new System.Drawing.Point(138, 162); + this.adcOpenTextBox.Name = "adcOpenTextBox"; + this.adcOpenTextBox.Size = new System.Drawing.Size(46, 20); + this.adcOpenTextBox.TabIndex = 12; + // + // adcOpenLabel + // + this.adcOpenLabel.AutoSize = true; + this.adcOpenLabel.Location = new System.Drawing.Point(28, 165); + this.adcOpenLabel.Name = "adcOpenLabel"; + this.adcOpenLabel.Size = new System.Drawing.Size(87, 13); + this.adcOpenLabel.TabIndex = 11; + this.adcOpenLabel.Text = "ADC when Open"; + // + // parentNameComboBox + // + this.parentNameComboBox.Enabled = false; + this.parentNameComboBox.FormattingEnabled = true; + this.parentNameComboBox.Location = new System.Drawing.Point(138, 65); + this.parentNameComboBox.Name = "parentNameComboBox"; + this.parentNameComboBox.Size = new System.Drawing.Size(130, 21); + this.parentNameComboBox.TabIndex = 4; + // + // storedPosReuseCheckBox + // + this.storedPosReuseCheckBox.AutoSize = true; + this.storedPosReuseCheckBox.Enabled = false; + this.storedPosReuseCheckBox.Location = new System.Drawing.Point(31, 239); + this.storedPosReuseCheckBox.Name = "storedPosReuseCheckBox"; + this.storedPosReuseCheckBox.Size = new System.Drawing.Size(162, 17); + this.storedPosReuseCheckBox.TabIndex = 17; + this.storedPosReuseCheckBox.Text = "Enable stored position re-use"; + this.storedPosReuseCheckBox.UseVisualStyleBackColor = true; + // + // stableTimeTextBox + // + this.stableTimeTextBox.Enabled = false; + this.stableTimeTextBox.Location = new System.Drawing.Point(138, 186); + this.stableTimeTextBox.Name = "stableTimeTextBox"; + this.stableTimeTextBox.Size = new System.Drawing.Size(46, 20); + this.stableTimeTextBox.TabIndex = 14; + // + // stableTimeLabel + // + this.stableTimeLabel.AutoSize = true; + this.stableTimeLabel.Location = new System.Drawing.Point(28, 189); + this.stableTimeLabel.Name = "stableTimeLabel"; + this.stableTimeLabel.Size = new System.Drawing.Size(81, 13); + this.stableTimeLabel.TabIndex = 13; + this.stableTimeLabel.Text = "Stable time [ms]"; + // + // flowStableSecTextBox + // + this.flowStableSecTextBox.Enabled = false; + this.flowStableSecTextBox.Location = new System.Drawing.Point(138, 210); + this.flowStableSecTextBox.Name = "flowStableSecTextBox"; + this.flowStableSecTextBox.Size = new System.Drawing.Size(46, 20); + this.flowStableSecTextBox.TabIndex = 16; + // + // flowStableSecLabel + // + this.flowStableSecLabel.AutoSize = true; + this.flowStableSecLabel.Location = new System.Drawing.Point(28, 213); + this.flowStableSecLabel.Name = "flowStableSecLabel"; + this.flowStableSecLabel.Size = new System.Drawing.Size(74, 13); + this.flowStableSecLabel.TabIndex = 15; + this.flowStableSecLabel.Text = "Flow stable [s]"; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.setButton1); + this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Controls.Add(this.ADC); + this.groupBox1.Controls.Add(this.getButton1); + this.groupBox1.Controls.Add(this.pctTextBox1); + this.groupBox1.Controls.Add(this.adcTextBox1); + this.groupBox1.Location = new System.Drawing.Point(10, 398); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(280, 59); + this.groupBox1.TabIndex = 19; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Measured value 1"; + // + // setButton1 + // + this.setButton1.Location = new System.Drawing.Point(229, 17); + this.setButton1.Name = "setButton1"; + this.setButton1.Size = new System.Drawing.Size(38, 33); + this.setButton1.TabIndex = 5; + this.setButton1.Text = "Set"; + this.setButton1.UseVisualStyleBackColor = true; + this.setButton1.Click += new System.EventHandler(this.setButton_Click); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(209, 28); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(15, 13); + this.label1.TabIndex = 4; + this.label1.Text = "%"; + // + // ADC + // + this.ADC.AutoSize = true; + this.ADC.Location = new System.Drawing.Point(11, 28); + this.ADC.Name = "ADC"; + this.ADC.Size = new System.Drawing.Size(32, 13); + this.ADC.TabIndex = 3; + this.ADC.Text = "ADC:"; + // + // getButton1 + // + this.getButton1.Location = new System.Drawing.Point(101, 18); + this.getButton1.Name = "getButton1"; + this.getButton1.Size = new System.Drawing.Size(38, 33); + this.getButton1.TabIndex = 2; + this.getButton1.Text = "Get"; + this.getButton1.UseVisualStyleBackColor = true; + this.getButton1.Click += new System.EventHandler(this.getButton1_Click); + // + // pctTextBox1 + // + this.pctTextBox1.Location = new System.Drawing.Point(160, 24); + this.pctTextBox1.Name = "pctTextBox1"; + this.pctTextBox1.Size = new System.Drawing.Size(46, 20); + this.pctTextBox1.TabIndex = 1; + // + // adcTextBox1 + // + this.adcTextBox1.Location = new System.Drawing.Point(47, 24); + this.adcTextBox1.Name = "adcTextBox1"; + this.adcTextBox1.Size = new System.Drawing.Size(44, 20); + this.adcTextBox1.TabIndex = 0; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.setButton2); + this.groupBox2.Controls.Add(this.label2); + this.groupBox2.Controls.Add(this.label3); + this.groupBox2.Controls.Add(this.getButton2); + this.groupBox2.Controls.Add(this.pctTextBox2); + this.groupBox2.Controls.Add(this.adcTextBox2); + this.groupBox2.Location = new System.Drawing.Point(10, 462); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(280, 59); + this.groupBox2.TabIndex = 20; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Measured value 2"; + // + // setButton2 + // + this.setButton2.Location = new System.Drawing.Point(229, 17); + this.setButton2.Name = "setButton2"; + this.setButton2.Size = new System.Drawing.Size(38, 33); + this.setButton2.TabIndex = 5; + this.setButton2.Text = "Set"; + this.setButton2.UseVisualStyleBackColor = true; + this.setButton2.Click += new System.EventHandler(this.setButton_Click); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(209, 28); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(15, 13); + this.label2.TabIndex = 4; + this.label2.Text = "%"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(11, 27); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(32, 13); + this.label3.TabIndex = 3; + this.label3.Text = "ADC:"; + // + // getButton2 + // + this.getButton2.Location = new System.Drawing.Point(101, 18); + this.getButton2.Name = "getButton2"; + this.getButton2.Size = new System.Drawing.Size(38, 33); + this.getButton2.TabIndex = 2; + this.getButton2.Text = "Get"; + this.getButton2.UseVisualStyleBackColor = true; + this.getButton2.Click += new System.EventHandler(this.getButton2_Click); + // + // pctTextBox2 + // + this.pctTextBox2.Location = new System.Drawing.Point(160, 24); + this.pctTextBox2.Name = "pctTextBox2"; + this.pctTextBox2.Size = new System.Drawing.Size(46, 20); + this.pctTextBox2.TabIndex = 1; + // + // adcTextBox2 + // + this.adcTextBox2.Location = new System.Drawing.Point(47, 24); + this.adcTextBox2.Name = "adcTextBox2"; + this.adcTextBox2.Size = new System.Drawing.Size(44, 20); + this.adcTextBox2.TabIndex = 0; + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.closeButton); + this.groupBox3.Controls.Add(this.openButton); + this.groupBox3.Location = new System.Drawing.Point(10, 527); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(280, 60); + this.groupBox3.TabIndex = 21; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "Regulation valve"; + // + // closeButton + // + this.closeButton.Location = new System.Drawing.Point(14, 19); + this.closeButton.Name = "closeButton"; + this.closeButton.Size = new System.Drawing.Size(107, 28); + this.closeButton.TabIndex = 1; + this.closeButton.Text = "Close"; + this.closeButton.UseVisualStyleBackColor = true; + this.closeButton.Click += new System.EventHandler(this.closeButton_Click); + // + // openButton + // + this.openButton.Location = new System.Drawing.Point(160, 19); + this.openButton.Name = "openButton"; + this.openButton.Size = new System.Drawing.Size(107, 28); + this.openButton.TabIndex = 0; + this.openButton.Text = "Open"; + this.openButton.UseVisualStyleBackColor = true; + this.openButton.Click += new System.EventHandler(this.openButton_Click); + // + // adcTextBox + // + this.adcTextBox.Location = new System.Drawing.Point(47, 14); + this.adcTextBox.Name = "adcTextBox"; + this.adcTextBox.Size = new System.Drawing.Size(44, 20); + this.adcTextBox.TabIndex = 21; + // + // groupBox4 + // + this.groupBox4.Controls.Add(this.label4); + this.groupBox4.Controls.Add(this.adcTextBox); + this.groupBox4.Location = new System.Drawing.Point(10, 352); + this.groupBox4.Name = "groupBox4"; + this.groupBox4.Size = new System.Drawing.Size(279, 40); + this.groupBox4.TabIndex = 22; + this.groupBox4.TabStop = false; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(11, 17); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(32, 13); + this.label4.TabIndex = 22; + this.label4.Text = "ADC:"; + // + // categoryComboBox + // + this.categoryComboBox.Enabled = false; + this.categoryComboBox.FormattingEnabled = true; + this.categoryComboBox.Location = new System.Drawing.Point(138, 90); + this.categoryComboBox.Name = "categoryComboBox"; + this.categoryComboBox.Size = new System.Drawing.Size(130, 21); + this.categoryComboBox.TabIndex = 6; + // + // categoryLabel + // + this.categoryLabel.AutoSize = true; + this.categoryLabel.Location = new System.Drawing.Point(28, 93); + this.categoryLabel.Name = "categoryLabel"; + this.categoryLabel.Size = new System.Drawing.Size(49, 13); + this.categoryLabel.TabIndex = 5; + this.categoryLabel.Text = "Category"; + // + // reTryCommandsCheckBox + // + this.reTryCommandsCheckBox.AutoSize = true; + this.reTryCommandsCheckBox.Enabled = false; + this.reTryCommandsCheckBox.Location = new System.Drawing.Point(31, 262); + this.reTryCommandsCheckBox.Name = "reTryCommandsCheckBox"; + this.reTryCommandsCheckBox.Size = new System.Drawing.Size(108, 17); + this.reTryCommandsCheckBox.TabIndex = 18; + this.reTryCommandsCheckBox.Text = "Re-try commands"; + this.reTryCommandsCheckBox.UseVisualStyleBackColor = true; + // + // RegulValveCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.reTryCommandsCheckBox); + this.Controls.Add(this.categoryComboBox); + this.Controls.Add(this.categoryLabel); + this.Controls.Add(this.groupBox4); + this.Controls.Add(this.groupBox3); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.flowStableSecTextBox); + this.Controls.Add(this.flowStableSecLabel); + this.Controls.Add(this.stableTimeTextBox); + this.Controls.Add(this.stableTimeLabel); + this.Controls.Add(this.storedPosReuseCheckBox); + this.Controls.Add(this.parentNameComboBox); + this.Controls.Add(this.adcOpenTextBox); + this.Controls.Add(this.adcOpenLabel); + this.Controls.Add(this.adcClosedTextBox); + this.Controls.Add(this.adcClosedLabel); + this.Controls.Add(this.positionTextBox); + this.Controls.Add(this.positionLabel); + this.Controls.Add(this.parentNameLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "RegulValveCfgCtrl"; + this.Size = new System.Drawing.Size(300, 700); + this.Load += new System.EventHandler(this.RegulationValveCfgCtrl_Load); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox3.ResumeLayout(false); + this.groupBox4.ResumeLayout(false); + this.groupBox4.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox positionTextBox; + private System.Windows.Forms.Label positionLabel; + private System.Windows.Forms.Label parentNameLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.Label adcClosedLabel; + private System.Windows.Forms.TextBox adcClosedTextBox; + private System.Windows.Forms.TextBox adcOpenTextBox; + private System.Windows.Forms.Label adcOpenLabel; + private System.Windows.Forms.ComboBox parentNameComboBox; + private System.Windows.Forms.CheckBox storedPosReuseCheckBox; + private System.Windows.Forms.TextBox stableTimeTextBox; + private System.Windows.Forms.Label stableTimeLabel; + private System.Windows.Forms.TextBox flowStableSecTextBox; + private System.Windows.Forms.Label flowStableSecLabel; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Button setButton1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label ADC; + private System.Windows.Forms.Button getButton1; + private System.Windows.Forms.TextBox pctTextBox1; + private System.Windows.Forms.TextBox adcTextBox1; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.Button setButton2; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Button getButton2; + private System.Windows.Forms.TextBox pctTextBox2; + private System.Windows.Forms.TextBox adcTextBox2; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.Button closeButton; + private System.Windows.Forms.Button openButton; + private System.Windows.Forms.TextBox adcTextBox; + private System.Windows.Forms.GroupBox groupBox4; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.ComboBox categoryComboBox; + private System.Windows.Forms.Label categoryLabel; + private System.Windows.Forms.CheckBox reTryCommandsCheckBox; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValve/RegulValveCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValve/RegulValveCfgCtrl.cs new file mode 100644 index 00000000..a98dd222 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValve/RegulValveCfgCtrl.cs @@ -0,0 +1,353 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.RegulValve +{ + public partial class RegulValveCfgCtrl : UserControl, IComponentCfgCtrl + { + static readonly ILog log = LogManager.GetLogger(typeof(RegulValveCfgCtrl)); + + ComponentParametersDlg parent; + + public bool ShowMore { get { return true; } } + + RegulValveCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as RegulValveCfg; + Redraw(); + } + } + + public RegulValveCfgCtrl() + { + InitializeComponent(); + } + + private void RegulationValveCfgCtrl_Load(object sender, EventArgs e) + { + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + + if (parent.TbfComponents != null) + { + foreach (var cmpnt in parent.TbfComponents) + { + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is Elde.ControlBoardFactory) + { + parentNameComboBox.Items.Add(cmpnt.Name); + } + } + } + + categoryComboBox.Items.Add(ValveCategory.All.ToString()); + categoryComboBox.Items.Add(ValveCategory.Feeding.ToString()); + categoryComboBox.Items.Add(ValveCategory.Output.ToString()); + + if (config != null) + { + adc1 = config.AdcValueClosed; + pct1 = 0; + adc2 = config.AdcValueOpen; + pct2 = 100; + } + + Redraw(); + StartResponseHandler(); + } + + public void Closing() + { + StopResponseHandler(); + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + parentNameComboBox.Text = string.IsNullOrEmpty(config.ParentName) ? "---" : config.ParentName; + categoryComboBox.Text = config.Category.ToString(); + positionTextBox.Text = config.Idx1.ToString(); + adcClosedTextBox.Text = config.AdcValueClosed.ToString(); + adcOpenTextBox.Text = config.AdcValueOpen.ToString(); + stableTimeTextBox.Text = config.StableTimeMs.ToString(); + flowStableSecTextBox.Text = config.FlowStableSec.ToString(); + storedPosReuseCheckBox.Checked = config.StoredPositionReuse; + reTryCommandsCheckBox.Checked = config.ReTryCommands; + + adcTextBox1.Text = adc1.ToString(); + adcTextBox2.Text = adc2.ToString(); + pctTextBox1.Text = pct1.ToString(); + pctTextBox2.Text = pct2.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + parentNameComboBox.Enabled = true; + categoryComboBox.Enabled = true; + positionTextBox.Enabled = true; + adcClosedTextBox.Enabled = true; + adcOpenTextBox.Enabled = true; + stableTimeTextBox.Enabled = true; + flowStableSecTextBox.Enabled = true; + storedPosReuseCheckBox.Enabled = true; + reTryCommandsCheckBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!parentNameComboBox.Items.Contains(parentNameComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Parent Name'"; + } + + if (!categoryComboBox.Text.Equals(ValveCategory.All.ToString()) && + !categoryComboBox.Text.Equals(ValveCategory.Feeding.ToString()) && + !categoryComboBox.Text.Equals(ValveCategory.Output.ToString())) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Category'"; + } + + if (!int.TryParse(positionTextBox.Text, out dummy) || dummy < 1 || dummy > 8) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Position' should be between 1 and 8"; + } + + if (!int.TryParse(adcClosedTextBox.Text, out dummy) || dummy < 0 || dummy > 1023) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'ADC when Closed' should be between 0 and 1023"; + } + + if (!int.TryParse(adcOpenTextBox.Text, out dummy) || dummy < 0 || dummy > 1023) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'ADC when Open' should be between 0 and 1023"; + } + + if (!int.TryParse(stableTimeTextBox.Text, out dummy) || dummy < 200 || dummy > 1500 || (dummy % 50) != 0) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Stable time' should be between 200 and 1500 ms in 50 ms steps"; + } + + if (!int.TryParse(flowStableSecTextBox.Text, out dummy) || dummy < 0 || dummy > 60) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Flow stable' should be between 0 and 60 sec"; + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + /// + if (!config.Name.Equals(nameTextBox.Text)) + { + config.Name = nameTextBox.Text; + flags |= CfgUpdateFlags.RestartRqrd; + } + + string parentname = parentNameComboBox.Text.Equals("---") ? string.Empty : parentNameComboBox.Text; + if (!config.ParentName.Equals(parentname)) + { + config.ParentName = parentname; + flags |= CfgUpdateFlags.RestartRqrd; + } + + ValveCategory newCategory; + if (categoryComboBox.Text.Equals(ValveCategory.All.ToString())) newCategory = ValveCategory.All; + else if (categoryComboBox.Text.Equals(ValveCategory.Feeding.ToString())) newCategory = ValveCategory.Feeding; + else if (categoryComboBox.Text.Equals(ValveCategory.Bench.ToString())) newCategory = ValveCategory.Bench; + else if (categoryComboBox.Text.Equals(ValveCategory.Output.ToString())) newCategory = ValveCategory.Output; + else newCategory = ValveCategory.None; + if (newCategory != config.Category) + { + config.Category = newCategory; + flags |= CfgUpdateFlags.RestartRqrd; + } + + int tmp = int.Parse(positionTextBox.Text); + if (config.Idx1 != tmp) + { + config.Idx1 = tmp; + flags |= CfgUpdateFlags.RestartRqrd; + } + + tmp = int.Parse(adcClosedTextBox.Text); + if (config.AdcValueClosed != tmp) + { + config.AdcValueClosed = tmp; + flags |= CfgUpdateFlags.RestartRqrd; + } + + tmp = int.Parse(adcOpenTextBox.Text); + if (config.AdcValueOpen != tmp) + { + config.AdcValueOpen = tmp; + flags |= CfgUpdateFlags.RestartRqrd; + } + + tmp = int.Parse(stableTimeTextBox.Text); + if (config.StableTimeMs != tmp) + { + config.StableTimeMs = tmp; + flags |= CfgUpdateFlags.AnyChange; + } + + tmp = int.Parse(flowStableSecTextBox.Text); + if (config.FlowStableSec != tmp) + { + config.FlowStableSec = tmp; + flags |= CfgUpdateFlags.AnyChange; + } + + bool btmp = storedPosReuseCheckBox.Checked; + if (config.StoredPositionReuse != btmp) + { + config.StoredPositionReuse = btmp; + flags |= CfgUpdateFlags.RestartRqrd; + } + + btmp = reTryCommandsCheckBox.Checked; + if (config.ReTryCommands != btmp) + { + config.ReTryCommands = btmp; + flags |= CfgUpdateFlags.RestartRqrd; + } + + if ((flags & CfgUpdateFlags.AnyChange) != 0) + { + RegulValve.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.CfgChange, config)); + } + + return flags; + } + + int adc1; + int pct1; + + int adc2; + int pct2; + + private void openButton_Click(object sender, EventArgs e) + { + RegulValve.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.RVOpenStep, config)); + } + + private void closeButton_Click(object sender, EventArgs e) + { + RegulValve.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.RVCloseStep, config)); + } + + // + private void getButton1_Click(object sender, EventArgs e) + { + RegulValve.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.GetAdc1, config)); + } + + private void getButton2_Click(object sender, EventArgs e) + { + RegulValve.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.GetAdc2, config)); + } + + private void setButton_Click(object sender, EventArgs e) + { + int tmpPct1; + int tmpPct2; + if ((int.TryParse(pctTextBox1.Text, out tmpPct1) && (tmpPct1 >= 0) && (tmpPct1 <= 100)) && + (int.TryParse(pctTextBox2.Text, out tmpPct2) && (tmpPct2 >= 0) && (tmpPct2 <= 100))) + { + pct1 = tmpPct1; + pct2 = tmpPct2; + UpdateValveOpenClose(); + } + } + + void UpdateValveOpenClose() + { + if ((adc1 == adc2) || (pct1 == pct2)) return; + + double factor = (float)(adc2 - adc1) / (float)(pct2 - pct1); + int adcClosed = (int)((float)(0 - pct1) * factor + (float)adc1 + 0.5f); + int adcOpen = (int)((float)(100 - pct1) * factor + (float)adc1 + 0.5f); + + if ((adcClosed >= 0) && (adcOpen >= 0)) + { + adcClosedTextBox.Text = adcClosed.ToString(); + adcOpenTextBox.Text = adcOpen.ToString(); + } + } + + #region Configuration Change Handling + + public static void OnCmdResponse(object sender, CmdResponseArgs args) + { + if (CmdResponseHandler == null) return; + try { CmdResponseHandler(sender, args); } + catch (Exception e) { log.Error("CmdResponseHandler(...) failed", e); } + } + + public static event EventHandler CmdResponseHandler; + + public void StartResponseHandler() + { + Handlers.AdcChangedHandler += delegate(object sndr, CmdResponseArgs args) + { + if (InvokeRequired) { Invoke(new EventHandler(OnAdcChanged), sndr, args); } + else OnAdcChanged(sndr, args); + }; + + CmdResponseHandler += delegate(object sender, CmdResponseArgs args) + { + if (args.Command == CfgChangeCmd.GetAdc1) + { + adc1 = args.Response; + adcTextBox1.Text = adc1.ToString(); + } + else if (args.Command == CfgChangeCmd.GetAdc2) + { + adc2 = args.Response; + adcTextBox2.Text = adc2.ToString(); + } + }; + } + + public void StopResponseHandler() + { + CmdResponseHandler = null; + } + + void OnAdcChanged(object sender, CmdResponseArgs data) + { + if (data.Command == CfgChangeCmd.GetAdc && data.Id == config.Idx1) + { + adcTextBox.Text = data.Response.ToString(); + } + } + + #endregion Configuration Change Handling + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValve/RegulValveCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValve/RegulValveCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValve/RegulValveCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValve/RegulValveFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValve/RegulValveFactory.cs new file mode 100644 index 00000000..a682bf5b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValve/RegulValveFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.RegulValve +{ + public class RegulValveFactory : IComponentFactory + { + public string ClassName { get { return "RegulationValve"; } } + + public void ResetStaticProperties() { RegulValve.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new RegulValve(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new RegulValve(cfg, components); } + + public IComponentCfg DefaultConfig() { return new RegulValveCfg("RV", this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(RegulValveCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValve/SetFlowOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValve/SetFlowOp.cs new file mode 100644 index 00000000..fa4b1db8 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValve/SetFlowOp.cs @@ -0,0 +1,459 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.BenchControl.GenericDevices; +using TBF.Boxes; + +namespace TBF.BenchControl.Elde.RegulValve +{ + public class SetFlowOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(SetFlowOp)); + public override string ToString() + { + return string.Format("SetFlowOp({0}, Qfrom={1}, Qto={2}, PID={3})", regulValve.Name, requiredFlowLo, requiredFlowHi, pidCoef); + } + + /// Set by the constructor + readonly ControlBoardDev controlBoard; + readonly Elde.RegulValve.RegulValve regulValve; + readonly int regulValveNr; + readonly IFlowMeter flowMeter; + readonly float requiredFlowLo; + readonly float requiredFlowHi; + readonly float requiredFlowAve; + readonly float pidCoef; + readonly int timeout; + readonly bool leaveMeasurementRunning; + readonly bool reTryCommands; + + readonly float nominalFlow; + + /// + /// Internal states of this operation + /// + enum OpState + { + Idle = 0, + ValveMoveToPosition1, /// Wait 1 takt + ValveMoveToPosition2, /// This is actual move to position + ValveMoveToPosition3, /// Wait 1 takt + CheckStatePosition, /// Verify + SettingPosition, + ValveMoveToFlow1, /// Wait 1 takt + ValveMoveToFlow2, /// This is actual move to flow + ValveMoveToFlow3, /// Wait 1 takt + CheckStateFlow, /// Verify + SettingFlow, + FlowReached, + SendCommandAgain, + } + OpState opState; + + float currentReqFlowLo; + float currentReqFlowHi; + float targetPositionLo; + float targetPositionHi; + + int expireTime; + DoubleBox flowBox; + int flowWithinBoundsTime; + + + /// + /// Set required water flow. Conditionally leave the measurement running. + /// Events: FlowSet, FlowTimeOut + /// + /// Control board device + /// Regulation valve component + /// Flowmeter component + /// Lower limit of the flow to be achieved in [m3/h] + /// Upper limit of the flow to be achieved in [m3/h] + /// PID coefficient (float) + /// Timeout for the flow setting in [s] + /// true = Leave the measurement running after op. stop + /// Only Elde.Valve flow are used, other flow on the lists are ignored + public SetFlowOp(ControlBoardDev controlBoard, IRegulValve regulValve, IFlowMeter flowMeter, + float requiredFlowLo, float requiredFlowHi, float pidCoef, DoubleBox flowBox, + bool reTryCmds, int timeout, bool leaveMeasurementRunning) + { + if (controlBoard == null) throw new ArgumentNullException("ctrlBoard"); + this.controlBoard = controlBoard; + + this.regulValve = regulValve as Elde.RegulValve.RegulValve; + if (this.regulValve == null) throw new ArgumentNullException("regValve is null or not Elde"); + regulValveNr = this.regulValve.Idx1; + + if (flowMeter == null) throw new ArgumentNullException("flowMeter"); + this.flowMeter = flowMeter; + + nominalFlow = flowMeter.NominalFlow; + + this.requiredFlowLo = requiredFlowLo; + this.requiredFlowHi = requiredFlowHi; + this.requiredFlowAve = (requiredFlowLo + requiredFlowHi) / 2.0f; + this.pidCoef = pidCoef; + + if (flowBox == null) throw new ArgumentNullException("flowBox"); + this.flowBox = flowBox; + + this.reTryCommands = reTryCmds; + + this.timeout = timeout; + + this.leaveMeasurementRunning = leaveMeasurementRunning; + + log.Debug(this.ToString()); + } + + /// + /// Set required water flow - Do not leave the measurement running. + /// Events: FlowSet + /// + public SetFlowOp(ControlBoardDev controlBoard, IRegulValve regValve, IFlowMeter flowMeter, + float requiredFlowLo, float requiredFlowHi, float pidCoef, DoubleBox flowbox, bool reTryCmds, int timeout) + : this(controlBoard, regValve, flowMeter, requiredFlowLo, requiredFlowHi, pidCoef, flowbox, reTryCmds, timeout, false) + { + } + + /// + /// Set required water flow - No timeout. + /// Events: FlowSet + /// + public SetFlowOp(ControlBoardDev controlBoard, IRegulValve regValve, IFlowMeter flowMeter, + float requiredFlowLo, float requiredFlowHi, float pidCoef, DoubleBox flowbox, bool reTryCmds) + : this(controlBoard, regValve, flowMeter, requiredFlowLo, pidCoef, requiredFlowHi, flowbox, reTryCmds, int.MaxValue, false) + { + } + + /// + /// Fetch target position limits from the dictionary or return false + /// + /// Average of the flow targer range (input) + /// Target valve position low limit (output) + /// Target valve position high limit (output) + /// true when positions for the target flow are stored in the memory, otherwise return false + bool FetchTargetPosition(float avgReqFlow, out float positionLo, out float positionHi) + { + float targetPosition; + if (regulValve.Dict.TryGetValue(avgReqFlow, out targetPosition)) + { + positionLo = Math.Max(targetPosition * 0.95f, 0.0f); + positionHi = Math.Min(targetPosition * 1.05f, 100.0f); + return true; + } + else + { + positionLo = 0.0f; + positionHi = 0.0f; + return false; + } + } + + void StoreTargetPosition(float avgReqFlow, float actPosition) + { + if (!regulValve.Dict.ContainsKey(requiredFlowAve)) + { + regulValve.Dict.Add(new KeyValuePair(avgReqFlow, actPosition)); + } + return; + } + + /// Start this operation + public void Start() + { + double flowMtrFreq = flowMeter.ReadFrequency(); + double flow = flowMeter.ReadFlow(); + + currentReqFlowLo = requiredFlowLo; /// Default lower limit + currentReqFlowHi = requiredFlowHi; /// Default upper limit + if (flow != 0) + { + flowBox.Val = flow; + if (flow >= requiredFlowAve) currentReqFlowHi = requiredFlowAve; /// Decrease upper limit + if (flow <= requiredFlowAve) currentReqFlowLo = requiredFlowAve; /// Increase lower limit + } + + flowWithinBoundsTime = 0; + + if (regulValve.RegulValveCfg.StoredPositionReuse && FetchTargetPosition(requiredFlowAve, out targetPositionLo, out targetPositionHi)) + { + log.InfoFormat("SetFlowOp:Start() rv#={0} flowMtr#={1} TARGET: flowLo={2} flowHi={3} FETCHED: posLo={4} posHi={5}", + regulValveNr, flowMeter.Idx1, currentReqFlowLo, currentReqFlowHi, targetPositionLo, targetPositionHi); + + opState = OpState.ValveMoveToPosition1; + } + else + { + log.InfoFormat("SetFlowOp:Start() rv#={0} flowMtr#={1} TARGET: flowLo={2} flowHi={3}", + regulValveNr, flowMeter.Idx1, currentReqFlowLo, currentReqFlowHi); + + opState = OpState.ValveMoveToFlow1; + } + + expireTime = StateMachine.Time + timeout; + if (expireTime < 0) expireTime = int.MaxValue; + + TestMethods tm = 0; + StopDevs sd = 0; + // '_regulValve.RegulValveCfg.PidCoef' replaced by a casted operation parameter 'pidCoef' + controlBoard.SendCommand(Command.Start, flowMeter.Idx1, controlBoard.Route, + int.MaxValue, int.MaxValue, tm, + 0.0f, (int)pidCoef, 0, sd); + } + + /// Run this operation + /// + /// Event.None, Event.FlowReached, Event.RegulValveTimeOut, Event.OpArgumentError + /// + public Event Run() + { + float rvPosition = controlBoard.RValvePosition(regulValveNr); + double flowMtrFreq = flowMeter.ReadFrequency(); + double flow = flowMeter.ReadFlow(); + + if (flow != 0) + { + flowBox.Val = flow; + } + + log.InfoFormat("SetFlowOp:Run(T={0}) rv#={1} pos={2}% freq={3} flow={4} opState={5}", + StateMachine.Time - expireTime + timeout, regulValveNr, rvPosition.ToString("F1"), flowMtrFreq, flow, opState); + + if (StateMachine.Time > expireTime) + { + return Event.RegulValveTimeOut; + } + else if (opState == OpState.SendCommandAgain) + { + flowWithinBoundsTime = 0; + + if (regulValve.RegulValveCfg.StoredPositionReuse && FetchTargetPosition(requiredFlowAve, out targetPositionLo, out targetPositionHi)) + { + log.InfoFormat("Run(): rv#={0} flowMtr#={1} TARGET: flowLo={2} flowHi={3} FETCHED: posLo={4} posHi={5}", + regulValveNr, flowMeter.Idx1, currentReqFlowLo, currentReqFlowHi, targetPositionLo, targetPositionHi); + + opState = OpState.ValveMoveToPosition1; + } + else + { + log.InfoFormat("Run(): rv#={0} flowMtr#={1} TARGET: flowLo={2} flowHi={3}", + regulValveNr, flowMeter.Idx1, currentReqFlowLo, currentReqFlowHi); + + opState = OpState.ValveMoveToFlow1; + } + + TestMethods tm = 0; + StopDevs sd = 0; + // '_regulValve.RegulValveCfg.PidCoef' replaced by a casted operation parameter 'pidCoef' + controlBoard.SendCommand(Command.Start, flowMeter.Idx1, controlBoard.Route, + int.MaxValue, int.MaxValue, tm, + 0.0f, (int)pidCoef, 0, sd); + return Event.None; + } + else if (opState == OpState.ValveMoveToPosition1) + { + opState = OpState.ValveMoveToPosition2; + return Event.None; + } + else if (opState == OpState.ValveMoveToPosition2) /// Move to position + { + /// Issues the appropriate ValveMove(...) command + controlBoard.ValveMove(regulValveNr, RegulValveMode.TargetPosition, + new float[2] { targetPositionLo, targetPositionHi }, + regulValve.StableTime); + + opState = OpState.SettingPosition; + return Event.None; + } + else if (opState == OpState.ValveMoveToPosition3) + { + if (reTryCommands) + { + opState = OpState.CheckStatePosition; + } + else + { + opState = OpState.SettingPosition; + } + return Event.None; + } + else if (opState == OpState.CheckStatePosition) /// Verify + { + if (((ulong)controlBoard.StatusP & (ulong)StatusP.RefPulsesMsrmnt) == 0) + { + opState = OpState.SendCommandAgain; + return Event.None; + } + else if (controlBoard.RegulValveState(regulValveNr) != RegulValveState.DacValueRegul) + { + /// Repeat appropriate ValveMove(...) command + controlBoard.ValveMove(regulValveNr, RegulValveMode.TargetPosition, + new float[2] { targetPositionLo, targetPositionHi }, + regulValve.StableTime); + + log.InfoFormat("SetFlowOp: ValveMove({0}, Position, {1}, {2}, {3})", + regulValveNr, targetPositionLo, targetPositionHi, regulValve.StableTime); + + opState = OpState.ValveMoveToPosition3; + return Event.None; + } + else + { + opState = OpState.SettingPosition; + return Event.None; + } + } + else if (opState == OpState.SettingPosition) + { + /// Repeated untill position is reached + if ((targetPositionLo <= rvPosition) && (rvPosition <= targetPositionHi)) + { + opState = OpState.ValveMoveToFlow1; + } + return Event.None; + } + else if (opState == OpState.ValveMoveToFlow1) + { + opState = OpState.ValveMoveToFlow2; + return Event.None; + } + else if (opState == OpState.ValveMoveToFlow2) /// Move to flow + { + /// + /// Done once, issues an appropriate ValveMove(...) command + /// + if (currentReqFlowLo >= currentReqFlowHi || currentReqFlowLo > nominalFlow || currentReqFlowHi <= 0) + { + return Event.OpArgumentError; + } + + log.InfoFormat("Run(): rv#={0} flowMtr#={1} TARGET: flowLo={2} flowHi={3}", + regulValveNr, flowMeter.Idx1, currentReqFlowLo, currentReqFlowHi); + + float freqLo = 2000.0f * currentReqFlowLo / nominalFlow; + float freqHi = 2000.0f * currentReqFlowHi / nominalFlow; + controlBoard.ValveMove(regulValveNr, RegulValveMode.TargetFrequency, + new float[2] { freqLo, freqHi }, + regulValve.StableTime); + + opState = OpState.ValveMoveToFlow3; + return Event.None; + } + else if (opState == OpState.ValveMoveToFlow3) + { + if (reTryCommands) + { + opState = OpState.CheckStateFlow; + } + else + { + opState = OpState.SettingFlow; + } + return Event.None; + } + else if (opState == OpState.CheckStateFlow) /// Verify the flow setting + { + if ( ((ulong)controlBoard.StatusP & (ulong)StatusP.RefPulsesMsrmnt) == 0 || + (controlBoard.RegulValveState(regulValveNr) & RegulValveState.PwOrFreqRegul) != RegulValveState.PwOrFreqRegul) + { + opState = OpState.SendCommandAgain; + return Event.None; + } + else if (controlBoard.RegulValveState(regulValveNr) != RegulValveState.PwOrFreqRegul) + { + /// Done once, issues an appropriate ValveMove(...) command + float freqLo = 2000.0f * currentReqFlowLo / nominalFlow; + float freqHi = 2000.0f * currentReqFlowHi / nominalFlow; + controlBoard.ValveMove(regulValveNr, RegulValveMode.TargetFrequency, + new float[2] { freqLo, freqHi }, + regulValve.StableTime); + + log.InfoFormat("SetFlowOp: ValveMove({0}, Frequency, {1}, {2}, {3})", + regulValveNr, freqLo, freqHi, regulValve.StableTime); + + opState = OpState.ValveMoveToFlow3; + return Event.None; + } + else + { + opState = OpState.SettingFlow; + return Event.None; + } + } + else if (opState == OpState.SettingFlow) + { + /// + /// Repeated untill the required flow is reached + /// + if ((currentReqFlowLo <= flow) && (flow <= currentReqFlowHi)) + { + if (flowWithinBoundsTime++ >= regulValve.FlowStableSec) + { + if (regulValve.RegulValveCfg.StoredPositionReuse) + { + float storedPosition; + if (regulValve.Dict.TryGetValue(requiredFlowAve, out storedPosition)) + { + /// update the stored valve position + StoreTargetPosition(requiredFlowAve, (rvPosition + storedPosition) / 2.0f); + log.InfoFormat("Run(): rv#={0} reqFlow={1} pos={2}% stored={3} <--- Updating a stored position", + regulValveNr, requiredFlowAve, rvPosition.ToString("F1"), storedPosition); + } + else + { + /// store the valve position + StoreTargetPosition(requiredFlowAve, rvPosition); + log.InfoFormat("Run(): rv#={0} reqFlow={1} pos={2}% <--- Storing a new position", + regulValveNr, requiredFlowAve, rvPosition.ToString("F1")); + } + } + + log.InfoFormat("flow = {0} m3/h (lo={1}, hi={2}, REACHED)", flow, currentReqFlowLo, currentReqFlowHi); + + opState = OpState.FlowReached; + return Event.FlowReached; + } + else + { + log.InfoFormat("flow = {0} m3/h (lo={1}, hi={2}, FLOW_OK_TIMER={3}s)", flow, currentReqFlowLo, currentReqFlowHi, flowWithinBoundsTime); + return Event.None; + } + } + else if (StateMachine.Time > expireTime) + { + return Event.RegulValveTimeOut; + } + else + { + log.InfoFormat("flow = {0} m3/h (lo={1}, hi={2})", flow, currentReqFlowLo, currentReqFlowHi); + flowWithinBoundsTime = 0; + return Event.None; + } + } + else /// opState == OpState.FlowReached + { + log.InfoFormat("flow = {0} m3/h (lo={1}, hi={2}, REACHED)", flow, currentReqFlowLo, currentReqFlowHi); + return Event.FlowReached; + } + } + + /// Start this operation + public void Stop() + { + opState = OpState.Idle; + + if (leaveMeasurementRunning) return; + + /// Stop measurement + TestMethods tm = 0; + StopDevs sd = StopDevs.RegValveRegulation; + controlBoard.SendCommand(Command.Stop, flowMeter.Idx1, controlBoard.Route, + 50000, 50000, tm, + 0.0f, (int)pidCoef, 0, sd); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValve/SetRegulValvePositionOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValve/SetRegulValvePositionOp.cs new file mode 100644 index 00000000..d4add434 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValve/SetRegulValvePositionOp.cs @@ -0,0 +1,166 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl.Elde.RegulValve +{ + public class SetRegulValvePositionOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(SetRegulValvePositionOp)); + public override string ToString() + { + return string.Format("SetRegulValvePositionOp({0},{1},{2})", regulValve.Name, posLoPct, posHiPct); + } + + const int CoaxValveNr = 7; /// Coax. valve has number 7 + + /// + /// Internal states of this operation + /// + enum OpState + { + Idle = 0, + MoveToPosition, /// Send commend to move to position + CheckState, /// Check RV state by reading statos word + MovingToPosition, /// Command passed OK, RV is moving to a position + } + OpState opState; + + /// Set by the constructor + readonly ControlBoardDev controlBoard; + readonly RegulValve regulValve; + readonly int regulValveNr; + readonly float posLoPct; + readonly float posHiPct; + readonly int timeout; + + /// Process values + bool firstRun; + int expireTime; + bool positionReached; + + /// + /// Set required water flow. + /// Events: FlowSet, FlowTimeOut + /// + /// Control board device + /// Regulation valve component + /// Lower limit of the position to be achieved + /// Upper limit of the position to be achieved + /// Timeout in sec. for setting the flow + /// Only Elde.Valve flow are used, other flow on the lists are ignored + public SetRegulValvePositionOp(ControlBoardDev controlBoard, RegulValve regulValve, float posLoPct, float posHiPct, int timeout) + { + if (controlBoard == null) throw new ArgumentNullException("ctrlBoard"); + this.controlBoard = controlBoard; + + this.regulValve = regulValve as RegulValve; + if (regulValve == null) throw new ArgumentNullException("regValve is null or not Elde"); + this.regulValveNr = this.regulValve.Idx1; + + this.posLoPct = posLoPct; + this.posHiPct = posHiPct; + + this.timeout = timeout; + + log.Debug(this.ToString()); + } + + /// + /// Set required water flow - no timeout. + /// Events: FlowSet + /// + public SetRegulValvePositionOp(ControlBoardDev controlBoard, RegulValve regValve, float posLoPct, float posHiPct) + : this(controlBoard, regValve, posLoPct, posHiPct, int.MaxValue) + { + } + + /// Start this operation + public void Start() + { + firstRun = true; + positionReached = false; + expireTime = StateMachine.Time + timeout; + log.InfoFormat("Start(): RV#={0}, reqPosLo={1}%, reqPosHi={2}%", regulValveNr, posLoPct.ToString("F1"), posHiPct.ToString("F1")); + opState = OpState.MoveToPosition; + } + + /// Run this operation + /// + /// Event.None . . . . . . . busy adjusting position + /// Event.PositionReached . . position reached + /// Event.OpArgumentError . . invalid required position + /// + public Event Run() + { + if (opState == OpState.MoveToPosition) + { + if (posLoPct >= posHiPct || posLoPct > 100.0f || posHiPct < 0) + { + return Event.OpArgumentError; + } + + firstRun = false; + + controlBoard.ValveMove(regulValveNr, + RegulValveMode.TargetPosition, + new float[2] { posLoPct, posHiPct }, + regulValve.StableTime); + opState = OpState.CheckState; + return Event.None; + } + + if (positionReached) return Event.PositionReached; + + float positionPct = controlBoard.RValvePosition(regulValveNr); + log.WarnFormat("Run(): RV#={0}, actPos={1}%", regulValveNr, positionPct.ToString("F1")); + + if (opState == OpState.CheckState) + { + if (regulValveNr == CoaxValveNr && ((ulong)controlBoard.StatusP & (ulong)StatusP.CoaxRegValveBusy) == 0) + { + opState = OpState.MoveToPosition; + return Event.None; + } + else if (posLoPct <= positionPct && positionPct <= posHiPct) + { + positionReached = true; + return Event.PositionReached; + } + else if ((regulValveNr < 6) && (controlBoard.RegulValveState(regulValveNr) != RegulValveState.DacValueRegul)) + { + opState = OpState.MoveToPosition; /// Resend move command again in the next run + return Event.None; + } + else + { + opState = OpState.MovingToPosition; + return Event.None; + } + } + else if (StateMachine.Time > expireTime) + { + return Event.RegulValveTimeOut; + } + else if (opState == OpState.MovingToPosition) + { + if (posLoPct <= positionPct && positionPct <= posHiPct) + { + positionReached = true; + return Event.PositionReached; + } + return Event.None; + } + return Event.None; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveCoax/ChangeValvePositionOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveCoax/ChangeValvePositionOp.cs new file mode 100644 index 00000000..95d46b5c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveCoax/ChangeValvePositionOp.cs @@ -0,0 +1,78 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl.Elde.RegulValveCoax +{ + public class ChangeRegulValvePositionOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(ChangeRegulValvePositionOp)); + public override string ToString() + { + return string.Format("ChangeRegulValvePositionOp({0},{1}s)", regulValve.Name, timePulseSec.ToString("F2")); + } + + /// Set by the constructor + readonly ControlBoardDev controlBoard; + readonly RegulValve regulValve; + readonly int regulValveNr; + readonly float timePulseSec; + + /// + /// Set required water flow. + /// Events: FlowSet, FlowTimeOut + /// + /// Control board device + /// Regulation valve component + /// Lower limit of the position to be achieved + /// Upper limit of the position to be achieved + /// Timeout in sec. for setting the flow + /// Only Elde.Valve flow are used, other flow on the lists are ignored + public ChangeRegulValvePositionOp(ControlBoardDev controlBoard, RegulValve _regulValve, float timePulseSec) + { + if (controlBoard == null) throw new ArgumentNullException("ctrlBoard"); + this.controlBoard = controlBoard; + + regulValve = _regulValve as RegulValve; + if (regulValve == null) throw new ArgumentNullException("regValve is null or not Elde"); + regulValveNr = this.regulValve.Idx1; + + this.timePulseSec = timePulseSec; + + log.Debug(this.ToString()); + } + + /// Start this operation + public void Start() + { + float positionPct = controlBoard.RValvePosition(regulValveNr); + log.WarnFormat("RV#={0}, actPos={1}%", regulValveNr, positionPct.ToString("F1")); + + controlBoard.ValveMove(regulValveNr, + RegulValveMode.PulseWidth, + new float[2] { timePulseSec, timePulseSec }, + regulValve.StableTime); + } + + /// Run this operation + /// + /// Event.SetFlowDone + /// + public Event Run() + { + float positionPct = controlBoard.RValvePosition(regulValveNr); + log.WarnFormat("RV#={0}, actPos={1}%", regulValveNr, positionPct.ToString("F1")); + + return Event.PositionReached; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveCoax/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveCoax/Factory.cs new file mode 100644 index 00000000..3f79f397 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveCoax/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.RegulValveCoax +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return "RegulationValve-Coax"; } } + + public void ResetStaticProperties() { RegulValve.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new RegulValve(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new RegulValve(cfg, components); } + + public IComponentCfg DefaultConfig() { return new RegulValveCfg("RV", this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(RegulValveCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveCoax/RegulValve.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveCoax/RegulValve.cs new file mode 100644 index 00000000..0712e01b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveCoax/RegulValve.cs @@ -0,0 +1,100 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.Boxes; + +namespace TBF.BenchControl.Elde.RegulValveCoax +{ + public class RegulValve : ComponentBase, GenericDevices.IRegulValve + { + private static readonly ILog log = LogManager.GetLogger(typeof(RegulValve)); + public override string ToString() { return string.Format("RegulValve({0})", Cfg.ToString(1)); } + + + public readonly RegulValveCfg RegulValveCfg; + + IDictionary dict; + public IDictionary Dict { get { return dict; } } + + public readonly ControlBoardDev ControlBoard; + + public ValveCategory Category { get { return RegulValveCfg.Category; } } + public int Idx1 { get { return RegulValveCfg.Idx1; } } /// 1..7 + public int StableTime { get { return RegulValveCfg.StableTime; } } /// 0=200ms, step=50ms, max. 1500ms (max.26) + public int FlowStableSec { get { return RegulValveCfg.FlowStableSec; } } /// 0..60 sec + /// + public bool IsCoax { get { return true; } } + /// + public float Position { get { return ControlBoard.RValvePosition(Idx1); } } + + + public RegulValve() + { + } + + public RegulValve(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + RegulValveCfg = cfg as RegulValveCfg; + + ControlBoard = (ControlBoardDev)TbfComponents.FindComponent(cfg.ParentName, components); + if (ControlBoard == null) throw new Exception("Cannot find " + Name + " parent"); + + this.dict = new Dictionary(); + + log.Debug(this.ToString()); + } + + + /// + /// Operation to set the water flow within tolerances + /// Events: Event.None, Event.FlowReached, Event.FlowTimeOut + /// + /// Flowmeter component + /// Lower limit of the required flow [m3/h] + /// Higher limit of the required flow [m3/h] + /// PID coefficient (float) + /// Measured flow [m3/h] + /// Timeout in [s] + /// SetFlowOp instance + public IOperation SetFlowOp(GenericDevices.IFlowMeter flowMeter, float requiredFlowLo, float requiredFlowHi, float pidCoef, DoubleBox measuredFlow, int timeout) + { + return new SetFlowOp(ControlBoard, this, flowMeter, requiredFlowLo, requiredFlowHi, pidCoef, measuredFlow, RegulValveCfg.ReTryCommands, timeout); + } + + /// + /// Operation to set the water flow within tolerances. Leave the measurement running. + /// Events: Event.None, Event.FlowReached, Event.FlowTimeOut + /// + /// Flowmeter component + /// Lower limit of the required flow [m3/h] + /// Higher limit of the required flow [m3/h] + /// Measured flow [m3/h] + /// Timeout in [s] + /// SetFlowOp instance + public IOperation SetFlowAndMeasureOp(GenericDevices.IFlowMeter flowMeter, float requiredFlowLo, float requiredFlowHi, float pidCoef, DoubleBox measuredFlow, int timeout, float filterConstant) + { + return new SetFlowOp(ControlBoard, this, flowMeter, requiredFlowLo, requiredFlowHi, pidCoef, measuredFlow, RegulValveCfg.ReTryCommands, timeout, true); + } + + /// + /// Operation to set the regulation valve to a required position + /// Events: Event.None + /// + /// Lower limit of the required valve position in [%] + /// Higher limit of the required valve position in [%] + /// SetPositionOp instance + public IOperation SetRegulValvePositionOp(float pctLo, float pctHi, int timeoutMs) + { + return new SetRegulValvePositionOp(ControlBoard, this, pctLo, pctHi, timeoutMs); + } + + public IOperation ChangeRegulValvePositionOp(float timePulseSec) + { + return new ChangeRegulValvePositionOp(ControlBoard, this, timePulseSec); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveCoax/RegulValveCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveCoax/RegulValveCfg.cs new file mode 100644 index 00000000..33935a56 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveCoax/RegulValveCfg.cs @@ -0,0 +1,66 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.RegulValveCoax +{ + public class RegulValveCfg : ComponentCfgBase, IChildComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(RegulValveCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new RegulValveCfgCtrl(); } + + /// + /// Serialized parameters + /// + public int Idx1; /// 1..8 + public ValveCategory Category; /// Feeding, Output or All + public int StableTimeMs; /// 200..1500 ms + public int FlowStableSec; /// 0..60 sec + public bool StoredPositionReuse; /// true = store and re-use previous regulation valve positions + public bool ReTryCommands; + + /// + /// Stabilization time when setting the flow: 0=200ms, step 50ms, max. 1.5 sec. + /// + public int StableTime { get { return (StableTimeMs - 200) / 50; } } + + /// Private parameterless constructor invoked by all other (public) constructors + RegulValveCfg() + { + } + + public RegulValveCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + Factory = factory; + ParentName = "CB"; + Category = ValveCategory.Output; + Idx1 = 1; + StableTimeMs = 500; + FlowStableSec = 5; + StoredPositionReuse = false; + ReTryCommands = false; + } + + public string ToString(int i) + { + return string.Format("Name={0} ({1}), Idx1={2}, Cat.={3}, StabTm={4}ms, FlowStable={5}s, PosReuse={6}, ReTryCmds={7}", + Name, + (string.IsNullOrEmpty(ParentName) ? "-" : ParentName), + Idx1, + Category, + StableTimeMs, + FlowStableSec, + StoredPositionReuse, + ReTryCommands); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveCoax/RegulValveCfgCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveCoax/RegulValveCfgCtrl.Designer.cs new file mode 100644 index 00000000..34a459a7 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveCoax/RegulValveCfgCtrl.Designer.cs @@ -0,0 +1,271 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.Elde.RegulValveCoax +{ + partial class RegulValveCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.positionTextBox = new System.Windows.Forms.TextBox(); + this.positionLabel = new System.Windows.Forms.Label(); + this.parentNameLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.parentNameComboBox = new System.Windows.Forms.ComboBox(); + this.storedPosReuseCheckBox = new System.Windows.Forms.CheckBox(); + this.stableTimeTextBox = new System.Windows.Forms.TextBox(); + this.stableTimeLabel = new System.Windows.Forms.Label(); + this.flowStableSecTextBox = new System.Windows.Forms.TextBox(); + this.flowStableSecLabel = new System.Windows.Forms.Label(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.closeButton = new System.Windows.Forms.Button(); + this.openButton = new System.Windows.Forms.Button(); + this.categoryComboBox = new System.Windows.Forms.ComboBox(); + this.categoryLabel = new System.Windows.Forms.Label(); + this.reTryCommandsCheckBox = new System.Windows.Forms.CheckBox(); + this.groupBox3.SuspendLayout(); + this.SuspendLayout(); + // + // positionTextBox + // + this.positionTextBox.Enabled = false; + this.positionTextBox.Location = new System.Drawing.Point(138, 115); + this.positionTextBox.Name = "positionTextBox"; + this.positionTextBox.Size = new System.Drawing.Size(46, 20); + this.positionTextBox.TabIndex = 8; + // + // positionLabel + // + this.positionLabel.AutoSize = true; + this.positionLabel.Location = new System.Drawing.Point(28, 118); + this.positionLabel.Name = "positionLabel"; + this.positionLabel.Size = new System.Drawing.Size(18, 13); + this.positionLabel.TabIndex = 7; + this.positionLabel.Text = "ID"; + // + // parentNameLabel + // + this.parentNameLabel.AutoSize = true; + this.parentNameLabel.Location = new System.Drawing.Point(28, 68); + this.parentNameLabel.Name = "parentNameLabel"; + this.parentNameLabel.Size = new System.Drawing.Size(69, 13); + this.parentNameLabel.TabIndex = 3; + this.parentNameLabel.Text = "Parent Name"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(138, 41); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(28, 44); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(135, 14); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(89, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComponentName"; + // + // parentNameComboBox + // + this.parentNameComboBox.Enabled = false; + this.parentNameComboBox.FormattingEnabled = true; + this.parentNameComboBox.Location = new System.Drawing.Point(138, 65); + this.parentNameComboBox.Name = "parentNameComboBox"; + this.parentNameComboBox.Size = new System.Drawing.Size(130, 21); + this.parentNameComboBox.TabIndex = 4; + // + // storedPosReuseCheckBox + // + this.storedPosReuseCheckBox.AutoSize = true; + this.storedPosReuseCheckBox.Enabled = false; + this.storedPosReuseCheckBox.Location = new System.Drawing.Point(31, 192); + this.storedPosReuseCheckBox.Name = "storedPosReuseCheckBox"; + this.storedPosReuseCheckBox.Size = new System.Drawing.Size(162, 17); + this.storedPosReuseCheckBox.TabIndex = 17; + this.storedPosReuseCheckBox.Text = "Enable stored position re-use"; + this.storedPosReuseCheckBox.UseVisualStyleBackColor = true; + // + // stableTimeTextBox + // + this.stableTimeTextBox.Enabled = false; + this.stableTimeTextBox.Location = new System.Drawing.Point(138, 139); + this.stableTimeTextBox.Name = "stableTimeTextBox"; + this.stableTimeTextBox.Size = new System.Drawing.Size(46, 20); + this.stableTimeTextBox.TabIndex = 14; + // + // stableTimeLabel + // + this.stableTimeLabel.AutoSize = true; + this.stableTimeLabel.Location = new System.Drawing.Point(28, 142); + this.stableTimeLabel.Name = "stableTimeLabel"; + this.stableTimeLabel.Size = new System.Drawing.Size(81, 13); + this.stableTimeLabel.TabIndex = 13; + this.stableTimeLabel.Text = "Stable time [ms]"; + // + // flowStableSecTextBox + // + this.flowStableSecTextBox.Enabled = false; + this.flowStableSecTextBox.Location = new System.Drawing.Point(138, 163); + this.flowStableSecTextBox.Name = "flowStableSecTextBox"; + this.flowStableSecTextBox.Size = new System.Drawing.Size(46, 20); + this.flowStableSecTextBox.TabIndex = 16; + // + // flowStableSecLabel + // + this.flowStableSecLabel.AutoSize = true; + this.flowStableSecLabel.Location = new System.Drawing.Point(28, 166); + this.flowStableSecLabel.Name = "flowStableSecLabel"; + this.flowStableSecLabel.Size = new System.Drawing.Size(74, 13); + this.flowStableSecLabel.TabIndex = 15; + this.flowStableSecLabel.Text = "Flow stable [s]"; + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.closeButton); + this.groupBox3.Controls.Add(this.openButton); + this.groupBox3.Location = new System.Drawing.Point(10, 527); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(280, 60); + this.groupBox3.TabIndex = 21; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "Regulation valve"; + // + // closeButton + // + this.closeButton.Location = new System.Drawing.Point(14, 19); + this.closeButton.Name = "closeButton"; + this.closeButton.Size = new System.Drawing.Size(107, 28); + this.closeButton.TabIndex = 1; + this.closeButton.Text = "Close"; + this.closeButton.UseVisualStyleBackColor = true; + this.closeButton.Click += new System.EventHandler(this.closeButton_Click); + // + // openButton + // + this.openButton.Location = new System.Drawing.Point(160, 19); + this.openButton.Name = "openButton"; + this.openButton.Size = new System.Drawing.Size(107, 28); + this.openButton.TabIndex = 0; + this.openButton.Text = "Open"; + this.openButton.UseVisualStyleBackColor = true; + this.openButton.Click += new System.EventHandler(this.openButton_Click); + // + // categoryComboBox + // + this.categoryComboBox.Enabled = false; + this.categoryComboBox.FormattingEnabled = true; + this.categoryComboBox.Location = new System.Drawing.Point(138, 90); + this.categoryComboBox.Name = "categoryComboBox"; + this.categoryComboBox.Size = new System.Drawing.Size(130, 21); + this.categoryComboBox.TabIndex = 6; + // + // categoryLabel + // + this.categoryLabel.AutoSize = true; + this.categoryLabel.Location = new System.Drawing.Point(28, 93); + this.categoryLabel.Name = "categoryLabel"; + this.categoryLabel.Size = new System.Drawing.Size(49, 13); + this.categoryLabel.TabIndex = 5; + this.categoryLabel.Text = "Category"; + // + // reTryCommandsCheckBox + // + this.reTryCommandsCheckBox.AutoSize = true; + this.reTryCommandsCheckBox.Enabled = false; + this.reTryCommandsCheckBox.Location = new System.Drawing.Point(31, 215); + this.reTryCommandsCheckBox.Name = "reTryCommandsCheckBox"; + this.reTryCommandsCheckBox.Size = new System.Drawing.Size(108, 17); + this.reTryCommandsCheckBox.TabIndex = 18; + this.reTryCommandsCheckBox.Text = "Re-try commands"; + this.reTryCommandsCheckBox.UseVisualStyleBackColor = true; + // + // RegulValveCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.reTryCommandsCheckBox); + this.Controls.Add(this.categoryComboBox); + this.Controls.Add(this.categoryLabel); + this.Controls.Add(this.groupBox3); + this.Controls.Add(this.flowStableSecTextBox); + this.Controls.Add(this.flowStableSecLabel); + this.Controls.Add(this.stableTimeTextBox); + this.Controls.Add(this.stableTimeLabel); + this.Controls.Add(this.storedPosReuseCheckBox); + this.Controls.Add(this.parentNameComboBox); + this.Controls.Add(this.positionTextBox); + this.Controls.Add(this.positionLabel); + this.Controls.Add(this.parentNameLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "RegulValveCfgCtrl"; + this.Size = new System.Drawing.Size(300, 700); + this.Load += new System.EventHandler(this.RegulationValveCfgCtrl_Load); + this.groupBox3.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox positionTextBox; + private System.Windows.Forms.Label positionLabel; + private System.Windows.Forms.Label parentNameLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.ComboBox parentNameComboBox; + private System.Windows.Forms.CheckBox storedPosReuseCheckBox; + private System.Windows.Forms.TextBox stableTimeTextBox; + private System.Windows.Forms.Label stableTimeLabel; + private System.Windows.Forms.TextBox flowStableSecTextBox; + private System.Windows.Forms.Label flowStableSecLabel; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.Button closeButton; + private System.Windows.Forms.Button openButton; + private System.Windows.Forms.ComboBox categoryComboBox; + private System.Windows.Forms.Label categoryLabel; + private System.Windows.Forms.CheckBox reTryCommandsCheckBox; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveCoax/RegulValveCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveCoax/RegulValveCfgCtrl.cs new file mode 100644 index 00000000..1e47bc3c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveCoax/RegulValveCfgCtrl.cs @@ -0,0 +1,206 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.RegulValveCoax +{ + public partial class RegulValveCfgCtrl : UserControl, IComponentCfgCtrl + { + ComponentParametersDlg parent; + + public bool ShowMore { get { return true; } } + + RegulValveCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as RegulValveCfg; + Redraw(); + } + } + + public RegulValveCfgCtrl() + { + InitializeComponent(); + } + + private void RegulationValveCfgCtrl_Load(object sender, EventArgs e) + { + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + + if (parent.TbfComponents != null) + { + foreach (var cmpnt in parent.TbfComponents) + { + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is Elde.ControlBoardFactory) + { + parentNameComboBox.Items.Add(cmpnt.Name); + } + } + } + + categoryComboBox.Items.Add(ValveCategory.All.ToString()); + categoryComboBox.Items.Add(ValveCategory.Feeding.ToString()); + categoryComboBox.Items.Add(ValveCategory.Output.ToString()); + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + parentNameComboBox.Text = string.IsNullOrEmpty(config.ParentName) ? "---" : config.ParentName; + categoryComboBox.Text = config.Category.ToString(); + positionTextBox.Text = config.Idx1.ToString(); + stableTimeTextBox.Text = config.StableTimeMs.ToString(); + flowStableSecTextBox.Text = config.FlowStableSec.ToString(); + storedPosReuseCheckBox.Checked = config.StoredPositionReuse; + reTryCommandsCheckBox.Checked = config.ReTryCommands; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + parentNameComboBox.Enabled = true; + categoryComboBox.Enabled = true; + positionTextBox.Enabled = true; + stableTimeTextBox.Enabled = true; + flowStableSecTextBox.Enabled = true; + storedPosReuseCheckBox.Enabled = true; + reTryCommandsCheckBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!parentNameComboBox.Items.Contains(parentNameComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Parent Name'"; + } + + if (!categoryComboBox.Text.Equals(ValveCategory.All.ToString()) && + !categoryComboBox.Text.Equals(ValveCategory.Feeding.ToString()) && + !categoryComboBox.Text.Equals(ValveCategory.Output.ToString())) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Category'"; + } + + if (!int.TryParse(positionTextBox.Text, out dummy) || dummy < 1 || dummy > 8) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Position' should be between 1 and 8"; + } + + if (!int.TryParse(stableTimeTextBox.Text, out dummy) || dummy < 200 || dummy > 1500 || (dummy % 50) != 0) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Stable time' should be between 200 and 1500 ms in 50 ms steps"; + } + + if (!int.TryParse(flowStableSecTextBox.Text, out dummy) || dummy < 0 || dummy > 60) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Flow stable' should be between 0 and 60 sec"; + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + /// + if (!config.Name.Equals(nameTextBox.Text)) + { + config.Name = nameTextBox.Text; + flags |= CfgUpdateFlags.RestartRqrd; + } + + string parentname = parentNameComboBox.Text.Equals("---") ? string.Empty : parentNameComboBox.Text; + if (!config.ParentName.Equals(parentname)) + { + config.ParentName = parentname; + flags |= CfgUpdateFlags.RestartRqrd; + } + + ValveCategory newCategory; + if (categoryComboBox.Text.Equals(ValveCategory.All.ToString())) newCategory = ValveCategory.All; + else if (categoryComboBox.Text.Equals(ValveCategory.Feeding.ToString())) newCategory = ValveCategory.Feeding; + else if (categoryComboBox.Text.Equals(ValveCategory.Bench.ToString())) newCategory = ValveCategory.Bench; + else if (categoryComboBox.Text.Equals(ValveCategory.Output.ToString())) newCategory = ValveCategory.Output; + else newCategory = ValveCategory.None; + if (newCategory != config.Category) + { + config.Category = newCategory; + flags |= CfgUpdateFlags.RestartRqrd; + } + + int tmp = int.Parse(positionTextBox.Text); + if (config.Idx1 != tmp) + { + config.Idx1 = tmp; + flags |= CfgUpdateFlags.RestartRqrd; + } + + tmp = int.Parse(stableTimeTextBox.Text); + if (config.StableTimeMs != tmp) + { + config.StableTimeMs = tmp; + flags |= CfgUpdateFlags.RestartRqrd; + } + + tmp = int.Parse(flowStableSecTextBox.Text); + if (config.FlowStableSec != tmp) + { + config.FlowStableSec = tmp; + flags |= CfgUpdateFlags.RestartRqrd; + } + + bool btmp = storedPosReuseCheckBox.Checked; + if (config.StoredPositionReuse != btmp) + { + config.StoredPositionReuse = btmp; + flags |= CfgUpdateFlags.RestartRqrd; + } + + btmp = reTryCommandsCheckBox.Checked; + if (config.ReTryCommands != btmp) + { + config.ReTryCommands = btmp; + flags |= CfgUpdateFlags.RestartRqrd; + } + + return flags; + } + + private void openButton_Click(object sender, EventArgs e) + { + /// TODO + } + + private void closeButton_Click(object sender, EventArgs e) + { + /// TODO + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveCoax/RegulValveCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveCoax/RegulValveCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveCoax/RegulValveCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveCoax/SetFlowOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveCoax/SetFlowOp.cs new file mode 100644 index 00000000..b71c046a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveCoax/SetFlowOp.cs @@ -0,0 +1,491 @@ +/// +/// Copyright (c) 2017-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.BenchControl.GenericDevices; +using TBF.Boxes; + +namespace TBF.BenchControl.Elde.RegulValveCoax +{ + public class SetFlowOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(SetFlowOp)); + public override string ToString() + { + return string.Format("SetFlowOp({0}, Qfrom={1}, Qto={2}, PID={3})", regulValve.Name, finalReqFlowLo, finalReqFlowHi, pidCoef); + } + + /// Set by the constructor + readonly ControlBoardDev controlBoard; + readonly Elde.RegulValveCoax.RegulValve regulValve; + readonly int regulValveNr; + readonly int flowMeterNr; + readonly float finalReqFlowLo; + readonly float finalReqFlowHi; + readonly float reqFlowAve; + readonly float pidCoef; + readonly int timeout; + readonly bool leaveMeasurementRunning; + readonly bool reTryCommands; + + readonly float nominalFlow; + + /// + /// Internal states of this operation + /// + enum OpState + { + Idle = 0, + ValveMoveToPosition1, /// Wait 1 takt + ValveMoveToPosition2, /// This is actual move to position + ValveMoveToPosition3, /// Wait 1 takt + CheckStatePosition, /// Verify + SettingPosition, + ValveMoveToFlow1, /// Wait 1 takt + ValveMoveToFlow2, /// This is actual move to flow + ValveMoveToFlow3, /// Wait 1 takt + CheckStateFlow, /// Verify + SettingFlow, + FlowReached, + SendCommandAgain, + } + OpState opState; + + float currentReqFlowLo; + float currentReqFlowHi; + float targetPositionLo; + float targetPositionHi; + + int expireTime; + DoubleBox measuredFlow; + int flowWithinBoundsTime; + + + /// + /// Set required water flow. Conditionally leave the measurement running. + /// Events: FlowSet, FlowTimeOut + /// + /// Control board device + /// Regulation valve component + /// Flowmeter component + /// Lower limit of the flow to be achieved in [m3/h] + /// Upper limit of the flow to be achieved in [m3/h] + /// PID coefficient (float) + /// Timeout for the flow setting in [s] + /// true = Leave the measurement running after op. stop + /// Only Elde.Valve flow are used, other flow on the lists are ignored + public SetFlowOp(ControlBoardDev controlBoard, IRegulValve _regulValve, IFlowMeter flowMeter, + float requiredFlowLo, float requiredFlowHi, float pidCoef, DoubleBox measuredFlow, + bool reTryCmds, int timeout, bool leaveMeasurementRunning) + { + if (controlBoard == null) throw new ArgumentNullException("ctrlBoard"); + this.controlBoard = controlBoard; + + regulValve = _regulValve as Elde.RegulValveCoax.RegulValve; + if (regulValve == null) throw new ArgumentNullException(string.Format("{0} is not Elde.RegulValveCoax.", _regulValve.Name)); + regulValveNr = this.regulValve.Idx1; + + if (flowMeter is Elde.FlowMeter.FlowMeter) + { + this.flowMeterNr = (flowMeter as Elde.FlowMeter.FlowMeter).Idx1; + } + else if (flowMeter is Elde.FlowMeterTwins.FlowMeter) + { + this.flowMeterNr = 0; + } + else + { + throw new ArgumentNullException("flowMeter is null or not Elde"); + } + + nominalFlow = flowMeter.NominalFlow; + + this.finalReqFlowLo = requiredFlowLo; + this.finalReqFlowHi = requiredFlowHi; + this.reqFlowAve = (requiredFlowLo + requiredFlowHi) / 2; + this.pidCoef = pidCoef; + this.measuredFlow = measuredFlow; + this.reTryCommands = reTryCmds; + + this.timeout = timeout; + + this.leaveMeasurementRunning = leaveMeasurementRunning; + + log.Debug(this.ToString()); + } + + /// + /// Set required water flow - Do not leave the measurement running. + /// Events: FlowSet + /// + public SetFlowOp(ControlBoardDev controlBoard, IRegulValve regValve, IFlowMeter flowMeter, + float requiredFlowLo, float requiredFlowHi, float pidCoef, DoubleBox measuredFlow, bool reTryCmds, int timeout) + : this(controlBoard, regValve, flowMeter, requiredFlowLo, requiredFlowHi, pidCoef, measuredFlow, reTryCmds, timeout, false) + { + } + + /// + /// Set required water flow - No timeout. + /// Events: FlowSet + /// + public SetFlowOp(ControlBoardDev controlBoard, IRegulValve regValve, IFlowMeter flowMeter, + float requiredFlowLo, float requiredFlowHi, float pidCoef, DoubleBox measuredFlow, bool reTryCmds) + : this(controlBoard, regValve, flowMeter, requiredFlowLo, pidCoef, requiredFlowHi, measuredFlow, reTryCmds, int.MaxValue, false) + { + } + + /// + /// Fetch target position limits from the dictionary or return false + /// + /// Average of the flow targer range (input) + /// Target valve position low limit (output) + /// Target valve position high limit (output) + /// true when positions for the target flow are stored in the memory, otherwise return false + bool FetchTargetPosition(float avgReqFlow, out float positionLo, out float positionHi) + { + float targetPosition; + if (regulValve.Dict.TryGetValue(avgReqFlow, out targetPosition)) + { + positionLo = Math.Max(targetPosition * 0.95f, 0.0f); + positionHi = Math.Min(targetPosition * 1.05f, 100.0f); + return true; + } + else + { + positionLo = 0.0f; + positionHi = 0.0f; + return false; + } + } + + void StoreTargetPosition(float avgReqFlow, float actPosition) + { + if (!regulValve.Dict.ContainsKey(reqFlowAve)) + { + regulValve.Dict.Add(new KeyValuePair(avgReqFlow, actPosition)); + } + return; + } + + /// Start this operation + public void Start() + { + double flowMtrFreq = controlBoard.ReferenceFreq; + currentReqFlowLo = reqFlowAve; + currentReqFlowHi = reqFlowAve; + /// + if (flowMtrFreq != 0) + { + double flow = flowMtrFreq * nominalFlow / 2000.0; + if (measuredFlow != null) measuredFlow.Val = flow; + if (flow >= reqFlowAve) currentReqFlowLo = finalReqFlowLo; + if (flow <= reqFlowAve) currentReqFlowHi = finalReqFlowHi; + } + else + { + currentReqFlowLo = finalReqFlowLo; /// Unexpected case when flowMtrFreq==0 + currentReqFlowHi = finalReqFlowHi; + } + + flowWithinBoundsTime = 0; + + if (regulValve.RegulValveCfg.StoredPositionReuse && FetchTargetPosition(reqFlowAve, out targetPositionLo, out targetPositionHi)) + { + log.WarnFormat("Start() rv#={0} flowMtr#={1} TARGET: flowLo={2} flowHi={3} FETCHED: posLo={4} posHi={5}", + regulValveNr, flowMeterNr, currentReqFlowLo, currentReqFlowHi, targetPositionLo, targetPositionHi); + + opState = OpState.ValveMoveToPosition1; + } + else + { + log.WarnFormat("Start() rv#={0} flowMtr#={1} TARGET: flowLo={2} flowHi={3}", + regulValveNr, flowMeterNr, currentReqFlowLo, currentReqFlowHi); + + opState = OpState.ValveMoveToFlow1; + } + + expireTime = StateMachine.Time + timeout; + if (expireTime < 0) expireTime = int.MaxValue; + + TestMethods tm = 0; + StopDevs sd = 0; + // '_regulValve.RegulValveCfg.PidCoef' replaced by a casted operation parameter 'pidCoef' + controlBoard.SendCommand(Command.Start, flowMeterNr, controlBoard.Route, + int.MaxValue, int.MaxValue, tm, + 0.0f, (int)pidCoef, 0, sd); + } + + /// Run this operation + /// + /// Event.None, Event.FlowReached, Event.RegulValveTimeOut, Event.OpArgumentError + /// + public Event Run() + { + float rvPosition = controlBoard.RValvePosition(regulValveNr); + double flowMtrFreq = controlBoard.ReferenceFreq; + double flow = flowMtrFreq * nominalFlow / 2000.0; + + if (flowMtrFreq != 0) + { + if (measuredFlow != null) measuredFlow.Val = flow; + if (flow >= reqFlowAve) currentReqFlowLo = finalReqFlowLo; + if (flow <= reqFlowAve) currentReqFlowHi = finalReqFlowHi; + } + + log.InfoFormat("Run() rv#={0} pos={1}% freq={2} flow={3} curFlLo={4} curFlHi={5} state={6}", + regulValveNr, rvPosition.ToString("F1"), flowMtrFreq.ToString("F1"), flow.ToString("F3"), currentReqFlowLo.ToString("F3"), currentReqFlowHi.ToString("F3"), opState); + + + if (opState == OpState.SendCommandAgain) + { + flowWithinBoundsTime = 0; + + if (regulValve.RegulValveCfg.StoredPositionReuse && FetchTargetPosition(reqFlowAve, out targetPositionLo, out targetPositionHi)) + { + log.InfoFormat(" Run() rv#={0} flowMtr#={1} TARGET: flowLo={2} flowHi={3} FETCHED: posLo={4} posHi={5}", + regulValveNr, flowMeterNr, currentReqFlowLo.ToString("F3"), currentReqFlowHi.ToString("F3"), targetPositionLo, targetPositionHi); + + opState = OpState.ValveMoveToPosition1; + } + else + { + log.InfoFormat(" Run() rv#={0} flowMtr#={1} TARGET: flowLo={2} flowHi={3}", + regulValveNr, flowMeterNr, currentReqFlowLo.ToString("F3"), currentReqFlowHi.ToString("F3")); + + opState = OpState.ValveMoveToFlow1; + } + + expireTime = StateMachine.Time + timeout; + if (expireTime < 0) expireTime = int.MaxValue; + + TestMethods tm = 0; + StopDevs sd = 0; + // '_regulValve.RegulValveCfg.PidCoef' replaced by a casted operation parameter 'pidCoef' + controlBoard.SendCommand(Command.Start, flowMeterNr, controlBoard.Route, + int.MaxValue, int.MaxValue, tm, + 0.0f, (int)pidCoef, 0, sd); + log.DebugFormat(" return Event.None"); + return Event.None; + } + else if (opState == OpState.ValveMoveToPosition1) + { + opState = OpState.ValveMoveToPosition2; + log.DebugFormat(" return Event.None"); + return Event.None; + } + else if (opState == OpState.ValveMoveToPosition2) /// Move to position + { + /// Issues the appropriate ValveMove(...) command + controlBoard.ValveMove(regulValveNr, RegulValveMode.TargetPosition, + new float[2] { (targetPositionLo + targetPositionHi) / 2, (targetPositionLo + targetPositionHi) / 2 }, + regulValve.StableTime); + + opState = OpState.SettingPosition; + log.DebugFormat(" return Event.None"); + return Event.None; + } + else if (opState == OpState.ValveMoveToPosition3) + { + if (reTryCommands) + { + opState = OpState.CheckStatePosition; + } + else + { + opState = OpState.SettingPosition; + } + log.DebugFormat(" return Event.None"); + return Event.None; + } + else if (opState == OpState.CheckStatePosition) /// Verify + { + if (((ulong)controlBoard.StatusP & (ulong)StatusP.RefPulsesMsrmnt) == 0) + { + opState = OpState.SendCommandAgain; + log.DebugFormat(" return Event.None"); + return Event.None; + } + else if (((ulong)controlBoard.StatusP & (ulong)StatusP.CoaxRegValveBusy) == 0) + { + /// Repeat appropriate ValveMove(...) command + controlBoard.ValveMove(regulValveNr, RegulValveMode.TargetPosition, + new float[2] { (targetPositionLo + targetPositionHi) / 2, (targetPositionLo + targetPositionHi) / 2 }, + regulValve.StableTime); + + log.InfoFormat(" Run() ValveMove({0}, Position, {1}, {2}, {3})", + regulValveNr, (targetPositionLo + targetPositionHi) / 2, (targetPositionLo + targetPositionHi) / 2, regulValve.StableTime); + + opState = OpState.ValveMoveToPosition3; + log.DebugFormat(" return Event.None"); + return Event.None; + } + else + { + opState = OpState.SettingPosition; + log.DebugFormat(" return Event.None"); + return Event.None; + } + } + else if (opState == OpState.SettingPosition) + { + /// Repeated untill position is reached + if ((targetPositionLo <= rvPosition) && (rvPosition <= targetPositionHi)) + { + opState = OpState.ValveMoveToFlow1; + } + log.DebugFormat(" return Event.None"); + return Event.None; + } + else if (opState == OpState.ValveMoveToFlow1) + { + opState = OpState.ValveMoveToFlow2; + log.DebugFormat(" return Event.None"); + return Event.None; + } + else if (opState == OpState.ValveMoveToFlow2) /// Move to flow + { + /// + /// Done once, issues an appropriate ValveMove(...) command + /// + if (currentReqFlowLo >= currentReqFlowHi || currentReqFlowLo > nominalFlow || currentReqFlowHi <= 0) + { + log.DebugFormat(" return Event.OpArgumentError"); + return Event.OpArgumentError; + } + + float freqLo = 2000.0f * currentReqFlowLo / nominalFlow; + float freqHi = 2000.0f * currentReqFlowHi / nominalFlow; + controlBoard.ValveMove(regulValveNr, RegulValveMode.TargetFrequency, + new float[2] { (freqLo + freqHi) / 2, (freqLo + freqHi) / 2 }, + regulValve.StableTime); + log.WarnFormat(" Run() ValveMove({0}, Freq., {1}, {2}, {3}) flowMtr#={4} TARGET: flowLo={5} flowHi={6}", + regulValveNr, (freqLo + freqHi) / 2, (freqLo + freqHi) / 2, + regulValve.StableTime, + flowMeterNr, currentReqFlowLo.ToString("F3"), currentReqFlowHi.ToString("F3")); + + opState = OpState.ValveMoveToFlow3; + log.DebugFormat(" return Event.None"); + return Event.None; + } + else if (opState == OpState.ValveMoveToFlow3) + { + if (reTryCommands) + { + opState = OpState.CheckStateFlow; + } + else + { + opState = OpState.SettingFlow; + } + log.DebugFormat(" return Event.None"); + return Event.None; + } + else if (opState == OpState.CheckStateFlow) /// Verify the flow setting + { + if (((ulong)controlBoard.StatusP & (ulong)StatusP.CoaxRegValveBusy) == 0) + { + /// Done once, issues an appropriate ValveMove(...) command + float freqLo = 2000.0f * currentReqFlowLo / nominalFlow; + float freqHi = 2000.0f * currentReqFlowHi / nominalFlow; + controlBoard.ValveMove(regulValveNr, RegulValveMode.TargetFrequency, + new float[2] { (freqLo + freqHi) / 2, (freqLo + freqHi) / 2 }, + regulValve.StableTime); + + log.WarnFormat(" Run() ValveMove({0}, Frequency, {1}, {2}, {3}) flowMtr#={4} TARGET: flowLo={5} flowHi={6}", + regulValveNr, (freqLo + freqHi) / 2, (freqLo + freqHi) / 2, + regulValve.StableTime, + flowMeterNr, currentReqFlowLo.ToString("F3"), currentReqFlowHi.ToString("F3")); + + opState = OpState.ValveMoveToFlow3; + log.DebugFormat(" return Event.None"); + return Event.None; + } + else + { + opState = OpState.SettingFlow; + log.DebugFormat(" return Event.None"); + return Event.None; + } + } + else if (opState == OpState.SettingFlow) + { + /// + /// Repeated untill the required flow is reached + /// + if ((currentReqFlowLo <= flow) && (flow <= currentReqFlowHi)) + { + if (flowWithinBoundsTime++ >= regulValve.FlowStableSec) + { + if (regulValve.RegulValveCfg.StoredPositionReuse) + { + float storedPosition; + if (regulValve.Dict.TryGetValue(reqFlowAve, out storedPosition)) + { + /// update the stored valve position + StoreTargetPosition(reqFlowAve, (rvPosition + storedPosition) / 2.0f); + log.InfoFormat(" Run() rv#={0} reqFlow={1} pos={2}% stored={3} <--- Updating a stored position", + regulValveNr, reqFlowAve, rvPosition.ToString("F1"), storedPosition); + } + else + { + /// store the valve position + StoreTargetPosition(reqFlowAve, rvPosition); + log.InfoFormat(" Run() rv#={0} reqFlow={1} pos={2}% <--- Storing a new position", + regulValveNr, reqFlowAve, rvPosition.ToString("F1")); + } + } + + log.InfoFormat(" flow = {0} m3/h (lo={1}, hi={2}, REACHED)", flow.ToString("F3"), currentReqFlowLo.ToString("F3"), currentReqFlowHi.ToString("F3")); + + opState = OpState.FlowReached; + log.DebugFormat(" return Event.FlowReached"); + return Event.FlowReached; + } + else + { + log.InfoFormat(" flow = {0} m3/h (lo={1}, hi={2}, FLOW_OK_TIMER={3}s)", flow.ToString("F3"), currentReqFlowLo, currentReqFlowHi, flowWithinBoundsTime); + log.DebugFormat(" return Event.None"); + return Event.None; + } + } + else if (StateMachine.Time > expireTime) + { + log.DebugFormat(" return Event.RegulValveTimeOut"); + return Event.RegulValveTimeOut; + } + else + { + log.InfoFormat(" flow = {0} m3/h (lo={1}, hi={2})", flow.ToString("F3"), currentReqFlowLo, currentReqFlowHi); + flowWithinBoundsTime = 0; + log.DebugFormat(" return Event.None"); + return Event.None; + } + } + else /// opState == OpState.FlowReached + { + log.InfoFormat(" flow = {0} m3/h (lo={1}, hi={2}, REACHED)", flow.ToString("F3"), currentReqFlowLo, currentReqFlowHi); + log.DebugFormat(" return Event.FlowReached"); + return Event.FlowReached; + } + } + + /// Start this operation + public void Stop() + { + opState = OpState.Idle; + + if (leaveMeasurementRunning) return; + + /// Stop measurement + TestMethods tm = 0; + StopDevs sd = StopDevs.RegValveRegulation; + controlBoard.SendCommand(Command.Stop, flowMeterNr, controlBoard.Route, + 50000, 50000, tm, + 0.0f, (int)pidCoef, 0, sd); + + log.WarnFormat("Stop() SendCommand(Stop, {0}, ...)", flowMeterNr); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveCoax/SetRegulValvePositionOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveCoax/SetRegulValvePositionOp.cs new file mode 100644 index 00000000..cc482019 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveCoax/SetRegulValvePositionOp.cs @@ -0,0 +1,166 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl.Elde.RegulValveCoax +{ + public class SetRegulValvePositionOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(SetRegulValvePositionOp)); + public override string ToString() + { + return string.Format("SetRegulValvePositionOp({0},{1},{2})", regulValve.Name, posLoPct, posHiPct); + } + + const int CoaxValveNr = 7; /// Coax. valve has number 7 + + /// + /// Internal states of this operation + /// + enum OpState + { + Idle = 0, + MoveToPosition, /// Send commend to move to position + CheckState, /// Check RV state by reading statos word + MovingToPosition, /// Command passed OK, RV is moving to a position + } + OpState opState; + + /// Set by the constructor + readonly ControlBoardDev controlBoard; + readonly RegulValve regulValve; + readonly int regulValveNr; + readonly float posLoPct; + readonly float posHiPct; + readonly int timeout; + + /// Process values + bool firstRun; + int expireTime; + bool positionReached; + + /// + /// Set required water flow. + /// Events: FlowSet, FlowTimeOut + /// + /// Control board device + /// Regulation valve component + /// Lower limit of the position to be achieved + /// Upper limit of the position to be achieved + /// Timeout in sec. for setting the flow + /// Only Elde.Valve flow are used, other flow on the lists are ignored + public SetRegulValvePositionOp(ControlBoardDev controlBoard, RegulValve regulValve, float posLoPct, float posHiPct, int timeout) + { + if (controlBoard == null) throw new ArgumentNullException("ctrlBoard"); + this.controlBoard = controlBoard; + + this.regulValve = regulValve as RegulValve; + if (regulValve == null) throw new ArgumentNullException("regValve is null or not Elde"); + this.regulValveNr = this.regulValve.Idx1; + + this.posLoPct = posLoPct; + this.posHiPct = posHiPct; + + this.timeout = timeout; + + log.Debug(this.ToString()); + } + + /// + /// Set required water flow - no timeout. + /// Events: FlowSet + /// + public SetRegulValvePositionOp(ControlBoardDev controlBoard, RegulValve regValve, float posLoPct, float posHiPct) + : this(controlBoard, regValve, posLoPct, posHiPct, int.MaxValue) + { + } + + /// Start this operation + public void Start() + { + firstRun = true; + positionReached = false; + expireTime = StateMachine.Time + timeout; + log.InfoFormat("Start(): RV#={0}, reqPosLo={1}%, reqPosHi={2}%", regulValveNr, posLoPct.ToString("F1"), posHiPct.ToString("F1")); + opState = OpState.MoveToPosition; + } + + /// Run this operation + /// + /// Event.None . . . . . . . busy adjusting position + /// Event.PositionReached . . position reached + /// Event.OpArgumentError . . invalid required position + /// + public Event Run() + { + if (opState == OpState.MoveToPosition) + { + if (posLoPct > posHiPct || posLoPct > 100.0f || posHiPct < 0) + { + return Event.OpArgumentError; + } + + firstRun = false; + + controlBoard.ValveMove(regulValveNr, + RegulValveMode.TargetPosition, + new float[2] { posLoPct, posHiPct }, + regulValve.StableTime); + opState = OpState.CheckState; + return Event.None; + } + + if (positionReached) return Event.PositionReached; + + float positionPct = controlBoard.RValvePosition(regulValveNr); + log.WarnFormat("Run(): RV#={0}, actPos={1}%", regulValveNr, positionPct.ToString("F1")); + + if (opState == OpState.CheckState) + { + if (regulValveNr == CoaxValveNr && ((ulong)controlBoard.StatusP & (ulong)StatusP.CoaxRegValveBusy) == 0) + { + opState = OpState.MoveToPosition; + return Event.None; + } + else if (posLoPct <= positionPct && positionPct <= posHiPct) + { + positionReached = true; + return Event.PositionReached; + } + else if ((regulValveNr < 6) && (controlBoard.RegulValveState(regulValveNr) != RegulValveState.DacValueRegul)) + { + opState = OpState.MoveToPosition; /// Resend move command again in the next run + return Event.None; + } + else + { + opState = OpState.MovingToPosition; + return Event.None; + } + } + else if (StateMachine.Time > expireTime) + { + return Event.RegulValveTimeOut; + } + else if (opState == OpState.MovingToPosition) + { + if (posLoPct <= positionPct && positionPct <= posHiPct) + { + positionReached = true; + return Event.PositionReached; + } + return Event.None; + } + return Event.None; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveTandem/ChangeValvePositionOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveTandem/ChangeValvePositionOp.cs new file mode 100644 index 00000000..954809a3 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveTandem/ChangeValvePositionOp.cs @@ -0,0 +1,78 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl.Elde.RegulValveTandem +{ + public class ChangeRegulValvePositionOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(ChangeRegulValvePositionOp)); + public override string ToString() + { + return string.Format("ChangeRegulValvePositionOp({0},{1}s)", regulValve.Name, timePulseSec.ToString("F2")); + } + + /// Set by the constructor + readonly ControlBoardDev controlBoard; + readonly Elde.RegulValve.RegulValve regulValve; + readonly int regulValveNr; + readonly float timePulseSec; + + /// + /// Set required water flow. + /// Events: FlowSet, FlowTimeOut + /// + /// Control board device + /// Regulation valve component + /// Lower limit of the position to be achieved + /// Upper limit of the position to be achieved + /// Timeout in sec. for setting the flow + /// Only Elde.Valve flow are used, other flow on the lists are ignored + public ChangeRegulValvePositionOp(ControlBoardDev controlBoard, IRegulValve _regulValve, float timePulseSec) + { + if (controlBoard == null) throw new ArgumentNullException("ctrlBoard"); + this.controlBoard = controlBoard; + + regulValve = _regulValve as Elde.RegulValve.RegulValve; + if (regulValve == null) throw new ArgumentNullException("regValve is null or not Elde"); + regulValveNr = this.regulValve.Idx1; + + this.timePulseSec = timePulseSec; + + log.Debug(this.ToString()); + } + + /// Start this operation + public void Start() + { + float positionPct = controlBoard.RValvePosition(regulValveNr); + log.WarnFormat("RV#={0}, actPos={1}%", regulValveNr, positionPct.ToString("F1")); + + controlBoard.ValveMove(regulValveNr, + RegulValveMode.PulseWidth, + new float[2] { timePulseSec, timePulseSec }, + regulValve.StableTime); + } + + /// Run this operation + /// + /// Event.SetFlowDone + /// + public Event Run() + { + float positionPct = controlBoard.RValvePosition(regulValveNr); + log.WarnFormat("RV#={0}, actPos={1}%", regulValveNr, positionPct.ToString("F1")); + + return Event.PositionReached; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveTandem/RegulValveTandem.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveTandem/RegulValveTandem.cs new file mode 100644 index 00000000..683171a9 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveTandem/RegulValveTandem.cs @@ -0,0 +1,116 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.BenchControl.Generic; +using TBF.Boxes; + +namespace TBF.BenchControl.Elde.RegulValveTandem +{ + public class RegulValveTandem : ComponentBase, GenericDevices.IRegulValve + { + private static readonly ILog log = LogManager.GetLogger(typeof(RegulValveTandem)); + public override string ToString() { return string.Format("RegulValve({0})", Cfg.ToString(1)); } + + public readonly RegulValveTandemCfg RegulValveTandemCfg; + + IDictionary dict; + public IDictionary Dict { get { return dict; } } + + ControlBoardDev controlBoard { get { return regulValve.ControlBoard; } } + public ValveCategory Category { get { return RegulValveTandemCfg.Category; } } + + readonly RegulValve.RegulValve regulValve; + readonly RegulValve.RegulValve fixedRV; + + readonly float fixedPctLo; /// [%] + readonly float fixedPctHi; /// [%] + + public int FlowStableSec { get { return RegulValveTandemCfg.FlowStableSec; } } /// 0..60 sec + /// + public bool IsCoax { get { return false; } } + + public float Position + { + get { return regulValve.Position; } + } + + + public RegulValveTandem() + { + } + + public RegulValveTandem(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + RegulValveTandemCfg = cfg as RegulValveTandemCfg; + + regulValve = (RegulValve.RegulValve)TbfComponents.FindComponent(RegulValveTandemCfg.RegulValveName, components); + if (regulValve == null) throw new Exception("Cannot find regulation valve"); + + fixedRV = (RegulValve.RegulValve)TbfComponents.FindComponent(RegulValveTandemCfg.FixedRVName, components); + if (fixedRV == null) throw new Exception("Cannot find fixed RV"); + + fixedPctLo = Math.Max(0.0f, RegulValveTandemCfg.FixedRVPosition - 3.0f); + fixedPctHi = Math.Min(100.0f, RegulValveTandemCfg.FixedRVPosition + 3.0f); + + this.dict = new Dictionary(); + + log.Debug(this.ToString()); + } + + /// + /// Operation to set the water flow within tolerances + /// Events: Event.None, Event.FlowReached, Event.FlowTimeOut + /// + /// Flowmeter component + /// Lower limit of the required flow [m3/h] + /// Higher limit of the required flow [m3/h] + /// PID coefficient (float) + /// Measured flow [m3/h] + /// Timeout in [s] + /// SetFlowOp instance + public IOperation SetFlowOp(GenericDevices.IFlowMeter flowMeter, float requiredFlowLo, float requiredFlowHi, + float pidCoef, DoubleBox measuredFlow, int timeout) + { + return new SetFlowOp(controlBoard, regulValve, fixedRV, fixedPctLo, fixedPctHi, + flowMeter, requiredFlowLo, requiredFlowHi, pidCoef, measuredFlow, timeout); + } + + /// + /// Operation to set the water flow within tolerances. Leave the measurement running. + /// Events: Event.None, Event.FlowReached, Event.FlowTimeOut + /// + /// Flowmeter component + /// Lower limit of the required flow [m3/h] + /// Higher limit of the required flow [m3/h] + /// Measured flow [m3/h] + /// Timeout in [s] + /// SetFlowOp instance + public IOperation SetFlowAndMeasureOp(GenericDevices.IFlowMeter flowMeter, float requiredFlowLo, float requiredFlowHi, + float pidCoef, DoubleBox measuredFlow, int timeout, float filterConstant) + { + return new SetFlowOp(controlBoard, regulValve, fixedRV, fixedPctLo, fixedPctHi, + flowMeter, requiredFlowLo, requiredFlowHi, pidCoef, measuredFlow, timeout, true); + } + + /// + /// Operation to set the regulation valve to a required position + /// Events: Event.None + /// + /// Lower limit of the required valve position in [%] + /// Higher limit of the required valve position in [%] + /// SetPositionOp instance + public IOperation SetRegulValvePositionOp(float pctLo, float pctHi, int timeoutMs) + { + return null; + } + + public IOperation ChangeRegulValvePositionOp(float timePulseSec) + { + return null; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveTandem/RegulValveTandemCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveTandem/RegulValveTandemCfg.cs new file mode 100644 index 00000000..463d7fde --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveTandem/RegulValveTandemCfg.cs @@ -0,0 +1,59 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.RegulValveTandem +{ + public class RegulValveTandemCfg : ComponentCfgBase, IChildComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(RegulValveTandemCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new RegulValveTandemCfgCtrl(); } + + /// + /// Serialized parameters + /// + public ValveCategory Category; /// Feeding, Output or All + public string RegulValveName; /// Name of the regulation valve used to control the flow + public string FixedRVName; /// Name of the regulation valve with a fixed position + public float FixedRVPosition; /// Fixed RV position 0 .. 100 in [%] + public bool StoredPositionReuse; /// true = store and re-use previous regulation valve positions + public int FlowStableSec; /// 0..60 sec + + /// Private parameterless constructor invoked by all other (public) constructors + RegulValveTandemCfg() + { + } + + public RegulValveTandemCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + Factory = factory; + ParentName = string.Empty; + Category = ValveCategory.Output; + RegulValveName = "RV1"; + FixedRVName = "RV2"; + FixedRVPosition = 50.0f; + StoredPositionReuse = false; + FlowStableSec = 5; + } + + public string ToString(int i) + { + return string.Format("Name={0}, RegulVName={1}, FixedRVName={2}, FixedRVPos={3}%, PosReuse={4}, FlowStable={5}s", + Name, + RegulValveName, + FixedRVName, + FixedRVPosition.ToString("F0"), + StoredPositionReuse, + FlowStableSec); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveTandem/RegulValveTandemCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveTandem/RegulValveTandemCfgCtrl.cs new file mode 100644 index 00000000..f2853e53 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveTandem/RegulValveTandemCfgCtrl.cs @@ -0,0 +1,188 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.RegulValveTandem +{ + public partial class RegulValveTandemCfgCtrl : UserControl, IComponentCfgCtrl + { + ComponentParametersDlg parent; + + public bool ShowMore { get { return true; } } + + RegulValveTandemCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as RegulValveTandemCfg; + Redraw(); + } + } + + public RegulValveTandemCfgCtrl() + { + InitializeComponent(); + } + + private void RegulationValveCfgCtrl_Load(object sender, EventArgs e) + { + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + + if (parent.TbfComponents != null) + { + foreach (var cmpnt in parent.TbfComponents) + { + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is Elde.RegulValve.RegulValveFactory) + { + regulValveNameComboBox.Items.Add(cmpnt.Name); + fixedRVNameComboBox.Items.Add(cmpnt.Name); + } + } + } + + categoryComboBox.Items.Add(ValveCategory.All.ToString()); + categoryComboBox.Items.Add(ValveCategory.Feeding.ToString()); + categoryComboBox.Items.Add(ValveCategory.Output.ToString()); + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + categoryComboBox.Text = config.Category.ToString(); + regulValveNameComboBox.Text = string.IsNullOrEmpty(config.RegulValveName) ? "---" : config.RegulValveName; + fixedRVNameComboBox.Text = string.IsNullOrEmpty(config.FixedRVName) ? "---" : config.FixedRVName; + fixedRVPositionTextBox.Text = config.FixedRVPosition.ToString("F0"); + storedPosReuseCheckBox.Checked = config.StoredPositionReuse; + flowStableSecTextBox.Text = config.FlowStableSec.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + categoryComboBox.Enabled = true; + regulValveNameComboBox.Enabled = true; + fixedRVNameComboBox.Enabled = true; + fixedRVPositionTextBox.Enabled = true; + storedPosReuseCheckBox.Enabled = true; + flowStableSecTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (!categoryComboBox.Text.Equals(ValveCategory.All.ToString()) && + !categoryComboBox.Text.Equals(ValveCategory.Feeding.ToString()) && + !categoryComboBox.Text.Equals(ValveCategory.Output.ToString())) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Category'"; + } + + if (!regulValveNameComboBox.Items.Contains(regulValveNameComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Regulation valve'"; + } + + if (!fixedRVNameComboBox.Items.Contains(fixedRVNameComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Fixed reg. valve'"; + } + + int dummy; + if (!int.TryParse(fixedRVPositionTextBox.Text, out dummy) || dummy < 0 || dummy > 100) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Stable time' should be between 200 and 1500 ms in 50 ms steps"; + } + + if (!int.TryParse(flowStableSecTextBox.Text, out dummy) || dummy < 0 || dummy > 60) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Flow stable' should be between 0 and 60 sec"; + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + /// + if (!config.Name.Equals(nameTextBox.Text)) + { + config.Name = nameTextBox.Text; + flags |= CfgUpdateFlags.RestartRqrd; + } + + ValveCategory newCategory; + if (categoryComboBox.Text.Equals(ValveCategory.All.ToString())) newCategory = ValveCategory.All; + else if (categoryComboBox.Text.Equals(ValveCategory.Feeding.ToString())) newCategory = ValveCategory.Feeding; + else if (categoryComboBox.Text.Equals(ValveCategory.Bench.ToString())) newCategory = ValveCategory.Bench; + else if (categoryComboBox.Text.Equals(ValveCategory.Output.ToString())) newCategory = ValveCategory.Output; + else newCategory = ValveCategory.None; + if (newCategory != config.Category) + { + config.Category = newCategory; + flags |= CfgUpdateFlags.RestartRqrd; + } + + string str = regulValveNameComboBox.Text.Equals("---") ? string.Empty : regulValveNameComboBox.Text; + if (!config.RegulValveName.Equals(str)) + { + config.RegulValveName = str; + flags |= CfgUpdateFlags.RestartRqrd; + } + + str = fixedRVNameComboBox.Text.Equals("---") ? string.Empty : fixedRVNameComboBox.Text; + if (!config.FixedRVName.Equals(str)) + { + config.FixedRVName = str; + flags |= CfgUpdateFlags.RestartRqrd; + } + + int tmp = int.Parse(fixedRVPositionTextBox.Text); + if (config.FixedRVPosition != (float)tmp) + { + config.FixedRVPosition = (float)tmp; + flags |= CfgUpdateFlags.RestartRqrd; + } + + bool btmp = storedPosReuseCheckBox.Checked; + if (config.StoredPositionReuse != btmp) + { + config.StoredPositionReuse = btmp; + flags |= CfgUpdateFlags.RestartRqrd; + } + + tmp = int.Parse(flowStableSecTextBox.Text); + if (config.FlowStableSec != tmp) + { + config.FlowStableSec = tmp; + flags |= CfgUpdateFlags.RestartRqrd; + } + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveTandem/RegulValveTandemCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveTandem/RegulValveTandemCfgCtrl.designer.cs new file mode 100644 index 00000000..f44f14ba --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveTandem/RegulValveTandemCfgCtrl.designer.cs @@ -0,0 +1,218 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.Elde.RegulValveTandem +{ + partial class RegulValveTandemCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.regulValveNameLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.regulValveNameComboBox = new System.Windows.Forms.ComboBox(); + this.storedPosReuseCheckBox = new System.Windows.Forms.CheckBox(); + this.flowStableSecTextBox = new System.Windows.Forms.TextBox(); + this.flowStableSecLabel = new System.Windows.Forms.Label(); + this.fixedRVNameComboBox = new System.Windows.Forms.ComboBox(); + this.fixedRVNameLabel = new System.Windows.Forms.Label(); + this.fixedRVPositionTextBox = new System.Windows.Forms.TextBox(); + this.fixedRVPositionLabel = new System.Windows.Forms.Label(); + this.categoryComboBox = new System.Windows.Forms.ComboBox(); + this.categoryLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // regulValveNameLabel + // + this.regulValveNameLabel.AutoSize = true; + this.regulValveNameLabel.Location = new System.Drawing.Point(28, 93); + this.regulValveNameLabel.Name = "regulValveNameLabel"; + this.regulValveNameLabel.Size = new System.Drawing.Size(87, 13); + this.regulValveNameLabel.TabIndex = 5; + this.regulValveNameLabel.Text = "Regulation valve"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(138, 41); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(28, 44); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(135, 14); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(89, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComponentName"; + // + // regulValveNameComboBox + // + this.regulValveNameComboBox.Enabled = false; + this.regulValveNameComboBox.FormattingEnabled = true; + this.regulValveNameComboBox.Location = new System.Drawing.Point(138, 90); + this.regulValveNameComboBox.Name = "regulValveNameComboBox"; + this.regulValveNameComboBox.Size = new System.Drawing.Size(130, 21); + this.regulValveNameComboBox.TabIndex = 6; + // + // storedPosReuseCheckBox + // + this.storedPosReuseCheckBox.AutoSize = true; + this.storedPosReuseCheckBox.Enabled = false; + this.storedPosReuseCheckBox.Location = new System.Drawing.Point(31, 171); + this.storedPosReuseCheckBox.Name = "storedPosReuseCheckBox"; + this.storedPosReuseCheckBox.Size = new System.Drawing.Size(162, 17); + this.storedPosReuseCheckBox.TabIndex = 11; + this.storedPosReuseCheckBox.Text = "Enable stored position re-use"; + this.storedPosReuseCheckBox.UseVisualStyleBackColor = true; + // + // flowStableSecTextBox + // + this.flowStableSecTextBox.Enabled = false; + this.flowStableSecTextBox.Location = new System.Drawing.Point(138, 194); + this.flowStableSecTextBox.Name = "flowStableSecTextBox"; + this.flowStableSecTextBox.Size = new System.Drawing.Size(46, 20); + this.flowStableSecTextBox.TabIndex = 13; + // + // flowStableSecLabel + // + this.flowStableSecLabel.AutoSize = true; + this.flowStableSecLabel.Location = new System.Drawing.Point(28, 197); + this.flowStableSecLabel.Name = "flowStableSecLabel"; + this.flowStableSecLabel.Size = new System.Drawing.Size(74, 13); + this.flowStableSecLabel.TabIndex = 12; + this.flowStableSecLabel.Text = "Flow stable [s]"; + // + // fixedRVNameComboBox + // + this.fixedRVNameComboBox.Enabled = false; + this.fixedRVNameComboBox.FormattingEnabled = true; + this.fixedRVNameComboBox.Location = new System.Drawing.Point(138, 115); + this.fixedRVNameComboBox.Name = "fixedRVNameComboBox"; + this.fixedRVNameComboBox.Size = new System.Drawing.Size(130, 21); + this.fixedRVNameComboBox.TabIndex = 8; + // + // fixedRVNameLabel + // + this.fixedRVNameLabel.AutoSize = true; + this.fixedRVNameLabel.Location = new System.Drawing.Point(28, 118); + this.fixedRVNameLabel.Name = "fixedRVNameLabel"; + this.fixedRVNameLabel.Size = new System.Drawing.Size(82, 13); + this.fixedRVNameLabel.TabIndex = 7; + this.fixedRVNameLabel.Text = "Fixed reg. valve"; + // + // fixedRVPositionTextBox + // + this.fixedRVPositionTextBox.Enabled = false; + this.fixedRVPositionTextBox.Location = new System.Drawing.Point(138, 140); + this.fixedRVPositionTextBox.Name = "fixedRVPositionTextBox"; + this.fixedRVPositionTextBox.Size = new System.Drawing.Size(46, 20); + this.fixedRVPositionTextBox.TabIndex = 10; + // + // fixedRVPositionLabel + // + this.fixedRVPositionLabel.AutoSize = true; + this.fixedRVPositionLabel.Location = new System.Drawing.Point(28, 143); + this.fixedRVPositionLabel.Name = "fixedRVPositionLabel"; + this.fixedRVPositionLabel.Size = new System.Drawing.Size(89, 13); + this.fixedRVPositionLabel.TabIndex = 9; + this.fixedRVPositionLabel.Text = "Fixed RV position"; + // + // categoryComboBox + // + this.categoryComboBox.Enabled = false; + this.categoryComboBox.FormattingEnabled = true; + this.categoryComboBox.Location = new System.Drawing.Point(138, 65); + this.categoryComboBox.Name = "categoryComboBox"; + this.categoryComboBox.Size = new System.Drawing.Size(81, 21); + this.categoryComboBox.TabIndex = 4; + // + // categoryLabel + // + this.categoryLabel.AutoSize = true; + this.categoryLabel.Location = new System.Drawing.Point(28, 68); + this.categoryLabel.Name = "categoryLabel"; + this.categoryLabel.Size = new System.Drawing.Size(49, 13); + this.categoryLabel.TabIndex = 3; + this.categoryLabel.Text = "Category"; + // + // RegulValveTandemCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.categoryComboBox); + this.Controls.Add(this.categoryLabel); + this.Controls.Add(this.fixedRVPositionTextBox); + this.Controls.Add(this.fixedRVPositionLabel); + this.Controls.Add(this.fixedRVNameComboBox); + this.Controls.Add(this.fixedRVNameLabel); + this.Controls.Add(this.flowStableSecTextBox); + this.Controls.Add(this.flowStableSecLabel); + this.Controls.Add(this.storedPosReuseCheckBox); + this.Controls.Add(this.regulValveNameComboBox); + this.Controls.Add(this.regulValveNameLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "RegulValveTandemCfgCtrl"; + this.Size = new System.Drawing.Size(300, 700); + this.Load += new System.EventHandler(this.RegulationValveCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label regulValveNameLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.ComboBox regulValveNameComboBox; + private System.Windows.Forms.CheckBox storedPosReuseCheckBox; + private System.Windows.Forms.TextBox flowStableSecTextBox; + private System.Windows.Forms.Label flowStableSecLabel; + private System.Windows.Forms.ComboBox fixedRVNameComboBox; + private System.Windows.Forms.Label fixedRVNameLabel; + private System.Windows.Forms.TextBox fixedRVPositionTextBox; + private System.Windows.Forms.Label fixedRVPositionLabel; + private System.Windows.Forms.ComboBox categoryComboBox; + private System.Windows.Forms.Label categoryLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveTandem/RegulValveTandemCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveTandem/RegulValveTandemCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveTandem/RegulValveTandemCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveTandem/RegulValveTandemFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveTandem/RegulValveTandemFactory.cs new file mode 100644 index 00000000..75b75146 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveTandem/RegulValveTandemFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.RegulValveTandem +{ + public class RegulValveTandemFactory : IComponentFactory + { + public string ClassName { get { return "RegulationValveTandem"; } } + + public void ResetStaticProperties() { RegulValveTandem.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new RegulValveTandem(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new RegulValveTandem(cfg, components); } + + public IComponentCfg DefaultConfig() { return new RegulValveTandemCfg("RV", this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(RegulValveTandemCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveTandem/SetFlowOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveTandem/SetFlowOp.cs new file mode 100644 index 00000000..346e8714 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveTandem/SetFlowOp.cs @@ -0,0 +1,380 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.BenchControl.GenericDevices; +using TBF.Boxes; + +namespace TBF.BenchControl.Elde.RegulValveTandem +{ + public class SetFlowOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(SetFlowOp)); + public override string ToString() + { + return string.Format("SetFlowOp({0}, Qfrom={1}, Qto={2}, PID={3})", regulValve.Name, finalReqFlowLo, finalReqFlowHi, pidCoef); + } + + /// Set by the constructor + readonly ControlBoardDev controlBoard; + readonly Elde.RegulValve.RegulValve regulValve; + readonly int regulValveNr; + readonly Elde.RegulValve.RegulValve fixedRV; + readonly int fixedRVNr; + readonly float fixedPctLo; + readonly float fixedPctHi; + readonly int flowMeterNr; + readonly float finalReqFlowLo; + readonly float finalReqFlowHi; + readonly float reqFlowAve; + readonly float pidCoef; + readonly int timeout; + readonly bool leaveMeasurementRunning; + + readonly float nominalFlow; + + /// Process values + enum OpState + { + Idle = 0, + IssueSetPositionCommand, + SettingPosition, + IssueSetPositionCommand_FixedRV, + SettingPosition_FixedRV, + IssueSetFlowCommand, + SettingFlow, + FlowReached, + } + OpState opState; + + float currentReqFlowLo; + float currentReqFlowHi; + float targetPositionLo; + float targetPositionHi; + + int expireTime; + DoubleBox measuredFlow; + int flowWithinBoundsTime; + + + /// + /// Set required water flow. Conditionally leave the measurement running. + /// Events: FlowSet, FlowTimeOut + /// + /// Control board device + /// Regulation valve component + /// Regulation valve set to a fixed position + /// Lower limit of the fixed position of the fixed reg.v. + /// Upper limit of the fixed position of the fixed reg.v. + /// Flowmeter component + /// Lower limit of the flow to be achieved in [m3/h] + /// Upper limit of the flow to be achieved in [m3/h] + /// PID coefficient (float) + /// Timeout for the flow setting in [s] + /// true = Leave the measurement running after op. stop + /// Only Elde.Valve flow are used, other flow on the lists are ignored + public SetFlowOp(ControlBoardDev controlBoard, IRegulValve regV, IRegulValve fxdRV, float fxdPctLo, float fxdPctHi, + IFlowMeter flowMeter, float requiredFlowLo, float requiredFlowHi, float pidCoef, DoubleBox measuredFlow, + int timeout, bool leaveMeasurementRunning) + { + if (controlBoard == null) throw new ArgumentNullException("ctrlBoard"); + this.controlBoard = controlBoard; + + regulValve = regV as Elde.RegulValve.RegulValve; + if (regulValve == null) throw new ArgumentNullException("regValve is null or not Elde"); + regulValveNr = regulValve.Idx1; + + fixedRV = fxdRV as Elde.RegulValve.RegulValve; + if (fixedRV == null) throw new ArgumentNullException("regValve is null or not Elde"); + fixedRVNr = fixedRV.Idx1; + + this.fixedPctLo = fxdPctLo; + this.fixedPctHi = fxdPctHi; + + if (flowMeter is Elde.FlowMeter.FlowMeter) + { + this.flowMeterNr = (flowMeter as Elde.FlowMeter.FlowMeter).Idx1; + } + else if (flowMeter is Elde.FlowMeterTwins.FlowMeter) + { + this.flowMeterNr = 0; + } + else + { + throw new ArgumentNullException("flowMeter is null or not Elde"); + } + + nominalFlow = flowMeter.NominalFlow; + + this.finalReqFlowLo = requiredFlowLo; + this.finalReqFlowHi = requiredFlowHi; + this.reqFlowAve = (requiredFlowLo + requiredFlowHi) / 2.0f; + this.pidCoef = pidCoef; + this.measuredFlow = measuredFlow; + + this.timeout = timeout; + + this.leaveMeasurementRunning = leaveMeasurementRunning; + + log.Debug(this.ToString()); + } + + /// + /// Set required water flow - Do not leave the measurement running. + /// Events: FlowSet + /// + public SetFlowOp(ControlBoardDev controlBoard, IRegulValve regValve, IRegulValve fixedRV, float fixedPctLo, float fixedPctHi, + IFlowMeter flowMeter, float requiredFlowLo, float requiredFlowHi, float pidCoef, DoubleBox measuredFlow, int timeout) + : this(controlBoard, regValve, fixedRV, fixedPctLo, fixedPctHi, flowMeter, requiredFlowLo, requiredFlowHi, pidCoef, measuredFlow, timeout, false) + { + } + + /// + /// Set required water flow - No timeout. + /// Events: FlowSet + /// + public SetFlowOp(ControlBoardDev controlBoard, IRegulValve regValve, IRegulValve fixedRV, float fixedPctLo, float fixedPctHi, + IFlowMeter flowMeter, float requiredFlowLo, float requiredFlowHi, float pidCoef, DoubleBox measuredFlow) + : this(controlBoard, regValve, fixedRV, fixedPctLo, fixedPctHi, flowMeter, requiredFlowLo, pidCoef, requiredFlowHi, measuredFlow, int.MaxValue, false) + { + } + + /// + /// Fetch target position limits from the dictionary or return false + /// + /// Average of the flow targer range (input) + /// Target valve position low limit (output) + /// Target valve position high limit (output) + /// true when positions for the target flow are stored in the memory, otherwise return false + bool FetchTargetPosition(float avgReqFlow, out float positionLo, out float positionHi) + { + float targetPosition; + if (regulValve.Dict.TryGetValue(avgReqFlow, out targetPosition)) + { + positionLo = Math.Max(targetPosition * 0.95f, 0.0f); + positionHi = Math.Min(targetPosition * 1.05f, 100.0f); + return true; + } + else + { + positionLo = 0.0f; + positionHi = 0.0f; + return false; + } + } + + void StoreTargetPosition(float avgReqFlow, float actPosition) + { + if (!regulValve.Dict.ContainsKey(reqFlowAve)) + { + regulValve.Dict.Add(new KeyValuePair(avgReqFlow, actPosition)); + } + return; + } + + /// Start this operation + public void Start() + { + double flowMtrFreq = controlBoard.ReferenceFreq; + currentReqFlowLo = reqFlowAve; + currentReqFlowHi = reqFlowAve; + /// + if (flowMtrFreq != 0) + { + double flow = flowMtrFreq * nominalFlow / 2000.0; + if (measuredFlow != null) measuredFlow.Val = flow; + if (flow >= reqFlowAve) currentReqFlowLo = finalReqFlowLo; + if (flow <= reqFlowAve) currentReqFlowHi = finalReqFlowHi; + } + else + { + currentReqFlowLo = finalReqFlowLo; /// Unexpected case when flowMtrFreq==0 + currentReqFlowHi = finalReqFlowHi; + } + + flowWithinBoundsTime = 0; + + if (regulValve.RegulValveCfg.StoredPositionReuse && FetchTargetPosition(reqFlowAve, out targetPositionLo, out targetPositionHi)) + { + log.InfoFormat("Start(): rv#={0} flowMtr#={1} TARGET: flowLo={2} flowHi={3} FETCHED: posLo={4} posHi={5}", + regulValveNr, flowMeterNr, currentReqFlowLo, currentReqFlowHi, targetPositionLo, targetPositionHi); + + opState = OpState.IssueSetPositionCommand; + } + else + { + log.InfoFormat("Start(): rv#={0} flowMtr#={1} TARGET: flowLo={2} flowHi={3}", + regulValveNr, flowMeterNr, currentReqFlowLo, currentReqFlowHi); + + opState = OpState.IssueSetPositionCommand_FixedRV; + } + + expireTime = StateMachine.Time + timeout; + if (expireTime < 0) expireTime = int.MaxValue; + + TestMethods tm = 0; + StopDevs sd = 0; + // '_regulValve.RegulValveTandemCfg.PidCoef' replaced by a casted operation parameter 'pidCoef' + controlBoard.SendCommand(Command.Start, flowMeterNr, controlBoard.Route, + int.MaxValue, int.MaxValue, tm, + 0.0f, (int)pidCoef, 0, sd); + } + + /// Run this operation + /// + /// Event.None, Event.FlowReached, Event.RegulValveTimeOut, Event.OpArgumentError + /// + public Event Run() + { + float rvPosition = controlBoard.RValvePosition(regulValveNr); + float fixedRVPosition = controlBoard.RValvePosition(fixedRVNr); + double flowMtrFreq = controlBoard.ReferenceFreq; + double flow = flowMtrFreq * nominalFlow / 2000.0; + + if (flowMtrFreq != 0) + { + if (measuredFlow != null) measuredFlow.Val = flow; + if (flow >= reqFlowAve) currentReqFlowLo = finalReqFlowLo; + if (flow <= reqFlowAve) currentReqFlowHi = finalReqFlowHi; + } + + log.InfoFormat("Run(): rv#={0} pos={1}% freq={2} flow={3} opState={4}", + regulValveNr, rvPosition.ToString("F1"), flowMtrFreq, flow, opState); + + if (opState == OpState.IssueSetPositionCommand) + { + /// + /// Done once, issues an appropriate ValveMove(...) command + /// + controlBoard.ValveMove(regulValveNr, RegulValveMode.TargetPosition, + new float[2] { targetPositionLo, targetPositionHi }, + regulValve.StableTime); + + opState = OpState.SettingPosition; + return Event.None; + } + else if (opState == OpState.SettingPosition) + { + /// + /// Repeated untill position is reached + /// + if ((targetPositionLo <= rvPosition) && (rvPosition <= targetPositionHi)) + { + opState = OpState.IssueSetPositionCommand_FixedRV; + } + return Event.None; + } + else if (opState == OpState.IssueSetPositionCommand_FixedRV) + { + /// + /// Done once, issues an appropriate ValveMove(...) command + /// + controlBoard.ValveMove(fixedRVNr, RegulValveMode.TargetPosition, + new float[2] { fixedPctLo, fixedPctHi }, + regulValve.StableTime); + + opState = OpState.SettingPosition_FixedRV; + return Event.None; + } + else if (opState == OpState.SettingPosition_FixedRV) + { + /// + /// Repeated untill position is reached + /// + if ((fixedPctLo <= fixedRVPosition) && (fixedRVPosition <= fixedPctHi)) + { + opState = OpState.IssueSetFlowCommand; + } + return Event.None; + } + else if (opState == OpState.IssueSetFlowCommand) + { + /// + /// Done once, issues an appropriate ValveMove(...) command + /// + if (currentReqFlowLo >= currentReqFlowHi || currentReqFlowLo > nominalFlow || currentReqFlowHi <= 0) + { + return Event.OpArgumentError; + } + + log.InfoFormat("Run(): rv#={0} flowMtr#={1} TARGET: flowLo={2} flowHi={3}", + regulValveNr, flowMeterNr, currentReqFlowLo, currentReqFlowHi); + + float freqLo = 2000.0f * currentReqFlowLo / nominalFlow; + float freqHi = 2000.0f * currentReqFlowHi / nominalFlow; + controlBoard.ValveMove(regulValveNr, RegulValveMode.TargetFrequency, + new float[2] { freqLo, freqHi }, + regulValve.StableTime); + + opState = OpState.SettingFlow; + return Event.None; + } + else if (opState == OpState.SettingFlow) + { + /// + /// Repeated untill the required flow is reached + /// + if ((currentReqFlowLo <= flow) && (flow <= currentReqFlowHi)) + { + if (flowWithinBoundsTime++ >= regulValve.FlowStableSec) + { + if (regulValve.RegulValveCfg.StoredPositionReuse) + { + float storedPosition; + if (regulValve.Dict.TryGetValue(reqFlowAve, out storedPosition)) + { + /// update the stored valve position + StoreTargetPosition(reqFlowAve, (rvPosition + storedPosition) / 2.0f); + log.InfoFormat("Run(): rv#={0} reqFlow={1} pos={2}% stored={3} <--- Updating a stored position", + regulValveNr, reqFlowAve, rvPosition.ToString("F1"), storedPosition); + } + else + { + /// store the valve position + StoreTargetPosition(reqFlowAve, rvPosition); + log.InfoFormat("Run(): rv#={0} reqFlow={1} pos={2}% <--- Storing a new position", + regulValveNr, reqFlowAve, rvPosition.ToString("F1")); + } + } + opState = OpState.FlowReached; + return Event.FlowReached; + } + else + { + return Event.None; + } + } + else if (StateMachine.Time > expireTime) + { + return Event.RegulValveTimeOut; + } + else + { + flowWithinBoundsTime = 0; + return Event.None; + } + } + else /// opState == OpState.FlowReached + { + return Event.FlowReached; + } + } + + /// Start this operation + public void Stop() + { + opState = OpState.Idle; + + if (leaveMeasurementRunning) return; + + /// Stop measurement + TestMethods tm = 0; + StopDevs sd = StopDevs.RegValveRegulation; + controlBoard.SendCommand(Command.Stop, flowMeterNr, controlBoard.Route, + 50000, 50000, tm, + 0.0f, 20, 0, sd); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveTandem/SetRegulValvePositionOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveTandem/SetRegulValvePositionOp.cs new file mode 100644 index 00000000..0292c5b6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/RegulValveTandem/SetRegulValvePositionOp.cs @@ -0,0 +1,134 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl.Elde.RegulValveTandem +{ + public class SetRegulValvePositionOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(SetRegulValvePositionOp)); + public override string ToString() + { + return string.Format("SetRegulValvePositionOp({0},{1},{2})", regulValve.Name, posLoPct, posHiPct); + } + + /// Set by the constructor + readonly ControlBoardDev controlBoard; + readonly Elde.RegulValve.RegulValve regulValve; + readonly int regulValveNr; + readonly float posLoPct; + readonly float posHiPct; + readonly int timeout; + + /// Process values + bool firstRun; + int expireTime; + bool positionReached; + + /// + /// Set required water flow. + /// Events: FlowSet, FlowTimeOut + /// + /// Control board device + /// Regulation valve component + /// Lower limit of the position to be achieved + /// Upper limit of the position to be achieved + /// Timeout in sec. for setting the flow + /// Only Elde.Valve flow are used, other flow on the lists are ignored + public SetRegulValvePositionOp(ControlBoardDev controlBoard, IRegulValve regV, float posLoPct, float posHiPct, int timeout) + { + if (controlBoard == null) throw new ArgumentNullException("ctrlBoard"); + this.controlBoard = controlBoard; + + regulValve = regV as Elde.RegulValve.RegulValve; + if (regulValve == null) throw new ArgumentNullException("regValve is null or not Elde"); + regulValveNr = this.regulValve.Idx1; + + this.posLoPct = posLoPct; + this.posHiPct = posHiPct; + + this.timeout = timeout; + + log.Debug(this.ToString()); + } + + /// + /// Set required water flow - no timeout. + /// Events: FlowSet + /// + public SetRegulValvePositionOp(ControlBoardDev controlBoard, RegulValveTandem regValve, float posLoPct, float posHiPct) + : this(controlBoard, regValve, posLoPct, posHiPct, int.MaxValue) + { + } + + /// Start this operation + public void Start() + { + firstRun = true; + positionReached = false; + expireTime = StateMachine.Time + timeout; + log.InfoFormat("Start(): RV#={0}, reqPosLo={1}%, reqPosHi={2}%", regulValveNr, posLoPct.ToString("F1"), posHiPct.ToString("F1")); + } + + /// Run this operation + /// + /// Event.None . . . . . . . busy adjusting position + /// Event.PositionReached . . position reached + /// Event.OpArgumentError . . invalid required position + /// + public Event Run() + { + if (firstRun) + { + if (posLoPct >= posHiPct || posLoPct >= 100.0f || posHiPct <= 0) + { + return Event.OpArgumentError; + } + + firstRun = false; + + controlBoard.ValveMove(regulValveNr, + RegulValveMode.TargetPosition, + new float[2] { posLoPct, posHiPct }, + regulValve.StableTime); + return Event.None; + } + + if (positionReached) return Event.PositionReached; + + float positionPct = controlBoard.RValvePosition(regulValveNr); + log.WarnFormat("Run(): RV#={0}, actPos={1}%", regulValveNr, positionPct.ToString("F1")); + + if (posLoPct >= posHiPct || posLoPct >= 100.0f || posHiPct <= 0) + { + return Event.OpArgumentError; + } + else if (posLoPct <= positionPct && positionPct <= posHiPct) + { + positionReached = true; + return Event.PositionReached; + } + else if (StateMachine.Time > expireTime) + { + return Event.RegulValveTimeOut; + } + else + { + return Event.None; + } + } + + /// Stop this operation + public void Stop() + { + controlBoard.ValveMove(regulValveNr, + RegulValveMode.Stop, + new float[2] { posLoPct, posHiPct }, + regulValve.StableTime); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/SetValvesOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/SetValvesOp.cs new file mode 100644 index 00000000..949a5f1f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/SetValvesOp.cs @@ -0,0 +1,309 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.BenchControl.GenericDevices; +using Dirichlet.Numerics; + +namespace TBF.BenchControl.Elde +{ + public class SetValvesOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(SetValvesOp)); + + /// Set by the constructor + ControlBoardDev controlBoard; + + class SwitchPoint + { + public int TimeSec; /// Relative time in [s] from the start of the operation + public IList VOpen; /// List of valves to open in this point of time + public IList VClose; /// List of valves to close in this point of time + public UInt128 MasksOpen; /// OR-ed bitmasks of valves to open in this point of time + public UInt128 MasksClose; /// OR-ed bitmasks of valves to close in this point of time + + public SwitchPoint(int time, IList vOpen, IList vClose) + { + this.TimeSec = time; + this.VOpen = (vOpen == null) ? new List() : vOpen; + this.VClose = (vClose == null) ? new List() : vClose; + } + + /// + /// Max. delay of all valves that were opened or closed + /// + /// 'ulong' with bits of valves that were actually changed set ot '1' + /// Delay in [s] + public int MaxDelay(UInt128 changed) + { + int max = 0; + foreach (var vlv in VOpen) + { + /// Skip the delay evaluation and update in case the valve/pump have not changed + if (vlv is Valve.Valve && ((vlv as Valve.Valve).Mask & changed) == 0) continue; + if (vlv is Pump.Pump && ((vlv as Pump.Pump).Mask & changed) == 0) continue; + if (vlv is PumpWithFM.Pump && ((vlv as PumpWithFM.Pump).Mask & changed) == 0) continue; + if (vlv is Danfoss.VLT2800.Pump && ((vlv as Danfoss.VLT2800.Pump).Mask & changed) == 0) continue; + + if ((vlv != null) && (vlv.Delay > max)) max = vlv.Delay; + } + foreach (var vlv in VClose) + { + /// Skip the delay evaluation and update in case the valve/pump have not changed + if (vlv is Valve.Valve && ((vlv as Valve.Valve).Mask & changed) == 0) continue; + if (vlv is Pump.Pump && ((vlv as Pump.Pump).Mask & changed) == 0) continue; + if (vlv is PumpWithFM.Pump && ((vlv as PumpWithFM.Pump).Mask & changed) == 0) continue; + if (vlv is Danfoss.VLT2800.Pump && ((vlv as Danfoss.VLT2800.Pump).Mask & changed) == 0) continue; + + if ((vlv != null) && (vlv.Delay > max)) max = vlv.Delay; + } + return max; + } + } + + IList switchPointsRaw; + IList switchPoints; + int nextIx; + int swStartTime; + int maxDelayTime; /// Max. delay from all valve/pump switches. + /// Relative time in [s] from the start of the operation + + /// + /// Processes coupled valves and creates switch points. + /// + /// A list of opening master valves + /// A list of closing master valves + /// + IList AddSwitchPoints(IList swPoints, IList valvesOpen, IList valvesClose, int time) + { + int ix0 = swPoints.Count; + swPoints.Add(new SwitchPoint(time, valvesOpen, valvesClose)); + + foreach (var valve in StateMachine.CoupledValves) + { + if ((!valve.InvertCouple && valvesOpen.Contains(valve.CoupledTo)) || + (valve.InvertCouple && valvesClose.Contains(valve.CoupledTo))) + { + /// The coupled valve 'valve' is opening + int lag = time + valve.LagOpening; + if (lag == time) + { + swPoints[ix0].VOpen.Add(valve); + } + else + { + swPoints.Add(new SwitchPoint(lag, ValveBase.MakeList(valve), null)); + } + } + else if ((!valve.InvertCouple && valvesClose.Contains(valve.CoupledTo)) || + (valve.InvertCouple && valvesOpen.Contains(valve.CoupledTo))) + { + /// The coupled valve 'valve' is closing + int lag = time + valve.LagClosing; + if (lag == time) + { + swPoints[ix0].VClose.Add(valve); + } + else + { + swPoints.Add(new SwitchPoint(lag, null, ValveBase.MakeList(valve))); + } + } + } + return swPoints; + } + + + IList SortAndMergeSwitchPoints(IList unsorted) + { + IList result = new List(); + + SwitchPoint lastAdded = null; + while (unsorted.Count > 0) + { + SwitchPoint first = null; + foreach (var point in unsorted) + { + if (first == null || first.TimeSec > point.TimeSec) first = point; + } + if (lastAdded == null || lastAdded.TimeSec != first.TimeSec) + { + result.Add(first); + lastAdded = first; + } + else + { + lastAdded.VOpen = ValveBase.Merge(lastAdded.VOpen, first.VOpen); + lastAdded.VClose = ValveBase.Merge(lastAdded.VClose, first.VClose); + } + unsorted.Remove(first); + } + return result; + } + + + void MakeMasks(IList switchPoints, int timeShift) + { + foreach (var point in switchPoints) + { + /// Only Elde.Valve valves are used, other valves are ignored + point.MasksOpen = 0; + foreach (var valve in point.VOpen) + { + if (valve is Valve.Valve) point.MasksOpen |= (valve as Valve.Valve).Mask; + if (valve is Pump.Pump) point.MasksOpen |= (valve as Pump.Pump).Mask; + if (valve is PumpWithFM.Pump) point.MasksOpen |= (valve as PumpWithFM.Pump).Mask; + if (valve is Danfoss.VLT2800.Pump) point.MasksOpen |= (valve as Danfoss.VLT2800.Pump).Mask; + if (valve is PumpTandem.Pump) point.MasksOpen |= (valve as PumpTandem.Pump).Mask; + } + point.MasksClose = 0; + foreach (var valve in point.VClose) + { + if (valve is Valve.Valve) point.MasksClose |= (valve as Valve.Valve).Mask; + if (valve is Pump.Pump) point.MasksClose |= (valve as Pump.Pump).Mask; + if (valve is PumpWithFM.Pump) point.MasksClose |= (valve as PumpWithFM.Pump).Mask; + if (valve is Danfoss.VLT2800.Pump) point.MasksClose |= (valve as Danfoss.VLT2800.Pump).Mask; + if (valve is PumpTandem.Pump) point.MasksClose |= (valve as PumpTandem.Pump).Mask; + } + point.TimeSec += timeShift; + } + } + + + /// + /// Open and/or close multiple valves. + /// Events: ValvesSet + /// + /// Control board device + /// A list of opening master valves + /// A list of closing master valves + /// Only Elde.Valve valves are used, other valves on the lists are ignored + public SetValvesOp(ControlBoardDev controlBoard, IList valvesOpen, IList valvesClose) + { + if (controlBoard == null) throw new ArgumentNullException("ctrlBoard"); + this.controlBoard = controlBoard; + + if (valvesOpen == null) valvesOpen = new List(); + if (valvesClose == null) valvesClose = new List(); + + switchPointsRaw = new List(); + AddSwitchPoints(switchPointsRaw, valvesOpen, valvesClose, 0); + switchPoints = SortAndMergeSwitchPoints(switchPointsRaw); + int timeShift = -switchPoints[0].TimeSec; + MakeMasks(switchPoints, timeShift); + } + + /// + /// Open one valve and/or close one valve. + /// Events: ValvesSet + /// + /// Control board device + /// Valve to be opened + /// Valve to be closed + /// Only Elde.Valve valves are used, other valves on the lists are ignored + public SetValvesOp(ControlBoardDev controlBoard, IValve valveOpen, IValve valveClose) + : this(controlBoard, ValveBase.MakeList(valveOpen), ValveBase.MakeList(valveClose)) + { + } + + /// + /// OPEN or CLOSE start/stop valve and associated valves and/or pumps. + /// Events: ValvesSet + /// + /// Control board device + /// true: close start valve, false: open start valve + /// OutputPath specifying the start valve and associated valves/pumps + /// Only Elde.Valve valves are used, other valves on the lists are ignored + public SetValvesOp(ControlBoardDev controlBoard, bool close, OutputPath outPath) + { + if (controlBoard == null) throw new ArgumentNullException("ctrlBoard"); + this.controlBoard = controlBoard; + + IList none = new List(); /// An empty list of valves + switchPointsRaw = new List(); + + if (close) + { + if (outPath.InvertSV1) AddSwitchPoints(switchPointsRaw, ValveBase.MakeList(outPath.StartValve1), none, 0); + else AddSwitchPoints(switchPointsRaw, none, ValveBase.MakeList(outPath.StartValve1), 0); + + if (outPath.StartValve2 != null) + { + if (outPath.InvertSV2) AddSwitchPoints(switchPointsRaw, ValveBase.MakeList(outPath.StartValve2), none, outPath.LagSV2); + else AddSwitchPoints(switchPointsRaw, none, ValveBase.MakeList(outPath.StartValve2), outPath.LagSV2); + } + + if (outPath.StartValve3 != null) + { + if (outPath.InvertSV3) AddSwitchPoints(switchPointsRaw, ValveBase.MakeList(outPath.StartValve3), none, outPath.LagSV3); + else AddSwitchPoints(switchPointsRaw, none, ValveBase.MakeList(outPath.StartValve3), outPath.LagSV3); + } + } + else + { + if (outPath.InvertSV1) AddSwitchPoints(switchPointsRaw, none, ValveBase.MakeList(outPath.StartValve1), 0); + else AddSwitchPoints(switchPointsRaw, ValveBase.MakeList(outPath.StartValve1), none, 0); + + if (outPath.StartValve2 != null) + { + if (outPath.InvertSV2) AddSwitchPoints(switchPointsRaw, none, ValveBase.MakeList(outPath.StartValve2), -outPath.LagSV2); + else AddSwitchPoints(switchPointsRaw, ValveBase.MakeList(outPath.StartValve2), none, -outPath.LagSV2); + } + + if (outPath.StartValve3 != null) + { + if (outPath.InvertSV3) AddSwitchPoints(switchPointsRaw, none, ValveBase.MakeList(outPath.StartValve3), -outPath.LagSV3); + else AddSwitchPoints(switchPointsRaw, ValveBase.MakeList(outPath.StartValve3), none, -outPath.LagSV3); + } + } + + switchPoints = SortAndMergeSwitchPoints(switchPointsRaw); + int timeShift = -switchPoints[0].TimeSec; + MakeMasks(switchPoints, timeShift); + } + + /// Start this operation + public void Start() + { + UInt128 changed = controlBoard.SetValves(switchPoints[0].MasksOpen, switchPoints[0].MasksClose, StateMachine.ExtendedValves); + swStartTime = StateMachine.Time; + maxDelayTime = switchPoints[0].MaxDelay(changed); + nextIx = 1; + } + + /// Run this operation + /// + /// Event.SetValvesDone + /// + public Event Run() + { + if (nextIx >= switchPoints.Count) + { + if (StateMachine.Time >= swStartTime + maxDelayTime) return Event.ValvesSet; + else return Event.ValvesBusy; + } + + if (StateMachine.Time >= swStartTime + switchPoints[nextIx].TimeSec) + { + UInt128 changed = controlBoard.SetValves(switchPoints[nextIx].MasksOpen, switchPoints[nextIx].MasksClose, StateMachine.ExtendedValves); + + int nextDelay = switchPoints[nextIx].MaxDelay(changed); + if (switchPoints[nextIx].TimeSec + nextDelay > maxDelayTime) + { + maxDelayTime = switchPoints[nextIx].TimeSec + nextDelay; + } + + nextIx++; + } + + return Event.ValvesBusy; + } + + /// Start this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/StartMeasurementOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/StartMeasurementOp.cs new file mode 100644 index 00000000..dced371f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/StartMeasurementOp.cs @@ -0,0 +1,221 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using log4net; +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl.Elde +{ + public class StartMeasurementOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(StartMeasurementOp)); + public override string ToString() { return string.Format("StartMeasurementOp(ref={0},pulses={1})", flowMeterNr, totalRefPulses); } + + /// Set by the constructor + readonly ControlBoardDev controlBoard; + readonly IRegulValve regulValve; + readonly int regulValveNr; + readonly int regulValveStableTime; + readonly int flowMeterNr; + readonly float nominalFlow; + readonly float reqFlowLo; + readonly float reqFlowHi; + readonly float pidCoef; + readonly int totalRefPulses; /// Number of reference pulses for a complete test + readonly int massRefPulses; /// Number of reference pulses for mass collection + readonly TestMethods testMethod; + readonly float filterConstant; + readonly int diverterNr; + + bool started = false; + + /// + /// Internal states of this operation + /// + enum OpState + { + StartingTest, + ResendCommand, + TestStarted, + ValveMoveToFlow, + OpCompleted, + } + OpState opState; + + + /// + /// Starts the measurement. + /// Events: MeasurementStarted + /// + /// Control board component reference + /// Specifies used components + /// Test method + /// Test duration in number of reference flowmeter pulses + /// Specifies filter for watermeter pulses + public StartMeasurementOp(ControlBoardDev controlBoard, OutputPath outputPath, TestMethods method, + float requiredFlowLo, float requiredFlowHi, + int refPulses, float filterConstant) + : this(controlBoard, outputPath, method, requiredFlowLo, requiredFlowHi, refPulses, refPulses, filterConstant) + { + } + + /// + /// Starts the measurement. + /// Events: MeasurementStarted + /// + /// Control board component reference + /// Specifies used components + /// Test method + /// Test duration in number of reference flowmeter pulses + /// Specifies filter for watermeter pulses + public StartMeasurementOp(ControlBoardDev controlBoard, OutputPath outputPath, TestMethods method, + float requiredFlowLo, float requiredFlowHi, + int totalRefPulses, int massRefPulses, float filterConstant) + { + if (controlBoard == null) throw new ArgumentNullException("controlBoardDev"); + this.controlBoard = controlBoard; + + if (outputPath.FlowMeter == null) throw new ArgumentNullException("Flow meter is missing"); + flowMeterNr = outputPath.FlowMeter.Idx1; + + this.regulValve = outputPath.RegulValve; + if (regulValve is Elde.RegulValve.RegulValve) + { + Elde.RegulValve.RegulValve rv = outputPath.RegulValve as Elde.RegulValve.RegulValve; + regulValveNr = rv.Idx1; + regulValveStableTime = rv.StableTime; + } + else if (regulValve is Elde.RegulValveCoax.RegulValve) + { + Elde.RegulValveCoax.RegulValve rv = outputPath.RegulValve as Elde.RegulValveCoax.RegulValve; + regulValveNr = rv.Idx1; + regulValveStableTime = rv.StableTime; + } + else if (!(regulValve is Dummy.RegulValve.RegulValve)) + { + throw new ArgumentNullException("Regulation valve is not compatible with Elde Control Board"); + } + + if (outputPath.Diverter is Elde.Diverter.Diverter) + { + diverterNr = (outputPath.Diverter as Elde.Diverter.Diverter).DiverterNr; + } + + nominalFlow = outputPath.FlowMeter.NominalFlow; + + this.reqFlowLo = requiredFlowLo; + this.reqFlowHi = requiredFlowHi; + this.pidCoef = outputPath.PidCoef; + + this.totalRefPulses = totalRefPulses; + this.massRefPulses = massRefPulses; + this.testMethod = method; + this.filterConstant = filterConstant; + + log.Debug(this.ToString()); + } + + void SendStartCommand() + { + controlBoard.SyncRoute(); +#if TURA_IPERL || TURA_SPECIAL || BADGER_VELKA_TRAT || SLM_50 + int flowMeterIdxAndDiv = flowMeterNr + 16 * diverterNr; +#elif BADGER_STREDNA_TRAT + int flowMeterIdxAndDiv = flowMeterNr + 8 * (diverterNr - 1); +#else + int flowMeterIdxAndDiv = flowMeterNr; +#endif + log.InfoFormat("Start() : SendCommand(Cmd.Start, {0}, route, {1}, {1}, {2}, {3}, {4}, 0, Stop.None)", + flowMeterIdxAndDiv, totalRefPulses, testMethod, filterConstant, (int)pidCoef); + + controlBoard.SendCommand(Command.Start, flowMeterIdxAndDiv, controlBoard.Route, + totalRefPulses, massRefPulses, testMethod, + filterConstant, (int)pidCoef, 0, StopDevs.None); + } + + /// Start this operation + public void Start() + { + SendStartCommand(); + opState = OpState.StartingTest; + } + + /// Run this operation + /// + /// Event.FlowInDone or Event.FlowOutDone + /// + public Event Run() + { + if (opState == OpState.StartingTest) + { + StatusP statusP = controlBoard.StatusP; + log.DebugFormat("statusP = {0} {1} {2} {3}", + (((ulong)statusP >> 48) & 0xFFFF).ToString("X4"), + (((ulong)statusP >> 32) & 0xFFFF).ToString("X4"), + (((ulong)statusP >> 16) & 0xFFFF).ToString("X4"), + ((ulong)statusP & 0xFFFF).ToString("X4")); + + if ((statusP & StatusP.TestInProgress) != 0) + { + log.Info("Test started"); + opState = OpState.TestStarted; + } + else + { + //opState = OpState.ResendCommand; + } + + return Event.None; + } + else if (opState == OpState.ResendCommand) + { + SendStartCommand(); + opState = OpState.StartingTest; + return Event.None; + } + else if (opState == OpState.TestStarted) + { + /// + /// Done once, issues an appropriate ValveMove(...) command + /// + if (reqFlowLo >= reqFlowHi || reqFlowLo > nominalFlow || reqFlowHi <= 0) + { + return Event.OpArgumentError; + } + + log.InfoFormat("Run(): rv#={0} flowMtr#={1} TARGET: flowLo={2} flowHi={3}", + regulValveNr, flowMeterNr, reqFlowLo, reqFlowHi); + + float freqLo = 2000.0f * reqFlowLo / nominalFlow; + float freqHi = 2000.0f * reqFlowHi / nominalFlow; + if (regulValve.IsCoax) + { + controlBoard.ValveMove(regulValveNr, RegulValveMode.TargetFrequency, + new float[2] { (freqLo + freqHi) / 2, (freqLo + freqHi) / 2 }, + regulValveStableTime); + } + else + { + controlBoard.ValveMove(regulValveNr, RegulValveMode.TargetFrequency, + new float[2] { freqLo, freqHi }, + regulValveStableTime); + } + + opState = OpState.OpCompleted; + return Event.None; + } + else if (opState == OpState.OpCompleted) + { + return Event.MeasurementStarted; + } + + return Event.None; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/StopPreviousOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/StopPreviousOp.cs new file mode 100644 index 00000000..c8f9c679 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/StopPreviousOp.cs @@ -0,0 +1,114 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using log4net; + +namespace TBF.BenchControl.Elde +{ + public class StopPreviousOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(StopPreviousOp)); + public override string ToString() { return string.Format("StopPreviousOp(.)"); } + + /// Set by the constructor + readonly ControlBoardDev controlBoard; + + /// + /// Internal states of this operation + /// + enum OpState + { + Idle = 0, + CheckIfStopped, + ResendCommand, + Stopped, + } + OpState opState; + + /// + /// Stop the previous control board operation (diverter, gate, etc.) + /// Events: None or PreviousStopped + /// + /// Control board component reference + public StopPreviousOp(ControlBoardDev controlBoardDev) + { + if (controlBoardDev == null) throw new ArgumentNullException("controlBoardDev"); + this.controlBoard = controlBoardDev; + + log.Debug(this.ToString()); + } + + + void SendStopCommand() + { + controlBoard.SyncRoute(); + controlBoard.SendCommand(Command.Stop, + 0, /// ref. flowmeter number + controlBoard.Route, /// route + 0, 0, /// ref. pulses + TestMethods.Diverter, + 0.0f, + 20, + 0, + StopDevs.Diverter | StopDevs.GatePulse | StopDevs.Reference | StopDevs.RegValveRegulation); + } + + + /// Start this operation + public void Start() + { + SendStopCommand(); + opState = OpState.CheckIfStopped; + } + + + /// Run this operation + /// + /// Event.None or Event.PreviousStopped + /// + public Event Run() + { + if (opState == OpState.CheckIfStopped) + { + if ((controlBoard.StatusP & (StatusP.TestCompleted | StatusP.TestInProgress)) == 0) + { + opState = OpState.Stopped; + return Event.PreviousStopped; + } + else + { + opState = OpState.ResendCommand; + return Event.None; + } + } + else if (opState == OpState.ResendCommand) + { + if ((controlBoard.StatusP & (StatusP.TestCompleted | StatusP.TestInProgress)) == 0) + { + opState = OpState.Stopped; + return Event.PreviousStopped; + } + else + { + SendStopCommand(); + opState = OpState.CheckIfStopped; + return Event.None; + } + } + else if (opState == OpState.Stopped) + { + return Event.PreviousStopped; + } + + return Event.None; + } + + + /// Stop this operation + public void Stop() + { + opState = OpState.Idle; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeter/ReadTempOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeter/ReadTempOp.cs new file mode 100644 index 00000000..4fcfd3ee --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeter/ReadTempOp.cs @@ -0,0 +1,61 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using log4net; +using TBF.Boxes; + +namespace TBF.BenchControl.Elde.TempMeter +{ + public class ReadTempOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(ReadTempOp)); + public override string ToString() { return string.Format("ReadTempOp({0},.,{1})", tempMeter.Name, eventDone); } + + /// Set by the constructor + TempMeter tempMeter; + Event eventDone; + DoubleBox temp; + + /// + /// Events: TempInDone, TempOutDone, TempDivDone or Error + /// + /// TempMeter reference + /// Reference to the variable, value is in degree Celsius + /// Event to be returned by Run() when completed OK + public ReadTempOp(TempMeter tempMeter, ref DoubleBox temp, Event eventDone) + { + if (tempMeter == null) throw new ArgumentNullException("tempMeter"); + this.tempMeter = tempMeter; + this.temp = temp; + this.eventDone = eventDone; + log.Debug(this.ToString()); + } + + public ReadTempOp(TempMeter tempMeter, ref DoubleBox temp) + : this(tempMeter, ref temp, Event.TempDone) + { + } + + /// Start this operation + public void Start() + { + temp.Val = tempMeter.ReadTemperature(); + } + + /// Run this operation + /// + /// Event.TempInDone, Event.TempOutDone or Event.TempDivDone + /// + public Event Run() + { + temp.Val = tempMeter.ReadTemperature(); + return eventDone; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeter/TempMeter.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeter/TempMeter.cs new file mode 100644 index 00000000..6a1616a3 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeter/TempMeter.cs @@ -0,0 +1,87 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.BenchControl.Generic; +using TBF.Boxes; + +namespace TBF.BenchControl.Elde.TempMeter +{ + public class TempMeter : ComponentBase, GenericDevices.ITempMeter + { + private static readonly ILog log = LogManager.GetLogger(typeof(TempMeter)); + public override string ToString() { return string.Format("TempMeter({0})", Cfg.ToString(1)); } + + readonly TempMeterCfg tempMtrCfg; + + public readonly ControlBoardDev ControlBoard; + + public int Idx0 { get { return tempMtrCfg.Idx0; } } /// 0..7 + public double A1 { get { return tempMtrCfg.A1; } } + public double A2 { get { return tempMtrCfg.A2; } } + public double A3 { get { return tempMtrCfg.A3; } } + public double A4 { get { return tempMtrCfg.A4; } } + public double A5 { get { return tempMtrCfg.A5; } } + + public TempMeter() + { + } + + public TempMeter(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + tempMtrCfg = cfg as TempMeterCfg; + + ControlBoard = (ControlBoardDev)TbfComponents.FindComponent(cfg.ParentName, components); + if (ControlBoard == null) throw new Exception("Cannot find " + Name + " parent"); + + /// Prepare data for SendCalibData() control board component method + ControlBoard.TempCalibData[Idx0, 0] = (float)A1; + ControlBoard.TempCalibData[Idx0, 1] = (float)A2; + ControlBoard.TempCalibData[Idx0, 2] = (float)A3; + ControlBoard.TempCalibData[Idx0, 3] = (float)A4; + ControlBoard.TempCalibData[Idx0, 4] = (float)A5; + + log.Debug(this.ToString()); + } + + public double ReadTemperature() + { + if (Cfg.DebugLevel == Config.Entities.DebugMode.Normal) + { + return Config.Formulas.CorrectedValue((double)ControlBoard.Temperature(Idx0), Corrections); + } + else if (Cfg.DebugLevel == Config.Entities.DebugMode.Simulate) + { + return tempMtrCfg.DefaultTemperature; + } + else + { + return 0; + } + } + + /// + /// Events: TempDone, Error + /// + /// Reference to a variable for the temperature in Celsius + /// ReadTempOp instance reference casted to IOperaton + public IOperation ReadTempOp(ref DoubleBox temp) + { + return new ReadTempOp(this, ref temp); + } + + /// + /// Events: tempDone, Error + /// + /// Reference to a variable for the temperature in Celsius + /// Event returned when measurement done + /// ReadTempOp instance reference casted to IOperaton + public IOperation ReadTempOp(ref DoubleBox temp, Event tempDone) + { + return new ReadTempOp(this, ref temp, tempDone); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeter/TempMeterCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeter/TempMeterCfg.cs new file mode 100644 index 00000000..d28aba3d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeter/TempMeterCfg.cs @@ -0,0 +1,59 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.TempMeter +{ + public class TempMeterCfg : ComponentCfgBase, IChildComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TempMeterCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new TempMeterCfgCtrl(); } + + /// + /// Serialized parameters + /// + public int Idx0; /// 0..7 + public double A1; + public double A2; + public double A3; + public double A4; + public double A5; + public double DefaultTemperature; + + /// Private parameterless constructor invoked by all other (public) constructors + TempMeterCfg() + { + Name = "T"; + ParentName = "CB"; + Idx0 = 0; + A1 = 0; + A2 = 0; + A3 = 0; + A4 = 0; + A5 = 0; + DefaultTemperature = 20.0; + } + + public TempMeterCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Parent={1}, Idx0={2}, A1={3}, A2={4}, A3={5}, A4={6}, A5={7}, Default={8}", + Name, + (string.IsNullOrEmpty(ParentName) ? "-" : ParentName), + Idx0, + A1, A2, A3, A4, A5, DefaultTemperature); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeter/TempMeterCfgCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeter/TempMeterCfgCtrl.Designer.cs new file mode 100644 index 00000000..fd33ec2e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeter/TempMeterCfgCtrl.Designer.cs @@ -0,0 +1,285 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.Elde.TempMeter +{ + partial class TempMeterCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.positionTextBox = new System.Windows.Forms.TextBox(); + this.positionLabel = new System.Windows.Forms.Label(); + this.parentNameLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.a1TextBox = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.a2TextBox = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.a3TextBox = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.a5TextBox = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.a4TextBox = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.parentNameComboBox = new System.Windows.Forms.ComboBox(); + this.defaultTempTextBox = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.importButton = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // positionTextBox + // + this.positionTextBox.Enabled = false; + this.positionTextBox.Location = new System.Drawing.Point(130, 83); + this.positionTextBox.Name = "positionTextBox"; + this.positionTextBox.Size = new System.Drawing.Size(46, 20); + this.positionTextBox.TabIndex = 6; + // + // positionLabel + // + this.positionLabel.AutoSize = true; + this.positionLabel.Location = new System.Drawing.Point(20, 86); + this.positionLabel.Name = "positionLabel"; + this.positionLabel.Size = new System.Drawing.Size(44, 13); + this.positionLabel.TabIndex = 5; + this.positionLabel.Text = "Position"; + // + // parentNameLabel + // + this.parentNameLabel.AutoSize = true; + this.parentNameLabel.Location = new System.Drawing.Point(20, 61); + this.parentNameLabel.Name = "parentNameLabel"; + this.parentNameLabel.Size = new System.Drawing.Size(69, 13); + this.parentNameLabel.TabIndex = 3; + this.parentNameLabel.Text = "Parent Name"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(130, 34); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(160, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(20, 37); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(127, 10); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // a1TextBox + // + this.a1TextBox.Enabled = false; + this.a1TextBox.Location = new System.Drawing.Point(130, 107); + this.a1TextBox.Name = "a1TextBox"; + this.a1TextBox.Size = new System.Drawing.Size(160, 20); + this.a1TextBox.TabIndex = 9; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(20, 110); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(20, 13); + this.label1.TabIndex = 8; + this.label1.Text = "A1"; + // + // a2TextBox + // + this.a2TextBox.Enabled = false; + this.a2TextBox.Location = new System.Drawing.Point(130, 128); + this.a2TextBox.Name = "a2TextBox"; + this.a2TextBox.Size = new System.Drawing.Size(160, 20); + this.a2TextBox.TabIndex = 11; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(20, 131); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(20, 13); + this.label2.TabIndex = 10; + this.label2.Text = "A2"; + // + // a3TextBox + // + this.a3TextBox.Enabled = false; + this.a3TextBox.Location = new System.Drawing.Point(130, 149); + this.a3TextBox.Name = "a3TextBox"; + this.a3TextBox.Size = new System.Drawing.Size(160, 20); + this.a3TextBox.TabIndex = 13; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(20, 152); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(20, 13); + this.label3.TabIndex = 12; + this.label3.Text = "A3"; + // + // a5TextBox + // + this.a5TextBox.Enabled = false; + this.a5TextBox.Location = new System.Drawing.Point(130, 191); + this.a5TextBox.Name = "a5TextBox"; + this.a5TextBox.Size = new System.Drawing.Size(160, 20); + this.a5TextBox.TabIndex = 17; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(20, 194); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(20, 13); + this.label5.TabIndex = 16; + this.label5.Text = "A5"; + // + // a4TextBox + // + this.a4TextBox.Enabled = false; + this.a4TextBox.Location = new System.Drawing.Point(130, 170); + this.a4TextBox.Name = "a4TextBox"; + this.a4TextBox.Size = new System.Drawing.Size(160, 20); + this.a4TextBox.TabIndex = 15; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(20, 173); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(20, 13); + this.label4.TabIndex = 14; + this.label4.Text = "A4"; + // + // parentNameComboBox + // + this.parentNameComboBox.Enabled = false; + this.parentNameComboBox.FormattingEnabled = true; + this.parentNameComboBox.Location = new System.Drawing.Point(130, 58); + this.parentNameComboBox.Name = "parentNameComboBox"; + this.parentNameComboBox.Size = new System.Drawing.Size(160, 21); + this.parentNameComboBox.TabIndex = 4; + // + // defaultTempTextBox + // + this.defaultTempTextBox.Enabled = false; + this.defaultTempTextBox.Location = new System.Drawing.Point(130, 217); + this.defaultTempTextBox.Name = "defaultTempTextBox"; + this.defaultTempTextBox.Size = new System.Drawing.Size(46, 20); + this.defaultTempTextBox.TabIndex = 19; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(20, 220); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(100, 13); + this.label6.TabIndex = 18; + this.label6.Text = "Default temperature"; + // + // importButton + // + this.importButton.Enabled = false; + this.importButton.Location = new System.Drawing.Point(182, 81); + this.importButton.Name = "importButton"; + this.importButton.Size = new System.Drawing.Size(108, 23); + this.importButton.TabIndex = 7; + this.importButton.Text = "Import A1 ... A5"; + this.importButton.UseVisualStyleBackColor = true; + this.importButton.Click += new System.EventHandler(this.importButton_Click); + // + // TempMeterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.importButton); + this.Controls.Add(this.label6); + this.Controls.Add(this.defaultTempTextBox); + this.Controls.Add(this.parentNameComboBox); + this.Controls.Add(this.a5TextBox); + this.Controls.Add(this.label5); + this.Controls.Add(this.a4TextBox); + this.Controls.Add(this.label4); + this.Controls.Add(this.a3TextBox); + this.Controls.Add(this.label3); + this.Controls.Add(this.a2TextBox); + this.Controls.Add(this.label2); + this.Controls.Add(this.a1TextBox); + this.Controls.Add(this.label1); + this.Controls.Add(this.positionTextBox); + this.Controls.Add(this.positionLabel); + this.Controls.Add(this.parentNameLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "TempMeterCfgCtrl"; + this.Size = new System.Drawing.Size(350, 240); + this.Load += new System.EventHandler(this.TempMeterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox positionTextBox; + private System.Windows.Forms.Label positionLabel; + private System.Windows.Forms.Label parentNameLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.TextBox a1TextBox; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox a2TextBox; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox a3TextBox; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox a5TextBox; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.TextBox a4TextBox; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.ComboBox parentNameComboBox; + private System.Windows.Forms.TextBox defaultTempTextBox; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Button importButton; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeter/TempMeterCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeter/TempMeterCfgCtrl.cs new file mode 100644 index 00000000..7527d473 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeter/TempMeterCfgCtrl.cs @@ -0,0 +1,203 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.IO; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.TempMeter +{ + public partial class TempMeterCfgCtrl : UserControl, IComponentCfgCtrl + { + static string lastImportFileName; + + ComponentParametersDlg parent; + + public bool ShowMore { get { return false; } } + + TempMeterCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as TempMeterCfg; + Redraw(); + } + } + + public TempMeterCfgCtrl() + { + InitializeComponent(); + } + + private void TempMeterCfgCtrl_Load(object sender, EventArgs e) + { + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + + if (parent.TbfComponents != null) + { + foreach (var cmpnt in parent.TbfComponents) + { + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is Elde.ControlBoardFactory) + { + parentNameComboBox.Items.Add(cmpnt.Name); + } + } + } + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + parentNameComboBox.Text = string.IsNullOrEmpty(config.ParentName) ? "---" : config.ParentName; + positionTextBox.Text = config.Idx0.ToString(); + a1TextBox.Text = config.A1.ToString(); + a2TextBox.Text = config.A2.ToString(); + a3TextBox.Text = config.A3.ToString(); + a4TextBox.Text = config.A4.ToString(); + a5TextBox.Text = config.A5.ToString(); + defaultTempTextBox.Text = config.DefaultTemperature.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + parentNameComboBox.Enabled = true; + positionTextBox.Enabled = true; + importButton.Enabled = true; + a1TextBox.Enabled = true; + a2TextBox.Enabled = true; + a3TextBox.Enabled = true; + a4TextBox.Enabled = true; + a5TextBox.Enabled = true; + defaultTempTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!parentNameComboBox.Items.Contains(parentNameComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Parent Name'"; + } + if (!int.TryParse(positionTextBox.Text, out dummy) || dummy < 0 || dummy > 7) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Position' should be between 0 and 7"; + } + + double fdummy; + if (!Utils.TryParseEDouble(a1TextBox.Text, out fdummy)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'A1' is not valid"; + } + + if (!Utils.TryParseEDouble(a2TextBox.Text, out fdummy)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'A2' is not valid"; + } + + if (!Utils.TryParseEDouble(a3TextBox.Text, out fdummy)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'A3' is not valid"; + } + + if (!Utils.TryParseEDouble(a4TextBox.Text, out fdummy)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'A4' is not valid"; + } + + if (!Utils.TryParseEDouble(a5TextBox.Text, out fdummy)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'A5' is not valid"; + } + + if (!Utils.TryParseEDouble(defaultTempTextBox.Text, out fdummy)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Default temperature' is not valid"; + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.ParentName = parentNameComboBox.Text.Equals("---") ? string.Empty : parentNameComboBox.Text; + config.Idx0 = int.Parse(positionTextBox.Text); + bool updateOk = Utils.TryParseEDouble(a1TextBox.Text, out config.A1) && + Utils.TryParseEDouble(a2TextBox.Text, out config.A2) && + Utils.TryParseEDouble(a3TextBox.Text, out config.A3) && + Utils.TryParseEDouble(a4TextBox.Text, out config.A4) && + Utils.TryParseEDouble(a5TextBox.Text, out config.A5) && + Utils.TryParseEDouble(defaultTempTextBox.Text, out config.DefaultTemperature); + + return flags; + } + + private void importButton_Click(object sender, EventArgs e) + { + OpenFileDialog dlg = new OpenFileDialog(); + if (!string.IsNullOrEmpty(lastImportFileName)) dlg.FileName = lastImportFileName; + if (dlg.ShowDialog() == DialogResult.OK) + { + try + { + using (TextReader reader = new StreamReader(dlg.FileName)) + { + double tmp; + string lineID = string.Format("Calch{0} =", positionTextBox.Text); + + do + { + string line = reader.ReadLine(); + if (line != null && line.IndexOf(lineID) == 0) + { + string[] factors = line.Substring(lineID.Length).Split(new char[] { ',' }); + int count = factors.Length; + if (count >= 1 && Utils.TryParseEDouble(factors[0].Trim(), out tmp)) a1TextBox.Text = factors[0].Trim(); + if (count >= 2 && Utils.TryParseEDouble(factors[1].Trim(), out tmp)) a2TextBox.Text = factors[1].Trim(); + if (count >= 3 && Utils.TryParseEDouble(factors[2].Trim(), out tmp)) a3TextBox.Text = factors[2].Trim(); + if (count >= 4 && Utils.TryParseEDouble(factors[3].Trim(), out tmp)) a4TextBox.Text = factors[3].Trim(); + if (count >= 5 && Utils.TryParseEDouble(factors[4].Trim(), out tmp)) a5TextBox.Text = factors[4].Trim(); + lastImportFileName = dlg.FileName; + break; + } + } + while (lineID != null); + } + } + catch + { + MessageBox.Show("Import failed", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + } + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeter/TempMeterCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeter/TempMeterCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeter/TempMeterCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeter/TempMeterFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeter/TempMeterFactory.cs new file mode 100644 index 00000000..de91443a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeter/TempMeterFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.TempMeter +{ + public class TempMeterFactory : IComponentFactory + { + public string ClassName { get { return "TempMeter"; } } + + public void ResetStaticProperties() { TempMeter.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new TempMeter(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new TempMeter(cfg, components); } + + public IComponentCfg DefaultConfig() { return new TempMeterCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TempMeterCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeterInternal/ReadTempOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeterInternal/ReadTempOp.cs new file mode 100644 index 00000000..0bdfa5f7 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeterInternal/ReadTempOp.cs @@ -0,0 +1,61 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// +using System; +using log4net; +using TBF.Boxes; + +namespace TBF.BenchControl.Elde.TempMeterInternal +{ + public class ReadTempOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(ReadTempOp)); + public override string ToString() { return string.Format("ReadTempOp({0},.,{1})", tempMeter.Name, eventDone); } + + /// Set by the constructor + TempMeter tempMeter; + Event eventDone; + DoubleBox temp; + + /// + /// Events: TempInDone, TempOutDone, TempDivDone or Error + /// + /// TempMeter reference + /// Reference to the variable, value is in degree Celsius + /// Event to be returned by Run() when completed OK + public ReadTempOp(TempMeter tempMeter, ref DoubleBox temp, Event eventDone) + { + if (tempMeter == null) throw new ArgumentNullException("tempMeter"); + this.tempMeter = tempMeter; + this.temp = temp; + this.eventDone = eventDone; + log.Debug(this.ToString()); + } + + public ReadTempOp(TempMeter tempMeter, ref DoubleBox temp) + : this(tempMeter, ref temp, Event.TempDone) + { + } + + /// Start this operation + public void Start() + { + temp.Val = tempMeter.ReadTemperature(); + } + + /// Run this operation + /// + /// Event.TempInDone, Event.TempOutDone or Event.TempDivDone + /// + public Event Run() + { + temp.Val = tempMeter.ReadTemperature(); + return eventDone; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeterInternal/TempMeter.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeterInternal/TempMeter.cs new file mode 100644 index 00000000..e16224e2 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeterInternal/TempMeter.cs @@ -0,0 +1,71 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.BenchControl.Generic; +using TBF.Boxes; + +namespace TBF.BenchControl.Elde.TempMeterInternal +{ + public class TempMeter : ComponentBase, GenericDevices.ITempMeter + { + private static readonly ILog log = LogManager.GetLogger(typeof(TempMeter)); + public override string ToString() { return string.Format("TempMeter({0})", Cfg.ToString(1)); } + + readonly TempMeterCfg tempMtrCfg; + + public readonly ControlBoardDev ControlBoard; + + public int Idx0 { get { return tempMtrCfg.Idx0; } } /// 0..7 + + public TempMeter() + { + } + + public TempMeter(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + tempMtrCfg = cfg as TempMeterCfg; + + ControlBoard = (ControlBoardDev)TbfComponents.FindComponent(cfg.ParentName, components); + if (ControlBoard == null) throw new Exception("Cannot find " + Name + " parent"); + + /// Prepare data for SendCalibData() control board component method + ControlBoard.TempCalibData[tempMtrCfg.CoefsIdx0, 0] = tempMtrCfg.A1; + ControlBoard.TempCalibData[tempMtrCfg.CoefsIdx0, 1] = tempMtrCfg.A2; + ControlBoard.TempCalibData[tempMtrCfg.CoefsIdx0, 2] = tempMtrCfg.A3; + ControlBoard.TempCalibData[tempMtrCfg.CoefsIdx0, 3] = tempMtrCfg.A4; + ControlBoard.TempCalibData[tempMtrCfg.CoefsIdx0, 4] = tempMtrCfg.A5; + + log.Debug(this.ToString()); + } + + public double ReadTemperature() + { + return Config.Formulas.CorrectedValue((double)ControlBoard.Temperature(Idx0), Corrections); + } + + /// + /// Events: TempDone, Error + /// + /// Reference to a variable for the temperature in Celsius + /// ReadTempOp instance reference casted to IOperaton + public IOperation ReadTempOp(ref DoubleBox temp) + { + return new ReadTempOp(this, ref temp); + } + + /// + /// Events: tempDone, Error + /// + /// Reference to a variable for the temperature in Celsius + /// Event returned when measurement done + /// ReadTempOp instance reference casted to IOperaton + public IOperation ReadTempOp(ref DoubleBox temp, Event tempDone) + { + return new ReadTempOp(this, ref temp, tempDone); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeterInternal/TempMeterCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeterInternal/TempMeterCfg.cs new file mode 100644 index 00000000..dd75219e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeterInternal/TempMeterCfg.cs @@ -0,0 +1,60 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// Author: Milan Hanajik +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.TempMeterInternal +{ + public class TempMeterCfg : ComponentCfgBase, IChildComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TempMeterCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new TempMeterCfgCtrl(); } + + /// + /// Serialized parameters + /// + public int Idx0; /// 0..7 + public int CoefsIdx0; /// 0..7 + public float A1; + public float A2; + public float A3; + public float A4; + public float A5; + + /// Private parameterless constructor invoked by all other (public) constructors + TempMeterCfg() + { + Name = "T"; + ParentName = "CB"; + Idx0 = 0; + CoefsIdx0 = 2; + A1 = 0; + A2 = 0; + A3 = 0; + A4 = 0; + A5 = 0; + } + + public TempMeterCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Parent={1}, Idx0={2}, CoefsIdx0={3}, A1={4}, A2={5}, A3={6}, A4={7}, A5={8}", + Name, + (string.IsNullOrEmpty(ParentName) ? "-" : ParentName), + Idx0, CoefsIdx0, + A1, A2, A3, A4, A5); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeterInternal/TempMeterCfgCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeterInternal/TempMeterCfgCtrl.Designer.cs new file mode 100644 index 00000000..522971a6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeterInternal/TempMeterCfgCtrl.Designer.cs @@ -0,0 +1,272 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// Author: Milan Hanajik +/// +namespace TBF.BenchControl.Elde.TempMeterInternal +{ + partial class TempMeterCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.positionTextBox = new System.Windows.Forms.TextBox(); + this.positionLabel = new System.Windows.Forms.Label(); + this.parentNameLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.a1TextBox = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.a2TextBox = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.a3TextBox = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.a5TextBox = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.a4TextBox = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.parentNameComboBox = new System.Windows.Forms.ComboBox(); + this.coefsIdxTextBox = new System.Windows.Forms.TextBox(); + this.coefsIdxLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // positionTextBox + // + this.positionTextBox.Enabled = false; + this.positionTextBox.Location = new System.Drawing.Point(130, 81); + this.positionTextBox.Name = "positionTextBox"; + this.positionTextBox.Size = new System.Drawing.Size(46, 20); + this.positionTextBox.TabIndex = 6; + // + // positionLabel + // + this.positionLabel.AutoSize = true; + this.positionLabel.Location = new System.Drawing.Point(20, 84); + this.positionLabel.Name = "positionLabel"; + this.positionLabel.Size = new System.Drawing.Size(44, 13); + this.positionLabel.TabIndex = 5; + this.positionLabel.Text = "Position"; + // + // parentNameLabel + // + this.parentNameLabel.AutoSize = true; + this.parentNameLabel.Location = new System.Drawing.Point(20, 60); + this.parentNameLabel.Name = "parentNameLabel"; + this.parentNameLabel.Size = new System.Drawing.Size(69, 13); + this.parentNameLabel.TabIndex = 3; + this.parentNameLabel.Text = "Parent Name"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(130, 34); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(20, 37); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(127, 10); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // a1TextBox + // + this.a1TextBox.Enabled = false; + this.a1TextBox.Location = new System.Drawing.Point(130, 127); + this.a1TextBox.Name = "a1TextBox"; + this.a1TextBox.Size = new System.Drawing.Size(130, 20); + this.a1TextBox.TabIndex = 10; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(20, 130); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(20, 13); + this.label1.TabIndex = 9; + this.label1.Text = "A1"; + // + // a2TextBox + // + this.a2TextBox.Enabled = false; + this.a2TextBox.Location = new System.Drawing.Point(130, 148); + this.a2TextBox.Name = "a2TextBox"; + this.a2TextBox.Size = new System.Drawing.Size(130, 20); + this.a2TextBox.TabIndex = 12; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(20, 151); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(20, 13); + this.label2.TabIndex = 11; + this.label2.Text = "A2"; + // + // a3TextBox + // + this.a3TextBox.Enabled = false; + this.a3TextBox.Location = new System.Drawing.Point(130, 169); + this.a3TextBox.Name = "a3TextBox"; + this.a3TextBox.Size = new System.Drawing.Size(130, 20); + this.a3TextBox.TabIndex = 14; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(20, 172); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(20, 13); + this.label3.TabIndex = 13; + this.label3.Text = "A3"; + // + // a5TextBox + // + this.a5TextBox.Enabled = false; + this.a5TextBox.Location = new System.Drawing.Point(130, 211); + this.a5TextBox.Name = "a5TextBox"; + this.a5TextBox.Size = new System.Drawing.Size(130, 20); + this.a5TextBox.TabIndex = 18; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(20, 214); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(20, 13); + this.label5.TabIndex = 17; + this.label5.Text = "A5"; + // + // a4TextBox + // + this.a4TextBox.Enabled = false; + this.a4TextBox.Location = new System.Drawing.Point(130, 190); + this.a4TextBox.Name = "a4TextBox"; + this.a4TextBox.Size = new System.Drawing.Size(130, 20); + this.a4TextBox.TabIndex = 16; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(20, 193); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(20, 13); + this.label4.TabIndex = 15; + this.label4.Text = "A4"; + // + // parentNameComboBox + // + this.parentNameComboBox.Enabled = false; + this.parentNameComboBox.FormattingEnabled = true; + this.parentNameComboBox.Location = new System.Drawing.Point(130, 57); + this.parentNameComboBox.Name = "parentNameComboBox"; + this.parentNameComboBox.Size = new System.Drawing.Size(130, 21); + this.parentNameComboBox.TabIndex = 4; + // + // coefsIdxTextBox + // + this.coefsIdxTextBox.Enabled = false; + this.coefsIdxTextBox.Location = new System.Drawing.Point(130, 104); + this.coefsIdxTextBox.Name = "coefsIdxTextBox"; + this.coefsIdxTextBox.Size = new System.Drawing.Size(46, 20); + this.coefsIdxTextBox.TabIndex = 8; + // + // coefsIdxLabel + // + this.coefsIdxLabel.AutoSize = true; + this.coefsIdxLabel.Location = new System.Drawing.Point(20, 107); + this.coefsIdxLabel.Name = "coefsIdxLabel"; + this.coefsIdxLabel.Size = new System.Drawing.Size(78, 13); + this.coefsIdxLabel.TabIndex = 7; + this.coefsIdxLabel.Text = "Coeficients idx."; + // + // TempMeterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.coefsIdxTextBox); + this.Controls.Add(this.coefsIdxLabel); + this.Controls.Add(this.parentNameComboBox); + this.Controls.Add(this.a5TextBox); + this.Controls.Add(this.label5); + this.Controls.Add(this.a4TextBox); + this.Controls.Add(this.label4); + this.Controls.Add(this.a3TextBox); + this.Controls.Add(this.label3); + this.Controls.Add(this.a2TextBox); + this.Controls.Add(this.label2); + this.Controls.Add(this.a1TextBox); + this.Controls.Add(this.label1); + this.Controls.Add(this.positionTextBox); + this.Controls.Add(this.positionLabel); + this.Controls.Add(this.parentNameLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "TempMeterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 240); + this.Load += new System.EventHandler(this.TempMeterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox positionTextBox; + private System.Windows.Forms.Label positionLabel; + private System.Windows.Forms.Label parentNameLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.TextBox a1TextBox; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox a2TextBox; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox a3TextBox; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox a5TextBox; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.TextBox a4TextBox; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.ComboBox parentNameComboBox; + private System.Windows.Forms.TextBox coefsIdxTextBox; + private System.Windows.Forms.Label coefsIdxLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeterInternal/TempMeterCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeterInternal/TempMeterCfgCtrl.cs new file mode 100644 index 00000000..d2a146a7 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeterInternal/TempMeterCfgCtrl.cs @@ -0,0 +1,160 @@ +/// +/// Copyright (c) 2015 Sensus Slovensko a.s. +/// +using System; +using System.Globalization; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.TempMeterInternal +{ + public partial class TempMeterCfgCtrl : UserControl, IComponentCfgCtrl + { + ComponentParametersDlg parent; + + public bool ShowMore { get { return false; } } + + TempMeterCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as TempMeterCfg; + Redraw(); + } + } + + public TempMeterCfgCtrl() + { + InitializeComponent(); + } + + private void TempMeterCfgCtrl_Load(object sender, EventArgs e) + { + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + + if (parent.TbfComponents != null) + { + foreach (var cmpnt in parent.TbfComponents) + { + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is Elde.ControlBoardFactory) + { + parentNameComboBox.Items.Add(cmpnt.Name); + } + } + } + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + parentNameComboBox.Text = string.IsNullOrEmpty(config.ParentName) ? "---" : config.ParentName; + positionTextBox.Text = config.Idx0.ToString(); + coefsIdxTextBox.Text = config.CoefsIdx0.ToString(); + a1TextBox.Text = config.A1.ToString(); + a2TextBox.Text = config.A2.ToString(); + a3TextBox.Text = config.A3.ToString(); + a4TextBox.Text = config.A4.ToString(); + a5TextBox.Text = config.A5.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + parentNameComboBox.Enabled = true; + positionTextBox.Enabled = true; + coefsIdxTextBox.Enabled = true; + a1TextBox.Enabled = true; + a2TextBox.Enabled = true; + a3TextBox.Enabled = true; + a4TextBox.Enabled = true; + a5TextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!parentNameComboBox.Items.Contains(parentNameComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Parent Name'"; + } + if (!int.TryParse(positionTextBox.Text, out dummy) || dummy < 0 || dummy > 7) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Position' should be between 0 and 7"; + } + if (!int.TryParse(coefsIdxTextBox.Text, out dummy) || dummy < 0 || dummy > 7) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Coeficients idx.' should be between 0 and 7"; + } + + float fdummy; + if (!Utils.TryParseEFloat(a1TextBox.Text, out fdummy)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'A1' is not valid"; + } + + if (!Utils.TryParseEFloat(a2TextBox.Text, out fdummy)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'A2' is not valid"; + } + + if (!Utils.TryParseEFloat(a3TextBox.Text, out fdummy)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'A3' is not valid"; + } + + if (!Utils.TryParseEFloat(a4TextBox.Text, out fdummy)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'A4' is not valid"; + } + + if (!Utils.TryParseEFloat(a5TextBox.Text, out fdummy)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'A5' is not valid"; + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.ParentName = parentNameComboBox.Text.Equals("---") ? string.Empty : parentNameComboBox.Text; + config.Idx0 = int.Parse(positionTextBox.Text); + config.CoefsIdx0 = int.Parse(coefsIdxTextBox.Text); + bool updateOk = Utils.TryParseEFloat(a1TextBox.Text, out config.A1) && + Utils.TryParseEFloat(a2TextBox.Text, out config.A2) && + Utils.TryParseEFloat(a3TextBox.Text, out config.A3) && + Utils.TryParseEFloat(a4TextBox.Text, out config.A4) && + Utils.TryParseEFloat(a5TextBox.Text, out config.A5); + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeterInternal/TempMeterCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeterInternal/TempMeterCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeterInternal/TempMeterCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeterInternal/TempMeterFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeterInternal/TempMeterFactory.cs new file mode 100644 index 00000000..c6c1d4ed --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/TempMeterInternal/TempMeterFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.TempMeterInternal +{ + public class TempMeterFactory : IComponentFactory + { + public string ClassName { get { return "TempMeterInternal"; } } + + public void ResetStaticProperties() { TempMeter.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new TempMeter(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new TempMeter(cfg, components); } + + public IComponentCfg DefaultConfig() { return new TempMeterCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TempMeterCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/UpdateTankWeightOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/UpdateTankWeightOp.cs new file mode 100644 index 00000000..ad8a9746 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/UpdateTankWeightOp.cs @@ -0,0 +1,51 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using log4net; + +namespace TBF.BenchControl.Elde +{ + public class UpdateTankWeightOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(UpdateTankWeightOp)); + public override string ToString() { return string.Format("UpdateTankWeightOp(.)"); } + + /// Set by the constructor + readonly ControlBoardDev controlBoard; + + /// + /// Stop the previous control board operation (diverter, gate, etc.) + /// Events: None or PreviousStopped + /// + /// Control board component reference + public UpdateTankWeightOp(ControlBoardDev controlBoardDev) + { + if (controlBoardDev == null) throw new ArgumentNullException("controlBoardDev"); + this.controlBoard = controlBoardDev; + + log.Debug(this.ToString()); + } + + /// Start this operation + public void Start() + { + controlBoard.UpdateWeights(); + } + + /// Run this operation + /// + /// Event.None or Event.PreviousStopped + /// + public Event Run() + { + controlBoard.UpdateWeights(); + return Event.None; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Valve/Valve.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Valve/Valve.cs new file mode 100644 index 00000000..bfc698b5 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Valve/Valve.cs @@ -0,0 +1,99 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using Dirichlet.Numerics; +using log4net; +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl.Elde.Valve +{ + public class Valve : GenericDevices.ValveBase, IValve + { + private static readonly ILog log = LogManager.GetLogger(typeof(Valve)); + public override string ToString() { return string.Format("Valve({0})", Cfg.ToString(1)); } + + readonly ValveCfg valveCfg; + + readonly ControlBoardDev controlBoard; + + public ValveCategory Category { get { return valveCfg.Category; } } + public int Delay { get { return valveCfg.OpenCloseTime; } } + public bool Inverted { get { return valveCfg.Inverted; } } + + public IValve CoupledTo { get { return coupledTo; } } + readonly IValve coupledTo; + + public bool InvertCouple { get { return valveCfg.InvertCouple; } } + public int LagOpening { get { return valveCfg.LagOpening; } } + public int LagClosing { get { return valveCfg.LagClosing; } } + + public readonly UInt128 Mask; /// derived from bitPosition in the constructor + + public int BitPosition { get { return valveCfg.BitPosition; } } + + + public Valve() + { + } + + public Valve(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + valveCfg = cfg as ValveCfg; + + controlBoard = (ControlBoardDev)TbfComponents.FindComponent(cfg.ParentName, components); + if (controlBoard == null) throw new Exception("Cannot find " + Name + " parent"); + + if (valveCfg.BitPosition < 0 || valveCfg.BitPosition >= 128) + { + throw new ArgumentOutOfRangeException("position"); + } + this.Mask = (((UInt128)1) << valveCfg.BitPosition); + + if (valveCfg.CoupledToName != null) + { + coupledTo = (IValve)TbfComponents.FindComponent(valveCfg.CoupledToName, components); + } + + log.Debug(this.ToString()); + } + + public bool State + { + get { return (controlBoard.Route & Mask) != 0; } + } + + + #region Configuration Change Handling + + public static void OnCfgChange(object sender, CfgChangeArgs args) + { + if (CfgChangeHandler == null) return; + try { CfgChangeHandler(sender, args); } + catch (Exception e) { log.Error("CfgChangeHandler(...) failed", e); } + } + + public static event EventHandler CfgChangeHandler; + + public override void StartChangeHandler() + { + CfgChangeHandler += delegate(object sender, CfgChangeArgs args) + { + ValveCfg tmpcfg = args.Cfg as ValveCfg; + if (tmpcfg != null && tmpcfg.Name.Equals(Name)) + { + if (args.Command == CfgChangeCmd.CfgChange) + { + valveCfg.OpenCloseTime = tmpcfg.OpenCloseTime; + valveCfg.LagOpening = tmpcfg.LagOpening; + valveCfg.LagClosing = tmpcfg.LagClosing; + } + } + }; + } + + #endregion Configuration Change Handling + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Valve/ValveCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Valve/ValveCfg.cs new file mode 100644 index 00000000..3b8f3b80 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Valve/ValveCfg.cs @@ -0,0 +1,68 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.IO; +using System.Collections.Generic; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.Valve +{ + public class ValveCfg : ComponentCfgBase, IChildComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ValveCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new ValveCfgCtrl(); } + + /// + /// Serialized parameters + /// + public int BitPosition; /// Bit-position + public ValveCategory Category; /// None, Feeding, Bench or Output + public int OpenCloseTime; /// Delay for SetValvesOp operations + public bool Inverted; /// The valve is inverted: 0=open, 1=closed + /// + public string CoupledToName; /// Name of the coupled valve or null + public bool InvertCouple; /// The coupled valve has inverted position + public int LagOpening; /// Delay (referred to the master valve) when opening this valve in [s] + public int LagClosing; /// Delay (referred to the master valve) when closing this valve in [s] + /// Negative values of delays mean an earlier function of the coupled valve. + + /// Private parameterless constructor invoked by all other (public) constructors + ValveCfg() + { + Name = "V"; + ParentName = "CB"; + BitPosition = 0; + Category = ValveCategory.None; + OpenCloseTime = 1; + Inverted = false; + CoupledToName = string.Empty; + InvertCouple = false; + LagOpening = 0; + LagClosing = 0; + } + + public ValveCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0} ({1}), Bit={2}, Cat.={5}, Inv.={3}, Delay={4}s, CoupledTo={6}, Inv.Couple={7}, LagOpen={8}s, LagClose={9}s", + Name, + string.IsNullOrEmpty(ParentName) ? "-" : ParentName, + BitPosition, + Inverted ? "yes" : "no", + OpenCloseTime, + Category, + string.IsNullOrEmpty(CoupledToName) ? "-" : CoupledToName, + InvertCouple ? "yes" : "no", + LagOpening, + LagClosing); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Valve/ValveCfgCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Valve/ValveCfgCtrl.Designer.cs new file mode 100644 index 00000000..ad480f05 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Valve/ValveCfgCtrl.Designer.cs @@ -0,0 +1,293 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.Elde.Valve +{ + partial class ValveCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.bitPositionTextBox = new System.Windows.Forms.TextBox(); + this.bitPositionLabel = new System.Windows.Forms.Label(); + this.parentNameLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.coupledToLabel = new System.Windows.Forms.Label(); + this.invertCoupleCheckBox = new System.Windows.Forms.CheckBox(); + this.parentNameComboBox = new System.Windows.Forms.ComboBox(); + this.lagOpeningLabel = new System.Windows.Forms.Label(); + this.lagClosingLabel = new System.Windows.Forms.Label(); + this.lagOpeningTextBox = new System.Windows.Forms.TextBox(); + this.lagClosingTextBox = new System.Windows.Forms.TextBox(); + this.coupledToComboBox = new System.Windows.Forms.ComboBox(); + this.categoryLabel = new System.Windows.Forms.Label(); + this.categoryComboBox = new System.Windows.Forms.ComboBox(); + this.openCloseTimeTextBox = new System.Windows.Forms.TextBox(); + this.openCloseTimeLabel = new System.Windows.Forms.Label(); + this.invertedCheckBox = new System.Windows.Forms.CheckBox(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // bitPositionTextBox + // + this.bitPositionTextBox.Enabled = false; + this.bitPositionTextBox.Location = new System.Drawing.Point(158, 99); + this.bitPositionTextBox.Name = "bitPositionTextBox"; + this.bitPositionTextBox.Size = new System.Drawing.Size(81, 20); + this.bitPositionTextBox.TabIndex = 8; + // + // bitPositionLabel + // + this.bitPositionLabel.AutoSize = true; + this.bitPositionLabel.Location = new System.Drawing.Point(42, 102); + this.bitPositionLabel.Name = "bitPositionLabel"; + this.bitPositionLabel.Size = new System.Drawing.Size(58, 13); + this.bitPositionLabel.TabIndex = 7; + this.bitPositionLabel.Text = "Bit position"; + // + // parentNameLabel + // + this.parentNameLabel.AutoSize = true; + this.parentNameLabel.Location = new System.Drawing.Point(42, 54); + this.parentNameLabel.Name = "parentNameLabel"; + this.parentNameLabel.Size = new System.Drawing.Size(67, 13); + this.parentNameLabel.TabIndex = 3; + this.parentNameLabel.Text = "Parent name"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(158, 28); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(132, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(42, 31); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(156, 8); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // coupledToLabel + // + this.coupledToLabel.AutoSize = true; + this.coupledToLabel.Location = new System.Drawing.Point(42, 125); + this.coupledToLabel.Name = "coupledToLabel"; + this.coupledToLabel.Size = new System.Drawing.Size(52, 13); + this.coupledToLabel.TabIndex = 10; + this.coupledToLabel.Text = "Copled to"; + // + // invertCoupleCheckBox + // + this.invertCoupleCheckBox.AutoSize = true; + this.invertCoupleCheckBox.Enabled = false; + this.invertCoupleCheckBox.Location = new System.Drawing.Point(248, 124); + this.invertCoupleCheckBox.Name = "invertCoupleCheckBox"; + this.invertCoupleCheckBox.Size = new System.Drawing.Size(53, 17); + this.invertCoupleCheckBox.TabIndex = 12; + this.invertCoupleCheckBox.Text = "Invert"; + this.invertCoupleCheckBox.UseVisualStyleBackColor = true; + // + // parentNameComboBox + // + this.parentNameComboBox.Enabled = false; + this.parentNameComboBox.FormattingEnabled = true; + this.parentNameComboBox.Location = new System.Drawing.Point(158, 51); + this.parentNameComboBox.Name = "parentNameComboBox"; + this.parentNameComboBox.Size = new System.Drawing.Size(132, 21); + this.parentNameComboBox.TabIndex = 4; + // + // lagOpeningLabel + // + this.lagOpeningLabel.AutoSize = true; + this.lagOpeningLabel.Location = new System.Drawing.Point(16, 47); + this.lagOpeningLabel.Name = "lagOpeningLabel"; + this.lagOpeningLabel.Size = new System.Drawing.Size(162, 13); + this.lagOpeningLabel.TabIndex = 15; + this.lagOpeningLabel.Text = "Lag when opening coupled v. [s]"; + // + // lagClosingLabel + // + this.lagClosingLabel.AutoSize = true; + this.lagClosingLabel.Location = new System.Drawing.Point(16, 70); + this.lagClosingLabel.Name = "lagClosingLabel"; + this.lagClosingLabel.Size = new System.Drawing.Size(157, 13); + this.lagClosingLabel.TabIndex = 17; + this.lagClosingLabel.Text = "Lag when closing coupled v. [s]"; + // + // lagOpeningTextBox + // + this.lagOpeningTextBox.Enabled = false; + this.lagOpeningTextBox.Location = new System.Drawing.Point(184, 44); + this.lagOpeningTextBox.Name = "lagOpeningTextBox"; + this.lagOpeningTextBox.Size = new System.Drawing.Size(81, 20); + this.lagOpeningTextBox.TabIndex = 16; + // + // lagClosingTextBox + // + this.lagClosingTextBox.Enabled = false; + this.lagClosingTextBox.Location = new System.Drawing.Point(184, 67); + this.lagClosingTextBox.Name = "lagClosingTextBox"; + this.lagClosingTextBox.Size = new System.Drawing.Size(81, 20); + this.lagClosingTextBox.TabIndex = 18; + // + // coupledToComboBox + // + this.coupledToComboBox.Enabled = false; + this.coupledToComboBox.FormattingEnabled = true; + this.coupledToComboBox.Location = new System.Drawing.Point(158, 122); + this.coupledToComboBox.Name = "coupledToComboBox"; + this.coupledToComboBox.Size = new System.Drawing.Size(81, 21); + this.coupledToComboBox.TabIndex = 11; + // + // categoryLabel + // + this.categoryLabel.AutoSize = true; + this.categoryLabel.Location = new System.Drawing.Point(42, 78); + this.categoryLabel.Name = "categoryLabel"; + this.categoryLabel.Size = new System.Drawing.Size(49, 13); + this.categoryLabel.TabIndex = 5; + this.categoryLabel.Text = "Category"; + // + // categoryComboBox + // + this.categoryComboBox.Enabled = false; + this.categoryComboBox.FormattingEnabled = true; + this.categoryComboBox.Location = new System.Drawing.Point(158, 75); + this.categoryComboBox.Name = "categoryComboBox"; + this.categoryComboBox.Size = new System.Drawing.Size(132, 21); + this.categoryComboBox.TabIndex = 6; + // + // openCloseTimeTextBox + // + this.openCloseTimeTextBox.Enabled = false; + this.openCloseTimeTextBox.Location = new System.Drawing.Point(184, 21); + this.openCloseTimeTextBox.Name = "openCloseTimeTextBox"; + this.openCloseTimeTextBox.Size = new System.Drawing.Size(81, 20); + this.openCloseTimeTextBox.TabIndex = 14; + // + // openCloseTimeLabel + // + this.openCloseTimeLabel.AutoSize = true; + this.openCloseTimeLabel.Location = new System.Drawing.Point(16, 24); + this.openCloseTimeLabel.Name = "openCloseTimeLabel"; + this.openCloseTimeLabel.Size = new System.Drawing.Size(99, 13); + this.openCloseTimeLabel.TabIndex = 13; + this.openCloseTimeLabel.Text = "Open/close time [s]"; + // + // invertedCheckBox + // + this.invertedCheckBox.AutoSize = true; + this.invertedCheckBox.Enabled = false; + this.invertedCheckBox.Location = new System.Drawing.Point(248, 101); + this.invertedCheckBox.Name = "invertedCheckBox"; + this.invertedCheckBox.Size = new System.Drawing.Size(65, 17); + this.invertedCheckBox.TabIndex = 9; + this.invertedCheckBox.Text = "Inverted"; + this.invertedCheckBox.UseVisualStyleBackColor = true; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.openCloseTimeLabel); + this.groupBox1.Controls.Add(this.lagOpeningLabel); + this.groupBox1.Controls.Add(this.openCloseTimeTextBox); + this.groupBox1.Controls.Add(this.lagClosingLabel); + this.groupBox1.Controls.Add(this.lagOpeningTextBox); + this.groupBox1.Controls.Add(this.lagClosingTextBox); + this.groupBox1.Location = new System.Drawing.Point(25, 161); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(301, 97); + this.groupBox1.TabIndex = 19; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Parameters applied immediately (no restart required)"; + // + // ValveCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.invertedCheckBox); + this.Controls.Add(this.categoryComboBox); + this.Controls.Add(this.categoryLabel); + this.Controls.Add(this.coupledToComboBox); + this.Controls.Add(this.parentNameComboBox); + this.Controls.Add(this.invertCoupleCheckBox); + this.Controls.Add(this.coupledToLabel); + this.Controls.Add(this.bitPositionTextBox); + this.Controls.Add(this.bitPositionLabel); + this.Controls.Add(this.parentNameLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "ValveCfgCtrl"; + this.Size = new System.Drawing.Size(388, 291); + this.Load += new System.EventHandler(this.ValveCfgCtrl_Load); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox bitPositionTextBox; + private System.Windows.Forms.Label bitPositionLabel; + private System.Windows.Forms.Label parentNameLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.Label coupledToLabel; + private System.Windows.Forms.CheckBox invertCoupleCheckBox; + private System.Windows.Forms.ComboBox parentNameComboBox; + private System.Windows.Forms.Label lagOpeningLabel; + private System.Windows.Forms.Label lagClosingLabel; + private System.Windows.Forms.TextBox lagOpeningTextBox; + private System.Windows.Forms.TextBox lagClosingTextBox; + private System.Windows.Forms.ComboBox coupledToComboBox; + private System.Windows.Forms.Label categoryLabel; + private System.Windows.Forms.ComboBox categoryComboBox; + private System.Windows.Forms.TextBox openCloseTimeTextBox; + private System.Windows.Forms.Label openCloseTimeLabel; + private System.Windows.Forms.CheckBox invertedCheckBox; + private System.Windows.Forms.GroupBox groupBox1; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Valve/ValveCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Valve/ValveCfgCtrl.cs new file mode 100644 index 00000000..6106bcbf --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Valve/ValveCfgCtrl.cs @@ -0,0 +1,203 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.Valve +{ + public partial class ValveCfgCtrl : UserControl, IComponentCfgCtrl + { + ComponentParametersDlg parent; + + public bool ShowMore { get { return false; } } + + ValveCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as ValveCfg; + Redraw(); + } + } + + public ValveCfgCtrl() + { + InitializeComponent(); + } + + private void ValveCfgCtrl_Load(object sender, EventArgs e) + { + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + + categoryComboBox.Items.Add(ValveCategory.All.ToString()); + categoryComboBox.Items.Add(ValveCategory.Feeding.ToString()); + categoryComboBox.Items.Add(ValveCategory.Bench.ToString()); + categoryComboBox.Items.Add(ValveCategory.Output.ToString()); + categoryComboBox.Items.Add(ValveCategory.None.ToString()); + + if (parent.TbfComponents != null) + { + parentNameComboBox.Items.Add("---"); + coupledToComboBox.Items.Add("---"); + foreach (var cmpnt in parent.TbfComponents) + { + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is Elde.ControlBoardFactory) + { + parentNameComboBox.Items.Add(cmpnt.Name); + } + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is Elde.Valve.ValveFactory) + { + coupledToComboBox.Items.Add(cmpnt.Name); + } + } + } + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + parentNameComboBox.Text = string.IsNullOrEmpty(config.ParentName) ? "---" : config.ParentName; + bitPositionTextBox.Text = config.BitPosition.ToString(); + invertedCheckBox.Checked = config.Inverted; + openCloseTimeTextBox.Text = config.OpenCloseTime.ToString(); + categoryComboBox.Text = config.Category.ToString(); + coupledToComboBox.Text = string.IsNullOrEmpty(config.CoupledToName) ? "---" : config.CoupledToName; + invertCoupleCheckBox.Checked = config.InvertCouple; + lagOpeningTextBox.Text = config.LagOpening.ToString(); + lagClosingTextBox.Text = config.LagClosing.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + parentNameComboBox.Enabled = true; + bitPositionTextBox.Enabled = true; + invertedCheckBox.Enabled = true; + openCloseTimeTextBox.Enabled = true; + categoryComboBox.Enabled = true; + coupledToComboBox.Enabled = true; + invertCoupleCheckBox.Enabled = true; + lagOpeningTextBox.Enabled = true; + lagClosingTextBox.Enabled = true; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + string newParentName = parentNameComboBox.Text.Equals("---") ? string.Empty : parentNameComboBox.Text; + int newBitPosition = int.Parse(bitPositionTextBox.Text); + string newCoupledToName = coupledToComboBox.Text.Equals("---") ? string.Empty : coupledToComboBox.Text; + + int newLagOpening = int.Parse(lagOpeningTextBox.Text); + int newLagClosing = int.Parse(lagClosingTextBox.Text); + int newOpenCloseTime = int.Parse(openCloseTimeTextBox.Text); + + ValveCategory newCategory; + if (categoryComboBox.Text.Equals(ValveCategory.All.ToString())) newCategory = ValveCategory.All; + else if (categoryComboBox.Text.Equals(ValveCategory.Feeding.ToString())) newCategory = ValveCategory.Feeding; + else if (categoryComboBox.Text.Equals(ValveCategory.Bench.ToString())) newCategory = ValveCategory.Bench; + else if (categoryComboBox.Text.Equals(ValveCategory.Output.ToString())) newCategory = ValveCategory.Output; + else newCategory = ValveCategory.None; + + if (config.Name != nameTextBox.Text || + config.ParentName != newParentName || + config.BitPosition != newBitPosition || + config.Category != newCategory || + config.Inverted != invertedCheckBox.Checked || + config.CoupledToName != newCoupledToName || + config.InvertCouple != invertCoupleCheckBox.Checked) + { + config.Name = nameTextBox.Text; + config.ParentName = newParentName; + config.BitPosition = newBitPosition; + config.Category = newCategory; + config.Inverted = invertedCheckBox.Checked; + config.CoupledToName = newCoupledToName; + config.InvertCouple = invertCoupleCheckBox.Checked; + + flags |= (CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + } + + if (config.OpenCloseTime != newOpenCloseTime || + config.LagOpening != newLagOpening || + config.LagClosing != newLagClosing) + { + config.OpenCloseTime = newOpenCloseTime; + config.LagOpening = newLagOpening; + config.LagClosing = newLagClosing; + + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if ((flags & CfgUpdateFlags.InvokeCfgChange) != 0) + { + Valve.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.CfgChange, config)); + } + + return flags; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!parentNameComboBox.Items.Contains(parentNameComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Parent Name'"; + } + if (!categoryComboBox.Items.Contains(categoryComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Category'"; + } + if (!coupledToComboBox.Items.Contains(coupledToComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Coupled To'"; + } + if (!int.TryParse(bitPositionTextBox.Text, out dummy) || dummy < 0 || dummy >= 128) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Bit Position' should be between 0 and 127"; + } + if (!int.TryParse(openCloseTimeTextBox.Text, out dummy) || dummy < 0 || dummy > 300 || (dummy % StateMachine.Period) != 0) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Open/close time' should be between 0 and 300 s"; + if (dummy % StateMachine.Period != 0) + message += Environment.NewLine + string.Format("and a multiple of {0}", StateMachine.Period); + } + if (!int.TryParse(lagOpeningTextBox.Text, out dummy) || (dummy % StateMachine.Period) != 0) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + string.Format("'Delay when opening' error should be a multiple of {0}", StateMachine.Period); + } + if (!int.TryParse(lagClosingTextBox.Text, out dummy) || (dummy % StateMachine.Period) != 0) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + string.Format("'Delay when closing' error should be a multiple of {0}", StateMachine.Period); + } + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Valve/ValveCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Valve/ValveCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Valve/ValveCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Valve/ValveFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Valve/ValveFactory.cs new file mode 100644 index 00000000..cd1b5a07 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/Valve/ValveFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.Valve +{ + public class ValveFactory : IComponentFactory + { + public string ClassName { get { return "Valve"; } } + + public void ResetStaticProperties() { Valve.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Valve(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Valve(cfg, components); } + + public IComponentCfg DefaultConfig() { return new ValveCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(ValveCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ValveEx/Valve.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ValveEx/Valve.cs new file mode 100644 index 00000000..b734e977 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ValveEx/Valve.cs @@ -0,0 +1,87 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.BenchControl.GenericDevices; +using Dirichlet.Numerics; + +namespace TBF.BenchControl.Elde.ValveEx +{ + public class Valve : ComponentBase, Generic.IComponent + { + private static readonly ILog log = LogManager.GetLogger(typeof(Valve)); + public override string ToString() { return string.Format("ValveEx({0})", Cfg.ToString(1)); } + + readonly ValveCfg valveCfg; + + public readonly UInt128 Mask; /// derived from bitPosition in the constructor + /// + public readonly IValve[] InputValves; + + public Valve() + { + } + + public Valve(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + valveCfg = cfg as ValveCfg; + + //controlBoard = (ControlBoardDev)TbfComponents.FindComponent(cfg.ParentName, components); + //if (controlBoard == null) throw new Exception("Cannot find " + Name + " parent"); + + if (valveCfg.BitPosition < 0 || valveCfg.BitPosition >= 128) + { + throw new ArgumentOutOfRangeException("position"); + } + this.Mask = (((UInt128)1) << valveCfg.BitPosition); + + InputValves = new IValve[valveCfg.InputValvesCount]; + InputValves[0] = TbfComponents.FindComponent(valveCfg.Input1, components) as IValve; + InputValves[1] = TbfComponents.FindComponent(valveCfg.Input2, components) as IValve; + if (InputValves.Length > 2) + InputValves[2] = TbfComponents.FindComponent(valveCfg.Input3, components) as IValve; + if (InputValves.Length > 3) + InputValves[3] = TbfComponents.FindComponent(valveCfg.Input4, components) as IValve; + if (InputValves.Length > 4) + InputValves[4] = TbfComponents.FindComponent(valveCfg.Input5, components) as IValve; + + log.Debug(this.ToString()); + } + + public void UpdateRoute(ref UInt128 route) + { + bool output; + + if (valveCfg.LogicalOp == ValveExOperation.And) + { + output = true; + foreach (var valve in InputValves) + { + if (valve != null) output = output && valve.State; + } + } + else if (valveCfg.LogicalOp == ValveExOperation.Or) + { + output = false; + foreach (var valve in InputValves) + { + if (valve != null) output = output || valve.State; + } + } + else + return; + + if (output != valveCfg.InvertOutput) + { + route = route | Mask; /// Set the output bit to true + } + else + { + route = route & (~Mask); /// Reset the output bit to false + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ValveEx/ValveCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ValveEx/ValveCfg.cs new file mode 100644 index 00000000..a620c1df --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ValveEx/ValveCfg.cs @@ -0,0 +1,69 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// +using System.IO; +using System.Collections.Generic; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.ValveEx +{ + public class ValveCfg : ComponentCfgBase, IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ValveCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new ValveCfgCtrl(); } + + /// + /// Serialized parameters + /// + public int BitPosition; /// Bit-position + /// + public ValveExOperation LogicalOp; /// Logical operation between input valves + public bool InvertOutput; /// Invert the output of logical operation + public int InputValvesCount; + public string Input1; /// Input valve 1 + public string Input2; /// Input valve 2 + public string Input3; /// Input valve 3 + public string Input4; /// Input valve 4 + public string Input5; /// Input valve 5 + + /// Private parameterless constructor invoked by all other (public) constructors + ValveCfg() + { + Name = "VEx"; + ParentName = string.Empty; + BitPosition = 0; + LogicalOp = ValveExOperation.And; + InvertOutput = false; + InputValvesCount = 2; + Input1 = string.Empty; + Input2 = string.Empty; + Input3 = string.Empty; + Input4 = string.Empty; + Input5 = string.Empty; + } + + public ValveCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Bit={1}, LogOp.={2}, Inv.Output={3}, #inputs={4}, I1={5}, I2={6}, I3={7}, I4={8}s, I5={9}", + Name, + BitPosition, + (LogicalOp == ValveExOperation.And) ? "AND" : "OR", + InvertOutput ? "yes" : "no", + InputValvesCount, + Input1, + Input2, + Input3, + Input4, + Input5); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ValveEx/ValveCfgCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ValveEx/ValveCfgCtrl.Designer.cs new file mode 100644 index 00000000..7927958f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ValveEx/ValveCfgCtrl.Designer.cs @@ -0,0 +1,291 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.Elde.ValveEx +{ + partial class ValveCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.bitPositionTextBox = new System.Windows.Forms.TextBox(); + this.bitPositionLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.inputsCountLabel = new System.Windows.Forms.Label(); + this.inputsCountTextBox = new System.Windows.Forms.TextBox(); + this.logicalOpLabel = new System.Windows.Forms.Label(); + this.logicalOpComboBox = new System.Windows.Forms.ComboBox(); + this.invertedOutpCheckBox = new System.Windows.Forms.CheckBox(); + this.input1ComboBox = new System.Windows.Forms.ComboBox(); + this.input1Label = new System.Windows.Forms.Label(); + this.input2ComboBox = new System.Windows.Forms.ComboBox(); + this.input2Label = new System.Windows.Forms.Label(); + this.input3ComboBox = new System.Windows.Forms.ComboBox(); + this.input3Label = new System.Windows.Forms.Label(); + this.input4ComboBox = new System.Windows.Forms.ComboBox(); + this.input4Label = new System.Windows.Forms.Label(); + this.input5ComboBox = new System.Windows.Forms.ComboBox(); + this.input5Label = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // bitPositionTextBox + // + this.bitPositionTextBox.Enabled = false; + this.bitPositionTextBox.Location = new System.Drawing.Point(117, 58); + this.bitPositionTextBox.Name = "bitPositionTextBox"; + this.bitPositionTextBox.Size = new System.Drawing.Size(66, 20); + this.bitPositionTextBox.TabIndex = 4; + // + // bitPositionLabel + // + this.bitPositionLabel.AutoSize = true; + this.bitPositionLabel.Location = new System.Drawing.Point(17, 61); + this.bitPositionLabel.Name = "bitPositionLabel"; + this.bitPositionLabel.Size = new System.Drawing.Size(58, 13); + this.bitPositionLabel.TabIndex = 3; + this.bitPositionLabel.Text = "Bit position"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(117, 35); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(17, 38); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(115, 15); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // inputsCountLabel + // + this.inputsCountLabel.AutoSize = true; + this.inputsCountLabel.Location = new System.Drawing.Point(17, 108); + this.inputsCountLabel.Name = "inputsCountLabel"; + this.inputsCountLabel.Size = new System.Drawing.Size(66, 13); + this.inputsCountLabel.TabIndex = 8; + this.inputsCountLabel.Text = "Inputs count"; + // + // inputsCountTextBox + // + this.inputsCountTextBox.Enabled = false; + this.inputsCountTextBox.Location = new System.Drawing.Point(117, 105); + this.inputsCountTextBox.Name = "inputsCountTextBox"; + this.inputsCountTextBox.Size = new System.Drawing.Size(66, 20); + this.inputsCountTextBox.TabIndex = 9; + this.inputsCountTextBox.TextChanged += new System.EventHandler(this.inputsCountTextBox_TextChanged); + // + // logicalOpLabel + // + this.logicalOpLabel.AutoSize = true; + this.logicalOpLabel.Location = new System.Drawing.Point(17, 84); + this.logicalOpLabel.Name = "logicalOpLabel"; + this.logicalOpLabel.Size = new System.Drawing.Size(88, 13); + this.logicalOpLabel.TabIndex = 6; + this.logicalOpLabel.Text = "Logical operation"; + // + // logicalOpComboBox + // + this.logicalOpComboBox.Enabled = false; + this.logicalOpComboBox.FormattingEnabled = true; + this.logicalOpComboBox.Location = new System.Drawing.Point(117, 81); + this.logicalOpComboBox.Name = "logicalOpComboBox"; + this.logicalOpComboBox.Size = new System.Drawing.Size(66, 21); + this.logicalOpComboBox.TabIndex = 7; + // + // invertedOutpCheckBox + // + this.invertedOutpCheckBox.AutoSize = true; + this.invertedOutpCheckBox.Enabled = false; + this.invertedOutpCheckBox.Location = new System.Drawing.Point(196, 61); + this.invertedOutpCheckBox.Name = "invertedOutpCheckBox"; + this.invertedOutpCheckBox.Size = new System.Drawing.Size(98, 17); + this.invertedOutpCheckBox.TabIndex = 5; + this.invertedOutpCheckBox.Text = "Inverted output"; + this.invertedOutpCheckBox.UseVisualStyleBackColor = true; + // + // input1ComboBox + // + this.input1ComboBox.Enabled = false; + this.input1ComboBox.FormattingEnabled = true; + this.input1ComboBox.Location = new System.Drawing.Point(117, 127); + this.input1ComboBox.Name = "input1ComboBox"; + this.input1ComboBox.Size = new System.Drawing.Size(130, 21); + this.input1ComboBox.TabIndex = 11; + // + // input1Label + // + this.input1Label.AutoSize = true; + this.input1Label.Location = new System.Drawing.Point(18, 130); + this.input1Label.Name = "input1Label"; + this.input1Label.Size = new System.Drawing.Size(40, 13); + this.input1Label.TabIndex = 10; + this.input1Label.Text = "Input 1"; + // + // input2ComboBox + // + this.input2ComboBox.Enabled = false; + this.input2ComboBox.FormattingEnabled = true; + this.input2ComboBox.Location = new System.Drawing.Point(117, 150); + this.input2ComboBox.Name = "input2ComboBox"; + this.input2ComboBox.Size = new System.Drawing.Size(130, 21); + this.input2ComboBox.TabIndex = 13; + // + // input2Label + // + this.input2Label.AutoSize = true; + this.input2Label.Location = new System.Drawing.Point(17, 153); + this.input2Label.Name = "input2Label"; + this.input2Label.Size = new System.Drawing.Size(40, 13); + this.input2Label.TabIndex = 12; + this.input2Label.Text = "Input 2"; + // + // input3ComboBox + // + this.input3ComboBox.Enabled = false; + this.input3ComboBox.FormattingEnabled = true; + this.input3ComboBox.Location = new System.Drawing.Point(117, 173); + this.input3ComboBox.Name = "input3ComboBox"; + this.input3ComboBox.Size = new System.Drawing.Size(130, 21); + this.input3ComboBox.TabIndex = 15; + // + // input3Label + // + this.input3Label.AutoSize = true; + this.input3Label.Location = new System.Drawing.Point(18, 176); + this.input3Label.Name = "input3Label"; + this.input3Label.Size = new System.Drawing.Size(40, 13); + this.input3Label.TabIndex = 14; + this.input3Label.Text = "Input 3"; + // + // input4ComboBox + // + this.input4ComboBox.Enabled = false; + this.input4ComboBox.FormattingEnabled = true; + this.input4ComboBox.Location = new System.Drawing.Point(117, 196); + this.input4ComboBox.Name = "input4ComboBox"; + this.input4ComboBox.Size = new System.Drawing.Size(130, 21); + this.input4ComboBox.TabIndex = 17; + // + // input4Label + // + this.input4Label.AutoSize = true; + this.input4Label.Location = new System.Drawing.Point(18, 199); + this.input4Label.Name = "input4Label"; + this.input4Label.Size = new System.Drawing.Size(40, 13); + this.input4Label.TabIndex = 16; + this.input4Label.Text = "Input 4"; + // + // input5ComboBox + // + this.input5ComboBox.Enabled = false; + this.input5ComboBox.FormattingEnabled = true; + this.input5ComboBox.Location = new System.Drawing.Point(117, 219); + this.input5ComboBox.Name = "input5ComboBox"; + this.input5ComboBox.Size = new System.Drawing.Size(130, 21); + this.input5ComboBox.TabIndex = 19; + // + // input5Label + // + this.input5Label.AutoSize = true; + this.input5Label.Location = new System.Drawing.Point(18, 222); + this.input5Label.Name = "input5Label"; + this.input5Label.Size = new System.Drawing.Size(40, 13); + this.input5Label.TabIndex = 18; + this.input5Label.Text = "Input 5"; + // + // ValveCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.input5ComboBox); + this.Controls.Add(this.input5Label); + this.Controls.Add(this.input4ComboBox); + this.Controls.Add(this.input4Label); + this.Controls.Add(this.input3ComboBox); + this.Controls.Add(this.input3Label); + this.Controls.Add(this.input2ComboBox); + this.Controls.Add(this.input2Label); + this.Controls.Add(this.input1ComboBox); + this.Controls.Add(this.input1Label); + this.Controls.Add(this.invertedOutpCheckBox); + this.Controls.Add(this.logicalOpComboBox); + this.Controls.Add(this.logicalOpLabel); + this.Controls.Add(this.inputsCountTextBox); + this.Controls.Add(this.inputsCountLabel); + this.Controls.Add(this.bitPositionTextBox); + this.Controls.Add(this.bitPositionLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "ValveCfgCtrl"; + this.Size = new System.Drawing.Size(300, 250); + this.Load += new System.EventHandler(this.ValveCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox bitPositionTextBox; + private System.Windows.Forms.Label bitPositionLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.Label inputsCountLabel; + private System.Windows.Forms.TextBox inputsCountTextBox; + private System.Windows.Forms.Label logicalOpLabel; + private System.Windows.Forms.ComboBox logicalOpComboBox; + private System.Windows.Forms.CheckBox invertedOutpCheckBox; + private System.Windows.Forms.ComboBox input1ComboBox; + private System.Windows.Forms.Label input1Label; + private System.Windows.Forms.ComboBox input2ComboBox; + private System.Windows.Forms.Label input2Label; + private System.Windows.Forms.ComboBox input3ComboBox; + private System.Windows.Forms.Label input3Label; + private System.Windows.Forms.ComboBox input4ComboBox; + private System.Windows.Forms.Label input4Label; + private System.Windows.Forms.ComboBox input5ComboBox; + private System.Windows.Forms.Label input5Label; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ValveEx/ValveCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ValveEx/ValveCfgCtrl.cs new file mode 100644 index 00000000..106c9d35 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ValveEx/ValveCfgCtrl.cs @@ -0,0 +1,184 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.ValveEx +{ + public partial class ValveCfgCtrl : UserControl, IComponentCfgCtrl + { + ComponentParametersDlg parent; + + public bool ShowMore { get { return false; } } + + ValveCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as ValveCfg; + Redraw(); + } + } + + public ValveCfgCtrl() + { + InitializeComponent(); + } + + private void ValveCfgCtrl_Load(object sender, EventArgs e) + { + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + + logicalOpComboBox.Items.Add("AND"); + logicalOpComboBox.Items.Add("OR"); + + if (parent.TbfComponents != null) + { + AddValvePumpItemsToCombo(input1ComboBox, parent.TbfComponents); + AddValvePumpItemsToCombo(input2ComboBox, parent.TbfComponents); + AddValvePumpItemsToCombo(input3ComboBox, parent.TbfComponents); + AddValvePumpItemsToCombo(input4ComboBox, parent.TbfComponents); + AddValvePumpItemsToCombo(input5ComboBox, parent.TbfComponents); + } + + Redraw(); + } + + void AddValvePumpItemsToCombo(ComboBox combo, IList components) + { + foreach (var cmpntEntity in components) + { + IComponent comp = TbfComponents.CmpntFactoryFromClassName(cmpntEntity.ClassName).DummyComponent(); + if (comp is GenericDevices.IValve ) + { + combo.Items.Add(cmpntEntity.Name); + } + } + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + bitPositionTextBox.Text = config.BitPosition.ToString(); + invertedOutpCheckBox.Checked = config.InvertOutput; + logicalOpComboBox.Text = (config.LogicalOp == ValveExOperation.And) ? "AND" : ((config.LogicalOp == ValveExOperation.Or) ? "OR" : "---"); + inputsCountTextBox.Text = config.InputValvesCount.ToString(); + input1ComboBox.Text = config.Input1; + input2ComboBox.Text = config.Input2; + input3ComboBox.Text = config.Input3; + input4ComboBox.Text = config.Input4; + input5ComboBox.Text = config.Input5; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + bitPositionTextBox.Enabled = true; + invertedOutpCheckBox.Enabled = true; + logicalOpComboBox.Enabled = true; + inputsCountTextBox.Enabled = true; + input1ComboBox.Enabled = true; + input2ComboBox.Enabled = true; + input3ComboBox.Enabled = true; + input4ComboBox.Enabled = true; + input5ComboBox.Enabled = true; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.BitPosition = int.Parse(bitPositionTextBox.Text); + config.InvertOutput = invertedOutpCheckBox.Checked; + config.LogicalOp = (logicalOpComboBox.Text == "AND") ? ValveExOperation.And : ValveExOperation.Or; + config.InputValvesCount = int.Parse(inputsCountTextBox.Text); + config.Input1 = input1ComboBox.Text.Equals("---") ? string.Empty : input1ComboBox.Text; + config.Input2 = input2ComboBox.Text.Equals("---") ? string.Empty : input2ComboBox.Text; + if (config.InputValvesCount >= 3) config.Input3 = input3ComboBox.Text.Equals("---") ? string.Empty : input3ComboBox.Text; + if (config.InputValvesCount >= 4) config.Input4 = input4ComboBox.Text.Equals("---") ? string.Empty : input4ComboBox.Text; + if (config.InputValvesCount >= 5) config.Input5 = input5ComboBox.Text.Equals("---") ? string.Empty : input5ComboBox.Text; + + return flags; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!int.TryParse(bitPositionTextBox.Text, out dummy) || dummy < 0 || dummy >= 128) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Bit Position' should be between 0 and 127"; + } + if (!logicalOpComboBox.Items.Contains(logicalOpComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Category'"; + } + int nrInputs; + if (!int.TryParse(inputsCountTextBox.Text, out nrInputs) || nrInputs < 2 || nrInputs > 5) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Inputs count' out of range (2..5)"; + } + if (!input1ComboBox.Items.Contains(input1ComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Input 1'"; + } + if (!input2ComboBox.Items.Contains(input2ComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Input 2'"; + } + if (nrInputs >= 3 && !input3ComboBox.Items.Contains(input3ComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Input 3'"; + } + if (nrInputs >= 4 && !input4ComboBox.Items.Contains(input4ComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Input 4'"; + } + if (nrInputs >= 5 && !input5ComboBox.Items.Contains(input5ComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Input 5'"; + } + return flags; + } + + private void inputsCountTextBox_TextChanged(object sender, EventArgs e) + { + int count; + if (int.TryParse(inputsCountTextBox.Text, out count) && count >= 2 || count <= 5) + { + input3Label.Visible = (count >= 3); + input4Label.Visible = (count >= 4); + input5Label.Visible = (count >= 5); + input3ComboBox.Visible = (count >= 3); + input4ComboBox.Visible = (count >= 4); + input5ComboBox.Visible = (count >= 5); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ValveEx/ValveCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ValveEx/ValveCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ValveEx/ValveCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ValveEx/ValveFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ValveEx/ValveFactory.cs new file mode 100644 index 00000000..3ad803c1 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Elde/ValveEx/ValveFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Elde.ValveEx +{ + public class ValveFactory : IComponentFactory + { + public string ClassName { get { return "ValveEx"; } } + + public void ResetStaticProperties() { Valve.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Valve(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Valve(cfg, components); } + + public IComponentCfg DefaultConfig() { return new ValveCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(ValveCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Events.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Events.cs new file mode 100644 index 00000000..c7d13083 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Events.cs @@ -0,0 +1,185 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +namespace TBF.BenchControl +{ + /// + /// Lower level measurement event provided by devices and polled by operations + /// + public enum MsrmntState + { + Valid, + Overload, + Failed, + Busy, + Busy1, /// + Busy2, /// Used by Mettler-Toledo Multi to distinguish which scale was queried + Busy3, /// + } + + public enum CfgChangeCmd + { + None, + CfgChange, /// Configuation change + ValveOpen, /// Open a valve + ValveClose, /// Close a valve + RVOpenStep, /// Open a regulation valve (RV only) + RVCloseStep, /// Close a regulation valve *RV only) + DivToTank, /// Diverter to tank (Div only) + DivToSink, /// Diverter to sink (Div only) + ReadDivTransition, /// Read diverter ADC value transition + GetAdc, /// Get regul.valve or diverter ADC + GetAdc1, /// Get regul.valve or diverter ADC feedback value #1 + GetAdc2, /// Get regul.valve or diverter ADC feedback value #2 + } + + public enum ValveCategory + { + All = 0, /// Valve will be shown in all paths + Feeding, /// Valve will be shown in Feeding paths + Bench, /// Valve will be shown in Bench paths + Output, /// Valve will be shown in Output paths + None, /// Valve will not be shown in the paths + } + + public enum ValveExOperation + { + Or, + And, + } + + public enum PumpProtocol + { + Modbus, /// Modbus protocol, default serial settings are 9600Bd, 8bits, NoP, 1stop + FC, /// FC protocol with Siemens address (1..31), default serial settings are 9600Bd, 8bits, PE, 1stop + } + + public enum UIFlowControl + { + Continue, + Stop, + } + + public enum CompoundTestType + { + Regular, + DetectionRise, + DetectionFall, + } + + /// + /// StateMachine events (issued by operations, IOperation derived classes) + /// + public enum Event + { + None = 0, + Busy, /// Useful when waiting in state until at least one is busy (all are done) + Done, /// Useful when waiting in state until the first is done, the rest miht still be busy + MakeSecondPass, /// Test completed OK but 2nd pass (evaluation) is required + /// + ModelessFormIsOpen, + ModelessFormClosed, + + ValvesBusy, + ValvesSet, + + AmbientDone, + BalanceDone, + BalanceOverload, + PressureDone, + PressureInDone, + PressureOutDone, + TempDone, + TempInDone, + TempOutDone, + TempDivDone, + FlowMeasurementDone, + FlowReached, + PositionReached, + RegulValveTimeOut, /// Maximum allowed flow setting time has elapsed + ReadRegisterDone, + ReadReferenceDone, + AllPositionsReached, /// Used in SetAllRegulValvesOp + TurnPumpOnOffDone, + + /// CheckUi events + UiCmdReloadBatch, + UiCmdStartTest, + UiCmdStartQ1, + UiCmdStartQ2, + UiCmdStartQ3, + UiCmdStartCycle, + UiCmdStop, + UiCmdPurgeBegin, + UiCmdPurgeEnd, + UiCmdDrainTank1, + UiCmdDrainTank2, + UiCmdDrainTank3, + UiCmdStopDrainingTank1, + UiCmdStopDrainingTank2, + UiCmdStopDrainingTank3, + UiCmdBreak, + UiCmdResetResults, + UiCmdAcceptResults, + UiCmdShutdown, + UiCmdCameraTest, + UiCmdSensitivityTest, + UiCmdCustom, + UiCmdB1, + UiCmdB2, + UiCmdB3, + + /// Process/Test oriented + PreviousStopped, + Wait, + ProcedureLoaded, + MeasurementStarted, + ReadAllRegistersDone, + MeasurementCompleted, + CommandCompleted, + + /// At the end of cycle when saving /printing resultss + ResultsPrinted, + ResultsWritten, + ResultsNotWritten, + + /// Timer events + TimerExpired, + + /// Process camera events + CameraBusy, + GrabPassed, + GrabFailed, + RoiDetectionPassed, + RoiDetectionFailed, + RoiDetectionPreviousFailed, + + /// Generic + Error, /// Many ops.: Fatal error occurred + OpArgumentError, + ConfigurationError, + Yes, + No, + Next, /// To move to the next state when debugging + OK, + Retry, + Abort, + TimerBusy, + SetOutputsDone, + + /// Sequence conditions + ConditionNotMet, + ConditionMet, + + /// Outer loop control + OuterLoopStart, + OuterLoopEnd, + + /// Production monitoring + CheckDone, + CheckNotDone, + + /// Error evaluation + ErrorConditionsDone, + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/FeedingPath.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/FeedingPath.cs new file mode 100644 index 00000000..9bc37a9b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/FeedingPath.cs @@ -0,0 +1,78 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl +{ + public class FeedingPath + { + public int ItemNr; + public string Name; + public float Qfrom; + public float Qto; + public IValve Pump; /// pump to use with this path or null + public IList RegulValves; + public IList RegulValvesPct; + public IList ValvesOpen; /// a list of valves to open or null + public IList ValvesClose; /// a list of valves to close or null + + /// Constructor from name, the rest is empty + public FeedingPath(string name, int itemNr) + { + ItemNr = itemNr; + Name = name; + ValvesOpen = new List(); + ValvesClose = new List(); + RegulValves = new List(); + RegulValvesPct = new List(); + } + + /// Constructor from data entity + public FeedingPath(Config.Entities.FeedingPath entity, IList components) + : this(entity.Name, entity.ItemNr) + { + Qfrom = entity.Qfrom; + Qto = entity.Qto; + Pump = (IValve)TbfComponents.FindComponent(entity.Pump, components); + + /// + /// Feeding regulation valve components + /// + foreach (var cmpnt in components) + { + IRegulValve regValve = cmpnt as IRegulValve; + if (regValve != null && (regValve.Category == TBF.BenchControl.ValveCategory.Feeding || regValve.Category == TBF.BenchControl.ValveCategory.All)) + { + RegulValves.Add(regValve); + } + } + + /// + /// Feeding regulation valve precentages + /// + string[] rvPosStr = (entity.RegulValvesPct != null) ? entity.RegulValvesPct.Split(new char[] { ';' }) : new string[0]; + for (int i = 0; i < RegulValves.Count; i++) + { + string str = (i < rvPosStr.Length) ? rvPosStr[i] : "---"; + float pct; + if (!Utils.TryParseUFloat(str, out pct) || pct > 100.0f || str == "---") pct = 0; + RegulValvesPct.Add(pct); + } + + string[] vOpen = entity.ValvesOpen.Split(new char[] { ';' }); + ValvesOpen = new List(); + foreach (var vName in vOpen) ValvesOpen.Add((IValve)TbfComponents.FindComponent(vName, components)); + + string[] vClose = entity.ValvesClose.Split(new char[] { ';' }); + ValvesClose = new List(); + foreach (var vName in vClose) ValvesClose.Add((IValve)TbfComponents.FindComponent(vName, components)); + } + + public override string ToString() + { + return string.Format("{0} Pump={1}", Name, (Pump != null) ? Pump.Name : "---"); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Formulas.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Formulas.cs new file mode 100644 index 00000000..220a5aea --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Formulas.cs @@ -0,0 +1,341 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; + +namespace TBF.BenchControl +{ + public static class Formulas + { + private static readonly ILog log = LogManager.GetLogger(typeof(Formulas)); + + /// + /// Tables to calculate specific enthalpy + /// + private static readonly int[] Ii; + private static readonly int[] Ji; + private static readonly double[] ni; + + private static readonly double[] Di; + + /// + /// Constructor + /// + static Formulas() + { + /// + /// Initialize tables to calculate specific enthalpies + /// + Ii = new int[34] { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 8, 8, 21, 23, 29, 30, 31, 32 }; + Ji = new int[34] { -2, -1, 0, 1, 2, 3, 4, 5, -9, -7, -1, 0, 1, 3, -3, 0, 1, 3, 17, -4, 0, 6, -5, -2, 10, -8, -11, -6, -29, -31, -38, -39, -40, -41 }; + ni = new double[34] { + 0.14632971213167, /// 1 + -0.84548187169114, /// 2 + -0.37563603672040E1, /// 3 + 0.33855169168385E1, /// 4 + -0.95791963387872, /// 5 + 0.15772038513228, /// 6 + -0.16616417199501E-1, /// 7 + 0.81214629983568E-3, /// 8 + 0.28319080123804E-3, /// 9 + -0.60706301565874E-3, /// 10 + -0.18990068218419E-1, /// 11 + -0.32529748770505E-1, /// 12 + -0.21841717175414E-1, /// 13 + -0.52838357969930E-4, /// 14 + -0.47184321073267E-3, /// 15 + -0.30001780793026E-3, /// 16 + 0.47661393906987E-4, /// 17 + -0.44141845330846E-5, /// 18 + -0.72694996297594E-15, /// 19 + -0.31679644845054E-4, /// 20 + -0.28270797985312E-5, /// 21 + -0.85205128120103E-9, /// 22 + -0.22425281908000E-5, /// 23 + -0.65171222895601E-6, /// 24 + -0.14341729937924E-12, /// 25 + -0.40516996860117E-6, /// 26 + -0.12734301741641E-8, /// 27 + -0.17424871230634E-9, /// 28 + -0.68762131295531E-18, /// 29 + 0.14478307828521E-19, /// 30 + 0.26335781662795E-22, /// 31 + -0.11947622640071E-22, /// 32 + 0.18228094581404E-23, /// 33 + -0.93537087292458E-25, /// 34 + }; + + /// + /// Initialize a table to calculate temperature of a platinum thermometer from resistance + /// + Di = new double[] + { + 439.932854, + 472.418020, + 37.684494, + 7.472018, + 2.920828, + 0.005184, + -0.963864, + -0.188732, + 0.191203, + 0.049025, + }; + + } + + /// + /// Calculate density of distilled water from temperature + /// + /// Temperature in [°C] + /// Density in [kg/m3] + public static double DistilledWaterDensityFromTemp(double t) + { + const double a0 = 999.842594; + const double a1 = 0.06793952; + const double a2 = -0.00909529; + const double a3 = 0.0001001685; + const double a4 = -0.000001120083; + const double a5 = 6.536332e-09; + + return ((((a5 * t + a4) * t + a3) * t + a2) * t + a1) * t + a0; + } + + /// + /// Calculate density by comparing calculated data and data from a certificate + /// + /// Density from a certificate in [kg/m3] + /// Temperature from a certificate in [°C] + /// Density correction in [kg/m3] + public static double DensityCorrection(double realDensity, double atTemperature) + { + /// Calculated data + double calculatedDensity = DistilledWaterDensityFromTemp(atTemperature); + + return realDensity - calculatedDensity; + } + + /// + /// Calculate corrected (real) water density from temperature + /// + /// Temperature in [°C] + /// Density in [kg/m3] + public static double WaterDensityFromTemp(double t) + { + return DistilledWaterDensityFromTemp(t) + + DensityCorrection(Program.LocalSettings.RealDensity, Program.LocalSettings.AtTemperature); + } + + + public static float AirDensityFromAmbientVales(float tempC, float pressureBar, float humiPct) + { + double pressurePa = 100000.0 * (double)pressureBar; /// [Pa] + double tempKelvin = 273.15 + (double)tempC; + double coef1 = 1.2811805 / 10000.0 * tempKelvin * tempKelvin + - 1.950987 / 100.0 * tempKelvin + + 34.04926034 + - 6.353631 * 1000.0 / tempKelvin; + double coef3 = humiPct / 100.0 * System.Math.Exp(coef1) / pressurePa; + double airDensityKgm3 = 0.00348353 * pressurePa * (1.0 - 0.378 * coef3) / tempKelvin; /// kg/m3 + return (float)airDensityKgm3; + } + + /// + /// Convert 'pulses' to 'volume', prevent division by zero + /// + public static double VolumeFromPulses(int pulses, double pulsesPerLiter) + { + if (pulsesPerLiter <= double.Epsilon) return 0; + return Convert.ToDouble(pulses) / pulsesPerLiter; + } + + /// + /// Calculate the error in % from 'measured' and 'true' volume, prevent division by zero + /// + public static double ErrorFromVolumes(double measuredVolume, double trueVolume) + { + if (trueVolume <= float.Epsilon) + { + if (measuredVolume <= float.Epsilon) + { + log.WarnFormat("ErrorFromVolumes({0},{1}) returns {2}", measuredVolume, trueVolume, -100.0); + return -100.0; + } + + log.WarnFormat("ErrorFromVolumes({0},{1}) returns {2}", measuredVolume, trueVolume, 99.0); + return 99.0; + } + + double error = 100.0 * (measuredVolume - trueVolume) / trueVolume; + log.InfoFormat("ErrorFromVolumes({0},{1}) returns {2}", measuredVolume, trueVolume, error); + return error; + } + + /// + /// Calculates corrected value form a list of corrections by interpolation. + /// It is assumed that values in the list 'corrections' are sorted. + /// + /// Raw uncorrected value + /// Sorted (value, correction) pairs + /// Corrected value + public static double CorrectedValue(double rawValue, IList corrections) + { + if (corrections == null || corrections.Count == 0) return rawValue; + + if (rawValue < corrections[0].Measurement) + { + return rawValue + corrections[0].Correction; + } + + int count = corrections.Count; + for (int i = 1; i < count; i++) + { + if (rawValue < corrections[i].Measurement) + { + double d1 = rawValue - corrections[i-1].Measurement; + double d2 = corrections[i].Measurement - rawValue; + + double corr; + if (d1 + d2 <= float.Epsilon) + { + corr = (corrections[i - 1].Correction + corrections[i].Correction) / 2.0; + } + else + { + corr = (corrections[i - 1].Correction * d2 + corrections[i].Correction * d1) / (d1 + d2); + } + return rawValue + corr; + } + } + + return rawValue + corrections[count - 1].Correction; + } + + + /// + /// Converts a measurement error to a correction (used when preparing correction tables). + /// + /// Measured value (in arbitrary units) + /// Measurement error in % + /// Correction in the same units as the measured value + public static double CorrectionFromError(double measuredValue, double error) + { + double trueValue = measuredValue / (1 + error/100); + double correction = trueValue - measuredValue; + return correction; + } + + + /// + /// Calculates the heat coefficient for water + /// + /// Pressure [bar] + /// Inlet temperature [°C] + /// Outlet temperature [°C] + /// true = flow measured @inlet, false = flow measured @outlet + /// Heat coefficient for water [J/(m3 K)] + public static double HeatCoefficientWater(double pressure, double T_in, double T_out, bool flowMeasuredAtInlet) + { + if (T_in == T_out) return 0; + + const double R = 461.526; /// [J kg^-1 K^-1] + const double p_star_Pa = 16.53E6; /// [Pa] (=16.53 MPa) + const double T_star = 1386.0; /// [K] + + double T_in_K = Config.Units.ConvertTo(Config.Unit.K, T_in); + double T_out_K = Config.Units.ConvertTo(Config.Unit.K, T_out); + double tau_in = T_star / T_in_K; + double tau_out = T_star / T_out_K; + double pi = Config.Units.ConvertTo(Config.Unit.Pa, pressure) / p_star_Pa; + + double h_in = tau_in * GammaTau(pi, tau_in) * R * T_in_K; + double h_out = tau_out * GammaTau(pi, tau_out) * R * T_out_K; + + double ni = flowMeasuredAtInlet ? GammaPi(pi, tau_in) * R * T_in_K / p_star_Pa + : GammaPi(pi, tau_out) * R * T_out_K / p_star_Pa; + + return (h_in - h_out) / (ni * (T_in - T_out)); + } + + /// + /// gamma(pi) see also STN EN 1434-1 Annex A (A.4) + /// + /// pi = p / p* where p* = 16.53 MPa + /// tau = T* / T where T* = 1386 K + /// gamma(pi) + static double GammaPi(double pi, double tau) + { + double result = 0; + for (int i = 0; i < 34; i++) + { + result -= ni[i] * Ii[i] * Math.Pow(7.1 - pi, Ii[i] - 1) * Math.Pow(tau - 1.222, Ji[i]); + } + return result; + } + + /// + /// gamma(tau) see also STN EN 1434-1 Annex A (A.7) + /// + /// pi = p / p* where p* = 16.53 MPa + /// tau = T* / T where T* = 1386 K + /// gamma(tau) + static double GammaTau(double pi, double tau) + { + double result = 0; + for (int i = 0; i < 34; i++) + { + result += ni[i] * Math.Pow(7.1 - pi, Ii[i]) * Ji[i] * Math.Pow(tau - 1.222, Ji[i] - 1); + } + return result; + } + + /// + /// Conversion of measured resistance of a platinum thermometer to temperature according to ITS-90 + /// + /// Measured resistance in [°C] + /// Calibrated resistance in Ohm at 0.01°C + /// Calibrated ITS-90 coefficient a7 + /// Calibrated ITS-90 coefficient b7 + /// Calibrated ITS-90 coefficient c7 + /// Temperature in [°C] + public static double PlatinumResistanceTM_ITS90_R2T(double R, double R001C, double a7, double b7, double c7) + { + double w = R / R001C; /// ratio + double r1 = w - 1.0; + double dw = r1 * (a7 + r1 * (b7 + r1 * c7)); /// = a7*r1 + b7*r1^2 + c7*r1^3 + double wr = w - dw; + double x = (wr - 2.64) / 1.64; + + double sum = 0; + for (int i = Di.Length - 1; i >= 0; i--) + { + sum = sum * x + Di[i]; + } + + return sum; + } + + /// + /// Conversion of measured resistance of a platinum thermometer to temperature using Callendar-Van Dusen equations + /// + /// Measured resistance in [°C] + /// Calibrated resistance in Ohm at 0°C + /// Calibration coefficient a + /// Calibration coefficient b + /// Temperature in [°C] + public static double PlatinumResistanceTM_ITS27_R2T(double R, double R0, double A, double B) + { + if (R0 * R0 * A * A - 4 * R0 * B * (R0 - R) <= 0) return 0; /// Out of range + + return (-(R0 * A) + Math.Sqrt(R0 * R0 * A * A - 4 * R0 * B * (R0 - R))) / (2 * R0 * B); + } + + + public static double Buoyancy() + { + return 1.00103; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Generic/IChildComponentCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Generic/IChildComponentCfg.cs new file mode 100644 index 00000000..444b0fa6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Generic/IChildComponentCfg.cs @@ -0,0 +1,10 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.Generic +{ + interface IChildComponentCfg : IComponentCfg + { + + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Generic/IComponent.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Generic/IComponent.cs new file mode 100644 index 00000000..1d3fedf6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Generic/IComponent.cs @@ -0,0 +1,24 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.Generic +{ + public interface IComponent + { + string Name { get; } + + string ClassName { get; } + + string ParentName { get; } + + Config.Entities.DebugMode DebugLevel { get; } + + Config.Entities.LogLevel LogLevel { get; } + + IComponentCfg Cfg { get; } + + void StartChangeHandler(); + + void StopChangeHandler(); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Generic/IComponentCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Generic/IComponentCfg.cs new file mode 100644 index 00000000..f7e0aab9 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Generic/IComponentCfg.cs @@ -0,0 +1,104 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using Config.Entities; + +namespace TBF.BenchControl.Generic +{ + public interface IComponentCfg + { + /// + /// Unique component # (0 .. nr.of components-1) + /// + int ItemNr { get; set; } + + /// + /// Component name + /// + string Name { get; set; } + + /// + /// Reference to the component factory (it is a singleton) + /// + IComponentFactory Factory { get; set; } + + /// + /// Component class / component type name + /// + string ParentName { get; set; } + + /// + /// Debug level, 0 = debugging off + /// + Config.Entities.DebugMode DebugLevel { get; set; } + + /// + /// Log level, 0 = logging off + /// + Config.Entities.LogLevel LogLevel { get; set; } + + /// + /// Measurement correction values + /// + IList Corrections { get; set; } + + /// + /// Creates a new database entity 'Component' from the parameters + /// + Config.Entities.Component CreateDbEntity(); + + /// + /// Object instance factory-like methods + /// + IComponentCfgCtrl GetControl(); + + + /// + /// Creates a procedure parameters provider (specific for each component). + /// + /// Prodedure parameters provider or null + IParamsProvider CreateProcParamsProvider(); + + /// + /// Returns runtime procedure parameters provider - one per component updated by LoadProcedureParamsFromDB(...). + /// + /// Prodedure parameters provider or null + IParamsProvider GetRuntimeProcParamsProvider(); + + /// + /// Returns UI procedure parameters provider - one per ComponentProcedure DB entity. + /// + /// Prodedure parameters provider or null + IParamsProvider GetUIProcParamsProvider(Config.Entities.Procedure procedure); + + + /// + /// Creates a test parameters provider (specific for each component). + /// + /// Test parameters provider or null + IParamsProvider CreateTestParamsProvider(); + + /// + /// Returns runtime test parameters provider - one per component updated by LoadtestParamsFromDB(...). + /// + /// Test parameters provider or null + IParamsProvider GetRuntimeTestParamsProvider(); + + /// + /// Returns UI test parameters provider - one per ComponentTest DB entity. + /// + /// Test parameters provider or null + IParamsProvider GetUITestParamsProvider(Config.Entities.Test test); + + + /// + /// Used in run time when a procedure is loaded or a test is started + /// + void LoadProcedureParamsFromDB(Config.Entities.Procedure procedure); + void LoadTestParamsFromDB(Config.Entities.Test test); + + + string ToString(int i); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Generic/IComponentCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Generic/IComponentCfgCtrl.cs new file mode 100644 index 00000000..2d25f607 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Generic/IComponentCfgCtrl.cs @@ -0,0 +1,43 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using Config.Entities; + +namespace TBF.BenchControl.Generic +{ + public interface IComponentCfgCtrl + { + /// + /// Reference to device configuration class instance + /// + IComponentCfg Config { get; set; } + + /// + /// When true, More/Less button will be shown and processed + /// + bool ShowMore { get; } + + /// + /// Unlock controls. + /// + void Unlock(); + + /// + /// Verify current user controls for validity. + /// Called when user wants to close/save the configuration. + /// + /// See VerifyFlags + CfgUpdateFlags VerifyCfg(ref string message); + + /// + /// Save form parameters to the configuration class. + /// + CfgUpdateFlags UpdateCfg(); + + /// + /// Called when the dialog with component configuration control is closing. + /// In this function CmdResponse handelrs (if any) should be closed, etc. + /// + void Closing(); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Generic/IComponentFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Generic/IComponentFactory.cs new file mode 100644 index 00000000..0005050f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Generic/IComponentFactory.cs @@ -0,0 +1,39 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; + +namespace TBF.BenchControl.Generic +{ + public interface IComponentFactory + { + string ClassName { get; } /// Name of the class of components (for instance "Valve") + + /// + /// Returns a dummy component without configuration useful only for runtime class type identification + /// Usage: if (TbfComponents.CmpntFactoryFromClassName(className).DummyComponent() is IValve) { ... } + /// + IComponent DummyComponent(); + + /// + /// Returns a component with the given configuration + /// + /// Component comfiguration + /// List of all component + /// Component instance + IComponent GetComponent(IComponentCfg cfg, IList components); + + /// + /// Returns the default configuration + /// + IComponentCfg DefaultConfig(); + + /// + /// Converts an Entities.Component object into an instance of an appropriate class implementing IComponentCfg + /// + IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component); + + + void ResetStaticProperties(); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Generic/IDevice.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Generic/IDevice.cs new file mode 100644 index 00000000..bb68b2bc --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Generic/IDevice.cs @@ -0,0 +1,40 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +namespace TBF.BenchControl.Generic +{ + public interface IDevice : IComponent + { + void Initialize(); + + /// + /// This function is invoked regularly each 1000 ms (once per second) + /// just before Start(), Run() and Stop() functions of acrive operations. + /// + /// It runs in a thread created by class Machine (not the user interface thread). + /// The function should not block (otherwise it blocks all other devices) !!! + /// In case needed, the device must create its own thread to handle hardware + /// without any interference with the rest of the system. + /// + void RunDeviceBefore(); + + /// + /// This function is invoked regularly each 1000 ms (once per second) + /// just before Start(), Run() and Stop() functions of acrive operations. + /// + /// It runs in a thread created by class Machine (not the user interface thread). + /// The function should not block (otherwise it blocks all other devices) !!! + /// In case needed, the device must create its own thread to handle hardware + /// without any interference with the rest of the system. + /// + void RunDeviceAfter(); + + /// + /// Should be invoked once on program shut-down after state machine is stopped + /// and after all Stop() functions for all runing operations were called. + /// + void StopDevice(); + + void StopDevice2(); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Generic/IParamsProvider.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Generic/IParamsProvider.cs new file mode 100644 index 00000000..e161e64a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Generic/IParamsProvider.cs @@ -0,0 +1,56 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.Generic +{ + public interface IParamsProvider + { + string ComponentName { get; } + + /// + /// Number of parameters + /// + int ParamsCount(); + + /// + /// Parameter names + /// + /// Zero based index of the parameter + string ParamName(int ix); + + /// + /// Parameter values in string form + /// + /// Zero based index of the parameter + string ToString(int ix); + + /// + /// Initialize values of all parameters + /// + void InitializeAll(); + + /// + /// Validates the string representation of a parameter + /// + /// Zero based index of the parameter + /// String representation of the parameter + /// Warning message in case the string is wrong or null + /// true = string is OK, false = string is wrong (see 'message') + bool ValidateParam(int ix, string strValue, out string message); + + /// + /// Update the parameter from a string + /// + /// Zero based index of the parameter + /// String representation of the parameter + void UpdateParam(int ix, string strValue); + + void UpdateDbEntity(); + + /// + /// Creates an object copy + /// + /// + IParamsProvider Clone(); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Generic/IProcedureParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Generic/IProcedureParams.cs new file mode 100644 index 00000000..01c36af4 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Generic/IProcedureParams.cs @@ -0,0 +1,14 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using Config.Entities; + +namespace TBF.BenchControl.Generic +{ + public interface IProcedureParams + { + void UpdateFromDbEntity(ComponentProcedure dbEntity); + void FromDbEntity(string componentName, Procedure procedure); + ComponentProcedure ToDbEntity(string componentName, Procedure procedure); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Generic/ITestParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Generic/ITestParams.cs new file mode 100644 index 00000000..7cbb5b96 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Generic/ITestParams.cs @@ -0,0 +1,14 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using Config.Entities; + +namespace TBF.BenchControl.Generic +{ + public interface ITestParams + { + void UpdateFromDbEntity(ComponentTest dbEntity); + void FromDbEntity(string componentName, Test test); + ComponentTest ToDbEntity(string componentName, Test test); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IAmbient.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IAmbient.cs new file mode 100644 index 00000000..20f2f940 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IAmbient.cs @@ -0,0 +1,20 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using TBF.BenchControl.Generic; +using TBF.Boxes; + +namespace TBF.BenchControl.GenericDevices +{ + public interface IAmbient : IComponent + { + /// + /// Events: Event.AmbientDone, Event.Error + /// + /// FloatBox for the air temperature in [deg.C] + /// FloatBox for the air pressure in [mBar] + /// FloatBox for the air humidity in [%] + /// Operation + IOperation ReadAmbientOp(FloatBox temperature, FloatBox pressure, FloatBox humidity); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IBenchInfo.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IBenchInfo.cs new file mode 100644 index 00000000..a223e026 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IBenchInfo.cs @@ -0,0 +1,19 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// Author: Milan Hanajík +/// +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.GenericDevices +{ + /// + /// Bench information interface + /// + public interface IBenchInfo : IComponent + { + string TestBenchName { get; } + int TestBenchId { get; } + RemoteDBUse RemoteDBUse { get; } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/ICalibInfoCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/ICalibInfoCfg.cs new file mode 100644 index 00000000..bcac7cb7 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/ICalibInfoCfg.cs @@ -0,0 +1,30 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.GenericDevices +{ + public interface ICalibInfoCfg : IComponentCfg + { + /// + /// Access to parameters displayed in Metrology tab page + /// + + bool RangeEnabled(int rangeIx1); + + double GetTempLo(int rangeIx1); + double GetTempHi(int rangeIx1); + double GetPressLo(int rangeIx1); + double GetPressHi(int rangeIx1); + + string GetCalibCertificate(int rangeIx1); /// Get calibration certificate number + DateTime GetCalibDate(int rangeIx1); /// Get the date of calibration + DateTime GetCalibValidDate(int rangeIx1); /// Get calibration valid until (date) + + void SetCalibCertificate(int rangeIx1, string certificate); /// Set calibration certificate number + void SetCalibDate(int rangeIx1, DateTime date); /// Get the date of calibration + void SetCalibValidDate(int rangeIx1, DateTime date); /// Get calibration valid until (date) + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/ICamera.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/ICamera.cs new file mode 100644 index 00000000..0e79a6fd --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/ICamera.cs @@ -0,0 +1,35 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using Config.Entities; +using TBF.BenchControl; + +namespace TBF.BenchControl.GenericDevices +{ + public interface ICamera : Generic.IComponent + { + void ClearRoiParams(); + + int RegisterRoi(string roiParams); /// returns 0=NOK or handle (=index) + + int GetResult(int roiHandle, out long timeMs); /// returns result for a registered ROI and camera time in ms + + /// + /// Display live image. + /// + /// Reference to operation object instance + IOperation LiveStreamOp(bool hiRes); + + /// + /// Watermeter wheel/arrow angle measurement process. + /// + /// Reference to operation object instance + IOperation MeasurementOp(); + + /// + /// Grab images. + /// + /// Reference to operation object instance + IOperation GrabImagesOp(string[] imgFileNames, bool blackAndWhite, bool lowResolution, ImageRotation imageRotation); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/ICameraDisplay.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/ICameraDisplay.cs new file mode 100644 index 00000000..959d6d96 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/ICameraDisplay.cs @@ -0,0 +1,24 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// + +namespace TBF.BenchControl.GenericDevices +{ + public interface ICameraDisplay : Generic.IComponent + { + /// + /// Display static images. + /// + /// Reference to operation object instance + IOperation ShowStaticImageOp(string[] imageFileNames, string title); + + /// + /// Display static images. + /// + /// Reference to operation object instance + IOperation ShowLiveStreamOp(string[] imageFileNames, string title); + + + bool[] SelectedImages { get; } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IDataEntry.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IDataEntry.cs new file mode 100644 index 00000000..4444f3b8 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IDataEntry.cs @@ -0,0 +1,18 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.GenericDevices +{ + public interface IDataEntry : IComponent + { + /// + /// Updates test results with the information collected in watermeters. + /// + /// Results of a batch of water meters to be updated with information from forms + void UpdateTestResults(Results.BatchResults results); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IDataEntryForCamera.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IDataEntryForCamera.cs new file mode 100644 index 00000000..0c96f27d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IDataEntryForCamera.cs @@ -0,0 +1,25 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.GenericDevices +{ + public interface IDataEntryForCamera : IDataEntry + { + string[] StartImages { get; set; } + + string[] EndImages { get; set; } + + bool SaveImages { get; } + + /// + /// Displays form at the end of the test to enter water meter start start. + /// + /// Operation to be used in the sequence + IOperation ShowDeferredTestEvalFormOp(IRegisterReader[] regReaders, double volumeRef, double errLimLo, double errLimHi); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IDatastreamReader.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IDatastreamReader.cs new file mode 100644 index 00000000..c9034ee5 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IDatastreamReader.cs @@ -0,0 +1,16 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; + +namespace TBF.BenchControl.GenericDevices +{ + interface IDatastreamReader : IRegisterReader + { + bool NoSamples { get; } + double VolumeLtrStart { get; } + double VolumeLtrEnd { get; } + double TimestampSecStart { get; } + double TimestampSecEnd { get; } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IDiverter.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IDiverter.cs new file mode 100644 index 00000000..1eacfd49 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IDiverter.cs @@ -0,0 +1,36 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.GenericDevices +{ + public interface IDiverter : IComponent + { + /// + /// 1-based diverter number in case of Elde control board connected diverter (>= 1) + /// 0 = dummy diverter + /// + int DiverterNr { get; } + + /// + /// Diverter state: true = to tank, false = bypass tank + /// + bool State { get; } + + /// + /// Threshold for the ADC value to start the test in %, 0..100 + /// + int ThresholdGate { get; } + + /// + /// Threshold for low level when diverter transition time is measured in %, 0..100 + /// + int ThresholdLo { get; } + + /// + /// Threshold for high level when diverter transition time is measured in %, 0..100 + /// + int ThresholdHi { get; } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IErrorFlags.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IErrorFlags.cs new file mode 100644 index 00000000..0ed46bf1 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IErrorFlags.cs @@ -0,0 +1,33 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using TBF.BenchControl.Generic; +using Results.Entities; + +namespace TBF.BenchControl.GenericDevices +{ + public interface IErrorFlags : IComponent + { + Config.Entities.ErrorFlagsMode Mode { get; } + + /// + /// Ger error flags for a test + /// + /// A valid test result + /// true = diverter was used (times apply) + /// true = start/stop valve was used (times apply) + /// Diverter or valve switch time in s on test start + /// Diverter or valve switch time in s on test end + /// Error flags + int GetErrorFlags(TestRslt testRslt, bool diverter, bool startStopValve, float switchTimeStart, float switchTimeEnd); + + /// + /// Get water meter error flags (evaluated from all meter test results) + /// + /// Meter test results + /// Error flags + int GetWMtrErrorFlags(IList meterTestRslts); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IFlowMeter.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IFlowMeter.cs new file mode 100644 index 00000000..5ecde0eb --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IFlowMeter.cs @@ -0,0 +1,69 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; +using TBF.Boxes; + +namespace TBF.BenchControl.GenericDevices +{ + /// + /// Basic flow meter functions + /// + public interface IFlowMeter : IComponent + { + /// + /// Nominal flow in m3/h at the maximum (2kHz) output frequency. + /// In case of a flowmeter couple, the sum of two nominal flows (reached at 4kHz of summed pulses). + /// + float NominalFlow { get; } + + /// + /// Nominal (uncorrected) volume per flowmeter pulse in [l]. + /// + float LtrPerPulse { get; } + + /// + /// Corrected volume per flowmeter pulse in [l]. + /// + /// Water flow in [m3/h] + float LtrPerPulseCorrected(double flow, int rangeIx); + + /// + /// Reference flow meter communicated to the board: 1-based index, 0 for flow meter twins + /// + int Idx1 { get; } + + /// + /// Measurement correction table + /// + IList Corrections { get; } + + /// + /// Returns current flow value in [m3/h] + /// + /// Flow in m3/h + double ReadFlow(); + + /// + /// Returns current flow meter frequency value in [Hz] + /// + /// Frequency in Hz + double ReadFrequency(); + + /// + /// Events: FlowDone, Error + /// + /// Reference to a variable for the measured flow in xxx + /// ReadFlowOp instance reference casted to IOperaton + IOperation ReadFlowOp(ref DoubleBox flow); + + /// + /// Events: flowDone, Error + /// + /// Reference to a variable for the measured flow in xxx + /// Event returned when measurement done + /// ReadFlowOp instance reference casted to IOperaton + IOperation ReadFlowOp(ref DoubleBox flow, Event flowDone); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IHasCompleted.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IHasCompleted.cs new file mode 100644 index 00000000..bf2ec9d0 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IHasCompleted.cs @@ -0,0 +1,12 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; + +namespace TBF.BenchControl.GenericDevices +{ + interface IHasCompleted + { + bool Completed { get; } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IHasCycleBeginForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IHasCycleBeginForm.cs new file mode 100644 index 00000000..3b90d5ea --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IHasCycleBeginForm.cs @@ -0,0 +1,22 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System.Collections.Generic; + +namespace TBF.BenchControl.GenericDevices +{ + public interface IHasCycleBeginForm + { + /// + /// Purchase order selected/typed in the cycle beginning form. + /// When PurchaseOrder==null the purchase order entry was disabled. + /// + string PurchaseOrder { get; } + + /// + /// Displays form at the beginning of the cycle (usually to enter S/N). + /// + /// Operation to be used in the sequence + IOperation ShowCycleBeginFormOp(); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IHasCycleEndForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IHasCycleEndForm.cs new file mode 100644 index 00000000..82d8b480 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IHasCycleEndForm.cs @@ -0,0 +1,16 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; + +namespace TBF.BenchControl.GenericDevices +{ + public interface IHasCycleEndForm + { + /// + /// Displays form at the end of the cycle (usually to enter the end state). + /// + /// Operation to be used in the sequence + IOperation ShowCycleEndFormOp(); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IHasHeatMtrStatesForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IHasHeatMtrStatesForm.cs new file mode 100644 index 00000000..d8031132 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IHasHeatMtrStatesForm.cs @@ -0,0 +1,25 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +namespace TBF.BenchControl.GenericDevices +{ + public interface IHasHeatMtrStatesForm : IHasWMStatesForm + { + /// + /// Water meter states on start of test + /// + double EnergyStartState(int wmNr); + + /// + /// Water meter states at the end of test + /// + double EnergyEndState(int wmNr); + + /// + /// Displays form at the end of the test to enter water meter start start. + /// + /// Operation to be used in the sequence + IOperation ShowTestEndFormOp(IRegisterReader[] regReaders, double refVolume, double errLimLo, double errLimHi, + double refEnergy, double energyErrLimLo, double energyErrLimHi); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IHasTestName.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IHasTestName.cs new file mode 100644 index 00000000..ec6d15e4 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IHasTestName.cs @@ -0,0 +1,14 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; + +namespace TBF.BenchControl.GenericDevices +{ + interface IHasTestName + { + string TestName { set; } + int TestRepeats { set; } + int RepetitionNr { set; } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IHasWMStatesForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IHasWMStatesForm.cs new file mode 100644 index 00000000..56fd7d91 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IHasWMStatesForm.cs @@ -0,0 +1,30 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.GenericDevices +{ + public interface IHasWMStatesForm + { + /// + /// Water meter states on start of test + /// + double WMStartState(int wmNr); + + /// + /// Water meter states at the end of test + /// + double WMEndState(int wmNr); + + /// + /// Displays form at the beginning of the test to enter water meter start start. + /// + /// Operation to be used in the sequence + IOperation ShowTestStartFormOp(IRegisterReader[] regReaders); + + /// + /// Displays form at the end of the test to enter water meter start start. + /// + /// Operation to be used in the sequence + IOperation ShowTestEndFormOp(IRegisterReader[] regReaders, double volumeRef, double errLimLo, double errLimHi); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IModbus.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IModbus.cs new file mode 100644 index 00000000..5db17e0b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IModbus.cs @@ -0,0 +1,31 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.GenericDevices +{ + public interface IModbus : IComponent + { + /// + /// Send an arbitrary modbus message. + /// When the message length is N, however only bytes 1..N-2 have to be set. + /// The last two message bytes (CRC) may be uninitialized or zero. + /// They are calculated inside this function as required by Modbus specification. + /// + /// Message incl CRC fields, CRC bytes dont have to be set + void SendMessage(byte[] message); + + /// + /// Send a structured modbus message. + /// + /// Device address (1..255) or 0 = broadcast + /// Function (0..127) + /// Address of data to be transferred (0..65535) + /// Count of data bytes to be transferred (0..65535) + void SendMessage(byte modbusAddress, byte function, ushort dataAddress, ushort dataCount); + + Queue[] ReceivedTelegrams { get; } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/INetworkAdapter.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/INetworkAdapter.cs new file mode 100644 index 00000000..e9a24b66 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/INetworkAdapter.cs @@ -0,0 +1,11 @@ +using System.Net; + +namespace TBF.BenchControl.GenericDevices +{ + public interface INetworkAdapter : TBF.BenchControl.Generic.IComponent + { + IPAddress IPAddress { get; } + IPAddress NetMask { get; } + IPAddress BroadcastAddress { get; } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IPlotter.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IPlotter.cs new file mode 100644 index 00000000..e8fd9166 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IPlotter.cs @@ -0,0 +1,16 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; + +namespace TBF.BenchControl.GenericDevices +{ + public interface IPlotter + { + int StartGraph(int batchNr, string testName, int repetition); + + void UpdateGraph(int graphId, float x, float y); + + void StopGraph(int graphId, float ymin, float ymax); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IPressureMeter.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IPressureMeter.cs new file mode 100644 index 00000000..a914c7f9 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IPressureMeter.cs @@ -0,0 +1,36 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System.Collections.Generic; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Boxes; + +namespace TBF.BenchControl.GenericDevices +{ + /// + /// Basic pressure meter functions + /// + public interface IPressureMeter : IComponent + { + /// + /// Measurement correction table + /// + IList Corrections { get; } + + /// + /// Events: PressureDone, Error + /// + /// Reference to a variable for the measured pressure in bar + /// ReadPressureOp instance reference casted to IOperaton + IOperation ReadPressureOp(ref FloatBox pressure); + + /// + /// Events: pressureDone, Error + /// + /// Reference to a variable for the measured pressure in bar + /// Event returned when measurement done + /// ReadPressureOp instance reference casted to IOperaton + IOperation ReadPressureOp(ref FloatBox pressure, Event pressureDone); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IPump.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IPump.cs new file mode 100644 index 00000000..9e21f7ec --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IPump.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.GenericDevices +{ + public interface IPump : IComponent + { + /// + /// Pump state: true = on, false = off + /// + bool State { get; } + + /// + /// Delay of the valve in [s] (open or close time, whichever is larger) + /// + int Delay { get; } + + /// + /// Current pump power in [%] (0 .. 100.0f) + /// + /// + float Power { get; } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IPumpFM.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IPumpFM.cs new file mode 100644 index 00000000..c50015b4 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IPumpFM.cs @@ -0,0 +1,35 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.GenericDevices +{ + /// + /// A pump controlled by a frequency inverter + /// using the test parameter 'Power' (0 .. 100.0f %) + /// + public interface IPumpFM : IPump + { + /// + /// Turns the frequency inverter on using 'power' argument (0 .. 100.0f %) + /// + void TurnOn(float power); + + /// + /// Turns the frequency inverter off + /// + void TurnOff(); + + + /// + /// Turns the frequency inverter on using 'power' argument (0 .. 100.0f %) + /// + IOperation TurnOnOp(float power); + + /// + /// Turns the frequency inverter off + /// + IOperation TurnOffOp(); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IRegisterReader.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IRegisterReader.cs new file mode 100644 index 00000000..54f37ffb --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IRegisterReader.cs @@ -0,0 +1,30 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using TBF.BenchControl.Generic; +using TBF.Boxes; + +namespace TBF.BenchControl.GenericDevices +{ + public interface IRegisterReader : IComponent + { + Config.Entities.RegisterReaderType RegisterReaderType { get; } + + double PulsesPerLtr { get; } /// [imp/l] ... water meter or volume measurement part of a heat meter + double LtrsPerPulse { get; } /// [l/imp] + + int WMPulses { get; } /// Counted pulses of the water meter + int WMRefPulses { get; } /// 'Gated' reference pulses of the water meters + + double WMVolume { get; } /// Counted volume of the water meter + double BeginWMState { get; } /// Test begin state of the water meter + double EndWMState { get; } /// Test end state of the water meter + + void Clear(); /// To be used at the beginning of a test + + void TestCompleted(); /// To be used when the test is completed ... + /// ... for more accurate WMPulses, WMRefPulses calculation + + IOperation ReadRegisterOp(); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IRegulValve.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IRegulValve.cs new file mode 100644 index 00000000..69995b01 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IRegulValve.cs @@ -0,0 +1,78 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using TBF.BenchControl.Generic; +using TBF.Boxes; + +namespace TBF.BenchControl.GenericDevices +{ + public interface IRegulValve : IComponent + { + /// + /// All, Feeding, Bench, Output or None + /// + ValveCategory Category { get; } + + /// + /// true = The regulation valve is 4-20 mA current controlled coaxial valve + /// + bool IsCoax { get; } + + /// + /// Regulation valve position 0.0 .. 100.0 % + /// + float Position { get; } + + /// + /// Dictionary for position re-use + /// + IDictionary Dict { get; } + + /// + /// Operation to set the water flow within tolerances + /// Events: Event.None, Event.FlowReached, Event.FlowTimeOut + /// + /// Lower limit of the required flow [m3/h] + /// Higher limit of the required flow [m3/h] + /// PID coefficient (float) + /// Measured flow [m3/h] + /// Timeout in [s] + /// SetFlowOp instance + IOperation SetFlowOp(IFlowMeter flowMeter, float requiredFlowLo, float requiredFlowHi, + float pidCoef, DoubleBox measuredFlow, int timeout); + + /// + /// Operation to set the water flow within tolerances. Leave the measurement running. + /// Events: Event.None, Event.FlowReached, Event.FlowTimeOut + /// + /// Lower limit of the required flow [m3/h] + /// Higher limit of the required flow [m3/h] + /// PID coefficient (float) + /// Measured flow [m3/h] + /// Timeout in [s] + /// Passed to SendCommand() as argument filterContant + /// SetFlowOp instance + IOperation SetFlowAndMeasureOp(IFlowMeter flowMeter, float requiredFlowLo, float requiredFlowHi, + float pidCoef, DoubleBox measuredFlow, int timeout, float filter); + + /// + /// Operation to set the regulation valve to a required position + /// Events: Event.None + /// + /// Lower limit of the required valve position in % + /// Higher limit of the required valve position in % + /// Timeout in [s] + /// SetPositionOp instance + IOperation SetRegulValvePositionOp(float posLoPct, float posHiPct, int timeout); + + /// + /// Operation to set the regulation valve to a required position + /// Events: Event.None + /// + /// Time pulse in sec + /// SetPositionOp instance + IOperation ChangeRegulValvePositionOp(float timePulseSec); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IResultsPrinter.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IResultsPrinter.cs new file mode 100644 index 00000000..3de7a556 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IResultsPrinter.cs @@ -0,0 +1,25 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System.Collections.Generic; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.GenericDevices +{ + public interface IResultsPrinter : IComponent + { + /// + /// Prints the test cycle results, Events: Event.ResultsPrinted + /// + /// Results to print + /// Reference to the operation + IOperation PrintResultsOp(Results.Entities.Batch batch); + + /// + /// When true printing at the end of cycle is bypassed. + /// Can be used to disable printing without having to modify all procedures. + /// + bool SupressPrinting { get; } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IResultsWriter.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IResultsWriter.cs new file mode 100644 index 00000000..233b97ee --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IResultsWriter.cs @@ -0,0 +1,18 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System.Collections.Generic; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.GenericDevices +{ + public interface IResultsWriter : IComponent + { + /// + /// Writes the test cycle results into a file, Events: Event.ResultsWritten + /// + /// Reference to the operation + IOperation WriteResultsOp(Results.Entities.Batch batchResults); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IRoi.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IRoi.cs new file mode 100644 index 00000000..c38760ba --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IRoi.cs @@ -0,0 +1,28 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.GenericDevices +{ + public interface IRoi : IComponent, IRoiForFixedStart + { + bool Detected { get; } + string ImageFileNamePrefix { get; } /// Either "detected.jpg" or string.Format("img{0}.jpg", nr) is appended + + void ClearRoi(); + + void RegisterRoiToCamera(); + + double VolumeStart { get; } /// in l + double VolumeEnd { get; } /// in l + double TimestampStart { get; } /// in s + double TimestampEnd { get; } /// in s + + /// + /// Watermeter wheel/arrow detection process. + /// + /// Reference to operation object instance + IOperation RoiDetectionOp(); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IRoiForFixedStart.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IRoiForFixedStart.cs new file mode 100644 index 00000000..13f32e90 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IRoiForFixedStart.cs @@ -0,0 +1,27 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.GenericDevices +{ + public interface IRoiForFixedStart : IComponent, IRegisterReader + { + GenericDevices.ICamera Camera { get; } + + /// + /// Watermeter wheel/arrow detection process. + /// + /// Reference to operation object instance + IOperation GrabImageOp(string imageFileName); + + /// + /// Watermeter wheel/arrow detection process. + /// + /// Reference to operation object instance + IOperation GrabImageOp(string imageFileName, + bool blackAndWhite, + bool lowResolution, + Config.Entities.ImageRotation imageRotation); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IScale.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IScale.cs new file mode 100644 index 00000000..18d2f1a6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IScale.cs @@ -0,0 +1,90 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; +using TBF.Boxes; + +namespace TBF.BenchControl.GenericDevices +{ + /// + /// Basic balance functions + /// + public interface IScale : IComponent + { + /// + /// Balance number: 0-based index required for communication with the Elde component + /// + int ScaleNr { get; } + + /// + /// Balance water tank capacity in kg or ltr + /// + double Capacity { get; } + + /// + /// Water tank drain valve or 'null' + /// + IValve DrainValve { get; } + + /// + /// Returns true if tank s empty, mass is less then some threshold + /// + bool IsEmpty(double mass); + + /// + /// Returns true if tank s empty, the last measured mass is less then some threshold + /// + bool IsEmpty(); + + /// + /// Format string to be used as ToString() argument (e.g. "F3" to obtain resolution 1g) + /// + string Format { get; } + + /// + /// Time in seconds to empty the tank completely when it is full + /// + int EmptyTimeSec { get; } + + float BuoyancyTemp { get; } /// + float BuoyancyPress { get; } /// Displayed in Metrology tab page + float BuoyancyHumi { get; } /// + + /// + /// Measurement correction table + /// + IList Corrections { get; } + + /// + /// Events: BalanceDone, Error + /// + /// Reference to a variable for 'tara' in kg + /// TaringOp instance reference casted to IOperaton + IOperation TaringOp(ref DoubleBox tara); + + /// + /// Events: BalanceDone, Error + /// + /// Reference to a variable for the measured mass in kg + /// ReadMassOp instance reference casted to IOperaton + IOperation ReadMassOp(ref DoubleBox mass); + + /// + /// Events: BalanceDone, Error + /// + /// Reference to a variable for the measured mass in kg + /// Required mass readings count (>= 3) + /// Maximum spread of measurements in kg (otherwise the measurement continues) + /// Method: false = slow (precise), true = fast (immediate) + /// ReadMassAverageOp instance reference casted to IOperaton + IOperation ReadStableMassOp(ref DoubleBox mass, int readingsCount, double maxSpread, Config.Entities.MassMethod method); + + /// + /// Events: Done, Error + /// + /// Reference to the serialNumber + /// GetBalanceSerNumOp instance reference casted to IOperaton + IOperation GetSerNumOp(ref string serialNumber); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IScaleCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IScaleCfg.cs new file mode 100644 index 00000000..8288aa0e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IScaleCfg.cs @@ -0,0 +1,24 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.GenericDevices +{ + public interface IScaleCfg : IComponentCfg + { + /// + /// Parameters displayed in Metrology tab page + /// + float BuoyancyTemp { get; set; } /// ambient temperature in [degree C] + float BuoyancyPress { get; set; } /// ambient pressure in [100000 Pa] + float BuoyancyHumi { get; set; } /// ambient relative humidity in [%] + float WeightStandardDensity { get; set; } /// density of the weight standard used to calibrate the scale [kg/m3] + + string CalibCertificateNr { get; set; } /// calibration certificate number + DateTime CalibDate { get; set; } /// date of calibration + DateTime CalibValidDate { get; set; } /// calibration valid until (date) + } +} + diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/ISequenceCondition.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/ISequenceCondition.cs new file mode 100644 index 00000000..f7ccdb75 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/ISequenceCondition.cs @@ -0,0 +1,17 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.GenericDevices +{ + public interface ISequenceCondition : IComponent + { + int ConditionsCount { get; } + + /// Returned strings are added to the combo-box + string ConditionName(int i); + + IOperation ConditionOp(int i); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/ISimultTestMethod.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/ISimultTestMethod.cs new file mode 100644 index 00000000..74a20913 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/ISimultTestMethod.cs @@ -0,0 +1,22 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +using System; + +namespace TBF.BenchControl.GenericDevices +{ + public interface ISimultTestMethod : ITestMethod + { + /// + /// True = execute this test method (communication with the water meter, etc.) simultaneously + /// with the previous step or with purging + /// + bool SimultWithPrevious { get; } + + /// + /// True = execute this test method (communication with the water meter, etc.) simultaneously + /// with the next step or with emptying + /// + bool SimultWithNext { get; } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/ITankDraining.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/ITankDraining.cs new file mode 100644 index 00000000..94ba57f8 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/ITankDraining.cs @@ -0,0 +1,16 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace TBF.BenchControl.GenericDevices +{ + public interface ITankDraining : ISequenceCondition + { + IValve DrainValve { get; } + bool IsEmpty(); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/ITankDrainingCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/ITankDrainingCfg.cs new file mode 100644 index 00000000..7469a80c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/ITankDrainingCfg.cs @@ -0,0 +1,29 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// + +namespace TBF.BenchControl.GenericDevices +{ + public interface ITankDrainingCfg + { + /// + /// Max. mass of water in 'kg' or volume in 'l' + /// + float Capacity { get; } + + /// + /// 'Empty' water mass in 'kg' or volume in 'l' + /// + float Empty { get; } + + /// + /// Time in [s] to drain the tank completely + /// + int DrainTimeSec { get; } + + /// + /// Name of the drain valve + /// + string DrainValve { get; } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/ITempMeter.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/ITempMeter.cs new file mode 100644 index 00000000..87514234 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/ITempMeter.cs @@ -0,0 +1,34 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using TBF.BenchControl.Generic; +using TBF.Boxes; + +namespace TBF.BenchControl.GenericDevices +{ + /// + /// Basic temperature meter functions + /// + public interface ITempMeter : IComponent + { + /// + /// Returns current temperature in deg. Celsius + /// + /// Temperature in deg. Celsius + double ReadTemperature(); + + /// + /// Events: TempDone, Error + /// + /// Reference to a variable for the temperature in Celsius + /// ReadTempInOp instance reference casted to IOperaton + IOperation ReadTempOp(ref DoubleBox temp); + + /// + /// Events: tempDone, Error + /// + /// Reference to a variable for the temperature in Celsius + /// ReadTempInOp instance reference casted to IOperaton + IOperation ReadTempOp(ref DoubleBox temp, Event tempDone); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/ITestMethod.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/ITestMethod.cs new file mode 100644 index 00000000..e99556bf --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/ITestMethod.cs @@ -0,0 +1,34 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System.Collections.Generic; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.GenericDevices +{ + public interface ITestMethod : IComponent + { + /// + /// Check compatibility of the method with the watermeters + /// + /// Type of watermeters + /// true when the watermeters can be tested by this method + bool CanTest(MetersKind meters); + + /// + /// Return true when test method requires start/end test transition execution + /// + /// true when transitions shold be executed + bool DoTransitions(); + + /// + /// Execute the test method + /// + /// Test entity + /// Test repetition number (1 .. test.Repeats) + /// true when this is the last repetition count, or a single test is run, or ourterLoop Mode is active + /// Event(s) indicating the result of execution + IList Execute(Test test, int repetitionNr, bool isLastRepetition); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/ITestMethodWith2ndPass.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/ITestMethodWith2ndPass.cs new file mode 100644 index 00000000..43562ef6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/ITestMethodWith2ndPass.cs @@ -0,0 +1,24 @@ +using System.Collections.Generic; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.GenericDevices +{ + public interface ITestMethodWith2ndPass : ITestMethod + { + /// + /// Data stored for a second pass or deferred evaluation + /// + object IntermediateData { get; } + + + /// + /// Execute the 2nd pass of the test method + /// + /// + /// false = normal eecution, true = Run the test only once and use 'outerLoopCounter' + /// External test repeats counter + /// Event(s) indicating the result of execution + IList Execute2ndPass(Test test, int repetNr, object IntermediateData); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IValve.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IValve.cs new file mode 100644 index 00000000..6d197fac --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IValve.cs @@ -0,0 +1,50 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.GenericDevices +{ + public interface IValve : IComponent + { + /// + /// Valve state: true = open, false = closed + /// + bool State { get; } + + /// + /// All, Feeding, Bench, Output or None + /// + ValveCategory Category { get; } + + /// + /// Delay of the valve in [s] (open or close time, whichever is larger) + /// + int Delay { get; } + + /// + /// Coupled valve or null. + /// This valve is a slave and follows the coupled valve, which is a master. + /// In case of CoupledValve == null, this valve can be independently controlled. + /// + IValve CoupledTo { get; } + + /// + /// The coupled valve is inverted referred to the master valve. + /// This property is used only in case 'CoupledTo' is non-null. + /// + bool InvertCouple { get; } + + /// + /// Delay (referred to the master valve) when opening this (coupled, slave) valve in [s] + /// This property is used only in case 'CoupledTo' is non-null. + /// + int LagOpening { get; } + + /// + /// Delay (referred to the master valve) when opening this (coupled, slave) valve in [s] + /// This property is used only in case 'CoupledTo' is non-null. + /// + int LagClosing { get; } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IValveControl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IValveControl.cs new file mode 100644 index 00000000..4a15b517 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IValveControl.cs @@ -0,0 +1,28 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System.Collections.Generic; + +namespace TBF.BenchControl.GenericDevices +{ + public interface IValveControl + { + /// + /// Open one valve and/or close one valve. + /// Events: RouteDone, Error + /// + /// Valve to be opened + /// Valve to be closed + /// Newly created operation instance reference casted to IOperaton + IOperation SetValvesOp(IValve valveToOpen, IValve valveToClose); + + /// + /// Open and/or close multiple valves. + /// Events: RouteDone, Error + /// + /// A list of valves to be opened + /// A list of valves to be closed + /// Newly created operation instance reference casted to IOperaton + IOperation SetValvesOp(IList valvesToOpen, IList valvesToClose); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IWaterMeter.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IWaterMeter.cs new file mode 100644 index 00000000..df515a1f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/IWaterMeter.cs @@ -0,0 +1,49 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using TBF.BenchControl.Generic; +using Config.Entities; + +namespace TBF.BenchControl.GenericDevices +{ + public interface IWaterMeter : IComponent + { + void ClearData(); + + string ProductName { get; } + string Producer { get; } + + float DN { get; } /// pipe diameter [mm] + float L { get; } /// building length [mm] + Mounting Mounting { get; } /// mounting H / V + + bool NewQnames { get; } /// true = Q3... false = Qn... + float Q4_Qmax { get; } /// [m3/h] + float Q3_Qn { get; } /// [m3/h] + float Q2_Qt { get; } /// [m3/h] + float Q1_Qmin { get; } /// [m3/h] + + string MetrologicalClass { get; } /// R + TemperatureClass TemperatureClass { get; } /// T30, T50, T70, ... + PressureLossClass PressureLossClass { get; } /// dp63, dp40, dp25, dp16, dp10 + MaxAdmissiblePressure MaxAdmissiblePressure { get; } /// MAP10, MAP16, MAP25, MAP40 + FlowProfileSensitivityClass FlowProfileSensitivityClass { get; } /// U0/D0 + + string ApprovalInfo { get; } + string Certificate { get; } + + double PulsesPerLtr { get; } + + Medium Medium { get; } + + string Text1 { get; } + string Text2 { get; } + string Text3 { get; } + string Text4 { get; } + string Text5 { get; } + + string SerialNr { get; set; } + string EndState { get; set; } + bool Disabled { get; set; } /// Set to true to hide this watermeter results + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/ValveBase.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/ValveBase.cs new file mode 100644 index 00000000..f897dd04 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/GenericDevices/ValveBase.cs @@ -0,0 +1,102 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; + +namespace TBF.BenchControl.GenericDevices +{ + public class ValveBase : ComponentBase + { + public ValveBase() + { + } + + /// + /// Invokes ComponentBase constructor + /// + public ValveBase(Generic.IComponentCfg cfg) : base(cfg) + { + } + + /// + /// Process the list of components and return all valves (masters and coupled) + /// + public static IList AllValves(IList cmpnts) + { + IList result = new List(); + foreach (var cmpnt in cmpnts) if (cmpnt is IValve) result.Add(cmpnt as IValve); + return result; + } + + /// + /// Process the list of components and return masters valves + /// + public static IList MasterValves(IList cmpnts) + { + IList result = new List(); + foreach (var cmpnt in cmpnts) + { + IValve valve = cmpnt as IValve; + if (valve != null && valve.CoupledTo == null) result.Add(valve); + } + return result; + } + + /// + /// Process the list of components and return coupled valves + /// + public static IList CoupledValves(IList cmpnts) + { + IList result = new List(); + foreach (var cmpnt in cmpnts) + { + IValve valve = cmpnt as IValve; + if (valve != null && valve.CoupledTo != null) result.Add(valve); + } + return result; + } + + /// + /// Process the list of components and return extended valves + /// + public static IList ExtendedValves(IList cmpnts) + { + IList result = new List(); + foreach (var cmpnt in cmpnts) + { + if (cmpnt is Elde.ValveEx.Valve) result.Add(cmpnt as Elde.ValveEx.Valve); + } + return result; + } + + /// + /// Create a list with one valved passed as an argument to this function + /// + /// Valve + /// List with one valve + public static IList MakeList(IValve valve) + { + IList result = new List(); + if (valve != null) result.Add(valve); + return result; + } + + public static IList Merge(IList valves1, IList valves2) + { + IList result = new List(); + if (valves1 != null) foreach (var valve in valves1) result.Add(valve); + if (valves2 != null) foreach (var valve in valves2) result.Add(valve); + return result; + } + + public static IList Merge(IList valves1, IList valves2, IList valves3) + { + IList result = new List(); + if (valves1 != null) foreach (var valve in valves1) result.Add(valve); + if (valves2 != null) foreach (var valve in valves2) result.Add(valve); + if (valves3 != null) foreach (var valve in valves3) result.Add(valve); + return result; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/HeatMetersPath.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/HeatMetersPath.cs new file mode 100644 index 00000000..266d9ec2 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/HeatMetersPath.cs @@ -0,0 +1,61 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl +{ + public class HeatMetersPath + { + public int ItemNr; + public string Name; + + public float TempWarmFrom; + public float TempWarmTo; + public float TempColdFrom; + public float TempColdTo; + + public ITempMeter TMeterRefWarm1; + public ITempMeter TMeterRefWarm2; + public ITempMeter TMeterRefCold1; + public ITempMeter TMeterRefCold2; + + public ITempMeter TMeterWorkWarm1; + public ITempMeter TMeterWorkWarm2; + public ITempMeter TMeterWorkCold1; + public ITempMeter TMeterWorkCold2; + + /// Constructor from name, the rest is empty + public HeatMetersPath(string name, int itemNr) + { + ItemNr = itemNr; + Name = name; + } + + /// Constructor from data entity + public HeatMetersPath(Config.Entities.HeatMetersPath entity, IList components) + : this(entity.Name, entity.ItemNr) + { + TempWarmFrom = entity.TempWarmFrom; + TempWarmTo = entity.TempWarmTo; + TempColdFrom = entity.TempColdFrom; + TempColdTo = entity.TempColdTo; + + TMeterRefWarm1 = TbfComponents.FindComponent(entity.TMeterRefWarm1, components) as ITempMeter; + TMeterRefWarm2 = TbfComponents.FindComponent(entity.TMeterRefWarm2, components) as ITempMeter; + TMeterRefCold1 = TbfComponents.FindComponent(entity.TMeterRefCold1, components) as ITempMeter; + TMeterRefCold2 = TbfComponents.FindComponent(entity.TMeterRefCold2, components) as ITempMeter; + + TMeterWorkWarm1 = TbfComponents.FindComponent(entity.TMeterWorkWarm1, components) as ITempMeter; + TMeterWorkWarm2 = TbfComponents.FindComponent(entity.TMeterWorkWarm2, components) as ITempMeter; + TMeterWorkCold1 = TbfComponents.FindComponent(entity.TMeterWorkCold1, components) as ITempMeter; + TMeterWorkCold2 = TbfComponents.FindComponent(entity.TMeterWorkCold2, components) as ITempMeter; + } + + public override string ToString() + { + return string.Format("{0}", Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/IOperation.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/IOperation.cs new file mode 100644 index 00000000..17e73d6e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/IOperation.cs @@ -0,0 +1,47 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace TBF.BenchControl +{ + /// + /// This interface has to be implemented by each 'operation'. 'operations' are classes + /// in TBF.BenchControl name space with a class name ending with 'Op' (e.g. TimerOp). + /// This class name rule is a convention, not a requirement. + /// + public interface IOperation + { + /// + /// Method is called when a state machine enters a state in which this operation + /// takes place/ will be executed. + /// Method is not called when this operation took place also in the previous state. + /// StateMachine checks whether Start() should be called depending on the previous + /// and the current state. + /// + /// true on success + void Start(); + + /// + /// Method is called in regular time intervals when state machine is + /// in a state in which this operation takes place. + /// During operation the IOparation derived object may issue events, + /// that means Run() method returns a value different from Event.Void (=0). + /// Examples: Timer expired + /// + /// + Event Run(); + + /// + /// Method is called when the state machine leaves a state in which + /// this operation takes place / was executed. + /// Method is not called when this operation takes place also in the next state. + /// StateMachine checks whether Start() should be called depending on the previous + /// and the current state. + /// + void Stop(); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/Multimeter_2010_RS232/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/Multimeter_2010_RS232/Factory.cs new file mode 100644 index 00000000..3be74fd3 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/Multimeter_2010_RS232/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Keithley.Multimeter_2010_RS232 +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Multimeter.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Multimeter(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Multimeter(cfg); } + + public IComponentCfg DefaultConfig() { return new MultimeterCfg(GetType().Namespace.Substring(17), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(MultimeterCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/Multimeter_2010_RS232/Multimeter.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/Multimeter_2010_RS232/Multimeter.cs new file mode 100644 index 00000000..bde2b6b4 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/Multimeter_2010_RS232/Multimeter.cs @@ -0,0 +1,309 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO.Ports; +using System.Text; +using System.Threading; +using log4net; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Boxes; + +namespace TBF.BenchControl.Keithley.Multimeter_2010_RS232 +{ + /// + /// Root component for Modbus communication via serial port (RS485) + /// + public class Multimeter : ComponentBase, IDevice + { + private static readonly ILog log = LogManager.GetLogger(typeof(Multimeter)); + public override string ToString() { return string.Format("{0}({1})", GetType().Namespace.Substring(17), Cfg.ToString(1)); } + + private readonly MultimeterCfg multimeterCfg; + + + /// + /// Main result + /// + public const int ChannelFrom = 1; + public const int ChannelTo = 5; + /// + public double[] Resistance; /// ChannelNr in range is used as an index to this array + + + /// Private fields + SerialPort serialPort; + StringBuilder receivedData; + int readAttemptsCount; + + + IList listOfReadOperations; + IList listOfChannels; + int nextChannelIx; /// index to listOfChannels + int currentChannel; /// current channel (ChannelFrom .. ChannelTo), 0 = invalid, updated when sending :rout:clos command + enum ScanState + { + Off, + Start_Reset, + Reset_Reset2, + Reset2_SwitchChnl, + SwitchChnl_Read, + Read_Receive, + Receive_SwitchChnl, + } + ScanState scanState; + + + public Multimeter() + { + Resistance = new double[ChannelTo + 1]; + } + + /// + /// Ambient temperature / humidity / pressure meter 'Greco' connected via serial interface (RS232) + /// Connection settings: 19200 Bd 8-bits No-parity 1-stop-bit Flow control: none or hardware. + /// + public Multimeter(Generic.IComponentCfg cfg) + : base(cfg) + { + multimeterCfg = cfg as MultimeterCfg; + serialPort = null; + + receivedData = new StringBuilder(); + readAttemptsCount = 0; + + Resistance = new double[ChannelTo + 1]; + for (int i = 0; i < Resistance.Length; i++) Resistance[i] = 0; + + listOfReadOperations = new List(); + listOfChannels = new List(); + nextChannelIx = 0; + currentChannel = 0; /// invalid, no :rout:clos command yet + scanState = ScanState.Off; + + log.Debug(this.ToString()); + } + + ~Multimeter() + { + } + + /// + /// Start reading temperature from specified channel + /// + /// channel in range ChannelFrom .. ChannelTo + /// true when successful + public bool StartReadingMultimeter(int channel) + { + log.DebugFormat("StartReadingMultimeter({0})", channel); + + if (channel < ChannelFrom || channel > ChannelTo) return false; /// Invalid channel + + listOfReadOperations.Add(channel); + + if (!listOfChannels.Contains(channel)) + { + listOfChannels.Add(channel); + if (listOfChannels.Count == 1) StartScanning(); /// Count changed from 0 to 1 + } + + return true; + } + + /// + /// Stop reading temperature from specified channel + /// + /// channel in range ChannelFrom .. ChannelTo + /// true when successful + public bool StopReadingMultimeter(int channel) + { + log.DebugFormat("StopReadingMultimeter({0})", channel); + + if (channel < ChannelFrom || channel > ChannelTo) return false; /// Invalid channel + + if (!listOfReadOperations.Remove(channel)) return false; /// Channel not found on the list (no matching StartReading...) + + for (int i = 0; i < listOfChannels.Count; i++) + { + if (listOfChannels[i] == channel) + { + listOfChannels.RemoveAt(i); + if (listOfChannels.Count == 0) + { + StopScanning(); + } + else if (nextChannelIx > i) + { + nextChannelIx--; + } + } + } + + return true; + } + + + public double ReadResistance(int channelNr) + { + if (channelNr < ChannelFrom || channelNr > ChannelTo) return 0; + return Resistance[channelNr]; + } + + + private void StartScanning() + { + for (int i = 0; i < Resistance.Length; i++) Resistance[i] = 0; /// Reset resistances (0 == invalid) + /// + nextChannelIx = 0; + currentChannel = 0; /// invalid, no :rout:clos command yet + scanState = ScanState.Start_Reset; + } + + private void StopScanning() + { + scanState = ScanState.Off; + } + + + public void Initialize() + { + if (multimeterCfg.DebugLevel == DebugMode.Simulate) + { + log.FatalFormat("Simulated device {0}", ToString()); + return; + } + + string comPortName = "COM" + multimeterCfg.ComPortNr.ToString(); + serialPort = new SerialPort(comPortName, multimeterCfg.BaudRate, multimeterCfg.Parity, multimeterCfg.DataBits, multimeterCfg.StopBits); + serialPort.Handshake = multimeterCfg.Handshake; + serialPort.Open(); + + log.FatalFormat("Successfully initialized device {0}", ToString()); + } + + + /// + /// Send an ASCII string, appends at the end. + /// + /// ASCII string + public void SendMessage(string message) + { + if (multimeterCfg.DebugLevel == DebugMode.Simulate) return; + serialPort.Write(message + "\r\n"); + log.DebugFormat("Sending message {0}", message); + } + + + /// Run this device + public void RunDeviceBefore() + { + if (serialPort == null) return; + + receivedData.Append(serialPort.ReadExisting()); + + if (scanState == ScanState.Read_Receive) + { + if(currentChannel >= ChannelFrom && currentChannel <= ChannelTo) + { + int len = receivedData.Length; + if (len >= 2 && receivedData[len - 2] == '\r' && receivedData[len - 1] == '\n') + { + string resStr = receivedData.ToString().Substring(0, len - 2); + log.DebugFormat("Received message {0}", resStr); + + /// Check whether there is at the end of received data and the text before can be parsed. + double res; + if (Utils.TryParseEDouble(resStr, out res)) + { + Resistance[currentChannel] = Math.Abs(res); /// Store the parsed number + log.DebugFormat("Resistance[{0}] = {1}", currentChannel, res); + } + + scanState = ScanState.Receive_SwitchChnl; + } + else + { + if (++readAttemptsCount >= 5) + { + scanState = ScanState.Receive_SwitchChnl; + readAttemptsCount = 0; + } + } + } + else + { + scanState = ScanState.Receive_SwitchChnl; + } + } + } + + + /// Run this device + public void RunDeviceAfter() + { + if (serialPort == null) return; + + switch (scanState) + { + case ScanState.Start_Reset: + + SendMessage("*RST"); + scanState = ScanState.Reset_Reset2; + return; + + case ScanState.Reset_Reset2: + + SendMessage(":conf:fres"); + scanState = ScanState.Reset2_SwitchChnl; + return; + + case ScanState.Reset2_SwitchChnl: + case ScanState.Receive_SwitchChnl: + + if (nextChannelIx >= 0 && nextChannelIx < listOfChannels.Count) + { + /// Update 'curentChannel' + currentChannel = listOfChannels[nextChannelIx]; + + /// Switch to the 'curentChannel' + SendMessage(string.Format(":rout:clos (@{0})", currentChannel)); + + /// Increase 'nextChannelIx' + nextChannelIx++; + if (nextChannelIx >= listOfChannels.Count) nextChannelIx = 0; + } + scanState = ScanState.SwitchChnl_Read; + return; + + case ScanState.SwitchChnl_Read: + + SendMessage(":read?"); + scanState = ScanState.Read_Receive; + receivedData.Clear(); + readAttemptsCount = 0; + return; + + default: /// Scanning is off + return; + } + } + + + /// Stop this device + public void StopDevice() + { + if (multimeterCfg.DebugLevel == DebugMode.Simulate) return; + + if (serialPort != null) + { + serialPort.Close(); + serialPort = null; + } + } + + public void StopDevice2() { } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/Multimeter_2010_RS232/MultimeterCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/Multimeter_2010_RS232/MultimeterCfg.cs new file mode 100644 index 00000000..85e08fb0 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/Multimeter_2010_RS232/MultimeterCfg.cs @@ -0,0 +1,53 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.IO.Ports; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Keithley.Multimeter_2010_RS232 +{ + public class MultimeterCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(MultimeterCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new MultimeterCfgCtrl(); } + + /// + /// Serialized parameters + /// + public int ComPortNr; + public int BaudRate; + public Parity Parity; + public int DataBits; + public StopBits StopBits; + public Handshake Handshake; + + /// Private parameterless constructor invoked by all other (public) constructors + MultimeterCfg() + { + } + + public MultimeterCfg(string name, IComponentFactory factory) + : this() + { + this.Name = name; + this.Factory = factory; + ParentName = string.Empty; + ComPortNr = 5; + BaudRate = 9600; + Parity = System.IO.Ports.Parity.None; + DataBits = 8; + StopBits = System.IO.Ports.StopBits.One; + Handshake = System.IO.Ports.Handshake.None; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Com{1}, {2}Bd, {3}-bits, parity={4}, stopBits={5}, {6}", + Name, ComPortNr, BaudRate, DataBits, Parity, StopBits, Handshake); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/Multimeter_2010_RS232/MultimeterCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/Multimeter_2010_RS232/MultimeterCfgCtrl.cs new file mode 100644 index 00000000..cee2a813 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/Multimeter_2010_RS232/MultimeterCfgCtrl.cs @@ -0,0 +1,171 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using System.IO.Ports; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.Keithley.Multimeter_2010_RS232 +{ + public partial class MultimeterCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + MultimeterCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as MultimeterCfg; + Redraw(); + } + } + + public MultimeterCfgCtrl() + { + InitializeComponent(); + + parityComboBox.Items.Add(Parity.None.ToString()); + parityComboBox.Items.Add(Parity.Even.ToString()); + parityComboBox.Items.Add(Parity.Odd.ToString()); + + stopBitsComboBox.Items.Add(StopBits.None.ToString()); + stopBitsComboBox.Items.Add(StopBits.One.ToString()); + stopBitsComboBox.Items.Add(StopBits.OnePointFive.ToString()); + stopBitsComboBox.Items.Add(StopBits.Two.ToString()); + + handshakeComboBox.Items.Add(Handshake.None.ToString()); + handshakeComboBox.Items.Add(Handshake.RequestToSend.ToString()); + handshakeComboBox.Items.Add(Handshake.XOnXOff.ToString()); + } + + int GetParityIx(Parity par) + { + if (par == Parity.None) return 0; + if (par == Parity.Even) return 0; + if (par == Parity.Odd) return 0; + return -1; + } + Parity GetParity(string str) + { + if (str.Equals(Parity.None.ToString())) return Parity.None; + if (str.Equals(Parity.Even.ToString())) return Parity.Even; + if (str.Equals(Parity.Odd.ToString())) return Parity.Odd; + return (Parity)(-1); + } + + int GetStopBitsIx(StopBits sb) + { + if (sb == StopBits.None) return 0; + if (sb == StopBits.One) return 1; + if (sb == StopBits.OnePointFive) return 2; + if (sb == StopBits.Two) return 3; + return -1; + } + StopBits GetStopBits(string str) + { + if (str.Equals(StopBits.None.ToString())) return StopBits.None; + if (str.Equals(StopBits.One.ToString())) return StopBits.One; + if (str.Equals(StopBits.OnePointFive.ToString())) return StopBits.OnePointFive; + if (str.Equals(StopBits.Two.ToString())) return StopBits.Two; + return (StopBits)(-1); + } + + int GetHandshakeIx(Handshake par) + { + if (par == Handshake.None) return 0; + if (par == Handshake.RequestToSend) return 0; + if (par == Handshake.XOnXOff) return 0; + return -1; + } + Handshake GetHandshake(string str) + { + if (str.Equals(Handshake.None.ToString())) return Handshake.None; + if (str.Equals(Handshake.RequestToSend.ToString())) return Handshake.RequestToSend; + if (str.Equals(Handshake.XOnXOff.ToString())) return Handshake.XOnXOff; + return (Handshake)(-1); + } + + private void ModbusCfgCtrl_Load(object sender, EventArgs e) + { + nameLabel.Text = Strings.Name; + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + comPortNrTextBox.Text = config.ComPortNr.ToString(); + baudRateTextBox.Text = config.BaudRate.ToString(); + parityComboBox.Text = config.Parity.ToString(); + dataBitsTextBox.Text = config.DataBits.ToString(); + stopBitsComboBox.Text = config.StopBits.ToString(); + handshakeComboBox.Text = config.Handshake.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + comPortNrTextBox.Enabled = true; + baudRateTextBox.Enabled = true; + parityComboBox.Enabled = true; + dataBitsTextBox.Enabled = true; + stopBitsComboBox.Enabled = true; + handshakeComboBox.Enabled = true; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.ComPortNr = int.Parse(comPortNrTextBox.Text); + config.BaudRate = int.Parse(baudRateTextBox.Text); + config.Parity = GetParity(parityComboBox.SelectedItem.ToString()); + config.DataBits = int.Parse(dataBitsTextBox.Text); + config.StopBits = GetStopBits(stopBitsComboBox.SelectedItem.ToString()); + config.Handshake = GetHandshake(handshakeComboBox.SelectedItem.ToString()); + + return flags; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!int.TryParse(comPortNrTextBox.Text, out dummy) || dummy < 1 || dummy > 999) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Serial Port Number' is not valid"; + } + + if (!int.TryParse(baudRateTextBox.Text, out dummy) || dummy < 150 || dummy > 115200) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Baud Rate' is not valid"; + } + + if (!int.TryParse(dataBitsTextBox.Text, out dummy) || dummy < 7 || dummy > 8) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Data Bits' is not valid"; + } + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/Multimeter_2010_RS232/MultimeterCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/Multimeter_2010_RS232/MultimeterCfgCtrl.designer.cs new file mode 100644 index 00000000..b225f4ed --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/Multimeter_2010_RS232/MultimeterCfgCtrl.designer.cs @@ -0,0 +1,229 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +namespace TBF.BenchControl.Keithley.Multimeter_2010_RS232 +{ + partial class MultimeterCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.comPortNrTextBox = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.baudRateLabel = new System.Windows.Forms.Label(); + this.baudRateTextBox = new System.Windows.Forms.TextBox(); + this.partityLabel = new System.Windows.Forms.Label(); + this.dataBitsLabel = new System.Windows.Forms.Label(); + this.dataBitsTextBox = new System.Windows.Forms.TextBox(); + this.stopBitsLabel = new System.Windows.Forms.Label(); + this.handshakeLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.parityComboBox = new System.Windows.Forms.ComboBox(); + this.stopBitsComboBox = new System.Windows.Forms.ComboBox(); + this.handshakeComboBox = new System.Windows.Forms.ComboBox(); + this.SuspendLayout(); + // + // comPortNrTextBox + // + this.comPortNrTextBox.Enabled = false; + this.comPortNrTextBox.Location = new System.Drawing.Point(140, 52); + this.comPortNrTextBox.Name = "comPortNrTextBox"; + this.comPortNrTextBox.Size = new System.Drawing.Size(34, 20); + this.comPortNrTextBox.TabIndex = 4; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(29, 55); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(98, 13); + this.label1.TabIndex = 3; + this.label1.Text = "Serial Port Number:"; + // + // baudRateLabel + // + this.baudRateLabel.AutoSize = true; + this.baudRateLabel.Location = new System.Drawing.Point(29, 79); + this.baudRateLabel.Name = "baudRateLabel"; + this.baudRateLabel.Size = new System.Drawing.Size(58, 13); + this.baudRateLabel.TabIndex = 5; + this.baudRateLabel.Text = "Baud Rate"; + // + // baudRateTextBox + // + this.baudRateTextBox.Enabled = false; + this.baudRateTextBox.Location = new System.Drawing.Point(140, 76); + this.baudRateTextBox.Name = "baudRateTextBox"; + this.baudRateTextBox.Size = new System.Drawing.Size(130, 20); + this.baudRateTextBox.TabIndex = 6; + // + // partityLabel + // + this.partityLabel.AutoSize = true; + this.partityLabel.Location = new System.Drawing.Point(29, 103); + this.partityLabel.Name = "partityLabel"; + this.partityLabel.Size = new System.Drawing.Size(33, 13); + this.partityLabel.TabIndex = 7; + this.partityLabel.Text = "Parity"; + // + // dataBitsLabel + // + this.dataBitsLabel.AutoSize = true; + this.dataBitsLabel.Location = new System.Drawing.Point(29, 127); + this.dataBitsLabel.Name = "dataBitsLabel"; + this.dataBitsLabel.Size = new System.Drawing.Size(50, 13); + this.dataBitsLabel.TabIndex = 9; + this.dataBitsLabel.Text = "Data Bits"; + // + // dataBitsTextBox + // + this.dataBitsTextBox.Enabled = false; + this.dataBitsTextBox.Location = new System.Drawing.Point(140, 124); + this.dataBitsTextBox.Name = "dataBitsTextBox"; + this.dataBitsTextBox.Size = new System.Drawing.Size(34, 20); + this.dataBitsTextBox.TabIndex = 10; + // + // stopBitsLabel + // + this.stopBitsLabel.AutoSize = true; + this.stopBitsLabel.Location = new System.Drawing.Point(29, 151); + this.stopBitsLabel.Name = "stopBitsLabel"; + this.stopBitsLabel.Size = new System.Drawing.Size(49, 13); + this.stopBitsLabel.TabIndex = 11; + this.stopBitsLabel.Text = "Stop Bits"; + // + // handshakeLabel + // + this.handshakeLabel.AutoSize = true; + this.handshakeLabel.Location = new System.Drawing.Point(29, 175); + this.handshakeLabel.Name = "handshakeLabel"; + this.handshakeLabel.Size = new System.Drawing.Size(62, 13); + this.handshakeLabel.TabIndex = 13; + this.handshakeLabel.Text = "Handshake"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(140, 28); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(30, 31); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(137, 7); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // parityComboBox + // + this.parityComboBox.Enabled = false; + this.parityComboBox.FormattingEnabled = true; + this.parityComboBox.Location = new System.Drawing.Point(140, 100); + this.parityComboBox.Name = "parityComboBox"; + this.parityComboBox.Size = new System.Drawing.Size(130, 21); + this.parityComboBox.TabIndex = 8; + // + // stopBitsComboBox + // + this.stopBitsComboBox.Enabled = false; + this.stopBitsComboBox.FormattingEnabled = true; + this.stopBitsComboBox.Location = new System.Drawing.Point(140, 148); + this.stopBitsComboBox.Name = "stopBitsComboBox"; + this.stopBitsComboBox.Size = new System.Drawing.Size(130, 21); + this.stopBitsComboBox.TabIndex = 12; + // + // handshakeComboBox + // + this.handshakeComboBox.Enabled = false; + this.handshakeComboBox.FormattingEnabled = true; + this.handshakeComboBox.Location = new System.Drawing.Point(140, 172); + this.handshakeComboBox.Name = "handshakeComboBox"; + this.handshakeComboBox.Size = new System.Drawing.Size(130, 21); + this.handshakeComboBox.TabIndex = 14; + // + // AmbientCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.Control; + this.Controls.Add(this.handshakeComboBox); + this.Controls.Add(this.stopBitsComboBox); + this.Controls.Add(this.parityComboBox); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Controls.Add(this.handshakeLabel); + this.Controls.Add(this.stopBitsLabel); + this.Controls.Add(this.dataBitsTextBox); + this.Controls.Add(this.dataBitsLabel); + this.Controls.Add(this.partityLabel); + this.Controls.Add(this.baudRateTextBox); + this.Controls.Add(this.baudRateLabel); + this.Controls.Add(this.comPortNrTextBox); + this.Controls.Add(this.label1); + this.Name = "AmbientCfgCtrl"; + this.Size = new System.Drawing.Size(300, 240); + this.Load += new System.EventHandler(this.ModbusCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox comPortNrTextBox; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label baudRateLabel; + private System.Windows.Forms.TextBox baudRateTextBox; + private System.Windows.Forms.Label partityLabel; + private System.Windows.Forms.Label dataBitsLabel; + private System.Windows.Forms.TextBox dataBitsTextBox; + private System.Windows.Forms.Label stopBitsLabel; + private System.Windows.Forms.Label handshakeLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.ComboBox parityComboBox; + private System.Windows.Forms.ComboBox stopBitsComboBox; + private System.Windows.Forms.ComboBox handshakeComboBox; + + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/Multimeter_2010_RS232/MultimeterCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/Multimeter_2010_RS232/MultimeterCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/Multimeter_2010_RS232/MultimeterCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/TempMeter/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/TempMeter/Factory.cs new file mode 100644 index 00000000..d9ea3e3c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/TempMeter/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Keithley.TempMeter +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { TempMeter.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new TempMeter(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new TempMeter(cfg, components); } + + public IComponentCfg DefaultConfig() { return new TempMeterCfg(GetType().Namespace.Substring(17), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TempMeterCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/TempMeter/ReadTempOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/TempMeter/ReadTempOp.cs new file mode 100644 index 00000000..e43f7019 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/TempMeter/ReadTempOp.cs @@ -0,0 +1,63 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using log4net; +using TBF.Boxes; +using TBF.BenchControl.Keithley.Multimeter_2010_RS232; + +namespace TBF.BenchControl.Keithley.TempMeter +{ + public class ReadTempOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(ReadTempOp)); + public override string ToString() { return string.Format("ReadTempOp({0},.,{1})", tempMeter.Name, eventDone); } + + /// Set by the constructor + readonly TempMeter tempMeter; + readonly DoubleBox temperature; + readonly Event eventDone; + + /// + /// Events: TempInDone, TempOutDone, TempDivDone or Error + /// + /// TempMeter reference + /// Reference to the variable, value is in degree Celsius + /// Event to be returned by Run() when completed OK + public ReadTempOp(TempMeter tempMeter, ref DoubleBox temperature, Event eventDone) + { + if (tempMeter == null) throw new ArgumentNullException("tempMeter"); + this.tempMeter = tempMeter; + this.temperature = temperature; + this.eventDone = eventDone; + log.Debug(this.ToString()); + } + public ReadTempOp(TempMeter tempMeter, ref DoubleBox temperature) + : this(tempMeter, ref temperature, Event.TempDone) + { + } + + /// Start this operation + public void Start() + { + tempMeter.Multimeter.StartReadingMultimeter(tempMeter.Channel); + temperature.Val = 0; + } + + /// Run this operation + /// + /// Event.TempInDone, Event.TempOutDone or Event.TempDivDone + /// + public Event Run() + { + temperature.Val = tempMeter.ReadTemperature(); + return eventDone; + } + + /// Stop this operation + public void Stop() + { + tempMeter.Multimeter.StopReadingMultimeter(tempMeter.Channel); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/TempMeter/TempMeter.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/TempMeter/TempMeter.cs new file mode 100644 index 00000000..0fc76f67 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/TempMeter/TempMeter.cs @@ -0,0 +1,120 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using Config; +using log4net; +using TBF.Boxes; +using TBF.BenchControl.Keithley.Multimeter_2010_RS232; + +namespace TBF.BenchControl.Keithley.TempMeter +{ + public class TempMeter : ComponentBase, GenericDevices.ITempMeter + { + private static readonly ILog log = LogManager.GetLogger(typeof(TempMeter)); + public override string ToString() { return string.Format("Keithley.TempMeter({0})", Cfg.ToString(1)); } + + readonly TempMeterCfg tempMtrCfg; /// configuration + + public readonly Multimeter Multimeter; /// parent component + + public int Channel { get { return tempMtrCfg.Channel; } } /// 1..5 + + + /// Dictionaries to maintain separate operations for each FloatBox argument + Dictionary operations; + Dictionary operations2; + + + public TempMeter() + { + } + + public TempMeter(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + tempMtrCfg = cfg as TempMeterCfg; + + Multimeter = (Multimeter)TbfComponents.FindComponent(cfg.ParentName, components); + if (Multimeter == null) throw new Exception("Cannot find " + Name + " parent"); + + operations = new Dictionary(); + operations2 = new Dictionary(); + + log.Debug(this.ToString()); + } + + public double ReadTemperature() + { + double resistance = Multimeter.ReadResistance(tempMtrCfg.Channel); + + double temperature = 0; + if (resistance > 0 && resistance < 2000) + { + if (tempMtrCfg.UseITS90) + { + temperature = Formulas.PlatinumResistanceTM_ITS90_R2T(resistance, + tempMtrCfg.R001C, + tempMtrCfg.a7, + tempMtrCfg.b7, + tempMtrCfg.c7); + } + else + { + temperature = Formulas.PlatinumResistanceTM_ITS27_R2T(resistance, + tempMtrCfg.R0, + tempMtrCfg.A, + tempMtrCfg.B); + } + + log.DebugFormat("Ch = {0}, R = {1} Ohm, T = {2} °C", Channel, resistance.ToString("F3"), temperature.ToString("F3")); + } + + return temperature; + } + + /// + /// Events: TempDone, Error + /// + /// Reference to a variable for the temperature in Celsius + /// ReadTempOp instance reference casted to IOperaton + public IOperation ReadTempOp(ref DoubleBox temp) + { + IOperation operation; + if (operations.TryGetValue(temp, out operation)) + { + return operation; /// Operation already available + } + else + { + /// Create a new operation and store it in the dictionary + operation = new ReadTempOp(this, ref temp); + operations.Add(temp, operation); + return operation; + } + } + + /// + /// Events: tempDone, Error + /// + /// Reference to a variable for the temperature in Celsius + /// Event returned when measurement done + /// ReadTempOp instance reference casted to IOperaton + public IOperation ReadTempOp(ref DoubleBox temp, Event tempDone) + { + IOperation operation; + if (operations2.TryGetValue(temp, out operation)) + { + return operation; /// Operation already available + } + else + { + /// Create a new operation and store it in the dictionary + operation = new ReadTempOp(this, ref temp, tempDone); + operations2.Add(temp, operation); + return operation; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/TempMeter/TempMeterCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/TempMeter/TempMeterCfg.cs new file mode 100644 index 00000000..664eee4f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/TempMeter/TempMeterCfg.cs @@ -0,0 +1,70 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Keithley.TempMeter +{ + public class TempMeterCfg : ComponentCfgBase, IChildComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TempMeterCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new TempMeterCfgCtrl(); } + + /// + /// Serialized parameters + /// + public int Channel; /// 1..5 + + public bool UseITS90; /// true: use ITS-90 calibration coefficients + /// false: use Callendar-Van Dusen equations (coefficients) + + /// ITS-90 calibration coefficients + public double R001C; + public double a7; + public double b7; + public double c7; + + /// Callendar-Van Dusen equations + public double R0; + public double A; + public double B; + + /// Calibration info serialized parameters displayed in Metrology tab page + public string CalibCertificateNr; + public DateTime CalibDate; + public DateTime CalibValidDate; + + /// Private parameterless constructor invoked by all other (public) constructors + TempMeterCfg() + { + } + + public TempMeterCfg(string name, IComponentFactory factory) + : this() + { + this.Name = name; + this.Factory = factory; + ParentName = "Keithley.Multimeter_2010_RS232"; + Channel = 1; + UseITS90 = false; + R0 = 100.0; + A = 3.9083E-3; + B = -5.775E-7; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Parent={1}, Channel={2}, ITS-90={3}", + Name, + (string.IsNullOrEmpty(ParentName) ? "-" : ParentName), + Channel, + UseITS90); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/TempMeter/TempMeterCfgCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/TempMeter/TempMeterCfgCtrl.Designer.cs new file mode 100644 index 00000000..629b2447 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/TempMeter/TempMeterCfgCtrl.Designer.cs @@ -0,0 +1,133 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +namespace TBF.BenchControl.Keithley.TempMeter +{ + partial class TempMeterCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.channelTextBox = new System.Windows.Forms.TextBox(); + this.channelLabel = new System.Windows.Forms.Label(); + this.parentNameLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.parentNameComboBox = new System.Windows.Forms.ComboBox(); + this.SuspendLayout(); + // + // channelTextBox + // + this.channelTextBox.Enabled = false; + this.channelTextBox.Location = new System.Drawing.Point(125, 88); + this.channelTextBox.Name = "channelTextBox"; + this.channelTextBox.Size = new System.Drawing.Size(46, 20); + this.channelTextBox.TabIndex = 6; + // + // channelLabel + // + this.channelLabel.AutoSize = true; + this.channelLabel.Location = new System.Drawing.Point(30, 91); + this.channelLabel.Name = "channelLabel"; + this.channelLabel.Size = new System.Drawing.Size(73, 13); + this.channelLabel.TabIndex = 5; + this.channelLabel.Text = "Channel (1..5)"; + // + // parentNameLabel + // + this.parentNameLabel.AutoSize = true; + this.parentNameLabel.Location = new System.Drawing.Point(30, 67); + this.parentNameLabel.Name = "parentNameLabel"; + this.parentNameLabel.Size = new System.Drawing.Size(69, 13); + this.parentNameLabel.TabIndex = 3; + this.parentNameLabel.Text = "Parent Name"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(125, 40); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(30, 43); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(122, 16); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // parentNameComboBox + // + this.parentNameComboBox.Enabled = false; + this.parentNameComboBox.FormattingEnabled = true; + this.parentNameComboBox.Location = new System.Drawing.Point(125, 64); + this.parentNameComboBox.Name = "parentNameComboBox"; + this.parentNameComboBox.Size = new System.Drawing.Size(130, 21); + this.parentNameComboBox.TabIndex = 4; + // + // TempMeterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.parentNameComboBox); + this.Controls.Add(this.channelTextBox); + this.Controls.Add(this.channelLabel); + this.Controls.Add(this.parentNameLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "TempMeterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 240); + this.Load += new System.EventHandler(this.TempMeterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox channelTextBox; + private System.Windows.Forms.Label channelLabel; + private System.Windows.Forms.Label parentNameLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.ComboBox parentNameComboBox; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/TempMeter/TempMeterCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/TempMeter/TempMeterCfgCtrl.cs new file mode 100644 index 00000000..b13f3982 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/TempMeter/TempMeterCfgCtrl.cs @@ -0,0 +1,115 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.Keithley.TempMeter +{ + public partial class TempMeterCfgCtrl : UserControl, IComponentCfgCtrl + { + ComponentParametersDlg parent; + + public bool ShowMore { get { return false; } } + + TempMeterCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as TempMeterCfg; + Redraw(); + } + } + + public TempMeterCfgCtrl() + { + InitializeComponent(); + } + + private void TempMeterCfgCtrl_Load(object sender, EventArgs e) + { + Localize(); + + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + + if (parent.TbfComponents != null) + { + foreach (var cmpnt in parent.TbfComponents) + { + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is Keithley.Multimeter_2010_RS232.Factory) + { + parentNameComboBox.Items.Add(cmpnt.Name); + } + } + } + + Redraw(); + } + + void Localize() + { + nameLabel.Text = Strings.Name; + parentNameLabel.Text = Strings.Parent_name; + channelLabel.Text = string.Format("{0} (1..5)", Strings.Channel); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + parentNameComboBox.Text = string.IsNullOrEmpty(config.ParentName) ? "---" : config.ParentName; + channelTextBox.Text = config.Channel.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + parentNameComboBox.Enabled = true; + channelTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!parentNameComboBox.Items.Contains(parentNameComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + string.Format(Strings.Invalid_0, Strings.Parent_name); + } + if (!int.TryParse(channelTextBox.Text, out dummy) || dummy < 1 || dummy > 5) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Channel' should be in the range 1 .. 5"; + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.ParentName = parentNameComboBox.Text.Equals("---") ? string.Empty : parentNameComboBox.Text; + config.Channel = int.Parse(channelTextBox.Text); + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/TempMeter/TempMeterCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/TempMeter/TempMeterCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Keithley/TempMeter/TempMeterCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/MetersPath.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/MetersPath.cs new file mode 100644 index 00000000..3c4c1295 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/MetersPath.cs @@ -0,0 +1,32 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl +{ + public class MetersPath + { + public int ItemNr; + public string Name; + public IRegisterReader[] RegisterReaders; + + /// Constructor from name, the rest is empty + public MetersPath(string name, int itemNr) + { + ItemNr = itemNr; + Name = name; + RegisterReaders = new IRegisterReader[Config.Data.WMsCount]; + } + + public MetersPath(Config.Entities.MetersPath entity, IList components) + : this(entity.Name, entity.ItemNr) + { + for (int i = 0; i < Config.Data.WMsCount; i++) + { + RegisterReaders[i] = (IRegisterReader)TbfComponents.FindComponent(entity.GetSensor(i), components); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/KeepReadingMassesOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/KeepReadingMassesOp.cs new file mode 100644 index 00000000..f81fe8d7 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/KeepReadingMassesOp.cs @@ -0,0 +1,61 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using log4net; + +namespace TBF.BenchControl.MettlerToledo +{ + public class KeepReadingMassesOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(KeepReadingMassesOp)); + public override string ToString() { return string.Format("KeepReadingMassesOp()"); } + + bool done; + + /// + /// Events: BalanceDone, Error + /// + /// Balance device instance + /// Required mass readings count (>= 3) + /// Reference to the measured mass in kg + public KeepReadingMassesOp() + { + log.Debug(this.ToString()); + } + + /// Start this operation + public void Start() + { + done = false; + + for (int i = 0; i < Standard.BalanceDev.BalancesCount; i++) + { + Standard.BalanceDev.Balances[i].GetImmediateMassMeasurement(); + } + } + + /// Run this operation + /// + /// Event.None + /// + public Event Run() + { + if (done) return Event.BalanceDone; /// Mass has already been read + + for (int i = 0; i < Standard.BalanceDev.BalancesCount; i++) + { + if (Standard.BalanceDev.Balances[i].MsrmntState != MsrmntState.Busy) + { + Standard.BalanceDev.Balances[i].GetImmediateMassMeasurement(); + } + } + return Event.None; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Multi/BalanceCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Multi/BalanceCfg.cs new file mode 100644 index 00000000..78ca5c41 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Multi/BalanceCfg.cs @@ -0,0 +1,141 @@ +/// +/// Copyright (c) 2015-2018 Sensus Slovensko a.s. +/// +using System; +using System.IO; +using System.Collections.Generic; +using System.IO.Ports; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.MettlerToledo.Multi +{ + public class BalanceCfg : ComponentCfgBase, GenericDevices.IScaleCfg, GenericDevices.ITankDrainingCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(BalanceCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new BalanceCfgCtrl(); } + + /// + /// Serialized parameters + /// + public int IdNr; /// Identification number 1..3 + public float Resolution; /// Resolution of the integer value in the serial protocol in 'kg' + public string Format; + + /// Max. water mass in 'kg' or volume in 'l' + private float capacity; + public float Capacity { get { return capacity; } set { capacity = value; } } + + /// Mass threshold for 'Tank is empty' in 'kg' (or volume in 'l') + private float empty; + public float Empty { get { return empty; } set { empty = value; } } + + private string drainValve; + public string DrainValve { get { return drainValve; } set { drainValve = value; } } + + private int drainTimeSec; + public int DrainTimeSec { get { return drainTimeSec; } set { drainTimeSec = value; } } + + public int ComPortNr; + public int BaudRate; + public Parity Parity; + public int DataBits; + public StopBits StopBits; + public Handshake Handshake; + + /// + /// Buoyancy related serialized parameters - Displayed in Metrology tab page + /// + float buoyancyTemp; + float buoyancyPress; + float buoyancyHumi; + float weightStandardDensity; + string calibCertificateNr; + DateTime calibDate; + DateTime calibValidDate; + /// + public float BuoyancyTemp + { + get { return buoyancyTemp; } + set { buoyancyTemp = value; } + } + public float BuoyancyPress + { + get { return buoyancyPress; } + set { buoyancyPress = value; } + } + public float BuoyancyHumi + { + get { return buoyancyHumi; } + set { buoyancyHumi = value; } + } + public float WeightStandardDensity + { + get { return weightStandardDensity; } + set { weightStandardDensity = value; } + } + public string CalibCertificateNr + { + get { return calibCertificateNr; } + set { calibCertificateNr = value; } + } + public DateTime CalibDate + { + get { return calibDate; } + set { calibDate = value; } + } + public DateTime CalibValidDate + { + get { return calibValidDate; } + set { calibValidDate = value; } + } + + + /// Private parameterless constructor invoked by all other (public) constructors + BalanceCfg() + { + Name = "Balance"; + ParentName = string.Empty; + + IdNr = 1; + Capacity = 200.0f; + Resolution = 0.001f; + Empty = 20.0f; + Format = "F3"; + DrainTimeSec = 180; + + ComPortNr = 3; + BaudRate = 2400; + Parity = System.IO.Ports.Parity.Even; + DataBits = 7; + StopBits = System.IO.Ports.StopBits.One; + Handshake = System.IO.Ports.Handshake.XOnXOff; + + BuoyancyTemp = 20.0f; + BuoyancyPress = 1.0f; + BuoyancyHumi = 40.0f; + } + + public BalanceCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + if (IdNr == 1) + { + return string.Format("Name={0}, Id#={1}, {2}kg, empty={3}kg, fmt.={4}, emptyTm={5}s, Com{6}, {7}Bd, {8}-bits, parity={9}, stopBits={10}, {11}", + Name, IdNr, Capacity, Empty, Format, DrainTimeSec, ComPortNr, BaudRate, DataBits, Parity, StopBits, Handshake); + } + else + { + return string.Format("Name={0}, Id#={1}, {2}kg, empty={3}kg, fmt.={4}, emptyTm={5}s", + Name, IdNr, Capacity, Empty, Format, DrainTimeSec); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Multi/BalanceCfgCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Multi/BalanceCfgCtrl.Designer.cs new file mode 100644 index 00000000..4f25d94f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Multi/BalanceCfgCtrl.Designer.cs @@ -0,0 +1,438 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.MettlerToledo.Multi +{ + partial class BalanceCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.handshakeComboBox = new System.Windows.Forms.ComboBox(); + this.stopBitsComboBox = new System.Windows.Forms.ComboBox(); + this.parityComboBox = new System.Windows.Forms.ComboBox(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.handshakeLabel = new System.Windows.Forms.Label(); + this.stopBitsLabel = new System.Windows.Forms.Label(); + this.dataBitsTextBox = new System.Windows.Forms.TextBox(); + this.dataBitsLabel = new System.Windows.Forms.Label(); + this.parityLabel = new System.Windows.Forms.Label(); + this.baudRateTextBox = new System.Windows.Forms.TextBox(); + this.baudRateLabel = new System.Windows.Forms.Label(); + this.comPortNrTextBox = new System.Windows.Forms.TextBox(); + this.comPortNrLabel = new System.Windows.Forms.Label(); + this.capacityLabel = new System.Windows.Forms.Label(); + this.capacityTextBox = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.emptyTextBox = new System.Windows.Forms.TextBox(); + this.emptyLabel = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.emptyTimeTextBox = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.formatTextBox = new System.Windows.Forms.TextBox(); + this.formatLabel = new System.Windows.Forms.Label(); + this.idNrTextBox = new System.Windows.Forms.TextBox(); + this.idNrLabel = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.resolutionTextBox = new System.Windows.Forms.TextBox(); + this.resolutionLabel = new System.Windows.Forms.Label(); + this.drainValveComboBox = new System.Windows.Forms.ComboBox(); + this.drainingValveLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // handshakeComboBox + // + this.handshakeComboBox.Enabled = false; + this.handshakeComboBox.FormattingEnabled = true; + this.handshakeComboBox.Location = new System.Drawing.Point(236, 256); + this.handshakeComboBox.Name = "handshakeComboBox"; + this.handshakeComboBox.Size = new System.Drawing.Size(43, 21); + this.handshakeComboBox.TabIndex = 32; + // + // stopBitsComboBox + // + this.stopBitsComboBox.Enabled = false; + this.stopBitsComboBox.FormattingEnabled = true; + this.stopBitsComboBox.Location = new System.Drawing.Point(236, 235); + this.stopBitsComboBox.Name = "stopBitsComboBox"; + this.stopBitsComboBox.Size = new System.Drawing.Size(43, 21); + this.stopBitsComboBox.TabIndex = 30; + // + // parityComboBox + // + this.parityComboBox.Enabled = false; + this.parityComboBox.FormattingEnabled = true; + this.parityComboBox.Location = new System.Drawing.Point(100, 256); + this.parityComboBox.Name = "parityComboBox"; + this.parityComboBox.Size = new System.Drawing.Size(43, 21); + this.parityComboBox.TabIndex = 26; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(150, 26); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(143, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(26, 29); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(147, 7); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(89, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComponentName"; + // + // handshakeLabel + // + this.handshakeLabel.AutoSize = true; + this.handshakeLabel.Location = new System.Drawing.Point(162, 259); + this.handshakeLabel.Name = "handshakeLabel"; + this.handshakeLabel.Size = new System.Drawing.Size(62, 13); + this.handshakeLabel.TabIndex = 31; + this.handshakeLabel.Text = "Handshake"; + // + // stopBitsLabel + // + this.stopBitsLabel.AutoSize = true; + this.stopBitsLabel.Location = new System.Drawing.Point(162, 238); + this.stopBitsLabel.Name = "stopBitsLabel"; + this.stopBitsLabel.Size = new System.Drawing.Size(49, 13); + this.stopBitsLabel.TabIndex = 29; + this.stopBitsLabel.Text = "Stop Bits"; + // + // dataBitsTextBox + // + this.dataBitsTextBox.Enabled = false; + this.dataBitsTextBox.Location = new System.Drawing.Point(236, 213); + this.dataBitsTextBox.Name = "dataBitsTextBox"; + this.dataBitsTextBox.Size = new System.Drawing.Size(43, 20); + this.dataBitsTextBox.TabIndex = 28; + // + // dataBitsLabel + // + this.dataBitsLabel.AutoSize = true; + this.dataBitsLabel.Location = new System.Drawing.Point(162, 216); + this.dataBitsLabel.Name = "dataBitsLabel"; + this.dataBitsLabel.Size = new System.Drawing.Size(50, 13); + this.dataBitsLabel.TabIndex = 27; + this.dataBitsLabel.Text = "Data Bits"; + // + // parityLabel + // + this.parityLabel.AutoSize = true; + this.parityLabel.Location = new System.Drawing.Point(26, 261); + this.parityLabel.Name = "parityLabel"; + this.parityLabel.Size = new System.Drawing.Size(33, 13); + this.parityLabel.TabIndex = 25; + this.parityLabel.Text = "Parity"; + // + // baudRateTextBox + // + this.baudRateTextBox.Enabled = false; + this.baudRateTextBox.Location = new System.Drawing.Point(100, 235); + this.baudRateTextBox.Name = "baudRateTextBox"; + this.baudRateTextBox.Size = new System.Drawing.Size(43, 20); + this.baudRateTextBox.TabIndex = 24; + // + // baudRateLabel + // + this.baudRateLabel.AutoSize = true; + this.baudRateLabel.Location = new System.Drawing.Point(26, 238); + this.baudRateLabel.Name = "baudRateLabel"; + this.baudRateLabel.Size = new System.Drawing.Size(58, 13); + this.baudRateLabel.TabIndex = 23; + this.baudRateLabel.Text = "Baud Rate"; + // + // comPortNrTextBox + // + this.comPortNrTextBox.Enabled = false; + this.comPortNrTextBox.Location = new System.Drawing.Point(100, 213); + this.comPortNrTextBox.Name = "comPortNrTextBox"; + this.comPortNrTextBox.Size = new System.Drawing.Size(43, 20); + this.comPortNrTextBox.TabIndex = 22; + // + // comPortNrLabel + // + this.comPortNrLabel.AutoSize = true; + this.comPortNrLabel.Location = new System.Drawing.Point(26, 216); + this.comPortNrLabel.Name = "comPortNrLabel"; + this.comPortNrLabel.Size = new System.Drawing.Size(68, 13); + this.comPortNrLabel.TabIndex = 21; + this.comPortNrLabel.Text = "Serial Port #:"; + // + // capacityLabel + // + this.capacityLabel.AutoSize = true; + this.capacityLabel.Location = new System.Drawing.Point(25, 71); + this.capacityLabel.Name = "capacityLabel"; + this.capacityLabel.Size = new System.Drawing.Size(76, 13); + this.capacityLabel.TabIndex = 5; + this.capacityLabel.Text = "Tank Capacity"; + // + // capacityTextBox + // + this.capacityTextBox.Enabled = false; + this.capacityTextBox.Location = new System.Drawing.Point(151, 68); + this.capacityTextBox.Name = "capacityTextBox"; + this.capacityTextBox.Size = new System.Drawing.Size(43, 20); + this.capacityTextBox.TabIndex = 6; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(200, 71); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(19, 13); + this.label2.TabIndex = 7; + this.label2.Text = "kg"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(200, 113); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(19, 13); + this.label3.TabIndex = 13; + this.label3.Text = "kg"; + // + // emptyTextBox + // + this.emptyTextBox.Enabled = false; + this.emptyTextBox.Location = new System.Drawing.Point(151, 110); + this.emptyTextBox.Name = "emptyTextBox"; + this.emptyTextBox.Size = new System.Drawing.Size(43, 20); + this.emptyTextBox.TabIndex = 12; + // + // emptyLabel + // + this.emptyLabel.AutoSize = true; + this.emptyLabel.Location = new System.Drawing.Point(25, 113); + this.emptyLabel.Name = "emptyLabel"; + this.emptyLabel.Size = new System.Drawing.Size(109, 13); + this.emptyLabel.TabIndex = 11; + this.emptyLabel.Text = "Tank empty threshold"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(200, 155); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(24, 13); + this.label4.TabIndex = 18; + this.label4.Text = "sec"; + // + // emptyTimeTextBox + // + this.emptyTimeTextBox.Enabled = false; + this.emptyTimeTextBox.Location = new System.Drawing.Point(151, 152); + this.emptyTimeTextBox.Name = "emptyTimeTextBox"; + this.emptyTimeTextBox.Size = new System.Drawing.Size(43, 20); + this.emptyTimeTextBox.TabIndex = 17; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(26, 155); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(58, 13); + this.label5.TabIndex = 16; + this.label5.Text = "Drain Time"; + // + // formatTextBox + // + this.formatTextBox.Enabled = false; + this.formatTextBox.Location = new System.Drawing.Point(151, 131); + this.formatTextBox.Name = "formatTextBox"; + this.formatTextBox.Size = new System.Drawing.Size(43, 20); + this.formatTextBox.TabIndex = 15; + // + // formatLabel + // + this.formatLabel.AutoSize = true; + this.formatLabel.Location = new System.Drawing.Point(26, 134); + this.formatLabel.Name = "formatLabel"; + this.formatLabel.Size = new System.Drawing.Size(76, 13); + this.formatLabel.TabIndex = 14; + this.formatLabel.Text = "Decimal points"; + // + // idNrTextBox + // + this.idNrTextBox.Enabled = false; + this.idNrTextBox.Location = new System.Drawing.Point(151, 47); + this.idNrTextBox.Name = "idNrTextBox"; + this.idNrTextBox.Size = new System.Drawing.Size(43, 20); + this.idNrTextBox.TabIndex = 4; + this.idNrTextBox.TextChanged += new System.EventHandler(this.idNrTextBox_TextChanged); + // + // idNrLabel + // + this.idNrLabel.AutoSize = true; + this.idNrLabel.Location = new System.Drawing.Point(25, 50); + this.idNrLabel.Name = "idNrLabel"; + this.idNrLabel.Size = new System.Drawing.Size(85, 13); + this.idNrLabel.TabIndex = 3; + this.idNrLabel.Text = "ID Number (1..3)"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(200, 92); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(19, 13); + this.label1.TabIndex = 10; + this.label1.Text = "kg"; + // + // resolutionTextBox + // + this.resolutionTextBox.Enabled = false; + this.resolutionTextBox.Location = new System.Drawing.Point(151, 89); + this.resolutionTextBox.Name = "resolutionTextBox"; + this.resolutionTextBox.Size = new System.Drawing.Size(43, 20); + this.resolutionTextBox.TabIndex = 9; + // + // resolutionLabel + // + this.resolutionLabel.AutoSize = true; + this.resolutionLabel.Location = new System.Drawing.Point(25, 92); + this.resolutionLabel.Name = "resolutionLabel"; + this.resolutionLabel.Size = new System.Drawing.Size(57, 13); + this.resolutionLabel.TabIndex = 8; + this.resolutionLabel.Text = "Resolution"; + // + // drainValveComboBox + // + this.drainValveComboBox.Enabled = false; + this.drainValveComboBox.FormattingEnabled = true; + this.drainValveComboBox.Location = new System.Drawing.Point(150, 173); + this.drainValveComboBox.Name = "drainValveComboBox"; + this.drainValveComboBox.Size = new System.Drawing.Size(143, 21); + this.drainValveComboBox.TabIndex = 20; + // + // drainingValveLabel + // + this.drainingValveLabel.AutoSize = true; + this.drainingValveLabel.Location = new System.Drawing.Point(25, 176); + this.drainingValveLabel.Name = "drainingValveLabel"; + this.drainingValveLabel.Size = new System.Drawing.Size(61, 13); + this.drainingValveLabel.TabIndex = 19; + this.drainingValveLabel.Text = "Drain valve"; + // + // BalanceCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.drainValveComboBox); + this.Controls.Add(this.drainingValveLabel); + this.Controls.Add(this.label1); + this.Controls.Add(this.resolutionTextBox); + this.Controls.Add(this.resolutionLabel); + this.Controls.Add(this.idNrTextBox); + this.Controls.Add(this.idNrLabel); + this.Controls.Add(this.formatTextBox); + this.Controls.Add(this.formatLabel); + this.Controls.Add(this.label4); + this.Controls.Add(this.emptyTimeTextBox); + this.Controls.Add(this.label5); + this.Controls.Add(this.label3); + this.Controls.Add(this.emptyTextBox); + this.Controls.Add(this.emptyLabel); + this.Controls.Add(this.label2); + this.Controls.Add(this.capacityTextBox); + this.Controls.Add(this.capacityLabel); + this.Controls.Add(this.handshakeComboBox); + this.Controls.Add(this.stopBitsComboBox); + this.Controls.Add(this.parityComboBox); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Controls.Add(this.handshakeLabel); + this.Controls.Add(this.stopBitsLabel); + this.Controls.Add(this.dataBitsTextBox); + this.Controls.Add(this.dataBitsLabel); + this.Controls.Add(this.parityLabel); + this.Controls.Add(this.baudRateTextBox); + this.Controls.Add(this.baudRateLabel); + this.Controls.Add(this.comPortNrTextBox); + this.Controls.Add(this.comPortNrLabel); + this.Name = "BalanceCfgCtrl"; + this.Size = new System.Drawing.Size(450, 300); + this.Load += new System.EventHandler(this.BalanceCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ComboBox handshakeComboBox; + private System.Windows.Forms.ComboBox stopBitsComboBox; + private System.Windows.Forms.ComboBox parityComboBox; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.Label handshakeLabel; + private System.Windows.Forms.Label stopBitsLabel; + private System.Windows.Forms.TextBox dataBitsTextBox; + private System.Windows.Forms.Label dataBitsLabel; + private System.Windows.Forms.Label parityLabel; + private System.Windows.Forms.TextBox baudRateTextBox; + private System.Windows.Forms.Label baudRateLabel; + private System.Windows.Forms.TextBox comPortNrTextBox; + private System.Windows.Forms.Label comPortNrLabel; + private System.Windows.Forms.Label capacityLabel; + private System.Windows.Forms.TextBox capacityTextBox; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox emptyTextBox; + private System.Windows.Forms.Label emptyLabel; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox emptyTimeTextBox; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.TextBox formatTextBox; + private System.Windows.Forms.Label formatLabel; + private System.Windows.Forms.TextBox idNrTextBox; + private System.Windows.Forms.Label idNrLabel; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox resolutionTextBox; + private System.Windows.Forms.Label resolutionLabel; + private System.Windows.Forms.ComboBox drainValveComboBox; + private System.Windows.Forms.Label drainingValveLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Multi/BalanceCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Multi/BalanceCfgCtrl.cs new file mode 100644 index 00000000..8697f25f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Multi/BalanceCfgCtrl.cs @@ -0,0 +1,284 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// Author: Milan Hanajik +/// +using System; +using System.Windows.Forms; +using System.IO.Ports; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.MettlerToledo.Multi +{ + public partial class BalanceCfgCtrl : UserControl, IComponentCfgCtrl + { + ComponentParametersDlg parent; + + public bool ShowMore { get { return false; } } + + BalanceCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as BalanceCfg; + Redraw(); + } + } + + public BalanceCfgCtrl() + { + InitializeComponent(); + + parityComboBox.Items.Add(Parity.None.ToString()); + parityComboBox.Items.Add(Parity.Even.ToString()); + parityComboBox.Items.Add(Parity.Odd.ToString()); + + stopBitsComboBox.Items.Add(StopBits.None.ToString()); + stopBitsComboBox.Items.Add(StopBits.One.ToString()); + stopBitsComboBox.Items.Add(StopBits.OnePointFive.ToString()); + stopBitsComboBox.Items.Add(StopBits.Two.ToString()); + + handshakeComboBox.Items.Add(Handshake.None.ToString()); + handshakeComboBox.Items.Add(Handshake.RequestToSend.ToString()); + handshakeComboBox.Items.Add(Handshake.XOnXOff.ToString()); + } + + int GetParityIx(Parity par) + { + if (par == Parity.None) return 0; + if (par == Parity.Even) return 0; + if (par == Parity.Odd) return 0; + return -1; + } + Parity GetParity(string str) + { + if (str.Equals(Parity.None.ToString())) return Parity.None; + if (str.Equals(Parity.Even.ToString())) return Parity.Even; + if (str.Equals(Parity.Odd.ToString())) return Parity.Odd; + return (Parity)(-1); + } + + int GetStopBitsIx(StopBits sb) + { + if (sb == StopBits.None) return 0; + if (sb == StopBits.One) return 1; + if (sb == StopBits.OnePointFive) return 2; + if (sb == StopBits.Two) return 3; + return -1; + } + StopBits GetStopBits(string str) + { + if (str.Equals(StopBits.None.ToString())) return StopBits.None; + if (str.Equals(StopBits.One.ToString())) return StopBits.One; + if (str.Equals(StopBits.OnePointFive.ToString())) return StopBits.OnePointFive; + if (str.Equals(StopBits.Two.ToString())) return StopBits.Two; + return (StopBits)(-1); + } + + int GetHandshakeIx(Handshake par) + { + if (par == Handshake.None) return 0; + if (par == Handshake.RequestToSend) return 0; + if (par == Handshake.XOnXOff) return 0; + return -1; + } + Handshake GetHandshake(string str) + { + if (str.Equals(Handshake.None.ToString())) return Handshake.None; + if (str.Equals(Handshake.RequestToSend.ToString())) return Handshake.RequestToSend; + if (str.Equals(Handshake.XOnXOff.ToString())) return Handshake.XOnXOff; + return (Handshake)(-1); + } + + private void BalanceCfgCtrl_Load(object sender, EventArgs e) + { + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + + if (parent.TbfComponents != null) + { + drainValveComboBox.Items.Add("---"); + foreach (var cmpnt in parent.TbfComponents) + { + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is Elde.Valve.ValveFactory) + { + drainValveComboBox.Items.Add(cmpnt.Name); + } + } + } + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + idNrTextBox.Text = config.IdNr.ToString(); + capacityTextBox.Text = config.Capacity.ToString(); + resolutionTextBox.Text = config.Resolution.ToString(); + emptyTextBox.Text = config.Empty.ToString(); + formatTextBox.Text = (config.Format.Length > 1) ? config.Format.Substring(1) : config.Format; + emptyTimeTextBox.Text = config.DrainTimeSec.ToString(); + drainValveComboBox.Text = string.IsNullOrEmpty(config.DrainValve) ? "---" : config.DrainValve; + + comPortNrTextBox.Text = config.ComPortNr.ToString(); + baudRateTextBox.Text = config.BaudRate.ToString(); + parityComboBox.Text = config.Parity.ToString(); + dataBitsTextBox.Text = config.DataBits.ToString(); + stopBitsComboBox.Text = config.StopBits.ToString(); + handshakeComboBox.Text = config.Handshake.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + + idNrTextBox.Enabled = true; + capacityTextBox.Enabled = true; + resolutionTextBox.Enabled = true; + emptyTextBox.Enabled = true; + formatTextBox.Enabled = true; + emptyTimeTextBox.Enabled = true; + drainValveComboBox.Enabled = true; + + comPortNrTextBox.Enabled = true; + baudRateTextBox.Enabled = true; + parityComboBox.Enabled = true; + dataBitsTextBox.Enabled = true; + stopBitsComboBox.Enabled = true; + handshakeComboBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int idNr; + if (!int.TryParse(idNrTextBox.Text, out idNr) || idNr < 1 || idNr > 3) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Id Number' is not valid"; + } + + float mass; + if (!Utils.TryParseUFloat(capacityTextBox.Text, out mass) || mass <= 0) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Tank Capacity' is not valid"; + } + if (!Utils.TryParseUFloat(resolutionTextBox.Text, out mass) || mass <= 0) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Resolution' is not valid"; + } + if (!Utils.TryParseUFloat(emptyTextBox.Text, out mass) || mass <= 0) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Tank Empty' is not valid"; + } + + int dummy; + if (!int.TryParse(formatTextBox.Text, out dummy) || dummy < 0 || dummy > 9) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Decimal points' should be between 0 and 9"; + } + if (!int.TryParse(emptyTimeTextBox.Text, out dummy) || dummy < 1 || dummy > 999) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Tank Empty Time' should be between 1 and 999 sec"; + } + if (!drainValveComboBox.Items.Contains(drainValveComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Drain valve'"; + } + + if (idNr == 1) + { + if (!int.TryParse(comPortNrTextBox.Text, out dummy) || dummy < 1 || dummy > 999) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Serial Port Number' is not valid"; + } + if (!int.TryParse(baudRateTextBox.Text, out dummy) || dummy < 150 || dummy > 115200) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Baud Rate' is not valid"; + } + if (!int.TryParse(dataBitsTextBox.Text, out dummy) || dummy < 7 || dummy > 8) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Data Bits' is not valid"; + } + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.IdNr = int.Parse(idNrTextBox.Text); + + config.Capacity = Utils.ParseUFloat(capacityTextBox.Text); + config.Resolution = Utils.ParseUFloat(resolutionTextBox.Text); + config.Empty = Utils.ParseUFloat(emptyTextBox.Text); + config.Format = "F" + formatTextBox.Text; + config.DrainTimeSec = int.Parse(emptyTimeTextBox.Text); + config.DrainValve = drainValveComboBox.Text.Equals("---") ? string.Empty : drainValveComboBox.Text; + + if (config.IdNr == 1) + { + config.ComPortNr = int.Parse(comPortNrTextBox.Text); + config.BaudRate = int.Parse(baudRateTextBox.Text); + config.Parity = GetParity(parityComboBox.SelectedItem.ToString()); + config.DataBits = int.Parse(dataBitsTextBox.Text); + config.StopBits = GetStopBits(stopBitsComboBox.SelectedItem.ToString()); + config.Handshake = GetHandshake(handshakeComboBox.SelectedItem.ToString()); + } + + return flags; + } + + private void idNrTextBox_TextChanged(object sender, EventArgs e) + { + int idNr; + if (int.TryParse(idNrTextBox.Text, out idNr)) + { + bool visible = (idNr == 1); + + comPortNrLabel.Visible = visible; + comPortNrTextBox.Visible = visible; + + baudRateLabel.Visible = visible; + baudRateTextBox.Visible = visible; + + parityLabel.Visible = visible; + parityComboBox.Visible = visible; + + dataBitsLabel.Visible = visible; + dataBitsTextBox.Visible = visible; + + stopBitsLabel.Visible = visible; + stopBitsComboBox.Visible = visible; + + handshakeLabel.Visible = visible; + handshakeComboBox.Visible = visible; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Multi/BalanceCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Multi/BalanceCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Multi/BalanceCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Multi/BalanceDev.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Multi/BalanceDev.cs new file mode 100644 index 00000000..442f1b61 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Multi/BalanceDev.cs @@ -0,0 +1,341 @@ +/// +/// Copyright (c) 2015-2018 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using System.IO.Ports; +using log4net; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Boxes; + +namespace TBF.BenchControl.MettlerToledo.Multi +{ + /// + /// Mettler Toledo ICS4_5 Weighting terminal connected via serial interface (RS232) + /// + /// + /// Implemented and tested on 15.10.2013 by Milan Hanajik + /// + public class BalanceDev : TankDraining, IDevice, GenericDevices.IScale + { + /// + /// Info: StartMassMeasurement() and "Balnce response = .., Mass = ..." + /// Warn: Start measurement when busy is true + /// + private static readonly ILog log = LogManager.GetLogger(typeof(BalanceDev)); + public override string ToString() { return string.Format("MettlerToledo.Multi.Balance({0})", Cfg.ToString(1)); } + + protected readonly BalanceCfg balanceCfg; + protected static BalanceCfg balance1Cfg; + + /// + /// Enumeration of balances via static fields and methods + /// + static int nextBalanceIdx = 0; + public static new void ResetStaticProperties() + { + nextBalanceIdx = 0; + } + public static int BalancesCount { get { return nextBalanceIdx; } } + public static BalanceDev[] Balances; + public static double[] Masses; + /// + protected int balanceNr; /// 0-based balance number + + protected static SerialPort serialPort; + protected static StringBuilder stringBuilder; + + public int ScaleNr { get { return balanceNr; } } + public int IdNr { get { return balanceCfg.IdNr; } } + public double Capacity { get { return balanceCfg.Capacity; } } + public double Resolution { get { return balanceCfg.Resolution; } } + public int EmptyTimeSec { get { return balanceCfg.DrainTimeSec; } } + + /// Buoyancy + public float BuoyancyTemp { get { return balanceCfg.BuoyancyTemp; } } + public float BuoyancyPress { get { return balanceCfg.BuoyancyPress; } } + public float BuoyancyHumi { get { return balanceCfg.BuoyancyHumi; } } + public double WeightStandardDensity { get { return balanceCfg.WeightStandardDensity; } } + + + /// The state of the mass measurement + public MsrmntState MsrmntState { get { return msrmntState; } } + protected static MsrmntState msrmntState; + + /// The mass after StartMassMeasurement() when MsrmntState == MsrmntState.Valid + public double Mass { get { return Masses[balanceNr]; } } + + /// The time stamp after StartMassMeasurement() when MsrmntState == MsrmntState.Valid + public int MsrmntTimeStamp { get { return msrmntTimeStamp; } } + protected int msrmntTimeStamp; + + public string Format { get { return balanceCfg.Format; } } + + public BalanceDev() + { + } + + /// + /// Constructor + /// + /// Balance properties + public BalanceDev(Generic.IComponentCfg cfg) + : base(cfg) + { + balanceCfg = cfg as BalanceCfg; + if (balanceCfg.IdNr == 1) balance1Cfg = balanceCfg; + + balanceNr = nextBalanceIdx++; + Masses = new double[nextBalanceIdx]; /// (re)initialize the static array of masses of all balances + /// + if (Balances == null || Balances.Length < nextBalanceIdx) + { + BalanceDev[] balancesSoFar = Balances; + Balances = new BalanceDev[nextBalanceIdx]; + if (balancesSoFar != null) for (int i = 0; i < balancesSoFar.Length; i++) Balances[i] = balancesSoFar[i]; + Balances[nextBalanceIdx - 1] = this; + } + + log.Debug(this.ToString()); + } + + public void Initialize() + { + base.Initalize(); + + msrmntState = MsrmntState.Failed; /// Data not valid yet + + if (balanceCfg.DebugLevel == DebugMode.Simulate) return; + + if (balanceCfg.IdNr == 1) + { + stringBuilder = new StringBuilder(40); + string comPortName = "COM" + balanceCfg.ComPortNr.ToString(); + serialPort = new SerialPort(comPortName, balanceCfg.BaudRate, balanceCfg.Parity, balanceCfg.DataBits, balanceCfg.StopBits); + serialPort.Handshake = balanceCfg.Handshake; + serialPort.Open(); + } + + log.FatalFormat("Successfully initialized device {0}", ToString()); + } + + public bool IsEmpty() + { + return (Mass <= balanceCfg.Empty); + } + + public bool IsEmpty(double mass) + { + return (mass <= balanceCfg.Empty); + } + + /// + /// Get a stable mass measurement + /// + public static bool GetStableMassMeasurement(int scaleId, string name) + { + if (balance1Cfg.DebugLevel == DebugMode.Simulate) return true; + + if (msrmntState == MsrmntState.Busy || + msrmntState == MsrmntState.Busy1 || + msrmntState == MsrmntState.Busy2 || + msrmntState == MsrmntState.Busy3) + { + log.WarnFormat("{0} - GetStableMassMeasurement() returns false ... measurementState == {1}", name, msrmntState.ToString()); + return false; + } + + msrmntState = (MsrmntState)((int)MsrmntState.Busy + scaleId); + stringBuilder.Clear(); +#if BADGER_STREDNA_TRAT + string serialData = string.Format("AR WT0{0}01\r\n", 3 - scaleId); /// 2->1 a 1->2 +#else + string serialData = string.Format("AR WT0{0}01\r\n", scaleId); +#endif + serialPort.Write(serialData); + log.InfoFormat("{0} - GetStableMassMeasurement() ... \"{1}\" sent", name, serialData); + return true; + } + + /// + /// Get an immediate mass measurement + /// + public static bool GetImmediateMassMeasurement(int scaleId, string name) + { + if (balance1Cfg.DebugLevel == DebugMode.Simulate) return true; + + if (msrmntState == MsrmntState.Busy || + msrmntState == MsrmntState.Busy1 || + msrmntState == MsrmntState.Busy2 || + msrmntState == MsrmntState.Busy3) + { + log.WarnFormat("{0} - GetImmediateMassMeasurement() returns false ... measurementState == {1}", name, msrmntState.ToString()); + return false; + } + + msrmntState = (MsrmntState)((int)MsrmntState.Busy + scaleId); + stringBuilder.Clear(); +#if BADGER_STREDNA_TRAT + string serialData = string.Format("AR WT0{0}01\r\n", 3 - scaleId); /// 2->1 a 1->2 +#else + string serialData = string.Format("AR WT0{0}01\r\n", scaleId); +#endif + serialPort.Write(serialData); + log.InfoFormat("{0} - GetImmediateMassMeasurement() ... \"{1}\" sent", name, serialData); + return true; + } + + /// + /// Parse characters received from the serial port + /// + public virtual void RunDeviceBefore() + { + if (balanceCfg.DebugLevel == DebugMode.Simulate) + { + Masses[balanceNr] = TestBenchSim.GetSimMass(balanceNr); + msrmntState = MsrmntState.Valid; + msrmntTimeStamp = StateMachine.Time; + return; + } + + if (balanceCfg.IdNr != 1) return; + + if (serialPort == null) + { + log.ErrorFormat("{0} - RunDevice() - serial port closed", Name); + return; + } + + log.DebugFormat("{0} - RunDevice()", Name); + + /// + /// Communication runs only when the state is MsrmntState.Busy# + /// + if (msrmntState != MsrmntState.Busy1 && + msrmntState != MsrmntState.Busy2 && + msrmntState != MsrmntState.Busy3) + { + return; + } + + string justReceived = serialPort.ReadExisting(); + if (justReceived != null && justReceived.Length > 0) + { + log.DebugFormat("RunDevice() received {0}", justReceived); + stringBuilder.Append(justReceived); + } + + string currentBuffer = stringBuilder.ToString(); + int eolPos = currentBuffer.IndexOf("\r\n"); + if (eolPos >= 0) + { + log.InfoFormat("eolPos = {0}", eolPos); + + msrmntTimeStamp = StateMachine.Time; + int balanceIdNr = (int)msrmntState - (int)MsrmntState.Busy; + + /// Get part of the string before EOL + string received = currentBuffer.Substring(0, eolPos); + + /// Put the rest back to the string builder + stringBuilder.Clear(); + if (currentBuffer.Length > eolPos + 2) + { + stringBuilder.Append(currentBuffer.Substring(eolPos + 2)); + } + + if (received.Length == 19 && received.Substring(0, 6).Equals("AR A \"")) + { + string weightStr = received.Substring(6, 12); + while ((weightStr[0] == ' ') && (weightStr.Length > 1)) + { + weightStr = weightStr.Substring(1, weightStr.Length - 1); + } + + double weight = 0; + if (Utils.TryParseSDouble(weightStr, out weight)) + { + Masses[balanceIdNr - 1] = weight * Balances[balanceIdNr - 1].Resolution; + log.InfoFormat("Balance({0}) Valid response=\"{1}\", Mass = {2}kg", balanceIdNr, received, Masses[balanceIdNr - 1]); + + msrmntState = MsrmntState.Valid; + } + else + { + log.WarnFormat("Balance({0}) Failed response=\"{1}\", Error 1 !!!", balanceIdNr, received); + msrmntState = MsrmntState.Failed; + } + } + else + { + //Balances[balanceIdNr - 1].msrmntState = MsrmntState.Failed; + log.WarnFormat("Balance({0}) Failed response=\"{1}\", Error 2 !!!", balanceIdNr, received); + msrmntState = MsrmntState.Failed; + } + } + } + + /// Run this device + public void RunDeviceAfter() + { + } + + /// Stop this device + public void StopDevice() + { + if ((balanceCfg.DebugLevel != DebugMode.Simulate) && (balanceCfg.IdNr == 1) && (serialPort != null)) + { + serialPort.Close(); + serialPort = null; + } + } + + public void StopDevice2() { } + + /// + /// Events: BalanceDone, Error + /// + /// Reference to a variable for 'tara' in kg + /// TaringOp instance reference casted to IOperaton + public IOperation TaringOp(ref DoubleBox tara) + { + return new TaringOp(this, ref tara); + } + + /// + /// Events: BalanceDone, Error + /// + /// Reference to a variable for the measured mass in kg + /// ReadMassOp instance reference casted to IOperaton + public IOperation ReadMassOp(ref DoubleBox mass) + { + return new ReadMassOp(this, ref mass); + } + + /// + /// Events: BalanceDone, Error + /// + /// Reference to a variable for the measured mass in kg + /// Required mass readings count (>= 3) + /// Maximum spread of measurements in kg (otherwise the measurement continues) + /// Method: false = slow (precise), true = fast (immediate) + /// ReadMassAverageOp instance reference casted to IOperaton + public IOperation ReadStableMassOp(ref DoubleBox mass, int readingsCount, double maxSpread, Config.Entities.MassMethod method) + { + return new ReadStableMassOp(this, ref mass, readingsCount, maxSpread, method); + } + + /// + /// Events: BalanceDone, Error + /// + /// Reference to the serialNumber + /// GetBalanceSNOp instance reference casted to IOperaton + public IOperation GetSerNumOp(ref string serialNumber) + { + return null; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Multi/BalanceFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Multi/BalanceFactory.cs new file mode 100644 index 00000000..76a70c31 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Multi/BalanceFactory.cs @@ -0,0 +1,36 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.MettlerToledo.Multi +{ + public class BalanceFactory : IComponentFactory + { + public string ClassName { get { return "MettlerToledo-Multi"; } } + + /// Max. number of components of this class in the system + public int MaxCount { get { return 5; } } + + public IComponent DummyComponent() { return new BalanceDev(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new BalanceDev(cfg); } + + public IComponentCfg DefaultConfig() { return new BalanceCfg(this); } + + public IComponentCfgCtrl CreateCfgCtrl() { return new BalanceCfgCtrl(); } + + public IComponent ComponentFromCmpntCfg(IComponentCfg config, IList components) + { + return new BalanceDev((BalanceCfg)config); + } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(BalanceCfg.Serializer, component, this); + } + + public void ResetStaticProperties() { BalanceDev.ResetStaticProperties(); } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Multi/ReadMassOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Multi/ReadMassOp.cs new file mode 100644 index 00000000..28a7a01e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Multi/ReadMassOp.cs @@ -0,0 +1,81 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// +using System; +using log4net; +using TBF.Boxes; + +namespace TBF.BenchControl.MettlerToledo.Multi +{ + public class ReadMassOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(ReadMassOp)); + public override string ToString() { return string.Format("ReadMassOp(.,.)"); } + + bool started; + bool done; + + /// Set by the constructor + BalanceDev scale; + DoubleBox result; + + /// + /// Events: BalanceDone, Error + /// + /// Balance device instance + /// Required mass readings count (>= 3) + /// Reference to the measured mass in kg + public ReadMassOp(BalanceDev scale, ref DoubleBox result) + { + if (scale == null) throw new ArgumentNullException("scale"); + this.scale = scale; + + this.result = result; + + log.Debug(this.ToString()); + } + + /// Start this operation + public void Start() + { + done = false; + started = BalanceDev.GetImmediateMassMeasurement(scale.IdNr, scale.Name); + } + + /// Run this operation + /// + /// Event.None + /// Event.BalanceDone + /// Event.Error . . . . . Current.Tick == null + /// + public Event Run() + { + if (!started) + { + started = BalanceDev.GetImmediateMassMeasurement(scale.IdNr, scale.Name); + if (!done) + return Event.Busy; + else + return Event.BalanceDone; + } + else if (started && scale.MsrmntState != MsrmntState.Busy) + { + if (scale.MsrmntState == MsrmntState.Valid) result.Val = scale.Mass; + log.InfoFormat("ReadMassOp.Run() ... state={0}, mass={1} ... returning Event.BalanceDone", + scale.MsrmntState, scale.Mass); + done = true; + started = false; + return Event.BalanceDone; /// Mass read OK + } + else + { + return Event.Busy; + } + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Multi/ReadStableMassOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Multi/ReadStableMassOp.cs new file mode 100644 index 00000000..dab06bef --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Multi/ReadStableMassOp.cs @@ -0,0 +1,136 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using log4net; +using TBF.Boxes; + +namespace TBF.BenchControl.MettlerToledo.Multi +{ + /// + /// Operation to read more mass values and average them to obtain a more accurate result. + /// + public class ReadStableMassOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(ReadStableMassOp)); + public override string ToString() { return string.Format("ReadStableMassOp(.,{0},.)", totalReadingsCount); } + + /// Operation specific + double[] massReadings; + int currentReadingsCount; + + /// Set by the constructor + BalanceDev balanceDev; + int totalReadingsCount; + double maxSpread; /// Maximum spread of measurements in kg (otherwise the measurement continues) + Config.Entities.MassMethod method; /// false = slow (precise), true = fast (immediate) + DoubleBox result; + + bool started; + + /// + /// Events: BalanceDone, Error + /// + /// Balance device instance + /// Reference to the measured mass in kg + /// Required mass readings count (>= 3) + /// Maximum spread of measurements in kg (otherwise the measurement continues) + /// Method: false = slow (precise), true = fast (immediate) + public ReadStableMassOp(BalanceDev balanceDev, ref DoubleBox result, int readingsCount, double maxSpread, Config.Entities.MassMethod method) + { + if (balanceDev == null) throw new ArgumentNullException("balanceDev"); + this.balanceDev = balanceDev; + + this.totalReadingsCount = (readingsCount < 4) ? 5 : readingsCount; /// readingsCount is at least 4 + this.maxSpread = (maxSpread == 0) ? (balanceDev.Capacity / 20000.0) : maxSpread; + this.method = method; + + this.result = result; + + log.Debug(this.ToString()); + } + + + /// Start this operation + public void Start() + { + started = false; + currentReadingsCount = 0; + massReadings = new double[totalReadingsCount]; + started = BalanceDev.GetImmediateMassMeasurement(balanceDev.IdNr, balanceDev.Name); + } + + /// Run this operation + /// + /// Event.None + /// Event.BalanceDone + /// Event.Error . . . . . Current.Tick == null + /// + public Event Run() + { + if (currentReadingsCount >= totalReadingsCount) return Event.BalanceDone; /// Mass has already been calculated + + if (balanceDev.MsrmntState == MsrmntState.Busy) return Event.None; + + if (balanceDev.MsrmntState == MsrmntState.Valid) + { + massReadings[currentReadingsCount++] = balanceDev.Mass; + + if (currentReadingsCount == totalReadingsCount) + { +#if true /// OLD_WAY_OF_MASS_CALCULATION + /// Exclude min. and max. value, calculate average + Array.Sort(massReadings); + double calcMass = 0; + for (int i = 1; i < totalReadingsCount - 1; i++) + { + calcMass += massReadings[i]; + } + calcMass = (calcMass / (totalReadingsCount - 2)); + log.InfoFormat("ReadStableMassOp.Run() ... valid mass={0} ... returning Event.BalanceDone", calcMass); + result.Val = calcMass; + return Event.BalanceDone; /// Mass has just been calculated +#else + double minimum = double.MaxValue; + double maximum = double.MinValue; + foreach (double val in massReadings) + { + if (val < minimum) minimum = val; + if (val > maximum) maximum = val; + } + + if ((maximum - minimum) <= maxSpread) + { + double calcMass = 0; + for (int i = 0; i < totalReadingsCount; i++) + { + calcMass += massReadings[i]; + } + calcMass = (calcMass / totalReadingsCount); + log.InfoFormat("ReadStableMassOp.Run() ... valid mass={0} ... returning Event.BalanceDone", calcMass); + result.Val = calcMass; + return Event.BalanceDone; /// Mass has just been calculated + } + else + { + /// Shift data and decrement 'currentReadingsCount' + for (int i = 0; i < totalReadingsCount - 1; i++) + { + massReadings[i] = massReadings[i + 1]; + } + currentReadingsCount--; + } +#endif + } + } + + BalanceDev.GetImmediateMassMeasurement(balanceDev.IdNr, balanceDev.Name); + return Event.None; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Multi/TaringOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Multi/TaringOp.cs new file mode 100644 index 00000000..d34d9443 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Multi/TaringOp.cs @@ -0,0 +1,77 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// +using System; +using log4net; +using TBF.Boxes; + +namespace TBF.BenchControl.MettlerToledo.Multi +{ + public class TaringOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(TaringOp)); + public override string ToString() { return string.Format("TaringOp(.,.)"); } + + bool done; + + /// Set by the constructor + BalanceDev balanceDev; + DoubleBox tara; + + /// + /// Events: BalanceDone, Error + /// + /// Balance device instance + /// Reference to variable for 'tara' in kg + public TaringOp(BalanceDev balanceDev, ref DoubleBox tara) + { + if (balanceDev == null) throw new ArgumentNullException("balanceDev"); + this.balanceDev = balanceDev; + + this.tara = tara; + + log.Debug(this.ToString()); + } + + /// Start this operation + public void Start() + { + tara.Val = 0.0f; // Don't do anything, tara = 0 + done = true; + } + + /// Run this operation + /// + /// Event.None + /// Event.BalanceDone + /// Event.Error . . . . . Current.Tick == null + /// + public Event Run() + { + if (done) return Event.BalanceDone; /// Taring has been done already + + if (balanceDev.MsrmntState == MsrmntState.Busy) return Event.Busy; + + if (balanceDev.MsrmntState == MsrmntState.Overload) + { + tara.Val = balanceDev.Capacity; + done = true; + return Event.BalanceOverload; + } + + if (balanceDev.MsrmntState == MsrmntState.Valid) + { + tara.Val = balanceDev.Mass; + done = true; + return Event.BalanceDone; /// Taring completed + } + + return Event.Busy; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/ReadMassesOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/ReadMassesOp.cs new file mode 100644 index 00000000..3af02322 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/ReadMassesOp.cs @@ -0,0 +1,71 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using log4net; + +namespace TBF.BenchControl.MettlerToledo +{ + public class ReadMassesOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(ReadMassesOp)); + public override string ToString() { return string.Format("ReadMassesOp()"); } + + bool done; + + /// + /// Events: BalanceDone, Error + /// + /// Balance device instance + /// Required mass readings count (>= 3) + /// Reference to the measured mass in kg + public ReadMassesOp() + { + log.Debug(this.ToString()); + } + + /// Start this operation + public void Start() + { + done = false; + + for (int i = 0; i < Standard.BalanceDev.BalancesCount; i++) + { + Standard.BalanceDev.Balances[i].GetImmediateMassMeasurement(); + } + } + + /// Run this operation + /// + /// Event.None + /// Event.BalanceDone + /// Event.Error . . . . . Current.Tick == null + /// + public Event Run() + { + if (done) return Event.BalanceDone; /// Mass has already been read + + for (int i = 0; i < Standard.BalanceDev.BalancesCount; i++) + { + if (Standard.BalanceDev.Balances[i].MsrmntState == MsrmntState.Busy) + { + return Event.None; + } + } + for (int i = 0; i < Multi.BalanceDev.BalancesCount; i++) + { + if (Multi.BalanceDev.Balances[i].MsrmntState == MsrmntState.Busy) + { + return Event.None; + } + } + done = true; + return Event.BalanceDone; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/BalanceCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/BalanceCfg.cs new file mode 100644 index 00000000..03f6b1ff --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/BalanceCfg.cs @@ -0,0 +1,131 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.IO; +using System.Collections.Generic; +using System.IO.Ports; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.MettlerToledo.Standard +{ + public class BalanceCfg : ComponentCfgBase, GenericDevices.IScaleCfg, GenericDevices.ITankDrainingCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(BalanceCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new BalanceCfgCtrl(); } + + /// + /// Serialized parameters + /// + public int ComPortNr; + public int BaudRate; + public Parity Parity; + public int DataBits; + public StopBits StopBits; + public Handshake Handshake; + + /// Max. water mass in 'kg' or volume in 'l' + private float capacity; + public float Capacity { get { return capacity; } set { capacity = value; } } + + /// Mass threshold for 'Tank is empty' in 'kg' (or volume in 'l') + private float empty; + public float Empty { get { return empty; } set { empty = value; } } + + /// Mass threshold for 'Tank is empty' in 'kg' (or volume in 'l') when the drain valve is not open + private float emptyUp; + public float EmptyUp { get { return emptyUp; } set { emptyUp = value; } } + + private string drainValve; + public string DrainValve { get { return drainValve; } set { drainValve = value; } } + + private int drainTimeSec; + public int DrainTimeSec { get { return drainTimeSec; } set { drainTimeSec = value; } } + + public string Format; + + /// Buoyancy related serialized parameters displayed in Metrology tab page + private float buoyancyTemp; + private float buoyancyPress; + private float buoyancyHumi; + private float weightStandardDensity; + public float BuoyancyTemp + { + get { return buoyancyTemp; } + set { buoyancyTemp = value; } + } + public float BuoyancyPress + { + get { return buoyancyPress; } + set { buoyancyPress = value; } + } + public float BuoyancyHumi + { + get { return buoyancyHumi; } + set { buoyancyHumi = value; } + } + public float WeightStandardDensity + { + get { return weightStandardDensity; } + set { weightStandardDensity = value; } + } + + /// Calibration info serialized parameters displayed in Metrology tab page + string calibCertificateNr; + DateTime calibDate; + DateTime calibValidDate; + public string CalibCertificateNr + { + get { return calibCertificateNr; } + set { calibCertificateNr = value; } + } + public DateTime CalibDate + { + get { return calibDate; } + set { calibDate = value; } + } + public DateTime CalibValidDate + { + get { return calibValidDate; } + set { calibValidDate = value; } + } + + + /// Private parameterless constructor invoked by all other (public) constructors + BalanceCfg() + { + Name = "WT1"; + ParentName = string.Empty; + ComPortNr = 3; + BaudRate = 2400; + Parity = System.IO.Ports.Parity.Even; + DataBits = 7; + StopBits = System.IO.Ports.StopBits.One; + Handshake = System.IO.Ports.Handshake.XOnXOff; + Capacity = 200.0f; + Empty = 20.0f; + EmptyUp = 2.0f; + Format = "F3"; + DrainValve = "VB1"; + DrainTimeSec = 180; + BuoyancyTemp = 20.0f; + BuoyancyPress = 1.0f; + BuoyancyHumi = 40.0f; + } + + public BalanceCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, {1}kg, empty={2}kg, emptyUp={3}kg, drainVlv={4}, drainTm={5}s, Com{6}, {7}Bd, {8}-bits, parity={9}, stopBits={10}, {11}", + Name, Capacity, Empty, EmptyUp, DrainValve, DrainTimeSec, ComPortNr, BaudRate, DataBits, Parity, StopBits, Handshake); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/BalanceCfgCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/BalanceCfgCtrl.Designer.cs new file mode 100644 index 00000000..d3681635 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/BalanceCfgCtrl.Designer.cs @@ -0,0 +1,414 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.MettlerToledo.Standard +{ + partial class BalanceCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.handshakeComboBox = new System.Windows.Forms.ComboBox(); + this.stopBitsComboBox = new System.Windows.Forms.ComboBox(); + this.parityComboBox = new System.Windows.Forms.ComboBox(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.handshakeLabel = new System.Windows.Forms.Label(); + this.stopBitsLabel = new System.Windows.Forms.Label(); + this.dataBitsTextBox = new System.Windows.Forms.TextBox(); + this.dataBitsLabel = new System.Windows.Forms.Label(); + this.partityLabel = new System.Windows.Forms.Label(); + this.baudRateTextBox = new System.Windows.Forms.TextBox(); + this.baudRateLabel = new System.Windows.Forms.Label(); + this.comPortNrTextBox = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.capacityLabel = new System.Windows.Forms.Label(); + this.capacityTextBox = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.emptyTextBox = new System.Windows.Forms.TextBox(); + this.emptyLabel = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.drainTimeTextBox = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.formatTextBox = new System.Windows.Forms.TextBox(); + this.formatLabel = new System.Windows.Forms.Label(); + this.drainValveComboBox = new System.Windows.Forms.ComboBox(); + this.drainingValveLabel = new System.Windows.Forms.Label(); + this.label6 = new System.Windows.Forms.Label(); + this.emptyUpTextBox = new System.Windows.Forms.TextBox(); + this.label7 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // handshakeComboBox + // + this.handshakeComboBox.Enabled = false; + this.handshakeComboBox.FormattingEnabled = true; + this.handshakeComboBox.Location = new System.Drawing.Point(236, 222); + this.handshakeComboBox.Name = "handshakeComboBox"; + this.handshakeComboBox.Size = new System.Drawing.Size(43, 21); + this.handshakeComboBox.TabIndex = 29; + // + // stopBitsComboBox + // + this.stopBitsComboBox.Enabled = false; + this.stopBitsComboBox.FormattingEnabled = true; + this.stopBitsComboBox.Location = new System.Drawing.Point(236, 200); + this.stopBitsComboBox.Name = "stopBitsComboBox"; + this.stopBitsComboBox.Size = new System.Drawing.Size(43, 21); + this.stopBitsComboBox.TabIndex = 27; + // + // parityComboBox + // + this.parityComboBox.Enabled = false; + this.parityComboBox.FormattingEnabled = true; + this.parityComboBox.Location = new System.Drawing.Point(100, 222); + this.parityComboBox.Name = "parityComboBox"; + this.parityComboBox.Size = new System.Drawing.Size(43, 21); + this.parityComboBox.TabIndex = 23; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(137, 27); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(142, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(26, 30); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(134, 9); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(89, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComponentName"; + // + // handshakeLabel + // + this.handshakeLabel.AutoSize = true; + this.handshakeLabel.Location = new System.Drawing.Point(162, 225); + this.handshakeLabel.Name = "handshakeLabel"; + this.handshakeLabel.Size = new System.Drawing.Size(62, 13); + this.handshakeLabel.TabIndex = 28; + this.handshakeLabel.Text = "Handshake"; + // + // stopBitsLabel + // + this.stopBitsLabel.AutoSize = true; + this.stopBitsLabel.Location = new System.Drawing.Point(162, 203); + this.stopBitsLabel.Name = "stopBitsLabel"; + this.stopBitsLabel.Size = new System.Drawing.Size(49, 13); + this.stopBitsLabel.TabIndex = 26; + this.stopBitsLabel.Text = "Stop Bits"; + // + // dataBitsTextBox + // + this.dataBitsTextBox.Enabled = false; + this.dataBitsTextBox.Location = new System.Drawing.Point(236, 178); + this.dataBitsTextBox.Name = "dataBitsTextBox"; + this.dataBitsTextBox.Size = new System.Drawing.Size(43, 20); + this.dataBitsTextBox.TabIndex = 25; + // + // dataBitsLabel + // + this.dataBitsLabel.AutoSize = true; + this.dataBitsLabel.Location = new System.Drawing.Point(162, 181); + this.dataBitsLabel.Name = "dataBitsLabel"; + this.dataBitsLabel.Size = new System.Drawing.Size(50, 13); + this.dataBitsLabel.TabIndex = 24; + this.dataBitsLabel.Text = "Data Bits"; + // + // partityLabel + // + this.partityLabel.AutoSize = true; + this.partityLabel.Location = new System.Drawing.Point(26, 225); + this.partityLabel.Name = "partityLabel"; + this.partityLabel.Size = new System.Drawing.Size(33, 13); + this.partityLabel.TabIndex = 22; + this.partityLabel.Text = "Parity"; + // + // baudRateTextBox + // + this.baudRateTextBox.Enabled = false; + this.baudRateTextBox.Location = new System.Drawing.Point(100, 200); + this.baudRateTextBox.Name = "baudRateTextBox"; + this.baudRateTextBox.Size = new System.Drawing.Size(43, 20); + this.baudRateTextBox.TabIndex = 21; + // + // baudRateLabel + // + this.baudRateLabel.AutoSize = true; + this.baudRateLabel.Location = new System.Drawing.Point(26, 203); + this.baudRateLabel.Name = "baudRateLabel"; + this.baudRateLabel.Size = new System.Drawing.Size(53, 13); + this.baudRateLabel.TabIndex = 20; + this.baudRateLabel.Text = "Baud rate"; + // + // comPortNrTextBox + // + this.comPortNrTextBox.Enabled = false; + this.comPortNrTextBox.Location = new System.Drawing.Point(100, 178); + this.comPortNrTextBox.Name = "comPortNrTextBox"; + this.comPortNrTextBox.Size = new System.Drawing.Size(43, 20); + this.comPortNrTextBox.TabIndex = 19; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(26, 181); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(67, 13); + this.label1.TabIndex = 18; + this.label1.Text = "Serial port #:"; + // + // capacityLabel + // + this.capacityLabel.AutoSize = true; + this.capacityLabel.Location = new System.Drawing.Point(26, 82); + this.capacityLabel.Name = "capacityLabel"; + this.capacityLabel.Size = new System.Drawing.Size(75, 13); + this.capacityLabel.TabIndex = 5; + this.capacityLabel.Text = "Tank capacity"; + // + // capacityTextBox + // + this.capacityTextBox.Enabled = false; + this.capacityTextBox.Location = new System.Drawing.Point(137, 79); + this.capacityTextBox.Name = "capacityTextBox"; + this.capacityTextBox.Size = new System.Drawing.Size(43, 20); + this.capacityTextBox.TabIndex = 6; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(186, 82); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(19, 13); + this.label2.TabIndex = 7; + this.label2.Text = "kg"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(186, 104); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(19, 13); + this.label3.TabIndex = 10; + this.label3.Text = "kg"; + // + // emptyTextBox + // + this.emptyTextBox.Enabled = false; + this.emptyTextBox.Location = new System.Drawing.Point(137, 101); + this.emptyTextBox.Name = "emptyTextBox"; + this.emptyTextBox.Size = new System.Drawing.Size(43, 20); + this.emptyTextBox.TabIndex = 9; + // + // emptyLabel + // + this.emptyLabel.AutoSize = true; + this.emptyLabel.Location = new System.Drawing.Point(26, 104); + this.emptyLabel.Name = "emptyLabel"; + this.emptyLabel.Size = new System.Drawing.Size(109, 13); + this.emptyLabel.TabIndex = 8; + this.emptyLabel.Text = "Tank empty threshold"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(186, 149); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(24, 13); + this.label4.TabIndex = 17; + this.label4.Text = "sec"; + // + // drainTimeTextBox + // + this.drainTimeTextBox.Enabled = false; + this.drainTimeTextBox.Location = new System.Drawing.Point(137, 146); + this.drainTimeTextBox.Name = "drainTimeTextBox"; + this.drainTimeTextBox.Size = new System.Drawing.Size(43, 20); + this.drainTimeTextBox.TabIndex = 16; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(26, 149); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(54, 13); + this.label5.TabIndex = 15; + this.label5.Text = "Drain time"; + // + // formatTextBox + // + this.formatTextBox.Enabled = false; + this.formatTextBox.Location = new System.Drawing.Point(137, 49); + this.formatTextBox.Name = "formatTextBox"; + this.formatTextBox.Size = new System.Drawing.Size(43, 20); + this.formatTextBox.TabIndex = 4; + // + // formatLabel + // + this.formatLabel.AutoSize = true; + this.formatLabel.Location = new System.Drawing.Point(26, 52); + this.formatLabel.Name = "formatLabel"; + this.formatLabel.Size = new System.Drawing.Size(76, 13); + this.formatLabel.TabIndex = 3; + this.formatLabel.Text = "Decimal points"; + // + // drainValveComboBox + // + this.drainValveComboBox.Enabled = false; + this.drainValveComboBox.FormattingEnabled = true; + this.drainValveComboBox.Location = new System.Drawing.Point(137, 123); + this.drainValveComboBox.Name = "drainValveComboBox"; + this.drainValveComboBox.Size = new System.Drawing.Size(143, 21); + this.drainValveComboBox.TabIndex = 14; + // + // drainingValveLabel + // + this.drainingValveLabel.AutoSize = true; + this.drainingValveLabel.Location = new System.Drawing.Point(26, 126); + this.drainingValveLabel.Name = "drainingValveLabel"; + this.drainingValveLabel.Size = new System.Drawing.Size(61, 13); + this.drainingValveLabel.TabIndex = 13; + this.drainingValveLabel.Text = "Drain valve"; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(285, 104); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(19, 13); + this.label6.TabIndex = 12; + this.label6.Text = "kg"; + // + // emptyUpTextBox + // + this.emptyUpTextBox.Enabled = false; + this.emptyUpTextBox.Location = new System.Drawing.Point(236, 101); + this.emptyUpTextBox.Name = "emptyUpTextBox"; + this.emptyUpTextBox.Size = new System.Drawing.Size(43, 20); + this.emptyUpTextBox.TabIndex = 11; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(225, 87); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(83, 13); + this.label7.TabIndex = 30; + this.label7.Text = "not draining (up)"; + // + // BalanceCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.label7); + this.Controls.Add(this.label6); + this.Controls.Add(this.emptyUpTextBox); + this.Controls.Add(this.drainValveComboBox); + this.Controls.Add(this.drainingValveLabel); + this.Controls.Add(this.formatTextBox); + this.Controls.Add(this.formatLabel); + this.Controls.Add(this.label4); + this.Controls.Add(this.drainTimeTextBox); + this.Controls.Add(this.label5); + this.Controls.Add(this.label3); + this.Controls.Add(this.emptyTextBox); + this.Controls.Add(this.emptyLabel); + this.Controls.Add(this.label2); + this.Controls.Add(this.capacityTextBox); + this.Controls.Add(this.capacityLabel); + this.Controls.Add(this.handshakeComboBox); + this.Controls.Add(this.stopBitsComboBox); + this.Controls.Add(this.parityComboBox); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Controls.Add(this.handshakeLabel); + this.Controls.Add(this.stopBitsLabel); + this.Controls.Add(this.dataBitsTextBox); + this.Controls.Add(this.dataBitsLabel); + this.Controls.Add(this.partityLabel); + this.Controls.Add(this.baudRateTextBox); + this.Controls.Add(this.baudRateLabel); + this.Controls.Add(this.comPortNrTextBox); + this.Controls.Add(this.label1); + this.Name = "BalanceCfgCtrl"; + this.Size = new System.Drawing.Size(327, 250); + this.Load += new System.EventHandler(this.BalanceCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ComboBox handshakeComboBox; + private System.Windows.Forms.ComboBox stopBitsComboBox; + private System.Windows.Forms.ComboBox parityComboBox; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.Label handshakeLabel; + private System.Windows.Forms.Label stopBitsLabel; + private System.Windows.Forms.TextBox dataBitsTextBox; + private System.Windows.Forms.Label dataBitsLabel; + private System.Windows.Forms.Label partityLabel; + private System.Windows.Forms.TextBox baudRateTextBox; + private System.Windows.Forms.Label baudRateLabel; + private System.Windows.Forms.TextBox comPortNrTextBox; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label capacityLabel; + private System.Windows.Forms.TextBox capacityTextBox; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox emptyTextBox; + private System.Windows.Forms.Label emptyLabel; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox drainTimeTextBox; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.TextBox formatTextBox; + private System.Windows.Forms.Label formatLabel; + private System.Windows.Forms.ComboBox drainValveComboBox; + private System.Windows.Forms.Label drainingValveLabel; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TextBox emptyUpTextBox; + private System.Windows.Forms.Label label7; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/BalanceCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/BalanceCfgCtrl.cs new file mode 100644 index 00000000..4e6940e2 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/BalanceCfgCtrl.cs @@ -0,0 +1,238 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.Windows.Forms; +using System.IO.Ports; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.MettlerToledo.Standard +{ + public partial class BalanceCfgCtrl : UserControl, IComponentCfgCtrl + { + ComponentParametersDlg parent; + + public bool ShowMore { get { return false; } } + + BalanceCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as BalanceCfg; + Redraw(); + } + } + + + int GetParityIx(Parity par) + { + if (par == Parity.None) return 0; + if (par == Parity.Even) return 0; + if (par == Parity.Odd) return 0; + return -1; + } + Parity GetParity(string str) + { + if (str.Equals(Parity.None.ToString())) return Parity.None; + if (str.Equals(Parity.Even.ToString())) return Parity.Even; + if (str.Equals(Parity.Odd.ToString())) return Parity.Odd; + return (Parity)(-1); + } + + int GetStopBitsIx(StopBits sb) + { + if (sb == StopBits.None) return 0; + if (sb == StopBits.One) return 1; + if (sb == StopBits.OnePointFive) return 2; + if (sb == StopBits.Two) return 3; + return -1; + } + StopBits GetStopBits(string str) + { + if (str.Equals(StopBits.None.ToString())) return StopBits.None; + if (str.Equals(StopBits.One.ToString())) return StopBits.One; + if (str.Equals(StopBits.OnePointFive.ToString())) return StopBits.OnePointFive; + if (str.Equals(StopBits.Two.ToString())) return StopBits.Two; + return (StopBits)(-1); + } + + int GetHandshakeIx(Handshake par) + { + if (par == Handshake.None) return 0; + if (par == Handshake.RequestToSend) return 0; + if (par == Handshake.XOnXOff) return 0; + return -1; + } + Handshake GetHandshake(string str) + { + if (str.Equals(Handshake.None.ToString())) return Handshake.None; + if (str.Equals(Handshake.RequestToSend.ToString())) return Handshake.RequestToSend; + if (str.Equals(Handshake.XOnXOff.ToString())) return Handshake.XOnXOff; + return (Handshake)(-1); + } + + + public BalanceCfgCtrl() + { + InitializeComponent(); + + parityComboBox.Items.Add(Parity.None.ToString()); + parityComboBox.Items.Add(Parity.Even.ToString()); + parityComboBox.Items.Add(Parity.Odd.ToString()); + + stopBitsComboBox.Items.Add(StopBits.None.ToString()); + stopBitsComboBox.Items.Add(StopBits.One.ToString()); + stopBitsComboBox.Items.Add(StopBits.OnePointFive.ToString()); + stopBitsComboBox.Items.Add(StopBits.Two.ToString()); + + handshakeComboBox.Items.Add(Handshake.None.ToString()); + handshakeComboBox.Items.Add(Handshake.RequestToSend.ToString()); + handshakeComboBox.Items.Add(Handshake.XOnXOff.ToString()); + } + + private void BalanceCfgCtrl_Load(object sender, EventArgs e) + { + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + + if (parent.TbfComponents != null) + { + drainValveComboBox.Items.Add("---"); + foreach (var cmpnt in parent.TbfComponents) + { + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is Elde.Valve.ValveFactory) + { + drainValveComboBox.Items.Add(cmpnt.Name); + } + } + } + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + capacityTextBox.Text = config.Capacity.ToString(); + emptyTextBox.Text = config.Empty.ToString(); + emptyUpTextBox.Text = config.EmptyUp.ToString(); + formatTextBox.Text = (config.Format.Length > 1) ? config.Format.Substring(1) : config.Format; + drainTimeTextBox.Text = config.DrainTimeSec.ToString(); + drainValveComboBox.Text = string.IsNullOrEmpty(config.DrainValve) ? "---" : config.DrainValve; + + comPortNrTextBox.Text = config.ComPortNr.ToString(); + baudRateTextBox.Text = config.BaudRate.ToString(); + parityComboBox.Text = config.Parity.ToString(); + dataBitsTextBox.Text = config.DataBits.ToString(); + stopBitsComboBox.Text = config.StopBits.ToString(); + handshakeComboBox.Text = config.Handshake.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + capacityTextBox.Enabled = true; + emptyTextBox.Enabled = true; + emptyUpTextBox.Enabled = true; + formatTextBox.Enabled = true; + drainTimeTextBox.Enabled = true; + drainValveComboBox.Enabled = true; + + comPortNrTextBox.Enabled = true; + baudRateTextBox.Enabled = true; + parityComboBox.Enabled = true; + dataBitsTextBox.Enabled = true; + stopBitsComboBox.Enabled = true; + handshakeComboBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!int.TryParse(comPortNrTextBox.Text, out dummy) || dummy < 1 || dummy > 999) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Serial Port Number' is not valid"; + } + if (!int.TryParse(baudRateTextBox.Text, out dummy) || dummy < 150 || dummy > 115200) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Baud Rate' is not valid"; + } + if (!int.TryParse(dataBitsTextBox.Text, out dummy) || dummy < 7 || dummy > 8) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Data Bits' is not valid"; + } + float mass; + if (!Utils.TryParseUFloat(capacityTextBox.Text, out mass) || mass <= 0) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Tank Capacity' is not valid"; + } + if (!Utils.TryParseUFloat(emptyTextBox.Text, out mass) || mass <= 0) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Tank Empty' is not valid"; + } + if (!Utils.TryParseUFloat(emptyUpTextBox.Text, out mass) || mass <= 0) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Tank Empty Up' is not valid"; + } + if (!int.TryParse(formatTextBox.Text, out dummy) || dummy < 0 || dummy > 9) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Decimal points' should be between 0 and 9"; + } + if (!drainValveComboBox.Items.Contains(drainValveComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Drain valve'"; + } + if (!int.TryParse(drainTimeTextBox.Text, out dummy) || dummy < 1 || dummy > 999) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Tank drain time' should be between 1 and 999 sec"; + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.Capacity = Utils.ParseUFloat(capacityTextBox.Text); + config.Empty = Utils.ParseUFloat(emptyTextBox.Text); + config.EmptyUp = Utils.ParseUFloat(emptyUpTextBox.Text); + config.Format = "F" + formatTextBox.Text; + config.DrainTimeSec = int.Parse(drainTimeTextBox.Text); + config.DrainValve = drainValveComboBox.Text.Equals("---") ? string.Empty : drainValveComboBox.Text; + + config.ComPortNr = int.Parse(comPortNrTextBox.Text); + config.BaudRate = int.Parse(baudRateTextBox.Text); + config.Parity = GetParity(parityComboBox.SelectedItem.ToString()); + config.DataBits = int.Parse(dataBitsTextBox.Text); + config.StopBits = GetStopBits(stopBitsComboBox.SelectedItem.ToString()); + config.Handshake = GetHandshake(handshakeComboBox.SelectedItem.ToString()); + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/BalanceCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/BalanceCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/BalanceCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/BalanceDev.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/BalanceDev.cs new file mode 100644 index 00000000..3f79a845 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/BalanceDev.cs @@ -0,0 +1,515 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using System.IO.Ports; +using log4net; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Boxes; + +namespace TBF.BenchControl.MettlerToledo.Standard +{ + /// + /// Mettler Toledo ICS4_5 Weighting terminal connected via serial interface (RS232) + /// + /// + /// Implemented and tested on 15.10.2013 by Milan Hanajik + /// + public class BalanceDev : TankDraining, IDevice, GenericDevices.IScale + { + /// + /// Info: StartMassMeasurement() and "Balnce response = .., Mass = ..." + /// Warn: Start measurement when busy is true + /// + private static readonly ILog log = LogManager.GetLogger(typeof(BalanceDev)); + public override string ToString() { return string.Format("MettlerToledo.Standard.Balance({0})", Cfg.ToString(1)); } + + protected readonly BalanceCfg balanceCfg; + + /// + /// Enumeration of balances via static fields and methods + /// + static int nextBalanceIdx = 0; + public static new void ResetStaticProperties() + { + nextBalanceIdx = 0; + } + public static int BalancesCount { get { return nextBalanceIdx; } } + public static BalanceDev[] Balances; + public static double[] Masses; + /// + protected int balanceNr; /// 0-based balance number + + protected SerialPort serialPort; + protected StringBuilder stringBuilder; + + public int ScaleNr { get { return balanceNr; } } + public double Capacity { get { return balanceCfg.Capacity; } } + public int EmptyTimeSec { get { return balanceCfg.DrainTimeSec; } } + + /// Buoyancy + public float BuoyancyTemp { get { return balanceCfg.BuoyancyTemp; } } + public float BuoyancyPress { get { return balanceCfg.BuoyancyPress; } } + public float BuoyancyHumi { get { return balanceCfg.BuoyancyHumi; } } + public double WeightStandardDensity { get { return balanceCfg.WeightStandardDensity; } } + + + /// The state of the mass measurement + public MsrmntState MsrmntState { get { return msrmntState; } } + protected MsrmntState msrmntState; + + /// Time since the last serial command in seconds + public int MsrmntTime; + + /// The mass after StartMassMeasurement() when MsrmntState == MsrmntState.Valid + public double Mass { get { return mass; } } + protected double mass; + + /// The time stamp after StartMassMeasurement() when MsrmntState == MsrmntState.Valid + public int MsrmntTimeStamp { get { return msrmntTimeStamp; } } + protected int msrmntTimeStamp; + + public string Format { get { return balanceCfg.Format; } } + + public BalanceDev() + { + } + + /// + /// Constructor + /// + /// Balance properties + /// A list of components loaded so far + public BalanceDev(Generic.IComponentCfg cfg) + : base(cfg) + { + balanceCfg = cfg as BalanceCfg; + + balanceNr = nextBalanceIdx++; + Masses = new double[nextBalanceIdx]; /// (re)initialize the static array of masses of all balances + /// + if (Balances == null || Balances.Length < nextBalanceIdx) + { + BalanceDev[] balancesSoFar = Balances; + Balances = new BalanceDev[nextBalanceIdx]; + if (balancesSoFar != null) for (int i = 0; i < balancesSoFar.Length; i++) Balances[i] = balancesSoFar[i]; + Balances[nextBalanceIdx - 1] = this; + } + + log.Debug(this.ToString()); + } + + public void Initialize() + { + base.Initalize(); + + msrmntState = MsrmntState.Failed; /// Data not valid yet + MsrmntTime = 0; + + if (balanceCfg.DebugLevel == DebugMode.Simulate) return; + + stringBuilder = new StringBuilder(40); + string comPortName = "COM" + balanceCfg.ComPortNr.ToString(); + serialPort = new SerialPort(comPortName, balanceCfg.BaudRate, balanceCfg.Parity, balanceCfg.DataBits, balanceCfg.StopBits); + serialPort.Handshake = balanceCfg.Handshake; + serialPort.Open(); + + log.FatalFormat("Successfully initialized device {0}", ToString()); + } + + public override bool IsEmpty() + { + return DrainValve.State ? (mass <= balanceCfg.Empty) : (mass <= balanceCfg.EmptyUp); + } + + public bool IsEmpty(double mass) + { + return DrainValve.State ? (mass <= balanceCfg.Empty) : (mass <= balanceCfg.EmptyUp); + } + + public void ZeroWhenStable() + { + if (balanceCfg.DebugLevel == DebugMode.Simulate) return; + + if (msrmntState == MsrmntState.Busy) + { + log.WarnFormat("{0} - ZeroWhenStable() returns without starting zeroing the scale because measurementState == MeasurementState.Busy", Name); + return; + } + + log.InfoFormat("{0} - ZeroWhenStable()", Name); + + msrmntState = MsrmntState.Busy; + MsrmntTime = 0; + stringBuilder.Clear(); + serialPort.Write("Z\r\n"); + } + + public virtual void Taring() + { + if (balanceCfg.DebugLevel == DebugMode.Simulate) return; + + if (msrmntState == MsrmntState.Busy) + { + log.WarnFormat("{0} - Taring() returns without starting taring the scale because measurementState == MeasurementState.Busy", Name); + return; + } + + log.InfoFormat("{0} - Taring()", Name); + + msrmntState = MsrmntState.Busy; + MsrmntTime = 0; + stringBuilder.Clear(); + serialPort.Write("T\r\n"); + } + + /// + /// Get a stable mass measurement + /// + public void GetStableMassMeasurement() + { + if (balanceCfg.DebugLevel == DebugMode.Simulate) return; + + if (msrmntState == MsrmntState.Busy) + { + log.WarnFormat("{0} - GetStableMassMeasurement() returns without starting a measurement because measurementState == MeasurementState.Busy", Name); + return; + } + + log.InfoFormat("{0} - GetStableMassMeasurement()", Name); + + msrmntState = MsrmntState.Busy; + MsrmntTime = 0; + stringBuilder.Clear(); + serialPort.Write("S\r\n"); + } + + /// + /// Get an immediate mass measurement + /// + public void GetImmediateMassMeasurement() + { + if (balanceCfg.DebugLevel == DebugMode.Simulate || serialPort == null) return; + + if (msrmntState == MsrmntState.Busy) + { + log.WarnFormat("{0} - GetImmediateMassMeasurement() returns without starting a measurement because measurementState == MeasurementState.Busy", Name); + return; + } + + log.InfoFormat("{0} - GetImmediateMassMeasurement()", Name); + + msrmntState = MsrmntState.Busy; + MsrmntTime = 0; + stringBuilder.Clear(); + serialPort.Write("SI\r\n"); + } + + /// Units for SetUnits() argument + public enum Units + { + g, + kg, + t, + lb, + oz + } + + /// + /// Get the serial number + /// + /// After a successful SetUnits(kg) mass is still sent in g. MH 15.10.2013 + public void SetUnits(Units unit) + { + if (balanceCfg.DebugLevel == DebugMode.Simulate) return; + + if (msrmntState == MsrmntState.Busy) + { + log.WarnFormat("{0} - SetUnits() returns without setting the units because measurementState == MeasurementState.Busy", Name); + return; + } + + log.InfoFormat("{0} - SetUnits({1})", Name, unit); + + msrmntState = MsrmntState.Busy; + stringBuilder.Clear(); + switch (unit) + { + case Units.g: serialPort.Write("U g\r\n"); break; + case Units.kg: serialPort.Write("U kg\r\n"); break; + case Units.t: serialPort.Write("U t\r\n"); break; + case Units.lb: serialPort.Write("U lb\r\n"); break; + case Units.oz: serialPort.Write("U oz\r\n"); break; + } + } + + /// + /// Parse characters received from the serial port + /// + public virtual void RunDeviceBefore() + { + base.RunBefore(); + + if (balanceCfg.DebugLevel == DebugMode.Simulate) + { + Masses[balanceNr] = TestBenchSim.GetSimMass(balanceNr); + msrmntState = MsrmntState.Valid; + msrmntTimeStamp = StateMachine.Time; + return; + } + + if (serialPort == null) + { + log.ErrorFormat("{0} - RunDevice() - serial port closed", Name); + return; + } + + log.DebugFormat("{0} - RunDeviceBefore()", Name); + + if (msrmntState != MsrmntState.Busy) return; /// No measurement in progress + + string justReceived = serialPort.ReadExisting(); + if (justReceived != null && justReceived.Length > 0) + { + log.DebugFormat("{0} - RunDeviceBefore() received {1}", Name, justReceived); + stringBuilder.Append(justReceived); + } + + string currentBuffer = stringBuilder.ToString(); + int eolPos = currentBuffer.IndexOf("\r\n"); + if (eolPos >= 0) + { + msrmntTimeStamp = StateMachine.Time; + + /// Get part of the string before EOL + string received = currentBuffer.Substring(0, eolPos); + + /// Put the rest back to the string builder + stringBuilder.Clear(); + if (currentBuffer.Length > eolPos + 2) + { + stringBuilder.Append(currentBuffer.Substring(eolPos + 2)); + } + + while (true) + { + string tmp = received.Replace(" ", " "); + if (tmp.Length == received.Length) break; + received = tmp; + } + + string[] fields = received.Split(new char[] { ' ' }); + + if (fields.Length == 1 && fields[0].Equals("ZA")) /// Zero when stable + { + mass = 0; + Masses[balanceNr] = mass; + //msrmntState = MsrmntState.Valid; + log.InfoFormat("{0} - Balance response = \"{1}\"", Name, received); + return; + } + else if (fields.Length < 2) + { + msrmntState = MsrmntState.Failed; + log.WarnFormat("{0} - Balance response = \"{1}\", Unexpected error !!!", Name, received); + return; + } + + if (fields[0].Equals("Z")) /// Zero when stable + { + if (fields.Length == 2 && fields[1].Equals("A")) + { + mass = 0; + Masses[balanceNr] = mass; + //msrmntState = MsrmntState.Valid; + log.InfoFormat("{0} - Balance response = \"{1}\"", Name, received); + return; + } + else + { + msrmntState = MsrmntState.Failed; + log.WarnFormat("{0} - Balance response = \"{1}\", error !!!", Name, received); + } + } + else if (fields[0].Equals("S")) /// Stable mass: field[1] = field[2] = "kg" + { + if (fields.Length == 3 && + double.TryParse(fields[1], + NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, + CultureInfo.InvariantCulture, + out mass)) + { + if (fields[2].Equals("g")) mass /= 1000.0f; + if (fields[2].Equals("t")) mass *= 1000.0f; + Masses[balanceNr] = mass; + msrmntState = MsrmntState.Valid; + log.InfoFormat("{0} - Balance response = \"{1}\", Mass = {2}", Name, received, mass); + } + else if (fields.Length == 4 && (fields[1].Equals("S") || fields[1].Equals("D")) && + double.TryParse(fields[2], + NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, + CultureInfo.InvariantCulture, + out mass)) + { + if (fields[3].Equals("g")) mass /= 1000.0f; + if (fields[3].Equals("t")) mass *= 1000.0f; + Masses[balanceNr] = mass; + msrmntState = MsrmntState.Valid; + log.InfoFormat("{0} - Balance response = \"{1}\", Mass = {2}", Name, received, mass); + } + else if (fields.Length == 2 && fields[1].Equals("-")) + { + mass = 0; + Masses[balanceNr] = mass; + msrmntState = MsrmntState.Valid; + log.InfoFormat("{0} - Balance response = \"{1}\", Mass = {2}", Name, received, mass); + } + else + { + msrmntState = MsrmntState.Failed; + log.WarnFormat("{0} Balance response = \"{1}\", Overload or and unexpected error !!!", Name, received); + bool b = double.TryParse(fields[1], NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out mass); + + } + } + else if (fields[0].Equals("SD")) /// Dynamic mass: field[1] = field[2] = "kg" + { + if (fields.Length >= 3 && + double.TryParse(fields[1], + NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, + CultureInfo.InvariantCulture, + out mass)) + { + if (fields[2].Equals("g")) mass /= 1000.0f; + if (fields[2].Equals("t")) mass *= 1000.0f; + Masses[balanceNr] = mass; + msrmntState = MsrmntState.Valid; + log.InfoFormat("{0} - Balance response = \"{1}\", Mass = {2}", Name, received, mass); + } + else if (fields.Length == 2 && fields[1].Equals("-")) + { + mass = 0; + Masses[balanceNr] = mass; + msrmntState = MsrmntState.Valid; + log.InfoFormat("{0} - Balance response = \"{1}\", Mass = {2}", Name, received, mass); + } + else + { + msrmntState = MsrmntState.Failed; + log.WarnFormat("{0} - Balance response = \"{1}\", Overload or and unexpected error !!!", Name, received); + bool b = double.TryParse(fields[1], NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out mass); + + } + } + else if (fields[0].Equals("TB")) /// Taring + { + if (fields.Length >= 3 && + double.TryParse(fields[1], + NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, + CultureInfo.InvariantCulture, + out mass)) + { + if (fields[2].Equals("g")) mass /= 1000.0f; + if (fields[2].Equals("t")) mass *= 1000.0f; + msrmntState = MsrmntState.Valid; + log.InfoFormat("{0} - Balance response = \"{1}\", Tara = {2}", Name, received, mass); + } + else + { + msrmntState = MsrmntState.Failed; + log.WarnFormat("{0} - Balance response = \"{1}\", Overload or and unexpected error !!!", Name, received); + } + } + else if (fields[0].Equals("T")) /// Taring + { + if (fields.Length >= 4 && fields[1].Equals("S") && + double.TryParse(fields[2], + NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, + CultureInfo.InvariantCulture, + out mass)) + { + if (fields[3].Equals("g")) mass /= 1000.0f; + if (fields[3].Equals("t")) mass *= 1000.0f; + msrmntState = MsrmntState.Valid; + log.InfoFormat("{0} - Balance response = \"{1}\", Tara = {2}", Name, received, mass); + } + else + { + msrmntState = MsrmntState.Failed; + log.WarnFormat("{0} - Balance response = \"{1}\", Overload or and unexpected error !!!", Name, received); + } + } + else + { + msrmntState = MsrmntState.Failed; + log.WarnFormat("{0} - Balance response = \"{1}\", Unexpected error !!!", Name, received); + } + } + } + + /// Run this device + public void RunDeviceAfter() + { + base.RunAfter(); + } + + /// Stop this device + public void StopDevice() + { + if ((balanceCfg.DebugLevel != DebugMode.Simulate) && (serialPort != null)) + { + serialPort.Close(); + serialPort = null; + } + } + + public void StopDevice2() { } + + /// + /// Events: BalanceDone, Error + /// + /// Reference to a variable for 'tara' in kg + /// TaringOp instance reference casted to IOperaton + public IOperation TaringOp(ref DoubleBox tara) + { + return new TaringOp(this, ref tara); + } + + /// + /// Events: BalanceDone, Error + /// + /// Reference to a variable for the measured mass in kg + /// ReadMassOp instance reference casted to IOperaton + public IOperation ReadMassOp(ref DoubleBox mass) + { + return new ReadMassOp(this, ref mass); + } + + /// + /// Events: BalanceDone, Error + /// + /// Reference to a variable for the measured mass in kg + /// Required mass readings count (>= 3) + /// Maximum spread of measurements in kg (otherwise the measurement continues) + /// Method: false = slow (precise), true = fast (immediate) + /// ReadMassAverageOp instance reference casted to IOperaton + public IOperation ReadStableMassOp(ref DoubleBox mass, int readingsCount, double maxSpread, Config.Entities.MassMethod method) + { + return new ReadStableMassOp(this, ref mass, readingsCount, maxSpread, method); + } + + /// + /// Events: BalanceDone, Error + /// + /// Reference to the serialNumber + /// GetBalanceSNOp instance reference casted to IOperaton + public virtual IOperation GetSerNumOp(ref string serialNumber) + { + return null; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/BalanceFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/BalanceFactory.cs new file mode 100644 index 00000000..a80df903 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/BalanceFactory.cs @@ -0,0 +1,36 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.MettlerToledo.Standard +{ + public class BalanceFactory : IComponentFactory + { + public string ClassName { get { return "MettlerToledo Balance"; } } + + /// Max. number of components of this class in the system + public int MaxCount { get { return 5; } } + + public IComponent DummyComponent() { return new BalanceDev(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new BalanceDev(cfg); } + + public IComponentCfg DefaultConfig() { return new BalanceCfg(this); } + + public IComponentCfgCtrl CreateCfgCtrl() { return new BalanceCfgCtrl(); } + + public IComponent ComponentFromCmpntCfg(IComponentCfg config, IList components) + { + return new BalanceDev((BalanceCfg)config); + } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(BalanceCfg.Serializer, component, this); + } + + public void ResetStaticProperties() { BalanceDev.ResetStaticProperties(); } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/BalanceNewDev.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/BalanceNewDev.cs new file mode 100644 index 00000000..9ecd0bae --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/BalanceNewDev.cs @@ -0,0 +1,271 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Globalization; +using log4net; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.MettlerToledo.Standard +{ + /// + /// Mettler Toledo ICS4_5 Weighting terminal connected via serial interface (RS232) + /// + /// + /// Implemented and tested on 15.10.2013 by Milan Hanajik + /// + public class BalanceNewDev : BalanceDev, IDevice, GenericDevices.IScale + { + /// + /// Info: StartMassMeasurement() and "Balnce response = .., Mass = ..." + /// Warn: Start measurement when busy is true + /// + private static readonly ILog log = LogManager.GetLogger(typeof(BalanceNewDev)); + public override string ToString() { return string.Format("MettlerToledo.Standard.BalanceNew({0})", Cfg.ToString(1)); } + + /// Serial number after GetSerialNumber() when MsrmntState == MsrmntState.Valid + public string SerialNumber { get { return serialNumber; } } + string serialNumber; + + public BalanceNewDev() + { + } + + public BalanceNewDev(Generic.IComponentCfg cfg) + : base(cfg) + { + log.Debug(this.ToString()); + } + + /// + /// Get the serial number + /// + public void GetSerialNumber() + { + if (balanceCfg.DebugLevel == DebugMode.Simulate) return; + + if (msrmntState == MsrmntState.Busy) + { + log.WarnFormat("{0} - GetSerialNumber() returns without getting the s/n because measurementState == MeasurementState.Busy", Name); + return; + } + + log.WarnFormat("{0} - GetSerialNumber()", Name); + + msrmntState = MsrmntState.Busy; + stringBuilder.Clear(); + serialPort.Write(new byte[] { (byte)'I', (byte)'4', (byte)0x0D, (byte)0x0A }, 0, 4); + } + + /// + /// Parse characters received from the serial port + /// + public override void RunDeviceBefore() + { + base.RunBefore(); + + if (balanceCfg.DebugLevel == DebugMode.Simulate) + { + mass = TestBenchSim.GetSimMass(balanceNr); + Masses[balanceNr] = mass; + serialNumber = "1234567890"; + msrmntState = MsrmntState.Valid; + msrmntTimeStamp = StateMachine.Time; + return; + } + + if (serialPort == null) + { + log.ErrorFormat("{0} - RunDevice() - serial port closed", Name); + return; + } + + log.DebugFormat("{0} - RunDevice()", Name); + + if (base.msrmntState != MsrmntState.Busy) return; /// No measurement in progress + + string justReceived = serialPort.ReadExisting(); + if (justReceived != null && justReceived.Length > 0) + { + log.DebugFormat("{0} - RunDevice() received {1}", Name, justReceived); + stringBuilder.Append(justReceived); + + if (stringBuilder.ToString().EndsWith("\r\n")) + { + msrmntTimeStamp = StateMachine.Time; + + string received = stringBuilder.ToString(); + + /// Eliminate double spaces in the received string + while (true) + { + string tmp = received.Replace(" ", " "); + if (tmp.Length == received.Length) break; + received = tmp; + } + + string[] fields = received.Substring(0, received.Length - 2).Split(new char[] { ' ' }); + if (fields.Length < 2) + { + msrmntState = MsrmntState.Failed; + log.WarnFormat("{0} - Balance response = {1}, Unexpected error !!!", Name, + received.Replace("\r", "").Replace("\n", "")); + return; + } + + if (fields[0].Equals("I4")) /// Serial number + { + if (fields.Length == 3 && fields[1].Equals("A") && fields[2].Length >= 3) + { + serialNumber = fields[2].Substring(1, fields[2].Length - 2); + msrmntState = MsrmntState.Valid; + log.WarnFormat("{0} - Balance response = {1}, s/n = {2}", Name, + received.Replace("\r", "").Replace("\n", ""), serialNumber); + } + else + { + msrmntState = MsrmntState.Failed; + log.WarnFormat("{0} - Balance response = {1}, error !!!", Name, + received.Replace("\r", "").Replace("\n", "")); + } + } + else if (fields[0].Equals("Z")) /// Zero when stable + { + if (fields.Length == 2 && fields[1].Equals("A")) + { + mass = 0; + Masses[balanceNr] = mass; + msrmntState = MsrmntState.Valid; + log.WarnFormat("{0} - Balance response = {1}", Name, + received.Replace("\r", "").Replace("\n", "")); + } + else + { + msrmntState = MsrmntState.Failed; + log.WarnFormat("{0} - Balance response = \"{1}\", error !!!", Name, + received.Replace("\r", "").Replace("\n", "")); + } + } + else if (fields[0].Equals("S")) /// Stable (field[1] == "S") or dynamic (field[1] == "D") mass measurement + { + if (fields.Length == 4 && (fields[1].Equals("S") || fields[1].Equals("D")) && + double.TryParse(fields[2], NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowLeadingWhite, + CultureInfo.InvariantCulture, out mass)) + { + if (fields[3].Equals("g")) mass /= 1000.0f; + if (fields[3].Equals("t")) mass *= 1000.0f; + Masses[balanceNr] = mass; + msrmntState = MsrmntState.Valid; + log.InfoFormat("{0} - Balance response = {1}, Mass = {2}", Name, + received.Replace("\r", "").Replace("\n", ""), mass); + } + else if (fields.Length == 2 && fields[1].Equals("-")) + { + //mass = 0; + //Masses[balanceNr] = mass; + msrmntState = MsrmntState.Failed; + log.InfoFormat("{0} - Balance response = {1}, Mass = {2}", Name, + received.Replace("\r", "").Replace("\n", ""), mass); + } + else if (fields.Length == 2 && fields[1].Equals("+")) + { + //mass = Capacity; + //Masses[balanceNr] = mass; + msrmntState = MsrmntState.Overload; + log.InfoFormat("{0} - Balance response = {1}, Overload", Name, + received.Replace("\r", "").Replace("\n", "")); + } + else if (fields.Length >= 2 && fields[1].Equals("I")) + { + //mass = balanceCfg.Capacity; + //Masses[balanceNr] = mass; + msrmntState = MsrmntState.Overload; + log.InfoFormat("{0} - Balance response = {1}, Overload", Name, + received.Replace("\r", "").Replace("\n", ""), mass); + } + else + { + msrmntState = MsrmntState.Failed; + log.WarnFormat("{0} - Balance response = \"{1}\", Overload or and unexpected error !!!", Name, + received.Replace("\r", "").Replace("\n", "")); + } + } + else if (fields[0].Equals("T")) /// Taring + { + if (fields.Length == 4 && fields[1].Equals("S") && + double.TryParse(fields[2], NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowLeadingWhite, + CultureInfo.InvariantCulture, out mass)) + { + if (fields[3].Equals("g")) mass /= 1000.0f; + if (fields[3].Equals("t")) mass *= 1000.0f; + msrmntState = MsrmntState.Valid; + log.WarnFormat("{0} - Balance response = {1}, Mass = {2}", Name, + received.Replace("\r", "").Replace("\n", ""), mass); + } + else if (fields.Length >= 2 && fields[1].Equals("I")) + { + mass = mass = balanceCfg.Capacity; + msrmntState = MsrmntState.Overload; + log.WarnFormat("{0} - Balance response = {1}, Overload", Name, + received.Replace("\r", "").Replace("\n", ""), mass); + } + else + { + msrmntState = MsrmntState.Failed; + log.WarnFormat("{0} - Balance response = \"{1}\", Overload or and unexpected error !!!", Name, + received.Replace("\r", "").Replace("\n", "")); + } + } + else if (fields[0].Equals("U")) + { + if (fields.Length == 2 && fields[1].Equals("A")) + { + msrmntState = MsrmntState.Valid; + log.InfoFormat("{0} - Balance response = \"{1}\"", Name, + received.Replace("\r", "").Replace("\n", "")); + } + else + { + msrmntState = MsrmntState.Failed; + log.WarnFormat("{0} - Balance response = \"{1}\", Unexpected error !!!", Name, + received.Replace("\r", "").Replace("\n", "")); + } + } + else if (fields[0].Equals("SI")) /// "SI I" received in case of overload -> empty the tank + { + if (fields.Length >= 2 && fields[1].Equals("I")) + { + mass = balanceCfg.Capacity; + Masses[balanceNr] = mass; + msrmntState = MsrmntState.Valid; + //msrmntState = MsrmntState.Overload; + log.WarnFormat("{0} - Balance response = \"{1}\", Overload.", Name, + received.Replace("\r", "").Replace("\n", "")); + } + } + } + } + } + + /// + /// Events: BalanceDone, Error + /// + /// Reference to the serialNumber + /// GetBalanceSNOp instance reference casted to IOperaton + public override IOperation GetSerNumOp(ref string serialNumber) + { + return new GetSerNumOp(this, ref serialNumber); + } + + /// + /// Events: BalanceDone, Error + /// + /// + /// SetUnitsOp instance reference casted to IOperaton + public IOperation SetUnitsOp(Units units) + { + return new SetUnitsOp(this, units); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/BalanceNewFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/BalanceNewFactory.cs new file mode 100644 index 00000000..036bae56 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/BalanceNewFactory.cs @@ -0,0 +1,36 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.MettlerToledo.Standard +{ + public class BalanceNewFactory : IComponentFactory + { + public string ClassName { get { return "MettlerToledoBalanceSN"; } } + + /// Max. number of components of this class in the system + public int MaxCount { get { return 5; } } + + public IComponent DummyComponent() { return new BalanceNewDev(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new BalanceNewDev(cfg); } + + public IComponentCfg DefaultConfig() { return new BalanceCfg(this); } + + public IComponentCfgCtrl CreateCfgCtrl() { return new BalanceCfgCtrl(); } + + public IComponent ComponentFromCmpntCfg(IComponentCfg config, IList components) + { + return new BalanceNewDev((BalanceCfg)config); + } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(BalanceCfg.Serializer, component, this); + } + + public void ResetStaticProperties() { BalanceNewDev.ResetStaticProperties(); } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/BalanceOld.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/BalanceOld.cs new file mode 100644 index 00000000..91e9d427 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/BalanceOld.cs @@ -0,0 +1,251 @@ +/// +/// Copyright (c) 2016-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using System.IO.Ports; +using log4net; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.MettlerToledo.Standard +{ + /// + /// Mettler Toledo ICS4_5 Weighting terminal connected via serial interface (RS232) + /// + /// + /// Implemented and tested on 15.10.2013 by Milan Hanajik + /// + public class BalanceOld : BalanceDev, IDevice, GenericDevices.IScale + { + /// + /// Info: StartMassMeasurement() and "Balnce response = .., Mass = ..." + /// Warn: Start measurement when busy is true + /// + private static readonly ILog log = LogManager.GetLogger(typeof(BalanceOld)); + public override string ToString() { return string.Format("MettlerToledo.Standard.BalanceOld({0})", Cfg.ToString(1)); } + + public BalanceOld() + { + } + + public BalanceOld(Generic.IComponentCfg cfg) + : base(cfg) + { + log.Debug(this.ToString()); + } + + public override void Taring() + { + if (balanceCfg.DebugLevel == DebugMode.Simulate) return; + + if (msrmntState == MsrmntState.Busy) + { + log.WarnFormat("{0} - Taring() returns without starting taring the scale because measurementState == MeasurementState.Busy", Name); + return; + } + + log.InfoFormat("{0} - Taring()", Name); + + stringBuilder.Clear(); + serialPort.Write("T\r\n"); + + mass = 0; + msrmntState = MsrmntState.Valid; + } + + /// + /// Parse characters received from the serial port + /// + public override void RunDeviceBefore() + { + base.RunBefore(); + + if (balanceCfg.DebugLevel == DebugMode.Simulate) + { + mass = TestBenchSim.GetSimMass(balanceNr); + Masses[balanceNr] = mass; + msrmntState = MsrmntState.Valid; + msrmntTimeStamp = StateMachine.Time; + return; + } + + if (serialPort == null) + { + log.ErrorFormat("{0} - RunDevice() - serial port closed", Name); + return; + } + + log.DebugFormat("{0} - RunDevice()", Name); + + if (base.msrmntState != MsrmntState.Busy) return; /// No measurement in progress + + string justReceived = serialPort.ReadExisting(); + if (justReceived != null && justReceived.Length > 0) + { + log.DebugFormat("{0} - RunDevice() received {1}", Name, justReceived); + stringBuilder.Append(justReceived); + + if (stringBuilder.ToString().EndsWith("\r\n")) + { + msrmntTimeStamp = StateMachine.Time; + + string received = stringBuilder.ToString(); + + while (true) + { + string tmp = received.Replace(" ", " "); + if (tmp.Length == received.Length) break; + received = tmp; + } + + string[] fields = received.Substring(0, received.Length - 2).Split(new char[] { ' ' }); + if (fields.Length < 2) + { + msrmntState = MsrmntState.Failed; + log.WarnFormat("{0} - Balance response = {1}, Unexpected error !!!", Name, + received.Replace("\r", "").Replace("\n", "")); + return; + } + else if (fields[0].Equals("Z")) /// Zero when stable + { + if (fields.Length == 2 && fields[1].Equals("A")) + { + mass = 0; + Masses[balanceNr] = mass; + msrmntState = MsrmntState.Valid; + log.InfoFormat("{0} - Balance response = {1}", Name, + received.Replace("\r", "").Replace("\n", "")); + } + else + { + msrmntState = MsrmntState.Failed; + log.WarnFormat("{0} - Balance response = \"{1}\", error !!!", Name, + received.Replace("\r", "").Replace("\n", "")); + } + } + else if (fields[0].Equals("S")) /// Stable (field[1] == "S") or dynamic (field[1] == "D") mass measurement + { + if (fields.Length == 4 && fields[1].Equals("S") && + double.TryParse(fields[2], NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowLeadingWhite, + CultureInfo.InvariantCulture, out mass)) + { + if (fields[3].Equals("g")) mass /= 1000.0f; + if (fields[3].Equals("t")) mass *= 1000.0f; + Masses[balanceNr] = mass; + msrmntState = MsrmntState.Valid; + log.InfoFormat("{0} - Balance response = {1}, Mass = {2}", Name, + received.Replace("\r", "").Replace("\n", ""), mass); + } + else if (fields.Length == 4 && fields[1].Equals("D") && + double.TryParse(fields[2], NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowLeadingWhite, + CultureInfo.InvariantCulture, out mass)) + { + if (fields[3].Equals("g")) mass /= 1000.0f; + if (fields[3].Equals("t")) mass *= 1000.0f; + Masses[balanceNr] = mass; + msrmntState = MsrmntState.Valid; + log.InfoFormat("{0} - Balance response = {1}, Mass = {2}", Name, + received.Replace("\r", "").Replace("\n", ""), mass); + } + else if (fields.Length == 2 && fields[1].Equals("-")) + { + mass = 0; + Masses[balanceNr] = mass; + msrmntState = MsrmntState.Valid; + log.InfoFormat("{0} - Balance response = {1}, Mass = {2}", Name, + received.Replace("\r", "").Replace("\n", ""), mass); + } + else if (fields.Length == 2 && fields[1].Equals("+")) + { + mass = Capacity; + Masses[balanceNr] = mass; + msrmntState = MsrmntState.Valid; + log.InfoFormat("{0} - Balance response = {1}, Overload", Name, + received.Replace("\r", "").Replace("\n", "")); + } + else if (fields.Length >= 2 && fields[1].Equals("I")) + { + mass = balanceCfg.Capacity; + Masses[balanceNr] = mass; + msrmntState = MsrmntState.Overload; + log.InfoFormat("{0} - Balance response = {1}, Overload", Name, + received.Replace("\r", "").Replace("\n", ""), mass); + } + else + { + msrmntState = MsrmntState.Failed; + log.WarnFormat("{0} - Balance response = \"{1}\", Overload or and unexpected error !!!", Name, + received.Replace("\r", "").Replace("\n", "")); + } + } + else if (fields[0].Equals("T")) /// Taring + { + if (fields.Length == 4 && fields[1].Equals("S") && + double.TryParse(fields[2], NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowLeadingWhite, + CultureInfo.InvariantCulture, out mass)) + { + if (fields[3].Equals("g")) mass /= 1000.0f; + if (fields[3].Equals("t")) mass *= 1000.0f; + msrmntState = MsrmntState.Valid; + log.InfoFormat("{0} - Balance response = {1}, Mass = {2}", Name, + received.Replace("\r", "").Replace("\n", ""), mass); + } + else if (fields.Length >= 2 && fields[1].Equals("I")) + { + mass = mass = balanceCfg.Capacity; + msrmntState = MsrmntState.Overload; + log.InfoFormat("{0} - Balance response = {1}, Overload", Name, + received.Replace("\r", "").Replace("\n", ""), mass); + } + else + { + msrmntState = MsrmntState.Failed; + log.WarnFormat("{0} - Balance response = \"{1}\", Overload or and unexpected error !!!", Name, + received.Replace("\r", "").Replace("\n", "")); + } + } + else if (fields[0].Equals("U")) + { + if (fields.Length == 2 && fields[1].Equals("A")) + { + msrmntState = MsrmntState.Valid; + log.InfoFormat("{0} - Balance response = \"{1}\"", Name, + received.Replace("\r", "").Replace("\n", "")); + } + else + { + msrmntState = MsrmntState.Failed; + log.WarnFormat("{0} - Balance response = \"{1}\", Unexpected error !!!", Name, + received.Replace("\r", "").Replace("\n", "")); + } + } + else if (fields[0].Equals("SI")) /// "SI I" received in case of overload -> empty the tank + { + if (fields.Length >= 2 && fields[1].Equals("I")) + { + mass = balanceCfg.Capacity; + Masses[balanceNr] = mass; + msrmntState = MsrmntState.Valid; + //msrmntState = MsrmntState.Overload; + log.WarnFormat("{0} - Balance response = \"{1}\", Overload.", Name, + received.Replace("\r", "").Replace("\n", "")); + } + } + } + } + } + + /// + /// Events: BalanceDone, Error + /// + /// + /// SetUnitsOp instance reference casted to IOperaton + public IOperation SetUnitsOp(Units units) + { + return new SetUnitsOp(this, units); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/BalanceOldFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/BalanceOldFactory.cs new file mode 100644 index 00000000..4734377e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/BalanceOldFactory.cs @@ -0,0 +1,36 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.MettlerToledo.Standard +{ + public class BalanceOldFactory : IComponentFactory + { + public string ClassName { get { return "MettlerToledoBalanceOld"; } } + + /// Max. number of components of this class in the system + public int MaxCount { get { return 5; } } + + public IComponent DummyComponent() { return new BalanceOld(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new BalanceOld(cfg); } + + public IComponentCfg DefaultConfig() { return new BalanceCfg(this); } + + public IComponentCfgCtrl CreateCfgCtrl() { return new BalanceCfgCtrl(); } + + public IComponent ComponentFromCmpntCfg(IComponentCfg config, IList components) + { + return new BalanceOld((BalanceCfg)config); + } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(BalanceCfg.Serializer, component, this); + } + + public void ResetStaticProperties() { BalanceOld.ResetStaticProperties(); } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/GetSerNumOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/GetSerNumOp.cs new file mode 100644 index 00000000..047f8ac2 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/GetSerNumOp.cs @@ -0,0 +1,70 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using log4net; + +namespace TBF.BenchControl.MettlerToledo.Standard +{ + public class GetSerNumOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(GetSerNumOp)); + public override string ToString() { return string.Format("GetSerNumOp(.,.)"); } + + /// Set by the constructor + BalanceNewDev scale; + string serialNumber; + + /// + /// Events: BalanceDone, Error + /// + /// Balance device instance + /// Reference to the serialNumber + public GetSerNumOp(BalanceNewDev scale, ref string serialNumber) + { + if (scale == null) throw new ArgumentNullException("balanceDev"); + this.scale = scale; + + this.serialNumber = serialNumber; + + log.Debug(this.ToString()); + } + + /// Start this operation + public void Start() + { + log.DebugFormat("{0} - Start()", scale.Name); + scale.GetSerialNumber(); + } + + /// Run this operation + /// + /// Event.None + /// Event.BalanceDone + /// + public Event Run() + { + log.DebugFormat("{0} - GetSerNumOp.Run() ... MsrmntState = {1}", scale.Name, scale.MsrmntState); + + if (scale.MsrmntState == MsrmntState.Valid) + { + serialNumber = scale.SerialNumber; + return Event.BalanceDone; /// S/N read successful + } + else if (scale.MsrmntState == MsrmntState.Failed) + { + return Event.Error; /// S/N read failed + } + else + { + return Event.Busy; /// No result yet + } + } + + /// Stop this operation + public void Stop() + { + log.DebugFormat("{0} - Stop()", scale.Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/ReadMassOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/ReadMassOp.cs new file mode 100644 index 00000000..d6719f52 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/ReadMassOp.cs @@ -0,0 +1,95 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using log4net; +using TBF.Boxes; + +namespace TBF.BenchControl.MettlerToledo.Standard +{ + public class ReadMassOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(ReadMassOp)); + public override string ToString() { return string.Format("ReadMassOp(.,.)"); } + + bool started; + bool done; + + /// Set by the constructor + BalanceDev scale; + DoubleBox result; + + /// + /// Events: BalanceDone, Error + /// + /// Balance device instance + /// Required mass readings count (>= 3) + /// Reference to the measured mass in kg + public ReadMassOp(BalanceDev scale, ref DoubleBox result) + { + if (scale == null) throw new ArgumentNullException("balanceDev"); + this.scale = scale; + + this.result = result; + + log.Debug(this.ToString()); + } + + /// Start this operation + public void Start() + { + scale.GetImmediateMassMeasurement(); + started = true; + done = false; + } + + /// Run this operation + /// + /// Event.None + /// Event.BalanceDone + /// Event.Error . . . . . Current.Tick == null + /// + public Event Run() + { + scale.MsrmntTime++; + + if (!started) + { + scale.GetImmediateMassMeasurement(); + started = true; + done = false; + return Event.Busy; + } + else if (started && scale.MsrmntState == MsrmntState.Busy) + { + /// Measurement is in progress + + if (scale.MsrmntTime >= 2) + { + /// Timeout - no response from the scale within 2 seconds - send command again + scale.GetImmediateMassMeasurement(); + started = true; + done = false; + } + + return Event.Busy; + } + else + { + /// Measurement completed or failed: (started == true) && (scale.MsrmntState != MsrmntState.Busy) + + if (scale.MsrmntState == MsrmntState.Valid) result.Val = scale.Mass; + log.InfoFormat("ReadMassOp.Run() ... state={0}, mass={1} ... returning Event.BalanceDone", + scale.MsrmntState, scale.Mass); + done = true; + started = false; + return Event.BalanceDone; /// Mass read OK + } + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/ReadStableMassOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/ReadStableMassOp.cs new file mode 100644 index 00000000..4ef0ef05 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/ReadStableMassOp.cs @@ -0,0 +1,194 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using log4net; +using TBF.Boxes; + +namespace TBF.BenchControl.MettlerToledo.Standard +{ + /// + /// Operation to read more mass values and average them to obtain a more accurate result. + /// + public class ReadStableMassOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(ReadStableMassOp)); + public override string ToString() { return string.Format("ReadStableMassOp(.,{0},.)", totalReadingsCount); } + + /// Set by the constructor + BalanceDev scale; + int totalReadingsCount; + double maxSpread; /// Maximum spread of measurements in kg (otherwise the measurement continues) + Config.Entities.MassMethod method; /// by the scale, mass spread threshold or mass standard deviation threshold + DoubleBox result; + + /// Operation specific + double[] massReadings; + int currentReadingsCount; + + bool measurementCompleted; + + /// + /// Events: BalanceDone, Error + /// + /// Balance device instance + /// Reference to the measured mass in kg + /// Required mass readings count (>= 4) + /// Maximum spread of measurements in kg (otherwise the measurement continues) + /// Method: false = slow (precise), true = fast (immediate) + public ReadStableMassOp(BalanceDev scale, ref DoubleBox result, int readingsCount, double maxSpread, Config.Entities.MassMethod method) + { + if (scale == null) throw new ArgumentNullException("balanceDev"); + this.scale = scale; + + this.totalReadingsCount = (readingsCount < 4) ? 5 : readingsCount; /// readingsCount is at least 4 + this.maxSpread = (maxSpread == 0) ? (scale.Capacity / 20000.0) : maxSpread; + this.method = method; + + this.result = result; + + massReadings = new double[totalReadingsCount]; + currentReadingsCount = 0; + measurementCompleted = false; + + log.Debug(this.ToString()); + } + + /// Start this operation + public void Start() + { + currentReadingsCount = 0; + measurementCompleted = false; + + if (method == Config.Entities.MassMethod.Scale) + scale.GetStableMassMeasurement(); + else + scale.GetImmediateMassMeasurement(); + } + + /// Run this operation + /// + /// Event.None + /// Event.BalanceDone + /// Event.Error . . . . . Current.Tick == null + /// + public Event Run() + { + scale.MsrmntTime++; + + if (measurementCompleted) return Event.BalanceDone; + + if (scale.MsrmntState == MsrmntState.Busy) + { + /// Measurement is in progress - resend command if timeout occurs + + if (method == Config.Entities.MassMethod.Scale) + { + if (scale.MsrmntTime >= 60) scale.GetStableMassMeasurement(); + } + else + { + if (scale.MsrmntTime >= 2) scale.GetImmediateMassMeasurement(); + } + + return Event.None; /// Wait for a mass measurement + } + + if (scale.MsrmntState == MsrmntState.Valid) + { + /// Save the measurement + if (currentReadingsCount < totalReadingsCount) + { + massReadings[currentReadingsCount++] = scale.Mass; + } + else + { + /// Shift data in the (already full) buffer, save the mass into the last buffer item + for (int i = 1; i < totalReadingsCount; i++) + { + massReadings[i - 1] = massReadings[i]; + } + massReadings[totalReadingsCount - 1] = scale.Mass; + } + } + + if (currentReadingsCount >= totalReadingsCount) + { + Array.Sort(massReadings); + +#if STABLE_MASS_EXTRAS + if (method == Config.Entities.MassMethod.Spread) + { + /// Immediate mass measurement, end condition calculated below + + if ((massReadings[totalReadingsCount - 2] - massReadings[1]) <= maxSpread) + { + double massSum = 0; + for (int i = 1; i < totalReadingsCount - 1; i++) massSum += massReadings[i]; + result.Val = (massSum / (totalReadingsCount - 2)); + log.InfoFormat("ReadStableMassOp.Run() ... valid mass={0} ... returning Event.BalanceDone", result.Val); + + measurementCompleted = true; + return Event.BalanceDone; /// Mass has just been calculated + } + } + else if (method == Config.Entities.MassMethod.StdDev) + { + /// Immediate mass measurement, end condition calculated below + + double massSum = 0; + for (int i = 1; i < totalReadingsCount - 1; i++) massSum += massReadings[i]; + double ave = (massSum / (totalReadingsCount - 2)); + double sdev = 0; + for (int i = 1; i < totalReadingsCount - 1; i++) sdev += ((massReadings[i] - ave) * (massReadings[i] - ave)); + + if (Math.Sqrt(sdev / (totalReadingsCount - 2)) <= maxSpread) + { + result.Val = ave; + log.InfoFormat("ReadStableMassOp.Run() ... valid mass={0} ... returning Event.BalanceDone", result.Val); + + measurementCompleted = true; + return Event.BalanceDone; /// Mass has just been calculated + } + } + else +#endif + { + /// Stable mass measurement + + /// Sort, exclude min. and max. values, calculate the average + double massSum = 0; + for (int i = 1; i < totalReadingsCount - 1; i++) massSum += massReadings[i]; + result.Val = (massSum / (totalReadingsCount - 2)); + log.InfoFormat("ReadStableMassOp.Run() ... valid mass={0} ... returning Event.BalanceDone", result.Val); + + measurementCompleted = true; + return Event.BalanceDone; /// Mass has just been calculated + } + } + + + if (measurementCompleted) + { + return Event.BalanceDone; + } + else + { + /// + /// Start a new measurement + /// + if (method == Config.Entities.MassMethod.Scale) + scale.GetStableMassMeasurement(); + else + scale.GetImmediateMassMeasurement(); + + return Event.None; + } + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/SetUnitsOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/SetUnitsOp.cs new file mode 100644 index 00000000..7f003199 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/SetUnitsOp.cs @@ -0,0 +1,62 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// Author: Milan Hanajik +/// +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using log4net; + +namespace TBF.BenchControl.MettlerToledo.Standard +{ + public class SetUnitsOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(SetUnitsOp)); + public override string ToString() { return string.Format("SetUnitsOp({0})", units); } + + /// Set by the constructor + BalanceDev balanceDev; + BalanceDev.Units units; + + /// + /// Events: BalanceDone, Error + /// + /// Balance device instance + /// Reference to the serialNumber + public SetUnitsOp(BalanceDev balanceDev, BalanceDev.Units units) + { + if (balanceDev == null) throw new ArgumentNullException("balanceDev"); + this.balanceDev = balanceDev; + + this.units = units; + + log.Debug(this.ToString()); + } + + /// Start this operation + public void Start() + { + log.DebugFormat("{0} - Start()", balanceDev.Name); + balanceDev.SetUnits(units); + } + + /// Run this operation + /// + /// Event.None + /// Event.BalanceDone + /// + public Event Run() + { + if (balanceDev.MsrmntState == MsrmntState.Valid) return Event.BalanceDone; /// Units set + if (balanceDev.MsrmntState == MsrmntState.Failed) return Event.Error; /// Failed + return Event.None; /// No result yet + } + + /// Stop this operation + public void Stop() + { + log.DebugFormat("{0} - Stop()", balanceDev.Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/TaringOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/TaringOp.cs new file mode 100644 index 00000000..24e52446 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/Standard/TaringOp.cs @@ -0,0 +1,80 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using log4net; +using TBF.Boxes; + +namespace TBF.BenchControl.MettlerToledo.Standard +{ + public class TaringOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(TaringOp)); + public override string ToString() { return string.Format("TaringOp(.,.)"); } + + bool done; + + /// Set by the constructor + BalanceDev balanceDev; + DoubleBox tara; + + /// + /// Events: BalanceDone, Error + /// + /// Balance device instance + /// Reference to variable for 'tara' in kg + public TaringOp(BalanceDev balanceDev, ref DoubleBox tara) + { + if (balanceDev == null) throw new ArgumentNullException("balanceDev"); + this.balanceDev = balanceDev; + + this.tara = tara; + + log.Debug(this.ToString()); + } + + /// Start this operation + public void Start() + { + log.DebugFormat("{0} - Start()", balanceDev.Name); + done = false; + balanceDev.Taring(); + } + + /// Run this operation + /// + /// Event.None + /// Event.BalanceDone + /// Event.Error . . . . . Current.Tick == null + /// + public Event Run() + { + if (done) return Event.BalanceDone; /// Taring has been done already + + if (balanceDev.MsrmntState == MsrmntState.Busy) return Event.Busy; + + if (balanceDev.MsrmntState == MsrmntState.Overload) + { + tara.Val = balanceDev.Capacity; + done = true; + return Event.BalanceOverload; + } + + if (balanceDev.MsrmntState == MsrmntState.Valid) + { + tara.Val = balanceDev.Mass; + done = true; + return Event.BalanceDone; /// Taring completed + } + + balanceDev.Taring(); /// Failed -> repeat taring + return Event.Busy; + } + + /// Stop this operation + public void Stop() + { + log.DebugFormat("{0} - Stop()", balanceDev.Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/TankDraining.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/TankDraining.cs new file mode 100644 index 00000000..9b7eb4b2 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/TankDraining.cs @@ -0,0 +1,144 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.BenchControl.GenericDevices; +using TBF.Resources; + +namespace TBF.BenchControl.MettlerToledo +{ + public enum DrainState + { + None, + OpeningDV_Start, + OpeningDV_Run, + OpeningDV_Stop, + Draining, + ClosingDV_Start, + ClosingDV_Run, + ClosingDV_Stop, + TankClosed, + } + + public class TankDraining : ComponentBase, ITankDraining, ISequenceCondition + { + private static readonly ILog log = LogManager.GetLogger(typeof(TankDraining)); + + + readonly GenericDevices.ITankDrainingCfg tankDrainingCfg; + + private IValve drainValve; + public GenericDevices.IValve DrainValve { get { return drainValve; } } + + private IOperation openTheDrainValveOp; + private IOperation closeTheDrainValveOp; + private IOperation waitTankEmptyOp; + + + DrainState drainState; + + + public TankDraining() + : base() + { + openTheDrainValveOp = null; + closeTheDrainValveOp = null; + waitTankEmptyOp = null; + } + + public TankDraining(Generic.IComponentCfg cfg) + : base(cfg) + { + tankDrainingCfg = cfg as GenericDevices.ITankDrainingCfg; + if (tankDrainingCfg == null) throw new Exception(string.Format("Cannot create component {0}", cfg.Name)); + + openTheDrainValveOp = null; + closeTheDrainValveOp = null; + waitTankEmptyOp = null; + } + + protected void Initalize() + { + drainValve = TbfComponents.FindComponent(tankDrainingCfg.DrainValve) as IValve; + + openTheDrainValveOp = new Elde.SetValvesOp(StateMachine.ControlBoard, drainValve, null); + closeTheDrainValveOp = new Elde.SetValvesOp(StateMachine.ControlBoard, null, drainValve); + waitTankEmptyOp = new WaitTankEmptyOp(this); + } + + protected void RunBefore() + { + switch (drainState) + { + case DrainState.OpeningDV_Start: + openTheDrainValveOp.Start(); + drainState = DrainState.OpeningDV_Run; + return; + + case DrainState.OpeningDV_Run: + if (openTheDrainValveOp.Run() == Event.ValvesSet) drainState = DrainState.OpeningDV_Stop; + return; + + case DrainState.OpeningDV_Stop: + openTheDrainValveOp.Stop(); + return; + + case DrainState.Draining: + if (IsEmpty()) drainState = DrainState.ClosingDV_Start; + return; + + case DrainState.ClosingDV_Start: + closeTheDrainValveOp.Start(); + drainState = DrainState.ClosingDV_Run; + return; + + case DrainState.ClosingDV_Run: + if (closeTheDrainValveOp.Run() == Event.ValvesSet) drainState = DrainState.ClosingDV_Stop; + return; + + case DrainState.ClosingDV_Stop: + closeTheDrainValveOp.Stop(); + return; + + default: + return; + } + } + + protected void RunAfter() { } /// Not used + + + public virtual string GetName() { return string.Empty; } + public virtual bool IsEmpty() { return false; } + + + + public int ConditionsCount { get { return 3; } } + + /// Strings are added to the combo-box for transition sequence condition selection + public string ConditionName(int i) + { + switch (i) + { + case 0: return string.Format(Strings._0_open_the_drain_valve, Name); + case 1: return string.Format(Strings._0_close_the_drain_valve, Name); + case 2: return string.Format(Strings._0_wait_until_the_tank_is_empty, Name); + default: return string.Empty; + } + } + + /// Operation to be executed as a part of a transition sequence + public IOperation ConditionOp(int i) + { + switch (i) + { + case 0: return openTheDrainValveOp; + case 1: return closeTheDrainValveOp; + case 2: return waitTankEmptyOp; + default: return null; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/WaitTankEmptyOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/WaitTankEmptyOp.cs new file mode 100644 index 00000000..9c770e66 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/MettlerToledo/WaitTankEmptyOp.cs @@ -0,0 +1,50 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using log4net; + +namespace TBF.BenchControl.MettlerToledo +{ + public class WaitTankEmptyOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(WaitTankEmptyOp)); + public override string ToString() { return string.Format("WaitTankEmptyOp()"); } + + readonly GenericDevices.ITankDraining tankDraining; + + bool conditionMet; + + /// + /// Events: ConditionMet, ConditionNotMet + /// + /// Tank draining (Balance device) instance + public WaitTankEmptyOp(GenericDevices.ITankDraining tankDraining) + { + this.tankDraining = tankDraining; + log.Debug(this.ToString()); + } + + /// Start this operation + public void Start() + { + conditionMet = tankDraining.IsEmpty(); + } + + /// Run this operation + /// + /// Event.ConditionMet . . . tank is empty + /// Event.ConditionNotMet . tank is not empty + /// + public Event Run() + { + conditionMet = conditionMet || tankDraining.IsEmpty(); + + return conditionMet ? Event.ConditionMet : Event.ConditionNotMet; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/CometAmbient/Ambient.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/CometAmbient/Ambient.cs new file mode 100644 index 00000000..d0a0775f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/CometAmbient/Ambient.cs @@ -0,0 +1,171 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO.Ports; +using System.Text; +using log4net; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Boxes; + +namespace TBF.BenchControl.Modbus.CometAmbient +{ + /// + /// Ambient temperature / humidity / pressure meter 'Greco' connected via serial interface (RS232) + /// Connection settings: 9600 Bd 8-bits No-parity 2-stop-bits Flow control: none. + /// + public class Ambient : ComponentBase, IDevice, IOperation, GenericDevices.IAmbient + { + private static readonly ILog log = LogManager.GetLogger(typeof(Ambient)); + public override string ToString() { return string.Format("Ambient({0})", Cfg.ToString(1)); } + + readonly AmbientCfg ambientCfg; + readonly GenericDevices.IModbus modbus; + + /// The state of the measurement + MsrmntState msrmntState; + + /// + /// Measured values when MsrmntState == MsrmntState.Valid + /// + float temperature; /// [°C] + float pressure; /// [bar] + float humidity; /// [R%] + + /// Measurement time stamp when MsrmntState == MsrmntState.Valid + int msrmntTimeStamp; + + public Ambient() + { + } + + /// + /// Ambient temperature / humidity / pressure meter 'Greco' connected via serial interface (RS232) + /// + public Ambient(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + ambientCfg = cfg as AmbientCfg; + + modbus = (GenericDevices.IModbus)TbfComponents.FindComponent(cfg.ParentName, components); + if (modbus == null) throw new Exception("Cannot find " + Name + " parent"); + + log.Debug(this.ToString()); + } + + public void Initialize() + { + if (ambientCfg.DebugLevel == DebugMode.Simulate) + { + temperature = 20.0f; + humidity = 40.0f; + pressure = 1.0f; + msrmntTimeStamp = StateMachine.Time; + msrmntState = MsrmntState.Valid; + return; + } + + msrmntState = MsrmntState.Busy; + + log.FatalFormat("Successfully initialized device {0}", ToString()); + } + + /// Run this device + public void RunDeviceBefore() + { + if (ambientCfg.DebugLevel == DebugMode.Simulate || + ambientCfg.DebugLevel == DebugMode.FailureDuringOperation) + { + msrmntTimeStamp = StateMachine.Time; + return; + } + + if (modbus.ReceivedTelegrams[ambientCfg.ModbusAddress].Count > 0) + { + byte[] telegram = modbus.ReceivedTelegrams[ambientCfg.ModbusAddress].Dequeue(); + + if (telegram.Length == 13 && telegram[1] == 3 && telegram[2] == 8) + { + int value = (int)telegram[3] * 256 + (int)telegram[4]; + temperature = (float)value / 10.0f; + + value = (int)telegram[5] * 256 + (int)telegram[6]; + humidity = (float)value / 10.0f; + + value = (int)telegram[9] * 256 + (int)telegram[10]; + pressure = (float)value / 10000.0f; + + msrmntTimeStamp = StateMachine.Time; + msrmntState = MsrmntState.Valid; + log.InfoFormat("Ambient: temperature = {0} C, humidity = {1} %, pressure = {2} mbar", temperature.ToString("F1"), humidity.ToString("F1"), (1000 * pressure).ToString("F0")); + } + } + + if ((StateMachine.Time % 10) == (ambientCfg.ModbusAddress % 10)) /// Each 10 seconds + { + /// Read four registers: 0x31, 0x32, 0x33, 0x34 + UInt16 regAddr = 0x0030; /// register addr. = 0x31 (Modbus!) + UInt16 count = 4; + + /// Prepare data to be sent + byte[] msg = new byte[8]; + msg[0] = ambientCfg.ModbusAddress; + msg[1] = 3; /// CMD = Read registers + msg[2] = (byte)(regAddr >> 8); /// Control Word Hi + msg[3] = (byte)(regAddr & 0xFF); /// Control Word Lo + msg[4] = (byte)(count >> 8); /// Serial Com Reference Hi + msg[5] = (byte)(count & 0xFF); /// Serial Com Reference Lo + + modbus.SendMessage(msg); + } + } + + public void RunDeviceAfter() { } + public void StopDevice() { } + public void StopDevice2() { } + + + /// + /// Boxes for the operation result + /// + FloatBox tempBox; + FloatBox pressureBox; + FloatBox humiBox; + + public IOperation ReadAmbientOp(FloatBox temperature, FloatBox pressure, FloatBox humidity) + { + this.tempBox = temperature; + this.pressureBox = pressure; + this.humiBox = humidity; + return this; + } + + /// Start this operation + public void Start() + { + if (tempBox != null) tempBox.Val = temperature; + if (pressureBox != null) pressureBox.Val = pressure; + if (humiBox != null) humiBox.Val = humidity; + } + + /// Run this operation + /// + /// Event.FlowInDone or Event.FlowOutDone + /// + public Event Run() + { + if (tempBox != null) tempBox.Val = temperature; + if (pressureBox != null) pressureBox.Val = pressure; + if (humiBox != null) humiBox.Val = humidity; + return Event.AmbientDone; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/CometAmbient/AmbientCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/CometAmbient/AmbientCfg.cs new file mode 100644 index 00000000..f573c6fc --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/CometAmbient/AmbientCfg.cs @@ -0,0 +1,45 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Modbus.CometAmbient +{ + public class AmbientCfg : ComponentCfgBase, Generic.IChildComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(AmbientCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new AmbientCfgCtrl(); } + + /// + /// Serialized parameters + /// + public byte ModbusAddress; /// 1..255 + + /// Private parameterless constructor invoked by all other (public) constructors + AmbientCfg() + { + Name = "Ambient"; + ParentName = "Modbus"; + ModbusAddress = 1; + } + + public AmbientCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, ModbusAddr={1}, Parent={2}", + Name, + ModbusAddress, + (string.IsNullOrEmpty(ParentName) ? "-" : ParentName)); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/CometAmbient/AmbientCfgCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/CometAmbient/AmbientCfgCtrl.Designer.cs new file mode 100644 index 00000000..5649b543 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/CometAmbient/AmbientCfgCtrl.Designer.cs @@ -0,0 +1,156 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.Modbus.CometAmbient +{ + partial class AmbientCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.parentNameLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.componentNameLabel = new System.Windows.Forms.Label(); + this.modbusAddressLabel = new System.Windows.Forms.Label(); + this.modbusAddressTextBox = new System.Windows.Forms.TextBox(); + this.parentNameComboBox = new System.Windows.Forms.ComboBox(); + this.reservoirNrTextBox = new System.Windows.Forms.TextBox(); + this.reservoirNrLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // parentNameLabel + // + this.parentNameLabel.AutoSize = true; + this.parentNameLabel.Location = new System.Drawing.Point(28, 81); + this.parentNameLabel.Name = "parentNameLabel"; + this.parentNameLabel.Size = new System.Drawing.Size(69, 13); + this.parentNameLabel.TabIndex = 3; + this.parentNameLabel.Text = "Parent Name"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(138, 52); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(28, 55); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // componentNameLabel + // + this.componentNameLabel.AutoSize = true; + this.componentNameLabel.Location = new System.Drawing.Point(135, 28); + this.componentNameLabel.Name = "componentNameLabel"; + this.componentNameLabel.Size = new System.Drawing.Size(83, 13); + this.componentNameLabel.TabIndex = 0; + this.componentNameLabel.Text = "ComonentName"; + // + // modbusAddressLabel + // + this.modbusAddressLabel.AutoSize = true; + this.modbusAddressLabel.Location = new System.Drawing.Point(28, 108); + this.modbusAddressLabel.Name = "modbusAddressLabel"; + this.modbusAddressLabel.Size = new System.Drawing.Size(86, 13); + this.modbusAddressLabel.TabIndex = 7; + this.modbusAddressLabel.Text = "Modbus Address"; + // + // modbusAddressTextBox + // + this.modbusAddressTextBox.Enabled = false; + this.modbusAddressTextBox.Location = new System.Drawing.Point(138, 105); + this.modbusAddressTextBox.Name = "modbusAddressTextBox"; + this.modbusAddressTextBox.Size = new System.Drawing.Size(46, 20); + this.modbusAddressTextBox.TabIndex = 8; + // + // parentNameComboBox + // + this.parentNameComboBox.Enabled = false; + this.parentNameComboBox.FormattingEnabled = true; + this.parentNameComboBox.Location = new System.Drawing.Point(138, 78); + this.parentNameComboBox.Name = "parentNameComboBox"; + this.parentNameComboBox.Size = new System.Drawing.Size(130, 21); + this.parentNameComboBox.TabIndex = 4; + // + // reservoirNrTextBox + // + this.reservoirNrTextBox.Enabled = false; + this.reservoirNrTextBox.Location = new System.Drawing.Point(138, 130); + this.reservoirNrTextBox.Name = "reservoirNrTextBox"; + this.reservoirNrTextBox.Size = new System.Drawing.Size(46, 20); + this.reservoirNrTextBox.TabIndex = 10; + // + // reservoirNrLabel + // + this.reservoirNrLabel.AutoSize = true; + this.reservoirNrLabel.Location = new System.Drawing.Point(28, 133); + this.reservoirNrLabel.Name = "reservoirNrLabel"; + this.reservoirNrLabel.Size = new System.Drawing.Size(67, 13); + this.reservoirNrLabel.TabIndex = 9; + this.reservoirNrLabel.Text = "Reservoir nr."; + // + // EasythermCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.reservoirNrTextBox); + this.Controls.Add(this.reservoirNrLabel); + this.Controls.Add(this.parentNameComboBox); + this.Controls.Add(this.modbusAddressTextBox); + this.Controls.Add(this.modbusAddressLabel); + this.Controls.Add(this.parentNameLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.componentNameLabel); + this.Name = "EasythermCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.AmbientCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label parentNameLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label componentNameLabel; + private System.Windows.Forms.Label modbusAddressLabel; + private System.Windows.Forms.TextBox modbusAddressTextBox; + private System.Windows.Forms.ComboBox parentNameComboBox; + private System.Windows.Forms.TextBox reservoirNrTextBox; + private System.Windows.Forms.Label reservoirNrLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/CometAmbient/AmbientCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/CometAmbient/AmbientCfgCtrl.cs new file mode 100644 index 00000000..0a77120a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/CometAmbient/AmbientCfgCtrl.cs @@ -0,0 +1,104 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Modbus.CometAmbient +{ + public partial class AmbientCfgCtrl : UserControl, IComponentCfgCtrl + { + ComponentParametersDlg parent; + + public bool ShowMore { get { return false; } } + + AmbientCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as AmbientCfg; + Redraw(); + } + } + + public AmbientCfgCtrl() + { + InitializeComponent(); + } + + private void AmbientCfgCtrl_Load(object sender, EventArgs e) + { + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + + if (parent.TbfComponents != null) + { + foreach (var cmpnt in parent.TbfComponents) + { + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is Modbus.Common.Factory) + { + parentNameComboBox.Items.Add(cmpnt.Name); + } + } + } + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + componentNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + parentNameComboBox.Text = string.IsNullOrEmpty(config.ParentName) ? "---" : config.ParentName; + modbusAddressTextBox.Text = config.ModbusAddress.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + parentNameComboBox.Enabled = true; + modbusAddressTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!parentNameComboBox.Items.Contains(parentNameComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Parent Name'"; + } + if (!int.TryParse(modbusAddressTextBox.Text, out dummy) || dummy < 0 || dummy > 255) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Modbus Address' should be between 0 and 255"; + } + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.ParentName = parentNameComboBox.Text.Equals("---") ? string.Empty : parentNameComboBox.Text; + config.ModbusAddress = (byte)int.Parse(modbusAddressTextBox.Text); + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/CometAmbient/AmbientCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/CometAmbient/AmbientCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/CometAmbient/AmbientCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/CometAmbient/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/CometAmbient/Factory.cs new file mode 100644 index 00000000..5c43f92c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/CometAmbient/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Modbus.CometAmbient +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Ambient.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Ambient(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Ambient(cfg, components); } + + public IComponentCfg DefaultConfig() { return new AmbientCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(AmbientCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Common/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Common/Factory.cs new file mode 100644 index 00000000..556981f0 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Common/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Modbus.Common +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return "Modbus"; } } + + public void ResetStaticProperties() { Modbus.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Modbus(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Modbus(cfg); } + + public IComponentCfg DefaultConfig() { return new ModbusCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(ModbusCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Common/Modbus.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Common/Modbus.cs new file mode 100644 index 00000000..ff119a14 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Common/Modbus.cs @@ -0,0 +1,211 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.IO.Ports; +using System.Text; +using System.Threading; +using Config.Entities; +using log4net; +using TBF.BenchControl.Generic; +using TBF.Boxes; + +namespace TBF.BenchControl.Modbus.Common +{ + /// + /// Root component for Modbus communication via serial port (RS485) + /// + public class Modbus : ComponentBase, IDevice, GenericDevices.IModbus + { + private static readonly ILog log = LogManager.GetLogger(typeof(Modbus)); + public override string ToString() { return string.Format("Modbus({0})", Cfg.ToString(1)); } + + private readonly ModbusCfg modbusCommonCfg; + + /// Private fields + SerialPort serialPort; + DateTime lastSerialPortWrite; + + public Queue[] ReceivedTelegrams + { + get { return receivedTelegrams; } + } + Queue[] receivedTelegrams; + + Queue telegramsToSend; + + public Modbus() + { + } + + /// + /// Ambient temperature / humidity / pressure meter 'Greco' connected via serial interface (RS232) + /// Connection settings: 19200 Bd 8-bits No-parity 1-stop-bit Flow control: none or hardware. + /// + public Modbus(Generic.IComponentCfg cfg) + : base(cfg) + { + receivedTelegrams = new Queue[256]; + for (int i = 0; i < receivedTelegrams.Length; i++) + { + receivedTelegrams[i] = new Queue(); + } + telegramsToSend = new Queue(); + + serialPort = null; + modbusCommonCfg = cfg as ModbusCfg; + log.Debug(this.ToString()); + } + + ~Modbus() + { + } + + public void Initialize() + { + if (modbusCommonCfg.DebugLevel == DebugMode.Simulate) + { + serialPort = null; + log.FatalFormat("{0} - Device simulated", Name); + return; + } + + string comPortName = "COM" + modbusCommonCfg.ComPortNr.ToString(); + serialPort = new SerialPort(comPortName, modbusCommonCfg.BaudRate, modbusCommonCfg.Parity, modbusCommonCfg.DataBits, modbusCommonCfg.StopBits); + serialPort.Handshake = modbusCommonCfg.Handshake; + serialPort.Open(); + + //stopWorkerThread = false; + //workerThread = new Thread(Worker); + //workerThread.Start(); + + log.FatalFormat("{0} - Device successfully initialized", Name); + } + + + /// + /// Send an arbitrary modbus message. + /// When the message length is N, however only bytes 1..N-2 have to be set. + /// The last two message bytes (CRC) may be uninitialized or zero. + /// They are calculated inside this function as required by Modbus specification. + /// + /// Message incl CRC fields, CRC bytes dont have to be set + public void SendMessage(byte[] message) + { + if (serialPort == null) return; + + Telegram.UpdateTelegramCRC(message); + + if ((DateTime.Now - lastSerialPortWrite) > new TimeSpan(0, 0, 0, 0, 100)) + { + /// More then 100 ms since last 'send' --> do not enqueue the message + SendMessageNow(message); + } + else + { + telegramsToSend.Enqueue(message); + + string s = Telegram.LogTelegram(string.Format("{0} - Enqueueing message ", Name), message); + Debug.WriteLine(s); + log.Debug(s); + } + } + + + /// + /// Send a structured modbus message. + /// + /// Device address (1..255) or 0 = broadcast + /// Function (0..127) + /// Address of data to be transferred (0..65535) + /// Count of data bytes to be transferred (0..65535) + public void SendMessage(byte modbusAddress, byte function, ushort dataAddress, ushort dataCount) + { + if (serialPort == null) return; + + byte[] message = new byte[8] + { + modbusAddress, + function, + (byte)(dataAddress / 256), + (byte)(dataAddress % 256), + (byte)(dataCount / 256), + (byte)(dataCount % 256), + 0, + 0, + }; + + SendMessage(message); + } + + public void SendMessageNow(byte[] message) + { + serialPort.Write(message, 0, message.Length); + lastSerialPortWrite = DateTime.Now; + + string s = Telegram.LogTelegram(string.Format("{0} - Sending message ", Name), message); + Debug.WriteLine(s); + log.Debug(s); + } + + + /// Run this device + public void RunDeviceBefore() + { + if (serialPort == null) return; + + int nrBytes = serialPort.BytesToRead; + if (nrBytes > 0) + { + byte[] buffer = new byte[nrBytes]; + serialPort.Read(buffer, 0, nrBytes); + + int deviceAddress = (nrBytes >= 1) ? buffer[0] : 0; + int function = (nrBytes >= 2) ? buffer[1] : 0; + + if ((nrBytes >= 4) && Telegram.VerifyTelegramCRC(buffer)) + { + receivedTelegrams[deviceAddress].Enqueue(buffer); + + string s = string.Format("{0} - {1} address={2} count={3}", Name, Telegram.LogTelegram("Telegram received: ", buffer), deviceAddress, receivedTelegrams[deviceAddress].Count); + Debug.WriteLine(s); + log.Debug(s); + } + else + { + string s = Telegram.LogTelegram(string.Format("{0} - Invalid data received ", Name), buffer); + Debug.WriteLine(s); + log.Debug(s); + } + } + } + + /// Run this device + public void RunDeviceAfter() + { + if (serialPort == null) return; + + if (telegramsToSend.Count > 0 && (DateTime.Now - lastSerialPortWrite) > new TimeSpan(0, 0, 0, 0, 500)) + { + SendMessageNow(telegramsToSend.Dequeue()); + } + } + + /// Stop this device + public void StopDevice() + { + if (serialPort != null) + { + //stopWorkerThread = true; + //workerThread.Join(2000); + serialPort.Close(); + serialPort = null; + } + } + + public void StopDevice2() { } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Common/ModbusCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Common/ModbusCfg.cs new file mode 100644 index 00000000..92782296 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Common/ModbusCfg.cs @@ -0,0 +1,54 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// +using System.IO; +using System.Collections.Generic; +using System.IO.Ports; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Modbus.Common +{ + public class ModbusCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ModbusCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new ModbusCfgCtrl(); } + + /// + /// Serialized parameters + /// + public int ComPortNr; + public int BaudRate; + public Parity Parity; + public int DataBits; + public StopBits StopBits; + public Handshake Handshake; + + /// Private parameterless constructor invoked by all other (public) constructors + ModbusCfg() + { + Name = "Modbus"; + ParentName = string.Empty; + ComPortNr = 3; + BaudRate = 9600; + Parity = System.IO.Ports.Parity.None; + DataBits = 8; + StopBits = System.IO.Ports.StopBits.One; + Handshake = System.IO.Ports.Handshake.None; + } + + public ModbusCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Com{1}, {2}Bd, {3}-bits, parity={4}, stopBits={5}, {6}", + Name, ComPortNr, BaudRate, DataBits, Parity, StopBits, Handshake); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Common/ModbusCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Common/ModbusCfgCtrl.cs new file mode 100644 index 00000000..6bed69fd --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Common/ModbusCfgCtrl.cs @@ -0,0 +1,171 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using System.IO.Ports; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.Modbus.Common +{ + public partial class ModbusCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + ModbusCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as ModbusCfg; + Redraw(); + } + } + + public ModbusCfgCtrl() + { + InitializeComponent(); + + parityComboBox.Items.Add(Parity.None.ToString()); + parityComboBox.Items.Add(Parity.Even.ToString()); + parityComboBox.Items.Add(Parity.Odd.ToString()); + + stopBitsComboBox.Items.Add(StopBits.None.ToString()); + stopBitsComboBox.Items.Add(StopBits.One.ToString()); + stopBitsComboBox.Items.Add(StopBits.OnePointFive.ToString()); + stopBitsComboBox.Items.Add(StopBits.Two.ToString()); + + handshakeComboBox.Items.Add(Handshake.None.ToString()); + handshakeComboBox.Items.Add(Handshake.RequestToSend.ToString()); + handshakeComboBox.Items.Add(Handshake.XOnXOff.ToString()); + } + + int GetParityIx(Parity par) + { + if (par == Parity.None) return 0; + if (par == Parity.Even) return 0; + if (par == Parity.Odd) return 0; + return -1; + } + Parity GetParity(string str) + { + if (str.Equals(Parity.None.ToString())) return Parity.None; + if (str.Equals(Parity.Even.ToString())) return Parity.Even; + if (str.Equals(Parity.Odd.ToString())) return Parity.Odd; + return (Parity)(-1); + } + + int GetStopBitsIx(StopBits sb) + { + if (sb == StopBits.None) return 0; + if (sb == StopBits.One) return 1; + if (sb == StopBits.OnePointFive) return 2; + if (sb == StopBits.Two) return 3; + return -1; + } + StopBits GetStopBits(string str) + { + if (str.Equals(StopBits.None.ToString())) return StopBits.None; + if (str.Equals(StopBits.One.ToString())) return StopBits.One; + if (str.Equals(StopBits.OnePointFive.ToString())) return StopBits.OnePointFive; + if (str.Equals(StopBits.Two.ToString())) return StopBits.Two; + return (StopBits)(-1); + } + + int GetHandshakeIx(Handshake par) + { + if (par == Handshake.None) return 0; + if (par == Handshake.RequestToSend) return 0; + if (par == Handshake.XOnXOff) return 0; + return -1; + } + Handshake GetHandshake(string str) + { + if (str.Equals(Handshake.None.ToString())) return Handshake.None; + if (str.Equals(Handshake.RequestToSend.ToString())) return Handshake.RequestToSend; + if (str.Equals(Handshake.XOnXOff.ToString())) return Handshake.XOnXOff; + return (Handshake)(-1); + } + + private void ModbusCfgCtrl_Load(object sender, EventArgs e) + { + nameLabel.Text = Strings.Name; + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + comPortNrTextBox.Text = config.ComPortNr.ToString(); + baudRateTextBox.Text = config.BaudRate.ToString(); + parityComboBox.Text = config.Parity.ToString(); + dataBitsTextBox.Text = config.DataBits.ToString(); + stopBitsComboBox.Text = config.StopBits.ToString(); + handshakeComboBox.Text = config.Handshake.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + comPortNrTextBox.Enabled = true; + baudRateTextBox.Enabled = true; + parityComboBox.Enabled = true; + dataBitsTextBox.Enabled = true; + stopBitsComboBox.Enabled = true; + handshakeComboBox.Enabled = true; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.ComPortNr = int.Parse(comPortNrTextBox.Text); + config.BaudRate = int.Parse(baudRateTextBox.Text); + config.Parity = GetParity(parityComboBox.SelectedItem.ToString()); + config.DataBits = int.Parse(dataBitsTextBox.Text); + config.StopBits = GetStopBits(stopBitsComboBox.SelectedItem.ToString()); + config.Handshake = GetHandshake(handshakeComboBox.SelectedItem.ToString()); + + return flags; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!int.TryParse(comPortNrTextBox.Text, out dummy) || dummy < 1 || dummy > 999) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Serial Port Number' is not valid"; + } + + if (!int.TryParse(baudRateTextBox.Text, out dummy) || dummy < 150 || dummy > 115200) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Baud Rate' is not valid"; + } + + if (!int.TryParse(dataBitsTextBox.Text, out dummy) || dummy < 7 || dummy > 8) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Data Bits' is not valid"; + } + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Common/ModbusCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Common/ModbusCfgCtrl.designer.cs new file mode 100644 index 00000000..bc07917f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Common/ModbusCfgCtrl.designer.cs @@ -0,0 +1,229 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.Modbus.Common +{ + partial class ModbusCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.comPortNrTextBox = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.baudRateLabel = new System.Windows.Forms.Label(); + this.baudRateTextBox = new System.Windows.Forms.TextBox(); + this.partityLabel = new System.Windows.Forms.Label(); + this.dataBitsLabel = new System.Windows.Forms.Label(); + this.dataBitsTextBox = new System.Windows.Forms.TextBox(); + this.stopBitsLabel = new System.Windows.Forms.Label(); + this.handshakeLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.parityComboBox = new System.Windows.Forms.ComboBox(); + this.stopBitsComboBox = new System.Windows.Forms.ComboBox(); + this.handshakeComboBox = new System.Windows.Forms.ComboBox(); + this.SuspendLayout(); + // + // comPortNrTextBox + // + this.comPortNrTextBox.Enabled = false; + this.comPortNrTextBox.Location = new System.Drawing.Point(140, 52); + this.comPortNrTextBox.Name = "comPortNrTextBox"; + this.comPortNrTextBox.Size = new System.Drawing.Size(34, 20); + this.comPortNrTextBox.TabIndex = 4; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(29, 55); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(98, 13); + this.label1.TabIndex = 3; + this.label1.Text = "Serial Port Number:"; + // + // baudRateLabel + // + this.baudRateLabel.AutoSize = true; + this.baudRateLabel.Location = new System.Drawing.Point(29, 79); + this.baudRateLabel.Name = "baudRateLabel"; + this.baudRateLabel.Size = new System.Drawing.Size(58, 13); + this.baudRateLabel.TabIndex = 5; + this.baudRateLabel.Text = "Baud Rate"; + // + // baudRateTextBox + // + this.baudRateTextBox.Enabled = false; + this.baudRateTextBox.Location = new System.Drawing.Point(140, 76); + this.baudRateTextBox.Name = "baudRateTextBox"; + this.baudRateTextBox.Size = new System.Drawing.Size(130, 20); + this.baudRateTextBox.TabIndex = 6; + // + // partityLabel + // + this.partityLabel.AutoSize = true; + this.partityLabel.Location = new System.Drawing.Point(29, 103); + this.partityLabel.Name = "partityLabel"; + this.partityLabel.Size = new System.Drawing.Size(33, 13); + this.partityLabel.TabIndex = 7; + this.partityLabel.Text = "Parity"; + // + // dataBitsLabel + // + this.dataBitsLabel.AutoSize = true; + this.dataBitsLabel.Location = new System.Drawing.Point(29, 127); + this.dataBitsLabel.Name = "dataBitsLabel"; + this.dataBitsLabel.Size = new System.Drawing.Size(50, 13); + this.dataBitsLabel.TabIndex = 9; + this.dataBitsLabel.Text = "Data Bits"; + // + // dataBitsTextBox + // + this.dataBitsTextBox.Enabled = false; + this.dataBitsTextBox.Location = new System.Drawing.Point(140, 124); + this.dataBitsTextBox.Name = "dataBitsTextBox"; + this.dataBitsTextBox.Size = new System.Drawing.Size(34, 20); + this.dataBitsTextBox.TabIndex = 10; + // + // stopBitsLabel + // + this.stopBitsLabel.AutoSize = true; + this.stopBitsLabel.Location = new System.Drawing.Point(29, 151); + this.stopBitsLabel.Name = "stopBitsLabel"; + this.stopBitsLabel.Size = new System.Drawing.Size(49, 13); + this.stopBitsLabel.TabIndex = 11; + this.stopBitsLabel.Text = "Stop Bits"; + // + // handshakeLabel + // + this.handshakeLabel.AutoSize = true; + this.handshakeLabel.Location = new System.Drawing.Point(29, 175); + this.handshakeLabel.Name = "handshakeLabel"; + this.handshakeLabel.Size = new System.Drawing.Size(62, 13); + this.handshakeLabel.TabIndex = 13; + this.handshakeLabel.Text = "Handshake"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(140, 28); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(30, 31); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(137, 7); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // parityComboBox + // + this.parityComboBox.Enabled = false; + this.parityComboBox.FormattingEnabled = true; + this.parityComboBox.Location = new System.Drawing.Point(140, 100); + this.parityComboBox.Name = "parityComboBox"; + this.parityComboBox.Size = new System.Drawing.Size(130, 21); + this.parityComboBox.TabIndex = 8; + // + // stopBitsComboBox + // + this.stopBitsComboBox.Enabled = false; + this.stopBitsComboBox.FormattingEnabled = true; + this.stopBitsComboBox.Location = new System.Drawing.Point(140, 148); + this.stopBitsComboBox.Name = "stopBitsComboBox"; + this.stopBitsComboBox.Size = new System.Drawing.Size(130, 21); + this.stopBitsComboBox.TabIndex = 12; + // + // handshakeComboBox + // + this.handshakeComboBox.Enabled = false; + this.handshakeComboBox.FormattingEnabled = true; + this.handshakeComboBox.Location = new System.Drawing.Point(140, 172); + this.handshakeComboBox.Name = "handshakeComboBox"; + this.handshakeComboBox.Size = new System.Drawing.Size(130, 21); + this.handshakeComboBox.TabIndex = 14; + // + // AmbientCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.Control; + this.Controls.Add(this.handshakeComboBox); + this.Controls.Add(this.stopBitsComboBox); + this.Controls.Add(this.parityComboBox); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Controls.Add(this.handshakeLabel); + this.Controls.Add(this.stopBitsLabel); + this.Controls.Add(this.dataBitsTextBox); + this.Controls.Add(this.dataBitsLabel); + this.Controls.Add(this.partityLabel); + this.Controls.Add(this.baudRateTextBox); + this.Controls.Add(this.baudRateLabel); + this.Controls.Add(this.comPortNrTextBox); + this.Controls.Add(this.label1); + this.Name = "AmbientCfgCtrl"; + this.Size = new System.Drawing.Size(300, 240); + this.Load += new System.EventHandler(this.ModbusCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox comPortNrTextBox; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label baudRateLabel; + private System.Windows.Forms.TextBox baudRateTextBox; + private System.Windows.Forms.Label partityLabel; + private System.Windows.Forms.Label dataBitsLabel; + private System.Windows.Forms.TextBox dataBitsTextBox; + private System.Windows.Forms.Label stopBitsLabel; + private System.Windows.Forms.Label handshakeLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.ComboBox parityComboBox; + private System.Windows.Forms.ComboBox stopBitsComboBox; + private System.Windows.Forms.ComboBox handshakeComboBox; + + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Common/ModbusCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Common/ModbusCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Common/ModbusCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Easytherm/Easytherm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Easytherm/Easytherm.cs new file mode 100644 index 00000000..a89e4137 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Easytherm/Easytherm.cs @@ -0,0 +1,225 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.BenchControl.Generic; +using TBF.Boxes; +using Config.Entities; + +namespace TBF.BenchControl.Modbus.Easytherm +{ + public class Easytherm : ComponentBase, IDevice, GenericDevices.ITempMeter + { + private static readonly ILog log = LogManager.GetLogger(typeof(Easytherm)); + public override string ToString() { return string.Format("Easytherm({0})", Cfg.ToString(1)); } + + readonly EasythermCfg easythermCfg; + readonly GenericDevices.IModbus modbus; + + private float temperatureSetPoint; + private bool temperatureSetPointValid; + private bool temperatureSetPointRequested; + + public float requiredTemp { get { return easythermCfg.ProcParams.RequiredTemp; } } + + public Easytherm() + { + } + + public Easytherm(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + easythermCfg = cfg as EasythermCfg; + + modbus = (GenericDevices.IModbus)TbfComponents.FindComponent(cfg.ParentName, components); + if (modbus == null) throw new Exception("Cannot find " + Name + " parent"); + + log.Debug(this.ToString()); + } + + /// Initialize this device + public void Initialize() + { + if (easythermCfg.DebugLevel == DebugMode.Simulate) return; + + temperatureSetPointValid = false; + temperatureSetPointRequested = false; + actualTemperatureIsValid = false; + } + + /// Run this device + public void RunDeviceBefore() + { + if (easythermCfg.DebugLevel == DebugMode.Simulate) return; + + + if (modbus.ReceivedTelegrams[easythermCfg.ModbusAddress].Count > 0) + { + byte[] telegram = modbus.ReceivedTelegrams[easythermCfg.ModbusAddress].Dequeue(); + if (telegram.Length == 7 && telegram[1] == (byte)Function.ReadHoldingRegisters && telegram[2] == 2) + { + ushort value = (ushort)(256 * telegram[3] + telegram[4]); + temperatureSetPoint = (float)value * 0.04f; + temperatureSetPointValid = true; + + log.InfoFormat("{0} - Received current temperature setpoint = {1}", Name, temperatureSetPoint); + } + else if (telegram.Length == 7 && telegram[1] == (byte)Function.ReadInputRegister && telegram[2] == 2) + { + ushort value = (ushort)(256 * telegram[3] + telegram[4]); + actualTemperature = (double)value * 0.04; + actualTemperatureIsValid = true; + + log.InfoFormat("{0} - Received actual temperature = {1}", Name, actualTemperature); + + if (easythermCfg.ReservoirNr > 0 && easythermCfg.ReservoirNr <= 3) + { + StateMachine.ControlBoard.SetReservoirTemp(easythermCfg.ReservoirNr, (float)actualTemperature); + } + } + } + + + if (!temperatureSetPointValid && !temperatureSetPointRequested) + { + RequestTemperatureSetpoint(); + temperatureSetPointRequested = true; + } + else if (temperatureSetPointValid && requiredTemp != temperatureSetPoint) + { + SetTemperatureSetpoint(requiredTemp); + log.InfoFormat("{0} - Set new temperature setpoint = {1}", Name, requiredTemp); + } + else if ((StateMachine.Time % 10) == (easythermCfg.ModbusAddress % 10)) /// This is to prevent overflow of the Modbus component queue for sending data + { + RequestActualTemperature(); + } + } + + /// Run this device + public void RunDeviceAfter() + { + if (easythermCfg.DebugLevel == DebugMode.Simulate) return; + } + + /// Stop this device + public void StopDevice() + { + if (easythermCfg.DebugLevel == DebugMode.Simulate) return; + } + + public void StopDevice2() { } + + + /// + /// Set Easytherm controller to required temperature procedure parameter + /// + /// true = OK, false = any error + public bool SetTemperatureSetpoint() + { + return SetTemperatureSetpoint(requiredTemp); + } + + /// + /// Set Easytherm controller to specified temperature + /// + /// Temperature in °C + /// true = OK, false = any error + public bool SetTemperatureSetpoint(float temperature) + { + if (temperature != 0 && (temperature < 5 || temperature > 95.0f)) + { + return false; /// required temperature out of range + } + + if (temperatureSetPointValid && (temperature == temperatureSetPoint)) + { + return true; /// already set to the required temperature + } + + if (temperature != 0) /// temperature==0 disables sending the setpoint + { + //ushort temperatureSetpoint = (ushort)temperature; // in °C + //ushort destAddress = (ushort)1002; + ushort usTempSetpoint = (ushort)((10000.0f / 400.0f) * temperature); // in 0.01% of range (400 °C) + ushort destAddress = (ushort)2; + /// + SendValueToEasytherm(Function.PresetSingleRegister, destAddress, usTempSetpoint); + } + + temperatureSetPoint = temperature; + temperatureSetPointValid = true; + return true; + } + + public void RequestTemperatureSetpoint() + { + SendValueToEasytherm(Function.ReadHoldingRegisters, (ushort)2, (ushort)1); // rel.address=2, 1 word + } + + public void RequestActualTemperature() + { + SendValueToEasytherm(Function.ReadInputRegister, (ushort)0, (ushort)1); // rel.address=x, 1 word + } + + void SendValueToEasytherm(Function function, ushort address, ushort value) + { + byte[] msg = new byte[8]; + + msg[0] = easythermCfg.ModbusAddress; + msg[1] = (byte)function; + msg[2] = (byte)(address >> 8); /// Relative address Hi + msg[3] = (byte)(address & 0xFF); /// Relative address Lo + msg[4] = (byte)(value >> 8); /// Data Hi + msg[5] = (byte)(value & 0xFF); /// Data Lo + + modbus.SendMessage(msg); + } + + + + /// + /// Operations, etc. + /// + + double actualTemperature; + bool actualTemperatureIsValid; + + public double ReadTemperature() + { + return actualTemperature; + } + + + /// + /// Events: SetOpututsDone, Error + /// + /// SetOutputsOp instance reference casted to IOperaton + public IOperation SetRequiredTemperatureOp() + { + return new SetRequiredTemperatureOp(this); + } + + /// + /// Events: SetOpututsDone, Error + /// + /// Reference to a variable for the pressure in Bar + /// SetOutputsOp instance reference casted to IOperaton + public IOperation SetTemperatureOp(float temperature) + { + return new SetTemperatureOp(this, temperature); + } + + public IOperation ReadTempOp(ref DoubleBox temp) + { + return new ReadTempOp(this, ref temp); + } + + public IOperation ReadTempOp(ref DoubleBox temp, Event eventDone) + { + return new ReadTempOp(this, ref temp, eventDone); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Easytherm/EasythermCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Easytherm/EasythermCfg.cs new file mode 100644 index 00000000..19b44791 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Easytherm/EasythermCfg.cs @@ -0,0 +1,55 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Modbus.Easytherm +{ + public class EasythermCfg : ComponentCfgBase, Generic.IChildComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(EasythermCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new EasythermCfgCtrl(); } + + /// + /// Serialized parameters + /// + public byte ModbusAddress; /// 1..255 + public int ReservoirNr; + + + /// Procedure parameters + [XmlIgnore] + public ProcParams ProcParams; + public override IParamsProvider GetRuntimeProcParamsProvider() { return ProcParams; } + public override IParamsProvider CreateProcParamsProvider() { return new ProcParams(true); } + + + /// Private parameterless constructor invoked by all other (public) constructors + EasythermCfg() + { + Name = "Easytherm"; + ParentName = "Modbus"; + ModbusAddress = 49; + ProcParams = CreateProcParamsProvider() as ProcParams; + } + + public EasythermCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, ModbusAddr={1}, Parent={2}", + Name, + ModbusAddress, + (string.IsNullOrEmpty(ParentName) ? "-" : ParentName)); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Easytherm/EasythermCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Easytherm/EasythermCfgCtrl.cs new file mode 100644 index 00000000..0c168456 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Easytherm/EasythermCfgCtrl.cs @@ -0,0 +1,112 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Modbus.Easytherm +{ + public partial class EasythermCfgCtrl : UserControl, IComponentCfgCtrl + { + ComponentParametersDlg parent; + + public bool ShowMore { get { return false; } } + + EasythermCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as EasythermCfg; + Redraw(); + } + } + + public EasythermCfgCtrl() + { + InitializeComponent(); + } + + private void QuidoRSCfgCtrl_Load(object sender, EventArgs e) + { + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + + if (parent.TbfComponents != null) + { + foreach (var cmpnt in parent.TbfComponents) + { + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is Modbus.Common.Factory) + { + parentNameComboBox.Items.Add(cmpnt.Name); + } + } + } + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + componentNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + parentNameComboBox.Text = string.IsNullOrEmpty(config.ParentName) ? "---" : config.ParentName; + modbusAddressTextBox.Text = config.ModbusAddress.ToString(); + reservoirNrTextBox.Text = config.ReservoirNr.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + parentNameComboBox.Enabled = true; + modbusAddressTextBox.Enabled = true; + reservoirNrTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!parentNameComboBox.Items.Contains(parentNameComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Parent Name'"; + } + if (!int.TryParse(modbusAddressTextBox.Text, out dummy) || dummy < 0 || dummy > 255) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Modbus Address' should be between 0 and 255"; + } + if (!int.TryParse(reservoirNrTextBox.Text, out dummy) || dummy < 0 || dummy > 3) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Reservoir Nr.' should be between 0 and 3"; + } + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.ParentName = parentNameComboBox.Text.Equals("---") ? string.Empty : parentNameComboBox.Text; + config.ModbusAddress = (byte)int.Parse(modbusAddressTextBox.Text); + config.ReservoirNr = int.Parse(reservoirNrTextBox.Text); + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Easytherm/EasythermCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Easytherm/EasythermCfgCtrl.designer.cs new file mode 100644 index 00000000..b7a06bae --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Easytherm/EasythermCfgCtrl.designer.cs @@ -0,0 +1,156 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.Modbus.Easytherm +{ + partial class EasythermCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.parentNameLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.componentNameLabel = new System.Windows.Forms.Label(); + this.modbusAddressLabel = new System.Windows.Forms.Label(); + this.modbusAddressTextBox = new System.Windows.Forms.TextBox(); + this.parentNameComboBox = new System.Windows.Forms.ComboBox(); + this.reservoirNrTextBox = new System.Windows.Forms.TextBox(); + this.reservoirNrLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // parentNameLabel + // + this.parentNameLabel.AutoSize = true; + this.parentNameLabel.Location = new System.Drawing.Point(28, 81); + this.parentNameLabel.Name = "parentNameLabel"; + this.parentNameLabel.Size = new System.Drawing.Size(69, 13); + this.parentNameLabel.TabIndex = 3; + this.parentNameLabel.Text = "Parent Name"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(138, 52); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(28, 55); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // componentNameLabel + // + this.componentNameLabel.AutoSize = true; + this.componentNameLabel.Location = new System.Drawing.Point(135, 28); + this.componentNameLabel.Name = "componentNameLabel"; + this.componentNameLabel.Size = new System.Drawing.Size(83, 13); + this.componentNameLabel.TabIndex = 0; + this.componentNameLabel.Text = "ComonentName"; + // + // modbusAddressLabel + // + this.modbusAddressLabel.AutoSize = true; + this.modbusAddressLabel.Location = new System.Drawing.Point(28, 108); + this.modbusAddressLabel.Name = "modbusAddressLabel"; + this.modbusAddressLabel.Size = new System.Drawing.Size(86, 13); + this.modbusAddressLabel.TabIndex = 7; + this.modbusAddressLabel.Text = "Modbus Address"; + // + // modbusAddressTextBox + // + this.modbusAddressTextBox.Enabled = false; + this.modbusAddressTextBox.Location = new System.Drawing.Point(138, 105); + this.modbusAddressTextBox.Name = "modbusAddressTextBox"; + this.modbusAddressTextBox.Size = new System.Drawing.Size(46, 20); + this.modbusAddressTextBox.TabIndex = 8; + // + // parentNameComboBox + // + this.parentNameComboBox.Enabled = false; + this.parentNameComboBox.FormattingEnabled = true; + this.parentNameComboBox.Location = new System.Drawing.Point(138, 78); + this.parentNameComboBox.Name = "parentNameComboBox"; + this.parentNameComboBox.Size = new System.Drawing.Size(130, 21); + this.parentNameComboBox.TabIndex = 4; + // + // reservoirNrTextBox + // + this.reservoirNrTextBox.Enabled = false; + this.reservoirNrTextBox.Location = new System.Drawing.Point(138, 130); + this.reservoirNrTextBox.Name = "reservoirNrTextBox"; + this.reservoirNrTextBox.Size = new System.Drawing.Size(46, 20); + this.reservoirNrTextBox.TabIndex = 10; + // + // reservoirNrLabel + // + this.reservoirNrLabel.AutoSize = true; + this.reservoirNrLabel.Location = new System.Drawing.Point(28, 133); + this.reservoirNrLabel.Name = "reservoirNrLabel"; + this.reservoirNrLabel.Size = new System.Drawing.Size(67, 13); + this.reservoirNrLabel.TabIndex = 9; + this.reservoirNrLabel.Text = "Reservoir nr."; + // + // EasythermCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.reservoirNrTextBox); + this.Controls.Add(this.reservoirNrLabel); + this.Controls.Add(this.parentNameComboBox); + this.Controls.Add(this.modbusAddressTextBox); + this.Controls.Add(this.modbusAddressLabel); + this.Controls.Add(this.parentNameLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.componentNameLabel); + this.Name = "EasythermCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.QuidoRSCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label parentNameLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label componentNameLabel; + private System.Windows.Forms.Label modbusAddressLabel; + private System.Windows.Forms.TextBox modbusAddressTextBox; + private System.Windows.Forms.ComboBox parentNameComboBox; + private System.Windows.Forms.TextBox reservoirNrTextBox; + private System.Windows.Forms.Label reservoirNrLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Easytherm/EasythermCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Easytherm/EasythermCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Easytherm/EasythermCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Easytherm/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Easytherm/Factory.cs new file mode 100644 index 00000000..4960c108 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Easytherm/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Modbus.Easytherm +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Easytherm.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Easytherm(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Easytherm(cfg, components); } + + public IComponentCfg DefaultConfig() { return new EasythermCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(EasythermCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Easytherm/ProcParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Easytherm/ProcParams.cs new file mode 100644 index 00000000..a277a59b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Easytherm/ProcParams.cs @@ -0,0 +1,139 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.IO; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.Modbus.Easytherm +{ + public class ProcParams : ProcedureParamsBase, IParamsProvider, IProcedureParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcParams) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public float RequiredTemp; /// [°C] target temperature for a temperature controller or 0=not communicated to the controller + + + public override void InitializeAll() + { + RequiredTemp = 0.0f; + } + + string[] paramNames = new string[] + { + Strings.Required_temperature_C, + }; + public override string ParamName(int i) { return paramNames[i]; } + public override int ParamsCount() { return paramNames.Length; } + + public override string ToString(int i) + { + switch (i) + { + case 0: return (RequiredTemp == 0) ? "---" : RequiredTemp.ToString(); + default: return string.Empty; + } + } + + public CfgUpdateFlags UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: + if (strValue == "-" || strValue == "--" || strValue == "---") + { + RequiredTemp = 0; + } + else + { + RequiredTemp = Utils.ParseUFloat(strValue); + } + return CfgUpdateFlags.None; + default: + return CfgUpdateFlags.None; + } + } + + /// + /// Verifiy the string representation of the parameter + /// + /// Parameter ID + /// String representation of the parameter + /// In case false is returned this is the error messsage to be displayed + /// true = parameter OK, false = parameter NOK + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + + float temp; + switch (i) + { + case 0: /// T_hot_heating + if (strValue == "-" || strValue == "--" || strValue == "---" || + (Utils.TryParseUFloat(strValue, out temp) && (temp == 0 || (temp >= 5 && temp <= 95.0f)))) + { + return true; + } + break; + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(ProcParams prms) + { + prms.RequiredTemp = this.RequiredTemp; + } + + public IParamsProvider Clone() + { + ProcParams pars = new ProcParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateFromDbEntity(ComponentProcedure dbEntity) + { + if (dbEntity == null) return; + try + { + ProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcParams; + + procedureParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + procedure = dbEntity.Procedure; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + /// + /// Parameterless constructor initializes the parameters + /// + public ProcParams() + { + } + + public ProcParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public ProcParams(ComponentProcedure procParamsEntity, string componentName, Procedure procedure) + { + this.procedureParamsEntity = procParamsEntity; + this.componentName = componentName; + this.procedure = procedure; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Easytherm/ReadTempOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Easytherm/ReadTempOp.cs new file mode 100644 index 00000000..e93c9561 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Easytherm/ReadTempOp.cs @@ -0,0 +1,61 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using log4net; +using TBF.Boxes; + +namespace TBF.BenchControl.Modbus.Easytherm +{ + public class ReadTempOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(ReadTempOp)); + public override string ToString() { return string.Format("ReadTempOp({0},.,{1})", easytherm.Name, eventDone); } + + /// Set by the constructor + Easytherm easytherm; + Event eventDone; + DoubleBox temp; + + /// + /// Events: TempInDone, TempOutDone, TempDivDone or Error + /// + /// TempMeter reference + /// Reference to the variable, value is in degree Celsius + /// Event to be returned by Run() when completed OK + public ReadTempOp(Easytherm easytherm, ref DoubleBox temp, Event eventDone) + { + if (easytherm == null) throw new ArgumentNullException("easytherm"); + this.easytherm = easytherm; + this.temp = temp; + this.eventDone = eventDone; + log.Debug(this.ToString()); + } + + public ReadTempOp(Easytherm tempMeter, ref DoubleBox temp) + : this(tempMeter, ref temp, Event.TempDone) + { + } + + /// Start this operation + public void Start() + { + temp.Val = easytherm.ReadTemperature(); + } + + /// Run this operation + /// + /// Event.TempInDone, Event.TempOutDone or Event.TempDivDone + /// + public Event Run() + { + temp.Val = easytherm.ReadTemperature(); + return eventDone; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Easytherm/SetRequiredTemperatureOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Easytherm/SetRequiredTemperatureOp.cs new file mode 100644 index 00000000..069f41b8 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Easytherm/SetRequiredTemperatureOp.cs @@ -0,0 +1,55 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using log4net; +using TBF.Boxes; + +namespace TBF.BenchControl.Modbus.Easytherm +{ + public class SetRequiredTemperatureOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(SetRequiredTemperatureOp)); + public override string ToString() { return string.Format("SetRequiredTemperatureOp({0})", eventDone); } + + /// Set by the constructor + readonly Easytherm easytherm; + readonly Event eventDone; + + /// + /// Events: PressureInDone, PressureOutDone or Error + /// + /// Pressure meter reference + /// Reference to the measured pressure variable, value is in bar + /// Event to be returned by Run() when completed OK + public SetRequiredTemperatureOp(Easytherm easytherm, Event eventDone) + { + if (easytherm == null) throw new ArgumentNullException("easytherm"); + this.easytherm = easytherm; + this.eventDone = eventDone; + + log.Debug(this.ToString()); + } + public SetRequiredTemperatureOp(Easytherm easytherm) + : this(easytherm, Event.ConditionMet) + { + } + + /// Start this operation + public void Start() + { + easytherm.SetTemperatureSetpoint(); + } + + /// Run this operation + public Event Run() + { + return eventDone; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Easytherm/SetTemperatureOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Easytherm/SetTemperatureOp.cs new file mode 100644 index 00000000..1f3cdf7d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Easytherm/SetTemperatureOp.cs @@ -0,0 +1,57 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using log4net; +using TBF.Boxes; + +namespace TBF.BenchControl.Modbus.Easytherm +{ + public class SetTemperatureOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(SetTemperatureOp)); + public override string ToString() { return string.Format("SetTemperatureOp({0},{1})", temperatureSetpoint, eventDone); } + + /// Set by the constructor + readonly Easytherm easytherm; + readonly Event eventDone; + float temperatureSetpoint; + + /// + /// Events: PressureInDone, PressureOutDone or Error + /// + /// Pressure meter reference + /// Reference to the measured pressure variable, value is in bar + /// Event to be returned by Run() when completed OK + public SetTemperatureOp(Easytherm easytherm, float temperatureSetpoint, Event eventDone) + { + if (easytherm == null) throw new ArgumentNullException("easytherm"); + this.easytherm = easytherm; + this.temperatureSetpoint = temperatureSetpoint; + this.eventDone = eventDone; + + log.Debug(this.ToString()); + } + public SetTemperatureOp(Easytherm easytherm, float temperatureSetpoint) + : this(easytherm, temperatureSetpoint, Event.SetOutputsDone) + { + } + + /// Start this operation + public void Start() + { + easytherm.SetTemperatureSetpoint(temperatureSetpoint); + } + + /// Run this operation + public Event Run() + { + return eventDone; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Enums.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Enums.cs new file mode 100644 index 00000000..beecbdb1 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/Enums.cs @@ -0,0 +1,20 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +using System; + +namespace TBF.BenchControl.Modbus +{ + public enum Function : byte + { + ReadCoilStatus = 0x01, + ReadSingleInput = 0x02, + ReadHoldingRegisters = 0x03, + ReadInputRegister = 0x04, + ForceSingleCoil = 0x05, + PresetSingleRegister = 0x06, + ForceMultipleCoils = 0x0F, + PresetMultipleRegisters = 0x10, + Identification = 0x11, + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/PressureMeter/Meret/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/PressureMeter/Meret/Factory.cs new file mode 100644 index 00000000..ba6fdfc3 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/PressureMeter/Meret/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Modbus.PressureMeter.Meret +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { PressureMeter.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new PressureMeter(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new PressureMeter(cfg, components); } + + public IComponentCfg DefaultConfig() { return new PressureMeterCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(PressureMeterCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/PressureMeter/Meret/PressureMeter.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/PressureMeter/Meret/PressureMeter.cs new file mode 100644 index 00000000..74f60d1c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/PressureMeter/Meret/PressureMeter.cs @@ -0,0 +1,119 @@ +/// +/// Copyright (c) 2016-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.BenchControl.Generic; +using TBF.Boxes; + +namespace TBF.BenchControl.Modbus.PressureMeter.Meret +{ + public class PressureMeter : ComponentBase, GenericDevices.IPressureMeter, IDevice + { + private static readonly ILog log = LogManager.GetLogger(typeof(PressureMeter)); + public override string ToString() { return string.Format("PressureMeter({0})", Cfg.ToString(1)); } + + readonly PressureMeterCfg pressureMtrCfg; + readonly GenericDevices.IModbus modbus; + + private float receivedPressure; + + const ushort WatchdogBitMask = 0x0010; + + public PressureMeter() + { + } + + public PressureMeter(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + pressureMtrCfg = cfg as PressureMeterCfg; + + modbus = (GenericDevices.IModbus)TbfComponents.FindComponent(cfg.ParentName, components); + if (modbus == null) throw new Exception("Cannot find " + Name + " parent"); + + /// Connect to handler + //ModbusAddress.MeretRS485Address[Idx0] = ModbusAddress; + + log.Debug(this.ToString()); + } + + /// Initialize this device + public void Initialize() + { + } + + + /// + /// Returns the water pressure + /// + /// Pressure in mBar + public float ReadPressure() + { + return (float)Config.Units.ConvertFrom(Config.Unit.kPa, receivedPressure); + } + + /// + /// Events: PressureDone, Error + /// + /// Reference to a variable for the pressure in Bar + /// ReadPressureOp instance reference casted to IOperaton + public IOperation ReadPressureOp(ref FloatBox pressure) + { + return new ReadPressureOp(this, ref pressure); + } + + /// + /// Events: pressureDone, Error + /// + /// Reference to a variable for the pressure in Bar + /// Event returned when measurement done + /// ReadPressureOp instance reference casted to IOperaton + public IOperation ReadPressureOp(ref FloatBox pressure, Event pressureDone) + { + return new ReadPressureOp(this, ref pressure, pressureDone); + } + + + /// Run this device + public void RunDeviceBefore() + { + if (pressureMtrCfg.DebugLevel == Config.Entities.DebugMode.Simulate || + pressureMtrCfg.DebugLevel == Config.Entities.DebugMode.FailureDuringOperation) + { + return; + } + + if (modbus.ReceivedTelegrams[pressureMtrCfg.ModbusAddress].Count > 0) + { + byte[] telegram = modbus.ReceivedTelegrams[pressureMtrCfg.ModbusAddress].Dequeue(); + if (telegram.Length == 9 && telegram[1] == 4 && telegram[2] == 4) + { + /// Swap byte order + byte t1 = telegram[3]; + byte t2 = telegram[4]; + byte t3 = telegram[5]; + byte t4 = telegram[6]; + telegram[3] = t4; + telegram[4] = t3; + telegram[5] = t2; + telegram[6] = t1; + + receivedPressure = System.BitConverter.ToSingle(telegram, 3); + } + } + + if ((StateMachine.Time % 3) == (pressureMtrCfg.ModbusAddress % 3)) /// Each 3 seconds + { + const byte Function = 4; /// Read input registers + const ushort Address = 0; /// Pressure + modbus.SendMessage(pressureMtrCfg.ModbusAddress, Function, Address, 2); + } + } + + public void RunDeviceAfter() { } + public void StopDevice() { } + public void StopDevice2() { } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/PressureMeter/Meret/PressureMeterCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/PressureMeter/Meret/PressureMeterCfg.cs new file mode 100644 index 00000000..009ee308 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/PressureMeter/Meret/PressureMeterCfg.cs @@ -0,0 +1,46 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Modbus.PressureMeter.Meret +{ + public class PressureMeterCfg : ComponentCfgBase, Generic.IChildComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(PressureMeterCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new PressureMeterCfgCtrl(); } + + /// + /// Serialized parameters + /// + public byte ModbusAddress; /// 1..255 + + /// Private parameterless constructor invoked by all other (public) constructors + PressureMeterCfg() + { + Name = "Pr"; + ParentName = "Modbus"; + ModbusAddress = 49; + } + + public PressureMeterCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, ModbusAddr={1}, Parent={2}", + Name, + ModbusAddress, + (string.IsNullOrEmpty(ParentName) ? "-" : ParentName)); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/PressureMeter/Meret/PressureMeterCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/PressureMeter/Meret/PressureMeterCfgCtrl.cs new file mode 100644 index 00000000..aa04b429 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/PressureMeter/Meret/PressureMeterCfgCtrl.cs @@ -0,0 +1,104 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Modbus.PressureMeter.Meret +{ + public partial class PressureMeterCfgCtrl : UserControl, IComponentCfgCtrl + { + ComponentParametersDlg parent; + + public bool ShowMore { get { return false; } } + + PressureMeterCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as PressureMeterCfg; + Redraw(); + } + } + + public PressureMeterCfgCtrl() + { + InitializeComponent(); + } + + private void PressureMeterCfgCtrl_Load(object sender, EventArgs e) + { + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + + if (parent.TbfComponents != null) + { + foreach (var cmpnt in parent.TbfComponents) + { + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is Modbus.Common.Factory) + { + parentNameComboBox.Items.Add(cmpnt.Name); + } + } + } + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + componentNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + parentNameComboBox.Text = string.IsNullOrEmpty(config.ParentName) ? "---" : config.ParentName; + modbusAddressTextBox.Text = config.ModbusAddress.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + parentNameComboBox.Enabled = true; + modbusAddressTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!parentNameComboBox.Items.Contains(parentNameComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Parent Name'"; + } + if (!int.TryParse(modbusAddressTextBox.Text, out dummy) || dummy < 0 || dummy > 255) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Modbus Address' should be between 0 and 255"; + } + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.ParentName = parentNameComboBox.Text.Equals("---") ? string.Empty : parentNameComboBox.Text; + config.ModbusAddress = (byte)int.Parse(modbusAddressTextBox.Text); + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/PressureMeter/Meret/PressureMeterCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/PressureMeter/Meret/PressureMeterCfgCtrl.designer.cs new file mode 100644 index 00000000..8f443a7d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/PressureMeter/Meret/PressureMeterCfgCtrl.designer.cs @@ -0,0 +1,133 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +namespace TBF.BenchControl.Modbus.PressureMeter.Meret +{ + partial class PressureMeterCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.parentNameLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.componentNameLabel = new System.Windows.Forms.Label(); + this.modbusAddressLabel = new System.Windows.Forms.Label(); + this.modbusAddressTextBox = new System.Windows.Forms.TextBox(); + this.parentNameComboBox = new System.Windows.Forms.ComboBox(); + this.SuspendLayout(); + // + // parentNameLabel + // + this.parentNameLabel.AutoSize = true; + this.parentNameLabel.Location = new System.Drawing.Point(28, 81); + this.parentNameLabel.Name = "parentNameLabel"; + this.parentNameLabel.Size = new System.Drawing.Size(69, 13); + this.parentNameLabel.TabIndex = 3; + this.parentNameLabel.Text = "Parent Name"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(138, 52); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(28, 55); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // componentNameLabel + // + this.componentNameLabel.AutoSize = true; + this.componentNameLabel.Location = new System.Drawing.Point(135, 28); + this.componentNameLabel.Name = "componentNameLabel"; + this.componentNameLabel.Size = new System.Drawing.Size(83, 13); + this.componentNameLabel.TabIndex = 0; + this.componentNameLabel.Text = "ComonentName"; + // + // modbusAddressLabel + // + this.modbusAddressLabel.AutoSize = true; + this.modbusAddressLabel.Location = new System.Drawing.Point(28, 133); + this.modbusAddressLabel.Name = "modbusAddressLabel"; + this.modbusAddressLabel.Size = new System.Drawing.Size(86, 13); + this.modbusAddressLabel.TabIndex = 7; + this.modbusAddressLabel.Text = "Modbus Address"; + // + // modbusAddressTextBox + // + this.modbusAddressTextBox.Enabled = false; + this.modbusAddressTextBox.Location = new System.Drawing.Point(138, 130); + this.modbusAddressTextBox.Name = "modbusAddressTextBox"; + this.modbusAddressTextBox.Size = new System.Drawing.Size(46, 20); + this.modbusAddressTextBox.TabIndex = 8; + // + // parentNameComboBox + // + this.parentNameComboBox.Enabled = false; + this.parentNameComboBox.FormattingEnabled = true; + this.parentNameComboBox.Location = new System.Drawing.Point(138, 78); + this.parentNameComboBox.Name = "parentNameComboBox"; + this.parentNameComboBox.Size = new System.Drawing.Size(130, 21); + this.parentNameComboBox.TabIndex = 4; + // + // ComponentCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.parentNameComboBox); + this.Controls.Add(this.modbusAddressTextBox); + this.Controls.Add(this.modbusAddressLabel); + this.Controls.Add(this.parentNameLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.componentNameLabel); + this.Name = "ComponentCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.PressureMeterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label parentNameLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label componentNameLabel; + private System.Windows.Forms.Label modbusAddressLabel; + private System.Windows.Forms.TextBox modbusAddressTextBox; + private System.Windows.Forms.ComboBox parentNameComboBox; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/PressureMeter/Meret/PressureMeterCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/PressureMeter/Meret/PressureMeterCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/PressureMeter/Meret/PressureMeterCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/PressureMeter/Meret/ReadPressureOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/PressureMeter/Meret/ReadPressureOp.cs new file mode 100644 index 00000000..986bbc42 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/PressureMeter/Meret/ReadPressureOp.cs @@ -0,0 +1,64 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using log4net; +using TBF.Boxes; + +namespace TBF.BenchControl.Modbus.PressureMeter.Meret +{ + public class ReadPressureOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(ReadPressureOp)); + public override string ToString() { return string.Format("ReadPressureOp(.,{0},.)", eventDone); } + + /// Set by the constructor + readonly PressureMeter pressureMeter; + readonly Event eventDone; + + /// Measured value + FloatBox pressure; + + /// + /// Events: PressureInDone, PressureOutDone or Error + /// + /// Pressure meter reference + /// Reference to the measured pressure variable, value is in bar + /// Event to be returned by Run() when completed OK + public ReadPressureOp(PressureMeter pressureMeter, ref FloatBox pressure, Event eventDone) + { + if (pressureMeter == null) throw new ArgumentNullException("pressureMeter"); + this.pressureMeter = pressureMeter; + this.pressure = pressure; + this.eventDone = eventDone; + + log.Debug(this.ToString()); + } + public ReadPressureOp(PressureMeter pressureMeter, ref FloatBox pressure) + : this(pressureMeter, ref pressure, Event.PressureDone) + { + } + + + /// Start this operation + public void Start() + { + pressure.Val = pressureMeter.ReadPressure(); + } + + /// Run this operation + /// + /// Event.PressureInDone or Event.PressureOutDone + /// + public Event Run() + { + pressure.Val = pressureMeter.ReadPressure(); + return eventDone; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/QuidoRS/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/QuidoRS/Factory.cs new file mode 100644 index 00000000..59d8e752 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/QuidoRS/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Modbus.QuidoRS +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { QuidoRS.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new QuidoRS(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new QuidoRS(cfg, components); } + + public IComponentCfg DefaultConfig() { return new QuidoRSCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(QuidoRSCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/QuidoRS/QuidoRS.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/QuidoRS/QuidoRS.cs new file mode 100644 index 00000000..20a3141d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/QuidoRS/QuidoRS.cs @@ -0,0 +1,166 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.BenchControl.Generic; +using TBF.Boxes; + +namespace TBF.BenchControl.Modbus.QuidoRS +{ + public class QuidoRS : ComponentBase, IDevice + { + private static readonly ILog log = LogManager.GetLogger(typeof(QuidoRS)); + public override string ToString() { return string.Format("QuidoRS({0})", Cfg.ToString(1)); } + + readonly QuidoRSCfg quidoRSCfg; + readonly GenericDevices.IModbus modbus; + + private ushort currentOutputs; + private DateTime lastOutputsChange; + + ushort watchdogBitMask; + + public QuidoRS() + { + } + + public QuidoRS(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + quidoRSCfg = cfg as QuidoRSCfg; + + modbus = (GenericDevices.IModbus)TbfComponents.FindComponent(cfg.ParentName, components); + if (modbus == null) throw new Exception("Cannot find " + Name + " parent"); + + watchdogBitMask = (ushort)(quidoRSCfg.WatchdogEnabled ? (1 << quidoRSCfg.WatchdogBitNr) : 0); + + log.Debug(this.ToString()); + } + + /// Initialize this device + public void Initialize() + { + } + + /// Run this device + public void RunDeviceBefore() + { + if (quidoRSCfg.DebugLevel == Config.Entities.DebugMode.Simulate) return; + + lock (this) + { + if (watchdogBitMask != 0 && (DateTime.Now - lastOutputsChange) > new TimeSpan(0, 0, 0, 0, 3000)) /// Toggle after 1.5 sec (resulting in toggle period 2 sec) + { + currentOutputs = (UInt16)((Int32)currentOutputs ^ (Int32)watchdogBitMask); + SendOutputs(currentOutputs); + } + } + + if (modbus.ReceivedTelegrams[quidoRSCfg.ModbusAddress].Count > 0) + { + modbus.ReceivedTelegrams[quidoRSCfg.ModbusAddress].Dequeue(); + } + } + + public void RunDeviceAfter() { } + public void StopDevice() { } + public void StopDevice2() { } + + + /// + /// Set outputs of QuidoRS board + /// + /// output value + public void SetOutputs(ushort outputs) + { + lock (this) + { + currentOutputs = (UInt16)((Int32)outputs | ((Int32)currentOutputs & (Int32)watchdogBitMask)); + if (watchdogBitMask != 0) + { + currentOutputs = (UInt16)((Int32)currentOutputs ^ (Int32)watchdogBitMask); + } + SendOutputs(currentOutputs); + } + } + + /// + /// Set bit(s) specified by a bitMask. Leave other bits unaffeced. + /// + /// Specifies bit(s) to set + /// output value + public void SetBit(ushort bitMask) + { + lock (this) + { + currentOutputs = (UInt16)((Int32)currentOutputs | (Int32)bitMask); + if (watchdogBitMask != 0) + { + currentOutputs = (UInt16)((Int32)currentOutputs ^ (Int32)watchdogBitMask); + } + SendOutputs(currentOutputs); + } + } + + /// + /// Reset bit(s) specified by a bitMask. Leave other bits unaffeced. + /// + /// Specifies bit(s) to reset + /// output value + public void ResetBit(ushort bitMask) + { + lock (this) + { + currentOutputs = (UInt16)((Int32)currentOutputs & (~(Int32)bitMask)); + if (watchdogBitMask != 0) + { + currentOutputs = (UInt16)((Int32)currentOutputs ^ (Int32)watchdogBitMask); + } + SendOutputs(currentOutputs); + } + } + + private void SendOutputs(ushort outputs) + { + byte[] msg = new byte[11]; + + msg[0] = quidoRSCfg.ModbusAddress; + msg[1] = (byte)Function.ForceMultipleCoils; + msg[2] = 0; /// Data Hi + msg[3] = 0; /// Data Lo + msg[4] = 0; /// Nr. of coils Hi + msg[5] = 16; /// Nr. of coils Lo + msg[6] = 2; /// Byte count + msg[7] = (byte)(outputs & 0xFF); /// Output data Lo + msg[8] = (byte)(outputs >> 8); /// Output data Hi + + modbus.SendMessage(msg); + + lastOutputsChange = DateTime.Now; + } + + + /// + /// Events: SetOpututsDone, Error + /// + /// Reference to a variable for the pressure in Bar + /// SetOutputsOp instance reference casted to IOperaton + public IOperation SetOutputsOp(ushort outValue) + { + return new SetOutputsOp(this, outValue); + } + + /// + /// Events: pressureDone, Error + /// + /// Reference to a variable for the pressure in Bar + /// Event returned when SetOutput is done + /// SetOutputsOp instance reference casted to IOperaton + public IOperation ReadPressureOp(ushort outValue, Event setOutputsDone) + { + return new SetOutputsOp(this, outValue, setOutputsDone); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/QuidoRS/QuidoRSCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/QuidoRS/QuidoRSCfg.cs new file mode 100644 index 00000000..c9377220 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/QuidoRS/QuidoRSCfg.cs @@ -0,0 +1,50 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Modbus.QuidoRS +{ + public class QuidoRSCfg : ComponentCfgBase, Generic.IChildComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(QuidoRSCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new QuidoRSCfgCtrl(); } + + /// + /// Serialized parameters + /// + public byte ModbusAddress; /// 1..255 + public bool WatchdogEnabled; + public int WatchdogBitNr; /// 0..15 + + /// Private parameterless constructor invoked by all other (public) constructors + QuidoRSCfg() + { + Name = "QuidoRS"; + ParentName = "Modbus"; + ModbusAddress = 49; + WatchdogEnabled = true; + WatchdogBitNr = 4; + } + + public QuidoRSCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, ModbusAddr={1}, Parent={2}", + Name, + ModbusAddress, + (string.IsNullOrEmpty(ParentName) ? "-" : ParentName)); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/QuidoRS/QuidoRSCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/QuidoRS/QuidoRSCfgCtrl.cs new file mode 100644 index 00000000..5a45598f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/QuidoRS/QuidoRSCfgCtrl.cs @@ -0,0 +1,115 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Modbus.QuidoRS +{ + public partial class QuidoRSCfgCtrl : UserControl, IComponentCfgCtrl + { + ComponentParametersDlg parent; + + public bool ShowMore { get { return false; } } + + QuidoRSCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as QuidoRSCfg; + Redraw(); + } + } + + public QuidoRSCfgCtrl() + { + InitializeComponent(); + } + + private void QuidoRSCfgCtrl_Load(object sender, EventArgs e) + { + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + + if (parent.TbfComponents != null) + { + foreach (var cmpnt in parent.TbfComponents) + { + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is Modbus.Common.Factory) + { + parentNameComboBox.Items.Add(cmpnt.Name); + } + } + } + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + componentNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + parentNameComboBox.Text = string.IsNullOrEmpty(config.ParentName) ? "---" : config.ParentName; + modbusAddressTextBox.Text = config.ModbusAddress.ToString(); + watchdogCheckBox.Checked = config.WatchdogEnabled; + watchdogBitNrTextBox.Text = config.WatchdogBitNr.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + parentNameComboBox.Enabled = true; + modbusAddressTextBox.Enabled = true; + watchdogCheckBox.Enabled = true; + watchdogBitNrTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!parentNameComboBox.Items.Contains(parentNameComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Parent Name'"; + } + if (!int.TryParse(modbusAddressTextBox.Text, out dummy) || dummy < 0 || dummy > 255) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Modbus Address' should be between 0 and 255"; + } + if (!int.TryParse(watchdogBitNrTextBox.Text, out dummy) || dummy < 0 || dummy > 15) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Watchdog Bit Nr.' should be between 0 and 15"; + } + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.ParentName = parentNameComboBox.Text.Equals("---") ? string.Empty : parentNameComboBox.Text; + config.ModbusAddress = (byte)int.Parse(modbusAddressTextBox.Text); + config.WatchdogEnabled = watchdogCheckBox.Checked; + config.WatchdogBitNr = int.Parse(watchdogBitNrTextBox.Text); + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/QuidoRS/QuidoRSCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/QuidoRS/QuidoRSCfgCtrl.designer.cs new file mode 100644 index 00000000..fb8606fb --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/QuidoRS/QuidoRSCfgCtrl.designer.cs @@ -0,0 +1,170 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.Modbus.QuidoRS +{ + partial class QuidoRSCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.parentNameLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.componentNameLabel = new System.Windows.Forms.Label(); + this.modbusAddressLabel = new System.Windows.Forms.Label(); + this.modbusAddressTextBox = new System.Windows.Forms.TextBox(); + this.parentNameComboBox = new System.Windows.Forms.ComboBox(); + this.watchdogCheckBox = new System.Windows.Forms.CheckBox(); + this.watchdogBitNrTextBox = new System.Windows.Forms.TextBox(); + this.watchdogBitNrLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // parentNameLabel + // + this.parentNameLabel.AutoSize = true; + this.parentNameLabel.Location = new System.Drawing.Point(28, 81); + this.parentNameLabel.Name = "parentNameLabel"; + this.parentNameLabel.Size = new System.Drawing.Size(69, 13); + this.parentNameLabel.TabIndex = 3; + this.parentNameLabel.Text = "Parent Name"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(138, 52); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(28, 55); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // componentNameLabel + // + this.componentNameLabel.AutoSize = true; + this.componentNameLabel.Location = new System.Drawing.Point(135, 28); + this.componentNameLabel.Name = "componentNameLabel"; + this.componentNameLabel.Size = new System.Drawing.Size(83, 13); + this.componentNameLabel.TabIndex = 0; + this.componentNameLabel.Text = "ComonentName"; + // + // modbusAddressLabel + // + this.modbusAddressLabel.AutoSize = true; + this.modbusAddressLabel.Location = new System.Drawing.Point(28, 108); + this.modbusAddressLabel.Name = "modbusAddressLabel"; + this.modbusAddressLabel.Size = new System.Drawing.Size(86, 13); + this.modbusAddressLabel.TabIndex = 7; + this.modbusAddressLabel.Text = "Modbus Address"; + // + // modbusAddressTextBox + // + this.modbusAddressTextBox.Enabled = false; + this.modbusAddressTextBox.Location = new System.Drawing.Point(138, 105); + this.modbusAddressTextBox.Name = "modbusAddressTextBox"; + this.modbusAddressTextBox.Size = new System.Drawing.Size(46, 20); + this.modbusAddressTextBox.TabIndex = 8; + // + // parentNameComboBox + // + this.parentNameComboBox.Enabled = false; + this.parentNameComboBox.FormattingEnabled = true; + this.parentNameComboBox.Location = new System.Drawing.Point(138, 78); + this.parentNameComboBox.Name = "parentNameComboBox"; + this.parentNameComboBox.Size = new System.Drawing.Size(130, 21); + this.parentNameComboBox.TabIndex = 4; + // + // watchdogCheckBox + // + this.watchdogCheckBox.AutoSize = true; + this.watchdogCheckBox.Enabled = false; + this.watchdogCheckBox.Location = new System.Drawing.Point(31, 131); + this.watchdogCheckBox.Name = "watchdogCheckBox"; + this.watchdogCheckBox.Size = new System.Drawing.Size(99, 17); + this.watchdogCheckBox.TabIndex = 9; + this.watchdogCheckBox.Text = "Watchdog \'ON\'"; + this.watchdogCheckBox.UseVisualStyleBackColor = true; + // + // watchdogBitNrTextBox + // + this.watchdogBitNrTextBox.Enabled = false; + this.watchdogBitNrTextBox.Location = new System.Drawing.Point(138, 153); + this.watchdogBitNrTextBox.Name = "watchdogBitNrTextBox"; + this.watchdogBitNrTextBox.Size = new System.Drawing.Size(46, 20); + this.watchdogBitNrTextBox.TabIndex = 11; + // + // watchdogBitNrLabel + // + this.watchdogBitNrLabel.AutoSize = true; + this.watchdogBitNrLabel.Location = new System.Drawing.Point(28, 156); + this.watchdogBitNrLabel.Name = "watchdogBitNrLabel"; + this.watchdogBitNrLabel.Size = new System.Drawing.Size(81, 13); + this.watchdogBitNrLabel.TabIndex = 10; + this.watchdogBitNrLabel.Text = "Watchdog bit #"; + // + // QuidoRSCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.watchdogBitNrTextBox); + this.Controls.Add(this.watchdogBitNrLabel); + this.Controls.Add(this.watchdogCheckBox); + this.Controls.Add(this.parentNameComboBox); + this.Controls.Add(this.modbusAddressTextBox); + this.Controls.Add(this.modbusAddressLabel); + this.Controls.Add(this.parentNameLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.componentNameLabel); + this.Name = "QuidoRSCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.QuidoRSCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label parentNameLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label componentNameLabel; + private System.Windows.Forms.Label modbusAddressLabel; + private System.Windows.Forms.TextBox modbusAddressTextBox; + private System.Windows.Forms.ComboBox parentNameComboBox; + private System.Windows.Forms.CheckBox watchdogCheckBox; + private System.Windows.Forms.TextBox watchdogBitNrTextBox; + private System.Windows.Forms.Label watchdogBitNrLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/QuidoRS/QuidoRSCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/QuidoRS/QuidoRSCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/QuidoRS/QuidoRSCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/QuidoRS/SetOutputsOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/QuidoRS/SetOutputsOp.cs new file mode 100644 index 00000000..6546db0b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/QuidoRS/SetOutputsOp.cs @@ -0,0 +1,57 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +using System; +using log4net; +using TBF.Boxes; + +namespace TBF.BenchControl.Modbus.QuidoRS +{ + public class SetOutputsOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(SetOutputsOp)); + public override string ToString() { return string.Format("SetOutputsOp(.,{0},{1})", outValue, eventDone); } + + /// Set by the constructor + readonly QuidoRS quidoRS; + readonly Event eventDone; + ushort outValue; + + /// + /// Events: PressureInDone, PressureOutDone or Error + /// + /// Pressure meter reference + /// Reference to the measured pressure variable, value is in bar + /// Event to be returned by Run() when completed OK + public SetOutputsOp(QuidoRS quidoRS, ushort outValue, Event eventDone) + { + if (quidoRS == null) throw new ArgumentNullException("quidoRS"); + this.quidoRS = quidoRS; + this.outValue = outValue; + this.eventDone = eventDone; + + log.Debug(this.ToString()); + } + public SetOutputsOp(QuidoRS quidoRS, ushort outValue) + : this(quidoRS, outValue, Event.SetOutputsDone) + { + } + + /// Start this operation + public void Start() + { + quidoRS.SetOutputs(outValue); + } + + /// Run this operation + public Event Run() + { + return eventDone; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/TankSelector/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/TankSelector/Factory.cs new file mode 100644 index 00000000..6ea6bbbe --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/TankSelector/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Modbus.TankSelector +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { TankSelector.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new TankSelector(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new TankSelector(cfg, components); } + + public IComponentCfg DefaultConfig() { return new TankSelectorCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TankSelectorCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/TankSelector/SelectTankOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/TankSelector/SelectTankOp.cs new file mode 100644 index 00000000..b98d8d60 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/TankSelector/SelectTankOp.cs @@ -0,0 +1,145 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using log4net; + +namespace TBF.BenchControl.Modbus.TankSelector +{ + public class SelectTankOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(SelectTankOp)); + + TankSelector tankSelector; + TankId tankId; + ushort bitMask; + ushort unselectBitMask; + bool alreadySet; + bool unselectedWaitLevel; + bool doUnselect; + int time; + + public SelectTankOp(TankSelector tankSelector, TankId tankId) + { + this.tankSelector = tankSelector; + this.tankId = tankId; /// tankId is always TankId.Cold, TankId.Warm or TankId.Hot + this.bitMask = (ushort)((tankId == TankId.Cold) ? QuidoOutputs.SelectColdTank + : (tankId == TankId.Warm) ? QuidoOutputs.SelectWarmTank + : QuidoOutputs.SelectHotTank); + } + + + /// Start this operation + public void Start() + { + if (tankSelector.CurrentActivity == Activity.Selected && tankSelector.CurrentTank == tankId) + { + alreadySet = true; /// Nothing to be done in Run() + unselectedWaitLevel = false; + doUnselect = false; + } + else if (tankSelector.CurrentActivity == Activity.Selected_Waiting1min && tankSelector.CurrentTank == tankId) + { + alreadySet = false; + unselectedWaitLevel = false; + doUnselect = false; + time = 1; /// Skip resetting button bit in Run(), wait 1 min. + } + else if (tankSelector.CurrentActivity == Activity.Idle || + tankSelector.CurrentActivity == Activity.Unknown) + { + SelectTankFromIdleState(); + } + else if (tankSelector.CurrentActivity == Activity.Unselected_WaitingLevel) + { + alreadySet = false; + unselectedWaitLevel = true; + doUnselect = false; + } + else if (tankSelector.CurrentActivity == Activity.Selected || + tankSelector.CurrentActivity == Activity.Selected_Waiting1min) + { + /// + /// it follows that (tankSelector.CurrentTank != tankId) => unselect the tank first + /// + alreadySet = false; + unselectedWaitLevel = false; + doUnselect = true; + + TankId selectedTankId = tankSelector.CurrentTank; + + unselectBitMask = (ushort)((selectedTankId == TankId.Cold) ? QuidoOutputs.PumpToColdTank + : (selectedTankId == TankId.Warm) ? QuidoOutputs.PumpToWarmTank + : QuidoOutputs.PumpToHotTank); + + tankSelector.State = (selectedTankId == TankId.Cold) ? State.ColdTankUnselected_WaitingLevel + : (selectedTankId == TankId.Warm) ? State.WarmTankUnselected_WaitingLevel + : State.HotTankUnselected_WaitingLevel; + + tankSelector.SetBit(unselectBitMask); + } + + log.DebugFormat("Start() alreadySet={0} unselectedWaitLevel={1} doUnselect={2} time={3} tankId={4}", alreadySet, unselectedWaitLevel, doUnselect, time, tankId); + } + + void SelectTankFromIdleState() + { + /// tankId is always TankId.Cold, TankId.Warm or TankId.Hot + tankSelector.State = (tankId == TankId.Cold) ? State.ColdTankSelected_Waiting1min + : (tankId == TankId.Warm) ? State.WarmTankSelected_Waiting1min + : State.HotTankSelected_Waiting1min; + + alreadySet = false; + unselectedWaitLevel = false; + doUnselect = false; + time = 0; /// Reset button bit in Run(), wait 1 min. + + tankSelector.SetBit(bitMask); + } + + /// Run this operation + public Event Run() + { + log.DebugFormat("Run() alreadySet={0} unselectedWaitLevel={1} doUnselect={2} time={3} tankId={4}", alreadySet, unselectedWaitLevel, doUnselect, time, tankId); + + if (alreadySet) + { + return Event.ConditionMet; + } + else if (doUnselect) + { + tankSelector.ResetBit(unselectBitMask); + doUnselect = false; + unselectedWaitLevel = true; + return Event.ConditionNotMet; + } + else if (unselectedWaitLevel) + { + if (tankSelector.CurrentActivity == Activity.Idle) + { + SelectTankFromIdleState(); + } + return Event.ConditionNotMet; + } + else if (time == 0) + { + tankSelector.ResetBit(bitMask); + time++; + return Event.ConditionNotMet; + } + else if (time <= 60) + { + time++; + return Event.ConditionNotMet; + } + else + { + return Event.ConditionMet; + } + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/TankSelector/SetQuidoBitOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/TankSelector/SetQuidoBitOp.cs new file mode 100644 index 00000000..a5d544d6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/TankSelector/SetQuidoBitOp.cs @@ -0,0 +1,57 @@ + +namespace TBF.BenchControl.Modbus.TankSelector +{ + public class SetQuidoBitOp : IOperation + { + public enum OpSpecifier + { + None, + SelectTank, + UnselectTank, /// tankNo is ignored, the selected tank is unselected + } + + readonly TBF.BenchControl.Modbus.QuidoRS.QuidoRS quidoRS; + readonly ushort bitMask; + readonly bool set; /// true = set, false = reset + readonly Event eventDone; + + + public SetQuidoBitOp(TBF.BenchControl.Modbus.QuidoRS.QuidoRS quidoRS, QuidoOutputs bitMask, bool set) + : this(quidoRS, (ushort)bitMask, set, Event.ConditionMet) + { + } + + public SetQuidoBitOp(TBF.BenchControl.Modbus.QuidoRS.QuidoRS quidoRS, ushort bitMask, bool set) + : this(quidoRS, bitMask, set, Event.ConditionMet) + { + } + + public SetQuidoBitOp(TBF.BenchControl.Modbus.QuidoRS.QuidoRS quidoRS, ushort bitMask, bool set, Event eventDone) + { + this.quidoRS = quidoRS; + this.bitMask = bitMask; + this.set = set; + this.eventDone = eventDone; + } + + /// Start this operation + public void Start() + { + if (set) + quidoRS.SetBit(bitMask); + else + quidoRS.ResetBit(bitMask); + } + + /// Run this operation + public Event Run() + { + return eventDone; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/TankSelector/TankSelector.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/TankSelector/TankSelector.cs new file mode 100644 index 00000000..6b6de238 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/TankSelector/TankSelector.cs @@ -0,0 +1,359 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.BenchControl.Generic; +using TBF.BenchControl.GenericDevices; +using TBF.Boxes; +using TBF.Resources; + +namespace TBF.BenchControl.Modbus.TankSelector +{ + /// Enumeration of water tanks + public enum TankId + { + None, + Cold, /// Cold water tank + Warm, /// Warm water tank + Hot, /// Hot water tank + } + + /// Enumeration of water tank activities + public enum Activity + { + Unknown, + Idle, /// Main tank is not interconnected with any other water tank + Selected_Waiting1min, /// Selected water tank and main tank are interconnected, water is flowing to the main tank + Selected, /// Selected water tank and main tank are interconnected + Unselected_WaitingLevel, /// Water is being pumped from the main tank to the (un)selected water tank until main tank is empty + } + + /// TankSelector state + public enum State + { + Unknown, /// Initial state after the program startup + NoTankSelected, + ColdTankSelected_Waiting1min, + ColdTankSelected, + ColdTankUnselected_WaitingLevel, + WarmTankSelected_Waiting1min, + WarmTankSelected, + WarmTankUnselected_WaitingLevel, + HotTankSelected_Waiting1min, + HotTankSelected, + HotTankUnselected_WaitingLevel, + } + + /// Quido digital out board outputs assignment + public enum QuidoOutputs : ushort + { + None = 0, + SelectColdTank = 0x0001, /// Quido output 1 + SelectWarmTank = 0x0002, /// Quido output 2 + SelectHotTank = 0x0004, /// Quido output 3 + PumpToColdTank = 0x0008, /// Quido output 4 + PumpToWarmTank = 0x0010, /// Quido output 5 + PumpToHotTank = 0x0020, /// Quido output 6 + Mixing = 0x0040, /// Quido output 7 + HeatingHotTank = 0x0080, /// Quido output 8 + HeatingWarmTank = 0x0100, /// Quido output 9 + CoolingHotTank = 0x0200, /// Quido output 10 + CoolingWarmTank = 0x0400, /// Quido output 11 + CoolingColdTank = 0x0800, /// Quido output 12 + } + + /// Related control board digital inputs + public enum DigitalInputs : ulong + { + HotTankSelected = (ulong)(1 << 18), + WarmTankSelected = (ulong)(1 << 19), + ColdTankSelected = (ulong)(1 << 20), + Pumping_WaitingLevel = (ulong)(1 << 21), + } + + + public class TankSelector : ComponentBase, ISequenceCondition, IDevice + { + private static readonly ILog log = LogManager.GetLogger(typeof(TankSelector)); + public override string ToString() { return string.Format("TankSelector({0})", Cfg.ToString(1)); } + + readonly TankSelectorCfg tankSelectorCfg; + + readonly TBF.BenchControl.Modbus.QuidoRS.QuidoRS quidoRS; + + readonly TBF.BenchControl.Modbus.Easytherm.Easytherm hotHeating; + readonly TBF.BenchControl.Modbus.Easytherm.Easytherm hotCooling; + readonly TBF.BenchControl.Modbus.Easytherm.Easytherm warmHeating; + readonly TBF.BenchControl.Modbus.Easytherm.Easytherm warmCooling; + readonly TBF.BenchControl.Modbus.Easytherm.Easytherm coldCooling; + + + public State State; + public TankId CurrentTank { get { return GetTankIdFromState(State); } } + public Activity CurrentActivity { get { return GetActivityFromState(State); } } + + ulong latchedDigitalInputs; + ulong lastDigitalInputs; + ulong lastValueRepetitions; + + + public TankId GetTankIdFromState(State state) + { + switch (state) + { + case State.ColdTankSelected_Waiting1min: + case State.ColdTankSelected: + case State.ColdTankUnselected_WaitingLevel: + return TankId.Cold; + + case State.WarmTankSelected_Waiting1min: + case State.WarmTankSelected: + case State.WarmTankUnselected_WaitingLevel: + return TankId.Warm; + + case State.HotTankSelected_Waiting1min: + case State.HotTankSelected: + case State.HotTankUnselected_WaitingLevel: + return TankId.Hot; + + default: + return TankId.None; + } + } + + public Activity GetActivityFromState(State state) + { + switch (state) + { + case State.NoTankSelected: + return Activity.Idle; + + case State.ColdTankSelected_Waiting1min: + case State.WarmTankSelected_Waiting1min: + case State.HotTankSelected_Waiting1min: + return Activity.Selected_Waiting1min; + + case State.ColdTankSelected: + case State.WarmTankSelected: + case State.HotTankSelected: + return Activity.Selected; + + case State.ColdTankUnselected_WaitingLevel: + case State.WarmTankUnselected_WaitingLevel: + case State.HotTankUnselected_WaitingLevel: + return Activity.Unselected_WaitingLevel; + + default: + return Activity.Unknown; + } + } + + + public TankSelector() + { + CreateConditions(false); + } + + public TankSelector(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + tankSelectorCfg = cfg as TankSelectorCfg; + + quidoRS = (TBF.BenchControl.Modbus.QuidoRS.QuidoRS)TbfComponents.FindComponent(cfg.ParentName, components); + if (quidoRS == null) throw new Exception(string.Format("Cannot find parent '{0}' of the component {1}", cfg.ParentName, Name)); + + hotHeating = (TBF.BenchControl.Modbus.Easytherm.Easytherm)TbfComponents.FindComponent(tankSelectorCfg.HotWaterHeating, components); + hotCooling = (TBF.BenchControl.Modbus.Easytherm.Easytherm)TbfComponents.FindComponent(tankSelectorCfg.HotWaterCooling, components); + warmHeating = (TBF.BenchControl.Modbus.Easytherm.Easytherm)TbfComponents.FindComponent(tankSelectorCfg.WarmWaterHeating, components); + warmCooling = (TBF.BenchControl.Modbus.Easytherm.Easytherm)TbfComponents.FindComponent(tankSelectorCfg.WarmWaterCooling, components); + coldCooling = (TBF.BenchControl.Modbus.Easytherm.Easytherm)TbfComponents.FindComponent(tankSelectorCfg.ColdWaterCooling, components); + + if (hotHeating == null) throw new Exception(string.Format("Component '{0}' cannot find temperature controller '{1}'", Name, tankSelectorCfg.HotWaterHeating)); + if (hotCooling == null) throw new Exception(string.Format("Component '{0}' cannot find temperature controller '{1}'", Name, tankSelectorCfg.HotWaterCooling)); + if (warmHeating == null) throw new Exception(string.Format("Component '{0}' cannot find temperature controller '{1}'", Name, tankSelectorCfg.WarmWaterHeating)); + if (warmCooling == null) throw new Exception(string.Format("Component '{0}' cannot find temperature controller '{1}'", Name, tankSelectorCfg.WarmWaterCooling)); + if (coldCooling == null) throw new Exception(string.Format("Component '{0}' cannot find temperature controller '{1}'", Name, tankSelectorCfg.ColdWaterCooling)); + + CreateConditions(true); + + State = State.Unknown; + + log.Fatal(this.ToString()); + } + + + /// + /// Recover the TankSelector state from ContolBoard.DigitalInputs + /// + void RecoverState() + { + latchedDigitalInputs = StateMachine.ControlBoard.DigitalInputs; + if ((latchedDigitalInputs & (ulong)DigitalInputs.ColdTankSelected) != 0) + { + if ((latchedDigitalInputs & (ulong)DigitalInputs.Pumping_WaitingLevel) == 0) + State = State.ColdTankSelected; + else + State = State.ColdTankUnselected_WaitingLevel; + } + else if ((latchedDigitalInputs & (ulong)DigitalInputs.WarmTankSelected) != 0) + { + if ((latchedDigitalInputs & (ulong)DigitalInputs.Pumping_WaitingLevel) == 0) + State = State.WarmTankSelected; + else + State = State.WarmTankUnselected_WaitingLevel; + } + else if ((latchedDigitalInputs & (ulong)DigitalInputs.HotTankSelected) != 0) + { + if ((latchedDigitalInputs & (ulong)DigitalInputs.Pumping_WaitingLevel) == 0) + State = State.HotTankSelected; + else + State = State.HotTankUnselected_WaitingLevel; + } + else + { + State = State.NoTankSelected; + } + + log.FatalFormat("{0} successfully initialized, DigiInputs={1}, initial state={2}", + Name, latchedDigitalInputs.ToString("X16"), State); + } + + + /// + /// Detect 'State.NoTankSelected' from ContolBoard.DigitalInputs + /// + void DetectNoTankSelected() + { + ulong digiIn = StateMachine.ControlBoard.DigitalInputs; + + if (digiIn == latchedDigitalInputs) + { + return; + } + else if (digiIn == lastDigitalInputs) + { + if (++lastValueRepetitions == 3) + { + latchedDigitalInputs = lastDigitalInputs; + if ((latchedDigitalInputs & (ulong)DigitalInputs.ColdTankSelected) == 0 && + (latchedDigitalInputs & (ulong)DigitalInputs.WarmTankSelected) == 0 && + (latchedDigitalInputs & (ulong)DigitalInputs.HotTankSelected) == 0 && + (latchedDigitalInputs & (ulong)DigitalInputs.Pumping_WaitingLevel) == 0) + { + State = State.NoTankSelected; + } + } + } + else + { + lastDigitalInputs = digiIn; /// new value stored + lastValueRepetitions = 1; /// one repetition so far + } + } + + + /// + /// IDevice interface implementation + /// + public void Initialize() + { + SetOutputs(0); /// Reset all Quido outputs + } + + public void RunDeviceBefore() + { + if (StateMachine.Time == 3) + { + RecoverState(); + } + else if (StateMachine.Time > 3) + { + DetectNoTankSelected(); + } + } + + public void RunDeviceAfter() { } + public void StopDevice() { } + public void StopDevice2() { } + + + /// + /// Quido wrappers + /// + public void SetOutputs(ushort outputs) { quidoRS.SetOutputs(outputs); } + public void SetBit(ushort bitMask) { quidoRS.SetBit(bitMask); } + public void ResetBit(ushort bitMask) { quidoRS.ResetBit(bitMask); } + + + + /// + /// ISequenceCondition interface implementation (conditions in transition sequences) + /// + IList sequenceConditionNames; + IList sequenceConditions; + + public int ConditionsCount { get { return sequenceConditions != null ? sequenceConditions.Count : 0; } } + + /// Strings are added to the combo-box for transition sequence condition selection + public string ConditionName(int i) + { + if (sequenceConditionNames != null && i < sequenceConditionNames.Count && i >= 0) + return sequenceConditionNames[i]; + else + return string.Empty; + } + + /// Operations are executed as a part of a transition sequence + public IOperation ConditionOp(int i) + { + if (sequenceConditions != null && i < sequenceConditions.Count && i >= 0) + return sequenceConditions[i]; + else + return null; + } + + void ClearConditions() + { + sequenceConditionNames = new List(); + sequenceConditions = new List(); + } + + void AddCondition(string conditionName, bool createOperation, IOperation conditionOperation) + { + sequenceConditionNames.Add(conditionName); + if (createOperation) sequenceConditions.Add(conditionOperation); + } + + /// + /// Create a list of conditions + /// + /// true = create names and condition operations, false = create names only + void CreateConditions(bool createOps) + { + ClearConditions(); + AddCondition(Strings.Select_COLD_tank, createOps, new SelectTankOp(this, TankId.Cold)); + AddCondition(Strings.Select_WARM_tank, createOps, new SelectTankOp(this, TankId.Warm)); + AddCondition(Strings.Select_HOT_tank, createOps, new SelectTankOp(this, TankId.Hot)); + AddCondition(Strings.Unselect_current_tank, createOps, new UnselectTankOp(this)); + AddCondition(Strings.Set_hot_water_heating_temperature, createOps, hotHeating.SetRequiredTemperatureOp()); + AddCondition(Strings.Set_hot_water_cooling_temperature, createOps, hotCooling.SetRequiredTemperatureOp()); + AddCondition(Strings.Set_warm_water_heating_temperature, createOps, warmHeating.SetRequiredTemperatureOp()); + AddCondition(Strings.Set_warm_water_cooling_temperature, createOps, warmCooling.SetRequiredTemperatureOp()); + AddCondition(Strings.Set_cold_water_cooling_temperature, createOps, coldCooling.SetRequiredTemperatureOp()); + AddCondition("Start heating hot water", createOps, new SetQuidoBitOp(quidoRS, QuidoOutputs.HeatingHotTank, true)); + AddCondition("Stop heating hot water", createOps, new SetQuidoBitOp(quidoRS, QuidoOutputs.HeatingHotTank, false)); + AddCondition("Start cooling hot water", createOps, new SetQuidoBitOp(quidoRS, QuidoOutputs.CoolingHotTank, true)); + AddCondition("Stop cooling hot water", createOps, new SetQuidoBitOp(quidoRS, QuidoOutputs.CoolingHotTank, false)); + AddCondition("Start heating warm water", createOps, new SetQuidoBitOp(quidoRS, QuidoOutputs.HeatingWarmTank, true)); + AddCondition("Stop heating warm water", createOps, new SetQuidoBitOp(quidoRS, QuidoOutputs.HeatingWarmTank, false)); + AddCondition("Start cooling warm water", createOps, new SetQuidoBitOp(quidoRS, QuidoOutputs.CoolingWarmTank, true)); + AddCondition("Stop cooling warm water", createOps, new SetQuidoBitOp(quidoRS, QuidoOutputs.CoolingWarmTank, false)); + AddCondition("Start cooling cold water", createOps, new SetQuidoBitOp(quidoRS, QuidoOutputs.CoolingColdTank, true)); + AddCondition("Stop cooling cold water", createOps, new SetQuidoBitOp(quidoRS, QuidoOutputs.CoolingColdTank, false)); + AddCondition("Start mixing water", createOps, new SetQuidoBitOp(quidoRS, QuidoOutputs.Mixing, true)); + AddCondition("Stop mixing water", createOps, new SetQuidoBitOp(quidoRS, QuidoOutputs.Mixing, false)); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/TankSelector/TankSelectorCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/TankSelector/TankSelectorCfg.cs new file mode 100644 index 00000000..e1fb63cb --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/TankSelector/TankSelectorCfg.cs @@ -0,0 +1,51 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Modbus.TankSelector +{ + public class TankSelectorCfg : ComponentCfgBase, Generic.IChildComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TankSelectorCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new TankSelectorCfgCtrl(); } + + /// + /// Serialized parameters + /// + public string HotWaterHeating; /// Name of the component communicating with the temperature controller + public string HotWaterCooling; /// Name of the component communicating with the temperature controller + public string WarmWaterHeating; /// Name of the component communicating with the temperature controller + public string WarmWaterCooling; /// Name of the component communicating with the temperature controller + public string ColdWaterCooling; /// Name of the component communicating with the temperature controller + + + /// Private parameterless constructor invoked by all other (public) constructors + TankSelectorCfg() + { + Name = "TankSelector"; + ParentName = "QuidoRS"; + } + + public TankSelectorCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, DigOut={1}, Hot heating={2}, Hot cooling={3}, Warm heating={4}, Warm cooling={5}, Cold cooling={6}", + Name, + (string.IsNullOrEmpty(ParentName) ? "-" : ParentName), + (string.IsNullOrEmpty(HotWaterHeating) ? "-" : HotWaterHeating), + (string.IsNullOrEmpty(HotWaterCooling) ? "-" : HotWaterCooling), + (string.IsNullOrEmpty(WarmWaterHeating) ? "-" : WarmWaterHeating), + (string.IsNullOrEmpty(WarmWaterCooling) ? "-" : WarmWaterCooling), + (string.IsNullOrEmpty(ColdWaterCooling) ? "-" : ColdWaterCooling)); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/TankSelector/TankSelectorCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/TankSelector/TankSelectorCfgCtrl.cs new file mode 100644 index 00000000..dc479e64 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/TankSelector/TankSelectorCfgCtrl.cs @@ -0,0 +1,123 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Modbus.TankSelector +{ + public partial class TankSelectorCfgCtrl : UserControl, IComponentCfgCtrl + { + ComponentParametersDlg parent; + + public bool ShowMore { get { return false; } } + + TankSelectorCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as TankSelectorCfg; + Redraw(); + } + } + + public TankSelectorCfgCtrl() + { + InitializeComponent(); + } + + private void TankSelectorCfgCtrl_Load(object sender, EventArgs e) + { + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + hotHeatingComboBox.Items.Add("---"); + hotCoolingComboBox.Items.Add("---"); + warmHeatingComboBox.Items.Add("---"); + warmCoolingComboBox.Items.Add("---"); + coldCoolingComboBox.Items.Add("---"); + if (parent.TbfComponents != null) + { + foreach (var cmpnt in parent.TbfComponents) + { + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is Modbus.QuidoRS.Factory) + { + parentNameComboBox.Items.Add(cmpnt.Name); + } + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is Modbus.Easytherm.Factory) + { + hotHeatingComboBox.Items.Add(cmpnt.Name); + hotCoolingComboBox.Items.Add(cmpnt.Name); + warmHeatingComboBox.Items.Add(cmpnt.Name); + warmCoolingComboBox.Items.Add(cmpnt.Name); + coldCoolingComboBox.Items.Add(cmpnt.Name); + } + } + } + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + componentNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + parentNameComboBox.Text = string.IsNullOrEmpty(config.ParentName) ? "---" : config.ParentName; + hotHeatingComboBox.Text = string.IsNullOrEmpty(config.HotWaterHeating) ? "---" : config.HotWaterHeating; + hotCoolingComboBox.Text = string.IsNullOrEmpty(config.HotWaterCooling) ? "---" : config.HotWaterCooling; + warmHeatingComboBox.Text = string.IsNullOrEmpty(config.WarmWaterHeating) ? "---" : config.WarmWaterHeating; + warmCoolingComboBox.Text = string.IsNullOrEmpty(config.WarmWaterCooling) ? "---" : config.WarmWaterCooling; + coldCoolingComboBox.Text = string.IsNullOrEmpty(config.ColdWaterCooling) ? "---" : config.ColdWaterCooling; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + parentNameComboBox.Enabled = true; + hotHeatingComboBox.Enabled = true; + hotCoolingComboBox.Enabled = true; + warmHeatingComboBox.Enabled = true; + warmCoolingComboBox.Enabled = true; + coldCoolingComboBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (!parentNameComboBox.Items.Contains(parentNameComboBox.Text)) { flags |= CfgUpdateFlags.Error; message += Environment.NewLine + "Invalid 'Parent name'"; } + if (!hotHeatingComboBox.Items.Contains(hotHeatingComboBox.Text)) { flags |= CfgUpdateFlags.Error; message += Environment.NewLine + "Invalid 'Hot water heating'"; } + if (!hotCoolingComboBox.Items.Contains(hotCoolingComboBox.Text)) { flags |= CfgUpdateFlags.Error; message += Environment.NewLine + "Invalid 'Hot water cooling'"; } + if (!warmHeatingComboBox.Items.Contains(warmHeatingComboBox.Text)) { flags |= CfgUpdateFlags.Error; message += Environment.NewLine + "Invalid 'Warm water heating'"; } + if (!warmCoolingComboBox.Items.Contains(warmCoolingComboBox.Text)) { flags |= CfgUpdateFlags.Error; message += Environment.NewLine + "Invalid 'Warm water cooling'"; } + if (!coldCoolingComboBox.Items.Contains(coldCoolingComboBox.Text)) { flags |= CfgUpdateFlags.Error; message += Environment.NewLine + "Invalid 'Cold water cooling'"; } + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.ParentName = parentNameComboBox.Text.Equals("---") ? string.Empty : parentNameComboBox.Text; + config.HotWaterHeating = hotHeatingComboBox.Text.Equals("---") ? string.Empty : hotHeatingComboBox.Text; + config.HotWaterCooling = hotCoolingComboBox.Text.Equals("---") ? string.Empty : hotCoolingComboBox.Text; + config.WarmWaterHeating = warmHeatingComboBox.Text.Equals("---") ? string.Empty : warmHeatingComboBox.Text; + config.WarmWaterCooling = warmCoolingComboBox.Text.Equals("---") ? string.Empty : warmCoolingComboBox.Text; + config.ColdWaterCooling = coldCoolingComboBox.Text.Equals("---") ? string.Empty : coldCoolingComboBox.Text; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/TankSelector/TankSelectorCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/TankSelector/TankSelectorCfgCtrl.designer.cs new file mode 100644 index 00000000..127c4e75 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/TankSelector/TankSelectorCfgCtrl.designer.cs @@ -0,0 +1,230 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.Modbus.TankSelector +{ + partial class TankSelectorCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.parentNameLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.componentNameLabel = new System.Windows.Forms.Label(); + this.parentNameComboBox = new System.Windows.Forms.ComboBox(); + this.hotHeatingComboBox = new System.Windows.Forms.ComboBox(); + this.hotHeatingLabel = new System.Windows.Forms.Label(); + this.hotCoolingComboBox = new System.Windows.Forms.ComboBox(); + this.hotCoolingLabel = new System.Windows.Forms.Label(); + this.warmHeatingComboBox = new System.Windows.Forms.ComboBox(); + this.warmHeatingLabel = new System.Windows.Forms.Label(); + this.warmCoolingComboBox = new System.Windows.Forms.ComboBox(); + this.warmCoolingLabel = new System.Windows.Forms.Label(); + this.coldCoolingComboBox = new System.Windows.Forms.ComboBox(); + this.coldCoolingabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // parentNameLabel + // + this.parentNameLabel.AutoSize = true; + this.parentNameLabel.Location = new System.Drawing.Point(28, 81); + this.parentNameLabel.Name = "parentNameLabel"; + this.parentNameLabel.Size = new System.Drawing.Size(67, 13); + this.parentNameLabel.TabIndex = 3; + this.parentNameLabel.Text = "Parent name"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(138, 52); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(173, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(28, 55); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // componentNameLabel + // + this.componentNameLabel.AutoSize = true; + this.componentNameLabel.Location = new System.Drawing.Point(135, 28); + this.componentNameLabel.Name = "componentNameLabel"; + this.componentNameLabel.Size = new System.Drawing.Size(83, 13); + this.componentNameLabel.TabIndex = 0; + this.componentNameLabel.Text = "ComonentName"; + // + // parentNameComboBox + // + this.parentNameComboBox.Enabled = false; + this.parentNameComboBox.FormattingEnabled = true; + this.parentNameComboBox.Location = new System.Drawing.Point(138, 78); + this.parentNameComboBox.Name = "parentNameComboBox"; + this.parentNameComboBox.Size = new System.Drawing.Size(173, 21); + this.parentNameComboBox.TabIndex = 4; + // + // controlBoardComboBox + // + this.hotHeatingComboBox.Enabled = false; + this.hotHeatingComboBox.FormattingEnabled = true; + this.hotHeatingComboBox.Location = new System.Drawing.Point(138, 105); + this.hotHeatingComboBox.Name = "controlBoardComboBox"; + this.hotHeatingComboBox.Size = new System.Drawing.Size(173, 21); + this.hotHeatingComboBox.TabIndex = 6; + // + // hotHeatingLabel + // + this.hotHeatingLabel.AutoSize = true; + this.hotHeatingLabel.Location = new System.Drawing.Point(28, 108); + this.hotHeatingLabel.Name = "hotHeatingLabel"; + this.hotHeatingLabel.Size = new System.Drawing.Size(91, 13); + this.hotHeatingLabel.TabIndex = 5; + this.hotHeatingLabel.Text = "Hot water heating"; + // + // comboBox1 + // + this.hotCoolingComboBox.Enabled = false; + this.hotCoolingComboBox.FormattingEnabled = true; + this.hotCoolingComboBox.Location = new System.Drawing.Point(138, 132); + this.hotCoolingComboBox.Name = "comboBox1"; + this.hotCoolingComboBox.Size = new System.Drawing.Size(173, 21); + this.hotCoolingComboBox.TabIndex = 8; + // + // hotCoolingLabel + // + this.hotCoolingLabel.AutoSize = true; + this.hotCoolingLabel.Location = new System.Drawing.Point(28, 135); + this.hotCoolingLabel.Name = "hotCoolingLabel"; + this.hotCoolingLabel.Size = new System.Drawing.Size(90, 13); + this.hotCoolingLabel.TabIndex = 7; + this.hotCoolingLabel.Text = "Hot water cooling"; + // + // comboBox2 + // + this.warmHeatingComboBox.Enabled = false; + this.warmHeatingComboBox.FormattingEnabled = true; + this.warmHeatingComboBox.Location = new System.Drawing.Point(138, 159); + this.warmHeatingComboBox.Name = "comboBox2"; + this.warmHeatingComboBox.Size = new System.Drawing.Size(173, 21); + this.warmHeatingComboBox.TabIndex = 10; + // + // warmHeatingLabel + // + this.warmHeatingLabel.AutoSize = true; + this.warmHeatingLabel.Location = new System.Drawing.Point(28, 162); + this.warmHeatingLabel.Name = "warmHeatingLabel"; + this.warmHeatingLabel.Size = new System.Drawing.Size(102, 13); + this.warmHeatingLabel.TabIndex = 9; + this.warmHeatingLabel.Text = "Warm water heating"; + // + // comboBox3 + // + this.warmCoolingComboBox.Enabled = false; + this.warmCoolingComboBox.FormattingEnabled = true; + this.warmCoolingComboBox.Location = new System.Drawing.Point(138, 186); + this.warmCoolingComboBox.Name = "comboBox3"; + this.warmCoolingComboBox.Size = new System.Drawing.Size(173, 21); + this.warmCoolingComboBox.TabIndex = 12; + // + // warmCoolingLabel + // + this.warmCoolingLabel.AutoSize = true; + this.warmCoolingLabel.Location = new System.Drawing.Point(28, 189); + this.warmCoolingLabel.Name = "warmCoolingLabel"; + this.warmCoolingLabel.Size = new System.Drawing.Size(101, 13); + this.warmCoolingLabel.TabIndex = 11; + this.warmCoolingLabel.Text = "Warm water cooling"; + // + // comboBox4 + // + this.coldCoolingComboBox.Enabled = false; + this.coldCoolingComboBox.FormattingEnabled = true; + this.coldCoolingComboBox.Location = new System.Drawing.Point(138, 213); + this.coldCoolingComboBox.Name = "comboBox4"; + this.coldCoolingComboBox.Size = new System.Drawing.Size(173, 21); + this.coldCoolingComboBox.TabIndex = 14; + // + // coldCoolingabel + // + this.coldCoolingabel.AutoSize = true; + this.coldCoolingabel.Location = new System.Drawing.Point(28, 216); + this.coldCoolingabel.Name = "coldCoolingabel"; + this.coldCoolingabel.Size = new System.Drawing.Size(94, 13); + this.coldCoolingabel.TabIndex = 13; + this.coldCoolingabel.Text = "Cold water cooling"; + // + // TankSelectorCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.coldCoolingComboBox); + this.Controls.Add(this.coldCoolingabel); + this.Controls.Add(this.warmCoolingComboBox); + this.Controls.Add(this.warmCoolingLabel); + this.Controls.Add(this.warmHeatingComboBox); + this.Controls.Add(this.warmHeatingLabel); + this.Controls.Add(this.hotCoolingComboBox); + this.Controls.Add(this.hotCoolingLabel); + this.Controls.Add(this.hotHeatingComboBox); + this.Controls.Add(this.hotHeatingLabel); + this.Controls.Add(this.parentNameComboBox); + this.Controls.Add(this.parentNameLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.componentNameLabel); + this.Name = "TankSelectorCfgCtrl"; + this.Size = new System.Drawing.Size(368, 259); + this.Load += new System.EventHandler(this.TankSelectorCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label parentNameLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label componentNameLabel; + private System.Windows.Forms.ComboBox parentNameComboBox; + private System.Windows.Forms.ComboBox hotHeatingComboBox; + private System.Windows.Forms.Label hotHeatingLabel; + private System.Windows.Forms.ComboBox hotCoolingComboBox; + private System.Windows.Forms.Label hotCoolingLabel; + private System.Windows.Forms.ComboBox warmHeatingComboBox; + private System.Windows.Forms.Label warmHeatingLabel; + private System.Windows.Forms.ComboBox warmCoolingComboBox; + private System.Windows.Forms.Label warmCoolingLabel; + private System.Windows.Forms.ComboBox coldCoolingComboBox; + private System.Windows.Forms.Label coldCoolingabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/TankSelector/TankSelectorCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/TankSelector/TankSelectorCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/TankSelector/TankSelectorCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/TankSelector/UnselectTankOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/TankSelector/UnselectTankOp.cs new file mode 100644 index 00000000..fbc131f7 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Modbus/TankSelector/UnselectTankOp.cs @@ -0,0 +1,79 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.Modbus.TankSelector +{ + public class UnselectTankOp : IOperation + { + TankSelector tankSelector; + TankId tankId; + ushort unselectBitMask; + bool doUnselect; + bool unselectedWaitLevel; + int time; + + public UnselectTankOp(TankSelector tankSelector) + { + this.tankSelector = tankSelector; + } + + /// Start this operation + public void Start() + { + if (tankSelector.CurrentActivity == Activity.Selected || + tankSelector.CurrentActivity == Activity.Selected_Waiting1min) + { + tankId = tankSelector.CurrentTank; + unselectBitMask = (ushort)((tankId == TankId.Cold) ? QuidoOutputs.PumpToColdTank + : (tankId == TankId.Warm) ? QuidoOutputs.PumpToWarmTank + : QuidoOutputs.PumpToHotTank); + doUnselect = true; + unselectedWaitLevel = false; + + tankSelector.SetBit(unselectBitMask); + } + else if (tankSelector.CurrentActivity == Activity.Unselected_WaitingLevel) + { + tankId = tankSelector.CurrentTank; + + doUnselect = false; + unselectedWaitLevel = true; + } + else /// tankSelector.CurrentActivity == Activity.Idle or Activity.Uknown + { + doUnselect = false; + unselectedWaitLevel = false; + } + } + + /// Run this operation + public Event Run() + { + if (doUnselect) + { + tankSelector.ResetBit(unselectBitMask); + doUnselect = false; + unselectedWaitLevel = true; + return Event.ConditionNotMet; + } + else if (unselectedWaitLevel) + { + if (tankSelector.CurrentActivity == Activity.Idle) + { + unselectedWaitLevel = false; + return Event.ConditionMet; + } + return Event.ConditionNotMet; + } + else + { + return Event.ConditionMet; + } + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Adapter/AdapterInfo.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Adapter/AdapterInfo.cs new file mode 100644 index 00000000..f39a4ed6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Adapter/AdapterInfo.cs @@ -0,0 +1,208 @@ +using System; +using System.Collections.Generic; +using System.Net; +using System.Net.NetworkInformation; +using System.Text; +using System.Web; + +namespace TBF.BenchControl.Network.Adapter +{ + /// + /// Class for the storing information about a network adapter. + /// + public class AdapterInfo + { + public string Description; /// Description of the network adapter. + public IPAddress IPAddress; /// IP address of the network adapter. + public IPAddress NetMask; /// Mask of the network adapter. + + /// Constructor + public AdapterInfo(string description) + { + Description = description; + } + + public IPAddress GetBroadcastAddress() + { + byte[] ipAdressBytes = IPAddress.GetAddressBytes(); + byte[] subnetMaskBytes = NetMask.GetAddressBytes(); + + if (ipAdressBytes.Length != subnetMaskBytes.Length) + throw new ArgumentException("Lengths of IP address and subnet mask do not match."); + + byte[] broadcastAddress = new byte[ipAdressBytes.Length]; + for (int i = 0; i < broadcastAddress.Length; i++) + { + broadcastAddress[i] = (byte)(ipAdressBytes[i] | (subnetMaskBytes[i] ^ 255)); + } + + return new IPAddress(broadcastAddress); + } + + ///------------------------------------------------------ + /// Static members and functions + ///------------------------------------------------------ + + /// + /// Private list of the available network adapters. + /// + static List netAdapters; + + /// + /// Retrieves the list of network adapters. + /// Never returns 'null', calls RefreshNetAdaptersInfo() the first time it is used. + /// If you want to refresh the list of the network adapters later, explicitly call + /// the RefreshNetAdaptersInfo() method. + /// + public static List NetAdapters + { + get + { + if (netAdapters == null) RefreshNetAdaptersInfo(); + return netAdapters; + } + } + + /// + /// Refreshes the information about network adapters stored in the netAdapters list. + /// + public static void RefreshNetAdaptersInfo() + { + if (netAdapters == null) netAdapters = new List(); + else netAdapters.Clear(); + + NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces(); + foreach (NetworkInterface adapter in nics) + { + AdapterInfo info = new AdapterInfo(adapter.Description); + netAdapters.Add(info); + + IPInterfaceProperties properties = adapter.GetIPProperties(); + if (properties == null) + continue; + UnicastIPAddressInformationCollection uniCast = properties.UnicastAddresses; + if (uniCast == null) + continue; + foreach (UnicastIPAddressInformation uni in uniCast) + { + if (info == null) + { + info = new AdapterInfo(adapter.Description); + netAdapters.Add(info); + } + info.IPAddress = uni.Address; + if (uni.IPv4Mask != null) info.NetMask = uni.IPv4Mask; + info = null; + } + } + } + + /// + /// Gets the loopback network adapter. + /// + public static AdapterInfo LoopbackAdapter + { + get + { + List adapters = NetAdapters; + foreach (AdapterInfo a in adapters) + { + if (a.IPAddress != null && a.IPAddress.Equals(IPAddress.Loopback)) return a; + } + return null; + } + } + + /// + /// Gets the default network adapter - the first one which his not a loopback adapter. + /// Network adapters with IP address have preference, adapters without IP address + /// (like an unconnected wireless adapter) are used just when there is no adapter with IP. + /// + /// Default adapter is used when none was specified in the configuration file + /// and it is used to initialize Options-General dialog-tab. + /// + public static AdapterInfo DefaultAdapter + { + get + { + List adapters = NetAdapters; /// Make a copy to avoid interference + AdapterInfo adapterWithoutIP = null; /// Use this one if there is no other better adapter + foreach (AdapterInfo a in adapters) + { + if (!a.IPAddress.Equals(IPAddress.Loopback)) + { + if (a.IPAddress != null) return a; + else if (adapterWithoutIP == null) adapterWithoutIP = a; + } + } + return adapterWithoutIP == null ? LoopbackAdapter : adapterWithoutIP; + } + } + + /// + /// Get network adapter info from the description string. + /// + /// Description + /// AdapterInfo object reference + public static AdapterInfo GetNetAdapter(string description) + { + List adapters = NetAdapters; + + foreach (AdapterInfo a in adapters) + { + if (a.Description != description || + a.IPAddress == null || + a.IPAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6 || + a.IPAddress.Equals(IPAddress.Loopback) || + a.NetMask == null) + { + continue; + } + return a; + } + + return DefaultAdapter; + } + + /// + /// Encodes the given string as URL parameter. + /// + /// String to be encoded. + /// String encoded as the URL parameter. + public static string UrlPathEncode(string pathToEncode) + { + StringBuilder sb = new StringBuilder(pathToEncode.Length * 3); + + sb.Append(pathToEncode); + + // % must be first!!! + sb.Replace("%", "%" + Convert.ToInt32('%').ToString("X2")); + // ?, & and / are not convertable by HttpUtility.UrlPathEncode + sb.Replace("?", "%" + Convert.ToInt32('?').ToString("X2")); + sb.Replace("&", "%" + Convert.ToInt32('&').ToString("X2")); + sb.Replace("/", "%" + Convert.ToInt32('/').ToString("X2")); + // Additional chars. E.g.: # didn't work in the path passed to the Uri class. "c:\\sour#ce\\my # proj". + sb.Replace("#", "%" + Convert.ToInt32('#').ToString("X2")); + // Backslash must be removed because it is not accepted by Uri class when passing path into it. E.g.: "C:%5Csource" is not acceptable. + //sb.Replace("\\", "%" + Convert.ToInt32('\\').ToString("X2")); + //// I removed following chars because I do not know if it is good idea to replace them (see previous line with '\\' char). + sb.Replace("\r", "%" + Convert.ToInt32('\r').ToString("X2")); + sb.Replace("\n", "%" + Convert.ToInt32('\n').ToString("X2")); + sb.Replace("\t", "%" + Convert.ToInt32('\t').ToString("X2")); + + string s = sb.ToString(); + s = HttpUtility.UrlPathEncode(s); + //sb.Length = 0; + //sb.Append(HttpUtility.UrlPathEncode(s)); + //for (int i = 0; i < sb.Length; i += 3) + //{ + // char c = sb[i]; + // if (c == '%') + // continue; + // sb[i] = '%'; + // sb.Insert(i + 1, Convert.ToUInt64(c).ToString("X2")); + //} + return s; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Adapter/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Adapter/Factory.cs new file mode 100644 index 00000000..e995d024 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Adapter/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Network.Adapter +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Netadapter.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Netadapter(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Netadapter(cfg); } + + public IComponentCfg DefaultConfig() { return new NetadapterCfg(this.GetType().Namespace.Substring(17), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(NetadapterCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Adapter/Netadapter.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Adapter/Netadapter.cs new file mode 100644 index 00000000..b9d288d6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Adapter/Netadapter.cs @@ -0,0 +1,48 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Net; +using log4net; + +namespace TBF.BenchControl.Network.Adapter +{ + public class Netadapter : ComponentBase, GenericDevices.INetworkAdapter + { + private static readonly ILog log = LogManager.GetLogger(typeof(Netadapter)); + public override string ToString() + { + return string.Format("Component={0} IPAddress={1} NetMask={2} Description={3}", Cfg.Name, IPAddress, NetMask, (Cfg as NetadapterCfg).Description); + } + + public bool Running { get { return running; } } + bool running; + + readonly NetadapterCfg netadapterCfg; + readonly IPAddress ipAddress; + readonly IPAddress netMask; + readonly IPAddress broadcastAddress; + + public IPAddress IPAddress { get { return ipAddress; } } + public IPAddress NetMask { get { return netMask; } } + public IPAddress BroadcastAddress { get { return broadcastAddress; } } + + public Netadapter() + { + } + + public Netadapter(Generic.IComponentCfg cfg) + : base(cfg) + { + netadapterCfg = cfg as NetadapterCfg; + AdapterInfo.RefreshNetAdaptersInfo(); + AdapterInfo netadapter = AdapterInfo.GetNetAdapter(netadapterCfg.Description); + ipAddress = netadapter.IPAddress; + netMask = netadapter.NetMask; + broadcastAddress = netadapter.GetBroadcastAddress(); + + running = false; + + log.Debug(this.ToString()); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Adapter/NetadapterCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Adapter/NetadapterCfg.cs new file mode 100644 index 00000000..5121f315 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Adapter/NetadapterCfg.cs @@ -0,0 +1,36 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Network.Adapter +{ + public class NetadapterCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(NetadapterCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new NetadapterCfgCtrl(); } + + + public string Description; /// Description string of the selected network adapter + + + /// Private parameterless constructor invoked by all other (public) constructors + NetadapterCfg() {} + + public NetadapterCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + Factory = factory; + ParentName = string.Empty; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Description={1}", Name, Description); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Adapter/NetadapterCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Adapter/NetadapterCfgCtrl.cs new file mode 100644 index 00000000..e58f667d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Adapter/NetadapterCfgCtrl.cs @@ -0,0 +1,139 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Net; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Network.Adapter +{ + public partial class NetadapterCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + NetadapterCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as NetadapterCfg; + Redraw(); + } + } + + public NetadapterCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + if (ParentForm == null) return; /// Return is executed when tab page is open in Designer + if (config == null) return; /// Control was not loaded, settings were not changed + + Localize(); + + Redraw(); + } + + void Redraw() + { + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + + AdapterInfo.RefreshNetAdaptersInfo(); + IList adapters = AdapterInfo.NetAdapters; + + string cfgAdapter = string.Empty; + foreach (AdapterInfo ai in adapters) + { + string record; + + if (ai.IPAddress == null) + { + /// This happens with network adapters that currently have no IP address, + /// for instance not connected wireless or dial-up adapters + record = "???.???.???.???"; + } + else + { + /// Do not consider IPv6 adapters as well as "Any", "Broadcast", "Loopback" or "None" addresses + if ((ai.IPAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6) || + ai.IPAddress.Equals(IPAddress.Any) || + ai.IPAddress.Equals(IPAddress.Broadcast) || + ai.IPAddress.Equals(IPAddress.IPv6Any) || + ai.IPAddress.Equals(IPAddress.IPv6Loopback) || + ai.IPAddress.Equals(IPAddress.IPv6None) || + ai.IPAddress.Equals(IPAddress.Loopback) || + ai.IPAddress.Equals(IPAddress.None)) + { + continue; + } + + record = ai.IPAddress.ToString(); + } + + record += " - " + ai.Description; + int i = adapterComboBox.Items.Add(record); + if (ai.Description == config.Description) + { + /// Select the adapter currently in the configuration + adapterComboBox.SelectedIndex = i; + } + } + + /// Select the first one if the adapter from the configuration does not exist on the system + if (adapterComboBox.SelectedIndex < 0 && adapterComboBox.Items.Count > 0) + { + adapterComboBox.SelectedIndex = 0; + } + } + + void Localize() + { + } + + public void Closing() + { + } + + public void Unlock() + { + nameTextBox.Enabled = true; + adapterComboBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (!adapterComboBox.Items.Contains(adapterComboBox.Text)) + { + flags = CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Parent Name'"; + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + + /// Network adapter + string strAdapter = adapterComboBox.Text; + int iDash = strAdapter.IndexOf(" - "); + config.Description = iDash < 0 ? "" : strAdapter.Substring(iDash + 3); + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Adapter/NetadapterCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Adapter/NetadapterCfgCtrl.designer.cs new file mode 100644 index 00000000..a6a8e4e5 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Adapter/NetadapterCfgCtrl.designer.cs @@ -0,0 +1,109 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.Network.Adapter +{ + partial class NetadapterCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.adapterLabel = new System.Windows.Forms.Label(); + this.adapterComboBox = new System.Windows.Forms.ComboBox(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(101, 50); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(114, 20); + this.nameTextBox.TabIndex = 5; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(9, 53); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 4; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(98, 24); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 3; + this.classNameLabel.Text = "ComonentName"; + // + // adapterLabel + // + this.adapterLabel.AutoSize = true; + this.adapterLabel.Location = new System.Drawing.Point(9, 80); + this.adapterLabel.Name = "adapterLabel"; + this.adapterLabel.Size = new System.Drawing.Size(44, 13); + this.adapterLabel.TabIndex = 6; + this.adapterLabel.Text = "Adapter"; + // + // adapterComboBox + // + this.adapterComboBox.Enabled = false; + this.adapterComboBox.Location = new System.Drawing.Point(101, 77); + this.adapterComboBox.Name = "adapterComboBox"; + this.adapterComboBox.Size = new System.Drawing.Size(333, 21); + this.adapterComboBox.TabIndex = 7; + // + // NetadapterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.adapterComboBox); + this.Controls.Add(this.adapterLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "NetadapterCfgCtrl"; + this.Size = new System.Drawing.Size(450, 300); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.Label adapterLabel; + private System.Windows.Forms.ComboBox adapterComboBox; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Adapter/NetadapterCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Adapter/NetadapterCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Adapter/NetadapterCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/Camera.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/Camera.cs new file mode 100644 index 00000000..0fa132c6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/Camera.cs @@ -0,0 +1,807 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Net; +using System.Net.Sockets; +using System.Security.Cryptography; +using System.Text; +using System.Threading; +using System.Timers; +using log4net; +using Renci.SshNet; +using Config.Entities; +using TBF.BenchControl.Network.Telnet; +using TBF.Resources; + +namespace TBF.BenchControl.Network.Camera.CLP1611 +{ + /// + /// This class implements: (1) Camera device, (2) Measurement operation + /// + public class Camera : ComponentBase, GenericDevices.ICamera, Generic.IDevice, IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(Camera)); + public override string ToString() + { + return string.Format("{0}: Name={1}, Addr={2}, IP={3}, s/n={4}, SD={5}", + this.GetType().Namespace.Substring(17), + CameraCfg.Name, + CameraCfg.HardwareAddress, + ipAddress == null ? "not detected" : ipAddress.ToString(), + string.IsNullOrEmpty(cpuSerialNr) ? "not detected" : cpuSerialNr, + string.IsNullOrEmpty(sdCardVer) ? "not detected" : sdCardVer); + } + + + const string ClpUserName = "tbf"; + const string ClpPassword = "C1ern4V0d4"; + + + private static Object fileUploadLock = new Object(); + + + /// + /// Properties + /// + public readonly CameraCfg CameraCfg; + public readonly GenericDevices.INetworkAdapter NetAdapter; + + public IPAddress IPAddress { get { return ipAddress; } } + IPAddress ipAddress; + + public string CpuHardware { get { return cpuHardware; } } + string cpuHardware; + + public string CpuRevision { get { return cpuRevision; } } + string cpuRevision; + + public string CpuSerialNr { get { return cpuSerialNr; } } + string cpuSerialNr; + + public string SDCardVer { get { return sdCardVer; } } + string sdCardVer; + + public bool Running { get { return running; } } + bool running; + + public int CameraIdx { get { return cameraIdx; } } + int cameraIdx; + /// + static int nextCameraIdx = 0; + static int GetCameraIdx() { return nextCameraIdx++; } /// Used in Initialize() + public static new void ResetStaticProperties() { nextCameraIdx = 0; } + + /// + /// Telnet support + /// + const string TelnetPrompt = "$ "; + const bool TelnetSkipFirstLine = true; + public Telnet.TelnetClient Telnet; + private TerminalDlg terminalDlg; + string sha1sumResponse; + bool sha1sumResponseProcessed; + + /// + /// scp support + /// + Thread scpThread; + PasswordConnectionInfo connectionInfo; + bool scpConnected; + bool stopScpThreadFlag; + string scpRemoteFileName; /// Camera file name + string scpLocalFileName; /// Local PC file name + enum ScpCommand + { + None, + Get, + Put, + } + ScpCommand scpCommand; + + + const int UdpPortBase = 20000; /// Port base for all UDP protocols + + /// + /// MJpeg RTP protocol support + /// + int rtpUdpLocalPort; + UdpClient rtpUdpClient; + Thread rtpListenerThread; + static bool stopRtpListenerFlag; + + /// + /// RTCP protocol (reserved) + /// + int rtcpUdpLocalPort; + + /// + /// Measurement results protocol + /// + int msrmntUdpLocalPort; + UdpClient msrmntUdpClient; /// If != null msrmntListenerThread + Thread msrmntListenerThread; + static bool stopMsrmntListenerFlag; + + + /// + /// ROI related parameters + /// + RoisAndResults roisAndResults; + /// + public void ClearRoiParams() { roisAndResults.ClearRoiParams(); } + public int RegisterRoi(string roiParams) { return roisAndResults.RegisterRoi(roiParams); } + public int GetResult(int roiHandle, out long timeMs) { return roisAndResults.GetResult(roiHandle, out timeMs); } + + + public Camera() {} + + + public Camera(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + CameraCfg = cfg as CameraCfg; + NetAdapter = TbfComponents.FindComponent(cfg.ParentName, components) as GenericDevices.INetworkAdapter; + if (NetAdapter == null) throw new ArgumentNullException("no network adapter"); + + Telnet = null; + terminalDlg = null; + + roisAndResults = new RoisAndResults(); /// object for measurement results, writes/reads to/from this object are locked + + running = false; + } + + + public void Initialize() + { + cameraIdx = GetCameraIdx(); + + if (CameraCfg.DebugLevel == DebugMode.Simulate) return; + + /// Detect a camera + bool cameraDetected = DetectCamera(CameraCfg.HardwareAddress % 100, ref ipAddress, true, + out cpuHardware, out cpuRevision, out cpuSerialNr, out sdCardVer); + + + if (CameraCfg.DebugLevel == DebugMode.AutoDetect) + { + CameraCfg.DebugLevel = cameraDetected ? DebugMode.DetectedOn : DebugMode.DetectedOff; + } + else if (!cameraDetected) + { + throw new Exception(string.Format("{0}={1}", Strings.Address, CameraCfg.HardwareAddress)); + } + + if (cameraDetected) + { + UiBridge.Bridge.OnCameraInfo(this.cameraIdx, string.Format("{0} ver.{1} {2} s/n {3}", Name, sdCardVer, ipAddress, CameraCfg.HardwareAddress)); + + rtpUdpLocalPort = UdpPortBase + 4 * cameraIdx; + rtcpUdpLocalPort = UdpPortBase + 4 * cameraIdx + 1; + msrmntUdpLocalPort = UdpPortBase + 4 * cameraIdx + 2; + + StartRtpListener(NetAdapter.IPAddress, rtpUdpLocalPort); + StartMsrmntListener(NetAdapter.IPAddress, msrmntUdpLocalPort); + + connectionInfo = new PasswordConnectionInfo(IPAddress.ToString(), ClpUserName, ClpPassword); + + /// Open telnet clint and start the log-in process + Telnet = new Telnet.TelnetClient(this, CameraCfg.Name, ClpUserName, ClpPassword, TelnetPrompt, TelnetSkipFirstLine, CameraCfg.DisplayTerminal); + + Telnet.promptReceivedHandler += delegate(object sndr, PromptReceivedEventArgs a) + { + OnPromptReceived(sndr, a); + }; + + if (CameraCfg.DisplayTerminal) + { + terminalDlg = new TerminalDlg(CameraCfg.Name, Telnet); + terminalDlg.Show(); + } + + Telnet.Enqueue(new Telnet.Command(Network.Telnet.CmdAction.CONNECT, ipAddress.ToString(), 10, 30)); + Telnet.Enqueue(new Telnet.Command(Network.Telnet.CmdAction.CLEAR_RESPONSE)); + Telnet.Enqueue(new Telnet.Command(Network.Telnet.CmdAction.SEND_COMMAND, "sha1sum clp/*")); + + log.FatalFormat("'{0}' with address {1} detected, IP = {2}, SD = {3}", Name, CameraCfg.HardwareAddress, ipAddress, sdCardVer); + } + else + { + UiBridge.Bridge.OnCameraInfo(this.cameraIdx, string.Format("{0} s/n {1} was not detected", Name, CameraCfg.HardwareAddress)); + log.FatalFormat("'{0}' with address {1} not detected", Name, CameraCfg.HardwareAddress); + } + } + + public void StopDevice() + { + running = false; + + stopScpThreadFlag = true; + stopRtpListenerFlag = true; + stopMsrmntListenerFlag = true; + + if (Telnet != null) + { + Telnet.Dispose(); + Telnet = null; + } + } + + public void StopDevice2() + { + if (scpThread != null) scpThread.Join(50); + if (rtpListenerThread != null) rtpListenerThread.Join(50); + if (msrmntListenerThread != null) msrmntListenerThread.Join(50); + + if (rtpUdpClient != null) + { + rtpUdpClient.Close(); + rtpUdpClient = null; + } + + if (msrmntUdpClient != null) + { + msrmntUdpClient.Close(); + msrmntUdpClient = null; + } + } + + public void RunDeviceBefore() + { + if (sha1sumResponse != null && !sha1sumResponseProcessed) + { + scpThread = new Thread(new ThreadStart(ScpWorker)); + scpThread.Start(); + + sha1sumResponseProcessed = true; + } + } + public void RunDeviceAfter() { } + + + void OnPromptReceived(object sndr, PromptReceivedEventArgs a) + { + if (sha1sumResponse == null) + { + sha1sumResponse = a.Response; + } + } + + + #region Configuration Change Handling + + public static void OnCfgChange(object sender, CfgChangeArgs args) + { + if (CfgChangeHandler == null) return; + try { CfgChangeHandler(sender, args); } + catch (Exception e) { log.Error("CfgChangeHandler(...) failed", e); } + } + + public static event EventHandler CfgChangeHandler; + + public override void StartChangeHandler() + { + CfgChangeHandler += delegate(object sender, CfgChangeArgs args) + { + CameraCfg tmpcfg = args.Cfg as CameraCfg; + if (tmpcfg != null && tmpcfg.Name.Equals(Name)) + { + if (args.Command == CfgChangeCmd.CfgChange) + { + CameraCfg.TestImagesMode = tmpcfg.TestImagesMode; + CameraCfg.TestImagesCount = tmpcfg.TestImagesCount; + } + } + }; + } + + #endregion Configuration Change Handling + + + /// + /// Detect the camera with specified hardware address (DIP switches). + /// Optionally set camera date and time. + /// + /// Hardware address (DIP switches) + /// true = Broadcast 'SetDateTime' to all cameras + /// Detected IP address + /// Detected hardware + /// Detected HW revision + /// Detected serial number + /// Detected OS image + /// true when camera detected successfully + bool DetectCamera(int hwAddress, ref IPAddress ipAddress, bool setDateTime, out string hardware, out string revision, out string serial, out string sdCardVer) + { + for (int trials = 1; trials <= 3; trials++) + { + UdpClient udpClient = new UdpClient(); + + try + { + if (setDateTime) + { + SetDateTime(udpClient, DateTime.Now); + } + + /// + /// Send a request for camera information + /// + DateTime detectionStart = DateTime.Now; + CameraInfoRequest(udpClient, hwAddress); + + /// + /// Receive a response or timeout + /// + IAsyncResult asyncRslt = udpClient.BeginReceive(null, null); + if (asyncRslt.AsyncWaitHandle.WaitOne(500)) + { + /// Response received within time limit + IPEndPoint cameraIPEndpoint = new IPEndPoint(IPAddress.Any, 1852); + byte[] inputBuffer = udpClient.EndReceive(asyncRslt, ref cameraIPEndpoint); + + double duration_ms = (DateTime.Now - detectionStart).TotalMilliseconds; + ipAddress = cameraIPEndpoint.Address; + + udpClient.Close(); + + string response = Encoding.ASCII.GetString(inputBuffer, 0, inputBuffer.Length); + string[] strArr = response.Split(new char[] { ' ', '=' }); + if (strArr.Length == 10 && strArr[0] == "Address" && strArr[2] == "Hardware" && + strArr[4] == "Revision" && strArr[6] == "Serial" && strArr[8] == "Image") + { + hardware = strArr[3]; + revision = strArr[5]; + serial = strArr[7]; + sdCardVer = strArr[9]; + } + else if (strArr.Length == 8 && strArr[0] == "Address" && strArr[2] == "Hardware" && + strArr[4] == "Revision" && strArr[6] == "Serial") + { + hardware = strArr[3]; + revision = strArr[5]; + serial = strArr[7]; + sdCardVer = string.Empty; + } + else + { + continue; + } + + string msg = string.Format("Camera {0} detected in {1} ms: HWAddress={2} IPAddress={3} {4}", + CameraCfg.Name, + duration_ms, + CameraCfg.HardwareAddress, + ipAddress == null ? "not detected" : ipAddress.ToString(), + response); + log.Debug(msg); + Console.WriteLine(msg); + + return true; /// Camera detected + } + } + catch (Exception exc) + { + log.ErrorFormat("Camera {0} with HWAddress={1} not detected : {2}", CameraCfg.Name, CameraCfg.HardwareAddress, exc.Message); + } + + udpClient.Close(); + } + + ipAddress = null; + hardware = null; + revision = null; + serial = null; + sdCardVer = null; + return false; /// No camera detected + } + + void CameraInfoRequest(UdpClient udpClient, int hardwareAddress) + { + string strToSend = string.Format("getinfo {0}", hardwareAddress); + byte[] dataToSend = Encoding.ASCII.GetBytes(strToSend); + udpClient.Send(dataToSend, dataToSend.Length, new IPEndPoint(NetAdapter.BroadcastAddress, 1852)); + } + + void SetDateTime(UdpClient udpClient, DateTime dateTime) + { + string strToSend = string.Format("setdatetime {0:yyMMddHHmmss}", dateTime); + byte[] dataToSend = Encoding.ASCII.GetBytes(strToSend); + udpClient.Send(dataToSend, dataToSend.Length, new IPEndPoint(NetAdapter.BroadcastAddress, 1852)); + } + + + + void ScpWorker() + { + try + { + using (var scpClient = new ScpClient(connectionInfo)) + { + scpClient.Connect(); + + /// + /// Synchronize files in camera /home/tbf/clp directory with the files in "TBF/CameraBinaryFiles" project folder + /// + using (var sshClient = new SshClient(connectionInfo)) + { + sshClient.Connect(); + + DirectoryInfo dirInfo = new DirectoryInfo(Path.Combine(System.Windows.Forms.Application.StartupPath, "CameraBinaryFiles")); + SHA1 sha1calculator = SHA1.Create(); + StringBuilder sha1str = new StringBuilder(); + + foreach (FileInfo fi in dirInfo.GetFiles()) + { + lock (fileUploadLock) + { + FileStream fs = fi.Open(FileMode.Open); + fs.Position = 0; + byte[] sha1 = sha1calculator.ComputeHash(fs); + fs.Close(); + + sha1str.Clear(); + foreach (var b in sha1) sha1str.Append(b.ToString("x2")); + + if (!sha1sumResponse.Contains(string.Format("{0} clp/{1}", sha1str, fi.Name))) + { + /// Copy a file to the camera if SHA1 sum is different of the file is missing + log.InfoFormat("{0}, IP={1}, Uploading file {2}", Name, IPAddress, fi.Name); + scpClient.Upload(fi, string.Format("clp/{0}", fi.Name)); + } + } + + if (!sha1sumResponse.Contains(fi.Name)) + { + /// Change file properties if it was a new file + string command = string.Format("chmod 755 clp/{0}", fi.Name); + log.InfoFormat("{0}, IP={1}, Executing command '{2}'", Name, IPAddress, command); + sshClient.CreateCommand(command).Execute(); + + //if (fi.Name.Equals("runmeonce")) + //{ + // log.InfoFormat("{0}, IP={1}, Executing command 'sudo clp/runmeonce'", Name, IPAddress); + // sshClient.CreateCommand("sudo clp/runmeonce").Execute(); + //} + } + } + } + + scpConnected = scpClient.IsConnected; + running = true; + + /// + /// Run SCP command loop + /// + while (scpConnected && !stopScpThreadFlag) + { + switch (scpCommand) + { + case ScpCommand.Get: + scpCommand = ScpCommand.None; + scpClient.Download(scpRemoteFileName, new System.IO.FileInfo(scpLocalFileName)); + break; + + case ScpCommand.Put: + scpCommand = ScpCommand.None; + scpClient.Upload(new System.IO.FileInfo(scpLocalFileName), scpRemoteFileName); + break; + + default: + Thread.Sleep(250); + break; + } + + scpConnected = scpClient.IsConnected; + } + + running = false; + scpClient.Disconnect(); + scpConnected = false; + } + } + catch (Exception exc) + { + log.ErrorFormat( "Exception in {0} ScpWorker(): {1}", Name, exc.Message); + if (exc.InnerException != null) + { + log.ErrorFormat(" Inner exception: {0}", exc.InnerException.Message); + } + + scpConnected = false; + } + } + + /// + /// Download a file from the camera via SCP + /// + /// + /// 0 (success), -1 (busy), -2 (no session) + public int DownloadFile(string srcFileName, string dstFileName) + { + if (!scpConnected) return -2; + if (scpCommand != ScpCommand.None) return -1; + + scpRemoteFileName = srcFileName; + scpLocalFileName = dstFileName; + scpCommand = ScpCommand.Get; + return 0; + } + + /// + /// Upload a file to the camera via SCP + /// + /// + /// 0 (success), -1 (busy), -2 (no session) + public int UploadFile(string srcFileName, string dstFileName) + { + if (!scpConnected) return -2; + if (scpCommand != ScpCommand.None) return -1; + + scpLocalFileName = srcFileName; + scpRemoteFileName = dstFileName; + scpCommand = ScpCommand.Put; + return 0; + } + + + private void StartRtpListener(IPAddress localIP, int localPort) + { + rtpUdpClient = new UdpClient(new IPEndPoint(localIP, localPort)); + rtpListenerThread = new Thread(new ThreadStart(RtpListener)); + rtpListenerThread.Start(); + } + + void RtpListener() + { + JpegFrame jpegFrame = new JpegFrame(); + bool synced = false; + + while (!stopRtpListenerFlag) + { + try + { + IPEndPoint endpoint = null; + Byte[] data = rtpUdpClient.Receive(ref endpoint); + + if (data.Length > 20) + { + /// Process the packet + RtpPacket newPacket = new RtpPacket(data); + if (synced) + { + /// Sychronized: process the new packet + switch (jpegFrame.AddPacket(newPacket)) + { + case RtpFrame.STATE.Complete: + UiBridge.Bridge.OnImage(this.cameraIdx, jpegFrame.ToImage()); + jpegFrame.Clear(); + break; + case RtpFrame.STATE.Error: + jpegFrame.Clear(); + synced = false; + break; + default: + break; + } + } + else if (newPacket.Mark) + { + /// Synchronize when a packet with Mark occurs, process the next packet + jpegFrame.Clear(); + synced = true; + } + else + { + /// Stay unsynchronized + } + } + } + catch (Exception exc) + { + string msg = string.Format("Exception in MJpeg RTP listener thread: {0}", exc.Message); + log.Error(msg); + } + } + + return; + } + + + + private void StartMsrmntListener(IPAddress localIP, int localPort) + { + msrmntUdpClient = new UdpClient(new IPEndPoint(localIP, localPort)); + msrmntListenerThread = new Thread(new ThreadStart(MsrmntListener)); + msrmntListenerThread.Start(); + } + + void MsrmntListener() + { + StringBuilder toBeProcessed = new StringBuilder(); + int[] angles = new int[RoisAndResults.MaxRegisteredRois]; + + while (!stopMsrmntListenerFlag) + { + try + { + IPEndPoint endpoint = null; + Byte[] data = msrmntUdpClient.Receive(ref endpoint); + + toBeProcessed.Append(Encoding.ASCII.GetString(data, 0, data.Length)); + log.DebugFormat("MeasurementUdpListener() ... toBeProcessed = {0}", toBeProcessed); + + while (true) + { + int from = toBeProcessed.ToString().IndexOf('['); + if (from < 0) break; + + int len = toBeProcessed.ToString(from + 1, toBeProcessed.Length - from - 1).IndexOf(']'); + if (len < 0) break; + + string[] pulsesArr = toBeProcessed.ToString(from + 1, len).Split(new char[] { ';' }); + + bool fmtError = false; + long timeMs; + if ((pulsesArr.Length >= 2) && + (pulsesArr.Length <= RoisAndResults.MaxRegisteredRois + 1) && + long.TryParse(pulsesArr[0], out timeMs)) + { + for (int i = 1; i < pulsesArr.Length; i++) + { + int val; + if (int.TryParse(pulsesArr[i], out val)) + { + angles[i - 1] = Math.Abs(val); /// TODO: pozerat CW/CCW a podla toho dat +/- + } + else + { + fmtError = true; + } + } + + if (!fmtError) roisAndResults.SetResults(timeMs, angles); + } + + toBeProcessed.Remove(0, from + len + 2); + } + } + catch (Exception exc) + { + string msg = string.Format("Exception in the measurement listener thread: {0}", exc.Message); + log.Error(msg); + } + } + + return; + } + + + //public void OnMeasurementDataReceived(object sender, MeasuredDataEventArgs msrmtData) + //{ + // string[] pulsesArr = msrmtData.MeasuredData.Split(new char[] { ';' }); + + // uint uiVal; + // if (result != null && result.Length + 1 == pulsesArr.Length && uint.TryParse(pulsesArr[0], out uiVal)) + // { + // cameraTimeMs = (long)uiVal; + + // for (int i = 0; i < result.Length; i++) + // { + // int val; + // if (int.TryParse(pulsesArr[i + 1], out val)) + // { + // result[i] = Math.Abs(val); + // } + // } + // } + //} + + + public IOperation LiveStreamOp(bool hiRes) + { + int wid = hiRes ? 1280 : 640; + int hgh = hiRes ? 960 : 480; + string command = string.Format("/opt/vc/bin/raspivid -t 0 -cd MJPEG -w {0} -h {1} -fps 30 -b 8000000 -o - | gst-launch-1.0 fdsrc ! \"image/jpeg,framerate=30/1\" ! jpegparse ! rtpjpegpay ! udpsink host={2} port={3}", + wid, hgh, NetAdapter.IPAddress, rtpUdpLocalPort); + + return new LiveStreamOp(this, Telnet, command); + } + + + public IOperation GrabImagesOp(string[] imgFileNames, bool blackAndWhite, bool lowResolution, ImageRotation imageRotation) + { + return new GrabImagesOp(this, imgFileNames, blackAndWhite, lowResolution, imageRotation); + } + + + public IOperation MeasurementOp() + { + if (Telnet != null) + { + return this; + } + else + { + return null; + } + } + + string command; + bool measurementCommandSent; + + + public void Start() + { + /// Prepare the telent command + StringBuilder sb = new StringBuilder(); + for (int i = 1; i <= roisAndResults.RegisteredRoisCount; i++) + { + sb.Append(" "); + sb.Append(roisAndResults.GetRoiParams(i)); + } + + int logImagesArg; + switch (CameraCfg.TestImagesMode) + { + default: + case TestImagesMode.None: + case TestImagesMode.LoadImages: + logImagesArg = 0; + break; + case TestImagesMode.SaveFirstImages: + logImagesArg = CameraCfg.TestImagesCount; + break; + case TestImagesMode.SaveLastImages: + logImagesArg = -CameraCfg.TestImagesCount; + break; + } + + command = string.Format("clp/Measurement -udp {0} {1}{2}{3} 1 7 0 0 {4}", + NetAdapter.IPAddress, + msrmntUdpLocalPort, + (CameraCfg.TestImagesMode == TestImagesMode.LoadImages) ? (" -l " + CameraCfg.TestImagesCount.ToString()) : string.Empty, + sb, + logImagesArg); + + measurementCommandSent = false; + + /// If ready send (=enqueue) the command + if (Telnet.State == TelnetClient.TelnetState.Inactive) + { + log.WarnFormat("{0} SEND_MSRMNT_CMD: {1}", Name, command); + Telnet.Enqueue(new Telnet.Command(CmdAction.SEND_MSRMNT_CMD, command)); + measurementCommandSent = true; + } + } + + public Event Run() + { + if (!measurementCommandSent) + { + /// When ready send (=enqueue) the command + if (Telnet.State == TelnetClient.TelnetState.Inactive) + { + log.WarnFormat("{0} SEND_MSRMNT_CMD: {1}", Name, command); + Telnet.Enqueue(new Telnet.Command(CmdAction.SEND_MSRMNT_CMD, command)); + measurementCommandSent = true; + } + } + + return Event.None; + } + + public void Stop() + { + if (measurementCommandSent) + { + log.WarnFormat("{0} SEND_COMMAND: CTRL-Q", Name); + Telnet.Enqueue(new Telnet.Command(CmdAction.SEND_COMMAND, TelnetClient.Q_Command)); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/CameraCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/CameraCfg.cs new file mode 100644 index 00000000..3cb2bace --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/CameraCfg.cs @@ -0,0 +1,68 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Net; +using System.Net.Sockets; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.Network.Camera.CLP1611 +{ + public enum TestImagesMode + { + None, + SaveFirstImages, + SaveLastImages, + LoadImages, + Count, + Invalid, + } + + public class CameraCfg : ComponentCfgBase, IChildComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(CameraCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new CameraCfgCtrl(); } + + /// + /// Serialized parameters + /// + public int HardwareAddress; + public bool DisplayTerminal; + + [XmlIgnore] + public TestImagesMode TestImagesMode; + + [XmlIgnore] + public int TestImagesCount; + + + /// Private parameterless constructor invoked by all other (public) constructors + CameraCfg() { } + + public CameraCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + Factory = factory; + ParentName = "Network.Adapter"; + HardwareAddress = 1; + TestImagesMode = TestImagesMode.None; + TestImagesCount = 3000; + DebugLevel = Config.Entities.DebugMode.AutoDetect; + } + + public string ToString(int i) + { + return string.Format("Name={0}, s/n={1}, Terminal={2}, TestImagesMode={3}, TestImagesCount={4}, Parent={5}", + Name, + HardwareAddress, + DisplayTerminal ? Strings.yes : Strings.no, + TestImagesMode, + TestImagesCount, + ParentName); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/CameraCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/CameraCfgCtrl.cs new file mode 100644 index 00000000..e4358d42 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/CameraCfgCtrl.cs @@ -0,0 +1,180 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.Network.Camera.CLP1611 +{ + public partial class CameraCfgCtrl : UserControl, IComponentCfgCtrl + { + ComponentParametersDlg parent; + + public bool ShowMore { get { return false; } } + + CameraCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as CameraCfg; + Redraw(); + } + } + + public CameraCfgCtrl() + { + InitializeComponent(); + } + + private void PumpCfgCtrl_Load(object sender, EventArgs e) + { + Localize(); + + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + + if (parent.TbfComponents != null) + { + foreach (var cmpnt in parent.TbfComponents) + { + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is TBF.BenchControl.Network.Adapter.Factory) + { + parentNameComboBox.Items.Add(cmpnt.Name); + } + } + } + + for (TestImagesMode mode = 0; mode < TestImagesMode.Count; mode++) + { + testImagesModeComboBox.Items.Add(mode.ToString()); + } + + Redraw(); + } + + void Localize() + { + nameLabel.Text = Strings.Name; + parentNameLabel.Text = Strings.Parent_name; + hwAddressLabel.Text = Strings.Serial_Number; + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + parentNameComboBox.Text = string.IsNullOrEmpty(config.ParentName) ? "---" : config.ParentName; + hwAddressTextBox.Text = config.HardwareAddress.ToString(); + displayTerminalCheckBox.Checked = config.DisplayTerminal; + testImagesModeComboBox.Text = config.TestImagesMode.ToString(); + testImagesCountTextBox.Text = config.TestImagesCount.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + parentNameComboBox.Enabled = true; + hwAddressTextBox.Enabled = true; + displayTerminalCheckBox.Enabled = true; + testImagesModeComboBox.Enabled = true; + testImagesCountTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!parentNameComboBox.Items.Contains(parentNameComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + string.Format(Strings.Invalid_0, parentNameLabel.Text); + } + + if (!int.TryParse(hwAddressTextBox.Text, out dummy) || dummy % 100 > 63) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + string.Format(Strings.Invalid_0, hwAddressLabel.Text); + } + + TestImagesMode newTestImagesMode = TestImagesMode.Invalid; + for (TestImagesMode mode = 0; mode < TestImagesMode.Count; mode++) + { + if (testImagesModeComboBox.Text == mode.ToString()) newTestImagesMode = mode; + } + if (newTestImagesMode == TestImagesMode.Invalid) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + string.Format(Strings.Invalid_0, testImagesModeLabel.Text); + } + + if (!int.TryParse(testImagesCountTextBox.Text, out dummy) || dummy < 0 || dummy > 3000 + || ((dummy == 0) && (newTestImagesMode != TestImagesMode.None))) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + string.Format(Strings.Invalid_0, testImagesCountLabel.Text); + } + + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + string newParentName = parentNameComboBox.Text.Equals("---") ? string.Empty : parentNameComboBox.Text; + int newHWAddress = int.Parse(hwAddressTextBox.Text); + TestImagesMode newTestImagesMode = 0; + for (TestImagesMode mode = 0; mode < TestImagesMode.Count; mode++) + { + if (testImagesModeComboBox.Text == mode.ToString()) newTestImagesMode = mode; + } + int newTestImagesCount = int.Parse(testImagesCountTextBox.Text); + + + if (config.Name != nameTextBox.Text || + config.ParentName != newParentName || + config.HardwareAddress != newHWAddress || + config.DisplayTerminal != displayTerminalCheckBox.Checked) + { + config.Name = nameTextBox.Text; + config.ParentName = newParentName; + config.HardwareAddress = newHWAddress; + config.DisplayTerminal = displayTerminalCheckBox.Checked; + + flags |= (CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + } + + + if (config.TestImagesMode != newTestImagesMode || + config.TestImagesCount != newTestImagesCount) + { + config.TestImagesMode = newTestImagesMode; + config.TestImagesCount = newTestImagesCount; + + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.VolatileChange); + } + + if ((flags & CfgUpdateFlags.InvokeCfgChange) != 0) + { + Camera.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.CfgChange, config)); + } + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/CameraCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/CameraCfgCtrl.designer.cs new file mode 100644 index 00000000..18f1663f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/CameraCfgCtrl.designer.cs @@ -0,0 +1,194 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.Network.Camera.CLP1611 +{ + partial class CameraCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.hwAddressTextBox = new System.Windows.Forms.TextBox(); + this.hwAddressLabel = new System.Windows.Forms.Label(); + this.parentNameLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.parentNameComboBox = new System.Windows.Forms.ComboBox(); + this.displayTerminalCheckBox = new System.Windows.Forms.CheckBox(); + this.testImagesCountTextBox = new System.Windows.Forms.TextBox(); + this.testImagesCountLabel = new System.Windows.Forms.Label(); + this.testImagesModeComboBox = new System.Windows.Forms.ComboBox(); + this.testImagesModeLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // hwAddressTextBox + // + this.hwAddressTextBox.Enabled = false; + this.hwAddressTextBox.Location = new System.Drawing.Point(132, 92); + this.hwAddressTextBox.Name = "hwAddressTextBox"; + this.hwAddressTextBox.Size = new System.Drawing.Size(130, 20); + this.hwAddressTextBox.TabIndex = 6; + // + // hwAddressLabel + // + this.hwAddressLabel.AutoSize = true; + this.hwAddressLabel.Location = new System.Drawing.Point(28, 95); + this.hwAddressLabel.Name = "hwAddressLabel"; + this.hwAddressLabel.Size = new System.Drawing.Size(71, 13); + this.hwAddressLabel.TabIndex = 5; + this.hwAddressLabel.Text = "Serial number"; + // + // parentNameLabel + // + this.parentNameLabel.AutoSize = true; + this.parentNameLabel.Location = new System.Drawing.Point(28, 69); + this.parentNameLabel.Name = "parentNameLabel"; + this.parentNameLabel.Size = new System.Drawing.Size(67, 13); + this.parentNameLabel.TabIndex = 3; + this.parentNameLabel.Text = "Parent name"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(132, 41); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(28, 44); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(129, 17); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // parentNameComboBox + // + this.parentNameComboBox.Enabled = false; + this.parentNameComboBox.FormattingEnabled = true; + this.parentNameComboBox.Location = new System.Drawing.Point(132, 66); + this.parentNameComboBox.Name = "parentNameComboBox"; + this.parentNameComboBox.Size = new System.Drawing.Size(130, 21); + this.parentNameComboBox.TabIndex = 4; + // + // displayTerminalCheckBox + // + this.displayTerminalCheckBox.AutoSize = true; + this.displayTerminalCheckBox.Enabled = false; + this.displayTerminalCheckBox.Location = new System.Drawing.Point(133, 122); + this.displayTerminalCheckBox.Name = "displayTerminalCheckBox"; + this.displayTerminalCheckBox.Size = new System.Drawing.Size(99, 17); + this.displayTerminalCheckBox.TabIndex = 7; + this.displayTerminalCheckBox.Text = "Display terminal"; + this.displayTerminalCheckBox.UseVisualStyleBackColor = true; + // + // testImagesCountTextBox + // + this.testImagesCountTextBox.Enabled = false; + this.testImagesCountTextBox.Location = new System.Drawing.Point(132, 174); + this.testImagesCountTextBox.Name = "testImagesCountTextBox"; + this.testImagesCountTextBox.Size = new System.Drawing.Size(46, 20); + this.testImagesCountTextBox.TabIndex = 12; + // + // testImagesCountLabel + // + this.testImagesCountLabel.AutoSize = true; + this.testImagesCountLabel.Location = new System.Drawing.Point(28, 177); + this.testImagesCountLabel.Name = "testImagesCountLabel"; + this.testImagesCountLabel.Size = new System.Drawing.Size(94, 13); + this.testImagesCountLabel.TabIndex = 11; + this.testImagesCountLabel.Text = "Test images count"; + // + // testImagesModeComboBox + // + this.testImagesModeComboBox.Enabled = false; + this.testImagesModeComboBox.FormattingEnabled = true; + this.testImagesModeComboBox.Location = new System.Drawing.Point(132, 148); + this.testImagesModeComboBox.Name = "testImagesModeComboBox"; + this.testImagesModeComboBox.Size = new System.Drawing.Size(130, 21); + this.testImagesModeComboBox.TabIndex = 14; + // + // testImagesModeLabel + // + this.testImagesModeLabel.AutoSize = true; + this.testImagesModeLabel.Location = new System.Drawing.Point(28, 151); + this.testImagesModeLabel.Name = "testImagesModeLabel"; + this.testImagesModeLabel.Size = new System.Drawing.Size(93, 13); + this.testImagesModeLabel.TabIndex = 13; + this.testImagesModeLabel.Text = "Test images mode"; + // + // CameraCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.testImagesModeComboBox); + this.Controls.Add(this.testImagesModeLabel); + this.Controls.Add(this.hwAddressTextBox); + this.Controls.Add(this.hwAddressLabel); + this.Controls.Add(this.testImagesCountTextBox); + this.Controls.Add(this.testImagesCountLabel); + this.Controls.Add(this.displayTerminalCheckBox); + this.Controls.Add(this.parentNameComboBox); + this.Controls.Add(this.parentNameLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "CameraCfgCtrl"; + this.Size = new System.Drawing.Size(402, 254); + this.Load += new System.EventHandler(this.PumpCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox hwAddressTextBox; + private System.Windows.Forms.Label hwAddressLabel; + private System.Windows.Forms.Label parentNameLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.ComboBox parentNameComboBox; + private System.Windows.Forms.CheckBox displayTerminalCheckBox; + private System.Windows.Forms.TextBox testImagesCountTextBox; + private System.Windows.Forms.Label testImagesCountLabel; + private System.Windows.Forms.ComboBox testImagesModeComboBox; + private System.Windows.Forms.Label testImagesModeLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/CameraCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/CameraCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/CameraCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/Factory.cs new file mode 100644 index 00000000..29781f91 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Network.Camera.CLP1611 +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Camera.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Camera(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Camera(cfg, components); } + + public IComponentCfg DefaultConfig() { return new CameraCfg(this.GetType().Namespace.Substring(17), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(CameraCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/GrabImagesOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/GrabImagesOp.cs new file mode 100644 index 00000000..16844173 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/GrabImagesOp.cs @@ -0,0 +1,187 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// +using System; +using System.Diagnostics; +using log4net; +using Config.Entities; +using TBF.BenchControl.Network.Telnet; +using System.IO; + +namespace TBF.BenchControl.Network.Camera.CLP1611 +{ + public class GrabImagesOp : IOperation + { + /// TODO: Implement support for grabbing multiple images, now imgFileNames.Lenght should be 1 + + private static readonly ILog log = LogManager.GetLogger(typeof(GrabImagesOp)); + public override string ToString() { return string.Format("GrabImageOp()"); } + + readonly Camera camera; + readonly Telnet.TelnetClient telnet; + readonly string[] imgFileNames; + readonly bool blackAndWhite; + readonly bool lowResolution; + readonly ImageRotation imageRotation; + + string command; + bool grabImageCommandSent; + string response; + bool grabPassed; + bool grabFailed; + bool transferringGrabbedImage; + + + /// + /// Events: Event.None or Event.Error + /// + /// CLP1611.Camera reference + public GrabImagesOp(Camera camera, string[] imgFileNames, bool blackAndWhite, bool lowResolution, ImageRotation imageRotation) + { + /// TODO: Implement support for grabbing multiple images, now imgFileNames.Lenght should be 1 + + this.camera = camera; + this.telnet = camera.Telnet; + this.imgFileNames = imgFileNames; + this.blackAndWhite = blackAndWhite; + this.lowResolution = lowResolution; + this.imageRotation = imageRotation; + + grabImageCommandSent = false; + transferringGrabbedImage = false; + + telnet.promptReceivedHandler += delegate(object sndr, PromptReceivedEventArgs a) + { + OnPromptReceived(sndr, a); + }; + } + + void OnPromptReceived(object sndr, PromptReceivedEventArgs a) + { + response = a.Response; + /// TODO + } + + + public void Start() + { + if (camera.CameraCfg.DebugLevel == Config.Entities.DebugMode.Simulate) return; + + grabImageCommandSent = false; + transferringGrabbedImage = false; + if (File.Exists(imgFileNames[0])) File.Delete(imgFileNames[0]); + } + + public Event Run() + { + if (camera.CameraCfg.DebugLevel == Config.Entities.DebugMode.Simulate) return Event.None; + + if (imgFileNames.Length < 1 || imgFileNames[0] == null) + { + return Event.GrabPassed; + } + else if (!grabImageCommandSent) + { + if (camera.Running && (telnet.State == TelnetClient.TelnetState.Inactive)) + { + // + // State variables + // + response = null; + + // + // Prepare command + // + int rotation = 0; + if (imageRotation == ImageRotation.Deg90) + rotation = 90; + else if (imageRotation == ImageRotation.Deg180) + rotation = 180; + else if (imageRotation == ImageRotation.Deg270) + rotation = 270; + + command = string.Format("clp/GrabImage {0} {1} -r {2} {3} -n 1 {4}", + blackAndWhite ? "-bmp" : "-bmp", /// 0 ... file format and quality + blackAndWhite ? "-y8" : "-rgb", /// 1 ... B&W / color + rotation.ToString(), /// 2 ... roration + lowResolution ? "-lr" : "-hr", /// 4 ... resolution + "grabbed.bmp"); /// 5 ... filename + + // + // Send (or enqueue) command + // + telnet.Enqueue(new Telnet.Command(Telnet.CmdAction.CLEAR_RESPONSE)); + telnet.Enqueue(new Telnet.Command(Telnet.CmdAction.SEND_COMMAND, command)); + grabImageCommandSent = true; + log.WarnFormat("{0} IP={1} command={2}", camera.Name, camera.IPAddress, command); + } + return Event.CameraBusy; + } + else if (grabPassed) + { + if (transferringGrabbedImage) + { + /// Grab passed and image transfer is in progress + return Event.GrabPassed; + } + else if (0 == camera.DownloadFile(blackAndWhite ? "grabbed.jpg" : "grabbed.bmp", imgFileNames[0])) + { + /// File transfer successfully started + transferringGrabbedImage = true; + return Event.GrabPassed; + } + else + { + /// Wait until the previous image transfer completes + return Event.CameraBusy; + } + } + else if (grabFailed) + { + /// Grab failed, there in no image to transfer + return Event.GrabFailed; + } + else if (response != null) + { + if (response.Contains("completed")) + { + grabPassed = true; + + /// + /// Start the file transfer + /// + if (0 == camera.DownloadFile(blackAndWhite ? "grabbed.jpg" : "grabbed.bmp", imgFileNames[0])) + { + /// File transfer successfully started + transferringGrabbedImage = true; + return Event.GrabPassed; + } + else + { + return Event.CameraBusy; /// File transfer not started yet + } + } + else + { + grabFailed = true; + return Event.GrabFailed; + } + } + else + { + return Event.CameraBusy; + } + } + + public void Stop() + { + if (camera.CameraCfg.DebugLevel == Config.Entities.DebugMode.Simulate) return; + + if (grabImageCommandSent) + { + telnet.Enqueue(new Telnet.Command(Telnet.CmdAction.SEND_COMMAND, Telnet.TelnetClient.CtrlCCommand)); + log.WarnFormat("{0} IP={1} command=CTRL-C", camera.Name, camera.IPAddress); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/LiveStreamOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/LiveStreamOp.cs new file mode 100644 index 00000000..0b23ae85 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/LiveStreamOp.cs @@ -0,0 +1,67 @@ +using System; +using System.Diagnostics; +using log4net; +using TBF.BenchControl.Network.Telnet; + +namespace TBF.BenchControl.Network.Camera.CLP1611 +{ + public class LiveStreamOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(LiveStreamOp)); + + readonly Camera camera; + readonly Telnet.TelnetClient telnet; + readonly string command; + + bool liveStreamCommandSent; + + /// + /// Events: Event.None or Event.Error + /// + /// CLP1611.Camera reference + public LiveStreamOp(Camera camera, Telnet.TelnetClient telnet, string command) + { + this.camera = camera; + this.telnet = telnet; + this.command = command; + } + + + public void Start() + { + liveStreamCommandSent = false; + } + + public Event Run() + { + if (camera.CameraCfg.DebugLevel == Config.Entities.DebugMode.Simulate) return Event.None; + + log.DebugFormat("Run(): telnet.State = {0}, liveStreamCommandSent = {1}", telnet.State, liveStreamCommandSent); + + if (!liveStreamCommandSent) + { + if (camera.Running && (telnet.State == TelnetClient.TelnetState.Inactive)) + { + telnet.Enqueue(new Telnet.Command(Telnet.CmdAction.SEND_STRING, command)); + liveStreamCommandSent = true; + log.WarnFormat("{0} IP={1} command={2}", camera.Name, camera.IPAddress, command); + } + } + + return Event.None; + } + + public void Stop() + { + if (camera.CameraCfg.DebugLevel == Config.Entities.DebugMode.Simulate) return; + + log.DebugFormat("Stop(): telnet.State = {0}, liveStreamCommandSent = {1}", telnet.State, liveStreamCommandSent); + + if (liveStreamCommandSent) + { + telnet.Enqueue(new Telnet.Command(Telnet.CmdAction.SEND_COMMAND, Telnet.TelnetClient.CtrlCCommand)); + log.WarnFormat("{0} IP={1} command=CTRL-C", camera.Name, camera.IPAddress); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/MJpegFrame.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/MJpegFrame.cs new file mode 100644 index 00000000..864869c8 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/MJpegFrame.cs @@ -0,0 +1,382 @@ +using System; +using System.Collections.Generic; +using log4net; + +namespace TBF.BenchControl.Network.Camera +{ + /// + /// Implements RFC2435 + /// + public class JpegFrame : RtpFrame + { + static readonly ILog log = LogManager.GetLogger(typeof(MainWnd)); + + #region Statics + + static byte[] CreateStartOfInformation() + { + return new byte[] { 0xff, 0xd8 }; + } + + static byte[] CreateJFIFHeader(uint type, uint width, uint height, ArraySegment tables, uint dri) + { + List result = new List(); + result.AddRange(CreateStartOfInformation()); + + result.Add(0xff); + result.Add(0xe0);//AppFirst + result.Add(0x00); + result.Add(0x10);//length + result.Add((byte)'J'); + result.Add((byte)'F'); + result.Add((byte)'I'); + result.Add((byte)'F'); + result.Add(0x00); + + result.Add(0x01);//Version Major + result.Add(0x01);//Version Minor + + result.Add(0x00);//Units + + result.Add(0x00);//Horizontal + result.Add(0x01); + + result.Add(0x00);//Vertical + result.Add(0x01); + + result.Add(0x00);//No thumb + result.Add(0x00); + + if (dri > 0) + { + result.AddRange(CreateDataRestartIntervalMarker(dri)); + } + + result.AddRange(CreateQuantizationTablesMarker(tables)); + + result.Add(0xff); + result.Add(0xc0);//SOF + result.Add(0x00); + result.Add(0x11); + result.Add(0x08); + result.Add((byte)(height >> 8)); + result.Add((byte)height); + result.Add((byte)(width >> 8)); + result.Add((byte)width); + + result.Add(0x03); + result.Add(0x01); + result.Add((byte)(type > 0 ? 0x22 : 0x21)); + result.Add(0x00); + + result.Add(0x02); + result.Add(0x11); + result.Add(0x01); + + result.Add(0x03); + result.Add(0x11); + result.Add(0x01); + + //Huffman Tables + result.AddRange(CreateHuffmanTableMarker(lum_dc_codelens, lum_dc_symbols, 0, 0)); + result.AddRange(CreateHuffmanTableMarker(lum_ac_codelens, lum_ac_symbols, 0, 1)); + result.AddRange(CreateHuffmanTableMarker(chm_dc_codelens, chm_dc_symbols, 1, 0)); + result.AddRange(CreateHuffmanTableMarker(chm_ac_codelens, chm_ac_symbols, 1, 1)); + + result.Add(0xff); + result.Add(0xda);//Marker SOS + result.Add(0x00); + result.Add(0x0c); + result.Add(0x03); + result.Add(0x01); + result.Add(0x00); + result.Add(0x02); + result.Add(0x11); + result.Add(0x03); + result.Add(0x11); + result.Add(0x00); + result.Add(0x3f); + result.Add(0x00); + + return result.ToArray(); + } + + // The default 'luma' and 'chroma' quantizer tables, in zigzag order: + static byte[] defaultQuantizers = new byte[] + { + // luma table: + 16, 11, 12, 14, 12, 10, 16, 14, + 13, 14, 18, 17, 16, 19, 24, 40, + 26, 24, 22, 22, 24, 49, 35, 37, + 29, 40, 58, 51, 61, 60, 57, 51, + 56, 55, 64, 72, 92, 78, 64, 68, + 87, 69, 55, 56, 80, 109, 81, 87, + 95, 98, 103, 104, 103, 62, 77, 113, + 121, 112, 100, 120, 92, 101, 103, 99, + // chroma table: + 17, 18, 18, 24, 21, 24, 47, 26, + 26, 47, 99, 66, 56, 66, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99 + }; + + /// + /// Creates a Luma and Chroma Table using the default quantizer + /// + /// The quality + /// 64 luma bytes and 64 chroma + static byte[] CreateQuantizationTables(uint Q) + { + int factor = (int)Q; + int q; + + if (Q < 1) factor = 1; + else if (Q > 99) factor = 99; + + if (Q < 50) + { + q = 5000 / factor; + } + else + { + q = 200 - factor * 2; + } + byte[] resultTables = new byte[128]; + for (int i = 0; i < 128; ++i) + { + int newVal = (defaultQuantizers[i] * q + 50) / 100; + if (newVal < 1) newVal = 1; + else if (newVal > 255) newVal = 255; + resultTables[i] = (byte)newVal; + } + return resultTables; + } + + static byte[] CreateQuantizationTablesMarker(ArraySegment tables) + { + List result = new List(); + + int tableSize = tables.Count / 2; + + //Luma + + result.Add(0xff); + result.Add(0xdb); + + result.Add(0x00); + result.Add((byte)(tableSize + 3)); + result.Add(0x00); + + for (int i = 0, e = tableSize; i < e; ++i) + { + result.Add(tables.Array[tables.Offset + i]); + } + + //Chroma + + result.Add(0xff); + result.Add(0xdb); + + result.Add(0x00); + result.Add((byte)(tableSize + 3)); + result.Add(0x01); + + for (int i = tableSize, e = tables.Count; i < e; ++i) + { + result.Add(tables.Array[tables.Offset + i]); + } + + return result.ToArray(); + + } + + static byte[] lum_dc_codelens = { 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }; + + static byte[] lum_dc_symbols = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; + + static byte[] lum_ac_codelens = { 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d, }; + + static byte[] lum_ac_symbols = { + 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, + 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, + 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, + 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, + 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, + 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, + 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, + 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, + 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, + 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, + 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, + 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, + 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, + 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, + 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, + 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, + 0xf9, 0xfa, + }; + + static byte[] chm_dc_codelens = { 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }; + + static byte[] chm_dc_symbols = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; + + static byte[] chm_ac_codelens = { 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 }; + + static byte[] chm_ac_symbols = { + 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, + 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, + 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, + 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, + 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, + 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, + 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, + 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, + 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, + 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, + 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, + 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, + 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, + 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, + 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, + 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, + 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, + 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, + 0xf9, 0xfa, + }; + + static byte[] CreateHuffmanTableMarker(byte[] codeLens, byte[] symbols, int tableNo, int tableClass) + { + List result = new List(); + result.Add(0xff); + result.Add(0xc4); + result.Add(0x00); + result.Add((byte)(3 + codeLens.Length + symbols.Length)); + result.Add((byte)((tableClass << 4) | tableNo)); + result.AddRange(codeLens); + result.AddRange(symbols); + return result.ToArray(); + } + + static byte[] CreateDataRestartIntervalMarker(uint dri) + { + return new byte[] { 0xff, 0xdd, 0x00, 0x04, (byte)(dri >> 8), (byte)(dri) }; + } + + #endregion + + public JpegFrame() : base(26) { } + + /// + /// //Writes the packets to a memory stream and created the default header and quantization tables if necessary. + /// + void ProcessPackets(System.IO.MemoryStream buffer) + { + ArraySegment tables = default(ArraySegment); + uint FragmentOffset, TypeSpecific, Type, Quality, Width, Height, DataRestartInterval = 0; + + for (int i = 0, e = this.Packets.Count, last = e - 1; i < e; ++i) + { + int offset = 0; + + RtpPacket packet = this.Packets[i]; + + TypeSpecific = (uint)(packet.Payload[offset++]); + + //FragmentOffset = (uint)(packet.Payload[offset++] | packet.Payload[offset++] << 8 | packet.Payload[offset++] << 16); + FragmentOffset = (uint)(packet.Payload[offset++] << 16 | packet.Payload[offset++] << 8 | packet.Payload[offset++]); + + //Ensure start packet + if (i == 0 && FragmentOffset != 0) continue; + + Type = (uint)(packet.Payload[offset++]); + Quality = (uint)packet.Payload[offset++]; + Width = (uint)(packet.Payload[offset++] * 8); + Height = (uint)(packet.Payload[offset++] * 8); + + //Only occur in the first packet + if (FragmentOffset == 0) + { + //If There is already a StartOfInformation present just copy + if (packet.Payload[offset] == 0xff && packet.Payload[offset + 1] == 0xd8) + { + goto WritePacket; + } + + //Get the restart interval is present + if (Type > 63) + { + DataRestartInterval = (uint)(packet.Payload[offset++] << 8 | packet.Payload[offset++]); + } + + //Get the Q Tables if present + if (Quality > 127) + { + uint MBZ = (uint)(packet.Payload[offset++]);//Should only proceed if MBZ > 0? + uint Precision = (uint)(packet.Payload[offset++]);//Wasted read + uint Length = (uint)(packet.Payload[offset++] << 8 | packet.Payload[offset++]); + if(Length > 0) + { + tables = new ArraySegment(packet.Payload, offset, (int)Length); + offset += (int)Length; + } + else + { + tables = new ArraySegment(CreateQuantizationTables(Quality)); + } + } + + //Write the header to the buffer + byte[] header = CreateJFIFHeader(Type, Width, Height, tables, DataRestartInterval); + buffer.Write(header, 0, header.Length); + + } + + WritePacket: //Copy rest of data to buffer + buffer.Write(packet.Payload, offset, packet.Payload.Length - offset); + + //Check to see if EOI is present or needs to be added on the last packet + if (i == last && packet.Payload[packet.Payload.Length - 2] != 0xff && packet.Payload[packet.Payload.Length - 1] != 0xd9) + { + buffer.WriteByte(0xff); + buffer.WriteByte(0xd9); + } + + } + + //Go back to the beginning + buffer.Seek(0, System.IO.SeekOrigin.Begin); + } + + + /// + /// Creates a image from the processed packets in the memory stream + /// + /// The image created from the packets + public System.Drawing.Image ToImage() + { + try + { + using (System.IO.MemoryStream buffer = new System.IO.MemoryStream()) + { + ProcessPackets(buffer); + return System.Drawing.Image.FromStream(buffer, false, true); + } + } + catch (Exception exc) + { + log.ErrorFormat("Exception in ToImage(): {0}", exc.Message); + return null; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/RoisAndResults.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/RoisAndResults.cs new file mode 100644 index 00000000..131df5c9 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/RoisAndResults.cs @@ -0,0 +1,91 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; + +namespace TBF.BenchControl.Network.Camera.CLP1611 +{ + public class RoisAndResults + { + public const int MaxRegisteredRois = 4; /// Max. count of registered (and measured) ROI-s + + public long CameraTimeMs; + public int[] Angles; + + private IList roiParams; + public int RegisteredRoisCount { get { return roiParams.Count; } } + + + public RoisAndResults() + { + Angles = new int[MaxRegisteredRois]; + roiParams = new List(); + } + + + public void ClearRoiParams() + { + lock (this) + { + roiParams.Clear(); + } + } + + public int RegisterRoi(string roiParam) + { + lock (this) + { + if (this.roiParams.Count >= MaxRegisteredRois) return 0; + + this.roiParams.Add(roiParam); + return this.roiParams.Count; /// return a handle 1 .. MaxRegisteredRois + } + } + + public string GetRoiParams(int roiHandle) + + { + lock (this) + { + if (roiHandle > 0 && roiHandle <= roiParams.Count) + { + return roiParams[roiHandle - 1]; + } + else + { + return string.Empty; + } + } + } + + public void SetResults(long timeMs, int[] angles) + { + lock (this) + { + CameraTimeMs = timeMs; + for (int i = 0; i < Math.Min(angles.Length, Angles.Length); i++) + { + Angles[i] = angles[i]; + } + } + } + + public int GetResult(int roiHandle, out long timeMs) + { + lock (this) + { + if (roiHandle > 0 && roiHandle <= roiParams.Count) + { + timeMs = CameraTimeMs; + return Angles[roiHandle - 1]; + } + else + { + timeMs = 0; + return 0; + } + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/RtpFrame.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/RtpFrame.cs new file mode 100644 index 00000000..f08abd2b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/RtpFrame.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace TBF.BenchControl.Network.Camera +{ + public class RtpFrame + { + public enum STATE + { + Empty, + OK, + Error, + Complete, + } + + public readonly int PayloadType; + public IList Packets; + public STATE State { get { return state; } } + STATE state; + + + public RtpFrame(int payloadType) + { + PayloadType = payloadType; + Packets = new List(); + state = STATE.Empty; + } + + public STATE AddPacket(RtpPacket packet) + { + if (state == STATE.Error || packet.PayloadType != PayloadType) + { + return (state = STATE.Error); /// Already in error or wrong payload type + } + else if (state == STATE.Complete) + { + return STATE.Complete; /// Already complete + } + else if (state != STATE.Empty && packet.SequenceNumber != Packets.Last().SequenceNumber + 1) + { + return (state = STATE.Error); /// Packet out of order + } + + /// Going to add a new packet previous ones + Packets.Add(packet); + + if (packet.Mark) + { + return (state = STATE.Complete); /// Complete now + } + else + { + return (state = STATE.OK); /// OK, not complete yet + } + } + + public void Clear() + { + Packets.Clear(); + state = STATE.Empty; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/RtpPacket.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/RtpPacket.cs new file mode 100644 index 00000000..8f7ae2a6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/RtpPacket.cs @@ -0,0 +1,47 @@ +using System; + +namespace TBF.BenchControl.Network.Camera +{ + public class RtpPacket + { + public readonly int Version; + public readonly bool P; + public readonly bool X; + public readonly int CC; + public readonly bool Mark; + public readonly int PayloadType; + public readonly int SequenceNumber; + public readonly int Timestamp; + public readonly int SsrcId; + public readonly Byte[] Payload; /// Data without RTP header + + public RtpPacket(Byte[] data) + { + if (data.Length < 12) throw new Exception("Packet too short"); + + Version = (data[0] >> 6) & 0x02; /// 1 RTP Version + P = ((data[0] & 0x20) != 0); /// 2 RTP P + X = ((data[0] & 0x10) != 0); /// 3 RTP X + CC = (data[0] & 0x0F); /// 4 RTP CC + Mark = ((data[1] & 0x80) != 0); /// 5 RTP M + PayloadType = (data[1] & 0x7F); /// 6 RTP PT + SequenceNumber = data[2] * 256 + data[3]; /// 7 RTP Seq# + Timestamp = ((data[4] * 256 + data[5]) * 256 + data[6]) * 256 + data[7]; /// 8 RTP Timestamp + SsrcId = ((data[8] * 256 + data[9]) * 256 + data[10]) * 256 + data[11]; /// 9 RTP SSRC Id + + int ExtensionHeaderSize = 0; + if (X && data.Length >= 16 + 4*CC) + { + ExtensionHeaderSize = data[14 + 4*CC] * 256 + data[15 + 4*CC] + 4; + } + + int payloadDataOffset = 12 + 4 * CC + ExtensionHeaderSize; + int payloadDataCount = data.Length - 12 - 4 * CC - ExtensionHeaderSize; + + if (payloadDataCount < 0) throw new Exception("Invalid packet"); + + Payload = new byte[payloadDataCount]; + Array.Copy(data, payloadDataOffset, Payload, 0, payloadDataCount); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/TerminalDlg.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/TerminalDlg.Designer.cs new file mode 100644 index 00000000..8fe1a070 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/TerminalDlg.Designer.cs @@ -0,0 +1,62 @@ +namespace TBF.BenchControl.Network.Camera.CLP1611 +{ + partial class TerminalDlg + { + /// + /// 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() + { + this.vtTextBox = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // vtTextBox + // + this.vtTextBox.Dock = System.Windows.Forms.DockStyle.Fill; + this.vtTextBox.Location = new System.Drawing.Point(0, 0); + this.vtTextBox.Multiline = true; + this.vtTextBox.Name = "vtTextBox"; + this.vtTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Both; + this.vtTextBox.Size = new System.Drawing.Size(737, 437); + this.vtTextBox.TabIndex = 0; + // + // TerminalDlg + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(737, 437); + this.Controls.Add(this.vtTextBox); + this.Name = "TerminalDlg"; + this.Text = "Terminal"; + this.Load += new System.EventHandler(this.Terminal_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox vtTextBox; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/TerminalDlg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/TerminalDlg.cs new file mode 100644 index 00000000..d1ce55b1 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/TerminalDlg.cs @@ -0,0 +1,39 @@ +using System; +using System.Windows.Forms; +using TBF.BenchControl.Network.Telnet; + +namespace TBF.BenchControl.Network.Camera.CLP1611 +{ + public partial class TerminalDlg : Form + { + TelnetClient telnet; + bool dlgLoaded; + + public TerminalDlg() + { + InitializeComponent(); + } + + public TerminalDlg(string name, TelnetClient telnet) + { + InitializeComponent(); + Text = name; + this.telnet = telnet; + } + + private void Terminal_Load(object sender, EventArgs e) + { + telnet.vtTextChangedHandler += delegate(object sndr, VtTextChangedEventArgs args) + { + if (InvokeRequired) { Invoke(new EventHandler(OnTextChanged), sndr, args); } + else OnTextChanged(sndr, args); + }; + dlgLoaded = true; + } + + void OnTextChanged(object sndr, VtTextChangedEventArgs args) + { + vtTextBox.Text = args.VtText; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/TerminalDlg.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/TerminalDlg.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/CLP1611/TerminalDlg.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Display/Display.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Display/Display.cs new file mode 100644 index 00000000..5204921c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Display/Display.cs @@ -0,0 +1,153 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Text; +using log4net; +using Config.Entities; +using TBF.BenchControl.GenericDevices; +using System.Windows.Forms; + +namespace TBF.BenchControl.Network.Camera.Display +{ + public class Display : ComponentBase, IOperation, ICameraDisplay + { + private static readonly ILog log = LogManager.GetLogger(typeof(Display)); + public override string ToString() + { + return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); + } + + + public readonly DisplayCfg DisplayCfg; + /// + public Display() + { + } + /// + public Display(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + DisplayCfg = cfg as DisplayCfg; + + log.Debug(this.ToString()); + } + + + + public bool[] SelectedImages { get { return selectedImages; } } + bool[] selectedImages; + + + + public enum CurrentOp + { + None, + StaticImage, + LiveStream, + } + CurrentOp currentOp; + DialogResult result; + + string title; + string[] imageFileNames; + + + + DisplayForm displayForm; + /// + delegate void DisplayFormDlgt(Display myRef); + /// + void OpenStaticImageDisplay(Display myRef) + { + myRef.displayForm = new DisplayForm(imageFileNames, title); + displayForm.Show(); + } + /// + void OpenLiveStreamDisplay(Display myRef) + { + myRef.displayForm = new DisplayForm(imageFileNames, title); + displayForm.Show(); + } + + + + /// Reference to the operation + public IOperation ShowStaticImageOp(string[] imageFileNames, string title) + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + + this.imageFileNames = imageFileNames; + this.title = title; + currentOp = CurrentOp.StaticImage; + + return this; + } + + /// Reference to the operation + public IOperation ShowLiveStreamOp(string[] imageFileNames, string title) + { + if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); + + this.imageFileNames = imageFileNames; + this.title = title; + currentOp = CurrentOp.LiveStream; + + return this; + } + + + + /// Start this operation + public void Start() + { + result = DialogResult.None; + + switch (currentOp) + { + case CurrentOp.StaticImage: + Program.MainWnd.Invoke(new DisplayFormDlgt(OpenStaticImageDisplay), this); + break; + + case CurrentOp.LiveStream: + Program.MainWnd.Invoke(new DisplayFormDlgt(OpenLiveStreamDisplay), this); + break; + } + } + + /// Run this operation + /// Event.None + public Event Run() + { + if (!displayForm.Completed) + { + return Event.ModelessFormIsOpen; + } + + if (result == DialogResult.None) + { + /// Save the result (once) + selectedImages = displayForm.SelectedImages; + result = displayForm.Result; + displayForm = null; + } + + if (result == DialogResult.OK) return Event.OK; + else if (result == DialogResult.Retry) return Event.Retry; + else if (result == DialogResult.Abort) return Event.Abort; + else return Event.None; /// Should never happen + } + + /// Stop this operation + public void Stop() + { + if (displayForm != null) + { + displayForm.CloseForm(this, null); + displayForm = null; + } + currentOp = CurrentOp.None; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Display/DisplayCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Display/DisplayCfg.cs new file mode 100644 index 00000000..e25e0372 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Display/DisplayCfg.cs @@ -0,0 +1,37 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Network.Camera.Display +{ + public class DisplayCfg : ComponentCfgBase, IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(DisplayCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new DisplayCfgCtrl(); } + + /// + /// Serialized parameters + /// + + + /// Private parameterless constructor invoked by all other (public) constructors + DisplayCfg() {} + + public DisplayCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}", Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Display/DisplayCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Display/DisplayCfgCtrl.cs new file mode 100644 index 00000000..75220a8d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Display/DisplayCfgCtrl.cs @@ -0,0 +1,80 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Network.Camera.Display +{ + public partial class DisplayCfgCtrl : UserControl, IComponentCfgCtrl + { + ComponentParametersDlg parent; + + public bool ShowMore { get { return false; } } + + DisplayCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as DisplayCfg; + Redraw(); + } + } + + public DisplayCfgCtrl() + { + InitializeComponent(); + } + + private void PumpCfgCtrl_Load(object sender, EventArgs e) + { + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + if (config.Name != nameTextBox.Text) + { + config.Name = nameTextBox.Text; + flags |= (CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + } + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Display/DisplayCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Display/DisplayCfgCtrl.designer.cs new file mode 100644 index 00000000..4c5ba67a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Display/DisplayCfgCtrl.designer.cs @@ -0,0 +1,109 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.Network.Camera.Display +{ + partial class DisplayCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(99, 34); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(174, 20); + this.nameTextBox.TabIndex = 1; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(13, 37); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 0; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(96, 11); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(114, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComponentClassName"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(-211, -147); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(57, 13); + this.label1.TabIndex = 5; + this.label1.Text = "Arguments"; + // + // textBox1 + // + this.textBox1.Enabled = false; + this.textBox1.Location = new System.Drawing.Point(-125, -150); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(372, 20); + this.textBox1.TabIndex = 6; + // + // DisplayCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.textBox1); + this.Controls.Add(this.label1); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "DisplayCfgCtrl"; + this.Size = new System.Drawing.Size(500, 300); + this.Load += new System.EventHandler(this.PumpCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox textBox1; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Display/DisplayCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Display/DisplayCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Display/DisplayCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Display/DisplayForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Display/DisplayForm.cs new file mode 100644 index 00000000..c2b23a17 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Display/DisplayForm.cs @@ -0,0 +1,197 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using log4net; +using TBF.Resources; +using System.Drawing; +using System.Text; + +namespace TBF.BenchControl.Network.Camera.Display +{ + public partial class DisplayForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(DisplayForm)); + + #region Closing this display from another thread + + /// + /// Called from the state machine when an operation forces a modeless dialog close. + /// + public void CloseForm(object sender, EventArgs args) + { + if (CloseFormHandler == null) return; + try { CloseFormHandler(sender, null); } + catch (Exception e) { log.Error("CloseFormHandler(...) failed", e); } + } + public event EventHandler CloseFormHandler; + + public void StartCloseFormHandler() + { + CloseFormHandler += delegate(object sender, EventArgs args) + { + if (InvokeRequired) { Invoke(new EventHandler(OnCloseForm), sender, args); } + else OnCloseForm(sender, args); + }; + } + + private void OnCloseForm(object sender, EventArgs args) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + + /// Number of text boxes for serial numbers + readonly string[] imageFileNames; + readonly int imagesCount; + + readonly GroupBox[] groupBoxes; + readonly PictureBox[] pictureBoxes; + readonly CheckBox[] checkBoxes; + readonly int boxesCount; + + Timer myTimer; + + + public bool[] SelectedImages; + public DialogResult Result; /// DialogResult.None OK Retry or Cancel + + + /// Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + /// + /// Constructor + /// + /// Number of text boxes for serial numbers + public DisplayForm(string[] imageFileNames, string title) + { + InitializeComponent(); + + this.imageFileNames = imageFileNames; + this.imagesCount = (imageFileNames == null) ? 0 : imageFileNames.Length; + + groupBoxes = new GroupBox[] { groupBox1, groupBox2, groupBox3, groupBox4, groupBox5, groupBox6, + groupBox7, groupBox8, groupBox9, groupBox10, groupBox11, groupBox12 }; + + pictureBoxes = new PictureBox[] { pictureBox1, pictureBox2, pictureBox3, pictureBox4, pictureBox5, pictureBox6, + pictureBox7, pictureBox8, pictureBox9, pictureBox10, pictureBox11, pictureBox12 }; + + checkBoxes = new CheckBox[] { checkBox1, checkBox2, checkBox3, checkBox4, checkBox5, checkBox6, + checkBox7, checkBox8, checkBox9, checkBox10, checkBox11, checkBox12 }; + + boxesCount = pictureBoxes.Length; + + Text = title; + + int lastVisibleGroupBoxIx = 0; + for (int i = 0; i < boxesCount; i++) + { + if (i < imagesCount && !string.IsNullOrEmpty(imageFileNames[i])) + { + groupBoxes[i].Text = string.Format("{0} {1}", Strings.Water_Meter, i + 1); + checkBoxes[i].Checked = true; + checkBoxes[i].Text = Strings.Retry; + lastVisibleGroupBoxIx = i; + } + else + { + groupBoxes[i].Visible = false; + checkBoxes[i].Checked = false; + } + } + + SelectedImages = new bool[imagesCount]; + + if (lastVisibleGroupBoxIx < 4) + Height = 321; + else if (lastVisibleGroupBoxIx < 8) + Height = 616; + + Result = DialogResult.None; + completed = false; + StartCloseFormHandler(); + } + + /// Parameterless constructor for all watermeters + public DisplayForm() + : this(null, string.Empty) + { + } + + private void CycleBeginningForm_Load(object sender, EventArgs e) + { + okButton.Text = Strings.OkBtnText; + retryButton.Text = Strings.Retry; + abortButton.Text = Strings.Abort; + + myTimer = new Timer(); + myTimer.Interval = (500); + myTimer.Tick += new EventHandler(MyTimer_Tick); + myTimer.Start(); + } + + private void MyTimer_Tick(object sender, EventArgs e) + { + for (int i = 0; i < Math.Min(imagesCount, boxesCount); i++) + { + if (imageFileNames[i] != null && System.IO.File.Exists(imageFileNames[i]) && + pictureBoxes[i] != null && pictureBoxes[i].Image == null) + { + pictureBoxes[i].Image = Image.FromFile(imageFileNames[i]); + checkBoxes[i].Checked = false; + } + } + } + + + private void okButton_Click(object sender, EventArgs e) + { + log.Warn("OK clicked"); + Result = DialogResult.OK; + CloseAfterButtonClick(); + } + + private void abortButton_Click(object sender, EventArgs e) + { + log.Warn("Abort clicked"); + Result = DialogResult.Abort; + CloseAfterButtonClick(); + } + + private void retryButton_Click(object sender, EventArgs e) + { + log.Warn("Retry clicked"); + Result = DialogResult.Retry; + CloseAfterButtonClick(); + } + + void CloseAfterButtonClick() + { + if (myTimer != null) myTimer.Stop(); + UpdateData(); + completed = true; + Close(); + } + + void UpdateData() + { + StringBuilder sb = new StringBuilder(); + + sb.Append("1 "); + for (int i = 0; i < Math.Min(imagesCount, boxesCount); i++) + { + SelectedImages[i] = checkBoxes[i].Checked; + sb.AppendFormat("{0}", checkBoxes[i].Checked ? "x" : "-"); + } + sb.AppendFormat(" {0}", Math.Min(imagesCount, boxesCount)); + + log.WarnFormat("Data updated: {0}", sb.ToString()); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Display/DisplayForm.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Display/DisplayForm.designer.cs new file mode 100644 index 00000000..06964f14 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Display/DisplayForm.designer.cs @@ -0,0 +1,483 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.Network.Camera.Display +{ + partial class DisplayForm + { + /// + /// 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(DisplayForm)); + this.okButton = new System.Windows.Forms.Button(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.checkBox1 = new System.Windows.Forms.CheckBox(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.checkBox2 = new System.Windows.Forms.CheckBox(); + this.pictureBox2 = new System.Windows.Forms.PictureBox(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.checkBox3 = new System.Windows.Forms.CheckBox(); + this.pictureBox3 = new System.Windows.Forms.PictureBox(); + this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.checkBox4 = new System.Windows.Forms.CheckBox(); + this.pictureBox4 = new System.Windows.Forms.PictureBox(); + this.retryButton = new System.Windows.Forms.Button(); + this.abortButton = new System.Windows.Forms.Button(); + this.groupBox5 = new System.Windows.Forms.GroupBox(); + this.checkBox5 = new System.Windows.Forms.CheckBox(); + this.pictureBox5 = new System.Windows.Forms.PictureBox(); + this.groupBox6 = new System.Windows.Forms.GroupBox(); + this.checkBox6 = new System.Windows.Forms.CheckBox(); + this.pictureBox6 = new System.Windows.Forms.PictureBox(); + this.groupBox7 = new System.Windows.Forms.GroupBox(); + this.checkBox7 = new System.Windows.Forms.CheckBox(); + this.pictureBox7 = new System.Windows.Forms.PictureBox(); + this.groupBox8 = new System.Windows.Forms.GroupBox(); + this.checkBox8 = new System.Windows.Forms.CheckBox(); + this.pictureBox8 = new System.Windows.Forms.PictureBox(); + this.groupBox9 = new System.Windows.Forms.GroupBox(); + this.checkBox9 = new System.Windows.Forms.CheckBox(); + this.pictureBox9 = new System.Windows.Forms.PictureBox(); + this.groupBox10 = new System.Windows.Forms.GroupBox(); + this.checkBox10 = new System.Windows.Forms.CheckBox(); + this.pictureBox10 = new System.Windows.Forms.PictureBox(); + this.groupBox11 = new System.Windows.Forms.GroupBox(); + this.checkBox11 = new System.Windows.Forms.CheckBox(); + this.pictureBox11 = new System.Windows.Forms.PictureBox(); + this.groupBox12 = new System.Windows.Forms.GroupBox(); + this.checkBox12 = new System.Windows.Forms.CheckBox(); + this.pictureBox12 = new System.Windows.Forms.PictureBox(); + this.groupBox1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.groupBox2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); + this.groupBox3.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit(); + this.groupBox4.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).BeginInit(); + this.groupBox5.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox5)).BeginInit(); + this.groupBox6.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox6)).BeginInit(); + this.groupBox7.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox7)).BeginInit(); + this.groupBox8.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox8)).BeginInit(); + this.groupBox9.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox9)).BeginInit(); + this.groupBox10.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox10)).BeginInit(); + this.groupBox11.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox11)).BeginInit(); + this.groupBox12.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox12)).BeginInit(); + this.SuspendLayout(); + // + // okButton + // + resources.ApplyResources(this.okButton, "okButton"); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Name = "okButton"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.checkBox1); + this.groupBox1.Controls.Add(this.pictureBox1); + resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.ForeColor = System.Drawing.Color.Black; + this.groupBox1.Name = "groupBox1"; + this.groupBox1.TabStop = false; + // + // checkBox1 + // + resources.ApplyResources(this.checkBox1, "checkBox1"); + this.checkBox1.Name = "checkBox1"; + this.checkBox1.UseVisualStyleBackColor = true; + // + // pictureBox1 + // + resources.ApplyResources(this.pictureBox1, "pictureBox1"); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.TabStop = false; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.checkBox2); + this.groupBox2.Controls.Add(this.pictureBox2); + resources.ApplyResources(this.groupBox2, "groupBox2"); + this.groupBox2.ForeColor = System.Drawing.Color.Black; + this.groupBox2.Name = "groupBox2"; + this.groupBox2.TabStop = false; + // + // checkBox2 + // + resources.ApplyResources(this.checkBox2, "checkBox2"); + this.checkBox2.Name = "checkBox2"; + this.checkBox2.UseVisualStyleBackColor = true; + // + // pictureBox2 + // + resources.ApplyResources(this.pictureBox2, "pictureBox2"); + this.pictureBox2.Name = "pictureBox2"; + this.pictureBox2.TabStop = false; + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.checkBox3); + this.groupBox3.Controls.Add(this.pictureBox3); + resources.ApplyResources(this.groupBox3, "groupBox3"); + this.groupBox3.ForeColor = System.Drawing.Color.Black; + this.groupBox3.Name = "groupBox3"; + this.groupBox3.TabStop = false; + // + // checkBox3 + // + resources.ApplyResources(this.checkBox3, "checkBox3"); + this.checkBox3.Name = "checkBox3"; + this.checkBox3.UseVisualStyleBackColor = true; + // + // pictureBox3 + // + resources.ApplyResources(this.pictureBox3, "pictureBox3"); + this.pictureBox3.Name = "pictureBox3"; + this.pictureBox3.TabStop = false; + // + // groupBox4 + // + this.groupBox4.Controls.Add(this.checkBox4); + this.groupBox4.Controls.Add(this.pictureBox4); + resources.ApplyResources(this.groupBox4, "groupBox4"); + this.groupBox4.ForeColor = System.Drawing.Color.Black; + this.groupBox4.Name = "groupBox4"; + this.groupBox4.TabStop = false; + // + // checkBox4 + // + resources.ApplyResources(this.checkBox4, "checkBox4"); + this.checkBox4.Name = "checkBox4"; + this.checkBox4.UseVisualStyleBackColor = true; + // + // pictureBox4 + // + resources.ApplyResources(this.pictureBox4, "pictureBox4"); + this.pictureBox4.Name = "pictureBox4"; + this.pictureBox4.TabStop = false; + // + // retryButton + // + resources.ApplyResources(this.retryButton, "retryButton"); + this.retryButton.ForeColor = System.Drawing.Color.Black; + this.retryButton.Name = "retryButton"; + this.retryButton.UseVisualStyleBackColor = true; + this.retryButton.Click += new System.EventHandler(this.retryButton_Click); + // + // abortButton + // + resources.ApplyResources(this.abortButton, "abortButton"); + this.abortButton.ForeColor = System.Drawing.Color.Black; + this.abortButton.Name = "abortButton"; + this.abortButton.UseVisualStyleBackColor = true; + this.abortButton.Click += new System.EventHandler(this.abortButton_Click); + // + // groupBox5 + // + this.groupBox5.Controls.Add(this.checkBox5); + this.groupBox5.Controls.Add(this.pictureBox5); + resources.ApplyResources(this.groupBox5, "groupBox5"); + this.groupBox5.ForeColor = System.Drawing.Color.Black; + this.groupBox5.Name = "groupBox5"; + this.groupBox5.TabStop = false; + // + // checkBox5 + // + resources.ApplyResources(this.checkBox5, "checkBox5"); + this.checkBox5.Name = "checkBox5"; + this.checkBox5.UseVisualStyleBackColor = true; + // + // pictureBox5 + // + resources.ApplyResources(this.pictureBox5, "pictureBox5"); + this.pictureBox5.Name = "pictureBox5"; + this.pictureBox5.TabStop = false; + // + // groupBox6 + // + this.groupBox6.Controls.Add(this.checkBox6); + this.groupBox6.Controls.Add(this.pictureBox6); + resources.ApplyResources(this.groupBox6, "groupBox6"); + this.groupBox6.ForeColor = System.Drawing.Color.Black; + this.groupBox6.Name = "groupBox6"; + this.groupBox6.TabStop = false; + // + // checkBox6 + // + resources.ApplyResources(this.checkBox6, "checkBox6"); + this.checkBox6.Name = "checkBox6"; + this.checkBox6.UseVisualStyleBackColor = true; + // + // pictureBox6 + // + resources.ApplyResources(this.pictureBox6, "pictureBox6"); + this.pictureBox6.Name = "pictureBox6"; + this.pictureBox6.TabStop = false; + // + // groupBox7 + // + this.groupBox7.Controls.Add(this.checkBox7); + this.groupBox7.Controls.Add(this.pictureBox7); + resources.ApplyResources(this.groupBox7, "groupBox7"); + this.groupBox7.ForeColor = System.Drawing.Color.Black; + this.groupBox7.Name = "groupBox7"; + this.groupBox7.TabStop = false; + // + // checkBox7 + // + resources.ApplyResources(this.checkBox7, "checkBox7"); + this.checkBox7.Name = "checkBox7"; + this.checkBox7.UseVisualStyleBackColor = true; + // + // pictureBox7 + // + resources.ApplyResources(this.pictureBox7, "pictureBox7"); + this.pictureBox7.Name = "pictureBox7"; + this.pictureBox7.TabStop = false; + // + // groupBox8 + // + this.groupBox8.Controls.Add(this.checkBox8); + this.groupBox8.Controls.Add(this.pictureBox8); + resources.ApplyResources(this.groupBox8, "groupBox8"); + this.groupBox8.ForeColor = System.Drawing.Color.Black; + this.groupBox8.Name = "groupBox8"; + this.groupBox8.TabStop = false; + // + // checkBox8 + // + resources.ApplyResources(this.checkBox8, "checkBox8"); + this.checkBox8.Name = "checkBox8"; + this.checkBox8.UseVisualStyleBackColor = true; + // + // pictureBox8 + // + resources.ApplyResources(this.pictureBox8, "pictureBox8"); + this.pictureBox8.Name = "pictureBox8"; + this.pictureBox8.TabStop = false; + // + // groupBox9 + // + this.groupBox9.Controls.Add(this.checkBox9); + this.groupBox9.Controls.Add(this.pictureBox9); + resources.ApplyResources(this.groupBox9, "groupBox9"); + this.groupBox9.ForeColor = System.Drawing.Color.Black; + this.groupBox9.Name = "groupBox9"; + this.groupBox9.TabStop = false; + // + // checkBox9 + // + resources.ApplyResources(this.checkBox9, "checkBox9"); + this.checkBox9.Name = "checkBox9"; + this.checkBox9.UseVisualStyleBackColor = true; + // + // pictureBox9 + // + resources.ApplyResources(this.pictureBox9, "pictureBox9"); + this.pictureBox9.Name = "pictureBox9"; + this.pictureBox9.TabStop = false; + // + // groupBox10 + // + this.groupBox10.Controls.Add(this.checkBox10); + this.groupBox10.Controls.Add(this.pictureBox10); + resources.ApplyResources(this.groupBox10, "groupBox10"); + this.groupBox10.ForeColor = System.Drawing.Color.Black; + this.groupBox10.Name = "groupBox10"; + this.groupBox10.TabStop = false; + // + // checkBox10 + // + resources.ApplyResources(this.checkBox10, "checkBox10"); + this.checkBox10.Name = "checkBox10"; + this.checkBox10.UseVisualStyleBackColor = true; + // + // pictureBox10 + // + resources.ApplyResources(this.pictureBox10, "pictureBox10"); + this.pictureBox10.Name = "pictureBox10"; + this.pictureBox10.TabStop = false; + // + // groupBox11 + // + this.groupBox11.Controls.Add(this.checkBox11); + this.groupBox11.Controls.Add(this.pictureBox11); + resources.ApplyResources(this.groupBox11, "groupBox11"); + this.groupBox11.ForeColor = System.Drawing.Color.Black; + this.groupBox11.Name = "groupBox11"; + this.groupBox11.TabStop = false; + // + // checkBox11 + // + resources.ApplyResources(this.checkBox11, "checkBox11"); + this.checkBox11.Name = "checkBox11"; + this.checkBox11.UseVisualStyleBackColor = true; + // + // pictureBox11 + // + resources.ApplyResources(this.pictureBox11, "pictureBox11"); + this.pictureBox11.Name = "pictureBox11"; + this.pictureBox11.TabStop = false; + // + // groupBox12 + // + this.groupBox12.Controls.Add(this.checkBox12); + this.groupBox12.Controls.Add(this.pictureBox12); + resources.ApplyResources(this.groupBox12, "groupBox12"); + this.groupBox12.ForeColor = System.Drawing.Color.Black; + this.groupBox12.Name = "groupBox12"; + this.groupBox12.TabStop = false; + // + // checkBox12 + // + resources.ApplyResources(this.checkBox12, "checkBox12"); + this.checkBox12.Name = "checkBox12"; + this.checkBox12.UseVisualStyleBackColor = true; + // + // pictureBox12 + // + resources.ApplyResources(this.pictureBox12, "pictureBox12"); + this.pictureBox12.Name = "pictureBox12"; + this.pictureBox12.TabStop = false; + // + // DisplayForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGray; + this.Controls.Add(this.groupBox12); + this.Controls.Add(this.groupBox11); + this.Controls.Add(this.groupBox10); + this.Controls.Add(this.groupBox9); + this.Controls.Add(this.groupBox8); + this.Controls.Add(this.groupBox7); + this.Controls.Add(this.groupBox6); + this.Controls.Add(this.groupBox5); + this.Controls.Add(this.abortButton); + this.Controls.Add(this.retryButton); + this.Controls.Add(this.groupBox4); + this.Controls.Add(this.groupBox3); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.okButton); + this.ForeColor = System.Drawing.Color.Black; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "DisplayForm"; + this.TopMost = true; + this.Load += new System.EventHandler(this.CycleBeginningForm_Load); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit(); + this.groupBox4.ResumeLayout(false); + this.groupBox4.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).EndInit(); + this.groupBox5.ResumeLayout(false); + this.groupBox5.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox5)).EndInit(); + this.groupBox6.ResumeLayout(false); + this.groupBox6.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox6)).EndInit(); + this.groupBox7.ResumeLayout(false); + this.groupBox7.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox7)).EndInit(); + this.groupBox8.ResumeLayout(false); + this.groupBox8.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox8)).EndInit(); + this.groupBox9.ResumeLayout(false); + this.groupBox9.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox9)).EndInit(); + this.groupBox10.ResumeLayout(false); + this.groupBox10.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox10)).EndInit(); + this.groupBox11.ResumeLayout(false); + this.groupBox11.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox11)).EndInit(); + this.groupBox12.ResumeLayout(false); + this.groupBox12.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox12)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.GroupBox groupBox4; + private System.Windows.Forms.Button retryButton; + private System.Windows.Forms.Button abortButton; + 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.GroupBox groupBox5; + private System.Windows.Forms.PictureBox pictureBox5; + private System.Windows.Forms.GroupBox groupBox6; + private System.Windows.Forms.PictureBox pictureBox6; + private System.Windows.Forms.CheckBox checkBox1; + private System.Windows.Forms.CheckBox checkBox2; + private System.Windows.Forms.CheckBox checkBox3; + private System.Windows.Forms.CheckBox checkBox4; + private System.Windows.Forms.CheckBox checkBox5; + private System.Windows.Forms.CheckBox checkBox6; + private System.Windows.Forms.GroupBox groupBox7; + private System.Windows.Forms.CheckBox checkBox7; + private System.Windows.Forms.PictureBox pictureBox7; + private System.Windows.Forms.GroupBox groupBox8; + private System.Windows.Forms.CheckBox checkBox8; + private System.Windows.Forms.PictureBox pictureBox8; + private System.Windows.Forms.GroupBox groupBox9; + private System.Windows.Forms.CheckBox checkBox9; + private System.Windows.Forms.PictureBox pictureBox9; + private System.Windows.Forms.GroupBox groupBox10; + private System.Windows.Forms.CheckBox checkBox10; + private System.Windows.Forms.PictureBox pictureBox10; + private System.Windows.Forms.GroupBox groupBox11; + private System.Windows.Forms.CheckBox checkBox11; + private System.Windows.Forms.PictureBox pictureBox11; + private System.Windows.Forms.GroupBox groupBox12; + private System.Windows.Forms.CheckBox checkBox12; + private System.Windows.Forms.PictureBox pictureBox12; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Display/DisplayForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Display/DisplayForm.resx new file mode 100644 index 00000000..ba2bd54b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Display/DisplayForm.resx @@ -0,0 +1,1386 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + Top, Right + + + + Verdana, 14.25pt + + + 1371, 12 + + + 102, 58 + + + + 7 + + + OK + + + okButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 14 + + + Top, Right + + + True + + + MiddleRight + + + Verdana, 12pt + + + 257, 19 + + + 70, 22 + + + 1 + + + Retry + + + MiddleRight + + + checkBox1 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + 7, 45 + + + 320, 240 + + + StretchImage + + + 0 + + + pictureBox1 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + Verdana, 14.25pt + + + 3, 1 + + + 335, 293 + + + 1 + + + Watermeter 1 + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 13 + + + Top, Right + + + True + + + MiddleRight + + + Verdana, 12pt + + + NoControl + + + 257, 19 + + + 70, 22 + + + 2 + + + Retry + + + MiddleRight + + + checkBox2 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 + + + NoControl + + + 7, 45 + + + 320, 240 + + + StretchImage + + + 1 + + + pictureBox2 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 1 + + + Verdana, 14.25pt + + + 344, 1 + + + 335, 293 + + + 2 + + + Watermeter 2 + + + groupBox2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 12 + + + Top, Right + + + True + + + MiddleRight + + + Verdana, 12pt + + + NoControl + + + 257, 19 + + + 70, 22 + + + 4 + + + Retry + + + MiddleRight + + + checkBox3 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox3 + + + 0 + + + NoControl + + + 7, 45 + + + 320, 240 + + + StretchImage + + + 3 + + + pictureBox3 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox3 + + + 1 + + + Verdana, 14.25pt + + + 685, 1 + + + 335, 293 + + + 3 + + + Watermeter 3 + + + groupBox3 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 11 + + + Top, Right + + + True + + + MiddleRight + + + Verdana, 12pt + + + NoControl + + + 257, 19 + + + 70, 22 + + + 3 + + + Retry + + + MiddleRight + + + checkBox4 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox4 + + + 0 + + + NoControl + + + 7, 45 + + + 320, 240 + + + StretchImage + + + 1 + + + pictureBox4 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox4 + + + 1 + + + Verdana, 14.25pt + + + 1026, 1 + + + 335, 293 + + + 4 + + + Watermeter 4 + + + groupBox4 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 10 + + + Top, Right + + + Verdana, 14.25pt + + + NoControl + + + 1371, 89 + + + 102, 58 + + + 8 + + + Retry + + + retryButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 9 + + + Top, Right + + + Verdana, 14.25pt + + + NoControl + + + 1371, 166 + + + 102, 58 + + + 9 + + + Abort + + + abortButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 8 + + + Top, Right + + + True + + + MiddleRight + + + Verdana, 12pt + + + NoControl + + + 257, 19 + + + 70, 22 + + + 3 + + + Retry + + + MiddleRight + + + checkBox5 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox5 + + + 0 + + + NoControl + + + 7, 45 + + + 320, 240 + + + StretchImage + + + 1 + + + pictureBox5 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox5 + + + 1 + + + Verdana, 14.25pt + + + 3, 296 + + + 335, 293 + + + 10 + + + Watermeter 5 + + + groupBox5 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 7 + + + Top, Right + + + True + + + MiddleRight + + + Verdana, 12pt + + + NoControl + + + 257, 19 + + + 70, 22 + + + 3 + + + Retry + + + MiddleRight + + + checkBox6 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox6 + + + 0 + + + NoControl + + + 7, 45 + + + 320, 240 + + + StretchImage + + + 1 + + + pictureBox6 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox6 + + + 1 + + + Verdana, 14.25pt + + + 344, 296 + + + 335, 293 + + + 11 + + + Watermeter 6 + + + groupBox6 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 6 + + + Top, Right + + + True + + + MiddleRight + + + Verdana, 12pt + + + NoControl + + + 257, 19 + + + 70, 22 + + + 3 + + + Retry + + + MiddleRight + + + checkBox7 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox7 + + + 0 + + + NoControl + + + 7, 45 + + + 320, 240 + + + StretchImage + + + 1 + + + pictureBox7 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox7 + + + 1 + + + Verdana, 14.25pt + + + 685, 297 + + + 335, 293 + + + 12 + + + Watermeter 7 + + + groupBox7 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 5 + + + Top, Right + + + True + + + MiddleRight + + + Verdana, 12pt + + + NoControl + + + 257, 19 + + + 70, 22 + + + 3 + + + Retry + + + MiddleRight + + + checkBox8 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox8 + + + 0 + + + NoControl + + + 7, 45 + + + 320, 240 + + + StretchImage + + + 1 + + + pictureBox8 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox8 + + + 1 + + + Verdana, 14.25pt + + + 1026, 297 + + + 335, 293 + + + 13 + + + Watermeter 8 + + + groupBox8 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + + + Top, Right + + + True + + + MiddleRight + + + Verdana, 12pt + + + NoControl + + + 257, 19 + + + 70, 22 + + + 3 + + + Retry + + + MiddleRight + + + checkBox9 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox9 + + + 0 + + + NoControl + + + 7, 45 + + + 320, 240 + + + StretchImage + + + 1 + + + pictureBox9 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox9 + + + 1 + + + Verdana, 14.25pt + + + 3, 591 + + + 335, 293 + + + 14 + + + Watermeter 9 + + + groupBox9 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + Top, Right + + + True + + + MiddleRight + + + Verdana, 12pt + + + NoControl + + + 257, 19 + + + 70, 22 + + + 3 + + + Retry + + + MiddleRight + + + checkBox10 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox10 + + + 0 + + + NoControl + + + 7, 45 + + + 320, 240 + + + StretchImage + + + 1 + + + pictureBox10 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox10 + + + 1 + + + Verdana, 14.25pt + + + 344, 591 + + + 335, 293 + + + 15 + + + Watermeter 10 + + + groupBox10 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + Top, Right + + + True + + + MiddleRight + + + Verdana, 12pt + + + NoControl + + + 257, 19 + + + 70, 22 + + + 3 + + + Retry + + + MiddleRight + + + checkBox11 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox11 + + + 0 + + + NoControl + + + 7, 45 + + + 320, 240 + + + StretchImage + + + 1 + + + pictureBox11 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox11 + + + 1 + + + Verdana, 14.25pt + + + 685, 591 + + + 335, 293 + + + 16 + + + Watermeter 11 + + + groupBox11 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + Top, Right + + + True + + + MiddleRight + + + Verdana, 12pt + + + NoControl + + + 257, 19 + + + 70, 22 + + + 3 + + + Retry + + + MiddleRight + + + checkBox12 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox12 + + + 0 + + + NoControl + + + 7, 45 + + + 320, 240 + + + StretchImage + + + 1 + + + pictureBox12 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox12 + + + 1 + + + Verdana, 14.25pt + + + 1026, 591 + + + 335, 293 + + + 17 + + + Watermeter 12 + + + groupBox12 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + + + 6, 13 + + + True + + + 1483, 887 + + + NoControl + + + DisplayForm + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Display/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Display/Factory.cs new file mode 100644 index 00000000..49b65faf --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Display/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Network.Camera.Display +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Display.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Display(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Display(cfg, components); } + + public IComponentCfg DefaultConfig() { return new DisplayCfg(this.GetType().Namespace.Substring(17), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(DisplayCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Roi/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Roi/Factory.cs new file mode 100644 index 00000000..4d308613 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Roi/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Network.Camera.Roi +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Roi.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Roi(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Roi(cfg, components); } + + public IComponentCfg DefaultConfig() { return new RoiCfg(this.GetType().Namespace.Substring(17), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(RoiCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Roi/ProcedureParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Roi/ProcedureParams.cs new file mode 100644 index 00000000..aa70a78a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Roi/ProcedureParams.cs @@ -0,0 +1,148 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.Network.Camera.Roi +{ + public class ProcedureParams : ProcedureParamsBase, IParamsProvider, IProcedureParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcedureParams) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public double PulsesPerLtr; /// [l^-1] + public int DetectionImagesCount; + public int DetectionPeriod1; + public int DetectionPeriod2; + public string RoiParams; + + public override void InitializeAll() + { + PulsesPerLtr = 1.0; + DetectionImagesCount = 10; + DetectionPeriod1 = 1; + DetectionPeriod2 = 19; + RoiParams = "160 160 79 79 20 79 0 0 360 360 1 50 0 0 50 0"; + } + + string[] paramNames = new string[] + { + Strings.PulsesPerLtr, + "Images count", + "Period1", + "Period2", + "Parameters" + }; + public override string ParamName(int i) { return paramNames[i]; } + public override int ParamsCount() { return paramNames.Length; } + + public override string ToString(int i) + { + switch (i) + { + case 0: return PulsesPerLtr.ToString(); + case 1: return DetectionImagesCount.ToString(); + case 2: return DetectionPeriod1.ToString(); + case 3: return DetectionPeriod2.ToString(); + case 4: return RoiParams; + default: return string.Empty; + } + } + + /// Retrieves parameters from UI controls + public CfgUpdateFlags UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: PulsesPerLtr = Utils.ParseUDouble(strValue); return CfgUpdateFlags.None; + case 1: DetectionImagesCount = int.Parse(strValue); return CfgUpdateFlags.None; + case 2: DetectionPeriod1 = int.Parse(strValue); return CfgUpdateFlags.None; + case 3: DetectionPeriod2 = int.Parse(strValue); return CfgUpdateFlags.None; + case 4: RoiParams = strValue; return CfgUpdateFlags.None; + default: return CfgUpdateFlags.None; + } + } + + /// Verifies whether strings in UI controls represent valid parameters + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + + double dummy; + int idummy; + switch (i) + { + case 0: + if (Utils.TryParseUDouble(strValue, out dummy)) return true; + break; + case 1: + case 2: + case 3: + if (int.TryParse(strValue, out idummy) && idummy >= 1 && idummy <= 50) return true; + break; + case 4: + return true; + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(ProcedureParams prms) + { + prms.PulsesPerLtr = this.PulsesPerLtr; + prms.DetectionImagesCount = this.DetectionImagesCount; + prms.DetectionPeriod1 = this.DetectionPeriod1; + prms.DetectionPeriod2 = this.DetectionPeriod2; + prms.RoiParams = this.RoiParams; + } + + public IParamsProvider Clone() + { + ProcedureParams pars = new ProcedureParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateFromDbEntity(ComponentProcedure dbEntity) + { + if (dbEntity == null) return; + try + { + ProcedureParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcedureParams; + + procedureParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + procedure = dbEntity.Procedure; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + public ProcedureParams() { } + + public ProcedureParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public ProcedureParams(ComponentProcedure procedureParamsEntity, string componentName, Procedure procedure) + { + this.procedureParamsEntity = procedureParamsEntity; + this.componentName = componentName; + this.procedure = procedure; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Roi/Roi.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Roi/Roi.cs new file mode 100644 index 00000000..c3466184 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Roi/Roi.cs @@ -0,0 +1,261 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using log4net; +using Config.Entities; + +namespace TBF.BenchControl.Network.Camera.Roi +{ + public class Roi : ComponentBase, GenericDevices.IRoi, IOperation + { + /// TODO: Implement support for sharing one camera by multiple ROI-s + + private static readonly ILog log = LogManager.GetLogger(typeof(Roi)); + public override string ToString() + { + return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); + } + + /// + /// Cfg + /// + public readonly RoiCfg RoiCfg; + + public readonly CLP1611.Camera NetCamera; + public readonly Roi PreviousRoi; + + /// + /// ICamera interface functions + /// + public GenericDevices.ICamera Camera { get { return NetCamera as GenericDevices.ICamera; } } + + public Config.Entities.RegisterReaderType RegisterReaderType { get { return Config.Entities.RegisterReaderType.Camera; } } + public double PulsesPerLtr { get { return RoiCfg.ProcParams.PulsesPerLtr; } } + public double LtrsPerPulse { get { return (PulsesPerLtr <= float.Epsilon) ? 1.0 : (1 / PulsesPerLtr); } } + + int cameraPulses; + int pulsesDelta; /// = (WMPulses - cameraPulses) ... WMPulses = cameraPulses + pulsesDelta, Clear() calculates pulsesDelta + public int WMPulses { get { return cameraPulses + pulsesDelta; } } + + long cameraTime; + long timeDelta; /// = (WMTestTime - cameraTime) ... WMTestTime = cameraTime + timeDelta, Clear() calculates timeDelta + public double WMTestTime { get { return (cameraTime + timeDelta) / 1000.0; } } + + int wmRefPulses; + public int WMRefPulses { get { return wmRefPulses; } } + + public double WMVolume { get { return LtrsPerPulse * (double)WMPulses; } } + + public double BeginWMState { get { return 0; } } /// Always 0 + public double EndWMState { get { return WMVolume; } } /// Derived from WMVolume + + + double volumeStart; + public double VolumeStart { get { return volumeStart; } } /// in l + + double volumeEnd; + public double VolumeEnd { get { return volumeEnd; } } /// in l + + double timestampStart; + public double TimestampStart { get { return timestampStart; } } /// in s + + double timestampEnd; + public double TimestampEnd { get { return timestampEnd; } } /// in s + + /// + /// Roi specific + /// + public bool Detected { get { return detected; } } + bool detected; + /// + public Boxes.IntBox RoiX; + public Boxes.IntBox RoiY; + public Boxes.IntBox RoiWid; + public Boxes.IntBox RoiHgh; + /// + public void ClearRoi() + { + detected = false; + } + /// + public void SetRoi(int x, int y, int wid, int hgh) + { + RoiX.Val = x; + RoiY.Val = y; + RoiWid.Val = wid; + RoiHgh.Val = hgh; + detected = true; + } + /// + public string ImageFileNamePrefix { get { return imgFileNamePrefix; } } + string imgFileNamePrefix; + /// + private int roiHandle; + /// + public void RegisterRoiToCamera() + { + if (RoiCfg.DebugLevel == DebugMode.Simulate) + { + roiHandle = Camera.RegisterRoi(string.Format("-roi 1 300 200 134 134 66 66 20 66 0 0 360 360 1 50 0 0 270 0 bkgnd.bmp")); + } + else + { + roiHandle = Camera.RegisterRoi(string.Format("-roi 1 {0} {1} {2} bkgnd.bmp", RoiX.Val, RoiY.Val, RoiCfg.RoiParams)); + } + } + + + + public Roi() + { + } + + public Roi(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + RoiCfg = cfg as RoiCfg; + NetCamera = TbfComponents.FindComponent(cfg.ParentName, components) as CLP1611.Camera; + + PreviousRoi = TbfComponents.FindComponent(RoiCfg.PreviousRoi, components) as Roi; + + detected = false; + RoiX = new Boxes.IntBox(); + RoiY = new Boxes.IntBox(); + RoiWid = new Boxes.IntBox(); + RoiHgh = new Boxes.IntBox(); + + Clear(); + + //StartChangeHandler(); /// already done in StateMachine.InitializeBoardEtc(...) + + log.Debug(this.ToString()); + } + + + #region Configuration Change Handling + + public static void OnCfgChange(object sender, CfgChangeArgs args) + { + if (CfgChangeHandler == null) return; + try { CfgChangeHandler(sender, args); } + catch (Exception e) { log.Error("CfgChangeHandler(...) failed", e); } + } + + public static event EventHandler CfgChangeHandler; + + public override void StartChangeHandler() + { + CfgChangeHandler += delegate(object sender, CfgChangeArgs args) + { + RoiCfg tmpcfg = args.Cfg as RoiCfg; + if (tmpcfg != null && tmpcfg.Name.Equals(Name)) + { + if (args.Command == CfgChangeCmd.CfgChange) + { + RoiCfg.LoadImages = tmpcfg.LoadImages; + RoiCfg.SaveImages = tmpcfg.SaveImages; + } + } + }; + } + + #endregion Configuration Change Handling + + public void Clear() + { + pulsesDelta = -cameraPulses; + timeDelta = -cameraTime; + wmRefPulses = 0; + } + + public void TestCompleted() { } + + + public IOperation RoiDetectionOp() + { + if (NetCamera != null && RoiCfg.DebugLevel != DebugMode.Simulate) + { + imgFileNamePrefix = Path.Combine(Program.TempImagesDir, string.Format("t{0}-{1}-", StateMachine.Time, RoiCfg.Name)); + return new RoiDetectionOp(this, NetCamera, imgFileNamePrefix, RoiX, RoiY, RoiWid, RoiHgh); + } + else + { + return null; /// When NetCamera == null or ROI is in simulation mode + } + } + + + public IOperation GrabImageOp(string imageFileName, bool blackAndWhite, bool lowResolution, ImageRotation imageRotation) + { + if (NetCamera != null) + { + /// TODO: Implement support for sharing one camera by multiple ROI-s + return NetCamera.GrabImagesOp(new string[] { imageFileName }, blackAndWhite, lowResolution, imageRotation); + } + else + return null; + } + + + public IOperation GrabImageOp(string imageFileName) + { + if (NetCamera != null) + { + /// TODO: Implement support for sharing one camera by multiple ROI-s + return NetCamera.GrabImagesOp(new string[] { imageFileName }, false, true, ImageRotation.None); + } + else + return null; + } + + + /// + /// Updates wmPulses, caled from 'Start' and 'Run' functions of 'ReadRegisterOp' + /// + void UdatePulses() + { + if (detected && roiHandle != 0) + { + cameraPulses = NetCamera.GetResult(roiHandle, out cameraTime); + } + + wmRefPulses = StateMachine.ControlBoard.EtPulses(0); + } + + /// + /// Note: Measurement operations of cameras should preceeede ReadRegister operations of ROI-s + /// + public IOperation ReadRegisterOp() + { + return this; + } + + /// Start this operation + public void Start() + { + UdatePulses(); + Clear(); + volumeStart = WMVolume; + timestampStart = WMTestTime; + } + + /// Run this operation + /// eventDone + public Event Run() + { + UdatePulses(); + volumeEnd = WMVolume; + timestampEnd = WMTestTime; + return Event.ReadRegisterDone; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Roi/RoiCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Roi/RoiCfg.cs new file mode 100644 index 00000000..e9ee0385 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Roi/RoiCfg.cs @@ -0,0 +1,62 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Network.Camera.Roi +{ + public class RoiCfg : ComponentCfgBase, IChildComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(RoiCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new RoiCfgCtrl(); } + + /// + /// Serialized parameters + /// + public string PreviousRoi; + + [XmlIgnore] + public bool LoadImages; + + [XmlIgnore] + public bool SaveImages; + + /// Procedure parameters + [XmlIgnore] + public ProcedureParams ProcParams; + public override IParamsProvider GetRuntimeProcParamsProvider() { return ProcParams; } + public override IParamsProvider CreateProcParamsProvider() { return new ProcedureParams(true); } + + public int DetectionImagesCount { get { return ProcParams.DetectionImagesCount; } } + public int DetectionPeriod1 { get { return ProcParams.DetectionPeriod1; } } + public int DetectionPeriod2 { get { return ProcParams.DetectionPeriod2; } } + public string RoiParams { get { return ProcParams.RoiParams; } } + + + /// Private parameterless constructor invoked by all other (public) constructors + RoiCfg() + { + ProcParams = new ProcedureParams(true); + } + + public RoiCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + Factory = factory; + ParentName = "Camera"; + DebugLevel = DebugMode.Inherit; + } + + public string ToString(int i) + { + return string.Format("{0} ({1}) PreviousRoi={2} {3}", Name, ParentName, + string.IsNullOrEmpty(PreviousRoi) ? "---" : PreviousRoi, + (LoadImages ? " load images" : (SaveImages ? " save images" : ""))); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Roi/RoiCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Roi/RoiCfgCtrl.cs new file mode 100644 index 00000000..eea72b0f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Roi/RoiCfgCtrl.cs @@ -0,0 +1,144 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Network.Camera.Roi +{ + public partial class RoiCfgCtrl : UserControl, IComponentCfgCtrl + { + ComponentParametersDlg parent; + + public bool ShowMore { get { return false; } } + + RoiCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as RoiCfg; + Redraw(); + } + } + + public RoiCfgCtrl() + { + InitializeComponent(); + } + + private void PumpCfgCtrl_Load(object sender, EventArgs e) + { + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + + previousRoiComboBox.Items.Add("---"); + if (parent.TbfComponents != null) + { + foreach (var cmpnt in parent.TbfComponents) + { + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is TBF.BenchControl.Network.Camera.CLP1611.Factory) + { + parentNameComboBox.Items.Add(cmpnt.Name); + } + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is TBF.BenchControl.Network.Camera.Roi.Factory) + { + previousRoiComboBox.Items.Add(cmpnt.Name); + } + } + } + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + parentNameComboBox.Text = string.IsNullOrEmpty(config.ParentName) ? "---" : config.ParentName; + previousRoiComboBox.Text = string.IsNullOrEmpty(config.PreviousRoi) ? "---" : config.PreviousRoi; + loadImagesCheckBox.Checked = config.LoadImages; + saveImagesCheckBox.Checked = config.SaveImages; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + parentNameComboBox.Enabled = true; + previousRoiComboBox.Enabled = true; + loadImagesCheckBox.Enabled = true; + saveImagesCheckBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (!parentNameComboBox.Items.Contains(parentNameComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Parent Name'"; + } + + if (!previousRoiComboBox.Items.Contains(previousRoiComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Previous RoI'"; + } + + if (loadImagesCheckBox.Checked && saveImagesCheckBox.Checked) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Images cannot be Loaded and Saved at the same time"; + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + string newParentName = parentNameComboBox.Text.Equals("---") ? string.Empty : parentNameComboBox.Text; + string newPreviousRoi = previousRoiComboBox.Text.Equals("---") ? string.Empty : previousRoiComboBox.Text; + + if (config.Name != nameTextBox.Text || + config.ParentName != newParentName || + config.PreviousRoi != newPreviousRoi) + { + config.Name = nameTextBox.Text; + config.ParentName = newParentName; + config.PreviousRoi = newPreviousRoi; + + flags |= (CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + } + + if (config.LoadImages != loadImagesCheckBox.Checked || + config.SaveImages != saveImagesCheckBox.Checked) + { + config.LoadImages = loadImagesCheckBox.Checked; + config.SaveImages = saveImagesCheckBox.Checked; + + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.VolatileChange); + } + + if ((flags & CfgUpdateFlags.InvokeCfgChange) != 0) + { + Roi.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.CfgChange, config)); + } + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Roi/RoiCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Roi/RoiCfgCtrl.designer.cs new file mode 100644 index 00000000..b7895665 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Roi/RoiCfgCtrl.designer.cs @@ -0,0 +1,210 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.Network.Camera.Roi +{ + partial class RoiCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.parentNameLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.parentNameComboBox = new System.Windows.Forms.ComboBox(); + this.label1 = new System.Windows.Forms.Label(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.previousRoiComboBox = new System.Windows.Forms.ComboBox(); + this.previousRoiLabel = new System.Windows.Forms.Label(); + this.helpLabel1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.loadImagesCheckBox = new System.Windows.Forms.CheckBox(); + this.saveImagesCheckBox = new System.Windows.Forms.CheckBox(); + this.SuspendLayout(); + // + // parentNameLabel + // + this.parentNameLabel.AutoSize = true; + this.parentNameLabel.Location = new System.Drawing.Point(13, 60); + this.parentNameLabel.Name = "parentNameLabel"; + this.parentNameLabel.Size = new System.Drawing.Size(69, 13); + this.parentNameLabel.TabIndex = 3; + this.parentNameLabel.Text = "Parent Name"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(99, 34); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(174, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(13, 37); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(96, 11); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(114, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComponentClassName"; + // + // parentNameComboBox + // + this.parentNameComboBox.Enabled = false; + this.parentNameComboBox.FormattingEnabled = true; + this.parentNameComboBox.Location = new System.Drawing.Point(99, 57); + this.parentNameComboBox.Name = "parentNameComboBox"; + this.parentNameComboBox.Size = new System.Drawing.Size(174, 21); + this.parentNameComboBox.TabIndex = 4; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(-211, -147); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(57, 13); + this.label1.TabIndex = 5; + this.label1.Text = "Arguments"; + // + // textBox1 + // + this.textBox1.Enabled = false; + this.textBox1.Location = new System.Drawing.Point(-125, -150); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(372, 20); + this.textBox1.TabIndex = 6; + // + // previousRoiComboBox + // + this.previousRoiComboBox.Enabled = false; + this.previousRoiComboBox.FormattingEnabled = true; + this.previousRoiComboBox.Location = new System.Drawing.Point(99, 81); + this.previousRoiComboBox.Name = "previousRoiComboBox"; + this.previousRoiComboBox.Size = new System.Drawing.Size(174, 21); + this.previousRoiComboBox.TabIndex = 6; + // + // previousRoiLabel + // + this.previousRoiLabel.AutoSize = true; + this.previousRoiLabel.Location = new System.Drawing.Point(13, 84); + this.previousRoiLabel.Name = "previousRoiLabel"; + this.previousRoiLabel.Size = new System.Drawing.Size(68, 13); + this.previousRoiLabel.TabIndex = 5; + this.previousRoiLabel.Text = "Previous RoI"; + // + // helpLabel1 + // + this.helpLabel1.AutoSize = true; + this.helpLabel1.Location = new System.Drawing.Point(38, 186); + this.helpLabel1.Name = "helpLabel1"; + this.helpLabel1.Size = new System.Drawing.Size(379, 13); + this.helpLabel1.TabIndex = 2; + this.helpLabel1.Text = "roiWid roiHgh cx cy innerR outerR R3 ang1 ang2 fullAngle teethCount ..." + + ""; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(68, 204); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(350, 13); + this.label2.TabIndex = 3; + this.label2.Text = "... angSpeed( - ccw +cw) initSpeed minMvmt maxFwdMvmt bkgndCorr"; + // + // loadImagesCheckBox + // + this.loadImagesCheckBox.AutoSize = true; + this.loadImagesCheckBox.Enabled = false; + this.loadImagesCheckBox.Location = new System.Drawing.Point(99, 117); + this.loadImagesCheckBox.Name = "loadImagesCheckBox"; + this.loadImagesCheckBox.Size = new System.Drawing.Size(112, 17); + this.loadImagesCheckBox.TabIndex = 6; + this.loadImagesCheckBox.Text = "Load images (test)"; + this.loadImagesCheckBox.UseVisualStyleBackColor = true; + // + // saveImagesCheckBox + // + this.saveImagesCheckBox.AutoSize = true; + this.saveImagesCheckBox.Enabled = false; + this.saveImagesCheckBox.Location = new System.Drawing.Point(99, 140); + this.saveImagesCheckBox.Name = "saveImagesCheckBox"; + this.saveImagesCheckBox.Size = new System.Drawing.Size(132, 17); + this.saveImagesCheckBox.TabIndex = 7; + this.saveImagesCheckBox.Text = "Save images (analyze)"; + this.saveImagesCheckBox.UseVisualStyleBackColor = true; + // + // RoiCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.helpLabel1); + this.Controls.Add(this.saveImagesCheckBox); + this.Controls.Add(this.label2); + this.Controls.Add(this.previousRoiComboBox); + this.Controls.Add(this.previousRoiLabel); + this.Controls.Add(this.loadImagesCheckBox); + this.Controls.Add(this.parentNameComboBox); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.label1); + this.Controls.Add(this.parentNameLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "RoiCfgCtrl"; + this.Size = new System.Drawing.Size(500, 300); + this.Load += new System.EventHandler(this.PumpCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label parentNameLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.ComboBox parentNameComboBox; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.ComboBox previousRoiComboBox; + private System.Windows.Forms.Label previousRoiLabel; + private System.Windows.Forms.Label helpLabel1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.CheckBox loadImagesCheckBox; + private System.Windows.Forms.CheckBox saveImagesCheckBox; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Roi/RoiCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Roi/RoiCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Roi/RoiCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Roi/RoiDetectionOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Roi/RoiDetectionOp.cs new file mode 100644 index 00000000..8b90c730 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/Roi/RoiDetectionOp.cs @@ -0,0 +1,209 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using log4net; +using TBF.BenchControl.Network.Telnet; + +namespace TBF.BenchControl.Network.Camera.Roi +{ + public class RoiDetectionOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(RoiDetectionOp)); + public override string ToString() { return string.Format("RoiDetectionOp()"); } + + + readonly Roi roi; + readonly RoiCfg roiCfg; + readonly CLP1611.Camera camera; + readonly Telnet.TelnetClient telnet; + readonly string imgFileNamePrefix; + + string command; + bool roiDetectionCommandSent; + bool transferringDetectedImage; + + string response; + bool passed; + bool failed; + bool previousFailed; + + Boxes.IntBox roiX; + Boxes.IntBox roiY; + Boxes.IntBox roiWid; + Boxes.IntBox roiHgh; /// Wid and Hgh are usefull when masking + + + /// + /// Events: Event.None or Event.Error + /// + /// CLP1611.Camera reference + public RoiDetectionOp(Roi roi, CLP1611.Camera camera, string imgFileNamePrefix, + Boxes.IntBox roiX, Boxes.IntBox roiY, + Boxes.IntBox roiWid, Boxes.IntBox roiHgh) + { + this.roi = roi; + this.roiCfg = roi.RoiCfg; + this.camera = camera; + this.telnet = camera.Telnet; + this.imgFileNamePrefix = imgFileNamePrefix; + this.roiX = roiX; + this.roiY = roiY; + this.roiWid = roiWid; + this.roiHgh = roiHgh; + + roiDetectionCommandSent = false; + transferringDetectedImage = false; + + telnet.promptReceivedHandler += delegate(object sndr, PromptReceivedEventArgs a) + { + OnPromptReceived(sndr, a); + }; + } + + void OnPromptReceived(object sndr, PromptReceivedEventArgs a) + { + response = a.Response; + } + + public void Start() + { + roiDetectionCommandSent = false; + transferringDetectedImage = false; + } + + public Event Run() + { + if (!roiDetectionCommandSent) + { + if (telnet.State == TelnetClient.TelnetState.Inactive) + { + // + // State variables + // + response = null; + passed = false; + failed = false; + previousFailed = false; + + // + // Prepare command + // + string masks = string.Empty; + Roi previous = roi.PreviousRoi; + int maskLevel = 0; + while (previous != null && maskLevel++ < 3) + { + if (!previous.Detected) + { + previousFailed = true; + return Event.RoiDetectionPreviousFailed; + } + + masks += string.Format(" -m {0} {1} {2} {3}", previous.RoiX.Val, previous.RoiY.Val, + previous.RoiWid.Val, previous.RoiHgh.Val); + previous = previous.PreviousRoi; + } + command = string.Format("clp/RoiDetection{0}{1}{2}{3}{4} {5}", + masks, + string.Format(roiCfg.LoadImages ? " -l {0}" : " -n {0}", roiCfg.DetectionImagesCount), + roiCfg.SaveImages ? " -s -jpg" : "", + string.Format(" -p1 {0}", roiCfg.DetectionPeriod1), + string.Format(" -p2 {0}", roiCfg.DetectionPeriod2), + roiCfg.RoiParams); + + // + // Send (or enqueue) command + // + telnet.Enqueue(new Telnet.Command(Telnet.CmdAction.CLEAR_RESPONSE)); + telnet.Enqueue(new Telnet.Command(Telnet.CmdAction.SEND_COMMAND, command)); + roiDetectionCommandSent = true; + log.WarnFormat("{0}/{1} command={2}", roiCfg.Name, camera.Name, command); + } + return Event.CameraBusy; + } + else if (passed) + { + if (transferringDetectedImage) + { + /// ROI detection passed and image transfer is in progress + return Event.RoiDetectionPassed; + } + else if (0 == camera.DownloadFile("detected.jpg", imgFileNamePrefix + "detected.jpg")) + { + /// File transfer successfully started + transferringDetectedImage = true; + return Event.RoiDetectionPassed; + } + else + { + /// Wait until the previous image transfer completes + return Event.CameraBusy; + } + } + else if (failed) + { + /// ROI detection failed, there in no image to transfer + return Event.RoiDetectionFailed; + } + else if (previousFailed) + { + return Event.RoiDetectionPreviousFailed; + } + else if (response != null) + { + int from = response.IndexOf('['); + int to = response.IndexOf(']'); + if (!response.Contains("RESULT=0\r\n") || from < 0 || to < 0 || to < from) + { + roi.ClearRoi(); + failed = true; + log.WarnFormat("{0}/{1} Detection failed: {2}", roiCfg.Name, camera.Name, response); + return Event.RoiDetectionFailed; + } + else + { + string oroiStr = response.Substring(from + 1, to - from - 1); + string[] terms = oroiStr.Split(new char[] { ',' }); + int x, y, w, h; + if (terms.Length != 5 || !int.TryParse(terms[0], out x) || !int.TryParse(terms[1], out y) + || !int.TryParse(terms[2], out w) || !int.TryParse(terms[3], out h)) + { + roi.ClearRoi(); + failed = true; + log.WarnFormat("{0}/{1} Cannot parse response: {2}", roiCfg.Name, camera.Name, response); + return Event.RoiDetectionFailed; + } + else + { + roi.SetRoi(x, y, w, h); + log.WarnFormat("{0}/{1} Detection PASSED: x={2} y={3} w={4} h={5}", roiCfg.Name, camera.Name, x, y, w, h); + passed = true; + + /// + /// Start the file transfer + /// + if (0 == camera.DownloadFile("detected.jpg", imgFileNamePrefix + "detected.jpg")) + { + /// File transfer successfully started + transferringDetectedImage = true; + return Event.RoiDetectionPassed; + } + else + { + return Event.CameraBusy; /// File transfer not started yet + } + } + } + } + else + { + return Event.CameraBusy; + } + } + + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/RoiForFixedStart/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/RoiForFixedStart/Factory.cs new file mode 100644 index 00000000..dc4dc682 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/RoiForFixedStart/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Network.Camera.RoiForFixedStart +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Roi.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Roi(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Roi(cfg, components); } + + public IComponentCfg DefaultConfig() { return new RoiCfg(this.GetType().Namespace.Substring(17), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(RoiCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/RoiForFixedStart/ProcedureParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/RoiForFixedStart/ProcedureParams.cs new file mode 100644 index 00000000..47dc5c51 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/RoiForFixedStart/ProcedureParams.cs @@ -0,0 +1,114 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.IO; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.Network.Camera.RoiForFixedStart +{ + public class ProcedureParams : ProcedureParamsBase, IParamsProvider, IProcedureParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcedureParams) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public double PulsesPerLtr; /// [l^-1] + + public override void InitializeAll() + { + PulsesPerLtr = 1.0; + } + + string[] paramNames = new string[] + { + Strings.PulsesPerLtr, + }; + public override string ParamName(int i) { return paramNames[i]; } + public override int ParamsCount() { return paramNames.Length; } + + public override string ToString(int i) + { + switch (i) + { + case 0: return PulsesPerLtr.ToString(); + default: return string.Empty; + } + } + + /// Retrieves parameters from UI controls + public CfgUpdateFlags UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: PulsesPerLtr = Utils.ParseUDouble(strValue); return CfgUpdateFlags.None; + default: return CfgUpdateFlags.None; + } + } + + /// Verifies whether strings in UI controls represent valid parameters + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + + double dummy; + switch (i) + { + case 0: + if (Utils.TryParseUDouble(strValue, out dummy)) return true; + break; + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(ProcedureParams prms) + { + prms.PulsesPerLtr = this.PulsesPerLtr; + } + + public IParamsProvider Clone() + { + ProcedureParams pars = new ProcedureParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateFromDbEntity(ComponentProcedure dbEntity) + { + if (dbEntity == null) return; + try + { + ProcedureParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcedureParams; + + procedureParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + procedure = dbEntity.Procedure; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + public ProcedureParams() { } + + public ProcedureParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public ProcedureParams(ComponentProcedure procedureParamsEntity, string componentName, Procedure procedure) + { + this.procedureParamsEntity = procedureParamsEntity; + this.componentName = componentName; + this.procedure = procedure; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/RoiForFixedStart/Roi.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/RoiForFixedStart/Roi.cs new file mode 100644 index 00000000..6038ae5f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/RoiForFixedStart/Roi.cs @@ -0,0 +1,180 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Text; +using log4net; +using Config.Entities; + +namespace TBF.BenchControl.Network.Camera.RoiForFixedStart +{ + public class Roi : ComponentBase, GenericDevices.IRoiForFixedStart, IOperation + { + /// TODO: Implement support for sharing one camera by multiple ROI-s + + private static readonly ILog log = LogManager.GetLogger(typeof(Roi)); + public override string ToString() + { + return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); + } + + /// + /// Cfg + /// + readonly RoiCfg roiCfg; + + /// + /// Camera and ICamera + /// + public readonly CLP1611.Camera NetCamera; + public GenericDevices.ICamera Camera { get { return NetCamera as GenericDevices.ICamera; } } + + public Config.Entities.RegisterReaderType RegisterReaderType { get { return Config.Entities.RegisterReaderType.Manual; } } + public double PulsesPerLtr { get { return roiCfg.ProcParams.PulsesPerLtr; } } + public double LtrsPerPulse { get { return (PulsesPerLtr <= float.Epsilon) ? 1.0 : (1 / PulsesPerLtr); } } + + + double beginWMState; + public double BeginWMState + { + get { return beginWMState; } + set { beginWMState = value; } + } + + double endWMState; + public double EndWMState + { + get { return endWMState; } + set { endWMState = value; } + } + + public double WMVolume { get { return endWMState - beginWMState; } } + + public int WMPulses { get { return (int)(WMVolume / LtrsPerPulse); } } + + int wmRefPulses; + public int WMRefPulses { get { return wmRefPulses; } } + + + public Roi() + { + } + + public Roi(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + roiCfg = cfg as RoiCfg; + NetCamera = TbfComponents.FindComponent(cfg.ParentName, components) as CLP1611.Camera; + + Clear(); + + StartChangeHandler(); + + log.Debug(this.ToString()); + } + + + #region Configuration Change Handling + + public static void OnCfgChange(object sender, CfgChangeArgs args) + { + if (CfgChangeHandler == null) return; + try { CfgChangeHandler(sender, args); } + catch (Exception e) { log.Error("CfgChangeHandler(...) failed", e); } + } + + public static event EventHandler CfgChangeHandler; + + public override void StartChangeHandler() + { + CfgChangeHandler += delegate(object sender, CfgChangeArgs args) + { + RoiCfg tmpcfg = args.Cfg as RoiCfg; + if (tmpcfg != null && tmpcfg.Name.Equals(Name)) + { + if (args.Command == CfgChangeCmd.CfgChange) + { + roiCfg.BlackAndWhite = tmpcfg.BlackAndWhite; + roiCfg.LowResolution = tmpcfg.LowResolution; + roiCfg.ImageRotation = tmpcfg.ImageRotation; + } + } + }; + } + + #endregion Configuration Change Handling + + public void Clear() + { + log.DebugFormat("{0}:Clear()", Name); + beginWMState = 0; + endWMState = 0; + wmRefPulses = 0; + } + + public void TestCompleted() + { + log.DebugFormat("{0}:TestCompleted()", Name); + ReadPulses(); + } + + private void ReadPulses() + { + wmRefPulses = (int)StateMachine.ControlBoard.EtPulses(0); + } + + + public IOperation GrabImageOp(string imageFileName) + { + if (NetCamera != null) + { + /// TODO: Implement support for sharing one camera by multiple ROI-s + return NetCamera.GrabImagesOp(new string[] { imageFileName }, roiCfg.BlackAndWhite, roiCfg.LowResolution, roiCfg.ImageRotation); + } + else + return null; + } + + public IOperation GrabImageOp(string imageFileName, bool blackAndWhite, + bool lowResolution, Config.Entities.ImageRotation imageRotation) + { + if (NetCamera != null) + { + /// TODO: Implement support for sharing one camera by multiple ROI-s + return NetCamera.GrabImagesOp(new string[] { imageFileName }, blackAndWhite, lowResolution, imageRotation); + } + else + return null; + } + + + /// + /// Events: Event.ReadRegisterDone + /// + /// ReadWaterMeter instance reference casted to IOperaton + public IOperation ReadRegisterOp() + { + return this; + } + + /// Start this operation + public void Start() + { + ReadPulses(); + } + + /// Run this operation + /// eventDone + public Event Run() + { + ReadPulses(); + return Event.ReadRegisterDone; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/RoiForFixedStart/RoiCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/RoiForFixedStart/RoiCfg.cs new file mode 100644 index 00000000..8ba7caa2 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/RoiForFixedStart/RoiCfg.cs @@ -0,0 +1,54 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Network.Camera.RoiForFixedStart +{ + public class RoiCfg : ComponentCfgBase, IChildComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(RoiCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new RoiCfgCtrl(); } + + /// + /// Serialized parameters + /// + public bool BlackAndWhite; + public bool LowResolution; + public ImageRotation ImageRotation; + + /// Procedure parameters + [XmlIgnore] + public ProcedureParams ProcParams; + public override IParamsProvider GetRuntimeProcParamsProvider() { return ProcParams; } + public override IParamsProvider CreateProcParamsProvider() { return new ProcedureParams(true); } + + /// Private parameterless constructor invoked by all other (public) constructors + RoiCfg() + { + ProcParams = new ProcedureParams(true); + } + + public RoiCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + Factory = factory; + ParentName = "Camera"; + BlackAndWhite = false; + LowResolution = true; + ImageRotation = ImageRotation.None; + DebugLevel = DebugMode.Inherit; + } + + public string ToString(int i) + { + return string.Format("{0} Camera={1} B&W={2}, LowRes={3}, Rotation={4}", + Name, ParentName, BlackAndWhite, LowResolution, ImageRotation); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/RoiForFixedStart/RoiCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/RoiForFixedStart/RoiCfgCtrl.cs new file mode 100644 index 00000000..ecc45d5f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/RoiForFixedStart/RoiCfgCtrl.cs @@ -0,0 +1,173 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.Network.Camera.RoiForFixedStart +{ + public partial class RoiCfgCtrl : UserControl, IComponentCfgCtrl + { + static readonly ILog log = LogManager.GetLogger(typeof(RoiCfgCtrl)); + + ComponentParametersDlg parent; + + public bool ShowMore { get { return false; } } + + RoiCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as RoiCfg; + Redraw(); + } + } + + public RoiCfgCtrl() + { + InitializeComponent(); + } + + private void PumpCfgCtrl_Load(object sender, EventArgs e) + { + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + + if (parent.TbfComponents != null) + { + foreach (var cmpnt in parent.TbfComponents) + { + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is TBF.BenchControl.Network.Camera.CLP1611.Factory) + { + parentNameComboBox.Items.Add(cmpnt.Name); + } + } + } + + for (ImageRotation ir = 0; ir < ImageRotation.Count; ir++) + { + imageRotationComboBox.Items.Add(ir.ToDescription()); + } + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + parentNameComboBox.Text = string.IsNullOrEmpty(config.ParentName) ? "---" : config.ParentName; + blackAndWhiteCheckBox.Checked = config.BlackAndWhite; + loResolutionCheckBox.Checked = config.LowResolution; + imageRotationComboBox.Text = config.ImageRotation.ToDescription(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + parentNameComboBox.Enabled = true; + blackAndWhiteCheckBox.Enabled = true; + loResolutionCheckBox.Enabled = true; + imageRotationComboBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (!parentNameComboBox.Items.Contains(parentNameComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + string.Format(Strings.Invalid_0, parentNameLabel.Text); + } + + if (!imageRotationComboBox.Items.Contains(imageRotationComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + string.Format(Strings.Invalid_0, imageRotationLabel.Text); + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + if (config.Name != nameTextBox.Text) + { + config.Name = nameTextBox.Text; + flags |= (CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + } + + string newParentName = parentNameComboBox.Text.Equals("---") ? string.Empty : parentNameComboBox.Text; + if (config.ParentName != newParentName) + { + config.ParentName = newParentName; + flags |= (CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + } + + if (config.BlackAndWhite != blackAndWhiteCheckBox.Checked) + { + config.BlackAndWhite = blackAndWhiteCheckBox.Checked; + flags |= (CfgUpdateFlags.AnyChange | CfgUpdateFlags.InvokeCfgChange); + } + + if (config.LowResolution != loResolutionCheckBox.Checked) + { + config.LowResolution = loResolutionCheckBox.Checked; + flags |= (CfgUpdateFlags.AnyChange | CfgUpdateFlags.InvokeCfgChange); + } + + for (ImageRotation ir = 0; ir < ImageRotation.Count; ir++) + { + if (imageRotationComboBox.Text == ir.ToDescription()) + { + if (config.ImageRotation != ir) + { + config.ImageRotation = ir; + flags |= (CfgUpdateFlags.AnyChange | CfgUpdateFlags.InvokeCfgChange); + break; + } + } + } + + if ((flags & CfgUpdateFlags.InvokeCfgChange) != 0) + { + Roi.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.CfgChange, config)); + } + + return flags; + } + + #region Configuration Change Handling + + public static void OnCmdResponse(object sender, CmdResponseArgs args) + { + if (CmdResponseHandler == null) return; + try { CmdResponseHandler(sender, args); } + catch (Exception e) { log.Error("CmdResponseHandler(...) failed", e); } + } + + public static event EventHandler CmdResponseHandler; + + public void StartResponseHandler() { } + public void StopResponseHandler() { } + + #endregion Configuration Change Handling + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/RoiForFixedStart/RoiCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/RoiForFixedStart/RoiCfgCtrl.designer.cs new file mode 100644 index 00000000..ddf361b5 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/RoiForFixedStart/RoiCfgCtrl.designer.cs @@ -0,0 +1,185 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.Network.Camera.RoiForFixedStart +{ + partial class RoiCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.parentNameLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.parentNameComboBox = new System.Windows.Forms.ComboBox(); + this.label1 = new System.Windows.Forms.Label(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.imageRotationComboBox = new System.Windows.Forms.ComboBox(); + this.imageRotationLabel = new System.Windows.Forms.Label(); + this.blackAndWhiteCheckBox = new System.Windows.Forms.CheckBox(); + this.loResolutionCheckBox = new System.Windows.Forms.CheckBox(); + this.SuspendLayout(); + // + // parentNameLabel + // + this.parentNameLabel.AutoSize = true; + this.parentNameLabel.Location = new System.Drawing.Point(20, 77); + this.parentNameLabel.Name = "parentNameLabel"; + this.parentNameLabel.Size = new System.Drawing.Size(43, 13); + this.parentNameLabel.TabIndex = 3; + this.parentNameLabel.Text = "Camera"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(139, 49); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(174, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(20, 52); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(136, 26); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(114, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComponentClassName"; + // + // parentNameComboBox + // + this.parentNameComboBox.Enabled = false; + this.parentNameComboBox.FormattingEnabled = true; + this.parentNameComboBox.Location = new System.Drawing.Point(139, 74); + this.parentNameComboBox.Name = "parentNameComboBox"; + this.parentNameComboBox.Size = new System.Drawing.Size(174, 21); + this.parentNameComboBox.TabIndex = 4; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(-211, -147); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(57, 13); + this.label1.TabIndex = 5; + this.label1.Text = "Arguments"; + // + // textBox1 + // + this.textBox1.Enabled = false; + this.textBox1.Location = new System.Drawing.Point(-125, -150); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(372, 20); + this.textBox1.TabIndex = 6; + // + // imageRotationComboBox + // + this.imageRotationComboBox.Enabled = false; + this.imageRotationComboBox.FormattingEnabled = true; + this.imageRotationComboBox.Location = new System.Drawing.Point(139, 154); + this.imageRotationComboBox.Name = "imageRotationComboBox"; + this.imageRotationComboBox.Size = new System.Drawing.Size(93, 21); + this.imageRotationComboBox.TabIndex = 8; + // + // imageRotationLabel + // + this.imageRotationLabel.AutoSize = true; + this.imageRotationLabel.Location = new System.Drawing.Point(20, 157); + this.imageRotationLabel.Name = "imageRotationLabel"; + this.imageRotationLabel.Size = new System.Drawing.Size(103, 13); + this.imageRotationLabel.TabIndex = 7; + this.imageRotationLabel.Text = "Image rotation (ccw)"; + // + // blackAndWhiteCheckBox + // + this.blackAndWhiteCheckBox.AutoSize = true; + this.blackAndWhiteCheckBox.Enabled = false; + this.blackAndWhiteCheckBox.Location = new System.Drawing.Point(139, 108); + this.blackAndWhiteCheckBox.Name = "blackAndWhiteCheckBox"; + this.blackAndWhiteCheckBox.Size = new System.Drawing.Size(93, 17); + this.blackAndWhiteCheckBox.TabIndex = 5; + this.blackAndWhiteCheckBox.Text = "Black && White"; + this.blackAndWhiteCheckBox.UseVisualStyleBackColor = true; + // + // loResolutionCheckBox + // + this.loResolutionCheckBox.AutoSize = true; + this.loResolutionCheckBox.Enabled = false; + this.loResolutionCheckBox.Location = new System.Drawing.Point(139, 131); + this.loResolutionCheckBox.Name = "loResolutionCheckBox"; + this.loResolutionCheckBox.Size = new System.Drawing.Size(94, 17); + this.loResolutionCheckBox.TabIndex = 6; + this.loResolutionCheckBox.Text = "Low resolution"; + this.loResolutionCheckBox.UseVisualStyleBackColor = true; + // + // RoiCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.imageRotationComboBox); + this.Controls.Add(this.imageRotationLabel); + this.Controls.Add(this.blackAndWhiteCheckBox); + this.Controls.Add(this.loResolutionCheckBox); + this.Controls.Add(this.parentNameComboBox); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.label1); + this.Controls.Add(this.parentNameLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "RoiCfgCtrl"; + this.Size = new System.Drawing.Size(500, 300); + this.Load += new System.EventHandler(this.PumpCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label parentNameLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.ComboBox parentNameComboBox; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.ComboBox imageRotationComboBox; + private System.Windows.Forms.Label imageRotationLabel; + private System.Windows.Forms.CheckBox blackAndWhiteCheckBox; + private System.Windows.Forms.CheckBox loResolutionCheckBox; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/RoiForFixedStart/RoiCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/RoiForFixedStart/RoiCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Camera/RoiForFixedStart/RoiCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Comet/Ambient/Ambient.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Comet/Ambient/Ambient.cs new file mode 100644 index 00000000..ea06dda8 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Comet/Ambient/Ambient.cs @@ -0,0 +1,263 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Net; +using System.Net.Sockets; +using log4net; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Boxes; + +namespace TBF.BenchControl.Network.Comet.Ambient +{ + /// + /// Ambient temperature / humidity / pressure meter 'Greco' connected via serial interface (RS232) + /// Connection settings: 9600 Bd 8-bits No-parity 2-stop-bits Flow control: none. + /// + public class Ambient : ComponentBase, IDevice, IOperation, GenericDevices.IAmbient + { + private static readonly ILog log = LogManager.GetLogger(typeof(Ambient)); + public override string ToString() { return string.Format("Ambient({0})", Cfg.ToString(1)); } + + readonly AmbientCfg myCfg; + readonly IPAddress ipAddress; + readonly int tcpPort; + + TcpClient tcpClient; + NetworkStream networkStream; + + enum State + { + Idle, + WaitingForTemperature, + WaitingForHumidity, + WaitingForPressure, + }; + + State state; + + /// The state of the measurement + MsrmntState msrmntState; + + /// + /// Measured values when MsrmntState == MsrmntState.Valid + /// + float temperature; /// [°C] + float pressure; /// [bar] + float humidity; /// [R%] + + /// Measurement time stamp when MsrmntState == MsrmntState.Valid + int msrmntTimeStamp; + + public Ambient() + { + } + + /// + /// Ambient temperature / humidity / pressure meter 'Greco' connected via serial interface (RS232) + /// + public Ambient(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + myCfg = cfg as AmbientCfg; + if (myCfg == null) throw new ArgumentNullException("No configuration"); + + ipAddress = IPAddress.Parse(myCfg.IPAddress); + tcpPort = myCfg.TcpPort; + + log.Debug(this.ToString()); + } + + public void Initialize() + { + if (myCfg.DebugLevel == DebugMode.Simulate) + { + temperature = 20.0f; + humidity = 40.0f; + pressure = 1.0f; + msrmntTimeStamp = StateMachine.Time; + msrmntState = MsrmntState.Valid; + log.FatalFormat("Ambient: temperature = {0:F1} C, humidity = {1:F1} %, pressure = {2:F0} mbar", temperature, humidity, 1000 * pressure); + return; + } + + tcpClient = new TcpClient(); + tcpClient.Connect(ipAddress, tcpPort); + networkStream = tcpClient.GetStream(); + + state = State.Idle; + msrmntState = MsrmntState.Busy; + + log.FatalFormat("Initialization successful: {0}", this.ToString()); + } + + /// Run this device + public void RunDeviceBefore() + { + if (myCfg.DebugLevel == DebugMode.Simulate || myCfg.DebugLevel == DebugMode.FailureDuringOperation) + { + msrmntTimeStamp = StateMachine.Time; + return; + } + + try + { + int available = tcpClient.Available; + + if (available >= 11) + { + byte[] bytes = new byte[available]; + networkStream.Read(bytes, 0, available); + log.Debug(Telegram.LogTelegram("Received ", bytes)); + + int value; + if (available == 11 && bytes[0] == 0 && bytes[2] == 0 && bytes[3] == 0 && bytes[4] == 0 + && bytes[5] == 5 && bytes[6] == 1 && bytes[7] == 3 && bytes[8] == 2) + { + switch (state) + { + case State.WaitingForTemperature: + value = (int)bytes[9] * 256 + (int)bytes[10]; + temperature = (float)(value / 10.0); /// Conversion to °C + msrmntTimeStamp = StateMachine.Time; + msrmntState = MsrmntState.Valid; + log.InfoFormat("Ambient temperature = {0:F1} C", temperature); + state = State.Idle; + break; + case State.WaitingForHumidity: + value = (int)bytes[9] * 256 + (int)bytes[10]; + humidity = (float)(value / 10.0); /// Conversion to R% + msrmntTimeStamp = StateMachine.Time; + msrmntState = MsrmntState.Valid; + log.InfoFormat("Ambient humidity = {0:F1} %", humidity); + state = State.Idle; + break; + case State.WaitingForPressure: + value = (int)bytes[9] * 256 + (int)bytes[10]; + pressure = (float)(value / 10000.0); /// Conversion to bar + msrmntTimeStamp = StateMachine.Time; + msrmntState = MsrmntState.Valid; + log.InfoFormat("Ambient pressure = {0:F0} mbar", 1000 * pressure); + state = State.Idle; + break; + } + } + else + { + state = State.Idle; + } + } + } + catch (Exception e) + { + DebugLevel = DebugMode.FailureDuringOperation; + + log.FatalFormat("Ambient: Serail port read failure : {0}", e.Message); + if (e.InnerException != null) + { + log.FatalFormat("InnerMessage : {0}", e.InnerException.Message); + } + } + } + + /// Run this device + public void RunDeviceAfter() + { + if (myCfg.DebugLevel == DebugMode.Simulate || myCfg.DebugLevel == DebugMode.FailureDuringOperation) + { + return; + } + + try + { + /// 20 seconds cycle + byte[] message = null; + switch (StateMachine.Time % 20) + { + case 0: + state = State.WaitingForTemperature; + message = new byte[12] { 0, 0, 0, 0, 0, 0x06, 0x01, 0x03, 0, 0x30, 0, 0x01 }; + break; + case 6: + state = State.WaitingForHumidity; + message = new byte[12] { 0, 0x02, 0, 0, 0, 0x06, 0x01, 0x03, 0, 0x31, 0, 0x01 }; + break; + case 12: + state = State.WaitingForPressure; + message = new byte[12] { 0, 0x03, 0, 0, 0, 0x06, 0x01, 0x03, 0, 0x33, 0, 0x01 }; + break; + } + + if (message != null) + { + log.Debug(Telegram.LogTelegram("Sending ", message)); + networkStream.Write(message, 0, message.Length); /// Read request + } + } + catch (Exception e) + { + DebugLevel = DebugMode.FailureDuringOperation; + + log.FatalFormat("TCP/IP write error : {0}", e.Message); + if (e.InnerException != null) + { + log.FatalFormat("InnerMessage : {0}", e.InnerException.Message); + } + } + } + + /// Stop this device + public void StopDevice() + { + if (myCfg.DebugLevel != DebugMode.Simulate && myCfg.DebugLevel != DebugMode.FailureDuringOperation) + { + networkStream.Close(); + tcpClient.Close(); + } + } + + public void StopDevice2() { } + + /// + /// Boxes for the operation result + /// + FloatBox tempBox; + FloatBox pressureBox; + FloatBox humiBox; + + public IOperation ReadAmbientOp(FloatBox tempBox, FloatBox pressureBox, FloatBox humiBox) + { + this.tempBox = tempBox; + this.pressureBox = pressureBox; + this.humiBox = humiBox; + return this; + } + + /// Start this operation + public void Start() + { + if (tempBox != null) tempBox.Val = temperature; + if (pressureBox != null) pressureBox.Val = pressure; + if (humiBox != null) humiBox.Val = humidity; + } + + /// Run this operation + /// + /// Event.FlowInDone or Event.FlowOutDone + /// + public Event Run() + { + if (tempBox != null) tempBox.Val = temperature; + if (pressureBox != null) pressureBox.Val = pressure; + if (humiBox != null) humiBox.Val = humidity; + return Event.AmbientDone; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Comet/Ambient/AmbientCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Comet/Ambient/AmbientCfg.cs new file mode 100644 index 00000000..58e16306 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Comet/Ambient/AmbientCfg.cs @@ -0,0 +1,43 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Net; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Network.Comet.Ambient +{ + public class AmbientCfg : ComponentCfgBase, IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(AmbientCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new AmbientCfgCtrl(); } + + /// + /// Serialized parameters + /// + public string IPAddress; + public int TcpPort; + public string SerialNr; + + /// Private parameterless constructor invoked by all other (public) constructors + AmbientCfg() { } + + public AmbientCfg(string name, IComponentFactory factory) + : this() + { + this.Name = name; + this.Factory = factory; + IPAddress = "192.168.0.123"; + TcpPort = 502; + SerialNr = string.Empty; + } + + public string ToString(int i) + { + return string.Format("Name={0}, IP={1}, Port={2}, s/n={3}", Name, IPAddress, TcpPort, SerialNr); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Comet/Ambient/AmbientCfgCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Comet/Ambient/AmbientCfgCtrl.Designer.cs new file mode 100644 index 00000000..1f834ec3 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Comet/Ambient/AmbientCfgCtrl.Designer.cs @@ -0,0 +1,157 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +namespace TBF.BenchControl.Network.Comet.Ambient +{ + partial class AmbientCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.serialNrTextBox = new System.Windows.Forms.TextBox(); + this.serialNrLabel = new System.Windows.Forms.Label(); + this.ipAddressLabel = new System.Windows.Forms.Label(); + this.ipAddressTextBox = new System.Windows.Forms.TextBox(); + this.tcpPortTextBox = new System.Windows.Forms.TextBox(); + this.tcpPortLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(140, 43); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(36, 46); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(137, 18); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // serialNrTextBox + // + this.serialNrTextBox.Enabled = false; + this.serialNrTextBox.Location = new System.Drawing.Point(140, 121); + this.serialNrTextBox.Name = "serialNrTextBox"; + this.serialNrTextBox.Size = new System.Drawing.Size(130, 20); + this.serialNrTextBox.TabIndex = 10; + // + // serialNrLabel + // + this.serialNrLabel.AutoSize = true; + this.serialNrLabel.Location = new System.Drawing.Point(36, 124); + this.serialNrLabel.Name = "serialNrLabel"; + this.serialNrLabel.Size = new System.Drawing.Size(71, 13); + this.serialNrLabel.TabIndex = 9; + this.serialNrLabel.Text = "Serial number"; + // + // ipAddressLabel + // + this.ipAddressLabel.AutoSize = true; + this.ipAddressLabel.Location = new System.Drawing.Point(36, 72); + this.ipAddressLabel.Name = "ipAddressLabel"; + this.ipAddressLabel.Size = new System.Drawing.Size(58, 13); + this.ipAddressLabel.TabIndex = 5; + this.ipAddressLabel.Text = "IP Address"; + // + // ipAddressTextBox + // + this.ipAddressTextBox.Enabled = false; + this.ipAddressTextBox.Location = new System.Drawing.Point(140, 69); + this.ipAddressTextBox.Name = "ipAddressTextBox"; + this.ipAddressTextBox.Size = new System.Drawing.Size(130, 20); + this.ipAddressTextBox.TabIndex = 6; + // + // tcpPortTextBox + // + this.tcpPortTextBox.Enabled = false; + this.tcpPortTextBox.Location = new System.Drawing.Point(140, 95); + this.tcpPortTextBox.Name = "tcpPortTextBox"; + this.tcpPortTextBox.Size = new System.Drawing.Size(130, 20); + this.tcpPortTextBox.TabIndex = 8; + // + // tcpPortLabel + // + this.tcpPortLabel.AutoSize = true; + this.tcpPortLabel.Location = new System.Drawing.Point(36, 98); + this.tcpPortLabel.Name = "tcpPortLabel"; + this.tcpPortLabel.Size = new System.Drawing.Size(65, 13); + this.tcpPortLabel.TabIndex = 7; + this.tcpPortLabel.Text = "TCP/IP Port"; + // + // AmbientCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.Control; + this.Controls.Add(this.tcpPortTextBox); + this.Controls.Add(this.tcpPortLabel); + this.Controls.Add(this.ipAddressTextBox); + this.Controls.Add(this.ipAddressLabel); + this.Controls.Add(this.serialNrTextBox); + this.Controls.Add(this.serialNrLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "AmbientCfgCtrl"; + this.Size = new System.Drawing.Size(400, 254); + this.Load += new System.EventHandler(this.AbbientCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.TextBox serialNrTextBox; + private System.Windows.Forms.Label serialNrLabel; + private System.Windows.Forms.Label ipAddressLabel; + private System.Windows.Forms.TextBox ipAddressTextBox; + private System.Windows.Forms.TextBox tcpPortTextBox; + private System.Windows.Forms.Label tcpPortLabel; + + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Comet/Ambient/AmbientCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Comet/Ambient/AmbientCfgCtrl.cs new file mode 100644 index 00000000..6b8a1fef --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Comet/Ambient/AmbientCfgCtrl.cs @@ -0,0 +1,111 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Net; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.Network.Comet.Ambient +{ + public partial class AmbientCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + AmbientCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as AmbientCfg; + Redraw(); + } + } + + public AmbientCfgCtrl() + { + InitializeComponent(); + } + + private void AbbientCfgCtrl_Load(object sender, EventArgs e) + { + Localize(); + Redraw(); + } + + void Localize() + { + nameLabel.Text = Strings.Name; + serialNrLabel.Text = Strings.Serial_Number; + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + ipAddressTextBox.Text = config.IPAddress != null ? config.IPAddress.ToString() : "192.168.0.123"; + tcpPortTextBox.Text = config.TcpPort.ToString(); + serialNrTextBox.Text = config.SerialNr.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + ipAddressTextBox.Enabled = true; + tcpPortTextBox.Enabled = true; + serialNrTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + IPAddress ip; + if (!IPAddress.TryParse(ipAddressTextBox.Text, out ip)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + string.Format(Strings.Invalid_0, ipAddressLabel.Text); + } + + int port; + if (!int.TryParse(tcpPortTextBox.Text, out port) || port < 0 || port > 65535) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + string.Format(Strings.Invalid_0, tcpPortLabel.Text); + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + if (config.Name != nameTextBox.Text || + config.IPAddress != ipAddressTextBox.Text || + config.TcpPort.ToString() != tcpPortTextBox.Text || + config.SerialNr != serialNrTextBox.Text) + { + config.Name = nameTextBox.Text; + config.IPAddress = ipAddressTextBox.Text; + config.TcpPort = int.Parse(tcpPortTextBox.Text); + config.SerialNr = serialNrTextBox.Text; + + flags |= (CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + } + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Comet/Ambient/AmbientCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Comet/Ambient/AmbientCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Comet/Ambient/AmbientCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Comet/Ambient/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Comet/Ambient/Factory.cs new file mode 100644 index 00000000..90bef651 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Comet/Ambient/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Network.Comet.Ambient +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Ambient.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Ambient(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Ambient(cfg, components); } + + public IComponentCfg DefaultConfig() { return new AmbientCfg(this.GetType().Namespace.Substring(17), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(AmbientCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Telnet/Command.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Telnet/Command.cs new file mode 100644 index 00000000..e2ee7513 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Telnet/Command.cs @@ -0,0 +1,125 @@ +using System; +using System.Text.RegularExpressions; + +namespace TBF.BenchControl.Network.Telnet +{ + /// + /// One part of the telnet client command, which consists of a pair CmdAction action and string str. + /// + public enum CmdAction + { + VOID = 0, /// Blank (uninitialized) action. 'str' is not used. + CONNECT, /// Connect (=open a TCP socket and log in). 'str'=hostname. Notify by 'Connected' event. + SET_PROMPT, /// Set a prompt string used in comparisons when executing ..._WAIT4PROMPT. 'str'=prompt. + CLEAR_RESPONSE, /// Clear received response buffer. 'str' is not used. Note: Response buffer is cleared also after a detected prompt. + SEND_STRING, /// Send a string and do nothing else. 'str'=string to be sent. + SEND_MSRMNT_CMD, /// Send a string and extract measurements from received data (filter received data) + SEND_COMMAND, /// Send a string and WAIT for a PROMPT. 'str'=string to be sent. Notify by 'PromptReceived' event. + REBOOT_RECONNECT, /// Send 'reboot' command (if connected), wait a while and reconect. 'str' is not used. Notify by 'Connected' event. + EXIT_RECONNECT, /// Send 'exit' (terminate telnet session) and reconect. 'str' is not used. Notify using 'Connected' event. + DISCONNECT, /// Send 'exit' to disconnect, do not reconnect. 'str' is not used. + TERMINATE, /// Terminate worker thread (should be done once before TelnetClient destruction. 'str' is not used. + LABEL, /// Label marking the start of item commands, 'str' identifies the item. + NOTIFICATION, /// Notify by 'Notification' event when this command is processed. 'str'=notification ID-string + } + + + /// + /// Telnet client command. Consists of a pair 'action', 'str' + /// CmdAction 'action' specifies the action to be taken. + /// string 'str' is (in most cases) the string to be sent, however it might be a hostname or a prompt. + /// + public struct Command + { + /// Private fields + CmdAction action; /// Telnet client action to be taken, e.g. 'send a command' + string str; /// String argument, e.g. a Linux command to be sent. + int duration; /// Expected duration of the command in [s], 0 = immediate, -1 = unknown + int timeout; /// Timeout period for the command in [s], 0 = no timeout + Regex fatalRegex; /// A compiled regular expression for a fatal error, or null (null=no fatal error detection) + Regex errorRegex; /// A compiled regular expression for an error, or null (null=no error detection) + Regex warningRegex; /// A compiled regular expression for a warning, or null (null=no warning detection) + Regex successRegex; /// A compiled regular expression for a success, or null (null=no success detection) + + /// Public read only properties + public CmdAction Action { get { return action; } } + public string Str { get { return str; } } + public int Duration { get { return duration; } } + public int Timeout { get { return timeout; } } + public Regex FatalRegex { get { return fatalRegex; } } + public Regex ErrorRegex { get { return errorRegex; } } + public Regex WarningRegex { get { return warningRegex; } } + public Regex SuccessRegex { get { return successRegex; } } + + /// + /// Various constructors: + /// - duration and timeout are in seconds + /// - if timeout and duration is not supplied, timeout=0, duration=0 (timeout switched off) + /// - if string is not supplied, null is used + /// + public Command(CmdAction action, string str, int duration, int timeout, + Regex fatalRegex, Regex errorRegex, Regex warningRegex, Regex successRegex) + { + this.action = action; + this.str = str; + this.duration = duration; + this.timeout = timeout; + this.fatalRegex = fatalRegex; + this.errorRegex = errorRegex; + this.warningRegex = warningRegex; + this.successRegex = successRegex; + } + + public Command(CmdAction action, string str, int duration, int timeout) + : this(action, str, duration, timeout, null, null, null, null) + { + } + + public Command(CmdAction action, string str) + : this(action, str, 0, 0, null, null, null, null) + { + } + + public Command(CmdAction action, int duration, int timeout) + : this(action, null, duration, timeout, null, null, null, null) + { + } + + public Command(CmdAction action) + : this(action, null, 0, 0, null, null, null, null) + { + } + + /// + /// For debugging purposes. + /// + /// A name of Command.action + public override string ToString() + { + string result = action.ToString(); + + if (str != null) + { + result += ", \"" + str + "\""; + } + + if (action == CmdAction.CONNECT || + action == CmdAction.REBOOT_RECONNECT || + action == CmdAction.EXIT_RECONNECT || + action == CmdAction.SEND_COMMAND) + { + result += ", timeout=" + timeout.ToString() + "s"; + } + + if (action == CmdAction.SEND_COMMAND) + { + if (fatalRegex != null) { result += ", fatal=" + fatalRegex.ToString(); } + if (errorRegex != null) { result += ", error=" + errorRegex.ToString(); } + if (warningRegex != null) { result += ", warning=" + warningRegex.ToString(); } + if (successRegex != null) { result += ", success=" + successRegex.ToString(); } + } + + return result; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Telnet/DummyVT.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Telnet/DummyVT.cs new file mode 100644 index 00000000..963c3868 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Telnet/DummyVT.cs @@ -0,0 +1,15 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.Network.Telnet +{ + public class DummyVT : IVirtualTerminal + { + public DummyVT() { } + + public void ClearScreen() { } + public void WriteVt(char c) { } + public void WriteVt(string txt) { } + public string Text { get { return string.Empty; } } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Telnet/EventArgsClasses.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Telnet/EventArgsClasses.cs new file mode 100644 index 00000000..4695b176 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Telnet/EventArgsClasses.cs @@ -0,0 +1,120 @@ +using System; +using System.Collections.Generic; + +namespace TBF.BenchControl.Network.Telnet +{ + /// + /// Type of argument of MeasuredDataEventHandler + /// + public class MeasuredDataEventArgs : EventArgs + { + public string MeasuredData; /// Fatal error description messages. + + public MeasuredDataEventArgs(string measuredData) + { + MeasuredData = measuredData; + } + } + + + + /// + /// Type of argument of FatalEventHandler + /// + public class FatalEventArgs : EventArgs + { + public string FatalErrorText; /// Fatal error description messages. + + public FatalEventArgs(string text) + { + FatalErrorText = text; + } + } + + + + /// + /// Type of argument of NotificationEventHandler + /// + public class NotificationEventArgs : EventArgs + { + public string NotificationText; /// String identifying this notification more closely. + + public NotificationEventArgs(string text) + { + NotificationText = text; + } + } + + + + /// + /// Type of argument of PromptReceviedEventHandler + /// + public class PromptReceivedEventArgs : EventArgs + { + public string Response; /// Response to a command from the telnet server ... + /// ... without the terminal prompt string. + + public PromptReceivedEventArgs(string text) + { + Response = text; + } + } + + + + /// + /// Type of argument of VtTextChangedEventHandler + /// + public class VtTextChangedEventArgs : EventArgs + { + public string VtText; // Virtual terminal text. + + public VtTextChangedEventArgs(string text) + { + VtText = text; + } + } + + + + /// + /// Used as a part of AuxBrdUpgItemMessage + /// + public enum Category + { + Error, + Warning, + Success, + } + /// + /// A pair containing Aux Board Upgrade item identification and a message + /// (fatal error, error, warning or success message). + /// + public class AuxBrdUpgItemMessage + { + public Category Category; /// Error, Warning or Success + public string Label; /// Identifies the aux.board upgrade item + public string Message; /// The message + + public AuxBrdUpgItemMessage(Category category, string label, string message) + { + Category = category; + Label = label; + Message = message; + } + } + /// + /// Type of argument of SummaryEventArgs + /// + public class SummaryEventArgs : EventArgs + { + public IList SummaryMessages; /// Event description messages. + + public SummaryEventArgs(IList summaryMessages) + { + this.SummaryMessages = summaryMessages; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Telnet/IVirtualTerminal.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Telnet/IVirtualTerminal.cs new file mode 100644 index 00000000..8faf3b84 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Telnet/IVirtualTerminal.cs @@ -0,0 +1,13 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.Network.Telnet +{ + public interface IVirtualTerminal + { + void ClearScreen(); + void WriteVt(char c); + void WriteVt(string txt); + string Text { get; } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Telnet/TelnetClient.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Telnet/TelnetClient.cs new file mode 100644 index 00000000..d5997e21 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Telnet/TelnetClient.cs @@ -0,0 +1,1379 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Diagnostics; +using System.Text; +using System.Text.RegularExpressions; +using System.Collections.Generic; +using System.Threading; +using System.Net.Sockets; +using log4net; + +namespace TBF.BenchControl.Network.Telnet +{ + /// + /// This class implements iST Telnet Client functionality. + /// + public class TelnetClient + { + static ILog log = LogManager.GetLogger("TelnetClient"); + + /// + /// Common commands + /// + public const string CtrlCCommand = "\u0003"; /// CTRL-C command to close the connection after a failed login + public const string RebootCommand = "sudo shutdown -r now"; /// 'reboot' command to reboot and start a new session, CmdAction.REBOOT_RECONNECT + public const string ExitCommand = "\u0004"; /// CTRL-D command to terminate the session, used by CmdAction.EXIT_RECONNECT + public const string Q_Command = "Q"; /// Q command to terminate the measurement + + /// + /// Re-connect after re-boot behavior: + /// + const int DelayAfterRebootMs = 60000; /// [ms] Delay before the first attempt to re-connect: 20 sec + const int LoginTimeOutMs = 40000; /// [ms] Login time out period, applies when TCP connection was established + const int LoginRetryPeriodMs = 45000; /// [ms] Delay before every next attempt to re-connect, normally applies when TCP connection was refused + const int TimeIncrementMs = 1000; /// [ms] Can be much larger now, times out blocking read operations, does not delay normal program flow + + + const int DefaultTelnetPortNumber = 23; /// Can be ooverriden by a host string like "192.168.0.5:8023" + + + + /// + /// High level states of TelnetClient operation + /// + public enum TelnetState + { + Inactive, + Busy, + Success, + Error, + BusyFinal, /// Is not followed by a summary dialog + FatalError, + } + + /// + /// High level state of TelnetClient operation used to update device's icon, etc. + /// + public TelnetState State { get { return state; } } /// readonly + TelnetState state; + + + + /// + /// Telnet (Network Virtual Terminal) control characters (code >= 128). + /// + /// + enum NvtCommand + { + NA = -1, /// -1 = NVT command not available (possibly a broken connection) + SE = 240, /// 240 = End of sub-negotiation parameters + NOP, /// 241 = No operation + DM, /// 242 = Data mark + BRK, /// 243 = Break + IP, /// 244 = Suspend + AO, /// 245 = Abort output + AYT, /// 246 = Are you there + EC, /// 247 = Erase characters + EL, /// 248 = Erase line + GA, /// 249 = Go ahead + SB, /// 250 = Sub-negotiation + WILL, /// 251 = will + WONT, /// 252 = wont + DO, /// 253 = do + DONT, /// 254 = don't + IAC, /// 255 = Interpret as command + } + + /// + /// Telnet (Network Virtual Terminal) options negotiated by the use of command: + /// IAC + [WILL | WONT | DO | DONT] + NvtOption (sequence of 3 bytes). + /// + /// + enum NvtOption + { + NA = -1, /// = NVT option not available (possibly a broken connection) + SGA = 3, /// = Suppress go ahead + } + + /// + /// Network virtual terminal (state machine) states + /// + enum NvtState + { + AwaitingConnect = 0, /// Awaits CONNECT command from the cmdQueue, no session is active, TCP is not polled + Login, /// Retries a login after REBOOT_RECONNECT or EXIT_RECONNECT commands, queue is not polled + Session, /// Telnet session: awaits commands from the cmdQueue, receives characters from TCP (full-duplex) + Measurement, /// Telnet session: awaits CTRL-C command from the cmdQueue, receives characters from TCP and extracts data + WaitResponse, /// Receives characters from TCP, builds a response str., awaiting the prompt, queue is not polled + WaitReboot, /// Wait until TCP connection is terminated and reboot starts + NvtStatesCount + } + + /// + /// Network virtual terminal (state machine) state used in control at lower level + /// + NvtState nvtState; + + /// + /// Network virtual terminal (state machine) events + /// + enum NvtEvent + { + None = 0, + TcpReceived, /// TCP data received + CmdReceived, /// Command from the cmdQueue received + Timeout, /// Timeout occurred + ConnectionLost, /// TCP connection lost + Terminate /// Command CmdAction.TERMINATE received + } + + /// + /// Values returned by communication functions + /// + enum RetVal + { + OK = 0, + LoginRejected, /// Login rejected, invalid username or password + Timeout, + NoTcpConnection, /// No TCP connection (connection lost) + Terminate, /// Returned by CmdQueueClear() if TERINATE is in the queue + Error, + } + + + /// + /// Private fields + /// + object objRef; /// Reference to object to be included in info sent by event handlers + IVirtualTerminal vt; /// Virtual terminal + string hostname; /// Telnet server host name or IP address. + int portNr = DefaultTelnetPortNumber; /// Telnet server port number. + TcpClient tcp = null; /// Reference to TcpClient + AutoResetEvent disconnectDone; + string prompt; /// Prompt string used for command complete detection + /// ... initialized to a default iCOM board prompt. + string labelStr = String.Empty; /// Set by a command with CmdAction.LABEL. + string completeResponse; /// A complete response used by IF_RECEIVED, IF_NOT_RECEIVED. + Thread thread; /// Worker thread. + bool disposed = false; + + Queue cmdQueue = new Queue(); /// Worker thread command queue. + AutoResetEvent queueEvent; /// Sync. event set when cmdQueue is filled (=Enqueue()) + + /// Get command queue size + int cmdQueueCount + { + get { lock (cmdQueue) { return cmdQueue.Count; } } + } + + /// + /// Thread safe cmdQueue.Peek() + /// + /// Command + Command CmdQueuePeek() + { + lock (cmdQueue) + { + if (cmdQueue.Count > 0) return cmdQueue.Peek(); + else return new Command(CmdAction.VOID); + } + } + + /// + /// Thread safe cmdQueue.Clear(), Leaves TERMINATE in the queue, if there is any. + /// + /// RetVal.OK or RetVal.Teminate + RetVal CmdQueueClear() + { + lock (cmdQueue) + { + if (cmdQueue.Count > 0 && cmdQueue.Peek().Action == CmdAction.TERMINATE) return RetVal.Terminate; + cmdQueue.Clear(); + labelStr = String.Empty; + return RetVal.OK; + } + } + + + /// + /// Properties set by the constructor + /// + readonly string telnetUserName; + readonly string telnetPassword; + readonly string defaultPrompt; + readonly bool skipFirstLine; /// Skip the first line when logging in + + + DateTime cmdStartTime; /// Time of the last Dequeue (= command execution start time). + TimeSpan cmdTimeOut; /// Time out period of the last dequeued command. + DateTime connectTimeout; /// Checked when handling NvtEvent.Timeout and in the state NvtState.Login + + int timeDone = 0; /// Duration of commands in [s] executed so far ... + /// ... starting from Command(CmdAction.NOTIFICATION, "Begin") + + Command currentCmd = new Command(CmdAction.VOID); /// The currently executed command, used to calculate timeDone + + string notificationText; + string fatalErrorText; + IList auxBrdUpgMessages; + + /// + /// Creates a telnet connection, uses default port number, does not log in. + /// Hostname (IP address) and the port number is passed to worker thread + /// in a Command with CmdAction.CONNECT and str=hostname. + /// + public TelnetClient(object objRef, string threadId, string userName, string password, string defaultPrompt, bool skipFirstLine, bool useVT) + { + this.objRef = objRef; + this.telnetUserName = userName; + this.telnetPassword = password; + this.defaultPrompt = defaultPrompt; + this.skipFirstLine = skipFirstLine; + + state = TelnetState.Inactive; /// Device's icon is being updated by HNIP + /// + if (useVT) + { + vt = new VirtualTerminal(); + } + else + { + vt = new DummyVT(); + } + + /// TODO: pass a VirtualTerminal reference + this.portNr = DefaultTelnetPortNumber; + queueEvent = new AutoResetEvent(false); + disconnectDone = new AutoResetEvent(false); + thread = new Thread(new ThreadStart(this.WorkerThread)); + thread.Name = "Telnet_" + threadId + "_"; /// Is used also as a log file root name + thread.Start(); + } + + ~TelnetClient() + { + Terminate(); + } + + /// + /// Enqueue a command that terminates the worker thread, used on program exit + /// + public void Terminate() + { + lock (cmdQueue) + { + cmdQueue.Clear(); + cmdQueue.Enqueue(new Command(CmdAction.TERMINATE)); + queueEvent.Set(); + } + } + + /// + /// Close the log file and finish the worker thread by enqueueing + /// CmdAction.TERIMNATE into the command queue. + /// + public void Dispose() + { + /// Check to see if Dispose has already been called. Avoid multiple Terminate()-s, thread.Join()-s. + lock (this) + { + if (disposed) return; + disposed = true; + } + + Terminate(); + + if (!thread.Join(5000)) throw(new Exception("Fatal error")); + } + + /// + /// Worker thread procedure (an instance method). + /// + void WorkerThread() + { + log.Info("-------------------- Worker thread started --------------------"); + /// Turn timeout off (turned on by commands) + cmdStartTime = DateTime.Now; + cmdTimeOut = TimeSpan.MaxValue; + + /// State machine state (NVT state) + nvtState = NvtState.AwaitingConnect; + + /// Builds the response from particular 'ds'-es + StringBuilder responseBuilder = new StringBuilder(); + + Command cmd = new Command(CmdAction.VOID); /// Command from the command queue + string ds = null; /// String received from TCP + + while (true) + { + bool pollCmd = (nvtState == NvtState.AwaitingConnect || nvtState == NvtState.Session || nvtState == NvtState.Measurement); + bool pollTcp = (nvtState != NvtState.AwaitingConnect && nvtState != NvtState.Login); + + /// + /// NVT state machine event read. Contains (blocking) cmdQueue and TCP reads. + /// Possible events are: + /// NvtEvent.Terminate ....... cmd.Action==CmdAction.TERMINATE occurred + /// NvtEvent.CmdReceived ..... command 'cmd' received from the command queue + /// NvtEvent.TcpReceived ..... string 'ds' received from the TCP + /// NvtEvent.ConnectionLost .. TCP connection lost (when reading TCP) + /// NvtEvent.Timeout ......... timeout occurred + /// + NvtEvent nvtEvent = NvtWaitLoop(pollCmd, pollTcp, ref cmd, ref ds); + Debug.WriteLine("nvtEvent = " + nvtEvent.ToString() + ", cmd = " + cmd.ToString() + + ((ds!=null && ds.Length>0) ? (", ds = '" + ds + "'") : "") ); + + /// + /// NVT state machine state change, the event processing. + /// No command queue or TCP read can be done here. + /// + try + { + if (nvtEvent == NvtEvent.Terminate) + { + DisconnectTcp(); + return; /// Exit the thread + } + /// ------------------------------- + /// Process command available event + /// ------------------------------- + else if (nvtEvent == NvtEvent.CmdReceived) + { + if (cmd.Action == CmdAction.NOTIFICATION) + { + OnNotification(cmd.Str); + continue; + } + else if (cmd.Action == CmdAction.LABEL) + { + labelStr = cmd.Str; + log.Info("Starting to process Aux.Board Upgrade Item Nr." + labelStr); + continue; + } + else if (cmd.Action == CmdAction.SET_PROMPT) + { + prompt = cmd.Str; + continue; + } + else if (cmd.Action == CmdAction.CLEAR_RESPONSE) + { + responseBuilder.Clear(); + continue; + } + else if (cmd.Action == CmdAction.CONNECT && nvtState == NvtState.AwaitingConnect) + { + ParseHostString(cmd.Str); + connectTimeout = cmdStartTime + cmdTimeOut; + cmdTimeOut = TimeSpan.Zero; + nvtState = NvtState.Login; + continue; + } + else if (nvtState == NvtState.Session || nvtState == NvtState.Measurement) + { + switch (cmd.Action) + { + case CmdAction.SEND_STRING: + vt.WriteVt(cmd.Str + System.Environment.NewLine); + WriteLineTcp(cmd.Str); + OnVtTextChanged(); + break; + + case CmdAction.SEND_MSRMNT_CMD: + vt.WriteVt(cmd.Str + System.Environment.NewLine); + WriteLineTcp(cmd.Str); + OnVtTextChanged(); + /// state change + responseBuilder.Clear(); + nvtState = NvtState.Measurement; + break; + + case CmdAction.SEND_COMMAND: + vt.WriteVt(cmd.Str + System.Environment.NewLine); + WriteLineTcp(cmd.Str); + OnVtTextChanged(); + /// state change + responseBuilder.Clear(); + nvtState = NvtState.WaitResponse; + break; + + case CmdAction.DISCONNECT: + if (RetVal.OK == DisconnectTcp()) + { + cmdTimeOut = TimeSpan.MaxValue; + nvtState = NvtState.AwaitingConnect; + } + else + { + cmdTimeOut = TimeSpan.MaxValue; + nvtState = NvtState.Session; + } + break; + + case CmdAction.REBOOT_RECONNECT: + vt.WriteVt(RebootCommand + System.Environment.NewLine); + WriteLineTcp(RebootCommand); + OnVtTextChanged(); + connectTimeout = cmdStartTime + cmdTimeOut; /// Both were set when REBOOT_RECONNECT was dequeued + cmdTimeOut = TimeSpan.FromMilliseconds(DelayAfterRebootMs); + responseBuilder.Clear(); + nvtState = NvtState.WaitReboot; + break; + + case CmdAction.EXIT_RECONNECT: + if (RetVal.OK != DisconnectTcp()) + { + cmdTimeOut = TimeSpan.MaxValue; + nvtState = NvtState.Session; + break; + } + connectTimeout = cmdStartTime + cmdTimeOut; + cmdTimeOut = TimeSpan.Zero; + nvtState = NvtState.Login; + break; + + default: + break; + } + continue; + } + } + /// -------------------------------- + /// Process TCP data available event + /// -------------------------------- + else if (nvtEvent == NvtEvent.TcpReceived) + { + switch (nvtState) + { + case NvtState.Session: + if (ds.Length > 0) + { + vt.WriteVt(ds); + OnVtTextChanged(); + } + break; + + case NvtState.Measurement: + if (ds.Length > 0) + { + vt.WriteVt(ds); + responseBuilder.Append(ds); + OnVtTextChanged(); + } + { + /// Extract measurements + int from = responseBuilder.ToString().IndexOf('['); + if (from >= 0) + { + int len = responseBuilder.ToString(from + 1, responseBuilder.Length - from - 1).IndexOf(']'); + + if (len >= 0) + { + OnMeasurementDataReceived(this, new MeasuredDataEventArgs(responseBuilder.ToString(from + 1, len))); + responseBuilder.Remove(0, from + len + 2); + } + } + } + break; + + case NvtState.WaitResponse: + if (ds.Length > 0) + { + vt.WriteVt(ds); + responseBuilder.Append(ds); + OnVtTextChanged(); + } + + /// Raise OnPromptReceived(response) and clear responseBuilder when prompt detected. + if (responseBuilder.ToString().EndsWith(prompt)) + { + completeResponse = responseBuilder.ToString(0, responseBuilder.Length - prompt.Length); + responseBuilder.Clear(); + + cmdStartTime = DateTime.Now; /// Reset timeout + cmdTimeOut = TimeSpan.MaxValue; + nvtState = NvtState.Session; /// Normal program flow + + OnPromptReceived(completeResponse); + + if (cmd.FatalRegex != null) + { + /// Check for a fatal error + Match match = cmd.FatalRegex.Match(completeResponse); + if (match.Success) + { + cmdTimeOut = TimeSpan.MaxValue; + DisconnectTcp(); /// Disconnect first + nvtState = NvtState.AwaitingConnect; + OnFatalError(GetRegexSubstring(match)); + continue; + } + } + + if (cmd.ErrorRegex != null) + { + /// Check for an error + Match match = cmd.ErrorRegex.Match(completeResponse); + if (match.Success) OnAddMessage(Category.Error, GetRegexSubstring(match)); + } + + if (cmd.WarningRegex != null) + { + /// Check for a warning + Match match = cmd.WarningRegex.Match(completeResponse); + if (match.Success) OnAddMessage(Category.Warning, GetRegexSubstring(match)); + } + + if (cmd.SuccessRegex != null) + { + /// Check for a success + Match match = cmd.SuccessRegex.Match(completeResponse); + if (match.Success) OnAddMessage(Category.Success, GetRegexSubstring(match)); + } + } + break; + + case NvtState.WaitReboot: + if (ds.Length > 0) + { + vt.WriteVt(ds); + responseBuilder.Append(ds); + OnVtTextChanged(); + } + + /// Check the expected response after 'reboot' command. + if (responseBuilder.ToString().EndsWith("Sending SIGTERM to all processes.\r\n")) + { + responseBuilder.Clear(); + if (RetVal.OK == DisconnectTcp()) + { + cmdTimeOut = TimeSpan.FromMilliseconds(DelayAfterRebootMs); + nvtState = NvtState.Login; + } + else + { + cmdTimeOut = TimeSpan.MaxValue; + nvtState = NvtState.Session; + } + } + break; + + default: + break; + } + continue; + } + /// --------------------------------- + /// Process TCP connection lost event + /// --------------------------------- + else if (nvtEvent == NvtEvent.ConnectionLost) + { + DisconnectTcp(); + OnFatalError("Lost connection to telnet server " + hostname + ":" + portNr); + cmdTimeOut = TimeSpan.MaxValue; + nvtState = NvtState.AwaitingConnect; + continue; + } + /// --------------------- + /// Process timeout event + /// --------------------- + else if (nvtEvent == NvtEvent.Timeout) + { + cmdStartTime = DateTime.Now; /// Reset time after any timeout + + if (nvtState == NvtState.Login) + { + if (cmdStartTime > connectTimeout) + { + DisconnectTcp(); + OnFatalError("(Re)Connect timeout elapsed"); + cmdTimeOut = TimeSpan.MaxValue; + nvtState = NvtState.AwaitingConnect; + continue; + } + else + { + try + { + tcp = new TcpClient(hostname, portNr); + + log.Info("TCP client connected to " + hostname); + OnConnected(); + } + catch (SocketException) + { + /// Cannot connect if iCOM is busy rebooting. + /// No state change, retry connection after LoginRetryPeriodMs + cmdTimeOut = TimeSpan.FromMilliseconds(LoginRetryPeriodMs); + continue; + } + + prompt = defaultPrompt; /// Reset prompt to default + + if (RetVal.OK == Login(telnetUserName, telnetPassword)) + { + cmdTimeOut = TimeSpan.MaxValue; + nvtState = NvtState.Session; + continue; + } + else + { + log.Info("Telnet login refused " + hostname); + DisconnectTcp(); + + // No state change, retry connection after LoginRetryPeriodMs + cmdTimeOut = TimeSpan.FromMilliseconds(LoginRetryPeriodMs); + continue; + } + } + } + else if (nvtState == NvtState.WaitResponse) + { + DisconnectTcp(); /// Disconnect first + OnFatalError("Timeout occurred at Telnet command " + cmd.ToString()); + cmdTimeOut = TimeSpan.MaxValue; + nvtState = NvtState.AwaitingConnect; + continue; + } + } + } + catch (Exception e) + { + string msg = e.Message; + DisconnectTcp(); + OnDisconnected(); + OnFatalError("Lost connection to telnet server " + hostname + ":" + portNr + " Details: " + msg); + cmdTimeOut = TimeSpan.MaxValue; + nvtState = NvtState.AwaitingConnect; + } + } + } + + /// + /// Disconnect the TCP client. + /// + /// RetVal.OK or RetVal.Error + RetVal DisconnectTcp() + { + if (tcp == null || !tcp.Connected) + { + return RetVal.OK; /// Already disconnected + } + + tcp.Client.Shutdown(SocketShutdown.Both); + tcp.Client.BeginDisconnect(false, new AsyncCallback(DisconnectCallback), tcp.Client); /// (reuseSocket, callback, ...) + + /// Wait for the disconnect to complete. + disconnectDone.WaitOne(); + if (tcp.Client.Connected) + { + OnFatalError("Cannot disconnect from telnet server " + hostname + ":" + portNr); + return RetVal.Error; + } + + OnDisconnected(); + tcp = null; + return RetVal.OK; + } + + + /// + /// Callback method used by DisconnectTcp() + /// + /// IAsyncResult + void DisconnectCallback(IAsyncResult ar) + { + Socket client = (Socket)ar.AsyncState; + client.EndDisconnect(ar); /// Complete the disconnect request. + disconnectDone.Set(); /// Signal that the disconnect is complete. + } + + + /// + /// NVT state machine event read loop. + /// Possible events are: + /// NvtEvent.Terminate ....... cmd.Action==CmdAction.TERMINATE occurred + /// NvtEvent.CmdReceived ..... command 'cmd' received from the command queue + /// NvtEvent.TcpReceived ..... string 'ds' received from the TCP + /// NvtEvent.ConnectionLost .. TCP connection lost (when reading TCP) + /// NvtEvent.Timeout ......... timeout occurred + /// Notes: + /// 'pollCmd == false' means WaitResponse or Rebooting+Login is in progress, cmdQueue is not polled + /// + /// true = poll the command queue, false = don't (e.g. when nvtState=WaitPrompt) + /// true = poll TCP, false = don't (e.g. when nvtState=AwaitingConnect) + /// A command from the command queue + /// Received string from the TCP + /// NVT event + NvtEvent NvtWaitLoop(bool pollCmd, bool pollTcp, ref Command cmd, ref string ds) + { + while (true) + { + DateTime dateTimeNow = DateTime.Now; /// Current time is read at this single place in the loop + + if (CmdQueuePeek().Action == CmdAction.TERMINATE) + { + /// On program exit + return NvtEvent.Terminate; + } + else if ((cmdTimeOut != TimeSpan.MaxValue) && (dateTimeNow >= (cmdStartTime + cmdTimeOut))) + { + return NvtEvent.Timeout; + } + else if (pollCmd && (cmdQueueCount > 0)) + { + /// In NvtState.AwaitingCmg when queue is not empty + cmd = Dequeue(); + return (cmd.Action == CmdAction.TERMINATE) ? NvtEvent.Terminate : NvtEvent.CmdReceived; + } + else if (pollTcp) + { + /// In NvtState.Session, NvtState.WaitResponse and NvtState.WaitReboot + try + { + if (tcp.Client.Poll(1000 * TimeIncrementMs, SelectMode.SelectRead)) /// Blocking, time is in microseconds + { + ds = ReadTcp(tcp); + return NvtEvent.TcpReceived; + } + } + catch (Exception) + { + return NvtEvent.ConnectionLost; + } + } + else + { + if (!pollCmd) + { + /// The remaining time out period is always positive, conversion done from ticks (100ns) to ms + int remainingTimeoutMs = (int)(((cmdStartTime + cmdTimeOut).Ticks - dateTimeNow.Ticks) / 10000); + + if ((cmdTimeOut != TimeSpan.MaxValue) && (0 < remainingTimeoutMs) && (remainingTimeoutMs < TimeIncrementMs)) + { + Thread.Sleep(remainingTimeoutMs); + } + else + { + Thread.Sleep(TimeIncrementMs); + } + } + else if (queueEvent.WaitOne(TimeIncrementMs, false) && (cmdQueueCount > 0)) + { + /// In NvtState.AwaitingConnect when queue was empty and one element was just enqueued + cmd = Dequeue(); + return cmd.Action == CmdAction.TERMINATE ? NvtEvent.Terminate : NvtEvent.CmdReceived; + } + } + } + } + + + /// + /// Parse the host + port number string, update hostname and portNr variables. + /// + /// Example: "192.168.254.50" or "192.168.254.108:23" + void ParseHostString(string hostStr) + { + /// Extract a hostname (or IP address) and a port number from cmd.Str + int colonPos = hostStr.IndexOf(':'); + if (colonPos == -1) + { + hostname = hostStr; + portNr = DefaultTelnetPortNumber; + } + else + { + hostname = hostStr.Substring(0, colonPos); + portNr = Convert.ToUInt16(hostStr.Substring(colonPos + 1)); + } + } + + + /// + /// Login to the telnet server. + /// Returns a response (a prompt) received after a login. + /// + /// User name + /// Password + /// RetVal.OK, RetVal.Timeout, RetVal.NoTcpConnection + RetVal Login(string username, string password) + { + if (username == null || password == null) return RetVal.LoginRejected; + + /// + /// Username + /// + RetVal retval = WaitForLoginPrompt(": ", skipFirstLine); + if (retval != RetVal.OK) return retval; + vt.WriteVt(username + System.Environment.NewLine); + WriteLineTcp(username); + + /// + /// Password (hidden on the VT) + /// + retval = WaitForLoginPrompt(": ", false); + if (retval != RetVal.OK) return retval; + WriteLineTcp(password); + + /// + /// Reset 'prompt' after (re)login and wait for the prompt + /// + retval = WaitForLoginPrompt(prompt, false); + if (retval != RetVal.OK) return retval; + + log.Info("Telnet login successfully completed " + hostname); + + return RetVal.OK; + } + + /// + /// One part of login which is reused. + /// + /// Quit condition, login prompt should end with this pattern + /// + RetVal WaitForLoginPrompt(string endsWithPattern, bool skipFirstLine) + { + StringBuilder s = new StringBuilder(); + + do { + Command cmd = new Command(CmdAction.VOID); /// Command from the command queue + string ds = null; /// String received from TCP + + cmdStartTime = DateTime.Now; + cmdTimeOut = TimeSpan.FromMilliseconds(LoginTimeOutMs); + + NvtEvent retval = NvtWaitLoop(false, true, ref cmd, ref ds); /// No cmd poll, do only TCP poll + Debug.WriteLine("retval = " + retval.ToString() + ", cmd = " + cmd.ToString() + + ((ds != null && ds.Length > 0) ? (", ds = '" + ds + "'") : "")); + + if (retval == NvtEvent.Timeout) + { + return RetVal.Timeout; + } + else if (retval != NvtEvent.TcpReceived) + { + return RetVal.NoTcpConnection; + } + + if (ds != null && ds.Length > 0) + { + if (skipFirstLine) + { + if (ds.Contains(Environment.NewLine)) + { + skipFirstLine = false; + string afterNL = ds.Substring(ds.IndexOf(Environment.NewLine) + Environment.NewLine.Length); + if (afterNL.Length > 0) + { + vt.WriteVt(afterNL); + s.Append(afterNL); + OnVtTextChanged(); + } + } + } + else + { + vt.WriteVt(ds); + s.Append(ds); + OnVtTextChanged(); + } + } + } + while (!s.ToString().EndsWith(endsWithPattern)); + + return RetVal.OK; + } + + + string GetRegexSubstring(Match match) + { + Group group = match.Groups[0]; + if (group.Success) return group.Value; + + // No group defined but expression matched anyway, + // return the matched substring instead + return match.Value; + } + + + /// + /// Sends a string to the telnet server. + /// + /// String to be sent + void WriteTcp(string str) + { + Debug.WriteLine("WriteTcp(" + str.Replace("\n", "") + ")"); + if (!tcp.Connected) return; + + byte[] buf = System.Text.ASCIIEncoding.ASCII.GetBytes(str.Replace("\0xFF", "\0xFF\0xFF")); + tcp.GetStream().Write(buf, 0, buf.Length); + } + + /// + /// Sends a line to the telnet server - terminating '\n' is appended to the string 'str'. + /// + /// Line to be sent without terminaitng '\n' character(s). + void WriteLineTcp(string str) + { + WriteTcp (str + "\n"); + } + + /// + /// Read a string from telnet until no characters available. + /// + string ReadTcp(TcpClient tcp) + { + if (!tcp.Connected) return null; + + StringBuilder strBldr = new StringBuilder(); + ParseTelnet(strBldr); + + return strBldr.ToString(); + } + + /// + /// Parse telnet stream of characters. + /// + void ParseTelnet(StringBuilder strBldr) + { + while (tcp.Available > 0) + { + NvtCommand input = (NvtCommand)tcp.GetStream().ReadByte(); + switch (input) + { + case NvtCommand.NA: + break; + case NvtCommand.IAC: + /// Interpret as command + NvtCommand inputCmd = (NvtCommand)tcp.GetStream().ReadByte(); + if (inputCmd == NvtCommand.NA) break; + + switch (inputCmd) + { + case NvtCommand.IAC: + /// Literal IAC = 255 escaped, so append char 255 to the string + strBldr.Append(inputCmd); + break; + + case NvtCommand.DO: + case NvtCommand.DONT: + case NvtCommand.WILL: + case NvtCommand.WONT: + /// Reply to all commands with "WONT", unless it is SGA (suppres go ahead) + NvtOption inputOpt = (NvtOption)tcp.GetStream().ReadByte(); + if (inputOpt == NvtOption.NA) break; + + tcp.GetStream().WriteByte((byte)NvtCommand.IAC); + if (inputOpt == NvtOption.SGA) + { + if (inputCmd == NvtCommand.DO) + tcp.GetStream().WriteByte((byte)NvtCommand.WILL); + else + tcp.GetStream().WriteByte((byte)NvtCommand.DO); + } + else + { + if (inputCmd == NvtCommand.DO) + tcp.GetStream().WriteByte((byte)NvtCommand.WONT); + else + tcp.GetStream().WriteByte((byte)NvtCommand.DONT); + } + tcp.GetStream().WriteByte((byte)inputOpt); + break; + + default: + break; + } + break; + default: + strBldr.Append( (char)input ); + break; + } + } + } + + /// + /// Public properties (read only) + /// + public IVirtualTerminal Vt { get { return vt; } } + public string Hostname { get { return hostname; } } + public string NotificationText { get { return notificationText; } } + public string ErrorText { get { return fatalErrorText; } } + public IList AuxBrdUpgMessages { get { return auxBrdUpgMessages; } } + + /// + /// true when there are command-s in cmdQueue + /// + public bool InProgress + { + get { return (cmdQueueCount > 0); } + } + + /// + /// Public methods (self explanatory) + /// + public void ResetNotificationText() { notificationText = null; } + public void ResetErrorText() { fatalErrorText = null; } + public void ResetCollectedMessages() + { + auxBrdUpgMessages = null; + } + + /// + /// Resets the progress to 0%. To be used before enqueing commands + /// when starting upgrade (the 2nd and each next time). + /// + public void ResetProgress() + { + lock (cmdQueue) + { + timeDone = 0; + } + } + + /// + /// Clear VT screen + /// + public void ClearScreen() + { + vt.ClearScreen(); + } + + /// + /// Insert a telnet client command to the FIFO queue 'cmdQueue' + /// to be processed then by the worker thread. + /// + /// Command : a pair CmdAction, string + public void Enqueue(Command cmd) + { + lock (cmdQueue) + { + cmdQueue.Enqueue(cmd); + queueEvent.Set(); + } + } + + /// + /// Get a command from the FIFO queue 'cmdQueue'. + /// Called by the worker thread when commands are really processed. + /// Does also auxiliary actions, resets cmdStartTime time, etc. + /// + /// Command : a pair CmdAction, string + Command Dequeue() + { + Command nextCmd; + bool queueJustEmptied = false; + + try + { + lock (cmdQueue) + { + queueJustEmptied = (cmdQueue.Count == 1); + nextCmd = cmdQueue.Dequeue(); + } + + log.Info("Command: " + nextCmd.ToString()); + } + catch + { + log.Debug("Debug: Attempt to read a command from an empty queue."); + nextCmd = new Command(CmdAction.VOID); + } + + cmdStartTime = DateTime.Now; + if (nextCmd.Timeout > 0) + { + cmdTimeOut = new TimeSpan(0, 0, nextCmd.Timeout); /// in seconds + } + else + { + cmdTimeOut = TimeSpan.MaxValue; /// no timeout (timeout = weeks) + } + + lock (cmdQueue) + { + if (currentCmd.Duration >= 0) + { + timeDone += currentCmd.Duration; + } + } + + if (queueJustEmptied && nextCmd.Action != CmdAction.TERMINATE) + { + IssueSummary(); + } + + currentCmd = nextCmd; + return currentCmd; + } + + /// + /// Progress info to be polled by UI routines. + /// Info is based on the commands in the queue and 'timeDone' + /// Is thread safe, merely reads some fields and does safe calculations. + /// + /// [sec] + /// [sec] + public void ProgressInfo(ref int timeDone, ref int timeTodo) + { + Command[] cmds; + lock (cmdQueue) + { + cmds = cmdQueue.ToArray(); + timeDone = this.timeDone; + } + timeTodo = currentCmd.Duration; + for (int i = 0; i < cmds.GetLength(0); i++) + { + timeTodo += cmds[i].Duration; + } + return; + } + + + + public event EventHandler connectedHandler; + + /// + /// This method is called from within this class when a telnet connection + /// was established and user was successfully logged in. + /// + protected virtual void OnConnected() + { + Debug.WriteLine("TelnetClient:OnConnected"); + log.Warn("Connected"); + + if (null != connectedHandler) + { + try + { + connectedHandler(objRef, System.EventArgs.Empty); + } + catch (Exception e) + { + log.Info("Internal error: ConnectedHandler exception: " + e.Message); + } + } + } + + + + public event EventHandler disconnectedHandler; + + /// + /// This method is called from within this class when the telnet connection was broken. + /// + protected virtual void OnDisconnected() + { + Debug.WriteLine("TelnetClient:OnDisconnected"); + log.Warn("Disconnected"); + + if (null != disconnectedHandler) + { + try + { + disconnectedHandler(objRef, System.EventArgs.Empty); + } + catch (Exception e) + { + log.Info("Internal error: DisconnectedHandler exception: " + e.Message); + } + } + } + + + + /// + /// VtTextChangedEventHandler delegate and handler + /// + public delegate void VtTextChangedEventHandler(object sender, VtTextChangedEventArgs e); + public event VtTextChangedEventHandler vtTextChangedHandler; + + /// + /// This method is called from within this class when the contents of virtual terminal has changed. + /// + protected virtual void OnVtTextChanged() + { + if (null != vtTextChangedHandler) + { + try + { + vtTextChangedHandler(objRef, new VtTextChangedEventArgs(vt.Text)); + } + catch (Exception e) + { + log.Info("Internal error: VtTextChangedHandler exception: " + e.Message); + } + } + } + + + + + /// + /// MeasurementDataReceivedHandler handler + /// + public event EventHandler MeasurementDataReceivedHandler; + + /// + /// This method is called from within this class when measurement data were extracted. + /// + public void OnMeasurementDataReceived(object sender, MeasuredDataEventArgs msrmtData) + { + if (MeasurementDataReceivedHandler == null) return; + try { MeasurementDataReceivedHandler(sender, msrmtData); } + catch (Exception e) { log.Error("MeasurementDataReceivedHandler(...) failed", e); } + } + + + /// + /// PromptReceviedEventHandler delegate and handler + /// + public delegate void PromptReceivedEventHandler(object sender, PromptReceivedEventArgs e); + public event PromptReceivedEventHandler promptReceivedHandler; + + /// + /// This method is called from within this class when + /// a prompt string was received from the telnet server. + /// + protected virtual void OnPromptReceived(string response) + { + Debug.WriteLine("TelnetClient:OnPromptReceived"); + log.Info("Prompt received, response:" + Environment.NewLine + completeResponse); + + if (null != promptReceivedHandler) + { + try + { + promptReceivedHandler(objRef, new PromptReceivedEventArgs(response)); + } + catch (Exception e) + { + log.Info("Internal error: PromptReceivedHandler exception: " + e.Message); + } + } + } + + + + /// + /// NotificationEventHandler delegate and handler + /// + public delegate void NotificationEventHandler(object sender, NotificationEventArgs e); + public event NotificationEventHandler notificationHandler; + + /// + /// This method is called from within this class when the command processing loop + /// receives a Command with Action==NOTIFICATION. This can be used for synchronization. + /// + protected virtual void OnNotification(string notificationText) + { + Debug.WriteLine("TelnetClient:OnNotification"); + log.Info("Notification: " + notificationText); + + this.notificationText = notificationText; + if (null != notificationHandler) + { + try + { + notificationHandler(objRef, new NotificationEventArgs(notificationText)); + } + catch (Exception e) + { + log.Info("Internal error: NotificationHandler exception: " + e.Message); + } + } + } + + + + /// + /// FatalEventHandler delegate and handler + /// + public delegate void FatalEventHandler(object sender, FatalEventArgs e); + public event FatalEventHandler fatalErrorHandler; + + /// + /// This method is called from within this class when a fatal error occurs. + /// + protected virtual void OnFatalError(string fatalErrorText) + { + Debug.WriteLine("TelnetClient:OnFatalError(" + fatalErrorText + ")"); + log.FatalFormat("Fatal: {0}", fatalErrorText); + + /// Skip the remaining command queue actions (except of TERMINATE) + CmdQueueClear(); + + this.fatalErrorText = fatalErrorText; + + state = TelnetState.FatalError; + + if (null != fatalErrorHandler) + { + try + { + fatalErrorHandler(objRef, new FatalEventArgs(fatalErrorText)); + } + catch (Exception e) + { + log.Info("Internal fatal: FatalHandler exception: " + e.Message); + } + } + } + + + + /// + /// SummaryEventHandler delegate and handler + /// + public delegate void SummaryEventHandler(object sender, SummaryEventArgs e); + public event SummaryEventHandler showSummaryHandler; + + /// + /// This method is called from within this class when a error occurs. + /// Error does not interrupt the processing. It merely buffers the error. + /// The error is issued to UI when the queue is empty (the upgrade is complete) + /// + protected virtual void OnAddMessage(Category category, string messageText) + { + Debug.WriteLine("TelnetClient:OnAddMessage"); + log.WarnFormat("Aux.Board Upgrade Item Nr.{0} {1}({2})", labelStr, category, messageText); + + if (category == Category.Error) state = TelnetState.Error; + + if (auxBrdUpgMessages == null) + { + auxBrdUpgMessages = new List(); + } + auxBrdUpgMessages.Add(new AuxBrdUpgItemMessage(category, labelStr, messageText)); + } + + /// + /// Issued the collected errors to the UI when the queue is empty (the upgrade is complete). + /// + protected virtual void IssueSummary() + { + if (state == TelnetState.BusyFinal || state == TelnetState.Inactive) + { + state = TelnetState.Inactive; + return; + } + + if (state == TelnetState.Busy) state = TelnetState.Success; /// Success in case there wasn't an error so far + + if (null != showSummaryHandler) + { + try + { + showSummaryHandler(objRef, new SummaryEventArgs(auxBrdUpgMessages)); + } + catch (Exception e) + { + log.Info("Internal error: SummaryEventHandler exception: " + e.Message); + } + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Telnet/VirtualTerminal.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Telnet/VirtualTerminal.cs new file mode 100644 index 00000000..b137dab8 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Network/Telnet/VirtualTerminal.cs @@ -0,0 +1,233 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Diagnostics; + +namespace TBF.BenchControl.Network.Telnet +{ + /// + /// Virtual terminal (an array of characters). + /// This class is thread safe under these circumstances: + /// - ClearScreen() and WriteVt() methods called from one thread only + /// - properties Text, etc. can be safely read from an arbitrary thread + /// + public class VirtualTerminal : IVirtualTerminal + { + const uint DefaultVtRowsCount = 80; /// Default VT height (number of rows) + const uint DefaultVtColumnsCount = 132; /// Default VT width (number of columns) + + /// + /// Virtual terminal special characters. + /// + /// + enum SpecialChar + { + BS = 8, /// 8 = Backspace (move one position to the left) + HT, /// 9 = Horizontal tab + LF, /// 10 = Line feed + VT, /// 11 = Vertical tab + FF, /// 12 = Form feed (on visual displays most commonly clears the screen) + CR /// 13 = Carriage return + } + + + /// + /// Public properties + /// + public uint Rows { get { return vtRows; } } + public uint Columns { get { return vtColumns; } } + public uint CurRow { get { return curRow; } } + public uint CurColumn { get { return curColumn; } } + + /// + /// Virtual terminal text buffer as a single string. To be printed out using monospaced font. + /// + public string Text + { + get + { + string result = ""; + char[] oneRow = new char[vtColumns]; + + for (int row = 0; row < vtRows; row++) + { + for (int column = 0; column < vtColumns; column++) + { + oneRow[column] = vt[row, column]; + } + result += new String(oneRow); + + /// New line at the end of each line except of the last one + if (row < vtRows - 1) result += System.Environment.NewLine; + } + return result; + } + } + + + /// + /// Private fields + /// + char[,] vt; /// Virtual terminal text buffer + uint vtRows = 0; /// VT height (number of rows) + uint vtColumns = 0; /// VT width (number of columns) + uint curRow = 0; /// Current row (cursor position) + uint curColumn = 0; /// Current column (cursor position) + + + /// + /// Default constructor. + /// + public VirtualTerminal() + { + vt = new char[DefaultVtRowsCount, DefaultVtColumnsCount]; + if (vt != null) + { + vtRows = DefaultVtRowsCount; + vtColumns = DefaultVtColumnsCount; + ClearScreen(); + } + } + + /// + /// Arbitrary VT size constructor. + /// + public VirtualTerminal(uint nrRows, uint nrColumns) + { + vt = new char[nrRows, nrColumns]; + if (vt != null) + { + vtRows = nrRows; + vtColumns = nrColumns; + ClearScreen(); + } + } + + /// + /// Clear VT. + /// + public void ClearScreen() + { + for (uint row = 0; row < vtRows; row++) + { + for (uint column = 0; column < vtColumns; column++) + { + vt[row, column] = ' '; + } + } + curRow = 0; + curColumn = 0; + } + + /// + /// Scroll VT one line up and clear the bottom line. + /// + void ScrollUp() + { + for (uint row = 0; row < vtRows - 1; row++) + { + for (uint column = 0; column < vtColumns; column++) + { + vt[row, column] = vt[row + 1, column]; + } + } + for (uint column = 0; column < vtColumns; column++) + { + vt[vtRows - 1, column] = ' '; + } + } + + /// + /// Write one regular printable character to VC. + /// + void WritePrintableChar(char c) + { + vt[curRow, curColumn] = c; + if (curColumn < vtColumns - 1) + { + curColumn++; + } + else if (curRow < vtRows - 1) + { + curRow++; + curColumn = 0; + } + else + { + ScrollUp(); + curRow = vtRows - 1; + curColumn = 0; + } + } + + /// + /// Write one character to VT (regular or special). + /// + public void WriteVt(char c) + { + if (c >= 32 && c <= 127) + { + WritePrintableChar(c); + } + else + { + switch ((SpecialChar)c) + { + /// Carriage return + case SpecialChar.CR: + curColumn = 0; + break; + + /// Line feed + case SpecialChar.LF: + if (curRow < vtRows - 1) + { + curRow++; + } + else + { + ScrollUp(); + curRow = vtRows - 1; + } + break; + + /// Form feed (= clear screen) + case SpecialChar.FF: + ClearScreen(); + break; + + /// Backspace + case SpecialChar.BS: + if (curColumn > 0) + { + vt[curRow, --curColumn] = ' '; + } + else if (curRow > 0) + { + curColumn = vtColumns - 1; + vt[--curRow, curColumn] = ' '; + } + break; + + default: + break; + } + } + } + + /// + /// Write a string to VT. + /// + public void WriteVt(string txt) + { + if (txt != null) + { + for (int i = 0; i < txt.Length; i++) + { + WriteVt(txt[i]); + } + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/AskYesNoForm.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/AskYesNoForm.Designer.cs new file mode 100644 index 00000000..61b456f6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/AskYesNoForm.Designer.cs @@ -0,0 +1,96 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.Operations +{ + partial class AskYesNoForm + { + /// + /// 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() + { + this.yesButton = new System.Windows.Forms.Button(); + this.noButton = new System.Windows.Forms.Button(); + this.questionLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // yesButton + // + this.yesButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.yesButton.ForeColor = System.Drawing.Color.Black; + this.yesButton.Location = new System.Drawing.Point(311, 97); + this.yesButton.Name = "yesButton"; + this.yesButton.Size = new System.Drawing.Size(98, 63); + this.yesButton.TabIndex = 1; + this.yesButton.Text = "Yes"; + this.yesButton.UseVisualStyleBackColor = true; + this.yesButton.Click += new System.EventHandler(this.yesButton_Click); + // + // noButton + // + this.noButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.noButton.ForeColor = System.Drawing.Color.Black; + this.noButton.Location = new System.Drawing.Point(176, 97); + this.noButton.Name = "noButton"; + this.noButton.Size = new System.Drawing.Size(98, 63); + this.noButton.TabIndex = 2; + this.noButton.Text = "No"; + this.noButton.UseVisualStyleBackColor = true; + this.noButton.Click += new System.EventHandler(this.noButton_Click); + // + // questionLabel + // + this.questionLabel.AutoSize = true; + this.questionLabel.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.questionLabel.Location = new System.Drawing.Point(34, 39); + this.questionLabel.Name = "questionLabel"; + this.questionLabel.Size = new System.Drawing.Size(105, 23); + this.questionLabel.TabIndex = 4; + this.questionLabel.Text = "Question?"; + // + // AskYesNoForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Goldenrod; + this.ClientSize = new System.Drawing.Size(587, 201); + this.Controls.Add(this.questionLabel); + this.Controls.Add(this.noButton); + this.Controls.Add(this.yesButton); + this.Name = "AskYesNoForm"; + this.Text = "Question"; + this.TopMost = true; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button yesButton; + private System.Windows.Forms.Button noButton; + private System.Windows.Forms.Label questionLabel; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/AskYesNoForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/AskYesNoForm.cs new file mode 100644 index 00000000..cb46a1bd --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/AskYesNoForm.cs @@ -0,0 +1,57 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Drawing; +using System.Windows.Forms; +using TBF.Resources; + +namespace TBF.BenchControl.Operations +{ + public partial class AskYesNoForm : Form + { + /// One of the following two variables set to 'true' when the form closes + public bool CompletedYes; + public bool CompletedNo; + + + public AskYesNoForm(string question) + { + InitializeComponent(); + ControlBox = false; + + Localize(); + questionLabel.Text = question; + + float textWidth = Graphics.FromImage(new Bitmap(1, 1)).MeasureString(questionLabel.Text, questionLabel.Font).Width; + int rqrdFormWidth = (int)textWidth + 80; /// Form width calculated from the text width + + if (rqrdFormWidth > Width) + { + int shift = (rqrdFormWidth - Width) / 2; + Width = rqrdFormWidth; + yesButton.Left += shift; + noButton.Left += shift; + } + } + + void Localize() + { + yesButton.Text = Strings.YesBtn; + noButton.Text = Strings.NoBtn; + Text = Strings.Question; + } + + private void yesButton_Click(object sender, EventArgs e) + { + CompletedYes = true; + Close(); + } + + private void noButton_Click(object sender, EventArgs e) + { + CompletedNo = true; + Close(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/AskYesNoForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/AskYesNoForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/AskYesNoForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/AskYesNoOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/AskYesNoOp.cs new file mode 100644 index 00000000..589825bc --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/AskYesNoOp.cs @@ -0,0 +1,57 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using TBF.BenchControl; +using TBF.Resources; + +namespace TBF.BenchControl.Operations +{ + public class AskYesNoOp : IOperation + { + AskYesNoForm modelessDlg; + + string question; + + /// Reference to the operation + public AskYesNoOp() + : this(Strings.Question) + { + } + + public AskYesNoOp(string question) + { + this.question = question; + } + + delegate void AskYesNoFormDlgt(AskYesNoOp myRef); + /// + void OpenFormDlg(AskYesNoOp myRef) + { + myRef.modelessDlg = new AskYesNoForm(question); + modelessDlg.Show(); + } + + /// Start this operation + public void Start() + { + Program.MainWnd.Invoke(new AskYesNoFormDlgt(OpenFormDlg), this); + } + + /// Run this operation + /// Event.ResultsPrinted + public Event Run() + { + if (modelessDlg.CompletedYes) return Event.Yes; + if (modelessDlg.CompletedNo) return Event.No; + return Event.None; + } + + /// Stop this operation + public void Stop() + { + modelessDlg = null; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/CheckUIOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/CheckUIOp.cs new file mode 100644 index 00000000..f651de58 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/CheckUIOp.cs @@ -0,0 +1,125 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using log4net; +using TBF.UiBridge; + +namespace TBF.BenchControl.Operations +{ + /// + /// Implements User Interface input for the state machine. + /// UI inserts commands int a queue (FIFO buffer). + /// UiBridgeOp class reads the queue and generates events that + /// in turn control state transitions in the state machine. + /// + public class CheckUIOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(CheckUIOp)); + public override string ToString() { return "CheckUIOp(" + clearInputQueue.ToString() + ")"; } + + /// Set by constructors + bool clearInputQueue; + + /// + /// Check input from UI for the state machine. + /// Events: Start,Stop,Cycle,Purge,LetOutLine,LetOutBalance,TestOpticalHeads,ResetResults,Calibration,SensitivityTest + /// + /// true = clear queue on start + public CheckUIOp(bool clearInputQueue) + { + this.clearInputQueue = clearInputQueue; + } + public CheckUIOp() + : this(false) + { + } + + void UiEventHandlerMethod(UI2BenchCmd cmd) + { + lock (Bridge.Ui2MachineQueue) + { + Bridge.Ui2MachineQueue.Enqueue(cmd); + } + } + + public void Start() + { + if (clearInputQueue) + { + lock (Bridge.Ui2MachineQueue) + { + Bridge.Ui2MachineQueue.Clear(); + } + } + } + + public Event Run() + { + UI2BenchCmd cmd; + + lock (Bridge.Ui2MachineQueue) + { + if (Bridge.Ui2MachineQueue.Count <= 0) return Event.None; + + if (Bridge.Ui2MachineQueue.Contains(UI2BenchCmd.Stop)) + { + do { + cmd = Bridge.Ui2MachineQueue.Dequeue(); + } + while (cmd != UI2BenchCmd.Stop); + } + else if (Bridge.Ui2MachineQueue.Contains(UI2BenchCmd.Shutdown)) + { + do { + cmd = Bridge.Ui2MachineQueue.Dequeue(); + } + while (cmd != UI2BenchCmd.Shutdown); + } + else + { + cmd = Bridge.Ui2MachineQueue.Dequeue(); + } + } + + switch (cmd) + { + /// Bench Control Panel buttons + case UI2BenchCmd.ReloadBatch: return Event.UiCmdReloadBatch; + case UI2BenchCmd.StartTest: return Event.UiCmdStartTest; + case UI2BenchCmd.StartQ1: return Event.UiCmdStartQ1; + case UI2BenchCmd.StartQ2: return Event.UiCmdStartQ2; + case UI2BenchCmd.StartQ3: return Event.UiCmdStartQ3; + case UI2BenchCmd.StartCycle: return Event.UiCmdStartCycle; + case UI2BenchCmd.Stop: return Event.UiCmdStop; + case UI2BenchCmd.PurgeBegin: return Event.UiCmdPurgeBegin; + case UI2BenchCmd.PurgeEnd: return Event.UiCmdPurgeEnd; + case UI2BenchCmd.DrainTank1: return Event.UiCmdDrainTank1; + case UI2BenchCmd.DrainTank2: return Event.UiCmdDrainTank2; + case UI2BenchCmd.DrainTank3: return Event.UiCmdDrainTank3; + case UI2BenchCmd.StopDrainingTank1: return Event.UiCmdStopDrainingTank1; + case UI2BenchCmd.StopDrainingTank2: return Event.UiCmdStopDrainingTank2; + case UI2BenchCmd.StopDrainingTank3: return Event.UiCmdStopDrainingTank3; + case UI2BenchCmd.Break: return Event.UiCmdBreak; + case UI2BenchCmd.ResetResults: return Event.UiCmdResetResults; + case UI2BenchCmd.AcceptResults: return Event.UiCmdAcceptResults; + case UI2BenchCmd.Shutdown: return Event.UiCmdShutdown; + case UI2BenchCmd.CameraTest: return Event.UiCmdCameraTest; + case UI2BenchCmd.SensitivityTest: return Event.UiCmdSensitivityTest; + case UI2BenchCmd.Custom: return Event.UiCmdCustom; + + case UI2BenchCmd.Next: return Event.Next; + + /// Test buttons + case UI2BenchCmd.B1: return Event.UiCmdB1; + case UI2BenchCmd.B2: return Event.UiCmdB2; + case UI2BenchCmd.B3: return Event.UiCmdB3; + + default: return Event.None; + } + } + + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/ClearResultsOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/ClearResultsOp.cs new file mode 100644 index 00000000..2f228bd6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/ClearResultsOp.cs @@ -0,0 +1,28 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using log4net; + +namespace TBF.BenchControl.Operations +{ + class ClearResultsOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(ClearResultsOp)); + public override string ToString() { return "ClearResultsOp"; } + + public void Start() + { + //Results.Clear(); + } + + public Event Run() + { + log.Info("Event.Done"); + return Event.Done; + } + + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/EmptyBalanceTankOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/EmptyBalanceTankOp.cs new file mode 100644 index 00000000..68ed449b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/EmptyBalanceTankOp.cs @@ -0,0 +1,54 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using log4net; + +namespace TBF.BenchControl.Operations +{ + /// + /// An empty operation. + /// + /// Constructors: + /// EmptyBalanceTank() + /// Start argument: + /// - + /// Events: + /// Event.None ... operation is in progress + /// + class EmptyBalanceTankOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(EmptyBalanceTankOp)); + public override string ToString() { return "EmptyBalanceTankOp"; } + + /// + /// Constructor + /// + public EmptyBalanceTankOp() + { + } + + /// + /// When started + /// + public void Start() + { + } + + /// + /// When running + /// + /// + public Event Run() + { + /// Must return some event + return Event.None; + } + + /// + /// When stopped + /// + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/EnduranceDataLoggingOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/EnduranceDataLoggingOp.cs new file mode 100644 index 00000000..1bc18bdd --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/EnduranceDataLoggingOp.cs @@ -0,0 +1,40 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using TBF.BenchControl.Sequences; + +namespace TBF.BenchControl.Operations +{ + public class EnduranceDataLoggingOp : IOperation + { + StreamWriter writer; + SequenceBase sequenceBase; + bool heatMeters; + + public EnduranceDataLoggingOp(StreamWriter writer, SequenceBase sequenceBase) + { + this.writer = writer; + this.sequenceBase = sequenceBase; + } + + public void Start() + { + sequenceBase.LogEnduranceData(writer); + } + + public Event Run() + { + sequenceBase.LogEnduranceData(writer); + return Event.None; + } + + public void Stop() + { + writer.Flush(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/EnthalpyCalculationOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/EnthalpyCalculationOp.cs new file mode 100644 index 00000000..adfe9b0e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/EnthalpyCalculationOp.cs @@ -0,0 +1,88 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using log4net; + +namespace TBF.BenchControl.Operations +{ + /// + /// Implements Eoperation to calculate (accumulate) enthalpies of heat meters + /// + /// Events: Event.None (always) + /// + public class EnthalpyCalculationOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(EnthalpyCalculationOp)); + public override string ToString() { return string.Format("EnthalpyCalculationOp(.,{0})", path.Name); } + + /// + /// Private fields + /// + HeatMetersPath path; + double[] enthalpy; + + int lastRefPulses; + + + public static EnthalpyCalculationOp GetOp(double[] enthalpy, HeatMetersPath path) + { + try + { + EnthalpyCalculationOp op = new EnthalpyCalculationOp(enthalpy, path); + return op; + } + catch (Exception exc) + { + log.ErrorFormat("Failed to create 'EnthalpyCalculationOp' operation: {0}", exc.Message); + return null; + } + } + + + /// + /// Constructors, optional argument is a timer name (you can create more then one timer) + /// + public EnthalpyCalculationOp(double[] enthalpy, HeatMetersPath path) + { + if (enthalpy == null) throw new Exception("enthalpy[] array missing"); + this.enthalpy = enthalpy; + + if (path == null) throw new Exception("path argument in EnthalpyCalculationOp constructor"); + } + + /// Time period (TimeSpan) + public void Start() + { + lastRefPulses = BenchControl.Sequences.ProcessData.RefPulses; + for (int i = 0; i < enthalpy.Length; i++) enthalpy[i] = 0; + } + + public Event Run() + { + AccumulateEnthalpy(); + return Event.None; + } + + public void Stop() + { + AccumulateEnthalpy(); + } + + private void AccumulateEnthalpy() + { + /// Calculate # of reference pulses + int newRefPulses = BenchControl.Sequences.ProcessData.RefPulses; + int deltaPulses = newRefPulses - lastRefPulses; + lastRefPulses = newRefPulses; + + /// Calculate volume [l] + float deltaVolume = (float)deltaPulses * BenchControl.Sequences.ProcessData.LtrPerRefPulse; + + for (int i = 0; i < enthalpy.Length; i++) + { + //enthalpy[i] += deltaVolume * (path.TempMetersWarm[i].ReadTemperature() - path.TempMetersCold[i].ReadTemperature()); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/LoadProcedureOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/LoadProcedureOp.cs new file mode 100644 index 00000000..591588ea --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/LoadProcedureOp.cs @@ -0,0 +1,88 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Threading; +using log4net; +using NHibernate; + +namespace TBF.BenchControl.Operations +{ + public class LoadProcedureOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(LoadProcedureOp)); + + Thread loaderThread; + bool error; + bool completed; + + /// + /// Events: Wait, ProcedureLoaded or Error + /// + public LoadProcedureOp() + { + error = false; + completed = false; + } + + /// Start this operation + public void Start() + { + if (loaderThread != null) + { + error = true; + return; + } + + loaderThread = new Thread(Loader); + loaderThread.Start(); + } + + void Loader() + { + try + { + ISession session = Config.FluentCommon.CreateSession(Users.Entities.DBKind.Config); + StateMachine.LoadPathsAndTransitions(session); + StateMachine.LoadProcedure(session, TBF.UiBridge.Bridge.SelectedProcedure.Name); + StateMachine.LoadProcedureParams(StateMachine.Procedure); + + completed = true; + } + catch (Exception) + { + error = true; + } + } + + /// Run this operation + /// + /// Event.Error, Event.ProcedureLoaded or Event.Wait + /// + public Event Run() + { + if (error) return Event.Error; + if (!completed) return Event.Wait; + + /// + /// Check for incomplete configuration mistakes + /// + if (StateMachine.Tests.Count == 0) return Event.ConfigurationError; + foreach (var test in StateMachine.Tests) + { + if (test.FeedingPath == null || test.BenchPath == null || + test.OutputPath == null || test.MetersPath == null) + { + return Event.ConfigurationError; + } + } + + return Event.ProcedureLoaded; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/MessageBoxForm.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/MessageBoxForm.Designer.cs new file mode 100644 index 00000000..51db86fe --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/MessageBoxForm.Designer.cs @@ -0,0 +1,83 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.Operations +{ + partial class MessageBoxForm + { + /// + /// 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() + { + this.okButton = new System.Windows.Forms.Button(); + this.messageLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // okButton + // + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(177, 99); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(98, 63); + this.okButton.TabIndex = 1; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // messageLabel + // + this.messageLabel.AutoSize = true; + this.messageLabel.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.messageLabel.Location = new System.Drawing.Point(34, 39); + this.messageLabel.Name = "messageLabel"; + this.messageLabel.Size = new System.Drawing.Size(91, 23); + this.messageLabel.TabIndex = 4; + this.messageLabel.Text = "Message"; + // + // MessageBoxForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Goldenrod; + this.ClientSize = new System.Drawing.Size(454, 201); + this.Controls.Add(this.messageLabel); + this.Controls.Add(this.okButton); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Name = "MessageBoxForm"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.TopMost = true; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.Label messageLabel; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/MessageBoxForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/MessageBoxForm.cs new file mode 100644 index 00000000..e20d5cf1 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/MessageBoxForm.cs @@ -0,0 +1,71 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.Drawing; +using System.Windows.Forms; +using TBF.Resources; + +namespace TBF.BenchControl.Operations +{ + public partial class MessageBoxForm : Form, GenericDevices.IHasCompleted + { + /// Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + + public MessageBoxForm(string message, Color backgroundColor) + { + InitializeComponent(); + ControlBox = false; + + Localize(); + messageLabel.Text = message; + BackColor = backgroundColor; + + float textWidth = Graphics.FromImage(new Bitmap(1, 1)).MeasureString(messageLabel.Text, messageLabel.Font).Width; + int rqrdFormWidth = (int)textWidth + 80; /// Form width calculated from the text width + + if (rqrdFormWidth > Width) + { + int shift = (rqrdFormWidth - Width) / 2; + Width = rqrdFormWidth; + okButton.Left += shift; + } + + completed = false; + StartForceCloseHandler(); + } + + void Localize() + { + okButton.Text = Strings.OkBtnText; + } + + private void okButton_Click(object sender, EventArgs e) + { + completed = true; + Close(); + } + + #region Forced close handling + + public void StartForceCloseHandler() + { + UiBridge.Bridge.CloseQandAFormHandler += delegate(object sender, EventArgs args) + { + if (InvokeRequired) { Invoke(new EventHandler(OnForceClose), sender, args); } + else OnForceClose(sender, args); + }; + } + + private void OnForceClose(object sender, EventArgs args) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/MessageBoxForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/MessageBoxForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/MessageBoxForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/MessageBoxOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/MessageBoxOp.cs new file mode 100644 index 00000000..3a112d52 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/MessageBoxOp.cs @@ -0,0 +1,76 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Drawing; +using TBF.BenchControl; +using TBF.Resources; + +namespace TBF.BenchControl.Operations +{ + public class MessageBoxOp : IOperation + { + MessageBoxForm modelessDlg; + + string message; + Color backColor; + bool completed = false; + + /// Reference to the operation + public MessageBoxOp() + : this(Strings.Message) + { + } + + public MessageBoxOp(string message) + : this (message, Color.Goldenrod) + { + } + + public MessageBoxOp(string message, Color backColor) + { + this.message = message; + this.backColor = backColor; + } + + delegate void MessageBoxFormDlgt(MessageBoxOp myRef); + /// + void OpenFormDlg(MessageBoxOp myRef) + { + myRef.modelessDlg = new MessageBoxForm(message, backColor); + modelessDlg.Show(); + } + + /// Start this operation + public void Start() + { + completed = false; + Program.MainWnd.Invoke(new MessageBoxFormDlgt(OpenFormDlg), this); + } + + /// Run this operation + /// Event.ResultsPrinted + public Event Run() + { + if (completed || modelessDlg.Completed) + { + completed = true; + modelessDlg = null; + return Event.OK; + } + + return Event.None; + } + + /// Stop this operation + public void Stop() + { + if (modelessDlg is GenericDevices.IHasCompleted) + { + UiBridge.Bridge.OnCloseQandAForm(this, null); + modelessDlg = null; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/OpTemplate.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/OpTemplate.cs new file mode 100644 index 00000000..7fe04501 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/OpTemplate.cs @@ -0,0 +1,64 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using log4net; +using System; +using System.Diagnostics; +using System.Collections.Generic; +using TBF.BenchControl; + +namespace TBF.BenchControl.Operations +{ + /// + /// An empty operation. + /// + /// Constructors: + /// OpTemplate() + /// + /// Start argument: + /// + /// Events: + /// Event.None ...... operation is in progress + /// + class OpTemplate : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(OpTemplate)); + public override string ToString() { return string.Format("OpTemplate({0})", someValue); } + + /// Set by the constructor + int someValue; + + /// + /// Constructor + /// + public OpTemplate(int someValue) + { + if (someValue < 0 || someValue > 5) throw new ArgumentOutOfRangeException("someValue"); + this.someValue = someValue; + } + + /// + /// When started + /// + public void Start() + { + } + + /// + /// When running + /// + /// + public Event Run() + { + /// Must return some event + return Event.None; + } + + /// + /// When stopped + /// + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/ProcessDataLoggingOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/ProcessDataLoggingOp.cs new file mode 100644 index 00000000..158a98f6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/ProcessDataLoggingOp.cs @@ -0,0 +1,46 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Text; +using log4net; +using TBF.BenchControl.Sequences; + +namespace TBF.BenchControl.Operations +{ + public class ProcessDataLoggingOp : IOperation + { + ILog logger; + SequenceBase sequenceBase; + bool heatMeters; + + public ProcessDataLoggingOp(ILog logger, SequenceBase sequenceBase, bool heatMeters) + { + this.logger = logger; + this.sequenceBase = sequenceBase; + this.heatMeters = heatMeters; + } + + public void Start() + { + if (heatMeters) + sequenceBase.LogProcessDataHeatMeters(logger); + else + sequenceBase.LogProcessData(logger); + } + + public Event Run() + { + if (heatMeters) + sequenceBase.LogProcessDataHeatMeters(logger); + else + sequenceBase.LogProcessData(logger); + return Event.None; + } + + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/ReadMoreRegistersOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/ReadMoreRegistersOp.cs new file mode 100644 index 00000000..b915cd58 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/ReadMoreRegistersOp.cs @@ -0,0 +1,89 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using log4net; +using TBF.BenchControl; +using TBF.Boxes; + +namespace TBF.BenchControl.Operations +{ + public class ReadMoreRegistersOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(ReadMoreRegistersOp)); + public override string ToString() { return string.Format("ReadAllRegistersOp()"); } + + /// Set by the constructor + int readersCount; + IOperation[] readRegOps; + + /// + /// Events: eventDone (default=Event.ReadRegisterDone) or Event.Error + /// + /// Register reader reference + /// Reference to the water meter register state in pulses + public ReadMoreRegistersOp(GenericDevices.IRegisterReader[] readers) + { + if (readers == null) throw new ArgumentNullException("readers"); + + readersCount = readers.Length; + + readRegOps = new IOperation[readersCount]; + for (int i = 0; i < readersCount; i++) + { + if (readers[i] != null) readRegOps[i] = readers[i].ReadRegisterOp(); + } + + log.Debug(this.ToString()); + } + + + /// Start this operation + public void Start() + { + int oriRefPulses = Sequences.ProcessData.RefPulses; + Sequences.ProcessData.RefPulses = StateMachine.ControlBoard.EtPulses(0); + Sequences.ProcessData.RefPulsesDelta = Sequences.ProcessData.RefPulses - oriRefPulses; + + for (int i = 0; i < readersCount; i++) + { + if (readRegOps[i] != null) readRegOps[i].Start(); + } + } + + /// Run this operation + public Event Run() + { + bool allDone = true; + bool anyError = false; + + int oriRefPulses = Sequences.ProcessData.RefPulses; + Sequences.ProcessData.RefPulses = StateMachine.ControlBoard.EtPulses(0); + Sequences.ProcessData.RefPulsesDelta = Sequences.ProcessData.RefPulses - oriRefPulses; + + for (int i = 0; i < readersCount; i++) + { + if (readRegOps[i] != null) + { + Event evnt = readRegOps[i].Run(); + + if (evnt == Event.Error) anyError = true; + if (evnt != Event.ReadRegisterDone) allDone = false; + } + } + + if (anyError) return Event.Error; + if (allDone) return Event.ReadAllRegistersDone; + return Event.None; + } + + /// Stop this operation + public void Stop() + { + for (int i = 0; i < readersCount; i++) + { + if (readRegOps[i] != null) readRegOps[i].Stop(); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/ReturnGivenEventOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/ReturnGivenEventOp.cs new file mode 100644 index 00000000..3dbbc24b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/ReturnGivenEventOp.cs @@ -0,0 +1,36 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using log4net; + +namespace TBF.BenchControl.Operations +{ + /// + /// Operation usefull for debugging + /// + class ReturnGivenEventOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(ReturnGivenEventOp)); + public override string ToString() { return string.Format("ReturnGivenEventOp({0})", givenEvent); } + + /// Set by the constructor + readonly Event givenEvent; + + /// + /// Constructor + /// + public ReturnGivenEventOp(Event givenEvent) + { + this.givenEvent = givenEvent; + } + + public void Start() {} + + public Event Run() + { + return givenEvent; + } + + public void Stop() {} + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/SetAllRegulValvesOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/SetAllRegulValvesOp.cs new file mode 100644 index 00000000..42e2556a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/SetAllRegulValvesOp.cs @@ -0,0 +1,74 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl.Operations +{ + public class SetAllRegulValvesOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(SetAllRegulValvesOp)); + public override string ToString() { return string.Format("SetAllRegulValvesOp()"); } + + int rvCount; + IOperation[] setRVPosOps; + + public SetAllRegulValvesOp(IList regulValves, IList positions, int timeout) + { + if (regulValves == null || regulValves.Count == 0) + { + rvCount = 0; + } + else + { + rvCount = regulValves.Count; + if (positions == null || positions.Count != rvCount) throw new ArgumentNullException("positions"); + + setRVPosOps = new IOperation[rvCount]; + for (int i = 0; i < rvCount; i++) + { + float posLo = Math.Max(positions[i] - 3.0f, 0); + float posHi = Math.Min(positions[i] + 3.0f, 100.0f); + setRVPosOps[i] = regulValves[i].SetRegulValvePositionOp(posLo, posHi, timeout); + } + } + } + + /// Start this operation + public void Start() + { + for (int i = 0; i < rvCount; i++) setRVPosOps[i].Start(); + } + + /// Run this operation + public Event Run() + { + bool allDone = true; + bool anyError = false; + bool anyTimeout = false; + + for (int i = 0; i < rvCount; i++) + { + Event evnt = setRVPosOps[i].Run(); + if (evnt == Event.Error) anyError = true; + else if (evnt == Event.OpArgumentError) anyTimeout = true; + else if (evnt == Event.RegulValveTimeOut) anyTimeout = true; + else if (evnt != Event.PositionReached) allDone = false; + } + + if (anyError) return Event.Error; + if (anyTimeout) return Event.Error; + if (allDone) return Event.AllPositionsReached; + return Event.None; + } + + /// Stop this operation + public void Stop() + { + for (int i = 0; i < rvCount; i++) setRVPosOps[i].Stop(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/TimerOp.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/TimerOp.cs new file mode 100644 index 00000000..0e24989b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Operations/TimerOp.cs @@ -0,0 +1,98 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using log4net; + +namespace TBF.BenchControl.Operations +{ + /// + /// Implements timer function + /// + /// Constructors: + /// Timer(timerTimeMs) ................ use Event.TimerExpired as eventExpired + /// Timer(timerTimeMs, eventExpired) .. use constructor argument as eventExpired + /// + /// Start argument: + /// + /// Events: + /// Event.None ........ operation is in progress + /// eventExpired ...... timer expired + /// + public class TimerOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(TimerOp)); + public override string ToString() { return string.Format("TimerOp({0}s, Event.{1})", timerTime, eventExpired); } + + /// Private fields + bool timeExpired = false; + int expireTime; + + /// Set by constructors + int timerTime; + Event eventExpired; + TBF.Boxes.IntBox remainingTimeSec; + + /// + /// Constructors, optional argument is a timer name (you can create more then one timer) + /// + public TimerOp(int timerTimeSec, Event eventExpired, TBF.Boxes.IntBox remainingTimeSec) + { + this.timerTime = timerTimeSec; + this.eventExpired = eventExpired; + this.remainingTimeSec = remainingTimeSec; + } + public TimerOp(int timerTimeSec, Event eventExpired) + : this(timerTimeSec, eventExpired, null) + { + } + public TimerOp(int timerTime, TBF.Boxes.IntBox remainingTimeSec) + : this(timerTime, Event.TimerExpired, remainingTimeSec) + { + } + public TimerOp(int timerTime) + : this(timerTime, Event.TimerExpired, null) + { + } + + void UpdateRemainingTime() + { + if (remainingTimeSec != null) + { + remainingTimeSec.Val = System.Math.Max(expireTime - StateMachine.Time, 0); + } + } + + /// Time period (TimeSpan) + public void Start() + { + timeExpired = false; + expireTime = StateMachine.Time + timerTime; + + UpdateRemainingTime(); + } + + public Event Run() + { + UpdateRemainingTime(); + + if (timeExpired) + { + return eventExpired; + } + else if (StateMachine.Time >= expireTime) + { + timeExpired = true; + return eventExpired; + } + else + { + return Event.TimerBusy; + } + } + + public void Stop() + { + timeExpired = false; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/ProductionMonitoring/Enums.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/ProductionMonitoring/Enums.cs new file mode 100644 index 00000000..90ed1c2e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/ProductionMonitoring/Enums.cs @@ -0,0 +1,48 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; + +namespace TBF.BenchControl.Output.DB.ProductionMonitoring +{ + public enum CodeType + { + UniqueNr, + FlowtubeNr, /// Prvé 3 znaky sa zhodujú s poslednými 3 znakmi názvu + FlowtubeNrLU, /// Začiatok kódu sa zhoduje s názvom + BatchNr, + BatchNrContainingPartName, + DateMMYY, + QualityCheck, + } + + public enum CodeForm + { + Barcode, + QRCode, + Keyboard, + OkNok, + } + + public enum CodeLocation + { + OnPart, + OnPallet, + } + + public enum LifetimeManagement + { + None, + OneYear, + Count, + } + + public enum ReleaseStatus + { + In_preparation, + Released, + ReleasedActive, + Deactivated, + Count, + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/ProductionMonitoring/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/ProductionMonitoring/Factory.cs new file mode 100644 index 00000000..03ba1fdf --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/ProductionMonitoring/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.DB.ProductionMonitoring +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Monitoring.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Monitoring(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Monitoring(cfg); } + + public IComponentCfg DefaultConfig() { return new MonitoringCfg(this.GetType().Namespace.Substring(24), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(MonitoringCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/ProductionMonitoring/Monitoring.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/ProductionMonitoring/Monitoring.cs new file mode 100644 index 00000000..af83b34b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/ProductionMonitoring/Monitoring.cs @@ -0,0 +1,246 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using log4net; +using NHibernate; +using Config.Entities; +using MonitoringDB.Entities; + +namespace TBF.BenchControl.Output.DB.ProductionMonitoring +{ + public enum Retv + { + OK, + Error, + } + + public class Monitoring : ComponentBase, IOperation, GenericDevices.IResultsWriter, Generic.IDevice + { + private static readonly ILog log = LogManager.GetLogger(typeof(Monitoring)); + public override string ToString() { return string.Format("Monitoring({0})", Cfg.ToString(1)); } + + + public const string WorkstepName = "Test_bench"; + + + MonitoringCfg monitoringCfg; + string workplace { get { return monitoringCfg.Workplace; } } + + enum CurrentOp + { + None, + SaveMonitoringRecords, + } + + CurrentOp currentOp; + bool opCompleted; + bool anyError; + + /// + /// Results to print + /// + Results.Entities.Batch batch; + + ISessionFactory sessionFactory; /// Factory to create database sessions initialized in the constructor + IList processes; + Dictionary processDictionary; + Dictionary> workstepsDictionary; + + + public Monitoring() {} + + public Monitoring(Generic.IComponentCfg cfg) + : base(cfg) + { + monitoringCfg = cfg as MonitoringCfg; + currentOp = CurrentOp.None; + + log.Debug(this.ToString()); + } + + public void Initialize() + { + if (monitoringCfg.DebugLevel == DebugMode.Simulate) return; + + /// + /// Session factory is used to create database sessions + /// + sessionFactory = FluentNHibernate.Cfg.Fluently + .Configure() + .Database(FluentNHibernate.Cfg.Db.MySQLConfiguration.Standard.ConnectionString(monitoringCfg.ConnStr)) + .Mappings(m => m.FluentMappings.AddFromAssemblyOf()) + .ExposeConfiguration(MonitoringDB.FluentNH.BuildSchema) + .BuildSessionFactory(); + /// + /// Read processes and worksteps from the database (this verifies DB connection as well) + /// + log.WarnFormat("Reading processes/worksteps from production monitoring DB started"); + ReadProcessesFromDB(sessionFactory.OpenSession()); + log.WarnFormat("Reading processes/worksteps from production monitoring DB completed"); + } + + + public void RunDeviceBefore() { } + public void RunDeviceAfter() {} + public void StopDevice() {} + public void StopDevice2() {} + + + /// + /// Writes the test cycle results into a file, Events: Event.ResultsWritten + /// + /// Procedure to print the results of + /// Results to write into the file + /// Reference to the operation + public IOperation WriteResultsOp(Results.Entities.Batch batch) + { + if (currentOp != CurrentOp.None) + throw new Exception("Sequence error"); + else + currentOp = CurrentOp.SaveMonitoringRecords; + + this.batch = batch; + + return this; + } + + /// Start this operation + public void Start() + { + opCompleted = false; + anyError = false; + } + + /// Run this operation + /// Event.ResultsWritten or Event.Error + public Event Run() + { + if (monitoringCfg.DebugLevel == DebugMode.Simulate || batch.WaterMeters.Count == 0) + { + opCompleted = true; + return Event.ResultsWritten; + } + + if (currentOp == CurrentOp.SaveMonitoringRecords) + { + if (!opCompleted) + { + ITransaction transaction = null; + try + { + ISession session = sessionFactory.OpenSession(); + transaction = session.BeginTransaction(); + + int wrCount = WriteResultsToDatabase(session, batch); + transaction.Commit(); + session.Flush(); + opCompleted = true; + + log.ErrorFormat("Batch {0}: {1} of {2} watermeters written to production monitoring DB", + batch.BatchNr, wrCount, batch.WaterMeters.Count); + } + catch (Exception exc) + { + if (transaction != null && !transaction.WasCommitted) transaction.Rollback(); + anyError = true; + + log.WarnFormat("Failed to write batch {0} results to production monitoring DB: {1}", + batch.BatchNr, exc.Message); + } + } + + if (anyError) + return Event.ResultsNotWritten; + else + return Event.ResultsWritten; + } + else + { + return Event.None; + } + } + + /// Stop this operation + public void Stop() + { + currentOp = CurrentOp.None; + } + + + /// + /// Write results of a batch of water meters to the DB + /// + /// DB session + /// Batch entity + int WriteResultsToDatabase(ISession session, Results.Entities.Batch batch) + { + int wrCount = 0; + foreach (var wMtr in batch.WaterMeters) + { + wrCount += SaveSingleWM2DB(session, wMtr); + } + return wrCount; + } + + + /// + /// Write one meter results to the DB + /// + /// DB session + /// Watermeter entity + /// Number of written reference record + int SaveSingleWM2DB(ISession session, Results.Entities.WaterMeter wm) + { + if (string.IsNullOrEmpty(wm.SerialNr)) return 0; /// Without PCB number there is no DB activity + + /// + /// Get all already existing reference records with Code == wm.SerialNr, refRecords[0] will be the most recent one + /// + IList refRecords; + int trialsCount = 0; + do + { + if (trialsCount > 0) ReadProcessesFromDB(session); + + refRecords = session.QueryOver() + .Where(rr => (rr.Code == wm.SerialNr)) + .OrderBy(rr => rr.TimeStamp).Desc + .List(); + trialsCount++; + } + while (refRecords.Count == 0 && trialsCount <= 2); + + /// + /// Save a new reference record from this test bench if workstep "Test_bench" is defined in the obtained WM process + /// + IList worksteps; + if ((refRecords.Count > 0) && workstepsDictionary.TryGetValue(refRecords[0].Process.Id, out worksteps) && (worksteps.Count == 1)) + { + session.SaveOrUpdate(new ReferenceRecord(refRecords[0].Process, worksteps[0], wm.SerialNr, Users.GlobalData.CurrentUser.UserName, workplace, wm.Passed ? 0 : 1)); + return 1; + } + + return 0; + } + + + /// + /// Updates processes, processDictionary and workstepsDictionary + /// + /// DB session + void ReadProcessesFromDB(ISession session) + { + processes = session.QueryOver().List(); + processDictionary = new Dictionary(); + workstepsDictionary = new Dictionary>(); + foreach (var pr in processes) + { + IList worksteps = session.QueryOver().Where(ws => ((ws.Process == pr) && (ws.Name == WorkstepName))).List(); + processDictionary.Add(pr.Id, pr); + workstepsDictionary.Add(pr.Id, worksteps); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/ProductionMonitoring/MonitoringCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/ProductionMonitoring/MonitoringCfg.cs new file mode 100644 index 00000000..664058e3 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/ProductionMonitoring/MonitoringCfg.cs @@ -0,0 +1,41 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.DB.ProductionMonitoring +{ + public class MonitoringCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(MonitoringCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new MonitoringCfgCtrl(); } + + + public string Workplace; + public string ConnStr; + + + /// Private parameterless constructor invoked by all other (public) constructors + MonitoringCfg() + { + ParentName = string.Empty; + Workplace = "WR10"; + ConnStr = "SERVER=10.42.128.16; DATABASE=sledovanie2018; UID=vyroba2018; PASSWORD=qwerty; CHARSET=utf8;"; + } + + public MonitoringCfg(string name, IComponentFactory factory) + : this() + { + this.Name = name; + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Workplace={1}", Name, Workplace); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/ProductionMonitoring/MonitoringCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/ProductionMonitoring/MonitoringCfgCtrl.cs new file mode 100644 index 00000000..74c1512a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/ProductionMonitoring/MonitoringCfgCtrl.cs @@ -0,0 +1,80 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.DB.ProductionMonitoring +{ + public partial class MonitoringCfgCtrl : Configs.ConfigCtrlUtils, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + MonitoringCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as MonitoringCfg; + Redraw(); + } + } + + public MonitoringCfgCtrl() + { + InitializeComponent(); + } + + private void WriterCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + workplaceTextBox.Text = config.Workplace; + connStrTextBox.Text = config.ConnStr; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + workplaceTextBox.Enabled = true; + connStrTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + return CfgUpdateFlags.None; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + if (config.Name != nameTextBox.Text) + { + config.Name = nameTextBox.Text; + flags |= CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd; + } + + flags |= UpdateDifferent(ref config.Workplace, workplaceTextBox.Text, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.ConnStr, connStrTextBox.Text, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/ProductionMonitoring/MonitoringCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/ProductionMonitoring/MonitoringCfgCtrl.designer.cs new file mode 100644 index 00000000..b70c3c2b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/ProductionMonitoring/MonitoringCfgCtrl.designer.cs @@ -0,0 +1,132 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +namespace TBF.BenchControl.Output.DB.ProductionMonitoring +{ + partial class MonitoringCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.workplaceTextBox = new System.Windows.Forms.TextBox(); + this.workplaceLabel = new System.Windows.Forms.Label(); + this.connStrTextBox = new System.Windows.Forms.TextBox(); + this.connStrLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(110, 41); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(146, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(15, 44); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(107, 19); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // workplaceTextBox + // + this.workplaceTextBox.Enabled = false; + this.workplaceTextBox.Location = new System.Drawing.Point(110, 67); + this.workplaceTextBox.Name = "workplaceTextBox"; + this.workplaceTextBox.Size = new System.Drawing.Size(146, 20); + this.workplaceTextBox.TabIndex = 4; + // + // workplaceLabel + // + this.workplaceLabel.AutoSize = true; + this.workplaceLabel.Location = new System.Drawing.Point(15, 70); + this.workplaceLabel.Name = "workplaceLabel"; + this.workplaceLabel.Size = new System.Drawing.Size(59, 13); + this.workplaceLabel.TabIndex = 3; + this.workplaceLabel.Text = "Workplace"; + // + // connStrTextBox + // + this.connStrTextBox.Enabled = false; + this.connStrTextBox.Location = new System.Drawing.Point(110, 93); + this.connStrTextBox.Name = "connStrTextBox"; + this.connStrTextBox.Size = new System.Drawing.Size(327, 20); + this.connStrTextBox.TabIndex = 22; + // + // connStrLabel + // + this.connStrLabel.AutoSize = true; + this.connStrLabel.Location = new System.Drawing.Point(15, 96); + this.connStrLabel.Name = "connStrLabel"; + this.connStrLabel.Size = new System.Drawing.Size(89, 13); + this.connStrLabel.TabIndex = 21; + this.connStrLabel.Text = "Connection string"; + // + // MonitoringCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.connStrTextBox); + this.Controls.Add(this.connStrLabel); + this.Controls.Add(this.workplaceTextBox); + this.Controls.Add(this.workplaceLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "MonitoringCfgCtrl"; + this.Size = new System.Drawing.Size(450, 230); + this.Load += new System.EventHandler(this.WriterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.TextBox workplaceTextBox; + private System.Windows.Forms.Label workplaceLabel; + private System.Windows.Forms.TextBox connStrTextBox; + private System.Windows.Forms.Label connStrLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/ProductionMonitoring/MonitoringCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/ProductionMonitoring/MonitoringCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/ProductionMonitoring/MonitoringCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/ProductionMonitoring/WMPart.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/ProductionMonitoring/WMPart.cs new file mode 100644 index 00000000..3ec9052a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/ProductionMonitoring/WMPart.cs @@ -0,0 +1,61 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using MySql.Data.MySqlClient; + +namespace TBF.BenchControl.Output.DB.ProductionMonitoring +{ + public class WMPart + { + public string Name; + public int ProcessId; + public string OraDBType; + public string Description; + public string Code; + public DateTime TimeStamp; + public CodeType CodeType; + public CodeForm CodeForm; + public CodeLocation CodeLocation; + public string UserName; + public string Workplace; + + public WMPart() {} + + public static IList FindWMParts(MySqlConnection dbConn, string pcbNumber) + { + IList foundParts = new List(); /// initially empty + + if (string.IsNullOrEmpty(pcbNumber)) return foundParts; /// return an empty list + + try + { + dbConn.Open(); + + //IList referenceRecords = session + // .QueryOver() + // .Where(x => (x.Code == pcbNumber)) + // .OrderBy(x => x.TimeStamp).Desc + // .List(); + + MySqlCommand cmd = dbConn.CreateCommand(); + cmd.CommandText = string.Format("SELECT Id, TimeStamp, UserName, Workplace, Result, Process_id, Workstep_id FROM ReferenceRecord WHERE Code = {0}", pcbNumber); + cmd.ExecuteNonQuery(); + + MySqlDataReader dr = cmd.ExecuteReader(); + while (dr.Read()) + { + foundParts.Add( new WMPart() { Code = pcbNumber, ProcessId = dr.GetInt32(5), /* etc */ } ); + } + dr.Close(); + cmd.Dispose(); + } + catch + { + } + + return foundParts; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/SaveFlowmeterCorrections/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/SaveFlowmeterCorrections/Factory.cs new file mode 100644 index 00000000..fa5f877b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/SaveFlowmeterCorrections/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.DB.SaveFlowmeterCorrections +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { SaveFlowmeterCorr.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new SaveFlowmeterCorr(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new SaveFlowmeterCorr(cfg); } + + public IComponentCfg DefaultConfig() { return new SaveFlowmeterCorrCfg(this.GetType().Namespace.Substring(24), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(SaveFlowmeterCorrCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/SaveFlowmeterCorrections/SaveFlowmeterCorr.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/SaveFlowmeterCorrections/SaveFlowmeterCorr.cs new file mode 100644 index 00000000..36031f78 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/SaveFlowmeterCorrections/SaveFlowmeterCorr.cs @@ -0,0 +1,260 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using log4net; +using NHibernate; +using NHibernate.Criterion; +using Config; +using Config.Entities; +using MonitoringDB.Entities; +using TBF.BenchControl.Generic; +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl.Output.DB.SaveFlowmeterCorrections +{ + public enum Retv + { + OK, + Error, + } + + public class SaveFlowmeterCorr : ComponentBase, IOperation, GenericDevices.IResultsWriter + { + private static readonly ILog log = LogManager.GetLogger(typeof(SaveFlowmeterCorr)); + public override string ToString() { return string.Format("SaveFlowmeterCorr({0})", Cfg.ToString(1)); } + + SaveFlowmeterCorrCfg myCfg; + + enum CurrentOp + { + None, + SaveFlowmeterCorrections, + } + + CurrentOp currentOp; + bool opCompleted; + bool anyError; + + /// + /// Results to parse for reference flowmeter corrections + /// + Results.Entities.Batch batch; + IList newCorrections; + + + public SaveFlowmeterCorr() {} + + public SaveFlowmeterCorr(Generic.IComponentCfg cfg) + : base(cfg) + { + myCfg = cfg as SaveFlowmeterCorrCfg; + currentOp = CurrentOp.None; + + log.Debug(this.ToString()); + } + + + /// + /// Writes the test cycle results into a file, Events: Event.ResultsWritten + /// + /// Procedure to print the results of + /// Results to write into the file + /// Reference to the operation + public IOperation WriteResultsOp(Results.Entities.Batch batch) + { + if (currentOp != CurrentOp.None) + throw new Exception("Sequence error"); + else + currentOp = CurrentOp.SaveFlowmeterCorrections; + + this.batch = batch; + + return this; + } + + + IList GetCorrections(Results.Entities.Batch batch, string flowmeterName, int rngIx, double tempRngLo, double tempRngHi) + { + IList rslt = new List(); + + foreach (var tr in batch.TestRslts) + { + if (tr.TestDone && tr.Components != null && tr.Components.Flowmeter == flowmeterName && + tr.RepetitionNr == 1 && tr.Evaluate() && tr.TempLimLo() >= tempRngLo && tr.TempLimHi() <= tempRngHi) + { + double flow = 0; + double errorMaster = 0; + + if (tr.Repeats() == 1) + { + flow = tr.FlowMean; + errorMaster = tr.ErrorMaster; + } + else + { + int count = 0; + + foreach (var tr2 in batch.TestRslts) + { + if (tr2.TestDone && (tr2.TestData.Name == tr.TestData.Name)) + { + flow += tr2.FlowMean; + errorMaster += tr2.ErrorMaster; + count++; + } + } + + flow /= count; + errorMaster /= count; + } + + double correction = Formulas.CorrectionFromError(flow, errorMaster); + rslt.Add(new MeasurementCorrection { RangeIx = rngIx, Measurement = (float)flow, Correction = (float)correction }); + } + } + + return rslt; + } + + + void DeleteExistingCorrections(ISession session, Component cmpnt, int rangeIx) + { + for (int i = cmpnt.Corrections.Count - 1; i >= 0; i--) + { + if (cmpnt.Corrections[i].RangeIx == rangeIx) + { + session.Delete(cmpnt.Corrections[i]); + cmpnt.Corrections.RemoveAt(i); + } + } + session.SaveOrUpdate(cmpnt); + } + + + void SaveNewCorrections(ISession session, Component cmpnt, int rangeIx, IList corrections) + { + if (cmpnt.Corrections == null) cmpnt.Corrections = new List(); + + foreach (var mc in corrections) + { + mc.RangeIx = rangeIx; + cmpnt.Corrections.Add(mc); + session.SaveOrUpdate(mc); + } + + ICalibInfoCfg cfg = TbfComponents.CmpntCfgFromCmpntEntity(cmpnt) as ICalibInfoCfg; + if (cfg != null) + { + cfg.SetCalibDate(rangeIx, DateTime.Now); + + if (!string.IsNullOrEmpty(myCfg.CertificateFmt)) + { + cfg.SetCalibCertificate(rangeIx, string.Format(myCfg.CertificateFmt, batch.StartTime, batch.EndTime, batch.BatchNr)); + } + + if (myCfg.ValidityDays > 0) + { + cfg.SetCalibValidDate(rangeIx, DateTime.Now + new TimeSpan(myCfg.ValidityDays, 0, 0, 0)); + } + + Component modified = cfg.CreateDbEntity(); + cmpnt.Parameters = modified.Parameters; + } + + session.SaveOrUpdate(cmpnt); + } + + + /// Start this operation + public void Start() + { + opCompleted = false; + anyError = false; + } + + /// Run this operation + /// Event.ResultsWritten or Event.Error + public Event Run() + { + if (myCfg.DebugLevel == DebugMode.Simulate) + { + opCompleted = true; + return Event.ResultsWritten; + } + + if (currentOp == CurrentOp.SaveFlowmeterCorrections) + { + if (!opCompleted) + { + ITransaction transaction = null; + try + { + ISession session = Config.FluentCommon.CreateSession(Users.Entities.DBKind.Config); + transaction = session.BeginTransaction(); + + for (int fmtr = 1; fmtr <= myCfg.FlowmetersCount(); fmtr++) + { + string flowmeterName = myCfg.GetFlowmeterName(fmtr); + Elde.FlowMeter.FlowMeter flowmeter = TbfComponents.FindComponent(flowmeterName) as Elde.FlowMeter.FlowMeter; + + if (flowmeter != null) + { + var cmpntEntities = session.QueryOver() + .Where(cmpnt => (cmpnt.Name == flowmeterName)) + .List(); + + if (cmpntEntities.Count != 1) + { + log.ErrorFormat("No unique flowmeter named {0}", myCfg.GetFlowmeterName(fmtr)); + continue; + } + + for (int rng = 0; rng <= myCfg.RangesCount(); rng++) + { + if (myCfg.FlowmtrRangeEnabled(fmtr, rng)) + { + double tempRngLo = flowmeter.GetTempLo(rng); + double tempRngHi = flowmeter.GetTempHi(rng); + newCorrections = GetCorrections(batch, flowmeterName, rng, tempRngLo, tempRngHi); + DeleteExistingCorrections(session, cmpntEntities[0], rng); + SaveNewCorrections(session, cmpntEntities[0], rng, newCorrections); + } + } + } + } + + transaction.Commit(); + session.Flush(); + opCompleted = true; + + log.WarnFormat("Measurement corrections successfully saved"); + } + catch (Exception exc) + { + if (transaction != null && !transaction.WasCommitted) transaction.Rollback(); + anyError = true; + + log.ErrorFormat("Failed to write corrections calculated from batch {0}: {1}", batch.BatchNr, exc.Message); + } + } + + if (anyError) + return Event.ResultsNotWritten; + else + return Event.ResultsWritten; + } + else + { + return Event.None; + } + } + + /// Stop this operation + public void Stop() + { + currentOp = CurrentOp.None; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/SaveFlowmeterCorrections/SaveFlowmeterCorrCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/SaveFlowmeterCorrections/SaveFlowmeterCorrCfg.cs new file mode 100644 index 00000000..f6ffd27f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/SaveFlowmeterCorrections/SaveFlowmeterCorrCfg.cs @@ -0,0 +1,222 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.DB.SaveFlowmeterCorrections +{ + public class SaveFlowmeterCorrCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(SaveFlowmeterCorrCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new SaveFlowmeterCorrCfgCtrl(); } + + public string Flowmeter1; + public string Flowmeter2; + public string Flowmeter3; + public string Flowmeter4; + public string Flowmeter5; + public string Flowmeter6; + public string Flowmeter7; + + public bool Flowm1Rng1; + public bool Flowm1Rng2; + public bool Flowm1Rng3; + public bool Flowm1Rng4; + public bool Flowm1Rng5; + + public bool Flowm2Rng1; + public bool Flowm2Rng2; + public bool Flowm2Rng3; + public bool Flowm2Rng4; + public bool Flowm2Rng5; + + public bool Flowm3Rng1; + public bool Flowm3Rng2; + public bool Flowm3Rng3; + public bool Flowm3Rng4; + public bool Flowm3Rng5; + + public bool Flowm4Rng1; + public bool Flowm4Rng2; + public bool Flowm4Rng3; + public bool Flowm4Rng4; + public bool Flowm4Rng5; + + public bool Flowm5Rng1; + public bool Flowm5Rng2; + public bool Flowm5Rng3; + public bool Flowm5Rng4; + public bool Flowm5Rng5; + + public bool Flowm6Rng1; + public bool Flowm6Rng2; + public bool Flowm6Rng3; + public bool Flowm6Rng4; + public bool Flowm6Rng5; + + public bool Flowm7Rng1; + public bool Flowm7Rng2; + public bool Flowm7Rng3; + public bool Flowm7Rng4; + public bool Flowm7Rng5; + + public string CertificateFmt; + public int ValidityDays; + + public int FlowmetersCount() { return 7; } + public int RangesCount() { return 5; } + + /// + /// Get flowmeter name + /// + /// Flowmeter index 1 .. FlowmetersCount()==7 + /// Flowmeter name or null + public string GetFlowmeterName(int f) + { + switch (f) + { + case 1: return Flowmeter1; + case 2: return Flowmeter2; + case 3: return Flowmeter3; + case 4: return Flowmeter4; + case 5: return Flowmeter5; + case 6: return Flowmeter6; + case 7: return Flowmeter7; + default: return null; + } + } + + /// + /// Is range enabled + /// + /// Flowmeter index 1 .. FlowmetersCount()==7 + /// Range index 0 .. RangesCount()==5 + /// ture if the range is enabled + public bool FlowmtrRangeEnabled(int f, int r) + { + if (f == 1) + { + switch (r) + { + case 0: return !(Flowm1Rng1 || Flowm1Rng2 || Flowm1Rng3 || Flowm1Rng4 || Flowm1Rng5); + case 1: return Flowm1Rng1; + case 2: return Flowm1Rng2; + case 3: return Flowm1Rng3; + case 4: return Flowm1Rng4; + case 5: return Flowm1Rng5; + default: break; + } + } + else if (f == 2) + { + switch (r) + { + case 0: return !(Flowm2Rng1 || Flowm2Rng2 || Flowm2Rng3 || Flowm2Rng4 || Flowm2Rng5); + case 1: return Flowm2Rng1; + case 2: return Flowm2Rng2; + case 3: return Flowm2Rng3; + case 4: return Flowm2Rng4; + case 5: return Flowm2Rng5; + default: break; + } + } + else if (f == 3) + { + switch (r) + { + case 0: return !(Flowm3Rng1 || Flowm3Rng2 || Flowm3Rng3 || Flowm3Rng4 || Flowm3Rng5); + case 1: return Flowm3Rng1; + case 2: return Flowm3Rng2; + case 3: return Flowm3Rng3; + case 4: return Flowm3Rng4; + case 5: return Flowm3Rng5; + default: break; + } + } + else if (f == 4) + { + switch (r) + { + case 0: return !(Flowm4Rng1 || Flowm4Rng2 || Flowm4Rng3 || Flowm4Rng4 || Flowm4Rng5); + case 1: return Flowm4Rng1; + case 2: return Flowm4Rng2; + case 3: return Flowm4Rng3; + case 4: return Flowm4Rng4; + case 5: return Flowm4Rng5; + default: break; + } + } + else if (f == 5) + { + switch (r) + { + case 0: return !(Flowm5Rng1 || Flowm5Rng2 || Flowm5Rng3 || Flowm5Rng4 || Flowm5Rng5); + case 1: return Flowm5Rng1; + case 2: return Flowm5Rng2; + case 3: return Flowm5Rng3; + case 4: return Flowm5Rng4; + case 5: return Flowm5Rng5; + default: break; + } + } + else if (f == 6) + { + switch (r) + { + case 0: return !(Flowm6Rng1 || Flowm6Rng2 || Flowm6Rng3 || Flowm6Rng4 || Flowm6Rng5); + case 1: return Flowm6Rng1; + case 2: return Flowm6Rng2; + case 3: return Flowm6Rng3; + case 4: return Flowm6Rng4; + case 5: return Flowm6Rng5; + default: break; + } + } + else if (f == 7) + { + switch (r) + { + case 0: return !(Flowm7Rng1 || Flowm7Rng2 || Flowm7Rng3 || Flowm7Rng4 || Flowm7Rng5); + case 1: return Flowm7Rng1; + case 2: return Flowm7Rng2; + case 3: return Flowm7Rng3; + case 4: return Flowm7Rng4; + case 5: return Flowm7Rng5; + default: break; + } + } + + return false; + } + + + /// Private parameterless constructor invoked by all other (public) constructors + SaveFlowmeterCorrCfg() + { + ParentName = string.Empty; + Flowmeter1 = "I1"; + Flowmeter2 = "I2"; + Flowmeter3 = "I3"; + Flowmeter4 = null; + Flowmeter5 = null; + Flowmeter6 = null; + Flowmeter7 = null; + } + + public SaveFlowmeterCorrCfg(string name, IComponentFactory factory) + : this() + { + this.Name = name; + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Flowmtr1={1}, Flowmtr2={2}, Flowmtr3={3}, Flowmtr4={4}, Flowmtr5={5}, Flowmtr6={6}, Flowmtr7={7}", + Name, Flowmeter1, Flowmeter2, Flowmeter3, Flowmeter4, Flowmeter5, Flowmeter6, Flowmeter7); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/SaveFlowmeterCorrections/SaveFlowmeterCorrCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/SaveFlowmeterCorrections/SaveFlowmeterCorrCfgCtrl.cs new file mode 100644 index 00000000..cf62ac85 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/SaveFlowmeterCorrections/SaveFlowmeterCorrCfgCtrl.cs @@ -0,0 +1,375 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.DB.SaveFlowmeterCorrections +{ + public partial class SaveFlowmeterCorrCfgCtrl : Configs.ConfigCtrlUtils, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + + ComponentParametersDlg parent; + + + SaveFlowmeterCorrCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as SaveFlowmeterCorrCfg; + Redraw(); + } + } + + public SaveFlowmeterCorrCfgCtrl() + { + InitializeComponent(); + } + + private void WriterCfgCtrl_Load(object sender, EventArgs e) + { + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + + if (parent.TbfComponents != null) + { + flowmeter1ComboBox.Items.Add("---"); + flowmeter2ComboBox.Items.Add("---"); + flowmeter3ComboBox.Items.Add("---"); + flowmeter4ComboBox.Items.Add("---"); + flowmeter5ComboBox.Items.Add("---"); + flowmeter6ComboBox.Items.Add("---"); + flowmeter7ComboBox.Items.Add("---"); + /// + foreach (var cmpnt in parent.TbfComponents) + { + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is TBF.BenchControl.Elde.FlowMeter.FlowMeterFactory) + { + flowmeter1ComboBox.Items.Add(cmpnt.Name); + flowmeter2ComboBox.Items.Add(cmpnt.Name); + flowmeter3ComboBox.Items.Add(cmpnt.Name); + flowmeter4ComboBox.Items.Add(cmpnt.Name); + flowmeter5ComboBox.Items.Add(cmpnt.Name); + flowmeter6ComboBox.Items.Add(cmpnt.Name); + flowmeter7ComboBox.Items.Add(cmpnt.Name); + } + } + } + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + + flowmeter1ComboBox.Text = string.IsNullOrEmpty(config.Flowmeter1) ? "---" : config.Flowmeter1; + flowm1Rng1CheckBox.Checked = config.Flowm1Rng1; + flowm1Rng2CheckBox.Checked = config.Flowm1Rng2; + flowm1Rng3CheckBox.Checked = config.Flowm1Rng3; + flowm1Rng4CheckBox.Checked = config.Flowm1Rng4; + flowm1Rng5CheckBox.Checked = config.Flowm1Rng5; + flowm1Rng0CheckBox.Checked = !(config.Flowm1Rng1 || config.Flowm1Rng2 || config.Flowm1Rng3 || config.Flowm1Rng4 || config.Flowm1Rng5); + + flowmeter2ComboBox.Text = string.IsNullOrEmpty(config.Flowmeter2) ? "---" : config.Flowmeter2; + flowm2Rng1CheckBox.Checked = config.Flowm2Rng1; + flowm2Rng2CheckBox.Checked = config.Flowm2Rng2; + flowm2Rng3CheckBox.Checked = config.Flowm2Rng3; + flowm2Rng4CheckBox.Checked = config.Flowm2Rng4; + flowm2Rng5CheckBox.Checked = config.Flowm2Rng5; + flowm2Rng0CheckBox.Checked = !(config.Flowm2Rng1 || config.Flowm2Rng2 || config.Flowm2Rng3 || config.Flowm2Rng4 || config.Flowm2Rng5); + + flowmeter3ComboBox.Text = string.IsNullOrEmpty(config.Flowmeter3) ? "---" : config.Flowmeter3; + flowm3Rng1CheckBox.Checked = config.Flowm3Rng1; + flowm3Rng2CheckBox.Checked = config.Flowm3Rng2; + flowm3Rng3CheckBox.Checked = config.Flowm3Rng3; + flowm3Rng4CheckBox.Checked = config.Flowm3Rng4; + flowm3Rng5CheckBox.Checked = config.Flowm3Rng5; + flowm3Rng0CheckBox.Checked = !(config.Flowm3Rng1 || config.Flowm3Rng2 || config.Flowm3Rng3 || config.Flowm3Rng4 || config.Flowm3Rng5); + + flowmeter4ComboBox.Text = string.IsNullOrEmpty(config.Flowmeter4) ? "---" : config.Flowmeter4; + flowm4Rng1CheckBox.Checked = config.Flowm4Rng1; + flowm4Rng2CheckBox.Checked = config.Flowm4Rng2; + flowm4Rng3CheckBox.Checked = config.Flowm4Rng3; + flowm4Rng4CheckBox.Checked = config.Flowm4Rng4; + flowm4Rng5CheckBox.Checked = config.Flowm4Rng5; + flowm4Rng0CheckBox.Checked = !(config.Flowm4Rng1 || config.Flowm4Rng2 || config.Flowm4Rng3 || config.Flowm4Rng4 || config.Flowm4Rng5); + + flowmeter5ComboBox.Text = string.IsNullOrEmpty(config.Flowmeter5) ? "---" : config.Flowmeter5; + flowm5Rng1CheckBox.Checked = config.Flowm5Rng1; + flowm5Rng2CheckBox.Checked = config.Flowm5Rng2; + flowm5Rng3CheckBox.Checked = config.Flowm5Rng3; + flowm5Rng4CheckBox.Checked = config.Flowm5Rng4; + flowm5Rng5CheckBox.Checked = config.Flowm5Rng5; + flowm5Rng0CheckBox.Checked = !(config.Flowm5Rng1 || config.Flowm5Rng2 || config.Flowm5Rng3 || config.Flowm5Rng4 || config.Flowm5Rng5); + + flowmeter6ComboBox.Text = string.IsNullOrEmpty(config.Flowmeter6) ? "---" : config.Flowmeter6; + flowm6Rng1CheckBox.Checked = config.Flowm6Rng1; + flowm6Rng2CheckBox.Checked = config.Flowm6Rng2; + flowm6Rng3CheckBox.Checked = config.Flowm6Rng3; + flowm6Rng4CheckBox.Checked = config.Flowm6Rng4; + flowm6Rng5CheckBox.Checked = config.Flowm6Rng5; + flowm6Rng0CheckBox.Checked = !(config.Flowm6Rng1 || config.Flowm6Rng2 || config.Flowm6Rng3 || config.Flowm6Rng4 || config.Flowm6Rng5); + + flowmeter7ComboBox.Text = string.IsNullOrEmpty(config.Flowmeter7) ? "---" : config.Flowmeter7; + flowm7Rng1CheckBox.Checked = config.Flowm7Rng1; + flowm7Rng2CheckBox.Checked = config.Flowm7Rng2; + flowm7Rng3CheckBox.Checked = config.Flowm7Rng3; + flowm7Rng4CheckBox.Checked = config.Flowm7Rng4; + flowm7Rng5CheckBox.Checked = config.Flowm7Rng5; + flowm7Rng0CheckBox.Checked = !(config.Flowm7Rng1 || config.Flowm7Rng2 || config.Flowm7Rng3 || config.Flowm7Rng4 || config.Flowm7Rng5); + + certificateTextBox.Text = config.CertificateFmt; + validityTextBox.Text = config.ValidityDays.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + + flowmeter1ComboBox.Enabled = true; + flowm1Rng0CheckBox.Enabled = true; + flowm1Rng1CheckBox.Enabled = true; + flowm1Rng2CheckBox.Enabled = true; + flowm1Rng3CheckBox.Enabled = true; + flowm1Rng4CheckBox.Enabled = true; + flowm1Rng5CheckBox.Enabled = true; + + flowmeter2ComboBox.Enabled = true; + flowm2Rng0CheckBox.Enabled = true; + flowm2Rng1CheckBox.Enabled = true; + flowm2Rng2CheckBox.Enabled = true; + flowm2Rng3CheckBox.Enabled = true; + flowm2Rng4CheckBox.Enabled = true; + flowm2Rng5CheckBox.Enabled = true; + + flowmeter3ComboBox.Enabled = true; + flowm3Rng0CheckBox.Enabled = true; + flowm3Rng1CheckBox.Enabled = true; + flowm3Rng2CheckBox.Enabled = true; + flowm3Rng3CheckBox.Enabled = true; + flowm3Rng4CheckBox.Enabled = true; + flowm3Rng5CheckBox.Enabled = true; + + flowmeter4ComboBox.Enabled = true; + flowm4Rng0CheckBox.Enabled = true; + flowm4Rng1CheckBox.Enabled = true; + flowm4Rng2CheckBox.Enabled = true; + flowm4Rng3CheckBox.Enabled = true; + flowm4Rng4CheckBox.Enabled = true; + flowm4Rng5CheckBox.Enabled = true; + + flowmeter5ComboBox.Enabled = true; + flowm5Rng0CheckBox.Enabled = true; + flowm5Rng1CheckBox.Enabled = true; + flowm5Rng2CheckBox.Enabled = true; + flowm5Rng3CheckBox.Enabled = true; + flowm5Rng4CheckBox.Enabled = true; + flowm5Rng5CheckBox.Enabled = true; + + flowmeter6ComboBox.Enabled = true; + flowm6Rng0CheckBox.Enabled = true; + flowm6Rng1CheckBox.Enabled = true; + flowm6Rng2CheckBox.Enabled = true; + flowm6Rng3CheckBox.Enabled = true; + flowm6Rng4CheckBox.Enabled = true; + flowm6Rng5CheckBox.Enabled = true; + + flowmeter7ComboBox.Enabled = true; + flowm7Rng0CheckBox.Enabled = true; + flowm7Rng1CheckBox.Enabled = true; + flowm7Rng2CheckBox.Enabled = true; + flowm7Rng3CheckBox.Enabled = true; + flowm7Rng4CheckBox.Enabled = true; + flowm7Rng5CheckBox.Enabled = true; + + certificateTextBox.Enabled = true; + validityTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (!flowmeter1ComboBox.Items.Contains(flowmeter1ComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + string.Format("Invalid {0}", flowmeter1Label.Text); + } + if ((flowmeter1ComboBox.Text != "---") && + (flowm1Rng0CheckBox.Checked == (flowm1Rng1CheckBox.Checked || flowm1Rng2CheckBox.Checked || flowm1Rng3CheckBox.Checked || + flowm1Rng4CheckBox.Checked || flowm1Rng5CheckBox.Checked))) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + string.Format("Invalid ranges for {0}", flowmeter1Label.Text); + } + + if (!flowmeter2ComboBox.Items.Contains(flowmeter2ComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + string.Format("Invalid {0}", flowmeter2Label.Text); + } + if ((flowmeter2ComboBox.Text != "---") && + (flowm2Rng0CheckBox.Checked == (flowm2Rng1CheckBox.Checked || flowm2Rng2CheckBox.Checked || flowm2Rng3CheckBox.Checked || + flowm2Rng4CheckBox.Checked || flowm2Rng5CheckBox.Checked))) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + string.Format("Invalid ranges for {0}", flowmeter2Label.Text); + } + + if (!flowmeter3ComboBox.Items.Contains(flowmeter3ComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + string.Format("Invalid {0}", flowmeter3Label.Text); + } + if ((flowmeter3ComboBox.Text != "---") && + (flowm3Rng0CheckBox.Checked == (flowm3Rng1CheckBox.Checked || flowm3Rng2CheckBox.Checked || flowm3Rng3CheckBox.Checked || + flowm3Rng4CheckBox.Checked || flowm3Rng5CheckBox.Checked))) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + string.Format("Invalid ranges for {0}", flowmeter3Label.Text); + } + + if (!flowmeter4ComboBox.Items.Contains(flowmeter4ComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + string.Format("Invalid {0}", flowmeter4Label.Text); + } + if ((flowmeter4ComboBox.Text != "---") && + (flowm4Rng0CheckBox.Checked == (flowm4Rng1CheckBox.Checked || flowm4Rng2CheckBox.Checked || flowm4Rng3CheckBox.Checked || + flowm4Rng4CheckBox.Checked || flowm4Rng5CheckBox.Checked))) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + string.Format("Invalid ranges for {0}", flowmeter4Label.Text); + } + + if (!flowmeter5ComboBox.Items.Contains(flowmeter5ComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + string.Format("Invalid {0}", flowmeter5Label.Text); + } + if ((flowmeter5ComboBox.Text != "---") && + (flowm5Rng0CheckBox.Checked == (flowm5Rng1CheckBox.Checked || flowm5Rng2CheckBox.Checked || flowm5Rng3CheckBox.Checked || + flowm5Rng4CheckBox.Checked || flowm5Rng5CheckBox.Checked))) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + string.Format("Invalid ranges for {0}", flowmeter5Label.Text); + } + + if (!flowmeter6ComboBox.Items.Contains(flowmeter6ComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + string.Format("Invalid {0}", flowmeter6Label.Text); + } + if ((flowmeter6ComboBox.Text != "---") && + (flowm6Rng0CheckBox.Checked == (flowm6Rng1CheckBox.Checked || flowm6Rng2CheckBox.Checked || flowm6Rng3CheckBox.Checked || + flowm6Rng4CheckBox.Checked || flowm6Rng5CheckBox.Checked))) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + string.Format("Invalid ranges for {0}", flowmeter6Label.Text); + } + + if (!flowmeter7ComboBox.Items.Contains(flowmeter7ComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + string.Format("Invalid {0}", flowmeter7Label.Text); + } + if ((flowmeter7ComboBox.Text != "---") && + (flowm7Rng0CheckBox.Checked == (flowm7Rng1CheckBox.Checked || flowm7Rng2CheckBox.Checked || flowm7Rng3CheckBox.Checked || + flowm7Rng4CheckBox.Checked || flowm7Rng5CheckBox.Checked))) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + string.Format("Invalid ranges for {0}", flowmeter7Label.Text); + } + + int tmp; + if (!int.TryParse(validityTextBox.Text, out tmp) || tmp < 0) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + string.Format("Invalid {0}", validityLabel.Text); + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + if (config.Name != nameTextBox.Text) + { + config.Name = nameTextBox.Text; + flags |= CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd; + } + + flags |= UpdateDifferent(ref config.Flowmeter1, flowmeter1ComboBox.Text, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm1Rng1, flowm1Rng1CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm1Rng2, flowm1Rng2CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm1Rng3, flowm1Rng3CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm1Rng4, flowm1Rng4CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm1Rng5, flowm1Rng5CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + + flags |= UpdateDifferent(ref config.Flowmeter2, flowmeter2ComboBox.Text, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm2Rng1, flowm2Rng1CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm2Rng2, flowm2Rng2CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm2Rng3, flowm2Rng3CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm2Rng4, flowm2Rng4CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm2Rng5, flowm2Rng5CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + + flags |= UpdateDifferent(ref config.Flowmeter3, flowmeter3ComboBox.Text, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm3Rng1, flowm3Rng1CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm3Rng2, flowm3Rng2CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm3Rng3, flowm3Rng3CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm3Rng4, flowm3Rng4CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm3Rng5, flowm3Rng5CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + + flags |= UpdateDifferent(ref config.Flowmeter4, flowmeter4ComboBox.Text, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm4Rng1, flowm4Rng1CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm4Rng2, flowm4Rng2CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm4Rng3, flowm4Rng3CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm4Rng4, flowm4Rng4CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm4Rng5, flowm4Rng5CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + + flags |= UpdateDifferent(ref config.Flowmeter5, flowmeter5ComboBox.Text, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm5Rng1, flowm5Rng1CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm5Rng2, flowm5Rng2CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm5Rng3, flowm5Rng3CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm5Rng4, flowm5Rng4CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm5Rng5, flowm5Rng5CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + + flags |= UpdateDifferent(ref config.Flowmeter6, flowmeter6ComboBox.Text, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm6Rng1, flowm6Rng1CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm6Rng2, flowm6Rng2CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm6Rng3, flowm6Rng3CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm6Rng4, flowm6Rng4CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm6Rng5, flowm6Rng5CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + + flags |= UpdateDifferent(ref config.Flowmeter7, flowmeter7ComboBox.Text, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm7Rng1, flowm7Rng1CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm7Rng2, flowm7Rng2CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm7Rng3, flowm7Rng3CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm7Rng4, flowm7Rng4CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.Flowm7Rng5, flowm7Rng5CheckBox.Checked, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + + flags |= UpdateDifferent(ref config.CertificateFmt, certificateTextBox.Text, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + flags |= UpdateDifferent(ref config.ValidityDays, validityTextBox.Text, CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/SaveFlowmeterCorrections/SaveFlowmeterCorrCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/SaveFlowmeterCorrections/SaveFlowmeterCorrCfgCtrl.designer.cs new file mode 100644 index 00000000..7225ee2b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/SaveFlowmeterCorrections/SaveFlowmeterCorrCfgCtrl.designer.cs @@ -0,0 +1,912 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +namespace TBF.BenchControl.Output.DB.SaveFlowmeterCorrections +{ + partial class SaveFlowmeterCorrCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.flowmeter1Label = new System.Windows.Forms.Label(); + this.flowmeter1ComboBox = new System.Windows.Forms.ComboBox(); + this.flowm1Rng1CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm1Rng2CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm1Rng3CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm1Rng4CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm1Rng5CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm2Rng5CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm2Rng4CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm2Rng3CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm2Rng2CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm2Rng1CheckBox = new System.Windows.Forms.CheckBox(); + this.flowmeter2ComboBox = new System.Windows.Forms.ComboBox(); + this.flowmeter2Label = new System.Windows.Forms.Label(); + this.flowm3Rng5CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm3Rng4CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm3Rng3CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm3Rng2CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm3Rng1CheckBox = new System.Windows.Forms.CheckBox(); + this.flowmeter3ComboBox = new System.Windows.Forms.ComboBox(); + this.flowmeter3Label = new System.Windows.Forms.Label(); + this.flowm4Rng5CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm4Rng4CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm4Rng3CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm4Rng2CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm4Rng1CheckBox = new System.Windows.Forms.CheckBox(); + this.flowmeter4ComboBox = new System.Windows.Forms.ComboBox(); + this.flowmeter4Label = new System.Windows.Forms.Label(); + this.flowm5Rng5CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm5Rng4CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm5Rng3CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm5Rng2CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm5Rng1CheckBox = new System.Windows.Forms.CheckBox(); + this.flowmeter5ComboBox = new System.Windows.Forms.ComboBox(); + this.flowmeter5Label = new System.Windows.Forms.Label(); + this.flowm5Rng0CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm4Rng0CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm3Rng0CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm2Rng0CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm1Rng0CheckBox = new System.Windows.Forms.CheckBox(); + this.label1 = new System.Windows.Forms.Label(); + this.flowm6Rng0CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm6Rng5CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm6Rng4CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm6Rng3CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm6Rng2CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm6Rng1CheckBox = new System.Windows.Forms.CheckBox(); + this.flowmeter6ComboBox = new System.Windows.Forms.ComboBox(); + this.flowmeter6Label = new System.Windows.Forms.Label(); + this.flowm7Rng0CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm7Rng5CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm7Rng4CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm7Rng3CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm7Rng2CheckBox = new System.Windows.Forms.CheckBox(); + this.flowm7Rng1CheckBox = new System.Windows.Forms.CheckBox(); + this.flowmeter7ComboBox = new System.Windows.Forms.ComboBox(); + this.flowmeter7Label = new System.Windows.Forms.Label(); + this.certificateTextBox = new System.Windows.Forms.TextBox(); + this.certificateLabel = new System.Windows.Forms.Label(); + this.validityTextBox = new System.Windows.Forms.TextBox(); + this.validityLabel = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(95, 31); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(212, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(15, 34); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(107, 9); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // flowmeter1Label + // + this.flowmeter1Label.AutoSize = true; + this.flowmeter1Label.Location = new System.Drawing.Point(15, 80); + this.flowmeter1Label.Name = "flowmeter1Label"; + this.flowmeter1Label.Size = new System.Drawing.Size(64, 13); + this.flowmeter1Label.TabIndex = 3; + this.flowmeter1Label.Text = "Flowmeter 1"; + // + // flowmeter1ComboBox + // + this.flowmeter1ComboBox.Enabled = false; + this.flowmeter1ComboBox.FormattingEnabled = true; + this.flowmeter1ComboBox.Location = new System.Drawing.Point(95, 77); + this.flowmeter1ComboBox.Name = "flowmeter1ComboBox"; + this.flowmeter1ComboBox.Size = new System.Drawing.Size(69, 21); + this.flowmeter1ComboBox.TabIndex = 4; + // + // flowm1Rng1CheckBox + // + this.flowm1Rng1CheckBox.AutoSize = true; + this.flowm1Rng1CheckBox.Enabled = false; + this.flowm1Rng1CheckBox.Location = new System.Drawing.Point(245, 80); + this.flowm1Rng1CheckBox.Name = "flowm1Rng1CheckBox"; + this.flowm1Rng1CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm1Rng1CheckBox.TabIndex = 6; + this.flowm1Rng1CheckBox.Text = "1"; + this.flowm1Rng1CheckBox.UseVisualStyleBackColor = true; + // + // flowm1Rng2CheckBox + // + this.flowm1Rng2CheckBox.AutoSize = true; + this.flowm1Rng2CheckBox.Enabled = false; + this.flowm1Rng2CheckBox.Location = new System.Drawing.Point(275, 80); + this.flowm1Rng2CheckBox.Name = "flowm1Rng2CheckBox"; + this.flowm1Rng2CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm1Rng2CheckBox.TabIndex = 7; + this.flowm1Rng2CheckBox.Text = "2"; + this.flowm1Rng2CheckBox.UseVisualStyleBackColor = true; + // + // flowm1Rng3CheckBox + // + this.flowm1Rng3CheckBox.AutoSize = true; + this.flowm1Rng3CheckBox.Enabled = false; + this.flowm1Rng3CheckBox.Location = new System.Drawing.Point(305, 80); + this.flowm1Rng3CheckBox.Name = "flowm1Rng3CheckBox"; + this.flowm1Rng3CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm1Rng3CheckBox.TabIndex = 8; + this.flowm1Rng3CheckBox.Text = "3"; + this.flowm1Rng3CheckBox.UseVisualStyleBackColor = true; + // + // flowm1Rng4CheckBox + // + this.flowm1Rng4CheckBox.AutoSize = true; + this.flowm1Rng4CheckBox.Enabled = false; + this.flowm1Rng4CheckBox.Location = new System.Drawing.Point(335, 80); + this.flowm1Rng4CheckBox.Name = "flowm1Rng4CheckBox"; + this.flowm1Rng4CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm1Rng4CheckBox.TabIndex = 9; + this.flowm1Rng4CheckBox.Text = "4"; + this.flowm1Rng4CheckBox.UseVisualStyleBackColor = true; + // + // flowm1Rng5CheckBox + // + this.flowm1Rng5CheckBox.AutoSize = true; + this.flowm1Rng5CheckBox.Enabled = false; + this.flowm1Rng5CheckBox.Location = new System.Drawing.Point(365, 80); + this.flowm1Rng5CheckBox.Name = "flowm1Rng5CheckBox"; + this.flowm1Rng5CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm1Rng5CheckBox.TabIndex = 10; + this.flowm1Rng5CheckBox.Text = "5"; + this.flowm1Rng5CheckBox.UseVisualStyleBackColor = true; + // + // flowm2Rng5CheckBox + // + this.flowm2Rng5CheckBox.AutoSize = true; + this.flowm2Rng5CheckBox.Enabled = false; + this.flowm2Rng5CheckBox.Location = new System.Drawing.Point(365, 104); + this.flowm2Rng5CheckBox.Name = "flowm2Rng5CheckBox"; + this.flowm2Rng5CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm2Rng5CheckBox.TabIndex = 18; + this.flowm2Rng5CheckBox.Text = "5"; + this.flowm2Rng5CheckBox.UseVisualStyleBackColor = true; + // + // flowm2Rng4CheckBox + // + this.flowm2Rng4CheckBox.AutoSize = true; + this.flowm2Rng4CheckBox.Enabled = false; + this.flowm2Rng4CheckBox.Location = new System.Drawing.Point(335, 104); + this.flowm2Rng4CheckBox.Name = "flowm2Rng4CheckBox"; + this.flowm2Rng4CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm2Rng4CheckBox.TabIndex = 17; + this.flowm2Rng4CheckBox.Text = "4"; + this.flowm2Rng4CheckBox.UseVisualStyleBackColor = true; + // + // flowm2Rng3CheckBox + // + this.flowm2Rng3CheckBox.AutoSize = true; + this.flowm2Rng3CheckBox.Enabled = false; + this.flowm2Rng3CheckBox.Location = new System.Drawing.Point(305, 104); + this.flowm2Rng3CheckBox.Name = "flowm2Rng3CheckBox"; + this.flowm2Rng3CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm2Rng3CheckBox.TabIndex = 16; + this.flowm2Rng3CheckBox.Text = "3"; + this.flowm2Rng3CheckBox.UseVisualStyleBackColor = true; + // + // flowm2Rng2CheckBox + // + this.flowm2Rng2CheckBox.AutoSize = true; + this.flowm2Rng2CheckBox.Enabled = false; + this.flowm2Rng2CheckBox.Location = new System.Drawing.Point(275, 104); + this.flowm2Rng2CheckBox.Name = "flowm2Rng2CheckBox"; + this.flowm2Rng2CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm2Rng2CheckBox.TabIndex = 15; + this.flowm2Rng2CheckBox.Text = "2"; + this.flowm2Rng2CheckBox.UseVisualStyleBackColor = true; + // + // flowm2Rng1CheckBox + // + this.flowm2Rng1CheckBox.AutoSize = true; + this.flowm2Rng1CheckBox.Enabled = false; + this.flowm2Rng1CheckBox.Location = new System.Drawing.Point(245, 104); + this.flowm2Rng1CheckBox.Name = "flowm2Rng1CheckBox"; + this.flowm2Rng1CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm2Rng1CheckBox.TabIndex = 14; + this.flowm2Rng1CheckBox.Text = "1"; + this.flowm2Rng1CheckBox.UseVisualStyleBackColor = true; + // + // flowmeter2ComboBox + // + this.flowmeter2ComboBox.Enabled = false; + this.flowmeter2ComboBox.FormattingEnabled = true; + this.flowmeter2ComboBox.Location = new System.Drawing.Point(95, 101); + this.flowmeter2ComboBox.Name = "flowmeter2ComboBox"; + this.flowmeter2ComboBox.Size = new System.Drawing.Size(69, 21); + this.flowmeter2ComboBox.TabIndex = 12; + // + // flowmeter2Label + // + this.flowmeter2Label.AutoSize = true; + this.flowmeter2Label.Location = new System.Drawing.Point(15, 104); + this.flowmeter2Label.Name = "flowmeter2Label"; + this.flowmeter2Label.Size = new System.Drawing.Size(64, 13); + this.flowmeter2Label.TabIndex = 11; + this.flowmeter2Label.Text = "Flowmeter 2"; + // + // flowm3Rng5CheckBox + // + this.flowm3Rng5CheckBox.AutoSize = true; + this.flowm3Rng5CheckBox.Enabled = false; + this.flowm3Rng5CheckBox.Location = new System.Drawing.Point(365, 128); + this.flowm3Rng5CheckBox.Name = "flowm3Rng5CheckBox"; + this.flowm3Rng5CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm3Rng5CheckBox.TabIndex = 26; + this.flowm3Rng5CheckBox.Text = "5"; + this.flowm3Rng5CheckBox.UseVisualStyleBackColor = true; + // + // flowm3Rng4CheckBox + // + this.flowm3Rng4CheckBox.AutoSize = true; + this.flowm3Rng4CheckBox.Enabled = false; + this.flowm3Rng4CheckBox.Location = new System.Drawing.Point(335, 128); + this.flowm3Rng4CheckBox.Name = "flowm3Rng4CheckBox"; + this.flowm3Rng4CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm3Rng4CheckBox.TabIndex = 25; + this.flowm3Rng4CheckBox.Text = "4"; + this.flowm3Rng4CheckBox.UseVisualStyleBackColor = true; + // + // flowm3Rng3CheckBox + // + this.flowm3Rng3CheckBox.AutoSize = true; + this.flowm3Rng3CheckBox.Enabled = false; + this.flowm3Rng3CheckBox.Location = new System.Drawing.Point(305, 128); + this.flowm3Rng3CheckBox.Name = "flowm3Rng3CheckBox"; + this.flowm3Rng3CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm3Rng3CheckBox.TabIndex = 24; + this.flowm3Rng3CheckBox.Text = "3"; + this.flowm3Rng3CheckBox.UseVisualStyleBackColor = true; + // + // flowm3Rng2CheckBox + // + this.flowm3Rng2CheckBox.AutoSize = true; + this.flowm3Rng2CheckBox.Enabled = false; + this.flowm3Rng2CheckBox.Location = new System.Drawing.Point(275, 128); + this.flowm3Rng2CheckBox.Name = "flowm3Rng2CheckBox"; + this.flowm3Rng2CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm3Rng2CheckBox.TabIndex = 23; + this.flowm3Rng2CheckBox.Text = "2"; + this.flowm3Rng2CheckBox.UseVisualStyleBackColor = true; + // + // flowm3Rng1CheckBox + // + this.flowm3Rng1CheckBox.AutoSize = true; + this.flowm3Rng1CheckBox.Enabled = false; + this.flowm3Rng1CheckBox.Location = new System.Drawing.Point(245, 128); + this.flowm3Rng1CheckBox.Name = "flowm3Rng1CheckBox"; + this.flowm3Rng1CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm3Rng1CheckBox.TabIndex = 22; + this.flowm3Rng1CheckBox.Text = "1"; + this.flowm3Rng1CheckBox.UseVisualStyleBackColor = true; + // + // flowmeter3ComboBox + // + this.flowmeter3ComboBox.Enabled = false; + this.flowmeter3ComboBox.FormattingEnabled = true; + this.flowmeter3ComboBox.Location = new System.Drawing.Point(95, 125); + this.flowmeter3ComboBox.Name = "flowmeter3ComboBox"; + this.flowmeter3ComboBox.Size = new System.Drawing.Size(69, 21); + this.flowmeter3ComboBox.TabIndex = 20; + // + // flowmeter3Label + // + this.flowmeter3Label.AutoSize = true; + this.flowmeter3Label.Location = new System.Drawing.Point(15, 128); + this.flowmeter3Label.Name = "flowmeter3Label"; + this.flowmeter3Label.Size = new System.Drawing.Size(64, 13); + this.flowmeter3Label.TabIndex = 19; + this.flowmeter3Label.Text = "Flowmeter 3"; + // + // flowm4Rng5CheckBox + // + this.flowm4Rng5CheckBox.AutoSize = true; + this.flowm4Rng5CheckBox.Enabled = false; + this.flowm4Rng5CheckBox.Location = new System.Drawing.Point(365, 152); + this.flowm4Rng5CheckBox.Name = "flowm4Rng5CheckBox"; + this.flowm4Rng5CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm4Rng5CheckBox.TabIndex = 34; + this.flowm4Rng5CheckBox.Text = "5"; + this.flowm4Rng5CheckBox.UseVisualStyleBackColor = true; + // + // flowm4Rng4CheckBox + // + this.flowm4Rng4CheckBox.AutoSize = true; + this.flowm4Rng4CheckBox.Enabled = false; + this.flowm4Rng4CheckBox.Location = new System.Drawing.Point(335, 152); + this.flowm4Rng4CheckBox.Name = "flowm4Rng4CheckBox"; + this.flowm4Rng4CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm4Rng4CheckBox.TabIndex = 33; + this.flowm4Rng4CheckBox.Text = "4"; + this.flowm4Rng4CheckBox.UseVisualStyleBackColor = true; + // + // flowm4Rng3CheckBox + // + this.flowm4Rng3CheckBox.AutoSize = true; + this.flowm4Rng3CheckBox.Enabled = false; + this.flowm4Rng3CheckBox.Location = new System.Drawing.Point(305, 152); + this.flowm4Rng3CheckBox.Name = "flowm4Rng3CheckBox"; + this.flowm4Rng3CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm4Rng3CheckBox.TabIndex = 32; + this.flowm4Rng3CheckBox.Text = "3"; + this.flowm4Rng3CheckBox.UseVisualStyleBackColor = true; + // + // flowm4Rng2CheckBox + // + this.flowm4Rng2CheckBox.AutoSize = true; + this.flowm4Rng2CheckBox.Enabled = false; + this.flowm4Rng2CheckBox.Location = new System.Drawing.Point(275, 152); + this.flowm4Rng2CheckBox.Name = "flowm4Rng2CheckBox"; + this.flowm4Rng2CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm4Rng2CheckBox.TabIndex = 31; + this.flowm4Rng2CheckBox.Text = "2"; + this.flowm4Rng2CheckBox.UseVisualStyleBackColor = true; + // + // flowm4Rng1CheckBox + // + this.flowm4Rng1CheckBox.AutoSize = true; + this.flowm4Rng1CheckBox.Enabled = false; + this.flowm4Rng1CheckBox.Location = new System.Drawing.Point(245, 152); + this.flowm4Rng1CheckBox.Name = "flowm4Rng1CheckBox"; + this.flowm4Rng1CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm4Rng1CheckBox.TabIndex = 30; + this.flowm4Rng1CheckBox.Text = "1"; + this.flowm4Rng1CheckBox.UseVisualStyleBackColor = true; + // + // flowmeter4ComboBox + // + this.flowmeter4ComboBox.Enabled = false; + this.flowmeter4ComboBox.FormattingEnabled = true; + this.flowmeter4ComboBox.Location = new System.Drawing.Point(95, 149); + this.flowmeter4ComboBox.Name = "flowmeter4ComboBox"; + this.flowmeter4ComboBox.Size = new System.Drawing.Size(69, 21); + this.flowmeter4ComboBox.TabIndex = 28; + // + // flowmeter4Label + // + this.flowmeter4Label.AutoSize = true; + this.flowmeter4Label.Location = new System.Drawing.Point(15, 152); + this.flowmeter4Label.Name = "flowmeter4Label"; + this.flowmeter4Label.Size = new System.Drawing.Size(64, 13); + this.flowmeter4Label.TabIndex = 27; + this.flowmeter4Label.Text = "Flowmeter 4"; + // + // flowm5Rng5CheckBox + // + this.flowm5Rng5CheckBox.AutoSize = true; + this.flowm5Rng5CheckBox.Enabled = false; + this.flowm5Rng5CheckBox.Location = new System.Drawing.Point(365, 176); + this.flowm5Rng5CheckBox.Name = "flowm5Rng5CheckBox"; + this.flowm5Rng5CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm5Rng5CheckBox.TabIndex = 42; + this.flowm5Rng5CheckBox.Text = "5"; + this.flowm5Rng5CheckBox.UseVisualStyleBackColor = true; + // + // flowm5Rng4CheckBox + // + this.flowm5Rng4CheckBox.AutoSize = true; + this.flowm5Rng4CheckBox.Enabled = false; + this.flowm5Rng4CheckBox.Location = new System.Drawing.Point(335, 176); + this.flowm5Rng4CheckBox.Name = "flowm5Rng4CheckBox"; + this.flowm5Rng4CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm5Rng4CheckBox.TabIndex = 41; + this.flowm5Rng4CheckBox.Text = "4"; + this.flowm5Rng4CheckBox.UseVisualStyleBackColor = true; + // + // flowm5Rng3CheckBox + // + this.flowm5Rng3CheckBox.AutoSize = true; + this.flowm5Rng3CheckBox.Enabled = false; + this.flowm5Rng3CheckBox.Location = new System.Drawing.Point(305, 176); + this.flowm5Rng3CheckBox.Name = "flowm5Rng3CheckBox"; + this.flowm5Rng3CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm5Rng3CheckBox.TabIndex = 40; + this.flowm5Rng3CheckBox.Text = "3"; + this.flowm5Rng3CheckBox.UseVisualStyleBackColor = true; + // + // flowm5Rng2CheckBox + // + this.flowm5Rng2CheckBox.AutoSize = true; + this.flowm5Rng2CheckBox.Enabled = false; + this.flowm5Rng2CheckBox.Location = new System.Drawing.Point(275, 176); + this.flowm5Rng2CheckBox.Name = "flowm5Rng2CheckBox"; + this.flowm5Rng2CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm5Rng2CheckBox.TabIndex = 39; + this.flowm5Rng2CheckBox.Text = "2"; + this.flowm5Rng2CheckBox.UseVisualStyleBackColor = true; + // + // flowm5Rng1CheckBox + // + this.flowm5Rng1CheckBox.AutoSize = true; + this.flowm5Rng1CheckBox.Enabled = false; + this.flowm5Rng1CheckBox.Location = new System.Drawing.Point(245, 176); + this.flowm5Rng1CheckBox.Name = "flowm5Rng1CheckBox"; + this.flowm5Rng1CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm5Rng1CheckBox.TabIndex = 38; + this.flowm5Rng1CheckBox.Text = "1"; + this.flowm5Rng1CheckBox.UseVisualStyleBackColor = true; + // + // flowmeter5ComboBox + // + this.flowmeter5ComboBox.Enabled = false; + this.flowmeter5ComboBox.FormattingEnabled = true; + this.flowmeter5ComboBox.Location = new System.Drawing.Point(95, 173); + this.flowmeter5ComboBox.Name = "flowmeter5ComboBox"; + this.flowmeter5ComboBox.Size = new System.Drawing.Size(69, 21); + this.flowmeter5ComboBox.TabIndex = 36; + // + // flowmeter5Label + // + this.flowmeter5Label.AutoSize = true; + this.flowmeter5Label.Location = new System.Drawing.Point(15, 176); + this.flowmeter5Label.Name = "flowmeter5Label"; + this.flowmeter5Label.Size = new System.Drawing.Size(64, 13); + this.flowmeter5Label.TabIndex = 35; + this.flowmeter5Label.Text = "Flowmeter 5"; + // + // flowm5Rng0CheckBox + // + this.flowm5Rng0CheckBox.AutoSize = true; + this.flowm5Rng0CheckBox.Enabled = false; + this.flowm5Rng0CheckBox.Location = new System.Drawing.Point(196, 176); + this.flowm5Rng0CheckBox.Name = "flowm5Rng0CheckBox"; + this.flowm5Rng0CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm5Rng0CheckBox.TabIndex = 37; + this.flowm5Rng0CheckBox.Text = "0"; + this.flowm5Rng0CheckBox.UseVisualStyleBackColor = true; + // + // flowm4Rng0CheckBox + // + this.flowm4Rng0CheckBox.AutoSize = true; + this.flowm4Rng0CheckBox.Enabled = false; + this.flowm4Rng0CheckBox.Location = new System.Drawing.Point(196, 152); + this.flowm4Rng0CheckBox.Name = "flowm4Rng0CheckBox"; + this.flowm4Rng0CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm4Rng0CheckBox.TabIndex = 29; + this.flowm4Rng0CheckBox.Text = "0"; + this.flowm4Rng0CheckBox.UseVisualStyleBackColor = true; + // + // flowm3Rng0CheckBox + // + this.flowm3Rng0CheckBox.AutoSize = true; + this.flowm3Rng0CheckBox.Enabled = false; + this.flowm3Rng0CheckBox.Location = new System.Drawing.Point(196, 128); + this.flowm3Rng0CheckBox.Name = "flowm3Rng0CheckBox"; + this.flowm3Rng0CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm3Rng0CheckBox.TabIndex = 21; + this.flowm3Rng0CheckBox.Text = "0"; + this.flowm3Rng0CheckBox.UseVisualStyleBackColor = true; + // + // flowm2Rng0CheckBox + // + this.flowm2Rng0CheckBox.AutoSize = true; + this.flowm2Rng0CheckBox.Enabled = false; + this.flowm2Rng0CheckBox.Location = new System.Drawing.Point(196, 104); + this.flowm2Rng0CheckBox.Name = "flowm2Rng0CheckBox"; + this.flowm2Rng0CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm2Rng0CheckBox.TabIndex = 13; + this.flowm2Rng0CheckBox.Text = "0"; + this.flowm2Rng0CheckBox.UseVisualStyleBackColor = true; + // + // flowm1Rng0CheckBox + // + this.flowm1Rng0CheckBox.AutoSize = true; + this.flowm1Rng0CheckBox.Enabled = false; + this.flowm1Rng0CheckBox.Location = new System.Drawing.Point(196, 80); + this.flowm1Rng0CheckBox.Name = "flowm1Rng0CheckBox"; + this.flowm1Rng0CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm1Rng0CheckBox.TabIndex = 5; + this.flowm1Rng0CheckBox.Text = "0"; + this.flowm1Rng0CheckBox.UseVisualStyleBackColor = true; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(193, 58); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(179, 13); + this.label1.TabIndex = 43; + this.label1.Text = "Ranges to calibrate (either 0 or 1...5)"; + // + // flowm6Rng0CheckBox + // + this.flowm6Rng0CheckBox.AutoSize = true; + this.flowm6Rng0CheckBox.Enabled = false; + this.flowm6Rng0CheckBox.Location = new System.Drawing.Point(196, 200); + this.flowm6Rng0CheckBox.Name = "flowm6Rng0CheckBox"; + this.flowm6Rng0CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm6Rng0CheckBox.TabIndex = 46; + this.flowm6Rng0CheckBox.Text = "0"; + this.flowm6Rng0CheckBox.UseVisualStyleBackColor = true; + // + // flowm6Rng5CheckBox + // + this.flowm6Rng5CheckBox.AutoSize = true; + this.flowm6Rng5CheckBox.Enabled = false; + this.flowm6Rng5CheckBox.Location = new System.Drawing.Point(365, 200); + this.flowm6Rng5CheckBox.Name = "flowm6Rng5CheckBox"; + this.flowm6Rng5CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm6Rng5CheckBox.TabIndex = 51; + this.flowm6Rng5CheckBox.Text = "5"; + this.flowm6Rng5CheckBox.UseVisualStyleBackColor = true; + // + // flowm6Rng4CheckBox + // + this.flowm6Rng4CheckBox.AutoSize = true; + this.flowm6Rng4CheckBox.Enabled = false; + this.flowm6Rng4CheckBox.Location = new System.Drawing.Point(335, 200); + this.flowm6Rng4CheckBox.Name = "flowm6Rng4CheckBox"; + this.flowm6Rng4CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm6Rng4CheckBox.TabIndex = 50; + this.flowm6Rng4CheckBox.Text = "4"; + this.flowm6Rng4CheckBox.UseVisualStyleBackColor = true; + // + // flowm6Rng3CheckBox + // + this.flowm6Rng3CheckBox.AutoSize = true; + this.flowm6Rng3CheckBox.Enabled = false; + this.flowm6Rng3CheckBox.Location = new System.Drawing.Point(305, 200); + this.flowm6Rng3CheckBox.Name = "flowm6Rng3CheckBox"; + this.flowm6Rng3CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm6Rng3CheckBox.TabIndex = 49; + this.flowm6Rng3CheckBox.Text = "3"; + this.flowm6Rng3CheckBox.UseVisualStyleBackColor = true; + // + // flowm6Rng2CheckBox + // + this.flowm6Rng2CheckBox.AutoSize = true; + this.flowm6Rng2CheckBox.Enabled = false; + this.flowm6Rng2CheckBox.Location = new System.Drawing.Point(275, 200); + this.flowm6Rng2CheckBox.Name = "flowm6Rng2CheckBox"; + this.flowm6Rng2CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm6Rng2CheckBox.TabIndex = 48; + this.flowm6Rng2CheckBox.Text = "2"; + this.flowm6Rng2CheckBox.UseVisualStyleBackColor = true; + // + // flowm6Rng1CheckBox + // + this.flowm6Rng1CheckBox.AutoSize = true; + this.flowm6Rng1CheckBox.Enabled = false; + this.flowm6Rng1CheckBox.Location = new System.Drawing.Point(245, 200); + this.flowm6Rng1CheckBox.Name = "flowm6Rng1CheckBox"; + this.flowm6Rng1CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm6Rng1CheckBox.TabIndex = 47; + this.flowm6Rng1CheckBox.Text = "1"; + this.flowm6Rng1CheckBox.UseVisualStyleBackColor = true; + // + // flowmeter6ComboBox + // + this.flowmeter6ComboBox.Enabled = false; + this.flowmeter6ComboBox.FormattingEnabled = true; + this.flowmeter6ComboBox.Location = new System.Drawing.Point(95, 197); + this.flowmeter6ComboBox.Name = "flowmeter6ComboBox"; + this.flowmeter6ComboBox.Size = new System.Drawing.Size(69, 21); + this.flowmeter6ComboBox.TabIndex = 45; + // + // flowmeter6Label + // + this.flowmeter6Label.AutoSize = true; + this.flowmeter6Label.Location = new System.Drawing.Point(15, 200); + this.flowmeter6Label.Name = "flowmeter6Label"; + this.flowmeter6Label.Size = new System.Drawing.Size(64, 13); + this.flowmeter6Label.TabIndex = 44; + this.flowmeter6Label.Text = "Flowmeter 6"; + // + // flowm7Rng0CheckBox + // + this.flowm7Rng0CheckBox.AutoSize = true; + this.flowm7Rng0CheckBox.Enabled = false; + this.flowm7Rng0CheckBox.Location = new System.Drawing.Point(196, 224); + this.flowm7Rng0CheckBox.Name = "flowm7Rng0CheckBox"; + this.flowm7Rng0CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm7Rng0CheckBox.TabIndex = 54; + this.flowm7Rng0CheckBox.Text = "0"; + this.flowm7Rng0CheckBox.UseVisualStyleBackColor = true; + // + // flowm7Rng5CheckBox + // + this.flowm7Rng5CheckBox.AutoSize = true; + this.flowm7Rng5CheckBox.Enabled = false; + this.flowm7Rng5CheckBox.Location = new System.Drawing.Point(365, 224); + this.flowm7Rng5CheckBox.Name = "flowm7Rng5CheckBox"; + this.flowm7Rng5CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm7Rng5CheckBox.TabIndex = 59; + this.flowm7Rng5CheckBox.Text = "5"; + this.flowm7Rng5CheckBox.UseVisualStyleBackColor = true; + // + // flowm7Rng4CheckBox + // + this.flowm7Rng4CheckBox.AutoSize = true; + this.flowm7Rng4CheckBox.Enabled = false; + this.flowm7Rng4CheckBox.Location = new System.Drawing.Point(335, 224); + this.flowm7Rng4CheckBox.Name = "flowm7Rng4CheckBox"; + this.flowm7Rng4CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm7Rng4CheckBox.TabIndex = 58; + this.flowm7Rng4CheckBox.Text = "4"; + this.flowm7Rng4CheckBox.UseVisualStyleBackColor = true; + // + // flowm7Rng3CheckBox + // + this.flowm7Rng3CheckBox.AutoSize = true; + this.flowm7Rng3CheckBox.Enabled = false; + this.flowm7Rng3CheckBox.Location = new System.Drawing.Point(305, 224); + this.flowm7Rng3CheckBox.Name = "flowm7Rng3CheckBox"; + this.flowm7Rng3CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm7Rng3CheckBox.TabIndex = 57; + this.flowm7Rng3CheckBox.Text = "3"; + this.flowm7Rng3CheckBox.UseVisualStyleBackColor = true; + // + // flowm7Rng2CheckBox + // + this.flowm7Rng2CheckBox.AutoSize = true; + this.flowm7Rng2CheckBox.Enabled = false; + this.flowm7Rng2CheckBox.Location = new System.Drawing.Point(275, 224); + this.flowm7Rng2CheckBox.Name = "flowm7Rng2CheckBox"; + this.flowm7Rng2CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm7Rng2CheckBox.TabIndex = 56; + this.flowm7Rng2CheckBox.Text = "2"; + this.flowm7Rng2CheckBox.UseVisualStyleBackColor = true; + // + // flowm7Rng1CheckBox + // + this.flowm7Rng1CheckBox.AutoSize = true; + this.flowm7Rng1CheckBox.Enabled = false; + this.flowm7Rng1CheckBox.Location = new System.Drawing.Point(245, 224); + this.flowm7Rng1CheckBox.Name = "flowm7Rng1CheckBox"; + this.flowm7Rng1CheckBox.Size = new System.Drawing.Size(32, 17); + this.flowm7Rng1CheckBox.TabIndex = 55; + this.flowm7Rng1CheckBox.Text = "1"; + this.flowm7Rng1CheckBox.UseVisualStyleBackColor = true; + // + // flowmeter7ComboBox + // + this.flowmeter7ComboBox.Enabled = false; + this.flowmeter7ComboBox.FormattingEnabled = true; + this.flowmeter7ComboBox.Location = new System.Drawing.Point(95, 221); + this.flowmeter7ComboBox.Name = "flowmeter7ComboBox"; + this.flowmeter7ComboBox.Size = new System.Drawing.Size(69, 21); + this.flowmeter7ComboBox.TabIndex = 53; + // + // flowmeter7Label + // + this.flowmeter7Label.AutoSize = true; + this.flowmeter7Label.Location = new System.Drawing.Point(15, 224); + this.flowmeter7Label.Name = "flowmeter7Label"; + this.flowmeter7Label.Size = new System.Drawing.Size(64, 13); + this.flowmeter7Label.TabIndex = 52; + this.flowmeter7Label.Text = "Flowmeter 7"; + // + // certificateTextBox + // + this.certificateTextBox.Enabled = false; + this.certificateTextBox.Location = new System.Drawing.Point(95, 249); + this.certificateTextBox.Name = "certificateTextBox"; + this.certificateTextBox.Size = new System.Drawing.Size(212, 20); + this.certificateTextBox.TabIndex = 61; + // + // certificateLabel + // + this.certificateLabel.AutoSize = true; + this.certificateLabel.Location = new System.Drawing.Point(15, 252); + this.certificateLabel.Name = "certificateLabel"; + this.certificateLabel.Size = new System.Drawing.Size(54, 13); + this.certificateLabel.TabIndex = 60; + this.certificateLabel.Text = "Certificate"; + // + // validityTextBox + // + this.validityTextBox.Enabled = false; + this.validityTextBox.Location = new System.Drawing.Point(95, 273); + this.validityTextBox.Name = "validityTextBox"; + this.validityTextBox.Size = new System.Drawing.Size(69, 20); + this.validityTextBox.TabIndex = 63; + // + // validityLabel + // + this.validityLabel.AutoSize = true; + this.validityLabel.Location = new System.Drawing.Point(15, 276); + this.validityLabel.Name = "validityLabel"; + this.validityLabel.Size = new System.Drawing.Size(71, 13); + this.validityLabel.TabIndex = 62; + this.validityLabel.Text = "Validity (days)"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(313, 252); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(120, 13); + this.label2.TabIndex = 64; + this.label2.Text = "(0=start 1-end, 2=batch)"; + // + // SaveFlowmeterCorrCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.label2); + this.Controls.Add(this.validityTextBox); + this.Controls.Add(this.validityLabel); + this.Controls.Add(this.certificateTextBox); + this.Controls.Add(this.certificateLabel); + this.Controls.Add(this.flowm7Rng0CheckBox); + this.Controls.Add(this.flowm7Rng5CheckBox); + this.Controls.Add(this.flowm7Rng4CheckBox); + this.Controls.Add(this.flowm7Rng3CheckBox); + this.Controls.Add(this.flowm7Rng2CheckBox); + this.Controls.Add(this.flowm7Rng1CheckBox); + this.Controls.Add(this.flowmeter7ComboBox); + this.Controls.Add(this.flowmeter7Label); + this.Controls.Add(this.flowm6Rng0CheckBox); + this.Controls.Add(this.flowm6Rng5CheckBox); + this.Controls.Add(this.flowm6Rng4CheckBox); + this.Controls.Add(this.flowm6Rng3CheckBox); + this.Controls.Add(this.flowm6Rng2CheckBox); + this.Controls.Add(this.flowm6Rng1CheckBox); + this.Controls.Add(this.flowmeter6ComboBox); + this.Controls.Add(this.flowmeter6Label); + this.Controls.Add(this.label1); + this.Controls.Add(this.flowm5Rng0CheckBox); + this.Controls.Add(this.flowm4Rng0CheckBox); + this.Controls.Add(this.flowm3Rng0CheckBox); + this.Controls.Add(this.flowm2Rng0CheckBox); + this.Controls.Add(this.flowm1Rng0CheckBox); + this.Controls.Add(this.flowm5Rng5CheckBox); + this.Controls.Add(this.flowm5Rng4CheckBox); + this.Controls.Add(this.flowm5Rng3CheckBox); + this.Controls.Add(this.flowm5Rng2CheckBox); + this.Controls.Add(this.flowm5Rng1CheckBox); + this.Controls.Add(this.flowmeter5ComboBox); + this.Controls.Add(this.flowmeter5Label); + this.Controls.Add(this.flowm4Rng5CheckBox); + this.Controls.Add(this.flowm4Rng4CheckBox); + this.Controls.Add(this.flowm4Rng3CheckBox); + this.Controls.Add(this.flowm4Rng2CheckBox); + this.Controls.Add(this.flowm4Rng1CheckBox); + this.Controls.Add(this.flowmeter4ComboBox); + this.Controls.Add(this.flowmeter4Label); + this.Controls.Add(this.flowm3Rng5CheckBox); + this.Controls.Add(this.flowm3Rng4CheckBox); + this.Controls.Add(this.flowm3Rng3CheckBox); + this.Controls.Add(this.flowm3Rng2CheckBox); + this.Controls.Add(this.flowm3Rng1CheckBox); + this.Controls.Add(this.flowmeter3ComboBox); + this.Controls.Add(this.flowmeter3Label); + this.Controls.Add(this.flowm2Rng5CheckBox); + this.Controls.Add(this.flowm2Rng4CheckBox); + this.Controls.Add(this.flowm2Rng3CheckBox); + this.Controls.Add(this.flowm2Rng2CheckBox); + this.Controls.Add(this.flowm2Rng1CheckBox); + this.Controls.Add(this.flowmeter2ComboBox); + this.Controls.Add(this.flowmeter2Label); + this.Controls.Add(this.flowm1Rng5CheckBox); + this.Controls.Add(this.flowm1Rng4CheckBox); + this.Controls.Add(this.flowm1Rng3CheckBox); + this.Controls.Add(this.flowm1Rng2CheckBox); + this.Controls.Add(this.flowm1Rng1CheckBox); + this.Controls.Add(this.flowmeter1ComboBox); + this.Controls.Add(this.flowmeter1Label); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "SaveFlowmeterCorrCfgCtrl"; + this.Size = new System.Drawing.Size(450, 300); + this.Load += new System.EventHandler(this.WriterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.Label flowmeter1Label; + private System.Windows.Forms.ComboBox flowmeter1ComboBox; + private System.Windows.Forms.CheckBox flowm1Rng1CheckBox; + private System.Windows.Forms.CheckBox flowm1Rng2CheckBox; + private System.Windows.Forms.CheckBox flowm1Rng3CheckBox; + private System.Windows.Forms.CheckBox flowm1Rng4CheckBox; + private System.Windows.Forms.CheckBox flowm1Rng5CheckBox; + private System.Windows.Forms.CheckBox flowm2Rng5CheckBox; + private System.Windows.Forms.CheckBox flowm2Rng4CheckBox; + private System.Windows.Forms.CheckBox flowm2Rng3CheckBox; + private System.Windows.Forms.CheckBox flowm2Rng2CheckBox; + private System.Windows.Forms.CheckBox flowm2Rng1CheckBox; + private System.Windows.Forms.ComboBox flowmeter2ComboBox; + private System.Windows.Forms.Label flowmeter2Label; + private System.Windows.Forms.CheckBox flowm3Rng5CheckBox; + private System.Windows.Forms.CheckBox flowm3Rng4CheckBox; + private System.Windows.Forms.CheckBox flowm3Rng3CheckBox; + private System.Windows.Forms.CheckBox flowm3Rng2CheckBox; + private System.Windows.Forms.CheckBox flowm3Rng1CheckBox; + private System.Windows.Forms.ComboBox flowmeter3ComboBox; + private System.Windows.Forms.Label flowmeter3Label; + private System.Windows.Forms.CheckBox flowm4Rng5CheckBox; + private System.Windows.Forms.CheckBox flowm4Rng4CheckBox; + private System.Windows.Forms.CheckBox flowm4Rng3CheckBox; + private System.Windows.Forms.CheckBox flowm4Rng2CheckBox; + private System.Windows.Forms.CheckBox flowm4Rng1CheckBox; + private System.Windows.Forms.ComboBox flowmeter4ComboBox; + private System.Windows.Forms.Label flowmeter4Label; + private System.Windows.Forms.CheckBox flowm5Rng5CheckBox; + private System.Windows.Forms.CheckBox flowm5Rng4CheckBox; + private System.Windows.Forms.CheckBox flowm5Rng3CheckBox; + private System.Windows.Forms.CheckBox flowm5Rng2CheckBox; + private System.Windows.Forms.CheckBox flowm5Rng1CheckBox; + private System.Windows.Forms.ComboBox flowmeter5ComboBox; + private System.Windows.Forms.Label flowmeter5Label; + private System.Windows.Forms.CheckBox flowm5Rng0CheckBox; + private System.Windows.Forms.CheckBox flowm4Rng0CheckBox; + private System.Windows.Forms.CheckBox flowm3Rng0CheckBox; + private System.Windows.Forms.CheckBox flowm2Rng0CheckBox; + private System.Windows.Forms.CheckBox flowm1Rng0CheckBox; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.CheckBox flowm6Rng0CheckBox; + private System.Windows.Forms.CheckBox flowm6Rng5CheckBox; + private System.Windows.Forms.CheckBox flowm6Rng4CheckBox; + private System.Windows.Forms.CheckBox flowm6Rng3CheckBox; + private System.Windows.Forms.CheckBox flowm6Rng2CheckBox; + private System.Windows.Forms.CheckBox flowm6Rng1CheckBox; + private System.Windows.Forms.ComboBox flowmeter6ComboBox; + private System.Windows.Forms.Label flowmeter6Label; + private System.Windows.Forms.CheckBox flowm7Rng0CheckBox; + private System.Windows.Forms.CheckBox flowm7Rng5CheckBox; + private System.Windows.Forms.CheckBox flowm7Rng4CheckBox; + private System.Windows.Forms.CheckBox flowm7Rng3CheckBox; + private System.Windows.Forms.CheckBox flowm7Rng2CheckBox; + private System.Windows.Forms.CheckBox flowm7Rng1CheckBox; + private System.Windows.Forms.ComboBox flowmeter7ComboBox; + private System.Windows.Forms.Label flowmeter7Label; + private System.Windows.Forms.TextBox certificateTextBox; + private System.Windows.Forms.Label certificateLabel; + private System.Windows.Forms.TextBox validityTextBox; + private System.Windows.Forms.Label validityLabel; + private System.Windows.Forms.Label label2; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/SaveFlowmeterCorrections/SaveFlowmeterCorrCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/SaveFlowmeterCorrections/SaveFlowmeterCorrCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/DB/SaveFlowmeterCorrections/SaveFlowmeterCorrCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Enums.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Enums.cs new file mode 100644 index 00000000..8e068815 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Enums.cs @@ -0,0 +1,18 @@ +/// +/// Copyright (c) 2017-2018 Sensus Slovensko a.s. +/// +namespace TBF.BenchControl.Output +{ + public enum Culture + { + system, + CS, + DE, + EN, + IT, + PL, + RU, + SK, + Count + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Basic/FactoryCompound.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Basic/FactoryCompound.cs new file mode 100644 index 00000000..7959c8b0 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Basic/FactoryCompound.cs @@ -0,0 +1,29 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.FileWriters.Basic +{ + public class FactoryCompound : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".Compound"; } } + + public void ResetStaticProperties() { Writer.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Writer(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Writer(cfg); } + + public IComponentCfg DefaultConfig() { return new WriterCfg("FileWriter.Basic.Compound", this, Config.Entities.MetersKind.Combined); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + IComponentCfg cfg = ComponentCfgBase.CreateFromDbEntity(WriterCfg.Serializer, component, this); + (cfg as WriterCfg).MetersKind = Config.Entities.MetersKind.Combined; + return cfg; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Basic/FactoryHeatMeters.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Basic/FactoryHeatMeters.cs new file mode 100644 index 00000000..0cd7d69e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Basic/FactoryHeatMeters.cs @@ -0,0 +1,29 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.FileWriters.Basic +{ + public class FactoryHeatMeters : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".HeatMeters"; } } + + public void ResetStaticProperties() { Writer.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Writer(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Writer(cfg); } + + public IComponentCfg DefaultConfig() { return new WriterCfg("FileWriter.Basic.HeatMeters", this, Config.Entities.MetersKind.HeatMeter); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + IComponentCfg cfg = ComponentCfgBase.CreateFromDbEntity(WriterCfg.Serializer, component, this); + (cfg as WriterCfg).MetersKind = Config.Entities.MetersKind.HeatMeter; + return cfg; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Basic/FactorySingle.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Basic/FactorySingle.cs new file mode 100644 index 00000000..ab12171c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Basic/FactorySingle.cs @@ -0,0 +1,29 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.FileWriters.Basic +{ + public class FactorySingle : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".Single"; } } + + public void ResetStaticProperties() { Writer.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Writer(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Writer(cfg); } + + public IComponentCfg DefaultConfig() { return new WriterCfg("FileWriter.Basic.Single", this, Config.Entities.MetersKind.Single); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + IComponentCfg cfg = ComponentCfgBase.CreateFromDbEntity(WriterCfg.Serializer, component, this); + (cfg as WriterCfg).MetersKind = Config.Entities.MetersKind.Single; + return cfg; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Basic/Writer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Basic/Writer.cs new file mode 100644 index 00000000..b8000d36 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Basic/Writer.cs @@ -0,0 +1,431 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Threading; +using log4net; + +namespace TBF.BenchControl.Output.FileWriters.Basic +{ + public class Writer : ComponentBase, IOperation, GenericDevices.IResultsWriter + { + private static readonly ILog log = LogManager.GetLogger(typeof(Writer)); + public override string ToString() { return string.Format("Output.FileWriters.Basic({0})", Cfg.ToString(1)); } + + readonly WriterCfg writerCfg; + + string separatorStr; + + /// + /// Result items to print + /// + string header; + IList commonItems; + IList rsltItems; + string footer; + + Results.Entities.Batch batch; + + bool abort; + + + public Writer() {} + + public Writer(Generic.IComponentCfg cfg) + : base(cfg) + { + writerCfg = cfg as WriterCfg; + ApplyConfig(); + log.Debug(this.ToString()); + } + + + void ApplyConfig() + { + switch (writerCfg.Separator) + { + default: + case Separator.None: separatorStr = string.Empty; break; + case Separator.Space: separatorStr = " "; break; + case Separator.Tabulator: separatorStr = "\t"; break; + case Separator.Comma: separatorStr = ","; break; + case Separator.Semicolon: separatorStr = ";"; break; + } + + header = string.IsNullOrEmpty(writerCfg.Header) ? string.Empty : writerCfg.Header.Replace("~", Environment.NewLine); + commonItems = Results.WMeterRsltItemSpec.FromStrArray(writerCfg.CommonItems); + rsltItems = Results.WMeterRsltItemSpec.FromStrArray(writerCfg.SelectedItems); + footer = string.IsNullOrEmpty(writerCfg.Footer) ? string.Empty : writerCfg.Footer.Replace("~", Environment.NewLine); + } + + #region Configuration Change Handling + + public static void OnCfgChange(object sender, CfgChangeArgs args) + { + if (CfgChangeHandler == null) return; + try { CfgChangeHandler(sender, args); } + catch (Exception e) { log.Error("CfgChangeHandler(...) failed", e); } + } + + public static event EventHandler CfgChangeHandler; + + public override void StartChangeHandler() + { + CfgChangeHandler += delegate(object sender, CfgChangeArgs args) + { + WriterCfg newCfg = args.Cfg as WriterCfg; + if (newCfg != null && newCfg.Name.Equals(Name)) + { + if (args.Command == CfgChangeCmd.CfgChange) + { + writerCfg.DestinationPath = newCfg.DestinationPath; + writerCfg.DestinationPath2 = newCfg.DestinationPath2; + writerCfg.YearFolders = newCfg.YearFolders; + writerCfg.MonthFolders = newCfg.MonthFolders; + writerCfg.DayFolders = newCfg.DayFolders; + writerCfg.FileNameFormat = newCfg.FileNameFormat; + writerCfg.Culture = newCfg.Culture; + writerCfg.Separator = newCfg.Separator; + writerCfg.SaveGoodOnly = newCfg.SaveGoodOnly; + writerCfg.EliminateSpaces = newCfg.EliminateSpaces; + writerCfg.PrintCaption = newCfg.PrintCaption; + writerCfg.Header = newCfg.Header; + writerCfg.CommonItems = newCfg.CommonItems; + writerCfg.SelectedItems = newCfg.SelectedItems; + writerCfg.Footer = newCfg.Footer; + + ApplyConfig(); + } + } + }; + } + + #endregion Configuration Change Handling + + + /// + /// Eliminate spaces conditionally, depesing on bool WriterCfg.EliminateSpaces + /// + /// Input string + /// Output string + string ElSpaces(string item) + { + if (writerCfg.EliminateSpaces) + return item.Replace(" ", string.Empty); + else + return item; + } + + + /// + /// Returns a file name derived from a DateTime structure. + /// Creates directories on this path as a side effect. + /// + /// Date and time + /// File name + string GetFilename(string destinationPath, DateTime time) + { + string directory = destinationPath; /// Ends with "\\"; + + switch (writerCfg.YearFolders) + { + case YearFolders.FourDigit: + directory = string.Format("{0}{1:yyyy}\\", directory, time); + break; + case YearFolders.TwoDigit: + directory = string.Format("{0}{1:yy}\\", directory, time); + break; + } + + switch (writerCfg.MonthFolders) + { + case MonthFolders.Name: + { + string monthStr; + switch (time.Month) + { + default: + case 1: monthStr = "January"; break; + case 2: monthStr = "February"; break; + case 3: monthStr = "March"; break; + case 4: monthStr = "April"; break; + case 5: monthStr = "May"; break; + case 6: monthStr = "June"; break; + case 7: monthStr = "July"; break; + case 8: monthStr = "August"; break; + case 9: monthStr = "September"; break; + case 10: monthStr = "October"; break; + case 11: monthStr = "November"; break; + case 12: monthStr = "December"; break; + } + directory = string.Format("{0}{1}\\", directory, monthStr); + break; + } + case MonthFolders.Digit: + directory = string.Format("{0}{1}\\", directory, time.Month.ToString()); + break; + case MonthFolders.TwoDigit: + directory = string.Format("{0}{1:MM}\\", directory, time); + break; + } + + switch (writerCfg.DayFolders) + { + case DayFolders.Digit: + directory = string.Format("{0}{1}\\", directory, time.Day.ToString()); + break; + case DayFolders.TwoDigit: + directory = string.Format("{0}{1:dd}\\", directory, time); + break; + } + + Directory.CreateDirectory(directory); + + try + { + if (string.IsNullOrEmpty(writerCfg.FileNameFormat)) throw new Exception(); + return directory + string.Format(writerCfg.FileNameFormat, time); + } + catch + { + return string.Format("{0}{1:yyMMdd-HHmm}.txt", directory, time); + } + } + + /// + /// Writes the test cycle results into a file + /// Events: + /// Event.ResultsWritten + /// Event.Busy + /// + /// Results to write into a file + /// Reference to the operation + public IOperation WriteResultsOp(Results.Entities.Batch batch) + { + this.batch = batch; + return this; + } + + /// Start this operation + public void Start() + { + CultureInfo oriCulture = Thread.CurrentThread.CurrentCulture; + + if (writerCfg.Culture != Culture.system) + { + Thread.CurrentThread.CurrentCulture = new CultureInfo(writerCfg.Culture.ToString()); + } + + abort = false; + WriteRslts(batch, writerCfg.DestinationPath); + WriteRslts(batch, writerCfg.DestinationPath2); + + Thread.CurrentThread.CurrentCulture = oriCulture; + } + + /// Run this operation + /// Event.ResultsWritten + public Event Run() + { + return Event.ResultsWritten; + } + + /// Stop this operation + public void Stop() + { + } + + + void WriteRslts(Results.Entities.Batch batch, string destination) + { + if (string.IsNullOrEmpty(destination) || batch == null || + batch.WaterMeters == null || + batch.WaterMeters.Count == 0) + { + return; + } + + StreamWriter writer = StreamWriter.Null; + try + { + writer = File.AppendText(GetFilename(destination, batch.EndTime)); + WriteRsltsEx(batch, writer); + } + catch + { + } + finally + { + writer.Close(); + } + } + + void WriteRsltsEx(Results.Entities.Batch batch, StreamWriter wrtr) + { + ///---------- + /// Header + ///---------- + if (!string.IsNullOrEmpty(writerCfg.Header)) + { + wrtr.Write(header); + } + + ///---------------- + /// Common items + ///---------------- + string[] leftColumn = new string[commonItems.Count]; + string[] rightColumn = new string[commonItems.Count]; + + int cnt = 0; + foreach (var v in commonItems) + { + leftColumn[cnt] = v.Caption; + rightColumn[cnt] = (batch.WaterMeters.Count > 0) ? v.Print(batch.WaterMeters[0]) : string.Empty; + cnt++; + } + + /// Determine max. left column width in characters + int maxLen = 0; + foreach (var s in leftColumn) if (s.Length > maxLen) maxLen = s.Length; + + /// Write aligned columns + for (int i = 0; i < Math.Min(leftColumn.Length, rightColumn.Length); i++) + { + if (abort) return; + + wrtr.Write(leftColumn[i]); + if (!writerCfg.EliminateSpaces) + { + wrtr.Write(new string(' ', maxLen - leftColumn[i].Length + 3)); + } + wrtr.Write(separatorStr); + wrtr.WriteLine(rightColumn[i]); + } + + if (commonItems.Count > 0) wrtr.WriteLine(); /// Write an empty line in case there is at least one common item + + ///-------- + /// Body + ///-------- + WriteWMs(batch, wrtr); + + ///---------- + /// Footer + ///---------- + if (!string.IsNullOrEmpty(writerCfg.Footer)) + { + wrtr.Write(footer); + } + } + + /// + /// Write one water meter results + /// + /// Water meter number (0-based) + void WriteWMs(Results.Entities.Batch batch, StreamWriter wr) + { + /// Determine column widths + int[] columnWidths = new int[rsltItems.Count]; + int totalWidth = 0; + for (int i = 0; i < rsltItems.Count; i++) + { + if (abort) return; + + columnWidths[i] = writerCfg.PrintCaption ? ElSpaces(rsltItems[i].Caption).Length : 0; + foreach (var wm in batch.WaterMeters) + { + if (!writerCfg.SaveGoodOnly || wm.Passed) + { + string itemText = rsltItems[i].Print(wm); + + /// Strip color information + string[] texts = itemText.Split(new char[] { '|' }); + if (texts.Length == 2) { itemText = texts[0]; } + + int len = ElSpaces(itemText).Length; + if (len > columnWidths[i]) columnWidths[i] = len; + } + } + totalWidth += columnWidths[i]; + } + totalWidth += 3 * (rsltItems.Count - 1); + if (totalWidth < 0) totalWidth = 0; + + string horizontalLine = new String('-', totalWidth); + + if (writerCfg.PrintCaption) + { + //wr.WriteLine(horizontalLine); /// Horizontal line above the header + + /// Write column headers + for (int i = 0; i < rsltItems.Count; i++) + { + if (abort) return; + + string caption = ElSpaces(rsltItems[i].Caption); + wr.Write(caption); + + if (i < rsltItems.Count - 1) + { + if (!writerCfg.EliminateSpaces) + { + wr.Write(new string(' ', columnWidths[i] - rsltItems[i].Caption.Length + 3)); + } + wr.Write(separatorStr); + } + else + { + wr.WriteLine(); + } + } + } + + //wr.WriteLine(horizontalLine); /// Horizontal line between the header and the body + + int rowsCount = 0; + foreach (var wm in batch.WaterMeters) + { + if (!writerCfg.SaveGoodOnly || wm.Passed) + { + if (abort) return; + + Results.WMeterRsltItemSpec.TableRowNr = ++rowsCount; + + for (int i = 0; i < rsltItems.Count; i++) + { + Results.WMeterRsltItemSpec.TableColumnNr = i + 1; + + /// Fetch the item + string itemText = rsltItems[i].Print(wm); + + /// Strip color information + string[] texts = itemText.Split(new char[] { '|' }); + if (texts.Length == 2) { itemText = texts[0]; } + + /// Print the item + string itemText2 = ElSpaces(itemText); + wr.Write(itemText2); + + if (i < rsltItems.Count - 1) + { + if (!writerCfg.EliminateSpaces) + { + wr.Write(new string(' ', columnWidths[i] - itemText.Length + 3)); + } + wr.Write(separatorStr); + } + else + { + wr.WriteLine(); + } + } + } + } + + //wr.WriteLine(horizontalLine); /// Horizontal line between the header and the body + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Basic/WriterCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Basic/WriterCfg.cs new file mode 100644 index 00000000..053b37ee --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Basic/WriterCfg.cs @@ -0,0 +1,76 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.FileWriters.Basic +{ + public class WriterCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(WriterCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new WriterCfgCtrl(); } + + public string DestinationPath; /// Directory path into which the results will be saved + public string DestinationPath2; /// Directory path into which the 2nd copy of results will be saved + public YearFolders YearFolders; + public MonthFolders MonthFolders; + public DayFolders DayFolders; + public string FileNameFormat; + public Culture Culture; + public Separator Separator; + public bool EliminateSpaces; + public bool PrintCaption; + public bool SaveGoodOnly; + public string Header; + public string[] CommonItems; + public string[] SelectedItems; + public string Footer; + + [XmlIgnore] + public Config.Entities.MetersKind MetersKind; + + /// Private parameterless constructor invoked by all other (public) constructors + WriterCfg() + { + } + + public WriterCfg(string name, IComponentFactory factory, Config.Entities.MetersKind metersKind) + : this() + { + Name = name; + Factory = factory; + MetersKind = metersKind; + + ParentName = string.Empty; + DestinationPath = Program.HomeDir + "Results\\"; + DestinationPath2 = string.Empty; + YearFolders = YearFolders.FourDigit; + MonthFolders = MonthFolders.Digit; + DayFolders = DayFolders.Digit; + FileNameFormat = "{0:yyMMdd-HHmm}.csv"; + Separator = Separator.None; + EliminateSpaces = false; + PrintCaption = false; + SaveGoodOnly = false; + Header = string.Empty; + Footer = string.Empty; + } + + public string ToString(int i) + { + return string.Format("{0}, Path={1}, Y={2}, M={3}, D={4}, FNameFmt={5}, Separator={6}, NoSpaces={7}, GoodOnly={8}", + Name, + DestinationPath, + YearFolders, + MonthFolders, + DayFolders, + FileNameFormat, + Separator, + EliminateSpaces, + SaveGoodOnly); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Basic/WriterCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Basic/WriterCfgCtrl.cs new file mode 100644 index 00000000..ac3bf954 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Basic/WriterCfgCtrl.cs @@ -0,0 +1,358 @@ +/// +/// Copyright (c) 2016-2017 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.Output.FileWriters.Basic +{ + public partial class WriterCfgCtrl : UserControl, IComponentCfgCtrl + { + static readonly ILog log = LogManager.GetLogger(typeof(WriterCfgCtrl)); + + public bool ShowMore { get { return false; } } + + public bool Compound; + + WriterCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as WriterCfg; + Redraw(); + } + } + + string header; + string[] commonItems; + string[] selectedItems; + string footer; + + public WriterCfgCtrl() + { + InitializeComponent(); + Localize(); + } + + private void WriterCfgCtrl_Load(object sender, EventArgs e) + { + for (YearFolders s = 0; s < YearFolders.Count; s++) yearFoldersComboBox.Items.Add(s.ToString()); + for (MonthFolders s = 0; s < MonthFolders.Count; s++) monthFoldersComboBox.Items.Add(s.ToString()); + for (DayFolders s = 0; s < DayFolders.Count; s++) dayFoldersComboBox.Items.Add(s.ToString()); + for (Culture s = 0; s < Culture.Count; s++) cultureComboBox.Items.Add(s.ToString()); + for (Separator s = 0; s < Separator.Count; s++) separatorComboBox.Items.Add(s.ToString()); + + header = config.Header; + commonItems = config.CommonItems; + selectedItems = config.SelectedItems; + footer = config.Footer; + + Redraw(); + } + + void Localize() + { + nameLabel.Text = Strings.Name; + destinationLabel.Text = "Destination"; + destination2Label.Text = "Destination" + " 2"; + yearFoldersLabel.Text = "Year folders"; + monthFoldersLabel.Text = "Month folders"; + dayFoldersLabel.Text = "Day folders"; + fileNameFmtLabel.Text = "File name format"; + cultureLabel.Text = "Culture"; + separatorLabel.Text = "Separator"; + goodOnlyCheckBox.Text = "Good only"; + eliminateSpacesCheckBox.Text = "No spaces"; + printCaptionCheckBox.Text = "Print caption"; + headerButton.Text = Strings.Header; + commonItemsButton.Text = "Common items"; + selectItemsButton.Text = "Selected items"; + footerButton.Text = Strings.Footer; + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + destinationTextBox.Text = config.DestinationPath; + destination2TextBox.Text = config.DestinationPath2; + yearFoldersComboBox.Text = config.YearFolders.ToString(); + monthFoldersComboBox.Text = config.MonthFolders.ToString(); + dayFoldersComboBox.Text = config.DayFolders.ToString(); + fileNameFmtTextBox.Text = config.FileNameFormat; + cultureComboBox.Text = config.Culture.ToString(); + separatorComboBox.Text = config.Separator.ToString(); + goodOnlyCheckBox.Checked = config.SaveGoodOnly; + eliminateSpacesCheckBox.Checked = config.EliminateSpaces; + printCaptionCheckBox.Checked = config.PrintCaption; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + destinationTextBox.Enabled = true; + destinationButton.Enabled = true; + destination2TextBox.Enabled = true; + destination2Button.Enabled = true; + yearFoldersComboBox.Enabled = true; + monthFoldersComboBox.Enabled = true; + dayFoldersComboBox.Enabled = true; + fileNameFmtTextBox.Enabled = true; + cultureComboBox.Enabled = true; + separatorComboBox.Enabled = true; + goodOnlyCheckBox.Enabled = true; + eliminateSpacesCheckBox.Enabled = true; + printCaptionCheckBox.Enabled = true; + headerButton.Enabled = true; + commonItemsButton.Enabled = true; + selectItemsButton.Enabled = true; + footerButton.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (!yearFoldersComboBox.Items.Contains(yearFoldersComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid year folders selection"; + } + + if (!monthFoldersComboBox.Items.Contains(monthFoldersComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid month folders selection"; + } + + if (!dayFoldersComboBox.Items.Contains(dayFoldersComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid day folder selection"; + } + + if (!cultureComboBox.Items.Contains(cultureComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid culture"; + } + + if (!separatorComboBox.Items.Contains(separatorComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid separator"; + } + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + if (config.Name != nameTextBox.Text) + { + config.Name = nameTextBox.Text; + flags |= (CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + } + + if (config.DestinationPath != destinationTextBox.Text) + { + config.DestinationPath = destinationTextBox.Text; + if (!config.DestinationPath.EndsWith("\\")) config.DestinationPath += "\\"; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.DestinationPath2 != destination2TextBox.Text) + { + config.DestinationPath2 = destination2TextBox.Text; + if (!config.DestinationPath2.EndsWith("\\")) config.DestinationPath2 += "\\"; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + for (YearFolders i = 0; i < YearFolders.Count; i++) + { + if (i.ToString().Equals(yearFoldersComboBox.Text) && (config.YearFolders != i)) + { + config.YearFolders = i; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + break; + } + } + + for (MonthFolders i = 0; i < MonthFolders.Count; i++) + { + if (i.ToString().Equals(monthFoldersComboBox.Text) && (config.MonthFolders != i)) + { + config.MonthFolders = i; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + break; + } + } + + for (DayFolders i = 0; i < DayFolders.Count; i++) + { + if (i.ToString().Equals(dayFoldersComboBox.Text) && (config.DayFolders != i)) + { + config.DayFolders = i; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + break; + } + } + + if (config.FileNameFormat != fileNameFmtTextBox.Text) + { + config.FileNameFormat = fileNameFmtTextBox.Text; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + for (Culture i = 0; i < Culture.Count; i++) + { + if (i.ToString().Equals(cultureComboBox.Text) && (config.Culture != i)) + { + config.Culture = i; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + break; + } + } + + for (Separator i = 0; i < Separator.Count; i++) + { + if (i.ToString().Equals(separatorComboBox.Text) && (config.Separator != i)) + { + config.Separator = i; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + break; + } + } + + if (config.SaveGoodOnly != goodOnlyCheckBox.Checked) + { + config.SaveGoodOnly = goodOnlyCheckBox.Checked; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.EliminateSpaces != eliminateSpacesCheckBox.Checked) + { + config.EliminateSpaces = eliminateSpacesCheckBox.Checked; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.PrintCaption != printCaptionCheckBox.Checked) + { + config.PrintCaption = printCaptionCheckBox.Checked; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.Header != header) + { + config.Header = header; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.CommonItems != commonItems) + { + config.CommonItems = commonItems; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.SelectedItems != selectedItems) + { + config.SelectedItems = selectedItems; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.Footer != footer) + { + config.Footer = footer; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if ((flags & CfgUpdateFlags.InvokeCfgChange) != 0) + { + Writer.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.CfgChange, config)); + } + + return flags; + } + + private void destinationButton_Click(object sender, EventArgs e) + { + + } + + private void headerButton_Click(object sender, EventArgs e) + { + HeaderFooterDlg dlg = new HeaderFooterDlg(true, string.IsNullOrEmpty(header) ? string.Empty : header.Replace("~", Environment.NewLine)); + if (dlg.ShowDialog() == DialogResult.OK) + { + header = dlg.EditedText.Replace(Environment.NewLine, "~"); + } + } + + private void commonItemsButton_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg() + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(commonItems), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + commonItems = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems); + } + } + + private void selectItemsButton_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg() + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(selectedItems), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + selectedItems = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems); + } + } + + private void footerButton_Click(object sender, EventArgs e) + { + HeaderFooterDlg dlg = new HeaderFooterDlg(false, string.IsNullOrEmpty(footer) ? string.Empty : footer.Replace("~", Environment.NewLine)); + if (dlg.ShowDialog() == DialogResult.OK) + { + footer = dlg.EditedText.Replace(Environment.NewLine, "~"); + } + } + + #region Configuration Change Handling + + public static void OnCmdResponse(object sender, CmdResponseArgs args) + { + if (CmdResponseHandler == null) return; + try { CmdResponseHandler(sender, args); } + catch (Exception e) { log.Error("CmdResponseHandler(...) failed", e); } + } + + public static event EventHandler CmdResponseHandler; + + public void StartResponseHandler() { } + public void StopResponseHandler() { } + + #endregion Configuration Change Handling + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Basic/WriterCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Basic/WriterCfgCtrl.designer.cs new file mode 100644 index 00000000..89aa3a5e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Basic/WriterCfgCtrl.designer.cs @@ -0,0 +1,397 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +namespace TBF.BenchControl.Output.FileWriters.Basic +{ + partial class WriterCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.destinationTextBox = new System.Windows.Forms.TextBox(); + this.destinationLabel = new System.Windows.Forms.Label(); + this.destinationButton = new System.Windows.Forms.Button(); + this.separatorLabel = new System.Windows.Forms.Label(); + this.separatorComboBox = new System.Windows.Forms.ComboBox(); + this.selectItemsButton = new System.Windows.Forms.Button(); + this.yearFoldersLabel = new System.Windows.Forms.Label(); + this.monthFoldersLabel = new System.Windows.Forms.Label(); + this.dayFoldersLabel = new System.Windows.Forms.Label(); + this.yearFoldersComboBox = new System.Windows.Forms.ComboBox(); + this.monthFoldersComboBox = new System.Windows.Forms.ComboBox(); + this.dayFoldersComboBox = new System.Windows.Forms.ComboBox(); + this.destination2Button = new System.Windows.Forms.Button(); + this.destination2TextBox = new System.Windows.Forms.TextBox(); + this.destination2Label = new System.Windows.Forms.Label(); + this.fileNameFmtTextBox = new System.Windows.Forms.TextBox(); + this.fileNameFmtLabel = new System.Windows.Forms.Label(); + this.goodOnlyCheckBox = new System.Windows.Forms.CheckBox(); + this.cultureComboBox = new System.Windows.Forms.ComboBox(); + this.cultureLabel = new System.Windows.Forms.Label(); + this.eliminateSpacesCheckBox = new System.Windows.Forms.CheckBox(); + this.commonItemsButton = new System.Windows.Forms.Button(); + this.headerButton = new System.Windows.Forms.Button(); + this.footerButton = new System.Windows.Forms.Button(); + this.printCaptionCheckBox = new System.Windows.Forms.CheckBox(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(108, 31); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(146, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(17, 34); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(105, 9); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // destinationTextBox + // + this.destinationTextBox.Enabled = false; + this.destinationTextBox.Location = new System.Drawing.Point(108, 52); + this.destinationTextBox.Name = "destinationTextBox"; + this.destinationTextBox.Size = new System.Drawing.Size(146, 20); + this.destinationTextBox.TabIndex = 4; + // + // destinationLabel + // + this.destinationLabel.AutoSize = true; + this.destinationLabel.Location = new System.Drawing.Point(17, 55); + this.destinationLabel.Name = "destinationLabel"; + this.destinationLabel.Size = new System.Drawing.Size(60, 13); + this.destinationLabel.TabIndex = 3; + this.destinationLabel.Text = "Destination"; + // + // destinationButton + // + this.destinationButton.Enabled = false; + this.destinationButton.Location = new System.Drawing.Point(259, 56); + this.destinationButton.Name = "destinationButton"; + this.destinationButton.Size = new System.Drawing.Size(30, 20); + this.destinationButton.TabIndex = 26; + this.destinationButton.Text = "..."; + this.destinationButton.UseVisualStyleBackColor = true; + this.destinationButton.Click += new System.EventHandler(this.destinationButton_Click); + // + // separatorLabel + // + this.separatorLabel.AutoSize = true; + this.separatorLabel.Location = new System.Drawing.Point(17, 206); + this.separatorLabel.Name = "separatorLabel"; + this.separatorLabel.Size = new System.Drawing.Size(53, 13); + this.separatorLabel.TabIndex = 17; + this.separatorLabel.Text = "Separator"; + // + // separatorComboBox + // + this.separatorComboBox.Enabled = false; + this.separatorComboBox.FormattingEnabled = true; + this.separatorComboBox.Location = new System.Drawing.Point(108, 203); + this.separatorComboBox.Name = "separatorComboBox"; + this.separatorComboBox.Size = new System.Drawing.Size(146, 21); + this.separatorComboBox.TabIndex = 18; + // + // selectItemsButton + // + this.selectItemsButton.Enabled = false; + this.selectItemsButton.Location = new System.Drawing.Point(108, 277); + this.selectItemsButton.Name = "selectItemsButton"; + this.selectItemsButton.Size = new System.Drawing.Size(146, 23); + this.selectItemsButton.TabIndex = 24; + this.selectItemsButton.Text = "Selected items"; + this.selectItemsButton.UseVisualStyleBackColor = true; + this.selectItemsButton.Click += new System.EventHandler(this.selectItemsButton_Click); + // + // yearFoldersLabel + // + this.yearFoldersLabel.AutoSize = true; + this.yearFoldersLabel.Location = new System.Drawing.Point(17, 97); + this.yearFoldersLabel.Name = "yearFoldersLabel"; + this.yearFoldersLabel.Size = new System.Drawing.Size(63, 13); + this.yearFoldersLabel.TabIndex = 7; + this.yearFoldersLabel.Text = "Year folders"; + // + // monthFoldersLabel + // + this.monthFoldersLabel.AutoSize = true; + this.monthFoldersLabel.Location = new System.Drawing.Point(17, 119); + this.monthFoldersLabel.Name = "monthFoldersLabel"; + this.monthFoldersLabel.Size = new System.Drawing.Size(71, 13); + this.monthFoldersLabel.TabIndex = 9; + this.monthFoldersLabel.Text = "Month folders"; + // + // dayFoldersLabel + // + this.dayFoldersLabel.AutoSize = true; + this.dayFoldersLabel.Location = new System.Drawing.Point(17, 141); + this.dayFoldersLabel.Name = "dayFoldersLabel"; + this.dayFoldersLabel.Size = new System.Drawing.Size(60, 13); + this.dayFoldersLabel.TabIndex = 11; + this.dayFoldersLabel.Text = "Day folders"; + // + // yearFoldersComboBox + // + this.yearFoldersComboBox.Enabled = false; + this.yearFoldersComboBox.FormattingEnabled = true; + this.yearFoldersComboBox.Location = new System.Drawing.Point(108, 94); + this.yearFoldersComboBox.Name = "yearFoldersComboBox"; + this.yearFoldersComboBox.Size = new System.Drawing.Size(146, 21); + this.yearFoldersComboBox.TabIndex = 8; + // + // monthFoldersComboBox + // + this.monthFoldersComboBox.Enabled = false; + this.monthFoldersComboBox.FormattingEnabled = true; + this.monthFoldersComboBox.Location = new System.Drawing.Point(108, 116); + this.monthFoldersComboBox.Name = "monthFoldersComboBox"; + this.monthFoldersComboBox.Size = new System.Drawing.Size(146, 21); + this.monthFoldersComboBox.TabIndex = 10; + // + // dayFoldersComboBox + // + this.dayFoldersComboBox.Enabled = false; + this.dayFoldersComboBox.FormattingEnabled = true; + this.dayFoldersComboBox.Location = new System.Drawing.Point(108, 138); + this.dayFoldersComboBox.Name = "dayFoldersComboBox"; + this.dayFoldersComboBox.Size = new System.Drawing.Size(146, 21); + this.dayFoldersComboBox.TabIndex = 12; + // + // destination2Button + // + this.destination2Button.Enabled = false; + this.destination2Button.Location = new System.Drawing.Point(259, 79); + this.destination2Button.Name = "destination2Button"; + this.destination2Button.Size = new System.Drawing.Size(30, 20); + this.destination2Button.TabIndex = 27; + this.destination2Button.Text = "..."; + this.destination2Button.UseVisualStyleBackColor = true; + // + // destination2TextBox + // + this.destination2TextBox.Enabled = false; + this.destination2TextBox.Location = new System.Drawing.Point(108, 73); + this.destination2TextBox.Name = "destination2TextBox"; + this.destination2TextBox.Size = new System.Drawing.Size(146, 20); + this.destination2TextBox.TabIndex = 6; + // + // destination2Label + // + this.destination2Label.AutoSize = true; + this.destination2Label.Location = new System.Drawing.Point(17, 76); + this.destination2Label.Name = "destination2Label"; + this.destination2Label.Size = new System.Drawing.Size(69, 13); + this.destination2Label.TabIndex = 5; + this.destination2Label.Text = "Destination 2"; + // + // fileNameFmtTextBox + // + this.fileNameFmtTextBox.Enabled = false; + this.fileNameFmtTextBox.Location = new System.Drawing.Point(108, 160); + this.fileNameFmtTextBox.Name = "fileNameFmtTextBox"; + this.fileNameFmtTextBox.Size = new System.Drawing.Size(146, 20); + this.fileNameFmtTextBox.TabIndex = 14; + // + // fileNameFmtLabel + // + this.fileNameFmtLabel.AutoSize = true; + this.fileNameFmtLabel.Location = new System.Drawing.Point(17, 163); + this.fileNameFmtLabel.Name = "fileNameFmtLabel"; + this.fileNameFmtLabel.Size = new System.Drawing.Size(84, 13); + this.fileNameFmtLabel.TabIndex = 13; + this.fileNameFmtLabel.Text = "File name format"; + // + // goodOnlyCheckBox + // + this.goodOnlyCheckBox.AutoSize = true; + this.goodOnlyCheckBox.Location = new System.Drawing.Point(20, 235); + this.goodOnlyCheckBox.Name = "goodOnlyCheckBox"; + this.goodOnlyCheckBox.Size = new System.Drawing.Size(74, 17); + this.goodOnlyCheckBox.TabIndex = 19; + this.goodOnlyCheckBox.Text = "Good only"; + this.goodOnlyCheckBox.UseVisualStyleBackColor = true; + // + // cultureComboBox + // + this.cultureComboBox.Enabled = false; + this.cultureComboBox.FormattingEnabled = true; + this.cultureComboBox.Location = new System.Drawing.Point(108, 181); + this.cultureComboBox.Name = "cultureComboBox"; + this.cultureComboBox.Size = new System.Drawing.Size(146, 21); + this.cultureComboBox.TabIndex = 16; + // + // cultureLabel + // + this.cultureLabel.AutoSize = true; + this.cultureLabel.Location = new System.Drawing.Point(17, 184); + this.cultureLabel.Name = "cultureLabel"; + this.cultureLabel.Size = new System.Drawing.Size(42, 13); + this.cultureLabel.TabIndex = 15; + this.cultureLabel.Text = "Cullture"; + // + // eliminateSpacesCheckBox + // + this.eliminateSpacesCheckBox.AutoSize = true; + this.eliminateSpacesCheckBox.Location = new System.Drawing.Point(20, 256); + this.eliminateSpacesCheckBox.Name = "eliminateSpacesCheckBox"; + this.eliminateSpacesCheckBox.Size = new System.Drawing.Size(77, 17); + this.eliminateSpacesCheckBox.TabIndex = 20; + this.eliminateSpacesCheckBox.Text = "No spaces"; + this.eliminateSpacesCheckBox.UseVisualStyleBackColor = true; + // + // commonItemsButton + // + this.commonItemsButton.Enabled = false; + this.commonItemsButton.Location = new System.Drawing.Point(108, 252); + this.commonItemsButton.Name = "commonItemsButton"; + this.commonItemsButton.Size = new System.Drawing.Size(146, 23); + this.commonItemsButton.TabIndex = 23; + this.commonItemsButton.Text = "Common items"; + this.commonItemsButton.UseVisualStyleBackColor = true; + this.commonItemsButton.Click += new System.EventHandler(this.commonItemsButton_Click); + // + // headerButton + // + this.headerButton.Enabled = false; + this.headerButton.Location = new System.Drawing.Point(108, 227); + this.headerButton.Name = "headerButton"; + this.headerButton.Size = new System.Drawing.Size(146, 23); + this.headerButton.TabIndex = 22; + this.headerButton.Text = "Header"; + this.headerButton.UseVisualStyleBackColor = true; + this.headerButton.Click += new System.EventHandler(this.headerButton_Click); + // + // footerButton + // + this.footerButton.Enabled = false; + this.footerButton.Location = new System.Drawing.Point(108, 302); + this.footerButton.Name = "footerButton"; + this.footerButton.Size = new System.Drawing.Size(146, 23); + this.footerButton.TabIndex = 25; + this.footerButton.Text = "Footer"; + this.footerButton.UseVisualStyleBackColor = true; + this.footerButton.Click += new System.EventHandler(this.footerButton_Click); + // + // printCaptionCheckBox + // + this.printCaptionCheckBox.AutoSize = true; + this.printCaptionCheckBox.Location = new System.Drawing.Point(20, 277); + this.printCaptionCheckBox.Name = "printCaptionCheckBox"; + this.printCaptionCheckBox.Size = new System.Drawing.Size(85, 17); + this.printCaptionCheckBox.TabIndex = 21; + this.printCaptionCheckBox.Text = "Print caption"; + this.printCaptionCheckBox.UseVisualStyleBackColor = true; + // + // WriterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.printCaptionCheckBox); + this.Controls.Add(this.footerButton); + this.Controls.Add(this.commonItemsButton); + this.Controls.Add(this.headerButton); + this.Controls.Add(this.eliminateSpacesCheckBox); + this.Controls.Add(this.cultureComboBox); + this.Controls.Add(this.cultureLabel); + this.Controls.Add(this.goodOnlyCheckBox); + this.Controls.Add(this.fileNameFmtTextBox); + this.Controls.Add(this.fileNameFmtLabel); + this.Controls.Add(this.destination2Button); + this.Controls.Add(this.destination2TextBox); + this.Controls.Add(this.destination2Label); + this.Controls.Add(this.dayFoldersComboBox); + this.Controls.Add(this.monthFoldersComboBox); + this.Controls.Add(this.yearFoldersComboBox); + this.Controls.Add(this.dayFoldersLabel); + this.Controls.Add(this.monthFoldersLabel); + this.Controls.Add(this.yearFoldersLabel); + this.Controls.Add(this.selectItemsButton); + this.Controls.Add(this.separatorComboBox); + this.Controls.Add(this.separatorLabel); + this.Controls.Add(this.destinationButton); + this.Controls.Add(this.destinationTextBox); + this.Controls.Add(this.destinationLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "WriterCfgCtrl"; + this.Size = new System.Drawing.Size(400, 350); + this.Load += new System.EventHandler(this.WriterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.TextBox destinationTextBox; + private System.Windows.Forms.Label destinationLabel; + private System.Windows.Forms.Button destinationButton; + private System.Windows.Forms.Label separatorLabel; + private System.Windows.Forms.ComboBox separatorComboBox; + private System.Windows.Forms.Button selectItemsButton; + private System.Windows.Forms.Label yearFoldersLabel; + private System.Windows.Forms.Label monthFoldersLabel; + private System.Windows.Forms.Label dayFoldersLabel; + private System.Windows.Forms.ComboBox yearFoldersComboBox; + private System.Windows.Forms.ComboBox monthFoldersComboBox; + private System.Windows.Forms.ComboBox dayFoldersComboBox; + private System.Windows.Forms.Button destination2Button; + private System.Windows.Forms.TextBox destination2TextBox; + private System.Windows.Forms.Label destination2Label; + private System.Windows.Forms.TextBox fileNameFmtTextBox; + private System.Windows.Forms.Label fileNameFmtLabel; + private System.Windows.Forms.CheckBox goodOnlyCheckBox; + private System.Windows.Forms.ComboBox cultureComboBox; + private System.Windows.Forms.Label cultureLabel; + private System.Windows.Forms.CheckBox eliminateSpacesCheckBox; + private System.Windows.Forms.Button commonItemsButton; + private System.Windows.Forms.Button headerButton; + private System.Windows.Forms.Button footerButton; + private System.Windows.Forms.CheckBox printCaptionCheckBox; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Basic/WriterCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Basic/WriterCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Basic/WriterCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Enhanced/FactoryCompound.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Enhanced/FactoryCompound.cs new file mode 100644 index 00000000..53112633 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Enhanced/FactoryCompound.cs @@ -0,0 +1,29 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.FileWriters.Enhanced +{ + public class FactoryCompound : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".Compound"; } } + + public void ResetStaticProperties() { Writer.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Writer(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Writer(cfg); } + + public IComponentCfg DefaultConfig() { return new WriterCfg("FileWriter.Enhanced.Compound", this, Config.Entities.MetersKind.Combined); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + IComponentCfg cfg = ComponentCfgBase.CreateFromDbEntity(WriterCfg.Serializer, component, this); + (cfg as WriterCfg).MetersKind = Config.Entities.MetersKind.Combined; + return cfg; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Enhanced/FactoryHeatMeters.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Enhanced/FactoryHeatMeters.cs new file mode 100644 index 00000000..df9fd6ae --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Enhanced/FactoryHeatMeters.cs @@ -0,0 +1,29 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.FileWriters.Enhanced +{ + public class FactoryHeatMeters : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".HeatMeters"; } } + + public void ResetStaticProperties() { Writer.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Writer(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Writer(cfg); } + + public IComponentCfg DefaultConfig() { return new WriterCfg("FileWriter.Enhanced.HeatMeters", this, Config.Entities.MetersKind.HeatMeter); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + IComponentCfg cfg = ComponentCfgBase.CreateFromDbEntity(WriterCfg.Serializer, component, this); + (cfg as WriterCfg).MetersKind = Config.Entities.MetersKind.HeatMeter; + return cfg; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Enhanced/FactorySingle.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Enhanced/FactorySingle.cs new file mode 100644 index 00000000..020f96b8 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Enhanced/FactorySingle.cs @@ -0,0 +1,29 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.FileWriters.Enhanced +{ + public class FactorySingle : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".Single"; } } + + public void ResetStaticProperties() { Writer.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Writer(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Writer(cfg); } + + public IComponentCfg DefaultConfig() { return new WriterCfg("FileWriter.Enhanced.Single", this, Config.Entities.MetersKind.Single); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + IComponentCfg cfg = ComponentCfgBase.CreateFromDbEntity(WriterCfg.Serializer, component, this); + (cfg as WriterCfg).MetersKind = Config.Entities.MetersKind.Single; + return cfg; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Enhanced/Writer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Enhanced/Writer.cs new file mode 100644 index 00000000..08f1b27f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Enhanced/Writer.cs @@ -0,0 +1,464 @@ +/// +/// Copyright (c) 2016-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Threading; +using log4net; +using TBF.Resources; + +namespace TBF.BenchControl.Output.FileWriters.Enhanced +{ + public class Writer : ComponentBase, IOperation, GenericDevices.IResultsWriter + { + private static readonly ILog log = LogManager.GetLogger(typeof(Writer)); + public override string ToString() { return string.Format("Output.FileWriters.Enhanced({0})", Cfg.ToString(1)); } + + readonly WriterCfg writerCfg; + + string separatorStr; + + /// Items to print + string header; + IList commonItems; + IList testItems; + string footer; + + Results.Entities.Batch batch; + + bool abort; + + + public Writer() {} + + public Writer(Generic.IComponentCfg cfg) + : base(cfg) + { + writerCfg = cfg as WriterCfg; + ApplyConfig(); + log.Debug(this.ToString()); + } + + + void ApplyConfig() + { + switch (writerCfg.Separator) + { + default: + case Separator.None: separatorStr = string.Empty; break; + case Separator.Space: separatorStr = " "; break; + case Separator.Tabulator: separatorStr = "\t"; break; + case Separator.Comma: separatorStr = ","; break; + case Separator.Semicolon: separatorStr = ";"; break; + } + + header = string.IsNullOrEmpty(writerCfg.Header) ? string.Empty : writerCfg.Header.Replace("~", Environment.NewLine); + commonItems = Results.WMeterRsltItemSpec.FromStrArray(writerCfg.CommonItems); + testItems = Results.WMeterRsltItemSpec.FromStrArray(writerCfg.SelectedItems); /// TestID info will be overwritten later on + footer = string.IsNullOrEmpty(writerCfg.Footer) ? string.Empty : writerCfg.Footer.Replace("~", Environment.NewLine); + } + + + #region Configuration Change Handling + + public static void OnCfgChange(object sender, CfgChangeArgs args) + { + if (CfgChangeHandler == null) return; + try { CfgChangeHandler(sender, args); } + catch (Exception e) { log.Error("CfgChangeHandler(...) failed", e); } + } + + public static event EventHandler CfgChangeHandler; + + public override void StartChangeHandler() + { + CfgChangeHandler += delegate(object sender, CfgChangeArgs args) + { + WriterCfg newCfg = args.Cfg as WriterCfg; + if (newCfg != null && newCfg.Name.Equals(Name)) + { + if (args.Command == CfgChangeCmd.CfgChange) + { + writerCfg.DestinationPath = newCfg.DestinationPath; + writerCfg.DestinationPath2 = newCfg.DestinationPath2; + writerCfg.YearFolders = newCfg.YearFolders; + writerCfg.MonthFolders = newCfg.MonthFolders; + writerCfg.DayFolders = newCfg.DayFolders; + writerCfg.FileNameFormat = newCfg.FileNameFormat; + writerCfg.Culture = newCfg.Culture; + writerCfg.Separator = newCfg.Separator; + writerCfg.EliminateSpaces = newCfg.EliminateSpaces; + writerCfg.Header = newCfg.Header; + writerCfg.CommonItems = newCfg.CommonItems; + writerCfg.SelectedItems = newCfg.SelectedItems; + writerCfg.Footer = newCfg.Footer; + + ApplyConfig(); + } + } + }; + } + + #endregion Configuration Change Handling + + + /// + /// Eliminate spaces conditionally, depesing on bool WriterCfg.EliminateSpaces + /// + /// Input string + /// Output string + string ElSpaces(string item) + { + if (writerCfg.EliminateSpaces) + return item.Replace(" ", string.Empty); + else + return item; + } + + + /// + /// Returns a file name derived from a DateTime structure. + /// Creates directories on this path as a side effect. + /// + /// Date and time + /// File name + string GetFilename(string destinationPath, DateTime time) + { + string directory = destinationPath; /// Ends with "\\"; + + switch (writerCfg.YearFolders) + { + case YearFolders.FourDigit: + directory = string.Format("{0}{1:yyyy}\\", directory, time); + break; + case YearFolders.TwoDigit: + directory = string.Format("{0}{1:yy}\\", directory, time); + break; + } + + switch (writerCfg.MonthFolders) + { + case MonthFolders.Name: + { + string monthStr; + switch (time.Month) + { + default: + case 1: monthStr = "January"; break; + case 2: monthStr = "February"; break; + case 3: monthStr = "March"; break; + case 4: monthStr = "April"; break; + case 5: monthStr = "May"; break; + case 6: monthStr = "June"; break; + case 7: monthStr = "July"; break; + case 8: monthStr = "August"; break; + case 9: monthStr = "September"; break; + case 10: monthStr = "October"; break; + case 11: monthStr = "November"; break; + case 12: monthStr = "December"; break; + } + directory = string.Format("{0}{1}\\", directory, monthStr); + break; + } + case MonthFolders.Digit: + directory = string.Format("{0}{1}\\", directory, time.Month.ToString()); + break; + case MonthFolders.TwoDigit: + directory = string.Format("{0}{1:MM}\\", directory, time); + break; + } + + switch (writerCfg.DayFolders) + { + case DayFolders.Digit: + directory = string.Format("{0}{1}\\", directory, time.Day.ToString()); + break; + case DayFolders.TwoDigit: + directory = string.Format("{0}{1:dd}\\", directory, time); + break; + } + + Directory.CreateDirectory(directory); + + try + { + if (string.IsNullOrEmpty(writerCfg.FileNameFormat)) throw new Exception(); + return directory + string.Format(writerCfg.FileNameFormat, time); + } + catch + { + return string.Format("{0}{1:yyMMdd-HHmm}.txt", directory, time); + } + } + + + /// + /// Writes the test cycle results into a file + /// Events: + /// Event.ResultsWritten + /// Event.Busy + /// + /// Results to write into a file + /// Reference to the operation + public IOperation WriteResultsOp(Results.Entities.Batch batch) + { + this.batch = batch; + return this; + } + + /// Start this operation + public void Start() + { + CultureInfo oriCulture = Thread.CurrentThread.CurrentCulture; + + if (writerCfg.Culture != Culture.system) + { + Thread.CurrentThread.CurrentCulture = new CultureInfo(writerCfg.Culture.ToString()); + } + + abort = false; + WriteRslts(batch, writerCfg.DestinationPath); + WriteRslts(batch, writerCfg.DestinationPath2); + + Thread.CurrentThread.CurrentCulture = oriCulture; + } + + /// Run this operation + /// Event.ResultsWritten + public Event Run() + { + return Event.ResultsWritten; + } + + /// Stop this operation + public void Stop() + { + } + + + void WriteRslts(Results.Entities.Batch batch, string destination) + { + if (batch == null || batch.WaterMeters == null || batch.WaterMeters.Count <= 0) return; + + StreamWriter writer = StreamWriter.Null; + if (!string.IsNullOrEmpty(destination)) + { + try + { + writer = File.AppendText(GetFilename(destination, batch.EndTime)); + } + catch + { + } + } + + WriteRsltsEx(batch, writer); + writer.Close(); + } + + + void WriteRsltsEx(Results.Entities.Batch batch, StreamWriter wrtr) + { + ///---------- + /// Header + ///---------- + if (!string.IsNullOrEmpty(writerCfg.Header)) wrtr.Write(header); + wrtr.WriteLine(); + + ///---------------- + /// Common items + ///---------------- + string[] leftColumn = new string[commonItems.Count]; + string[] rightColumn = new string[commonItems.Count]; + + int cnt = 0; + foreach (var v in commonItems) + { + leftColumn[cnt] = v.Caption; + rightColumn[cnt] = (batch.WaterMeters.Count > 0) ? v.Print(batch.WaterMeters[0]) : string.Empty; + cnt++; + } + + /// Determine max. left column width in characters + int maxLen = 0; + foreach (var s in leftColumn) if (s.Length > maxLen) maxLen = s.Length; + + /// Write aligned columns + for (int i = 0; i < Math.Min(leftColumn.Length, rightColumn.Length); i++) + { + if (abort) return; + + wrtr.Write(leftColumn[i]); + + if (!writerCfg.EliminateSpaces) + { + wrtr.Write(new string(' ', maxLen - leftColumn[i].Length + 3)); + } + wrtr.Write(separatorStr); + + wrtr.WriteLine(rightColumn[i]); + } + + ///-------- + /// Body + ///-------- + foreach (var wm in batch.WaterMeters) + { + if (!writerCfg.SaveGoodOnly || wm.Passed) + { + if (abort) return; + WriteWM(wrtr, wm); + } + } + + ///---------- + /// Footer + ///---------- + if (!string.IsNullOrEmpty(writerCfg.Footer)) wrtr.Write(footer); + } + + /// + /// Write one water meter results + /// + /// Water meter number (0-based) + void WriteWM(StreamWriter wr, Results.Entities.WaterMeter wm) + { + wr.WriteLine(); + + /// Write water meter number and s/n +#if BADGER_MALA_TRAT || BADGER_STREDNA_TRAT || BADGER_VELKA_TRAT + wr.Write(string.Format("Water meter {0} s/n: {1}", wm.WMPosition, wm.SerialNr)); +#else + wr.Write(string.Format("{0} {1}", Strings.Water_Meter, wm.WMPosition)); + if (!wm.Compound()) + { + if (!string.IsNullOrEmpty(wm.SerialNr)) + { + wr.Write(string.Format(", {0} {1}", Strings.SerialNr, wm.SerialNr)); + } + } + else + { + if (!string.IsNullOrEmpty(wm.SerialNr)) + { + wr.Write(string.Format(", {0} {1}", Strings.Main_WM_SerialNr, wm.SerialNr)); + } + if (!string.IsNullOrEmpty(wm.SerialNrAux)) + { + wr.Write(string.Format(", {0} {1}", Strings.Aux_WM_SerialNr, wm.SerialNrAux)); + } + } +#endif + wr.WriteLine(); + + /// Determine column widths + int[] columnWidths = new int[testItems.Count]; + int totalWidth = 0; + for (int i = 0; i < testItems.Count; i++) + { + if (abort) return; + + columnWidths[i] = ElSpaces(testItems[i].Caption).Length; + foreach (var mtr in wm.MeterTestRslts) + { + if ((mtr != null) && (mtr.Publish() == Config.Entities.Publish.Always)) + { + string itemText = testItems[i].Print(wm, mtr.Name()); + + /// Strip color information + string[] texts = itemText.Split(new char[] { '|' }); + if (texts.Length == 2) { itemText = texts[0]; } + + int len = ElSpaces(itemText).Length; + if (len > columnWidths[i]) columnWidths[i] = len; + } + } + totalWidth += columnWidths[i]; + } + totalWidth += 3 * (testItems.Count - 1); + if (totalWidth < 0) totalWidth = 0; + + string horizontalLine = new String('-', totalWidth); + + if (!writerCfg.EliminateSpaces) + { + wr.WriteLine(horizontalLine); /// Horizontal line above the header + } + + /// Write column headers + for (int i = 0; i < testItems.Count; i++) + { + if (abort) return; + + string caption = ElSpaces(testItems[i].Caption); + wr.Write(caption); + + if (i < testItems.Count - 1) + { + if (!writerCfg.EliminateSpaces) + { + wr.Write(new string(' ', columnWidths[i] - testItems[i].Caption.Length + 3)); + } + wr.Write(separatorStr); + } + else + { + wr.WriteLine(); + } + } + + if (!writerCfg.EliminateSpaces) + { + wr.WriteLine(horizontalLine); /// Horizontal line between the header and the body + } + + /// Write table data + int rowsCount = 0; + foreach (var mtr in wm.MeterTestRslts) + { + if (abort) return; + + if (mtr != null && mtr.IsPilotRslt() && mtr.Publish() == Config.Entities.Publish.Always) + { + Results.WMeterRsltItemSpec.TableRowNr = ++rowsCount; + + for (int i = 0; i < testItems.Count; i++) + { + Results.WMeterRsltItemSpec.TableColumnNr = i + 1; + + /// Fetch the item + string itemText = testItems[i].Print(wm, mtr.Name()); + + /// Strip color information + string[] texts = itemText.Split(new char[] { '|' }); + if (texts.Length == 2) { itemText = texts[0]; } + + /// Print the item + string itemText2 = ElSpaces(itemText); + wr.Write(itemText2); + + if (i < testItems.Count - 1) + { + if (!writerCfg.EliminateSpaces) + { + wr.Write(new string(' ', columnWidths[i] - itemText.Length + 3)); + } + wr.Write(separatorStr); + } + else + { + wr.WriteLine(); + } + } + } + } + + if (!writerCfg.EliminateSpaces) + { + wr.WriteLine(horizontalLine); /// Horizontal line below the body + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Enhanced/WriterCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Enhanced/WriterCfg.cs new file mode 100644 index 00000000..e0d179d8 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Enhanced/WriterCfg.cs @@ -0,0 +1,74 @@ +/// +/// Copyright (c) 2016-2017 Sensus Metering Systems +/// +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.FileWriters.Enhanced +{ + public class WriterCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(WriterCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new WriterCfgCtrl(); } + + public string DestinationPath; /// Directory path into which the results will be saved + public string DestinationPath2; /// Directory path into which the 2nd copy of results will be saved + public YearFolders YearFolders; + public MonthFolders MonthFolders; + public DayFolders DayFolders; + public string FileNameFormat; + public Culture Culture; + public Separator Separator; + public bool EliminateSpaces; + public bool SaveGoodOnly; + public string Header; + public string[] CommonItems; + public string[] SelectedItems; + public string Footer; + + [XmlIgnore] + public Config.Entities.MetersKind MetersKind; + + /// Private parameterless constructor invoked by all other (public) constructors + WriterCfg() + { + } + + public WriterCfg(string name, IComponentFactory factory, Config.Entities.MetersKind metersKind) + : this() + { + Name = name; + Factory = factory; + MetersKind = metersKind; + + ParentName = string.Empty; + DestinationPath = Program.HomeDir + "Results\\"; + DestinationPath2 = string.Empty; + YearFolders = YearFolders.FourDigit; + MonthFolders = MonthFolders.Digit; + DayFolders = DayFolders.Digit; + FileNameFormat = "{0:yyMMdd-HHmm}.txt"; + Separator = Separator.None; + EliminateSpaces = false; + SaveGoodOnly = false; + Header = string.Empty; + Footer = string.Empty; + } + + public string ToString(int i) + { + return string.Format("{0}, Path={1}, Y={2}, M={3}, D={4}, FNameFmt={5}, Separator={6}, NoSpaces={7}, GoodOnly={8}", + Name, + DestinationPath, + YearFolders, + MonthFolders, + DayFolders, + FileNameFormat, + Separator, + EliminateSpaces, + SaveGoodOnly); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Enhanced/WriterCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Enhanced/WriterCfgCtrl.cs new file mode 100644 index 00000000..478b5727 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Enhanced/WriterCfgCtrl.cs @@ -0,0 +1,373 @@ +/// +/// Copyright (c) 2016-2017 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.Output.FileWriters.Enhanced +{ + public partial class WriterCfgCtrl : UserControl, IComponentCfgCtrl + { + static readonly ILog log = LogManager.GetLogger(typeof(WriterCfgCtrl)); + + public bool ShowMore { get { return false; } } + + WriterCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as WriterCfg; + Redraw(); + } + } + + string header; + string[] commonItems; + string[] testItems; + string footer; + + public WriterCfgCtrl() + { + InitializeComponent(); + Localize(); + } + + private void WriterCfgCtrl_Load(object sender, EventArgs e) + { + for (YearFolders s = 0; s < YearFolders.Count; s++) yearFoldersComboBox.Items.Add(s.ToString()); + for (MonthFolders s = 0; s < MonthFolders.Count; s++) monthFoldersComboBox.Items.Add(s.ToString()); + for (DayFolders s = 0; s < DayFolders.Count; s++) dayFoldersComboBox.Items.Add(s.ToString()); + for (Culture s = 0; s < Culture.Count; s++) cultureComboBox.Items.Add(s.ToString()); + for (Separator s = 0; s < Separator.Count; s++) separatorComboBox.Items.Add(s.ToString()); + + header = config.Header; + commonItems = config.CommonItems; + testItems = config.SelectedItems; + footer = config.Footer; + + Redraw(); + } + + void Localize() + { + nameLabel.Text = Strings.Name; + destinationLabel.Text = "Destination"; + destination2Label.Text = "Destination" + " 2"; + yearFoldersLabel.Text = "Year folders"; + monthFoldersLabel.Text = "Month folders"; + dayFoldersLabel.Text = "Day folders"; + fileNameFmtLabel.Text = "File name format"; + cultureLabel.Text = "Culture"; + separatorLabel.Text = "Separator"; + eliminateSpacesCheckBox.Text = "No spaces"; + goodOnlyCheckBox.Text = "Good only"; + headerButton.Text = Strings.Header; + commonItemsButton.Text = "Common items"; + testItemsButton.Text = "Test items"; + footerButton.Text = Strings.Footer; + upgradeWizardButton.Text = "Upgrade wizard"; + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + destinationTextBox.Text = config.DestinationPath; + destination2TextBox.Text = config.DestinationPath2; + yearFoldersComboBox.Text = config.YearFolders.ToString(); + monthFoldersComboBox.Text = config.MonthFolders.ToString(); + dayFoldersComboBox.Text = config.DayFolders.ToString(); + fileNameFmtTextBox.Text = config.FileNameFormat; + cultureComboBox.Text = config.Culture.ToString(); + separatorComboBox.Text = config.Separator.ToString(); + eliminateSpacesCheckBox.Checked = config.EliminateSpaces; + goodOnlyCheckBox.Checked = config.SaveGoodOnly; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + destinationTextBox.Enabled = true; + destinationButton.Enabled = true; + destination2TextBox.Enabled = true; + destination2Button.Enabled = true; + yearFoldersComboBox.Enabled = true; + monthFoldersComboBox.Enabled = true; + dayFoldersComboBox.Enabled = true; + fileNameFmtTextBox.Enabled = true; + cultureComboBox.Enabled = true; + separatorComboBox.Enabled = true; + eliminateSpacesCheckBox.Enabled = true; + goodOnlyCheckBox.Enabled = true; + headerButton.Enabled = true; + commonItemsButton.Enabled = true; + testItemsButton.Enabled = true; + footerButton.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (!yearFoldersComboBox.Items.Contains(yearFoldersComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid year folders selection"; + } + + if (!monthFoldersComboBox.Items.Contains(monthFoldersComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid month folders selection"; + } + + if (!dayFoldersComboBox.Items.Contains(dayFoldersComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid day folder selection"; + } + + if (!cultureComboBox.Items.Contains(cultureComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid culture"; + } + + if (!separatorComboBox.Items.Contains(separatorComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid separator"; + } + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + if (config.Name != nameTextBox.Text) + { + config.Name = nameTextBox.Text; + flags |= (CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + } + + if (config.DestinationPath != destinationTextBox.Text) + { + config.DestinationPath = destinationTextBox.Text; + if (!config.DestinationPath.EndsWith("\\")) config.DestinationPath += "\\"; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.DestinationPath2 != destination2TextBox.Text) + { + config.DestinationPath2 = destination2TextBox.Text; + if (!config.DestinationPath2.EndsWith("\\")) config.DestinationPath2 += "\\"; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + for (YearFolders i = 0; i < YearFolders.Count; i++) + { + if (i.ToString().Equals(yearFoldersComboBox.Text) && (config.YearFolders != i)) + { + config.YearFolders = i; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + break; + } + } + + for (MonthFolders i = 0; i < MonthFolders.Count; i++) + { + if (i.ToString().Equals(monthFoldersComboBox.Text) && (config.MonthFolders != i)) + { + config.MonthFolders = i; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + break; + } + } + + for (DayFolders i = 0; i < DayFolders.Count; i++) + { + if (i.ToString().Equals(dayFoldersComboBox.Text) && (config.DayFolders != i)) + { + config.DayFolders = i; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + break; + } + } + + if (config.FileNameFormat != fileNameFmtTextBox.Text) + { + config.FileNameFormat = fileNameFmtTextBox.Text; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + for (Culture i = 0; i < Culture.Count; i++) + { + if (i.ToString().Equals(cultureComboBox.Text) && (config.Culture != i)) + { + config.Culture = i; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + break; + } + } + + for (Separator i = 0; i < Separator.Count; i++) + { + if (i.ToString().Equals(separatorComboBox.Text) && (config.Separator != i)) + { + config.Separator = i; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + break; + } + } + + if (config.EliminateSpaces != eliminateSpacesCheckBox.Checked) + { + config.EliminateSpaces = eliminateSpacesCheckBox.Checked; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.SaveGoodOnly != goodOnlyCheckBox.Checked) + { + config.SaveGoodOnly = goodOnlyCheckBox.Checked; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.Header != header) + { + config.Header = header; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.CommonItems != commonItems) + { + config.CommonItems = commonItems; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.SelectedItems != testItems) + { + config.SelectedItems = testItems; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.Footer != footer) + { + config.Footer = footer; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if ((flags & CfgUpdateFlags.InvokeCfgChange) != 0) + { + Writer.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.CfgChange, config)); + } + + return flags; + } + + private void destinationButton_Click(object sender, EventArgs e) + { + + } + + private void headerButton_Click(object sender, EventArgs e) + { + HeaderFooterDlg dlg = new HeaderFooterDlg(true, string.IsNullOrEmpty(header) ? string.Empty : header.Replace("~", Environment.NewLine)); + if (dlg.ShowDialog() == DialogResult.OK) + { + header = dlg.EditedText.Replace(Environment.NewLine, "~"); + } + } + + private void commonItemsButton_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg() + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(commonItems), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + commonItems = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems); + } + } + + private void testItemsButton_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg(true) + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(testItems), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + testItems = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems); + } + } + + private void footerButton_Click(object sender, EventArgs e) + { + HeaderFooterDlg dlg = new HeaderFooterDlg(false, string.IsNullOrEmpty(footer) ? string.Empty : footer.Replace("~", Environment.NewLine)); + if (dlg.ShowDialog() == DialogResult.OK) + { + footer = dlg.EditedText.Replace(Environment.NewLine, "~"); + } + } + + private void upgradeWizardButton_Click(object sender, EventArgs e) + { + if (MessageBox.Show("This wizzard will overwrite curent settings." + Environment.NewLine + + "Do you want to continue?", + "Confirmation", + MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + /// + /// Use legacy common items (English) + /// + commonItems = new string[] { + "3~Batch number:~~None~~~0~", + "72~Date and time:~~None~{0:yyyy.MM.dd HH:mm}~~0~", + "2~Procedure:~~None~~~0~", + "66~User:~~None~~~0~", + "26~Ambient temperature:~~C~{0} °C~F1~0~", + "27~Ambient pressure:~~mbar~{0} mbar~F0~0~", + "28~Ambient humidity:~~Pct~{0} %~F0~0~", + }; + commonItemsButton_Click(this, null); + + testItemsButton_Click(this, null); + } + } + + #region Configuration Change Handling + + public static void OnCmdResponse(object sender, CmdResponseArgs args) + { + if (CmdResponseHandler == null) return; + try { CmdResponseHandler(sender, args); } + catch (Exception e) { log.Error("CmdResponseHandler(...) failed", e); } + } + + public static event EventHandler CmdResponseHandler; + + public void StartResponseHandler() { } + public void StopResponseHandler() { } + + #endregion Configuration Change Handling + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Enhanced/WriterCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Enhanced/WriterCfgCtrl.designer.cs new file mode 100644 index 00000000..9df65cff --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Enhanced/WriterCfgCtrl.designer.cs @@ -0,0 +1,397 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +namespace TBF.BenchControl.Output.FileWriters.Enhanced +{ + partial class WriterCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.destinationTextBox = new System.Windows.Forms.TextBox(); + this.destinationLabel = new System.Windows.Forms.Label(); + this.destinationButton = new System.Windows.Forms.Button(); + this.separatorLabel = new System.Windows.Forms.Label(); + this.separatorComboBox = new System.Windows.Forms.ComboBox(); + this.testItemsButton = new System.Windows.Forms.Button(); + this.yearFoldersLabel = new System.Windows.Forms.Label(); + this.monthFoldersLabel = new System.Windows.Forms.Label(); + this.dayFoldersLabel = new System.Windows.Forms.Label(); + this.yearFoldersComboBox = new System.Windows.Forms.ComboBox(); + this.monthFoldersComboBox = new System.Windows.Forms.ComboBox(); + this.dayFoldersComboBox = new System.Windows.Forms.ComboBox(); + this.destination2Button = new System.Windows.Forms.Button(); + this.destination2TextBox = new System.Windows.Forms.TextBox(); + this.destination2Label = new System.Windows.Forms.Label(); + this.fileNameFmtTextBox = new System.Windows.Forms.TextBox(); + this.fileNameFmtLabel = new System.Windows.Forms.Label(); + this.eliminateSpacesCheckBox = new System.Windows.Forms.CheckBox(); + this.headerButton = new System.Windows.Forms.Button(); + this.footerButton = new System.Windows.Forms.Button(); + this.commonItemsButton = new System.Windows.Forms.Button(); + this.upgradeWizardButton = new System.Windows.Forms.Button(); + this.cultureComboBox = new System.Windows.Forms.ComboBox(); + this.cultureLabel = new System.Windows.Forms.Label(); + this.goodOnlyCheckBox = new System.Windows.Forms.CheckBox(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(108, 28); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(146, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(17, 31); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(105, 6); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // destinationTextBox + // + this.destinationTextBox.Enabled = false; + this.destinationTextBox.Location = new System.Drawing.Point(108, 49); + this.destinationTextBox.Name = "destinationTextBox"; + this.destinationTextBox.Size = new System.Drawing.Size(146, 20); + this.destinationTextBox.TabIndex = 4; + // + // destinationLabel + // + this.destinationLabel.AutoSize = true; + this.destinationLabel.Location = new System.Drawing.Point(17, 52); + this.destinationLabel.Name = "destinationLabel"; + this.destinationLabel.Size = new System.Drawing.Size(60, 13); + this.destinationLabel.TabIndex = 3; + this.destinationLabel.Text = "Destination"; + // + // destinationButton + // + this.destinationButton.Enabled = false; + this.destinationButton.Location = new System.Drawing.Point(269, 49); + this.destinationButton.Name = "destinationButton"; + this.destinationButton.Size = new System.Drawing.Size(30, 20); + this.destinationButton.TabIndex = 5; + this.destinationButton.Text = "..."; + this.destinationButton.UseVisualStyleBackColor = true; + this.destinationButton.Click += new System.EventHandler(this.destinationButton_Click); + // + // separatorLabel + // + this.separatorLabel.AutoSize = true; + this.separatorLabel.Location = new System.Drawing.Point(17, 203); + this.separatorLabel.Name = "separatorLabel"; + this.separatorLabel.Size = new System.Drawing.Size(53, 13); + this.separatorLabel.TabIndex = 19; + this.separatorLabel.Text = "Separator"; + // + // separatorComboBox + // + this.separatorComboBox.Enabled = false; + this.separatorComboBox.FormattingEnabled = true; + this.separatorComboBox.Location = new System.Drawing.Point(108, 200); + this.separatorComboBox.Name = "separatorComboBox"; + this.separatorComboBox.Size = new System.Drawing.Size(146, 21); + this.separatorComboBox.TabIndex = 20; + // + // testItemsButton + // + this.testItemsButton.Enabled = false; + this.testItemsButton.Location = new System.Drawing.Point(108, 275); + this.testItemsButton.Name = "testItemsButton"; + this.testItemsButton.Size = new System.Drawing.Size(146, 23); + this.testItemsButton.TabIndex = 25; + this.testItemsButton.Text = "Test items"; + this.testItemsButton.UseVisualStyleBackColor = true; + this.testItemsButton.Click += new System.EventHandler(this.testItemsButton_Click); + // + // yearFoldersLabel + // + this.yearFoldersLabel.AutoSize = true; + this.yearFoldersLabel.Location = new System.Drawing.Point(17, 94); + this.yearFoldersLabel.Name = "yearFoldersLabel"; + this.yearFoldersLabel.Size = new System.Drawing.Size(63, 13); + this.yearFoldersLabel.TabIndex = 9; + this.yearFoldersLabel.Text = "Year folders"; + // + // monthFoldersLabel + // + this.monthFoldersLabel.AutoSize = true; + this.monthFoldersLabel.Location = new System.Drawing.Point(17, 116); + this.monthFoldersLabel.Name = "monthFoldersLabel"; + this.monthFoldersLabel.Size = new System.Drawing.Size(71, 13); + this.monthFoldersLabel.TabIndex = 11; + this.monthFoldersLabel.Text = "Month folders"; + // + // dayFoldersLabel + // + this.dayFoldersLabel.AutoSize = true; + this.dayFoldersLabel.Location = new System.Drawing.Point(17, 138); + this.dayFoldersLabel.Name = "dayFoldersLabel"; + this.dayFoldersLabel.Size = new System.Drawing.Size(60, 13); + this.dayFoldersLabel.TabIndex = 13; + this.dayFoldersLabel.Text = "Day folders"; + // + // yearFoldersComboBox + // + this.yearFoldersComboBox.Enabled = false; + this.yearFoldersComboBox.FormattingEnabled = true; + this.yearFoldersComboBox.Location = new System.Drawing.Point(108, 91); + this.yearFoldersComboBox.Name = "yearFoldersComboBox"; + this.yearFoldersComboBox.Size = new System.Drawing.Size(146, 21); + this.yearFoldersComboBox.TabIndex = 10; + // + // monthFoldersComboBox + // + this.monthFoldersComboBox.Enabled = false; + this.monthFoldersComboBox.FormattingEnabled = true; + this.monthFoldersComboBox.Location = new System.Drawing.Point(108, 113); + this.monthFoldersComboBox.Name = "monthFoldersComboBox"; + this.monthFoldersComboBox.Size = new System.Drawing.Size(146, 21); + this.monthFoldersComboBox.TabIndex = 12; + // + // dayFoldersComboBox + // + this.dayFoldersComboBox.Enabled = false; + this.dayFoldersComboBox.FormattingEnabled = true; + this.dayFoldersComboBox.Location = new System.Drawing.Point(108, 135); + this.dayFoldersComboBox.Name = "dayFoldersComboBox"; + this.dayFoldersComboBox.Size = new System.Drawing.Size(146, 21); + this.dayFoldersComboBox.TabIndex = 14; + // + // destination2Button + // + this.destination2Button.Enabled = false; + this.destination2Button.Location = new System.Drawing.Point(269, 70); + this.destination2Button.Name = "destination2Button"; + this.destination2Button.Size = new System.Drawing.Size(30, 20); + this.destination2Button.TabIndex = 8; + this.destination2Button.Text = "..."; + this.destination2Button.UseVisualStyleBackColor = true; + // + // destination2TextBox + // + this.destination2TextBox.Enabled = false; + this.destination2TextBox.Location = new System.Drawing.Point(108, 70); + this.destination2TextBox.Name = "destination2TextBox"; + this.destination2TextBox.Size = new System.Drawing.Size(146, 20); + this.destination2TextBox.TabIndex = 7; + // + // destination2Label + // + this.destination2Label.AutoSize = true; + this.destination2Label.Location = new System.Drawing.Point(17, 73); + this.destination2Label.Name = "destination2Label"; + this.destination2Label.Size = new System.Drawing.Size(69, 13); + this.destination2Label.TabIndex = 6; + this.destination2Label.Text = "Destination 2"; + // + // fileNameFmtTextBox + // + this.fileNameFmtTextBox.Enabled = false; + this.fileNameFmtTextBox.Location = new System.Drawing.Point(108, 157); + this.fileNameFmtTextBox.Name = "fileNameFmtTextBox"; + this.fileNameFmtTextBox.Size = new System.Drawing.Size(146, 20); + this.fileNameFmtTextBox.TabIndex = 16; + // + // fileNameFmtLabel + // + this.fileNameFmtLabel.AutoSize = true; + this.fileNameFmtLabel.Location = new System.Drawing.Point(17, 160); + this.fileNameFmtLabel.Name = "fileNameFmtLabel"; + this.fileNameFmtLabel.Size = new System.Drawing.Size(84, 13); + this.fileNameFmtLabel.TabIndex = 15; + this.fileNameFmtLabel.Text = "File name format"; + // + // eliminateSpacesCheckBox + // + this.eliminateSpacesCheckBox.AutoSize = true; + this.eliminateSpacesCheckBox.Location = new System.Drawing.Point(20, 241); + this.eliminateSpacesCheckBox.Name = "eliminateSpacesCheckBox"; + this.eliminateSpacesCheckBox.Size = new System.Drawing.Size(77, 17); + this.eliminateSpacesCheckBox.TabIndex = 21; + this.eliminateSpacesCheckBox.Text = "No spaces"; + this.eliminateSpacesCheckBox.UseVisualStyleBackColor = true; + // + // headerButton + // + this.headerButton.Enabled = false; + this.headerButton.Location = new System.Drawing.Point(108, 225); + this.headerButton.Name = "headerButton"; + this.headerButton.Size = new System.Drawing.Size(146, 23); + this.headerButton.TabIndex = 23; + this.headerButton.Text = "Header"; + this.headerButton.UseVisualStyleBackColor = true; + this.headerButton.Click += new System.EventHandler(this.headerButton_Click); + // + // footerButton + // + this.footerButton.Enabled = false; + this.footerButton.Location = new System.Drawing.Point(108, 300); + this.footerButton.Name = "footerButton"; + this.footerButton.Size = new System.Drawing.Size(146, 23); + this.footerButton.TabIndex = 26; + this.footerButton.Text = "Footer"; + this.footerButton.UseVisualStyleBackColor = true; + this.footerButton.Click += new System.EventHandler(this.footerButton_Click); + // + // commonItemsButton + // + this.commonItemsButton.Enabled = false; + this.commonItemsButton.Location = new System.Drawing.Point(108, 250); + this.commonItemsButton.Name = "commonItemsButton"; + this.commonItemsButton.Size = new System.Drawing.Size(146, 23); + this.commonItemsButton.TabIndex = 24; + this.commonItemsButton.Text = "Common items"; + this.commonItemsButton.UseVisualStyleBackColor = true; + this.commonItemsButton.Click += new System.EventHandler(this.commonItemsButton_Click); + // + // upgradeWizardButton + // + this.upgradeWizardButton.Location = new System.Drawing.Point(269, 250); + this.upgradeWizardButton.Name = "upgradeWizardButton"; + this.upgradeWizardButton.Size = new System.Drawing.Size(80, 48); + this.upgradeWizardButton.TabIndex = 27; + this.upgradeWizardButton.Text = "Upgrade wizard"; + this.upgradeWizardButton.UseVisualStyleBackColor = true; + this.upgradeWizardButton.Click += new System.EventHandler(this.upgradeWizardButton_Click); + // + // cultureComboBox + // + this.cultureComboBox.Enabled = false; + this.cultureComboBox.FormattingEnabled = true; + this.cultureComboBox.Location = new System.Drawing.Point(108, 178); + this.cultureComboBox.Name = "cultureComboBox"; + this.cultureComboBox.Size = new System.Drawing.Size(146, 21); + this.cultureComboBox.TabIndex = 18; + // + // cultureLabel + // + this.cultureLabel.AutoSize = true; + this.cultureLabel.Location = new System.Drawing.Point(17, 181); + this.cultureLabel.Name = "cultureLabel"; + this.cultureLabel.Size = new System.Drawing.Size(42, 13); + this.cultureLabel.TabIndex = 17; + this.cultureLabel.Text = "Cullture"; + // + // goodOnlyCheckBox + // + this.goodOnlyCheckBox.AutoSize = true; + this.goodOnlyCheckBox.Location = new System.Drawing.Point(20, 264); + this.goodOnlyCheckBox.Name = "goodOnlyCheckBox"; + this.goodOnlyCheckBox.Size = new System.Drawing.Size(74, 17); + this.goodOnlyCheckBox.TabIndex = 22; + this.goodOnlyCheckBox.Text = "Good only"; + this.goodOnlyCheckBox.UseVisualStyleBackColor = true; + // + // WriterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.goodOnlyCheckBox); + this.Controls.Add(this.cultureComboBox); + this.Controls.Add(this.cultureLabel); + this.Controls.Add(this.upgradeWizardButton); + this.Controls.Add(this.commonItemsButton); + this.Controls.Add(this.footerButton); + this.Controls.Add(this.headerButton); + this.Controls.Add(this.eliminateSpacesCheckBox); + this.Controls.Add(this.fileNameFmtTextBox); + this.Controls.Add(this.fileNameFmtLabel); + this.Controls.Add(this.destination2Button); + this.Controls.Add(this.destination2TextBox); + this.Controls.Add(this.destination2Label); + this.Controls.Add(this.dayFoldersComboBox); + this.Controls.Add(this.monthFoldersComboBox); + this.Controls.Add(this.yearFoldersComboBox); + this.Controls.Add(this.dayFoldersLabel); + this.Controls.Add(this.monthFoldersLabel); + this.Controls.Add(this.yearFoldersLabel); + this.Controls.Add(this.testItemsButton); + this.Controls.Add(this.separatorComboBox); + this.Controls.Add(this.separatorLabel); + this.Controls.Add(this.destinationButton); + this.Controls.Add(this.destinationTextBox); + this.Controls.Add(this.destinationLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "WriterCfgCtrl"; + this.Size = new System.Drawing.Size(400, 350); + this.Load += new System.EventHandler(this.WriterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.TextBox destinationTextBox; + private System.Windows.Forms.Label destinationLabel; + private System.Windows.Forms.Button destinationButton; + private System.Windows.Forms.Label separatorLabel; + private System.Windows.Forms.ComboBox separatorComboBox; + private System.Windows.Forms.Button testItemsButton; + private System.Windows.Forms.Label yearFoldersLabel; + private System.Windows.Forms.Label monthFoldersLabel; + private System.Windows.Forms.Label dayFoldersLabel; + private System.Windows.Forms.ComboBox yearFoldersComboBox; + private System.Windows.Forms.ComboBox monthFoldersComboBox; + private System.Windows.Forms.ComboBox dayFoldersComboBox; + private System.Windows.Forms.Button destination2Button; + private System.Windows.Forms.TextBox destination2TextBox; + private System.Windows.Forms.Label destination2Label; + private System.Windows.Forms.TextBox fileNameFmtTextBox; + private System.Windows.Forms.Label fileNameFmtLabel; + private System.Windows.Forms.CheckBox eliminateSpacesCheckBox; + private System.Windows.Forms.Button headerButton; + private System.Windows.Forms.Button footerButton; + private System.Windows.Forms.Button commonItemsButton; + private System.Windows.Forms.Button upgradeWizardButton; + private System.Windows.Forms.ComboBox cultureComboBox; + private System.Windows.Forms.Label cultureLabel; + private System.Windows.Forms.CheckBox goodOnlyCheckBox; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Enhanced/WriterCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Enhanced/WriterCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Enhanced/WriterCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Enums.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Enums.cs new file mode 100644 index 00000000..b398f7d6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Enums.cs @@ -0,0 +1,40 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.Output.FileWriters +{ + public enum YearFolders + { + None, + TwoDigit, + FourDigit, + Count + } + + public enum MonthFolders + { + None, + Digit, + TwoDigit, + Name, + Count + } + + public enum DayFolders + { + None, + Digit, + TwoDigit, + Count + } + + public enum Separator + { + None, + Space, + Tabulator, + Comma, + Semicolon, + Count + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/ImageArchiver/Archiver.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/ImageArchiver/Archiver.cs new file mode 100644 index 00000000..5b436f22 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/ImageArchiver/Archiver.cs @@ -0,0 +1,211 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// +using System; +using System.IO; +using log4net; + +namespace TBF.BenchControl.Output.FileWriters.ImageArchiver +{ + /// + /// Implements an operation 'WriteResultsOp(batch)' that copies files from folder + /// Path.Combine(Program.ImagesDir, batch.BatchNr.ToString(), wm.WMPosition.ToString()) + /// for each water meter in the batch to a destination folder specified by the component properties. + /// + public class Archiver : ComponentBase, IOperation, GenericDevices.IResultsWriter + { + private static readonly ILog log = LogManager.GetLogger(typeof(Archiver)); + public override string ToString() { return string.Format("Output.FileWriters.Basic({0})", Cfg.ToString(1)); } + + + readonly ArchiverCfg writerCfg; + + #region Configuration Change Handling + + public static void OnCfgChange(object sender, CfgChangeArgs args) + { + if (CfgChangeHandler == null) return; + try { CfgChangeHandler(sender, args); } + catch (Exception e) { log.Error("CfgChangeHandler(...) failed", e); } + } + + public static event EventHandler CfgChangeHandler; + + public override void StartChangeHandler() + { + CfgChangeHandler += delegate(object sender, CfgChangeArgs args) + { + ArchiverCfg tmpcfg = args.Cfg as ArchiverCfg; + if (tmpcfg != null && tmpcfg.Name.Equals(Name)) + { + if (args.Command == CfgChangeCmd.CfgChange) + { + writerCfg.DestinationPath = tmpcfg.DestinationPath; + writerCfg.DestinationPath2 = tmpcfg.DestinationPath2; + writerCfg.YearFolders = tmpcfg.YearFolders; + writerCfg.MonthFolders = tmpcfg.MonthFolders; + writerCfg.DayFolders = tmpcfg.DayFolders; + writerCfg.ArchiveFormat = tmpcfg.ArchiveFormat; + writerCfg.SaveGoodOnly = tmpcfg.SaveGoodOnly; + } + } + }; + } + + #endregion Configuration Change Handling + + + Results.Entities.Batch batch; + + bool abort; /// Set to 'true' by Stop() operation to abort writing to the file + + + public Archiver() {} + + public Archiver(Generic.IComponentCfg cfg) + : base(cfg) + { + writerCfg = cfg as ArchiverCfg; + StartChangeHandler(); + log.Debug(ToString()); + } + + + /// + /// Returns a file name derived from a DateTime structure. + /// Creates directories on this path as a side effect. + /// + /// Date and time + /// File name + string GetArchivePath(string destinationPath, DateTime startTime, DateTime endTime, int wmPosition, string wmSN) + { + string directory = destinationPath; /// Ends with "\\"; + + switch (writerCfg.YearFolders) + { + case YearFolders.FourDigit: + directory = string.Format("{0}{1}\\", directory, endTime.Year.ToString("D4")); + break; + case YearFolders.TwoDigit: + directory = string.Format("{0}{1}\\", directory, (endTime.Year % 100).ToString("D2")); + break; + } + + switch (writerCfg.MonthFolders) + { + case MonthFolders.Name: + { + string monthStr; + switch (endTime.Month) + { + default: + case 1: monthStr = "January"; break; + case 2: monthStr = "February"; break; + case 3: monthStr = "March"; break; + case 4: monthStr = "April"; break; + case 5: monthStr = "May"; break; + case 6: monthStr = "June"; break; + case 7: monthStr = "July"; break; + case 8: monthStr = "August"; break; + case 9: monthStr = "September"; break; + case 10: monthStr = "October"; break; + case 11: monthStr = "November"; break; + case 12: monthStr = "December"; break; + } + directory = string.Format("{0}{1}\\", directory, monthStr); + break; + } + case MonthFolders.Digit: + directory = string.Format("{0}{1}\\", directory, endTime.Month.ToString()); + break; + case MonthFolders.TwoDigit: + directory = string.Format("{0}{1}\\", directory, endTime.Month.ToString("D2")); + break; + } + + switch (writerCfg.DayFolders) + { + case DayFolders.Digit: + directory = string.Format("{0}{1}\\", directory, endTime.Day.ToString()); + break; + case DayFolders.TwoDigit: + directory = string.Format("{0}{1}\\", directory, endTime.Day.ToString("D2")); + break; + } + + Directory.CreateDirectory(directory); + + try + { + if (string.IsNullOrEmpty(writerCfg.ArchiveFormat)) throw new Exception(); + return directory + string.Format(writerCfg.ArchiveFormat, startTime, endTime, batch.BatchNr, wmPosition, wmSN); + } + catch + { + return string.Format("{0}{1:yyMMdd-HHmm}-{2}", directory, endTime, wmPosition); + } + } + + /// + /// Writes the test cycle results into a file + /// Events: + /// Event.ResultsWritten + /// Event.Busy + /// + /// Results to write into a file + /// Reference to the operation + public IOperation WriteResultsOp(Results.Entities.Batch batch) + { + this.batch = batch; + return this; + } + + /// Start this operation + public void Start() + { + MoveFilesToArchive(batch, writerCfg.DestinationPath); + MoveFilesToArchive(batch, writerCfg.DestinationPath2); + } + + /// Run this operation + /// Event.ResultsWritten + public Event Run() + { + return Event.ResultsWritten; + } + + /// Stop this operation + public void Stop() + { + } + + + void MoveFilesToArchive(Results.Entities.Batch batch, string destination) + { + if (batch == null || batch.WaterMeters == null || batch.WaterMeters.Count <= 0 + || string.IsNullOrEmpty(destination)) + { + return; + } + + foreach (var wm in batch.WaterMeters) + { + if (wm != null && (!writerCfg.SaveGoodOnly || wm.Passed)) + { + string srcFolder = Path.Combine(Program.ImagesDir, batch.BatchNr.ToString(), wm.WMPosition.ToString()); + + try + { + /// TODO: Copy files when files are on different disks. + wm.ArchivePath = GetArchivePath(destination, batch.StartTime, batch.EndTime, wm.WMPosition, wm.SerialNr); + Directory.Move(srcFolder, wm.ArchivePath); + } + catch + { + log.ErrorFormat("Failed to move archive files from {0}", srcFolder); + } + } + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfg.cs new file mode 100644 index 00000000..c739df05 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfg.cs @@ -0,0 +1,64 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.FileWriters.ImageArchiver +{ + public class ArchiverCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ArchiverCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new ArchiverCfgCtrl(); } + + public string DestinationPath; /// Directory path into which the results will be saved + public string DestinationPath2; /// Directory path into which the 2nd copy of results will be saved + public YearFolders YearFolders; + public MonthFolders MonthFolders; + public DayFolders DayFolders; + public string ArchiveFormat; + public bool SaveGoodOnly; + + [XmlIgnore] + public Config.Entities.MetersKind MetersKind; + + /// Private parameterless constructor invoked by all other (public) constructors + ArchiverCfg() + { + } + + public ArchiverCfg(string name, IComponentFactory factory, Config.Entities.MetersKind metersKind) + : this() + { + Name = name; + Factory = factory; + MetersKind = metersKind; + + ParentName = string.Empty; + DestinationPath = Program.HomeDir + "Results\\"; + DestinationPath2 = string.Empty; + YearFolders = YearFolders.FourDigit; + MonthFolders = MonthFolders.Digit; + DayFolders = DayFolders.Digit; + ArchiveFormat = "{1:yyyyMMdd-HHmm}-{3}"; + SaveGoodOnly = false; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Path={1}, Y={2}, M={3}, D={4}, ArchiveFmt={5}, GoodOnly={6}", + Name, + DestinationPath, + YearFolders, + MonthFolders, + DayFolders, + ArchiveFormat, + SaveGoodOnly); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfgCtrl.cs new file mode 100644 index 00000000..f5f4d6b9 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfgCtrl.cs @@ -0,0 +1,182 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.FileWriters.ImageArchiver +{ + public partial class ArchiverCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + public bool Compound; + + ArchiverCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as ArchiverCfg; + Redraw(); + } + } + + string[] selectedItems; + + public ArchiverCfgCtrl() + { + InitializeComponent(); + } + + private void WriterCfgCtrl_Load(object sender, EventArgs e) + { + for (YearFolders s = 0; s < YearFolders.Count; s++) yearFoldersComboBox.Items.Add(s.ToString()); + for (MonthFolders s = 0; s < MonthFolders.Count; s++) monthFoldersComboBox.Items.Add(s.ToString()); + for (DayFolders s = 0; s < DayFolders.Count; s++) dayFoldersComboBox.Items.Add(s.ToString()); + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + destinationTextBox.Text = config.DestinationPath; + destination2TextBox.Text = config.DestinationPath2; + yearFoldersComboBox.Text = config.YearFolders.ToString(); + monthFoldersComboBox.Text = config.MonthFolders.ToString(); + dayFoldersComboBox.Text = config.DayFolders.ToString(); + archiveFmtTextBox.Text = config.ArchiveFormat; + goodOnlyCheckBox.Checked = config.SaveGoodOnly; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + destinationTextBox.Enabled = true; + destinationButton.Enabled = true; + destination2TextBox.Enabled = true; + destination2Button.Enabled = true; + yearFoldersComboBox.Enabled = true; + monthFoldersComboBox.Enabled = true; + dayFoldersComboBox.Enabled = true; + archiveFmtTextBox.Enabled = true; + goodOnlyCheckBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (!yearFoldersComboBox.Items.Contains(yearFoldersComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid year folders selection"; + } + + if (!monthFoldersComboBox.Items.Contains(monthFoldersComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid month folders selection"; + } + + if (!dayFoldersComboBox.Items.Contains(dayFoldersComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid day folder selection"; + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + if (config.Name != nameTextBox.Text) + { + config.Name = nameTextBox.Text; + flags |= (CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + } + + if (config.DestinationPath != destinationTextBox.Text) + { + config.DestinationPath = destinationTextBox.Text; + if (!config.DestinationPath.EndsWith("\\")) config.DestinationPath += "\\"; + flags |= (CfgUpdateFlags.AnyChange | CfgUpdateFlags.InvokeCfgChange); + } + + if (config.DestinationPath2 != destination2TextBox.Text) + { + config.DestinationPath2 = destination2TextBox.Text; + if (!config.DestinationPath2.EndsWith("\\")) config.DestinationPath2 += "\\"; + flags |= (CfgUpdateFlags.AnyChange | CfgUpdateFlags.InvokeCfgChange); + } + + for (YearFolders i = 0; i < YearFolders.Count; i++) + { + if (i.ToString().Equals(yearFoldersComboBox.Text) && (config.YearFolders != i)) + { + config.YearFolders = i; + flags |= (CfgUpdateFlags.AnyChange | CfgUpdateFlags.InvokeCfgChange); + break; + } + } + + for (MonthFolders i = 0; i < MonthFolders.Count; i++) + { + if (i.ToString().Equals(monthFoldersComboBox.Text) && (config.MonthFolders != i)) + { + config.MonthFolders = i; + flags |= (CfgUpdateFlags.AnyChange | CfgUpdateFlags.InvokeCfgChange); + break; + } + } + + for (DayFolders i = 0; i < DayFolders.Count; i++) + { + if (i.ToString().Equals(dayFoldersComboBox.Text) && (config.DayFolders != i)) + { + config.DayFolders = i; + flags |= (CfgUpdateFlags.AnyChange | CfgUpdateFlags.InvokeCfgChange); + break; + } + } + + if (config.ArchiveFormat != archiveFmtTextBox.Text) + { + config.ArchiveFormat = archiveFmtTextBox.Text; + flags |= (CfgUpdateFlags.AnyChange | CfgUpdateFlags.InvokeCfgChange); + } + + if (config.SaveGoodOnly != goodOnlyCheckBox.Checked) + { + config.SaveGoodOnly = goodOnlyCheckBox.Checked; + flags |= (CfgUpdateFlags.AnyChange | CfgUpdateFlags.InvokeCfgChange); + } + + if ((flags & CfgUpdateFlags.InvokeCfgChange) != 0) + { + Archiver.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.CfgChange, config)); + } + + return flags; + } + + private void destinationButton_Click(object sender, EventArgs e) + { + + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfgCtrl.designer.cs new file mode 100644 index 00000000..9c300976 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfgCtrl.designer.cs @@ -0,0 +1,327 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.Output.FileWriters.ImageArchiver +{ + partial class ArchiverCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.destinationTextBox = new System.Windows.Forms.TextBox(); + this.destinationLabel = new System.Windows.Forms.Label(); + this.destinationButton = new System.Windows.Forms.Button(); + this.yearFoldersLabel = new System.Windows.Forms.Label(); + this.monthFoldersLabel = new System.Windows.Forms.Label(); + this.dayFoldersLabel = new System.Windows.Forms.Label(); + this.yearFoldersComboBox = new System.Windows.Forms.ComboBox(); + this.monthFoldersComboBox = new System.Windows.Forms.ComboBox(); + this.dayFoldersComboBox = new System.Windows.Forms.ComboBox(); + this.destination2Button = new System.Windows.Forms.Button(); + this.destination2TextBox = new System.Windows.Forms.TextBox(); + this.destination2Label = new System.Windows.Forms.Label(); + this.archiveFmtTextBox = new System.Windows.Forms.TextBox(); + this.archiveFmtLabel = new System.Windows.Forms.Label(); + this.goodOnlyCheckBox = new System.Windows.Forms.CheckBox(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(108, 31); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(146, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(17, 34); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(105, 9); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // destinationTextBox + // + this.destinationTextBox.Enabled = false; + this.destinationTextBox.Location = new System.Drawing.Point(108, 54); + this.destinationTextBox.Name = "destinationTextBox"; + this.destinationTextBox.Size = new System.Drawing.Size(221, 20); + this.destinationTextBox.TabIndex = 4; + // + // destinationLabel + // + this.destinationLabel.AutoSize = true; + this.destinationLabel.Location = new System.Drawing.Point(17, 57); + this.destinationLabel.Name = "destinationLabel"; + this.destinationLabel.Size = new System.Drawing.Size(60, 13); + this.destinationLabel.TabIndex = 3; + this.destinationLabel.Text = "Destination"; + // + // destinationButton + // + this.destinationButton.Enabled = false; + this.destinationButton.Location = new System.Drawing.Point(335, 53); + this.destinationButton.Name = "destinationButton"; + this.destinationButton.Size = new System.Drawing.Size(30, 20); + this.destinationButton.TabIndex = 16; + this.destinationButton.Text = "..."; + this.destinationButton.UseVisualStyleBackColor = true; + this.destinationButton.Click += new System.EventHandler(this.destinationButton_Click); + // + // yearFoldersLabel + // + this.yearFoldersLabel.AutoSize = true; + this.yearFoldersLabel.Location = new System.Drawing.Point(17, 103); + this.yearFoldersLabel.Name = "yearFoldersLabel"; + this.yearFoldersLabel.Size = new System.Drawing.Size(63, 13); + this.yearFoldersLabel.TabIndex = 7; + this.yearFoldersLabel.Text = "Year folders"; + // + // monthFoldersLabel + // + this.monthFoldersLabel.AutoSize = true; + this.monthFoldersLabel.Location = new System.Drawing.Point(17, 127); + this.monthFoldersLabel.Name = "monthFoldersLabel"; + this.monthFoldersLabel.Size = new System.Drawing.Size(71, 13); + this.monthFoldersLabel.TabIndex = 9; + this.monthFoldersLabel.Text = "Month folders"; + // + // dayFoldersLabel + // + this.dayFoldersLabel.AutoSize = true; + this.dayFoldersLabel.Location = new System.Drawing.Point(17, 151); + this.dayFoldersLabel.Name = "dayFoldersLabel"; + this.dayFoldersLabel.Size = new System.Drawing.Size(60, 13); + this.dayFoldersLabel.TabIndex = 11; + this.dayFoldersLabel.Text = "Day folders"; + // + // yearFoldersComboBox + // + this.yearFoldersComboBox.Enabled = false; + this.yearFoldersComboBox.FormattingEnabled = true; + this.yearFoldersComboBox.Location = new System.Drawing.Point(108, 100); + this.yearFoldersComboBox.Name = "yearFoldersComboBox"; + this.yearFoldersComboBox.Size = new System.Drawing.Size(146, 21); + this.yearFoldersComboBox.TabIndex = 8; + // + // monthFoldersComboBox + // + this.monthFoldersComboBox.Enabled = false; + this.monthFoldersComboBox.FormattingEnabled = true; + this.monthFoldersComboBox.Location = new System.Drawing.Point(108, 124); + this.monthFoldersComboBox.Name = "monthFoldersComboBox"; + this.monthFoldersComboBox.Size = new System.Drawing.Size(146, 21); + this.monthFoldersComboBox.TabIndex = 10; + // + // dayFoldersComboBox + // + this.dayFoldersComboBox.Enabled = false; + this.dayFoldersComboBox.FormattingEnabled = true; + this.dayFoldersComboBox.Location = new System.Drawing.Point(108, 148); + this.dayFoldersComboBox.Name = "dayFoldersComboBox"; + this.dayFoldersComboBox.Size = new System.Drawing.Size(146, 21); + this.dayFoldersComboBox.TabIndex = 12; + // + // destination2Button + // + this.destination2Button.Enabled = false; + this.destination2Button.Location = new System.Drawing.Point(335, 78); + this.destination2Button.Name = "destination2Button"; + this.destination2Button.Size = new System.Drawing.Size(30, 20); + this.destination2Button.TabIndex = 17; + this.destination2Button.Text = "..."; + this.destination2Button.UseVisualStyleBackColor = true; + // + // destination2TextBox + // + this.destination2TextBox.Enabled = false; + this.destination2TextBox.Location = new System.Drawing.Point(108, 77); + this.destination2TextBox.Name = "destination2TextBox"; + this.destination2TextBox.Size = new System.Drawing.Size(221, 20); + this.destination2TextBox.TabIndex = 6; + // + // destination2Label + // + this.destination2Label.AutoSize = true; + this.destination2Label.Location = new System.Drawing.Point(17, 80); + this.destination2Label.Name = "destination2Label"; + this.destination2Label.Size = new System.Drawing.Size(69, 13); + this.destination2Label.TabIndex = 5; + this.destination2Label.Text = "Destination 2"; + // + // archiveFmtTextBox + // + this.archiveFmtTextBox.Enabled = false; + this.archiveFmtTextBox.Location = new System.Drawing.Point(108, 172); + this.archiveFmtTextBox.Name = "archiveFmtTextBox"; + this.archiveFmtTextBox.Size = new System.Drawing.Size(223, 20); + this.archiveFmtTextBox.TabIndex = 14; + // + // archiveFmtLabel + // + this.archiveFmtLabel.AutoSize = true; + this.archiveFmtLabel.Location = new System.Drawing.Point(17, 175); + this.archiveFmtLabel.Name = "archiveFmtLabel"; + this.archiveFmtLabel.Size = new System.Drawing.Size(75, 13); + this.archiveFmtLabel.TabIndex = 13; + this.archiveFmtLabel.Text = "Archive format"; + // + // goodOnlyCheckBox + // + this.goodOnlyCheckBox.AutoSize = true; + this.goodOnlyCheckBox.Location = new System.Drawing.Point(108, 200); + this.goodOnlyCheckBox.Name = "goodOnlyCheckBox"; + this.goodOnlyCheckBox.Size = new System.Drawing.Size(74, 17); + this.goodOnlyCheckBox.TabIndex = 15; + this.goodOnlyCheckBox.Text = "Good only"; + this.goodOnlyCheckBox.UseVisualStyleBackColor = true; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(337, 175); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(101, 13); + this.label1.TabIndex = 18; + this.label1.Text = "{0} = start date/time"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(337, 190); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(99, 13); + this.label2.TabIndex = 19; + this.label2.Text = "{1} = end date/time"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(337, 219); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(92, 13); + this.label4.TabIndex = 20; + this.label4.Text = "{3} = WM position"; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(337, 233); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(72, 13); + this.label5.TabIndex = 21; + this.label5.Text = "{4} = WM s/n"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(337, 204); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(76, 13); + this.label3.TabIndex = 22; + this.label3.Text = "{2} = Batch nr."; + // + // ArchiverCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.label3); + this.Controls.Add(this.label5); + this.Controls.Add(this.label4); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.goodOnlyCheckBox); + this.Controls.Add(this.archiveFmtTextBox); + this.Controls.Add(this.archiveFmtLabel); + this.Controls.Add(this.destination2Button); + this.Controls.Add(this.destination2TextBox); + this.Controls.Add(this.destination2Label); + this.Controls.Add(this.dayFoldersComboBox); + this.Controls.Add(this.monthFoldersComboBox); + this.Controls.Add(this.yearFoldersComboBox); + this.Controls.Add(this.dayFoldersLabel); + this.Controls.Add(this.monthFoldersLabel); + this.Controls.Add(this.yearFoldersLabel); + this.Controls.Add(this.destinationButton); + this.Controls.Add(this.destinationTextBox); + this.Controls.Add(this.destinationLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "ArchiverCfgCtrl"; + this.Size = new System.Drawing.Size(455, 350); + this.Load += new System.EventHandler(this.WriterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.TextBox destinationTextBox; + private System.Windows.Forms.Label destinationLabel; + private System.Windows.Forms.Button destinationButton; + private System.Windows.Forms.Label yearFoldersLabel; + private System.Windows.Forms.Label monthFoldersLabel; + private System.Windows.Forms.Label dayFoldersLabel; + private System.Windows.Forms.ComboBox yearFoldersComboBox; + private System.Windows.Forms.ComboBox monthFoldersComboBox; + private System.Windows.Forms.ComboBox dayFoldersComboBox; + private System.Windows.Forms.Button destination2Button; + private System.Windows.Forms.TextBox destination2TextBox; + private System.Windows.Forms.Label destination2Label; + private System.Windows.Forms.TextBox archiveFmtTextBox; + private System.Windows.Forms.Label archiveFmtLabel; + private System.Windows.Forms.CheckBox goodOnlyCheckBox; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Label label3; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/ImageArchiver/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/ImageArchiver/Factory.cs new file mode 100644 index 00000000..140c9a61 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/ImageArchiver/Factory.cs @@ -0,0 +1,29 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.FileWriters.ImageArchiver +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Archiver.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Archiver(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Archiver(cfg); } + + public IComponentCfg DefaultConfig() { return new ArchiverCfg("FileWriter.ImageArchiver", this, Config.Entities.MetersKind.Single); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + IComponentCfg cfg = ComponentCfgBase.CreateFromDbEntity(ArchiverCfg.Serializer, component, this); + (cfg as ArchiverCfg).MetersKind = Config.Entities.MetersKind.Single; + return cfg; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/OneFilePerMeter/FactoryCompound.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/OneFilePerMeter/FactoryCompound.cs new file mode 100644 index 00000000..82cddb63 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/OneFilePerMeter/FactoryCompound.cs @@ -0,0 +1,29 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.FileWriters.OneFilePerMeter +{ + public class FactoryCompound : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".Compound"; } } + + public void ResetStaticProperties() { Writer.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Writer(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Writer(cfg); } + + public IComponentCfg DefaultConfig() { return new WriterCfg("FileWriter.OneFilePerMeter.Compound", this, Config.Entities.MetersKind.Combined); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + IComponentCfg cfg = ComponentCfgBase.CreateFromDbEntity(WriterCfg.Serializer, component, this); + (cfg as WriterCfg).MetersKind = Config.Entities.MetersKind.Combined; + return cfg; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/OneFilePerMeter/FactoryHeatMeters.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/OneFilePerMeter/FactoryHeatMeters.cs new file mode 100644 index 00000000..cb34e76a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/OneFilePerMeter/FactoryHeatMeters.cs @@ -0,0 +1,29 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.FileWriters.OneFilePerMeter +{ + public class FactoryHeatMeters : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".HeatMeters"; } } + + public void ResetStaticProperties() { Writer.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Writer(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Writer(cfg); } + + public IComponentCfg DefaultConfig() { return new WriterCfg("FileWriter.OneFilePerMeter.HeatMeters", this, Config.Entities.MetersKind.HeatMeter); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + IComponentCfg cfg = ComponentCfgBase.CreateFromDbEntity(WriterCfg.Serializer, component, this); + (cfg as WriterCfg).MetersKind = Config.Entities.MetersKind.HeatMeter; + return cfg; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/OneFilePerMeter/FactorySingle.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/OneFilePerMeter/FactorySingle.cs new file mode 100644 index 00000000..44555504 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/OneFilePerMeter/FactorySingle.cs @@ -0,0 +1,29 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.FileWriters.OneFilePerMeter +{ + public class FactorySingle : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".Single"; } } + + public void ResetStaticProperties() { Writer.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Writer(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Writer(cfg); } + + public IComponentCfg DefaultConfig() { return new WriterCfg("FileWriter.OneFilePerMeter.Single", this, Config.Entities.MetersKind.Single); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + IComponentCfg cfg = ComponentCfgBase.CreateFromDbEntity(WriterCfg.Serializer, component, this); + (cfg as WriterCfg).MetersKind = Config.Entities.MetersKind.Single; + return cfg; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/OneFilePerMeter/Writer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/OneFilePerMeter/Writer.cs new file mode 100644 index 00000000..9de42600 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/OneFilePerMeter/Writer.cs @@ -0,0 +1,440 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Threading; +using log4net; +using TBF.Resources; + +namespace TBF.BenchControl.Output.FileWriters.OneFilePerMeter +{ + public class Writer : ComponentBase, IOperation, GenericDevices.IResultsWriter + { + private static readonly ILog log = LogManager.GetLogger(typeof(Writer)); + public override string ToString() { return string.Format("Output.FileWriters.Enhanced({0})", Cfg.ToString(1)); } + + readonly WriterCfg writerCfg; + + string separatorStr; + + /// + /// Items to print + /// + string header; + IList commonItems; + IList testItems; + string footer; + + Results.Entities.Batch batch; + + bool abort; /// Set to 'true' by Stop() operation to abort writing to files + + + public Writer() {} + + public Writer(Generic.IComponentCfg cfg) + : base(cfg) + { + writerCfg = cfg as WriterCfg; + ApplyConfig(); + log.Debug(this.ToString()); + } + + + void ApplyConfig() + { + switch (writerCfg.Separator) + { + default: + case Separator.None: separatorStr = string.Empty; break; + case Separator.Space: separatorStr = " "; break; + case Separator.Tabulator: separatorStr = "\t"; break; + case Separator.Comma: separatorStr = ","; break; + case Separator.Semicolon: separatorStr = ";"; break; + } + + header = string.IsNullOrEmpty(writerCfg.Header) ? string.Empty : writerCfg.Header.Replace("~", Environment.NewLine); + commonItems = Results.WMeterRsltItemSpec.FromStrArray(writerCfg.CommonItems); + testItems = Results.WMeterRsltItemSpec.FromStrArray(writerCfg.SelectedItems); /// TestID info will be overwritten later on + footer = string.IsNullOrEmpty(writerCfg.Footer) ? string.Empty : writerCfg.Footer.Replace("~", Environment.NewLine); + } + + + #region Configuration Change Handling + + public static void OnCfgChange(object sender, CfgChangeArgs args) + { + if (CfgChangeHandler == null) return; + try { CfgChangeHandler(sender, args); } + catch (Exception e) { log.Error("CfgChangeHandler(...) failed", e); } + } + + public static event EventHandler CfgChangeHandler; + + public override void StartChangeHandler() + { + CfgChangeHandler += delegate(object sender, CfgChangeArgs args) + { + WriterCfg newCfg = args.Cfg as WriterCfg; + if (newCfg != null && newCfg.Name.Equals(Name)) + { + if (args.Command == CfgChangeCmd.CfgChange) + { + writerCfg.DestinationPath = newCfg.DestinationPath; + writerCfg.DestinationPath2 = newCfg.DestinationPath2; + writerCfg.YearFolders = newCfg.YearFolders; + writerCfg.MonthFolders = newCfg.MonthFolders; + writerCfg.DayFolders = newCfg.DayFolders; + writerCfg.FileNameFormat = newCfg.FileNameFormat; + writerCfg.Culture = newCfg.Culture; + writerCfg.Separator = newCfg.Separator; + writerCfg.EliminateSpaces = newCfg.EliminateSpaces; + writerCfg.CommonItems = newCfg.CommonItems; + writerCfg.SelectedItems = newCfg.SelectedItems; + writerCfg.Header = newCfg.Header; + writerCfg.Footer = newCfg.Footer; + + ApplyConfig(); + } + } + }; + } + + #endregion Configuration Change Handling + + + /// + /// Eliminate spaces conditionally, depesing on bool WriterCfg.EliminateSpaces + /// + /// Input string + /// Output string + string ElSpaces(string item) + { + if (writerCfg.EliminateSpaces) + return item.Replace(" ", string.Empty); + else + return item; + } + + + /// + /// Returns a file name derived from a DateTime structure. + /// Creates directories on this path as a side effect. + /// + /// Date and time + /// File name + string GetFilename(string destinationPath, DateTime time) + { + string directory = destinationPath; /// Ends with "\\"; + + switch (writerCfg.YearFolders) + { + case YearFolders.FourDigit: + directory = string.Format("{0}{1:yyyy}\\", directory, time); + break; + case YearFolders.TwoDigit: + directory = string.Format("{0}{1:yy}\\", directory, time); + break; + } + + switch (writerCfg.MonthFolders) + { + case MonthFolders.Name: + { + string monthStr; + switch (time.Month) + { + default: + case 1: monthStr = "January"; break; + case 2: monthStr = "February"; break; + case 3: monthStr = "March"; break; + case 4: monthStr = "April"; break; + case 5: monthStr = "May"; break; + case 6: monthStr = "June"; break; + case 7: monthStr = "July"; break; + case 8: monthStr = "August"; break; + case 9: monthStr = "September"; break; + case 10: monthStr = "October"; break; + case 11: monthStr = "November"; break; + case 12: monthStr = "December"; break; + } + directory = string.Format("{0}{1}\\", directory, monthStr); + break; + } + case MonthFolders.Digit: + directory = string.Format("{0}{1}\\", directory, time.Month.ToString()); + break; + case MonthFolders.TwoDigit: + directory = string.Format("{0}{1:MM}\\", directory, time); + break; + } + + switch (writerCfg.DayFolders) + { + case DayFolders.Digit: + directory = string.Format("{0}{1}\\", directory, time.Day.ToString()); + break; + case DayFolders.TwoDigit: + directory = string.Format("{0}{1:dd}\\", directory, time); + break; + } + + Directory.CreateDirectory(directory); + + try + { + if (string.IsNullOrEmpty(writerCfg.FileNameFormat)) throw new Exception(); + return directory + string.Format(writerCfg.FileNameFormat, time); + } + catch + { + return string.Format("{0}{1:yyMMdd-HHmm}.txt", directory, time); + } + } + + + /// + /// Writes the test cycle results into a file + /// Events: + /// Event.ResultsWritten + /// Event.Busy + /// + /// Results to write into a file + /// Reference to the operation + public IOperation WriteResultsOp(Results.Entities.Batch batch) + { + this.batch = batch; + return this; + } + + /// Start this operation + public void Start() + { + CultureInfo oriCulture = Thread.CurrentThread.CurrentCulture; + + if (writerCfg.Culture != Culture.system) + { + Thread.CurrentThread.CurrentCulture = new CultureInfo(writerCfg.Culture.ToString()); + } + + WriteRslts(batch, writerCfg.DestinationPath); + WriteRslts(batch, writerCfg.DestinationPath2); + + Thread.CurrentThread.CurrentCulture = oriCulture; + } + + /// Run this operation + /// Event.ResultsWritten + public Event Run() + { + return Event.ResultsWritten; + } + + /// Stop this operation + public void Stop() + { + } + + + void WriteRslts(Results.Entities.Batch batch, string destination) + { + StreamWriter writer = StreamWriter.Null; + if (!string.IsNullOrEmpty(destination)) + { + try + { + writer = File.AppendText(GetFilename(destination, batch.EndTime)); + } + catch + { + } + } + + WriteRsltsEx(batch, writer); + writer.Close(); + } + + + void WriteRsltsEx(Results.Entities.Batch batch, StreamWriter wrtr) + { + ///---------- + /// Header + ///---------- + if (!string.IsNullOrEmpty(writerCfg.Header)) wrtr.Write(header); + wrtr.WriteLine(); + + ///---------------- + /// Common items + ///---------------- + string[] leftColumn = new string[commonItems.Count]; + string[] rightColumn = new string[commonItems.Count]; + + int cnt = 0; + foreach (var v in commonItems) + { + leftColumn[cnt] = v.Caption; + rightColumn[cnt] = (batch.WaterMeters.Count > 0) ? v.Print(batch.WaterMeters[0]) : string.Empty; + cnt++; + } + + /// Determine max. left column width in characters + int maxLen = 0; + foreach (var s in leftColumn) if (s.Length > maxLen) maxLen = s.Length; + + /// Write aligned columns + for (int i = 0; i < Math.Min(leftColumn.Length, rightColumn.Length); i++) + { + if (abort) return; + + wrtr.Write(leftColumn[i]); + wrtr.Write(new string(' ', maxLen - leftColumn[i].Length + 3)); + wrtr.WriteLine(rightColumn[i]); + } + + ///-------- + /// Body + ///-------- + foreach (var wm in batch.WaterMeters) + { + WriteWM(wrtr, wm); + if (abort) return; + } + + ///---------- + /// Footer + ///---------- + if (!string.IsNullOrEmpty(writerCfg.Footer)) wrtr.Write(footer); + } + + /// + /// Write one water meter results + /// + /// Water meter number (0-based) + void WriteWM(StreamWriter wr, Results.Entities.WaterMeter wm) + { + wr.WriteLine(); + + /// Write water meter number and s/n +#if BADGER_MALA_TRAT || BADGER_STREDNA_TRAT || BADGER_VELKA_TRAT + wr.Write(string.Format("Water meter {0} s/n: {1}", wm.WMPosition, wm.SerialNr)); +#else + wr.Write(string.Format("{0} {1}", Strings.Water_Meter, wm.WMPosition)); + if (!wm.Compound()) + { + if (!string.IsNullOrEmpty(wm.SerialNr)) + { + wr.Write(string.Format(", {0} {1}", Strings.SerialNr, wm.SerialNr)); + } + } + else + { + if (!string.IsNullOrEmpty(wm.SerialNr)) + { + wr.Write(string.Format(", {0} {1}", Strings.Main_WM_SerialNr, wm.SerialNr)); + } + if (!string.IsNullOrEmpty(wm.SerialNrAux)) + { + wr.Write(string.Format(", {0} {1}", Strings.Aux_WM_SerialNr, wm.SerialNrAux)); + } + } +#endif + wr.WriteLine(); + + /// Determine column widths + int[] columnWidths = new int[testItems.Count]; + int totalWidth = 0; + for (int i = 0; i < testItems.Count; i++) + { + if (abort) return; + + columnWidths[i] = ElSpaces(testItems[i].Caption).Length; + foreach (var mtr in wm.MeterTestRslts) + { + if ((mtr != null) && (mtr.Publish() == Config.Entities.Publish.Always)) + { + string itemText = testItems[i].Print(wm, mtr.Name()); + + /// Strip color information + string[] texts = itemText.Split(new char[] { '|' }); + if (texts.Length == 2) { itemText = texts[0]; } + + int len = ElSpaces(itemText).Length; + if (len > columnWidths[i]) columnWidths[i] = len; + } + } + totalWidth += columnWidths[i]; + } + totalWidth += 3 * (testItems.Count - 1); + if (totalWidth < 0) totalWidth = 0; + + string horizontalLine = new String('-', totalWidth); + + wr.WriteLine(horizontalLine); /// Horizontal line above the header + + /// Write column headers + for (int i = 0; i < testItems.Count; i++) + { + if (abort) return; + + string caption = ElSpaces(testItems[i].Caption); + wr.Write(caption); + + if (i < testItems.Count - 1) + { + if (!writerCfg.EliminateSpaces) + { + wr.Write(new string(' ', columnWidths[i] - testItems[i].Caption.Length + 3)); + } + wr.Write(separatorStr); + } + else + { + wr.WriteLine(); + } + } + + wr.WriteLine(horizontalLine); /// Horizontal line between the header and the body + + /// Write table data + foreach (var mtr in wm.MeterTestRslts) + { + if (abort) return; + + if (mtr != null && mtr.IsPilotRslt() && mtr.Publish() == Config.Entities.Publish.Always) + { + for (int i = 0; i < testItems.Count; i++) + { + /// Fetch the item + string itemText = testItems[i].Print(wm, mtr.Name()); + + /// Strip color information + string[] texts = itemText.Split(new char[] { '|' }); + if (texts.Length == 2) { itemText = texts[0]; } + + /// Print the item + string itemText2 = ElSpaces(itemText); + wr.Write(itemText2); + + if (i < testItems.Count - 1) + { + if (!writerCfg.EliminateSpaces) + { + wr.Write(new string(' ', columnWidths[i] - itemText.Length + 3)); + } + wr.Write(separatorStr); + } + else + { + wr.WriteLine(); + } + } + } + } + + wr.WriteLine(horizontalLine); /// Horizontal line below the body + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfg.cs new file mode 100644 index 00000000..384af919 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfg.cs @@ -0,0 +1,71 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.FileWriters.OneFilePerMeter +{ + public class WriterCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(WriterCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new WriterCfgCtrl(); } + + public string DestinationPath; /// Directory path into which the results will be saved + public string DestinationPath2; /// Directory path into which the 2nd copy of results will be saved + public YearFolders YearFolders; + public MonthFolders MonthFolders; + public DayFolders DayFolders; + public string FileNameFormat; + public Culture Culture; + public Separator Separator; + public bool EliminateSpaces; + public string[] CommonItems; + public string[] SelectedItems; + public string Header; + public string Footer; + + [XmlIgnore] + public Config.Entities.MetersKind MetersKind; + + /// Private parameterless constructor invoked by all other (public) constructors + WriterCfg() + { + } + + public WriterCfg(string name, IComponentFactory factory, Config.Entities.MetersKind metersKind) + : this() + { + Name = name; + Factory = factory; + MetersKind = metersKind; + + ParentName = string.Empty; + DestinationPath = Program.HomeDir + "Results\\"; + DestinationPath2 = string.Empty; + YearFolders = YearFolders.FourDigit; + MonthFolders = MonthFolders.Digit; + DayFolders = DayFolders.Digit; + FileNameFormat = "{0:yyMMdd-HHmm}.txt"; + Separator = Separator.None; + EliminateSpaces = false; + Header = string.Empty; + Footer = string.Empty; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Path={1}, Y={2}, M={3}, D={4}, FNameFmt={5}, Separator={6}, EliminateSpaces={7}", + Name, + DestinationPath, + YearFolders, + MonthFolders, + DayFolders, + FileNameFormat, + Separator, + EliminateSpaces); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfgCtrl.cs new file mode 100644 index 00000000..5cd614a2 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfgCtrl.cs @@ -0,0 +1,338 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.Output.FileWriters.OneFilePerMeter +{ + public partial class WriterCfgCtrl : UserControl, IComponentCfgCtrl + { + static readonly ILog log = LogManager.GetLogger(typeof(WriterCfgCtrl)); + + public bool ShowMore { get { return false; } } + + WriterCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as WriterCfg; + Redraw(); + } + } + + string header; + string[] commonItems; + string[] testItems; + string footer; + + public WriterCfgCtrl() + { + InitializeComponent(); + Localize(); + } + + private void WriterCfgCtrl_Load(object sender, EventArgs e) + { + for (YearFolders s = 0; s < YearFolders.Count; s++) yearFoldersComboBox.Items.Add(s.ToString()); + for (MonthFolders s = 0; s < MonthFolders.Count; s++) monthFoldersComboBox.Items.Add(s.ToString()); + for (DayFolders s = 0; s < DayFolders.Count; s++) dayFoldersComboBox.Items.Add(s.ToString()); + for (Culture s = 0; s < Culture.Count; s++) cultureComboBox.Items.Add(s.ToString()); + for (Separator s = 0; s < Separator.Count; s++) separatorComboBox.Items.Add(s.ToString()); + + header = config.Header; + commonItems = config.CommonItems; + testItems = config.SelectedItems; + footer = config.Footer; + + Redraw(); + } + + void Localize() + { + nameLabel.Text = Strings.Name; + destinationLabel.Text = "Destination"; + destination2Label.Text = "Destination" + " 2"; + yearFoldersLabel.Text = "Year folders"; + monthFoldersLabel.Text = "Month folders"; + dayFoldersLabel.Text = "Day folders"; + fileNameFmtLabel.Text = "File name format"; + cultureLabel.Text = "Culture"; + separatorLabel.Text = "Separator"; + eliminateSpacesCheckBox.Text = "No spaces"; + headerButton.Text = Strings.Header; + commonItemsButton.Text = "Common items"; + testItemsButton.Text = "Test items"; + footerButton.Text = Strings.Footer; + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + destinationTextBox.Text = config.DestinationPath; + destination2TextBox.Text = config.DestinationPath2; + yearFoldersComboBox.Text = config.YearFolders.ToString(); + monthFoldersComboBox.Text = config.MonthFolders.ToString(); + dayFoldersComboBox.Text = config.DayFolders.ToString(); + fileNameFmtTextBox.Text = config.FileNameFormat; + cultureComboBox.Text = config.Culture.ToString(); + separatorComboBox.Text = config.Separator.ToString(); + eliminateSpacesCheckBox.Checked = config.EliminateSpaces; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + destinationTextBox.Enabled = true; + destinationButton.Enabled = true; + destination2TextBox.Enabled = true; + destination2Button.Enabled = true; + yearFoldersComboBox.Enabled = true; + monthFoldersComboBox.Enabled = true; + dayFoldersComboBox.Enabled = true; + fileNameFmtTextBox.Enabled = true; + cultureComboBox.Enabled = true; + separatorComboBox.Enabled = true; + eliminateSpacesCheckBox.Enabled = true; + headerButton.Enabled = true; + commonItemsButton.Enabled = true; + testItemsButton.Enabled = true; + footerButton.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (!yearFoldersComboBox.Items.Contains(yearFoldersComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid year folders selection"; + } + + if (!monthFoldersComboBox.Items.Contains(monthFoldersComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid month folders selection"; + } + + if (!dayFoldersComboBox.Items.Contains(dayFoldersComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid day folder selection"; + } + + if (!cultureComboBox.Items.Contains(cultureComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid culture"; + } + + if (!separatorComboBox.Items.Contains(separatorComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid separator"; + } + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + if (config.Name != nameTextBox.Text) + { + config.Name = nameTextBox.Text; + flags |= (CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + } + + if (config.DestinationPath != destinationTextBox.Text) + { + config.DestinationPath = destinationTextBox.Text; + if (!config.DestinationPath.EndsWith("\\")) config.DestinationPath += "\\"; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.DestinationPath2 != destination2TextBox.Text) + { + config.DestinationPath2 = destination2TextBox.Text; + if (!config.DestinationPath2.EndsWith("\\")) config.DestinationPath2 += "\\"; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + for (YearFolders i = 0; i < YearFolders.Count; i++) + { + if (i.ToString().Equals(yearFoldersComboBox.Text) && (config.YearFolders != i)) + { + config.YearFolders = i; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + break; + } + } + + for (MonthFolders i = 0; i < MonthFolders.Count; i++) + { + if (i.ToString().Equals(monthFoldersComboBox.Text) && (config.MonthFolders != i)) + { + config.MonthFolders = i; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + break; + } + } + + for (DayFolders i = 0; i < DayFolders.Count; i++) + { + if (i.ToString().Equals(dayFoldersComboBox.Text) && (config.DayFolders != i)) + { + config.DayFolders = i; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + break; + } + } + + if (config.FileNameFormat != fileNameFmtTextBox.Text) + { + config.FileNameFormat = fileNameFmtTextBox.Text; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + for (Culture i = 0; i < Culture.Count; i++) + { + if (i.ToString().Equals(cultureComboBox.Text) && (config.Culture != i)) + { + config.Culture = i; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + break; + } + } + + for (Separator i = 0; i < Separator.Count; i++) + { + if (i.ToString().Equals(separatorComboBox.Text) && (config.Separator != i)) + { + config.Separator = i; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + break; + } + } + + if (config.EliminateSpaces != eliminateSpacesCheckBox.Checked) + { + config.EliminateSpaces = eliminateSpacesCheckBox.Checked; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.CommonItems != commonItems) + { + config.CommonItems = commonItems; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.SelectedItems != testItems) + { + config.SelectedItems = testItems; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.Header != header) + { + config.Header = header; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.Footer != footer) + { + config.Footer = footer; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if ((flags & CfgUpdateFlags.InvokeCfgChange) != 0) + { + Writer.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.CfgChange, config)); + } + + return flags; + } + + private void destinationButton_Click(object sender, EventArgs e) + { + + } + + private void headerButton_Click(object sender, EventArgs e) + { + HeaderFooterDlg dlg = new HeaderFooterDlg(true, string.IsNullOrEmpty(header) ? string.Empty : header.Replace("~", Environment.NewLine)); + if (dlg.ShowDialog() == DialogResult.OK) + { + header = dlg.EditedText.Replace(Environment.NewLine, "~"); + } + } + + private void commonItemsButton_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg() + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(commonItems), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + commonItems = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems); + } + } + + private void testItemsButton_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg(true) + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(testItems), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + testItems = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems); + } + } + + private void footerButton_Click(object sender, EventArgs e) + { + HeaderFooterDlg dlg = new HeaderFooterDlg(false, string.IsNullOrEmpty(footer) ? string.Empty : footer.Replace("~", Environment.NewLine)); + if (dlg.ShowDialog() == DialogResult.OK) + { + footer = dlg.EditedText.Replace(Environment.NewLine, "~"); + } + } + + #region Configuration Change Handling + + public static void OnCmdResponse(object sender, CmdResponseArgs args) + { + if (CmdResponseHandler == null) return; + try { CmdResponseHandler(sender, args); } + catch (Exception e) { log.Error("CmdResponseHandler(...) failed", e); } + } + + public static event EventHandler CmdResponseHandler; + + public void StartResponseHandler() { } + public void StopResponseHandler() { } + + #endregion Configuration Change Handling + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfgCtrl.designer.cs new file mode 100644 index 00000000..fffe5291 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfgCtrl.designer.cs @@ -0,0 +1,371 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.Output.FileWriters.OneFilePerMeter +{ + partial class WriterCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.destinationTextBox = new System.Windows.Forms.TextBox(); + this.destinationLabel = new System.Windows.Forms.Label(); + this.destinationButton = new System.Windows.Forms.Button(); + this.separatorLabel = new System.Windows.Forms.Label(); + this.separatorComboBox = new System.Windows.Forms.ComboBox(); + this.testItemsButton = new System.Windows.Forms.Button(); + this.yearFoldersLabel = new System.Windows.Forms.Label(); + this.monthFoldersLabel = new System.Windows.Forms.Label(); + this.dayFoldersLabel = new System.Windows.Forms.Label(); + this.yearFoldersComboBox = new System.Windows.Forms.ComboBox(); + this.monthFoldersComboBox = new System.Windows.Forms.ComboBox(); + this.dayFoldersComboBox = new System.Windows.Forms.ComboBox(); + this.destination2Button = new System.Windows.Forms.Button(); + this.destination2TextBox = new System.Windows.Forms.TextBox(); + this.destination2Label = new System.Windows.Forms.Label(); + this.fileNameFmtTextBox = new System.Windows.Forms.TextBox(); + this.fileNameFmtLabel = new System.Windows.Forms.Label(); + this.eliminateSpacesCheckBox = new System.Windows.Forms.CheckBox(); + this.headerButton = new System.Windows.Forms.Button(); + this.footerButton = new System.Windows.Forms.Button(); + this.commonItemsButton = new System.Windows.Forms.Button(); + this.cultureComboBox = new System.Windows.Forms.ComboBox(); + this.cultureLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(108, 28); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(146, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(17, 31); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(105, 6); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // destinationTextBox + // + this.destinationTextBox.Enabled = false; + this.destinationTextBox.Location = new System.Drawing.Point(108, 49); + this.destinationTextBox.Name = "destinationTextBox"; + this.destinationTextBox.Size = new System.Drawing.Size(146, 20); + this.destinationTextBox.TabIndex = 4; + // + // destinationLabel + // + this.destinationLabel.AutoSize = true; + this.destinationLabel.Location = new System.Drawing.Point(17, 52); + this.destinationLabel.Name = "destinationLabel"; + this.destinationLabel.Size = new System.Drawing.Size(60, 13); + this.destinationLabel.TabIndex = 3; + this.destinationLabel.Text = "Destination"; + // + // destinationButton + // + this.destinationButton.Enabled = false; + this.destinationButton.Location = new System.Drawing.Point(269, 49); + this.destinationButton.Name = "destinationButton"; + this.destinationButton.Size = new System.Drawing.Size(30, 20); + this.destinationButton.TabIndex = 5; + this.destinationButton.Text = "..."; + this.destinationButton.UseVisualStyleBackColor = true; + this.destinationButton.Click += new System.EventHandler(this.destinationButton_Click); + // + // separatorLabel + // + this.separatorLabel.AutoSize = true; + this.separatorLabel.Location = new System.Drawing.Point(17, 203); + this.separatorLabel.Name = "separatorLabel"; + this.separatorLabel.Size = new System.Drawing.Size(53, 13); + this.separatorLabel.TabIndex = 19; + this.separatorLabel.Text = "Separator"; + // + // separatorComboBox + // + this.separatorComboBox.Enabled = false; + this.separatorComboBox.FormattingEnabled = true; + this.separatorComboBox.Location = new System.Drawing.Point(108, 200); + this.separatorComboBox.Name = "separatorComboBox"; + this.separatorComboBox.Size = new System.Drawing.Size(146, 21); + this.separatorComboBox.TabIndex = 20; + // + // testItemsButton + // + this.testItemsButton.Enabled = false; + this.testItemsButton.Location = new System.Drawing.Point(108, 297); + this.testItemsButton.Name = "testItemsButton"; + this.testItemsButton.Size = new System.Drawing.Size(146, 23); + this.testItemsButton.TabIndex = 24; + this.testItemsButton.Text = "Test items"; + this.testItemsButton.UseVisualStyleBackColor = true; + this.testItemsButton.Click += new System.EventHandler(this.testItemsButton_Click); + // + // yearFoldersLabel + // + this.yearFoldersLabel.AutoSize = true; + this.yearFoldersLabel.Location = new System.Drawing.Point(17, 94); + this.yearFoldersLabel.Name = "yearFoldersLabel"; + this.yearFoldersLabel.Size = new System.Drawing.Size(63, 13); + this.yearFoldersLabel.TabIndex = 9; + this.yearFoldersLabel.Text = "Year folders"; + // + // monthFoldersLabel + // + this.monthFoldersLabel.AutoSize = true; + this.monthFoldersLabel.Location = new System.Drawing.Point(17, 116); + this.monthFoldersLabel.Name = "monthFoldersLabel"; + this.monthFoldersLabel.Size = new System.Drawing.Size(71, 13); + this.monthFoldersLabel.TabIndex = 11; + this.monthFoldersLabel.Text = "Month folders"; + // + // dayFoldersLabel + // + this.dayFoldersLabel.AutoSize = true; + this.dayFoldersLabel.Location = new System.Drawing.Point(17, 138); + this.dayFoldersLabel.Name = "dayFoldersLabel"; + this.dayFoldersLabel.Size = new System.Drawing.Size(60, 13); + this.dayFoldersLabel.TabIndex = 13; + this.dayFoldersLabel.Text = "Day folders"; + // + // yearFoldersComboBox + // + this.yearFoldersComboBox.Enabled = false; + this.yearFoldersComboBox.FormattingEnabled = true; + this.yearFoldersComboBox.Location = new System.Drawing.Point(108, 91); + this.yearFoldersComboBox.Name = "yearFoldersComboBox"; + this.yearFoldersComboBox.Size = new System.Drawing.Size(146, 21); + this.yearFoldersComboBox.TabIndex = 10; + // + // monthFoldersComboBox + // + this.monthFoldersComboBox.Enabled = false; + this.monthFoldersComboBox.FormattingEnabled = true; + this.monthFoldersComboBox.Location = new System.Drawing.Point(108, 113); + this.monthFoldersComboBox.Name = "monthFoldersComboBox"; + this.monthFoldersComboBox.Size = new System.Drawing.Size(146, 21); + this.monthFoldersComboBox.TabIndex = 12; + // + // dayFoldersComboBox + // + this.dayFoldersComboBox.Enabled = false; + this.dayFoldersComboBox.FormattingEnabled = true; + this.dayFoldersComboBox.Location = new System.Drawing.Point(108, 135); + this.dayFoldersComboBox.Name = "dayFoldersComboBox"; + this.dayFoldersComboBox.Size = new System.Drawing.Size(146, 21); + this.dayFoldersComboBox.TabIndex = 14; + // + // destination2Button + // + this.destination2Button.Enabled = false; + this.destination2Button.Location = new System.Drawing.Point(269, 70); + this.destination2Button.Name = "destination2Button"; + this.destination2Button.Size = new System.Drawing.Size(30, 20); + this.destination2Button.TabIndex = 8; + this.destination2Button.Text = "..."; + this.destination2Button.UseVisualStyleBackColor = true; + // + // destination2TextBox + // + this.destination2TextBox.Enabled = false; + this.destination2TextBox.Location = new System.Drawing.Point(108, 70); + this.destination2TextBox.Name = "destination2TextBox"; + this.destination2TextBox.Size = new System.Drawing.Size(146, 20); + this.destination2TextBox.TabIndex = 7; + // + // destination2Label + // + this.destination2Label.AutoSize = true; + this.destination2Label.Location = new System.Drawing.Point(17, 73); + this.destination2Label.Name = "destination2Label"; + this.destination2Label.Size = new System.Drawing.Size(69, 13); + this.destination2Label.TabIndex = 6; + this.destination2Label.Text = "Destination 2"; + // + // fileNameFmtTextBox + // + this.fileNameFmtTextBox.Enabled = false; + this.fileNameFmtTextBox.Location = new System.Drawing.Point(108, 157); + this.fileNameFmtTextBox.Name = "fileNameFmtTextBox"; + this.fileNameFmtTextBox.Size = new System.Drawing.Size(146, 20); + this.fileNameFmtTextBox.TabIndex = 16; + // + // fileNameFmtLabel + // + this.fileNameFmtLabel.AutoSize = true; + this.fileNameFmtLabel.Location = new System.Drawing.Point(17, 160); + this.fileNameFmtLabel.Name = "fileNameFmtLabel"; + this.fileNameFmtLabel.Size = new System.Drawing.Size(84, 13); + this.fileNameFmtLabel.TabIndex = 15; + this.fileNameFmtLabel.Text = "File name format"; + // + // eliminateSpacesCheckBox + // + this.eliminateSpacesCheckBox.AutoSize = true; + this.eliminateSpacesCheckBox.Location = new System.Drawing.Point(108, 227); + this.eliminateSpacesCheckBox.Name = "eliminateSpacesCheckBox"; + this.eliminateSpacesCheckBox.Size = new System.Drawing.Size(77, 17); + this.eliminateSpacesCheckBox.TabIndex = 21; + this.eliminateSpacesCheckBox.Text = "No spaces"; + this.eliminateSpacesCheckBox.UseVisualStyleBackColor = true; + // + // headerButton + // + this.headerButton.Enabled = false; + this.headerButton.Location = new System.Drawing.Point(108, 247); + this.headerButton.Name = "headerButton"; + this.headerButton.Size = new System.Drawing.Size(146, 23); + this.headerButton.TabIndex = 22; + this.headerButton.Text = "Header"; + this.headerButton.UseVisualStyleBackColor = true; + this.headerButton.Click += new System.EventHandler(this.headerButton_Click); + // + // footerButton + // + this.footerButton.Enabled = false; + this.footerButton.Location = new System.Drawing.Point(108, 322); + this.footerButton.Name = "footerButton"; + this.footerButton.Size = new System.Drawing.Size(146, 23); + this.footerButton.TabIndex = 25; + this.footerButton.Text = "Footer"; + this.footerButton.UseVisualStyleBackColor = true; + this.footerButton.Click += new System.EventHandler(this.footerButton_Click); + // + // commonItemsButton + // + this.commonItemsButton.Enabled = false; + this.commonItemsButton.Location = new System.Drawing.Point(108, 272); + this.commonItemsButton.Name = "commonItemsButton"; + this.commonItemsButton.Size = new System.Drawing.Size(146, 23); + this.commonItemsButton.TabIndex = 23; + this.commonItemsButton.Text = "Common items"; + this.commonItemsButton.UseVisualStyleBackColor = true; + this.commonItemsButton.Click += new System.EventHandler(this.commonItemsButton_Click); + // + // cultureComboBox + // + this.cultureComboBox.Enabled = false; + this.cultureComboBox.FormattingEnabled = true; + this.cultureComboBox.Location = new System.Drawing.Point(108, 178); + this.cultureComboBox.Name = "cultureComboBox"; + this.cultureComboBox.Size = new System.Drawing.Size(146, 21); + this.cultureComboBox.TabIndex = 18; + // + // cultureLabel + // + this.cultureLabel.AutoSize = true; + this.cultureLabel.Location = new System.Drawing.Point(17, 181); + this.cultureLabel.Name = "cultureLabel"; + this.cultureLabel.Size = new System.Drawing.Size(42, 13); + this.cultureLabel.TabIndex = 17; + this.cultureLabel.Text = "Cullture"; + // + // WriterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.cultureComboBox); + this.Controls.Add(this.cultureLabel); + this.Controls.Add(this.commonItemsButton); + this.Controls.Add(this.footerButton); + this.Controls.Add(this.headerButton); + this.Controls.Add(this.eliminateSpacesCheckBox); + this.Controls.Add(this.fileNameFmtTextBox); + this.Controls.Add(this.fileNameFmtLabel); + this.Controls.Add(this.destination2Button); + this.Controls.Add(this.destination2TextBox); + this.Controls.Add(this.destination2Label); + this.Controls.Add(this.dayFoldersComboBox); + this.Controls.Add(this.monthFoldersComboBox); + this.Controls.Add(this.yearFoldersComboBox); + this.Controls.Add(this.dayFoldersLabel); + this.Controls.Add(this.monthFoldersLabel); + this.Controls.Add(this.yearFoldersLabel); + this.Controls.Add(this.testItemsButton); + this.Controls.Add(this.separatorComboBox); + this.Controls.Add(this.separatorLabel); + this.Controls.Add(this.destinationButton); + this.Controls.Add(this.destinationTextBox); + this.Controls.Add(this.destinationLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "WriterCfgCtrl"; + this.Size = new System.Drawing.Size(400, 350); + this.Load += new System.EventHandler(this.WriterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.TextBox destinationTextBox; + private System.Windows.Forms.Label destinationLabel; + private System.Windows.Forms.Button destinationButton; + private System.Windows.Forms.Label separatorLabel; + private System.Windows.Forms.ComboBox separatorComboBox; + private System.Windows.Forms.Button testItemsButton; + private System.Windows.Forms.Label yearFoldersLabel; + private System.Windows.Forms.Label monthFoldersLabel; + private System.Windows.Forms.Label dayFoldersLabel; + private System.Windows.Forms.ComboBox yearFoldersComboBox; + private System.Windows.Forms.ComboBox monthFoldersComboBox; + private System.Windows.Forms.ComboBox dayFoldersComboBox; + private System.Windows.Forms.Button destination2Button; + private System.Windows.Forms.TextBox destination2TextBox; + private System.Windows.Forms.Label destination2Label; + private System.Windows.Forms.TextBox fileNameFmtTextBox; + private System.Windows.Forms.Label fileNameFmtLabel; + private System.Windows.Forms.CheckBox eliminateSpacesCheckBox; + private System.Windows.Forms.Button headerButton; + private System.Windows.Forms.Button footerButton; + private System.Windows.Forms.Button commonItemsButton; + private System.Windows.Forms.ComboBox cultureComboBox; + private System.Windows.Forms.Label cultureLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Xml/FactoryCompound.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Xml/FactoryCompound.cs new file mode 100644 index 00000000..924274be --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Xml/FactoryCompound.cs @@ -0,0 +1,29 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.FileWriters.Xml +{ + public class FactoryCompound : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".Compound"; } } + + public void ResetStaticProperties() { Writer.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Writer(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Writer(cfg); } + + public IComponentCfg DefaultConfig() { return new WriterCfg("FileWriter.Xml.Compound", this, Config.Entities.MetersKind.Combined); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + IComponentCfg cfg = ComponentCfgBase.CreateFromDbEntity(WriterCfg.Serializer, component, this); + (cfg as WriterCfg).MetersKind = Config.Entities.MetersKind.Combined; + return cfg; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Xml/FactoryHeatMeters.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Xml/FactoryHeatMeters.cs new file mode 100644 index 00000000..c9eca72d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Xml/FactoryHeatMeters.cs @@ -0,0 +1,29 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.FileWriters.Xml +{ + public class FactoryHeatMeters : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".HeatMeters"; } } + + public void ResetStaticProperties() { Writer.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Writer(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Writer(cfg); } + + public IComponentCfg DefaultConfig() { return new WriterCfg("FileWriter.Xml.HeatMeters", this, Config.Entities.MetersKind.HeatMeter); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + IComponentCfg cfg = ComponentCfgBase.CreateFromDbEntity(WriterCfg.Serializer, component, this); + (cfg as WriterCfg).MetersKind = Config.Entities.MetersKind.HeatMeter; + return cfg; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Xml/FactorySingle.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Xml/FactorySingle.cs new file mode 100644 index 00000000..8e986d63 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Xml/FactorySingle.cs @@ -0,0 +1,29 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.FileWriters.Xml +{ + public class FactorySingle : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".Single"; } } + + public void ResetStaticProperties() { Writer.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Writer(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Writer(cfg); } + + public IComponentCfg DefaultConfig() { return new WriterCfg("FileWriter.Xml.Single", this, Config.Entities.MetersKind.Single); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + IComponentCfg cfg = ComponentCfgBase.CreateFromDbEntity(WriterCfg.Serializer, component, this); + (cfg as WriterCfg).MetersKind = Config.Entities.MetersKind.Single; + return cfg; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Xml/Writer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Xml/Writer.cs new file mode 100644 index 00000000..e1c0e363 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Xml/Writer.cs @@ -0,0 +1,287 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Threading; +using log4net; +using Config.Entities; +using TBF.BenchControl; +using TBF.Resources; + +namespace TBF.BenchControl.Output.FileWriters.Xml +{ + public class Writer : ComponentBase, IOperation, GenericDevices.IResultsWriter + { + private static readonly ILog log = LogManager.GetLogger(typeof(Writer)); + public override string ToString() { return string.Format("Output.FileWriters.Enhanced({0})", Cfg.ToString(1)); } + + readonly WriterCfg writerCfg; + + /// + /// Items to print + /// + string header; + string rootTag; + string testTag; + IList commonItems; + IList testItems; + + Results.Entities.Batch batch; + + bool abort; + + + public Writer() {} + + public Writer(Generic.IComponentCfg cfg) + : base(cfg) + { + writerCfg = cfg as WriterCfg; + ApplyConfig(); + log.Debug(this.ToString()); + } + + + void ApplyConfig() + { + /// TODO: Apply culture info + rootTag = writerCfg.RootTag; + testTag = writerCfg.TestTag; + header = string.IsNullOrEmpty(writerCfg.Header) ? string.Empty : writerCfg.Header.Replace("~", Environment.NewLine); + commonItems = Results.WMeterRsltItemSpec.FromStrArray(writerCfg.CommonItems); + testItems = Results.WMeterRsltItemSpec.FromStrArray(writerCfg.TestItems); /// TestID info will be overwritten later on + } + + + #region Configuration Change Handling + + public static void OnCfgChange(object sender, CfgChangeArgs args) + { + if (CfgChangeHandler == null) return; + try { CfgChangeHandler(sender, args); } + catch (Exception e) { log.Error("CfgChangeHandler(...) failed", e); } + } + + public static event EventHandler CfgChangeHandler; + + public override void StartChangeHandler() + { + CfgChangeHandler += delegate(object sender, CfgChangeArgs args) + { + WriterCfg newCfg = args.Cfg as WriterCfg; + if (newCfg != null && newCfg.Name.Equals(Name)) + { + if (args.Command == CfgChangeCmd.CfgChange) + { + writerCfg.DestinationPath = newCfg.DestinationPath; + writerCfg.DestinationPath2 = newCfg.DestinationPath2; + writerCfg.YearFolders = newCfg.YearFolders; + writerCfg.MonthFolders = newCfg.MonthFolders; + writerCfg.DayFolders = newCfg.DayFolders; + writerCfg.FileNameFormat = newCfg.FileNameFormat; + writerCfg.Culture = newCfg.Culture; + writerCfg.Header = newCfg.Header; + writerCfg.RootTag = newCfg.RootTag; + writerCfg.TestTag = newCfg.TestTag; + writerCfg.CommonItems = newCfg.CommonItems; + writerCfg.TestItems = newCfg.TestItems; + + ApplyConfig(); + } + } + }; + } + + #endregion Configuration Change Handling + + + /// + /// Returns a file name derived from a DateTime structure. + /// Creates directories on this path as a side effect. + /// + /// Date and time + /// File name + string GetFilename(string destinationPath, DateTime time, int wmPosition) + { + string directory = destinationPath; /// Ends with "\\"; + + switch (writerCfg.YearFolders) + { + case YearFolders.FourDigit: + directory = string.Format("{0}{1:yyyy}\\", directory, time); + break; + case YearFolders.TwoDigit: + directory = string.Format("{0}{1:yy}\\", directory, time); + break; + } + + switch (writerCfg.MonthFolders) + { + case MonthFolders.Name: + { + string monthStr; + switch (time.Month) + { + default: + case 1: monthStr = "January"; break; + case 2: monthStr = "February"; break; + case 3: monthStr = "March"; break; + case 4: monthStr = "April"; break; + case 5: monthStr = "May"; break; + case 6: monthStr = "June"; break; + case 7: monthStr = "July"; break; + case 8: monthStr = "August"; break; + case 9: monthStr = "September"; break; + case 10: monthStr = "October"; break; + case 11: monthStr = "November"; break; + case 12: monthStr = "December"; break; + } + directory = string.Format("{0}{1}\\", directory, monthStr); + break; + } + case MonthFolders.Digit: + directory = string.Format("{0}{1}\\", directory, time.Month.ToString()); + break; + case MonthFolders.TwoDigit: + directory = string.Format("{0}{1:MM}\\", directory, time); + break; + } + + switch (writerCfg.DayFolders) + { + case DayFolders.Digit: + directory = string.Format("{0}{1}\\", directory, time.Day.ToString()); + break; + case DayFolders.TwoDigit: + directory = string.Format("{0}{1:dd}\\", directory, time); + break; + } + + Directory.CreateDirectory(directory); + + try + { + if (string.IsNullOrEmpty(writerCfg.FileNameFormat)) throw new Exception(); + return directory + string.Format(writerCfg.FileNameFormat, time, wmPosition); + } + catch + { + return string.Format("{0}{1:yyMMdd-HHmm}-{2:D2}.xml", directory, time, wmPosition); + } + } + + /// + /// Writes the test cycle results into a file + /// Events: + /// Event.ResultsWritten + /// Event.Busy + /// + /// Results to write into files + /// Reference to the operation + public IOperation WriteResultsOp(Results.Entities.Batch batch) + { + this.batch = batch; + return this; + } + + /// Start this operation + public void Start() + { + CultureInfo oriCulture = Thread.CurrentThread.CurrentCulture; + + if (writerCfg.Culture != Culture.system) + { + Thread.CurrentThread.CurrentCulture = new CultureInfo(writerCfg.Culture.ToString()); + } + + WriteRslts(batch, writerCfg.DestinationPath); + WriteRslts(batch, writerCfg.DestinationPath2); + + Thread.CurrentThread.CurrentCulture = oriCulture; + } + + /// Run this operation + /// Event.ResultsWritten + public Event Run() + { + return Event.ResultsWritten; + } + + /// Stop this operation + public void Stop() + { + } + + + void WriteRslts(Results.Entities.Batch batch, string destination) + { + if (string.IsNullOrEmpty(destination)) return; + + foreach (var wm in batch.WaterMeters) + { + try + { + StreamWriter writer = File.AppendText(GetFilename(destination, batch.EndTime, wm.WMPosition)); + WriteWM(writer, wm); + writer.Close(); + } + catch + { + } + } + } + + + /// + /// Write one water meter results + /// + /// Water meter number (0-based) + void WriteWM(StreamWriter wr, Results.Entities.WaterMeter wm) + { + /// Header + if (!string.IsNullOrEmpty(writerCfg.Header)) wr.Write(header); + wr.WriteLine(string.Format("<{0}>", rootTag)); + + /// Common items 1 + foreach (var v in commonItems) + { + if (abort) return; + + /// Fetch the item and strip color information + string itemText = v.Print(wm); + string[] texts = itemText.Split(new char[] { '|' }); + if (texts.Length == 2) { itemText = texts[0]; } + + wr.WriteLine(" <{0}>{1}", v.Caption, itemText); + } + + /// Test items + foreach (var mtr in wm.MeterTestRslts) + { + if (abort) return; + + if ((mtr != null) && (mtr.Publish() == Config.Entities.Publish.Always)) + { + wr.WriteLine(string.Format(" <{0}>", testTag)); + for (int i = 0; i < testItems.Count; i++) + { + /// Fetch the item and strip color information + string itemText = testItems[i].Print(wm, mtr.Name()); + string[] texts = itemText.Split(new char[] { '|' }); + if (texts.Length == 2) { itemText = texts[0]; } + + /// Print the item + wr.WriteLine(" <{0}>{1}", testItems[i].Caption, itemText); + } + wr.WriteLine(string.Format(" ", testTag)); + } + } + + /// Footer + wr.WriteLine(string.Format("", rootTag)); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Xml/WriterCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Xml/WriterCfg.cs new file mode 100644 index 00000000..ac0c9ed7 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Xml/WriterCfg.cs @@ -0,0 +1,73 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.FileWriters.Xml +{ + + public class WriterCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(WriterCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new WriterCfgCtrl(); } + + public string DestinationPath; /// Directory path into which the results will be saved + public string DestinationPath2; /// Directory path into which the 2nd copy of results will be saved + public YearFolders YearFolders; + public MonthFolders MonthFolders; + public DayFolders DayFolders; + public string FileNameFormat; + public Culture Culture; + public string Header; + public string RootTag; + public string TestTag; + public string[] CommonItems; + public string[] TestItems; + + [XmlIgnore] + public Config.Entities.MetersKind MetersKind; + + /// Private parameterless constructor invoked by all other (public) constructors + WriterCfg() + { + } + + public WriterCfg(string name, IComponentFactory factory, Config.Entities.MetersKind metersKind) + : this() + { + Name = name; + Factory = factory; + MetersKind = metersKind; + + ParentName = string.Empty; + DestinationPath = Program.HomeDir + "Results\\"; + DestinationPath2 = string.Empty; + YearFolders = YearFolders.FourDigit; + MonthFolders = MonthFolders.Digit; + DayFolders = DayFolders.Digit; + FileNameFormat = "{0:yyMMdd-HHmm}-{2:D2}.xml"; + Culture = Culture.EN; + Header = ""; + RootTag = "gwzPruefung"; + TestTag = "prueflauf"; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Path={1}, Y={2}, M={3}, D={4}, FNameFmt={5}, Culture={6}", + Name, + DestinationPath, + YearFolders, + MonthFolders, + DayFolders, + FileNameFormat, + Culture); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Xml/WriterCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Xml/WriterCfgCtrl.cs new file mode 100644 index 00000000..868d34f7 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Xml/WriterCfgCtrl.cs @@ -0,0 +1,325 @@ +/// +/// Copyright (c) 2017-2017 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.Output.FileWriters.Xml +{ + public partial class WriterCfgCtrl : UserControl, IComponentCfgCtrl + { + static readonly ILog log = LogManager.GetLogger(typeof(WriterCfgCtrl)); + + public bool ShowMore { get { return false; } } + + public bool Compound; + + WriterCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as WriterCfg; + Redraw(); + } + } + + string header; + string[] commonItems; + string[] testItems; + + public WriterCfgCtrl() + { + InitializeComponent(); + Localize(); + } + + private void WriterCfgCtrl_Load(object sender, EventArgs e) + { + for (YearFolders s = 0; s < YearFolders.Count; s++) yearFoldersComboBox.Items.Add(s.ToString()); + for (MonthFolders s = 0; s < MonthFolders.Count; s++) monthFoldersComboBox.Items.Add(s.ToString()); + for (DayFolders s = 0; s < DayFolders.Count; s++) dayFoldersComboBox.Items.Add(s.ToString()); + for (Culture s = 0; s < Culture.Count; s++) cultureComboBox.Items.Add(s.ToString()); + + header = config.Header; + commonItems = config.CommonItems; + testItems = config.TestItems; + + Redraw(); + } + + void Localize() + { + nameLabel.Text = Strings.Name; + destinationLabel.Text = "Destination"; + destination2Label.Text = "Destination" + " 2"; + yearFoldersLabel.Text = "Year folders"; + monthFoldersLabel.Text = "Month folders"; + dayFoldersLabel.Text = "Day folders"; + fileNameFmtLabel.Text = "File name format"; + cultureLabel.Text = "Culture"; + headerButton.Text = Strings.Header; + rootTagLabel.Text = "Root tag"; + commonItemsButton.Text = "Common items"; + testTagLabel.Text = "Test tag"; + testItemsButton.Text = "Test items"; + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + destinationTextBox.Text = config.DestinationPath; + destination2TextBox.Text = config.DestinationPath2; + yearFoldersComboBox.Text = config.YearFolders.ToString(); + monthFoldersComboBox.Text = config.MonthFolders.ToString(); + dayFoldersComboBox.Text = config.DayFolders.ToString(); + fileNameFmtTextBox.Text = config.FileNameFormat; + cultureComboBox.Text = config.Culture.ToString(); + rootTagTextBox.Text = config.RootTag; + testTagTextBox.Text = config.TestTag; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + destinationTextBox.Enabled = true; + destinationButton.Enabled = true; + destination2TextBox.Enabled = true; + destination2Button.Enabled = true; + yearFoldersComboBox.Enabled = true; + monthFoldersComboBox.Enabled = true; + dayFoldersComboBox.Enabled = true; + fileNameFmtTextBox.Enabled = true; + cultureComboBox.Enabled = true; + headerButton.Enabled = true; + rootTagTextBox.Enabled = true; + commonItemsButton.Enabled = true; + testTagTextBox.Enabled = true; + testItemsButton.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (!yearFoldersComboBox.Items.Contains(yearFoldersComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid year folders selection"; + } + + if (!monthFoldersComboBox.Items.Contains(monthFoldersComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid month folders selection"; + } + + if (!dayFoldersComboBox.Items.Contains(dayFoldersComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid day folder selection"; + } + + if (!cultureComboBox.Items.Contains(cultureComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid culture"; + } + + if (string.IsNullOrEmpty(rootTagTextBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Root tag field is empty"; + } + + if (string.IsNullOrEmpty(testTagTextBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Test tag field is empty"; + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + if (config.Name != nameTextBox.Text) + { + config.Name = nameTextBox.Text; + flags |= (CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + } + + if (config.DestinationPath != destinationTextBox.Text) + { + config.DestinationPath = destinationTextBox.Text; + if (!config.DestinationPath.EndsWith("\\")) config.DestinationPath += "\\"; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.DestinationPath2 != destination2TextBox.Text) + { + config.DestinationPath2 = destination2TextBox.Text; + if (!config.DestinationPath2.EndsWith("\\")) config.DestinationPath2 += "\\"; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + for (YearFolders i = 0; i < YearFolders.Count; i++) + { + if (i.ToString().Equals(yearFoldersComboBox.Text) && (config.YearFolders != i)) + { + config.YearFolders = i; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + break; + } + } + + for (MonthFolders i = 0; i < MonthFolders.Count; i++) + { + if (i.ToString().Equals(monthFoldersComboBox.Text) && (config.MonthFolders != i)) + { + config.MonthFolders = i; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + break; + } + } + + for (DayFolders i = 0; i < DayFolders.Count; i++) + { + if (i.ToString().Equals(dayFoldersComboBox.Text) && (config.DayFolders != i)) + { + config.DayFolders = i; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + break; + } + } + + if (config.FileNameFormat != fileNameFmtTextBox.Text) + { + config.FileNameFormat = fileNameFmtTextBox.Text; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + for (Culture i = 0; i < Culture.Count; i++) + { + if (i.ToString().Equals(cultureComboBox.Text) && (config.Culture != i)) + { + config.Culture = i; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + break; + } + } + + if (config.Header != header) + { + config.Header = header; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.RootTag != rootTagTextBox.Text) + { + config.RootTag = rootTagTextBox.Text; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.CommonItems != commonItems) + { + config.CommonItems = commonItems; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.TestTag != testTagTextBox.Text) + { + config.TestTag = testTagTextBox.Text; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.TestItems != testItems) + { + config.TestItems = testItems; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + + + if ((flags & CfgUpdateFlags.InvokeCfgChange) != 0) + { + Writer.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.CfgChange, config)); + } + + return flags; + } + + private void destinationButton_Click(object sender, EventArgs e) + { + + } + + private void headerButton_Click(object sender, EventArgs e) + { + HeaderFooterDlg dlg = new HeaderFooterDlg(true, string.IsNullOrEmpty(header) ? string.Empty : header.Replace("~", Environment.NewLine)); + if (dlg.ShowDialog() == DialogResult.OK) + { + header = dlg.EditedText.Replace(Environment.NewLine, "~"); + } + } + + private void commonItemsButton_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg() + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(commonItems), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + commonItems = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems); + } + } + + private void testItemsButton_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg(true) + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(testItems), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + testItems = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems); + } + } + + #region Configuration Change Handling + + public static void OnCmdResponse(object sender, CmdResponseArgs args) + { + if (CmdResponseHandler == null) return; + try { CmdResponseHandler(sender, args); } + catch (Exception e) { log.Error("CmdResponseHandler(...) failed", e); } + } + + public static event EventHandler CmdResponseHandler; + + public void StartResponseHandler() { } + public void StopResponseHandler() { } + + #endregion Configuration Change Handling + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Xml/WriterCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Xml/WriterCfgCtrl.designer.cs new file mode 100644 index 00000000..53f9ad82 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Xml/WriterCfgCtrl.designer.cs @@ -0,0 +1,366 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.Output.FileWriters.Xml +{ + partial class WriterCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.destinationTextBox = new System.Windows.Forms.TextBox(); + this.destinationLabel = new System.Windows.Forms.Label(); + this.destinationButton = new System.Windows.Forms.Button(); + this.cultureLabel = new System.Windows.Forms.Label(); + this.cultureComboBox = new System.Windows.Forms.ComboBox(); + this.testItemsButton = new System.Windows.Forms.Button(); + this.yearFoldersLabel = new System.Windows.Forms.Label(); + this.monthFoldersLabel = new System.Windows.Forms.Label(); + this.dayFoldersLabel = new System.Windows.Forms.Label(); + this.yearFoldersComboBox = new System.Windows.Forms.ComboBox(); + this.monthFoldersComboBox = new System.Windows.Forms.ComboBox(); + this.dayFoldersComboBox = new System.Windows.Forms.ComboBox(); + this.destination2Button = new System.Windows.Forms.Button(); + this.destination2TextBox = new System.Windows.Forms.TextBox(); + this.destination2Label = new System.Windows.Forms.Label(); + this.fileNameFmtTextBox = new System.Windows.Forms.TextBox(); + this.fileNameFmtLabel = new System.Windows.Forms.Label(); + this.headerButton = new System.Windows.Forms.Button(); + this.commonItemsButton = new System.Windows.Forms.Button(); + this.rootTagTextBox = new System.Windows.Forms.TextBox(); + this.rootTagLabel = new System.Windows.Forms.Label(); + this.testTagLabel = new System.Windows.Forms.Label(); + this.testTagTextBox = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(108, 31); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(146, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(17, 34); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(105, 9); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // destinationTextBox + // + this.destinationTextBox.Enabled = false; + this.destinationTextBox.Location = new System.Drawing.Point(108, 52); + this.destinationTextBox.Name = "destinationTextBox"; + this.destinationTextBox.Size = new System.Drawing.Size(146, 20); + this.destinationTextBox.TabIndex = 4; + // + // destinationLabel + // + this.destinationLabel.AutoSize = true; + this.destinationLabel.Location = new System.Drawing.Point(17, 55); + this.destinationLabel.Name = "destinationLabel"; + this.destinationLabel.Size = new System.Drawing.Size(60, 13); + this.destinationLabel.TabIndex = 3; + this.destinationLabel.Text = "Destination"; + // + // destinationButton + // + this.destinationButton.Enabled = false; + this.destinationButton.Location = new System.Drawing.Point(269, 52); + this.destinationButton.Name = "destinationButton"; + this.destinationButton.Size = new System.Drawing.Size(30, 20); + this.destinationButton.TabIndex = 5; + this.destinationButton.Text = "..."; + this.destinationButton.UseVisualStyleBackColor = true; + this.destinationButton.Click += new System.EventHandler(this.destinationButton_Click); + // + // cultureLabel + // + this.cultureLabel.AutoSize = true; + this.cultureLabel.Location = new System.Drawing.Point(17, 184); + this.cultureLabel.Name = "cultureLabel"; + this.cultureLabel.Size = new System.Drawing.Size(42, 13); + this.cultureLabel.TabIndex = 17; + this.cultureLabel.Text = "Cullture"; + // + // cultureComboBox + // + this.cultureComboBox.Enabled = false; + this.cultureComboBox.FormattingEnabled = true; + this.cultureComboBox.Location = new System.Drawing.Point(108, 181); + this.cultureComboBox.Name = "cultureComboBox"; + this.cultureComboBox.Size = new System.Drawing.Size(146, 21); + this.cultureComboBox.TabIndex = 18; + // + // testItemsButton + // + this.testItemsButton.Enabled = false; + this.testItemsButton.Location = new System.Drawing.Point(108, 294); + this.testItemsButton.Name = "testItemsButton"; + this.testItemsButton.Size = new System.Drawing.Size(146, 23); + this.testItemsButton.TabIndex = 25; + this.testItemsButton.Text = "Test items"; + this.testItemsButton.UseVisualStyleBackColor = true; + this.testItemsButton.Click += new System.EventHandler(this.testItemsButton_Click); + // + // yearFoldersLabel + // + this.yearFoldersLabel.AutoSize = true; + this.yearFoldersLabel.Location = new System.Drawing.Point(17, 97); + this.yearFoldersLabel.Name = "yearFoldersLabel"; + this.yearFoldersLabel.Size = new System.Drawing.Size(63, 13); + this.yearFoldersLabel.TabIndex = 9; + this.yearFoldersLabel.Text = "Year folders"; + // + // monthFoldersLabel + // + this.monthFoldersLabel.AutoSize = true; + this.monthFoldersLabel.Location = new System.Drawing.Point(17, 119); + this.monthFoldersLabel.Name = "monthFoldersLabel"; + this.monthFoldersLabel.Size = new System.Drawing.Size(71, 13); + this.monthFoldersLabel.TabIndex = 11; + this.monthFoldersLabel.Text = "Month folders"; + // + // dayFoldersLabel + // + this.dayFoldersLabel.AutoSize = true; + this.dayFoldersLabel.Location = new System.Drawing.Point(17, 141); + this.dayFoldersLabel.Name = "dayFoldersLabel"; + this.dayFoldersLabel.Size = new System.Drawing.Size(60, 13); + this.dayFoldersLabel.TabIndex = 13; + this.dayFoldersLabel.Text = "Day folders"; + // + // yearFoldersComboBox + // + this.yearFoldersComboBox.Enabled = false; + this.yearFoldersComboBox.FormattingEnabled = true; + this.yearFoldersComboBox.Location = new System.Drawing.Point(108, 94); + this.yearFoldersComboBox.Name = "yearFoldersComboBox"; + this.yearFoldersComboBox.Size = new System.Drawing.Size(146, 21); + this.yearFoldersComboBox.TabIndex = 10; + // + // monthFoldersComboBox + // + this.monthFoldersComboBox.Enabled = false; + this.monthFoldersComboBox.FormattingEnabled = true; + this.monthFoldersComboBox.Location = new System.Drawing.Point(108, 116); + this.monthFoldersComboBox.Name = "monthFoldersComboBox"; + this.monthFoldersComboBox.Size = new System.Drawing.Size(146, 21); + this.monthFoldersComboBox.TabIndex = 12; + // + // dayFoldersComboBox + // + this.dayFoldersComboBox.Enabled = false; + this.dayFoldersComboBox.FormattingEnabled = true; + this.dayFoldersComboBox.Location = new System.Drawing.Point(108, 138); + this.dayFoldersComboBox.Name = "dayFoldersComboBox"; + this.dayFoldersComboBox.Size = new System.Drawing.Size(146, 21); + this.dayFoldersComboBox.TabIndex = 14; + // + // destination2Button + // + this.destination2Button.Enabled = false; + this.destination2Button.Location = new System.Drawing.Point(269, 73); + this.destination2Button.Name = "destination2Button"; + this.destination2Button.Size = new System.Drawing.Size(30, 20); + this.destination2Button.TabIndex = 8; + this.destination2Button.Text = "..."; + this.destination2Button.UseVisualStyleBackColor = true; + // + // destination2TextBox + // + this.destination2TextBox.Enabled = false; + this.destination2TextBox.Location = new System.Drawing.Point(108, 73); + this.destination2TextBox.Name = "destination2TextBox"; + this.destination2TextBox.Size = new System.Drawing.Size(146, 20); + this.destination2TextBox.TabIndex = 7; + // + // destination2Label + // + this.destination2Label.AutoSize = true; + this.destination2Label.Location = new System.Drawing.Point(17, 76); + this.destination2Label.Name = "destination2Label"; + this.destination2Label.Size = new System.Drawing.Size(69, 13); + this.destination2Label.TabIndex = 6; + this.destination2Label.Text = "Destination 2"; + // + // fileNameFmtTextBox + // + this.fileNameFmtTextBox.Enabled = false; + this.fileNameFmtTextBox.Location = new System.Drawing.Point(108, 160); + this.fileNameFmtTextBox.Name = "fileNameFmtTextBox"; + this.fileNameFmtTextBox.Size = new System.Drawing.Size(146, 20); + this.fileNameFmtTextBox.TabIndex = 16; + // + // fileNameFmtLabel + // + this.fileNameFmtLabel.AutoSize = true; + this.fileNameFmtLabel.Location = new System.Drawing.Point(17, 163); + this.fileNameFmtLabel.Name = "fileNameFmtLabel"; + this.fileNameFmtLabel.Size = new System.Drawing.Size(84, 13); + this.fileNameFmtLabel.TabIndex = 15; + this.fileNameFmtLabel.Text = "File name format"; + // + // headerButton + // + this.headerButton.Enabled = false; + this.headerButton.Location = new System.Drawing.Point(108, 204); + this.headerButton.Name = "headerButton"; + this.headerButton.Size = new System.Drawing.Size(146, 23); + this.headerButton.TabIndex = 19; + this.headerButton.Text = "Header"; + this.headerButton.UseVisualStyleBackColor = true; + this.headerButton.Click += new System.EventHandler(this.headerButton_Click); + // + // commonItemsButton + // + this.commonItemsButton.Enabled = false; + this.commonItemsButton.Location = new System.Drawing.Point(108, 249); + this.commonItemsButton.Name = "commonItemsButton"; + this.commonItemsButton.Size = new System.Drawing.Size(146, 23); + this.commonItemsButton.TabIndex = 22; + this.commonItemsButton.Text = "Common items"; + this.commonItemsButton.UseVisualStyleBackColor = true; + this.commonItemsButton.Click += new System.EventHandler(this.commonItemsButton_Click); + // + // rootTagTextBox + // + this.rootTagTextBox.Enabled = false; + this.rootTagTextBox.Location = new System.Drawing.Point(108, 228); + this.rootTagTextBox.Name = "rootTagTextBox"; + this.rootTagTextBox.Size = new System.Drawing.Size(146, 20); + this.rootTagTextBox.TabIndex = 21; + // + // rootTagLabel + // + this.rootTagLabel.AutoSize = true; + this.rootTagLabel.Location = new System.Drawing.Point(17, 231); + this.rootTagLabel.Name = "rootTagLabel"; + this.rootTagLabel.Size = new System.Drawing.Size(48, 13); + this.rootTagLabel.TabIndex = 20; + this.rootTagLabel.Text = "Root tag"; + // + // testTagLabel + // + this.testTagLabel.AutoSize = true; + this.testTagLabel.Location = new System.Drawing.Point(17, 276); + this.testTagLabel.Name = "testTagLabel"; + this.testTagLabel.Size = new System.Drawing.Size(46, 13); + this.testTagLabel.TabIndex = 23; + this.testTagLabel.Text = "Test tag"; + // + // testTagTextBox + // + this.testTagTextBox.Enabled = false; + this.testTagTextBox.Location = new System.Drawing.Point(108, 273); + this.testTagTextBox.Name = "testTagTextBox"; + this.testTagTextBox.Size = new System.Drawing.Size(146, 20); + this.testTagTextBox.TabIndex = 24; + // + // WriterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.testTagLabel); + this.Controls.Add(this.testTagTextBox); + this.Controls.Add(this.rootTagLabel); + this.Controls.Add(this.rootTagTextBox); + this.Controls.Add(this.commonItemsButton); + this.Controls.Add(this.headerButton); + this.Controls.Add(this.fileNameFmtTextBox); + this.Controls.Add(this.fileNameFmtLabel); + this.Controls.Add(this.destination2Button); + this.Controls.Add(this.destination2TextBox); + this.Controls.Add(this.destination2Label); + this.Controls.Add(this.dayFoldersComboBox); + this.Controls.Add(this.monthFoldersComboBox); + this.Controls.Add(this.yearFoldersComboBox); + this.Controls.Add(this.dayFoldersLabel); + this.Controls.Add(this.monthFoldersLabel); + this.Controls.Add(this.yearFoldersLabel); + this.Controls.Add(this.testItemsButton); + this.Controls.Add(this.cultureComboBox); + this.Controls.Add(this.cultureLabel); + this.Controls.Add(this.destinationButton); + this.Controls.Add(this.destinationTextBox); + this.Controls.Add(this.destinationLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "WriterCfgCtrl"; + this.Size = new System.Drawing.Size(400, 350); + this.Load += new System.EventHandler(this.WriterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.TextBox destinationTextBox; + private System.Windows.Forms.Label destinationLabel; + private System.Windows.Forms.Button destinationButton; + private System.Windows.Forms.Label cultureLabel; + private System.Windows.Forms.ComboBox cultureComboBox; + private System.Windows.Forms.Button testItemsButton; + private System.Windows.Forms.Label yearFoldersLabel; + private System.Windows.Forms.Label monthFoldersLabel; + private System.Windows.Forms.Label dayFoldersLabel; + private System.Windows.Forms.ComboBox yearFoldersComboBox; + private System.Windows.Forms.ComboBox monthFoldersComboBox; + private System.Windows.Forms.ComboBox dayFoldersComboBox; + private System.Windows.Forms.Button destination2Button; + private System.Windows.Forms.TextBox destination2TextBox; + private System.Windows.Forms.Label destination2Label; + private System.Windows.Forms.TextBox fileNameFmtTextBox; + private System.Windows.Forms.Label fileNameFmtLabel; + private System.Windows.Forms.Button headerButton; + private System.Windows.Forms.Button commonItemsButton; + private System.Windows.Forms.TextBox rootTagTextBox; + private System.Windows.Forms.Label rootTagLabel; + private System.Windows.Forms.Label testTagLabel; + private System.Windows.Forms.TextBox testTagTextBox; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Xml/WriterCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Xml/WriterCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/Xml/WriterCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/XmlBatch/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/XmlBatch/Factory.cs new file mode 100644 index 00000000..21b39cd4 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/XmlBatch/Factory.cs @@ -0,0 +1,29 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.FileWriters.XmlBatch +{ + public class FactorySingle : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".Single"; } } + + public void ResetStaticProperties() { Writer.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Writer(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Writer(cfg); } + + public IComponentCfg DefaultConfig() { return new WriterCfg("FileWriter.XmlBatch", this, Config.Entities.MetersKind.Single); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + IComponentCfg cfg = ComponentCfgBase.CreateFromDbEntity(WriterCfg.Serializer, component, this); + (cfg as WriterCfg).MetersKind = Config.Entities.MetersKind.Single; + return cfg; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/XmlBatch/Writer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/XmlBatch/Writer.cs new file mode 100644 index 00000000..3e0bb1ef --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/XmlBatch/Writer.cs @@ -0,0 +1,310 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Threading; +using log4net; +using Config.Entities; +using TBF.BenchControl; +using TBF.Resources; + +namespace TBF.BenchControl.Output.FileWriters.XmlBatch +{ + public class Writer : ComponentBase, IOperation, GenericDevices.IResultsWriter + { + private static readonly ILog log = LogManager.GetLogger(typeof(Writer)); + public override string ToString() { return string.Format("Output.FileWriters.Enhanced({0})", Cfg.ToString(1)); } + + readonly WriterCfg writerCfg; + + /// + /// Items to print + /// + string header; + string rootTag; + string meterTag; + string testTag; + IList commonItems; + IList meterItems; + IList testItems; + + Results.Entities.Batch batch; + + bool abort; + + + public Writer() {} + + public Writer(Generic.IComponentCfg cfg) + : base(cfg) + { + writerCfg = cfg as WriterCfg; + ApplyConfig(); + log.Debug(this.ToString()); + } + + + void ApplyConfig() + { + /// TODO: Apply culture info + rootTag = writerCfg.RootTag; + meterTag = writerCfg.MeterTag; + testTag = writerCfg.TestTag; + header = string.IsNullOrEmpty(writerCfg.Header) ? string.Empty : writerCfg.Header.Replace("~", Environment.NewLine); + commonItems = Results.WMeterRsltItemSpec.FromStrArray(writerCfg.CommonItems); + meterItems = Results.WMeterRsltItemSpec.FromStrArray(writerCfg.MeterItems); + testItems = Results.WMeterRsltItemSpec.FromStrArray(writerCfg.TestItems); /// TestID info will be overwritten later on + } + + + #region Configuration Change Handling + + public static void OnCfgChange(object sender, CfgChangeArgs args) + { + if (CfgChangeHandler == null) return; + try { CfgChangeHandler(sender, args); } + catch (Exception e) { log.Error("CfgChangeHandler(...) failed", e); } + } + + public static event EventHandler CfgChangeHandler; + + public override void StartChangeHandler() + { + CfgChangeHandler += delegate(object sender, CfgChangeArgs args) + { + WriterCfg newCfg = args.Cfg as WriterCfg; + if (newCfg != null && newCfg.Name.Equals(Name)) + { + if (args.Command == CfgChangeCmd.CfgChange) + { + writerCfg.DestinationPath = newCfg.DestinationPath; + writerCfg.DestinationPath2 = newCfg.DestinationPath2; + writerCfg.YearFolders = newCfg.YearFolders; + writerCfg.MonthFolders = newCfg.MonthFolders; + writerCfg.DayFolders = newCfg.DayFolders; + writerCfg.FileNameFormat = newCfg.FileNameFormat; + writerCfg.Culture = newCfg.Culture; + writerCfg.Header = newCfg.Header; + writerCfg.RootTag = newCfg.RootTag; + writerCfg.MeterTag = newCfg.MeterTag; + writerCfg.TestTag = newCfg.TestTag; + writerCfg.CommonItems = newCfg.CommonItems; + writerCfg.MeterItems = newCfg.MeterItems; + writerCfg.TestItems = newCfg.TestItems; + + ApplyConfig(); + } + } + }; + } + + #endregion Configuration Change Handling + + + /// + /// Returns a file name derived from a DateTime structure. + /// Creates directories on this path as a side effect. + /// + /// Date and time + /// File name + string GetFilename(string destinationPath, DateTime time) + { + string directory = destinationPath; /// Ends with "\\"; + + switch (writerCfg.YearFolders) + { + case YearFolders.FourDigit: + directory = string.Format("{0}{1:yyyy}\\", directory, time); + break; + case YearFolders.TwoDigit: + directory = string.Format("{0}{1:yy}\\", directory, time); + break; + } + + switch (writerCfg.MonthFolders) + { + case MonthFolders.Name: + { + string monthStr; + switch (time.Month) + { + default: + case 1: monthStr = "January"; break; + case 2: monthStr = "February"; break; + case 3: monthStr = "March"; break; + case 4: monthStr = "April"; break; + case 5: monthStr = "May"; break; + case 6: monthStr = "June"; break; + case 7: monthStr = "July"; break; + case 8: monthStr = "August"; break; + case 9: monthStr = "September"; break; + case 10: monthStr = "October"; break; + case 11: monthStr = "November"; break; + case 12: monthStr = "December"; break; + } + directory = string.Format("{0}{1}\\", directory, monthStr); + break; + } + case MonthFolders.Digit: + directory = string.Format("{0}{1}\\", directory, time.Month.ToString()); + break; + case MonthFolders.TwoDigit: + directory = string.Format("{0}{1:MM}\\", directory, time); + break; + } + + switch (writerCfg.DayFolders) + { + case DayFolders.Digit: + directory = string.Format("{0}{1}\\", directory, time.Day.ToString()); + break; + case DayFolders.TwoDigit: + directory = string.Format("{0}{1:dd}\\", directory, time); + break; + } + + Directory.CreateDirectory(directory); + + try + { + if (string.IsNullOrEmpty(writerCfg.FileNameFormat)) throw new Exception(); + return directory + string.Format(writerCfg.FileNameFormat, time); + } + catch + { + return string.Format("{0}{1:yyMMdd-HHmm}.xml", directory, time); + } + } + + /// + /// Writes the test cycle results into a file + /// Events: + /// Event.ResultsWritten + /// Event.Busy + /// + /// Results to write into files + /// Reference to the operation + public IOperation WriteResultsOp(Results.Entities.Batch batch) + { + this.batch = batch; + return this; + } + + /// Start this operation + public void Start() + { + CultureInfo oriCulture = Thread.CurrentThread.CurrentCulture; + + if (writerCfg.Culture != Culture.system) + { + Thread.CurrentThread.CurrentCulture = new CultureInfo(writerCfg.Culture.ToString()); + } + + WriteRslts(batch, writerCfg.DestinationPath); + WriteRslts(batch, writerCfg.DestinationPath2); + + Thread.CurrentThread.CurrentCulture = oriCulture; + } + + /// Run this operation + /// Event.ResultsWritten + public Event Run() + { + return Event.ResultsWritten; + } + + /// Stop this operation + public void Stop() + { + } + + + void WriteRslts(Results.Entities.Batch batch, string destination) + { + if (string.IsNullOrEmpty(destination)) return; + if (batch.WaterMeters == null || batch.WaterMeters.Count == 0) return; + + try + { + StreamWriter writer = File.AppendText(GetFilename(destination, batch.EndTime)); + WriteBatch(writer); + writer.Close(); + } + catch + { + } + } + + + /// + /// Write one water meter results + /// + /// Water meter number (0-based) + void WriteBatch(StreamWriter wr) + { + /// Header + if (!string.IsNullOrEmpty(writerCfg.Header)) wr.Write(header); + wr.WriteLine(string.Format("<{0}>", rootTag)); + + /// Common items + foreach (var v in commonItems) + { + if (abort) return; + + /// Fetch the item and strip color information + string itemText = v.Print(batch.WaterMeters[0]); + string[] texts = itemText.Split(new char[] { '|' }); + if (texts.Length == 2) { itemText = texts[0]; } + + wr.WriteLine(" <{0}>{1}", v.Caption, itemText); + } + + foreach (var wm in batch.WaterMeters) + { + wr.WriteLine(string.Format(" <{0}>", meterTag)); + + /// Meter items + foreach (var v in meterItems) + { + if (abort) return; + + /// Fetch the item and strip color information + string itemText = v.Print(wm); + string[] texts = itemText.Split(new char[] { '|' }); + if (texts.Length == 2) { itemText = texts[0]; } + + wr.WriteLine(" <{0}>{1}", v.Caption, itemText); + } + + /// Test items + foreach (var mtr in wm.MeterTestRslts) + { + if (abort) return; + + if ((mtr != null) && (mtr.Publish() == Config.Entities.Publish.Always)) + { + wr.WriteLine(string.Format(" <{0}>", testTag)); + for (int i = 0; i < testItems.Count; i++) + { + /// Fetch the item and strip color information + string itemText = testItems[i].Print(wm, mtr.Name()); + string[] texts = itemText.Split(new char[] { '|' }); + if (texts.Length == 2) { itemText = texts[0]; } + + /// Print the item + wr.WriteLine(" <{0}>{1}", testItems[i].Caption, itemText); + } + wr.WriteLine(string.Format(" ", testTag)); + } + } + wr.WriteLine(string.Format(" ", meterTag)); + } + + /// Footer + wr.WriteLine(string.Format("", rootTag)); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/XmlBatch/WriterCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/XmlBatch/WriterCfg.cs new file mode 100644 index 00000000..f5fe7351 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/XmlBatch/WriterCfg.cs @@ -0,0 +1,76 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.FileWriters.XmlBatch +{ + + public class WriterCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(WriterCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new WriterCfgCtrl(); } + + public string DestinationPath; /// Directory path into which the results will be saved + public string DestinationPath2; /// Directory path into which the 2nd copy of results will be saved + public YearFolders YearFolders; + public MonthFolders MonthFolders; + public DayFolders DayFolders; + public string FileNameFormat; + public Culture Culture; + public string Header; + public string RootTag; + public string MeterTag; + public string TestTag; + public string[] CommonItems; + public string[] MeterItems; + public string[] TestItems; + + [XmlIgnore] + public Config.Entities.MetersKind MetersKind; + + /// Private parameterless constructor invoked by all other (public) constructors + WriterCfg() + { + } + + public WriterCfg(string name, IComponentFactory factory, Config.Entities.MetersKind metersKind) + : this() + { + Name = name; + Factory = factory; + MetersKind = metersKind; + + ParentName = string.Empty; + DestinationPath = Path.Combine(Program.HomeDir, "Results", "Xml"); + DestinationPath2 = string.Empty; + YearFolders = YearFolders.FourDigit; + MonthFolders = MonthFolders.Digit; + DayFolders = DayFolders.Digit; + FileNameFormat = "{0:yyMMdd-HHmm}.xml"; + Culture = Culture.EN; + Header = ""; + RootTag = "Batch"; + MeterTag = "Meter"; + TestTag = "Test"; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Path={1}, Y={2}, M={3}, D={4}, FNameFmt={5}, Culture={6}", + Name, + DestinationPath, + YearFolders, + MonthFolders, + DayFolders, + FileNameFormat, + Culture); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/XmlBatch/WriterCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/XmlBatch/WriterCfgCtrl.cs new file mode 100644 index 00000000..b66e1f33 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/XmlBatch/WriterCfgCtrl.cs @@ -0,0 +1,364 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.Output.FileWriters.XmlBatch +{ + public partial class WriterCfgCtrl : UserControl, IComponentCfgCtrl + { + static readonly ILog log = LogManager.GetLogger(typeof(WriterCfgCtrl)); + + public bool ShowMore { get { return false; } } + + public bool Compound; + + WriterCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as WriterCfg; + Redraw(); + } + } + + string header; + string[] commonItems; + string[] meterItems; + string[] testItems; + + public WriterCfgCtrl() + { + InitializeComponent(); + Localize(); + } + + private void WriterCfgCtrl_Load(object sender, EventArgs e) + { + for (YearFolders s = 0; s < YearFolders.Count; s++) yearFoldersComboBox.Items.Add(s.ToString()); + for (MonthFolders s = 0; s < MonthFolders.Count; s++) monthFoldersComboBox.Items.Add(s.ToString()); + for (DayFolders s = 0; s < DayFolders.Count; s++) dayFoldersComboBox.Items.Add(s.ToString()); + for (Culture s = 0; s < Culture.Count; s++) cultureComboBox.Items.Add(s.ToString()); + + header = config.Header; + commonItems = config.CommonItems; + meterItems = config.MeterItems; + testItems = config.TestItems; + + Redraw(); + } + + void Localize() + { + nameLabel.Text = Strings.Name; + destinationLabel.Text = "Destination"; + destination2Label.Text = "Destination" + " 2"; + yearFoldersLabel.Text = "Year folders"; + monthFoldersLabel.Text = "Month folders"; + dayFoldersLabel.Text = "Day folders"; + fileNameFmtLabel.Text = "File name format"; + cultureLabel.Text = "Culture"; + headerButton.Text = Strings.Header; + rootTagLabel.Text = "Root tag"; + commonItemsButton.Text = "Common items"; + meterTagLabel.Text = "Meter tag"; + meterItemsButton.Text = "Meter items"; + testTagLabel.Text = "Test tag"; + testItemsButton.Text = "Test items"; + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + destinationTextBox.Text = config.DestinationPath; + destination2TextBox.Text = config.DestinationPath2; + yearFoldersComboBox.Text = config.YearFolders.ToString(); + monthFoldersComboBox.Text = config.MonthFolders.ToString(); + dayFoldersComboBox.Text = config.DayFolders.ToString(); + fileNameFmtTextBox.Text = config.FileNameFormat; + cultureComboBox.Text = config.Culture.ToString(); + rootTagTextBox.Text = config.RootTag; + meterTagTextBox.Text = config.MeterTag; + testTagTextBox.Text = config.TestTag; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + destinationTextBox.Enabled = true; + destinationButton.Enabled = true; + destination2TextBox.Enabled = true; + destination2Button.Enabled = true; + yearFoldersComboBox.Enabled = true; + monthFoldersComboBox.Enabled = true; + dayFoldersComboBox.Enabled = true; + fileNameFmtTextBox.Enabled = true; + cultureComboBox.Enabled = true; + headerButton.Enabled = true; + rootTagTextBox.Enabled = true; + commonItemsButton.Enabled = true; + meterTagTextBox.Enabled = true; + meterItemsButton.Enabled = true; + testTagTextBox.Enabled = true; + testItemsButton.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (!yearFoldersComboBox.Items.Contains(yearFoldersComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid year folders selection"; + } + + if (!monthFoldersComboBox.Items.Contains(monthFoldersComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid month folders selection"; + } + + if (!dayFoldersComboBox.Items.Contains(dayFoldersComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid day folder selection"; + } + + if (!cultureComboBox.Items.Contains(cultureComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid culture"; + } + + if (string.IsNullOrEmpty(rootTagTextBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Root tag field is empty"; + } + + if (string.IsNullOrEmpty(meterTagTextBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Meter tag field is empty"; + } + + if (string.IsNullOrEmpty(testTagTextBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Test tag field is empty"; + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + if (config.Name != nameTextBox.Text) + { + config.Name = nameTextBox.Text; + flags |= (CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + } + + if (config.DestinationPath != destinationTextBox.Text) + { + config.DestinationPath = destinationTextBox.Text; + if (!config.DestinationPath.EndsWith("\\")) config.DestinationPath += "\\"; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.DestinationPath2 != destination2TextBox.Text) + { + config.DestinationPath2 = destination2TextBox.Text; + if (!config.DestinationPath2.EndsWith("\\")) config.DestinationPath2 += "\\"; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + for (YearFolders i = 0; i < YearFolders.Count; i++) + { + if (i.ToString().Equals(yearFoldersComboBox.Text) && (config.YearFolders != i)) + { + config.YearFolders = i; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + break; + } + } + + for (MonthFolders i = 0; i < MonthFolders.Count; i++) + { + if (i.ToString().Equals(monthFoldersComboBox.Text) && (config.MonthFolders != i)) + { + config.MonthFolders = i; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + break; + } + } + + for (DayFolders i = 0; i < DayFolders.Count; i++) + { + if (i.ToString().Equals(dayFoldersComboBox.Text) && (config.DayFolders != i)) + { + config.DayFolders = i; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + break; + } + } + + if (config.FileNameFormat != fileNameFmtTextBox.Text) + { + config.FileNameFormat = fileNameFmtTextBox.Text; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + for (Culture i = 0; i < Culture.Count; i++) + { + if (i.ToString().Equals(cultureComboBox.Text) && (config.Culture != i)) + { + config.Culture = i; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + break; + } + } + + if (config.Header != header) + { + config.Header = header; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.RootTag != rootTagTextBox.Text) + { + config.RootTag = rootTagTextBox.Text; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.CommonItems != commonItems) + { + config.CommonItems = commonItems; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.MeterTag != meterTagTextBox.Text) + { + config.MeterTag = meterTagTextBox.Text; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.MeterItems != meterItems) + { + config.MeterItems = meterItems; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.TestTag != testTagTextBox.Text) + { + config.TestTag = testTagTextBox.Text; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.TestItems != testItems) + { + config.TestItems = testItems; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + + + if ((flags & CfgUpdateFlags.InvokeCfgChange) != 0) + { + Writer.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.CfgChange, config)); + } + + return flags; + } + + private void destinationButton_Click(object sender, EventArgs e) + { + + } + + private void headerButton_Click(object sender, EventArgs e) + { + HeaderFooterDlg dlg = new HeaderFooterDlg(true, string.IsNullOrEmpty(header) ? string.Empty : header.Replace("~", Environment.NewLine)); + if (dlg.ShowDialog() == DialogResult.OK) + { + header = dlg.EditedText.Replace(Environment.NewLine, "~"); + } + } + + private void commonItemsButton_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg() + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(commonItems), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + commonItems = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems); + } + } + + private void meterItemsButton_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg() + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(meterItems), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + meterItems = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems); + } + } + + private void testItemsButton_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg(true) + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(testItems), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + testItems = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems); + } + } + + #region Configuration Change Handling + + public static void OnCmdResponse(object sender, CmdResponseArgs args) + { + if (CmdResponseHandler == null) return; + try { CmdResponseHandler(sender, args); } + catch (Exception e) { log.Error("CmdResponseHandler(...) failed", e); } + } + + public static event EventHandler CmdResponseHandler; + + public void StartResponseHandler() { } + public void StopResponseHandler() { } + + #endregion Configuration Change Handling + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/XmlBatch/WriterCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/XmlBatch/WriterCfgCtrl.designer.cs new file mode 100644 index 00000000..dba5fc58 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/XmlBatch/WriterCfgCtrl.designer.cs @@ -0,0 +1,403 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +namespace TBF.BenchControl.Output.FileWriters.XmlBatch +{ + partial class WriterCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.destinationTextBox = new System.Windows.Forms.TextBox(); + this.destinationLabel = new System.Windows.Forms.Label(); + this.destinationButton = new System.Windows.Forms.Button(); + this.cultureLabel = new System.Windows.Forms.Label(); + this.cultureComboBox = new System.Windows.Forms.ComboBox(); + this.testItemsButton = new System.Windows.Forms.Button(); + this.yearFoldersLabel = new System.Windows.Forms.Label(); + this.monthFoldersLabel = new System.Windows.Forms.Label(); + this.dayFoldersLabel = new System.Windows.Forms.Label(); + this.yearFoldersComboBox = new System.Windows.Forms.ComboBox(); + this.monthFoldersComboBox = new System.Windows.Forms.ComboBox(); + this.dayFoldersComboBox = new System.Windows.Forms.ComboBox(); + this.destination2Button = new System.Windows.Forms.Button(); + this.destination2TextBox = new System.Windows.Forms.TextBox(); + this.destination2Label = new System.Windows.Forms.Label(); + this.fileNameFmtTextBox = new System.Windows.Forms.TextBox(); + this.fileNameFmtLabel = new System.Windows.Forms.Label(); + this.headerButton = new System.Windows.Forms.Button(); + this.commonItemsButton = new System.Windows.Forms.Button(); + this.rootTagTextBox = new System.Windows.Forms.TextBox(); + this.rootTagLabel = new System.Windows.Forms.Label(); + this.testTagLabel = new System.Windows.Forms.Label(); + this.testTagTextBox = new System.Windows.Forms.TextBox(); + this.meterTagLabel = new System.Windows.Forms.Label(); + this.meterTagTextBox = new System.Windows.Forms.TextBox(); + this.meterItemsButton = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(108, 31); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(146, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(17, 34); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(105, 9); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // destinationTextBox + // + this.destinationTextBox.Enabled = false; + this.destinationTextBox.Location = new System.Drawing.Point(108, 51); + this.destinationTextBox.Name = "destinationTextBox"; + this.destinationTextBox.Size = new System.Drawing.Size(146, 20); + this.destinationTextBox.TabIndex = 4; + // + // destinationLabel + // + this.destinationLabel.AutoSize = true; + this.destinationLabel.Location = new System.Drawing.Point(17, 54); + this.destinationLabel.Name = "destinationLabel"; + this.destinationLabel.Size = new System.Drawing.Size(60, 13); + this.destinationLabel.TabIndex = 3; + this.destinationLabel.Text = "Destination"; + // + // destinationButton + // + this.destinationButton.Enabled = false; + this.destinationButton.Location = new System.Drawing.Point(269, 51); + this.destinationButton.Name = "destinationButton"; + this.destinationButton.Size = new System.Drawing.Size(30, 20); + this.destinationButton.TabIndex = 5; + this.destinationButton.Text = "..."; + this.destinationButton.UseVisualStyleBackColor = true; + this.destinationButton.Click += new System.EventHandler(this.destinationButton_Click); + // + // cultureLabel + // + this.cultureLabel.AutoSize = true; + this.cultureLabel.Location = new System.Drawing.Point(17, 178); + this.cultureLabel.Name = "cultureLabel"; + this.cultureLabel.Size = new System.Drawing.Size(42, 13); + this.cultureLabel.TabIndex = 17; + this.cultureLabel.Text = "Cullture"; + // + // cultureComboBox + // + this.cultureComboBox.Enabled = false; + this.cultureComboBox.FormattingEnabled = true; + this.cultureComboBox.Location = new System.Drawing.Point(108, 174); + this.cultureComboBox.Name = "cultureComboBox"; + this.cultureComboBox.Size = new System.Drawing.Size(146, 21); + this.cultureComboBox.TabIndex = 18; + // + // testItemsButton + // + this.testItemsButton.Enabled = false; + this.testItemsButton.Location = new System.Drawing.Point(108, 325); + this.testItemsButton.Name = "testItemsButton"; + this.testItemsButton.Size = new System.Drawing.Size(146, 23); + this.testItemsButton.TabIndex = 25; + this.testItemsButton.Text = "Test items"; + this.testItemsButton.UseVisualStyleBackColor = true; + this.testItemsButton.Click += new System.EventHandler(this.testItemsButton_Click); + // + // yearFoldersLabel + // + this.yearFoldersLabel.AutoSize = true; + this.yearFoldersLabel.Location = new System.Drawing.Point(17, 94); + this.yearFoldersLabel.Name = "yearFoldersLabel"; + this.yearFoldersLabel.Size = new System.Drawing.Size(63, 13); + this.yearFoldersLabel.TabIndex = 9; + this.yearFoldersLabel.Text = "Year folders"; + // + // monthFoldersLabel + // + this.monthFoldersLabel.AutoSize = true; + this.monthFoldersLabel.Location = new System.Drawing.Point(17, 115); + this.monthFoldersLabel.Name = "monthFoldersLabel"; + this.monthFoldersLabel.Size = new System.Drawing.Size(71, 13); + this.monthFoldersLabel.TabIndex = 11; + this.monthFoldersLabel.Text = "Month folders"; + // + // dayFoldersLabel + // + this.dayFoldersLabel.AutoSize = true; + this.dayFoldersLabel.Location = new System.Drawing.Point(17, 136); + this.dayFoldersLabel.Name = "dayFoldersLabel"; + this.dayFoldersLabel.Size = new System.Drawing.Size(60, 13); + this.dayFoldersLabel.TabIndex = 13; + this.dayFoldersLabel.Text = "Day folders"; + // + // yearFoldersComboBox + // + this.yearFoldersComboBox.Enabled = false; + this.yearFoldersComboBox.FormattingEnabled = true; + this.yearFoldersComboBox.Location = new System.Drawing.Point(108, 91); + this.yearFoldersComboBox.Name = "yearFoldersComboBox"; + this.yearFoldersComboBox.Size = new System.Drawing.Size(146, 21); + this.yearFoldersComboBox.TabIndex = 10; + // + // monthFoldersComboBox + // + this.monthFoldersComboBox.Enabled = false; + this.monthFoldersComboBox.FormattingEnabled = true; + this.monthFoldersComboBox.Location = new System.Drawing.Point(108, 112); + this.monthFoldersComboBox.Name = "monthFoldersComboBox"; + this.monthFoldersComboBox.Size = new System.Drawing.Size(146, 21); + this.monthFoldersComboBox.TabIndex = 12; + // + // dayFoldersComboBox + // + this.dayFoldersComboBox.Enabled = false; + this.dayFoldersComboBox.FormattingEnabled = true; + this.dayFoldersComboBox.Location = new System.Drawing.Point(108, 133); + this.dayFoldersComboBox.Name = "dayFoldersComboBox"; + this.dayFoldersComboBox.Size = new System.Drawing.Size(146, 21); + this.dayFoldersComboBox.TabIndex = 14; + // + // destination2Button + // + this.destination2Button.Enabled = false; + this.destination2Button.Location = new System.Drawing.Point(269, 71); + this.destination2Button.Name = "destination2Button"; + this.destination2Button.Size = new System.Drawing.Size(30, 20); + this.destination2Button.TabIndex = 8; + this.destination2Button.Text = "..."; + this.destination2Button.UseVisualStyleBackColor = true; + // + // destination2TextBox + // + this.destination2TextBox.Enabled = false; + this.destination2TextBox.Location = new System.Drawing.Point(108, 71); + this.destination2TextBox.Name = "destination2TextBox"; + this.destination2TextBox.Size = new System.Drawing.Size(146, 20); + this.destination2TextBox.TabIndex = 7; + // + // destination2Label + // + this.destination2Label.AutoSize = true; + this.destination2Label.Location = new System.Drawing.Point(17, 74); + this.destination2Label.Name = "destination2Label"; + this.destination2Label.Size = new System.Drawing.Size(69, 13); + this.destination2Label.TabIndex = 6; + this.destination2Label.Text = "Destination 2"; + // + // fileNameFmtTextBox + // + this.fileNameFmtTextBox.Enabled = false; + this.fileNameFmtTextBox.Location = new System.Drawing.Point(108, 154); + this.fileNameFmtTextBox.Name = "fileNameFmtTextBox"; + this.fileNameFmtTextBox.Size = new System.Drawing.Size(146, 20); + this.fileNameFmtTextBox.TabIndex = 16; + // + // fileNameFmtLabel + // + this.fileNameFmtLabel.AutoSize = true; + this.fileNameFmtLabel.Location = new System.Drawing.Point(17, 157); + this.fileNameFmtLabel.Name = "fileNameFmtLabel"; + this.fileNameFmtLabel.Size = new System.Drawing.Size(84, 13); + this.fileNameFmtLabel.TabIndex = 15; + this.fileNameFmtLabel.Text = "File name format"; + // + // headerButton + // + this.headerButton.Enabled = false; + this.headerButton.Location = new System.Drawing.Point(108, 196); + this.headerButton.Name = "headerButton"; + this.headerButton.Size = new System.Drawing.Size(146, 23); + this.headerButton.TabIndex = 19; + this.headerButton.Text = "Header"; + this.headerButton.UseVisualStyleBackColor = true; + this.headerButton.Click += new System.EventHandler(this.headerButton_Click); + // + // commonItemsButton + // + this.commonItemsButton.Enabled = false; + this.commonItemsButton.Location = new System.Drawing.Point(108, 239); + this.commonItemsButton.Name = "commonItemsButton"; + this.commonItemsButton.Size = new System.Drawing.Size(146, 23); + this.commonItemsButton.TabIndex = 22; + this.commonItemsButton.Text = "Common items"; + this.commonItemsButton.UseVisualStyleBackColor = true; + this.commonItemsButton.Click += new System.EventHandler(this.commonItemsButton_Click); + // + // rootTagTextBox + // + this.rootTagTextBox.Enabled = false; + this.rootTagTextBox.Location = new System.Drawing.Point(108, 219); + this.rootTagTextBox.Name = "rootTagTextBox"; + this.rootTagTextBox.Size = new System.Drawing.Size(146, 20); + this.rootTagTextBox.TabIndex = 21; + // + // rootTagLabel + // + this.rootTagLabel.AutoSize = true; + this.rootTagLabel.Location = new System.Drawing.Point(17, 222); + this.rootTagLabel.Name = "rootTagLabel"; + this.rootTagLabel.Size = new System.Drawing.Size(48, 13); + this.rootTagLabel.TabIndex = 20; + this.rootTagLabel.Text = "Root tag"; + // + // testTagLabel + // + this.testTagLabel.AutoSize = true; + this.testTagLabel.Location = new System.Drawing.Point(17, 308); + this.testTagLabel.Name = "testTagLabel"; + this.testTagLabel.Size = new System.Drawing.Size(46, 13); + this.testTagLabel.TabIndex = 23; + this.testTagLabel.Text = "Test tag"; + // + // testTagTextBox + // + this.testTagTextBox.Enabled = false; + this.testTagTextBox.Location = new System.Drawing.Point(108, 305); + this.testTagTextBox.Name = "testTagTextBox"; + this.testTagTextBox.Size = new System.Drawing.Size(146, 20); + this.testTagTextBox.TabIndex = 24; + // + // meterTagLabel + // + this.meterTagLabel.AutoSize = true; + this.meterTagLabel.Location = new System.Drawing.Point(17, 265); + this.meterTagLabel.Name = "meterTagLabel"; + this.meterTagLabel.Size = new System.Drawing.Size(52, 13); + this.meterTagLabel.TabIndex = 26; + this.meterTagLabel.Text = "Meter tag"; + // + // meterTagTextBox + // + this.meterTagTextBox.Enabled = false; + this.meterTagTextBox.Location = new System.Drawing.Point(108, 262); + this.meterTagTextBox.Name = "meterTagTextBox"; + this.meterTagTextBox.Size = new System.Drawing.Size(146, 20); + this.meterTagTextBox.TabIndex = 27; + // + // meterItemsButton + // + this.meterItemsButton.Enabled = false; + this.meterItemsButton.Location = new System.Drawing.Point(108, 282); + this.meterItemsButton.Name = "meterItemsButton"; + this.meterItemsButton.Size = new System.Drawing.Size(146, 23); + this.meterItemsButton.TabIndex = 28; + this.meterItemsButton.Text = "Meter items"; + this.meterItemsButton.UseVisualStyleBackColor = true; + this.meterItemsButton.Click += new System.EventHandler(this.meterItemsButton_Click); + // + // WriterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.meterTagLabel); + this.Controls.Add(this.meterTagTextBox); + this.Controls.Add(this.meterItemsButton); + this.Controls.Add(this.testTagLabel); + this.Controls.Add(this.testTagTextBox); + this.Controls.Add(this.rootTagLabel); + this.Controls.Add(this.rootTagTextBox); + this.Controls.Add(this.commonItemsButton); + this.Controls.Add(this.headerButton); + this.Controls.Add(this.fileNameFmtTextBox); + this.Controls.Add(this.fileNameFmtLabel); + this.Controls.Add(this.destination2Button); + this.Controls.Add(this.destination2TextBox); + this.Controls.Add(this.destination2Label); + this.Controls.Add(this.dayFoldersComboBox); + this.Controls.Add(this.monthFoldersComboBox); + this.Controls.Add(this.yearFoldersComboBox); + this.Controls.Add(this.dayFoldersLabel); + this.Controls.Add(this.monthFoldersLabel); + this.Controls.Add(this.yearFoldersLabel); + this.Controls.Add(this.testItemsButton); + this.Controls.Add(this.cultureComboBox); + this.Controls.Add(this.cultureLabel); + this.Controls.Add(this.destinationButton); + this.Controls.Add(this.destinationTextBox); + this.Controls.Add(this.destinationLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "WriterCfgCtrl"; + this.Size = new System.Drawing.Size(400, 350); + this.Load += new System.EventHandler(this.WriterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.TextBox destinationTextBox; + private System.Windows.Forms.Label destinationLabel; + private System.Windows.Forms.Button destinationButton; + private System.Windows.Forms.Label cultureLabel; + private System.Windows.Forms.ComboBox cultureComboBox; + private System.Windows.Forms.Button testItemsButton; + private System.Windows.Forms.Label yearFoldersLabel; + private System.Windows.Forms.Label monthFoldersLabel; + private System.Windows.Forms.Label dayFoldersLabel; + private System.Windows.Forms.ComboBox yearFoldersComboBox; + private System.Windows.Forms.ComboBox monthFoldersComboBox; + private System.Windows.Forms.ComboBox dayFoldersComboBox; + private System.Windows.Forms.Button destination2Button; + private System.Windows.Forms.TextBox destination2TextBox; + private System.Windows.Forms.Label destination2Label; + private System.Windows.Forms.TextBox fileNameFmtTextBox; + private System.Windows.Forms.Label fileNameFmtLabel; + private System.Windows.Forms.Button headerButton; + private System.Windows.Forms.Button commonItemsButton; + private System.Windows.Forms.TextBox rootTagTextBox; + private System.Windows.Forms.Label rootTagLabel; + private System.Windows.Forms.Label testTagLabel; + private System.Windows.Forms.TextBox testTagTextBox; + private System.Windows.Forms.Label meterTagLabel; + private System.Windows.Forms.TextBox meterTagTextBox; + private System.Windows.Forms.Button meterItemsButton; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/XmlBatch/WriterCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/XmlBatch/WriterCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/FileWriters/XmlBatch/WriterCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/HeaderFooterDlg.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/HeaderFooterDlg.Designer.cs new file mode 100644 index 00000000..3d58a2cb --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/HeaderFooterDlg.Designer.cs @@ -0,0 +1,85 @@ +namespace TBF.BenchControl.Output +{ + partial class HeaderFooterDlg + { + /// + /// 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() + { + this.okButton = new System.Windows.Forms.Button(); + this.cancelButton = new System.Windows.Forms.Button(); + this.textBox = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // okButton + // + this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK; + this.okButton.Location = new System.Drawing.Point(393, 169); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(75, 34); + this.okButton.TabIndex = 1; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + // + // cancelButton + // + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cancelButton.Location = new System.Drawing.Point(484, 169); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(75, 34); + this.cancelButton.TabIndex = 2; + this.cancelButton.Text = "Cancel"; + this.cancelButton.UseVisualStyleBackColor = true; + // + // textBox + // + this.textBox.Location = new System.Drawing.Point(12, 12); + this.textBox.Multiline = true; + this.textBox.Name = "textBox"; + this.textBox.Size = new System.Drawing.Size(547, 142); + this.textBox.TabIndex = 0; + // + // HeaderFooterDlg + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(571, 216); + this.Controls.Add(this.textBox); + this.Controls.Add(this.cancelButton); + this.Controls.Add(this.okButton); + this.Name = "HeaderFooterDlg"; + this.Text = "Enter text"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.TextBox textBox; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/HeaderFooterDlg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/HeaderFooterDlg.cs new file mode 100644 index 00000000..3ceb9fe3 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/HeaderFooterDlg.cs @@ -0,0 +1,29 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Windows.Forms; +using TBF.Resources; + +namespace TBF.BenchControl.Output +{ + public partial class HeaderFooterDlg : Form + { + public string EditedText + { + set { textBox.Text = value; } + get { return textBox.Text; } + } + + public HeaderFooterDlg() + { + InitializeComponent(); + } + + public HeaderFooterDlg(bool isHeader, string text) + : this() + { + Text = isHeader ? Strings.Header : Strings.Footer; + textBox.Text = text; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/HeaderFooterDlg.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/HeaderFooterDlg.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/HeaderFooterDlg.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Enhanced/FactoryCompound.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Enhanced/FactoryCompound.cs new file mode 100644 index 00000000..46f1a8bc --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Enhanced/FactoryCompound.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.Printers.Enhanced +{ + public class FactoryCompound : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".Compound"; } } + + public void ResetStaticProperties() { Printer.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Printer(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Printer(cfg); } + + public IComponentCfg DefaultConfig() { return new PrinterCfg("Printer.Enhanced.Compound", this, Config.Entities.MetersKind.Combined); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(PrinterCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Enhanced/FactoryHeatMeters.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Enhanced/FactoryHeatMeters.cs new file mode 100644 index 00000000..f3d6f51c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Enhanced/FactoryHeatMeters.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.Printers.Enhanced +{ + public class FactoryHeatMeters : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".HeatMeters"; } } + + public void ResetStaticProperties() { Printer.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Printer(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Printer(cfg); } + + public IComponentCfg DefaultConfig() { return new PrinterCfg("Printer.Enhanced.HeatMeters", this, Config.Entities.MetersKind.HeatMeter); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(PrinterCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Enhanced/FactorySingle.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Enhanced/FactorySingle.cs new file mode 100644 index 00000000..fb2214e5 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Enhanced/FactorySingle.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.Printers.Enhanced +{ + public class FactorySingle : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".Single"; } } + + public void ResetStaticProperties() { Printer.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Printer(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Printer(cfg); } + + public IComponentCfg DefaultConfig() { return new PrinterCfg("Printer.Enhanced.Single", this, Config.Entities.MetersKind.Single); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(PrinterCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Enhanced/Printer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Enhanced/Printer.cs new file mode 100644 index 00000000..db32afad --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Enhanced/Printer.cs @@ -0,0 +1,198 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Threading; +using Results.Output.Printers.Enhanced; +using log4net; + +namespace TBF.BenchControl.Output.Printers.Enhanced +{ + public class Printer : ComponentBase, IOperation, GenericDevices.IResultsPrinter + { + private static readonly ILog log = LogManager.GetLogger(typeof(Printer)); + public override string ToString() { return string.Format("Output.Printers.Enhanced({0})", Cfg.ToString(1)); } + + readonly PrinterCfg printerCfg; + + public bool SupressPrinting { get { return printerCfg.SupressPrinting; } } + + /// Data to print + Results.Entities.Batch batch; + + /// + /// Items to print + /// + string header; + IList commonItems; + IList testItems; + string footer; + + + public Printer() { } + + public Printer(Generic.IComponentCfg cfg) + : base(cfg) + { + printerCfg = cfg as PrinterCfg; + ApplyConfig(); + log.Debug(this.ToString()); + } + + + void ApplyConfig() + { + header = string.IsNullOrEmpty(printerCfg.Header) ? string.Empty : printerCfg.Header.Replace("~", Environment.NewLine); + commonItems = Results.WMeterRsltItemSpec.FromStrArray(printerCfg.CommonItems); + testItems = Results.WMeterRsltItemSpec.FromStrArray(printerCfg.SelectedItems); /// TestID info will be overwritten later on + footer = string.IsNullOrEmpty(printerCfg.Footer) ? string.Empty : printerCfg.Footer.Replace("~", Environment.NewLine); + } + + + #region Configuration Change Handling + + public static void OnCfgChange(object sender, CfgChangeArgs args) + { + if (CfgChangeHandler == null) return; + try { CfgChangeHandler(sender, args); } + catch (Exception e) { log.Error("CfgChangeHandler(...) failed", e); } + } + + public static event EventHandler CfgChangeHandler; + + public override void StartChangeHandler() + { + CfgChangeHandler += delegate(object sender, CfgChangeArgs args) + { + PrinterCfg newCfg = args.Cfg as PrinterCfg; + if (newCfg != null && newCfg.Name.Equals(Name)) + { + if (args.Command == CfgChangeCmd.CfgChange) + { + printerCfg.PageOrientation = newCfg.PageOrientation; + printerCfg.Template = newCfg.Template; + printerCfg.TopMargin = newCfg.TopMargin; + printerCfg.BottomMargin = newCfg.BottomMargin; + printerCfg.LeftMargin = newCfg.LeftMargin; + + printerCfg.TitFntFml = newCfg.TitFntFml; + printerCfg.TitFntSz = newCfg.TitFntSz; + printerCfg.TitFntSty = newCfg.TitFntSty; + printerCfg.HdrFntFml = newCfg.HdrFntFml; + printerCfg.HdrFntSz = newCfg.HdrFntSz; + printerCfg.HdrFntSty = newCfg.HdrFntSty; + printerCfg.BodyFntFml = newCfg.BodyFntFml; + printerCfg.BodyFntSz = newCfg.BodyFntSz; + printerCfg.BodyFntSty = newCfg.BodyFntSty; + printerCfg.FooterFntFml = newCfg.FooterFntFml; + printerCfg.FooterFntSz = newCfg.FooterFntSz; + printerCfg.FooterFntSty = newCfg.FooterFntSty; + + printerCfg.GoodOnly = newCfg.GoodOnly; + printerCfg.SupressPrinting = newCfg.SupressPrinting; + printerCfg.Culture = newCfg.Culture; + printerCfg.CommonItems = newCfg.CommonItems; + printerCfg.SelectedItems = newCfg.SelectedItems; + printerCfg.Header = newCfg.Header; + printerCfg.Footer = newCfg.Footer; + + printerCfg.DocName = newCfg.DocName; + + ApplyConfig(); + } + } + }; + } + + #endregion Configuration Change Handling + + + /// + /// Prints the test cycle results, Events: Event.ResultsPrinted + /// + /// Batch results to print + /// Reference to the operation + public IOperation PrintResultsOp(Results.Entities.Batch batch) + { + this.batch = batch; + return this; + } + + /// Start this operation + public void Start() + { + CultureInfo oriCulture = Thread.CurrentThread.CurrentCulture; + + if (printerCfg.Culture != Culture.system) + { + Thread.CurrentThread.CurrentCulture = new CultureInfo(printerCfg.Culture.ToString()); + } + + string documentName; + try + { + if (string.IsNullOrEmpty(printerCfg.DocName)) throw (new Exception()); + documentName = string.Format(printerCfg.DocName, batch.StartTime, batch.EndTime, batch.BatchNr); + } + catch + { + documentName = string.Format("{0:yyyyMMdd-HHmm}", batch.EndTime); + } + + PrintResults(batch, documentName); + + Thread.CurrentThread.CurrentCulture = oriCulture; + } + + /// Run this operation + /// Event.ResultsPrinted + public Event Run() + { + return Event.ResultsPrinted; + } + + /// Stop this operation + public void Stop() + { + } + + + void PrintResults(Results.Entities.Batch batch, string documentName) + { + if (batch.WaterMeters.Count > 0) + { + EnhancedPrinterCfg cfg = new EnhancedPrinterCfg + { + PageOrientation = printerCfg.PageOrientation, + Template = printerCfg.Template, + TopMargin = printerCfg.TopMargin, + BottomMargin = printerCfg.BottomMargin, + LeftMargin = printerCfg.LeftMargin, + TitFntFml = printerCfg.TitFntFml, + TitFntSz = printerCfg.TitFntSz, + TitFntSty = printerCfg.TitFntSty, + HdrFntFml = printerCfg.HdrFntFml, + HdrFntSz = printerCfg.HdrFntSz, + HdrFntSty = printerCfg.HdrFntSty, + BodyFntFml = printerCfg.BodyFntFml, + BodyFntSz = printerCfg.BodyFntSz, + BodyFntSty = printerCfg.BodyFntSty, + FooterFntFml = printerCfg.FooterFntFml, + FooterFntSz = printerCfg.FooterFntSz, + FooterFntSty = printerCfg.FooterFntSty, + GoodOnly = printerCfg.GoodOnly, + SupressPrinting = printerCfg.SupressPrinting, + CultureInfo = (printerCfg.Culture == Culture.system) ? Thread.CurrentThread.CurrentCulture : new CultureInfo(printerCfg.Culture.ToString()), + Header = printerCfg.Header, + CommonItems = printerCfg.CommonItems, + TestItems = printerCfg.SelectedItems, + Footer = printerCfg.Footer, + }; + + new Results.Output.Printers.Enhanced.EnhancedPrintDocument(batch, cfg, documentName).Print(); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Enhanced/PrinterCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Enhanced/PrinterCfg.cs new file mode 100644 index 00000000..0cc0fe3e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Enhanced/PrinterCfg.cs @@ -0,0 +1,98 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.Printers.Enhanced +{ + public class PrinterCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(PrinterCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new PrinterCfgCtrl(); } + + /// + /// Serialized parameters + /// + public PageOrientation PageOrientation; + public string Template; + public int TopMargin; + public int BottomMargin; + public int LeftMargin; + public string TitFntFml; + public string HdrFntFml; + public string BodyFntFml; + public string FooterFntFml; + public int TitFntSz; + public int HdrFntSz; + public int BodyFntSz; + public int FooterFntSz; + public int TitFntSty; + public int HdrFntSty; + public int BodyFntSty; + public int FooterFntSty; + public bool GoodOnly; + public bool SupressPrinting; /// Bypass printing when true + public Culture Culture; + public string[] CommonItems; + public string[] SelectedItems; + public string Header; /// =Title + public string Footer; + public string DocName; + + [XmlIgnore] + public Config.Entities.MetersKind MetersKind; + + /// Private parameterless constructor invoked by all other (public) constructors + PrinterCfg() + { + } + + public PrinterCfg(string name, IComponentFactory factory, Config.Entities.MetersKind metersKind) + : this() + { + Name = name; + Factory = factory; + MetersKind = metersKind; + + ParentName = string.Empty; + Template = string.Empty; + PageOrientation = PageOrientation.Portrait; + TopMargin = 100; + BottomMargin = 100; + LeftMargin = 100; + TitFntFml = "Arial"; + TitFntSz = 18; + TitFntSty = 1; + HdrFntFml = "Arial"; + HdrFntSz = 10; + HdrFntSty = 0; + BodyFntFml = "Arial"; + BodyFntSz = 10; + BodyFntSty = 0; + FooterFntFml = "Arial"; + FooterFntSz = 10; + FooterFntSty = 0; + GoodOnly = false; + SupressPrinting = false; + Header = string.Empty; + Footer = string.Empty; + DocName = string.Empty; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Orientation={1}, Margins T={2} B={3} L={4}, SupressPrinting={5}", + Name, + PageOrientation, + TopMargin, + BottomMargin, + LeftMargin, + SupressPrinting ? "yes" : "no" + ); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Enhanced/PrinterCfgCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Enhanced/PrinterCfgCtrl.Designer.cs new file mode 100644 index 00000000..0fc3ec84 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Enhanced/PrinterCfgCtrl.Designer.cs @@ -0,0 +1,579 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.Output.Printers.Enhanced +{ + partial class PrinterCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.supressPrintingCheckBox = new System.Windows.Forms.CheckBox(); + this.orientationLabel = new System.Windows.Forms.Label(); + this.orientationComboBox = new System.Windows.Forms.ComboBox(); + this.topMarginTextBox = new System.Windows.Forms.TextBox(); + this.topMarginLabel = new System.Windows.Forms.Label(); + this.leftMarginTextBox = new System.Windows.Forms.TextBox(); + this.bottomMarginTextBox = new System.Windows.Forms.TextBox(); + this.cultureComboBox = new System.Windows.Forms.ComboBox(); + this.cultureLabel = new System.Windows.Forms.Label(); + this.commonItemsButton = new System.Windows.Forms.Button(); + this.footerButton = new System.Windows.Forms.Button(); + this.headerButton = new System.Windows.Forms.Button(); + this.testItemsButton = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.docNameTextBox = new System.Windows.Forms.TextBox(); + this.docNameLabel = new System.Windows.Forms.Label(); + this.goodOnlyCheckBox = new System.Windows.Forms.CheckBox(); + this.footerItalicCheckBox = new System.Windows.Forms.CheckBox(); + this.footerBoldCheckBox = new System.Windows.Forms.CheckBox(); + this.footerFontSizeTextBox = new System.Windows.Forms.TextBox(); + this.footerFontFamilyComboBox = new System.Windows.Forms.ComboBox(); + this.footerFontLabel = new System.Windows.Forms.Label(); + this.bodyItalicCheckBox = new System.Windows.Forms.CheckBox(); + this.bodyBoldCheckBox = new System.Windows.Forms.CheckBox(); + this.headerItalicCheckBox = new System.Windows.Forms.CheckBox(); + this.headerBoldCheckBox = new System.Windows.Forms.CheckBox(); + this.titleItalicCheckBox = new System.Windows.Forms.CheckBox(); + this.titleBoldCheckBox = new System.Windows.Forms.CheckBox(); + this.bodyFontSizeTextBox = new System.Windows.Forms.TextBox(); + this.headerFontSizeTextBox = new System.Windows.Forms.TextBox(); + this.titleFontSizeTextBox = new System.Windows.Forms.TextBox(); + this.bodyFontFamilyComboBox = new System.Windows.Forms.ComboBox(); + this.bodyFontLabel = new System.Windows.Forms.Label(); + this.headerFontFamilyComboBox = new System.Windows.Forms.ComboBox(); + this.titleFontFamilyComboBox = new System.Windows.Forms.ComboBox(); + this.titleFontLabel = new System.Windows.Forms.Label(); + this.headerFontLabel = new System.Windows.Forms.Label(); + this.templateTextBox = new System.Windows.Forms.TextBox(); + this.templateLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(142, 39); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(218, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(16, 42); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(139, 16); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // supressPrintingCheckBox + // + this.supressPrintingCheckBox.AutoSize = true; + this.supressPrintingCheckBox.Enabled = false; + this.supressPrintingCheckBox.Location = new System.Drawing.Point(19, 259); + this.supressPrintingCheckBox.Name = "supressPrintingCheckBox"; + this.supressPrintingCheckBox.Size = new System.Drawing.Size(101, 17); + this.supressPrintingCheckBox.TabIndex = 33; + this.supressPrintingCheckBox.Text = "Supress printing"; + this.supressPrintingCheckBox.UseVisualStyleBackColor = true; + // + // orientationLabel + // + this.orientationLabel.AutoSize = true; + this.orientationLabel.Location = new System.Drawing.Point(16, 86); + this.orientationLabel.Name = "orientationLabel"; + this.orientationLabel.Size = new System.Drawing.Size(84, 13); + this.orientationLabel.TabIndex = 5; + this.orientationLabel.Text = "Page orientation"; + // + // orientationComboBox + // + this.orientationComboBox.Enabled = false; + this.orientationComboBox.FormattingEnabled = true; + this.orientationComboBox.Location = new System.Drawing.Point(142, 83); + this.orientationComboBox.Name = "orientationComboBox"; + this.orientationComboBox.Size = new System.Drawing.Size(218, 21); + this.orientationComboBox.TabIndex = 6; + // + // topMarginTextBox + // + this.topMarginTextBox.Enabled = false; + this.topMarginTextBox.Location = new System.Drawing.Point(142, 106); + this.topMarginTextBox.Name = "topMarginTextBox"; + this.topMarginTextBox.Size = new System.Drawing.Size(44, 20); + this.topMarginTextBox.TabIndex = 8; + // + // topMarginLabel + // + this.topMarginLabel.AutoSize = true; + this.topMarginLabel.Location = new System.Drawing.Point(16, 109); + this.topMarginLabel.Name = "topMarginLabel"; + this.topMarginLabel.Size = new System.Drawing.Size(116, 13); + this.topMarginLabel.TabIndex = 7; + this.topMarginLabel.Text = "Top/bottom/left margin"; + // + // leftMarginTextBox + // + this.leftMarginTextBox.Enabled = false; + this.leftMarginTextBox.Location = new System.Drawing.Point(244, 106); + this.leftMarginTextBox.Name = "leftMarginTextBox"; + this.leftMarginTextBox.Size = new System.Drawing.Size(44, 20); + this.leftMarginTextBox.TabIndex = 10; + // + // bottomMarginTextBox + // + this.bottomMarginTextBox.Enabled = false; + this.bottomMarginTextBox.Location = new System.Drawing.Point(193, 106); + this.bottomMarginTextBox.Name = "bottomMarginTextBox"; + this.bottomMarginTextBox.Size = new System.Drawing.Size(44, 20); + this.bottomMarginTextBox.TabIndex = 9; + // + // cultureComboBox + // + this.cultureComboBox.Enabled = false; + this.cultureComboBox.FormattingEnabled = true; + this.cultureComboBox.Location = new System.Drawing.Point(142, 215); + this.cultureComboBox.Name = "cultureComboBox"; + this.cultureComboBox.Size = new System.Drawing.Size(218, 21); + this.cultureComboBox.TabIndex = 32; + // + // cultureLabel + // + this.cultureLabel.AutoSize = true; + this.cultureLabel.Location = new System.Drawing.Point(16, 218); + this.cultureLabel.Name = "cultureLabel"; + this.cultureLabel.Size = new System.Drawing.Size(42, 13); + this.cultureLabel.TabIndex = 31; + this.cultureLabel.Text = "Cullture"; + // + // commonItemsButton + // + this.commonItemsButton.Enabled = false; + this.commonItemsButton.Location = new System.Drawing.Point(142, 259); + this.commonItemsButton.Name = "commonItemsButton"; + this.commonItemsButton.Size = new System.Drawing.Size(218, 23); + this.commonItemsButton.TabIndex = 36; + this.commonItemsButton.Text = "Common items"; + this.commonItemsButton.UseVisualStyleBackColor = true; + this.commonItemsButton.Click += new System.EventHandler(this.commonItemsButton_Click); + // + // footerButton + // + this.footerButton.Enabled = false; + this.footerButton.Location = new System.Drawing.Point(142, 303); + this.footerButton.Name = "footerButton"; + this.footerButton.Size = new System.Drawing.Size(218, 23); + this.footerButton.TabIndex = 38; + this.footerButton.Text = "Footer"; + this.footerButton.UseVisualStyleBackColor = true; + this.footerButton.Click += new System.EventHandler(this.footerButton_Click); + // + // headerButton + // + this.headerButton.Enabled = false; + this.headerButton.Location = new System.Drawing.Point(142, 237); + this.headerButton.Name = "headerButton"; + this.headerButton.Size = new System.Drawing.Size(218, 23); + this.headerButton.TabIndex = 35; + this.headerButton.Text = "Title"; + this.headerButton.UseVisualStyleBackColor = true; + this.headerButton.Click += new System.EventHandler(this.headerButton_Click); + // + // testItemsButton + // + this.testItemsButton.Enabled = false; + this.testItemsButton.Location = new System.Drawing.Point(142, 281); + this.testItemsButton.Name = "testItemsButton"; + this.testItemsButton.Size = new System.Drawing.Size(218, 23); + this.testItemsButton.TabIndex = 37; + this.testItemsButton.Text = "Test items"; + this.testItemsButton.UseVisualStyleBackColor = true; + this.testItemsButton.Click += new System.EventHandler(this.testItemsButton_Click); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label1.Location = new System.Drawing.Point(296, 114); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(32, 13); + this.label1.TabIndex = 41; + this.label1.Text = "Bold"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label2.Location = new System.Drawing.Point(330, 114); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(24, 13); + this.label2.TabIndex = 42; + this.label2.Text = "Ital."; + // + // docNameTextBox + // + this.docNameTextBox.Enabled = false; + this.docNameTextBox.Location = new System.Drawing.Point(197, 328); + this.docNameTextBox.Name = "docNameTextBox"; + this.docNameTextBox.Size = new System.Drawing.Size(163, 20); + this.docNameTextBox.TabIndex = 40; + // + // docNameLabel + // + this.docNameLabel.AutoSize = true; + this.docNameLabel.Location = new System.Drawing.Point(16, 331); + this.docNameLabel.Name = "docNameLabel"; + this.docNameLabel.Size = new System.Drawing.Size(175, 13); + this.docNameLabel.TabIndex = 39; + this.docNameLabel.Text = "Doc.name (0=start 1-end, 2=batch):"; + // + // goodOnlyCheckBox + // + this.goodOnlyCheckBox.AutoSize = true; + this.goodOnlyCheckBox.Enabled = false; + this.goodOnlyCheckBox.Location = new System.Drawing.Point(19, 281); + this.goodOnlyCheckBox.Name = "goodOnlyCheckBox"; + this.goodOnlyCheckBox.Size = new System.Drawing.Size(74, 17); + this.goodOnlyCheckBox.TabIndex = 34; + this.goodOnlyCheckBox.Text = "Good only"; + this.goodOnlyCheckBox.UseVisualStyleBackColor = true; + // + // footerItalicCheckBox + // + this.footerItalicCheckBox.AutoSize = true; + this.footerItalicCheckBox.Enabled = false; + this.footerItalicCheckBox.Location = new System.Drawing.Point(334, 196); + this.footerItalicCheckBox.Name = "footerItalicCheckBox"; + this.footerItalicCheckBox.Size = new System.Drawing.Size(15, 14); + this.footerItalicCheckBox.TabIndex = 30; + this.footerItalicCheckBox.UseVisualStyleBackColor = true; + // + // footerBoldCheckBox + // + this.footerBoldCheckBox.AutoSize = true; + this.footerBoldCheckBox.Enabled = false; + this.footerBoldCheckBox.Location = new System.Drawing.Point(306, 196); + this.footerBoldCheckBox.Name = "footerBoldCheckBox"; + this.footerBoldCheckBox.Size = new System.Drawing.Size(15, 14); + this.footerBoldCheckBox.TabIndex = 29; + this.footerBoldCheckBox.UseVisualStyleBackColor = true; + // + // footerFontSizeTextBox + // + this.footerFontSizeTextBox.Enabled = false; + this.footerFontSizeTextBox.Location = new System.Drawing.Point(258, 193); + this.footerFontSizeTextBox.Name = "footerFontSizeTextBox"; + this.footerFontSizeTextBox.Size = new System.Drawing.Size(29, 20); + this.footerFontSizeTextBox.TabIndex = 28; + // + // footerFontFamilyComboBox + // + this.footerFontFamilyComboBox.Enabled = false; + this.footerFontFamilyComboBox.FormattingEnabled = true; + this.footerFontFamilyComboBox.Location = new System.Drawing.Point(142, 193); + this.footerFontFamilyComboBox.Name = "footerFontFamilyComboBox"; + this.footerFontFamilyComboBox.Size = new System.Drawing.Size(110, 21); + this.footerFontFamilyComboBox.TabIndex = 27; + // + // footerFontLabel + // + this.footerFontLabel.AutoSize = true; + this.footerFontLabel.Location = new System.Drawing.Point(16, 196); + this.footerFontLabel.Name = "footerFontLabel"; + this.footerFontLabel.Size = new System.Drawing.Size(107, 13); + this.footerFontLabel.TabIndex = 26; + this.footerFontLabel.Text = "Footer font/size/style"; + // + // bodyItalicCheckBox + // + this.bodyItalicCheckBox.AutoSize = true; + this.bodyItalicCheckBox.Enabled = false; + this.bodyItalicCheckBox.Location = new System.Drawing.Point(334, 174); + this.bodyItalicCheckBox.Name = "bodyItalicCheckBox"; + this.bodyItalicCheckBox.Size = new System.Drawing.Size(15, 14); + this.bodyItalicCheckBox.TabIndex = 25; + this.bodyItalicCheckBox.UseVisualStyleBackColor = true; + // + // bodyBoldCheckBox + // + this.bodyBoldCheckBox.AutoSize = true; + this.bodyBoldCheckBox.Enabled = false; + this.bodyBoldCheckBox.Location = new System.Drawing.Point(306, 174); + this.bodyBoldCheckBox.Name = "bodyBoldCheckBox"; + this.bodyBoldCheckBox.Size = new System.Drawing.Size(15, 14); + this.bodyBoldCheckBox.TabIndex = 24; + this.bodyBoldCheckBox.UseVisualStyleBackColor = true; + // + // headerItalicCheckBox + // + this.headerItalicCheckBox.AutoSize = true; + this.headerItalicCheckBox.Enabled = false; + this.headerItalicCheckBox.Location = new System.Drawing.Point(334, 152); + this.headerItalicCheckBox.Name = "headerItalicCheckBox"; + this.headerItalicCheckBox.Size = new System.Drawing.Size(15, 14); + this.headerItalicCheckBox.TabIndex = 20; + this.headerItalicCheckBox.UseVisualStyleBackColor = true; + // + // headerBoldCheckBox + // + this.headerBoldCheckBox.AutoSize = true; + this.headerBoldCheckBox.Enabled = false; + this.headerBoldCheckBox.Location = new System.Drawing.Point(306, 152); + this.headerBoldCheckBox.Name = "headerBoldCheckBox"; + this.headerBoldCheckBox.Size = new System.Drawing.Size(15, 14); + this.headerBoldCheckBox.TabIndex = 19; + this.headerBoldCheckBox.UseVisualStyleBackColor = true; + // + // titleItalicCheckBox + // + this.titleItalicCheckBox.AutoSize = true; + this.titleItalicCheckBox.Enabled = false; + this.titleItalicCheckBox.Location = new System.Drawing.Point(334, 130); + this.titleItalicCheckBox.Name = "titleItalicCheckBox"; + this.titleItalicCheckBox.Size = new System.Drawing.Size(15, 14); + this.titleItalicCheckBox.TabIndex = 15; + this.titleItalicCheckBox.UseVisualStyleBackColor = true; + // + // titleBoldCheckBox + // + this.titleBoldCheckBox.AutoSize = true; + this.titleBoldCheckBox.Enabled = false; + this.titleBoldCheckBox.Location = new System.Drawing.Point(306, 130); + this.titleBoldCheckBox.Name = "titleBoldCheckBox"; + this.titleBoldCheckBox.Size = new System.Drawing.Size(15, 14); + this.titleBoldCheckBox.TabIndex = 14; + this.titleBoldCheckBox.UseVisualStyleBackColor = true; + // + // bodyFontSizeTextBox + // + this.bodyFontSizeTextBox.Enabled = false; + this.bodyFontSizeTextBox.Location = new System.Drawing.Point(258, 171); + this.bodyFontSizeTextBox.Name = "bodyFontSizeTextBox"; + this.bodyFontSizeTextBox.Size = new System.Drawing.Size(29, 20); + this.bodyFontSizeTextBox.TabIndex = 23; + // + // headerFontSizeTextBox + // + this.headerFontSizeTextBox.Enabled = false; + this.headerFontSizeTextBox.Location = new System.Drawing.Point(258, 149); + this.headerFontSizeTextBox.Name = "headerFontSizeTextBox"; + this.headerFontSizeTextBox.Size = new System.Drawing.Size(30, 20); + this.headerFontSizeTextBox.TabIndex = 18; + // + // titleFontSizeTextBox + // + this.titleFontSizeTextBox.Enabled = false; + this.titleFontSizeTextBox.Location = new System.Drawing.Point(258, 127); + this.titleFontSizeTextBox.Name = "titleFontSizeTextBox"; + this.titleFontSizeTextBox.Size = new System.Drawing.Size(30, 20); + this.titleFontSizeTextBox.TabIndex = 13; + // + // bodyFontFamilyComboBox + // + this.bodyFontFamilyComboBox.Enabled = false; + this.bodyFontFamilyComboBox.FormattingEnabled = true; + this.bodyFontFamilyComboBox.Location = new System.Drawing.Point(142, 171); + this.bodyFontFamilyComboBox.Name = "bodyFontFamilyComboBox"; + this.bodyFontFamilyComboBox.Size = new System.Drawing.Size(110, 21); + this.bodyFontFamilyComboBox.TabIndex = 22; + // + // bodyFontLabel + // + this.bodyFontLabel.AutoSize = true; + this.bodyFontLabel.Location = new System.Drawing.Point(16, 174); + this.bodyFontLabel.Name = "bodyFontLabel"; + this.bodyFontLabel.Size = new System.Drawing.Size(101, 13); + this.bodyFontLabel.TabIndex = 21; + this.bodyFontLabel.Text = "Body font/size/style"; + // + // headerFontFamilyComboBox + // + this.headerFontFamilyComboBox.Enabled = false; + this.headerFontFamilyComboBox.FormattingEnabled = true; + this.headerFontFamilyComboBox.Location = new System.Drawing.Point(142, 149); + this.headerFontFamilyComboBox.Name = "headerFontFamilyComboBox"; + this.headerFontFamilyComboBox.Size = new System.Drawing.Size(110, 21); + this.headerFontFamilyComboBox.TabIndex = 17; + // + // titleFontFamilyComboBox + // + this.titleFontFamilyComboBox.Enabled = false; + this.titleFontFamilyComboBox.FormattingEnabled = true; + this.titleFontFamilyComboBox.Location = new System.Drawing.Point(142, 127); + this.titleFontFamilyComboBox.Name = "titleFontFamilyComboBox"; + this.titleFontFamilyComboBox.Size = new System.Drawing.Size(110, 21); + this.titleFontFamilyComboBox.TabIndex = 12; + // + // titleFontLabel + // + this.titleFontLabel.AutoSize = true; + this.titleFontLabel.Location = new System.Drawing.Point(16, 130); + this.titleFontLabel.Name = "titleFontLabel"; + this.titleFontLabel.Size = new System.Drawing.Size(97, 13); + this.titleFontLabel.TabIndex = 11; + this.titleFontLabel.Text = "Title font/size/style"; + // + // headerFontLabel + // + this.headerFontLabel.AutoSize = true; + this.headerFontLabel.Location = new System.Drawing.Point(16, 152); + this.headerFontLabel.Name = "headerFontLabel"; + this.headerFontLabel.Size = new System.Drawing.Size(112, 13); + this.headerFontLabel.TabIndex = 16; + this.headerFontLabel.Text = "Header font/size/style"; + // + // templateTextBox + // + this.templateTextBox.Enabled = false; + this.templateTextBox.Location = new System.Drawing.Point(142, 61); + this.templateTextBox.Name = "templateTextBox"; + this.templateTextBox.Size = new System.Drawing.Size(218, 20); + this.templateTextBox.TabIndex = 4; + // + // templateLabel + // + this.templateLabel.AutoSize = true; + this.templateLabel.Location = new System.Drawing.Point(16, 64); + this.templateLabel.Name = "templateLabel"; + this.templateLabel.Size = new System.Drawing.Size(51, 13); + this.templateLabel.TabIndex = 3; + this.templateLabel.Text = "Template"; + // + // PrinterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.templateTextBox); + this.Controls.Add(this.templateLabel); + this.Controls.Add(this.footerItalicCheckBox); + this.Controls.Add(this.footerBoldCheckBox); + this.Controls.Add(this.footerFontSizeTextBox); + this.Controls.Add(this.footerFontFamilyComboBox); + this.Controls.Add(this.footerFontLabel); + this.Controls.Add(this.bodyItalicCheckBox); + this.Controls.Add(this.bodyBoldCheckBox); + this.Controls.Add(this.headerItalicCheckBox); + this.Controls.Add(this.headerBoldCheckBox); + this.Controls.Add(this.titleItalicCheckBox); + this.Controls.Add(this.titleBoldCheckBox); + this.Controls.Add(this.bodyFontSizeTextBox); + this.Controls.Add(this.headerFontSizeTextBox); + this.Controls.Add(this.titleFontSizeTextBox); + this.Controls.Add(this.bodyFontFamilyComboBox); + this.Controls.Add(this.bodyFontLabel); + this.Controls.Add(this.headerFontFamilyComboBox); + this.Controls.Add(this.titleFontFamilyComboBox); + this.Controls.Add(this.titleFontLabel); + this.Controls.Add(this.headerFontLabel); + this.Controls.Add(this.goodOnlyCheckBox); + this.Controls.Add(this.docNameTextBox); + this.Controls.Add(this.docNameLabel); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.cultureComboBox); + this.Controls.Add(this.cultureLabel); + this.Controls.Add(this.commonItemsButton); + this.Controls.Add(this.footerButton); + this.Controls.Add(this.headerButton); + this.Controls.Add(this.testItemsButton); + this.Controls.Add(this.bottomMarginTextBox); + this.Controls.Add(this.leftMarginTextBox); + this.Controls.Add(this.topMarginTextBox); + this.Controls.Add(this.topMarginLabel); + this.Controls.Add(this.orientationComboBox); + this.Controls.Add(this.orientationLabel); + this.Controls.Add(this.supressPrintingCheckBox); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "PrinterCfgCtrl"; + this.Size = new System.Drawing.Size(400, 350); + this.Load += new System.EventHandler(this.PrinterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.CheckBox supressPrintingCheckBox; + private System.Windows.Forms.Label orientationLabel; + private System.Windows.Forms.ComboBox orientationComboBox; + private System.Windows.Forms.TextBox topMarginTextBox; + private System.Windows.Forms.Label topMarginLabel; + private System.Windows.Forms.TextBox leftMarginTextBox; + private System.Windows.Forms.TextBox bottomMarginTextBox; + private System.Windows.Forms.ComboBox cultureComboBox; + private System.Windows.Forms.Label cultureLabel; + private System.Windows.Forms.Button commonItemsButton; + private System.Windows.Forms.Button footerButton; + private System.Windows.Forms.Button headerButton; + private System.Windows.Forms.Button testItemsButton; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox docNameTextBox; + private System.Windows.Forms.Label docNameLabel; + private System.Windows.Forms.CheckBox goodOnlyCheckBox; + private System.Windows.Forms.CheckBox footerItalicCheckBox; + private System.Windows.Forms.CheckBox footerBoldCheckBox; + private System.Windows.Forms.TextBox footerFontSizeTextBox; + private System.Windows.Forms.ComboBox footerFontFamilyComboBox; + private System.Windows.Forms.Label footerFontLabel; + private System.Windows.Forms.CheckBox bodyItalicCheckBox; + private System.Windows.Forms.CheckBox bodyBoldCheckBox; + private System.Windows.Forms.CheckBox headerItalicCheckBox; + private System.Windows.Forms.CheckBox headerBoldCheckBox; + private System.Windows.Forms.CheckBox titleItalicCheckBox; + private System.Windows.Forms.CheckBox titleBoldCheckBox; + private System.Windows.Forms.TextBox bodyFontSizeTextBox; + private System.Windows.Forms.TextBox headerFontSizeTextBox; + private System.Windows.Forms.TextBox titleFontSizeTextBox; + private System.Windows.Forms.ComboBox bodyFontFamilyComboBox; + private System.Windows.Forms.Label bodyFontLabel; + private System.Windows.Forms.ComboBox headerFontFamilyComboBox; + private System.Windows.Forms.ComboBox titleFontFamilyComboBox; + private System.Windows.Forms.Label titleFontLabel; + private System.Windows.Forms.Label headerFontLabel; + private System.Windows.Forms.TextBox templateTextBox; + private System.Windows.Forms.Label templateLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Enhanced/PrinterCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Enhanced/PrinterCfgCtrl.cs new file mode 100644 index 00000000..a0b160e4 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Enhanced/PrinterCfgCtrl.cs @@ -0,0 +1,356 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; +using TBF.BenchControl.Configs; + +namespace TBF.BenchControl.Output.Printers.Enhanced +{ + public partial class PrinterCfgCtrl : ConfigCtrlUtils, IComponentCfgCtrl + { + static readonly ILog log = LogManager.GetLogger(typeof(PrinterCfgCtrl)); + + public bool ShowMore { get { return false; } } + + PrinterCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as PrinterCfg; + Redraw(); + } + } + + string header; + string[] commonItems; + string[] testItems; + string footer; + + public PrinterCfgCtrl() + { + InitializeComponent(); + Localize(); + + orientationComboBox.Items.Add(PageOrientation.Portrait.ToString()); + orientationComboBox.Items.Add(PageOrientation.Landscape.ToString()); + + foreach (var ff in System.Drawing.FontFamily.Families) + { + titleFontFamilyComboBox.Items.Add(ff.Name); + headerFontFamilyComboBox.Items.Add(ff.Name); + bodyFontFamilyComboBox.Items.Add(ff.Name); + footerFontFamilyComboBox.Items.Add(ff.Name); + } + } + + private void PrinterCfgCtrl_Load(object sender, EventArgs e) + { + for (Culture s = 0; s < Culture.Count; s++) cultureComboBox.Items.Add(s.ToString()); + + header = config.Header; + commonItems = config.CommonItems; + testItems = config.SelectedItems; + footer = config.Footer; + + Redraw(); + } + + void Localize() + { + nameLabel.Text = Strings.Name; + cultureLabel.Text = "Culture"; + headerButton.Text = Strings.Header; + commonItemsButton.Text = "Common items"; + testItemsButton.Text = "Test items"; + footerButton.Text = Strings.Footer; + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + templateTextBox.Text = config.Template; + orientationComboBox.Text = config.PageOrientation.ToString(); + topMarginTextBox.Text = config.TopMargin.ToString(); + bottomMarginTextBox.Text = config.BottomMargin.ToString(); + leftMarginTextBox.Text = config.LeftMargin.ToString(); + + titleFontFamilyComboBox.Text = config.TitFntFml; + titleFontSizeTextBox.Text = config.TitFntSz.ToString(); + titleBoldCheckBox.Checked = ((config.TitFntSty & (int)System.Drawing.FontStyle.Bold) != 0); + titleItalicCheckBox.Checked = ((config.TitFntSty & (int)System.Drawing.FontStyle.Italic) != 0); + + headerFontFamilyComboBox.Text = config.HdrFntFml; + headerFontSizeTextBox.Text = config.HdrFntSz.ToString(); + headerBoldCheckBox.Checked = ((config.HdrFntSty & (int)System.Drawing.FontStyle.Bold) != 0); + headerItalicCheckBox.Checked = ((config.HdrFntSty & (int)System.Drawing.FontStyle.Italic) != 0); + + bodyFontFamilyComboBox.Text = config.BodyFntFml; + bodyFontSizeTextBox.Text = config.BodyFntSz.ToString(); + bodyBoldCheckBox.Checked = ((config.BodyFntSty & (int)System.Drawing.FontStyle.Bold) != 0); + bodyItalicCheckBox.Checked = ((config.BodyFntSty & (int)System.Drawing.FontStyle.Italic) != 0); + + footerFontFamilyComboBox.Text = config.FooterFntFml; + footerFontSizeTextBox.Text = config.FooterFntSz.ToString(); + footerBoldCheckBox.Checked = ((config.FooterFntSty & (int)System.Drawing.FontStyle.Bold) != 0); + footerItalicCheckBox.Checked = ((config.FooterFntSty & (int)System.Drawing.FontStyle.Italic) != 0); + + supressPrintingCheckBox.Checked = config.SupressPrinting; + goodOnlyCheckBox.Checked = config.GoodOnly; + cultureComboBox.Text = config.Culture.ToString(); + + docNameTextBox.Text = config.DocName; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + templateTextBox.Enabled = true; + orientationComboBox.Enabled = true; + topMarginTextBox.Enabled = true; + bottomMarginTextBox.Enabled = true; + leftMarginTextBox.Enabled = true; + titleFontFamilyComboBox.Enabled = true; + titleFontSizeTextBox.Enabled = true; + titleBoldCheckBox.Enabled = true; + titleItalicCheckBox.Enabled = true; + headerFontFamilyComboBox.Enabled = true; + headerFontSizeTextBox.Enabled = true; + headerBoldCheckBox.Enabled = true; + headerItalicCheckBox.Enabled = true; + bodyFontFamilyComboBox.Enabled = true; + bodyFontSizeTextBox.Enabled = true; + bodyBoldCheckBox.Enabled = true; + bodyItalicCheckBox.Enabled = true; + footerFontFamilyComboBox.Enabled = true; + footerFontSizeTextBox.Enabled = true; + footerBoldCheckBox.Enabled = true; + footerItalicCheckBox.Enabled = true; + supressPrintingCheckBox.Enabled = true; + goodOnlyCheckBox.Enabled = true; + cultureComboBox.Enabled = true; + headerButton.Enabled = true; + commonItemsButton.Enabled = true; + testItemsButton.Enabled = true; + footerButton.Enabled = true; + docNameTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if ((int)GetOrientation(orientationComboBox.Text) < 0) + { + message += Environment.NewLine + "Invalid 'Page orientation'"; + flags |= CfgUpdateFlags.Error; + } + + int dummy; + if (!int.TryParse(topMarginTextBox.Text, out dummy) || dummy < 0 || dummy > 500) + { + message += Environment.NewLine + "'Top margin' should be between 0 and 500"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(bottomMarginTextBox.Text, out dummy) || dummy < 0 || dummy > 200) + { + message += Environment.NewLine + "'Bottom margin' should be between 0 and 200"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(leftMarginTextBox.Text, out dummy) || dummy < 0 || dummy > 200) + { + message += Environment.NewLine + "Left margin' should be between 0 and 200"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(titleFontSizeTextBox.Text, out dummy) || dummy < 6 || dummy > 48) + { + message += Environment.NewLine + "Title font size' should be between 6 and 48"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(headerFontSizeTextBox.Text, out dummy) || dummy < 6 || dummy > 48) + { + message += Environment.NewLine + "Header font size' should be between 6 and 48"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(bodyFontSizeTextBox.Text, out dummy) || dummy < 6 || dummy > 48) + { + message += Environment.NewLine + "Body font size' should be between 6 and 48"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(footerFontSizeTextBox.Text, out dummy) || dummy < 4 || dummy > 48) + { + message += Environment.NewLine + "Footer font size' should be between 4 and 48"; + flags |= CfgUpdateFlags.Error; + } + + if (!cultureComboBox.Items.Contains(cultureComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid culture"; + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + if (config.Name != nameTextBox.Text) + { + config.Name = nameTextBox.Text; + flags |= (CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + } + + if (config.PageOrientation != GetOrientation(orientationComboBox.Text)) + { + config.PageOrientation = GetOrientation(orientationComboBox.Text); + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + for (Culture i = 0; i < Culture.Count; i++) + { + if (i.ToString().Equals(cultureComboBox.Text) && (config.Culture != i)) + { + config.Culture = i; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + break; + } + } + + flags |= UpdateDifferent(ref config.Template, templateTextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + + flags |= UpdateDifferent(ref config.TopMargin, topMarginTextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.BottomMargin, bottomMarginTextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.LeftMargin, leftMarginTextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + + /// Title font properties + flags |= UpdateDifferent(ref config.TitFntFml, titleFontFamilyComboBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.TitFntSz, titleFontSizeTextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + int tmp = (titleBoldCheckBox.Checked ? (int)System.Drawing.FontStyle.Bold : 0) + + (titleItalicCheckBox.Checked ? (int)System.Drawing.FontStyle.Italic : 0); + flags |= UpdateDifferent(ref config.TitFntSty, tmp, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + + /// Header font properties + flags |= UpdateDifferent(ref config.HdrFntFml, headerFontFamilyComboBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.HdrFntSz, headerFontSizeTextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + tmp = (headerBoldCheckBox.Checked ? (int)System.Drawing.FontStyle.Bold : 0) + + (headerItalicCheckBox.Checked ? (int)System.Drawing.FontStyle.Italic : 0); + flags |= UpdateDifferent(ref config.HdrFntSty, tmp, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + + /// Body font properties + flags |= UpdateDifferent(ref config.BodyFntFml, bodyFontFamilyComboBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.BodyFntSz, int.Parse(bodyFontSizeTextBox.Text), CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + tmp = (bodyBoldCheckBox.Checked ? (int)System.Drawing.FontStyle.Bold : 0) + + (bodyItalicCheckBox.Checked ? (int)System.Drawing.FontStyle.Italic : 0); + flags |= UpdateDifferent(ref config.BodyFntSty, tmp, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + + /// Footer font properties + flags |= UpdateDifferent(ref config.FooterFntFml, footerFontFamilyComboBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.FooterFntSz, int.Parse(footerFontSizeTextBox.Text), CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + tmp = (footerBoldCheckBox.Checked ? (int)System.Drawing.FontStyle.Bold : 0) + + (footerItalicCheckBox.Checked ? (int)System.Drawing.FontStyle.Italic : 0); + flags |= UpdateDifferent(ref config.FooterFntSty, tmp, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + + flags |= UpdateDifferent(ref config.SupressPrinting, supressPrintingCheckBox.Checked, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.GoodOnly, goodOnlyCheckBox.Checked, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + + flags |= UpdateDifferent(ref config.Header, header, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.CommonItems, commonItems, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.SelectedItems, testItems, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.Footer, footer, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + + flags |= UpdateDifferent(ref config.DocName, docNameTextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + + if ((flags & CfgUpdateFlags.InvokeCfgChange) != 0) + { + Printer.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.CfgChange, config)); + } + + return flags; + } + + private void headerButton_Click(object sender, EventArgs e) + { + HeaderFooterDlg dlg = new HeaderFooterDlg(true, string.IsNullOrEmpty(header) ? string.Empty : header.Replace("~", Environment.NewLine)); + if (dlg.ShowDialog() == DialogResult.OK) + { + header = dlg.EditedText.Replace(Environment.NewLine, "~"); + } + } + + private void commonItemsButton_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg() + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(commonItems), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + commonItems = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems); + } + } + + private void testItemsButton_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg(true) + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(testItems), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + testItems = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems); + } + } + + private void footerButton_Click(object sender, EventArgs e) + { + HeaderFooterDlg dlg = new HeaderFooterDlg(false, string.IsNullOrEmpty(footer) ? string.Empty : footer.Replace("~", Environment.NewLine)); + if (dlg.ShowDialog() == DialogResult.OK) + { + footer = dlg.EditedText.Replace(Environment.NewLine, "~"); + } + } + + #region Configuration Change Handling + + public static void OnCmdResponse(object sender, CmdResponseArgs args) + { + if (CmdResponseHandler == null) return; + try { CmdResponseHandler(sender, args); } + catch (Exception e) { log.Error("CmdResponseHandler(...) failed", e); } + } + + public static event EventHandler CmdResponseHandler; + + public void StartResponseHandler() { } + public void StopResponseHandler() { } + + #endregion Configuration Change Handling + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Enhanced/PrinterCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Enhanced/PrinterCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Enhanced/PrinterCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/LabelPrinter/PrintLabelDocument.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/LabelPrinter/PrintLabelDocument.cs new file mode 100644 index 00000000..20b90015 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/LabelPrinter/PrintLabelDocument.cs @@ -0,0 +1,193 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Printing; +using System.IO; +using Config.Entities; +using TBF.Resources; + +namespace TBF.BenchControl.Output.Printers.LabelPrinter +{ + public class PrintLabelDocument : PrintDocument + { + const int FontSize = 9; + const string FontFamilyName = "Arial"; //"Times New Roman"; + + readonly int paperWidth; + readonly int paperHeight; + readonly string templateFile; + + /// Property variable for the Font the user wishes to use + Font font; + + /// + /// Data to print + /// + Results.Entities.Batch batch; + + /// + /// Layout and status + /// + int nextWMNr; /// nr. of watermeter to be printed as the first one on the next page + int nrPages; + + + /// + /// Constructor + /// + /// Text to be printed + public PrintLabelDocument(Results.Entities.Batch batch, + PageOrientation pageOrientation, + int paperWidth, + int paperHeight, + string templateFile) + { + this.batch = batch; + this.paperWidth = paperWidth; + this.paperHeight = paperHeight; + this.templateFile = templateFile; + + DefaultPageSettings.Landscape = (pageOrientation == PageOrientation.Landscape); + + /// Set print area size and margins (in dots using 80 dpi) + int printHeight = base.DefaultPageSettings.PaperSize.Height - base.DefaultPageSettings.Margins.Top - base.DefaultPageSettings.Margins.Bottom; + int printWidth = base.DefaultPageSettings.PaperSize.Width - base.DefaultPageSettings.Margins.Left - base.DefaultPageSettings.Margins.Right; + int leftMargin = base.DefaultPageSettings.Margins.Left; /// X + int topMargin = base.DefaultPageSettings.Margins.Top; /// Y + + /// Check if the user selected to print in Landscape mode + /// if they did then we need to swap height/width parameters + if (DefaultPageSettings.Landscape) + { + int tmp = printHeight; + printHeight = printWidth; + printWidth = tmp; + } + + /// One watermeter per label/page + nrPages = batch.WaterMeters.Count; + + nextWMNr = 0; + } + + + /// + /// Override the default onbeginPrint method of the PrintDocument Object + /// + /// + /// + protected override void OnBeginPrint(System.Drawing.Printing.PrintEventArgs e) + { + base.OnBeginPrint(e); + + if (font == null) { font = new Font(FontFamilyName, FontSize, FontStyle.Regular); } + } + + + /// + /// Override the default OnPrintPage method of the PrintDocument. + /// + /// + /// This provides the print logic for our document + protected override void OnPrintPage(System.Drawing.Printing.PrintPageEventArgs e) + { + /// Run base code + base.OnPrintPage(e); + + if (File.Exists(templateFile)) + { + Image img = Image.FromFile(templateFile); + e.Graphics.DrawImage(new Bitmap(img), new Rectangle(0, 0, paperWidth, paperHeight)); + } + + /// Set print area size and margins (in dots using 80 dpi) + int printHeight = base.DefaultPageSettings.PaperSize.Height - base.DefaultPageSettings.Margins.Top - base.DefaultPageSettings.Margins.Bottom; + int printWidth = base.DefaultPageSettings.PaperSize.Width - base.DefaultPageSettings.Margins.Left - base.DefaultPageSettings.Margins.Right; + int leftMargin = base.DefaultPageSettings.Margins.Left; /// X + int topMargin = base.DefaultPageSettings.Margins.Top; /// Y + + /// Check if the user selected to print in Landscape mode + /// if they did then we need to swap height/width parameters + if (base.DefaultPageSettings.Landscape) + { + int tmp = printHeight; + printHeight = printWidth; + printWidth = tmp; + } + + int x = leftMargin; + int y = topMargin; + + /// Use the StringFormat class for the text layout of our document + StringFormat format = new StringFormat(StringFormatFlags.LineLimit); + + + ///-------- + /// Body + ///-------- + + PrintWM(e, nextWMNr); + nextWMNr++; + e.HasMorePages = (nextWMNr < batch.WaterMeters.Count); + } + + + /// + /// Print one water meter results + /// + /// Water meter number (0-based) + void PrintWM(System.Drawing.Printing.PrintPageEventArgs e, int wmNr) + { + if (wmNr >= batch.WaterMeters.Count) return; + + Results.Entities.WaterMeter wm = batch.WaterMeters[wmNr]; + + if (wm == null) return; + + + /// Serial number + if (!string.IsNullOrEmpty(wm.SerialNr)) PrintAt(e, 20, 62, string.Format("S/N: {0}", wm.SerialNr)); + + /// Watermeter type + PrintAt(e, 20, 74, batch.ProtocolTitle); + + /// Date + PrintAt(e, 135, 74, string.Format("{0:dd/MM/yy", batch.EndTime)); + + Results.WMeterRsltItemSpec item1 = Results.WMeterRsltItemSpec.GetItem(Results.ItemID.Test_name); + + Results.WMeterRsltItemSpec item2 = Results.WMeterRsltItemSpec.GetItem(Results.ItemID.Error); + item2.Units = Config.Unit.Pct; + item2.Precision = "F2"; + item2.Format = "{0}%"; + + int printPosition = 1; + foreach (var mtr in wm.MeterTestRslts) + { + item1.TestID = mtr.Name(); + item2.TestID = mtr.Name(); + + PrintAt(e, 20, 6 + 14 * printPosition, item1.Print(wm)); + PrintAt(e, 78, 6 + 14 * printPosition, item2.Print(wm)); + + printPosition++; + } + } + + + void PrintAt(System.Drawing.Printing.PrintPageEventArgs e, Point p, string text) + { + PrintAt(e, p.X, p.Y, text); + } + + + void PrintAt(System.Drawing.Printing.PrintPageEventArgs e, int x, int y, string text) + { + RectangleF printArea = new RectangleF(x, y, 667, 18); + e.Graphics.DrawString(text, this.font, Brushes.Black, printArea); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/LabelPrinter/Printer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/LabelPrinter/Printer.cs new file mode 100644 index 00000000..b37ffcfd --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/LabelPrinter/Printer.cs @@ -0,0 +1,67 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// +using log4net; + +namespace TBF.BenchControl.Output.Printers.LabelPrinter +{ + public class Printer : ComponentBase, IOperation, GenericDevices.IResultsPrinter + { + private static readonly ILog log = LogManager.GetLogger(typeof(Printer)); + public override string ToString() { return string.Format("LabelPrinter({0})", Cfg.ToString(1)); } + + readonly PrinterCfg printerCfg; + + public bool SupressPrinting { get { return printerCfg.SupressPrinting; } } + + /// Data to print + Results.Entities.Batch batch; + + + public Printer() { } + + + public Printer(Generic.IComponentCfg cfg) + : base(cfg) + { + printerCfg = cfg as PrinterCfg; + log.Debug(this.ToString()); + } + + /// + /// Prints the test cycle results, Events: Event.ResultsPrinted + /// + /// Batch results to print + /// Reference to the operation + public IOperation PrintResultsOp(Results.Entities.Batch batch) + { + this.batch = batch; + return this; + } + + /// Start this operation + public void Start() + { + if (batch.WaterMeters.Count > 0) + { + new PrintLabelDocument(batch, + printerCfg.PageOrientation, + printerCfg.PaperWidth, + printerCfg.PaperHeight, + printerCfg.TemplateFile).Print(); + } + } + + /// Run this operation + /// Event.ResultsPrinted + public Event Run() + { + return Event.ResultsPrinted; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/LabelPrinter/PrinterCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/LabelPrinter/PrinterCfg.cs new file mode 100644 index 00000000..148acfb8 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/LabelPrinter/PrinterCfg.cs @@ -0,0 +1,59 @@ +/// +/// Copyright (c) 2015-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.Printers.LabelPrinter +{ + public class PrinterCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(PrinterCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new PrinterCfgCtrl(); } + + /// + /// Serialized parameters + /// + public PageOrientation PageOrientation; + public int PaperWidth; /// In 0,254 mm = 1/100 in = 100dpi pixels count + public int PaperHeight; /// In 0,254 mm = 1/100 in = 100dpi pixels count + public string TemplateFile; /// Full path to a 'png' file + public bool SupressPrinting; /// true = Bypass printing + + /// Private parameterless constructor invoked by all other (public) constructors + PrinterCfg() + { + } + + public PrinterCfg(string name, IComponentFactory factory) + : this() + { + this.Name = name; + this.Factory = factory; + ParentName = string.Empty; + PageOrientation = PageOrientation.Portrait; + PaperWidth = 827; /// A4 width + PaperHeight = 1169; /// A4 height + TemplateFile = "C:\\TBF\\Templates\\Label.png"; + SupressPrinting = false; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Orientation={1}, PaperWidth={2}, PaperHeight={3}, TemplateFile={4}, SupressPrinting={5}", + Name, + PageOrientation, + PaperWidth, + PaperHeight, + TemplateFile, + SupressPrinting ? "yes" : "no" + ); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/LabelPrinter/PrinterCfgCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/LabelPrinter/PrinterCfgCtrl.Designer.cs new file mode 100644 index 00000000..3f1a0c6a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/LabelPrinter/PrinterCfgCtrl.Designer.cs @@ -0,0 +1,193 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.Output.Printers.LabelPrinter +{ + partial class PrinterCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.supressPrintingCheckBox = new System.Windows.Forms.CheckBox(); + this.orientationLabel = new System.Windows.Forms.Label(); + this.orientationComboBox = new System.Windows.Forms.ComboBox(); + this.templateTextBox = new System.Windows.Forms.TextBox(); + this.templateLabel = new System.Windows.Forms.Label(); + this.paperWidthTextBox = new System.Windows.Forms.TextBox(); + this.paperWidthLabel = new System.Windows.Forms.Label(); + this.paperHeightTextBox = new System.Windows.Forms.TextBox(); + this.paperHeightLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(98, 30); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(8, 33); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(95, 6); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // supressPrintingCheckBox + // + this.supressPrintingCheckBox.AutoSize = true; + this.supressPrintingCheckBox.Enabled = false; + this.supressPrintingCheckBox.Location = new System.Drawing.Point(98, 164); + this.supressPrintingCheckBox.Name = "supressPrintingCheckBox"; + this.supressPrintingCheckBox.Size = new System.Drawing.Size(101, 17); + this.supressPrintingCheckBox.TabIndex = 11; + this.supressPrintingCheckBox.Text = "Supress printing"; + this.supressPrintingCheckBox.UseVisualStyleBackColor = true; + // + // orientationLabel + // + this.orientationLabel.AutoSize = true; + this.orientationLabel.Location = new System.Drawing.Point(8, 59); + this.orientationLabel.Name = "orientationLabel"; + this.orientationLabel.Size = new System.Drawing.Size(84, 13); + this.orientationLabel.TabIndex = 3; + this.orientationLabel.Text = "Page orientation"; + // + // orientationComboBox + // + this.orientationComboBox.Enabled = false; + this.orientationComboBox.FormattingEnabled = true; + this.orientationComboBox.Location = new System.Drawing.Point(98, 56); + this.orientationComboBox.Name = "orientationComboBox"; + this.orientationComboBox.Size = new System.Drawing.Size(130, 21); + this.orientationComboBox.TabIndex = 4; + // + // templateTextBox + // + this.templateTextBox.Enabled = false; + this.templateTextBox.Location = new System.Drawing.Point(98, 135); + this.templateTextBox.Name = "templateTextBox"; + this.templateTextBox.Size = new System.Drawing.Size(187, 20); + this.templateTextBox.TabIndex = 10; + // + // templateLabel + // + this.templateLabel.AutoSize = true; + this.templateLabel.Location = new System.Drawing.Point(8, 138); + this.templateLabel.Name = "templateLabel"; + this.templateLabel.Size = new System.Drawing.Size(67, 13); + this.templateLabel.TabIndex = 9; + this.templateLabel.Text = "Template file"; + // + // paperWidthTextBox + // + this.paperWidthTextBox.Enabled = false; + this.paperWidthTextBox.Location = new System.Drawing.Point(98, 83); + this.paperWidthTextBox.Name = "paperWidthTextBox"; + this.paperWidthTextBox.Size = new System.Drawing.Size(51, 20); + this.paperWidthTextBox.TabIndex = 6; + // + // paperWidthLabel + // + this.paperWidthLabel.AutoSize = true; + this.paperWidthLabel.Location = new System.Drawing.Point(8, 86); + this.paperWidthLabel.Name = "paperWidthLabel"; + this.paperWidthLabel.Size = new System.Drawing.Size(63, 13); + this.paperWidthLabel.TabIndex = 5; + this.paperWidthLabel.Text = "Paper width"; + // + // paperHeightTextBox + // + this.paperHeightTextBox.Enabled = false; + this.paperHeightTextBox.Location = new System.Drawing.Point(98, 109); + this.paperHeightTextBox.Name = "paperHeightTextBox"; + this.paperHeightTextBox.Size = new System.Drawing.Size(51, 20); + this.paperHeightTextBox.TabIndex = 8; + // + // paperHeightLabel + // + this.paperHeightLabel.AutoSize = true; + this.paperHeightLabel.Location = new System.Drawing.Point(8, 112); + this.paperHeightLabel.Name = "paperHeightLabel"; + this.paperHeightLabel.Size = new System.Drawing.Size(67, 13); + this.paperHeightLabel.TabIndex = 7; + this.paperHeightLabel.Text = "Paper height"; + // + // PrinterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.paperHeightTextBox); + this.Controls.Add(this.paperHeightLabel); + this.Controls.Add(this.paperWidthTextBox); + this.Controls.Add(this.paperWidthLabel); + this.Controls.Add(this.templateTextBox); + this.Controls.Add(this.templateLabel); + this.Controls.Add(this.orientationComboBox); + this.Controls.Add(this.orientationLabel); + this.Controls.Add(this.supressPrintingCheckBox); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "PrinterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.PrinterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.CheckBox supressPrintingCheckBox; + private System.Windows.Forms.Label orientationLabel; + private System.Windows.Forms.ComboBox orientationComboBox; + private System.Windows.Forms.TextBox templateTextBox; + private System.Windows.Forms.Label templateLabel; + private System.Windows.Forms.TextBox paperWidthTextBox; + private System.Windows.Forms.Label paperWidthLabel; + private System.Windows.Forms.TextBox paperHeightTextBox; + private System.Windows.Forms.Label paperHeightLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/LabelPrinter/PrinterCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/LabelPrinter/PrinterCfgCtrl.cs new file mode 100644 index 00000000..b8471c5b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/LabelPrinter/PrinterCfgCtrl.cs @@ -0,0 +1,123 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +using System; +using System.IO; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.Printers.LabelPrinter +{ + public partial class PrinterCfgCtrl : UserControl, IComponentCfgCtrl + { + static readonly ILog log = LogManager.GetLogger(typeof(PrinterCfgCtrl)); + + public bool ShowMore { get { return false; } } + + PrinterCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as PrinterCfg; + Redraw(); + } + } + + public PrinterCfgCtrl() + { + InitializeComponent(); + + orientationComboBox.Items.Add(PageOrientation.Portrait.ToString()); + orientationComboBox.Items.Add(PageOrientation.Landscape.ToString()); + } + + private void PrinterCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + PageOrientation GetOrientation(string str) + { + if (str.Equals(PageOrientation.Landscape.ToString())) return PageOrientation.Landscape; + if (str.Equals(PageOrientation.Portrait.ToString())) return PageOrientation.Portrait; + return (PageOrientation)(-1); + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + orientationComboBox.Text = config.PageOrientation.ToString(); + paperWidthTextBox.Text = config.PaperWidth.ToString(); + paperHeightTextBox.Text = config.PaperHeight.ToString(); + templateTextBox.Text = config.TemplateFile; + supressPrintingCheckBox.Checked = config.SupressPrinting; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + orientationComboBox.Enabled = true; + paperWidthTextBox.Enabled = true; + paperHeightTextBox.Enabled = true; + templateTextBox.Enabled = true; + supressPrintingCheckBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if ((int)GetOrientation(orientationComboBox.Text) < 0) + { + message += Environment.NewLine + "Invalid page orientation"; + flags |= CfgUpdateFlags.Error; + } + + int dummy; + if (!int.TryParse(paperWidthTextBox.Text, out dummy) || dummy <= 0) + { + message += Environment.NewLine + "Invalid paper width"; + flags |= CfgUpdateFlags.Error; + } + if (!int.TryParse(paperHeightTextBox.Text, out dummy) || dummy <= 0) + { + message += Environment.NewLine + "Invalid paper height"; + flags |= CfgUpdateFlags.Error; + } + + if (!File.Exists(config.TemplateFile)) + { + message += Environment.NewLine + "Template file missing"; + flags |= CfgUpdateFlags.Error; + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.PageOrientation = GetOrientation(orientationComboBox.Text); + config.PaperWidth = int.Parse(paperWidthTextBox.Text); + config.PaperHeight = int.Parse(paperHeightTextBox.Text); + config.TemplateFile = templateTextBox.Text; + config.SupressPrinting = supressPrintingCheckBox.Checked; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/LabelPrinter/PrinterCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/LabelPrinter/PrinterCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/LabelPrinter/PrinterCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/LabelPrinter/PrinterFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/LabelPrinter/PrinterFactory.cs new file mode 100644 index 00000000..980f6cd1 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/LabelPrinter/PrinterFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2015-2018 Sensus Slovensko a.s. +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.Printers.LabelPrinter +{ + public class PrinterFactory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Printer.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Printer(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Printer(cfg); } + + public IComponentCfg DefaultConfig() { return new PrinterCfg(this.GetType().Namespace.Substring(24), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(PrinterCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Munich/Printer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Munich/Printer.cs new file mode 100644 index 00000000..783e1ed1 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Munich/Printer.cs @@ -0,0 +1,73 @@ +/// +/// Copyright (c) 2013-2017 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Printing; +using log4net; +using Config.Entities; +using TBF.BenchControl; + +namespace TBF.BenchControl.Output.Printers.Munich +{ + public class Printer : ComponentBase, IOperation, GenericDevices.IResultsPrinter + { + private static readonly ILog log = LogManager.GetLogger(typeof(Printer)); + public override string ToString() { return string.Format("Output.Printers.Munich({0})", Cfg.ToString(1)); } + + readonly PrinterCfg printerCfg; + + public bool SupressPrinting { get { return false; } } + + + /// Data to print + Results.Entities.Batch batch; + + public string Version { get { return printerCfg.Version; } } + + + public Printer() + { + } + + public Printer(Generic.IComponentCfg cfg) + : base(cfg) + { + printerCfg = cfg as PrinterCfg; + log.Debug(this.ToString()); + } + + + /// Events: ResultsPrinted + /// Procedure to print the results of + /// Results to print + /// Reference to the operation + public IOperation PrintResultsOp(Results.Entities.Batch batch) + { + this.batch = batch; + return this; + } + + /// Start this operation + public void Start() + { + foreach (var wm in batch.WaterMeters) + { + new Results.Output.Printers.Munich.MunichPrintDocument(printerCfg.Version, wm, printerCfg.PageOrientation).Print(); + } + } + + /// Run this operation + /// Event.ResultsPrinted + public Event Run() + { + return Event.ResultsPrinted; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Munich/PrinterCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Munich/PrinterCfg.cs new file mode 100644 index 00000000..66773c47 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Munich/PrinterCfg.cs @@ -0,0 +1,50 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.Printers.Munich +{ + public class PrinterCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(PrinterCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new PrinterCfgCtrl(); } + + /// + /// Serialized parameters + /// + public string Version; + public PageOrientation PageOrientation; + public bool SupressPrinting; /// Bypass printing when true + + /// Private parameterless constructor invoked by all other (public) constructors + PrinterCfg() + { + } + + public PrinterCfg(string name, IComponentFactory factory) + : this() + { + this.Name = name; + this.Factory = factory; + ParentName = string.Empty; + PageOrientation = PageOrientation.Portrait; + SupressPrinting = false; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Orientation={1}, SupressPrinting={2}", + Name, + PageOrientation, + SupressPrinting ? "yes" : "no"); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Munich/PrinterCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Munich/PrinterCfgCtrl.cs new file mode 100644 index 00000000..cbfbf42f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Munich/PrinterCfgCtrl.cs @@ -0,0 +1,98 @@ +/// +/// Copyright (c) 2013-2017 Sensus Slovensko a.s. +/// +using System; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.Printers.Munich +{ + public partial class PrinterCfgCtrl : UserControl, IComponentCfgCtrl + { + static readonly ILog log = LogManager.GetLogger(typeof(PrinterCfgCtrl)); + + public bool ShowMore { get { return false; } } + + PrinterCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as PrinterCfg; + Redraw(); + } + } + + public PrinterCfgCtrl() + { + InitializeComponent(); + + orientationComboBox.Items.Add(PageOrientation.Portrait.ToString()); + orientationComboBox.Items.Add(PageOrientation.Landscape.ToString()); + } + + private void PrinterCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + PageOrientation GetOrientation(string str) + { + if (str.Equals(PageOrientation.Landscape.ToString())) return PageOrientation.Landscape; + if (str.Equals(PageOrientation.Portrait.ToString())) return PageOrientation.Portrait; + return (PageOrientation)(-1); + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + versionTextBox.Text = config.Version; + orientationComboBox.Text = config.PageOrientation.ToString(); + supressPrintingCheckBox.Checked = config.SupressPrinting; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + versionTextBox.Enabled = true; + orientationComboBox.Enabled = true; + supressPrintingCheckBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if ((int)GetOrientation(orientationComboBox.Text) < 0) + { + message += Environment.NewLine + "Invalid 'Page orientation'"; + flags |= CfgUpdateFlags.Error; + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.Version = versionTextBox.Text; + config.PageOrientation = GetOrientation(orientationComboBox.Text); + config.SupressPrinting = supressPrintingCheckBox.Checked; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Munich/PrinterCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Munich/PrinterCfgCtrl.designer.cs new file mode 100644 index 00000000..31b08d02 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Munich/PrinterCfgCtrl.designer.cs @@ -0,0 +1,147 @@ +/// +/// Copyright (c) 2013-2017 Sensus Slovensko a.s. +/// +namespace TBF.BenchControl.Output.Printers.Munich +{ + partial class PrinterCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.orientationComboBox = new System.Windows.Forms.ComboBox(); + this.orientationLabel = new System.Windows.Forms.Label(); + this.supressPrintingCheckBox = new System.Windows.Forms.CheckBox(); + this.versionTextBox = new System.Windows.Forms.TextBox(); + this.versionLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(143, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(25, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(140, 24); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // orientationComboBox + // + this.orientationComboBox.Enabled = false; + this.orientationComboBox.FormattingEnabled = true; + this.orientationComboBox.Location = new System.Drawing.Point(143, 109); + this.orientationComboBox.Name = "orientationComboBox"; + this.orientationComboBox.Size = new System.Drawing.Size(130, 21); + this.orientationComboBox.TabIndex = 6; + // + // orientationLabel + // + this.orientationLabel.AutoSize = true; + this.orientationLabel.Location = new System.Drawing.Point(25, 112); + this.orientationLabel.Name = "orientationLabel"; + this.orientationLabel.Size = new System.Drawing.Size(84, 13); + this.orientationLabel.TabIndex = 5; + this.orientationLabel.Text = "Page orientation"; + // + // supressPrintingCheckBox + // + this.supressPrintingCheckBox.AutoSize = true; + this.supressPrintingCheckBox.Enabled = false; + this.supressPrintingCheckBox.Location = new System.Drawing.Point(143, 137); + this.supressPrintingCheckBox.Name = "supressPrintingCheckBox"; + this.supressPrintingCheckBox.Size = new System.Drawing.Size(101, 17); + this.supressPrintingCheckBox.TabIndex = 7; + this.supressPrintingCheckBox.Text = "Supress printing"; + this.supressPrintingCheckBox.UseVisualStyleBackColor = true; + // + // versionTextBox + // + this.versionTextBox.Enabled = false; + this.versionTextBox.Location = new System.Drawing.Point(143, 83); + this.versionTextBox.Name = "versionTextBox"; + this.versionTextBox.Size = new System.Drawing.Size(130, 20); + this.versionTextBox.TabIndex = 4; + // + // versionLabel + // + this.versionLabel.AutoSize = true; + this.versionLabel.Location = new System.Drawing.Point(25, 86); + this.versionLabel.Name = "versionLabel"; + this.versionLabel.Size = new System.Drawing.Size(42, 13); + this.versionLabel.TabIndex = 3; + this.versionLabel.Text = "Version"; + // + // PrinterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.versionTextBox); + this.Controls.Add(this.versionLabel); + this.Controls.Add(this.orientationComboBox); + this.Controls.Add(this.orientationLabel); + this.Controls.Add(this.supressPrintingCheckBox); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "PrinterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.PrinterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.ComboBox orientationComboBox; + private System.Windows.Forms.Label orientationLabel; + private System.Windows.Forms.CheckBox supressPrintingCheckBox; + private System.Windows.Forms.TextBox versionTextBox; + private System.Windows.Forms.Label versionLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Munich/PrinterCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Munich/PrinterCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Munich/PrinterCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Munich/PrinterFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Munich/PrinterFactory.cs new file mode 100644 index 00000000..42694569 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Munich/PrinterFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.Printers.Munich +{ + public class PrinterFactory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Printer.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Printer(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Printer(cfg); } + + public IComponentCfg DefaultConfig() { return new PrinterCfg(this.GetType().Namespace.Substring(24), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(PrinterCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/OnePerMeter/FactoryCompound.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/OnePerMeter/FactoryCompound.cs new file mode 100644 index 00000000..15c75a2a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/OnePerMeter/FactoryCompound.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.Printers.OnePerMeter +{ + public class FactoryCompound : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".Compound"; } } + + public void ResetStaticProperties() { Printer.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Printer(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Printer(cfg); } + + public IComponentCfg DefaultConfig() { return new PrinterCfg("Printer.OnePerMeter.Compound", this, Config.Entities.MetersKind.Combined); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(PrinterCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/OnePerMeter/FactoryHeatMeters.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/OnePerMeter/FactoryHeatMeters.cs new file mode 100644 index 00000000..fafa3686 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/OnePerMeter/FactoryHeatMeters.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.Printers.OnePerMeter +{ + public class FactoryHeatMeters : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".HeatMeters"; } } + + public void ResetStaticProperties() { Printer.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Printer(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Printer(cfg); } + + public IComponentCfg DefaultConfig() { return new PrinterCfg("Printer.OnePerMeter.HeatMeters", this, Config.Entities.MetersKind.HeatMeter); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(PrinterCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/OnePerMeter/FactorySingle.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/OnePerMeter/FactorySingle.cs new file mode 100644 index 00000000..f93641d7 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/OnePerMeter/FactorySingle.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.Printers.OnePerMeter +{ + public class FactorySingle : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".Single"; } } + + public void ResetStaticProperties() { Printer.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Printer(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Printer(cfg); } + + public IComponentCfg DefaultConfig() { return new PrinterCfg("Printer.OnePerMeter.Single", this, Config.Entities.MetersKind.Single); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(PrinterCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/OnePerMeter/Printer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/OnePerMeter/Printer.cs new file mode 100644 index 00000000..096ff6a5 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/OnePerMeter/Printer.cs @@ -0,0 +1,237 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Threading; +using Results.Output.Printers.OnePerMeter; +using log4net; + +namespace TBF.BenchControl.Output.Printers.OnePerMeter +{ + public class Printer : ComponentBase, IOperation, GenericDevices.IResultsPrinter + { + private static readonly ILog log = LogManager.GetLogger(typeof(Printer)); + public override string ToString() { return string.Format("Output.Printers.OnePerMeter({0})", Cfg.ToString(1)); } + + readonly PrinterCfg printerCfg; + + public bool SupressPrinting { get { return printerCfg.SupressPrinting; } } + + /// Data to print + Results.Entities.Batch batch; + + /// + /// Items to print + /// + string header; + IList commonItems; + IList testItems; + string footer; + + + public Printer() { } + + public Printer(Generic.IComponentCfg cfg) + : base(cfg) + { + printerCfg = cfg as PrinterCfg; + ApplyConfig(); + log.Debug(this.ToString()); + } + + + void ApplyConfig() + { + header = string.IsNullOrEmpty(printerCfg.Header) ? string.Empty : printerCfg.Header.Replace("~", Environment.NewLine); + commonItems = Results.WMeterRsltItemSpec.FromStrArray(printerCfg.CommonItems1); + testItems = Results.WMeterRsltItemSpec.FromStrArray(printerCfg.SelectedItems); /// TestID info will be overwritten later on + footer = string.IsNullOrEmpty(printerCfg.Footer) ? string.Empty : printerCfg.Footer.Replace("~", Environment.NewLine); + } + + + #region Configuration Change Handling + + public static void OnCfgChange(object sender, CfgChangeArgs args) + { + if (CfgChangeHandler == null) return; + try { CfgChangeHandler(sender, args); } + catch (Exception e) { log.Error("CfgChangeHandler(...) failed", e); } + } + + public static event EventHandler CfgChangeHandler; + + public override void StartChangeHandler() + { + CfgChangeHandler += delegate(object sender, CfgChangeArgs args) + { + PrinterCfg newCfg = args.Cfg as PrinterCfg; + if (newCfg != null && newCfg.Name.Equals(Name)) + { + if (args.Command == CfgChangeCmd.CfgChange) + { + printerCfg.PageOrientation = newCfg.PageOrientation; + printerCfg.Template = newCfg.Template; + printerCfg.TopMargin = newCfg.TopMargin; + printerCfg.BottomMargin = newCfg.BottomMargin; + printerCfg.LeftMargin = newCfg.LeftMargin; + + printerCfg.TitFntFml = newCfg.TitFntFml; + printerCfg.TitFntSz = newCfg.TitFntSz; + printerCfg.TitFntSty = newCfg.TitFntSty; + printerCfg.HdrFntFml = newCfg.HdrFntFml; + printerCfg.HdrFntSz = newCfg.HdrFntSz; + printerCfg.HdrFntSty = newCfg.HdrFntSty; + printerCfg.BodyFntFml = newCfg.BodyFntFml; + printerCfg.BodyFntSz = newCfg.BodyFntSz; + printerCfg.BodyFntSty = newCfg.BodyFntSty; + printerCfg.FooterFntFml = newCfg.FooterFntFml; + printerCfg.FooterFntSz = newCfg.FooterFntSz; + printerCfg.FooterFntSty = newCfg.FooterFntSty; + + printerCfg.GoodOnly = newCfg.GoodOnly; + printerCfg.SupressPrinting = newCfg.SupressPrinting; + printerCfg.Culture = newCfg.Culture; + printerCfg.Header = newCfg.Header; + printerCfg.ColW0Pct = newCfg.ColW0Pct; + printerCfg.ColW1Pct = newCfg.ColW1Pct; + printerCfg.ColW2Pct = newCfg.ColW2Pct; + printerCfg.CommonItems1 = newCfg.CommonItems1; + printerCfg.CommonItems2 = newCfg.CommonItems2; + printerCfg.CommonItems3 = newCfg.CommonItems3; + printerCfg.Form = newCfg.Form; + printerCfg.SelectedItems = newCfg.SelectedItems; + printerCfg.SelectedItems2 = newCfg.SelectedItems2; + printerCfg.BelowW0Pct = newCfg.BelowW0Pct; + printerCfg.BelowW1Pct = newCfg.BelowW1Pct; + printerCfg.BelowW2Pct = newCfg.BelowW2Pct; + printerCfg.BelowItems1 = newCfg.BelowItems1; + printerCfg.BelowItems2 = newCfg.BelowItems2; + printerCfg.BelowItems3 = newCfg.BelowItems3; + printerCfg.Footer = newCfg.Footer; + printerCfg.TestsAreRows = newCfg.TestsAreRows; + printerCfg.DocName = newCfg.DocName; + printerCfg.ImgName = newCfg.ImgName; + printerCfg.ImgLeft = newCfg.ImgLeft; + printerCfg.ImgTop = newCfg.ImgTop; + printerCfg.ImgWid = newCfg.ImgWid; + printerCfg.ImgHgh = newCfg.ImgHgh; + + ApplyConfig(); + } + } + }; + } + + #endregion Configuration Change Handling + + + /// + /// Prints the test cycle results, Events: Event.ResultsPrinted + /// + /// Batch results to print + /// Reference to the operation + public IOperation PrintResultsOp(Results.Entities.Batch batch) + { + this.batch = batch; + return this; + } + + /// Start this operation + public void Start() + { + CultureInfo oriCulture = Thread.CurrentThread.CurrentCulture; + + if (printerCfg.Culture != Culture.system) + { + Thread.CurrentThread.CurrentCulture = new CultureInfo(printerCfg.Culture.ToString()); + } + + foreach (var wm in batch.WaterMeters) + { + if (wm != null && (!printerCfg.GoodOnly || wm.Passed)) + { + string documentName; + try + { + if (string.IsNullOrEmpty(printerCfg.DocName)) throw (new Exception()); + documentName = string.Format(printerCfg.DocName, wm.StartTime(), wm.EndTime(), wm.BatchNr(), wm.WMPosition, wm.SerialNr); + } + catch + { + documentName = string.Format("{0}-{1}", batch.BatchNr, wm.WMPosition); + } + + PrintResults(batch, wm, documentName); + } + } + + Thread.CurrentThread.CurrentCulture = oriCulture; + } + + /// Run this operation + /// Event.ResultsPrinted + public Event Run() + { + return Event.ResultsPrinted; + } + + /// Stop this operation + public void Stop() + { + } + + + void PrintResults(Results.Entities.Batch batch, Results.Entities.WaterMeter wm, string documentName) + { + OnePerMeterPrinterCfg cfg = new OnePerMeterPrinterCfg { + PageOrientation = printerCfg.PageOrientation, + Template = printerCfg.Template, + TopMargin = printerCfg.TopMargin, + BottomMargin = printerCfg.BottomMargin, + LeftMargin = printerCfg.LeftMargin, + TitFntFml = printerCfg.TitFntFml, + TitFntSz = printerCfg.TitFntSz, + TitFntSty = printerCfg.TitFntSty, + HdrFntFml = printerCfg.HdrFntFml, + HdrFntSz = printerCfg.HdrFntSz, + HdrFntSty = printerCfg.HdrFntSty, + BodyFntFml = printerCfg.BodyFntFml, + BodyFntSz = printerCfg.BodyFntSz, + BodyFntSty = printerCfg.BodyFntSty, + FooterFntFml = printerCfg.FooterFntFml, + FooterFntSz = printerCfg.FooterFntSz, + FooterFntSty = printerCfg.FooterFntSty, + GoodOnly = printerCfg.GoodOnly, + SupressPrinting = printerCfg.SupressPrinting, + CultureInfo = (printerCfg.Culture == Culture.system) ? Thread.CurrentThread.CurrentCulture : new CultureInfo(printerCfg.Culture.ToString()), + Header = printerCfg.Header, + ColW0Pct = printerCfg.ColW0Pct, + ColW1Pct = printerCfg.ColW1Pct, + ColW2Pct = printerCfg.ColW2Pct, + CommonItems1 = printerCfg.CommonItems1, + CommonItems2 = printerCfg.CommonItems2, + CommonItems3 = printerCfg.CommonItems3, + Form = printerCfg.Form, + TestItems = printerCfg.SelectedItems, + TestItems2 = printerCfg.SelectedItems2, + BelowW0Pct = printerCfg.BelowW0Pct, + BelowW1Pct = printerCfg.BelowW1Pct, + BelowW2Pct = printerCfg.BelowW2Pct, + BelowItems1 = printerCfg.BelowItems1, + BelowItems2 = printerCfg.BelowItems2, + BelowItems3 = printerCfg.BelowItems3, + Footer = printerCfg.Footer, + TestsAreRows = printerCfg.TestsAreRows, + ImgFullPathName = (wm.ArchivePath != null) ? System.IO.Path.Combine(wm.ArchivePath, printerCfg.ImgName) : null, + ImgLeft = printerCfg.ImgLeft, + ImgTop = printerCfg.ImgTop, + ImgWid = printerCfg.ImgWid, + ImgHgh = printerCfg.ImgHgh, + }; + + new Results.Output.Printers.OnePerMeter.OnePerMeterPrintDocument(batch, cfg, wm, documentName).Print(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/OnePerMeter/PrinterCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/OnePerMeter/PrinterCfg.cs new file mode 100644 index 00000000..896e8fa6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/OnePerMeter/PrinterCfg.cs @@ -0,0 +1,122 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.Printers.OnePerMeter +{ + public class PrinterCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(PrinterCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new PrinterCfgCtrl(); } + + /// + /// Serialized parameters + /// + public PageOrientation PageOrientation; + public string Template; + public int TopMargin; + public int BottomMargin; + public int LeftMargin; + public string TitFntFml; + public string HdrFntFml; + public string BodyFntFml; + public string FooterFntFml; + public int TitFntSz; + public int HdrFntSz; + public int BodyFntSz; + public int FooterFntSz; + public int TitFntSty; + public int HdrFntSty; + public int BodyFntSty; + public int FooterFntSty; + public bool GoodOnly; + public bool SupressPrinting; /// Bypass printing when true + public Culture Culture; + public string Header; /// =Title + + public int ColW0Pct; + public string[] CommonItems1; + public int ColW1Pct; + public string[] CommonItems2; + public int ColW2Pct; + public string[] CommonItems3; + + public TableForm Form; + public string[] SelectedItems; + public string[] SelectedItems2; + + public int BelowW0Pct; + public string[] BelowItems1; + public int BelowW1Pct; + public string[] BelowItems2; + public int BelowW2Pct; + public string[] BelowItems3; + + public string Footer; + public bool TestsAreRows; /// true = Tests are rows + public string DocName; + public string ImgName; + public int ImgLeft; + public int ImgTop; + public int ImgWid; + public int ImgHgh; + + [XmlIgnore] + public Config.Entities.MetersKind MetersKind; + + /// Private parameterless constructor invoked by all other (public) constructors + PrinterCfg() + { + } + + public PrinterCfg(string name, IComponentFactory factory, Config.Entities.MetersKind metersKind) + : this() + { + Name = name; + Factory = factory; + MetersKind = metersKind; + + ParentName = string.Empty; + Template = string.Empty; + PageOrientation = PageOrientation.Portrait; + TopMargin = 100; + BottomMargin = 100; + LeftMargin = 100; + TitFntFml = "Arial"; + TitFntSz = 18; + TitFntSty = 1; + HdrFntFml = "Arial"; + HdrFntSz = 10; + HdrFntSty = 0; + BodyFntFml = "Arial"; + BodyFntSz = 10; + BodyFntSty = 0; + FooterFntFml = "Arial"; + FooterFntSz = 10; + FooterFntSty = 0; + GoodOnly = false; + SupressPrinting = false; + Header = string.Empty; + Footer = string.Empty; + DocName = string.Empty; + ImgName = string.Empty; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Orientation={1}, Margins T={2} B={3} L={4}, SupressPrinting={5}", + Name, + PageOrientation, + TopMargin, + BottomMargin, + LeftMargin, + SupressPrinting ? "yes" : "no" + ); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/OnePerMeter/PrinterCfgCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/OnePerMeter/PrinterCfgCtrl.Designer.cs new file mode 100644 index 00000000..a3362bff --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/OnePerMeter/PrinterCfgCtrl.Designer.cs @@ -0,0 +1,928 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.Output.Printers.OnePerMeter +{ + partial class PrinterCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.supressPrintingCheckBox = new System.Windows.Forms.CheckBox(); + this.orientationLabel = new System.Windows.Forms.Label(); + this.orientationComboBox = new System.Windows.Forms.ComboBox(); + this.topMarginTextBox = new System.Windows.Forms.TextBox(); + this.topMarginLabel = new System.Windows.Forms.Label(); + this.leftMarginTextBox = new System.Windows.Forms.TextBox(); + this.bottomMarginTextBox = new System.Windows.Forms.TextBox(); + this.cultureComboBox = new System.Windows.Forms.ComboBox(); + this.cultureLabel = new System.Windows.Forms.Label(); + this.footerButton = new System.Windows.Forms.Button(); + this.headerButton = new System.Windows.Forms.Button(); + this.testItemsButton = new System.Windows.Forms.Button(); + this.headerFontLabel = new System.Windows.Forms.Label(); + this.titleFontLabel = new System.Windows.Forms.Label(); + this.titleFontFamilyComboBox = new System.Windows.Forms.ComboBox(); + this.headerFontFamilyComboBox = new System.Windows.Forms.ComboBox(); + this.bodyFontFamilyComboBox = new System.Windows.Forms.ComboBox(); + this.bodyFontLabel = new System.Windows.Forms.Label(); + this.titleFontSizeTextBox = new System.Windows.Forms.TextBox(); + this.headerFontSizeTextBox = new System.Windows.Forms.TextBox(); + this.bodyFontSizeTextBox = new System.Windows.Forms.TextBox(); + this.titleBoldCheckBox = new System.Windows.Forms.CheckBox(); + this.titleItalicCheckBox = new System.Windows.Forms.CheckBox(); + this.headerItalicCheckBox = new System.Windows.Forms.CheckBox(); + this.headerBoldCheckBox = new System.Windows.Forms.CheckBox(); + this.bodyItalicCheckBox = new System.Windows.Forms.CheckBox(); + this.bodyBoldCheckBox = new System.Windows.Forms.CheckBox(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.testItems2Button = new System.Windows.Forms.Button(); + this.goodOnlyCheckBox = new System.Windows.Forms.CheckBox(); + this.templateTextBox = new System.Windows.Forms.TextBox(); + this.templateLabel = new System.Windows.Forms.Label(); + this.docNameLabel = new System.Windows.Forms.Label(); + this.docNameTextBox = new System.Windows.Forms.TextBox(); + this.footerItalicCheckBox = new System.Windows.Forms.CheckBox(); + this.footerBoldCheckBox = new System.Windows.Forms.CheckBox(); + this.footerFontSizeTextBox = new System.Windows.Forms.TextBox(); + this.footerFontFamilyComboBox = new System.Windows.Forms.ComboBox(); + this.footerFontLabel = new System.Windows.Forms.Label(); + this.imageNameTextBox = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.imageLeftTextBox = new System.Windows.Forms.TextBox(); + this.imageTopTextBox = new System.Windows.Forms.TextBox(); + this.imageWidthTextBox = new System.Windows.Forms.TextBox(); + this.imageHeightTextBox = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.label8 = new System.Windows.Forms.Label(); + this.label6 = new System.Windows.Forms.Label(); + this.colW0TextBox = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.label7 = new System.Windows.Forms.Label(); + this.label9 = new System.Windows.Forms.Label(); + this.colW2TextBox = new System.Windows.Forms.TextBox(); + this.colW1TextBox = new System.Windows.Forms.TextBox(); + this.commonItems3Button = new System.Windows.Forms.Button(); + this.commonItems2Button = new System.Windows.Forms.Button(); + this.commonItems1Button = new System.Windows.Forms.Button(); + this.label10 = new System.Windows.Forms.Label(); + this.belowW0TextBox = new System.Windows.Forms.TextBox(); + this.label11 = new System.Windows.Forms.Label(); + this.label12 = new System.Windows.Forms.Label(); + this.label13 = new System.Windows.Forms.Label(); + this.belowW2TextBox = new System.Windows.Forms.TextBox(); + this.belowW1TextBox = new System.Windows.Forms.TextBox(); + this.belowItems3Button = new System.Windows.Forms.Button(); + this.belowItems2Button = new System.Windows.Forms.Button(); + this.belowItems1Button = new System.Windows.Forms.Button(); + this.table1FormComboBox = new System.Windows.Forms.ComboBox(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(142, 22); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(146, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(16, 25); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(139, 5); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // supressPrintingCheckBox + // + this.supressPrintingCheckBox.AutoSize = true; + this.supressPrintingCheckBox.Enabled = false; + this.supressPrintingCheckBox.Location = new System.Drawing.Point(334, 26); + this.supressPrintingCheckBox.Name = "supressPrintingCheckBox"; + this.supressPrintingCheckBox.Size = new System.Drawing.Size(101, 17); + this.supressPrintingCheckBox.TabIndex = 33; + this.supressPrintingCheckBox.Text = "Supress printing"; + this.supressPrintingCheckBox.UseVisualStyleBackColor = true; + // + // orientationLabel + // + this.orientationLabel.AutoSize = true; + this.orientationLabel.Location = new System.Drawing.Point(16, 67); + this.orientationLabel.Name = "orientationLabel"; + this.orientationLabel.Size = new System.Drawing.Size(84, 13); + this.orientationLabel.TabIndex = 5; + this.orientationLabel.Text = "Page orientation"; + // + // orientationComboBox + // + this.orientationComboBox.Enabled = false; + this.orientationComboBox.FormattingEnabled = true; + this.orientationComboBox.Location = new System.Drawing.Point(142, 64); + this.orientationComboBox.Name = "orientationComboBox"; + this.orientationComboBox.Size = new System.Drawing.Size(146, 21); + this.orientationComboBox.TabIndex = 6; + // + // topMarginTextBox + // + this.topMarginTextBox.Enabled = false; + this.topMarginTextBox.Location = new System.Drawing.Point(142, 86); + this.topMarginTextBox.Name = "topMarginTextBox"; + this.topMarginTextBox.Size = new System.Drawing.Size(44, 20); + this.topMarginTextBox.TabIndex = 8; + // + // topMarginLabel + // + this.topMarginLabel.AutoSize = true; + this.topMarginLabel.Location = new System.Drawing.Point(16, 88); + this.topMarginLabel.Name = "topMarginLabel"; + this.topMarginLabel.Size = new System.Drawing.Size(116, 13); + this.topMarginLabel.TabIndex = 7; + this.topMarginLabel.Text = "Top/bottom/left margin"; + // + // leftMarginTextBox + // + this.leftMarginTextBox.Enabled = false; + this.leftMarginTextBox.Location = new System.Drawing.Point(244, 86); + this.leftMarginTextBox.Name = "leftMarginTextBox"; + this.leftMarginTextBox.Size = new System.Drawing.Size(44, 20); + this.leftMarginTextBox.TabIndex = 10; + // + // bottomMarginTextBox + // + this.bottomMarginTextBox.Enabled = false; + this.bottomMarginTextBox.Location = new System.Drawing.Point(193, 86); + this.bottomMarginTextBox.Name = "bottomMarginTextBox"; + this.bottomMarginTextBox.Size = new System.Drawing.Size(44, 20); + this.bottomMarginTextBox.TabIndex = 9; + // + // cultureComboBox + // + this.cultureComboBox.Enabled = false; + this.cultureComboBox.FormattingEnabled = true; + this.cultureComboBox.Location = new System.Drawing.Point(142, 192); + this.cultureComboBox.Name = "cultureComboBox"; + this.cultureComboBox.Size = new System.Drawing.Size(110, 21); + this.cultureComboBox.TabIndex = 32; + // + // cultureLabel + // + this.cultureLabel.AutoSize = true; + this.cultureLabel.Location = new System.Drawing.Point(16, 197); + this.cultureLabel.Name = "cultureLabel"; + this.cultureLabel.Size = new System.Drawing.Size(42, 13); + this.cultureLabel.TabIndex = 31; + this.cultureLabel.Text = "Cullture"; + // + // footerButton + // + this.footerButton.Enabled = false; + this.footerButton.Location = new System.Drawing.Point(287, 303); + this.footerButton.Name = "footerButton"; + this.footerButton.Size = new System.Drawing.Size(100, 23); + this.footerButton.TabIndex = 41; + this.footerButton.Text = "Footer"; + this.footerButton.UseVisualStyleBackColor = true; + this.footerButton.Click += new System.EventHandler(this.footerButton_Click); + // + // headerButton + // + this.headerButton.Enabled = false; + this.headerButton.Location = new System.Drawing.Point(287, 193); + this.headerButton.Name = "headerButton"; + this.headerButton.Size = new System.Drawing.Size(100, 23); + this.headerButton.TabIndex = 37; + this.headerButton.Text = "Title"; + this.headerButton.UseVisualStyleBackColor = true; + this.headerButton.Click += new System.EventHandler(this.headerButton_Click); + // + // testItemsButton + // + this.testItemsButton.Enabled = false; + this.testItemsButton.Location = new System.Drawing.Point(287, 237); + this.testItemsButton.Name = "testItemsButton"; + this.testItemsButton.Size = new System.Drawing.Size(100, 23); + this.testItemsButton.TabIndex = 39; + this.testItemsButton.Text = "1st table"; + this.testItemsButton.UseVisualStyleBackColor = true; + this.testItemsButton.Click += new System.EventHandler(this.testItemsButton_Click); + // + // headerFontLabel + // + this.headerFontLabel.AutoSize = true; + this.headerFontLabel.Location = new System.Drawing.Point(16, 131); + this.headerFontLabel.Name = "headerFontLabel"; + this.headerFontLabel.Size = new System.Drawing.Size(112, 13); + this.headerFontLabel.TabIndex = 16; + this.headerFontLabel.Text = "Header font/size/style"; + // + // titleFontLabel + // + this.titleFontLabel.AutoSize = true; + this.titleFontLabel.Location = new System.Drawing.Point(16, 110); + this.titleFontLabel.Name = "titleFontLabel"; + this.titleFontLabel.Size = new System.Drawing.Size(97, 13); + this.titleFontLabel.TabIndex = 11; + this.titleFontLabel.Text = "Title font/size/style"; + // + // titleFontFamilyComboBox + // + this.titleFontFamilyComboBox.Enabled = false; + this.titleFontFamilyComboBox.FormattingEnabled = true; + this.titleFontFamilyComboBox.Location = new System.Drawing.Point(142, 107); + this.titleFontFamilyComboBox.Name = "titleFontFamilyComboBox"; + this.titleFontFamilyComboBox.Size = new System.Drawing.Size(110, 21); + this.titleFontFamilyComboBox.TabIndex = 12; + // + // headerFontFamilyComboBox + // + this.headerFontFamilyComboBox.Enabled = false; + this.headerFontFamilyComboBox.FormattingEnabled = true; + this.headerFontFamilyComboBox.Location = new System.Drawing.Point(142, 128); + this.headerFontFamilyComboBox.Name = "headerFontFamilyComboBox"; + this.headerFontFamilyComboBox.Size = new System.Drawing.Size(110, 21); + this.headerFontFamilyComboBox.TabIndex = 17; + // + // bodyFontFamilyComboBox + // + this.bodyFontFamilyComboBox.Enabled = false; + this.bodyFontFamilyComboBox.FormattingEnabled = true; + this.bodyFontFamilyComboBox.Location = new System.Drawing.Point(142, 149); + this.bodyFontFamilyComboBox.Name = "bodyFontFamilyComboBox"; + this.bodyFontFamilyComboBox.Size = new System.Drawing.Size(110, 21); + this.bodyFontFamilyComboBox.TabIndex = 22; + // + // bodyFontLabel + // + this.bodyFontLabel.AutoSize = true; + this.bodyFontLabel.Location = new System.Drawing.Point(16, 152); + this.bodyFontLabel.Name = "bodyFontLabel"; + this.bodyFontLabel.Size = new System.Drawing.Size(101, 13); + this.bodyFontLabel.TabIndex = 21; + this.bodyFontLabel.Text = "Body font/size/style"; + // + // titleFontSizeTextBox + // + this.titleFontSizeTextBox.Enabled = false; + this.titleFontSizeTextBox.Location = new System.Drawing.Point(258, 107); + this.titleFontSizeTextBox.Name = "titleFontSizeTextBox"; + this.titleFontSizeTextBox.Size = new System.Drawing.Size(30, 20); + this.titleFontSizeTextBox.TabIndex = 13; + // + // headerFontSizeTextBox + // + this.headerFontSizeTextBox.Enabled = false; + this.headerFontSizeTextBox.Location = new System.Drawing.Point(258, 128); + this.headerFontSizeTextBox.Name = "headerFontSizeTextBox"; + this.headerFontSizeTextBox.Size = new System.Drawing.Size(30, 20); + this.headerFontSizeTextBox.TabIndex = 18; + // + // bodyFontSizeTextBox + // + this.bodyFontSizeTextBox.Enabled = false; + this.bodyFontSizeTextBox.Location = new System.Drawing.Point(258, 149); + this.bodyFontSizeTextBox.Name = "bodyFontSizeTextBox"; + this.bodyFontSizeTextBox.Size = new System.Drawing.Size(30, 20); + this.bodyFontSizeTextBox.TabIndex = 23; + // + // titleBoldCheckBox + // + this.titleBoldCheckBox.AutoSize = true; + this.titleBoldCheckBox.Enabled = false; + this.titleBoldCheckBox.Location = new System.Drawing.Point(306, 110); + this.titleBoldCheckBox.Name = "titleBoldCheckBox"; + this.titleBoldCheckBox.Size = new System.Drawing.Size(15, 14); + this.titleBoldCheckBox.TabIndex = 14; + this.titleBoldCheckBox.UseVisualStyleBackColor = true; + // + // titleItalicCheckBox + // + this.titleItalicCheckBox.AutoSize = true; + this.titleItalicCheckBox.Enabled = false; + this.titleItalicCheckBox.Location = new System.Drawing.Point(334, 110); + this.titleItalicCheckBox.Name = "titleItalicCheckBox"; + this.titleItalicCheckBox.Size = new System.Drawing.Size(15, 14); + this.titleItalicCheckBox.TabIndex = 15; + this.titleItalicCheckBox.UseVisualStyleBackColor = true; + // + // headerItalicCheckBox + // + this.headerItalicCheckBox.AutoSize = true; + this.headerItalicCheckBox.Enabled = false; + this.headerItalicCheckBox.Location = new System.Drawing.Point(334, 131); + this.headerItalicCheckBox.Name = "headerItalicCheckBox"; + this.headerItalicCheckBox.Size = new System.Drawing.Size(15, 14); + this.headerItalicCheckBox.TabIndex = 20; + this.headerItalicCheckBox.UseVisualStyleBackColor = true; + // + // headerBoldCheckBox + // + this.headerBoldCheckBox.AutoSize = true; + this.headerBoldCheckBox.Enabled = false; + this.headerBoldCheckBox.Location = new System.Drawing.Point(306, 131); + this.headerBoldCheckBox.Name = "headerBoldCheckBox"; + this.headerBoldCheckBox.Size = new System.Drawing.Size(15, 14); + this.headerBoldCheckBox.TabIndex = 19; + this.headerBoldCheckBox.UseVisualStyleBackColor = true; + // + // bodyItalicCheckBox + // + this.bodyItalicCheckBox.AutoSize = true; + this.bodyItalicCheckBox.Enabled = false; + this.bodyItalicCheckBox.Location = new System.Drawing.Point(334, 152); + this.bodyItalicCheckBox.Name = "bodyItalicCheckBox"; + this.bodyItalicCheckBox.Size = new System.Drawing.Size(15, 14); + this.bodyItalicCheckBox.TabIndex = 25; + this.bodyItalicCheckBox.UseVisualStyleBackColor = true; + // + // bodyBoldCheckBox + // + this.bodyBoldCheckBox.AutoSize = true; + this.bodyBoldCheckBox.Enabled = false; + this.bodyBoldCheckBox.Location = new System.Drawing.Point(306, 152); + this.bodyBoldCheckBox.Name = "bodyBoldCheckBox"; + this.bodyBoldCheckBox.Size = new System.Drawing.Size(15, 14); + this.bodyBoldCheckBox.TabIndex = 24; + this.bodyBoldCheckBox.UseVisualStyleBackColor = true; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label1.Location = new System.Drawing.Point(296, 94); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(32, 13); + this.label1.TabIndex = 37; + this.label1.Text = "Bold"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label2.Location = new System.Drawing.Point(330, 94); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(24, 13); + this.label2.TabIndex = 38; + this.label2.Text = "Ital."; + // + // testItems2Button + // + this.testItems2Button.Enabled = false; + this.testItems2Button.Location = new System.Drawing.Point(287, 259); + this.testItems2Button.Name = "testItems2Button"; + this.testItems2Button.Size = new System.Drawing.Size(100, 23); + this.testItems2Button.TabIndex = 40; + this.testItems2Button.Text = "2nd table"; + this.testItems2Button.UseVisualStyleBackColor = true; + this.testItems2Button.Click += new System.EventHandler(this.testItems2Button_Click); + // + // goodOnlyCheckBox + // + this.goodOnlyCheckBox.AutoSize = true; + this.goodOnlyCheckBox.Enabled = false; + this.goodOnlyCheckBox.Location = new System.Drawing.Point(334, 44); + this.goodOnlyCheckBox.Name = "goodOnlyCheckBox"; + this.goodOnlyCheckBox.Size = new System.Drawing.Size(74, 17); + this.goodOnlyCheckBox.TabIndex = 34; + this.goodOnlyCheckBox.Text = "Good only"; + this.goodOnlyCheckBox.UseVisualStyleBackColor = true; + // + // templateTextBox + // + this.templateTextBox.Enabled = false; + this.templateTextBox.Location = new System.Drawing.Point(142, 43); + this.templateTextBox.Name = "templateTextBox"; + this.templateTextBox.Size = new System.Drawing.Size(146, 20); + this.templateTextBox.TabIndex = 4; + // + // templateLabel + // + this.templateLabel.AutoSize = true; + this.templateLabel.Location = new System.Drawing.Point(16, 46); + this.templateLabel.Name = "templateLabel"; + this.templateLabel.Size = new System.Drawing.Size(51, 13); + this.templateLabel.TabIndex = 3; + this.templateLabel.Text = "Template"; + // + // docNameLabel + // + this.docNameLabel.AutoSize = true; + this.docNameLabel.Location = new System.Drawing.Point(16, 331); + this.docNameLabel.Name = "docNameLabel"; + this.docNameLabel.Size = new System.Drawing.Size(246, 13); + this.docNameLabel.TabIndex = 42; + this.docNameLabel.Text = "Doc.name (0=start 1-end, 2=batch, 3=wm, 4=s/n) :"; + // + // docNameTextBox + // + this.docNameTextBox.Enabled = false; + this.docNameTextBox.Location = new System.Drawing.Point(261, 328); + this.docNameTextBox.Name = "docNameTextBox"; + this.docNameTextBox.Size = new System.Drawing.Size(135, 20); + this.docNameTextBox.TabIndex = 43; + // + // footerItalicCheckBox + // + this.footerItalicCheckBox.AutoSize = true; + this.footerItalicCheckBox.Enabled = false; + this.footerItalicCheckBox.Location = new System.Drawing.Point(334, 173); + this.footerItalicCheckBox.Name = "footerItalicCheckBox"; + this.footerItalicCheckBox.Size = new System.Drawing.Size(15, 14); + this.footerItalicCheckBox.TabIndex = 30; + this.footerItalicCheckBox.UseVisualStyleBackColor = true; + // + // footerBoldCheckBox + // + this.footerBoldCheckBox.AutoSize = true; + this.footerBoldCheckBox.Enabled = false; + this.footerBoldCheckBox.Location = new System.Drawing.Point(306, 173); + this.footerBoldCheckBox.Name = "footerBoldCheckBox"; + this.footerBoldCheckBox.Size = new System.Drawing.Size(15, 14); + this.footerBoldCheckBox.TabIndex = 29; + this.footerBoldCheckBox.UseVisualStyleBackColor = true; + // + // footerFontSizeTextBox + // + this.footerFontSizeTextBox.Enabled = false; + this.footerFontSizeTextBox.Location = new System.Drawing.Point(258, 170); + this.footerFontSizeTextBox.Name = "footerFontSizeTextBox"; + this.footerFontSizeTextBox.Size = new System.Drawing.Size(30, 20); + this.footerFontSizeTextBox.TabIndex = 28; + // + // footerFontFamilyComboBox + // + this.footerFontFamilyComboBox.Enabled = false; + this.footerFontFamilyComboBox.FormattingEnabled = true; + this.footerFontFamilyComboBox.Location = new System.Drawing.Point(142, 170); + this.footerFontFamilyComboBox.Name = "footerFontFamilyComboBox"; + this.footerFontFamilyComboBox.Size = new System.Drawing.Size(110, 21); + this.footerFontFamilyComboBox.TabIndex = 27; + // + // footerFontLabel + // + this.footerFontLabel.AutoSize = true; + this.footerFontLabel.Location = new System.Drawing.Point(16, 173); + this.footerFontLabel.Name = "footerFontLabel"; + this.footerFontLabel.Size = new System.Drawing.Size(107, 13); + this.footerFontLabel.TabIndex = 26; + this.footerFontLabel.Text = "Footer font/size/style"; + // + // imageNameTextBox + // + this.imageNameTextBox.Enabled = false; + this.imageNameTextBox.Location = new System.Drawing.Point(143, 304); + this.imageNameTextBox.Name = "imageNameTextBox"; + this.imageNameTextBox.Size = new System.Drawing.Size(135, 20); + this.imageNameTextBox.TabIndex = 44; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(57, 307); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(87, 13); + this.label3.TabIndex = 45; + this.label3.Text = "Image file name :"; + // + // imageLeftTextBox + // + this.imageLeftTextBox.Enabled = false; + this.imageLeftTextBox.Location = new System.Drawing.Point(143, 282); + this.imageLeftTextBox.Name = "imageLeftTextBox"; + this.imageLeftTextBox.Size = new System.Drawing.Size(33, 20); + this.imageLeftTextBox.TabIndex = 46; + // + // imageTopTextBox + // + this.imageTopTextBox.Enabled = false; + this.imageTopTextBox.Location = new System.Drawing.Point(179, 282); + this.imageTopTextBox.Name = "imageTopTextBox"; + this.imageTopTextBox.Size = new System.Drawing.Size(31, 20); + this.imageTopTextBox.TabIndex = 47; + // + // imageWidthTextBox + // + this.imageWidthTextBox.Enabled = false; + this.imageWidthTextBox.Location = new System.Drawing.Point(213, 282); + this.imageWidthTextBox.Name = "imageWidthTextBox"; + this.imageWidthTextBox.Size = new System.Drawing.Size(31, 20); + this.imageWidthTextBox.TabIndex = 48; + // + // imageHeightTextBox + // + this.imageHeightTextBox.Enabled = false; + this.imageHeightTextBox.Location = new System.Drawing.Point(247, 282); + this.imageHeightTextBox.Name = "imageHeightTextBox"; + this.imageHeightTextBox.Size = new System.Drawing.Size(31, 20); + this.imageHeightTextBox.TabIndex = 49; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(41, 285); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(103, 13); + this.label4.TabIndex = 50; + this.label4.Text = "Image left/top/w/h :"; + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Location = new System.Drawing.Point(109, 266); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(172, 13); + this.label8.TabIndex = 57; + this.label8.Text = "Image coordinates are in 0.254 mm"; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(172, 219); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(15, 13); + this.label6.TabIndex = 67; + this.label6.Text = "%"; + // + // colW0TextBox + // + this.colW0TextBox.Enabled = false; + this.colW0TextBox.Location = new System.Drawing.Point(142, 216); + this.colW0TextBox.Name = "colW0TextBox"; + this.colW0TextBox.Size = new System.Drawing.Size(30, 20); + this.colW0TextBox.TabIndex = 66; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(16, 219); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(97, 13); + this.label5.TabIndex = 58; + this.label5.Text = "Column widths in %"; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(264, 219); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(15, 13); + this.label7.TabIndex = 62; + this.label7.Text = "%"; + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Location = new System.Drawing.Point(218, 219); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(15, 13); + this.label9.TabIndex = 60; + this.label9.Text = "%"; + // + // colW2TextBox + // + this.colW2TextBox.Enabled = false; + this.colW2TextBox.Location = new System.Drawing.Point(234, 216); + this.colW2TextBox.Name = "colW2TextBox"; + this.colW2TextBox.Size = new System.Drawing.Size(30, 20); + this.colW2TextBox.TabIndex = 61; + // + // colW1TextBox + // + this.colW1TextBox.Enabled = false; + this.colW1TextBox.Location = new System.Drawing.Point(188, 216); + this.colW1TextBox.Name = "colW1TextBox"; + this.colW1TextBox.Size = new System.Drawing.Size(30, 20); + this.colW1TextBox.TabIndex = 59; + // + // commonItems3Button + // + this.commonItems3Button.Enabled = false; + this.commonItems3Button.Location = new System.Drawing.Point(393, 215); + this.commonItems3Button.Name = "commonItems3Button"; + this.commonItems3Button.Size = new System.Drawing.Size(47, 23); + this.commonItems3Button.TabIndex = 65; + this.commonItems3Button.Text = "Col. 3"; + this.commonItems3Button.UseVisualStyleBackColor = true; + this.commonItems3Button.Click += new System.EventHandler(this.commonItems3Button_Click); + // + // commonItems2Button + // + this.commonItems2Button.Enabled = false; + this.commonItems2Button.Location = new System.Drawing.Point(340, 215); + this.commonItems2Button.Name = "commonItems2Button"; + this.commonItems2Button.Size = new System.Drawing.Size(47, 23); + this.commonItems2Button.TabIndex = 64; + this.commonItems2Button.Text = "Col. 2"; + this.commonItems2Button.UseVisualStyleBackColor = true; + this.commonItems2Button.Click += new System.EventHandler(this.commonItems2Button_Click); + // + // commonItems1Button + // + this.commonItems1Button.Enabled = false; + this.commonItems1Button.Location = new System.Drawing.Point(287, 215); + this.commonItems1Button.Name = "commonItems1Button"; + this.commonItems1Button.Size = new System.Drawing.Size(47, 23); + this.commonItems1Button.TabIndex = 63; + this.commonItems1Button.Text = "Col. 1"; + this.commonItems1Button.UseVisualStyleBackColor = true; + this.commonItems1Button.Click += new System.EventHandler(this.commonItems1Button_Click); + // + // label10 + // + this.label10.AutoSize = true; + this.label10.Location = new System.Drawing.Point(172, 244); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(15, 13); + this.label10.TabIndex = 74; + this.label10.Text = "%"; + // + // belowW0TextBox + // + this.belowW0TextBox.Enabled = false; + this.belowW0TextBox.Location = new System.Drawing.Point(142, 241); + this.belowW0TextBox.Name = "belowW0TextBox"; + this.belowW0TextBox.Size = new System.Drawing.Size(30, 20); + this.belowW0TextBox.TabIndex = 73; + // + // label11 + // + this.label11.AutoSize = true; + this.label11.Location = new System.Drawing.Point(16, 244); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(97, 13); + this.label11.TabIndex = 68; + this.label11.Text = "Column widths in %"; + // + // label12 + // + this.label12.AutoSize = true; + this.label12.Location = new System.Drawing.Point(264, 244); + this.label12.Name = "label12"; + this.label12.Size = new System.Drawing.Size(15, 13); + this.label12.TabIndex = 72; + this.label12.Text = "%"; + // + // label13 + // + this.label13.AutoSize = true; + this.label13.Location = new System.Drawing.Point(218, 244); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(15, 13); + this.label13.TabIndex = 70; + this.label13.Text = "%"; + // + // belowW2TextBox + // + this.belowW2TextBox.Enabled = false; + this.belowW2TextBox.Location = new System.Drawing.Point(234, 241); + this.belowW2TextBox.Name = "belowW2TextBox"; + this.belowW2TextBox.Size = new System.Drawing.Size(30, 20); + this.belowW2TextBox.TabIndex = 71; + // + // belowW1TextBox + // + this.belowW1TextBox.Enabled = false; + this.belowW1TextBox.Location = new System.Drawing.Point(188, 241); + this.belowW1TextBox.Name = "belowW1TextBox"; + this.belowW1TextBox.Size = new System.Drawing.Size(30, 20); + this.belowW1TextBox.TabIndex = 69; + // + // belowItems3Button + // + this.belowItems3Button.Enabled = false; + this.belowItems3Button.Location = new System.Drawing.Point(393, 281); + this.belowItems3Button.Name = "belowItems3Button"; + this.belowItems3Button.Size = new System.Drawing.Size(47, 23); + this.belowItems3Button.TabIndex = 77; + this.belowItems3Button.Text = "Col. 3"; + this.belowItems3Button.UseVisualStyleBackColor = true; + this.belowItems3Button.Click += new System.EventHandler(this.belowItems3Button_Click); + // + // belowItems2Button + // + this.belowItems2Button.Enabled = false; + this.belowItems2Button.Location = new System.Drawing.Point(340, 281); + this.belowItems2Button.Name = "belowItems2Button"; + this.belowItems2Button.Size = new System.Drawing.Size(47, 23); + this.belowItems2Button.TabIndex = 76; + this.belowItems2Button.Text = "Col. 2"; + this.belowItems2Button.UseVisualStyleBackColor = true; + this.belowItems2Button.Click += new System.EventHandler(this.belowItems2Button_Click); + // + // belowItems1Button + // + this.belowItems1Button.Enabled = false; + this.belowItems1Button.Location = new System.Drawing.Point(287, 281); + this.belowItems1Button.Name = "belowItems1Button"; + this.belowItems1Button.Size = new System.Drawing.Size(47, 23); + this.belowItems1Button.TabIndex = 75; + this.belowItems1Button.Text = "Col. 1"; + this.belowItems1Button.UseVisualStyleBackColor = true; + this.belowItems1Button.Click += new System.EventHandler(this.belowItems1Button_Click); + // + // table1FormComboBox + // + this.table1FormComboBox.Enabled = false; + this.table1FormComboBox.FormattingEnabled = true; + this.table1FormComboBox.Location = new System.Drawing.Point(388, 249); + this.table1FormComboBox.Name = "table1FormComboBox"; + this.table1FormComboBox.Size = new System.Drawing.Size(64, 21); + this.table1FormComboBox.TabIndex = 78; + // + // PrinterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.table1FormComboBox); + this.Controls.Add(this.belowItems3Button); + this.Controls.Add(this.belowItems2Button); + this.Controls.Add(this.belowItems1Button); + this.Controls.Add(this.label10); + this.Controls.Add(this.belowW0TextBox); + this.Controls.Add(this.label11); + this.Controls.Add(this.label12); + this.Controls.Add(this.label13); + this.Controls.Add(this.belowW2TextBox); + this.Controls.Add(this.belowW1TextBox); + this.Controls.Add(this.label6); + this.Controls.Add(this.colW0TextBox); + this.Controls.Add(this.label5); + this.Controls.Add(this.label7); + this.Controls.Add(this.label9); + this.Controls.Add(this.colW2TextBox); + this.Controls.Add(this.colW1TextBox); + this.Controls.Add(this.commonItems3Button); + this.Controls.Add(this.commonItems2Button); + this.Controls.Add(this.commonItems1Button); + this.Controls.Add(this.label8); + this.Controls.Add(this.label4); + this.Controls.Add(this.imageHeightTextBox); + this.Controls.Add(this.imageWidthTextBox); + this.Controls.Add(this.imageTopTextBox); + this.Controls.Add(this.imageLeftTextBox); + this.Controls.Add(this.label3); + this.Controls.Add(this.imageNameTextBox); + this.Controls.Add(this.footerItalicCheckBox); + this.Controls.Add(this.footerBoldCheckBox); + this.Controls.Add(this.footerFontSizeTextBox); + this.Controls.Add(this.footerFontFamilyComboBox); + this.Controls.Add(this.footerFontLabel); + this.Controls.Add(this.docNameTextBox); + this.Controls.Add(this.docNameLabel); + this.Controls.Add(this.templateTextBox); + this.Controls.Add(this.templateLabel); + this.Controls.Add(this.goodOnlyCheckBox); + this.Controls.Add(this.testItems2Button); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.bodyItalicCheckBox); + this.Controls.Add(this.bodyBoldCheckBox); + this.Controls.Add(this.headerItalicCheckBox); + this.Controls.Add(this.headerBoldCheckBox); + this.Controls.Add(this.titleItalicCheckBox); + this.Controls.Add(this.titleBoldCheckBox); + this.Controls.Add(this.bodyFontSizeTextBox); + this.Controls.Add(this.headerFontSizeTextBox); + this.Controls.Add(this.titleFontSizeTextBox); + this.Controls.Add(this.bodyFontFamilyComboBox); + this.Controls.Add(this.bodyFontLabel); + this.Controls.Add(this.headerFontFamilyComboBox); + this.Controls.Add(this.titleFontFamilyComboBox); + this.Controls.Add(this.cultureComboBox); + this.Controls.Add(this.cultureLabel); + this.Controls.Add(this.footerButton); + this.Controls.Add(this.headerButton); + this.Controls.Add(this.testItemsButton); + this.Controls.Add(this.bottomMarginTextBox); + this.Controls.Add(this.titleFontLabel); + this.Controls.Add(this.leftMarginTextBox); + this.Controls.Add(this.headerFontLabel); + this.Controls.Add(this.topMarginTextBox); + this.Controls.Add(this.topMarginLabel); + this.Controls.Add(this.orientationComboBox); + this.Controls.Add(this.orientationLabel); + this.Controls.Add(this.supressPrintingCheckBox); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "PrinterCfgCtrl"; + this.Size = new System.Drawing.Size(455, 350); + this.Load += new System.EventHandler(this.PrinterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.CheckBox supressPrintingCheckBox; + private System.Windows.Forms.Label orientationLabel; + private System.Windows.Forms.ComboBox orientationComboBox; + private System.Windows.Forms.TextBox topMarginTextBox; + private System.Windows.Forms.Label topMarginLabel; + private System.Windows.Forms.TextBox leftMarginTextBox; + private System.Windows.Forms.TextBox bottomMarginTextBox; + private System.Windows.Forms.ComboBox cultureComboBox; + private System.Windows.Forms.Label cultureLabel; + private System.Windows.Forms.Button footerButton; + private System.Windows.Forms.Button headerButton; + private System.Windows.Forms.Button testItemsButton; + private System.Windows.Forms.Label headerFontLabel; + private System.Windows.Forms.Label titleFontLabel; + private System.Windows.Forms.ComboBox titleFontFamilyComboBox; + private System.Windows.Forms.ComboBox headerFontFamilyComboBox; + private System.Windows.Forms.ComboBox bodyFontFamilyComboBox; + private System.Windows.Forms.Label bodyFontLabel; + private System.Windows.Forms.TextBox titleFontSizeTextBox; + private System.Windows.Forms.TextBox headerFontSizeTextBox; + private System.Windows.Forms.TextBox bodyFontSizeTextBox; + private System.Windows.Forms.CheckBox titleBoldCheckBox; + private System.Windows.Forms.CheckBox titleItalicCheckBox; + private System.Windows.Forms.CheckBox headerItalicCheckBox; + private System.Windows.Forms.CheckBox headerBoldCheckBox; + private System.Windows.Forms.CheckBox bodyItalicCheckBox; + private System.Windows.Forms.CheckBox bodyBoldCheckBox; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Button testItems2Button; + private System.Windows.Forms.CheckBox goodOnlyCheckBox; + private System.Windows.Forms.TextBox templateTextBox; + private System.Windows.Forms.Label templateLabel; + private System.Windows.Forms.Label docNameLabel; + private System.Windows.Forms.TextBox docNameTextBox; + private System.Windows.Forms.CheckBox footerItalicCheckBox; + private System.Windows.Forms.CheckBox footerBoldCheckBox; + private System.Windows.Forms.TextBox footerFontSizeTextBox; + private System.Windows.Forms.ComboBox footerFontFamilyComboBox; + private System.Windows.Forms.Label footerFontLabel; + private System.Windows.Forms.TextBox imageNameTextBox; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox imageLeftTextBox; + private System.Windows.Forms.TextBox imageTopTextBox; + private System.Windows.Forms.TextBox imageWidthTextBox; + private System.Windows.Forms.TextBox imageHeightTextBox; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TextBox colW0TextBox; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.TextBox colW2TextBox; + private System.Windows.Forms.TextBox colW1TextBox; + private System.Windows.Forms.Button commonItems3Button; + private System.Windows.Forms.Button commonItems2Button; + private System.Windows.Forms.Button commonItems1Button; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.TextBox belowW0TextBox; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.TextBox belowW2TextBox; + private System.Windows.Forms.TextBox belowW1TextBox; + private System.Windows.Forms.Button belowItems3Button; + private System.Windows.Forms.Button belowItems2Button; + private System.Windows.Forms.Button belowItems1Button; + private System.Windows.Forms.ComboBox table1FormComboBox; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/OnePerMeter/PrinterCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/OnePerMeter/PrinterCfgCtrl.cs new file mode 100644 index 00000000..5d566652 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/OnePerMeter/PrinterCfgCtrl.cs @@ -0,0 +1,596 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; +using TBF.BenchControl.Configs; + +namespace TBF.BenchControl.Output.Printers.OnePerMeter +{ + public partial class PrinterCfgCtrl : ConfigCtrlUtils, IComponentCfgCtrl + { + static readonly ILog log = LogManager.GetLogger(typeof(PrinterCfgCtrl)); + + public bool ShowMore { get { return false; } } + + PrinterCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as PrinterCfg; + Redraw(); + } + } + + string header; + string[] commonItems1; + string[] commonItems2; + string[] commonItems3; + string[] testItems; + string[] testItems2; + string[] belowItems1; + string[] belowItems2; + string[] belowItems3; + string footer; + + public PrinterCfgCtrl() + { + InitializeComponent(); + Localize(); + + orientationComboBox.Items.Add(PageOrientation.Portrait.ToString()); + orientationComboBox.Items.Add(PageOrientation.Landscape.ToString()); + + foreach (var ff in System.Drawing.FontFamily.Families) + { + titleFontFamilyComboBox.Items.Add(ff.Name); + headerFontFamilyComboBox.Items.Add(ff.Name); + bodyFontFamilyComboBox.Items.Add(ff.Name); + footerFontFamilyComboBox.Items.Add(ff.Name); + } + + for (TableForm f = 0; f < TableForm.Count; f++) + { + table1FormComboBox.Items.Add(f.ToString()); + } + } + + private void PrinterCfgCtrl_Load(object sender, EventArgs e) + { + for (Culture s = 0; s < Culture.Count; s++) cultureComboBox.Items.Add(s.ToString()); + + header = config.Header; + commonItems1 = config.CommonItems1; + commonItems2 = config.CommonItems2; + commonItems3 = config.CommonItems3; + testItems = config.SelectedItems; + testItems2 = config.SelectedItems2; + belowItems1 = config.BelowItems1; + belowItems2 = config.BelowItems2; + belowItems3 = config.BelowItems3; + footer = config.Footer; + + Redraw(); + } + + void Localize() + { + nameLabel.Text = Strings.Name; + templateLabel.Text = "Template"; + cultureLabel.Text = "Culture"; + headerButton.Text = Strings.Header; + footerButton.Text = Strings.Footer; + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + templateTextBox.Text = config.Template; + orientationComboBox.Text = config.PageOrientation.ToString(); + topMarginTextBox.Text = config.TopMargin.ToString(); + bottomMarginTextBox.Text = config.BottomMargin.ToString(); + leftMarginTextBox.Text = config.LeftMargin.ToString(); + + titleFontFamilyComboBox.Text = config.TitFntFml; + titleFontSizeTextBox.Text = config.TitFntSz.ToString(); + titleBoldCheckBox.Checked = ((config.TitFntSty & (int)System.Drawing.FontStyle.Bold) != 0); + titleItalicCheckBox.Checked = ((config.TitFntSty & (int)System.Drawing.FontStyle.Italic) != 0); + + headerFontFamilyComboBox.Text = config.HdrFntFml; + headerFontSizeTextBox.Text = config.HdrFntSz.ToString(); + headerBoldCheckBox.Checked = ((config.HdrFntSty & (int)System.Drawing.FontStyle.Bold) != 0); + headerItalicCheckBox.Checked = ((config.HdrFntSty & (int)System.Drawing.FontStyle.Italic) != 0); + + bodyFontFamilyComboBox.Text = config.BodyFntFml; + bodyFontSizeTextBox.Text = config.BodyFntSz.ToString(); + bodyBoldCheckBox.Checked = ((config.BodyFntSty & (int)System.Drawing.FontStyle.Bold) != 0); + bodyItalicCheckBox.Checked = ((config.BodyFntSty & (int)System.Drawing.FontStyle.Italic) != 0); + + footerFontFamilyComboBox.Text = config.FooterFntFml; + footerFontSizeTextBox.Text = config.FooterFntSz.ToString(); + footerBoldCheckBox.Checked = ((config.FooterFntSty & (int)System.Drawing.FontStyle.Bold) != 0); + footerItalicCheckBox.Checked = ((config.FooterFntSty & (int)System.Drawing.FontStyle.Italic) != 0); + + colW0TextBox.Text = config.ColW0Pct.ToString(); + colW1TextBox.Text = config.ColW1Pct.ToString(); + colW2TextBox.Text = config.ColW2Pct.ToString(); + + belowW0TextBox.Text = config.BelowW0Pct.ToString(); + belowW1TextBox.Text = config.BelowW1Pct.ToString(); + belowW2TextBox.Text = config.BelowW2Pct.ToString(); + + supressPrintingCheckBox.Checked = config.SupressPrinting; + goodOnlyCheckBox.Checked = config.GoodOnly; + + cultureComboBox.Text = config.Culture.ToString(); + + docNameTextBox.Text = config.DocName; + imageNameTextBox.Text = config.ImgName; + imageLeftTextBox.Text = config.ImgLeft.ToString(); + imageTopTextBox.Text = config.ImgTop.ToString(); + imageWidthTextBox.Text = config.ImgWid.ToString(); + imageHeightTextBox.Text = config.ImgHgh.ToString(); + + table1FormComboBox.Text = config.Form.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + templateTextBox.Enabled = true; + orientationComboBox.Enabled = true; + topMarginTextBox.Enabled = true; + bottomMarginTextBox.Enabled = true; + leftMarginTextBox.Enabled = true; + titleFontFamilyComboBox.Enabled = true; + titleFontSizeTextBox.Enabled = true; + titleBoldCheckBox.Enabled = true; + titleItalicCheckBox.Enabled = true; + headerFontFamilyComboBox.Enabled = true; + headerFontSizeTextBox.Enabled = true; + headerBoldCheckBox.Enabled = true; + headerItalicCheckBox.Enabled = true; + bodyFontFamilyComboBox.Enabled = true; + bodyFontSizeTextBox.Enabled = true; + bodyBoldCheckBox.Enabled = true; + bodyItalicCheckBox.Enabled = true; + footerFontFamilyComboBox.Enabled = true; + footerFontSizeTextBox.Enabled = true; + footerBoldCheckBox.Enabled = true; + footerItalicCheckBox.Enabled = true; + supressPrintingCheckBox.Enabled = true; + goodOnlyCheckBox.Enabled = true; + cultureComboBox.Enabled = true; + headerButton.Enabled = true; + colW0TextBox.Enabled = true; + colW1TextBox.Enabled = true; + colW2TextBox.Enabled = true; + commonItems1Button.Enabled = true; + commonItems2Button.Enabled = true; + commonItems3Button.Enabled = true; + table1FormComboBox.Enabled = true; + testItemsButton.Enabled = true; + testItems2Button.Enabled = true; + belowW0TextBox.Enabled = true; + belowW1TextBox.Enabled = true; + belowW2TextBox.Enabled = true; + belowItems1Button.Enabled = true; + belowItems2Button.Enabled = true; + belowItems3Button.Enabled = true; + footerButton.Enabled = true; + docNameTextBox.Enabled = true; + imageNameTextBox.Enabled = true; + imageLeftTextBox.Enabled = true; + imageTopTextBox.Enabled = true; + imageWidthTextBox.Enabled = true; + imageHeightTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if ((int)GetOrientation(orientationComboBox.Text) < 0) + { + message += Environment.NewLine + "Invalid 'Page orientation'"; + flags |= CfgUpdateFlags.Error; + } + + int dummy, dummy2, dummy3; + if (!int.TryParse(topMarginTextBox.Text, out dummy) || dummy < 0 || dummy > 500) + { + message += Environment.NewLine + "'Top margin' should be between 0 and 500"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(bottomMarginTextBox.Text, out dummy) || dummy < 0 || dummy > 200) + { + message += Environment.NewLine + "'Bottom margin' should be between 0 and 200"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(leftMarginTextBox.Text, out dummy) || dummy < 0 || dummy > 200) + { + message += Environment.NewLine + "Left margin' should be between 0 and 200"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(titleFontSizeTextBox.Text, out dummy) || dummy < 6 || dummy > 48) + { + message += Environment.NewLine + "Title font size' should be between 6 and 48"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(headerFontSizeTextBox.Text, out dummy) || dummy < 6 || dummy > 48) + { + message += Environment.NewLine + "Header font size' should be between 6 and 48"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(bodyFontSizeTextBox.Text, out dummy) || dummy < 6 || dummy > 48) + { + message += Environment.NewLine + "Body font size' should be between 6 and 48"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(footerFontSizeTextBox.Text, out dummy) || dummy < 4 || dummy > 48) + { + message += Environment.NewLine + "Footer font size' should be between 4 and 48"; + flags |= CfgUpdateFlags.Error; + } + + if (!cultureComboBox.Items.Contains(cultureComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid culture"; + } + + + if (!int.TryParse(colW0TextBox.Text, out dummy) || dummy < 0 || dummy > 100) + { + message += Environment.NewLine + "Column width 0 should be between 0 and 100"; + flags |= CfgUpdateFlags.Error; + } + if (!int.TryParse(colW1TextBox.Text, out dummy2) || dummy2 < 0 || dummy2 > 100) + { + message += Environment.NewLine + "Column width 1 should be between 0 and 100"; + flags |= CfgUpdateFlags.Error; + } + if (!int.TryParse(colW2TextBox.Text, out dummy3) || dummy3 < 0 || dummy3 > 100) + { + message += Environment.NewLine + "Column width 2 should be between 0 and 100"; + flags |= CfgUpdateFlags.Error; + } + if (dummy + dummy2 + dummy3 > 100) + { + message += Environment.NewLine + "Sum of above column widths should be <= 100"; + flags |= CfgUpdateFlags.Error; + } + + + if (!int.TryParse(belowW0TextBox.Text, out dummy) || dummy < 0 || dummy > 100) + { + message += Environment.NewLine + "Column width 0 should be between 0 and 100"; + flags |= CfgUpdateFlags.Error; + } + if (!int.TryParse(belowW1TextBox.Text, out dummy2) || dummy2 < 0 || dummy2 > 100) + { + message += Environment.NewLine + "Column width 1 should be between 0 and 100"; + flags |= CfgUpdateFlags.Error; + } + if (!int.TryParse(belowW2TextBox.Text, out dummy3) || dummy3 < 0 || dummy3 > 100) + { + message += Environment.NewLine + "Column width 2 should be between 0 and 100"; + flags |= CfgUpdateFlags.Error; + } + if (dummy + dummy2 + dummy3 > 100) + { + message += Environment.NewLine + "Sum of below column widths should be <= 100"; + flags |= CfgUpdateFlags.Error; + } + + + if (!int.TryParse(imageLeftTextBox.Text, out dummy) || dummy < 0 || dummy > 1100) + { + message += Environment.NewLine + "Image left' should be between 0 and 1100"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(imageTopTextBox.Text, out dummy) || dummy < 0 || dummy > 1100) + { + message += Environment.NewLine + "Image top' should be between 0 and 1100"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(imageWidthTextBox.Text, out dummy) || dummy < 0 || dummy > 1100) + { + message += Environment.NewLine + "Image width' should be between 0 and 1100"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(imageHeightTextBox.Text, out dummy) || dummy < 0 || dummy > 1100) + { + message += Environment.NewLine + "Image height' should be between 0 and 1100"; + flags |= CfgUpdateFlags.Error; + } + + if (!table1FormComboBox.Items.Contains(table1FormComboBox.Text)) + { + message += Environment.NewLine + "Invalid 'Table form'"; + flags |= CfgUpdateFlags.Error; + } + + return flags; + } + + + /// + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + if (config.Name != nameTextBox.Text) + { + config.Name = nameTextBox.Text; + flags |= CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange; + } + + flags |= UpdateDifferent(ref config.Template, templateTextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + + if (config.PageOrientation != GetOrientation(orientationComboBox.Text)) + { + config.PageOrientation = GetOrientation(orientationComboBox.Text); + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + flags |= UpdateDifferent(ref config.TopMargin, topMarginTextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.BottomMargin, bottomMarginTextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.LeftMargin, leftMarginTextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + + /// Title font properties + flags |= UpdateDifferent(ref config.TitFntFml, titleFontFamilyComboBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.TitFntSz, titleFontSizeTextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + int tmp = (titleBoldCheckBox.Checked ? (int)System.Drawing.FontStyle.Bold : 0) + + (titleItalicCheckBox.Checked ? (int)System.Drawing.FontStyle.Italic : 0); + flags |= UpdateDifferent(ref config.TitFntSty, tmp, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + + /// Header font properties + flags |= UpdateDifferent(ref config.HdrFntFml, headerFontFamilyComboBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.HdrFntSz, headerFontSizeTextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + tmp = (headerBoldCheckBox.Checked ? (int)System.Drawing.FontStyle.Bold : 0) + + (headerItalicCheckBox.Checked ? (int)System.Drawing.FontStyle.Italic : 0); + flags |= UpdateDifferent(ref config.HdrFntSty, tmp, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + + /// Body font properties + flags |= UpdateDifferent(ref config.BodyFntFml, bodyFontFamilyComboBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.BodyFntSz, int.Parse(bodyFontSizeTextBox.Text), CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + tmp = (bodyBoldCheckBox.Checked ? (int)System.Drawing.FontStyle.Bold : 0) + + (bodyItalicCheckBox.Checked ? (int)System.Drawing.FontStyle.Italic : 0); + flags |= UpdateDifferent(ref config.BodyFntSty, tmp, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + + /// Footer font properties + flags |= UpdateDifferent(ref config.FooterFntFml, footerFontFamilyComboBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.FooterFntSz, int.Parse(footerFontSizeTextBox.Text), CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + tmp = (footerBoldCheckBox.Checked ? (int)System.Drawing.FontStyle.Bold : 0) + + (footerItalicCheckBox.Checked ? (int)System.Drawing.FontStyle.Italic : 0); + flags |= UpdateDifferent(ref config.FooterFntSty, tmp, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + + flags |= UpdateDifferent(ref config.SupressPrinting, supressPrintingCheckBox.Checked, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.GoodOnly, goodOnlyCheckBox.Checked, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + + flags |= UpdateDifferent(ref config.ColW0Pct, colW0TextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.ColW1Pct, colW1TextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.ColW2Pct, colW2TextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.BelowW0Pct, belowW0TextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.BelowW1Pct, belowW1TextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.BelowW2Pct, belowW2TextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + + flags |= UpdateDifferent(ref config.Header, header, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.CommonItems1, commonItems1, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.CommonItems2, commonItems2, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.CommonItems3, commonItems3, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.SelectedItems, testItems, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.SelectedItems2, testItems2, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.BelowItems1, belowItems1, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.BelowItems2, belowItems2, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.BelowItems3, belowItems3, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.Footer, footer, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + + for (Culture i = 0; i < Culture.Count; i++) + { + if (i.ToString().Equals(cultureComboBox.Text) && (config.Culture != i)) + { + config.Culture = i; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + break; + } + } + + for (TableForm f = 0; f < TableForm.Count; f++) + { + if (f.ToString().Equals(table1FormComboBox.Text)) + { + config.Form = f; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + } + + flags |= UpdateDifferent(ref config.DocName, docNameTextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.ImgName, imageNameTextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.ImgLeft, imageLeftTextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.ImgTop, imageTopTextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.ImgWid, imageWidthTextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.ImgHgh, imageHeightTextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + + if ((flags & CfgUpdateFlags.InvokeCfgChange) != 0) + { + Printer.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.CfgChange, config)); + } + + return flags; + } + + private void headerButton_Click(object sender, EventArgs e) + { + HeaderFooterDlg dlg = new HeaderFooterDlg(true, string.IsNullOrEmpty(header) ? string.Empty : header.Replace("~", Environment.NewLine)); + if (dlg.ShowDialog() == DialogResult.OK) + { + header = dlg.EditedText.Replace(Environment.NewLine, "~"); + } + } + + + private void commonItems1Button_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg() + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(commonItems1), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + commonItems1 = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems); + } + } + + private void commonItems2Button_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg() + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(commonItems2), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + commonItems2 = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems); + } + } + + private void commonItems3Button_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg() + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(commonItems3), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + commonItems3 = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems); + } + } + + private void testItemsButton_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg(true) + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(testItems), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + testItems = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems); + } + } + + private void testItems2Button_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg(true) + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(testItems2), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + testItems2 = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems); + } + } + + private void belowItems1Button_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg() + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(belowItems1), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + belowItems1 = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems); + } + } + + private void belowItems2Button_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg() + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(belowItems2), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + belowItems2 = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems); + } + } + + private void belowItems3Button_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg() + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(belowItems3), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + belowItems3 = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems); + } + } + + private void footerButton_Click(object sender, EventArgs e) + { + HeaderFooterDlg dlg = new HeaderFooterDlg(false, string.IsNullOrEmpty(footer) ? string.Empty : footer.Replace("~", Environment.NewLine)); + if (dlg.ShowDialog() == DialogResult.OK) + { + footer = dlg.EditedText.Replace(Environment.NewLine, "~"); + } + } + + #region Configuration Change Handling + + public static void OnCmdResponse(object sender, CmdResponseArgs args) + { + if (CmdResponseHandler == null) return; + try { CmdResponseHandler(sender, args); } + catch (Exception e) { log.Error("CmdResponseHandler(...) failed", e); } + } + + public static event EventHandler CmdResponseHandler; + + public void StartResponseHandler() { } + public void StopResponseHandler() { } + + #endregion Configuration Change Handling + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/OnePerMeter/PrinterCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/OnePerMeter/PrinterCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/OnePerMeter/PrinterCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Zapiska/FactoryCompound.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Zapiska/FactoryCompound.cs new file mode 100644 index 00000000..a5439d06 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Zapiska/FactoryCompound.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.Printers.Zapiska +{ + public class FactoryCompound : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".Compound"; } } + + public void ResetStaticProperties() { Printer.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Printer(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Printer(cfg); } + + public IComponentCfg DefaultConfig() { return new PrinterCfg("Printer.Zapiska.Compound", this, Config.Entities.MetersKind.Combined); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(PrinterCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Zapiska/FactoryHeatMeters.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Zapiska/FactoryHeatMeters.cs new file mode 100644 index 00000000..d58d0222 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Zapiska/FactoryHeatMeters.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.Printers.Zapiska +{ + public class FactoryHeatMeters : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".HeatMeters"; } } + + public void ResetStaticProperties() { Printer.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Printer(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Printer(cfg); } + + public IComponentCfg DefaultConfig() { return new PrinterCfg("Printer.Zapiska.HeatMeters", this, Config.Entities.MetersKind.HeatMeter); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(PrinterCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Zapiska/FactorySingle.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Zapiska/FactorySingle.cs new file mode 100644 index 00000000..ac07ae64 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Zapiska/FactorySingle.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.Printers.Zapiska +{ + public class FactorySingle : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".Single"; } } + + public void ResetStaticProperties() { Printer.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Printer(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Printer(cfg); } + + public IComponentCfg DefaultConfig() { return new PrinterCfg("Printer.Zapiska.Single", this, Config.Entities.MetersKind.Single); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(PrinterCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Zapiska/Printer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Zapiska/Printer.cs new file mode 100644 index 00000000..ad814a9f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Zapiska/Printer.cs @@ -0,0 +1,219 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Threading; +using Results.Output.Printers.Zapiska; +using log4net; + +namespace TBF.BenchControl.Output.Printers.Zapiska +{ + public class Printer : ComponentBase, IOperation, GenericDevices.IResultsPrinter + { + private static readonly ILog log = LogManager.GetLogger(typeof(Printer)); + public override string ToString() { return string.Format("Output.Printers.Zapiska({0})", Cfg.ToString(1)); } + + readonly PrinterCfg printerCfg; + + public bool SupressPrinting { get { return printerCfg.SupressPrinting; } } + + /// Data to print + Results.Entities.Batch batch; + + /// + /// Items to print + /// + string header; + IList commonItems; + IList testItems; + string footer; + + + public Printer() { } + + public Printer(Generic.IComponentCfg cfg) + : base(cfg) + { + printerCfg = cfg as PrinterCfg; + ApplyConfig(); + log.Debug(this.ToString()); + } + + + void ApplyConfig() + { + header = string.IsNullOrEmpty(printerCfg.Header) ? string.Empty : printerCfg.Header.Replace("~", Environment.NewLine); + commonItems = Results.WMeterRsltItemSpec.FromStrArray(printerCfg.CommonItems1); + testItems = Results.WMeterRsltItemSpec.FromStrArray(printerCfg.SelectedItems); /// TestID info will be overwritten later on + footer = string.IsNullOrEmpty(printerCfg.Footer) ? string.Empty : printerCfg.Footer.Replace("~", Environment.NewLine); + } + + + #region Configuration Change Handling + + public static void OnCfgChange(object sender, CfgChangeArgs args) + { + if (CfgChangeHandler == null) return; + try { CfgChangeHandler(sender, args); } + catch (Exception e) { log.Error("CfgChangeHandler(...) failed", e); } + } + + public static event EventHandler CfgChangeHandler; + + public override void StartChangeHandler() + { + CfgChangeHandler += delegate(object sender, CfgChangeArgs args) + { + PrinterCfg newCfg = args.Cfg as PrinterCfg; + if (newCfg != null && newCfg.Name.Equals(Name)) + { + if (args.Command == CfgChangeCmd.CfgChange) + { + printerCfg.PageOrientation = newCfg.PageOrientation; + printerCfg.Template = newCfg.Template; + printerCfg.TopMargin = newCfg.TopMargin; + printerCfg.BottomMargin = newCfg.BottomMargin; + printerCfg.LeftMargin = newCfg.LeftMargin; + + printerCfg.TitFntFml = newCfg.TitFntFml; + printerCfg.TitFntSz = newCfg.TitFntSz; + printerCfg.TitFntSty = newCfg.TitFntSty; + printerCfg.HdrFntFml = newCfg.HdrFntFml; + printerCfg.HdrFntSz = newCfg.HdrFntSz; + printerCfg.HdrFntSty = newCfg.HdrFntSty; + printerCfg.BodyFntFml = newCfg.BodyFntFml; + printerCfg.BodyFntSz = newCfg.BodyFntSz; + printerCfg.BodyFntSty = newCfg.BodyFntSty; + printerCfg.FooterFntFml = newCfg.FooterFntFml; + printerCfg.FooterFntSz = newCfg.FooterFntSz; + printerCfg.FooterFntSty = newCfg.FooterFntSty; + + printerCfg.SupressPrinting = newCfg.SupressPrinting; + printerCfg.GoodOnly = newCfg.GoodOnly; + printerCfg.Culture = newCfg.Culture; + printerCfg.Header = newCfg.Header; + printerCfg.ColW0Pct = newCfg.ColW0Pct; + printerCfg.ColW1Pct = newCfg.ColW1Pct; + printerCfg.ColW2Pct = newCfg.ColW2Pct; + printerCfg.CommonItems1 = newCfg.CommonItems1; + printerCfg.CommonItems2 = newCfg.CommonItems2; + printerCfg.CommonItems3 = newCfg.CommonItems3; + printerCfg.SelectedItems = newCfg.SelectedItems; + printerCfg.BelowW0Pct = newCfg.BelowW0Pct; + printerCfg.BelowW1Pct = newCfg.BelowW1Pct; + printerCfg.BelowW2Pct = newCfg.BelowW2Pct; + printerCfg.BelowItems1 = newCfg.BelowItems1; + printerCfg.BelowItems2 = newCfg.BelowItems2; + printerCfg.BelowItems3 = newCfg.BelowItems3; + printerCfg.Footer = newCfg.Footer; + + printerCfg.DocName = newCfg.DocName; + + ApplyConfig(); + } + } + }; + } + + #endregion Configuration Change Handling + + + /// + /// Prints the test cycle results, Events: Event.ResultsPrinted + /// + /// Batch results to print + /// Reference to the operation + public IOperation PrintResultsOp(Results.Entities.Batch batch) + { + this.batch = batch; + return this; + } + + /// Start this operation + public void Start() + { + CultureInfo oriCulture = Thread.CurrentThread.CurrentCulture; + + if (printerCfg.Culture != Culture.system) + { + Thread.CurrentThread.CurrentCulture = new CultureInfo(printerCfg.Culture.ToString()); + } + + string documentName; + try + { + if (string.IsNullOrEmpty(printerCfg.DocName)) throw (new Exception()); + documentName = string.Format(printerCfg.DocName, batch.StartTime, batch.EndTime, batch.BatchNr); + } + catch + { + documentName = string.Format("{0:yyyyMMdd-HHmm}", batch.EndTime); + } + + PrintResults(batch, documentName); + + Thread.CurrentThread.CurrentCulture = oriCulture; + } + + /// Run this operation + /// Event.ResultsPrinted + public Event Run() + { + return Event.ResultsPrinted; + } + + /// Stop this operation + public void Stop() + { + } + + + void PrintResults(Results.Entities.Batch batch, string documentName) + { + if (batch.WaterMeters.Count > 0) + { + ZapiskaPrinterCfg cfg = new ZapiskaPrinterCfg { + PageOrientation = printerCfg.PageOrientation, + Template = printerCfg.Template, + TopMargin = printerCfg.TopMargin, + BottomMargin = printerCfg.BottomMargin, + LeftMargin = printerCfg.LeftMargin, + TitFntFml = printerCfg.TitFntFml, + TitFntSz = printerCfg.TitFntSz, + TitFntSty = printerCfg.TitFntSty, + HdrFntFml = printerCfg.HdrFntFml, + HdrFntSz = printerCfg.HdrFntSz, + HdrFntSty = printerCfg.HdrFntSty, + BodyFntFml = printerCfg.BodyFntFml, + BodyFntSz = printerCfg.BodyFntSz, + BodyFntSty = printerCfg.BodyFntSty, + FooterFntFml = printerCfg.FooterFntFml, + FooterFntSz = printerCfg.FooterFntSz, + FooterFntSty = printerCfg.FooterFntSty, + SupressPrinting = printerCfg.SupressPrinting, + GoodOnly = printerCfg.GoodOnly, + CultureInfo = (printerCfg.Culture == Culture.system) ? Thread.CurrentThread.CurrentCulture : new CultureInfo(printerCfg.Culture.ToString()), + Header = printerCfg.Header, + ColW0Pct = printerCfg.ColW0Pct, + ColW1Pct = printerCfg.ColW1Pct, + ColW2Pct = printerCfg.ColW2Pct, + CommonItems1 = printerCfg.CommonItems1, + CommonItems2 = printerCfg.CommonItems2, + CommonItems3 = printerCfg.CommonItems3, + SelectedItems = printerCfg.SelectedItems, + BelowW0Pct = printerCfg.BelowW0Pct, + BelowW1Pct = printerCfg.BelowW1Pct, + BelowW2Pct = printerCfg.BelowW2Pct, + BelowItems1 = printerCfg.BelowItems1, + BelowItems2 = printerCfg.BelowItems2, + BelowItems3 = printerCfg.BelowItems3, + Footer = printerCfg.Footer, + }; + + new Results.Output.Printers.Zapiska.ZapiskaPrintDocument(batch, cfg, documentName).Print(); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Zapiska/PrinterCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Zapiska/PrinterCfg.cs new file mode 100644 index 00000000..a0879875 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Zapiska/PrinterCfg.cs @@ -0,0 +1,113 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Output.Printers.Zapiska +{ + public class PrinterCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(PrinterCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new PrinterCfgCtrl(); } + + /// + /// Serialized parameters + /// + public PageOrientation PageOrientation; + public string Template; + public int TopMargin; + public int BottomMargin; + public int LeftMargin; + public string TitFntFml; + public string HdrFntFml; + public string BodyFntFml; + public string FooterFntFml; + public int TitFntSz; + public int HdrFntSz; + public int BodyFntSz; + public int FooterFntSz; + public int TitFntSty; + public int HdrFntSty; + public int BodyFntSty; + public int FooterFntSty; + public bool SupressPrinting; /// Bypass printing when true + public Culture Culture; + public bool GoodOnly; + + public string Header; /// =Title + + public int ColW0Pct; + public string[] CommonItems1; + public int ColW1Pct; + public string[] CommonItems2; + public int ColW2Pct; + public string[] CommonItems3; + + public string[] SelectedItems; + + public int BelowW0Pct; + public string[] BelowItems1; + public int BelowW1Pct; + public string[] BelowItems2; + public int BelowW2Pct; + public string[] BelowItems3; + + public string Footer; + public string DocName; + + [XmlIgnore] + public Config.Entities.MetersKind MetersKind; + + /// Private parameterless constructor invoked by all other (public) constructors + PrinterCfg() + { + } + + public PrinterCfg(string name, IComponentFactory factory, Config.Entities.MetersKind metersKind) + : this() + { + Name = name; + Factory = factory; + MetersKind = metersKind; + + Template = string.Empty; + ParentName = string.Empty; + PageOrientation = PageOrientation.Portrait; + TopMargin = 100; + BottomMargin = 100; + LeftMargin = 100; + TitFntFml = "Arial"; + TitFntSz = 18; + TitFntSty = 1; + HdrFntFml = "Arial"; + HdrFntSz = 10; + HdrFntSty = 0; + BodyFntFml = "Arial"; + BodyFntSz = 10; + BodyFntSty = 0; + FooterFntFml = "Arial"; + FooterFntSz = 10; + FooterFntSty = 0; + SupressPrinting = false; + Header = string.Empty; + Footer = string.Empty; + DocName = string.Empty; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Orientation={1}, Margins T={2} B={3} L={4}, SupressPrinting={5}", + Name, + PageOrientation, + TopMargin, + BottomMargin, + LeftMargin, + SupressPrinting ? "yes" : "no" + ); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Zapiska/PrinterCfgCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Zapiska/PrinterCfgCtrl.Designer.cs new file mode 100644 index 00000000..0cb2effa --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Zapiska/PrinterCfgCtrl.Designer.cs @@ -0,0 +1,811 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.Output.Printers.Zapiska +{ + partial class PrinterCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.supressPrintingCheckBox = new System.Windows.Forms.CheckBox(); + this.orientationLabel = new System.Windows.Forms.Label(); + this.orientationComboBox = new System.Windows.Forms.ComboBox(); + this.topMarginTextBox = new System.Windows.Forms.TextBox(); + this.topMarginLabel = new System.Windows.Forms.Label(); + this.leftMarginTextBox = new System.Windows.Forms.TextBox(); + this.bottomMarginTextBox = new System.Windows.Forms.TextBox(); + this.cultureComboBox = new System.Windows.Forms.ComboBox(); + this.cultureLabel = new System.Windows.Forms.Label(); + this.commonItems1Button = new System.Windows.Forms.Button(); + this.footerButton = new System.Windows.Forms.Button(); + this.headerButton = new System.Windows.Forms.Button(); + this.testItemsButton = new System.Windows.Forms.Button(); + this.headerFontLabel = new System.Windows.Forms.Label(); + this.titleFontLabel = new System.Windows.Forms.Label(); + this.titleFontFamilyComboBox = new System.Windows.Forms.ComboBox(); + this.headerFontFamilyComboBox = new System.Windows.Forms.ComboBox(); + this.bodyFontFamilyComboBox = new System.Windows.Forms.ComboBox(); + this.bodyFontLabel = new System.Windows.Forms.Label(); + this.titleFontSizeTextBox = new System.Windows.Forms.TextBox(); + this.headerFontSizeTextBox = new System.Windows.Forms.TextBox(); + this.bodyFontSizeTextBox = new System.Windows.Forms.TextBox(); + this.titleBoldCheckBox = new System.Windows.Forms.CheckBox(); + this.titleItalicCheckBox = new System.Windows.Forms.CheckBox(); + this.headerItalicCheckBox = new System.Windows.Forms.CheckBox(); + this.headerBoldCheckBox = new System.Windows.Forms.CheckBox(); + this.bodyItalicCheckBox = new System.Windows.Forms.CheckBox(); + this.bodyBoldCheckBox = new System.Windows.Forms.CheckBox(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.commonItems2Button = new System.Windows.Forms.Button(); + this.commonItems3Button = new System.Windows.Forms.Button(); + this.colW2TextBox = new System.Windows.Forms.TextBox(); + this.colW1TextBox = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.label6 = new System.Windows.Forms.Label(); + this.colW0TextBox = new System.Windows.Forms.TextBox(); + this.label7 = new System.Windows.Forms.Label(); + this.belowW0TextBox = new System.Windows.Forms.TextBox(); + this.label8 = new System.Windows.Forms.Label(); + this.label9 = new System.Windows.Forms.Label(); + this.label10 = new System.Windows.Forms.Label(); + this.belowW2TextBox = new System.Windows.Forms.TextBox(); + this.belowW1TextBox = new System.Windows.Forms.TextBox(); + this.belowItems3Button = new System.Windows.Forms.Button(); + this.belowItems2Button = new System.Windows.Forms.Button(); + this.belowItems1Button = new System.Windows.Forms.Button(); + this.goodOnlyCheckBox = new System.Windows.Forms.CheckBox(); + this.docNameTextBox = new System.Windows.Forms.TextBox(); + this.docNameLabel = new System.Windows.Forms.Label(); + this.footerItalicCheckBox = new System.Windows.Forms.CheckBox(); + this.footerBoldCheckBox = new System.Windows.Forms.CheckBox(); + this.footerFontSizeTextBox = new System.Windows.Forms.TextBox(); + this.footerFontFamilyComboBox = new System.Windows.Forms.ComboBox(); + this.footerFontLabel = new System.Windows.Forms.Label(); + this.templateTextBox = new System.Windows.Forms.TextBox(); + this.templateLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(142, 23); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(218, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(16, 26); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(139, 6); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // supressPrintingCheckBox + // + this.supressPrintingCheckBox.AutoSize = true; + this.supressPrintingCheckBox.Enabled = false; + this.supressPrintingCheckBox.Location = new System.Drawing.Point(16, 220); + this.supressPrintingCheckBox.Name = "supressPrintingCheckBox"; + this.supressPrintingCheckBox.Size = new System.Drawing.Size(101, 17); + this.supressPrintingCheckBox.TabIndex = 38; + this.supressPrintingCheckBox.Text = "Supress printing"; + this.supressPrintingCheckBox.UseVisualStyleBackColor = true; + // + // orientationLabel + // + this.orientationLabel.AutoSize = true; + this.orientationLabel.Location = new System.Drawing.Point(16, 68); + this.orientationLabel.Name = "orientationLabel"; + this.orientationLabel.Size = new System.Drawing.Size(84, 13); + this.orientationLabel.TabIndex = 3; + this.orientationLabel.Text = "Page orientation"; + // + // orientationComboBox + // + this.orientationComboBox.Enabled = false; + this.orientationComboBox.FormattingEnabled = true; + this.orientationComboBox.Location = new System.Drawing.Point(142, 65); + this.orientationComboBox.Name = "orientationComboBox"; + this.orientationComboBox.Size = new System.Drawing.Size(146, 21); + this.orientationComboBox.TabIndex = 4; + // + // topMarginTextBox + // + this.topMarginTextBox.Enabled = false; + this.topMarginTextBox.Location = new System.Drawing.Point(142, 87); + this.topMarginTextBox.Name = "topMarginTextBox"; + this.topMarginTextBox.Size = new System.Drawing.Size(44, 20); + this.topMarginTextBox.TabIndex = 6; + // + // topMarginLabel + // + this.topMarginLabel.AutoSize = true; + this.topMarginLabel.Location = new System.Drawing.Point(16, 90); + this.topMarginLabel.Name = "topMarginLabel"; + this.topMarginLabel.Size = new System.Drawing.Size(116, 13); + this.topMarginLabel.TabIndex = 5; + this.topMarginLabel.Text = "Top/bottom/left margin"; + // + // leftMarginTextBox + // + this.leftMarginTextBox.Enabled = false; + this.leftMarginTextBox.Location = new System.Drawing.Point(244, 87); + this.leftMarginTextBox.Name = "leftMarginTextBox"; + this.leftMarginTextBox.Size = new System.Drawing.Size(44, 20); + this.leftMarginTextBox.TabIndex = 8; + // + // bottomMarginTextBox + // + this.bottomMarginTextBox.Enabled = false; + this.bottomMarginTextBox.Location = new System.Drawing.Point(193, 87); + this.bottomMarginTextBox.Name = "bottomMarginTextBox"; + this.bottomMarginTextBox.Size = new System.Drawing.Size(44, 20); + this.bottomMarginTextBox.TabIndex = 7; + // + // cultureComboBox + // + this.cultureComboBox.Enabled = false; + this.cultureComboBox.FormattingEnabled = true; + this.cultureComboBox.Location = new System.Drawing.Point(142, 196); + this.cultureComboBox.Name = "cultureComboBox"; + this.cultureComboBox.Size = new System.Drawing.Size(218, 21); + this.cultureComboBox.TabIndex = 26; + // + // cultureLabel + // + this.cultureLabel.AutoSize = true; + this.cultureLabel.Location = new System.Drawing.Point(16, 197); + this.cultureLabel.Name = "cultureLabel"; + this.cultureLabel.Size = new System.Drawing.Size(42, 13); + this.cultureLabel.TabIndex = 25; + this.cultureLabel.Text = "Cullture"; + // + // commonItems1Button + // + this.commonItems1Button.Enabled = false; + this.commonItems1Button.Location = new System.Drawing.Point(301, 240); + this.commonItems1Button.Name = "commonItems1Button"; + this.commonItems1Button.Size = new System.Drawing.Size(47, 23); + this.commonItems1Button.TabIndex = 33; + this.commonItems1Button.Text = "Col. 1"; + this.commonItems1Button.UseVisualStyleBackColor = true; + this.commonItems1Button.Click += new System.EventHandler(this.commonItems1Button_Click); + // + // footerButton + // + this.footerButton.Enabled = false; + this.footerButton.Location = new System.Drawing.Point(142, 306); + this.footerButton.Name = "footerButton"; + this.footerButton.Size = new System.Drawing.Size(312, 23); + this.footerButton.TabIndex = 37; + this.footerButton.Text = "Footer"; + this.footerButton.UseVisualStyleBackColor = true; + this.footerButton.Click += new System.EventHandler(this.footerButton_Click); + // + // headerButton + // + this.headerButton.Enabled = false; + this.headerButton.Location = new System.Drawing.Point(142, 218); + this.headerButton.Name = "headerButton"; + this.headerButton.Size = new System.Drawing.Size(312, 23); + this.headerButton.TabIndex = 27; + this.headerButton.Text = "Title"; + this.headerButton.UseVisualStyleBackColor = true; + this.headerButton.Click += new System.EventHandler(this.headerButton_Click); + // + // testItemsButton + // + this.testItemsButton.Enabled = false; + this.testItemsButton.Location = new System.Drawing.Point(142, 262); + this.testItemsButton.Name = "testItemsButton"; + this.testItemsButton.Size = new System.Drawing.Size(312, 23); + this.testItemsButton.TabIndex = 36; + this.testItemsButton.Text = "Water meter items"; + this.testItemsButton.UseVisualStyleBackColor = true; + this.testItemsButton.Click += new System.EventHandler(this.testItemsButton_Click); + // + // headerFontLabel + // + this.headerFontLabel.AutoSize = true; + this.headerFontLabel.Location = new System.Drawing.Point(16, 133); + this.headerFontLabel.Name = "headerFontLabel"; + this.headerFontLabel.Size = new System.Drawing.Size(112, 13); + this.headerFontLabel.TabIndex = 14; + this.headerFontLabel.Text = "Header font/size/style"; + // + // titleFontLabel + // + this.titleFontLabel.AutoSize = true; + this.titleFontLabel.Location = new System.Drawing.Point(16, 111); + this.titleFontLabel.Name = "titleFontLabel"; + this.titleFontLabel.Size = new System.Drawing.Size(97, 13); + this.titleFontLabel.TabIndex = 9; + this.titleFontLabel.Text = "Title font/size/style"; + // + // titleFontFamilyComboBox + // + this.titleFontFamilyComboBox.Enabled = false; + this.titleFontFamilyComboBox.FormattingEnabled = true; + this.titleFontFamilyComboBox.Location = new System.Drawing.Point(142, 108); + this.titleFontFamilyComboBox.Name = "titleFontFamilyComboBox"; + this.titleFontFamilyComboBox.Size = new System.Drawing.Size(110, 21); + this.titleFontFamilyComboBox.TabIndex = 10; + // + // headerFontFamilyComboBox + // + this.headerFontFamilyComboBox.Enabled = false; + this.headerFontFamilyComboBox.FormattingEnabled = true; + this.headerFontFamilyComboBox.Location = new System.Drawing.Point(142, 130); + this.headerFontFamilyComboBox.Name = "headerFontFamilyComboBox"; + this.headerFontFamilyComboBox.Size = new System.Drawing.Size(110, 21); + this.headerFontFamilyComboBox.TabIndex = 15; + // + // bodyFontFamilyComboBox + // + this.bodyFontFamilyComboBox.Enabled = false; + this.bodyFontFamilyComboBox.FormattingEnabled = true; + this.bodyFontFamilyComboBox.Location = new System.Drawing.Point(142, 152); + this.bodyFontFamilyComboBox.Name = "bodyFontFamilyComboBox"; + this.bodyFontFamilyComboBox.Size = new System.Drawing.Size(110, 21); + this.bodyFontFamilyComboBox.TabIndex = 20; + // + // bodyFontLabel + // + this.bodyFontLabel.AutoSize = true; + this.bodyFontLabel.Location = new System.Drawing.Point(16, 155); + this.bodyFontLabel.Name = "bodyFontLabel"; + this.bodyFontLabel.Size = new System.Drawing.Size(101, 13); + this.bodyFontLabel.TabIndex = 19; + this.bodyFontLabel.Text = "Body font/size/style"; + // + // titleFontSizeTextBox + // + this.titleFontSizeTextBox.Enabled = false; + this.titleFontSizeTextBox.Location = new System.Drawing.Point(258, 108); + this.titleFontSizeTextBox.Name = "titleFontSizeTextBox"; + this.titleFontSizeTextBox.Size = new System.Drawing.Size(30, 20); + this.titleFontSizeTextBox.TabIndex = 11; + // + // headerFontSizeTextBox + // + this.headerFontSizeTextBox.Enabled = false; + this.headerFontSizeTextBox.Location = new System.Drawing.Point(258, 130); + this.headerFontSizeTextBox.Name = "headerFontSizeTextBox"; + this.headerFontSizeTextBox.Size = new System.Drawing.Size(30, 20); + this.headerFontSizeTextBox.TabIndex = 16; + // + // bodyFontSizeTextBox + // + this.bodyFontSizeTextBox.Enabled = false; + this.bodyFontSizeTextBox.Location = new System.Drawing.Point(258, 152); + this.bodyFontSizeTextBox.Name = "bodyFontSizeTextBox"; + this.bodyFontSizeTextBox.Size = new System.Drawing.Size(29, 20); + this.bodyFontSizeTextBox.TabIndex = 21; + // + // titleBoldCheckBox + // + this.titleBoldCheckBox.AutoSize = true; + this.titleBoldCheckBox.Enabled = false; + this.titleBoldCheckBox.Location = new System.Drawing.Point(306, 111); + this.titleBoldCheckBox.Name = "titleBoldCheckBox"; + this.titleBoldCheckBox.Size = new System.Drawing.Size(15, 14); + this.titleBoldCheckBox.TabIndex = 12; + this.titleBoldCheckBox.UseVisualStyleBackColor = true; + // + // titleItalicCheckBox + // + this.titleItalicCheckBox.AutoSize = true; + this.titleItalicCheckBox.Enabled = false; + this.titleItalicCheckBox.Location = new System.Drawing.Point(334, 111); + this.titleItalicCheckBox.Name = "titleItalicCheckBox"; + this.titleItalicCheckBox.Size = new System.Drawing.Size(15, 14); + this.titleItalicCheckBox.TabIndex = 13; + this.titleItalicCheckBox.UseVisualStyleBackColor = true; + // + // headerItalicCheckBox + // + this.headerItalicCheckBox.AutoSize = true; + this.headerItalicCheckBox.Enabled = false; + this.headerItalicCheckBox.Location = new System.Drawing.Point(334, 133); + this.headerItalicCheckBox.Name = "headerItalicCheckBox"; + this.headerItalicCheckBox.Size = new System.Drawing.Size(15, 14); + this.headerItalicCheckBox.TabIndex = 18; + this.headerItalicCheckBox.UseVisualStyleBackColor = true; + // + // headerBoldCheckBox + // + this.headerBoldCheckBox.AutoSize = true; + this.headerBoldCheckBox.Enabled = false; + this.headerBoldCheckBox.Location = new System.Drawing.Point(306, 133); + this.headerBoldCheckBox.Name = "headerBoldCheckBox"; + this.headerBoldCheckBox.Size = new System.Drawing.Size(15, 14); + this.headerBoldCheckBox.TabIndex = 17; + this.headerBoldCheckBox.UseVisualStyleBackColor = true; + // + // bodyItalicCheckBox + // + this.bodyItalicCheckBox.AutoSize = true; + this.bodyItalicCheckBox.Enabled = false; + this.bodyItalicCheckBox.Location = new System.Drawing.Point(334, 155); + this.bodyItalicCheckBox.Name = "bodyItalicCheckBox"; + this.bodyItalicCheckBox.Size = new System.Drawing.Size(15, 14); + this.bodyItalicCheckBox.TabIndex = 23; + this.bodyItalicCheckBox.UseVisualStyleBackColor = true; + // + // bodyBoldCheckBox + // + this.bodyBoldCheckBox.AutoSize = true; + this.bodyBoldCheckBox.Enabled = false; + this.bodyBoldCheckBox.Location = new System.Drawing.Point(306, 155); + this.bodyBoldCheckBox.Name = "bodyBoldCheckBox"; + this.bodyBoldCheckBox.Size = new System.Drawing.Size(15, 14); + this.bodyBoldCheckBox.TabIndex = 22; + this.bodyBoldCheckBox.UseVisualStyleBackColor = true; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label1.Location = new System.Drawing.Point(296, 96); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(32, 13); + this.label1.TabIndex = 31; + this.label1.Text = "Bold"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.label2.Location = new System.Drawing.Point(330, 96); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(24, 13); + this.label2.TabIndex = 32; + this.label2.Text = "Ital."; + // + // commonItems2Button + // + this.commonItems2Button.Enabled = false; + this.commonItems2Button.Location = new System.Drawing.Point(354, 240); + this.commonItems2Button.Name = "commonItems2Button"; + this.commonItems2Button.Size = new System.Drawing.Size(47, 23); + this.commonItems2Button.TabIndex = 34; + this.commonItems2Button.Text = "Col. 2"; + this.commonItems2Button.UseVisualStyleBackColor = true; + this.commonItems2Button.Click += new System.EventHandler(this.commonItems2Button_Click); + // + // commonItems3Button + // + this.commonItems3Button.Enabled = false; + this.commonItems3Button.Location = new System.Drawing.Point(407, 240); + this.commonItems3Button.Name = "commonItems3Button"; + this.commonItems3Button.Size = new System.Drawing.Size(47, 23); + this.commonItems3Button.TabIndex = 35; + this.commonItems3Button.Text = "Col. 3"; + this.commonItems3Button.UseVisualStyleBackColor = true; + this.commonItems3Button.Click += new System.EventHandler(this.commonItems3Button_Click); + // + // colW2TextBox + // + this.colW2TextBox.Enabled = false; + this.colW2TextBox.Location = new System.Drawing.Point(245, 241); + this.colW2TextBox.Name = "colW2TextBox"; + this.colW2TextBox.Size = new System.Drawing.Size(30, 20); + this.colW2TextBox.TabIndex = 31; + // + // colW1TextBox + // + this.colW1TextBox.Enabled = false; + this.colW1TextBox.Location = new System.Drawing.Point(192, 241); + this.colW1TextBox.Name = "colW1TextBox"; + this.colW1TextBox.Size = new System.Drawing.Size(30, 20); + this.colW1TextBox.TabIndex = 29; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(222, 244); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(15, 13); + this.label3.TabIndex = 30; + this.label3.Text = "%"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(275, 244); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(15, 13); + this.label4.TabIndex = 32; + this.label4.Text = "%"; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(16, 243); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(97, 13); + this.label5.TabIndex = 28; + this.label5.Text = "Column widths in %"; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(172, 244); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(15, 13); + this.label6.TabIndex = 40; + this.label6.Text = "%"; + // + // colW0TextBox + // + this.colW0TextBox.Enabled = false; + this.colW0TextBox.Location = new System.Drawing.Point(142, 241); + this.colW0TextBox.Name = "colW0TextBox"; + this.colW0TextBox.Size = new System.Drawing.Size(30, 20); + this.colW0TextBox.TabIndex = 39; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(172, 289); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(15, 13); + this.label7.TabIndex = 50; + this.label7.Text = "%"; + // + // belowW0TextBox + // + this.belowW0TextBox.Enabled = false; + this.belowW0TextBox.Location = new System.Drawing.Point(142, 286); + this.belowW0TextBox.Name = "belowW0TextBox"; + this.belowW0TextBox.Size = new System.Drawing.Size(30, 20); + this.belowW0TextBox.TabIndex = 49; + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Location = new System.Drawing.Point(16, 288); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(97, 13); + this.label8.TabIndex = 41; + this.label8.Text = "Column widths in %"; + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Location = new System.Drawing.Point(275, 289); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(15, 13); + this.label9.TabIndex = 45; + this.label9.Text = "%"; + // + // label10 + // + this.label10.AutoSize = true; + this.label10.Location = new System.Drawing.Point(222, 289); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(15, 13); + this.label10.TabIndex = 43; + this.label10.Text = "%"; + // + // belowW2TextBox + // + this.belowW2TextBox.Enabled = false; + this.belowW2TextBox.Location = new System.Drawing.Point(245, 286); + this.belowW2TextBox.Name = "belowW2TextBox"; + this.belowW2TextBox.Size = new System.Drawing.Size(30, 20); + this.belowW2TextBox.TabIndex = 44; + // + // belowW1TextBox + // + this.belowW1TextBox.Enabled = false; + this.belowW1TextBox.Location = new System.Drawing.Point(192, 286); + this.belowW1TextBox.Name = "belowW1TextBox"; + this.belowW1TextBox.Size = new System.Drawing.Size(30, 20); + this.belowW1TextBox.TabIndex = 42; + // + // belowItems3Button + // + this.belowItems3Button.Enabled = false; + this.belowItems3Button.Location = new System.Drawing.Point(407, 284); + this.belowItems3Button.Name = "belowItems3Button"; + this.belowItems3Button.Size = new System.Drawing.Size(47, 23); + this.belowItems3Button.TabIndex = 48; + this.belowItems3Button.Text = "Col. 3"; + this.belowItems3Button.UseVisualStyleBackColor = true; + this.belowItems3Button.Click += new System.EventHandler(this.belowItems3Button_Click); + // + // belowItems2Button + // + this.belowItems2Button.Enabled = false; + this.belowItems2Button.Location = new System.Drawing.Point(354, 284); + this.belowItems2Button.Name = "belowItems2Button"; + this.belowItems2Button.Size = new System.Drawing.Size(47, 23); + this.belowItems2Button.TabIndex = 47; + this.belowItems2Button.Text = "Col. 2"; + this.belowItems2Button.UseVisualStyleBackColor = true; + this.belowItems2Button.Click += new System.EventHandler(this.belowItems2Button_Click); + // + // belowItems1Button + // + this.belowItems1Button.Enabled = false; + this.belowItems1Button.Location = new System.Drawing.Point(301, 284); + this.belowItems1Button.Name = "belowItems1Button"; + this.belowItems1Button.Size = new System.Drawing.Size(47, 23); + this.belowItems1Button.TabIndex = 46; + this.belowItems1Button.Text = "Col. 1"; + this.belowItems1Button.UseVisualStyleBackColor = true; + this.belowItems1Button.Click += new System.EventHandler(this.belowItems1Button_Click); + // + // goodOnlyCheckBox + // + this.goodOnlyCheckBox.AutoSize = true; + this.goodOnlyCheckBox.Enabled = false; + this.goodOnlyCheckBox.Location = new System.Drawing.Point(16, 266); + this.goodOnlyCheckBox.Name = "goodOnlyCheckBox"; + this.goodOnlyCheckBox.Size = new System.Drawing.Size(74, 17); + this.goodOnlyCheckBox.TabIndex = 51; + this.goodOnlyCheckBox.Text = "Good only"; + this.goodOnlyCheckBox.UseVisualStyleBackColor = true; + // + // docNameTextBox + // + this.docNameTextBox.Enabled = false; + this.docNameTextBox.Location = new System.Drawing.Point(197, 329); + this.docNameTextBox.Name = "docNameTextBox"; + this.docNameTextBox.Size = new System.Drawing.Size(163, 20); + this.docNameTextBox.TabIndex = 53; + // + // docNameLabel + // + this.docNameLabel.AutoSize = true; + this.docNameLabel.Location = new System.Drawing.Point(16, 332); + this.docNameLabel.Name = "docNameLabel"; + this.docNameLabel.Size = new System.Drawing.Size(175, 13); + this.docNameLabel.TabIndex = 52; + this.docNameLabel.Text = "Doc.name (0=start 1-end, 2=batch):"; + // + // footerItalicCheckBox + // + this.footerItalicCheckBox.AutoSize = true; + this.footerItalicCheckBox.Enabled = false; + this.footerItalicCheckBox.Location = new System.Drawing.Point(334, 177); + this.footerItalicCheckBox.Name = "footerItalicCheckBox"; + this.footerItalicCheckBox.Size = new System.Drawing.Size(15, 14); + this.footerItalicCheckBox.TabIndex = 58; + this.footerItalicCheckBox.UseVisualStyleBackColor = true; + // + // footerBoldCheckBox + // + this.footerBoldCheckBox.AutoSize = true; + this.footerBoldCheckBox.Enabled = false; + this.footerBoldCheckBox.Location = new System.Drawing.Point(306, 177); + this.footerBoldCheckBox.Name = "footerBoldCheckBox"; + this.footerBoldCheckBox.Size = new System.Drawing.Size(15, 14); + this.footerBoldCheckBox.TabIndex = 57; + this.footerBoldCheckBox.UseVisualStyleBackColor = true; + // + // footerFontSizeTextBox + // + this.footerFontSizeTextBox.Enabled = false; + this.footerFontSizeTextBox.Location = new System.Drawing.Point(258, 174); + this.footerFontSizeTextBox.Name = "footerFontSizeTextBox"; + this.footerFontSizeTextBox.Size = new System.Drawing.Size(29, 20); + this.footerFontSizeTextBox.TabIndex = 56; + // + // footerFontFamilyComboBox + // + this.footerFontFamilyComboBox.Enabled = false; + this.footerFontFamilyComboBox.FormattingEnabled = true; + this.footerFontFamilyComboBox.Location = new System.Drawing.Point(142, 174); + this.footerFontFamilyComboBox.Name = "footerFontFamilyComboBox"; + this.footerFontFamilyComboBox.Size = new System.Drawing.Size(110, 21); + this.footerFontFamilyComboBox.TabIndex = 55; + // + // footerFontLabel + // + this.footerFontLabel.AutoSize = true; + this.footerFontLabel.Location = new System.Drawing.Point(16, 177); + this.footerFontLabel.Name = "footerFontLabel"; + this.footerFontLabel.Size = new System.Drawing.Size(107, 13); + this.footerFontLabel.TabIndex = 54; + this.footerFontLabel.Text = "Footer font/size/style"; + // + // templateTextBox + // + this.templateTextBox.Enabled = false; + this.templateTextBox.Location = new System.Drawing.Point(142, 44); + this.templateTextBox.Name = "templateTextBox"; + this.templateTextBox.Size = new System.Drawing.Size(218, 20); + this.templateTextBox.TabIndex = 60; + // + // templateLabel + // + this.templateLabel.AutoSize = true; + this.templateLabel.Location = new System.Drawing.Point(16, 47); + this.templateLabel.Name = "templateLabel"; + this.templateLabel.Size = new System.Drawing.Size(51, 13); + this.templateLabel.TabIndex = 59; + this.templateLabel.Text = "Template"; + // + // PrinterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.templateTextBox); + this.Controls.Add(this.templateLabel); + this.Controls.Add(this.footerItalicCheckBox); + this.Controls.Add(this.footerBoldCheckBox); + this.Controls.Add(this.footerFontSizeTextBox); + this.Controls.Add(this.footerFontFamilyComboBox); + this.Controls.Add(this.footerFontLabel); + this.Controls.Add(this.docNameTextBox); + this.Controls.Add(this.docNameLabel); + this.Controls.Add(this.goodOnlyCheckBox); + this.Controls.Add(this.label7); + this.Controls.Add(this.belowW0TextBox); + this.Controls.Add(this.label8); + this.Controls.Add(this.label9); + this.Controls.Add(this.label10); + this.Controls.Add(this.belowW2TextBox); + this.Controls.Add(this.belowW1TextBox); + this.Controls.Add(this.belowItems3Button); + this.Controls.Add(this.belowItems2Button); + this.Controls.Add(this.belowItems1Button); + this.Controls.Add(this.label6); + this.Controls.Add(this.colW0TextBox); + this.Controls.Add(this.label5); + this.Controls.Add(this.label4); + this.Controls.Add(this.label3); + this.Controls.Add(this.colW2TextBox); + this.Controls.Add(this.colW1TextBox); + this.Controls.Add(this.commonItems3Button); + this.Controls.Add(this.commonItems2Button); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.bodyItalicCheckBox); + this.Controls.Add(this.bodyBoldCheckBox); + this.Controls.Add(this.headerItalicCheckBox); + this.Controls.Add(this.headerBoldCheckBox); + this.Controls.Add(this.titleItalicCheckBox); + this.Controls.Add(this.titleBoldCheckBox); + this.Controls.Add(this.bodyFontSizeTextBox); + this.Controls.Add(this.headerFontSizeTextBox); + this.Controls.Add(this.titleFontSizeTextBox); + this.Controls.Add(this.bodyFontFamilyComboBox); + this.Controls.Add(this.bodyFontLabel); + this.Controls.Add(this.headerFontFamilyComboBox); + this.Controls.Add(this.titleFontFamilyComboBox); + this.Controls.Add(this.cultureComboBox); + this.Controls.Add(this.cultureLabel); + this.Controls.Add(this.commonItems1Button); + this.Controls.Add(this.footerButton); + this.Controls.Add(this.headerButton); + this.Controls.Add(this.testItemsButton); + this.Controls.Add(this.bottomMarginTextBox); + this.Controls.Add(this.titleFontLabel); + this.Controls.Add(this.leftMarginTextBox); + this.Controls.Add(this.headerFontLabel); + this.Controls.Add(this.topMarginTextBox); + this.Controls.Add(this.topMarginLabel); + this.Controls.Add(this.orientationComboBox); + this.Controls.Add(this.orientationLabel); + this.Controls.Add(this.supressPrintingCheckBox); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "PrinterCfgCtrl"; + this.Size = new System.Drawing.Size(492, 350); + this.Load += new System.EventHandler(this.PrinterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.CheckBox supressPrintingCheckBox; + private System.Windows.Forms.Label orientationLabel; + private System.Windows.Forms.ComboBox orientationComboBox; + private System.Windows.Forms.TextBox topMarginTextBox; + private System.Windows.Forms.Label topMarginLabel; + private System.Windows.Forms.TextBox leftMarginTextBox; + private System.Windows.Forms.TextBox bottomMarginTextBox; + private System.Windows.Forms.ComboBox cultureComboBox; + private System.Windows.Forms.Label cultureLabel; + private System.Windows.Forms.Button commonItems1Button; + private System.Windows.Forms.Button footerButton; + private System.Windows.Forms.Button headerButton; + private System.Windows.Forms.Button testItemsButton; + private System.Windows.Forms.Label headerFontLabel; + private System.Windows.Forms.Label titleFontLabel; + private System.Windows.Forms.ComboBox titleFontFamilyComboBox; + private System.Windows.Forms.ComboBox headerFontFamilyComboBox; + private System.Windows.Forms.ComboBox bodyFontFamilyComboBox; + private System.Windows.Forms.Label bodyFontLabel; + private System.Windows.Forms.TextBox titleFontSizeTextBox; + private System.Windows.Forms.TextBox headerFontSizeTextBox; + private System.Windows.Forms.TextBox bodyFontSizeTextBox; + private System.Windows.Forms.CheckBox titleBoldCheckBox; + private System.Windows.Forms.CheckBox titleItalicCheckBox; + private System.Windows.Forms.CheckBox headerItalicCheckBox; + private System.Windows.Forms.CheckBox headerBoldCheckBox; + private System.Windows.Forms.CheckBox bodyItalicCheckBox; + private System.Windows.Forms.CheckBox bodyBoldCheckBox; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Button commonItems2Button; + private System.Windows.Forms.Button commonItems3Button; + private System.Windows.Forms.TextBox colW2TextBox; + private System.Windows.Forms.TextBox colW1TextBox; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TextBox colW0TextBox; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.TextBox belowW0TextBox; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.TextBox belowW2TextBox; + private System.Windows.Forms.TextBox belowW1TextBox; + private System.Windows.Forms.Button belowItems3Button; + private System.Windows.Forms.Button belowItems2Button; + private System.Windows.Forms.Button belowItems1Button; + private System.Windows.Forms.CheckBox goodOnlyCheckBox; + private System.Windows.Forms.TextBox docNameTextBox; + private System.Windows.Forms.Label docNameLabel; + private System.Windows.Forms.CheckBox footerItalicCheckBox; + private System.Windows.Forms.CheckBox footerBoldCheckBox; + private System.Windows.Forms.TextBox footerFontSizeTextBox; + private System.Windows.Forms.ComboBox footerFontFamilyComboBox; + private System.Windows.Forms.Label footerFontLabel; + private System.Windows.Forms.TextBox templateTextBox; + private System.Windows.Forms.Label templateLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Zapiska/PrinterCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Zapiska/PrinterCfgCtrl.cs new file mode 100644 index 00000000..b569ec77 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Zapiska/PrinterCfgCtrl.cs @@ -0,0 +1,519 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; +using TBF.BenchControl.Configs; + +namespace TBF.BenchControl.Output.Printers.Zapiska +{ + public partial class PrinterCfgCtrl : ConfigCtrlUtils, IComponentCfgCtrl + { + static readonly ILog log = LogManager.GetLogger(typeof(PrinterCfgCtrl)); + + public bool ShowMore { get { return false; } } + + PrinterCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as PrinterCfg; + Redraw(); + } + } + + string header; + string[] commonItems1; + string[] commonItems2; + string[] commonItems3; + string[] testItems; + string[] belowItems1; + string[] belowItems2; + string[] belowItems3; + string footer; + + public PrinterCfgCtrl() + { + InitializeComponent(); + Localize(); + + orientationComboBox.Items.Add(PageOrientation.Portrait.ToString()); + orientationComboBox.Items.Add(PageOrientation.Landscape.ToString()); + + foreach (var ff in System.Drawing.FontFamily.Families) + { + titleFontFamilyComboBox.Items.Add(ff.Name); + headerFontFamilyComboBox.Items.Add(ff.Name); + bodyFontFamilyComboBox.Items.Add(ff.Name); + footerFontFamilyComboBox.Items.Add(ff.Name); + } + } + + private void PrinterCfgCtrl_Load(object sender, EventArgs e) + { + for (Culture s = 0; s < Culture.Count; s++) cultureComboBox.Items.Add(s.ToString()); + + header = config.Header; + commonItems1 = config.CommonItems1; + commonItems2 = config.CommonItems2; + commonItems3 = config.CommonItems3; + testItems = config.SelectedItems; + belowItems1 = config.BelowItems1; + belowItems2 = config.BelowItems2; + belowItems3 = config.BelowItems3; + footer = config.Footer; + + Redraw(); + } + + void Localize() + { + nameLabel.Text = Strings.Name; + cultureLabel.Text = "Culture"; + headerButton.Text = Strings.Header; + commonItems1Button.Text = "Common 1"; + commonItems2Button.Text = "Common 2"; + commonItems3Button.Text = "Common 3"; + testItemsButton.Text = "Test items"; + footerButton.Text = Strings.Footer; + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + templateTextBox.Text = config.Template; + orientationComboBox.Text = config.PageOrientation.ToString(); + topMarginTextBox.Text = config.TopMargin.ToString(); + bottomMarginTextBox.Text = config.BottomMargin.ToString(); + leftMarginTextBox.Text = config.LeftMargin.ToString(); + + titleFontFamilyComboBox.Text = config.TitFntFml; + titleFontSizeTextBox.Text = config.TitFntSz.ToString(); + titleBoldCheckBox.Checked = ((config.TitFntSty & (int)System.Drawing.FontStyle.Bold) != 0); + titleItalicCheckBox.Checked = ((config.TitFntSty & (int)System.Drawing.FontStyle.Italic) != 0); + + headerFontFamilyComboBox.Text = config.HdrFntFml; + headerFontSizeTextBox.Text = config.HdrFntSz.ToString(); + headerBoldCheckBox.Checked = ((config.HdrFntSty & (int)System.Drawing.FontStyle.Bold) != 0); + headerItalicCheckBox.Checked = ((config.HdrFntSty & (int)System.Drawing.FontStyle.Italic) != 0); + + bodyFontFamilyComboBox.Text = config.BodyFntFml; + bodyFontSizeTextBox.Text = config.BodyFntSz.ToString(); + bodyBoldCheckBox.Checked = ((config.BodyFntSty & (int)System.Drawing.FontStyle.Bold) != 0); + bodyItalicCheckBox.Checked = ((config.BodyFntSty & (int)System.Drawing.FontStyle.Italic) != 0); + + footerFontFamilyComboBox.Text = config.FooterFntFml; + footerFontSizeTextBox.Text = config.FooterFntSz.ToString(); + footerBoldCheckBox.Checked = ((config.FooterFntSty & (int)System.Drawing.FontStyle.Bold) != 0); + footerItalicCheckBox.Checked = ((config.FooterFntSty & (int)System.Drawing.FontStyle.Italic) != 0); + + colW0TextBox.Text = config.ColW0Pct.ToString(); + colW1TextBox.Text = config.ColW1Pct.ToString(); + colW2TextBox.Text = config.ColW2Pct.ToString(); + + belowW0TextBox.Text = config.BelowW0Pct.ToString(); + belowW1TextBox.Text = config.BelowW1Pct.ToString(); + belowW2TextBox.Text = config.BelowW2Pct.ToString(); + + supressPrintingCheckBox.Checked = config.SupressPrinting; + goodOnlyCheckBox.Checked = config.GoodOnly; + cultureComboBox.Text = config.Culture.ToString(); + + docNameTextBox.Text = config.DocName; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + templateTextBox.Enabled = true; + orientationComboBox.Enabled = true; + topMarginTextBox.Enabled = true; + bottomMarginTextBox.Enabled = true; + leftMarginTextBox.Enabled = true; + titleFontFamilyComboBox.Enabled = true; + titleFontSizeTextBox.Enabled = true; + titleBoldCheckBox.Enabled = true; + titleItalicCheckBox.Enabled = true; + headerFontFamilyComboBox.Enabled = true; + headerFontSizeTextBox.Enabled = true; + headerBoldCheckBox.Enabled = true; + headerItalicCheckBox.Enabled = true; + bodyFontFamilyComboBox.Enabled = true; + bodyFontSizeTextBox.Enabled = true; + bodyBoldCheckBox.Enabled = true; + bodyItalicCheckBox.Enabled = true; + footerFontFamilyComboBox.Enabled = true; + footerFontSizeTextBox.Enabled = true; + footerBoldCheckBox.Enabled = true; + footerItalicCheckBox.Enabled = true; + supressPrintingCheckBox.Enabled = true; + goodOnlyCheckBox.Enabled = true; + cultureComboBox.Enabled = true; + headerButton.Enabled = true; + colW0TextBox.Enabled = true; + colW1TextBox.Enabled = true; + colW2TextBox.Enabled = true; + commonItems1Button.Enabled = true; + commonItems2Button.Enabled = true; + commonItems3Button.Enabled = true; + testItemsButton.Enabled = true; + belowW0TextBox.Enabled = true; + belowW1TextBox.Enabled = true; + belowW2TextBox.Enabled = true; + belowItems1Button.Enabled = true; + belowItems2Button.Enabled = true; + belowItems3Button.Enabled = true; + footerButton.Enabled = true; + docNameTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if ((int)GetOrientation(orientationComboBox.Text) < 0) + { + message += Environment.NewLine + "Invalid 'Page orientation'"; + flags |= CfgUpdateFlags.Error; + } + + int dummy, dummy2, dummy3; + if (!int.TryParse(topMarginTextBox.Text, out dummy) || dummy < 0 || dummy > 500) + { + message += Environment.NewLine + "'Top margin' should be between 0 and 500"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(bottomMarginTextBox.Text, out dummy) || dummy < 0 || dummy > 200) + { + message += Environment.NewLine + "'Bottom margin' should be between 0 and 200"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(leftMarginTextBox.Text, out dummy) || dummy < 0 || dummy > 200) + { + message += Environment.NewLine + "Left margin' should be between 0 and 200"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(titleFontSizeTextBox.Text, out dummy) || dummy < 6 || dummy > 48) + { + message += Environment.NewLine + "Title font size should be between 6 and 48"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(headerFontSizeTextBox.Text, out dummy) || dummy < 6 || dummy > 48) + { + message += Environment.NewLine + "Header font size should be between 6 and 48"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(bodyFontSizeTextBox.Text, out dummy) || dummy < 6 || dummy > 48) + { + message += Environment.NewLine + "Body font size should be between 6 and 48"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(footerFontSizeTextBox.Text, out dummy) || dummy < 4 || dummy > 48) + { + message += Environment.NewLine + "Footer font size' should be between 4 and 48"; + flags |= CfgUpdateFlags.Error; + } + + if (!cultureComboBox.Items.Contains(cultureComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid culture"; + } + + if (!int.TryParse(colW0TextBox.Text, out dummy) || dummy < 0 || dummy > 100) + { + message += Environment.NewLine + "Column width 0 should be between 0 and 100"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(colW1TextBox.Text, out dummy2) || dummy2 < 0 || dummy2 > 100) + { + message += Environment.NewLine + "Column width 1 should be between 0 and 100"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(colW2TextBox.Text, out dummy3) || dummy3 < 0 || dummy3 > 100) + { + message += Environment.NewLine + "Column width 2 should be between 0 and 100"; + flags |= CfgUpdateFlags.Error; + } + + if (dummy + dummy2 + dummy3 > 100) + { + message += Environment.NewLine + "Sum of column widths should be <= 100"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(belowW0TextBox.Text, out dummy) || dummy < 0 || dummy > 100) + { + message += Environment.NewLine + "Column width 0 should be between 0 and 100"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(belowW1TextBox.Text, out dummy2) || dummy2 < 0 || dummy2 > 100) + { + message += Environment.NewLine + "Column width 1 should be between 0 and 100"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(belowW2TextBox.Text, out dummy3) || dummy3 < 0 || dummy3 > 100) + { + message += Environment.NewLine + "Column width 2 should be between 0 and 100"; + flags |= CfgUpdateFlags.Error; + } + + if (dummy + dummy2 + dummy3 > 100) + { + message += Environment.NewLine + "Sum of column widths should be <= 100"; + flags |= CfgUpdateFlags.Error; + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + if (config.Name != nameTextBox.Text) + { + config.Name = nameTextBox.Text; + flags |= (CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + } + + flags |= UpdateDifferent(ref config.Template, templateTextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + + if (config.PageOrientation != GetOrientation(orientationComboBox.Text)) + { + config.PageOrientation = GetOrientation(orientationComboBox.Text); + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + flags |= UpdateDifferent(ref config.TopMargin, topMarginTextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.BottomMargin, bottomMarginTextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.LeftMargin, leftMarginTextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + + /// Title font properties + flags |= UpdateDifferent(ref config.TitFntFml, titleFontFamilyComboBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.TitFntSz, titleFontSizeTextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + int tmp = (titleBoldCheckBox.Checked ? (int)System.Drawing.FontStyle.Bold : 0) + + (titleItalicCheckBox.Checked ? (int)System.Drawing.FontStyle.Italic : 0); + flags |= UpdateDifferent(ref config.TitFntSty, tmp, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + + /// Header font properties + flags |= UpdateDifferent(ref config.HdrFntFml, headerFontFamilyComboBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.HdrFntSz, headerFontSizeTextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + tmp = (headerBoldCheckBox.Checked ? (int)System.Drawing.FontStyle.Bold : 0) + + (headerItalicCheckBox.Checked ? (int)System.Drawing.FontStyle.Italic : 0); + flags |= UpdateDifferent(ref config.HdrFntSty, tmp, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + + /// Body font properties + flags |= UpdateDifferent(ref config.BodyFntFml, bodyFontFamilyComboBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.BodyFntSz, int.Parse(bodyFontSizeTextBox.Text), CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + tmp = (bodyBoldCheckBox.Checked ? (int)System.Drawing.FontStyle.Bold : 0) + + (bodyItalicCheckBox.Checked ? (int)System.Drawing.FontStyle.Italic : 0); + flags |= UpdateDifferent(ref config.BodyFntSty, tmp, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + + /// Footer font properties + flags |= UpdateDifferent(ref config.FooterFntFml, footerFontFamilyComboBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.FooterFntSz, int.Parse(footerFontSizeTextBox.Text), CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + tmp = (footerBoldCheckBox.Checked ? (int)System.Drawing.FontStyle.Bold : 0) + + (footerItalicCheckBox.Checked ? (int)System.Drawing.FontStyle.Italic : 0); + flags |= UpdateDifferent(ref config.FooterFntSty, tmp, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + + flags |= UpdateDifferent(ref config.SupressPrinting, supressPrintingCheckBox.Checked, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.GoodOnly, goodOnlyCheckBox.Checked, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + + flags |= UpdateDifferent(ref config.ColW0Pct, colW0TextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.ColW1Pct, colW1TextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.ColW2Pct, colW2TextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.BelowW0Pct, belowW0TextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.BelowW1Pct, belowW1TextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.BelowW2Pct, belowW2TextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + + flags |= UpdateDifferent(ref config.Header, header, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.Footer, footer, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + + flags |= UpdateDifferent(ref config.CommonItems1, commonItems1, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.CommonItems2, commonItems2, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.CommonItems3, commonItems3, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + + flags |= UpdateDifferent(ref config.SelectedItems, testItems, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + + flags |= UpdateDifferent(ref config.BelowItems1, belowItems1, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.BelowItems2, belowItems2, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.BelowItems3, belowItems3, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + + for (Culture i = 0; i < Culture.Count; i++) + { + if (i.ToString().Equals(cultureComboBox.Text) && (config.Culture != i)) + { + config.Culture = i; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + break; + } + } + + flags |= UpdateDifferent(ref config.DocName, docNameTextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + + if ((flags & CfgUpdateFlags.InvokeCfgChange) != 0) + { + Printer.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.CfgChange, config)); + } + + return flags; + } + + private void headerButton_Click(object sender, EventArgs e) + { + HeaderFooterDlg dlg = new HeaderFooterDlg(true, string.IsNullOrEmpty(header) ? string.Empty : header.Replace("~", Environment.NewLine)); + if (dlg.ShowDialog() == DialogResult.OK) + { + header = dlg.EditedText.Replace(Environment.NewLine, "~"); + } + } + + private void commonItems1Button_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg() + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(commonItems1), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + commonItems1 = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems); + } + } + + private void commonItems2Button_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg() + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(commonItems2), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + commonItems2 = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems); + } + } + + private void commonItems3Button_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg() + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(commonItems3), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + commonItems3 = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems); + } + } + + private void testItemsButton_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg() + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(testItems), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + testItems = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems); + } + } + private void belowItems1Button_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg() + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(belowItems1), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + belowItems1 = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems); + } + } + + private void belowItems2Button_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg() + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(belowItems2), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + belowItems2 = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems); + } + } + + private void belowItems3Button_Click(object sender, EventArgs e) + { + Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg() + { + MetersKind = config.MetersKind, + SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(belowItems3), + }; + + if (dlg.ShowDialog() == DialogResult.OK) + { + belowItems3 = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems); + } + } + + private void footerButton_Click(object sender, EventArgs e) + { + HeaderFooterDlg dlg = new HeaderFooterDlg(false, string.IsNullOrEmpty(footer) ? string.Empty : footer.Replace("~", Environment.NewLine)); + if (dlg.ShowDialog() == DialogResult.OK) + { + footer = dlg.EditedText.Replace(Environment.NewLine, "~"); + } + } + + #region Configuration Change Handling + + public static void OnCmdResponse(object sender, CmdResponseArgs args) + { + if (CmdResponseHandler == null) return; + try { CmdResponseHandler(sender, args); } + catch (Exception e) { log.Error("CmdResponseHandler(...) failed", e); } + } + + public static event EventHandler CmdResponseHandler; + + public void StartResponseHandler() { } + public void StopResponseHandler() { } + + #endregion Configuration Change Handling + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Zapiska/PrinterCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Zapiska/PrinterCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Output/Printers/Zapiska/PrinterCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/OutputPath.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/OutputPath.cs new file mode 100644 index 00000000..0ec30f6b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/OutputPath.cs @@ -0,0 +1,85 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl +{ + public class OutputPath + { + public int ItemNr; + public string Name; + public float Qfrom; + public float Qto; + public IFlowMeter FlowMeter; + public IRegulValve RegulValve; + public float PidCoef; + public IDiverter Diverter; + public ITempMeter TempDiv; + public IScale Scale; + public IValve StartValve1; + public bool InvertSV1; + public IValve StartValve2; + public bool InvertSV2; + public int LagSV2; + public IValve StartValve3; + public bool InvertSV3; + public int LagSV3; + public IList ValvesOpen; + public IList ValvesClose; + + /// Constructor from name, the rest is empty + public OutputPath(string name, int itemNr) + { + ItemNr = itemNr; + Name = name; + ValvesOpen = new List(); + ValvesClose = new List(); + } + + /// Constructor from data entity + public OutputPath(Config.Entities.OutputPath entity, IList components) + : this(entity.Name, entity.ItemNr) + { + Qfrom = entity.Qfrom; + Qto = entity.Qto; + FlowMeter = (IFlowMeter)TbfComponents.FindComponent(entity.FlowMeter, components); + RegulValve = (IRegulValve)TbfComponents.FindComponent(entity.RegulValve, components); + PidCoef = entity.PidCoef; + Diverter = (IDiverter)TbfComponents.FindComponent(entity.Diverter, components); + TempDiv = (ITempMeter)TbfComponents.FindComponent(entity.TempDiv, components); + Scale = (IScale)TbfComponents.FindComponent(entity.Scale, components); + + string[] svs = entity.StartValve != null ? entity.StartValve.Split(new char[] { '~' }) : new string[0]; + int iTmp; + /// + StartValve1 = (IValve)TbfComponents.FindComponent(((svs.Length > 0) ? svs[0] : string.Empty), components); + InvertSV1 = (svs.Length > 1) ? svs[1].Equals("i") : false; + StartValve2 = (IValve)TbfComponents.FindComponent(((svs.Length > 2) ? svs[2] : string.Empty), components); + InvertSV2 = (svs.Length > 3) ? svs[3].Equals("i") : false; + LagSV2 = (svs.Length > 4 && int.TryParse(svs[4], out iTmp)) ? iTmp : 0; + StartValve3 = (IValve)TbfComponents.FindComponent(((svs.Length > 5) ? svs[5] : string.Empty), components); + InvertSV3 = (svs.Length > 6) ? svs[6].Equals("i") : false; + LagSV3 = (svs.Length > 7 && int.TryParse(svs[7], out iTmp)) ? iTmp : 0; + + string[] vOpen = entity.ValvesOpen.Split(new char[] { ';' }); + ValvesOpen = new List(); + foreach (var vName in vOpen) ValvesOpen.Add((IValve)TbfComponents.FindComponent(vName, components)); + + string[] vClose = entity.ValvesClose.Split(new char[] { ';' }); + ValvesClose = new List(); + foreach (var vName in vClose) ValvesClose.Add((IValve)TbfComponents.FindComponent(vName, components)); + } + + public override string ToString() + { + return string.Format("{0} RV={1}, Flowm.={2}, Div.={3}, Scale={4}", + Name, + (RegulValve != null) ? RegulValve.Name : "---", + (FlowMeter != null) ? FlowMeter.Name : "---", + (Diverter != null) ? Diverter.Name : "---", + (Scale != null) ? Scale.Name : "---"); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/ProcedureParamsBase.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/ProcedureParamsBase.cs new file mode 100644 index 00000000..4cc67804 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/ProcedureParamsBase.cs @@ -0,0 +1,107 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using Config.Entities; + +namespace TBF.BenchControl +{ + public class ProcedureParamsBase : Generic.IProcedureParams + { + protected ComponentProcedure procedureParamsEntity; + + public virtual XmlSerializer GetSerializer() { return new XmlSerializer(GetType()); } + + public string ComponentName { get { return componentName; } } + protected string componentName; + + public Procedure Procedure { get { return procedure; } } + protected Procedure procedure; + + /// + /// Parameterless constructor required for serialization + /// + public ProcedureParamsBase() + { + InitializeAll(); + } + + /// To be overridden + public virtual void InitializeAll() + { + } + + /// To be overridden + public virtual IList ParamValues(int ix) + { + return null; + } + + /// To be overridden + public virtual void UpdateFromDbEntity(ComponentProcedure dbEntity) + { + } + + public void FromDbEntity(string cmpntName, Procedure procedure) + { + ComponentProcedure componentProc = procedure.GetProcedureParamsEntity(cmpntName); + if (componentProc != null) + { + UpdateFromDbEntity(componentProc); + return; + } + + /// Create a new entity and add it to the list test.MoreParams + this.procedureParamsEntity = this.ToDbEntity(cmpntName, procedure); + this.procedureParamsEntity.SetParamsProvider(this as IParamsProvider); + this.procedure = procedure; + this.componentName = cmpntName; + procedure.MoreParams.Add(procedureParamsEntity); + } + + public ComponentProcedure ToDbEntity(string cmpntName, Procedure procedure) + { + using (var writer = new StringWriter()) + { + GetSerializer().Serialize(writer, this); /// Serialize this class with parameters + return new ComponentProcedure(cmpntName, writer.ToString(), procedure); /// Return new ComponentProcedure entity + } + } + + public void UpdateEmbeddedDbEntity() + { + using (var writer = new StringWriter()) + { + /// Serialize this class and update the entity + GetSerializer().Serialize(writer, this); + + procedureParamsEntity.Parameters = writer.ToString(); + procedureParamsEntity.CmpntName = componentName; + procedureParamsEntity.Procedure = procedure; + } + } + + public virtual string ParamName(int i) { return string.Empty; } + + public virtual int ParamsCount() { return 0; } + + public virtual string ToString(int i) { return string.Empty; } + + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < ParamsCount(); i++) + { + if (i != 0) sb.Append("; "); + sb.Append(ParamName(i)); + sb.Append("="); + sb.Append(ToString(i)); + } + return sb.ToString(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/RegisterReaders/SerialStream/DatastreamFrame.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/RegisterReaders/SerialStream/DatastreamFrame.cs new file mode 100644 index 00000000..8455488c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/RegisterReaders/SerialStream/DatastreamFrame.cs @@ -0,0 +1,290 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Globalization; +using System.Text; + +namespace TBF.BenchControl.RegisterReaders.SerialStream +{ + public class DatastreamFrame + { + /// + /// Strobed value + /// + public static decimal TestStartTimestampDec; + + /// + /// Stored values + /// + public FrameFlags Flags; + + public DateTime DateTime; /// From PC + public float RefFlow; /// [m3/h] + public int Counter; + + const int MaxDataLength = 512; + char[] data = new char[MaxDataLength]; + int dataLength; + + public byte CheckSum; + + public UInt32 VolumeRaw; + public Int64 VolumeRawExt; + + public UInt32 Timestamp; + public Int64 TimestampExt; + + /// + /// Calculated values + /// + public double Volume(FrameFormat ff) { return (double)VolumeRawExt / ff.VolumeScaleFactor; } + public decimal TimestampDec(FrameFormat ff) { return (decimal)TimestampExt / (decimal)ff.TimeScaleFactor; } + + public double VolumeDelta(FrameFormat ff, DatastreamFrame previous) { return (previous == null) ? 0 : Volume(ff) - previous.Volume(ff); } + public decimal TimeDelta(FrameFormat ff) { return TimestampDec(ff) - TestStartTimestampDec; } + + public string Label() + { + if (Flags == FrameFlags.OK_TestStart) return "#### start test ####"; + else if (Flags == FrameFlags.OK_TestEnd) return "#### end of test ####"; + else return string.Empty; + } + + + static DatastreamFrame() + { + } + + public DatastreamFrame() + { + } + + /// + /// Parses optical telegram and returns OptoTelegramRaw object + /// + /// + /// Create a configuration structure from a complete byte array + /// + /// Telegram description: + /// + /// AAAAAA[tab]BBBB[tab]CCCC[tab]DDDDDD[tab]EEEE[tab]FFFFFFFF[tab]GG[cr][lf] (42 bytes) + /// + /// Data Comment Type Calculate to decimal + /// ---------------------------------------------------------------- + /// AAAAAA EMF Int24 Value * 0.000000333 + /// BBBB Magnetic field Int16 Value + /// CCCC Flow Int16 Value * 0.225 * Scalig factor + /// DDDDDD Volume Int24 Value / 16000 * Scaling factor + /// EEEE Impedance Int16 Value + /// FFFFFFFF Timestamp Uint32 Value / 8192 + /// GG Checksum Byte + /// ---------------------------------------------------------------- + /// + /// Example: + /// FFFFFE 51EA 0000 65324E 0087 F6319DFF 86 + /// FFDD3A 51F9 0000 65324E 0088 F631A60B 45 + /// ... + /// + /// A complete byte array data + /// true = telegram OK, false = telegram NOK + public bool UpdateFromString(string frame, FrameFormat ff, int counter, ref Int64 volumeRawExtLast, ref Int64 timestampExtLast) + { + DateTime = DateTime.Now; + Counter = counter; + RefFlow = (float)Sequences.ProcessData.RefFlow.Val; + + if ((frame == null) + || (frame.Length < ff.FrameLength) + || (frame[ff.FrameLength - 2] != '\r') + || (frame[ff.FrameLength - 1] != '\n')) + { + Flags = FrameFlags.InvalidFrame; + return false; + } + + /// Copy data into the fixed size buffer + dataLength = frame.Length - 2; + for (int i = 0; i < Math.Min(MaxDataLength, dataLength); i++) data[i] = frame[i]; + + bool f1 = true; + bool f2 = true; + bool f3 = true; + + if (ff.VolumeFieldFormat == FieldFormat.HexadecimalWindow) + { + f1 = UInt32.TryParse(frame.Substring(ff.VolumeFieldStart, ff.VolumeFieldLength), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out VolumeRaw); + + /// + /// Cope with 'VolumeRaw' overflow + /// + Int64 uncorrected = (Int64)(((UInt64)volumeRawExtLast & ff.VolumeWindowMask) | VolumeRaw); + if (Math.Abs(uncorrected - volumeRawExtLast) <= ff.VolumeWrapThreshold) + { + VolumeRawExt = uncorrected; + } + else if (Math.Abs(uncorrected + ff.VolumeWrapIncrement - volumeRawExtLast) <= ff.VolumeWrapThreshold) + { + VolumeRawExt = uncorrected + ff.VolumeWrapIncrement; + } + else if (Math.Abs(uncorrected - ff.VolumeWrapIncrement - volumeRawExtLast) <= ff.VolumeWrapThreshold) + { + VolumeRawExt = uncorrected - ff.VolumeWrapIncrement; + } + else + { + VolumeRawExt = uncorrected; + } + + volumeRawExtLast = VolumeRawExt; /// Update referenced value from calling routine + } + + if (ff.TimeFieldFormat == FieldFormat.HexadecimalWindow) + { + f2 = UInt32.TryParse(frame.Substring(ff.TimeFieldStart, ff.TimeFieldLength), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out Timestamp); + + /// + /// Cope with 'Timestamp' overflow + /// + Int64 uncorrected = (Int64)(((UInt64)timestampExtLast & ff.TimeWindowMask) | Timestamp); + if (Math.Abs(uncorrected - timestampExtLast) <= ff.TimeWrapThreshold) + { + TimestampExt = uncorrected; + } + else if (Math.Abs(uncorrected + ff.TimeWrapIncrement - timestampExtLast) <= ff.TimeWrapThreshold) + { + TimestampExt = uncorrected + ff.TimeWrapIncrement; + } + else if (Math.Abs(uncorrected - ff.TimeWrapIncrement - timestampExtLast) <= ff.TimeWrapThreshold) + { + TimestampExt = uncorrected - ff.TimeWrapIncrement; + } + else + { + TimestampExt = uncorrected; + } + + timestampExtLast = TimestampExt; /// Update referenced value from calling routine + } + else if (ff.TimeFieldFormat == FieldFormat.None) + { + TimestampExt = ff.RawTimeIncrementPerFrame * counter; + timestampExtLast = TimestampExt; /// Update referenced value from calling routine + } + + f3 = byte.TryParse(frame.Substring(ff.FrameLength - 4, 2), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out CheckSum); + + bool allOk = f1 && f2 && f3; + Flags = allOk ? FrameFlags.OK : FrameFlags.InvalidFrame; + + return allOk; + } + + /// + /// Alternative to UpdateFromString(...) when data are flushed + /// + public bool UpdateFromStringDummy(string frame, FrameFormat ff) + { + DateTime = DateTime.Now; + RefFlow = (float)Sequences.ProcessData.RefFlow.Val; + + if ((frame == null) + || (frame.Length < ff.FrameLength) + || (frame[ff.FrameLength - 2] != '\r') + || (frame[ff.FrameLength - 1] != '\n')) + { + Flags = FrameFlags.InvalidFrame; + return false; + } + + dataLength = 0; + return true; + } + + + public void SetFlags(FrameFlags flags) + { + this.Flags = flags; + } + + + public string ToString(FrameFormat ff, DatastreamFrame previous) + { + if (Flags == FrameFlags.SyncError) + { + return "Sychronization error"; + } + else if (Flags == FrameFlags.InvalidFrame) + { + return "Invalid telegram"; + } + else /// if (flags == OptoTelegramFlags.OK || OptoTelegramFlags.OK_TestStart || OptoTelegramFlags.OK_TestEnd) + { + StringBuilder sb = new StringBuilder(MaxDataLength); + for (int i = 0; i < Math.Min(MaxDataLength, dataLength); i++) sb.Append(data[i]); + + return string.Format("{0}:{1}:{2}.{3} #{4} : {5} Volume={6} Time={7} {8}", + DateTime.Hour.ToString("D2"), + DateTime.Minute.ToString("D2"), + DateTime.Second.ToString("D2"), + DateTime.Millisecond.ToString("D3"), + Counter.ToString("D6"), + sb.ToString(), + Volume(ff), + TimestampDec(ff), + Label()); + } + } + + /// + /// Filter RefFlow data in an array of OptoTelegramRaw objects by a FIR filter: + /// + /// kSize = 5, kSize2 = 2 + /// + /// i k + /// --------------------------------------------------------------------------- + /// 0 -5 filtered[0] = data[0] + /// 1 -4 filtered[1] = data[1] + /// 2 -3 filtered[2] = data[0]*k[0] + ... + data[4]*k[4] + /// 3 -2 filtered[3] = data[1]*k[0] + ... + data[5]*k[4] + /// 4 -1 filtered[4] = data[2]*k[0] + ... + data[6]*k[4] + /// 5 0 data[0] = filtered[0], filtered[0] = data[3]*k[0] + ... + data[7]*k[4] + /// 6 1 data[1] = filtered[1], filtered[1] = data[4]*k[0] + ... + data[8]*k[4] + /// 7 ... + /// + /// array of OptoTelegramRaw objects + /// number of objects to process + public static void FIRFilterFlow(DatastreamFrame[] optoData, int optoDataCount) + { + float[] kernel = new float[] { 0.1f, 0.2f, 0.4f, 0.2f, 0.1f }; + int kSize = kernel.Length; + int kSize2 = kernel.Length / 2; + + float[] filtered = new float[kSize]; + + for (int i = 0; i < optoDataCount; i++) + { + int k = i - kSize; + if (k >= 0) optoData[k].RefFlow = filtered[i % kSize]; + + if (i < kSize2 || i >= optoDataCount - kSize2) + { + filtered[i % kSize] = optoData[i].RefFlow; + } + else + { + float weoightedSum = 0; + for (int j = -kSize2; j <= kSize2; j++) + weoightedSum += optoData[i + j].RefFlow * kernel[j + kSize2]; + + filtered[i % kSize] = weoightedSum; + } + } + + for (int k = optoDataCount - kSize; k < optoDataCount; k++) + { + if (k >= 0) optoData[k].RefFlow = filtered[k % kSize]; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/RegisterReaders/SerialStream/Enums.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/RegisterReaders/SerialStream/Enums.cs new file mode 100644 index 00000000..55e3a5ea --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/RegisterReaders/SerialStream/Enums.cs @@ -0,0 +1,42 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace TBF.BenchControl.RegisterReaders.SerialStream +{ + public enum StreamType + { + None = 0, + Iperl = 1, + Flexible = 2, + Count /// Number of stream types + } + + public enum FieldFormat + { + None = 0, + HexadecimalWindow = 1, + Hexadecimal = 2, + Decimal = 3, + Count + } + + public enum FrameFlags : byte + { + OK = 0, + OK_TestStart, + OK_TestEnd, + InvalidFrame, /// Wrong frame format of checksum error + SyncError, + } + + public enum DatastreamState + { + Read, + Flush, + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/RegisterReaders/SerialStream/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/RegisterReaders/SerialStream/Factory.cs new file mode 100644 index 00000000..bd329f31 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/RegisterReaders/SerialStream/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.RegisterReaders.SerialStream +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { SerialStream.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new SerialStream(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new SerialStream(cfg); } + + public IComponentCfg DefaultConfig() { return new SerialStreamCfg(this.GetType().Namespace.Substring(17), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(SerialStreamCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/RegisterReaders/SerialStream/FrameFormat.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/RegisterReaders/SerialStream/FrameFormat.cs new file mode 100644 index 00000000..3eccfc45 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/RegisterReaders/SerialStream/FrameFormat.cs @@ -0,0 +1,94 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace TBF.BenchControl.RegisterReaders.SerialStream +{ + public class FrameFormat + { + public readonly int FrameLength; /// Frame length in characters/bytes, 0 = unknown + public readonly double FrameFrequency; /// Number of frames per second (Hz) + + public readonly Config.Unit VolumeUnits; + public readonly double VolumeScaleFactor; /// Volume in VolumeInits = volmeRaw / VolumeScaleFactor + public readonly int VolumeFieldStart; /// Start of the volume field: 0-based index of the first character, -1 = no volume field in the frame + public readonly int VolumeFieldEnd; /// End of the volume field: 0-based index of the last character + public readonly FieldFormat VolumeFieldFormat; /// Hexadecimal or Decimal + + public readonly Config.Unit TimeUnits; + public readonly double TimeScaleFactor; /// Time in TimeUnits = timeRaw / TimeScaleFactor + public readonly int TimeFieldStart; /// Start of the time field: 0-based index of the first character, -1 = no time field in the frame + public readonly int TimeFieldEnd; /// End of the time field: 0-based index of the last character + public readonly FieldFormat TimeFieldFormat; /// Hexadecimal or Decimal + + /// + /// Calculated in constructor + /// + public readonly int VolumeFieldLength; + public readonly UInt64 VolumeWindowMask; + public readonly Int64 VolumeWrapIncrement; + public readonly Int64 VolumeWrapThreshold; + + public readonly int TimeFieldLength; + public readonly UInt64 TimeWindowMask; + public readonly Int64 TimeWrapIncrement; + public readonly Int64 TimeWrapThreshold; + + public readonly long RawTimeIncrementPerFrame; + + public FrameFormat(int frameLength, double frameFrequency, + Config.Unit volumeUnits, double volumeScaleFactor, + int volumeFieldStart, int volumeFieldEnd, FieldFormat volumeFieldFormat, + Config.Unit timeUnits, double timeScaleFactor, + int timeFieldStart, int timeFieldEnd, FieldFormat timeFieldFormat) + { + FrameLength = frameLength; + FrameFrequency = frameFrequency; + + VolumeUnits = volumeUnits; + VolumeScaleFactor = volumeScaleFactor; + VolumeFieldStart = volumeFieldStart; + VolumeFieldEnd = volumeFieldEnd; + VolumeFieldFormat = volumeFieldFormat; + + TimeUnits = timeUnits; + TimeScaleFactor = timeScaleFactor; + TimeFieldStart = timeFieldStart; + TimeFieldEnd = timeFieldEnd; + TimeFieldFormat = timeFieldFormat; + + RawTimeIncrementPerFrame = (FrameFrequency != 0) ? (long)Math.Round(TimeScaleFactor / FrameFrequency) : 1L; + + VolumeFieldLength = VolumeFieldEnd - VolumeFieldStart + 1; + + if (volumeFieldFormat == FieldFormat.HexadecimalWindow && + volumeFieldStart >= 0 && VolumeFieldLength >= 1 && VolumeFieldLength <= 8) + { + VolumeWindowMask = 0xFFFFFFFFFFFFFFFFUL << (4 * VolumeFieldLength); + VolumeWrapIncrement = 1L << (4 * VolumeFieldLength); + VolumeWrapThreshold = 1L << (4 * VolumeFieldLength - 1); + } + + TimeFieldLength = TimeFieldEnd - TimeFieldStart + 1; + + if (volumeFieldFormat == FieldFormat.HexadecimalWindow && + volumeFieldStart >= 0 && TimeFieldLength >= 1 && TimeFieldLength <= 8) + { + TimeWindowMask = 0xFFFFFFFFFFFFFFFFUL << (4 * TimeFieldLength); + TimeWrapIncrement = 1L << (4 * TimeFieldLength); + TimeWrapThreshold = 1L << (4 * TimeFieldLength - 1); + } + } + + public override string ToString() + { + return string.Format("L={0} V={1}-{2}-{3}-{4}-{5} T={6}-{7}-{8}-{9}-{10}", + FrameLength, + VolumeUnits, VolumeScaleFactor, + VolumeFieldStart, VolumeFieldEnd, VolumeFieldFormat, + TimeUnits, TimeScaleFactor, + TimeFieldStart, TimeFieldEnd, TimeFieldFormat); + } + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/RegisterReaders/SerialStream/FrameReceivedEventArgs.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/RegisterReaders/SerialStream/FrameReceivedEventArgs.cs new file mode 100644 index 00000000..3935d0ae --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/RegisterReaders/SerialStream/FrameReceivedEventArgs.cs @@ -0,0 +1,20 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace TBF.BenchControl.RegisterReaders.SerialStream +{ + public class FrameReceivedEventArgs : EventArgs + { + public string Data; + + public FrameReceivedEventArgs(string data) + { + this.Data = data; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/RegisterReaders/SerialStream/ProcParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/RegisterReaders/SerialStream/ProcParams.cs new file mode 100644 index 00000000..7489763a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/RegisterReaders/SerialStream/ProcParams.cs @@ -0,0 +1,289 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.IO; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.RegisterReaders.SerialStream +{ + public class ProcParams : ProcedureParamsBase, IParamsProvider, IProcedureParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcParams) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + + public StreamType StreamType; /// Enumerated stream type + public int FrameLength; /// Frame length in characters/bytes, 0 = unknown + public double FrameFrequency; /// Number of frames per second, 0 = unknown + + public Config.Unit VolumeUnits; + public double VolumeScaleFactor; /// Volume = + public int VolumeFieldStart; /// Start of the volume field: 0-based index of the first character, -1 = no volume field in the frame + public int VolumeFieldEnd; /// End of the volume field: 0-based index of the last character + public FieldFormat VolumeFieldFormat; /// Hexadecimal or Decimal + + public Config.Unit TimeUnits; + public double TimeScaleFactor; /// Time = + public int TimeFieldStart; /// Start of the time field: 0-based index of the first character, -1 = no time field in the frame + public int TimeFieldEnd; /// End of the time field: 0-based index of the last character + public FieldFormat TimeFieldFormat; /// Hexadecimal or Decimal + + + public override void InitializeAll() + { + /// Values are for iPerl DN15 in data stream mode at 8 Hz + StreamType = StreamType.Flexible; + FrameLength = 42; + FrameFrequency = 8; + + VolumeUnits = Config.Unit.l; + VolumeScaleFactor = 16000; + VolumeFieldStart = 17; + VolumeFieldEnd = 22; + VolumeFieldFormat = FieldFormat.HexadecimalWindow; + + TimeUnits = Config.Unit.s; + TimeScaleFactor = 8192; + TimeFieldStart = 29; + TimeFieldEnd = 36; + TimeFieldFormat = FieldFormat.HexadecimalWindow; + } + + string[] paramNames = new string[] + { + "Stream type", + "Frame Length", + "Frame Frequency", + + "Volume Units", + "Volume Scale Factor", + "Volume Field Start", + "Volume Field End", + "Volume Field Format", + + "Time Units", + "Time Scale Factor", + "Time Field Start", + "Time Field End", + "Time Field Format", + }; + public override string ParamName(int i) { return paramNames[i]; } + public override int ParamsCount() { return paramNames.Length; } + + public override string ToString(int i) + { + switch (i) + { + case 0: return StreamType.ToString(); + case 1: return FrameLength.ToString(); + case 2: return FrameFrequency.ToString(); + + case 3: return VolumeUnits.ToDescription(); + case 4: return VolumeScaleFactor.ToString(); + case 5: return VolumeFieldStart.ToString(); + case 6: return VolumeFieldEnd.ToString(); + case 7: return VolumeFieldFormat.ToString(); + + case 8: return TimeUnits.ToDescription(); + case 9: return TimeScaleFactor.ToString(); + case 10: return TimeFieldStart.ToString(); + case 11: return TimeFieldEnd.ToString(); + case 12: return TimeFieldFormat.ToString(); + + default: return string.Empty; + } + } + + public CfgUpdateFlags UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: + for (StreamType st = 0; st < StreamType.Count; st++) + { + if (st.ToString().Equals(strValue)) { StreamType = st; return CfgUpdateFlags.None; } + } + break; + case 1: FrameLength = int.Parse(strValue); return CfgUpdateFlags.None; + case 2: FrameFrequency = Utils.ParseUDouble(strValue); return CfgUpdateFlags.None; + + case 3: + for (Config.Unit u = 0; u < Config.Unit.Count; u++) + { + if (Config.Units.IsQuantity(u, Config.Quantity.Volume) && u.ToDescription().Equals(strValue)) + { + VolumeUnits = u; + return CfgUpdateFlags.None; + } + } + break; + case 4: VolumeScaleFactor = Utils.ParseSDouble(strValue); return CfgUpdateFlags.None; + case 5: VolumeFieldStart = int.Parse(strValue); return CfgUpdateFlags.None; + case 6: VolumeFieldEnd = int.Parse(strValue); return CfgUpdateFlags.None; + case 7: + for (FieldFormat ff = 0; ff < FieldFormat.Count; ff++) + { + if (ff.ToString().Equals(strValue)) { VolumeFieldFormat = ff; return CfgUpdateFlags.None; } + } + break; + + case 8: + for (Config.Unit u = 0; u < Config.Unit.Count; u++) + { + if (Config.Units.IsQuantity(u, Config.Quantity.Time) && u.ToDescription().Equals(strValue)) + { + TimeUnits = u; + return CfgUpdateFlags.None; + } + } + break; + case 9: TimeScaleFactor = Utils.ParseSDouble(strValue); return CfgUpdateFlags.None; + case 10: TimeFieldStart = int.Parse(strValue); return CfgUpdateFlags.None; + case 11: TimeFieldEnd = int.Parse(strValue); return CfgUpdateFlags.None; + case 12: + for (FieldFormat ff = 0; ff < FieldFormat.Count; ff++) + { + if (ff.ToString().Equals(strValue)) { TimeFieldFormat = ff; return CfgUpdateFlags.None; } + } + break; + + default: return CfgUpdateFlags.None; + } + + return CfgUpdateFlags.None; + } + + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + + int iDummy; + double fDummy; + + switch (i) + { + case 0: + for (StreamType st = 0; st < StreamType.Count; st++) + { + if (st.ToString().Equals(strValue)) return true; + } + break; + case 1: + if (int.TryParse(strValue, out iDummy) && iDummy >= 0 && iDummy <= 8000) return true; + break; + case 2: + if (Utils.TryParseUDouble(strValue, out fDummy) && fDummy <= 1000.0f) return true; + break; + + case 3: + for (Config.Unit u = 0; u < Config.Unit.Count; u++) + { + if (Config.Units.IsQuantity(u, Config.Quantity.Volume) && u.ToDescription().Equals(strValue)) + { + return true; + } + } + break; + case 4: return Utils.TryParseSDouble(strValue, out fDummy); + case 5: return (int.TryParse(strValue, out iDummy) && (iDummy >= -1)); + case 6: return (int.TryParse(strValue, out iDummy) && (iDummy >= 0)); + case 7: + for (FieldFormat ff = 0; ff < FieldFormat.Count; ff++) + { + if (ff.ToString().Equals(strValue)) return true; + } + break; + + case 8: + for (Config.Unit u = 0; u < Config.Unit.Count; u++) + { + if (Config.Units.IsQuantity(u, Config.Quantity.Time) && u.ToDescription().Equals(strValue)) + { + return true; + } + } + break; + case 9: return Utils.TryParseSDouble(strValue, out fDummy); + case 10: return (int.TryParse(strValue, out iDummy) && (iDummy >= -1)); + case 11: return (int.TryParse(strValue, out iDummy) && (iDummy >= 0)); + case 12: + for (FieldFormat ff = 0; ff < FieldFormat.Count; ff++) + { + if (ff.ToString().Equals(strValue)) return true; + } + break; + + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(ProcParams prms) + { + prms.StreamType = this.StreamType; + prms.FrameLength = this.FrameLength; + prms.FrameFrequency = this.FrameFrequency; + + prms.VolumeUnits = this.VolumeUnits; + prms.VolumeScaleFactor = this.VolumeScaleFactor; + prms.VolumeFieldStart = this.VolumeFieldStart; + prms.VolumeFieldEnd = this.VolumeFieldEnd; + prms.VolumeFieldFormat = this.VolumeFieldFormat; + + prms.TimeUnits = this.TimeUnits; + prms.TimeScaleFactor = this.TimeScaleFactor; + prms.TimeFieldStart = this.TimeFieldStart; + prms.TimeFieldEnd = this.TimeFieldEnd; + prms.TimeFieldFormat = this.TimeFieldFormat; + } + + public IParamsProvider Clone() + { + ProcParams pars = new ProcParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateFromDbEntity(ComponentProcedure dbEntity) + { + if (dbEntity == null) return; + try + { + ProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcParams; + + procedureParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + procedure = dbEntity.Procedure; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + + public ProcParams() + { + } + + public ProcParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public ProcParams(ComponentProcedure procParamsEntity, string componentName, Procedure procedure) + { + this.procedureParamsEntity = procParamsEntity; + this.componentName = componentName; + this.procedure = procedure; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/RegisterReaders/SerialStream/SerialStream.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/RegisterReaders/SerialStream/SerialStream.cs new file mode 100644 index 00000000..f83de0c4 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/RegisterReaders/SerialStream/SerialStream.cs @@ -0,0 +1,605 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.IO; +using System.IO.Ports; +using log4net; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.RegisterReaders.SerialStream +{ + /// + /// This component = instance of this class is a placeholder for a combined main watermeter + /// + public class SerialStream : ComponentBase, IDevice, GenericDevices.IDatastreamReader, GenericDevices.IHasTestName, IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(SerialStream)); + public override string ToString() { return string.Format("RegisterReaders.SerialStream({0})", Cfg.ToString(1)); } + + + readonly SerialStreamCfg myCfg; + + public Config.Entities.RegisterReaderType RegisterReaderType { get { return Config.Entities.RegisterReaderType.DataStream; } } + public double PulsesPerLtr { get { return 1000.0; } } + public double LtrsPerPulse { get { return 1 / PulsesPerLtr; } } + + + /// + /// Wrappers for procedure parameters + /// + public StreamType StreamType { get { return (myCfg.ProcParams != null) ? myCfg.ProcParams.StreamType : StreamType.None; } } + public int FrameLength { get { return (myCfg.ProcParams != null) ? myCfg.ProcParams.FrameLength : 0; } } + public double FrameFrequency { get { return (myCfg.ProcParams != null) ? myCfg.ProcParams.FrameFrequency : 0; } } + + public Config.Unit VolumeUnits { get { return (myCfg.ProcParams != null) ? myCfg.ProcParams.VolumeUnits : Config.Unit.l; } } + public double VolumeScaleFactor { get { return (myCfg.ProcParams != null) ? myCfg.ProcParams.VolumeScaleFactor : 1; } } + public int VolumeFieldStart { get { return (myCfg.ProcParams != null) ? myCfg.ProcParams.VolumeFieldStart : 0; } } + public int VolumeFieldEnd { get { return (myCfg.ProcParams != null) ? myCfg.ProcParams.VolumeFieldEnd : 0; } } + public FieldFormat VolumeFieldFormat { get { return (myCfg.ProcParams != null) ? myCfg.ProcParams.VolumeFieldFormat : FieldFormat.None; } } + + public Config.Unit TimeUnits { get { return (myCfg.ProcParams != null) ? myCfg.ProcParams.TimeUnits : Config.Unit.s; } } + public double TimeScaleFactor { get { return (myCfg.ProcParams != null) ? myCfg.ProcParams.TimeScaleFactor : 1; } } + public int TimeFieldStart { get { return (myCfg.ProcParams != null) ? myCfg.ProcParams.TimeFieldStart : 0; } } + public int TimeFieldEnd { get { return (myCfg.ProcParams != null) ? myCfg.ProcParams.TimeFieldEnd : 0; } } + public FieldFormat TimeFieldFormat { get { return (myCfg.ProcParams != null) ? myCfg.ProcParams.TimeFieldFormat : FieldFormat.None; } } + + + public bool CommFailed + { + get { return commFailed; } + set { commFailed = value; } + } + bool commFailed; + + + /// + /// Passed to OptoTelegramRaw.UpdateFromString(...) + /// + Int64 volumeRawExtLast; + Int64 timestampExtLast; + + + /// + /// Required for IRegisterReader interface + /// + public int WMPulses { get { return wmPulses; } } + public int WMRefPulses { get { return wmRefPulses; } } + public double WMVolume { get { return wmVolume; } } + public double BeginWMState { get { return beginWMState; } } + public double EndWMState { get { return endWMState; } } + public double WMTestTime { get { return wmTestTime; } } + + + double beginWMState; + double endWMState; + double wmVolume; + int wmPulses; + int wmRefPulses; + double wmTestTime; + + + + /// Name set by the test, to be used as a part of the opto-data log file name + public string TestName { set { testName = value; } } + public int TestRepeats { set { testRepeats = value; } } + public int RepetitionNr { set { repetitionNr = value; } } + /// + string testName; + int testRepeats; + int repetitionNr; + + /// Name set by the test, to be used as a part of the opto-data log file name + public string BenchName; + + /// + /// Volume of water from the opto telegram + /// + private Int64 lastVolumeRaw; /// Last read raw volume + private double volumeLtr; /// + private double volumeLtr0; + + public double VolumeLtrStart { get { return volumeLtrStart; } } /// Test start volume for metrology + public double VolumeLtrEnd { get { return volumeLtrEnd; } } /// Test end volume for metrology + double volumeLtrStart; /// Test start volume for metrology + double volumeLtrEnd; /// Test end volume for metrology + double volumeLtrEnd1; /// auxiliary buffer1 to keep the end volume before test stops + double volumeLtrEnd2; /// auxiliary buffer2 to keep the end volume before test stops + double volumeLtrEnd3; /// auxiliary buffer3 to keep the end volume before test stops + + /// + /// Timestamp from the opto telegram + /// + bool lastTimestampValid; + private Int64 lastTimestamp; + private double timestampSec; + private double timestampSec0; + + public bool NoSamples { get { return (timestampSecEnd - timestampSecStart) < float.Epsilon; } } + public double TimestampSecStart { get { return timestampSecStart; } } + public double TimestampSecEnd { get { return timestampSecEnd; } } + double timestampSecStart; + double timestampSecEnd; + double timestampSecEnd1; + double timestampSecEnd2; + double timestampSecEnd3; + + private int frameIx; + public int TestStartFrameIx; + public int TestEndFrameIx; + + + DatastreamFrame[] datastreamFrames; + const int MaxDatastreamFramesCount = 80000; /// almost 3h at 8 Hz + int datastreamFramesCount; + string datastreamLogFileName; + + + DatastreamFrame toBeFlushed; + int flushedFramesCount; + public int FlushedFramesCount + { + get { return flushedFramesCount; } + set { flushedFramesCount = lastFlushedFramesCount = lastFlushedFramesCount_1 = value; } + } + + int lastFlushedFramesCount_1; + int lastFlushedFramesCount; + public int FlushedFramesDelta + { + get + { + int retval = Math.Max(flushedFramesCount - lastFlushedFramesCount, lastFlushedFramesCount - lastFlushedFramesCount_1); + lastFlushedFramesCount_1 = lastFlushedFramesCount; + lastFlushedFramesCount = flushedFramesCount; + return retval; + } + } + + + + /// + /// Opto serial port and worker thread related private variables + /// + private SerialPort serialPort; + + + public SerialStream() + { + } + + public SerialStream(Generic.IComponentCfg cfg) + : base(cfg) + { + ClearData(); + + myCfg = cfg as SerialStreamCfg; + + log.Debug(this.ToString()); + } + + /// + /// Clear data related to a specific water meter + /// + public void ClearData() + { + commFailed = false; + datastreamFramesCount = 0; + } + + public void Initialize() + { + ClearData(); + + if (DebugLevel == DebugMode.Normal) + { + datastreamParsingEnabled = false; + currentFrameFormat = new FrameFormat(FrameLength, FrameFrequency, + VolumeUnits, VolumeScaleFactor, + VolumeFieldStart, VolumeFieldEnd, VolumeFieldFormat, + TimeUnits, TimeScaleFactor, + TimeFieldStart, TimeFieldEnd, TimeFieldFormat); + log.WarnFormat("Initialize() ... FrameFormat set to {0}", currentFrameFormat); + + /// Allocate memory for opto-data from iPerl + datastreamFrames = new DatastreamFrame[MaxDatastreamFramesCount]; + for (int i = 0; i < MaxDatastreamFramesCount; i++) datastreamFrames[i] = new DatastreamFrame(); + + toBeFlushed = new DatastreamFrame(); + flushedFramesCount = 0; + + synchronized = false; + synchronized2 = false; + partOfTelegram = string.Empty; + + /// Prepare serial port + serialPort = new SerialPort(string.Format("COM{0}", myCfg.ComPortNr), + myCfg.BaudRate, + myCfg.Parity, + myCfg.DataBits, + myCfg.StopBits); + serialPort.Handshake = myCfg.Handshake; + + serialPort.Open(); + } + } + + public void RunDeviceBefore() + { + if (DebugLevel == DebugMode.Normal) + { + try + { + if (datastreamParsingEnabled) + ReadDatastream(DatastreamState.Read, currentFrameFormat); + else + ReadDatastream(DatastreamState.Flush, currentFrameFormat); + } + catch (Exception e) + { + DebugLevel = DebugMode.FailureDuringOperation; + + log.FatalFormat("Opto-data serial port failure : {0}", e.Message); + if (e.InnerException != null) + { + log.FatalFormat("InnerMessage : {0}", e.InnerException.Message); + } + } + } + else if (DebugLevel == DebugMode.FailureDuringOperation) + { + } + } + + public void RunDeviceAfter() { } + + public void StopDevice() + { + try + { + if (DebugLevel == DebugMode.Normal && serialPort != null) + { + serialPort.Close(); + serialPort = null; + } + } + catch + { + } + } + + public void StopDevice2() { } + + /// + /// Events: Event.ReadRegisterDone, Event.Error + /// + /// ReadWaterMeter instance reference casted to IOperaton + public IOperation ReadRegisterOp() + { + return this; + } + + /// + /// Clear data/counters related to a specific tests + /// + public void Clear() + { + sampleNr = 0; + + volumeLtr = 0; + volumeLtr0 = 0; + timestampSec = 0; + timestampSec0 = 0; + + ReadPulses(); + } + + public void TestCompleted() + { + /// TODO: Implement + } + + + int sampleNr; /// This is to determine when the test start sample should be taken + + /// Start this operation + public void Start() + { + Clear(); + + /// Reset opto data + datastreamFramesCount = 0; + TestStartFrameIx = 0; + TestEndFrameIx = 0; + + /// File name + int digitIx = Name.IndexOfAny(new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }); + string position = (digitIx >= 0) ? Name.Substring(digitIx) : string.Empty; + + datastreamLogFileName = string.Format("{0}_{1}_{2}_{3}.txt", + StateMachine.CycleStartTimeStamp.ToString("HHmmss"), + position, + testName, + repetitionNr); + + StartParsingDatastream(new FrameFormat(FrameLength, FrameFrequency, + VolumeUnits, VolumeScaleFactor, + VolumeFieldStart, VolumeFieldEnd, VolumeFieldFormat, + TimeUnits, TimeScaleFactor, + TimeFieldStart, TimeFieldEnd, TimeFieldFormat)); + } + + /// Run this operation + /// eventDone + public Event Run() + { + sampleNr++; + ReadPulses(); + if (sampleNr == 4) + { + /// Take the test start sample + volumeLtrStart = volumeLtr; + timestampSecStart = timestampSec; + TestStartFrameIx = frameIx; + } + + /// Shift data in pipelines + volumeLtrEnd = volumeLtrEnd3; + volumeLtrEnd3 = volumeLtrEnd2; + volumeLtrEnd2 = volumeLtrEnd1; + volumeLtrEnd1 = volumeLtr; + + timestampSecEnd = timestampSecEnd3; + timestampSecEnd3 = timestampSecEnd2; + timestampSecEnd2 = timestampSecEnd1; + timestampSecEnd1 = timestampSec; + + TestEndFrameIx = frameIx - 3; + + return Event.ReadRegisterDone; + } + + /// Stop this operation + public void Stop() + { + if (TestStartFrameIx > 0 && TestStartFrameIx < datastreamFrames.Length && datastreamFrames[TestStartFrameIx].Flags == FrameFlags.OK) + { + datastreamFrames[TestStartFrameIx].Flags = FrameFlags.OK_TestStart; + DatastreamFrame.TestStartTimestampDec = datastreamFrames[TestStartFrameIx].TimestampDec(currentFrameFormat); + } + + if (TestEndFrameIx > 0 && TestEndFrameIx < datastreamFrames.Length && datastreamFrames[TestEndFrameIx].Flags == FrameFlags.OK) + { + datastreamFrames[TestEndFrameIx].Flags = FrameFlags.OK_TestEnd; + } + + StopParsingDatastream(); + DatastreamFrame.FIRFilterFlow(datastreamFrames, datastreamFramesCount); + SaveDatastreamLog(currentFrameFormat); + } + + + void SaveDatastreamLog(FrameFormat ff) + { + string directory = string.Format("C:\\TBF\\ProcessData\\{0}\\{1}\\{2}\\", + StateMachine.CycleStartTimeStamp.ToString("yy"), + StateMachine.CycleStartTimeStamp.ToString("MM"), + StateMachine.CycleStartTimeStamp.ToString("dd")); + string datastreamLogPathName = directory + datastreamLogFileName; + try + { + Directory.CreateDirectory(directory); + + double scalFact = ScalingFactor(); + + using (TextWriter datastreamLogFile = new StreamWriter(datastreamLogPathName)) + { + datastreamLogFile.WriteLine(datastreamFrames[0].ToString(ff, null)); + for (int i = 1; i < datastreamFramesCount; i++) datastreamLogFile.WriteLine(datastreamFrames[i].ToString(ff, datastreamFrames[i - 1])); + datastreamLogFile.Close(); + } + } + catch (Exception exc) + { + File.Delete(datastreamLogPathName); + log.ErrorFormat(string.Format("Error writing into file {0}", datastreamLogPathName)); + log.ErrorFormat(string.Format("Exception message: {0}", exc.Message)); + } + } + + void ReadPulses() + { + beginWMState = volumeLtr0; + endWMState = volumeLtr; + wmVolume = Math.Abs(endWMState - beginWMState); + wmPulses = (int)(wmVolume * (double)PulsesPerLtr + 0.5); + wmRefPulses = StateMachine.ControlBoard.EtPulses(0); + wmTestTime = timestampSec - timestampSec0; + } + + + bool datastreamParsingEnabled; + FrameFormat currentFrameFormat; /// Set by StartParsingDatastream() + + /// Flush internal buffers and start parsing the opto serial port data + void StartParsingDatastream(FrameFormat ff) + { + currentFrameFormat = ff; + datastreamParsingEnabled = true; + log.WarnFormat("StartParsingDatastream() ... FrameFormat set to {0}", currentFrameFormat); + } + + /// Stop parsig the opto serial port data + void StopParsingDatastream() + { + datastreamParsingEnabled = false; + } + + /// + /// Variables storing the context of serial port data parsing (ReadOptoSerialPort(...)) + /// + bool synchronized; + bool synchronized2; + string partOfTelegram; + + /// + /// 9600 Bd, 8 data bits, 1 stop bit, no parity + /// + /// Telegram description: + /// + /// AAAAAA[tab]BBBB[tab]CCCC[tab]DDDDDD[tab]EEEE[tab]FFFFFFFF[tab]GG[cr][lf] (42 bytes) + /// + /// Example: + /// FFFFFE 51EA 0000 65324E 0087 F6319DFF 86 + /// FFDD3A 51F9 0000 65324E 0088 F631A60B 45 + /// ... + /// + /// OptoState.Read or OptoState.Flush + void ReadDatastream(DatastreamState streamState, FrameFormat ff) + { + int nrBytes = serialPort.BytesToRead; + if (nrBytes > 0) + { + char[] buffer = new char[nrBytes]; + serialPort.Read(buffer, 0, nrBytes); + string received = new string(buffer); + + string allRcvd = partOfTelegram + received; + + while (true) + { + int pos = allRcvd.IndexOf("\r\n"); + + if (pos < 0) + { + /// No CR+LF found, wait for more characters in the next invocation + partOfTelegram = allRcvd; + return; + } + else + { + // CR+LF found + if (streamState == DatastreamState.Read) + { + if (pos < ff.FrameLength - 2) + { + /// CR+LF found too early, truncate the beginning incl CR+LF and keep scanning in this loop + allRcvd = allRcvd.Substring(pos + 2); + if (synchronized) + { + datastreamFrames[datastreamFramesCount].Counter = datastreamFramesCount; + datastreamFrames[datastreamFramesCount++].SetFlags(FrameFlags.SyncError); + } + synchronized = true; + } + // CR+LF found and (pos >= OptoTelegramRaw.Length - 2) + else if (datastreamFrames[datastreamFramesCount].UpdateFromString(allRcvd.Substring(pos - ff.FrameLength + 2, ff.FrameLength), + ff, datastreamFramesCount, ref volumeRawExtLast, ref timestampExtLast)) + { + OptoTelegramRreceived(datastreamFramesCount++, synchronized2); + synchronized2 = synchronized; + allRcvd = allRcvd.Substring(pos + 2); + } + else + { + datastreamFrames[datastreamFramesCount].Counter = datastreamFramesCount; + datastreamFramesCount++; + allRcvd = allRcvd.Substring(pos + 2); + } + } + else /// optoState == SerialStreamState.Flush + { + if (pos < FrameLength - 2) + { + /// CR+LF found too early, truncate the beginning incl CR+LF and keep scanning in this loop + allRcvd = allRcvd.Substring(pos + 2); + synchronized = true; + } + // CR+LF found and (pos >= OptoTelegram.Length - 2) + else if (toBeFlushed.UpdateFromStringDummy(allRcvd.Substring(pos - ff.FrameLength + 2), ff)) + { + flushedFramesCount++; + synchronized2 = synchronized; + allRcvd = allRcvd.Substring(pos + 2); + } + else + { + allRcvd = allRcvd.Substring(pos + 2); + } + } + } + } + + //OnFrameReceived(this, new FrameReceivedEventArgs(s)); + } + else + { + //OnFrameReceived(this, new FrameReceivedEventArgs(".")); + } + } + + + void OptoTelegramRreceived(int currentIx, bool async) + { + DatastreamFrame optoTelegram = datastreamFrames[currentIx]; + frameIx = currentIx; + + lastVolumeRaw = volumeRawExtLast; + lastTimestamp = timestampExtLast; + + if (volumeLtr == 0 && volumeLtr0 == 0) + { + volumeLtr = (double)lastVolumeRaw / currentFrameFormat.VolumeScaleFactor; + volumeLtr0 = volumeLtr; + } + else + { + volumeLtr = (double)lastVolumeRaw / currentFrameFormat.VolumeScaleFactor; + } + + if (timestampSec == 0 && timestampSec0 == 0) + { + timestampSec = (double)lastTimestamp / currentFrameFormat.TimeScaleFactor; + timestampSec0 = timestampSec; + } + else + { + timestampSec = (double)lastTimestamp / currentFrameFormat.TimeScaleFactor; + } + + //optoDataLogger.InfoFormat("{0} {1} {2} ltr {3} {4}", optoTelegram, lastTimestamp, lastVolumeRaw.ToString("X8"), timestampSec.ToString("F1"), volumeLtr.ToString("F3")); + } + + + /// + /// Called from the state machine when a test is selected and UI needs to be updated. + /// + public void OnFrameReceived(object sender, FrameReceivedEventArgs args) + { + if (FrameReceivedHandler == null) return; + try { FrameReceivedHandler(sender, args); } + catch (Exception) { } + } + + public event EventHandler FrameReceivedHandler; + + + public static double UnitVolume(Config.Unit units, double scaleFactor) + { + if (Config.Units.IsQuantity(units, Config.Quantity.Volume)) + { + return Config.Units.ConvertFrom(units, 1.0) * scaleFactor; + } + else + { + return 1.0; + } + } + + public double ScalingFactor() + { + return 1.0; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/RegisterReaders/SerialStream/SerialStreamCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/RegisterReaders/SerialStream/SerialStreamCfg.cs new file mode 100644 index 00000000..8b65c8b6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/RegisterReaders/SerialStream/SerialStreamCfg.cs @@ -0,0 +1,63 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.IO.Ports; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.RegisterReaders.SerialStream +{ + public class SerialStreamCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(SerialStreamCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new SerialStreamCfgCtrl(); } + + /// + /// Serialized parameters + /// + public int ComPortNr; + public int BaudRate; + public Parity Parity; + public int DataBits; + public StopBits StopBits; + public Handshake Handshake; + + /// + /// Procedure parameters + /// + [XmlIgnore] + public ProcParams ProcParams; + public override IParamsProvider GetRuntimeProcParamsProvider() { return ProcParams; } + public override IParamsProvider CreateProcParamsProvider() { return new ProcParams(true); } + + /// Private parameterless constructor invoked by all other (public) constructors + SerialStreamCfg() + { + ProcParams = CreateProcParamsProvider() as ProcParams; + } + + public SerialStreamCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + Factory = factory; + ParentName = string.Empty; + ComPortNr = 21; + BaudRate = 9600; + Parity = System.IO.Ports.Parity.None; + DataBits = 8; + StopBits = System.IO.Ports.StopBits.One; + Handshake = System.IO.Ports.Handshake.None; + } + + public string ToString(int i) + { + return string.Format("{0} Com{1}, {2}Bd, {3}-bits, parity={4}, stopBits={5}, {6}", + Name, ComPortNr, BaudRate, DataBits, Parity, StopBits, Handshake); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/RegisterReaders/SerialStream/SerialStreamCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/RegisterReaders/SerialStream/SerialStreamCfgCtrl.cs new file mode 100644 index 00000000..a64c31e8 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/RegisterReaders/SerialStream/SerialStreamCfgCtrl.cs @@ -0,0 +1,171 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Windows.Forms; +using System.IO.Ports; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.RegisterReaders.SerialStream +{ + public partial class SerialStreamCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + SerialStreamCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as SerialStreamCfg; + Redraw(); + } + } + + public SerialStreamCfgCtrl() + { + InitializeComponent(); + + parityComboBox.Items.Add(Parity.None.ToString()); + parityComboBox.Items.Add(Parity.Even.ToString()); + parityComboBox.Items.Add(Parity.Odd.ToString()); + + stopBitsComboBox.Items.Add(StopBits.None.ToString()); + stopBitsComboBox.Items.Add(StopBits.One.ToString()); + stopBitsComboBox.Items.Add(StopBits.OnePointFive.ToString()); + stopBitsComboBox.Items.Add(StopBits.Two.ToString()); + + handshakeComboBox.Items.Add(Handshake.None.ToString()); + handshakeComboBox.Items.Add(Handshake.RequestToSend.ToString()); + handshakeComboBox.Items.Add(Handshake.XOnXOff.ToString()); + } + + int GetParityIx(Parity par) + { + if (par == Parity.None) return 0; + if (par == Parity.Even) return 0; + if (par == Parity.Odd) return 0; + return -1; + } + Parity GetParity(string str) + { + if (str.Equals(Parity.None.ToString())) return Parity.None; + if (str.Equals(Parity.Even.ToString())) return Parity.Even; + if (str.Equals(Parity.Odd.ToString())) return Parity.Odd; + return (Parity)(-1); + } + + int GetStopBitsIx(StopBits sb) + { + if (sb == StopBits.None) return 0; + if (sb == StopBits.One) return 1; + if (sb == StopBits.OnePointFive) return 2; + if (sb == StopBits.Two) return 3; + return -1; + } + StopBits GetStopBits(string str) + { + if (str.Equals(StopBits.None.ToString())) return StopBits.None; + if (str.Equals(StopBits.One.ToString())) return StopBits.One; + if (str.Equals(StopBits.OnePointFive.ToString())) return StopBits.OnePointFive; + if (str.Equals(StopBits.Two.ToString())) return StopBits.Two; + return (StopBits)(-1); + } + + int GetHandshakeIx(Handshake par) + { + if (par == Handshake.None) return 0; + if (par == Handshake.RequestToSend) return 0; + if (par == Handshake.XOnXOff) return 0; + return -1; + } + Handshake GetHandshake(string str) + { + if (str.Equals(Handshake.None.ToString())) return Handshake.None; + if (str.Equals(Handshake.RequestToSend.ToString())) return Handshake.RequestToSend; + if (str.Equals(Handshake.XOnXOff.ToString())) return Handshake.XOnXOff; + return (Handshake)(-1); + } + + private void ModbusCfgCtrl_Load(object sender, EventArgs e) + { + nameLabel.Text = Strings.Name; + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + comPortNrTextBox.Text = config.ComPortNr.ToString(); + baudRateTextBox.Text = config.BaudRate.ToString(); + parityComboBox.Text = config.Parity.ToString(); + dataBitsTextBox.Text = config.DataBits.ToString(); + stopBitsComboBox.Text = config.StopBits.ToString(); + handshakeComboBox.Text = config.Handshake.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + comPortNrTextBox.Enabled = true; + baudRateTextBox.Enabled = true; + parityComboBox.Enabled = true; + dataBitsTextBox.Enabled = true; + stopBitsComboBox.Enabled = true; + handshakeComboBox.Enabled = true; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.ComPortNr = int.Parse(comPortNrTextBox.Text); + config.BaudRate = int.Parse(baudRateTextBox.Text); + config.Parity = GetParity(parityComboBox.SelectedItem.ToString()); + config.DataBits = int.Parse(dataBitsTextBox.Text); + config.StopBits = GetStopBits(stopBitsComboBox.SelectedItem.ToString()); + config.Handshake = GetHandshake(handshakeComboBox.SelectedItem.ToString()); + + return flags; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!int.TryParse(comPortNrTextBox.Text, out dummy) || dummy < 1 || dummy > 999) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Serial Port Number' is not valid"; + } + + if (!int.TryParse(baudRateTextBox.Text, out dummy) || dummy < 150 || dummy > 115200) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Baud Rate' is not valid"; + } + + if (!int.TryParse(dataBitsTextBox.Text, out dummy) || dummy < 7 || dummy > 8) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Data Bits' is not valid"; + } + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/RegisterReaders/SerialStream/SerialStreamCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/RegisterReaders/SerialStream/SerialStreamCfgCtrl.designer.cs new file mode 100644 index 00000000..4985c2fb --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/RegisterReaders/SerialStream/SerialStreamCfgCtrl.designer.cs @@ -0,0 +1,229 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +namespace TBF.BenchControl.RegisterReaders.SerialStream +{ + partial class SerialStreamCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.comPortNrTextBox = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.baudRateLabel = new System.Windows.Forms.Label(); + this.baudRateTextBox = new System.Windows.Forms.TextBox(); + this.partityLabel = new System.Windows.Forms.Label(); + this.dataBitsLabel = new System.Windows.Forms.Label(); + this.dataBitsTextBox = new System.Windows.Forms.TextBox(); + this.stopBitsLabel = new System.Windows.Forms.Label(); + this.handshakeLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.parityComboBox = new System.Windows.Forms.ComboBox(); + this.stopBitsComboBox = new System.Windows.Forms.ComboBox(); + this.handshakeComboBox = new System.Windows.Forms.ComboBox(); + this.SuspendLayout(); + // + // comPortNrTextBox + // + this.comPortNrTextBox.Enabled = false; + this.comPortNrTextBox.Location = new System.Drawing.Point(140, 52); + this.comPortNrTextBox.Name = "comPortNrTextBox"; + this.comPortNrTextBox.Size = new System.Drawing.Size(34, 20); + this.comPortNrTextBox.TabIndex = 4; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(29, 55); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(98, 13); + this.label1.TabIndex = 3; + this.label1.Text = "Serial Port Number:"; + // + // baudRateLabel + // + this.baudRateLabel.AutoSize = true; + this.baudRateLabel.Location = new System.Drawing.Point(29, 79); + this.baudRateLabel.Name = "baudRateLabel"; + this.baudRateLabel.Size = new System.Drawing.Size(58, 13); + this.baudRateLabel.TabIndex = 5; + this.baudRateLabel.Text = "Baud Rate"; + // + // baudRateTextBox + // + this.baudRateTextBox.Enabled = false; + this.baudRateTextBox.Location = new System.Drawing.Point(140, 76); + this.baudRateTextBox.Name = "baudRateTextBox"; + this.baudRateTextBox.Size = new System.Drawing.Size(130, 20); + this.baudRateTextBox.TabIndex = 6; + // + // partityLabel + // + this.partityLabel.AutoSize = true; + this.partityLabel.Location = new System.Drawing.Point(29, 103); + this.partityLabel.Name = "partityLabel"; + this.partityLabel.Size = new System.Drawing.Size(33, 13); + this.partityLabel.TabIndex = 7; + this.partityLabel.Text = "Parity"; + // + // dataBitsLabel + // + this.dataBitsLabel.AutoSize = true; + this.dataBitsLabel.Location = new System.Drawing.Point(29, 127); + this.dataBitsLabel.Name = "dataBitsLabel"; + this.dataBitsLabel.Size = new System.Drawing.Size(50, 13); + this.dataBitsLabel.TabIndex = 9; + this.dataBitsLabel.Text = "Data Bits"; + // + // dataBitsTextBox + // + this.dataBitsTextBox.Enabled = false; + this.dataBitsTextBox.Location = new System.Drawing.Point(140, 124); + this.dataBitsTextBox.Name = "dataBitsTextBox"; + this.dataBitsTextBox.Size = new System.Drawing.Size(34, 20); + this.dataBitsTextBox.TabIndex = 10; + // + // stopBitsLabel + // + this.stopBitsLabel.AutoSize = true; + this.stopBitsLabel.Location = new System.Drawing.Point(29, 151); + this.stopBitsLabel.Name = "stopBitsLabel"; + this.stopBitsLabel.Size = new System.Drawing.Size(49, 13); + this.stopBitsLabel.TabIndex = 11; + this.stopBitsLabel.Text = "Stop Bits"; + // + // handshakeLabel + // + this.handshakeLabel.AutoSize = true; + this.handshakeLabel.Location = new System.Drawing.Point(29, 175); + this.handshakeLabel.Name = "handshakeLabel"; + this.handshakeLabel.Size = new System.Drawing.Size(62, 13); + this.handshakeLabel.TabIndex = 13; + this.handshakeLabel.Text = "Handshake"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(140, 28); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(30, 31); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(137, 7); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // parityComboBox + // + this.parityComboBox.Enabled = false; + this.parityComboBox.FormattingEnabled = true; + this.parityComboBox.Location = new System.Drawing.Point(140, 100); + this.parityComboBox.Name = "parityComboBox"; + this.parityComboBox.Size = new System.Drawing.Size(130, 21); + this.parityComboBox.TabIndex = 8; + // + // stopBitsComboBox + // + this.stopBitsComboBox.Enabled = false; + this.stopBitsComboBox.FormattingEnabled = true; + this.stopBitsComboBox.Location = new System.Drawing.Point(140, 148); + this.stopBitsComboBox.Name = "stopBitsComboBox"; + this.stopBitsComboBox.Size = new System.Drawing.Size(130, 21); + this.stopBitsComboBox.TabIndex = 12; + // + // handshakeComboBox + // + this.handshakeComboBox.Enabled = false; + this.handshakeComboBox.FormattingEnabled = true; + this.handshakeComboBox.Location = new System.Drawing.Point(140, 172); + this.handshakeComboBox.Name = "handshakeComboBox"; + this.handshakeComboBox.Size = new System.Drawing.Size(130, 21); + this.handshakeComboBox.TabIndex = 14; + // + // AmbientCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.Control; + this.Controls.Add(this.handshakeComboBox); + this.Controls.Add(this.stopBitsComboBox); + this.Controls.Add(this.parityComboBox); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Controls.Add(this.handshakeLabel); + this.Controls.Add(this.stopBitsLabel); + this.Controls.Add(this.dataBitsTextBox); + this.Controls.Add(this.dataBitsLabel); + this.Controls.Add(this.partityLabel); + this.Controls.Add(this.baudRateTextBox); + this.Controls.Add(this.baudRateLabel); + this.Controls.Add(this.comPortNrTextBox); + this.Controls.Add(this.label1); + this.Name = "AmbientCfgCtrl"; + this.Size = new System.Drawing.Size(300, 240); + this.Load += new System.EventHandler(this.ModbusCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox comPortNrTextBox; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label baudRateLabel; + private System.Windows.Forms.TextBox baudRateTextBox; + private System.Windows.Forms.Label partityLabel; + private System.Windows.Forms.Label dataBitsLabel; + private System.Windows.Forms.TextBox dataBitsTextBox; + private System.Windows.Forms.Label stopBitsLabel; + private System.Windows.Forms.Label handshakeLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.ComboBox parityComboBox; + private System.Windows.Forms.ComboBox stopBitsComboBox; + private System.Windows.Forms.ComboBox handshakeComboBox; + + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/RegisterReaders/SerialStream/SerialStreamCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/RegisterReaders/SerialStream/SerialStreamCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/RegisterReaders/SerialStream/SerialStreamCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Cevak/Printer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Cevak/Printer.cs new file mode 100644 index 00000000..e96f7e73 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Cevak/Printer.cs @@ -0,0 +1,71 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using log4net; + +namespace TBF.BenchControl.ResultsPrinters.Cevak +{ + public class Printer : ComponentBase, IOperation, GenericDevices.IResultsPrinter + { + private static readonly ILog log = LogManager.GetLogger(typeof(Printer)); + public override string ToString() { return string.Format("ResultsPrinters.Cevak({0})", Cfg.ToString(1)); } + + readonly PrinterCfg printerCfg; + + public bool SupressPrinting { get { return printerCfg.SupressPrinting; } } + + + /// Data to print + Results.Entities.Batch batch; + + + public Printer() { } + + + public Printer(Generic.IComponentCfg cfg) + : base(cfg) + { + printerCfg = cfg as PrinterCfg; + log.Debug(this.ToString()); + } + + /// + /// Prints the test cycle results, Events: Event.ResultsPrinted + /// + /// Batch results to print + /// Reference to the operation + public IOperation PrintResultsOp(Results.Entities.Batch batch) + { + this.batch = batch; + return this; + } + + /// Start this operation + public void Start() + { + if (batch.WaterMeters.Count > 0) + { + TBF.BenchControl.BenchInfo.Polska.Component benchInfo = + BenchControl.Sequences.ProcessData.BenchInfo as TBF.BenchControl.BenchInfo.Polska.Component; + new Results.Output.Printers.Cevak.PrintDocumentCevak(batch, printerCfg.PageOrientation, + printerCfg.TopMargin, + printerCfg.BottomMargin, + printerCfg.LeftMargin, + benchInfo.TestBenchName, + benchInfo.BenchInfoCfg.Address1).Print(); + } + } + + /// Run this operation + /// Event.ResultsPrinted + public Event Run() + { + return Event.ResultsPrinted; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Cevak/PrinterCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Cevak/PrinterCfg.cs new file mode 100644 index 00000000..e6fbc836 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Cevak/PrinterCfg.cs @@ -0,0 +1,59 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.ResultsPrinters.Cevak +{ + public class PrinterCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(PrinterCfg) })[0]; + protected override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new PrinterCfgCtrl(); } + + /// + /// Serialized parameters + /// + public PageOrientation PageOrientation; + public int TopMargin; + public int BottomMargin; + public int LeftMargin; + public bool SupressPrinting; /// Bypass printing when true + + /// Private parameterless constructor invoked by all other (public) constructors + PrinterCfg() + { + Name = "ResultsPrinterCevak"; + ParentName = string.Empty; + PageOrientation = PageOrientation.Portrait; + TopMargin = 100; + BottomMargin = 100; + LeftMargin = 100; + SupressPrinting = false; + } + + public PrinterCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Orientation={1}, Margins T={2} B={3} L={4}, SupressPrinting={5}", + Name, + PageOrientation, + TopMargin, + BottomMargin, + LeftMargin, + SupressPrinting ? "yes" : "no" + ); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Cevak/PrinterCfgCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Cevak/PrinterCfgCtrl.Designer.cs new file mode 100644 index 00000000..b50fd8b8 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Cevak/PrinterCfgCtrl.Designer.cs @@ -0,0 +1,193 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.ResultsPrinters.Cevak +{ + partial class PrinterCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.supressPrintingCheckBox = new System.Windows.Forms.CheckBox(); + this.orientationLabel = new System.Windows.Forms.Label(); + this.orientationComboBox = new System.Windows.Forms.ComboBox(); + this.topMarginTextBox = new System.Windows.Forms.TextBox(); + this.topMarginLabel = new System.Windows.Forms.Label(); + this.leftMarginTextBox = new System.Windows.Forms.TextBox(); + this.leftMarginLabel = new System.Windows.Forms.Label(); + this.bottomMarginTextBox = new System.Windows.Forms.TextBox(); + this.bottomMarginLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(142, 40); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(16, 43); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(139, 16); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // supressPrintingCheckBox + // + this.supressPrintingCheckBox.AutoSize = true; + this.supressPrintingCheckBox.Enabled = false; + this.supressPrintingCheckBox.Location = new System.Drawing.Point(142, 167); + this.supressPrintingCheckBox.Name = "supressPrintingCheckBox"; + this.supressPrintingCheckBox.Size = new System.Drawing.Size(101, 17); + this.supressPrintingCheckBox.TabIndex = 11; + this.supressPrintingCheckBox.Text = "Supress printing"; + this.supressPrintingCheckBox.UseVisualStyleBackColor = true; + // + // orientationLabel + // + this.orientationLabel.AutoSize = true; + this.orientationLabel.Location = new System.Drawing.Point(16, 67); + this.orientationLabel.Name = "orientationLabel"; + this.orientationLabel.Size = new System.Drawing.Size(84, 13); + this.orientationLabel.TabIndex = 3; + this.orientationLabel.Text = "Page orientation"; + // + // orientationComboBox + // + this.orientationComboBox.Enabled = false; + this.orientationComboBox.FormattingEnabled = true; + this.orientationComboBox.Location = new System.Drawing.Point(142, 64); + this.orientationComboBox.Name = "orientationComboBox"; + this.orientationComboBox.Size = new System.Drawing.Size(130, 21); + this.orientationComboBox.TabIndex = 4; + // + // topMarginTextBox + // + this.topMarginTextBox.Enabled = false; + this.topMarginTextBox.Location = new System.Drawing.Point(142, 89); + this.topMarginTextBox.Name = "topMarginTextBox"; + this.topMarginTextBox.Size = new System.Drawing.Size(80, 20); + this.topMarginTextBox.TabIndex = 6; + // + // topMarginLabel + // + this.topMarginLabel.AutoSize = true; + this.topMarginLabel.Location = new System.Drawing.Point(16, 92); + this.topMarginLabel.Name = "topMarginLabel"; + this.topMarginLabel.Size = new System.Drawing.Size(109, 13); + this.topMarginLabel.TabIndex = 5; + this.topMarginLabel.Text = "Top margin [0.25 mm]"; + // + // leftMarginTextBox + // + this.leftMarginTextBox.Enabled = false; + this.leftMarginTextBox.Location = new System.Drawing.Point(142, 137); + this.leftMarginTextBox.Name = "leftMarginTextBox"; + this.leftMarginTextBox.Size = new System.Drawing.Size(80, 20); + this.leftMarginTextBox.TabIndex = 10; + // + // leftMarginLabel + // + this.leftMarginLabel.AutoSize = true; + this.leftMarginLabel.Location = new System.Drawing.Point(16, 140); + this.leftMarginLabel.Name = "leftMarginLabel"; + this.leftMarginLabel.Size = new System.Drawing.Size(108, 13); + this.leftMarginLabel.TabIndex = 9; + this.leftMarginLabel.Text = "Left margin [0.25 mm]"; + // + // bottomMarginTextBox + // + this.bottomMarginTextBox.Enabled = false; + this.bottomMarginTextBox.Location = new System.Drawing.Point(142, 113); + this.bottomMarginTextBox.Name = "bottomMarginTextBox"; + this.bottomMarginTextBox.Size = new System.Drawing.Size(80, 20); + this.bottomMarginTextBox.TabIndex = 8; + // + // bottomMarginLabel + // + this.bottomMarginLabel.AutoSize = true; + this.bottomMarginLabel.Location = new System.Drawing.Point(16, 116); + this.bottomMarginLabel.Name = "bottomMarginLabel"; + this.bottomMarginLabel.Size = new System.Drawing.Size(123, 13); + this.bottomMarginLabel.TabIndex = 7; + this.bottomMarginLabel.Text = "Bottom margin [0.25 mm]"; + // + // PrinterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.bottomMarginTextBox); + this.Controls.Add(this.bottomMarginLabel); + this.Controls.Add(this.leftMarginTextBox); + this.Controls.Add(this.leftMarginLabel); + this.Controls.Add(this.topMarginTextBox); + this.Controls.Add(this.topMarginLabel); + this.Controls.Add(this.orientationComboBox); + this.Controls.Add(this.orientationLabel); + this.Controls.Add(this.supressPrintingCheckBox); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "PrinterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.PrinterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.CheckBox supressPrintingCheckBox; + private System.Windows.Forms.Label orientationLabel; + private System.Windows.Forms.ComboBox orientationComboBox; + private System.Windows.Forms.TextBox topMarginTextBox; + private System.Windows.Forms.Label topMarginLabel; + private System.Windows.Forms.TextBox leftMarginTextBox; + private System.Windows.Forms.Label leftMarginLabel; + private System.Windows.Forms.TextBox bottomMarginTextBox; + private System.Windows.Forms.Label bottomMarginLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Cevak/PrinterCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Cevak/PrinterCfgCtrl.cs new file mode 100644 index 00000000..3ac06ed4 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Cevak/PrinterCfgCtrl.cs @@ -0,0 +1,123 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.ResultsPrinters.Cevak +{ + public partial class PrinterCfgCtrl : UserControl, IComponentCfgCtrl + { + static readonly ILog log = LogManager.GetLogger(typeof(PrinterCfgCtrl)); + + public bool ShowMore { get { return false; } } + + PrinterCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as PrinterCfg; + Redraw(); + } + } + + public PrinterCfgCtrl() + { + InitializeComponent(); + + orientationComboBox.Items.Add(PageOrientation.Portrait.ToString()); + orientationComboBox.Items.Add(PageOrientation.Landscape.ToString()); + } + + private void PrinterCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + PageOrientation GetOrientation(string str) + { + if (str.Equals(PageOrientation.Landscape.ToString())) return PageOrientation.Landscape; + if (str.Equals(PageOrientation.Portrait.ToString())) return PageOrientation.Portrait; + return (PageOrientation)(-1); + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + orientationComboBox.Text = config.PageOrientation.ToString(); + topMarginTextBox.Text = config.TopMargin.ToString(); + bottomMarginTextBox.Text = config.BottomMargin.ToString(); + leftMarginTextBox.Text = config.LeftMargin.ToString(); + supressPrintingCheckBox.Checked = config.SupressPrinting; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + orientationComboBox.Enabled = true; + topMarginTextBox.Enabled = true; + bottomMarginTextBox.Enabled = true; + leftMarginTextBox.Enabled = true; + supressPrintingCheckBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if ((int)GetOrientation(orientationComboBox.Text) < 0) + { + message += Environment.NewLine + "Invalid 'Page orientation'"; + flags |= CfgUpdateFlags.Error; + } + + int dummy; + if (!int.TryParse(topMarginTextBox.Text, out dummy) || dummy < 0 || dummy > 500) + { + message += Environment.NewLine + "'Top margin' should be between 0 and 500"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(bottomMarginTextBox.Text, out dummy) || dummy < 0 || dummy > 200) + { + message += Environment.NewLine + "'Bottom margin' should be between 0 and 200"; + flags |= CfgUpdateFlags.Error; + } + + if (!int.TryParse(leftMarginTextBox.Text, out dummy) || dummy < 0 || dummy > 200) + { + message += Environment.NewLine + "Left margin' should be between 0 and 200"; + flags |= CfgUpdateFlags.Error; + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.PageOrientation = GetOrientation(orientationComboBox.Text); + config.TopMargin = int.Parse(topMarginTextBox.Text); + config.BottomMargin = int.Parse(bottomMarginTextBox.Text); + config.LeftMargin = int.Parse(leftMarginTextBox.Text); + config.SupressPrinting = supressPrintingCheckBox.Checked; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Cevak/PrinterCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Cevak/PrinterCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Cevak/PrinterCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Cevak/PrinterFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Cevak/PrinterFactory.cs new file mode 100644 index 00000000..c9b7c37b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Cevak/PrinterFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.ResultsPrinters.Cevak +{ + public class PrinterFactory : IComponentFactory + { + public string ClassName { get { return "ResultsPrinterCevak"; } } + + public void ResetStaticProperties() { Printer.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Printer(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Printer(cfg); } + + public IComponentCfg DefaultConfig() { return new PrinterCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(PrinterCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/LabelPrinter/PrintLabelDocument.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/LabelPrinter/PrintLabelDocument.cs new file mode 100644 index 00000000..744e9d0d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/LabelPrinter/PrintLabelDocument.cs @@ -0,0 +1,212 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Printing; +using System.IO; +using Config.Entities; +using TBF.Resources; + +namespace TBF.BenchControl.ResultsPrinters.LabelPrinter +{ + public class PrintLabelDocument : PrintDocument + { + const int FontSize = 9; + const string FontFamilyName = "Arial"; //"Times New Roman"; + + readonly int paperWidth; + readonly int paperHeight; + readonly string templateFile; + + /// Property variable for the Font the user wishes to use + Font font; + + /// + /// Data to print + /// + Results.Entities.Batch batch; + + /// + /// Items to print + /// + IList rsltItems; + + /// + /// Layout and status + /// + int nextWMNr; /// nr. of watermeter to be printed as the first one on the next page + int nrPages; + int pageNr; /// Page number to be printed at the bottom of the page + + + /// + /// Constructor + /// + /// Text to be printed + public PrintLabelDocument(Results.Entities.Batch batch, + PageOrientation pageOrientation, + int paperWidth, + int paperHeight, + string templateFile) + { + this.batch = batch; + this.paperWidth = paperWidth; + this.paperHeight = paperHeight; + this.templateFile = templateFile; + + DefaultPageSettings.Landscape = (pageOrientation == PageOrientation.Landscape); + + if (batch.WaterMeters.Count > 0 && batch.WaterMeters[0].Compound()) + { + rsltItems = Results.ItemSpec.FromStrArray(Program.LocalSettings.RsltItems_Printer_CombinedWM); + } + else + { + rsltItems = Results.ItemSpec.FromStrArray(Program.LocalSettings.RsltItems_Printer_SingleWM); + } + + /// Set print area size and margins (in dots using 80 dpi) + int printHeight = base.DefaultPageSettings.PaperSize.Height - base.DefaultPageSettings.Margins.Top - base.DefaultPageSettings.Margins.Bottom; + int printWidth = base.DefaultPageSettings.PaperSize.Width - base.DefaultPageSettings.Margins.Left - base.DefaultPageSettings.Margins.Right; + int leftMargin = base.DefaultPageSettings.Margins.Left; /// X + int topMargin = base.DefaultPageSettings.Margins.Top; /// Y + + /// Check if the user selected to print in Landscape mode + /// if they did then we need to swap height/width parameters + if (DefaultPageSettings.Landscape) + { + int tmp = printHeight; + printHeight = printWidth; + printWidth = tmp; + } + + /// One watermeter per label/page + nrPages = batch.WaterMeters.Count; + + pageNr = 1; + nextWMNr = 0; + } + + + /// + /// Override the default onbeginPrint method of the PrintDocument Object + /// + /// + /// + protected override void OnBeginPrint(System.Drawing.Printing.PrintEventArgs e) + { + base.OnBeginPrint(e); + + if (font == null) { font = new Font(FontFamilyName, FontSize, FontStyle.Regular); } + } + + + /// + /// Override the default OnPrintPage method of the PrintDocument. + /// + /// + /// This provides the print logic for our document + protected override void OnPrintPage(System.Drawing.Printing.PrintPageEventArgs e) + { + /// Run base code + base.OnPrintPage(e); + + if (File.Exists(templateFile)) + { + Image img = Image.FromFile(templateFile); + e.Graphics.DrawImage(new Bitmap(img), new Rectangle(0, 0, paperWidth, paperHeight)); + } + + /// Set print area size and margins (in dots using 80 dpi) + int printHeight = base.DefaultPageSettings.PaperSize.Height - base.DefaultPageSettings.Margins.Top - base.DefaultPageSettings.Margins.Bottom; + int printWidth = base.DefaultPageSettings.PaperSize.Width - base.DefaultPageSettings.Margins.Left - base.DefaultPageSettings.Margins.Right; + int leftMargin = base.DefaultPageSettings.Margins.Left; /// X + int topMargin = base.DefaultPageSettings.Margins.Top; /// Y + + /// Check if the user selected to print in Landscape mode + /// if they did then we need to swap height/width parameters + if (base.DefaultPageSettings.Landscape) + { + int tmp = printHeight; + printHeight = printWidth; + printWidth = tmp; + } + + int x = leftMargin; + int y = topMargin; + + /// Use the StringFormat class for the text layout of our document + StringFormat format = new StringFormat(StringFormatFlags.LineLimit); + + + ///-------- + /// Body + ///-------- + + PrintWM(e, nextWMNr); + nextWMNr++; + e.HasMorePages = (nextWMNr < batch.WaterMeters.Count); + } + + + /// + /// Print one water meter results + /// + /// Water meter number (0-based) + void PrintWM(System.Drawing.Printing.PrintPageEventArgs e, int wmNr) + { + if (wmNr >= batch.WaterMeters.Count) return; + + Results.Entities.WaterMeter wm = batch.WaterMeters[wmNr]; + + if (wm == null) return; + + + /// Serial number + if (!string.IsNullOrEmpty(wm.SerialNr)) PrintAt(e, 20, 62, string.Format("S/N: {0}", wm.SerialNr)); + + /// Watermeter type + PrintAt(e, 20, 74, batch.ProtocolTitle); + + /// Date + PrintAt(e, 135, 74, string.Format("{0:dd/MM/yy", batch.EndTime)); + + if (rsltItems.Count > 0) + { + Results.WMeterRsltItemSpec item1 = Results.WMeterRsltItemSpec.GetItem(Results.ItemID.Test_name); + + Results.WMeterRsltItemSpec item2 = Results.WMeterRsltItemSpec.GetItem(Results.ItemID.Error); + item2.Units = Config.Unit.Pct; + item2.Precision = "F2"; + item2.Format = "{0}%"; + + int printPosition = 1; + foreach (var mtr in wm.MeterTestRslts) + { + item1.TestID = mtr.Name(); + item2.TestID = mtr.Name(); + + PrintAt(e, 20, 6 + 14 * printPosition, item1.Print(wm)); + PrintAt(e, 78, 6 + 14 * printPosition, item2.Print(wm)); + + printPosition++; + } + } + } + + + void PrintAt(System.Drawing.Printing.PrintPageEventArgs e, Point p, string text) + { + PrintAt(e, p.X, p.Y, text); + } + + + void PrintAt(System.Drawing.Printing.PrintPageEventArgs e, int x, int y, string text) + { + RectangleF printArea = new RectangleF(x, y, 667, 18); + e.Graphics.DrawString(text, this.font, Brushes.Black, printArea); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/LabelPrinter/Printer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/LabelPrinter/Printer.cs new file mode 100644 index 00000000..584ec87e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/LabelPrinter/Printer.cs @@ -0,0 +1,67 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// +using log4net; + +namespace TBF.BenchControl.ResultsPrinters.LabelPrinter +{ + public class Printer : ComponentBase, IOperation, GenericDevices.IResultsPrinter + { + private static readonly ILog log = LogManager.GetLogger(typeof(Printer)); + public override string ToString() { return string.Format("LabelPrinter({0})", Cfg.ToString(1)); } + + readonly PrinterCfg printerCfg; + + public bool SupressPrinting { get { return printerCfg.SupressPrinting; } } + + /// Data to print + Results.Entities.Batch batch; + + + public Printer() { } + + + public Printer(Generic.IComponentCfg cfg) + : base(cfg) + { + printerCfg = cfg as PrinterCfg; + log.Debug(this.ToString()); + } + + /// + /// Prints the test cycle results, Events: Event.ResultsPrinted + /// + /// Batch results to print + /// Reference to the operation + public IOperation PrintResultsOp(Results.Entities.Batch batch) + { + this.batch = batch; + return this; + } + + /// Start this operation + public void Start() + { + if (batch.WaterMeters.Count > 0) + { + new PrintLabelDocument(batch, + printerCfg.PageOrientation, + printerCfg.PaperWidth, + printerCfg.PaperHeight, + printerCfg.TemplateFile).Print(); + } + } + + /// Run this operation + /// Event.ResultsPrinted + public Event Run() + { + return Event.ResultsPrinted; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/LabelPrinter/PrinterCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/LabelPrinter/PrinterCfg.cs new file mode 100644 index 00000000..8f5fe096 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/LabelPrinter/PrinterCfg.cs @@ -0,0 +1,59 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.ResultsPrinters.LabelPrinter +{ + public class PrinterCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(PrinterCfg) })[0]; + protected override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new PrinterCfgCtrl(); } + + /// + /// Serialized parameters + /// + public PageOrientation PageOrientation; + public int PaperWidth; /// In 0,254 mm = 1/100 in = 100dpi pixels count + public int PaperHeight; /// In 0,254 mm = 1/100 in = 100dpi pixels count + public string TemplateFile; /// Full path to a 'png' file + public bool SupressPrinting; /// true = Bypass printing + + /// Private parameterless constructor invoked by all other (public) constructors + PrinterCfg() + { + Name = "LabelPrinter"; + ParentName = string.Empty; + PageOrientation = PageOrientation.Portrait; + PaperWidth = 827; /// A4 width + PaperHeight = 1169; /// A4 height + TemplateFile = "C:\\TBF\\Templates\\Label.png"; + SupressPrinting = false; + } + + public PrinterCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Orientation={1}, PaperWidth={2}, PaperHeight={3}, TemplateFile={4}, SupressPrinting={5}", + Name, + PageOrientation, + PaperWidth, + PaperHeight, + TemplateFile, + SupressPrinting ? "yes" : "no" + ); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/LabelPrinter/PrinterCfgCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/LabelPrinter/PrinterCfgCtrl.Designer.cs new file mode 100644 index 00000000..5e278637 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/LabelPrinter/PrinterCfgCtrl.Designer.cs @@ -0,0 +1,193 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.ResultsPrinters.LabelPrinter +{ + partial class PrinterCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.supressPrintingCheckBox = new System.Windows.Forms.CheckBox(); + this.orientationLabel = new System.Windows.Forms.Label(); + this.orientationComboBox = new System.Windows.Forms.ComboBox(); + this.templateTextBox = new System.Windows.Forms.TextBox(); + this.templateLabel = new System.Windows.Forms.Label(); + this.paperWidthTextBox = new System.Windows.Forms.TextBox(); + this.paperWidthLabel = new System.Windows.Forms.Label(); + this.paperHeightTextBox = new System.Windows.Forms.TextBox(); + this.paperHeightLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(98, 30); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(8, 33); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(95, 6); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // supressPrintingCheckBox + // + this.supressPrintingCheckBox.AutoSize = true; + this.supressPrintingCheckBox.Enabled = false; + this.supressPrintingCheckBox.Location = new System.Drawing.Point(98, 164); + this.supressPrintingCheckBox.Name = "supressPrintingCheckBox"; + this.supressPrintingCheckBox.Size = new System.Drawing.Size(101, 17); + this.supressPrintingCheckBox.TabIndex = 11; + this.supressPrintingCheckBox.Text = "Supress printing"; + this.supressPrintingCheckBox.UseVisualStyleBackColor = true; + // + // orientationLabel + // + this.orientationLabel.AutoSize = true; + this.orientationLabel.Location = new System.Drawing.Point(8, 59); + this.orientationLabel.Name = "orientationLabel"; + this.orientationLabel.Size = new System.Drawing.Size(84, 13); + this.orientationLabel.TabIndex = 3; + this.orientationLabel.Text = "Page orientation"; + // + // orientationComboBox + // + this.orientationComboBox.Enabled = false; + this.orientationComboBox.FormattingEnabled = true; + this.orientationComboBox.Location = new System.Drawing.Point(98, 56); + this.orientationComboBox.Name = "orientationComboBox"; + this.orientationComboBox.Size = new System.Drawing.Size(130, 21); + this.orientationComboBox.TabIndex = 4; + // + // templateTextBox + // + this.templateTextBox.Enabled = false; + this.templateTextBox.Location = new System.Drawing.Point(98, 135); + this.templateTextBox.Name = "templateTextBox"; + this.templateTextBox.Size = new System.Drawing.Size(187, 20); + this.templateTextBox.TabIndex = 10; + // + // templateLabel + // + this.templateLabel.AutoSize = true; + this.templateLabel.Location = new System.Drawing.Point(8, 138); + this.templateLabel.Name = "templateLabel"; + this.templateLabel.Size = new System.Drawing.Size(67, 13); + this.templateLabel.TabIndex = 9; + this.templateLabel.Text = "Template file"; + // + // paperWidthTextBox + // + this.paperWidthTextBox.Enabled = false; + this.paperWidthTextBox.Location = new System.Drawing.Point(98, 83); + this.paperWidthTextBox.Name = "paperWidthTextBox"; + this.paperWidthTextBox.Size = new System.Drawing.Size(51, 20); + this.paperWidthTextBox.TabIndex = 6; + // + // paperWidthLabel + // + this.paperWidthLabel.AutoSize = true; + this.paperWidthLabel.Location = new System.Drawing.Point(8, 86); + this.paperWidthLabel.Name = "paperWidthLabel"; + this.paperWidthLabel.Size = new System.Drawing.Size(63, 13); + this.paperWidthLabel.TabIndex = 5; + this.paperWidthLabel.Text = "Paper width"; + // + // paperHeightTextBox + // + this.paperHeightTextBox.Enabled = false; + this.paperHeightTextBox.Location = new System.Drawing.Point(98, 109); + this.paperHeightTextBox.Name = "paperHeightTextBox"; + this.paperHeightTextBox.Size = new System.Drawing.Size(51, 20); + this.paperHeightTextBox.TabIndex = 8; + // + // paperHeightLabel + // + this.paperHeightLabel.AutoSize = true; + this.paperHeightLabel.Location = new System.Drawing.Point(8, 112); + this.paperHeightLabel.Name = "paperHeightLabel"; + this.paperHeightLabel.Size = new System.Drawing.Size(67, 13); + this.paperHeightLabel.TabIndex = 7; + this.paperHeightLabel.Text = "Paper height"; + // + // PrinterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.paperHeightTextBox); + this.Controls.Add(this.paperHeightLabel); + this.Controls.Add(this.paperWidthTextBox); + this.Controls.Add(this.paperWidthLabel); + this.Controls.Add(this.templateTextBox); + this.Controls.Add(this.templateLabel); + this.Controls.Add(this.orientationComboBox); + this.Controls.Add(this.orientationLabel); + this.Controls.Add(this.supressPrintingCheckBox); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "PrinterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.PrinterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.CheckBox supressPrintingCheckBox; + private System.Windows.Forms.Label orientationLabel; + private System.Windows.Forms.ComboBox orientationComboBox; + private System.Windows.Forms.TextBox templateTextBox; + private System.Windows.Forms.Label templateLabel; + private System.Windows.Forms.TextBox paperWidthTextBox; + private System.Windows.Forms.Label paperWidthLabel; + private System.Windows.Forms.TextBox paperHeightTextBox; + private System.Windows.Forms.Label paperHeightLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/LabelPrinter/PrinterCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/LabelPrinter/PrinterCfgCtrl.cs new file mode 100644 index 00000000..d2b69432 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/LabelPrinter/PrinterCfgCtrl.cs @@ -0,0 +1,123 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +using System; +using System.IO; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.ResultsPrinters.LabelPrinter +{ + public partial class PrinterCfgCtrl : UserControl, IComponentCfgCtrl + { + static readonly ILog log = LogManager.GetLogger(typeof(PrinterCfgCtrl)); + + public bool ShowMore { get { return false; } } + + PrinterCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as PrinterCfg; + Redraw(); + } + } + + public PrinterCfgCtrl() + { + InitializeComponent(); + + orientationComboBox.Items.Add(PageOrientation.Portrait.ToString()); + orientationComboBox.Items.Add(PageOrientation.Landscape.ToString()); + } + + private void PrinterCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + PageOrientation GetOrientation(string str) + { + if (str.Equals(PageOrientation.Landscape.ToString())) return PageOrientation.Landscape; + if (str.Equals(PageOrientation.Portrait.ToString())) return PageOrientation.Portrait; + return (PageOrientation)(-1); + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + orientationComboBox.Text = config.PageOrientation.ToString(); + paperWidthTextBox.Text = config.PaperWidth.ToString(); + paperHeightTextBox.Text = config.PaperHeight.ToString(); + templateTextBox.Text = config.TemplateFile; + supressPrintingCheckBox.Checked = config.SupressPrinting; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + orientationComboBox.Enabled = true; + paperWidthTextBox.Enabled = true; + paperHeightTextBox.Enabled = true; + templateTextBox.Enabled = true; + supressPrintingCheckBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if ((int)GetOrientation(orientationComboBox.Text) < 0) + { + message += Environment.NewLine + "Invalid page orientation"; + flags |= CfgUpdateFlags.Error; + } + + int dummy; + if (!int.TryParse(paperWidthTextBox.Text, out dummy) || dummy <= 0) + { + message += Environment.NewLine + "Invalid paper width"; + flags |= CfgUpdateFlags.Error; + } + if (!int.TryParse(paperHeightTextBox.Text, out dummy) || dummy <= 0) + { + message += Environment.NewLine + "Invalid paper height"; + flags |= CfgUpdateFlags.Error; + } + + if (!File.Exists(config.TemplateFile)) + { + message += Environment.NewLine + "Template file missing"; + flags |= CfgUpdateFlags.Error; + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.PageOrientation = GetOrientation(orientationComboBox.Text); + config.PaperWidth = int.Parse(paperWidthTextBox.Text); + config.PaperHeight = int.Parse(paperHeightTextBox.Text); + config.TemplateFile = templateTextBox.Text; + config.SupressPrinting = supressPrintingCheckBox.Checked; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/LabelPrinter/PrinterCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/LabelPrinter/PrinterCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/LabelPrinter/PrinterCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/LabelPrinter/PrinterFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/LabelPrinter/PrinterFactory.cs new file mode 100644 index 00000000..c9979d63 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/LabelPrinter/PrinterFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.ResultsPrinters.LabelPrinter +{ + public class PrinterFactory : IComponentFactory + { + public string ClassName { get { return "LabelPrinter"; } } + + public void ResetStaticProperties() { Printer.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Printer(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Printer(cfg); } + + public IComponentCfg DefaultConfig() { return new PrinterCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(PrinterCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Munich/Printer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Munich/Printer.cs new file mode 100644 index 00000000..101560f6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Munich/Printer.cs @@ -0,0 +1,73 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Printing; +using log4net; +using Config.Entities; +using TBF.BenchControl; + +namespace TBF.BenchControl.ResultsPrinters.Munich +{ + public class Printer : ComponentBase, IOperation, GenericDevices.IResultsPrinter + { + private static readonly ILog log = LogManager.GetLogger(typeof(Printer)); + public override string ToString() { return string.Format("ResultsPrinters.Munich({0})", Cfg.ToString(1)); } + + readonly PrinterCfg printerCfg; + + public bool SupressPrinting { get { return false; } } + + + /// Data to print + Results.Entities.Batch batch; + + public string Version { get { return printerCfg.Version; } } + + + public Printer() + { + } + + public Printer(Generic.IComponentCfg cfg) + : base(cfg) + { + printerCfg = cfg as PrinterCfg; + log.Debug(this.ToString()); + } + + + /// Events: ResultsPrinted + /// Procedure to print the results of + /// Results to print + /// Reference to the operation + public IOperation PrintResultsOp(Results.Entities.Batch batch) + { + this.batch = batch; + return this; + } + + /// Start this operation + public void Start() + { + foreach (var wm in batch.WaterMeters) + { + new Results.Output.Printers.Munich.MunichPrintDocument(printerCfg.Version, wm, printerCfg.PageOrientation).Print(); + } + } + + /// Run this operation + /// Event.ResultsPrinted + public Event Run() + { + return Event.ResultsPrinted; + } + + /// Stop this operation + public void Stop() + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Munich/PrinterCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Munich/PrinterCfg.cs new file mode 100644 index 00000000..fa04f00c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Munich/PrinterCfg.cs @@ -0,0 +1,50 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.ResultsPrinters.Munich +{ + public class PrinterCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(PrinterCfg) })[0]; + protected override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new PrinterCfgCtrl(); } + + /// + /// Serialized parameters + /// + public string Version; + public PageOrientation PageOrientation; + public bool SupressPrinting; /// Bypass printing when true + + /// Private parameterless constructor invoked by all other (public) constructors + PrinterCfg() + { + Name = "PrintedProtocol"; + ParentName = string.Empty; + PageOrientation = PageOrientation.Portrait; + SupressPrinting = false; + } + + public PrinterCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Orientation={1}, SupressPrinting={2}", + Name, + PageOrientation, + SupressPrinting ? "yes" : "no"); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Munich/PrinterCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Munich/PrinterCfgCtrl.cs new file mode 100644 index 00000000..d6988e4c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Munich/PrinterCfgCtrl.cs @@ -0,0 +1,98 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.ResultsPrinters.Munich +{ + public partial class PrinterCfgCtrl : UserControl, IComponentCfgCtrl + { + static readonly ILog log = LogManager.GetLogger(typeof(PrinterCfgCtrl)); + + public bool ShowMore { get { return false; } } + + PrinterCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as PrinterCfg; + Redraw(); + } + } + + public PrinterCfgCtrl() + { + InitializeComponent(); + + orientationComboBox.Items.Add(PageOrientation.Portrait.ToString()); + orientationComboBox.Items.Add(PageOrientation.Landscape.ToString()); + } + + private void PrinterCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + PageOrientation GetOrientation(string str) + { + if (str.Equals(PageOrientation.Landscape.ToString())) return PageOrientation.Landscape; + if (str.Equals(PageOrientation.Portrait.ToString())) return PageOrientation.Portrait; + return (PageOrientation)(-1); + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + versionTextBox.Text = config.Version; + orientationComboBox.Text = config.PageOrientation.ToString(); + supressPrintingCheckBox.Checked = config.SupressPrinting; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + versionTextBox.Enabled = true; + orientationComboBox.Enabled = true; + supressPrintingCheckBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if ((int)GetOrientation(orientationComboBox.Text) < 0) + { + message += Environment.NewLine + "Invalid 'Page orientation'"; + flags |= CfgUpdateFlags.Error; + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.Version = versionTextBox.Text; + config.PageOrientation = GetOrientation(orientationComboBox.Text); + config.SupressPrinting = supressPrintingCheckBox.Checked; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Munich/PrinterCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Munich/PrinterCfgCtrl.designer.cs new file mode 100644 index 00000000..cabd2e90 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Munich/PrinterCfgCtrl.designer.cs @@ -0,0 +1,147 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.ResultsPrinters.Munich +{ + partial class PrinterCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.orientationComboBox = new System.Windows.Forms.ComboBox(); + this.orientationLabel = new System.Windows.Forms.Label(); + this.supressPrintingCheckBox = new System.Windows.Forms.CheckBox(); + this.versionTextBox = new System.Windows.Forms.TextBox(); + this.versionLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(143, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(25, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(140, 24); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // orientationComboBox + // + this.orientationComboBox.Enabled = false; + this.orientationComboBox.FormattingEnabled = true; + this.orientationComboBox.Location = new System.Drawing.Point(143, 109); + this.orientationComboBox.Name = "orientationComboBox"; + this.orientationComboBox.Size = new System.Drawing.Size(130, 21); + this.orientationComboBox.TabIndex = 6; + // + // orientationLabel + // + this.orientationLabel.AutoSize = true; + this.orientationLabel.Location = new System.Drawing.Point(25, 112); + this.orientationLabel.Name = "orientationLabel"; + this.orientationLabel.Size = new System.Drawing.Size(84, 13); + this.orientationLabel.TabIndex = 5; + this.orientationLabel.Text = "Page orientation"; + // + // supressPrintingCheckBox + // + this.supressPrintingCheckBox.AutoSize = true; + this.supressPrintingCheckBox.Enabled = false; + this.supressPrintingCheckBox.Location = new System.Drawing.Point(143, 137); + this.supressPrintingCheckBox.Name = "supressPrintingCheckBox"; + this.supressPrintingCheckBox.Size = new System.Drawing.Size(101, 17); + this.supressPrintingCheckBox.TabIndex = 7; + this.supressPrintingCheckBox.Text = "Supress printing"; + this.supressPrintingCheckBox.UseVisualStyleBackColor = true; + // + // versionTextBox + // + this.versionTextBox.Enabled = false; + this.versionTextBox.Location = new System.Drawing.Point(143, 83); + this.versionTextBox.Name = "versionTextBox"; + this.versionTextBox.Size = new System.Drawing.Size(130, 20); + this.versionTextBox.TabIndex = 4; + // + // versionLabel + // + this.versionLabel.AutoSize = true; + this.versionLabel.Location = new System.Drawing.Point(25, 86); + this.versionLabel.Name = "versionLabel"; + this.versionLabel.Size = new System.Drawing.Size(42, 13); + this.versionLabel.TabIndex = 3; + this.versionLabel.Text = "Version"; + // + // PrinterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.versionTextBox); + this.Controls.Add(this.versionLabel); + this.Controls.Add(this.orientationComboBox); + this.Controls.Add(this.orientationLabel); + this.Controls.Add(this.supressPrintingCheckBox); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "PrinterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.PrinterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.ComboBox orientationComboBox; + private System.Windows.Forms.Label orientationLabel; + private System.Windows.Forms.CheckBox supressPrintingCheckBox; + private System.Windows.Forms.TextBox versionTextBox; + private System.Windows.Forms.Label versionLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Munich/PrinterCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Munich/PrinterCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Munich/PrinterCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Munich/PrinterFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Munich/PrinterFactory.cs new file mode 100644 index 00000000..312d39fe --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/ResultsPrinters/Munich/PrinterFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.ResultsPrinters.Munich +{ + public class PrinterFactory : IComponentFactory + { + public string ClassName { get { return "ResultsPrinter4Munich"; } } + + public void ResetStaticProperties() { Printer.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Printer(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Printer(cfg); } + + public IComponentCfg DefaultConfig() { return new PrinterCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(PrinterCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Sequences/DeferredTestEvaluationData.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Sequences/DeferredTestEvaluationData.cs new file mode 100644 index 00000000..fc29d96d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Sequences/DeferredTestEvaluationData.cs @@ -0,0 +1,17 @@ + +namespace TBF.BenchControl.Sequences +{ + public class DeferredTestEvaluationData + { + public Config.Entities.Test Test; + public int RepetNr; + public object IntermediateData; + + public DeferredTestEvaluationData(Config.Entities.Test test, int repetNr, object intermediateData) + { + this.Test = test; + this.RepetNr = repetNr; + this.IntermediateData = intermediateData; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Sequences/MainSeq.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Sequences/MainSeq.cs new file mode 100644 index 00000000..6a93df29 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Sequences/MainSeq.cs @@ -0,0 +1,1654 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Diagnostics; +using log4net; +using NHibernate; +using Config; +using Config.Entities; +using Results.Entities; +using TBF.UiBridge; +using TBF.BenchControl.Operations; +using TBF.BenchControl.GenericDevices; +using TBF.Boxes; +using TBF.Resources; + +namespace TBF.BenchControl.Sequences +{ + public class MainSeq : SequenceBase + { + private static readonly ILog log = LogManager.GetLogger(typeof(MainSeq)); + + public override string ToString() { return "Sequences.MainSeq"; } + + + bool benchFilled; + + int simultWithPurgingCount; + Generic.IComponentCfg simultWithPurgingCfg; + IList simultWithPurgingTests; + IList simultWithPurgingParams; + + int simultWithEvacuationCount; + Generic.IComponentCfg simultWithEvacuationCfg; + IList simultWithEvacuationTests; + IList simultWithEvacuationParams; + + System.Windows.Forms.Form modelessDlg; + /// + delegate void iPerlCommFormDlgt(MainSeq myRef, Generic.IComponentCfg cfg, IList tests, IList multiTestParams); + /// + void OpenIPerlCommForm(MainSeq myRef, Generic.IComponentCfg cfg, IList tests, IList multiTestParams) + { + try + { + ///// 1nd argument + //TestMethods.iPerlCommunication.TestMethodCfg iPerlCfg = cfg as TestMethods.iPerlCommunication.TestMethodCfg; + + ///// 2rd argument: as is + + ///// 3th argument + //IList iPerlCommParams = new List(); + //foreach (var tp in multiTestParams) iPerlCommParams.Add(tp as TestMethods.iPerlCommunication.iPerlCommunicationParams); + + //myRef.modelessDlg = new TestMethods.iPerlCommunication.iPerlCommunicationForm(iPerlCfg, tests, iPerlCommParams); + //myRef.modelessDlg.Show(); + } + catch (Exception e) + { + log.FatalFormat("---------------( MainSeq : OpenIperlCommForm crashed !!! )---------------"); + log.FatalFormat("Message : {0}", e.Message); + if (e.InnerException != null) + { + log.FatalFormat("InnerMessage : {0}", e.InnerException.Message); + } + log.FatalFormat("StackTrace : {0}{1}", Environment.NewLine, e.StackTrace); + log.Fatal("--------------------------------------"); + } + } + /// + void CloseIPerlCommForm() + { + UiBridge.Bridge.OnCloseModelessForm(this, null); + modelessDlg = null; + } + + + + /// Constructor + public MainSeq() + { + benchFilled = false; + + simultWithPurgingCount = 0; + simultWithPurgingCfg = null; + simultWithPurgingTests = new List(); + simultWithPurgingParams = new List(); + + simultWithEvacuationCount = 0; + simultWithEvacuationCfg = null; + simultWithEvacuationTests = new List(); + simultWithEvacuationParams = new List(); + } + + + /// + /// Main sequence + /// + /// + /// + public IList Execute(Test dummyArg) + { + /// Operations running in more then one state + checkUiOp = new CheckUIOp(true); + + IList e; + Selection selection; + string selectedTestName; + + ISession sessn = Config.FluentCommon.CreateSession(Users.Entities.DBKind.Config); + StateMachine.LoadPathsAndTransitions(sessn); // TODO: Implement as an operation so that the worker thread is not blocked + + Bridge.OnActivity(this, Strings.Starting_system); + State.Create("MainSeq : Press OK to start the system") + .AddOperation(new BenchControl.Operations.MessageBoxOp(Strings.Start_the_test_bench, System.Drawing.Color.OliveDrab)) + .EnterState(); + while (!StateMachine.WaitRunDevsRunOps().Contains(Event.OK)); + + State.Create("MainSeq : Setting valves to default positions") + .AddOperation(StateMachine.ControlBoard.SetValvesOp(StateMachine.DefaultValvesOpen, StateMachine.DefaultValvesClose)) + .EnterState(); + while (StateMachine.WaitRunDevsRunOps().Contains(Event.ValvesBusy)); + + + /// + /// Read S/N-s from scales (cannot be stopped, but is limitted to Scales count x 3s (=timeout) + /// + IScale[] scales = new IScale[] { StateMachine.Scale1, StateMachine.Scale2, StateMachine.Scale3 }; + + foreach (var scale in scales) + { + if (scale != null) + { + string sn = string.Empty; + IOperation getSNOp = scale.GetSerNumOp(ref sn); + + if (getSNOp != null) + { + const int nrRetries = 3; + + for (int i = 1; i <= nrRetries; i++) + { + bool error = false; + bool timeout = false; + + State.Create(string.Format("MainSeq : Reading S/N of scale {0} trial {1}", scale.Name, i)) + .AddOperation(getSNOp) + .AddOperation(new Operations.TimerOp(2)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) + { + if (i == nrRetries) + { + Bridge.OnError(this, string.Format("{0} : {1}", scale.Name, Strings.Scale_communication_error)); + goto error; + } + else + { + error = true; + break; + } + } + if (e.Contains(Event.Busy) && e.Contains(Event.TimerExpired)) + { + if (i == nrRetries) + { + Bridge.OnError(this, string.Format("{0} : {1}", scale.Name, Strings.Scale_communication_timeout)); + goto error; + } + else + { + timeout = true; + break; + } + } + } + while (e.Contains(Event.Busy)); + + if (!error && !timeout) + { + /// Successful + if (!string.IsNullOrEmpty(sn)) log.WarnFormat("Scale {0} : s/n = {1}", scale.Name, sn); + break; + } + + State.Create(string.Format("MainSeq : Reading S/N of scale {0}", scale.Name)).EnterState(); + StateMachine.WaitRunDevsRunOps(); + } + } + } + } + + /// + /// Drain tanks for the first time, use defined drain times + /// + Bridge.Bench2UI(((StateMachine.DrainValve1 != null) ? ButtonsEtc.DrainTankBtn1Hi : 0) | + ((StateMachine.DrainValve2 != null) ? ButtonsEtc.DrainTankBtn2Hi : 0) | + ((StateMachine.DrainValve3 != null) ? ButtonsEtc.DrainTankBtn3Hi : 0)); + + IntBox remainingTime = new IntBox(); + State startNew = State.Create("MainSeq : Drain tanks") + .AddOperation(checkUiOp); + IList allDrainValves = new List(); + if (StateMachine.DrainValve1 != null) allDrainValves.Add(StateMachine.DrainValve1); + if (StateMachine.DrainValve2 != null) allDrainValves.Add(StateMachine.DrainValve2); + if (StateMachine.DrainValve3 != null) allDrainValves.Add(StateMachine.DrainValve3); + + // Determine the tank emptying time (the maximum for all balances) + int scaleDrainTime = 0; + if (StateMachine.Scale1 != null && StateMachine.Scale1.EmptyTimeSec > scaleDrainTime) + { + scaleDrainTime = StateMachine.Scale1.EmptyTimeSec; + } + if (StateMachine.Scale2 != null && StateMachine.Scale2.EmptyTimeSec > scaleDrainTime) + { + scaleDrainTime = StateMachine.Scale2.EmptyTimeSec; + } + if (StateMachine.Scale3 != null && StateMachine.Scale3.EmptyTimeSec > scaleDrainTime) + { + scaleDrainTime = StateMachine.Scale3.EmptyTimeSec; + } + if (scaleDrainTime > 0) + { + startNew.AddOperation(new TimerOp(scaleDrainTime, remainingTime)) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(allDrainValves, null)); + } + + startNew.EnterState(); + do + { + Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", Strings.Emptying_tank, remainingTime.Val / 60, "min", remainingTime.Val % 60, Strings.sec)); + + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) goto error; + bool stopDrainingCmd = e.Contains(Event.UiCmdStopDrainingTank1) || e.Contains(Event.UiCmdStopDrainingTank2) || e.Contains(Event.UiCmdStopDrainingTank3); + if (stopDrainingCmd && !e.Contains(Event.ValvesBusy) && !e.Contains(Event.CameraBusy)) + { + goto stop_draining; + } + } + while (e.Contains(Event.TimerBusy) || + e.Contains(Event.CameraBusy) || + e.Contains(Event.ValvesBusy)); + + Bridge.OnActivity(this, Strings.Emptying_tank); + + stop_draining: + + State stopDraining = State.Create("MainSeq : Stop draining water tanks") + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(null, allDrainValves)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) goto error; + } + while (e.Contains(Event.ValvesBusy)); + + //-------------------------------------------------------------------------------------------- + Bridge.OnActivity(this, Strings.Resetting_scales); + //-------------------------------------------------------------------------------------------- + Bridge.Bench2UI(ButtonsEtc.StopBtnEn); + + DoubleBox tara1 = new DoubleBox(0); + DoubleBox tara2 = new DoubleBox(0); + DoubleBox tara3 = new DoubleBox(0); + State.Create("MainSeq : Reset scales").AddOperation(checkUiOp) + .AddOperation((StateMachine.Scale1 != null) ? StateMachine.Scale1.TaringOp(ref tara1) : null) + .AddOperation((StateMachine.Scale2 != null) ? StateMachine.Scale2.TaringOp(ref tara2) : null) + .AddOperation((StateMachine.Scale3 != null) ? StateMachine.Scale3.TaringOp(ref tara3) : null) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) goto error; + if (e.Contains(Event.UiCmdStop)) goto stop; + } + while (e.Contains(Event.Busy)); + + //-------------------------------------------------------------------------------------------- + Bridge.OnActivity(this, Strings.Measuring_the_weight); + State.Create("MainSeq : Mesuring the weight for the 1st time") + .AddOperation(checkUiOp) + .AddOperation(new MettlerToledo.ReadMassesOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) goto error; + if (e.Contains(Event.UiCmdStop)) goto stop; + } + while (!e.Contains(Event.BalanceDone)); + + //-------------------------------------------------------------------------------------------- + select_procedure: + + CloseBeginForm(); /// Make sure the CycleBeginForm is closed (after an abnormal end, etc.) + + do + { + selection = MakeSelection(MKSelContext.ProcedureNotSelected); + switch (selection) + { + case Selection.Q1: selectedTestName = "Q1"; break; + case Selection.Q2: selectedTestName = "Q2"; break; + case Selection.Q3: selectedTestName = "Q3"; break; + default: selectedTestName = Bridge.SelectedTestName; break; + } + + try + { + using (ISession localSession = Config.FluentCommon.CreateSession(Users.Entities.DBKind.Config)) + { + StateMachine.LoadPathsAndTransitions(localSession); + } + + /// + /// Try to load all parameters for the selected procedure from databases as specifie in BenchInfo + /// + if ((Bridge.SelectedProcedure != null) && !string.IsNullOrEmpty(Bridge.SelectedProcedure.Name)) + { + /// TODO: Repeate twice for Users.Entities.DBKind.Config and Users.Entities.DBKind.RemoteConfig + using (ISession remoteOrLocalSession = Config.FluentCommon.CreateSession(Bridge.SelectedProcedure.DBKind)) + { + StateMachine.LoadProcedure(remoteOrLocalSession, Bridge.SelectedProcedure.Name); + StateMachine.LoadProcedureParams(StateMachine.Procedure); + + /// This is to load Procedure.Tests and tets.MoreParams for each test + int a = 0; + foreach (var test in StateMachine.Procedure.Tests) a += test.MoreParams.Count; + } + } + else + { + StateMachine.Procedure = null; + } + } + catch (Exception) + { + StateMachine.Procedure = null; + } + } + while (StateMachine.Procedure == null); /// Make sure a valid procedure is selected + + Debug.WriteLine(string.Empty); + Debug.WriteLine(string.Format("TransitionSequences {0}", NHibernateUtil.IsInitialized(StateMachine.TransitionSequences) ? "initialized" : "NOT initialized")); + Debug.WriteLine(string.Format("TransitionSteps {0}", NHibernateUtil.IsInitialized(StateMachine.TransitionSteps) ? "initialized" : "NOT initialized")); + Debug.WriteLine(string.Format("Procedure {0}", NHibernateUtil.IsInitialized(StateMachine.Procedure) ? "initialized" : "NOT initialized")); + Debug.WriteLine(string.Format("Procedure.MoreParams {0}", NHibernateUtil.IsInitialized(StateMachine.Procedure.MoreParams) ? "initialized" : "NOT initialized")); + Debug.WriteLine(string.Format("Procedure.Tests {0}", NHibernateUtil.IsInitialized(StateMachine.Procedure.Tests) ? "initialized" : "NOT initialized")); + Debug.WriteLine(string.Format("Procedure.Tests[0].MoreParams {0}", NHibernateUtil.IsInitialized(StateMachine.Procedure.Tests[0].MoreParams) ? "initialized" : "NOT initialized")); + + UiBridge.Bridge.OnError(this, string.Empty); /// Clear an error message (if any) + + /// + /// Procedure selected at this point, a new batch was started + /// + StateMachine.ControlBoard.ManualUIAllowed = !StateMachine.Procedure.ManualCtrlDisabled; + + Bridge.Bench2UI(ButtonsEtc.StopBtnEn); /// Enable STOP button + + + Program.LocalSettings.BatchNr++; + Program.LocalSettings.Save(); + + int newBatchNr = Program.LocalSettings.BatchNr; + log.FatalFormat("New measurement session started: batch = {0}, procedure = {1}", newBatchNr, StateMachine.Procedure.Name); + + /// + /// Clear iperlhead data (including PCB Number, avoid double use) + /// + foreach (var cmpnt in StateMachine.Components) + { + if (cmpnt is TestMethods.iPerlCommunication.iPerlHead.IperlHead) + { + (cmpnt as TestMethods.iPerlCommunication.iPerlHead.IperlHead).ClearData(); + } + } + + if (selection == Selection.RestoreBatch) + { + BatchRslts = CreateNewBatchResults(newBatchNr, StateMachine.Procedure); + RestoreBatchResults(TBF.UiBridge.Bridge.BatchNr, ref BatchRslts); /// pass the original batch number of the batch to be restored + } + else if (selection == Selection.Custom) + { + for (int i = StateMachine.Procedure.Tests.Count - 1; i >= 0; i--) + { + if (StateMachine.Procedure.Tests[i].Name.ToLower().Contains("write") || + StateMachine.Procedure.Tests[i].Name.ToLower().Contains("reset")) + { + StateMachine.Procedure.Tests.RemoveAt(i); + } + } + + BatchRslts = CreateNewBatchResults(newBatchNr, StateMachine.Procedure); + + for (int i = StateMachine.Procedure.Tests.Count - 1; i >= 0; i--) + { + if (StateMachine.Procedure.Tests[i].Name.ToLower().Contains("adj")) + { + StateMachine.Procedure.Tests.RemoveAt(i); + } + } + } + else + { + BatchRslts = CreateNewBatchResults(newBatchNr, StateMachine.Procedure); + } + + + StateMachine.CycleStartTimeStamp = BatchRslts.Batch.StartTime; + + + Bridge.OnProcedureSelected(this, new ProcedureSelectedEventArgs(StateMachine.Procedure)); + + /// + /// Display 'Cycle Begin Form' in case of a normal batch (not a restored batch) + /// + if (selection != Selection.RestoreBatch && selection != Selection.Custom) + { + if (OpenCycleBeginForm()) goto stop; + } + + /// Find purge suquences + TransitionSequence purgeBegin = null; + TransitionSequence purgeEnd = null; + foreach (var transition in StateMachine.TransitionSequences) + { + if (transition.Name == StateMachine.Procedure.TransitionStart) purgeBegin = transition; + if (transition.Name == StateMachine.Procedure.TransitionEnd) purgeEnd = transition; + } + + + if (selection == Selection.Q1 || selection == Selection.Q2 || + selection == Selection.Q3 || selection == Selection.Test) + { + goto assume_bench_filled; + } + else if ((selection == Selection.Cycle && benchFilled) || (selection == Selection.RestoreBatch)) + { + /// + /// Always ask a question in case of a restored batch + /// + State.Create("MainSeq : Answer a question") + .AddOperation(new Operations.AskYesNoOp(Strings.Fill_with_water)) + .AddOperation(checkUiOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.No)) goto assume_bench_filled; + if (e.Contains(Event.UiCmdStop)) goto select_procedure; + } + while (!e.Contains(Event.Yes)); + } + + fill_the_bench: + + CollectSimultSteps(); + /// + if (simultWithPurgingCount > 0) + { + /// Make sure the entry form is closed + if (UIFlowControl.Stop == WaitBeginFormClosed()) goto stop; + + /// Open iPerlCommunicationForm + ProcessData.RegisterReaders = StateMachine.GetMetersPath(simultWithPurgingTests[0]).RegisterReaders; + Program.MainWnd.Invoke(new iPerlCommFormDlgt(OpenIPerlCommForm), new object[] { this, simultWithPurgingCfg, simultWithPurgingTests, simultWithPurgingParams }); + } + + /// + /// Purging @ cycle start + /// + Event evt = Transition(purgeBegin, TransitionContext.PurgeBegin); + /// + switch (evt) + { + case Event.Error: + if (simultWithPurgingCount > 0) CloseIPerlCommForm(); + goto error; + case Event.UiCmdStop: + if (simultWithPurgingCount > 0) CloseIPerlCommForm(); + goto stop; + default: + break; + } + + if (simultWithPurgingCount > 0) + { + /// + /// Wait until iPerl communications are completed + /// + bool completed = !(modelessDlg is GenericDevices.IHasCompleted) + || (modelessDlg as GenericDevices.IHasCompleted).Completed; + if (!completed) + { + State.Create("MainSeq : Wait until the entry form is closed") + .AddOperation(checkUiOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.UiCmdStop)) + { + CloseIPerlCommForm(); + goto stop; + } + + completed = (modelessDlg as GenericDevices.IHasCompleted).Completed; + } + while (!completed); + } + + modelessDlg = null; + + if (selection == Selection.Custom) + { + /// Load existing data from databases + Results.DBase.Databases.Clear(); + try { Results.DBase.Databases.Add(new Results.DBase("SERVER=10.42.128.197; DATABASE=st-wr10-r; UID=vysledky; PASSWORD=GAqx76QUB6NbnpZP; CHARSET=utf8;", "WR10")); } + catch (Exception exc) { log.ErrorFormat("Cannot open WR10 result database: {0}", exc.Message); } + try { Results.DBase.Databases.Add(new Results.DBase("SERVER=10.42.128.98; DATABASE=st-wr11-r; UID=vysledky; PASSWORD=GAqx76QUB6NbnpZP; CHARSET=utf8;", "WR11")); } + catch (Exception exc) { log.ErrorFormat("Cannot open WR11 result database: {0}", exc.Message); } + try { Results.DBase.Databases.Add(new Results.DBase("SERVER=10.42.128.152; DATABASE=st-wr13-r; UID=vysledky; PASSWORD=GAqx76QUB6NbnpZP; CHARSET=utf8;", "WR13")); } + catch (Exception exc) { log.ErrorFormat("Cannot open WR13 result database: {0}", exc.Message); } + try { Results.DBase.Databases.Add(new Results.DBase("SERVER=10.42.128.63; DATABASE=st-wr15-r; UID=vysledky; PASSWORD=GAqx76QUB6NbnpZP; CHARSET=utf8;", "WR15")); } + catch (Exception exc) { log.ErrorFormat("Cannot open WR15 result database: {0}", exc.Message); } + + for (int i = 0; i < BatchRslts.WaterMeters.Length; i++) + { + WaterMeter newWM = BatchRslts.WaterMeters[i]; + for (int j = 0; j < Results.DBase.Count; j++) + { + NHibernate.ISession sesn = Results.DBase.Databases[j].OpenSession(); + + IList watermeters = sesn.QueryOver().Where(x => (x.SerialNr == newWM.SerialNr)).List(); + if (watermeters.Count > 0) + { + BatchRslts.WaterMeters[i].CopyContentFrom(watermeters[watermeters.Count - 1]); /// Copy results from the last occurance of the watermeter + } + } + } + } + } + + + assume_bench_filled: + + benchFilled = true; + Bridge.Bench2UI(ButtonsEtc.ShowBenchFilled); + + if (selection != Selection.PurgeBegin && selection != Selection.RestoreBatch && selection != Selection.Custom) + { + goto cycle_or_test_selected; + } + + select_cycle_or_test: + + //---------------------------------------------------------- + selection = MakeSelection(MKSelContext.InsideProcedure); + switch (selection) + { + case Selection.Q1: selectedTestName = "Q1"; break; + case Selection.Q2: selectedTestName = "Q2"; break; + case Selection.Q3: selectedTestName = "Q3"; break; + default: selectedTestName = Bridge.SelectedTestName; break; + } + /// + UiBridge.Bridge.OnError(this, string.Empty); /// Clear an error message (if any) + /// + if (selection == Selection.PurgeBegin) goto fill_the_bench; + if (selection == Selection.PurgeEnd) + { + switch (DoEvacuation(purgeEnd)) + { + case Event.Error: goto error; + case Event.UiCmdStop: goto stop; + default: goto select_cycle_or_test; + } + } + if (selection == Selection.Break) + { + StateMachine.ControlBoard.ManualUIAllowed = true; + Bridge.Bench2UI(ButtonsEtc.ShowBenchEmpty); + Bridge.OnProcedureCompleted(this, new ProcedureCompletedEventArgs(StateMachine.Procedure)); + goto select_procedure; + } + if (selection == Selection.SaveResults) goto save_results; + + cycle_or_test_selected: + + UiBridge.Bridge.OnError(this, string.Empty); /// Clear an error message (if any) + + if (UIFlowControl.Stop == WaitBeginFormClosed()) + { + goto stop_within_cycle; /// Make sure the entry form is closed + } + + Bridge.Bench2UI(ButtonsEtc.StopBtnEn); /// Hide buttons + + if (selection != Selection.Cycle) + { + //-------------------------------- + State.Create("MainSeq : Continue in the cycle?") + .AddOperation(new Operations.AskYesNoOp(Strings.Continue_in_the_cycle)) + .AddOperation(checkUiOp) + .EnterState(); + while (true) + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Yes)) + { + selection = Selection.RestOfCycle; + break; + } + if (e.Contains(Event.No)) break; + if (e.Contains(Event.UiCmdStop)) goto select_procedure; + } + } + + ///------------------------------------------------------------------------------------------------------------ + if (selection == Selection.Cycle || selection == Selection.RestOfCycle) + { + IList deferredData = new List(); + + int selsctedTestIx = simultWithPurgingCount; /// Applies when selection == Selection.Cycle + int repetNr = 1; + /// + if (selection == Selection.RestOfCycle) /// ... otherwise + { + Test slctdTest = TBF.BenchControl.StateMachine.GetTest(selectedTestName, out repetNr); + if (slctdTest == null) + { + UiBridge.Bridge.OnError(this, string.Format("No test specified")); + goto select_cycle_or_test; + } + + selsctedTestIx = -1; + for (int i = simultWithPurgingCount; i < StateMachine.Tests.Count - simultWithEvacuationCount; i++) + { + if (slctdTest == StateMachine.Tests[i]) + { + selsctedTestIx = i; + break; + } + } + if (selsctedTestIx == -1) goto select_cycle_or_test; /// goto ... when selection is not valid + } + + + float TimeEstimateTotal = 0; /// Time estimate of the selected cycle or test + + for (int i = selsctedTestIx; i < StateMachine.Tests.Count - simultWithEvacuationCount; i++) + { + Test test = StateMachine.Tests[i]; + + TimeEstimateTotal += (test.Repeats * (test.TstTime + 10.0f)); + + /// Try to fetch all test paths and transitions + /// to detect configuration errors as early as possible. + string errorMsg; + TBF.BenchControl.Generic.IComponent testMethodComp = TbfComponents.FindComponent(test.Method); + if (!(testMethodComp is TBF.BenchControl.TestMethods.OuterLoop.Start.Component) && + !(testMethodComp is TBF.BenchControl.TestMethods.OuterLoop.End.Component) && + !StateMachine.GetPaths(test, (StateMachine.Procedure.MetersKind == MetersKind.HeatMeter), + out inPath, out benchPath, out outPath, out sensPath, + out heatMetersPath, + out transitionBefore, out transitionAfter, + out errorMsg)) + { + UiBridge.Bridge.OnError(this, errorMsg); + goto select_cycle_or_test; + } + } + + int currentTestIx = selsctedTestIx; + bool isOuterLoopMode = false; + int outerLoopStartIx = -1; /// This is to identify program errors + int outerLoopRepeats = 0; + while (currentTestIx < StateMachine.Tests.Count - simultWithEvacuationCount) + { + Test test = StateMachine.Tests[currentTestIx]; + Test nextTest = (currentTestIx + 1 < StateMachine.Tests.Count - simultWithEvacuationCount) + ? StateMachine.Tests[currentTestIx + 1] + : null; + + /// Fetch the test paths and transitions + string errorMsg; + TBF.BenchControl.Generic.IComponent testMethodComp = TbfComponents.FindComponent(test.Method); + if (!(testMethodComp is TBF.BenchControl.TestMethods.OuterLoop.Start.Component) && + !(testMethodComp is TBF.BenchControl.TestMethods.OuterLoop.End.Component) && + !StateMachine.GetPaths(test, (StateMachine.Procedure.MetersKind == MetersKind.HeatMeter), + out inPath, out benchPath, out outPath, out sensPath, + out heatMetersPath, + out transitionBefore, out transitionAfter, + out errorMsg)) + { + UiBridge.Bridge.OnError(this, errorMsg); + goto select_cycle_or_test; + } + + /// Update format for the water mass + Mass.Format = outPath.Scale.Format; + StartMass.Format = outPath.Scale.Format; + EndMass.Format = outPath.Scale.Format; + + + ITestMethod testMethod = testMethodComp as ITestMethod; + if (testMethod != null && testMethod.CanTest(StateMachine.Procedure.MetersKind)) + { + StateMachine.LoadTestParams(test); + ProcessData.RegisterReaders = sensPath.RegisterReaders; + if (isOuterLoopMode && outerLoopRepeats != test.Repeats && !(testMethod is TestMethods.OuterLoop.End.Component)) + { + goto config_error; + } + + foreach (var rr in sensPath.RegisterReaders) + { + if ((rr is TestMethods.iPerlCommunication.iPerlHead.IperlHead) && (BenchInfo != null)) + { + (rr as TestMethods.iPerlCommunication.iPerlHead.IperlHead).BenchName = BenchInfo.TestBenchName; + } + } + + /// + /// Execute one test (single repetition of a repeated test) + /// Previously: + /// e = testMethod.Execute(test, outerLoopMode, (outerLoopMode ? outerLoopCounter: repetNr)); + /// + Event rsltTransBefore = Event.Done; + Event rsltTransAfter = Event.Done; + { + int timeEstTransBefore = testMethod.DoTransitions() ? GetTransitionTimeEst(transitionBefore) : 1; + int timeEstTransAfter = testMethod.DoTransitions() ? GetTransitionTimeEst(transitionAfter) : 1; + + TestProgressEventArgs.SetEstimatedTimes(new int[] { 1, timeEstTransBefore, 1, 30, 0, Convert.ToInt32(test.TstTime) + 15, timeEstTransAfter, 0 }); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetNr, Config.Entities.Progress.JustStarted)); + + if (testMethod.DoTransitions()) + { + rsltTransBefore = Transition(transitionBefore, TransitionContext.BeforeTest); /// Transition or SetRoute - start of test + log.InfoFormat("Test {0}: Transition({1}, BeforeTest) returned {2}", test.Name, (transitionBefore == null ? "null" : transitionBefore.Name), rsltTransBefore); + } + + bool currentTestFinished = true; + if (rsltTransBefore == Event.Done) + { + do + { + log.InfoFormat("Test {0}: Execute(., {1}, {2})", test.Name, repetNr, isOuterLoopMode || repetNr == test.Repeats); + e = testMethod.Execute(test, repetNr, isOuterLoopMode || repetNr == test.Repeats); + + if (e.Contains(Event.MakeSecondPass) && testMethod is ITestMethodWith2ndPass) + { + deferredData.Add(new DeferredTestEvaluationData(test, repetNr, (testMethod as ITestMethodWith2ndPass).IntermediateData)); + } + + currentTestFinished = (rsltTransBefore == Event.Done && !e.Contains(Event.Error) + && !e.Contains(Event.ConfigurationError) + && !e.Contains(Event.OpArgumentError) + && !e.Contains(Event.UiCmdStop)); + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetNr, currentTestFinished ? Config.Entities.Progress.Completed + : Config.Entities.Progress.Aborted)); + + if (e.Contains(Event.OuterLoopStart)) break; /// Do not repeat OuterLoopStart test in this loop + if (currentTestFinished && !isOuterLoopMode) repetNr++; + } + while (currentTestFinished && !isOuterLoopMode && repetNr <= test.Repeats); + + if (currentTestFinished && !isOuterLoopMode && repetNr > test.Repeats) repetNr = 1; /// Reset repetNr + } + + if (testMethod.DoTransitions()) + { + TransitionContext endContext = currentTestFinished ? TransitionContext.AfterTest : TransitionContext.Stop; + rsltTransAfter = Transition(transitionAfter, endContext); /// Transition or SetRoute - end of test + log.InfoFormat("Test {0}: Transition({1}, {2}) returned {3}", test.Name, (transitionAfter == null ? "null" : transitionAfter.Name), endContext, rsltTransAfter); + } + } + + if (rsltTransBefore == Event.Error || e.Contains(Event.Error)) + { + isOuterLoopMode = false; + goto error; + } + else if (e.Contains(Event.ConfigurationError)) + { + isOuterLoopMode = false; + goto select_cycle_or_test; /// OR goto config_error; ??? + } + else if (e.Contains(Event.OpArgumentError)) + { + isOuterLoopMode = false; + goto config_error; + } + else if (rsltTransBefore == Event.UiCmdStop || e.Contains(Event.UiCmdStop)) + { + isOuterLoopMode = false; + goto stop_within_cycle; + } + else if (e.Contains(Event.OuterLoopStart)) + { + if (isOuterLoopMode) + { + goto config_error; + } + + isOuterLoopMode = true; + outerLoopRepeats = (nextTest != null) ? nextTest.Repeats : 1; + repetNr = 1; + outerLoopStartIx = currentTestIx; + } + else if (e.Contains(Event.OuterLoopEnd)) + { + if (!isOuterLoopMode) + { + goto config_error; + } + else if (++repetNr <= outerLoopRepeats) + { + currentTestIx = outerLoopStartIx; + } + else + { + isOuterLoopMode = false; + repetNr = 1; /// Reset repetNr + } + } + } + else + { + UiBridge.Bridge.OnError(this, string.Format(Strings.Method_0_cannot_be_used, test.Method)); + goto select_cycle_or_test; + } + + currentTestIx++; + } + + /// + /// Execute deferred evaluations of tests that returned 'Event.MakeSecondPass' here + /// + foreach (var dfrrdData in deferredData) + { + string errorMsg; + StateMachine.GetPaths(dfrrdData.Test, (StateMachine.Procedure.MetersKind == MetersKind.HeatMeter), + out inPath, out benchPath, out outPath, out sensPath, + out heatMetersPath, + out transitionBefore, out transitionAfter, + out errorMsg); + + ITestMethodWith2ndPass testMethod = TbfComponents.FindComponent(dfrrdData.Test.Method) as ITestMethodWith2ndPass; + + if (testMethod != null && testMethod.CanTest(StateMachine.Procedure.MetersKind)) + { + StateMachine.LoadTestParams(dfrrdData.Test); + ProcessData.RegisterReaders = sensPath.RegisterReaders; + + foreach (var rr in sensPath.RegisterReaders) + { + if ((rr is TestMethods.iPerlCommunication.iPerlHead.IperlHead) && (BenchInfo != null)) + { + (rr as TestMethods.iPerlCommunication.iPerlHead.IperlHead).BenchName = BenchInfo.TestBenchName; + } + } + + e = testMethod.Execute2ndPass(dfrrdData.Test, dfrrdData.RepetNr, dfrrdData.IntermediateData); + + if (e.Contains(Event.Error)) goto error; + else if (e.Contains(Event.OpArgumentError)) goto config_error; + else if (e.Contains(Event.UiCmdStop)) goto stop_within_cycle; + } + } + + deferredData.Clear(); + } + ///------------------------------------------------------------------------------------------------------------ + else /// if (selection == Selection.Test or Q1 or Q2 or Q3) + { + int repetNr; + Test test = TBF.BenchControl.StateMachine.GetTest(selectedTestName, out repetNr); + if (test == null) + { + UiBridge.Bridge.OnError(this, string.Format("No test specified")); + goto select_cycle_or_test; + } + + /// Fetch the test paths and transitions + string errorMsg; + TBF.BenchControl.Generic.IComponent testMethodComp = TbfComponents.FindComponent(test.Method); + if (!(testMethodComp is TBF.BenchControl.TestMethods.OuterLoop.Start.Component) && + !(testMethodComp is TBF.BenchControl.TestMethods.OuterLoop.End.Component) && + !StateMachine.GetPaths(test, (StateMachine.Procedure.MetersKind == MetersKind.HeatMeter), + out inPath, out benchPath, out outPath, out sensPath, + out heatMetersPath, + out transitionBefore, out transitionAfter, + out errorMsg)) + { + UiBridge.Bridge.OnError(this, errorMsg); + goto select_cycle_or_test; + } + + /// Update format for the water mass + Mass.Format = (outPath != null || outPath.Scale != null) ? outPath.Scale.Format : "F3"; + StartMass.Format = (outPath != null || outPath.Scale != null) ? outPath.Scale.Format : "F3"; + EndMass.Format = (outPath != null || outPath.Scale != null) ? outPath.Scale.Format : "F3"; + + ITestMethod testMethod = TbfComponents.FindComponent(test.Method) as ITestMethod; + if (testMethod != null && testMethod.CanTest(StateMachine.Procedure.MetersKind)) + { + StateMachine.LoadTestParams(test); + ProcessData.RegisterReaders = sensPath.RegisterReaders; + + foreach (var rr in sensPath.RegisterReaders) + { + if ((rr is TestMethods.iPerlCommunication.iPerlHead.IperlHead) && (BenchInfo != null)) + { + (rr as TestMethods.iPerlCommunication.iPerlHead.IperlHead).BenchName = BenchInfo.TestBenchName; + } + } + + Event rsltTransBefore = Event.Done; + Event rsltTransAfter = Event.Done; + { + int timeEstTransBefore = testMethod.DoTransitions() ? GetTransitionTimeEst(transitionBefore) : 1; + int timeEstTransAfter = testMethod.DoTransitions() ? GetTransitionTimeEst(transitionAfter) : 1; + + TestProgressEventArgs.SetEstimatedTimes(new int[] { 1, timeEstTransBefore, 1, 30, 0, Convert.ToInt32(test.TstTime) + 15, timeEstTransAfter, 0 }); + /// start, transition, flow detection, flow setting, aborted, test, transition, end + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetNr, Config.Entities.Progress.JustStarted)); + + if (testMethod.DoTransitions()) + { + rsltTransBefore = Transition(transitionBefore, TransitionContext.BeforeTest); /// Transition or SetRoute - start of test + } + + if (rsltTransBefore == Event.Done) + { + e = testMethod.Execute(test, repetNr, true); + + if (e.Contains(Event.MakeSecondPass) && testMethod is ITestMethodWith2ndPass) + { + ITestMethodWith2ndPass tm2 = testMethod as ITestMethodWith2ndPass; + e = tm2.Execute2ndPass(test, repetNr, tm2.IntermediateData); + } + } + + bool testFinished = (rsltTransBefore == Event.Done && !e.Contains(Event.Error) + && !e.Contains(Event.ConfigurationError) + && !e.Contains(Event.OpArgumentError) + && !e.Contains(Event.UiCmdStop)); + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetNr, testFinished ? Config.Entities.Progress.Completed + : Config.Entities.Progress.Aborted)); + + if (testMethod.DoTransitions()) + { + TransitionContext endContext = testFinished ? TransitionContext.AfterTest : TransitionContext.Stop; + rsltTransAfter = Transition(transitionAfter, endContext); /// Transition or SetRoute - end of test + } + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetNr, testFinished ? Config.Entities.Progress.Completed + : Config.Entities.Progress.Aborted)); + } + + if (rsltTransBefore == Event.Error || e.Contains(Event.Error)) goto error; + if (e.Contains(Event.ConfigurationError)) goto config_error; + if (e.Contains(Event.OpArgumentError)) goto config_error; + if (rsltTransBefore == Event.UiCmdStop || e.Contains(Event.UiCmdStop)) goto stop_within_cycle; + } + else + { + UiBridge.Bridge.OnError(this, string.Format("{0} cannot be used", test.Method)); + goto select_cycle_or_test; + } + } + ///------------------------------------------------------------------------------------------------------------ + + goto select_cycle_or_test; + + + save_results: + + UiBridge.Bridge.OnError(this, string.Empty); /// Clear an error message (if any) + Bridge.Bench2UI(ButtonsEtc.StopBtnEn); /// Hide most of buttons + + if (State.LastEvents.Contains(Event.ModelessFormIsOpen)) + { + if (UIFlowControl.Stop == WaitBeginFormClosed()) goto stop; + } + else if (State.LastEvents.Contains(Event.ModelessFormClosed)) + { + CloseBeginForm(); + } + + Bridge.OnActivity(this, Strings.Enter_protocol_data); + + //-------------------------------- + GenericDevices.IDataEntry dataEntryCmpnt = TbfComponents.FindComponent(StateMachine.Procedure.DataEntry) as GenericDevices.IDataEntry; + if (dataEntryCmpnt != null) + { + if (dataEntryCmpnt is IHasCycleEndForm) + { + /// Open the modeless form for the end of the cycle + State.Create("MainSeq : Enter end data") + .AddOperation((dataEntryCmpnt as GenericDevices.IHasCycleEndForm).ShowCycleEndFormOp()) + .AddOperation(checkUiOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.UiCmdStop)) goto stop; + } + while (!e.Contains(Event.ModelessFormClosed)); + } + + dataEntryCmpnt.UpdateTestResults(BatchRslts); + } + + ProcessData.BatchRslts.Batch.EndTime = DateTime.Now; + ProcessData.BatchRslts.AddWaterMetersToBatch(); + + //------------------------------------------------------ + Bridge.OnActivity(this, Strings.Saving_and_printing_results); + State savingAndPrintingRslts = State.Create("MainSeq : Saving and printing results"); + + string[] writers = StateMachine.Procedure.ResultsWriter.Split(new char[] { '~' }); + foreach (var writerName in writers) + { + IResultsWriter writer = TbfComponents.FindComponent(writerName) as IResultsWriter; + if (writer != null) + { + try + { + savingAndPrintingRslts.AddOperation(writer.WriteResultsOp(ProcessData.BatchRslts.Batch)); + } + catch (Exception exc) + { + Bridge.OnError(this, string.Format(Strings.Component_0_crashed_Results_not_saved, writerName)); + log.FatalFormat("FileWriter {0} crashed: {1}", writerName, exc.Message); + } + } + } + + string[] printers = StateMachine.Procedure.ResultsPrinter.Split(new char[] { '~' }); + foreach (var printerName in printers) + { + IResultsPrinter printer = TbfComponents.FindComponent(printerName) as IResultsPrinter; + if (printer != null && !printer.SupressPrinting) + { + try + { + savingAndPrintingRslts.AddOperation(printer.PrintResultsOp(ProcessData.BatchRslts.Batch)); + } + catch (Exception exc) + { + Bridge.OnError(this, string.Format(Strings.Component_0_crashed_Results_not_printed, printerName)); + log.FatalFormat("Printer {0} crashed: {1}", printerName, exc.Message); + } + } + } + + savingAndPrintingRslts.AddOperation(checkUiOp).EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) goto error; + if (e.Contains(Event.UiCmdStop)) goto stop; + } + while (e.Contains(Event.Busy)); + + bool resultsSent = !e.Contains(Event.ResultsNotWritten); + ProcessData.BatchRslts.Batch.RsltsSent = resultsSent; + + /// + /// Save results to the built in 'Results' database + /// + Results.DB.SaveNewBatch(ProcessData.BatchRslts.Batch); + + /// + /// Save results to 'summary results' logger + /// + foreach (var tr in ProcessData.BatchRslts.Batch.TestRslts) + { + summaryResults.Info(TestResult2CsvLine(tr)); + } + + + log.FatalFormat("Measurement session saved: batch = {0}, procedure = {1}, next batch nr. = {2}", + ProcessData.BatchRslts.Batch.BatchNr, + ProcessData.BatchRslts.Batch.ProcedureName, + Program.LocalSettings.BatchNr); + + evacuation: + + /// Evacuation is similar to 'Abort session' (no results are saved), but the evacuation is done as well. + + StateMachine.ControlBoard.ManualUIAllowed = true; + + switch (DoEvacuation(purgeEnd)) + { + case Event.Error: goto error; + case Event.UiCmdStop: goto stop; + default: break; + } + + Bridge.OnProcedureCompleted(this, new ProcedureCompletedEventArgs(StateMachine.Procedure)); + + goto select_procedure; + + + stop_within_cycle: + //-------------------------------- + State.Create("MainSeq : Turning IDLE -> Closing the valves") + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(StateMachine.DefaultValvesOpen, + StateMachine.DefaultValvesClose)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) goto error; + } + while (!e.Contains(Event.ValvesSet)); + + goto select_cycle_or_test; + + stop: + //-------------------------------- + State.Create("MainSeq : Turning IDLE -> Closing the valves") + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(StateMachine.DefaultValvesOpen, + StateMachine.DefaultValvesClose)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) goto error; + } + while (!e.Contains(Event.ValvesSet)); + + goto select_procedure; + + config_error: + //-------------------------------- + State.Create("MainSeq : Procedure configuration error") + .AddOperation(checkUiOp) + .AddOperation(new Operations.MessageBoxOp("Test configration error")) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + } + while (!e.Contains(Event.OK)); + + goto select_cycle_or_test; + + error: + //-------------------------------- + State.Create("MainSeq : ERROR -> Closing the valves") + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(StateMachine.DefaultValvesOpen, + StateMachine.DefaultValvesClose)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + } + while (!e.Contains(Event.ValvesSet) && !e.Contains(Event.Error)); + + //-------------------------------- + State.Create("MainSeq : ERROR state") + .EnterState(); + while (true) StateMachine.WaitRunDevsRunOps(); + } + + + /// + /// MakeSelection() call context + /// + enum MKSelContext + { + ProcedureNotSelected, + InsideProcedure, + } + + /// + /// Return values of MakeSelection() + /// + public enum Selection + { + PurgeBegin, + PurgeEnd, + Break, + Cycle, + RestOfCycle, + Test, + Q1, + Q2, + Q3, + SaveResults, + RestoreBatch, + Shutdown, + Custom, + } + + + /// + /// Idle loop to make a procedure or test selection. + /// Handles tank emptying, camera test. + /// + /// Context where MakeSelection() is called + /// + /// Selection.PurgeBegin, PurgeEnd, Break, Cycle, Test, Q1, Q2, Q3 or SaveResults + /// + private Selection MakeSelection(MKSelContext context) + { + log.WarnFormat("MakeSelection({0})", context); + + /// Tank emptying valves states + bool draining1 = false; + bool draining2 = false; + bool draining3 = false; + + /// Measured masses to control emptying + DoubleBox mass1 = new DoubleBox(); + DoubleBox mass2 = new DoubleBox(); + DoubleBox mass3 = new DoubleBox(); + + IList e; + + while (true) + { + bool draining = draining1 || draining2 || draining3; + + /// + /// Activity message + /// + Bridge.OnActivity(this, draining ? Strings.Emptying_tank + : ((context == MKSelContext.ProcedureNotSelected) ? Strings.Please_select_a_procedure + : Strings.Please_select_a_cycle_a_test_or_empty)); + + bool saveResultsActive = (context == MKSelContext.InsideProcedure) + && (StateMachine.Procedure != null) + && (!StateMachine.Procedure.MustBeComplete || BatchRslts.AllTestsDone()); + + /// Enable appropriate UI controls and buttons + Bridge.Bench2UI(((context == MKSelContext.ProcedureNotSelected) ? ButtonsEtc.ProcedureCmbBoxEn : 0) | + ButtonsEtc.TestCmbBoxEn | + ((context == MKSelContext.InsideProcedure) ? ButtonsEtc.Break : 0) | + (saveResultsActive ? ButtonsEtc.AcceptResultsBtnEn : 0) | + (draining ? 0 : ButtonsEtc.StartCycleBtnEn) | + (draining ? 0 : ButtonsEtc.StartTestBtnsEn) | + (draining ? 0 : ButtonsEtc.PurgeBeginBtnEn) | + (draining ? 0 : ((context == MKSelContext.InsideProcedure) ? ButtonsEtc.PurgeEndBtnEn : 0)) | + ((StateMachine.DrainValve1 == null) ? 0 : (draining1 ? ButtonsEtc.DrainTankBtn1Hi : ButtonsEtc.DrainTankBtn1En)) | + ((StateMachine.DrainValve2 == null) ? 0 : (draining2 ? ButtonsEtc.DrainTankBtn2Hi : ButtonsEtc.DrainTankBtn2En)) | + ((StateMachine.DrainValve3 == null) ? 0 : (draining3 ? ButtonsEtc.DrainTankBtn3Hi : ButtonsEtc.DrainTankBtn3En))); + + + State.Create("MainSeq : Select an activity") + .AddOperation(checkUiOp) + .AddOperation((StateMachine.Scale1 != null) ? StateMachine.Scale1.ReadMassOp(ref mass1) : null) + .AddOperation((StateMachine.Scale2 != null) ? StateMachine.Scale2.ReadMassOp(ref mass2) : null) + .AddOperation((StateMachine.Scale3 != null) ? StateMachine.Scale3.ReadMassOp(ref mass3) : null) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + + /// Handled inside MakeSelection() inside the selection loop + if (e.Contains(Event.Error)) break; + if (!draining1 && e.Contains(Event.UiCmdDrainTank1)) break; + if (!draining2 && e.Contains(Event.UiCmdDrainTank2)) break; + if (!draining3 && e.Contains(Event.UiCmdDrainTank3)) break; + if (draining1 && e.Contains(Event.UiCmdStopDrainingTank1)) break; + if (draining2 && e.Contains(Event.UiCmdStopDrainingTank2)) break; + if (draining3 && e.Contains(Event.UiCmdStopDrainingTank3)) break; + if (draining1 && StateMachine.Scale1.IsEmpty(mass1.Val)) break; + if (draining2 && StateMachine.Scale2.IsEmpty(mass2.Val)) break; + if (draining3 && StateMachine.Scale3.IsEmpty(mass3.Val)) break; + + /// Quit the selection loop and leave MakeSelection() + if (e.Contains(Event.UiCmdBreak) && context == MKSelContext.InsideProcedure) return Selection.Break; + if (e.Contains(Event.UiCmdPurgeBegin)) return Selection.PurgeBegin; + if (e.Contains(Event.UiCmdPurgeEnd)) return Selection.PurgeEnd; + if (e.Contains(Event.UiCmdStartCycle)) return Selection.Cycle; + if (e.Contains(Event.UiCmdStartTest)) return Selection.Test; + if (e.Contains(Event.UiCmdStartQ1)) return Selection.Q1; + if (e.Contains(Event.UiCmdStartQ2)) return Selection.Q2; + if (e.Contains(Event.UiCmdStartQ3)) return Selection.Q3; + if (e.Contains(Event.UiCmdAcceptResults)) return Selection.SaveResults; + if (e.Contains(Event.UiCmdReloadBatch)) return Selection.RestoreBatch; + if (e.Contains(Event.UiCmdCustom)) return Selection.Custom; + } + while (true); + + + if (e.Contains(Event.Error)) + { + ///------------------------------------ + Bridge.OnActivity(this, Strings.Error); + ///------------------------------------ + State.Create("MainSeq : ERROR state") + .EnterState(); + while (true) StateMachine.WaitRunDevsRunOps(); /// Endless loop + } + else + { + string stateText = "MainSeq : "; + IList openValves = new List(); + IList closeValves = new List(); + + if (draining1 && (StateMachine.Scale1.IsEmpty(mass1.Val) || e.Contains(Event.UiCmdStopDrainingTank1))) + { + draining1 = false; + closeValves.Add(StateMachine.DrainValve1); + stateText = stateText + "close tank 1, "; + } + else if (draining2 && (StateMachine.Scale2.IsEmpty(mass2.Val) || e.Contains(Event.UiCmdStopDrainingTank2))) + { + draining2 = false; + closeValves.Add(StateMachine.DrainValve2); + stateText = stateText + "close tank 2, "; + } + else if (draining3 && (StateMachine.Scale3.IsEmpty(mass3.Val) || e.Contains(Event.UiCmdStopDrainingTank3))) + { + draining3 = false; + closeValves.Add(StateMachine.DrainValve3); + stateText = stateText + "close tank 3, "; + } + else if (!draining1 && e.Contains(Event.UiCmdDrainTank1)) + { + draining1 = true; + openValves.Add(StateMachine.DrainValve1); + stateText = stateText + "open tank 1, "; + } + else if (!draining2 && e.Contains(Event.UiCmdDrainTank2)) + { + draining2 = true; + openValves.Add(StateMachine.DrainValve2); + stateText = stateText + "open tank 2, "; + } + else if (!draining3 && e.Contains(Event.UiCmdDrainTank3)) + { + draining3 = true; + openValves.Add(StateMachine.DrainValve3); + stateText = stateText + "open tank 3, "; + } + + draining = draining1 || draining2 || draining3; + if (draining) Bridge.OnActivity(this, Strings.Emptying_tank); + + Bridge.Bench2UI(((context == MKSelContext.ProcedureNotSelected) ? ButtonsEtc.ProcedureCmbBoxEn : 0) | + ((StateMachine.DrainValve1 == null) ? 0 : (draining1 ? ButtonsEtc.DrainTankBtn1Hi : ButtonsEtc.DrainTankBtn1En)) | + ((StateMachine.DrainValve2 == null) ? 0 : (draining2 ? ButtonsEtc.DrainTankBtn2Hi : ButtonsEtc.DrainTankBtn2En)) | + ((StateMachine.DrainValve3 == null) ? 0 : (draining3 ? ButtonsEtc.DrainTankBtn3Hi : ButtonsEtc.DrainTankBtn3En))); + + State.Create(stateText) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(openValves, closeValves)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + } + while (e.Contains(Event.ValvesBusy)); + } + } + } + + + /// + /// Create a new empty batch results from the procedure + /// + /// New batch number + /// Selected procedure + /// Created BatchResults + Results.BatchResults CreateNewBatchResults(int newBatchNr, Procedure procedure) + { + /// + /// Prepare new water meters + /// + foreach (var wm in WaterMeters) wm.ClearData(); /// Clean water meter data + + bool compound = (StateMachine.Procedure.MetersKind == MetersKind.Combined); + bool heatMeters = (StateMachine.Procedure.MetersKind == MetersKind.HeatMeter); + int waterMetersCount = Math.Min(WaterMeters.Count, heatMeters ? Config.Data.HeatMetersCount : (compound ? Config.Data.CompoundWMsCount : Config.Data.WMsCount)); + /// + Results.Entities.WaterMeterData[] waterMeterData = new Results.Entities.WaterMeterData[waterMetersCount]; + /// + int[] waterMeterParts = new int[waterMetersCount]; + for (int wmNr = 0; wmNr < waterMetersCount; wmNr++) + { + int ix = compound ? (2 * wmNr) : wmNr; + if (WaterMeters.Count > ix) + { + waterMeterParts[wmNr] = Utils.PartNr(wmNr + 1, compound); + waterMeterData[wmNr] = new Results.Entities.WaterMeterData() + { + ProductName = WaterMeters[ix].ProductName, + Producer = WaterMeters[ix].Producer, + + L = WaterMeters[ix].L, + DN = WaterMeters[ix].DN, + Mounting = WaterMeters[ix].Mounting, + + NewQnames = WaterMeters[ix].NewQnames, + Q4_Qmax = WaterMeters[ix].Q4_Qmax, + Q3_Qn = WaterMeters[ix].Q3_Qn, + Q2_Qt = WaterMeters[ix].Q2_Qt, + Q1_Qmin = WaterMeters[ix].Q1_Qmin, + + MetrologicalClass = WaterMeters[ix].MetrologicalClass, + TemperatureClass = WaterMeters[ix].TemperatureClass, + PressureLossClass = WaterMeters[ix].PressureLossClass, + MaxAdmissiblePressure = WaterMeters[ix].MaxAdmissiblePressure, + FlowProfileSensitivityClass = WaterMeters[ix].FlowProfileSensitivityClass, + + ApprovalInfo = WaterMeters[ix].ApprovalInfo, + Certificate = WaterMeters[ix].Certificate, + + PulsesPerLtr = WaterMeters[ix].PulsesPerLtr, + Medium = WaterMeters[ix].Medium, + Text1 = WaterMeters[ix].Text1, + Text2 = WaterMeters[ix].Text2, + Text3 = WaterMeters[ix].Text3, + Text4 = WaterMeters[ix].Text4, + Text5 = WaterMeters[ix].Text5, + + Compound = compound, + HeatMeter = heatMeters, + }; + } + + int auxIx = 2 * wmNr + 1; + if (compound && WaterMeters.Count > auxIx) + { + waterMeterData[wmNr].ProducerAux = WaterMeters[auxIx].Producer; + waterMeterData[wmNr].Q3_Qn_Aux = WaterMeters[auxIx].Q3_Qn; + waterMeterData[wmNr].MetrologicalClassAux = WaterMeters[auxIx].MetrologicalClass; + waterMeterData[wmNr].ApprovalInfoAux = WaterMeters[auxIx].ApprovalInfo; + } + } + + /// Prepare empty results + return Results.BatchResults.NewFromProcedure(newBatchNr, + (BenchInfo != null) ? BenchInfo.TestBenchId : 1, + Users.GlobalData.CurrentUser.ToEncodedStr(), + Users.GlobalData.CurrentUser.Number, + Program.Version, + StateMachine.Procedure, + waterMeterData, + waterMeterParts, + Formulas.DensityCorrection(Program.LocalSettings.RealDensity, + Program.LocalSettings.AtTemperature)); + } + + + /// + /// Reload batch results from Results database given the batch number + /// + /// Original batch number + /// New unique batch number + /// Reloaded procedure + /// + void RestoreBatchResults(int oriBatchNr, ref Results.BatchResults batchResults) + { + Batch oriBatch = Results.DB.LoadBatch(oriBatchNr); + + if (oriBatch == null) return; + + batchResults.Batch.StartTime = oriBatch.StartTime; + + foreach (var testRslt in batchResults.Batch.TestRslts) + { + foreach (var oriTstRslt in oriBatch.TestRslts) + { + if (testRslt.Name() == oriTstRslt.Name() && + testRslt.Part == oriTstRslt.Part && + testRslt.RepetitionNr == oriTstRslt.RepetitionNr) + { + testRslt.CopyContentFrom(oriTstRslt); + break; + } + } + } + + for (int i = 0; i < batchResults.WaterMeters.Length; i++) + { + WaterMeter wm = batchResults.WaterMeters[i]; + wm.Disabled = true; + foreach (var wm2 in oriBatch.WaterMeters) + { + if (wm.WMPosition == wm2.WMPosition) + { + wm.CopyContentFrom(wm2); + wm.Disabled = false; + break; + } + } + } + } + + + void CollectSimultSteps() + { + /// + /// Collect steps (e.g. iPerl communication) to be done simultaneously with purging + /// + simultWithPurgingCount = 0; + simultWithPurgingCfg = null; + simultWithPurgingTests.Clear(); + simultWithPurgingParams.Clear(); + /// + foreach (var test in StateMachine.Tests) + { + Generic.IComponent testMethodComp = TbfComponents.FindComponent(test.Method); + if (testMethodComp == null) break; + + testMethodComp.Cfg.LoadTestParamsFromDB(test); + + ISimultTestMethod simultTest = testMethodComp as ISimultTestMethod; + MetersPath sensPath = StateMachine.GetMetersPath(test); + + if (simultTest == null || !simultTest.SimultWithPrevious || sensPath == null) break; + + if (simultWithPurgingCount == 0) + { + simultWithPurgingCfg = simultTest.Cfg; + } + else if (simultTest.Cfg != simultWithPurgingCfg) + { + break; + } + + simultWithPurgingTests.Add(test); + simultWithPurgingParams.Add(testMethodComp.Cfg.GetRuntimeTestParamsProvider().Clone() as Generic.ITestParams); + simultWithPurgingCount++; + } + + /// + /// Collect steps (e.g. iPerl communication) to be done simultaneously with evacuation + /// + simultWithEvacuationCount = 0; + simultWithEvacuationCfg = null; + simultWithEvacuationTests.Clear(); + simultWithEvacuationParams.Clear(); + /// + for (int i = StateMachine.Tests.Count - 1; i >= simultWithPurgingCount; i--) + { + var test = StateMachine.Tests[i]; + + Generic.IComponent testMethodComp = TbfComponents.FindComponent(test.Method); + if (testMethodComp == null) break; + + testMethodComp.Cfg.LoadTestParamsFromDB(test); + + ISimultTestMethod simultTest = testMethodComp as ISimultTestMethod; + MetersPath sensPath = StateMachine.GetMetersPath(test); + + if (simultTest == null || !simultTest.SimultWithNext || sensPath == null) break; + + if (simultWithEvacuationCount == 0) + { + simultWithEvacuationCfg = simultTest.Cfg; + } + else if (simultTest.Cfg != simultWithEvacuationCfg) + { + break; + } + + simultWithEvacuationTests.Insert(0, test); + simultWithEvacuationParams.Insert(0, testMethodComp.Cfg.GetRuntimeTestParamsProvider().Clone() as Generic.ITestParams); + simultWithEvacuationCount++; + } + } + + + /// + /// Executes steps of a evacuation sequence + /// + /// + /// Event.Done Transition sequence completed OK + /// Event.UiCmdStop Transition sequence interrupted by the STOP on-screen button + /// Event.Error Error (e.g. RegulValveTimeOut returned by Run() of SetRegulValvePositionOp) + /// + Event DoEvacuation(TransitionSequence purgeEnd) + { + IList e; + + if (simultWithEvacuationCount > 0) + { + /// Open iPerlCommunicationForm + ProcessData.RegisterReaders = StateMachine.GetMetersPath(simultWithEvacuationTests[0]).RegisterReaders; + Program.MainWnd.Invoke(new iPerlCommFormDlgt(OpenIPerlCommForm), new object[] { this, simultWithEvacuationCfg, simultWithEvacuationTests, simultWithEvacuationParams }); + } + + //-------------------------------------------------------- + switch (Transition(purgeEnd, TransitionContext.PurgeEnd)) + { + case Event.Error: + if (simultWithEvacuationCount > 0) CloseIPerlCommForm(); + return Event.Error; + case Event.UiCmdStop: + if (simultWithEvacuationCount > 0) CloseIPerlCommForm(); + return Event.UiCmdStop; + default: + break; + } + + if (simultWithEvacuationCount > 0) + { + /// + /// Wait until iPerl communications are completed + /// + bool completed = !(modelessDlg is GenericDevices.IHasCompleted) + || (modelessDlg as GenericDevices.IHasCompleted).Completed; + if (!completed) + { + State.Create("MainSeq : Wait until the entry form is closed") + .AddOperation(checkUiOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.UiCmdStop)) + { + CloseIPerlCommForm(); + return Event.UiCmdStop; + } + + completed = (modelessDlg as GenericDevices.IHasCompleted).Completed; + } + while (!completed); + } + + modelessDlg = null; + } + + benchFilled = false; + Bridge.Bench2UI(ButtonsEtc.ShowBenchEmpty); + + return Event.Done; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Sequences/Plotter.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Sequences/Plotter.cs new file mode 100644 index 00000000..90d4b214 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Sequences/Plotter.cs @@ -0,0 +1,80 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.IO; +using System.Collections.Generic; +using log4net; + +namespace TBF.BenchControl.Sequences +{ + public class Plotter : BenchControl.GenericDevices.IPlotter + { + static readonly ILog log = LogManager.GetLogger(typeof(Plotter)); + + static readonly Dictionary writers = new Dictionary(); + static int nextGraphId = 1; + + + + readonly string caption; + /// + public Plotter(string caption) + { + this.caption = caption; + } + + + + public int StartGraph(int batchNr, string testName, int repetition) + { + try + { + int graphId = nextGraphId++; + string directory = Path.Combine(TBF.Program.GraphsDir, batchNr.ToString(), testName, repetition.ToString()); + Directory.CreateDirectory(directory); + BinaryWriter writer = new BinaryWriter(File.Open(Path.Combine(directory, caption), FileMode.Create)); + writers.Add(graphId, writer); + log.InfoFormat("Graph file #{0} successfully created (batch={1} test={2} repet={3} caption={4})", + graphId, batchNr, testName, repetition, caption); + return graphId; + } + catch (Exception exc) + { + log.ErrorFormat("Failed to create a graph file (batch={0} test={1} repet={2} caption={3}): {4}", + batchNr, testName, repetition, caption, exc.Message); + return 0; + } + } + + public void UpdateGraph(int graphId, float x, float y) + { + try + { + BinaryWriter writer = writers[graphId]; + writer.Write(x); + writer.Write(y); + } + catch (Exception exc) + { + log.ErrorFormat("Failed to update graph file #{0}: {1}", graphId, exc.Message); + } + } + + public void StopGraph(int graphId, float ymin, float ymax) + { + try + { + BinaryWriter writer = writers[graphId]; + writer.Write(ymin); + writer.Write(ymax); + writer.Close(); + writers.Remove(graphId); + } + catch (Exception exc) + { + log.ErrorFormat("Failed to close graph file #{0}: {1}", graphId, exc.Message); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Sequences/ProcessData.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Sequences/ProcessData.cs new file mode 100644 index 00000000..aefb6ee0 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Sequences/ProcessData.cs @@ -0,0 +1,177 @@ +using System; +using TBF.BenchControl.GenericDevices; +using TBF.Boxes; + +namespace TBF.BenchControl.Sequences +{ + public class ProcessData + { + public static IBenchInfo BenchInfo; + public static IErrorFlags ErrorFlagsComp; + + public static FloatBox AmbTemp = new FloatBox() { Name = "Ambient Temperature", Format = "F1" }; /// [Celsius] + public static FloatBox AmbPress = new FloatBox() { Name = "Ambient Pressure", Format = "F0", Factor = 1000 }; /// [bar], printed by ToString() in [mbar] + public static FloatBox AmbHumi = new FloatBox() { Name = "Ambient Humidity", Format = "F1" }; /// [%] + public static DoubleBox TempUp = new DoubleBox() { Name = "Temperature Up", Format = "F2" }; /// [°C] + public static DoubleBox TempDown = new DoubleBox() { Name = "Temperature Dn", Format = "F2" }; /// [°C] + public static DoubleBox TempDiv = new DoubleBox() { Name = "Temperature Div", Format = "F2" }; /// [°C] + public static FloatBox PressUp = new FloatBox() { Name = "Pressure Up", Format = "F2" }; /// [bar] + public static FloatBox PressDown = new FloatBox() { Name = "Pressure Dn", Format = "F2" }; /// [bar] + public static FloatBox PressDelta = new FloatBox() { Name = "Pressure Delta", Format = "F2" }; /// [bar] + + public static float LtrPerRefPulse; /// to calculate the ref.volume + public static int RefPulses; + public static int RefPulsesDelta; + public static DoubleBox RefFreq = new DoubleBox() { Name = "RefFreq", Format = "F2" }; + public static DoubleBox RefFlow = new DoubleBox() { Name = "RefFlow", Format = "F2" }; /// [m3/h] + + public static DoubleBox Mass = new DoubleBox() { Name = "Mass", Format = "F3" }; /// [kg] + public static DoubleBox StartMass = new DoubleBox() { Name = "Start Mass", Format = "F3" }; /// [kg] + public static DoubleBox EndMass = new DoubleBox() { Name = "End Mass", Format = "F3" }; /// [kg] + + public static DateTime TestStartTime; + public static DateTime TestEndTime; + + public static double StartTime; + public static double EndTime; + + /// Heat meters only + public static DoubleBox TempRefHi1 = new DoubleBox() { Name = "T hi ac 1", Format = "F3" }; /// [°C] + public static DoubleBox TempRefHi2 = new DoubleBox() { Name = "T hi ac 2", Format = "F3" }; /// [°C] + public static DoubleBox TempRefLo1 = new DoubleBox() { Name = "T lo ac 1", Format = "F3" }; /// [°C] + public static DoubleBox TempRefLo2 = new DoubleBox() { Name = "T lo ac 2", Format = "F3" }; /// [°C] + + public static Results.BatchResults BatchRslts; + + public static IRegisterReader[] RegisterReaders; + /// + static ProcessData() + { + /// + /// RegisterReaders should never be null, RegisterReader.Length should be Config.Data.WMsCount + /// RegisterReader[i] where i = 0..Config.Data.WMsCount-1 may be null and should always be tested + /// + RegisterReaders = new IRegisterReader[Config.Data.WMsCount]; + } + + + /// + /// To clear process values at the beginning of each test + /// + protected void ClearProcessValues() + { + for (int i = 0; i < Config.Data.WMsCount; i++) + { + if (RegisterReaders[i] != null) RegisterReaders[i].Clear(); + } + + RefPulses = 0; + RefFreq.Clear(); + RefFlow.Clear(); + Mass.Clear(); + StartMass.Clear(); + EndMass.Clear(); + } + + + /// + /// Statistics of 'continuous' variables (temperature, pressure, flow, etc.) + /// + public static Statistics AmbTempStat = new Statistics(new Plotter("Ambient temperature")); + public static Statistics AmbPressStat = new Statistics(new Plotter("Ambient pressure")); + public static Statistics AmbHumiStat = new Statistics(new Plotter("Ambient humidity")); + + public static Statistics TempUpStat = new Statistics(0, 7, true, new Plotter("Temperature up")); + public static Statistics TempDownStat = new Statistics(0, 7, true, new Plotter("Temperature down")); + public static Statistics TempDiffStat = new Statistics(0, 7, true); + public static Statistics TempDivStat = new Statistics(0, 7, true, new Plotter("Temperature div")); + public static Statistics PressUpStat = new Statistics(5, 7, true, new Plotter("Pressure up")); + public static Statistics PressDownStat = new Statistics(5, 7, true, new Plotter("Pressure down")); + public static Statistics PressDeltaStat = new Statistics(5, 7, true); + public static Statistics RefFlowStat = new Statistics(5, 7, true, new Plotter("Flow")); + + public static Statistics TempRefHiStat = new Statistics(); + public static Statistics TempRefLoStat = new Statistics(); + public static Statistics Energy = new Statistics(); + public static Statistics VolumeForEnergy = new Statistics(); + public static int lastEnergyUpdateTime; + + public static Statistics DiverterStart = new Statistics(new Plotter("Div start")); + public static Statistics DiverterEnd = new Statistics(new Plotter("Div end")); + + public static int machineTimeStart; + public static int lastMachineTime; + + protected static void StartNewStatistics(int machineTime, int batchNr, string testName, int repetition) + { + machineTimeStart = machineTime; + lastMachineTime = machineTime; + + AmbTempStat.Start(batchNr, testName, repetition); + AmbPressStat.Start(batchNr, testName, repetition); + AmbHumiStat.Start(batchNr, testName, repetition); + + TempUpStat.Start(batchNr, testName, repetition); + TempDownStat.Start(batchNr, testName, repetition); + TempDiffStat.Start(batchNr, testName, repetition); + TempDivStat.Start(batchNr, testName, repetition); + PressUpStat.Start(batchNr, testName, repetition); + PressDownStat.Start(batchNr, testName, repetition); + PressDeltaStat.Start(batchNr, testName, repetition); + RefFlowStat.Start(batchNr, testName, repetition); + + TempRefHiStat.Start(batchNr, testName, repetition); + TempRefLoStat.Start(batchNr, testName, repetition); + Energy.Start(batchNr, testName, repetition); + VolumeForEnergy.Start(batchNr, testName, repetition); + lastEnergyUpdateTime = 0; + } + + protected static void UpdateAllStatistics(int machineTime) + { + int timeDelta = machineTime - lastMachineTime; + + AmbTempStat.Update(AmbTemp); + AmbPressStat.Update(AmbPress); + AmbHumiStat.Update(AmbHumi); + + TempUpStat.Update(TempUp); + TempDownStat.Update(TempDown); + TempDiffStat.Update(Math.Abs(TempUp.Val - TempDown.Val)); + TempDivStat.Update(TempDiv); + PressUpStat.Update(PressUp); + PressDownStat.Update(PressDown); + PressDeltaStat.Update(PressDelta); + RefFlowStat.Update(RefFlow); + + if (BatchRslts.Batch.HeatMeter) + { + TempRefHiStat.Update((TempRefHi1.Val + TempRefHi2.Val) / 2); + TempRefLoStat.Update((TempRefLo1.Val + TempRefLo2.Val) / 2); + } + + lastMachineTime = machineTime; + } + + protected static void StopRecordingStatistics() + { + AmbTempStat.Stop(); + AmbPressStat.Stop(); + AmbHumiStat.Stop(); + + TempUpStat.Stop(); + TempDownStat.Stop(); + TempDiffStat.Stop(); + TempDivStat.Stop(); + PressUpStat.Stop(); + PressDownStat.Stop(); + PressDeltaStat.Stop(); + RefFlowStat.Stop(); + + TempRefHiStat.Stop(); + TempRefLoStat.Stop(); + Energy.Stop(); + VolumeForEnergy.Stop(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Sequences/SequenceBase.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Sequences/SequenceBase.cs new file mode 100644 index 00000000..fce2d2f5 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Sequences/SequenceBase.cs @@ -0,0 +1,1534 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Linq; +using log4net; +using Config; +using Config.Entities; +using TBF.BenchControl.GenericDevices; +using TBF.BenchControl.Operations; +using TBF.Boxes; +using TBF.Resources; +using TBF.UiBridge; + +namespace TBF.BenchControl.Sequences +{ + /// + /// Sequence is a group of states that can be dynamically added to + /// and removed from the state machine + /// + public class SequenceBase : ProcessData + { + private static readonly ILog log = LogManager.GetLogger(typeof(SequenceBase)); + + protected static readonly ILog processDataLogger = LogManager.GetLogger("ProcessData"); + protected static readonly ILog allResults = LogManager.GetLogger("AllResults"); + protected static readonly ILog summaryResults = LogManager.GetLogger("SummaryResults"); + + ///------------------------------------------------------------ + /// Global static variables set only once. + ///------------------------------------------------------------ + public static IList FlowMeters; /// list of reference flowmeters + public static IList RegulValves; /// list of regulation valves + public static IList PumpsWithFM; /// list of FM controlled pumps + public static IList WaterMeters; /// list of water meters + public static IList Cameras; /// list of cameras + + ///------------------------------------------------------------ + /// Procedure related (static) variables. + /// They are re-initialized when LoadProcedure() is called + ///------------------------------------------------------------ + public static int ReferenceFlowmetersCount; + public static float[] CalibratedLtrPerRefPulse; /// Reference flowmeter coefficients + public static double Qrise; + public static double Qfall; + + + ///------------------------------------------------------------ + /// Test related (instance) variables. + /// Created when test sequence is open. + /// They persist during all repetitions of the same test + ///------------------------------------------------------------ + protected static BenchControl.FeedingPath inPath; + protected static BenchControl.BenchPath benchPath; + protected static BenchControl.OutputPath outPath; + protected static BenchControl.MetersPath sensPath; + protected static BenchControl.HeatMetersPath heatMetersPath; + + protected static TransitionSequence transitionBefore; + protected static TransitionSequence transitionAfter; + + + protected IOperation readRegistersOp; + protected IOperation queryEnd1; + protected IOperation queryEnd2; + protected IOperation checkUiOp; + + protected IOperation processDataLoggingOp; + protected IOperation enduranceDataLoggingOp; + + + /// + /// Process data logging + /// + public void LogProcessDataTestInfo(ILog logger, string procedureName, string testName) + { + logger.Info(Environment.NewLine); + logger.InfoFormat("{0}={1:dd.MM.yyyy HH:mm:ss} {2}={3} {4}={5} {6}={7}", + Strings.Date_and_time, TestStartTime, + Strings.Batch_nr, BatchRslts.Batch.BatchNr, + Strings.Procedure, procedureName, + Strings.Test, testName); + } + + public void LogProcessDataHeader(ILog logger) + { + LogProcessDataHeader(logger, null); + } + + public void LogProcessDataHeader(ILog logger, string sectionName) + { + logger.Info(Environment.NewLine); + if (sectionName != null) logger.Info(sectionName); + logger.Info("Time Flow TstTime Ref.cnt Ref.vol Tup Tdown Tdiv Pup Pdown Pdelta Mass VolMM Tamb Hamb Pamb Rv"); + logger.Info(Environment.NewLine); + } + + public void LogProcessData(ILog logger) + { + logger.InfoFormat("{0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11} {12} {13} {14} {15} {16}", + DateTime.Now.ToLongTimeString(), + Utils.DoubleToStr(RefFlow.Val, 4), /// flow measured by the reference flow meter in m3/h + StateMachine.ControlBoard.TTime.ToString("F3"), /// test time in s + StateMachine.ControlBoard.EtPulses(0), /// reference flow meter pulses count + Formulas.VolumeFromPulses(StateMachine.ControlBoard.EtPulses(0), 1.0f / LtrPerRefPulse).ToString("F3"), /// volume in l + TempUp, /// water temperature at the beginning of test line in degree C + TempDown, /// water temperature at the end of test line in degree C + TempDiv, /// water temperature at the diverter in degree C + PressUp, /// water pressure at the beginning of test line in bar (= 100 kPa) + PressDown, /// water pressure at the end of test line in bar (= 100 kPa) + PressDelta, + Mass, /// collected water mass in kg + "VolMM", + AmbTemp, /// ambient temperature in degree C + AmbHumi, /// ambient humidity in R% + AmbPress, /// ambient pressure in mbar (= 1 hPa) + outPath.RegulValve.Position.ToString("F1")); /// regulation valve position in % (0=closed / 100=open) + } + + public void LogProcessDataHeaderHeatMeters(ILog logger, string sectionName) + { + logger.Info(Environment.NewLine); + if (sectionName != null) logger.Info(sectionName); + logger.Info("Time Flow TstTime Ref.cnt Ref.vol Tup Tdown Tdiv Pup Pdown Pdelta Mass VolMM Tamb Hamb Pamb Rv Thiac1 Thiac2 Tloac1 Tloac2"); + logger.Info(Environment.NewLine); + } + + public void LogProcessDataHeatMeters(ILog logger) + { + logger.InfoFormat("{0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11} {12} {13} {14} {15} {16} {17} {18} {19} {20}", + DateTime.Now.ToLongTimeString(), + Utils.DoubleToStr(RefFlow.Val, 4), + StateMachine.ControlBoard.TTime.ToString("F3"), + StateMachine.ControlBoard.EtPulses(0), + Formulas.VolumeFromPulses(StateMachine.ControlBoard.EtPulses(0), 1.0f / LtrPerRefPulse).ToString("F3"), + TempUp, + TempDown, + TempDiv, + PressUp, + PressDown, + PressDelta, + Mass, + "VolMM", + AmbTemp, + AmbHumi, + AmbPress, + outPath.RegulValve.Position.ToString("F1"), + TempRefHi1, + TempRefHi2, + TempRefLo1, + TempRefLo2); + } + + /// + /// Endurance data logging + /// + public void LogEnduranceHeader(System.IO.StreamWriter writer) + { + LogEnduranceHeader(writer, null); + } + + public void LogEnduranceHeader(System.IO.StreamWriter writer, string sectionName) + { + writer.WriteLine(); + if (sectionName != null) + writer.Write(sectionName); + writer.WriteLine("Time T_up T_dn Pr_up Pr_dn Flow"); + } + + public void LogEnduranceData(System.IO.StreamWriter writer) + { + + writer.WriteLine(string.Format("{0:dd.MM.yyyy HH:mm.ss} {1} {2} {3} {4} {5}", + DateTime.Now, + TempUp, + TempDown, + PressUp, + PressDown, + RefFlow)); + } + + + protected Event DrainTheTank(IValve drainValve, IScale scale) + { + return DrainTheTank(drainValve, scale, new List()); + } + + protected Event DrainTheTank(IValve drainValve, IScale scale, IOperation extraOperation) + { + IList extraOperations = new List(); + extraOperations.Add(extraOperation); + return DrainTheTank(drainValve, scale, extraOperations); + } + + /// + /// Empties the tank: opens the emptying valve and measures the weight. + /// + /// Valve to empty the tank + /// Scale underneath the tank + /// Event.Done or Event.Error + protected Event DrainTheTank(IValve drainValve, IScale scale, IList extraOperations) + { + bool stopped = false; + + //------------------------------------------------------------ + Bridge.OnActivity(this, TBF.Resources.Strings.Emptying_tank); + //------------------------------------------------------------ + + IList e; + Bridge.Bench2UI(ButtonsEtc.StopBtnEn); + + + State.Create("SequenceBase : Drain valve opened") + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(drainValve, null)) + .AddOperations(extraOperations) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + } + while (!e.Contains(Event.ValvesSet)); + + do + { + State.Create("SequenceBase : Draining the tank") + .AddOperation(checkUiOp) + .AddOperation(scale.ReadMassOp(ref Mass)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperations(extraOperations) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) return Event.Error; + if (TestAndLogUiCmdStop(e)) + { + stopped = true; + break; + } + if (e.Contains(Event.BalanceOverload)) { }; /// Tank should be emptying now + } + while (!e.Contains(Event.BalanceDone)); + + + if (stopped) break; + } + while (!scale.IsEmpty(Mass.Val)); + + // + // Quit emptying + // + State.Create("SequenceBase : Closing the drain valve") + .AddOperation(checkUiOp) + .AddOperation(scale.ReadMassOp(ref Mass)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(null, drainValve)) + .AddOperations(extraOperations) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) return Event.Error; + if (TestAndLogUiCmdStop(e)) return Event.UiCmdStop; + } + while (!e.Contains(Event.ValvesSet) || !e.Contains(Event.BalanceDone)); + + + State.Create("SequenceBase : Updating the mass") + .AddOperation(checkUiOp) + .AddOperation(scale.ReadMassOp(ref Mass)) + .AddOperation(new Operations.TimerOp(5)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperations(extraOperations) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) return Event.Error; + if (TestAndLogUiCmdStop(e)) return Event.UiCmdStop; + } + while (!e.Contains(Event.BalanceDone) || !e.Contains(Event.TimerExpired)); + + + if (stopped) + return Event.UiCmdStop; + else + return Event.Done; + } + + + /// + /// Passed as an argument to Transition(sequence, context) + /// + public enum TransitionContext + { + PurgeBegin, + BeforeTest, + AfterTest, + PurgeEnd, + Stop, + } + + + /// + /// Calculates the estimate of transition sequence execution time + /// + /// TransitionSequence entity + /// Time in seconds + protected int GetTransitionTimeEst(TransitionSequence transitionSequence) + { + if (transitionSequence == null) return 1; + + return 30; /// TODO: Implement time estimte calculation + } + + + /// + /// Executes steps of a transition sequence + /// + /// TransitionSequence entity + /// Calling context (see above) + /// + /// Event.Done Transition sequence completed OK + /// Event.UiCmdStop Transition sequence interrupted by the STOP on-screen button + /// Event.Error Error (e.g. RegulValveTimeOut returned by Run() of SetRegulValvePositionOp) + /// + protected Event Transition(TransitionSequence transitionSequence, TransitionContext context) + { + bool stopFlag = false; + bool errorFlag = false; + IList e; + string message; + /// + switch (context) + { + case TransitionContext.PurgeBegin: message = Strings.Purging_i_n; break; + case TransitionContext.BeforeTest: message = Strings.Test_start_sequence_i_n; break; + case TransitionContext.AfterTest: message = Strings.Test_stop_sequence_i_n; break; + case TransitionContext.PurgeEnd: message = Strings.Emptying_i_n; break; + case TransitionContext.Stop: message = Strings.Test_stop_sequence_i_n; break; + default: message = "Transition"; break; + } + + if (transitionSequence == null) + { + log.WarnFormat("Transition(null, context={0})", context); + + /// + /// No transition sequence defined --> Default action + /// + if (context == TransitionContext.AfterTest) + { + if (inPath.Pump is GenericDevices.IPumpFM) (inPath.Pump as GenericDevices.IPumpFM).TurnOff(); + + State.Create("SequenceBase : Transition : TestEnd - Default action") + .AddOperation(checkUiOp) + .AddOperation(new MettlerToledo.KeepReadingMassesOp()) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(StateMachine.DefaultValvesOpen, + StateMachine.DefaultValvesClose)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(e)) return Event.UiCmdStop; + } + while (!e.Contains(Event.ValvesSet)); + } + } + else + { + /// + /// Fetch and execute the transition sequence + /// + IList transitionSteps = new List(); + if (StateMachine.TransitionSteps != null) + { + foreach (var step in StateMachine.TransitionSteps) + { + if ((step.TransitionSequence != null) && (step.TransitionSequence.Id == transitionSequence.Id)) + { + transitionSteps.Add(step); + } + } + } + + int stepsCount = transitionSteps.Count; + + log.WarnFormat("Transition(sequence={0} ({1} steps), context={2})", transitionSequence.Name, stepsCount, context); + + foreach (var step in transitionSteps) + { + //------------------------------------------------ + string activity = string.Format(message, transitionSequence.Name, step.ItemNr + 1, stepsCount); + Bridge.OnActivity(this, activity); + Bridge.OnMessage(this, step.Message); + log.Info(activity + " " +step.Message); + //------------------------------------------------ + + /// + /// Fetch the condition operation, null value is allowed if there is no condition + /// + IOperation conditionOperation = null; + if (step.EndCondition != "None") + { + string[] fields = step.EndCondition.Split(new char[]{'~'}); + if (fields.Length == 2) + { + ISequenceCondition seqCondition = TbfComponents.FindComponent(fields[0]) as ISequenceCondition; + int condID; + if (int.TryParse(fields[1], out condID)) + { + conditionOperation = seqCondition.ConditionOp(condID); + } + } + } + + /// FM controlled pumps are canged imediately without using any state operations + log.DebugFormat("step.PumpWithFMPcts = {0}", step.PumpWithFMPcts); + float[] allFMPumpPcts = Utils.GetPumpWithFMPcts(step); + for (int i = 0; i < allFMPumpPcts.Length; i++) + { + float pwr = allFMPumpPcts[i]; + if (pwr > 0) /// Negative value means no power change + { + PumpsWithFM[i].TurnOn(pwr); + } + else if (pwr == 0) + { + PumpsWithFM[i].TurnOff(); + } + } + + /// Get new regulation valve positions, + float[] allRegvPositions = Utils.GetRegulValvesPositions(step); + + /// Prepare necessary SetRegValvePositionOp operations for RV-s with changed positions + IList rvPosOps = new List(); + IList rvPosStr = new List(); + for (int i = 0; i < allRegvPositions.Length; i++) + { + if (allRegvPositions[i] >= 0) /// Negative value means no position change + { + if (RegulValves[i].IsCoax) + { + rvPosOps.Add(RegulValves[i].SetRegulValvePositionOp(allRegvPositions[i], allRegvPositions[i], 60)); + rvPosStr.Add(string.Format("RV{0}.SetRegulValvePositionOp({1}, {1}, 60s)", i, allRegvPositions[i])); + } + else + { + float lo = Math.Max(0, allRegvPositions[i] - 3.0f); + float hi = Math.Min(100.0f, allRegvPositions[i] + 3.0f); + rvPosOps.Add(RegulValves[i].SetRegulValvePositionOp(lo, hi, 60)); + rvPosStr.Add(string.Format("RV{0}.SetRegulValvePositionOp({1}, {2}, 60s)", i, lo, hi)); + } + } + } + + /// Max. one SetRegulValvePositionOp can be started or stopped in one sub-step. + /// Therefore SetRegulValvePositionOp operations are added and removed to subsequent states one by one. + int delay = Math.Max(2, step.Duration - rvPosOps.Count + 2); + + /// + int lastStartedRV = -1; + for (int i = 0; i < rvPosOps.Count; i++) + { + log.DebugFormat("SequenceBase.Transition() : Step {0} start, opening={1}, closing={2}", step.ItemNr + 1, step.ValvesOpen, step.ValvesClose); + State stepStrt = State + .Create(string.Format("SequenceBase.Transition() : Step {0} start, opening={1}, closing={2}", step.ItemNr + 1, step.ValvesOpen, step.ValvesClose)) + .AddOperation(checkUiOp) + .AddOperation(conditionOperation) + .AddOperation(new MettlerToledo.KeepReadingMassesOp()) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(Utils.ValvesOpen(step), Utils.ValvesClose(step))); + for (int j = 0; j <= i; j++) + { + stepStrt.AddOperation(rvPosOps[j]); + log.Debug(rvPosStr[j]); + } + lastStartedRV = i; + stepStrt.EnterState(); + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error) || e.Contains(Event.RegulValveTimeOut)) { errorFlag = true; break; } + if (TestAndLogUiCmdStop(e)) { stopFlag = true; break; } + } + /// Max. valaue of lastStartedRV after exitting the loop is (rvPosOps.Count - 1) + + if (!stopFlag && !errorFlag) + { + log.DebugFormat("SequenceBase.Transition() : Step {0} delay {1}s, opening={2}, closing={3}", step.ItemNr + 1, delay, step.ValvesOpen, step.ValvesClose); + State stepDelay = State + .Create(string.Format("SequenceBase.Transition() : Step {0} delay {1}s, opening={2}, closing={3}", step.ItemNr + 1, delay, step.ValvesOpen, step.ValvesClose)) + .AddOperation(checkUiOp) + .AddOperation(conditionOperation) + .AddOperation(new MettlerToledo.KeepReadingMassesOp()) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(Utils.ValvesOpen(step), Utils.ValvesClose(step))) + .AddOperation(new TimerOp(delay)); + for (int j = 0; j <= lastStartedRV; j++) + { + stepDelay.AddOperation(rvPosOps[j]); + log.Debug(rvPosStr[j]); + } + stepDelay.EnterState(); + bool endContitionFulfilled = false; + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error) || e.Contains(Event.RegulValveTimeOut)) { errorFlag = true; break; } + if (TestAndLogUiCmdStop(e)) { stopFlag = true; break; } + + if (e.Contains(Event.ConditionMet)) endContitionFulfilled = true; ; +/* + switch (step.EndCondition) + { + case StepCondition.Scale1Empty: + endContitionFulfilled = (StateMachine.Scale1 == null) || StateMachine.Scale1.IsEmpty(); + break; + case StepCondition.Scale2Empty: + endContitionFulfilled = (StateMachine.Scale2 == null) || StateMachine.Scale2.IsEmpty(); + break; + case StepCondition.Scale3Empty: + endContitionFulfilled = (StateMachine.Scale3 == null) || StateMachine.Scale3.IsEmpty(); + break; + case StepCondition.AllScalesEmpty: + endContitionFulfilled = ((StateMachine.Scale1 == null) || StateMachine.Scale1.IsEmpty()) && + ((StateMachine.Scale2 == null) || StateMachine.Scale2.IsEmpty()) && + ((StateMachine.Scale3 == null) || StateMachine.Scale3.IsEmpty()); + break; + } + */ + } + while (e.Contains(Event.ValvesBusy) || (!endContitionFulfilled && e.Contains(Event.TimerBusy) && !e.Contains(Event.Next))); + } + + for (int first = 1; first <= lastStartedRV; first++) + { + log.DebugFormat("SequenceBase.Transition() : Step {0} stop, opening={1}, closing={2}", step.ItemNr + 1, step.ValvesOpen, step.ValvesClose); + State stepStop = State.Create(string.Format("SequenceBase.Transition() : Step {0} stop, opening={1}, closing={2}", step.ItemNr + 1, step.ValvesOpen, step.ValvesClose)) + .AddOperation(checkUiOp) + .AddOperation(conditionOperation) + .AddOperation(new MettlerToledo.KeepReadingMassesOp()) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(Utils.ValvesOpen(step), Utils.ValvesClose(step))); + for (int j = first; j <= lastStartedRV; j++) + { + stepStop.AddOperation(rvPosOps[j]); + log.Debug(rvPosStr[j]); + } + stepStop.EnterState(); + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error) || e.Contains(Event.RegulValveTimeOut)) { errorFlag = true; } + if (TestAndLogUiCmdStop(e)) { stopFlag = true; } + } + + if (errorFlag || stopFlag) break; + } + + Bridge.OnMessage(this, string.Empty); /// Clear the last step message + } + + /// + /// Do this after executing the transition sequence + /// + if (context == TransitionContext.Stop || errorFlag || stopFlag) + { + /// + /// On error or when STOP pressed + /// + foreach (var fmPump in PumpsWithFM) fmPump.TurnOff(); + + if (inPath != null) + { + /// Stop the pump + /// + State.Create("SequenceBase.Transition() : Test stopped -> Stopping the pump") + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(null, inPath.Pump)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) return Event.Error; + } + while (!e.Contains(Event.ValvesSet)); + } + } + else if (context == TransitionContext.BeforeTest) + { + if (inPath != null && benchPath != null && outPath != null) + { + State.Create("SequenceBase : Transition : TestStart - Default action") + .AddOperation(checkUiOp) + .AddOperation(new MettlerToledo.KeepReadingMassesOp()) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(StateMachine.ControlBoard + .SetValvesOp(GenericDevices.ValveBase.Merge(inPath.ValvesOpen, benchPath.ValvesOpen, outPath.ValvesOpen), + GenericDevices.ValveBase.Merge(inPath.ValvesClose, benchPath.ValvesClose, outPath.ValvesClose))) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) return Event.Error; + if (TestAndLogUiCmdStop(e)) return Event.UiCmdStop; + } + while (e.Contains(Event.ValvesBusy)); + } + } + + + if (errorFlag) + return Event.Error; + else if (stopFlag) + return Event.UiCmdStop; + else + return Event.Done; + } + + + /// + /// Opens a modeless dialog for entering data at the beginning of a procedure (serial numbers) + /// + /// false = OK, true = stop pressed + protected bool OpenCycleBeginForm() + { + IList e; + GenericDevices.IDataEntry dataEntryCmpnt = + TbfComponents.FindComponent(StateMachine.Procedure.DataEntry) as GenericDevices.IDataEntry; + if (dataEntryCmpnt is IHasCycleBeginForm) + { + Bridge.OnActivity(this, Strings.Enter_water_meter_data); + State.Create("MainSeq : Enter begin data") + .AddPermanentOperation((dataEntryCmpnt as IHasCycleBeginForm).ShowCycleBeginFormOp()) + .AddOperation(checkUiOp) + .EnterState(); + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(e)) return true; + } + return false; + } + + + /// + /// Waits until a modeless dialog for entering data at the beginnig of a procedure is closed. + /// This function is typically called at the end of the first test of the procedure. + /// + /// false = OK, true = stop pressed + protected UIFlowControl WaitBeginFormClosed() + { + GenericDevices.IDataEntry dataEntryCmpnt = + TbfComponents.FindComponent(StateMachine.Procedure.DataEntry) as GenericDevices.IDataEntry; + + bool stopPressed = false; /// true when STOP button pressed + + if (dataEntryCmpnt is IHasCycleBeginForm) + { + IList e; + + /// + /// Wait until modeless form is closed by the user if it is stil open + /// + if ( State.LastEvents.Contains(Event.ModelessFormIsOpen)) + { + State.Create("MainSeq : Wait until the entry form is closed") + .AddOperation(checkUiOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(e)) + { + stopPressed = true; + break; + } + } + while (!e.Contains(Event.ModelessFormClosed)); + } + + /// + /// A state without any dataEntryCmpnt operation so that Stop() when entering + /// this state and Start() when entering the following state are executed. + /// + State.Create("MainSeq : Stopping modeless form") + .AddOperation(checkUiOp) + .RemovePermanentOperation(dataEntryCmpnt as IOperation) + .EnterState(); + e = StateMachine.WaitRunDevsRunOps(); + + if (TestAndLogUiCmdStop(e)) { stopPressed = true; } + } + + return stopPressed ? UIFlowControl.Stop : UIFlowControl.Continue; + } + + + /// + /// Forces closing of a modeless dialog for entering data at the beginnig of a procedure. + /// This function is typically called before starting a new cycle + /// in case previous cycle was aborted. + /// + protected void CloseBeginForm() + { + if (StateMachine.Procedure == null || StateMachine.Procedure.DataEntry == null) return; + + GenericDevices.IDataEntry dataEntryCmpnt = + TbfComponents.FindComponent(StateMachine.Procedure.DataEntry) as GenericDevices.IDataEntry; + + if ((dataEntryCmpnt is IHasCycleBeginForm) && + (State.LastEvents.Contains(Event.ModelessFormIsOpen) || State.LastEvents.Contains(Event.ModelessFormClosed))) + { + IList e; + + /// A state without any dataEntryCmpnt operation so that Stop() when entering + /// this state and Start() when entering the following state are executed. + State.Create("MainSeq : Stopping modeless form") + .RemovePermanentOperation(dataEntryCmpnt as IOperation) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + } + while (e.Contains(Event.ModelessFormIsOpen)); + } + } + + + /// + /// Main loop where measurements are collected. + /// + /// false = a flow setting or a switching flow detection, true = measurement + /// Event.MeasurementCompleted, Event.UiCmdStop, Event.Error or Event.Done + protected Event ReadRegistersTempPressAmbient(IList measureOperations, bool realTest) + { + IList e; + + State.Create("Read water meters") + .AddOperation(checkUiOp) + .AddOperations(measureOperations) + .AddOperation(readRegistersOp) + .AddOperation(benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation(realTest ? outPath.Scale.ReadMassOp(ref Mass) : null) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation((StateMachine.Ambient != null) + ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) + : null) + //.AddOperation(realTest ? (ticTac ? queryEnd1 : queryEnd2) : null) + .AddOperation(realTest ? queryEnd1 : null) + .AddOperation(realTest ? processDataLoggingOp : null) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) return Event.Error; + if (TestAndLogUiCmdStop(e)) return Event.UiCmdStop; + if (e.Contains(Event.MeasurementCompleted) || e.Contains(Event.Next)) return Event.MeasurementCompleted; + } + while ( (realTest && !e.Contains(Event.BalanceDone)) || + !e.Contains(Event.ReadAllRegistersDone)); + + return Event.Done; + } + + + /// + /// Update temperature, pressure, water density and ambient values + /// including their statistics in the test results structure. + /// + /// Test results + protected void UpdateTempPressDensAmb(Results.Entities.TestRslt tstRslt) + { + tstRslt.AmbTempMean = (float)AmbTempStat.Average; + tstRslt.AmbTempStart = (float)AmbTempStat.First; + tstRslt.AmbTempEnd = (float)AmbTempStat.Last; + tstRslt.AmbTempMin = (float)AmbTempStat.Min; + tstRslt.AmbTempMax = (float)AmbTempStat.Max; + tstRslt.AmbPressMean = (float)AmbPressStat.Average; + tstRslt.AmbPressStart = (float)AmbPressStat.First; + tstRslt.AmbPressEnd = (float)AmbPressStat.Last; + tstRslt.AmbPressMin = (float)AmbPressStat.Min; + tstRslt.AmbPressMax = (float)AmbPressStat.Max; + tstRslt.AmbHumiMean = (float)AmbHumiStat.Average; + tstRslt.AmbHumiStart = (float)AmbHumiStat.First; + tstRslt.AmbHumiEnd = (float)AmbHumiStat.Last; + tstRslt.AmbHumiMin = (float)AmbHumiStat.Min; + tstRslt.AmbHumiMax = (float)AmbHumiStat.Max; + tstRslt.PressUpMean = (float)PressUpStat.Average; + tstRslt.PressUpStart = (float)PressUpStat.First; + tstRslt.PressUpEnd = (float)PressUpStat.Last; + tstRslt.PressUpMin = (float)PressUpStat.Min; + tstRslt.PressUpMax = (float)PressUpStat.Max; + tstRslt.PressDownMean = (float)PressDownStat.Average; + tstRslt.PressDownStart = (float)PressDownStat.First; + tstRslt.PressDownEnd = (float)PressDownStat.Last; + tstRslt.PressDownMin = (float)PressDownStat.Min; + tstRslt.PressDownMax = (float)PressDownStat.Max; + tstRslt.PressDeltaMean = (float)PressDeltaStat.Average; + tstRslt.PressDeltaStart = (float)PressDeltaStat.First; + tstRslt.PressDeltaEnd = (float)PressDeltaStat.Last; + tstRslt.PressDeltaMin = (float)PressDeltaStat.Min; + tstRslt.PressDeltaMax = (float)PressDeltaStat.Max; + tstRslt.TempUpMean = (float)TempUpStat.Average; + tstRslt.TempUpStart = (float)TempUpStat.First; + tstRslt.TempUpEnd = (float)TempUpStat.Last; + tstRslt.TempUpMin = (float)TempUpStat.Min; + tstRslt.TempUpMax = (float)TempUpStat.Max; + tstRslt.TempDownMean = (float)TempDownStat.Average; + tstRslt.TempDownStart = (float)TempDownStat.First; + tstRslt.TempDownEnd = (float)TempDownStat.Last; + tstRslt.TempDownMin = (float)TempDownStat.Min; + tstRslt.TempDownMax = (float)TempDownStat.Max; + tstRslt.TempDivMean = (float)TempDivStat.Average; + tstRslt.TempDivStart = (float)TempDivStat.First; + tstRslt.TempDivEnd = (float)TempDivStat.Last; + tstRslt.TempDivMin = (float)TempDivStat.Min; + tstRslt.TempDivMax = (float)TempDivStat.Max; + tstRslt.DensityIn = Formulas.WaterDensityFromTempPress(tstRslt.TempUpMean, + tstRslt.PressUpMean, + Program.LocalSettings.RealDensity, + Program.LocalSettings.AtTemperature); /// [kg/m3] + tstRslt.DensityDiv = Formulas.WaterDensityFromTemp(tstRslt.TempDivMean, + Program.LocalSettings.RealDensity, + Program.LocalSettings.AtTemperature); /// [kg/m3] + tstRslt.DensityLine = Formulas.WaterDensityFromTempPress((tstRslt.TempUpMean + tstRslt.TempDownMean) / 2, + (tstRslt.PressUpMean + tstRslt.PressDownMean) / 2, + Program.LocalSettings.RealDensity, + Program.LocalSettings.AtTemperature); /// [kg/m3] + } + + + protected string TestResult2CsvLine(string testName, int part) + { + Results.Entities.TestRslt tstRslt = ProcessData.BatchRslts.GetTestRslt(testName, part); + if (tstRslt == null) return string.Empty; + return TestResult2CsvLine(tstRslt); + } + + + protected string TestResult2CsvLine(Results.Entities.TestRslt tstRslt) + { + bool isPMaxTest = tstRslt.IsPMaxTest(); + bool isStartStop = tstRslt.IsStartStop(); + bool isDiverter = tstRslt.IsDiverter(); + + System.Text.StringBuilder sb = new System.Text.StringBuilder(); + + sb.Append(tstRslt.StartTime); /// A + sb.Append(";"); sb.Append(tstRslt.Batch.BatchNr); /// B + + /// Test information, target values, etc. + sb.Append(";"); sb.Append(tstRslt.Name()); /// C + sb.Append(";"); sb.Append(tstRslt.Repeats()); /// D + sb.Append(";"); sb.Append(tstRslt.RepetitionNr); /// E + sb.Append(";"); sb.Append(tstRslt.Method()); /// F + sb.Append(";"); sb.Append(tstRslt.TargetVolume()); /// G + sb.Append(";"); sb.Append(tstRslt.Qfrom()); /// H + sb.Append(";"); sb.Append(tstRslt.Qto()); /// I + sb.Append(";"); sb.Append(tstRslt.ErrLimLo() + tstRslt.Uncertainty()); /// J + sb.Append(";"); sb.Append(tstRslt.ErrLimHi() - tstRslt.Uncertainty()); /// K + sb.Append(";"); sb.AppendFormat("{0:F1}", tstRslt.TempLimLo()); /// L + sb.Append(";"); sb.AppendFormat("{0:F1}", tstRslt.TempLimHi()); /// M + sb.Append(";"); sb.Append("0"); /// N + sb.Append(";"); sb.Append("16"); /// O + sb.Append(";"); sb.Append((outPath != null && outPath.FlowMeter != null) ? outPath.FlowMeter.Idx1 : 0); /// P + sb.Append(";"); sb.AppendFormat("{0:F4}", Formulas.DistilledWaterDensityFromTemp(tstRslt.AmbTempMean)); /// Q [kg/m3] hustota vody pri teplote okolia z priemernej teploty okolia bez korekcie na realnu hustotu vody + sb.Append(";"); sb.Append((tstRslt.Components != null) ? tstRslt.Components.Scale : string.Empty); /// R + + /// Ambient + sb.Append(";"); sb.AppendFormat("{0:F1}", Units.ConvertTo(Unit.C, tstRslt.AmbTempStart)); /// S [°C] + sb.Append(";"); sb.AppendFormat("{0:F0}", Units.ConvertTo(Unit.mbar, tstRslt.AmbPressStart)); /// T [mbar] + sb.Append(";"); sb.AppendFormat("{0:F1}", Units.ConvertTo(Unit.RPct, tstRslt.AmbHumiStart)); /// U [R%] + + /// Pressure + sb.Append(";"); sb.AppendFormat("{0:F0}", Units.ConvertTo(Unit.kPa, tstRslt.PressUpMean)); /// V [kPa] + sb.Append(";"); sb.AppendFormat("{0:F0}", Units.ConvertTo(Unit.kPa, tstRslt.PressDownMean)); /// W [kPa] + sb.Append(";"); sb.AppendFormat("{0:F1}", Units.ConvertTo(Unit.kPa, tstRslt.PressDeltaMean)); /// X [kPa] + sb.Append(";"); sb.AppendFormat("{0:F0}", Units.ConvertTo(Unit.kPa, tstRslt.PressUpStart)); /// Y [kPa] + sb.Append(";"); sb.AppendFormat("{0:F0}", Units.ConvertTo(Unit.kPa, tstRslt.PressDownStart)); /// Z [kPa] + sb.Append(";"); sb.AppendFormat("{0:F1}", Units.ConvertTo(Unit.kPa, tstRslt.PressDeltaStart)); /// AA [kPa] + sb.Append(";"); sb.AppendFormat("{0:F0}", Units.ConvertTo(Unit.kPa, tstRslt.PressUpEnd)); /// AB [kPa] + sb.Append(";"); sb.AppendFormat("{0:F0}", Units.ConvertTo(Unit.kPa, tstRslt.PressDownEnd)); /// AC [kPa] + sb.Append(";"); sb.AppendFormat("{0:F1}", Units.ConvertTo(Unit.kPa, tstRslt.PressDeltaEnd)); /// AD [kPa] + + /// Temperature + sb.Append(";"); sb.Append(Units.ConvertTo(Unit.C, tstRslt.TempUpMean)); /// AE [°C] + sb.Append(";"); sb.Append(Units.ConvertTo(Unit.C, tstRslt.TempDownMean)); /// AF [°C] + sb.Append(";"); sb.Append(Units.ConvertTo(Unit.C, tstRslt.TempDivMean)); /// AG [°C] + sb.Append(";"); sb.Append(Units.ConvertTo(Unit.C, tstRslt.Custom1)); /// AH [°C] T hi mean + sb.Append(";"); sb.Append(Units.ConvertTo(Unit.C, tstRslt.Custom6)); /// AI [°C] T lo mean + sb.Append(";"); sb.Append(Units.ConvertTo(Unit.C, tstRslt.TempUpStart)); /// AJ [°C] + sb.Append(";"); sb.Append(Units.ConvertTo(Unit.C, tstRslt.TempDownStart)); /// AK [°C] + sb.Append(";"); sb.Append(Units.ConvertTo(Unit.C, tstRslt.TempDivStart)); /// AL [°C] + sb.Append(";"); sb.Append(Units.ConvertTo(Unit.C, tstRslt.Custom2)); /// AM [°C] T hi start + sb.Append(";"); sb.Append(Units.ConvertTo(Unit.C, tstRslt.Custom7)); /// AN [°C] T lo start + sb.Append(";"); sb.Append(Units.ConvertTo(Unit.C, tstRslt.TempUpEnd)); /// AO [°C] + sb.Append(";"); sb.Append(Units.ConvertTo(Unit.C, tstRslt.TempDownEnd)); /// AP [°C] + sb.Append(";"); sb.Append(Units.ConvertTo(Unit.C, tstRslt.TempDivEnd)); /// AQ [°C] + sb.Append(";"); sb.Append(Units.ConvertTo(Unit.C, tstRslt.Custom3)); /// AR [°C] T hi end + sb.Append(";"); sb.Append(Units.ConvertTo(Unit.C, tstRslt.Custom8)); /// AS [°C] T lo end + + /// Mass + sb.Append(";"); sb.Append(tstRslt.MassStartRaw); /// AT [kg] + sb.Append(";"); sb.Append(tstRslt.MassStart); /// AU [kg] + sb.Append(";"); sb.Append(tstRslt.MassEndRaw); /// AV [kg] + sb.Append(";"); sb.Append(tstRslt.MassEnd); /// AW [kg] + sb.Append(";"); sb.Append(tstRslt.MassEnd - tstRslt.MassStart); /// AX [kg] + + /// Density and buoyancy + sb.Append(";"); sb.Append(tstRslt.DensityDiv); /// AY [kg/m3] + sb.Append(";"); sb.Append((tstRslt.TempUpMean + tstRslt.TempDownMean) / 2); /// AZ [kg/m3] + sb.Append(";"); sb.Append(tstRslt.DensityLine); /// BA [kg/m3] + sb.Append(";"); sb.Append(" "); /// BB d_air: Hustota vzduchu: Sheet1 - K9 + sb.Append(";"); sb.Append(tstRslt.Buoyancy); /// BC Buoyancy: Sheet1 - X9 + + sb.Append(";"); sb.Append(Program.LocalSettings.RealDensity); /// BD + sb.Append(";"); sb.Append(Program.LocalSettings.AtTemperature); /// BE + sb.Append(";"); sb.Append(tstRslt.FlowMax); /// BF pipe expansion: teraz vynechat + sb.Append(";"); sb.Append(tstRslt.FlowMin); /// BG Qm [kg/h] + sb.Append(";"); sb.Append(tstRslt.FlowVolume); /// BH Qv [l/h] + sb.Append(";"); sb.Append(tstRslt.VolumeCTV); /// BI Vet . . . komercne prava hodnota - podla vahy + sb.Append(";"); sb.Append(tstRslt.VolumeMaster); /// BJ Velm . . . . objem podla etalonu + sb.Append(";"); sb.Append(" "); /// BK Vmass . . . objem podla druheho etalonu / prietokomeru pred tratou (teraz vynechavame) + sb.Append(";"); sb.Append(tstRslt.TestTime); /// BL t + sb.Append(";"); sb.Append(tstRslt.ErrorMaster); /// BM Eelm . . . chyba etalonu voci komercne pravej hodnote + sb.Append(";"); sb.Append(" "); /// BN Emass . . . chyba druheho etalonu voci komercne pravej hodnote (teraz vynechavame) + sb.Append(";"); sb.Append((outPath != null && outPath.FlowMeter != null && outPath.FlowMeter.LtrPerPulse != 0) ? (1.0f / outPath.FlowMeter.LtrPerPulse) : 0); + /// BO Const.MID . konstanta eatlonu + sb.Append(";"); sb.Append(" "); /// BP Const.MA . . konstanta druheho etalonu + + sb.Append(";"); sb.AppendFormat("{0:F0}", isDiverter ? 1000.0F * tstRslt.DiverterStart : 0); /// BQ [ms] Diverter start time + sb.Append(";"); sb.AppendFormat("{0:F0}", isDiverter ? 1000.0F * tstRslt.DiverterEnd : 0); /// BR [ms] Diverter end time + sb.Append(";"); sb.AppendFormat("{0:F0}", isStartStop ? 1000.0F * tstRslt.DiverterStart : 0); /// BS [ms] Start valve open time + sb.Append(";"); sb.AppendFormat("{0:F0}", isStartStop ? 1000.0F * tstRslt.DiverterEnd : 0); /// BT [ms] Start valve close time + sb.Append(";"); sb.Append(tstRslt.TempUpMax); /// BU [°C] + sb.Append(";"); sb.Append(tstRslt.TempDownMax); /// BV [°C] + sb.Append(";"); sb.Append(tstRslt.TempUpMin); /// BW [°C] + sb.Append(";"); sb.Append(tstRslt.TempDownMin); /// BX [°C] + sb.Append(";"); sb.Append(isPMaxTest ? tstRslt.TestTime : 0); /// BY [s] Duration of the pressure test + sb.Append(";"); sb.AppendFormat("{0:F1}", Units.ConvertTo(Unit.C, tstRslt.AmbTempEnd)); /// BZ [°C] + sb.Append(";"); sb.AppendFormat("{0:F0}", Units.ConvertTo(Unit.mbar, tstRslt.AmbPressEnd)); /// CA [mbar] + sb.Append(";"); sb.AppendFormat("{0:F1}", Units.ConvertTo(Unit.RPct, tstRslt.AmbHumiEnd)); /// CB [R%] + + sb.Append(";"); sb.Append(tstRslt.PulsesMaster); /// CC Celkovy pocet et. pulzov skusky + sb.Append(";"); sb.Append(" "); /// CD - '' - pre druhy + for (int i = 0; i < ProcessData.BatchRslts.WMPositionsCount; i++) + { + if (ProcessData.BatchRslts.WaterMeters[i] != null) + { + if (!ProcessData.BatchRslts.WaterMeters[i].Compound() && !ProcessData.BatchRslts.WaterMeters[i].HeatMeter()) + { + /// If this is a single meter + + Results.Entities.MeterTestRslt mtrRslt = ProcessData.BatchRslts.GetMeterTestRslt(tstRslt.Name(), i, CompoundMeterId.Single); + + if (mtrRslt != null) + { + bool isCamera = (mtrRslt.RegReaderType == (int)RegisterReaderType.Camera); + + sb.Append(";"); sb.Append(ProcessData.BatchRslts.WaterMeters[i].SerialNr); /// CE WM Ser.No. + sb.Append(";"); sb.Append(mtrRslt.VolumeStart); /// CF WM Vstart - pociatocny stav pri pevnom starte alebo zachyteny pri data streame + sb.Append(";"); sb.Append(mtrRslt.VolumeEnd); /// CG WM Vend - konecny stav pri pevnom starte alebo zachyteny pri data streame + sb.Append(";"); sb.Append(mtrRslt.VolumeMeter); /// CH WM Vmer - objem namerany vodomerom + sb.Append(";"); sb.Append(mtrRslt.VolumeRef); /// CI WM Vref - objem namerany stanicou + sb.Append(";"); sb.Append(mtrRslt.Error); /// CJ WM Emt - chyba vodomerom nameraneho objemu +#if IPERL + sb.Append(";"); sb.Append(ProcessData.BatchRslts.WaterMeters[i].CalibFactor); /// CK iPerl calibration factor used during the test / ... +#else + sb.Append(";"); sb.Append(" "); /// CK nechat prazdne +#endif + sb.Append(";"); sb.Append(mtrRslt.PulsesMeter); /// CL WM Np met - pocet impulzov zo skusaneho meradla + sb.Append(";"); sb.Append(mtrRslt.PulsesMaster); /// CM WM Np elm - pocet impulzov etalonu pocas merania pre prislusny vodomer + sb.Append(";"); sb.Append(mtrRslt.TestTime); /// CN WM Tmet - cas merania (obmedzany pri synchro skuske) + sb.Append(";"); sb.Append(mtrRslt.Passed ? "OK" : "NOK"); /// CO WM Vysledok (t.j. ci je v hraniciach chyb) - OK/NOK +#if IPERL + sb.Append(";"); sb.Append(mtrRslt.WaterMeter.Q2Correction.ToString("F1")); /// CP iPerl Q2 correction factor used during the test / AN value - hodnota z analogoveho prevodnika +#else + sb.Append(";"); sb.Append(mtrRslt.PulsesPerLiter); /// CP Pulses per liter +#endif + sb.Append(";"); sb.Append(isCamera ? mtrRslt.VolumeStart * mtrRslt.PulsesPerLiter : 0); /// CQ WM Phi_start - pri hodnotach z kamery + sb.Append(";"); sb.Append(isCamera ? mtrRslt.VolumeEnd * mtrRslt.PulsesPerLiter : 0); /// CR WM Phi_end - ' ' - + sb.Append(";"); sb.Append(isCamera ? mtrRslt.TimestampStart : 0); /// CS WM Time_start - ' ' - + sb.Append(";"); sb.Append(isCamera ? mtrRslt.TimestampEnd : 0); /// CT WM Time_end - ' ' - + sb.Append(";"); sb.Append(isCamera ? mtrRslt.PulsesPerLiter : 0); /// CU WM Degree per liter + + sb.Append(";"); sb.Append(0); /// CV Analog out 1 (max mA) + sb.Append(";"); sb.Append(0); /// CW Analog out 2 (V) + sb.Append(";"); sb.Append(0); /// CX Analog out 3 (min mA) + sb.Append(";"); sb.Append(0); /// CY Analog out 4 (max Q) + } + } + else if (ProcessData.BatchRslts.WaterMeters[i].Compound()) + { + /// Else if this is a compound meter + + for (byte b = (byte)CompoundMeterId.CompoundMain; b <= (byte)CompoundMeterId.Compound; b++) + { + Results.Entities.MeterTestRslt mtrRslt = ProcessData.BatchRslts.GetMeterTestRslt(tstRslt.Name(), i, (CompoundMeterId)b); + + if (mtrRslt != null) + { + sb.Append(";"); + switch ((CompoundMeterId)b) + { + case CompoundMeterId.CompoundMain: + sb.Append(ProcessData.BatchRslts.WaterMeters[i].SerialNr); /// CE + break; + case CompoundMeterId.CompoundAux: + sb.Append(ProcessData.BatchRslts.WaterMeters[i].SerialNrAux); /// CE + break; + case CompoundMeterId.Compound: + sb.Append(ProcessData.BatchRslts.WaterMeters[i].SerialNr); /// CE + break; + } + sb.Append(";"); sb.Append(mtrRslt.VolumeStart); /// CF WM Vinit - pri pevnom starte pociatocny stav natukany alebo cez inteligentny system + sb.Append(";"); sb.Append(mtrRslt.VolumeEnd); /// CG WM Vfin - pri pevnom starte konecny stav natukany alebo cez inteligentny system + sb.Append(";"); sb.Append(mtrRslt.VolumeMeter); /// CH WM Vmer - objem namerany vodomerom + sb.Append(";"); sb.Append(mtrRslt.VolumeRef); /// CI WM Vet - objem namerany stanicou + sb.Append(";"); sb.Append(mtrRslt.Error); /// CJ WM Emt - chyba vodomerom nameraneho objemu + sb.Append(";"); sb.Append(" "); /// CK WM U - neistota (zatial nechat prazdne) + sb.Append(";"); sb.Append(mtrRslt.PulsesMeter); /// CL WM Np met - pocet impulzov zo skusaneho meradla + sb.Append(";"); sb.Append(mtrRslt.PulsesMaster); /// CM WM Np elm - pocet impulzov etalonu pocas merania pre prislusny vodomer + sb.Append(";"); sb.Append(mtrRslt.TestTime); /// CN WM Tmet - cas merania (obmedzany pri synchro skuske) + sb.Append(";"); sb.Append(mtrRslt.Passed ? "OK" : "NOK"); /// CO WM Vysledok (t.j. ci je v hraniciach chyb) - OK/NOK + sb.Append(";"); sb.Append(" "); /// CP WM AN value - hodnota z analogoveho prevodnika (teraz nic) + + bool isCamera = mtrRslt.IsCamera(); + sb.Append(";"); sb.Append(isCamera ? mtrRslt.VolumeStart * mtrRslt.PulsesPerLiter : 0); /// CQ WM Phi_start - pri hodnotach z kamery + sb.Append(";"); sb.Append(isCamera ? mtrRslt.VolumeEnd * mtrRslt.PulsesPerLiter : 0); /// CR WM Phi_end - ' ' - + sb.Append(";"); sb.Append(isCamera ? mtrRslt.TimestampStart : 0); /// CS WM Time_start - ' ' - + sb.Append(";"); sb.Append(isCamera ? mtrRslt.TimestampEnd : 0); /// CT WM Time_end - ' ' - + sb.Append(";"); sb.Append(isCamera ? mtrRslt.PulsesPerLiter : 0); /// CU WM Degree per liter + + sb.Append(";"); sb.Append(0); /// CV Analog out 1 (max mA) + sb.Append(";"); sb.Append(0); /// CW Analog out 2 (V) + sb.Append(";"); sb.Append(0); /// CX Analog out 3 (min mA) + sb.Append(";"); sb.Append(0); /// CY Analog out 4 (max Q) + } + } + } + else /// if (ProcessData.BatchRslts.WaterMeters[i].HeatMeter()) + { + /// Else this is a heat meter + + Results.Entities.MeterTestRslt volumeMtr = ProcessData.BatchRslts.GetMeterTestRslt(tstRslt.Name(), i, CompoundMeterId.HeatMeterVolume); + Results.Entities.MeterTestRslt energyMtr = ProcessData.BatchRslts.GetMeterTestRslt(tstRslt.Name(), i, CompoundMeterId.HeatMeterEnergy); + + if (volumeMtr != null) + { + sb.Append(";"); sb.Append(ProcessData.BatchRslts.WaterMeters[i].SerialNr); /// WM Ser.No. + sb.Append(";"); sb.Append(volumeMtr.VolumeStart); /// WM Vstart - pociatocny stav pri pevnom starte alebo zachyteny pri data streame + sb.Append(";"); sb.Append(volumeMtr.VolumeEnd); /// WM Vend - konecny stav pri pevnom starte alebo zachyteny pri data streame + sb.Append(";"); sb.Append(volumeMtr.VolumeMeter); /// WM Vmer - objem namerany vodomerom + sb.Append(";"); sb.Append(volumeMtr.VolumeRef); /// WM Vref - objem namerany stanicou + sb.Append(";"); sb.Append(volumeMtr.Error); /// WM Emt - chyba vodomerom nameraneho objemu +#if IPERL + sb.Append(";"); sb.Append(ProcessData.BatchRslts.WaterMeters[i].CalibFactor); /// iPerl calibration factor used during the test / ... +#else + sb.Append(";"); sb.Append(" "); /// nechat prazdne +#endif + sb.Append(";"); sb.Append(volumeMtr.PulsesMeter); /// WM Np met - pocet impulzov zo skusaneho meradla + sb.Append(";"); sb.Append(volumeMtr.PulsesMaster); /// WM Np elm - pocet impulzov etalonu pocas merania pre prislusny vodomer + sb.Append(";"); sb.Append(volumeMtr.TestTime); /// WM Tmet - cas merania (obmedzany pri synchro skuske) + sb.Append(";"); sb.Append(volumeMtr.Passed ? "OK" : "NOK"); /// WM Vysledok (t.j. ci je v hraniciach chyb) - OK/NOK +#if IPERL + sb.Append(";"); sb.Append(volumeMtr.WaterMeter.Q2Correction.ToString("F1")); /// iPerl Q2 correction factor used during the test / AN value - hodnota z analogoveho prevodnika +#else + sb.Append(";"); sb.Append(" "); /// nechat prazdne +#endif + sb.Append(";"); sb.Append(volumeMtr.VolumeStart); /// WM Volume_start - pri datastreamovych hodnotach (alebo kamera) + sb.Append(";"); sb.Append(volumeMtr.TimestampStart); /// WM Time_start - ' ' - + sb.Append(";"); sb.Append(volumeMtr.VolumeEnd); /// WM Volume_end - ' ' - + sb.Append(";"); sb.Append(volumeMtr.TimestampEnd); /// WM Time_end - ' ' - + } + + if (energyMtr != null) + { + sb.Append(";"); sb.Append(ProcessData.BatchRslts.WaterMeters[i].SerialNr); /// WM Ser.No. + sb.Append(";"); sb.Append(energyMtr.VolumeStart); /// WM Vstart - pociatocny stav pri pevnom starte alebo zachyteny pri data streame + sb.Append(";"); sb.Append(energyMtr.VolumeEnd); /// WM Vend - konecny stav pri pevnom starte alebo zachyteny pri data streame + sb.Append(";"); sb.Append(energyMtr.VolumeMeter); /// WM Vmer - objem namerany vodomerom + sb.Append(";"); sb.Append(energyMtr.VolumeRef); /// WM Vref - objem namerany stanicou + sb.Append(";"); sb.Append(energyMtr.Error); /// WM Emt - chyba vodomerom nameraneho objemu +#if IPERL + sb.Append(";"); sb.Append(ProcessData.BatchRslts.WaterMeters[i].CalibFactor); /// iPerl calibration factor used during the test / ... +#else + sb.Append(";"); sb.Append(" "); /// nechat prazdne +#endif + sb.Append(";"); sb.Append(energyMtr.PulsesMeter); /// WM Np met - pocet impulzov zo skusaneho meradla + sb.Append(";"); sb.Append(energyMtr.PulsesMaster); /// WM Np elm - pocet impulzov etalonu pocas merania pre prislusny vodomer + sb.Append(";"); sb.Append(energyMtr.TestTime); /// WM Tmet - cas merania (obmedzany pri synchro skuske) + sb.Append(";"); sb.Append(energyMtr.Passed ? "OK" : "NOK"); /// WM Vysledok (t.j. ci je v hraniciach chyb) - OK/NOK +#if IPERL + sb.Append(";"); sb.Append(energyMtr.WaterMeter.Q2Correction.ToString("F1")); /// iPerl Q2 correction factor used during the test / AN value - hodnota z analogoveho prevodnika +#else + sb.Append(";"); sb.Append(" "); /// nechat prazdne +#endif + sb.Append(";"); sb.Append(energyMtr.VolumeStart); /// WM Volume_start - pri datastreamovych hodnotach (alebo kamera) + sb.Append(";"); sb.Append(energyMtr.TimestampStart); /// WM Time_start - ' ' - + sb.Append(";"); sb.Append(energyMtr.VolumeEnd); /// WM Volume_end - ' ' - + sb.Append(";"); sb.Append(energyMtr.TimestampEnd); /// WM Time_end - ' ' - + } + } + } + } + sb.Append(";"); + + return sb.ToString(); + } + + + /// + /// Create a simulated test result (single meter). + /// + /// Test to be simulated + /// Test result + protected void MakeSimulated(Config.Entities.Test test, int repetitionNr, int part, float errorPctBase) + { + string fullTestName = Results.Utils.GetTestName(test.Name, test.Repeats, repetitionNr); + + Results.Entities.TestRslt tstRslt = ProcessData.BatchRslts.GetTestRslt(fullTestName, part); + + if (tstRslt == null) return; /// Prevent program crash in certain cases + + tstRslt.MethodClass = TbfComponents.FindComponent(test.Method).ClassName; + tstRslt.StartTime = DateTime.Now; + tstRslt.EndTime = DateTime.Now + new TimeSpan(0,0,1); + tstRslt.FlowSetTime = 10; + tstRslt.TestTime = tstRslt.TargetTime(); + /// TODO: Verify whether 'ltrPerRefPulse' is up to date + tstRslt.PulsesMaster = (LtrPerRefPulse > 1E-6) ? (tstRslt.TargetVolume() / LtrPerRefPulse) : 1; + tstRslt.ConstMasterRaw = LtrPerRefPulse; + tstRslt.ConstMaster = LtrPerRefPulse; + tstRslt.MassStartRaw = 0; + tstRslt.MassStart = 0; + tstRslt.MassEndRaw = tstRslt.TargetVolume() * Program.LocalSettings.RealDensity / 1000.0f; + tstRslt.MassEnd = tstRslt.MassEndRaw; + tstRslt.DensityIn = Program.LocalSettings.RealDensity; + tstRslt.DensityLine = Program.LocalSettings.RealDensity; + tstRslt.DensityDiv = Program.LocalSettings.RealDensity; + tstRslt.Buoyancy = Formulas.Buoyancy(); + tstRslt.FlowMass = 3600.0 * tstRslt.MassEnd / tstRslt.TargetTime(); + tstRslt.FlowVolume = 3.6 * tstRslt.TargetVolume() / tstRslt.TargetTime(); + tstRslt.VolumeCTV = tstRslt.TargetVolume(); + tstRslt.VolumeMaster = tstRslt.TargetVolume(); + tstRslt.ErrorMaster = 0; + + tstRslt.AmbTempMean = 20.0f; + tstRslt.AmbPressMean = 1.0f; + tstRslt.AmbHumiMean = 50.0f; + + tstRslt.PressUpStart = 1.0f; + tstRslt.PressDownStart = 1.0f; + tstRslt.TempUpStart = 20.0f; + tstRslt.TempDownStart = 20.0f; + tstRslt.TempDivStart = 20.0f; + tstRslt.PressUpEnd = 1.0f; + tstRslt.PressDownEnd = 1.0f; + tstRslt.TempUpEnd = 20.0f; + tstRslt.TempDownEnd = 20.0f; + tstRslt.TempDivEnd = 20.0f; + tstRslt.PressUpMean = 1.0f; + tstRslt.PressDownMean = 1.0f; + tstRslt.TempUpMean = 20.0f; + tstRslt.TempDownMean = 20.0f; + tstRslt.TempDivMean = 20.0f; + tstRslt.PressUpMin = 1.0f; + tstRslt.PressDownMin = 1.0f; + tstRslt.TempUpMin = 20.0f; + tstRslt.TempDownMin = 20.0f; + tstRslt.TempDivMin = 20.0f; + tstRslt.PressUpMax = 1.0f; + tstRslt.PressDownMax = 1.0f; + tstRslt.TempUpMax = 20.0f; + tstRslt.TempDownMax = 20.0f; + tstRslt.TempDivMax = 20.0f; + + tstRslt.FlowMean = (float)RefFlowStat.Average; + tstRslt.FlowStart = (float)RefFlowStat.First; + tstRslt.FlowEnd = (float)RefFlowStat.Last; + tstRslt.FlowMin = (float)RefFlowStat.Min; + tstRslt.FlowMax = (float)RefFlowStat.Max; + + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + float errorPct = errorPctBase + 0.05f * i; + + Results.Entities.MeterTestRslt meterRslt = ProcessData.BatchRslts.GetMeterTestRslt(fullTestName, i, CompoundMeterId.Single); + IRegisterReader regReader = sensPath.RegisterReaders[i]; + + if (meterRslt != null && regReader != null) + { + meterRslt.VolumeMeter = tstRslt.TargetVolume() * (1.0 + 0.01 * errorPct); + + meterRslt.PulsesMeter = regReader.PulsesPerLtr * meterRslt.VolumeMeter; + meterRslt.PulsesMaster = tstRslt.PulsesMaster; + meterRslt.PulsesPerLiter = regReader.PulsesPerLtr; + meterRslt.VolumeStart = 0; + meterRslt.VolumeEnd = meterRslt.VolumeMeter; + meterRslt.VolumeRef = tstRslt.TargetVolume(); + meterRslt.TimestampStart = 0; + meterRslt.TimestampEnd = tstRslt.TargetTime(); + meterRslt.TestTime = tstRslt.TargetTime(); + meterRslt.Error = errorPct; + meterRslt.Passed = (errorPct >= tstRslt.ErrLimLo() + tstRslt.Uncertainty()) + && (errorPct <= tstRslt.ErrLimHi() - tstRslt.Uncertainty()); + meterRslt.TestDone = true; + tstRslt.TestDone = true; + } + } + + tstRslt.Components = Results.Entities.Components + .UpdateList(BatchRslts.ComponentsList, + new Results.Entities.Components((BenchInfo != null) ? BenchInfo.TestBenchId : 1, + (BenchInfo != null) ? BenchInfo.TestBenchName : "testbench", + inPath.Pump != null ? inPath.Pump.Name : string.Empty, + outPath.FlowMeter != null ? outPath.FlowMeter.Name : string.Empty, + outPath.Scale != null ? outPath.Scale.Name : string.Empty, + outPath.RegulValve != null ? outPath.RegulValve.Name : string.Empty, + outPath.Diverter != null ? outPath.Diverter.Name : string.Empty)); + } + + + /// + /// Create a simulated test result (compound meter). + /// + /// Test to be simulated + /// Test result + protected void MakeSimulatedCompound(Config.Entities.Test test, int repetitionNr, int part, float errorPct, float mainPart) + { + string fullTestName = Results.Utils.GetTestName(test.Name, test.Repeats, repetitionNr); + + Results.Entities.TestRslt tstRslt = ProcessData.BatchRslts.GetTestRslt(fullTestName, part); + + tstRslt.MethodClass = TbfComponents.FindComponent(test.Method).ClassName; + tstRslt.StartTime = DateTime.Now; + tstRslt.EndTime = DateTime.Now + new TimeSpan(0, 0, 1); + tstRslt.FlowSetTime = 10; + tstRslt.TestTime = tstRslt.TargetTime(); + /// TODO: Verify whether 'ltrPerRefPulse' is up to date + tstRslt.PulsesMaster = (LtrPerRefPulse > 1E-6) ? (tstRslt.TargetVolume() / LtrPerRefPulse) : 1; + tstRslt.ConstMasterRaw = LtrPerRefPulse; + tstRslt.ConstMaster = LtrPerRefPulse; + tstRslt.MassStartRaw = 0; + tstRslt.MassStart = 0; + tstRslt.MassEndRaw = tstRslt.TargetVolume() * Program.LocalSettings.RealDensity / 1000.0f; + tstRslt.MassEnd = tstRslt.MassEndRaw; + tstRslt.DensityIn = Program.LocalSettings.RealDensity; + tstRslt.DensityLine = Program.LocalSettings.RealDensity; + tstRslt.DensityDiv = Program.LocalSettings.RealDensity; + tstRslt.Buoyancy = Formulas.Buoyancy(); + tstRslt.FlowMass = tstRslt.MassEnd / tstRslt.TargetTime(); + tstRslt.FlowVolume = tstRslt.TargetVolume() / tstRslt.TargetTime(); + tstRslt.VolumeCTV = tstRslt.TargetVolume(); + tstRslt.VolumeMaster = tstRslt.TargetVolume(); + tstRslt.ErrorMaster = 0; + + tstRslt.AmbTempMean = 20.0f; + tstRslt.AmbPressMean = 1.0f; + tstRslt.AmbHumiMean = 50.0f; + + tstRslt.PressUpStart = 1.0f; + tstRslt.PressDownStart = 1.0f; + tstRslt.TempUpStart = 20.0f; + tstRslt.TempDownStart = 20.0f; + tstRslt.TempDivStart = 20.0f; + tstRslt.PressUpEnd = 1.0f; + tstRslt.PressDownEnd = 1.0f; + tstRslt.TempUpEnd = 20.0f; + tstRslt.TempDownEnd = 20.0f; + tstRslt.TempDivEnd = 20.0f; + tstRslt.PressUpMean = 1.0f; + tstRslt.PressDownMean = 1.0f; + tstRslt.TempUpMean = 20.0f; + tstRslt.TempDownMean = 20.0f; + tstRslt.TempDivMean = 20.0f; + tstRslt.PressUpMin = 1.0f; + tstRslt.PressDownMin = 1.0f; + tstRslt.TempUpMin = 20.0f; + tstRslt.TempDownMin = 20.0f; + tstRslt.TempDivMin = 20.0f; + tstRslt.PressUpMax = 1.0f; + tstRslt.PressDownMax = 1.0f; + tstRslt.TempUpMax = 20.0f; + tstRslt.TempDownMax = 20.0f; + tstRslt.TempDivMax = 20.0f; + + tstRslt.FlowMean = (float)RefFlowStat.Average; + tstRslt.FlowStart = (float)RefFlowStat.First; + tstRslt.FlowEnd = (float)RefFlowStat.Last; + tstRslt.FlowMin = (float)RefFlowStat.Min; + tstRslt.FlowMax = (float)RefFlowStat.Max; + + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + Results.Entities.MeterTestRslt compoundRslt = ProcessData.BatchRslts.GetMeterTestRslt(fullTestName, i, CompoundMeterId.Compound); + Results.Entities.MeterTestRslt mainRslt = ProcessData.BatchRslts.GetMeterTestRslt(fullTestName, i, CompoundMeterId.CompoundMain); + Results.Entities.MeterTestRslt auxRslt = ProcessData.BatchRslts.GetMeterTestRslt(fullTestName, i, CompoundMeterId.CompoundAux); + + double compoundVolume = tstRslt.TargetVolume() * (1.0 + 0.01 * errorPct); + double mainVolume = compoundVolume * mainPart; + double auxVolume = compoundVolume * (1.0 - mainPart); + + for (int isAux = 0; isAux <= 1; isAux++) /// 0=main, 1=aux + { + GenericDevices.IRegisterReader regReader = sensPath.RegisterReaders[2 * i + isAux]; + Results.Entities.MeterTestRslt meterRslt = (isAux == 0) ? mainRslt : auxRslt; + + if (meterRslt != null && regReader != null) + { + meterRslt.VolumeMeter = (isAux == 0) ? mainVolume : auxVolume; + + meterRslt.PulsesMeter = regReader.PulsesPerLtr * meterRslt.VolumeMeter; + meterRslt.PulsesMaster = tstRslt.PulsesMaster; + meterRslt.PulsesPerLiter = regReader.PulsesPerLtr; + meterRslt.VolumeStart = 0; + meterRslt.VolumeEnd = meterRslt.VolumeMeter; + meterRslt.VolumeRef = tstRslt.TargetVolume(); + meterRslt.TimestampStart = 0; + meterRslt.TimestampEnd = tstRslt.TargetTime(); + meterRslt.TestTime = tstRslt.TargetTime(); + meterRslt.Error = Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, tstRslt.VolumeCTV); + meterRslt.Passed = (errorPct >= tstRslt.ErrLimLo() + tstRslt.Uncertainty()) + && (errorPct <= tstRslt.ErrLimHi() - tstRslt.Uncertainty()); + meterRslt.TestDone = true; + } + } + + compoundRslt.VolumeRef = tstRslt.VolumeCTV; /// [l] must be calculated before main & aux. meter error + compoundRslt.VolumeMeter = mainRslt.VolumeMeter + auxRslt.VolumeMeter; + + compoundRslt.PulsesMaster = tstRslt.PulsesMaster; + compoundRslt.TestTime = tstRslt.TargetTime(); + compoundRslt.Error = Formulas.ErrorFromVolumes(compoundRslt.VolumeMeter, tstRslt.VolumeCTV); + compoundRslt.Passed = (compoundRslt.Error >= tstRslt.ErrLimLo() + tstRslt.Uncertainty()) + && (compoundRslt.Error <= tstRslt.ErrLimHi() - tstRslt.Uncertainty()); + compoundRslt.TestDone = true; + tstRslt.TestDone = true; + } + + tstRslt.Components = Results.Entities.Components + .UpdateList(BatchRslts.ComponentsList, + new Results.Entities.Components((BenchInfo != null) ? BenchInfo.TestBenchId : 1, + (BenchInfo != null) ? BenchInfo.TestBenchName : "testbench", + inPath.Pump != null ? inPath.Pump.Name : string.Empty, + outPath.FlowMeter != null ? outPath.FlowMeter.Name : string.Empty, + outPath.Scale != null ? outPath.Scale.Name : string.Empty, + outPath.RegulValve != null ? outPath.RegulValve.Name : string.Empty, + outPath.Diverter != null ? outPath.Diverter.Name : string.Empty)); + } + + + /// + /// Create a simulated test result (heat meters). + /// + /// Test to be simulated + /// Test result + protected void MakeSimulatedHeatMeters(Config.Entities.Test test, int repetitionNr, int part, float errorPct, double energy, float energyErrLimLo, float energyErrLimHi, bool evaluateVolume) + { + string fullTestName = Results.Utils.GetTestName(test.Name, test.Repeats, repetitionNr); + + Results.Entities.TestRslt tstRslt = ProcessData.BatchRslts.GetTestRslt(fullTestName, part); + + tstRslt.MethodClass = TbfComponents.FindComponent(test.Method).ClassName; + tstRslt.StartTime = DateTime.Now; + tstRslt.EndTime = DateTime.Now + new TimeSpan(0, 0, 1); + tstRslt.FlowSetTime = 10; + tstRslt.TestTime = tstRslt.TargetTime(); + /// TODO: Verify whether 'ltrPerRefPulse' is up to date + tstRslt.PulsesMaster = (LtrPerRefPulse > 1E-6) ? (tstRslt.TargetVolume() / LtrPerRefPulse) : 1; + tstRslt.ConstMasterRaw = LtrPerRefPulse; + tstRslt.ConstMaster = LtrPerRefPulse; + tstRslt.MassStartRaw = 0; + tstRslt.MassStart = 0; + tstRslt.MassEndRaw = tstRslt.TargetVolume() * Program.LocalSettings.RealDensity / 1000.0f; + tstRslt.MassEnd = tstRslt.MassEndRaw; + tstRslt.DensityIn = Program.LocalSettings.RealDensity; + tstRslt.DensityLine = Program.LocalSettings.RealDensity; + tstRslt.DensityDiv = Program.LocalSettings.RealDensity; + tstRslt.Buoyancy = Formulas.Buoyancy(); + tstRslt.FlowMass = tstRslt.MassEnd / tstRslt.TargetTime(); + tstRslt.FlowVolume = tstRslt.TargetVolume() / tstRslt.TargetTime(); + tstRslt.VolumeCTV = tstRslt.TargetVolume(); + tstRslt.VolumeMaster = tstRslt.TargetVolume(); + tstRslt.ErrorMaster = 0; + + tstRslt.AmbTempMean = 20.0f; + tstRslt.AmbPressMean = 1.0f; + tstRslt.AmbHumiMean = 50.0f; + + tstRslt.PressUpStart = 1.0f; + tstRslt.PressDownStart = 1.0f; + tstRslt.TempUpStart = 20.0f; + tstRslt.TempDownStart = 20.0f; + tstRslt.TempDivStart = 20.0f; + tstRslt.PressUpEnd = 1.0f; + tstRslt.PressDownEnd = 1.0f; + tstRslt.TempUpEnd = 20.0f; + tstRslt.TempDownEnd = 20.0f; + tstRslt.TempDivEnd = 20.0f; + tstRslt.PressUpMean = 1.0f; + tstRslt.PressDownMean = 1.0f; + tstRslt.TempUpMean = 20.0f; + tstRslt.TempDownMean = 20.0f; + tstRslt.TempDivMean = 20.0f; + tstRslt.PressUpMin = 1.0f; + tstRslt.PressDownMin = 1.0f; + tstRslt.TempUpMin = 20.0f; + tstRslt.TempDownMin = 20.0f; + tstRslt.TempDivMin = 20.0f; + tstRslt.PressUpMax = 1.0f; + tstRslt.PressDownMax = 1.0f; + tstRslt.TempUpMax = 20.0f; + tstRslt.TempDownMax = 20.0f; + tstRslt.TempDivMax = 20.0f; + + tstRslt.FlowMean = 0; /// TODO + tstRslt.FlowMax = 0; /// TODO + + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + Results.Entities.MeterTestRslt energyRslt = ProcessData.BatchRslts.GetMeterTestRslt(fullTestName, i, CompoundMeterId.HeatMeterEnergy); + Results.Entities.MeterTestRslt volumeRslt = ProcessData.BatchRslts.GetMeterTestRslt(fullTestName, i, CompoundMeterId.HeatMeterVolume); + + GenericDevices.IRegisterReader volumeRegReader = (sensPath.RegisterReaders.Length > 2 * i) ? sensPath.RegisterReaders[2 * i] : null; + GenericDevices.IRegisterReader energyRegReader = (sensPath.RegisterReaders.Length > 2 * i + 1) ? sensPath.RegisterReaders[2 * i + 1] : null; + + double volumeMeter = tstRslt.TargetVolume() * (1.0 + 0.01 * errorPct); + double energyMeter = energy * (1.0 + 0.01 * errorPct); + + if (volumeRslt != null && volumeRegReader != null) + { + volumeRslt.VolumeMeter = volumeMeter; + + volumeRslt.PulsesMeter = volumeRegReader.PulsesPerLtr * volumeMeter; + volumeRslt.PulsesMaster = tstRslt.PulsesMaster; + volumeRslt.PulsesPerLiter = volumeRegReader.PulsesPerLtr; + volumeRslt.VolumeStart = 0; + volumeRslt.VolumeEnd = volumeMeter; + volumeRslt.VolumeRef = tstRslt.TargetVolume(); + volumeRslt.TimestampStart = 0; + volumeRslt.TimestampEnd = tstRslt.TargetTime(); + volumeRslt.TestTime = tstRslt.TargetTime(); + volumeRslt.Error = Formulas.ErrorFromVolumes(volumeMeter, tstRslt.VolumeCTV); + volumeRslt.Passed = !evaluateVolume || + ((errorPct >= tstRslt.ErrLimLo() + tstRslt.Uncertainty()) && + (errorPct <= tstRslt.ErrLimHi() - tstRslt.Uncertainty())); + volumeRslt.TestDone = true; + tstRslt.TestDone = true; + } + + if (energyRslt != null && energyRegReader != null) + { + energyRslt.VolumeMeter = energyMeter; + + energyRslt.PulsesMeter = energyRegReader.PulsesPerLtr * energyMeter; + energyRslt.PulsesMaster = tstRslt.PulsesMaster; + energyRslt.PulsesPerLiter = energyRegReader.PulsesPerLtr; + energyRslt.VolumeStart = 0; + energyRslt.VolumeEnd = energyMeter; + energyRslt.VolumeRef = energy; + energyRslt.TimestampStart = 0; + energyRslt.TimestampEnd = tstRslt.TargetTime(); + energyRslt.TestTime = tstRslt.TargetTime(); + energyRslt.Error = Formulas.ErrorFromVolumes(energyMeter, energy); + energyRslt.Passed = (errorPct >= energyErrLimLo) && (errorPct <= energyErrLimHi); + energyRslt.TestDone = true; + tstRslt.TestDone = true; + } + } + + tstRslt.Components = Results.Entities.Components + .UpdateList(BatchRslts.ComponentsList, + new Results.Entities.Components((BenchInfo != null) ? BenchInfo.TestBenchId : 1, + (BenchInfo != null) ? BenchInfo.TestBenchName : "testbench", + inPath.Pump != null ? inPath.Pump.Name : string.Empty, + outPath.FlowMeter != null ? outPath.FlowMeter.Name : string.Empty, + outPath.Scale != null ? outPath.Scale.Name : string.Empty, + outPath.RegulValve != null ? outPath.RegulValve.Name : string.Empty, + outPath.Diverter != null ? outPath.Diverter.Name : string.Empty)); + } + + protected bool TestAndLogUiCmdStop(IList e) + { + return TestAndLogUiCmdStop(null, e); + } + + /// + /// Returns true and makes a log when 'e' contains Event.UiCmdStop + /// + /// + /// + /// + protected bool TestAndLogUiCmdStop(Test test, IList e) + { + if (!e.Contains(Event.UiCmdStop)) return false; + + log.FatalFormat("STOP pressed: Procedure={0}, Test={1}, State={2}", + (StateMachine.Procedure == null) ? "?" : StateMachine.Procedure.Name, + (test == null) ? "?" : test.Name, + State.CurrentState.Name); + + if (test != null) + { + log.FatalFormat("Process values:"); + log.FatalFormat(" Method: {0}", test.Method); + log.FatalFormat(" Test start time: {0}", TestStartTime.ToShortTimeString()); + log.FatalFormat(" Feeding path: {0}", (inPath != null) ? inPath.ToString() : "none"); + log.FatalFormat(" Bench path: {0}", (benchPath != null) ? benchPath.ToString() : "none"); + log.FatalFormat(" Output path: {0}", (outPath != null) ? outPath.ToString() : "none"); + if (inPath.Pump is IPump) log.FatalFormat(" Pump power: {0}%", (inPath.Pump as IPump).Power); + else if (inPath.Pump is IValve) log.FatalFormat(" Feeding valve: {0}", (inPath.Pump as IValve).State ? "open" : "close"); + if (outPath.RegulValve is IRegulValve) log.FatalFormat(" Regulation valve position: {0}%", outPath.RegulValve.Position); + log.FatalFormat(" Flow: {0}", RefFlow); + log.FatalFormat(" Mass: {0}", Mass); + log.FatalFormat(" Start mass: {0}", StartMass); + log.FatalFormat(" Liter/ref.pulse: {0}", LtrPerRefPulse); + log.FatalFormat(" Reference pulses: {0}", RefPulses); + } + + return true; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Sequences/Statistics.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Sequences/Statistics.cs new file mode 100644 index 00000000..edae1889 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Sequences/Statistics.cs @@ -0,0 +1,229 @@ +using System; +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl.Sequences +{ + public class Statistics + { + public readonly int SkippedSamplesCount; /// 0 = do not skip any samples + public readonly int FilterSize; /// 0 = no filter + public readonly bool MedianFilter; /// true - median filter instead of average + public readonly IPlotter plotter; + + bool recordingInProgress; + double[] fifo; + double[] sorted; + double first; + double last; + double min; + double max; + double sum; + int totalCount; /// Number of samples passed to Update() + int count; /// Number of processed and filtered samples + int fifoCount; /// Number of samples inserted into FIFO + int graphId; + + public bool RecordingIProgress { get { return recordingInProgress; } } + public double First { get { return first; } } + public double Last { get { return last; } } + public double Min { get { return (count > 0) ? min : 0; } } /// 0 when there were no samples + public double Max { get { return (count > 0) ? max : 0; } } /// 0 when there were no samples + public double Average { get { return (count > 0) ? (sum / (double)count) : 0; } } + public int Count { get { return count; } } + + public double Sum { get { return sum; } } + + + public Statistics(int skippedSamplesCount, int filterSize, bool medianFilter, IPlotter plotter) + { + this.SkippedSamplesCount = skippedSamplesCount; + this.FilterSize = filterSize; + this.MedianFilter = medianFilter; + this.plotter = plotter; + + if (filterSize > 0) + { + fifo = new double[FilterSize]; + sorted = new double[FilterSize]; + } + + recordingInProgress = false; + } + + public Statistics(int skippedSamplesCount, int filterSize, bool medianFilter) + : this(skippedSamplesCount, filterSize, medianFilter, new DummyPlotter()) + { + } + + public Statistics(IPlotter plotter) + : this(0, 0, false, plotter) + { + } + + public Statistics() + : this(0, 0, false, new DummyPlotter()) + { + } + + + /// + /// Resets statistics and start collecting + /// + public void Start(int batchNr, string testName, int repetition) + { + sum = 0; + min = double.MaxValue; + max = double.MinValue; + first = 0; + last = 0; + totalCount = 0; + count = 0; + fifoCount = 0; + + recordingInProgress = true; + + graphId = plotter.StartGraph(batchNr, testName, repetition); + } + + /// + /// Resets statistics + /// + public void Stop() + { + if (recordingInProgress) + { + recordingInProgress = false; + plotter.StopGraph(graphId, (float)min, (float)max); + } + } + + + /// + /// Updates statistics + /// + /// New boxed value + public void Update(TBF.Boxes.DoubleBox box) + { + Update(box.Val); + } + + /// + /// Updates statistics + /// + /// New boxed value + public void Update(TBF.Boxes.FloatBox box) + { + Update(box.Val); + } + + /// + /// All samples are passed to this function + /// + /// New value + public void Update(double value) + { + if (recordingInProgress) + { + if (totalCount >= SkippedSamplesCount) + { + Process(value); + } + totalCount++; + } + } + + + /// + /// Only samples after first 'SkippedSamplesCount' samples are passed to this function. + /// Any filtering is done inside this function. + /// + /// New value + void Process(double value) + { + double filteredValue; + if (ApplyFilter(value, out filteredValue)) + { + sum += filteredValue; + if (count == 0) first = filteredValue; + last = filteredValue; + if (value < min) min = filteredValue; + if (value > max) max = filteredValue; + + plotter.UpdateGraph(graphId, (float)(count + SkippedSamplesCount + FilterSize / 2), (float)value); + + count++; + } + } + + /// + /// Inserts values to FIFO and calculates filetered value when FIFO is full. + /// Returns true when FIFO is full and calculated values are valid. + /// + /// Input value + /// Output filtered value + /// true when 'fileterdValue' is valid + bool ApplyFilter(double value, out double filteredValue) + { + if (FilterSize == 0) + { + /// No filter => Pass the input value to the output + filteredValue = value; + return true; + } + + + /// Shift values in FIFO buffer, calculate the sum + double sum = 0; + for (int i = FilterSize - 1; i > 0; i--) + { + fifo[i] = fifo[i - 1]; + sum += fifo[i]; + } + /// Insert the current value into FIFO, add it to the sum + fifo[0] = value; + sum += value; + + + fifoCount++; + + + if (fifoCount < FilterSize) + { + /// FIFO not filled yet => Pass the input value to the output + filteredValue = value; + return false; + } + else + { + /// FIFO already filled => Apply filter + if (MedianFilter) + { + for (int i = 0; i < FilterSize; i++) sorted[i] = fifo[i]; + Array.Sort(sorted); +#if false + filteredValue = sorted[FilterSize / 2]; +#else + double sum2 = 0; + for (int j = 1; j < FilterSize - 1; j++) sum2 += sorted[j]; + filteredValue = sum2 / (FilterSize - 2); +#endif + } + else + { + filteredValue = sum / FilterSize; + } + + return true; + } + } + } + + class DummyPlotter : IPlotter + { + public DummyPlotter() { } + + public int StartGraph(int batchNr, string testName, int repetition) { return 1; } + public void UpdateGraph(int graphId, float x, float y) { } + public void StopGraph(int graphId, float ymin, float ymax) { } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/State.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/State.cs new file mode 100644 index 00000000..6dae5074 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/State.cs @@ -0,0 +1,251 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Text; +using log4net; + +namespace TBF.BenchControl +{ + public class State + { + /// + /// DEBUG: operation.Start(), operation.Stop() + /// INFO: operation.Run() when returned event != Event.None + /// WARN: EnterState() only state changes + /// + private static readonly ILog log = LogManager.GetLogger(typeof(State)); + public override string ToString() { return Name + (Label==null ? "" : ", label=" + Label); } + + + /// Current state (static) + public static State CurrentState { get { return currentState; } } + static State currentState; + + + /// + /// Events returned by the last RunOperations() + /// + public static IList LastEvents; + + + /// State with an empty list of operations + /// Useful when entering the first state and leaving the last one + public static State Empty { get { return new State("empty"); } } + + /// + /// Static constructor that initializes CurrentState + /// + static State() + { + PermanentOperations = new List(); + currentState = State.Empty; + } + + /// + /// Instance fields set or initialized by the constructor + /// + public static IList PermanentOperations; + public readonly IList Operations; + public readonly IList Transitions; + public readonly string Name; + public readonly string Label; + + + /// + /// Constructor with a label + /// + public State(string name, string label) + { + this.Name = name; + this.Label = label; + Operations = new List(); + foreach (var op in PermanentOperations) Operations.Add(op); + Transitions = new List(); + log.Debug(this.ToString()); + } + + /// + /// Default constructor + /// + public State(string name) + : this(name, null) + { + } + + + /// + /// Create a new state without a label + /// + public static State Create(string name) + { + return new State(name); + } + + /// + /// Create a new state with a label + /// + public static State Create(string name, string label) + { + return new State(name, label); + } + + /// + /// Add an operation to the list of permanent opertion (and to this state) + /// + /// operation + public State AddPermanentOperation(IOperation operation) + { + if (operation != null) + { + Operations.Add(operation); + PermanentOperations.Add(operation); + } + return this; + } + + /// + /// Remove an operation from the list of permanent opertion (and from this state) + /// + /// operation + public State RemovePermanentOperation(IOperation operation) + { + if (operation != null) + { + Operations.Remove(operation); + PermanentOperations.Remove(operation); + } + return this; + } + + /// + /// Remove all permanent operations from this state and from the list + /// (= clear the list of permanent operations) + /// + /// operation + public State RemoveAllPermanentOperations() + { + if (PermanentOperations != null) + { + foreach (var op in PermanentOperations) Operations.Remove(op); + PermanentOperations.Clear(); + } + return this; + } + + /// + /// Add an operation to this state + /// + /// operation + public State AddOperation(IOperation operation) + { + if (operation != null) Operations.Add(operation); + return this; + } + + /// + /// Add a list of operations to this state + /// + /// operation + public State AddOperations(IList operations) + { + if (operations != null) + { + foreach (var op in operations) { if (op != null) Operations.Add(op); } + } + return this; + } + + /// + /// Add a state transition to the state + /// + /// transition + public State AddTransition(Transition transition) + { + if (transition != null) Transitions.Add(transition); + return this; + } + + /// + /// Enter a new state + /// + public State EnterState() + { + StopAndStartOperations(State.currentState, this); + State.currentState = this; + UiBridge.Bridge.OnStateChanged(this, State.currentState.ToString()); + return this; + } + + // ----------------------------------- Run time ----------------------------------------- + + /// + /// Execute Run() methods of all operations of the current state. + /// + /// List of Event-s returned from the state operations + public static IList RunOperations() + { + IList events = new List(); + + foreach (IOperation operation in currentState.Operations) + { + Event evnt = operation.Run(); + if (evnt != Event.None) + { + log.InfoFormat("Operation {0}.Run() returned {1}", operation, evnt); + events.Add(evnt); + } + else + { + log.DebugFormat("Operation {0}.Run() returned {1}", operation, evnt); + } + } + + LastEvents = events; + return events; + } + + /// + /// Execute Stop() methods of all operations of the current state. + /// + public static void StopOperations() + { + foreach (IOperation operation in currentState.Operations) + { + log.DebugFormat("stopping {0}", operation); + operation.Stop(); + } + } + + /// + /// Run Stop() and Start() methods of operations when changing the state. + /// + /// Stopping state + /// Starting state + static void StopAndStartOperations(State previousState, State newState) + { + /// Stop() the previous state operations, which are not in the next state + foreach (IOperation operation in previousState.Operations) + { + if (!newState.Operations.Contains(operation)) + { + log.DebugFormat("stopping {0}", operation); + operation.Stop(); + } + } + + log.WarnFormat("---------------( {0} )---------------", newState.ToString()); + + /// Start() the operations that are in the current (new) state, but aren't in the previous state. + foreach (IOperation operation in newState.Operations) + { + if (!previousState.Operations.Contains(operation)) + { + log.DebugFormat("starting {0}", operation); + operation.Start(); + } + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/StateMachine.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/StateMachine.cs new file mode 100644 index 00000000..31873518 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/StateMachine.cs @@ -0,0 +1,714 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.Text; +using System.Threading; +using System.Collections.Generic; +using log4net; +using NHibernate; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.BenchControl.GenericDevices; +using TBF.BenchControl.Sequences; +using Dirichlet.Numerics; +using TBF.Resources; + +namespace TBF.BenchControl +{ + public class QuitStateMachineException : Exception + { + } + + /// + /// This class controls real test bench behavior. + /// It is based on a state machine + /// + public static class StateMachine + { + private static readonly ILog log = LogManager.GetLogger(typeof(StateMachine)); + private static readonly ILog wlog = LogManager.GetLogger(typeof(StateMachine)); + + /// Private devices and components + static IList components; /// list of all components + static IList devices; /// list of devices + /// + /// Bench paths + static IList feedingPaths; + static IList benchPaths; + static IList outputPaths; + static IList metersPaths; + static IList heatMetersPaths; + public static IList TransitionSequences; + public static IList TransitionSteps; + + /// Public components + public static Elde.ControlBoardDev ControlBoard; + public static GenericDevices.IAmbient Ambient; + public static GenericDevices.IScale Scale1; + public static GenericDevices.IScale Scale2; + public static GenericDevices.IScale Scale3; + public static GenericDevices.IValve DrainValve1; + public static GenericDevices.IValve DrainValve2; + public static GenericDevices.IValve DrainValve3; + public static IList MasterValves; /// list of directly controlled valves + public static IList CoupledValves; /// list of coupled valves + public static IList ExtendedValves; /// list of extended valves + + + /// Time and synchronization +#if TURA_IPERL + public const int Period = 2; /// State machine period in sec. +#else + public const int Period = 1; /// State machine period in sec. +#endif + + static DateTime startDateTime; /// DateTime of time instance when the state machine worker thread starts + static int currentTimeSec; /// Time from the start of the state machine in seconds + static bool quitStateMachine; /// flag to stop the worker thread + + /// true when the state machine is running + static bool stateMachineRunning; + public static bool Running { get { return stateMachineRunning; } } + + /// Worker thread and database session + static Thread workerThread; + + static IList states; /// list of states + + public static DateTime CycleStartTimeStamp; + + public static IList DefaultValvesOpen + { + get + { + return GenericDevices.ValveBase.Merge( + Utils.ValvesOpen((feedingPaths != null && feedingPaths.Count > 0) ? feedingPaths[0] : null), + Utils.ValvesOpen((benchPaths != null && benchPaths.Count > 0) ? benchPaths[0] : null), + Utils.ValvesOpen((outputPaths != null && outputPaths.Count > 0) ? outputPaths[0] : null) + ); + } + } + + public static IList DefaultValvesClose + { + get + { + return GenericDevices.ValveBase.Merge( + Utils.ValvesClose((feedingPaths != null && feedingPaths.Count > 0) ? feedingPaths[0] : null), + Utils.ValvesClose((benchPaths != null && benchPaths.Count > 0) ? benchPaths[0] : null), + Utils.ValvesClose((outputPaths != null && outputPaths.Count > 0) ? outputPaths[0] : null) + ); + } + } + + /// + /// Loaded by LoadProcedure() or IOperation LoadProcedureOp(...) + /// + public static Procedure Procedure; /// Procedure + public static IList Tests; /// Tests + + + /// Hardware devices connected to the PC controlling the bench. + public static IList Components { get { return components; } } + public static IList Devices { get { return devices; } } + + /// + /// DateTime of time instance when the state machine worker thread starts + /// + public static DateTime StartDateTime { get { return startDateTime; } } + + /// + /// Current state name + /// + public static int Time { get { return currentTimeSec; } } + + /// + /// Constructor + /// + static StateMachine() + { + devices = new List(); + states = new List(); + + currentTimeSec = 0; + quitStateMachine = false; + } + + /// + /// Add a device to the state machine. + /// + /// Device + public static void AddDevice(IDevice device) + { + if (device != null && !devices.Contains(device)) devices.Add(device); + } + + /// + /// Add a state to the state machine. + /// In this way a sequence can be created programtically. + /// + /// State + public static void AddState(State state) + { + if (state != null && !states.Contains(state)) states.Add(state); + } + + /// + /// Remove the state from the state machine. + /// + /// State + public static void RemoveState(State state) + { + if (state != null && state != State.CurrentState && states.Contains(state)) states.Remove(state); + } + + /// + /// Get a state from a label + /// + /// + /// The matching state or null + static State GetStateFromLabel(string label) + { + if (label == null) return null; + + foreach (State state in states) + { + if (state.Label != null && state.Label.Equals(label)) return state; + } + return null; + } + + /// + /// Start the state machine in the state 'label' in a desired mode of operation. + /// This method is called in the UI thread and creates a new state machine thread. + /// This method call should be embedded in: try { StateMachine.Start(...); } catch { } + /// to handle configuration problems. Calls CreateDevices(mode) and CreateStates(). + /// + /// Mode of operation + /// A copy of bench data used by the state machine + /// Identifies the initial state +#if DN100 + public static void InitializeBoardEtc(ControlCom2VB.ControlCom2panel ctrlBrdComponent) +#elif MUNICH || FUZHOU150 + public static void InitializeBoardEtc(ControlComponent3Munich.UserControl1 ctrlBrdComponent) +#elif FUZHOU300 + public static void InitializeBoardEtc(ControlComponent3F300.UserControl1 ctrlBrdComponent) +#elif PT200IL || PUCHONG_PT200 || GENESIS || BERLIN || SLM_150 || PETERSBURG_200 || CEVAK_200 + public static void InitializeBoardEtc(ControlComponent_Izrael2014.UserControl1 ctrlBrdComponent) +#else /// all newer benches + public static void InitializeBoardEtc(ControlComponent_Torino2015.UserControl1 ctrlBrdComponent) +#endif + { + /// Load the list of components (entities) from the database. + /// Then create the components (derived from IComponent). + components = BenchControl.TbfComponents.LoadComponentsFromDB(Config.FluentCommon.CreateSession(Users.Entities.DBKind.Config)); + MasterValves = GenericDevices.ValveBase.MasterValves(components); + CoupledValves = GenericDevices.ValveBase.CoupledValves(components); + ExtendedValves = GenericDevices.ValveBase.ExtendedValves(components); + + /// Find all balances (to initialize tank capacities in the control board) + /// Find the control board + IList balances = new List(); + SequenceBase.FlowMeters = new List(); + SequenceBase.RegulValves = new List(); + SequenceBase.PumpsWithFM = new List(); + SequenceBase.WaterMeters = new List(); + SequenceBase.Cameras = new List(); + UInt128 valvesToInvert = 0; + foreach (var cmpnt in components) + { + if (cmpnt is Elde.ControlBoardDev) ControlBoard = cmpnt as Elde.ControlBoardDev; + if (cmpnt is IBenchInfo) ProcessData.BenchInfo = cmpnt as IBenchInfo; + if (cmpnt is IErrorFlags) ProcessData.ErrorFlagsComp = cmpnt as IErrorFlags; + if (cmpnt is IFlowMeter) SequenceBase.FlowMeters.Add(cmpnt as IFlowMeter); + if ((cmpnt is IRegulValve) && !(cmpnt is BenchControl.Elde.RegulValveTandem.RegulValveTandem)) + { + SequenceBase.RegulValves.Add(cmpnt as IRegulValve); + } + if (cmpnt is IPumpFM && !(cmpnt is Elde.PumpTandem.Pump)) + { + SequenceBase.PumpsWithFM.Add(cmpnt as IPumpFM); + } + if (cmpnt is IWaterMeter) SequenceBase.WaterMeters.Add(cmpnt as IWaterMeter); + if (cmpnt is ICamera) SequenceBase.Cameras.Add(cmpnt as ICamera); + if (cmpnt is GenericDevices.IAmbient) Ambient = cmpnt as GenericDevices.IAmbient; + if (cmpnt is IScale) + { + IScale scale = cmpnt as IScale; + balances.Add(scale); + + if (scale.ScaleNr == 0) Scale1 = scale; + else if (scale.ScaleNr == 1) Scale2 = scale; + else if (scale.ScaleNr == 2) Scale3 = scale; + } + + Elde.Valve.Valve eldeValve = (cmpnt as Elde.Valve.Valve); + if ((eldeValve != null) && eldeValve.Inverted) valvesToInvert |= eldeValve.Mask; + + cmpnt.StartChangeHandler(); /// Start handling parameter change events + } + + /// Create an array with tank capacities + double[] tankCapacities = new double[balances.Count]; + for (int i = 0; i < tankCapacities.Length; i++) tankCapacities[i] = balances[i].Capacity; + + /// Pre-initialize the control board (= buffer the arguments ctrlBrdComponent, tankCapacities) + if (ControlBoard != null) + { + ControlBoard.InitializeComponent(ctrlBrdComponent, valvesToInvert, tankCapacities); + } + else + { + throw new Exception("Control board component is missing"); + } + } + + + public static string CurrentlyInitializedDeviceName; + /// + public static string InitializeDevices() + { + CurrentlyInitializedDeviceName = "-"; + + bool anyComponentIsInSimulMode = false; + StringBuilder inSimulMode = new StringBuilder(); + + /// Add all devices to the state machine and initialize them + foreach (var cmpnt in components) + { + if (cmpnt.DebugLevel == DebugMode.Simulate) + { + inSimulMode.AppendFormat("{0}{1}", anyComponentIsInSimulMode ? ", " : "", cmpnt.Name); + anyComponentIsInSimulMode = true; + } + + IDevice device = cmpnt as IDevice; + if (device != null) + { + CurrentlyInitializedDeviceName = device.Name; + UiBridge.Bridge.OnActivity(null, device.Name); /// Info + + device.Initialize(); + AddDevice(device); /// Only components that were initialized are added + } + } + + CurrentlyInitializedDeviceName = "---"; + + /// + /// (1) Propagate debug levels from parents to children when necessary + /// (2) Set drain valves DrainValve1, DrainValve2 and DrainValve3 + /// + foreach (var cmpnt in components) + { + if (cmpnt.Cfg is IChildComponentCfg && !string.IsNullOrEmpty(cmpnt.Cfg.ParentName) && + (cmpnt.Cfg.DebugLevel == DebugMode.Inherit || cmpnt.Cfg.DebugLevel == DebugMode.AutoDetect)) + { + foreach (var par in components) + { + if (par.Cfg.Name.Equals(cmpnt.Cfg.ParentName)) { cmpnt.Cfg.DebugLevel = par.Cfg.DebugLevel; break; } + } + } + + if (cmpnt is IScale) + { + IScale scale = cmpnt as IScale; + + if (scale.ScaleNr == 0) + { + DrainValve1 = scale.DrainValve; + log.WarnFormat("InitializeBoardEtc() ... Scale1={0} Draining valve1={1}", + scale.Name, (DrainValve1 != null) ? DrainValve1.Name : "---"); + } + else if (scale.ScaleNr == 1) + { + DrainValve2 = scale.DrainValve; + log.WarnFormat("InitializeBoardEtc() ... Scale2={0} Draining valve2={1}", + scale.Name, (DrainValve2 != null) ? DrainValve2.Name : "---"); + } + else if (scale.ScaleNr == 2) + { + DrainValve3 = scale.DrainValve; + log.WarnFormat("InitializeBoardEtc() ... Scale3={0} Draining valve3={1}", + scale.Name, (DrainValve3 != null) ? DrainValve3.Name : "---"); + } + } + } + + if (anyComponentIsInSimulMode) + return inSimulMode.ToString(); + else + return null; + } + + /// + /// Stop devices that were started by InitializeDevices(). + /// Works correctly also after exeption from InitializeDevices() as only ... + /// ... correctly started devices were added in 'devices' list. + /// + public static void StopDevices() + { + foreach (var dev in devices) + { + UiBridge.Bridge.OnActivity(null, string.Format("1. {0}", dev.Name)); /// Info + dev.StopDevice(); + } + } + + /// + /// Stop devices that were started by InitializeDevices(). + /// Works correctly also after exeption from InitializeDevices() as only ... + /// ... correctly started devices were added in 'devices' list. + /// + public static void StopDevices2() + { + foreach (var dev in devices) + { + UiBridge.Bridge.OnActivity(null, string.Format("2. {0}", dev.Name)); /// Info + dev.StopDevice2(); + } + } + + + /// + /// Start the state machine + /// + public static void Start() + { + if (stateMachineRunning) return; + + workerThread = new Thread(Worker); + workerThread.CurrentCulture = Thread.CurrentThread.CurrentCulture; + workerThread.CurrentUICulture = Thread.CurrentThread.CurrentUICulture; + workerThread.Start(); + stateMachineRunning = true; + } + + /// + /// Loads all paths and transitions from the DB. + /// Updates StatMachine.feedingPaths ... StatMachine.meterPaths, StatMachine.TransitionSequences + /// + public static void LoadPathsAndTransitions(ISession session) + { + feedingPaths = session.QueryOver().OrderBy(x => x.ItemNr).Asc.List(); + benchPaths = session.QueryOver().OrderBy(x => x.ItemNr).Asc.List(); + outputPaths = session.QueryOver().OrderBy(x => x.ItemNr).Asc.List(); + metersPaths = session.QueryOver().OrderBy(x => x.ItemNr).Asc.List(); + TransitionSequences = session.QueryOver().OrderBy(x => x.ItemNr).Asc.List(); + TransitionSteps = session.QueryOver().OrderBy(x => x.ItemNr).Asc.List(); +#if HEAT_METERS + heatMetersPaths = session.QueryOver().OrderBy(x => x.ItemNr).Asc.List(); +#endif + } + + /// + /// Loads selected procedure from the DB. + /// Updates StateMachine.Procedure and StateMachine.Tests + /// + public static bool LoadProcedure(ISession session, string procedureName) + { + Procedure = null; + + IList selectedProcs = session.QueryOver() + .Where(x => (x.ProcedureState == ProcedureState.Active)) + .And(x => (x.Name == procedureName)) + .List(); + + if (selectedProcs.Count != 1) return false; + + Procedure = selectedProcs[0]; + Tests = selectedProcs[0].Tests; + return true; + } + + public static void LoadProcedureParams(Procedure procedure) + { + foreach (var cmpnt in components) + { + cmpnt.Cfg.LoadProcedureParamsFromDB(procedure); + } + } + + public static void LoadTestParams(Test test) + { + foreach (var cmpnt in components) + { + cmpnt.Cfg.LoadTestParamsFromDB(test); + } + } + + /// + /// Processes the selection done by the bench control panel in the main sequence. + /// + /// Selection.Q1, .Q2, .Q3 or .Test + /// The selected test or null + public static Config.Entities.Test GetTest(string selectedTestName, out int repetNr) + { + repetNr = 1; + foreach (var test in Tests) + { + if (test.Name.Equals(selectedTestName)) return test; /// Test name specified, keep repetNr = 1 + + for (int i = 1; i <= test.Repeats; i++) + { + if (Utils.TestTitle(test, i).Equals(selectedTestName)) + { + repetNr = i; + return test; + } + } + } + + return null; + } + + /// + /// Called from the sequence to update paths based on the selected test + /// + /// Selected test + /// + /// + /// + /// + /// Transition sequence entity + /// Transition sequence entity + /// Error message in case of incorrect configuration + /// true when loaded configuration is correct (all four paths are defined !=null, etc.) + public static bool GetPaths(Test test, + bool heatMetersPathRequired, + out FeedingPath pfeed, + out BenchPath pben, + out OutputPath pout, + out MetersPath pmtrs, + out HeatMetersPath phmtrs, + out TransitionSequence transitionBefore, + out TransitionSequence transitionAfter, + out string errorMsg) + { + pfeed = null; + pben = null; + pout = null; + phmtrs = null; + transitionBefore = null; + transitionAfter = null; + + foreach (var path in feedingPaths) + { + if (test.FeedingPath == path.Name) { pfeed = new FeedingPath(path, components); break; } + } + + foreach (var path in benchPaths) + { + if (test.BenchPath == path.Name) { pben = new BenchPath(path, components); break; } + } + + foreach (var path in outputPaths) + { + if (test.OutputPath == path.Name) { pout = new OutputPath(path, components); break; } + } + + pmtrs = GetMetersPath(test); + + if (pfeed == null) errorMsg = Strings.Cannot_load_feeding_path; + else if (pben == null) errorMsg = Strings.Cannot_load_bench_path; + else if (pout == null) errorMsg = Strings.Cannot_load_output_path; + else if (pmtrs == null) errorMsg = Strings.Cannot_load_sensor_path; + else errorMsg = string.Empty; + if ((pfeed == null) || (pben == null) || (pout == null) || (pmtrs == null)) + { + return false; + } + +#if HEAT_METERS + foreach (var path in heatMetersPaths) + { + if (test.HeatMetersPath == path.Name) { phmtrs = new HeatMetersPath(path, components); break; } + } +#endif + if (heatMetersPathRequired && phmtrs == null) + { + errorMsg = "Cannot load heat meters sensors"; + return false; + } + + foreach (var tr in TransitionSequences) + { + if (tr.Name == test.RelTransBefore) transitionBefore = tr; + if (tr.Name == test.TransitionAfter) transitionAfter = tr; + } + + if (pout.Scale == null) + { + errorMsg = string.Format("No balance specified in path {0}", test.OutputPath); + return false; + } + + if (Program.LocalSettings.RealDensity < 500.0f || Program.LocalSettings.RealDensity > 2000.0f) + { + errorMsg = string.Format("Density was not specified"); + return false; + } + + errorMsg = string.Empty; + return true; + } + + + /// + /// Updates paths based on the selected test + /// + public static MetersPath GetMetersPath(Test test) + { + MetersPath pmtrs = null; + foreach (var path in metersPaths) + { + if (test.MetersPath == path.Name) { pmtrs = new MetersPath(path, components); break; } + } + if (pmtrs != null) + { + int count = Math.Min(Config.Data.WMsCount, pmtrs.RegisterReaders.Length); + for (int i = 0; i < count; i++) + { + if ((pmtrs.RegisterReaders[i] != null) && + (pmtrs.RegisterReaders[i].Cfg.DebugLevel == DebugMode.DetectedOff)) + { + pmtrs.RegisterReaders[i] = null; + } + } + } + return pmtrs; + } + + + /// + /// Stops the state machine (and the worker thread) + /// + public static void Stop() + { + if (stateMachineRunning) quitStateMachine = true; + } + + + /* + * This is and example sequence of RunDeviceBefore() / RunOperations() / RunDeviceAfter() calls + * as they are executed during normal run from the progran start to the end. + * + foreach (var device in devices) device.RunDeviceBefore(); . . . . . . in StateMachine.Worker() + State.Create(...).AddOperation(...).AddOperation(...).EnterState() . . in the sequence in Execute(...) + + foreach (var device in devices) device.RunDeviceAfter(); . . . . . . . in WaitRunDevsRunOps() + WaitNextTick() (may throw QuitStateMachineException) . . . . . . . . in WaitRunDevsRunOps() + foreach (var device in devices) device.RunDeviceBefore(); . . . . . . in WaitRunDevsRunOps() + IList events = State.RunOperations(); . . . . . . . . . . . . . in WaitRunDevsRunOps() + + foreach (var device in devices) device.RunDeviceAfter(); . . . . . . . in WaitRunDevsRunOps() + WaitNextTick() (may throw QuitStateMachineException) . . . . . . . . in WaitRunDevsRunOps() + foreach (var device in devices) device.RunDeviceBefore(); . . . . . . in WaitRunDevsRunOps() + IList events = State.RunOperations(); . . . . . . . . . . . . . in WaitRunDevsRunOps() + + State.Create(...).AddOperation(...).AddOperation(...).EnterState() . . in the sequence in Execute(...) + + foreach (var device in devices) device.RunDeviceAfter(); . . . . . . . in WaitRunDevsRunOps() + WaitNextTick() (may throw QuitStateMachineException) . . . . . . . . in WaitRunDevsRunOps() + foreach (var device in devices) device.RunDeviceBefore(); . . . . . . in WaitRunDevsRunOps() + IList events = State.RunOperations(); . . . . . . . . . . . . . in WaitRunDevsRunOps() + + foreach (var device in devices) device.RunDeviceAfter(); . . . . . . . in WaitRunDevsRunOps() + WaitNextTick() (assume QuitStateMachineException thrown) . . . . . . in WaitRunDevsRunOps() + State.StopOperations(); . . . . . . . . . . . . . . . . . . . . . . . in StateMachine.Worker() catch() + foreach (var device in devices) device.StopDevice(); . . . . . . . . . in StateMachine.Worker() catch() + */ + + /// + /// Worker thread: calls Start(), Run() and Stop() methods of operations. + /// It uses 'currentState', 'nextState' and 'quitStateMachine' static fields. + /// + static void Worker() + { + startDateTime = DateTime.Now; + CycleStartTimeStamp = startDateTime; /// To prevent it is undefined + + wlog.InfoFormat(" currentTime = {0}s startDateTime = {1}", currentTimeSec.ToString(), startDateTime.ToString()); + + /// Run all devices for the first time + foreach (var device in devices) device.RunDeviceBefore(); + + try + { + SequenceBase.ReferenceFlowmetersCount = SequenceBase.FlowMeters.Count; + SequenceBase.CalibratedLtrPerRefPulse = new float[SequenceBase.ReferenceFlowmetersCount]; + foreach (var flowmtr in SequenceBase.FlowMeters) + { + int ix = flowmtr.Idx1; + if (ix > 0 && ix <= SequenceBase.ReferenceFlowmetersCount) + { + SequenceBase.CalibratedLtrPerRefPulse[ix - 1] = flowmtr.NominalFlow / 7200.0f; + } + } + + (new Sequences.MainSeq()).Execute(null); + } + catch (QuitStateMachineException) + { + } + } + + + + /// + /// Do stuff that is repeated in the state execution loops most often + /// + /// List of Event-s returned from the state operations, null == quit + public static IList WaitRunDevsRunOps() + { + Thread.Sleep(100); /// Insert 1/10 sec.delay between RunOperations() and RunDeviceAfter() + + foreach (var device in devices) device.RunDeviceAfter(); + + if (WaitNextTick()) + { + /// + /// Executed when the state machine is stopped + /// + wlog.Fatal("quitStateMachine == true ... The last StopOperaions() start now"); + State.StopOperations(); + stateMachineRunning = false; + wlog.Fatal("StopOperaions() completed ... stateMachineRunning = false)"); + + throw new QuitStateMachineException(); + } + + foreach (var device in devices) device.RunDeviceBefore(); + + Thread.Sleep(100); /// Insert 1/10 sec.delay between RunDeviceBefore() and RunOperations() + + IList events = State.RunOperations(); + return events; + /// + /// This is followed by a state change in the sequence + /// + } + + + /// + /// Wait time period - synchronize + /// + /// true when interrupted by 'quitStateMachine', otherwise false + public static bool WaitNextTick() + { + currentTimeSec += Period; + + TimeSpan timeFromStart = TimeSpan.FromSeconds(currentTimeSec); + DateTime nextLoopDateTime = startDateTime + timeFromStart; + + while (DateTime.Now < nextLoopDateTime) + { + Thread.Sleep(100); + if (quitStateMachine) return true; + } + + return false; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TbfComponents.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TbfComponents.cs new file mode 100644 index 00000000..1c2d6013 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TbfComponents.cs @@ -0,0 +1,267 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl +{ + public static class TbfComponents + { + public readonly static IList Factories; + + static TbfComponents() + { + Factories = new List(); + + Factories.Add(new BenchInfo.Munich.ComponentFactory()); + Factories.Add(new BenchInfo.Extended.ComponentFactory()); + Factories.Add(new Elde.ControlBoardFactory()); + Factories.Add(new Elde.CoverTest.Factory()); + Factories.Add(new DataEntry.Combined.EntryFormFactory()); + Factories.Add(new DataEntry.HeatMeters6.Factory()); + Factories.Add(new DataEntry.HeatMeters12.Factory()); + Factories.Add(new DataEntry.Munich3.EntryFormFactory()); + Factories.Add(new DataEntry.Munich.EntryFormFactory()); + Factories.Add(new DataEntry.iPerl.EntryFormFactory()); + Factories.Add(new DataEntry.Standard6.Factory()); + Factories.Add(new DataEntry.Standard6.FactoryNoStartEnd()); + Factories.Add(new DataEntry.Standard12.Factory()); + Factories.Add(new DataEntry.Standard12.FactoryNoStartEnd()); + Factories.Add(new DataEntry.Standard24.Factory()); + Factories.Add(new DataEntry.Standard24.FactoryNoStartEnd()); + Factories.Add(new DataEntry.Standard48.Factory()); + Factories.Add(new DataEntry.Standard48.FactoryNoStartEnd()); + Factories.Add(new DataEntry.StandardCamera.Factory()); + Factories.Add(new Dummy.Balance.Factory()); + Factories.Add(new Dummy.Diverter.Factory()); + Factories.Add(new Dummy.FlowMeter.Factory()); + Factories.Add(new Dummy.RegulValve.Factory()); + Factories.Add(new Dummy.Valve.Factory()); + Factories.Add(new Elde.Diverter.DiverterFactory()); + Factories.Add(new Elde.FlowMeter.FlowMeterFactory()); + Factories.Add(new Elde.FlowMeterTwins.FlowMeterFactory()); + Factories.Add(new Elde.FlowMeterTriplet.FlowMeterFactory()); + Factories.Add(new TestMethods.Adjustment.Factory()); + Factories.Add(new TestMethods.CombinedWithDetection.TestMethodFactory()); + Factories.Add(new TestMethods.Endurance.Factory()); + Factories.Add(new TestMethods.FixedStart.Single.Factory()); + Factories.Add(new TestMethods.FixedStart.Compound.Factory()); + Factories.Add(new TestMethods.FixedStart.HeatMeters.Factory()); + Factories.Add(new TestMethods.FixedStartAdvanced.Single.Factory()); + Factories.Add(new TestMethods.FixedStartDeferredEvaluation.Single.Factory()); + Factories.Add(new TestMethods.FixedStartDeferredEvaluation.Compound.Factory()); + Factories.Add(new TestMethods.FixedStartDeferredEvaluation.HeatMeters.Factory()); + Factories.Add(new TestMethods.FixedStartMassCollection.Single.Factory()); + Factories.Add(new TestMethods.FixedStartMassCollection.Compound.Factory()); + Factories.Add(new TestMethods.FixedStartMassCollection.HeatMeters.Factory()); + Factories.Add(new TestMethods.FlyingStart.Single.Factory()); + Factories.Add(new TestMethods.FlyingStart.Compound.Factory()); + Factories.Add(new TestMethods.FlyingStart.HeatMeters.Factory()); + Factories.Add(new TestMethods.FlyingStartMassCollection.Single.Factory()); + Factories.Add(new TestMethods.FlyingStartMassCollection.Compound.Factory()); + Factories.Add(new TestMethods.FlyingStartMassCollection.HeatMeters.Factory()); + Factories.Add(new TestMethods.FlyingStartMassCollProlonged.Single.Factory()); + Factories.Add(new TestMethods.FlyingStartMassCollProlonged.Compound.Factory()); + Factories.Add(new TestMethods.FlyingStartMassCollProlonged.HeatMeters.Factory()); + Factories.Add(new TestMethods.FlyingStartFirstRepetWithMassColl.Single.Factory()); + Factories.Add(new TestMethods.FlyingStartFirstRepetWithMassColl.Compound.Factory()); + Factories.Add(new TestMethods.FlyingStartFirstRepetWithMassColl.HeatMeters.Factory()); + Factories.Add(new TestMethods.GrabImage.Factory()); + Factories.Add(new TestMethods.LeakTest.TestMethodFactory()); + Factories.Add(new TestMethods.LiveStream.Factory()); + Factories.Add(new TestMethods.OuterLoop.Start.Factory()); + Factories.Add(new TestMethods.OuterLoop.End.Factory()); + Factories.Add(new TestMethods.PMaxTest.TestMethodFactory()); + Factories.Add(new TestMethods.PulsesTest.Factory()); + Factories.Add(new TestMethods.SensitivityTest.TestMethodFactory()); + // Factories.Add(new TestMethods.iPerlCommunication.TestMethodFactory()); /// iPerlCommunication + Factories.Add(new TestMethods.RoiDetection.RoiDetectionFactory()); + Factories.Add(new DataEntry.WMStates.EntryFormFactory()); + Factories.Add(new Ambient.Comet.Factory()); + Factories.Add(new Ambient.Greco.Factory()); + Factories.Add(new Keithley.Multimeter_2010_RS232.Factory()); /// Keithley.Multimeter_2010_RS232 + Factories.Add(new Keithley.TempMeter.Factory()); /// Keithley.TempMeter + Factories.Add(new MettlerToledo.Standard.BalanceFactory()); /// MettlerToledo Balance + Factories.Add(new MettlerToledo.Standard.BalanceOldFactory()); /// MettlerToledoBalanceOld + Factories.Add(new MettlerToledo.Standard.BalanceNewFactory()); /// MettlerToledoBalanceSN + Factories.Add(new MettlerToledo.Multi.BalanceFactory()); /// MettlerToledo-Multi + Factories.Add(new Modbus.CometAmbient.Factory()); /// Modbus.CometAmbient.Ambient + Factories.Add(new Modbus.Common.Factory()); /// Modbus + Factories.Add(new Modbus.Easytherm.Factory()); /// Modbus.Easytherm + Factories.Add(new Modbus.PressureMeter.Meret.Factory()); /// Modbus.PressureMeter.Meret - Meret pressure meter connected via modbus + Factories.Add(new Modbus.QuidoRS.Factory()); /// Modbus.QuidoRS + Factories.Add(new Modbus.TankSelector.Factory()); /// Modbus.TankSelector + Factories.Add(new Network.Adapter.Factory()); + Factories.Add(new Network.Camera.CLP1611.Factory()); + Factories.Add(new Network.Camera.Display.Factory()); + Factories.Add(new Network.Camera.Roi.Factory()); + Factories.Add(new Network.Camera.RoiForFixedStart.Factory()); + Factories.Add(new Network.Comet.Ambient.Factory()); + Factories.Add(new Output.DB.ProductionMonitoring.Factory()); + Factories.Add(new Output.DB.SaveFlowmeterCorrections.Factory()); + Factories.Add(new Output.FileWriters.Basic.FactorySingle()); + Factories.Add(new Output.FileWriters.Basic.FactoryCompound()); + Factories.Add(new Output.FileWriters.Basic.FactoryHeatMeters()); + Factories.Add(new Output.FileWriters.Enhanced.FactorySingle()); + Factories.Add(new Output.FileWriters.Enhanced.FactoryCompound()); + Factories.Add(new Output.FileWriters.Enhanced.FactoryHeatMeters()); + Factories.Add(new Output.FileWriters.ImageArchiver.Factory()); + Factories.Add(new Output.FileWriters.OneFilePerMeter.FactorySingle()); + Factories.Add(new Output.FileWriters.OneFilePerMeter.FactoryCompound()); + Factories.Add(new Output.FileWriters.OneFilePerMeter.FactoryHeatMeters()); + Factories.Add(new Output.FileWriters.Xml.FactorySingle()); + Factories.Add(new Output.FileWriters.Xml.FactoryCompound()); + Factories.Add(new Output.FileWriters.Xml.FactoryHeatMeters()); + Factories.Add(new Output.FileWriters.XmlBatch.FactorySingle()); + Factories.Add(new Output.Printers.Enhanced.FactorySingle()); + Factories.Add(new Output.Printers.Enhanced.FactoryCompound()); + Factories.Add(new Output.Printers.Enhanced.FactoryHeatMeters()); + Factories.Add(new Output.Printers.LabelPrinter.PrinterFactory()); /// LabelPrinter + Factories.Add(new Output.Printers.Munich.PrinterFactory()); + Factories.Add(new Output.Printers.OnePerMeter.FactorySingle()); + Factories.Add(new Output.Printers.OnePerMeter.FactoryCompound()); + Factories.Add(new Output.Printers.OnePerMeter.FactoryHeatMeters()); + Factories.Add(new Output.Printers.Zapiska.FactorySingle()); + Factories.Add(new Output.Printers.Zapiska.FactoryCompound()); + Factories.Add(new Output.Printers.Zapiska.FactoryHeatMeters()); + Factories.Add(new Elde.PressureMeter.PressureMeterFactory()); + Factories.Add(new Elde.PressureMeterInternal.PressureMeterFactory()); + Factories.Add(new Elde.Pump.PumpFactory()); + Factories.Add(new Danfoss.VLT2800.PumpFactory()); + Factories.Add(new Elde.PumpWithFM.PumpFactory()); + Factories.Add(new Elde.PumpTandem.PumpFactory()); + Factories.Add(new Elde.RegisterReader.Factory()); /// 'RegisterReader' + Factories.Add(new Elde.FixedStartRegisterReader.RegisterReaderFactory()); /// 'RegisterReader for standing start/stop' + Factories.Add(new TestMethods.iPerlCommunication.iPerlHead.Factory()); /// 'RegisterReader for iPerl' + Factories.Add(new RegisterReaders.SerialStream.Factory()); /// 'RegisterReader for generic serial stream' + Factories.Add(new Elde.RegulValve.RegulValveFactory()); + Factories.Add(new Elde.RegulValveCoax.Factory()); + Factories.Add(new Elde.RegulValveTandem.RegulValveTandemFactory()); + Factories.Add(new DB.SensusOracle.DatabaseFactory()); + Factories.Add(new Elde.TempMeter.TempMeterFactory()); + Factories.Add(new Elde.TempMeterInternal.TempMeterFactory()); + Factories.Add(new Elde.Valve.ValveFactory()); + Factories.Add(new Elde.ValveEx.ValveFactory()); + Factories.Add(new Various.ErrorFlags.Factory()); + Factories.Add(new WaterMeters.Munich.WaterMeterFactory()); /// 'WaterMeters.Munich' + Factories.Add(new WaterMeters.WaterMeter.WaterMeterFactory()); /// 'WaterMeter' + Factories.Add(new DB.SensusLa.DatabaseFactory()); + Factories.Add(new TestMethods.GenesisCommunication.GenesisHead.Factory()); /// 'RegisterReader for iPerl' + } + + /// + /// Get a component factory given the component name + /// + /// Component class name + /// Component factory instance + public static IComponentFactory CmpntFactoryFromClassName(string className) + { + foreach (var factory in Factories) + { + if (factory.ClassName.Equals(className)) return factory; + } + return null; + } + + /// + /// Get a component configuration given a component DB entity + /// + /// DB entity + /// An appropriate component configuration or null if factory was not found + public static IComponentCfg CmpntCfgFromCmpntEntity(Component entity) + { + IComponentFactory cmpntFactory = CmpntFactoryFromClassName(entity.ClassName); + if (cmpntFactory == null) return null; + + try { return cmpntFactory.CmpntCfgFromCmpntEntity(entity); } + catch { return null; } + } + + + public static string CurrentlyLoadedComponentName; + + /// + /// Load component entities from the database and convert them to TBF components + /// derived from IComponent with mutual references. + /// + /// NHibernate DB session + /// A list of TBF Components + public static IList LoadComponentsFromDB(NHibernate.ISession session) + { + CurrentlyLoadedComponentName = string.Empty; + + foreach (var factory in Factories) factory.ResetStaticProperties(); + + /// Load the list of components from the database + IList cmptnEntities = session.QueryOver() + .OrderBy(x => x.ItemNr).Asc + .List(); + + /// Convert database entities to TBF components + IList components = new List(); + foreach (var entity in cmptnEntities) + { + CurrentlyLoadedComponentName = entity.Name; + + IComponentFactory cmpntFactory = BenchControl.TbfComponents.CmpntFactoryFromClassName(entity.ClassName); + if (cmpntFactory == null) continue; + + IComponent cmpnt = cmpntFactory.GetComponent(cmpntFactory.CmpntCfgFromCmpntEntity(entity), components); + + /// + /// Inherit DebugMode from the parent (if any) + /// + if ((cmpnt.Cfg.DebugLevel == DebugMode.Inherit) && + (cmpnt.Cfg is IChildComponentCfg) && + !string.IsNullOrEmpty(cmpnt.Cfg.ParentName)) + { + bool inherited = false; + foreach (var par in components) + { + if (par.Cfg.Name.Equals(cmpnt.Cfg.ParentName)) + { + /// Parent found, inherit the debug mode + cmpnt.Cfg.DebugLevel = par.Cfg.DebugLevel; + inherited = true; + break; + } + } + if (!inherited) + { + /// Applied when the parent is (most likely) in DebugMode.Off + cmpnt.Cfg.DebugLevel = DebugMode.Off; + } + } + + if (cmpnt.Cfg.DebugLevel != DebugMode.Off) components.Add(cmpnt); + } + + CurrentlyLoadedComponentName = string.Empty; + + return components; + } + + /// + /// Get a reference to a component with a given name from a list of components. + /// + /// Component name + /// A list of components + /// Matching component or null + public static IComponent FindComponent(string name, IList components) + { + if (string.IsNullOrEmpty(name)) return null; + foreach (var cmpnt in components) + { + if (cmpnt.Cfg.Name.Equals(name)) return cmpnt; + } + return null; + } + + public static IComponent FindComponent(string name) + { + return FindComponent(name, StateMachine.Components); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestBenchSim.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestBenchSim.cs new file mode 100644 index 00000000..9789b594 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestBenchSim.cs @@ -0,0 +1,790 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using Dirichlet.Numerics; +using log4net; + +namespace TBF.BenchControl +{ + /// + /// Test bench model inherited by all classes for the simulation of devices. + /// Define DN100, MUNICH or nothing. + /// + public static class TestBenchSim + { + private static readonly ILog log = LogManager.GetLogger(typeof(TestBenchSim)); + + /// + /// Incremented in RunDevice() depending on diverters and valves + /// + public static float Mass1sim; /// Volume in [ltr] or mass in [kg] in the tank1 on the balance1, filled by the diverter1 + public static float Mass2sim; /// Volume in [ltr] or mass in [kg] in the tank2 on the balance2, filled by the diverter2 + + /// + /// Set by regulation valves + /// + public static float Flow1sim; /// flow in [m3/h] through RV1 + public static float Flow2sim; /// flow in [m3/h] through RV2 + public static float Flow3sim; /// flow in [m3/h] through RV3 + public static float Flow4sim; /// flow in [m3/h] through RV4 + public static float Flow5sim; /// flow in [m3/h] through RV5 + public static float Flow6sim; /// flow in [m3/h] through RV5 + + /// + /// Valves and diverters + /// + public static UInt128 SimRoute; + public static bool Div1sim; + public static bool Div2sim; + public static bool Div3sim; + + static int regulValveNo; /// 0=undefined, 1..5 + static int refFlowmtrNo; /// 0=undefined, 1..4 + + public static void Initialize() + { + Mass1sim = 0.0f; /// Initialize tanks + Mass2sim = 0.0f; + Flow1sim = 0.0f; /// Initialize regulation valves + Flow2sim = 0.0f; + Flow3sim = 0.0f; + Flow4sim = 0.0f; + Flow5sim = 0.0f; + Flow6sim = 0.0f; + SimRoute = 0; /// Initialize other valves + Div1sim = false; + Div2sim = false; + Div3sim = false; + } + +#if DN100 + /// Paths modulating the flows + const ulong K5 = (1L << 0); + const ulong K7 = (1L << 1); + const ulong K10 = (1L << 2); + const ulong K13 = (1L << 3); + const ulong K16 = (1L << 4); + const ulong K2 = (1L << 5); + const ulong EmptyValve1 = (1L << 17); + const ulong EmptyValve2 = (1L << 18); + const ulong Vl5 = (1L << 21); + const ulong Path1 = K2 | K5 | K7; + const ulong Path2 = K2 | K5 | K10; + const ulong Path3 = K2 | K5 | K13; + const ulong Path4 = K2 | K5 | K16; + const ulong Path5 = K2 | K5 | Vl5; +#elif MUNICH + const ulong VL11 = (1L << 0); + const ulong VL13 = (1L << 1); + const ulong VL21 = (1L << 2); + const ulong VL23 = (1L << 3); + const ulong VZ1 = (1L << 4); + const ulong VP2 = (1L << 5); + const ulong VP4 = (1L << 6); + const ulong VP5 = (1L << 7); + + const ulong VP6 = (1L << 8); + const ulong VL12 = (1L << 9); + const ulong VL22 = (1L << 10); + const ulong VI11 = (1L << 11); + const ulong VI12 = (1L << 12); + const ulong VI13 = (1L << 13); + const ulong VI21 = (1L << 14); + const ulong VI22 = (1L << 15); + + const ulong VI2P = (1L << 16); + const ulong VI31 = (1L << 17); + const ulong VI32 = (1L << 18); + const ulong VI3P = (1L << 19); + const ulong VI41 = (1L << 20); + const ulong VI42 = (1L << 21); + const ulong VI43 = (1L << 22); + const ulong VI4P = (1L << 23); + + const ulong VB1 = (1L << 24); + const ulong VB1a = (1L << 25); + const ulong VB2 = (1L << 26); + const ulong VB2a = (1L << 27); + const ulong VM1 = (1L << 28); + const ulong VM2 = (1L << 29); + const ulong VM3 = (1L << 30); + const ulong VM4 = ((ulong)1 << 31); + + const ulong Pump1 = ((ulong)1 << 32); + const ulong Block = ((ulong)1 << 33); + const ulong VZ8 = ((ulong)1 << 37); + + const ulong EmptyValve1 = VB1 | VB1a; + const ulong EmptyValve2 = VB2 | VB2a; + + const ulong Path1 = VZ1 | VL12 | VI11 | VI13; + const ulong Path2 = VZ1 | VL11 | VL12 | VI21 | VI22 | VI13; + const ulong Path3 = VZ1 | VL11 | VL12 | VI31 | VI32; + const ulong Path4 = VZ1 | VL11 | VL12 | VI41 | VI42; + const ulong Path5 = VZ1 | VL11 | VL12 | VI41 | VI43; +#elif FUZHOU150 + const ulong VL11 = (1L << 2); + const ulong VL13 = (1L << 3); + const ulong VL4 = (1L << 4); + const ulong VZ6 = (1L << 5); + const ulong VZ7 = (1L << 6); + const ulong VP5 = (1L << 7); + + const ulong VP6 = (1L << 8); + const ulong VL12 = (1L << 9); + const ulong VZ14 = (1L << 10); + const ulong VI11 = (1L << 11); + const ulong VI12 = (1L << 12); + const ulong VI13 = (1L << 13); + const ulong VI21 = (1L << 14); + const ulong VI22 = (1L << 15); + + const ulong VI2p = (1L << 16); + const ulong VI31 = (1L << 17); + const ulong VI32 = (1L << 18); + const ulong VI3p = (1L << 19); + const ulong VI41 = (1L << 20); + const ulong VI42 = (1L << 21); + const ulong VI43 = (1L << 22); + const ulong VI4p = (1L << 23); + + const ulong VB1 = (1L << 24); + const ulong VB1a = (1L << 25); + const ulong VB2 = (1L << 26); + const ulong VB2a = (1L << 27); + const ulong VM1 = (1L << 28); + const ulong VM2 = (1L << 29); + const ulong VM3 = (1L << 20); + + const ulong Pump1 = ((ulong)1 << 32); + const ulong Pump4 = ((ulong)1 << 33); + const ulong Pump2 = ((ulong)1 << 37); + const ulong Pump3 = ((ulong)1 << 38); + const ulong Pump5 = ((ulong)1 << 39); + + const ulong EmptyValve1 = VB1 | VB1a; + const ulong EmptyValve2 = VB2 | VB2a; + + const ulong Path1 = VL12 | VI11 | VI13; + const ulong Path2 = VL12 | VI21 | VI22 | VI13; + const ulong Path3 = VL12 | VI31 | VI32; + const ulong Path4 = VL12 | VI41 | VI42; + const ulong Path5 = VL12 | VI41 | VI43; +#elif FUZHOU300 + const ulong VL11 = (1L << 2); + const ulong VL13 = (1L << 3); + const ulong VL4 = (1L << 4); + const ulong VZ6 = (1L << 5); + const ulong VZ7 = (1L << 6); + const ulong VP5 = (1L << 7); + + const ulong VP6 = (1L << 8); + const ulong VL12 = (1L << 9); + const ulong VZ14 = (1L << 10); + const ulong VI11 = (1L << 11); + const ulong VI12 = (1L << 12); + const ulong VI13 = (1L << 13); + const ulong VI21 = (1L << 14); + const ulong VI22 = (1L << 15); + + const ulong VI2p = (1L << 16); + const ulong VI31 = (1L << 17); + const ulong VI32 = (1L << 18); + const ulong VI3p = (1L << 19); + const ulong VI41 = (1L << 20); + const ulong VI42 = (1L << 21); + const ulong VI43 = (1L << 22); + const ulong VI4p = (1L << 23); + + const ulong VB1 = (1L << 24); + const ulong VB1a = (1L << 25); + const ulong VB2 = (1L << 26); + const ulong VB2a = (1L << 27); + const ulong VM1 = (1L << 28); + const ulong VM2 = (1L << 29); + const ulong VM3 = (1L << 20); + + const ulong Pump1 = ((ulong)1 << 32); + const ulong Pump4 = ((ulong)1 << 33); + const ulong Pump2 = ((ulong)1 << 37); + const ulong Pump3 = ((ulong)1 << 38); + const ulong Pump5 = ((ulong)1 << 39); + + const ulong EmptyValve1 = VB1 | VB1a; + const ulong EmptyValve2 = VB2 | VB2a; + + const ulong Path1 = VL12 | VI11 | VI13; + const ulong Path2 = VL12 | VI21 | VI22 | VI13; + const ulong Path3 = VL12 | VI31 | VI32; + const ulong Path4 = VL12 | VI41 | VI42; + const ulong Path5 = VL12 | VI41 | VI43; +#elif PT200IL || PUCHONG_PT200 || GENESIS || BERLIN + const ulong VM11 = (1L << 4); + const ulong VM12 = (1L << 5); + const ulong VM21 = (1L << 6); + const ulong VM22 = (1L << 7); + + const ulong VZ14 = (1L << 8); + const ulong VZ13 = (1L << 9); + const ulong VL11 = (1L << 10); + const ulong VL13 = (1L << 11); + const ulong VL4 = (1L << 12); + const ulong VZ6 = (1L << 13); + const ulong VZ7 = (1L << 14); + const ulong VP5 = (1L << 15); + + const ulong VP6 = (1L << 16); + const ulong VL12 = (1L << 17); + const ulong VL51 = (1L << 18); + const ulong VL53 = (1L << 19); + const ulong VI11 = (1L << 20); + const ulong VI12 = (1L << 21); + const ulong VI13 = (1L << 22); + const ulong VV1 = (1L << 23); + + const ulong VI21 = (1L << 25); + const ulong VI22 = (1L << 26); + const ulong VI2p = (1L << 27); + const ulong VI31 = (1L << 28); + const ulong VI32 = (1L << 29); + const ulong VI3p = (1L << 30); + const ulong VI41 = (1L << 31); + + const ulong VI42 = (1L << 32); + const ulong VI4p = (1L << 33); + const ulong VI43 = (1L << 37); + + const ulong VM1 = (1L << 50); + const ulong VM2 = (1L << 51); + const ulong VM3 = (1L << 52); + + const ulong VB1 = (1L << 41); + const ulong VB1a = (1L << 42); + const ulong VB2 = (1L << 43); + const ulong VB2a = (1L << 44); + + const ulong Pump1 = (1L << 48); + const ulong Pump4 = (1L << 49); + const ulong Pump2 = (1L << 38); + const ulong Pump3 = (1L << 39); + const ulong Pump5 = (1L << 40); + + const ulong EmptyValve1 = VB1 | VB1a; + const ulong EmptyValve2 = VB2 | VB2a; + + const ulong Path1 = VL12 | VI11 | VI13; + const ulong Path2 = VL12 | VI21 | VI22 | VI13; + const ulong Path3 = VL12 | VI31 | VI32; + const ulong Path4 = VL12 | VI41 | VI42; + const ulong Path5 = VL12 | VI41 | VI43; +#elif BADGER_MALA_TRAT || BADGER_STREDNA_TRAT || BADGER_VELKA_TRAT + const ulong VZ34 = (1L << 0); + const ulong VZ35 = (1L << 1); + const ulong VZ39 = (1L << 2); + const ulong VZ37 = (1L << 3); + const ulong VZ38 = (1L << 4); + const ulong VL31 = (1L << 5); + const ulong VV1 = (1L << 6); + const ulong VS33 = (1L << 7); + + const ulong VS31 = (1L << 8); + const ulong VS32 = (1L << 9); + const ulong VV2 = (1L << 10); + const ulong VL32 = (1L << 11); + const ulong VI31 = (1L << 12); + const ulong VI32 = (1L << 13); + const ulong VI33 = (1L << 14); + const ulong VI34 = (1L << 15); + + const ulong DIV1 = (1L << 16); + const ulong DIV2 = (1L << 17); + const ulong VB1 = (1L << 18); + const ulong VB1a = (1L << 19); + const ulong VB2 = (1L << 20); + const ulong VB2a = (1L << 21); + const ulong P1 = (1L << 22); + const ulong P2 = (1L << 23); + + const ulong EmptyValve1 = VB1 | VB1a; + const ulong EmptyValve2 = VB2 | VB2a; + + const ulong Path1 = VI31; + const ulong Path2 = VI32; + const ulong Path3 = VI33; + const ulong Path4 = VI34; + const ulong Path5 = 0; +#elif CEVAK_PT40_272 || MURES_PT40 || FUZHOU_40 || SLM_50 || MALTA_WSD25 + const ulong VL11 = (1L << 0); + const ulong VL13 = (1L << 1); + const ulong VL18 = (1L << 2); + const ulong VZ12 = (1L << 3); + const ulong VL15 = (1L << 4); + const ulong VL21 = (1L << 5); + const ulong VL23 = (1L << 6); + const ulong VL28 = (1L << 7); + + const ulong VZ5 = (1L << 8); + const ulong VI1 = (1L << 9); + const ulong VI2 = (1L << 10); + const ulong VI3 = (1L << 11); + const ulong VZ9 = (1L << 12); + const ulong VBa = (1L << 13); + const ulong VB = (1L << 14); + const ulong DIV1 = (1L << 15); + + const ulong P1 = (1L << 16); + const ulong P2 = (1L << 17); + const ulong VL9 = (1L << 18); + const ulong VV1 = (1L << 19); + const ulong VV2 = (1L << 20); + const ulong VZ6 = (1L << 21); + const ulong VV3 = (1L << 22); + const ulong Gate = (1L << 23); + + const ulong EmptyValve1 = VB | VBa; + const ulong EmptyValve2 = 0x0000FFFFFFFFFFFF; + + const ulong Path1 = VI1; + const ulong Path2 = VI2; + const ulong Path3 = VI3; + const ulong Path4 = 0; + const ulong Path5 = 0; +#elif TORINO50 + const ulong nic1 = (1L << 0); + const ulong nic2 = (1L << 1); + const ulong VL11 = (1L << 2); + const ulong VL13 = (1L << 3); + const ulong VL18 = (1L << 4); + const ulong VZ13 = (1L << 5); + const ulong VL15 = (1L << 6); + const ulong VZ10 = (1L << 7); + + const ulong VZ6 = (1L << 8); + const ulong VV1 = (1L << 9); + const ulong VV4 = (1L << 10); + const ulong VL12 = (1L << 11); + const ulong VI1 = (1L << 12); + const ulong VI2 = (1L << 13); + const ulong VI3 = (1L << 14); + const ulong VI4 = (1L << 15); + + const ulong VB1 = (1L << 16); + const ulong VB1a = (1L << 17); + const ulong VB2 = (1L << 18); + const ulong VB2a = (1L << 19); + const ulong DIV1 = (1L << 20); + const ulong DIV2 = (1L << 21); + const ulong P1 = (1L << 22); + const ulong P3 = (1L << 23); + + const ulong P2 = (1L << 24); + + const ulong EmptyValve1 = VB1 | VB1a; + const ulong EmptyValve2 = VB2 | VB2a; + + const ulong Path1 = VI1; + const ulong Path2 = VI2; + const ulong Path3 = VI3; + const ulong Path4 = VI4; + const ulong Path5 = 0; +#elif TORUN_PT50_2015 || TURA_IPERL + const ulong VL11 = (1L << 0); + const ulong VL13 = (1L << 1); + const ulong VL15 = (1L << 2); + const ulong VL21 = (1L << 3); + const ulong VL23 = (1L << 4); + const ulong VL18 = (1L << 5); + const ulong VL28 = (1L << 6); + const ulong VZ5 = (1L << 7); + + const ulong VZ6 = (1L << 8); + const ulong DIV1 = (1L << 9); + const ulong DIV2 = (1L << 10); + const ulong P1 = (1L << 11); + const ulong P2 = (1L << 12); + const ulong P3 = (1L << 13); + const ulong DIV3 = (1L << 14); + const ulong rez1 = (1L << 15); + + const ulong nic1 = (1L << 16); + const ulong nic2 = (1L << 17); + const ulong VI1 = (1L << 18); + const ulong VI2 = (1L << 19); + const ulong VI3 = (1L << 20); + const ulong VI4 = (1L << 21); + const ulong VI5 = (1L << 22); + const ulong VB1 = (1L << 23); + + const ulong VV12 = (1L << 24); + const ulong VV22 = (1L << 25); + const ulong VI6 = (1L << 26); + const ulong VV3 = (1L << 27); + const ulong VB2 = (1L << 28); + + const ulong EmptyValve1 = VB1; + const ulong EmptyValve2 = VB2; + + const ulong Path1 = VI1; + const ulong Path2 = VI2; + const ulong Path3 = VI3; + const ulong Path4 = VI4; + const ulong Path5 = VI5; + const ulong Path6 = VI6; +#elif TURA_SPECIAL + const ulong VL11 = (1L << 0); + const ulong VL13 = (1L << 1); + const ulong VL15 = (1L << 2); + const ulong VL21 = (1L << 3); + const ulong VL23 = (1L << 4); + const ulong VL18 = (1L << 5); + const ulong VL28 = (1L << 6); + const ulong VZ5 = (1L << 7); + + const ulong VZ6 = (1L << 8); + const ulong DIV1 = (1L << 9); + const ulong DIV2 = (1L << 10); + const ulong P1 = (1L << 11); + const ulong P2 = (1L << 12); + const ulong P3 = (1L << 13); + const ulong DIV3 = (1L << 14); + const ulong rez1 = (1L << 15); + + const ulong nic1 = (1L << 16); + const ulong nic2 = (1L << 17); + const ulong VI1 = (1L << 18); + const ulong VI2 = (1L << 19); + const ulong VI3 = (1L << 20); + const ulong VI4 = (1L << 21); + const ulong VI5 = (1L << 22); + const ulong VB1 = (1L << 23); + + const ulong VV12 = (1L << 24); + const ulong VV22 = (1L << 25); + const ulong VI6 = (1L << 26); + const ulong VV3 = (1L << 27); + const ulong VB2 = (1L << 28); + + const ulong EmptyValve1 = VB1; + const ulong EmptyValve2 = VB2; + + const ulong Path1 = VI1; + const ulong Path2 = VI2; + const ulong Path3 = VI3; + const ulong Path4 = VI4; + const ulong Path5 = VI5; + const ulong Path6 = VI6; +#else + /// Paths modulating the flows + const ulong V1 = (1L << 1); + const ulong V2 = (1L << 2); + const ulong V3 = (1L << 3); + const ulong V3b = (1L << 4); + const ulong V4 = (1L << 5); + const ulong V4b = (1L << 6); + const ulong V5 = (1L << 7); + const ulong V5b = (1L << 8); + const ulong EmptyValve1 = (1L << 9); // =Ve1 + const ulong EmptyValve2 = (1L << 10); // =Ve2 + const ulong Path1 = V1 | V3 | V3b | V4 | V4b; + const ulong Path2 = V2 | V3 | V3b | V5 | V5b; + const ulong Path3 = 0; + const ulong Path4 = 0; + const ulong Path5 = 0; +#endif + /// Run this device + public static void RunDevice(int regulValveNo, int refFlowmtrNo, Elde.StatusP statusP) + { + TestBenchSim.regulValveNo = regulValveNo; + TestBenchSim.refFlowmtrNo = refFlowmtrNo; + float time = 1.0f; + +#if DN100 + if (Div1sim && (SimRoute & Path1) == Path1) Mass1sim += DiffKg(Flow1sim, time); + if (Div1sim && (SimRoute & Path2) == Path2) Mass1sim += DiffKg(Flow2sim, time); + if (Div2sim && (SimRoute & Path3) == Path3) Mass2sim += DiffKg(Flow3sim, time); + if (Div2sim && (SimRoute & Path4) == Path4) Mass2sim += DiffKg(Flow4sim, time); + if (Div1sim && (SimRoute & Path5) == Path5) Mass1sim += DiffKg(Flow5sim, time); +#elif MUNICH || FUZHOU150 || FUZHOU300 || PT200IL || PUCHONG_PT200 || GENESIS || BERLIN + if (Div1sim && (SimRoute & Path1) == Path1) + { + float diff = DiffKg(Flow1sim, time); + Mass1sim += diff; + log.WarnFormat("Path1: Div1, Mass1+={0}kg, flow={1}m3/h, Mass1={2}kg", diff, Flow1sim, Mass1sim); + } + if (Div1sim && (SimRoute & Path2) == Path2) + { + float diff = DiffKg(Flow2sim, time); + Mass1sim += diff; + log.WarnFormat("Path2: Div1, Mass1 += {0}kg, flow={1}m3/h, Mass1={2}kg", diff, Flow1sim, Mass1sim); + } + if (Div2sim && (SimRoute & Path3) == Path3) + { + float diff = DiffKg(Flow3sim, time); + Mass2sim += diff; + log.WarnFormat("Path3: Div2, Mass2 += {0}kg, flow={1}m3/h, Mass2={2}kg", diff, Flow1sim, Mass2sim); + } + if (Div3sim && (SimRoute & Path4) == Path4) + { + float diff = DiffKg(Flow4sim, time); + Mass2sim += diff; + log.WarnFormat("Path4: Div3, Mass2 += {0}kg, flow={1}m3/h, Mass2={2}kg", diff, Flow1sim, Mass2sim); + } + if (Div3sim && (SimRoute & Path5) == Path5) + { + float diff = DiffKg(Flow5sim, time); + Mass2sim += diff; + log.WarnFormat("Path5: Div3, Mass2 += {0}kg, flow={1}m3/h, Mass2={2}kg", diff, Flow1sim, Mass2sim); + } +#elif BADGER_MALA_TRAT || BADGER_STREDNA_TRAT || BADGER_VELKA_TRAT || TORINO50 /// Path1,2 do WT1, Path3,4 do WT2 + if (Div1sim && (SimRoute & Path1) == Path1) Mass1sim += DiffKg(Flow1sim, time); + if (Div1sim && (SimRoute & Path2) == Path2) Mass1sim += DiffKg(Flow2sim, time); + if (Div2sim && (SimRoute & Path3) == Path3) Mass2sim += DiffKg(Flow3sim, time); + if (Div2sim && (SimRoute & Path4) == Path4) Mass2sim += DiffKg(Flow4sim, time); +#elif CEVAK_PT40_272 || MURES_PT40 || FUZHOU_40 || SLM_50 || MALTA_WSD25 /// Path1,2,3 do WT1 + if (Div1sim && (SimRoute & Path1) == Path1) Mass1sim += DiffKg(Flow1sim, time); + if (Div1sim && (SimRoute & Path2) == Path2) Mass1sim += DiffKg(Flow2sim, time); + if (Div1sim && (SimRoute & Path3) == Path3) Mass1sim += DiffKg(Flow3sim, time); +#elif TORUN_PT50_2015 || TURA_IPERL /// Path1,2,3,4,5 do WT1, Path6 do WT2 + if (Div1sim && (SimRoute & Path1) == Path1) Mass1sim += DiffKg(Flow1sim, time); + if (Div1sim && (SimRoute & Path2) == Path2) Mass1sim += DiffKg(Flow2sim, time); + if (Div1sim && (SimRoute & Path3) == Path3) Mass1sim += DiffKg(Flow3sim, time); + if (Div2sim && (SimRoute & Path4) == Path4) Mass1sim += DiffKg(Flow4sim, time); + if (Div2sim && (SimRoute & Path5) == Path5) Mass1sim += DiffKg(Flow5sim, time); + if (Div3sim && (SimRoute & Path6) == Path6) Mass2sim += DiffKg(Flow4sim, time); +#elif TURA_SPECIAL + if (Div1sim && (SimRoute & Path1) == Path1) Mass1sim += DiffKg(Flow1sim, time); + if (Div1sim && (SimRoute & Path2) == Path2) Mass1sim += DiffKg(Flow2sim, time); + if (Div1sim && (SimRoute & Path3) == Path3) Mass1sim += DiffKg(Flow3sim, time); + if (Div2sim && (SimRoute & Path4) == Path4) Mass1sim += DiffKg(Flow4sim, time); + if (Div2sim && (SimRoute & Path5) == Path5) Mass1sim += DiffKg(Flow5sim, time); + if (Div3sim && (SimRoute & Path6) == Path6) Mass2sim += DiffKg(Flow4sim, time); +#else + if (Div1sim && (SimRoute & Path1) == Path1) Mass1sim += DiffKg(Flow1sim, time); + if (Div2sim && (SimRoute & Path2) == Path2) Mass2sim += DiffKg(Flow2sim, time); +#endif + + if ((SimRoute & EmptyValve1) == EmptyValve1) Mass1sim -= DiffKg(100.0f, time); + if (Mass1sim < 0) Mass1sim = 0; + + if ((SimRoute & EmptyValve2) == EmptyValve2) Mass2sim -= DiffKg(10.0f, time); + if (Mass2sim < 0) Mass2sim = 0; + + UiBridge.Bridge.OnLog(null, string.Format("I{1}/RV{2}: q1={3}, q2={4}, q3={5}, q4={6}, q5={7}, D123={8}{9}{10}, m1={11}, m2={12}, S={13}\r\n", + time, refFlowmtrNo, regulValveNo, + Flow1sim.ToString("F1"), + Flow2sim.ToString("F1"), + Flow3sim.ToString("F1"), + Flow4sim.ToString("F1"), + Flow5sim.ToString("F1"), + (Div1sim ? "o" : "x"), + (Div2sim ? "o" : "x"), + (Div3sim ? "o" : "x"), + Mass1sim.ToString("F1"), + Mass2sim.ToString("F1"), + ((ulong)statusP).ToString("X") + ) + ); + } + + + /// + /// Calculate the mass change from the flow and the time period + /// + /// Flow in [m3/h] + /// Time period in [s] + /// Mass change in [kg] + static float DiffKg(float flowM3H, float timeSec) + { + return timeSec * flowM3H / 3.6f; + } + + + /// + /// Get the simulated mass. Use the balance range to distinguish the balances. + /// + /// 0-based balance number + /// Simulated mass reading [kg] + public static float GetSimMass(int balanceNr) + { + if (balanceNr == 0) return Mass1sim; + else if (balanceNr == 1) return Mass2sim; + else return 0; + } + + + /// + /// Set the simulated diverter. Use the nominal flow to distinguish the path. + /// + /// Diverter state: true = to the tank + /// Nominal flow of the path [m3/h] + public static void SetSimDiverter(bool toTank) + { +#if DN100 + switch (regulValveNo) + { + case 1: + case 2: + case 5: + Div1sim = toTank; + break; + case 3: + case 4: + Div2sim = toTank; + break; + default: + if (toTank) { throw (new Exception()); } + break; + } +#elif MUNICH || FUZHOU150 || FUZHOU300 || PT200IL || PUCHONG_PT200 || GENESIS || BERLIN + switch (regulValveNo) + { + case 1: + case 2: + Div1sim = toTank; + break; + case 3: + Div2sim = toTank; + break; + case 4: + case 5: + Div3sim = toTank; + break; + default: + //if (toTank) { throw (new Exception()); } + break; + } +#elif BADGER_MALA_TRAT || BADGER_STREDNA_TRAT || TORINO50 + switch (regulValveNo) + { + case 1: + case 2: + Div1sim = toTank; + break; + case 3: + case 4: + Div2sim = toTank; + break; + default: + if (toTank) { throw (new Exception()); } + break; + } +#elif BADGER_VELKA_TRAT + switch (regulValveNo) + { + case 7: + case 2: + Div1sim = toTank; + break; + case 3: + Div2sim = toTank; + break; + default: + if (toTank) { throw (new Exception()); } + break; + } +#elif CEVAK_PT40_272 || MURES_PT40 || FUZHOU_40 || SLM_50 || MALTA_WSD25 + switch (regulValveNo) + { + case 1: + case 2: + case 3: + Div1sim = toTank; + break; + default: + if (toTank) { /* throw (new Exception()); */ } + break; + } +#elif TORUN_PT50_2015 || TURA_IPERL + switch (regulValveNo) + { + case 1: + case 2: + case 3: + Div1sim = toTank; + break; + case 4: + case 5: + Div2sim = toTank; + break; + case 6: + Div3sim = toTank; + break; + default: + if (toTank) { throw (new Exception()); } + break; + } +#elif TURA_SPECIAL + switch (regulValveNo) + { + case 1: + case 2: + case 3: + Div1sim = toTank; + break; + case 4: + case 5: + Div2sim = toTank; + break; + case 6: + Div3sim = toTank; + break; + default: + if (toTank) { throw (new Exception()); } + break; + } +#else + switch (regulValveNo) + { + case 1: Div1sim = toTank; break; + case 2: Div2sim = toTank; break; + default: + if (toTank) { throw (new Exception()); } + break; + } +#endif + return; + } + + + /// + /// Get the simulated flow in [m3/h]. + /// + /// Simulated flow [m3/h] + public static float GetSimFlow() + { + switch (refFlowmtrNo) + { + case 1: return ((SimRoute & Path1) == Path1) ? Flow1sim : 0; + case 2: return ((SimRoute & Path2) == Path2) ? Flow2sim : 0; + case 3: return ((SimRoute & Path3) == Path3) ? Flow3sim : 0; + case 4: return (((SimRoute & Path4) == Path4) ? Flow4sim : 0) + + (((SimRoute & Path5) == Path5) ? Flow5sim : 0); + default: return 0; + } + } + + + /// + /// Update simulated flow. Use the nominal flow to distinguish the path. + /// + /// Target flow [m3/h] + /// Nominal flow of the path [m3/h] + public static void UpdateSimFlow(float targetFlow) + { + float A = 0.7f; /// higher value -> slower regulation + float B = 1.0f - A; + + switch (regulValveNo) + { + case 1: Flow1sim = A * Flow1sim + B * targetFlow; break; + case 2: Flow2sim = A * Flow2sim + B * targetFlow; break; + case 3: Flow3sim = A * Flow3sim + B * targetFlow; break; + case 4: Flow4sim = A * Flow4sim + B * targetFlow; break; + case 5: Flow5sim = A * Flow5sim + B * targetFlow; break; + case 6: Flow6sim = A * Flow6sim + B * targetFlow; break; + default: break; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/AdjustmentSeq.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/AdjustmentSeq.cs new file mode 100644 index 00000000..4f470e6a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/AdjustmentSeq.cs @@ -0,0 +1,497 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Text; +using log4net; +using Config.Entities; +using TBF.BenchControl; +using TBF.Boxes; +using TBF.Resources; +using TBF.UiBridge; + +namespace TBF.BenchControl.TestMethods.Adjustment +{ + public class AdjustmentSeq : Sequences.SequenceBase + { + private static readonly ILog log = LogManager.GetLogger(typeof(AdjustmentSeq)); + + System.Windows.Forms.Form modelessDlg; + /// + delegate void ErrorsFormDlgt(AdjustmentSeq myRef, IList waterMeters); + /// + void OpenWMErrorsForm(AdjustmentSeq myRef, IList waterMeters) + { +#pragma warning disable 162 /// Disables 'Unreachable code detected' warning + + if (Config.Data.WMsCount > 12) + { + myRef.modelessDlg = new WMErrorsForm24(waterMeters); + } + else if (Config.Data.WMsCount > 6) + { + myRef.modelessDlg = new WMErrorsForm12(waterMeters); + } + else + { + myRef.modelessDlg = new WMErrorsForm(waterMeters); + } + +#pragma warning restore 162 /// Disables 'Unreachable code detected' warning + + modelessDlg.Show(); + } + + /// + /// Adjustment method sequence + /// + /// Test entity + /// + /// Event.Done . . . . . . . OK + /// Event.UiCmdStop . . . . Stopped by the user using the on-screen button STOP + /// Event.OpArgumentError . Target flow is out of range + /// Event.Error . . . . . . Unspecified error + /// + public IList Execute(Test test, int repetitionNr, bool isLastRepetition, DebugMode mode) + { + float simulatedError = 4.5f; /// % + + Elde.ControlBoardDev cBrd = StateMachine.ControlBoard; + + IList e = new List(); /// Events from currently running operations + Event retVal = Event.Done; + checkUiOp = new Operations.CheckUIOp(true); /// Runs in more then one state + + LtrPerRefPulse = outPath.FlowMeter.LtrPerPulse; /// [ltr/pulse], nominal flow in [m3/h] + + /// Notes: + /// float timeHr = volumeLtr / (1000.0f * targetFlow); + /// float timeSec = 3600.0f * timeHr; + /// int refPulses = (int)(timeSec * (2000.0f * targetFlow / pOut.FlowMeter.NominalFlow)); + int totalPulses = (int)(test.Volume / LtrPerRefPulse + 0.5f); + + int rangeIx = 0; /// Default range, used for non-Elde flowmeters + if (outPath.FlowMeter is Elde.FlowMeter.FlowMeter) + { + Elde.FlowMeter.FlowMeter eldeFM = outPath.FlowMeter as Elde.FlowMeter.FlowMeter; + rangeIx = -1; /// Indicates invalid range + for (int r = 0; r <= 5; r++) + { + if (eldeFM.RangeEnabled(r) && eldeFM.GetTempLo(r) <= test.TempLimLo + && eldeFM.GetTempHi(r) >= test.TempLimHi) + { + rangeIx = r; + } + } + + if (rangeIx == -1) + { + Bridge.OnError(this, Strings.Flow_meter_temperature_range_does_not_fit_this_test_conditions); + retVal = Event.UiCmdStop; + goto stopTestWOStoppingDivGateEtc; + } + } + + processDataLoggingOp = new TBF.BenchControl.Operations.ProcessDataLoggingOp(processDataLogger, this, false); + + /// Start the test, initialize test results + Bridge.OnTestSelected(this, new TestSelectedEventArgs(test, repetitionNr, inPath, benchPath, outPath, sensPath, totalPulses)); + string testName = Results.Utils.GetTestName(test.Name, test.Repeats, repetitionNr); + TestStartTime = DateTime.Now; + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + int flowSetTime0 = StateMachine.Time; + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Starting_the_pump); + //------------------------------------------------ + if (inPath.Pump is GenericDevices.IPumpFM) (inPath.Pump as GenericDevices.IPumpFM).TurnOn(test.PumpPower); + /// + State.Create("Adjustment : Starting the pump") + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) +// .AddOperation(new Operations.SetAllRegulValvesOp(inPath.RegulValves, inPath.RegulValvesPct, 60)) + .AddOperation(inPath.Pump != null ? cBrd.SetValvesOp(inPath.Pump, null) : null) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + + } + while (e.Contains(Event.ValvesBusy) /* || !e.Contains(Event.AllPositionsReached)*/); + + + if (test.TimePump2StartV > 0) + { + State.Create(string.Format("{0}({1}) : Waiting after the pump started", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(new Operations.TimerOp(test.TimePump2StartV)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + } + + + if (benchPath.StopBFValve != null) + { + State.Create(string.Format("{0}({1}) : Opening the stop backflow valve", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(benchPath.StopBFValve, null)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } + while (!e.Contains(Event.ValvesSet)); + } + + + if (test.TimeBeforeFlow > 0) + { + State.Create(string.Format("{0}({1}) : Waiting before flow setting process starts", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(new Operations.TimerOp(test.TimeBeforeFlow)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + } + + + setting_flow: + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Setting_the_flow); + //------------------------------------------------ + State.Create("Adjustment : Setting the flow") + .AddOperation(checkUiOp) + .AddOperation(outPath.RegulValve.SetFlowOp(outPath.FlowMeter, test.Qfrom, test.Qto, outPath.PidCoef, RefFlow, 600)) /// timeout = 10 min. + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (e.Contains(Event.OpArgumentError)) { retVal = Event.OpArgumentError; goto stopTest; } + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.RegulValveTimeOut)) + { + Bridge.OnError(this, Strings.Flow_adjustment_failed); + retVal = Event.UiCmdStop; + goto stopTest; + } + if (e.Contains(Event.Next)) goto flow_set; + } + while (!e.Contains(Event.FlowReached)); + + flow_set: + + int flowSetTime = StateMachine.Time - flowSetTime0; + + if (test.DoControlWaterTemp && benchPath.TempMtrUp != null && benchPath.TempMtrDown != null) + { + //--------------------------------------------------- + Bridge.OnActivity(this, Strings.Setting_temperature); + //--------------------------------------------------- + + State.Create(string.Format("{0}({1}) : Wait until the water temperature is within limits", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Next)) goto temperature_set; + + if (TempUp.Val >= test.TempLimLo && TempUp.Val <= test.TempLimHi && + TempDown.Val >= test.TempLimLo && TempDown.Val <= test.TempLimHi) + { + goto temperature_set; + } + } + while (true); + } + + temperature_set: + + /// Show the modeless dialog with error indication + Program.MainWnd.Invoke(new ErrorsFormDlgt(OpenWMErrorsForm), new object[] { this, WaterMeters }); + + loop: + int time = StateMachine.Time; + double currentFlow = RefFlow.Val; + + + /// + /// Prepare cameras, ROI-s and measurementOperations + /// + + /// Find ROI-s + IList rois = new List(); + foreach (var rr in sensPath.RegisterReaders) + { + GenericDevices.IRoi roi = rr as GenericDevices.IRoi; + if (roi != null && roi.Detected) + { + rois.Add(roi); + } + } + + /// Find cameras + IList cameras = new List(); + foreach (var roi in rois) + { + if (roi.Camera != null && !cameras.Contains(roi.Camera)) + { + roi.Camera.ClearRoiParams(); + cameras.Add(roi.Camera); + } + } + + /// Register ROI-parameters to cameras + foreach (var roi in rois) roi.RegisterRoiToCamera(); + + /// Prepare measurementOperations + IList measureOperations = new List(); + foreach (var camera in cameras) measureOperations.Add(camera.MeasurementOp()); + + + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Test_in_progress); + //------------------------------------------------ + if (mode == Config.Entities.DebugMode.Simulate) + { + /// TODO: Reimplement + //tstRslt = MakeSimulated(test, 1, simulatedError); + simulatedError *= 0.6f; + + State.Create("Adjustment : Simulating the test") + .AddOperation(checkUiOp) + .AddOperation(new Operations.TimerOp(5)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + } + else + { + State.Create("Adjustment : Starting the test") + .AddOperation(checkUiOp) + .AddOperations(measureOperations) + .AddOperation(cBrd.StartMeasurementOp(outPath, Elde.TestMethods.Synchro, + test.Qfrom, test.Qto, totalPulses, (float)test.TolerRed)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.MeasurementStarted)); + + /// Measurement loop - preparation + readRegistersOp = new Operations.ReadMoreRegistersOp(sensPath.RegisterReaders); + queryEnd1 = cBrd.QueryMeasurementEndOp(); + queryEnd2 = cBrd.QueryMeasurementEndOp(); + + StartNewStatistics(StateMachine.Time, BatchRslts.Batch.BatchNr, test.Name, repetitionNr); + + /// Measurement loop - begin + while (true) + { + //-------------------------------- + switch (ReadRegistersTempPressAmbient(measureOperations, true)) + { + case Event.Error: { retVal = Event.Error; goto stopTest; } + case Event.UiCmdStop: { retVal = Event.UiCmdStop; goto stopTest; } + case Event.MeasurementCompleted: goto one_test_completed; + } + + RefFreq.Val = cBrd.ReferenceFreq; + RefFlow.Val = cBrd.ReferenceFlow; + UpdateAllStatistics(StateMachine.Time); + + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + } + /// Measurement loop - end + + one_test_completed: + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Adjustment_in_progress); + //------------------------------------------------ + + TestEndTime = DateTime.Now; + + /// Make sure the CycleBeginForm is closed so that water meter data (s/n) can be copied into results + if (UIFlowControl.Stop == WaitBeginFormClosed()) goto stopTest; + + /// + /// Populate TestResult data entity with data + /// + Results.Entities.TestRslt tstRslt = BatchRslts.GetTestRslt(testName, test.Part); + + if (tstRslt != null) + { + UpdateTempPressDensAmb(tstRslt); + + /// Main results + tstRslt.MethodClass = TbfComponents.FindComponent(test.Method).ClassName; + tstRslt.StartTime = TestStartTime; + tstRslt.EndTime = TestEndTime; + tstRslt.FlowSetTime = flowSetTime; + tstRslt.TestTime = cBrd.TTime; /// [s] measurement time + tstRslt.PulsesMaster = Convert.ToDouble(cBrd.EtPulses(0)); /// Pulses of the master flow meter (test total) + tstRslt.MassStart = 0; + tstRslt.MassEnd = 0; + tstRslt.FlowMass = 0; /// [kg/h] + tstRslt.FlowVolume = 3.6 * LtrPerRefPulse * cBrd.EtPulses(0) / tstRslt.TestTime; /// [m3/h] + tstRslt.Buoyancy = Config.Formulas.Buoyancy(); + tstRslt.VolumeMaster = LtrPerRefPulse * tstRslt.PulsesMaster; /// [l] volume from the master flow meter + tstRslt.ConstMasterRaw = outPath.FlowMeter.LtrPerPulse; /// Uncorrected master flowmeter coefficient + tstRslt.ConstMasterCorr = outPath.FlowMeter.LtrPerPulseCorrected(tstRslt.FlowVolume, rangeIx); /// Corrected master pulses per liter + tstRslt.ConstMaster = tstRslt.ConstMasterCorr; /// Corrected master pulses per liter + tstRslt.VolumeCTV = tstRslt.ConstMaster * tstRslt.PulsesMaster; /// [l] 1000.0f is because density is in [kg/m3] + tstRslt.ErrorMaster = 0.0f; /// Cannot be determined without the collected water mass measurement + + tstRslt.FlowMean = (float)RefFlowStat.Average; + tstRslt.FlowStart = (float)RefFlowStat.First; + tstRslt.FlowEnd = (float)RefFlowStat.Last; + tstRslt.FlowMin = (float)RefFlowStat.Min; + tstRslt.FlowMax = (float)RefFlowStat.Max; + + tstRslt.DiverterStart = 0; + tstRslt.DiverterEnd = 0; + tstRslt.ErrorFlagsMd = (ErrorFlagsComp != null) ? (sbyte)ErrorFlagsComp.Mode : (sbyte)0; + tstRslt.ErrorFlags = (ErrorFlagsComp != null) ? ErrorFlagsComp.GetErrorFlags(tstRslt, false, false, 0, 0) : 0; + + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (test.Part != 0 && test.Part != Utils.PartNr(i + 1, BatchRslts.Batch.Compound)) continue; + + Results.Entities.MeterTestRslt meterRslt = BatchRslts.GetMeterTestRslt(testName, i, CompoundMeterId.Single); + GenericDevices.IRegisterReader regReader = sensPath.RegisterReaders[i]; + + if (meterRslt != null && regReader != null) + { + meterRslt.RegReaderType = (int)regReader.RegisterReaderType; + meterRslt.PulsesPerLiter = regReader.PulsesPerLtr; + meterRslt.PulsesMeter = Convert.ToDouble(regReader.WMPulses); + meterRslt.PulsesMaster = Convert.ToDouble(regReader.WMRefPulses); + meterRslt.VolumeStart = 0; /// liter + meterRslt.VolumeEnd = 0; /// liter + meterRslt.VolumeMeter = meterRslt.PulsesMeter * regReader.LtrsPerPulse; /// liter + meterRslt.VolumeRef = meterRslt.PulsesMaster * tstRslt.ConstMaster; /// liter + meterRslt.TestTime = cBrd.ImpulseTime(i + 1); + meterRslt.Error = Config.Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef); + meterRslt.Passed = (meterRslt.Error >= test.GetErrLimLo(tstRslt.FlowMean) + test.Uncertainty) + && (meterRslt.Error <= test.GetErrLimHi(tstRslt.FlowMean) - test.Uncertainty); + meterRslt.TestDone = true; + tstRslt.TestDone = true; + } + } + + tstRslt.Components = Results.Entities.Components + .UpdateList(BatchRslts.ComponentsList, + new Results.Entities.Components((BenchInfo != null) ? BenchInfo.TestBenchId : 1, + (BenchInfo != null) ? BenchInfo.TestBenchName : "testbench", + inPath.Pump != null ? inPath.Pump.Name : string.Empty, + outPath.FlowMeter != null ? outPath.FlowMeter.Name : string.Empty, + outPath.Scale != null ? outPath.Scale.Name : string.Empty, + outPath.RegulValve != null ? outPath.RegulValve.Name : string.Empty, + outPath.Diverter != null ? outPath.Diverter.Name : string.Empty)); + + /// Update water meter error flags + if (ErrorFlagsComp != null) + { + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (BatchRslts.WaterMeters[i] != null) + { + BatchRslts.WaterMeters[i].ErrorFlags = ErrorFlagsComp.GetWMtrErrorFlags(BatchRslts.WaterMeters[i].MeterTestRslts); + } + } + } + + /// Update results + Bridge.OnTestCompleted(this, new TestCompletedEventArgs(testName, tstRslt)); + } + /// Add data - end + } + + + /// Update modeless dialog error information + Bridge.OnAdjustmentInProgress(this, new AdjustmentInProgressEventArgs(testName)); + + /// Test 'Quit' + if ((modelessDlg is GenericDevices.IHasCompleted) && !(modelessDlg as GenericDevices.IHasCompleted).Completed) + { + goto loop; /// Modeless dilaog not closed, keep looping + } + modelessDlg = null; /// Modeless dialog is closed now + + /// Append the results to the CSV-file + allResults.Info(TestResult2CsvLine(testName, test.Part)); + + stopTest: + + /// + /// Quit this sequence + /// + if (isLastRepetition || retVal == Event.UiCmdStop || retVal == Event.OpArgumentError + || retVal == Event.Error || retVal == Event.ConfigurationError) + { + State.Create("Adjustment : Stopping diverter, gate, etc.") + .AddOperation(checkUiOp) + .AddOperation(cBrd.StopPreviousOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.PreviousStopped)); + } + + stopTestWOStoppingDivGateEtc: + + /// Create a list with one item 'retVal' (default is Event.Done) and return it + IList retList = new List(1); + retList.Add(retVal); + return retList; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/Factory.cs new file mode 100644 index 00000000..c2925228 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/Factory.cs @@ -0,0 +1,30 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; +using TBF.BenchControl.Configs.NameOnly; + +namespace TBF.BenchControl.TestMethods.Adjustment +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".Single"; } } + + public void ResetStaticProperties() { TestMethod.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new TestMethod(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new TestMethod(cfg); } + + public IComponentCfg DefaultConfig() + { + return new TestMethodCfg(this.GetType().Namespace.Substring(29) +".Single", this); + } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/TestMethod.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/TestMethod.cs new file mode 100644 index 00000000..831571ec --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/TestMethod.cs @@ -0,0 +1,35 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; +using TBF.BenchControl; + +namespace TBF.BenchControl.TestMethods.Adjustment +{ + public class TestMethod : ComponentBase, GenericDevices.ITestMethod + { + private static readonly ILog log = LogManager.GetLogger(typeof(TestMethod)); + public override string ToString() { return string.Format("TestMethods.Adjustment({0})", Cfg.ToString(1)); } + + public bool CanTest(MetersKind meters) { return meters == MetersKind.Single; } + public bool DoTransitions() { return true; } + + public TestMethod() + { + } + + public TestMethod(Generic.IComponentCfg cfg) + : base(cfg) + { + log.Debug(this.ToString()); + } + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + return (new AdjustmentSeq()).Execute(test, repetNr, isLastRepetition, DebugLevel); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/WMErrorsForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/WMErrorsForm.cs new file mode 100644 index 00000000..3afd8426 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/WMErrorsForm.cs @@ -0,0 +1,217 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.Adjustment +{ + public partial class WMErrorsForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(WMErrorsForm)); + + /// + /// Updated in constructor + /// + readonly int waterMetersCount; /// Number of text boxes for serial numbers + readonly bool[] disabled; + Rectangle[] rects; + + /// + /// Updated in OnAdjustmentInProgress() + /// + double[] error; /// Created in constructor + double errLimLo; + double errLimHi; + + /// + /// Set to 'true' when the form closes + /// + public bool Completed { get { return completed; } } + bool completed; + + + /// + /// Constructor + /// + /// Number of text boxes for serial numbers + public WMErrorsForm(IList waterMeters) + : this() + { + waterMetersCount = waterMeters.Count; + + rects = new Rectangle[waterMetersCount]; + for (int i = 0; i < waterMetersCount; i++) rects[i] = new Rectangle(385, 30 + 90 * i, 324, 57); + + disabled = new bool[waterMetersCount]; + for (int i = 0; i < waterMetersCount; i++) disabled[i] = waterMeters[i].Disabled; + + error = new double[waterMetersCount]; + } + + /// Parameterless constructor for 3 watermeters + public WMErrorsForm() + { + InitializeComponent(); + ControlBox = false; + + completed = false; + + /// Attach to 'AdjustmentInProgress' handler + UiBridge.Bridge.AdjustmentInProgressHandler += delegate(object sender, UiBridge.AdjustmentInProgressEventArgs args) + { + if (InvokeRequired) + { + Invoke(new EventHandler(OnAdjustmentInProgress), sender, args); + } + else OnAdjustmentInProgress(sender, args); + }; + } + + void Localize() + { + Text = Strings.Water_Meter_States; + groupBox1.Text = Strings.Water_Meter + " 1"; + groupBox2.Text = Strings.Water_Meter + " 2"; + groupBox3.Text = Strings.Water_Meter + " 3"; + groupBox4.Text = Strings.Water_Meter + " 4"; + groupBox5.Text = Strings.Water_Meter + " 5"; + groupBox6.Text = Strings.Water_Meter + " 6"; + wmErrorLabel1.Text = Strings.Error_pct; + wmErrorLabel2.Text = Strings.Error_pct; + wmErrorLabel3.Text = Strings.Error_pct; + wmErrorLabel4.Text = Strings.Error_pct; + wmErrorLabel5.Text = Strings.Error_pct; + wmErrorLabel6.Text = Strings.Error_pct; + okButton.Text = Strings.OkBtnText; + } + + private void WMErrorsForm_Load(object sender, EventArgs e) + { + Localize(); + + Height = 50 + 90 * waterMetersCount; + + if (waterMetersCount < 1 || disabled[0]) groupBox1.Visible = false; + if (waterMetersCount < 2 || disabled[1]) groupBox2.Visible = false; + if (waterMetersCount < 3 || disabled[2]) groupBox3.Visible = false; + if (waterMetersCount < 4 || disabled[3]) groupBox4.Visible = false; + if (waterMetersCount < 5 || disabled[4]) groupBox5.Visible = false; + if (waterMetersCount < 6 || disabled[5]) groupBox6.Visible = false; + + wmErrorTextBox1.Text = "---"; + wmErrorTextBox2.Text = "---"; + wmErrorTextBox3.Text = "---"; + wmErrorTextBox4.Text = "---"; + wmErrorTextBox5.Text = "---"; + wmErrorTextBox6.Text = "---"; + } + + private void okButton_Click(object sender, EventArgs e) + { + completed = true; + Close(); + } + + void OnAdjustmentInProgress(object sender, UiBridge.AdjustmentInProgressEventArgs args) + { + string testName = args.TestName; + + Results.Entities.TestRslt tr = TBF.BenchControl.Sequences.ProcessData.BatchRslts.GetTestRslt(testName, 0); + errLimLo = tr.ErrLimLo() + tr.Uncertainty(); + errLimHi = tr.ErrLimHi() - tr.Uncertainty(); + + int count = Math.Min(waterMetersCount, TBF.BenchControl.Sequences.ProcessData.BatchRslts.WMPositionsCount); + for (int i = 0; i < count; i++) + { + Results.Entities.MeterTestRslt mtr = TBF.BenchControl.Sequences.ProcessData.BatchRslts.GetMeterTestRslt(testName, i, CompoundMeterId.Single); + if (mtr != null) error[i] = mtr.Error; + } + + Redraw(); + } + + void Redraw() + { + if (waterMetersCount > 0 && !disabled[0]) wmErrorTextBox1.Text = error[0].ToString("F1"); + if (waterMetersCount > 1 && !disabled[1]) wmErrorTextBox2.Text = error[1].ToString("F1"); + if (waterMetersCount > 2 && !disabled[2]) wmErrorTextBox3.Text = error[2].ToString("F1"); + if (waterMetersCount > 3 && !disabled[3]) wmErrorTextBox4.Text = error[3].ToString("F1"); + if (waterMetersCount > 4 && !disabled[4]) wmErrorTextBox5.Text = error[4].ToString("F1"); + if (waterMetersCount > 5 && !disabled[5]) wmErrorTextBox6.Text = error[5].ToString("F1"); + + for (int i = 0; i < waterMetersCount; i++) Invalidate(rects[i]); + } + + private void WMErrorsForm_Paint(object sender, PaintEventArgs e) + { + System.Drawing.Graphics graphics = this.CreateGraphics(); + + for (int i = 0; i < waterMetersCount; i++) + { + if (!disabled[i]) + { + PaintOne(graphics, rects[i], error[i], errLimLo, errLimHi); + } + } + } + + void PaintOne(System.Drawing.Graphics g, Rectangle r, double value, double limLo, double limHi) + { + Rectangle rect1 = new Rectangle(r.Left, r.Top, r.Width / 3, r.Height); + Rectangle rect2 = new Rectangle(r.Left + r.Width / 3, r.Top, r.Width / 3, r.Height); + Rectangle rect3 = new Rectangle(r.Left + 2 * (r.Width / 3), r.Top, r.Width / 3, r.Height); + Rectangle rectCent = new Rectangle(r.Left + r.Width / 2 - 1, r.Top, 3, r.Height); + + Brush redBrush = new SolidBrush(Color.FromName("Salmon")); + Brush greenBrush = new SolidBrush(Color.FromName("LightGreen")); + Brush centBrush = new SolidBrush(Color.FromName("Green")); + + g.FillRectangle(redBrush, rect1); + g.FillRectangle(greenBrush, rect2); + g.FillRectangle(redBrush, rect3); + g.FillRectangle(centBrush, rectCent); + + int x0 = r.Left + r.Width / 2; + int dx = r.Height / 3; + int x = (int)((double)r.Width * (2.0 * value - limLo - limHi) / (limHi - limLo) / 6.0f + 0.5f); + + if (x0 - dx + x >= r.Left && x0 + dx + x < r.Left + r.Width) + { + Point[] triangle = new Point[3] + { + new Point(x0 - dx + x, r.Top), + new Point(x0 + dx + x, r.Top), + new Point(x0 + x, r.Top + 2 * r.Height / 3), + }; + + Brush blackBrush = new SolidBrush(Color.Black); + g.FillPolygon(blackBrush, triangle); + } + } + + #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) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/WMErrorsForm.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/WMErrorsForm.designer.cs new file mode 100644 index 00000000..a815ce16 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/WMErrorsForm.designer.cs @@ -0,0 +1,312 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.TestMethods.Adjustment +{ + partial class WMErrorsForm + { + /// + /// 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() + { + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.wmErrorTextBox2 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel2 = new System.Windows.Forms.Label(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.wmErrorTextBox1 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel1 = new System.Windows.Forms.Label(); + this.okButton = new System.Windows.Forms.Button(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.wmErrorTextBox3 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel3 = new System.Windows.Forms.Label(); + this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.wmErrorTextBox4 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel4 = new System.Windows.Forms.Label(); + this.groupBox5 = new System.Windows.Forms.GroupBox(); + this.wmErrorTextBox5 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel5 = new System.Windows.Forms.Label(); + this.groupBox6 = new System.Windows.Forms.GroupBox(); + this.wmErrorTextBox6 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel6 = new System.Windows.Forms.Label(); + this.groupBox2.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.groupBox4.SuspendLayout(); + this.groupBox5.SuspendLayout(); + this.groupBox6.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.wmErrorTextBox2); + this.groupBox2.Controls.Add(this.wmErrorLabel2); + this.groupBox2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox2.ForeColor = System.Drawing.Color.Black; + this.groupBox2.Location = new System.Drawing.Point(25, 102); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(333, 81); + this.groupBox2.TabIndex = 2; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Water Meter 2"; + // + // wmErrorTextBox2 + // + this.wmErrorTextBox2.Font = new System.Drawing.Font("Verdana", 27.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox2.Location = new System.Drawing.Point(183, 21); + this.wmErrorTextBox2.Name = "wmErrorTextBox2"; + this.wmErrorTextBox2.Size = new System.Drawing.Size(137, 52); + this.wmErrorTextBox2.TabIndex = 1; + // + // wmErrorLabel2 + // + this.wmErrorLabel2.AutoSize = true; + this.wmErrorLabel2.Location = new System.Drawing.Point(18, 34); + this.wmErrorLabel2.Name = "wmErrorLabel2"; + this.wmErrorLabel2.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel2.TabIndex = 0; + this.wmErrorLabel2.Text = "Error [%]"; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.wmErrorTextBox1); + this.groupBox1.Controls.Add(this.wmErrorLabel1); + this.groupBox1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox1.ForeColor = System.Drawing.Color.Black; + this.groupBox1.Location = new System.Drawing.Point(25, 12); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(333, 81); + this.groupBox1.TabIndex = 1; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Water Meter 1"; + // + // wmErrorTextBox1 + // + this.wmErrorTextBox1.Font = new System.Drawing.Font("Verdana", 27.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox1.Location = new System.Drawing.Point(183, 21); + this.wmErrorTextBox1.Name = "wmErrorTextBox1"; + this.wmErrorTextBox1.Size = new System.Drawing.Size(137, 52); + this.wmErrorTextBox1.TabIndex = 1; + // + // wmErrorLabel1 + // + this.wmErrorLabel1.AutoSize = true; + this.wmErrorLabel1.Location = new System.Drawing.Point(18, 34); + this.wmErrorLabel1.Name = "wmErrorLabel1"; + this.wmErrorLabel1.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel1.TabIndex = 0; + this.wmErrorLabel1.Text = "Error [%]"; + // + // okButton + // + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(739, 26); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(98, 63); + this.okButton.TabIndex = 7; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.wmErrorTextBox3); + this.groupBox3.Controls.Add(this.wmErrorLabel3); + this.groupBox3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox3.ForeColor = System.Drawing.Color.Black; + this.groupBox3.Location = new System.Drawing.Point(25, 192); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(333, 81); + this.groupBox3.TabIndex = 3; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "Water Meter 3"; + // + // wmErrorTextBox3 + // + this.wmErrorTextBox3.Font = new System.Drawing.Font("Verdana", 27.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox3.Location = new System.Drawing.Point(183, 21); + this.wmErrorTextBox3.Name = "wmErrorTextBox3"; + this.wmErrorTextBox3.Size = new System.Drawing.Size(137, 52); + this.wmErrorTextBox3.TabIndex = 1; + // + // wmErrorLabel3 + // + this.wmErrorLabel3.AutoSize = true; + this.wmErrorLabel3.Location = new System.Drawing.Point(18, 34); + this.wmErrorLabel3.Name = "wmErrorLabel3"; + this.wmErrorLabel3.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel3.TabIndex = 0; + this.wmErrorLabel3.Text = "Error [%]"; + // + // groupBox4 + // + this.groupBox4.Controls.Add(this.wmErrorTextBox4); + this.groupBox4.Controls.Add(this.wmErrorLabel4); + this.groupBox4.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox4.ForeColor = System.Drawing.Color.Black; + this.groupBox4.Location = new System.Drawing.Point(25, 282); + this.groupBox4.Name = "groupBox4"; + this.groupBox4.Size = new System.Drawing.Size(333, 81); + this.groupBox4.TabIndex = 4; + this.groupBox4.TabStop = false; + this.groupBox4.Text = "Water Meter 4"; + // + // wmErrorTextBox4 + // + this.wmErrorTextBox4.Font = new System.Drawing.Font("Verdana", 27.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox4.Location = new System.Drawing.Point(183, 21); + this.wmErrorTextBox4.Name = "wmErrorTextBox4"; + this.wmErrorTextBox4.Size = new System.Drawing.Size(137, 52); + this.wmErrorTextBox4.TabIndex = 1; + // + // wmErrorLabel4 + // + this.wmErrorLabel4.AutoSize = true; + this.wmErrorLabel4.Location = new System.Drawing.Point(18, 34); + this.wmErrorLabel4.Name = "wmErrorLabel4"; + this.wmErrorLabel4.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel4.TabIndex = 0; + this.wmErrorLabel4.Text = "Error [%]"; + // + // groupBox5 + // + this.groupBox5.Controls.Add(this.wmErrorTextBox5); + this.groupBox5.Controls.Add(this.wmErrorLabel5); + this.groupBox5.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox5.ForeColor = System.Drawing.Color.Black; + this.groupBox5.Location = new System.Drawing.Point(25, 372); + this.groupBox5.Name = "groupBox5"; + this.groupBox5.Size = new System.Drawing.Size(333, 81); + this.groupBox5.TabIndex = 5; + this.groupBox5.TabStop = false; + this.groupBox5.Text = "Water Meter 5"; + // + // wmErrorTextBox5 + // + this.wmErrorTextBox5.Font = new System.Drawing.Font("Verdana", 27.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox5.Location = new System.Drawing.Point(183, 21); + this.wmErrorTextBox5.Name = "wmErrorTextBox5"; + this.wmErrorTextBox5.Size = new System.Drawing.Size(137, 52); + this.wmErrorTextBox5.TabIndex = 1; + // + // wmErrorLabel5 + // + this.wmErrorLabel5.AutoSize = true; + this.wmErrorLabel5.Location = new System.Drawing.Point(18, 34); + this.wmErrorLabel5.Name = "wmErrorLabel5"; + this.wmErrorLabel5.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel5.TabIndex = 0; + this.wmErrorLabel5.Text = "Error [%]"; + // + // groupBox6 + // + this.groupBox6.Controls.Add(this.wmErrorTextBox6); + this.groupBox6.Controls.Add(this.wmErrorLabel6); + this.groupBox6.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox6.ForeColor = System.Drawing.Color.Black; + this.groupBox6.Location = new System.Drawing.Point(25, 462); + this.groupBox6.Name = "groupBox6"; + this.groupBox6.Size = new System.Drawing.Size(333, 81); + this.groupBox6.TabIndex = 6; + this.groupBox6.TabStop = false; + this.groupBox6.Text = "Water Meter 6"; + // + // wmErrorTextBox6 + // + this.wmErrorTextBox6.Font = new System.Drawing.Font("Verdana", 27.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox6.Location = new System.Drawing.Point(183, 21); + this.wmErrorTextBox6.Name = "wmErrorTextBox6"; + this.wmErrorTextBox6.Size = new System.Drawing.Size(137, 52); + this.wmErrorTextBox6.TabIndex = 1; + // + // wmErrorLabel6 + // + this.wmErrorLabel6.AutoSize = true; + this.wmErrorLabel6.Location = new System.Drawing.Point(18, 34); + this.wmErrorLabel6.Name = "wmErrorLabel6"; + this.wmErrorLabel6.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel6.TabIndex = 0; + this.wmErrorLabel6.Text = "Error [%]"; + // + // WMErrorsForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.ClientSize = new System.Drawing.Size(868, 565); + this.Controls.Add(this.groupBox6); + this.Controls.Add(this.groupBox5); + this.Controls.Add(this.groupBox4); + this.Controls.Add(this.groupBox3); + this.Controls.Add(this.okButton); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.groupBox1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "WMErrorsForm"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "Water Meter States"; + this.TopMost = true; + this.Load += new System.EventHandler(this.WMErrorsForm_Load); + this.Paint += new System.Windows.Forms.PaintEventHandler(this.WMErrorsForm_Paint); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.groupBox4.ResumeLayout(false); + this.groupBox4.PerformLayout(); + this.groupBox5.ResumeLayout(false); + this.groupBox5.PerformLayout(); + this.groupBox6.ResumeLayout(false); + this.groupBox6.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TextBox wmErrorTextBox2; + private System.Windows.Forms.Label wmErrorLabel2; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TextBox wmErrorTextBox1; + private System.Windows.Forms.Label wmErrorLabel1; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.TextBox wmErrorTextBox3; + private System.Windows.Forms.Label wmErrorLabel3; + private System.Windows.Forms.GroupBox groupBox4; + private System.Windows.Forms.TextBox wmErrorTextBox4; + private System.Windows.Forms.Label wmErrorLabel4; + private System.Windows.Forms.GroupBox groupBox5; + private System.Windows.Forms.TextBox wmErrorTextBox5; + private System.Windows.Forms.Label wmErrorLabel5; + private System.Windows.Forms.GroupBox groupBox6; + private System.Windows.Forms.TextBox wmErrorTextBox6; + private System.Windows.Forms.Label wmErrorLabel6; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/WMErrorsForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/WMErrorsForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/WMErrorsForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/WMErrorsForm12.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/WMErrorsForm12.cs new file mode 100644 index 00000000..1c86e1a4 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/WMErrorsForm12.cs @@ -0,0 +1,255 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.Adjustment +{ + public partial class WMErrorsForm12 : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(WMErrorsForm12)); + + const int MaxWMsCount = 12; /// Implementation limit of this form + + /// + /// Updated in constructor + /// + readonly int waterMetersCount; /// Number of text boxes for serial numbers + readonly bool[] disabled; + int textBoxesCount; + Label[] labels; + TextBox[] errors; + Rectangle[] rects; + + /// + /// Updated in OnAdjustmentInProgress() + /// + double[] error; /// Created in constructor + double errLimLo; + double errLimHi; + + /// + /// Set to 'true' when the form closes + /// + public bool Completed { get { return completed; } } + bool completed; + + + /// Parameterless constructor for 3 watermeters + public WMErrorsForm12() + { + InitializeComponent(); + ControlBox = false; + + textBoxesCount = MaxWMsCount; + + labels = new Label[MaxWMsCount] + { + wmErrorLabel1, wmErrorLabel2, wmErrorLabel3, wmErrorLabel4, wmErrorLabel5, + wmErrorLabel6, wmErrorLabel7, wmErrorLabel8, wmErrorLabel9, wmErrorLabel10, + wmErrorLabel11, wmErrorLabel12, + }; + errors = new TextBox[MaxWMsCount] + { + wmErrorTextBox1, wmErrorTextBox2, wmErrorTextBox3, wmErrorTextBox4, wmErrorTextBox5, + wmErrorTextBox6, wmErrorTextBox7, wmErrorTextBox8, wmErrorTextBox9, wmErrorTextBox10, + wmErrorTextBox11, wmErrorTextBox12, + }; + + rects = new Rectangle[MaxWMsCount]; + for (int i = 0; i < MaxWMsCount; i++) + { + int row = i % 12; + int col = i / 12; + rects[i] = new Rectangle(350 + col * 557, 25 + row * 47, 230, 37); + } + + completed = false; + + /// Attach to 'AdjustmentInProgress' handler + UiBridge.Bridge.AdjustmentInProgressHandler += delegate(object sender, UiBridge.AdjustmentInProgressEventArgs args) + { + if (InvokeRequired) + { + Invoke(new EventHandler(OnAdjustmentInProgress), sender, args); + } + else OnAdjustmentInProgress(sender, args); + }; + } + + /// + /// Constructor + /// + /// Number of text boxes for serial numbers + public WMErrorsForm12(IList waterMeters) + : this() + { + waterMetersCount = waterMeters.Count; + + ShuffleTextBoxes(waterMetersCount, Config.Data.LineSize); + + disabled = new bool[waterMetersCount]; + for (int i = 0; i < waterMetersCount; i++) disabled[i] = waterMeters[i].Disabled; + + error = new double[waterMetersCount]; + } + + + /// + /// 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) + { + if (wmsCount < textBoxesCount && lineSize > 0) + { + int nrLines = (wmsCount + lineSize - 1) / lineSize; + int gap = (textBoxesCount - wmsCount) / nrLines; + + int dest = 0; + for (int l = 0; l < nrLines; l++) + { + for (int i = 0; i < lineSize; i++) + { + labels[dest] = labels[l * lineSize + l * gap + i]; + errors[dest] = errors[l * lineSize + l * gap + i]; + rects[dest] = rects[l * lineSize + l * gap + i]; + dest++; + } + } + textBoxesCount = wmsCount; + } + } + + + void Localize() + { + Text = Strings.Water_Meter_States; + for (int i = 0; i < textBoxesCount; i++) + { + labels[i].Text = string.Format("WM{0} {1}", i + 1, Strings.Error_pct); + } + okButton.Text = Strings.OkBtnText; + } + + private void WMErrorsForm12_Load(object sender, EventArgs e) + { + Localize(); + + //Height = 50 + 90 * WaterMetersCount; + + for (int i = 0; i < textBoxesCount; i++) + { + labels[i].Visible = errors[i].Visible = (disabled == null || i >= disabled.Length || !disabled[i]); + errors[i].Text = "---"; + } + } + + private void okButton_Click(object sender, EventArgs e) + { + completed = true; + Close(); + } + + void OnAdjustmentInProgress(object sender, UiBridge.AdjustmentInProgressEventArgs args) + { + string testName = args.TestName; + + Results.Entities.TestRslt tr = TBF.BenchControl.Sequences.ProcessData.BatchRslts.GetTestRslt(testName, 0); + errLimLo = tr.ErrLimLo() + tr.Uncertainty(); + errLimHi = tr.ErrLimHi() - tr.Uncertainty(); + + int count = Math.Min(waterMetersCount, TBF.BenchControl.Sequences.ProcessData.BatchRslts.WMPositionsCount); + for (int i = 0; i < count; i++) + { + Results.Entities.MeterTestRslt mtr = TBF.BenchControl.Sequences.ProcessData.BatchRslts.GetMeterTestRslt(testName, i, CompoundMeterId.Single); + if (mtr != null) error[i] = mtr.Error; + } + + Redraw(); + } + + void Redraw() + { + for (int i = 0; i < textBoxesCount; i++) + { + errors[i].Text = error[i].ToString("F1"); + Invalidate(rects[i]); + } + } + + private void WMErrorsForm_Paint(object sender, PaintEventArgs e) + { + System.Drawing.Graphics graphics = this.CreateGraphics(); + + for (int i = 0; i < waterMetersCount; i++) + { + if (!disabled[i]) + { + PaintOne(graphics, rects[i], error[i], errLimLo, errLimHi); + } + } + } + + void PaintOne(System.Drawing.Graphics g, Rectangle r, double value, double limLo, double limHi) + { + Rectangle rect1 = new Rectangle(r.Left, r.Top, r.Width / 3, r.Height); + Rectangle rect2 = new Rectangle(r.Left + r.Width / 3, r.Top, r.Width / 3, r.Height); + Rectangle rect3 = new Rectangle(r.Left + 2 * (r.Width / 3), r.Top, r.Width / 3, r.Height); + Rectangle rectCent = new Rectangle(r.Left + r.Width / 2 - 1, r.Top, 3, r.Height); + + Brush redBrush = new SolidBrush(Color.FromName("Salmon")); + Brush greenBrush = new SolidBrush(Color.FromName("LightGreen")); + Brush centBrush = new SolidBrush(Color.FromName("Green")); + + g.FillRectangle(redBrush, rect1); + g.FillRectangle(greenBrush, rect2); + g.FillRectangle(redBrush, rect3); + g.FillRectangle(centBrush, rectCent); + + int x0 = r.Left + r.Width / 2; + int dx = r.Height / 3; + int x = (int)((double)r.Width * (2.0 * value - limLo - limHi) / (limHi - limLo) / 6.0f + 0.5f); + + if (x0 - dx + x >= r.Left && x0 + dx + x < r.Left + r.Width) + { + Point[] triangle = new Point[3] + { + new Point(x0 - dx + x, r.Top), + new Point(x0 + dx + x, r.Top), + new Point(x0 + x, r.Top + 2 * r.Height / 3), + }; + + Brush blackBrush = new SolidBrush(Color.Black); + g.FillPolygon(blackBrush, triangle); + } + } + + #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) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/WMErrorsForm12.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/WMErrorsForm12.designer.cs new file mode 100644 index 00000000..5a43e4a6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/WMErrorsForm12.designer.cs @@ -0,0 +1,385 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.TestMethods.Adjustment +{ + partial class WMErrorsForm12 + { + /// + /// 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() + { + this.wmErrorTextBox2 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel2 = new System.Windows.Forms.Label(); + this.wmErrorLabel1 = new System.Windows.Forms.Label(); + this.okButton = new System.Windows.Forms.Button(); + this.wmErrorTextBox3 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel3 = new System.Windows.Forms.Label(); + this.wmErrorTextBox4 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel4 = new System.Windows.Forms.Label(); + this.wmErrorTextBox5 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel5 = new System.Windows.Forms.Label(); + this.wmErrorTextBox6 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel6 = new System.Windows.Forms.Label(); + this.wmErrorTextBox1 = new System.Windows.Forms.TextBox(); + this.wmErrorTextBox7 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel7 = new System.Windows.Forms.Label(); + this.wmErrorTextBox8 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel8 = new System.Windows.Forms.Label(); + this.wmErrorTextBox9 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel9 = new System.Windows.Forms.Label(); + this.wmErrorTextBox10 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel10 = new System.Windows.Forms.Label(); + this.wmErrorTextBox12 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel12 = new System.Windows.Forms.Label(); + this.wmErrorTextBox11 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel11 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // wmErrorTextBox2 + // + this.wmErrorTextBox2.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox2.Location = new System.Drawing.Point(198, 74); + this.wmErrorTextBox2.Name = "wmErrorTextBox2"; + this.wmErrorTextBox2.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox2.TabIndex = 1; + this.wmErrorTextBox2.Visible = false; + // + // wmErrorLabel2 + // + this.wmErrorLabel2.AutoSize = true; + this.wmErrorLabel2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel2.Location = new System.Drawing.Point(33, 85); + this.wmErrorLabel2.Name = "wmErrorLabel2"; + this.wmErrorLabel2.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel2.TabIndex = 0; + this.wmErrorLabel2.Text = "Error [%]"; + this.wmErrorLabel2.Visible = false; + // + // wmErrorLabel1 + // + this.wmErrorLabel1.AutoSize = true; + this.wmErrorLabel1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel1.Location = new System.Drawing.Point(33, 39); + this.wmErrorLabel1.Name = "wmErrorLabel1"; + this.wmErrorLabel1.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel1.TabIndex = 0; + this.wmErrorLabel1.Text = "Error [%]"; + this.wmErrorLabel1.Visible = false; + // + // okButton + // + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(601, 28); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(98, 63); + this.okButton.TabIndex = 7; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // wmErrorTextBox3 + // + this.wmErrorTextBox3.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox3.Location = new System.Drawing.Point(198, 120); + this.wmErrorTextBox3.Name = "wmErrorTextBox3"; + this.wmErrorTextBox3.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox3.TabIndex = 1; + this.wmErrorTextBox3.Visible = false; + // + // wmErrorLabel3 + // + this.wmErrorLabel3.AutoSize = true; + this.wmErrorLabel3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel3.Location = new System.Drawing.Point(33, 131); + this.wmErrorLabel3.Name = "wmErrorLabel3"; + this.wmErrorLabel3.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel3.TabIndex = 0; + this.wmErrorLabel3.Text = "Error [%]"; + this.wmErrorLabel3.Visible = false; + // + // wmErrorTextBox4 + // + this.wmErrorTextBox4.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox4.Location = new System.Drawing.Point(198, 166); + this.wmErrorTextBox4.Name = "wmErrorTextBox4"; + this.wmErrorTextBox4.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox4.TabIndex = 1; + this.wmErrorTextBox4.Visible = false; + // + // wmErrorLabel4 + // + this.wmErrorLabel4.AutoSize = true; + this.wmErrorLabel4.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel4.Location = new System.Drawing.Point(33, 177); + this.wmErrorLabel4.Name = "wmErrorLabel4"; + this.wmErrorLabel4.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel4.TabIndex = 0; + this.wmErrorLabel4.Text = "Error [%]"; + this.wmErrorLabel4.Visible = false; + // + // wmErrorTextBox5 + // + this.wmErrorTextBox5.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox5.Location = new System.Drawing.Point(198, 213); + this.wmErrorTextBox5.Name = "wmErrorTextBox5"; + this.wmErrorTextBox5.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox5.TabIndex = 1; + this.wmErrorTextBox5.Visible = false; + // + // wmErrorLabel5 + // + this.wmErrorLabel5.AutoSize = true; + this.wmErrorLabel5.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel5.Location = new System.Drawing.Point(33, 224); + this.wmErrorLabel5.Name = "wmErrorLabel5"; + this.wmErrorLabel5.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel5.TabIndex = 0; + this.wmErrorLabel5.Text = "Error [%]"; + this.wmErrorLabel5.Visible = false; + // + // wmErrorTextBox6 + // + this.wmErrorTextBox6.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox6.Location = new System.Drawing.Point(198, 259); + this.wmErrorTextBox6.Name = "wmErrorTextBox6"; + this.wmErrorTextBox6.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox6.TabIndex = 1; + this.wmErrorTextBox6.Visible = false; + // + // wmErrorLabel6 + // + this.wmErrorLabel6.AutoSize = true; + this.wmErrorLabel6.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel6.Location = new System.Drawing.Point(33, 271); + this.wmErrorLabel6.Name = "wmErrorLabel6"; + this.wmErrorLabel6.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel6.TabIndex = 0; + this.wmErrorLabel6.Text = "Error [%]"; + this.wmErrorLabel6.Visible = false; + // + // wmErrorTextBox1 + // + this.wmErrorTextBox1.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox1.Location = new System.Drawing.Point(198, 28); + this.wmErrorTextBox1.Name = "wmErrorTextBox1"; + this.wmErrorTextBox1.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox1.TabIndex = 1; + this.wmErrorTextBox1.Visible = false; + // + // wmErrorTextBox7 + // + this.wmErrorTextBox7.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox7.Location = new System.Drawing.Point(198, 305); + this.wmErrorTextBox7.Name = "wmErrorTextBox7"; + this.wmErrorTextBox7.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox7.TabIndex = 9; + this.wmErrorTextBox7.Visible = false; + // + // wmErrorLabel7 + // + this.wmErrorLabel7.AutoSize = true; + this.wmErrorLabel7.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel7.Location = new System.Drawing.Point(33, 317); + this.wmErrorLabel7.Name = "wmErrorLabel7"; + this.wmErrorLabel7.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel7.TabIndex = 8; + this.wmErrorLabel7.Text = "Error [%]"; + this.wmErrorLabel7.Visible = false; + // + // wmErrorTextBox8 + // + this.wmErrorTextBox8.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox8.Location = new System.Drawing.Point(198, 351); + this.wmErrorTextBox8.Name = "wmErrorTextBox8"; + this.wmErrorTextBox8.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox8.TabIndex = 11; + this.wmErrorTextBox8.Visible = false; + // + // wmErrorLabel8 + // + this.wmErrorLabel8.AutoSize = true; + this.wmErrorLabel8.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel8.Location = new System.Drawing.Point(33, 363); + this.wmErrorLabel8.Name = "wmErrorLabel8"; + this.wmErrorLabel8.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel8.TabIndex = 10; + this.wmErrorLabel8.Text = "Error [%]"; + this.wmErrorLabel8.Visible = false; + // + // wmErrorTextBox9 + // + this.wmErrorTextBox9.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox9.Location = new System.Drawing.Point(198, 397); + this.wmErrorTextBox9.Name = "wmErrorTextBox9"; + this.wmErrorTextBox9.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox9.TabIndex = 13; + this.wmErrorTextBox9.Visible = false; + // + // wmErrorLabel9 + // + this.wmErrorLabel9.AutoSize = true; + this.wmErrorLabel9.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel9.Location = new System.Drawing.Point(33, 408); + this.wmErrorLabel9.Name = "wmErrorLabel9"; + this.wmErrorLabel9.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel9.TabIndex = 12; + this.wmErrorLabel9.Text = "Error [%]"; + this.wmErrorLabel9.Visible = false; + // + // wmErrorTextBox10 + // + this.wmErrorTextBox10.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox10.Location = new System.Drawing.Point(198, 443); + this.wmErrorTextBox10.Name = "wmErrorTextBox10"; + this.wmErrorTextBox10.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox10.TabIndex = 15; + this.wmErrorTextBox10.Visible = false; + // + // wmErrorLabel10 + // + this.wmErrorLabel10.AutoSize = true; + this.wmErrorLabel10.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel10.Location = new System.Drawing.Point(33, 454); + this.wmErrorLabel10.Name = "wmErrorLabel10"; + this.wmErrorLabel10.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel10.TabIndex = 14; + this.wmErrorLabel10.Text = "Error [%]"; + this.wmErrorLabel10.Visible = false; + // + // wmErrorTextBox12 + // + this.wmErrorTextBox12.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox12.Location = new System.Drawing.Point(198, 535); + this.wmErrorTextBox12.Name = "wmErrorTextBox12"; + this.wmErrorTextBox12.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox12.TabIndex = 19; + this.wmErrorTextBox12.Visible = false; + // + // wmErrorLabel12 + // + this.wmErrorLabel12.AutoSize = true; + this.wmErrorLabel12.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel12.Location = new System.Drawing.Point(33, 546); + this.wmErrorLabel12.Name = "wmErrorLabel12"; + this.wmErrorLabel12.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel12.TabIndex = 18; + this.wmErrorLabel12.Text = "Error [%]"; + this.wmErrorLabel12.Visible = false; + // + // wmErrorTextBox11 + // + this.wmErrorTextBox11.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox11.Location = new System.Drawing.Point(198, 489); + this.wmErrorTextBox11.Name = "wmErrorTextBox11"; + this.wmErrorTextBox11.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox11.TabIndex = 17; + this.wmErrorTextBox11.Visible = false; + // + // wmErrorLabel11 + // + this.wmErrorLabel11.AutoSize = true; + this.wmErrorLabel11.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel11.Location = new System.Drawing.Point(33, 500); + this.wmErrorLabel11.Name = "wmErrorLabel11"; + this.wmErrorLabel11.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel11.TabIndex = 16; + this.wmErrorLabel11.Text = "Error [%]"; + this.wmErrorLabel11.Visible = false; + // + // WMErrorsForm12 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.ClientSize = new System.Drawing.Size(731, 592); + this.Controls.Add(this.wmErrorTextBox12); + this.Controls.Add(this.wmErrorLabel12); + this.Controls.Add(this.wmErrorTextBox11); + this.Controls.Add(this.wmErrorLabel11); + this.Controls.Add(this.wmErrorTextBox10); + this.Controls.Add(this.wmErrorLabel10); + this.Controls.Add(this.wmErrorTextBox9); + this.Controls.Add(this.wmErrorLabel9); + this.Controls.Add(this.wmErrorTextBox8); + this.Controls.Add(this.wmErrorLabel8); + this.Controls.Add(this.wmErrorTextBox7); + this.Controls.Add(this.wmErrorLabel7); + this.Controls.Add(this.wmErrorTextBox6); + this.Controls.Add(this.wmErrorLabel6); + this.Controls.Add(this.wmErrorTextBox5); + this.Controls.Add(this.wmErrorLabel5); + this.Controls.Add(this.wmErrorTextBox4); + this.Controls.Add(this.wmErrorLabel4); + this.Controls.Add(this.wmErrorTextBox3); + this.Controls.Add(this.wmErrorLabel3); + this.Controls.Add(this.wmErrorTextBox2); + this.Controls.Add(this.wmErrorLabel2); + this.Controls.Add(this.wmErrorTextBox1); + this.Controls.Add(this.wmErrorLabel1); + this.Controls.Add(this.okButton); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "WMErrorsForm12"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "Water Meter States"; + this.TopMost = true; + this.Load += new System.EventHandler(this.WMErrorsForm12_Load); + this.Paint += new System.Windows.Forms.PaintEventHandler(this.WMErrorsForm_Paint); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox wmErrorTextBox2; + private System.Windows.Forms.Label wmErrorLabel2; + private System.Windows.Forms.Label wmErrorLabel1; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.TextBox wmErrorTextBox3; + private System.Windows.Forms.Label wmErrorLabel3; + private System.Windows.Forms.TextBox wmErrorTextBox4; + private System.Windows.Forms.Label wmErrorLabel4; + private System.Windows.Forms.TextBox wmErrorTextBox5; + private System.Windows.Forms.Label wmErrorLabel5; + private System.Windows.Forms.TextBox wmErrorTextBox6; + private System.Windows.Forms.Label wmErrorLabel6; + private System.Windows.Forms.TextBox wmErrorTextBox1; + private System.Windows.Forms.TextBox wmErrorTextBox7; + private System.Windows.Forms.Label wmErrorLabel7; + private System.Windows.Forms.TextBox wmErrorTextBox8; + private System.Windows.Forms.Label wmErrorLabel8; + private System.Windows.Forms.TextBox wmErrorTextBox9; + private System.Windows.Forms.Label wmErrorLabel9; + private System.Windows.Forms.TextBox wmErrorTextBox10; + private System.Windows.Forms.Label wmErrorLabel10; + private System.Windows.Forms.TextBox wmErrorTextBox12; + private System.Windows.Forms.Label wmErrorLabel12; + private System.Windows.Forms.TextBox wmErrorTextBox11; + private System.Windows.Forms.Label wmErrorLabel11; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/WMErrorsForm12.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/WMErrorsForm12.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/WMErrorsForm12.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/WMErrorsForm24.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/WMErrorsForm24.cs new file mode 100644 index 00000000..094e98d1 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/WMErrorsForm24.cs @@ -0,0 +1,259 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.Adjustment +{ + public partial class WMErrorsForm24 : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(WMErrorsForm24)); + + const int MaxWMsCount = 24; /// Implementation limit of this form + + /// + /// Updated in constructor + /// + readonly int waterMetersCount; /// Number of text boxes for serial numbers + readonly bool[] disabled; + int textBoxesCount; + Label[] labels; + TextBox[] errors; + Rectangle[] rects; + + /// + /// Updated in OnAdjustmentInProgress() + /// + double[] error; /// Created in constructor + double errLimLo; + double errLimHi; + + /// + /// Set to 'true' when the form closes + /// + public bool Completed { get { return completed; } } + bool completed; + + + /// Parameterless constructor for 3 watermeters + public WMErrorsForm24() + { + InitializeComponent(); + ControlBox = false; + + textBoxesCount = MaxWMsCount; + + labels = new Label[MaxWMsCount] + { + wmErrorLabel1, wmErrorLabel2, wmErrorLabel3, wmErrorLabel4, wmErrorLabel5, + wmErrorLabel6, wmErrorLabel7, wmErrorLabel8, wmErrorLabel9, wmErrorLabel10, + wmErrorLabel11, wmErrorLabel12, wmErrorLabel13, wmErrorLabel14, wmErrorLabel15, + wmErrorLabel16, wmErrorLabel17, wmErrorLabel18, wmErrorLabel19, wmErrorLabel20, + wmErrorLabel21, wmErrorLabel22, wmErrorLabel23, wmErrorLabel24, + }; + errors = new TextBox[MaxWMsCount] + { + wmErrorTextBox1, wmErrorTextBox2, wmErrorTextBox3, wmErrorTextBox4, wmErrorTextBox5, + wmErrorTextBox6, wmErrorTextBox7, wmErrorTextBox8, wmErrorTextBox9, wmErrorTextBox10, + wmErrorTextBox11, wmErrorTextBox12, wmErrorTextBox13, wmErrorTextBox14, wmErrorTextBox15, + wmErrorTextBox16, wmErrorTextBox17, wmErrorTextBox18, wmErrorTextBox19, wmErrorTextBox20, + wmErrorTextBox21, wmErrorTextBox22, wmErrorTextBox23, wmErrorTextBox24, + }; + + rects = new Rectangle[MaxWMsCount]; + for (int i = 0; i < MaxWMsCount; i++) + { + int row = i % 12; + int col = i / 12; + rects[i] = new Rectangle(350 + col * 557, 25 + row * 47, 230, 37); + } + + completed = false; + + /// Attach to 'AdjustmentInProgress' handler + UiBridge.Bridge.AdjustmentInProgressHandler += delegate(object sender, UiBridge.AdjustmentInProgressEventArgs args) + { + if (InvokeRequired) + { + Invoke(new EventHandler(OnAdjustmentInProgress), sender, args); + } + else OnAdjustmentInProgress(sender, args); + }; + } + + /// + /// Constructor + /// + /// Number of text boxes for serial numbers + public WMErrorsForm24(IList waterMeters) + : this() + { + waterMetersCount = waterMeters.Count; + + ShuffleTextBoxes(waterMetersCount, Config.Data.LineSize); + + disabled = new bool[waterMetersCount]; + for (int i = 0; i < waterMetersCount; i++) disabled[i] = waterMeters[i].Disabled; + + error = new double[waterMetersCount]; + } + + + /// + /// 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) + { + if (wmsCount < textBoxesCount && lineSize > 0) + { + int nrLines = (wmsCount + lineSize - 1) / lineSize; + int gap = (textBoxesCount - wmsCount) / nrLines; + + int dest = 0; + for (int l = 0; l < nrLines; l++) + { + for (int i = 0; i < lineSize; i++) + { + labels[dest] = labels[l * lineSize + l * gap + i]; + errors[dest] = errors[l * lineSize + l * gap + i]; + rects[dest] = rects[l * lineSize + l * gap + i]; + dest++; + } + } + textBoxesCount = wmsCount; + } + } + + + void Localize() + { + Text = Strings.Water_Meter_States; + for (int i = 0; i < textBoxesCount; i++) + { + labels[i].Text = string.Format("WM{0} {1}", i + 1, Strings.Error_pct); + } + okButton.Text = Strings.OkBtnText; + } + + private void WMErrorsForm24_Load(object sender, EventArgs e) + { + Localize(); + + //Height = 50 + 90 * WaterMetersCount; + + for (int i = 0; i < textBoxesCount; i++) + { + labels[i].Visible = errors[i].Visible = (disabled == null || i >= disabled.Length || !disabled[i]); + errors[i].Text = "---"; + } + } + + private void okButton_Click(object sender, EventArgs e) + { + completed = true; + Close(); + } + + void OnAdjustmentInProgress(object sender, UiBridge.AdjustmentInProgressEventArgs args) + { + string testName = args.TestName; + + Results.Entities.TestRslt tr = TBF.BenchControl.Sequences.ProcessData.BatchRslts.GetTestRslt(testName, 0); + errLimLo = tr.ErrLimLo() + tr.Uncertainty(); + errLimHi = tr.ErrLimHi() - tr.Uncertainty(); + + int count = Math.Min(waterMetersCount, TBF.BenchControl.Sequences.ProcessData.BatchRslts.WMPositionsCount); + for (int i = 0; i < count; i++) + { + Results.Entities.MeterTestRslt mtr = TBF.BenchControl.Sequences.ProcessData.BatchRslts.GetMeterTestRslt(testName, i, CompoundMeterId.Single); + if (mtr != null) error[i] = mtr.Error; + } + + Redraw(); + } + + void Redraw() + { + for (int i = 0; i < textBoxesCount; i++) + { + errors[i].Text = error[i].ToString("F1"); + Invalidate(rects[i]); + } + } + + private void WMErrorsForm_Paint(object sender, PaintEventArgs e) + { + System.Drawing.Graphics graphics = this.CreateGraphics(); + + for (int i = 0; i < waterMetersCount; i++) + { + if (!disabled[i]) + { + PaintOne(graphics, rects[i], error[i], errLimLo, errLimHi); + } + } + } + + void PaintOne(System.Drawing.Graphics g, Rectangle r, double value, double limLo, double limHi) + { + Rectangle rect1 = new Rectangle(r.Left, r.Top, r.Width / 3, r.Height); + Rectangle rect2 = new Rectangle(r.Left + r.Width / 3, r.Top, r.Width / 3, r.Height); + Rectangle rect3 = new Rectangle(r.Left + 2 * (r.Width / 3), r.Top, r.Width / 3, r.Height); + Rectangle rectCent = new Rectangle(r.Left + r.Width / 2 - 1, r.Top, 3, r.Height); + + Brush redBrush = new SolidBrush(Color.FromName("Salmon")); + Brush greenBrush = new SolidBrush(Color.FromName("LightGreen")); + Brush centBrush = new SolidBrush(Color.FromName("Green")); + + g.FillRectangle(redBrush, rect1); + g.FillRectangle(greenBrush, rect2); + g.FillRectangle(redBrush, rect3); + g.FillRectangle(centBrush, rectCent); + + int x0 = r.Left + r.Width / 2; + int dx = r.Height / 3; + int x = (int)((double)r.Width * (2.0 * value - limLo - limHi) / (limHi - limLo) / 6.0f + 0.5f); + + if (x0 - dx + x >= r.Left && x0 + dx + x < r.Left + r.Width) + { + Point[] triangle = new Point[3] + { + new Point(x0 - dx + x, r.Top), + new Point(x0 + dx + x, r.Top), + new Point(x0 + x, r.Top + 2 * r.Height / 3), + }; + + Brush blackBrush = new SolidBrush(Color.Black); + g.FillPolygon(blackBrush, triangle); + } + } + + #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) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/WMErrorsForm24.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/WMErrorsForm24.designer.cs new file mode 100644 index 00000000..39a76a7e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/WMErrorsForm24.designer.cs @@ -0,0 +1,697 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.TestMethods.Adjustment +{ + partial class WMErrorsForm24 + { + /// + /// 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() + { + this.wmErrorTextBox2 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel2 = new System.Windows.Forms.Label(); + this.wmErrorLabel1 = new System.Windows.Forms.Label(); + this.okButton = new System.Windows.Forms.Button(); + this.wmErrorTextBox3 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel3 = new System.Windows.Forms.Label(); + this.wmErrorTextBox4 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel4 = new System.Windows.Forms.Label(); + this.wmErrorTextBox5 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel5 = new System.Windows.Forms.Label(); + this.wmErrorTextBox6 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel6 = new System.Windows.Forms.Label(); + this.wmErrorTextBox1 = new System.Windows.Forms.TextBox(); + this.wmErrorTextBox7 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel7 = new System.Windows.Forms.Label(); + this.wmErrorTextBox8 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel8 = new System.Windows.Forms.Label(); + this.wmErrorTextBox9 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel9 = new System.Windows.Forms.Label(); + this.wmErrorTextBox10 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel10 = new System.Windows.Forms.Label(); + this.wmErrorTextBox12 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel12 = new System.Windows.Forms.Label(); + this.wmErrorTextBox11 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel11 = new System.Windows.Forms.Label(); + this.wmErrorTextBox24 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel24 = new System.Windows.Forms.Label(); + this.wmErrorTextBox23 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel23 = new System.Windows.Forms.Label(); + this.wmErrorTextBox22 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel22 = new System.Windows.Forms.Label(); + this.wmErrorTextBox21 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel21 = new System.Windows.Forms.Label(); + this.wmErrorTextBox20 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel20 = new System.Windows.Forms.Label(); + this.wmErrorTextBox19 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel19 = new System.Windows.Forms.Label(); + this.wmErrorTextBox18 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel18 = new System.Windows.Forms.Label(); + this.wmErrorTextBox17 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel17 = new System.Windows.Forms.Label(); + this.wmErrorTextBox16 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel16 = new System.Windows.Forms.Label(); + this.wmErrorTextBox15 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel15 = new System.Windows.Forms.Label(); + this.wmErrorTextBox14 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel14 = new System.Windows.Forms.Label(); + this.wmErrorTextBox13 = new System.Windows.Forms.TextBox(); + this.wmErrorLabel13 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // wmErrorTextBox2 + // + this.wmErrorTextBox2.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox2.Location = new System.Drawing.Point(198, 74); + this.wmErrorTextBox2.Name = "wmErrorTextBox2"; + this.wmErrorTextBox2.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox2.TabIndex = 1; + this.wmErrorTextBox2.Visible = false; + // + // wmErrorLabel2 + // + this.wmErrorLabel2.AutoSize = true; + this.wmErrorLabel2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel2.Location = new System.Drawing.Point(33, 85); + this.wmErrorLabel2.Name = "wmErrorLabel2"; + this.wmErrorLabel2.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel2.TabIndex = 0; + this.wmErrorLabel2.Text = "Error [%]"; + this.wmErrorLabel2.Visible = false; + // + // wmErrorLabel1 + // + this.wmErrorLabel1.AutoSize = true; + this.wmErrorLabel1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel1.Location = new System.Drawing.Point(33, 39); + this.wmErrorLabel1.Name = "wmErrorLabel1"; + this.wmErrorLabel1.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel1.TabIndex = 0; + this.wmErrorLabel1.Text = "Error [%]"; + this.wmErrorLabel1.Visible = false; + // + // okButton + // + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(1157, 28); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(98, 63); + this.okButton.TabIndex = 7; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // wmErrorTextBox3 + // + this.wmErrorTextBox3.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox3.Location = new System.Drawing.Point(198, 120); + this.wmErrorTextBox3.Name = "wmErrorTextBox3"; + this.wmErrorTextBox3.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox3.TabIndex = 1; + this.wmErrorTextBox3.Visible = false; + // + // wmErrorLabel3 + // + this.wmErrorLabel3.AutoSize = true; + this.wmErrorLabel3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel3.Location = new System.Drawing.Point(33, 131); + this.wmErrorLabel3.Name = "wmErrorLabel3"; + this.wmErrorLabel3.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel3.TabIndex = 0; + this.wmErrorLabel3.Text = "Error [%]"; + this.wmErrorLabel3.Visible = false; + // + // wmErrorTextBox4 + // + this.wmErrorTextBox4.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox4.Location = new System.Drawing.Point(198, 166); + this.wmErrorTextBox4.Name = "wmErrorTextBox4"; + this.wmErrorTextBox4.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox4.TabIndex = 1; + this.wmErrorTextBox4.Visible = false; + // + // wmErrorLabel4 + // + this.wmErrorLabel4.AutoSize = true; + this.wmErrorLabel4.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel4.Location = new System.Drawing.Point(33, 177); + this.wmErrorLabel4.Name = "wmErrorLabel4"; + this.wmErrorLabel4.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel4.TabIndex = 0; + this.wmErrorLabel4.Text = "Error [%]"; + this.wmErrorLabel4.Visible = false; + // + // wmErrorTextBox5 + // + this.wmErrorTextBox5.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox5.Location = new System.Drawing.Point(198, 213); + this.wmErrorTextBox5.Name = "wmErrorTextBox5"; + this.wmErrorTextBox5.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox5.TabIndex = 1; + this.wmErrorTextBox5.Visible = false; + // + // wmErrorLabel5 + // + this.wmErrorLabel5.AutoSize = true; + this.wmErrorLabel5.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel5.Location = new System.Drawing.Point(33, 224); + this.wmErrorLabel5.Name = "wmErrorLabel5"; + this.wmErrorLabel5.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel5.TabIndex = 0; + this.wmErrorLabel5.Text = "Error [%]"; + this.wmErrorLabel5.Visible = false; + // + // wmErrorTextBox6 + // + this.wmErrorTextBox6.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox6.Location = new System.Drawing.Point(198, 259); + this.wmErrorTextBox6.Name = "wmErrorTextBox6"; + this.wmErrorTextBox6.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox6.TabIndex = 1; + this.wmErrorTextBox6.Visible = false; + // + // wmErrorLabel6 + // + this.wmErrorLabel6.AutoSize = true; + this.wmErrorLabel6.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel6.Location = new System.Drawing.Point(33, 271); + this.wmErrorLabel6.Name = "wmErrorLabel6"; + this.wmErrorLabel6.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel6.TabIndex = 0; + this.wmErrorLabel6.Text = "Error [%]"; + this.wmErrorLabel6.Visible = false; + // + // wmErrorTextBox1 + // + this.wmErrorTextBox1.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox1.Location = new System.Drawing.Point(198, 28); + this.wmErrorTextBox1.Name = "wmErrorTextBox1"; + this.wmErrorTextBox1.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox1.TabIndex = 1; + this.wmErrorTextBox1.Visible = false; + // + // wmErrorTextBox7 + // + this.wmErrorTextBox7.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox7.Location = new System.Drawing.Point(198, 305); + this.wmErrorTextBox7.Name = "wmErrorTextBox7"; + this.wmErrorTextBox7.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox7.TabIndex = 9; + this.wmErrorTextBox7.Visible = false; + // + // wmErrorLabel7 + // + this.wmErrorLabel7.AutoSize = true; + this.wmErrorLabel7.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel7.Location = new System.Drawing.Point(33, 317); + this.wmErrorLabel7.Name = "wmErrorLabel7"; + this.wmErrorLabel7.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel7.TabIndex = 8; + this.wmErrorLabel7.Text = "Error [%]"; + this.wmErrorLabel7.Visible = false; + // + // wmErrorTextBox8 + // + this.wmErrorTextBox8.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox8.Location = new System.Drawing.Point(198, 351); + this.wmErrorTextBox8.Name = "wmErrorTextBox8"; + this.wmErrorTextBox8.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox8.TabIndex = 11; + this.wmErrorTextBox8.Visible = false; + // + // wmErrorLabel8 + // + this.wmErrorLabel8.AutoSize = true; + this.wmErrorLabel8.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel8.Location = new System.Drawing.Point(33, 363); + this.wmErrorLabel8.Name = "wmErrorLabel8"; + this.wmErrorLabel8.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel8.TabIndex = 10; + this.wmErrorLabel8.Text = "Error [%]"; + this.wmErrorLabel8.Visible = false; + // + // wmErrorTextBox9 + // + this.wmErrorTextBox9.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox9.Location = new System.Drawing.Point(198, 397); + this.wmErrorTextBox9.Name = "wmErrorTextBox9"; + this.wmErrorTextBox9.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox9.TabIndex = 13; + this.wmErrorTextBox9.Visible = false; + // + // wmErrorLabel9 + // + this.wmErrorLabel9.AutoSize = true; + this.wmErrorLabel9.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel9.Location = new System.Drawing.Point(33, 408); + this.wmErrorLabel9.Name = "wmErrorLabel9"; + this.wmErrorLabel9.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel9.TabIndex = 12; + this.wmErrorLabel9.Text = "Error [%]"; + this.wmErrorLabel9.Visible = false; + // + // wmErrorTextBox10 + // + this.wmErrorTextBox10.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox10.Location = new System.Drawing.Point(198, 443); + this.wmErrorTextBox10.Name = "wmErrorTextBox10"; + this.wmErrorTextBox10.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox10.TabIndex = 15; + this.wmErrorTextBox10.Visible = false; + // + // wmErrorLabel10 + // + this.wmErrorLabel10.AutoSize = true; + this.wmErrorLabel10.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel10.Location = new System.Drawing.Point(33, 454); + this.wmErrorLabel10.Name = "wmErrorLabel10"; + this.wmErrorLabel10.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel10.TabIndex = 14; + this.wmErrorLabel10.Text = "Error [%]"; + this.wmErrorLabel10.Visible = false; + // + // wmErrorTextBox12 + // + this.wmErrorTextBox12.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox12.Location = new System.Drawing.Point(198, 535); + this.wmErrorTextBox12.Name = "wmErrorTextBox12"; + this.wmErrorTextBox12.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox12.TabIndex = 19; + this.wmErrorTextBox12.Visible = false; + // + // wmErrorLabel12 + // + this.wmErrorLabel12.AutoSize = true; + this.wmErrorLabel12.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel12.Location = new System.Drawing.Point(33, 546); + this.wmErrorLabel12.Name = "wmErrorLabel12"; + this.wmErrorLabel12.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel12.TabIndex = 18; + this.wmErrorLabel12.Text = "Error [%]"; + this.wmErrorLabel12.Visible = false; + // + // wmErrorTextBox11 + // + this.wmErrorTextBox11.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox11.Location = new System.Drawing.Point(198, 489); + this.wmErrorTextBox11.Name = "wmErrorTextBox11"; + this.wmErrorTextBox11.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox11.TabIndex = 17; + this.wmErrorTextBox11.Visible = false; + // + // wmErrorLabel11 + // + this.wmErrorLabel11.AutoSize = true; + this.wmErrorLabel11.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel11.Location = new System.Drawing.Point(33, 500); + this.wmErrorLabel11.Name = "wmErrorLabel11"; + this.wmErrorLabel11.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel11.TabIndex = 16; + this.wmErrorLabel11.Text = "Error [%]"; + this.wmErrorLabel11.Visible = false; + // + // wmErrorTextBox24 + // + this.wmErrorTextBox24.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox24.Location = new System.Drawing.Point(754, 535); + this.wmErrorTextBox24.Name = "wmErrorTextBox24"; + this.wmErrorTextBox24.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox24.TabIndex = 43; + this.wmErrorTextBox24.Visible = false; + // + // wmErrorLabel24 + // + this.wmErrorLabel24.AutoSize = true; + this.wmErrorLabel24.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel24.Location = new System.Drawing.Point(589, 546); + this.wmErrorLabel24.Name = "wmErrorLabel24"; + this.wmErrorLabel24.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel24.TabIndex = 42; + this.wmErrorLabel24.Text = "Error [%]"; + this.wmErrorLabel24.Visible = false; + // + // wmErrorTextBox23 + // + this.wmErrorTextBox23.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox23.Location = new System.Drawing.Point(754, 489); + this.wmErrorTextBox23.Name = "wmErrorTextBox23"; + this.wmErrorTextBox23.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox23.TabIndex = 41; + this.wmErrorTextBox23.Visible = false; + // + // wmErrorLabel23 + // + this.wmErrorLabel23.AutoSize = true; + this.wmErrorLabel23.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel23.Location = new System.Drawing.Point(589, 500); + this.wmErrorLabel23.Name = "wmErrorLabel23"; + this.wmErrorLabel23.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel23.TabIndex = 40; + this.wmErrorLabel23.Text = "Error [%]"; + this.wmErrorLabel23.Visible = false; + // + // wmErrorTextBox22 + // + this.wmErrorTextBox22.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox22.Location = new System.Drawing.Point(754, 443); + this.wmErrorTextBox22.Name = "wmErrorTextBox22"; + this.wmErrorTextBox22.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox22.TabIndex = 39; + this.wmErrorTextBox22.Visible = false; + // + // wmErrorLabel22 + // + this.wmErrorLabel22.AutoSize = true; + this.wmErrorLabel22.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel22.Location = new System.Drawing.Point(589, 454); + this.wmErrorLabel22.Name = "wmErrorLabel22"; + this.wmErrorLabel22.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel22.TabIndex = 38; + this.wmErrorLabel22.Text = "Error [%]"; + this.wmErrorLabel22.Visible = false; + // + // wmErrorTextBox21 + // + this.wmErrorTextBox21.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox21.Location = new System.Drawing.Point(754, 397); + this.wmErrorTextBox21.Name = "wmErrorTextBox21"; + this.wmErrorTextBox21.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox21.TabIndex = 37; + this.wmErrorTextBox21.Visible = false; + // + // wmErrorLabel21 + // + this.wmErrorLabel21.AutoSize = true; + this.wmErrorLabel21.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel21.Location = new System.Drawing.Point(589, 408); + this.wmErrorLabel21.Name = "wmErrorLabel21"; + this.wmErrorLabel21.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel21.TabIndex = 36; + this.wmErrorLabel21.Text = "Error [%]"; + this.wmErrorLabel21.Visible = false; + // + // wmErrorTextBox20 + // + this.wmErrorTextBox20.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox20.Location = new System.Drawing.Point(754, 351); + this.wmErrorTextBox20.Name = "wmErrorTextBox20"; + this.wmErrorTextBox20.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox20.TabIndex = 35; + this.wmErrorTextBox20.Visible = false; + // + // wmErrorLabel20 + // + this.wmErrorLabel20.AutoSize = true; + this.wmErrorLabel20.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel20.Location = new System.Drawing.Point(589, 363); + this.wmErrorLabel20.Name = "wmErrorLabel20"; + this.wmErrorLabel20.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel20.TabIndex = 34; + this.wmErrorLabel20.Text = "Error [%]"; + this.wmErrorLabel20.Visible = false; + // + // wmErrorTextBox19 + // + this.wmErrorTextBox19.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox19.Location = new System.Drawing.Point(754, 305); + this.wmErrorTextBox19.Name = "wmErrorTextBox19"; + this.wmErrorTextBox19.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox19.TabIndex = 33; + this.wmErrorTextBox19.Visible = false; + // + // wmErrorLabel19 + // + this.wmErrorLabel19.AutoSize = true; + this.wmErrorLabel19.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel19.Location = new System.Drawing.Point(589, 317); + this.wmErrorLabel19.Name = "wmErrorLabel19"; + this.wmErrorLabel19.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel19.TabIndex = 32; + this.wmErrorLabel19.Text = "Error [%]"; + this.wmErrorLabel19.Visible = false; + // + // wmErrorTextBox18 + // + this.wmErrorTextBox18.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox18.Location = new System.Drawing.Point(754, 259); + this.wmErrorTextBox18.Name = "wmErrorTextBox18"; + this.wmErrorTextBox18.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox18.TabIndex = 27; + this.wmErrorTextBox18.Visible = false; + // + // wmErrorLabel18 + // + this.wmErrorLabel18.AutoSize = true; + this.wmErrorLabel18.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel18.Location = new System.Drawing.Point(589, 271); + this.wmErrorLabel18.Name = "wmErrorLabel18"; + this.wmErrorLabel18.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel18.TabIndex = 23; + this.wmErrorLabel18.Text = "Error [%]"; + this.wmErrorLabel18.Visible = false; + // + // wmErrorTextBox17 + // + this.wmErrorTextBox17.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox17.Location = new System.Drawing.Point(754, 213); + this.wmErrorTextBox17.Name = "wmErrorTextBox17"; + this.wmErrorTextBox17.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox17.TabIndex = 26; + this.wmErrorTextBox17.Visible = false; + // + // wmErrorLabel17 + // + this.wmErrorLabel17.AutoSize = true; + this.wmErrorLabel17.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel17.Location = new System.Drawing.Point(589, 224); + this.wmErrorLabel17.Name = "wmErrorLabel17"; + this.wmErrorLabel17.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel17.TabIndex = 22; + this.wmErrorLabel17.Text = "Error [%]"; + this.wmErrorLabel17.Visible = false; + // + // wmErrorTextBox16 + // + this.wmErrorTextBox16.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox16.Location = new System.Drawing.Point(754, 166); + this.wmErrorTextBox16.Name = "wmErrorTextBox16"; + this.wmErrorTextBox16.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox16.TabIndex = 30; + this.wmErrorTextBox16.Visible = false; + // + // wmErrorLabel16 + // + this.wmErrorLabel16.AutoSize = true; + this.wmErrorLabel16.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel16.Location = new System.Drawing.Point(589, 177); + this.wmErrorLabel16.Name = "wmErrorLabel16"; + this.wmErrorLabel16.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel16.TabIndex = 21; + this.wmErrorLabel16.Text = "Error [%]"; + this.wmErrorLabel16.Visible = false; + // + // wmErrorTextBox15 + // + this.wmErrorTextBox15.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox15.Location = new System.Drawing.Point(754, 120); + this.wmErrorTextBox15.Name = "wmErrorTextBox15"; + this.wmErrorTextBox15.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox15.TabIndex = 31; + this.wmErrorTextBox15.Visible = false; + // + // wmErrorLabel15 + // + this.wmErrorLabel15.AutoSize = true; + this.wmErrorLabel15.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel15.Location = new System.Drawing.Point(589, 131); + this.wmErrorLabel15.Name = "wmErrorLabel15"; + this.wmErrorLabel15.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel15.TabIndex = 20; + this.wmErrorLabel15.Text = "Error [%]"; + this.wmErrorLabel15.Visible = false; + // + // wmErrorTextBox14 + // + this.wmErrorTextBox14.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox14.Location = new System.Drawing.Point(754, 74); + this.wmErrorTextBox14.Name = "wmErrorTextBox14"; + this.wmErrorTextBox14.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox14.TabIndex = 28; + this.wmErrorTextBox14.Visible = false; + // + // wmErrorLabel14 + // + this.wmErrorLabel14.AutoSize = true; + this.wmErrorLabel14.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel14.Location = new System.Drawing.Point(589, 85); + this.wmErrorLabel14.Name = "wmErrorLabel14"; + this.wmErrorLabel14.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel14.TabIndex = 25; + this.wmErrorLabel14.Text = "Error [%]"; + this.wmErrorLabel14.Visible = false; + // + // wmErrorTextBox13 + // + this.wmErrorTextBox13.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorTextBox13.Location = new System.Drawing.Point(754, 28); + this.wmErrorTextBox13.Name = "wmErrorTextBox13"; + this.wmErrorTextBox13.Size = new System.Drawing.Size(137, 40); + this.wmErrorTextBox13.TabIndex = 29; + this.wmErrorTextBox13.Visible = false; + // + // wmErrorLabel13 + // + this.wmErrorLabel13.AutoSize = true; + this.wmErrorLabel13.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmErrorLabel13.Location = new System.Drawing.Point(589, 39); + this.wmErrorLabel13.Name = "wmErrorLabel13"; + this.wmErrorLabel13.Size = new System.Drawing.Size(103, 23); + this.wmErrorLabel13.TabIndex = 24; + this.wmErrorLabel13.Text = "Error [%]"; + this.wmErrorLabel13.Visible = false; + // + // WMErrorsForm24 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.ClientSize = new System.Drawing.Size(1267, 592); + this.Controls.Add(this.wmErrorTextBox24); + this.Controls.Add(this.wmErrorLabel24); + this.Controls.Add(this.wmErrorTextBox23); + this.Controls.Add(this.wmErrorLabel23); + this.Controls.Add(this.wmErrorTextBox22); + this.Controls.Add(this.wmErrorLabel22); + this.Controls.Add(this.wmErrorTextBox21); + this.Controls.Add(this.wmErrorLabel21); + this.Controls.Add(this.wmErrorTextBox20); + this.Controls.Add(this.wmErrorLabel20); + this.Controls.Add(this.wmErrorTextBox19); + this.Controls.Add(this.wmErrorLabel19); + this.Controls.Add(this.wmErrorTextBox18); + this.Controls.Add(this.wmErrorLabel18); + this.Controls.Add(this.wmErrorTextBox17); + this.Controls.Add(this.wmErrorLabel17); + this.Controls.Add(this.wmErrorTextBox16); + this.Controls.Add(this.wmErrorLabel16); + this.Controls.Add(this.wmErrorTextBox15); + this.Controls.Add(this.wmErrorLabel15); + this.Controls.Add(this.wmErrorTextBox14); + this.Controls.Add(this.wmErrorLabel14); + this.Controls.Add(this.wmErrorTextBox13); + this.Controls.Add(this.wmErrorLabel13); + this.Controls.Add(this.wmErrorTextBox12); + this.Controls.Add(this.wmErrorLabel12); + this.Controls.Add(this.wmErrorTextBox11); + this.Controls.Add(this.wmErrorLabel11); + this.Controls.Add(this.wmErrorTextBox10); + this.Controls.Add(this.wmErrorLabel10); + this.Controls.Add(this.wmErrorTextBox9); + this.Controls.Add(this.wmErrorLabel9); + this.Controls.Add(this.wmErrorTextBox8); + this.Controls.Add(this.wmErrorLabel8); + this.Controls.Add(this.wmErrorTextBox7); + this.Controls.Add(this.wmErrorLabel7); + this.Controls.Add(this.wmErrorTextBox6); + this.Controls.Add(this.wmErrorLabel6); + this.Controls.Add(this.wmErrorTextBox5); + this.Controls.Add(this.wmErrorLabel5); + this.Controls.Add(this.wmErrorTextBox4); + this.Controls.Add(this.wmErrorLabel4); + this.Controls.Add(this.wmErrorTextBox3); + this.Controls.Add(this.wmErrorLabel3); + this.Controls.Add(this.wmErrorTextBox2); + this.Controls.Add(this.wmErrorLabel2); + this.Controls.Add(this.wmErrorTextBox1); + this.Controls.Add(this.wmErrorLabel1); + this.Controls.Add(this.okButton); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "WMErrorsForm24"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "Water Meter States"; + this.TopMost = true; + this.Load += new System.EventHandler(this.WMErrorsForm24_Load); + this.Paint += new System.Windows.Forms.PaintEventHandler(this.WMErrorsForm_Paint); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox wmErrorTextBox2; + private System.Windows.Forms.Label wmErrorLabel2; + private System.Windows.Forms.Label wmErrorLabel1; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.TextBox wmErrorTextBox3; + private System.Windows.Forms.Label wmErrorLabel3; + private System.Windows.Forms.TextBox wmErrorTextBox4; + private System.Windows.Forms.Label wmErrorLabel4; + private System.Windows.Forms.TextBox wmErrorTextBox5; + private System.Windows.Forms.Label wmErrorLabel5; + private System.Windows.Forms.TextBox wmErrorTextBox6; + private System.Windows.Forms.Label wmErrorLabel6; + private System.Windows.Forms.TextBox wmErrorTextBox1; + private System.Windows.Forms.TextBox wmErrorTextBox7; + private System.Windows.Forms.Label wmErrorLabel7; + private System.Windows.Forms.TextBox wmErrorTextBox8; + private System.Windows.Forms.Label wmErrorLabel8; + private System.Windows.Forms.TextBox wmErrorTextBox9; + private System.Windows.Forms.Label wmErrorLabel9; + private System.Windows.Forms.TextBox wmErrorTextBox10; + private System.Windows.Forms.Label wmErrorLabel10; + private System.Windows.Forms.TextBox wmErrorTextBox12; + private System.Windows.Forms.Label wmErrorLabel12; + private System.Windows.Forms.TextBox wmErrorTextBox11; + private System.Windows.Forms.Label wmErrorLabel11; + private System.Windows.Forms.TextBox wmErrorTextBox24; + private System.Windows.Forms.Label wmErrorLabel24; + private System.Windows.Forms.TextBox wmErrorTextBox23; + private System.Windows.Forms.Label wmErrorLabel23; + private System.Windows.Forms.TextBox wmErrorTextBox22; + private System.Windows.Forms.Label wmErrorLabel22; + private System.Windows.Forms.TextBox wmErrorTextBox21; + private System.Windows.Forms.Label wmErrorLabel21; + private System.Windows.Forms.TextBox wmErrorTextBox20; + private System.Windows.Forms.Label wmErrorLabel20; + private System.Windows.Forms.TextBox wmErrorTextBox19; + private System.Windows.Forms.Label wmErrorLabel19; + private System.Windows.Forms.TextBox wmErrorTextBox18; + private System.Windows.Forms.Label wmErrorLabel18; + private System.Windows.Forms.TextBox wmErrorTextBox17; + private System.Windows.Forms.Label wmErrorLabel17; + private System.Windows.Forms.TextBox wmErrorTextBox16; + private System.Windows.Forms.Label wmErrorLabel16; + private System.Windows.Forms.TextBox wmErrorTextBox15; + private System.Windows.Forms.Label wmErrorLabel15; + private System.Windows.Forms.TextBox wmErrorTextBox14; + private System.Windows.Forms.Label wmErrorLabel14; + private System.Windows.Forms.TextBox wmErrorTextBox13; + private System.Windows.Forms.Label wmErrorLabel13; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/WMErrorsForm24.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/WMErrorsForm24.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Adjustment/WMErrorsForm24.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/CombinedWithDetection/CombinedWithDetTestParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/CombinedWithDetection/CombinedWithDetTestParams.cs new file mode 100644 index 00000000..6640806f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/CombinedWithDetection/CombinedWithDetTestParams.cs @@ -0,0 +1,166 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.CombinedWithDetection +{ + public class CombinedWithDetTestParams : TestParamsBase, IParamsProvider, ITestParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(CombinedWithDetTestParams) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public float TargetQ; /// Target=terminal flow durning detection when increasing or decreasing the flow + public float RelativeQfrom; /// Tested flow low range related to the detected flow + public float RelativeQto; /// Tested flow high range related to the detected flow + public float RateOfChange; /// Each step is calculated as (TargetQfrom - Qfrom) * RateOfChange, text form is displayed in % (*100) + public float DetectionThreshold; /// Drop of frequency for the detection, text form is displayed in % (*100) + public float OffsetPulsesFreq; /// Offset frequency of pulses of the small WM for the detection in Hz + public bool SupressTrills; /// Main meter readings are ignored during test (suitable for small flows) + + public override void InitializeAll() + { + TargetQ = 3.0f; + RelativeQfrom = -0.4f; + RelativeQto = -0.2f; + RateOfChange = 0.05f; + DetectionThreshold = 0.25f; + OffsetPulsesFreq = 1.0f; + SupressTrills = false; + } + + + string[] paramNames = new string[] + { + Strings.TargetQ, + Strings.RelativeQfrom, + Strings.RelativeQto, + Strings.RateOfChangePct, + Strings.DetectionThresholdPct, + "Offset pulses freq.", + Strings.SupressWMTrills, + }; + public override string ParamName(int i) { return paramNames[i]; } + public override int ParamsCount() { return paramNames.Length; } + + public override string ToString(int i) + { + switch (i) + { + case 0: return TargetQ.ToString(); + case 1: return RelativeQfrom.ToString(); + case 2: return RelativeQto.ToString(); + case 3: return (100.0f * RateOfChange).ToString(); + case 4: return (100.0f * DetectionThreshold).ToString(); + case 5: return OffsetPulsesFreq.ToString(); + case 6: return (SupressTrills ? Strings.yes : Strings.no); + default: return string.Empty; + } + } + + public CfgUpdateFlags UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: TargetQ = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 1: RelativeQfrom = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 2: RelativeQto = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 3: RateOfChange = Utils.ParseUFloat(strValue) / 100.0f; return CfgUpdateFlags.None; + case 4: DetectionThreshold = Utils.ParseUFloat(strValue) / 100.0f; return CfgUpdateFlags.None; + case 5: OffsetPulsesFreq = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 6: SupressTrills = strValue.Equals(Strings.yes); return CfgUpdateFlags.None; + default: return CfgUpdateFlags.None; + } + } + + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + + float dummy; + switch (i) + { + case 0: + case 3: + case 4: + case 5: + if (Utils.TryParseUFloat(strValue, out dummy)) return true; + break; + case 1: + case 2: + if (Utils.TryParseSFloat(strValue, out dummy)) return true; + break; + case 6: + if (strValue.Equals(Strings.yes) || strValue.Equals(Strings.no)) return true; + break; + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(CombinedWithDetTestParams prms) + { + prms.TargetQ = this.TargetQ; + prms.RelativeQfrom = this.RelativeQfrom; + prms.RelativeQto = this.RelativeQto; + prms.RateOfChange = this.RateOfChange; + prms.DetectionThreshold = this.DetectionThreshold; + prms.OffsetPulsesFreq = this.OffsetPulsesFreq; + prms.SupressTrills = this.SupressTrills; + } + + public IParamsProvider Clone() + { + CombinedWithDetTestParams pars = new CombinedWithDetTestParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateFromDbEntity(ComponentTest dbEntity) + { + if (dbEntity == null) return; + try + { + CombinedWithDetTestParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as CombinedWithDetTestParams; + + testParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + test = dbEntity.Test; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + /// + /// Parameterless constructor initializes the parameters + /// + public CombinedWithDetTestParams() + { + } + + public CombinedWithDetTestParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public CombinedWithDetTestParams(ComponentTest testParamsEntity, string componentName, Test test) + { + this.testParamsEntity = testParamsEntity; + this.componentName = componentName; + this.test = test; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/CombinedWithDetection/CombinedWithDetectionSeq.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/CombinedWithDetection/CombinedWithDetectionSeq.cs new file mode 100644 index 00000000..2fdc29c3 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/CombinedWithDetection/CombinedWithDetectionSeq.cs @@ -0,0 +1,826 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Text; +using log4net; +using TBF.BenchControl; +using TBF.Resources; +using TBF.UiBridge; + +namespace TBF.BenchControl.TestMethods.CombinedWithDetection +{ + public class CombinedWithDetectionSeq : Sequences.SequenceBase + { + private static readonly ILog log = LogManager.GetLogger(typeof(CombinedWithDetectionSeq)); + + const int DetectionBufferSize = 9; + const int DetectionKernelSize = 5; + + public IList Execute(Config.Entities.Test test, int repetitionNr, bool isLastRepetition, + CombinedWithDetTestParams testParams, + Config.Entities.DebugMode debugLevel) + { + IList e = new List(); /// Events from currently running operations + checkUiOp = new Operations.CheckUIOp(true); /// Runs in more then one state + + float switchTimeStart = 0.001f; /// in seconds, original vale is 1 ms + float switchTimeEnd = 0.001f; /// in seconds, original vale is 1 ms + + if (test.Part < 1 || test.Part > Config.Data.CompoundWMsCount) + { + UiBridge.Bridge.OnError(this, string.Format("Test 'Part' should be 1 .. {0}", Config.Data.CompoundWMsCount)); + IList retv = new List(1); + retv.Add(Event.ConfigurationError); + return retv; + } + + if (debugLevel == Config.Entities.DebugMode.Simulate) + { + /// + /// Test method simulation + /// + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (test.Name.ToLower().Contains("rise") || test.Name.ToLower().Contains("steig")) + { + MakeSimulatedCompound(test, 1, 0, 0.7f, 0.0f); + } + else + { + MakeSimulatedCompound(test, 1, 0, 0.7f, 0.9f); + } + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.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 + + for (int i = 0; i < Config.Data.WMsCount; i++) + { + TestMethods.iPerlCommunication.iPerlHead.IperlHead iPerl = ((sensPath.RegisterReaders != null) && (i < sensPath.RegisterReaders.Length)) + ? (sensPath.RegisterReaders[i] as TestMethods.iPerlCommunication.iPerlHead.IperlHead) + : null; + if (iPerl != null) + { + /// TODO: Reimplement + //iPerl.LastTestResult = meterRslt; /// Save this water meter test result to iPerl WM + iPerl.NominalTestFlowLph = 500.0 * (double)(test.Qfrom + test.Qto); /// Ave. + convert to liter/hour + } + } + + //------------------------------------------------ + Bridge.OnActivity(this, string.Format("Simulating {0}", test.Name)); + //------------------------------------------------ + + State.Create(string.Format("{0}({1}) : Simulating {1}", test.Method, test.Name)) + .AddOperation(checkUiOp) + .EnterState(); + e = StateMachine.WaitRunDevsRunOps(); + + /// Create a list with one item 'retVal' (default is Event.Done) and return it + IList retListSim = new List(1); + retListSim.Add(TestAndLogUiCmdStop(test, e) ? Event.UiCmdStop : Event.Done); + return retListSim; + } + + + Elde.ControlBoardDev cBrd = StateMachine.ControlBoard; + + /// Specific for combined meters + int[] lastWMPulses = new int[2 * Config.Data.CompoundWMsCount]; + + //-------------------------------- + State.Create(string.Format("{0}({1}) : Stop diverter gate etc", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(cBrd.StopPreviousOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test,e)) goto stopTest; + } + while (!e.Contains(Event.PreviousStopped)); + + + LtrPerRefPulse = outPath.FlowMeter.LtrPerPulse; /// [ltr/pulse], nominal flow in [m3/h] + + /// Notes: + /// float timeHr = volumeLtr / (1000.0f * targetFlow); + /// float timeSec = 3600.0f * timeHr; + /// int refPulses = (int)(timeSec * (2000.0f * targetFlow / pOut.FlowMeter.NominalFlow)); + int totalPulses = (int)(test.Volume / LtrPerRefPulse + 0.5f); + + int rangeIx = 0; /// Default range, used for non-Elde flowmeters + if (outPath.FlowMeter is Elde.FlowMeter.FlowMeter) + { + Elde.FlowMeter.FlowMeter eldeFM = outPath.FlowMeter as Elde.FlowMeter.FlowMeter; + rangeIx = -1; /// Indicates invalid range + for (int r = 0; r <= 5; r++) + { + if (eldeFM.RangeEnabled(r) && eldeFM.GetTempLo(r) <= test.TempLimLo + && eldeFM.GetTempHi(r) >= test.TempLimHi) + { + rangeIx = r; + } + } + + if (rangeIx == -1) + { + Bridge.OnError(this, Strings.Flow_meter_temperature_range_does_not_fit_this_test_conditions); + goto stopTest; + } + } + + processDataLoggingOp = new TBF.BenchControl.Operations.ProcessDataLoggingOp(processDataLogger, this, false); + + /// Meters path is required for the following: + readRegistersOp = new Operations.ReadMoreRegistersOp(sensPath.RegisterReaders); + + //==================================== + loop: + /// Start the test, initialize test results + Bridge.OnTestSelected(this, new TestSelectedEventArgs(test, repetitionNr, inPath, benchPath, outPath, sensPath, (int)totalPulses)); + string testName = Results.Utils.GetTestName(test.Name, test.Repeats, repetitionNr); + TestStartTime = DateTime.Now; + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + Qrise = 0; + Qfall = 0; + + if (!test.DoDraining) /// Do not skip emptying if test.Emptying==true + { + //-------------------------------- + State.Create(string.Format("{0}({1}) : Mesuring mass of water in the tank", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(outPath.Scale.ReadMassOp(ref Mass)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) goto error; + if (TestAndLogUiCmdStop(test,e)) goto stopTest; + } + while (!e.Contains(Event.BalanceDone)); + + double estimatedEndMass = Mass.Val + test.Volume; + if (estimatedEndMass < outPath.Scale.Capacity * Constants.TankFullFactor) + { + goto switching_flow_detection; /// Enough room in the tank -> skip emptying + } + } + + /// Empty the water tank + switch (DrainTheTank(outPath.Scale.DrainValve, outPath.Scale)) + { + case Event.Error: goto error; + case Event.UiCmdStop: goto stopTest; + } + + switching_flow_detection: + + int flowDetectTime0 = StateMachine.Time; + int flowDetectTime = 0; + float estFlowSetTime = 100.0f; + + + /// + /// Prepare cameras, ROI-s and measurementOperations + /// + + /// Find ROI-s + IList rois = new List(); + foreach (var rr in sensPath.RegisterReaders) + { + GenericDevices.IRoi roi = rr as GenericDevices.IRoi; + if (roi != null && roi.Detected) + { + rois.Add(roi); + } + } + + /// Find cameras + IList cameras = new List(); + foreach (var roi in rois) + { + if (roi.Camera != null && !cameras.Contains(roi.Camera)) + { + roi.Camera.ClearRoiParams(); + cameras.Add(roi.Camera); + } + } + + /// Register ROI-parameters to cameras + foreach (var roi in rois) roi.RegisterRoiToCamera(); + + /// Prepare measurementOperations + IList measureOperations = new List(); + foreach (var camera in cameras) measureOperations.Add(camera.MeasurementOp()); + + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Switching_flow_detection); + //------------------------------------------------ + State.Create(string.Format("{0}({1}) : Start the pump", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperations(measureOperations) + .AddOperation((inPath.Pump is GenericDevices.IPumpFM) ? (inPath.Pump as GenericDevices.IPumpFM).TurnOnOp(test.PumpPower) : null) + .AddOperation(cBrd.SetValvesOp(inPath.Pump, null)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.SwitchingFlowDetection)); + + if (TestAndLogUiCmdStop(test,e)) goto stopTest; + } + while (!e.Contains(Event.ValvesSet)); + + + State.Create(string.Format("{0}({1}) : Set the initial flow", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperations(measureOperations) + .AddOperation(outPath.RegulValve.SetFlowAndMeasureOp(outPath.FlowMeter, test.Qfrom, test.Qto, outPath.PidCoef, RefFlow, 600, (float)test.TolerRed)) /// timeout = 10 min. + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.SwitchingFlowDetection)); + + if (TestAndLogUiCmdStop(test,e)) goto stopTest; + if (e.Contains(Event.RegulValveTimeOut)) + { + Bridge.OnError(this, Strings.Flow_adjustment_failed); + goto stopTest; + } + if (e.Contains(Event.Next)) goto init_flow_set; + } + while (!e.Contains(Event.FlowReached)); + + + switch (ReadRegistersTempPressAmbient(measureOperations, false)) + { + case Event.Error: goto error; + case Event.UiCmdStop: goto stopTest; + } + + + init_flow_set: + + //==================================== + // Find the switching flow + //==================================== + + /// Allocate detection buffers + double[] flowsForDetection = new double[DetectionBufferSize]; /// in [m3/h] + double[] pulseFreqsForDetection = new double[DetectionBufferSize]; + + /// Current values + flowsForDetection[0] = RefFlow.Val; + pulseFreqsForDetection[0] = 0.0f; + int startTime = StateMachine.Time; + int lastTime = StateMachine.Time; + + /// Detection parameters + float rvPulse = (testParams.TargetQ > (test.Qfrom + test.Qto) / 2.0f) ? 0.05f : -0.05f; /// rise(+) or fall(-) + rvPulse *= (100.0f * testParams.RateOfChange); + + bool detected = false; + bool targetReached = false; + double detectedFlow = 0; + + int detectionStartTime = StateMachine.Time; + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.SwitchingFlowDetection)); + + do + { + State.Create(string.Format("{0}({1}) : Change the RV position", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperations(measureOperations) + .AddOperation(outPath.RegulValve.ChangeRegulValvePositionOp(rvPulse)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.SwitchingFlowDetection)); + + if (TestAndLogUiCmdStop(test, e)) goto stopTest; + } + while (!e.Contains(Event.PositionReached)); + + { + /// + /// Update FIFO buffers for the reference flow and the frequency of pulses + /// + + /// Last pulses are kept to calculate differences + for (int i = 0; i < 2 * Config.Data.CompoundWMsCount; i++) lastWMPulses[i] = RegisterReaders[i].WMPulses; + + /// Shift data in the detection buffers + for (int i = DetectionBufferSize - 2; i >= 0; i--) + { + flowsForDetection[i + 1] = flowsForDetection[i]; + pulseFreqsForDetection[i + 1] = pulseFreqsForDetection[i]; + } + + switch (ReadRegistersTempPressAmbient(measureOperations, false)) + { + case Event.Error: goto error; + case Event.UiCmdStop: goto stopTest; + } + + int diff = RegisterReaders[(test.Part - 1) * 2 + 1].WMPulses - lastWMPulses[(test.Part - 1) * 2 + 1]; + flowsForDetection[0] = cBrd.ReferenceFreq * outPath.FlowMeter.NominalFlow / 2000.0; + pulseFreqsForDetection[0] = (double)diff / (double)(StateMachine.Time - lastTime); + lastTime = StateMachine.Time; + } + + if ((StateMachine.Time - detectionStartTime > 15) && (flowsForDetection[0] > 0) && (flowsForDetection[DetectionBufferSize - 1] > 0)) + { + /// + /// Evaluate ref. flow and WM pulses frequency data in FIFO buffers. + /// Updpate 'detected' and 'targetReached' flags. + /// + double[] flowBefore = new double[DetectionKernelSize]; + double[] flowAfter = new double[DetectionKernelSize]; + double[] freqBefore = new double[DetectionKernelSize]; + double[] freqAfter = new double[DetectionKernelSize]; + for (int i = 0; i < DetectionKernelSize; i++) + { + flowBefore[i] = flowsForDetection[DetectionBufferSize - DetectionKernelSize + i]; /// The oldest DetectionKernelSize samples + freqBefore[i] = pulseFreqsForDetection[DetectionBufferSize - DetectionKernelSize + i]; + + flowAfter[i] = flowsForDetection[i]; /// The newest DetectionKernelSize samples + freqAfter[i] = pulseFreqsForDetection[i]; + } + + /// Skip the smallest and the largest flow + Array.Sort(flowBefore); + Array.Sort(flowAfter); + flowBefore[0] = 0; + flowAfter[0] = 0; + flowBefore[DetectionKernelSize - 1] = 0; + flowAfter[DetectionKernelSize - 1] = 0; + /// + double aveFlowBefore = 0; + double aveFlowAfter = 0; + foreach (var f in flowBefore) aveFlowBefore += f; + foreach (var f in flowAfter) aveFlowAfter += f; + aveFlowBefore /= (double)(DetectionKernelSize - 2); + aveFlowAfter /= (double)(DetectionKernelSize - 2); + + /// Do NOT skip the smallest and the largest flow + //Array.Sort(freqBefore); + //Array.Sort(freqAfter); + //freqBefore[0] = 0; + //freqAfter[0] = 0; + //freqBefore[DetectionKernelSize - 1] = 0; + //freqAfter[DetectionKernelSize - 1] = 0; + /// + double aveFreqBefore = 0; + double aveFreqAfter = 0; + foreach (var f in freqBefore) aveFreqBefore += f; + foreach (var f in freqAfter) aveFreqAfter += f; + aveFreqBefore /= (double)DetectionKernelSize; + aveFreqAfter /= (double)DetectionKernelSize; + + UiBridge.Bridge.OnLog(this, string.Format("time={0}, flow{1}, aveFlowB={2}, aveFlowA={3}, pulseFreq={4}, aveFreqB={5}, aveFreqA={6}\r\n", + StateMachine.Time - startTime, + flowsForDetection[0].ToString("F2"), + aveFlowBefore.ToString("F2"), + aveFlowAfter.ToString("F2"), + pulseFreqsForDetection[0].ToString("F2"), + aveFreqBefore.ToString("F2"), + aveFreqAfter.ToString("F2"))); + + //detectedFlow = (aveFlowBefore + aveFlowAfter) / 2.0f; + detectedFlow = aveFlowBefore; + + if (rvPulse > 0) + { + /// rise + detected = (aveFreqAfter < aveFreqBefore * (1.0f - testParams.DetectionThreshold)); + targetReached = ((aveFlowAfter + aveFlowBefore) / 2.0f) > testParams.TargetQ; + } + else + { + /// fall + detected = (aveFreqAfter > (aveFreqBefore + testParams.OffsetPulsesFreq) * (1.0f + testParams.DetectionThreshold)); + targetReached = ((aveFlowAfter + aveFlowBefore) / 2.0f) < testParams.TargetQ; + } + } + + } + while (!detected && !targetReached); + + if (rvPulse > 0) + { + Qrise = detectedFlow; + } + else + { + Qfall = detectedFlow; + } + + UiBridge.Bridge.OnLog(this, string.Format("detected flow={0}\r\n", detectedFlow.ToString("F2"))); + + float qfrom_detected = (float)(detectedFlow + testParams.RelativeQfrom); + float qto_detected = (float)(detectedFlow + testParams.RelativeQto); + + /// Update test results with the test flow determined from the detected switching flow + float Qave_lps = (qfrom_detected + qto_detected) / 7.2f; + float testTimeFromDetectedFlow = test.Volume / Qave_lps; /// Test volume wont be changed + + float relativeQave = (testParams.RelativeQfrom + testParams.RelativeQto) / 2.0f; + bool goBackToInitFlow = ((rvPulse > 0) && (relativeQave < 0)) || + ((rvPulse < 0) && (relativeQave > 0)); + + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + int flowSetTime0 = StateMachine.Time; + + if (goBackToInitFlow) + { + //-------------------------------- + State.Create(string.Format("{0}({1}) : Switching flow detected, going back", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperations(measureOperations) + .AddOperation(outPath.RegulValve.SetFlowOp(outPath.FlowMeter, test.Qfrom, test.Qto, outPath.PidCoef, RefFlow, 600)) /// timeout = 10 min. + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test,e)) goto stopTest; + if (e.Contains(Event.RegulValveTimeOut)) + { + Bridge.OnError(this, Strings.Flow_adjustment_failed); + goto stopTest; + } + } + while (!e.Contains(Event.FlowReached)); + } + + //-------------------------------- + State.Create(string.Format("{0}({1}) : Going to the test flow", test.Method, test.Name)) + //State.Create("set_RV_position", + .AddOperation(checkUiOp) + .AddOperations(measureOperations) + .AddOperation(outPath.RegulValve.SetFlowOp(outPath.FlowMeter, qfrom_detected, qto_detected, outPath.PidCoef, RefFlow, 600)) /// timeout = 10 sec. + //.AddOp(pOut.RegulValve.SetPositionOp(35.0f, 38.0f, uint.MaxValue)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test,e)) goto stopTest; + //if (e.Contains(Event.FlowTimeOut)) goto do_detection; + } + while (!e.Contains(Event.FlowReached)); + + int flowSetTime = StateMachine.Time - flowDetectTime0; + + //start_measurement: + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Measuring_the_weight); + //------------------------------------------------ + State.Create(Strings.Measure_the_mass) + .AddOperation(checkUiOp) + .AddOperations(measureOperations) + .AddOperation(outPath.Scale.ReadStableMassOp(ref StartMass, test.MassRepeats, test.MassSpread, test.MassMethod)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) goto error; + if (TestAndLogUiCmdStop(test,e)) goto stopTest; + } + while (!e.Contains(Event.BalanceDone)); + + Mass.Val = StartMass.Val; + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Test_in_progress); + //------------------------------------------------ + State.Create(Strings.Start_the_test) + .AddOperation(checkUiOp) + .AddOperations(measureOperations) + .AddOperation(cBrd.StartMeasurementOp(outPath, Elde.TestMethods.Diverter | Elde.TestMethods.Synchro, + qfrom_detected, qto_detected, totalPulses, (float)test.TolerRed)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) goto error; + if (TestAndLogUiCmdStop(test,e)) goto stopTest; + } + while (!e.Contains(Event.MeasurementStarted)); + + /// + /// Measurement loop - preparation + /// + queryEnd1 = cBrd.QueryMeasurementEndOp(); + queryEnd2 = cBrd.QueryMeasurementEndOp(); + + StartNewStatistics(StateMachine.Time, BatchRslts.Batch.BatchNr, test.Name, repetitionNr); + int estimtdEndTime = StateMachine.Time + (int)test.TstTime; + + /// Read the diverter switch time + switchTimeStart = 0.001f * (float)cBrd.DivTime(0); + log.WarnFormat("Diverter switch time on test start = {0} ms", cBrd.DivTime(0)); + + /// Measurement loop - begin + while (true) + { + //-------------------------------- + switch (ReadRegistersTempPressAmbient(measureOperations, true)) + { + case Event.Error: goto error; + case Event.UiCmdStop: goto stopTest; + case Event.MeasurementCompleted: goto measurement_completed; + } + + int remainingTime = Math.Max(estimtdEndTime - StateMachine.Time, 0); + if (remainingTime > 60) + { + Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", Strings.Test_in_progress, remainingTime / 60, "min", remainingTime % 60, Strings.sec)); + } + else + { + Bridge.OnActivity(this, string.Format("{0} ... {1} s", Strings.Test_in_progress, remainingTime)); + } + + UpdateAllStatistics(StateMachine.Time); + + /// TODO: Reimplement + //for (int i = 0; i < Config.Data.CompoundWMsCount; i++) + //{ + // data.TestResult.CombinedMeters[i].VolumeMeter = data.TestResult.Meters[2 * i].VolumeMeter + // + data.TestResult.Meters[2 * i + 1].VolumeMeter; + // if (data.Volume.Valid) + // { + // data.TestResult.CombinedMeters[i].VolumeErrorPct = + // Formulas.ErrorFromVolumes(data.TestResult.CombinedMeters[i].VolumeMeter, data.Volume.Val); + // } + //} + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + } + /// Measurement loop - end + + + measurement_completed: + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Measuring_the_weight); + //------------------------------------------------ + State.Create(Strings.Measure_the_mass) + .AddOperation(checkUiOp) + .AddOperation(outPath.Scale.ReadStableMassOp(ref EndMass, test.MassRepeats, test.MassSpread, test.MassMethod)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) goto error; + if (TestAndLogUiCmdStop(test,e)) goto stopTest; + } + while (!e.Contains(Event.BalanceDone)); + /// + TestEndTime = DateTime.Now; + + /// Read the diverter switch time + switchTimeEnd = 0.001f * (float)cBrd.DivTime(0); + log.WarnFormat("Diverter switch time on test end = {0} ms", cBrd.DivTime(0)); + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Test_completed); + //------------------------------------------------ + State.Create(Strings.Stop_the_pump) + .AddOperation(checkUiOp) + .AddOperation((inPath != null && inPath.Pump is GenericDevices.IPumpFM) ? (inPath.Pump as GenericDevices.IPumpFM).TurnOffOp() : null) + .AddOperation(cBrd.SetValvesOp(null, inPath.Pump)) + .AddOperation(cBrd.UpdateTankWeightOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test,e)) goto stopTest; + } + while (!e.Contains(Event.ValvesSet)); + + + //-------------------------------- + State.Create("stop_diverter_gate_etc") + .AddOperation(checkUiOp) + .AddOperation(cBrd.StopPreviousOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test,e)) goto stopTest; + } + while (!e.Contains(Event.PreviousStopped)); + + /// Make sure the CycleBeginForm is closed so that water meter data (s/n) can be copied into results + if (UIFlowControl.Stop == WaitBeginFormClosed()) goto stopTest; + + /// + /// Populate TestResult data entity with data + /// + Results.Entities.TestRslt tstRslt = BatchRslts.GetTestRslt(testName, test.Part); + + if (tstRslt != null) + { + UpdateTempPressDensAmb(tstRslt); + + /// Main results + tstRslt.MethodClass = TbfComponents.FindComponent(test.Method).ClassName; + tstRslt.StartTime = TestStartTime; + tstRslt.EndTime = TestEndTime; + tstRslt.FlowSetTime = flowSetTime; + tstRslt.TestTime = cBrd.TTime; /// [s] measurement time + tstRslt.PulsesMaster = Convert.ToDouble(cBrd.EtPulses(0)); /// Pulses of the master flow meter (test total) + tstRslt.MassStartRaw = StartMass.Val; + tstRslt.MassStart = Config.Formulas.CorrectedValue(tstRslt.MassStartRaw, outPath.Scale.Corrections); + tstRslt.MassEndRaw = EndMass.Val; + tstRslt.MassEnd = Config.Formulas.CorrectedValue(tstRslt.MassEndRaw, outPath.Scale.Corrections); + tstRslt.FlowMass = 3600.0 * (tstRslt.MassEnd - tstRslt.MassStart) / tstRslt.TestTime; /// [kg/h] + tstRslt.FlowVolume = 3.6 * LtrPerRefPulse * cBrd.EtPulses(0) / tstRslt.TestTime; /// [m3/h] + tstRslt.Buoyancy = Config.Formulas.Buoyancy(); + double density = Config.Formulas.WaterDensityFromTemp((tstRslt.TempUpMean + tstRslt.TempDownMean) / 2.0, Program.LocalSettings.RealDensity, Program.LocalSettings.AtTemperature); + tstRslt.VolumeCTV = 1000.0 * tstRslt.Buoyancy * (tstRslt.MassEnd - tstRslt.MassStart) / density; /// [l] 1000.0f is because density is in [kg/m3] + tstRslt.VolumeMaster = LtrPerRefPulse * tstRslt.PulsesMaster; /// [l] volume from the master flow meter + tstRslt.ConstMasterRaw = outPath.FlowMeter.LtrPerPulse; /// Uncorrected master flowmeter coefficient + tstRslt.ConstMasterCorr = outPath.FlowMeter.LtrPerPulseCorrected(tstRslt.FlowVolume, rangeIx); /// Corrected master pulses per liter + tstRslt.ConstMaster = (tstRslt.VolumeMaster == 0) ? tstRslt.ConstMasterCorr : (LtrPerRefPulse * tstRslt.VolumeCTV / tstRslt.VolumeMaster); + /// Calculated master pulses per liter + tstRslt.ErrorMaster = Config.Formulas.ErrorFromVolumes(tstRslt.VolumeMaster, tstRslt.VolumeCTV); + + tstRslt.FlowMean = (float)RefFlowStat.Average; + tstRslt.FlowStart = (float)RefFlowStat.First; + tstRslt.FlowEnd = (float)RefFlowStat.Last; + tstRslt.FlowMin = (float)RefFlowStat.Min; + tstRslt.FlowMax = (float)RefFlowStat.Max; + + tstRslt.DiverterStart = switchTimeStart; + tstRslt.DiverterEnd = switchTimeEnd; + tstRslt.ErrorFlagsMd = (ErrorFlagsComp != null) ? (sbyte)ErrorFlagsComp.Mode : (sbyte)0; + tstRslt.ErrorFlags = (ErrorFlagsComp != null) ? ErrorFlagsComp.GetErrorFlags(tstRslt, true, false, switchTimeStart, switchTimeEnd) : 0; + + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (test.Part != 0 && test.Part != Utils.PartNr(i + 1, BatchRslts.Batch.Compound)) continue; + + Results.Entities.MeterTestRslt mainMeterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.CompoundMain); + Results.Entities.MeterTestRslt auxMeterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.CompoundAux); + + for (int isAux = 0; isAux <= 1; isAux++) /// 0=main, 1=aux + { + GenericDevices.IRegisterReader regReader = sensPath.RegisterReaders[2 * i + isAux]; + Results.Entities.MeterTestRslt meterRslt = (isAux == 0) ? mainMeterRslt : auxMeterRslt; + + if (meterRslt != null && regReader != null) + { + meterRslt.RegReaderType = (int)regReader.RegisterReaderType; + meterRslt.PulsesPerLiter = regReader.PulsesPerLtr; + + /// Optionally supress pulses from the large water meter + meterRslt.PulsesMeter = (isAux == 0 && testParams.SupressTrills) ? 0 : Convert.ToDouble(regReader.WMPulses); + meterRslt.PulsesMaster = Convert.ToDouble(regReader.WMRefPulses); + meterRslt.TestTime = cBrd.TTime; + meterRslt.VolumeStart = 0; + meterRslt.VolumeEnd = 0; + meterRslt.VolumeRef = tstRslt.VolumeCTV; + + meterRslt.VolumeMeter = meterRslt.PulsesMeter * regReader.LtrsPerPulse; /// liter + /// + if (meterRslt.PulsesMaster != 0) + { + meterRslt.VolumeMeter *= (tstRslt.PulsesMaster / meterRslt.PulsesMaster); + } + + meterRslt.Error = Config.Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, tstRslt.VolumeCTV); /// Main/Aux meter error is not usedfor evaluation + } + } + + Results.Entities.MeterTestRslt compoundMeterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.Compound); + + if (compoundMeterRslt != null && mainMeterRslt != null && auxMeterRslt != null) + { + compoundMeterRslt.VolumeRef = tstRslt.VolumeCTV; + compoundMeterRslt.VolumeMeter = mainMeterRslt.VolumeMeter + auxMeterRslt.VolumeMeter; + compoundMeterRslt.PulsesMaster = tstRslt.PulsesMaster; + compoundMeterRslt.TestTime = tstRslt.TestTime; + compoundMeterRslt.Error = Config.Formulas.ErrorFromVolumes(compoundMeterRslt.VolumeMeter, compoundMeterRslt.VolumeRef); + compoundMeterRslt.Passed = (compoundMeterRslt.Error >= test.GetErrLimLo(tstRslt.FlowMean) + test.Uncertainty) + && (compoundMeterRslt.Error <= test.GetErrLimHi(tstRslt.FlowMean) - test.Uncertainty) + && (tstRslt.ErrorFlags == 0 || tstRslt.ErrorFlagsMode() != Config.Entities.ErrorFlagsMode.On); + mainMeterRslt.Passed = auxMeterRslt.Passed = compoundMeterRslt.Passed; + mainMeterRslt.TestDone = auxMeterRslt.TestDone = compoundMeterRslt.TestDone = true; + tstRslt.TestDone = true; + + if (Qrise != 0) BatchRslts.WaterMeters[i].QRise = Qrise; + if (Qfall != 0) BatchRslts.WaterMeters[i].QFall = Qfall; + } + } + + tstRslt.Components = Results.Entities.Components + .UpdateList(BatchRslts.ComponentsList, + new Results.Entities.Components((BenchInfo != null) ? BenchInfo.TestBenchId : 1, + (BenchInfo != null) ? BenchInfo.TestBenchName : "testbench", + inPath.Pump != null ? inPath.Pump.Name : string.Empty, + outPath.FlowMeter != null ? outPath.FlowMeter.Name : string.Empty, + outPath.Scale != null ? outPath.Scale.Name : string.Empty, + outPath.RegulValve != null ? outPath.RegulValve.Name : string.Empty, + outPath.Diverter != null ? outPath.Diverter.Name : string.Empty)); + + /// Update water meter error flags + if (ErrorFlagsComp != null) + { + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (BatchRslts.WaterMeters[i] != null) + { + BatchRslts.WaterMeters[i].ErrorFlags = ErrorFlagsComp.GetWMtrErrorFlags(BatchRslts.WaterMeters[i].MeterTestRslts); + } + } + } + + /// Update results + Bridge.OnTestCompleted(this, new TestCompletedEventArgs(testName, tstRslt)); + } + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.TransitionAfter)); + + /// Append the results to the CSV-file + allResults.Info(TestResult2CsvLine(testName, test.Part)); + + ///----------------------/// + /// Quit this sequence /// + ///----------------------/// + + if (isLastRepetition) + { + /// Stop the pump + State.Create(string.Format("{0}({1}) : Test(s) completed -> Stopping the pump", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(cBrd.SetValvesOp(null, inPath.Pump)) + .AddOperation((inPath != null && inPath.Pump is GenericDevices.IPumpFM) ? (inPath.Pump as GenericDevices.IPumpFM).TurnOffOp() : null) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) goto error; + } + while (!e.Contains(Event.ValvesSet) || ((inPath.Pump is GenericDevices.IPumpFM) && !e.Contains(Event.TurnPumpOnOffDone))); + } + + /// Create the return value - a list with one event Event.Done - and return + IList retval1 = new List(1); + retval1.Add(Event.Done); + return retval1; + + //==================================== + stopTest: + + State.Create(string.Format("{0}({1}) : User selected STOP -> Closing the valves", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation((inPath != null && inPath.Pump is GenericDevices.IPumpFM) ? (inPath.Pump as GenericDevices.IPumpFM).TurnOffOp() : null) + .AddOperation(cBrd.SetValvesOp(StateMachine.DefaultValvesOpen, StateMachine.DefaultValvesClose)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) goto error; + } + while (!e.Contains(Event.ValvesSet)); + + IList retval2 = new List(1); + retval2.Add(Event.UiCmdStop); + return retval2; + + //==================================== + error: + State.Create("close_before_error") + .AddOperation(checkUiOp) + .AddOperation((inPath != null && inPath.Pump is GenericDevices.IPumpFM) ? (inPath.Pump as GenericDevices.IPumpFM).TurnOffOp() : null) + .AddOperation(cBrd.SetValvesOp(StateMachine.DefaultValvesOpen, StateMachine.DefaultValvesClose)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) break; + } + while (!e.Contains(Event.ValvesSet)); + + IList retval3 = new List(1); + retval3.Add(Event.Error); + return retval3; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/CombinedWithDetection/TestMethod.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/CombinedWithDetection/TestMethod.cs new file mode 100644 index 00000000..dbe09be6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/CombinedWithDetection/TestMethod.cs @@ -0,0 +1,38 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; +using TBF.BenchControl; + +namespace TBF.BenchControl.TestMethods.CombinedWithDetection +{ + public class TestMethod : ComponentBase, GenericDevices.ITestMethod + { + private static readonly ILog log = LogManager.GetLogger(typeof(TestMethod)); + public override string ToString() { return string.Format("TestMethods.CombinedWithDetection({0})", Cfg.ToString(1)); } + + readonly TestMethodCfg testMethodCfg; + + public bool CanTest(MetersKind meters) { return meters == MetersKind.Combined; } + public bool DoTransitions() { return true; } + + public TestMethod() + { + } + + public TestMethod(Generic.IComponentCfg cfg) + : base(cfg) + { + testMethodCfg = cfg as TestMethodCfg; + log.Debug(this.ToString()); + } + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + return (new CombinedWithDetectionSeq()).Execute(test, repetNr, isLastRepetition, testMethodCfg.TestParams, DebugLevel); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/CombinedWithDetection/TestMethodCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/CombinedWithDetection/TestMethodCfg.cs new file mode 100644 index 00000000..c0e66685 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/CombinedWithDetection/TestMethodCfg.cs @@ -0,0 +1,49 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.CombinedWithDetection +{ + public class TestMethodCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestMethodCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new TestMethodCfgCtrl(); } + + /// Test parameters + [XmlIgnore] + public CombinedWithDetTestParams TestParams; + public override IParamsProvider GetRuntimeTestParamsProvider() { return TestParams; } + public override IParamsProvider CreateTestParamsProvider() { return new CombinedWithDetTestParams(true); } + public override IParamsProvider GetUITestParamsProvider(Test test) + { + return (test.Method == Name) ? base.GetUITestParamsProvider(test) : null; + } + + /// Private parameterless constructor invoked by all other (public) constructors + TestMethodCfg() + { + TestParams = new CombinedWithDetTestParams(true); + } + + public TestMethodCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + ParentName = string.Empty; + Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}", Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/CombinedWithDetection/TestMethodCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/CombinedWithDetection/TestMethodCfgCtrl.cs new file mode 100644 index 00000000..b07f208d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/CombinedWithDetection/TestMethodCfgCtrl.cs @@ -0,0 +1,69 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.CombinedWithDetection +{ + public partial class TestMethodCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + TestMethodCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as TestMethodCfg; + Redraw(); + } + } + + public TestMethodCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/CombinedWithDetection/TestMethodCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/CombinedWithDetection/TestMethodCfgCtrl.designer.cs new file mode 100644 index 00000000..e3c3d7f2 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/CombinedWithDetection/TestMethodCfgCtrl.designer.cs @@ -0,0 +1,86 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.TestMethods.CombinedWithDetection +{ + partial class TestMethodCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(137, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 5; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(27, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 4; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(134, 33); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 3; + this.classNameLabel.Text = "ComonentName"; + // + // BasicPrinterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "BasicPrinterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/CombinedWithDetection/TestMethodCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/CombinedWithDetection/TestMethodCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/CombinedWithDetection/TestMethodCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/CombinedWithDetection/TestMethodFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/CombinedWithDetection/TestMethodFactory.cs new file mode 100644 index 00000000..77b38b45 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/CombinedWithDetection/TestMethodFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.CombinedWithDetection +{ + public class TestMethodFactory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".Compound"; } } + + public void ResetStaticProperties() { TestMethod.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new TestMethod(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new TestMethod(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this.GetType().Namespace.Substring(29), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/Component.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/Component.cs new file mode 100644 index 00000000..44df7427 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/Component.cs @@ -0,0 +1,40 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; + +namespace TBF.BenchControl.TestMethods.Endurance +{ + public class Component : ComponentBase, GenericDevices.ITestMethod + { + private static readonly ILog log = LogManager.GetLogger(typeof(Component)); + public override string ToString() + { + return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); + } + + readonly TestMethodCfg testMethodCfg; + + public bool CanTest(MetersKind meters) { return true; } + public bool DoTransitions() { return true; } + + public Component() + { + } + + public Component(Generic.IComponentCfg cfg) + : base(cfg) + { + testMethodCfg = cfg as TestMethodCfg; + log.Debug(this.ToString()); + } + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + return (new EnduranceSeq()).Execute(test, repetNr, isLastRepetition, testMethodCfg.Cycle, DebugLevel); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/CycleDlg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/CycleDlg.cs new file mode 100644 index 00000000..44df9cdd --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/CycleDlg.cs @@ -0,0 +1,263 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using log4net; +using TBF.BenchControl.GenericDevices; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.Endurance +{ + public partial class CycleDlg : Form, TBF.UiControls.IParentOfListViewEx + { + static readonly ILog log = LogManager.GetLogger(typeof(CycleDlg)); + + /// Used when re-scaling the dialog: 100% = 96dpi, 125% = 120dpi, 150% = 144dpi + public readonly int Dpi; + public const int Dpi100pct = 96; + + /// + /// Transition sequences to be updated by this dialog. + /// Set by the constructor or updated by the parent after creation and before loading. + /// + public IList EnduranceCycle; + + + /// Auxiliary public lists used also by user controls in tab pages + public IList TbfComponents; + public IList Valves; + + + TBF.UiControls.ITabWithListViewEx seqStepsCtrl; + + + public CycleDlg() + : this(new List()) + { + } + + public CycleDlg(IList cycle) + { + /// Detect display setting: 100% = 96dpi, 125% = 120dpi, 150% = 144dpi. + Dpi = (int)this.CreateGraphics().DpiX; + + InitializeComponent(); + + /// SharedDlgButtons configuration + sharedButtons.RequiredGroupMembership = Users.Grp.GID.Metrologists; + sharedButtons.OptionalButtons = TBF.UiControls.SharedButtons.Buttons.Add | + TBF.UiControls.SharedButtons.Buttons.Remove | + TBF.UiControls.SharedButtons.Buttons.Up | + TBF.UiControls.SharedButtons.Buttons.Down; + sharedButtons.Unlocked += Unlocked; + sharedButtons.OKClicked += okButton_Click; + sharedButtons.CancelClicked += cancelButton_Click; + sharedButtons.AddClicked += addButton_Click; + sharedButtons.RemoveClicked += removeButton_Click; + sharedButtons.UpClicked += upButton_Click; + sharedButtons.DownClicked += downButton_Click; + + seqStepsCtrl = new CycleStepsCtrl(); + + /// Prepare a list of valves for the endurance test + TbfComponents = BenchControl.TbfComponents.LoadComponentsFromDB(Config.FluentCommon.CreateSession(Users.Entities.DBKind.Config)); + Valves = new List(); + for (int bitNr = 0; bitNr < 8; bitNr++) + { + foreach (var vlv in TbfComponents) + { + if (vlv is BenchControl.Elde.Valve.Valve && (vlv as BenchControl.Elde.Valve.Valve).BitPosition == bitNr) + { + Valves.Add(vlv as IValve); + break; + } + } + } + + EnduranceCycle = (cycle != null) ? cycle : new List(); /// TODO: Load from component parameters + + /// Create a tab with sequence steps for each sequence ordered by ItemNr. + AddCycleStepsTab(EnduranceCycle); + } + + void AddCycleStepsTab(IList sequence) + { + TabPage nwTab = new TabPage(); + nwTab.Tag = sequence; + CycleStepsCtrl newCtrl = new CycleStepsCtrl(); + seqStepsCtrl = newCtrl; + nwTab.Controls.Add(newCtrl); + tabControl.TabPages.Add(nwTab); + newCtrl.Initialize(sequence, this, tabControl.TabPages[tabControl.TabPages.Count - 1]); + newCtrl.SelectedIndexChanged += new System.EventHandler(SelectedIndexChanged); + } + + private void CycleDlg_Load(object sender, EventArgs e) + { + Localize(); + + TBF.LocalSettings ls = Program.LocalSettings; + Width = (ls.EnduranceDlgWidth > 0) ? ls.EnduranceDlgWidth : 1050; + Height = (ls.EnduranceDlgHeight > 0) ? ls.EnduranceDlgHeight : 360; + Left = (ls.EnduranceDlgLeft != 0) ? ls.EnduranceDlgLeft : 150; + Top = (ls.EnduranceDlgTop != 0) ? ls.EnduranceDlgTop : 150; + + /// Now refresh the content of the dialog + RefreshAllTabs(); + } + + void Localize() + { + Text = Strings.Endurance_cycle_steps; + } + + void RefreshAllTabs() + { + if (seqStepsCtrl != null) (seqStepsCtrl as Results.Forms.ListViewEx).Refresh(); + } + + private void Unlocked(object sender, EventArgs e) + { + if (seqStepsCtrl != null) seqStepsCtrl.Unlock(); + } + + private void okButton_Click(object sender, EventArgs e) + { + if (seqStepsCtrl != null) seqStepsCtrl.OkBtnClicked(); + + //if (EnduranceCycle != null) + //{ + // using (var transaction = Session.BeginTransaction()) + // { + // try + // { + // Session.SaveOrUpdate(EnduranceCycle); + // transaction.Commit(); + // } + // catch (Exception e2) + // { + // MessageBox.Show(Strings.Cannot_save_changes, Strings.Error, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + // log.ErrorFormat("Update of sequence 'Tr1' in the database failed: {0}", e2.Message); + // } + // } + //} + + Program.LocalSettings.EnduranceDlgLeft = Location.X; + Program.LocalSettings.EnduranceDlgTop = Location.Y; + Program.LocalSettings.EnduranceDlgWidth = Size.Width; + Program.LocalSettings.EnduranceDlgHeight = Size.Height; + Program.LocalSettings.Save(); + + DialogResult = DialogResult.OK; + Close(); + return; + } + + private void cancelButton_Click(object sender, EventArgs e) + { + Program.LocalSettings.EnduranceDlgLeft = Location.X; + Program.LocalSettings.EnduranceDlgTop = Location.Y; + Program.LocalSettings.EnduranceDlgWidth = Size.Width; + Program.LocalSettings.EnduranceDlgHeight = Size.Height; + Program.LocalSettings.Save(); + + DialogResult = DialogResult.Cancel; + Close(); + return; + } + + int slctdTab; + + private void tabControl_SelectedIndexChanged(object sender, EventArgs e) + { + if (seqStepsCtrl != null) + { + seqStepsCtrl.OkBtnClicked(); + } + slctdTab = tabControl.SelectedIndex; + sharedButtons.SetEnabled(TBF.UiControls.SharedButtons.Buttons.Add, true); + sharedButtons.DisableButtons(TBF.UiControls.SharedButtons.Buttons.Remove); + RefreshAllTabs(); + } + + private void addButton_Click(object sender, EventArgs e) + { + if (seqStepsCtrl != null) seqStepsCtrl.AddOne(); + } + + private void removeButton_Click(object sender, EventArgs e) + { + if (seqStepsCtrl != null) seqStepsCtrl.RemoveSelected(); + } + + private void upButton_Click(object sender, EventArgs e) + { + if (seqStepsCtrl != null) seqStepsCtrl.MoveUpSelected(); + } + + private void downButton_Click(object sender, EventArgs e) + { + if (seqStepsCtrl != null) seqStepsCtrl.MoveDownSelected(); + } + + public void UpdateButtonStates(TBF.UiControls.SharedButtons.SelectedItemPos selectedItemPos) + { + if (selectedItemPos == TBF.UiControls.SharedButtons.SelectedItemPos.None) + { + sharedButtons.DisableButtons(TBF.UiControls.SharedButtons.Buttons.Up | + TBF.UiControls.SharedButtons.Buttons.Down); + } + else if (selectedItemPos == TBF.UiControls.SharedButtons.SelectedItemPos.First) + { + sharedButtons.EnableButtons(TBF.UiControls.SharedButtons.Buttons.Down); + sharedButtons.DisableButtons(TBF.UiControls.SharedButtons.Buttons.Up); + } + else if (selectedItemPos == TBF.UiControls.SharedButtons.SelectedItemPos.Last) + { + sharedButtons.EnableButtons(TBF.UiControls.SharedButtons.Buttons.Up); + sharedButtons.DisableButtons(TBF.UiControls.SharedButtons.Buttons.Down); + } + else if (selectedItemPos == TBF.UiControls.SharedButtons.SelectedItemPos.FirstAndLast) + { + sharedButtons.DisableButtons(TBF.UiControls.SharedButtons.Buttons.Up | + TBF.UiControls.SharedButtons.Buttons.Down); + } + else + { + sharedButtons.EnableButtons(TBF.UiControls.SharedButtons.Buttons.Up | + TBF.UiControls.SharedButtons.Buttons.Down); + } + } + + /// + /// Common part for three xxxListViewEx_SelectedIndexChanged event handlers + /// + /// + void SelectedIndexChanged(object sender, EventArgs e) + { + Results.Forms.ListViewEx listViewEx = sender as Results.Forms.ListViewEx; + if (listViewEx.SelectedItems.Count != 1) + { + UpdateButtonStates(TBF.UiControls.SharedButtons.SelectedItemPos.None); + } + else if (listViewEx.Items.Count == 1) + { + UpdateButtonStates(TBF.UiControls.SharedButtons.SelectedItemPos.FirstAndLast); + } + else if (listViewEx.SelectedIndices[0] == 0) + { + UpdateButtonStates(TBF.UiControls.SharedButtons.SelectedItemPos.First); + } + else if (listViewEx.SelectedIndices[0] == (listViewEx.Items.Count - 1)) + { + UpdateButtonStates(TBF.UiControls.SharedButtons.SelectedItemPos.Last); + } + else + { + UpdateButtonStates(TBF.UiControls.SharedButtons.SelectedItemPos.Middle); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/CycleDlg.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/CycleDlg.designer.cs new file mode 100644 index 00000000..4f0d0ac5 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/CycleDlg.designer.cs @@ -0,0 +1,91 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +namespace TBF.BenchControl.TestMethods.Endurance +{ + partial class CycleDlg + { + /// + /// 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(CycleDlg)); + this.mainSplitContainer = new System.Windows.Forms.SplitContainer(); + this.tabControl = new System.Windows.Forms.TabControl(); + this.sharedButtons = new TBF.UiControls.SharedButtons(); + ((System.ComponentModel.ISupportInitialize)(this.mainSplitContainer)).BeginInit(); + this.mainSplitContainer.Panel1.SuspendLayout(); + this.mainSplitContainer.Panel2.SuspendLayout(); + this.mainSplitContainer.SuspendLayout(); + this.SuspendLayout(); + // + // mainSplitContainer + // + resources.ApplyResources(this.mainSplitContainer, "mainSplitContainer"); + this.mainSplitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.mainSplitContainer.Name = "mainSplitContainer"; + // + // mainSplitContainer.Panel1 + // + this.mainSplitContainer.Panel1.Controls.Add(this.tabControl); + // + // mainSplitContainer.Panel2 + // + this.mainSplitContainer.Panel2.Controls.Add(this.sharedButtons); + // + // tabControl + // + resources.ApplyResources(this.tabControl, "tabControl"); + this.tabControl.Name = "tabControl"; + this.tabControl.SelectedIndex = 0; + this.tabControl.SelectedIndexChanged += new System.EventHandler(this.tabControl_SelectedIndexChanged); + // + // sharedButtons + // + resources.ApplyResources(this.sharedButtons, "sharedButtons"); + this.sharedButtons.Name = "sharedButtons"; + // + // CycleDlg + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.mainSplitContainer); + this.Name = "CycleDlg"; + this.Load += new System.EventHandler(this.CycleDlg_Load); + this.mainSplitContainer.Panel1.ResumeLayout(false); + this.mainSplitContainer.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.mainSplitContainer)).EndInit(); + this.mainSplitContainer.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer mainSplitContainer; + private System.Windows.Forms.TabControl tabControl; + private UiControls.SharedButtons sharedButtons; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/CycleDlg.pl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/CycleDlg.pl.resx new file mode 100644 index 00000000..98367e03 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/CycleDlg.pl.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Etapy cyklu + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/CycleDlg.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/CycleDlg.resx new file mode 100644 index 00000000..cd69c302 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/CycleDlg.resx @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + Fill + + + + True + + + + 0, 0 + + + Fill + + + 1, 1 + + + 0, 0 + + + 760, 366 + + + 1 + + + tabControl + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + mainSplitContainer.Panel1 + + + 0 + + + mainSplitContainer.Panel1 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + mainSplitContainer + + + 0 + + + -1, 0 + + + 100, 636 + + + 0 + + + sharedButtons + + + TBF.UiControls.SharedButtons, TBF, Version=2.12.404.1, Culture=neutral, PublicKeyToken=null + + + mainSplitContainer.Panel2 + + + 0 + + + mainSplitContainer.Panel2 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + mainSplitContainer + + + 1 + + + 863, 366 + + + 760 + + + 1 + + + mainSplitContainer + + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + + + 6, 13 + + + 863, 366 + + + CenterParent + + + Cycle steps + + + CycleDlg + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/CycleDlg.ru.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/CycleDlg.ru.resx new file mode 100644 index 00000000..d6842a21 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/CycleDlg.ru.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Этапы цикла + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/CycleStep.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/CycleStep.cs new file mode 100644 index 00000000..eb5cfc3c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/CycleStep.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace TBF.BenchControl.TestMethods.Endurance +{ + public class CycleStep + { + public uint Duration { get; set; } /// Duration in seconds + //public virtual string Message { get; set; } /// Message + public uint ValvesOpen { get; set; } /// List of valves to be opened + public uint ValvesClose { get; set; } /// List of valves to be closed + + + public CycleStep() + { + Duration = 500; + //Message = string.Empty; + ValvesOpen = 0; + ValvesClose = 0; + } + + + public override string ToString() + { + return string.Format("{0}~{1}~{2}", Duration, ValvesOpen, ValvesClose); + } + + + /// + /// Create CycleStep from a string generated previously by ToString() function + /// + /// String generated by ToString() + public CycleStep(string savedStr) + + { + string[] strArr = savedStr.Split(new char[] { '~' }); + uint duration; + uint vOpen; + uint vClose; + if (strArr.Length != 3 || !uint.TryParse(strArr[0], out duration) + || !uint.TryParse(strArr[1], out vOpen) + || !uint.TryParse(strArr[2], out vClose)) + { + Duration = 500; + //Message = string.Empty; + ValvesOpen = 0; + ValvesClose = 0; + } + else + { + Duration = duration; + //Message = strArr[1]; + ValvesOpen = vOpen; + ValvesClose = vClose; + } + } + + + public static string CycleToString(IList cycle) + { + if (cycle == null) return string.Empty; + + StringBuilder sb = new StringBuilder(); + foreach (var step in cycle) + { + if (sb.Length > 0) sb.Append('§'); + sb.Append(step.ToString()); + } + return sb.ToString(); + } + + + public static IList StringToCycle(string savedCycle) + { + IList cycle = new List(); + + if (!string.IsNullOrEmpty(savedCycle)) + { + string[] lines = savedCycle.Split(new char[] { '§' }); + foreach (var line in lines) + { + cycle.Add(new CycleStep(line)); + } + } + + return cycle; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/CycleStepsCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/CycleStepsCtrl.cs new file mode 100644 index 00000000..68f5bfc1 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/CycleStepsCtrl.cs @@ -0,0 +1,272 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using System.Drawing; +using System.Windows.Forms; +using log4net; +using TBF.BenchControl.GenericDevices; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.Endurance +{ + public partial class CycleStepsCtrl : TBF.UiControls.BaseWithListViewEx, TBF.UiControls.ITabWithListViewEx + { + static readonly ILog log = LogManager.GetLogger(typeof(CycleStepsCtrl)); + + /// + /// Fixed ListViewEx columns + /// + enum Column + { + Duration, + //Message, + FixedColumnsCount, + } + readonly int fixedCount = (int)Column.FixedColumnsCount; + + IList sequence; + + CycleDlg parent; + Control parentControl; + Control[] editors; + + int vCount; /// Number of valves + + public CycleStepsCtrl() + : base() + { + } + + public void Initialize(IList sequence, CycleDlg parent, Control parentControl) + { + this.sequence = sequence; + this.parent = parent; + this.parentControl = parentControl; + Name = "Dummy"; + MyItems = sequence; + + SubItemClicked += new Results.Forms.SubItemEventHandler(listViewEx_SubItemClicked); + SubItemRightClicked += new Results.Forms.SubItemEventHandler(listViewEx_SubItemRightClicked); + SubItemEndEditing += new Results.Forms.SubItemEndEditingEventHandler(listViewEx_SubItemEndEditing); + + + /// + /// ListViewEx columns + /// + Columns.Add(Strings.Duration_ms, 100 * parent.Dpi / PathsDlg.Dpi100pct); + //Columns.Add(Strings.Message, 100 * parent.Dpi / PathsDlg.Dpi100pct); + /// + vCount = 0; + foreach (var vlv in parent.Valves) + { + Columns.Add(vlv.Cfg.Name, 50 * parent.Dpi / PathsDlg.Dpi100pct); + vCount++; + } + + /// + /// Prepare valve combo-boxes + /// + TextBox tb; + ComboBox cb; + editors = new Control[fixedCount + vCount]; + + /// Duration + editors[(int)Column.Duration] = tb = new TextBox(); + tb.Visible = false; + parent.Controls.Add(tb); + + /// Message + //editors[(int)Column.Message] = tb = new TextBox(); + //tb.Visible = false; + //parent.Controls.Add(tb); + + /// Valves + for (int i = fixedCount; i < fixedCount + vCount; i++) + { + editors[i] = cb = new ComboBox(); + cb.Visible = false; + cb.Items.Add("---"); + cb.Items.Add(Strings.open); + cb.Items.Add(Strings.close); + parent.Controls.Add(cb); + } + + base.RedrawAll(); + } + + + void listViewEx_SubItemClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (!Unlocked || e.SubItem >= editors.Length) return; + StartEditing(editors[e.SubItem], e.Item, e.SubItem); + } + + + void listViewEx_SubItemRightClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (!Unlocked || e.SubItem >= editors.Length) return; + + if (DialogResult.Yes == MessageBox.Show(Strings.Do_you_want_to_copy_this_value_to_all_cells_below_this_cell, + Strings.Confirmation, MessageBoxButtons.YesNo, MessageBoxIcon.Question)) + { + int columnNr = e.SubItem; + string value = null; + System.Drawing.Color backColor = System.Drawing.Color.White; + foreach (ListViewItem item in Items) + { + if (value != null) + { + item.SubItems[columnNr].Text = value; + item.SubItems[columnNr].BackColor = backColor; + } + else if (item == e.Item) + { + value = item.SubItems[columnNr].Text; + backColor = item.SubItems[columnNr].BackColor; + } + } + } + } + + + void listViewEx_SubItemEndEditing(object sender, Results.Forms.SubItemEndEditingEventArgs e) + { + if (e.SubItem == (int)Column.Duration) + { + uint duration; + if (!uint.TryParse(e.DisplayText, out duration) || (duration % 10) != 0 || duration == 0) + { + e.DisplayText = e.Item.Text; + e.Cancel = true; + } + } + //else if (e.SubItem == (int)Column.Message) + //{ + // if (e.DisplayText.Length >= 255) + // { + // // Message too long + // e.DisplayText = e.Item.SubItems[e.SubItem].Text; + // e.Cancel = true; + // } + //} + else if ((e.SubItem >= fixedCount) && (e.SubItem < fixedCount + vCount)) + { + if ((e.DisplayText != Strings.open) && (e.DisplayText != Strings.close) && (e.DisplayText != "---")) + { + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + } + else + { + e.Item.SubItems[e.SubItem].BackColor = e.DisplayText == Strings.open ? Color.LightGray : Color.White; + } + } + } + + + public override void DrawOne(object myItem) + { + CycleStep step = (CycleStep)myItem; + + ListViewItem lvi = new ListViewItem(step.Duration.ToString()); + lvi.UseItemStyleForSubItems = false; + + //lvi.SubItems.Add(string.IsNullOrEmpty(step.Message) ? string.Empty : step.Message); + + for (int i = 0; i < parent.Valves.Count; i++) + { + if ((step.ValvesOpen & (1 << i)) != 0) + { + lvi.SubItems.Add(Strings.open); + lvi.SubItems[lvi.SubItems.Count - 1].BackColor = Color.LightGray; + } + else if ((step.ValvesClose & (1 << i)) != 0) + { + lvi.SubItems.Add(Strings.close); + lvi.SubItems[lvi.SubItems.Count - 1].BackColor = Color.White; + } + else + { + lvi.SubItems.Add("---"); + lvi.SubItems[lvi.SubItems.Count - 1].BackColor = Color.White; + } + } + + lvi.Tag = step; + + Items.Add(lvi); + } + + + public override void UpdateOne(ListViewItem lvi, object myItem) + { + CycleStep step = (CycleStep)myItem; + + /// + /// Duration + /// + uint duration; + if (uint.TryParse(lvi.Text, out duration) && (duration % 10) == 0 && duration != 0) + step.Duration = duration; + else + lvi.Text = step.Duration.ToString(); + + /// + /// Message + /// + //if (lvi.SubItems[(int)Column.Message].Text.Length == 0) + // step.Message = string.Empty; + //else + // step.Message = lvi.SubItems[(int)Column.Message].Text; + + /// + /// Valves + /// + int k = 0; + uint valvesOpen = 0; + uint valvesClose = 0; + /// + for (int i = 0; i < parent.Valves.Count; i++) + { + IValve valve = parent.Valves[i]; + string lviSubitText = lvi.SubItems[fixedCount + k++].Text; + if (lviSubitText.Equals(Strings.open)) + { + valvesOpen += ((uint)1 << i); + } + if (lviSubitText.Equals(Strings.close)) + { + valvesClose += ((uint)1 << i); + } + } + step.ValvesOpen = valvesOpen; + step.ValvesClose = valvesClose; + } + + + public void AddOne() + { + base.AddOne(new CycleStep()); + } + + + public new void RemoveSelected() + { + bool lastItemRemoved = base.RemoveSelected(); + if (lastItemRemoved && parent != null) + { + parent.UpdateButtonStates(TBF.UiControls.SharedButtons.SelectedItemPos.None); + } + } + + public string GetWarningsBeforeSaving(ref Dictionary renmInfo) + { + return string.Empty; + } + + public void UpdateRelatedItems(Dictionary renameInfo) + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/EnduranceSeq.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/EnduranceSeq.cs new file mode 100644 index 00000000..5913e970 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/EnduranceSeq.cs @@ -0,0 +1,682 @@ +/// +/// Copyright (c) 2016-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Text; +using log4net; +using TBF.BenchControl; +using TBF.Boxes; +using TBF.Resources; +using TBF.UiBridge; + +namespace TBF.BenchControl.TestMethods.Endurance +{ + public class EnduranceSeq : Sequences.SequenceBase + { + private static readonly ILog log = LogManager.GetLogger(typeof(EnduranceSeq)); + + /// + /// Endurance test sequence + /// + /// Test entity + /// + /// Event.Done . . . . . . . OK + /// Event.UiCmdStop . . . . Stopped by the user using the on-screen button STOP + /// Event.OpArgumentError . Target flow is out of range + /// Event.Error . . . . . . Unspecified error + /// + public IList Execute(Config.Entities.Test test, int repetitionNr, bool isLastRepetition, + string enduranceCycleStr, + Config.Entities.DebugMode debugLevel) + { + IList e = new List(); /// Events from currently running operations + Event retVal = Event.Done; + checkUiOp = new Operations.CheckUIOp(true); /// Runs in more then one state + + Elde.ControlBoardDev cBrd = StateMachine.ControlBoard; + processDataLoggingOp = new TBF.BenchControl.Operations.ProcessDataLoggingOp(processDataLogger, this, false); + + + string enduranceLogDir = string.Format("C:\\TBF\\Results\\{0:yyyy}\\{0:MM}\\{0:dd}\\", BatchRslts.Batch.StartTime); + string enduranceLogName = string.Format("{0}{1:HHmm}.txt", enduranceLogDir, BatchRslts.Batch.StartTime); + System.IO.Directory.CreateDirectory(enduranceLogDir); + try + { + bool writeHeader = !System.IO.File.Exists(enduranceLogName); + System.IO.StreamWriter writer = new System.IO.StreamWriter(enduranceLogName, true); + enduranceDataLoggingOp = new TBF.BenchControl.Operations.EnduranceDataLoggingOp(writer, this); + if (writeHeader) + LogEnduranceHeader(writer); + } + catch + { + enduranceDataLoggingOp = null; + } + + + LtrPerRefPulse = outPath.FlowMeter.LtrPerPulse; /// [ltr/pulse], nominal flow in [m3/h] + + /// Notes: + /// float timeHr = volumeLtr / (1000.0f * targetFlow); + /// float timeSec = 3600.0f * timeHr; + /// int refPulses = (int)(timeSec * (2000.0f * targetFlow / pOut.FlowMeter.NominalFlow)); + int totalPulses = (int)(test.Volume / LtrPerRefPulse + 0.5f); + + int rangeIx = 0; /// Default range, used for non-Elde flowmeters + if (outPath.FlowMeter is Elde.FlowMeter.FlowMeter) + { + Elde.FlowMeter.FlowMeter eldeFM = outPath.FlowMeter as Elde.FlowMeter.FlowMeter; + rangeIx = -1; /// Indicates invalid range + for (int r = 0; r <= 5; r++) + { + if (eldeFM.RangeEnabled(r) && eldeFM.GetTempLo(r) <= test.TempLimLo + && eldeFM.GetTempHi(r) >= test.TempLimHi) + { + rangeIx = r; + } + } + + if (rangeIx == -1) + { + Bridge.OnError(this, Strings.Flow_meter_temperature_range_does_not_fit_this_test_conditions); + retVal = Event.UiCmdStop; + goto stopTestWOStoppingDivGateEtc; + } + } + + //==================================== + loop: + /// Start the test, initialize test results + Bridge.OnTestSelected(this, new TestSelectedEventArgs(test, repetitionNr, inPath, benchPath, outPath, sensPath, totalPulses)); + string testName = Results.Utils.GetTestName(test.Name, test.Repeats, repetitionNr); + TestStartTime = DateTime.Now; + + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Starting_the_pump); + //------------------------------------------------ + if (inPath.Pump is GenericDevices.IPumpFM) (inPath.Pump as GenericDevices.IPumpFM).TurnOn(test.PumpPower); + /// + State.Create(string.Format("{0}({1}) : Starting the pump", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) +// .AddOperation(new Operations.SetAllRegulValvesOp(inPath.RegulValves, inPath.RegulValvesPct, 60)) + .AddOperation(inPath.Pump != null ? cBrd.SetValvesOp(inPath.Pump, null) : null) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + + } + while (e.Contains(Event.ValvesBusy) /* || !e.Contains(Event.AllPositionsReached)*/); + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Setting_the_flow); + //------------------------------------------------ + int flowSetTime0 = StateMachine.Time; + State.Create(string.Format("{0}({1}) : Setting the flow", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(outPath.RegulValve.SetFlowOp(outPath.FlowMeter, test.Qfrom, test.Qto, outPath.PidCoef, RefFlow, 990)) /// timeout = 16.5 min. + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (e.Contains(Event.OpArgumentError)) { retVal = Event.OpArgumentError; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.RegulValveTimeOut)) + { + Bridge.OnError(this, Strings.Flow_adjustment_failed); + retVal = Event.UiCmdStop; + goto stopTest; + } + if (e.Contains(Event.Next)) goto flow_set; + } + while (!e.Contains(Event.FlowReached)); + + flow_set: + + int flowSetTime = StateMachine.Time - flowSetTime0; + double currentFlow = RefFlow.Val; + + + if (test.DoControlWaterTemp && benchPath.TempMtrUp != null && benchPath.TempMtrDown != null) + { + //--------------------------------------------------- + Bridge.OnActivity(this, Strings.Setting_temperature); + //--------------------------------------------------- + + State.Create(string.Format("{0}({1}) : Wait until the water temperature is within limits", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Next)) goto temperature_set; + + if (TempUp.Val >= test.TempLimLo && TempUp.Val <= test.TempLimHi && + TempDown.Val >= test.TempLimLo && TempDown.Val <= test.TempLimHi) + { + goto temperature_set; + } + } + while (true); + } + + temperature_set: + + if (test.Part <= 3) /// 0 = measurement + /// 1 = measurement through line 1 + /// 2 = measurement through line 2 + /// 3 = continuous test + { + ///----------------------------------------------------- + /// Flying start measurement through line 1 or line 2 + ///----------------------------------------------------- + + + /// + /// Prepare cameras, ROI-s and measurementOperations + /// + + /// Find ROI-s + IList rois = new List(); + foreach (var rr in sensPath.RegisterReaders) + { + GenericDevices.IRoi roi = rr as GenericDevices.IRoi; + if (roi != null && roi.Detected) + { + rois.Add(roi); + } + } + + /// Find cameras + IList cameras = new List(); + foreach (var roi in rois) + { + if (roi.Camera != null && !cameras.Contains(roi.Camera)) + { + roi.Camera.ClearRoiParams(); + cameras.Add(roi.Camera); + } + } + + /// Register ROI-parameters to cameras + foreach (var roi in rois) roi.RegisterRoiToCamera(); + + /// Prepare measurementOperations + IList measureOperations = new List(); + foreach (var camera in cameras) measureOperations.Add(camera.MeasurementOp()); + + + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Test_in_progress); + //------------------------------------------------ + State.Create(string.Format("{0}({1}) : Starting the test", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperations(measureOperations) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation((StateMachine.Ambient != null) + ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) : null) + .AddOperation(processDataLoggingOp) + .AddOperation(enduranceDataLoggingOp) + .AddOperation(cBrd.StartMeasurementOp(outPath, Elde.TestMethods.Synchro, + test.Qfrom, test.Qto, totalPulses, (float)test.TolerRed)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.MeasurementStarted)); + + + foreach (var rr in sensPath.RegisterReaders) + { + GenericDevices.IHasTestName readerWithTstName = rr as GenericDevices.IHasTestName; + if (readerWithTstName != null) + { + readerWithTstName.TestName = test.Name; + readerWithTstName.TestRepeats = test.Repeats; + readerWithTstName.RepetitionNr = repetitionNr; + } + } + + + /// Measurement loop - preparation + readRegistersOp = new Operations.ReadMoreRegistersOp(sensPath.RegisterReaders); + queryEnd1 = cBrd.QueryMeasurementEndOp(); + + int estimtdEndTime = StateMachine.Time + (int)test.TstTime; + StartNewStatistics(StateMachine.Time, BatchRslts.Batch.BatchNr, test.Name, repetitionNr); + + /// Measurement loop - begin + State.Create(string.Format("{0}({1}) : Reading watermeters", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperations(measureOperations) + .AddOperation(readRegistersOp) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation((StateMachine.Ambient != null) + ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) + : null) + .AddOperation(queryEnd1) + .AddOperation(processDataLoggingOp) + .AddOperation(enduranceDataLoggingOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.MeasurementCompleted)) goto test_completed; + + //------------------------------------------------ + int remainingTime = Math.Max(estimtdEndTime - StateMachine.Time, 0); + if (remainingTime > 60) + { + Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", Strings.Test_in_progress, remainingTime / 60, "min", remainingTime % 60, Strings.sec)); + } + else + { + Bridge.OnActivity(this, string.Format("{0} ... {1} s", Strings.Test_in_progress, remainingTime)); + } + //------------------------------------------------ + + RefFreq.Val = cBrd.ReferenceFreq; + RefFlow.Val = cBrd.ReferenceFlow; + + UpdateAllStatistics(StateMachine.Time); + + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + } + while (true); + /// Measurement loop - end + + test_completed: + + StopRecordingStatistics(); + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Test_completed); + //------------------------------------------------ + + TestEndTime = DateTime.Now; + + /// Make sure the CycleBeginForm is closed so that water meter data (s/n) can be copied into results + if (UIFlowControl.Stop == WaitBeginFormClosed()) goto stopTest; + + if (test.Part <= 2) /// 0 = measurement + /// 1 = measurement through line 1 + /// 2 = measurement through line 2 + { + /// + /// Populate TestResult data entity with data + /// + Results.Entities.TestRslt tstRslt = BatchRslts.GetTestRslt(testName, test.Part); + + if (tstRslt != null) + { + UpdateTempPressDensAmb(tstRslt); + + /// Main results + tstRslt.MethodClass = TbfComponents.FindComponent(test.Method).ClassName; + tstRslt.StartTime = TestStartTime; + tstRslt.EndTime = TestEndTime; + tstRslt.FlowSetTime = flowSetTime; + tstRslt.TestTime = cBrd.TTime; /// [s] measurement time + tstRslt.PulsesMaster = Convert.ToDouble(cBrd.EtPulses(0)); /// Pulses of the master flow meter (test total) + tstRslt.MassStartRaw = 0; + tstRslt.MassStart = 0; + tstRslt.MassEndRaw = 0; + tstRslt.MassEnd = 0; + tstRslt.FlowMass = 0; /// [kg/h] + tstRslt.FlowVolume = 3.6 * LtrPerRefPulse * tstRslt.PulsesMaster / tstRslt.TestTime; /// [m3/h] + tstRslt.Buoyancy = Config.Formulas.Buoyancy(); + tstRslt.VolumeMaster = LtrPerRefPulse * tstRslt.PulsesMaster; /// [l] volume from the master flow meter + tstRslt.ConstMasterRaw = outPath.FlowMeter.LtrPerPulse; /// Uncorrected master flowmeter coefficient + tstRslt.ConstMasterCorr = outPath.FlowMeter.LtrPerPulseCorrected(tstRslt.FlowVolume, rangeIx); /// Corrected master pulses per liter + tstRslt.ConstMaster = tstRslt.ConstMasterCorr; /// Corrected master pulses per liter + tstRslt.VolumeCTV = tstRslt.ConstMaster * tstRslt.PulsesMaster; /// [l] 1000.0f is because density is in [kg/m3] + tstRslt.ErrorMaster = 0.0; /// Cannot be determined without a mass measurement + + tstRslt.FlowMean = (float)RefFlowStat.Average; + tstRslt.FlowStart = (float)RefFlowStat.First; + tstRslt.FlowEnd = (float)RefFlowStat.Last; + tstRslt.FlowMin = (float)RefFlowStat.Min; + tstRslt.FlowMax = (float)RefFlowStat.Max; + + tstRslt.DiverterStart = 0; + tstRslt.DiverterEnd = 0; + tstRslt.ErrorFlagsMd = (ErrorFlagsComp != null) ? (sbyte)ErrorFlagsComp.Mode : (sbyte)0; + tstRslt.ErrorFlags = (ErrorFlagsComp != null) ? ErrorFlagsComp.GetErrorFlags(tstRslt, false, false, 0, 0) : 0; + + /// + /// Single meters + /// + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (test.Part != 0 && test.Part != Utils.PartNr(i + 1, BatchRslts.Batch.Compound)) continue; + + Results.Entities.MeterTestRslt meterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.Single); + GenericDevices.IRegisterReader regReader = sensPath.RegisterReaders[i]; + GenericDevices.IDatastreamReader dstrReader = regReader as GenericDevices.IDatastreamReader; + TestMethods.iPerlCommunication.iPerlHead.IperlHead iPerl = regReader as TestMethods.iPerlCommunication.iPerlHead.IperlHead; + + if (meterRslt != null && regReader != null) + { + meterRslt.RegReaderType = (int)regReader.RegisterReaderType; + meterRslt.PulsesPerLiter = regReader.PulsesPerLtr; + meterRslt.PulsesMeter = Convert.ToDouble(regReader.WMPulses); + meterRslt.PulsesMaster = Convert.ToDouble(regReader.WMRefPulses); + + if (dstrReader != null) + { + if (iPerl != null && iPerl.ResultCode != 0 && (meterRslt.WaterMeter.ResultCode & (int)Results.Entities.ResultCode.OptoErrorCodeMask) == 0) + { + meterRslt.WaterMeter.ResultCode |= iPerl.ResultCode; + } + + meterRslt.TimestampStart = dstrReader.TimestampSecStart; + meterRslt.TimestampEnd = dstrReader.NoSamples ? (dstrReader.TimestampSecStart + tstRslt.TestTime) : dstrReader.TimestampSecEnd; + meterRslt.TestTime = meterRslt.TimestampEnd - meterRslt.TimestampStart; + meterRslt.VolumeStart = dstrReader.VolumeLtrStart; /// liter + meterRslt.VolumeEnd = dstrReader.VolumeLtrEnd; /// liter + meterRslt.VolumeMeter = Math.Abs(dstrReader.VolumeLtrEnd - dstrReader.VolumeLtrStart); + meterRslt.VolumeRef = tstRslt.VolumeCTV * meterRslt.TestTime / tstRslt.TestTime; + } + else + { + meterRslt.TestTime = tstRslt.TestTime; /// TODO: Malo by sa citat z dosky + meterRslt.VolumeStart = 0; + meterRslt.VolumeEnd = 0; + meterRslt.VolumeMeter = meterRslt.PulsesMeter * regReader.LtrsPerPulse; /// liter + meterRslt.VolumeRef = meterRslt.PulsesMaster * tstRslt.ConstMaster; /// liter + } + + meterRslt.Error = Config.Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef); + meterRslt.Passed = (meterRslt.Error >= test.GetErrLimLo(tstRslt.FlowMean) + test.Uncertainty) + && (meterRslt.Error <= test.GetErrLimHi(tstRslt.FlowMean) - test.Uncertainty) + && (tstRslt.ErrorFlags == 0 || tstRslt.ErrorFlagsMode() != Config.Entities.ErrorFlagsMode.On); + meterRslt.TestDone = true; + tstRslt.TestDone = true; + + if (iPerl != null) + { + if (iPerl.ResultCode != 0 && (meterRslt.WaterMeter.ResultCode & (int)Results.Entities.ResultCode.OptoErrorCodeMask) == 0) + { + meterRslt.WaterMeter.ResultCode |= iPerl.ResultCode; + } + + iPerl.LastTestResult2 = iPerl.LastTestResult; /// Save shift previous test result + iPerl.LastTestResult = meterRslt; /// Save this test result + iPerl.NominalTestFlowLph = 500.0 * (test.Qfrom + test.Qto); /// Ave. + convert to liter/hour + } + } + } + } + + tstRslt.Components = Results.Entities.Components + .UpdateList(BatchRslts.ComponentsList, + new Results.Entities.Components((BenchInfo != null) ? BenchInfo.TestBenchId : 1, + (BenchInfo != null) ? BenchInfo.TestBenchName : "testbench", + inPath.Pump != null ? inPath.Pump.Name : string.Empty, + outPath.FlowMeter != null ? outPath.FlowMeter.Name : string.Empty, + outPath.Scale != null ? outPath.Scale.Name : string.Empty, + outPath.RegulValve != null ? outPath.RegulValve.Name : string.Empty, + outPath.Diverter != null ? outPath.Diverter.Name : string.Empty)); + + /// Update water meter error flags + if (ErrorFlagsComp != null) + { + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (BatchRslts.WaterMeters[i] != null) + { + BatchRslts.WaterMeters[i].ErrorFlags = ErrorFlagsComp.GetWMtrErrorFlags(BatchRslts.WaterMeters[i].MeterTestRslts); + } + } + } + + /// Update results + Bridge.OnTestCompleted(this, new TestCompletedEventArgs(testName, tstRslt)); + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.TransitionAfter)); + + /// Append the results to the CSV-file + allResults.Info(TestResult2CsvLine(testName, test.Part)); + } + } + else if (test.Part == 4) + { + /// + /// Endurance test : switching mode + /// + + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Endurance_cycle_execution); + //------------------------------------------------ + + State.Create(string.Format("{0}({1}) : Stopping diverter, gate, etc.", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(cBrd.StopPreviousOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { if (retVal == Event.Done) retVal = Event.UiCmdStop; break; } + } + while (!e.Contains(Event.PreviousStopped)); + + int estimtdEndTime = StateMachine.Time + (int)test.TstTime; + StartNewStatistics(StateMachine.Time, BatchRslts.Batch.BatchNr, test.Name, repetitionNr); + + + /// + /// Update CyclePar[] array + /// + IList enduranceCycle = CycleStep.StringToCycle(enduranceCycleStr); + int stepsCount = Math.Min(enduranceCycle.Count, 80); + /// + uint[] cyclePar = new uint[2 * stepsCount + 3]; + uint duration = 10; + uint state = 0; + for (int i = 0; i < stepsCount; i++) + { + state = state | enduranceCycle[i].ValvesOpen; + state = state & (~enduranceCycle[i].ValvesClose); + + cyclePar[2 * i + 1] = duration / 10; + cyclePar[2 * i + 2] = state; + + duration += enduranceCycle[i].Duration; + } + cyclePar[2 * stepsCount + 1] = 0; + cyclePar[2 * stepsCount + 2] = 0; + cyclePar[0] = duration / 10; + /// + cBrd.CyclePar = cyclePar; + /// + State.Create(string.Format("{0}({1}) : Uploading cycle parameters", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation((StateMachine.Ambient != null) ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) : null) + .AddOperation(processDataLoggingOp) + .AddOperation(enduranceDataLoggingOp) + .AddOperation(cBrd.ExecuteCommandOp(Elde.Command.EnduranceCycleParamsUpload, Elde.Command.None, 0)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + + RefFreq.Val = cBrd.ReferenceFreq; + RefFlow.Val = cBrd.ReferenceFlow; + + UpdateAllStatistics(StateMachine.Time); + } + while (!e.Contains(Event.CommandCompleted)); + + + bool stopInProgress = false; + /// + State.Create(string.Format("{0}({1}) : Executing the cycle", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(new Operations.TimerOp((int)test.TstTime, Event.TimerExpired)) + .AddOperation(benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation((StateMachine.Ambient != null) ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) : null) + .AddOperation(processDataLoggingOp) + .AddOperation(enduranceDataLoggingOp) + .AddOperation(cBrd.ExecuteCommandOp(Elde.Command.EnduranceCycleStart, Elde.Command.EnduranceCycleStop, 0)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) + { + stopInProgress = true; + break; + } + + //------------------------------------------------ + int remainingTime = Math.Max(estimtdEndTime - StateMachine.Time, 0); + if (remainingTime > 60) + { + Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", Strings.Test_in_progress, remainingTime / 60, "min", remainingTime % 60, Strings.sec)); + } + else + { + Bridge.OnActivity(this, string.Format("{0} ... {1} s", Strings.Test_in_progress, remainingTime)); + } + //------------------------------------------------ + + RefFreq.Val = cBrd.ReferenceFreq; + RefFlow.Val = cBrd.ReferenceFlow; + + UpdateAllStatistics(StateMachine.Time); + + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + } + while (!e.Contains(Event.TimerExpired) && !e.Contains(Event.Next)); + + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Last_cycle_wait_please); + //------------------------------------------------ + State.Create(string.Format("{0}({1}) : Delay to make sure the last endu.cycle completed", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(new Operations.TimerOp((int)(duration / 1000) + 1, Event.TimerExpired)) + .AddOperation(benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation((StateMachine.Ambient != null) ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) : null) + .AddOperation(processDataLoggingOp) + .AddOperation(enduranceDataLoggingOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) + { + stopInProgress = true; + } + + RefFreq.Val = cBrd.ReferenceFreq; + RefFlow.Val = cBrd.ReferenceFlow; + + UpdateAllStatistics(StateMachine.Time); + + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + } + while (!e.Contains(Event.TimerExpired) && !e.Contains(Event.Next)); + + + if (stopInProgress) + { + retVal = Event.UiCmdStop; + goto stopTest; + } + } + + + stopTest: + + StopRecordingStatistics(); + + /// + /// Quit this sequence + /// + if (isLastRepetition || retVal == Event.UiCmdStop || retVal == Event.OpArgumentError + || retVal == Event.Error || retVal == Event.ConfigurationError) + { + State.Create(string.Format("{0}({1}) : Stopping diverter, gate, etc.", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(cBrd.StopPreviousOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { if (retVal == Event.Done) retVal = Event.UiCmdStop; break; } + } + while (!e.Contains(Event.PreviousStopped)); + } + + stopTestWOStoppingDivGateEtc: + + /// Create a list with one item 'retVal' (default is Event.Done) and return it + IList retList = new List(1); + retList.Add(retVal); + return retList; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/Factory.cs new file mode 100644 index 00000000..7485fe91 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.Endurance +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Component.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Component(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Component(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this.GetType().Namespace.Substring(29), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/TestMethodCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/TestMethodCfg.cs new file mode 100644 index 00000000..3691cb79 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/TestMethodCfg.cs @@ -0,0 +1,55 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.Endurance +{ + public class TestMethodCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestMethodCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new TestMethodCfgCtrl(); } + + public string Cycle; + +#if false + /// Test parameters + [XmlIgnore] + public TestParams TestParams; + public override IParamsProvider GetRuntimeTestParamsProvider() { return TestParams; } + public override IParamsProvider CreateTestParamsProvider() { return new TestParams(true); } + public override IParamsProvider GetUITestParamsProvider(Test test) + { + return (test.Method == Name) ? base.GetUITestParamsProvider(test) : null; + } +#endif + + /// Private parameterless constructor invoked by all other (public) constructors + TestMethodCfg() + { +#if false + TestParams = new TestParams(true); +#endif + } + + public TestMethodCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + Factory = factory; + ParentName = string.Empty; + } + + public string ToString(int i) + { + return string.Format("Name={0}", Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/TestMethodCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/TestMethodCfgCtrl.cs new file mode 100644 index 00000000..3b1882ba --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/TestMethodCfgCtrl.cs @@ -0,0 +1,85 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.Endurance +{ + public partial class TestMethodCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + string cycle; + + TestMethodCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as TestMethodCfg; + Redraw(); + } + } + + public TestMethodCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + enduranceCycleButton.Text = Strings.Endurance_cycle; + cycle = config.Cycle; + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + enduranceCycleButton.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.Cycle = cycle; + + return flags; + } + + private void enduranceCycleButton_Click(object sender, EventArgs e) + { + CycleDlg dlg = new CycleDlg(CycleStep.StringToCycle(cycle)); + if (dlg.ShowDialog() == DialogResult.OK) + { + cycle = CycleStep.CycleToString(dlg.EnduranceCycle); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/TestMethodCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/TestMethodCfgCtrl.designer.cs new file mode 100644 index 00000000..14ef77a4 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/TestMethodCfgCtrl.designer.cs @@ -0,0 +1,100 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +namespace TBF.BenchControl.TestMethods.Endurance +{ + partial class TestMethodCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.enduranceCycleButton = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(137, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 5; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(27, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 4; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(134, 33); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 3; + this.classNameLabel.Text = "ComonentName"; + // + // enduranceCycleButton + // + this.enduranceCycleButton.Enabled = false; + this.enduranceCycleButton.Location = new System.Drawing.Point(137, 83); + this.enduranceCycleButton.Name = "enduranceCycleButton"; + this.enduranceCycleButton.Size = new System.Drawing.Size(130, 31); + this.enduranceCycleButton.TabIndex = 6; + this.enduranceCycleButton.Text = "Endurance cycle"; + this.enduranceCycleButton.UseVisualStyleBackColor = true; + this.enduranceCycleButton.Click += new System.EventHandler(this.enduranceCycleButton_Click); + // + // TestMethodCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.enduranceCycleButton); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "TestMethodCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.Button enduranceCycleButton; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/TestMethodCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/TestMethodCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/TestMethodCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/TestParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/TestParams.cs new file mode 100644 index 00000000..069f6908 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/Endurance/TestParams.cs @@ -0,0 +1,119 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.Endurance +{ + public class TestParams : TestParamsBase, IParamsProvider, ITestParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestParams) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public bool BooleanParam; /// Main meter readings are ignored during test (suitable for small flows) + + public override void InitializeAll() + { + BooleanParam = false; + } + + + string[] paramNames = new string[] + { + Strings.SupressWMTrills, + }; + public override string ParamName(int i) { return paramNames[i]; } + public override int ParamsCount() { return paramNames.Length; } + + public override string ToString(int i) + { + switch (i) + { + case 0: return (BooleanParam ? Strings.yes : Strings.no); + default: return string.Empty; + } + } + + public CfgUpdateFlags UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: BooleanParam = strValue.Equals(Strings.yes); return CfgUpdateFlags.None; + default: return CfgUpdateFlags.None; + } + } + + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + + switch (i) + { + case 0: + if (strValue.Equals(Strings.yes) || strValue.Equals(Strings.no)) return true; + break; + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(TestParams prms) + { + prms.BooleanParam = this.BooleanParam; + } + + public IParamsProvider Clone() + { + TestParams pars = new TestParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateFromDbEntity(ComponentTest dbEntity) + { + if (dbEntity == null) return; + try + { + TestParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as TestParams; + + testParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + test = dbEntity.Test; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + /// + /// Parameterless constructor initializes the parameters + /// + public TestParams() + { + } + + public TestParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public TestParams(ComponentTest testParamsEntity, string componentName, Test test) + { + this.testParamsEntity = testParamsEntity; + this.componentName = componentName; + this.test = test; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/Compound/Component.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/Compound/Component.cs new file mode 100644 index 00000000..ef88056a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/Compound/Component.cs @@ -0,0 +1,37 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; + +namespace TBF.BenchControl.TestMethods.FixedStart.Compound +{ + public class Component : ComponentBase, GenericDevices.ITestMethod + { + private static readonly ILog log = LogManager.GetLogger(typeof(Component)); + public override string ToString() + { + return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); + } + + public bool CanTest(MetersKind meters) { return meters == MetersKind.Combined; } + public bool DoTransitions() { return true; } + + public Component() + { + } + + public Component(Generic.IComponentCfg cfg) + : base(cfg) + { + log.Debug(this.ToString()); + } + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + return (new FixedStartSeq()).Execute(test, repetNr, isLastRepetition, true, null, DebugLevel); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/Compound/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/Compound/Factory.cs new file mode 100644 index 00000000..7f70deab --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/Compound/Factory.cs @@ -0,0 +1,27 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; +using TBF.BenchControl.Configs.NameOnly; + +namespace TBF.BenchControl.TestMethods.FixedStart.Compound +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Component.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Component(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Component(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this.GetType().Namespace.Substring(29), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/FixedStartSeq.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/FixedStartSeq.cs new file mode 100644 index 00000000..618809bd --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/FixedStartSeq.cs @@ -0,0 +1,1142 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.IO; +using log4net; +using TBF.Resources; +using TBF.UiBridge; + +namespace TBF.BenchControl.TestMethods.FixedStart +{ + public class FixedStartSeq : Sequences.SequenceBase + { + private static readonly ILog log = LogManager.GetLogger(typeof(FixedStartSeq)); + + /// + /// Fixed start mass collection method sequence + /// + /// Test entity + /// + /// Event.Done . . . . . . . OK + /// Event.MakeSecondPass . . OK, 2nd pass (=evaluation) required + /// Event.UiCmdStop . . . . Stopped by the user using the on-screen button STOP + /// Event.OpArgumentError . Target flow is out of range + /// Event.Error . . . . . . Unspecified error + /// + public IList Execute(Config.Entities.Test test, int repetitionNr, bool isLastRepetition, + bool compound, + HeatMeters.TestParams heatMetersTestParams, + Config.Entities.DebugMode debugLevel) + { + Elde.ControlBoardDev cBrd = StateMachine.ControlBoard; + + IList e = new List(); /// Events from currently running operations + Event retVal = Event.Done; + checkUiOp = new Operations.CheckUIOp(true); /// Runs in more then one state + + processDataLoggingOp = new TBF.BenchControl.Operations.ProcessDataLoggingOp(processDataLogger, this, heatMetersTestParams != null); + + float switchTimeStart = 0.001f; /// in seconds, original vale is 1 ms + float switchTimeEnd = 0.001f; /// in seconds, original vale is 1 ms + + LtrPerRefPulse = outPath.FlowMeter.LtrPerPulse; /// [ltr/pulse], nominal flow in [m3/h] + + /// Notes: + /// float timeHr = volumeLtr / (1000.0f * targetFlow); + /// float timeSec = 3600.0f * timeHr; + /// int refPulses = (int)(timeSec * (2000.0f * targetFlow / pOut.FlowMeter.NominalFlow)); + int totalPulses = (int)(test.Volume / LtrPerRefPulse + 0.5f); + + + int rangeIx = 0; /// Default range, used for non-Elde flowmeters + if (outPath.FlowMeter is Elde.FlowMeter.FlowMeter) + { + Elde.FlowMeter.FlowMeter eldeFM = outPath.FlowMeter as Elde.FlowMeter.FlowMeter; + rangeIx = -1; /// Indicates invalid range + for (int r = 0; r <= 5; r++) + { + if (eldeFM.RangeEnabled(r) && eldeFM.GetTempLo(r) <= test.TempLimLo + && eldeFM.GetTempHi(r) >= test.TempLimHi) + { + rangeIx = r; + } + } + + if (rangeIx == -1) + { + Bridge.OnError(this, Strings.Flow_meter_temperature_range_does_not_fit_this_test_conditions); + retVal = Event.UiCmdStop; + goto stopTestWOStoppingDivGateEtc; + } + } + + //==================================== + loop: + /// Start the test, initialize test results + Bridge.OnTestSelected(this, new TestSelectedEventArgs(test, repetitionNr, inPath, benchPath, outPath, sensPath, totalPulses)); + string testName = Results.Utils.GetTestName(test.Name, test.Repeats, repetitionNr); + + /// + /// Optionally display prompt to emerge temperature meters to appropriate baths for heat meters test + /// + IOperation heatMetersPromptOp = null; + if (heatMetersTestParams != null && !string.IsNullOrEmpty(heatMetersTestParams.Prompt)) + { + /// Make sure the CycleBeginForm is closed + if (UIFlowControl.Stop == WaitBeginFormClosed()) goto stopTest; + + heatMetersPromptOp = new Operations.MessageBoxOp(heatMetersTestParams.Prompt); + } + + + if (!test.DoDraining) + { + /// + /// Measure the weight in case there is no unconditional draining + /// + State.Create(string.Format("{0}({1}) : Measuring mass of water in the tank", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(outPath.Scale.ReadMassOp(ref Mass)) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.JustStarted)); + + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.BalanceDone)); + } + /// + /// Skip draining in case there is enough room in the tank + /// + if (test.DoDraining || (Mass.Val + test.Volume >= outPath.Scale.Capacity * Constants.TankFullFactor)) + { + /// + /// Drain the water tank + /// + switch (DrainTheTank(outPath.Scale.DrainValve, outPath.Scale, heatMetersPromptOp)) + { + case Event.Error: { retVal = Event.Error; goto stopTest; } + case Event.UiCmdStop: { retVal = Event.UiCmdStop; goto stopTest; } + } + } + /// + /// Make sure the drain valve is closed + /// + State.Create(string.Format("{0}({1}) : Make sure the drain valve is closed", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(outPath.Scale.ReadMassOp(ref Mass)) + .AddOperation(heatMetersPromptOp) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(null, outPath.Scale.DrainValve)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.JustStarted)); + + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.ValvesSet) || !e.Contains(Event.BalanceDone)); + + + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Starting_the_pump); + //------------------------------------------------ + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + int flowSetTime0 = StateMachine.Time; + + if (inPath.Pump is GenericDevices.IPumpFM) (inPath.Pump as GenericDevices.IPumpFM).TurnOn(test.PumpPower); + /// + State.Create(string.Format("{0}({1}) : Starting the pump", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) +// .AddOperation(new Operations.SetAllRegulValvesOp(inPath.RegulValves, inPath.RegulValvesPct, 60)) + .AddOperation(heatMetersPromptOp) + .AddOperation(inPath.Pump != null ? cBrd.SetValvesOp(inPath.Pump, null) : null) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + + } + while (e.Contains(Event.ValvesBusy) /* || !e.Contains(Event.AllPositionsReached)*/); + + + if (test.TimePump2StartV > 0) + { + State.Create(string.Format("{0}({1}) : Waiting after the pump started", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(new Operations.TimerOp(test.TimePump2StartV)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + } + + + if (benchPath.StopBFValve != null) + { + State.Create(string.Format("{0}({1}) : Opening the stop backflow valve", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(benchPath.StopBFValve, null)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } + while (!e.Contains(Event.ValvesSet)); + } + + + if (test.TimeBeforeFlow > 0) + { + State.Create(string.Format("{0}({1}) : Waiting before flow setting process starts", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(new Operations.TimerOp(test.TimeBeforeFlow)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + } + + + setting_flow: + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Setting_the_flow); + //------------------------------------------------ + if (inPath.Pump is GenericDevices.IPumpFM) + { + (inPath.Pump as GenericDevices.IPumpFM).TurnOn(test.PumpPower); + } + /// + State.Create(string.Format("{0}({1}) : Pump on", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(inPath.Pump, null)) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (e.Contains(Event.ValvesBusy)); + /// + State.Create(string.Format("{0}({1}) : Start valve open", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(new TBF.BenchControl.Elde.SetValvesOp(cBrd, false, outPath)) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (e.Contains(Event.ValvesBusy)); + + + //-------------------------------- + State.Create(string.Format("{0}({1}) : Setting the flow", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(outPath.RegulValve.SetFlowOp(outPath.FlowMeter, test.Qfrom, test.Qto, outPath.PidCoef, RefFlow, 600)) /// timeout = 10 min. + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (e.Contains(Event.OpArgumentError)) { retVal = Event.OpArgumentError; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.RegulValveTimeOut)) + { + Bridge.OnError(this, Strings.Flow_adjustment_failed); + retVal = Event.UiCmdStop; + goto stopTest; + } + if (e.Contains(Event.Next)) goto flow_set; + } + while (!e.Contains(Event.FlowReached)); + + flow_set: + + int flowSetTime = StateMachine.Time - flowSetTime0; + + if (heatMetersTestParams != null && heatMetersPath != null) + { + //--------------------------------------------------- + Bridge.OnActivity(this, Strings.Setting_temperature); + //--------------------------------------------------- + + int lastTimeSec = StateMachine.Time; + double Tw_last = 0; + double Tc_last = 0; + + State.Create(string.Format("{0}({1}) : Checking if the temperature is stable", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Next)) goto temperature_set; + + if (TempRefHi1.Val != 0 && TempRefHi2.Val != 0 && TempRefLo1.Val != 0 && TempRefLo2.Val != 0) + { + if (StateMachine.Time - lastTimeSec > 10 || StateMachine.Time - lastTimeSec < 0) + { + double Tw = (TempRefHi1.Val + TempRefHi2.Val) / 2; + double Tc = (TempRefLo1.Val + TempRefLo2.Val) / 2; + if (heatMetersTestParams.TempWarmLo <= Tw && Tw <= heatMetersTestParams.TempWarmHi && + heatMetersTestParams.TempColdLo <= Tc && Tc <= heatMetersTestParams.TempColdHi && + Math.Abs(Tw - Tw_last) <= heatMetersTestParams.ChangeInTimeWarm && + Math.Abs(Tc - Tc_last) <= heatMetersTestParams.ChangeInTimeCold && + Math.Abs(TempRefHi1.Val - TempRefHi2.Val) <= heatMetersTestParams.DeltaTempWarm && + Math.Abs(TempRefLo1.Val - TempRefLo2.Val) <= heatMetersTestParams.DeltaTempCold) + { + goto temperature_set; + } + + lastTimeSec = StateMachine.Time; + Tw_last = Tw; + Tc_last = Tc; + } + } + } + while (true); + } + else if (test.DoControlWaterTemp && benchPath.TempMtrUp != null && benchPath.TempMtrDown != null) + { + //--------------------------------------------------- + Bridge.OnActivity(this, Strings.Setting_temperature); + //--------------------------------------------------- + + State.Create(string.Format("{0}({1}) : Wait until the water temperature is within limits", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Next)) goto temperature_set; + + if (TempUp.Val >= test.TempLimLo && TempUp.Val <= test.TempLimHi && + TempDown.Val >= test.TempLimLo && TempDown.Val <= test.TempLimHi) + { + goto temperature_set; + } + } + while (true); + } + + temperature_set: + + //----------------------------------------------------------------- + Bridge.OnActivity(this, Strings.Stopping_flow_for_the_fixed_start); + //----------------------------------------------------------------- + State.Create(string.Format("{0}({1}) : Closing the start/stop valve before the fixed start test", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(new TBF.BenchControl.Elde.SetValvesOp(cBrd, true, outPath)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } + while (!e.Contains(Event.ValvesSet)); + + + int time = StateMachine.Time; + double currentFlow = RefFlow.Val; + + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Measuring_the_weight); + //------------------------------------------------ + + if (test.TimeFlow2Mass > 0) + { + State.Create(string.Format("{0}({1}) : Waiting before 1st measurement", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation(cBrd.UpdateTankWeightOp()) + .AddOperation(new Operations.TimerOp(test.TimeFlow2Mass)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + } + + + TestStartTime = DateTime.Now; + LogProcessDataTestInfo(processDataLogger, test.Procedure.Name, test.Name); + int startPulses = 0; + + /// + /// Enter watermeter begin states here + /// + GenericDevices.IHasWMStatesForm dataEntryCmpnt = TbfComponents.FindComponent(StateMachine.Procedure.DataEntry) as GenericDevices.IHasWMStatesForm; + + if (dataEntryCmpnt != null) + { + string fileName = string.Format("{0}-start.bmp", test.Name); + + if (dataEntryCmpnt is GenericDevices.IDataEntryForCamera) + { + string[] startImages = new string[sensPath.RegisterReaders.Length]; + + State state2 = State.Create(string.Format("{0}({1}) : Grabbing images", test.Method, test.Name)) + .AddOperation(checkUiOp); + for (int i = 0; i < sensPath.RegisterReaders.Length; i++) + { + GenericDevices.IRoiForFixedStart roi = sensPath.RegisterReaders[i] as GenericDevices.IRoiForFixedStart; + if (roi != null) + { + string directory = Path.Combine(Program.TempImagesDir, BatchRslts.Batch.BatchNr.ToString(), (i + 1).ToString()); + Directory.CreateDirectory(directory); + startImages[i] = Path.Combine(directory, fileName); + state2.AddOperation(roi.GrabImageOp(startImages[i])); + } + } + state2.EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + + if (e.Contains(Event.Error)) { retVal = Event.Error; break; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; break; } + } + while (e.Contains(Event.CameraBusy)); + + (dataEntryCmpnt as GenericDevices.IDataEntryForCamera).StartImages = startImages; + } + + Bridge.OnActivity(this, Strings.Enter_water_meter_data); + State.Create(string.Format("{0}({1}) : Entering begin-state", test.Method, test.Name)) + .AddOperation((dataEntryCmpnt as GenericDevices.IHasWMStatesForm).ShowTestStartFormOp(sensPath.RegisterReaders)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation(checkUiOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.ModelessFormClosed)); + + if (heatMetersTestParams != null) + { + for (int i = 0; i < Config.Data.HeatMetersCount; i++) + { + BenchControl.Elde.FixedStartRegisterReader.RegisterReader volumeRegisterReader = + sensPath.RegisterReaders[2 * i] as BenchControl.Elde.FixedStartRegisterReader.RegisterReader; + + BenchControl.Elde.FixedStartRegisterReader.RegisterReader energyRegisterReader = + sensPath.RegisterReaders[2 * i + 1] as BenchControl.Elde.FixedStartRegisterReader.RegisterReader; + + if (volumeRegisterReader != null) volumeRegisterReader.BeginWMState = dataEntryCmpnt.WMStartState(i); + if (energyRegisterReader != null && dataEntryCmpnt is GenericDevices.IHasHeatMtrStatesForm) + { + energyRegisterReader.BeginWMState = (float)(dataEntryCmpnt as GenericDevices.IHasHeatMtrStatesForm).EnergyStartState(i); + } + } + } + else + { + for (int i = 0; i < Config.Data.WMsCount; i++) + { + GenericDevices.IRegisterReader rr = sensPath.RegisterReaders[i]; + + if (rr is BenchControl.Elde.FixedStartRegisterReader.RegisterReader) + (rr as BenchControl.Elde.FixedStartRegisterReader.RegisterReader).BeginWMState = dataEntryCmpnt.WMStartState(i); + + if (rr is BenchControl.Network.Camera.RoiForFixedStart.Roi) + (rr as BenchControl.Network.Camera.RoiForFixedStart.Roi).BeginWMState = dataEntryCmpnt.WMStartState(i); + } + } + + if (dataEntryCmpnt is GenericDevices.IDataEntryForCamera && (dataEntryCmpnt as GenericDevices.IDataEntryForCamera).SaveImages) + { + /// SaveImages==true ... copy images to the directory that will be archived at the end of the cycle + for (int i = 0; i < sensPath.RegisterReaders.Length; i++) + { + GenericDevices.IRoiForFixedStart roi = sensPath.RegisterReaders[i] as GenericDevices.IRoiForFixedStart; + if (roi != null) + { + string srcDir = Path.Combine(Program.TempImagesDir, BatchRslts.Batch.BatchNr.ToString(), (i + 1).ToString()); + string destDir = Path.Combine(Program.ImagesDir, BatchRslts.Batch.BatchNr.ToString(), (i + 1).ToString()); + if (File.Exists(Path.Combine(srcDir, fileName))) + { + Directory.CreateDirectory(destDir); + File.Copy(Path.Combine(srcDir, fileName), Path.Combine(destDir, fileName), true); + } + } + } + } + } + + + if (heatMetersPath == null) LogProcessDataHeader(processDataLogger, "Measurement"); + else LogProcessDataHeaderHeatMeters(processDataLogger, "Measurement"); + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Test_in_progress); + //------------------------------------------------ + State.Create(string.Format("{0}({1}) : Starting the test", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation(cBrd.StartMeasurementOp(outPath, Elde.TestMethods.Synchro, + test.Qfrom, test.Qto, 2 * totalPulses, (float)test.TolerRed)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.MeasurementStarted)); + + StartTime = (double)StateMachine.Time; + + State.Create(string.Format("{0}({1}) : Opening the start/stop valve at the beginning of the fixed start test", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation(new TBF.BenchControl.Elde.SetValvesOp(cBrd, false, outPath)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } + while (!e.Contains(Event.ValvesSet)); + + switchTimeStart = 0.001f * cBrd.ValveOpenCloseTime; + log.WarnFormat("Start valve switch time on test start = {0} ms", cBrd.ValveOpenCloseTime); + + /// Measurement loop - preparation + readRegistersOp = new Operations.ReadMoreRegistersOp(sensPath.RegisterReaders); + queryEnd1 = cBrd.QueryMeasurementEndOp(); + queryEnd2 = cBrd.QueryMeasurementEndOp(); + + StartNewStatistics(StateMachine.Time, BatchRslts.Batch.BatchNr, test.Name, repetitionNr); + int estimtdEndTime = StateMachine.Time + (int)test.TstTime; + + /// Measurement loop - begin + do + { + //-------------------------------- + switch (ReadRegistersTempPressAmbient(null, true)) + { + case Event.Error: + retVal = Event.Error; + goto stopTest; + + case Event.UiCmdStop: + retVal = Event.UiCmdStop; + goto stopTest; + + case Event.MeasurementCompleted: + goto test_completed; + } + + int remainingTime = Math.Max(estimtdEndTime - StateMachine.Time, 0); + if (remainingTime > 60) + { + Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", Strings.Test_in_progress, remainingTime / 60, "min", remainingTime % 60, Strings.sec)); + } + else + { + Bridge.OnActivity(this, string.Format("{0} ... {1} s", Strings.Test_in_progress, remainingTime)); + } + + RefFreq.Val = cBrd.ReferenceFreq; + RefFlow.Val = cBrd.ReferenceFlow; + + UpdateAllStatistics(StateMachine.Time); + + if (heatMetersTestParams != null) + { + if (lastEnergyUpdateTime == 0) + { + lastEnergyUpdateTime = StateMachine.Time; + } + else + { + //double deltaTime = (double)(StateMachine.Time - lastEnergyUpdateTime); + double T_in = (TempRefHi1.Val + TempRefHi2.Val) / 2; /// [°C] + double T_out = (TempRefLo1.Val + TempRefLo2.Val) / 2; /// [°C] + double deltaVolume = LtrPerRefPulse * RefPulsesDelta; /// [l] + double deltaEnergy = (0.001 * deltaVolume) * (T_in - T_out) * Config.Formulas.HeatCoefficientWater(16, T_in, T_out, heatMetersTestParams.FlowMeasuredAtHiTempPipe); /// [J] = [m3] * [K] * [J/(m3 K)] + Energy.Update(deltaEnergy); + VolumeForEnergy.Update(deltaVolume); + lastEnergyUpdateTime = StateMachine.Time; + } + } + + if (compound) + { + /// TODO: Reimplement for combined meters + //for (int i = 0; i < Config.Data.CompoundWMsCount; i++) + //{ + // data.TestResult.CombinedMeters[i].VolumeMeter = data.TestResult.Meters[2 * i].VolumeMeter + // + data.TestResult.Meters[2 * i + 1].VolumeMeter; + // if (data.Volume.Valid) + // { + // data.TestResult.CombinedMeters[i].VolumeErrorPct = + // Formulas.ErrorFromVolumes(data.TestResult.CombinedMeters[i].VolumeMeter, data.Volume.Val); + // } + //} + } + + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + } + while (cBrd.EtPulses(0) < totalPulses); + /// Measurement loop - end + + test_completed: + + StopRecordingStatistics(); + + EndTime = (double)StateMachine.Time; + + State.Create(string.Format("{0}({1}) : Closing the start/stop valve at the end of the fixed start test", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation(new TBF.BenchControl.Elde.SetValvesOp(cBrd, true, outPath)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } + while (e.Contains(Event.ValvesBusy)); + + switchTimeEnd = 0.001f * cBrd.ValveOpenCloseTime; + log.WarnFormat("Start valve switch time on test end = {0} ms", cBrd.ValveOpenCloseTime); + + State.Create(string.Format("{0}({1}) : Waiting before 2nd measurement", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation((StateMachine.Ambient != null) + ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) : null) + .AddOperation(outPath.Scale.ReadMassOp(ref Mass)) + .AddOperation(cBrd.UpdateTankWeightOp()) + .AddOperation(processDataLoggingOp) + .AddOperation(new Operations.TimerOp(test.TimeStop2Mass)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + + + TestEndTime = DateTime.Now; + int endPulses = cBrd.EtPulses(0); + + + State.Create(string.Format("{0}({1}) : Stopping diverter, gate, etc.", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(cBrd.StopPreviousOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.PreviousStopped)); + + + double flowVolume = 3.6 * LtrPerRefPulse * Convert.ToDouble(endPulses - startPulses) / cBrd.TTime; + double constMasterCorr = outPath.FlowMeter.LtrPerPulseCorrected(flowVolume, rangeIx); + double volumeCTV = constMasterCorr * Convert.ToDouble(endPulses - startPulses); + double refEnergy = Energy.Sum * volumeCTV / VolumeForEnergy.Sum; /// [J]=[J]*[l]/[l] + + + /// + /// Enter watermeter end states here + /// + if (dataEntryCmpnt != null) + { + string fileName = string.Format("{0}-end.bmp", test.Name); + + if (dataEntryCmpnt is GenericDevices.IDataEntryForCamera) + { + string[] endImages = new string[sensPath.RegisterReaders.Length]; + + State state2 = State.Create(string.Format("{0}({1}) : Grabbing images", test.Method, test.Name)) + .AddOperation(checkUiOp); + for (int i = 0; i < sensPath.RegisterReaders.Length; i++) + { + GenericDevices.IRoiForFixedStart roi = sensPath.RegisterReaders[i] as GenericDevices.IRoiForFixedStart; + if (roi != null) + { + string directory = Path.Combine(Program.TempImagesDir, BatchRslts.Batch.BatchNr.ToString(), (i + 1).ToString()); + Directory.CreateDirectory(directory); + endImages[i] = Path.Combine(directory, fileName); + state2.AddOperation(roi.GrabImageOp(endImages[i])); + } + } + state2.EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + + if (e.Contains(Event.Error)) { retVal = Event.Error; break; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; break; } + } + while (e.Contains(Event.CameraBusy)); + + (dataEntryCmpnt as GenericDevices.IDataEntryForCamera).EndImages = endImages; + } + + Bridge.OnActivity(this, Strings.Enter_water_meter_data); + State state = State.Create(string.Format("{0}({1}) : Entering the end-state", test.Method, test.Name)); + if (heatMetersTestParams != null && dataEntryCmpnt is GenericDevices.IHasHeatMtrStatesForm) + { + state.AddOperation((dataEntryCmpnt as GenericDevices.IHasHeatMtrStatesForm). + ShowTestEndFormOp(sensPath.RegisterReaders, + volumeCTV, test.ErrLimLo + test.Uncertainty, test.ErrLimHi - test.Uncertainty, + refEnergy, test.ErrLimLo + test.Uncertainty, test.ErrLimHi - test.Uncertainty)); + } + else + { + state.AddOperation(dataEntryCmpnt.ShowTestEndFormOp(sensPath.RegisterReaders, + volumeCTV, test.ErrLimLo + test.Uncertainty, test.ErrLimHi - test.Uncertainty)); + } + state.AddOperation(checkUiOp); + state.EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.ModelessFormClosed)); + + + if (heatMetersTestParams != null) + { + for (int i = 0; i < Config.Data.HeatMetersCount; i++) + { + BenchControl.Elde.FixedStartRegisterReader.RegisterReader volumeRegisterReader = + sensPath.RegisterReaders[2 * i] as BenchControl.Elde.FixedStartRegisterReader.RegisterReader; + + BenchControl.Elde.FixedStartRegisterReader.RegisterReader energyRegisterReader = + sensPath.RegisterReaders[2 * i + 1] as BenchControl.Elde.FixedStartRegisterReader.RegisterReader; + + if (volumeRegisterReader != null) volumeRegisterReader.EndWMState = dataEntryCmpnt.WMEndState(i); + if (energyRegisterReader != null && dataEntryCmpnt is GenericDevices.IHasHeatMtrStatesForm) + { + energyRegisterReader.EndWMState = (float)(dataEntryCmpnt as GenericDevices.IHasHeatMtrStatesForm).EnergyEndState(i); + } + } + } + else + { + for (int i = 0; i < Config.Data.WMsCount; i++) + { + GenericDevices.IRegisterReader rr = sensPath.RegisterReaders[i]; + + if (rr is BenchControl.Elde.FixedStartRegisterReader.RegisterReader) + (rr as BenchControl.Elde.FixedStartRegisterReader.RegisterReader).EndWMState = dataEntryCmpnt.WMEndState(i); + + if (rr is BenchControl.Network.Camera.RoiForFixedStart.Roi) + (rr as BenchControl.Network.Camera.RoiForFixedStart.Roi).EndWMState = dataEntryCmpnt.WMEndState(i); + } + } + + if (dataEntryCmpnt is GenericDevices.IDataEntryForCamera && (dataEntryCmpnt as GenericDevices.IDataEntryForCamera).SaveImages) + { + /// SaveImages==true ... copy images to the directory that will be archived at the end of the cycle + for (int i = 0; i < sensPath.RegisterReaders.Length; i++) + { + GenericDevices.IRoiForFixedStart roi = sensPath.RegisterReaders[i] as GenericDevices.IRoiForFixedStart; + if (roi != null) + { + string srcDir = Path.Combine(Program.TempImagesDir, BatchRslts.Batch.BatchNr.ToString(), (i + 1).ToString()); + string destDir = Path.Combine(Program.ImagesDir, BatchRslts.Batch.BatchNr.ToString(), (i + 1).ToString()); + if (File.Exists(Path.Combine(srcDir, fileName))) + { + Directory.CreateDirectory(destDir); + File.Copy(Path.Combine(srcDir, fileName), Path.Combine(destDir, fileName), true); + } + } + } + } + } + + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Test_completed); + //------------------------------------------------ + + /// Make sure the CycleBeginForm is closed so that water meter data (s/n) can be copied into results + if (UIFlowControl.Stop == WaitBeginFormClosed()) goto stopTest; + + /// + /// Populate TestResult data entity with data + /// + Results.Entities.TestRslt tstRslt = BatchRslts.GetTestRslt(testName, test.Part); + + if (tstRslt != null) + { + UpdateTempPressDensAmb(tstRslt); + + /// Main results + tstRslt.MethodClass = TbfComponents.FindComponent(test.Method).ClassName; + tstRslt.StartTime = TestStartTime; + tstRslt.EndTime = TestEndTime; + tstRslt.FlowSetTime = flowSetTime; + + tstRslt.TestTime = Math.Max(1.0, EndTime - StartTime); /// [s] measurement time, at least 1 to prevent division by zero + + tstRslt.PulsesMaster = Convert.ToDouble(endPulses - startPulses); /// Pulses of the master flow meter (test total) + tstRslt.MassStartRaw = 0; + tstRslt.MassStart = 0; + tstRslt.MassEndRaw = 0; + tstRslt.MassEnd = 0; + tstRslt.FlowMass = 0; + tstRslt.FlowVolume = flowVolume; /// [m3/h] + tstRslt.VolumeMaster = LtrPerRefPulse * tstRslt.PulsesMaster; /// [l] volume from the master flow meter + tstRslt.Buoyancy = Config.Formulas.Buoyancy(); + tstRslt.ConstMasterRaw = outPath.FlowMeter.LtrPerPulse; /// Uncorrected master flowmeter coefficient + tstRslt.ConstMasterCorr = constMasterCorr; /// Corrected master pulses per liter + tstRslt.ConstMaster = constMasterCorr; /// Corrected master pulses per liter + tstRslt.VolumeCTV = tstRslt.ConstMaster * tstRslt.PulsesMaster; /// [l] 1000.0f is because density is in [kg/m3] + tstRslt.ErrorMaster = 0; + + tstRslt.FlowMean = (float)RefFlowStat.Average; + tstRslt.FlowStart = (float)RefFlowStat.First; + tstRslt.FlowEnd = (float)RefFlowStat.Last; + tstRslt.FlowMin = (float)RefFlowStat.Min; + tstRslt.FlowMax = (float)RefFlowStat.Max; + + tstRslt.DiverterStart = switchTimeStart; + tstRslt.DiverterEnd = switchTimeEnd; + tstRslt.ErrorFlagsMd = (ErrorFlagsComp != null) ? (sbyte)ErrorFlagsComp.Mode : (sbyte)0; + tstRslt.ErrorFlags = (ErrorFlagsComp != null) ? ErrorFlagsComp.GetErrorFlags(tstRslt, false, true, switchTimeStart, switchTimeEnd) : 0; + + if (compound) + { + /// + /// Compound meters + /// + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (test.Part != 0 && test.Part != Utils.PartNr(i + 1, BatchRslts.Batch.Compound)) continue; + + Results.Entities.MeterTestRslt mainMeterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.CompoundMain); + Results.Entities.MeterTestRslt auxMeterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.CompoundAux); + + for (int isAux = 0; isAux <= 1; isAux++) /// 0=main, 1=aux + { + Results.Entities.MeterTestRslt meterRslt = (isAux == 0) ? mainMeterRslt : auxMeterRslt; + GenericDevices.IRegisterReader regReader = sensPath.RegisterReaders[2 * i + isAux]; + + if (meterRslt != null && regReader != null) + { + meterRslt.RegReaderType = (int)regReader.RegisterReaderType; + meterRslt.PulsesPerLiter = regReader.PulsesPerLtr; + meterRslt.VolumeStart = regReader.BeginWMState; /// [l] + meterRslt.VolumeEnd = regReader.EndWMState; /// [l] + meterRslt.VolumeMeter = meterRslt.VolumeEnd - meterRslt.VolumeStart; /// [l] + meterRslt.VolumeRef = tstRslt.VolumeCTV; /// [l] + meterRslt.PulsesMeter = meterRslt.VolumeMeter; + meterRslt.PulsesMaster = tstRslt.PulsesMaster; + meterRslt.TestTime = tstRslt.TestTime; + meterRslt.Error = Config.Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef); /// Not used for evaluation + } + } + + Results.Entities.MeterTestRslt compoundMeterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.Compound); + + if (compoundMeterRslt != null && mainMeterRslt != null && auxMeterRslt != null) + { + compoundMeterRslt.VolumeRef = tstRslt.VolumeCTV; /// [l] must be calculated before main & aux. meter error + compoundMeterRslt.VolumeMeter = mainMeterRslt.VolumeMeter + auxMeterRslt.VolumeMeter; + compoundMeterRslt.PulsesMaster = tstRslt.PulsesMaster; + compoundMeterRslt.TestTime = tstRslt.TestTime; + compoundMeterRslt.Error = Config.Formulas.ErrorFromVolumes(compoundMeterRslt.VolumeMeter, compoundMeterRslt.VolumeRef); + compoundMeterRslt.Passed = (compoundMeterRslt.Error >= test.GetErrLimLo(tstRslt.FlowMean) + test.Uncertainty) + && (compoundMeterRslt.Error <= test.GetErrLimHi(tstRslt.FlowMean) - test.Uncertainty) + && (tstRslt.ErrorFlags == 0 || tstRslt.ErrorFlagsMode() != Config.Entities.ErrorFlagsMode.On); + mainMeterRslt.Passed = auxMeterRslt.Passed = compoundMeterRslt.Passed; + mainMeterRslt.TestDone = auxMeterRslt.TestDone = compoundMeterRslt.TestDone = true; + tstRslt.TestDone = true; + } + } + } + else if (heatMetersTestParams != null) + { + /// + /// Heat meters + /// + tstRslt.RefEnergy = Energy.Sum * tstRslt.VolumeCTV / VolumeForEnergy.Sum; /// [J] = [J] * [l] / [l] + + tstRslt.Custom1 = (float)TempRefHiStat.Average; + tstRslt.Custom2 = (float)TempRefHiStat.First; + tstRslt.Custom3 = (float)TempRefHiStat.Last; + tstRslt.Custom4 = (float)TempRefHiStat.Min; + tstRslt.Custom5 = (float)TempRefHiStat.Max; + tstRslt.Custom6 = (float)TempRefLoStat.Average; + tstRslt.Custom7 = (float)TempRefLoStat.First; + tstRslt.Custom8 = (float)TempRefLoStat.Last; + tstRslt.Custom9 = (float)TempRefLoStat.Min; + tstRslt.Custom10 = (float)TempRefLoStat.Max; + + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (test.Part != 0 && test.Part != Utils.PartNr(i + 1, BatchRslts.Batch.Compound)) continue; + + Results.Entities.MeterTestRslt volumeRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.HeatMeterVolume); + Results.Entities.MeterTestRslt energyRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.HeatMeterEnergy); + + GenericDevices.IRegisterReader volumeRegReader = + (sensPath.RegisterReaders.Length > 2 * i) ? sensPath.RegisterReaders[2 * i] : null; + + GenericDevices.IRegisterReader energyRegReader = + (sensPath.RegisterReaders.Length > 2 * i + 1) ? sensPath.RegisterReaders[2 * i + 1] : null; + + if (volumeRslt != null && volumeRegReader != null) + { + volumeRslt.PulsesPerLiter = volumeRegReader.PulsesPerLtr; + volumeRslt.VolumeStart = volumeRegReader.BeginWMState; + volumeRslt.VolumeEnd = volumeRegReader.EndWMState; + volumeRslt.VolumeMeter = volumeRslt.VolumeEnd - volumeRslt.VolumeStart; + volumeRslt.VolumeRef = tstRslt.VolumeCTV; + volumeRslt.PulsesMeter = volumeRslt.VolumeMeter; + volumeRslt.PulsesMaster = tstRslt.PulsesMaster; /// <----------------- ??? + volumeRslt.TestTime = tstRslt.TestTime; + + volumeRslt.Error = Config.Formulas.ErrorFromVolumes(volumeRslt.VolumeMeter, volumeRslt.VolumeRef); + volumeRslt.Passed = !heatMetersTestParams.EvaluateVolume || + ((volumeRslt.Error >= test.GetErrLimLo(tstRslt.FlowMean) + test.Uncertainty) && + (volumeRslt.Error <= test.GetErrLimHi(tstRslt.FlowMean) - test.Uncertainty) && + (tstRslt.ErrorFlags == 0 || tstRslt.ErrorFlagsMode() != Config.Entities.ErrorFlagsMode.On)); + volumeRslt.TestDone = true; + tstRslt.TestDone = true; + } + + if (energyRslt != null && energyRegReader != null && dataEntryCmpnt is GenericDevices.IHasHeatMtrStatesForm) + { + volumeRslt.PulsesPerLiter = energyRegReader.PulsesPerLtr; + energyRslt.VolumeStart = (dataEntryCmpnt as GenericDevices.IHasHeatMtrStatesForm).EnergyStartState(i); + energyRslt.VolumeEnd = (dataEntryCmpnt as GenericDevices.IHasHeatMtrStatesForm).EnergyEndState(i); + energyRslt.VolumeMeter = energyRslt.VolumeEnd - energyRslt.VolumeStart; + energyRslt.VolumeRef = tstRslt.RefEnergy; + energyRslt.PulsesMeter = energyRslt.VolumeMeter; + energyRslt.PulsesMaster = tstRslt.PulsesMaster; /// <----------------- ??? + + energyRslt.Error = Config.Formulas.ErrorFromVolumes(energyRslt.VolumeMeter, energyRslt.VolumeRef); + energyRslt.Passed = (energyRslt.Error >= heatMetersTestParams.ErrorLimitLo) + && (energyRslt.Error <= heatMetersTestParams.ErrorLimitHi) + && (tstRslt.ErrorFlags == 0 || tstRslt.ErrorFlagsMode() != Config.Entities.ErrorFlagsMode.On); + energyRslt.TestDone = true; + tstRslt.TestDone = true; + } + } + } + else + { + /// + /// Single meters + /// + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (test.Part != 0 && test.Part != Utils.PartNr(i + 1, BatchRslts.Batch.Compound)) continue; + + Results.Entities.MeterTestRslt meterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.Single); + GenericDevices.IRegisterReader regReader = sensPath.RegisterReaders[i]; + + if (meterRslt != null && regReader != null) + { + meterRslt.RegReaderType = (int)regReader.RegisterReaderType; + meterRslt.PulsesPerLiter = regReader.PulsesPerLtr; + meterRslt.VolumeStart = regReader.BeginWMState; + meterRslt.VolumeEnd = regReader.EndWMState; + meterRslt.VolumeMeter = meterRslt.VolumeEnd - meterRslt.VolumeStart; + meterRslt.VolumeRef = tstRslt.VolumeCTV; /// liter + meterRslt.PulsesMeter = meterRslt.VolumeMeter; + meterRslt.PulsesMaster = tstRslt.PulsesMaster; + meterRslt.TestTime = tstRslt.TestTime; + meterRslt.Error = Config.Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef); + meterRslt.Passed = (meterRslt.Error >= test.GetErrLimLo(tstRslt.FlowMean) + test.Uncertainty) + && (meterRslt.Error <= test.GetErrLimHi(tstRslt.FlowMean) - test.Uncertainty) + && (tstRslt.ErrorFlags == 0 || tstRslt.ErrorFlagsMode() != Config.Entities.ErrorFlagsMode.On); + meterRslt.TestDone = true; + tstRslt.TestDone = true; + } + } + } + + tstRslt.Components = Results.Entities.Components + .UpdateList(BatchRslts.ComponentsList, + new Results.Entities.Components((BenchInfo != null) ? BenchInfo.TestBenchId : 1, + (BenchInfo != null) ? BenchInfo.TestBenchName : "testbench", + inPath.Pump != null ? inPath.Pump.Name : string.Empty, + outPath.FlowMeter != null ? outPath.FlowMeter.Name : string.Empty, + outPath.Scale != null ? outPath.Scale.Name : string.Empty, + outPath.RegulValve != null ? outPath.RegulValve.Name : string.Empty, + outPath.Diverter != null ? outPath.Diverter.Name : string.Empty)); + + /// Update water meter error flags + if (ErrorFlagsComp != null) + { + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (BatchRslts.WaterMeters[i] != null) + { + BatchRslts.WaterMeters[i].ErrorFlags = ErrorFlagsComp.GetWMtrErrorFlags(BatchRslts.WaterMeters[i].MeterTestRslts); + } + } + } + + /// Update results + Bridge.OnTestCompleted(this, new TestCompletedEventArgs(testName, tstRslt)); + } + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.TransitionAfter)); + + /// Append the results to the CSV-file + allResults.Info(TestResult2CsvLine(testName, test.Part)); + + + stopTest: + + StopRecordingStatistics(); + + /// + /// Quit this sequence + /// + if (isLastRepetition || retVal == Event.UiCmdStop || retVal == Event.OpArgumentError + || retVal == Event.Error || retVal == Event.ConfigurationError) + { + State.Create(string.Format("{0}({1}) : Stopping diverter, gate, etc.", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(cBrd.StopPreviousOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.PreviousStopped)); + } + + stopTestWOStoppingDivGateEtc: + + /// Create a list with one item 'retVal' (default is Event.Done) and return it + IList retList = new List(1); + retList.Add(retVal); + return retList; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/HeatMeters/Component.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/HeatMeters/Component.cs new file mode 100644 index 00000000..3e7076a4 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/HeatMeters/Component.cs @@ -0,0 +1,40 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; + +namespace TBF.BenchControl.TestMethods.FixedStart.HeatMeters +{ + public class Component : ComponentBase, GenericDevices.ITestMethod + { + private static readonly ILog log = LogManager.GetLogger(typeof(Component)); + public override string ToString() + { + return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); + } + + readonly TestMethodCfg testMethodCfg; + + public bool CanTest(MetersKind meters) { return meters == MetersKind.HeatMeter; } + public bool DoTransitions() { return true; } + + public Component() + { + } + + public Component(Generic.IComponentCfg cfg) + : base(cfg) + { + testMethodCfg = cfg as TestMethodCfg; + log.Debug(this.ToString()); + } + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + return (new FixedStartSeq()).Execute(test, repetNr, isLastRepetition, false, testMethodCfg.TestParams, DebugLevel); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/HeatMeters/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/HeatMeters/Factory.cs new file mode 100644 index 00000000..71386786 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/HeatMeters/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FixedStart.HeatMeters +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Component.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Component(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Component(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this.GetType().Namespace.Substring(29), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/HeatMeters/TestMethodCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/HeatMeters/TestMethodCfg.cs new file mode 100644 index 00000000..501822fb --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/HeatMeters/TestMethodCfg.cs @@ -0,0 +1,49 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FixedStart.HeatMeters +{ + public class TestMethodCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestMethodCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new TestMethodCfgCtrl(); } + + /// Test parameters + [XmlIgnore] + public TestParams TestParams; + public override IParamsProvider GetRuntimeTestParamsProvider() { return TestParams; } + public override IParamsProvider CreateTestParamsProvider() { return new TestParams(true); } + public override IParamsProvider GetUITestParamsProvider(Test test) + { + return (test.Method == Name) ? base.GetUITestParamsProvider(test) : null; + } + + /// Private parameterless constructor invoked by all other (public) constructors + TestMethodCfg() + { + TestParams = new TestParams(true); + } + + public TestMethodCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + Factory = factory; + ParentName = string.Empty; + } + + public string ToString(int i) + { + return string.Format("Name={0}", Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/HeatMeters/TestMethodCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/HeatMeters/TestMethodCfgCtrl.cs new file mode 100644 index 00000000..db794400 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/HeatMeters/TestMethodCfgCtrl.cs @@ -0,0 +1,69 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FixedStart.HeatMeters +{ + public partial class TestMethodCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + TestMethodCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as TestMethodCfg; + Redraw(); + } + } + + public TestMethodCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/HeatMeters/TestMethodCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/HeatMeters/TestMethodCfgCtrl.designer.cs new file mode 100644 index 00000000..867c03dd --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/HeatMeters/TestMethodCfgCtrl.designer.cs @@ -0,0 +1,86 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +namespace TBF.BenchControl.TestMethods.FixedStart.HeatMeters +{ + partial class TestMethodCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(137, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 5; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(27, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 4; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(134, 33); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 3; + this.classNameLabel.Text = "ComonentName"; + // + // BasicPrinterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "BasicPrinterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/HeatMeters/TestMethodCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/HeatMeters/TestMethodCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/HeatMeters/TestMethodCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/HeatMeters/TestParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/HeatMeters/TestParams.cs new file mode 100644 index 00000000..7556cedc --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/HeatMeters/TestParams.cs @@ -0,0 +1,197 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.FixedStart.HeatMeters +{ + public class TestParams : TestParamsBase, IParamsProvider, ITestParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestParams) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public float ErrorLimitLo; /// [%] + public float ErrorLimitHi; /// [%] + public bool EvaluateVolume; /// true = evaluate also the volume, false = evaluate only energy + public float TempWarmLo; /// Low limit for warm temperature [°C] + public float TempWarmHi; /// High limit for warm temperature [°C] + public float TempColdLo; /// Low limit for cold temperature [°C] + public float TempColdHi; /// High limit for cold temperature [°C] + public bool FlowMeasuredAtHiTempPipe; /// true = flow measured at high temp. pipe, false = flow measured at low temp. pipe + public float DeltaTempWarm; + public float DeltaTempCold; + public float ChangeInTimeWarm; + public float ChangeInTimeCold; + public string Prompt; + + public override void InitializeAll() + { + FlowMeasuredAtHiTempPipe = false; + } + + + string[] paramNames = new string[] + { + Strings.Err_limit_neg_pct_chdr, + Strings.Err_limit_pos_pct_chdr, + Strings.Evaluate_volume, + "T hi min", + "T hi max", + "T lo min", + "T lo max", + "Flow measured at high temp.pipe", + "Delta T warm", + "Delta T cold", + "Change in time T warm", + "Change in time T cold", + Strings.Prompt, + }; + public override string ParamName(int i) { return paramNames[i]; } + public override int ParamsCount() { return paramNames.Length; } + + public override string ToString(int i) + { + switch (i) + { + case 0: return ErrorLimitLo.ToString(); + case 1: return ErrorLimitHi.ToString(); + case 2: return (EvaluateVolume ? Strings.yes : Strings.no); + case 3: return TempWarmLo.ToString(); + case 4: return TempWarmHi.ToString(); + case 5: return TempColdLo.ToString(); + case 6: return TempColdHi.ToString(); + case 7: return (FlowMeasuredAtHiTempPipe ? Strings.yes : Strings.no); + case 8: return DeltaTempWarm.ToString(); + case 9: return DeltaTempCold.ToString(); + case 10: return ChangeInTimeWarm.ToString(); + case 11: return ChangeInTimeCold.ToString(); + case 12: return Prompt; + default: return string.Empty; + } + } + + public CfgUpdateFlags UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: ErrorLimitLo = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 1: ErrorLimitHi = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 2: EvaluateVolume = strValue.Equals(Strings.yes); return CfgUpdateFlags.None; + case 3: TempWarmLo = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 4: TempWarmHi = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 5: TempColdLo = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 6: TempColdHi = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 7: FlowMeasuredAtHiTempPipe = strValue.Equals(Strings.yes); return CfgUpdateFlags.None; + case 8: DeltaTempWarm = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 9: DeltaTempCold = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 10: ChangeInTimeWarm = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 11: ChangeInTimeCold = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 12: Prompt = strValue; return CfgUpdateFlags.None; + default: return CfgUpdateFlags.None; + } + } + + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + float dummy; + + switch (i) + { + case 0: + case 1: + case 3: + case 4: + case 5: + case 6: + if (Utils.TryParseSFloat(strValue, out dummy)) return true; + break; + case 2: + case 7: + if (strValue.Equals(Strings.yes) || strValue.Equals(Strings.no)) return true; + break; + case 8: + case 9: + case 10: + case 11: + if (Utils.TryParseUFloat(strValue, out dummy)) return true; + break; + case 12: + return true; + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(TestParams prms) + { + prms.ErrorLimitLo = ErrorLimitLo; + prms.ErrorLimitHi = ErrorLimitHi; + prms.EvaluateVolume = EvaluateVolume; + prms.TempWarmLo = TempWarmLo; + prms.TempWarmHi = TempWarmHi; + prms.TempColdLo = TempColdLo; + prms.TempColdHi = TempColdHi; + prms.FlowMeasuredAtHiTempPipe = FlowMeasuredAtHiTempPipe; + prms.DeltaTempWarm = DeltaTempWarm; + prms.DeltaTempCold = DeltaTempCold; + prms.ChangeInTimeWarm = ChangeInTimeWarm; + prms.ChangeInTimeCold = ChangeInTimeCold; + prms.Prompt = Prompt; + } + + public IParamsProvider Clone() + { + TestParams pars = new TestParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateFromDbEntity(ComponentTest dbEntity) + { + if (dbEntity == null) return; + try + { + TestParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as TestParams; + + testParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + test = dbEntity.Test; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + /// + /// Parameterless constructor initializes the parameters + /// + public TestParams() + { + } + + public TestParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public TestParams(ComponentTest testParamsEntity, string componentName, Test test) + { + this.testParamsEntity = testParamsEntity; + this.componentName = componentName; + this.test = test; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/Single/Component.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/Single/Component.cs new file mode 100644 index 00000000..2b07bed6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/Single/Component.cs @@ -0,0 +1,37 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; + +namespace TBF.BenchControl.TestMethods.FixedStart.Single +{ + public class Component : ComponentBase, GenericDevices.ITestMethod + { + private static readonly ILog log = LogManager.GetLogger(typeof(Component)); + public override string ToString() + { + return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); + } + + public bool CanTest(MetersKind meters) { return meters == MetersKind.Single; } + public bool DoTransitions() { return true; } + + public Component() + { + } + + public Component(Generic.IComponentCfg cfg) + : base(cfg) + { + log.Debug(this.ToString()); + } + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + return (new FixedStartSeq()).Execute(test, repetNr, isLastRepetition, false, null, DebugLevel); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/Single/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/Single/Factory.cs new file mode 100644 index 00000000..49c62659 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStart/Single/Factory.cs @@ -0,0 +1,27 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; +using TBF.BenchControl.Configs.NameOnly; + +namespace TBF.BenchControl.TestMethods.FixedStart.Single +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Component.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Component(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Component(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this.GetType().Namespace.Substring(29), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartAdvanced/FixedStartAdvancedSeq.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartAdvanced/FixedStartAdvancedSeq.cs new file mode 100644 index 00000000..8b61112c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartAdvanced/FixedStartAdvancedSeq.cs @@ -0,0 +1,645 @@ +/// +/// Copyright (c) 2016-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Text; +using log4net; +using TBF.BenchControl; +using TBF.Boxes; +using TBF.Resources; +using TBF.UiBridge; + +namespace TBF.BenchControl.TestMethods.FixedStartAdvanced +{ + public class FixedStartAdvancedSeq : Sequences.SequenceBase + { + private static readonly ILog log = LogManager.GetLogger(typeof(FixedStartAdvancedSeq)); + + /// + /// Flying start mass collection method sequence + /// + /// Test entity + /// + /// Event.Done . . . . . . . OK + /// Event.UiCmdStop . . . . Stopped by the user using the on-screen button STOP + /// Event.OpArgumentError . Target flow is out of range + /// Event.Error . . . . . . Unspecified error + /// + public IList Execute(Config.Entities.Test test, int repetitionNr, bool isLastRepetition) + { + Elde.ControlBoardDev cBrd = StateMachine.ControlBoard; + + IList e = new List(); /// Events from currently running operations + Event retVal = Event.Done; + checkUiOp = new Operations.CheckUIOp(true); /// Runs in more then one state + + float switchTimeStart = 0.001f; /// in seconds, original vale is 1 ms + float switchTimeEnd = 0.001f; /// in seconds, original vale is 1 ms + + LtrPerRefPulse = outPath.FlowMeter.LtrPerPulse; /// [ltr/pulse], nominal flow in [m3/h] + + /// Notes: + /// float timeHr = volumeLtr / (1000.0f * targetFlow); + /// float timeSec = 3600.0f * timeHr; + /// int refPulses = (int)(timeSec * (2000.0f * targetFlow / pOut.FlowMeter.NominalFlow)); + int totalPulses = (int)(test.Volume / LtrPerRefPulse + 0.5f); + + int rangeIx = 0; /// Default range, used for non-Elde flowmeters + if (outPath.FlowMeter is Elde.FlowMeter.FlowMeter) + { + Elde.FlowMeter.FlowMeter eldeFM = outPath.FlowMeter as Elde.FlowMeter.FlowMeter; + rangeIx = -1; /// Indicates invalid range + for (int r = 0; r <= 5; r++) + { + if (eldeFM.RangeEnabled(r) && eldeFM.GetTempLo(r) <= test.TempLimLo + && eldeFM.GetTempHi(r) >= test.TempLimHi) + { + rangeIx = r; + } + } + + if (rangeIx == -1) + { + Bridge.OnError(this, Strings.Flow_meter_temperature_range_does_not_fit_this_test_conditions); + retVal = Event.UiCmdStop; + goto stopTest; + } + } + + processDataLoggingOp = new TBF.BenchControl.Operations.ProcessDataLoggingOp(processDataLogger, this, false); + + //==================================== + loop: + /// Start the test, initialize test results + Bridge.OnTestSelected(this, new TestSelectedEventArgs(test, repetitionNr, inPath, benchPath, outPath, sensPath, totalPulses)); + string testName = Results.Utils.GetTestName(test.Name, test.Repeats, repetitionNr); + TestStartTime = DateTime.Now; + + + if (!test.DoDraining) + { + /// + /// Measure the weight in case there is no unconditional draining + /// + State.Create("FixedStartAdvanced : Measuring mass of water in the tank") + .AddOperation(checkUiOp) + .AddOperation(outPath.Scale.ReadMassOp(ref Mass)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.BalanceDone)); + } + /// + /// Skip draining in case there is enough room in the tank + /// + if (test.DoDraining || (Mass.Val + test.Volume >= outPath.Scale.Capacity * Constants.TankFullFactor)) + { + /// + /// Drain the water tank + /// + switch (DrainTheTank(outPath.Scale.DrainValve, outPath.Scale)) + { + case Event.Error: { retVal = Event.Error; goto stopTest; } + case Event.UiCmdStop: { retVal = Event.UiCmdStop; goto stopTest; } + } + } + + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Setting_the_flow); + //------------------------------------------------ + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + int flowSetTime0 = StateMachine.Time; + + if (inPath.Pump is GenericDevices.IPumpFM) (inPath.Pump as GenericDevices.IPumpFM).TurnOn(test.PumpPower); + + State.Create("FixedStartAdvanced : Waiting 5 sec") + .AddOperation(checkUiOp) + .AddOperation(new Operations.TimerOp(5)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + + + State.Create("FixedStartAdvanced : Starting the pump") + .AddOperation(checkUiOp) + .AddOperation(cBrd.SetValvesOp(inPath.Pump, null)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.ValvesSet)); + + + set_flow: + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Setting_the_flow); + //------------------------------------------------ + if (inPath.Pump is GenericDevices.IPumpFM) (inPath.Pump as GenericDevices.IPumpFM).TurnOn(test.PumpPower); + State.Create("FixedStartAdvanced : Starting the pump") + .AddOperation(checkUiOp) + .AddOperation(cBrd.SetValvesOp(inPath.Pump, null)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.ValvesSet)); + + //-------------------------------- + State.Create("FixedStartAdvanced : Setting the flow") + .AddOperation(checkUiOp) + .AddOperation(outPath.RegulValve.SetFlowOp(outPath.FlowMeter, test.Qfrom, test.Qto, outPath.PidCoef, RefFlow, 600)) /// timeout = 10 min. + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (e.Contains(Event.OpArgumentError)) { retVal = Event.OpArgumentError; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.RegulValveTimeOut)) + { + Bridge.OnError(this, Strings.Flow_adjustment_failed); + retVal = Event.UiCmdStop; + goto stopTest; + } + if (e.Contains(Event.Next)) goto flow_set; + } + while (!e.Contains(Event.FlowReached)); + + flow_set: + int flowSetTime = StateMachine.Time - flowSetTime0; + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Stopping_flow_for_the_fixed_start); + //------------------------------------------------ + State.Create("FixedStartAdvanced : Closing the start/stop valve before the fixed start test") + .AddOperation(checkUiOp) + .AddOperation(new TBF.BenchControl.Elde.SetValvesOp(cBrd, true, outPath)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } + while (!e.Contains(Event.ValvesSet)); + + + int time = StateMachine.Time; + double currentFlow = RefFlow.Val; + + + /// + /// Prepare cameras, ROI-s and measurementOperations + /// + + /// Find ROI-s + IList rois = new List(); + foreach (var rr in sensPath.RegisterReaders) + { + GenericDevices.IRoi roi = rr as GenericDevices.IRoi; + if (roi != null && roi.Detected) + { + rois.Add(roi); + } + } + + /// Find cameras + IList cameras = new List(); + foreach (var roi in rois) + { + if (roi.Camera != null && !cameras.Contains(roi.Camera)) + { + roi.Camera.ClearRoiParams(); + cameras.Add(roi.Camera); + } + } + + /// Register ROI-parameters to cameras + foreach (var roi in rois) roi.RegisterRoiToCamera(); + + /// Prepare measurementOperations + IList measureOperations = new List(); + foreach (var camera in cameras) measureOperations.Add(camera.MeasurementOp()); + + + + /// + /// Enter watermeter begin states here + /// + GenericDevices.IHasWMStatesForm dataEntryCmpnt = + TbfComponents.FindComponent(StateMachine.Procedure.DataEntry) as GenericDevices.IHasWMStatesForm; + if (dataEntryCmpnt != null) + { + Bridge.OnActivity(this, Strings.Enter_water_meter_data); + State.Create("FixedStartAdvanced : Enter begin-state") + .AddOperation((dataEntryCmpnt as GenericDevices.IHasWMStatesForm).ShowTestStartFormOp(sensPath.RegisterReaders)) + .AddOperation(checkUiOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.ModelessFormClosed)); + + for (int i = 0; i < Config.Data.WMsCount; i++) + { + BenchControl.Elde.FixedStartRegisterReader.RegisterReader registerReader = + sensPath.RegisterReaders[i] as BenchControl.Elde.FixedStartRegisterReader.RegisterReader; + + if (registerReader != null) registerReader.BeginWMState = dataEntryCmpnt.WMStartState(i); + } + } + + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Measuring_the_weight); + //------------------------------------------------ + State.Create("FixedStartAdvanced : Measuring the start mass") + .AddOperation(checkUiOp) + .AddOperations(measureOperations) + .AddOperation(benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation((StateMachine.Ambient != null) + ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) : null) + .AddOperation(outPath.Scale.ReadStableMassOp(ref StartMass, test.MassRepeats, test.MassSpread, test.MassMethod)) + .AddOperation(cBrd.UpdateTankWeightOp()) + .AddOperation(processDataLoggingOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.BalanceDone)); + + TestStartTime = DateTime.Now; + Mass.Val = StartMass.Val; + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Test_in_progress); + //------------------------------------------------ + State.Create("FixedStartAdvanced : Starting the test") + .AddOperation(checkUiOp) + .AddOperations(measureOperations) + .AddOperation(cBrd.StartMeasurementOp(outPath, Elde.TestMethods.Diverter | Elde.TestMethods.Synchro, + test.Qfrom, test.Qto, 2 * totalPulses, (float)test.TolerRed)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.MeasurementStarted)); + + + State.Create("FixedStartAdvanced : Opening the start/stop valve at the beginning of the fixed start test") + .AddOperation(checkUiOp) + .AddOperation(new TBF.BenchControl.Elde.SetValvesOp(cBrd, false, outPath)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } + while (!e.Contains(Event.ValvesSet)); + + + /// Measurement loop - preparation + readRegistersOp = new Operations.ReadMoreRegistersOp(sensPath.RegisterReaders); + queryEnd1 = cBrd.QueryMeasurementEndOp(); + queryEnd2 = cBrd.QueryMeasurementEndOp(); + + StartNewStatistics(StateMachine.Time, BatchRslts.Batch.BatchNr, test.Name, repetitionNr); + int estimtdEndTime = StateMachine.Time + (int)test.TstTime; + + /// Measurement loop - begin + do + { + //-------------------------------- + switch (ReadRegistersTempPressAmbient(measureOperations, true)) + { + case Event.Error: + retVal = Event.Error; + goto stopTest; + + case Event.UiCmdStop: + retVal = Event.UiCmdStop; + goto stopTest; + + case Event.MeasurementCompleted: + goto test_completed; + } + + int remainingTime = Math.Max(estimtdEndTime - StateMachine.Time, 0); + if (remainingTime > 60) + { + Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", Strings.Test_in_progress, remainingTime / 60, "min", remainingTime % 60, Strings.sec)); + } + else + { + Bridge.OnActivity(this, string.Format("{0} ... {1} s", Strings.Test_in_progress, remainingTime)); + } + + RefFreq.Val = cBrd.ReferenceFreq; + RefFlow.Val = cBrd.ReferenceFlow; + UpdateAllStatistics(StateMachine.Time); + + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + } + while (cBrd.EtPulses(0) < totalPulses); + /// Measurement loop - end + + test_completed: + + StopRecordingStatistics(); + + State.Create("FixedStartAdvanced : Closing the start/stop valve at the end of the fixed start test") + .AddOperation(checkUiOp) + .AddOperation(new TBF.BenchControl.Elde.SetValvesOp(cBrd, true, outPath)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } + while (e.Contains(Event.ValvesBusy)); + + + State.Create("FixedStartAdvanced : Waiting before 2nd mass measurement") + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation((StateMachine.Ambient != null) + ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) : null) + .AddOperation(outPath.Scale.ReadMassOp(ref Mass)) + .AddOperation(cBrd.UpdateTankWeightOp()) + .AddOperation(processDataLoggingOp) + .AddOperation(new Operations.TimerOp(test.TimeStop2Mass)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Measuring_the_weight); + //------------------------------------------------ + State.Create("FixedStartAdvanced : Measuring the end mass") + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation((StateMachine.Ambient != null) + ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) : null) + .AddOperation(outPath.Scale.ReadStableMassOp(ref EndMass, test.MassRepeats, test.MassSpread, test.MassMethod)) + .AddOperation(cBrd.UpdateTankWeightOp()) + .AddOperation(processDataLoggingOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.BalanceDone)); + /// + TestEndTime = DateTime.Now; + + + State.Create("FixedStartAdvanced : Stopping diverter, gate, etc.") + .AddOperation(checkUiOp) + .AddOperation(cBrd.StopPreviousOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.PreviousStopped)); + + + double massStart = Config.Formulas.CorrectedValue(StartMass.Val, outPath.Scale.Corrections); + double massEnd = Config.Formulas.CorrectedValue(EndMass.Val, outPath.Scale.Corrections); + double densityOut = Config.Formulas.WaterDensityFromTemp(TempDownStat.Average, Program.LocalSettings.RealDensity, Program.LocalSettings.AtTemperature); + double buoyancy = Config.Formulas.Buoyancy(); + double volumeCTV = 1000.0 * buoyancy * (massEnd - massStart) / densityOut; + + /// + /// Enter watermeter end states here + /// + if (dataEntryCmpnt != null) + { + Bridge.OnActivity(this, Strings.Enter_water_meter_data); + State.Create("FixedStartAdvanced : Enter end-state") + .AddOperation(dataEntryCmpnt.ShowTestEndFormOp(sensPath.RegisterReaders, + volumeCTV, + test.ErrLimLo + test.Uncertainty, + test.ErrLimHi - test.Uncertainty)) + .AddOperation(checkUiOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.ModelessFormClosed)); + + + for (int i = 0; i < Config.Data.WMsCount; i++) + { + BenchControl.Elde.FixedStartRegisterReader.RegisterReader registerReader = + sensPath.RegisterReaders[i] as BenchControl.Elde.FixedStartRegisterReader.RegisterReader; + + if (registerReader != null) registerReader.EndWMState = dataEntryCmpnt.WMEndState(i); + } + } + + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Test_completed); + //------------------------------------------------ + + /// Make sure the CycleBeginForm is closed so that water meter data (s/n) can be copied into results + if (UIFlowControl.Stop == WaitBeginFormClosed()) goto stopTest; + + /// + /// Populate TestResult data entity with data + /// + Results.Entities.TestRslt tstRslt = BatchRslts.GetTestRslt(testName, test.Part); + + if (tstRslt != null) + { + UpdateTempPressDensAmb(tstRslt); + + /// Main results + tstRslt.MethodClass = TbfComponents.FindComponent(test.Method).ClassName; + tstRslt.StartTime = TestStartTime; + tstRslt.EndTime = TestEndTime; + tstRslt.FlowSetTime = flowSetTime; + tstRslt.TestTime = cBrd.TTime; /// [s] measurement time + tstRslt.PulsesMaster = Convert.ToDouble(cBrd.EtPulses(0)); /// Pulses of the master flow meter (test total) + tstRslt.MassStartRaw = StartMass.Val; + tstRslt.MassStart = massStart; /// [kg] calculated before displaying 'End state' dialog + tstRslt.MassEndRaw = EndMass.Val; + tstRslt.MassEnd = massEnd; /// [kg] calculated before displaying 'End state' dialog + tstRslt.FlowMass = 3600.0 * (tstRslt.MassEnd - tstRslt.MassStart) / tstRslt.TestTime; /// [kg/h] + tstRslt.FlowVolume = 3.6 * LtrPerRefPulse * tstRslt.PulsesMaster / tstRslt.TestTime; + tstRslt.Buoyancy = buoyancy; + tstRslt.VolumeCTV = volumeCTV; /// [kg] calculated before displaying 'End state' dialog + tstRslt.VolumeMaster = LtrPerRefPulse * tstRslt.PulsesMaster; /// [l] volume from the master flow meter + tstRslt.ConstMasterRaw = outPath.FlowMeter.LtrPerPulse; /// Uncorrected master flowmeter coefficient + tstRslt.ConstMasterCorr = outPath.FlowMeter.LtrPerPulseCorrected(tstRslt.FlowVolume, rangeIx); /// Corrected master pulses per liter + tstRslt.ConstMaster = (tstRslt.VolumeMaster == 0) ? tstRslt.ConstMasterCorr : (LtrPerRefPulse * tstRslt.VolumeCTV / tstRslt.VolumeMaster); + /// Calculated master pulses per liter + tstRslt.ErrorMaster = Config.Formulas.ErrorFromVolumes(tstRslt.VolumeMaster, tstRslt.VolumeCTV); + + tstRslt.FlowMean = (float)RefFlowStat.Average; + tstRslt.FlowStart = (float)RefFlowStat.First; + tstRslt.FlowEnd = (float)RefFlowStat.Last; + tstRslt.FlowMin = (float)RefFlowStat.Min; + tstRslt.FlowMax = (float)RefFlowStat.Max; + + tstRslt.DiverterStart = switchTimeStart; + tstRslt.DiverterEnd = switchTimeEnd; + tstRslt.ErrorFlagsMd = (ErrorFlagsComp != null) ? (sbyte)ErrorFlagsComp.Mode : (sbyte)0; + tstRslt.ErrorFlags = (ErrorFlagsComp != null) ? ErrorFlagsComp.GetErrorFlags(tstRslt, false, true, switchTimeStart, switchTimeEnd) : 0; + + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (test.Part != 0 && test.Part != Utils.PartNr(i + 1, BatchRslts.Batch.Compound)) continue; + + Results.Entities.MeterTestRslt meterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.Single); + GenericDevices.IRegisterReader regReader = sensPath.RegisterReaders[i]; + + if (meterRslt != null && regReader != null) + { + meterRslt.RegReaderType = (int)regReader.RegisterReaderType; + meterRslt.PulsesPerLiter = 1.0f; + meterRslt.VolumeStart = regReader.BeginWMState; + meterRslt.VolumeEnd = regReader.EndWMState; + meterRslt.VolumeMeter = meterRslt.VolumeEnd - meterRslt.VolumeStart; + meterRslt.VolumeRef = tstRslt.VolumeCTV; /// liter + meterRslt.PulsesMeter = meterRslt.VolumeMeter; + meterRslt.PulsesMaster = tstRslt.PulsesMaster; + meterRslt.TestTime = tstRslt.TestTime; + meterRslt.Error = Config.Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef); + meterRslt.Passed = (meterRslt.Error >= test.GetErrLimLo(tstRslt.FlowMean) + test.Uncertainty) + && (meterRslt.Error <= test.GetErrLimHi(tstRslt.FlowMean) - test.Uncertainty) + && (tstRslt.ErrorFlags == 0 || tstRslt.ErrorFlagsMode() != Config.Entities.ErrorFlagsMode.On); + meterRslt.TestDone = true; + tstRslt.TestDone = true; + } + } + + tstRslt.Components = Results.Entities.Components + .UpdateList(BatchRslts.ComponentsList, + new Results.Entities.Components((BenchInfo != null) ? BenchInfo.TestBenchId : 1, + (BenchInfo != null) ? BenchInfo.TestBenchName : "testbench", + inPath.Pump != null ? inPath.Pump.Name : string.Empty, + outPath.FlowMeter != null ? outPath.FlowMeter.Name : string.Empty, + outPath.Scale != null ? outPath.Scale.Name : string.Empty, + outPath.RegulValve != null ? outPath.RegulValve.Name : string.Empty, + outPath.Diverter != null ? outPath.Diverter.Name : string.Empty)); + + /// Update water meter error flags + if (ErrorFlagsComp != null) + { + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (BatchRslts.WaterMeters[i] != null) + { + BatchRslts.WaterMeters[i].ErrorFlags = ErrorFlagsComp.GetWMtrErrorFlags(BatchRslts.WaterMeters[i].MeterTestRslts); + } + } + } + + /// Update results + Bridge.OnTestCompleted(this, new TestCompletedEventArgs(testName, tstRslt)); + } + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.TransitionAfter)); + + /// Append the results to the CSV-file + allResults.Info(TestResult2CsvLine(testName, test.Part)); + + + stopTest: + + StopRecordingStatistics(); + + /// + /// Quit this sequence + /// + if (isLastRepetition || retVal == Event.UiCmdStop || retVal == Event.OpArgumentError + || retVal == Event.Error || retVal == Event.ConfigurationError) + { + State.Create("FixedStartAdvanced : Stopping diverter, gate, etc.") + .AddOperation(checkUiOp) + .AddOperation(cBrd.StopPreviousOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.PreviousStopped)); + } + + /// Create a list with one item 'retVal' (default is Event.Done) and return it + IList retList = new List(1); + retList.Add(retVal); + return retList; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartAdvanced/Single/Component.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartAdvanced/Single/Component.cs new file mode 100644 index 00000000..ca908d37 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartAdvanced/Single/Component.cs @@ -0,0 +1,35 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; +using TBF.BenchControl; + +namespace TBF.BenchControl.TestMethods.FixedStartAdvanced.Single +{ + public class Component : ComponentBase, GenericDevices.ITestMethod + { + private static readonly ILog log = LogManager.GetLogger(typeof(Component)); + public override string ToString() { return string.Format("TestMethods.FixedStartAdvanced({0})", Cfg.ToString(1)); } + + public bool CanTest(MetersKind meters) { return meters == MetersKind.Single; } + public bool DoTransitions() { return true; } + + public Component() + { + } + + public Component(Generic.IComponentCfg cfg) + : base(cfg) + { + log.Debug(this.ToString()); + } + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + return (new FixedStartAdvancedSeq()).Execute(test, repetNr, isLastRepetition); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartAdvanced/Single/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartAdvanced/Single/Factory.cs new file mode 100644 index 00000000..f02b6157 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartAdvanced/Single/Factory.cs @@ -0,0 +1,27 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; +using TBF.BenchControl.Configs.NameOnly; + +namespace TBF.BenchControl.TestMethods.FixedStartAdvanced.Single +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Component.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Component(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Component(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this.GetType().Namespace.Substring(29), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/Compound/Component.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/Compound/Component.cs new file mode 100644 index 00000000..6f59ee66 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/Compound/Component.cs @@ -0,0 +1,46 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; + +namespace TBF.BenchControl.TestMethods.FixedStartDeferredEvaluation.Compound +{ + public class Component : ComponentBase, GenericDevices.ITestMethodWith2ndPass + { + private static readonly ILog log = LogManager.GetLogger(typeof(Component)); + public override string ToString() + { + return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); + } + + public bool CanTest(MetersKind meters) { return meters == MetersKind.Combined; } + public bool DoTransitions() { return true; } + + public Component() + { + } + + public Component(Generic.IComponentCfg cfg) + : base(cfg) + { + log.Debug(this.ToString()); + } + + + private IntermediateData intermediateData; + public object IntermediateData { get { return intermediateData; } } + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + return (new FixedStartDeferredEvaluationSeq()).Execute(test, repetNr, isLastRepetition, true, null, DebugLevel, out intermediateData); + } + + public IList Execute2ndPass(Test test, int repetNr, object data) + { + return (new FixedStartDeferredEvaluationSeq()).Execute2ndPass(test, repetNr, data as IntermediateData); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/Compound/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/Compound/Factory.cs new file mode 100644 index 00000000..71cb5c32 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/Compound/Factory.cs @@ -0,0 +1,27 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; +using TBF.BenchControl.Configs.NameOnly; + +namespace TBF.BenchControl.TestMethods.FixedStartDeferredEvaluation.Compound +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Component.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Component(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Component(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this.GetType().Namespace.Substring(29), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/FixedStartDeferredEvaluationSeq.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/FixedStartDeferredEvaluationSeq.cs new file mode 100644 index 00000000..fe021259 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/FixedStartDeferredEvaluationSeq.cs @@ -0,0 +1,1203 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using log4net; +using TBF.BenchControl; +using TBF.Boxes; +using TBF.Resources; +using TBF.UiBridge; + +namespace TBF.BenchControl.TestMethods.FixedStartDeferredEvaluation +{ + public class FixedStartDeferredEvaluationSeq : Sequences.SequenceBase + { + private static readonly ILog log = LogManager.GetLogger(typeof(FixedStartDeferredEvaluationSeq)); + + /// + /// Fixed start mass collection method with deferred evaluation of images + /// + /// Test entity + /// + /// Event.Done . . . . . . . OK + /// Event.MakeSecondPass . . OK, 2nd pass (=evaluation) required + /// Event.UiCmdStop . . . . Stopped by the user using the on-screen button STOP + /// Event.OpArgumentError . Target flow is out of range + /// Event.Error . . . . . . Unspecified error + /// + public IList Execute(Config.Entities.Test test, int repetitionNr, bool isLastRepetition, + bool compound, + HeatMeters.TestParams heatMetersTestParams, + Config.Entities.DebugMode debugLevel, + out IntermediateData intermediateData) + { + Elde.ControlBoardDev cBrd = StateMachine.ControlBoard; + + IList e = new List(); /// Events from currently running operations + Event retVal = Event.Done; + + checkUiOp = new Operations.CheckUIOp(true); /// Runs in more then one state + + intermediateData = new IntermediateData + { + Compound = compound, + TestName = Results.Utils.GetTestName(test.Name, test.Repeats, repetitionNr), + TestPart = test.Part, + }; + + GenericDevices.IHasWMStatesForm dataEntryCmpnt = TbfComponents.FindComponent(StateMachine.Procedure.DataEntry) as GenericDevices.IHasWMStatesForm; + if (!(dataEntryCmpnt is GenericDevices.IDataEntryForCamera)) + { + Bridge.OnError(this, "Wrong DataEntry component"); + e.Add(Event.ConfigurationError); + return e; + } + + + float switchTimeStart = 0.001f; /// in seconds, original vale is 1 ms + float switchTimeEnd = 0.001f; /// in seconds, original vale is 1 ms + + LtrPerRefPulse = outPath.FlowMeter.LtrPerPulse; /// [ltr/pulse], nominal flow in [m3/h] + + /// Notes: + /// float timeHr = volumeLtr / (1000.0f * targetFlow); + /// float timeSec = 3600.0f * timeHr; + /// int refPulses = (int)(timeSec * (2000.0f * targetFlow / pOut.FlowMeter.NominalFlow)); + int totalPulses = (int)(test.Volume / LtrPerRefPulse + 0.5f); + + int rangeIx = 0; /// Default range, used for non-Elde flowmeters + if (outPath.FlowMeter is Elde.FlowMeter.FlowMeter) + { + Elde.FlowMeter.FlowMeter eldeFM = outPath.FlowMeter as Elde.FlowMeter.FlowMeter; + rangeIx = -1; /// Indicates invalid range + for (int r = 0; r <= 5; r++) + { + if (eldeFM.RangeEnabled(r) && eldeFM.GetTempLo(r) <= test.TempLimLo + && eldeFM.GetTempHi(r) >= test.TempLimHi) + { + rangeIx = r; + } + } + + if (rangeIx == -1) + { + Bridge.OnError(this, Strings.Flow_meter_temperature_range_does_not_fit_this_test_conditions); + retVal = Event.UiCmdStop; + goto stopTestWOTransitionAfter; + } + } + + processDataLoggingOp = new TBF.BenchControl.Operations.ProcessDataLoggingOp(processDataLogger, this, heatMetersTestParams != null); + + + if (test.Volume >= outPath.Scale.Capacity * Constants.TankFullFactor) + { + Bridge.OnError(this, Strings.Test_volume_exceeds_the_scale_capacity); + e.Add(Event.ConfigurationError); + return e; + } + + //==================================== + loop: + /// Start the test, initialize test results + Bridge.OnTestSelected(this, new TestSelectedEventArgs(test, repetitionNr, inPath, benchPath, outPath, sensPath, totalPulses)); + string testName = Results.Utils.GetTestName(test.Name, test.Repeats, repetitionNr); + + /// + /// Optionally display prompt to emerge temperature meters to appropriate baths for heat meters test + /// + IOperation heatMetersPromptOp = null; + if (heatMetersTestParams != null && !string.IsNullOrEmpty(heatMetersTestParams.Prompt)) + { + /// Make sure the CycleBeginForm is closed + if (UIFlowControl.Stop == WaitBeginFormClosed()) goto stopTest; + + heatMetersPromptOp = new Operations.MessageBoxOp(heatMetersTestParams.Prompt); + } + + + + if (!test.DoDraining) + { + /// + /// Measure the weight in case there is no unconditional draining + /// + State.Create(string.Format("{0}({1}) : Measuring mass of water in the tank", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(outPath.Scale.ReadMassOp(ref Mass)) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.JustStarted)); + + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.BalanceDone)); + } + /// + /// Skip draining in case there is enough room in the tank + /// + if (test.DoDraining || (Mass.Val + test.Volume >= outPath.Scale.Capacity * Constants.TankFullFactor)) + { + /// + /// Drain the water tank + /// + switch (DrainTheTank(outPath.Scale.DrainValve, outPath.Scale, heatMetersPromptOp)) + { + case Event.Error: { retVal = Event.Error; goto stopTest; } + case Event.UiCmdStop: { retVal = Event.UiCmdStop; goto stopTest; } + } + } + /// + /// Make sure the drain valve is closed + /// + State.Create(string.Format("{0}({1}) : Make sure the drain valve is closed", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(outPath.Scale.ReadMassOp(ref Mass)) + .AddOperation(heatMetersPromptOp) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(null, outPath.Scale.DrainValve)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.JustStarted)); + + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.ValvesSet) || !e.Contains(Event.BalanceDone)); + + + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Starting_the_pump); + //------------------------------------------------ + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + int flowSetTime0 = StateMachine.Time; + + if (inPath.Pump is GenericDevices.IPumpFM) (inPath.Pump as GenericDevices.IPumpFM).TurnOn(test.PumpPower); + /// + State.Create(string.Format("{0}({1}) : Starting the pump", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) +// .AddOperation(new Operations.SetAllRegulValvesOp(inPath.RegulValves, inPath.RegulValvesPct, 60)) + .AddOperation(heatMetersPromptOp) + .AddOperation(inPath.Pump != null ? cBrd.SetValvesOp(inPath.Pump, null) : null) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + + } + while (e.Contains(Event.ValvesBusy) /* || !e.Contains(Event.AllPositionsReached)*/); + + + if (test.TimePump2StartV > 0) + { + State.Create(string.Format("{0}({1}) : Waiting after the pump started", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(new Operations.TimerOp(test.TimePump2StartV)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + } + + + if (benchPath.StopBFValve != null) + { + State.Create(string.Format("{0}({1}) : Opening the stop backflow valve", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(benchPath.StopBFValve, null)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } + while (!e.Contains(Event.ValvesSet)); + } + + + if (test.TimeBeforeFlow > 0) + { + State.Create(string.Format("{0}({1}) : Waiting before flow setting process starts", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(new Operations.TimerOp(test.TimeBeforeFlow)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + } + + + setting_flow: + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Setting_the_flow); + //------------------------------------------------ + if (inPath.Pump is GenericDevices.IPumpFM) + { + (inPath.Pump as GenericDevices.IPumpFM).TurnOn(test.PumpPower); + } + /// + State.Create(string.Format("{0}({1}) : Pump on", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(inPath.Pump, null)) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (e.Contains(Event.ValvesBusy)); + /// + State.Create(string.Format("{0}({1}) : Start valve open", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(new TBF.BenchControl.Elde.SetValvesOp(cBrd, false, outPath)) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (e.Contains(Event.ValvesBusy)); + + + //-------------------------------- + State.Create(string.Format("{0}({1}) : Setting the flow", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(outPath.RegulValve.SetFlowOp(outPath.FlowMeter, test.Qfrom, test.Qto, outPath.PidCoef, RefFlow, 600)) /// timeout = 10 min. + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (e.Contains(Event.OpArgumentError)) { retVal = Event.OpArgumentError; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.RegulValveTimeOut)) + { + Bridge.OnError(this, Strings.Flow_adjustment_failed); + retVal = Event.UiCmdStop; + goto stopTest; + } + if (e.Contains(Event.Next)) goto flow_set; + } + while (!e.Contains(Event.FlowReached)); + + flow_set: + + int flowSetTime = StateMachine.Time - flowSetTime0; + + if (heatMetersTestParams != null && heatMetersPath != null) + { + //--------------------------------------------------- + Bridge.OnActivity(this, Strings.Setting_temperature); + //--------------------------------------------------- + + int lastTimeSec = StateMachine.Time; + double Tw_last = 0; + double Tc_last = 0; + + State.Create(string.Format("{0}({1}) : Checking if the temperature is stable", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Next)) goto temperature_set; + + if (TempRefHi1.Val != 0 && TempRefHi2.Val != 0 && TempRefLo1.Val != 0 && TempRefLo2.Val != 0) + { + if (StateMachine.Time - lastTimeSec > 10 || StateMachine.Time - lastTimeSec < 0) + { + double Tw = (TempRefHi1.Val + TempRefHi2.Val) / 2; + double Tc = (TempRefLo1.Val + TempRefLo2.Val) / 2; + if (heatMetersTestParams.TempWarmLo <= Tw && Tw <= heatMetersTestParams.TempWarmHi && + heatMetersTestParams.TempColdLo <= Tc && Tc <= heatMetersTestParams.TempColdHi && + Math.Abs(Tw - Tw_last) <= heatMetersTestParams.ChangeInTimeWarm && + Math.Abs(Tc - Tc_last) <= heatMetersTestParams.ChangeInTimeCold && + Math.Abs(TempRefHi1.Val - TempRefHi2.Val) <= heatMetersTestParams.DeltaTempWarm && + Math.Abs(TempRefLo1.Val - TempRefLo2.Val) <= heatMetersTestParams.DeltaTempCold) + { + goto temperature_set; + } + + lastTimeSec = StateMachine.Time; + Tw_last = Tw; + Tc_last = Tc; + } + } + } + while (true); + } + else if (test.DoControlWaterTemp && benchPath.TempMtrUp != null && benchPath.TempMtrDown != null) + { + //--------------------------------------------------- + Bridge.OnActivity(this, Strings.Setting_temperature); + //--------------------------------------------------- + + State.Create(string.Format("{0}({1}) : Wait until the water temperature is within limits", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Next)) goto temperature_set; + + if (TempUp.Val >= test.TempLimLo && TempUp.Val <= test.TempLimHi && + TempDown.Val >= test.TempLimLo && TempDown.Val <= test.TempLimHi) + { + goto temperature_set; + } + } + while (true); + } + + temperature_set: + + //----------------------------------------------------------------- + Bridge.OnActivity(this, Strings.Stopping_flow_for_the_fixed_start); + //----------------------------------------------------------------- + State.Create(string.Format("{0}({1}) : Closing the start/stop valve before the fixed start test", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(new TBF.BenchControl.Elde.SetValvesOp(cBrd, true, outPath)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } + while (!e.Contains(Event.ValvesSet)); + + + int time = StateMachine.Time; + double currentFlow = RefFlow.Val; + + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Measuring_the_weight); + //------------------------------------------------ + + if (test.TimeFlow2Mass > 0) + { + State.Create(string.Format("{0}({1}) : Waiting before 1st mass measurement", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation(cBrd.UpdateTankWeightOp()) + .AddOperation(new Operations.TimerOp(test.TimeFlow2Mass)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + } + + + TestStartTime = DateTime.Now; + LogProcessDataTestInfo(processDataLogger, test.Procedure.Name, test.Name); + + if (heatMetersPath == null) LogProcessDataHeader(processDataLogger, "Start mass"); + else LogProcessDataHeaderHeatMeters(processDataLogger, "Start mass"); + + State.Create(string.Format("{0}({1}) : Measuring the start mass", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation((StateMachine.Ambient != null) + ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) : null) + .AddOperation(outPath.Scale.ReadStableMassOp(ref StartMass, test.MassRepeats, test.MassSpread, test.MassMethod)) + .AddOperation(cBrd.UpdateTankWeightOp()) + .AddOperation(processDataLoggingOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.BalanceDone)); + + Mass.Val = StartMass.Val; + + + /// + /// Grab start images + /// + string fileName = string.Format("{0}-start.bmp", test.Name); + string[] startImages = new string[sensPath.RegisterReaders.Length]; + /// + if (debugLevel != Config.Entities.DebugMode.Simulate) + { + State state2 = State.Create(string.Format("{0}({1}) : Grabbing images", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)); + for (int i = 0; i < sensPath.RegisterReaders.Length; i++) + { + GenericDevices.IRoiForFixedStart roi = sensPath.RegisterReaders[i] as GenericDevices.IRoiForFixedStart; + if (roi != null) + { + string directory = Path.Combine(Program.TempImagesDir, BatchRslts.Batch.BatchNr.ToString(), (i + 1).ToString()); + Directory.CreateDirectory(directory); + startImages[i] = Path.Combine(directory, fileName); + state2.AddOperation(roi.GrabImageOp(startImages[i])); + } + } + state2.EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + + if (e.Contains(Event.Error)) { retVal = Event.Error; break; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; break; } + } + while (e.Contains(Event.CameraBusy)); + + intermediateData.StartImages = startImages; + + if ((dataEntryCmpnt is GenericDevices.IDataEntryForCamera) && (dataEntryCmpnt as GenericDevices.IDataEntryForCamera).SaveImages) + { + /// SaveImages==true ... copy images to the directory that will be archived at the end of the cycle + for (int i = 0; i < sensPath.RegisterReaders.Length; i++) + { + GenericDevices.IRoiForFixedStart roi = sensPath.RegisterReaders[i] as GenericDevices.IRoiForFixedStart; + if (roi != null) + { + string srcDir = Path.Combine(Program.TempImagesDir, BatchRslts.Batch.BatchNr.ToString(), (i + 1).ToString()); + string destDir = Path.Combine(Program.ImagesDir, BatchRslts.Batch.BatchNr.ToString(), (i + 1).ToString()); + try + { + if (File.Exists(Path.Combine(srcDir, fileName))) + { + Directory.CreateDirectory(destDir); + File.Copy(Path.Combine(srcDir, fileName), Path.Combine(destDir, fileName), true); + } + } + catch (Exception exc) + { + log.ErrorFormat("Failed to copy image {0} to {1}: {2}", fileName, destDir, exc.Message); + } + } + } + } + } + else + { + for (int i = 0; i < sensPath.RegisterReaders.Length; i++) + { + GenericDevices.IRoiForFixedStart roi = sensPath.RegisterReaders[i] as GenericDevices.IRoiForFixedStart; + if (roi != null) + { + string directory = Path.Combine(Program.TempImagesDir, BatchRslts.Batch.BatchNr.ToString(), (i + 1).ToString()); + Directory.CreateDirectory(directory); + startImages[i] = Path.Combine(directory, fileName); + File.Copy(string.Format("C:\\TBF\\SampleImages\\{0}", fileName), startImages[i], true); + } + } + } + intermediateData.StartImages = startImages; + /// + if ((dataEntryCmpnt is GenericDevices.IDataEntryForCamera) && (dataEntryCmpnt as GenericDevices.IDataEntryForCamera).SaveImages) + { + /// SaveImages==true ... copy images to the directory that will be archived at the end of the cycle + for (int i = 0; i < sensPath.RegisterReaders.Length; i++) + { + GenericDevices.IRoiForFixedStart roi = sensPath.RegisterReaders[i] as GenericDevices.IRoiForFixedStart; + if (roi != null) + { + string srcDir = Path.Combine(Program.TempImagesDir, BatchRslts.Batch.BatchNr.ToString(), (i + 1).ToString()); + string destDir = Path.Combine(Program.ImagesDir, BatchRslts.Batch.BatchNr.ToString(), (i + 1).ToString()); + try + { + if (File.Exists(Path.Combine(srcDir, fileName))) + { + Directory.CreateDirectory(destDir); + File.Copy(Path.Combine(srcDir, fileName), Path.Combine(destDir, fileName), true); + } + } + catch (Exception exc) + { + log.ErrorFormat("Failed to copy image {0} to {1}: {2}", fileName, destDir, exc.Message); + } + } + } + } + + + if (heatMetersPath == null) LogProcessDataHeader(processDataLogger, "Measurement"); + else LogProcessDataHeaderHeatMeters(processDataLogger, "Measurement"); + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Test_in_progress); + //------------------------------------------------ + State.Create(string.Format("{0}({1}) : Starting the test", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation(cBrd.StartMeasurementOp(outPath, Elde.TestMethods.Diverter | Elde.TestMethods.Synchro, + test.Qfrom, test.Qto, 2 * totalPulses, (float)test.TolerRed)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.MeasurementStarted)); + + StartTime = (double)StateMachine.Time; + + State.Create(string.Format("{0}({1}) : Opening the start/stop valve at the beginning of the fixed start test", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation(new TBF.BenchControl.Elde.SetValvesOp(cBrd, false, outPath)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } + while (!e.Contains(Event.ValvesSet)); + + switchTimeStart = 0.001f * cBrd.ValveOpenCloseTime; + log.WarnFormat("Start valve switch time on test start = {0} ms", cBrd.ValveOpenCloseTime); + + /// Measurement loop - preparation + readRegistersOp = new Operations.ReadMoreRegistersOp(sensPath.RegisterReaders); + queryEnd1 = cBrd.QueryMeasurementEndOp(); + queryEnd2 = cBrd.QueryMeasurementEndOp(); + + StartNewStatistics(StateMachine.Time, BatchRslts.Batch.BatchNr, test.Name, repetitionNr); + int estimtdEndTime = StateMachine.Time + (int)test.TstTime; + + /// Measurement loop - begin + do + { + //-------------------------------- + switch (ReadRegistersTempPressAmbient(null, true)) + { + case Event.Error: + retVal = Event.Error; + goto stopTest; + + case Event.UiCmdStop: + retVal = Event.UiCmdStop; + goto stopTest; + + case Event.MeasurementCompleted: + goto test_completed; + } + + int remainingTime = Math.Max(estimtdEndTime - StateMachine.Time, 0); + if (remainingTime > 60) + { + Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", Strings.Test_in_progress, remainingTime / 60, "min", remainingTime % 60, Strings.sec)); + } + else + { + Bridge.OnActivity(this, string.Format("{0} ... {1} s", Strings.Test_in_progress, remainingTime)); + } + + RefFreq.Val = cBrd.ReferenceFreq; + RefFlow.Val = cBrd.ReferenceFlow; + + UpdateAllStatistics(StateMachine.Time); + + if (heatMetersTestParams != null) + { + if (lastEnergyUpdateTime == 0) + { + lastEnergyUpdateTime = StateMachine.Time; + } + else + { + //double deltaTime = (double)(StateMachine.Time - lastEnergyUpdateTime); + double T_in = (TempRefHi1.Val + TempRefHi2.Val) / 2; /// [°C] + double T_out = (TempRefLo1.Val + TempRefLo2.Val) / 2; /// [°C] + double deltaVolume = LtrPerRefPulse * RefPulsesDelta; /// [l] + double deltaEnergy = (0.001 * deltaVolume) * (T_in - T_out) * Config.Formulas.HeatCoefficientWater(16, T_in, T_out, heatMetersTestParams.FlowMeasuredAtHiTempPipe); /// [J] = [m3] * [K] * [J/(m3 K)] + Energy.Update(deltaEnergy); + VolumeForEnergy.Update(deltaVolume); + lastEnergyUpdateTime = StateMachine.Time; + } + } + + if (compound) + { + /// TODO: Reimplement for combined meters + //for (int i = 0; i < Config.Data.CompoundWMsCount; i++) + //{ + // data.TestResult.CombinedMeters[i].VolumeMeter = data.TestResult.Meters[2 * i].VolumeMeter + // + data.TestResult.Meters[2 * i + 1].VolumeMeter; + // if (data.Volume.Valid) + // { + // data.TestResult.CombinedMeters[i].VolumeErrorPct = + // Formulas.ErrorFromVolumes(data.TestResult.CombinedMeters[i].VolumeMeter, data.Volume.Val); + // } + //} + } + + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + } + while (cBrd.EtPulses(0) < totalPulses); + /// Measurement loop - end + + test_completed: + + StopRecordingStatistics(); + + EndTime = (double)StateMachine.Time; + + State.Create(string.Format("{0}({1}) : Closing the start/stop valve at the end of the fixed start test", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation(new TBF.BenchControl.Elde.SetValvesOp(cBrd, true, outPath)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } + while (e.Contains(Event.ValvesBusy)); + + switchTimeEnd = 0.001f * cBrd.ValveOpenCloseTime; + log.WarnFormat("Start valve switch time on test end = {0} ms", cBrd.ValveOpenCloseTime); + + State.Create(string.Format("{0}({1}) : Waiting before 2nd mass measurement", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation((StateMachine.Ambient != null) + ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) : null) + .AddOperation(outPath.Scale.ReadMassOp(ref Mass)) + .AddOperation(cBrd.UpdateTankWeightOp()) + .AddOperation(processDataLoggingOp) + .AddOperation(new Operations.TimerOp(test.TimeStop2Mass)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + + + if (heatMetersPath == null) LogProcessDataHeader(processDataLogger, "End mass"); + else LogProcessDataHeaderHeatMeters(processDataLogger, "End mass"); + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Measuring_the_weight); + //------------------------------------------------ + State.Create(string.Format("{0}({1}) : Measuring the end mass", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation((StateMachine.Ambient != null) + ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) : null) + .AddOperation(outPath.Scale.ReadStableMassOp(ref EndMass, test.MassRepeats, test.MassSpread, test.MassMethod)) + .AddOperation(cBrd.UpdateTankWeightOp()) + .AddOperation(processDataLoggingOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.BalanceDone)); + /// + TestEndTime = DateTime.Now; + + + State.Create(string.Format("{0}({1}) : Stopping diverter, gate, etc.", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(cBrd.StopPreviousOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.PreviousStopped)); + + + double massStart = Config.Formulas.CorrectedValue(StartMass.Val, outPath.Scale.Corrections); + double massEnd = Config.Formulas.CorrectedValue(EndMass.Val, outPath.Scale.Corrections); + double densityOut = Config.Formulas.WaterDensityFromTemp(TempDownStat.Average, Program.LocalSettings.RealDensity, Program.LocalSettings.AtTemperature); /// [kg/m3] + double buoyancy = Config.Formulas.Buoyancy(); + + double volumeCTV = 1000.0 * buoyancy * (massEnd - massStart) / densityOut; + if (debugLevel == Config.Entities.DebugMode.Simulate) volumeCTV = test.Volume; + + double refEnergy = Energy.Sum * volumeCTV / VolumeForEnergy.Sum; /// [J]=[J]*[l]/[l] + + /// + /// Grab END images + /// + fileName = string.Format("{0}-end.bmp", test.Name); + string[] endImages = new string[sensPath.RegisterReaders.Length]; + /// + if (debugLevel != Config.Entities.DebugMode.Simulate) + { + + State state2 = State.Create(string.Format("{0}({1}) : Grabbing images", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)); + for (int i = 0; i < sensPath.RegisterReaders.Length; i++) + { + GenericDevices.IRoiForFixedStart roi = sensPath.RegisterReaders[i] as GenericDevices.IRoiForFixedStart; + if (roi != null) + { + string directory = Path.Combine(Program.TempImagesDir, BatchRslts.Batch.BatchNr.ToString(), (i + 1).ToString()); + Directory.CreateDirectory(directory); + endImages[i] = Path.Combine(directory, fileName); + state2.AddOperation(roi.GrabImageOp(endImages[i])); + } + } + state2.EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + + if (e.Contains(Event.Error)) { retVal = Event.Error; break; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; break; } + } + while (e.Contains(Event.CameraBusy)); + } + else + { + for (int i = 0; i < sensPath.RegisterReaders.Length; i++) + { + GenericDevices.IRoiForFixedStart roi = sensPath.RegisterReaders[i] as GenericDevices.IRoiForFixedStart; + if (roi != null) + { + string directory = Path.Combine(Program.TempImagesDir, BatchRslts.Batch.BatchNr.ToString(), (i + 1).ToString()); + Directory.CreateDirectory(directory); + endImages[i] = Path.Combine(directory, fileName); + File.Copy(string.Format("C:\\TBF\\SampleImages\\{0}", fileName), endImages[i], true); + } + } + + } + intermediateData.EndImages = endImages; + /// + if ((dataEntryCmpnt is GenericDevices.IDataEntryForCamera) && (dataEntryCmpnt as GenericDevices.IDataEntryForCamera).SaveImages) + { + /// SaveImages==true ... copy images to the directory that will be archived at the end of the cycle + for (int i = 0; i < sensPath.RegisterReaders.Length; i++) + { + GenericDevices.IRoiForFixedStart roi = sensPath.RegisterReaders[i] as GenericDevices.IRoiForFixedStart; + if (roi != null) + { + string srcDir = Path.Combine(Program.TempImagesDir, BatchRslts.Batch.BatchNr.ToString(), (i + 1).ToString()); + string destDir = Path.Combine(Program.ImagesDir, BatchRslts.Batch.BatchNr.ToString(), (i + 1).ToString()); + try + { + if (File.Exists(Path.Combine(srcDir, fileName))) + { + Directory.CreateDirectory(destDir); + File.Copy(Path.Combine(srcDir, fileName), Path.Combine(destDir, fileName), true); + } + } + catch (Exception exc) + { + log.ErrorFormat("Failed to copy image {0} to {1}: {2}", fileName, destDir, exc.Message); + } + } + } + } + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Test_completed); + //------------------------------------------------ + + /// Make sure the CycleBeginForm is closed so that water meter data (s/n) can be copied into results + if (UIFlowControl.Stop == WaitBeginFormClosed()) goto stopTest; + + /// + /// Populate TestResult data entity with data + /// + Results.Entities.TestRslt tstRslt = BatchRslts.GetTestRslt(testName, test.Part); + + if (tstRslt != null) + { + UpdateTempPressDensAmb(tstRslt); + + /// Main results + tstRslt.MethodClass = TbfComponents.FindComponent(test.Method).ClassName; + tstRslt.StartTime = TestStartTime; + tstRslt.EndTime = TestEndTime; + tstRslt.FlowSetTime = flowSetTime; + + tstRslt.TestTime = Math.Max(1.0, EndTime - StartTime); /// [s] measurement time, at least 1 to prevent division by zero + + tstRslt.PulsesMaster = Convert.ToDouble(cBrd.EtPulses(0)); /// Pulses of the master flow meter (test total) + tstRslt.MassStartRaw = StartMass.Val; + tstRslt.MassStart = massStart; + tstRslt.MassEndRaw = EndMass.Val; + tstRslt.MassEnd = massEnd; + tstRslt.FlowMass = 3600.0 * (tstRslt.MassEnd - tstRslt.MassStart) / tstRslt.TestTime; /// [kg/h] + tstRslt.FlowVolume = 3.6 * LtrPerRefPulse * tstRslt.PulsesMaster / tstRslt.TestTime; /// [m3/h] + tstRslt.VolumeMaster = LtrPerRefPulse * tstRslt.PulsesMaster; /// [l] volume from the master flow meter + tstRslt.Buoyancy = buoyancy; + tstRslt.VolumeCTV = volumeCTV; /// [l] 1000.0f is because density is in [kg/m3] + tstRslt.ConstMasterRaw = outPath.FlowMeter.LtrPerPulse; /// Uncorrected master flowmeter coefficient + tstRslt.ConstMasterCorr = outPath.FlowMeter.LtrPerPulseCorrected(tstRslt.FlowVolume, rangeIx); /// Corrected master pulses per liter + tstRslt.ConstMaster = (tstRslt.VolumeMaster == 0) ? tstRslt.ConstMasterCorr : (LtrPerRefPulse * tstRslt.VolumeCTV / tstRslt.VolumeMaster); + /// Calculated master pulses per liter + tstRslt.ErrorMaster = Config.Formulas.ErrorFromVolumes(tstRslt.VolumeMaster, tstRslt.VolumeCTV); + + tstRslt.FlowMean = (float)RefFlowStat.Average; + tstRslt.FlowStart = (float)RefFlowStat.First; + tstRslt.FlowEnd = (float)RefFlowStat.Last; + tstRslt.FlowMin = (float)RefFlowStat.Min; + tstRslt.FlowMax = (float)RefFlowStat.Max; + + tstRslt.DiverterStart = switchTimeStart; + tstRslt.DiverterEnd = switchTimeEnd; + tstRslt.ErrorFlagsMd = (ErrorFlagsComp != null) ? (sbyte)ErrorFlagsComp.Mode : (sbyte)0; + tstRslt.ErrorFlags = (ErrorFlagsComp != null) ? ErrorFlagsComp.GetErrorFlags(tstRslt, false, true, switchTimeStart, switchTimeEnd) : 0; + + tstRslt.Components = Results.Entities.Components + .UpdateList(BatchRslts.ComponentsList, + new Results.Entities.Components((BenchInfo != null) ? BenchInfo.TestBenchId : 1, + (BenchInfo != null) ? BenchInfo.TestBenchName : "testbench", + inPath.Pump != null ? inPath.Pump.Name : string.Empty, + outPath.FlowMeter != null ? outPath.FlowMeter.Name : string.Empty, + outPath.Scale != null ? outPath.Scale.Name : string.Empty, + outPath.RegulValve != null ? outPath.RegulValve.Name : string.Empty, + outPath.Diverter != null ? outPath.Diverter.Name : string.Empty)); + tstRslt.TestDone = false; + } + + retVal = Event.MakeSecondPass; + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.TransitionAfter)); + + + stopTest: + + StopRecordingStatistics(); + + /// + /// Quit this sequence + /// + if (isLastRepetition || retVal == Event.UiCmdStop || retVal == Event.OpArgumentError + || retVal == Event.Error || retVal == Event.ConfigurationError) + { + State.Create(string.Format("{0}({1}) : Stopping diverter, gate, etc.", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(cBrd.StopPreviousOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } /// TODO: this is an endless loop !!! + } + while (!e.Contains(Event.PreviousStopped)); + } + + stopTestWOTransitionAfter: + + /// Create a list with one item 'retVal' (default is Event.Done) and return it + IList retList = new List(1); + retList.Add(retVal); + return retList; + } + + + + /// + /// Fixed start mass collection method with deferred evaluation of images + /// + /// Test entity + /// + /// Event.Done . . . . . . . OK + /// Event.UiCmdStop . . . . Stopped by the user using the on-screen button STOP + /// Event.Error . . . . . . Unspecified error + /// + public IList Execute2ndPass(Config.Entities.Test test, int repetNr, IntermediateData data) + { + IList e = new List(1); /// Events from currently running operations + Event retVal = Event.Done; + + /// + /// Populate TestResult data entity with data + /// + Results.Entities.TestRslt tstRslt = BatchRslts.GetTestRslt(data.TestName, data.TestPart); + GenericDevices.IHasWMStatesForm deCmpnt = TbfComponents.FindComponent(StateMachine.Procedure.DataEntry) as GenericDevices.IHasWMStatesForm; + GenericDevices.IDataEntryForCamera de4Cam = deCmpnt as GenericDevices.IDataEntryForCamera; + + if (tstRslt != null && de4Cam != null) + { + de4Cam.StartImages = data.StartImages; + de4Cam.EndImages = data.EndImages; + + Bridge.OnActivity(this, Strings.Enter_water_meter_data); + State.Create(string.Format("{0}({1}) : Entering water meter states", test.Method, test.Name)) + .AddOperation(de4Cam.ShowDeferredTestEvalFormOp(sensPath.RegisterReaders, + tstRslt.VolumeCTV, + test.ErrLimLo + test.Uncertainty, + test.ErrLimHi - test.Uncertainty)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + } + while (e.Contains(Event.ModelessFormIsOpen)); + + + /// Update register reader star and end-volumes from data entry forms + for (int i = 0; i < Config.Data.WMsCount; i++) + { + GenericDevices.IRegisterReader r = sensPath.RegisterReaders[i]; + BenchControl.Network.Camera.RoiForFixedStart.Roi rr = r as BenchControl.Network.Camera.RoiForFixedStart.Roi; + + if (rr != null) + { + rr.BeginWMState = deCmpnt.WMStartState(i); + rr.EndWMState = deCmpnt.WMEndState(i); + } + } + + + if (data.Compound) + { + /// + /// Compound meters + /// + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (test.Part != 0 && test.Part != Utils.PartNr(i + 1, BatchRslts.Batch.Compound)) continue; + + Results.Entities.MeterTestRslt mainMeterRslt = BatchRslts.GetMeterTestRslt(data.TestName, i, Config.Entities.CompoundMeterId.CompoundMain); + Results.Entities.MeterTestRslt auxMeterRslt = BatchRslts.GetMeterTestRslt(data.TestName, i, Config.Entities.CompoundMeterId.CompoundAux); + + for (int isAux = 0; isAux <= 1; isAux++) /// 0=main, 1=aux + { + Results.Entities.MeterTestRslt meterRslt = (isAux == 0) ? mainMeterRslt : auxMeterRslt; + GenericDevices.IRegisterReader regReader = sensPath.RegisterReaders[2 * i + isAux]; + + if (meterRslt != null && regReader != null) + { + meterRslt.RegReaderType = (int)regReader.RegisterReaderType; + meterRslt.PulsesPerLiter = regReader.PulsesPerLtr; + meterRslt.VolumeStart = regReader.BeginWMState; /// [l] From forms/images + meterRslt.VolumeEnd = regReader.EndWMState; /// [l] From forms/images + meterRslt.VolumeMeter = meterRslt.VolumeEnd - meterRslt.VolumeStart; /// [l] + meterRslt.VolumeRef = tstRslt.VolumeCTV; /// [l] + meterRslt.PulsesMeter = meterRslt.VolumeMeter * regReader.PulsesPerLtr; + meterRslt.PulsesMaster = tstRslt.PulsesMaster; + meterRslt.TestTime = tstRslt.TestTime; + meterRslt.Error = Config.Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef); /// Not used for evaluation + } + } + + Results.Entities.MeterTestRslt compoundMeterRslt = BatchRslts.GetMeterTestRslt(data.TestName, i, Config.Entities.CompoundMeterId.Compound); + + if (compoundMeterRslt != null && mainMeterRslt != null && auxMeterRslt != null) + { + compoundMeterRslt.VolumeRef = tstRslt.VolumeCTV; /// [l] must be calculated before main & aux. meter error + compoundMeterRslt.VolumeMeter = mainMeterRslt.VolumeMeter + auxMeterRslt.VolumeMeter; + compoundMeterRslt.PulsesMaster = tstRslt.PulsesMaster; + compoundMeterRslt.TestTime = tstRslt.TestTime; + compoundMeterRslt.Error = Config.Formulas.ErrorFromVolumes(compoundMeterRslt.VolumeMeter, compoundMeterRslt.VolumeRef); + compoundMeterRslt.Passed = (compoundMeterRslt.Error >= test.GetErrLimLo(tstRslt.FlowMean) + test.Uncertainty) + && (compoundMeterRslt.Error <= test.GetErrLimHi(tstRslt.FlowMean) - test.Uncertainty) + && (tstRslt.ErrorFlags == 0 || tstRslt.ErrorFlagsMode() != Config.Entities.ErrorFlagsMode.On); + mainMeterRslt.Passed = auxMeterRslt.Passed = compoundMeterRslt.Passed; + mainMeterRslt.TestDone = auxMeterRslt.TestDone = compoundMeterRslt.TestDone = true; + } + } + tstRslt.TestDone = true; + } + else + { + /// + /// Single meters + /// + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (test.Part != 0 && test.Part != Utils.PartNr(i + 1, BatchRslts.Batch.Compound)) continue; + + Results.Entities.MeterTestRslt meterRslt = BatchRslts.GetMeterTestRslt(data.TestName, i, Config.Entities.CompoundMeterId.Single); + GenericDevices.IRegisterReader regReader = sensPath.RegisterReaders[i]; + + if (meterRslt != null && regReader != null) + { + meterRslt.RegReaderType = (int)regReader.RegisterReaderType; + meterRslt.PulsesPerLiter = regReader.PulsesPerLtr; + meterRslt.VolumeStart = regReader.BeginWMState; /// From forms/images + meterRslt.VolumeEnd = regReader.EndWMState; /// From forms/images + meterRslt.VolumeMeter = meterRslt.VolumeEnd - meterRslt.VolumeStart; + meterRslt.VolumeRef = tstRslt.VolumeCTV; /// liter + meterRslt.PulsesMeter = meterRslt.VolumeMeter * regReader.PulsesPerLtr; + meterRslt.PulsesMaster = tstRslt.PulsesMaster; + meterRslt.TestTime = tstRslt.TestTime; + meterRslt.Error = Config.Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef); + meterRslt.Passed = (meterRslt.Error >= test.GetErrLimLo(tstRslt.FlowMean) + test.Uncertainty) + && (meterRslt.Error <= test.GetErrLimHi(tstRslt.FlowMean) - test.Uncertainty) + && (tstRslt.ErrorFlags == 0 || tstRslt.ErrorFlagsMode() != Config.Entities.ErrorFlagsMode.On); + meterRslt.TestDone = true; + } + } + tstRslt.TestDone = true; + } + + /// Update water meter error flags + if (ErrorFlagsComp != null) + { + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (BatchRslts.WaterMeters[i] != null) + { + BatchRslts.WaterMeters[i].ErrorFlags = ErrorFlagsComp.GetWMtrErrorFlags(BatchRslts.WaterMeters[i].MeterTestRslts); + } + } + } + + /// Update results + Bridge.OnTestCompleted(this, new TestCompletedEventArgs(data.TestName, tstRslt)); + + /// Append the results to the CSV-file + allResults.Info(TestResult2CsvLine(data.TestName, data.TestPart)); + } + + + /// No operation for 1 period so that Stop() function of Data entry component is called + State.Create(string.Format("{0}({1}) : No Op.", test.Method, test.Name)).EnterState(); + do { e = StateMachine.WaitRunDevsRunOps(); } while (false); + + + e.Add(retVal); + return e; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/HeatMeters/Component.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/HeatMeters/Component.cs new file mode 100644 index 00000000..8e9ae8bf --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/HeatMeters/Component.cs @@ -0,0 +1,49 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; + +namespace TBF.BenchControl.TestMethods.FixedStartDeferredEvaluation.HeatMeters +{ + public class Component : ComponentBase, GenericDevices.ITestMethodWith2ndPass + { + private static readonly ILog log = LogManager.GetLogger(typeof(Component)); + public override string ToString() + { + return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); + } + + readonly TestMethodCfg testMethodCfg; + + public bool CanTest(MetersKind meters) { return meters == MetersKind.HeatMeter; } + public bool DoTransitions() { return true; } + + public Component() + { + } + + public Component(Generic.IComponentCfg cfg) + : base(cfg) + { + testMethodCfg = cfg as TestMethodCfg; + log.Debug(this.ToString()); + } + + + private IntermediateData intermediateData; + public object IntermediateData { get { return intermediateData; } } + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + return (new FixedStartDeferredEvaluationSeq()).Execute(test, repetNr, isLastRepetition, false, testMethodCfg.TestParams, DebugLevel, out intermediateData); + } + + public IList Execute2ndPass(Test test, int repetNr, object data) + { + return (new FixedStartDeferredEvaluationSeq()).Execute2ndPass(test, repetNr, data as IntermediateData); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/HeatMeters/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/HeatMeters/Factory.cs new file mode 100644 index 00000000..c6787357 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/HeatMeters/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FixedStartDeferredEvaluation.HeatMeters +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Component.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Component(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Component(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this.GetType().Namespace.Substring(29), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/HeatMeters/TestMethodCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/HeatMeters/TestMethodCfg.cs new file mode 100644 index 00000000..69cb33b1 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/HeatMeters/TestMethodCfg.cs @@ -0,0 +1,49 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FixedStartDeferredEvaluation.HeatMeters +{ + public class TestMethodCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestMethodCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new TestMethodCfgCtrl(); } + + /// Test parameters + [XmlIgnore] + public TestParams TestParams; /// Created in constructor + public override IParamsProvider GetRuntimeTestParamsProvider() { return TestParams; } + public override IParamsProvider CreateTestParamsProvider() { return new TestParams(true); } + public override IParamsProvider GetUITestParamsProvider(Test test) + { + return (test.Method == Name) ? base.GetUITestParamsProvider(test) : null; + } + + /// Private parameterless constructor invoked by all other (public) constructors + TestMethodCfg() + { + TestParams = new TestParams(true); + } + + public TestMethodCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + Factory = factory; + ParentName = string.Empty; + } + + public string ToString(int i) + { + return string.Format("Name={0}", Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/HeatMeters/TestMethodCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/HeatMeters/TestMethodCfgCtrl.cs new file mode 100644 index 00000000..b2307f20 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/HeatMeters/TestMethodCfgCtrl.cs @@ -0,0 +1,69 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FixedStartDeferredEvaluation.HeatMeters +{ + public partial class TestMethodCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + TestMethodCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as TestMethodCfg; + Redraw(); + } + } + + public TestMethodCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/HeatMeters/TestMethodCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/HeatMeters/TestMethodCfgCtrl.designer.cs new file mode 100644 index 00000000..d0c9df6c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/HeatMeters/TestMethodCfgCtrl.designer.cs @@ -0,0 +1,86 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// +namespace TBF.BenchControl.TestMethods.FixedStartDeferredEvaluation.HeatMeters +{ + partial class TestMethodCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(137, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 5; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(27, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 4; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(134, 33); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 3; + this.classNameLabel.Text = "ComonentName"; + // + // BasicPrinterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "BasicPrinterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/HeatMeters/TestMethodCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/HeatMeters/TestMethodCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/HeatMeters/TestMethodCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/HeatMeters/TestParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/HeatMeters/TestParams.cs new file mode 100644 index 00000000..2bf44f7b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/HeatMeters/TestParams.cs @@ -0,0 +1,197 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.FixedStartDeferredEvaluation.HeatMeters +{ + public class TestParams : TestParamsBase, IParamsProvider, ITestParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestParams) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public float ErrorLimitLo; /// [%] + public float ErrorLimitHi; /// [%] + public bool EvaluateVolume; /// true = evaluate also the volume, false = evaluate only energy + public float TempWarmLo; /// Low limit for warm temperature [°C] + public float TempWarmHi; /// High limit for warm temperature [°C] + public float TempColdLo; /// Low limit for cold temperature [°C] + public float TempColdHi; /// High limit for cold temperature [°C] + public bool FlowMeasuredAtHiTempPipe; /// true = flow measured at high temp. pipe, false = flow measured at low temp. pipe + public float DeltaTempWarm; + public float DeltaTempCold; + public float ChangeInTimeWarm; + public float ChangeInTimeCold; + public string Prompt; + + public override void InitializeAll() + { + FlowMeasuredAtHiTempPipe = false; + } + + + string[] paramNames = new string[] + { + Strings.Err_limit_neg_pct_chdr, + Strings.Err_limit_pos_pct_chdr, + Strings.Evaluate_volume, + "T hi min", + "T hi max", + "T lo min", + "T lo max", + "Flow measured at high temp.pipe", + "Delta T warm", + "Delta T cold", + "Change in time T warm", + "Change in time T cold", + Strings.Prompt, + }; + public override string ParamName(int i) { return paramNames[i]; } + public override int ParamsCount() { return paramNames.Length; } + + public override string ToString(int i) + { + switch (i) + { + case 0: return ErrorLimitLo.ToString(); + case 1: return ErrorLimitHi.ToString(); + case 2: return (EvaluateVolume ? Strings.yes : Strings.no); + case 3: return TempWarmLo.ToString(); + case 4: return TempWarmHi.ToString(); + case 5: return TempColdLo.ToString(); + case 6: return TempColdHi.ToString(); + case 7: return (FlowMeasuredAtHiTempPipe ? Strings.yes : Strings.no); + case 8: return DeltaTempWarm.ToString(); + case 9: return DeltaTempCold.ToString(); + case 10: return ChangeInTimeWarm.ToString(); + case 11: return ChangeInTimeCold.ToString(); + case 12: return Prompt; + default: return string.Empty; + } + } + + public CfgUpdateFlags UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: ErrorLimitLo = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 1: ErrorLimitHi = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 2: EvaluateVolume = strValue.Equals(Strings.yes); return CfgUpdateFlags.None; + case 3: TempWarmLo = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 4: TempWarmHi = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 5: TempColdLo = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 6: TempColdHi = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 7: FlowMeasuredAtHiTempPipe = strValue.Equals(Strings.yes); return CfgUpdateFlags.None; + case 8: DeltaTempWarm = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 9: DeltaTempCold = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 10: ChangeInTimeWarm = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 11: ChangeInTimeCold = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 12: Prompt = strValue; return CfgUpdateFlags.None; + default: return CfgUpdateFlags.None; + } + } + + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + float dummy; + + switch (i) + { + case 0: + case 1: + case 3: + case 4: + case 5: + case 6: + if (Utils.TryParseSFloat(strValue, out dummy)) return true; + break; + case 2: + case 7: + if (strValue.Equals(Strings.yes) || strValue.Equals(Strings.no)) return true; + break; + case 8: + case 9: + case 10: + case 11: + if (Utils.TryParseUFloat(strValue, out dummy)) return true; + break; + case 12: + return true; + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(TestParams prms) + { + prms.ErrorLimitLo = ErrorLimitLo; + prms.ErrorLimitHi = ErrorLimitHi; + prms.EvaluateVolume = EvaluateVolume; + prms.TempWarmLo = TempWarmLo; + prms.TempWarmHi = TempWarmHi; + prms.TempColdLo = TempColdLo; + prms.TempColdHi = TempColdHi; + prms.FlowMeasuredAtHiTempPipe = FlowMeasuredAtHiTempPipe; + prms.DeltaTempWarm = DeltaTempWarm; + prms.DeltaTempCold = DeltaTempCold; + prms.ChangeInTimeWarm = ChangeInTimeWarm; + prms.ChangeInTimeCold = ChangeInTimeCold; + prms.Prompt = Prompt; + } + + public IParamsProvider Clone() + { + TestParams pars = new TestParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateFromDbEntity(ComponentTest dbEntity) + { + if (dbEntity == null) return; + try + { + TestParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as TestParams; + + testParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + test = dbEntity.Test; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + /// + /// Parameterless constructor initializes the parameters + /// + public TestParams() + { + } + + public TestParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public TestParams(ComponentTest testParamsEntity, string componentName, Test test) + { + this.testParamsEntity = testParamsEntity; + this.componentName = componentName; + this.test = test; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/IntermediateData.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/IntermediateData.cs new file mode 100644 index 00000000..27d4cdda --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/IntermediateData.cs @@ -0,0 +1,16 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// +using System; + +namespace TBF.BenchControl.TestMethods.FixedStartDeferredEvaluation +{ + public class IntermediateData + { + public bool Compound; + public string TestName; + public int TestPart; + public string[] StartImages; + public string[] EndImages; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/Single/Component.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/Single/Component.cs new file mode 100644 index 00000000..2611e139 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/Single/Component.cs @@ -0,0 +1,46 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; + +namespace TBF.BenchControl.TestMethods.FixedStartDeferredEvaluation.Single +{ + public class Component : ComponentBase, GenericDevices.ITestMethodWith2ndPass + { + private static readonly ILog log = LogManager.GetLogger(typeof(Component)); + public override string ToString() + { + return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); + } + + public bool CanTest(MetersKind meters) { return meters == MetersKind.Single; } + public bool DoTransitions() { return true; } + + public Component() + { + } + + public Component(Generic.IComponentCfg cfg) + : base(cfg) + { + log.Debug(this.ToString()); + } + + + private IntermediateData intermediateData; + public object IntermediateData { get { return intermediateData; } } + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + return (new FixedStartDeferredEvaluationSeq()).Execute(test, repetNr, isLastRepetition, false, null, DebugLevel, out intermediateData); + } + + public IList Execute2ndPass(Test test, int repetNr, object data) + { + return (new FixedStartDeferredEvaluationSeq()).Execute2ndPass(test, repetNr, data as IntermediateData); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/Single/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/Single/Factory.cs new file mode 100644 index 00000000..b6031e9d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartDeferredEvaluation/Single/Factory.cs @@ -0,0 +1,27 @@ +/// +/// Copyright (c) 2017 Sensus Slovensko a.s. +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; +using TBF.BenchControl.Configs.NameOnly; + +namespace TBF.BenchControl.TestMethods.FixedStartDeferredEvaluation.Single +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Component.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Component(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Component(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this.GetType().Namespace.Substring(29), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/Compound/Component.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/Compound/Component.cs new file mode 100644 index 00000000..6ead67ea --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/Compound/Component.cs @@ -0,0 +1,37 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; + +namespace TBF.BenchControl.TestMethods.FixedStartMassCollection.Compound +{ + public class Component : ComponentBase, GenericDevices.ITestMethod + { + private static readonly ILog log = LogManager.GetLogger(typeof(Component)); + public override string ToString() + { + return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); + } + + public bool CanTest(MetersKind meters) { return meters == MetersKind.Combined; } + public bool DoTransitions() { return true; } + + public Component() + { + } + + public Component(Generic.IComponentCfg cfg) + : base(cfg) + { + log.Debug(this.ToString()); + } + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + return (new FixedStartMassCollectionSeq()).Execute(test, repetNr, isLastRepetition, true, null, DebugLevel); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/Compound/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/Compound/Factory.cs new file mode 100644 index 00000000..acf4dec8 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/Compound/Factory.cs @@ -0,0 +1,27 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; +using TBF.BenchControl.Configs.NameOnly; + +namespace TBF.BenchControl.TestMethods.FixedStartMassCollection.Compound +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Component.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Component(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Component(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this.GetType().Namespace.Substring(29), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/FixedStartMassCollectionSeq.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/FixedStartMassCollectionSeq.cs new file mode 100644 index 00000000..58b91862 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/FixedStartMassCollectionSeq.cs @@ -0,0 +1,1231 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using log4net; +using TBF.Resources; +using TBF.UiBridge; + +namespace TBF.BenchControl.TestMethods.FixedStartMassCollection +{ + public class FixedStartMassCollectionSeq : Sequences.SequenceBase + { + private static readonly ILog log = LogManager.GetLogger(typeof(FixedStartMassCollectionSeq)); + + /// + /// Fixed start mass collection method sequence + /// + /// Test entity + /// + /// Event.Done . . . . . . . OK + /// Event.MakeSecondPass . . OK, 2nd pass (=evaluation) required + /// Event.UiCmdStop . . . . Stopped by the user using the on-screen button STOP + /// Event.OpArgumentError . Target flow is out of range + /// Event.Error . . . . . . Unspecified error + /// + public IList Execute(Config.Entities.Test test, int repetitionNr, bool isLastRepetition, + bool compound, + HeatMeters.TestParams heatMetersTestParams, + Config.Entities.DebugMode debugLevel) + { + Elde.ControlBoardDev cBrd = StateMachine.ControlBoard; + + IList e = new List(); /// Events from currently running operations + Event retVal = Event.Done; + checkUiOp = new Operations.CheckUIOp(true); /// Runs in more then one state + + float switchTimeStart = 0.001f; /// in seconds, original vale is 1 ms + float switchTimeEnd = 0.001f; /// in seconds, original vale is 1 ms + + LtrPerRefPulse = outPath.FlowMeter.LtrPerPulse; /// [ltr/pulse], nominal flow in [m3/h] + + /// Notes: + /// float timeHr = volumeLtr / (1000.0f * targetFlow); + /// float timeSec = 3600.0f * timeHr; + /// int refPulses = (int)(timeSec * (2000.0f * targetFlow / pOut.FlowMeter.NominalFlow)); + int totalPulses = (int)(test.Volume / LtrPerRefPulse + 0.5f); + + int rangeIx = 0; /// Default range, used for non-Elde flowmeters + if (outPath.FlowMeter is Elde.FlowMeter.FlowMeter) + { + Elde.FlowMeter.FlowMeter eldeFM = outPath.FlowMeter as Elde.FlowMeter.FlowMeter; + rangeIx = -1; /// Indicates invalid range + for (int r = 0; r <= 5; r++) + { + if (eldeFM.RangeEnabled(r) && eldeFM.GetTempLo(r) <= test.TempLimLo + && eldeFM.GetTempHi(r) >= test.TempLimHi) + { + rangeIx = r; + } + } + + if (rangeIx == -1) + { + Bridge.OnError(this, Strings.Flow_meter_temperature_range_does_not_fit_this_test_conditions); + retVal = Event.UiCmdStop; + goto stopTestWOTransitionAfter; + } + } + + processDataLoggingOp = new TBF.BenchControl.Operations.ProcessDataLoggingOp(processDataLogger, this, heatMetersTestParams != null); + + + if (test.Volume >= outPath.Scale.Capacity * Constants.TankFullFactor) + { + Bridge.OnError(this, Strings.Test_volume_exceeds_the_scale_capacity); + retVal = Event.UiCmdStop; + goto stopTestWOTransitionAfter; + } + + //==================================== + loop: + /// Start the test, initialize test results + Bridge.OnTestSelected(this, new TestSelectedEventArgs(test, repetitionNr, inPath, benchPath, outPath, sensPath, totalPulses)); + string testName = Results.Utils.GetTestName(test.Name, test.Repeats, repetitionNr); + + /// + /// Optionally display prompt to emerge temperature meters to appropriate baths for heat meters test + /// + IOperation heatMetersPromptOp = null; + if (heatMetersTestParams != null && !string.IsNullOrEmpty(heatMetersTestParams.Prompt)) + { + /// Make sure the CycleBeginForm is closed + if (UIFlowControl.Stop == WaitBeginFormClosed()) goto stopTest; + + heatMetersPromptOp = new Operations.MessageBoxOp(heatMetersTestParams.Prompt); + } + + + + if (!test.DoDraining) + { + /// + /// Measure the weight in case there is no unconditional draining + /// + State.Create(string.Format("{0}({1}) : Measuring mass of water in the tank", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(outPath.Scale.ReadMassOp(ref Mass)) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.JustStarted)); + + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.BalanceDone)); + } + /// + /// Skip draining in case there is enough room in the tank + /// + if (test.DoDraining || (Mass.Val + test.Volume >= outPath.Scale.Capacity * Constants.TankFullFactor)) + { + /// + /// Drain the water tank + /// + switch (DrainTheTank(outPath.Scale.DrainValve, outPath.Scale, heatMetersPromptOp)) + { + case Event.Error: { retVal = Event.Error; goto stopTest; } + case Event.UiCmdStop: { retVal = Event.UiCmdStop; goto stopTest; } + } + } + /// + /// Make sure the drain valve is closed + /// + State.Create(string.Format("{0}({1}) : Make sure the drain valve is closed", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(outPath.Scale.ReadMassOp(ref Mass)) + .AddOperation(heatMetersPromptOp) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(null, outPath.Scale.DrainValve)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.JustStarted)); + + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.ValvesSet) || !e.Contains(Event.BalanceDone)); + + + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Starting_the_pump); + //------------------------------------------------ + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + int flowSetTime0 = StateMachine.Time; + + if (inPath.Pump is GenericDevices.IPumpFM) (inPath.Pump as GenericDevices.IPumpFM).TurnOn(test.PumpPower); + /// + State.Create(string.Format("{0}({1}) : Starting the pump", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) +// .AddOperation(new Operations.SetAllRegulValvesOp(inPath.RegulValves, inPath.RegulValvesPct, 60)) + .AddOperation(heatMetersPromptOp) + .AddOperation(inPath.Pump != null ? cBrd.SetValvesOp(inPath.Pump, null) : null) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + + } + while (e.Contains(Event.ValvesBusy) /* || !e.Contains(Event.AllPositionsReached)*/); + + + if (test.TimePump2StartV > 0) + { + State.Create(string.Format("{0}({1}) : Waiting after the pump started", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(new Operations.TimerOp(test.TimePump2StartV)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + } + + + if (benchPath.StopBFValve != null) + { + State.Create(string.Format("{0}({1}) : Opening the stop backflow valve", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(benchPath.StopBFValve, null)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } + while (!e.Contains(Event.ValvesSet)); + } + + + if (test.TimeBeforeFlow > 0) + { + State.Create(string.Format("{0}({1}) : Waiting before flow setting process starts", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(new Operations.TimerOp(test.TimeBeforeFlow)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + } + + + setting_flow: + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Setting_the_flow); + //------------------------------------------------ + if (inPath.Pump is GenericDevices.IPumpFM) + { + (inPath.Pump as GenericDevices.IPumpFM).TurnOn(test.PumpPower); + } + /// + State.Create(string.Format("{0}({1}) : Pump on", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(inPath.Pump, null)) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (e.Contains(Event.ValvesBusy)); + /// + State.Create(string.Format("{0}({1}) : Start valve open", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(new TBF.BenchControl.Elde.SetValvesOp(cBrd, false, outPath)) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (e.Contains(Event.ValvesBusy)); + + + //-------------------------------- + State.Create(string.Format("{0}({1}) : Setting the flow", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(outPath.RegulValve.SetFlowOp(outPath.FlowMeter, test.Qfrom, test.Qto, outPath.PidCoef, RefFlow, 600)) /// timeout = 10 min. + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (e.Contains(Event.OpArgumentError)) { retVal = Event.OpArgumentError; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.RegulValveTimeOut)) + { + Bridge.OnError(this, Strings.Flow_adjustment_failed); + retVal = Event.UiCmdStop; + goto stopTest; + } + if (e.Contains(Event.Next)) goto flow_set; + } + while (!e.Contains(Event.FlowReached)); + + flow_set: + + int flowSetTime = StateMachine.Time - flowSetTime0; + + if (heatMetersTestParams != null && heatMetersPath != null) + { + //--------------------------------------------------- + Bridge.OnActivity(this, Strings.Setting_temperature); + //--------------------------------------------------- + + int lastTimeSec = StateMachine.Time; + double Tw_last = 0; + double Tc_last = 0; + + State.Create(string.Format("{0}({1}) : Checking if the temperature is stable", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Next)) goto temperature_set; + + if (TempRefHi1.Val != 0 && TempRefHi2.Val != 0 && TempRefLo1.Val != 0 && TempRefLo2.Val != 0) + { + if (StateMachine.Time - lastTimeSec > 10 || StateMachine.Time - lastTimeSec < 0) + { + double Tw = (TempRefHi1.Val + TempRefHi2.Val) / 2; + double Tc = (TempRefLo1.Val + TempRefLo2.Val) / 2; + if (heatMetersTestParams.TempWarmLo <= Tw && Tw <= heatMetersTestParams.TempWarmHi && + heatMetersTestParams.TempColdLo <= Tc && Tc <= heatMetersTestParams.TempColdHi && + Math.Abs(Tw - Tw_last) <= heatMetersTestParams.ChangeInTimeWarm && + Math.Abs(Tc - Tc_last) <= heatMetersTestParams.ChangeInTimeCold && + Math.Abs(TempRefHi1.Val - TempRefHi2.Val) <= heatMetersTestParams.DeltaTempWarm && + Math.Abs(TempRefLo1.Val - TempRefLo2.Val) <= heatMetersTestParams.DeltaTempCold) + { + goto temperature_set; + } + + lastTimeSec = StateMachine.Time; + Tw_last = Tw; + Tc_last = Tc; + } + } + } + while (true); + } + else if (test.DoControlWaterTemp && benchPath.TempMtrUp != null && benchPath.TempMtrDown != null) + { + //--------------------------------------------------- + Bridge.OnActivity(this, Strings.Setting_temperature); + //--------------------------------------------------- + + State.Create(string.Format("{0}({1}) : Wait until the water temperature is within limits", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Next)) goto temperature_set; + + if (TempUp.Val >= test.TempLimLo && TempUp.Val <= test.TempLimHi && + TempDown.Val >= test.TempLimLo && TempDown.Val <= test.TempLimHi) + { + goto temperature_set; + } + } + while (true); + } + + temperature_set: + + //----------------------------------------------------------------- + Bridge.OnActivity(this, Strings.Stopping_flow_for_the_fixed_start); + //----------------------------------------------------------------- + State.Create(string.Format("{0}({1}) : Closing the start/stop valve before the fixed start test", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(new TBF.BenchControl.Elde.SetValvesOp(cBrd, true, outPath)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } + while (!e.Contains(Event.ValvesSet)); + + + int time = StateMachine.Time; + double currentFlow = RefFlow.Val; + + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Measuring_the_weight); + //------------------------------------------------ + + if (test.TimeFlow2Mass > 0) + { + State.Create(string.Format("{0}({1}) : Waiting before 1st mass measurement", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation(cBrd.UpdateTankWeightOp()) + .AddOperation(new Operations.TimerOp(test.TimeFlow2Mass)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + } + + + TestStartTime = DateTime.Now; + LogProcessDataTestInfo(processDataLogger, test.Procedure.Name, test.Name); + + if (heatMetersPath == null) LogProcessDataHeader(processDataLogger, "Start mass"); + else LogProcessDataHeaderHeatMeters(processDataLogger, "Start mass"); + + State.Create(string.Format("{0}({1}) : Measuring the start mass", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation((StateMachine.Ambient != null) + ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) : null) + .AddOperation(outPath.Scale.ReadStableMassOp(ref StartMass, test.MassRepeats, test.MassSpread, test.MassMethod)) + .AddOperation(cBrd.UpdateTankWeightOp()) + .AddOperation(processDataLoggingOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.BalanceDone)); + + Mass.Val = StartMass.Val; + + + /// + /// Enter watermeter begin states here + /// + GenericDevices.IHasWMStatesForm dataEntryCmpnt = TbfComponents.FindComponent(StateMachine.Procedure.DataEntry) as GenericDevices.IHasWMStatesForm; + + if (dataEntryCmpnt != null) + { + string fileName = string.Format("{0}-start.bmp", test.Name); + + if (dataEntryCmpnt is GenericDevices.IDataEntryForCamera) + { + string[] startImages = new string[sensPath.RegisterReaders.Length]; + + State state2 = State.Create(string.Format("{0}({1}) : Grabbing images", test.Method, test.Name)) + .AddOperation(checkUiOp); + for (int i = 0; i < sensPath.RegisterReaders.Length; i++) + { + GenericDevices.IRoiForFixedStart roi = sensPath.RegisterReaders[i] as GenericDevices.IRoiForFixedStart; + if (roi != null) + { + string directory = Path.Combine(Program.TempImagesDir, BatchRslts.Batch.BatchNr.ToString(), (i + 1).ToString()); + Directory.CreateDirectory(directory); + startImages[i] = Path.Combine(directory, fileName); + state2.AddOperation(roi.GrabImageOp(startImages[i])); + } + } + state2.EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + + if (e.Contains(Event.Error)) { retVal = Event.Error; break; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; break; } + } + while (e.Contains(Event.CameraBusy)); + + (dataEntryCmpnt as GenericDevices.IDataEntryForCamera).StartImages = startImages; + } + + Bridge.OnActivity(this, Strings.Enter_water_meter_data); + State.Create(string.Format("{0}({1}) : Entering begin-state", test.Method, test.Name)) + .AddOperation((dataEntryCmpnt as GenericDevices.IHasWMStatesForm).ShowTestStartFormOp(sensPath.RegisterReaders)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation(checkUiOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.ModelessFormClosed)); + + if (heatMetersTestParams != null) + { + for (int i = 0; i < Config.Data.HeatMetersCount; i++) + { + BenchControl.Elde.FixedStartRegisterReader.RegisterReader volumeRegisterReader = + sensPath.RegisterReaders[2 * i] as BenchControl.Elde.FixedStartRegisterReader.RegisterReader; + + BenchControl.Elde.FixedStartRegisterReader.RegisterReader energyRegisterReader = + sensPath.RegisterReaders[2 * i + 1] as BenchControl.Elde.FixedStartRegisterReader.RegisterReader; + + if (volumeRegisterReader != null) volumeRegisterReader.BeginWMState = dataEntryCmpnt.WMStartState(i); + if (energyRegisterReader != null && dataEntryCmpnt is GenericDevices.IHasHeatMtrStatesForm) + { + energyRegisterReader.BeginWMState = (float)(dataEntryCmpnt as GenericDevices.IHasHeatMtrStatesForm).EnergyStartState(i); + } + } + } + else + { + for (int i = 0; i < Config.Data.WMsCount; i++) + { + GenericDevices.IRegisterReader rr = sensPath.RegisterReaders[i]; + + if (rr is BenchControl.Elde.FixedStartRegisterReader.RegisterReader) + (rr as BenchControl.Elde.FixedStartRegisterReader.RegisterReader).BeginWMState = dataEntryCmpnt.WMStartState(i); + + if (rr is BenchControl.Network.Camera.RoiForFixedStart.Roi) + (rr as BenchControl.Network.Camera.RoiForFixedStart.Roi).BeginWMState = dataEntryCmpnt.WMStartState(i); + } + } + + if (dataEntryCmpnt is GenericDevices.IDataEntryForCamera && (dataEntryCmpnt as GenericDevices.IDataEntryForCamera).SaveImages) + { + /// SaveImages==true ... copy images to the directory that will be archived at the end of the cycle + for (int i = 0; i < sensPath.RegisterReaders.Length; i++) + { + GenericDevices.IRoiForFixedStart roi = sensPath.RegisterReaders[i] as GenericDevices.IRoiForFixedStart; + if (roi != null) + { + string srcDir = Path.Combine(Program.TempImagesDir, BatchRslts.Batch.BatchNr.ToString(), (i + 1).ToString()); + string destDir = Path.Combine(Program.ImagesDir, BatchRslts.Batch.BatchNr.ToString(), (i + 1).ToString()); + try + { + if (File.Exists(Path.Combine(srcDir, fileName))) + { + Directory.CreateDirectory(destDir); + File.Copy(Path.Combine(srcDir, fileName), Path.Combine(destDir, fileName), true); + } + } + catch (Exception exc) + { + log.ErrorFormat("Failed to copy image {0} to {1}: {2}", fileName, destDir, exc.Message); + } + } + } + } + } + + + if (heatMetersPath == null) LogProcessDataHeader(processDataLogger, "Measurement"); + else LogProcessDataHeaderHeatMeters(processDataLogger, "Measurement"); + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Test_in_progress); + //------------------------------------------------ + State.Create(string.Format("{0}({1}) : Starting the test", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation(cBrd.StartMeasurementOp(outPath, Elde.TestMethods.Diverter | Elde.TestMethods.Synchro, + test.Qfrom, test.Qto, 2 * totalPulses, (float)test.TolerRed)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.MeasurementStarted)); + + StartTime = (double)StateMachine.Time; + + State.Create(string.Format("{0}({1}) : Opening the start/stop valve at the beginning of the fixed start test", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation(new TBF.BenchControl.Elde.SetValvesOp(cBrd, false, outPath)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } + while (!e.Contains(Event.ValvesSet)); + + switchTimeStart = 0.001f * cBrd.ValveOpenCloseTime; + log.WarnFormat("Start valve switch time on test start = {0} ms", cBrd.ValveOpenCloseTime); + + /// Measurement loop - preparation + readRegistersOp = new Operations.ReadMoreRegistersOp(sensPath.RegisterReaders); + queryEnd1 = cBrd.QueryMeasurementEndOp(); + queryEnd2 = cBrd.QueryMeasurementEndOp(); + + StartNewStatistics(StateMachine.Time, BatchRslts.Batch.BatchNr, test.Name, repetitionNr); + int estimtdEndTime = StateMachine.Time + (int)test.TstTime; + + /// Measurement loop - begin + do + { + //-------------------------------- + switch (ReadRegistersTempPressAmbient(null, true)) + { + case Event.Error: + retVal = Event.Error; + goto stopTest; + + case Event.UiCmdStop: + retVal = Event.UiCmdStop; + goto stopTest; + + case Event.MeasurementCompleted: + goto test_completed; + } + + int remainingTime = Math.Max(estimtdEndTime - StateMachine.Time, 0); + if (remainingTime > 60) + { + Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", Strings.Test_in_progress, remainingTime / 60, "min", remainingTime % 60, Strings.sec)); + } + else + { + Bridge.OnActivity(this, string.Format("{0} ... {1} s", Strings.Test_in_progress, remainingTime)); + } + + RefFreq.Val = cBrd.ReferenceFreq; + RefFlow.Val = cBrd.ReferenceFlow; + + UpdateAllStatistics(StateMachine.Time); + + if (heatMetersTestParams != null) + { + if (lastEnergyUpdateTime == 0) + { + lastEnergyUpdateTime = StateMachine.Time; + } + else + { + //double deltaTime = (double)(StateMachine.Time - lastEnergyUpdateTime); + double T_in = (TempRefHi1.Val + TempRefHi2.Val) / 2; /// [°C] + double T_out = (TempRefLo1.Val + TempRefLo2.Val) / 2; /// [°C] + double deltaVolume = LtrPerRefPulse * RefPulsesDelta; /// [l] + double deltaEnergy = (0.001 * deltaVolume) * (T_in - T_out) * Config.Formulas.HeatCoefficientWater(16, T_in, T_out, heatMetersTestParams.FlowMeasuredAtHiTempPipe); /// [J] = [m3] * [K] * [J/(m3 K)] + Energy.Update(deltaEnergy); + VolumeForEnergy.Update(deltaVolume); + lastEnergyUpdateTime = StateMachine.Time; + } + } + + if (compound) + { + /// TODO: Reimplement for combined meters + //for (int i = 0; i < Config.Data.CompoundWMsCount; i++) + //{ + // data.TestResult.CombinedMeters[i].VolumeMeter = data.TestResult.Meters[2 * i].VolumeMeter + // + data.TestResult.Meters[2 * i + 1].VolumeMeter; + // if (data.Volume.Valid) + // { + // data.TestResult.CombinedMeters[i].VolumeErrorPct = + // Formulas.ErrorFromVolumes(data.TestResult.CombinedMeters[i].VolumeMeter, data.Volume.Val); + // } + //} + } + + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + } + while (cBrd.EtPulses(0) < totalPulses); + /// Measurement loop - end + + test_completed: + + StopRecordingStatistics(); + + EndTime = (double)StateMachine.Time; + + State.Create(string.Format("{0}({1}) : Closing the start/stop valve at the end of the fixed start test", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation(new TBF.BenchControl.Elde.SetValvesOp(cBrd, true, outPath)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } + while (e.Contains(Event.ValvesBusy)); + + switchTimeEnd = 0.001f * cBrd.ValveOpenCloseTime; + log.WarnFormat("Start valve switch time on test end = {0} ms", cBrd.ValveOpenCloseTime); + + State.Create(string.Format("{0}({1}) : Waiting before 2nd mass measurement", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation((StateMachine.Ambient != null) + ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) : null) + .AddOperation(outPath.Scale.ReadMassOp(ref Mass)) + .AddOperation(cBrd.UpdateTankWeightOp()) + .AddOperation(processDataLoggingOp) + .AddOperation(new Operations.TimerOp(test.TimeStop2Mass)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + + + if (heatMetersPath == null) LogProcessDataHeader(processDataLogger, "End mass"); + else LogProcessDataHeaderHeatMeters(processDataLogger, "End mass"); + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Measuring_the_weight); + //------------------------------------------------ + State.Create(string.Format("{0}({1}) : Measuring the end mass", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation((StateMachine.Ambient != null) + ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) : null) + .AddOperation(outPath.Scale.ReadStableMassOp(ref EndMass, test.MassRepeats, test.MassSpread, test.MassMethod)) + .AddOperation(cBrd.UpdateTankWeightOp()) + .AddOperation(processDataLoggingOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.BalanceDone)); + /// + TestEndTime = DateTime.Now; + + + State.Create(string.Format("{0}({1}) : Stopping diverter, gate, etc.", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(cBrd.StopPreviousOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.PreviousStopped)); + + + double massStart = Config.Formulas.CorrectedValue(StartMass.Val, outPath.Scale.Corrections); + double massEnd = Config.Formulas.CorrectedValue(EndMass.Val, outPath.Scale.Corrections); + double densityOut = Config.Formulas.WaterDensityFromTemp(TempDownStat.Average, Program.LocalSettings.RealDensity, Program.LocalSettings.AtTemperature); /// [kg/m3] + double buoyancy = Config.Formulas.Buoyancy(); + + double volumeCTV = 1000.0 * buoyancy * (massEnd - massStart) / densityOut; + if (debugLevel == Config.Entities.DebugMode.Simulate) volumeCTV = test.Volume; + + double refEnergy = Energy.Sum * volumeCTV / VolumeForEnergy.Sum; /// [J]=[J]*[l]/[l] + + /// + /// Enter watermeter end states here + /// + if (dataEntryCmpnt != null) + { + string fileName = string.Format("{0}-end.bmp", test.Name); + + if (dataEntryCmpnt is GenericDevices.IDataEntryForCamera) + { + string[] endImages = new string[sensPath.RegisterReaders.Length]; + + State state2 = State.Create(string.Format("{0}({1}) : Grabbing images", test.Method, test.Name)) + .AddOperation(checkUiOp); + for (int i = 0; i < sensPath.RegisterReaders.Length; i++) + { + GenericDevices.IRoiForFixedStart roi = sensPath.RegisterReaders[i] as GenericDevices.IRoiForFixedStart; + if (roi != null) + { + string directory = Path.Combine(Program.TempImagesDir, BatchRslts.Batch.BatchNr.ToString(), (i + 1).ToString()); + Directory.CreateDirectory(directory); + endImages[i] = Path.Combine(directory, fileName); + state2.AddOperation(roi.GrabImageOp(endImages[i])); + } + } + state2.EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + + if (e.Contains(Event.Error)) { retVal = Event.Error; break; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; break; } + } + while (e.Contains(Event.CameraBusy)); + + (dataEntryCmpnt as GenericDevices.IDataEntryForCamera).EndImages = endImages; + } + + Bridge.OnActivity(this, Strings.Enter_water_meter_data); + State state = State.Create(string.Format("{0}({1}) : Entering the end-state", test.Method, test.Name)); + if (heatMetersTestParams != null && dataEntryCmpnt is GenericDevices.IHasHeatMtrStatesForm) + { + state.AddOperation((dataEntryCmpnt as GenericDevices.IHasHeatMtrStatesForm). + ShowTestEndFormOp(sensPath.RegisterReaders, + volumeCTV, test.ErrLimLo + test.Uncertainty, test.ErrLimHi - test.Uncertainty, + refEnergy, test.ErrLimLo + test.Uncertainty, test.ErrLimHi - test.Uncertainty)); + } + else + { + state.AddOperation(dataEntryCmpnt.ShowTestEndFormOp(sensPath.RegisterReaders, + volumeCTV, test.ErrLimLo + test.Uncertainty, test.ErrLimHi - test.Uncertainty)); + } + state.AddOperation(checkUiOp); + state.EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.ModelessFormClosed)); + + + if (heatMetersTestParams != null) + { + for (int i = 0; i < Config.Data.HeatMetersCount; i++) + { + BenchControl.Elde.FixedStartRegisterReader.RegisterReader volumeRegisterReader = + sensPath.RegisterReaders[2 * i] as BenchControl.Elde.FixedStartRegisterReader.RegisterReader; + + BenchControl.Elde.FixedStartRegisterReader.RegisterReader energyRegisterReader = + sensPath.RegisterReaders[2 * i + 1] as BenchControl.Elde.FixedStartRegisterReader.RegisterReader; + + if (volumeRegisterReader != null) volumeRegisterReader.EndWMState = dataEntryCmpnt.WMEndState(i); + if (energyRegisterReader != null && dataEntryCmpnt is GenericDevices.IHasHeatMtrStatesForm) + { + energyRegisterReader.EndWMState = (float)(dataEntryCmpnt as GenericDevices.IHasHeatMtrStatesForm).EnergyEndState(i); + } + } + } + else + { + for (int i = 0; i < Config.Data.WMsCount; i++) + { + GenericDevices.IRegisterReader rr = sensPath.RegisterReaders[i]; + + if (rr is BenchControl.Elde.FixedStartRegisterReader.RegisterReader) + (rr as BenchControl.Elde.FixedStartRegisterReader.RegisterReader).EndWMState = dataEntryCmpnt.WMEndState(i); + + if (rr is BenchControl.Network.Camera.RoiForFixedStart.Roi) + (rr as BenchControl.Network.Camera.RoiForFixedStart.Roi).EndWMState = dataEntryCmpnt.WMEndState(i); + } + } + + if (dataEntryCmpnt is GenericDevices.IDataEntryForCamera && (dataEntryCmpnt as GenericDevices.IDataEntryForCamera).SaveImages) + { + /// SaveImages==true ... copy images to the directory that will be archived at the end of the cycle + for (int i = 0; i < sensPath.RegisterReaders.Length; i++) + { + GenericDevices.IRoiForFixedStart roi = sensPath.RegisterReaders[i] as GenericDevices.IRoiForFixedStart; + if (roi != null) + { + string srcDir = Path.Combine(Program.TempImagesDir, BatchRslts.Batch.BatchNr.ToString(), (i + 1).ToString()); + string destDir = Path.Combine(Program.ImagesDir, BatchRslts.Batch.BatchNr.ToString(), (i + 1).ToString()); + try + { + if (File.Exists(Path.Combine(srcDir, fileName))) + { + Directory.CreateDirectory(destDir); + File.Copy(Path.Combine(srcDir, fileName), Path.Combine(destDir, fileName), true); + } + } + catch (Exception exc) + { + log.ErrorFormat("Failed to copy image {0} to {1}: {2}", fileName, destDir, exc.Message); + } + } + } + } + } + + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Test_completed); + //------------------------------------------------ + + /// Make sure the CycleBeginForm is closed so that water meter data (s/n) can be copied into results + if (UIFlowControl.Stop == WaitBeginFormClosed()) goto stopTest; + + /// + /// Populate TestResult data entity with data + /// + Results.Entities.TestRslt tstRslt = BatchRslts.GetTestRslt(testName, test.Part); + + if (tstRslt != null) + { + UpdateTempPressDensAmb(tstRslt); + + /// Main results + tstRslt.MethodClass = TbfComponents.FindComponent(test.Method).ClassName; + tstRslt.StartTime = TestStartTime; + tstRslt.EndTime = TestEndTime; + tstRslt.FlowSetTime = flowSetTime; + + tstRslt.TestTime = Math.Max(1.0, EndTime - StartTime); /// [s] measurement time, at least 1 to prevent division by zero + + tstRslt.PulsesMaster = Convert.ToDouble(cBrd.EtPulses(0)); /// Pulses of the master flow meter (test total) + tstRslt.MassStartRaw = StartMass.Val; + tstRslt.MassStart = massStart; + tstRslt.MassEndRaw = EndMass.Val; + tstRslt.MassEnd = massEnd; + tstRslt.FlowMass = 3600.0 * (tstRslt.MassEnd - tstRslt.MassStart) / tstRslt.TestTime; /// [kg/h] + tstRslt.FlowVolume = 3.6 * LtrPerRefPulse * tstRslt.PulsesMaster / tstRslt.TestTime; /// [m3/h] + tstRslt.VolumeMaster = LtrPerRefPulse * tstRslt.PulsesMaster; /// [l] volume from the master flow meter + tstRslt.Buoyancy = buoyancy; + tstRslt.VolumeCTV = volumeCTV; /// [l] 1000.0f is because density is in [kg/m3] + tstRslt.ConstMasterRaw = outPath.FlowMeter.LtrPerPulse; /// Uncorrected master flowmeter coefficient + tstRslt.ConstMasterCorr = outPath.FlowMeter.LtrPerPulseCorrected(tstRslt.FlowVolume, rangeIx); /// Corrected master pulses per liter + tstRslt.ConstMaster = (tstRslt.VolumeMaster == 0) ? tstRslt.ConstMasterCorr : (LtrPerRefPulse * tstRslt.VolumeCTV / tstRslt.VolumeMaster); + /// Calculated master pulses per liter + tstRslt.ErrorMaster = Config.Formulas.ErrorFromVolumes(tstRslt.VolumeMaster, tstRslt.VolumeCTV); + + tstRslt.FlowMean = (float)RefFlowStat.Average; + tstRslt.FlowStart = (float)RefFlowStat.First; + tstRslt.FlowEnd = (float)RefFlowStat.Last; + tstRslt.FlowMin = (float)RefFlowStat.Min; + tstRslt.FlowMax = (float)RefFlowStat.Max; + + tstRslt.DiverterStart = switchTimeStart; + tstRslt.DiverterEnd = switchTimeEnd; + tstRslt.ErrorFlagsMd = (ErrorFlagsComp != null) ? (sbyte)ErrorFlagsComp.Mode : (sbyte)0; + tstRslt.ErrorFlags = (ErrorFlagsComp != null) ? ErrorFlagsComp.GetErrorFlags(tstRslt, false, true, switchTimeStart, switchTimeEnd) : 0; + + if (compound) + { + /// + /// Compound meters + /// + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (test.Part != 0 && test.Part != Utils.PartNr(i + 1, BatchRslts.Batch.Compound)) continue; + + Results.Entities.MeterTestRslt mainMeterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.CompoundMain); + Results.Entities.MeterTestRslt auxMeterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.CompoundAux); + + for (int isAux = 0; isAux <= 1; isAux++) /// 0=main, 1=aux + { + Results.Entities.MeterTestRslt meterRslt = (isAux == 0) ? mainMeterRslt : auxMeterRslt; + GenericDevices.IRegisterReader regReader = sensPath.RegisterReaders[2 * i + isAux]; + + if (meterRslt != null && regReader != null) + { + meterRslt.RegReaderType = (int)regReader.RegisterReaderType; + meterRslt.PulsesPerLiter = regReader.PulsesPerLtr; + meterRslt.VolumeStart = regReader.BeginWMState; /// [l] + meterRslt.VolumeEnd = regReader.EndWMState; /// [l] + meterRslt.VolumeMeter = meterRslt.VolumeEnd - meterRslt.VolumeStart; /// [l] + meterRslt.VolumeRef = tstRslt.VolumeCTV; /// [l] + meterRslt.PulsesMeter = meterRslt.VolumeMeter; + meterRslt.PulsesMaster = tstRslt.PulsesMaster; + meterRslt.TestTime = tstRslt.TestTime; + meterRslt.Error = Config.Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef); /// Not used for evaluation + } + } + + Results.Entities.MeterTestRslt compoundMeterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.Compound); + + if (compoundMeterRslt != null && mainMeterRslt != null && auxMeterRslt != null) + { + compoundMeterRslt.VolumeRef = tstRslt.VolumeCTV; /// [l] must be calculated before main & aux. meter error + compoundMeterRslt.VolumeMeter = mainMeterRslt.VolumeMeter + auxMeterRslt.VolumeMeter; + compoundMeterRslt.PulsesMaster = tstRslt.PulsesMaster; + compoundMeterRslt.TestTime = tstRslt.TestTime; + compoundMeterRslt.Error = Config.Formulas.ErrorFromVolumes(compoundMeterRslt.VolumeMeter, compoundMeterRslt.VolumeRef); + compoundMeterRslt.Passed = (compoundMeterRslt.Error >= test.GetErrLimLo(tstRslt.FlowMean) + test.Uncertainty) + && (compoundMeterRslt.Error <= test.GetErrLimHi(tstRslt.FlowMean) - test.Uncertainty) + && (tstRslt.ErrorFlags == 0 || tstRslt.ErrorFlagsMode() != Config.Entities.ErrorFlagsMode.On); + mainMeterRslt.Passed = auxMeterRslt.Passed = compoundMeterRslt.Passed; + mainMeterRslt.TestDone = auxMeterRslt.TestDone = compoundMeterRslt.TestDone = true; + tstRslt.TestDone = true; + } + } + } + else if (heatMetersTestParams != null) + { + /// + /// Heat meters + /// + tstRslt.RefEnergy = Energy.Sum * tstRslt.VolumeCTV / VolumeForEnergy.Sum; /// [J] = [J] * [l] / [l] + + tstRslt.Custom1 = (float)TempRefHiStat.Average; + tstRslt.Custom2 = (float)TempRefHiStat.First; + tstRslt.Custom3 = (float)TempRefHiStat.Last; + tstRslt.Custom4 = (float)TempRefHiStat.Min; + tstRslt.Custom5 = (float)TempRefHiStat.Max; + tstRslt.Custom6 = (float)TempRefLoStat.Average; + tstRslt.Custom7 = (float)TempRefLoStat.First; + tstRslt.Custom8 = (float)TempRefLoStat.Last; + tstRslt.Custom9 = (float)TempRefLoStat.Min; + tstRslt.Custom10 = (float)TempRefLoStat.Max; + + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (test.Part != 0 && test.Part != Utils.PartNr(i + 1, BatchRslts.Batch.Compound)) continue; + + Results.Entities.MeterTestRslt volumeRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.HeatMeterVolume); + Results.Entities.MeterTestRslt energyRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.HeatMeterEnergy); + + GenericDevices.IRegisterReader volumeRegReader = + (sensPath.RegisterReaders.Length > 2 * i) ? sensPath.RegisterReaders[2 * i] : null; + + GenericDevices.IRegisterReader energyRegReader = + (sensPath.RegisterReaders.Length > 2 * i + 1) ? sensPath.RegisterReaders[2 * i + 1] : null; + + if (volumeRslt != null && volumeRegReader != null) + { + volumeRslt.PulsesPerLiter = volumeRegReader.PulsesPerLtr; + volumeRslt.VolumeStart = volumeRegReader.BeginWMState; + volumeRslt.VolumeEnd = volumeRegReader.EndWMState; + volumeRslt.VolumeMeter = volumeRslt.VolumeEnd - volumeRslt.VolumeStart; + volumeRslt.VolumeRef = tstRslt.VolumeCTV; + volumeRslt.PulsesMeter = volumeRslt.VolumeMeter; + volumeRslt.PulsesMaster = tstRslt.PulsesMaster; /// <----------------- ??? + volumeRslt.TestTime = tstRslt.TestTime; + + volumeRslt.Error = Config.Formulas.ErrorFromVolumes(volumeRslt.VolumeMeter, volumeRslt.VolumeRef); + volumeRslt.Passed = !heatMetersTestParams.EvaluateVolume || + ((volumeRslt.Error >= test.GetErrLimLo(tstRslt.FlowMean) + test.Uncertainty) && + (volumeRslt.Error <= test.GetErrLimHi(tstRslt.FlowMean) - test.Uncertainty) && + (tstRslt.ErrorFlags == 0 || tstRslt.ErrorFlagsMode() != Config.Entities.ErrorFlagsMode.On)); + volumeRslt.TestDone = true; + tstRslt.TestDone = true; + } + + if (energyRslt != null && energyRegReader != null && dataEntryCmpnt is GenericDevices.IHasHeatMtrStatesForm) + { + volumeRslt.PulsesPerLiter = energyRegReader.PulsesPerLtr; + energyRslt.VolumeStart = (dataEntryCmpnt as GenericDevices.IHasHeatMtrStatesForm).EnergyStartState(i); + energyRslt.VolumeEnd = (dataEntryCmpnt as GenericDevices.IHasHeatMtrStatesForm).EnergyEndState(i); + energyRslt.VolumeMeter = energyRslt.VolumeEnd - energyRslt.VolumeStart; + energyRslt.VolumeRef = tstRslt.RefEnergy; + energyRslt.PulsesMeter = energyRslt.VolumeMeter; + energyRslt.PulsesMaster = tstRslt.PulsesMaster; /// <----------------- ??? + + energyRslt.Error = Config.Formulas.ErrorFromVolumes(energyRslt.VolumeMeter, energyRslt.VolumeRef); + energyRslt.Passed = (energyRslt.Error >= heatMetersTestParams.ErrorLimitLo) + && (energyRslt.Error <= heatMetersTestParams.ErrorLimitHi) + && (tstRslt.ErrorFlags == 0 || tstRslt.ErrorFlagsMode() != Config.Entities.ErrorFlagsMode.On); + energyRslt.TestDone = true; + tstRslt.TestDone = true; + } + } + } + else + { + /// + /// Single meters + /// + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (test.Part != 0 && test.Part != Utils.PartNr(i + 1, BatchRslts.Batch.Compound)) continue; + + Results.Entities.MeterTestRslt meterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.Single); + GenericDevices.IRegisterReader regReader = sensPath.RegisterReaders[i]; + + if (meterRslt != null && regReader != null) + { + meterRslt.RegReaderType = (int)regReader.RegisterReaderType; + meterRslt.PulsesPerLiter = regReader.PulsesPerLtr; + meterRslt.VolumeStart = regReader.BeginWMState; + meterRslt.VolumeEnd = regReader.EndWMState; + meterRslt.VolumeMeter = meterRslt.VolumeEnd - meterRslt.VolumeStart; + meterRslt.VolumeRef = tstRslt.VolumeCTV; /// liter + meterRslt.PulsesMeter = meterRslt.VolumeMeter; + meterRslt.PulsesMaster = tstRslt.PulsesMaster; + meterRslt.TestTime = tstRslt.TestTime; + meterRslt.Error = Config.Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef); + meterRslt.Passed = (meterRslt.Error >= test.GetErrLimLo(tstRslt.FlowMean) + test.Uncertainty) + && (meterRslt.Error <= test.GetErrLimHi(tstRslt.FlowMean) - test.Uncertainty) + && (tstRslt.ErrorFlags == 0 || tstRslt.ErrorFlagsMode() != Config.Entities.ErrorFlagsMode.On); + meterRslt.TestDone = true; + tstRslt.TestDone = true; + } + } + } + + tstRslt.Components = Results.Entities.Components + .UpdateList(BatchRslts.ComponentsList, + new Results.Entities.Components((BenchInfo != null) ? BenchInfo.TestBenchId : 1, + (BenchInfo != null) ? BenchInfo.TestBenchName : "testbench", + inPath.Pump != null ? inPath.Pump.Name : string.Empty, + outPath.FlowMeter != null ? outPath.FlowMeter.Name : string.Empty, + outPath.Scale != null ? outPath.Scale.Name : string.Empty, + outPath.RegulValve != null ? outPath.RegulValve.Name : string.Empty, + outPath.Diverter != null ? outPath.Diverter.Name : string.Empty)); + + /// Update water meter error flags + if (ErrorFlagsComp != null) + { + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (BatchRslts.WaterMeters[i] != null) + { + BatchRslts.WaterMeters[i].ErrorFlags = ErrorFlagsComp.GetWMtrErrorFlags(BatchRslts.WaterMeters[i].MeterTestRslts); + } + } + } + + /// Update results + Bridge.OnTestCompleted(this, new TestCompletedEventArgs(testName, tstRslt)); + } + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.TransitionAfter)); + + /// Append the results to the CSV-file + allResults.Info(TestResult2CsvLine(testName, test.Part)); + + + stopTest: + + StopRecordingStatistics(); + + /// + /// Quit this sequence + /// + if (isLastRepetition || retVal == Event.UiCmdStop || retVal == Event.OpArgumentError + || retVal == Event.Error || retVal == Event.ConfigurationError) + { + State.Create(string.Format("{0}({1}) : Stopping diverter, gate, etc.", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(cBrd.StopPreviousOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.PreviousStopped)); + } + + stopTestWOTransitionAfter: + + /// Create a list with one item 'retVal' (default is Event.Done) and return it + IList retList = new List(1); + retList.Add(retVal); + return retList; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/HeatMeters/Component.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/HeatMeters/Component.cs new file mode 100644 index 00000000..26d37bdc --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/HeatMeters/Component.cs @@ -0,0 +1,40 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; + +namespace TBF.BenchControl.TestMethods.FixedStartMassCollection.HeatMeters +{ + public class Component : ComponentBase, GenericDevices.ITestMethod + { + private static readonly ILog log = LogManager.GetLogger(typeof(Component)); + public override string ToString() + { + return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); + } + + readonly TestMethodCfg testMethodCfg; + + public bool CanTest(MetersKind meters) { return meters == MetersKind.HeatMeter; } + public bool DoTransitions() { return true; } + + public Component() + { + } + + public Component(Generic.IComponentCfg cfg) + : base(cfg) + { + testMethodCfg = cfg as TestMethodCfg; + log.Debug(this.ToString()); + } + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + return (new FixedStartMassCollectionSeq()).Execute(test, repetNr, isLastRepetition, false, testMethodCfg.TestParams, DebugLevel); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/HeatMeters/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/HeatMeters/Factory.cs new file mode 100644 index 00000000..740e57fa --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/HeatMeters/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FixedStartMassCollection.HeatMeters +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Component.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Component(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Component(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this.GetType().Namespace.Substring(29), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/HeatMeters/TestMethodCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/HeatMeters/TestMethodCfg.cs new file mode 100644 index 00000000..a6c7b503 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/HeatMeters/TestMethodCfg.cs @@ -0,0 +1,49 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FixedStartMassCollection.HeatMeters +{ + public class TestMethodCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestMethodCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new TestMethodCfgCtrl(); } + + /// Test parameters + [XmlIgnore] + public TestParams TestParams; + public override IParamsProvider GetRuntimeTestParamsProvider() { return TestParams; } + public override IParamsProvider CreateTestParamsProvider() { return new TestParams(true); } + public override IParamsProvider GetUITestParamsProvider(Test test) + { + return (test.Method == Name) ? base.GetUITestParamsProvider(test) : null; + } + + /// Private parameterless constructor invoked by all other (public) constructors + TestMethodCfg() + { + TestParams = new TestParams(true); + } + + public TestMethodCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + Factory = factory; + ParentName = string.Empty; + } + + public string ToString(int i) + { + return string.Format("Name={0}", Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/HeatMeters/TestMethodCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/HeatMeters/TestMethodCfgCtrl.cs new file mode 100644 index 00000000..a8cdc218 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/HeatMeters/TestMethodCfgCtrl.cs @@ -0,0 +1,69 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FixedStartMassCollection.HeatMeters +{ + public partial class TestMethodCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + TestMethodCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as TestMethodCfg; + Redraw(); + } + } + + public TestMethodCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/HeatMeters/TestMethodCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/HeatMeters/TestMethodCfgCtrl.designer.cs new file mode 100644 index 00000000..aa80b511 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/HeatMeters/TestMethodCfgCtrl.designer.cs @@ -0,0 +1,86 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +namespace TBF.BenchControl.TestMethods.FixedStartMassCollection.HeatMeters +{ + partial class TestMethodCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(137, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 5; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(27, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 4; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(134, 33); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 3; + this.classNameLabel.Text = "ComonentName"; + // + // BasicPrinterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "BasicPrinterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/HeatMeters/TestMethodCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/HeatMeters/TestMethodCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/HeatMeters/TestMethodCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/HeatMeters/TestParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/HeatMeters/TestParams.cs new file mode 100644 index 00000000..ccce54f1 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/HeatMeters/TestParams.cs @@ -0,0 +1,197 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.FixedStartMassCollection.HeatMeters +{ + public class TestParams : TestParamsBase, IParamsProvider, ITestParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestParams) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public float ErrorLimitLo; /// [%] + public float ErrorLimitHi; /// [%] + public bool EvaluateVolume; /// true = evaluate also the volume, false = evaluate only energy + public float TempWarmLo; /// Low limit for warm temperature [°C] + public float TempWarmHi; /// High limit for warm temperature [°C] + public float TempColdLo; /// Low limit for cold temperature [°C] + public float TempColdHi; /// High limit for cold temperature [°C] + public bool FlowMeasuredAtHiTempPipe; /// true = flow measured at high temp. pipe, false = flow measured at low temp. pipe + public float DeltaTempWarm; + public float DeltaTempCold; + public float ChangeInTimeWarm; + public float ChangeInTimeCold; + public string Prompt; + + public override void InitializeAll() + { + FlowMeasuredAtHiTempPipe = false; + } + + + string[] paramNames = new string[] + { + Strings.Err_limit_neg_pct_chdr, + Strings.Err_limit_pos_pct_chdr, + Strings.Evaluate_volume, + "T hi min", + "T hi max", + "T lo min", + "T lo max", + "Flow measured at high temp.pipe", + "Delta T warm", + "Delta T cold", + "Change in time T warm", + "Change in time T cold", + Strings.Prompt, + }; + public override string ParamName(int i) { return paramNames[i]; } + public override int ParamsCount() { return paramNames.Length; } + + public override string ToString(int i) + { + switch (i) + { + case 0: return ErrorLimitLo.ToString(); + case 1: return ErrorLimitHi.ToString(); + case 2: return (EvaluateVolume ? Strings.yes : Strings.no); + case 3: return TempWarmLo.ToString(); + case 4: return TempWarmHi.ToString(); + case 5: return TempColdLo.ToString(); + case 6: return TempColdHi.ToString(); + case 7: return (FlowMeasuredAtHiTempPipe ? Strings.yes : Strings.no); + case 8: return DeltaTempWarm.ToString(); + case 9: return DeltaTempCold.ToString(); + case 10: return ChangeInTimeWarm.ToString(); + case 11: return ChangeInTimeCold.ToString(); + case 12: return Prompt; + default: return string.Empty; + } + } + + public CfgUpdateFlags UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: ErrorLimitLo = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 1: ErrorLimitHi = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 2: EvaluateVolume = strValue.Equals(Strings.yes); return CfgUpdateFlags.None; + case 3: TempWarmLo = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 4: TempWarmHi = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 5: TempColdLo = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 6: TempColdHi = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 7: FlowMeasuredAtHiTempPipe = strValue.Equals(Strings.yes); return CfgUpdateFlags.None; + case 8: DeltaTempWarm = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 9: DeltaTempCold = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 10: ChangeInTimeWarm = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 11: ChangeInTimeCold = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 12: Prompt = strValue; return CfgUpdateFlags.None; + default: return CfgUpdateFlags.None; + } + } + + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + float dummy; + + switch (i) + { + case 0: + case 1: + case 3: + case 4: + case 5: + case 6: + if (Utils.TryParseSFloat(strValue, out dummy)) return true; + break; + case 2: + case 7: + if (strValue.Equals(Strings.yes) || strValue.Equals(Strings.no)) return true; + break; + case 8: + case 9: + case 10: + case 11: + if (Utils.TryParseUFloat(strValue, out dummy)) return true; + break; + case 12: + return true; + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(TestParams prms) + { + prms.ErrorLimitLo = ErrorLimitLo; + prms.ErrorLimitHi = ErrorLimitHi; + prms.EvaluateVolume = EvaluateVolume; + prms.TempWarmLo = TempWarmLo; + prms.TempWarmHi = TempWarmHi; + prms.TempColdLo = TempColdLo; + prms.TempColdHi = TempColdHi; + prms.FlowMeasuredAtHiTempPipe = FlowMeasuredAtHiTempPipe; + prms.DeltaTempWarm = DeltaTempWarm; + prms.DeltaTempCold = DeltaTempCold; + prms.ChangeInTimeWarm = ChangeInTimeWarm; + prms.ChangeInTimeCold = ChangeInTimeCold; + prms.Prompt = Prompt; + } + + public IParamsProvider Clone() + { + TestParams pars = new TestParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateFromDbEntity(ComponentTest dbEntity) + { + if (dbEntity == null) return; + try + { + TestParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as TestParams; + + testParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + test = dbEntity.Test; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + /// + /// Parameterless constructor initializes the parameters + /// + public TestParams() + { + } + + public TestParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public TestParams(ComponentTest testParamsEntity, string componentName, Test test) + { + this.testParamsEntity = testParamsEntity; + this.componentName = componentName; + this.test = test; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/Single/Component.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/Single/Component.cs new file mode 100644 index 00000000..f6703bee --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/Single/Component.cs @@ -0,0 +1,37 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; + +namespace TBF.BenchControl.TestMethods.FixedStartMassCollection.Single +{ + public class Component : ComponentBase, GenericDevices.ITestMethod + { + private static readonly ILog log = LogManager.GetLogger(typeof(Component)); + public override string ToString() + { + return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); + } + + public bool CanTest(MetersKind meters) { return meters == MetersKind.Single; } + public bool DoTransitions() { return true; } + + public Component() + { + } + + public Component(Generic.IComponentCfg cfg) + : base(cfg) + { + log.Debug(this.ToString()); + } + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + return (new FixedStartMassCollectionSeq()).Execute(test, repetNr, isLastRepetition, false, null, DebugLevel); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/Single/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/Single/Factory.cs new file mode 100644 index 00000000..2b623d87 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FixedStartMassCollection/Single/Factory.cs @@ -0,0 +1,27 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; +using TBF.BenchControl.Configs.NameOnly; + +namespace TBF.BenchControl.TestMethods.FixedStartMassCollection.Single +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Component.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Component(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Component(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this.GetType().Namespace.Substring(29), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/Compound/Component.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/Compound/Component.cs new file mode 100644 index 00000000..443e9afd --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/Compound/Component.cs @@ -0,0 +1,40 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; + +namespace TBF.BenchControl.TestMethods.FlyingStart.Compound +{ + public class Component : ComponentBase, GenericDevices.ITestMethod + { + private static readonly ILog log = LogManager.GetLogger(typeof(Component)); + public override string ToString() + { + return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); + } + + public bool CanTest(MetersKind meters) { return meters == MetersKind.Combined; } + public bool DoTransitions() { return true; } + + readonly TestMethodCfg testMethodCfg; + + public Component() + { + } + + public Component(Generic.IComponentCfg cfg) + : base(cfg) + { + testMethodCfg = cfg as TestMethodCfg; + log.Debug(this.ToString()); + } + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + return (new FlyingStartSeq()).Execute(test, repetNr, isLastRepetition, testMethodCfg.TestParams, null, DebugLevel); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/Compound/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/Compound/Factory.cs new file mode 100644 index 00000000..93110bb6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/Compound/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FlyingStart.Compound +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Component.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Component(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Component(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this.GetType().Namespace.Substring(29), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/Compound/TestMethodCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/Compound/TestMethodCfg.cs new file mode 100644 index 00000000..f7a18b7a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/Compound/TestMethodCfg.cs @@ -0,0 +1,49 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FlyingStart.Compound +{ + public class TestMethodCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestMethodCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new TestMethodCfgCtrl(); } + + /// Test parameters + [XmlIgnore] + public TestParams TestParams; + public override IParamsProvider GetRuntimeTestParamsProvider() { return TestParams; } + public override IParamsProvider CreateTestParamsProvider() { return new TestParams(true); } + public override IParamsProvider GetUITestParamsProvider(Test test) + { + return (test.Method == Name) ? base.GetUITestParamsProvider(test) : null; + } + + /// Private parameterless constructor invoked by all other (public) constructors + TestMethodCfg() + { + TestParams = new TestParams(true); + } + + public TestMethodCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + Factory = factory; + ParentName = string.Empty; + } + + public string ToString(int i) + { + return string.Format("Name={0}", Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/Compound/TestMethodCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/Compound/TestMethodCfgCtrl.cs new file mode 100644 index 00000000..73e58ec6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/Compound/TestMethodCfgCtrl.cs @@ -0,0 +1,69 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FlyingStart.Compound +{ + public partial class TestMethodCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + TestMethodCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as TestMethodCfg; + Redraw(); + } + } + + public TestMethodCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/Compound/TestMethodCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/Compound/TestMethodCfgCtrl.designer.cs new file mode 100644 index 00000000..0e0e263c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/Compound/TestMethodCfgCtrl.designer.cs @@ -0,0 +1,86 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +namespace TBF.BenchControl.TestMethods.FlyingStart.Compound +{ + partial class TestMethodCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(137, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 5; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(27, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 4; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(134, 33); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 3; + this.classNameLabel.Text = "ComonentName"; + // + // BasicPrinterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "BasicPrinterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/Compound/TestMethodCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/Compound/TestMethodCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/Compound/TestMethodCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/Compound/TestParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/Compound/TestParams.cs new file mode 100644 index 00000000..0d21bbd5 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/Compound/TestParams.cs @@ -0,0 +1,119 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.FlyingStart.Compound +{ + public class TestParams : TestParamsBase, IParamsProvider, ITestParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestParams) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public bool SupressTrills; /// Main meter readings are ignored during test (suitable for small flows) + + public override void InitializeAll() + { + SupressTrills = false; + } + + + string[] paramNames = new string[] + { + Strings.SupressWMTrills, + }; + public override string ParamName(int i) { return paramNames[i]; } + public override int ParamsCount() { return paramNames.Length; } + + public override string ToString(int i) + { + switch (i) + { + case 0: return (SupressTrills ? Strings.yes : Strings.no); + default: return string.Empty; + } + } + + public CfgUpdateFlags UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: SupressTrills = strValue.Equals(Strings.yes); return CfgUpdateFlags.None; + default: return CfgUpdateFlags.None; + } + } + + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + + switch (i) + { + case 0: + if (strValue.Equals(Strings.yes) || strValue.Equals(Strings.no)) return true; + break; + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(TestParams prms) + { + prms.SupressTrills = this.SupressTrills; + } + + public IParamsProvider Clone() + { + TestParams pars = new TestParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateFromDbEntity(ComponentTest dbEntity) + { + if (dbEntity == null) return; + try + { + TestParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as TestParams; + + testParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + test = dbEntity.Test; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + /// + /// Parameterless constructor initializes the parameters + /// + public TestParams() + { + } + + public TestParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public TestParams(ComponentTest testParamsEntity, string componentName, Test test) + { + this.testParamsEntity = testParamsEntity; + this.componentName = componentName; + this.test = test; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/FlyingStartSeq.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/FlyingStartSeq.cs new file mode 100644 index 00000000..a4aa8390 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/FlyingStartSeq.cs @@ -0,0 +1,1013 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Text; +using log4net; +using TBF.BenchControl; +using TBF.Boxes; +using TBF.Resources; +using TBF.UiBridge; +using TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead; +using Config; +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl.TestMethods.FlyingStart +{ + public class FlyingStartSeq : Sequences.SequenceBase + { + private static readonly ILog log = LogManager.GetLogger(typeof(FlyingStartSeq)); + + /// + /// Flying start mass collection method sequence + /// + /// Test entity + /// + /// Event.Done . . . . . . . OK + /// Event.UiCmdStop . . . . Stopped by the user using the on-screen button STOP + /// Event.OpArgumentError . Target flow is out of range + /// Event.Error . . . . . . Unspecified error + /// + public IList Execute(Config.Entities.Test test, int repetitionNr, bool isLastRepetition, + Compound.TestParams compoundTestParams, + HeatMeters.TestParams heatMetersTestParams, + Config.Entities.DebugMode debugLevel) + { + IList e = new List(); /// Events from currently running operations + Event retVal = Event.Done; + checkUiOp = new Operations.CheckUIOp(true); /// Runs in more then one state + + if (debugLevel == Config.Entities.DebugMode.Simulate) + { + /// + /// Test method simulation + /// + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (compoundTestParams != null) + { + if (test.Name.ToLower().Contains("nok")) MakeSimulatedCompound(test, 1, 0, 4.7f, 0.9f); + else MakeSimulatedCompound(test, 1, 0, 0.7f, 1.0f); + } + else if (heatMetersTestParams != null) + { + MakeSimulatedHeatMeters(test, 1, 0, 1.5f, 1000000, heatMetersTestParams.ErrorLimitLo, heatMetersTestParams.ErrorLimitHi, heatMetersTestParams.EvaluateVolume); + } + else if (test.Name.ToLower().Contains("q3")) MakeSimulated(test, 1, 0, -0.5f); + else if (test.Name.ToLower().Contains("q2")) MakeSimulated(test, 1, 0, 0.5f); + else if (test.Name.ToLower().Contains("q1")) MakeSimulated(test, 1, 0, -5.1f); + else MakeSimulated(test, 1, 0, 0.9f); + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.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 + + for (int i = 0; i < Config.Data.WMsCount; i++) + { + TestMethods.iPerlCommunication.iPerlHead.IperlHead iPerl = ((sensPath.RegisterReaders != null) && (i < sensPath.RegisterReaders.Length)) + ? (sensPath.RegisterReaders[i] as TestMethods.iPerlCommunication.iPerlHead.IperlHead) + : null; + if (iPerl != null) + { + /// TODO: Reimplement + //iPerl.LastTestResult = meterRslt; /// Save this water meter test result to iPerl WM + iPerl.NominalTestFlowLph = 500.0 * (double)(test.Qfrom + test.Qto); /// Ave. + convert to liter/hour + } + } + + //------------------------------------------------------------------ + Bridge.OnActivity(this, string.Format("{0} simulation", test.Name)); + //------------------------------------------------------------------ + + State.Create(string.Format("{0}({1}) : Simulating {0}", test.Method, test.Name)) + .AddOperation(checkUiOp) + .EnterState(); + e = StateMachine.WaitRunDevsRunOps(); + + if (TestAndLogUiCmdStop(test, e)) retVal = Event.UiCmdStop; + + /// Create a list with one item 'retVal' (default is Event.Done) and return it + IList retListSim = new List(1); + retListSim.Add(retVal); + return retListSim; + } + + + Elde.ControlBoardDev cBrd = StateMachine.ControlBoard; + processDataLoggingOp = new TBF.BenchControl.Operations.ProcessDataLoggingOp(processDataLogger, this, heatMetersTestParams != null); + + LtrPerRefPulse = outPath.FlowMeter.LtrPerPulse; /// [ltr/pulse], nominal flow in [m3/h] + + /// Notes: + /// float timeHr = volumeLtr / (1000.0f * targetFlow); + /// float timeSec = 3600.0f * timeHr; + /// int refPulses = (int)(timeSec * (2000.0f * targetFlow / pOut.FlowMeter.NominalFlow)); + int totalPulses = (int)(test.Volume / LtrPerRefPulse + 0.5f); + + int rangeIx = 0; /// Default range, used for non-Elde flowmeters + if (outPath.FlowMeter is Elde.FlowMeter.FlowMeter) + { + Elde.FlowMeter.FlowMeter eldeFM = outPath.FlowMeter as Elde.FlowMeter.FlowMeter; + rangeIx = -1; /// Indicates invalid range + for (int r = 0; r <= 5; r++) + { + if (eldeFM.RangeEnabled(r) && eldeFM.GetTempLo(r) <= test.TempLimLo + && eldeFM.GetTempHi(r) >= test.TempLimHi) + { + rangeIx = r; + } + } + + if (rangeIx == -1) + { + Bridge.OnError(this, Strings.Flow_meter_temperature_range_does_not_fit_this_test_conditions); + retVal = Event.UiCmdStop; + goto stopTestWOStoppingDivGateEtc; + } + } + + //==================================== + loop: + /// Start the test, initialize test results + Bridge.OnTestSelected(this, new TestSelectedEventArgs(test, repetitionNr, inPath, benchPath, outPath, sensPath, totalPulses)); + string testName = Results.Utils.GetTestName(test.Name, test.Repeats, repetitionNr); + TestStartTime = DateTime.Now; + bool atleastOneGenesis = false; + atleastOneGenesis = GenesisHeadBatch.Start(sensPath.RegisterReaders, Program.LocalSettings.LastSNTexts); + + /// + /// Optionally display prompt to emerge temperature meters to appropriate baths for heat meters test + /// + IOperation heatMetersPromptOp = null; + if (heatMetersTestParams != null && !string.IsNullOrEmpty(heatMetersTestParams.Prompt)) + { + /// Make sure the CycleBeginForm is closed + if (UIFlowControl.Stop == WaitBeginFormClosed()) goto stopTest; + + + + + /// + /// Optionally display prompt to emerge temperature meters to appropriate baths for heat meters test + /// + IOperation heatMetersPheatMetersPromptOp = new Operations.MessageBoxOp(heatMetersTestParams.Prompt); + } + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Starting_the_pump); + //------------------------------------------------ + if (inPath.Pump is GenericDevices.IPumpFM) (inPath.Pump as GenericDevices.IPumpFM).TurnOn(test.PumpPower); + /// + State.Create(string.Format("{0}({1}) : Starting the pump", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + // .AddOperation(new Operations.SetAllRegulValvesOp(inPath.RegulValves, inPath.RegulValvesPct, 60)) + .AddOperation(heatMetersPromptOp) + .AddOperation(inPath.Pump != null ? cBrd.SetValvesOp(inPath.Pump, null) : null) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } + while (e.Contains(Event.ValvesBusy) /* || !e.Contains(Event.AllPositionsReached)*/); + + + if (test.TimePump2StartV > 0) + { + State.Create(string.Format("{0}({1}) : Waiting after the pump started", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(new Operations.TimerOp(test.TimePump2StartV)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + } + + + if (benchPath.StopBFValve != null) + { + State.Create(string.Format("{0}({1}) : Opening the stop backflow valve", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(benchPath.StopBFValve, null)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } + while (!e.Contains(Event.ValvesSet)); + } + + + if (test.TimeBeforeFlow > 0) + { + State.Create(string.Format("{0}({1}) : Waiting before flow setting process starts", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(new Operations.TimerOp(test.TimeBeforeFlow)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + } + + + setting_flow: + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Setting_the_flow); + //------------------------------------------------ + int flowSetTime0 = StateMachine.Time; + State.Create(string.Format("{0}({1}) : Setting the flow", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(outPath.RegulValve.SetFlowOp(outPath.FlowMeter, test.Qfrom, test.Qto, outPath.PidCoef, RefFlow, 990)) /// timeout = 16.5 min. + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (e.Contains(Event.OpArgumentError)) { retVal = Event.OpArgumentError; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.RegulValveTimeOut)) + { + Bridge.OnError(this, Strings.Flow_adjustment_failed); + retVal = Event.UiCmdStop; + goto stopTest; + } + if (e.Contains(Event.Next)) goto flow_set; + } + while (!e.Contains(Event.FlowReached)); + + flow_set: + + int flowSetTime = StateMachine.Time - flowSetTime0; + double currentFlow = RefFlow.Val; + + if (heatMetersTestParams != null && heatMetersPath != null) + { + //--------------------------------------------------- + Bridge.OnActivity(this, Strings.Setting_temperature); + //--------------------------------------------------- + + int lastTimeSec = StateMachine.Time; + double Tw_last = 0; + double Tc_last = 0; + + State.Create(string.Format("{0}({1}) : Checking if the temperature is stable", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Next)) goto temperature_set; + + if (TempRefHi1.Val != 0 && TempRefHi2.Val != 0 && TempRefLo1.Val != 0 && TempRefLo2.Val != 0) + { + if (StateMachine.Time - lastTimeSec > 10 || StateMachine.Time - lastTimeSec < 0) + { + double Tw = (TempRefHi1.Val + TempRefHi2.Val) / 2; + double Tc = (TempRefLo1.Val + TempRefLo2.Val) / 2; + if (heatMetersTestParams.TempWarmLo <= Tw && Tw <= heatMetersTestParams.TempWarmHi && + heatMetersTestParams.TempColdLo <= Tc && Tc <= heatMetersTestParams.TempColdHi && + Math.Abs(Tw - Tw_last) <= heatMetersTestParams.ChangeInTimeWarm && + Math.Abs(Tc - Tc_last) <= heatMetersTestParams.ChangeInTimeCold && + Math.Abs(TempRefHi1.Val - TempRefHi2.Val) <= heatMetersTestParams.DeltaTempWarm && + Math.Abs(TempRefLo1.Val - TempRefLo2.Val) <= heatMetersTestParams.DeltaTempCold) + { + goto temperature_set; + } + + lastTimeSec = StateMachine.Time; + Tw_last = Tw; + Tc_last = Tc; + } + } + } + while (true); + } + else if (test.DoControlWaterTemp && benchPath.TempMtrUp != null && benchPath.TempMtrDown != null) + { + //--------------------------------------------------- + Bridge.OnActivity(this, Strings.Setting_temperature); + //--------------------------------------------------- + + State.Create(string.Format("{0}({1}) : Wait until the water temperature is within limits", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Next)) goto temperature_set; + + if (TempUp.Val >= test.TempLimLo && TempUp.Val <= test.TempLimHi && + TempDown.Val >= test.TempLimLo && TempDown.Val <= test.TempLimHi) + { + goto temperature_set; + } + } + while (true); + } + + temperature_set: + + if (atleastOneGenesis) + { + if (test.Name.ToLower().Contains("calib")) + { + GenesisHeadBatch.BatchHolder.Value.MetersLogin(); + GenesisHeadBatch.BatchHolder.Value.MetersInitCalibration(); + + } + if (test.Name.ToLower().Contains("Init")) + { + GenesisHeadBatch.BatchHolder.Value.MetersLogin(); + GenesisHeadBatch.BatchHolder.Value.MetersInitMeasurement(); + } + } + /// + /// Prepare cameras, ROI-s and measurementOperations + /// + + /// Find ROI-s + IList rois = new List(); + foreach (var rr in sensPath.RegisterReaders) + { + GenericDevices.IRoi roi = rr as GenericDevices.IRoi; + if (roi != null && roi.Detected) + { + rois.Add(roi); + } + } + + /// Find cameras + IList cameras = new List(); + foreach (var roi in rois) + { + if (roi.Camera != null && !cameras.Contains(roi.Camera)) + { + roi.Camera.ClearRoiParams(); + cameras.Add(roi.Camera); + } + } + + /// Register ROI-parameters to cameras + foreach (var roi in rois) roi.RegisterRoiToCamera(); + + /// Prepare measurementOperations + IList measureOperations = new List(); + foreach (var camera in cameras) measureOperations.Add(camera.MeasurementOp()); + + + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Test_in_progress); + //------------------------------------------------ + State.Create(string.Format("{0}({1}) : Starting the test", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperations(measureOperations) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation((StateMachine.Ambient != null) + ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) : null) + .AddOperation(processDataLoggingOp) + .AddOperation(cBrd.StartMeasurementOp(outPath, Elde.TestMethods.Synchro, + test.Qfrom, test.Qto, totalPulses, (float)test.TolerRed)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.MeasurementStarted)); + + + foreach (var rr in sensPath.RegisterReaders) + { + GenericDevices.IHasTestName readerWithTstName = rr as GenericDevices.IHasTestName; + if (readerWithTstName != null) + { + readerWithTstName.TestName = test.Name; + readerWithTstName.TestRepeats = test.Repeats; + readerWithTstName.RepetitionNr = repetitionNr; + } + + + if (rr is TestMethods.GenesisCommunication.GenesisHead.GenesisHead) + { + + + (rr as TestMethods.GenesisCommunication.GenesisHead.GenesisHead).StartRead(test.Name, BatchRslts.Batch.BatchNr, repetitionNr); + } + + + + } + + + /// Measurement loop - preparation + readRegistersOp = new Operations.ReadMoreRegistersOp(sensPath.RegisterReaders); + queryEnd1 = cBrd.QueryMeasurementEndOp(); + + int estimtdEndTime = StateMachine.Time + (int)test.TstTime; + StartNewStatistics(StateMachine.Time, BatchRslts.Batch.BatchNr, test.Name, repetitionNr); + + /// Measurement loop - begin + State.Create("Read water meters") + .AddOperation(checkUiOp) + .AddOperations(measureOperations) + .AddOperation(readRegistersOp) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation((StateMachine.Ambient != null) + ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) + : null) + .AddOperation(queryEnd1) + .AddOperation(processDataLoggingOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.MeasurementCompleted)) goto test_completed; + + //------------------------------------------------ + int remainingTime = Math.Max(estimtdEndTime - StateMachine.Time, 0); + if (remainingTime > 60) + { + Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", Strings.Test_in_progress, remainingTime / 60, "min", remainingTime % 60, Strings.sec)); + } + else + { + Bridge.OnActivity(this, string.Format("{0} ... {1} s", Strings.Test_in_progress, remainingTime)); + } + //------------------------------------------------ + + RefFreq.Val = cBrd.ReferenceFreq; + RefFlow.Val = cBrd.ReferenceFlow; + + UpdateAllStatistics(StateMachine.Time); + + if (heatMetersTestParams != null) + { + if (lastEnergyUpdateTime == 0) + { + lastEnergyUpdateTime = StateMachine.Time; + } + else + { + //double deltaTime = (double)(StateMachine.Time - lastEnergyUpdateTime); + double T_in = (TempRefHi1.Val + TempRefHi2.Val) / 2; /// [°C] + double T_out = (TempRefLo1.Val + TempRefLo2.Val) / 2; /// [°C] + double deltaVolume = LtrPerRefPulse * RefPulsesDelta; /// [l] + double deltaEnergy = (0.001 * deltaVolume) * (T_in - T_out) * Config.Formulas.HeatCoefficientWater(16, T_in, T_out, heatMetersTestParams.FlowMeasuredAtHiTempPipe); /// [J] = [m3] * [K] * [J/(m3 K)] + Energy.Update(deltaEnergy); + VolumeForEnergy.Update(deltaVolume); + lastEnergyUpdateTime = StateMachine.Time; + } + } + + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + } + while (true); + /// Measurement loop - end + + test_completed: + + StopRecordingStatistics(); + + if (test.Name.ToLower().Contains("calib")) + { + GenesisHeadBatch.BatchHolder.Value.MetersStopCalibration(); + } + else + { + GenesisHeadBatch.BatchHolder.Value.MetersStopMeasurement(); + } + + + + + + + + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Test_completed); + //------------------------------------------------ + + TestEndTime = DateTime.Now; + + /// Make sure the CycleBeginForm is closed so that water meter data (s/n) can be copied into results + if (heatMetersPromptOp == null) + { + if (UIFlowControl.Stop == WaitBeginFormClosed()) goto stopTest; + } + + /// + /// Populate TestResult data entity with data + /// + Results.Entities.TestRslt tstRslt = BatchRslts.GetTestRslt(testName, test.Part); + + if (tstRslt != null) + { + UpdateTempPressDensAmb(tstRslt); + + /// Main results + tstRslt.MethodClass = TbfComponents.FindComponent(test.Method).ClassName; + tstRslt.StartTime = TestStartTime; + tstRslt.EndTime = TestEndTime; + tstRslt.FlowSetTime = flowSetTime; + tstRslt.TestTime = cBrd.TTime; /// [s] measurement time + tstRslt.PulsesMaster = Convert.ToDouble(cBrd.EtPulses(0)); /// Pulses of the master flow meter (test total) + tstRslt.MassStartRaw = 0; + tstRslt.MassStart = 0; + tstRslt.MassEndRaw = 0; + tstRslt.MassEnd = 0; + tstRslt.FlowMass = 0; /// [kg/h] + tstRslt.FlowVolume = 3.6 * LtrPerRefPulse * tstRslt.PulsesMaster / tstRslt.TestTime; /// [m3/h] + tstRslt.Buoyancy = Config.Formulas.Buoyancy(); + tstRslt.VolumeMaster = LtrPerRefPulse * tstRslt.PulsesMaster; /// [l] volume from the master flow meter + tstRslt.ConstMasterRaw = outPath.FlowMeter.LtrPerPulse; /// Uncorrected master flowmeter coefficient + tstRslt.ConstMasterCorr = outPath.FlowMeter.LtrPerPulseCorrected(tstRslt.FlowVolume, rangeIx); /// Corrected master pulses per liter + tstRslt.ConstMaster = tstRslt.ConstMasterCorr; + tstRslt.VolumeCTV = tstRslt.ConstMaster * tstRslt.PulsesMaster; /// [l] 1000.0f is because density is in [kg/m3] + try + { + tstRslt.ErrorMaster = (tstRslt.ConstMasterRaw - tstRslt.ConstMasterCorr) / tstRslt.ConstMasterCorr * 100; /// Cannot be determined without a mass measurement + + } + catch (Exception exception) + { + tstRslt.ErrorMaster = 99.9; + } + + tstRslt.FlowMean = (float)RefFlowStat.Average; + tstRslt.FlowStart = (float)RefFlowStat.First; + tstRslt.FlowEnd = (float)RefFlowStat.Last; + tstRslt.FlowMin = (float)RefFlowStat.Min; + tstRslt.FlowMax = (float)RefFlowStat.Max; + + tstRslt.DiverterStart = 0; + tstRslt.DiverterEnd = 0; + tstRslt.ErrorFlagsMd = (ErrorFlagsComp != null) ? (sbyte)ErrorFlagsComp.Mode : (sbyte)0; + tstRslt.ErrorFlags = (ErrorFlagsComp != null) ? ErrorFlagsComp.GetErrorFlags(tstRslt, false, false, 0, 0) : 0; + + if (compoundTestParams != null) + { + /// + /// Compound meters + /// + /// TODO + } + else if (heatMetersTestParams != null) + { + /// + + + + + + + + /// Heat meters + /// + tstRslt.RefEnergy = Energy.Sum * tstRslt.VolumeCTV / VolumeForEnergy.Sum; /// [J] = [J] * [l] / [l] + + tstRslt.Custom1 = (float)TempRefHiStat.Average; + tstRslt.Custom2 = (float)TempRefHiStat.First; + tstRslt.Custom3 = (float)TempRefHiStat.Last; + tstRslt.Custom4 = (float)TempRefHiStat.Min; + tstRslt.Custom5 = (float)TempRefHiStat.Max; + tstRslt.Custom6 = (float)TempRefLoStat.Average; + tstRslt.Custom7 = (float)TempRefLoStat.First; + tstRslt.Custom8 = (float)TempRefLoStat.Last; + tstRslt.Custom9 = (float)TempRefLoStat.Min; + tstRslt.Custom10 = (float)TempRefLoStat.Max; + + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (test.Part != 0 && test.Part != Utils.PartNr(i + 1, BatchRslts.Batch.Compound)) continue; + + Results.Entities.MeterTestRslt volumeRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.HeatMeterVolume); + Results.Entities.MeterTestRslt energyRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.HeatMeterEnergy); + + BenchControl.GenericDevices.IRegisterReader volumeRegReader = + (sensPath.RegisterReaders.Length > 2 * i) ? sensPath.RegisterReaders[2 * i] : null; + + BenchControl.GenericDevices.IRegisterReader energyRegReader = + (sensPath.RegisterReaders.Length > 2 * i + 1) ? sensPath.RegisterReaders[2 * i + 1] : null; + + if (volumeRslt != null && volumeRegReader != null) + { + volumeRslt.PulsesPerLiter = volumeRegReader.PulsesPerLtr; /// [l ^ -1] + volumeRslt.PulsesMeter = Convert.ToDouble(volumeRegReader.WMPulses); + volumeRslt.PulsesMaster = Convert.ToDouble(volumeRegReader.WMRefPulses); + volumeRslt.VolumeStart = 0; + volumeRslt.VolumeEnd = 0; + volumeRslt.VolumeMeter = volumeRslt.PulsesMeter * volumeRegReader.LtrsPerPulse; /// [l] + volumeRslt.VolumeRef = volumeRslt.PulsesMaster * tstRslt.ConstMaster; /// [l] + volumeRslt.TestTime = tstRslt.TestTime; /// [s] + + volumeRslt.Error = Config.Formulas.ErrorFromVolumes(volumeRslt.VolumeMeter, volumeRslt.VolumeRef); + volumeRslt.Passed = !heatMetersTestParams.EvaluateVolume || + ((volumeRslt.Error >= test.GetErrLimLo(tstRslt.FlowMean) + test.Uncertainty) && + (volumeRslt.Error <= test.GetErrLimHi(tstRslt.FlowMean) - test.Uncertainty) && + (tstRslt.ErrorFlags == 0 || tstRslt.ErrorFlagsMode() != Config.Entities.ErrorFlagsMode.On)); + volumeRslt.TestDone = true; + tstRslt.TestDone = true; + } + + if (energyRslt != null && energyRegReader != null) + { + energyRslt.PulsesPerLiter = energyRegReader.PulsesPerLtr; /// [kWh ^ -1] + energyRslt.PulsesMeter = Convert.ToDouble(energyRegReader.WMPulses); + energyRslt.PulsesMaster = Convert.ToDouble(energyRegReader.WMRefPulses); + energyRslt.VolumeStart = 0; + energyRslt.VolumeEnd = 0; + energyRslt.VolumeRef = tstRslt.RefEnergy * (energyRslt.PulsesMaster / tstRslt.PulsesMaster); /// [J] + energyRslt.VolumeMeter = energyRslt.PulsesMeter * Config.Units.ConvertFrom(Config.Unit.kWh, energyRegReader.LtrsPerPulse); /// [J] + energyRslt.TestTime = tstRslt.TestTime; /// [s] + + energyRslt.Error = Config.Formulas.ErrorFromVolumes(energyRslt.VolumeMeter, energyRslt.VolumeRef); + energyRslt.Passed = (energyRslt.Error >= heatMetersTestParams.ErrorLimitLo) + && (energyRslt.Error <= heatMetersTestParams.ErrorLimitHi) + && (tstRslt.ErrorFlags == 0 || tstRslt.ErrorFlagsMode() != Config.Entities.ErrorFlagsMode.On); + energyRslt.TestDone = true; + tstRslt.TestDone = true; + } + } + } + else + { + /// + /// Single meters + /// + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (test.Part != 0 && test.Part != Utils.PartNr(i + 1, BatchRslts.Batch.Compound)) continue; + + Results.Entities.MeterTestRslt meterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.Single); + GenericDevices.IRegisterReader regReader = sensPath.RegisterReaders[i]; + TestMethods.GenesisCommunication.GenesisHead.GenesisHead Genesis = regReader as TestMethods.GenesisCommunication.GenesisHead.GenesisHead; + + GenericDevices.IDatastreamReader dstrReader = regReader as GenericDevices.IDatastreamReader; + TestMethods.iPerlCommunication.iPerlHead.IperlHead iPerl = regReader as TestMethods.iPerlCommunication.iPerlHead.IperlHead; + + GenericDevices.IRoi cameraRoi = regReader as GenericDevices.IRoi; + + if (meterRslt != null && regReader != null) + { + meterRslt.RegReaderType = (int)regReader.RegisterReaderType; + meterRslt.PulsesPerLiter = regReader.PulsesPerLtr; + meterRslt.PulsesMeter = Convert.ToDouble(regReader.WMPulses); + meterRslt.PulsesMaster = Convert.ToDouble(regReader.WMRefPulses); + + + + + + + if (Genesis != null) + { + + Genesis.Stop(tstRslt.TestTime, tstRslt.VolumeCTV); + + meterRslt.TimestampStart = Genesis.TimestampSecStart; + meterRslt.TimestampEnd = Genesis.TimestampSecEnd; + meterRslt.TestTime = Genesis.WMTestTime; + meterRslt.VolumeStart = Genesis.BeginWMState; + meterRslt.VolumeEnd = Genesis.EndWMState; /// liter + meterRslt.VolumeMeter = Math.Abs(Genesis.WMVolume); + meterRslt.VolumeRef = tstRslt.VolumeCTV; + if (GenesisHeadBatch.MeterIdDetailResults == null) + { + Genesis.Log("MeterIdDetailResults na!"); + } + else + { + if (Genesis.DetailedResults != null) + { + try + { + GenesisHeadBatch.MeterIdDetailResults.Add(meterRslt.SerialNr(), Genesis.DetailedResults); + } + catch (Exception ex) + { + Genesis.Log(ex.Message.ToString()); + } + + } + else + { + Genesis.Log("DetailedResults na!"); + } + + } + + + + + Genesis.Log("VolumeRef=" + meterRslt.VolumeRef); + Genesis.Log("TestTime Meter =" + meterRslt.TestTime + "S, test time ref =" + tstRslt.TestTime + "s"); + + + + + + + + + Genesis.Log(" results for " + test.Name); + Genesis.Log(" Ref Vol = " + meterRslt.VolumeRef + " m³"); + Genesis.Log(" Ref Time = " + tstRslt.TestTime + " s"); + Genesis.Log(" Meter Time = " + meterRslt.TestTime + " s"); + Genesis.Log(" Meter Vol = " + meterRslt.VolumeMeter + " m³"); + + var calError = Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef); + Genesis.Log(" MeterError = " + calError.ToString() + " %"); + + + + } + else + { + + + + + + + + + if (dstrReader != null) + { + meterRslt.TimestampStart = dstrReader.TimestampSecStart; + meterRslt.TimestampEnd = dstrReader.NoSamples ? (dstrReader.TimestampSecStart + tstRslt.TestTime) : dstrReader.TimestampSecEnd; + meterRslt.TestTime = meterRslt.TimestampEnd - meterRslt.TimestampStart; + meterRslt.VolumeStart = dstrReader.VolumeLtrStart; /// liter + meterRslt.VolumeEnd = dstrReader.VolumeLtrEnd; /// liter + meterRslt.VolumeMeter = Math.Abs(dstrReader.VolumeLtrEnd - dstrReader.VolumeLtrStart); + meterRslt.VolumeRef = tstRslt.VolumeCTV * meterRslt.TestTime / tstRslt.TestTime; + + + + + + + + + + + + + + if (iPerl != null) + { + if (iPerl.ResultCode != 0 && (meterRslt.WaterMeter.ResultCode & (int)Results.Entities.ResultCode.OptoErrorCodeMask) == 0) + { + meterRslt.WaterMeter.ResultCode |= iPerl.ResultCode; + } + + + + + + + +#if IPERL + meterRslt.WaterMeter.CalibFactor = (iPerl.CalibrationStruct != null) ? iPerl.CalibrationStruct.Calibration : 0; + meterRslt.WaterMeter.Q2Correction = iPerl.Q2Correction; + meterRslt.WaterMeter.Q2CorrRFlow = iPerl.Q2CorrRFlow; + meterRslt.WaterMeter.Q2CorrLFlow = iPerl.Q2CorrLFlow; +#endif + iPerl.LastTestResult2 = iPerl.LastTestResult; /// Save shift previous test result + iPerl.LastTestResult = meterRslt; /// Save this test result + iPerl.NominalTestFlowLph = 500.0 * (test.Qfrom + test.Qto); /// Ave. + convert to liter/hour + } + } + else if (cameraRoi != null) + { + meterRslt.TimestampStart = cameraRoi.TimestampStart; /// second + meterRslt.TimestampEnd = cameraRoi.TimestampEnd; /// second + + + meterRslt.VolumeStart = cameraRoi.VolumeStart; /// liter + meterRslt.VolumeEnd = cameraRoi.VolumeEnd; /// liter + meterRslt.VolumeMeter = cameraRoi.VolumeEnd - cameraRoi.VolumeStart; /// liter + + if (meterRslt.VolumeMeter != 0) + { + /// Normal measurement with camera + meterRslt.TestTime = cameraRoi.TimestampEnd - cameraRoi.TimestampStart; /// second + meterRslt.VolumeRef = tstRslt.VolumeCTV * meterRslt.TestTime / tstRslt.TestTime; + } + else + { + /// None or one pulse from the water meter using camera + meterRslt.TestTime = tstRslt.TestTime; + meterRslt.VolumeRef = tstRslt.VolumeCTV; + } + } + else + { + + meterRslt.VolumeStart = 0; + meterRslt.VolumeEnd = 0; + meterRslt.VolumeMeter = meterRslt.PulsesMeter * regReader.LtrsPerPulse; /// liter + /// + if (regReader.WMPulses > 1) + { + /// Normal measurement + meterRslt.TestTime = cBrd.ImpulseTime(i + 1); + meterRslt.VolumeRef = meterRslt.PulsesMaster * tstRslt.ConstMaster; /// liter + } + else + { + /// None or one pulse from the water meter + meterRslt.TestTime = tstRslt.TestTime; + meterRslt.VolumeRef = tstRslt.VolumeCTV; /// liter + } + } + } + +#if TEST_MODE + if (!BatchRslts.IsProduction() && + ((test.Name.ToLower().Contains("q2") && Math.Abs(meterRslt.Error) > 2.0 && Math.Abs(meterRslt.Error) <= 4.0) || + (test.Name.ToLower().Contains("q1") && Math.Abs(meterRslt.Error) > 5.0 && Math.Abs(meterRslt.Error) <= 10.0))) + { + meterRslt.KorrErrQ = meterRslt.Error; + meterRslt.Error /= 2.0; + meterRslt.VolumeMeter = (1.0 + meterRslt.Error / 100.0) * meterRslt.VolumeRef; + meterRslt.PulsesMeter = meterRslt.VolumeMeter * regReader.PulsesPerLtr; + + if (meterRslt.VolumeEnd > meterRslt.VolumeStart) + { + meterRslt.VolumeEnd = meterRslt.VolumeStart + meterRslt.VolumeMeter; + } + else if (meterRslt.VolumeEnd < meterRslt.VolumeStart) + { + meterRslt.VolumeEnd = meterRslt.VolumeStart - meterRslt.VolumeMeter; + } + } + else + { + meterRslt.KorrErrQ = 0; + } +#endif + meterRslt.Error = Config.Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef); + + + meterRslt.Passed = (meterRslt.Error >= test.GetErrLimLo(tstRslt.FlowMean) + test.Uncertainty) + && (meterRslt.Error <= test.GetErrLimHi(tstRslt.FlowMean) - test.Uncertainty) + && (tstRslt.ErrorFlags == 0 || tstRslt.ErrorFlagsMode() != Config.Entities.ErrorFlagsMode.On); + meterRslt.TestDone = true; + tstRslt.TestDone = true; + } + } + } + + tstRslt.Components = Results.Entities.Components + .UpdateList(BatchRslts.ComponentsList, + new Results.Entities.Components((BenchInfo != null) ? BenchInfo.TestBenchId : 1, + (BenchInfo != null) ? BenchInfo.TestBenchName : "testbench", + inPath.Pump != null ? inPath.Pump.Name : string.Empty, + outPath.FlowMeter != null ? outPath.FlowMeter.Name : string.Empty, + outPath.Scale != null ? outPath.Scale.Name : string.Empty, + outPath.RegulValve != null ? outPath.RegulValve.Name : string.Empty, + outPath.Diverter != null ? outPath.Diverter.Name : string.Empty)); + + /// Update water meter error flags + if (ErrorFlagsComp != null) + { + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (BatchRslts.WaterMeters[i] != null) + { + BatchRslts.WaterMeters[i].ErrorFlags = ErrorFlagsComp.GetWMtrErrorFlags(BatchRslts.WaterMeters[i].MeterTestRslts); + } + } + } + + /// Update results + Bridge.OnTestCompleted(this, new TestCompletedEventArgs(testName, tstRslt)); + } + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.TransitionAfter)); + + /// Append the results to the CSV-file + allResults.Info(TestResult2CsvLine(testName, test.Part)); + + if (!String.IsNullOrEmpty(test.Procedure.ResultsWriter)) + { + string[] writers = StateMachine.Procedure.ResultsWriter.Split(new char[] { '~' }); + foreach (var writerName in writers) + { + IResultsWriter writer = TbfComponents.FindComponent(writerName) as IResultsWriter; + if (writer != null && writer is DB.SensusLa.Database) + { + var SensusLaWriter = ((DB.SensusLa.Database)writer); + + State.Create(string.Format("{0}({1}) : Store results into db.", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(SensusLaWriter.WriteResultsOp(tstRslt, BatchRslts, GenesisHeadBatch.MeterIdDetailResults)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + } + while (!e.Contains(Event.Error) && !e.Contains(Event.ResultsWritten) && !e.Contains(Event.ResultsNotWritten)); + + + + + } + } + } + + + stopTest: + GenesisHeadBatch.BatchHolder.Value.RemoveAllMeters(); + StopRecordingStatistics(); + + /// + /// Quit this sequence + /// + if (isLastRepetition || retVal == Event.UiCmdStop || retVal == Event.OpArgumentError + || retVal == Event.Error || retVal == Event.ConfigurationError) + { + State.Create(string.Format("{0}({1}) : Stopping diverter, gate, etc.", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(cBrd.StopPreviousOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { if (retVal == Event.Done) retVal = Event.UiCmdStop; break; } + } + while (!e.Contains(Event.PreviousStopped)); + } + + stopTestWOStoppingDivGateEtc: + //GenesisHeadBatch.BatchHolder.Value.RemoveAllMeters(); + /// Create a list with one item 'retVal' (default is Event.Done) and return it + IList retList = new List(1); + retList.Add(retVal); + return retList; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/HeatMeters/Component.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/HeatMeters/Component.cs new file mode 100644 index 00000000..caa955d8 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/HeatMeters/Component.cs @@ -0,0 +1,40 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; + +namespace TBF.BenchControl.TestMethods.FlyingStart.HeatMeters +{ + public class Component : ComponentBase, GenericDevices.ITestMethod + { + private static readonly ILog log = LogManager.GetLogger(typeof(Component)); + public override string ToString() + { + return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); + } + + public bool CanTest(MetersKind meters) { return meters == MetersKind.HeatMeter; } + public bool DoTransitions() { return true; } + + readonly TestMethodCfg testMethodCfg; + + public Component() + { + } + + public Component(Generic.IComponentCfg cfg) + : base(cfg) + { + testMethodCfg = cfg as TestMethodCfg; + log.Debug(this.ToString()); + } + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + return (new FlyingStartSeq()).Execute(test, repetNr, isLastRepetition, null, testMethodCfg.TestParams, DebugLevel); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/HeatMeters/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/HeatMeters/Factory.cs new file mode 100644 index 00000000..bdadd097 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/HeatMeters/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FlyingStart.HeatMeters +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Component.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Component(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Component(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this.GetType().Namespace.Substring(29), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/HeatMeters/TestMethodCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/HeatMeters/TestMethodCfg.cs new file mode 100644 index 00000000..c59aa22b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/HeatMeters/TestMethodCfg.cs @@ -0,0 +1,49 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FlyingStart.HeatMeters +{ + public class TestMethodCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestMethodCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new TestMethodCfgCtrl(); } + + /// Test parameters + [XmlIgnore] + public TestParams TestParams; + public override IParamsProvider GetRuntimeTestParamsProvider() { return TestParams; } + public override IParamsProvider CreateTestParamsProvider() { return new TestParams(true); } + public override IParamsProvider GetUITestParamsProvider(Test test) + { + return (test.Method == Name) ? base.GetUITestParamsProvider(test) : null; + } + + /// Private parameterless constructor invoked by all other (public) constructors + TestMethodCfg() + { + TestParams = new TestParams(true); + } + + public TestMethodCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + Factory = factory; + ParentName = string.Empty; + } + + public string ToString(int i) + { + return string.Format("Name={0}", Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/HeatMeters/TestMethodCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/HeatMeters/TestMethodCfgCtrl.cs new file mode 100644 index 00000000..11c2a5a6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/HeatMeters/TestMethodCfgCtrl.cs @@ -0,0 +1,69 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FlyingStart.HeatMeters +{ + public partial class TestMethodCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + TestMethodCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as TestMethodCfg; + Redraw(); + } + } + + public TestMethodCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/HeatMeters/TestMethodCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/HeatMeters/TestMethodCfgCtrl.designer.cs new file mode 100644 index 00000000..9c17f60f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/HeatMeters/TestMethodCfgCtrl.designer.cs @@ -0,0 +1,86 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +namespace TBF.BenchControl.TestMethods.FlyingStart.HeatMeters +{ + partial class TestMethodCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(137, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 5; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(27, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 4; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(134, 33); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 3; + this.classNameLabel.Text = "ComonentName"; + // + // BasicPrinterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "BasicPrinterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/HeatMeters/TestMethodCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/HeatMeters/TestMethodCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/HeatMeters/TestMethodCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/HeatMeters/TestParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/HeatMeters/TestParams.cs new file mode 100644 index 00000000..2762c399 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/HeatMeters/TestParams.cs @@ -0,0 +1,197 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.FlyingStart.HeatMeters +{ + public class TestParams : TestParamsBase, IParamsProvider, ITestParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestParams) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public float ErrorLimitLo; /// [%] + public float ErrorLimitHi; /// [%] + public bool EvaluateVolume; /// true = evaluate also the volume, false = evaluate only energy + public float TempWarmLo; /// Low limit for warm temperature [°C] + public float TempWarmHi; /// High limit for warm temperature [°C] + public float TempColdLo; /// Low limit for cold temperature [°C] + public float TempColdHi; /// High limit for cold temperature [°C] + public bool FlowMeasuredAtHiTempPipe; /// true = flow measured at high temp. pipe, false = flow measured at low temp. pipe + public float DeltaTempWarm; + public float DeltaTempCold; + public float ChangeInTimeWarm; + public float ChangeInTimeCold; + public string Prompt; + + public override void InitializeAll() + { + FlowMeasuredAtHiTempPipe = false; + } + + + string[] paramNames = new string[] + { + Strings.Err_limit_neg_pct_chdr, + Strings.Err_limit_pos_pct_chdr, + Strings.Evaluate_volume, + "T hi min", + "T hi max", + "T lo min", + "T lo max", + "Flow measured at high temp.pipe", + "Delta T warm", + "Delta T cold", + "Change in time T warm", + "Change in time T cold", + Strings.Prompt, + }; + public override string ParamName(int i) { return paramNames[i]; } + public override int ParamsCount() { return paramNames.Length; } + + public override string ToString(int i) + { + switch (i) + { + case 0: return ErrorLimitLo.ToString(); + case 1: return ErrorLimitHi.ToString(); + case 2: return (EvaluateVolume ? Strings.yes : Strings.no); + case 3: return TempWarmLo.ToString(); + case 4: return TempWarmHi.ToString(); + case 5: return TempColdLo.ToString(); + case 6: return TempColdHi.ToString(); + case 7: return (FlowMeasuredAtHiTempPipe ? Strings.yes : Strings.no); + case 8: return DeltaTempWarm.ToString(); + case 9: return DeltaTempCold.ToString(); + case 10: return ChangeInTimeWarm.ToString(); + case 11: return ChangeInTimeCold.ToString(); + case 12: return Prompt; + default: return string.Empty; + } + } + + public CfgUpdateFlags UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: ErrorLimitLo = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 1: ErrorLimitHi = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 2: EvaluateVolume = strValue.Equals(Strings.yes); return CfgUpdateFlags.None; + case 3: TempWarmLo = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 4: TempWarmHi = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 5: TempColdLo = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 6: TempColdHi = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 7: FlowMeasuredAtHiTempPipe = strValue.Equals(Strings.yes); return CfgUpdateFlags.None; + case 8: DeltaTempWarm = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 9: DeltaTempCold = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 10: ChangeInTimeWarm = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 11: ChangeInTimeCold = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 12: Prompt = strValue; return CfgUpdateFlags.None; + default: return CfgUpdateFlags.None; + } + } + + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + float dummy; + + switch (i) + { + case 0: + case 1: + case 3: + case 4: + case 5: + case 6: + if (Utils.TryParseSFloat(strValue, out dummy)) return true; + break; + case 2: + case 7: + if (strValue.Equals(Strings.yes) || strValue.Equals(Strings.no)) return true; + break; + case 8: + case 9: + case 10: + case 11: + if (Utils.TryParseUFloat(strValue, out dummy)) return true; + break; + case 12: + return true; + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(TestParams prms) + { + prms.ErrorLimitLo = ErrorLimitLo; + prms.ErrorLimitHi = ErrorLimitHi; + prms.EvaluateVolume = EvaluateVolume; + prms.TempWarmLo = TempWarmLo; + prms.TempWarmHi = TempWarmHi; + prms.TempColdLo = TempColdLo; + prms.TempColdHi = TempColdHi; + prms.FlowMeasuredAtHiTempPipe = FlowMeasuredAtHiTempPipe; + prms.DeltaTempWarm = DeltaTempWarm; + prms.DeltaTempCold = DeltaTempCold; + prms.ChangeInTimeWarm = ChangeInTimeWarm; + prms.ChangeInTimeCold = ChangeInTimeCold; + prms.Prompt = Prompt; + } + + public IParamsProvider Clone() + { + TestParams pars = new TestParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateFromDbEntity(ComponentTest dbEntity) + { + if (dbEntity == null) return; + try + { + TestParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as TestParams; + + testParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + test = dbEntity.Test; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + /// + /// Parameterless constructor initializes the parameters + /// + public TestParams() + { + } + + public TestParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public TestParams(ComponentTest testParamsEntity, string componentName, Test test) + { + this.testParamsEntity = testParamsEntity; + this.componentName = componentName; + this.test = test; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/Single/Component.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/Single/Component.cs new file mode 100644 index 00000000..83dbc9bd --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/Single/Component.cs @@ -0,0 +1,37 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; + +namespace TBF.BenchControl.TestMethods.FlyingStart.Single +{ + public class Component : ComponentBase, GenericDevices.ITestMethod + { + private static readonly ILog log = LogManager.GetLogger(typeof(Component)); + public override string ToString() + { + return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); + } + + public bool CanTest(MetersKind meters) { return meters == MetersKind.Single; } + public bool DoTransitions() { return true; } + + public Component() + { + } + + public Component(Generic.IComponentCfg cfg) + : base(cfg) + { + log.Debug(this.ToString()); + } + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + return (new FlyingStartSeq()).Execute(test, repetNr, isLastRepetition, null, null, DebugLevel); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/Single/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/Single/Factory.cs new file mode 100644 index 00000000..3a010fac --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStart/Single/Factory.cs @@ -0,0 +1,27 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; +using TBF.BenchControl.Configs.NameOnly; + +namespace TBF.BenchControl.TestMethods.FlyingStart.Single +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Component.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Component(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Component(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this.GetType().Namespace.Substring(29), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Compound/Component.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Compound/Component.cs new file mode 100644 index 00000000..594b625f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Compound/Component.cs @@ -0,0 +1,40 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; + +namespace TBF.BenchControl.TestMethods.FlyingStartFirstRepetWithMassColl.Compound +{ + public class Component : ComponentBase, GenericDevices.ITestMethod + { + private static readonly ILog log = LogManager.GetLogger(typeof(Component)); + public override string ToString() + { + return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); + } + + public bool CanTest(MetersKind meters) { return meters == MetersKind.Combined; } + public bool DoTransitions() { return true; } + + readonly TestMethodCfg testMethodCfg; + + public Component() + { + } + + public Component(Generic.IComponentCfg cfg) + : base(cfg) + { + testMethodCfg = cfg as TestMethodCfg; + log.Debug(this.ToString()); + } + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + return (new FlyingStartFirstRepetWithMassCollSeq()).Execute(test, repetNr, isLastRepetition, null, testMethodCfg.TestParams, null, DebugLevel); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Compound/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Compound/Factory.cs new file mode 100644 index 00000000..12593527 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Compound/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FlyingStartFirstRepetWithMassColl.Compound +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Component.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Component(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Component(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this.GetType().Namespace.Substring(29), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Compound/TestMethodCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Compound/TestMethodCfg.cs new file mode 100644 index 00000000..3741df37 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Compound/TestMethodCfg.cs @@ -0,0 +1,49 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FlyingStartFirstRepetWithMassColl.Compound +{ + public class TestMethodCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestMethodCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new TestMethodCfgCtrl(); } + + /// Test parameters + [XmlIgnore] + public TestParams TestParams; + public override IParamsProvider GetRuntimeTestParamsProvider() { return TestParams; } + public override IParamsProvider CreateTestParamsProvider() { return new TestParams(true); } + public override IParamsProvider GetUITestParamsProvider(Test test) + { + return (test.Method == Name) ? base.GetUITestParamsProvider(test) : null; + } + + /// Private parameterless constructor invoked by all other (public) constructors + TestMethodCfg() + { + TestParams = new TestParams(true); + } + + public TestMethodCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + Factory = factory; + ParentName = string.Empty; + } + + public string ToString(int i) + { + return string.Format("Name={0}", Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Compound/TestMethodCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Compound/TestMethodCfgCtrl.cs new file mode 100644 index 00000000..914a9e65 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Compound/TestMethodCfgCtrl.cs @@ -0,0 +1,69 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FlyingStartFirstRepetWithMassColl.Compound +{ + public partial class TestMethodCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + TestMethodCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as TestMethodCfg; + Redraw(); + } + } + + public TestMethodCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Compound/TestMethodCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Compound/TestMethodCfgCtrl.designer.cs new file mode 100644 index 00000000..0477a001 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Compound/TestMethodCfgCtrl.designer.cs @@ -0,0 +1,86 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +namespace TBF.BenchControl.TestMethods.FlyingStartFirstRepetWithMassColl.Compound +{ + partial class TestMethodCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(137, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 5; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(27, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 4; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(134, 33); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 3; + this.classNameLabel.Text = "ComonentName"; + // + // BasicPrinterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "BasicPrinterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Compound/TestMethodCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Compound/TestMethodCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Compound/TestMethodCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Compound/TestParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Compound/TestParams.cs new file mode 100644 index 00000000..b2509953 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Compound/TestParams.cs @@ -0,0 +1,129 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.FlyingStartFirstRepetWithMassColl.Compound +{ + public class TestParams : TestParamsBase, IParamsProvider, ITestParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestParams) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public float NextTestVolume; + public bool SupressTrills; /// Main meter readings are ignored during test (suitable for small flows) + + public override void InitializeAll() + { + NextTestVolume = 10; + SupressTrills = false; + } + + + string[] paramNames = new string[] + { + string.Format("{0} [l]", Strings.Next_test_volume), + Strings.SupressWMTrills, + }; + public override string ParamName(int i) { return paramNames[i]; } + public override int ParamsCount() { return paramNames.Length; } + + public override string ToString(int i) + { + switch (i) + { + case 0: return NextTestVolume.ToString(); + case 1: return (SupressTrills ? Strings.yes : Strings.no); + default: return string.Empty; + } + } + + public CfgUpdateFlags UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: NextTestVolume = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 1: SupressTrills = strValue.Equals(Strings.yes); return CfgUpdateFlags.None; + default: return CfgUpdateFlags.None; + } + } + + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + float volume; + + switch (i) + { + case 0: + if (Utils.TryParseUFloat(strValue, out volume) && volume >= 0.1f) return true; + break; + case 1: + if (strValue.Equals(Strings.yes) || strValue.Equals(Strings.no)) return true; + break; + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(TestParams prms) + { + prms.NextTestVolume = this.NextTestVolume; + prms.SupressTrills = this.SupressTrills; + } + + public IParamsProvider Clone() + { + TestParams pars = new TestParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateFromDbEntity(ComponentTest dbEntity) + { + if (dbEntity == null) return; + try + { + TestParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as TestParams; + + testParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + test = dbEntity.Test; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + /// + /// Parameterless constructor initializes the parameters + /// + public TestParams() + { + } + + public TestParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public TestParams(ComponentTest testParamsEntity, string componentName, Test test) + { + this.testParamsEntity = testParamsEntity; + this.componentName = componentName; + this.test = test; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/FlyingStartFirstRepetWithMassCollSeq.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/FlyingStartFirstRepetWithMassCollSeq.cs new file mode 100644 index 00000000..5e09d6e0 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/FlyingStartFirstRepetWithMassCollSeq.cs @@ -0,0 +1,1147 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Text; +using log4net; +using TBF.BenchControl; +using TBF.Boxes; +using TBF.Resources; +using TBF.UiBridge; + +namespace TBF.BenchControl.TestMethods.FlyingStartFirstRepetWithMassColl +{ + public class FlyingStartFirstRepetWithMassCollSeq : Sequences.SequenceBase + { + private static readonly ILog log = LogManager.GetLogger(typeof(FlyingStartFirstRepetWithMassCollSeq)); + + /// + /// Flying start mass collection method sequence + /// + /// Test entity + /// + /// Event.Done . . . . . . . OK + /// Event.UiCmdStop . . . . Stopped by the user using the on-screen button STOP + /// Event.OpArgumentError . Target flow is out of range + /// Event.Error . . . . . . Unspecified error + /// + public IList Execute(Config.Entities.Test test, int repetitionNr, bool isLastRepetition, + Single.TestParams singleTestParams, + Compound.TestParams compoundTestParams, + HeatMeters.TestParams heatMetersTestParams, + Config.Entities.DebugMode debugLevel) + { + IList e = new List(); /// Events from currently running operations + Event retVal = Event.Done; + checkUiOp = new Operations.CheckUIOp(true); /// Runs in more then one state + + float nextTestVolume = (singleTestParams != null) ? singleTestParams.NextTestVolume + : ((compoundTestParams != null) ? compoundTestParams.NextTestVolume + : heatMetersTestParams.NextTestVolume); + FloatBox switchTimeStart = new FloatBox(0.001f); /// in seconds, initial value is 1 ms + FloatBox switchTimeEnd = new FloatBox(0.001f); /// in seconds, initial value is 1 ms + + if (debugLevel == Config.Entities.DebugMode.Simulate) + { + /// + /// Test method simulation + /// + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (compoundTestParams != null) + { + if (test.Name.ToLower().Contains("nok")) MakeSimulatedCompound(test, 1, 0, 4.7f, 0.9f); + else MakeSimulatedCompound(test, 1, 0, 0.7f, 1.0f); + } + else if (heatMetersTestParams != null) + { + MakeSimulatedHeatMeters(test, 1, 0, 1.5f, 1000000, heatMetersTestParams.ErrorLimitLo, heatMetersTestParams.ErrorLimitHi, heatMetersTestParams.EvaluateVolume); + } + else + { + float errorPctBase = -1.0f; + if (test.Name.ToLower().Contains("q3")) errorPctBase = -0.5f; + else if (test.Name.ToLower().Contains("q2")) errorPctBase = 0.5f; + else if (test.Name.ToLower().Contains("q1")) errorPctBase = -5.1f; + + MakeSimulated(test, repetitionNr, 0, errorPctBase + repetitionNr * 0.1f); + } + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.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 + + for (int i = 0; i < Config.Data.WMsCount; i++) + { + TestMethods.iPerlCommunication.iPerlHead.IperlHead iPerl = ((sensPath.RegisterReaders != null) && (i < sensPath.RegisterReaders.Length)) + ? (sensPath.RegisterReaders[i] as TestMethods.iPerlCommunication.iPerlHead.IperlHead) + : null; + if (iPerl != null) + { + /// TODO: Reimplement + //iPerl.LastTestResult = meterRslt; /// Save this water meter test result to iPerl WM + iPerl.NominalTestFlowLph = 500.0 * (double)(test.Qfrom + test.Qto); /// Ave. + convert to liter/hour + } + } + + //------------------------------------------------------------------- + Bridge.OnActivity(this, string.Format("{0} Simulation", test.Name)); + //------------------------------------------------------------------- + + State.Create(string.Format("{0}({1}) : Simulation", test.Method, test.Name)) + .AddOperation(checkUiOp) + .EnterState(); + e = StateMachine.WaitRunDevsRunOps(); + + if (TestAndLogUiCmdStop(test, e)) retVal = Event.UiCmdStop; + + /// Create a list with one item 'retVal' (default is Event.Done) and return it + IList retListSim = new List(1); + retListSim.Add(retVal); + return retListSim; + } + + + Elde.ControlBoardDev cBrd = StateMachine.ControlBoard; + processDataLoggingOp = new TBF.BenchControl.Operations.ProcessDataLoggingOp(processDataLogger, this, heatMetersTestParams != null); + + if (test.Volume > outPath.Scale.Capacity * Constants.TankFullFactor) + { + Bridge.OnError(this, Strings.Test_volume_exceeds_the_scale_capacity); + retVal = Event.UiCmdStop; + goto stopTestWOStoppingDivGateEtc; + } + + int rangeIx = 0; /// Default range, used for non-Elde flowmeters + if (outPath.FlowMeter is Elde.FlowMeter.FlowMeter) + { + Elde.FlowMeter.FlowMeter eldeFM = outPath.FlowMeter as Elde.FlowMeter.FlowMeter; + rangeIx = -1; /// Indicates invalid range + for (int r = 0; r <= 5; r++) + { + if (eldeFM.RangeEnabled(r) && eldeFM.GetTempLo(r) <= test.TempLimLo + && eldeFM.GetTempHi(r) >= test.TempLimHi) + { + rangeIx = r; + } + } + + if (rangeIx == -1) + { + Bridge.OnError(this, Strings.Flow_meter_temperature_range_does_not_fit_this_test_conditions); + retVal = Event.UiCmdStop; + goto stopTestWOStoppingDivGateEtc; + } + } + + //==================================== + loop: + + LtrPerRefPulse = outPath.FlowMeter.LtrPerPulse; + int totalPulses = (int)((repetitionNr == 1 ? test.Volume : nextTestVolume) / LtrPerRefPulse + 0.5f); + + /// Start the test, initialize test results + Bridge.OnTestSelected(this, new TestSelectedEventArgs(test, repetitionNr, inPath, benchPath, outPath, sensPath, totalPulses)); + string testName = Results.Utils.GetTestName(test.Name, test.Repeats, repetitionNr); + TestStartTime = DateTime.Now; + + bool drainTheTank = (repetitionNr == 1) ? test.DoDraining : false; + + if (repetitionNr == 1) + { + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Checking_tank_capacity); + //------------------------------------------------ + + if (!drainTheTank) /// If condition met => skip measuring and force emptying + { + /// + /// Measure the weight and skip emptying if there is enough room in the tank + /// + State.Create(string.Format("{0}({1}) : Checking available tank capacity", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(outPath.Scale.ReadMassOp(ref Mass)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.BalanceDone)); + + double estimatedEndMass = Mass.Val + test.Volume; + if (estimatedEndMass >= outPath.Scale.Capacity * Constants.TankFullFactor) + { + drainTheTank = true; + } + } + /// + if (drainTheTank) + { + #if BERLIN + switch (DrainTheTank(outPath.Scale.DrainValve, outPath.Scale)) + { + case Event.Error: { retVal = Event.Error; goto stopTest; } + case Event.UiCmdStop: { retVal = Event.UiCmdStop; goto stopTest; } + } + + drainTheTank = false; + #else + State.Create(string.Format("{0}({1}) : Open the drain valve", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(outPath.Scale.DrainValve, null)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (e.Contains(Event.ValvesBusy)); + #endif + } + } + + /// + /// Optionally display prompt to emerge temperature meters to appropriate baths for heat meters test + /// + IOperation heatMetersPromptOp = null; + if (heatMetersTestParams != null && !string.IsNullOrEmpty(heatMetersTestParams.Prompt)) + { + /// Make sure the CycleBeginForm is closed + if (UIFlowControl.Stop == WaitBeginFormClosed()) goto stopTest; + + heatMetersPromptOp = new Operations.MessageBoxOp(heatMetersTestParams.Prompt); + } + + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Starting_the_pump); + //------------------------------------------------ + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + int flowSetTime0 = StateMachine.Time; + + if (inPath.Pump is GenericDevices.IPumpFM) (inPath.Pump as GenericDevices.IPumpFM).TurnOn(test.PumpPower); + /// + State.Create(string.Format("{0}({1}) : Starting the pump", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) +// .AddOperation(new Operations.SetAllRegulValvesOp(inPath.RegulValves, inPath.RegulValvesPct, 60)) + .AddOperation(heatMetersPromptOp) + .AddOperation(inPath.Pump != null ? cBrd.SetValvesOp(inPath.Pump, null) : null) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } + while (e.Contains(Event.ValvesBusy) /* || !e.Contains(Event.AllPositionsReached)*/); + + + if (test.TimePump2StartV > 0) + { + State.Create(string.Format("{0}({1}) : Waiting after the pump started", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(new Operations.TimerOp(test.TimePump2StartV)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + } + + + if (benchPath.StopBFValve != null) + { + State.Create(string.Format("{0}({1}) : Opening the stop backflow valve", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(benchPath.StopBFValve, null)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } + while (!e.Contains(Event.ValvesSet)); + } + + + if (test.TimeBeforeFlow > 0) + { + State.Create(string.Format("{0}({1}) : Waiting before flow setting process starts", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(new Operations.TimerOp(test.TimeBeforeFlow)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + } + + + setting_flow: + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Setting_the_flow); + //------------------------------------------------ + State.Create(string.Format("{0}({1}) : Setting the flow", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(outPath.RegulValve.SetFlowOp(outPath.FlowMeter, test.Qfrom, test.Qto, outPath.PidCoef, RefFlow, 990)) /// timeout = 16.5 min. + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (e.Contains(Event.OpArgumentError)) { retVal = Event.OpArgumentError; goto stopTest; } + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.RegulValveTimeOut)) + { + Bridge.OnError(this, Strings.Flow_adjustment_failed); + retVal = Event.UiCmdStop; + goto stopTest; + } + if (e.Contains(Event.Next)) goto flow_set; + } + while (!e.Contains(Event.FlowReached)); + + flow_set: + + int flowSetTime = StateMachine.Time - flowSetTime0; + double currentFlow = RefFlow.Val; + + if (heatMetersTestParams != null && heatMetersPath != null) + { + //--------------------------------------------------- + Bridge.OnActivity(this, Strings.Setting_temperature); + //--------------------------------------------------- + + int lastTimeSec = StateMachine.Time; + double Tw_last = 0; + double Tc_last = 0; + + State.Create(string.Format("{0}({1}) : Check temperature stabilized.", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Next)) goto temperature_set; + + if (TempRefHi1.Val != 0 && TempRefHi2.Val != 0 && TempRefLo1.Val != 0 && TempRefLo2.Val != 0) + { + if (StateMachine.Time - lastTimeSec > 10 || StateMachine.Time - lastTimeSec < 0) + { + double Tw = (TempRefHi1.Val + TempRefHi2.Val) / 2; + double Tc = (TempRefLo1.Val + TempRefLo2.Val) / 2; + if (heatMetersTestParams.TempWarmLo <= Tw && Tw <= heatMetersTestParams.TempWarmHi && + heatMetersTestParams.TempColdLo <= Tc && Tc <= heatMetersTestParams.TempColdHi && + Math.Abs(Tw - Tw_last) <= heatMetersTestParams.ChangeInTimeWarm && + Math.Abs(Tc - Tc_last) <= heatMetersTestParams.ChangeInTimeCold && + Math.Abs(TempRefHi1.Val - TempRefHi2.Val) <= heatMetersTestParams.DeltaTempWarm && + Math.Abs(TempRefLo1.Val - TempRefLo2.Val) <= heatMetersTestParams.DeltaTempCold) + { + goto temperature_set; + } + + lastTimeSec = StateMachine.Time; + Tw_last = Tw; + Tc_last = Tc; + } + } + } + while (true); + } + else if (test.DoControlWaterTemp && benchPath.TempMtrUp != null && benchPath.TempMtrDown != null) + { + //--------------------------------------------------- + Bridge.OnActivity(this, Strings.Setting_temperature); + //--------------------------------------------------- + + State.Create(string.Format("{0}({1}) : Wait until the water temperature is within limits", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Next)) goto temperature_set; + + if (TempUp.Val >= test.TempLimLo && TempUp.Val <= test.TempLimHi && + TempDown.Val >= test.TempLimLo && TempDown.Val <= test.TempLimHi) + { + goto temperature_set; + } + } + while (true); + } + + temperature_set: + + /// + /// Prepare cameras, ROI-s and measurementOperations + /// + + /// Find successfully detected ROI-s + IList rois = new List(); + foreach (var rr in sensPath.RegisterReaders) + { + GenericDevices.IRoi roi = rr as GenericDevices.IRoi; + if (roi != null && roi.Detected) + { + rois.Add(roi); + } + } + + /// Find cameras + IList cameras = new List(); + foreach (var roi in rois) + { + if (roi.Camera != null && !cameras.Contains(roi.Camera)) + { + roi.Camera.ClearRoiParams(); + cameras.Add(roi.Camera); + } + } + + /// Register ROI-parameters to cameras + foreach (var roi in rois) roi.RegisterRoiToCamera(); + + /// Prepare measurementOperations + IList measureOperations = new List(); + foreach (var camera in cameras) measureOperations.Add(camera.MeasurementOp()); + + + if (repetitionNr == 1) + { + if (drainTheTank) + { + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Closing_the_tank); + //------------------------------------------------ + + /// + /// Make sure tank draining completed + /// + IList extraOps = new List(); + if (heatMetersPath != null) + { + extraOps.Add(heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)); + extraOps.Add(heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)); + extraOps.Add(heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)); + extraOps.Add(heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)); + } + switch (DrainTheTank(outPath.Scale.DrainValve, outPath.Scale, extraOps)) + { + case Event.Error: { retVal = Event.Error; goto stopTest; } + case Event.UiCmdStop: { retVal = Event.UiCmdStop; goto stopTest; } + } + + drainTheTank = false; + } + else + { + /// Close the drain valve anyway + State.Create(string.Format("{0}({1}) : Close the drain valve", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(null, outPath.Scale.DrainValve)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (e.Contains(Event.ValvesBusy)); + } + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Measuring_the_weight); + //------------------------------------------------ + + if (test.TimeFlow2Mass > 0) + { + State.Create(string.Format("{0}({1}) : Waiting before 1st mass measurement", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation(cBrd.UpdateTankWeightOp()) + .AddOperation(new Operations.TimerOp(test.TimeFlow2Mass)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + } + + LogProcessDataTestInfo(processDataLogger, test.Procedure.Name, test.Name); + + if (heatMetersPath == null) LogProcessDataHeader(processDataLogger, "Start mass"); + else LogProcessDataHeaderHeatMeters(processDataLogger, "Start mass"); + + State.Create(string.Format("{0}({1}) : Measuring the start mass", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperations(measureOperations) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation((StateMachine.Ambient != null) + ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) : null) + .AddOperation(outPath.Scale.ReadStableMassOp(ref StartMass, test.MassRepeats, test.MassSpread, test.MassMethod)) + .AddOperation(cBrd.UpdateTankWeightOp()) + .AddOperation(processDataLoggingOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.BalanceDone)); + + log.WarnFormat("Start mass = {0}kg", StartMass); + Mass.Val = StartMass.Val; + } + + + if (heatMetersPath == null) LogProcessDataHeader(processDataLogger, "Measurement"); + else LogProcessDataHeaderHeatMeters(processDataLogger, "Measurement"); + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Test_in_progress); + //------------------------------------------------ + State.Create(string.Format("{0}({1}) : Starting the test", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperations(measureOperations) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation((StateMachine.Ambient != null) + ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) : null) + .AddOperation(cBrd.UpdateTankWeightOp()) + .AddOperation(processDataLoggingOp) + .AddOperation(cBrd.StartMeasurementOp(outPath, (repetitionNr == 1) ? Elde.TestMethods.Diverter | Elde.TestMethods.Synchro : Elde.TestMethods.Synchro, + test.Qfrom, test.Qto, totalPulses, (float)test.TolerRed)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.MeasurementStarted)); + + + foreach (var rr in sensPath.RegisterReaders) + { + GenericDevices.IHasTestName readerWithTstName = rr as GenericDevices.IHasTestName; + if (readerWithTstName != null) + { + readerWithTstName.TestName = test.Name; + readerWithTstName.TestRepeats = test.Repeats; + readerWithTstName.RepetitionNr = repetitionNr; + } + } + + + /// Measurement loop - preparation + readRegistersOp = new Operations.ReadMoreRegistersOp(sensPath.RegisterReaders); + queryEnd1 = cBrd.QueryMeasurementEndOp(); /// ??? + + int estimtdEndTime = StateMachine.Time + (int)((repetitionNr == 1) ? test.TstTime : (test.TstTime * nextTestVolume / test.Volume)); + StartNewStatistics(StateMachine.Time, BatchRslts.Batch.BatchNr, test.Name, repetitionNr); + + /// Measurement loop - begin + State.Create(string.Format("{0}({1}) : Reading watermeters", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperations(measureOperations) + .AddOperation(readRegistersOp) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation((repetitionNr == 1) ? outPath.Scale.ReadMassOp(ref Mass) : null) + .AddOperation((repetitionNr == 1) ? StateMachine.ControlBoard.UpdateTankWeightOp() : null) + .AddOperation((repetitionNr == 1) ? cBrd.ReadDiverterTransitionOp(outPath.Diverter, 2, 4, switchTimeStart, DiverterStart, BatchRslts.Batch.BatchNr, test.Name, repetitionNr) : null) + .AddOperation((StateMachine.Ambient != null) + ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) + : null) + .AddOperation(queryEnd1) + .AddOperation(processDataLoggingOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.MeasurementCompleted)) goto test_completed; + + //------------------------------------------------ + int remainingTime = Math.Max(estimtdEndTime - StateMachine.Time, 0); + if (remainingTime > 60) + { + Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", Strings.Test_in_progress, remainingTime / 60, "min", remainingTime % 60, Strings.sec)); + } + else + { + Bridge.OnActivity(this, string.Format("{0} ... {1} s", Strings.Test_in_progress, remainingTime)); + } + //------------------------------------------------ + + RefFreq.Val = cBrd.ReferenceFreq; + RefFlow.Val = cBrd.ReferenceFlow; + + UpdateAllStatistics(StateMachine.Time); + + if (heatMetersTestParams != null) + { + if (lastEnergyUpdateTime == 0) + { + lastEnergyUpdateTime = StateMachine.Time; + } + else + { + //double deltaTime = (double)(StateMachine.Time - lastEnergyUpdateTime); + double T_in = (TempRefHi1.Val + TempRefHi2.Val) / 2; /// [°C] + double T_out = (TempRefLo1.Val + TempRefLo2.Val) / 2; /// [°C] + double deltaVolume = LtrPerRefPulse * RefPulsesDelta; /// [l] + double deltaEnergy = (0.001 * deltaVolume) * (T_in - T_out) * Config.Formulas.HeatCoefficientWater(16, T_in, T_out, heatMetersTestParams.FlowMeasuredAtHiTempPipe); /// [J] = [m3] * [K] * [J/(m3 K)] + Energy.Update(deltaEnergy); + VolumeForEnergy.Update(deltaVolume); + lastEnergyUpdateTime = StateMachine.Time; + } + } + + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + } + while (!e.Contains(Event.Next)); /// 'Next' button can be used in Debug version + + /// Measurement loop - end + + test_completed: + + StopRecordingStatistics(); + + if (repetitionNr == 1) + { + /// + /// (Berlin:) Water is stopped immediately after the test and before the 2nd mass measurement in case: + /// - no 'transition sequence after test' is used + /// - this is the last (or the only) test repetition or test is a part of an 'outer loop' + /// + if (isLastRepetition && transitionAfter == null) + { + if (inPath.Pump is GenericDevices.IPumpFM) (inPath.Pump as GenericDevices.IPumpFM).TurnOff(); + + State.Create("SequenceBase : Transition : TestEnd - Default action") + .AddOperation(checkUiOp) + .AddOperation(new MettlerToledo.KeepReadingMassesOp()) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(StateMachine.DefaultValvesOpen, + StateMachine.DefaultValvesClose)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.ValvesSet)); + } + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Measuring_the_weight); + //------------------------------------------------ + State.Create(string.Format("{0}({1}) : Waiting before the 2nd mass measurement", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation((StateMachine.Ambient != null) + ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) : null) + .AddOperation(outPath.Scale.ReadMassOp(ref Mass)) + .AddOperation(cBrd.UpdateTankWeightOp()) + .AddOperation((repetitionNr == 1) ? cBrd.ReadDiverterTransitionOp(outPath.Diverter, 2, 4, switchTimeEnd, DiverterEnd, BatchRslts.Batch.BatchNr, test.Name, repetitionNr) : null) + .AddOperation(processDataLoggingOp) + .AddOperation(new Operations.TimerOp(test.TimeStop2Mass)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired) || !e.Contains(Event.BalanceDone)); + + + if (heatMetersPath == null) LogProcessDataHeader(processDataLogger, "End mass"); + else LogProcessDataHeaderHeatMeters(processDataLogger, "End mass"); + + State.Create(string.Format("{0}({1}) : Measuring the end mass", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation((StateMachine.Ambient != null) + ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) : null) + .AddOperation(outPath.Scale.ReadStableMassOp(ref EndMass, test.MassRepeats, test.MassSpread, test.MassMethod)) + .AddOperation(cBrd.UpdateTankWeightOp()) + .AddOperation(processDataLoggingOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.BalanceDone)); + /// + log.WarnFormat("End mass = {0}kg", EndMass); + } + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Test_completed); + //------------------------------------------------ + + TestEndTime = DateTime.Now; + + /// Make sure the CycleBeginForm is closed so that water meter data (s/n) can be copied into results + if (heatMetersPromptOp == null) + { + if (UIFlowControl.Stop == WaitBeginFormClosed()) goto stopTest; + } + + /// + /// Populate TestResult data entity with data + /// + Results.Entities.TestRslt tstRslt = BatchRslts.GetTestRslt(testName, test.Part); + + if (tstRslt != null) + { + UpdateTempPressDensAmb(tstRslt); + + /// Main results + tstRslt.MethodClass = TbfComponents.FindComponent(test.Method).ClassName; + tstRslt.StartTime = TestStartTime; + tstRslt.EndTime = TestEndTime; + tstRslt.FlowSetTime = flowSetTime; + tstRslt.TestTime = cBrd.TTime; /// [s] measurement time + tstRslt.PulsesMaster = Convert.ToDouble(cBrd.EtPulses(0)); /// Pulses of the master flow meter (test total) + tstRslt.FlowVolume = 3.6 * LtrPerRefPulse * tstRslt.PulsesMaster / tstRslt.TestTime; /// [m3/h] + /// + tstRslt.Buoyancy = Config.Formulas.Buoyancy(); + if (repetitionNr == 1) + { + tstRslt.MassStartRaw = StartMass.Val; + tstRslt.MassStart = Config.Formulas.CorrectedValue(tstRslt.MassStartRaw, outPath.Scale.Corrections); + tstRslt.MassEndRaw = EndMass.Val; + tstRslt.MassEnd = Config.Formulas.CorrectedValue(tstRslt.MassEndRaw, outPath.Scale.Corrections); + tstRslt.FlowMass = 3600.0 * (tstRslt.MassEnd - tstRslt.MassStart) / tstRslt.TestTime; /// [kg/h] + double density = Config.Formulas.WaterDensityFromTemp((tstRslt.TempUpMean + tstRslt.TempDownMean) / 2.0, Program.LocalSettings.RealDensity, Program.LocalSettings.AtTemperature); + tstRslt.VolumeCTV = 1000.0 * tstRslt.Buoyancy * (tstRslt.MassEnd - tstRslt.MassStart) / density; /// [l] 1000.0f is because density is in [kg/m3] + tstRslt.VolumeMaster = LtrPerRefPulse * tstRslt.PulsesMaster; /// [l] volume from the master flow meter + tstRslt.ConstMasterRaw = outPath.FlowMeter.LtrPerPulse; /// Uncorrected master flowmeter coefficient + tstRslt.ConstMasterCorr = outPath.FlowMeter.LtrPerPulseCorrected(tstRslt.FlowVolume, rangeIx); /// Corrected master pulses per liter + tstRslt.ConstMaster = (tstRslt.VolumeMaster == 0) ? tstRslt.ConstMasterCorr : (LtrPerRefPulse * tstRslt.VolumeCTV / tstRslt.VolumeMaster); + /// Calculated master pulses per liter + tstRslt.ErrorMaster = Config.Formulas.ErrorFromVolumes(tstRslt.VolumeMaster, tstRslt.VolumeCTV); + + tstRslt.DiverterStart = switchTimeStart.Val; + tstRslt.DivStart10 = 0; + tstRslt.DivStart50 = 0; + tstRslt.DivStart90 = 0; + tstRslt.DiverterEnd = switchTimeEnd.Val; + tstRslt.DivEnd90 = 0; + tstRslt.DivEnd50 = 0; + tstRslt.DivEnd10 = 0; + log.DebugFormat("Diverter switch time [s]: Start: {0}ms ({1} {2} {3}) End: {4}ms ({5} {6} {7})", + (tstRslt.DiverterStart * 1000).ToString("F0"), tstRslt.DivStart10, tstRslt.DivStart50, tstRslt.DivStart90, + (tstRslt.DiverterEnd * 1000).ToString("F0"), tstRslt.DivEnd90, tstRslt.DivEnd50, tstRslt.DivEnd10); + + tstRslt.ErrorFlagsMd = (ErrorFlagsComp != null) ? (sbyte)ErrorFlagsComp.Mode : (sbyte)0; + tstRslt.ErrorFlags = (ErrorFlagsComp != null) ? ErrorFlagsComp.GetErrorFlags(tstRslt, true, false, tstRslt.DiverterStart, tstRslt.DiverterEnd) : 0; + } + else + { + Results.Entities.TestRslt tstResRepet1 = BatchRslts.GetTestRslt(Results.Utils.GetTestName(test.Name, test.Repeats, 1), test.Part); + + tstRslt.MassStartRaw = 0; + tstRslt.MassStart = 0; + tstRslt.MassEndRaw = 0; + tstRslt.MassEnd = 0; + tstRslt.FlowMass = 0; + tstRslt.ConstMasterRaw = outPath.FlowMeter.LtrPerPulse; /// Uncorrected master flowmeter coefficient + tstRslt.ConstMasterCorr = outPath.FlowMeter.LtrPerPulseCorrected(tstRslt.FlowVolume, rangeIx); /// Corrected master pulses per liter + tstRslt.ConstMaster = tstResRepet1.ConstMaster; /// Master constant ( pulses per liter) from the first repetition (=against the scale) + tstRslt.VolumeMaster = tstRslt.ConstMaster * tstRslt.PulsesMaster; /// [l] volume from the master flow meter + tstRslt.VolumeCTV = tstRslt.VolumeMaster; /// [l] 1000.0f is because density is in [kg/m3] + tstRslt.ErrorMaster = tstResRepet1.ErrorMaster; /// Cannot be determined without a mass measurement + + tstRslt.DiverterStart = 0; + tstRslt.DivStart10 = 0; + tstRslt.DivStart50 = 0; + tstRslt.DivStart90 = 0; + tstRslt.DiverterEnd = 0; + tstRslt.DivEnd90 = 0; + tstRslt.DivEnd50 = 0; + tstRslt.DivEnd10 = 0; + + tstRslt.ErrorFlagsMd = (ErrorFlagsComp != null) ? (sbyte)ErrorFlagsComp.Mode : (sbyte)0; + tstRslt.ErrorFlags = (ErrorFlagsComp != null) ? ErrorFlagsComp.GetErrorFlags(tstRslt, false, false, 0, 0) : 0; + } /// [kg/h] + + tstRslt.FlowMean = (float)RefFlowStat.Average; + tstRslt.FlowStart = (float)RefFlowStat.First; + tstRslt.FlowEnd = (float)RefFlowStat.Last; + tstRslt.FlowMin = (float)RefFlowStat.Min; + tstRslt.FlowMax = (float)RefFlowStat.Max; + + + if (compoundTestParams != null) + { + /// + /// Compound meters + /// + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (test.Part != 0 && test.Part != Utils.PartNr(i + 1, BatchRslts.Batch.Compound)) continue; + + Results.Entities.MeterTestRslt mainMeterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.CompoundMain); + Results.Entities.MeterTestRslt auxMeterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.CompoundAux); + + for (int isAux = 0; isAux <= 1; isAux++) /// 0=main, 1=aux + { + GenericDevices.IRegisterReader regReader = sensPath.RegisterReaders[2 * i + isAux]; + Results.Entities.MeterTestRslt meterRslt = (isAux == 0) ? mainMeterRslt : auxMeterRslt; + + if (meterRslt != null && regReader != null) + { + meterRslt.RegReaderType = (int)regReader.RegisterReaderType; + meterRslt.PulsesPerLiter = regReader.PulsesPerLtr; + + /// Optionally supress pulses from the large water meter + meterRslt.PulsesMeter = (isAux == 0 && compoundTestParams.SupressTrills) ? 0 : Convert.ToDouble(regReader.WMPulses); + meterRslt.PulsesMaster = Convert.ToDouble(regReader.WMRefPulses); + + meterRslt.TestTime = tstRslt.TestTime; + meterRslt.VolumeStart = 0; + meterRslt.VolumeEnd = 0; + meterRslt.VolumeRef = tstRslt.VolumeCTV; + meterRslt.VolumeMeter = meterRslt.PulsesMeter * regReader.LtrsPerPulse; /// liter + + if (meterRslt.PulsesMaster != 0) + { + meterRslt.VolumeMeter *= (tstRslt.PulsesMaster / meterRslt.PulsesMaster); + } + + meterRslt.Error = Config.Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, tstRslt.VolumeCTV); /// Main/Aux meter error is not usedfor evaluation + } + } + + Results.Entities.MeterTestRslt compoundMeterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.Compound); + + if (compoundMeterRslt != null && mainMeterRslt != null && auxMeterRslt != null) + { + compoundMeterRslt.VolumeRef = tstRslt.VolumeCTV; + compoundMeterRslt.VolumeMeter = mainMeterRslt.VolumeMeter + auxMeterRslt.VolumeMeter; + compoundMeterRslt.PulsesMaster = tstRslt.PulsesMaster; + compoundMeterRslt.TestTime = tstRslt.TestTime; + compoundMeterRslt.Error = Config.Formulas.ErrorFromVolumes(compoundMeterRslt.VolumeMeter, compoundMeterRslt.VolumeRef); + compoundMeterRslt.Passed = (compoundMeterRslt.Error >= test.GetErrLimLo(tstRslt.FlowMean) + test.Uncertainty) + && (compoundMeterRslt.Error <= test.GetErrLimHi(tstRslt.FlowMean) - test.Uncertainty) + && (tstRslt.ErrorFlags == 0 || tstRslt.ErrorFlagsMode() != Config.Entities.ErrorFlagsMode.On); + mainMeterRslt.Passed = auxMeterRslt.Passed = compoundMeterRslt.Passed; + mainMeterRslt.TestDone = auxMeterRslt.TestDone = compoundMeterRslt.TestDone = true; + tstRslt.TestDone = true; + } + } + } + else if (heatMetersTestParams != null) + { + /// + /// Heat meters + /// + tstRslt.RefEnergy = Energy.Sum * tstRslt.VolumeCTV / VolumeForEnergy.Sum; /// [J] = [J] * [l] / [l] + + tstRslt.Custom1 = (float)TempRefHiStat.Average; + tstRslt.Custom2 = (float)TempRefHiStat.First; + tstRslt.Custom3 = (float)TempRefHiStat.Last; + tstRslt.Custom4 = (float)TempRefHiStat.Min; + tstRslt.Custom5 = (float)TempRefHiStat.Max; + tstRslt.Custom6 = (float)TempRefLoStat.Average; + tstRslt.Custom7 = (float)TempRefLoStat.First; + tstRslt.Custom8 = (float)TempRefLoStat.Last; + tstRslt.Custom9 = (float)TempRefLoStat.Min; + tstRslt.Custom10 = (float)TempRefLoStat.Max; + + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (test.Part != 0 && test.Part != Utils.PartNr(i + 1, BatchRslts.Batch.Compound)) continue; + + Results.Entities.MeterTestRslt volumeRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.HeatMeterVolume); + Results.Entities.MeterTestRslt energyRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.HeatMeterEnergy); + + BenchControl.GenericDevices.IRegisterReader volumeRegReader = + (sensPath.RegisterReaders.Length > 2 * i) ? sensPath.RegisterReaders[2 * i] : null; + + BenchControl.GenericDevices.IRegisterReader energyRegReader = + (sensPath.RegisterReaders.Length > 2 * i + 1) ? sensPath.RegisterReaders[2 * i + 1] : null; + + if (volumeRslt != null && volumeRegReader != null) + { + volumeRslt.PulsesPerLiter = volumeRegReader.PulsesPerLtr; /// [l ^ -1] + volumeRslt.PulsesMeter = Convert.ToDouble(volumeRegReader.WMPulses); + volumeRslt.PulsesMaster = Convert.ToDouble(volumeRegReader.WMRefPulses); + volumeRslt.VolumeStart = 0; + volumeRslt.VolumeEnd = 0; + volumeRslt.VolumeMeter = volumeRslt.PulsesMeter * volumeRegReader.LtrsPerPulse; /// [l] + volumeRslt.VolumeRef = volumeRslt.PulsesMaster * tstRslt.ConstMaster; /// [l] + volumeRslt.TestTime = cBrd.ImpulseTime(i + 1); ; /// [s] + + volumeRslt.Error = Config.Formulas.ErrorFromVolumes(volumeRslt.VolumeMeter, volumeRslt.VolumeRef); + volumeRslt.Passed = !heatMetersTestParams.EvaluateVolume || + ((volumeRslt.Error >= test.GetErrLimLo(tstRslt.FlowMean) + test.Uncertainty) && + (volumeRslt.Error <= test.GetErrLimHi(tstRslt.FlowMean) - test.Uncertainty) && + (tstRslt.ErrorFlags == 0 || tstRslt.ErrorFlagsMode() != Config.Entities.ErrorFlagsMode.On)); + volumeRslt.TestDone = true; + tstRslt.TestDone = true; + } + + if (energyRslt != null && energyRegReader != null) + { + energyRslt.PulsesPerLiter = energyRegReader.PulsesPerLtr; /// [kWh ^ -1] + energyRslt.PulsesMeter = Convert.ToDouble(energyRegReader.WMPulses); + energyRslt.PulsesMaster = Convert.ToDouble(energyRegReader.WMRefPulses); + energyRslt.VolumeStart = 0; + energyRslt.VolumeEnd = 0; + energyRslt.VolumeRef = tstRslt.RefEnergy * (energyRslt.PulsesMaster / tstRslt.PulsesMaster); /// [J] + energyRslt.VolumeMeter = energyRslt.PulsesMeter * Config.Units.ConvertFrom(Config.Unit.kWh, energyRegReader.LtrsPerPulse); /// [J] + energyRslt.TestTime = cBrd.ImpulseTime(i + 1); /// [s] + + energyRslt.Error = Config.Formulas.ErrorFromVolumes(energyRslt.VolumeMeter, energyRslt.VolumeRef); + energyRslt.Passed = (energyRslt.Error >= heatMetersTestParams.ErrorLimitLo) + && (energyRslt.Error <= heatMetersTestParams.ErrorLimitHi) + && (tstRslt.ErrorFlags == 0 || tstRslt.ErrorFlagsMode() != Config.Entities.ErrorFlagsMode.On); + energyRslt.TestDone = true; + tstRslt.TestDone = true; + } + } + } + else + { + /// + /// Single meters + /// + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (test.Part != 0 && test.Part != Utils.PartNr(i + 1, BatchRslts.Batch.Compound)) continue; + + Results.Entities.MeterTestRslt meterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.Single); + GenericDevices.IRegisterReader regReader = sensPath.RegisterReaders[i]; + GenericDevices.IDatastreamReader dstrReader = regReader as GenericDevices.IDatastreamReader; + TestMethods.iPerlCommunication.iPerlHead.IperlHead iPerl = regReader as TestMethods.iPerlCommunication.iPerlHead.IperlHead; + GenericDevices.IRoi cameraRoi = regReader as GenericDevices.IRoi; + + if (meterRslt != null && regReader != null) + { + meterRslt.RegReaderType = (int)regReader.RegisterReaderType; + meterRslt.PulsesPerLiter = regReader.PulsesPerLtr; + meterRslt.PulsesMeter = Convert.ToDouble(regReader.WMPulses); + meterRslt.PulsesMaster = Convert.ToDouble(regReader.WMRefPulses); + + if (dstrReader != null) + { + meterRslt.TimestampStart = dstrReader.TimestampSecStart; + meterRslt.TimestampEnd = dstrReader.NoSamples ? (dstrReader.TimestampSecStart + tstRslt.TestTime) : dstrReader.TimestampSecEnd; + meterRslt.TestTime = meterRslt.TimestampEnd - meterRslt.TimestampStart; + meterRslt.VolumeStart = dstrReader.VolumeLtrStart; /// liter + meterRslt.VolumeEnd = dstrReader.VolumeLtrEnd; /// liter + meterRslt.VolumeMeter = Math.Abs(dstrReader.VolumeLtrEnd - dstrReader.VolumeLtrStart); + meterRslt.VolumeRef = tstRslt.VolumeCTV * meterRslt.TestTime / tstRslt.TestTime; + + if (iPerl != null) + { + if (iPerl.ResultCode != 0 && (meterRslt.WaterMeter.ResultCode & (int)Results.Entities.ResultCode.OptoErrorCodeMask) == 0) + { + meterRslt.WaterMeter.ResultCode |= iPerl.ResultCode; + } +#if IPERL + meterRslt.WaterMeter.CalibFactor = (iPerl.CalibrationStruct != null) ? iPerl.CalibrationStruct.Calibration : 0; + meterRslt.WaterMeter.Q2Correction = iPerl.Q2Correction; + meterRslt.WaterMeter.Q2CorrRFlow = iPerl.Q2CorrRFlow; + meterRslt.WaterMeter.Q2CorrLFlow = iPerl.Q2CorrLFlow; +#endif + iPerl.LastTestResult2 = iPerl.LastTestResult; /// Save shift previous test result + iPerl.LastTestResult = meterRslt; /// Save this test result + iPerl.NominalTestFlowLph = 500.0 * (test.Qfrom + test.Qto); /// Ave. + convert to liter/hour + } + } + else if (cameraRoi != null) + { + meterRslt.TimestampStart = cameraRoi.TimestampStart; /// second + meterRslt.TimestampEnd = cameraRoi.TimestampEnd; /// second + meterRslt.TestTime = cameraRoi.TimestampEnd - cameraRoi.TimestampStart; /// second + + meterRslt.VolumeStart = cameraRoi.VolumeStart; /// liter + meterRslt.VolumeEnd = cameraRoi.VolumeEnd; /// liter + meterRslt.VolumeMeter = cameraRoi.VolumeEnd - cameraRoi.VolumeStart; /// liter + + meterRslt.VolumeRef = tstRslt.VolumeCTV * meterRslt.TestTime / tstRslt.TestTime; + } + else + { + meterRslt.TestTime = cBrd.ImpulseTime(i + 1); + meterRslt.VolumeStart = 0; + meterRslt.VolumeEnd = 0; + meterRslt.VolumeMeter = meterRslt.PulsesMeter * regReader.LtrsPerPulse; /// liter + meterRslt.VolumeRef = meterRslt.PulsesMaster * tstRslt.ConstMaster; /// liter + } + + meterRslt.Error = Config.Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef); + meterRslt.Passed = (meterRslt.Error >= test.GetErrLimLo(tstRslt.FlowMean) + test.Uncertainty) + && (meterRslt.Error <= test.GetErrLimHi(tstRslt.FlowMean) - test.Uncertainty) + && (tstRslt.ErrorFlags == 0 || tstRslt.ErrorFlagsMode() != Config.Entities.ErrorFlagsMode.On); + meterRslt.TestDone = true; + tstRslt.TestDone = true; + } + } + } + + tstRslt.Components = Results.Entities.Components + .UpdateList(BatchRslts.ComponentsList, + new Results.Entities.Components((BenchInfo != null) ? BenchInfo.TestBenchId : 1, + (BenchInfo != null) ? BenchInfo.TestBenchName : "testbench", + inPath.Pump != null ? inPath.Pump.Name : string.Empty, + outPath.FlowMeter != null ? outPath.FlowMeter.Name : string.Empty, + outPath.Scale != null ? outPath.Scale.Name : string.Empty, + outPath.RegulValve != null ? outPath.RegulValve.Name : string.Empty, + outPath.Diverter != null ? outPath.Diverter.Name : string.Empty)); + + /// Update water meter error flags + if (ErrorFlagsComp != null) + { + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (BatchRslts.WaterMeters[i] != null) + { + BatchRslts.WaterMeters[i].ErrorFlags = ErrorFlagsComp.GetWMtrErrorFlags(BatchRslts.WaterMeters[i].MeterTestRslts); + } + } + } + + /// Update results + Bridge.OnTestCompleted(this, new TestCompletedEventArgs(testName, tstRslt)); + } + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.TransitionAfter)); + + /// Append the results to the CSV-file + allResults.Info(TestResult2CsvLine(testName, test.Part)); + + + stopTest: + + StopRecordingStatistics(); + + /// + /// Quit this sequence + /// + if (isLastRepetition || retVal == Event.UiCmdStop || retVal == Event.OpArgumentError + || retVal == Event.Error || retVal == Event.ConfigurationError) + { + State.Create(string.Format("{0}({1}) : Stopping diverter, gate, etc.", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(cBrd.StopPreviousOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { if (retVal == Event.Done) retVal = Event.UiCmdStop; break; } + } + while (!e.Contains(Event.PreviousStopped)); + } + + stopTestWOStoppingDivGateEtc: + + /// Create a list with one item 'retVal' (default is Event.Done) and return it + IList retList = new List(1); + retList.Add(retVal); + return retList; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/HeatMeters/Component.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/HeatMeters/Component.cs new file mode 100644 index 00000000..7fe42259 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/HeatMeters/Component.cs @@ -0,0 +1,40 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; + +namespace TBF.BenchControl.TestMethods.FlyingStartFirstRepetWithMassColl.HeatMeters +{ + public class Component : ComponentBase, GenericDevices.ITestMethod + { + private static readonly ILog log = LogManager.GetLogger(typeof(Component)); + public override string ToString() + { + return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); + } + + public bool CanTest(MetersKind meters) { return meters == MetersKind.HeatMeter; } + public bool DoTransitions() { return true; } + + readonly TestMethodCfg testMethodCfg; + + public Component() + { + } + + public Component(Generic.IComponentCfg cfg) + : base(cfg) + { + testMethodCfg = cfg as TestMethodCfg; + log.Debug(this.ToString()); + } + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + return (new FlyingStartFirstRepetWithMassCollSeq()).Execute(test, repetNr, isLastRepetition, null, null, testMethodCfg.TestParams, DebugLevel); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/HeatMeters/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/HeatMeters/Factory.cs new file mode 100644 index 00000000..bf2541a1 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/HeatMeters/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FlyingStartFirstRepetWithMassColl.HeatMeters +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Component.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Component(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Component(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this.GetType().Namespace.Substring(29), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/HeatMeters/TestMethodCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/HeatMeters/TestMethodCfg.cs new file mode 100644 index 00000000..c71519f4 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/HeatMeters/TestMethodCfg.cs @@ -0,0 +1,49 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FlyingStartFirstRepetWithMassColl.HeatMeters +{ + public class TestMethodCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestMethodCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new TestMethodCfgCtrl(); } + + /// Test parameters + [XmlIgnore] + public TestParams TestParams; + public override IParamsProvider GetRuntimeTestParamsProvider() { return TestParams; } + public override IParamsProvider CreateTestParamsProvider() { return new TestParams(true); } + public override IParamsProvider GetUITestParamsProvider(Test test) + { + return (test.Method == Name) ? base.GetUITestParamsProvider(test) : null; + } + + /// Private parameterless constructor invoked by all other (public) constructors + TestMethodCfg() + { + TestParams = new TestParams(true); + } + + public TestMethodCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + Factory = factory; + ParentName = string.Empty; + } + + public string ToString(int i) + { + return string.Format("Name={0}", Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/HeatMeters/TestMethodCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/HeatMeters/TestMethodCfgCtrl.cs new file mode 100644 index 00000000..14312da1 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/HeatMeters/TestMethodCfgCtrl.cs @@ -0,0 +1,69 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FlyingStartFirstRepetWithMassColl.HeatMeters +{ + public partial class TestMethodCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + TestMethodCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as TestMethodCfg; + Redraw(); + } + } + + public TestMethodCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/HeatMeters/TestMethodCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/HeatMeters/TestMethodCfgCtrl.designer.cs new file mode 100644 index 00000000..048729f0 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/HeatMeters/TestMethodCfgCtrl.designer.cs @@ -0,0 +1,86 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +namespace TBF.BenchControl.TestMethods.FlyingStartFirstRepetWithMassColl.HeatMeters +{ + partial class TestMethodCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(137, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 5; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(27, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 4; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(134, 33); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 3; + this.classNameLabel.Text = "ComonentName"; + // + // BasicPrinterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "BasicPrinterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/HeatMeters/TestMethodCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/HeatMeters/TestMethodCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/HeatMeters/TestMethodCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/HeatMeters/TestParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/HeatMeters/TestParams.cs new file mode 100644 index 00000000..b9732692 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/HeatMeters/TestParams.cs @@ -0,0 +1,206 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.FlyingStartFirstRepetWithMassColl.HeatMeters +{ + public class TestParams : TestParamsBase, IParamsProvider, ITestParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestParams) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public float NextTestVolume; /// [l] + public float ErrorLimitLo; /// [%] + public float ErrorLimitHi; /// [%] + public bool EvaluateVolume; /// true = evaluate also the volume, false = evaluate only energy + public float TempWarmLo; /// Low limit for warm temperature [°C] + public float TempWarmHi; /// High limit for warm temperature [°C] + public float TempColdLo; /// Low limit for cold temperature [°C] + public float TempColdHi; /// High limit for cold temperature [°C] + public bool FlowMeasuredAtHiTempPipe; /// true = flow measured at high temp. pipe, false = flow measured at low temp. pipe + public float DeltaTempWarm; + public float DeltaTempCold; + public float ChangeInTimeWarm; + public float ChangeInTimeCold; + public string Prompt; + + public override void InitializeAll() + { + NextTestVolume = 10; + FlowMeasuredAtHiTempPipe = false; + } + + + string[] paramNames = new string[] + { + string.Format("{0} [l]", Strings.Next_test_volume), + Strings.Err_limit_neg_pct_chdr, + Strings.Err_limit_pos_pct_chdr, + Strings.Evaluate_volume, + "T hi min", + "T hi max", + "T lo min", + "T lo max", + "Flow measured at high temp.pipe", + "Delta T warm", + "Delta T cold", + "Change in time T warm", + "Change in time T cold", + Strings.Prompt, + }; + public override string ParamName(int i) { return paramNames[i]; } + public override int ParamsCount() { return paramNames.Length; } + + public override string ToString(int i) + { + switch (i) + { + case 0: return NextTestVolume.ToString(); + case 1: return ErrorLimitLo.ToString(); + case 2: return ErrorLimitHi.ToString(); + case 3: return (EvaluateVolume ? Strings.yes : Strings.no); + case 4: return TempWarmLo.ToString(); + case 5: return TempWarmHi.ToString(); + case 6: return TempColdLo.ToString(); + case 7: return TempColdHi.ToString(); + case 8: return (FlowMeasuredAtHiTempPipe ? Strings.yes : Strings.no); + case 9: return DeltaTempWarm.ToString(); + case 10: return DeltaTempCold.ToString(); + case 11: return ChangeInTimeWarm.ToString(); + case 12: return ChangeInTimeCold.ToString(); + case 13: return Prompt; + default: return string.Empty; + } + } + + public CfgUpdateFlags UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: NextTestVolume = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 1: ErrorLimitLo = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 2: ErrorLimitHi = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 3: EvaluateVolume = strValue.Equals(Strings.yes); return CfgUpdateFlags.None; + case 4: TempWarmLo = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 5: TempWarmHi = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 6: TempColdLo = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 7: TempColdHi = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 8: FlowMeasuredAtHiTempPipe = strValue.Equals(Strings.yes); return CfgUpdateFlags.None; + case 9: DeltaTempWarm = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 10: DeltaTempCold = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 11: ChangeInTimeWarm = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 12: ChangeInTimeCold = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 13: Prompt = strValue; return CfgUpdateFlags.None; + default: return CfgUpdateFlags.None; + } + } + + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + float dummy; + + switch (i) + { + case 0: + if (Utils.TryParseUFloat(strValue, out dummy) && dummy >= 0.1f) return true; + break; + case 1: + case 2: + case 4: + case 5: + case 6: + case 7: + if (Utils.TryParseSFloat(strValue, out dummy)) return true; + break; + case 3: + case 8: + if (strValue.Equals(Strings.yes) || strValue.Equals(Strings.no)) return true; + break; + case 9: + case 10: + case 11: + case 12: + if (Utils.TryParseUFloat(strValue, out dummy)) return true; + break; + case 13: + return true; + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(TestParams prms) + { + prms.NextTestVolume = this.NextTestVolume; + prms.ErrorLimitLo = ErrorLimitLo; + prms.ErrorLimitHi = ErrorLimitHi; + prms.EvaluateVolume = EvaluateVolume; + prms.TempWarmLo = TempWarmLo; + prms.TempWarmHi = TempWarmHi; + prms.TempColdLo = TempColdLo; + prms.TempColdHi = TempColdHi; + prms.FlowMeasuredAtHiTempPipe = FlowMeasuredAtHiTempPipe; + prms.DeltaTempWarm = DeltaTempWarm; + prms.DeltaTempCold = DeltaTempCold; + prms.ChangeInTimeWarm = ChangeInTimeWarm; + prms.ChangeInTimeCold = ChangeInTimeCold; + prms.Prompt = Prompt; + } + + public IParamsProvider Clone() + { + TestParams pars = new TestParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateFromDbEntity(ComponentTest dbEntity) + { + if (dbEntity == null) return; + try + { + TestParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as TestParams; + + testParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + test = dbEntity.Test; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + /// + /// Parameterless constructor initializes the parameters + /// + public TestParams() + { + } + + public TestParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public TestParams(ComponentTest testParamsEntity, string componentName, Test test) + { + this.testParamsEntity = testParamsEntity; + this.componentName = componentName; + this.test = test; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Single/Component.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Single/Component.cs new file mode 100644 index 00000000..5743f400 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Single/Component.cs @@ -0,0 +1,40 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; + +namespace TBF.BenchControl.TestMethods.FlyingStartFirstRepetWithMassColl.Single +{ + public class Component : ComponentBase, GenericDevices.ITestMethod + { + private static readonly ILog log = LogManager.GetLogger(typeof(Component)); + public override string ToString() + { + return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); + } + + public bool CanTest(MetersKind meters) { return meters == MetersKind.Single; } + public bool DoTransitions() { return true; } + + readonly TestMethodCfg testMethodCfg; + + public Component() + { + } + + public Component(Generic.IComponentCfg cfg) + : base(cfg) + { + testMethodCfg = cfg as TestMethodCfg; + log.Debug(this.ToString()); + } + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + return (new FlyingStartFirstRepetWithMassCollSeq()).Execute(test, repetNr, isLastRepetition, testMethodCfg.TestParams, null, null, DebugLevel); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Single/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Single/Factory.cs new file mode 100644 index 00000000..3dd54076 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Single/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FlyingStartFirstRepetWithMassColl.Single +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Component.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Component(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Component(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this.GetType().Namespace.Substring(29), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Single/TestMethodCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Single/TestMethodCfg.cs new file mode 100644 index 00000000..4233a856 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Single/TestMethodCfg.cs @@ -0,0 +1,49 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FlyingStartFirstRepetWithMassColl.Single +{ + public class TestMethodCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestMethodCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new TestMethodCfgCtrl(); } + + /// Test parameters + [XmlIgnore] + public TestParams TestParams; + public override IParamsProvider GetRuntimeTestParamsProvider() { return TestParams; } + public override IParamsProvider CreateTestParamsProvider() { return new TestParams(true); } + public override IParamsProvider GetUITestParamsProvider(Test test) + { + return (test.Method == Name) ? base.GetUITestParamsProvider(test) : null; + } + + /// Private parameterless constructor invoked by all other (public) constructors + TestMethodCfg() + { + TestParams = new TestParams(true); + } + + public TestMethodCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + Factory = factory; + ParentName = string.Empty; + } + + public string ToString(int i) + { + return string.Format("Name={0}", Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Single/TestMethodCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Single/TestMethodCfgCtrl.cs new file mode 100644 index 00000000..c4401ebe --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Single/TestMethodCfgCtrl.cs @@ -0,0 +1,69 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FlyingStartFirstRepetWithMassColl.Single +{ + public partial class TestMethodCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + TestMethodCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as TestMethodCfg; + Redraw(); + } + } + + public TestMethodCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Single/TestMethodCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Single/TestMethodCfgCtrl.designer.cs new file mode 100644 index 00000000..ab324b1c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Single/TestMethodCfgCtrl.designer.cs @@ -0,0 +1,86 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +namespace TBF.BenchControl.TestMethods.FlyingStartFirstRepetWithMassColl.Single +{ + partial class TestMethodCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(137, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 5; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(27, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 4; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(134, 33); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 3; + this.classNameLabel.Text = "ComonentName"; + // + // BasicPrinterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "BasicPrinterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Single/TestMethodCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Single/TestMethodCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Single/TestMethodCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Single/TestParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Single/TestParams.cs new file mode 100644 index 00000000..0ead433d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/Single/TestParams.cs @@ -0,0 +1,120 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.FlyingStartFirstRepetWithMassColl.Single +{ + public class TestParams : TestParamsBase, IParamsProvider, ITestParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestParams) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public float NextTestVolume; /// [l] + + public override void InitializeAll() + { + NextTestVolume = 10; + } + + + string[] paramNames = new string[] + { + string.Format("{0} [l]", Strings.Next_test_volume), + }; + public override string ParamName(int i) { return paramNames[i]; } + public override int ParamsCount() { return paramNames.Length; } + + public override string ToString(int i) + { + switch (i) + { + case 0: return NextTestVolume.ToString(); + default: return string.Empty; + } + } + + public CfgUpdateFlags UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: NextTestVolume = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + default: return CfgUpdateFlags.None; + } + } + + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + float volumeToTank; + + switch (i) + { + case 0: + if (Utils.TryParseUFloat(strValue, out volumeToTank) && volumeToTank >= 0.1f) return true; + break; + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(TestParams prms) + { + prms.NextTestVolume = this.NextTestVolume; + } + + public IParamsProvider Clone() + { + TestParams pars = new TestParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateFromDbEntity(ComponentTest dbEntity) + { + if (dbEntity == null) return; + try + { + TestParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as TestParams; + + testParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + test = dbEntity.Test; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + /// + /// Parameterless constructor initializes the parameters + /// + public TestParams() + { + } + + public TestParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public TestParams(ComponentTest testParamsEntity, string componentName, Test test) + { + this.testParamsEntity = testParamsEntity; + this.componentName = componentName; + this.test = test; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Compound/Component.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Compound/Component.cs new file mode 100644 index 00000000..5377ae84 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Compound/Component.cs @@ -0,0 +1,40 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; + +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollProlonged.Compound +{ + public class Component : ComponentBase, GenericDevices.ITestMethod + { + private static readonly ILog log = LogManager.GetLogger(typeof(Component)); + public override string ToString() + { + return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); + } + + public bool CanTest(MetersKind meters) { return meters == MetersKind.Combined; } + public bool DoTransitions() { return true; } + + readonly TestMethodCfg testMethodCfg; + + public Component() + { + } + + public Component(Generic.IComponentCfg cfg) + : base(cfg) + { + testMethodCfg = cfg as TestMethodCfg; + log.Debug(this.ToString()); + } + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + return (new FlyingStartMassCollProlongedSeq()).Execute(test, repetNr, isLastRepetition, null, testMethodCfg.TestParams, null, DebugLevel); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Compound/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Compound/Factory.cs new file mode 100644 index 00000000..752f9aa8 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Compound/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollProlonged.Compound +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Component.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Component(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Component(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this.GetType().Namespace.Substring(29), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Compound/TestMethodCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Compound/TestMethodCfg.cs new file mode 100644 index 00000000..23e77dd2 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Compound/TestMethodCfg.cs @@ -0,0 +1,49 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollProlonged.Compound +{ + public class TestMethodCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestMethodCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new TestMethodCfgCtrl(); } + + /// Test parameters + [XmlIgnore] + public TestParams TestParams; + public override IParamsProvider GetRuntimeTestParamsProvider() { return TestParams; } + public override IParamsProvider CreateTestParamsProvider() { return new TestParams(true); } + public override IParamsProvider GetUITestParamsProvider(Test test) + { + return (test.Method == Name) ? base.GetUITestParamsProvider(test) : null; + } + + /// Private parameterless constructor invoked by all other (public) constructors + TestMethodCfg() + { + TestParams = new TestParams(true); + } + + public TestMethodCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + Factory = factory; + ParentName = string.Empty; + } + + public string ToString(int i) + { + return string.Format("Name={0}", Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Compound/TestMethodCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Compound/TestMethodCfgCtrl.cs new file mode 100644 index 00000000..b3e4235b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Compound/TestMethodCfgCtrl.cs @@ -0,0 +1,69 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollProlonged.Compound +{ + public partial class TestMethodCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + TestMethodCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as TestMethodCfg; + Redraw(); + } + } + + public TestMethodCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Compound/TestMethodCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Compound/TestMethodCfgCtrl.designer.cs new file mode 100644 index 00000000..8c27083d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Compound/TestMethodCfgCtrl.designer.cs @@ -0,0 +1,86 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollProlonged.Compound +{ + partial class TestMethodCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(137, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 5; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(27, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 4; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(134, 33); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 3; + this.classNameLabel.Text = "ComonentName"; + // + // BasicPrinterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "BasicPrinterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Compound/TestMethodCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Compound/TestMethodCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Compound/TestMethodCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Compound/TestParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Compound/TestParams.cs new file mode 100644 index 00000000..0abc6eec --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Compound/TestParams.cs @@ -0,0 +1,129 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollProlonged.Compound +{ + public class TestParams : TestParamsBase, IParamsProvider, ITestParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestParams) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public float VolumeToTank; + public bool SupressTrills; /// Main meter readings are ignored during test (suitable for small flows) + + public override void InitializeAll() + { + VolumeToTank = 10; + SupressTrills = false; + } + + + string[] paramNames = new string[] + { + string.Format("{0} [l]", Strings.Volume_to_tank), + Strings.SupressWMTrills, + }; + public override string ParamName(int i) { return paramNames[i]; } + public override int ParamsCount() { return paramNames.Length; } + + public override string ToString(int i) + { + switch (i) + { + case 0: return VolumeToTank.ToString(); + case 1: return (SupressTrills ? Strings.yes : Strings.no); + default: return string.Empty; + } + } + + public CfgUpdateFlags UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: VolumeToTank = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 1: SupressTrills = strValue.Equals(Strings.yes); return CfgUpdateFlags.None; + default: return CfgUpdateFlags.None; + } + } + + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + float volumeToTank; + + switch (i) + { + case 0: + if (Utils.TryParseUFloat(strValue, out volumeToTank) && volumeToTank >= 0.1f) return true; + break; + case 1: + if (strValue.Equals(Strings.yes) || strValue.Equals(Strings.no)) return true; + break; + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(TestParams prms) + { + prms.VolumeToTank = this.VolumeToTank; + prms.SupressTrills = this.SupressTrills; + } + + public IParamsProvider Clone() + { + TestParams pars = new TestParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateFromDbEntity(ComponentTest dbEntity) + { + if (dbEntity == null) return; + try + { + TestParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as TestParams; + + testParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + test = dbEntity.Test; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + /// + /// Parameterless constructor initializes the parameters + /// + public TestParams() + { + } + + public TestParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public TestParams(ComponentTest testParamsEntity, string componentName, Test test) + { + this.testParamsEntity = testParamsEntity; + this.componentName = componentName; + this.test = test; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/FlyingStartMassCollProlongedSeq.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/FlyingStartMassCollProlongedSeq.cs new file mode 100644 index 00000000..c8c049bf --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/FlyingStartMassCollProlongedSeq.cs @@ -0,0 +1,1117 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Text; +using log4net; +using Config; +using TBF.BenchControl; +using TBF.Boxes; +using TBF.Resources; +using TBF.UiBridge; + +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollProlonged +{ + public class FlyingStartMassCollProlongedSeq : Sequences.SequenceBase + { + private static readonly ILog log = LogManager.GetLogger(typeof(FlyingStartMassCollProlongedSeq)); + + /// + /// Flying start mass collection method sequence + /// + /// Test entity + /// + /// Event.Done . . . . . . . OK + /// Event.UiCmdStop . . . . Stopped by the user using the on-screen button STOP + /// Event.OpArgumentError . Target flow is out of range + /// Event.Error . . . . . . Unspecified error + /// + public IList Execute(Config.Entities.Test test, int repetitionNr, bool isLastRepetition, + Single.TestParams singleTestParams, + Compound.TestParams compoundTestParams, + HeatMeters.TestParams heatMetersTestParams, + Config.Entities.DebugMode debugLevel) + { + IList e = new List(); /// Events from currently running operations + Event retVal = Event.Done; + checkUiOp = new Operations.CheckUIOp(true); /// Runs in more then one state + + float volumeToTank = (singleTestParams != null) ? singleTestParams.VolumeToTank + : ((compoundTestParams != null) ? compoundTestParams.VolumeToTank + : heatMetersTestParams.VolumeToTank); + FloatBox switchTimeStart = new FloatBox(0.001f); /// in seconds, initial value is 1 ms + FloatBox switchTimeEnd = new FloatBox(0.001f); /// in seconds, initial value is 1 ms + + if (debugLevel == Config.Entities.DebugMode.Simulate) + { + /// + /// Test method simulation + /// + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (compoundTestParams != null) + { + if (test.Name.ToLower().Contains("nok")) MakeSimulatedCompound(test, 1, 0, 4.7f, 0.9f); + else MakeSimulatedCompound(test, 1, 0, 0.7f, 1.0f); + } + else if (heatMetersTestParams != null) + { + MakeSimulatedHeatMeters(test, 1, 0, 1.5f, 1000000, heatMetersTestParams.ErrorLimitLo, heatMetersTestParams.ErrorLimitHi, heatMetersTestParams.EvaluateVolume); + } + else + { + float errorPctBase = -1.0f; + if (test.Name.ToLower().Contains("q3")) errorPctBase = -0.5f; + else if (test.Name.ToLower().Contains("q2")) errorPctBase = 0.5f; + else if (test.Name.ToLower().Contains("q1")) errorPctBase = -5.1f; + + MakeSimulated(test, repetitionNr, 0, errorPctBase + repetitionNr * 0.1f); + } + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.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 + + for (int i = 0; i < Config.Data.WMsCount; i++) + { + TestMethods.iPerlCommunication.iPerlHead.IperlHead iPerl = ((sensPath.RegisterReaders != null) && (i < sensPath.RegisterReaders.Length)) + ? (sensPath.RegisterReaders[i] as TestMethods.iPerlCommunication.iPerlHead.IperlHead) + : null; + if (iPerl != null) + { + /// TODO: Reimplement + //iPerl.LastTestResult = meterRslt; /// Save this water meter test result to iPerl WM + iPerl.NominalTestFlowLph = 500.0 * (double)(test.Qfrom + test.Qto); /// Ave. + convert to liter/hour + } + } + + //------------------------------------------------------------------- + Bridge.OnActivity(this, string.Format("{0} Simulation", test.Name)); + //------------------------------------------------------------------- + + State.Create(string.Format("{0}({1}) : Simulation", test.Method, test.Name)) + .AddOperation(checkUiOp) + .EnterState(); + e = StateMachine.WaitRunDevsRunOps(); + + if (TestAndLogUiCmdStop(test, e)) retVal = Event.UiCmdStop; + + /// Create a list with one item 'retVal' (default is Event.Done) and return it + IList retListSim = new List(1); + retListSim.Add(retVal); + return retListSim; + } + + + if (volumeToTank > outPath.Scale.Capacity * Constants.TankFullFactor) + { + Bridge.OnError(this, Strings.Volume_to_tank_exceeds_the_scale_capacity); + retVal = Event.UiCmdStop; + goto stopTestWOStoppingDivGateEtc; + } + + if (volumeToTank > test.Volume) + { + Bridge.OnError(this, Strings.Volume_to_tank_is_larger_then_the_test_volume); + retVal = Event.UiCmdStop; + goto stopTestWOStoppingDivGateEtc; + } + + Elde.ControlBoardDev cBrd = StateMachine.ControlBoard; + processDataLoggingOp = new TBF.BenchControl.Operations.ProcessDataLoggingOp(processDataLogger, this, heatMetersTestParams != null); + + LtrPerRefPulse = outPath.FlowMeter.LtrPerPulse; + int targetTotalPulses = (int)(test.Volume / LtrPerRefPulse + 0.5f); + int targetMassPulses = (int)(volumeToTank / LtrPerRefPulse + 0.5f); + + int rangeIx = 0; /// Default range, used for non-Elde flowmeters + if (outPath.FlowMeter is Elde.FlowMeter.FlowMeter) + { + Elde.FlowMeter.FlowMeter eldeFM = outPath.FlowMeter as Elde.FlowMeter.FlowMeter; + rangeIx = -1; /// Indicates invalid range + for (int r = 0; r <= 5; r++) + { + if (eldeFM.RangeEnabled(r) && eldeFM.GetTempLo(r) <= test.TempLimLo + && eldeFM.GetTempHi(r) >= test.TempLimHi) + { + rangeIx = r; + } + } + + if (rangeIx == -1) + { + Bridge.OnError(this, Strings.Flow_meter_temperature_range_does_not_fit_this_test_conditions); + retVal = Event.UiCmdStop; + goto stopTestWOStoppingDivGateEtc; + } + } + + //==================================== + loop: + /// Start the test, initialize test results + Bridge.OnTestSelected(this, new TestSelectedEventArgs(test, repetitionNr, inPath, benchPath, outPath, sensPath, targetTotalPulses)); + string testName = Results.Utils.GetTestName(test.Name, test.Repeats, repetitionNr); + TestStartTime = DateTime.Now; + + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Checking_tank_capacity); + //------------------------------------------------ + bool drainTheTank = test.DoDraining; + + if (!drainTheTank) /// If condition met => skip measuring and force emptying + { + /// + /// Measure the weight and skip emptying if there is enough room in the tank + /// + State.Create(string.Format("{0}({1}) : Checking available tank capacity", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(outPath.Scale.ReadMassOp(ref Mass)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.BalanceDone)); + + double estimatedEndMass = Mass.Val + volumeToTank; + if (estimatedEndMass >= outPath.Scale.Capacity * Constants.TankFullFactor) + { + drainTheTank = true; + } + } + /// + if (drainTheTank) + { +#if BERLIN + switch (DrainTheTank(outPath.Scale.DrainValve, outPath.Scale)) + { + case Event.Error: { retVal = Event.Error; goto stopTest; } + case Event.UiCmdStop: { retVal = Event.UiCmdStop; goto stopTest; } + } + + drainTheTank = false; +#else + State.Create(string.Format("{0}({1}) : Open the drain valve", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(outPath.Scale.DrainValve, null)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (e.Contains(Event.ValvesBusy)); +#endif + } + + + /// + /// Optionally display prompt to emerge temperature meters to appropriate baths for heat meters test + /// + IOperation heatMetersPromptOp = null; + if (heatMetersTestParams != null && !string.IsNullOrEmpty(heatMetersTestParams.Prompt)) + { + /// Make sure the CycleBeginForm is closed + if (UIFlowControl.Stop == WaitBeginFormClosed()) goto stopTest; + + heatMetersPromptOp = new Operations.MessageBoxOp(heatMetersTestParams.Prompt); + } + + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Starting_the_pump); + //------------------------------------------------ + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + int flowSetTime0 = StateMachine.Time; + + if (inPath.Pump is GenericDevices.IPumpFM) (inPath.Pump as GenericDevices.IPumpFM).TurnOn(test.PumpPower); + /// + State.Create(string.Format("{0}({1}) : Starting the pump", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) +// .AddOperation(new Operations.SetAllRegulValvesOp(inPath.RegulValves, inPath.RegulValvesPct, 60)) + .AddOperation(heatMetersPromptOp) + .AddOperation(inPath.Pump != null ? cBrd.SetValvesOp(inPath.Pump, null) : null) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } + while (e.Contains(Event.ValvesBusy) /* || !e.Contains(Event.AllPositionsReached)*/); + + + if (test.TimePump2StartV > 0) + { + State.Create(string.Format("{0}({1}) : Waiting after the pump started", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(new Operations.TimerOp(test.TimePump2StartV)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + } + + + if (benchPath.StopBFValve != null) + { + State.Create(string.Format("{0}({1}) : Opening the stop backflow valve", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(benchPath.StopBFValve, null)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } + while (!e.Contains(Event.ValvesSet)); + } + + + if (test.TimeBeforeFlow > 0) + { + State.Create(string.Format("{0}({1}) : Waiting before flow setting process starts", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(new Operations.TimerOp(test.TimeBeforeFlow)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + } + + + setting_flow: + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Setting_the_flow); + //------------------------------------------------ + State.Create(string.Format("{0}({1}) : Setting the flow", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(outPath.RegulValve.SetFlowOp(outPath.FlowMeter, test.Qfrom, test.Qto, outPath.PidCoef, RefFlow, 990)) /// timeout = 16.5 min. + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (e.Contains(Event.OpArgumentError)) { retVal = Event.OpArgumentError; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.RegulValveTimeOut)) + { + Bridge.OnError(this, Strings.Flow_adjustment_failed); + retVal = Event.UiCmdStop; + goto stopTest; + } + if (e.Contains(Event.Next)) goto flow_set; + } + while (!e.Contains(Event.FlowReached)); + + flow_set: + + int flowSetTime = StateMachine.Time - flowSetTime0; + double currentFlow = RefFlow.Val; + + if (heatMetersTestParams != null && heatMetersPath != null) + { + //--------------------------------------------------- + Bridge.OnActivity(this, Strings.Setting_temperature); + //--------------------------------------------------- + + int lastTimeSec = StateMachine.Time; + double Tw_last = 0; + double Tc_last = 0; + + State.Create(string.Format("{0}({1}) : Check temperature stabilized.", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Next)) goto temperature_set; + + if (TempRefHi1.Val != 0 && TempRefHi2.Val != 0 && TempRefLo1.Val != 0 && TempRefLo2.Val != 0) + { + if (StateMachine.Time - lastTimeSec > 10 || StateMachine.Time - lastTimeSec < 0) + { + double Tw = (TempRefHi1.Val + TempRefHi2.Val) / 2; + double Tc = (TempRefLo1.Val + TempRefLo2.Val) / 2; + if (heatMetersTestParams.TempWarmLo <= Tw && Tw <= heatMetersTestParams.TempWarmHi && + heatMetersTestParams.TempColdLo <= Tc && Tc <= heatMetersTestParams.TempColdHi && + Math.Abs(Tw - Tw_last) <= heatMetersTestParams.ChangeInTimeWarm && + Math.Abs(Tc - Tc_last) <= heatMetersTestParams.ChangeInTimeCold && + Math.Abs(TempRefHi1.Val - TempRefHi2.Val) <= heatMetersTestParams.DeltaTempWarm && + Math.Abs(TempRefLo1.Val - TempRefLo2.Val) <= heatMetersTestParams.DeltaTempCold) + { + goto temperature_set; + } + + lastTimeSec = StateMachine.Time; + Tw_last = Tw; + Tc_last = Tc; + } + } + } + while (true); + } + else if (test.DoControlWaterTemp && benchPath.TempMtrUp != null && benchPath.TempMtrDown != null) + { + //--------------------------------------------------- + Bridge.OnActivity(this, Strings.Setting_temperature); + //--------------------------------------------------- + + State.Create(string.Format("{0}({1}) : Wait until the water temperature is within limits", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Next)) goto temperature_set; + + if (TempUp.Val >= test.TempLimLo && TempUp.Val <= test.TempLimHi && + TempDown.Val >= test.TempLimLo && TempDown.Val <= test.TempLimHi) + { + goto temperature_set; + } + } + while (true); + } + + temperature_set: + + + /// + /// Prepare cameras, ROI-s and measurementOperations + /// + + /// Find successfully detected ROI-s + IList rois = new List(); + foreach (var rr in sensPath.RegisterReaders) + { + GenericDevices.IRoi roi = rr as GenericDevices.IRoi; + if (roi != null && roi.Detected) + { + rois.Add(roi); + } + } + + /// Find cameras + IList cameras = new List(); + foreach (var roi in rois) + { + if (roi.Camera != null && !cameras.Contains(roi.Camera)) + { + cameras.Add(roi.Camera); + roi.Camera.ClearRoiParams(); + } + } + + /// Register ROI-parameters to cameras + foreach (var roi in rois) roi.RegisterRoiToCamera(); + + /// Prepare measurementOperations + IList measureOperations = new List(); + foreach (var camera in cameras) measureOperations.Add(camera.MeasurementOp()); + + + if (drainTheTank) + { + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Closing_the_tank); + //------------------------------------------------ + + /// + /// Make sure tank draining completed + /// + IList extraOps = new List(); + if (heatMetersPath != null) + { + extraOps.Add(heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)); + extraOps.Add(heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)); + extraOps.Add(heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)); + extraOps.Add(heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)); + } + switch (DrainTheTank(outPath.Scale.DrainValve, outPath.Scale, extraOps)) + { + case Event.Error: { retVal = Event.Error; goto stopTest; } + case Event.UiCmdStop: { retVal = Event.UiCmdStop; goto stopTest; } + } + + drainTheTank = false; + } + else + { + /// Close the drain valve anyway + State.Create(string.Format("{0}({1}) : Close the drain valve", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(null, outPath.Scale.DrainValve)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (e.Contains(Event.ValvesBusy)); + } + + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Measuring_the_weight); + //------------------------------------------------ + + if (test.TimeFlow2Mass > 0) + { + State.Create(string.Format("{0}({1}) : Waiting before 1st mass measurement", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation(cBrd.UpdateTankWeightOp()) + .AddOperation(new Operations.TimerOp(test.TimeFlow2Mass)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + } + + LogProcessDataTestInfo(processDataLogger, test.Procedure.Name, test.Name); + + if (heatMetersPath == null) LogProcessDataHeader(processDataLogger, "Start mass"); + else LogProcessDataHeaderHeatMeters(processDataLogger, "Start mass"); + + State.Create(string.Format("{0}({1}) : Measuring the start mass", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperations(measureOperations) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation((StateMachine.Ambient != null) + ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) : null) + .AddOperation(outPath.Scale.ReadStableMassOp(ref StartMass, test.MassRepeats, test.MassSpread, test.MassMethod)) + .AddOperation(cBrd.UpdateTankWeightOp()) + .AddOperation(processDataLoggingOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.BalanceDone)); + + log.WarnFormat("Start mass = {0}kg", StartMass); + Mass.Val = StartMass.Val; + + + if (heatMetersPath == null) LogProcessDataHeader(processDataLogger, "Measurement"); + else LogProcessDataHeaderHeatMeters(processDataLogger, "Measurement"); + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Test_in_progress); + //------------------------------------------------ + State.Create(string.Format("{0}({1}) : Starting the test", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperations(measureOperations) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation((StateMachine.Ambient != null) + ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) : null) + .AddOperation(cBrd.UpdateTankWeightOp()) + .AddOperation(processDataLoggingOp) + .AddOperation(cBrd.StartProlongedMeasurementOp(outPath, Elde.TestMethods.Diverter | Elde.TestMethods.Synchro | Elde.TestMethods.MassAndContinue, + test.Qfrom, test.Qto, targetTotalPulses, targetMassPulses, (float)test.TolerRed)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.MeasurementStarted)); + + + foreach (var rr in sensPath.RegisterReaders) + { + GenericDevices.IHasTestName readerWithTstName = rr as GenericDevices.IHasTestName; + if (readerWithTstName != null) + { + readerWithTstName.TestName = test.Name; + readerWithTstName.TestRepeats = test.Repeats; + readerWithTstName.RepetitionNr = repetitionNr; + } + } + + + /// Measurement loop - preparation + readRegistersOp = new Operations.ReadMoreRegistersOp(sensPath.RegisterReaders); + + int estimtdEndTime = StateMachine.Time + (int)test.TstTime; + StartNewStatistics(StateMachine.Time, BatchRslts.Batch.BatchNr, test.Name, repetitionNr); + + /// Measurement loop - begin + State.Create(string.Format("{0}({1}) : Reading watermeters", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperations(measureOperations) + .AddOperation(readRegistersOp) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation(outPath.Scale.ReadMassOp(ref Mass)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation((StateMachine.Ambient != null) + ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) + : null) + .AddOperation(cBrd.ReadDiverterTransitionOp(outPath.Diverter, 2, 4, switchTimeStart, DiverterStart, BatchRslts.Batch.BatchNr, test.Name, repetitionNr)) + .AddOperation(cBrd.QueryMeasurementEndOp()) + .AddOperation(processDataLoggingOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.MeasurementCompleted)) goto test_completed; + + //------------------------------------------------ + int remainingTime = Math.Max(estimtdEndTime - StateMachine.Time, 0); + if (remainingTime > 60) + { + Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", Strings.Test_in_progress, remainingTime / 60, "min", remainingTime % 60, Strings.sec)); + } + else + { + Bridge.OnActivity(this, string.Format("{0} ... {1} s", Strings.Test_in_progress, remainingTime)); + } + //------------------------------------------------ + + RefFreq.Val = cBrd.ReferenceFreq; + RefFlow.Val = cBrd.ReferenceFlow; + + UpdateAllStatistics(StateMachine.Time); + + if (heatMetersTestParams != null) + { + if (lastEnergyUpdateTime == 0) + { + lastEnergyUpdateTime = StateMachine.Time; + } + else + { + //double deltaTime = (double)(StateMachine.Time - lastEnergyUpdateTime); + double T_in = (TempRefHi1.Val + TempRefHi2.Val) / 2; /// [°C] + double T_out = (TempRefLo1.Val + TempRefLo2.Val) / 2; /// [°C] + double deltaVolume = LtrPerRefPulse * RefPulsesDelta; /// [l] + double deltaEnergy = (0.001 * deltaVolume) * (T_in - T_out) * Formulas.HeatCoefficientWater(16, T_in, T_out, heatMetersTestParams.FlowMeasuredAtHiTempPipe); /// [J] = [m3] * [K] * [J/(m3 K)] + Energy.Update(deltaEnergy); + VolumeForEnergy.Update(deltaVolume); + lastEnergyUpdateTime = StateMachine.Time; + } + } + + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + } + while (!e.Contains(Event.Next)); /// 'Next' button can be used in Debug version + + /// Measurement loop - end + + test_completed: + + StopRecordingStatistics(); + + /// + /// (Berlin:) Water is stopped immediately after the test and before the 2nd mass measurement in case: + /// - no 'transition sequence after test' is used + /// - this is the last (or the only) test repetition or test is a part of an 'outer loop' + /// + if (isLastRepetition && transitionAfter == null) + { + if (inPath.Pump is GenericDevices.IPumpFM) (inPath.Pump as GenericDevices.IPumpFM).TurnOff(); + + State.Create("SequenceBase : Transition : TestEnd - Default action") + .AddOperation(checkUiOp) + .AddOperation(new MettlerToledo.KeepReadingMassesOp()) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(StateMachine.DefaultValvesOpen, + StateMachine.DefaultValvesClose)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.ValvesSet)); + } + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Measuring_the_weight); + //------------------------------------------------ + State.Create(string.Format("{0}({1}) : Waiting before the 2nd mass measurement", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation((StateMachine.Ambient != null) + ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) : null) + .AddOperation(outPath.Scale.ReadMassOp(ref Mass)) + .AddOperation(cBrd.UpdateTankWeightOp()) + .AddOperation(cBrd.ReadDiverterTransitionOp(outPath.Diverter, 2, 4, switchTimeEnd, DiverterEnd, BatchRslts.Batch.BatchNr, test.Name, repetitionNr)) + .AddOperation(processDataLoggingOp) + .AddOperation(new Operations.TimerOp(test.TimeStop2Mass)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired) || !e.Contains(Event.BalanceDone)); + + + if (heatMetersPath == null) LogProcessDataHeader(processDataLogger, "End mass"); + else LogProcessDataHeaderHeatMeters(processDataLogger, "End mass"); + + State.Create(string.Format("{0}({1}) : Measuring the end mass", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation((StateMachine.Ambient != null) + ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) : null) + .AddOperation(outPath.Scale.ReadStableMassOp(ref EndMass, test.MassRepeats, test.MassSpread, test.MassMethod)) + .AddOperation(cBrd.UpdateTankWeightOp()) + .AddOperation(processDataLoggingOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.BalanceDone)); + /// + log.WarnFormat("End mass = {0}kg", EndMass); + TestEndTime = DateTime.Now; + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Test_completed); + //------------------------------------------------ + + /// Make sure the CycleBeginForm is closed so that water meter data (s/n) can be copied into results + if (heatMetersPromptOp == null) + { + if (UIFlowControl.Stop == WaitBeginFormClosed()) goto stopTest; + } + + /// + /// Populate TestResult data entity with data + /// + Results.Entities.TestRslt tstRslt = BatchRslts.GetTestRslt(testName, test.Part); + + if (tstRslt != null) + { + UpdateTempPressDensAmb(tstRslt); + + double totalPulses = Convert.ToDouble(cBrd.EtPulses(0)); + double massPulses = Convert.ToDouble(cBrd.EtPulsesK); + + /// Main results + tstRslt.MethodClass = TbfComponents.FindComponent(test.Method).ClassName; + tstRslt.StartTime = TestStartTime; + tstRslt.EndTime = TestEndTime; + tstRslt.FlowSetTime = flowSetTime; + tstRslt.TestTime = cBrd.TTime; /// [s] measurement time + tstRslt.PulsesMaster = totalPulses; /// Pulses of the master flow meter (test total) + tstRslt.MassStartRaw = StartMass.Val; + tstRslt.MassStart = Formulas.CorrectedValue(tstRslt.MassStartRaw, outPath.Scale.Corrections); + tstRslt.MassEndRaw = EndMass.Val; + tstRslt.MassEnd = Formulas.CorrectedValue(tstRslt.MassEndRaw, outPath.Scale.Corrections); + tstRslt.FlowMass = 3600.0 * (tstRslt.MassEnd - tstRslt.MassStart) * totalPulses / (tstRslt.TestTime * massPulses); /// [kg/h] + tstRslt.FlowVolume = 3.6 * LtrPerRefPulse * tstRslt.PulsesMaster / tstRslt.TestTime; /// [m3/h] + tstRslt.Buoyancy = Formulas.Buoyancy(); + double density = Formulas.WaterDensityFromTemp((tstRslt.TempUpMean + tstRslt.TempDownMean) / 2.0, Program.LocalSettings.RealDensity, Program.LocalSettings.AtTemperature); + double collectedVoluemCTV = 1000.0 * tstRslt.Buoyancy * (tstRslt.MassEnd - tstRslt.MassStart) / density; /// [l] 1000.0f is because density is in [kg/m3] + tstRslt.ConstMasterRaw = outPath.FlowMeter.LtrPerPulse; /// Uncorrected master flowmeter coefficient + tstRslt.ConstMasterCorr = outPath.FlowMeter.LtrPerPulseCorrected(tstRslt.FlowVolume, rangeIx); /// Corrected master pulses per liter + tstRslt.ConstMaster = (massPulses == 0) ? tstRslt.ConstMasterCorr : (collectedVoluemCTV / massPulses); + /// Calculated master pulses per liter + tstRslt.VolumeCTV = tstRslt.ConstMaster * totalPulses; + tstRslt.VolumeMaster = LtrPerRefPulse * totalPulses; /// [l] volume from the master flow meter + tstRslt.ErrorMaster = Formulas.ErrorFromVolumes(tstRslt.VolumeMaster, tstRslt.VolumeCTV); + + tstRslt.FlowMean = (float)RefFlowStat.Average; + tstRslt.FlowStart = (float)RefFlowStat.First; + tstRslt.FlowEnd = (float)RefFlowStat.Last; + tstRslt.FlowMin = (float)RefFlowStat.Min; + tstRslt.FlowMax = (float)RefFlowStat.Max; + + tstRslt.DiverterStart = switchTimeStart.Val; + tstRslt.DivStart10 = 0; + tstRslt.DivStart50 = 0; + tstRslt.DivStart90 = 0; + tstRslt.DiverterEnd = switchTimeEnd.Val; + tstRslt.DivEnd90 = 0; + tstRslt.DivEnd50 = 0; + tstRslt.DivEnd10 = 0; + log.DebugFormat("Diverter switch time [s]: Start: {0}ms ({1} {2} {3}) End: {4}ms ({5} {6} {7})", + (tstRslt.DiverterStart * 1000).ToString("F0"), tstRslt.DivStart10, tstRslt.DivStart50, tstRslt.DivStart90, + (tstRslt.DiverterEnd * 1000).ToString("F0"), tstRslt.DivEnd90, tstRslt.DivEnd50, tstRslt.DivEnd10); + + tstRslt.ErrorFlagsMd = (ErrorFlagsComp != null) ? (sbyte)ErrorFlagsComp.Mode : (sbyte)0; + tstRslt.ErrorFlags = (ErrorFlagsComp != null) ? ErrorFlagsComp.GetErrorFlags(tstRslt, true, false, tstRslt.DiverterStart, tstRslt.DiverterEnd) : 0; + + if (compoundTestParams != null) + { + /// + /// Compound meters + /// + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (test.Part != 0 && test.Part != Utils.PartNr(i + 1, BatchRslts.Batch.Compound)) continue; + + Results.Entities.MeterTestRslt mainMeterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.CompoundMain); + Results.Entities.MeterTestRslt auxMeterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.CompoundAux); + + for (int isAux = 0; isAux <= 1; isAux++) /// 0=main, 1=aux + { + GenericDevices.IRegisterReader regReader = sensPath.RegisterReaders[2 * i + isAux]; + Results.Entities.MeterTestRslt meterRslt = (isAux == 0) ? mainMeterRslt : auxMeterRslt; + + if (meterRslt != null && regReader != null) + { + meterRslt.RegReaderType = (int)regReader.RegisterReaderType; + meterRslt.PulsesPerLiter = regReader.PulsesPerLtr; + + /// Optionally supress pulses from the large water meter + meterRslt.PulsesMeter = (isAux == 0 && compoundTestParams.SupressTrills) ? 0 : Convert.ToDouble(regReader.WMPulses); + meterRslt.PulsesMaster = Convert.ToDouble(regReader.WMRefPulses); + + meterRslt.TestTime = cBrd.ImpulseTime(2 * i + isAux + 1); + meterRslt.VolumeStart = 0; + meterRslt.VolumeEnd = 0; + meterRslt.VolumeRef = tstRslt.VolumeCTV; + meterRslt.VolumeMeter = meterRslt.PulsesMeter * regReader.LtrsPerPulse; /// liter + + if (meterRslt.PulsesMaster != 0) + { + meterRslt.VolumeMeter *= (tstRslt.PulsesMaster / meterRslt.PulsesMaster); + } + + meterRslt.Error = Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, tstRslt.VolumeCTV); /// Main/Aux meter error is not usedfor evaluation + } + } + + Results.Entities.MeterTestRslt compoundMeterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.Compound); + + if (compoundMeterRslt != null && mainMeterRslt != null && auxMeterRslt != null) + { + compoundMeterRslt.VolumeRef = tstRslt.VolumeCTV; + compoundMeterRslt.VolumeMeter = mainMeterRslt.VolumeMeter + auxMeterRslt.VolumeMeter; + compoundMeterRslt.PulsesMaster = tstRslt.PulsesMaster; + compoundMeterRslt.TestTime = tstRslt.TestTime; + compoundMeterRslt.Error = Formulas.ErrorFromVolumes(compoundMeterRslt.VolumeMeter, compoundMeterRslt.VolumeRef); + compoundMeterRslt.Passed = (compoundMeterRslt.Error >= test.GetErrLimLo(tstRslt.FlowMean) + test.Uncertainty) + && (compoundMeterRslt.Error <= test.GetErrLimHi(tstRslt.FlowMean) - test.Uncertainty) + && (tstRslt.ErrorFlags == 0 || tstRslt.ErrorFlagsMode() != Config.Entities.ErrorFlagsMode.On); + mainMeterRslt.Passed = auxMeterRslt.Passed = compoundMeterRslt.Passed; + mainMeterRslt.TestDone = auxMeterRslt.TestDone = compoundMeterRslt.TestDone = true; + tstRslt.TestDone = true; + } + } + } + else if (heatMetersTestParams != null) + { + /// + /// Heat meters + /// + tstRslt.RefEnergy = Energy.Sum * tstRslt.VolumeCTV / VolumeForEnergy.Sum; /// [J] = [J] * [l] / [l] + + tstRslt.Custom1 = (float)TempRefHiStat.Average; + tstRslt.Custom2 = (float)TempRefHiStat.First; + tstRslt.Custom3 = (float)TempRefHiStat.Last; + tstRslt.Custom4 = (float)TempRefHiStat.Min; + tstRslt.Custom5 = (float)TempRefHiStat.Max; + tstRslt.Custom6 = (float)TempRefLoStat.Average; + tstRslt.Custom7 = (float)TempRefLoStat.First; + tstRslt.Custom8 = (float)TempRefLoStat.Last; + tstRslt.Custom9 = (float)TempRefLoStat.Min; + tstRslt.Custom10 = (float)TempRefLoStat.Max; + + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (test.Part != 0 && test.Part != Utils.PartNr(i + 1, BatchRslts.Batch.Compound)) continue; + + Results.Entities.MeterTestRslt volumeRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.HeatMeterVolume); + Results.Entities.MeterTestRslt energyRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.HeatMeterEnergy); + + BenchControl.GenericDevices.IRegisterReader volumeRegReader = + (sensPath.RegisterReaders.Length > 2 * i) ? sensPath.RegisterReaders[2 * i] : null; + + BenchControl.GenericDevices.IRegisterReader energyRegReader = + (sensPath.RegisterReaders.Length > 2 * i + 1) ? sensPath.RegisterReaders[2 * i + 1] : null; + + if (volumeRslt != null && volumeRegReader != null) + { + volumeRslt.PulsesPerLiter = volumeRegReader.PulsesPerLtr; /// [l ^ -1] + volumeRslt.PulsesMeter = Convert.ToDouble(volumeRegReader.WMPulses); + volumeRslt.PulsesMaster = Convert.ToDouble(volumeRegReader.WMRefPulses); + volumeRslt.VolumeStart = 0; + volumeRslt.VolumeEnd = 0; + volumeRslt.VolumeMeter = volumeRslt.PulsesMeter * volumeRegReader.LtrsPerPulse; /// [l] + volumeRslt.VolumeRef = volumeRslt.PulsesMaster * tstRslt.ConstMaster; /// [l] + volumeRslt.TestTime = cBrd.ImpulseTime(i + 1); /// [s] + + volumeRslt.Error = Formulas.ErrorFromVolumes(volumeRslt.VolumeMeter, volumeRslt.VolumeRef); + volumeRslt.Passed = !heatMetersTestParams.EvaluateVolume || + ((volumeRslt.Error >= test.GetErrLimLo(tstRslt.FlowMean) + test.Uncertainty) && + (volumeRslt.Error <= test.GetErrLimHi(tstRslt.FlowMean) - test.Uncertainty) && + (tstRslt.ErrorFlags == 0 || tstRslt.ErrorFlagsMode() != Config.Entities.ErrorFlagsMode.On)); + volumeRslt.TestDone = true; + tstRslt.TestDone = true; + } + + if (energyRslt != null && energyRegReader != null) + { + energyRslt.PulsesPerLiter = energyRegReader.PulsesPerLtr; /// [kWh ^ -1] + energyRslt.PulsesMeter = Convert.ToDouble(energyRegReader.WMPulses); + energyRslt.PulsesMaster = Convert.ToDouble(energyRegReader.WMRefPulses); + energyRslt.VolumeStart = 0; + energyRslt.VolumeEnd = 0; + energyRslt.VolumeRef = tstRslt.RefEnergy * (energyRslt.PulsesMaster / tstRslt.PulsesMaster); /// [J] + energyRslt.VolumeMeter = energyRslt.PulsesMeter * Config.Units.ConvertFrom(Config.Unit.kWh, energyRegReader.LtrsPerPulse); /// [J] + energyRslt.TestTime = cBrd.ImpulseTime(i + 1); /// [s] + + energyRslt.Error = Formulas.ErrorFromVolumes(energyRslt.VolumeMeter, energyRslt.VolumeRef); + energyRslt.Passed = (energyRslt.Error >= heatMetersTestParams.ErrorLimitLo) + && (energyRslt.Error <= heatMetersTestParams.ErrorLimitHi) + && (tstRslt.ErrorFlags == 0 || tstRslt.ErrorFlagsMode() != Config.Entities.ErrorFlagsMode.On); + energyRslt.TestDone = true; + tstRslt.TestDone = true; + } + } + } + else + { + /// + /// Single meters + /// + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (test.Part != 0 && test.Part != Utils.PartNr(i + 1, BatchRslts.Batch.Compound)) continue; + + /// MetersKind.Single meters + Results.Entities.MeterTestRslt meterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.Single); + GenericDevices.IRegisterReader regReader = sensPath.RegisterReaders[i]; + GenericDevices.IDatastreamReader dstrReader = regReader as GenericDevices.IDatastreamReader; + TestMethods.iPerlCommunication.iPerlHead.IperlHead iPerl = regReader as TestMethods.iPerlCommunication.iPerlHead.IperlHead; + GenericDevices.IRoi cameraRoi = regReader as GenericDevices.IRoi; + + if (meterRslt != null && regReader != null) + { + meterRslt.RegReaderType = (int)regReader.RegisterReaderType; + meterRslt.PulsesPerLiter = regReader.PulsesPerLtr; + meterRslt.PulsesMeter = Convert.ToDouble(regReader.WMPulses); + meterRslt.PulsesMaster = Convert.ToDouble(regReader.WMRefPulses); + + if (dstrReader != null) + { + meterRslt.TimestampStart = dstrReader.TimestampSecStart; + meterRslt.TimestampEnd = dstrReader.NoSamples ? (dstrReader.TimestampSecStart + tstRslt.TestTime) : dstrReader.TimestampSecEnd; + meterRslt.TestTime = meterRslt.TimestampEnd - meterRslt.TimestampStart; + meterRslt.VolumeStart = dstrReader.VolumeLtrStart; /// liter + meterRslt.VolumeEnd = dstrReader.VolumeLtrEnd; /// liter + meterRslt.VolumeMeter = Math.Abs(dstrReader.VolumeLtrEnd - dstrReader.VolumeLtrStart); + meterRslt.VolumeRef = tstRslt.VolumeCTV * meterRslt.TestTime / tstRslt.TestTime; + + if (iPerl != null) + { + if (iPerl.ResultCode != 0 && (meterRslt.WaterMeter.ResultCode & (int)Results.Entities.ResultCode.OptoErrorCodeMask) == 0) + { + meterRslt.WaterMeter.ResultCode |= iPerl.ResultCode; + } +#if IPERL + meterRslt.WaterMeter.CalibFactor = (iPerl.CalibrationStruct != null) ? iPerl.CalibrationStruct.Calibration : 0; + meterRslt.WaterMeter.Q2Correction = iPerl.Q2Correction; + meterRslt.WaterMeter.Q2CorrRFlow = iPerl.Q2CorrRFlow; + meterRslt.WaterMeter.Q2CorrLFlow = iPerl.Q2CorrLFlow; +#endif + iPerl.LastTestResult2 = iPerl.LastTestResult; /// Save shift previous test result + iPerl.LastTestResult = meterRslt; /// Save this test result + iPerl.NominalTestFlowLph = 500.0 * (test.Qfrom + test.Qto); /// Ave. + convert to liter/hour + } + } + else if (cameraRoi != null) + { + meterRslt.TimestampStart = cameraRoi.TimestampStart; /// second + meterRslt.TimestampEnd = cameraRoi.TimestampEnd; /// second + meterRslt.TestTime = cameraRoi.TimestampEnd - cameraRoi.TimestampStart; /// second + + meterRslt.VolumeStart = cameraRoi.VolumeStart; /// liter + meterRslt.VolumeEnd = cameraRoi.VolumeEnd; /// liter + meterRslt.VolumeMeter = cameraRoi.VolumeEnd - cameraRoi.VolumeStart; /// liter + + meterRslt.VolumeRef = tstRslt.VolumeCTV * meterRslt.TestTime / tstRslt.TestTime; + } + else + { + meterRslt.TestTime = cBrd.ImpulseTime(i + 1); /// TODO: Malo by sa citat z dosky + meterRslt.VolumeStart = 0; /// liter + meterRslt.VolumeEnd = 0; /// liter + meterRslt.VolumeMeter = meterRslt.PulsesMeter * regReader.LtrsPerPulse; /// liter + meterRslt.VolumeRef = meterRslt.PulsesMaster * tstRslt.ConstMaster; /// liter + } + + meterRslt.Error = Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef); + meterRslt.Passed = (meterRslt.Error >= test.GetErrLimLo(tstRslt.FlowMean) + test.Uncertainty) + && (meterRslt.Error <= test.GetErrLimHi(tstRslt.FlowMean) - test.Uncertainty) + && (tstRslt.ErrorFlags == 0 || tstRslt.ErrorFlagsMode() != Config.Entities.ErrorFlagsMode.On); + meterRslt.TestDone = true; + tstRslt.TestDone = true; + } + } + } + + tstRslt.Components = Results.Entities.Components.UpdateList(BatchRslts.ComponentsList, + new Results.Entities.Components((BenchInfo != null) ? BenchInfo.TestBenchId : 1, + (BenchInfo != null) ? BenchInfo.TestBenchName : "testbench", + inPath.Pump != null ? inPath.Pump.Name : string.Empty, + outPath.FlowMeter != null ? outPath.FlowMeter.Name : string.Empty, + outPath.Scale != null ? outPath.Scale.Name : string.Empty, + outPath.RegulValve != null ? outPath.RegulValve.Name : string.Empty, + outPath.Diverter != null ? outPath.Diverter.Name : string.Empty)); + + /// Update water meter error flags + if (ErrorFlagsComp != null) + { + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (BatchRslts.WaterMeters[i] != null) + { + BatchRslts.WaterMeters[i].ErrorFlags = ErrorFlagsComp.GetWMtrErrorFlags(BatchRslts.WaterMeters[i].MeterTestRslts); + } + } + } + + /// Update results + Bridge.OnTestCompleted(this, new TestCompletedEventArgs(testName, tstRslt)); + } + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.TransitionAfter)); + + /// Append the results to the CSV-file + allResults.Info(TestResult2CsvLine(testName, test.Part)); + + stopTest: + + StopRecordingStatistics(); + + /// + /// Quit this sequence + /// + if (isLastRepetition || retVal == Event.UiCmdStop || retVal == Event.OpArgumentError + || retVal == Event.Error || retVal == Event.ConfigurationError) + { + State.Create(string.Format("{0}({1}) : Stopping diverter, gate, etc.", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(cBrd.StopPreviousOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) goto stopTest; + } + while (!e.Contains(Event.PreviousStopped)); + } + + stopTestWOStoppingDivGateEtc: + + /// Create a list with one item 'retVal' (default is Event.Done) and return it + IList retList = new List(1); + retList.Add(retVal); + return retList; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/HeatMeters/Component.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/HeatMeters/Component.cs new file mode 100644 index 00000000..0c638fda --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/HeatMeters/Component.cs @@ -0,0 +1,40 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; + +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollProlonged.HeatMeters +{ + public class Component : ComponentBase, GenericDevices.ITestMethod + { + private static readonly ILog log = LogManager.GetLogger(typeof(Component)); + public override string ToString() + { + return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); + } + + public bool CanTest(MetersKind meters) { return meters == MetersKind.HeatMeter; } + public bool DoTransitions() { return true; } + + readonly TestMethodCfg testMethodCfg; + + public Component() + { + } + + public Component(Generic.IComponentCfg cfg) + : base(cfg) + { + testMethodCfg = cfg as TestMethodCfg; + log.Debug(this.ToString()); + } + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + return (new FlyingStartMassCollProlongedSeq()).Execute(test, repetNr, isLastRepetition, null, null, testMethodCfg.TestParams, DebugLevel); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/HeatMeters/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/HeatMeters/Factory.cs new file mode 100644 index 00000000..9367bb55 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/HeatMeters/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollProlonged.HeatMeters +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Component.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Component(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Component(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this.GetType().Namespace.Substring(29), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/HeatMeters/TestMethodCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/HeatMeters/TestMethodCfg.cs new file mode 100644 index 00000000..0af2f076 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/HeatMeters/TestMethodCfg.cs @@ -0,0 +1,49 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollProlonged.HeatMeters +{ + public class TestMethodCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestMethodCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new TestMethodCfgCtrl(); } + + /// Test parameters + [XmlIgnore] + public TestParams TestParams; + public override IParamsProvider GetRuntimeTestParamsProvider() { return TestParams; } + public override IParamsProvider CreateTestParamsProvider() { return new TestParams(true); } + public override IParamsProvider GetUITestParamsProvider(Test test) + { + return (test.Method == Name) ? base.GetUITestParamsProvider(test) : null; + } + + /// Private parameterless constructor invoked by all other (public) constructors + TestMethodCfg() + { + TestParams = new TestParams(true); + } + + public TestMethodCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + Factory = factory; + ParentName = string.Empty; + } + + public string ToString(int i) + { + return string.Format("Name={0}", Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/HeatMeters/TestMethodCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/HeatMeters/TestMethodCfgCtrl.cs new file mode 100644 index 00000000..ee72dfd1 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/HeatMeters/TestMethodCfgCtrl.cs @@ -0,0 +1,69 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollProlonged.HeatMeters +{ + public partial class TestMethodCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + TestMethodCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as TestMethodCfg; + Redraw(); + } + } + + public TestMethodCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/HeatMeters/TestMethodCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/HeatMeters/TestMethodCfgCtrl.designer.cs new file mode 100644 index 00000000..acaaf82c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/HeatMeters/TestMethodCfgCtrl.designer.cs @@ -0,0 +1,86 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollProlonged.HeatMeters +{ + partial class TestMethodCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(137, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 5; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(27, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 4; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(134, 33); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 3; + this.classNameLabel.Text = "ComonentName"; + // + // BasicPrinterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "BasicPrinterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/HeatMeters/TestMethodCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/HeatMeters/TestMethodCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/HeatMeters/TestMethodCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/HeatMeters/TestParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/HeatMeters/TestParams.cs new file mode 100644 index 00000000..c7b91ffe --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/HeatMeters/TestParams.cs @@ -0,0 +1,206 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollProlonged.HeatMeters +{ + public class TestParams : TestParamsBase, IParamsProvider, ITestParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestParams) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public float VolumeToTank; /// [l] + public float ErrorLimitLo; /// [%] + public float ErrorLimitHi; /// [%] + public bool EvaluateVolume; /// true = evaluate also the volume, false = evaluate only energy + public float TempWarmLo; /// Low limit for warm temperature [°C] + public float TempWarmHi; /// High limit for warm temperature [°C] + public float TempColdLo; /// Low limit for cold temperature [°C] + public float TempColdHi; /// High limit for cold temperature [°C] + public bool FlowMeasuredAtHiTempPipe; /// true = flow measured at high temp. pipe, false = flow measured at low temp. pipe + public float DeltaTempWarm; + public float DeltaTempCold; + public float ChangeInTimeWarm; + public float ChangeInTimeCold; + public string Prompt; + + public override void InitializeAll() + { + VolumeToTank = 10; + FlowMeasuredAtHiTempPipe = false; + } + + + string[] paramNames = new string[] + { + string.Format("{0} [l]", Strings.Volume_to_tank), + Strings.Err_limit_neg_pct_chdr, + Strings.Err_limit_pos_pct_chdr, + Strings.Evaluate_volume, + "T hi min", + "T hi max", + "T lo min", + "T lo max", + "Flow measured at high temp.pipe", + "Delta T warm", + "Delta T cold", + "Change in time T warm", + "Change in time T cold", + Strings.Prompt, + }; + public override string ParamName(int i) { return paramNames[i]; } + public override int ParamsCount() { return paramNames.Length; } + + public override string ToString(int i) + { + switch (i) + { + case 0: return VolumeToTank.ToString(); + case 1: return ErrorLimitLo.ToString(); + case 2: return ErrorLimitHi.ToString(); + case 3: return (EvaluateVolume ? Strings.yes : Strings.no); + case 4: return TempWarmLo.ToString(); + case 5: return TempWarmHi.ToString(); + case 6: return TempColdLo.ToString(); + case 7: return TempColdHi.ToString(); + case 8: return (FlowMeasuredAtHiTempPipe ? Strings.yes : Strings.no); + case 9: return DeltaTempWarm.ToString(); + case 10: return DeltaTempCold.ToString(); + case 11: return ChangeInTimeWarm.ToString(); + case 12: return ChangeInTimeCold.ToString(); + case 13: return Prompt; + default: return string.Empty; + } + } + + public CfgUpdateFlags UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: VolumeToTank = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 1: ErrorLimitLo = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 2: ErrorLimitHi = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 3: EvaluateVolume = strValue.Equals(Strings.yes); return CfgUpdateFlags.None; + case 4: TempWarmLo = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 5: TempWarmHi = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 6: TempColdLo = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 7: TempColdHi = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 8: FlowMeasuredAtHiTempPipe = strValue.Equals(Strings.yes); return CfgUpdateFlags.None; + case 9: DeltaTempWarm = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 10: DeltaTempCold = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 11: ChangeInTimeWarm = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 12: ChangeInTimeCold = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 13: Prompt = strValue; return CfgUpdateFlags.None; + default: return CfgUpdateFlags.None; + } + } + + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + float dummy; + + switch (i) + { + case 0: + if (Utils.TryParseUFloat(strValue, out dummy) && dummy >= 0.1f) return true; + break; + case 1: + case 2: + case 4: + case 5: + case 6: + case 7: + if (Utils.TryParseSFloat(strValue, out dummy)) return true; + break; + case 3: + case 8: + if (strValue.Equals(Strings.yes) || strValue.Equals(Strings.no)) return true; + break; + case 9: + case 10: + case 11: + case 12: + if (Utils.TryParseUFloat(strValue, out dummy)) return true; + break; + case 13: + return true; + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(TestParams prms) + { + prms.VolumeToTank = this.VolumeToTank; + prms.ErrorLimitLo = ErrorLimitLo; + prms.ErrorLimitHi = ErrorLimitHi; + prms.EvaluateVolume = EvaluateVolume; + prms.TempWarmLo = TempWarmLo; + prms.TempWarmHi = TempWarmHi; + prms.TempColdLo = TempColdLo; + prms.TempColdHi = TempColdHi; + prms.FlowMeasuredAtHiTempPipe = FlowMeasuredAtHiTempPipe; + prms.DeltaTempWarm = DeltaTempWarm; + prms.DeltaTempCold = DeltaTempCold; + prms.ChangeInTimeWarm = ChangeInTimeWarm; + prms.ChangeInTimeCold = ChangeInTimeCold; + prms.Prompt = Prompt; + } + + public IParamsProvider Clone() + { + TestParams pars = new TestParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateFromDbEntity(ComponentTest dbEntity) + { + if (dbEntity == null) return; + try + { + TestParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as TestParams; + + testParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + test = dbEntity.Test; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + /// + /// Parameterless constructor initializes the parameters + /// + public TestParams() + { + } + + public TestParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public TestParams(ComponentTest testParamsEntity, string componentName, Test test) + { + this.testParamsEntity = testParamsEntity; + this.componentName = componentName; + this.test = test; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Single/Component.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Single/Component.cs new file mode 100644 index 00000000..31489d5a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Single/Component.cs @@ -0,0 +1,40 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; + +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollProlonged.Single +{ + public class Component : ComponentBase, GenericDevices.ITestMethod + { + private static readonly ILog log = LogManager.GetLogger(typeof(Component)); + public override string ToString() + { + return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); + } + + public bool CanTest(MetersKind meters) { return meters == MetersKind.Single; } + public bool DoTransitions() { return true; } + + readonly TestMethodCfg testMethodCfg; + + public Component() + { + } + + public Component(Generic.IComponentCfg cfg) + : base(cfg) + { + testMethodCfg = cfg as TestMethodCfg; + log.Debug(this.ToString()); + } + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + return (new FlyingStartMassCollProlongedSeq()).Execute(test, repetNr, isLastRepetition, testMethodCfg.TestParams, null, null, DebugLevel); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Single/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Single/Factory.cs new file mode 100644 index 00000000..6a0bbadc --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Single/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollProlonged.Single +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Component.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Component(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Component(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this.GetType().Namespace.Substring(29), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Single/TestMethodCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Single/TestMethodCfg.cs new file mode 100644 index 00000000..f42ece1f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Single/TestMethodCfg.cs @@ -0,0 +1,49 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollProlonged.Single +{ + public class TestMethodCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestMethodCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new TestMethodCfgCtrl(); } + + /// Test parameters + [XmlIgnore] + public TestParams TestParams; + public override IParamsProvider GetRuntimeTestParamsProvider() { return TestParams; } + public override IParamsProvider CreateTestParamsProvider() { return new TestParams(true); } + public override IParamsProvider GetUITestParamsProvider(Test test) + { + return (test.Method == Name) ? base.GetUITestParamsProvider(test) : null; + } + + /// Private parameterless constructor invoked by all other (public) constructors + TestMethodCfg() + { + TestParams = new TestParams(true); + } + + public TestMethodCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + Factory = factory; + ParentName = string.Empty; + } + + public string ToString(int i) + { + return string.Format("Name={0}", Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Single/TestMethodCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Single/TestMethodCfgCtrl.cs new file mode 100644 index 00000000..df905a41 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Single/TestMethodCfgCtrl.cs @@ -0,0 +1,69 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollProlonged.Single +{ + public partial class TestMethodCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + TestMethodCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as TestMethodCfg; + Redraw(); + } + } + + public TestMethodCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Single/TestMethodCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Single/TestMethodCfgCtrl.designer.cs new file mode 100644 index 00000000..d5ec690b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Single/TestMethodCfgCtrl.designer.cs @@ -0,0 +1,86 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollProlonged.Single +{ + partial class TestMethodCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(137, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 5; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(27, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 4; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(134, 33); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 3; + this.classNameLabel.Text = "ComonentName"; + // + // BasicPrinterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "BasicPrinterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Single/TestMethodCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Single/TestMethodCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Single/TestMethodCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Single/TestParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Single/TestParams.cs new file mode 100644 index 00000000..89159757 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/Single/TestParams.cs @@ -0,0 +1,120 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollProlonged.Single +{ + public class TestParams : TestParamsBase, IParamsProvider, ITestParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestParams) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public float VolumeToTank; /// [l] + + public override void InitializeAll() + { + VolumeToTank = 10; + } + + + string[] paramNames = new string[] + { + string.Format("{0} [l]", Strings.Volume_to_tank), + }; + public override string ParamName(int i) { return paramNames[i]; } + public override int ParamsCount() { return paramNames.Length; } + + public override string ToString(int i) + { + switch (i) + { + case 0: return VolumeToTank.ToString(); + default: return string.Empty; + } + } + + public CfgUpdateFlags UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: VolumeToTank = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + default: return CfgUpdateFlags.None; + } + } + + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + float volumeToTank; + + switch (i) + { + case 0: + if (Utils.TryParseUFloat(strValue, out volumeToTank) && volumeToTank >= 0.1f) return true; + break; + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(TestParams prms) + { + prms.VolumeToTank = this.VolumeToTank; + } + + public IParamsProvider Clone() + { + TestParams pars = new TestParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateFromDbEntity(ComponentTest dbEntity) + { + if (dbEntity == null) return; + try + { + TestParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as TestParams; + + testParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + test = dbEntity.Test; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + /// + /// Parameterless constructor initializes the parameters + /// + public TestParams() + { + } + + public TestParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public TestParams(ComponentTest testParamsEntity, string componentName, Test test) + { + this.testParamsEntity = testParamsEntity; + this.componentName = componentName; + this.test = test; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/Compound/CombinedTestParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/Compound/CombinedTestParams.cs new file mode 100644 index 00000000..6be9acca --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/Compound/CombinedTestParams.cs @@ -0,0 +1,119 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollection.Compound +{ + public class CombinedTestParams : TestParamsBase, IParamsProvider, ITestParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(CombinedTestParams) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public bool SupressTrills; /// Main meter readings are ignored during test (suitable for small flows) + + public override void InitializeAll() + { + SupressTrills = false; + } + + + string[] paramNames = new string[] + { + Strings.SupressWMTrills, + }; + public override string ParamName(int i) { return paramNames[i]; } + public override int ParamsCount() { return paramNames.Length; } + + public override string ToString(int i) + { + switch (i) + { + case 0: return (SupressTrills ? Strings.yes : Strings.no); + default: return string.Empty; + } + } + + public CfgUpdateFlags UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: SupressTrills = strValue.Equals(Strings.yes); return CfgUpdateFlags.None; + default: return CfgUpdateFlags.None; + } + } + + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + + switch (i) + { + case 0: + if (strValue.Equals(Strings.yes) || strValue.Equals(Strings.no)) return true; + break; + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(CombinedTestParams prms) + { + prms.SupressTrills = this.SupressTrills; + } + + public IParamsProvider Clone() + { + CombinedTestParams pars = new CombinedTestParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateFromDbEntity(ComponentTest dbEntity) + { + if (dbEntity == null) return; + try + { + CombinedTestParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as CombinedTestParams; + + testParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + test = dbEntity.Test; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + /// + /// Parameterless constructor initializes the parameters + /// + public CombinedTestParams() + { + } + + public CombinedTestParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public CombinedTestParams(ComponentTest testParamsEntity, string componentName, Test test) + { + this.testParamsEntity = testParamsEntity; + this.componentName = componentName; + this.test = test; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/Compound/Component.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/Compound/Component.cs new file mode 100644 index 00000000..baf473ef --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/Compound/Component.cs @@ -0,0 +1,41 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; +using TBF.BenchControl.TestMethods.FlyingStartMassCollection; + +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollection.Compound +{ + public class Component : ComponentBase, GenericDevices.ITestMethod + { + private static readonly ILog log = LogManager.GetLogger(typeof(Component)); + public override string ToString() + { + return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); + } + + public bool CanTest(MetersKind meters) { return meters == MetersKind.Combined; } + public bool DoTransitions() { return true; } + + readonly TestMethodCfg testMethodCfg; + + public Component() + { + } + + public Component(Generic.IComponentCfg cfg) + : base(cfg) + { + testMethodCfg = cfg as TestMethodCfg; + log.Debug(this.ToString()); + } + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + return (new FlyingStartMassCollectionSeq()).Execute(test, repetNr, isLastRepetition, testMethodCfg.TestParams, null, DebugLevel); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/Compound/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/Compound/Factory.cs new file mode 100644 index 00000000..e9cdc2ae --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/Compound/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollection.Compound +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Component.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Component(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Component(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this.GetType().Namespace.Substring(29), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/Compound/TestMethodCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/Compound/TestMethodCfg.cs new file mode 100644 index 00000000..249a604c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/Compound/TestMethodCfg.cs @@ -0,0 +1,49 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollection.Compound +{ + public class TestMethodCfg : ComponentCfgBase, IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestMethodCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new TestMethodCfgCtrl(); } + + /// Test parameters + [XmlIgnore] + public CombinedTestParams TestParams; + public override IParamsProvider GetRuntimeTestParamsProvider() { return TestParams; } + public override IParamsProvider CreateTestParamsProvider() { return new CombinedTestParams(true); } + public override IParamsProvider GetUITestParamsProvider(Test test) + { + return (test.Method == Name) ? base.GetUITestParamsProvider(test) : null; + } + + /// Private parameterless constructor invoked by all other (public) constructors + TestMethodCfg() + { + TestParams = new CombinedTestParams(true); + } + + public TestMethodCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + Factory = factory; + ParentName = string.Empty; + } + + public string ToString(int i) + { + return string.Format("Name={0}", Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/Compound/TestMethodCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/Compound/TestMethodCfgCtrl.cs new file mode 100644 index 00000000..af901f38 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/Compound/TestMethodCfgCtrl.cs @@ -0,0 +1,69 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollection.Compound +{ + public partial class TestMethodCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + TestMethodCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as TestMethodCfg; + Redraw(); + } + } + + public TestMethodCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/Compound/TestMethodCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/Compound/TestMethodCfgCtrl.designer.cs new file mode 100644 index 00000000..e1239b63 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/Compound/TestMethodCfgCtrl.designer.cs @@ -0,0 +1,86 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollection.Compound +{ + partial class TestMethodCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(137, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 5; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(27, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 4; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(134, 33); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 3; + this.classNameLabel.Text = "ComonentName"; + // + // BasicPrinterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "BasicPrinterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/Compound/TestMethodCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/Compound/TestMethodCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/Compound/TestMethodCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs new file mode 100644 index 00000000..7d70a85c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs @@ -0,0 +1,1342 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Text; +using log4net; +using TBF.BenchControl; +using TBF.Boxes; +using TBF.Resources; +using TBF.UiBridge; +using TBF.BenchControl.GenericDevices; +using TBF.BenchControl.Sequences; +using TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead; +using Config; +using System.Threading; +using System.Windows.Forms; +using TBF.BenchControl.Danfoss.VLT2800; + +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollection +{ + public class FlyingStartMassCollectionSeq : Sequences.SequenceBase + { + private static readonly ILog log = LogManager.GetLogger(typeof(FlyingStartMassCollectionSeq)); + + /// + /// Flying start mass collection method sequence + /// + /// Test entity + /// + /// Event.Done . . . . . . . OK + /// Event.UiCmdStop . . . . Stopped by the user using the on-screen button STOP + /// Event.OpArgumentError . Target flow is out of range + /// Event.Error . . . . . . Unspecified error + /// + public IList Execute(Config.Entities.Test test, int repetitionNr, bool isLastRepetition, + Compound.CombinedTestParams compoundTestParams, + HeatMeters.TestParams heatMetersTestParams, + Config.Entities.DebugMode debugLevel) + { + IList e = new List(); /// Events from currently running operations + Event retVal = Event.Done; + checkUiOp = new Operations.CheckUIOp(true); /// Runs in more then one state + + FloatBox switchTimeStart = new FloatBox(0.001f); /// in seconds, initial value is 1 ms + FloatBox switchTimeEnd = new FloatBox(0.001f); /// in seconds, initial value is 1 ms + + if (debugLevel == Config.Entities.DebugMode.Simulate) + { + /// + /// Test method simulation + /// + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (compoundTestParams != null) + { + if (test.Name.ToLower().Contains("nok")) MakeSimulatedCompound(test, 1, 0, 4.7f, 0.9f); + else MakeSimulatedCompound(test, 1, 0, 0.7f, 1.0f); + } + else if (heatMetersTestParams != null) + { + MakeSimulatedHeatMeters(test, 1, 0, 1.5f, 1000000, heatMetersTestParams.ErrorLimitLo, heatMetersTestParams.ErrorLimitHi, heatMetersTestParams.EvaluateVolume); + } + else + { + float errorPctBase = -1.0f; + if (test.Name.ToLower().Contains("q3")) errorPctBase = -0.5f; + else if (test.Name.ToLower().Contains("q2")) errorPctBase = 0.5f; + else if (test.Name.ToLower().Contains("q1")) errorPctBase = -5.1f; + + MakeSimulated(test, repetitionNr, 0, errorPctBase + repetitionNr * 0.1f); + } + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.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 + + for (int i = 0; i < Config.Data.WMsCount; i++) + { + TestMethods.iPerlCommunication.iPerlHead.IperlHead iPerl = ((sensPath.RegisterReaders != null) && (i < sensPath.RegisterReaders.Length)) + ? (sensPath.RegisterReaders[i] as TestMethods.iPerlCommunication.iPerlHead.IperlHead) + : null; + if (iPerl != null) + { + /// TODO: Reimplement + //iPerl.LastTestResult = meterRslt; /// Save this water meter test result to iPerl WM + iPerl.NominalTestFlowLph = 500.0 * (double)(test.Qfrom + test.Qto); /// Ave. + convert to liter/hour + } + } + + //------------------------------------------------------------------- + Bridge.OnActivity(this, string.Format("{0} Simulation", test.Name)); + //------------------------------------------------------------------- + + State.Create(string.Format("{0}({1}) : Simulation", test.Method, test.Name)) + .AddOperation(checkUiOp) + .EnterState(); + e = StateMachine.WaitRunDevsRunOps(); + + if (TestAndLogUiCmdStop(test, e)) retVal = Event.UiCmdStop; + + /// Create a list with one item 'retVal' (default is Event.Done) and return it + IList retListSim = new List(1); + retListSim.Add(retVal); + return retListSim; + } + else if (debugLevel == Config.Entities.DebugMode.Inherit) + { + /// + /// Test method with flow chart simulation + /// + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + + /// Simulate flow + StartNewStatistics(StateMachine.Time, BatchRslts.Batch.BatchNr, test.Name, repetitionNr); + + IntBox remainingTime = new IntBox((int)test.TstTime); + State.Create(string.Format("{0}({1}) : Simulation", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(new Operations.TimerOp((int)test.TstTime, remainingTime)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; break; } + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + + if (remainingTime.Val > 60) + { + Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", Strings.Test_in_progress, remainingTime.Val / 60, "min", remainingTime.Val % 60, Strings.sec)); + } + else + { + Bridge.OnActivity(this, string.Format("{0} ... {1} s", Strings.Test_in_progress, remainingTime.Val)); + } + //------------------------------------------------ + + RefFlow.Val = (1.0 + 0.2 * Math.Sin(2 * Math.PI * (float)remainingTime.Val / test.TstTime)) * (test.Qfrom + test.Qto) / 2.0; + PressUp.Val = 2.7f; + PressDown.Val = 2.2f; + + UpdateAllStatistics(StateMachine.Time); + } + while (!e.Contains(Event.TimerExpired)); + + StopRecordingStatistics(); + + if (retVal != Event.UiCmdStop) + { + float errorPctBase = -1.0f; + + if (test.Name.ToLower().Contains("q3")) errorPctBase = -0.5f; + else if (test.Name.ToLower().Contains("q2")) errorPctBase = 0.5f; + else if (test.Name.ToLower().Contains("q1")) errorPctBase = -5.1f; + + MakeSimulated(test, repetitionNr, 0, errorPctBase + repetitionNr * 0.1f); + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.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 + } + + /// Create a list with one item 'retVal' (default is Event.Done) and return it + IList retListSim = new List(1); + retListSim.Add(retVal); + return retListSim; + } + + + Elde.ControlBoardDev cBrd = StateMachine.ControlBoard; + processDataLoggingOp = new TBF.BenchControl.Operations.ProcessDataLoggingOp(processDataLogger, this, heatMetersTestParams != null); + + LtrPerRefPulse = outPath.FlowMeter.LtrPerPulse; + int totalPulses = (int)(test.Volume / LtrPerRefPulse + 0.5f); + + int rangeIx = 0; /// Default range, used for non-Elde flowmeters + if (outPath.FlowMeter is Elde.FlowMeter.FlowMeter) + { + Elde.FlowMeter.FlowMeter eldeFM = outPath.FlowMeter as Elde.FlowMeter.FlowMeter; + rangeIx = -1; /// Indicates invalid range + for (int r = 0; r <= 5; r++) + { + if (eldeFM.RangeEnabled(r) && eldeFM.GetTempLo(r) <= test.TempLimLo + && eldeFM.GetTempHi(r) >= test.TempLimHi) + { + rangeIx = r; + } + } + + if (rangeIx == -1) + { + Bridge.OnError(this, Strings.Flow_meter_temperature_range_does_not_fit_this_test_conditions); + retVal = Event.UiCmdStop; + goto stopTestWOStoppingDivGateEtc; + } + } + + if (test.Volume > outPath.Scale.Capacity * Constants.TankFullFactor) + { + Bridge.OnError(this, Strings.Test_volume_exceeds_the_scale_capacity); + retVal = Event.UiCmdStop; + goto stopTestWOStoppingDivGateEtc; + } + var flowRetry = 3; + //==================================== + loop: + /// Start the test, initialize test results + Bridge.OnTestSelected(this, new TestSelectedEventArgs(test, repetitionNr, inPath, benchPath, outPath, sensPath, totalPulses)); + string testName = Results.Utils.GetTestName(test.Name, test.Repeats, repetitionNr); + TestStartTime = DateTime.Now; + + + bool atleastOneGenesis = false; + atleastOneGenesis = GenesisHeadBatch.Start(sensPath.RegisterReaders, Program.LocalSettings.LastSNTexts); + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Checking_tank_capacity); + //------------------------------------------------ + bool drainTheTank = test.DoDraining; + + if (!drainTheTank) /// If condition met => skip measuring and force emptying + { + /// + /// Measure the weight and skip emptying if there is enough room in the tank + /// + State.Create(string.Format("{0}({1}) : Checking available tank capacity", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(outPath.Scale.ReadMassOp(ref Mass)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.BalanceDone)); + + double estimatedEndMass = Mass.Val + test.Volume; + if (estimatedEndMass >= outPath.Scale.Capacity * Constants.TankFullFactor) + { + drainTheTank = true; + } + } + /// + if (drainTheTank) + { +#if BERLIN + switch (DrainTheTank(outPath.Scale.DrainValve, outPath.Scale)) + { + case Event.Error: { retVal = Event.Error; goto stopTest; } + case Event.UiCmdStop: { retVal = Event.UiCmdStop; goto stopTest; } + } + + drainTheTank = false; +#else + State.Create(string.Format("{0}({1}) : Open the drain valve", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(outPath.Scale.DrainValve, null)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (e.Contains(Event.ValvesBusy)); +#endif + } + + + /// + /// Optionally display prompt to emerge temperature meters to appropriate baths for heat meters test + /// + IOperation heatMetersPromptOp = null; + if (heatMetersTestParams != null && !string.IsNullOrEmpty(heatMetersTestParams.Prompt)) + { + /// Make sure the CycleBeginForm is closed + if (UIFlowControl.Stop == WaitBeginFormClosed()) goto stopTest; + + heatMetersPromptOp = new Operations.MessageBoxOp(heatMetersTestParams.Prompt); + } + + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Starting_the_pump); + //------------------------------------------------ + startingpumps: + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + int flowSetTime0 = StateMachine.Time; + + if (inPath.Pump is GenericDevices.IPumpFM) (inPath.Pump as GenericDevices.IPumpFM).TurnOn(0); + log.Debug($"TurnOn {inPath.Pump.Name} to 0%"); + + if (inPath.Pump is GenericDevices.IPumpFM) (inPath.Pump as GenericDevices.IPumpFM).TurnOn(test.PumpPower - (flowRetry -3)); + log.Debug($"TurnOn {inPath.Pump.Name} to {test.PumpPower - (flowRetry - 3)}%"); + + /// + /// + + State.Create(string.Format("{0}({1}) : Starting the pump", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + // .AddOperation(new Operations.SetAllRegulValvesOp(inPath.RegulValves, inPath.RegulValvesPct, 60)) + .AddOperation(heatMetersPromptOp) + .AddOperation(inPath.Pump != null ? cBrd.SetValvesOp(inPath.Pump, null) : null) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } + while (e.Contains(Event.ValvesBusy) /* || !e.Contains(Event.AllPositionsReached)*/); + + + if (test.TimePump2StartV > 0) + { + State.Create(string.Format("{0}({1}) : Waiting after the pump started", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(new Operations.TimerOp(test.TimePump2StartV)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + } + + + if (benchPath.StopBFValve != null) + { + State.Create(string.Format("{0}({1}) : Opening the stop backflow valve", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(benchPath.StopBFValve, null)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } + while (!e.Contains(Event.ValvesSet)); + } + + + if (test.TimeBeforeFlow > 0) + { + State.Create(string.Format("{0}({1}) : Waiting before flow setting process starts", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(new Operations.TimerOp(test.TimeBeforeFlow)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + } + + + setting_flow: + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Setting_the_flow); + //------------------------------------------------ + State.Create(string.Format("{0}({1}) : Setting the flow", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(outPath.RegulValve.SetFlowOp(outPath.FlowMeter, test.Qfrom, test.Qto, outPath.PidCoef, RefFlow, 990)) /// timeout = 16.5 min. + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (e.Contains(Event.OpArgumentError)) { retVal = Event.OpArgumentError; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.RegulValveTimeOut)) + { + if (flowRetry <= 0) + { + Bridge.OnError(this, Strings.Flow_adjustment_failed); + retVal = Event.UiCmdStop; + goto startingpumps; + } + log.Debug($"RegulValveTimeOut for {inPath.Pump.Name} and {outPath.RegulValve.Name} -> retries left: {flowRetry}"); + flowRetry = flowRetry - 1; + goto startingpumps; + + } + if (e.Contains(Event.Next)) goto flow_set; + } + while (!e.Contains(Event.FlowReached)); + + flow_set: + + int flowSetTime = StateMachine.Time - flowSetTime0; + double currentFlow = RefFlow.Val; + + if (heatMetersTestParams != null && heatMetersPath != null) + { + //--------------------------------------------------- + Bridge.OnActivity(this, Strings.Setting_temperature); + //--------------------------------------------------- + + int lastTimeSec = StateMachine.Time; + double Tw_last = 0; + double Tc_last = 0; + + State.Create(string.Format("{0}({1}) : Check temperature stabilized.", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation(heatMetersPromptOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Next)) goto temperature_set; + + if (TempRefHi1.Val != 0 && TempRefHi2.Val != 0 && TempRefLo1.Val != 0 && TempRefLo2.Val != 0) + { + if (StateMachine.Time - lastTimeSec > 10 || StateMachine.Time - lastTimeSec < 0) + { + double Tw = (TempRefHi1.Val + TempRefHi2.Val) / 2; + double Tc = (TempRefLo1.Val + TempRefLo2.Val) / 2; + if (heatMetersTestParams.TempWarmLo <= Tw && Tw <= heatMetersTestParams.TempWarmHi && + heatMetersTestParams.TempColdLo <= Tc && Tc <= heatMetersTestParams.TempColdHi && + Math.Abs(Tw - Tw_last) <= heatMetersTestParams.ChangeInTimeWarm && + Math.Abs(Tc - Tc_last) <= heatMetersTestParams.ChangeInTimeCold && + Math.Abs(TempRefHi1.Val - TempRefHi2.Val) <= heatMetersTestParams.DeltaTempWarm && + Math.Abs(TempRefLo1.Val - TempRefLo2.Val) <= heatMetersTestParams.DeltaTempCold) + { + goto temperature_set; + } + + lastTimeSec = StateMachine.Time; + Tw_last = Tw; + Tc_last = Tc; + } + } + } + while (true); + } + else if (test.DoControlWaterTemp && benchPath.TempMtrUp != null && benchPath.TempMtrDown != null) + { + //--------------------------------------------------- + Bridge.OnActivity(this, Strings.Setting_temperature); + //--------------------------------------------------- + + State.Create(string.Format("{0}({1}) : Wait until the water temperature is within limits", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Next)) goto temperature_set; + + if (TempUp.Val >= test.TempLimLo && TempUp.Val <= test.TempLimHi && + TempDown.Val >= test.TempLimLo && TempDown.Val <= test.TempLimHi) + { + goto temperature_set; + } + } + while (true); + } + + temperature_set: + + + /// + /// Prepare cameras, ROI-s and measurementOperations + /// + + /// Find successfully detected ROI-s + IList rois = new List(); + foreach (var rr in sensPath.RegisterReaders) + { + GenericDevices.IRoi roi = rr as GenericDevices.IRoi; + if (roi != null && roi.Detected) + { + rois.Add(roi); + } + } + + /// Find cameras + IList cameras = new List(); + foreach (var roi in rois) + { + if (roi.Camera != null && !cameras.Contains(roi.Camera)) + { + cameras.Add(roi.Camera); + roi.Camera.ClearRoiParams(); + } + } + + /// Register ROI-parameters to cameras + foreach (var roi in rois) roi.RegisterRoiToCamera(); + + /// Prepare measurementOperations + IList measureOperations = new List(); + foreach (var camera in cameras) measureOperations.Add(camera.MeasurementOp()); + + if (atleastOneGenesis) + { + if (test.Name.ToLower().Contains("calib")) + { + GenesisHeadBatch.BatchHolder.Value.MetersLogin(); + GenesisHeadBatch.BatchHolder.Value.MetersInitCalibration(); + + } + if (test.Name.ToLower().Contains("Init")) + { + GenesisHeadBatch.BatchHolder.Value.MetersLogin(); + GenesisHeadBatch.BatchHolder.Value.MetersInitMeasurement(); + } + } + + + if (drainTheTank) + { + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Closing_the_tank); + //------------------------------------------------ + + /// + /// Make sure tank draining completed + /// + IList extraOps = new List(); + if (heatMetersPath != null) + { + extraOps.Add(heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)); + extraOps.Add(heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)); + extraOps.Add(heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)); + extraOps.Add(heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)); + } + switch (DrainTheTank(outPath.Scale.DrainValve, outPath.Scale, extraOps)) + { + case Event.Error: { retVal = Event.Error; goto stopTest; } + case Event.UiCmdStop: { retVal = Event.UiCmdStop; goto stopTest; } + } + + drainTheTank = false; + } + else + { + /// Close the drain valve anyway + State.Create(string.Format("{0}({1}) : Close the drain valve", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(null, outPath.Scale.DrainValve)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (e.Contains(Event.ValvesBusy)); + } + + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Measuring_the_weight); + //------------------------------------------------ + + if (test.TimeFlow2Mass > 0) + { + State.Create(string.Format("{0}({1}) : Waiting before 1st mass measurement", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation(cBrd.UpdateTankWeightOp()) + .AddOperation(new Operations.TimerOp(test.TimeFlow2Mass)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + } + + LogProcessDataTestInfo(processDataLogger, test.Procedure.Name, test.Name); + + if (heatMetersPath == null) LogProcessDataHeader(processDataLogger, "Start mass"); + else LogProcessDataHeaderHeatMeters(processDataLogger, "Start mass"); + + State.Create(string.Format("{0}({1}) : Measuring the start mass", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperations(measureOperations) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation((StateMachine.Ambient != null) + ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) : null) + .AddOperation(outPath.Scale.ReadStableMassOp(ref StartMass, test.MassRepeats, test.MassSpread, test.MassMethod)) + .AddOperation(cBrd.UpdateTankWeightOp()) + .AddOperation(processDataLoggingOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.BalanceDone)); + + log.WarnFormat("Start mass = {0}kg", StartMass); + Mass.Val = StartMass.Val; + + + if (heatMetersPath == null) LogProcessDataHeader(processDataLogger, "Measurement"); + else LogProcessDataHeaderHeatMeters(processDataLogger, "Measurement"); + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Test_in_progress); + //------------------------------------------------ + State.Create(string.Format("{0}({1}) : Starting the test", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperations(measureOperations) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation((StateMachine.Ambient != null) + ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) : null) + .AddOperation(cBrd.UpdateTankWeightOp()) + .AddOperation(processDataLoggingOp) + .AddOperation(cBrd.StartMeasurementOp(outPath, Elde.TestMethods.Diverter | Elde.TestMethods.Synchro, + test.Qfrom, test.Qto, totalPulses, (float)test.TolerRed)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.MeasurementStarted)); + + + foreach (var rr in sensPath.RegisterReaders) + { + GenericDevices.IHasTestName readerWithTstName = rr as GenericDevices.IHasTestName; + if (readerWithTstName != null) + { + readerWithTstName.TestName = test.Name; + readerWithTstName.TestRepeats = test.Repeats; + readerWithTstName.RepetitionNr = repetitionNr; + } + if (rr is TestMethods.GenesisCommunication.GenesisHead.GenesisHead) + { + (rr as TestMethods.GenesisCommunication.GenesisHead.GenesisHead).StartRead(test.Name, BatchRslts.Batch.BatchNr, repetitionNr); + } + } + + + /// Measurement loop - preparation + readRegistersOp = new Operations.ReadMoreRegistersOp(sensPath.RegisterReaders); + + int estimtdEndTime = StateMachine.Time + (int)test.TstTime; + StartNewStatistics(StateMachine.Time, BatchRslts.Batch.BatchNr, test.Name, repetitionNr); + + /// Measurement loop - begin + State.Create(string.Format("{0}({1}) : Reading watermeters", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperations(measureOperations) + .AddOperation(readRegistersOp) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation(outPath.Scale.ReadMassOp(ref Mass)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation((StateMachine.Ambient != null) + ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) + : null) + .AddOperation(cBrd.ReadDiverterTransitionOp(outPath.Diverter, 2, 4, switchTimeStart, DiverterStart, BatchRslts.Batch.BatchNr, test.Name, repetitionNr)) + .AddOperation(cBrd.QueryMeasurementEndOp()) + .AddOperation(processDataLoggingOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.MeasurementCompleted)) goto test_completed; + + //------------------------------------------------ + int remainingTime = Math.Max(estimtdEndTime - StateMachine.Time, 0); + if (remainingTime > 60) + { + Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", Strings.Test_in_progress, remainingTime / 60, "min", remainingTime % 60, Strings.sec)); + } + else + { + Bridge.OnActivity(this, string.Format("{0} ... {1} s", Strings.Test_in_progress, remainingTime)); + } + //------------------------------------------------ + + RefFreq.Val = cBrd.ReferenceFreq; + RefFlow.Val = cBrd.ReferenceFlow; + + UpdateAllStatistics(StateMachine.Time); + + if (heatMetersTestParams != null) + { + if (lastEnergyUpdateTime == 0) + { + lastEnergyUpdateTime = StateMachine.Time; + } + else + { + //double deltaTime = (double)(StateMachine.Time - lastEnergyUpdateTime); + double T_in = (TempRefHi1.Val + TempRefHi2.Val) / 2; /// [°C] + double T_out = (TempRefLo1.Val + TempRefLo2.Val) / 2; /// [°C] + double deltaVolume = LtrPerRefPulse * RefPulsesDelta; /// [l] + double deltaEnergy = (0.001 * deltaVolume) * (T_in - T_out) * Config.Formulas.HeatCoefficientWater(16, T_in, T_out, heatMetersTestParams.FlowMeasuredAtHiTempPipe); /// [J] = [m3] * [K] * [J/(m3 K)] + Energy.Update(deltaEnergy); + VolumeForEnergy.Update(deltaVolume); + lastEnergyUpdateTime = StateMachine.Time; + } + } + + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + } + while (!e.Contains(Event.Next)); /// 'Next' button can be used in Debug version + + /// Measurement loop - end + + test_completed: + + StopRecordingStatistics(); + if (test.Name.ToLower().Contains("calib")) + { + GenesisHeadBatch.BatchHolder.Value.MetersStopCalibration(); + } + else + { + GenesisHeadBatch.BatchHolder.Value.MetersStopMeasurement(); + } + + /// + /// (Berlin:) Water is stopped immediately after the test and before the 2nd mass measurement in case: + /// - no 'transition sequence after test' is used + /// - this is the last (or the only) test repetition or test is a part of an 'outer loop' + /// + if (isLastRepetition && transitionAfter == null) + { + if (inPath.Pump is GenericDevices.IPumpFM) (inPath.Pump as GenericDevices.IPumpFM).TurnOff(); + + State.Create("SequenceBase : Transition : TestEnd - Default action") + .AddOperation(checkUiOp) + .AddOperation(new MettlerToledo.KeepReadingMassesOp()) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(StateMachine.DefaultValvesOpen, + StateMachine.DefaultValvesClose)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.ValvesSet)); + } + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Measuring_the_weight); + //------------------------------------------------ + State.Create(string.Format("{0}({1}) : Waiting before the 2nd mass measurement", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation((StateMachine.Ambient != null) + ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) : null) + .AddOperation(outPath.Scale.ReadMassOp(ref Mass)) + .AddOperation(cBrd.UpdateTankWeightOp()) + .AddOperation(cBrd.ReadDiverterTransitionOp(outPath.Diverter, 2, 4, switchTimeEnd, DiverterEnd, BatchRslts.Batch.BatchNr, test.Name, repetitionNr)) + .AddOperation(processDataLoggingOp) + .AddOperation(new Operations.TimerOp(test.TimeStop2Mass)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired) || !e.Contains(Event.BalanceDone)); + + + if (heatMetersPath == null) LogProcessDataHeader(processDataLogger, "End mass"); + else LogProcessDataHeaderHeatMeters(processDataLogger, "End mass"); + + State.Create(string.Format("{0}({1}) : Measuring the end mass", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp == null ? null : benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown == null ? null : benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv == null ? null : outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp == null ? null : benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown == null ? null : benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)) + .AddOperation(heatMetersPath == null ? null : heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)) + .AddOperation((StateMachine.Ambient != null) + ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) : null) + .AddOperation(outPath.Scale.ReadStableMassOp(ref EndMass, test.MassRepeats, test.MassSpread, test.MassMethod)) + .AddOperation(cBrd.UpdateTankWeightOp()) + .AddOperation(processDataLoggingOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.BalanceDone)); + /// + log.WarnFormat("End mass = {0}kg", EndMass); + TestEndTime = DateTime.Now; + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Test_completed); + //------------------------------------------------ + + /// Make sure the CycleBeginForm is closed so that water meter data (s/n) can be copied into results + if (heatMetersPromptOp == null) + { + if (UIFlowControl.Stop == WaitBeginFormClosed()) goto stopTest; + } + + /// + /// Populate TestResult data entity with data + /// + Results.Entities.TestRslt tstRslt = BatchRslts.GetTestRslt(testName, test.Part); + + if (tstRslt != null) + { + UpdateTempPressDensAmb(tstRslt); + + /// Main results + tstRslt.MethodClass = TbfComponents.FindComponent(test.Method).ClassName; + tstRslt.StartTime = TestStartTime; + tstRslt.EndTime = TestEndTime; + tstRslt.FlowSetTime = flowSetTime; + tstRslt.TestTime = cBrd.TTime; /// [s] measurement time + tstRslt.PulsesMaster = Convert.ToDouble(cBrd.EtPulses(0)); /// Pulses of the master flow meter (test total) + tstRslt.MassStartRaw = StartMass.Val; + tstRslt.MassStart = Config.Formulas.CorrectedValue(tstRslt.MassStartRaw, outPath.Scale.Corrections); + tstRslt.MassEndRaw = EndMass.Val; + tstRslt.MassEnd = Config.Formulas.CorrectedValue(tstRslt.MassEndRaw, outPath.Scale.Corrections); + tstRslt.FlowMass = 3600.0 * (tstRslt.MassEnd - tstRslt.MassStart) / tstRslt.TestTime; /// [kg/h] + tstRslt.FlowVolume = 3.6 * LtrPerRefPulse * tstRslt.PulsesMaster / tstRslt.TestTime; /// [m3/h] + tstRslt.Buoyancy = Config.Formulas.Buoyancy(); + double density = Config.Formulas.WaterDensityFromTemp((tstRslt.TempUpMean + tstRslt.TempDownMean) / 2.0, Program.LocalSettings.RealDensity, Program.LocalSettings.AtTemperature); + tstRslt.VolumeCTV = 1000.0 * tstRslt.Buoyancy * (tstRslt.MassEnd - tstRslt.MassStart) / density; /// [l] 1000.0f is because density is in [kg/m3] + tstRslt.VolumeMaster = LtrPerRefPulse * tstRslt.PulsesMaster; /// [l] volume from the master flow meter + tstRslt.ConstMasterRaw = outPath.FlowMeter.LtrPerPulse; /// Uncorrected master flowmeter coefficient + tstRslt.ConstMasterCorr = outPath.FlowMeter.LtrPerPulseCorrected(tstRslt.FlowVolume, rangeIx); /// Corrected master pulses per liter + tstRslt.ConstMaster = (tstRslt.VolumeMaster == 0) ? tstRslt.ConstMasterCorr : (LtrPerRefPulse * tstRslt.VolumeCTV / tstRslt.VolumeMaster); + /// Calculated master pulses per liter + tstRslt.ErrorMaster = Config.Formulas.ErrorFromVolumes(tstRslt.VolumeMaster, tstRslt.VolumeCTV); + + tstRslt.FlowMean = (float)RefFlowStat.Average; + tstRslt.FlowStart = (float)RefFlowStat.First; + tstRslt.FlowEnd = (float)RefFlowStat.Last; + tstRslt.FlowMin = (float)RefFlowStat.Min; + tstRslt.FlowMax = (float)RefFlowStat.Max; + + tstRslt.DiverterStart = switchTimeStart.Val; + tstRslt.DivStart10 = 0; + tstRslt.DivStart50 = 0; + tstRslt.DivStart90 = 0; + tstRslt.DiverterEnd = switchTimeEnd.Val; + tstRslt.DivEnd90 = 0; + tstRslt.DivEnd50 = 0; + tstRslt.DivEnd10 = 0; + log.DebugFormat("Diverter switch time [s]: Start: {0}ms ({1} {2} {3}) End: {4}ms ({5} {6} {7})", + (tstRslt.DiverterStart * 1000).ToString("F0"), tstRslt.DivStart10, tstRslt.DivStart50, tstRslt.DivStart90, + (tstRslt.DiverterEnd * 1000).ToString("F0"), tstRslt.DivEnd90, tstRslt.DivEnd50, tstRslt.DivEnd10); + + tstRslt.ErrorFlagsMd = (ErrorFlagsComp != null) ? (sbyte)ErrorFlagsComp.Mode : (sbyte)0; + tstRslt.ErrorFlags = (ErrorFlagsComp != null) ? ErrorFlagsComp.GetErrorFlags(tstRslt, true, false, tstRslt.DiverterStart, tstRslt.DiverterEnd) : 0; + + if (compoundTestParams != null) + { + /// + /// Compound meters + /// + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (test.Part != 0 && test.Part != Utils.PartNr(i + 1, BatchRslts.Batch.Compound)) continue; + + Results.Entities.MeterTestRslt mainMeterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.CompoundMain); + Results.Entities.MeterTestRslt auxMeterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.CompoundAux); + + for (int isAux = 0; isAux <= 1; isAux++) /// 0=main, 1=aux + { + GenericDevices.IRegisterReader regReader = sensPath.RegisterReaders[2 * i + isAux]; + Results.Entities.MeterTestRslt meterRslt = (isAux == 0) ? mainMeterRslt : auxMeterRslt; + + if (meterRslt != null && regReader != null) + { + meterRslt.RegReaderType = (int)regReader.RegisterReaderType; + meterRslt.PulsesPerLiter = regReader.PulsesPerLtr; + + /// Optionally supress pulses from the large water meter + meterRslt.PulsesMeter = (isAux == 0 && compoundTestParams.SupressTrills) ? 0 : Convert.ToDouble(regReader.WMPulses); + meterRslt.PulsesMaster = Convert.ToDouble(regReader.WMRefPulses); + + meterRslt.TestTime = cBrd.ImpulseTime(2 * i + isAux + 1); + meterRslt.VolumeStart = 0; + meterRslt.VolumeEnd = 0; + meterRslt.VolumeRef = tstRslt.VolumeCTV; + meterRslt.VolumeMeter = meterRslt.PulsesMeter * regReader.LtrsPerPulse; /// liter + + if (meterRslt.PulsesMaster != 0) + { + meterRslt.VolumeMeter *= (tstRslt.PulsesMaster / meterRslt.PulsesMaster); + } + + meterRslt.Error = Config.Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, tstRslt.VolumeCTV); /// Main/Aux meter error is not usedfor evaluation + } + } + + Results.Entities.MeterTestRslt compoundMeterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.Compound); + + if (compoundMeterRslt != null && mainMeterRslt != null && auxMeterRslt != null) + { + compoundMeterRslt.VolumeRef = tstRslt.VolumeCTV; + compoundMeterRslt.VolumeMeter = mainMeterRslt.VolumeMeter + auxMeterRslt.VolumeMeter; + compoundMeterRslt.PulsesMaster = tstRslt.PulsesMaster; + compoundMeterRslt.TestTime = tstRslt.TestTime; + compoundMeterRslt.Error = Config.Formulas.ErrorFromVolumes(compoundMeterRslt.VolumeMeter, compoundMeterRslt.VolumeRef); + compoundMeterRslt.Passed = (compoundMeterRslt.Error >= test.GetErrLimLo(tstRslt.FlowMean) + test.Uncertainty) + && (compoundMeterRslt.Error <= test.GetErrLimHi(tstRslt.FlowMean) - test.Uncertainty) + && (tstRslt.ErrorFlags == 0 || tstRslt.ErrorFlagsMode() != Config.Entities.ErrorFlagsMode.On); + mainMeterRslt.Passed = auxMeterRslt.Passed = compoundMeterRslt.Passed; + mainMeterRslt.TestDone = auxMeterRslt.TestDone = compoundMeterRslt.TestDone = true; + tstRslt.TestDone = true; + } + } + } + else if (heatMetersTestParams != null) + { + /// + /// Heat meters + /// + tstRslt.RefEnergy = Energy.Sum * tstRslt.VolumeCTV / VolumeForEnergy.Sum; /// [J] = [J] * [l] / [l] + + tstRslt.Custom1 = (float)TempRefHiStat.Average; + tstRslt.Custom2 = (float)TempRefHiStat.First; + tstRslt.Custom3 = (float)TempRefHiStat.Last; + tstRslt.Custom4 = (float)TempRefHiStat.Min; + tstRslt.Custom5 = (float)TempRefHiStat.Max; + tstRslt.Custom6 = (float)TempRefLoStat.Average; + tstRslt.Custom7 = (float)TempRefLoStat.First; + tstRslt.Custom8 = (float)TempRefLoStat.Last; + tstRslt.Custom9 = (float)TempRefLoStat.Min; + tstRslt.Custom10 = (float)TempRefLoStat.Max; + + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (test.Part != 0 && test.Part != Utils.PartNr(i + 1, BatchRslts.Batch.Compound)) continue; + + Results.Entities.MeterTestRslt volumeRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.HeatMeterVolume); + Results.Entities.MeterTestRslt energyRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.HeatMeterEnergy); + + BenchControl.GenericDevices.IRegisterReader volumeRegReader = + (sensPath.RegisterReaders.Length > 2 * i) ? sensPath.RegisterReaders[2 * i] : null; + + BenchControl.GenericDevices.IRegisterReader energyRegReader = + (sensPath.RegisterReaders.Length > 2 * i + 1) ? sensPath.RegisterReaders[2 * i + 1] : null; + + if (volumeRslt != null && volumeRegReader != null) + { + volumeRslt.PulsesPerLiter = volumeRegReader.PulsesPerLtr; /// [l ^ -1] + volumeRslt.PulsesMeter = Convert.ToDouble(volumeRegReader.WMPulses); + volumeRslt.PulsesMaster = Convert.ToDouble(volumeRegReader.WMRefPulses); + volumeRslt.VolumeStart = 0; + volumeRslt.VolumeEnd = 0; + volumeRslt.VolumeMeter = volumeRslt.PulsesMeter * volumeRegReader.LtrsPerPulse; /// [l] + volumeRslt.VolumeRef = volumeRslt.PulsesMaster * tstRslt.ConstMaster; /// [l] + volumeRslt.TestTime = cBrd.ImpulseTime(i + 1); /// [s] + + volumeRslt.Error = Config.Formulas.ErrorFromVolumes(volumeRslt.VolumeMeter, volumeRslt.VolumeRef); + volumeRslt.Passed = !heatMetersTestParams.EvaluateVolume || + ((volumeRslt.Error >= test.GetErrLimLo(tstRslt.FlowMean) + test.Uncertainty) && + (volumeRslt.Error <= test.GetErrLimHi(tstRslt.FlowMean) - test.Uncertainty) && + (tstRslt.ErrorFlags == 0 || tstRslt.ErrorFlagsMode() != Config.Entities.ErrorFlagsMode.On)); + volumeRslt.TestDone = true; + tstRslt.TestDone = true; + } + + if (energyRslt != null && energyRegReader != null) + { + energyRslt.PulsesPerLiter = energyRegReader.PulsesPerLtr; /// [kWh ^ -1] + energyRslt.PulsesMeter = Convert.ToDouble(energyRegReader.WMPulses); + energyRslt.PulsesMaster = Convert.ToDouble(energyRegReader.WMRefPulses); + energyRslt.VolumeStart = 0; + energyRslt.VolumeEnd = 0; + energyRslt.VolumeRef = tstRslt.RefEnergy * (energyRslt.PulsesMaster / tstRslt.PulsesMaster); /// [J] + energyRslt.VolumeMeter = energyRslt.PulsesMeter * Config.Units.ConvertFrom(Config.Unit.kWh, energyRegReader.LtrsPerPulse); /// [J] + energyRslt.TestTime = cBrd.ImpulseTime(i + 1); /// [s] + + energyRslt.Error = Config.Formulas.ErrorFromVolumes(energyRslt.VolumeMeter, energyRslt.VolumeRef); + energyRslt.Passed = (energyRslt.Error >= heatMetersTestParams.ErrorLimitLo) + && (energyRslt.Error <= heatMetersTestParams.ErrorLimitHi) + && (tstRslt.ErrorFlags == 0 || tstRslt.ErrorFlagsMode() != Config.Entities.ErrorFlagsMode.On); + energyRslt.TestDone = true; + tstRslt.TestDone = true; + } + } + } + else + { + /// + /// Single meters + /// + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (test.Part != 0 && test.Part != Utils.PartNr(i + 1, BatchRslts.Batch.Compound)) continue; + + /// MetersKind.Single meters + Results.Entities.MeterTestRslt meterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.Single); + GenericDevices.IRegisterReader regReader = sensPath.RegisterReaders[i]; + GenericDevices.IDatastreamReader dstrReader = regReader as GenericDevices.IDatastreamReader; + TestMethods.iPerlCommunication.iPerlHead.IperlHead iPerl = regReader as TestMethods.iPerlCommunication.iPerlHead.IperlHead; + TestMethods.GenesisCommunication.GenesisHead.GenesisHead Genesis = regReader as TestMethods.GenesisCommunication.GenesisHead.GenesisHead; + + GenericDevices.IRoi cameraRoi = regReader as GenericDevices.IRoi; + + if (meterRslt != null && regReader != null) + { + meterRslt.RegReaderType = (int)regReader.RegisterReaderType; + meterRslt.PulsesPerLiter = regReader.PulsesPerLtr; + meterRslt.PulsesMeter = Convert.ToDouble(regReader.WMPulses); + meterRslt.PulsesMaster = Convert.ToDouble(regReader.WMRefPulses); + + if (Genesis != null) + { + Genesis.Stop(tstRslt.TestTime, tstRslt.VolumeCTV); + meterRslt.TimestampStart = Genesis.TimestampSecStart; + meterRslt.TimestampEnd = Genesis.TimestampSecEnd; + meterRslt.TestTime = Genesis.WMTestTime; + meterRslt.VolumeStart = Genesis.BeginWMState; + meterRslt.VolumeEnd = Genesis.EndWMState; /// liter + meterRslt.VolumeMeter = Math.Abs(Genesis.WMVolume); + meterRslt.VolumeRef = tstRslt.VolumeCTV; + if (GenesisHeadBatch.MeterIdDetailResults == null) + { + Genesis.Log("MeterIdDetailResults na!"); + } + else + { + if (Genesis.DetailedResults != null) + { + try + { + GenesisHeadBatch.MeterIdDetailResults.Add(meterRslt.SerialNr(), Genesis.DetailedResults); + } + catch (Exception ex) + { + Genesis.Log(ex.Message.ToString()); + } + + } + else + { + Genesis.Log("DetailedResults na!"); + } + + } + Genesis.Log("VolumeRef=" + meterRslt.VolumeRef); + Genesis.Log("TestTime Meter =" + meterRslt.TestTime + "S, test time ref =" + tstRslt.TestTime + "s"); + + Genesis.Log(" results for " + test.Name); + Genesis.Log(" Ref Vol = " + meterRslt.VolumeRef + " m³"); + Genesis.Log(" Ref Time = " + tstRslt.TestTime + " s"); + Genesis.Log(" Meter Time = " + meterRslt.TestTime + " s"); + Genesis.Log(" Meter Vol = " + meterRslt.VolumeMeter + " m³"); + + var calError = Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef); + Genesis.Log(" MeterError = " + calError.ToString() + " %"); + + + + + + + + + } + else if (dstrReader != null) + { + + meterRslt.TimestampStart = dstrReader.TimestampSecStart; + meterRslt.TimestampEnd = dstrReader.NoSamples ? (dstrReader.TimestampSecStart + tstRslt.TestTime) : dstrReader.TimestampSecEnd; + meterRslt.TestTime = meterRslt.TimestampEnd - meterRslt.TimestampStart; + meterRslt.VolumeStart = dstrReader.VolumeLtrStart; /// liter + meterRslt.VolumeEnd = dstrReader.VolumeLtrEnd; /// liter + meterRslt.VolumeMeter = Math.Abs(dstrReader.VolumeLtrEnd - dstrReader.VolumeLtrStart); + meterRslt.VolumeRef = tstRslt.VolumeCTV * meterRslt.TestTime / tstRslt.TestTime; + + if (iPerl != null) + { + if (iPerl.ResultCode != 0 && (meterRslt.WaterMeter.ResultCode & (int)Results.Entities.ResultCode.OptoErrorCodeMask) == 0) + { + meterRslt.WaterMeter.ResultCode |= iPerl.ResultCode; + } +#if IPERL + meterRslt.WaterMeter.CalibFactor = (iPerl.CalibrationStruct != null) ? iPerl.CalibrationStruct.Calibration : 0; + meterRslt.WaterMeter.Q2Correction = iPerl.Q2Correction; + meterRslt.WaterMeter.Q2CorrRFlow = iPerl.Q2CorrRFlow; + meterRslt.WaterMeter.Q2CorrLFlow = iPerl.Q2CorrLFlow; +#endif + iPerl.LastTestResult2 = iPerl.LastTestResult; /// Save shift previous test result + iPerl.LastTestResult = meterRslt; /// Save this test result + iPerl.NominalTestFlowLph = 500.0 * (test.Qfrom + test.Qto); /// Ave. + convert to liter/hour + } + } + else if (cameraRoi != null) + { + meterRslt.TimestampStart = cameraRoi.TimestampStart; /// second + meterRslt.TimestampEnd = cameraRoi.TimestampEnd; /// second + + meterRslt.VolumeStart = cameraRoi.VolumeStart; /// liter + meterRslt.VolumeEnd = cameraRoi.VolumeEnd; /// liter + meterRslt.VolumeMeter = cameraRoi.VolumeEnd - cameraRoi.VolumeStart; /// liter + + if (meterRslt.VolumeMeter != 0) + { + /// Normal measurement with camera + meterRslt.TestTime = cameraRoi.TimestampEnd - cameraRoi.TimestampStart; /// second + meterRslt.VolumeRef = tstRslt.VolumeCTV * meterRslt.TestTime / tstRslt.TestTime; + } + else + { + /// None or one pulse from the water meter using camera + meterRslt.TestTime = tstRslt.TestTime; + meterRslt.VolumeRef = tstRslt.VolumeCTV; + } + } + else + { + meterRslt.VolumeStart = 0; /// liter + meterRslt.VolumeEnd = 0; /// liter + meterRslt.VolumeMeter = meterRslt.PulsesMeter * regReader.LtrsPerPulse; /// liter + /// + if (regReader.WMPulses > 1) + { + /// Normal measurement + meterRslt.TestTime = cBrd.ImpulseTime(i + 1); + meterRslt.VolumeRef = meterRslt.PulsesMaster * tstRslt.ConstMaster; /// liter + } + else + { + /// None or one pulse from the water meter + meterRslt.TestTime = tstRslt.TestTime; + meterRslt.VolumeRef = tstRslt.VolumeCTV; /// liter + } + } + + meterRslt.Error = Config.Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef); + +#if TEST_MODE + if (!BatchRslts.IsProduction() && + ((test.Name.ToLower().Contains("q2") && Math.Abs(meterRslt.Error) > 2.0 && Math.Abs(meterRslt.Error) <= 4.0) || + (test.Name.ToLower().Contains("q1") && Math.Abs(meterRslt.Error) > 5.0 && Math.Abs(meterRslt.Error) <= 10.0))) + { + meterRslt.KorrErrQ = meterRslt.Error; + meterRslt.Error /= 2.0; + meterRslt.VolumeMeter = (1.0 + meterRslt.Error / 100.0) * meterRslt.VolumeRef; + meterRslt.PulsesMeter = meterRslt.VolumeMeter * regReader.PulsesPerLtr; + + if (meterRslt.VolumeEnd > meterRslt.VolumeStart) + { + meterRslt.VolumeEnd = meterRslt.VolumeStart + meterRslt.VolumeMeter; + } + else if (meterRslt.VolumeEnd < meterRslt.VolumeStart) + { + meterRslt.VolumeEnd = meterRslt.VolumeStart - meterRslt.VolumeMeter; + } + } + else + { + meterRslt.KorrErrQ = 0; + } +#endif + + meterRslt.Passed = (meterRslt.Error >= test.GetErrLimLo(tstRslt.FlowMean) + test.Uncertainty) + && (meterRslt.Error <= test.GetErrLimHi(tstRslt.FlowMean) - test.Uncertainty) + && (tstRslt.ErrorFlags == 0 || tstRslt.ErrorFlagsMode() != Config.Entities.ErrorFlagsMode.On); + meterRslt.TestDone = true; + tstRslt.TestDone = true; + } + } + } + + tstRslt.Components = Results.Entities.Components.UpdateList(BatchRslts.ComponentsList, + new Results.Entities.Components((BenchInfo != null) ? BenchInfo.TestBenchId : 1, + (BenchInfo != null) ? BenchInfo.TestBenchName : "testbench", + inPath.Pump != null ? inPath.Pump.Name : string.Empty, + outPath.FlowMeter != null ? outPath.FlowMeter.Name : string.Empty, + outPath.Scale != null ? outPath.Scale.Name : string.Empty, + outPath.RegulValve != null ? outPath.RegulValve.Name : string.Empty, + outPath.Diverter != null ? outPath.Diverter.Name : string.Empty)); + + /// Update water meter error flags + if (ErrorFlagsComp != null) + { + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (BatchRslts.WaterMeters[i] != null) + { + BatchRslts.WaterMeters[i].ErrorFlags = ErrorFlagsComp.GetWMtrErrorFlags(BatchRslts.WaterMeters[i].MeterTestRslts); + } + } + } + + /// Update results + Bridge.OnTestCompleted(this, new TestCompletedEventArgs(testName, tstRslt)); + } + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.TransitionAfter)); + + /// Append the results to the CSV-file + allResults.Info(TestResult2CsvLine(testName, test.Part)); + if (!String.IsNullOrEmpty(test.Procedure.ResultsWriter)) + { + string[] writers = StateMachine.Procedure.ResultsWriter.Split(new char[] { '~' }); + foreach (var writerName in writers) + { + IResultsWriter writer = TbfComponents.FindComponent(writerName) as IResultsWriter; + if (writer != null && writer is DB.SensusLa.Database) + { + var SensusLaWriter = ((DB.SensusLa.Database)writer); + + State.Create(string.Format("{0}({1}) : Store results into db.", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(SensusLaWriter.WriteResultsOp(tstRslt, BatchRslts, GenesisHeadBatch.MeterIdDetailResults)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + } + while (!e.Contains(Event.Error) && !e.Contains(Event.ResultsWritten) && !e.Contains(Event.ResultsNotWritten)); + + } + } + } + stopTest: + GenesisHeadBatch.BatchHolder.Value.RemoveAllMeters(); + StopRecordingStatistics(); /// Make sure graph files are closed + + /// + /// Quit this sequence + /// + if (isLastRepetition || retVal == Event.UiCmdStop || retVal == Event.OpArgumentError + || retVal == Event.Error || retVal == Event.ConfigurationError || retVal == Event.Retry) + { + State.Create(string.Format("{0}({1}) : Stopping diverter, gate, etc.", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(cBrd.StopPreviousOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) goto stopTest; + } + while (!e.Contains(Event.PreviousStopped)); + } + + stopTestWOStoppingDivGateEtc: + + /// Create a list with one item 'retVal' (default is Event.Done) and return it + IList retList = new List(1); + retList.Add(retVal); + return retList; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/HeatMeters/Component.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/HeatMeters/Component.cs new file mode 100644 index 00000000..72828b5d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/HeatMeters/Component.cs @@ -0,0 +1,40 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; + +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollection.HeatMeters +{ + public class Component : ComponentBase, GenericDevices.ITestMethod + { + private static readonly ILog log = LogManager.GetLogger(typeof(Component)); + public override string ToString() + { + return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); + } + + public bool CanTest(MetersKind meters) { return meters == MetersKind.HeatMeter; } + public bool DoTransitions() { return true; } + + readonly TestMethodCfg testMethodCfg; + + public Component() + { + } + + public Component(Generic.IComponentCfg cfg) + : base(cfg) + { + testMethodCfg = cfg as TestMethodCfg; + log.Debug(this.ToString()); + } + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + return (new FlyingStartMassCollectionSeq()).Execute(test, repetNr, isLastRepetition, null, testMethodCfg.TestParams, DebugLevel); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/HeatMeters/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/HeatMeters/Factory.cs new file mode 100644 index 00000000..ebd85255 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/HeatMeters/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollection.HeatMeters +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Component.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Component(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Component(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this.GetType().Namespace.Substring(29), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/HeatMeters/TestMethodCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/HeatMeters/TestMethodCfg.cs new file mode 100644 index 00000000..ecf86a50 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/HeatMeters/TestMethodCfg.cs @@ -0,0 +1,49 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollection.HeatMeters +{ + public class TestMethodCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestMethodCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new TestMethodCfgCtrl(); } + + /// Test parameters + [XmlIgnore] + public TestParams TestParams; + public override IParamsProvider GetRuntimeTestParamsProvider() { return TestParams; } + public override IParamsProvider CreateTestParamsProvider() { return new TestParams(true); } + public override IParamsProvider GetUITestParamsProvider(Test test) + { + return (test.Method == Name) ? base.GetUITestParamsProvider(test) : null; + } + + /// Private parameterless constructor invoked by all other (public) constructors + TestMethodCfg() + { + TestParams = new TestParams(true); + } + + public TestMethodCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + Factory = factory; + ParentName = string.Empty; + } + + public string ToString(int i) + { + return string.Format("Name={0}", Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/HeatMeters/TestMethodCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/HeatMeters/TestMethodCfgCtrl.cs new file mode 100644 index 00000000..08942704 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/HeatMeters/TestMethodCfgCtrl.cs @@ -0,0 +1,69 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollection.HeatMeters +{ + public partial class TestMethodCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + TestMethodCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as TestMethodCfg; + Redraw(); + } + } + + public TestMethodCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/HeatMeters/TestMethodCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/HeatMeters/TestMethodCfgCtrl.designer.cs new file mode 100644 index 00000000..54a4c59e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/HeatMeters/TestMethodCfgCtrl.designer.cs @@ -0,0 +1,86 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollection.HeatMeters +{ + partial class TestMethodCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(137, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 5; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(27, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 4; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(134, 33); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 3; + this.classNameLabel.Text = "ComonentName"; + // + // BasicPrinterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "BasicPrinterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/HeatMeters/TestMethodCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/HeatMeters/TestMethodCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/HeatMeters/TestMethodCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/HeatMeters/TestParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/HeatMeters/TestParams.cs new file mode 100644 index 00000000..d5184bdf --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/HeatMeters/TestParams.cs @@ -0,0 +1,197 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollection.HeatMeters +{ + public class TestParams : TestParamsBase, IParamsProvider, ITestParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestParams) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public float ErrorLimitLo; /// [%] + public float ErrorLimitHi; /// [%] + public bool EvaluateVolume; /// true = evaluate also the volume, false = evaluate only energy + public float TempWarmLo; /// Low limit for warm temperature [°C] + public float TempWarmHi; /// High limit for warm temperature [°C] + public float TempColdLo; /// Low limit for cold temperature [°C] + public float TempColdHi; /// High limit for cold temperature [°C] + public bool FlowMeasuredAtHiTempPipe; /// true = flow measured at high temp. pipe, false = flow measured at low temp. pipe + public float DeltaTempWarm; + public float DeltaTempCold; + public float ChangeInTimeWarm; + public float ChangeInTimeCold; + public string Prompt; + + public override void InitializeAll() + { + FlowMeasuredAtHiTempPipe = false; + } + + + string[] paramNames = new string[] + { + Strings.Err_limit_neg_pct_chdr, + Strings.Err_limit_pos_pct_chdr, + Strings.Evaluate_volume, + "T hi min", + "T hi max", + "T lo min", + "T lo max", + "Flow measured at high temp.pipe", + "Delta T warm", + "Delta T cold", + "Change in time T warm", + "Change in time T cold", + Strings.Prompt, + }; + public override string ParamName(int i) { return paramNames[i]; } + public override int ParamsCount() { return paramNames.Length; } + + public override string ToString(int i) + { + switch (i) + { + case 0: return ErrorLimitLo.ToString(); + case 1: return ErrorLimitHi.ToString(); + case 2: return (EvaluateVolume ? Strings.yes : Strings.no); + case 3: return TempWarmLo.ToString(); + case 4: return TempWarmHi.ToString(); + case 5: return TempColdLo.ToString(); + case 6: return TempColdHi.ToString(); + case 7: return (FlowMeasuredAtHiTempPipe ? Strings.yes : Strings.no); + case 8: return DeltaTempWarm.ToString(); + case 9: return DeltaTempCold.ToString(); + case 10: return ChangeInTimeWarm.ToString(); + case 11: return ChangeInTimeCold.ToString(); + case 12: return Prompt; + default: return string.Empty; + } + } + + public CfgUpdateFlags UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: ErrorLimitLo = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 1: ErrorLimitHi = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 2: EvaluateVolume = strValue.Equals(Strings.yes); return CfgUpdateFlags.None; + case 3: TempWarmLo = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 4: TempWarmHi = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 5: TempColdLo = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 6: TempColdHi = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 7: FlowMeasuredAtHiTempPipe = strValue.Equals(Strings.yes); return CfgUpdateFlags.None; + case 8: DeltaTempWarm = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 9: DeltaTempCold = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 10: ChangeInTimeWarm = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 11: ChangeInTimeCold = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 12: Prompt = strValue; return CfgUpdateFlags.None; + default: return CfgUpdateFlags.None; + } + } + + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + float dummy; + + switch (i) + { + case 0: + case 1: + case 3: + case 4: + case 5: + case 6: + if (Utils.TryParseSFloat(strValue, out dummy)) return true; + break; + case 2: + case 7: + if (strValue.Equals(Strings.yes) || strValue.Equals(Strings.no)) return true; + break; + case 8: + case 9: + case 10: + case 11: + if (Utils.TryParseUFloat(strValue, out dummy)) return true; + break; + case 12: + return true; + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(TestParams prms) + { + prms.ErrorLimitLo = ErrorLimitLo; + prms.ErrorLimitHi = ErrorLimitHi; + prms.EvaluateVolume = EvaluateVolume; + prms.TempWarmLo = TempWarmLo; + prms.TempWarmHi = TempWarmHi; + prms.TempColdLo = TempColdLo; + prms.TempColdHi = TempColdHi; + prms.FlowMeasuredAtHiTempPipe = FlowMeasuredAtHiTempPipe; + prms.DeltaTempWarm = DeltaTempWarm; + prms.DeltaTempCold = DeltaTempCold; + prms.ChangeInTimeWarm = ChangeInTimeWarm; + prms.ChangeInTimeCold = ChangeInTimeCold; + prms.Prompt = Prompt; + } + + public IParamsProvider Clone() + { + TestParams pars = new TestParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateFromDbEntity(ComponentTest dbEntity) + { + if (dbEntity == null) return; + try + { + TestParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as TestParams; + + testParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + test = dbEntity.Test; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + /// + /// Parameterless constructor initializes the parameters + /// + public TestParams() + { + } + + public TestParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public TestParams(ComponentTest testParamsEntity, string componentName, Test test) + { + this.testParamsEntity = testParamsEntity; + this.componentName = componentName; + this.test = test; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/Single/Component.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/Single/Component.cs new file mode 100644 index 00000000..e4840c67 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/Single/Component.cs @@ -0,0 +1,37 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; + +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollection.Single +{ + public class Component : ComponentBase, GenericDevices.ITestMethod + { + private static readonly ILog log = LogManager.GetLogger(typeof(Component)); + public override string ToString() + { + return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); + } + + public bool CanTest(MetersKind meters) { return meters == MetersKind.Single; } + public bool DoTransitions() { return true; } + + public Component() + { + } + + public Component(Generic.IComponentCfg cfg) + : base(cfg) + { + log.Debug(this.ToString()); + } + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + return (new FlyingStartMassCollectionSeq()).Execute(test, repetNr, isLastRepetition, null, null, DebugLevel); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/Single/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/Single/Factory.cs new file mode 100644 index 00000000..4ed9c23a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/FlyingStartMassCollection/Single/Factory.cs @@ -0,0 +1,27 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; +using TBF.BenchControl.Configs.NameOnly; + +namespace TBF.BenchControl.TestMethods.FlyingStartMassCollection.Single +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Component.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Component(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Component(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this.GetType().Namespace.Substring(29), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/CalibrationStruct.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/CalibrationStruct.cs new file mode 100644 index 00000000..6670d335 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/CalibrationStruct.cs @@ -0,0 +1,197 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; + +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + public class CalibrationStruct + { + public static readonly int Length = 35; + + public Byte Version; + public MeterType MeterType; + public UInt16 Calibration; + public VolumeUnits VolumeUnits; + public FlowArrow FlowArrow; + public UInt16 FWVersion; + public UInt16[] TargetField; + public UInt16 RecipMeanCurrent; + public UInt16 ThresholdVolume; + public UInt16 ThresholdTime; + public UInt16 FlowActivationThr; + public UInt16 VolumeArrowThr; + public UInt32 CalibrationTime; + public ulong SerialNumber; + public MeterSealed MeterSealed; + public byte CheckSum; + + + public CalibrationStruct() + { + TargetField = new UInt16[3]; + } + + public byte[] ToByteArray() + { + byte[] result = new byte[Length]; + + result[0] = Version; + result[1] = (byte)MeterType; + + result[2] = (byte)(Calibration & 0x00FF); + result[3] = (byte)((Calibration >> 8) & 0x00FF); + + result[4] = (byte)VolumeUnits; + + result[5] = (byte)FlowArrow; + + result[6] = (byte)(FWVersion & 0x00FF); + result[7] = (byte)((FWVersion >> 8) & 0x00FF); + + result[8] = (byte)( TargetField[0] & 0x00FF); + result[9] = (byte)((TargetField[0] >> 8) & 0x00FF); + result[10] = (byte)( TargetField[1] & 0x00FF); + result[11] = (byte)((TargetField[1] >> 8) & 0x00FF); + result[12] = (byte)( TargetField[2] & 0x00FF); + result[13] = (byte)((TargetField[2] >> 8) & 0x00FF); + + result[14] = (byte)(RecipMeanCurrent & 0x00FF); + result[15] = (byte)((RecipMeanCurrent >> 8) & 0x00FF); + + result[16] = (byte)(ThresholdVolume & 0x00FF); + result[17] = (byte)((ThresholdVolume >> 8) & 0x00FF); + + result[18] = (byte)(ThresholdTime & 0x00FF); + result[19] = (byte)((ThresholdTime >> 8) & 0x00FF); + + result[20] = (byte)(FlowActivationThr & 0x00FF); + result[21] = (byte)((FlowActivationThr >> 8) & 0x00FF); + + result[22] = (byte)(VolumeArrowThr & 0x00FF); + result[23] = (byte)((VolumeArrowThr >> 8) & 0x00FF); + + result[24] = (byte)(CalibrationTime & 0x000000FF); + result[25] = (byte)((CalibrationTime >> 8) & 0x000000FF); + result[26] = (byte)((CalibrationTime >> 16) & 0x000000FF); + result[27] = (byte)((CalibrationTime >> 24) & 0x000000FF); + + result[28] = (byte)(SerialNumber & 0x00000000000000FF); + result[29] = (byte)((SerialNumber >> 8) & 0x00000000000000FF); + result[30] = (byte)((SerialNumber >> 16) & 0x00000000000000FF); + result[31] = (byte)((SerialNumber >> 24) & 0x00000000000000FF); + result[32] = (byte)((SerialNumber >> 32) & 0x00000000000000FF); + + result[33] = (byte)MeterSealed; + result[34] = CheckSum; + + return result; + } + + /// + /// Create a calibration structure from a complete byte array + /// + /// A complete byte array data + /// CalibrationStruct or null when byte array was not complete + public static CalibrationStruct FromByteArray(byte[] data) + { + if (data.Length != Length) return null; + + CalibrationStruct result = new CalibrationStruct(); + + result.Version = data[0]; + result.MeterType = (MeterType)data[1]; + result.Calibration = (UInt16)(data[2] + 256 * data[3]); + result.VolumeUnits = (VolumeUnits)data[4]; + result.FlowArrow = (FlowArrow)data[5]; + result.FWVersion = (UInt16)(data[6] + 256 * data[7]); + result.TargetField[0] = (UInt16)(data[8] + 256 * data[9]); + result.TargetField[1] = (UInt16)(data[10] + 256 * data[11]); + result.TargetField[2] = (UInt16)(data[12] + 256 * data[13]); + result.RecipMeanCurrent = (UInt16)(data[14] + 256 * data[15]); + result.ThresholdVolume = (UInt16)(data[16] + 256 * data[17]); + result.ThresholdTime = (UInt16)(data[18] + 256 * data[19]); + result.FlowActivationThr = (UInt16)(data[20] + 256 * data[21]); + result.VolumeArrowThr = (UInt16)(data[22] + 256 * data[23]); + result.CalibrationTime = (((UInt32)data[27] * 256 + data[26]) * 256 + data[25]) * 256 + data[24]; + result.SerialNumber = ((((UInt64)data[32] * 256 + data[31]) * 256 + data[30]) * 256 + data[29]) * 256 + data[28]; + result.MeterSealed = (MeterSealed)data[33]; + result.CheckSum = data[34]; + + return result; + } + + /// + /// Update the calibration structure from an incomplete byte array + /// + /// Byte array data + /// Offset of byte array data in CalibrationStruct + /// true when successful, false when data are not appropriate + public bool Update(byte[] data, int offset) + { + if (offset == 2 && data.Length == 2) + { + /// Data containing iPerl calibration factor + Calibration = (UInt16)(data[2 - offset] + 256 * data[3 - offset]); + return true; + } + else if (offset == 0 && data.Length == Length) + { + /// Data containing a complete CalibrationStruct + Version = data[0]; + MeterType = (MeterType)data[1]; + Calibration = (UInt16)(data[2] + 256 * data[3]); + VolumeUnits = (VolumeUnits)data[4]; + FlowArrow = (FlowArrow)data[5]; + FWVersion = (UInt16)(data[6] + 256 * data[7]); + TargetField[0] = (UInt16)(data[8] + 256 * data[9]); + TargetField[1] = (UInt16)(data[10] + 256 * data[11]); + TargetField[2] = (UInt16)(data[12] + 256 * data[13]); + RecipMeanCurrent = (UInt16)(data[14] + 256 * data[15]); + ThresholdVolume = (UInt16)(data[16] + 256 * data[17]); + ThresholdTime = (UInt16)(data[18] + 256 * data[19]); + FlowActivationThr = (UInt16)(data[20] + 256 * data[21]); + VolumeArrowThr = (UInt16)(data[22] + 256 * data[23]); + CalibrationTime = (((UInt32)data[27] * 256 + data[26]) * 256 + data[25]) * 256 + data[24]; + SerialNumber = ((((UInt64)data[32] * 256 + data[31]) * 256 + data[30]) * 256 + data[29]) * 256 + data[28]; + MeterSealed = (MeterSealed)data[33]; + CheckSum = data[34]; + return true; + } + else + return false; + } + + public string FWVersionStr() + { + int d1 = (FWVersion >> 8) & 0x000F; + int d2 = (FWVersion >> 12) & 0x000F; + int d3 = (FWVersion >> 4) & 0x000F; + int d4 = FWVersion & 0x000F; + return string.Format("{0}.{1}{2}{3}", d1, d2, d3, d4); + } + + public override string ToString() + { + return string.Format("Calibration: V{0} Type={1} Cal={2} Units={3} FlowArrow.{4} FW={5} Hi={6} Norm={7} Low={8} RMC={9} ThrVol={10} ThrTime={11} FlActThr={12} VolArrThr={13} CalTm={14} SN={15} MeterSealed={16} Chksum={17}", + Version, + MeterType, + Calibration, + VolumeUnits, + FlowArrow, + FWVersion, + TargetField[0], + TargetField[1], + TargetField[2], + RecipMeanCurrent, + ThresholdVolume, + ThresholdTime, + FlowActivationThr, + VolumeArrowThr, + CalibrationTime, + SerialNumber, + MeterSealed, + CheckSum.ToString("X2")); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/ConfigStruct.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/ConfigStruct.cs new file mode 100644 index 00000000..1275f745 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/ConfigStruct.cs @@ -0,0 +1,225 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; + +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + public class ConfigStruct + { + public const int Length = 32; + + public Byte Version; /// 0: 1 byte + public MeterState MeterState; /// 1: 1 byte + public UInt32 TargetTimeVeryLowBatt; /// 2: 4 bytes in seconds + public UInt32 TargetTimeLowBatt; /// 6: 4 bytes, in seconds + public UInt32 TestModeTime; /// 10: 4 bytes, Max. test mode time in seconds + public UInt16 EmptyPipeThreshold; /// 14: 2 bytes + public byte[] PCBNumber; /// 16: 5 bytes + public byte TestModeConfig; /// 21: 1 byte + public UInt32 RadioAddress; /// 22: 4 bytes + public UInt16 TempCalibration; /// 26: 2 bytes + public UInt16 AlarmMask; /// 28: 2 bytes, Default 0xA3F7 + public UInt16 ConfigCheckSum; /// 30: 2 bytes + + public ConfigStruct() + { + PCBNumber = new byte[5]; + } + + public byte[] ToByteArray() + { + byte[] result = new byte[Length]; + + result[0] = Version; + result[1] = (byte)MeterState; + + result[2] = (byte)(TargetTimeVeryLowBatt & 0x000000FF); + result[3] = (byte)((TargetTimeVeryLowBatt >> 8) & 0x000000FF); + result[4] = (byte)((TargetTimeVeryLowBatt >> 16) & 0x000000FF); + result[5] = (byte)((TargetTimeVeryLowBatt >> 24) & 0x000000FF); + + result[6] = (byte)(TargetTimeLowBatt & 0x000000FF); + result[7] = (byte)((TargetTimeLowBatt >> 8) & 0x000000FF); + result[8] = (byte)((TargetTimeLowBatt >> 16) & 0x000000FF); + result[9] = (byte)((TargetTimeLowBatt >> 24) & 0x000000FF); + + result[10] = (byte)(TestModeTime & 0x000000FF); + result[11] = (byte)((TestModeTime >> 8) & 0x000000FF); + result[12] = (byte)((TestModeTime >> 16) & 0x000000FF); + result[13] = (byte)((TestModeTime >> 24) & 0x000000FF); + + result[14] = (byte)(EmptyPipeThreshold & 0x00FF); + result[15] = (byte)((EmptyPipeThreshold >> 8) & 0x00FF); + + result[16] = PCBNumber[0]; + result[17] = PCBNumber[1]; + result[18] = PCBNumber[2]; + result[19] = PCBNumber[3]; + result[20] = PCBNumber[4]; + + result[21] = TestModeConfig; + + result[22] = (byte)(RadioAddress & 0x000000FF); + result[23] = (byte)((RadioAddress >> 8) & 0x000000FF); + result[24] = (byte)((RadioAddress >> 16) & 0x000000FF); + result[25] = (byte)((RadioAddress >> 24) & 0x000000FF); + + result[26] = (byte)(TempCalibration & 0x00FF); + result[27] = (byte)((TempCalibration >> 8) & 0x00FF); + + result[28] = (byte)(AlarmMask & 0x00FF); + result[29] = (byte)((AlarmMask >> 8) & 0x00FF); + + result[30] = (byte)(ConfigCheckSum & 0x00FF); + result[31] = (byte)((ConfigCheckSum >> 8) & 0x00FF); + + return result; + } + + /// + /// Create a configuration structure from a complete byte array + /// + /// A complete byte array data + /// ConfigStruct or null when byte array was not complete + public static ConfigStruct FromByteArray(byte[] data) + { + if (data.Length != Length) return null; + + ConfigStruct result = new ConfigStruct(); + + result.Version = data[0]; + result.MeterState = (MeterState)data[1]; + result.TargetTimeVeryLowBatt = (((UInt32)data[5] * 256 + data[4]) * 256 + data[3]) * 256 + data[2]; + result.TargetTimeLowBatt = (((UInt32)data[9] * 256 + data[8]) * 256 + data[7]) * 256 + data[6]; + result.TestModeTime = (((UInt32)data[13] * 256 + data[12]) * 256 + data[11]) * 256 + data[10]; + result.EmptyPipeThreshold = (UInt16)(data[15] * 256 + data[14]); + result.PCBNumber[0] = data[16]; + result.PCBNumber[1] = data[17]; + result.PCBNumber[2] = data[18]; + result.PCBNumber[3] = data[19]; + result.PCBNumber[4] = data[20]; + result.TestModeConfig = data[21]; + result.RadioAddress = (((UInt32)data[25] * 256 + data[24]) * 256 + data[23]) * 256 + data[22]; + result.TempCalibration = (UInt16)(data[27] * 256 + data[26]); + result.AlarmMask = (UInt16)(data[29] * 256 + data[28]); + result.ConfigCheckSum = (UInt16)(data[31] * 256 + data[30]); + + return result; + } + + /// + /// Update the configuration structure from an incomplete byte array + /// + /// Offset of byte array data in ConfigStruct + /// Byte array data + /// true when successful, false when data are not appropriate + public bool Update(int offset, byte[] data) + { + if (offset == 0 && data.Length == 2) + { + /// iPerl mode of function + Version = data[0]; + MeterState = (MeterState)data[1]; + return true; + } + else if (offset == 0 && data.Length == 4) + { + /// iPerl mode of function and extra 2 bytes + Version = data[0]; + MeterState = (MeterState)data[1]; + return true; + } + else if (offset == 21 && data.Length == 1) + { + /// TestModeConfig value + TestModeConfig = data[21 - offset]; + return true; + } + else if (offset == 0 && data.Length == Length) + { + /// Complete ConfigStruct + Version = data[0]; + MeterState = (MeterState)data[1]; + TargetTimeVeryLowBatt = (((UInt32)data[5] * 256 + data[4]) * 256 + data[3]) * 256 + data[2]; + TargetTimeLowBatt = (((UInt32)data[9] * 256 + data[8]) * 256 + data[7]) * 256 + data[6]; + TestModeTime = (((UInt32)data[13] * 256 + data[12]) * 256 + data[11]) * 256 + data[10]; + EmptyPipeThreshold = (UInt16)(data[15] * 256 + data[14]); + PCBNumber[0] = data[16]; + PCBNumber[1] = data[17]; + PCBNumber[2] = data[18]; + PCBNumber[3] = data[19]; + PCBNumber[4] = data[20]; + TestModeConfig = data[21]; + RadioAddress = (((UInt32)data[25] * 256 + data[24]) * 256 + data[23]) * 256 + data[22]; + TempCalibration = (UInt16)(data[27] * 256 + data[26]); + AlarmMask = (UInt16)(data[29] * 256 + data[28]); + ConfigCheckSum = (UInt16)(data[31] * 256 + data[30]); + return true; + } + else + return false; + } + + /// + /// Returns PCB number string (12 characters, 12 decimal digits) + /// + /// PCB number STRING + public string GetPcbNrString() + { + return PCBNumber2String(this.PCBNumber); + } + + /// + /// Converts PCBNumber to string (12 characters, 12 decimal digits) + /// + /// + /// PCB number string + public static string PCBNumber2String(byte[] pcbNumber) + { + if (pcbNumber.Length != 5) return string.Empty; + + Int64 number = 0; + for (int i = 4; i >= 0; i--) + { + number = 256 * number + (Int64)pcbNumber[i]; + } + + return number.ToString(); + } + + public override string ToString() + { + return string.Format("Config: V{0} State={1} VLoBattT={2}s LoBattT={3}s TestModeT={4}s EPThld={5} PCB#={6} TMCfg={7} RadioAddr={8} TempCalib={9} AlarmMask={10} CfgCheckSum={11}", + Version, + MeterState, + TargetTimeVeryLowBatt, + TargetTimeLowBatt, + TestModeTime, + EmptyPipeThreshold, + GetPcbNrString(), + TestModeConfig.ToString("X2"), + RadioAddress, + TempCalibration, + AlarmMask.ToString("X4"), + ConfigCheckSum.ToString("X4")); + } + + public string ToString(int sel) + { + return string.Format("{1} PCB#={6} TMCfg={7}", + Version, + MeterState, + TargetTimeVeryLowBatt, + TargetTimeLowBatt, + TestModeTime, + EmptyPipeThreshold, + GetPcbNrString(), + TestModeConfig.ToString("X2"), + RadioAddress, + TempCalibration, + AlarmMask.ToString("X4"), + ConfigCheckSum.ToString("X4")); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/Enums.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/Enums.cs new file mode 100644 index 00000000..20317d8e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/Enums.cs @@ -0,0 +1,110 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + public enum MessageID + { + Calibration = 0x00, /// Access to stCalibration + Configuration = 0x01, /// Access to stConfig + Status = 0x02, /// Access to stStaus, read only + Power = 0x03, /// Access to stPower, containing power info from both processors + LCD = 0x04, /// Access to stLCD + EventData = 0x05, /// NOT USED + IntervalData = 0x06, /// NOT USED + Diagnostics = 0x07, /// Access tostMetroDiagArray, read onl + MetrologyMemory = 0x08, /// Memory block access, read only + Error_LongAck = 0x09, /// Error message + Command = 0x0A, /// Command to execute, with no arguments + Parameterizing = 0x0B, /// Parameterizing message is used in MCI-SPI interface only + Error_ShortAck = 0x0C, /// Short acknowledge message is used in MCI-SPI interface only + ChanelAlive = 0x0D, /// Channel alive message is used in MCI-SPI interface only + RadioPassthrough = 0x0E, /// RFID <-> Metrology <-> Radio passthrough message + ASICRegisterReadTest = 0x0F, /// ASIC Register read test + IMIDebugMessagesAccess = 0x10, /// IMI debug messages read test + ProductionChecksumsRead = 0x11, /// Production checksum read: Calibration (1 byte), Configuration (2 bytes), spare (4 bytes) + HardwareParametersTest = 0x12, /// Hardware Parameters Testing: User configurable fixed field drive time (1 byte) + /// + /// Notes: + /// 1. Short Ack message contains 1-byte error code and all the fields (Offset, Payload length, payload and password) will not be present. + /// 2. Channel Alive message does not contain the fields (Offset, Payload length, payload and password). + /// 3. Except the above two special messages, rest all the messages in the above table will follow the message format mentioned in sections 3.1 and 3.2. + /// + Count /// Number of MessageID-s + } + + public enum MeterType : byte + { + DN15 = 0, + CoaxManifold = 1, + DN20 = 2, + DN25 = 3, + DN26 = 4, /// DN25* + DN32 = 5, + DN40 = 6, + AutoDetect, + Count /// Number of meter types + } + + public enum VolumeUnits : byte + { + m3 = 0, + UK_gallon = 1, + US_gallon = 2, + Count /// Number of volume units + } + + public enum FlowArrow : byte + { + No = 0, + Right = 1, + Left = 2, + Count /// Number of flow arrows + } + + public enum MeterSealed : byte + { + InProduction = 0x00, + OutOfProduction = 0xA5, + Sealed = 0x5A, + } + + public enum MeterState : byte + { + None = 0, + Idle = 1, + Active = 2, + Test = 3, + EndOfLife = 4, + Count /// Number of meter states + } + + public enum FlowState : byte + { + No = 0, + Reverse = 1, + Forward = 2, + EmptyPipe = 3, + Count /// Number of flow states + } + + public enum OptoTelegramFlags : byte + { + OK = 0, + OK_TestStart, + OK_TestEnd, + InvalidTelegram, /// Wrong telegram format of checksum error + SyncError, + } + + public enum OptoState + { + Read, + Flush, + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/Factory.cs new file mode 100644 index 00000000..e37e88eb --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return "RegisterReader for Genesis"; } } + + public void ResetStaticProperties() { GenesisHead.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new GenesisHead(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new GenesisHead(cfg); } + + public IComponentCfg DefaultConfig() { return new GenesisHeadCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(GenesisHeadCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/GenesisHead.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/GenesisHead.cs new file mode 100644 index 00000000..539fe3e5 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/GenesisHead.cs @@ -0,0 +1,626 @@ +using Config.Entities; +using log4net; +/// +/// Copyright (c) 2015-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using TBF.BenchControl.Generic; +using TBF.BenchControl.GenericDevices; +using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore; +using Xylem.Common.Hardware.WaterMeter.WaterMeterCore; +using Xylem.Common.Metrology.Measurements; +using Xylem.Common.Metrology.Measurements.Consts; + +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + public static class GenesisHeadBatch + { + public static Dictionary> MeterIdDetailResults = new Dictionary>(); + private static readonly ILog log = LogManager.GetLogger(typeof(GenesisHeadBatch)); + public static readonly Lazy BatchHolder = new Lazy(() => + { + return new MeterBatch(); + }); + + internal static bool Start(IRegisterReader[] registerReaders, string[] lastSNTexts) + { + try + { + MeterIdDetailResults = new Dictionary>(); + int index = 0; + var ret = false; + foreach (var rr in registerReaders) + { + if (rr is TestMethods.GenesisCommunication.GenesisHead.GenesisHead) + { + if (!string.IsNullOrEmpty(lastSNTexts[index])) + { + var myGenesis = ((TestMethods.GenesisCommunication.GenesisHead.GenesisHead)rr).SetUp(); + myGenesis.SerialNumber = lastSNTexts[index]; + ret = true; + } + } + index = index + 1; + } + + return ret; + } + catch (Exception ex) + { + log.Fatal(ex.Message, ex); + return false; + } + + } + } + /// + /// This component = instance of this class is a placeholder for a combined main watermeter + /// + public class GenesisHead : ComponentBase, IDevice, GenericDevices.IRegisterReader, IOperation + { + public List DetailedResults { get; set; } + private static readonly ILog log = LogManager.GetLogger(typeof(GenesisHead)); + public override string ToString() { return string.Format("Genesis({0})", Cfg.ToString(1)); } + + public Config.Entities.RegisterReaderType RegisterReaderType { get { return Config.Entities.RegisterReaderType.DataStream; } } + + private readonly GenesisHeadCfg genesisHeadCfg; + public int SlotNr { get { return genesisHeadCfg.SlotNr; } } + public double PulsesPerLtr { get { return 1000.0; } } + public double LtrsPerPulse { get { return 1 / PulsesPerLtr; } } + +#if ORACLE_DB + public int WMType_ID { get { return iperlHeadCfg.ProcParams.WMType_ID; } } /// Required by Oracle DB + public int WMType_Rev { get { return iperlHeadCfg.ProcParams.WMType_Rev; } } /// Required by Oracle DB +#endif + public float CalibTarget { get { return (ushort)genesisHeadCfg.ProcParams.CalibTarget; } } + public ushort FactorLimitLo { get { return (ushort)genesisHeadCfg.ProcParams.FactorLimitLo; } } + public ushort FactorLimitHi { get { return (ushort)genesisHeadCfg.ProcParams.FactorLimitHi; } } + + /// Properties set by the Begin and the End form + //todo rd implement + public string SerialNr; + + + public string EndState + { + get { return endState; } + set { endState = value; } + } + + private string endState; + + public string BeginState + { + get { return beginState; } + set { beginState = value; } + } + + private string beginState; + + public bool Disabled + { + get { return disabled; } + set { disabled = value; } + } + + private bool disabled; + + public bool CommFailed + { + get { return commFailed; } + set { commFailed = value; } + } + + private bool commFailed; + + public int ResultCode + { + get { return resultCode; } + } + + private int resultCode; + + + /// ConfigStruct of the water meter obtained or updated by iPerlCommunication + public ConfigStruct ConfigStruct + { + get { return configStruct; } + set { configStruct = value; } + } + + private ConfigStruct configStruct; + + /// CalibrationStruct of the water meter obtained or updated by iPerlCommunication + public CalibrationStruct CalibrationStruct + { + get { return calibrationStruct; } + set { calibrationStruct = value; } + } + + private CalibrationStruct calibrationStruct; + + public ushort OrigCalibFactor; + public ushort CalibFactor { get { return (CalibrationStruct != null) ? CalibrationStruct.Calibration : (ushort)0; } } + + public double Q2ErrWOCorrection; + public bool Q2CorrectionDone; + public double Q2Correction; + public int Q2CorrRFlow; + public int Q2CorrLFlow; + + public double Diff2Hz8Hz; + public bool Hz2CorrectionDone; + public int Hz2Correction; + + public string FWVersion { get { return (CalibrationStruct != null) ? CalibrationStruct.FWVersionStr() : string.Empty; } } + + + /// Result of the last test used to calculate Q2 correction factors, etc + public Results.Entities.MeterTestRslt LastTestResult2; + public Results.Entities.MeterTestRslt LastTestResult; + public double NominalTestFlowLph; /// in liter per hour + + + /// + /// Required for IRegisterReader interface + /// + public int WMPulses { get { return wmPulses; } } + public int WMRefPulses { get { return wmRefPulses; } } + public double WMVolume { get { return wmVolume; } } + public double BeginWMState { get { return beginWMState; } } + public double EndWMState { get { return endWMState; } } + public double WMTestTime { get { return wmTestTime; } } + + private double beginWMState; + private double endWMState; + private double wmVolume; + private int wmPulses; + private int wmRefPulses; + private double wmTestTime; + + + /// Name set by the test, to be used as a part of the opto-data log file name + public string TestName; + + /// Name set by the test, to be used as a part of the opto-data log file name + public string BenchName; + + /// + /// Volume of water from the opto telegram + /// + private Int64 lastVolumeRaw; /// Last read raw volume + private double volumeLtr; /// + private double volumeLtr0; + + + /// + /// Timestamp from the opto telegram + /// + private double timestampSec; + private double timestampSec0; + + public bool NoSamples { get { return (timestampSecEnd - timestampSecStart) < float.Epsilon; } } + public double TimestampSecStart { get { return timestampSecStart; } } + public double TimestampSecEnd { get { return timestampSecEnd; } } + + private double timestampSecStart; + private double timestampSecEnd; + + public GenesisHead() + { + } + + public GenesisHead(Generic.IComponentCfg cfg) + : base(cfg) + { + ClearData(); + + genesisHeadCfg = cfg as GenesisHeadCfg; + + log.Debug(this.ToString()); + } + + private GenesisMeter myGenesis = null; + + + + + + public GenesisMeter SetUp() + { + try + { + Log("Call SetUp()"); + if (myGenesis != null) + { + myGenesis.DisposeMeter(); + } + //add for gen + + myGenesis = new GenesisMeter(); + myGenesis.SetupFromConfigFile(SlotNr); + Log("Add Meter to batch"); + GenesisHeadBatch.BatchHolder.Value.AddMeter(myGenesis); + Log("Log Raw Data"); + myGenesis.LogRawData(true); + return myGenesis; + } + catch (Exception e) + { + if (myGenesis != null) + { + Log(e.Message); + } + throw e; + } + + } + + /// + /// Clear data related to a specific water meter + /// + public void ClearData() + { + DetailedResults = new List(); + resultCode = 0; + + disabled = false; + commFailed = false; + endState = string.Empty; + beginState = string.Empty; + + configStruct = null; + calibrationStruct = null; + + LastTestResult = null; + NominalTestFlowLph = 0; + + OrigCalibFactor = 0; + Q2ErrWOCorrection = 0; + Q2CorrectionDone = false; + Q2CorrRFlow = 0; + } + + public void Initialize() + { + ClearData(); + + if (DebugLevel == DebugMode.Normal) + { + + } + } + + public void RunDeviceBefore() + { + + + ////todo: RD- Login?? + //if (DebugLevel == DebugMode.Normal) + //{ + + + // if (myGenesis != null) + // { + // Log("TBF RunDeviceBefore"); + + // } + // else + // { + // //throw new Exception("No meter was bound!"); + // } + //} + //else if (DebugLevel == DebugMode.FailureDuringOperation) + //{ + //} + } + + public void RunDeviceAfter() { } + + public void StopDevice() + { + try + { + + if (DebugLevel == DebugMode.Normal && myGenesis != null) + { + myGenesis.DisposeMeter(); + + GenesisHeadBatch.BatchHolder.Value.RemoveMeter(myGenesis); + } + } + catch + { + } + } + + public void StopDevice2() { } + + /// + /// Events: Event.ReadRegisterDone, Event.Error + /// + /// ReadWaterMeter instance reference casted to IOperaton + public IOperation ReadRegisterOp() + { + return this; + } + + /// + /// Clear data/counters related to a specific tests + /// + public void Clear() + { + resultCode = 0; + + sampleNr = 0; + + volumeLtr = 0; + volumeLtr0 = 0; + timestampSec = 0; + timestampSec0 = 0; + + ReadPulses(); + } + + public void TestCompleted() + { + /// TODO: Implement + } + + private int sampleNr; /// This is to determine when the test start sample should be taken + + + private bool StoreStartPackage = false; + private bool StoreEndPackage = false; + private bool Enable = false; + public bool IsCalibration = false; + /// Start this operation + public void Start() + { + + + } + public void StartRead(string TestName, int batchNr, int repetitionNr) + { + StoreStartPackage = false; + StoreEndPackage = false; + //Start mesurement + if (DebugLevel == DebugMode.Normal) + { + if (myGenesis != null) + { + IsCalibration = false; + Log($"TBF Start Measurement {TestName}"); + myGenesis.CurrentActionText = $"Batch{batchNr}_Rep{repetitionNr}"; + + + if (TestName.ToLower().Contains("calib")) + { + IsCalibration = true; + //myGenesis.Login(); + myGenesis.StartCalibration(); + } + else if (TestName.ToLower().Contains("login")) + { + //myGenesis.Login(); + + myGenesis.InitMeasurement(); + } + else + { + DetailedResults = new List(); + + myGenesis.StartMeasurement(); + } + + StoreStartPackage = true; + } + } + } + + public void Log(string text) + { + if (DebugLevel == DebugMode.Normal) + { + if (myGenesis != null) + { + myGenesis.WriteLog(text); + } + } + } + + + /// Run this operation + /// eventDone + public Event Run() + { + if (DebugLevel == DebugMode.Normal) + { + if (myGenesis != null) + { + try + { + //var results = myGenesis.GetIntermediateMeasurementResult(); + //readOutResults(results); + } + catch (Exception) + { + + + } + + } + } + + return Event.ReadRegisterDone; + } + public double RefVolume = 0.0; + + public void Stop() + { + //Stop(null); + if (DebugLevel == DebugMode.Normal && myGenesis != null) + { + if (IsCalibration) + { + myGenesis.StopCalibration(); + } + else + { + myGenesis.StopMeasurement(); + } + } + } + + /// Stop this operation + public void Stop(Double? testTimeS = null, double? refVol = null) + { + + if (DebugLevel == DebugMode.Normal && myGenesis != null) + { + Log($"TBF Stop Measurement {IsCalibration} {testTimeS} {refVol }"); + if (IsCalibration) + { + //myGenesis.StopCalibration(); + int retryCounter = 400; + while (myGenesis.GetCalibrationState() != MeasurementStates.IsCompleted) + { + if (retryCounter < 0) + { + break; + } + Thread.Sleep(10); + retryCounter = retryCounter - 1; + } + try + { + var results = myGenesis.GetMainMeasurementResult(refVol, testTimeS, false); + + readOutResults(results, testTimeS); + if (refVol.HasValue && refVol.Value != 0.0) + { + + + myGenesis.BuildAndCheckCalibFactorsAllChannels(refVol.Value / 1000, testTimeS, Q2ErrWOCorrection); + myGenesis.SetCalibFactorsAllChannels(false); + } + + } + catch (Exception ex) + { + MarkAsError(); + Log("Error while Stop Calib " + ex.Message); + if (ex.InnerException != null) + { + Log("Inner Error:" + ex.InnerException.Message); + } + + } + } + else + { + int retryCounter = 4000; + //myGenesis.StopMeasurement(); + try + { + while (myGenesis.GetMeasurementState() != MeasurementStates.IsCompleted) + { + if (retryCounter < 0) + { + break; + } + Thread.Sleep(10); + retryCounter = retryCounter - 1; + } + + try + { + if (refVol.HasValue && testTimeS.HasValue) + { + Log("GetMainMeasurementResult V" + refVol.ToString() + " and S" + testTimeS.Value); + } + else + { + Log("GetMainMeasurementResult empty"); + } + + DetailedResults = myGenesis.GetAllMeasurementResults(refVol, testTimeS); + foreach (var item in DetailedResults) + { + Log("Detail Measurement Channel =" + item.Channel + "; CorrectedDutVolumeCm= " + item.CorrectedDutVolumeCm + "; DeviationDutToRefPer= " + item.DeviationDutToRefPer); + } + + + readOutResults(DetailedResults.First(), testTimeS); + } + catch (Exception ex) + { + MarkAsError(); + Log("Error while Stop Measurement " + ex.Message); + } + } + catch (Exception ex) + { + MarkAsError(); + Log("Error while GetMeasurementState " + ex.Message); + } + + + + } + + + StoreEndPackage = true; + + } + } + + private void readOutResults(MeasurementResults results, double? testTimeS) + { + volumeLtr = results.CorrectedDutVolumeCm * 1000; + timestampSec = results.DutStopRecord.GetTimeS(); + if (testTimeS.HasValue) + { + wmTestTime = testTimeS.Value; + } + else + { + wmTestTime = results.DutTimeS; + } + + wmVolume = results.CorrectedDutVolumeCm * 1000; + Log("DutFlowRateCmPh" + results.DutFlowRateCmPh.ToString()); + Log("CorrectedDutVolumeCm=" + results.CorrectedDutVolumeCm.ToString()); + Log("DutVolumeCm=" + results.DutVolumeCm.ToString()); + ReadPulses(); + } + + private void MarkAsError() + { + volumeLtr = 0; + timestampSec = 0; + wmTestTime = 0; + wmVolume = 0; + ReadPulses(); + } + + private void ReadPulses() + { + beginWMState = volumeLtr0; + endWMState = volumeLtr; + wmPulses = (int)(wmVolume * (double)PulsesPerLtr + 0.5); + wmRefPulses = StateMachine.ControlBoard.EtPulses(0); + } + + private bool optoSerialPortParsingEnabled; + + + + + + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/GenesisHeadCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/GenesisHeadCfg.cs new file mode 100644 index 00000000..d40fa823 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/GenesisHeadCfg.cs @@ -0,0 +1,62 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Net.Sockets; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + public class GenesisHeadCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(GenesisHeadCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + + public IComponentCfgCtrl GetControl() { return new GenesisHeadCfgCtrl(); } + + /// + /// Serialized parameters + /// + public int SlotNr; /// Number written to QuidoRS to connct the watermeter to RfidComPort, 1 .. 10 + + /// Procedure parameters + [XmlIgnore] + public ProcParams ProcParams; + public override IParamsProvider GetRuntimeProcParamsProvider() { return ProcParams; } + public override IParamsProvider CreateProcParamsProvider() { return new ProcParams(true); } + + [XmlIgnore] + public MeterType MeterType { get { return (ProcParams != null) ? ProcParams.MeterType : MeterType.AutoDetect; } } + + + /// Private parameterless constructor invoked by all other (public) constructors + GenesisHeadCfg() + { + Name = "Genesis"; + ParentName = string.Empty; + SlotNr = 0; + ProcParams = new ProcParams(true); + } + + public GenesisHeadCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("{0} SlotNr={1}", + Name, + SlotNr + ); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/GenesisHeadCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/GenesisHeadCfgCtrl.cs new file mode 100644 index 00000000..3dab580c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/GenesisHeadCfgCtrl.cs @@ -0,0 +1,90 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Net; +using System.Net.Sockets; +using System.Windows.Forms; +using log4net; +using TBF.BenchControl.Generic; +using TBF.Resources; +using Config.Entities; + +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + public partial class GenesisHeadCfgCtrl : UserControl, IComponentCfgCtrl + { + static readonly ILog log = LogManager.GetLogger(typeof(GenesisHeadCfgCtrl)); + + public bool ShowMore { get { return false; } } + + GenesisHeadCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as GenesisHeadCfg; + Redraw(); + } + } + + public GenesisHeadCfgCtrl() + { + InitializeComponent(); + } + + private void WaterMeterCfgCtrl_Load(object sender, EventArgs e) + { + nameLabel.Text = Strings.Name; + classNameLabel.Text = config.Factory.ClassName; + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + nameTextBox.Text = config.Name; + + + } + + public void Unlock() + { + nameTextBox.Enabled = true; + slotNrTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + + if (!int.TryParse(slotNrTextBox.Text, out dummy) || dummy < 1 || dummy > 7) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + string.Format(Strings.Invalid_0, muxBoardNrLabel.Text); + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + + config.SlotNr = int.Parse(slotNrTextBox.Text); + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/GenesisHeadCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/GenesisHeadCfgCtrl.designer.cs new file mode 100644 index 00000000..46dba57b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/GenesisHeadCfgCtrl.designer.cs @@ -0,0 +1,121 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + partial class GenesisHeadCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.slotNrTextBox = new System.Windows.Forms.TextBox(); + this.muxBoardNrLabel = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(135, 40); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(121, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(25, 43); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(132, 16); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(60, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ClassName"; + // + // slotNrTextBox + // + this.slotNrTextBox.Enabled = false; + this.slotNrTextBox.Location = new System.Drawing.Point(135, 63); + this.slotNrTextBox.Name = "slotNrTextBox"; + this.slotNrTextBox.Size = new System.Drawing.Size(34, 20); + this.slotNrTextBox.TabIndex = 9; + // + // muxBoardNrLabel + // + this.muxBoardNrLabel.AutoSize = true; + this.muxBoardNrLabel.Location = new System.Drawing.Point(25, 66); + this.muxBoardNrLabel.Name = "muxBoardNrLabel"; + this.muxBoardNrLabel.Size = new System.Drawing.Size(37, 13); + this.muxBoardNrLabel.TabIndex = 8; + this.muxBoardNrLabel.Text = "Slot nr"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(176, 66); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(31, 13); + this.label3.TabIndex = 13; + this.label3.Text = "1 .. 6"; + // + // GenesisHeadCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.label3); + this.Controls.Add(this.slotNrTextBox); + this.Controls.Add(this.muxBoardNrLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "GenesisHeadCfgCtrl"; + this.Size = new System.Drawing.Size(396, 123); + this.Load += new System.EventHandler(this.WaterMeterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.TextBox slotNrTextBox; + private System.Windows.Forms.Label muxBoardNrLabel; + private System.Windows.Forms.Label label3; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/GenesisHeadCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/GenesisHeadCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/GenesisHeadCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/OptoReceivedEventArgs.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/OptoReceivedEventArgs.cs new file mode 100644 index 00000000..a6bda914 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/OptoReceivedEventArgs.cs @@ -0,0 +1,20 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + public class OptoReceivedEventArgs : EventArgs + { + public string Data; + + public OptoReceivedEventArgs(string data) + { + this.Data = data; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/OptoTelegramRaw.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/OptoTelegramRaw.cs new file mode 100644 index 00000000..8283d077 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/OptoTelegramRaw.cs @@ -0,0 +1,296 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Globalization; + +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + public class OptoTelegramRaw + { + public static readonly int Length = 42; + private static CultureInfo culture; + + + /// + /// Strobed value + /// + public static decimal TestStartTimestampDec; + + /// + /// Stored values + /// + public OptoTelegramFlags Flags; + + public DateTime DateTime; /// From PC + public float RefFlow; /// [m3/h] + public int Counter; + + public UInt32 EmfRaw; /// From iPerl opto data + public Int16 MagneticFieldRaw; + public Int16 FlowRaw; + public UInt32 VolumeRaw; + public Int64 VolumeRawExt; + public Int16 Impedance; + public UInt32 Timestamp; + public Int64 TimestampExt; + public byte CheckSum; + + /// + /// Calculated values + /// + public double EMF() + { + Int32 signedEmf = (EmfRaw > 0x7FFFFF) ? ((int)EmfRaw - 0x1000000) : (int)EmfRaw; + return 0.000000333 * (double)signedEmf; + } + public double MagneticField() { return (double)MagneticFieldRaw; } + public double Flow(double scalingFactor) { return 0.225 * scalingFactor * (double)FlowRaw; } + public double Volume(double scalingFactor) { return 0.0000625 * scalingFactor * (double)VolumeRawExt; } + public Int32 FlipTime() { return Impedance; } + public decimal TimestampDec() { return (decimal)TimestampExt / (decimal)8192; } + public double VolumeDelta(double scalingFactor, OptoTelegramRaw previous) { return (previous == null) ? 0 : Volume(scalingFactor) - previous.Volume(scalingFactor); } + public decimal TimeDelta() { return TimestampDec() - TestStartTimestampDec; } + public string Label() + { + if (Flags == OptoTelegramFlags.OK_TestStart) return "#### start test ####"; + else if (Flags == OptoTelegramFlags.OK_TestEnd) return "#### end of test ####"; + else return string.Empty; + } + + + static OptoTelegramRaw() + { + culture = CultureInfo.CreateSpecificCulture("DE"); /// This is to use comma as decimal number separator + } + + public OptoTelegramRaw() + { + } + + /// + /// Parses optical telegram and returns OptoTelegramRaw object + /// + /// + /// Create a configuration structure from a complete byte array + /// + /// Telegram description: + /// + /// AAAAAA[tab]BBBB[tab]CCCC[tab]DDDDDD[tab]EEEE[tab]FFFFFFFF[tab]GG[cr][lf] (42 bytes) + /// + /// Data Comment Type Calculate to decimal + /// ---------------------------------------------------------------- + /// AAAAAA EMF Int24 Value * 0.000000333 + /// BBBB Magnetic field Int16 Value + /// CCCC Flow Int16 Value * 0.225 * Scalig factor + /// DDDDDD Volume Int24 Value / 16000 * Scaling factor + /// EEEE Impedance Int16 Value + /// FFFFFFFF Timestamp Uint32 Value / 8192 + /// GG Checksum Byte + /// ---------------------------------------------------------------- + /// + /// Example: + /// FFFFFE 51EA 0000 65324E 0087 F6319DFF 86 + /// FFDD3A 51F9 0000 65324E 0088 F631A60B 45 + /// ... + /// + /// A complete byte array data + /// true = telegram OK, false = telegram NOK + public bool UpdateFromString(string telegram, int counter, ref Int64 volumeRawExtLast, ref Int64 timestampExtLast) + { + DateTime = DateTime.Now; + Counter = counter; + RefFlow = (float)Sequences.ProcessData.RefFlow.Val; + + if ((telegram == null) || (telegram.Length < Length) || + (telegram[6] != '\t') || (telegram[11] != '\t') || (telegram[16] != '\t') || + (telegram[23] != '\t') || (telegram[28] != '\t') || (telegram[37] != '\t') || + (telegram[40] != '\r') || (telegram[41] != '\n')) + { + Flags = OptoTelegramFlags.InvalidTelegram; + return false; + } + + bool f1 = UInt32.TryParse(telegram.Substring(0, 6), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out EmfRaw); + bool f2 = Int16.TryParse(telegram.Substring(7, 4), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out MagneticFieldRaw); + bool f3 = Int16.TryParse(telegram.Substring(12, 4), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out FlowRaw); + bool f4 = UInt32.TryParse(telegram.Substring(17, 6), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out VolumeRaw); + bool f5 = Int16.TryParse(telegram.Substring(24, 4), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out Impedance); + bool f6 = UInt32.TryParse(telegram.Substring(29, 8), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out Timestamp); + bool f7 = byte.TryParse(telegram.Substring(38, 2), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out CheckSum); + + bool allOk = f1 && f2 && f3 && f4 && f5 && f6 && f7; + Flags = allOk ? OptoTelegramFlags.OK : OptoTelegramFlags.InvalidTelegram; + + /// + /// Cope with 'VolumeRaw' overflow + /// + Int64 uncorrected = (Int64)(((UInt64)volumeRawExtLast & 0xFFFFFFFFFF000000UL) | VolumeRaw); + if (Math.Abs(uncorrected - volumeRawExtLast) <= 0x800000L) + { + VolumeRawExt = volumeRawExtLast = uncorrected; + } + else if (Math.Abs(uncorrected + 0x1000000L - volumeRawExtLast) <= 0x800000L) + { + VolumeRawExt = volumeRawExtLast = uncorrected + 0x1000000L; + } + else if (Math.Abs(uncorrected - 0x1000000L - volumeRawExtLast) <= 0x800000L) + { + VolumeRawExt = volumeRawExtLast = uncorrected - 0x1000000L; + } + else + { + VolumeRawExt = volumeRawExtLast = uncorrected; + } + + /// + /// Cope with 'Timestamp' overflow + /// + uncorrected = (Int64)(((UInt64)timestampExtLast & 0xFFFFFFFF00000000UL) | Timestamp); + if (Math.Abs(uncorrected - timestampExtLast) <= 0x80000000L) + { + TimestampExt = timestampExtLast = uncorrected; + } + else if (Math.Abs(uncorrected + 0x100000000L - timestampExtLast) <= 0x80000000L) + { + TimestampExt = timestampExtLast = uncorrected + 0x100000000L; + } + else if (Math.Abs(uncorrected - 0x100000000L - timestampExtLast) <= 0x80000000L) + { + TimestampExt = timestampExtLast = uncorrected - 0x100000000L; + } + else + { + TimestampExt = timestampExtLast = uncorrected; + } + + return allOk; + } + + /// + /// Alternative to UpdateFromString(...) when data are flushed + /// + public bool UpdateFromStringDummy(string telegram) + { + DateTime = DateTime.Now; + RefFlow = (float)Sequences.ProcessData.RefFlow.Val; + + if ((telegram == null) || (telegram.Length < Length) || + (telegram[6] != '\t') || (telegram[11] != '\t') || (telegram[16] != '\t') || + (telegram[23] != '\t') || (telegram[28] != '\t') || (telegram[37] != '\t') || + (telegram[40] != '\r') || (telegram[41] != '\n')) + { + Flags = OptoTelegramFlags.InvalidTelegram; + return false; + } + + //bool f1 = UInt32.TryParse(telegram.Substring(0, 6), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out EmfRaw); + //bool f2 = Int16.TryParse(telegram.Substring(7, 4), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out MagneticFieldRaw); + //bool f3 = Int16.TryParse(telegram.Substring(12, 4), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out FlowRaw); + //bool f4 = UInt32.TryParse(telegram.Substring(17, 6), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out VolumeRaw); + //bool f5 = Int16.TryParse(telegram.Substring(24, 4), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out Impedance); + //bool f6 = UInt32.TryParse(telegram.Substring(29, 8), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out Timestamp); + //bool f7 = byte.TryParse(telegram.Substring(38, 2), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out CheckSum); + //return f1 && f2 && f3 && f4 && f5 && f6 && f7; + + return true; + } + + + public void SetFlags(OptoTelegramFlags flags) + { + this.Flags = flags; + } + + + public string ToString(double scalingFactor, OptoTelegramRaw previous) + { + if (Flags == OptoTelegramFlags.SyncError) + { + return "Sychronization error"; + } + else if (Flags == OptoTelegramFlags.InvalidTelegram) + { + return "Invalid telegram"; + } + else /// if (flags == OptoTelegramFlags.OK / OptoTelegramFlags.OK_TestStart / OptoTelegramFlags.OK_TestEnd) + { + return string.Format("{0}:{1}:{2}.{3}\t{4} :\t{5}\t{6}\t{7}\t{8}\t{9}\t{10}\t{11}\t{12}\t{13}\t{14}\t{15}\t{16}\t{17}\t{18}\t{19}\t{20}\t{21}\t{22}", + DateTime.Hour.ToString("D2"), + DateTime.Minute.ToString("D2"), + DateTime.Second.ToString("D2"), + DateTime.Millisecond.ToString("D4"), + Counter, + EmfRaw.ToString("X6"), + MagneticFieldRaw.ToString("X4"), + FlowRaw.ToString("X4"), + VolumeRaw.ToString("X6"), + Impedance.ToString("X4"), + Timestamp.ToString("X8"), + CheckSum.ToString("X2"), + EMF().ToString("F4", culture), + MagneticField().ToString("F0", culture), + Flow(scalingFactor).ToString("F2", culture), + Volume(scalingFactor).ToString("F4", culture), + FlipTime().ToString("F0", culture), + TimestampDec().ToString("F4", culture), + (RefFlow * 1000).ToString("F2", culture), + VolumeDelta(scalingFactor, previous).ToString("F4", culture), + TimeDelta().ToString("F3", culture), + scalingFactor.ToString("F1", culture), + Label()); + } + } + + /// + /// Filter RefFlow data in an array of OptoTelegramRaw objects by a FIR filter: + /// + /// kSize = 5, kSize2 = 2 + /// + /// i k + /// --------------------------------------------------------------------------- + /// 0 -5 filtered[0] = data[0] + /// 1 -4 filtered[1] = data[1] + /// 2 -3 filtered[2] = data[0]*k[0] + ... + data[4]*k[4] + /// 3 -2 filtered[3] = data[1]*k[0] + ... + data[5]*k[4] + /// 4 -1 filtered[4] = data[2]*k[0] + ... + data[6]*k[4] + /// 5 0 data[0] = filtered[0], filtered[0] = data[3]*k[0] + ... + data[7]*k[4] + /// 6 1 data[1] = filtered[1], filtered[1] = data[4]*k[0] + ... + data[8]*k[4] + /// 7 ... + /// + /// array of OptoTelegramRaw objects + /// number of objects to process + public static void FIRFilterFlow(OptoTelegramRaw[] optoData, int optoDataCount) + { + float[] kernel = new float[] { 0.1f, 0.2f, 0.4f, 0.2f, 0.1f }; + int kSize = kernel.Length; + int kSize2 = kernel.Length / 2; + + float[] filtered = new float[kSize]; + + for (int i = 0; i < optoDataCount; i++) + { + int k = i - kSize; + if (k >= 0) optoData[k].RefFlow = filtered[i % kSize]; + + if (i < kSize2 || i >= optoDataCount - kSize2) + { + filtered[i % kSize] = optoData[i].RefFlow; + } + else + { + float weoightedSum = 0; + for (int j = -kSize2; j <= kSize2; j++) + weoightedSum += optoData[i + j].RefFlow * kernel[j + kSize2]; + + filtered[i % kSize] = weoightedSum; + } + } + + for (int k = optoDataCount - kSize; k < optoDataCount; k++) + { + if (k >= 0) optoData[k].RefFlow = filtered[k % kSize]; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/ProcParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/ProcParams.cs new file mode 100644 index 00000000..de187b75 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/ProcParams.cs @@ -0,0 +1,182 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + public class ProcParams : ProcedureParamsBase, IParamsProvider, IProcedureParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcParams) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public MeterType MeterType; + public float CalibTarget; /// Target error after calibration in [%] + public int FactorLimitLo; /// Lower limit for the calibration factor + public int FactorLimitHi; /// Upper limit for the calibration factor +#if ORACLE_DB + public int WMType_ID; /// Required for Oracle DB: ID_WZTyp in table VT_PRUEFPUNKT_SOLL_SD + public int WMType_Rev; /// Required for Oracle DB: Rev_WZTyp in table VT_PRUEFPUNKT_SOLL_SD +#endif + + + public override void InitializeAll() + { + MeterType = MeterType.AutoDetect; + CalibTarget = 0; + FactorLimitLo = 1000; + FactorLimitHi = 8000; +#if ORACLE_DB + WMType_ID = 2; /// Value for iPerl DN15 + WMType_Rev = 1; /// Value for iPerl DN15 +#endif + } + + string[] paramNames = new string[] + { + "iPerl type", + "Calib. target [%]", + "Calib. factor Lo", + "Calib. factor Hi", +#if ORACLE_DB + "WMType ID", + "WMType Rev.", +#endif + }; + public override string ParamName(int i) { return paramNames[i]; } + public override int ParamsCount() { return paramNames.Length; } + + public override string ToString(int i) + { + switch (i) + { + case 0: return MeterType.ToString(); + case 1: return CalibTarget.ToString(); + case 2: return FactorLimitLo.ToString(); + case 3: return FactorLimitHi.ToString(); +#if ORACLE_DB + case 4: return WMType_ID.ToString(); + case 5: return WMType_Rev.ToString(); +#endif + default: return string.Empty; + } + } + + public CfgUpdateFlags UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: + for (MeterType mt = 0; mt < MeterType.Count; mt++) + { + if (mt.ToString().Equals(strValue)) { MeterType = mt; return CfgUpdateFlags.None; } + } + break; + case 1: CalibTarget = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 2: FactorLimitLo = int.Parse(strValue); return CfgUpdateFlags.None; + case 3: FactorLimitHi = int.Parse(strValue); return CfgUpdateFlags.None; +#if ORACLE_DB + case 4: WMType_ID = int.Parse(strValue); return CfgUpdateFlags.None; + case 5: WMType_Rev = int.Parse(strValue); return CfgUpdateFlags.None; +#endif + default: return CfgUpdateFlags.None; + } + + return CfgUpdateFlags.None; + } + + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + + int iDummy; + float fDummy; + + switch (i) + { + case 0: + for (MeterType mt = 0; mt < MeterType.Count; mt++) if (mt.ToString().Equals(strValue)) return true; + break; + case 1: + if (Utils.TryParseSFloat(strValue, out fDummy) && fDummy >= -10.0f && fDummy <= 10.0f) return true; + break; + case 2: + case 3: + if (int.TryParse(strValue, out iDummy) && iDummy >= 1000 && iDummy <= 8000) return true; + break; + +#if ORACLE_DB + case 4: /// WMType_ID + case 5: /// WMType_Rev + if (int.TryParse(strValue, out iDummy)) return true; + break; +#endif + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(ProcParams prms) + { + prms.MeterType = this.MeterType; + prms.CalibTarget = this.CalibTarget; + prms.FactorLimitLo = this.FactorLimitLo; + prms.FactorLimitHi = this.FactorLimitHi; +#if ORACLE_DB + prms.WMType_ID = this.WMType_ID; + prms.WMType_Rev = this.WMType_Rev; +#endif + } + + public IParamsProvider Clone() + { + ProcParams pars = new ProcParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateFromDbEntity(ComponentProcedure dbEntity) + { + if (dbEntity == null) return; + try + { + ProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcParams; + + procedureParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + procedure = dbEntity.Procedure; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + + public ProcParams() + { + } + + public ProcParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public ProcParams(ComponentProcedure procParamsEntity, string componentName, Procedure procedure) + { + this.procedureParamsEntity = procParamsEntity; + this.componentName = componentName; + this.procedure = procedure; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/StatusStruct.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/StatusStruct.cs new file mode 100644 index 00000000..f9f91757 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenHead/StatusStruct.cs @@ -0,0 +1,160 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; + +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + public class StatusStruct + { + public static readonly int Length = 48; + + public Byte Version; + public FlowState FlowState; + public UInt32 BillingVolume; + public UInt32 ForwardVolume; + public UInt32 ReverseVolume; + public UInt32 SecondsActive; + public UInt32 SecondsIdle; + public UInt32 SecondsUsed; + public UInt32 UTC; + public Int32 ScaledAvgFlowRate; + public UInt16 PeakFlowRate; + public UInt16 AlarmState; + public byte RebootCount; + public byte[] AlarmCount; + public UInt16 FlipTime; + + + public StatusStruct() + { + AlarmCount = new byte[7]; + } + + public byte[] ToByteArray() + { + byte[] result = new byte[Length]; + + result[0] = Version; + result[1] = (byte)FlowState; + + result[2] = (byte)(BillingVolume & 0x000000FF); + result[3] = (byte)((BillingVolume >> 8) & 0x000000FF); + result[4] = (byte)((BillingVolume >> 16) & 0x000000FF); + result[5] = (byte)((BillingVolume >> 24) & 0x000000FF); + + result[6] = (byte)(ForwardVolume & 0x000000FF); + result[7] = (byte)((ForwardVolume >> 8) & 0x000000FF); + result[8] = (byte)((ForwardVolume >> 16) & 0x000000FF); + result[9] = (byte)((ForwardVolume >> 24) & 0x000000FF); + + result[10] = (byte)(ReverseVolume & 0x000000FF); + result[11] = (byte)((ReverseVolume >> 8) & 0x000000FF); + result[12] = (byte)((ReverseVolume >> 16) & 0x000000FF); + result[13] = (byte)((ReverseVolume >> 24) & 0x000000FF); + + result[14] = (byte)(SecondsActive & 0x000000FF); + result[15] = (byte)((SecondsActive >> 8) & 0x000000FF); + result[16] = (byte)((SecondsActive >> 16) & 0x000000FF); + result[17] = (byte)((SecondsActive >> 24) & 0x000000FF); + + result[18] = (byte)(SecondsIdle & 0x000000FF); + result[19] = (byte)((SecondsIdle >> 8) & 0x000000FF); + result[20] = (byte)((SecondsIdle >> 16) & 0x000000FF); + result[21] = (byte)((SecondsIdle >> 24) & 0x000000FF); + + result[22] = (byte)(SecondsUsed & 0x000000FF); + result[23] = (byte)((SecondsUsed >> 8) & 0x000000FF); + result[24] = (byte)((SecondsUsed >> 16) & 0x000000FF); + result[25] = (byte)((SecondsUsed >> 24) & 0x000000FF); + + result[26] = (byte)(UTC & 0x000000FF); + result[27] = (byte)((UTC >> 8) & 0x000000FF); + result[28] = (byte)((UTC >> 16) & 0x000000FF); + result[29] = (byte)((UTC >> 24) & 0x000000FF); + + result[30] = (byte)(ScaledAvgFlowRate & 0x000000FF); + result[31] = (byte)((ScaledAvgFlowRate >> 8) & 0x000000FF); + result[32] = (byte)((ScaledAvgFlowRate >> 16) & 0x000000FF); + result[33] = (byte)((ScaledAvgFlowRate >> 24) & 0x000000FF); /// TODO: test with negative value + + result[34] = (byte)(PeakFlowRate & 0x00FF); + result[35] = (byte)((PeakFlowRate >> 8) & 0x00FF); + + result[36] = (byte)(AlarmState & 0x00FF); + result[37] = (byte)((AlarmState >> 8) & 0x00FF); + + result[38] = RebootCount; + + result[39] = AlarmCount[0]; + result[40] = AlarmCount[1]; + result[41] = AlarmCount[2]; + result[42] = AlarmCount[3]; + result[43] = AlarmCount[4]; + result[44] = AlarmCount[5]; + result[45] = AlarmCount[6]; + + result[46] = (byte)(FlipTime & 0x00FF); + result[47] = (byte)((FlipTime >> 8) & 0x00FF); + + return result; + } + + public static StatusStruct FromByteArray(byte[] data) + { + if (data.Length != Length) return null; + + StatusStruct result = new StatusStruct(); + + result.Version = data[0]; + result.FlowState = (FlowState)data[1]; + result.BillingVolume = (((UInt32)data[5] * 256 + data[4]) * 256 + data[3]) * 256 + data[2]; + result.ForwardVolume = (((UInt32)data[9] * 256 + data[8]) * 256 + data[7]) * 256 + data[6]; + result.ReverseVolume = (((UInt32)data[13] * 256 + data[12]) * 256 + data[11]) * 256 + data[10]; + result.SecondsActive = (((UInt32)data[17] * 256 + data[16]) * 256 + data[15]) * 256 + data[14]; + result.SecondsIdle = (((UInt32)data[21] * 256 + data[20]) * 256 + data[19]) * 256 + data[18]; + result.SecondsUsed = (((UInt32)data[25] * 256 + data[24]) * 256 + data[23]) * 256 + data[22]; + result.UTC = (((UInt32)data[29] * 256 + data[28]) * 256 + data[27]) * 256 + data[26]; + result.ScaledAvgFlowRate = (((Int32)data[33] * 256 + data[32]) * 256 + data[31]) * 256 + data[30]; /// TODO: test with negative value + result.PeakFlowRate = (UInt16)(data[34] + 256 * data[35]); + result.AlarmState = (UInt16)(data[36] + 256 * data[37]); + result.RebootCount = data[38]; + result.AlarmCount[0] = data[39]; + result.AlarmCount[1] = data[40]; + result.AlarmCount[2] = data[41]; + result.AlarmCount[3] = data[42]; + result.AlarmCount[4] = data[43]; + result.AlarmCount[5] = data[44]; + result.AlarmCount[6] = data[45]; + result.FlipTime = (UInt16)(data[46] * 256 + data[47]); + + return result; + } + + public override string ToString() + { + return string.Format("Status: V{0} Flow={1} BillVol={2} ForwVol={3} RevVol={4} SecActive={5}s SecIdle={6}s SecUsed={7}s UTC={8} AvgFlowRate={9} PeekFlowRate={10} AlarmState={11} RebootCount={12} A0={13} A1={14} A2={15} A3={16} A4={17} A5={18} A6={19} FlipTime={20}", + Version, + FlowState, + BillingVolume, + ForwardVolume, + ReverseVolume, + SecondsActive, + SecondsIdle, + SecondsUsed, + UTC, + ScaledAvgFlowRate, + PeakFlowRate, + AlarmState, + RebootCount, + AlarmCount[0], + AlarmCount[1], + AlarmCount[2], + AlarmCount[3], + AlarmCount[4], + AlarmCount[5], + AlarmCount[6], + FlipTime); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/CalibrationStruct.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/CalibrationStruct.cs new file mode 100644 index 00000000..6670d335 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/CalibrationStruct.cs @@ -0,0 +1,197 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; + +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + public class CalibrationStruct + { + public static readonly int Length = 35; + + public Byte Version; + public MeterType MeterType; + public UInt16 Calibration; + public VolumeUnits VolumeUnits; + public FlowArrow FlowArrow; + public UInt16 FWVersion; + public UInt16[] TargetField; + public UInt16 RecipMeanCurrent; + public UInt16 ThresholdVolume; + public UInt16 ThresholdTime; + public UInt16 FlowActivationThr; + public UInt16 VolumeArrowThr; + public UInt32 CalibrationTime; + public ulong SerialNumber; + public MeterSealed MeterSealed; + public byte CheckSum; + + + public CalibrationStruct() + { + TargetField = new UInt16[3]; + } + + public byte[] ToByteArray() + { + byte[] result = new byte[Length]; + + result[0] = Version; + result[1] = (byte)MeterType; + + result[2] = (byte)(Calibration & 0x00FF); + result[3] = (byte)((Calibration >> 8) & 0x00FF); + + result[4] = (byte)VolumeUnits; + + result[5] = (byte)FlowArrow; + + result[6] = (byte)(FWVersion & 0x00FF); + result[7] = (byte)((FWVersion >> 8) & 0x00FF); + + result[8] = (byte)( TargetField[0] & 0x00FF); + result[9] = (byte)((TargetField[0] >> 8) & 0x00FF); + result[10] = (byte)( TargetField[1] & 0x00FF); + result[11] = (byte)((TargetField[1] >> 8) & 0x00FF); + result[12] = (byte)( TargetField[2] & 0x00FF); + result[13] = (byte)((TargetField[2] >> 8) & 0x00FF); + + result[14] = (byte)(RecipMeanCurrent & 0x00FF); + result[15] = (byte)((RecipMeanCurrent >> 8) & 0x00FF); + + result[16] = (byte)(ThresholdVolume & 0x00FF); + result[17] = (byte)((ThresholdVolume >> 8) & 0x00FF); + + result[18] = (byte)(ThresholdTime & 0x00FF); + result[19] = (byte)((ThresholdTime >> 8) & 0x00FF); + + result[20] = (byte)(FlowActivationThr & 0x00FF); + result[21] = (byte)((FlowActivationThr >> 8) & 0x00FF); + + result[22] = (byte)(VolumeArrowThr & 0x00FF); + result[23] = (byte)((VolumeArrowThr >> 8) & 0x00FF); + + result[24] = (byte)(CalibrationTime & 0x000000FF); + result[25] = (byte)((CalibrationTime >> 8) & 0x000000FF); + result[26] = (byte)((CalibrationTime >> 16) & 0x000000FF); + result[27] = (byte)((CalibrationTime >> 24) & 0x000000FF); + + result[28] = (byte)(SerialNumber & 0x00000000000000FF); + result[29] = (byte)((SerialNumber >> 8) & 0x00000000000000FF); + result[30] = (byte)((SerialNumber >> 16) & 0x00000000000000FF); + result[31] = (byte)((SerialNumber >> 24) & 0x00000000000000FF); + result[32] = (byte)((SerialNumber >> 32) & 0x00000000000000FF); + + result[33] = (byte)MeterSealed; + result[34] = CheckSum; + + return result; + } + + /// + /// Create a calibration structure from a complete byte array + /// + /// A complete byte array data + /// CalibrationStruct or null when byte array was not complete + public static CalibrationStruct FromByteArray(byte[] data) + { + if (data.Length != Length) return null; + + CalibrationStruct result = new CalibrationStruct(); + + result.Version = data[0]; + result.MeterType = (MeterType)data[1]; + result.Calibration = (UInt16)(data[2] + 256 * data[3]); + result.VolumeUnits = (VolumeUnits)data[4]; + result.FlowArrow = (FlowArrow)data[5]; + result.FWVersion = (UInt16)(data[6] + 256 * data[7]); + result.TargetField[0] = (UInt16)(data[8] + 256 * data[9]); + result.TargetField[1] = (UInt16)(data[10] + 256 * data[11]); + result.TargetField[2] = (UInt16)(data[12] + 256 * data[13]); + result.RecipMeanCurrent = (UInt16)(data[14] + 256 * data[15]); + result.ThresholdVolume = (UInt16)(data[16] + 256 * data[17]); + result.ThresholdTime = (UInt16)(data[18] + 256 * data[19]); + result.FlowActivationThr = (UInt16)(data[20] + 256 * data[21]); + result.VolumeArrowThr = (UInt16)(data[22] + 256 * data[23]); + result.CalibrationTime = (((UInt32)data[27] * 256 + data[26]) * 256 + data[25]) * 256 + data[24]; + result.SerialNumber = ((((UInt64)data[32] * 256 + data[31]) * 256 + data[30]) * 256 + data[29]) * 256 + data[28]; + result.MeterSealed = (MeterSealed)data[33]; + result.CheckSum = data[34]; + + return result; + } + + /// + /// Update the calibration structure from an incomplete byte array + /// + /// Byte array data + /// Offset of byte array data in CalibrationStruct + /// true when successful, false when data are not appropriate + public bool Update(byte[] data, int offset) + { + if (offset == 2 && data.Length == 2) + { + /// Data containing iPerl calibration factor + Calibration = (UInt16)(data[2 - offset] + 256 * data[3 - offset]); + return true; + } + else if (offset == 0 && data.Length == Length) + { + /// Data containing a complete CalibrationStruct + Version = data[0]; + MeterType = (MeterType)data[1]; + Calibration = (UInt16)(data[2] + 256 * data[3]); + VolumeUnits = (VolumeUnits)data[4]; + FlowArrow = (FlowArrow)data[5]; + FWVersion = (UInt16)(data[6] + 256 * data[7]); + TargetField[0] = (UInt16)(data[8] + 256 * data[9]); + TargetField[1] = (UInt16)(data[10] + 256 * data[11]); + TargetField[2] = (UInt16)(data[12] + 256 * data[13]); + RecipMeanCurrent = (UInt16)(data[14] + 256 * data[15]); + ThresholdVolume = (UInt16)(data[16] + 256 * data[17]); + ThresholdTime = (UInt16)(data[18] + 256 * data[19]); + FlowActivationThr = (UInt16)(data[20] + 256 * data[21]); + VolumeArrowThr = (UInt16)(data[22] + 256 * data[23]); + CalibrationTime = (((UInt32)data[27] * 256 + data[26]) * 256 + data[25]) * 256 + data[24]; + SerialNumber = ((((UInt64)data[32] * 256 + data[31]) * 256 + data[30]) * 256 + data[29]) * 256 + data[28]; + MeterSealed = (MeterSealed)data[33]; + CheckSum = data[34]; + return true; + } + else + return false; + } + + public string FWVersionStr() + { + int d1 = (FWVersion >> 8) & 0x000F; + int d2 = (FWVersion >> 12) & 0x000F; + int d3 = (FWVersion >> 4) & 0x000F; + int d4 = FWVersion & 0x000F; + return string.Format("{0}.{1}{2}{3}", d1, d2, d3, d4); + } + + public override string ToString() + { + return string.Format("Calibration: V{0} Type={1} Cal={2} Units={3} FlowArrow.{4} FW={5} Hi={6} Norm={7} Low={8} RMC={9} ThrVol={10} ThrTime={11} FlActThr={12} VolArrThr={13} CalTm={14} SN={15} MeterSealed={16} Chksum={17}", + Version, + MeterType, + Calibration, + VolumeUnits, + FlowArrow, + FWVersion, + TargetField[0], + TargetField[1], + TargetField[2], + RecipMeanCurrent, + ThresholdVolume, + ThresholdTime, + FlowActivationThr, + VolumeArrowThr, + CalibrationTime, + SerialNumber, + MeterSealed, + CheckSum.ToString("X2")); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/ConfigStruct.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/ConfigStruct.cs new file mode 100644 index 00000000..1275f745 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/ConfigStruct.cs @@ -0,0 +1,225 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; + +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + public class ConfigStruct + { + public const int Length = 32; + + public Byte Version; /// 0: 1 byte + public MeterState MeterState; /// 1: 1 byte + public UInt32 TargetTimeVeryLowBatt; /// 2: 4 bytes in seconds + public UInt32 TargetTimeLowBatt; /// 6: 4 bytes, in seconds + public UInt32 TestModeTime; /// 10: 4 bytes, Max. test mode time in seconds + public UInt16 EmptyPipeThreshold; /// 14: 2 bytes + public byte[] PCBNumber; /// 16: 5 bytes + public byte TestModeConfig; /// 21: 1 byte + public UInt32 RadioAddress; /// 22: 4 bytes + public UInt16 TempCalibration; /// 26: 2 bytes + public UInt16 AlarmMask; /// 28: 2 bytes, Default 0xA3F7 + public UInt16 ConfigCheckSum; /// 30: 2 bytes + + public ConfigStruct() + { + PCBNumber = new byte[5]; + } + + public byte[] ToByteArray() + { + byte[] result = new byte[Length]; + + result[0] = Version; + result[1] = (byte)MeterState; + + result[2] = (byte)(TargetTimeVeryLowBatt & 0x000000FF); + result[3] = (byte)((TargetTimeVeryLowBatt >> 8) & 0x000000FF); + result[4] = (byte)((TargetTimeVeryLowBatt >> 16) & 0x000000FF); + result[5] = (byte)((TargetTimeVeryLowBatt >> 24) & 0x000000FF); + + result[6] = (byte)(TargetTimeLowBatt & 0x000000FF); + result[7] = (byte)((TargetTimeLowBatt >> 8) & 0x000000FF); + result[8] = (byte)((TargetTimeLowBatt >> 16) & 0x000000FF); + result[9] = (byte)((TargetTimeLowBatt >> 24) & 0x000000FF); + + result[10] = (byte)(TestModeTime & 0x000000FF); + result[11] = (byte)((TestModeTime >> 8) & 0x000000FF); + result[12] = (byte)((TestModeTime >> 16) & 0x000000FF); + result[13] = (byte)((TestModeTime >> 24) & 0x000000FF); + + result[14] = (byte)(EmptyPipeThreshold & 0x00FF); + result[15] = (byte)((EmptyPipeThreshold >> 8) & 0x00FF); + + result[16] = PCBNumber[0]; + result[17] = PCBNumber[1]; + result[18] = PCBNumber[2]; + result[19] = PCBNumber[3]; + result[20] = PCBNumber[4]; + + result[21] = TestModeConfig; + + result[22] = (byte)(RadioAddress & 0x000000FF); + result[23] = (byte)((RadioAddress >> 8) & 0x000000FF); + result[24] = (byte)((RadioAddress >> 16) & 0x000000FF); + result[25] = (byte)((RadioAddress >> 24) & 0x000000FF); + + result[26] = (byte)(TempCalibration & 0x00FF); + result[27] = (byte)((TempCalibration >> 8) & 0x00FF); + + result[28] = (byte)(AlarmMask & 0x00FF); + result[29] = (byte)((AlarmMask >> 8) & 0x00FF); + + result[30] = (byte)(ConfigCheckSum & 0x00FF); + result[31] = (byte)((ConfigCheckSum >> 8) & 0x00FF); + + return result; + } + + /// + /// Create a configuration structure from a complete byte array + /// + /// A complete byte array data + /// ConfigStruct or null when byte array was not complete + public static ConfigStruct FromByteArray(byte[] data) + { + if (data.Length != Length) return null; + + ConfigStruct result = new ConfigStruct(); + + result.Version = data[0]; + result.MeterState = (MeterState)data[1]; + result.TargetTimeVeryLowBatt = (((UInt32)data[5] * 256 + data[4]) * 256 + data[3]) * 256 + data[2]; + result.TargetTimeLowBatt = (((UInt32)data[9] * 256 + data[8]) * 256 + data[7]) * 256 + data[6]; + result.TestModeTime = (((UInt32)data[13] * 256 + data[12]) * 256 + data[11]) * 256 + data[10]; + result.EmptyPipeThreshold = (UInt16)(data[15] * 256 + data[14]); + result.PCBNumber[0] = data[16]; + result.PCBNumber[1] = data[17]; + result.PCBNumber[2] = data[18]; + result.PCBNumber[3] = data[19]; + result.PCBNumber[4] = data[20]; + result.TestModeConfig = data[21]; + result.RadioAddress = (((UInt32)data[25] * 256 + data[24]) * 256 + data[23]) * 256 + data[22]; + result.TempCalibration = (UInt16)(data[27] * 256 + data[26]); + result.AlarmMask = (UInt16)(data[29] * 256 + data[28]); + result.ConfigCheckSum = (UInt16)(data[31] * 256 + data[30]); + + return result; + } + + /// + /// Update the configuration structure from an incomplete byte array + /// + /// Offset of byte array data in ConfigStruct + /// Byte array data + /// true when successful, false when data are not appropriate + public bool Update(int offset, byte[] data) + { + if (offset == 0 && data.Length == 2) + { + /// iPerl mode of function + Version = data[0]; + MeterState = (MeterState)data[1]; + return true; + } + else if (offset == 0 && data.Length == 4) + { + /// iPerl mode of function and extra 2 bytes + Version = data[0]; + MeterState = (MeterState)data[1]; + return true; + } + else if (offset == 21 && data.Length == 1) + { + /// TestModeConfig value + TestModeConfig = data[21 - offset]; + return true; + } + else if (offset == 0 && data.Length == Length) + { + /// Complete ConfigStruct + Version = data[0]; + MeterState = (MeterState)data[1]; + TargetTimeVeryLowBatt = (((UInt32)data[5] * 256 + data[4]) * 256 + data[3]) * 256 + data[2]; + TargetTimeLowBatt = (((UInt32)data[9] * 256 + data[8]) * 256 + data[7]) * 256 + data[6]; + TestModeTime = (((UInt32)data[13] * 256 + data[12]) * 256 + data[11]) * 256 + data[10]; + EmptyPipeThreshold = (UInt16)(data[15] * 256 + data[14]); + PCBNumber[0] = data[16]; + PCBNumber[1] = data[17]; + PCBNumber[2] = data[18]; + PCBNumber[3] = data[19]; + PCBNumber[4] = data[20]; + TestModeConfig = data[21]; + RadioAddress = (((UInt32)data[25] * 256 + data[24]) * 256 + data[23]) * 256 + data[22]; + TempCalibration = (UInt16)(data[27] * 256 + data[26]); + AlarmMask = (UInt16)(data[29] * 256 + data[28]); + ConfigCheckSum = (UInt16)(data[31] * 256 + data[30]); + return true; + } + else + return false; + } + + /// + /// Returns PCB number string (12 characters, 12 decimal digits) + /// + /// PCB number STRING + public string GetPcbNrString() + { + return PCBNumber2String(this.PCBNumber); + } + + /// + /// Converts PCBNumber to string (12 characters, 12 decimal digits) + /// + /// + /// PCB number string + public static string PCBNumber2String(byte[] pcbNumber) + { + if (pcbNumber.Length != 5) return string.Empty; + + Int64 number = 0; + for (int i = 4; i >= 0; i--) + { + number = 256 * number + (Int64)pcbNumber[i]; + } + + return number.ToString(); + } + + public override string ToString() + { + return string.Format("Config: V{0} State={1} VLoBattT={2}s LoBattT={3}s TestModeT={4}s EPThld={5} PCB#={6} TMCfg={7} RadioAddr={8} TempCalib={9} AlarmMask={10} CfgCheckSum={11}", + Version, + MeterState, + TargetTimeVeryLowBatt, + TargetTimeLowBatt, + TestModeTime, + EmptyPipeThreshold, + GetPcbNrString(), + TestModeConfig.ToString("X2"), + RadioAddress, + TempCalibration, + AlarmMask.ToString("X4"), + ConfigCheckSum.ToString("X4")); + } + + public string ToString(int sel) + { + return string.Format("{1} PCB#={6} TMCfg={7}", + Version, + MeterState, + TargetTimeVeryLowBatt, + TargetTimeLowBatt, + TestModeTime, + EmptyPipeThreshold, + GetPcbNrString(), + TestModeConfig.ToString("X2"), + RadioAddress, + TempCalibration, + AlarmMask.ToString("X4"), + ConfigCheckSum.ToString("X4")); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/Enums.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/Enums.cs new file mode 100644 index 00000000..20317d8e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/Enums.cs @@ -0,0 +1,110 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + public enum MessageID + { + Calibration = 0x00, /// Access to stCalibration + Configuration = 0x01, /// Access to stConfig + Status = 0x02, /// Access to stStaus, read only + Power = 0x03, /// Access to stPower, containing power info from both processors + LCD = 0x04, /// Access to stLCD + EventData = 0x05, /// NOT USED + IntervalData = 0x06, /// NOT USED + Diagnostics = 0x07, /// Access tostMetroDiagArray, read onl + MetrologyMemory = 0x08, /// Memory block access, read only + Error_LongAck = 0x09, /// Error message + Command = 0x0A, /// Command to execute, with no arguments + Parameterizing = 0x0B, /// Parameterizing message is used in MCI-SPI interface only + Error_ShortAck = 0x0C, /// Short acknowledge message is used in MCI-SPI interface only + ChanelAlive = 0x0D, /// Channel alive message is used in MCI-SPI interface only + RadioPassthrough = 0x0E, /// RFID <-> Metrology <-> Radio passthrough message + ASICRegisterReadTest = 0x0F, /// ASIC Register read test + IMIDebugMessagesAccess = 0x10, /// IMI debug messages read test + ProductionChecksumsRead = 0x11, /// Production checksum read: Calibration (1 byte), Configuration (2 bytes), spare (4 bytes) + HardwareParametersTest = 0x12, /// Hardware Parameters Testing: User configurable fixed field drive time (1 byte) + /// + /// Notes: + /// 1. Short Ack message contains 1-byte error code and all the fields (Offset, Payload length, payload and password) will not be present. + /// 2. Channel Alive message does not contain the fields (Offset, Payload length, payload and password). + /// 3. Except the above two special messages, rest all the messages in the above table will follow the message format mentioned in sections 3.1 and 3.2. + /// + Count /// Number of MessageID-s + } + + public enum MeterType : byte + { + DN15 = 0, + CoaxManifold = 1, + DN20 = 2, + DN25 = 3, + DN26 = 4, /// DN25* + DN32 = 5, + DN40 = 6, + AutoDetect, + Count /// Number of meter types + } + + public enum VolumeUnits : byte + { + m3 = 0, + UK_gallon = 1, + US_gallon = 2, + Count /// Number of volume units + } + + public enum FlowArrow : byte + { + No = 0, + Right = 1, + Left = 2, + Count /// Number of flow arrows + } + + public enum MeterSealed : byte + { + InProduction = 0x00, + OutOfProduction = 0xA5, + Sealed = 0x5A, + } + + public enum MeterState : byte + { + None = 0, + Idle = 1, + Active = 2, + Test = 3, + EndOfLife = 4, + Count /// Number of meter states + } + + public enum FlowState : byte + { + No = 0, + Reverse = 1, + Forward = 2, + EmptyPipe = 3, + Count /// Number of flow states + } + + public enum OptoTelegramFlags : byte + { + OK = 0, + OK_TestStart, + OK_TestEnd, + InvalidTelegram, /// Wrong telegram format of checksum error + SyncError, + } + + public enum OptoState + { + Read, + Flush, + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/Factory.cs new file mode 100644 index 00000000..e37e88eb --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return "RegisterReader for Genesis"; } } + + public void ResetStaticProperties() { GenesisHead.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new GenesisHead(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new GenesisHead(cfg); } + + public IComponentCfg DefaultConfig() { return new GenesisHeadCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(GenesisHeadCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/GenesisHead.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/GenesisHead.cs new file mode 100644 index 00000000..4304b94f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/GenesisHead.cs @@ -0,0 +1,390 @@ +/// +/// Copyright (c) 2015-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.IO.Ports; +using System.Threading; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.BenchControl; +using TBF.BenchControl.Generic; +using TBF.Resources; +using Xylem.Common.Hardware.WaterMeter.Genesis; +using Xylem.Common.Hardware.WaterMeter; + +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + /// + /// This component = instance of this class is a placeholder for a combined main watermeter + /// + public class GenesisHead : ComponentBase, IDevice, GenericDevices.IRegisterReader, IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(GenesisHead)); + public override string ToString() { return string.Format("Genesis({0})", Cfg.ToString(1)); } + + + readonly GenesisHeadCfg genesisHeadCfg; + public int SlotNr { get { return genesisHeadCfg.SlotNr; } } + public double PulsesPerLtr { get { return 1000.0; } } + public double LtrsPerPulse { get { return 1 / PulsesPerLtr; } } + +#if ORACLE_DB + public int WMType_ID { get { return iperlHeadCfg.ProcParams.WMType_ID; } } /// Required by Oracle DB + public int WMType_Rev { get { return iperlHeadCfg.ProcParams.WMType_Rev; } } /// Required by Oracle DB +#endif + public float CalibTarget { get { return (ushort)genesisHeadCfg.ProcParams.CalibTarget; } } + public ushort FactorLimitLo { get { return (ushort)genesisHeadCfg.ProcParams.FactorLimitLo; } } + public ushort FactorLimitHi { get { return (ushort)genesisHeadCfg.ProcParams.FactorLimitHi; } } + + /// Properties set by the Begin and the End form + //todo rd implement + public string SerialNr; + + + public string EndState + { + get { return endState; } + set { endState = value; } + } + string endState; + + public string BeginState + { + get { return beginState; } + set { beginState = value; } + } + string beginState; + + public bool Disabled + { + get { return disabled; } + set { disabled = value; } + } + bool disabled; + + public bool CommFailed + { + get { return commFailed; } + set { commFailed = value; } + } + bool commFailed; + + public int ResultCode + { + get { return resultCode; } + } + int resultCode; + + + /// ConfigStruct of the water meter obtained or updated by iPerlCommunication + public ConfigStruct ConfigStruct + { + get { return configStruct; } + set { configStruct = value; } + } + ConfigStruct configStruct; + + /// CalibrationStruct of the water meter obtained or updated by iPerlCommunication + public CalibrationStruct CalibrationStruct + { + get { return calibrationStruct; } + set { calibrationStruct = value; } + } + CalibrationStruct calibrationStruct; + + public ushort OrigCalibFactor; + public ushort CalibFactor { get { return (CalibrationStruct != null) ? CalibrationStruct.Calibration : (ushort)0; } } + + public double Q2ErrWOCorrection; + public bool Q2CorrectionDone; + public double Q2Correction; + public int Q2CorrRFlow; + public int Q2CorrLFlow; + + public double Diff2Hz8Hz; + public bool Hz2CorrectionDone; + public int Hz2Correction; + + public string FWVersion { get { return (CalibrationStruct != null) ? CalibrationStruct.FWVersionStr() : string.Empty; } } + + + /// Result of the last test used to calculate Q2 correction factors, etc + public Results.Entities.MeterTestRslt LastTestResult2; + public Results.Entities.MeterTestRslt LastTestResult; + public double NominalTestFlowLph; /// in liter per hour + + + /// + /// Required for IRegisterReader interface + /// + public int WMPulses { get { return wmPulses; } } + public int WMRefPulses { get { return wmRefPulses; } } + public double WMVolume { get { return wmVolume; } } + public double BeginWMState { get { return beginWMState; } } + public double EndWMState { get { return endWMState; } } + public double WMTestTime { get { return wmTestTime; } } + + + double beginWMState; + double endWMState; + double wmVolume; + int wmPulses; + int wmRefPulses; + double wmTestTime; + + + /// Name set by the test, to be used as a part of the opto-data log file name + public string TestName; + + /// Name set by the test, to be used as a part of the opto-data log file name + public string BenchName; + + /// + /// Volume of water from the opto telegram + /// + private Int64 lastVolumeRaw; /// Last read raw volume + private double volumeLtr; /// + private double volumeLtr0; + + + /// + /// Timestamp from the opto telegram + /// + private double timestampSec; + private double timestampSec0; + + public bool NoSamples { get { return (timestampSecEnd - timestampSecStart) < float.Epsilon; } } + public double TimestampSecStart { get { return timestampSecStart; } } + public double TimestampSecEnd { get { return timestampSecEnd; } } + double timestampSecStart; + double timestampSecEnd; + + public GenesisHead() + { + } + + public GenesisHead(Generic.IComponentCfg cfg) + : base(cfg) + { + ClearData(); + + genesisHeadCfg = cfg as GenesisHeadCfg; + + log.Debug(this.ToString()); + } + + + GenesisMeter myGenesis = null; + + /// + /// Clear data related to a specific water meter + /// + public void ClearData() + { + resultCode = 0; + + disabled = false; + commFailed = false; + endState = string.Empty; + beginState = string.Empty; + + configStruct = null; + calibrationStruct = null; + + LastTestResult = null; + NominalTestFlowLph = 0; + + OrigCalibFactor = 0; + Q2ErrWOCorrection = 0; + Q2CorrectionDone = false; + Q2CorrRFlow = 0; + } + + public void Initialize() + { + ClearData(); + + if (DebugLevel == DebugMode.Normal) + { + //add for gen + myGenesis = new GenesisMeter(); + myGenesis.Setup(SlotNr); + + + Global.GlobalMeterBatch.AddMeter(myGenesis); + + } + } + + public void RunDeviceBefore() + { + + //todo: RD- Login?? + if (DebugLevel == DebugMode.Normal) + { + if (myGenesis != null) + { + //myGenesis.Login(); + //myGenesis.InitMeasurement(); + } + else + { + throw new Exception("No meter was bound!"); + } + } + else if (DebugLevel == DebugMode.FailureDuringOperation) + { + } + } + + public void RunDeviceAfter() { } + + public void StopDevice() + { + try + { + + if (DebugLevel == DebugMode.Normal && myGenesis != null) + { + myGenesis.DisposeMeter(); + + Global.GlobalMeterBatch.RemoveMeter(myGenesis); + } + } + catch + { + } + } + + public void StopDevice2() { } + + /// + /// Events: Event.ReadRegisterDone, Event.Error + /// + /// ReadWaterMeter instance reference casted to IOperaton + public IOperation ReadRegisterOp() + { + return this; + } + + /// + /// Clear data/counters related to a specific tests + /// + public void Clear() + { + resultCode = 0; + + sampleNr = 0; + + volumeLtr = 0; + volumeLtr0 = 0; + timestampSec = 0; + timestampSec0 = 0; + + ReadPulses(); + } + + public void TestCompleted() + { + /// TODO: Implement + } + + + int sampleNr; /// This is to determine when the test start sample should be taken + bool StoreStartPackage = false; + bool StoreEndPackage = false; + /// Start this operation + public void Start() + { + //Start mesurement + if (DebugLevel == DebugMode.Normal) + { + if (myGenesis != null) + { + myGenesis.StartMeasurement(); + StoreStartPackage = true; + } + else + { + throw new Exception("No meter was bound!"); + } + } + + } + void readOutResults(Xylem.Common.Hardware.WaterMeter.CommonMeterDefinitions.MeasurementResults results) + { + + if (StoreStartPackage) + { + + volumeLtr0 = results.StartData.VolumeQm / 1000; + timestampSec0 = results.StartData.MeterTimeS; + StoreStartPackage = false; + } + else if (!StoreEndPackage) + { + + volumeLtr = results.EndData.VolumeQm / 1000; + timestampSec = results.EndData.MeterTimeS; + wmTestTime = results.TotalTimeS; + wmVolume = results.TotalVolumeQm / 1000; + ReadPulses(); + } + + + } + + /// Run this operation + /// eventDone + public Event Run() + { + if (DebugLevel == DebugMode.Normal) + { + if (myGenesis != null) + { + var results = myGenesis.GetMeasurementResultPreliminary(); + readOutResults(results); + } + else + { + throw new Exception("No meter was bound!"); + } + } + + return Event.ReadRegisterDone; + } + + /// Stop this operation + public void Stop() + { + + if (DebugLevel == DebugMode.Normal && myGenesis != null) + { + myGenesis.StopMeasurement(); + var results = myGenesis.GetMeasurementResult(); + readOutResults(results); + StoreEndPackage = true; + + } + } + + void ReadPulses() + { + beginWMState = volumeLtr0; + endWMState = volumeLtr; + wmPulses = (int)(wmVolume * (double)PulsesPerLtr + 0.5); + wmRefPulses = StateMachine.ControlBoard.EtPulses(0); + } + + + bool optoSerialPortParsingEnabled; + + + + + + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/GenesisHeadCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/GenesisHeadCfg.cs new file mode 100644 index 00000000..f15e409e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/GenesisHeadCfg.cs @@ -0,0 +1,66 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Net.Sockets; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + public class GenesisHeadCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(GenesisHeadCfg) })[0]; + protected override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new GenesisHeadCfgCtrl(); } + + /// + /// Serialized parameters + /// + public int SlotNr; /// Number written to QuidoRS to connct the watermeter to RfidComPort, 1 .. 10 + + /// Procedure parameters + [XmlIgnore] + public ProcParams ProcParams; + public override IParamsProvider GetProcedureParams() { return ProcParams; } + public override IParamsProvider CreateProcedureParams(Procedure procedure) + { + ProcParams procParams = new ProcParams(true); + procParams.UpdateProcedureParams(Name, procedure); + return procParams; + } + + [XmlIgnore] + public MeterType MeterType { get { return (ProcParams != null) ? ProcParams.MeterType : MeterType.AutoDetect; } } + + + /// Private parameterless constructor invoked by all other (public) constructors + GenesisHeadCfg() + { + Name = "Genesis"; + ParentName = string.Empty; + SlotNr = 0; + ProcParams = new ProcParams(true); + } + + public GenesisHeadCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("{0} SlotNr={1}", + Name, + SlotNr + ); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/GenesisHeadCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/GenesisHeadCfgCtrl.cs new file mode 100644 index 00000000..17536028 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/GenesisHeadCfgCtrl.cs @@ -0,0 +1,89 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Net; +using System.Net.Sockets; +using System.Windows.Forms; +using log4net; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + public partial class GenesisHeadCfgCtrl : UserControl, IComponentCfgCtrl + { + static readonly ILog log = LogManager.GetLogger(typeof(GenesisHeadCfgCtrl)); + + public bool ShowMore { get { return false; } } + + GenesisHeadCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as GenesisHeadCfg; + Redraw(); + } + } + + public GenesisHeadCfgCtrl() + { + InitializeComponent(); + } + + private void WaterMeterCfgCtrl_Load(object sender, EventArgs e) + { + nameLabel.Text = Strings.Name; + classNameLabel.Text = config.Factory.ClassName; + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + nameTextBox.Text = config.Name; + + + } + + public void Unlock() + { + nameTextBox.Enabled = true; + slotNrTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + + if (!int.TryParse(slotNrTextBox.Text, out dummy) || dummy < 1 || dummy > 7) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + string.Format(Strings.Invalid_0, muxBoardNrLabel.Text); + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + + config.SlotNr = int.Parse(slotNrTextBox.Text); + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/GenesisHeadCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/GenesisHeadCfgCtrl.designer.cs new file mode 100644 index 00000000..46dba57b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/GenesisHeadCfgCtrl.designer.cs @@ -0,0 +1,121 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + partial class GenesisHeadCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.slotNrTextBox = new System.Windows.Forms.TextBox(); + this.muxBoardNrLabel = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(135, 40); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(121, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(25, 43); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(132, 16); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(60, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ClassName"; + // + // slotNrTextBox + // + this.slotNrTextBox.Enabled = false; + this.slotNrTextBox.Location = new System.Drawing.Point(135, 63); + this.slotNrTextBox.Name = "slotNrTextBox"; + this.slotNrTextBox.Size = new System.Drawing.Size(34, 20); + this.slotNrTextBox.TabIndex = 9; + // + // muxBoardNrLabel + // + this.muxBoardNrLabel.AutoSize = true; + this.muxBoardNrLabel.Location = new System.Drawing.Point(25, 66); + this.muxBoardNrLabel.Name = "muxBoardNrLabel"; + this.muxBoardNrLabel.Size = new System.Drawing.Size(37, 13); + this.muxBoardNrLabel.TabIndex = 8; + this.muxBoardNrLabel.Text = "Slot nr"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(176, 66); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(31, 13); + this.label3.TabIndex = 13; + this.label3.Text = "1 .. 6"; + // + // GenesisHeadCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.label3); + this.Controls.Add(this.slotNrTextBox); + this.Controls.Add(this.muxBoardNrLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "GenesisHeadCfgCtrl"; + this.Size = new System.Drawing.Size(396, 123); + this.Load += new System.EventHandler(this.WaterMeterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.TextBox slotNrTextBox; + private System.Windows.Forms.Label muxBoardNrLabel; + private System.Windows.Forms.Label label3; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/GenesisHeadCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/GenesisHeadCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/GenesisHeadCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/OptoReceivedEventArgs.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/OptoReceivedEventArgs.cs new file mode 100644 index 00000000..a6bda914 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/OptoReceivedEventArgs.cs @@ -0,0 +1,20 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + public class OptoReceivedEventArgs : EventArgs + { + public string Data; + + public OptoReceivedEventArgs(string data) + { + this.Data = data; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/OptoTelegramRaw.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/OptoTelegramRaw.cs new file mode 100644 index 00000000..8283d077 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/OptoTelegramRaw.cs @@ -0,0 +1,296 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Globalization; + +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + public class OptoTelegramRaw + { + public static readonly int Length = 42; + private static CultureInfo culture; + + + /// + /// Strobed value + /// + public static decimal TestStartTimestampDec; + + /// + /// Stored values + /// + public OptoTelegramFlags Flags; + + public DateTime DateTime; /// From PC + public float RefFlow; /// [m3/h] + public int Counter; + + public UInt32 EmfRaw; /// From iPerl opto data + public Int16 MagneticFieldRaw; + public Int16 FlowRaw; + public UInt32 VolumeRaw; + public Int64 VolumeRawExt; + public Int16 Impedance; + public UInt32 Timestamp; + public Int64 TimestampExt; + public byte CheckSum; + + /// + /// Calculated values + /// + public double EMF() + { + Int32 signedEmf = (EmfRaw > 0x7FFFFF) ? ((int)EmfRaw - 0x1000000) : (int)EmfRaw; + return 0.000000333 * (double)signedEmf; + } + public double MagneticField() { return (double)MagneticFieldRaw; } + public double Flow(double scalingFactor) { return 0.225 * scalingFactor * (double)FlowRaw; } + public double Volume(double scalingFactor) { return 0.0000625 * scalingFactor * (double)VolumeRawExt; } + public Int32 FlipTime() { return Impedance; } + public decimal TimestampDec() { return (decimal)TimestampExt / (decimal)8192; } + public double VolumeDelta(double scalingFactor, OptoTelegramRaw previous) { return (previous == null) ? 0 : Volume(scalingFactor) - previous.Volume(scalingFactor); } + public decimal TimeDelta() { return TimestampDec() - TestStartTimestampDec; } + public string Label() + { + if (Flags == OptoTelegramFlags.OK_TestStart) return "#### start test ####"; + else if (Flags == OptoTelegramFlags.OK_TestEnd) return "#### end of test ####"; + else return string.Empty; + } + + + static OptoTelegramRaw() + { + culture = CultureInfo.CreateSpecificCulture("DE"); /// This is to use comma as decimal number separator + } + + public OptoTelegramRaw() + { + } + + /// + /// Parses optical telegram and returns OptoTelegramRaw object + /// + /// + /// Create a configuration structure from a complete byte array + /// + /// Telegram description: + /// + /// AAAAAA[tab]BBBB[tab]CCCC[tab]DDDDDD[tab]EEEE[tab]FFFFFFFF[tab]GG[cr][lf] (42 bytes) + /// + /// Data Comment Type Calculate to decimal + /// ---------------------------------------------------------------- + /// AAAAAA EMF Int24 Value * 0.000000333 + /// BBBB Magnetic field Int16 Value + /// CCCC Flow Int16 Value * 0.225 * Scalig factor + /// DDDDDD Volume Int24 Value / 16000 * Scaling factor + /// EEEE Impedance Int16 Value + /// FFFFFFFF Timestamp Uint32 Value / 8192 + /// GG Checksum Byte + /// ---------------------------------------------------------------- + /// + /// Example: + /// FFFFFE 51EA 0000 65324E 0087 F6319DFF 86 + /// FFDD3A 51F9 0000 65324E 0088 F631A60B 45 + /// ... + /// + /// A complete byte array data + /// true = telegram OK, false = telegram NOK + public bool UpdateFromString(string telegram, int counter, ref Int64 volumeRawExtLast, ref Int64 timestampExtLast) + { + DateTime = DateTime.Now; + Counter = counter; + RefFlow = (float)Sequences.ProcessData.RefFlow.Val; + + if ((telegram == null) || (telegram.Length < Length) || + (telegram[6] != '\t') || (telegram[11] != '\t') || (telegram[16] != '\t') || + (telegram[23] != '\t') || (telegram[28] != '\t') || (telegram[37] != '\t') || + (telegram[40] != '\r') || (telegram[41] != '\n')) + { + Flags = OptoTelegramFlags.InvalidTelegram; + return false; + } + + bool f1 = UInt32.TryParse(telegram.Substring(0, 6), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out EmfRaw); + bool f2 = Int16.TryParse(telegram.Substring(7, 4), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out MagneticFieldRaw); + bool f3 = Int16.TryParse(telegram.Substring(12, 4), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out FlowRaw); + bool f4 = UInt32.TryParse(telegram.Substring(17, 6), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out VolumeRaw); + bool f5 = Int16.TryParse(telegram.Substring(24, 4), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out Impedance); + bool f6 = UInt32.TryParse(telegram.Substring(29, 8), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out Timestamp); + bool f7 = byte.TryParse(telegram.Substring(38, 2), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out CheckSum); + + bool allOk = f1 && f2 && f3 && f4 && f5 && f6 && f7; + Flags = allOk ? OptoTelegramFlags.OK : OptoTelegramFlags.InvalidTelegram; + + /// + /// Cope with 'VolumeRaw' overflow + /// + Int64 uncorrected = (Int64)(((UInt64)volumeRawExtLast & 0xFFFFFFFFFF000000UL) | VolumeRaw); + if (Math.Abs(uncorrected - volumeRawExtLast) <= 0x800000L) + { + VolumeRawExt = volumeRawExtLast = uncorrected; + } + else if (Math.Abs(uncorrected + 0x1000000L - volumeRawExtLast) <= 0x800000L) + { + VolumeRawExt = volumeRawExtLast = uncorrected + 0x1000000L; + } + else if (Math.Abs(uncorrected - 0x1000000L - volumeRawExtLast) <= 0x800000L) + { + VolumeRawExt = volumeRawExtLast = uncorrected - 0x1000000L; + } + else + { + VolumeRawExt = volumeRawExtLast = uncorrected; + } + + /// + /// Cope with 'Timestamp' overflow + /// + uncorrected = (Int64)(((UInt64)timestampExtLast & 0xFFFFFFFF00000000UL) | Timestamp); + if (Math.Abs(uncorrected - timestampExtLast) <= 0x80000000L) + { + TimestampExt = timestampExtLast = uncorrected; + } + else if (Math.Abs(uncorrected + 0x100000000L - timestampExtLast) <= 0x80000000L) + { + TimestampExt = timestampExtLast = uncorrected + 0x100000000L; + } + else if (Math.Abs(uncorrected - 0x100000000L - timestampExtLast) <= 0x80000000L) + { + TimestampExt = timestampExtLast = uncorrected - 0x100000000L; + } + else + { + TimestampExt = timestampExtLast = uncorrected; + } + + return allOk; + } + + /// + /// Alternative to UpdateFromString(...) when data are flushed + /// + public bool UpdateFromStringDummy(string telegram) + { + DateTime = DateTime.Now; + RefFlow = (float)Sequences.ProcessData.RefFlow.Val; + + if ((telegram == null) || (telegram.Length < Length) || + (telegram[6] != '\t') || (telegram[11] != '\t') || (telegram[16] != '\t') || + (telegram[23] != '\t') || (telegram[28] != '\t') || (telegram[37] != '\t') || + (telegram[40] != '\r') || (telegram[41] != '\n')) + { + Flags = OptoTelegramFlags.InvalidTelegram; + return false; + } + + //bool f1 = UInt32.TryParse(telegram.Substring(0, 6), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out EmfRaw); + //bool f2 = Int16.TryParse(telegram.Substring(7, 4), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out MagneticFieldRaw); + //bool f3 = Int16.TryParse(telegram.Substring(12, 4), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out FlowRaw); + //bool f4 = UInt32.TryParse(telegram.Substring(17, 6), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out VolumeRaw); + //bool f5 = Int16.TryParse(telegram.Substring(24, 4), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out Impedance); + //bool f6 = UInt32.TryParse(telegram.Substring(29, 8), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out Timestamp); + //bool f7 = byte.TryParse(telegram.Substring(38, 2), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out CheckSum); + //return f1 && f2 && f3 && f4 && f5 && f6 && f7; + + return true; + } + + + public void SetFlags(OptoTelegramFlags flags) + { + this.Flags = flags; + } + + + public string ToString(double scalingFactor, OptoTelegramRaw previous) + { + if (Flags == OptoTelegramFlags.SyncError) + { + return "Sychronization error"; + } + else if (Flags == OptoTelegramFlags.InvalidTelegram) + { + return "Invalid telegram"; + } + else /// if (flags == OptoTelegramFlags.OK / OptoTelegramFlags.OK_TestStart / OptoTelegramFlags.OK_TestEnd) + { + return string.Format("{0}:{1}:{2}.{3}\t{4} :\t{5}\t{6}\t{7}\t{8}\t{9}\t{10}\t{11}\t{12}\t{13}\t{14}\t{15}\t{16}\t{17}\t{18}\t{19}\t{20}\t{21}\t{22}", + DateTime.Hour.ToString("D2"), + DateTime.Minute.ToString("D2"), + DateTime.Second.ToString("D2"), + DateTime.Millisecond.ToString("D4"), + Counter, + EmfRaw.ToString("X6"), + MagneticFieldRaw.ToString("X4"), + FlowRaw.ToString("X4"), + VolumeRaw.ToString("X6"), + Impedance.ToString("X4"), + Timestamp.ToString("X8"), + CheckSum.ToString("X2"), + EMF().ToString("F4", culture), + MagneticField().ToString("F0", culture), + Flow(scalingFactor).ToString("F2", culture), + Volume(scalingFactor).ToString("F4", culture), + FlipTime().ToString("F0", culture), + TimestampDec().ToString("F4", culture), + (RefFlow * 1000).ToString("F2", culture), + VolumeDelta(scalingFactor, previous).ToString("F4", culture), + TimeDelta().ToString("F3", culture), + scalingFactor.ToString("F1", culture), + Label()); + } + } + + /// + /// Filter RefFlow data in an array of OptoTelegramRaw objects by a FIR filter: + /// + /// kSize = 5, kSize2 = 2 + /// + /// i k + /// --------------------------------------------------------------------------- + /// 0 -5 filtered[0] = data[0] + /// 1 -4 filtered[1] = data[1] + /// 2 -3 filtered[2] = data[0]*k[0] + ... + data[4]*k[4] + /// 3 -2 filtered[3] = data[1]*k[0] + ... + data[5]*k[4] + /// 4 -1 filtered[4] = data[2]*k[0] + ... + data[6]*k[4] + /// 5 0 data[0] = filtered[0], filtered[0] = data[3]*k[0] + ... + data[7]*k[4] + /// 6 1 data[1] = filtered[1], filtered[1] = data[4]*k[0] + ... + data[8]*k[4] + /// 7 ... + /// + /// array of OptoTelegramRaw objects + /// number of objects to process + public static void FIRFilterFlow(OptoTelegramRaw[] optoData, int optoDataCount) + { + float[] kernel = new float[] { 0.1f, 0.2f, 0.4f, 0.2f, 0.1f }; + int kSize = kernel.Length; + int kSize2 = kernel.Length / 2; + + float[] filtered = new float[kSize]; + + for (int i = 0; i < optoDataCount; i++) + { + int k = i - kSize; + if (k >= 0) optoData[k].RefFlow = filtered[i % kSize]; + + if (i < kSize2 || i >= optoDataCount - kSize2) + { + filtered[i % kSize] = optoData[i].RefFlow; + } + else + { + float weoightedSum = 0; + for (int j = -kSize2; j <= kSize2; j++) + weoightedSum += optoData[i + j].RefFlow * kernel[j + kSize2]; + + filtered[i % kSize] = weoightedSum; + } + } + + for (int k = optoDataCount - kSize; k < optoDataCount; k++) + { + if (k >= 0) optoData[k].RefFlow = filtered[k % kSize]; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/ProcParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/ProcParams.cs new file mode 100644 index 00000000..3b89e086 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/ProcParams.cs @@ -0,0 +1,181 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + public class ProcParams : ProcedureParamsBase, IParamsProvider, IProcedureParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcParams) })[0]; + protected override XmlSerializer GetSerializer() { return Serializer; } + + public MeterType MeterType; + public float CalibTarget; /// Target error after calibration in [%] + public int FactorLimitLo; /// Lower limit for the calibration factor + public int FactorLimitHi; /// Upper limit for the calibration factor +#if ORACLE_DB + public int WMType_ID; /// Required for Oracle DB: ID_WZTyp in table VT_PRUEFPUNKT_SOLL_SD + public int WMType_Rev; /// Required for Oracle DB: Rev_WZTyp in table VT_PRUEFPUNKT_SOLL_SD +#endif + + + public override void InitializeAll() + { + MeterType = MeterType.AutoDetect; + CalibTarget = 0; + FactorLimitLo = 1000; + FactorLimitHi = 8000; +#if ORACLE_DB + WMType_ID = 2; /// Value for iPerl DN15 + WMType_Rev = 1; /// Value for iPerl DN15 +#endif + } + + string[] paramNames = new string[] + { + "iPerl type", + "Calib. target [%]", + "Calib. factor Lo", + "Calib. factor Hi", +#if ORACLE_DB + "WMType ID", + "WMType Rev.", +#endif + }; + public override string ParamName(int i) { return paramNames[i]; } + public override int ParamsCount() { return paramNames.Length; } + + public override string ToString(int i) + { + switch (i) + { + case 0: return MeterType.ToString(); + case 1: return CalibTarget.ToString(); + case 2: return FactorLimitLo.ToString(); + case 3: return FactorLimitHi.ToString(); +#if ORACLE_DB + case 4: return WMType_ID.ToString(); + case 5: return WMType_Rev.ToString(); +#endif + default: return string.Empty; + } + } + + public void UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: + for (MeterType mt = 0; mt < MeterType.Count; mt++) + { + if (mt.ToString().Equals(strValue)) { MeterType = mt; return; } + } + break; + case 1: CalibTarget = Utils.ParseSFloat(strValue); return; + case 2: FactorLimitLo = int.Parse(strValue); return; + case 3: FactorLimitHi = int.Parse(strValue); return; +#if ORACLE_DB + case 4: WMType_ID = int.Parse(strValue); return; + case 5: WMType_Rev = int.Parse(strValue); return; +#endif + default: return; + } + } + + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + + int iDummy; + float fDummy; + + switch (i) + { + case 0: + for (MeterType mt = 0; mt < MeterType.Count; mt++) if (mt.ToString().Equals(strValue)) return true; + break; + case 1: + if (Utils.TryParseSFloat(strValue, out fDummy) && fDummy >= -10.0f && fDummy <= 10.0f) return true; + break; + case 2: + case 3: + if (int.TryParse(strValue, out iDummy) && iDummy >= 1000 && iDummy <= 8000) return true; + break; + +#if ORACLE_DB + case 4: /// WMType_ID + case 5: /// WMType_Rev + if (int.TryParse(strValue, out iDummy)) return true; + break; +#endif + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(ProcParams prms) + { + prms.MeterType = this.MeterType; + prms.CalibTarget = this.CalibTarget; + prms.FactorLimitLo = this.FactorLimitLo; + prms.FactorLimitHi = this.FactorLimitHi; +#if ORACLE_DB + prms.WMType_ID = this.WMType_ID; + prms.WMType_Rev = this.WMType_Rev; +#endif + } + + public IParamsProvider Clone() + { + ProcParams pars = new ProcParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateProcedureParams(ComponentProcedure dbEntity) + { + if (dbEntity == null) return; + try + { + ProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcParams; + + procedureParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + procedure = dbEntity.Procedure; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + + public ProcParams() + { + } + + public ProcParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public ProcParams(ComponentProcedure procParamsEntity, string componentName, Procedure procedure) + { + this.procedureParamsEntity = procParamsEntity; + this.componentName = componentName; + this.procedure = procedure; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/StatusStruct.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/StatusStruct.cs new file mode 100644 index 00000000..f9f91757 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication/GenesisHead/StatusStruct.cs @@ -0,0 +1,160 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; + +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + public class StatusStruct + { + public static readonly int Length = 48; + + public Byte Version; + public FlowState FlowState; + public UInt32 BillingVolume; + public UInt32 ForwardVolume; + public UInt32 ReverseVolume; + public UInt32 SecondsActive; + public UInt32 SecondsIdle; + public UInt32 SecondsUsed; + public UInt32 UTC; + public Int32 ScaledAvgFlowRate; + public UInt16 PeakFlowRate; + public UInt16 AlarmState; + public byte RebootCount; + public byte[] AlarmCount; + public UInt16 FlipTime; + + + public StatusStruct() + { + AlarmCount = new byte[7]; + } + + public byte[] ToByteArray() + { + byte[] result = new byte[Length]; + + result[0] = Version; + result[1] = (byte)FlowState; + + result[2] = (byte)(BillingVolume & 0x000000FF); + result[3] = (byte)((BillingVolume >> 8) & 0x000000FF); + result[4] = (byte)((BillingVolume >> 16) & 0x000000FF); + result[5] = (byte)((BillingVolume >> 24) & 0x000000FF); + + result[6] = (byte)(ForwardVolume & 0x000000FF); + result[7] = (byte)((ForwardVolume >> 8) & 0x000000FF); + result[8] = (byte)((ForwardVolume >> 16) & 0x000000FF); + result[9] = (byte)((ForwardVolume >> 24) & 0x000000FF); + + result[10] = (byte)(ReverseVolume & 0x000000FF); + result[11] = (byte)((ReverseVolume >> 8) & 0x000000FF); + result[12] = (byte)((ReverseVolume >> 16) & 0x000000FF); + result[13] = (byte)((ReverseVolume >> 24) & 0x000000FF); + + result[14] = (byte)(SecondsActive & 0x000000FF); + result[15] = (byte)((SecondsActive >> 8) & 0x000000FF); + result[16] = (byte)((SecondsActive >> 16) & 0x000000FF); + result[17] = (byte)((SecondsActive >> 24) & 0x000000FF); + + result[18] = (byte)(SecondsIdle & 0x000000FF); + result[19] = (byte)((SecondsIdle >> 8) & 0x000000FF); + result[20] = (byte)((SecondsIdle >> 16) & 0x000000FF); + result[21] = (byte)((SecondsIdle >> 24) & 0x000000FF); + + result[22] = (byte)(SecondsUsed & 0x000000FF); + result[23] = (byte)((SecondsUsed >> 8) & 0x000000FF); + result[24] = (byte)((SecondsUsed >> 16) & 0x000000FF); + result[25] = (byte)((SecondsUsed >> 24) & 0x000000FF); + + result[26] = (byte)(UTC & 0x000000FF); + result[27] = (byte)((UTC >> 8) & 0x000000FF); + result[28] = (byte)((UTC >> 16) & 0x000000FF); + result[29] = (byte)((UTC >> 24) & 0x000000FF); + + result[30] = (byte)(ScaledAvgFlowRate & 0x000000FF); + result[31] = (byte)((ScaledAvgFlowRate >> 8) & 0x000000FF); + result[32] = (byte)((ScaledAvgFlowRate >> 16) & 0x000000FF); + result[33] = (byte)((ScaledAvgFlowRate >> 24) & 0x000000FF); /// TODO: test with negative value + + result[34] = (byte)(PeakFlowRate & 0x00FF); + result[35] = (byte)((PeakFlowRate >> 8) & 0x00FF); + + result[36] = (byte)(AlarmState & 0x00FF); + result[37] = (byte)((AlarmState >> 8) & 0x00FF); + + result[38] = RebootCount; + + result[39] = AlarmCount[0]; + result[40] = AlarmCount[1]; + result[41] = AlarmCount[2]; + result[42] = AlarmCount[3]; + result[43] = AlarmCount[4]; + result[44] = AlarmCount[5]; + result[45] = AlarmCount[6]; + + result[46] = (byte)(FlipTime & 0x00FF); + result[47] = (byte)((FlipTime >> 8) & 0x00FF); + + return result; + } + + public static StatusStruct FromByteArray(byte[] data) + { + if (data.Length != Length) return null; + + StatusStruct result = new StatusStruct(); + + result.Version = data[0]; + result.FlowState = (FlowState)data[1]; + result.BillingVolume = (((UInt32)data[5] * 256 + data[4]) * 256 + data[3]) * 256 + data[2]; + result.ForwardVolume = (((UInt32)data[9] * 256 + data[8]) * 256 + data[7]) * 256 + data[6]; + result.ReverseVolume = (((UInt32)data[13] * 256 + data[12]) * 256 + data[11]) * 256 + data[10]; + result.SecondsActive = (((UInt32)data[17] * 256 + data[16]) * 256 + data[15]) * 256 + data[14]; + result.SecondsIdle = (((UInt32)data[21] * 256 + data[20]) * 256 + data[19]) * 256 + data[18]; + result.SecondsUsed = (((UInt32)data[25] * 256 + data[24]) * 256 + data[23]) * 256 + data[22]; + result.UTC = (((UInt32)data[29] * 256 + data[28]) * 256 + data[27]) * 256 + data[26]; + result.ScaledAvgFlowRate = (((Int32)data[33] * 256 + data[32]) * 256 + data[31]) * 256 + data[30]; /// TODO: test with negative value + result.PeakFlowRate = (UInt16)(data[34] + 256 * data[35]); + result.AlarmState = (UInt16)(data[36] + 256 * data[37]); + result.RebootCount = data[38]; + result.AlarmCount[0] = data[39]; + result.AlarmCount[1] = data[40]; + result.AlarmCount[2] = data[41]; + result.AlarmCount[3] = data[42]; + result.AlarmCount[4] = data[43]; + result.AlarmCount[5] = data[44]; + result.AlarmCount[6] = data[45]; + result.FlipTime = (UInt16)(data[46] * 256 + data[47]); + + return result; + } + + public override string ToString() + { + return string.Format("Status: V{0} Flow={1} BillVol={2} ForwVol={3} RevVol={4} SecActive={5}s SecIdle={6}s SecUsed={7}s UTC={8} AvgFlowRate={9} PeekFlowRate={10} AlarmState={11} RebootCount={12} A0={13} A1={14} A2={15} A3={16} A4={17} A5={18} A6={19} FlipTime={20}", + Version, + FlowState, + BillingVolume, + ForwardVolume, + ReverseVolume, + SecondsActive, + SecondsIdle, + SecondsUsed, + UTC, + ScaledAvgFlowRate, + PeakFlowRate, + AlarmState, + RebootCount, + AlarmCount[0], + AlarmCount[1], + AlarmCount[2], + AlarmCount[3], + AlarmCount[4], + AlarmCount[5], + AlarmCount[6], + FlipTime); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/CalibrationStruct.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/CalibrationStruct.cs new file mode 100644 index 00000000..6670d335 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/CalibrationStruct.cs @@ -0,0 +1,197 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; + +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + public class CalibrationStruct + { + public static readonly int Length = 35; + + public Byte Version; + public MeterType MeterType; + public UInt16 Calibration; + public VolumeUnits VolumeUnits; + public FlowArrow FlowArrow; + public UInt16 FWVersion; + public UInt16[] TargetField; + public UInt16 RecipMeanCurrent; + public UInt16 ThresholdVolume; + public UInt16 ThresholdTime; + public UInt16 FlowActivationThr; + public UInt16 VolumeArrowThr; + public UInt32 CalibrationTime; + public ulong SerialNumber; + public MeterSealed MeterSealed; + public byte CheckSum; + + + public CalibrationStruct() + { + TargetField = new UInt16[3]; + } + + public byte[] ToByteArray() + { + byte[] result = new byte[Length]; + + result[0] = Version; + result[1] = (byte)MeterType; + + result[2] = (byte)(Calibration & 0x00FF); + result[3] = (byte)((Calibration >> 8) & 0x00FF); + + result[4] = (byte)VolumeUnits; + + result[5] = (byte)FlowArrow; + + result[6] = (byte)(FWVersion & 0x00FF); + result[7] = (byte)((FWVersion >> 8) & 0x00FF); + + result[8] = (byte)( TargetField[0] & 0x00FF); + result[9] = (byte)((TargetField[0] >> 8) & 0x00FF); + result[10] = (byte)( TargetField[1] & 0x00FF); + result[11] = (byte)((TargetField[1] >> 8) & 0x00FF); + result[12] = (byte)( TargetField[2] & 0x00FF); + result[13] = (byte)((TargetField[2] >> 8) & 0x00FF); + + result[14] = (byte)(RecipMeanCurrent & 0x00FF); + result[15] = (byte)((RecipMeanCurrent >> 8) & 0x00FF); + + result[16] = (byte)(ThresholdVolume & 0x00FF); + result[17] = (byte)((ThresholdVolume >> 8) & 0x00FF); + + result[18] = (byte)(ThresholdTime & 0x00FF); + result[19] = (byte)((ThresholdTime >> 8) & 0x00FF); + + result[20] = (byte)(FlowActivationThr & 0x00FF); + result[21] = (byte)((FlowActivationThr >> 8) & 0x00FF); + + result[22] = (byte)(VolumeArrowThr & 0x00FF); + result[23] = (byte)((VolumeArrowThr >> 8) & 0x00FF); + + result[24] = (byte)(CalibrationTime & 0x000000FF); + result[25] = (byte)((CalibrationTime >> 8) & 0x000000FF); + result[26] = (byte)((CalibrationTime >> 16) & 0x000000FF); + result[27] = (byte)((CalibrationTime >> 24) & 0x000000FF); + + result[28] = (byte)(SerialNumber & 0x00000000000000FF); + result[29] = (byte)((SerialNumber >> 8) & 0x00000000000000FF); + result[30] = (byte)((SerialNumber >> 16) & 0x00000000000000FF); + result[31] = (byte)((SerialNumber >> 24) & 0x00000000000000FF); + result[32] = (byte)((SerialNumber >> 32) & 0x00000000000000FF); + + result[33] = (byte)MeterSealed; + result[34] = CheckSum; + + return result; + } + + /// + /// Create a calibration structure from a complete byte array + /// + /// A complete byte array data + /// CalibrationStruct or null when byte array was not complete + public static CalibrationStruct FromByteArray(byte[] data) + { + if (data.Length != Length) return null; + + CalibrationStruct result = new CalibrationStruct(); + + result.Version = data[0]; + result.MeterType = (MeterType)data[1]; + result.Calibration = (UInt16)(data[2] + 256 * data[3]); + result.VolumeUnits = (VolumeUnits)data[4]; + result.FlowArrow = (FlowArrow)data[5]; + result.FWVersion = (UInt16)(data[6] + 256 * data[7]); + result.TargetField[0] = (UInt16)(data[8] + 256 * data[9]); + result.TargetField[1] = (UInt16)(data[10] + 256 * data[11]); + result.TargetField[2] = (UInt16)(data[12] + 256 * data[13]); + result.RecipMeanCurrent = (UInt16)(data[14] + 256 * data[15]); + result.ThresholdVolume = (UInt16)(data[16] + 256 * data[17]); + result.ThresholdTime = (UInt16)(data[18] + 256 * data[19]); + result.FlowActivationThr = (UInt16)(data[20] + 256 * data[21]); + result.VolumeArrowThr = (UInt16)(data[22] + 256 * data[23]); + result.CalibrationTime = (((UInt32)data[27] * 256 + data[26]) * 256 + data[25]) * 256 + data[24]; + result.SerialNumber = ((((UInt64)data[32] * 256 + data[31]) * 256 + data[30]) * 256 + data[29]) * 256 + data[28]; + result.MeterSealed = (MeterSealed)data[33]; + result.CheckSum = data[34]; + + return result; + } + + /// + /// Update the calibration structure from an incomplete byte array + /// + /// Byte array data + /// Offset of byte array data in CalibrationStruct + /// true when successful, false when data are not appropriate + public bool Update(byte[] data, int offset) + { + if (offset == 2 && data.Length == 2) + { + /// Data containing iPerl calibration factor + Calibration = (UInt16)(data[2 - offset] + 256 * data[3 - offset]); + return true; + } + else if (offset == 0 && data.Length == Length) + { + /// Data containing a complete CalibrationStruct + Version = data[0]; + MeterType = (MeterType)data[1]; + Calibration = (UInt16)(data[2] + 256 * data[3]); + VolumeUnits = (VolumeUnits)data[4]; + FlowArrow = (FlowArrow)data[5]; + FWVersion = (UInt16)(data[6] + 256 * data[7]); + TargetField[0] = (UInt16)(data[8] + 256 * data[9]); + TargetField[1] = (UInt16)(data[10] + 256 * data[11]); + TargetField[2] = (UInt16)(data[12] + 256 * data[13]); + RecipMeanCurrent = (UInt16)(data[14] + 256 * data[15]); + ThresholdVolume = (UInt16)(data[16] + 256 * data[17]); + ThresholdTime = (UInt16)(data[18] + 256 * data[19]); + FlowActivationThr = (UInt16)(data[20] + 256 * data[21]); + VolumeArrowThr = (UInt16)(data[22] + 256 * data[23]); + CalibrationTime = (((UInt32)data[27] * 256 + data[26]) * 256 + data[25]) * 256 + data[24]; + SerialNumber = ((((UInt64)data[32] * 256 + data[31]) * 256 + data[30]) * 256 + data[29]) * 256 + data[28]; + MeterSealed = (MeterSealed)data[33]; + CheckSum = data[34]; + return true; + } + else + return false; + } + + public string FWVersionStr() + { + int d1 = (FWVersion >> 8) & 0x000F; + int d2 = (FWVersion >> 12) & 0x000F; + int d3 = (FWVersion >> 4) & 0x000F; + int d4 = FWVersion & 0x000F; + return string.Format("{0}.{1}{2}{3}", d1, d2, d3, d4); + } + + public override string ToString() + { + return string.Format("Calibration: V{0} Type={1} Cal={2} Units={3} FlowArrow.{4} FW={5} Hi={6} Norm={7} Low={8} RMC={9} ThrVol={10} ThrTime={11} FlActThr={12} VolArrThr={13} CalTm={14} SN={15} MeterSealed={16} Chksum={17}", + Version, + MeterType, + Calibration, + VolumeUnits, + FlowArrow, + FWVersion, + TargetField[0], + TargetField[1], + TargetField[2], + RecipMeanCurrent, + ThresholdVolume, + ThresholdTime, + FlowActivationThr, + VolumeArrowThr, + CalibrationTime, + SerialNumber, + MeterSealed, + CheckSum.ToString("X2")); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/ConfigStruct.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/ConfigStruct.cs new file mode 100644 index 00000000..1275f745 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/ConfigStruct.cs @@ -0,0 +1,225 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; + +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + public class ConfigStruct + { + public const int Length = 32; + + public Byte Version; /// 0: 1 byte + public MeterState MeterState; /// 1: 1 byte + public UInt32 TargetTimeVeryLowBatt; /// 2: 4 bytes in seconds + public UInt32 TargetTimeLowBatt; /// 6: 4 bytes, in seconds + public UInt32 TestModeTime; /// 10: 4 bytes, Max. test mode time in seconds + public UInt16 EmptyPipeThreshold; /// 14: 2 bytes + public byte[] PCBNumber; /// 16: 5 bytes + public byte TestModeConfig; /// 21: 1 byte + public UInt32 RadioAddress; /// 22: 4 bytes + public UInt16 TempCalibration; /// 26: 2 bytes + public UInt16 AlarmMask; /// 28: 2 bytes, Default 0xA3F7 + public UInt16 ConfigCheckSum; /// 30: 2 bytes + + public ConfigStruct() + { + PCBNumber = new byte[5]; + } + + public byte[] ToByteArray() + { + byte[] result = new byte[Length]; + + result[0] = Version; + result[1] = (byte)MeterState; + + result[2] = (byte)(TargetTimeVeryLowBatt & 0x000000FF); + result[3] = (byte)((TargetTimeVeryLowBatt >> 8) & 0x000000FF); + result[4] = (byte)((TargetTimeVeryLowBatt >> 16) & 0x000000FF); + result[5] = (byte)((TargetTimeVeryLowBatt >> 24) & 0x000000FF); + + result[6] = (byte)(TargetTimeLowBatt & 0x000000FF); + result[7] = (byte)((TargetTimeLowBatt >> 8) & 0x000000FF); + result[8] = (byte)((TargetTimeLowBatt >> 16) & 0x000000FF); + result[9] = (byte)((TargetTimeLowBatt >> 24) & 0x000000FF); + + result[10] = (byte)(TestModeTime & 0x000000FF); + result[11] = (byte)((TestModeTime >> 8) & 0x000000FF); + result[12] = (byte)((TestModeTime >> 16) & 0x000000FF); + result[13] = (byte)((TestModeTime >> 24) & 0x000000FF); + + result[14] = (byte)(EmptyPipeThreshold & 0x00FF); + result[15] = (byte)((EmptyPipeThreshold >> 8) & 0x00FF); + + result[16] = PCBNumber[0]; + result[17] = PCBNumber[1]; + result[18] = PCBNumber[2]; + result[19] = PCBNumber[3]; + result[20] = PCBNumber[4]; + + result[21] = TestModeConfig; + + result[22] = (byte)(RadioAddress & 0x000000FF); + result[23] = (byte)((RadioAddress >> 8) & 0x000000FF); + result[24] = (byte)((RadioAddress >> 16) & 0x000000FF); + result[25] = (byte)((RadioAddress >> 24) & 0x000000FF); + + result[26] = (byte)(TempCalibration & 0x00FF); + result[27] = (byte)((TempCalibration >> 8) & 0x00FF); + + result[28] = (byte)(AlarmMask & 0x00FF); + result[29] = (byte)((AlarmMask >> 8) & 0x00FF); + + result[30] = (byte)(ConfigCheckSum & 0x00FF); + result[31] = (byte)((ConfigCheckSum >> 8) & 0x00FF); + + return result; + } + + /// + /// Create a configuration structure from a complete byte array + /// + /// A complete byte array data + /// ConfigStruct or null when byte array was not complete + public static ConfigStruct FromByteArray(byte[] data) + { + if (data.Length != Length) return null; + + ConfigStruct result = new ConfigStruct(); + + result.Version = data[0]; + result.MeterState = (MeterState)data[1]; + result.TargetTimeVeryLowBatt = (((UInt32)data[5] * 256 + data[4]) * 256 + data[3]) * 256 + data[2]; + result.TargetTimeLowBatt = (((UInt32)data[9] * 256 + data[8]) * 256 + data[7]) * 256 + data[6]; + result.TestModeTime = (((UInt32)data[13] * 256 + data[12]) * 256 + data[11]) * 256 + data[10]; + result.EmptyPipeThreshold = (UInt16)(data[15] * 256 + data[14]); + result.PCBNumber[0] = data[16]; + result.PCBNumber[1] = data[17]; + result.PCBNumber[2] = data[18]; + result.PCBNumber[3] = data[19]; + result.PCBNumber[4] = data[20]; + result.TestModeConfig = data[21]; + result.RadioAddress = (((UInt32)data[25] * 256 + data[24]) * 256 + data[23]) * 256 + data[22]; + result.TempCalibration = (UInt16)(data[27] * 256 + data[26]); + result.AlarmMask = (UInt16)(data[29] * 256 + data[28]); + result.ConfigCheckSum = (UInt16)(data[31] * 256 + data[30]); + + return result; + } + + /// + /// Update the configuration structure from an incomplete byte array + /// + /// Offset of byte array data in ConfigStruct + /// Byte array data + /// true when successful, false when data are not appropriate + public bool Update(int offset, byte[] data) + { + if (offset == 0 && data.Length == 2) + { + /// iPerl mode of function + Version = data[0]; + MeterState = (MeterState)data[1]; + return true; + } + else if (offset == 0 && data.Length == 4) + { + /// iPerl mode of function and extra 2 bytes + Version = data[0]; + MeterState = (MeterState)data[1]; + return true; + } + else if (offset == 21 && data.Length == 1) + { + /// TestModeConfig value + TestModeConfig = data[21 - offset]; + return true; + } + else if (offset == 0 && data.Length == Length) + { + /// Complete ConfigStruct + Version = data[0]; + MeterState = (MeterState)data[1]; + TargetTimeVeryLowBatt = (((UInt32)data[5] * 256 + data[4]) * 256 + data[3]) * 256 + data[2]; + TargetTimeLowBatt = (((UInt32)data[9] * 256 + data[8]) * 256 + data[7]) * 256 + data[6]; + TestModeTime = (((UInt32)data[13] * 256 + data[12]) * 256 + data[11]) * 256 + data[10]; + EmptyPipeThreshold = (UInt16)(data[15] * 256 + data[14]); + PCBNumber[0] = data[16]; + PCBNumber[1] = data[17]; + PCBNumber[2] = data[18]; + PCBNumber[3] = data[19]; + PCBNumber[4] = data[20]; + TestModeConfig = data[21]; + RadioAddress = (((UInt32)data[25] * 256 + data[24]) * 256 + data[23]) * 256 + data[22]; + TempCalibration = (UInt16)(data[27] * 256 + data[26]); + AlarmMask = (UInt16)(data[29] * 256 + data[28]); + ConfigCheckSum = (UInt16)(data[31] * 256 + data[30]); + return true; + } + else + return false; + } + + /// + /// Returns PCB number string (12 characters, 12 decimal digits) + /// + /// PCB number STRING + public string GetPcbNrString() + { + return PCBNumber2String(this.PCBNumber); + } + + /// + /// Converts PCBNumber to string (12 characters, 12 decimal digits) + /// + /// + /// PCB number string + public static string PCBNumber2String(byte[] pcbNumber) + { + if (pcbNumber.Length != 5) return string.Empty; + + Int64 number = 0; + for (int i = 4; i >= 0; i--) + { + number = 256 * number + (Int64)pcbNumber[i]; + } + + return number.ToString(); + } + + public override string ToString() + { + return string.Format("Config: V{0} State={1} VLoBattT={2}s LoBattT={3}s TestModeT={4}s EPThld={5} PCB#={6} TMCfg={7} RadioAddr={8} TempCalib={9} AlarmMask={10} CfgCheckSum={11}", + Version, + MeterState, + TargetTimeVeryLowBatt, + TargetTimeLowBatt, + TestModeTime, + EmptyPipeThreshold, + GetPcbNrString(), + TestModeConfig.ToString("X2"), + RadioAddress, + TempCalibration, + AlarmMask.ToString("X4"), + ConfigCheckSum.ToString("X4")); + } + + public string ToString(int sel) + { + return string.Format("{1} PCB#={6} TMCfg={7}", + Version, + MeterState, + TargetTimeVeryLowBatt, + TargetTimeLowBatt, + TestModeTime, + EmptyPipeThreshold, + GetPcbNrString(), + TestModeConfig.ToString("X2"), + RadioAddress, + TempCalibration, + AlarmMask.ToString("X4"), + ConfigCheckSum.ToString("X4")); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/Enums.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/Enums.cs new file mode 100644 index 00000000..20317d8e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/Enums.cs @@ -0,0 +1,110 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + public enum MessageID + { + Calibration = 0x00, /// Access to stCalibration + Configuration = 0x01, /// Access to stConfig + Status = 0x02, /// Access to stStaus, read only + Power = 0x03, /// Access to stPower, containing power info from both processors + LCD = 0x04, /// Access to stLCD + EventData = 0x05, /// NOT USED + IntervalData = 0x06, /// NOT USED + Diagnostics = 0x07, /// Access tostMetroDiagArray, read onl + MetrologyMemory = 0x08, /// Memory block access, read only + Error_LongAck = 0x09, /// Error message + Command = 0x0A, /// Command to execute, with no arguments + Parameterizing = 0x0B, /// Parameterizing message is used in MCI-SPI interface only + Error_ShortAck = 0x0C, /// Short acknowledge message is used in MCI-SPI interface only + ChanelAlive = 0x0D, /// Channel alive message is used in MCI-SPI interface only + RadioPassthrough = 0x0E, /// RFID <-> Metrology <-> Radio passthrough message + ASICRegisterReadTest = 0x0F, /// ASIC Register read test + IMIDebugMessagesAccess = 0x10, /// IMI debug messages read test + ProductionChecksumsRead = 0x11, /// Production checksum read: Calibration (1 byte), Configuration (2 bytes), spare (4 bytes) + HardwareParametersTest = 0x12, /// Hardware Parameters Testing: User configurable fixed field drive time (1 byte) + /// + /// Notes: + /// 1. Short Ack message contains 1-byte error code and all the fields (Offset, Payload length, payload and password) will not be present. + /// 2. Channel Alive message does not contain the fields (Offset, Payload length, payload and password). + /// 3. Except the above two special messages, rest all the messages in the above table will follow the message format mentioned in sections 3.1 and 3.2. + /// + Count /// Number of MessageID-s + } + + public enum MeterType : byte + { + DN15 = 0, + CoaxManifold = 1, + DN20 = 2, + DN25 = 3, + DN26 = 4, /// DN25* + DN32 = 5, + DN40 = 6, + AutoDetect, + Count /// Number of meter types + } + + public enum VolumeUnits : byte + { + m3 = 0, + UK_gallon = 1, + US_gallon = 2, + Count /// Number of volume units + } + + public enum FlowArrow : byte + { + No = 0, + Right = 1, + Left = 2, + Count /// Number of flow arrows + } + + public enum MeterSealed : byte + { + InProduction = 0x00, + OutOfProduction = 0xA5, + Sealed = 0x5A, + } + + public enum MeterState : byte + { + None = 0, + Idle = 1, + Active = 2, + Test = 3, + EndOfLife = 4, + Count /// Number of meter states + } + + public enum FlowState : byte + { + No = 0, + Reverse = 1, + Forward = 2, + EmptyPipe = 3, + Count /// Number of flow states + } + + public enum OptoTelegramFlags : byte + { + OK = 0, + OK_TestStart, + OK_TestEnd, + InvalidTelegram, /// Wrong telegram format of checksum error + SyncError, + } + + public enum OptoState + { + Read, + Flush, + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/Factory.cs new file mode 100644 index 00000000..e37e88eb --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return "RegisterReader for Genesis"; } } + + public void ResetStaticProperties() { GenesisHead.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new GenesisHead(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new GenesisHead(cfg); } + + public IComponentCfg DefaultConfig() { return new GenesisHeadCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(GenesisHeadCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/GenesisHead.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/GenesisHead.cs new file mode 100644 index 00000000..4c0a25e6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/GenesisHead.cs @@ -0,0 +1,547 @@ +/// +/// Copyright (c) 2015-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.IO.Ports; +using System.Threading; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.BenchControl; +using TBF.BenchControl.Generic; +using TBF.Resources; +using Xylem.Common.Hardware.WaterMeter; +using Xylem.Common.Hardware.WaterMeter.Genesis; +using TBF.BenchControl.GenericDevices; + +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + public static class GenesisHeadBatch + { + public static readonly Lazy BatchHolder = new Lazy(() => + { + return new MeterBatch(); + }); + + internal static bool Start(IRegisterReader[] registerReaders, string[] lastSNTexts) + { + int index = 0; + var ret = false; + foreach (var rr in registerReaders) + { + if (rr is TestMethods.GenesisCommunication.GenesisHead.GenesisHead) + { + if (!string.IsNullOrEmpty(lastSNTexts[index])) + { + var myGenesis = ((TestMethods.GenesisCommunication.GenesisHead.GenesisHead)rr).SetUp(); + ret = true; + } + } + index = index + 1; + } + + return ret; + } + } + /// + /// This component = instance of this class is a placeholder for a combined main watermeter + /// + public class GenesisHead : ComponentBase, IDevice, GenericDevices.IRegisterReader, IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(GenesisHead)); + public override string ToString() { return string.Format("Genesis({0})", Cfg.ToString(1)); } + + + readonly GenesisHeadCfg genesisHeadCfg; + public int SlotNr { get { return genesisHeadCfg.SlotNr; } } + public double PulsesPerLtr { get { return 1000.0; } } + public double LtrsPerPulse { get { return 1 / PulsesPerLtr; } } + +#if ORACLE_DB + public int WMType_ID { get { return iperlHeadCfg.ProcParams.WMType_ID; } } /// Required by Oracle DB + public int WMType_Rev { get { return iperlHeadCfg.ProcParams.WMType_Rev; } } /// Required by Oracle DB +#endif + public float CalibTarget { get { return (ushort)genesisHeadCfg.ProcParams.CalibTarget; } } + public ushort FactorLimitLo { get { return (ushort)genesisHeadCfg.ProcParams.FactorLimitLo; } } + public ushort FactorLimitHi { get { return (ushort)genesisHeadCfg.ProcParams.FactorLimitHi; } } + + /// Properties set by the Begin and the End form + //todo rd implement + public string SerialNr; + + + public string EndState + { + get { return endState; } + set { endState = value; } + } + string endState; + + public string BeginState + { + get { return beginState; } + set { beginState = value; } + } + string beginState; + + public bool Disabled + { + get { return disabled; } + set { disabled = value; } + } + bool disabled; + + public bool CommFailed + { + get { return commFailed; } + set { commFailed = value; } + } + bool commFailed; + + public int ResultCode + { + get { return resultCode; } + } + int resultCode; + + + /// ConfigStruct of the water meter obtained or updated by iPerlCommunication + public ConfigStruct ConfigStruct + { + get { return configStruct; } + set { configStruct = value; } + } + ConfigStruct configStruct; + + /// CalibrationStruct of the water meter obtained or updated by iPerlCommunication + public CalibrationStruct CalibrationStruct + { + get { return calibrationStruct; } + set { calibrationStruct = value; } + } + CalibrationStruct calibrationStruct; + + public ushort OrigCalibFactor; + public ushort CalibFactor { get { return (CalibrationStruct != null) ? CalibrationStruct.Calibration : (ushort)0; } } + + public double Q2ErrWOCorrection; + public bool Q2CorrectionDone; + public double Q2Correction; + public int Q2CorrRFlow; + public int Q2CorrLFlow; + + public double Diff2Hz8Hz; + public bool Hz2CorrectionDone; + public int Hz2Correction; + + public string FWVersion { get { return (CalibrationStruct != null) ? CalibrationStruct.FWVersionStr() : string.Empty; } } + + + /// Result of the last test used to calculate Q2 correction factors, etc + public Results.Entities.MeterTestRslt LastTestResult2; + public Results.Entities.MeterTestRslt LastTestResult; + public double NominalTestFlowLph; /// in liter per hour + + + /// + /// Required for IRegisterReader interface + /// + public int WMPulses { get { return wmPulses; } } + public int WMRefPulses { get { return wmRefPulses; } } + public double WMVolume { get { return wmVolume; } } + public double BeginWMState { get { return beginWMState; } } + public double EndWMState { get { return endWMState; } } + public double WMTestTime { get { return wmTestTime; } } + + + double beginWMState; + double endWMState; + double wmVolume; + int wmPulses; + int wmRefPulses; + double wmTestTime; + + + /// Name set by the test, to be used as a part of the opto-data log file name + public string TestName; + + /// Name set by the test, to be used as a part of the opto-data log file name + public string BenchName; + + /// + /// Volume of water from the opto telegram + /// + private Int64 lastVolumeRaw; /// Last read raw volume + private double volumeLtr; /// + private double volumeLtr0; + + + /// + /// Timestamp from the opto telegram + /// + private double timestampSec; + private double timestampSec0; + + public bool NoSamples { get { return (timestampSecEnd - timestampSecStart) < float.Epsilon; } } + public double TimestampSecStart { get { return timestampSecStart; } } + public double TimestampSecEnd { get { return timestampSecEnd; } } + double timestampSecStart; + double timestampSecEnd; + + public GenesisHead() + { + } + + public GenesisHead(Generic.IComponentCfg cfg) + : base(cfg) + { + ClearData(); + + genesisHeadCfg = cfg as GenesisHeadCfg; + + log.Debug(this.ToString()); + } + + + GenesisMeter myGenesis = null; + + + + + + public GenesisMeter SetUp() + { + if (myGenesis != null) + { + myGenesis.DisposeMeter(); + } + //add for gen + + myGenesis = new GenesisMeter(); + myGenesis.SetupFromConfigFile(SlotNr); + + GenesisHeadBatch.BatchHolder.Value.AddMeter(myGenesis); + myGenesis.LogRawData(true); + return myGenesis; + } + + /// + /// Clear data related to a specific water meter + /// + public void ClearData() + { + resultCode = 0; + + disabled = false; + commFailed = false; + endState = string.Empty; + beginState = string.Empty; + + configStruct = null; + calibrationStruct = null; + + LastTestResult = null; + NominalTestFlowLph = 0; + + OrigCalibFactor = 0; + Q2ErrWOCorrection = 0; + Q2CorrectionDone = false; + Q2CorrRFlow = 0; + } + + public void Initialize() + { + ClearData(); + + if (DebugLevel == DebugMode.Normal) + { + + } + } + + public void RunDeviceBefore() + { + + + ////todo: RD- Login?? + //if (DebugLevel == DebugMode.Normal) + //{ + + + // if (myGenesis != null) + // { + // Log("TBF RunDeviceBefore"); + // //myGenesis.Login(); + // //myGenesis.InitMeasurement(); + // } + // else + // { + // throw new Exception("No meter was bound!"); + // } + //} + //else if (DebugLevel == DebugMode.FailureDuringOperation) + //{ + //} + } + + public void RunDeviceAfter() { } + + public void StopDevice() + { + try + { + + if (DebugLevel == DebugMode.Normal && myGenesis != null) + { + myGenesis.DisposeMeter(); + + GenesisHeadBatch.BatchHolder.Value.RemoveMeter(myGenesis); + } + } + catch + { + } + } + + public void StopDevice2() { } + + /// + /// Events: Event.ReadRegisterDone, Event.Error + /// + /// ReadWaterMeter instance reference casted to IOperaton + public IOperation ReadRegisterOp() + { + return this; + } + + /// + /// Clear data/counters related to a specific tests + /// + public void Clear() + { + resultCode = 0; + + sampleNr = 0; + + volumeLtr = 0; + volumeLtr0 = 0; + timestampSec = 0; + timestampSec0 = 0; + + ReadPulses(); + } + + public void TestCompleted() + { + /// TODO: Implement + } + + + int sampleNr; /// This is to determine when the test start sample should be taken + bool StoreStartPackage = false; + bool StoreEndPackage = false; + bool Enable = false; + public bool IsCalibration = false; + /// Start this operation + public void Start() + { + + + } + public void StartRead(string TestName) + { + StoreStartPackage = false; + StoreEndPackage = false; + //Start mesurement + if (DebugLevel == DebugMode.Normal) + { + if (myGenesis != null) + { + IsCalibration = false; + Log("TBF Start Measurement"); + if (TestName.ToLower().Contains("calib")) + { + IsCalibration = true; + myGenesis.StartCalibration(); + } + else + { + myGenesis.StartMeasurement(); + } + + StoreStartPackage = true; + } + } + } + + public void Log(string text) + { + if (DebugLevel == DebugMode.Normal) + { + if (myGenesis != null) + { + myGenesis.WriteLog(text); + } + } + } + void readOutResults(Xylem.Common.Hardware.WaterMeter.CommonMeterDefinitions.MeasurementResults results) + { + + //if (StoreStartPackage) + //{ + + // volumeLtr0 = results.StartData.GetVolumeQm() * 1000; + // timestampSec0 = results.StartData.GetTimeS(); + // StoreStartPackage = false; + //} + //else if (!StoreEndPackage) + //{ + + volumeLtr = results.EndData.GetVolumeQm() * 1000; + timestampSec = results.EndData.GetTimeS(); + wmTestTime = results.TotalTimeS; + wmVolume = results.TotalVolumeQm * 1000; + ReadPulses(); + //} + + + } + + /// Run this operation + /// eventDone + public Event Run() + { + if (DebugLevel == DebugMode.Normal) + { + if (myGenesis != null) + { + try + { + //var results = myGenesis.GetIntermediateMeasurementResult(); + //readOutResults(results); + } + catch (Exception) + { + + + } + + } + } + + return Event.ReadRegisterDone; + } + public double RefVolume = 0.0; + + public void Stop() + { + //Stop(null); + if (DebugLevel == DebugMode.Normal && myGenesis != null) + { + if (IsCalibration) + { + myGenesis.StopCalibration(); + } + else + { + myGenesis.StopMeasurement(); + } + } + } + + /// Stop this operation + public void Stop(Double? testTimeS = null) + { + + if (DebugLevel == DebugMode.Normal && myGenesis != null) + { + Log("TBF Stop Measurement"); + if (IsCalibration) + { + //myGenesis.StopCalibration(); + int retryCounter = 400; + while (myGenesis.GetCalibrationState() != Xylem.Common.Hardware.WaterMeter.CommonMeterDefinitions.ActionStates.IsCompleted) + { + if (retryCounter < 0) + { + break; + } + Thread.Sleep(10); + retryCounter = retryCounter - 1; + } + try + { + var results = myGenesis.GetCalibrationResult(); + readOutResults(results[0]); + if (RefVolume != 0.0) + { + myGenesis.CalculateCalibrationWithVol(RefVolume,0); + myGenesis.SaveCalculatedCalibration(false); + } + + } + catch (Exception ex) + { + MarkAsError(); + Log("Error while Stop Calib " + ex.Message); + } + } + else + { + int retryCounter = 400; + //myGenesis.StopMeasurement(); + while (myGenesis.GetMeasurementState() != Xylem.Common.Hardware.WaterMeter.CommonMeterDefinitions.ActionStates.IsCompleted) + { + if (retryCounter < 0) + { + break; + } + Thread.Sleep(10); + retryCounter = retryCounter - 1; + } + try + { + var results = myGenesis.GetMeasurementResult(testTimeS); + readOutResults(results); + } + catch (Exception ex) + { + MarkAsError(); + Log("Error while Stop Measurement " + ex.Message); + } + + } + + + StoreEndPackage = true; + + } + } + void MarkAsError() + { + volumeLtr = 100; + timestampSec = 1; + wmTestTime = 1; + wmVolume = 100; + ReadPulses(); + } + + void ReadPulses() + { + beginWMState = volumeLtr0; + endWMState = volumeLtr; + wmPulses = (int)(wmVolume * (double)PulsesPerLtr + 0.5); + wmRefPulses = StateMachine.ControlBoard.EtPulses(0); + } + + + bool optoSerialPortParsingEnabled; + + + + + + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/GenesisHeadCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/GenesisHeadCfg.cs new file mode 100644 index 00000000..f15e409e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/GenesisHeadCfg.cs @@ -0,0 +1,66 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Net.Sockets; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + public class GenesisHeadCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(GenesisHeadCfg) })[0]; + protected override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new GenesisHeadCfgCtrl(); } + + /// + /// Serialized parameters + /// + public int SlotNr; /// Number written to QuidoRS to connct the watermeter to RfidComPort, 1 .. 10 + + /// Procedure parameters + [XmlIgnore] + public ProcParams ProcParams; + public override IParamsProvider GetProcedureParams() { return ProcParams; } + public override IParamsProvider CreateProcedureParams(Procedure procedure) + { + ProcParams procParams = new ProcParams(true); + procParams.UpdateProcedureParams(Name, procedure); + return procParams; + } + + [XmlIgnore] + public MeterType MeterType { get { return (ProcParams != null) ? ProcParams.MeterType : MeterType.AutoDetect; } } + + + /// Private parameterless constructor invoked by all other (public) constructors + GenesisHeadCfg() + { + Name = "Genesis"; + ParentName = string.Empty; + SlotNr = 0; + ProcParams = new ProcParams(true); + } + + public GenesisHeadCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("{0} SlotNr={1}", + Name, + SlotNr + ); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/GenesisHeadCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/GenesisHeadCfgCtrl.cs new file mode 100644 index 00000000..17536028 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/GenesisHeadCfgCtrl.cs @@ -0,0 +1,89 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Net; +using System.Net.Sockets; +using System.Windows.Forms; +using log4net; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + public partial class GenesisHeadCfgCtrl : UserControl, IComponentCfgCtrl + { + static readonly ILog log = LogManager.GetLogger(typeof(GenesisHeadCfgCtrl)); + + public bool ShowMore { get { return false; } } + + GenesisHeadCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as GenesisHeadCfg; + Redraw(); + } + } + + public GenesisHeadCfgCtrl() + { + InitializeComponent(); + } + + private void WaterMeterCfgCtrl_Load(object sender, EventArgs e) + { + nameLabel.Text = Strings.Name; + classNameLabel.Text = config.Factory.ClassName; + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + nameTextBox.Text = config.Name; + + + } + + public void Unlock() + { + nameTextBox.Enabled = true; + slotNrTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + + if (!int.TryParse(slotNrTextBox.Text, out dummy) || dummy < 1 || dummy > 7) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + string.Format(Strings.Invalid_0, muxBoardNrLabel.Text); + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + + config.SlotNr = int.Parse(slotNrTextBox.Text); + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/GenesisHeadCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/GenesisHeadCfgCtrl.designer.cs new file mode 100644 index 00000000..46dba57b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/GenesisHeadCfgCtrl.designer.cs @@ -0,0 +1,121 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + partial class GenesisHeadCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.slotNrTextBox = new System.Windows.Forms.TextBox(); + this.muxBoardNrLabel = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(135, 40); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(121, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(25, 43); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(132, 16); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(60, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ClassName"; + // + // slotNrTextBox + // + this.slotNrTextBox.Enabled = false; + this.slotNrTextBox.Location = new System.Drawing.Point(135, 63); + this.slotNrTextBox.Name = "slotNrTextBox"; + this.slotNrTextBox.Size = new System.Drawing.Size(34, 20); + this.slotNrTextBox.TabIndex = 9; + // + // muxBoardNrLabel + // + this.muxBoardNrLabel.AutoSize = true; + this.muxBoardNrLabel.Location = new System.Drawing.Point(25, 66); + this.muxBoardNrLabel.Name = "muxBoardNrLabel"; + this.muxBoardNrLabel.Size = new System.Drawing.Size(37, 13); + this.muxBoardNrLabel.TabIndex = 8; + this.muxBoardNrLabel.Text = "Slot nr"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(176, 66); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(31, 13); + this.label3.TabIndex = 13; + this.label3.Text = "1 .. 6"; + // + // GenesisHeadCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.label3); + this.Controls.Add(this.slotNrTextBox); + this.Controls.Add(this.muxBoardNrLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "GenesisHeadCfgCtrl"; + this.Size = new System.Drawing.Size(396, 123); + this.Load += new System.EventHandler(this.WaterMeterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.TextBox slotNrTextBox; + private System.Windows.Forms.Label muxBoardNrLabel; + private System.Windows.Forms.Label label3; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/GenesisHeadCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/GenesisHeadCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/GenesisHeadCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/OptoReceivedEventArgs.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/OptoReceivedEventArgs.cs new file mode 100644 index 00000000..a6bda914 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/OptoReceivedEventArgs.cs @@ -0,0 +1,20 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + public class OptoReceivedEventArgs : EventArgs + { + public string Data; + + public OptoReceivedEventArgs(string data) + { + this.Data = data; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/OptoTelegramRaw.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/OptoTelegramRaw.cs new file mode 100644 index 00000000..8283d077 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/OptoTelegramRaw.cs @@ -0,0 +1,296 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Globalization; + +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + public class OptoTelegramRaw + { + public static readonly int Length = 42; + private static CultureInfo culture; + + + /// + /// Strobed value + /// + public static decimal TestStartTimestampDec; + + /// + /// Stored values + /// + public OptoTelegramFlags Flags; + + public DateTime DateTime; /// From PC + public float RefFlow; /// [m3/h] + public int Counter; + + public UInt32 EmfRaw; /// From iPerl opto data + public Int16 MagneticFieldRaw; + public Int16 FlowRaw; + public UInt32 VolumeRaw; + public Int64 VolumeRawExt; + public Int16 Impedance; + public UInt32 Timestamp; + public Int64 TimestampExt; + public byte CheckSum; + + /// + /// Calculated values + /// + public double EMF() + { + Int32 signedEmf = (EmfRaw > 0x7FFFFF) ? ((int)EmfRaw - 0x1000000) : (int)EmfRaw; + return 0.000000333 * (double)signedEmf; + } + public double MagneticField() { return (double)MagneticFieldRaw; } + public double Flow(double scalingFactor) { return 0.225 * scalingFactor * (double)FlowRaw; } + public double Volume(double scalingFactor) { return 0.0000625 * scalingFactor * (double)VolumeRawExt; } + public Int32 FlipTime() { return Impedance; } + public decimal TimestampDec() { return (decimal)TimestampExt / (decimal)8192; } + public double VolumeDelta(double scalingFactor, OptoTelegramRaw previous) { return (previous == null) ? 0 : Volume(scalingFactor) - previous.Volume(scalingFactor); } + public decimal TimeDelta() { return TimestampDec() - TestStartTimestampDec; } + public string Label() + { + if (Flags == OptoTelegramFlags.OK_TestStart) return "#### start test ####"; + else if (Flags == OptoTelegramFlags.OK_TestEnd) return "#### end of test ####"; + else return string.Empty; + } + + + static OptoTelegramRaw() + { + culture = CultureInfo.CreateSpecificCulture("DE"); /// This is to use comma as decimal number separator + } + + public OptoTelegramRaw() + { + } + + /// + /// Parses optical telegram and returns OptoTelegramRaw object + /// + /// + /// Create a configuration structure from a complete byte array + /// + /// Telegram description: + /// + /// AAAAAA[tab]BBBB[tab]CCCC[tab]DDDDDD[tab]EEEE[tab]FFFFFFFF[tab]GG[cr][lf] (42 bytes) + /// + /// Data Comment Type Calculate to decimal + /// ---------------------------------------------------------------- + /// AAAAAA EMF Int24 Value * 0.000000333 + /// BBBB Magnetic field Int16 Value + /// CCCC Flow Int16 Value * 0.225 * Scalig factor + /// DDDDDD Volume Int24 Value / 16000 * Scaling factor + /// EEEE Impedance Int16 Value + /// FFFFFFFF Timestamp Uint32 Value / 8192 + /// GG Checksum Byte + /// ---------------------------------------------------------------- + /// + /// Example: + /// FFFFFE 51EA 0000 65324E 0087 F6319DFF 86 + /// FFDD3A 51F9 0000 65324E 0088 F631A60B 45 + /// ... + /// + /// A complete byte array data + /// true = telegram OK, false = telegram NOK + public bool UpdateFromString(string telegram, int counter, ref Int64 volumeRawExtLast, ref Int64 timestampExtLast) + { + DateTime = DateTime.Now; + Counter = counter; + RefFlow = (float)Sequences.ProcessData.RefFlow.Val; + + if ((telegram == null) || (telegram.Length < Length) || + (telegram[6] != '\t') || (telegram[11] != '\t') || (telegram[16] != '\t') || + (telegram[23] != '\t') || (telegram[28] != '\t') || (telegram[37] != '\t') || + (telegram[40] != '\r') || (telegram[41] != '\n')) + { + Flags = OptoTelegramFlags.InvalidTelegram; + return false; + } + + bool f1 = UInt32.TryParse(telegram.Substring(0, 6), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out EmfRaw); + bool f2 = Int16.TryParse(telegram.Substring(7, 4), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out MagneticFieldRaw); + bool f3 = Int16.TryParse(telegram.Substring(12, 4), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out FlowRaw); + bool f4 = UInt32.TryParse(telegram.Substring(17, 6), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out VolumeRaw); + bool f5 = Int16.TryParse(telegram.Substring(24, 4), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out Impedance); + bool f6 = UInt32.TryParse(telegram.Substring(29, 8), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out Timestamp); + bool f7 = byte.TryParse(telegram.Substring(38, 2), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out CheckSum); + + bool allOk = f1 && f2 && f3 && f4 && f5 && f6 && f7; + Flags = allOk ? OptoTelegramFlags.OK : OptoTelegramFlags.InvalidTelegram; + + /// + /// Cope with 'VolumeRaw' overflow + /// + Int64 uncorrected = (Int64)(((UInt64)volumeRawExtLast & 0xFFFFFFFFFF000000UL) | VolumeRaw); + if (Math.Abs(uncorrected - volumeRawExtLast) <= 0x800000L) + { + VolumeRawExt = volumeRawExtLast = uncorrected; + } + else if (Math.Abs(uncorrected + 0x1000000L - volumeRawExtLast) <= 0x800000L) + { + VolumeRawExt = volumeRawExtLast = uncorrected + 0x1000000L; + } + else if (Math.Abs(uncorrected - 0x1000000L - volumeRawExtLast) <= 0x800000L) + { + VolumeRawExt = volumeRawExtLast = uncorrected - 0x1000000L; + } + else + { + VolumeRawExt = volumeRawExtLast = uncorrected; + } + + /// + /// Cope with 'Timestamp' overflow + /// + uncorrected = (Int64)(((UInt64)timestampExtLast & 0xFFFFFFFF00000000UL) | Timestamp); + if (Math.Abs(uncorrected - timestampExtLast) <= 0x80000000L) + { + TimestampExt = timestampExtLast = uncorrected; + } + else if (Math.Abs(uncorrected + 0x100000000L - timestampExtLast) <= 0x80000000L) + { + TimestampExt = timestampExtLast = uncorrected + 0x100000000L; + } + else if (Math.Abs(uncorrected - 0x100000000L - timestampExtLast) <= 0x80000000L) + { + TimestampExt = timestampExtLast = uncorrected - 0x100000000L; + } + else + { + TimestampExt = timestampExtLast = uncorrected; + } + + return allOk; + } + + /// + /// Alternative to UpdateFromString(...) when data are flushed + /// + public bool UpdateFromStringDummy(string telegram) + { + DateTime = DateTime.Now; + RefFlow = (float)Sequences.ProcessData.RefFlow.Val; + + if ((telegram == null) || (telegram.Length < Length) || + (telegram[6] != '\t') || (telegram[11] != '\t') || (telegram[16] != '\t') || + (telegram[23] != '\t') || (telegram[28] != '\t') || (telegram[37] != '\t') || + (telegram[40] != '\r') || (telegram[41] != '\n')) + { + Flags = OptoTelegramFlags.InvalidTelegram; + return false; + } + + //bool f1 = UInt32.TryParse(telegram.Substring(0, 6), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out EmfRaw); + //bool f2 = Int16.TryParse(telegram.Substring(7, 4), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out MagneticFieldRaw); + //bool f3 = Int16.TryParse(telegram.Substring(12, 4), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out FlowRaw); + //bool f4 = UInt32.TryParse(telegram.Substring(17, 6), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out VolumeRaw); + //bool f5 = Int16.TryParse(telegram.Substring(24, 4), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out Impedance); + //bool f6 = UInt32.TryParse(telegram.Substring(29, 8), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out Timestamp); + //bool f7 = byte.TryParse(telegram.Substring(38, 2), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out CheckSum); + //return f1 && f2 && f3 && f4 && f5 && f6 && f7; + + return true; + } + + + public void SetFlags(OptoTelegramFlags flags) + { + this.Flags = flags; + } + + + public string ToString(double scalingFactor, OptoTelegramRaw previous) + { + if (Flags == OptoTelegramFlags.SyncError) + { + return "Sychronization error"; + } + else if (Flags == OptoTelegramFlags.InvalidTelegram) + { + return "Invalid telegram"; + } + else /// if (flags == OptoTelegramFlags.OK / OptoTelegramFlags.OK_TestStart / OptoTelegramFlags.OK_TestEnd) + { + return string.Format("{0}:{1}:{2}.{3}\t{4} :\t{5}\t{6}\t{7}\t{8}\t{9}\t{10}\t{11}\t{12}\t{13}\t{14}\t{15}\t{16}\t{17}\t{18}\t{19}\t{20}\t{21}\t{22}", + DateTime.Hour.ToString("D2"), + DateTime.Minute.ToString("D2"), + DateTime.Second.ToString("D2"), + DateTime.Millisecond.ToString("D4"), + Counter, + EmfRaw.ToString("X6"), + MagneticFieldRaw.ToString("X4"), + FlowRaw.ToString("X4"), + VolumeRaw.ToString("X6"), + Impedance.ToString("X4"), + Timestamp.ToString("X8"), + CheckSum.ToString("X2"), + EMF().ToString("F4", culture), + MagneticField().ToString("F0", culture), + Flow(scalingFactor).ToString("F2", culture), + Volume(scalingFactor).ToString("F4", culture), + FlipTime().ToString("F0", culture), + TimestampDec().ToString("F4", culture), + (RefFlow * 1000).ToString("F2", culture), + VolumeDelta(scalingFactor, previous).ToString("F4", culture), + TimeDelta().ToString("F3", culture), + scalingFactor.ToString("F1", culture), + Label()); + } + } + + /// + /// Filter RefFlow data in an array of OptoTelegramRaw objects by a FIR filter: + /// + /// kSize = 5, kSize2 = 2 + /// + /// i k + /// --------------------------------------------------------------------------- + /// 0 -5 filtered[0] = data[0] + /// 1 -4 filtered[1] = data[1] + /// 2 -3 filtered[2] = data[0]*k[0] + ... + data[4]*k[4] + /// 3 -2 filtered[3] = data[1]*k[0] + ... + data[5]*k[4] + /// 4 -1 filtered[4] = data[2]*k[0] + ... + data[6]*k[4] + /// 5 0 data[0] = filtered[0], filtered[0] = data[3]*k[0] + ... + data[7]*k[4] + /// 6 1 data[1] = filtered[1], filtered[1] = data[4]*k[0] + ... + data[8]*k[4] + /// 7 ... + /// + /// array of OptoTelegramRaw objects + /// number of objects to process + public static void FIRFilterFlow(OptoTelegramRaw[] optoData, int optoDataCount) + { + float[] kernel = new float[] { 0.1f, 0.2f, 0.4f, 0.2f, 0.1f }; + int kSize = kernel.Length; + int kSize2 = kernel.Length / 2; + + float[] filtered = new float[kSize]; + + for (int i = 0; i < optoDataCount; i++) + { + int k = i - kSize; + if (k >= 0) optoData[k].RefFlow = filtered[i % kSize]; + + if (i < kSize2 || i >= optoDataCount - kSize2) + { + filtered[i % kSize] = optoData[i].RefFlow; + } + else + { + float weoightedSum = 0; + for (int j = -kSize2; j <= kSize2; j++) + weoightedSum += optoData[i + j].RefFlow * kernel[j + kSize2]; + + filtered[i % kSize] = weoightedSum; + } + } + + for (int k = optoDataCount - kSize; k < optoDataCount; k++) + { + if (k >= 0) optoData[k].RefFlow = filtered[k % kSize]; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/ProcParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/ProcParams.cs new file mode 100644 index 00000000..3b89e086 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/ProcParams.cs @@ -0,0 +1,181 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + public class ProcParams : ProcedureParamsBase, IParamsProvider, IProcedureParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcParams) })[0]; + protected override XmlSerializer GetSerializer() { return Serializer; } + + public MeterType MeterType; + public float CalibTarget; /// Target error after calibration in [%] + public int FactorLimitLo; /// Lower limit for the calibration factor + public int FactorLimitHi; /// Upper limit for the calibration factor +#if ORACLE_DB + public int WMType_ID; /// Required for Oracle DB: ID_WZTyp in table VT_PRUEFPUNKT_SOLL_SD + public int WMType_Rev; /// Required for Oracle DB: Rev_WZTyp in table VT_PRUEFPUNKT_SOLL_SD +#endif + + + public override void InitializeAll() + { + MeterType = MeterType.AutoDetect; + CalibTarget = 0; + FactorLimitLo = 1000; + FactorLimitHi = 8000; +#if ORACLE_DB + WMType_ID = 2; /// Value for iPerl DN15 + WMType_Rev = 1; /// Value for iPerl DN15 +#endif + } + + string[] paramNames = new string[] + { + "iPerl type", + "Calib. target [%]", + "Calib. factor Lo", + "Calib. factor Hi", +#if ORACLE_DB + "WMType ID", + "WMType Rev.", +#endif + }; + public override string ParamName(int i) { return paramNames[i]; } + public override int ParamsCount() { return paramNames.Length; } + + public override string ToString(int i) + { + switch (i) + { + case 0: return MeterType.ToString(); + case 1: return CalibTarget.ToString(); + case 2: return FactorLimitLo.ToString(); + case 3: return FactorLimitHi.ToString(); +#if ORACLE_DB + case 4: return WMType_ID.ToString(); + case 5: return WMType_Rev.ToString(); +#endif + default: return string.Empty; + } + } + + public void UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: + for (MeterType mt = 0; mt < MeterType.Count; mt++) + { + if (mt.ToString().Equals(strValue)) { MeterType = mt; return; } + } + break; + case 1: CalibTarget = Utils.ParseSFloat(strValue); return; + case 2: FactorLimitLo = int.Parse(strValue); return; + case 3: FactorLimitHi = int.Parse(strValue); return; +#if ORACLE_DB + case 4: WMType_ID = int.Parse(strValue); return; + case 5: WMType_Rev = int.Parse(strValue); return; +#endif + default: return; + } + } + + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + + int iDummy; + float fDummy; + + switch (i) + { + case 0: + for (MeterType mt = 0; mt < MeterType.Count; mt++) if (mt.ToString().Equals(strValue)) return true; + break; + case 1: + if (Utils.TryParseSFloat(strValue, out fDummy) && fDummy >= -10.0f && fDummy <= 10.0f) return true; + break; + case 2: + case 3: + if (int.TryParse(strValue, out iDummy) && iDummy >= 1000 && iDummy <= 8000) return true; + break; + +#if ORACLE_DB + case 4: /// WMType_ID + case 5: /// WMType_Rev + if (int.TryParse(strValue, out iDummy)) return true; + break; +#endif + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(ProcParams prms) + { + prms.MeterType = this.MeterType; + prms.CalibTarget = this.CalibTarget; + prms.FactorLimitLo = this.FactorLimitLo; + prms.FactorLimitHi = this.FactorLimitHi; +#if ORACLE_DB + prms.WMType_ID = this.WMType_ID; + prms.WMType_Rev = this.WMType_Rev; +#endif + } + + public IParamsProvider Clone() + { + ProcParams pars = new ProcParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateProcedureParams(ComponentProcedure dbEntity) + { + if (dbEntity == null) return; + try + { + ProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcParams; + + procedureParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + procedure = dbEntity.Procedure; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + + public ProcParams() + { + } + + public ProcParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public ProcParams(ComponentProcedure procParamsEntity, string componentName, Procedure procedure) + { + this.procedureParamsEntity = procParamsEntity; + this.componentName = componentName; + this.procedure = procedure; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/StatusStruct.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/StatusStruct.cs new file mode 100644 index 00000000..f9f91757 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisHead/StatusStruct.cs @@ -0,0 +1,160 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; + +namespace TBF.BenchControl.TestMethods.GenesisCommunication.GenesisHead +{ + public class StatusStruct + { + public static readonly int Length = 48; + + public Byte Version; + public FlowState FlowState; + public UInt32 BillingVolume; + public UInt32 ForwardVolume; + public UInt32 ReverseVolume; + public UInt32 SecondsActive; + public UInt32 SecondsIdle; + public UInt32 SecondsUsed; + public UInt32 UTC; + public Int32 ScaledAvgFlowRate; + public UInt16 PeakFlowRate; + public UInt16 AlarmState; + public byte RebootCount; + public byte[] AlarmCount; + public UInt16 FlipTime; + + + public StatusStruct() + { + AlarmCount = new byte[7]; + } + + public byte[] ToByteArray() + { + byte[] result = new byte[Length]; + + result[0] = Version; + result[1] = (byte)FlowState; + + result[2] = (byte)(BillingVolume & 0x000000FF); + result[3] = (byte)((BillingVolume >> 8) & 0x000000FF); + result[4] = (byte)((BillingVolume >> 16) & 0x000000FF); + result[5] = (byte)((BillingVolume >> 24) & 0x000000FF); + + result[6] = (byte)(ForwardVolume & 0x000000FF); + result[7] = (byte)((ForwardVolume >> 8) & 0x000000FF); + result[8] = (byte)((ForwardVolume >> 16) & 0x000000FF); + result[9] = (byte)((ForwardVolume >> 24) & 0x000000FF); + + result[10] = (byte)(ReverseVolume & 0x000000FF); + result[11] = (byte)((ReverseVolume >> 8) & 0x000000FF); + result[12] = (byte)((ReverseVolume >> 16) & 0x000000FF); + result[13] = (byte)((ReverseVolume >> 24) & 0x000000FF); + + result[14] = (byte)(SecondsActive & 0x000000FF); + result[15] = (byte)((SecondsActive >> 8) & 0x000000FF); + result[16] = (byte)((SecondsActive >> 16) & 0x000000FF); + result[17] = (byte)((SecondsActive >> 24) & 0x000000FF); + + result[18] = (byte)(SecondsIdle & 0x000000FF); + result[19] = (byte)((SecondsIdle >> 8) & 0x000000FF); + result[20] = (byte)((SecondsIdle >> 16) & 0x000000FF); + result[21] = (byte)((SecondsIdle >> 24) & 0x000000FF); + + result[22] = (byte)(SecondsUsed & 0x000000FF); + result[23] = (byte)((SecondsUsed >> 8) & 0x000000FF); + result[24] = (byte)((SecondsUsed >> 16) & 0x000000FF); + result[25] = (byte)((SecondsUsed >> 24) & 0x000000FF); + + result[26] = (byte)(UTC & 0x000000FF); + result[27] = (byte)((UTC >> 8) & 0x000000FF); + result[28] = (byte)((UTC >> 16) & 0x000000FF); + result[29] = (byte)((UTC >> 24) & 0x000000FF); + + result[30] = (byte)(ScaledAvgFlowRate & 0x000000FF); + result[31] = (byte)((ScaledAvgFlowRate >> 8) & 0x000000FF); + result[32] = (byte)((ScaledAvgFlowRate >> 16) & 0x000000FF); + result[33] = (byte)((ScaledAvgFlowRate >> 24) & 0x000000FF); /// TODO: test with negative value + + result[34] = (byte)(PeakFlowRate & 0x00FF); + result[35] = (byte)((PeakFlowRate >> 8) & 0x00FF); + + result[36] = (byte)(AlarmState & 0x00FF); + result[37] = (byte)((AlarmState >> 8) & 0x00FF); + + result[38] = RebootCount; + + result[39] = AlarmCount[0]; + result[40] = AlarmCount[1]; + result[41] = AlarmCount[2]; + result[42] = AlarmCount[3]; + result[43] = AlarmCount[4]; + result[44] = AlarmCount[5]; + result[45] = AlarmCount[6]; + + result[46] = (byte)(FlipTime & 0x00FF); + result[47] = (byte)((FlipTime >> 8) & 0x00FF); + + return result; + } + + public static StatusStruct FromByteArray(byte[] data) + { + if (data.Length != Length) return null; + + StatusStruct result = new StatusStruct(); + + result.Version = data[0]; + result.FlowState = (FlowState)data[1]; + result.BillingVolume = (((UInt32)data[5] * 256 + data[4]) * 256 + data[3]) * 256 + data[2]; + result.ForwardVolume = (((UInt32)data[9] * 256 + data[8]) * 256 + data[7]) * 256 + data[6]; + result.ReverseVolume = (((UInt32)data[13] * 256 + data[12]) * 256 + data[11]) * 256 + data[10]; + result.SecondsActive = (((UInt32)data[17] * 256 + data[16]) * 256 + data[15]) * 256 + data[14]; + result.SecondsIdle = (((UInt32)data[21] * 256 + data[20]) * 256 + data[19]) * 256 + data[18]; + result.SecondsUsed = (((UInt32)data[25] * 256 + data[24]) * 256 + data[23]) * 256 + data[22]; + result.UTC = (((UInt32)data[29] * 256 + data[28]) * 256 + data[27]) * 256 + data[26]; + result.ScaledAvgFlowRate = (((Int32)data[33] * 256 + data[32]) * 256 + data[31]) * 256 + data[30]; /// TODO: test with negative value + result.PeakFlowRate = (UInt16)(data[34] + 256 * data[35]); + result.AlarmState = (UInt16)(data[36] + 256 * data[37]); + result.RebootCount = data[38]; + result.AlarmCount[0] = data[39]; + result.AlarmCount[1] = data[40]; + result.AlarmCount[2] = data[41]; + result.AlarmCount[3] = data[42]; + result.AlarmCount[4] = data[43]; + result.AlarmCount[5] = data[44]; + result.AlarmCount[6] = data[45]; + result.FlipTime = (UInt16)(data[46] * 256 + data[47]); + + return result; + } + + public override string ToString() + { + return string.Format("Status: V{0} Flow={1} BillVol={2} ForwVol={3} RevVol={4} SecActive={5}s SecIdle={6}s SecUsed={7}s UTC={8} AvgFlowRate={9} PeekFlowRate={10} AlarmState={11} RebootCount={12} A0={13} A1={14} A2={15} A3={16} A4={17} A5={18} A6={19} FlipTime={20}", + Version, + FlowState, + BillingVolume, + ForwardVolume, + ReverseVolume, + SecondsActive, + SecondsIdle, + SecondsUsed, + UTC, + ScaledAvgFlowRate, + PeakFlowRate, + AlarmState, + RebootCount, + AlarmCount[0], + AlarmCount[1], + AlarmCount[2], + AlarmCount[3], + AlarmCount[4], + AlarmCount[5], + AlarmCount[6], + FlipTime); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GrabImage/Component.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GrabImage/Component.cs new file mode 100644 index 00000000..097e6613 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GrabImage/Component.cs @@ -0,0 +1,72 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; +using TBF.BenchControl; + +namespace TBF.BenchControl.TestMethods.GrabImage +{ + public class Component : ComponentBase, GenericDevices.ITestMethod + { + private static readonly ILog log = LogManager.GetLogger(typeof(Component)); + public override string ToString() { return string.Format("TestMethods.GrabImage({0})", Cfg.ToString(1)); } + + public bool CanTest(MetersKind meters) { return true; } + public bool DoTransitions() { return false; } + + readonly GrabImageCfg cfg; + + #region Configuration Change Handling + + public static void OnCfgChange(object sender, CfgChangeArgs args) + { + if (CfgChangeHandler == null) return; + try { CfgChangeHandler(sender, args); } + catch (Exception e) { log.Error("CfgChangeHandler(...) failed", e); } + } + + public static event EventHandler CfgChangeHandler; + + public override void StartChangeHandler() + { + CfgChangeHandler += delegate(object sender, CfgChangeArgs args) + { + GrabImageCfg tmpcfg = args.Cfg as GrabImageCfg; + if (tmpcfg != null && tmpcfg.Name.Equals(Name)) + { + if (args.Command == CfgChangeCmd.CfgChange) + { + cfg.ImageFileName = tmpcfg.ImageFileName; + cfg.BlackAndWhite = tmpcfg.BlackAndWhite; + cfg.LowResolution = tmpcfg.LowResolution; + cfg.ImageRotation = tmpcfg.ImageRotation; + } + } + }; + } + + #endregion Configuration Change Handling + + + public Component() + { + } + + public Component(Generic.IComponentCfg cfg) + : base(cfg) + { + this.cfg = cfg as GrabImageCfg; + StartChangeHandler(); + log.Debug(this.ToString()); + } + + public IList Execute(Test test, int idummy, bool bdummy) + { + return (new GrabImageSeq()).Execute(test, cfg); + } + + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GrabImage/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GrabImage/Factory.cs new file mode 100644 index 00000000..bbba6c51 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GrabImage/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.GrabImage +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Component.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Component(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Component(cfg); } + + public IComponentCfg DefaultConfig() { return new GrabImageCfg(this, this.GetType().Namespace.Substring(29)); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(GrabImageCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GrabImage/GrabImageCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GrabImage/GrabImageCfg.cs new file mode 100644 index 00000000..f7f29b75 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GrabImage/GrabImageCfg.cs @@ -0,0 +1,48 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.GrabImage +{ + public class GrabImageCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(GrabImageCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new GrabImageCfgCtrl(); } + + + public string ImageFileName; + public bool BlackAndWhite; + public bool LowResolution; + public ImageRotation ImageRotation; + + + /// Private parameterless constructor invoked by all other (public) constructors + GrabImageCfg() {} + + public GrabImageCfg(IComponentFactory factory, string name) + : this() + { + this.Factory = factory; + Name = name; + ParentName = string.Empty; + BlackAndWhite = false; + LowResolution = true; + ImageRotation = ImageRotation.None; + } + + public string ToString(int i) + { + return string.Format("Name={0}, Img={1}, B&W={2}, LowRes={3}, Rotation={4}", + Name, ImageFileName, BlackAndWhite, LowResolution, ImageRotation); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GrabImage/GrabImageCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GrabImage/GrabImageCfgCtrl.cs new file mode 100644 index 00000000..9520b605 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GrabImage/GrabImageCfgCtrl.cs @@ -0,0 +1,131 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.GrabImage +{ + public partial class GrabImageCfgCtrl : UserControl, IComponentCfgCtrl + { + static readonly ILog log = LogManager.GetLogger(typeof(GrabImageCfgCtrl)); + + public bool ShowMore { get { return false; } } + + GrabImageCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as GrabImageCfg; + Redraw(); + } + } + + public GrabImageCfgCtrl() + { + InitializeComponent(); + } + + private void GrabImageCfgCtrl_Load(object sender, EventArgs e) + { + for (ImageRotation ir = 0; ir < ImageRotation.Count; ir++) + { + imageRotationComboBox.Items.Add(ir.ToDescription()); + } + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + imageNameTextBox.Text = config.ImageFileName; + blackAndWhiteCheckBox.Checked = config.BlackAndWhite; + loResolutionCheckBox.Checked = config.LowResolution; + imageRotationComboBox.Text = config.ImageRotation.ToDescription(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + imageNameTextBox.Enabled = true; + blackAndWhiteCheckBox.Enabled = true; + loResolutionCheckBox.Enabled = true; + imageRotationComboBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + for (ImageRotation ir = 0; ir < ImageRotation.Count; ir++) + { + if (imageRotationComboBox.Text == ir.ToDescription()) return CfgUpdateFlags.None; + } + + message += Environment.NewLine + string.Format(Strings.Invalid_0, imageRotationLabel.Text); + return CfgUpdateFlags.Error; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + if (config.Name != nameTextBox.Text) + { + config.Name = nameTextBox.Text; + flags |= (CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + } + + if (config.ImageFileName != imageNameTextBox.Text) + { + config.ImageFileName = imageNameTextBox.Text; + flags |= (CfgUpdateFlags.AnyChange | CfgUpdateFlags.InvokeCfgChange); + } + + if (config.BlackAndWhite != blackAndWhiteCheckBox.Checked) + { + config.BlackAndWhite = blackAndWhiteCheckBox.Checked; + flags |= (CfgUpdateFlags.AnyChange | CfgUpdateFlags.InvokeCfgChange); + } + + if (config.LowResolution != loResolutionCheckBox.Checked) + { + config.LowResolution = loResolutionCheckBox.Checked; + flags |= (CfgUpdateFlags.AnyChange | CfgUpdateFlags.InvokeCfgChange); + } + + for (ImageRotation ir = 0; ir < ImageRotation.Count; ir++) + { + if (imageRotationComboBox.Text == ir.ToDescription()) + { + if (config.ImageRotation != ir) + { + config.ImageRotation = ir; + flags |= (CfgUpdateFlags.AnyChange | CfgUpdateFlags.InvokeCfgChange); + break; + } + } + } + + if ((flags & CfgUpdateFlags.InvokeCfgChange) != 0) + { + Component.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.CfgChange, config)); + } + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GrabImage/GrabImageCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GrabImage/GrabImageCfgCtrl.designer.cs new file mode 100644 index 00000000..d6021961 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GrabImage/GrabImageCfgCtrl.designer.cs @@ -0,0 +1,159 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.TestMethods.GrabImage +{ + partial class GrabImageCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.loResolutionCheckBox = new System.Windows.Forms.CheckBox(); + this.blackAndWhiteCheckBox = new System.Windows.Forms.CheckBox(); + this.imageNameTextBox = new System.Windows.Forms.TextBox(); + this.imageNameLabel = new System.Windows.Forms.Label(); + this.imageRotationLabel = new System.Windows.Forms.Label(); + this.imageRotationComboBox = new System.Windows.Forms.ComboBox(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(149, 69); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(171, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(24, 72); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(95, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Test method name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(146, 43); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // loResolutionCheckBox + // + this.loResolutionCheckBox.AutoSize = true; + this.loResolutionCheckBox.Enabled = false; + this.loResolutionCheckBox.Location = new System.Drawing.Point(149, 149); + this.loResolutionCheckBox.Name = "loResolutionCheckBox"; + this.loResolutionCheckBox.Size = new System.Drawing.Size(94, 17); + this.loResolutionCheckBox.TabIndex = 6; + this.loResolutionCheckBox.Text = "Low resolution"; + this.loResolutionCheckBox.UseVisualStyleBackColor = true; + // + // blackAndWhiteCheckBox + // + this.blackAndWhiteCheckBox.AutoSize = true; + this.blackAndWhiteCheckBox.Enabled = false; + this.blackAndWhiteCheckBox.Location = new System.Drawing.Point(149, 126); + this.blackAndWhiteCheckBox.Name = "blackAndWhiteCheckBox"; + this.blackAndWhiteCheckBox.Size = new System.Drawing.Size(93, 17); + this.blackAndWhiteCheckBox.TabIndex = 5; + this.blackAndWhiteCheckBox.Text = "Black && White"; + this.blackAndWhiteCheckBox.UseVisualStyleBackColor = true; + // + // imageNameTextBox + // + this.imageNameTextBox.Enabled = false; + this.imageNameTextBox.Location = new System.Drawing.Point(149, 95); + this.imageNameTextBox.Name = "imageNameTextBox"; + this.imageNameTextBox.Size = new System.Drawing.Size(171, 20); + this.imageNameTextBox.TabIndex = 4; + // + // imageNameLabel + // + this.imageNameLabel.AutoSize = true; + this.imageNameLabel.Location = new System.Drawing.Point(24, 98); + this.imageNameLabel.Name = "imageNameLabel"; + this.imageNameLabel.Size = new System.Drawing.Size(81, 13); + this.imageNameLabel.TabIndex = 3; + this.imageNameLabel.Text = "Image file name"; + // + // imageRotationLabel + // + this.imageRotationLabel.AutoSize = true; + this.imageRotationLabel.Location = new System.Drawing.Point(24, 175); + this.imageRotationLabel.Name = "imageRotationLabel"; + this.imageRotationLabel.Size = new System.Drawing.Size(103, 13); + this.imageRotationLabel.TabIndex = 7; + this.imageRotationLabel.Text = "Image rotation (ccw)"; + // + // imageRotationComboBox + // + this.imageRotationComboBox.Enabled = false; + this.imageRotationComboBox.FormattingEnabled = true; + this.imageRotationComboBox.Location = new System.Drawing.Point(149, 172); + this.imageRotationComboBox.Name = "imageRotationComboBox"; + this.imageRotationComboBox.Size = new System.Drawing.Size(93, 21); + this.imageRotationComboBox.TabIndex = 8; + // + // GrabImageCfgCtrl + // + this.Controls.Add(this.imageRotationComboBox); + this.Controls.Add(this.imageRotationLabel); + this.Controls.Add(this.imageNameTextBox); + this.Controls.Add(this.imageNameLabel); + this.Controls.Add(this.blackAndWhiteCheckBox); + this.Controls.Add(this.loResolutionCheckBox); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "GrabImageCfgCtrl"; + this.Size = new System.Drawing.Size(400, 250); + this.Load += new System.EventHandler(this.GrabImageCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.CheckBox loResolutionCheckBox; + private System.Windows.Forms.CheckBox blackAndWhiteCheckBox; + private System.Windows.Forms.TextBox imageNameTextBox; + private System.Windows.Forms.Label imageNameLabel; + private System.Windows.Forms.Label imageRotationLabel; + private System.Windows.Forms.ComboBox imageRotationComboBox; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GrabImage/GrabImageCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GrabImage/GrabImageCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GrabImage/GrabImageCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GrabImage/GrabImageSeq.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GrabImage/GrabImageSeq.cs new file mode 100644 index 00000000..df06275d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GrabImage/GrabImageSeq.cs @@ -0,0 +1,66 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using log4net; +using Config.Entities; +using TBF.UiBridge; +using System.IO; + +namespace TBF.BenchControl.TestMethods.GrabImage +{ + public class GrabImageSeq : Sequences.SequenceBase + { + private static readonly ILog log = LogManager.GetLogger(typeof(GrabImageSeq)); + + + public IList Execute( Test test, GrabImageCfg cfg) + { + IList e = new List(); /// Events from currently running operations + Event retVal = Event.Done; + + /// Operations + checkUiOp = new Operations.CheckUIOp(true); + + IList cameras = new List(); + IList grabImagesOp = new List(); + + //------------------------------------------------ + Bridge.OnActivity(this, test.Method); + //------------------------------------------------ + State state = State.Create(string.Format("{0}({1}) : Grabbing images", test.Method, test.Name)) + .AddOperation(checkUiOp); + for (int i = 0; i < sensPath.RegisterReaders.Length; i++) + { + GenericDevices.IRoiForFixedStart roi = sensPath.RegisterReaders[i] as GenericDevices.IRoiForFixedStart; + if (roi != null) + { + string directory = Path.Combine(Program.ImagesDir, BatchRslts.Batch.BatchNr.ToString(), (i+1).ToString()); + Directory.CreateDirectory(directory); + state.AddOperation(roi.GrabImageOp(Path.Combine(directory, cfg.ImageFileName), + cfg.BlackAndWhite, + cfg.LowResolution, + cfg.ImageRotation)); + } + } + state.EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, 1, Config.Entities.Progress.Test)); + + if (e.Contains(Event.Error)) { retVal = Event.Error; break; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; break; } + } + while (e.Contains(Event.CameraBusy)); + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, 1, Config.Entities.Progress.Completed)); + + /// Create a list with one item 'retVal' (default is Event.Done) and return it + IList retList = new List(1); + retList.Add(retVal); + return retList; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LeakTest/LeakTestParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LeakTest/LeakTestParams.cs new file mode 100644 index 00000000..9c0d914c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LeakTest/LeakTestParams.cs @@ -0,0 +1,144 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.LeakTest +{ + public class LeakTestParams : TestParamsBase, IParamsProvider, ITestParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(LeakTestParams) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public float PressureLo; /// Presure range low limit in [bar] + public float PressureHi; /// Presure range high limit in [bar] + public int DurationPMax; /// Duration of PMax test in [s] + public int DurationLeak; /// Duration of Leak test in [s] + + public override void InitializeAll() + { + PressureLo = 5.0f; /// [bar] + PressureHi = 6.0f; /// [bar] + DurationPMax = 10; + DurationLeak = 60; + } + + + string[] paramNames = new string[] + { + Strings.Pressure_lo_bar, + Strings.Pressure_hi_bar, + Strings.Duration_PMax_s, + Strings.Duration_Leak_s, + }; + public override string ParamName(int i) { return paramNames[i]; } + public override int ParamsCount() { return paramNames.Length; } + + public override string ToString(int i) + { + switch (i) + { + case 0: return PressureLo.ToString(); /// [bar] + case 1: return PressureHi.ToString(); /// [bar] + case 2: return DurationPMax.ToString(); + case 3: return DurationLeak.ToString(); + default: return string.Empty; + } + } + + public CfgUpdateFlags UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: PressureLo = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 1: PressureHi = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 2: DurationPMax = int.Parse(strValue); return CfgUpdateFlags.None; + case 3: DurationLeak = int.Parse(strValue); return CfgUpdateFlags.None; + default: return CfgUpdateFlags.None; + } + } + + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + + float dummy; + int iDummy; + switch (i) + { + case 0: + case 1: + if (Utils.TryParseUFloat(strValue, out dummy)) return true; + break; + case 2: + case 3: + if (int.TryParse(strValue, out iDummy)) return true; + break; + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(LeakTestParams prms) + { + prms.PressureLo = this.PressureLo; + prms.PressureHi = this.PressureHi; + prms.DurationPMax = this.DurationPMax; + prms.DurationLeak = this.DurationLeak; + } + + public IParamsProvider Clone() + { + LeakTestParams pars = new LeakTestParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateFromDbEntity(ComponentTest dbEntity) + { + if (dbEntity == null) return; + try + { + LeakTestParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as LeakTestParams; + + testParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + test = dbEntity.Test; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + /// + /// Parameterless constructor initializes the parameters + /// + public LeakTestParams() + { + } + + public LeakTestParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public LeakTestParams(ComponentTest testParamsEntity, string componentName, Test test) + { + this.testParamsEntity = testParamsEntity; + this.componentName = componentName; + this.test = test; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LeakTest/LeakTestSeq.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LeakTest/LeakTestSeq.cs new file mode 100644 index 00000000..75f0bc3f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LeakTest/LeakTestSeq.cs @@ -0,0 +1,399 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Text; +using log4net; +using Config.Entities; +using TBF.BenchControl; +using TBF.Boxes; +using TBF.Resources; +using TBF.UiBridge; + +namespace TBF.BenchControl.TestMethods.LeakTest +{ + public class LeakTestSeq : Sequences.SequenceBase + { + private static readonly ILog log = LogManager.GetLogger(typeof(LeakTestSeq)); + + /// + /// Flying start mass collection method sequence + /// + /// Test entity + /// + /// Event.Done . . . . . . . OK + /// Event.UiCmdStop . . . . Stopped by the user using the on-screen button STOP + /// Event.OpArgumentError . Target flow is out of range + /// Event.Error . . . . . . Unspecified error + /// + public IList Execute(Config.Entities.Test test, int repetitionNr, bool isLastRepetition, LeakTestParams testParams) + { + Elde.ControlBoardDev cBrd = StateMachine.ControlBoard; + + IList e = new List(); /// Events from currently running operations + Event retVal = Event.Done; + checkUiOp = new Operations.CheckUIOp(true); /// Runs in more then one state + + processDataLoggingOp = new TBF.BenchControl.Operations.ProcessDataLoggingOp(processDataLogger, this, false); + + /// Start the test, initialize test results + Bridge.OnTestSelected(this, new TestSelectedEventArgs(test, 1, inPath, benchPath, outPath, sensPath, 0)); + string testName = Results.Utils.GetTestName(test.Name, test.Repeats, 1); + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Starting_the_pump); + //------------------------------------------------ + if (inPath.Pump is GenericDevices.IPumpFM) (inPath.Pump as GenericDevices.IPumpFM).TurnOn(test.PumpPower); + + State.Create(string.Format("{0}({1}) : Starting the pump", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) +// .AddOperation(new Operations.SetAllRegulValvesOp(inPath.RegulValves, inPath.RegulValvesPct, 60)) + .AddOperation(inPath.Pump != null ? cBrd.SetValvesOp(inPath.Pump, null) : null) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } + while (e.Contains(Event.ValvesBusy) /* || !e.Contains(Event.AllPositionsReached)*/); + + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Setting_the_water_pressure); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + //------------------------------------------------ + + float pumpPower = test.PumpPower; + int startTime = StateMachine.Time; + + while (true) + { + if (inPath.Pump is GenericDevices.IPumpFM) (inPath.Pump as GenericDevices.IPumpFM).TurnOn(pumpPower); + + State.Create(string.Format("{0}({1}) : Setting the water pressure", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(new Operations.TimerOp(5)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Next)) goto pressure_set; + } + while (e.Contains(Event.TimerBusy)); + + UiBridge.Bridge.OnLog(this, string.Format("time = {0}, pump_power = {1}%, pressure_up = {2}bar, pressure_down = {3}bar\r\n", + StateMachine.Time - startTime, + pumpPower.ToString("F0"), + PressUp.ToString(), + PressDown.ToString())); + + float step = (pumpPower < 40.0f) ? 4.7f : ((pumpPower < 60.0f) ? 3.3f : ((pumpPower < 80.0f) ? 2.2f : ((pumpPower < 90.0f) ? 1.5f : 1.2f))); + + if (PressDown.Val < testParams.PressureLo) + { + if (pumpPower == 100.0f) break; /// Already at max. pump power -> Quit loop + pumpPower = Math.Min(pumpPower + step, 100.0f); /// Limit max. power to 100% + } + else if (PressDown.Val > testParams.PressureHi) + { + if (pumpPower == 0) break; /// Already at min. pump power -> Quit loop + pumpPower = Math.Max(pumpPower - step, 0); /// Limit min. power to 0% + } + else + { + break; /// Pressure is in the range -> Quit loop + } + } + + pressure_set: + + StartNewStatistics(StateMachine.Time, BatchRslts.Batch.BatchNr, test.Name, repetitionNr); + UpdateAllStatistics(StateMachine.Time); + + startTime = StateMachine.Time; + int estimtdEndTime = startTime + testParams.DurationPMax; + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Test_in_progress); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + //------------------------------------------------ + State.Create(string.Format("{0}({1}) : Maximum water pressure set", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(new Operations.TimerOp(testParams.DurationPMax)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + + UpdateAllStatistics(StateMachine.Time); + + int remainingTime = Math.Max(estimtdEndTime - StateMachine.Time, 0); + if (remainingTime > 60) + { + Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", Strings.Test_in_progress, remainingTime / 60, "min", remainingTime % 60, Strings.sec)); + } + else + { + Bridge.OnActivity(this, string.Format("{0} ... {1} s", Strings.Test_in_progress, remainingTime)); + } + } + while (e.Contains(Event.TimerBusy)); + + closing_valve: + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Closing_valve_Pump_off); + //------------------------------------------------ + State.Create(string.Format("{0}({1}) : Closing the valve", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(new TBF.BenchControl.Elde.SetValvesOp(cBrd, true, outPath)) + .AddOperation(benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + + UpdateAllStatistics(StateMachine.Time); + } + while (e.Contains(Event.ValvesBusy)); + + valve_closed: + + if (inPath.Pump is GenericDevices.IPumpFM) (inPath.Pump as GenericDevices.IPumpFM).TurnOff(); + + State.Create(string.Format("{0}({1}) : Closing the valve", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(cBrd.SetValvesOp(null, inPath.Pump)) + .AddOperation(benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + + UpdateAllStatistics(StateMachine.Time); + } + while (e.Contains(Event.ValvesBusy)); + + + pump_is_off: + + TestStartTime = DateTime.Now; + startTime = StateMachine.Time; + estimtdEndTime = startTime + testParams.DurationLeak; + StartNewStatistics(StateMachine.Time, BatchRslts.Batch.BatchNr, test.Name, repetitionNr); + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Test_in_progress); + //------------------------------------------------ + State.Create(string.Format("{0}({1}) : Starting the test", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(new Operations.TimerOp(testParams.DurationLeak)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + + UpdateAllStatistics(StateMachine.Time); + + int remainingTime = Math.Max(estimtdEndTime - StateMachine.Time, 0); + if (remainingTime > 60) + { + Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", Strings.Test_in_progress, remainingTime / 60, "min", remainingTime % 60, Strings.sec)); + } + else + { + Bridge.OnActivity(this, string.Format("{0} ... {1} s", Strings.Test_in_progress, remainingTime)); + } + } + while (e.Contains(Event.TimerBusy)); + + /// Measurement loop - end + + test_completed: + + StopRecordingStatistics(); + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Test_completed); + //------------------------------------------------ + + TestEndTime = DateTime.Now; + + /// Make sure the CycleBeginForm is closed so that water meter data (s/n) can be copied into results + if (UIFlowControl.Stop == WaitBeginFormClosed()) goto stopTest; + + /// + /// Populate TestResult data entity with data + /// + Results.Entities.TestRslt tstRslt = BatchRslts.GetTestRslt(testName, test.Part); + + if (tstRslt != null) + { + UpdateTempPressDensAmb(tstRslt); + tstRslt.DensityDiv = 0; + + /// Main results + tstRslt.MethodClass = TbfComponents.FindComponent(test.Method).ClassName; + tstRslt.StartTime = TestStartTime; + tstRslt.EndTime = TestEndTime; + tstRslt.FlowSetTime = 0; + tstRslt.TestTime = Convert.ToDouble(testParams.DurationPMax); /// [s] measurement time + tstRslt.PulsesMaster = 0; /// Pulses of the master flow meter (test total) + tstRslt.MassStartRaw = 0; + tstRslt.MassStart = 0; + tstRslt.MassEndRaw = 0; + tstRslt.MassEnd = 0; + tstRslt.FlowMass = 0; /// [kg/h] + tstRslt.FlowVolume = 0; /// [m3/h] + tstRslt.Buoyancy = Config.Formulas.Buoyancy(); + tstRslt.VolumeMaster = 0; /// [l] volume from the master flow meter + tstRslt.VolumeCTV = 0; /// [l] 1000.0f is because density is in [kg/m3] + tstRslt.ConstMasterRaw = 0; /// Convert the flow to [m3/h] + tstRslt.ConstMaster = 0; /// Convert the flow to [m3/h] + tstRslt.ErrorMaster = 0; + + tstRslt.ErrorFlagsMd = (ErrorFlagsComp != null) ? (sbyte)ErrorFlagsComp.Mode : (sbyte)0; + tstRslt.ErrorFlags = 0; + + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (test.Part != 0 && test.Part != Utils.PartNr(i + 1, BatchRslts.Batch.Compound)) continue; + + if (StateMachine.Procedure.MetersKind == MetersKind.Single) + { + Results.Entities.MeterTestRslt meterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.Single); + + if (meterRslt != null) + { + meterRslt.TestTime = tstRslt.TestTime; + meterRslt.Error = 0; + meterRslt.Passed = true; + meterRslt.TestDone = true; + tstRslt.TestDone = true; + } + } + else + { + Results.Entities.MeterTestRslt mainMeterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.CompoundMain); + Results.Entities.MeterTestRslt auxMeterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.CompoundAux); + + for (int isAux = 0; isAux <= 1; isAux++) /// 0=main, 1=aux + { + Results.Entities.MeterTestRslt meterRslt = (isAux == 0) ? mainMeterRslt : auxMeterRslt; + + if (meterRslt != null) + { + meterRslt.TestTime = tstRslt.TestTime; + meterRslt.Error = 0; + meterRslt.Passed = true; + } + } + + Results.Entities.MeterTestRslt compoundMeterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.Compound); + + if (compoundMeterRslt != null) + { + compoundMeterRslt.TestTime = tstRslt.TestTime; + compoundMeterRslt.Error = 0; + compoundMeterRslt.Passed = true; + mainMeterRslt.TestDone = auxMeterRslt.TestDone = compoundMeterRslt.TestDone = true; + tstRslt.TestDone = true; + } + } + } + + tstRslt.Components = Results.Entities.Components + .UpdateList(BatchRslts.ComponentsList, + new Results.Entities.Components((BenchInfo != null) ? BenchInfo.TestBenchId : 1, + (BenchInfo != null) ? BenchInfo.TestBenchName : "testbench", + inPath.Pump != null ? inPath.Pump.Name : string.Empty, + outPath.FlowMeter != null ? outPath.FlowMeter.Name : string.Empty, + outPath.Scale != null ? outPath.Scale.Name : string.Empty, + outPath.RegulValve != null ? outPath.RegulValve.Name : string.Empty, + outPath.Diverter != null ? outPath.Diverter.Name : string.Empty)); + + /// Update results + Bridge.OnTestCompleted(this, new TestCompletedEventArgs(testName, tstRslt)); + } + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.TransitionAfter)); + + /// Append the results to the CSV-file + allResults.Info(TestResult2CsvLine(testName, test.Part)); + + + stopTest: + + StopRecordingStatistics(); + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.TransitionAfter)); + + /// + /// Quit this sequence + /// + if (isLastRepetition || retVal == Event.UiCmdStop || retVal == Event.OpArgumentError + || retVal == Event.Error || retVal == Event.ConfigurationError) + { + State.Create(string.Format("{0}({1}) : Stopping diverter, gate, etc.", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(cBrd.StopPreviousOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.PreviousStopped)); + } + + /// Create a list with one item 'retVal' (default is Event.Done) and return it + IList retList = new List(1); + retList.Add(retVal); + return retList; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LeakTest/TestMethod.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LeakTest/TestMethod.cs new file mode 100644 index 00000000..846317da --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LeakTest/TestMethod.cs @@ -0,0 +1,38 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; +using TBF.BenchControl; + +namespace TBF.BenchControl.TestMethods.LeakTest +{ + public class TestMethod : ComponentBase, GenericDevices.ITestMethod + { + private static readonly ILog log = LogManager.GetLogger(typeof(TestMethod)); + public override string ToString() { return string.Format("TestMethods.LeakTest({0})", Cfg.ToString(1)); } + + public bool CanTest(MetersKind meters) { return true; } + public bool DoTransitions() { return true; } + + readonly TestMethodCfg testMethodCfg; + + public TestMethod() + { + } + + public TestMethod(Generic.IComponentCfg cfg) + : base(cfg) + { + testMethodCfg = cfg as TestMethodCfg; + log.Debug(this.ToString()); + } + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + return (new LeakTestSeq()).Execute(test, repetNr, isLastRepetition, testMethodCfg.TestParams); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LeakTest/TestMethodCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LeakTest/TestMethodCfg.cs new file mode 100644 index 00000000..980f96a1 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LeakTest/TestMethodCfg.cs @@ -0,0 +1,49 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.LeakTest +{ + public class TestMethodCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestMethodCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new TestMethodCfgCtrl(); } + + /// Test parameters + [XmlIgnore] + public LeakTestParams TestParams; + public override IParamsProvider GetRuntimeTestParamsProvider() { return TestParams; } + public override IParamsProvider CreateTestParamsProvider() { return new LeakTestParams(true); } + public override IParamsProvider GetUITestParamsProvider(Test test) + { + return (test.Method == Name) ? base.GetUITestParamsProvider(test) : null; + } + + /// Private parameterless constructor invoked by all other (public) constructors + TestMethodCfg() + { + TestParams = new LeakTestParams(true); + } + + public TestMethodCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + ParentName = string.Empty; + Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}", Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LeakTest/TestMethodCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LeakTest/TestMethodCfgCtrl.cs new file mode 100644 index 00000000..24803f71 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LeakTest/TestMethodCfgCtrl.cs @@ -0,0 +1,69 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.LeakTest +{ + public partial class TestMethodCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + TestMethodCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as TestMethodCfg; + Redraw(); + } + } + + public TestMethodCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LeakTest/TestMethodCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LeakTest/TestMethodCfgCtrl.designer.cs new file mode 100644 index 00000000..6e7fc960 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LeakTest/TestMethodCfgCtrl.designer.cs @@ -0,0 +1,86 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.TestMethods.LeakTest +{ + partial class TestMethodCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(137, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 5; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(27, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 4; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(134, 33); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 3; + this.classNameLabel.Text = "ComonentName"; + // + // BasicPrinterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "BasicPrinterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LeakTest/TestMethodCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LeakTest/TestMethodCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LeakTest/TestMethodCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LeakTest/TestMethodFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LeakTest/TestMethodFactory.cs new file mode 100644 index 00000000..2e305025 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LeakTest/TestMethodFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.LeakTest +{ + public class TestMethodFactory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { TestMethod.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new TestMethod(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new TestMethod(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this.GetType().Namespace.Substring(29), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LiveStream/CfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LiveStream/CfgCtrl.cs new file mode 100644 index 00000000..d41987f0 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LiveStream/CfgCtrl.cs @@ -0,0 +1,80 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.LiveStream +{ + public partial class CfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + LiveStreamCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as LiveStreamCfg; + Redraw(); + } + } + + public CfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + hiResolutionCheckBox.Checked = config.HiResolution; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + hiResolutionCheckBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + return CfgUpdateFlags.None; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + if (config.Name != nameTextBox.Text) + { + config.Name = nameTextBox.Text; + flags |= (CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + } + + if (config.HiResolution != hiResolutionCheckBox.Checked) + { + config.HiResolution = hiResolutionCheckBox.Checked; + flags |= (CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd); + } + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LiveStream/CfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LiveStream/CfgCtrl.designer.cs new file mode 100644 index 00000000..d722e11a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LiveStream/CfgCtrl.designer.cs @@ -0,0 +1,97 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.TestMethods.LiveStream +{ + partial class CfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.hiResolutionCheckBox = new System.Windows.Forms.CheckBox(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(134, 69); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 7; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(24, 72); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 6; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(131, 43); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 5; + this.classNameLabel.Text = "ComonentName"; + // + // hiResolutionCheckBox + // + this.hiResolutionCheckBox.AutoSize = true; + this.hiResolutionCheckBox.Enabled = false; + this.hiResolutionCheckBox.Location = new System.Drawing.Point(134, 104); + this.hiResolutionCheckBox.Name = "hiResolutionCheckBox"; + this.hiResolutionCheckBox.Size = new System.Drawing.Size(96, 17); + this.hiResolutionCheckBox.TabIndex = 8; + this.hiResolutionCheckBox.Text = "High resolution"; + this.hiResolutionCheckBox.UseVisualStyleBackColor = true; + // + // CfgCtrl + // + this.Controls.Add(this.hiResolutionCheckBox); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "CfgCtrl"; + this.Size = new System.Drawing.Size(300, 240); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.CheckBox hiResolutionCheckBox; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LiveStream/CfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LiveStream/CfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LiveStream/CfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LiveStream/Component.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LiveStream/Component.cs new file mode 100644 index 00000000..be35884a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LiveStream/Component.cs @@ -0,0 +1,38 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; +using TBF.BenchControl; + +namespace TBF.BenchControl.TestMethods.LiveStream +{ + public class Component : ComponentBase, GenericDevices.ITestMethod + { + private static readonly ILog log = LogManager.GetLogger(typeof(Component)); + public override string ToString() { return string.Format("TestMethods.LiveStream({0})", Cfg.ToString(1)); } + + public bool CanTest(MetersKind meters) { return true; } + public bool DoTransitions() { return false; } + + readonly LiveStreamCfg cfg; + + public Component() + { + } + + public Component(Generic.IComponentCfg cfg) + : base(cfg) + { + log.Debug(this.ToString()); + this.cfg = cfg as LiveStreamCfg; + } + + public IList Execute(Test test, int idummy, bool bdummy) + { + return (new LiveStreamSeq()).Execute(test, cfg.HiResolution); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LiveStream/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LiveStream/Factory.cs new file mode 100644 index 00000000..856ec148 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LiveStream/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.LiveStream +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Component.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Component(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Component(cfg); } + + public IComponentCfg DefaultConfig() { return new LiveStreamCfg(this, this.GetType().Namespace.Substring(29)); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(LiveStreamCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LiveStream/LiveStreamCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LiveStream/LiveStreamCfg.cs new file mode 100644 index 00000000..e7f1900f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LiveStream/LiveStreamCfg.cs @@ -0,0 +1,41 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.LiveStream +{ + public class LiveStreamCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(LiveStreamCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new CfgCtrl(); } + + + public bool HiResolution; + + + /// Private parameterless constructor invoked by all other (public) constructors + LiveStreamCfg() {} + + public LiveStreamCfg(IComponentFactory factory, string name) + : this() + { + this.Factory = factory; + Name = name; + ParentName = string.Empty; + HiResolution = false; + } + + public string ToString(int i) + { + return string.Format("Name={0}, HiResolution={1}", Name, HiResolution ? Strings.yes : Strings.no); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LiveStream/LiveStreamSeq.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LiveStream/LiveStreamSeq.cs new file mode 100644 index 00000000..df5e50a6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/LiveStream/LiveStreamSeq.cs @@ -0,0 +1,67 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using log4net; +using Config.Entities; +using TBF.UiBridge; + +namespace TBF.BenchControl.TestMethods.LiveStream +{ + public class LiveStreamSeq : Sequences.SequenceBase + { + private static readonly ILog log = LogManager.GetLogger(typeof(LiveStreamSeq)); + + + public IList Execute(Test test, bool hiResolution) + { + IList e = new List(); /// Events from currently running operations + Event retVal = Event.Done; + + /// Operations + checkUiOp = new Operations.CheckUIOp(true); + + IList cameras = new List(); + IList liveStreamOps = new List(); + + foreach (var rr in sensPath.RegisterReaders) + { + if (rr is GenericDevices.IRoiForFixedStart) + { + GenericDevices.ICamera camera = (rr as GenericDevices.IRoiForFixedStart).Camera; + if (!cameras.Contains(camera)) + { + cameras.Add(camera); + liveStreamOps.Add(camera.LiveStreamOp(hiResolution)); + } + } + } + + //------------------------------------------------ + Bridge.OnActivity(this, test.Method); + //------------------------------------------------ + State.Create(string.Format("{0}({1}) : Live stream", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(new Operations.MessageBoxOp(TBF.Resources.Strings.Camera)) + .AddOperations(liveStreamOps) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, 1, Config.Entities.Progress.Test)); + + if (e.Contains(Event.Error)) { retVal = Event.Error; break; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; break; } + } + while (!e.Contains(Event.OK)); + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, 1, Config.Entities.Progress.Completed)); + + /// Create a list with one item 'retVal' (default is Event.Done) and return it + IList retList = new List(1); + retList.Add(retVal); + return retList; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/OuterLoop/End/Component.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/OuterLoop/End/Component.cs new file mode 100644 index 00000000..34259e7a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/OuterLoop/End/Component.cs @@ -0,0 +1,39 @@ +/// +/// Copyright (c) 2016-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; + +namespace TBF.BenchControl.TestMethods.OuterLoop.End +{ + public class Component : ComponentBase, GenericDevices.ITestMethod + { + private static readonly ILog log = LogManager.GetLogger(typeof(Component)); + public override string ToString() + { + return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); + } + + public bool CanTest(MetersKind meters) { return true; } + public bool DoTransitions() { return false; } + + public Component() + { + } + + public Component(Generic.IComponentCfg cfg) + : base(cfg) + { + log.Debug(this.ToString()); + } + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + IList events = new List(); + events.Add(Event.OuterLoopEnd); + return events; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/OuterLoop/End/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/OuterLoop/End/Factory.cs new file mode 100644 index 00000000..a6813f60 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/OuterLoop/End/Factory.cs @@ -0,0 +1,27 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; +using TBF.BenchControl.Configs.NameOnly; + +namespace TBF.BenchControl.TestMethods.OuterLoop.End +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Component.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Component(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Component(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this.GetType().Namespace.Substring(29), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/OuterLoop/Start/Component.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/OuterLoop/Start/Component.cs new file mode 100644 index 00000000..06f18afa --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/OuterLoop/Start/Component.cs @@ -0,0 +1,39 @@ +/// +/// Copyright (c) 2016-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; + +namespace TBF.BenchControl.TestMethods.OuterLoop.Start +{ + public class Component : ComponentBase, GenericDevices.ITestMethod + { + private static readonly ILog log = LogManager.GetLogger(typeof(Component)); + public override string ToString() + { + return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); + } + + public bool CanTest(MetersKind meters) { return true; } + public bool DoTransitions() { return false; } + + public Component() + { + } + + public Component(Generic.IComponentCfg cfg) + : base(cfg) + { + log.Debug(this.ToString()); + } + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + IList events = new List(); + events.Add(Event.OuterLoopStart); + return events; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/OuterLoop/Start/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/OuterLoop/Start/Factory.cs new file mode 100644 index 00000000..e106733b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/OuterLoop/Start/Factory.cs @@ -0,0 +1,27 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; +using TBF.BenchControl.Configs.NameOnly; + +namespace TBF.BenchControl.TestMethods.OuterLoop.Start +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Component.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Component(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Component(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this.GetType().Namespace.Substring(29), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PMaxTest/PMaxTestParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PMaxTest/PMaxTestParams.cs new file mode 100644 index 00000000..d23aae90 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PMaxTest/PMaxTestParams.cs @@ -0,0 +1,137 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.PMaxTest +{ + public class PMaxTestParams : TestParamsBase, IParamsProvider, ITestParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(PMaxTestParams) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public float PressureLo; /// Presure range low limit in [bar] + public float PressureHi; /// Presure range high limit in [bar] + public int DurationPMax; /// Duration of the test in [s] + + public override void InitializeAll() + { + PressureLo = 5.0f; /// [bar] + PressureHi = 6.0f; /// [bar] + DurationPMax = 60; + } + + + string[] paramNames = new string[] + { + Strings.Pressure_lo_bar, + Strings.Pressure_hi_bar, + Strings.Duration_s, + }; + public override string ParamName(int i) { return paramNames[i]; } + public override int ParamsCount() { return paramNames.Length; } + + public override string ToString(int i) + { + switch (i) + { + case 0: return PressureLo.ToString(); /// [bar] + case 1: return PressureHi.ToString(); /// [bar] + case 2: return DurationPMax.ToString(); + default: return string.Empty; + } + } + + public CfgUpdateFlags UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: PressureLo = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 1: PressureHi = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 2: DurationPMax = int.Parse(strValue); return CfgUpdateFlags.None; + default: return CfgUpdateFlags.None; + } + } + + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + + float dummy; + int iDummy; + switch (i) + { + case 0: + case 1: + if (Utils.TryParseUFloat(strValue, out dummy)) return true; + break; + case 2: + if (int.TryParse(strValue, out iDummy)) return true; + break; + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(PMaxTestParams prms) + { + prms.PressureLo = this.PressureLo; + prms.PressureHi = this.PressureHi; + prms.DurationPMax = this.DurationPMax; + } + + public IParamsProvider Clone() + { + PMaxTestParams pars = new PMaxTestParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateFromDbEntity(ComponentTest dbEntity) + { + if (dbEntity == null) return; + try + { + PMaxTestParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as PMaxTestParams; + + testParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + test = dbEntity.Test; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + /// + /// Parameterless constructor initializes the parameters + /// + public PMaxTestParams() + { + } + + public PMaxTestParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public PMaxTestParams(ComponentTest testParamsEntity, string componentName, Test test) + { + this.testParamsEntity = testParamsEntity; + this.componentName = componentName; + this.test = test; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PMaxTest/PMaxTestSeq.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PMaxTest/PMaxTestSeq.cs new file mode 100644 index 00000000..787d123c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PMaxTest/PMaxTestSeq.cs @@ -0,0 +1,310 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Text; +using log4net; +using Config.Entities; +using TBF.BenchControl; +using TBF.Boxes; +using TBF.Resources; +using TBF.UiBridge; + +namespace TBF.BenchControl.TestMethods.PMaxTest +{ + public class PMaxTestSeq : Sequences.SequenceBase + { + private static readonly ILog log = LogManager.GetLogger(typeof(PMaxTestSeq)); + + /// + /// Pressure test sequence + /// + /// Test entity + /// + /// Event.Done . . . . . . . OK + /// Event.UiCmdStop . . . . Stopped by the user using the on-screen button STOP + /// Event.OpArgumentError . Target flow is out of range + /// Event.Error . . . . . . Unspecified error + /// + public IList Execute(Config.Entities.Test test, int repetitionNr, bool isLastRepetition, PMaxTestParams testParams) + { + Elde.ControlBoardDev cBrd = StateMachine.ControlBoard; + + IList e = new List(); /// Events from currently running operations + Event retVal = Event.Done; + checkUiOp = new Operations.CheckUIOp(true); /// Runs in more then one state + + processDataLoggingOp = new TBF.BenchControl.Operations.ProcessDataLoggingOp(processDataLogger, this, false); + + /// Start the test, initialize test results + Bridge.OnTestSelected(this, new TestSelectedEventArgs(test, 1, inPath, benchPath, outPath, sensPath, 0)); + string testName = Results.Utils.GetTestName(test.Name, test.Repeats, 1); + TestStartTime = DateTime.Now; + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Starting_the_pump); + //------------------------------------------------ + if (inPath.Pump is GenericDevices.IPumpFM) (inPath.Pump as GenericDevices.IPumpFM).TurnOn(test.PumpPower); + + State.Create(string.Format("{0}({1}) : Starting the pump", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) +// .AddOperation(new Operations.SetAllRegulValvesOp(inPath.RegulValves, inPath.RegulValvesPct, 60)) + .AddOperation(inPath.Pump != null ? cBrd.SetValvesOp(inPath.Pump, null) : null) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } + while (e.Contains(Event.ValvesBusy) /* || !e.Contains(Event.AllPositionsReached)*/); + + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Setting_the_water_pressure); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + //------------------------------------------------ + + float pumpPower = test.PumpPower; + int startTime = StateMachine.Time; + + while (true) + { + if (inPath.Pump is GenericDevices.IPumpFM) (inPath.Pump as GenericDevices.IPumpFM).TurnOn(pumpPower); + + State.Create(string.Format("{0}({1}) : Setting the water pressure", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(new Operations.TimerOp(5)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Next)) goto pressure_set; + } + while (e.Contains(Event.TimerBusy)); + + UiBridge.Bridge.OnLog(this, string.Format("time = {0}, pump_power = {1}%, pressure_up = {2}bar, pressure_down = {3}bar\r\n", + StateMachine.Time - startTime, + pumpPower.ToString("F0"), + PressUp.ToString(), + PressDown.ToString())); + + float step = (pumpPower < 40.0f) ? 4.7f : ((pumpPower < 60.0f) ? 3.3f : ((pumpPower < 80.0f) ? 2.2f : ((pumpPower < 90.0f) ? 1.5f : 1.2f))); + + if (PressDown.Val < testParams.PressureLo) + { + if (pumpPower == 100.0f) break; /// Already at max. pump power -> Quit loop + pumpPower = Math.Min(pumpPower + step, 100.0f); /// Limit max. power to 100% + } + else if (PressDown.Val > testParams.PressureHi) + { + if (pumpPower == 0) break; /// Already at min. pump power -> Quit loop + pumpPower = Math.Max(pumpPower - step, 0); /// Limit min. power to 0% + } + else + { + break; /// Pressure is in the range -> Quit loop + } + } + + pressure_set: + + StartNewStatistics(StateMachine.Time, BatchRslts.Batch.BatchNr, test.Name, repetitionNr); + UpdateAllStatistics(StateMachine.Time); + + startTime = StateMachine.Time; + int endTime = startTime + testParams.DurationPMax; + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Test_in_progress); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + //------------------------------------------------ + State.Create(string.Format("{0}({1}) : Starting the test", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(new Operations.TimerOp(testParams.DurationPMax)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + + UpdateAllStatistics(StateMachine.Time); + + int remainingTime = Math.Max(endTime - StateMachine.Time, 0); + if (remainingTime > 60) + { + Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", Strings.Test_in_progress, remainingTime / 60, "min", remainingTime % 60, Strings.sec)); + } + else + { + Bridge.OnActivity(this, string.Format("{0} ... {1} s", Strings.Test_in_progress, remainingTime)); + } + } + while (e.Contains(Event.TimerBusy)); + + /// Measurement loop - end + + test_completed: + + StopRecordingStatistics(); + + TestEndTime = DateTime.Now; + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Test_completed); + //------------------------------------------------ + + /// Make sure the CycleBeginForm is closed so that water meter data (s/n) can be copied into results + if (UIFlowControl.Stop == WaitBeginFormClosed()) goto stopTest; + + /// + /// Populate TestResult data entity with data + /// + Results.Entities.TestRslt tstRslt = BatchRslts.GetTestRslt(testName, test.Part); + + if (tstRslt != null) + { + UpdateTempPressDensAmb(tstRslt); + tstRslt.DensityDiv = 0; + + /// Main results + tstRslt.MethodClass = TbfComponents.FindComponent(test.Method).ClassName; + tstRslt.StartTime = TestStartTime; + tstRslt.EndTime = TestEndTime; + tstRslt.FlowSetTime = 0; + tstRslt.TestTime = Convert.ToDouble(testParams.DurationPMax); /// [s] measurement time + tstRslt.PulsesMaster = 0; /// Pulses of the master flow meter (test total) + tstRslt.MassStartRaw = 0; + tstRslt.MassStart = 0; + tstRslt.MassEndRaw = 0; + tstRslt.MassEnd = 0; + tstRslt.FlowMass = 0; /// [kg/h] + tstRslt.FlowVolume = 0; /// [m3/h] + tstRslt.Buoyancy = Config.Formulas.Buoyancy(); + tstRslt.VolumeMaster = 0; /// [l] volume from the master flow meter + tstRslt.VolumeCTV = 0; /// [l] 1000.0f is because density is in [kg/m3] + tstRslt.ConstMasterRaw = 0; /// Convert the flow to [m3/h] + tstRslt.ConstMaster = 0; /// Convert the flow to [m3/h] + tstRslt.ErrorMaster = 0; + + tstRslt.ErrorFlagsMd = (ErrorFlagsComp != null) ? (sbyte)ErrorFlagsComp.Mode : (sbyte)0; + tstRslt.ErrorFlags = 0; + + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (test.Part != 0 && test.Part != Utils.PartNr(i + 1, BatchRslts.Batch.Compound)) continue; + + if (StateMachine.Procedure.MetersKind == MetersKind.Single) + { + Results.Entities.MeterTestRslt meterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.Single); + + if (meterRslt != null) + { + meterRslt.TestTime = tstRslt.TestTime; + meterRslt.Error = 0; + meterRslt.Passed = true; + meterRslt.TestDone = true; + tstRslt.TestDone = true; + } + } + else + { + Results.Entities.MeterTestRslt mainMeterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.CompoundMain); + Results.Entities.MeterTestRslt auxMeterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.CompoundAux); + + for (int isAux = 0; isAux <= 1; isAux++) /// 0=main, 1=aux + { + Results.Entities.MeterTestRslt meterRslt = (isAux == 0) ? mainMeterRslt : auxMeterRslt; + + if (meterRslt != null) + { + meterRslt.TestTime = tstRslt.TestTime; + meterRslt.Error = 0; + meterRslt.Passed = true; + } + } + + Results.Entities.MeterTestRslt compoundMeterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.Compound); + + if (compoundMeterRslt != null) + { + compoundMeterRslt.TestTime = tstRslt.TestTime; + compoundMeterRslt.Error = 0; + compoundMeterRslt.Passed = true; + mainMeterRslt.TestDone = auxMeterRslt.TestDone = compoundMeterRslt.TestDone = true; + tstRslt.TestDone = true; + } + } + } + + tstRslt.Components = Results.Entities.Components + .UpdateList(BatchRslts.ComponentsList, + new Results.Entities.Components((BenchInfo != null) ? BenchInfo.TestBenchId : 1, + (BenchInfo != null) ? BenchInfo.TestBenchName : "testbench", + inPath.Pump != null ? inPath.Pump.Name : string.Empty, + outPath.FlowMeter != null ? outPath.FlowMeter.Name : string.Empty, + outPath.Scale != null ? outPath.Scale.Name : string.Empty, + outPath.RegulValve != null ? outPath.RegulValve.Name : string.Empty, + outPath.Diverter != null ? outPath.Diverter.Name : string.Empty)); + + /// Update results + Bridge.OnTestCompleted(this, new TestCompletedEventArgs(testName, tstRslt)); + } + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.TransitionAfter)); + + /// Append the results to the CSV-file + allResults.Info(TestResult2CsvLine(testName, test.Part)); + + + stopTest: + + StopRecordingStatistics(); + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.TransitionAfter)); + + /// + /// Quit this sequence + /// + if (isLastRepetition || retVal == Event.UiCmdStop || retVal == Event.OpArgumentError + || retVal == Event.Error || retVal == Event.ConfigurationError) + { + State.Create(string.Format("{0}({1}) : Stopping diverter, gate, etc.", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(cBrd.StopPreviousOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.PreviousStopped)); + } + + /// Create a list with one item 'retVal' (default is Event.Done) and return it + IList retList = new List(1); + retList.Add(retVal); + return retList; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PMaxTest/TestMethod.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PMaxTest/TestMethod.cs new file mode 100644 index 00000000..9211135a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PMaxTest/TestMethod.cs @@ -0,0 +1,38 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; +using TBF.BenchControl; + +namespace TBF.BenchControl.TestMethods.PMaxTest +{ + public class TestMethod : ComponentBase, GenericDevices.ITestMethod + { + private static readonly ILog log = LogManager.GetLogger(typeof(TestMethod)); + public override string ToString() { return string.Format("TestMethods.PMaxTest({0})", Cfg.ToString(1)); } + + public bool CanTest(MetersKind meters) { return true; } + public bool DoTransitions() { return true; } + + readonly TestMethodCfg testMethodCfg; + + public TestMethod() + { + } + + public TestMethod(Generic.IComponentCfg cfg) + : base(cfg) + { + testMethodCfg = cfg as TestMethodCfg; + log.Debug(this.ToString()); + } + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + return (new PMaxTestSeq()).Execute(test, repetNr, isLastRepetition, testMethodCfg.TestParams); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PMaxTest/TestMethodCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PMaxTest/TestMethodCfg.cs new file mode 100644 index 00000000..f27e407d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PMaxTest/TestMethodCfg.cs @@ -0,0 +1,49 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.PMaxTest +{ + public class TestMethodCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestMethodCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new TestMethodCfgCtrl(); } + + /// Test parameters + [XmlIgnore] + public PMaxTestParams TestParams; + public override IParamsProvider GetRuntimeTestParamsProvider() { return TestParams; } + public override IParamsProvider CreateTestParamsProvider() { return new PMaxTestParams(true); } + public override IParamsProvider GetUITestParamsProvider(Test test) + { + return (test.Method == Name) ? base.GetUITestParamsProvider(test) : null; + } + + /// Private parameterless constructor invoked by all other (public) constructors + TestMethodCfg() + { + TestParams = new PMaxTestParams(true); + } + + public TestMethodCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + ParentName = string.Empty; + Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}", Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PMaxTest/TestMethodCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PMaxTest/TestMethodCfgCtrl.cs new file mode 100644 index 00000000..d72e2b58 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PMaxTest/TestMethodCfgCtrl.cs @@ -0,0 +1,69 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.PMaxTest +{ + public partial class TestMethodCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + TestMethodCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as TestMethodCfg; + Redraw(); + } + } + + public TestMethodCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PMaxTest/TestMethodCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PMaxTest/TestMethodCfgCtrl.designer.cs new file mode 100644 index 00000000..4d151dcf --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PMaxTest/TestMethodCfgCtrl.designer.cs @@ -0,0 +1,86 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.TestMethods.PMaxTest +{ + partial class TestMethodCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(137, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 5; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(27, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 4; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(134, 33); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 3; + this.classNameLabel.Text = "ComonentName"; + // + // BasicPrinterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "BasicPrinterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PMaxTest/TestMethodCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PMaxTest/TestMethodCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PMaxTest/TestMethodCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PMaxTest/TestMethodFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PMaxTest/TestMethodFactory.cs new file mode 100644 index 00000000..f1adce06 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PMaxTest/TestMethodFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.PMaxTest +{ + public class TestMethodFactory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { TestMethod.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new TestMethod(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new TestMethod(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this.GetType().Namespace.Substring(29), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/Factory.cs new file mode 100644 index 00000000..7816784c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/Factory.cs @@ -0,0 +1,30 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; +using TBF.BenchControl.Configs.NameOnly; + +namespace TBF.BenchControl.TestMethods.PulsesTest +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { TestMethod.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new TestMethod(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new TestMethod(cfg); } + + public IComponentCfg DefaultConfig() + { + return new TestMethodCfg(this.GetType().Namespace.Substring(29), this); + } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/PulsesTestSeq.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/PulsesTestSeq.cs new file mode 100644 index 00000000..7205706a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/PulsesTestSeq.cs @@ -0,0 +1,496 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Text; +using log4net; +using Config.Entities; +using TBF.BenchControl; +using TBF.Boxes; +using TBF.Resources; +using TBF.UiBridge; + +namespace TBF.BenchControl.TestMethods.PulsesTest +{ + public class PulseOutputsTestSeq : Sequences.SequenceBase + { + private static readonly ILog log = LogManager.GetLogger(typeof(PulseOutputsTestSeq)); + + System.Windows.Forms.Form modelessDlg; + /// + delegate void ErrorsFormDlgt(PulseOutputsTestSeq myRef, IList waterMeters); + /// + void OpenWMErrorsForm(PulseOutputsTestSeq myRef, IList waterMeters) + { +#pragma warning disable 162 /// Disables 'Unreachable code detected' warning + + if (Config.Data.WMsCount > 12) + { + myRef.modelessDlg = new WMPulsesForm24(waterMeters); + } + else if (Config.Data.WMsCount > 6) + { + myRef.modelessDlg = new WMPulsesForm12(waterMeters); + } + else + { + myRef.modelessDlg = new WMPulsesForm(waterMeters); + } + +#pragma warning restore 162 /// Disables 'Unreachable code detected' warning + + modelessDlg.Show(); + } + + /// + /// Adjustment method sequence + /// + /// Test entity + /// + /// Event.Done . . . . . . . OK + /// Event.UiCmdStop . . . . Stopped by the user using the on-screen button STOP + /// Event.OpArgumentError . Target flow is out of range + /// Event.Error . . . . . . Unspecified error + /// + public IList Execute(Test test, int repetitionNr, bool isLastRepetition, TestParams testParams, DebugMode mode) + { + float simulatedError = 4.5f; /// % + + Elde.ControlBoardDev cBrd = StateMachine.ControlBoard; + + IList e = new List(); /// Events from currently running operations + Event retVal = Event.Done; + checkUiOp = new Operations.CheckUIOp(true); /// Runs in more then one state + + LtrPerRefPulse = outPath.FlowMeter.LtrPerPulse; /// [ltr/pulse], nominal flow in [m3/h] + + /// Notes: + /// float timeHr = volumeLtr / (1000.0f * targetFlow); + /// float timeSec = 3600.0f * timeHr; + /// int refPulses = (int)(timeSec * (2000.0f * targetFlow / pOut.FlowMeter.NominalFlow)); + int totalPulses = (int)(test.Volume / LtrPerRefPulse + 0.5f); + + int rangeIx = 0; /// Default range, used for non-Elde flowmeters + if (outPath.FlowMeter is Elde.FlowMeter.FlowMeter) + { + Elde.FlowMeter.FlowMeter eldeFM = outPath.FlowMeter as Elde.FlowMeter.FlowMeter; + rangeIx = -1; /// Indicates invalid range + for (int r = 0; r <= 5; r++) + { + if (eldeFM.RangeEnabled(r) && eldeFM.GetTempLo(r) <= test.TempLimLo + && eldeFM.GetTempHi(r) >= test.TempLimHi) + { + rangeIx = r; + } + } + + if (rangeIx == -1) + { + Bridge.OnError(this, Strings.Flow_meter_temperature_range_does_not_fit_this_test_conditions); + retVal = Event.UiCmdStop; + goto stopTestWOStoppingDivGateEtc; + } + } + + processDataLoggingOp = new TBF.BenchControl.Operations.ProcessDataLoggingOp(processDataLogger, this, false); + + /// Start the test, initialize test results + Bridge.OnTestSelected(this, new TestSelectedEventArgs(test, repetitionNr, inPath, benchPath, outPath, sensPath, totalPulses)); + string testName = Results.Utils.GetTestName(test.Name, test.Repeats, repetitionNr); + TestStartTime = DateTime.Now; + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + int flowSetTime0 = StateMachine.Time; + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Starting_the_pump); + //------------------------------------------------ + if (inPath.Pump is GenericDevices.IPumpFM) (inPath.Pump as GenericDevices.IPumpFM).TurnOn(test.PumpPower); + /// + State.Create("Adjustment : Starting the pump") + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) +// .AddOperation(new Operations.SetAllRegulValvesOp(inPath.RegulValves, inPath.RegulValvesPct, 60)) + .AddOperation(inPath.Pump != null ? cBrd.SetValvesOp(inPath.Pump, null) : null) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + + } + while (e.Contains(Event.ValvesBusy) /* || !e.Contains(Event.AllPositionsReached)*/); + + + if (test.TimePump2StartV > 0) + { + State.Create(string.Format("{0}({1}) : Waiting after the pump started", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(new Operations.TimerOp(test.TimePump2StartV)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + } + + + if (benchPath.StopBFValve != null) + { + State.Create(string.Format("{0}({1}) : Opening the stop backflow valve", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(benchPath.StopBFValve, null)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } + while (!e.Contains(Event.ValvesSet)); + } + + + if (test.TimeBeforeFlow > 0) + { + State.Create(string.Format("{0}({1}) : Waiting before flow setting process starts", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(new Operations.TimerOp(test.TimeBeforeFlow)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + } + + + setting_flow: + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Setting_the_flow); + //------------------------------------------------ + State.Create("Adjustment : Setting the flow") + .AddOperation(checkUiOp) + .AddOperation(outPath.RegulValve.SetFlowOp(outPath.FlowMeter, test.Qfrom, test.Qto, outPath.PidCoef, RefFlow, 600)) /// timeout = 10 min. + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (e.Contains(Event.OpArgumentError)) { retVal = Event.OpArgumentError; goto stopTest; } + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.RegulValveTimeOut)) + { + Bridge.OnError(this, Strings.Flow_adjustment_failed); + retVal = Event.UiCmdStop; + goto stopTest; + } + if (e.Contains(Event.Next)) goto flow_set; + } + while (!e.Contains(Event.FlowReached)); + + flow_set: + + int flowSetTime = StateMachine.Time - flowSetTime0; + + if (test.DoControlWaterTemp && benchPath.TempMtrUp != null && benchPath.TempMtrDown != null) + { + //--------------------------------------------------- + Bridge.OnActivity(this, Strings.Setting_temperature); + //--------------------------------------------------- + + State.Create(string.Format("{0}({1}) : Wait until the water temperature is within limits", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Next)) goto temperature_set; + + if (TempUp.Val >= test.TempLimLo && TempUp.Val <= test.TempLimHi && + TempDown.Val >= test.TempLimLo && TempDown.Val <= test.TempLimHi) + { + goto temperature_set; + } + } + while (true); + } + + temperature_set: + + /// Show the modeless dialog with error indication + Program.MainWnd.Invoke(new ErrorsFormDlgt(OpenWMErrorsForm), new object[] { this, WaterMeters }); + + loop: + int time = StateMachine.Time; + double currentFlow = RefFlow.Val; + + + /// + /// Prepare cameras, ROI-s and measurementOperations + /// + + /// Find ROI-s + IList rois = new List(); + foreach (var rr in sensPath.RegisterReaders) + { + GenericDevices.IRoi roi = rr as GenericDevices.IRoi; + if (roi != null && roi.Detected) + { + rois.Add(roi); + } + } + + /// Find cameras + IList cameras = new List(); + foreach (var roi in rois) + { + if (roi.Camera != null && !cameras.Contains(roi.Camera)) + { + roi.Camera.ClearRoiParams(); + cameras.Add(roi.Camera); + } + } + + /// Register ROI-parameters to cameras + foreach (var roi in rois) roi.RegisterRoiToCamera(); + + /// Prepare measurementOperations + IList measureOperations = new List(); + foreach (var camera in cameras) measureOperations.Add(camera.MeasurementOp()); + + + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Test_in_progress); + //------------------------------------------------ + if (mode == Config.Entities.DebugMode.Simulate) + { + /// TODO: Reimplement + //tstRslt = MakeSimulated(test, 1, simulatedError); + simulatedError *= 0.6f; + + State.Create("Adjustment : Simulating the test") + .AddOperation(checkUiOp) + .AddOperation(new Operations.TimerOp(5)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + } + else + { + State.Create("Adjustment : Starting the test") + .AddOperation(checkUiOp) + .AddOperations(measureOperations) + .AddOperation(cBrd.StartMeasurementOp(outPath, Elde.TestMethods.Synchro, + test.Qfrom, test.Qto, totalPulses, (float)test.TolerRed)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.MeasurementStarted)); + + /// Measurement loop - preparation + readRegistersOp = new Operations.ReadMoreRegistersOp(sensPath.RegisterReaders); + queryEnd1 = cBrd.QueryMeasurementEndOp(); + queryEnd2 = cBrd.QueryMeasurementEndOp(); + + StartNewStatistics(StateMachine.Time, BatchRslts.Batch.BatchNr, test.Name, repetitionNr); + + /// Measurement loop - begin + while (true) + { + //-------------------------------- + switch (ReadRegistersTempPressAmbient(measureOperations, true)) + { + case Event.Error: { retVal = Event.Error; goto stopTest; } + case Event.UiCmdStop: { retVal = Event.UiCmdStop; goto stopTest; } + case Event.MeasurementCompleted: goto one_test_completed; + } + + RefFreq.Val = cBrd.ReferenceFreq; + RefFlow.Val = cBrd.ReferenceFlow; + UpdateAllStatistics(StateMachine.Time); + + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + } + /// Measurement loop - end + + one_test_completed: + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Adjustment_in_progress); + //------------------------------------------------ + + TestEndTime = DateTime.Now; + + /// Make sure the CycleBeginForm is closed so that water meter data (s/n) can be copied into results + if (UIFlowControl.Stop == WaitBeginFormClosed()) goto stopTest; + + /// + /// Populate TestResult data entity with data + /// + Results.Entities.TestRslt tstRslt = BatchRslts.GetTestRslt(testName, test.Part); + + if (tstRslt != null) + { + UpdateTempPressDensAmb(tstRslt); + + /// Main results + tstRslt.MethodClass = TbfComponents.FindComponent(test.Method).ClassName; + tstRslt.StartTime = TestStartTime; + tstRslt.EndTime = TestEndTime; + tstRslt.FlowSetTime = flowSetTime; + tstRslt.TestTime = cBrd.TTime; /// [s] measurement time + tstRslt.PulsesMaster = Convert.ToDouble(cBrd.EtPulses(0)); /// Pulses of the master flow meter (test total) + tstRslt.MassStart = 0; + tstRslt.MassEnd = 0; + tstRslt.FlowMass = 0; /// [kg/h] + tstRslt.FlowVolume = 3.6 * LtrPerRefPulse * cBrd.EtPulses(0) / tstRslt.TestTime; /// [m3/h] + tstRslt.Buoyancy = Config.Formulas.Buoyancy(); + tstRslt.VolumeMaster = LtrPerRefPulse * tstRslt.PulsesMaster; /// [l] volume from the master flow meter + tstRslt.ConstMasterRaw = outPath.FlowMeter.LtrPerPulse; /// Uncorrected master flowmeter coefficient + tstRslt.ConstMasterCorr = outPath.FlowMeter.LtrPerPulseCorrected(tstRslt.FlowVolume, rangeIx); /// Corrected master pulses per liter + tstRslt.ConstMaster = tstRslt.ConstMasterCorr; /// Corrected master pulses per liter + tstRslt.VolumeCTV = tstRslt.ConstMaster * tstRslt.PulsesMaster; /// [l] 1000.0f is because density is in [kg/m3] + tstRslt.ErrorMaster = 0.0f; /// Cannot be determined without the collected water mass measurement + + tstRslt.FlowMean = (float)RefFlowStat.Average; + tstRslt.FlowStart = (float)RefFlowStat.First; + tstRslt.FlowEnd = (float)RefFlowStat.Last; + tstRslt.FlowMin = (float)RefFlowStat.Min; + tstRslt.FlowMax = (float)RefFlowStat.Max; + + tstRslt.DiverterStart = 0; + tstRslt.DiverterEnd = 0; + tstRslt.ErrorFlagsMd = (ErrorFlagsComp != null) ? (sbyte)ErrorFlagsComp.Mode : (sbyte)0; + tstRslt.ErrorFlags = (ErrorFlagsComp != null) ? ErrorFlagsComp.GetErrorFlags(tstRslt, false, false, 0, 0) : 0; + + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (test.Part != 0 && test.Part != Utils.PartNr(i + 1, BatchRslts.Batch.Compound)) continue; + + Results.Entities.MeterTestRslt meterRslt = BatchRslts.GetMeterTestRslt(testName, i, CompoundMeterId.Single); + GenericDevices.IRegisterReader regReader = sensPath.RegisterReaders[i]; + + if (meterRslt != null && regReader != null) + { + meterRslt.RegReaderType = (int)regReader.RegisterReaderType; + meterRslt.PulsesPerLiter = regReader.PulsesPerLtr; + meterRslt.PulsesMeter = Convert.ToDouble(regReader.WMPulses); + meterRslt.PulsesMaster = Convert.ToDouble(regReader.WMRefPulses); + meterRslt.VolumeStart = 0; /// liter + meterRslt.VolumeEnd = 0; /// liter + meterRslt.VolumeMeter = meterRslt.PulsesMeter * regReader.LtrsPerPulse; /// liter + meterRslt.VolumeRef = meterRslt.PulsesMaster * tstRslt.ConstMaster; /// liter + meterRslt.TestTime = cBrd.ImpulseTime(i + 1); + meterRslt.Error = 0; + meterRslt.Passed = (meterRslt.PulsesMeter >= (double)testParams.MinPulsesCount); + meterRslt.TestDone = true; + tstRslt.TestDone = true; + } + } + + tstRslt.Components = Results.Entities.Components + .UpdateList(BatchRslts.ComponentsList, + new Results.Entities.Components((BenchInfo != null) ? BenchInfo.TestBenchId : 1, + (BenchInfo != null) ? BenchInfo.TestBenchName : "testbench", + inPath.Pump != null ? inPath.Pump.Name : string.Empty, + outPath.FlowMeter != null ? outPath.FlowMeter.Name : string.Empty, + outPath.Scale != null ? outPath.Scale.Name : string.Empty, + outPath.RegulValve != null ? outPath.RegulValve.Name : string.Empty, + outPath.Diverter != null ? outPath.Diverter.Name : string.Empty)); + + /// Update water meter error flags + if (ErrorFlagsComp != null) + { + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (BatchRslts.WaterMeters[i] != null) + { + BatchRslts.WaterMeters[i].ErrorFlags = ErrorFlagsComp.GetWMtrErrorFlags(BatchRslts.WaterMeters[i].MeterTestRslts); + } + } + } + + /// Update results + Bridge.OnTestCompleted(this, new TestCompletedEventArgs(testName, tstRslt)); + } + /// Add data - end + } + + + /// Update modeless dialog error information + Bridge.OnPulsesTestInProgress(this, new PulsesTestInProgressEventArgs(testName, (double)testParams.MinPulsesCount)); + + /// Test 'Quit' + if ((modelessDlg is GenericDevices.IHasCompleted) && !(modelessDlg as GenericDevices.IHasCompleted).Completed) + { + goto loop; /// Modeless dilaog not closed, keep looping + } + modelessDlg = null; /// Modeless dialog is closed now + + /// Append the results to the CSV-file + allResults.Info(TestResult2CsvLine(testName, test.Part)); + + stopTest: + + /// + /// Quit this sequence + /// + if (isLastRepetition || retVal == Event.UiCmdStop || retVal == Event.OpArgumentError + || retVal == Event.Error || retVal == Event.ConfigurationError) + { + State.Create("Adjustment : Stopping diverter, gate, etc.") + .AddOperation(checkUiOp) + .AddOperation(cBrd.StopPreviousOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.PreviousStopped)); + } + + stopTestWOStoppingDivGateEtc: + + /// Create a list with one item 'retVal' (default is Event.Done) and return it + IList retList = new List(1); + retList.Add(retVal); + return retList; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/TestMethod.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/TestMethod.cs new file mode 100644 index 00000000..474d615b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/TestMethod.cs @@ -0,0 +1,38 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; +using TBF.BenchControl; + +namespace TBF.BenchControl.TestMethods.PulsesTest +{ + public class TestMethod : ComponentBase, GenericDevices.ITestMethod + { + private static readonly ILog log = LogManager.GetLogger(typeof(TestMethod)); + public override string ToString() { return string.Format("TestMethods.PulsesTest({0})", Cfg.ToString(1)); } + + public bool CanTest(MetersKind meters) { return meters == MetersKind.Single; } + public bool DoTransitions() { return true; } + + readonly TestMethodCfg testMethodCfg; + + public TestMethod() + { + } + + public TestMethod(Generic.IComponentCfg cfg) + : base(cfg) + { + testMethodCfg = cfg as TestMethodCfg; + log.Debug(this.ToString()); + } + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + return (new PulseOutputsTestSeq()).Execute(test, repetNr, isLastRepetition, testMethodCfg.TestParams, DebugLevel); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/TestMethodCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/TestMethodCfg.cs new file mode 100644 index 00000000..e50bb079 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/TestMethodCfg.cs @@ -0,0 +1,49 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.PulsesTest +{ + public class TestMethodCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestMethodCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new TestMethodCfgCtrl(); } + + /// Test parameters + [XmlIgnore] + public TestParams TestParams; + public override IParamsProvider GetRuntimeTestParamsProvider() { return TestParams; } + public override IParamsProvider CreateTestParamsProvider() { return new TestParams(true); } + public override IParamsProvider GetUITestParamsProvider(Test test) + { + return (test.Method == Name) ? base.GetUITestParamsProvider(test) : null; + } + + /// Private parameterless constructor invoked by all other (public) constructors + TestMethodCfg() + { + TestParams = new TestParams(true); + } + + public TestMethodCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + ParentName = string.Empty; + Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}", Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/TestMethodCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/TestMethodCfgCtrl.cs new file mode 100644 index 00000000..c5c300e9 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/TestMethodCfgCtrl.cs @@ -0,0 +1,69 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.PulsesTest +{ + public partial class TestMethodCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + TestMethodCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as TestMethodCfg; + Redraw(); + } + } + + public TestMethodCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/TestMethodCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/TestMethodCfgCtrl.designer.cs new file mode 100644 index 00000000..819f7553 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/TestMethodCfgCtrl.designer.cs @@ -0,0 +1,86 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.TestMethods.PulsesTest +{ + partial class TestMethodCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(137, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 5; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(27, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 4; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(134, 33); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 3; + this.classNameLabel.Text = "ComonentName"; + // + // BasicPrinterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "BasicPrinterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/TestMethodCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/TestMethodCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/TestMethodCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/TestParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/TestParams.cs new file mode 100644 index 00000000..e1ae198b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/TestParams.cs @@ -0,0 +1,120 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.PulsesTest +{ + public class TestParams : TestParamsBase, IParamsProvider, ITestParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestParams) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public int MinPulsesCount; /// Minimum number of pulses for a test to pass + + public override void InitializeAll() + { + MinPulsesCount = 3; + } + + + string[] paramNames = new string[] + { + "Min. pulses count", + }; + public override string ParamName(int i) { return paramNames[i]; } + public override int ParamsCount() { return paramNames.Length; } + + public override string ToString(int i) + { + switch (i) + { + case 0: return MinPulsesCount.ToString(); + default: return string.Empty; + } + } + + public CfgUpdateFlags UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: MinPulsesCount = int.Parse(strValue); return CfgUpdateFlags.None; + default: return CfgUpdateFlags.None; + } + } + + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + + int iDummy; + switch (i) + { + case 0: + if (int.TryParse(strValue, out iDummy) && (iDummy > 0)) return true; + break; + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(TestParams prms) + { + prms.MinPulsesCount = this.MinPulsesCount; + } + + public IParamsProvider Clone() + { + TestParams pars = new TestParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateFromDbEntity(ComponentTest dbEntity) + { + if (dbEntity == null) return; + try + { + TestParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as TestParams; + + testParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + test = dbEntity.Test; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + /// + /// Parameterless constructor initializes the parameters + /// + public TestParams() + { + } + + public TestParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public TestParams(ComponentTest testParamsEntity, string componentName, Test test) + { + this.testParamsEntity = testParamsEntity; + this.componentName = componentName; + this.test = test; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/WMPulsesForm.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/WMPulsesForm.cs new file mode 100644 index 00000000..bca9b3a0 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/WMPulsesForm.cs @@ -0,0 +1,201 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.PulsesTest +{ + public partial class WMPulsesForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(WMPulsesForm)); + + /// + /// Updated in constructor + /// + readonly int waterMetersCount; /// Number of text boxes for serial numbers + readonly bool[] disabled; + Rectangle[] rects; + + /// + /// Updated in OnAdjustmentInProgress() + /// + double[] pulsesCount; /// Created in constructor + double minPulsesCount; + + /// + /// Set to 'true' when the form closes + /// + public bool Completed { get { return completed; } } + bool completed; + + + /// + /// Constructor + /// + /// Number of text boxes for serial numbers + public WMPulsesForm(IList waterMeters) + : this() + { + waterMetersCount = waterMeters.Count; + + rects = new Rectangle[waterMetersCount]; + for (int i = 0; i < waterMetersCount; i++) rects[i] = new Rectangle(385, 30 + 90 * i, 324, 57); + + disabled = new bool[waterMetersCount]; + for (int i = 0; i < waterMetersCount; i++) disabled[i] = waterMeters[i].Disabled; + + pulsesCount = new double[waterMetersCount]; + } + + /// Parameterless constructor for 3 watermeters + public WMPulsesForm() + { + InitializeComponent(); + ControlBox = false; + + completed = false; + minPulsesCount = 1; /// Must be >0 so that initially the indication is RED + + /// Attach to 'AdjustmentInProgress' handler + UiBridge.Bridge.PulsesTestInProgressHandler += delegate(object sender, UiBridge.PulsesTestInProgressEventArgs args) + { + if (InvokeRequired) + { + Invoke(new EventHandler(OnPulsesTestInProgress), sender, args); + } + else OnPulsesTestInProgress(sender, args); + }; + } + + void Localize() + { + Text = Strings.Water_Meter_States; + groupBox1.Text = Strings.Water_Meter + " 1"; + groupBox2.Text = Strings.Water_Meter + " 2"; + groupBox3.Text = Strings.Water_Meter + " 3"; + groupBox4.Text = Strings.Water_Meter + " 4"; + groupBox5.Text = Strings.Water_Meter + " 5"; + groupBox6.Text = Strings.Water_Meter + " 6"; + wmPulsesCountLabel1.Text = Strings.Pulses_; + wmPulsesCountLabel2.Text = Strings.Pulses_; + wmPulsesCountLabel3.Text = Strings.Pulses_; + wmPulsesCountLabel4.Text = Strings.Pulses_; + wmPulsesCountLabel5.Text = Strings.Pulses_; + wmPulsesCountLabel6.Text = Strings.Pulses_; + okButton.Text = Strings.OkBtnText; + } + + private void WMPulsesForm_Load(object sender, EventArgs e) + { + Localize(); + + Height = 50 + 90 * waterMetersCount; + + if (waterMetersCount < 1 || disabled[0]) groupBox1.Visible = false; + if (waterMetersCount < 2 || disabled[1]) groupBox2.Visible = false; + if (waterMetersCount < 3 || disabled[2]) groupBox3.Visible = false; + if (waterMetersCount < 4 || disabled[3]) groupBox4.Visible = false; + if (waterMetersCount < 5 || disabled[4]) groupBox5.Visible = false; + if (waterMetersCount < 6 || disabled[5]) groupBox6.Visible = false; + + wmPulsesCountTextBox1.Text = "---"; + wmPulsesCountTextBox2.Text = "---"; + wmPulsesCountTextBox3.Text = "---"; + wmPulsesCountTextBox4.Text = "---"; + wmPulsesCountTextBox5.Text = "---"; + wmPulsesCountTextBox6.Text = "---"; + } + + private void okButton_Click(object sender, EventArgs e) + { + completed = true; + Close(); + } + + void OnPulsesTestInProgress(object sender, UiBridge.PulsesTestInProgressEventArgs args) + { + string testName = args.TestName; + minPulsesCount = args.MinPulsesCount; + + Results.Entities.TestRslt tr = TBF.BenchControl.Sequences.ProcessData.BatchRslts.GetTestRslt(testName, 0); + + int count = Math.Min(waterMetersCount, TBF.BenchControl.Sequences.ProcessData.BatchRslts.WMPositionsCount); + for (int i = 0; i < count; i++) + { + Results.Entities.MeterTestRslt mtr = TBF.BenchControl.Sequences.ProcessData.BatchRslts.GetMeterTestRslt(testName, i, CompoundMeterId.Single); + if (mtr != null) pulsesCount[i] = mtr.PulsesMeter; + } + + Redraw(); + } + + void Redraw() + { + if (waterMetersCount > 0 && !disabled[0]) wmPulsesCountTextBox1.Text = pulsesCount[0].ToString("F0"); + if (waterMetersCount > 1 && !disabled[1]) wmPulsesCountTextBox2.Text = pulsesCount[1].ToString("F0"); + if (waterMetersCount > 2 && !disabled[2]) wmPulsesCountTextBox3.Text = pulsesCount[2].ToString("F0"); + if (waterMetersCount > 3 && !disabled[3]) wmPulsesCountTextBox4.Text = pulsesCount[3].ToString("F0"); + if (waterMetersCount > 4 && !disabled[4]) wmPulsesCountTextBox5.Text = pulsesCount[4].ToString("F0"); + if (waterMetersCount > 5 && !disabled[5]) wmPulsesCountTextBox6.Text = pulsesCount[5].ToString("F0"); + + for (int i = 0; i < waterMetersCount; i++) Invalidate(rects[i]); + } + + private void WMPulsesForm_Paint(object sender, PaintEventArgs e) + { + System.Drawing.Graphics graphics = this.CreateGraphics(); + + for (int i = 0; i < waterMetersCount; i++) + { + if (!disabled[i]) + { + PaintOne(graphics, rects[i], pulsesCount[i], minPulsesCount); + } + } + } + + void PaintOne(System.Drawing.Graphics g, Rectangle r, double value, double limLo) + { + Rectangle rect1 = new Rectangle(r.Left, r.Top, r.Width / 3, r.Height); + Rectangle rect2 = new Rectangle(r.Left + r.Width / 3, r.Top, r.Width / 3, r.Height); + Rectangle rect3 = new Rectangle(r.Left + 2 * (r.Width / 3), r.Top, r.Width / 3, r.Height); + + Brush redBrush = new SolidBrush(Color.FromName("Salmon")); + Brush greenBrush = new SolidBrush(Color.FromName("LightGreen")); + Brush centBrush = new SolidBrush(Color.FromName("Green")); + if (value >= limLo) + { + g.FillRectangle(greenBrush, rect2); + } + else + { + g.FillRectangle(redBrush, rect2); + } + } + + #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) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/WMPulsesForm.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/WMPulsesForm.designer.cs new file mode 100644 index 00000000..539ab8fe --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/WMPulsesForm.designer.cs @@ -0,0 +1,312 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +namespace TBF.BenchControl.TestMethods.PulsesTest +{ + partial class WMPulsesForm + { + /// + /// 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() + { + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.wmPulsesCountTextBox2 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel2 = new System.Windows.Forms.Label(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.wmPulsesCountTextBox1 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel1 = new System.Windows.Forms.Label(); + this.okButton = new System.Windows.Forms.Button(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.wmPulsesCountTextBox3 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel3 = new System.Windows.Forms.Label(); + this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.wmPulsesCountTextBox4 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel4 = new System.Windows.Forms.Label(); + this.groupBox5 = new System.Windows.Forms.GroupBox(); + this.wmPulsesCountTextBox5 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel5 = new System.Windows.Forms.Label(); + this.groupBox6 = new System.Windows.Forms.GroupBox(); + this.wmPulsesCountTextBox6 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel6 = new System.Windows.Forms.Label(); + this.groupBox2.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.groupBox4.SuspendLayout(); + this.groupBox5.SuspendLayout(); + this.groupBox6.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.wmPulsesCountTextBox2); + this.groupBox2.Controls.Add(this.wmPulsesCountLabel2); + this.groupBox2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox2.ForeColor = System.Drawing.Color.Black; + this.groupBox2.Location = new System.Drawing.Point(25, 102); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(333, 81); + this.groupBox2.TabIndex = 2; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Water Meter 2"; + // + // wmPulsesCountTextBox2 + // + this.wmPulsesCountTextBox2.Font = new System.Drawing.Font("Verdana", 27.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox2.Location = new System.Drawing.Point(183, 21); + this.wmPulsesCountTextBox2.Name = "wmPulsesCountTextBox2"; + this.wmPulsesCountTextBox2.Size = new System.Drawing.Size(137, 52); + this.wmPulsesCountTextBox2.TabIndex = 1; + // + // wmPulsesCountLabel2 + // + this.wmPulsesCountLabel2.AutoSize = true; + this.wmPulsesCountLabel2.Location = new System.Drawing.Point(18, 34); + this.wmPulsesCountLabel2.Name = "wmPulsesCountLabel2"; + this.wmPulsesCountLabel2.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel2.TabIndex = 0; + this.wmPulsesCountLabel2.Text = "Pulses count"; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.wmPulsesCountTextBox1); + this.groupBox1.Controls.Add(this.wmPulsesCountLabel1); + this.groupBox1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox1.ForeColor = System.Drawing.Color.Black; + this.groupBox1.Location = new System.Drawing.Point(25, 12); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(333, 81); + this.groupBox1.TabIndex = 1; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Water Meter 1"; + // + // wmPulsesCountTextBox1 + // + this.wmPulsesCountTextBox1.Font = new System.Drawing.Font("Verdana", 27.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox1.Location = new System.Drawing.Point(183, 21); + this.wmPulsesCountTextBox1.Name = "wmPulsesCountTextBox1"; + this.wmPulsesCountTextBox1.Size = new System.Drawing.Size(137, 52); + this.wmPulsesCountTextBox1.TabIndex = 1; + // + // wmPulsesCountLabel1 + // + this.wmPulsesCountLabel1.AutoSize = true; + this.wmPulsesCountLabel1.Location = new System.Drawing.Point(18, 34); + this.wmPulsesCountLabel1.Name = "wmPulsesCountLabel1"; + this.wmPulsesCountLabel1.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel1.TabIndex = 0; + this.wmPulsesCountLabel1.Text = "Pulses count"; + // + // okButton + // + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(739, 26); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(98, 63); + this.okButton.TabIndex = 7; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.wmPulsesCountTextBox3); + this.groupBox3.Controls.Add(this.wmPulsesCountLabel3); + this.groupBox3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox3.ForeColor = System.Drawing.Color.Black; + this.groupBox3.Location = new System.Drawing.Point(25, 192); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(333, 81); + this.groupBox3.TabIndex = 3; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "Water Meter 3"; + // + // wmPulsesCountTextBox3 + // + this.wmPulsesCountTextBox3.Font = new System.Drawing.Font("Verdana", 27.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox3.Location = new System.Drawing.Point(183, 21); + this.wmPulsesCountTextBox3.Name = "wmPulsesCountTextBox3"; + this.wmPulsesCountTextBox3.Size = new System.Drawing.Size(137, 52); + this.wmPulsesCountTextBox3.TabIndex = 1; + // + // wmPulsesCountLabel3 + // + this.wmPulsesCountLabel3.AutoSize = true; + this.wmPulsesCountLabel3.Location = new System.Drawing.Point(18, 34); + this.wmPulsesCountLabel3.Name = "wmPulsesCountLabel3"; + this.wmPulsesCountLabel3.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel3.TabIndex = 0; + this.wmPulsesCountLabel3.Text = "Pulses count"; + // + // groupBox4 + // + this.groupBox4.Controls.Add(this.wmPulsesCountTextBox4); + this.groupBox4.Controls.Add(this.wmPulsesCountLabel4); + this.groupBox4.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox4.ForeColor = System.Drawing.Color.Black; + this.groupBox4.Location = new System.Drawing.Point(25, 282); + this.groupBox4.Name = "groupBox4"; + this.groupBox4.Size = new System.Drawing.Size(333, 81); + this.groupBox4.TabIndex = 4; + this.groupBox4.TabStop = false; + this.groupBox4.Text = "Water Meter 4"; + // + // wmPulsesCountTextBox4 + // + this.wmPulsesCountTextBox4.Font = new System.Drawing.Font("Verdana", 27.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox4.Location = new System.Drawing.Point(183, 21); + this.wmPulsesCountTextBox4.Name = "wmPulsesCountTextBox4"; + this.wmPulsesCountTextBox4.Size = new System.Drawing.Size(137, 52); + this.wmPulsesCountTextBox4.TabIndex = 1; + // + // wmPulsesCountLabel4 + // + this.wmPulsesCountLabel4.AutoSize = true; + this.wmPulsesCountLabel4.Location = new System.Drawing.Point(18, 34); + this.wmPulsesCountLabel4.Name = "wmPulsesCountLabel4"; + this.wmPulsesCountLabel4.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel4.TabIndex = 0; + this.wmPulsesCountLabel4.Text = "Pulses count"; + // + // groupBox5 + // + this.groupBox5.Controls.Add(this.wmPulsesCountTextBox5); + this.groupBox5.Controls.Add(this.wmPulsesCountLabel5); + this.groupBox5.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox5.ForeColor = System.Drawing.Color.Black; + this.groupBox5.Location = new System.Drawing.Point(25, 372); + this.groupBox5.Name = "groupBox5"; + this.groupBox5.Size = new System.Drawing.Size(333, 81); + this.groupBox5.TabIndex = 5; + this.groupBox5.TabStop = false; + this.groupBox5.Text = "Water Meter 5"; + // + // wmPulsesCountTextBox5 + // + this.wmPulsesCountTextBox5.Font = new System.Drawing.Font("Verdana", 27.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox5.Location = new System.Drawing.Point(183, 21); + this.wmPulsesCountTextBox5.Name = "wmPulsesCountTextBox5"; + this.wmPulsesCountTextBox5.Size = new System.Drawing.Size(137, 52); + this.wmPulsesCountTextBox5.TabIndex = 1; + // + // wmPulsesCountLabel5 + // + this.wmPulsesCountLabel5.AutoSize = true; + this.wmPulsesCountLabel5.Location = new System.Drawing.Point(18, 34); + this.wmPulsesCountLabel5.Name = "wmPulsesCountLabel5"; + this.wmPulsesCountLabel5.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel5.TabIndex = 0; + this.wmPulsesCountLabel5.Text = "Pulses count"; + // + // groupBox6 + // + this.groupBox6.Controls.Add(this.wmPulsesCountTextBox6); + this.groupBox6.Controls.Add(this.wmPulsesCountLabel6); + this.groupBox6.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.groupBox6.ForeColor = System.Drawing.Color.Black; + this.groupBox6.Location = new System.Drawing.Point(25, 462); + this.groupBox6.Name = "groupBox6"; + this.groupBox6.Size = new System.Drawing.Size(333, 81); + this.groupBox6.TabIndex = 6; + this.groupBox6.TabStop = false; + this.groupBox6.Text = "Water Meter 6"; + // + // wmPulsesCountTextBox6 + // + this.wmPulsesCountTextBox6.Font = new System.Drawing.Font("Verdana", 27.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox6.Location = new System.Drawing.Point(183, 21); + this.wmPulsesCountTextBox6.Name = "wmPulsesCountTextBox6"; + this.wmPulsesCountTextBox6.Size = new System.Drawing.Size(137, 52); + this.wmPulsesCountTextBox6.TabIndex = 1; + // + // wmPulsesCountLabel6 + // + this.wmPulsesCountLabel6.AutoSize = true; + this.wmPulsesCountLabel6.Location = new System.Drawing.Point(18, 34); + this.wmPulsesCountLabel6.Name = "wmPulsesCountLabel6"; + this.wmPulsesCountLabel6.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel6.TabIndex = 0; + this.wmPulsesCountLabel6.Text = "Pulses count"; + // + // WMPulsesForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.ClientSize = new System.Drawing.Size(868, 565); + this.Controls.Add(this.groupBox6); + this.Controls.Add(this.groupBox5); + this.Controls.Add(this.groupBox4); + this.Controls.Add(this.groupBox3); + this.Controls.Add(this.okButton); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.groupBox1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "WMPulsesForm"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "Water Meter States"; + this.TopMost = true; + this.Load += new System.EventHandler(this.WMPulsesForm_Load); + this.Paint += new System.Windows.Forms.PaintEventHandler(this.WMPulsesForm_Paint); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.groupBox4.ResumeLayout(false); + this.groupBox4.PerformLayout(); + this.groupBox5.ResumeLayout(false); + this.groupBox5.PerformLayout(); + this.groupBox6.ResumeLayout(false); + this.groupBox6.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TextBox wmPulsesCountTextBox2; + private System.Windows.Forms.Label wmPulsesCountLabel2; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TextBox wmPulsesCountTextBox1; + private System.Windows.Forms.Label wmPulsesCountLabel1; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.TextBox wmPulsesCountTextBox3; + private System.Windows.Forms.Label wmPulsesCountLabel3; + private System.Windows.Forms.GroupBox groupBox4; + private System.Windows.Forms.TextBox wmPulsesCountTextBox4; + private System.Windows.Forms.Label wmPulsesCountLabel4; + private System.Windows.Forms.GroupBox groupBox5; + private System.Windows.Forms.TextBox wmPulsesCountTextBox5; + private System.Windows.Forms.Label wmPulsesCountLabel5; + private System.Windows.Forms.GroupBox groupBox6; + private System.Windows.Forms.TextBox wmPulsesCountTextBox6; + private System.Windows.Forms.Label wmPulsesCountLabel6; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/WMPulsesForm.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/WMPulsesForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/WMPulsesForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/WMPulsesForm12.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/WMPulsesForm12.cs new file mode 100644 index 00000000..3ef7fb45 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/WMPulsesForm12.cs @@ -0,0 +1,239 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.PulsesTest +{ + public partial class WMPulsesForm12 : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(WMPulsesForm12)); + + const int MaxWMsCount = 12; /// Implementation limit of this form + + /// + /// Updated in constructor + /// + readonly int waterMetersCount; /// Number of text boxes for serial numbers + readonly bool[] disabled; + int textBoxesCount; + Label[] labels; + TextBox[] pulsesCountTextBox; + Rectangle[] rects; + + /// + /// Updated in OnAdjustmentInProgress() + /// + double[] pulsesCount; /// Created in constructor + double minPulsesCount; + + /// + /// Set to 'true' when the form closes + /// + public bool Completed { get { return completed; } } + bool completed; + + + /// Parameterless constructor for 3 watermeters + public WMPulsesForm12() + { + InitializeComponent(); + ControlBox = false; + + textBoxesCount = MaxWMsCount; + + labels = new Label[MaxWMsCount] + { + wmPulsesCountLabel1, wmPulsesCountLabel2, wmPulsesCountLabel3, wmPulsesCountLabel4, + wmPulsesCountLabel5, wmPulsesCountLabel6, wmPulsesCountLabel7, wmPulsesCountLabel8, + wmPulsesCountLabel9, wmPulsesCountLabel10, wmPulsesCountLabel11, wmPulsesCountLabel12, + }; + pulsesCountTextBox = new TextBox[MaxWMsCount] + { + wmPulsesCountTextBox1, wmPulsesCountTextBox2, wmPulsesCountTextBox3, wmPulsesCountTextBox4, + wmPulsesCountTextBox5, wmPulsesCountTextBox6, wmPulsesCountTextBox7, wmPulsesCountTextBox8, + wmPulsesCountTextBox9, wmPulsesCountTextBox10, wmPulsesCountTextBox11, wmPulsesCountTextBox12, + }; + + rects = new Rectangle[MaxWMsCount]; + for (int i = 0; i < MaxWMsCount; i++) + { + int row = i % 12; + int col = i / 12; + rects[i] = new Rectangle(350 + col * 557, 25 + row * 47, 230, 37); + } + + completed = false; + minPulsesCount = 1; /// Must be >0 so that initially the indication is RED + + /// Attach to 'AdjustmentInProgress' handler + UiBridge.Bridge.PulsesTestInProgressHandler += delegate(object sender, UiBridge.PulsesTestInProgressEventArgs args) + { + if (InvokeRequired) + { + Invoke(new EventHandler(OnPulsesTestInProgress), sender, args); + } + else OnPulsesTestInProgress(sender, args); + }; + } + + /// + /// Constructor + /// + /// Number of text boxes for serial numbers + public WMPulsesForm12(IList waterMeters) + : this() + { + waterMetersCount = waterMeters.Count; + + ShuffleTextBoxes(waterMetersCount, Config.Data.LineSize); + + disabled = new bool[waterMetersCount]; + for (int i = 0; i < waterMetersCount; i++) disabled[i] = waterMeters[i].Disabled; + + pulsesCount = new double[waterMetersCount]; + } + + + /// + /// 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) + { + if (wmsCount < textBoxesCount && lineSize > 0) + { + int nrLines = (wmsCount + lineSize - 1) / lineSize; + int gap = (textBoxesCount - wmsCount) / nrLines; + + int dest = 0; + for (int l = 0; l < nrLines; l++) + { + for (int i = 0; i < lineSize; i++) + { + labels[dest] = labels[l * lineSize + l * gap + i]; + pulsesCountTextBox[dest] = pulsesCountTextBox[l * lineSize + l * gap + i]; + rects[dest] = rects[l * lineSize + l * gap + i]; + dest++; + } + } + textBoxesCount = wmsCount; + } + } + + + void Localize() + { + Text = Strings.Water_Meter_States; + for (int i = 0; i < textBoxesCount; i++) + { + labels[i].Text = string.Format("WM{0} {1}", i + 1, Strings.Pulses_); + } + okButton.Text = Strings.OkBtnText; + } + + private void WMPulsesForm12_Load(object sender, EventArgs e) + { + Localize(); + + //Height = 50 + 90 * WaterMetersCount; + + for (int i = 0; i < textBoxesCount; i++) + { + labels[i].Visible = pulsesCountTextBox[i].Visible = (disabled == null || i >= disabled.Length || !disabled[i]); + pulsesCountTextBox[i].Text = "---"; + } + } + + private void okButton_Click(object sender, EventArgs e) + { + completed = true; + Close(); + } + + void OnPulsesTestInProgress(object sender, UiBridge.PulsesTestInProgressEventArgs args) + { + string testName = args.TestName; + minPulsesCount = args.MinPulsesCount; + + Results.Entities.TestRslt tr = TBF.BenchControl.Sequences.ProcessData.BatchRslts.GetTestRslt(testName, 0); + + int count = Math.Min(waterMetersCount, TBF.BenchControl.Sequences.ProcessData.BatchRslts.WMPositionsCount); + for (int i = 0; i < count; i++) + { + Results.Entities.MeterTestRslt mtr = TBF.BenchControl.Sequences.ProcessData.BatchRslts.GetMeterTestRslt(testName, i, CompoundMeterId.Single); + if (mtr != null) pulsesCount[i] = mtr.PulsesMeter; + } + + Redraw(); + } + + void Redraw() + { + for (int i = 0; i < textBoxesCount; i++) + { + pulsesCountTextBox[i].Text = pulsesCount[i].ToString("F0"); + Invalidate(rects[i]); + } + } + + private void WMPulsesForm12_Paint(object sender, PaintEventArgs e) + { + System.Drawing.Graphics graphics = this.CreateGraphics(); + + for (int i = 0; i < waterMetersCount; i++) + { + if (!disabled[i]) + { + PaintOne(graphics, rects[i], pulsesCount[i], minPulsesCount); + } + } + } + + void PaintOne(System.Drawing.Graphics g, Rectangle r, double value, double limLo) + { + Rectangle rect1 = new Rectangle(r.Left, r.Top, r.Width / 3, r.Height); + Rectangle rect2 = new Rectangle(r.Left + r.Width / 3, r.Top, r.Width / 3, r.Height); + Rectangle rect3 = new Rectangle(r.Left + 2 * (r.Width / 3), r.Top, r.Width / 3, r.Height); + + Brush redBrush = new SolidBrush(Color.FromName("Salmon")); + Brush greenBrush = new SolidBrush(Color.FromName("LightGreen")); + Brush centBrush = new SolidBrush(Color.FromName("Green")); + if (value >= limLo) + { + g.FillRectangle(greenBrush, rect2); + } + else + { + g.FillRectangle(redBrush, rect2); + } + } + + #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) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/WMPulsesForm12.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/WMPulsesForm12.designer.cs new file mode 100644 index 00000000..c29a490b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/WMPulsesForm12.designer.cs @@ -0,0 +1,385 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +namespace TBF.BenchControl.TestMethods.PulsesTest +{ + partial class WMPulsesForm12 + { + /// + /// 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() + { + this.wmPulsesCountTextBox2 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel2 = new System.Windows.Forms.Label(); + this.wmPulsesCountLabel1 = new System.Windows.Forms.Label(); + this.okButton = new System.Windows.Forms.Button(); + this.wmPulsesCountTextBox3 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel3 = new System.Windows.Forms.Label(); + this.wmPulsesCountTextBox4 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel4 = new System.Windows.Forms.Label(); + this.wmPulsesCountTextBox5 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel5 = new System.Windows.Forms.Label(); + this.wmPulsesCountTextBox6 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel6 = new System.Windows.Forms.Label(); + this.wmPulsesCountTextBox1 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountTextBox7 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel7 = new System.Windows.Forms.Label(); + this.wmPulsesCountTextBox8 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel8 = new System.Windows.Forms.Label(); + this.wmPulsesCountTextBox9 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel9 = new System.Windows.Forms.Label(); + this.wmPulsesCountTextBox10 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel10 = new System.Windows.Forms.Label(); + this.wmPulsesCountTextBox12 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel12 = new System.Windows.Forms.Label(); + this.wmPulsesCountTextBox11 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel11 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // wmPulsesCountTextBox2 + // + this.wmPulsesCountTextBox2.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox2.Location = new System.Drawing.Point(198, 74); + this.wmPulsesCountTextBox2.Name = "wmPulsesCountTextBox2"; + this.wmPulsesCountTextBox2.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox2.TabIndex = 1; + this.wmPulsesCountTextBox2.Visible = false; + // + // wmPulsesCountLabel2 + // + this.wmPulsesCountLabel2.AutoSize = true; + this.wmPulsesCountLabel2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel2.Location = new System.Drawing.Point(33, 85); + this.wmPulsesCountLabel2.Name = "wmPulsesCountLabel2"; + this.wmPulsesCountLabel2.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel2.TabIndex = 0; + this.wmPulsesCountLabel2.Text = "Pulses count"; + this.wmPulsesCountLabel2.Visible = false; + // + // wmPulsesCountLabel1 + // + this.wmPulsesCountLabel1.AutoSize = true; + this.wmPulsesCountLabel1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel1.Location = new System.Drawing.Point(33, 39); + this.wmPulsesCountLabel1.Name = "wmPulsesCountLabel1"; + this.wmPulsesCountLabel1.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel1.TabIndex = 0; + this.wmPulsesCountLabel1.Text = "Pulses count"; + this.wmPulsesCountLabel1.Visible = false; + // + // okButton + // + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(601, 28); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(98, 63); + this.okButton.TabIndex = 7; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // wmPulsesCountTextBox3 + // + this.wmPulsesCountTextBox3.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox3.Location = new System.Drawing.Point(198, 120); + this.wmPulsesCountTextBox3.Name = "wmPulsesCountTextBox3"; + this.wmPulsesCountTextBox3.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox3.TabIndex = 1; + this.wmPulsesCountTextBox3.Visible = false; + // + // wmPulsesCountLabel3 + // + this.wmPulsesCountLabel3.AutoSize = true; + this.wmPulsesCountLabel3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel3.Location = new System.Drawing.Point(33, 131); + this.wmPulsesCountLabel3.Name = "wmPulsesCountLabel3"; + this.wmPulsesCountLabel3.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel3.TabIndex = 0; + this.wmPulsesCountLabel3.Text = "Pulses count"; + this.wmPulsesCountLabel3.Visible = false; + // + // wmPulsesCountTextBox4 + // + this.wmPulsesCountTextBox4.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox4.Location = new System.Drawing.Point(198, 166); + this.wmPulsesCountTextBox4.Name = "wmPulsesCountTextBox4"; + this.wmPulsesCountTextBox4.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox4.TabIndex = 1; + this.wmPulsesCountTextBox4.Visible = false; + // + // wmPulsesCountLabel4 + // + this.wmPulsesCountLabel4.AutoSize = true; + this.wmPulsesCountLabel4.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel4.Location = new System.Drawing.Point(33, 177); + this.wmPulsesCountLabel4.Name = "wmPulsesCountLabel4"; + this.wmPulsesCountLabel4.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel4.TabIndex = 0; + this.wmPulsesCountLabel4.Text = "Pulses count"; + this.wmPulsesCountLabel4.Visible = false; + // + // wmPulsesCountTextBox5 + // + this.wmPulsesCountTextBox5.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox5.Location = new System.Drawing.Point(198, 213); + this.wmPulsesCountTextBox5.Name = "wmPulsesCountTextBox5"; + this.wmPulsesCountTextBox5.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox5.TabIndex = 1; + this.wmPulsesCountTextBox5.Visible = false; + // + // wmPulsesCountLabel5 + // + this.wmPulsesCountLabel5.AutoSize = true; + this.wmPulsesCountLabel5.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel5.Location = new System.Drawing.Point(33, 224); + this.wmPulsesCountLabel5.Name = "wmPulsesCountLabel5"; + this.wmPulsesCountLabel5.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel5.TabIndex = 0; + this.wmPulsesCountLabel5.Text = "Pulses count"; + this.wmPulsesCountLabel5.Visible = false; + // + // wmPulsesCountTextBox6 + // + this.wmPulsesCountTextBox6.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox6.Location = new System.Drawing.Point(198, 259); + this.wmPulsesCountTextBox6.Name = "wmPulsesCountTextBox6"; + this.wmPulsesCountTextBox6.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox6.TabIndex = 1; + this.wmPulsesCountTextBox6.Visible = false; + // + // wmPulsesCountLabel6 + // + this.wmPulsesCountLabel6.AutoSize = true; + this.wmPulsesCountLabel6.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel6.Location = new System.Drawing.Point(33, 271); + this.wmPulsesCountLabel6.Name = "wmPulsesCountLabel6"; + this.wmPulsesCountLabel6.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel6.TabIndex = 0; + this.wmPulsesCountLabel6.Text = "Pulses count"; + this.wmPulsesCountLabel6.Visible = false; + // + // wmPulsesCountTextBox1 + // + this.wmPulsesCountTextBox1.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox1.Location = new System.Drawing.Point(198, 28); + this.wmPulsesCountTextBox1.Name = "wmPulsesCountTextBox1"; + this.wmPulsesCountTextBox1.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox1.TabIndex = 1; + this.wmPulsesCountTextBox1.Visible = false; + // + // wmPulsesCountTextBox7 + // + this.wmPulsesCountTextBox7.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox7.Location = new System.Drawing.Point(198, 305); + this.wmPulsesCountTextBox7.Name = "wmPulsesCountTextBox7"; + this.wmPulsesCountTextBox7.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox7.TabIndex = 9; + this.wmPulsesCountTextBox7.Visible = false; + // + // wmPulsesCountLabel7 + // + this.wmPulsesCountLabel7.AutoSize = true; + this.wmPulsesCountLabel7.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel7.Location = new System.Drawing.Point(33, 317); + this.wmPulsesCountLabel7.Name = "wmPulsesCountLabel7"; + this.wmPulsesCountLabel7.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel7.TabIndex = 8; + this.wmPulsesCountLabel7.Text = "Pulses count"; + this.wmPulsesCountLabel7.Visible = false; + // + // wmPulsesCountTextBox8 + // + this.wmPulsesCountTextBox8.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox8.Location = new System.Drawing.Point(198, 351); + this.wmPulsesCountTextBox8.Name = "wmPulsesCountTextBox8"; + this.wmPulsesCountTextBox8.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox8.TabIndex = 11; + this.wmPulsesCountTextBox8.Visible = false; + // + // wmPulsesCountLabel8 + // + this.wmPulsesCountLabel8.AutoSize = true; + this.wmPulsesCountLabel8.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel8.Location = new System.Drawing.Point(33, 363); + this.wmPulsesCountLabel8.Name = "wmPulsesCountLabel8"; + this.wmPulsesCountLabel8.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel8.TabIndex = 10; + this.wmPulsesCountLabel8.Text = "Pulses count"; + this.wmPulsesCountLabel8.Visible = false; + // + // wmPulsesCountTextBox9 + // + this.wmPulsesCountTextBox9.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox9.Location = new System.Drawing.Point(198, 397); + this.wmPulsesCountTextBox9.Name = "wmPulsesCountTextBox9"; + this.wmPulsesCountTextBox9.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox9.TabIndex = 13; + this.wmPulsesCountTextBox9.Visible = false; + // + // wmPulsesCountLabel9 + // + this.wmPulsesCountLabel9.AutoSize = true; + this.wmPulsesCountLabel9.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel9.Location = new System.Drawing.Point(33, 408); + this.wmPulsesCountLabel9.Name = "wmPulsesCountLabel9"; + this.wmPulsesCountLabel9.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel9.TabIndex = 12; + this.wmPulsesCountLabel9.Text = "Pulses count"; + this.wmPulsesCountLabel9.Visible = false; + // + // wmPulsesCountTextBox10 + // + this.wmPulsesCountTextBox10.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox10.Location = new System.Drawing.Point(198, 443); + this.wmPulsesCountTextBox10.Name = "wmPulsesCountTextBox10"; + this.wmPulsesCountTextBox10.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox10.TabIndex = 15; + this.wmPulsesCountTextBox10.Visible = false; + // + // wmPulsesCountLabel10 + // + this.wmPulsesCountLabel10.AutoSize = true; + this.wmPulsesCountLabel10.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel10.Location = new System.Drawing.Point(33, 454); + this.wmPulsesCountLabel10.Name = "wmPulsesCountLabel10"; + this.wmPulsesCountLabel10.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel10.TabIndex = 14; + this.wmPulsesCountLabel10.Text = "Pulses count"; + this.wmPulsesCountLabel10.Visible = false; + // + // wmPulsesCountTextBox12 + // + this.wmPulsesCountTextBox12.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox12.Location = new System.Drawing.Point(198, 535); + this.wmPulsesCountTextBox12.Name = "wmPulsesCountTextBox12"; + this.wmPulsesCountTextBox12.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox12.TabIndex = 19; + this.wmPulsesCountTextBox12.Visible = false; + // + // wmPulsesCountLabel12 + // + this.wmPulsesCountLabel12.AutoSize = true; + this.wmPulsesCountLabel12.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel12.Location = new System.Drawing.Point(33, 546); + this.wmPulsesCountLabel12.Name = "wmPulsesCountLabel12"; + this.wmPulsesCountLabel12.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel12.TabIndex = 18; + this.wmPulsesCountLabel12.Text = "Pulses count"; + this.wmPulsesCountLabel12.Visible = false; + // + // wmPulsesCountTextBox11 + // + this.wmPulsesCountTextBox11.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox11.Location = new System.Drawing.Point(198, 489); + this.wmPulsesCountTextBox11.Name = "wmPulsesCountTextBox11"; + this.wmPulsesCountTextBox11.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox11.TabIndex = 17; + this.wmPulsesCountTextBox11.Visible = false; + // + // wmPulsesCountLabel11 + // + this.wmPulsesCountLabel11.AutoSize = true; + this.wmPulsesCountLabel11.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel11.Location = new System.Drawing.Point(33, 500); + this.wmPulsesCountLabel11.Name = "wmPulsesCountLabel11"; + this.wmPulsesCountLabel11.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel11.TabIndex = 16; + this.wmPulsesCountLabel11.Text = "Pulses count"; + this.wmPulsesCountLabel11.Visible = false; + // + // WMPulsesForm12 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.ClientSize = new System.Drawing.Size(731, 592); + this.Controls.Add(this.wmPulsesCountTextBox12); + this.Controls.Add(this.wmPulsesCountLabel12); + this.Controls.Add(this.wmPulsesCountTextBox11); + this.Controls.Add(this.wmPulsesCountLabel11); + this.Controls.Add(this.wmPulsesCountTextBox10); + this.Controls.Add(this.wmPulsesCountLabel10); + this.Controls.Add(this.wmPulsesCountTextBox9); + this.Controls.Add(this.wmPulsesCountLabel9); + this.Controls.Add(this.wmPulsesCountTextBox8); + this.Controls.Add(this.wmPulsesCountLabel8); + this.Controls.Add(this.wmPulsesCountTextBox7); + this.Controls.Add(this.wmPulsesCountLabel7); + this.Controls.Add(this.wmPulsesCountTextBox6); + this.Controls.Add(this.wmPulsesCountLabel6); + this.Controls.Add(this.wmPulsesCountTextBox5); + this.Controls.Add(this.wmPulsesCountLabel5); + this.Controls.Add(this.wmPulsesCountTextBox4); + this.Controls.Add(this.wmPulsesCountLabel4); + this.Controls.Add(this.wmPulsesCountTextBox3); + this.Controls.Add(this.wmPulsesCountLabel3); + this.Controls.Add(this.wmPulsesCountTextBox2); + this.Controls.Add(this.wmPulsesCountLabel2); + this.Controls.Add(this.wmPulsesCountTextBox1); + this.Controls.Add(this.wmPulsesCountLabel1); + this.Controls.Add(this.okButton); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "WMPulsesForm12"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "Water Meter States"; + this.TopMost = true; + this.Load += new System.EventHandler(this.WMPulsesForm12_Load); + this.Paint += new System.Windows.Forms.PaintEventHandler(this.WMPulsesForm12_Paint); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox wmPulsesCountTextBox2; + private System.Windows.Forms.Label wmPulsesCountLabel2; + private System.Windows.Forms.Label wmPulsesCountLabel1; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.TextBox wmPulsesCountTextBox3; + private System.Windows.Forms.Label wmPulsesCountLabel3; + private System.Windows.Forms.TextBox wmPulsesCountTextBox4; + private System.Windows.Forms.Label wmPulsesCountLabel4; + private System.Windows.Forms.TextBox wmPulsesCountTextBox5; + private System.Windows.Forms.Label wmPulsesCountLabel5; + private System.Windows.Forms.TextBox wmPulsesCountTextBox6; + private System.Windows.Forms.Label wmPulsesCountLabel6; + private System.Windows.Forms.TextBox wmPulsesCountTextBox1; + private System.Windows.Forms.TextBox wmPulsesCountTextBox7; + private System.Windows.Forms.Label wmPulsesCountLabel7; + private System.Windows.Forms.TextBox wmPulsesCountTextBox8; + private System.Windows.Forms.Label wmPulsesCountLabel8; + private System.Windows.Forms.TextBox wmPulsesCountTextBox9; + private System.Windows.Forms.Label wmPulsesCountLabel9; + private System.Windows.Forms.TextBox wmPulsesCountTextBox10; + private System.Windows.Forms.Label wmPulsesCountLabel10; + private System.Windows.Forms.TextBox wmPulsesCountTextBox12; + private System.Windows.Forms.Label wmPulsesCountLabel12; + private System.Windows.Forms.TextBox wmPulsesCountTextBox11; + private System.Windows.Forms.Label wmPulsesCountLabel11; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/WMPulsesForm12.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/WMPulsesForm12.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/WMPulsesForm12.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/WMPulsesForm24.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/WMPulsesForm24.cs new file mode 100644 index 00000000..37c31c7f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/WMPulsesForm24.cs @@ -0,0 +1,252 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.PulsesTest +{ + public partial class WMPulsesForm24 : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(WMPulsesForm24)); + + const int MaxWMsCount = 24; /// Implementation limit of this form + + /// + /// Updated in constructor + /// + readonly int waterMetersCount; /// Number of text boxes for serial numbers + readonly bool[] disabled; + int textBoxesCount; + Label[] labels; + TextBox[] pulsesCountTextBox; + Rectangle[] rects; + + /// + /// Updated in OnAdjustmentInProgress() + /// + double[] pulsesCount; /// Created in constructor + double minPulsesCount; + + /// + /// Set to 'true' when the form closes + /// + public bool Completed { get { return completed; } } + bool completed; + + + /// Parameterless constructor for 3 watermeters + public WMPulsesForm24() + { + InitializeComponent(); + ControlBox = false; + + textBoxesCount = MaxWMsCount; + + labels = new Label[MaxWMsCount] + { + wmPulsesCountLabel1, wmPulsesCountLabel2, wmPulsesCountLabel3, wmPulsesCountLabel4, + wmPulsesCountLabel5, wmPulsesCountLabel6, wmPulsesCountLabel7, wmPulsesCountLabel8, + wmPulsesCountLabel9, wmPulsesCountLabel10, wmPulsesCountLabel11, wmPulsesCountLabel12, + wmPulsesCountLabel13, wmPulsesCountLabel14, wmPulsesCountLabel15, wmPulsesCountLabel16, + wmPulsesCountLabel17, wmPulsesCountLabel18, wmPulsesCountLabel19, wmPulsesCountLabel20, + wmPulsesCountLabel21, wmPulsesCountLabel22, wmPulsesCountLabel23, wmPulsesCountLabel24, + }; + pulsesCountTextBox = new TextBox[MaxWMsCount] + { + wmPulsesCountTextBox1, wmPulsesCountTextBox2, wmPulsesCountTextBox3, wmPulsesCountTextBox4, + wmPulsesCountTextBox5, wmPulsesCountTextBox6, wmPulsesCountTextBox7, wmPulsesCountTextBox8, + wmPulsesCountTextBox9, wmPulsesCountTextBox10, wmPulsesCountTextBox11, wmPulsesCountTextBox12, + wmPulsesCountTextBox13, wmPulsesCountTextBox14, wmPulsesCountTextBox15, wmPulsesCountTextBox16, + wmPulsesCountTextBox17, wmPulsesCountTextBox18, wmPulsesCountTextBox19, wmPulsesCountTextBox20, + wmPulsesCountTextBox21, wmPulsesCountTextBox22, wmPulsesCountTextBox23, wmPulsesCountTextBox24, + }; + + rects = new Rectangle[MaxWMsCount]; + for (int i = 0; i < MaxWMsCount; i++) + { + int row = i % 12; + int col = i / 12; + rects[i] = new Rectangle(350 + col * 557, 25 + row * 47, 230, 37); + } + + completed = false; + minPulsesCount = 1; /// Must be >0 so that initially the indication is RED + + /// Attach to 'AdjustmentInProgress' handler + UiBridge.Bridge.PulsesTestInProgressHandler += delegate(object sender, UiBridge.PulsesTestInProgressEventArgs args) + { + if (InvokeRequired) + { + Invoke(new EventHandler(OnPulsesTestInProgress), sender, args); + } + else OnPulsesTestInProgress(sender, args); + }; + } + + /// + /// Constructor + /// + /// Number of text boxes for serial numbers + public WMPulsesForm24(IList waterMeters) + : this() + { + waterMetersCount = waterMeters.Count; + + ShuffleTextBoxes(waterMetersCount, Config.Data.LineSize); + + disabled = new bool[waterMetersCount]; + pulsesCount = new double[waterMetersCount]; + /// + for (int i = 0; i < waterMetersCount; i++) + { + disabled[i] = waterMeters[i].Disabled; + pulsesCount[i] = 0; + } + } + + + /// + /// 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) + { + if (wmsCount < textBoxesCount && lineSize > 0) + { + int nrLines = (wmsCount + lineSize - 1) / lineSize; + int gap = (textBoxesCount - wmsCount) / nrLines; + + int dest = 0; + for (int l = 0; l < nrLines; l++) + { + for (int i = 0; i < lineSize; i++) + { + labels[dest] = labels[l * lineSize + l * gap + i]; + pulsesCountTextBox[dest] = pulsesCountTextBox[l * lineSize + l * gap + i]; + rects[dest] = rects[l * lineSize + l * gap + i]; + dest++; + } + } + textBoxesCount = wmsCount; + } + } + + + void Localize() + { + Text = Strings.Water_Meter_States; + for (int i = 0; i < textBoxesCount; i++) + { + labels[i].Text = string.Format("WM{0} {1}", i + 1, Strings.Pulses_); + } + okButton.Text = Strings.OkBtnText; + } + + private void WMPulsesForm24_Load(object sender, EventArgs e) + { + Localize(); + + //Height = 50 + 90 * WaterMetersCount; + + for (int i = 0; i < textBoxesCount; i++) + { + labels[i].Visible = pulsesCountTextBox[i].Visible = (disabled == null || i >= disabled.Length || !disabled[i]); + } + + Redraw(); + + for (int i = 0; i < textBoxesCount; i++) pulsesCountTextBox[i].Text = "---"; + } + + private void okButton_Click(object sender, EventArgs e) + { + completed = true; + Close(); + } + + void OnPulsesTestInProgress(object sender, UiBridge.PulsesTestInProgressEventArgs args) + { + string testName = args.TestName; + minPulsesCount = args.MinPulsesCount; + + Results.Entities.TestRslt tr = TBF.BenchControl.Sequences.ProcessData.BatchRslts.GetTestRslt(testName, 0); + + int count = Math.Min(waterMetersCount, TBF.BenchControl.Sequences.ProcessData.BatchRslts.WMPositionsCount); + for (int i = 0; i < count; i++) + { + Results.Entities.MeterTestRslt mtr = TBF.BenchControl.Sequences.ProcessData.BatchRslts.GetMeterTestRslt(testName, i, CompoundMeterId.Single); + if (mtr != null) pulsesCount[i] = mtr.PulsesMeter; + } + + Redraw(); + } + + void Redraw() + { + for (int i = 0; i < textBoxesCount; i++) + { + pulsesCountTextBox[i].Text = pulsesCount[i].ToString("F0"); + Invalidate(rects[i]); + } + } + + private void WMPulsesForm24_Paint(object sender, PaintEventArgs e) + { + System.Drawing.Graphics graphics = this.CreateGraphics(); + + for (int i = 0; i < waterMetersCount; i++) + { + if (!disabled[i]) + { + PaintOne(graphics, rects[i], pulsesCount[i], minPulsesCount); + } + } + } + + void PaintOne(System.Drawing.Graphics g, Rectangle r, double value, double limLo) + { + Rectangle rect1 = new Rectangle(r.Left, r.Top, r.Width / 3, r.Height); + Rectangle rect2 = new Rectangle(r.Left + r.Width / 3, r.Top, r.Width / 3, r.Height); + Rectangle rect3 = new Rectangle(r.Left + 2 * (r.Width / 3), r.Top, r.Width / 3, r.Height); + + Brush redBrush = new SolidBrush(Color.FromName("Salmon")); + Brush greenBrush = new SolidBrush(Color.FromName("LightGreen")); + Brush centBrush = new SolidBrush(Color.FromName("Green")); + if (value >= limLo) + { + g.FillRectangle(greenBrush, rect2); + } + else + { + g.FillRectangle(redBrush, rect2); + } + } + + #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) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/WMPulsesForm24.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/WMPulsesForm24.designer.cs new file mode 100644 index 00000000..29a4ae41 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/WMPulsesForm24.designer.cs @@ -0,0 +1,697 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +namespace TBF.BenchControl.TestMethods.PulsesTest +{ + partial class WMPulsesForm24 + { + /// + /// 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() + { + this.wmPulsesCountTextBox2 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel2 = new System.Windows.Forms.Label(); + this.wmPulsesCountLabel1 = new System.Windows.Forms.Label(); + this.okButton = new System.Windows.Forms.Button(); + this.wmPulsesCountTextBox3 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel3 = new System.Windows.Forms.Label(); + this.wmPulsesCountTextBox4 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel4 = new System.Windows.Forms.Label(); + this.wmPulsesCountTextBox5 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel5 = new System.Windows.Forms.Label(); + this.wmPulsesCountTextBox6 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel6 = new System.Windows.Forms.Label(); + this.wmPulsesCountTextBox1 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountTextBox7 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel7 = new System.Windows.Forms.Label(); + this.wmPulsesCountTextBox8 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel8 = new System.Windows.Forms.Label(); + this.wmPulsesCountTextBox9 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel9 = new System.Windows.Forms.Label(); + this.wmPulsesCountTextBox10 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel10 = new System.Windows.Forms.Label(); + this.wmPulsesCountTextBox12 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel12 = new System.Windows.Forms.Label(); + this.wmPulsesCountTextBox11 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel11 = new System.Windows.Forms.Label(); + this.wmPulsesCountTextBox24 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel24 = new System.Windows.Forms.Label(); + this.wmPulsesCountTextBox23 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel23 = new System.Windows.Forms.Label(); + this.wmPulsesCountTextBox22 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel22 = new System.Windows.Forms.Label(); + this.wmPulsesCountTextBox21 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel21 = new System.Windows.Forms.Label(); + this.wmPulsesCountTextBox20 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel20 = new System.Windows.Forms.Label(); + this.wmPulsesCountTextBox19 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel19 = new System.Windows.Forms.Label(); + this.wmPulsesCountTextBox18 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel18 = new System.Windows.Forms.Label(); + this.wmPulsesCountTextBox17 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel17 = new System.Windows.Forms.Label(); + this.wmPulsesCountTextBox16 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel16 = new System.Windows.Forms.Label(); + this.wmPulsesCountTextBox15 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel15 = new System.Windows.Forms.Label(); + this.wmPulsesCountTextBox14 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel14 = new System.Windows.Forms.Label(); + this.wmPulsesCountTextBox13 = new System.Windows.Forms.TextBox(); + this.wmPulsesCountLabel13 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // wmPulsesCountTextBox2 + // + this.wmPulsesCountTextBox2.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox2.Location = new System.Drawing.Point(198, 74); + this.wmPulsesCountTextBox2.Name = "wmPulsesCountTextBox2"; + this.wmPulsesCountTextBox2.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox2.TabIndex = 1; + this.wmPulsesCountTextBox2.Visible = false; + // + // wmPulsesCountLabel2 + // + this.wmPulsesCountLabel2.AutoSize = true; + this.wmPulsesCountLabel2.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel2.Location = new System.Drawing.Point(33, 85); + this.wmPulsesCountLabel2.Name = "wmPulsesCountLabel2"; + this.wmPulsesCountLabel2.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel2.TabIndex = 0; + this.wmPulsesCountLabel2.Text = "Pulses count"; + this.wmPulsesCountLabel2.Visible = false; + // + // wmPulsesCountLabel1 + // + this.wmPulsesCountLabel1.AutoSize = true; + this.wmPulsesCountLabel1.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel1.Location = new System.Drawing.Point(33, 39); + this.wmPulsesCountLabel1.Name = "wmPulsesCountLabel1"; + this.wmPulsesCountLabel1.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel1.TabIndex = 0; + this.wmPulsesCountLabel1.Text = "Pulses count"; + this.wmPulsesCountLabel1.Visible = false; + // + // okButton + // + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(1157, 28); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(98, 63); + this.okButton.TabIndex = 7; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // wmPulsesCountTextBox3 + // + this.wmPulsesCountTextBox3.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox3.Location = new System.Drawing.Point(198, 120); + this.wmPulsesCountTextBox3.Name = "wmPulsesCountTextBox3"; + this.wmPulsesCountTextBox3.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox3.TabIndex = 1; + this.wmPulsesCountTextBox3.Visible = false; + // + // wmPulsesCountLabel3 + // + this.wmPulsesCountLabel3.AutoSize = true; + this.wmPulsesCountLabel3.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel3.Location = new System.Drawing.Point(33, 131); + this.wmPulsesCountLabel3.Name = "wmPulsesCountLabel3"; + this.wmPulsesCountLabel3.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel3.TabIndex = 0; + this.wmPulsesCountLabel3.Text = "Pulses count"; + this.wmPulsesCountLabel3.Visible = false; + // + // wmPulsesCountTextBox4 + // + this.wmPulsesCountTextBox4.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox4.Location = new System.Drawing.Point(198, 166); + this.wmPulsesCountTextBox4.Name = "wmPulsesCountTextBox4"; + this.wmPulsesCountTextBox4.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox4.TabIndex = 1; + this.wmPulsesCountTextBox4.Visible = false; + // + // wmPulsesCountLabel4 + // + this.wmPulsesCountLabel4.AutoSize = true; + this.wmPulsesCountLabel4.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel4.Location = new System.Drawing.Point(33, 177); + this.wmPulsesCountLabel4.Name = "wmPulsesCountLabel4"; + this.wmPulsesCountLabel4.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel4.TabIndex = 0; + this.wmPulsesCountLabel4.Text = "Pulses count"; + this.wmPulsesCountLabel4.Visible = false; + // + // wmPulsesCountTextBox5 + // + this.wmPulsesCountTextBox5.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox5.Location = new System.Drawing.Point(198, 213); + this.wmPulsesCountTextBox5.Name = "wmPulsesCountTextBox5"; + this.wmPulsesCountTextBox5.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox5.TabIndex = 1; + this.wmPulsesCountTextBox5.Visible = false; + // + // wmPulsesCountLabel5 + // + this.wmPulsesCountLabel5.AutoSize = true; + this.wmPulsesCountLabel5.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel5.Location = new System.Drawing.Point(33, 224); + this.wmPulsesCountLabel5.Name = "wmPulsesCountLabel5"; + this.wmPulsesCountLabel5.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel5.TabIndex = 0; + this.wmPulsesCountLabel5.Text = "Pulses count"; + this.wmPulsesCountLabel5.Visible = false; + // + // wmPulsesCountTextBox6 + // + this.wmPulsesCountTextBox6.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox6.Location = new System.Drawing.Point(198, 259); + this.wmPulsesCountTextBox6.Name = "wmPulsesCountTextBox6"; + this.wmPulsesCountTextBox6.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox6.TabIndex = 1; + this.wmPulsesCountTextBox6.Visible = false; + // + // wmPulsesCountLabel6 + // + this.wmPulsesCountLabel6.AutoSize = true; + this.wmPulsesCountLabel6.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel6.Location = new System.Drawing.Point(33, 271); + this.wmPulsesCountLabel6.Name = "wmPulsesCountLabel6"; + this.wmPulsesCountLabel6.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel6.TabIndex = 0; + this.wmPulsesCountLabel6.Text = "Pulses count"; + this.wmPulsesCountLabel6.Visible = false; + // + // wmPulsesCountTextBox1 + // + this.wmPulsesCountTextBox1.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox1.Location = new System.Drawing.Point(198, 28); + this.wmPulsesCountTextBox1.Name = "wmPulsesCountTextBox1"; + this.wmPulsesCountTextBox1.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox1.TabIndex = 1; + this.wmPulsesCountTextBox1.Visible = false; + // + // wmPulsesCountTextBox7 + // + this.wmPulsesCountTextBox7.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox7.Location = new System.Drawing.Point(198, 305); + this.wmPulsesCountTextBox7.Name = "wmPulsesCountTextBox7"; + this.wmPulsesCountTextBox7.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox7.TabIndex = 9; + this.wmPulsesCountTextBox7.Visible = false; + // + // wmPulsesCountLabel7 + // + this.wmPulsesCountLabel7.AutoSize = true; + this.wmPulsesCountLabel7.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel7.Location = new System.Drawing.Point(33, 317); + this.wmPulsesCountLabel7.Name = "wmPulsesCountLabel7"; + this.wmPulsesCountLabel7.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel7.TabIndex = 8; + this.wmPulsesCountLabel7.Text = "Pulses count"; + this.wmPulsesCountLabel7.Visible = false; + // + // wmPulsesCountTextBox8 + // + this.wmPulsesCountTextBox8.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox8.Location = new System.Drawing.Point(198, 351); + this.wmPulsesCountTextBox8.Name = "wmPulsesCountTextBox8"; + this.wmPulsesCountTextBox8.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox8.TabIndex = 11; + this.wmPulsesCountTextBox8.Visible = false; + // + // wmPulsesCountLabel8 + // + this.wmPulsesCountLabel8.AutoSize = true; + this.wmPulsesCountLabel8.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel8.Location = new System.Drawing.Point(33, 363); + this.wmPulsesCountLabel8.Name = "wmPulsesCountLabel8"; + this.wmPulsesCountLabel8.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel8.TabIndex = 10; + this.wmPulsesCountLabel8.Text = "Pulses count"; + this.wmPulsesCountLabel8.Visible = false; + // + // wmPulsesCountTextBox9 + // + this.wmPulsesCountTextBox9.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox9.Location = new System.Drawing.Point(198, 397); + this.wmPulsesCountTextBox9.Name = "wmPulsesCountTextBox9"; + this.wmPulsesCountTextBox9.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox9.TabIndex = 13; + this.wmPulsesCountTextBox9.Visible = false; + // + // wmPulsesCountLabel9 + // + this.wmPulsesCountLabel9.AutoSize = true; + this.wmPulsesCountLabel9.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel9.Location = new System.Drawing.Point(33, 408); + this.wmPulsesCountLabel9.Name = "wmPulsesCountLabel9"; + this.wmPulsesCountLabel9.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel9.TabIndex = 12; + this.wmPulsesCountLabel9.Text = "Pulses count"; + this.wmPulsesCountLabel9.Visible = false; + // + // wmPulsesCountTextBox10 + // + this.wmPulsesCountTextBox10.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox10.Location = new System.Drawing.Point(198, 443); + this.wmPulsesCountTextBox10.Name = "wmPulsesCountTextBox10"; + this.wmPulsesCountTextBox10.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox10.TabIndex = 15; + this.wmPulsesCountTextBox10.Visible = false; + // + // wmPulsesCountLabel10 + // + this.wmPulsesCountLabel10.AutoSize = true; + this.wmPulsesCountLabel10.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel10.Location = new System.Drawing.Point(33, 454); + this.wmPulsesCountLabel10.Name = "wmPulsesCountLabel10"; + this.wmPulsesCountLabel10.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel10.TabIndex = 14; + this.wmPulsesCountLabel10.Text = "Pulses count"; + this.wmPulsesCountLabel10.Visible = false; + // + // wmPulsesCountTextBox12 + // + this.wmPulsesCountTextBox12.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox12.Location = new System.Drawing.Point(198, 535); + this.wmPulsesCountTextBox12.Name = "wmPulsesCountTextBox12"; + this.wmPulsesCountTextBox12.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox12.TabIndex = 19; + this.wmPulsesCountTextBox12.Visible = false; + // + // wmPulsesCountLabel12 + // + this.wmPulsesCountLabel12.AutoSize = true; + this.wmPulsesCountLabel12.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel12.Location = new System.Drawing.Point(33, 546); + this.wmPulsesCountLabel12.Name = "wmPulsesCountLabel12"; + this.wmPulsesCountLabel12.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel12.TabIndex = 18; + this.wmPulsesCountLabel12.Text = "Pulses count"; + this.wmPulsesCountLabel12.Visible = false; + // + // wmPulsesCountTextBox11 + // + this.wmPulsesCountTextBox11.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox11.Location = new System.Drawing.Point(198, 489); + this.wmPulsesCountTextBox11.Name = "wmPulsesCountTextBox11"; + this.wmPulsesCountTextBox11.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox11.TabIndex = 17; + this.wmPulsesCountTextBox11.Visible = false; + // + // wmPulsesCountLabel11 + // + this.wmPulsesCountLabel11.AutoSize = true; + this.wmPulsesCountLabel11.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel11.Location = new System.Drawing.Point(33, 500); + this.wmPulsesCountLabel11.Name = "wmPulsesCountLabel11"; + this.wmPulsesCountLabel11.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel11.TabIndex = 16; + this.wmPulsesCountLabel11.Text = "Pulses count"; + this.wmPulsesCountLabel11.Visible = false; + // + // wmPulsesCountTextBox24 + // + this.wmPulsesCountTextBox24.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox24.Location = new System.Drawing.Point(754, 535); + this.wmPulsesCountTextBox24.Name = "wmPulsesCountTextBox24"; + this.wmPulsesCountTextBox24.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox24.TabIndex = 43; + this.wmPulsesCountTextBox24.Visible = false; + // + // wmPulsesCountLabel24 + // + this.wmPulsesCountLabel24.AutoSize = true; + this.wmPulsesCountLabel24.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel24.Location = new System.Drawing.Point(589, 546); + this.wmPulsesCountLabel24.Name = "wmPulsesCountLabel24"; + this.wmPulsesCountLabel24.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel24.TabIndex = 42; + this.wmPulsesCountLabel24.Text = "Pulses count"; + this.wmPulsesCountLabel24.Visible = false; + // + // wmPulsesCountTextBox23 + // + this.wmPulsesCountTextBox23.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox23.Location = new System.Drawing.Point(754, 489); + this.wmPulsesCountTextBox23.Name = "wmPulsesCountTextBox23"; + this.wmPulsesCountTextBox23.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox23.TabIndex = 41; + this.wmPulsesCountTextBox23.Visible = false; + // + // wmPulsesCountLabel23 + // + this.wmPulsesCountLabel23.AutoSize = true; + this.wmPulsesCountLabel23.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel23.Location = new System.Drawing.Point(589, 500); + this.wmPulsesCountLabel23.Name = "wmPulsesCountLabel23"; + this.wmPulsesCountLabel23.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel23.TabIndex = 40; + this.wmPulsesCountLabel23.Text = "Pulses count"; + this.wmPulsesCountLabel23.Visible = false; + // + // wmPulsesCountTextBox22 + // + this.wmPulsesCountTextBox22.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox22.Location = new System.Drawing.Point(754, 443); + this.wmPulsesCountTextBox22.Name = "wmPulsesCountTextBox22"; + this.wmPulsesCountTextBox22.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox22.TabIndex = 39; + this.wmPulsesCountTextBox22.Visible = false; + // + // wmPulsesCountLabel22 + // + this.wmPulsesCountLabel22.AutoSize = true; + this.wmPulsesCountLabel22.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel22.Location = new System.Drawing.Point(589, 454); + this.wmPulsesCountLabel22.Name = "wmPulsesCountLabel22"; + this.wmPulsesCountLabel22.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel22.TabIndex = 38; + this.wmPulsesCountLabel22.Text = "Pulses count"; + this.wmPulsesCountLabel22.Visible = false; + // + // wmPulsesCountTextBox21 + // + this.wmPulsesCountTextBox21.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox21.Location = new System.Drawing.Point(754, 397); + this.wmPulsesCountTextBox21.Name = "wmPulsesCountTextBox21"; + this.wmPulsesCountTextBox21.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox21.TabIndex = 37; + this.wmPulsesCountTextBox21.Visible = false; + // + // wmPulsesCountLabel21 + // + this.wmPulsesCountLabel21.AutoSize = true; + this.wmPulsesCountLabel21.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel21.Location = new System.Drawing.Point(589, 408); + this.wmPulsesCountLabel21.Name = "wmPulsesCountLabel21"; + this.wmPulsesCountLabel21.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel21.TabIndex = 36; + this.wmPulsesCountLabel21.Text = "Pulses count"; + this.wmPulsesCountLabel21.Visible = false; + // + // wmPulsesCountTextBox20 + // + this.wmPulsesCountTextBox20.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox20.Location = new System.Drawing.Point(754, 351); + this.wmPulsesCountTextBox20.Name = "wmPulsesCountTextBox20"; + this.wmPulsesCountTextBox20.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox20.TabIndex = 35; + this.wmPulsesCountTextBox20.Visible = false; + // + // wmPulsesCountLabel20 + // + this.wmPulsesCountLabel20.AutoSize = true; + this.wmPulsesCountLabel20.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel20.Location = new System.Drawing.Point(589, 363); + this.wmPulsesCountLabel20.Name = "wmPulsesCountLabel20"; + this.wmPulsesCountLabel20.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel20.TabIndex = 34; + this.wmPulsesCountLabel20.Text = "Pulses count"; + this.wmPulsesCountLabel20.Visible = false; + // + // wmPulsesCountTextBox19 + // + this.wmPulsesCountTextBox19.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox19.Location = new System.Drawing.Point(754, 305); + this.wmPulsesCountTextBox19.Name = "wmPulsesCountTextBox19"; + this.wmPulsesCountTextBox19.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox19.TabIndex = 33; + this.wmPulsesCountTextBox19.Visible = false; + // + // wmPulsesCountLabel19 + // + this.wmPulsesCountLabel19.AutoSize = true; + this.wmPulsesCountLabel19.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel19.Location = new System.Drawing.Point(589, 317); + this.wmPulsesCountLabel19.Name = "wmPulsesCountLabel19"; + this.wmPulsesCountLabel19.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel19.TabIndex = 32; + this.wmPulsesCountLabel19.Text = "Pulses count"; + this.wmPulsesCountLabel19.Visible = false; + // + // wmPulsesCountTextBox18 + // + this.wmPulsesCountTextBox18.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox18.Location = new System.Drawing.Point(754, 259); + this.wmPulsesCountTextBox18.Name = "wmPulsesCountTextBox18"; + this.wmPulsesCountTextBox18.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox18.TabIndex = 27; + this.wmPulsesCountTextBox18.Visible = false; + // + // wmPulsesCountLabel18 + // + this.wmPulsesCountLabel18.AutoSize = true; + this.wmPulsesCountLabel18.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel18.Location = new System.Drawing.Point(589, 271); + this.wmPulsesCountLabel18.Name = "wmPulsesCountLabel18"; + this.wmPulsesCountLabel18.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel18.TabIndex = 23; + this.wmPulsesCountLabel18.Text = "Pulses count"; + this.wmPulsesCountLabel18.Visible = false; + // + // wmPulsesCountTextBox17 + // + this.wmPulsesCountTextBox17.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox17.Location = new System.Drawing.Point(754, 213); + this.wmPulsesCountTextBox17.Name = "wmPulsesCountTextBox17"; + this.wmPulsesCountTextBox17.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox17.TabIndex = 26; + this.wmPulsesCountTextBox17.Visible = false; + // + // wmPulsesCountLabel17 + // + this.wmPulsesCountLabel17.AutoSize = true; + this.wmPulsesCountLabel17.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel17.Location = new System.Drawing.Point(589, 224); + this.wmPulsesCountLabel17.Name = "wmPulsesCountLabel17"; + this.wmPulsesCountLabel17.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel17.TabIndex = 22; + this.wmPulsesCountLabel17.Text = "Pulses count"; + this.wmPulsesCountLabel17.Visible = false; + // + // wmPulsesCountTextBox16 + // + this.wmPulsesCountTextBox16.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox16.Location = new System.Drawing.Point(754, 166); + this.wmPulsesCountTextBox16.Name = "wmPulsesCountTextBox16"; + this.wmPulsesCountTextBox16.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox16.TabIndex = 30; + this.wmPulsesCountTextBox16.Visible = false; + // + // wmPulsesCountLabel16 + // + this.wmPulsesCountLabel16.AutoSize = true; + this.wmPulsesCountLabel16.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel16.Location = new System.Drawing.Point(589, 177); + this.wmPulsesCountLabel16.Name = "wmPulsesCountLabel16"; + this.wmPulsesCountLabel16.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel16.TabIndex = 21; + this.wmPulsesCountLabel16.Text = "Pulses count"; + this.wmPulsesCountLabel16.Visible = false; + // + // wmPulsesCountTextBox15 + // + this.wmPulsesCountTextBox15.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox15.Location = new System.Drawing.Point(754, 120); + this.wmPulsesCountTextBox15.Name = "wmPulsesCountTextBox15"; + this.wmPulsesCountTextBox15.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox15.TabIndex = 31; + this.wmPulsesCountTextBox15.Visible = false; + // + // wmPulsesCountLabel15 + // + this.wmPulsesCountLabel15.AutoSize = true; + this.wmPulsesCountLabel15.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel15.Location = new System.Drawing.Point(589, 131); + this.wmPulsesCountLabel15.Name = "wmPulsesCountLabel15"; + this.wmPulsesCountLabel15.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel15.TabIndex = 20; + this.wmPulsesCountLabel15.Text = "Pulses count"; + this.wmPulsesCountLabel15.Visible = false; + // + // wmPulsesCountTextBox14 + // + this.wmPulsesCountTextBox14.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox14.Location = new System.Drawing.Point(754, 74); + this.wmPulsesCountTextBox14.Name = "wmPulsesCountTextBox14"; + this.wmPulsesCountTextBox14.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox14.TabIndex = 28; + this.wmPulsesCountTextBox14.Visible = false; + // + // wmPulsesCountLabel14 + // + this.wmPulsesCountLabel14.AutoSize = true; + this.wmPulsesCountLabel14.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel14.Location = new System.Drawing.Point(589, 85); + this.wmPulsesCountLabel14.Name = "wmPulsesCountLabel14"; + this.wmPulsesCountLabel14.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel14.TabIndex = 25; + this.wmPulsesCountLabel14.Text = "Pulses count"; + this.wmPulsesCountLabel14.Visible = false; + // + // wmPulsesCountTextBox13 + // + this.wmPulsesCountTextBox13.Font = new System.Drawing.Font("Verdana", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountTextBox13.Location = new System.Drawing.Point(754, 28); + this.wmPulsesCountTextBox13.Name = "wmPulsesCountTextBox13"; + this.wmPulsesCountTextBox13.Size = new System.Drawing.Size(137, 40); + this.wmPulsesCountTextBox13.TabIndex = 29; + this.wmPulsesCountTextBox13.Visible = false; + // + // wmPulsesCountLabel13 + // + this.wmPulsesCountLabel13.AutoSize = true; + this.wmPulsesCountLabel13.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmPulsesCountLabel13.Location = new System.Drawing.Point(589, 39); + this.wmPulsesCountLabel13.Name = "wmPulsesCountLabel13"; + this.wmPulsesCountLabel13.Size = new System.Drawing.Size(130, 23); + this.wmPulsesCountLabel13.TabIndex = 24; + this.wmPulsesCountLabel13.Text = "Pulses count"; + this.wmPulsesCountLabel13.Visible = false; + // + // WMPulsesForm24 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGoldenrod; + this.ClientSize = new System.Drawing.Size(1267, 592); + this.Controls.Add(this.wmPulsesCountTextBox24); + this.Controls.Add(this.wmPulsesCountLabel24); + this.Controls.Add(this.wmPulsesCountTextBox23); + this.Controls.Add(this.wmPulsesCountLabel23); + this.Controls.Add(this.wmPulsesCountTextBox22); + this.Controls.Add(this.wmPulsesCountLabel22); + this.Controls.Add(this.wmPulsesCountTextBox21); + this.Controls.Add(this.wmPulsesCountLabel21); + this.Controls.Add(this.wmPulsesCountTextBox20); + this.Controls.Add(this.wmPulsesCountLabel20); + this.Controls.Add(this.wmPulsesCountTextBox19); + this.Controls.Add(this.wmPulsesCountLabel19); + this.Controls.Add(this.wmPulsesCountTextBox18); + this.Controls.Add(this.wmPulsesCountLabel18); + this.Controls.Add(this.wmPulsesCountTextBox17); + this.Controls.Add(this.wmPulsesCountLabel17); + this.Controls.Add(this.wmPulsesCountTextBox16); + this.Controls.Add(this.wmPulsesCountLabel16); + this.Controls.Add(this.wmPulsesCountTextBox15); + this.Controls.Add(this.wmPulsesCountLabel15); + this.Controls.Add(this.wmPulsesCountTextBox14); + this.Controls.Add(this.wmPulsesCountLabel14); + this.Controls.Add(this.wmPulsesCountTextBox13); + this.Controls.Add(this.wmPulsesCountLabel13); + this.Controls.Add(this.wmPulsesCountTextBox12); + this.Controls.Add(this.wmPulsesCountLabel12); + this.Controls.Add(this.wmPulsesCountTextBox11); + this.Controls.Add(this.wmPulsesCountLabel11); + this.Controls.Add(this.wmPulsesCountTextBox10); + this.Controls.Add(this.wmPulsesCountLabel10); + this.Controls.Add(this.wmPulsesCountTextBox9); + this.Controls.Add(this.wmPulsesCountLabel9); + this.Controls.Add(this.wmPulsesCountTextBox8); + this.Controls.Add(this.wmPulsesCountLabel8); + this.Controls.Add(this.wmPulsesCountTextBox7); + this.Controls.Add(this.wmPulsesCountLabel7); + this.Controls.Add(this.wmPulsesCountTextBox6); + this.Controls.Add(this.wmPulsesCountLabel6); + this.Controls.Add(this.wmPulsesCountTextBox5); + this.Controls.Add(this.wmPulsesCountLabel5); + this.Controls.Add(this.wmPulsesCountTextBox4); + this.Controls.Add(this.wmPulsesCountLabel4); + this.Controls.Add(this.wmPulsesCountTextBox3); + this.Controls.Add(this.wmPulsesCountLabel3); + this.Controls.Add(this.wmPulsesCountTextBox2); + this.Controls.Add(this.wmPulsesCountLabel2); + this.Controls.Add(this.wmPulsesCountTextBox1); + this.Controls.Add(this.wmPulsesCountLabel1); + this.Controls.Add(this.okButton); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "WMPulsesForm24"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "Water Meter States"; + this.TopMost = true; + this.Load += new System.EventHandler(this.WMPulsesForm24_Load); + this.Paint += new System.Windows.Forms.PaintEventHandler(this.WMPulsesForm24_Paint); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox wmPulsesCountTextBox2; + private System.Windows.Forms.Label wmPulsesCountLabel2; + private System.Windows.Forms.Label wmPulsesCountLabel1; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.TextBox wmPulsesCountTextBox3; + private System.Windows.Forms.Label wmPulsesCountLabel3; + private System.Windows.Forms.TextBox wmPulsesCountTextBox4; + private System.Windows.Forms.Label wmPulsesCountLabel4; + private System.Windows.Forms.TextBox wmPulsesCountTextBox5; + private System.Windows.Forms.Label wmPulsesCountLabel5; + private System.Windows.Forms.TextBox wmPulsesCountTextBox6; + private System.Windows.Forms.Label wmPulsesCountLabel6; + private System.Windows.Forms.TextBox wmPulsesCountTextBox1; + private System.Windows.Forms.TextBox wmPulsesCountTextBox7; + private System.Windows.Forms.Label wmPulsesCountLabel7; + private System.Windows.Forms.TextBox wmPulsesCountTextBox8; + private System.Windows.Forms.Label wmPulsesCountLabel8; + private System.Windows.Forms.TextBox wmPulsesCountTextBox9; + private System.Windows.Forms.Label wmPulsesCountLabel9; + private System.Windows.Forms.TextBox wmPulsesCountTextBox10; + private System.Windows.Forms.Label wmPulsesCountLabel10; + private System.Windows.Forms.TextBox wmPulsesCountTextBox12; + private System.Windows.Forms.Label wmPulsesCountLabel12; + private System.Windows.Forms.TextBox wmPulsesCountTextBox11; + private System.Windows.Forms.Label wmPulsesCountLabel11; + private System.Windows.Forms.TextBox wmPulsesCountTextBox24; + private System.Windows.Forms.Label wmPulsesCountLabel24; + private System.Windows.Forms.TextBox wmPulsesCountTextBox23; + private System.Windows.Forms.Label wmPulsesCountLabel23; + private System.Windows.Forms.TextBox wmPulsesCountTextBox22; + private System.Windows.Forms.Label wmPulsesCountLabel22; + private System.Windows.Forms.TextBox wmPulsesCountTextBox21; + private System.Windows.Forms.Label wmPulsesCountLabel21; + private System.Windows.Forms.TextBox wmPulsesCountTextBox20; + private System.Windows.Forms.Label wmPulsesCountLabel20; + private System.Windows.Forms.TextBox wmPulsesCountTextBox19; + private System.Windows.Forms.Label wmPulsesCountLabel19; + private System.Windows.Forms.TextBox wmPulsesCountTextBox18; + private System.Windows.Forms.Label wmPulsesCountLabel18; + private System.Windows.Forms.TextBox wmPulsesCountTextBox17; + private System.Windows.Forms.Label wmPulsesCountLabel17; + private System.Windows.Forms.TextBox wmPulsesCountTextBox16; + private System.Windows.Forms.Label wmPulsesCountLabel16; + private System.Windows.Forms.TextBox wmPulsesCountTextBox15; + private System.Windows.Forms.Label wmPulsesCountLabel15; + private System.Windows.Forms.TextBox wmPulsesCountTextBox14; + private System.Windows.Forms.Label wmPulsesCountLabel14; + private System.Windows.Forms.TextBox wmPulsesCountTextBox13; + private System.Windows.Forms.Label wmPulsesCountLabel13; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/WMPulsesForm24.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/WMPulsesForm24.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/PulsesTest/WMPulsesForm24.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/ReferenceFlowmeterCalibration/ReferenceFlowmeterCalibrationSeq.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/ReferenceFlowmeterCalibration/ReferenceFlowmeterCalibrationSeq.cs new file mode 100644 index 00000000..32900a64 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/ReferenceFlowmeterCalibration/ReferenceFlowmeterCalibrationSeq.cs @@ -0,0 +1,410 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Text; +using log4net; +using TBF.BenchControl; +using TBF.Boxes; +using TBF.Resources; +using TBF.UiBridge; + +namespace TBF.BenchControl.TestMethods.ReferenceFlowmeterCalibration +{ + public class ReferenceFlowmeterCalibrationSeq : Sequences.SequenceBase + { + private static readonly ILog log = LogManager.GetLogger(typeof(ReferenceFlowmeterCalibrationSeq)); + + /// + /// Flying start mass collection method sequence + /// + /// Test entity + /// + /// Event.Done . . . . . . . OK + /// Event.UiCmdStop . . . . Stopped by the user using the on-screen button STOP + /// Event.OpArgumentError . Target flow is out of range + /// Event.Error . . . . . . Unspecified error + /// + public IList Execute(Config.Entities.Test test, int repetitionNr, bool isLastRepetition) + { + Elde.ControlBoardDev cBrd = StateMachine.ControlBoard; + + IList e = new List(); /// Events from currently running operations + Event retVal = Event.Done; + checkUiOp = new Operations.CheckUIOp(true); /// Runs in more then one state + + float switchTimeStart = 0.001f; /// in seconds, original vale is 1 ms + float switchTimeEnd = 0.001f; /// in seconds, original vale is 1 ms + + LtrPerRefPulse = outPath.FlowMeter.LtrPerPulse; /// [ltr/pulse], nominal flow in [m3/h] + + /// Notes: + /// float timeHr = volumeLtr / (1000.0f * targetFlow); + /// float timeSec = 3600.0f * timeHr; + /// int refPulses = (int)(timeSec * (2000.0f * targetFlow / pOut.FlowMeter.NominalFlow)); + int totalPulses = (int)(test.Volume / LtrPerRefPulse + 0.5f); + + processDataLoggingOp = new TBF.BenchControl.Operations.ProcessDataLoggingOp(processDataLogger, this, false); + + //==================================== + loop: + /// Start the test, initialize test results + Bridge.OnTestSelected(this, new TestSelectedEventArgs(test, repetitionNr, inPath, benchPath, outPath, sensPath, totalPulses)); + string testName = Results.Utils.GetTestName(test.Name, test.Repeats, repetitionNr); + TestStartTime = DateTime.Now; + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + int flowSetTime0 = StateMachine.Time; + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Setting_the_flow); + //------------------------------------------------ + if (inPath.Pump is GenericDevices.IPumpFM) (inPath.Pump as GenericDevices.IPumpFM).TurnOn(test.PumpPower); + + State.Create("ReferenceFlowmeterCalibration : Starting the pump") + .AddOperation(checkUiOp) + .AddOperation(new Operations.TimerOp(5)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + + + State.Create("ReferenceFlowmeterCalibration : Starting the pump") + .AddOperation(checkUiOp) + .AddOperation(cBrd.SetValvesOp(inPath.Pump, null)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.ValvesSet)); + + + if (!test.DoDraining) /// If condition met => skip measuring and force emptying + { + /// + /// Measure the weight and skip emptying if there is enough room in the tank + /// + State.Create("ReferenceFlowmeterCalibration : Measuring mass of water in the tank") + .AddOperation(checkUiOp) + .AddOperation(outPath.Scale.ReadMassOp(ref Mass)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.BalanceDone)); + + double estimatedEndMass = Mass.Val + test.Volume; + if (estimatedEndMass < outPath.Scale.Capacity * Constants.TankFullFactor) + { + goto set_flow; /// Enough room in the tank -> skip emptying + } + } + + /// + /// Empty the water tank + /// + switch (DrainTheTank(outPath.Scale.DrainValve, outPath.Scale)) + { + case Event.Error: { retVal = Event.Error; goto stopTest; } + case Event.UiCmdStop: { retVal = Event.UiCmdStop; goto stopTest; } + } + + set_flow: + + //-------------------------------- + State.Create("ReferenceFlowmeterCalibration : Setting the flow") + .AddOperation(checkUiOp) + .AddOperation(outPath.RegulValve.SetFlowOp(outPath.FlowMeter, test.Qfrom, test.Qto, outPath.PidCoef, RefFlow, 600)) /// timeout = 10 min. + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (e.Contains(Event.OpArgumentError)) { retVal = Event.OpArgumentError; goto stopTest; } + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.RegulValveTimeOut)) + { + Bridge.OnError(this, Strings.Timeout); + retVal = Event.Done; + goto stopTest; + } + if (e.Contains(Event.Next)) goto flow_set; + } + while (!e.Contains(Event.FlowReached)); + + flow_set: + int flowSetTime = StateMachine.Time - flowSetTime0; + + double currentFlow = RefFlow.Val; + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Measuring_the_weight); + //------------------------------------------------ + State.Create("ReferenceFlowmeterCalibration : Measuring the start mass") + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation((StateMachine.Ambient != null) + ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) : null) + .AddOperation(outPath.Scale.ReadStableMassOp(ref StartMass, test.MassRepeats, test.MassSpread, test.MassMethod)) + .AddOperation(cBrd.UpdateTankWeightOp()) + .AddOperation(processDataLoggingOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.BalanceDone)); + + Mass.Val = StartMass.Val; + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Test_in_progress); + //------------------------------------------------ + State.Create("ReferenceFlowmeterCalibration : Starting the test") + .AddOperation(checkUiOp) + .AddOperation(cBrd.StartMeasurementOp(outPath, Elde.TestMethods.Diverter | Elde.TestMethods.Synchro, + test.Qfrom, test.Qto, totalPulses, (float)test.TolerRed)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.MeasurementStarted)); + + /// Measurement loop - preparation + readRegistersOp = new Operations.ReadMoreRegistersOp(sensPath.RegisterReaders); + queryEnd1 = cBrd.QueryMeasurementEndOp(); + queryEnd2 = cBrd.QueryMeasurementEndOp(); + + StartNewStatistics(StateMachine.Time, BatchRslts.Batch.BatchNr, test.Name, repetitionNr); + + /// Read the diverter switch time + switchTimeStart = 0.001f * (float)cBrd.DivTime(0); + log.WarnFormat("Diverter switch time on test start = {0} ms", cBrd.DivTime(0)); + + /// Measurement loop - begin + while (true) + { + //-------------------------------- + switch (ReadRegistersTempPressAmbient(null, true)) + { + case Event.Error: { retVal = Event.Error; goto stopTest; } + case Event.UiCmdStop: { retVal = Event.UiCmdStop; goto stopTest; } + case Event.MeasurementCompleted: goto test_completed; + } + + RefFreq.Val = cBrd.ReferenceFreq; + RefFlow.Val = cBrd.ReferenceFlow; + UpdateAllStatistics(StateMachine.Time); + + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + } + /// Measurement loop - end + + test_completed: + + StopRecordingStatistics(); + + State.Create("ReferenceFlowmeterCalibration : Waiting before mass measurement") + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation(readRegistersOp) + .AddOperation((StateMachine.Ambient != null) + ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) : null) + .AddOperation(outPath.Scale.ReadMassOp(ref Mass)) + .AddOperation(cBrd.UpdateTankWeightOp()) + .AddOperation(processDataLoggingOp) + .AddOperation(new Operations.TimerOp(test.TimeStop2Mass)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + + /// Read the diverter switch time + switchTimeEnd = 0.001f * (float)cBrd.DivTime(0); + log.WarnFormat("Diverter switch time on test end = {0} ms", cBrd.DivTime(0)); + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Measuring_the_weight); + //------------------------------------------------ + State.Create("ReferenceFlowmeterCalibration : Measuring the end mass") + .AddOperation(checkUiOp) + .AddOperation(benchPath.TempMtrUp.ReadTempOp(ref TempUp)) + .AddOperation(benchPath.TempMtrDown.ReadTempOp(ref TempDown)) + .AddOperation(outPath.TempDiv.ReadTempOp(ref TempDiv)) + .AddOperation(benchPath.PressMtrUp.ReadPressureOp(ref PressUp)) + .AddOperation(benchPath.PressMtrDown.ReadPressureOp(ref PressDown)) + .AddOperation(benchPath.PressMtrDelta == null ? null : benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)) + .AddOperation((StateMachine.Ambient != null) + ? StateMachine.Ambient.ReadAmbientOp(AmbTemp, AmbPress, AmbHumi) : null) + .AddOperation(outPath.Scale.ReadStableMassOp(ref EndMass, test.MassRepeats, test.MassSpread, test.MassMethod)) + .AddOperation(cBrd.UpdateTankWeightOp()) + .AddOperation(processDataLoggingOp) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.BalanceDone)); + /// + TestEndTime = DateTime.Now; + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Test_completed); + //------------------------------------------------ + + /// Make sure the CycleBeginForm is closed so that water meter data (s/n) can be copied into results + if (UIFlowControl.Stop == WaitBeginFormClosed()) goto stopTest; + + /// + /// Populate TestResult data entity with data + /// + Results.Entities.TestRslt tstRslt = BatchRslts.GetTestRslt(testName, test.Part); + + if (tstRslt != null) + { + UpdateTempPressDensAmb(tstRslt); + + /// Main results + tstRslt.StartTime = TestStartTime; + tstRslt.EndTime = TestEndTime; + tstRslt.FlowSetTime = flowSetTime; + tstRslt.TestTime = cBrd.TTime; /// [s] measurement time + tstRslt.PulsesMaster = Convert.ToDouble(cBrd.EtPulses(0)); /// Pulses of the master flow meter (test total) + tstRslt.MassStartRaw = StartMass.Val; + tstRslt.MassStart = Formulas.CorrectedValue(tstRslt.MassStartRaw, outPath.Scale.Corrections); + tstRslt.MassEndRaw = EndMass.Val; + tstRslt.MassEnd = Formulas.CorrectedValue(tstRslt.MassEndRaw, outPath.Scale.Corrections); + tstRslt.FlowMass = 3600.0 * (tstRslt.MassEnd - tstRslt.MassStart) / tstRslt.TestTime; /// [kg/h] + tstRslt.FlowVolume = 3.6 * LtrPerRefPulse * tstRslt.PulsesMaster / tstRslt.TestTime; /// [m3/h] + tstRslt.Buoyancy = Formulas.Buoyancy(); + double density = Formulas.WaterDensityFromTemp((tstRslt.TempUpMean + tstRslt.TempDownMean) / 2.0); + tstRslt.VolumeCTV = 1000.0 * tstRslt.Buoyancy * (tstRslt.MassEnd - tstRslt.MassStart) / density; /// [l] 1000.0f is because density is in [kg/m3] + tstRslt.VolumeMaster = LtrPerRefPulse * tstRslt.PulsesMaster; /// [l] volume from the master flow meter + tstRslt.ConstMaster = LtrPerRefPulse * tstRslt.VolumeCTV / tstRslt.VolumeMaster; /// Corrected master pulses per liter + tstRslt.ErrorMaster = Formulas.ErrorFromVolumes(tstRslt.VolumeMaster, tstRslt.VolumeCTV); + + tstRslt.FlowMean = (float)RefFlowStat.Average; + tstRslt.FlowStart = (float)RefFlowStat.First; + tstRslt.FlowEnd = (float)RefFlowStat.Last; + tstRslt.FlowMin = (float)RefFlowStat.Min; + tstRslt.FlowMax = (float)RefFlowStat.Max; + + tstRslt.DiverterStart = switchTimeStart; + tstRslt.DiverterEnd = switchTimeEnd; + tstRslt.ErrorFlagsMd = (ErrorFlagsComp != null) ? (sbyte)ErrorFlagsComp.Mode : (sbyte)0; + tstRslt.ErrorFlags = (ErrorFlagsComp != null) ? ErrorFlagsComp.GetErrorFlags(tstRslt, true, false, switchTimeStart, switchTimeEnd) : 0; + + /// Update flowmeter constant with the measured one + if (outPath.FlowMeter.Idx1 > 0 && outPath.FlowMeter.Idx1 <= ReferenceFlowmetersCount) + { + CalibratedLtrPerRefPulse[outPath.FlowMeter.Idx1 - 1] = Convert.ToSingle(tstRslt.ConstMaster); + log.InfoFormat("Updating LtrPerRefPulse[{0}] = {1}", outPath.FlowMeter.Idx1 - 1, tstRslt.ConstMaster); + } + + tstRslt.Components = Results.Entities.Components + .UpdateList(BatchRslts.ComponentsList, + new Results.Entities.Components((BenchInfo != null) ? BenchInfo.TestBenchId : 1, + (BenchInfo != null) ? BenchInfo.TestBenchName : "testbench", + inPath.Pump != null ? inPath.Pump.Name : string.Empty, + outPath.FlowMeter != null ? outPath.FlowMeter.Name : string.Empty, + outPath.Scale != null ? outPath.Scale.Name : string.Empty, + outPath.RegulValve != null ? outPath.RegulValve.Name : string.Empty, + outPath.Diverter != null ? outPath.Diverter.Name : string.Empty)); + + /// Update water meter error flags + if (ErrorFlagsComp != null) + { + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (BatchRslts.WaterMeters[i] != null) + { + BatchRslts.WaterMeters[i].ErrorFlags = ErrorFlagsComp.GetWMtrErrorFlags(BatchRslts.WaterMeters[i].MeterTestRslts); + } + } + } + + /// Update results + Bridge.OnTestCompleted(this, new TestCompletedEventArgs(testName, tstRslt)); + } + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.TransitionAfter)); + + /// Append the results to the CSV-file + allResults.Info(TestResult2CsvLine(testName, test.Part)); + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, + (retVal == Event.Done) ? Config.Entities.Progress.Completed : Config.Entities.Progress.Aborted)); + + + stopTest: + + StopRecordingStatistics(); + + /// + /// Quit this sequence + /// + if (isLastRepetition || retVal == Event.UiCmdStop || retVal == Event.OpArgumentError + || retVal == Event.Error || retVal == Event.ConfigurationError) + { + State.Create("ReferenceFlowmeterCalibration : Stopping diverter, gate, etc.") + .AddOperation(checkUiOp) + .AddOperation(cBrd.StopPreviousOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.PreviousStopped)); + } + + /// Create a list with one item 'retVal' (default is Event.Done) and return it + IList retList = new List(1); + retList.Add(retVal); + return retList; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/ReferenceFlowmeterCalibration/TestMethod.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/ReferenceFlowmeterCalibration/TestMethod.cs new file mode 100644 index 00000000..6bfd95cb --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/ReferenceFlowmeterCalibration/TestMethod.cs @@ -0,0 +1,35 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; +using TBF.BenchControl; + +namespace TBF.BenchControl.TestMethods.ReferenceFlowmeterCalibration +{ + public class TestMethod : ComponentBase, GenericDevices.ITestMethod + { + private static readonly ILog log = LogManager.GetLogger(typeof(TestMethod)); + public override string ToString() { return string.Format("TestMethods.ReferenceFlowmeterCalibration({0})", Cfg.ToString(1)); } + + public bool CanTest(MetersKind meters) { return meters != MetersKind.HeatMeter; } + public bool DoTransitions() { return true; } + + public TestMethod() + { + } + + public TestMethod(Generic.IComponentCfg cfg) + : base(cfg) + { + log.Debug(this.ToString()); + } + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + return (new ReferenceFlowmeterCalibrationSeq()).Execute(test, repetNr, isLastRepetition); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/ReferenceFlowmeterCalibration/TestMethodFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/ReferenceFlowmeterCalibration/TestMethodFactory.cs new file mode 100644 index 00000000..39b4fbbf --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/ReferenceFlowmeterCalibration/TestMethodFactory.cs @@ -0,0 +1,27 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; +using TBF.BenchControl.Configs.NameOnly; + +namespace TBF.BenchControl.TestMethods.ReferenceFlowmeterCalibration +{ + public class TestMethodFactory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { TestMethod.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new TestMethod(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new TestMethod(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this.GetType().Namespace.Substring(29), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/RoiDetection/RoiDetection.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/RoiDetection/RoiDetection.cs new file mode 100644 index 00000000..b099c56f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/RoiDetection/RoiDetection.cs @@ -0,0 +1,47 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; +using TBF.BenchControl; + +namespace TBF.BenchControl.TestMethods.RoiDetection +{ + public class RoiDetection : ComponentBase, GenericDevices.ITestMethod + { + private static readonly ILog log = LogManager.GetLogger(typeof(RoiDetection)); + public override string ToString() { return string.Format("TestMethods.RoiDetection({0})", Cfg.ToString(1)); } + + public bool CanTest(MetersKind meters) { return true; } + public bool DoTransitions() { return true; } + + public RoiDetection() + { + } + + public RoiDetection(Generic.IComponentCfg cfg) + : base(cfg) + { + log.Debug(this.ToString()); + } + + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + GenericDevices.ICameraDisplay display = null; + + foreach (var cmpnt in StateMachine.Components) + { + if (cmpnt is GenericDevices.ICameraDisplay) + { + display = (cmpnt as GenericDevices.ICameraDisplay); + break; + } + } + + return (new RoiDetectionSeq()).Execute(test, display, repetNr, isLastRepetition); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/RoiDetection/RoiDetectionCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/RoiDetection/RoiDetectionCfg.cs new file mode 100644 index 00000000..43cca89a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/RoiDetection/RoiDetectionCfg.cs @@ -0,0 +1,37 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.RoiDetection +{ + public class RoiDetectionCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(RoiDetectionCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new RoiDetectionCfgCtrl(); } + + /// Private parameterless constructor invoked by all other (public) constructors + RoiDetectionCfg() + { + } + + public RoiDetectionCfg(IComponentFactory factory, string name) + : this() + { + Name = name; + ParentName = string.Empty; + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}", Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/RoiDetection/RoiDetectionCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/RoiDetection/RoiDetectionCfgCtrl.cs new file mode 100644 index 00000000..50e163d6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/RoiDetection/RoiDetectionCfgCtrl.cs @@ -0,0 +1,69 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.RoiDetection +{ + public partial class RoiDetectionCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + RoiDetectionCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as RoiDetectionCfg; + Redraw(); + } + } + + public RoiDetectionCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/RoiDetection/RoiDetectionCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/RoiDetection/RoiDetectionCfgCtrl.designer.cs new file mode 100644 index 00000000..81a12a5b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/RoiDetection/RoiDetectionCfgCtrl.designer.cs @@ -0,0 +1,82 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.TestMethods.RoiDetection +{ + partial class RoiDetectionCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(134, 69); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 7; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(24, 72); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 6; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(131, 43); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 5; + this.classNameLabel.Text = "ComonentName"; + // + // RoiDetectionCfgCtrl + // + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "RoiDetectionCfgCtrl"; + this.Size = new System.Drawing.Size(300, 240); + this.ResumeLayout(false); + this.PerformLayout(); + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/RoiDetection/RoiDetectionCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/RoiDetection/RoiDetectionCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/RoiDetection/RoiDetectionCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/RoiDetection/RoiDetectionFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/RoiDetection/RoiDetectionFactory.cs new file mode 100644 index 00000000..e62b65b5 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/RoiDetection/RoiDetectionFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.RoiDetection +{ + public class RoiDetectionFactory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { RoiDetection.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new RoiDetection(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new RoiDetection(cfg); } + + public IComponentCfg DefaultConfig() { return new RoiDetectionCfg(this, this.GetType().Namespace.Substring(29)); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(RoiDetectionCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/RoiDetection/RoiDetectionSeq.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/RoiDetection/RoiDetectionSeq.cs new file mode 100644 index 00000000..635d023e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/RoiDetection/RoiDetectionSeq.cs @@ -0,0 +1,278 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Text; +using log4net; +using Config.Entities; +using TBF.Resources; +using TBF.UiBridge; +using System.IO; + +namespace TBF.BenchControl.TestMethods.RoiDetection +{ + public class RoiDetectionSeq : Sequences.SequenceBase + { + private static readonly ILog log = LogManager.GetLogger(typeof(RoiDetectionSeq)); + + + public IList Execute(Test test, GenericDevices.ICameraDisplay display, int repetitionNr, bool isLastRepetition) + { + Elde.ControlBoardDev cBrd = StateMachine.ControlBoard; + + IList e = new List(); /// Events from currently running operations + Event retVal = Event.Done; + + /// Operations + checkUiOp = new Operations.CheckUIOp(true); + processDataLoggingOp = null; + + + /// LtrPerRefPulse and totalPulses are only to make time estimates + LtrPerRefPulse = outPath.FlowMeter.LtrPerPulse; /// [ltr/pulse], nominal flow in [m3/h] + /// Notes: + /// float timeHr = volumeLtr / (1000.0f * targetFlow); + /// float timeSec = 3600.0f * timeHr; + /// int refPulses = (int)(timeSec * (2000.0f * targetFlow / pOut.FlowMeter.NominalFlow)); + int totalPulses = (int)(test.Volume / LtrPerRefPulse + 0.5f); + + //==================== + // Start the test + //==================== + Bridge.OnTestSelected(this, new TestSelectedEventArgs(test, repetitionNr, inPath, benchPath, outPath, sensPath, totalPulses)); + string testName = Results.Utils.GetTestName(test.Name, test.Repeats, repetitionNr); + TestStartTime = DateTime.Now; + + //------------------------------------------------- + Bridge.OnActivity(this, Strings.Starting_the_pump); + //------------------------------------------------- + /// + if (inPath.Pump is GenericDevices.IPumpFM) (inPath.Pump as GenericDevices.IPumpFM).TurnOn(test.PumpPower); + State.Create(string.Format("{0}({1}) : Starting the pump", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation(inPath.Pump != null ? cBrd.SetValvesOp(inPath.Pump, null) : null) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } + while (e.Contains(Event.ValvesBusy)); + + + if (test.TimePump2StartV > 0) + { + State.Create(string.Format("{0}({1}) : Waiting after the pump started", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(new Operations.TimerOp(test.TimePump2StartV)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + } + + + if (benchPath.StopBFValve != null) + { + State.Create(string.Format("{0}({1}) : Opening the stop backflow valve", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(benchPath.StopBFValve, null)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } + while (!e.Contains(Event.ValvesSet)); + } + + + if (test.TimeBeforeFlow > 0) + { + State.Create(string.Format("{0}({1}) : Waiting before flow setting process starts", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(new Operations.TimerOp(test.TimeBeforeFlow)) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.TimerExpired)); + } + + + setting_flow: + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Setting_the_flow); + //------------------------------------------------ + State.Create(string.Format("{0}({1}) : Setting the flow", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(outPath.RegulValve.SetFlowOp(outPath.FlowMeter, test.Qfrom, test.Qto, outPath.PidCoef, RefFlow, 600)) /// timeout = 10 min. + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (e.Contains(Event.OpArgumentError)) { retVal = Event.OpArgumentError; goto stopTest; } + if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.RegulValveTimeOut)) + { + Bridge.OnError(this, Strings.Flow_adjustment_failed); + retVal = Event.UiCmdStop; + goto stopTest; + } + if (e.Contains(Event.Next)) goto flow_set; + } + while (!e.Contains(Event.FlowReached)); + + flow_set: + + int time = StateMachine.Time; + double currentFlow = RefFlow.Val; + + string[] imageNames = new string[sensPath.RegisterReaders.Length]; + + for (int i = 0; i < sensPath.RegisterReaders.Length; i++) + { + GenericDevices.IRoi roi = sensPath.RegisterReaders[i] as GenericDevices.IRoi; + if (roi != null) + { + roi.ClearRoi(); + } + else + { + imageNames[i] = null; + } + } + + detection_loop: + + //--------------------------------------------------------- + Bridge.OnActivity(this, Strings.ROI_Detection_in_Progress); + //--------------------------------------------------------- + + State detection = State.Create(string.Format("{0}({1}) : Detection of ROI-s", test.Method, test.Name)) + .AddOperation(checkUiOp); + for (int i = 0; i < sensPath.RegisterReaders.Length; i++) + { + GenericDevices.IRoi roi = sensPath.RegisterReaders[i] as GenericDevices.IRoi; + if (roi != null && !roi.Detected) + { + detection.AddOperation(roi.RoiDetectionOp()); + imageNames[i] = roi.ImageFileNamePrefix + "detected.jpg"; + } + } + detection.EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + + if (e.Contains(Event.Error)) + { + retVal = Event.Error; + goto stopTest; + } + if (TestAndLogUiCmdStop(test,e)) + { + retVal = Event.UiCmdStop; + goto stopTest; + } + } + while (e.Contains(Event.CameraBusy)); + + //----------------------------------------------------------------------------------------------------- + if (e.Contains(Event.RoiDetectionPreviousFailed)) Bridge.OnActivity(this, Strings.Camera_error); + else if (e.Contains(Event.RoiDetectionFailed)) Bridge.OnActivity(this, Strings.Detection_failed); + else Bridge.OnActivity(this, Strings.Detection_completed); + //----------------------------------------------------------------------------------------------------- + + string title = Strings.Select_images_and_press_Retry_to_retry_RoI_detection; + State.Create(string.Format("{0}({1}) : Select images and press Retry to retry RoI detection", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation((display == null) ? null : display.ShowStaticImageOp(imageNames, title)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + + if (TestAndLogUiCmdStop(test, e)) + { + retVal = Event.UiCmdStop; + goto stopTest; + } + } + while (e.Contains(Event.ModelessFormIsOpen)); + + if (e.Contains(Event.Retry)) + { + for (int i = 0; i < display.SelectedImages.Length; i++) + { + GenericDevices.IRoi roi = sensPath.RegisterReaders[i] as GenericDevices.IRoi; + if (roi != null && display.SelectedImages[i]) + { + roi.ClearRoi(); + } + } + + goto detection_loop; + } + else if (e.Contains(Event.Abort)) + { + retVal = Event.UiCmdStop; + goto stopTest; + } + + //--------------------------------------------------- + Bridge.OnActivity(this, Strings.Detection_completed); + //--------------------------------------------------- + + stopTest: + + /// + /// Quit this sequence + /// + if (isLastRepetition || retVal == Event.UiCmdStop || retVal == Event.OpArgumentError + || retVal == Event.Error || retVal == Event.ConfigurationError) + { + State.Create(string.Format("{0}({1}) : Stopping diverter, gate, etc.", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(cBrd.StopPreviousOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) goto stopTest; + } + while (!e.Contains(Event.PreviousStopped)); + } + + /// Create a list with one item 'retVal' (default is Event.Done) and return it + IList retList = new List(1); + retList.Add(retVal); + return retList; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/SensitivityTest/SensitivityTestParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/SensitivityTest/SensitivityTestParams.cs new file mode 100644 index 00000000..c31fb367 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/SensitivityTest/SensitivityTestParams.cs @@ -0,0 +1,143 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.SensitivityTest +{ + public class SensitivityTestParams : TestParamsBase, IParamsProvider, ITestParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(SensitivityTestParams) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public float TargetQ; /// Target=terminal flow durning detection when increasing or decreasing the flow + public float RateOfChange; /// Each step is calculated as (TargetQfrom - Qfrom) * RateOfChange, text form is displayed in % (*100) + public float DetectionThreshold; /// Drop of frequency for the detection, text form is displayed in % (*100) + public bool SupressTrills; /// Main meter readings are ignored during test (suitable for small flows) + + public override void InitializeAll() + { + TargetQ = 3.0f; + RateOfChange = 0.05f; + DetectionThreshold = 0.25f; + SupressTrills = false; + } + + + string[] paramNames = new string[] + { + Strings.TargetQ, + Strings.RateOfChangePct, + Strings.DetectionThresholdPct, + Strings.SupressWMTrills, + }; + public override string ParamName(int i) { return paramNames[i]; } + public override int ParamsCount() { return paramNames.Length; } + + public override string ToString(int i) + { + switch (i) + { + case 0: return TargetQ.ToString(); + case 1: return (100.0f * RateOfChange).ToString(); + case 2: return (100.0f * DetectionThreshold).ToString(); + case 3: return (SupressTrills ? Strings.yes : Strings.no); + default: return string.Empty; + } + } + + public CfgUpdateFlags UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: TargetQ = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 1: RateOfChange = Utils.ParseUFloat(strValue) / 100.0f; return CfgUpdateFlags.None; + case 2: DetectionThreshold = Utils.ParseUFloat(strValue) / 100.0f; return CfgUpdateFlags.None; + case 3: SupressTrills = strValue.Equals(Strings.yes); return CfgUpdateFlags.None; + default: return CfgUpdateFlags.None; + } + } + + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + + float dummy; + switch (i) + { + case 0: + case 1: + case 2: + if (Utils.TryParseUFloat(strValue, out dummy)) return true; + break; + case 3: + if (strValue.Equals(Strings.yes) || strValue.Equals(Strings.no)) return true; + break; + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(SensitivityTestParams prms) + { + prms.TargetQ = this.TargetQ; + prms.RateOfChange = this.RateOfChange; + prms.DetectionThreshold = this.DetectionThreshold; + prms.SupressTrills = this.SupressTrills; + } + + public IParamsProvider Clone() + { + SensitivityTestParams pars = new SensitivityTestParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateFromDbEntity(ComponentTest dbEntity) + { + if (dbEntity == null) return; + try + { + SensitivityTestParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as SensitivityTestParams; + + testParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + test = dbEntity.Test; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + /// + /// Parameterless constructor initializes the parameters + /// + public SensitivityTestParams() + { + } + + public SensitivityTestParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public SensitivityTestParams(ComponentTest testParamsEntity, string componentName, Test test) + { + this.testParamsEntity = testParamsEntity; + this.componentName = componentName; + this.test = test; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/SensitivityTest/SensitivityTestSeq.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/SensitivityTest/SensitivityTestSeq.cs new file mode 100644 index 00000000..909a251e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/SensitivityTest/SensitivityTestSeq.cs @@ -0,0 +1,586 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Text; +using log4net; +using TBF.BenchControl; +using TBF.Resources; +using TBF.UiBridge; + +namespace TBF.BenchControl.TestMethods.SensitivityTest +{ + public class SensitivityTestSeq : Sequences.SequenceBase + { + private static readonly ILog log = LogManager.GetLogger(typeof(SensitivityTestSeq)); + + const int DetectionBufferSize = 9; + const int DetectionKernelSize = 5; + + /// + /// Executes the specified test. + /// + /// The test. + /// The repetition nr. + /// The test parameters. + /// The debug level. + /// + public IList Execute(Config.Entities.Test test, int repetitionNr, + SensitivityTestParams testParams, + Config.Entities.DebugMode debugLevel) + { + IList e = new List(); /// Events from currently running operations + checkUiOp = new Operations.CheckUIOp(true); /// Runs in more then one state + + float switchTimeStart = 0.001f; /// in seconds, original vale is 1 ms + float switchTimeEnd = 0.001f; /// in seconds, original vale is 1 ms + + if (test.Part < 1 || test.Part > Config.Data.CompoundWMsCount) + { + UiBridge.Bridge.OnError(this, string.Format("Test 'Part' should be 1 .. {0}", Config.Data.CompoundWMsCount)); + IList retval = new List(1); + retval.Add(Event.ConfigurationError); + return retval; + } + + if (debugLevel == Config.Entities.DebugMode.Simulate) + { + /// + /// Test method simulation + /// + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (test.Name.ToLower().Contains("rise") || test.Name.ToLower().Contains("steig")) + { + MakeSimulatedCompound(test, 1, 0, 0.7f, 0.0f); + } + else + { + MakeSimulatedCompound(test, 1, 0, 0.7f, 0.9f); + } + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.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 + + for (int i = 0; i < Config.Data.WMsCount; i++) + { + TestMethods.iPerlCommunication.iPerlHead.IperlHead iPerl = ((sensPath.RegisterReaders != null) && (i < sensPath.RegisterReaders.Length)) + ? (sensPath.RegisterReaders[i] as TestMethods.iPerlCommunication.iPerlHead.IperlHead) + : null; + if (iPerl != null) + { + /// TODO: Reimplement + //iPerl.LastTestResult = meterRslt; /// Save this water meter test result to iPerl WM + iPerl.NominalTestFlowLph = 500.0 * (double)(test.Qfrom + test.Qto); /// Ave. + convert to liter/hour + } + } + + //------------------------------------------------ + Bridge.OnActivity(this, string.Format("Simulating {0}", test.Name)); + //------------------------------------------------ + + State.Create(string.Format("{0}({1}) : Simulating", test.Method, test.Name)) + .AddOperation(checkUiOp) + .EnterState(); + e = StateMachine.WaitRunDevsRunOps(); + + Event retVal = Event.Done; + if (TestAndLogUiCmdStop(test, e)) retVal = Event.UiCmdStop; + + /// Create a list with one item 'retVal' (default is Event.Done) and return it + IList retListSim = new List(1); + retListSim.Add(retVal); + return retListSim; + } + + + Elde.ControlBoardDev cBrd = StateMachine.ControlBoard; + + /// Specific for combined meters + int[] lastWMPulses = new int[2 * Config.Data.CompoundWMsCount]; + + //-------------------------------- + State.Create(string.Format("{0}({1}) : stopTest diverter gate etc", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(cBrd.StopPreviousOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test,e)) goto stopTest; + } + while (!e.Contains(Event.PreviousStopped)); + + + LtrPerRefPulse = outPath.FlowMeter.LtrPerPulse; /// [ltr/pulse], nominal flow in [m3/h] + + /// Notes: + /// float timeHr = volumeLtr / (1000.0f * targetFlow); + /// float timeSec = 3600.0f * timeHr; + /// int refPulses = (int)(timeSec * (2000.0f * targetFlow / pOut.FlowMeter.NominalFlow)); + int totalPulses = (int)(test.Volume / LtrPerRefPulse + 0.5f); + + processDataLoggingOp = new TBF.BenchControl.Operations.ProcessDataLoggingOp(processDataLogger, this, false); + + /// Meters path is required for the following: + readRegistersOp = new Operations.ReadMoreRegistersOp(sensPath.RegisterReaders); + + //==================================== + loop: + /// Start the test, initialize test results + Bridge.OnTestSelected(this, new TestSelectedEventArgs(test, repetitionNr, inPath, benchPath, outPath, sensPath, (int)totalPulses)); + string testName = Results.Utils.GetTestName(test.Name, test.Repeats, repetitionNr); + TestStartTime = DateTime.Now; + + Qrise = 0; + + if (!test.DoDraining) /// Do not skip emptying if test.Emptying==true + { + //-------------------------------- + State.Create(string.Format("{0}({1}) : Mesuring mass of water in the tank", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(outPath.Scale.ReadMassOp(ref Mass)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) goto error; + if (TestAndLogUiCmdStop(test,e)) goto stopTest; + } + while (!e.Contains(Event.BalanceDone)); + + double estimatedEndMass = Mass.Val + test.Volume; + if (estimatedEndMass < outPath.Scale.Capacity * Constants.TankFullFactor) + { + goto switching_flow_detection; /// Enough room in the tank -> skip emptying + } + } + + // Empty the water tank + switch (DrainTheTank(outPath.Scale.DrainValve, outPath.Scale)) + { + case Event.Error: goto error; + case Event.UiCmdStop: goto stopTest; + } + + switching_flow_detection: + + int flowDetectTime0 = StateMachine.Time; + int flowDetectTime = 0; + float estFlowSetTime = 100.0f; + + + /// + /// Prepare cameras, ROI-s and measurementOperations + /// + + /// Find ROI-s + IList rois = new List(); + foreach (var rr in sensPath.RegisterReaders) + { + GenericDevices.IRoi roi = rr as GenericDevices.IRoi; + if (roi != null && roi.Detected) + { + rois.Add(roi); + } + } + + /// Find cameras + IList cameras = new List(); + foreach (var roi in rois) + { + if (roi.Camera != null && !cameras.Contains(roi.Camera)) + { + roi.Camera.ClearRoiParams(); + cameras.Add(roi.Camera); + } + } + + /// Register ROI-parameters to cameras + foreach (var roi in rois) roi.RegisterRoiToCamera(); + + /// Prepare measurementOperations + IList measureOperations = new List(); + foreach (var camera in cameras) measureOperations.Add(camera.MeasurementOp()); + + + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Switching_flow_detection); + //------------------------------------------------ + State.Create(string.Format("{0}({1}) : Starting the pump", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperations(measureOperations) + .AddOperation((inPath.Pump is GenericDevices.IPumpFM) ? (inPath.Pump as GenericDevices.IPumpFM).TurnOnOp(test.PumpPower) : null) + .AddOperation(cBrd.SetValvesOp(inPath.Pump, null)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.SwitchingFlowDetection)); + + if (TestAndLogUiCmdStop(test,e)) goto stopTest; + } + while (!e.Contains(Event.ValvesSet)); + + //-------------------------------- + State.Create(string.Format("{0}({1}) : Setting the initial flow", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperations(measureOperations) + .AddOperation(outPath.RegulValve.SetFlowAndMeasureOp(outPath.FlowMeter, test.Qfrom, test.Qto, outPath.PidCoef, RefFlow, 600, (float)test.TolerRed)) /// timeout = 10 min. + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.SwitchingFlowDetection)); + + if (TestAndLogUiCmdStop(test,e)) goto stopTest; + if (e.Contains(Event.RegulValveTimeOut)) + { + Bridge.OnError(this, Strings.Flow_adjustment_failed); + goto error; + } + } + while (!e.Contains(Event.FlowReached)); + + //-------------------------------- + switch (ReadRegistersTempPressAmbient(measureOperations, false)) + { + case Event.Error: goto error; + case Event.UiCmdStop: goto stopTest; + } + + //==================================== + // Find the switching flow + //==================================== + + int flowSetTime0 = StateMachine.Time; + + /// Allocate detection buffers + double[] flowsForDetection = new double[DetectionBufferSize]; + double[] pulseFreqsForDetection = new double[DetectionBufferSize]; + + /// Current values + flowsForDetection[0] = RefFlow.Val; + pulseFreqsForDetection[0] = 0.0f; + int startTime = StateMachine.Time; + int lastTime = StateMachine.Time; + + /// Detection parameters + float rvPulse = (testParams.TargetQ > (test.Qfrom + test.Qto) / 2.0f) ? 0.05f : -0.05f; // rise or fall? + rvPulse *= (100.0f * testParams.RateOfChange); + + bool detected = false; + bool targetReached = false; + double detectedFlow = 0; + + int detectionStartTime = StateMachine.Time; + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.SwitchingFlowDetection)); + + do + { + //-------------------------------- + State.Create(string.Format("{0}({1}) : Changing the RV position", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperations(measureOperations) + .AddOperation(outPath.RegulValve.ChangeRegulValvePositionOp(rvPulse)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.SwitchingFlowDetection)); + + if (TestAndLogUiCmdStop(test,e)) goto stopTest; + } + while (!e.Contains(Event.PositionReached)); + + // Last pulses are kept to calculate differences + for (int i = 0; i < 2 * Config.Data.CompoundWMsCount; i++) lastWMPulses[i] = RegisterReaders[i].WMPulses; + + // Shift data in the detection buffers + for (int i = DetectionBufferSize - 2; i >= 0; i--) + { + flowsForDetection[i+1] = flowsForDetection[i]; + pulseFreqsForDetection[i+1] = pulseFreqsForDetection[i]; + } + + switch (ReadRegistersTempPressAmbient(measureOperations, false)) + { + case Event.Error: goto error; + case Event.UiCmdStop: goto stopTest; + } + + int time = StateMachine.Time; + int diff = RegisterReaders[(test.Part - 1) * 2 + 1].WMPulses - lastWMPulses[(test.Part - 1) * 2 + 1]; + flowsForDetection[0] = cBrd.ReferenceFreq * outPath.FlowMeter.NominalFlow / 2000.0f; + pulseFreqsForDetection[0] = (float)diff / (float)(time - lastTime); + lastTime = StateMachine.Time; + + if (StateMachine.Time - detectionStartTime > 15) + { + if ((flowsForDetection[0] > 0) && (flowsForDetection[DetectionBufferSize - 1] > 0)) + { + double[] flowBefore = new double[DetectionKernelSize]; + double[] flowAfter = new double[DetectionKernelSize]; + double[] freqBefore = new double[DetectionKernelSize]; + double[] freqAfter = new double[DetectionKernelSize]; + for (int i = 0; i < DetectionKernelSize; i++) + { + flowBefore[i] = flowsForDetection[DetectionBufferSize - DetectionKernelSize + i]; + freqBefore[i] = pulseFreqsForDetection[DetectionBufferSize - DetectionKernelSize + i]; + flowAfter[i] = flowsForDetection[i]; + freqAfter[i] = pulseFreqsForDetection[i]; + } + Array.Sort(flowBefore); + Array.Sort(flowAfter); + Array.Sort(freqBefore); + Array.Sort(freqAfter); + flowBefore[0] = 0; + flowAfter[0] = 0; + //freqBefore[0] = 0; + //freqAfter[0] = 0; + flowBefore[DetectionKernelSize - 1] = 0; + flowAfter[DetectionKernelSize - 1] = 0; + //freqBefore[DetectionKernelSize - 1] = 0; + //freqAfter[DetectionKernelSize - 1] = 0; + double aveFlowBefore = 0; + double aveFlowAfter = 0; + double aveFreqBefore = 0; + double aveFreqAfter = 0; + foreach (var f in flowBefore) aveFlowBefore += f; + foreach (var f in flowAfter) aveFlowAfter += f; + foreach (var f in freqBefore) aveFreqBefore += f; + foreach (var f in freqAfter) aveFreqAfter += f; + aveFlowBefore /= (double)(DetectionKernelSize - 2); + aveFlowAfter /= (double)(DetectionKernelSize - 2); + aveFreqBefore /= (double)(DetectionKernelSize); + aveFreqAfter /= (double)(DetectionKernelSize); + + UiBridge.Bridge.OnLog(this, string.Format("time={0}, flow{1}, aveFlowB={2}, aveFlowA={3}, pulseFreq={4}, aveFreqB={5}, aveFreqA={6}\r\n", + time - startTime, + flowsForDetection[0].ToString("F2"), + aveFlowBefore.ToString("F2"), + aveFlowAfter.ToString("F2"), + pulseFreqsForDetection[0].ToString("F2"), + aveFreqBefore.ToString("F2"), + aveFreqAfter.ToString("F2"))); + + //detectedFlow = (aveFlowBefore + aveFlowAfter) / 2.0f; + detectedFlow = aveFlowBefore; + + if (rvPulse > 0) + { + detected = (aveFreqAfter < aveFreqBefore * (1.0f - testParams.DetectionThreshold)); + targetReached = ((aveFlowAfter + aveFlowBefore) / 2.0f) > testParams.TargetQ; + } + else + { + detected = (aveFreqAfter > aveFreqBefore * (1.0f + testParams.DetectionThreshold)); + targetReached = ((aveFlowAfter + aveFlowBefore) / 2.0f) < testParams.TargetQ; + } + } + } + } + while (!detected && !targetReached); + + Qrise = detectedFlow; + UiBridge.Bridge.OnLog(this, string.Format("detected flow={0}\r\n", detectedFlow.ToString("F2"))); + + int flowSetTime1 = StateMachine.Time; + + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + //-------------------------------- + //State.Create(string.Format("{0}({1}) : Flow sensitivity detected", test.Method, test.Name)) + + TestEndTime = DateTime.Now; + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Test_completed); + //------------------------------------------------ + State.Create(string.Format("{0}({1}) : {2}", test.Method, test.Name, Strings.Stop_the_pump)) + .AddOperation(checkUiOp) + .AddOperation((inPath != null && inPath.Pump is GenericDevices.IPumpFM) ? (inPath.Pump as GenericDevices.IPumpFM).TurnOffOp() : null) + .AddOperation(cBrd.SetValvesOp(null, inPath.Pump)) + .AddOperation(cBrd.UpdateTankWeightOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test,e)) goto stopTest; + } + while (!e.Contains(Event.ValvesSet)); + + + //-------------------------------- + State.Create(string.Format("{0}({1}) : Stopping diverter, gate, etc.", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(cBrd.StopPreviousOp()) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test,e)) goto stopTest; + } + while (!e.Contains(Event.PreviousStopped)); + + /// Make sure the CycleBeginForm is closed so that water meter data (s/n) can be copied into results + if (UIFlowControl.Stop == WaitBeginFormClosed()) goto stopTest; + + /// + /// Populate TestResult data entity with data + /// + Results.Entities.TestRslt tstRslt = BatchRslts.GetTestRslt(testName, test.Part); + + if (tstRslt != null) + { + UpdateTempPressDensAmb(tstRslt); + + /// Main results + tstRslt.MethodClass = TbfComponents.FindComponent(test.Method).ClassName; + tstRslt.StartTime = TestStartTime; + tstRslt.EndTime = TestEndTime; + tstRslt.FlowSetTime = flowSetTime1 - flowSetTime0; + tstRslt.TestTime = cBrd.TTime; /// [s] measurement time + tstRslt.PulsesMaster = 0; /// Pulses of the master flow meter (test total) + tstRslt.MassStartRaw = 0; + tstRslt.MassStart = 0; + tstRslt.MassEndRaw = 0; + tstRslt.MassEnd = 0; + tstRslt.FlowMass = 0; + tstRslt.FlowVolume = 0; + tstRslt.Buoyancy = Config.Formulas.Buoyancy(); + tstRslt.VolumeCTV = 0; + tstRslt.VolumeMaster = 0; + tstRslt.ConstMasterRaw = 0; + tstRslt.ConstMaster = 0; + tstRslt.ErrorMaster = 0; + + tstRslt.FlowMean = (float)RefFlowStat.Average; + tstRslt.FlowStart = (float)RefFlowStat.First; + tstRslt.FlowEnd = (float)RefFlowStat.Last; + tstRslt.FlowMin = (float)RefFlowStat.Min; + tstRslt.FlowMax = (float)RefFlowStat.Max; + + tstRslt.DiverterStart = switchTimeStart; + tstRslt.DiverterEnd = switchTimeEnd; + tstRslt.ErrorFlagsMd = (ErrorFlagsComp != null) ? (sbyte)ErrorFlagsComp.Mode : (sbyte)0; + tstRslt.ErrorFlags = (ErrorFlagsComp != null) ? ErrorFlagsComp.GetErrorFlags(tstRslt, true, false, switchTimeStart, switchTimeEnd) : 0; + + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + Results.Entities.MeterTestRslt meterRslt = BatchRslts.GetMeterTestRslt(testName, i, Config.Entities.CompoundMeterId.Single); + + GenericDevices.IRegisterReader regReader = sensPath.RegisterReaders[i]; + + if (meterRslt != null && regReader != null) + { + meterRslt.RegReaderType = (int)regReader.RegisterReaderType; + meterRslt.PulsesPerLiter = regReader.PulsesPerLtr; + + meterRslt.Passed = (Qrise <= test.Qto) && (tstRslt.ErrorFlags == 0 || tstRslt.ErrorFlagsMode() != Config.Entities.ErrorFlagsMode.On); + meterRslt.TestDone = true; + tstRslt.TestDone = true; + + if (Qrise != 0) + { + BatchRslts.WaterMeters[i].QRise = Qrise; + } + BatchRslts.WaterMeters[i].QFall = 0; + } + } + + tstRslt.Components = Results.Entities.Components + .UpdateList(BatchRslts.ComponentsList, + new Results.Entities.Components((BenchInfo != null) ? BenchInfo.TestBenchId : 1, + (BenchInfo != null) ? BenchInfo.TestBenchName : "testbench", + inPath.Pump != null ? inPath.Pump.Name : string.Empty, + outPath.FlowMeter != null ? outPath.FlowMeter.Name : string.Empty, + outPath.Scale != null ? outPath.Scale.Name : string.Empty, + outPath.RegulValve != null ? outPath.RegulValve.Name : string.Empty, + outPath.Diverter != null ? outPath.Diverter.Name : string.Empty)); + + /// Update water meter error flags + if (ErrorFlagsComp != null) + { + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (BatchRslts.WaterMeters[i] != null) + { + BatchRslts.WaterMeters[i].ErrorFlags = ErrorFlagsComp.GetWMtrErrorFlags(BatchRslts.WaterMeters[i].MeterTestRslts); + } + } + } + + /// Update results + Bridge.OnTestCompleted(this, new TestCompletedEventArgs(testName, tstRslt)); + } + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.TransitionAfter)); + + /// Append the results to the CSV-file + allResults.Info(TestResult2CsvLine(testName, test.Part)); + + ///----------------------/// + /// Quit this sequence /// + ///----------------------/// + + /// Stop the pump + State.Create(string.Format("{0}({1}) : Test(s) completed -> Stopping the pump", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(cBrd.SetValvesOp(null, inPath.Pump)) + .AddOperation((inPath != null && inPath.Pump is GenericDevices.IPumpFM) ? (inPath.Pump as GenericDevices.IPumpFM).TurnOffOp() : null) + .EnterState(); + do { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) goto error; + } + while (!e.Contains(Event.ValvesSet) || ((inPath.Pump is GenericDevices.IPumpFM) && !e.Contains(Event.TurnPumpOnOffDone))); + + /// Create the return value - a list with one event Event.Done - and return + IList retval1 = new List(1); + retval1.Add(Event.Done); + return retval1; + + //==================================== + stopTest: + + State.Create(string.Format("{0}({1}) : User selected STOP -> Closing the valves", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation((inPath != null && inPath.Pump is GenericDevices.IPumpFM) ? (inPath.Pump as GenericDevices.IPumpFM).TurnOffOp() : null) + .AddOperation(cBrd.SetValvesOp(StateMachine.DefaultValvesOpen, StateMachine.DefaultValvesClose)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) goto error; + } + while (!e.Contains(Event.ValvesSet)); + + IList retval2 = new List(1); + retval2.Add(Event.UiCmdStop); + return retval2; + + //==================================== + error: + State.Create(string.Format("{0}({1}) : close_before_error", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation((inPath != null && inPath.Pump is GenericDevices.IPumpFM) ? (inPath.Pump as GenericDevices.IPumpFM).TurnOffOp() : null) + .AddOperation(cBrd.SetValvesOp(StateMachine.DefaultValvesOpen, StateMachine.DefaultValvesClose)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) break; + } + while (!e.Contains(Event.ValvesSet)); + + IList retval3 = new List(1); + retval3.Add(Event.Error); + return retval3; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/SensitivityTest/TestMethod.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/SensitivityTest/TestMethod.cs new file mode 100644 index 00000000..a49e202d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/SensitivityTest/TestMethod.cs @@ -0,0 +1,38 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using Config.Entities; +using TBF.BenchControl; + +namespace TBF.BenchControl.TestMethods.SensitivityTest +{ + public class TestMethod : ComponentBase, GenericDevices.ITestMethod + { + private static readonly ILog log = LogManager.GetLogger(typeof(TestMethod)); + public override string ToString() { return string.Format("TestMethods.SensitivityTest({0})", Cfg.ToString(1)); } + + readonly TestMethodCfg testMethodCfg; + + public bool CanTest(MetersKind meters) { return meters == MetersKind.Single; } + public bool DoTransitions() { return true; } + + public TestMethod() + { + } + + public TestMethod(Generic.IComponentCfg cfg) + : base(cfg) + { + testMethodCfg = cfg as TestMethodCfg; + log.Debug(this.ToString()); + } + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + return (new SensitivityTestSeq()).Execute(test, repetNr, testMethodCfg.TestParams, DebugLevel); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/SensitivityTest/TestMethodCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/SensitivityTest/TestMethodCfg.cs new file mode 100644 index 00000000..4f7da707 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/SensitivityTest/TestMethodCfg.cs @@ -0,0 +1,49 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.SensitivityTest +{ + public class TestMethodCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestMethodCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new TestMethodCfgCtrl(); } + + /// Test parameters + [XmlIgnore] + public SensitivityTestParams TestParams; + public override IParamsProvider GetRuntimeTestParamsProvider() { return TestParams; } + public override IParamsProvider CreateTestParamsProvider() { return new SensitivityTestParams(true); } + public override IParamsProvider GetUITestParamsProvider(Test test) + { + return (test.Method == Name) ? base.GetUITestParamsProvider(test) : null; + } + + /// Private parameterless constructor invoked by all other (public) constructors + TestMethodCfg() + { + TestParams = new SensitivityTestParams(true); + } + + public TestMethodCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + ParentName = string.Empty; + Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}", Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/SensitivityTest/TestMethodCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/SensitivityTest/TestMethodCfgCtrl.cs new file mode 100644 index 00000000..6b05a49c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/SensitivityTest/TestMethodCfgCtrl.cs @@ -0,0 +1,69 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.SensitivityTest +{ + public partial class TestMethodCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + TestMethodCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as TestMethodCfg; + Redraw(); + } + } + + public TestMethodCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/SensitivityTest/TestMethodCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/SensitivityTest/TestMethodCfgCtrl.designer.cs new file mode 100644 index 00000000..6aa2c766 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/SensitivityTest/TestMethodCfgCtrl.designer.cs @@ -0,0 +1,86 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.TestMethods.SensitivityTest +{ + partial class TestMethodCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(137, 57); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 5; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(27, 60); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 4; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(134, 33); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 3; + this.classNameLabel.Text = "ComonentName"; + // + // BasicPrinterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "BasicPrinterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/SensitivityTest/TestMethodCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/SensitivityTest/TestMethodCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/SensitivityTest/TestMethodCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/SensitivityTest/TestMethodFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/SensitivityTest/TestMethodFactory.cs new file mode 100644 index 00000000..4b04026e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/SensitivityTest/TestMethodFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.SensitivityTest +{ + public class TestMethodFactory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".Single"; } } + + public void ResetStaticProperties() { TestMethod.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new TestMethod(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new TestMethod(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this.GetType().Namespace.Substring(29), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/CalibrationStruct.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/CalibrationStruct.cs new file mode 100644 index 00000000..8c71fce7 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/CalibrationStruct.cs @@ -0,0 +1,197 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; + +namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead +{ + public class CalibrationStruct + { + public static readonly int Length = 35; + + public Byte Version; + public MeterType MeterType; + public UInt16 Calibration; + public VolumeUnits VolumeUnits; + public FlowArrow FlowArrow; + public UInt16 FWVersion; + public UInt16[] TargetField; + public UInt16 RecipMeanCurrent; + public UInt16 ThresholdVolume; + public UInt16 ThresholdTime; + public UInt16 FlowActivationThr; + public UInt16 VolumeArrowThr; + public UInt32 CalibrationTime; + public ulong SerialNumber; + public MeterSealed MeterSealed; + public byte CheckSum; + + + public CalibrationStruct() + { + TargetField = new UInt16[3]; + } + + public byte[] ToByteArray() + { + byte[] result = new byte[Length]; + + result[0] = Version; + result[1] = (byte)MeterType; + + result[2] = (byte)(Calibration & 0x00FF); + result[3] = (byte)((Calibration >> 8) & 0x00FF); + + result[4] = (byte)VolumeUnits; + + result[5] = (byte)FlowArrow; + + result[6] = (byte)(FWVersion & 0x00FF); + result[7] = (byte)((FWVersion >> 8) & 0x00FF); + + result[8] = (byte)( TargetField[0] & 0x00FF); + result[9] = (byte)((TargetField[0] >> 8) & 0x00FF); + result[10] = (byte)( TargetField[1] & 0x00FF); + result[11] = (byte)((TargetField[1] >> 8) & 0x00FF); + result[12] = (byte)( TargetField[2] & 0x00FF); + result[13] = (byte)((TargetField[2] >> 8) & 0x00FF); + + result[14] = (byte)(RecipMeanCurrent & 0x00FF); + result[15] = (byte)((RecipMeanCurrent >> 8) & 0x00FF); + + result[16] = (byte)(ThresholdVolume & 0x00FF); + result[17] = (byte)((ThresholdVolume >> 8) & 0x00FF); + + result[18] = (byte)(ThresholdTime & 0x00FF); + result[19] = (byte)((ThresholdTime >> 8) & 0x00FF); + + result[20] = (byte)(FlowActivationThr & 0x00FF); + result[21] = (byte)((FlowActivationThr >> 8) & 0x00FF); + + result[22] = (byte)(VolumeArrowThr & 0x00FF); + result[23] = (byte)((VolumeArrowThr >> 8) & 0x00FF); + + result[24] = (byte)(CalibrationTime & 0x000000FF); + result[25] = (byte)((CalibrationTime >> 8) & 0x000000FF); + result[26] = (byte)((CalibrationTime >> 16) & 0x000000FF); + result[27] = (byte)((CalibrationTime >> 24) & 0x000000FF); + + result[28] = (byte)(SerialNumber & 0x00000000000000FF); + result[29] = (byte)((SerialNumber >> 8) & 0x00000000000000FF); + result[30] = (byte)((SerialNumber >> 16) & 0x00000000000000FF); + result[31] = (byte)((SerialNumber >> 24) & 0x00000000000000FF); + result[32] = (byte)((SerialNumber >> 32) & 0x00000000000000FF); + + result[33] = (byte)MeterSealed; + result[34] = CheckSum; + + return result; + } + + /// + /// Create a calibration structure from a complete byte array + /// + /// A complete byte array data + /// CalibrationStruct or null when byte array was not complete + public static CalibrationStruct FromByteArray(byte[] data) + { + if (data.Length != Length) return null; + + CalibrationStruct result = new CalibrationStruct(); + + result.Version = data[0]; + result.MeterType = (MeterType)data[1]; + result.Calibration = (UInt16)(data[2] + 256 * data[3]); + result.VolumeUnits = (VolumeUnits)data[4]; + result.FlowArrow = (FlowArrow)data[5]; + result.FWVersion = (UInt16)(data[6] + 256 * data[7]); + result.TargetField[0] = (UInt16)(data[8] + 256 * data[9]); + result.TargetField[1] = (UInt16)(data[10] + 256 * data[11]); + result.TargetField[2] = (UInt16)(data[12] + 256 * data[13]); + result.RecipMeanCurrent = (UInt16)(data[14] + 256 * data[15]); + result.ThresholdVolume = (UInt16)(data[16] + 256 * data[17]); + result.ThresholdTime = (UInt16)(data[18] + 256 * data[19]); + result.FlowActivationThr = (UInt16)(data[20] + 256 * data[21]); + result.VolumeArrowThr = (UInt16)(data[22] + 256 * data[23]); + result.CalibrationTime = (((UInt32)data[27] * 256 + data[26]) * 256 + data[25]) * 256 + data[24]; + result.SerialNumber = ((((UInt64)data[32] * 256 + data[31]) * 256 + data[30]) * 256 + data[29]) * 256 + data[28]; + result.MeterSealed = (MeterSealed)data[33]; + result.CheckSum = data[34]; + + return result; + } + + /// + /// Update the calibration structure from an incomplete byte array + /// + /// Byte array data + /// Offset of byte array data in CalibrationStruct + /// true when successful, false when data are not appropriate + public bool Update(byte[] data, int offset) + { + if (offset == 2 && data.Length == 2) + { + /// Data containing iPerl calibration factor + Calibration = (UInt16)(data[2 - offset] + 256 * data[3 - offset]); + return true; + } + else if (offset == 0 && data.Length == Length) + { + /// Data containing a complete CalibrationStruct + Version = data[0]; + MeterType = (MeterType)data[1]; + Calibration = (UInt16)(data[2] + 256 * data[3]); + VolumeUnits = (VolumeUnits)data[4]; + FlowArrow = (FlowArrow)data[5]; + FWVersion = (UInt16)(data[6] + 256 * data[7]); + TargetField[0] = (UInt16)(data[8] + 256 * data[9]); + TargetField[1] = (UInt16)(data[10] + 256 * data[11]); + TargetField[2] = (UInt16)(data[12] + 256 * data[13]); + RecipMeanCurrent = (UInt16)(data[14] + 256 * data[15]); + ThresholdVolume = (UInt16)(data[16] + 256 * data[17]); + ThresholdTime = (UInt16)(data[18] + 256 * data[19]); + FlowActivationThr = (UInt16)(data[20] + 256 * data[21]); + VolumeArrowThr = (UInt16)(data[22] + 256 * data[23]); + CalibrationTime = (((UInt32)data[27] * 256 + data[26]) * 256 + data[25]) * 256 + data[24]; + SerialNumber = ((((UInt64)data[32] * 256 + data[31]) * 256 + data[30]) * 256 + data[29]) * 256 + data[28]; + MeterSealed = (MeterSealed)data[33]; + CheckSum = data[34]; + return true; + } + else + return false; + } + + public string FWVersionStr() + { + int d1 = (FWVersion >> 8) & 0x000F; + int d2 = (FWVersion >> 12) & 0x000F; + int d3 = (FWVersion >> 4) & 0x000F; + int d4 = FWVersion & 0x000F; + return string.Format("{0}.{1}{2}{3}", d1, d2, d3, d4); + } + + public override string ToString() + { + return string.Format("Calibration: V{0} Type={1} Cal={2} Units={3} FlowArrow.{4} FW={5} Hi={6} Norm={7} Low={8} RMC={9} ThrVol={10} ThrTime={11} FlActThr={12} VolArrThr={13} CalTm={14} SN={15} MeterSealed={16} Chksum={17}", + Version, + MeterType, + Calibration, + VolumeUnits, + FlowArrow, + FWVersion, + TargetField[0], + TargetField[1], + TargetField[2], + RecipMeanCurrent, + ThresholdVolume, + ThresholdTime, + FlowActivationThr, + VolumeArrowThr, + CalibrationTime, + SerialNumber, + MeterSealed, + CheckSum.ToString("X2")); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/ConfigStruct.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/ConfigStruct.cs new file mode 100644 index 00000000..3984fcc2 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/ConfigStruct.cs @@ -0,0 +1,225 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; + +namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead +{ + public class ConfigStruct + { + public const int Length = 32; + + public Byte Version; /// 0: 1 byte + public MeterState MeterState; /// 1: 1 byte + public UInt32 TargetTimeVeryLowBatt; /// 2: 4 bytes in seconds + public UInt32 TargetTimeLowBatt; /// 6: 4 bytes, in seconds + public UInt32 TestModeTime; /// 10: 4 bytes, Max. test mode time in seconds + public UInt16 EmptyPipeThreshold; /// 14: 2 bytes + public byte[] PCBNumber; /// 16: 5 bytes + public byte TestModeConfig; /// 21: 1 byte + public UInt32 RadioAddress; /// 22: 4 bytes + public UInt16 TempCalibration; /// 26: 2 bytes + public UInt16 AlarmMask; /// 28: 2 bytes, Default 0xA3F7 + public UInt16 ConfigCheckSum; /// 30: 2 bytes + + public ConfigStruct() + { + PCBNumber = new byte[5]; + } + + public byte[] ToByteArray() + { + byte[] result = new byte[Length]; + + result[0] = Version; + result[1] = (byte)MeterState; + + result[2] = (byte)(TargetTimeVeryLowBatt & 0x000000FF); + result[3] = (byte)((TargetTimeVeryLowBatt >> 8) & 0x000000FF); + result[4] = (byte)((TargetTimeVeryLowBatt >> 16) & 0x000000FF); + result[5] = (byte)((TargetTimeVeryLowBatt >> 24) & 0x000000FF); + + result[6] = (byte)(TargetTimeLowBatt & 0x000000FF); + result[7] = (byte)((TargetTimeLowBatt >> 8) & 0x000000FF); + result[8] = (byte)((TargetTimeLowBatt >> 16) & 0x000000FF); + result[9] = (byte)((TargetTimeLowBatt >> 24) & 0x000000FF); + + result[10] = (byte)(TestModeTime & 0x000000FF); + result[11] = (byte)((TestModeTime >> 8) & 0x000000FF); + result[12] = (byte)((TestModeTime >> 16) & 0x000000FF); + result[13] = (byte)((TestModeTime >> 24) & 0x000000FF); + + result[14] = (byte)(EmptyPipeThreshold & 0x00FF); + result[15] = (byte)((EmptyPipeThreshold >> 8) & 0x00FF); + + result[16] = PCBNumber[0]; + result[17] = PCBNumber[1]; + result[18] = PCBNumber[2]; + result[19] = PCBNumber[3]; + result[20] = PCBNumber[4]; + + result[21] = TestModeConfig; + + result[22] = (byte)(RadioAddress & 0x000000FF); + result[23] = (byte)((RadioAddress >> 8) & 0x000000FF); + result[24] = (byte)((RadioAddress >> 16) & 0x000000FF); + result[25] = (byte)((RadioAddress >> 24) & 0x000000FF); + + result[26] = (byte)(TempCalibration & 0x00FF); + result[27] = (byte)((TempCalibration >> 8) & 0x00FF); + + result[28] = (byte)(AlarmMask & 0x00FF); + result[29] = (byte)((AlarmMask >> 8) & 0x00FF); + + result[30] = (byte)(ConfigCheckSum & 0x00FF); + result[31] = (byte)((ConfigCheckSum >> 8) & 0x00FF); + + return result; + } + + /// + /// Create a configuration structure from a complete byte array + /// + /// A complete byte array data + /// ConfigStruct or null when byte array was not complete + public static ConfigStruct FromByteArray(byte[] data) + { + if (data.Length != Length) return null; + + ConfigStruct result = new ConfigStruct(); + + result.Version = data[0]; + result.MeterState = (MeterState)data[1]; + result.TargetTimeVeryLowBatt = (((UInt32)data[5] * 256 + data[4]) * 256 + data[3]) * 256 + data[2]; + result.TargetTimeLowBatt = (((UInt32)data[9] * 256 + data[8]) * 256 + data[7]) * 256 + data[6]; + result.TestModeTime = (((UInt32)data[13] * 256 + data[12]) * 256 + data[11]) * 256 + data[10]; + result.EmptyPipeThreshold = (UInt16)(data[15] * 256 + data[14]); + result.PCBNumber[0] = data[16]; + result.PCBNumber[1] = data[17]; + result.PCBNumber[2] = data[18]; + result.PCBNumber[3] = data[19]; + result.PCBNumber[4] = data[20]; + result.TestModeConfig = data[21]; + result.RadioAddress = (((UInt32)data[25] * 256 + data[24]) * 256 + data[23]) * 256 + data[22]; + result.TempCalibration = (UInt16)(data[27] * 256 + data[26]); + result.AlarmMask = (UInt16)(data[29] * 256 + data[28]); + result.ConfigCheckSum = (UInt16)(data[31] * 256 + data[30]); + + return result; + } + + /// + /// Update the configuration structure from an incomplete byte array + /// + /// Offset of byte array data in ConfigStruct + /// Byte array data + /// true when successful, false when data are not appropriate + public bool Update(int offset, byte[] data) + { + if (offset == 0 && data.Length == 2) + { + /// iPerl mode of function + Version = data[0]; + MeterState = (MeterState)data[1]; + return true; + } + else if (offset == 0 && data.Length == 4) + { + /// iPerl mode of function and extra 2 bytes + Version = data[0]; + MeterState = (MeterState)data[1]; + return true; + } + else if (offset == 21 && data.Length == 1) + { + /// TestModeConfig value + TestModeConfig = data[21 - offset]; + return true; + } + else if (offset == 0 && data.Length == Length) + { + /// Complete ConfigStruct + Version = data[0]; + MeterState = (MeterState)data[1]; + TargetTimeVeryLowBatt = (((UInt32)data[5] * 256 + data[4]) * 256 + data[3]) * 256 + data[2]; + TargetTimeLowBatt = (((UInt32)data[9] * 256 + data[8]) * 256 + data[7]) * 256 + data[6]; + TestModeTime = (((UInt32)data[13] * 256 + data[12]) * 256 + data[11]) * 256 + data[10]; + EmptyPipeThreshold = (UInt16)(data[15] * 256 + data[14]); + PCBNumber[0] = data[16]; + PCBNumber[1] = data[17]; + PCBNumber[2] = data[18]; + PCBNumber[3] = data[19]; + PCBNumber[4] = data[20]; + TestModeConfig = data[21]; + RadioAddress = (((UInt32)data[25] * 256 + data[24]) * 256 + data[23]) * 256 + data[22]; + TempCalibration = (UInt16)(data[27] * 256 + data[26]); + AlarmMask = (UInt16)(data[29] * 256 + data[28]); + ConfigCheckSum = (UInt16)(data[31] * 256 + data[30]); + return true; + } + else + return false; + } + + /// + /// Returns PCB number string (12 characters, 12 decimal digits) + /// + /// PCB number STRING + public string GetPcbNrString() + { + return PCBNumber2String(this.PCBNumber); + } + + /// + /// Converts PCBNumber to string (12 characters, 12 decimal digits) + /// + /// + /// PCB number string + public static string PCBNumber2String(byte[] pcbNumber) + { + if (pcbNumber.Length != 5) return string.Empty; + + Int64 number = 0; + for (int i = 4; i >= 0; i--) + { + number = 256 * number + (Int64)pcbNumber[i]; + } + + return number.ToString(); + } + + public override string ToString() + { + return string.Format("Config: V{0} State={1} VLoBattT={2}s LoBattT={3}s TestModeT={4}s EPThld={5} PCB#={6} TMCfg={7} RadioAddr={8} TempCalib={9} AlarmMask={10} CfgCheckSum={11}", + Version, + MeterState, + TargetTimeVeryLowBatt, + TargetTimeLowBatt, + TestModeTime, + EmptyPipeThreshold, + GetPcbNrString(), + TestModeConfig.ToString("X2"), + RadioAddress, + TempCalibration, + AlarmMask.ToString("X4"), + ConfigCheckSum.ToString("X4")); + } + + public string ToString(int sel) + { + return string.Format("{1} PCB#={6} TMCfg={7}", + Version, + MeterState, + TargetTimeVeryLowBatt, + TargetTimeLowBatt, + TestModeTime, + EmptyPipeThreshold, + GetPcbNrString(), + TestModeConfig.ToString("X2"), + RadioAddress, + TempCalibration, + AlarmMask.ToString("X4"), + ConfigCheckSum.ToString("X4")); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/Enums.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/Enums.cs new file mode 100644 index 00000000..d1446c6a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/Enums.cs @@ -0,0 +1,110 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead +{ + public enum MessageID + { + Calibration = 0x00, /// Access to stCalibration + Configuration = 0x01, /// Access to stConfig + Status = 0x02, /// Access to stStaus, read only + Power = 0x03, /// Access to stPower, containing power info from both processors + LCD = 0x04, /// Access to stLCD + EventData = 0x05, /// NOT USED + IntervalData = 0x06, /// NOT USED + Diagnostics = 0x07, /// Access tostMetroDiagArray, read onl + MetrologyMemory = 0x08, /// Memory block access, read only + Error_LongAck = 0x09, /// Error message + Command = 0x0A, /// Command to execute, with no arguments + Parameterizing = 0x0B, /// Parameterizing message is used in MCI-SPI interface only + Error_ShortAck = 0x0C, /// Short acknowledge message is used in MCI-SPI interface only + ChanelAlive = 0x0D, /// Channel alive message is used in MCI-SPI interface only + RadioPassthrough = 0x0E, /// RFID <-> Metrology <-> Radio passthrough message + ASICRegisterReadTest = 0x0F, /// ASIC Register read test + IMIDebugMessagesAccess = 0x10, /// IMI debug messages read test + ProductionChecksumsRead = 0x11, /// Production checksum read: Calibration (1 byte), Configuration (2 bytes), spare (4 bytes) + HardwareParametersTest = 0x12, /// Hardware Parameters Testing: User configurable fixed field drive time (1 byte) + /// + /// Notes: + /// 1. Short Ack message contains 1-byte error code and all the fields (Offset, Payload length, payload and password) will not be present. + /// 2. Channel Alive message does not contain the fields (Offset, Payload length, payload and password). + /// 3. Except the above two special messages, rest all the messages in the above table will follow the message format mentioned in sections 3.1 and 3.2. + /// + Count /// Number of MessageID-s + } + + public enum MeterType : byte + { + DN15 = 0, + CoaxManifold = 1, + DN20 = 2, + DN25 = 3, + DN26 = 4, /// DN25* + DN32 = 5, + DN40 = 6, + AutoDetect, + Count /// Number of meter types + } + + public enum VolumeUnits : byte + { + m3 = 0, + UK_gallon = 1, + US_gallon = 2, + Count /// Number of volume units + } + + public enum FlowArrow : byte + { + No = 0, + Right = 1, + Left = 2, + Count /// Number of flow arrows + } + + public enum MeterSealed : byte + { + InProduction = 0x00, + OutOfProduction = 0xA5, + Sealed = 0x5A, + } + + public enum MeterState : byte + { + None = 0, + Idle = 1, + Active = 2, + Test = 3, + EndOfLife = 4, + Count /// Number of meter states + } + + public enum FlowState : byte + { + No = 0, + Reverse = 1, + Forward = 2, + EmptyPipe = 3, + Count /// Number of flow states + } + + public enum OptoTelegramFlags : byte + { + OK = 0, + OK_TestStart, + OK_TestEnd, + InvalidTelegram, /// Wrong telegram format of checksum error + SyncError, + } + + public enum OptoState + { + Read, + Flush, + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/Factory.cs new file mode 100644 index 00000000..5a9e9245 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/Factory.cs @@ -0,0 +1,25 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return "RegisterReader for iPerl"; } } + + public void ResetStaticProperties() { IperlHead.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new IperlHead(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new IperlHead(cfg); } + public IComponentCfg DefaultConfig() { return new IperlHeadCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(IperlHeadCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/IperlHead.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/IperlHead.cs new file mode 100644 index 00000000..294fd2b9 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/IperlHead.cs @@ -0,0 +1,747 @@ +/// +/// Copyright (c) 2015-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.IO.Ports; +using System.Threading; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.BenchControl; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead +{ + /// + /// This component = instance of this class is a placeholder for a combined main watermeter + /// + public class IperlHead : ComponentBase, IDevice, GenericDevices.IDatastreamReader, GenericDevices.IHasTestName, IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(IperlHead)); + public override string ToString() { return string.Format("iPerl({0})", Cfg.ToString(1)); } + + + readonly IperlHeadCfg iperlHeadCfg; + + public int RfidComPortNr { get { return iperlHeadCfg.RfidComPortNr; } } + public int MuxBoardNrOrGroup14 { get { return iperlHeadCfg.MuxBoardNr; } } + public int Group { get { return iperlHeadCfg.Group; } } + + public Config.Entities.RegisterReaderType RegisterReaderType { get { return Config.Entities.RegisterReaderType.DataStream; } } + public double PulsesPerLtr { get { return 1000.0; } } + public double LtrsPerPulse { get { return 1 / PulsesPerLtr; } } + +#if ORACLE_DB + public int WMType_ID { get { return iperlHeadCfg.ProcParams.WMType_ID; } } /// Required by Oracle DB + public int WMType_Rev { get { return iperlHeadCfg.ProcParams.WMType_Rev; } } /// Required by Oracle DB +#endif + public float CalibTarget { get { return (ushort)iperlHeadCfg.ProcParams.CalibTarget; } } + public ushort FactorLimitLo { get { return (ushort)iperlHeadCfg.ProcParams.FactorLimitLo; } } + public ushort FactorLimitHi { get { return (ushort)iperlHeadCfg.ProcParams.FactorLimitHi; } } + + /// Properties set by the Begin and the End form + public string SerialNr + { + get + { + if (ConfigStruct != null) return configStruct.GetPcbNrString(); + else return string.Empty; + } + set { } + } + + public string EndState + { + get { return endState; } + set { endState = value; } + } + string endState; + + public string BeginState + { + get { return beginState; } + set { beginState = value; } + } + string beginState; + + public bool Disabled + { + get { return disabled; } + set { disabled = value; } + } + bool disabled; + + public bool CommFailed + { + get { return commFailed; } + set { commFailed = value; } + } + bool commFailed; + + public int ResultCode + { + get { return resultCode; } + } + int resultCode; + + /// + /// Passed to OptoTelegramRaw.UpdateFromString(...) + /// + Int64 volumeRawExtLast; + Int64 timestampExtLast; + + + public bool PositiveCounting; + + /// ConfigStruct of the water meter obtained or updated by iPerlCommunication + public ConfigStruct ConfigStruct + { + get { return configStruct; } + set { configStruct = value; } + } + ConfigStruct configStruct; + + /// CalibrationStruct of the water meter obtained or updated by iPerlCommunication + public CalibrationStruct CalibrationStruct + { + get { return calibrationStruct; } + set { calibrationStruct = value; } + } + CalibrationStruct calibrationStruct; + + public ushort OrigCalibFactor; + public ushort CalibFactor { get { return (CalibrationStruct != null) ? CalibrationStruct.Calibration : (ushort)0; } } + + public double Q2ErrWOCorrection; + public bool Q2CorrectionDone; + public double Q2Correction; + public int Q2CorrRFlow; + public int Q2CorrLFlow; + + public double Diff2Hz8Hz; + public bool Hz2CorrectionDone; + public int Hz2Correction; + + public string FWVersion { get { return (CalibrationStruct != null) ? CalibrationStruct.FWVersionStr() : string.Empty; } } + + + /// Result of the last test used to calculate Q2 correction factors, etc + public Results.Entities.MeterTestRslt LastTestResult2; + public Results.Entities.MeterTestRslt LastTestResult; + public double NominalTestFlowLph; /// in liter per hour + + + /// + /// Required for IRegisterReader interface + /// + public int WMPulses { get { return wmPulses; } } + public int WMRefPulses { get { return wmRefPulses; } } + public double WMVolume { get { return wmVolume; } } + public double BeginWMState { get { return beginWMState; } } + public double EndWMState { get { return endWMState; } } + public double WMTestTime { get { return wmTestTime; } } + + + double beginWMState; + double endWMState; + double wmVolume; + int wmPulses; + int wmRefPulses; + double wmTestTime; + + + /// Name set by the test, to be used as a part of the opto-data log file name + public string TestName { set { testName = value; } } + public int TestRepeats { set { testRepeats = value; } } + public int RepetitionNr { set { repetitionNr = value; } } + /// + string testName; + int testRepeats; + int repetitionNr; + + /// Name set by the test, to be used as a part of the opto-data log file name + public string BenchName; + + /// + /// Volume of water from the opto telegram + /// + private Int64 lastVolumeRaw; /// Last read raw volume + private double volumeLtr; /// + private double volumeLtr0; + + public double VolumeLtrStart { get { return volumeLtrStart; } } /// Test start volume for metrology + public double VolumeLtrEnd { get { return volumeLtrEnd; } } /// Test end volume for metrology + double volumeLtrStart; /// Test start volume for metrology + double volumeLtrEnd; /// Test end volume for metrology + double volumeLtrEnd1; /// auxiliary buffer1 to keep the end volume before test stops + double volumeLtrEnd2; /// auxiliary buffer2 to keep the end volume before test stops + double volumeLtrEnd3; /// auxiliary buffer3 to keep the end volume before test stops + + /// + /// Timestamp from the opto telegram + /// + bool lastTimestampValid; + private Int64 lastTimestamp; + private double timestampSec; + private double timestampSec0; + + public bool NoSamples { get { return (timestampSecEnd - timestampSecStart) < float.Epsilon; } } + public double TimestampSecStart { get { return timestampSecStart; } } + public double TimestampSecEnd { get { return timestampSecEnd; } } + double timestampSecStart; + double timestampSecEnd; + double timestampSecEnd1; + double timestampSecEnd2; + double timestampSecEnd3; + + private int telegramIx; + public int TestStartTelegramIx; + public int TestEndTelegramIx; + + + OptoTelegramRaw[] optoData; + const int MaxOptoDataCount = 40000; + int optoDataCount; + string optoDataLogFileName; + + + OptoTelegramRaw toBeFlushed; + int flushedDataCount; + public int FlushedDataCount + { + get { return flushedDataCount; } + set { flushedDataCount = lastFlushedDataCount = lastFlushedDataCount_1 = value; } + } + + int lastFlushedDataCount_1; + int lastFlushedDataCount; + public int FlushedDataDelta + { + get + { + int retval = Math.Max(flushedDataCount - lastFlushedDataCount, lastFlushedDataCount - lastFlushedDataCount_1); + lastFlushedDataCount_1 = lastFlushedDataCount; + lastFlushedDataCount = flushedDataCount; + return retval; + } + } + + + + /// + /// Opto serial port and worker thread related private variables + /// + private SerialPort optoSerialPort; + + + public IperlHead() + { + } + + public IperlHead(Generic.IComponentCfg cfg) + : base(cfg) + { + ClearData(); + + iperlHeadCfg = cfg as IperlHeadCfg; + + log.Debug(this.ToString()); + } + + /// + /// Clear data related to a specific water meter + /// + public void ClearData() + { + resultCode = 0; + + disabled = false; + commFailed = false; + endState = string.Empty; + beginState = string.Empty; + + configStruct = null; + calibrationStruct = null; + + LastTestResult = null; + NominalTestFlowLph = 0; + + OrigCalibFactor = 0; + Q2ErrWOCorrection = 0; + Q2CorrectionDone = false; + Q2CorrRFlow = 0; + + optoDataCount = 0; + } + + public void Initialize() + { + ClearData(); + + if (DebugLevel == DebugMode.Normal) + { + optoSerialPortParsingEnabled = false; + + /// Allocate memory for opto-data from iPerl + optoData = new OptoTelegramRaw[MaxOptoDataCount]; + for (int i = 0; i < MaxOptoDataCount; i++) optoData[i] = new OptoTelegramRaw(); + + toBeFlushed = new OptoTelegramRaw(); + flushedDataCount = 0; + + synchronized = false; + synchronized2 = false; + partOfTelegram = string.Empty; + + /// Prepare serial port + optoSerialPort = new SerialPort(string.Format("COM{0}", iperlHeadCfg.OptoComPortNr), + 9600, Parity.None, 8, StopBits.One); + optoSerialPort.Handshake = Handshake.None; + + optoSerialPort.Open(); + } + } + + public void RunDeviceBefore() + { + if (DebugLevel == DebugMode.Normal) + { + try + { + if (optoSerialPortParsingEnabled) + ReadOptoData(OptoState.Read); + else + ReadOptoData(OptoState.Flush); + } + catch (Exception e) + { + DebugLevel = DebugMode.FailureDuringOperation; + + log.FatalFormat("Opto-data serial port failure : {0}", e.Message); + if (e.InnerException != null) + { + log.FatalFormat("InnerMessage : {0}", e.InnerException.Message); + } + } + } + else if (DebugLevel == DebugMode.FailureDuringOperation) + { + } + } + + public void RunDeviceAfter() { } + + public void StopDevice() + { + try + { + if (DebugLevel == DebugMode.Normal && optoSerialPort != null) + { + optoSerialPort.Close(); + optoSerialPort = null; + } + } + catch + { + } + } + + public void StopDevice2() { } + + /// + /// Events: Event.ReadRegisterDone, Event.Error + /// + /// ReadWaterMeter instance reference casted to IOperaton + public IOperation ReadRegisterOp() + { + return this; + } + + /// + /// Clear data/counters related to a specific tests + /// + public void Clear() + { + resultCode = 0; + + sampleNr = 0; + + volumeLtr = 0; + volumeLtr0 = 0; + timestampSec = 0; + timestampSec0 = 0; + + ReadPulses(); + } + + public void TestCompleted() + { + /// TODO: Implement + } + + + int sampleNr; /// This is to determine when the test start sample should be taken + + /// Start this operation + public void Start() + { + Clear(); + + /// Reset opto data + optoDataCount = 0; + TestStartTelegramIx = 0; + TestEndTelegramIx = 0; + + /// File name is: PCB_AA_BB_HH_MI_SS..txt + string wmPosition = Name.Substring(5); + if (wmPosition.Length == 1) wmPosition = "0" + wmPosition; + + string flowNr; + if (testName != null && testName.ToLower().Contains("q1")) flowNr = "01"; + else if (testName != null && testName.ToLower().Contains("q2")) flowNr = "02"; + else if (testName != null && testName.ToLower().Contains("q3")) flowNr = "03"; + else if (testName != null && testName.ToLower().Contains("adj")) flowNr = "0-1"; + else flowNr = "99"; + + optoDataLogFileName = string.Format("{0}_{1}_{2}_{3}.txt", + (ConfigStruct != null) ? ConfigStruct.GetPcbNrString() : "UnknownPcbNr", + wmPosition, + flowNr, + StateMachine.CycleStartTimeStamp.ToString("HH_mm_ss")); + + StartParsingOptoSerialPort(); + } + + /// Run this operation + /// eventDone + public Event Run() + { + sampleNr++; + ReadPulses(); + if (sampleNr == 4) + { + /// Take the test start sample + volumeLtrStart = volumeLtr; + timestampSecStart = timestampSec; + TestStartTelegramIx = telegramIx; + } + + /// Shift data in pipelines + volumeLtrEnd = volumeLtrEnd3; + volumeLtrEnd3 = volumeLtrEnd2; + volumeLtrEnd2 = volumeLtrEnd1; + volumeLtrEnd1 = volumeLtr; + + timestampSecEnd = timestampSecEnd3; + timestampSecEnd3 = timestampSecEnd2; + timestampSecEnd2 = timestampSecEnd1; + timestampSecEnd1 = timestampSec; + + TestEndTelegramIx = telegramIx - 3; + + return Event.ReadRegisterDone; + } + + /// Stop this operation + public void Stop() + { + if (TestStartTelegramIx > 0 && TestStartTelegramIx < optoData.Length && optoData[TestStartTelegramIx].Flags == OptoTelegramFlags.OK) + { + optoData[TestStartTelegramIx].Flags = OptoTelegramFlags.OK_TestStart; + OptoTelegramRaw.TestStartTimestampDec = optoData[TestStartTelegramIx].TimestampDec(); + } + + if (TestEndTelegramIx > 0 && TestEndTelegramIx < optoData.Length && optoData[TestEndTelegramIx].Flags == OptoTelegramFlags.OK) + { + optoData[TestEndTelegramIx].Flags = OptoTelegramFlags.OK_TestEnd; + } + + StopParsingOptoSerialPort(); + OptoTelegramRaw.FIRFilterFlow(optoData, optoDataCount); + SaveOptoData(); + + if (TestStartTelegramIx == 0 || optoDataCount < 100) + { + resultCode |= (int)Results.Entities.ResultCode.MissingOptoData; + } + else if (volumeLtrEnd == volumeLtrStart) + { + resultCode |= (int)Results.Entities.ResultCode.OptoDataWithZeroFlow; + } + } + + + void SaveOptoData() + { + string directory = string.Format("C:\\TBF\\ProcessData\\{0}\\{1}\\{2}\\", + StateMachine.CycleStartTimeStamp.ToString("yy"), + StateMachine.CycleStartTimeStamp.ToString("MM"), + StateMachine.CycleStartTimeStamp.ToString("dd")); + string fullFileName = directory + optoDataLogFileName; + try + { + Directory.CreateDirectory(directory); + + double scalFact = ScalingFactor(); + + using (TextWriter optoLogFile = new StreamWriter(fullFileName)) + { + optoLogFile.WriteLine(optoData[0].ToString(scalFact, null)); + for (int i = 1; i < optoDataCount; i++) optoLogFile.WriteLine(optoData[i].ToString(scalFact, optoData[i - 1])); + optoLogFile.Close(); + } + } + catch (Exception exc) + { + File.Delete(fullFileName); + log.ErrorFormat(string.Format("Error writing into file {0}", fullFileName)); + log.ErrorFormat(string.Format("Exception message: {0}", exc.Message)); + } + } + + void ReadPulses() + { + beginWMState = volumeLtr0; + endWMState = volumeLtr; + wmVolume = Math.Abs(endWMState - beginWMState); + wmPulses = (int)(wmVolume * (double)PulsesPerLtr + 0.5); + wmRefPulses = StateMachine.ControlBoard.EtPulses(0); + wmTestTime = timestampSec - timestampSec0; + } + + + bool optoSerialPortParsingEnabled; + + /// Flush internal buffers and start parsing the opto serial port data + void StartParsingOptoSerialPort() + { + optoSerialPortParsingEnabled = true; + } + + /// Stop parsig the opto serial port data + void StopParsingOptoSerialPort() + { + optoSerialPortParsingEnabled = false; + } + + /// + /// Variables storing the context of serial port data parsing (ReadOptoSerialPort(...)) + /// + bool synchronized; + bool synchronized2; + string partOfTelegram; + + /// + /// 9600 Bd, 8 data bits, 1 stop bit, no parity + /// + /// Telegram description: + /// + /// AAAAAA[tab]BBBB[tab]CCCC[tab]DDDDDD[tab]EEEE[tab]FFFFFFFF[tab]GG[cr][lf] (42 bytes) + /// + /// Example: + /// FFFFFE 51EA 0000 65324E 0087 F6319DFF 86 + /// FFDD3A 51F9 0000 65324E 0088 F631A60B 45 + /// ... + /// + /// OptoState.Read or OptoState.Flush + void ReadOptoData(OptoState optoState) + { + int nrBytes = optoSerialPort.BytesToRead; + if (nrBytes > 0) + { + char[] buffer = new char[nrBytes]; + optoSerialPort.Read(buffer, 0, nrBytes); + string received = new string(buffer); + + string allRcvd = partOfTelegram + received; + + while (true) + { + int pos = allRcvd.IndexOf("\r\n"); + + if (pos < 0) + { + /// No CR+LF found, wait for more characters in the next invocation + partOfTelegram = allRcvd; + return; + } + else + { + // CR+LF found + if (optoState == OptoState.Read) + { + if (pos < OptoTelegramRaw.Length - 2) + { + /// CR+LF found too early, truncate the beginning incl CR+LF and keep scanning in this loop + allRcvd = allRcvd.Substring(pos + 2); + if (synchronized) + { + optoData[optoDataCount].Counter = optoDataCount; + optoData[optoDataCount++].SetFlags(OptoTelegramFlags.SyncError); + } + synchronized = true; + } + // CR+LF found and (pos >= OptoTelegramRaw.Length - 2) + else if (optoData[optoDataCount].UpdateFromString(allRcvd.Substring(pos - OptoTelegramRaw.Length + 2), optoDataCount, ref volumeRawExtLast, ref timestampExtLast)) + { + OptoTelegramRreceived(optoDataCount++, synchronized2); + synchronized2 = synchronized; + allRcvd = allRcvd.Substring(pos + 2); + } + else + { + optoData[optoDataCount].Counter = optoDataCount; + optoDataCount++; + allRcvd = allRcvd.Substring(pos + 2); + } + } + else /// optoState == OptoState.Flush + { + if (pos < OptoTelegramRaw.Length - 2) + { + /// CR+LF found too early, truncate the beginning incl CR+LF and keep scanning in this loop + allRcvd = allRcvd.Substring(pos + 2); + synchronized = true; + } + // CR+LF found and (pos >= OptoTelegram.Length - 2) + else if (toBeFlushed.UpdateFromStringDummy(allRcvd.Substring(pos - OptoTelegramRaw.Length + 2))) + { + flushedDataCount++; + synchronized2 = synchronized; + allRcvd = allRcvd.Substring(pos + 2); + } + else + { + allRcvd = allRcvd.Substring(pos + 2); + } + } + } + } + + //OnOptoReceived(this, new OptoReceivedEventArgs(s)); + } + else + { + //OnOptoReceived(this, new OptoReceivedEventArgs(".")); + } + } + + + void OptoTelegramRreceived(int currentIx, bool async) + { + OptoTelegramRaw optoTelegram = optoData[currentIx]; + telegramIx = currentIx; + + lastVolumeRaw = volumeRawExtLast; + lastTimestamp = timestampExtLast; + + if (volumeLtr == 0 && volumeLtr0 == 0) + { + volumeLtr = (double)lastVolumeRaw * ScalingFactor() / 16000.0; + volumeLtr0 = volumeLtr; + } + else + { + volumeLtr = (double)lastVolumeRaw * ScalingFactor() / 16000.0; + } + + if (timestampSec == 0 && timestampSec0 == 0) + { + timestampSec = (double)lastTimestamp / 8192.0; + timestampSec0 = timestampSec; + } + else + { + timestampSec = (double)lastTimestamp / 8192.0; + } + + //optoDataLogger.InfoFormat("{0} {1} {2} ltr {3} {4}", optoTelegram, lastTimestamp, lastVolumeRaw.ToString("X8"), timestampSec.ToString("F1"), volumeLtr.ToString("F3")); + } + + + /// + /// Called from the state machine when a test is selected and UI needs to be updated. + /// + public void OnOptoReceived(object sender, OptoReceivedEventArgs args) + { + if (OptoReceivedHandler == null) return; + try { OptoReceivedHandler(sender, args); } + catch (Exception) { } + } + + public event EventHandler OptoReceivedHandler; + + + /// + /// Compares CalibrationStruct.MeterType with iPerlCfg.MeterType. + /// iPerlCfg.MeterType == MeterType.AutoDetect disables type checking + /// CalibrationStruct == null disables type checking ... + /// ... so that failed RFID communication does not cause type verification failure) + /// + /// true when type is OK + public bool VerifyIPerlType() + { + if (iperlHeadCfg.MeterType == MeterType.AutoDetect || CalibrationStruct == null) + { + return true; + } + + return iperlHeadCfg.MeterType == CalibrationStruct.MeterType; + } + + public static double UnitVolume(VolumeUnits units) + { + switch (units) + { + default: + case VolumeUnits.m3: return Config.Units.ConvertFrom(Config.Unit.m3, 1.0); /// liter + case VolumeUnits.UK_gallon: return Config.Units.ConvertFrom(Config.Unit.gal_UK, 1.0); /// liter + case VolumeUnits.US_gallon: return Config.Units.ConvertFrom(Config.Unit.gal_US, 1.0); /// liter + } + } + + public double ScalingFactor() + { + if ((iperlHeadCfg.MeterType == MeterType.AutoDetect) && (CalibrationStruct != null)) + { + return IperlHead.ScalingFactor(CalibrationStruct.MeterType); + } + else if (iperlHeadCfg.MeterType != MeterType.AutoDetect) + { + return IperlHead.ScalingFactor(iperlHeadCfg.MeterType); + } + else + { + return IperlHead.ScalingFactor(MeterType.DN20); + } + } + + /// + /// Scaling factor: + /// 0, 1 (DN15, Coax) . . . . 1 + /// 2 (DN20) . . . . . . . . 2 + /// 3 (DN25) . . . . . . . . 4 + /// 4, 5 (DN26, DN32) . . . . 8 + /// 6 (DN40) . . . . . . . . 16 + /// + /// MeterType (0..6) + /// Scaling factor + public static double ScalingFactor(MeterType meterType) + { + switch (meterType) + { + default: + case MeterType.DN15: + case MeterType.CoaxManifold: return 1.0; + case MeterType.DN20: return 2.0; + case MeterType.DN25: return 4.0; + case MeterType.DN26: + case MeterType.DN32: return 8.0; + case MeterType.DN40: return 16.0; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfg.cs new file mode 100644 index 00000000..2fd8a532 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfg.cs @@ -0,0 +1,71 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Net.Sockets; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead +{ + public class IperlHeadCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(IperlHeadCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new IperlHeadCfgCtrl(); } + + /// + /// Serialized parameters + /// + public bool UseTcpIP; + public string OptoIPAddress; + public ushort OptoTcpipPortNr; + public int OptoComPortNr; + public int RfidComPortNr; /// 0 = use MuxBoardNr + public int MuxBoardNr; /// 0 = use RfidComPort(Nr), otherwise mux. board nr. 1 .. 4 + public int Group; /// Number written to QuidoRS to connct the watermeter to RfidComPort, 1 .. 10 + + /// Procedure parameters + [XmlIgnore] + public ProcParams ProcParams; + public override IParamsProvider GetRuntimeProcParamsProvider() { return ProcParams; } + public override IParamsProvider CreateProcParamsProvider() { return new ProcParams(true); } + + [XmlIgnore] + public MeterType MeterType { get { return (ProcParams != null) ? ProcParams.MeterType : MeterType.AutoDetect; } } + + + /// Private parameterless constructor invoked by all other (public) constructors + IperlHeadCfg() + { + Name = "iPerl"; + ParentName = string.Empty; + OptoComPortNr = 10; + RfidComPortNr = 0; /// = use mux. board + MuxBoardNr = 1; + ProcParams = CreateProcParamsProvider() as ProcParams; + } + + public IperlHeadCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("{0} Group1 (mux#)={1}, Group2={2}, Opto=Com{3}, RFID=Com{4}", + Name, + MuxBoardNr, + Group, + OptoComPortNr, + RfidComPortNr); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfgCtrl.cs new file mode 100644 index 00000000..b2115285 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfgCtrl.cs @@ -0,0 +1,150 @@ +using Config.Entities; +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Net; +using System.Net.Sockets; +using System.Windows.Forms; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead +{ + public partial class IperlHeadCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + IperlHeadCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as IperlHeadCfg; + Redraw(); + } + } + + public IperlHeadCfgCtrl() + { + InitializeComponent(); + } + + private void WaterMeterCfgCtrl_Load(object sender, EventArgs e) + { + nameLabel.Text = Strings.Name; + classNameLabel.Text = config.Factory.ClassName; + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + nameTextBox.Text = config.Name; + radioButton1.Checked = config.UseTcpIP; + radioButton2.Checked = !config.UseTcpIP; + ipAddressTextBox.Text = (config.OptoIPAddress != null) ? config.OptoIPAddress : "0.0.0.0"; + tcpipPortTextBox.Text = config.OptoTcpipPortNr.ToString(); + optoSerialPortTextBox.Text = config.OptoComPortNr.ToString(); + rfidPortNrTextBox.Text = config.RfidComPortNr.ToString(); + muxBoardNrTextBox.Text = config.MuxBoardNr.ToString(); + groupTextBox.Text = config.Group.ToString(); + } + + public void Unlock() + { + nameTextBox.Enabled = true; + radioButton1.Enabled = true; + radioButton2.Enabled = true; + ipAddressTextBox.Enabled = true; + tcpipPortTextBox.Enabled = true; + optoSerialPortTextBox.Enabled = true; + rfidPortNrTextBox.Enabled = true; + muxBoardNrTextBox.Enabled = true; + groupTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (radioButton1.Checked) + { + IPAddress dummyIPAddress; + if (!IPAddress.TryParse(ipAddressTextBox.Text, out dummyIPAddress)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'IP address' is not valid"; + } + + ushort sdummy; + if (!ushort.TryParse(tcpipPortTextBox.Text, out sdummy)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'TCP/IP port nr.' is not valid"; + } + } + else + { + if (!int.TryParse(optoSerialPortTextBox.Text, out dummy) || dummy < 1 || dummy > 999) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Opto serial port nr.' is not valid"; + } + } + + if (!int.TryParse(rfidPortNrTextBox.Text, out dummy) || dummy < 0 || dummy > 999) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'RFID serial port nr.' is not valid"; + } + + if (!int.TryParse(muxBoardNrTextBox.Text, out dummy) || dummy < 1 || dummy > 4) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + string.Format(Strings.Invalid_0, muxBoardNrLabel.Text); + } + + if (!int.TryParse(groupTextBox.Text, out dummy) || dummy < 1 || dummy > 10) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + string.Format(Strings.Invalid_0, groupLabel.Text); + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + + if (radioButton1.Checked) + { + config.UseTcpIP = true; + config.OptoIPAddress = ipAddressTextBox.Text; + config.OptoTcpipPortNr = ushort.Parse(tcpipPortTextBox.Text); + } + else + { + config.UseTcpIP = false; + config.OptoComPortNr = int.Parse(optoSerialPortTextBox.Text); + } + + config.RfidComPortNr = int.Parse(rfidPortNrTextBox.Text); + config.MuxBoardNr = int.Parse(muxBoardNrTextBox.Text); + config.Group = int.Parse(groupTextBox.Text); + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfgCtrl.designer.cs new file mode 100644 index 00000000..037c773b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfgCtrl.designer.cs @@ -0,0 +1,308 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead +{ + partial class IperlHeadCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.optoSerialPortTextBox = new System.Windows.Forms.TextBox(); + this.optoSerialPortLabel = new System.Windows.Forms.Label(); + this.muxBoardNrTextBox = new System.Windows.Forms.TextBox(); + this.muxBoardNrLabel = new System.Windows.Forms.Label(); + this.groupTextBox = new System.Windows.Forms.TextBox(); + this.groupLabel = new System.Windows.Forms.Label(); + this.rfidPortNrTextBox = new System.Windows.Forms.TextBox(); + this.rfidSerialPortNrLabel = new System.Windows.Forms.Label(); + this.radioButton1 = new System.Windows.Forms.RadioButton(); + this.radioButton2 = new System.Windows.Forms.RadioButton(); + this.optoDataGroupBox = new System.Windows.Forms.GroupBox(); + this.tcpipPortLabel = new System.Windows.Forms.Label(); + this.tcpipPortTextBox = new System.Windows.Forms.TextBox(); + this.ipAddressLabel = new System.Windows.Forms.Label(); + this.ipAddressTextBox = new System.Windows.Forms.TextBox(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.label3 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.optoDataGroupBox.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(135, 40); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(121, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(25, 43); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(132, 16); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(60, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ClassName"; + // + // optoSerialPortTextBox + // + this.optoSerialPortTextBox.Enabled = false; + this.optoSerialPortTextBox.Location = new System.Drawing.Point(329, 42); + this.optoSerialPortTextBox.Name = "optoSerialPortTextBox"; + this.optoSerialPortTextBox.Size = new System.Drawing.Size(34, 20); + this.optoSerialPortTextBox.TabIndex = 7; + // + // optoSerialPortLabel + // + this.optoSerialPortLabel.AutoSize = true; + this.optoSerialPortLabel.Location = new System.Drawing.Point(241, 45); + this.optoSerialPortLabel.Name = "optoSerialPortLabel"; + this.optoSerialPortLabel.Size = new System.Drawing.Size(72, 13); + this.optoSerialPortLabel.TabIndex = 6; + this.optoSerialPortLabel.Text = "Serial port nr.:"; + // + // muxBoardNrTextBox + // + this.muxBoardNrTextBox.Enabled = false; + this.muxBoardNrTextBox.Location = new System.Drawing.Point(135, 63); + this.muxBoardNrTextBox.Name = "muxBoardNrTextBox"; + this.muxBoardNrTextBox.Size = new System.Drawing.Size(34, 20); + this.muxBoardNrTextBox.TabIndex = 9; + // + // muxBoardNrLabel + // + this.muxBoardNrLabel.AutoSize = true; + this.muxBoardNrLabel.Location = new System.Drawing.Point(25, 66); + this.muxBoardNrLabel.Name = "muxBoardNrLabel"; + this.muxBoardNrLabel.Size = new System.Drawing.Size(106, 13); + this.muxBoardNrLabel.TabIndex = 8; + this.muxBoardNrLabel.Text = "Group 1 (mux. board)"; + // + // groupTextBox + // + this.groupTextBox.Enabled = false; + this.groupTextBox.Location = new System.Drawing.Point(135, 86); + this.groupTextBox.Name = "groupTextBox"; + this.groupTextBox.Size = new System.Drawing.Size(34, 20); + this.groupTextBox.TabIndex = 11; + // + // groupLabel + // + this.groupLabel.AutoSize = true; + this.groupLabel.Location = new System.Drawing.Point(25, 89); + this.groupLabel.Name = "groupLabel"; + this.groupLabel.Size = new System.Drawing.Size(45, 13); + this.groupLabel.TabIndex = 10; + this.groupLabel.Text = "Group 2"; + // + // rfidPortNrTextBox + // + this.rfidPortNrTextBox.Enabled = false; + this.rfidPortNrTextBox.Location = new System.Drawing.Point(329, 21); + this.rfidPortNrTextBox.Name = "rfidPortNrTextBox"; + 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(241, 24); + this.rfidSerialPortNrLabel.Name = "rfidSerialPortNrLabel"; + this.rfidSerialPortNrLabel.Size = new System.Drawing.Size(72, 13); + this.rfidSerialPortNrLabel.TabIndex = 6; + this.rfidSerialPortNrLabel.Text = "Serial port nr.:"; + // + // radioButton1 + // + this.radioButton1.AutoSize = true; + this.radioButton1.Enabled = false; + this.radioButton1.Location = new System.Drawing.Point(22, 19); + this.radioButton1.Name = "radioButton1"; + this.radioButton1.Size = new System.Drawing.Size(83, 17); + this.radioButton1.TabIndex = 0; + this.radioButton1.TabStop = true; + this.radioButton1.Text = "Use TCP/IP"; + this.radioButton1.UseVisualStyleBackColor = true; + // + // radioButton2 + // + this.radioButton2.AutoSize = true; + this.radioButton2.Enabled = false; + this.radioButton2.Location = new System.Drawing.Point(234, 19); + this.radioButton2.Name = "radioButton2"; + this.radioButton2.Size = new System.Drawing.Size(92, 17); + this.radioButton2.TabIndex = 1; + this.radioButton2.TabStop = true; + this.radioButton2.Text = "Use serial port"; + this.radioButton2.UseVisualStyleBackColor = true; + // + // optoDataGroupBox + // + this.optoDataGroupBox.Controls.Add(this.tcpipPortLabel); + this.optoDataGroupBox.Controls.Add(this.tcpipPortTextBox); + this.optoDataGroupBox.Controls.Add(this.ipAddressLabel); + this.optoDataGroupBox.Controls.Add(this.ipAddressTextBox); + this.optoDataGroupBox.Controls.Add(this.radioButton1); + 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(28, 114); + this.optoDataGroupBox.Name = "optoDataGroupBox"; + this.optoDataGroupBox.Size = new System.Drawing.Size(414, 97); + this.optoDataGroupBox.TabIndex = 5; + this.optoDataGroupBox.TabStop = false; + this.optoDataGroupBox.Text = "Opto-data"; + // + // tcpipPortLabel + // + this.tcpipPortLabel.AutoSize = true; + this.tcpipPortLabel.Location = new System.Drawing.Point(31, 71); + this.tcpipPortLabel.Name = "tcpipPortLabel"; + 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(107, 68); + this.tcpipPortTextBox.Name = "tcpipPortTextBox"; + 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(31, 48); + this.ipAddressLabel.Name = "ipAddressLabel"; + 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(107, 45); + this.ipAddressTextBox.Name = "ipAddressTextBox"; + this.ipAddressTextBox.Size = new System.Drawing.Size(98, 20); + this.ipAddressTextBox.TabIndex = 3; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.rfidPortNrTextBox); + this.groupBox1.Controls.Add(this.rfidSerialPortNrLabel); + this.groupBox1.Location = new System.Drawing.Point(28, 218); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(414, 55); + this.groupBox1.TabIndex = 12; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "RFID communication (in case mux. board is not used)"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(176, 66); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(31, 13); + this.label3.TabIndex = 13; + this.label3.Text = "1 .. 4"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(176, 89); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(37, 13); + this.label4.TabIndex = 14; + this.label4.Text = "1 .. 10"; + // + // WaterMeterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.label4); + this.Controls.Add(this.label3); + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.optoDataGroupBox); + this.Controls.Add(this.groupTextBox); + this.Controls.Add(this.groupLabel); + this.Controls.Add(this.muxBoardNrTextBox); + this.Controls.Add(this.muxBoardNrLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "WaterMeterCfgCtrl"; + this.Size = new System.Drawing.Size(500, 300); + this.Load += new System.EventHandler(this.WaterMeterCfgCtrl_Load); + this.optoDataGroupBox.ResumeLayout(false); + this.optoDataGroupBox.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.TextBox optoSerialPortTextBox; + private System.Windows.Forms.Label optoSerialPortLabel; + private System.Windows.Forms.TextBox muxBoardNrTextBox; + private System.Windows.Forms.Label muxBoardNrLabel; + private System.Windows.Forms.TextBox groupTextBox; + private System.Windows.Forms.Label groupLabel; + private System.Windows.Forms.TextBox rfidPortNrTextBox; + private System.Windows.Forms.Label rfidSerialPortNrLabel; + private System.Windows.Forms.RadioButton radioButton1; + private System.Windows.Forms.RadioButton radioButton2; + private System.Windows.Forms.GroupBox optoDataGroupBox; + private System.Windows.Forms.Label tcpipPortLabel; + private System.Windows.Forms.TextBox tcpipPortTextBox; + private System.Windows.Forms.Label ipAddressLabel; + private System.Windows.Forms.TextBox ipAddressTextBox; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label4; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/IperlHeadCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/OptoReceivedEventArgs.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/OptoReceivedEventArgs.cs new file mode 100644 index 00000000..fb59bceb --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/OptoReceivedEventArgs.cs @@ -0,0 +1,20 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead +{ + public class OptoReceivedEventArgs : EventArgs + { + public string Data; + + public OptoReceivedEventArgs(string data) + { + this.Data = data; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/OptoTelegramRaw.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/OptoTelegramRaw.cs new file mode 100644 index 00000000..1cc1f373 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/OptoTelegramRaw.cs @@ -0,0 +1,296 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.Globalization; + +namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead +{ + public class OptoTelegramRaw + { + public static readonly int Length = 42; + private static CultureInfo culture; + + + /// + /// Strobed value + /// + public static decimal TestStartTimestampDec; + + /// + /// Stored values + /// + public OptoTelegramFlags Flags; + + public DateTime DateTime; /// From PC + public float RefFlow; /// [m3/h] + public int Counter; + + public UInt32 EmfRaw; /// From iPerl opto data + public Int16 MagneticFieldRaw; + public Int16 FlowRaw; + public UInt32 VolumeRaw; + public Int64 VolumeRawExt; + public Int16 Impedance; + public UInt32 Timestamp; + public Int64 TimestampExt; + public byte CheckSum; + + /// + /// Calculated values + /// + public double EMF() + { + Int32 signedEmf = (EmfRaw > 0x7FFFFF) ? ((int)EmfRaw - 0x1000000) : (int)EmfRaw; + return 0.000000333 * (double)signedEmf; + } + public double MagneticField() { return (double)MagneticFieldRaw; } + public double Flow(double scalingFactor) { return 0.225 * scalingFactor * (double)FlowRaw; } + public double Volume(double scalingFactor) { return 0.0000625 * scalingFactor * (double)VolumeRawExt; } + public Int32 FlipTime() { return Impedance; } + public decimal TimestampDec() { return (decimal)TimestampExt / (decimal)8192; } + public double VolumeDelta(double scalingFactor, OptoTelegramRaw previous) { return (previous == null) ? 0 : Volume(scalingFactor) - previous.Volume(scalingFactor); } + public decimal TimeDelta() { return TimestampDec() - TestStartTimestampDec; } + public string Label() + { + if (Flags == OptoTelegramFlags.OK_TestStart) return "#### start test ####"; + else if (Flags == OptoTelegramFlags.OK_TestEnd) return "#### end of test ####"; + else return string.Empty; + } + + + static OptoTelegramRaw() + { + culture = CultureInfo.CreateSpecificCulture("DE"); /// This is to use comma as decimal number separator + } + + public OptoTelegramRaw() + { + } + + /// + /// Parses optical telegram and returns OptoTelegramRaw object + /// + /// + /// Create a configuration structure from a complete byte array + /// + /// Telegram description: + /// + /// AAAAAA[tab]BBBB[tab]CCCC[tab]DDDDDD[tab]EEEE[tab]FFFFFFFF[tab]GG[cr][lf] (42 bytes) + /// + /// Data Comment Type Calculate to decimal + /// ---------------------------------------------------------------- + /// AAAAAA EMF Int24 Value * 0.000000333 + /// BBBB Magnetic field Int16 Value + /// CCCC Flow Int16 Value * 0.225 * Scalig factor + /// DDDDDD Volume Int24 Value / 16000 * Scaling factor + /// EEEE Impedance Int16 Value + /// FFFFFFFF Timestamp Uint32 Value / 8192 + /// GG Checksum Byte + /// ---------------------------------------------------------------- + /// + /// Example: + /// FFFFFE 51EA 0000 65324E 0087 F6319DFF 86 + /// FFDD3A 51F9 0000 65324E 0088 F631A60B 45 + /// ... + /// + /// A complete byte array data + /// true = telegram OK, false = telegram NOK + public bool UpdateFromString(string telegram, int counter, ref Int64 volumeRawExtLast, ref Int64 timestampExtLast) + { + DateTime = DateTime.Now; + Counter = counter; + RefFlow = (float)Sequences.ProcessData.RefFlow.Val; + + if ((telegram == null) || (telegram.Length < Length) || + (telegram[6] != '\t') || (telegram[11] != '\t') || (telegram[16] != '\t') || + (telegram[23] != '\t') || (telegram[28] != '\t') || (telegram[37] != '\t') || + (telegram[40] != '\r') || (telegram[41] != '\n')) + { + Flags = OptoTelegramFlags.InvalidTelegram; + return false; + } + + bool f1 = UInt32.TryParse(telegram.Substring(0, 6), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out EmfRaw); + bool f2 = Int16.TryParse(telegram.Substring(7, 4), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out MagneticFieldRaw); + bool f3 = Int16.TryParse(telegram.Substring(12, 4), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out FlowRaw); + bool f4 = UInt32.TryParse(telegram.Substring(17, 6), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out VolumeRaw); + bool f5 = Int16.TryParse(telegram.Substring(24, 4), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out Impedance); + bool f6 = UInt32.TryParse(telegram.Substring(29, 8), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out Timestamp); + bool f7 = byte.TryParse(telegram.Substring(38, 2), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out CheckSum); + + bool allOk = f1 && f2 && f3 && f4 && f5 && f6 && f7; + Flags = allOk ? OptoTelegramFlags.OK : OptoTelegramFlags.InvalidTelegram; + + /// + /// Cope with 'VolumeRaw' overflow + /// + Int64 uncorrected = (Int64)(((UInt64)volumeRawExtLast & 0xFFFFFFFFFF000000UL) | VolumeRaw); + if (Math.Abs(uncorrected - volumeRawExtLast) <= 0x800000L) + { + VolumeRawExt = volumeRawExtLast = uncorrected; + } + else if (Math.Abs(uncorrected + 0x1000000L - volumeRawExtLast) <= 0x800000L) + { + VolumeRawExt = volumeRawExtLast = uncorrected + 0x1000000L; + } + else if (Math.Abs(uncorrected - 0x1000000L - volumeRawExtLast) <= 0x800000L) + { + VolumeRawExt = volumeRawExtLast = uncorrected - 0x1000000L; + } + else + { + VolumeRawExt = volumeRawExtLast = uncorrected; + } + + /// + /// Cope with 'Timestamp' overflow + /// + uncorrected = (Int64)(((UInt64)timestampExtLast & 0xFFFFFFFF00000000UL) | Timestamp); + if (Math.Abs(uncorrected - timestampExtLast) <= 0x80000000L) + { + TimestampExt = timestampExtLast = uncorrected; + } + else if (Math.Abs(uncorrected + 0x100000000L - timestampExtLast) <= 0x80000000L) + { + TimestampExt = timestampExtLast = uncorrected + 0x100000000L; + } + else if (Math.Abs(uncorrected - 0x100000000L - timestampExtLast) <= 0x80000000L) + { + TimestampExt = timestampExtLast = uncorrected - 0x100000000L; + } + else + { + TimestampExt = timestampExtLast = uncorrected; + } + + return allOk; + } + + /// + /// Alternative to UpdateFromString(...) when data are flushed + /// + public bool UpdateFromStringDummy(string telegram) + { + DateTime = DateTime.Now; + RefFlow = (float)Sequences.ProcessData.RefFlow.Val; + + if ((telegram == null) || (telegram.Length < Length) || + (telegram[6] != '\t') || (telegram[11] != '\t') || (telegram[16] != '\t') || + (telegram[23] != '\t') || (telegram[28] != '\t') || (telegram[37] != '\t') || + (telegram[40] != '\r') || (telegram[41] != '\n')) + { + Flags = OptoTelegramFlags.InvalidTelegram; + return false; + } + + //bool f1 = UInt32.TryParse(telegram.Substring(0, 6), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out EmfRaw); + //bool f2 = Int16.TryParse(telegram.Substring(7, 4), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out MagneticFieldRaw); + //bool f3 = Int16.TryParse(telegram.Substring(12, 4), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out FlowRaw); + //bool f4 = UInt32.TryParse(telegram.Substring(17, 6), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out VolumeRaw); + //bool f5 = Int16.TryParse(telegram.Substring(24, 4), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out Impedance); + //bool f6 = UInt32.TryParse(telegram.Substring(29, 8), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out Timestamp); + //bool f7 = byte.TryParse(telegram.Substring(38, 2), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out CheckSum); + //return f1 && f2 && f3 && f4 && f5 && f6 && f7; + + return true; + } + + + public void SetFlags(OptoTelegramFlags flags) + { + this.Flags = flags; + } + + + public string ToString(double scalingFactor, OptoTelegramRaw previous) + { + if (Flags == OptoTelegramFlags.SyncError) + { + return "Sychronization error"; + } + else if (Flags == OptoTelegramFlags.InvalidTelegram) + { + return "Invalid telegram"; + } + else /// if (flags == OptoTelegramFlags.OK / OptoTelegramFlags.OK_TestStart / OptoTelegramFlags.OK_TestEnd) + { + return string.Format("{0}:{1}:{2}.{3}\t{4} :\t{5}\t{6}\t{7}\t{8}\t{9}\t{10}\t{11}\t{12}\t{13}\t{14}\t{15}\t{16}\t{17}\t{18}\t{19}\t{20}\t{21}\t{22}", + DateTime.Hour.ToString("D2"), + DateTime.Minute.ToString("D2"), + DateTime.Second.ToString("D2"), + DateTime.Millisecond.ToString("D4"), + Counter, + EmfRaw.ToString("X6"), + MagneticFieldRaw.ToString("X4"), + FlowRaw.ToString("X4"), + VolumeRaw.ToString("X6"), + Impedance.ToString("X4"), + Timestamp.ToString("X8"), + CheckSum.ToString("X2"), + EMF().ToString("F4", culture), + MagneticField().ToString("F0", culture), + Flow(scalingFactor).ToString("F2", culture), + Volume(scalingFactor).ToString("F4", culture), + FlipTime().ToString("F0", culture), + TimestampDec().ToString("F4", culture), + (RefFlow * 1000).ToString("F2", culture), + VolumeDelta(scalingFactor, previous).ToString("F4", culture), + TimeDelta().ToString("F3", culture), + scalingFactor.ToString("F1", culture), + Label()); + } + } + + /// + /// Filter RefFlow data in an array of OptoTelegramRaw objects by a FIR filter: + /// + /// kSize = 5, kSize2 = 2 + /// + /// i k + /// --------------------------------------------------------------------------- + /// 0 -5 filtered[0] = data[0] + /// 1 -4 filtered[1] = data[1] + /// 2 -3 filtered[2] = data[0]*k[0] + ... + data[4]*k[4] + /// 3 -2 filtered[3] = data[1]*k[0] + ... + data[5]*k[4] + /// 4 -1 filtered[4] = data[2]*k[0] + ... + data[6]*k[4] + /// 5 0 data[0] = filtered[0], filtered[0] = data[3]*k[0] + ... + data[7]*k[4] + /// 6 1 data[1] = filtered[1], filtered[1] = data[4]*k[0] + ... + data[8]*k[4] + /// 7 ... + /// + /// array of OptoTelegramRaw objects + /// number of objects to process + public static void FIRFilterFlow(OptoTelegramRaw[] optoData, int optoDataCount) + { + float[] kernel = new float[] { 0.1f, 0.2f, 0.4f, 0.2f, 0.1f }; + int kSize = kernel.Length; + int kSize2 = kernel.Length / 2; + + float[] filtered = new float[kSize]; + + for (int i = 0; i < optoDataCount; i++) + { + int k = i - kSize; + if (k >= 0) optoData[k].RefFlow = filtered[i % kSize]; + + if (i < kSize2 || i >= optoDataCount - kSize2) + { + filtered[i % kSize] = optoData[i].RefFlow; + } + else + { + float weoightedSum = 0; + for (int j = -kSize2; j <= kSize2; j++) + weoightedSum += optoData[i + j].RefFlow * kernel[j + kSize2]; + + filtered[i % kSize] = weoightedSum; + } + } + + for (int k = optoDataCount - kSize; k < optoDataCount; k++) + { + if (k >= 0) optoData[k].RefFlow = filtered[k % kSize]; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/ProcParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/ProcParams.cs new file mode 100644 index 00000000..41fa49ab --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/ProcParams.cs @@ -0,0 +1,183 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead +{ + public class ProcParams : ProcedureParamsBase, IParamsProvider, IProcedureParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcParams) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public MeterType MeterType; + public float CalibTarget; /// Target error after calibration in [%] + public int FactorLimitLo; /// Lower limit for the calibration factor + public int FactorLimitHi; /// Upper limit for the calibration factor +#if ORACLE_DB + public int WMType_ID; /// Required for Oracle DB: ID_WZTyp in table VT_PRUEFPUNKT_SOLL_SD + public int WMType_Rev; /// Required for Oracle DB: Rev_WZTyp in table VT_PRUEFPUNKT_SOLL_SD +#endif + + + public override void InitializeAll() + { + MeterType = MeterType.AutoDetect; + CalibTarget = 0; + FactorLimitLo = 1000; + FactorLimitHi = 8000; +#if ORACLE_DB + WMType_ID = 2; /// Value for iPerl DN15 + WMType_Rev = 1; /// Value for iPerl DN15 +#endif + } + + string[] paramNames = new string[] + { + "iPerl type", + "Calib. target [%]", + "Calib. factor Lo", + "Calib. factor Hi", +#if ORACLE_DB + "WMType ID", + "WMType Rev.", +#endif + }; + public override string ParamName(int i) { return paramNames[i]; } + public override int ParamsCount() { return paramNames.Length; } + + public override string ToString(int i) + { + switch (i) + { + case 0: return MeterType.ToString(); + case 1: return CalibTarget.ToString(); + case 2: return FactorLimitLo.ToString(); + case 3: return FactorLimitHi.ToString(); +#if ORACLE_DB + case 4: return WMType_ID.ToString(); + case 5: return WMType_Rev.ToString(); +#endif + default: return string.Empty; + } + } + + public CfgUpdateFlags UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: + for (MeterType mt = 0; mt < MeterType.Count; mt++) + { + if (mt.ToString().Equals(strValue)) { MeterType = mt; return CfgUpdateFlags.None; } + } + break; + case 1: CalibTarget = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None; + case 2: FactorLimitLo = int.Parse(strValue); return CfgUpdateFlags.None; + case 3: FactorLimitHi = int.Parse(strValue); return CfgUpdateFlags.None; +#if ORACLE_DB + case 4: WMType_ID = int.Parse(strValue); return CfgUpdateFlags.None; + case 5: WMType_Rev = int.Parse(strValue); return CfgUpdateFlags.None; +#endif + default: return CfgUpdateFlags.None; + } + + return CfgUpdateFlags.None; + } + + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + + int iDummy; + float fDummy; + + switch (i) + { + case 0: + for (MeterType mt = 0; mt < MeterType.Count; mt++) if (mt.ToString().Equals(strValue)) return true; + break; + case 1: + if (Utils.TryParseSFloat(strValue, out fDummy) && fDummy >= -10.0f && fDummy <= 10.0f) return true; + break; + case 2: + case 3: + if (int.TryParse(strValue, out iDummy) && iDummy >= 1000 && iDummy <= 8000) return true; + break; + +#if ORACLE_DB + case 4: /// WMType_ID + case 5: /// WMType_Rev + if (int.TryParse(strValue, out iDummy)) return true; + break; +#endif + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(ProcParams prms) + { + prms.MeterType = this.MeterType; + prms.CalibTarget = this.CalibTarget; + prms.FactorLimitLo = this.FactorLimitLo; + prms.FactorLimitHi = this.FactorLimitHi; +#if ORACLE_DB + prms.WMType_ID = this.WMType_ID; + prms.WMType_Rev = this.WMType_Rev; +#endif + } + + public IParamsProvider Clone() + { + ProcParams pars = new ProcParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateFromDbEntity(ComponentProcedure dbEntity) + { + if (dbEntity == null) return; + try + { + ProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcParams; + + procedureParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + procedure = dbEntity.Procedure; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + + public ProcParams() + { + } + + public ProcParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public ProcParams(ComponentProcedure procParamsEntity, string componentName, Procedure procedure) + { + this.procedureParamsEntity = procParamsEntity; + this.componentName = componentName; + this.procedure = procedure; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/StatusStruct.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/StatusStruct.cs new file mode 100644 index 00000000..d7954a22 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/StatusStruct.cs @@ -0,0 +1,160 @@ +/// +/// Copyright (c) 2015-2017 Sensus Metering Systems +/// +using System; + +namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead +{ + public class StatusStruct + { + public static readonly int Length = 48; + + public Byte Version; + public FlowState FlowState; + public UInt32 BillingVolume; + public UInt32 ForwardVolume; + public UInt32 ReverseVolume; + public UInt32 SecondsActive; + public UInt32 SecondsIdle; + public UInt32 SecondsUsed; + public UInt32 UTC; + public Int32 ScaledAvgFlowRate; + public UInt16 PeakFlowRate; + public UInt16 AlarmState; + public byte RebootCount; + public byte[] AlarmCount; + public UInt16 FlipTime; + + + public StatusStruct() + { + AlarmCount = new byte[7]; + } + + public byte[] ToByteArray() + { + byte[] result = new byte[Length]; + + result[0] = Version; + result[1] = (byte)FlowState; + + result[2] = (byte)(BillingVolume & 0x000000FF); + result[3] = (byte)((BillingVolume >> 8) & 0x000000FF); + result[4] = (byte)((BillingVolume >> 16) & 0x000000FF); + result[5] = (byte)((BillingVolume >> 24) & 0x000000FF); + + result[6] = (byte)(ForwardVolume & 0x000000FF); + result[7] = (byte)((ForwardVolume >> 8) & 0x000000FF); + result[8] = (byte)((ForwardVolume >> 16) & 0x000000FF); + result[9] = (byte)((ForwardVolume >> 24) & 0x000000FF); + + result[10] = (byte)(ReverseVolume & 0x000000FF); + result[11] = (byte)((ReverseVolume >> 8) & 0x000000FF); + result[12] = (byte)((ReverseVolume >> 16) & 0x000000FF); + result[13] = (byte)((ReverseVolume >> 24) & 0x000000FF); + + result[14] = (byte)(SecondsActive & 0x000000FF); + result[15] = (byte)((SecondsActive >> 8) & 0x000000FF); + result[16] = (byte)((SecondsActive >> 16) & 0x000000FF); + result[17] = (byte)((SecondsActive >> 24) & 0x000000FF); + + result[18] = (byte)(SecondsIdle & 0x000000FF); + result[19] = (byte)((SecondsIdle >> 8) & 0x000000FF); + result[20] = (byte)((SecondsIdle >> 16) & 0x000000FF); + result[21] = (byte)((SecondsIdle >> 24) & 0x000000FF); + + result[22] = (byte)(SecondsUsed & 0x000000FF); + result[23] = (byte)((SecondsUsed >> 8) & 0x000000FF); + result[24] = (byte)((SecondsUsed >> 16) & 0x000000FF); + result[25] = (byte)((SecondsUsed >> 24) & 0x000000FF); + + result[26] = (byte)(UTC & 0x000000FF); + result[27] = (byte)((UTC >> 8) & 0x000000FF); + result[28] = (byte)((UTC >> 16) & 0x000000FF); + result[29] = (byte)((UTC >> 24) & 0x000000FF); + + result[30] = (byte)(ScaledAvgFlowRate & 0x000000FF); + result[31] = (byte)((ScaledAvgFlowRate >> 8) & 0x000000FF); + result[32] = (byte)((ScaledAvgFlowRate >> 16) & 0x000000FF); + result[33] = (byte)((ScaledAvgFlowRate >> 24) & 0x000000FF); /// TODO: test with negative value + + result[34] = (byte)(PeakFlowRate & 0x00FF); + result[35] = (byte)((PeakFlowRate >> 8) & 0x00FF); + + result[36] = (byte)(AlarmState & 0x00FF); + result[37] = (byte)((AlarmState >> 8) & 0x00FF); + + result[38] = RebootCount; + + result[39] = AlarmCount[0]; + result[40] = AlarmCount[1]; + result[41] = AlarmCount[2]; + result[42] = AlarmCount[3]; + result[43] = AlarmCount[4]; + result[44] = AlarmCount[5]; + result[45] = AlarmCount[6]; + + result[46] = (byte)(FlipTime & 0x00FF); + result[47] = (byte)((FlipTime >> 8) & 0x00FF); + + return result; + } + + public static StatusStruct FromByteArray(byte[] data) + { + if (data.Length != Length) return null; + + StatusStruct result = new StatusStruct(); + + result.Version = data[0]; + result.FlowState = (FlowState)data[1]; + result.BillingVolume = (((UInt32)data[5] * 256 + data[4]) * 256 + data[3]) * 256 + data[2]; + result.ForwardVolume = (((UInt32)data[9] * 256 + data[8]) * 256 + data[7]) * 256 + data[6]; + result.ReverseVolume = (((UInt32)data[13] * 256 + data[12]) * 256 + data[11]) * 256 + data[10]; + result.SecondsActive = (((UInt32)data[17] * 256 + data[16]) * 256 + data[15]) * 256 + data[14]; + result.SecondsIdle = (((UInt32)data[21] * 256 + data[20]) * 256 + data[19]) * 256 + data[18]; + result.SecondsUsed = (((UInt32)data[25] * 256 + data[24]) * 256 + data[23]) * 256 + data[22]; + result.UTC = (((UInt32)data[29] * 256 + data[28]) * 256 + data[27]) * 256 + data[26]; + result.ScaledAvgFlowRate = (((Int32)data[33] * 256 + data[32]) * 256 + data[31]) * 256 + data[30]; /// TODO: test with negative value + result.PeakFlowRate = (UInt16)(data[34] + 256 * data[35]); + result.AlarmState = (UInt16)(data[36] + 256 * data[37]); + result.RebootCount = data[38]; + result.AlarmCount[0] = data[39]; + result.AlarmCount[1] = data[40]; + result.AlarmCount[2] = data[41]; + result.AlarmCount[3] = data[42]; + result.AlarmCount[4] = data[43]; + result.AlarmCount[5] = data[44]; + result.AlarmCount[6] = data[45]; + result.FlipTime = (UInt16)(data[46] * 256 + data[47]); + + return result; + } + + public override string ToString() + { + return string.Format("Status: V{0} Flow={1} BillVol={2} ForwVol={3} RevVol={4} SecActive={5}s SecIdle={6}s SecUsed={7}s UTC={8} AvgFlowRate={9} PeekFlowRate={10} AlarmState={11} RebootCount={12} A0={13} A1={14} A2={15} A3={16} A4={17} A5={18} A6={19} FlipTime={20}", + Version, + FlowState, + BillingVolume, + ForwardVolume, + ReverseVolume, + SecondsActive, + SecondsIdle, + SecondsUsed, + UTC, + ScaledAvgFlowRate, + PeakFlowRate, + AlarmState, + RebootCount, + AlarmCount[0], + AlarmCount[1], + AlarmCount[2], + AlarmCount[3], + AlarmCount[4], + AlarmCount[5], + AlarmCount[6], + FlipTime); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/TestParamsBase.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/TestParamsBase.cs new file mode 100644 index 00000000..1acf82f3 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/TestParamsBase.cs @@ -0,0 +1,107 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using Config.Entities; + +namespace TBF.BenchControl +{ + public class TestParamsBase : Generic.ITestParams + { + protected ComponentTest testParamsEntity; + + public virtual XmlSerializer GetSerializer() { return new XmlSerializer(GetType()); } + + public string ComponentName { get { return componentName; } } + protected string componentName; + + public Test Test { get { return test; } } + protected Test test; + + /// + /// Parameterless constructor required for serialization + /// + public TestParamsBase() + { + InitializeAll(); + } + + /// To be overridden + public virtual void InitializeAll() + { + } + + /// To be overridden + public virtual IList ParamValues(int ix) + { + return null; + } + + /// To be overridden + public virtual void UpdateFromDbEntity(ComponentTest dbEntity) + { + } + + public void FromDbEntity(string cmpntName, Test test) + { + ComponentTest componentTest = test.GetTestParamsEntity(cmpntName); + if (componentTest != null) + { + UpdateFromDbEntity(componentTest); + return; + } + + /// Create a new entity and add it to the list test.MoreParams + InitializeAll(); + this.testParamsEntity = this.ToDbEntity(cmpntName, test); + this.testParamsEntity.SetParamsProvider(this as IParamsProvider); + this.test = test; + this.componentName = cmpntName; + test.MoreParams.Add(testParamsEntity); + } + + public ComponentTest ToDbEntity(string cmpntName, Test test) + { + using (var writer = new StringWriter()) + { + GetSerializer().Serialize(writer, this); /// Serialize this class with parameters + return new ComponentTest(cmpntName, writer.ToString(), test); /// Return new ComponentTest entity + } + } + + public void UpdateEmbeddedDbEntity() + { + using (var writer = new StringWriter()) + { + /// Serialize this class and update the entity + GetSerializer().Serialize(writer, this); + testParamsEntity.Parameters = writer.ToString(); + testParamsEntity.CmpntName = componentName; + testParamsEntity.Test = test; + } + } + + public virtual string ParamName(int i) { return string.Empty; } + + public virtual int ParamsCount() { return 0; } + + public virtual string ToString(int i) { return string.Empty; } + + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < ParamsCount(); i++) + { + if (i != 0) sb.Append("; "); + sb.Append(ParamName(i)); + sb.Append("="); + sb.Append(ToString(i)); + } + return sb.ToString(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Transition.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Transition.cs new file mode 100644 index 00000000..f0d34631 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Transition.cs @@ -0,0 +1,35 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; + +namespace TBF.BenchControl +{ + public class Transition + { + public Event Evnt; + public State NextState; /// if not null, nextState reference is used + public string NextStateLabel; /// otherwise nextStateLabel is used + + /// + /// Constructor using a next state reference + /// + public Transition(Event evnt, State nextState) + { + this.Evnt = evnt; + this.NextState = nextState; + this.NextStateLabel = null; + } + + /// + /// Constructor using a next state label + /// + public Transition(Event evnt, string nextStateLabel) + { + this.Evnt = evnt; + this.NextState = null; + this.NextStateLabel = nextStateLabel; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Various/ErrorFlags/Errors.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Various/ErrorFlags/Errors.cs new file mode 100644 index 00000000..840be944 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Various/ErrorFlags/Errors.cs @@ -0,0 +1,224 @@ +/// +/// Copyright (c) 2017-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using log4net; +using Results.Entities; +using TBF.BenchControl.Sequences; + +namespace TBF.BenchControl.Various.ErrorFlags +{ + public class Errors : ComponentBase, GenericDevices.IErrorFlags + { + private static readonly ILog log = LogManager.GetLogger(typeof(Errors)); + public override string ToString() + { + return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); + } + + /// + /// Cfg + /// + readonly ErrorsCfg errorsCfg; + public Config.Entities.ErrorFlagsMode Mode { get { return errorsCfg.TestParams.Mode; } } + + /// + /// Ger error flags for a test + /// + /// A valid test result + /// true = diverter was used (times apply) + /// true = start/stop valve was used (times apply) + /// Diverter or valve switch time in s on test start + /// Diverter or valve switch time in s on test end + /// Error flags + public int GetErrorFlags(TestRslt testRslt, bool diverter, bool startStopValve, float switchTimeStart, float switchTimeEnd) + { + if (Mode == Config.Entities.ErrorFlagsMode.Off) + { + return 0; /// return 0 when Mode == ErrorFlagsMode.Off + } + + /// Any E# is 'true' on error, 'false' when OK + + /// Average flow + bool E1 = ProcessData.RefFlowStat.Average < testRslt.Qfrom() + || ProcessData.RefFlowStat.Average > testRslt.Qto(); + + /// Max. and min. up and down water temperature + bool E2 = ProcessData.TempUpStat.Min < testRslt.TempLimLo() + || ProcessData.TempUpStat.Max > testRslt.TempLimHi() + || ProcessData.TempDownStat.Min < testRslt.TempLimLo() + || ProcessData.TempDownStat.Max > testRslt.TempLimHi(); + + /// Max. flow deviation + bool E3 = ProcessData.RefFlowStat.Min < ProcessData.RefFlowStat.Average * (1.0f - errorsCfg.TestParams.Delta_Q_pct / 100.0f) + || ProcessData.RefFlowStat.Max > ProcessData.RefFlowStat.Average * (1.0f + errorsCfg.TestParams.Delta_Q_pct / 100.0f); + + /// Max. up and down water temperature deviation + bool E4 = ProcessData.TempUpStat.Min < ProcessData.TempUpStat.Average - errorsCfg.TestParams.Delta_T + || ProcessData.TempUpStat.Max > ProcessData.TempUpStat.Average + errorsCfg.TestParams.Delta_T + || ProcessData.TempDownStat.Min < ProcessData.TempDownStat.Average - errorsCfg.TestParams.Delta_T + || ProcessData.TempDownStat.Max > ProcessData.TempDownStat.Average + errorsCfg.TestParams.Delta_T; + + /// Max. absolute value of up and down water temperature difference + bool E5 = ProcessData.TempDiffStat.Max > errorsCfg.TestParams.Delta_Tup_Tdn; + + bool E6 = false; + + /// Test time (min) + bool E7 = testRslt.TestTime < errorsCfg.TestParams.TestTime_min; + + /// Test time (max) + bool E8 = testRslt.TestTime > errorsCfg.TestParams.TestTime_max; + + bool E9 = false; + bool E10 = false; + if (diverter) + { + E9 = (Math.Abs(switchTimeStart - switchTimeEnd) > errorsCfg.TestParams.Coef_E9 * (switchTimeStart + switchTimeEnd) + errorsCfg.TestParams.Offset_E9); + E10 = ((switchTimeStart + switchTimeEnd) > errorsCfg.TestParams.Coef_E10 * testRslt.TestTime); + } + + bool E11 = false; + bool E12 = false; + if (startStopValve) + { + E11 = ((switchTimeStart + switchTimeEnd) > errorsCfg.TestParams.Coef_E11 * testRslt.TestTime); + E12 = (Math.Abs(switchTimeStart - switchTimeEnd) > errorsCfg.TestParams.Coef_E12 * (switchTimeStart + switchTimeEnd) + errorsCfg.TestParams.Offset_E12); + } + + /// Ambient temperature + bool E13 = ProcessData.AmbTempStat.Min < errorsCfg.TestParams.AmbTemp_min + || ProcessData.AmbTempStat.Max > errorsCfg.TestParams.AmbTemp_max; + + /// Water pressure + bool E14 = ProcessData.PressUpStat.Min < errorsCfg.TestParams.Pressure_min + || ProcessData.PressUpStat.Max > errorsCfg.TestParams.Pressure_max + || ProcessData.PressDownStat.Min < errorsCfg.TestParams.Pressure_min + || ProcessData.PressDownStat.Max > errorsCfg.TestParams.Pressure_max; + + /// Max. and min. flow + bool E21 = ProcessData.RefFlowStat.Min < testRslt.Qfrom() + || ProcessData.RefFlowStat.Max > testRslt.Qto(); + + int ErrorFlags = 0; + if (errorsCfg.TestParams.E1 && E1) ErrorFlags |= 0x0001; + if (errorsCfg.TestParams.E2 && E2) ErrorFlags |= 0x0002; + if (errorsCfg.TestParams.E3 && E3) ErrorFlags |= 0x0004; + if (errorsCfg.TestParams.E4 && E4) ErrorFlags |= 0x0008; + if (errorsCfg.TestParams.E5 && E5) ErrorFlags |= 0x0010; + if (errorsCfg.TestParams.E6 && E6) ErrorFlags |= 0x0020; + if (errorsCfg.TestParams.E7 && E7) ErrorFlags |= 0x0040; + if (errorsCfg.TestParams.E8 && E8) ErrorFlags |= 0x0080; + if (errorsCfg.TestParams.E9 && E9) ErrorFlags |= 0x0100; + if (errorsCfg.TestParams.E10 && E10) ErrorFlags |= 0x0200; + if (errorsCfg.TestParams.E11 && E11) ErrorFlags |= 0x0400; + if (errorsCfg.TestParams.E12 && E12) ErrorFlags |= 0x0800; + if (errorsCfg.TestParams.E13 && E13) ErrorFlags |= 0x1000; + if (errorsCfg.TestParams.E14 && E14) ErrorFlags |= 0x2000; + //E15 0x4000 + //E16 0x8000 + //E17 0x10000 + //E18 0x20000 + //E19 0x40000 + //E20 0x80000 + if (errorsCfg.TestParams.E21 && E21) ErrorFlags |= 0x100000; + return ErrorFlags; + } + + + MeterTestRslt GetMtrTstRsltFromNames(IList meterTestRslts, string testNames) + { + if (string.IsNullOrEmpty(testNames)) return null; + + string[] names = testNames.Split(new char[] { ';' }); + + foreach (var nm in names) + { + foreach (var mtr in meterTestRslts) if (mtr.Name() == nm) return mtr; + } + + return null; /// No matching MeterTestRslt found + } + + /// + /// Get water meter error flags E15 and E16 (evaluated from three meter test results) + /// + /// Meter test results + /// Error flags + public int GetWMtrErrorFlags(IList meterTestRslts) + { + MeterTestRslt mtrQ3 = GetMtrTstRsltFromNames(meterTestRslts, errorsCfg.Q3Names); + MeterTestRslt mtrQ2 = GetMtrTstRsltFromNames(meterTestRslts, errorsCfg.Q2Names); + MeterTestRslt mtrQ1 = GetMtrTstRsltFromNames(meterTestRslts, errorsCfg.Q1Names); + + if (mtrQ3 == null || !mtrQ3.TestDone || mtrQ2 == null || !mtrQ2.TestDone || mtrQ1 == null || !mtrQ1.TestDone) + { + return 0; + } + else if ((mtrQ3.Error > mtrQ3.ErrLimHi() / 2) && + (mtrQ2.Error > mtrQ2.ErrLimHi() / 2) && + (mtrQ1.Error > mtrQ1.ErrLimHi() / 2)) + { + return 0x4000; /// E15 + } + else if ((mtrQ3.Error < mtrQ3.ErrLimLo() / 2) && + (mtrQ2.Error < mtrQ2.ErrLimLo() / 2) && + (mtrQ1.Error < mtrQ1.ErrLimLo() / 2)) + { + return 0x4000; /// E15 + } + else + { + return 0; + } + } + + + public Errors() + { + } + + public Errors(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + errorsCfg = cfg as ErrorsCfg; + + StartChangeHandler(); + + log.Debug(this.ToString()); + } + + + #region Configuration Change Handling + + public static void OnCfgChange(object sender, CfgChangeArgs args) + { + if (CfgChangeHandler == null) return; + try { CfgChangeHandler(sender, args); } + catch (Exception e) { log.Error("CfgChangeHandler(...) failed", e); } + } + + public static event EventHandler CfgChangeHandler; + + public override void StartChangeHandler() + { + CfgChangeHandler += delegate(object sender, CfgChangeArgs args) + { + ErrorsCfg tmpcfg = args.Cfg as ErrorsCfg; + if (tmpcfg != null && tmpcfg.Name.Equals(Name)) + { + if (args.Command == CfgChangeCmd.CfgChange) + { + errorsCfg.Q3Names = tmpcfg.Q3Names; + errorsCfg.Q2Names = tmpcfg.Q2Names; + errorsCfg.Q1Names = tmpcfg.Q1Names; + } + } + }; + } + + #endregion Configuration Change Handling + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Various/ErrorFlags/ErrorsCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Various/ErrorFlags/ErrorsCfg.cs new file mode 100644 index 00000000..dfd6fba9 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Various/ErrorFlags/ErrorsCfg.cs @@ -0,0 +1,48 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Various.ErrorFlags +{ + public class ErrorsCfg : ComponentCfgBase, IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ErrorsCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new ErrorsCfgCtrl(); } + + /// + /// Serialized parameters + /// + public string Q3Names; + public string Q2Names; + public string Q1Names; + + /// Test parameters + [XmlIgnore] + public TestParams TestParams; + public override IParamsProvider GetRuntimeTestParamsProvider() { return TestParams; } + public override IParamsProvider CreateTestParamsProvider() { return new TestParams(true); } + + /// Private parameterless constructor invoked by all other (public) constructors + ErrorsCfg() + { + TestParams = new TestParams(true); + } + + public ErrorsCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + Factory = factory; + } + + public string ToString(int i) + { + return string.Format("{0}", Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Various/ErrorFlags/ErrorsCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Various/ErrorFlags/ErrorsCfgCtrl.cs new file mode 100644 index 00000000..4e0c5783 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Various/ErrorFlags/ErrorsCfgCtrl.cs @@ -0,0 +1,129 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.Various.ErrorFlags +{ + public partial class ErrorsCfgCtrl : UserControl, IComponentCfgCtrl + { + static readonly ILog log = LogManager.GetLogger(typeof(ErrorsCfgCtrl)); + + ComponentParametersDlg parent; + + public bool ShowMore { get { return false; } } + + ErrorsCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as ErrorsCfg; + Redraw(); + } + } + + public ErrorsCfgCtrl() + { + InitializeComponent(); + } + + private void PumpCfgCtrl_Load(object sender, EventArgs e) + { + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + q3NamesTextBox.Text = config.Q3Names; + q2NamesTextBox.Text = config.Q2Names; + q1NamesTextBox.Text = config.Q1Names; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + q3NamesTextBox.Enabled = true; + q2NamesTextBox.Enabled = true; + q1NamesTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + if (config.Name != nameTextBox.Text) + { + config.Name = nameTextBox.Text; + flags |= (CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + } + + if (config.Q3Names != q3NamesTextBox.Text) + { + config.Q3Names = q3NamesTextBox.Text; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.Q2Names != q2NamesTextBox.Text) + { + config.Q2Names = q2NamesTextBox.Text; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if (config.Q1Names != q1NamesTextBox.Text) + { + config.Q1Names = q1NamesTextBox.Text; + flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + } + + if ((flags & CfgUpdateFlags.InvokeCfgChange) != 0) + { + Errors.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.CfgChange, Config)); + } + + return flags; + } + + #region Configuration Change Handling + + public static void OnCmdResponse(object sender, CmdResponseArgs args) + { + if (CmdResponseHandler == null) return; + try { CmdResponseHandler(sender, args); } + catch (Exception e) { log.Error("CmdResponseHandler(...) failed", e); } + } + + public static event EventHandler CmdResponseHandler; + + public void StartResponseHandler() { } + public void StopResponseHandler() { } + + #endregion Configuration Change Handling + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Various/ErrorFlags/ErrorsCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Various/ErrorFlags/ErrorsCfgCtrl.designer.cs new file mode 100644 index 00000000..b0688d3b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Various/ErrorFlags/ErrorsCfgCtrl.designer.cs @@ -0,0 +1,190 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.BenchControl.Various.ErrorFlags +{ + partial class ErrorsCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.q3NamesTextBox = new System.Windows.Forms.TextBox(); + this.q2NamesTextBox = new System.Windows.Forms.TextBox(); + this.q1NamesTextBox = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(130, 49); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(174, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(20, 52); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(127, 26); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(114, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComponentClassName"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(-211, -147); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(57, 13); + this.label1.TabIndex = 5; + this.label1.Text = "Arguments"; + // + // textBox1 + // + this.textBox1.Enabled = false; + this.textBox1.Location = new System.Drawing.Point(-125, -150); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(372, 20); + this.textBox1.TabIndex = 6; + // + // q3NamesTextBox + // + this.q3NamesTextBox.Enabled = false; + this.q3NamesTextBox.Location = new System.Drawing.Point(130, 103); + this.q3NamesTextBox.Name = "q3NamesTextBox"; + this.q3NamesTextBox.Size = new System.Drawing.Size(174, 20); + this.q3NamesTextBox.TabIndex = 7; + // + // q2NamesTextBox + // + this.q2NamesTextBox.Enabled = false; + this.q2NamesTextBox.Location = new System.Drawing.Point(130, 129); + this.q2NamesTextBox.Name = "q2NamesTextBox"; + this.q2NamesTextBox.Size = new System.Drawing.Size(174, 20); + this.q2NamesTextBox.TabIndex = 8; + // + // q1NamesTextBox + // + this.q1NamesTextBox.Enabled = false; + this.q1NamesTextBox.Location = new System.Drawing.Point(130, 155); + this.q1NamesTextBox.Name = "q1NamesTextBox"; + this.q1NamesTextBox.Size = new System.Drawing.Size(174, 20); + this.q1NamesTextBox.TabIndex = 9; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(20, 106); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(93, 13); + this.label2.TabIndex = 10; + this.label2.Text = "1st test name (Q3)"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(20, 132); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(97, 13); + this.label3.TabIndex = 11; + this.label3.Text = "2nd test name (Q2)"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(20, 158); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(94, 13); + this.label4.TabIndex = 12; + this.label4.Text = "3rd test name (Q1)"; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(127, 82); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(250, 13); + this.label5.TabIndex = 13; + this.label5.Text = "Test names for E15, E16 evaluation separated by \';\'"; + // + // ErrorsCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.label5); + this.Controls.Add(this.label4); + this.Controls.Add(this.label3); + this.Controls.Add(this.label2); + this.Controls.Add(this.q1NamesTextBox); + this.Controls.Add(this.q2NamesTextBox); + this.Controls.Add(this.q3NamesTextBox); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.label1); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "ErrorsCfgCtrl"; + this.Size = new System.Drawing.Size(500, 300); + this.Load += new System.EventHandler(this.PumpCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.TextBox q3NamesTextBox; + private System.Windows.Forms.TextBox q2NamesTextBox; + private System.Windows.Forms.TextBox q1NamesTextBox; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label5; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Various/ErrorFlags/ErrorsCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/Various/ErrorFlags/ErrorsCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Various/ErrorFlags/ErrorsCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Various/ErrorFlags/Factory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Various/ErrorFlags/Factory.cs new file mode 100644 index 00000000..823733c0 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Various/ErrorFlags/Factory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.Various.ErrorFlags +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { Errors.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new Errors(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Errors(cfg, components); } + + public IComponentCfg DefaultConfig() { return new ErrorsCfg(this.GetType().Namespace.Substring(25), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(ErrorsCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/Various/ErrorFlags/TestParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/Various/ErrorFlags/TestParams.cs new file mode 100644 index 00000000..2c4c6cb1 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/Various/ErrorFlags/TestParams.cs @@ -0,0 +1,387 @@ +/// +/// Copyright (c) 2017-2018 Sensus Slovensko a.s. +/// +using System.IO; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.Various.ErrorFlags +{ + public class TestParams : TestParamsBase, IParamsProvider, ITestParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestParams) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public ErrorFlagsMode Mode; /// 0 = Off, 1 = Info (show only), 2 = On (show and evaluate) + public bool E1; + public bool E2; + public bool E3; + public bool E4; + public bool E5; + public bool E6; + public bool E7; + public bool E8; + public bool E9; + public bool E10; + public bool E11; + public bool E12; + public bool E13; + public bool E14; + public bool E15; + public bool E16; + public bool E21; + + public float Delta_Q_pct; /// [%] max deviation from the mean flow + public float Delta_T; /// [°C] max. T_up or T_down deviation from the mean temperature + public float Delta_Tup_Tdn; /// [°C] max. difference abs(T_up - T_down) + public float TestTime_min; /// [s] + public float TestTime_max; /// [s] + public float AmbTemp_min; /// [°C] min. ambient temperature + public float AmbTemp_max; /// [°C] max. ambient temperature + public float Pressure_min; /// [bar] min. water pressure + public float Pressure_max; /// [bar] max. water pressure + + public float Coef_E9; /// Coefficient used in E9, default 0.025 + public float Coef_E10; /// Coefficient used in E10, default 0.04 + public float Coef_E11; /// Coefficient used in E11, default 0.1 + public float Coef_E12; /// Coefficient used in E12, default 1 + public float Offset_E9; /// [s] default 0 (no offset) + public float Offset_E12; /// [s] default 0 (no offset) + + public override void InitializeAll() + { + Mode = ErrorFlagsMode.Info; +#if IPERL + E1 = true; + E2 = false; + E3 = true; + E4 = false; + E5 = false; + E6 = false; + E7 = false; + E8 = false; + E9 = false; + E10 = false; + E11 = false; + E12 = false; + E13 = false; + E14 = false; + E15 = false; + E16 = false; + E21 = true; +#else + E1 = true; + E2 = true; + E3 = true; + E4 = true; + E5 = true; + E6 = true; + E7 = true; + E8 = true; + E9 = true; + E10 = true; + E11 = true; + E12 = true; + E13 = true; + E14 = true; + E15 = true; + E16 = true; + E21 = true; +#endif + Delta_Q_pct = 5.0f; /// [%] + Delta_T = 10.0f; /// [°C] + Delta_Tup_Tdn = 10.0f; /// [°C] + TestTime_min = 0; /// [s] + TestTime_max = 99999; /// [s] + AmbTemp_min = 5.0f; /// [°C] + AmbTemp_max = 95.0f; /// [°C] + Pressure_min = 0; /// [bar] + Pressure_max = 16.0f; /// [bar] + + Coef_E9 = 0.025f; + Coef_E10 = 0.04f; + Coef_E11 = 0.1f; + Coef_E12 = 1.0f; + Offset_E9 = 0; /// [s] + Offset_E12 = 0; /// [s] + } + + string[] paramNames = new string[] + { + Strings.Mode, + "E1", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "E10", + "E11", + "E12", + "E13", + "E14", + "E15", + "E16", + "E21", + + "Delta Q [%]", + "Delta T [°C]", + "max. Abs(Tup - Tdn) [°C]", + string.Format("min. {0}", Strings.Test_time_s_chdr), + string.Format("max. {0}", Strings.Test_time_s_chdr), + string.Format("min. {0} [°C]", Strings.Air_temperature), + string.Format("max. {0} [°C]", Strings.Air_temperature), + string.Format("min. {0} [bar]", Strings.Pressure), + string.Format("max. {0} [bar]", Strings.Pressure), + + "Coef.E9", + "Coef.E10", + "Coef.E11", + "Coef.E12", + "Offset E9 [s]", + "Offset E12 [s]", + }; + public override string ParamName(int i) { return paramNames[i]; } + public override int ParamsCount() { return paramNames.Length; } + + public override string ToString(int i) + { + switch (i) + { + case 0: return Mode.ToDescription(); + case 1: return (E1 ? Strings.yes : Strings.no); + case 2: return (E2 ? Strings.yes : Strings.no); + case 3: return (E3 ? Strings.yes : Strings.no); + case 4: return (E4 ? Strings.yes : Strings.no); + case 5: return (E5 ? Strings.yes : Strings.no); + case 6: return (E6 ? Strings.yes : Strings.no); + case 7: return (E7 ? Strings.yes : Strings.no); + case 8: return (E8 ? Strings.yes : Strings.no); + case 9: return (E9 ? Strings.yes : Strings.no); + case 10: return (E10 ? Strings.yes : Strings.no); + case 11: return (E11 ? Strings.yes : Strings.no); + case 12: return (E12 ? Strings.yes : Strings.no); + case 13: return (E13 ? Strings.yes : Strings.no); + case 14: return (E14 ? Strings.yes : Strings.no); + case 15: return (E15 ? Strings.yes : Strings.no); + case 16: return (E16 ? Strings.yes : Strings.no); + case 17: return (E21 ? Strings.yes : Strings.no); + + case 18: return Delta_Q_pct.ToString(); + case 19: return Delta_T.ToString(); + case 20: return Delta_Tup_Tdn.ToString(); + case 21: return TestTime_min.ToString(); + case 22: return TestTime_max.ToString(); + case 23: return AmbTemp_min.ToString(); + case 24: return AmbTemp_max.ToString(); + case 25: return Pressure_min.ToString(); + case 26: return Pressure_max.ToString(); + case 27: return Coef_E9.ToString(); + case 28: return Coef_E10.ToString(); + case 29: return Coef_E11.ToString(); + case 30: return Coef_E12.ToString(); + case 31: return Offset_E9.ToString(); + case 32: return Offset_E12.ToString(); + + default: return string.Empty; + } + } + + /// Retrieves parameters from UI controls + public CfgUpdateFlags UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: + for (ErrorFlagsMode m = 0; m < ErrorFlagsMode.Count; m++) + { + if (m.ToDescription() == strValue) + { + Mode = m; + return CfgUpdateFlags.None; + } + } + return CfgUpdateFlags.None; + case 1: E1 = (strValue == Strings.yes); return CfgUpdateFlags.None; + case 2: E2 = (strValue == Strings.yes); return CfgUpdateFlags.None; + case 3: E3 = (strValue == Strings.yes); return CfgUpdateFlags.None; + case 4: E4 = (strValue == Strings.yes); return CfgUpdateFlags.None; + case 5: E5 = (strValue == Strings.yes); return CfgUpdateFlags.None; + case 6: E6 = (strValue == Strings.yes); return CfgUpdateFlags.None; + case 7: E7 = (strValue == Strings.yes); return CfgUpdateFlags.None; + case 8: E8 = (strValue == Strings.yes); return CfgUpdateFlags.None; + case 9: E9 = (strValue == Strings.yes); return CfgUpdateFlags.None; + case 10: E10 = (strValue == Strings.yes); return CfgUpdateFlags.None; + case 11: E11 = (strValue == Strings.yes); return CfgUpdateFlags.None; + case 12: E12 = (strValue == Strings.yes); return CfgUpdateFlags.None; + case 13: E13 = (strValue == Strings.yes); return CfgUpdateFlags.None; + case 14: E14 = (strValue == Strings.yes); return CfgUpdateFlags.None; + case 15: E15 = (strValue == Strings.yes); return CfgUpdateFlags.None; + case 16: E16 = (strValue == Strings.yes); return CfgUpdateFlags.None; + case 17: E21 = (strValue == Strings.yes); return CfgUpdateFlags.None; + + case 18: Delta_Q_pct = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 19: Delta_T = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 20: Delta_Tup_Tdn = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 21: TestTime_min = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 22: TestTime_max = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 23: AmbTemp_min = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 24: AmbTemp_max = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 25: Pressure_min = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 26: Pressure_max = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 27: Coef_E9 = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 28: Coef_E10 = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 29: Coef_E11 = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 30: Coef_E12 = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 31: Offset_E9 = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 32: Offset_E12 = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + + default: return CfgUpdateFlags.None; + } + } + + /// Verifies whether strings in UI controls represent valid parameters + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + + float fdummy; + switch (i) + { + case 0: + for (ErrorFlagsMode m = 0; m < ErrorFlagsMode.Count; m++) + { + if (m.ToDescription() == strValue) return true; + } + break; + + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + case 16: + case 17: + if (strValue == Strings.yes || strValue == Strings.no) return true; + break; + + case 18: + case 19: + case 20: + case 21: + case 22: + case 23: + case 24: + case 25: + case 26: + case 27: + case 28: + case 29: + case 30: + case 31: + case 32: + if (Utils.TryParseUFloat(strValue, out fdummy)) return true; + break; + + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(TestParams prms) + { + prms.Mode = this.Mode; + prms.E1 = this.E1; + prms.E2 = this.E2; + prms.E3 = this.E3; + prms.E4 = this.E4; + prms.E5 = this.E5; + prms.E6 = this.E6; + prms.E7 = this.E7; + prms.E8 = this.E8; + prms.E9 = this.E9; + prms.E10 = this.E10; + prms.E11 = this.E11; + prms.E12 = this.E12; + prms.E13 = this.E13; + prms.E14 = this.E14; + prms.E15 = this.E15; + prms.E16 = this.E16; + prms.E21 = this.E21; + + prms.Delta_Q_pct = this.Delta_Q_pct; + prms.Delta_T = this.Delta_T; + prms.Delta_Tup_Tdn = this.Delta_Tup_Tdn; + prms.TestTime_min = this.TestTime_min; + prms.TestTime_max = this.TestTime_max; + prms.AmbTemp_min = this.AmbTemp_min; + prms.AmbTemp_max = this.AmbTemp_max; + prms.Pressure_min = this.Pressure_min; + prms.Pressure_max = this.Pressure_max; + prms.Coef_E9 = this.Coef_E9; + prms.Coef_E10 = this.Coef_E10; + prms.Coef_E11 = this.Coef_E11; + prms.Coef_E12 = this.Coef_E12; + prms.Offset_E9 = this.Offset_E9; + prms.Offset_E12 = this.Offset_E12; + } + + public IParamsProvider Clone() + { + TestParams pars = new TestParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateFromDbEntity(ComponentTest dbEntity) + { + if (dbEntity == null) return; + try + { + TestParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as TestParams; + + testParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + test = dbEntity.Test; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + public TestParams() { } + + public TestParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public TestParams(ComponentProcedure procedureParamsEntity, string componentName, Test test) + { + this.testParamsEntity = testParamsEntity; + this.componentName = componentName; + this.test = test; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/Munich/ProcParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/Munich/ProcParams.cs new file mode 100644 index 00000000..afdefd1d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/Munich/ProcParams.cs @@ -0,0 +1,206 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.WaterMeters.Munich +{ + public class ProcParams : ProcedureParamsBase, IParamsProvider, IProcedureParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcParams) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public string ProductName; /// Znak fabryczny (PL) + public string Producer; /// Producent (PL), Hersteller (D) + + public float DN; + public float L; /// stavebná dĺžka [mm] + public Mounting Mounting; + + public bool NewQnames; /// true = display Q4,Q3,Q2,Q1, false = display Qmax, Qn, Qt, Qmin + public float Qn; /// [m3/h] + public string MetrologicalClass; /// Metr. Klasse + public string ApprovalInfo; /// Zulassungszeichen, WE (PL) + + + public override void InitializeAll() + { + ProductName = string.Empty; + Producer = string.Empty; + DN = 0; + L = 0; + Mounting = Mounting.NotSpecified; + NewQnames = false; + Qn = 2.5f; + MetrologicalClass = "A"; + ApprovalInfo = string.Empty; + } + + string[] paramNames = new string[] + { +#if MUNICH + "Prüfvorlage;Zählertyp", +#else + Strings.Product_name, +#endif + Strings.Producer, + "DN [mm]", + "L [mm]", + Strings.Mounting, + Strings.New_Q_names, + Strings.Qn, + Strings.Metrological_class, + Strings.Approval_info, + }; + public override string ParamName(int i) + { + string name = paramNames[i]; + + if (NewQnames && name.Equals(Strings.Qmax)) name = "Q4 [m3/h]"; + if (NewQnames && name.Equals(Strings.Qn)) name = "Q3 [m3/h]"; + if (NewQnames && name.Equals(Strings.Qt)) name = "Q2 [m3/h]"; + if (NewQnames && name.Equals(Strings.Qmin)) name = "Q1 [m3/h]"; + + return name; + } + public override int ParamsCount() { return paramNames.Length; } + + public override string ToString(int i) + { + switch (i) + { + case 0: return ProductName; + case 1: return Producer; + case 2: return DN.ToString(); + case 3: return L.ToString(); + case 4: return Mounting.ToDescription(); + case 5: return (NewQnames ? Strings.yes : Strings.no); + case 6: return Qn.ToString(); + case 7: return MetrologicalClass; + case 8: return ApprovalInfo; + + default: return string.Empty; + } + } + + public CfgUpdateFlags UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: ProductName = strValue; return CfgUpdateFlags.None; + case 1: Producer = strValue; return CfgUpdateFlags.None; + case 2: DN = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 3: L = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 4: + for (Mounting m = 0; m < Mounting.Count; m++) + { + if (m.ToDescription().Equals(strValue)) { Mounting = m; return CfgUpdateFlags.None; } + } + break; + case 5: NewQnames = strValue.Equals(Strings.yes); return CfgUpdateFlags.None; + case 6: Qn = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 7: MetrologicalClass = strValue; return CfgUpdateFlags.None; + case 8: ApprovalInfo = strValue; return CfgUpdateFlags.None; + + default: return CfgUpdateFlags.None; + } + + return CfgUpdateFlags.None; + } + + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + + float dummy; + switch (i) + { + case 0: /// ProductName + case 1: /// Producer + case 7: /// MetrologicalClass + case 8: /// ApprovalInfo + return true; + case 2: /// DN + case 3: /// L + case 6: /// Qn + if (Utils.TryParseUFloat(strValue, out dummy)) return true; + break; + case 4: + for (Mounting tc = 0; tc < Mounting.Count; tc++) if (tc.ToDescription().Equals(strValue)) return true; + break; + case 5: + if (strValue.Equals(Strings.yes) || strValue.Equals(Strings.no)) return true; + break; + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(ProcParams prms) + { + prms.ProductName = this.ProductName; + prms.Producer = this.Producer; + prms.DN = this.DN; + prms.L = this.L; + prms.Mounting = this.Mounting; + prms.NewQnames = this.NewQnames; + prms.Qn = this.Qn; + prms.MetrologicalClass = this.MetrologicalClass; + prms.ApprovalInfo = this.ApprovalInfo; + } + + public IParamsProvider Clone() + { + ProcParams pars = new ProcParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateFromDbEntity(ComponentProcedure dbEntity) + { + if (dbEntity == null) return; + try + { + ProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcParams; + + procedureParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + procedure = dbEntity.Procedure; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + /// + /// Parameterless constructor initializes the parameters + /// + public ProcParams() + { + } + + public ProcParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public ProcParams(ComponentProcedure procParamsEntity, string componentName, Procedure procedure) + { + this.procedureParamsEntity = procParamsEntity; + this.componentName = componentName; + this.procedure = procedure; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/Munich/WaterMeter.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/Munich/WaterMeter.cs new file mode 100644 index 00000000..d6000895 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/Munich/WaterMeter.cs @@ -0,0 +1,115 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using log4net; +using TBF.BenchControl; +using Config.Entities; + +namespace TBF.BenchControl.WaterMeters.Munich +{ + /// + /// This component = instance of this class is a placeholder for a combined main watermeter + /// + public class WaterMeter : ComponentBase, GenericDevices.IWaterMeter + { + private static readonly ILog log = LogManager.GetLogger(typeof(WaterMeter)); + public override string ToString() { return string.Format("WaterMeter({0})", Cfg.ToString(1)); } + + readonly WaterMeterCfg waterMeterCfg; + + /// WaterMeter type (product name) and producer + public string ProductName { get { return waterMeterCfg.ProcParams.ProductName; } } + public string Producer { get { return waterMeterCfg.ProcParams.Producer; } } + + public double PulsesPerLtr { get { return 1.0; } } + + /// Pipe diameter [mm] + public float DN { get { return 0; } } + + /// Build lenght [mm] + public float L { get { return 0; } } + + public Mounting Mounting { get { return Config.Entities.Mounting.NotSpecified; } } + + /// Nominal water flow in [m3/h] + public bool NewQnames { get { return waterMeterCfg.ProcParams.NewQnames; } } + public float Q4_Qmax { get { return 0; } } + public float Q3_Qn { get { return waterMeterCfg.ProcParams.Qn; } } + public float Q2_Qt { get { return 0; } } + public float Q1_Qmin { get { return 0; } } + + /// Metrological class, etc + public string MetrologicalClass { get { return waterMeterCfg.ProcParams.MetrologicalClass; } } + public TemperatureClass TemperatureClass { get { return Config.Entities.TemperatureClass.NotSpecified; } } + public PressureLossClass PressureLossClass { get { return Config.Entities.PressureLossClass.NotSpecified; } } + public MaxAdmissiblePressure MaxAdmissiblePressure { get { return Config.Entities.MaxAdmissiblePressure.NotSpecified; } } + public FlowProfileSensitivityClass FlowProfileSensitivityClass { get { return Config.Entities.FlowProfileSensitivityClass.NotSpecified; } } + + /// WaterMeter approval information or signature + public string ApprovalInfo { get { return waterMeterCfg.ProcParams.ApprovalInfo; } } + public string Certificate { get { return string.Empty; } } + + public Medium Medium { get { return Medium.ColdWater; } } + + public string Text1 { get { return string.Empty; } } + public string Text2 { get { return string.Empty; } } + public string Text3 { get { return string.Empty; } } + public string Text4 { get { return string.Empty; } } + public string Text5 { get { return string.Empty; } } + + /// Water: cold / hot + public Config.Entities.Medium WaterTemp { get { return Config.Entities.Medium.NotSpecified; } } + + /// Properties set by the Begin and the End form + public string SerialNr + { + get { return serialNr; } + set { serialNr = value; } + } + string serialNr; + + public string EndState + { + get { return endState; } + set { endState = value; } + } + string endState; + + public string BeginState + { + get { return beginState; } + set { beginState = value; } + } + string beginState; + + public bool Disabled + { + get { return disabled; } + set { disabled = value; } + } + bool disabled; + + public WaterMeter() + { + ClearData(); + } + + public WaterMeter(Generic.IComponentCfg cfg) + : base(cfg) + { + ClearData(); + waterMeterCfg = cfg as WaterMeterCfg; + log.Debug(this.ToString()); + } + + public void ClearData() + { + serialNr = string.Empty; + endState = string.Empty; + beginState = string.Empty; + disabled = false; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/Munich/WaterMeterCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/Munich/WaterMeterCfg.cs new file mode 100644 index 00000000..21c06465 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/Munich/WaterMeterCfg.cs @@ -0,0 +1,46 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.WaterMeters.Munich +{ + public class WaterMeterCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(WaterMeterCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new WaterMeterCfgCtrl(); } + + /// Procedure parameters + [XmlIgnore] + public ProcParams ProcParams; + public override IParamsProvider GetRuntimeProcParamsProvider() { return ProcParams; } + public override IParamsProvider CreateProcParamsProvider() { return new ProcParams(true); } + + /// Private parameterless constructor invoked by all other (public) constructors + WaterMeterCfg() + { + Name = "WM"; + ParentName = string.Empty; + ProcParams = CreateProcParamsProvider() as ProcParams; + } + + public WaterMeterCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}", Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/Munich/WaterMeterCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/Munich/WaterMeterCfgCtrl.cs new file mode 100644 index 00000000..3f679a9d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/Munich/WaterMeterCfgCtrl.cs @@ -0,0 +1,71 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.WaterMeters.Munich +{ + public partial class WaterMeterCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + WaterMeterCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as WaterMeterCfg; + Redraw(); + } + } + + public WaterMeterCfgCtrl() + { + InitializeComponent(); + } + + private void WaterMeterCfgCtrl_Load(object sender, EventArgs e) + { + nameLabel.Text = Strings.Name; + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/Munich/WaterMeterCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/Munich/WaterMeterCfgCtrl.designer.cs new file mode 100644 index 00000000..9b999273 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/Munich/WaterMeterCfgCtrl.designer.cs @@ -0,0 +1,86 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.WaterMeters.Munich +{ + partial class WaterMeterCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(135, 55); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 5; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(25, 58); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 4; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(132, 31); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(60, 13); + this.classNameLabel.TabIndex = 3; + this.classNameLabel.Text = "ClassName"; + // + // WaterMeterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "WaterMeterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.WaterMeterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/Munich/WaterMeterCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/Munich/WaterMeterCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/Munich/WaterMeterCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/Munich/WaterMeterFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/Munich/WaterMeterFactory.cs new file mode 100644 index 00000000..85055821 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/Munich/WaterMeterFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.WaterMeters.Munich +{ + public class WaterMeterFactory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(17); } } + + public void ResetStaticProperties() { WaterMeter.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new WaterMeter(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new WaterMeter(cfg); } + + public IComponentCfg DefaultConfig() { return new WaterMeterCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(WaterMeterCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/WaterMeter/ProcParams.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/WaterMeter/ProcParams.cs new file mode 100644 index 00000000..6542484b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/WaterMeter/ProcParams.cs @@ -0,0 +1,347 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.WaterMeters.WaterMeter +{ + public class ProcParams : ProcedureParamsBase, IParamsProvider, IProcedureParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcParams) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + + public string ProductName; /// Znak fabryczny (PL) + public string Producer; /// Producent (PL), Hersteller (D) + + public float DN; + public float L; /// stavebná dĺžka [mm] + public Mounting Mounting; + + public bool NewQnames; /// true = display Q4,Q3,Q2,Q1, false = display Qmax, Qn, Qt, Qmin + public float Qmax; /// [m3/h] + public float Qn; /// [m3/h] + public float Qt; /// [m3/h] + public float Qmin; /// [m3/h] + + public string MetrologicalClass; /// Metr. Klasse + public TemperatureClass TemperatureClass; + public PressureLossClass PressureLossClass; + public MaxAdmissiblePressure MaxAdmissiblePressure; + public FlowProfileSensitivityClass FlowProfileSensitivityClass; + + public string ApprovalInfo; /// Zulassungszeichen, WE (PL) + public string Certificate; + + public double PulsesPerLtr; /// Target low limit of the flow increase or decrease + + public string Text1; + public string Text2; + public string Text3; + public string Text4; + public string Text5; + + public Medium WaterTemp; /// Woda: zimna / tepla (PL) + + + public override void InitializeAll() + { + ProductName = string.Empty; + Producer = string.Empty; + DN = 0; + L = 0; + Mounting = Mounting.NotSpecified; + NewQnames = false; + Qmax = 4.0f; + Qn = 2.5f; + Qt = 0.005f; + Qmin = 0.003125f; + MetrologicalClass = "A"; + TemperatureClass = TemperatureClass.NotSpecified; + PressureLossClass = PressureLossClass.NotSpecified; + MaxAdmissiblePressure = MaxAdmissiblePressure.NotSpecified; + FlowProfileSensitivityClass = FlowProfileSensitivityClass.NotSpecified; + ApprovalInfo = string.Empty; + Certificate = string.Empty; + PulsesPerLtr = 1.0; + Text1 = string.Empty; + Text2 = string.Empty; + Text3 = string.Empty; + Text4 = string.Empty; + Text5 = string.Empty; + + WaterTemp = Medium.ColdWater; + } + + string[] paramNames = new string[] + { + Strings.Product_name, + Strings.Producer, + "DN", + Strings.L, + Strings.Mounting, + Strings.New_Q_names, + Strings.Qmax, + Strings.Qn, + Strings.Qt, + Strings.Qmin, + Strings.Metrological_class, + Strings.Temperature_class, + Strings.Pressure_loss_class, + Strings.Maximum_admissible_pressure, + Strings.Flow_profile_sensitivity_class, + Strings.Approval_info, + Strings.Certificate, + Strings.PulsesPerLtr, + "Text1", + "Text2", + "Text3", + "Text4", + "Text5", + + Strings.Water, /// "Woda" + }; + public override string ParamName(int i) + { + string name = paramNames[i]; + + if (NewQnames && name.Equals(Strings.Qmax)) name = "Q4"; + if (NewQnames && name.Equals(Strings.Qn)) name = "Q3"; + if (NewQnames && name.Equals(Strings.Qt)) name = "Q2"; + if (NewQnames && name.Equals(Strings.Qmin)) name = "Q1"; + + return name; + } + + public override int ParamsCount() { return paramNames.Length; } + + public override string ToString(int i) + { + switch (i) + { + case 0: return ProductName; + case 1: return Producer; + case 2: return DN.ToString(); + case 3: return L.ToString(); + case 4: return Mounting.ToDescription(); + case 5: return (NewQnames ? Strings.yes : Strings.no); + case 6: return Qmax.ToString(); + case 7: return Qn.ToString(); + case 8: return Qt.ToString(); + case 9: return Qmin.ToString(); + case 10: return MetrologicalClass; + case 11: return TemperatureClass.ToDescription(); + case 12: return PressureLossClass.ToDescription(); + case 13: return MaxAdmissiblePressure.ToDescription(); + case 14: return FlowProfileSensitivityClass.ToDescription(); + case 15: return ApprovalInfo; + case 16: return Certificate; + case 17: return PulsesPerLtr.ToString(); + case 18: return Text1; + case 19: return Text2; + case 20: return Text3; + case 21: return Text4; + case 22: return Text5; + + case 23: return (WaterTemp == Medium.HotWater) ? Medium.HotWater.ToDescription() : Medium.ColdWater.ToDescription(); /// "tepla" : "zimna"; + default: return string.Empty; + } + } + + public CfgUpdateFlags UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: ProductName = strValue; return CfgUpdateFlags.None; + case 1: Producer = strValue; return CfgUpdateFlags.None; + case 2: DN = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 3: L = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 4: + for (Mounting m = 0; m < Mounting.Count; m++) + { + if (m.ToDescription().Equals(strValue)) { Mounting = m; return CfgUpdateFlags.None; } + } + break; + case 5: NewQnames = strValue.Equals(Strings.yes); return CfgUpdateFlags.None; + case 6: Qmax = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 7: Qn = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 8: Qt = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 9: Qmin = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; + case 10: MetrologicalClass = strValue; return CfgUpdateFlags.None; + case 11: + for (TemperatureClass tc = 0; tc < TemperatureClass.Count; tc++) + { + if (tc.ToDescription().Equals(strValue)) { TemperatureClass = tc; return CfgUpdateFlags.None; } + } + break; + case 12: + for (PressureLossClass dp = 0; dp < PressureLossClass.Count; dp++) + { + if (dp.ToDescription().Equals(strValue)) { PressureLossClass = dp; return CfgUpdateFlags.None; } + } + break; + case 13: + for (MaxAdmissiblePressure map = 0; map < MaxAdmissiblePressure.Count; map++) + { + if (map.ToDescription().Equals(strValue)) { MaxAdmissiblePressure = map; return CfgUpdateFlags.None; } + } + break; + case 14: + for (FlowProfileSensitivityClass fps = 0; fps < FlowProfileSensitivityClass.Count; fps++) + { + if (fps.ToDescription().Equals(strValue)) { FlowProfileSensitivityClass = fps; return CfgUpdateFlags.None; } + } + break; + case 15: ApprovalInfo = strValue; return CfgUpdateFlags.None; + case 16: Certificate = strValue; return CfgUpdateFlags.None; + case 17: PulsesPerLtr = Utils.ParseUDouble(strValue); return CfgUpdateFlags.None; + case 18: Text1 = strValue; return CfgUpdateFlags.None; + case 19: Text2 = strValue; return CfgUpdateFlags.None; + case 20: Text3 = strValue; return CfgUpdateFlags.None; + case 21: Text4 = strValue; return CfgUpdateFlags.None; + case 22: Text5 = strValue; return CfgUpdateFlags.None; + + case 23: WaterTemp = strValue.Equals(Medium.HotWater.ToDescription()) ? Medium.HotWater : Medium.ColdWater; return CfgUpdateFlags.None; /// "tepla" + default: return CfgUpdateFlags.None; + } + + return CfgUpdateFlags.None; + } + + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + + double dummy; + switch (i) + { + case 0: /// ProductName + case 1: /// Producer + case 10: /// MetrologicalClass + case 15: /// ApprovalInfo + case 16: /// Certificate + case 18: /// Text1 + case 19: /// Text2 + case 20: /// Text3 + case 21: /// Text4 + case 22: /// Text5 + return true; + case 5: + if (strValue.Equals(Strings.yes) || strValue.Equals(Strings.no)) return true; + break; + case 2: /// DN + case 3: /// L + case 6: /// Qmax + case 7: /// Qn + case 8: /// Qt + case 9: /// Qmin + case 17: /// PulsesPerLtr + if (Utils.TryParseUDouble(strValue, out dummy)) return true; + break; + case 4: + for (Mounting tc = 0; tc < Mounting.Count; tc++) if (tc.ToDescription().Equals(strValue)) return true; + break; + case 11: + for (TemperatureClass tc = 0; tc < TemperatureClass.Count; tc++) if (tc.ToDescription().Equals(strValue)) return true; + break; + case 12: + for (PressureLossClass tc = 0; tc < PressureLossClass.Count; tc++) if (tc.ToDescription().Equals(strValue)) return true; + break; + case 13: + for (MaxAdmissiblePressure map = 0; map < MaxAdmissiblePressure.Count; map++) if (map.ToDescription().Equals(strValue)) return true; + break; + case 14: + for (FlowProfileSensitivityClass tc = 0; tc < FlowProfileSensitivityClass.Count; tc++) if (tc.ToDescription().Equals(strValue)) return true; + break; + case 23: + if (strValue.Equals(Medium.ColdWater.ToDescription()) || strValue.Equals(Medium.HotWater.ToDescription())) return true; /// "zimna", "tepla" + break; + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(ProcParams prms) + { + prms.ProductName = this.ProductName; + prms.Producer = this.Producer; + prms.DN = this.DN; + prms.L = this.L; + prms.Mounting = this.Mounting; + prms.NewQnames = this.NewQnames; + prms.Qmax = this.Qmax; + prms.Qn = this.Qn; + prms.Qt = this.Qt; + prms.Qmin = this.Qmin; + prms.MetrologicalClass = this.MetrologicalClass; + prms.TemperatureClass = this.TemperatureClass; + prms.PressureLossClass = this.PressureLossClass; + prms.MaxAdmissiblePressure = this.MaxAdmissiblePressure; + prms.FlowProfileSensitivityClass = this.FlowProfileSensitivityClass; + prms.ApprovalInfo = this.ApprovalInfo; + prms.Certificate = this.Certificate; + prms.PulsesPerLtr = this.PulsesPerLtr; + prms.Text1 = this.Text1; + prms.Text2 = this.Text2; + prms.Text3 = this.Text3; + prms.Text4 = this.Text4; + prms.Text5 = this.Text5; + + prms.WaterTemp = this.WaterTemp; + } + + public IParamsProvider Clone() + { + ProcParams pars = new ProcParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateFromDbEntity(ComponentProcedure dbEntity) + { + if (dbEntity == null) return; + try + { + ProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcParams; + + procedureParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + procedure = dbEntity.Procedure; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + /// + /// Parameterless constructor initializes the parameters + /// + public ProcParams() + { + } + + public ProcParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public ProcParams(ComponentProcedure procParamsEntity, string componentName, Procedure procedure) + { + this.procedureParamsEntity = procParamsEntity; + this.componentName = componentName; + this.procedure = procedure; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/WaterMeter/WaterMeter.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/WaterMeter/WaterMeter.cs new file mode 100644 index 00000000..5f79b799 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/WaterMeter/WaterMeter.cs @@ -0,0 +1,124 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using log4net; +using Config.Entities; + +namespace TBF.BenchControl.WaterMeters.WaterMeter +{ + /// + /// This component = instance of this class is a placeholder for a combined main watermeter + /// + public class WaterMeter : ComponentBase, GenericDevices.IWaterMeter + { + private static readonly ILog log = LogManager.GetLogger(typeof(WaterMeter)); + public override string ToString() { return string.Format("WaterMeter({0})", Cfg.ToString(1)); } + + readonly WaterMeterCfg waterMeterCfg; + + /// WaterMeter type (product name) and producer + public string ProductName { get { return waterMeterCfg.ProcParams.ProductName; } } + public string Producer { get { return waterMeterCfg.ProcParams.Producer; } } + + public double PulsesPerLtr { get { return waterMeterCfg.ProcParams.PulsesPerLtr; } } + + /// Pipe diameter [mm] + public float DN { get { return waterMeterCfg.ProcParams.DN; } } + + /// Build lenght [mm] + public float L { get { return waterMeterCfg.ProcParams.L; } } + + public Mounting Mounting { get { return waterMeterCfg.ProcParams.Mounting; } } + + /// Nominal water flow in [m3/h] + public bool NewQnames { get { return waterMeterCfg.ProcParams.NewQnames; } } + public float Q4_Qmax { get { return waterMeterCfg.ProcParams.Qmax; } } + public float Q3_Qn { get { return waterMeterCfg.ProcParams.Qn; } } + public float Q2_Qt { get { return waterMeterCfg.ProcParams.Qt; } } + public float Q1_Qmin { get { return waterMeterCfg.ProcParams.Qmin; } } + + /// Metrological class, etc + public string MetrologicalClass { get { return waterMeterCfg.ProcParams.MetrologicalClass; } } + public TemperatureClass TemperatureClass { get { return waterMeterCfg.ProcParams.TemperatureClass; } } + public PressureLossClass PressureLossClass { get { return waterMeterCfg.ProcParams.PressureLossClass; } } + public MaxAdmissiblePressure MaxAdmissiblePressure { get { return waterMeterCfg.ProcParams.MaxAdmissiblePressure; } } + public FlowProfileSensitivityClass FlowProfileSensitivityClass { get { return waterMeterCfg.ProcParams.FlowProfileSensitivityClass; } } + + /// WaterMeter approval information or signature + public string ApprovalInfo { get { return waterMeterCfg.ProcParams.ApprovalInfo; } } + public string Certificate { get { return waterMeterCfg.ProcParams.Certificate; } } + + public string Text1 { get { return waterMeterCfg.ProcParams.Text1; } } + public string Text2 { get { return waterMeterCfg.ProcParams.Text2; } } + public string Text3 { get { return waterMeterCfg.ProcParams.Text3; } } + public string Text4 { get { return waterMeterCfg.ProcParams.Text4; } } + public string Text5 { get { return waterMeterCfg.ProcParams.Text5; } } + + /// Water: cold / hot + public Config.Entities.Medium Medium { get { return waterMeterCfg.ProcParams.WaterTemp; } } + +#if IPERL + public ushort OriginalCalibFactor; + public ushort CalibFactor; + public double Q2ErrorWOCorrection; + public bool Q2CorrectionDone; + public double Q2Correction; + public int Q2CorrRFlow; + public int Q2CorrLFlow; + public double Diff2Hz8Hz; + public bool Hz2CorrectionDone; + public int Hz2CorrectionFactor; + public string FWVersion; +#endif + + /// Properties set by the Begin and the End form or the iPerl head + public string SerialNr + { + get { return serialNr; } + set { serialNr = value; } + } + string serialNr; + + public string EndState + { + get { return endState; } + set { endState = value; } + } + string endState; + + public string BeginState + { + get { return beginState; } + set { beginState = value; } + } + string beginState; + + public bool Disabled + { + get { return disabled; } + set { disabled = value; } + } + bool disabled; + + public WaterMeter() + { + ClearData(); + } + + public WaterMeter(Generic.IComponentCfg cfg) + : base(cfg) + { + ClearData(); + waterMeterCfg = cfg as WaterMeterCfg; + log.Debug(this.ToString()); + } + + public void ClearData() + { + serialNr = string.Empty; + endState = string.Empty; + beginState = string.Empty; + disabled = false; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/WaterMeter/WaterMeterCfg.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/WaterMeter/WaterMeterCfg.cs new file mode 100644 index 00000000..51de5ddb --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/WaterMeter/WaterMeterCfg.cs @@ -0,0 +1,43 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Xml.Serialization; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.WaterMeters.WaterMeter +{ + public class WaterMeterCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(WaterMeterCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl() { return new WaterMeterCfgCtrl(); } + + /// Procedure parameters + [XmlIgnore] + public ProcParams ProcParams; + public override IParamsProvider GetRuntimeProcParamsProvider() { return ProcParams; } + public override IParamsProvider CreateProcParamsProvider() { return new ProcParams(true); } + + /// Private parameterless constructor invoked by all other (public) constructors + WaterMeterCfg() + { + Name = "WM"; + ParentName = string.Empty; + ProcParams = CreateProcParamsProvider() as ProcParams; + } + + public WaterMeterCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}", Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/WaterMeter/WaterMeterCfgCtrl.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/WaterMeter/WaterMeterCfgCtrl.cs new file mode 100644 index 00000000..6aa728ba --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/WaterMeter/WaterMeterCfgCtrl.cs @@ -0,0 +1,71 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.BenchControl.WaterMeters.WaterMeter +{ + public partial class WaterMeterCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + WaterMeterCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as WaterMeterCfg; + Redraw(); + } + } + + public WaterMeterCfgCtrl() + { + InitializeComponent(); + } + + private void WaterMeterCfgCtrl_Load(object sender, EventArgs e) + { + nameLabel.Text = Strings.Name; + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + + return flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/WaterMeter/WaterMeterCfgCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/WaterMeter/WaterMeterCfgCtrl.designer.cs new file mode 100644 index 00000000..08107ced --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/WaterMeter/WaterMeterCfgCtrl.designer.cs @@ -0,0 +1,86 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.BenchControl.WaterMeters.WaterMeter +{ + partial class WaterMeterCfgCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(135, 55); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 5; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(25, 58); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 4; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(132, 31); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(60, 13); + this.classNameLabel.TabIndex = 3; + this.classNameLabel.Text = "ClassName"; + // + // WaterMeterCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "WaterMeterCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.WaterMeterCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/WaterMeter/WaterMeterCfgCtrl.resx b/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/WaterMeter/WaterMeterCfgCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/WaterMeter/WaterMeterCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/WaterMeter/WaterMeterFactory.cs b/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/WaterMeter/WaterMeterFactory.cs new file mode 100644 index 00000000..59bfa169 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchControl/WaterMeters/WaterMeter/WaterMeterFactory.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.WaterMeters.WaterMeter +{ + public class WaterMeterFactory : IComponentFactory + { + public string ClassName { get { return "WaterMeter"; } } + + public void ResetStaticProperties() { WaterMeter.ResetStaticProperties(); } + + public IComponent DummyComponent() { return new WaterMeter(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new WaterMeter(cfg); } + + public IComponentCfg DefaultConfig() { return new WaterMeterCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(WaterMeterCfg.Serializer, component, this); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/BenchesDlg.Designer.cs b/TBF_V2/Sources/TBF/TBF/BenchesDlg.Designer.cs new file mode 100644 index 00000000..12188a9f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchesDlg.Designer.cs @@ -0,0 +1,137 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF +{ + partial class BenchesDlg + { + /// + /// 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(BenchesDlg)); + this.okButton = new System.Windows.Forms.Button(); + this.cancelButton = new System.Windows.Forms.Button(); + this.testBenchesListBox = new System.Windows.Forms.ListBox(); + this.label1 = new System.Windows.Forms.Label(); + this.editButton = new System.Windows.Forms.Button(); + this.addButton = new System.Windows.Forms.Button(); + this.removeButton = new System.Windows.Forms.Button(); + this.copyButton = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // okButton + // + this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK; + this.okButton.ImageKey = global::TBF.Resources.Strings.Closing_the_tank; + resources.ApplyResources(this.okButton, "okButton"); + this.okButton.Name = "okButton"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // cancelButton + // + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cancelButton.ImageKey = global::TBF.Resources.Strings.Closing_the_tank; + resources.ApplyResources(this.cancelButton, "cancelButton"); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.UseVisualStyleBackColor = true; + this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click); + // + // testBenchesListBox + // + this.testBenchesListBox.FormattingEnabled = true; + resources.ApplyResources(this.testBenchesListBox, "testBenchesListBox"); + this.testBenchesListBox.Name = "testBenchesListBox"; + this.testBenchesListBox.DoubleClick += new System.EventHandler(this.testBenchesListBox_DoubleClick); + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.ImageKey = global::TBF.Resources.Strings.Closing_the_tank; + this.label1.Name = "label1"; + // + // editButton + // + resources.ApplyResources(this.editButton, "editButton"); + this.editButton.Name = "editButton"; + this.editButton.UseVisualStyleBackColor = true; + this.editButton.Click += new System.EventHandler(this.editButton_Click); + // + // addButton + // + resources.ApplyResources(this.addButton, "addButton"); + this.addButton.Name = "addButton"; + this.addButton.UseVisualStyleBackColor = true; + this.addButton.Click += new System.EventHandler(this.addButton_Click); + // + // removeButton + // + resources.ApplyResources(this.removeButton, "removeButton"); + this.removeButton.Name = "removeButton"; + this.removeButton.UseVisualStyleBackColor = true; + this.removeButton.Click += new System.EventHandler(this.removeButton_Click); + // + // copyButton + // + resources.ApplyResources(this.copyButton, "copyButton"); + this.copyButton.Name = "copyButton"; + this.copyButton.UseVisualStyleBackColor = true; + this.copyButton.Click += new System.EventHandler(this.copyButton_Click); + // + // BenchesDlg + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.copyButton); + this.Controls.Add(this.removeButton); + this.Controls.Add(this.addButton); + this.Controls.Add(this.editButton); + this.Controls.Add(this.label1); + this.Controls.Add(this.testBenchesListBox); + this.Controls.Add(this.okButton); + this.Controls.Add(this.cancelButton); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.MaximizeBox = false; + this.Name = "BenchesDlg"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Load += new System.EventHandler(this.BenchesDlg_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.ListBox testBenchesListBox; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button editButton; + private System.Windows.Forms.Button addButton; + private System.Windows.Forms.Button removeButton; + private System.Windows.Forms.Button copyButton; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchesDlg.cs b/TBF_V2/Sources/TBF/TBF/BenchesDlg.cs new file mode 100644 index 00000000..b2cc2389 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchesDlg.cs @@ -0,0 +1,203 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.Windows.Forms; +using TBF.Resources; + +namespace TBF +{ + /// + /// Dialog to edit local settings that specify database parameters (S1.2) + /// + public partial class BenchesDlg : Form + { + // Local copy of 'local settings' initialized to Program.localSettings. + // Dialog modifies this copy and updates Program.localSettings just + // when 'OK' is pressed. + LocalSettings localSettings; + + /// + /// Constructor, initializes the dialog + /// + public BenchesDlg() + { + Program.LocalSettings.Save(); + localSettings = LocalSettings.Load(Program.LocalSettingsFileName); + if (localSettings == null) throw new Exception("Cannot load local settings"); + + InitializeComponent(); + RedrawTestBenchesListBox(); + } + + private void BenchesDlg_Load(object sender, EventArgs e) + { + Text = Strings.Database_Settings; + label1.Text = Strings.Test_Benches_; + addButton.Text = Strings.AddBtnText; + copyButton.Text = Strings.CopyBtnText; + editButton.Text = Strings.EditBtnText; + removeButton.Text = Strings.RemoveBtnText; + okButton.Text = Strings.OkBtnText; + cancelButton.Text = Strings.CancelBtnText; + } + + void RedrawTestBenchesListBox() + { + testBenchesListBox.Items.Clear(); + if (localSettings.TestBenches != null) + { + int nrBenches = localSettings.TestBenches.GetLength(0); + for (int i = 0; i < nrBenches; i++) + { + testBenchesListBox.Items.Add(localSettings.TestBenches[i].BenchName); + } + } + } + + /// + /// Create a new test bench DB specification and append it to the list + /// + private void addButton_Click(object sender, EventArgs e) + { + Config.DatabaseSettings bench = new Config.DatabaseSettings(); + Forms.DatabaseSettingsDlg dlg = new Forms.DatabaseSettingsDlg(bench); + DialogResult dr = dlg.ShowDialog(); + if (dr == DialogResult.OK) + { + int nrBenches = + (localSettings.TestBenches == null) ? 0 : localSettings.TestBenches.GetLength(0); + + if (nrBenches == 0) + { + localSettings.TestBenches = new Config.DatabaseSettings[1]; + localSettings.TestBenches[0] = bench; + } + else + { + Config.DatabaseSettings[] newTestBenches = new Config.DatabaseSettings[nrBenches + 1]; + for (int i = 0; i < nrBenches; i++) + { + newTestBenches[i] = localSettings.TestBenches[i]; + } + newTestBenches[nrBenches] = bench; + localSettings.TestBenches = newTestBenches; + } + + testBenchesListBox.Items.Add(bench.BenchName); + } + } + + /// + /// Create a new test bench DB specification,which is a copy of the + /// selected bench, and append it to the list + /// + private void copyButton_Click(object sender, EventArgs e) + { + if (testBenchesListBox.SelectedIndex >= 0) + { + Config.DatabaseSettings ori = localSettings.TestBenches[testBenchesListBox.SelectedIndex]; + Config.DatabaseSettings bench = (Config.DatabaseSettings)ori.Clone(); + + Forms.DatabaseSettingsDlg dlg = new Forms.DatabaseSettingsDlg(bench); + DialogResult dr = dlg.ShowDialog(); + if (dr == DialogResult.OK) + { + int nrBenches = + (localSettings.TestBenches == null) ? 0 : localSettings.TestBenches.GetLength(0); + + Config.DatabaseSettings[] newTestBenches = new Config.DatabaseSettings[nrBenches + 1]; + for (int i = 0; i < nrBenches; i++) + { + newTestBenches[i] = localSettings.TestBenches[i]; + } + newTestBenches[nrBenches] = bench; + localSettings.TestBenches = newTestBenches; + + testBenchesListBox.Items.Add(bench.BenchName); + } + } + } + + /// + /// Edit selected test bench DB specification + /// + private void editButton_Click(object sender, EventArgs e) + { + if (testBenchesListBox.SelectedIndex >= 0) + { + Forms.DatabaseSettingsDlg dlg = new Forms.DatabaseSettingsDlg(localSettings.TestBenches[testBenchesListBox.SelectedIndex]); + DialogResult dr = dlg.ShowDialog(); + if (dr == DialogResult.OK) + { + // Update the item name + testBenchesListBox.Items[testBenchesListBox.SelectedIndex] = + localSettings.TestBenches[testBenchesListBox.SelectedIndex].BenchName; + } + } + } + + /// + /// Remove selected test bench DB specification from the list + /// + private void removeButton_Click(object sender, EventArgs e) + { + int selectedIx = testBenchesListBox.SelectedIndex; + if (selectedIx >= 0) + { + int nrBenches = + (localSettings.TestBenches == null) ? 0 : localSettings.TestBenches.GetLength(0); + + if (nrBenches == 1) + { + localSettings.TestBenches = null; + } + else + { + Config.DatabaseSettings[] newTestBenches = new Config.DatabaseSettings[nrBenches - 1]; + for (int i = 0; i < selectedIx; i++) + { + newTestBenches[i] = localSettings.TestBenches[i]; + } + for (int i = selectedIx + 1; i < nrBenches; i++) + { + newTestBenches[i - 1] = localSettings.TestBenches[i]; + } + localSettings.TestBenches = newTestBenches; + } + + RedrawTestBenchesListBox(); + } + } + + /// + /// Update setting, return 'OK' + /// + private void okButton_Click(object sender, EventArgs e) + { + Program.LocalSettings.TestBenches = localSettings.TestBenches; + Program.LocalSettings.Save(); + DialogResult = DialogResult.OK; + Close(); + return; + } + + /// + /// Throw away changes, return 'Cancel' + /// + private void cancelButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + return; + } + + /// + /// Double click on an item = edit item + /// + private void testBenchesListBox_DoubleClick(object sender, EventArgs e) + { + editButton_Click(sender, e); + } + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchesDlg.pl.resx b/TBF_V2/Sources/TBF/TBF/BenchesDlg.pl.resx new file mode 100644 index 00000000..adf7bda8 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchesDlg.pl.resx @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + OK + + + Anuluj + + + Stanowiska pomiarowe: + + + &Edytuj + + + &Dodaj + + + &Kasuj + + + &Kopiuj + + + Ustawienia bazy danych + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchesDlg.resx b/TBF_V2/Sources/TBF/TBF/BenchesDlg.resx new file mode 100644 index 00000000..741dc398 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchesDlg.resx @@ -0,0 +1,336 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + 344, 37 + + + 105, 28 + + + + 12 + + + OK + + + okButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 6 + + + 344, 71 + + + 105, 28 + + + 11 + + + Cancel + + + cancelButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 7 + + + 12, 37 + + + 164, 134 + + + 13 + + + testBenchesListBox + + + System.Windows.Forms.ListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 5 + + + True + + + 12, 15 + + + 79, 13 + + + 14 + + + Test Benches : + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + + + 192, 105 + + + 105, 28 + + + 15 + + + &Edit + + + editButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + 192, 37 + + + 105, 28 + + + 16 + + + &Add + + + addButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + 192, 139 + + + 105, 28 + + + 17 + + + &Remove + + + removeButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + 192, 71 + + + 105, 28 + + + 0 + + + &Copy + + + copyButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + + + 6, 13 + + + 459, 185 + + + + CenterParent + + + Database Settings + + + BenchesDlg + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/BenchesDlg.ru.resx b/TBF_V2/Sources/TBF/TBF/BenchesDlg.ru.resx new file mode 100644 index 00000000..35d434a8 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/BenchesDlg.ru.resx @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + OK + + + Отмена + + + Испытательные стенды : + + + &Редактировать + + + &Добавить + + + &Удалить + + + &Копировать + + + Настройки Базы данных + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Boxes/DoubleBox.cs b/TBF_V2/Sources/TBF/TBF/Boxes/DoubleBox.cs new file mode 100644 index 00000000..f59cb80e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Boxes/DoubleBox.cs @@ -0,0 +1,122 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.Boxes +{ + public class DoubleBox + { + /// Box value + private double val; + public double Val + { + get { return (valid ? val : 0); } + set { val = value; valid = true; } + } + + /// Box name + string name; + public string Name + { + get { return name; } + set { name = value; } + } + + /// Validity flag: true = the box value is valid + private bool valid = false; + public bool Valid + { + get { return valid; } + } + + /// Parameterless constructor + public DoubleBox() + { + } + + /// Constructor that initializes the value + public DoubleBox(double val) + { + this.Val = val; + } + + /// + /// Clear the box value and the valid flag + /// + public void Clear() + { + val = 0; + valid = false; + } + + /// + /// Specifies a conversion to a string. + /// In the most complex case the conversion is: + /// string.Format(FormatEx, val.ToString(Format)) + /// If the value is invalid, the conversion result is 'FormatInvalid'. + /// + public string Format = null; + public string FormatEx = "{0}"; + public string FormatInvalid = "---"; + public double Factor = 1.0; + public double LimitLo = double.MinValue; + public double LimitHi = double.MaxValue; + + /// + /// Converts the box value to a string representation + /// + public override string ToString() + { + if (!valid) + { + return FormatInvalid; + } + else if (Format == null) + { + return string.Format(FormatEx, Val * Factor); + } + else + { + return string.Format(FormatEx, (Val * Factor).ToString(Format)); + } + } + + /// + /// Validate the string representation of the box value + /// + /// String representation of the parameter + /// true = string is OK, false = string is wrong (see 'message') + public bool ValidateParam(string strVal) + { + float dummy; + return Utils.TryParseSFloat(strVal, out dummy) && + ((dummy / Factor) >= LimitLo) && + ((dummy / Factor) <= LimitHi); + } + + /// + /// Update the parameter from a string + /// + /// String representation of the box value + public void UpdateParam(string strVal) + { + try + { + Val = (double)Utils.ParseSFloat(strVal) / Factor; + } + catch { }; + } + + public DoubleBox Clone() + { + DoubleBox newDoubleBox = new DoubleBox(); + newDoubleBox.name = name; + newDoubleBox.val = val; + newDoubleBox.valid = valid; + newDoubleBox.Format = Format; + newDoubleBox.FormatInvalid = FormatInvalid; + newDoubleBox.FormatEx = FormatEx; + newDoubleBox.Factor = Factor; + return newDoubleBox; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Boxes/FloatBox.cs b/TBF_V2/Sources/TBF/TBF/Boxes/FloatBox.cs new file mode 100644 index 00000000..0e860445 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Boxes/FloatBox.cs @@ -0,0 +1,123 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.Boxes +{ + public class FloatBox : IBox + { + /// Box value + private float val; + public float Val + { + get { return (valid ? val : 0); } + set { val = value; valid = true; } + } + + /// Box name + string name; + public string Name + { + get { return name; } + set { name = value; } + } + + /// Validity flag: true = the box value is valid + private bool valid = false; + public bool Valid + { + get { return valid; } + } + + /// Parameterless constructor + public FloatBox() + { + } + + /// Constructor that initializes the value + public FloatBox(float val) + { + this.Val = val; + } + + /// + /// Clear the box value and the valid flag + /// + public void Clear() + { + val = 0; + valid = false; + } + + /// + /// Specifies a conversion to a string. + /// In the most complex case the conversion is: + /// string.Format(FormatEx, val.ToString(Format)) + /// If the value is invalid, the conversion result is 'FormatInvalid'. + /// + public string Format = null; /// Used as an argument of ToString.) function + public string FormatEx = "{0}"; /// Used as the first argument of string.Format(...), can be modified to contain units, etc. + public string FormatInvalid = "---"; + public float Factor = 1.0f; /// Factor is used when converting to/from string by ToString(), UpdateParam() and ValidateParam() + public float LimitLo = float.MinValue; + public float LimitHi = float.MaxValue; + + /// + /// Converts the box value to a string representation + /// + public override string ToString() + { + if (!valid) + { + return FormatInvalid; + } + else if (Format == null) + { + return string.Format(FormatEx, Val * Factor); + } + else + { + return string.Format(FormatEx, (Val * Factor).ToString(Format)); + } + } + + /// + /// Validate the string representation of the box value + /// + /// String representation of the parameter + /// true = string is OK, false = string is wrong (see 'message') + public bool ValidateParam(string strVal) + { + float dummy; + return Utils.TryParseSFloat(strVal, out dummy) && + ((dummy / Factor) >= LimitLo) && + ((dummy / Factor) <= LimitHi); + } + + /// + /// Update the parameter from a string + /// + /// String representation of the box value + public void UpdateParam(string strVal) + { + try + { + Val = Utils.ParseSFloat(strVal) / Factor; + } + catch { }; + } + + + public FloatBox Clone() + { + FloatBox newFloatBox = new FloatBox(); + newFloatBox.name = name; + newFloatBox.val = val; + newFloatBox.valid = valid; + newFloatBox.Format = Format; + newFloatBox.FormatInvalid = FormatInvalid; + newFloatBox.FormatEx = FormatEx; + newFloatBox.Factor = Factor; + return newFloatBox; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Boxes/IBox.cs b/TBF_V2/Sources/TBF/TBF/Boxes/IBox.cs new file mode 100644 index 00000000..2075a2a7 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Boxes/IBox.cs @@ -0,0 +1,44 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Text; + +namespace TBF.Boxes +{ + interface IBox + { + /// + /// Box name + /// + string Name { get; } + + /// + /// Validity flag: true = the box value is valid + /// + bool Valid { get; } + + /// + /// Clear the box value and the valid flag + /// + void Clear(); + + /// + /// Convert the box value to a string representation + /// + string ToString(); + + /// + /// Validate the string representation of the box value + /// + /// String representation of the parameter + /// true = string is OK, false = string is wrong (see 'message') + bool ValidateParam(string strVal); + + /// + /// Update the parameter from a string + /// + /// String representation of the box value + void UpdateParam(string strVal); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Boxes/IntBox.cs b/TBF_V2/Sources/TBF/TBF/Boxes/IntBox.cs new file mode 100644 index 00000000..bf02f31e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Boxes/IntBox.cs @@ -0,0 +1,121 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Text; +namespace TBF.Boxes +{ + public class IntBox : IBox + { + /// Box value + private int val; + public int Val + { + get { return (valid ? val : 0); } + set { val = value; valid = true; } + } + + /// Box name + private string name; + public string Name + { + get { return name; } + set { name = value; } + } + + /// Validity flag: true = the box value is valid + private bool valid = false; + public bool Valid + { + get { return valid; } + } + + /// Parameterless constructor + public IntBox() + { + } + + /// Constructor that initializes the value + public IntBox(int val) + { + this.Val = val; + } + + /// + /// Clear the box value and the valid flag + /// + public void Clear() + { + val = 0; + valid = false; + } + + /// + /// Specifies a conversion to a string. + /// In the most complex case the conversion is: + /// string.Format(FormatEx, val.ToString(Format)) + /// If the value is invalid, the conversion result is 'FormatInvalid'. + /// + public string Format = null; + public string FormatEx = "{0}"; + public string FormatInvalid = "---"; + public float LimitLo = int.MinValue; + public float LimitHi = int.MaxValue; + + /// + /// Converts the box value to a string representation + /// + public override string ToString() + { + if (!valid) + { + return FormatInvalid; + } + else if (Format == null) + { + return string.Format(FormatEx, Val); + } + else + { + return string.Format(FormatEx, Val.ToString(Format)); + } + } + + /// + /// Validates the string representation of the box value + /// + /// String representation of the parameter + /// true = string is OK, false = string is wrong (see 'message') + public bool ValidateParam(string strVal) + { + int dummy; + return int.TryParse(strVal, out dummy) && (dummy >= LimitLo) && (dummy <= LimitHi); + } + + /// + /// Update the parameter from a string + /// + /// String representation of the box value + public void UpdateParam(string strVal) + { + try + { + Val = int.Parse(strVal); + } + catch { }; + } + + + public IntBox Clone() + { + IntBox newFloatBox = new IntBox(); + newFloatBox.name = name; + newFloatBox.val = val; + newFloatBox.valid = valid; + newFloatBox.Format = Format; + newFloatBox.FormatInvalid = FormatInvalid; + newFloatBox.FormatEx = FormatEx; + return newFloatBox; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/CameraBinaryFiles/DiscoveryDaemon b/TBF_V2/Sources/TBF/TBF/CameraBinaryFiles/DiscoveryDaemon new file mode 100644 index 00000000..7185c212 Binary files /dev/null and b/TBF_V2/Sources/TBF/TBF/CameraBinaryFiles/DiscoveryDaemon differ diff --git a/TBF_V2/Sources/TBF/TBF/CameraBinaryFiles/GrabImage b/TBF_V2/Sources/TBF/TBF/CameraBinaryFiles/GrabImage new file mode 100644 index 00000000..d37ad5ac Binary files /dev/null and b/TBF_V2/Sources/TBF/TBF/CameraBinaryFiles/GrabImage differ diff --git a/TBF_V2/Sources/TBF/TBF/CameraBinaryFiles/JpegLib.so b/TBF_V2/Sources/TBF/TBF/CameraBinaryFiles/JpegLib.so new file mode 100644 index 00000000..d0585a10 Binary files /dev/null and b/TBF_V2/Sources/TBF/TBF/CameraBinaryFiles/JpegLib.so differ diff --git a/TBF_V2/Sources/TBF/TBF/CameraBinaryFiles/Measurement b/TBF_V2/Sources/TBF/TBF/CameraBinaryFiles/Measurement new file mode 100644 index 00000000..a7a0a4ca Binary files /dev/null and b/TBF_V2/Sources/TBF/TBF/CameraBinaryFiles/Measurement differ diff --git a/TBF_V2/Sources/TBF/TBF/CameraBinaryFiles/RoiDetection b/TBF_V2/Sources/TBF/TBF/CameraBinaryFiles/RoiDetection new file mode 100644 index 00000000..ce9892e0 Binary files /dev/null and b/TBF_V2/Sources/TBF/TBF/CameraBinaryFiles/RoiDetection differ diff --git a/TBF_V2/Sources/TBF/TBF/CameraBinaryFiles/VisionLib.so b/TBF_V2/Sources/TBF/TBF/CameraBinaryFiles/VisionLib.so new file mode 100644 index 00000000..fc463bf6 Binary files /dev/null and b/TBF_V2/Sources/TBF/TBF/CameraBinaryFiles/VisionLib.so differ diff --git a/TBF_V2/Sources/TBF/TBF/ComponentParametersDlg.Designer.cs b/TBF_V2/Sources/TBF/TBF/ComponentParametersDlg.Designer.cs new file mode 100644 index 00000000..b66cd93c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/ComponentParametersDlg.Designer.cs @@ -0,0 +1,89 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF +{ + partial class ComponentParametersDlg + { + /// + /// 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() + { + this.splitContainer = new System.Windows.Forms.SplitContainer(); + this.sharedButtons = new TBF.UiControls.SharedButtons(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit(); + this.splitContainer.Panel2.SuspendLayout(); + this.splitContainer.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer + // + this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.splitContainer.Location = new System.Drawing.Point(0, 0); + this.splitContainer.Name = "splitContainer"; + // + // splitContainer.Panel2 + // + this.splitContainer.Panel2.Controls.Add(this.sharedButtons); + this.splitContainer.Size = new System.Drawing.Size(559, 354); + this.splitContainer.SplitterDistance = 455; + this.splitContainer.TabIndex = 1; + // + // sharedButtons + // + this.sharedButtons.Location = new System.Drawing.Point(0, 0); + this.sharedButtons.Name = "sharedButtons"; + this.sharedButtons.Size = new System.Drawing.Size(100, 521); + this.sharedButtons.TabIndex = 0; + // + // ComponentParametersDlg + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(559, 354); + this.Controls.Add(this.splitContainer); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.HelpButton = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "ComponentParametersDlg"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Properties"; + this.Load += new System.EventHandler(this.ComponentCfgForm_Load); + this.splitContainer.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit(); + this.splitContainer.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer splitContainer; + private UiControls.SharedButtons sharedButtons; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/ComponentParametersDlg.cs b/TBF_V2/Sources/TBF/TBF/ComponentParametersDlg.cs new file mode 100644 index 00000000..faa92e34 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/ComponentParametersDlg.cs @@ -0,0 +1,141 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl; +using TBF.BenchControl.Generic; +using TBF.UiControls; +using TBF.Resources; + +namespace TBF +{ + public partial class ComponentParametersDlg : Form + { + public IComponentCfgCtrl ComponentCfgCtrl; + const int ComponentCfgCtrlHeight = 350; + const int ComponentCfgCtrlMoreHeight = 250; + + public IComponentCfg Config + { + get + { + if (ComponentCfgCtrl == null) return null; + return ComponentCfgCtrl.Config; + } + } + + public CfgUpdateFlags Flags; + public bool UnlockAfterStart; + + /// + /// List of components (=component configuration instances) + /// + public IList TbfComponents; + + public ComponentParametersDlg() + { + InitializeComponent(); + + Flags = CfgUpdateFlags.None; + + /// SharedDlgButtons configuration + sharedButtons.RequiredGroupMembership = global::Users.Grp.GID.Metrologists; + sharedButtons.MoreButtonTop = ComponentCfgCtrlHeight - 45; + sharedButtons.OptionalButtons = SharedButtons.Buttons.None; + sharedButtons.Unlocked += Unlock; + sharedButtons.OKClicked += okButton_Click; + sharedButtons.CancelClicked += cancelButton_Click; + sharedButtons.MoreClicked += moreButton_Click; + } + + private void ComponentCfgForm_Load(object sender, EventArgs e) + { + Text = Strings.Properties; + + if (ComponentCfgCtrl != null) + { + splitContainer.Panel1.Controls.Add((UserControl)ComponentCfgCtrl); + } + + if ((ComponentCfgCtrl != null) && ComponentCfgCtrl.ShowMore) + { + sharedButtons.OptionalButtons = SharedButtons.Buttons.More; + } + + if (UnlockAfterStart) + { + sharedButtons.UnlockButtons(); + ComponentCfgCtrl.Unlock(); + } + } + + /// + /// Handler of the Unlock button click + /// + private void Unlock(object sender, EventArgs e) + { + ComponentCfgCtrl.Unlock(); + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + if (ComponentCfgCtrl == null) return CfgUpdateFlags.None; /// Nothing to verify -> OK + return ComponentCfgCtrl.VerifyCfg(ref message); + } + + private void okButton_Click(object sender, EventArgs e) + { + string message = string.Empty; + CfgUpdateFlags flags = VerifyCfg(ref message); + if ((flags & CfgUpdateFlags.Error) == CfgUpdateFlags.Error) + { + MessageBox.Show(Strings.Please_change_the_following_settings + message, + Strings.Error, MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + if (ComponentCfgCtrl != null) + { + flags = ComponentCfgCtrl.UpdateCfg(); + + if ((flags & CfgUpdateFlags.RestartRqrd) == CfgUpdateFlags.RestartRqrd) + { + MessageBox.Show(Strings.Program_restart_is_required_to_apply_some_settings, + Strings.Warning, MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + ComponentCfgCtrl.Closing(); + } + + Flags = flags; + DialogResult = DialogResult.OK; + Close(); + return; + } + + private void cancelButton_Click(object sender, EventArgs e) + { + if (ComponentCfgCtrl != null) ComponentCfgCtrl.Closing(); + DialogResult = DialogResult.Cancel; + Close(); + return; + } + + private void moreButton_Click(object sender, EventArgs e) + { + ComponentCfgCtrl.Unlock(); + + if (sharedButtons.MoreActive) + { + Height = Height + ComponentCfgCtrlMoreHeight; + } + else + { + Height = Height - ComponentCfgCtrlMoreHeight; + } + return; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/ComponentParametersDlg.resx b/TBF_V2/Sources/TBF/TBF/ComponentParametersDlg.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/ComponentParametersDlg.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/ComponentsManagerDlg.Designer.cs b/TBF_V2/Sources/TBF/TBF/ComponentsManagerDlg.Designer.cs new file mode 100644 index 00000000..5fa4e924 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/ComponentsManagerDlg.Designer.cs @@ -0,0 +1,101 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF +{ + partial class ComponentsManagerDlg + { + /// + /// 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(ComponentsManagerDlg)); + this.splitContainer = new System.Windows.Forms.SplitContainer(); + this.listViewEx = new Results.Forms.ListViewEx(); + this.sharedButtons = new TBF.UiControls.SharedButtons(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit(); + this.splitContainer.Panel1.SuspendLayout(); + this.splitContainer.Panel2.SuspendLayout(); + this.splitContainer.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer + // + resources.ApplyResources(this.splitContainer, "splitContainer"); + this.splitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.splitContainer.Name = "splitContainer"; + // + // splitContainer.Panel1 + // + this.splitContainer.Panel1.Controls.Add(this.listViewEx); + // + // splitContainer.Panel2 + // + this.splitContainer.Panel2.Controls.Add(this.sharedButtons); + // + // listViewEx + // + this.listViewEx.AllowColumnReorder = true; + resources.ApplyResources(this.listViewEx, "listViewEx"); + this.listViewEx.DoubleClickActivation = false; + this.listViewEx.FullRowSelect = true; + this.listViewEx.GridLines = true; + this.listViewEx.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.listViewEx.HideSelection = false; + this.listViewEx.MultiSelect = false; + this.listViewEx.Name = "listViewEx"; + this.listViewEx.UseCompatibleStateImageBehavior = false; + this.listViewEx.View = System.Windows.Forms.View.Details; + this.listViewEx.SelectedIndexChanged += new System.EventHandler(this.componentsListView_SelectedIndexChanged); + this.listViewEx.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.listViewEx_MouseDoubleClick); + // + // sharedButtons + // + resources.ApplyResources(this.sharedButtons, "sharedButtons"); + this.sharedButtons.Name = "sharedButtons"; + // + // ComponentsManagerDlg + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.splitContainer); + this.Name = "ComponentsManagerDlg"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ComponentsManagerDlg_FormClosing); + this.Load += new System.EventHandler(this.ComponentsManagerDlg_Load); + this.splitContainer.Panel1.ResumeLayout(false); + this.splitContainer.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit(); + this.splitContainer.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private Results.Forms.ListViewEx listViewEx; + private System.Windows.Forms.SplitContainer splitContainer; + private UiControls.SharedButtons sharedButtons; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/ComponentsManagerDlg.cs b/TBF_V2/Sources/TBF/TBF/ComponentsManagerDlg.cs new file mode 100644 index 00000000..5c55449b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/ComponentsManagerDlg.cs @@ -0,0 +1,667 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// Author: Milan Hanajík +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.BenchControl; +using TBF.BenchControl.Generic; +using TBF.Resources; +using TBF.UiControls; + +namespace TBF +{ + public partial class ComponentsManagerDlg : Form, IParentOfListViewEx + { + static readonly ILog log = LogManager.GetLogger(typeof(ComponentsManagerDlg)); + + /// + /// List of components (=component configuration instances) + /// + IList cmpntEntities; + + IList toBeDeletedEntities; + + NHibernate.ISession session; + + SelectComponentClassDlg selectComponentTypeDlg; /// Constructed once, the selection is kept between dialog usages + + CfgUpdateFlags flags; /// Or-ed from particular Flags from ComponentParametersDlg + + /// + /// ListViewEx columns + /// + enum Column + { + Name, + ClassName, + ParentName, + DebugMode, + Logging, + Parameters, + ColumnsCount, + } + + /// Editors used by listViewEx + ComboBox debugCB; + ComboBox logCB; + + bool unlocked; + + public ComponentsManagerDlg() + { + toBeDeletedEntities = new List(); + + InitializeComponent(); + + flags = CfgUpdateFlags.None; + + selectComponentTypeDlg = new SelectComponentClassDlg(); + + /// SharedDlgButtons configuration + sharedButtons.RequiredGroupMembership = Users.Grp.GID.Administrators; + + sharedButtons.OptionalButtons = SharedButtons.Buttons.Add | + SharedButtons.Buttons.Remove | + SharedButtons.Buttons.Up | + SharedButtons.Buttons.Down | + SharedButtons.Buttons.Edit | + SharedButtons.Buttons.Copy | + SharedButtons.Buttons.Export | + SharedButtons.Buttons.Import; + sharedButtons.Unlocked += Unlocked; + sharedButtons.OKClicked += okButton_Click; + sharedButtons.CancelClicked += cancelButton_Click; + sharedButtons.AddClicked += addButton_Click; + sharedButtons.RemoveClicked += removeButton_Click; + sharedButtons.UpClicked += upButton_Click; + sharedButtons.DownClicked += downButton_Click; + sharedButtons.EditClicked += editButton_Click; + sharedButtons.CopyClicked += copyButton_Click; + sharedButtons.ExportClicked += exportButton_Click; + sharedButtons.ImportClicked += importButton_Click; + } + + private void ComponentsManagerDlg_Load(object sender, EventArgs e) + { + TBF.LocalSettings ls = Program.LocalSettings; + Width = (ls.ComponentsDlgWidth > 0) ? ls.ComponentsDlgWidth : 850; + Height = (ls.ComponentsDlgHeight > 0) ? ls.ComponentsDlgHeight : 500; + Left = (ls.ComponentsDlgLeft != 0) ? ls.ComponentsDlgLeft : 200; + Top = (ls.ComponentsDlgTop != 0) ? ls.ComponentsDlgTop : 100; + + Text = Strings.Test_Bench_Components_Configuration; + listViewEx.Columns.Add(Strings.Name, (ls.ComponentsColumnCount > 0) ? ls.ComponentsColumnWidths[0] : 80); + listViewEx.Columns.Add(Strings.Type, (ls.ComponentsColumnCount > 1) ? ls.ComponentsColumnWidths[1] : 120); + listViewEx.Columns.Add(Strings.Parent, (ls.ComponentsColumnCount > 2) ? ls.ComponentsColumnWidths[2] : 55); + listViewEx.Columns.Add(Strings.Mode, (ls.ComponentsColumnCount > 3) ? ls.ComponentsColumnWidths[3] : 55); + listViewEx.Columns.Add(Strings.Logging, (ls.ComponentsColumnCount > 4) ? ls.ComponentsColumnWidths[4] : 55); + listViewEx.Columns.Add(Strings.Parameters, (ls.ComponentsColumnCount > 5) ? ls.ComponentsColumnWidths[5] : 600); + + debugCB = new ComboBox(); + for (DebugMode level = 0; level < DebugMode.Count; level++) debugCB.Items.Add(level.ToDescription()); + splitContainer.Panel1.Controls.Add(debugCB); + + logCB = new ComboBox(); + for (LogLevel level = 0; level < LogLevel.Count; level++) logCB.Items.Add(level.ToDescription()); + splitContainer.Panel1.Controls.Add(logCB); + + listViewEx.SubItemClicked += new Results.Forms.SubItemEventHandler(listViewEx_SubItemClicked); + listViewEx.SubItemEndEditing += new Results.Forms.SubItemEndEditingEventHandler(listViewEx_SubItemEndEditing); + + sharedButtons.DisableButtons(UiControls.SharedButtons.Buttons.Remove | UiControls.SharedButtons.Buttons.Edit); + + session = Config.FluentCommon.CreateSession(Users.Entities.DBKind.Config); + cmpntEntities = session.QueryOver() + .OrderBy(x => x.ItemNr).Asc + .List(); + + RedrawAll(); + } + + void listViewEx_SubItemClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (unlocked && e.SubItem == (int)Column.DebugMode) + { + listViewEx.StartEditing(debugCB, e.Item, e.SubItem); + } + else if (unlocked && e.SubItem == (int)Column.Logging) + { + listViewEx.StartEditing(logCB, e.Item, e.SubItem); + } + } + + void listViewEx_SubItemEndEditing(object sender, Results.Forms.SubItemEndEditingEventArgs e) + { + Component cmpnt = (Component)e.Item.Tag; + + if (e.SubItem == (int)Column.DebugMode) + { + for (DebugMode level = 0; level < DebugMode.Count; level++) + { + if (debugCB.Text.Equals(level.ToDescription())) + { + cmpnt.Mode = level; + flags |= CfgUpdateFlags.RestartRqrd; + return; + } + } + e.DisplayText = cmpnt.Mode.ToString(); + } + else if (e.SubItem == (int)Column.Logging) + { + for (LogLevel level = 0; level < LogLevel.Count; level++) + { + if (logCB.Text.Equals(level.ToDescription())) + { + cmpnt.Logging = level; + flags |= CfgUpdateFlags.RestartRqrd; + return; + } + } + e.DisplayText = cmpnt.Logging.ToString(); + } + } + + private void Unlocked(object sender, EventArgs e) + { + unlocked = true; + + if (listViewEx.SelectedItems.Count == 1) + { + int ix = listViewEx.SelectedIndices[0]; + Focus(); + listViewEx.Items[ix].Selected = true; + listViewEx.Items[ix].EnsureVisible(); + } + } + + void RedrawAll() + { + listViewEx.Items.Clear(); + foreach (var cmpnt in cmpntEntities) DrawOne(cmpnt); + } + + void DrawOne(Component cmpnt) + { + ListViewItem lvi = new ListViewItem(cmpnt.Name); + lvi.Tag = cmpnt; + lvi.SubItems.Add(string.IsNullOrEmpty(cmpnt.ClassName) ? string.Empty : cmpnt.ClassName); + lvi.SubItems.Add(string.IsNullOrEmpty(cmpnt.ParentName) ? string.Empty : cmpnt.ParentName); + + IComponentCfg cmpCfg = TbfComponents.CmpntCfgFromCmpntEntity(cmpnt); + if (cmpCfg != null) + { + lvi.SubItems.Add(cmpCfg.DebugLevel.ToDescription()); + lvi.SubItems.Add(cmpCfg.LogLevel.ToDescription()); + lvi.SubItems.Add(cmpCfg.ToString(1)); + + } + else + { + lvi.SubItems.Add("---"); + lvi.SubItems.Add("---"); + lvi.SubItems.Add("Not a component"); + } + + listViewEx.Items.Add(lvi); + } + + /// + /// Save DB changes, return true when DB changes saved OK + /// + bool SaveDBChanges(NHibernate.ISession ses) + { + try + { + foreach (var cmpnt in toBeDeletedEntities) + { + Config.FluentCommon.DeleteFromDb(ses, cmpnt); + } + + int itemNr = 1; + foreach (var cmpnt in cmpntEntities) + { + cmpnt.ItemNr = itemNr++; + Config.FluentCommon.SaveToDb(ses, cmpnt); + } + ses.Flush(); + + return true; + } + catch (Exception exc) + { + log.ErrorFormat("Exception when saving components : {1}", exc.Message); + return false; + } + } + + /// + /// Save the dialog position and ListViewEx column widths + /// + void SaveUISettings() + { + Program.LocalSettings.ComponentsDlgLeft = Location.X; + Program.LocalSettings.ComponentsDlgTop = Location.Y; + Program.LocalSettings.ComponentsDlgWidth = Size.Width; + Program.LocalSettings.ComponentsDlgHeight = Size.Height; + Program.LocalSettings.Save(); + + /// Update the column widths + Program.LocalSettings.ComponentsColumnWidths = new int[(int)Column.ColumnsCount]; + for (int i = 0; i < (int)Column.ColumnsCount; i++) + { + Program.LocalSettings.ComponentsColumnWidths[i] = listViewEx.Columns[i].Width; + } + Program.LocalSettings.Save(); + } + + /// + /// OK + /// + private void okButton_Click(object sender, EventArgs e) + { + if ((flags & CfgUpdateFlags.AnyChange) != 0 || (flags & CfgUpdateFlags.RestartRqrd) != 0) + { + SaveDBChanges(session); + flags = CfgUpdateFlags.None; /// Changes saved + } + + SaveUISettings(); + + DialogResult = DialogResult.OK; + Close(); + return; + } + + /// Cancel + private void cancelButton_Click(object sender, EventArgs e) + { + SaveUISettings(); + + if ((flags & CfgUpdateFlags.AnyChange) != 0 || (flags & CfgUpdateFlags.RestartRqrd) != 0) + { + DialogResult dr = MessageBox.Show(Strings.Changes_will_be_lost_Do_you_want_to_proceed, + Strings.Warning, + MessageBoxButtons.YesNo, + MessageBoxIcon.Question); + if (dr != DialogResult.Yes) return; + } + + flags = CfgUpdateFlags.None; /// Abandoning changes confirmed + + DialogResult = DialogResult.Cancel; + Close(); + return; + } + + /// Add a new component + private void addButton_Click(object sender, EventArgs e) + { + selectComponentTypeDlg.SelectedScriptName = null; + DialogResult dialogRslt = selectComponentTypeDlg.ShowDialog(); + if (dialogRslt != DialogResult.OK) return; + + IComponentFactory factory = selectComponentTypeDlg.SlctdCmpntFactory; + IComponentCfg cfg = factory.DefaultConfig(); + if (selectComponentTypeDlg.SelectedScriptName == null) + { + IComponentCfgCtrl cfgControl = cfg.GetControl(); + cfgControl.Config = cfg; + cfgControl.Config.ItemNr = (cmpntEntities.Count > 0) ? (cmpntEntities[cmpntEntities.Count - 1].ItemNr + 1) : 1; + + ComponentParametersDlg cfgForm = new ComponentParametersDlg(); + cfgForm.TbfComponents = cmpntEntities; + cfgForm.ComponentCfgCtrl = cfgControl; + cfgForm.UnlockAfterStart = true; + dialogRslt = cfgForm.ShowDialog(); + if (dialogRslt != DialogResult.OK) return; + + flags |= CfgUpdateFlags.RestartRqrd; + AddOne(cfgForm.Config.CreateDbEntity()); + } + else + { + using (TextReader reader = new StreamReader(selectComponentTypeDlg.SelectedScriptName)) + { + int zeroBasedIdx = 0; + string line = reader.ReadLine(); + while (line != null) + { + line.Trim(); + if (line.Length > 0) + { + string[] words = line.Split(new char[] { ' ', '\t' }); + + if (UpdateCfg(ref cfg, words, ref zeroBasedIdx)) + { + flags |= CfgUpdateFlags.RestartRqrd; + AddOne(cfg.CreateDbEntity()); + } + + zeroBasedIdx++; + } + + line = reader.ReadLine(); + } + } + } + } + + void AddOne(Component cmpnt) + { + cmpntEntities.Add(cmpnt); + DrawOne(cmpnt); + } + + /// Delete the component + private void removeButton_Click(object sender, EventArgs e) + { + if (listViewEx.SelectedIndices.Count != 1) return; + int ix = listViewEx.SelectedIndices[0]; + if (ix < 0) return; + + Component selectedCmpnt = (Component)listViewEx.Items[ix].Tag; + if (selectedCmpnt.Id != 0) toBeDeletedEntities.Add(selectedCmpnt); + cmpntEntities.Remove(selectedCmpnt); + + flags |= CfgUpdateFlags.AnyChange; + + RedrawAll(); + } + + /// DoubleClick -> Edit the component + private void listViewEx_MouseDoubleClick(object sender, MouseEventArgs e) + { + editButton_Click(sender, e); + } + + /// Edit a component + private void editButton_Click(object sender, EventArgs e) + { + if (listViewEx.SelectedIndices.Count != 1) return; + ListViewItem lvi = listViewEx.SelectedItems[0]; + + IComponentCfg cfg = TbfComponents.CmpntCfgFromCmpntEntity((Component)lvi.Tag); + if (cfg != null) + { + ComponentParametersDlg cfgForm = new ComponentParametersDlg(); + cfgForm.TbfComponents = cmpntEntities; + cfgForm.ComponentCfgCtrl = cfg.GetControl(); + cfgForm.ComponentCfgCtrl.Config = cfg; + DialogResult dr = cfgForm.ShowDialog(); + if (dr != DialogResult.OK) return; + + flags |= cfgForm.Flags; + + sharedButtons.UnlockButtons(); /// Unlock this dialog buttons as changes were enabled + unlocked = true; /// in the ComponentParametersDlg. + + Component modified = cfgForm.Config.CreateDbEntity(); + Component original = (Component)lvi.Tag; + + original.Name = modified.Name; + original.ClassName = modified.ClassName; + original.ParentName = modified.ParentName; + original.Mode = modified.Mode; + original.Logging = modified.Logging; + original.Parameters = modified.Parameters; + + RedrawAll(); + } + } + + /// Copy a component + private void copyButton_Click(object sender, EventArgs e) + { + if (listViewEx.SelectedIndices.Count != 1) return; + ListViewItem lvi = listViewEx.SelectedItems[0]; + + IComponentCfg cfg = TbfComponents.CmpntCfgFromCmpntEntity((Component)lvi.Tag); + if (cfg != null) + { + cfg.Name += Strings.New_name_copy; + if (selectComponentTypeDlg.SelectedScriptName == null) + { + IComponentCfgCtrl cfgControl = cfg.GetControl(); + cfgControl.Config = cfg; + cfgControl.Config.ItemNr = (cmpntEntities.Count > 0) ? (cmpntEntities[cmpntEntities.Count - 1].ItemNr + 1) : 1; + + ComponentParametersDlg cfgForm = new ComponentParametersDlg(); + cfgForm.TbfComponents = cmpntEntities; + cfgForm.ComponentCfgCtrl = cfgControl; + cfgForm.UnlockAfterStart = true; + if (cfgForm.ShowDialog() != DialogResult.OK) return; + + flags |= CfgUpdateFlags.RestartRqrd; + AddOne(cfgForm.Config.CreateDbEntity()); + } + } + } + + /// Export a component to a file + private void exportButton_Click(object sender, EventArgs e) + { + if (listViewEx.SelectedIndices.Count != 1) return; + + Component component = listViewEx.SelectedItems[0].Tag as Component; + if (component == null) return; + + SaveFileDialog dlg = new SaveFileDialog(); + if (dlg.ShowDialog() == DialogResult.OK) + { + component.Export(new StreamWriter(dlg.FileName, false, System.Text.Encoding.UTF8)); + } + } + + /// Import a component form a file + private void importButton_Click(object sender, EventArgs e) + { + OpenFileDialog dlg = new OpenFileDialog(); + if (dlg.ShowDialog() != DialogResult.OK) return; + + /// Import a procedure from a file + Component newComponent = Component.Import(new StreamReader(dlg.FileName, System.Text.Encoding.UTF8)); + + IComponentCfg cfg = TbfComponents.CmpntCfgFromCmpntEntity(newComponent); + if (cfg != null) + { + IComponentCfgCtrl cfgControl = cfg.GetControl(); + cfgControl.Config = cfg; + cfgControl.Config.Name = cfgControl.Config.Name + " imported"; + cfgControl.Config.ItemNr = (cmpntEntities.Count > 0) ? (cmpntEntities[cmpntEntities.Count - 1].ItemNr + 1) : 1; + + ComponentParametersDlg cfgForm = new ComponentParametersDlg(); + cfgForm.TbfComponents = cmpntEntities; + cfgForm.ComponentCfgCtrl = cfgControl; + cfgForm.UnlockAfterStart = true; + if (cfgForm.ShowDialog() != DialogResult.OK) return; + + flags |= CfgUpdateFlags.RestartRqrd; + AddOne(cfgForm.Config.CreateDbEntity()); + } + } + + private void upButton_Click(object sender, EventArgs e) + { + if (listViewEx.SelectedIndices.Count != 1) return; + int ix = listViewEx.SelectedIndices[0]; + if (ix < 1) return; + + Component item1 = (Component)(listViewEx.Items[ix - 1].Tag); + Component item2 = (Component)(listViewEx.Items[ix].Tag); + (item1 as IHasItemNr).ItemNr++; + (item2 as IHasItemNr).ItemNr--; + cmpntEntities.RemoveAt(ix); + cmpntEntities.Insert(ix - 1, item2); + + flags |= CfgUpdateFlags.AnyChange; + + RedrawAll(); + + Focus(); + listViewEx.Items[ix - 1].Selected = true; + listViewEx.Items[ix - 1].EnsureVisible(); + } + + private void downButton_Click(object sender, EventArgs e) + { + if (listViewEx.SelectedIndices.Count != 1) return; + int ix = listViewEx.SelectedIndices[0]; + if (ix >= listViewEx.Items.Count - 1) return; + + Component item1 = (Component)(listViewEx.Items[ix].Tag); + Component item2 = (Component)(listViewEx.Items[ix + 1].Tag); + (item1 as IHasItemNr).ItemNr++; + (item2 as IHasItemNr).ItemNr--; + cmpntEntities.RemoveAt(ix + 1); + cmpntEntities.Insert(ix, item2); + + flags |= CfgUpdateFlags.AnyChange; + + RedrawAll(); + + Focus(); + listViewEx.Items[ix + 1].Selected = true; + listViewEx.Items[ix + 1].EnsureVisible(); + } + + private void componentsListView_SelectedIndexChanged(object sender, EventArgs e) + { + if (listViewEx.SelectedIndices.Count == 1) + { + sharedButtons.EnableButtons(UiControls.SharedButtons.Buttons.Remove | UiControls.SharedButtons.Buttons.Edit); + } + else + { + sharedButtons.DisableButtons(UiControls.SharedButtons.Buttons.Remove | UiControls.SharedButtons.Buttons.Edit); + } + } + + public void UpdateButtonStates(SharedButtons.SelectedItemPos selectedItemPos) + { + if (selectedItemPos == SharedButtons.SelectedItemPos.None) + { + sharedButtons.DisableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up | SharedButtons.Buttons.Down); + } + else if (selectedItemPos == SharedButtons.SelectedItemPos.First) + { + sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Down); + sharedButtons.DisableButtons(SharedButtons.Buttons.Up); + } + else if (selectedItemPos == SharedButtons.SelectedItemPos.Last) + { + sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up); + sharedButtons.DisableButtons(SharedButtons.Buttons.Down); + } + else if (selectedItemPos == SharedButtons.SelectedItemPos.FirstAndLast) + { + sharedButtons.EnableButtons(SharedButtons.Buttons.Remove); + sharedButtons.DisableButtons(SharedButtons.Buttons.Up | SharedButtons.Buttons.Down); + } + else + { + sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up | SharedButtons.Buttons.Down); + } + } + + private void ComponentsManagerDlg_FormClosing(object sender, FormClosingEventArgs e) + { + SaveUISettings(); + + if ((flags & CfgUpdateFlags.AnyChange) != 0 || (flags & CfgUpdateFlags.RestartRqrd) != 0) + { + DialogResult dr = MessageBox.Show(Strings.Do_you_want_to_save_changes, + Strings.Warning, + MessageBoxButtons.YesNo, + MessageBoxIcon.Question); + if (dr == DialogResult.Yes) + { + SaveDBChanges(session); + } + } + } + + + /// + /// Updates component configuration from a script file + /// + /// + /// + /// + /// true = udated component configuration should be saved, new component should be created + bool UpdateCfg(ref IComponentCfg cfg, string[] words, ref int zeroBasedIdx) + { + string name = words[words.Length - 1]; /// The last word is the component name + cfg.Name = name.Replace("#", (zeroBasedIdx + 1).ToString()); + + if (cfg is BenchControl.Elde.Valve.ValveCfg) + { + int bitNr = zeroBasedIdx; + if (words.Length >= 2 && words[0].StartsWith("D") && int.TryParse(words[0].Substring(1), out bitNr)) + { + zeroBasedIdx = bitNr; + } + + if (name != "-") + { + (cfg as BenchControl.Elde.Valve.ValveCfg).BitPosition = bitNr; + (cfg as BenchControl.Elde.Valve.ValveCfg).Category = + name.Contains("L") ? ValveCategory.Bench : + name.Contains("I") ? ValveCategory.Output : + name.Contains("Z") ? ValveCategory.Feeding : ValveCategory.None; + return true; + } + } + else if (cfg is BenchControl.Elde.FlowMeter.FlowMeterCfg) + { + (cfg as IChildComponentCfg).ParentName = "CB"; + (cfg as BenchControl.Elde.FlowMeter.FlowMeterCfg).Idx1 = zeroBasedIdx + 1; + return true; + } + else if (cfg is BenchControl.Elde.TempMeter.TempMeterCfg) + { + (cfg as IChildComponentCfg).ParentName = "CB"; + (cfg as BenchControl.Elde.TempMeter.TempMeterCfg).Idx0 = zeroBasedIdx; + return true; + } + else if (cfg is BenchControl.Elde.PressureMeter.PressureMeterCfg) + { + (cfg as IChildComponentCfg).ParentName = "CB"; + (cfg as BenchControl.Elde.PressureMeter.PressureMeterCfg).Idx0 = zeroBasedIdx; + return true; + } + else if (cfg is BenchControl.Elde.RegulValve.RegulValveCfg) + { + (cfg as IChildComponentCfg).ParentName = "CB"; + (cfg as BenchControl.Elde.RegulValve.RegulValveCfg).Idx1 = zeroBasedIdx + 1; + return true; + } + else if (cfg is BenchControl.Elde.RegisterReader.RegisterReaderCfg) + { + (cfg as IChildComponentCfg).ParentName = "CB"; + (cfg as BenchControl.Elde.RegisterReader.RegisterReaderCfg).Position = zeroBasedIdx + 1; + return true; + } + else if (cfg is BenchControl.Elde.FixedStartRegisterReader.RegisterReaderCfg) + { + (cfg as IChildComponentCfg).ParentName = "CB"; + return true; + } + else if (cfg is BenchControl.TestMethods.iPerlCommunication.iPerlHead.IperlHeadCfg) + { + return true; + } + else if (cfg is BenchControl.WaterMeters.WaterMeter.WaterMeterCfg) + { + return true; + } + + return false; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/ComponentsManagerDlg.pl.resx b/TBF_V2/Sources/TBF/TBF/ComponentsManagerDlg.pl.resx new file mode 100644 index 00000000..8c9c166d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/ComponentsManagerDlg.pl.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Konfiguracja komponentów stanowiska pomiarowego + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/ComponentsManagerDlg.resx b/TBF_V2/Sources/TBF/TBF/ComponentsManagerDlg.resx new file mode 100644 index 00000000..7aeeb31c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/ComponentsManagerDlg.resx @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + Fill + + + + True + + + + 0, 0 + + + Fill + + + 0, 0 + + + 520, 346 + + + 7 + + + listViewEx + + + Results.Forms.ListViewEx, Results, Version=2.12.475.0, Culture=neutral, PublicKeyToken=null + + + splitContainer.Panel1 + + + 0 + + + splitContainer.Panel1 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer + + + 0 + + + 1, 0 + + + 100, 521 + + + 0 + + + sharedButtons + + + TBF.UiControls.SharedButtons, TBF, Version=2.12.481.1, Culture=neutral, PublicKeyToken=null + + + splitContainer.Panel2 + + + 0 + + + splitContainer.Panel2 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer + + + 1 + + + 625, 346 + + + 520 + + + 8 + + + splitContainer + + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + + + 6, 13 + + + 625, 346 + + + CenterParent + + + Test Bench Components Configuration + + + ComponentsManagerDlg + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/ComponentsManagerDlg.ru.resx b/TBF_V2/Sources/TBF/TBF/ComponentsManagerDlg.ru.resx new file mode 100644 index 00000000..d25f0711 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/ComponentsManagerDlg.ru.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Конфигурация компонентов установки + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/CustomStyle.cs b/TBF_V2/Sources/TBF/TBF/CustomStyle.cs new file mode 100644 index 00000000..8f99d858 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/CustomStyle.cs @@ -0,0 +1,86 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace TBF +{ + /// + /// This static class maintains a set of text box styles at one place, it is then sufficient + /// to use the static method CustomStyle.Apply(id, textBox(es)) to apply this style to text box(es). + /// + public static class CustomStyle + { + const int setsCount = 20; /// Number of styles / attribute sets + + static DockStyle[] dockStyles; /// Docking style + static System.Drawing.Color[] backColors; /// Background color + static BorderStyle[] borderStyles; /// Border style + static bool[] readOnly; /// Read only + static System.Drawing.Font[] fonts; /// Font + + static CustomStyle() + { + dockStyles = new DockStyle[setsCount]; + backColors = new System.Drawing.Color[setsCount]; + borderStyles = new BorderStyle[setsCount]; + readOnly = new bool[setsCount]; + fonts = new System.Drawing.Font[setsCount]; + } + + /// + /// Set attributes of the set selected by 'set' parameter + /// + /// Attribute set ID + /// Docking style + /// Background color + /// true for read only (aka label) + /// Border style + public static void Set(int id, DockStyle dockStyle, System.Drawing.Color backColor, BorderStyle borderStyle, bool readOnly, System.Drawing.Font font) + { + if (id < 0 || id >= setsCount) return; + + CustomStyle.dockStyles[id] = dockStyle; + CustomStyle.backColors[id] = backColor; + CustomStyle.borderStyles[id] = borderStyle; + CustomStyle.readOnly[id] = readOnly; + CustomStyle.fonts[id] = font; + } + + /// + /// Apply one of the attribute sets to a TextBox instance + /// + public static void Apply(int id, TextBox textBox) + { + if (id < 0 || id >= setsCount) return; + + textBox.Dock = dockStyles[id]; + textBox.BackColor = backColors[id]; + textBox.BorderStyle = borderStyles[id]; + textBox.ReadOnly = readOnly[id]; + textBox.Font = fonts[id]; + } + + /// + /// Apply one of the attribute sets to a AttachedTextBoxes text boxes + /// + public static void Apply(int id, AttachedTextBoxes textBoxes) + { + if (id < 0 || id >= setsCount) return; + + for (int i = 0; i < textBoxes.Count; i++) + { + textBoxes[i].Dock = dockStyles[id]; + textBoxes[i].BackColor = backColors[id]; + textBoxes[i].BorderStyle = borderStyles[id]; + textBoxes[i].ReadOnly = readOnly[id]; + textBoxes[i].Font = fonts[id]; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/ErrorHandler.cs b/TBF_V2/Sources/TBF/TBF/ErrorHandler.cs new file mode 100644 index 00000000..58da41ff --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/ErrorHandler.cs @@ -0,0 +1,34 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using TBF.Forms; +using TBF.Resources; + +namespace TBF.ErrorHandler { + + public static class ErrorHandler + { + public static DialogResult HandleError(Exception e, string Message, string Origin) + { + + //catch (FluentNHibernate.Cfg.FluentConfigurationException fe) + // { + // string message; + // if (fe.InnerException != null) + // { + // message = fe.InnerException.Message; + // } + // else + // { + // message = fe.Message; + // } + // MessageBox.Show( message, "RetVal", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + + ErrorDlg dlg = new ErrorDlg(Strings.Unhandled_error_occured_in_ + Origin + Environment.NewLine + Message + Environment.NewLine + e.ToString() + Environment.NewLine + e.InnerException.ToString()); + dlg.ShowDialog(); + return dlg.returnvalue; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Forms/AboutDlg.Designer.cs b/TBF_V2/Sources/TBF/TBF/Forms/AboutDlg.Designer.cs new file mode 100644 index 00000000..b5268986 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/AboutDlg.Designer.cs @@ -0,0 +1,112 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.Forms +{ + partial class AboutDlg + { + /// + /// 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(AboutDlg)); + this.copyrightLabel = new System.Windows.Forms.Label(); + this.versionLabel = new System.Windows.Forms.Label(); + this.buildDateLabel = new System.Windows.Forms.Label(); + this.closeButton = new System.Windows.Forms.Button(); + this.logoPictureBox = new System.Windows.Forms.PictureBox(); + this.secureHashLabel = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).BeginInit(); + this.SuspendLayout(); + // + // copyrightLabel + // + resources.ApplyResources(this.copyrightLabel, "copyrightLabel"); + this.copyrightLabel.ImageKey = global::TBF.Resources.Strings.Closing_the_tank; + this.copyrightLabel.Name = "copyrightLabel"; + // + // versionLabel + // + resources.ApplyResources(this.versionLabel, "versionLabel"); + this.versionLabel.ImageKey = global::TBF.Resources.Strings.Closing_the_tank; + this.versionLabel.Name = "versionLabel"; + // + // buildDateLabel + // + resources.ApplyResources(this.buildDateLabel, "buildDateLabel"); + this.buildDateLabel.ImageKey = global::TBF.Resources.Strings.Closing_the_tank; + this.buildDateLabel.Name = "buildDateLabel"; + // + // closeButton + // + resources.ApplyResources(this.closeButton, "closeButton"); + this.closeButton.DialogResult = System.Windows.Forms.DialogResult.OK; + this.closeButton.ImageKey = global::TBF.Resources.Strings.Closing_the_tank; + this.closeButton.Name = "closeButton"; + this.closeButton.UseVisualStyleBackColor = true; + // + // logoPictureBox + // + this.logoPictureBox.BackgroundImage = global::TBF.Properties.Resources.sensus_logo; + resources.ApplyResources(this.logoPictureBox, "logoPictureBox"); + this.logoPictureBox.Name = "logoPictureBox"; + this.logoPictureBox.TabStop = false; + // + // secureHashLabel + // + resources.ApplyResources(this.secureHashLabel, "secureHashLabel"); + this.secureHashLabel.ImageKey = global::TBF.Resources.Strings.Closing_the_tank; + this.secureHashLabel.Name = "secureHashLabel"; + // + // AboutDlg + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.Window; + this.Controls.Add(this.secureHashLabel); + this.Controls.Add(this.logoPictureBox); + this.Controls.Add(this.closeButton); + this.Controls.Add(this.buildDateLabel); + this.Controls.Add(this.versionLabel); + this.Controls.Add(this.copyrightLabel); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Name = "AboutDlg"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label copyrightLabel; + private System.Windows.Forms.Label versionLabel; + private System.Windows.Forms.Label buildDateLabel; + private System.Windows.Forms.Button closeButton; + private System.Windows.Forms.PictureBox logoPictureBox; + private System.Windows.Forms.Label secureHashLabel; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Forms/AboutDlg.cs b/TBF_V2/Sources/TBF/TBF/Forms/AboutDlg.cs new file mode 100644 index 00000000..00ae6f9c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/AboutDlg.cs @@ -0,0 +1,40 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Security.Cryptography; +using System.Windows.Forms; +using TBF.Resources; + +namespace TBF.Forms +{ + /// + /// About dialog + /// + public partial class AboutDlg : Form + { + /// + /// Contsructor + /// + public AboutDlg() + { + InitializeComponent(); + + Text = Strings.About_Test_Bench_Framework; + copyrightLabel.Text = string.Format(Strings.CopyrightStr, DateTime.Now.Year); + versionLabel.Text = String.Format(Strings.VersionStr, Program.Version); + buildDateLabel.Text = String.Format(Strings.BuildDateStr, Program.BuildDateTime.ToShortDateString()); + closeButton.Text = Strings.CloseBtnText; + + byte[] sha1 = (new SHA1CryptoServiceProvider()).ComputeHash(Encoding.Default.GetBytes("nejaky text")); /// TODO: calculate SHA1 of real data + StringBuilder sb = new StringBuilder(); + foreach (byte oneByte in sha1) { sb.Append(oneByte.ToString("X2")); } + secureHashLabel.Text = string.Format("SHA1: {0}", sb); + } + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Forms/AboutDlg.pl.resx b/TBF_V2/Sources/TBF/TBF/Forms/AboutDlg.pl.resx new file mode 100644 index 00000000..0a9806f0 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/AboutDlg.pl.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Prawo autorskie © 2013 - 2015 + + + Wersja + + + Build date _BUILD_DATE_ + + + &Zamknąć + + + Zabezpieczenia + + + O Framework stanowiska + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Forms/AboutDlg.resx b/TBF_V2/Sources/TBF/TBF/Forms/AboutDlg.resx new file mode 100644 index 00000000..6a1409db --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/AboutDlg.resx @@ -0,0 +1,321 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + Top, Right + + + + True + + + + 270, 27 + + + 123, 13 + + + 4 + + + Copyright © 2013 - 2015 + + + copyrightLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 5 + + + Top, Right + + + True + + + 270, 48 + + + 105, 13 + + + 5 + + + Version _VERSION_ + + + versionLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + + + Top, Right + + + True + + + 270, 70 + + + 136, 13 + + + 6 + + + Build date _BUILD_DATE_ + + + buildDateLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + Top, Right + + + 452, 26 + + + 105, 35 + + + 11 + + + &Close + + + closeButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + Stretch + + + + + + 11, 12 + + + 244, 122 + + + 12 + + + logoPictureBox + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + Top, Right + + + True + + + NoControl + + + 270, 93 + + + 67, 13 + + + 13 + + + Secure hash + + + secureHashLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + + + 6, 13 + + + 580, 140 + + + CenterParent + + + About Test Bench Framework + + + AboutDlg + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Forms/AboutDlg.ru.resx b/TBF_V2/Sources/TBF/TBF/Forms/AboutDlg.ru.resx new file mode 100644 index 00000000..a4ebcf74 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/AboutDlg.ru.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Copyright © 2013 - 2015 + + + Version _VERSION_ + + + Build Дата _BUILD_Дата_ + + + &Закрыть + + + Secure hash + + + О Framework поверочной установки + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Forms/DatabaseSettingsDlg.Designer.cs b/TBF_V2/Sources/TBF/TBF/Forms/DatabaseSettingsDlg.Designer.cs new file mode 100644 index 00000000..ad78a78b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/DatabaseSettingsDlg.Designer.cs @@ -0,0 +1,258 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.Forms +{ + partial class DatabaseSettingsDlg + { + /// + /// 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(DatabaseSettingsDlg)); + this.okButton = new System.Windows.Forms.Button(); + this.cancelButton = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.benchNameTextBox = new System.Windows.Forms.TextBox(); + this.connectionStringLabel = new System.Windows.Forms.Label(); + this.configDbConnectionStringTextBox = new System.Windows.Forms.TextBox(); + this.resultsDbConnectionStringTextBox = new System.Windows.Forms.TextBox(); + this.configLabel = new System.Windows.Forms.Label(); + this.resultsLabel = new System.Windows.Forms.Label(); + this.realBenchCheckBox = new System.Windows.Forms.CheckBox(); + this.dbTypeLabel = new System.Windows.Forms.Label(); + this.configDbTypeComboBox = new System.Windows.Forms.ComboBox(); + this.resultsDbTypeComboBox = new System.Windows.Forms.ComboBox(); + this.testConnConfigDbBtn = new System.Windows.Forms.Button(); + this.testConnResultsDbBtn = new System.Windows.Forms.Button(); + this.createConfigDbBtn = new System.Windows.Forms.Button(); + this.createResultsDbBtn = new System.Windows.Forms.Button(); + this.createUsersDbBtn = new System.Windows.Forms.Button(); + this.testConnUsersDbBtn = new System.Windows.Forms.Button(); + this.usersDbTypeComboBox = new System.Windows.Forms.ComboBox(); + this.usersLabel = new System.Windows.Forms.Label(); + this.usersDbConnectionStringTextBox = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // okButton + // + this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK; + resources.ApplyResources(this.okButton, "okButton"); + this.okButton.Name = "okButton"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // cancelButton + // + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + resources.ApplyResources(this.cancelButton, "cancelButton"); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.UseVisualStyleBackColor = true; + this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click); + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // benchNameTextBox + // + resources.ApplyResources(this.benchNameTextBox, "benchNameTextBox"); + this.benchNameTextBox.Name = "benchNameTextBox"; + // + // connectionStringLabel + // + resources.ApplyResources(this.connectionStringLabel, "connectionStringLabel"); + this.connectionStringLabel.Name = "connectionStringLabel"; + // + // configDbConnectionStringTextBox + // + resources.ApplyResources(this.configDbConnectionStringTextBox, "configDbConnectionStringTextBox"); + this.configDbConnectionStringTextBox.Name = "configDbConnectionStringTextBox"; + // + // resultsDbConnectionStringTextBox + // + resources.ApplyResources(this.resultsDbConnectionStringTextBox, "resultsDbConnectionStringTextBox"); + this.resultsDbConnectionStringTextBox.Name = "resultsDbConnectionStringTextBox"; + // + // configLabel + // + resources.ApplyResources(this.configLabel, "configLabel"); + this.configLabel.Name = "configLabel"; + // + // resultsLabel + // + resources.ApplyResources(this.resultsLabel, "resultsLabel"); + this.resultsLabel.Name = "resultsLabel"; + // + // realBenchCheckBox + // + resources.ApplyResources(this.realBenchCheckBox, "realBenchCheckBox"); + this.realBenchCheckBox.Name = "realBenchCheckBox"; + this.realBenchCheckBox.UseVisualStyleBackColor = true; + // + // dbTypeLabel + // + resources.ApplyResources(this.dbTypeLabel, "dbTypeLabel"); + this.dbTypeLabel.Name = "dbTypeLabel"; + // + // configDbTypeComboBox + // + this.configDbTypeComboBox.FormattingEnabled = true; + resources.ApplyResources(this.configDbTypeComboBox, "configDbTypeComboBox"); + this.configDbTypeComboBox.Name = "configDbTypeComboBox"; + // + // resultsDbTypeComboBox + // + this.resultsDbTypeComboBox.FormattingEnabled = true; + resources.ApplyResources(this.resultsDbTypeComboBox, "resultsDbTypeComboBox"); + this.resultsDbTypeComboBox.Name = "resultsDbTypeComboBox"; + // + // testConnConfigDbBtn + // + this.testConnConfigDbBtn.DialogResult = System.Windows.Forms.DialogResult.Cancel; + resources.ApplyResources(this.testConnConfigDbBtn, "testConnConfigDbBtn"); + this.testConnConfigDbBtn.Name = "testConnConfigDbBtn"; + this.testConnConfigDbBtn.UseVisualStyleBackColor = true; + this.testConnConfigDbBtn.Click += new System.EventHandler(this.testConnConfigDbBtn_Click); + // + // testConnResultsDbBtn + // + this.testConnResultsDbBtn.DialogResult = System.Windows.Forms.DialogResult.Cancel; + resources.ApplyResources(this.testConnResultsDbBtn, "testConnResultsDbBtn"); + this.testConnResultsDbBtn.Name = "testConnResultsDbBtn"; + this.testConnResultsDbBtn.UseVisualStyleBackColor = true; + this.testConnResultsDbBtn.Click += new System.EventHandler(this.testConnResultsDbBtn_Click); + // + // createConfigDbBtn + // + this.createConfigDbBtn.DialogResult = System.Windows.Forms.DialogResult.Cancel; + resources.ApplyResources(this.createConfigDbBtn, "createConfigDbBtn"); + this.createConfigDbBtn.Name = "createConfigDbBtn"; + this.createConfigDbBtn.UseVisualStyleBackColor = true; + this.createConfigDbBtn.Click += new System.EventHandler(this.createConfigDbBtn_Click); + // + // createResultsDbBtn + // + this.createResultsDbBtn.DialogResult = System.Windows.Forms.DialogResult.Cancel; + resources.ApplyResources(this.createResultsDbBtn, "createResultsDbBtn"); + this.createResultsDbBtn.Name = "createResultsDbBtn"; + this.createResultsDbBtn.UseVisualStyleBackColor = true; + this.createResultsDbBtn.Click += new System.EventHandler(this.createResultsDbBtn_Click); + // + // createUsersDbBtn + // + this.createUsersDbBtn.DialogResult = System.Windows.Forms.DialogResult.Cancel; + resources.ApplyResources(this.createUsersDbBtn, "createUsersDbBtn"); + this.createUsersDbBtn.Name = "createUsersDbBtn"; + this.createUsersDbBtn.UseVisualStyleBackColor = true; + this.createUsersDbBtn.Click += new System.EventHandler(this.createUsersDbBtn_Click); + // + // testConnUsersDbBtn + // + this.testConnUsersDbBtn.DialogResult = System.Windows.Forms.DialogResult.Cancel; + resources.ApplyResources(this.testConnUsersDbBtn, "testConnUsersDbBtn"); + this.testConnUsersDbBtn.Name = "testConnUsersDbBtn"; + this.testConnUsersDbBtn.UseVisualStyleBackColor = true; + this.testConnUsersDbBtn.Click += new System.EventHandler(this.testConnUsersDbBtn_Click); + // + // usersDbTypeComboBox + // + this.usersDbTypeComboBox.FormattingEnabled = true; + resources.ApplyResources(this.usersDbTypeComboBox, "usersDbTypeComboBox"); + this.usersDbTypeComboBox.Name = "usersDbTypeComboBox"; + // + // usersLabel + // + resources.ApplyResources(this.usersLabel, "usersLabel"); + this.usersLabel.Name = "usersLabel"; + // + // usersDbConnectionStringTextBox + // + resources.ApplyResources(this.usersDbConnectionStringTextBox, "usersDbConnectionStringTextBox"); + this.usersDbConnectionStringTextBox.Name = "usersDbConnectionStringTextBox"; + // + // DatabaseSettingsDlg + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.createUsersDbBtn); + this.Controls.Add(this.testConnUsersDbBtn); + this.Controls.Add(this.usersDbTypeComboBox); + this.Controls.Add(this.usersLabel); + this.Controls.Add(this.usersDbConnectionStringTextBox); + this.Controls.Add(this.createResultsDbBtn); + this.Controls.Add(this.createConfigDbBtn); + this.Controls.Add(this.testConnResultsDbBtn); + this.Controls.Add(this.testConnConfigDbBtn); + this.Controls.Add(this.resultsDbTypeComboBox); + this.Controls.Add(this.configDbTypeComboBox); + this.Controls.Add(this.dbTypeLabel); + this.Controls.Add(this.realBenchCheckBox); + this.Controls.Add(this.resultsLabel); + this.Controls.Add(this.configLabel); + this.Controls.Add(this.resultsDbConnectionStringTextBox); + this.Controls.Add(this.configDbConnectionStringTextBox); + this.Controls.Add(this.connectionStringLabel); + this.Controls.Add(this.benchNameTextBox); + this.Controls.Add(this.label1); + this.Controls.Add(this.okButton); + this.Controls.Add(this.cancelButton); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.MinimizeBox = false; + this.Name = "DatabaseSettingsDlg"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Load += new System.EventHandler(this.BenchSettingsDlg_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox benchNameTextBox; + private System.Windows.Forms.Label connectionStringLabel; + private System.Windows.Forms.TextBox configDbConnectionStringTextBox; + private System.Windows.Forms.TextBox resultsDbConnectionStringTextBox; + private System.Windows.Forms.Label configLabel; + private System.Windows.Forms.Label resultsLabel; + private System.Windows.Forms.CheckBox realBenchCheckBox; + private System.Windows.Forms.Label dbTypeLabel; + private System.Windows.Forms.ComboBox configDbTypeComboBox; + private System.Windows.Forms.ComboBox resultsDbTypeComboBox; + private System.Windows.Forms.Button testConnConfigDbBtn; + private System.Windows.Forms.Button testConnResultsDbBtn; + private System.Windows.Forms.Button createConfigDbBtn; + private System.Windows.Forms.Button createResultsDbBtn; + private System.Windows.Forms.Button createUsersDbBtn; + private System.Windows.Forms.Button testConnUsersDbBtn; + private System.Windows.Forms.ComboBox usersDbTypeComboBox; + private System.Windows.Forms.Label usersLabel; + private System.Windows.Forms.TextBox usersDbConnectionStringTextBox; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Forms/DatabaseSettingsDlg.cs b/TBF_V2/Sources/TBF/TBF/Forms/DatabaseSettingsDlg.cs new file mode 100644 index 00000000..b3a528b2 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/DatabaseSettingsDlg.cs @@ -0,0 +1,226 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using TBF.Resources; + +namespace TBF.Forms +{ + /// + /// Dialog to process test bench name and database settings (BenchSettings) + /// + public partial class DatabaseSettingsDlg : Form + { + // Reference to bench DB settins (not a local copy) + Config.DatabaseSettings bench; + + /// + /// Constructor + /// + /// Test bench database settings + public DatabaseSettingsDlg(Config.DatabaseSettings bench) + { + this.bench = bench; + + InitializeComponent(); + } + + void Localize() + { + Text = Strings.Test_Bench_Databases_Specification; + label1.Text = Strings.Test_bench_name; + realBenchCheckBox.Text = Strings.Test_bench_is_controlled_by_this_computer; + dbTypeLabel.Text = Strings.Database_type; + connectionStringLabel.Text = Strings.Connection_string; + + configLabel.Text = Strings.Configuration; + resultsLabel.Text = Strings.Results; + usersLabel.Text = Strings.Users; + + testConnConfigDbBtn.Text = Strings.Test_connection; + testConnResultsDbBtn.Text = Strings.Test_connection; + testConnUsersDbBtn.Text = Strings.Test_connection; + + createConfigDbBtn.Text = Strings.Create_DB; + createResultsDbBtn.Text = Strings.Create_DB; + createUsersDbBtn.Text = Strings.Create_DB; + + okButton.Text = Strings.OkBtnText; + cancelButton.Text = Strings.CancelBtnText; + } + + private void BenchSettingsDlg_Load(object sender, EventArgs e) + { + Localize(); + + benchNameTextBox.Text = bench.BenchName; + realBenchCheckBox.Checked = bench.IsRealBench; + + /// Initialize 'Database type' combo-boxes + for (int i = 0; i < (int)Users.Entities.DBType.Count; i++) + { + Users.Entities.DBType dbType = (Users.Entities.DBType)i; + configDbTypeComboBox.Items.Add(dbType); + resultsDbTypeComboBox.Items.Add(dbType); + usersDbTypeComboBox.Items.Add(dbType); + } + configDbTypeComboBox.SelectedIndex = (int)bench.ProceduresDBSettings.DbType; + resultsDbTypeComboBox.SelectedIndex = (int)bench.WaterMetersDBSettings.DbType; + usersDbTypeComboBox.SelectedIndex = (int)bench.UsersDBSettings.DbType; + + /// Initialize connection strings + configDbConnectionStringTextBox.Text = bench.ProceduresDBSettings.ConnectionString; + resultsDbConnectionStringTextBox.Text = bench.WaterMetersDBSettings.ConnectionString; + usersDbConnectionStringTextBox.Text = bench.UsersDBSettings.ConnectionString; + } + + bool UpdateBenchFromUIControls() + { + /// TODO: The following code doesnot work as expected - error message shown! + //for (int i = 0; i < Program.LocalSettings.BenchesCount; i++) + //{ + // if (bench != Program.LocalSettings.TestBenches[i] && + // benchNameTextBox.Text == Program.LocalSettings.TestBenches[i].BenchName) + // { + // MessageBox.Show(Strings.Bench_name_conflict_Use_another_name_pls, Strings.Error, MessageBoxButtons.OK); + // return false; + // } + //} + + bench.BenchName = benchNameTextBox.Text; + bench.IsRealBench = realBenchCheckBox.Checked; + + bench.ProceduresDBSettings.ConnectionString = configDbConnectionStringTextBox.Text; + bench.WaterMetersDBSettings.ConnectionString = resultsDbConnectionStringTextBox.Text; + bench.UsersDBSettings.ConnectionString = usersDbConnectionStringTextBox.Text; + + bench.ProceduresDBSettings.DbType = (Users.Entities.DBType)configDbTypeComboBox.SelectedIndex; + bench.WaterMetersDBSettings.DbType = (Users.Entities.DBType)resultsDbTypeComboBox.SelectedIndex; + bench.UsersDBSettings.DbType = (Users.Entities.DBType)usersDbTypeComboBox.SelectedIndex; + + return true; + } + + /// + /// Update bench DB setting, return 'OK' + /// + /// Not used + /// Not used + private void okButton_Click(object sender, EventArgs e) + { + if (UpdateBenchFromUIControls()) + { + DialogResult = DialogResult.OK; + Close(); + return; + } + + DialogResult = DialogResult.None; + } + + /// + /// Throw away changes, return 'Cancel' + /// + /// Not used + /// Not used + private void cancelButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + private void createConfigDbBtn_Click(object sender, EventArgs e) + { + if (!UpdateBenchFromUIControls()) return; + + if (DialogResult.OK == MessageBox.Show(Strings.DB_will_be_overwritten + Environment.NewLine + + Strings.Do_you_want_to_proceed, Strings.Warning, + MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation)) + try + { + Cursor.Current = Cursors.WaitCursor; + Config.FluentCommon.CreateEmptyConfigDB(bench.ProceduresDBSettings.DbType, bench.ProceduresDBSettings.ConnectionString); + MessageBox.Show(Strings.DB_was_successfully_created, Strings.Notification); + Cursor.Current = Cursors.Default; + DialogResult = DialogResult.None; + } + catch (Exception exception) + { + Cursor.Current = Cursors.Default; + MessageBox.Show(Strings.Error_while_creating_DB_Reason + exception.Message, Strings.Error); + } + } + + private void createResultsDbBtn_Click(object sender, EventArgs e) + { + if (!UpdateBenchFromUIControls()) return; + + if (DialogResult.OK == MessageBox.Show(Strings.DB_will_be_overwritten + Environment.NewLine + + Strings.Do_you_want_to_proceed, Strings.Warning, + MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation)) + try + { + Cursor.Current = Cursors.WaitCursor; + Results.DB.DbType = bench.WaterMetersDBSettings.DbType; + Results.DB.ConnectionString = bench.WaterMetersDBSettings.ConnectionString; + Results.DB.CreateEmptyDB(); + MessageBox.Show(Strings.DB_was_successfully_created, Strings.Notification); + Cursor.Current = Cursors.Default; + DialogResult = DialogResult.None; + } + catch (Exception exception) + { + Cursor.Current = Cursors.Default; + string msg = Strings.Error_while_creating_DB_Reason + Environment.NewLine + exception.Message; + if (exception.InnerException != null) + { + msg += Environment.NewLine + exception.InnerException.Message; + } + MessageBox.Show(msg, Strings.Error, MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void createUsersDbBtn_Click(object sender, EventArgs e) + { + if (!UpdateBenchFromUIControls()) return; + + if (DialogResult.OK == MessageBox.Show(Strings.DB_will_be_overwritten + Environment.NewLine + + Strings.Do_you_want_to_proceed, Strings.Warning, + MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation)) + try + { + Cursor.Current = Cursors.WaitCursor; + Users.DB.DbType = bench.UsersDBSettings.DbType; + Users.DB.ConnectionString = bench.UsersDBSettings.ConnectionString; + Users.DB.CreateEmptyDB(); + MessageBox.Show(Strings.DB_was_successfully_created, Strings.Notification); + Cursor.Current = Cursors.Default; + DialogResult = DialogResult.None; + } + catch (Exception exception) + { + Cursor.Current = Cursors.Default; + string msg = Strings.Error_while_creating_DB_Reason + Environment.NewLine + exception.Message; + if (exception.InnerException != null) + { + msg += Environment.NewLine + exception.InnerException.Message; + } + MessageBox.Show(msg, Strings.Error, MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void testConnConfigDbBtn_Click(object sender, EventArgs e) + { + } + + private void testConnResultsDbBtn_Click(object sender, EventArgs e) + { + } + + private void testConnUsersDbBtn_Click(object sender, EventArgs e) + { + + } + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Forms/DatabaseSettingsDlg.resx b/TBF_V2/Sources/TBF/TBF/Forms/DatabaseSettingsDlg.resx new file mode 100644 index 00000000..17640030 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/DatabaseSettingsDlg.resx @@ -0,0 +1,693 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + 614, 15 + + + 225, 28 + + + + 14 + + + OK + + + okButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 20 + + + 614, 49 + + + 225, 28 + + + 13 + + + Cancel + + + cancelButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 21 + + + True + + + 12, 18 + + + 93, 13 + + + 15 + + + Test Bench Name + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 19 + + + 116, 15 + + + 315, 20 + + + 16 + + + benchNameTextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 18 + + + True + + + 199, 82 + + + 89, 13 + + + 18 + + + Connection string + + + connectionStringLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 17 + + + 202, 107 + + + 406, 20 + + + 20 + + + configDbConnectionStringTextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 16 + + + 202, 137 + + + 406, 20 + + + 22 + + + resultsDbConnectionStringTextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 15 + + + True + + + 12, 110 + + + 69, 13 + + + 49 + + + Configuration + + + configLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 14 + + + True + + + 12, 140 + + + 42, 13 + + + 51 + + + Results + + + resultsLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 13 + + + True + + + 116, 47 + + + 219, 17 + + + 54 + + + Test bench is controlled by this computer + + + realBenchCheckBox + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 12 + + + True + + + 113, 82 + + + 76, 13 + + + 55 + + + Database type + + + dbTypeLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 11 + + + 116, 107 + + + 80, 21 + + + 58 + + + configDbTypeComboBox + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 10 + + + 116, 137 + + + 80, 21 + + + 60 + + + resultsDbTypeComboBox + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 9 + + + + NoControl + + + 614, 105 + + + 95, 23 + + + 62 + + + Test Connection + + + testConnConfigDbBtn + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 8 + + + NoControl + + + 614, 135 + + + 95, 23 + + + 64 + + + Test Connection + + + testConnResultsDbBtn + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 7 + + + NoControl + + + 715, 104 + + + 124, 23 + + + 66 + + + Create DB + + + createConfigDbBtn + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 6 + + + NoControl + + + 715, 134 + + + 124, 23 + + + 68 + + + Create DB + + + createResultsDbBtn + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 5 + + + NoControl + + + 715, 164 + + + 124, 23 + + + 73 + + + Create DB + + + createUsersDbBtn + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + NoControl + + + 614, 165 + + + 95, 23 + + + 72 + + + Test Connection + + + testConnUsersDbBtn + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + 116, 167 + + + 80, 21 + + + 71 + + + usersDbTypeComboBox + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + True + + + NoControl + + + 12, 170 + + + 34, 13 + + + 70 + + + Users + + + usersLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + 202, 167 + + + 406, 20 + + + 69 + + + usersDbConnectionStringTextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + + + True + + + 6, 13 + + + 853, 202 + + + CenterParent + + + Test Bench Databases Specification + + + DatabaseSettingsDlg + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Forms/EmergencyStopForm.cs b/TBF_V2/Sources/TBF/TBF/Forms/EmergencyStopForm.cs new file mode 100644 index 00000000..0c4b3746 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/EmergencyStopForm.cs @@ -0,0 +1,60 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Drawing; +using System.Windows.Forms; +using TBF.Resources; + +namespace TBF.Forms +{ + public partial class EmergencyStopForm : Form + { + bool closingForm = false; + + /// + /// Parameterless constructor (does the localization) + /// + public EmergencyStopForm() + { + Visible = true; + InitializeComponent(); + + emergencyStopMsgLabel.Text = Strings.Emergency_STOP; + emergencyStopMsgLabel.Enabled = true; + emergencyStopMsgLabel.Visible = true; + + UiBridge.Bridge.EmergencyStopChangedHandler += delegate(object sender, UiBridge.EmergencyStopEventArgs args) + { + if (closingForm) return; + + if (InvokeRequired) + { + Invoke(new EventHandler(OnEmergencyStopStateChanged), sender, args); + } + else OnEmergencyStopStateChanged(sender, args); + }; + } + + void OnEmergencyStopStateChanged(Object sender, UiBridge.EmergencyStopEventArgs args) + { + if (args.EmergencyStopState == UiBridge.EmergencyStopEventArgs.State.CloseForm) + { + closingForm = true; + Close(); + } + //else if (args.EmergencyStopState == UiBridge.EmergencyStopEventArgs.State.Active) + //{ + // Visible = true; + // emergencyStopMsgLabel.Enabled = true; + // emergencyStopMsgLabel.Visible = true; + //} + //else if (args.EmergencyStopState == UiBridge.EmergencyStopEventArgs.State.Inactive) + //{ + // Visible = false; + // emergencyStopMsgLabel.Enabled = false; + // emergencyStopMsgLabel.Visible = false; + //} + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Forms/EmergencyStopForm.designer.cs b/TBF_V2/Sources/TBF/TBF/Forms/EmergencyStopForm.designer.cs new file mode 100644 index 00000000..12a7314b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/EmergencyStopForm.designer.cs @@ -0,0 +1,73 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.Forms +{ + partial class EmergencyStopForm + { + /// + /// 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() + { + this.emergencyStopMsgLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // emergencyStopMsgLabel + // + this.emergencyStopMsgLabel.AutoSize = true; + this.emergencyStopMsgLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.emergencyStopMsgLabel.ForeColor = System.Drawing.Color.Yellow; + this.emergencyStopMsgLabel.Location = new System.Drawing.Point(67, 86); + this.emergencyStopMsgLabel.Name = "emergencyStopMsgLabel"; + this.emergencyStopMsgLabel.Size = new System.Drawing.Size(287, 37); + this.emergencyStopMsgLabel.TabIndex = 1; + this.emergencyStopMsgLabel.Text = "Emergency STOP"; + // + // EmergencyStopForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.AutoSize = true; + this.BackColor = System.Drawing.Color.Red; + this.ClientSize = new System.Drawing.Size(412, 212); + this.Controls.Add(this.emergencyStopMsgLabel); + this.ForeColor = System.Drawing.Color.Transparent; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "EmergencyStopForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Emergency STOP"; + this.TopMost = true; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label emergencyStopMsgLabel; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Forms/EmergencyStopForm.resx b/TBF_V2/Sources/TBF/TBF/Forms/EmergencyStopForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/EmergencyStopForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Forms/ErrorDlg.Designer.cs b/TBF_V2/Sources/TBF/TBF/Forms/ErrorDlg.Designer.cs new file mode 100644 index 00000000..5df33d81 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/ErrorDlg.Designer.cs @@ -0,0 +1,110 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.Forms +{ + + partial class ErrorDlg + { + private string m_message; + + public string Message + { + get + { + return m_message; + } + + set + { + m_message = value; + textBoxMessage.Text = m_message; + } + } + + + /// + /// 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(ErrorDlg)); + this.btnCancel = new System.Windows.Forms.Button(); + this.btnIgnore = new System.Windows.Forms.Button(); + this.btnRetry = new System.Windows.Forms.Button(); + this.textBoxMessage = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // btnCancel + // + this.btnCancel.ImageKey = global::TBF.Resources.Strings.Closing_the_tank; + resources.ApplyResources(this.btnCancel, "btnCancel"); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.UseVisualStyleBackColor = true; + this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click); + // + // btnIgnore + // + this.btnIgnore.ImageKey = global::TBF.Resources.Strings.Closing_the_tank; + resources.ApplyResources(this.btnIgnore, "btnIgnore"); + this.btnIgnore.Name = "btnIgnore"; + this.btnIgnore.UseVisualStyleBackColor = true; + this.btnIgnore.Click += new System.EventHandler(this.btnIgnore_Click); + // + // btnRetry + // + this.btnRetry.ImageKey = global::TBF.Resources.Strings.Closing_the_tank; + resources.ApplyResources(this.btnRetry, "btnRetry"); + this.btnRetry.Name = "btnRetry"; + this.btnRetry.UseVisualStyleBackColor = true; + this.btnRetry.Click += new System.EventHandler(this.btnRetry_Click); + // + // textBoxMessage + // + resources.ApplyResources(this.textBoxMessage, "textBoxMessage"); + this.textBoxMessage.Name = "textBoxMessage"; + // + // ErrorDlg + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.textBoxMessage); + this.Controls.Add(this.btnRetry); + this.Controls.Add(this.btnIgnore); + this.Controls.Add(this.btnCancel); + this.Name = "ErrorDlg"; + this.Load += new System.EventHandler(this.ErrorDlg_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button btnCancel; + private System.Windows.Forms.Button btnIgnore; + private System.Windows.Forms.Button btnRetry; + private System.Windows.Forms.TextBox textBoxMessage; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Forms/ErrorDlg.cs b/TBF_V2/Sources/TBF/TBF/Forms/ErrorDlg.cs new file mode 100644 index 00000000..90e0be22 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/ErrorDlg.cs @@ -0,0 +1,65 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using TBF; +using TBF.ErrorHandler; +using TBF.Resources; + +namespace TBF.Forms +{ + public partial class ErrorDlg : Form + { + public DialogResult returnvalue; + + public ErrorDlg() + { + InitializeComponent(); + } + + public ErrorDlg(string ErrorDescription) + : this() + { + textBoxMessage.Text = ErrorDescription; + } + + private void ErrorDlg_Load(object sender, EventArgs e) + { + Text = Strings.An_unhandled_error_occured; + btnCancel.Text = Strings.CancelBtnText; + btnRetry.Text = Strings.RetryBtnText; + btnIgnore.Text = Strings.IgnoreBtnText; + } + + private void btnOk_Click(object sender, EventArgs e) + { + returnvalue = DialogResult.OK; + this.Close(); + } + + private void btnIgnore_Click(object sender, EventArgs e) + { + returnvalue = DialogResult.Ignore; + this.Close(); + } + + private void btnCancel_Click(object sender, EventArgs e) + { + returnvalue = DialogResult.Cancel; + this.Close(); + } + + private void btnRetry_Click(object sender, EventArgs e) + { + returnvalue = DialogResult.Retry; + this.Close(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Forms/ErrorDlg.resx b/TBF_V2/Sources/TBF/TBF/Forms/ErrorDlg.resx new file mode 100644 index 00000000..dd43299b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/ErrorDlg.resx @@ -0,0 +1,240 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + 187, 340 + + + 100, 23 + + + + 1 + + + Cancel + + + btnCancel + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + 399, 340 + + + 100, 23 + + + 1 + + + Ignore + + + btnIgnore + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + 293, 340 + + + 100, 23 + + + 1 + + + Retry + + + btnRetry + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + 12, 43 + + + True + + + + Vertical + + + 508, 280 + + + 2 + + + textBoxMessage + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + + + 6, 13 + + + 530, 375 + + + An unhandled Error occured + + + ErrorDlg + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Forms/LoginDlgWithBenchSelection.cs b/TBF_V2/Sources/TBF/TBF/Forms/LoginDlgWithBenchSelection.cs new file mode 100644 index 00000000..37bedd9d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/LoginDlgWithBenchSelection.cs @@ -0,0 +1,285 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.Windows.Forms; +using TBF.Resources; +using GemCard; +using System.Drawing; + + +namespace TBF.Forms +{ + /// + /// Provides login dialog that includes test bench selection. + /// It is used only once on program startup. Does not do authorisation + /// as User.users have not been loadded from the DB yet. + /// + public partial class LoginDlgWithBenchSelection : Form + { + public const string UseTheTagPassword = "UseTheTag0293578"; + + /// Private fields + string alias; + string password; + string benchName = null; + string legalizator; + + /// Smart card support, card S/N is used as user.Tag + GemCard.CardNative card; + string[] cardReaders; + string smartCardReader; + + /// Readonly public properties to do the authorization. + public string Alias { get { return alias; } } + public string Password { get { return password; } } + public string BenchName { get { return benchName; } } + public Users.Entities.LoginMethod Method; + public string Legalizator { get { return legalizator; } } + + /// + /// Constructor. + /// + public LoginDlgWithBenchSelection() + { + InitializeComponent(); + } + + /// + /// Constructor with a predefined bench. + /// + public LoginDlgWithBenchSelection(string predefinedBench) + : this() + { + benchName = predefinedBench; + +#if LANG_PL || BAHRAIN_50 + Height = 156; + EnableAndPrepareLegalizatorCombo(legalizatorComboBox); +#else + legalizator = string.Empty; +#endif + } + + /// + /// Load Legalizator order combo box items from the LocalSettings LastLegalizators array + /// + /// Legalizator ComboBox + void EnableAndPrepareLegalizatorCombo(ComboBox comboBox) + { + legalizatorLabel.Visible = true; + legalizatorComboBox.Visible = true; + legalizatorComboBox.Enabled = true; + + for (int i = 0; i < Program.LocalSettings.LastLegalizatorsCount; i++) + { + comboBox.Items.Add(Program.LocalSettings.LastLegalizators[i]); + } + + legalizator = (comboBox.Items.Count > 0) ? Program.LocalSettings.LastLegalizators[0] : string.Empty; + comboBox.Text = legalizator; + } + + + private void LoginDlgWithBenchSelection_Load(object sender, EventArgs e) + { + Localize(); +#if DEBUG + userNameTextBox.Text = "milan"; + passwordTextBox.Text = "kremik"; +#endif + for (int i = 0; i < Program.LocalSettings.BenchesCount; i++) + { + testBenchComboBox.Items.Add(Program.LocalSettings.TestBenches[i].BenchName); + if (benchName != null && benchName == Program.LocalSettings.TestBenches[i].BenchName) + { + testBenchComboBox.Text = benchName; + } + } + + smartCardReader = null; /// null = No smart card reader detected + +#if TURA_IPERL || TURA_SPECIAL + try + { + card = new CardNative(); + + /// Find NFC smart card reader + cardReaders = card.ListReaders(); + foreach (var crd in cardReaders) + { + if (crd.Contains("NFC")) + { + smartCardReader = crd; /// NFC smart card reader detected + break; + } + } + + if (!string.IsNullOrEmpty(smartCardReader)) + { + /// Reader found, initialize NFC smart card reader + + card.OnCardInserted += delegate(object sndr, CardInsertedEventArgs args) + { + if (InvokeRequired) { Invoke(new EventHandler(OnCardInserted), sndr, args); } + else OnCardInserted(sndr, args); + }; + + card.OnCardRemoved += delegate(object sndr, CardRemovedEventArgs args) + { + if (InvokeRequired) { Invoke(new EventHandler(OnCardRemoved), sndr, args); } + else OnCardRemoved(sndr, args); + }; + + card.StartCardEvents(smartCardReader); + + Text += " (NFC)"; + } + } + catch (Exception) + { + smartCardReader = null; + } +#endif + } + + void Localize() + { + Text = Strings.User_Login + " TBF v." + Program.Version; + aliasLabel.Text = GetAliasLabel(); + passwordLabel.Text = Strings.Password; + testBenchLabel.Text = Strings.Test_bench; + okButton.Text = Strings.OkBtnText; + cancelButton.Text = Strings.CancelBtnText; + legalizatorLabel.Text = Strings.Legalizator; + } + + string GetAliasLabel() + { + switch (Method) + { + default: + case Users.Entities.LoginMethod.UserName: return Strings.User_name; + case Users.Entities.LoginMethod.FullName: return Strings.Full_name; + case Users.Entities.LoginMethod.Number: return Strings.User_code; + } + } + + /// + /// OK clicked (authorization is done outside this dialog). + /// + + private void okButton_Click(object sender, EventArgs e) + { + if (testBenchComboBox.SelectedItem != null) + { + alias = userNameTextBox.Text; + password = passwordTextBox.Text; + benchName = testBenchComboBox.SelectedItem.ToString(); + if (legalizatorComboBox.Enabled) + { + legalizator = legalizatorComboBox.Text; + Program.LocalSettings.UpdateHistory(legalizator, ref Program.LocalSettings.LastLegalizators); + } + + DialogResult = DialogResult.OK; + Close(); + return; + } + else + { + MessageBox.Show(Strings.PLs_select_testbench, Strings.Warning, MessageBoxButtons.OK); + } + } + + /// + /// Cancel clicked. + /// + private void cancelButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + return; + } + + private void passwordTextBox_TextChanged(object sender, EventArgs e) + { + if (passwordTextBox.Text != "") + { + this.AcceptButton = okButton; + } + } + + private void userNameTextBox_KeyPress(object sender, KeyPressEventArgs e) + { + if (Convert.ToInt32(e.KeyChar) == 13) + { + passwordTextBox.Focus(); + } + } + + private void passwordTextBox_KeyPress(object sender, KeyPressEventArgs e) + { + if (Convert.ToInt32(e.KeyChar) == 13) + { + okButton_Click(sender, e); + } + } + + private void aliasLabel_Click(object sender, EventArgs e) + { + Method++; + if (Method == Users.Entities.LoginMethod.Count) + Method = 0; + aliasLabel.Text = GetAliasLabel(); + } + + + + void OnCardInserted(object sender, CardInsertedEventArgs args) + { + BackColor = Color.Green; + card.Connect(smartCardReader, SHARE.Shared, PROTOCOL.T0orT1); + + /// Read the serial number of the card + APDUResponse response = card.Transmit(new APDUCommand(0xFF, 0xCA, 0x00, 0x00, null, 7)); + string tag = response.ToString(); + + card.Disconnect(DISCONNECT.Leave); + + if (testBenchComboBox.SelectedItem != null) + { + alias = tag; + password = UseTheTagPassword; + benchName = testBenchComboBox.SelectedItem.ToString(); + if (legalizatorComboBox.Enabled) + { + legalizator = legalizatorComboBox.Text; + Program.LocalSettings.UpdateHistory(legalizator, ref Program.LocalSettings.LastLegalizators); + } + + DialogResult = DialogResult.OK; + Close(); + return; + } + else + { + MessageBox.Show(Strings.PLs_select_testbench, Strings.Warning, MessageBoxButtons.OK); + } + } + + + void OnCardRemoved(object sender, CardRemovedEventArgs args) + { + BackColor = SystemColors.Control; + } + + private void LoginDlgWithBenchSelection_FormClosing(object sender, FormClosingEventArgs e) + { + if (!string.IsNullOrEmpty(smartCardReader)) + { + card.StopCardEvents(); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Forms/LoginDlgWithBenchSelection.designer.cs b/TBF_V2/Sources/TBF/TBF/Forms/LoginDlgWithBenchSelection.designer.cs new file mode 100644 index 00000000..ad13c8c5 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/LoginDlgWithBenchSelection.designer.cs @@ -0,0 +1,151 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +namespace TBF.Forms +{ + partial class LoginDlgWithBenchSelection + { + /// + /// 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(LoginDlgWithBenchSelection)); + this.aliasLabel = new System.Windows.Forms.Label(); + this.passwordLabel = new System.Windows.Forms.Label(); + this.testBenchLabel = new System.Windows.Forms.Label(); + this.testBenchComboBox = new System.Windows.Forms.ComboBox(); + this.passwordTextBox = new System.Windows.Forms.TextBox(); + this.cancelButton = new System.Windows.Forms.Button(); + this.okButton = new System.Windows.Forms.Button(); + this.userNameTextBox = new System.Windows.Forms.TextBox(); + this.legalizatorComboBox = new System.Windows.Forms.ComboBox(); + this.legalizatorLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // aliasLabel + // + resources.ApplyResources(this.aliasLabel, "aliasLabel"); + this.aliasLabel.ImageKey = global::TBF.Resources.Strings.Closing_the_tank; + this.aliasLabel.Name = "aliasLabel"; + // + // passwordLabel + // + resources.ApplyResources(this.passwordLabel, "passwordLabel"); + this.passwordLabel.ImageKey = global::TBF.Resources.Strings.Closing_the_tank; + this.passwordLabel.Name = "passwordLabel"; + // + // testBenchLabel + // + resources.ApplyResources(this.testBenchLabel, "testBenchLabel"); + this.testBenchLabel.ImageKey = global::TBF.Resources.Strings.Closing_the_tank; + this.testBenchLabel.Name = "testBenchLabel"; + // + // testBenchComboBox + // + resources.ApplyResources(this.testBenchComboBox, "testBenchComboBox"); + this.testBenchComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.testBenchComboBox.FormattingEnabled = true; + this.testBenchComboBox.Name = "testBenchComboBox"; + // + // passwordTextBox + // + resources.ApplyResources(this.passwordTextBox, "passwordTextBox"); + this.passwordTextBox.Name = "passwordTextBox"; + this.passwordTextBox.UseSystemPasswordChar = true; + this.passwordTextBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.passwordTextBox_KeyPress); + // + // cancelButton + // + resources.ApplyResources(this.cancelButton, "cancelButton"); + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cancelButton.ImageKey = global::TBF.Resources.Strings.Closing_the_tank; + this.cancelButton.Name = "cancelButton"; + this.cancelButton.UseVisualStyleBackColor = true; + // + // okButton + // + resources.ApplyResources(this.okButton, "okButton"); + this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK; + this.okButton.ImageKey = global::TBF.Resources.Strings.Closing_the_tank; + this.okButton.Name = "okButton"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // userNameTextBox + // + resources.ApplyResources(this.userNameTextBox, "userNameTextBox"); + this.userNameTextBox.Name = "userNameTextBox"; + this.userNameTextBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.userNameTextBox_KeyPress); + // + // legalizatorComboBox + // + resources.ApplyResources(this.legalizatorComboBox, "legalizatorComboBox"); + this.legalizatorComboBox.FormattingEnabled = true; + this.legalizatorComboBox.Name = "legalizatorComboBox"; + // + // legalizatorLabel + // + resources.ApplyResources(this.legalizatorLabel, "legalizatorLabel"); + this.legalizatorLabel.ImageKey = global::TBF.Resources.Strings.Closing_the_tank; + this.legalizatorLabel.Name = "legalizatorLabel"; + // + // LoginDlgWithBenchSelection + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.legalizatorComboBox); + this.Controls.Add(this.legalizatorLabel); + this.Controls.Add(this.userNameTextBox); + this.Controls.Add(this.okButton); + this.Controls.Add(this.cancelButton); + this.Controls.Add(this.passwordTextBox); + this.Controls.Add(this.testBenchComboBox); + this.Controls.Add(this.testBenchLabel); + this.Controls.Add(this.passwordLabel); + this.Controls.Add(this.aliasLabel); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Name = "LoginDlgWithBenchSelection"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.LoginDlgWithBenchSelection_FormClosing); + this.Load += new System.EventHandler(this.LoginDlgWithBenchSelection_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label aliasLabel; + private System.Windows.Forms.Label passwordLabel; + private System.Windows.Forms.Label testBenchLabel; + private System.Windows.Forms.TextBox userNameTextBox; + private System.Windows.Forms.TextBox passwordTextBox; + private System.Windows.Forms.ComboBox testBenchComboBox; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.ComboBox legalizatorComboBox; + private System.Windows.Forms.Label legalizatorLabel; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Forms/LoginDlgWithBenchSelection.resx b/TBF_V2/Sources/TBF/TBF/Forms/LoginDlgWithBenchSelection.resx new file mode 100644 index 00000000..9ecdee9b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/LoginDlgWithBenchSelection.resx @@ -0,0 +1,411 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + True + + + + 11, 17 + + + 58, 13 + + + 0 + + + User name + + + aliasLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 9 + + + True + + + 11, 44 + + + 53, 13 + + + 1 + + + Password + + + passwordLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 8 + + + True + + + 11, 70 + + + 61, 13 + + + 2 + + + Test bench + + + testBenchLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 7 + + + + Top, Right + + + 148, 67 + + + 168, 21 + + + 5 + + + testBenchComboBox + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 6 + + + Top, Right + + + 148, 41 + + + 168, 20 + + + 4 + + + passwordTextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 5 + + + Top, Right + + + 334, 48 + + + 105, 28 + + + 7 + + + Cancel + + + cancelButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + + + Top, Right + + + 334, 14 + + + 105, 28 + + + 6 + + + OK + + + okButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + Top, Right + + + 148, 15 + + + 168, 20 + + + 3 + + + userNameTextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + Top, Right + + + 148, 95 + + + 168, 21 + + + 9 + + + False + + + legalizatorComboBox + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + + + NoControl + + + 11, 98 + + + 58, 13 + + + 8 + + + Legalizator + + + False + + + legalizatorLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + True + + + 6, 13 + + + 454, 102 + + + CenterScreen + + + User login + + + LoginDlgWithBenchSelection + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Forms/ModelessActivityForm.cs b/TBF_V2/Sources/TBF/TBF/Forms/ModelessActivityForm.cs new file mode 100644 index 00000000..7f25aa52 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/ModelessActivityForm.cs @@ -0,0 +1,89 @@ +using System; +using System.Drawing; +using System.Windows.Forms; +using TBF.UiBridge; + +namespace TBF.Forms +{ + public partial class ModelessActivityForm : Form + { + /// + /// Called from the state machine when an operation forces a modeless dialog close. + /// + public void CloseForm(object sender, EventArgs args) + { + if (CloseFormHandler == null) return; + try { CloseFormHandler(sender, null); } + catch (Exception) { } + } + public event EventHandler CloseFormHandler; + + + public string Title; + public string Message; + public Color BackgroundColor; + public Color TextColor; + public Font TextFont; + public string FontFamily; + public int FontSize; + public FontStyle FontStyle; + public bool StartActivityHandler; + + + /// + /// Constructor to be used by the application + /// + /// Window title + /// Displayed message + public ModelessActivityForm() + { + InitializeComponent(); + ControlBox = false; + + CloseFormHandler += delegate(object sender, EventArgs args) + { + if (InvokeRequired) { Invoke(new EventHandler(OnCloseForm), sender, args); } + else OnCloseForm(sender, args); + }; + } + + private void ModelessForm_Load(object sender, EventArgs e) + { + if (!string.IsNullOrEmpty(Title)) Text = Title; + if (!string.IsNullOrEmpty(Message)) label1.Text = Message; + if (BackgroundColor != null) BackColor = BackgroundColor; + if (TextColor != null) ForeColor = TextColor; + if (!string.IsNullOrEmpty(FontFamily)) + { + label1.Font = new Font(FontFamily, FontSize, FontStyle); + activityStatusLabel.Font = new Font(FontFamily, FontSize, FontStyle); + } + + float textWidth = Graphics.FromImage(new Bitmap(1, 1)).MeasureString(label1.Text, label1.Font).Width; + float textHeight = Graphics.FromImage(new Bitmap(1, 1)).MeasureString(label1.Text, label1.Font).Height; + Width = (int)textWidth + 120; /// Form width calculated from the text width + + if (StartActivityHandler) + { + Height += (int)textHeight; /// Form height calculated from the text width + + Bridge.ActivityHandler += delegate(object sndr, ActivityEventArgs args) + { + if (InvokeRequired) { Invoke(new EventHandler(OnActivity), sndr, args); } + else OnActivity(sndr, args); + }; + } + } + + void OnActivity(object sender, ActivityEventArgs args) + { + activityStatusLabel.Text = args.Activity; + } + + void OnCloseForm(object sender, EventArgs args) + { + DialogResult = DialogResult.Cancel; + Close(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Forms/ModelessActivityForm.designer.cs b/TBF_V2/Sources/TBF/TBF/Forms/ModelessActivityForm.designer.cs new file mode 100644 index 00000000..34ca1a52 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/ModelessActivityForm.designer.cs @@ -0,0 +1,74 @@ +namespace TBF.Forms +{ + partial class ModelessActivityForm + { + /// + /// 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() + { + this.label1 = new System.Windows.Forms.Label(); + this.activityStatusLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(64, 29); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(0, 13); + this.label1.TabIndex = 0; + // + // activityStatusLabel + // + this.activityStatusLabel.AutoSize = true; + this.activityStatusLabel.Location = new System.Drawing.Point(64, 85); + this.activityStatusLabel.Name = "activityStatusLabel"; + this.activityStatusLabel.Size = new System.Drawing.Size(0, 13); + this.activityStatusLabel.TabIndex = 1; + // + // ModelessActivityForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.OliveDrab; + this.ClientSize = new System.Drawing.Size(594, 101); + this.Controls.Add(this.activityStatusLabel); + this.Controls.Add(this.label1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.MinimizeBox = false; + this.Name = "ModelessActivityForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Load += new System.EventHandler(this.ModelessForm_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label activityStatusLabel; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Forms/ModelessActivityForm.resx b/TBF_V2/Sources/TBF/TBF/Forms/ModelessActivityForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/ModelessActivityForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Forms/NoBenchOrDatabaseDlg.Designer.cs b/TBF_V2/Sources/TBF/TBF/Forms/NoBenchOrDatabaseDlg.Designer.cs new file mode 100644 index 00000000..f60ec60a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/NoBenchOrDatabaseDlg.Designer.cs @@ -0,0 +1,136 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.Forms +{ + partial class NoBenchOrDatabaseDlg + { + /// + /// 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(NoBenchOrDatabaseDlg)); + this.exitButton = new System.Windows.Forms.Button(); + this.retryButton = new System.Windows.Forms.Button(); + this.configureButton = new System.Windows.Forms.Button(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.errorMessageLabel = new System.Windows.Forms.Label(); + this.upgradeButton = new System.Windows.Forms.Button(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.SuspendLayout(); + // + // exitButton + // + this.exitButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.exitButton.Location = new System.Drawing.Point(42, 68); + this.exitButton.Name = "exitButton"; + this.exitButton.Size = new System.Drawing.Size(388, 33); + this.exitButton.TabIndex = 0; + this.exitButton.Text = "Exit"; + this.exitButton.UseVisualStyleBackColor = true; + this.exitButton.Click += new System.EventHandler(this.exitButton_Click); + // + // retryButton + // + this.retryButton.Location = new System.Drawing.Point(42, 146); + this.retryButton.Name = "retryButton"; + this.retryButton.Size = new System.Drawing.Size(388, 33); + this.retryButton.TabIndex = 1; + this.retryButton.Text = "Retry database connection"; + this.retryButton.UseVisualStyleBackColor = true; + this.retryButton.Click += new System.EventHandler(this.retryButton_Click); + // + // configureButton + // + this.configureButton.Location = new System.Drawing.Point(42, 107); + this.configureButton.Name = "configureButton"; + this.configureButton.Size = new System.Drawing.Size(388, 33); + this.configureButton.TabIndex = 2; + this.configureButton.Text = "Configure test benches (password required)"; + this.configureButton.UseVisualStyleBackColor = true; + this.configureButton.Click += new System.EventHandler(this.configureButton_Click); + // + // pictureBox1 + // + this.pictureBox1.ErrorImage = ((System.Drawing.Image)(resources.GetObject("pictureBox1.ErrorImage"))); + this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image"))); + this.pictureBox1.InitialImage = null; + this.pictureBox1.Location = new System.Drawing.Point(42, 21); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(32, 32); + this.pictureBox1.TabIndex = 3; + this.pictureBox1.TabStop = false; + // + // errorMessageLabel + // + this.errorMessageLabel.AutoSize = true; + this.errorMessageLabel.Location = new System.Drawing.Point(80, 31); + this.errorMessageLabel.Name = "errorMessageLabel"; + this.errorMessageLabel.Size = new System.Drawing.Size(160, 13); + this.errorMessageLabel.TabIndex = 4; + this.errorMessageLabel.Text = "Cannot connect to the database"; + // + // upgradeButton + // + this.upgradeButton.Location = new System.Drawing.Point(42, 185); + this.upgradeButton.Name = "upgradeButton"; + this.upgradeButton.Size = new System.Drawing.Size(388, 33); + this.upgradeButton.TabIndex = 5; + this.upgradeButton.Text = "Upgrade the database"; + this.upgradeButton.UseVisualStyleBackColor = true; + this.upgradeButton.Click += new System.EventHandler(this.upgradeButton_Click); + // + // NoBenchOrDatabaseDlg + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.exitButton; + this.ClientSize = new System.Drawing.Size(466, 240); + this.Controls.Add(this.upgradeButton); + this.Controls.Add(this.errorMessageLabel); + this.Controls.Add(this.pictureBox1); + this.Controls.Add(this.configureButton); + this.Controls.Add(this.retryButton); + this.Controls.Add(this.exitButton); + this.Name = "NoBenchOrDatabaseDlg"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Error"; + this.Load += new System.EventHandler(this.NoDatabaseMsgDlg_Load); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button exitButton; + private System.Windows.Forms.Button retryButton; + private System.Windows.Forms.Button configureButton; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Label errorMessageLabel; + private System.Windows.Forms.Button upgradeButton; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Forms/NoBenchOrDatabaseDlg.cs b/TBF_V2/Sources/TBF/TBF/Forms/NoBenchOrDatabaseDlg.cs new file mode 100644 index 00000000..b33a7d8f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/NoBenchOrDatabaseDlg.cs @@ -0,0 +1,41 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using TBF.Resources; + +namespace TBF.Forms +{ + public partial class NoBenchOrDatabaseDlg : Form + { + public string Message; + public bool ShowRetry; + + public NoBenchOrDatabaseDlg() + { + InitializeComponent(); + } + + private void NoDatabaseMsgDlg_Load(object sender, EventArgs e) + { + Text = Strings.Error; + errorMessageLabel.Text = (Message != null) ? Message : Strings.Cannot_connect_to_the_database; + exitButton.Text = Strings.ExitBtnText; + retryButton.Text = Strings.RetryDatabaseText; + configureButton.Text = Strings.ConfigureDatabaseText; + if (!ShowRetry) retryButton.Enabled = false; + } + + private void exitButton_Click(object sender, EventArgs e) { DialogResult = DialogResult.Abort; } /// Exit + private void configureButton_Click(object sender, EventArgs e) { DialogResult = DialogResult.OK; } /// Configure test benches + private void retryButton_Click(object sender, EventArgs e) { DialogResult = DialogResult.Retry; } /// Retry connection to the database + private void upgradeButton_Click(object sender, EventArgs e) { DialogResult = DialogResult.Yes; } /// Upgrade the database + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Forms/NoBenchOrDatabaseDlg.resx b/TBF_V2/Sources/TBF/TBF/Forms/NoBenchOrDatabaseDlg.resx new file mode 100644 index 00000000..b753a857 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/NoBenchOrDatabaseDlg.resx @@ -0,0 +1,272 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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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 + QBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqF + BwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQ + RuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEB + AKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRR + eAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAA + aRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQe + AEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAa + hQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcA + kEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbh + AQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCk + UXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgA + AGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkU + HgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBA + GoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUH + AJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG + 4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEA + pFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4 + AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABp + FB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4A + QBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqF + BwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQ + RuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEB + AKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRR + eAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAA + aRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQe + AEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAa + hQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcA + kEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbh + AQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCk + UXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgA + AGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkU + HgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBA + GoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUH + AJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG + 4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEA + pFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4 + AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABp + FB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4A + QBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqF + BwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQ + RuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEB + AKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRR + eAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAA + Wc6d+2/gNp2ukwoN8QAAAABJRU5ErkJggg== + + + + + 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 + YUP1lbK+/k8KJ49ubHudCAAAAABJRU5ErkJggg== + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Forms/PreviousResultCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/Forms/PreviousResultCtrl.Designer.cs new file mode 100644 index 00000000..3cdac85e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/PreviousResultCtrl.Designer.cs @@ -0,0 +1,171 @@ +namespace TBF.Forms +{ + partial class PreviousResultCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.sendReloadButton = new System.Windows.Forms.Button(); + this.sentCheckBox = new System.Windows.Forms.CheckBox(); + this.failedCountLabel = new System.Windows.Forms.Label(); + this.passedCountLabel = new System.Windows.Forms.Label(); + this.purchaseOrderLabel = new System.Windows.Forms.Label(); + this.procedureLabel = new System.Windows.Forms.Label(); + this.endTimeLabel = new System.Windows.Forms.Label(); + this.startTimeLabel = new System.Windows.Forms.Label(); + this.batchNrLabel = new System.Windows.Forms.Label(); + this.showButton = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // sendReloadButton + // + this.sendReloadButton.Location = new System.Drawing.Point(832, 2); + this.sendReloadButton.Name = "sendReloadButton"; + this.sendReloadButton.Size = new System.Drawing.Size(104, 23); + this.sendReloadButton.TabIndex = 15; + this.sendReloadButton.Text = "Again"; + this.sendReloadButton.UseVisualStyleBackColor = true; + this.sendReloadButton.Click += new System.EventHandler(this.sendReloadButton_Click); + // + // sentCheckBox + // + this.sentCheckBox.AutoSize = true; + this.sentCheckBox.Location = new System.Drawing.Point(748, 6); + this.sentCheckBox.Name = "sentCheckBox"; + this.sentCheckBox.Size = new System.Drawing.Size(48, 17); + this.sentCheckBox.TabIndex = 14; + this.sentCheckBox.Text = "Sent"; + this.sentCheckBox.UseVisualStyleBackColor = true; + // + // failedCountLabel + // + this.failedCountLabel.AutoSize = true; + this.failedCountLabel.Location = new System.Drawing.Point(681, 7); + this.failedCountLabel.Name = "failedCountLabel"; + this.failedCountLabel.Size = new System.Drawing.Size(48, 13); + this.failedCountLabel.TabIndex = 13; + this.failedCountLabel.Text = "failedCnt"; + // + // passedCountLabel + // + this.passedCountLabel.AutoSize = true; + this.passedCountLabel.Location = new System.Drawing.Point(590, 7); + this.passedCountLabel.Name = "passedCountLabel"; + this.passedCountLabel.Size = new System.Drawing.Size(57, 13); + this.passedCountLabel.TabIndex = 12; + this.passedCountLabel.Text = "passedCnt"; + // + // purchaseOrderLabel + // + this.purchaseOrderLabel.AutoSize = true; + this.purchaseOrderLabel.Location = new System.Drawing.Point(481, 7); + this.purchaseOrderLabel.Name = "purchaseOrderLabel"; + this.purchaseOrderLabel.Size = new System.Drawing.Size(77, 13); + this.purchaseOrderLabel.TabIndex = 11; + this.purchaseOrderLabel.Text = "purchaseOrder"; + // + // procedureLabel + // + this.procedureLabel.AutoSize = true; + this.procedureLabel.Location = new System.Drawing.Point(328, 7); + this.procedureLabel.Name = "procedureLabel"; + this.procedureLabel.Size = new System.Drawing.Size(55, 13); + this.procedureLabel.TabIndex = 10; + this.procedureLabel.Text = "procedure"; + // + // endTimeLabel + // + this.endTimeLabel.AutoSize = true; + this.endTimeLabel.Location = new System.Drawing.Point(185, 7); + this.endTimeLabel.Name = "endTimeLabel"; + this.endTimeLabel.Size = new System.Drawing.Size(48, 13); + this.endTimeLabel.TabIndex = 9; + this.endTimeLabel.Text = "endTime"; + // + // startTimeLabel + // + this.startTimeLabel.AutoSize = true; + this.startTimeLabel.Location = new System.Drawing.Point(54, 7); + this.startTimeLabel.Name = "startTimeLabel"; + this.startTimeLabel.Size = new System.Drawing.Size(50, 13); + this.startTimeLabel.TabIndex = 8; + this.startTimeLabel.Text = "startTime"; + // + // batchNrLabel + // + this.batchNrLabel.AutoSize = true; + this.batchNrLabel.Location = new System.Drawing.Point(3, 7); + this.batchNrLabel.Name = "batchNrLabel"; + this.batchNrLabel.Size = new System.Drawing.Size(24, 13); + this.batchNrLabel.TabIndex = 16; + this.batchNrLabel.Text = "bNr"; + // + // showButton + // + this.showButton.Location = new System.Drawing.Point(939, 2); + this.showButton.Name = "showButton"; + this.showButton.Size = new System.Drawing.Size(104, 23); + this.showButton.TabIndex = 17; + this.showButton.Text = "Show"; + this.showButton.UseVisualStyleBackColor = true; + this.showButton.Click += new System.EventHandler(this.showButton_Click); + // + // PreviousResultCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.showButton); + this.Controls.Add(this.batchNrLabel); + this.Controls.Add(this.sendReloadButton); + this.Controls.Add(this.sentCheckBox); + this.Controls.Add(this.failedCountLabel); + this.Controls.Add(this.passedCountLabel); + this.Controls.Add(this.purchaseOrderLabel); + this.Controls.Add(this.procedureLabel); + this.Controls.Add(this.endTimeLabel); + this.Controls.Add(this.startTimeLabel); + this.Name = "PreviousResultCtrl"; + this.Size = new System.Drawing.Size(1048, 26); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button sendReloadButton; + private System.Windows.Forms.CheckBox sentCheckBox; + private System.Windows.Forms.Label failedCountLabel; + private System.Windows.Forms.Label passedCountLabel; + private System.Windows.Forms.Label purchaseOrderLabel; + private System.Windows.Forms.Label procedureLabel; + private System.Windows.Forms.Label endTimeLabel; + private System.Windows.Forms.Label startTimeLabel; + private System.Windows.Forms.Label batchNrLabel; + private System.Windows.Forms.Button showButton; + + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Forms/PreviousResultCtrl.cs b/TBF_V2/Sources/TBF/TBF/Forms/PreviousResultCtrl.cs new file mode 100644 index 00000000..338ff01c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/PreviousResultCtrl.cs @@ -0,0 +1,96 @@ +/// +/// Copyright (c) 2016-2017 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using TBF.Resources; + +namespace TBF.Forms +{ + public partial class PreviousResultCtrl : UserControl + { + readonly PreviousResultsDlg parent; + readonly bool reloadEn; + + public int BatchNr; + public DateTime StarTime; + public DateTime EndTime; + public string ProcedureName; + public string PurchaseOrder; + public int PassedCount; + public int FailedCount; + public bool Sent; + + protected PreviousResultCtrl() + { + InitializeComponent(); + } + + public PreviousResultCtrl(PreviousResultsDlg parent, int bnr, DateTime s, DateTime e, string proc, string pOrd, int passCnt, int failCnt, bool sent, bool reloadEn) + : this() + { + this.parent = parent; + this.reloadEn = reloadEn; + + BatchNr = bnr; + StarTime = s; + EndTime = e; + ProcedureName = proc; + PurchaseOrder = pOrd; + PassedCount = passCnt; + FailedCount = failCnt; + Sent = sent; + + batchNrLabel.Text = BatchNr.ToString(); + startTimeLabel.Text = string.Format("{0} {1}", StarTime.ToShortDateString(), StarTime.ToShortTimeString()); + endTimeLabel.Text = string.Format("{0} {1}", EndTime.ToShortDateString(), EndTime.ToShortTimeString()); + procedureLabel.Text = ProcedureName; + purchaseOrderLabel.Text = string.Format("{0}: {1}", Strings.PO, PurchaseOrder); + passedCountLabel.Text = string.Format("{0}: {1}", Strings.Passed, PassedCount); + failedCountLabel.Text = string.Format("{0}: {1}", Strings.Failed, FailedCount); + +#if MUNICH + sentCheckBox.Text = Strings.Printed; + sentCheckBox.Checked = Sent; + sendReloadButton.Enabled = true; /// 'Print again' function always available + sendReloadButton.Text = reloadEn ? Strings.Restore : Strings.Print_again; +#elif ORACLE_DB + sentCheckBox.Text = Strings.Sent; + sentCheckBox.Checked = Sent; + sendReloadButton.Enabled = reloadEn || !Sent; + sendReloadButton.Text = reloadEn ? Strings.Restore : Strings.Save_again; +#else + sentCheckBox.Visible = false; + sendReloadButton.Enabled = reloadEn; + sendReloadButton.Visible = reloadEn; + sendReloadButton.Text = Strings.Restore; +#endif + showButton.Text = Strings.Show; + } + + public void UpdateSentState(bool sent) + { + this.Sent = sent; +#if MUNICH + sentCheckBox.Checked = sent; + sendReloadButton.Enabled = true; +#elif ORACLE_DB + sentCheckBox.Checked = sent; + sendReloadButton.Enabled = !sent; +#endif + } + + private void sendReloadButton_Click(object sender, EventArgs e) + { + if (reloadEn) + parent.OnReload(this, new PreviousResultIdEventArgs(BatchNr)); + else + parent.OnSendAgain(this, new PreviousResultIdEventArgs(BatchNr)); + } + + private void showButton_Click(object sender, EventArgs e) + { + parent.OnShowResults(this, new PreviousResultIdEventArgs(BatchNr)); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Forms/PreviousResultCtrl.resx b/TBF_V2/Sources/TBF/TBF/Forms/PreviousResultCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/PreviousResultCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Forms/PreviousResultIdEventArgs.cs b/TBF_V2/Sources/TBF/TBF/Forms/PreviousResultIdEventArgs.cs new file mode 100644 index 00000000..9e78204d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/PreviousResultIdEventArgs.cs @@ -0,0 +1,14 @@ +using System; + +namespace TBF.Forms +{ + public class PreviousResultIdEventArgs : EventArgs + { + public int BatchNr; + + public PreviousResultIdEventArgs(int batchNr) + { + BatchNr = batchNr; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Forms/PreviousResultsDlg.Designer.cs b/TBF_V2/Sources/TBF/TBF/Forms/PreviousResultsDlg.Designer.cs new file mode 100644 index 00000000..efaf52c6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/PreviousResultsDlg.Designer.cs @@ -0,0 +1,78 @@ +namespace TBF.Forms +{ + partial class PreviousResultsDlg + { + /// + /// 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() + { + this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel(); + this.closeButton = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // flowLayoutPanel1 + // + this.flowLayoutPanel1.AutoScroll = true; + this.flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; + this.flowLayoutPanel1.Location = new System.Drawing.Point(0, 0); + this.flowLayoutPanel1.Name = "flowLayoutPanel1"; + this.flowLayoutPanel1.Size = new System.Drawing.Size(1073, 897); + this.flowLayoutPanel1.TabIndex = 0; + // + // closeButton + // + this.closeButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.closeButton.Location = new System.Drawing.Point(1079, 12); + this.closeButton.Name = "closeButton"; + this.closeButton.Size = new System.Drawing.Size(103, 37); + this.closeButton.TabIndex = 1; + this.closeButton.Text = "Close"; + this.closeButton.UseVisualStyleBackColor = true; + this.closeButton.Click += new System.EventHandler(this.closeButton_Click); + // + // PreviousResultsDlg + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.closeButton; + this.ClientSize = new System.Drawing.Size(1194, 892); + this.Controls.Add(this.closeButton); + this.Controls.Add(this.flowLayoutPanel1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.Name = "PreviousResultsDlg"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "Previous results"; + this.Load += new System.EventHandler(this.PreviousResultsDlg_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1; + private System.Windows.Forms.Button closeButton; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Forms/PreviousResultsDlg.cs b/TBF_V2/Sources/TBF/TBF/Forms/PreviousResultsDlg.cs new file mode 100644 index 00000000..0aa52af9 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/PreviousResultsDlg.cs @@ -0,0 +1,283 @@ +/// +/// Copyright (c) 2016-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using Results.Entities; +using NHibernate; +using log4net; +using TBF.Resources; +using TBF.BenchControl.DB.SensusOracle; +using Oracle.DataAccess.Client; + +namespace TBF.Forms +{ + public partial class PreviousResultsDlg : Form + { + static readonly ILog log = LogManager.GetLogger(typeof(PreviousResultsDlg)); + + ISession session; + int currentBatchNr; + IList batches; + bool reloadEn; + + + public PreviousResultsDlg(bool reloadEn) + { + InitializeComponent(); + this.reloadEn = reloadEn; + currentBatchNr = Program.LocalSettings.BatchNr; + + SendAgainHandler += delegate(object sndr, PreviousResultIdEventArgs args) + { + if (InvokeRequired) { Invoke(new EventHandler(DoSendAgain), sndr, args); } + else DoSendAgain(sndr, args); + }; + + ShowResultsHandler += delegate(object sndr, PreviousResultIdEventArgs args) + { + if (InvokeRequired) { Invoke(new EventHandler(DoShowResults), sndr, args); } + else DoShowResults(sndr, args); + }; + } + + public PreviousResultsDlg() + : this(false) + { + } + + + private void PreviousResultsDlg_Load(object sender, EventArgs e) + { + Localize(); + + session = Results.DB.CreateSession(); + + batches = session.QueryOver() + .WhereRestrictionOn(x => x.BatchNr) + .IsBetween(Math.Max(1, currentBatchNr - 25)) + .And(Math.Max(1, currentBatchNr - 1)) + .OrderBy(x => x.BatchNr).Asc + .List(); + + Redraw(); + } + + void Localize() + { + Text = Strings.Previous_results; + closeButton.Text = TBF.Resources.Strings.CloseBtnText; + } + + + + public void OnReload(object sender, PreviousResultIdEventArgs data) + { + foreach (var batch in batches) + { + if (batch.BatchNr == data.BatchNr) + { + TBF.UiBridge.Bridge.BatchNr = batch.BatchNr; + + Program.MainWnd.ReloadProcedureComboBoxItems(batch.ProcedureName); + TBF.UiBridge.Bridge.Ui2Bench(TBF.UiBridge.UI2BenchCmd.ReloadBatch); + break; + } + } + + DialogResult = DialogResult.Cancel; + Close(); + } + + + + public event EventHandler SendAgainHandler; + + /// + /// Called from PreviousResultCtrl when 'Send again' button pressed. + /// + public void OnSendAgain(object sender, PreviousResultIdEventArgs data) + { + if (SendAgainHandler == null) return; + try + { + SendAgainHandler(sender, data); + } + catch (Exception e) + { + log.Error("SendAgainHandler(...) failed", e); + } + } + + public void DoSendAgain(object sender, PreviousResultIdEventArgs data) + { + foreach (var b in batches) + { + if (b.BatchNr == data.BatchNr) + { +#if ORACLE_DB + //System.IO.StreamWriter logger; + //string fname = "C:\\TBF\\Logs\\test.log"; + //try { logger = new System.IO.StreamWriter(System.IO.File.Create(fname)); } + //catch + //{ + // logger = null; + // log.ErrorFormat("Was not able to open LU log file {0}", fname); + //} + //Database.WriteLogsToDisk(logger, b); + + using (ISession configSession = Config.FluentCommon.CreateSession(Users.Entities.DBKind.Config)) + { + IList cmpntEntities = configSession.QueryOver() + .OrderBy(x => x.ItemNr).Asc + .Where(x => (x.ClassName == "Sensus-Oracle-Database")) + .List(); + + if (cmpntEntities.Count == 0) + { + MessageBox.Show("Nepodarilo sa uložiť, neviem načítať nastavenia Oracle databázy", + Strings.Error, + MessageBoxButtons.OK, + MessageBoxIcon.Error); + return; + } + + TBF.BenchControl.DB.SensusOracle.DatabaseCfg cfg = TBF.BenchControl.ComponentCfgBase.CreateFromDbEntity(DatabaseCfg.Serializer, cmpntEntities[0], null) + as TBF.BenchControl.DB.SensusOracle.DatabaseCfg; + + MessageBox.Show(string.Format("Výsledky budú zapísané do '{0}' databázy", cfg.DBUsed), + Strings.Information, + MessageBoxButtons.OK, + MessageBoxIcon.Information); + + OracleConnection conn = (cfg.DBUsed == DBUsed.Production) + ? new OracleConnection("Data Source=STARA01.WORLD;User Id=deltachef;Password=deltachef;") + : new OracleConnection("Data Source=STARA_TEST.WORLD;User Id=deltachef;Password=deltachef;"); + + if (Database.WriteResultsToDatabase(conn, b, true) == Retv.OK) + { + b.RsltsSent = true; /// Result was successfully sent + session.SaveOrUpdate(b); /// Update MySQL DB + session.Flush(); + (sender as PreviousResultCtrl).Sent = true; /// Update UI + Redraw(); + } + } +#elif MUNICH + string docVersion = string.Empty; + foreach (var cmp in TBF.BenchControl.StateMachine.Components) + { + if (cmp.ClassName == "Output.Printers.Munich") + { + docVersion = (cmp as TBF.BenchControl.Output.Printers.Munich.Printer).Version; + break; + } + } + foreach (var wm in b.WaterMeters) + { + new Results.Output.Printers.Munich.MunichPrintDocument(docVersion, wm, Config.Entities.PageOrientation.Portrait).Print(); + } +#endif + } + } + } + + + public event EventHandler ShowResultsHandler; + + /// + /// Called from PreviousResultCtrl when 'Show' button pressed. + /// + public void OnShowResults(object sender, PreviousResultIdEventArgs data) + { + if (ShowResultsHandler == null) return; + try { ShowResultsHandler(sender, data); } + catch (Exception e) { log.Error("ShowResultsHandler(...) failed", e); } + } + + public void DoShowResults(object sender, PreviousResultIdEventArgs data) + { + Results.Forms.BatchResultsDlg dlg = new Results.Forms.BatchResultsDlg(); + dlg.PopupResultsLeft = Program.LocalSettings.PopupResultsLeft; + dlg.PopupResultsTop = Program.LocalSettings.PopupResultsTop; + dlg.PopupResultsWidth = Program.LocalSettings.PopupResultsWidth; + dlg.PopupResultsHeight = Program.LocalSettings.PopupResultsHeight; + + dlg.MetersArrangement = Program.LocalSettings.ResultsConfigMeters; + dlg.TestsArrangement = Program.LocalSettings.ResultsConfigTests; + dlg.NrMetersInOneGroup = Math.Max(1, Program.LocalSettings.ResultsConfigMetersInOneGroup); + + dlg.RsltItems_Screen_SingleWM = Results.WMeterRsltItemSpec.FromStrArray(Program.LocalSettings.RsltItems_Screen_SingleWM); + dlg.RsltItems_Screen_CombinedWM = Results.WMeterRsltItemSpec.FromStrArray(Program.LocalSettings.RsltItems_Screen_CombinedWM); + dlg.RsltItems_Screen_HeatM = Results.WMeterRsltItemSpec.FromStrArray(Program.LocalSettings.RsltItems_Screen_HeatM); + dlg.RsltsClmnWidths = Program.LocalSettings.RsltsClmnWidths; + + foreach (var b in batches) + { + if (b.BatchNr == data.BatchNr) + { + dlg.Results = Results.BatchResults.FromBatch(b); + dlg.Text = string.Format(Strings.Results_of_batch_0, b.BatchNr); + dlg.Show(); + break; + } + } + + //if (dlg.PopupResultsLeft != Program.LocalSettings.PopupResultsLeft || + // dlg.PopupResultsTop != Program.LocalSettings.PopupResultsTop || + // dlg.PopupResultsWidth != Program.LocalSettings.PopupResultsWidth || + // dlg.PopupResultsHeight != Program.LocalSettings.PopupResultsHeight) + //{ + // Program.LocalSettings.PopupResultsLeft = dlg.PopupResultsLeft; + // Program.LocalSettings.PopupResultsTop = dlg.PopupResultsTop; + // Program.LocalSettings.PopupResultsWidth = dlg.PopupResultsWidth; + // Program.LocalSettings.PopupResultsHeight = dlg.PopupResultsHeight; + // Program.LocalSettings.Save(); + //} + } + + + void Redraw() + { + SuspendLayout(); + + flowLayoutPanel1.FlowDirection = FlowDirection.TopDown; + flowLayoutPanel1.Controls.Clear(); + + if (batches == null || batches.Count == 0) return; + + foreach (var b in batches) + { + int passedCount = 0; + int failedCount = 0; + foreach (var wm in b.WaterMeters) + { + if (wm.Passed) { passedCount++; } else { failedCount++; } + } + + if (passedCount + failedCount == 0) continue; + + + flowLayoutPanel1.Controls.Add(new PreviousResultCtrl(this, + b.BatchNr, + b.StartTime, + b.EndTime, + b.ProcedureName, + b.WaterMeters[0].PurchaseOrder, + passedCount, + failedCount, + b.RsltsSent, + reloadEn)); + } + + ResumeLayout(); + } + + private void closeButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Forms/PreviousResultsDlg.resx b/TBF_V2/Sources/TBF/TBF/Forms/PreviousResultsDlg.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/PreviousResultsDlg.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Forms/PrintOrderForm.Designer.cs b/TBF_V2/Sources/TBF/TBF/Forms/PrintOrderForm.Designer.cs new file mode 100644 index 00000000..322f0c69 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/PrintOrderForm.Designer.cs @@ -0,0 +1,161 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.Forms +{ + partial class PrintOrderForm + { + /// + /// 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() + { + this.purchaseOrderComboBox = new System.Windows.Forms.ComboBox(); + this.purchaseOrderGroupBox = new System.Windows.Forms.GroupBox(); + this.printButton = new System.Windows.Forms.Button(); + this.cancelButton = new System.Windows.Forms.Button(); + this.testerGroupBox = new System.Windows.Forms.GroupBox(); + this.testerComboBox = new System.Windows.Forms.ComboBox(); + this.onlyLastCheckBox = new System.Windows.Forms.CheckBox(); + this.onlyGoodCheckBox = new System.Windows.Forms.CheckBox(); + this.purchaseOrderGroupBox.SuspendLayout(); + this.testerGroupBox.SuspendLayout(); + this.SuspendLayout(); + // + // purchaseOrderComboBox + // + this.purchaseOrderComboBox.FormattingEnabled = true; + this.purchaseOrderComboBox.Location = new System.Drawing.Point(47, 41); + this.purchaseOrderComboBox.Name = "purchaseOrderComboBox"; + this.purchaseOrderComboBox.Size = new System.Drawing.Size(380, 31); + this.purchaseOrderComboBox.TabIndex = 0; + // + // purchaseOrderGroupBox + // + this.purchaseOrderGroupBox.Controls.Add(this.purchaseOrderComboBox); + this.purchaseOrderGroupBox.Location = new System.Drawing.Point(59, 38); + this.purchaseOrderGroupBox.Name = "purchaseOrderGroupBox"; + this.purchaseOrderGroupBox.Size = new System.Drawing.Size(481, 96); + this.purchaseOrderGroupBox.TabIndex = 1; + this.purchaseOrderGroupBox.TabStop = false; + this.purchaseOrderGroupBox.Text = "Purchase order"; + // + // printButton + // + this.printButton.Location = new System.Drawing.Point(106, 348); + this.printButton.Name = "printButton"; + this.printButton.Size = new System.Drawing.Size(144, 64); + this.printButton.TabIndex = 2; + this.printButton.Text = "Print"; + this.printButton.UseVisualStyleBackColor = true; + this.printButton.Click += new System.EventHandler(this.printButton_Click); + // + // cancelButton + // + this.cancelButton.Location = new System.Drawing.Point(342, 348); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(144, 64); + this.cancelButton.TabIndex = 3; + this.cancelButton.Text = "Cancel"; + this.cancelButton.UseVisualStyleBackColor = true; + this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click); + // + // testerGroupBox + // + this.testerGroupBox.Controls.Add(this.testerComboBox); + this.testerGroupBox.Location = new System.Drawing.Point(58, 142); + this.testerGroupBox.Name = "testerGroupBox"; + this.testerGroupBox.Size = new System.Drawing.Size(481, 96); + this.testerGroupBox.TabIndex = 4; + this.testerGroupBox.TabStop = false; + this.testerGroupBox.Text = "Tester"; + // + // testerComboBox + // + this.testerComboBox.FormattingEnabled = true; + this.testerComboBox.Location = new System.Drawing.Point(47, 41); + this.testerComboBox.Name = "testerComboBox"; + this.testerComboBox.Size = new System.Drawing.Size(380, 31); + this.testerComboBox.TabIndex = 0; + // + // onlyLastCheckBox + // + this.onlyLastCheckBox.AutoSize = true; + this.onlyLastCheckBox.Location = new System.Drawing.Point(106, 277); + this.onlyLastCheckBox.Name = "onlyLastCheckBox"; + this.onlyLastCheckBox.Size = new System.Drawing.Size(335, 27); + this.onlyLastCheckBox.TabIndex = 5; + this.onlyLastCheckBox.Text = "Print only the last measurement"; + this.onlyLastCheckBox.UseVisualStyleBackColor = true; + // + // onlyGoodCheckBox + // + this.onlyGoodCheckBox.AutoSize = true; + this.onlyGoodCheckBox.Location = new System.Drawing.Point(106, 244); + this.onlyGoodCheckBox.Name = "onlyGoodCheckBox"; + this.onlyGoodCheckBox.Size = new System.Drawing.Size(247, 27); + this.onlyGoodCheckBox.TabIndex = 6; + this.onlyGoodCheckBox.Text = "Print only good results"; + this.onlyGoodCheckBox.UseVisualStyleBackColor = true; + this.onlyGoodCheckBox.Visible = false; + // + // PrintOrderForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(12F, 23F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(597, 451); + this.Controls.Add(this.onlyGoodCheckBox); + this.Controls.Add(this.onlyLastCheckBox); + this.Controls.Add(this.testerGroupBox); + this.Controls.Add(this.cancelButton); + this.Controls.Add(this.printButton); + this.Controls.Add(this.purchaseOrderGroupBox); + this.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "PrintOrderForm"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "Print watermeter results"; + this.Load += new System.EventHandler(this.PrintOrderForm_Load); + this.purchaseOrderGroupBox.ResumeLayout(false); + this.testerGroupBox.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ComboBox purchaseOrderComboBox; + private System.Windows.Forms.GroupBox purchaseOrderGroupBox; + private System.Windows.Forms.Button printButton; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.GroupBox testerGroupBox; + private System.Windows.Forms.ComboBox testerComboBox; + private System.Windows.Forms.CheckBox onlyLastCheckBox; + private System.Windows.Forms.CheckBox onlyGoodCheckBox; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Forms/PrintOrderForm.cs b/TBF_V2/Sources/TBF/TBF/Forms/PrintOrderForm.cs new file mode 100644 index 00000000..61c90fae --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/PrintOrderForm.cs @@ -0,0 +1,121 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using TBF.Resources; + +namespace TBF.Forms +{ + public partial class PrintOrderForm : Form + { + public string PurchaseOrder; + public string Tester; + public bool OnlyGoodResults; + public bool OnlyLastResult; + + public PrintOrderForm() + { + InitializeComponent(); + } + + private void PrintOrderForm_Load(object sender, EventArgs e) + { + Localize(); + + TBF.LocalSettings ls = Program.LocalSettings; + Left = (ls.PrintOrderLeft != 0) ? ls.PrintOrderLeft : 200; + Top = (ls.PrintOrderTop != 0) ? ls.PrintOrderTop : 100; + + onlyGoodCheckBox.Checked = OnlyGoodResults = Program.LocalSettings.PrintOrderOnlyGoodResult; + onlyLastCheckBox.Checked = OnlyLastResult = Program.LocalSettings.PrintOrderOnlyLastResult; + + PrepareOrderCombo(purchaseOrderComboBox); + PrepareTesterCombo(testerComboBox); + } + + void Localize() + { + Text = Strings.Print_watermeter_results; + purchaseOrderGroupBox.Text = Strings.Purchase_order; + testerGroupBox.Text = Strings.Tester; + onlyGoodCheckBox.Text = Strings.Print_only_good_results; + onlyLastCheckBox.Text = Strings.Print_only_the_last_measurement; + printButton.Text = Strings.PrintBtnText; + cancelButton.Text = Strings.CancelBtnText; + } + + /// + /// Load Purchase order combo box items from the LocalSettings PurchaseOrderHistory array + /// + /// Puchase order ComboBox + void PrepareOrderCombo(ComboBox orderComboBox) + { + for (int i = 0; i < Program.LocalSettings.PurchaseOrderHistoryCount; i++) + { + orderComboBox.Items.Add(Program.LocalSettings.PurchaseOrderHistory[i]); + } + if (orderComboBox.Items.Count > 0) + { + orderComboBox.Text = orderComboBox.Items[0].ToString(); + } + } + + /// + /// Load Purchase order combo box items from the LocalSettings PurchaseOrderHistory array + /// + /// Puchase order ComboBox + void PrepareTesterCombo(ComboBox testerComboBox) + { + for (int i = 0; i < Program.LocalSettings.TesterHistoryCount; i++) + { + testerComboBox.Items.Add(Program.LocalSettings.TesterHistory[i]); + } + if (testerComboBox.Items.Count > 0) + { + testerComboBox.Text = testerComboBox.Items[0].ToString(); + } + } + + private void printButton_Click(object sender, EventArgs e) + { + PurchaseOrder = purchaseOrderComboBox.Text; + Tester = testerComboBox.Text; + + Program.LocalSettings.PrintOrderOnlyGoodResult = OnlyGoodResults = onlyGoodCheckBox.Checked; + Program.LocalSettings.PrintOrderOnlyLastResult = OnlyLastResult = onlyLastCheckBox.Checked; + + Program.LocalSettings.PrintOrderLeft = Location.X; + Program.LocalSettings.PrintOrderTop = Location.Y; + bool b1 = Program.LocalSettings.UpdateHistory(testerComboBox.Text, + ref Program.LocalSettings.TesterHistory); + bool b2 = Program.LocalSettings.UpdateHistory(purchaseOrderComboBox.Text, + ref Program.LocalSettings.PurchaseOrderHistory +#if FUZHOU150 || FUZHOU300 + , 20 +#endif + ); + if (!b1 && !b2) + { + Program.LocalSettings.Save(); + } + + DialogResult = DialogResult.OK; + Close(); + } + + private void cancelButton_Click(object sender, EventArgs e) + { + PurchaseOrder = string.Empty; + Tester = string.Empty; + DialogResult = DialogResult.Cancel; + Close(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Forms/PrintOrderForm.resx b/TBF_V2/Sources/TBF/TBF/Forms/PrintOrderForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/PrintOrderForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Forms/RemarkDlg.Designer.cs b/TBF_V2/Sources/TBF/TBF/Forms/RemarkDlg.Designer.cs new file mode 100644 index 00000000..5eba0ae2 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/RemarkDlg.Designer.cs @@ -0,0 +1,100 @@ +namespace TBF.Forms +{ + partial class RemarkDlg + { + /// + /// 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() + { + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.closeButton = new System.Windows.Forms.Button(); + this.textBox1 = new System.Windows.Forms.TextBox(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.textBox1); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.closeButton); + this.splitContainer1.Size = new System.Drawing.Size(459, 249); + this.splitContainer1.SplitterDistance = 340; + this.splitContainer1.TabIndex = 0; + // + // closeButton + // + this.closeButton.Location = new System.Drawing.Point(18, 21); + this.closeButton.Name = "closeButton"; + this.closeButton.Size = new System.Drawing.Size(75, 43); + this.closeButton.TabIndex = 0; + this.closeButton.Text = "Close"; + this.closeButton.UseVisualStyleBackColor = true; + this.closeButton.Click += new System.EventHandler(this.closeButton_Click); + // + // textBox1 + // + this.textBox1.Dock = System.Windows.Forms.DockStyle.Fill; + this.textBox1.Location = new System.Drawing.Point(0, 0); + this.textBox1.Multiline = true; + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(340, 249); + this.textBox1.TabIndex = 0; + // + // RemarkDlg + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(459, 249); + this.Controls.Add(this.splitContainer1); + this.Name = "RemarkDlg"; + this.Text = "Remark"; + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel1.PerformLayout(); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.Button closeButton; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Forms/RemarkDlg.cs b/TBF_V2/Sources/TBF/TBF/Forms/RemarkDlg.cs new file mode 100644 index 00000000..b791aa3d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/RemarkDlg.cs @@ -0,0 +1,25 @@ +using System; +using System.Windows.Forms; +using TBF.Resources; + +namespace TBF.Forms +{ + public partial class RemarkDlg : Form + { + public string Remark; + + public RemarkDlg() + { + InitializeComponent(); + Text = Strings.Remark; + textBox1.Text = Remark; + } + + private void closeButton_Click(object sender, EventArgs e) + { + Remark = textBox1.Text; + DialogResult = DialogResult.OK; + Close(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Forms/RemarkDlg.resx b/TBF_V2/Sources/TBF/TBF/Forms/RemarkDlg.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/RemarkDlg.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Forms/ResultsArrangementDlg.Designer.cs b/TBF_V2/Sources/TBF/TBF/Forms/ResultsArrangementDlg.Designer.cs new file mode 100644 index 00000000..be253a45 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/ResultsArrangementDlg.Designer.cs @@ -0,0 +1,221 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.Forms +{ + partial class ResultsArrangementDlg + { + /// + /// 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() + { + this.testsRowsRadioButton = new System.Windows.Forms.RadioButton(); + this.testsColumnsRadioButton = new System.Windows.Forms.RadioButton(); + this.testsArangementGroupBox = new System.Windows.Forms.GroupBox(); + this.metersArangementGroupBox = new System.Windows.Forms.GroupBox(); + this.nrMetersTextBox = new System.Windows.Forms.TextBox(); + this.nrMetersLabel = new System.Windows.Forms.Label(); + this.verticallyRadioButton = new System.Windows.Forms.RadioButton(); + this.horizontallyRadioButton = new System.Windows.Forms.RadioButton(); + this.okButton = new System.Windows.Forms.Button(); + this.cancelButton = new System.Windows.Forms.Button(); + this.unlockButton = new System.Windows.Forms.Button(); + this.resultsConfigCtrl = new Results.Forms.ResultsConfigCtrl(); + this.testsArangementGroupBox.SuspendLayout(); + this.metersArangementGroupBox.SuspendLayout(); + this.SuspendLayout(); + // + // testsRowsRadioButton + // + this.testsRowsRadioButton.AutoSize = true; + this.testsRowsRadioButton.Enabled = false; + this.testsRowsRadioButton.Location = new System.Drawing.Point(21, 21); + this.testsRowsRadioButton.Name = "testsRowsRadioButton"; + this.testsRowsRadioButton.Size = new System.Drawing.Size(120, 17); + this.testsRowsRadioButton.TabIndex = 0; + this.testsRowsRadioButton.TabStop = true; + this.testsRowsRadioButton.Text = "Tests are table rows"; + this.testsRowsRadioButton.UseVisualStyleBackColor = true; + // + // testsColumnsRadioButton + // + this.testsColumnsRadioButton.AutoSize = true; + this.testsColumnsRadioButton.Enabled = false; + this.testsColumnsRadioButton.Location = new System.Drawing.Point(21, 43); + this.testsColumnsRadioButton.Name = "testsColumnsRadioButton"; + this.testsColumnsRadioButton.Size = new System.Drawing.Size(137, 17); + this.testsColumnsRadioButton.TabIndex = 1; + this.testsColumnsRadioButton.TabStop = true; + this.testsColumnsRadioButton.Text = "Tests are table columns"; + this.testsColumnsRadioButton.UseVisualStyleBackColor = true; + // + // testsArangementGroupBox + // + this.testsArangementGroupBox.Controls.Add(this.testsColumnsRadioButton); + this.testsArangementGroupBox.Controls.Add(this.testsRowsRadioButton); + this.testsArangementGroupBox.Location = new System.Drawing.Point(14, 12); + this.testsArangementGroupBox.Name = "testsArangementGroupBox"; + this.testsArangementGroupBox.Size = new System.Drawing.Size(305, 70); + this.testsArangementGroupBox.TabIndex = 2; + this.testsArangementGroupBox.TabStop = false; + this.testsArangementGroupBox.Text = "Arangement of tests"; + // + // metersArangementGroupBox + // + this.metersArangementGroupBox.Controls.Add(this.nrMetersTextBox); + this.metersArangementGroupBox.Controls.Add(this.nrMetersLabel); + this.metersArangementGroupBox.Controls.Add(this.verticallyRadioButton); + this.metersArangementGroupBox.Controls.Add(this.horizontallyRadioButton); + this.metersArangementGroupBox.Location = new System.Drawing.Point(325, 12); + this.metersArangementGroupBox.Name = "metersArangementGroupBox"; + this.metersArangementGroupBox.Size = new System.Drawing.Size(593, 70); + this.metersArangementGroupBox.TabIndex = 3; + this.metersArangementGroupBox.TabStop = false; + this.metersArangementGroupBox.Text = "Arangement of tested meters"; + // + // nrMetersTextBox + // + this.nrMetersTextBox.Enabled = false; + this.nrMetersTextBox.Location = new System.Drawing.Point(409, 23); + this.nrMetersTextBox.Name = "nrMetersTextBox"; + this.nrMetersTextBox.Size = new System.Drawing.Size(41, 20); + this.nrMetersTextBox.TabIndex = 5; + // + // nrMetersLabel + // + this.nrMetersLabel.AutoSize = true; + this.nrMetersLabel.Location = new System.Drawing.Point(263, 23); + this.nrMetersLabel.Name = "nrMetersLabel"; + this.nrMetersLabel.Size = new System.Drawing.Size(108, 13); + this.nrMetersLabel.TabIndex = 4; + this.nrMetersLabel.Text = "Nr. meters in a group:"; + // + // verticallyRadioButton + // + this.verticallyRadioButton.AutoSize = true; + this.verticallyRadioButton.Enabled = false; + this.verticallyRadioButton.Location = new System.Drawing.Point(21, 21); + this.verticallyRadioButton.Name = "verticallyRadioButton"; + this.verticallyRadioButton.Size = new System.Drawing.Size(67, 17); + this.verticallyRadioButton.TabIndex = 3; + this.verticallyRadioButton.TabStop = true; + this.verticallyRadioButton.Text = "Vertically"; + this.verticallyRadioButton.UseVisualStyleBackColor = true; + // + // horizontallyRadioButton + // + this.horizontallyRadioButton.AutoSize = true; + this.horizontallyRadioButton.Enabled = false; + this.horizontallyRadioButton.Location = new System.Drawing.Point(21, 43); + this.horizontallyRadioButton.Name = "horizontallyRadioButton"; + this.horizontallyRadioButton.Size = new System.Drawing.Size(79, 17); + this.horizontallyRadioButton.TabIndex = 2; + this.horizontallyRadioButton.TabStop = true; + this.horizontallyRadioButton.Text = "Horizontally"; + this.horizontallyRadioButton.UseVisualStyleBackColor = true; + // + // okButton + // + this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.okButton.Location = new System.Drawing.Point(937, 57); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(104, 30); + this.okButton.TabIndex = 4; + this.okButton.Text = "Close"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // cancelButton + // + this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cancelButton.Location = new System.Drawing.Point(937, 94); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(104, 30); + this.cancelButton.TabIndex = 5; + this.cancelButton.Text = "Cancel"; + this.cancelButton.UseVisualStyleBackColor = true; + this.cancelButton.Visible = false; + // + // unlockButton + // + this.unlockButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.unlockButton.Location = new System.Drawing.Point(937, 21); + this.unlockButton.Name = "unlockButton"; + this.unlockButton.Size = new System.Drawing.Size(104, 30); + this.unlockButton.TabIndex = 47; + this.unlockButton.Text = "Unlock"; + this.unlockButton.UseVisualStyleBackColor = true; + this.unlockButton.Click += new System.EventHandler(this.unlockButton_Click); + // + // resultsConfigCtrl + // + this.resultsConfigCtrl.Location = new System.Drawing.Point(3, 85); + this.resultsConfigCtrl.Name = "resultsConfigCtrl"; + this.resultsConfigCtrl.Size = new System.Drawing.Size(925, 496); + this.resultsConfigCtrl.TabIndex = 53; + this.resultsConfigCtrl.Unlocked = false; + // + // ResultsArrangementDlg + // + this.AcceptButton = this.okButton; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cancelButton; + this.ClientSize = new System.Drawing.Size(1056, 579); + this.Controls.Add(this.resultsConfigCtrl); + this.Controls.Add(this.unlockButton); + this.Controls.Add(this.cancelButton); + this.Controls.Add(this.okButton); + this.Controls.Add(this.metersArangementGroupBox); + this.Controls.Add(this.testsArangementGroupBox); + this.Name = "ResultsArrangementDlg"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "ResultsConfig"; + this.Load += new System.EventHandler(this.ResultsConfig_Load); + this.testsArangementGroupBox.ResumeLayout(false); + this.testsArangementGroupBox.PerformLayout(); + this.metersArangementGroupBox.ResumeLayout(false); + this.metersArangementGroupBox.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.RadioButton testsRowsRadioButton; + private System.Windows.Forms.RadioButton testsColumnsRadioButton; + private System.Windows.Forms.GroupBox testsArangementGroupBox; + private System.Windows.Forms.GroupBox metersArangementGroupBox; + private System.Windows.Forms.RadioButton verticallyRadioButton; + private System.Windows.Forms.RadioButton horizontallyRadioButton; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.Button unlockButton; + private System.Windows.Forms.TextBox nrMetersTextBox; + private System.Windows.Forms.Label nrMetersLabel; + private Results.Forms.ResultsConfigCtrl resultsConfigCtrl; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Forms/ResultsArrangementDlg.cs b/TBF_V2/Sources/TBF/TBF/Forms/ResultsArrangementDlg.cs new file mode 100644 index 00000000..bd2dbbac --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/ResultsArrangementDlg.cs @@ -0,0 +1,132 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using Config.Entities; +using Results; +using TBF.Resources; + +namespace TBF.Forms +{ + public partial class ResultsArrangementDlg : Form + { + /// + /// Required access rights to make changes with this form + /// + const Users.Grp.GID RequiredGroupMembership = Users.Grp.GID.Metrologists; + + public bool Unlocked; /// true = changes enabled + + public TestsArrangement TestsArrangement; + public MetersArrangement MetersArrangement; + public int NrMetersInOneGroup; + + public IList SelectedItems + { + set { resultsConfigCtrl.SelectedItems = value; } + get { return resultsConfigCtrl.SelectedItems; } + } + + public MetersKind MetersKind + { + set + { + resultsConfigCtrl.MetersKind = mtrsKind = value; + Text = string.Format("{0} ({1})", Strings.Configuration, mtrsKind.ToDescription()); + } + } + + MetersKind mtrsKind; + + + public ResultsArrangementDlg() + { + InitializeComponent(); + resultsConfigCtrl.SupressTestIDColumn = true; + + Unlocked = false; + cancelButton.Visible = false; + } + + void Localize() + { + Text = string.Format("{0} ({1})", Strings.Configuration, mtrsKind.ToDescription()); + testsArangementGroupBox.Text = Strings.Arrangement_of_tests; + metersArangementGroupBox.Text = Strings.Arrangement_of_meters; + testsRowsRadioButton.Text = Strings.Tests_are_rows; + testsColumnsRadioButton.Text = Strings.Tests_are_columns; + horizontallyRadioButton.Text = Strings.Horizontally; + verticallyRadioButton.Text = Strings.Vertically; + nrMetersLabel.Text = Strings.Nr_meters_in_a_group; + unlockButton.Text = Strings.UnlockBtnText; + okButton.Text = Strings.CloseBtnText; + cancelButton.Text = Strings.CancelBtnText; + } + + void ResultsConfig_Load(object sender, EventArgs e) + { + Localize(); + + testsRowsRadioButton.Checked = (TestsArrangement == TestsArrangement.Rows); + testsColumnsRadioButton.Checked = (TestsArrangement == TestsArrangement.Columns); + + horizontallyRadioButton.Checked = (MetersArrangement == MetersArrangement.Horizontally); + verticallyRadioButton.Checked = (MetersArrangement == MetersArrangement.Vertically); + nrMetersTextBox.Text = NrMetersInOneGroup.ToString(); + } + + void unlockButton_Click(object sender, EventArgs e) + { + if (!Unlocked) + { + if (!Users.GlobalData.CurrentUser.IsMemberOf(RequiredGroupMembership)) + { + if ((new Users.Forms.LoginDlg(RequiredGroupMembership)).ShowDialog() != DialogResult.OK) + return; + } + else if (Program.LocalSettings.AlwaysAskPasswdWhenUnlocking) + { + if ((new Users.Forms.LoginDlg(Users.GlobalData.CurrentUser.UserName, RequiredGroupMembership)).ShowDialog() != DialogResult.OK) + return; + } + + if (Program.MainWnd != null) Program.MainWnd.UpdateUser(); + + Unlocked = true; + + /// + /// Unlock user interface controls + /// + unlockButton.Enabled = false; + okButton.Text = Strings.OkBtnText; + cancelButton.Visible = true; + testsRowsRadioButton.Enabled = true; + testsColumnsRadioButton.Enabled = true; + verticallyRadioButton.Enabled = true; + horizontallyRadioButton.Enabled = true; + nrMetersTextBox.Enabled = true; + resultsConfigCtrl.Unlocked = true; + } + } + + void okButton_Click(object sender, EventArgs e) + { + if (testsColumnsRadioButton.Checked) TestsArrangement = TestsArrangement.Columns; + else TestsArrangement = TestsArrangement.Rows; + + if (horizontallyRadioButton.Checked) MetersArrangement = MetersArrangement.Horizontally; + else MetersArrangement = MetersArrangement.Vertically; + + int nrInGroup; + if (int.TryParse(nrMetersTextBox.Text, out nrInGroup) && nrInGroup > 0) + { + NrMetersInOneGroup = nrInGroup; + } + + DialogResult = DialogResult.OK; + Close(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Forms/ResultsArrangementDlg.resx b/TBF_V2/Sources/TBF/TBF/Forms/ResultsArrangementDlg.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/ResultsArrangementDlg.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Forms/TabNameDlg.Designer.cs b/TBF_V2/Sources/TBF/TBF/Forms/TabNameDlg.Designer.cs new file mode 100644 index 00000000..17591d26 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/TabNameDlg.Designer.cs @@ -0,0 +1,107 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.Forms +{ + partial class TabNameDlg + { + /// + /// 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() + { + this.tabNameTextBox = new System.Windows.Forms.TextBox(); + this.okButton = new System.Windows.Forms.Button(); + this.radioButton1 = new System.Windows.Forms.RadioButton(); + this.radioButton2 = new System.Windows.Forms.RadioButton(); + this.SuspendLayout(); + // + // tabNameTextBox + // + this.tabNameTextBox.Location = new System.Drawing.Point(33, 25); + this.tabNameTextBox.Name = "tabNameTextBox"; + this.tabNameTextBox.Size = new System.Drawing.Size(145, 20); + this.tabNameTextBox.TabIndex = 1; + // + // okButton + // + this.okButton.Location = new System.Drawing.Point(209, 18); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(85, 33); + this.okButton.TabIndex = 2; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // radioButton1 + // + this.radioButton1.AutoSize = true; + this.radioButton1.Checked = true; + this.radioButton1.Location = new System.Drawing.Point(37, 63); + this.radioButton1.Name = "radioButton1"; + this.radioButton1.Size = new System.Drawing.Size(121, 17); + this.radioButton1.TabIndex = 3; + this.radioButton1.TabStop = true; + this.radioButton1.Text = "Transition sequence"; + this.radioButton1.UseVisualStyleBackColor = true; + // + // radioButton2 + // + this.radioButton2.AutoSize = true; + this.radioButton2.Location = new System.Drawing.Point(37, 86); + this.radioButton2.Name = "radioButton2"; + this.radioButton2.Size = new System.Drawing.Size(137, 17); + this.radioButton2.TabIndex = 4; + this.radioButton2.Text = "Virtual bench sequence"; + this.radioButton2.UseVisualStyleBackColor = true; + // + // TabNameDlg + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(316, 122); + this.Controls.Add(this.radioButton2); + this.Controls.Add(this.radioButton1); + this.Controls.Add(this.okButton); + this.Controls.Add(this.tabNameTextBox); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "TabNameDlg"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "TabName"; + this.Load += new System.EventHandler(this.TabNameDlg_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox tabNameTextBox; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.RadioButton radioButton1; + private System.Windows.Forms.RadioButton radioButton2; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Forms/TabNameDlg.cs b/TBF_V2/Sources/TBF/TBF/Forms/TabNameDlg.cs new file mode 100644 index 00000000..925fc118 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/TabNameDlg.cs @@ -0,0 +1,59 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using TBF.Resources; + +namespace TBF.Forms +{ + public partial class TabNameDlg : Form + { + public string TabNameLabel; + public string TabName; + public bool IsVirtualBenchSeq; + + public TabNameDlg() + { + InitializeComponent(); + + TabNameLabel = string.Empty; + TabName = string.Empty; + IsVirtualBenchSeq = false; + } + + public TabNameDlg(bool nameOnly) + { + InitializeComponent(); + + TabNameLabel = string.Empty; + TabName = string.Empty; + IsVirtualBenchSeq = false; + + if (nameOnly == true) + { + radioButton1.Visible = false; + radioButton2.Visible = false; + Height -= 50; + } + } + + private void TabNameDlg_Load(object sender, EventArgs e) + { + Text = TabNameLabel; + tabNameTextBox.Text = TabName; + + radioButton1.Text = Strings.Transition_sequence; + radioButton2.Text = Strings.Virtual_bench_sequence; + okButton.Text = Strings.OkBtnText; + } + + private void okButton_Click(object sender, EventArgs e) + { + TabName = tabNameTextBox.Text; + IsVirtualBenchSeq = radioButton2.Checked; + DialogResult = DialogResult.OK; + Close(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Forms/TabNameDlg.resx b/TBF_V2/Sources/TBF/TBF/Forms/TabNameDlg.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/TabNameDlg.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Forms/UpgradeSelectionDlg.Designer.cs b/TBF_V2/Sources/TBF/TBF/Forms/UpgradeSelectionDlg.Designer.cs new file mode 100644 index 00000000..f2f9cdaf --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/UpgradeSelectionDlg.Designer.cs @@ -0,0 +1,241 @@ +namespace TBF.Forms +{ + partial class UpgradeSelectionDlg + { + /// + /// 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() + { + this.upgradeDb_215_216_Button = new System.Windows.Forms.Button(); + this.upgradeDb_216_217_Button = new System.Windows.Forms.Button(); + this.upgradeDb_212_215_Button = new System.Windows.Forms.Button(); + this.upgradeDb_217_218_Button = new System.Windows.Forms.Button(); + this.upgradeDb_29_212_Button = new System.Windows.Forms.Button(); + this.upgradeConfigDBCheckBox = new System.Windows.Forms.CheckBox(); + this.upgradeResultsDBCheckBox = new System.Windows.Forms.CheckBox(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.textBox2 = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.pressureRepresentationButton = new System.Windows.Forms.Button(); + this.upgradeDb_24_29_Button = new System.Windows.Forms.Button(); + this.upgradeDb_218_220_Button = new System.Windows.Forms.Button(); + this.upgradeDb_NFC_button = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // upgradeDb_215_216_Button + // + this.upgradeDb_215_216_Button.Location = new System.Drawing.Point(12, 217); + this.upgradeDb_215_216_Button.Name = "upgradeDb_215_216_Button"; + this.upgradeDb_215_216_Button.Size = new System.Drawing.Size(260, 34); + this.upgradeDb_215_216_Button.TabIndex = 6; + this.upgradeDb_215_216_Button.Text = "Upgrade database from ver. 2.15 to ver. 2.16"; + this.upgradeDb_215_216_Button.UseVisualStyleBackColor = true; + this.upgradeDb_215_216_Button.Click += new System.EventHandler(this.upgradeDb_215_216_Button_Click); + // + // upgradeDb_216_217_Button + // + this.upgradeDb_216_217_Button.Location = new System.Drawing.Point(12, 257); + this.upgradeDb_216_217_Button.Name = "upgradeDb_216_217_Button"; + this.upgradeDb_216_217_Button.Size = new System.Drawing.Size(260, 34); + this.upgradeDb_216_217_Button.TabIndex = 7; + this.upgradeDb_216_217_Button.Text = "Upgrade database from ver. 2.16 to ver. 2.17"; + this.upgradeDb_216_217_Button.UseVisualStyleBackColor = true; + this.upgradeDb_216_217_Button.Click += new System.EventHandler(this.upgradeDb_216_217_Button_Click); + // + // upgradeDb_212_215_Button + // + this.upgradeDb_212_215_Button.Location = new System.Drawing.Point(12, 177); + this.upgradeDb_212_215_Button.Name = "upgradeDb_212_215_Button"; + this.upgradeDb_212_215_Button.Size = new System.Drawing.Size(260, 34); + this.upgradeDb_212_215_Button.TabIndex = 5; + this.upgradeDb_212_215_Button.Text = "Upgrade database from ver. 2.12 to ver. 2.15"; + this.upgradeDb_212_215_Button.UseVisualStyleBackColor = true; + this.upgradeDb_212_215_Button.Click += new System.EventHandler(this.upgradeDb_212_215_Button_Click); + // + // upgradeDb_217_218_Button + // + this.upgradeDb_217_218_Button.Location = new System.Drawing.Point(12, 297); + this.upgradeDb_217_218_Button.Name = "upgradeDb_217_218_Button"; + this.upgradeDb_217_218_Button.Size = new System.Drawing.Size(260, 34); + this.upgradeDb_217_218_Button.TabIndex = 8; + this.upgradeDb_217_218_Button.Text = "Upgrade database from ver. 2.17 to ver. 2.18"; + this.upgradeDb_217_218_Button.UseVisualStyleBackColor = true; + this.upgradeDb_217_218_Button.Click += new System.EventHandler(this.upgradeDb_217_218_Button_Click); + // + // upgradeDb_29_212_Button + // + this.upgradeDb_29_212_Button.Location = new System.Drawing.Point(12, 137); + this.upgradeDb_29_212_Button.Name = "upgradeDb_29_212_Button"; + this.upgradeDb_29_212_Button.Size = new System.Drawing.Size(260, 34); + this.upgradeDb_29_212_Button.TabIndex = 4; + this.upgradeDb_29_212_Button.Text = "Upgrade database from ver. 2.9 to ver. 2.12"; + this.upgradeDb_29_212_Button.UseVisualStyleBackColor = true; + this.upgradeDb_29_212_Button.Click += new System.EventHandler(this.upgradeDb_29_212_Button_Click); + // + // upgradeConfigDBCheckBox + // + this.upgradeConfigDBCheckBox.AutoSize = true; + this.upgradeConfigDBCheckBox.Location = new System.Drawing.Point(13, 14); + this.upgradeConfigDBCheckBox.Name = "upgradeConfigDBCheckBox"; + this.upgradeConfigDBCheckBox.Size = new System.Drawing.Size(147, 17); + this.upgradeConfigDBCheckBox.TabIndex = 0; + this.upgradeConfigDBCheckBox.Text = "Upgrade Config database"; + this.upgradeConfigDBCheckBox.UseVisualStyleBackColor = true; + // + // upgradeResultsDBCheckBox + // + this.upgradeResultsDBCheckBox.AutoSize = true; + this.upgradeResultsDBCheckBox.Location = new System.Drawing.Point(13, 34); + this.upgradeResultsDBCheckBox.Name = "upgradeResultsDBCheckBox"; + this.upgradeResultsDBCheckBox.Size = new System.Drawing.Size(152, 17); + this.upgradeResultsDBCheckBox.TabIndex = 1; + this.upgradeResultsDBCheckBox.Text = "Upgrade Results database"; + this.upgradeResultsDBCheckBox.UseVisualStyleBackColor = true; + // + // textBox1 + // + this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.textBox1.Location = new System.Drawing.Point(94, 418); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(100, 20); + this.textBox1.TabIndex = 11; + // + // textBox2 + // + this.textBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.textBox2.Location = new System.Drawing.Point(94, 444); + this.textBox2.Name = "textBox2"; + this.textBox2.Size = new System.Drawing.Size(100, 20); + this.textBox2.TabIndex = 13; + // + // label1 + // + this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 421); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(70, 13); + this.label1.TabIndex = 10; + this.label1.Text = "From batch #"; + // + // label2 + // + this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(12, 447); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(60, 13); + this.label2.TabIndex = 12; + this.label2.Text = "To batch #"; + // + // pressureRepresentationButton + // + this.pressureRepresentationButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.pressureRepresentationButton.Location = new System.Drawing.Point(207, 418); + this.pressureRepresentationButton.Name = "pressureRepresentationButton"; + this.pressureRepresentationButton.Size = new System.Drawing.Size(65, 42); + this.pressureRepresentationButton.TabIndex = 14; + this.pressureRepresentationButton.Text = "Upgrade pressure"; + this.pressureRepresentationButton.UseVisualStyleBackColor = true; + this.pressureRepresentationButton.Click += new System.EventHandler(this.pressureRepresentationButton_Click); + // + // upgradeDb_24_29_Button + // + this.upgradeDb_24_29_Button.Location = new System.Drawing.Point(12, 97); + this.upgradeDb_24_29_Button.Name = "upgradeDb_24_29_Button"; + this.upgradeDb_24_29_Button.Size = new System.Drawing.Size(260, 34); + this.upgradeDb_24_29_Button.TabIndex = 3; + this.upgradeDb_24_29_Button.Text = "Upgrade database from ver. 2.4 to ver. 2.9"; + this.upgradeDb_24_29_Button.UseVisualStyleBackColor = true; + this.upgradeDb_24_29_Button.Click += new System.EventHandler(this.upgradeDb_24_29_Button_Click); + // + // upgradeDb_218_220_Button + // + this.upgradeDb_218_220_Button.Location = new System.Drawing.Point(12, 337); + this.upgradeDb_218_220_Button.Name = "upgradeDb_218_220_Button"; + this.upgradeDb_218_220_Button.Size = new System.Drawing.Size(260, 34); + this.upgradeDb_218_220_Button.TabIndex = 9; + this.upgradeDb_218_220_Button.Text = "Upgrade database from ver. 2.18 to ver. 2.20"; + this.upgradeDb_218_220_Button.UseVisualStyleBackColor = true; + this.upgradeDb_218_220_Button.Click += new System.EventHandler(this.upgradeDb_218_220_Button_Click); + // + // upgradeDb_NFC_button + // + this.upgradeDb_NFC_button.Location = new System.Drawing.Point(12, 57); + this.upgradeDb_NFC_button.Name = "upgradeDb_NFC_button"; + this.upgradeDb_NFC_button.Size = new System.Drawing.Size(260, 34); + this.upgradeDb_NFC_button.TabIndex = 2; + this.upgradeDb_NFC_button.Text = "Upgrade database for NFC tags"; + this.upgradeDb_NFC_button.UseVisualStyleBackColor = true; + this.upgradeDb_NFC_button.Click += new System.EventHandler(this.upgradeDb_NFC_button_Click); + // + // UpgradeSelectionDlg + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(284, 480); + this.Controls.Add(this.upgradeDb_NFC_button); + this.Controls.Add(this.upgradeDb_218_220_Button); + this.Controls.Add(this.upgradeDb_24_29_Button); + this.Controls.Add(this.pressureRepresentationButton); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.textBox2); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.upgradeResultsDBCheckBox); + this.Controls.Add(this.upgradeConfigDBCheckBox); + this.Controls.Add(this.upgradeDb_29_212_Button); + this.Controls.Add(this.upgradeDb_217_218_Button); + this.Controls.Add(this.upgradeDb_212_215_Button); + this.Controls.Add(this.upgradeDb_216_217_Button); + this.Controls.Add(this.upgradeDb_215_216_Button); + this.Name = "UpgradeSelectionDlg"; + this.Text = "Upgrade selection"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button upgradeDb_215_216_Button; + private System.Windows.Forms.Button upgradeDb_216_217_Button; + private System.Windows.Forms.Button upgradeDb_212_215_Button; + private System.Windows.Forms.Button upgradeDb_217_218_Button; + private System.Windows.Forms.Button upgradeDb_29_212_Button; + private System.Windows.Forms.CheckBox upgradeConfigDBCheckBox; + private System.Windows.Forms.CheckBox upgradeResultsDBCheckBox; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.TextBox textBox2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Button pressureRepresentationButton; + private System.Windows.Forms.Button upgradeDb_24_29_Button; + private System.Windows.Forms.Button upgradeDb_218_220_Button; + private System.Windows.Forms.Button upgradeDb_NFC_button; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Forms/UpgradeSelectionDlg.cs b/TBF_V2/Sources/TBF/TBF/Forms/UpgradeSelectionDlg.cs new file mode 100644 index 00000000..06a04bfa --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/UpgradeSelectionDlg.cs @@ -0,0 +1,652 @@ +using System; +using System.Drawing; +using System.Windows.Forms; +using System.Collections.Generic; +using log4net; +using MySql.Data.MySqlClient; +using NHibernate; +using Results.Entities; +using TBF.Forms; +using TBF.Resources; + +namespace TBF.Forms +{ + public partial class UpgradeSelectionDlg : Form + { + private static readonly ILog log = LogManager.GetLogger(typeof(UpgradeSelectionDlg)); + + int batchFrom; + int batchTo; + + TBF.Forms.ModelessActivityForm form; + System.Threading.Thread formThread; + + public UpgradeSelectionDlg() + { + InitializeComponent(); + + upgradeConfigDBCheckBox.Checked = true; + upgradeResultsDBCheckBox.Checked = true; + + batchFrom = 1; + batchTo = Program.LocalSettings.BatchNr - 1; + + textBox1.Text = batchFrom.ToString(); + textBox2.Text = batchTo.ToString(); + } + + void ActivityStart() + { + form = new TBF.Forms.ModelessActivityForm() + { + Message = "Upgrading database", + FontFamily = "Arial", + FontSize = 24, + FontStyle = FontStyle.Regular, + BackgroundColor = Color.Green, + }; + formThread = new System.Threading.Thread(() => form.ShowDialog()); + formThread.Start(); + } + + void ActivityEnd() + { + if (form != null && formThread != null) + { + form.CloseForm(null, new EventArgs()); + formThread.Join(); + } + form = null; + formThread = null; + } + + /// + /// Common part of database upgrade code + /// + /// Database connection + /// Array of SQL commands to be executed + /// true = successful + bool ExecuteCommands(MySqlConnection dbConn, string[] commands) + { + bool success = false; + + try + { + dbConn.Open(); + + foreach (var cmdText in commands) + { + MySqlCommand cmd = dbConn.CreateCommand(); + cmd.CommandText = cmdText; + cmd.ExecuteNonQuery(); + cmd.Dispose(); + } + + success = true; + } + catch (Exception exc) + { + log.ErrorFormat(string.Format("Exception when upgrading DB: {0}", exc.Message)); + if (exc.InnerException != null) log.ErrorFormat(string.Format("Inner exception: {0}", exc.InnerException.Message)); + ActivityEnd(); + MessageBox.Show(string.Format("Exception {0}", exc.Message), "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + } + finally + { + dbConn.Close(); + } + + return success; + } + + ///--------------------------------------------------------------------- + private void upgradeDb_NFC_button_Click(object sender, EventArgs e) + { + if (!upgradeConfigDBCheckBox.Checked && !upgradeResultsDBCheckBox.Checked) + { + MessageBox.Show("No database selected"); + return; + } + + string[] commands = new string[] + { + "ALTER TABLE `user` ADD `Tag` VARCHAR(255) NULL DEFAULT NULL AFTER `Number`;", + }; + + ActivityStart(); + + if (!upgradeConfigDBCheckBox.Checked || ExecuteCommands(new MySqlConnection(Config.Data.CurrentBench.ProceduresDBSettings.ConnectionString), commands)) + { + ActivityEnd(); + MessageBox.Show("DB succesfully upgraded", "Confirmation", MessageBoxButtons.OK, MessageBoxIcon.Information); + upgradeDb_NFC_button.Enabled = false; + } + } + + ///--------------------------------------------------------------------- + private void upgradeDb_24_29_Button_Click(object sender, EventArgs e) + { + if (!upgradeConfigDBCheckBox.Checked && !upgradeResultsDBCheckBox.Checked) + { + MessageBox.Show("No database selected"); + return; + } + + string[] configDbCommands = new string[] + { + /// 2.4 -> 2.5 + "ALTER TABLE `test` ADD `MassRepeats` INT NOT NULL DEFAULT '5' AFTER `PumpPower`, ADD `MassSpread` FLOAT NOT NULL DEFAULT '0' AFTER `MassRepeats`, ADD `MassMethod` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0' AFTER `MassSpread`", + + /// 2.5 -> 2.6 --- + /// 2.6 -> 2.7 --- + /// 2.7 -> 2.8 --- + + /// 2.8 -> 2.9 + "ALTER TABLE `meterspath` DROP `Qfrom`, DROP `Qto`;", + }; + + string[] resultsDbCommands = new string[] + { + /// 2.4 -> 2.5 --- + + /// 2.5 -> 2.6 + "ALTER TABLE `watermeterdata` DROP `Q3`, CHANGE `Qn` `Q3_Qn` DOUBLE NULL DEFAULT NULL ", + "ALTER TABLE `watermeterdata` ADD `DN` DOUBLE NOT NULL DEFAULT '0' AFTER `Producer`, ADD `L` DOUBLE NOT NULL DEFAULT '0' AFTER `DN`, ADD `Mounting` VARCHAR(255) NULL DEFAULT NULL AFTER `L`, ADD `TemperatureClass` VARCHAR(255) NULL DEFAULT NULL AFTER `Q1_Qmin`, ADD `PressureLossClass` VARCHAR(255) NULL DEFAULT NULL AFTER `TemperatureClass`", + "ALTER TABLE `watermeterdata` ADD `MaxAdmissiblePressure` VARCHAR(255) NULL DEFAULT NULL AFTER `PressureLossClass`, ADD `FlowProfileSensitivityClass` VARCHAR(255) NULL DEFAULT NULL AFTER `MaxAdmissiblePressure`, ADD `Certificate` VARCHAR(255) NULL DEFAULT NULL AFTER `FlowProfileSensitivityClass`, ADD `PulsesPerLtr` DOUBLE NOT NULL DEFAULT '1' AFTER `Certificate`", + "ALTER TABLE `watermeterdata` ADD `Text1` VARCHAR(255) NULL DEFAULT NULL AFTER `PulsesPerLtr`, ADD `Text2` VARCHAR(255) NULL DEFAULT NULL AFTER `Text1`, ADD `Text3` VARCHAR(255) NULL DEFAULT NULL AFTER `Text2`, ADD `Text4` VARCHAR(255) NULL DEFAULT NULL AFTER `Text3`, ADD `Text5` VARCHAR(255) NULL DEFAULT NULL AFTER `Text4`", + /// 2.6 -> 2.7 + "ALTER TABLE `watermeterdata` ADD `ProducerAux` VARCHAR(255) NULL DEFAULT NULL AFTER `PulsesPerLtr`, ADD `Q3_Qn_Aux` DOUBLE NOT NULL DEFAULT '0' AFTER `ProducerAux`, ADD `MetrologicalClassAux` VARCHAR(255) NULL DEFAULT NULL AFTER `Q3_Qn_Aux`, ADD `ApprovalInfoAux` VARCHAR(255) NULL DEFAULT NULL AFTER `MetrologicalClassAux`", + /// 2.7 -> 2.8 + "ALTER TABLE `watermeter` ADD `ResultCode` INT NOT NULL DEFAULT '0' AFTER `Passed`", + "ALTER TABLE `batch` ADD `Remark` VARCHAR( 2000 ) NULL DEFAULT NULL AFTER `ProtocolTitle`", + + /// 2.8 -> 2.9 --- + }; + + ActivityStart(); + + if ((!upgradeConfigDBCheckBox.Checked || ExecuteCommands(new MySqlConnection(Config.Data.CurrentBench.ProceduresDBSettings.ConnectionString), configDbCommands)) && + (!upgradeResultsDBCheckBox.Checked || ExecuteCommands(new MySqlConnection(Results.DB.ConnectionString), resultsDbCommands))) + { + ActivityEnd(); + MessageBox.Show("DB succesfully upgraded", "Confirmation", MessageBoxButtons.OK, MessageBoxIcon.Information); + upgradeDb_24_29_Button.Enabled = false; + } + } + + ///--------------------------------------------------------------------- + private void upgradeDb_29_212_Button_Click(object sender, EventArgs e) + { + if (!upgradeConfigDBCheckBox.Checked && !upgradeResultsDBCheckBox.Checked) + { + MessageBox.Show("No database selected"); + return; + } + + string[] configDbCommands = new string[] + { + /// 2.9 -> 2.10 + + /// 2.10 -> 2.11 + "ALTER TABLE `feedingpath` ADD `RegulValvesPct` VARCHAR(255) NULL DEFAULT NULL AFTER `Pump;", + + /// 2.11 -> 2.12 + "ALTER TABLE `benchpath` ADD `PressMtrDelta` VARCHAR(255) NULL DEFAULT NULL AFTER `PressOut;", + }; + + string[] resultsDbCommands = new string[] + { + /// 2.9 -> 2.10 + "ALTER TABLE `testrslt` ADD `AmbTempStart` FLOAT NOT NULL DEFAULT '0' AFTER `AmbientTempAve`", + "ALTER TABLE `testrslt` ADD `AmbTempEnd` FLOAT NOT NULL DEFAULT '0' AFTER `AmbTempStart`", + "ALTER TABLE `testrslt` ADD `AmbTempMin` FLOAT NOT NULL DEFAULT '0' AFTER `AmbTempEnd`", + "ALTER TABLE `testrslt` ADD `AmbTempMax` FLOAT NOT NULL DEFAULT '0' AFTER `AmbTempMin`", + "ALTER TABLE `testrslt` ADD `AmbPressStart` FLOAT NOT NULL DEFAULT '0' AFTER `AmbientPressAve`", + "ALTER TABLE `testrslt` ADD `AmbPressEnd` FLOAT NOT NULL DEFAULT '0' AFTER `AmbPressStart`", + "ALTER TABLE `testrslt` ADD `AmbPressMin` FLOAT NOT NULL DEFAULT '0' AFTER `AmbPressEnd`", + "ALTER TABLE `testrslt` ADD `AmbPressMax` FLOAT NOT NULL DEFAULT '0' AFTER `AmbPressMin`", + "ALTER TABLE `testrslt` ADD `AmbHumiStart` FLOAT NOT NULL DEFAULT '0' AFTER `AmbientHumiAve`", + "ALTER TABLE `testrslt` ADD `AmbHumiEnd` FLOAT NOT NULL DEFAULT '0' AFTER `AmbHumiStart`", + "ALTER TABLE `testrslt` ADD `AmbHumiMin` FLOAT NOT NULL DEFAULT '0' AFTER `AmbHumiEnd`", + "ALTER TABLE `testrslt` ADD `AmbHumiMax` FLOAT NOT NULL DEFAULT '0' AFTER `AmbHumiMin`", + + /// 2.10 -> 2.11 + + /// 2.11 -> 2.12 + "ALTER TABLE `testrslt` ADD `PressDeltaMean` FLOAT NOT NULL DEFAULT '0' AFTER `PressDownMax`", + "ALTER TABLE `testrslt` ADD `PressDeltaStart` FLOAT NOT NULL DEFAULT '0' AFTER `PressDeltaMean`", + "ALTER TABLE `testrslt` ADD `PressDeltaEnd` FLOAT NOT NULL DEFAULT '0' AFTER `PressDeltaStart`", + "ALTER TABLE `testrslt` ADD `PressDeltaMin` FLOAT NOT NULL DEFAULT '0' AFTER `PressDeltaEnd`", + "ALTER TABLE `testrslt` ADD `PressDeltaMax` FLOAT NOT NULL DEFAULT '0' AFTER `PressDeltaMin`", + "ALTER TABLE `testrslt` ADD `FlowStart` FLOAT NOT NULL DEFAULT '0' AFTER `TempDivMax`", + "ALTER TABLE `testrslt` ADD `FlowEnd` FLOAT NOT NULL DEFAULT '0' AFTER `FlowStart`", + }; + + ActivityStart(); + + if ((!upgradeConfigDBCheckBox.Checked || ExecuteCommands(new MySqlConnection(Config.Data.CurrentBench.ProceduresDBSettings.ConnectionString), configDbCommands)) && + (!upgradeResultsDBCheckBox.Checked || ExecuteCommands(new MySqlConnection(Results.DB.ConnectionString), resultsDbCommands))) + { + if (upgradeConfigDBCheckBox.Checked) + { + MySqlConnection dbConn = new MySqlConnection(Config.Data.CurrentBench.ProceduresDBSettings.ConnectionString); + try + { + dbConn.Open(); + + MySqlCommand cmd; + + cmd = dbConn.CreateCommand(); + cmd.CommandText = "UPDATE component SET ClassName = 'TestMethods.Adjustment.Single' WHERE ClassName = 'Adjustment'"; + cmd.ExecuteNonQuery(); + cmd.Dispose(); + + cmd = dbConn.CreateCommand(); + cmd.CommandText = "UPDATE component SET ClassName = 'TestMethods.FlyingStartMassCollection.Compound' WHERE ClassName = 'CombinedMeters'"; + cmd.ExecuteNonQuery(); + cmd.Dispose(); + + cmd = dbConn.CreateCommand(); + cmd.CommandText = "UPDATE component SET ClassName = 'TestMethods.CombinedWithDetection.Compound' WHERE ClassName = 'CombinedWithDetection'"; + cmd.ExecuteNonQuery(); + cmd.Dispose(); + + cmd = dbConn.CreateCommand(); + cmd.CommandText = "UPDATE component SET ClassName = 'TestMethods.FixedStartMassCollection.Single' WHERE ClassName = 'FixedStartMassCollection'"; + cmd.ExecuteNonQuery(); + cmd.Dispose(); + + cmd = dbConn.CreateCommand(); + cmd.CommandText = "UPDATE component SET ClassName = 'TestMethods.FlyingStart.Single' WHERE ClassName = 'FlyingStart'"; + cmd.ExecuteNonQuery(); + cmd.Dispose(); + + cmd = dbConn.CreateCommand(); + cmd.CommandText = "UPDATE component SET ClassName = 'TestMethods.FlyingStartMassCollection.Single' WHERE ClassName = 'Flying-Start-Collection'"; + cmd.ExecuteNonQuery(); + cmd.Dispose(); + + cmd = dbConn.CreateCommand(); + cmd.CommandText = "UPDATE component SET ClassName = 'TestMethods.LeakTest' WHERE ClassName = 'Leak-Test'"; + cmd.ExecuteNonQuery(); + cmd.Dispose(); + + cmd = dbConn.CreateCommand(); + cmd.CommandText = "UPDATE component SET ClassName = 'TestMethods.PMaxTest' WHERE ClassName = 'PMax-Test'"; + cmd.ExecuteNonQuery(); + cmd.Dispose(); + + cmd = dbConn.CreateCommand(); + cmd.CommandText = "UPDATE component SET ClassName = 'Output.Printers.Enhanced.Single' WHERE ClassName = 'BasicResultsPrinter'"; + cmd.ExecuteNonQuery(); + cmd.Dispose(); + + ActivityEnd(); + MessageBox.Show("DB succesfully upgraded", "Confirmation", MessageBoxButtons.OK, MessageBoxIcon.Information); + upgradeDb_29_212_Button.Enabled = false; + } + catch (Exception exc) + { + log.ErrorFormat(string.Format("Exception when upgrading DB: {0}", exc.Message)); + if (exc.InnerException != null) log.ErrorFormat(string.Format("Inner exception: {0}", exc.InnerException.Message)); + ActivityEnd(); + MessageBox.Show(string.Format("Exception {0}", exc.Message), "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + } + finally + { + dbConn.Close(); + } + } + else + { + ActivityEnd(); + MessageBox.Show("DB succesfully upgraded", "Confirmation", MessageBoxButtons.OK, MessageBoxIcon.Information); + upgradeDb_29_212_Button.Enabled = false; + } + } + } + + ///--------------------------------------------------------------------- + private void upgradeDb_212_215_Button_Click(object sender, EventArgs e) + { + if (!upgradeConfigDBCheckBox.Checked && !upgradeResultsDBCheckBox.Checked) + { + MessageBox.Show("No database selected"); + return; + } + + string[] configDbCommands = new string[] + { + /// 2.12 -> 2.13 + "ALTER TABLE `procedure` ADD `Protected` BOOLEAN NOT NULL DEFAULT '0' AFTER `ProtocolTitle`, ADD `MustBeComplete` BOOLEAN NOT NULL DEFAULT '0' AFTER `Protected`, ADD `ManualCtrlDisabled` BOOLEAN NOT NULL DEFAULT '0' AFTER `MustBeComplete`", + /// 2.13 -> 2.14 + "ALTER TABLE `test` ADD `DoControlWaterTemp` BOOLEAN NOT NULL DEFAULT '0' AFTER `Zeroing`, ADD `TempLimLo` FLOAT NOT NULL DEFAULT '15' AFTER `DoControlWaterTemp`, ADD `TempLimHi` FLOAT NOT NULL DEFAULT '25' AFTER `TempLimLo`", + /// 2.14 -> 2.15 + "ALTER TABLE `procedure` ADD `AltProcName` VARCHAR(255) NULL DEFAULT NULL , ADD `AltProcPeriod` INT NOT NULL DEFAULT '0';", + //"ALTER TABLE `procedure` DROP `ProtocolTitle`;", /// Commented out to maintain compatibility with an old ResultsBrowser + }; + + string[] resultsDbCommands = new string[] + { + /// 2.12 -> 2.13 + "ALTER TABLE `watermeter` ADD `Remark` VARCHAR( 2000 ) NULL DEFAULT NULL AFTER `ResultCode`", + "ALTER TABLE `batch` ADD `Dirty` BOOLEAN NOT NULL DEFAULT '0' AFTER `EndTime`", + /// 2.13 -> 2.14 +#if !IPERL + "ALTER TABLE `testrslt` ADD `FlowMean` FLOAT NOT NULL DEFAULT '0' AFTER `TempDivMax`", +#endif + "ALTER TABLE `testrslt` ADD `TestDone` BOOLEAN NOT NULL DEFAULT '1' AFTER `RepetitionNr`, ADD `Remark` VARCHAR( 2000 ) NULL DEFAULT NULL AFTER `TestDone`", + "ALTER TABLE `testdata` ADD `DoControlWaterTemp` BOOLEAN NOT NULL DEFAULT '0' AFTER `Uncertainty`, ADD `TempLimLo` FLOAT NOT NULL DEFAULT '15' AFTER `DoControlWaterTemp`, ADD `TempLimHi` FLOAT NOT NULL DEFAULT '25' AFTER `TempLimLo`", + /// 2.14 -> 2.15 + "ALTER TABLE `watermeter` ADD `ArchivePath` VARCHAR(255) NULL DEFAULT NULL AFTER `ResultCode`;", + }; + + ActivityStart(); + + if ((!upgradeConfigDBCheckBox.Checked || ExecuteCommands(new MySqlConnection(Config.Data.CurrentBench.ProceduresDBSettings.ConnectionString), configDbCommands)) && + (!upgradeResultsDBCheckBox.Checked || ExecuteCommands(new MySqlConnection(Results.DB.ConnectionString), resultsDbCommands))) + { + if (upgradeConfigDBCheckBox.Checked) + { + MySqlConnection dbConn = new MySqlConnection(Config.Data.CurrentBench.ProceduresDBSettings.ConnectionString); + try + { + dbConn.Open(); + + int maxItemNr = 0; + MySqlCommand cmd = dbConn.CreateCommand(); + cmd.CommandText = "SELECT ItemNr FROM component"; + MySqlDataReader dr = cmd.ExecuteReader(); + while (dr.Read()) + { + int itemNr = dr.GetInt32(0); + if (itemNr > maxItemNr) maxItemNr = itemNr; + } + dr.Close(); + + cmd = dbConn.CreateCommand(); + cmd.CommandText = "UPDATE component SET ClassName = 'RegisterReader for standing start/stop' WHERE ClassName = 'Fixed-Start-Register-Reader'"; + cmd.ExecuteNonQuery(); + cmd.Dispose(); + + cmd = dbConn.CreateCommand(); + cmd.CommandText = "UPDATE component SET ClassName = 'TestMethods.iPerlCommunication' WHERE ClassName = 'iPerlCommunication'"; + cmd.ExecuteNonQuery(); + cmd.Dispose(); + + cmd = dbConn.CreateCommand(); + cmd.CommandText = "UPDATE component SET ClassName = 'WaterMeter' WHERE ClassName = 'iPerl'"; + cmd.ExecuteNonQuery(); + cmd.Dispose(); + + for (int i = 1; i <= 40; i++) + { + Text = string.Format("Upgrade selection: {0}/40", i); + + /// Read original iPerl water meter parameters + int id = 0; + string parameters = string.Empty; + + cmd = dbConn.CreateCommand(); + cmd.CommandText = string.Format("SELECT Id, Parameters FROM Component WHERE Name = 'iPerl{0}' AND ClassName = 'WaterMeter'", i); + dr = cmd.ExecuteReader(); + if (dr.Read()) + { + id = dr.GetInt32(0); + parameters = dr.GetString(1); + } + dr.Close(); + cmd.Dispose(); + + if (id != 0) + { + /// Rename iPerl water meter + cmd = dbConn.CreateCommand(); + cmd.CommandText = string.Format("UPDATE component SET Name = 'WM{0}' WHERE Name = 'iPerl{0}'", i); + cmd.ExecuteNonQuery(); + cmd.Dispose(); + + /// Create iPerl Head + cmd = dbConn.CreateCommand(); + cmd.CommandText = string.Format("INSERT INTO component(ItemNr, Name, ClassName, Parentname, Mode, Logging, Parameters) VALUES ({0}, 'iPerl{1}', 'RegisterReader for iPerl', '', 'Normal', 'Off', @params)", + maxItemNr + 1, i); + cmd.Parameters.AddWithValue("@params", parameters.Replace("WaterMeterCfg", "IperlHeadCfg")); + cmd.ExecuteNonQuery(); + cmd.Dispose(); + + /// Clone procedure parameters + IList idList = new List(); + IList parList = new List(); + IList procIdList = new List(); + cmd = dbConn.CreateCommand(); + cmd.CommandText = string.Format("SELECT Id, Parameters, Procedure_id FROM componentprocedure WHERE CmpntName = 'iPerl{0}'", i); + dr = cmd.ExecuteReader(); + while (dr.Read()) + { + idList.Add(dr.GetInt32(0)); + parList.Add(dr.GetString(1)); + procIdList.Add(dr.GetInt32(2)); + } + dr.Close(); + cmd.Dispose(); + + if ((idList.Count == parList.Count) && (parList.Count == procIdList.Count)) + { + for (int j = 0; j < parList.Count; j++) + { + cmd = dbConn.CreateCommand(); + cmd.CommandText = string.Format("INSERT INTO componentprocedure(CmpntName, Parameters, Procedure_id) VALUES ('WM{0}', @params, {1})", + i, procIdList[j]); + cmd.Parameters.AddWithValue("@params", parList[j].Replace("Q4", "Qmax") + .Replace("Q3", "Qn") + .Replace("Q2", "Qt") + .Replace("Q1", "Qmin") + .Replace("", "true\r\n ")); + cmd.ExecuteNonQuery(); + cmd.Dispose(); + } + } + } + } + + /// Delete 'Parmeters' of iPerl water meters + cmd = dbConn.CreateCommand(); + cmd.CommandText = "UPDATE component SET Parameters = '\r\n\r\n' WHERE ClassName = 'WaterMeter'"; + cmd.ExecuteNonQuery(); + cmd.Dispose(); + + Text = string.Format("Upgrade selection"); + ActivityEnd(); + MessageBox.Show("DB succesfully upgraded", "Confirmation", MessageBoxButtons.OK, MessageBoxIcon.Information); + upgradeDb_212_215_Button.Enabled = false; + } + catch (Exception exc) + { + log.ErrorFormat(string.Format("Exception when upgrading DB: {0}", exc.Message)); + if (exc.InnerException != null) log.ErrorFormat(string.Format("Inner exception: {0}", exc.InnerException.Message)); + ActivityEnd(); + MessageBox.Show(string.Format("Exception {0}", exc.Message), "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + } + finally + { + dbConn.Close(); + } + } + else + { + ActivityEnd(); + MessageBox.Show("DB succesfully upgraded", "Confirmation", MessageBoxButtons.OK, MessageBoxIcon.Information); + upgradeDb_212_215_Button.Enabled = false; + } + } + } + + ///--------------------------------------------------------------------- + private void upgradeDb_215_216_Button_Click(object sender, EventArgs e) + { + if (!upgradeConfigDBCheckBox.Checked && !upgradeResultsDBCheckBox.Checked) + { + MessageBox.Show("No database selected"); + return; + } + + string[] commands = new string[] + { + "ALTER TABLE `testrslt` ADD `ErrorFlagsMd` TINYINT( 4 ) NOT NULL DEFAULT '0' AFTER `ErrorMaster`, ADD `ErrorFlags` INT NOT NULL DEFAULT '0' AFTER `ErrorFlagsMd`;", + }; + + ActivityStart(); + + if (!upgradeResultsDBCheckBox.Checked || ExecuteCommands(new MySqlConnection(Results.DB.ConnectionString), commands)) + { + ActivityEnd(); + MessageBox.Show("DB succesfully upgraded", "Confirmation", MessageBoxButtons.OK, MessageBoxIcon.Information); + upgradeDb_215_216_Button.Enabled = false; + } + } + + ///--------------------------------------------------------------------- + private void upgradeDb_216_217_Button_Click(object sender, EventArgs e) + { + if (!upgradeConfigDBCheckBox.Checked && !upgradeResultsDBCheckBox.Checked) + { + MessageBox.Show("No database selected"); + return; + } + + string[] commands = new string[] + { + "ALTER TABLE `testrslt` ADD `DiverterStart` FLOAT NOT NULL DEFAULT '0.001' AFTER `ErrorMaster`, ADD `DiverterEnd` FLOAT NOT NULL DEFAULT '0.001' AFTER `DiverterStart`;", + "ALTER TABLE `watermeter` ADD `ErrorFlags` INT NOT NULL DEFAULT '0' AFTER `QFall`;", + }; + + ActivityStart(); + + if (!upgradeResultsDBCheckBox.Checked || ExecuteCommands(new MySqlConnection(Results.DB.ConnectionString), commands)) + { + ActivityEnd(); + MessageBox.Show("DB succesfully upgraded", "Confirmation", MessageBoxButtons.OK, MessageBoxIcon.Information); + upgradeDb_216_217_Button.Enabled = false; + } + } + + ///--------------------------------------------------------------------- + private void upgradeDb_217_218_Button_Click(object sender, EventArgs e) + { + if (!upgradeConfigDBCheckBox.Checked && !upgradeResultsDBCheckBox.Checked) + { + MessageBox.Show("No database selected"); + return; + } + + string[] commands = new string[] + { + "ALTER TABLE `measurementcorrection` ADD `RangeIx` INT NOT NULL DEFAULT '0' AFTER `Id`;", + }; + + ActivityStart(); + + if (!upgradeConfigDBCheckBox.Checked || ExecuteCommands(new MySqlConnection(Config.Data.CurrentBench.ProceduresDBSettings.ConnectionString), commands)) + { + ActivityEnd(); + MessageBox.Show("DB succesfully upgraded", "Confirmation", MessageBoxButtons.OK, MessageBoxIcon.Information); + upgradeDb_217_218_Button.Enabled = false; + } + } + + ///--------------------------------------------------------------------- + private void upgradeDb_218_220_Button_Click(object sender, EventArgs e) + { + if (!upgradeConfigDBCheckBox.Checked && !upgradeResultsDBCheckBox.Checked) + { + MessageBox.Show("No database selected"); + return; + } + + string[] commands = new string[] + { + "ALTER TABLE `metertestrslt` ADD `RegReaderType` INT NOT NULL DEFAULT '0' AFTER `CompoundMeterId`;", + "ALTER TABLE `testrslt` ADD `MethodClass` VARCHAR(255) NULL DEFAULT NULL AFTER `RepetitionNr`, ADD `ConstMasterRaw` DOUBLE NOT NULL DEFAULT '1' AFTER `PulsesMaster`, ADD `ConstMasterCorr` DOUBLE NOT NULL DEFAULT '1' AFTER `ConstMasterRaw`;", + "ALTER TABLE `watermeterdata` ADD `Medium` VARCHAR(255) NULL DEFAULT NULL AFTER `ApprovalInfoAux`;", + }; + + ActivityStart(); + + if (!upgradeResultsDBCheckBox.Checked || ExecuteCommands(new MySqlConnection(Results.DB.ConnectionString), commands)) + { + ActivityEnd(); + MessageBox.Show("DB succesfully upgraded", "Confirmation", MessageBoxButtons.OK, MessageBoxIcon.Information); + upgradeDb_218_220_Button.Enabled = false; + } + } + + private void pressureRepresentationButton_Click(object sender, EventArgs e) + { + try + { + batchFrom = int.Parse(textBox1.Text); + batchTo = int.Parse(textBox2.Text); + if (batchFrom < 1 || batchFrom > batchTo) throw new Exception(); + } + catch + { + MessageBox.Show("Wrong 'From batch #' or 'To batch #'", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + return; + } + + if (MessageBox.Show("Are you sure ?", "", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return; + + ActivityStart(); + + try + { + ISession session = Results.DB.CreateSession(); + + IList bFrom = session.QueryOver().Where(x => (x.BatchNr == batchFrom)).List(); + IList bTo = session.QueryOver().Where(x => (x.BatchNr == batchTo)).List(); + + if (bFrom.Count != 1) throw new Exception("No start batch"); + if (bTo.Count != 1) throw new Exception("No end batch"); + + IList testResults = session.QueryOver() + .WhereRestrictionOn(x => x.StartTime) + .IsBetween(bFrom[0].StartTime) + .And(bTo[0].EndTime) + .List(); + + foreach (var tr in testResults) + { + Text = string.Format("Batch # = {0}", tr.Batch.BatchNr); + + float factor1 = 0.01f; + + tr.PressUpMean *= factor1; + tr.PressUpStart *= factor1; + tr.PressUpEnd *= factor1; + tr.PressUpMin *= factor1; + tr.PressUpMax *= factor1; + + tr.PressDownMean *= factor1; + tr.PressDownStart *= factor1; + tr.PressDownEnd *= factor1; + tr.PressDownMin *= factor1; + tr.PressDownMax *= factor1; + + tr.AmbPressMean *= 0.001f; + + session.SaveOrUpdate(tr); + } + + session.Flush(); + ActivityEnd(); + MessageBox.Show("Upgrade completed", "", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + catch (Exception exc) + { + ActivityEnd(); + MessageBox.Show(string.Format("Upgrade failed:\r\n{0}", exc.Message), + "Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Forms/UpgradeSelectionDlg.resx b/TBF_V2/Sources/TBF/TBF/Forms/UpgradeSelectionDlg.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Forms/UpgradeSelectionDlg.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/LocalSettings.cs b/TBF_V2/Sources/TBF/TBF/LocalSettings.cs new file mode 100644 index 00000000..88b13585 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/LocalSettings.cs @@ -0,0 +1,356 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; + +namespace TBF +{ + /// + /// Class to be serialized to an XML file... + /// Public members are local settings. + /// These settings are modified by dialogs invoked by menu items + /// Edit->Preferences ... PreferencesDlg ... S1.1(language, etc. local settings), and + /// Edit->Advanced settings ... AdvancedSettingsDlg ... S1.2(spec. where bench settings are stored) + /// + [XmlRootAttribute("TestBenchFramework")] + public class LocalSettings + { + static XmlSerializer serializer = XmlSerializer.FromTypes(new[] { typeof(LocalSettings) })[0]; + + /// + /// User interface language (used as CultureInfo(..) constructor argument). + /// + public string Language = "en"; + + /// + /// Names and database settings of test benches. + /// + [XmlArrayAttribute("TestBenches")] + public Config.DatabaseSettings[] TestBenches; + + [XmlIgnore] + public int BenchesCount { get { return (TestBenches != null) ? TestBenches.GetLength(0) : 0; } } + + /// + /// Login method: UserName, FullName or Number + /// + public Users.Entities.LoginMethod LoginMethod; + + /// + /// Currently selected bench name (local or remote) or null (= no selection done). + /// + [XmlElementAttribute("LastBench")] + public string LastBenchName; + + /// + /// Currently selected procedure name or null (= no selection done yet). + /// + [XmlElementAttribute("LastProcedure")] + public string LastProcedureName; + public Users.Entities.DBKind LastProcedureDB; + public int LastProcedureNr; + public int BatchNr; + + public double RealDensity; /// water density [kg/m3] + public double AtTemperature; /// measured at temperature [degree C] + + public int RightPaneHorizSplitterDistance; + public int TopPaneVerticalSplitterDistance; + + /// MainWnd + public int MainWndLeft; + public int MainWndTop; + public int MainWndWidth; + public int MainWndHeight; + public bool ManiWndMaximized; + + /// Components + public int ComponentsDlgLeft; + public int ComponentsDlgTop; + public int ComponentsDlgWidth; + public int ComponentsDlgHeight; + + /// Pop-up results + public int PopupResultsLeft; + public int PopupResultsTop; + public int PopupResultsWidth; + public int PopupResultsHeight; + + public Config.Entities.CameraDisplayResolution Resolution; + + + [XmlArrayAttribute("ComponentsColumnWidths")] + public int[] ComponentsColumnWidths; + [XmlIgnore] + public int ComponentsColumnCount { get { return (ComponentsColumnWidths != null) ? ComponentsColumnWidths.Length : 0; } } + + /// Paths + public int PathsDlgLeft; + public int PathsDlgTop; + public int PathsDlgWidth; + public int PathsDlgHeight; + + /// iPerlCommunicationsForm + public int iPerlCommunicationsFormLeft; + public int iPerlCommunicationsFormTop; + public long iPerlCommunicationsFormCheckboxes; + + [XmlArrayAttribute("FeedingColumnWidths")] + public int[] FeedingColumnWidths; + [XmlIgnore] + public int FeedingColumnCount { get { return (FeedingColumnWidths != null) ? FeedingColumnWidths.Length : 0; } } + + [XmlArrayAttribute("BenchColumnWidths")] + public int[] BenchColumnWidths; + [XmlIgnore] + public int BenchColumnCount { get { return (BenchColumnWidths != null) ? BenchColumnWidths.Length : 0; } } + + [XmlArrayAttribute("OutputColumnWidths")] + public int[] OutputColumnWidths; + [XmlIgnore] + public int OutputColumnCount { get { return (OutputColumnWidths != null) ? OutputColumnWidths.Length : 0; } } + + [XmlArrayAttribute("MetersColumnWidths")] + public int[] MetersColumnWidths; + [XmlIgnore] + public int MetersColumnCount { get { return (MetersColumnWidths != null) ? MetersColumnWidths.Length : 0; } } + + [XmlArrayAttribute("HeatMetersColumnWidths")] + public int[] HeatMetersColumnWidths; + [XmlIgnore] + public int HeatMetersColumnCount { get { return (HeatMetersColumnWidths != null) ? HeatMetersColumnWidths.Length : 0; } } + + /// Transitions + public int TransitionsDlgLeft; + public int TransitionsDlgTop; + public int TransitionsDlgWidth; + public int TransitionsDlgHeight; + + [XmlArrayAttribute("TransitionsColumnWidths")] + public int[] TransitionsColumnWidths; + [XmlIgnore] + public int TransitionsColumnCount { get { return (TransitionsColumnWidths != null) ? TransitionsColumnWidths.Length : 0; } } + + /// Metrology + public int MetrologyDlgLeft; + public int MetrologyDlgTop; + public int MetrologyDlgWidth; + public int MetrologyDlgHeight; + + + /// Procedures + public int ProceduresDlgLeft; + public int ProceduresDlgTop; + public int ProceduresDlgWidth; + public int ProceduresDlgHeight; + + [XmlArrayAttribute("ProceduresColumnWidths")] + public int[] ProceduresColumnWidths; + [XmlIgnore] + public int ProceduresColumnCount { get { return (ProceduresColumnWidths != null) ? ProceduresColumnWidths.Length : 0; } } + + /// OneProcedure + public int OneProcedureDlgLeft; + public int OneProcedureDlgTop; + public int OneProcedureDlgWidth; + public int OneProcedureDlgHeight; + + public int PrintOrderLeft; + public int PrintOrderTop; + + [XmlArrayAttribute("HistoryColumnWidths")] + public int[] HistoryColumnWidths; + [XmlIgnore] + public int HistoryColumnCount { get { return (HistoryColumnWidths != null) ? HistoryColumnWidths.Length : 0; } } + + /// Endurance test cycle steps + public int EnduranceDlgLeft; + public int EnduranceDlgTop; + public int EnduranceDlgWidth; + public int EnduranceDlgHeight; + + /// Serial numbers + public string[] LastSNTexts; + [XmlIgnore] + public int LastSNTextsCount { get { return (LastSNTexts != null) ? LastSNTexts.Length : 0; } } + + public string[] LastMainSNTexts; + [XmlIgnore] + public int LastMainSNTextsCount { get { return (LastMainSNTexts != null) ? LastMainSNTexts.Length : 0; } } + + public string[] LastAuxSNTexts; + [XmlIgnore] + public int LastAuxSNTextsCount { get { return (LastAuxSNTexts != null) ? LastAuxSNTexts.Length : 0; } } + + public string LastText1; + public string LastText2; + public string LastText3; + public string LastRemark; + + + /// Purchase order history + public string[] PurchaseOrderHistory; + [XmlIgnore] + public int PurchaseOrderHistoryCount { get { return (PurchaseOrderHistory != null) ? PurchaseOrderHistory.Length : 0; } } + + /// Tester history + public string[] TesterHistory; + [XmlIgnore] + public int TesterHistoryCount { get { return (TesterHistory != null) ? TesterHistory.Length : 0; } } + + public bool PrintOrderOnlyGoodResult; + public bool PrintOrderOnlyLastResult; + + /// Legalizator history + public string[] LastLegalizators; + [XmlIgnore] + public int LastLegalizatorsCount { get { return (LastLegalizators != null) ? LastLegalizators.Length : 0; } } + + /// Configuration of results + public Config.Entities.MetersArrangement ResultsConfigMeters; + public Config.Entities.TestsArrangement ResultsConfigTests; + public int ResultsConfigMetersInOneGroup; + public string[] RsltItems_Screen_SingleWM; + public string[] RsltItems_Screen_CombinedWM; + public string[] RsltItems_Screen_HeatM; + + /// Configuration of graphs + public bool Graph1_On; + public bool Graph2_On; + public bool Graph3_On; + public bool Graph4_On; + public bool Graph5_On; + public bool Graph6_On; + public bool Graph7_On; + public bool Graph8_On; + public GraphLib.PlotterGraphPaneEx.LayoutMode GraphsLayoutMode; + + [XmlArrayAttribute("RsltsClmnWidths")] + public int[] RsltsClmnWidths; + [XmlIgnore] + public int RsltsClmnCount { get { return (RsltsClmnWidths != null) ? RsltsClmnWidths.Length : 0; } } + + [XmlIgnore] + public readonly bool AlwaysAskPasswdWhenUnlocking; + + [XmlIgnore] + public readonly bool RestoreUserWhenLeavingDialog; + + + public LocalSettings() + { + AlwaysAskPasswdWhenUnlocking = false; + RestoreUserWhenLeavingDialog = true; + } + + /// + /// Load public fields of this class from the XML file. + /// + /// LocalSettings object or null when Load() fails + public static LocalSettings Load(string fileName) + { + try + { + using (TextReader reader = new StreamReader(fileName)) + { + LocalSettings ls = serializer.Deserialize(reader) as LocalSettings; + + if (ls.RealDensity < 500 || ls.RealDensity > 1500) + { + /// Use default value if density was not set yet + ls.RealDensity = 998.2008; /// kg/m3 + ls.AtTemperature = 20.0; /// deg.C + } + + UpdateResultsOutputData(ls); + + return ls; + } + } + catch (Exception e) + { + string msg = e.Message; + return null; + } + } + + /// + /// Save public fields of this class to the XML file. + /// + public void Save() + { + try + { + UpdateResultsOutputData(this); + + using (TextWriter writer = new StreamWriter(Program.LocalSettingsFileName)) + { + serializer.Serialize(writer, this); + } + } + catch (Exception e) + { + string msg = e.Message; + } + } + + + private static void UpdateResultsOutputData(LocalSettings ls) + { + Results.WMeterRsltItemSpec.RealDensity = ls.RealDensity; + Results.WMeterRsltItemSpec.AtTemperature = ls.AtTemperature; + } + + + /// + /// Updates history stored in a string array by a new latest string. + /// + /// Lste entered string + /// true = updated and saved + public bool UpdateHistory(string lastStrValue, ref string[] history, int maxHistoryLen = 10) + { + if (string.IsNullOrEmpty(lastStrValue)) return false; + + int currentHistoryCount = (history != null) ? history.Length : 0; + + int match = -1; + for (int i = 0; i < currentHistoryCount; i++) + { + if (history[i] == lastStrValue) + { + match = i; + break; + } + } + + if (match >= 0 || currentHistoryCount >= maxHistoryLen) + { + /// History does not have to be (because of a match) or should not be extended (because of the lenght) + if (match < 0) match = currentHistoryCount - 1; + + for (int j = match; j > 0; j--) + { + history[j] = history[j - 1]; + } + history[0] = lastStrValue; + } + else + { + /// History wiil be extended, new item inserted at the beginning + string[] newHistory = new string[currentHistoryCount + 1]; + newHistory[0] = lastStrValue; + for (int j = 1; j <= currentHistoryCount; j++) + { + newHistory[j] = history[j - 1]; + } + history = newHistory; + } + Save(); + return true; + } + + } +} diff --git a/TBF_V2/Sources/TBF/TBF/MainWnd.Designer.cs b/TBF_V2/Sources/TBF/TBF/MainWnd.Designer.cs new file mode 100644 index 00000000..169f8ccc --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/MainWnd.Designer.cs @@ -0,0 +1,736 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +namespace TBF +{ + partial class MainWnd + { + /// + /// 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) + { + try + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + catch(System.Exception) + { + } + } + + #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(MainWnd)); + this.topVerticalSplitContainer = new System.Windows.Forms.SplitContainer(); + this.activityGroupBox = new System.Windows.Forms.GroupBox(); + this.messageLabel = new System.Windows.Forms.Label(); + this.activityLabel = new System.Windows.Forms.Label(); + this.topHorizontalSplitContainer = new System.Windows.Forms.SplitContainer(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.procedureGroupBox = new System.Windows.Forms.GroupBox(); + this.procedureComboBox = new System.Windows.Forms.ComboBox(); + this.progressGroupBox = new System.Windows.Forms.GroupBox(); + this.mainProgressBar = new System.Windows.Forms.ProgressBar(); + this.descriptionGroupBox = new System.Windows.Forms.GroupBox(); + this.descriptionLabel = new System.Windows.Forms.Label(); + this.verticalSplitContainer = new System.Windows.Forms.SplitContainer(); + this.horizontalSplitContainer = new System.Windows.Forms.SplitContainer(); + this.mainTabControl = new System.Windows.Forms.TabControl(); + this.homeTabPage = new System.Windows.Forms.TabPage(); + this.ctrlBrdComponent = new ControlComponent_Izrael2014.UserControl1(); + this.processTabPage = new System.Windows.Forms.TabPage(); + this.processTabPageCtrl = new TBF.Screens.ProcessTabPageCtrl6(); + this.insertTabPage = new System.Windows.Forms.TabPage(); + this.resultsTabPage = new System.Windows.Forms.TabPage(); + this.resultsTabPageCtrl = new TBF.Screens.ResultsTabPageCtrl(); + this.graphsTabPage = new System.Windows.Forms.TabPage(); + this.graphsTabPageCtrl = new TBF.Screens.GraphsTabPageCtrl(); + this.logsTabPage = new System.Windows.Forms.TabPage(); + this.logsTabPageCtrl = new TBF.Screens.LogsTabPageCtrl(); + this.picturesTabPage = new System.Windows.Forms.TabPage(); + this.picturesTabPageCtrl = new TBF.Screens.PicturesTabPageCtrl(); + this.rightHorizSplitContainer = new System.Windows.Forms.SplitContainer(); + this.progressFlowLayoutPanel = new System.Windows.Forms.FlowLayoutPanel(); + this.measurementTabPage = new System.Windows.Forms.TabPage(); + this.MeasurementTabPageCtrl = new TBF.Screens.MeasurementTabPageCtrl(); + this.statusStrip1 = new System.Windows.Forms.StatusStrip(); + this.userInfoStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); + this.statusPStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); + this.routeStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); + this.activityStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); + this.benchTSMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.benchComponentsTSMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.benchPathsTSMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.benchTransitionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.benchMetrologyTSMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.homeTSMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.resultsTSMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.logsTSMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.editTSMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.usersTSMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.localSettingsTSMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.databaseSettingsTSMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.passwortToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.upgradeTSMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.helpTSMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.aboutTSMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.mainMenuStrip = new System.Windows.Forms.MenuStrip(); + this.proceduresToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.processToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.resultsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.graphsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.iPerlHeadsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + ((System.ComponentModel.ISupportInitialize)(this.topVerticalSplitContainer)).BeginInit(); + this.topVerticalSplitContainer.Panel1.SuspendLayout(); + this.topVerticalSplitContainer.Panel2.SuspendLayout(); + this.topVerticalSplitContainer.SuspendLayout(); + this.activityGroupBox.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.topHorizontalSplitContainer)).BeginInit(); + this.topHorizontalSplitContainer.Panel1.SuspendLayout(); + this.topHorizontalSplitContainer.Panel2.SuspendLayout(); + this.topHorizontalSplitContainer.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.procedureGroupBox.SuspendLayout(); + this.progressGroupBox.SuspendLayout(); + this.descriptionGroupBox.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.verticalSplitContainer)).BeginInit(); + this.verticalSplitContainer.Panel1.SuspendLayout(); + this.verticalSplitContainer.Panel2.SuspendLayout(); + this.verticalSplitContainer.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.horizontalSplitContainer)).BeginInit(); + this.horizontalSplitContainer.Panel1.SuspendLayout(); + this.horizontalSplitContainer.Panel2.SuspendLayout(); + this.horizontalSplitContainer.SuspendLayout(); + this.mainTabControl.SuspendLayout(); + this.homeTabPage.SuspendLayout(); + this.processTabPage.SuspendLayout(); + this.resultsTabPage.SuspendLayout(); + this.graphsTabPage.SuspendLayout(); + this.logsTabPage.SuspendLayout(); + this.picturesTabPage.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.rightHorizSplitContainer)).BeginInit(); + this.rightHorizSplitContainer.Panel1.SuspendLayout(); + this.rightHorizSplitContainer.SuspendLayout(); + this.measurementTabPage.SuspendLayout(); + this.statusStrip1.SuspendLayout(); + this.mainMenuStrip.SuspendLayout(); + this.SuspendLayout(); + // + // topVerticalSplitContainer + // + resources.ApplyResources(this.topVerticalSplitContainer, "topVerticalSplitContainer"); + this.topVerticalSplitContainer.Name = "topVerticalSplitContainer"; + // + // topVerticalSplitContainer.Panel1 + // + this.topVerticalSplitContainer.Panel1.Controls.Add(this.activityGroupBox); + resources.ApplyResources(this.topVerticalSplitContainer.Panel1, "topVerticalSplitContainer.Panel1"); + // + // topVerticalSplitContainer.Panel2 + // + this.topVerticalSplitContainer.Panel2.Controls.Add(this.topHorizontalSplitContainer); + resources.ApplyResources(this.topVerticalSplitContainer.Panel2, "topVerticalSplitContainer.Panel2"); + // + // activityGroupBox + // + this.activityGroupBox.Controls.Add(this.messageLabel); + this.activityGroupBox.Controls.Add(this.activityLabel); + resources.ApplyResources(this.activityGroupBox, "activityGroupBox"); + this.activityGroupBox.Name = "activityGroupBox"; + this.activityGroupBox.TabStop = false; + // + // messageLabel + // + resources.ApplyResources(this.messageLabel, "messageLabel"); + this.messageLabel.Name = "messageLabel"; + // + // activityLabel + // + resources.ApplyResources(this.activityLabel, "activityLabel"); + this.activityLabel.Name = "activityLabel"; + // + // topHorizontalSplitContainer + // + resources.ApplyResources(this.topHorizontalSplitContainer, "topHorizontalSplitContainer"); + this.topHorizontalSplitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.topHorizontalSplitContainer.Name = "topHorizontalSplitContainer"; + // + // topHorizontalSplitContainer.Panel1 + // + this.topHorizontalSplitContainer.Panel1.Controls.Add(this.splitContainer1); + // + // topHorizontalSplitContainer.Panel2 + // + this.topHorizontalSplitContainer.Panel2.Controls.Add(this.descriptionGroupBox); + // + // splitContainer1 + // + resources.ApplyResources(this.splitContainer1, "splitContainer1"); + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.procedureGroupBox); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.progressGroupBox); + // + // procedureGroupBox + // + this.procedureGroupBox.Controls.Add(this.procedureComboBox); + resources.ApplyResources(this.procedureGroupBox, "procedureGroupBox"); + this.procedureGroupBox.Name = "procedureGroupBox"; + this.procedureGroupBox.TabStop = false; + // + // procedureComboBox + // + resources.ApplyResources(this.procedureComboBox, "procedureComboBox"); + this.procedureComboBox.FormattingEnabled = true; + this.procedureComboBox.Name = "procedureComboBox"; + this.procedureComboBox.SelectedIndexChanged += new System.EventHandler(this.procedureComboBox_SelectedIndexChanged); + // + // progressGroupBox + // + this.progressGroupBox.Controls.Add(this.mainProgressBar); + resources.ApplyResources(this.progressGroupBox, "progressGroupBox"); + this.progressGroupBox.Name = "progressGroupBox"; + this.progressGroupBox.TabStop = false; + // + // mainProgressBar + // + resources.ApplyResources(this.mainProgressBar, "mainProgressBar"); + this.mainProgressBar.Name = "mainProgressBar"; + // + // descriptionGroupBox + // + this.descriptionGroupBox.Controls.Add(this.descriptionLabel); + resources.ApplyResources(this.descriptionGroupBox, "descriptionGroupBox"); + this.descriptionGroupBox.Name = "descriptionGroupBox"; + this.descriptionGroupBox.TabStop = false; + // + // descriptionLabel + // + resources.ApplyResources(this.descriptionLabel, "descriptionLabel"); + this.descriptionLabel.Name = "descriptionLabel"; + // + // verticalSplitContainer + // + resources.ApplyResources(this.verticalSplitContainer, "verticalSplitContainer"); + this.verticalSplitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.verticalSplitContainer.Name = "verticalSplitContainer"; + // + // verticalSplitContainer.Panel1 + // + this.verticalSplitContainer.Panel1.Controls.Add(this.horizontalSplitContainer); + // + // verticalSplitContainer.Panel2 + // + this.verticalSplitContainer.Panel2.Controls.Add(this.rightHorizSplitContainer); + // + // horizontalSplitContainer + // + resources.ApplyResources(this.horizontalSplitContainer, "horizontalSplitContainer"); + this.horizontalSplitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.horizontalSplitContainer.Name = "horizontalSplitContainer"; + // + // horizontalSplitContainer.Panel1 + // + this.horizontalSplitContainer.Panel1.BackColor = System.Drawing.SystemColors.Control; + this.horizontalSplitContainer.Panel1.Controls.Add(this.topVerticalSplitContainer); + // + // horizontalSplitContainer.Panel2 + // + this.horizontalSplitContainer.Panel2.Controls.Add(this.mainTabControl); + // + // mainTabControl + // + this.mainTabControl.Controls.Add(this.homeTabPage); + this.mainTabControl.Controls.Add(this.processTabPage); + this.mainTabControl.Controls.Add(this.insertTabPage); + this.mainTabControl.Controls.Add(this.resultsTabPage); + this.mainTabControl.Controls.Add(this.graphsTabPage); + this.mainTabControl.Controls.Add(this.logsTabPage); + this.mainTabControl.Controls.Add(this.picturesTabPage); + resources.ApplyResources(this.mainTabControl, "mainTabControl"); + this.mainTabControl.Name = "mainTabControl"; + this.mainTabControl.SelectedIndex = 0; + this.mainTabControl.SizeMode = System.Windows.Forms.TabSizeMode.Fixed; + // + // homeTabPage + // + this.homeTabPage.BackColor = System.Drawing.SystemColors.Control; + this.homeTabPage.Controls.Add(this.ctrlBrdComponent); + resources.ApplyResources(this.homeTabPage, "homeTabPage"); + this.homeTabPage.Name = "homeTabPage"; + // + // ctrlBrdComponent + // + this.ctrlBrdComponent.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); + resources.ApplyResources(this.ctrlBrdComponent, "ctrlBrdComponent"); + this.ctrlBrdComponent.Name = "ctrlBrdComponent"; + // + // processTabPage + // + this.processTabPage.Controls.Add(this.processTabPageCtrl); + resources.ApplyResources(this.processTabPage, "processTabPage"); + this.processTabPage.Name = "processTabPage"; + this.processTabPage.UseVisualStyleBackColor = true; + // + // processTabPageCtrl + // + this.processTabPageCtrl.BackColor = System.Drawing.SystemColors.Control; + resources.ApplyResources(this.processTabPageCtrl, "processTabPageCtrl"); + this.processTabPageCtrl.Name = "processTabPageCtrl"; + // + // insertTabPage + // + this.insertTabPage.BackColor = System.Drawing.Color.Silver; + resources.ApplyResources(this.insertTabPage, "insertTabPage"); + this.insertTabPage.Name = "insertTabPage"; + // + // resultsTabPage + // + this.resultsTabPage.Controls.Add(this.resultsTabPageCtrl); + resources.ApplyResources(this.resultsTabPage, "resultsTabPage"); + this.resultsTabPage.Name = "resultsTabPage"; + this.resultsTabPage.UseVisualStyleBackColor = true; + // + // resultsTabPageCtrl + // + this.resultsTabPageCtrl.BackColor = System.Drawing.SystemColors.Control; + resources.ApplyResources(this.resultsTabPageCtrl, "resultsTabPageCtrl"); + this.resultsTabPageCtrl.Name = "resultsTabPageCtrl"; + // + // graphsTabPage + // + this.graphsTabPage.Controls.Add(this.graphsTabPageCtrl); + resources.ApplyResources(this.graphsTabPage, "graphsTabPage"); + this.graphsTabPage.Name = "graphsTabPage"; + this.graphsTabPage.UseVisualStyleBackColor = true; + // + // graphsTabPageCtrl + // + this.graphsTabPageCtrl.BackColor = System.Drawing.Color.Silver; + resources.ApplyResources(this.graphsTabPageCtrl, "graphsTabPageCtrl"); + this.graphsTabPageCtrl.Name = "graphsTabPageCtrl"; + // + // logsTabPage + // + this.logsTabPage.Controls.Add(this.logsTabPageCtrl); + resources.ApplyResources(this.logsTabPage, "logsTabPage"); + this.logsTabPage.Name = "logsTabPage"; + this.logsTabPage.UseVisualStyleBackColor = true; + // + // logsTabPageCtrl + // + this.logsTabPageCtrl.BackColor = System.Drawing.SystemColors.Control; + resources.ApplyResources(this.logsTabPageCtrl, "logsTabPageCtrl"); + this.logsTabPageCtrl.Name = "logsTabPageCtrl"; + // + // picturesTabPage + // + this.picturesTabPage.Controls.Add(this.picturesTabPageCtrl); + resources.ApplyResources(this.picturesTabPage, "picturesTabPage"); + this.picturesTabPage.Name = "picturesTabPage"; + this.picturesTabPage.UseVisualStyleBackColor = true; + // + // picturesTabPageCtrl + // + this.picturesTabPageCtrl.BackColor = System.Drawing.Color.Silver; + resources.ApplyResources(this.picturesTabPageCtrl, "picturesTabPageCtrl"); + this.picturesTabPageCtrl.Name = "picturesTabPageCtrl"; + // + // rightHorizSplitContainer + // + resources.ApplyResources(this.rightHorizSplitContainer, "rightHorizSplitContainer"); + this.rightHorizSplitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.rightHorizSplitContainer.Name = "rightHorizSplitContainer"; + // + // rightHorizSplitContainer.Panel1 + // + this.rightHorizSplitContainer.Panel1.Controls.Add(this.progressFlowLayoutPanel); + // + // progressFlowLayoutPanel + // + resources.ApplyResources(this.progressFlowLayoutPanel, "progressFlowLayoutPanel"); + this.progressFlowLayoutPanel.BackColor = System.Drawing.SystemColors.Control; + this.progressFlowLayoutPanel.Name = "progressFlowLayoutPanel"; + // + // measurementTabPage + // + this.measurementTabPage.Controls.Add(this.MeasurementTabPageCtrl); + resources.ApplyResources(this.measurementTabPage, "measurementTabPage"); + this.measurementTabPage.Name = "measurementTabPage"; + this.measurementTabPage.UseVisualStyleBackColor = true; + // + // MeasurementTabPageCtrl + // + this.MeasurementTabPageCtrl.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(150)))), ((int)(((byte)(180)))), ((int)(((byte)(200))))); + resources.ApplyResources(this.MeasurementTabPageCtrl, "MeasurementTabPageCtrl"); + this.MeasurementTabPageCtrl.Name = "MeasurementTabPageCtrl"; + // + // statusStrip1 + // + this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.userInfoStatusLabel, + this.statusPStatusLabel, + this.routeStatusLabel, + this.activityStatusLabel}); + resources.ApplyResources(this.statusStrip1, "statusStrip1"); + this.statusStrip1.Name = "statusStrip1"; + // + // userInfoStatusLabel + // + this.userInfoStatusLabel.Name = "userInfoStatusLabel"; + resources.ApplyResources(this.userInfoStatusLabel, "userInfoStatusLabel"); + // + // statusPStatusLabel + // + this.statusPStatusLabel.Name = "statusPStatusLabel"; + resources.ApplyResources(this.statusPStatusLabel, "statusPStatusLabel"); + // + // routeStatusLabel + // + this.routeStatusLabel.Name = "routeStatusLabel"; + resources.ApplyResources(this.routeStatusLabel, "routeStatusLabel"); + // + // activityStatusLabel + // + this.activityStatusLabel.Name = "activityStatusLabel"; + resources.ApplyResources(this.activityStatusLabel, "activityStatusLabel"); + // + // benchTSMenuItem + // + this.benchTSMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.benchComponentsTSMenuItem, + this.benchPathsTSMenuItem, + this.benchTransitionsToolStripMenuItem, + this.benchMetrologyTSMenuItem, + this.toolStripSeparator1, + this.exitToolStripMenuItem}); + this.benchTSMenuItem.Name = "benchTSMenuItem"; + resources.ApplyResources(this.benchTSMenuItem, "benchTSMenuItem"); + // + // benchComponentsTSMenuItem + // + this.benchComponentsTSMenuItem.Name = "benchComponentsTSMenuItem"; + resources.ApplyResources(this.benchComponentsTSMenuItem, "benchComponentsTSMenuItem"); + this.benchComponentsTSMenuItem.Click += new System.EventHandler(this.benchComponentsTSMItem_Click); + // + // benchPathsTSMenuItem + // + this.benchPathsTSMenuItem.Name = "benchPathsTSMenuItem"; + resources.ApplyResources(this.benchPathsTSMenuItem, "benchPathsTSMenuItem"); + this.benchPathsTSMenuItem.Click += new System.EventHandler(this.benchPathsTSMItem_Click); + // + // benchTransitionsToolStripMenuItem + // + this.benchTransitionsToolStripMenuItem.Name = "benchTransitionsToolStripMenuItem"; + resources.ApplyResources(this.benchTransitionsToolStripMenuItem, "benchTransitionsToolStripMenuItem"); + this.benchTransitionsToolStripMenuItem.Click += new System.EventHandler(this.benchTransitionsTSMItem_Click); + // + // benchMetrologyTSMenuItem + // + this.benchMetrologyTSMenuItem.Name = "benchMetrologyTSMenuItem"; + resources.ApplyResources(this.benchMetrologyTSMenuItem, "benchMetrologyTSMenuItem"); + this.benchMetrologyTSMenuItem.Click += new System.EventHandler(this.benchMetrologyTSMItem_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); + // + // exitToolStripMenuItem + // + this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; + resources.ApplyResources(this.exitToolStripMenuItem, "exitToolStripMenuItem"); + this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click); + // + // homeTSMenuItem + // + this.homeTSMenuItem.Name = "homeTSMenuItem"; + resources.ApplyResources(this.homeTSMenuItem, "homeTSMenuItem"); + this.homeTSMenuItem.Click += new System.EventHandler(this.homeTSMenuItem_Click); + // + // resultsTSMenuItem + // + this.resultsTSMenuItem.Name = "resultsTSMenuItem"; + resources.ApplyResources(this.resultsTSMenuItem, "resultsTSMenuItem"); + // + // logsTSMenuItem + // + this.logsTSMenuItem.Name = "logsTSMenuItem"; + resources.ApplyResources(this.logsTSMenuItem, "logsTSMenuItem"); + this.logsTSMenuItem.Click += new System.EventHandler(this.logsTSMenuItem_Click); + // + // editTSMenuItem + // + this.editTSMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.usersTSMenuItem, + this.localSettingsTSMenuItem, + this.databaseSettingsTSMenuItem, + this.passwortToolStripMenuItem, + this.upgradeTSMenuItem, + this.iPerlHeadsToolStripMenuItem}); + this.editTSMenuItem.Name = "editTSMenuItem"; + resources.ApplyResources(this.editTSMenuItem, "editTSMenuItem"); + // + // usersTSMenuItem + // + this.usersTSMenuItem.Name = "usersTSMenuItem"; + resources.ApplyResources(this.usersTSMenuItem, "usersTSMenuItem"); + this.usersTSMenuItem.Click += new System.EventHandler(this.usersTSMItem_Click); + // + // localSettingsTSMenuItem + // + this.localSettingsTSMenuItem.Name = "localSettingsTSMenuItem"; + resources.ApplyResources(this.localSettingsTSMenuItem, "localSettingsTSMenuItem"); + this.localSettingsTSMenuItem.Click += new System.EventHandler(this.localSettingsTSMItem_Click); + // + // databaseSettingsTSMenuItem + // + this.databaseSettingsTSMenuItem.Name = "databaseSettingsTSMenuItem"; + resources.ApplyResources(this.databaseSettingsTSMenuItem, "databaseSettingsTSMenuItem"); + this.databaseSettingsTSMenuItem.Click += new System.EventHandler(this.databaseSettingsTSMItem_Click); + // + // passwortToolStripMenuItem + // + this.passwortToolStripMenuItem.Name = "passwortToolStripMenuItem"; + resources.ApplyResources(this.passwortToolStripMenuItem, "passwortToolStripMenuItem"); + // + // upgradeTSMenuItem + // + this.upgradeTSMenuItem.Name = "upgradeTSMenuItem"; + resources.ApplyResources(this.upgradeTSMenuItem, "upgradeTSMenuItem"); + this.upgradeTSMenuItem.Click += new System.EventHandler(this.upgradeTSMenuItem_Click); + // + // helpTSMenuItem + // + this.helpTSMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.aboutTSMenuItem}); + this.helpTSMenuItem.Name = "helpTSMenuItem"; + resources.ApplyResources(this.helpTSMenuItem, "helpTSMenuItem"); + // + // aboutTSMenuItem + // + this.aboutTSMenuItem.Name = "aboutTSMenuItem"; + resources.ApplyResources(this.aboutTSMenuItem, "aboutTSMenuItem"); + this.aboutTSMenuItem.Click += new System.EventHandler(this.aboutTSMItem_Click); + // + // mainMenuStrip + // + this.mainMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.benchTSMenuItem, + this.proceduresToolStripMenuItem, + this.homeTSMenuItem, + this.processToolStripMenuItem, + this.resultsToolStripMenuItem, + this.graphsToolStripMenuItem, + this.logsTSMenuItem, + this.editTSMenuItem, + this.helpTSMenuItem}); + resources.ApplyResources(this.mainMenuStrip, "mainMenuStrip"); + this.mainMenuStrip.Name = "mainMenuStrip"; + // + // proceduresToolStripMenuItem + // + this.proceduresToolStripMenuItem.Name = "proceduresToolStripMenuItem"; + resources.ApplyResources(this.proceduresToolStripMenuItem, "proceduresToolStripMenuItem"); + this.proceduresToolStripMenuItem.Click += new System.EventHandler(this.proceduresTSMItem_Click); + // + // processToolStripMenuItem + // + this.processToolStripMenuItem.Name = "processToolStripMenuItem"; + resources.ApplyResources(this.processToolStripMenuItem, "processToolStripMenuItem"); + this.processToolStripMenuItem.Click += new System.EventHandler(this.processTSMenuItem_Click); + // + // resultsToolStripMenuItem + // + this.resultsToolStripMenuItem.Name = "resultsToolStripMenuItem"; + resources.ApplyResources(this.resultsToolStripMenuItem, "resultsToolStripMenuItem"); + this.resultsToolStripMenuItem.Click += new System.EventHandler(this.resultsTSMenuItem_Click); + // + // graphsToolStripMenuItem + // + this.graphsToolStripMenuItem.Name = "graphsToolStripMenuItem"; + resources.ApplyResources(this.graphsToolStripMenuItem, "graphsToolStripMenuItem"); + this.graphsToolStripMenuItem.Click += new System.EventHandler(this.graphsToolStripMenuItem_Click); + // + // iPerlHeadsToolStripMenuItem + // + this.iPerlHeadsToolStripMenuItem.Name = "iPerlHeadsToolStripMenuItem"; + resources.ApplyResources(this.iPerlHeadsToolStripMenuItem, "iPerlHeadsToolStripMenuItem"); + this.iPerlHeadsToolStripMenuItem.Click += new System.EventHandler(this.iPerlHeadsToolStripMenuItem_Click); + // + // MainWnd + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.verticalSplitContainer); + this.Controls.Add(this.statusStrip1); + this.Controls.Add(this.mainMenuStrip); + this.KeyPreview = true; + this.MainMenuStrip = this.mainMenuStrip; + this.Name = "MainWnd"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainWnd_FormClosing); + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.MainWnd_FormClosed); + this.Load += new System.EventHandler(this.MainWnd_Load); + this.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.MainWnd_KeyPress); + this.topVerticalSplitContainer.Panel1.ResumeLayout(false); + this.topVerticalSplitContainer.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.topVerticalSplitContainer)).EndInit(); + this.topVerticalSplitContainer.ResumeLayout(false); + this.activityGroupBox.ResumeLayout(false); + this.activityGroupBox.PerformLayout(); + this.topHorizontalSplitContainer.Panel1.ResumeLayout(false); + this.topHorizontalSplitContainer.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.topHorizontalSplitContainer)).EndInit(); + this.topHorizontalSplitContainer.ResumeLayout(false); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + this.procedureGroupBox.ResumeLayout(false); + this.progressGroupBox.ResumeLayout(false); + this.descriptionGroupBox.ResumeLayout(false); + this.descriptionGroupBox.PerformLayout(); + this.verticalSplitContainer.Panel1.ResumeLayout(false); + this.verticalSplitContainer.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.verticalSplitContainer)).EndInit(); + this.verticalSplitContainer.ResumeLayout(false); + this.horizontalSplitContainer.Panel1.ResumeLayout(false); + this.horizontalSplitContainer.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.horizontalSplitContainer)).EndInit(); + this.horizontalSplitContainer.ResumeLayout(false); + this.mainTabControl.ResumeLayout(false); + this.homeTabPage.ResumeLayout(false); + this.processTabPage.ResumeLayout(false); + this.resultsTabPage.ResumeLayout(false); + this.graphsTabPage.ResumeLayout(false); + this.logsTabPage.ResumeLayout(false); + this.picturesTabPage.ResumeLayout(false); + this.rightHorizSplitContainer.Panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.rightHorizSplitContainer)).EndInit(); + this.rightHorizSplitContainer.ResumeLayout(false); + this.measurementTabPage.ResumeLayout(false); + this.statusStrip1.ResumeLayout(false); + this.statusStrip1.PerformLayout(); + this.mainMenuStrip.ResumeLayout(false); + this.mainMenuStrip.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TabControl mainTabControl; + private System.Windows.Forms.TabPage homeTabPage; + private System.Windows.Forms.TabPage measurementTabPage; + private System.Windows.Forms.TabPage insertTabPage; + private System.Windows.Forms.TabPage resultsTabPage; + private System.Windows.Forms.TabPage logsTabPage; + private System.Windows.Forms.StatusStrip statusStrip1; + private System.Windows.Forms.ToolStripStatusLabel userInfoStatusLabel; + private System.Windows.Forms.ToolStripStatusLabel statusPStatusLabel; + private System.Windows.Forms.ToolStripStatusLabel routeStatusLabel; + private System.Windows.Forms.ToolStripStatusLabel activityStatusLabel; + public Screens.MeasurementTabPageCtrl MeasurementTabPageCtrl; + private Screens.ResultsTabPageCtrl resultsTabPageCtrl; + private Screens.LogsTabPageCtrl logsTabPageCtrl; + +#if DN100 + private ControlCom2VB.ControlCom2panel ctrlBrdComponent; + private TBF.Screens.ProcessTabPageCtrl6 processTabPageCtrl; +#elif MUNICH || FUZHOU150 + private ControlComponent3Munich.UserControl1 ctrlBrdComponent; + private TBF.Screens.ProcessTabPageCtrl6 processTabPageCtrl; +#elif FUZHOU300 + private ControlComponent3F300.UserControl1 ctrlBrdComponent; + private TBF.Screens.ProcessTabPageCtrl6 processTabPageCtrl; +#elif PT200IL || PUCHONG_PT200 || GENESIS || BERLIN || SLM_150 || PETERSBURG_200 || CEVAK_200 + private ControlComponent_Izrael2014.UserControl1 ctrlBrdComponent; + private TBF.Screens.ProcessTabPageCtrl6 processTabPageCtrl; +#elif TURA_SPECIAL || BADGER_MALA_TRAT || BADGER_STREDNA_TRAT || BADGER_VELKA_TRAT || SLM_END || WARSAW_END || RUM_MOB || SENTEC + private ControlComponent_Torino2015.UserControl1 ctrlBrdComponent; + private TBF.Screens.ProcessTabPageCtrl6 processTabPageCtrl; +#elif TORINO50 || TORUN_PT50_2015 || CEVAK_PT40_272 || MURES_PT40 || FUZHOU_40 || MALTA_WSD25 || SLM_50 || PETERSBURG_50 || KEMPNO_50 || BAHRAIN_50 || KRAKOW_50 || JUZNA_AFRIKA_50 || ZAMBIA || FUZHOU100 || DUBAJ_50 + private ControlComponent_Torino2015.UserControl1 ctrlBrdComponent; + private TBF.Screens.ProcessTabPageCtrl24 processTabPageCtrl; +#elif TURA_IPERL + private ControlComponent_Torino2015.UserControl1 ctrlBrdComponent; + private TBF.Screens.ProcessTabPageCtrl48 processTabPageCtrl; +#endif + + private System.Windows.Forms.ToolStripMenuItem benchTSMenuItem; + private System.Windows.Forms.ToolStripMenuItem homeTSMenuItem; + private System.Windows.Forms.ToolStripMenuItem resultsTSMenuItem; + private System.Windows.Forms.ToolStripMenuItem logsTSMenuItem; + private System.Windows.Forms.ToolStripMenuItem editTSMenuItem; + private System.Windows.Forms.ToolStripMenuItem usersTSMenuItem; + private System.Windows.Forms.ToolStripMenuItem localSettingsTSMenuItem; + private System.Windows.Forms.ToolStripMenuItem databaseSettingsTSMenuItem; + private System.Windows.Forms.ToolStripMenuItem passwortToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem helpTSMenuItem; + private System.Windows.Forms.ToolStripMenuItem aboutTSMenuItem; + private System.Windows.Forms.MenuStrip mainMenuStrip; + private System.Windows.Forms.ToolStripMenuItem benchComponentsTSMenuItem; + private System.Windows.Forms.ToolStripMenuItem benchPathsTSMenuItem; + private System.Windows.Forms.ToolStripMenuItem benchMetrologyTSMenuItem; + private System.Windows.Forms.ToolStripMenuItem proceduresToolStripMenuItem; + private System.Windows.Forms.SplitContainer verticalSplitContainer; + private System.Windows.Forms.SplitContainer horizontalSplitContainer; + private System.Windows.Forms.ToolStripMenuItem processToolStripMenuItem; + private System.Windows.Forms.TabPage processTabPage; + private System.Windows.Forms.ToolStripMenuItem resultsToolStripMenuItem; + private System.Windows.Forms.SplitContainer rightHorizSplitContainer; + private System.Windows.Forms.FlowLayoutPanel progressFlowLayoutPanel; + private System.Windows.Forms.GroupBox progressGroupBox; + private System.Windows.Forms.ProgressBar mainProgressBar; + private System.Windows.Forms.GroupBox activityGroupBox; + private System.Windows.Forms.Label activityLabel; + private System.Windows.Forms.GroupBox procedureGroupBox; + private System.Windows.Forms.ComboBox procedureComboBox; + private System.Windows.Forms.ToolStripMenuItem benchTransitionsToolStripMenuItem; + private System.Windows.Forms.TabPage picturesTabPage; + private Screens.PicturesTabPageCtrl picturesTabPageCtrl; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem; + private System.Windows.Forms.GroupBox descriptionGroupBox; + private System.Windows.Forms.Label descriptionLabel; + private System.Windows.Forms.Label messageLabel; + private System.Windows.Forms.ToolStripMenuItem graphsToolStripMenuItem; + private System.Windows.Forms.SplitContainer topVerticalSplitContainer; + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.SplitContainer topHorizontalSplitContainer; + private System.Windows.Forms.ToolStripMenuItem upgradeTSMenuItem; + private System.Windows.Forms.TabPage graphsTabPage; + private Screens.GraphsTabPageCtrl graphsTabPageCtrl; + private System.Windows.Forms.ToolStripMenuItem iPerlHeadsToolStripMenuItem; + } +} + diff --git a/TBF_V2/Sources/TBF/TBF/MainWnd.cs b/TBF_V2/Sources/TBF/TBF/MainWnd.cs new file mode 100644 index 00000000..3f3ad840 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/MainWnd.cs @@ -0,0 +1,784 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.UiBridge; +using TBF.Resources; +using System.Threading; + +namespace TBF +{ + /// + /// Main program window + /// + public partial class MainWnd : Form + { + static readonly ILog log = LogManager.GetLogger(typeof(MainWnd)); + + const string ProcSeparator = " "; /// string separating procedure number and procedure name + + public UiControls.BenchControlPanel BenchControlPanel; + public ProcedureInfo SelectedProcedure; + public Procedure CurrentProcedure; + public bool CycleRunning; + + /// + /// This dialog is shown when emergency stop is activated + /// + TBF.Forms.EmergencyStopForm emergencyStopModelessDlg; + + bool benchInitializationFailed; + TestProgressControls testProgressControls; + + /// + /// Set when procedures are updated while the ProceduresComboBox is disabled (i.e. during a test). + /// Reset when the ProceduresComboBox list of items is successfully reloaded in ReloadProcedures(). + /// This flag is tested when ProcedureComboBox is being enabled in OnButtonsEtc(), + /// optionaly ReloadProcedures() is called. + /// + public bool ProceduresUpdated = false; + + /// + /// MainTabPage ID-s + /// The order of TabPages in this enum must be the same as the order + /// of their additions into the mainTabControl in MainWnd.Designer.cs + /// TODO: Find a better way + /// + public enum MainTabPageId + { + Invalid = -1, + Hydraulics = 0, + Process, + Insert, + Results, + Graphs, + Logs, + Camera, + TabPagesCount + } + + /// + /// Event handlers switching between tab pages + /// + private void homeTSMenuItem_Click(object sender, EventArgs e) { mainTabControl.SelectTab((int)MainTabPageId.Hydraulics); } + private void processTSMenuItem_Click(object sender, EventArgs e) { mainTabControl.SelectTab((int)MainTabPageId.Process); } + private void resultsTSMenuItem_Click(object sender, EventArgs e) { mainTabControl.SelectTab((int)MainTabPageId.Results); } + private void graphsToolStripMenuItem_Click(object sender, EventArgs e) { mainTabControl.SelectTab((int)MainTabPageId.Graphs); } + private void logsTSMenuItem_Click(object sender, EventArgs e) { mainTabControl.SelectTab((int)MainTabPageId.Logs); } + +#if CAMERA + private System.Windows.Forms.ToolStripMenuItem cameraTSMItem; + private void cameraTSMItem_Click(object sender, EventArgs e) { mainTabControl.SelectTab((int)MainTabPageId.Camera); } +#endif + + /// + /// Constructor + /// + public MainWnd() + { + InitializeComponent(); + + Text = string.Format("Test Bench Framework ver. {0} - {1}{2}", + Program.Version, + Config.Data.CurrentBench.BenchName, + Config.Data.CurrentBench.IsRealBench ? "" : Strings._offline); + /// + /// Customize menu items + /// +#if CAMERA + /// Add 'Camera' menu item + cameraTSMItem = new System.Windows.Forms.ToolStripMenuItem(); + + cameraTSMItem.Name = "cameraTSMItem"; + cameraTSMItem.Text = Strings.Camera; + cameraTSMItem.Click += new System.EventHandler(this.cameraTSMItem_Click); + + mainMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {this.cameraTSMItem}); +#endif + +#if NO_GRAPHS + graphsToolStripMenuItem.Visible = false; +#else + graphsToolStripMenuItem.Text = Strings.Graphs; +#endif + + usersTSMenuItem.Visible = Users.GlobalData.CurrentUser.IsMemberOf(Users.Grp.GID.Administrators) || + Users.GlobalData.CurrentUser.IsMemberOf(Users.Grp.GID.HeadOfLab); + + upgradeTSMenuItem.Visible = Users.GlobalData.CurrentUser.IsMemberOf(Users.Grp.GID.Administrators) && Users.GlobalData.CurrentUser.IsPowerUser(); + +#if IPERL + iPerlHeadsToolStripMenuItem.Visible = true; + iPerlHeadsToolStripMenuItem.Enabled = false; +#else + iPerlHeadsToolStripMenuItem.Visible = false; +#endif + + CycleRunning = true; + + benchInitializationFailed = false; + /// + if (Config.Data.CurrentBench.IsRealBench) + { + try + { + BenchControl.StateMachine.InitializeBoardEtc(ctrlBrdComponent); + testProgressControls = new TestProgressControls(progressFlowLayoutPanel); + } + catch (Exception exc) + { + benchInitializationFailed = true; + + string errMsg = string.Format(Strings.Failed_to_initialize_component_0_1_2, + BenchControl.TbfComponents.CurrentlyLoadedComponentName, + Environment.NewLine, + exc.Message); + log.Fatal(errMsg); + MessageBox.Show(errMsg, Strings.Error, + System.Windows.Forms.MessageBoxButtons.OK, + System.Windows.Forms.MessageBoxIcon.Exclamation); + } + } + } + + void Localize() + { + procedureGroupBox.Text = Strings.Procedure; + activityGroupBox.Text = Strings.Activity; + progressGroupBox.Text = Strings.Progress; + } + + /// + /// Initializes this window and its controls + /// + private void MainWnd_Load(object sender, EventArgs e) + { + Localize(); + + TBF.LocalSettings ls = Program.LocalSettings; + WindowState = (ls.ManiWndMaximized ? FormWindowState.Maximized : FormWindowState.Normal); + //if (WindowState != FormWindowState.Normal) + //{ + // RestoreBounds = new Rectangle((ls.MainWndLeft != 0) ? ls.MainWndLeft : 75, + // (ls.MainWndTop != 0) ? ls.MainWndTop : 5, + // (ls.MainWndWidth > 0) ? ls.MainWndWidth : 1250, + // (ls.MainWndHeight > 0) ? ls.MainWndHeight : 750); + //} + //else + { + Width = (ls.MainWndWidth > 0) ? ls.MainWndWidth : 1250; + Height = (ls.MainWndHeight > 0) ? ls.MainWndHeight : 750; + Left = (ls.MainWndLeft != 0) ? ls.MainWndLeft : 75; + Top = (ls.MainWndTop != 0) ? ls.MainWndTop : 5; + } + + + if (Config.Data.CurrentBench.IsRealBench && !benchInitializationFailed) + { + var form = new TBF.Forms.ModelessActivityForm() + { + Message = Strings.Starting_system, + FontFamily = "Arial", + FontSize = 24, + FontStyle = FontStyle.Regular, + BackgroundColor = Color.OliveDrab, /// or Color.YellowGreen + StartActivityHandler = true, + }; + Thread formThread = new Thread(() => form.ShowDialog()); + formThread.Start(); + + try + { + string message = BenchControl.StateMachine.InitializeDevices(); + form.CloseForm(null, new EventArgs()); + formThread.Join(); + +#if !MUNICH + if (message != null) + { + MessageBox.Show(Strings.The_following_components_are_in_simulation_mode_ + Environment.NewLine + message, + Strings.Warning, + MessageBoxButtons.OK, + MessageBoxIcon.Information); + } +#endif + + //emergencyStopModelessDlg = new TBF.Forms.EmergencyStopForm(); + //emergencyStopModelessDlg.Show(); + + Bridge.ButtonsEtcHandler += delegate(object sndr, ButtonsEtcEventArgs args) + { + if (InvokeRequired) { Invoke(new EventHandler(OnButtonsEtc), sndr, args); } + else OnButtonsEtc(sndr, args); + }; + + Bridge.ActivityHandler += delegate(object sndr, UiBridge.ActivityEventArgs args) + { + if (InvokeRequired) { Invoke(new EventHandler(OnActivity), sndr, args); } + else OnActivity(sndr, args); + }; + + Bridge.StateChangedHandler += delegate(object sndr, UiBridge.StateChangedEventArgs args) + { + if (InvokeRequired) { Invoke(new EventHandler(OnStateChanged), sndr, args); } + else OnStateChanged(sndr, args); + }; + + Bridge.TestProgressHandler += delegate(object sndr, UiBridge.TestProgressEventArgs args) + { + if (InvokeRequired) { Invoke(new EventHandler(OnTestProgress), sndr, args); } + else OnTestProgress(sndr, args); + }; + + Bridge.ProcedureSelectedHandler += delegate(object sndr, UiBridge.ProcedureSelectedEventArgs args) + { + if (InvokeRequired) { Invoke(new EventHandler(OnProcedureSelected), sndr, args); } + else OnProcedureSelected(sndr, args); + }; + } + catch (Exception exc) + { + benchInitializationFailed = true; + + form.CloseForm(null, new EventArgs()); + formThread.Join(); + + string errMsg = string.Format(Strings.Failed_to_initialize_device_0_1_2, + BenchControl.StateMachine.CurrentlyInitializedDeviceName, + Environment.NewLine, + exc.Message); + log.Fatal(errMsg); + MessageBox.Show(errMsg, Strings.Error, + System.Windows.Forms.MessageBoxButtons.OK, + System.Windows.Forms.MessageBoxIcon.Exclamation); + } + } + + procedureComboBox.Text = string.Format("{0}{1}{2}", Program.LocalSettings.LastProcedureNr, ProcSeparator, Program.LocalSettings.LastProcedureName); + SelectedProcedure = new ProcedureInfo(Program.LocalSettings.LastProcedureName, Program.LocalSettings.LastProcedureDB); + + rightHorizSplitContainer.SplitterDistance = Program.LocalSettings.RightPaneHorizSplitterDistance; + topVerticalSplitContainer.SplitterDistance = Program.LocalSettings.TopPaneVerticalSplitterDistance; + + /// Text boxes for data input, with border and white background + CustomStyle.Set(0, DockStyle.Fill, Color.White, BorderStyle.FixedSingle, false, + new System.Drawing.Font("Verdana", 10.5F, FontStyle.Regular, GraphicsUnit.Point, (byte)(238))); + + // Read only text boxes (labels), its background matches the window background + + /// Measurement + CustomStyle.Set(1, DockStyle.Fill, Color.FromArgb(150, 180, 200), BorderStyle.None, true, + new System.Drawing.Font("Verdana", 10.5F, FontStyle.Regular, GraphicsUnit.Point, (byte)(238))); + + /// Not used + CustomStyle.Set(2, DockStyle.Fill, Color.OliveDrab, BorderStyle.None, true, + new System.Drawing.Font("Verdana", 10.5F, FontStyle.Regular, GraphicsUnit.Point, (byte)(238))); + + /// Procedure + CustomStyle.Set(3, DockStyle.Fill, Color.FromArgb(200, 200, 150), BorderStyle.None, true, + new System.Drawing.Font("Verdana", 10.5F, FontStyle.Regular, GraphicsUnit.Point, (byte)(238))); + + /// Initialize bench control user interface(s) + BenchControlPanel = new TBF.UiControls.BenchControlPanel(); + BenchControlPanel.BalancesCount = TBF.BenchControl.MettlerToledo.Standard.BalanceDev.BalancesCount + + TBF.BenchControl.MettlerToledo.Multi.BalanceDev.BalancesCount; + new System.ComponentModel.ComponentResourceManager(typeof(MainWnd)).ApplyResources(BenchControlPanel, "benchControlPanel"); + BenchControlPanel.Name = "benchControlPanel"; + rightHorizSplitContainer.Panel2.Controls.Add(BenchControlPanel); + + ReloadProcedureComboBoxItems(); + + /// Select the initial tab page + mainTabControl.SelectTab((int)MainTabPageId.Process); /// This is to load the 'Process screen' + UpdateUser(); + mainTabControl.SelectTab((int)MainTabPageId.Hydraulics); + + if (Config.Data.CurrentBench.IsRealBench) + { + if (!benchInitializationFailed) + { + BenchControl.StateMachine.Start(); + log.Info("Test bench started"); + } + else + { + BenchControlPanel.OnButtonsEtc(null, new ButtonsEtcEventArgs(TBF.UiBridge.ButtonsEtc.None)); + MessageBox.Show(Strings.Bench_is_not_running, + Strings.Warning, + System.Windows.Forms.MessageBoxButtons.OK, + System.Windows.Forms.MessageBoxIcon.Exclamation); + } + } + } + + /// + /// Pass any pressed keys to the Bench control panel. + /// Note that MainWnd.KeyPreview must be set to true. + /// + private void MainWnd_KeyPress(object sender, KeyPressEventArgs e) + { +#if !BADGER_MALA_TRAT && !BADGER_STREDNA_TRAT && !BADGER_VELKA_TRAT && !GENESIS + if (BenchControlPanel != null && BenchControlPanel.ProcessKey(e.KeyChar)) + { + e.Handled = true; + log.WarnFormat("'{0}' key pressed, handled by BenchControlPanel", e.KeyChar); + } + else + { + log.WarnFormat("'{0}' key pressed, not handled", e.KeyChar); + } +#endif + } + + /// + /// Invoked from the UiBridge to update the activity label. + /// + void OnActivity(object sender, UiBridge.ActivityEventArgs args) + { + switch (args.Cmd) + { + case ActivityEventArgs.Update.Activity: + activityLabel.Text = args.Activity; + if (string.IsNullOrEmpty(messageLabel.Text)) messageLabel.ForeColor = Color.Black; + break; + case ActivityEventArgs.Update.Message: + messageLabel.Text = args.Message; + if (args.ErrorMsg) messageLabel.ForeColor = Color.Red; + else messageLabel.ForeColor = Color.Black; + break; + default: + activityLabel.Text = args.Activity; + messageLabel.Text = args.Message; + if (args.ErrorMsg) messageLabel.ForeColor = Color.Red; + else messageLabel.ForeColor = Color.Black; + break; + } + } + + /// + /// Invoked from the UiBridge to update the current state status bar item. + /// + void OnStateChanged(object sender, StateChangedEventArgs args) + { + activityStatusLabel.Text = args.StateChangedMsg; + } + + void OnTestProgress(object sender, UiBridge.TestProgressEventArgs args) + { + mainProgressBar.Value = (int)(100.499f * args.OveralProgress); + } + + void OnProcedureSelected(object sender, UiBridge.ProcedureSelectedEventArgs args) + { + mainProgressBar.Value = 0; + } + + void OnButtonsEtc(object sender, UiBridge.ButtonsEtcEventArgs args) + { + if (((args.Flags & ButtonsEtc.ShowBenchEmpty) != 0) || + ((args.Flags & ButtonsEtc.ShowBenchFilled) != 0)) + { + return; + } + + CycleRunning = ((args.Flags & UiBridge.ButtonsEtc.ProcedureCmbBoxEn) == 0); + + procedureComboBox.Enabled = !CycleRunning; + iPerlHeadsToolStripMenuItem.Enabled = !CycleRunning; + + if (!CycleRunning && ProceduresUpdated) + { + ReloadProcedureComboBoxItems(); + } + } + + public void UpdateUser() + { + userInfoStatusLabel.Text = string.Format("{0}: {1}{2}, ", Strings.User, Users.GlobalData.CurrentUser.UserName, + (Users.GlobalData.AuthorizedAs == Users.Entities.AuthorizedAs.PowerUser) ? "(S)" : + ((Users.GlobalData.AuthorizedAs == Users.Entities.AuthorizedAs.LocalUser) ? "(L)" : "(R)")); + } + + public void UpdateStatusP(string statusPStr) + { + statusPStatusLabel.Text = string.Format("S={0} , ", statusPStr); /// TODO: Resolve exception + } + + public void UpdateRoute(string routeStr) + { + routeStatusLabel.Text = string.Format("R={0} , ", routeStr); + } + + /// + /// Stop the bench when program closes + /// + /// + /// + private void MainWnd_FormClosed(object sender, FormClosedEventArgs e) + { + //BenchControl.StateMachine.Stop(); + } + + private void benchComponentsTSMItem_Click(object s, EventArgs e) { Cursor = Cursors.WaitCursor; new ComponentsManagerDlg().ShowDialog(); Cursor = Cursors.Default; } + private void benchPathsTSMItem_Click(object s, EventArgs e) { Cursor = Cursors.WaitCursor; new PathsDlg().ShowDialog(); Cursor = Cursors.Default; } + private void benchTransitionsTSMItem_Click(object s, EventArgs e) { Cursor = Cursors.WaitCursor; new TransitionsDlg().ShowDialog(); Cursor = Cursors.Default; } + private void benchMetrologyTSMItem_Click(object s, EventArgs e) { Cursor = Cursors.WaitCursor; new MetrologyDlg().ShowDialog(); Cursor = Cursors.Default; } + private void proceduresTSMItem_Click(object s, EventArgs e) { Cursor = Cursors.WaitCursor; new ProceduresDlg().ShowDialog(); Cursor = Cursors.Default; } + private void localSettingsTSMItem_Click(object s, EventArgs e) { new PreferencesDlg().ShowDialog(); } + private void databaseSettingsTSMItem_Click(object s, EventArgs e) { new BenchesDlg().ShowDialog(); } + private void usersTSMItem_Click(object s, EventArgs e) + { + Users.DB.ConnectionString = Config.Data.CurrentBench.ProceduresDBSettings.ConnectionString; + Users.DB.DbType = Config.Data.CurrentBench.ProceduresDBSettings.DbType; +#if TURA_IPERL || TURA_SPECIAL + Users.Forms.UserManagementDlg dlg = new Users.Forms.UserManagementDlg(Users.DB.CreateSession(), true); + string connStr = Users.DB.ConnectionString; + int len = connStr.ToUpper().IndexOf("; UID="); + if (len > 0) dlg.TitleExtension = connStr.Substring(0, len); +#else + Users.Forms.UserManagementDlg dlg = new Users.Forms.UserManagementDlg(Users.DB.CreateSession(), false); +#endif + dlg.ShowDialog(); + } + private void aboutTSMItem_Click(object s, EventArgs e) { new Forms.AboutDlg().ShowDialog(); } + + /// + /// Read the database and re-initialize procedureComboBox items. + /// Try to preserve the original selection. + /// + public void ReloadProcedureComboBoxItems() + { + int separPos = procedureComboBox.Text.IndexOf(ProcSeparator); + string procName = (separPos >= 0) ? procedureComboBox.Text.Substring(separPos + ProcSeparator.Length) : string.Empty; + ReloadProcedureComboBoxItems(procName); + } + + + public void ReloadProcedureComboBoxItems(string procedureNameToSelect) + { + BenchControl.GenericDevices.IBenchInfo benchInfo = BenchControl.Sequences.ProcessData.BenchInfo; + RemoteDBUse remoteDbUse = (benchInfo != null) ? benchInfo.RemoteDBUse : RemoteDBUse.LocalDBOnly; + + Users.Entities.DBKind[] dBase; + string[] signature; + /// + switch (remoteDbUse) + { + default: + case RemoteDBUse.LocalDBOnly: + dBase = new Users.Entities.DBKind[] { Users.Entities.DBKind.Config }; + signature = new string[] { "" }; + break; + case RemoteDBUse.RemoteDBOnly: + dBase = new Users.Entities.DBKind[] { Users.Entities.DBKind.RemoteConfig }; + signature = new string[] { "R" }; + break; + case RemoteDBUse.BothDBsLocalFirst: + dBase = new Users.Entities.DBKind[] { Users.Entities.DBKind.Config, Users.Entities.DBKind.RemoteConfig }; + signature = new string[] { "L", "R" }; + break; + case RemoteDBUse.BothDBsRemoteFirst: + dBase = new Users.Entities.DBKind[] { Users.Entities.DBKind.RemoteConfig, Users.Entities.DBKind.Config }; + signature = new string[] { "R", "L" }; + break; + } + + if (procedureComboBox.Enabled) + { + bool procedureSet = false; + procedureComboBox.Items.Clear(); + IList allProcedures = new List(); + + for (int i = 0; i < dBase.Length; i++) + { + IList procedures = Config.FluentCommon.CreateSession(dBase[i]) + .QueryOver() + .Where(x => (x.ProcedureState == ProcedureState.Active)) + .OrderBy(x => x.ItemNr).Desc + .List(); + foreach (var proc in procedures) + { + string itemText = string.Format("{0}{1}{2}{3}", signature[i], proc.ItemNr + 1, ProcSeparator, proc.Name); + procedureComboBox.Items.Add(itemText); + if ((procedureNameToSelect == proc.Name) && !procedureSet) + { + procedureComboBox.Text = itemText; + SelectedProcedure = new ProcedureInfo(procedureNameToSelect, dBase[i]); + procedureSet = true; + } + } + } + + if (!procedureSet) + { + if (allProcedures.Count > 0) + { + procedureComboBox.Text = string.Format("{0}{1}{2}", allProcedures[0].ItemNr + 1, ProcSeparator, allProcedures[0].Name); + Users.Entities.DBKind dbKind = ((remoteDbUse == RemoteDBUse.BothDBsRemoteFirst) || (remoteDbUse == RemoteDBUse.RemoteDBOnly)) ? Users.Entities.DBKind.RemoteConfig : Users.Entities.DBKind.Config; + SelectedProcedure = new ProcedureInfo(allProcedures[0].Name, dbKind); + procedureSet = true; + } + else + { + procedureComboBox.Text = string.Empty; + SelectedProcedure = null; + } + } + + ProceduresUpdated = false; + + if (SelectedProcedure != null) BenchControlPanel.ReloadTests(); + } + else + { + ProceduresUpdated = true; + } + } + + private void procedureComboBox_SelectedIndexChanged(object sender, EventArgs e) + { + int startFrom; + Users.Entities.DBKind dbKind; + if (!string.IsNullOrEmpty(procedureComboBox.Text) && (procedureComboBox.Text[0] == 'L' || procedureComboBox.Text[0] == 'R')) + { + startFrom = 1; + dbKind = (procedureComboBox.Text[0] == 'L') ? Users.Entities.DBKind.Config : Users.Entities.DBKind.RemoteConfig; + } + else + { + startFrom = 0; + dbKind = Users.Entities.DBKind.Config; + } + + int separPos = procedureComboBox.Text.IndexOf(ProcSeparator); + + int procNr = int.Parse(procedureComboBox.Text.Substring(startFrom, separPos)); + string procName = procedureComboBox.Text.Substring(separPos + ProcSeparator.Length); + UpdateProcedure(procNr, procName, dbKind); + } + + public void UpdateProcedure(int procedureNr, string procedureName, Users.Entities.DBKind dbKind) + { + SelectedProcedure = new ProcedureInfo(procedureName, dbKind); + BenchControlPanel.ReloadTests(); + if (CurrentProcedure != null && CurrentProcedure.Description != null) + { + descriptionLabel.Text = CurrentProcedure.Description; + } + if (CurrentProcedure != null && testProgressControls != null) + { + testProgressControls.ProcedureSelectedInUI(this, new UiBridge.ProcedureSelectedEventArgs(CurrentProcedure)); + } + if (!string.IsNullOrEmpty(procedureName)) + { + Program.LocalSettings.LastProcedureName = procedureName; + Program.LocalSettings.LastProcedureDB = dbKind; + Program.LocalSettings.LastProcedureNr = procedureNr; + Program.LocalSettings.Save(); + } + } + + private void MainWnd_FormClosing(object sender, FormClosingEventArgs e) + { + Program.LocalSettings.RightPaneHorizSplitterDistance = rightHorizSplitContainer.SplitterDistance; + Program.LocalSettings.TopPaneVerticalSplitterDistance = topVerticalSplitContainer.SplitterDistance; + + Program.LocalSettings.ManiWndMaximized = (WindowState == FormWindowState.Maximized); + if (WindowState == FormWindowState.Normal) + { + Program.LocalSettings.MainWndLeft = Location.X; + Program.LocalSettings.MainWndTop = Location.Y; + Program.LocalSettings.MainWndWidth = Size.Width; + Program.LocalSettings.MainWndHeight = Size.Height; + } + else + { + /// Maximized or minimized (when restarted, minimized window is restored as normal) + Program.LocalSettings.MainWndLeft = RestoreBounds.Left; + Program.LocalSettings.MainWndTop = RestoreBounds.Top; + Program.LocalSettings.MainWndWidth = RestoreBounds.Width; + Program.LocalSettings.MainWndHeight = RestoreBounds.Height; + } + Program.LocalSettings.Save(); + + if (DialogResult == DialogResult.None) + { + exitToolStripMenuItem_Click(sender, e); + } + } + + private void exitToolStripMenuItem_Click(object sender, EventArgs e) + { + bool oriEmgStopState = false; + if (emergencyStopModelessDlg != null) + { + oriEmgStopState = emergencyStopModelessDlg.Visible; + emergencyStopModelessDlg.Visible = false; + } + + if (BenchControl.StateMachine.Running && (messageLabel.ForeColor != Color.Red) && CycleRunning) + { + MessageBox.Show(Strings.Finish_the_session_please, string.Empty, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + if (e is FormClosingEventArgs) + { + (e as FormClosingEventArgs).Cancel = true; + } + return; + } + + if (DialogResult.Yes == MessageBox.Show(Strings.Do_you_want_to_exit_TBF, + Strings.Closing_the_program, + MessageBoxButtons.YesNo, + MessageBoxIcon.Question)) + { + if (BenchControl.StateMachine.Running) + { + /// Show 'Closing_Test_Bench_Framework' modeless window in separate thread + var form = new TBF.Forms.ModelessActivityForm() + { + Message = Strings.Closing_Test_Bench_Framework, + FontFamily = "Arial", + FontSize = 24, + FontStyle = FontStyle.Regular, + BackgroundColor = Color.PeachPuff, + StartActivityHandler = true, + }; + Thread formThread = new Thread(() => form.ShowDialog()); + formThread.Start(); + + /// Stop the system + BenchControl.StateMachine.Stop(); + while (BenchControl.StateMachine.Running) { } /// wait until the last StopOperaions() completes + BenchControl.StateMachine.StopDevices(); + BenchControl.StateMachine.StopDevices2(); + + UiBridge.Bridge.OnEmergencyStopChanged(this, UiBridge.EmergencyStopEventArgs.State.CloseForm); + + /// Close 'Closing_Test_Bench_Framework' modeless window + form.CloseForm(null, new EventArgs()); + formThread.Join(); + } + + /// Close the main window + DialogResult = DialogResult.OK; + Close(); + return; + } + else if (e is FormClosingEventArgs) + { + (e as FormClosingEventArgs).Cancel = true; + } + + if (emergencyStopModelessDlg != null) emergencyStopModelessDlg.Visible = oriEmgStopState; + } + + + //private void printToolStripMenuItem_Click(object sender, EventArgs e) + //{ + //TBF.Forms.PrintOrderForm dlg = new TBF.Forms.PrintOrderForm(); + //if (dlg.ShowDialog() == DialogResult.OK) + //{ + // string purchaseOrder = dlg.PurchaseOrder; + // string tester = dlg.Tester; + + // NHibernate.ISession session = Config.FluentCommon.CreateSession(Users.Entities.DBKind.Config); + + // IList testResults = session.QueryOver() + // .Where(x => (x.PurchaseOrder == purchaseOrder)) + // .List(); + + // if (testResults.Count == 0) + // { + // MessageBox.Show(Strings.No_results_to_print, Strings.Error, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + // return; + // } + + // if (dlg.OnlyGoodResults) + // { + // /// Proceed from the end of the list so that items can be removed by index + // for (int i = testResults.Count - 1; i >= 0; i--) + // { + // // TODO: Complete + // } + // } + + // if (dlg.OnlyLastResult) + // { + // /// Remove test results if there exist a later test results for the same sn + // /// Proceed from the end of the list so that items can be removed by index + // for (int i = testResults.Count - 1; i >= 0; i--) + // { + // string name = testResults[i].Name; + // int batchNr = testResults[i].BatchNr; + // foreach (var tr in testResults) + // { + // if (tr.Name == name && tr.BatchNr > batchNr) + // { + // bool allWMsAreTheSame = true; + + // int cnt = Math.Min(testResults[i].Meters.Count, tr.Meters.Count); + // for (int j = 0; j < cnt; j++) + // { + // if (testResults[i].Meters[j].SerialNr != tr.Meters[j].SerialNr) + // { + // allWMsAreTheSame = false; + // break; + // } + // } + + // if (allWMsAreTheSame) + // { + // /// Remove as there exists a more recent measurement with the same meters + // testResults.RemoveAt(i); + // break; + // } + // } + // } + // } + // } + + // IList procedure = session.QueryOver() + // .Where(x => (x.ProcedureState == ProcedureState.Active)) + // .And(x => (x.Name == testResults[0].ProcedureName)) + // .List(); + + // if (procedure.Count != 1) + // { + // MessageBox.Show(Strings.No_results_to_print, Strings.Error, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + // return; + // } + + // if ((testResults != null) && (testResults.Count != 0) && (testResults[0].MetersKind == MetersKind.Single)) + // { + // PrintOrderDocument doc = new PrintOrderDocument(procedure[0], testResults, tester); + // doc.DefaultPageSettings.Landscape = true; + // doc.Print(); + // } + // else if((testResults != null) && (testResults.Count != 0) && (testResults[0].MetersKind == MetersKind.Combined)) + // { + // /// Do nothing right now + // } + // else + // { + // MessageBox.Show(Strings.No_results_to_print, Strings.Error, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + // return; + // } + //} + //} + + private void upgradeTSMenuItem_Click(object sender, EventArgs e) + { + new Forms.UpgradeSelectionDlg().Show(); + } + + private void iPerlHeadsToolStripMenuItem_Click(object sender, EventArgs e) + { + //new BenchControl.TestMethods.iPerlCommunication.iPerlCommunicationForm(true).ShowDialog(); + } + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/MainWnd.cs.resx b/TBF_V2/Sources/TBF/TBF/MainWnd.cs.resx new file mode 100644 index 00000000..03617703 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/MainWnd.cs.resx @@ -0,0 +1,235 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + 57, 20 + + + Testovací stolice Framework + + + O + + + Proces + + + Prosím, spusťte proceduru + + + Komponenty + + + Metrologie + + + Cesty + + + Přechody + + + Stolice + + + Databáze + + + Nastavení + + + Výstup + + + Pomoc + + + Hydraulika + + + Domů + + + Vložit + + + Jazyk + + + Záznamy + + + Záznamy + + + Záhlaví hlavního menu + + + Měření + + + Měření + + + Heslo + + + Obrázky + + + Obrázky + + + Vytisknout + + + Postup + + + Postupy + + + Proces + + + Proces + + + Probíhá + + + Výsledky + + + Výsledky + + + Výsledky + + + Stavový pruh 1 + + + Uživatel : admin + + + Uživatelé + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/MainWnd.de.resx b/TBF_V2/Sources/TBF/TBF/MainWnd.de.resx new file mode 100644 index 00000000..2c07b33f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/MainWnd.de.resx @@ -0,0 +1,314 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + 1012, 533 + + + 1012, 533 + + + 1012, 533 + + + 1012, 533 + + + 1012, 533 + + + 1012, 533 + + + 1012, 533 + + + 1012, 533 + + + 1012, 533 + + + 1012, 533 + + + 1012, 533 + + + 1020, 542 + + + 1020, 666 + + + 230, 666 + + + 1254, 666 + + + 1012, 533 + + + 1012, 533 + + + 73, 17 + + + User : admin + + + + No + + + 132, 17 + + + Please start a procedure + + + 0, 690 + + + 150, 22 + + + Komponenten + + + 150, 22 + + + Pfade + + + 150, 22 + + + Übergänge + + + 150, 22 + + + Metrologie + + + 147, 6 + + + 150, 22 + + + Beenden + + + 70, 20 + + + Prüfstand + + + 122, 20 + + + Schema-Diagramm + + + 75, 20 + + + Ergebnisse + + + 73, 20 + + + Protokolle + + + 131, 22 + + + Benutzer + + + 131, 22 + + + Sprache + + + 131, 22 + + + Datenbank + + + 131, 22 + + + Passwort + + + 79, 20 + + + Verwaltung + + + 99, 22 + + + Info + + + Hilfe + + + 87, 20 + + + Prüfvorlagen + + + 58, 20 + + + Prozess + + + 75, 20 + + + Ergebnisse + + + 63, 20 + + + Drucken + + + 1254, 712 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/MainWnd.it.resx b/TBF_V2/Sources/TBF/TBF/MainWnd.it.resx new file mode 100644 index 00000000..5bf3e7ea --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/MainWnd.it.resx @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Attività + + + procedura + + + progresso + + + idraulica + + + processo + + + Inserisci + + + risultati + + + registrare cronologicamente + + + Immagini + + + misurazioni + + + banco + + + componenti + + + percorsi + + + transizioni + + + metrologia + + + uscita + + + casa + + + risultati + + + registrare cronologicamente + + + utenti + + + lingua + + + Database + + + Password + + + aggiornamento + + + impostazioni + + + Aiuto + + + circa + + + procedure + + + processi + + + risultati + + + Stampa + + + menu principale ????? + + + struttura del banco prova + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/MainWnd.pl.resx b/TBF_V2/Sources/TBF/TBF/MainWnd.pl.resx new file mode 100644 index 00000000..ce909144 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/MainWnd.pl.resx @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Czynność + + + Procedura + + + Przebiega + + + Hydsraulika + + + Czynność + + + Wstawić + + + Wyniki + + + Logi + + + Obrazy + + + Pomiar + + + Pasek stanu 1 + + + Badanie + + + Elementy + + + Ścieżki + + + Przejścia + + + Metrologia + + + Wyjście + + + Główna + + + Wyniki + + + Logi + + + Użytkownicy + + + Język + + + Baza danych + + + Hasło + + + Aktualizacja + + + Ustawienia + + + Pomoc + + + O + + + Procedury + + + Czynność + + + Wyniki + + + Drukuj + + + Nagłówek głównego menu + + + Framework stanowiska pomiarowego + + + Proszę rozpocząć procedurę + + + Pomiar + + + Obrazy + + + Użytkownik: admin + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/MainWnd.resx b/TBF_V2/Sources/TBF/TBF/MainWnd.resx new file mode 100644 index 00000000..c4903f1e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/MainWnd.resx @@ -0,0 +1,1545 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + Fill + + + + 0, 0 + + + + True + + + Verdana, 15.75pt + + + NoControl + + + 6, 68 + + + 0, 25 + + + 1 + + + messageLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + activityGroupBox + + + 0 + + + True + + + Verdana, 15.75pt + + + NoControl + + + 6, 28 + + + 0, 25 + + + 0 + + + activityLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + activityGroupBox + + + 1 + + + Fill + + + Verdana, 12pt + + + 5, 5 + + + 335, 115 + + + 18 + + + Activity + + + activityGroupBox + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + topVerticalSplitContainer.Panel1 + + + 0 + + + 5, 5, 0, 0 + + + topVerticalSplitContainer.Panel1 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + topVerticalSplitContainer + + + 0 + + + Fill + + + True + + + 5, 5 + + + Horizontal + + + Fill + + + True + + + 0, 0 + + + Fill + + + False + + + Verdana, 15.75pt + + + 13, 23 + + + 23, 3, 3, 3 + + + 389, 33 + + + 6 + + + procedureComboBox + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + procedureGroupBox + + + 0 + + + Fill + + + Verdana, 12pt + + + 0, 0 + + + 13, 3, 13, 3 + + + 415, 65 + + + 17 + + + Procedure + + + procedureGroupBox + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel1 + + + 0 + + + splitContainer1.Panel1 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1 + + + 0 + + + NoControl + + + 6, 23 + + + 237, 33 + + + 0 + + + mainProgressBar + + + System.Windows.Forms.ProgressBar, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + progressGroupBox + + + 0 + + + Fill + + + Verdana, 12pt + + + 0, 0 + + + 252, 65 + + + 19 + + + Progress + + + progressGroupBox + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel2 + + + 0 + + + splitContainer1.Panel2 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1 + + + 1 + + + 671, 65 + + + 415 + + + 0 + + + splitContainer1 + + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + topHorizontalSplitContainer.Panel1 + + + 0 + + + topHorizontalSplitContainer.Panel1 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + topHorizontalSplitContainer + + + 0 + + + True + + + NoControl + + + 8, 15 + + + 0, 13 + + + 0 + + + descriptionLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + descriptionGroupBox + + + 0 + + + Fill + + + 0, 0 + + + 671, 46 + + + 20 + + + descriptionGroupBox + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + topHorizontalSplitContainer.Panel2 + + + 0 + + + topHorizontalSplitContainer.Panel2 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + topHorizontalSplitContainer + + + 1 + + + 671, 115 + + + 65 + + + 0 + + + topHorizontalSplitContainer + + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + topVerticalSplitContainer.Panel2 + + + 0 + + + 5, 5, 0, 0 + + + topVerticalSplitContainer.Panel2 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + topVerticalSplitContainer + + + 1 + + + 1020, 120 + + + 340 + + + 21 + + + topVerticalSplitContainer + + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + horizontalSplitContainer.Panel1 + + + 0 + + + Fill + + + True + + + 0, 24 + + + Fill + + + True + + + 0, 0 + + + Horizontal + + + horizontalSplitContainer.Panel1 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + horizontalSplitContainer + + + 0 + + + Fill + + + 0, 0 + + + 1012, 523 + + + 1 + + + ctrlBrdComponent + + + ControlComponent_Torino2015.UserControl1, ControlComponent3U, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + + + homeTabPage + + + 0 + + + 4, 5 + + + 1012, 523 + + + 29 + + + Hydraulics + + + homeTabPage + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + mainTabControl + + + 0 + + + Fill + + + Microsoft Sans Serif, 8.25pt + + + 0, 0 + + + 4, 4, 4, 4 + + + 1012, 523 + + + 1 + + + processTabPageCtrl + + + TBF.Screens.ProcessTabPageCtrl48, TBF, Version=2.18.933.0, Culture=neutral, PublicKeyToken=null + + + processTabPage + + + 0 + + + 4, 5 + + + 1012, 523 + + + 30 + + + Process + + + processTabPage + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + mainTabControl + + + 1 + + + 4, 5 + + + 1012, 523 + + + 22 + + + Insert + + + insertTabPage + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + mainTabControl + + + 2 + + + Fill + + + Microsoft Sans Serif, 8.25pt + + + 0, 0 + + + 4, 4, 4, 4 + + + 1012, 523 + + + 0 + + + resultsTabPageCtrl + + + TBF.Screens.ResultsTabPageCtrl, TBF, Version=2.18.933.0, Culture=neutral, PublicKeyToken=null + + + resultsTabPage + + + 0 + + + 4, 5 + + + 1012, 523 + + + 15 + + + Results + + + resultsTabPage + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + mainTabControl + + + 3 + + + Fill + + + Microsoft Sans Serif, 8.25pt + + + 0, 0 + + + 1012, 523 + + + 0 + + + graphsTabPageCtrl + + + TBF.Screens.GraphsTabPageCtrl, TBF, Version=2.18.933.0, Culture=neutral, PublicKeyToken=null + + + graphsTabPage + + + 0 + + + 4, 5 + + + 1012, 523 + + + 32 + + + Graphs + + + graphsTabPage + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + mainTabControl + + + 4 + + + Fill + + + Microsoft Sans Serif, 8.25pt + + + 0, 0 + + + 4, 4, 4, 4 + + + 1012, 523 + + + 0 + + + logsTabPageCtrl + + + TBF.Screens.LogsTabPageCtrl, TBF, Version=2.18.933.0, Culture=neutral, PublicKeyToken=null + + + logsTabPage + + + 0 + + + 4, 5 + + + 1012, 523 + + + 21 + + + Logs + + + logsTabPage + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + mainTabControl + + + 5 + + + Fill + + + Microsoft Sans Serif, 8.25pt + + + 0, 0 + + + 1012, 523 + + + 0 + + + picturesTabPageCtrl + + + TBF.Screens.PicturesTabPageCtrl, TBF, Version=2.18.933.0, Culture=neutral, PublicKeyToken=null + + + picturesTabPage + + + 0 + + + 4, 5 + + + 1012, 523 + + + 31 + + + Pictures + + + picturesTabPage + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + mainTabControl + + + 6 + + + Fill + + + 0, 1 + + + 0, 0 + + + 1020, 532 + + + 1 + + + mainTabControl + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + horizontalSplitContainer.Panel2 + + + 0 + + + horizontalSplitContainer.Panel2 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + horizontalSplitContainer + + + 1 + + + 1020, 656 + + + 120 + + + 2 + + + horizontalSplitContainer + + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + verticalSplitContainer.Panel1 + + + 0 + + + verticalSplitContainer.Panel1 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + verticalSplitContainer + + + 0 + + + Fill + + + 0, 0 + + + Horizontal + + + True + + + Fill + + + TopDown + + + 0, 0 + + + 230, 240 + + + 1 + + + False + + + progressFlowLayoutPanel + + + System.Windows.Forms.FlowLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + rightHorizSplitContainer.Panel1 + + + 0 + + + rightHorizSplitContainer.Panel1 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + rightHorizSplitContainer + + + 0 + + + rightHorizSplitContainer.Panel2 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + rightHorizSplitContainer + + + 1 + + + 230, 656 + + + 240 + + + 0 + + + rightHorizSplitContainer + + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + verticalSplitContainer.Panel2 + + + 0 + + + verticalSplitContainer.Panel2 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + verticalSplitContainer + + + 1 + + + 1254, 656 + + + 1020 + + + 3 + + + verticalSplitContainer + + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + Fill + + + Verdana, 11.25pt + + + 0, 0 + + + 4, 4, 4, 4 + + + 1012, 523 + + + 0 + + + MeasurementTabPageCtrl + + + TBF.Screens.MeasurementTabPageCtrl, TBF, Version=2.18.933.0, Culture=neutral, PublicKeyToken=null + + + measurementTabPage + + + 0 + + + 4, 5 + + + 1012, 523 + + + 25 + + + Measurement + + + measurementTabPage + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 152, 17 + + + 0, 17 + + + 0, 17 + + + 0, 17 + + + 0, 17 + + + 0, 680 + + + 1254, 22 + + + 2 + + + statusStrip1 + + + statusStrip1 + + + System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + 143, 22 + + + Components + + + 143, 22 + + + Paths + + + 143, 22 + + + Transitions + + + 143, 22 + + + Metrology + + + 140, 6 + + + 143, 22 + + + Exit + + + 52, 20 + + + Bench + + + 52, 20 + + + Home + + + 56, 20 + + + Results + + + 44, 20 + + + Logs + + + 133, 22 + + + Users + + + 133, 22 + + + Language + + + 133, 22 + + + Database + + + 133, 22 + + + Password + + + 133, 22 + + + Upgrade + + + 133, 22 + + + iPerl Heads + + + 61, 20 + + + Settings + + + 107, 22 + + + About + + + 44, 20 + + + Help + + + 17, 17 + + + 78, 20 + + + Procedures + + + 59, 20 + + + Process + + + 56, 20 + + + Results + + + 56, 20 + + + Graphs + + + 0, 0 + + + 1254, 24 + + + 0 + + + mainMenuStrip + + + mainMenuStrip + + + System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + True + + + 40 + + + 6, 13 + + + 1254, 702 + + + Test Bench Framework + + + userInfoStatusLabel + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + statusPStatusLabel + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + routeStatusLabel + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + activityStatusLabel + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + benchTSMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + benchComponentsTSMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + benchPathsTSMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + benchTransitionsToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + benchMetrologyTSMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator1 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + exitToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + homeTSMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + resultsTSMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + logsTSMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + editTSMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + usersTSMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + localSettingsTSMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + databaseSettingsTSMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + passwortToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + upgradeTSMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + iPerlHeadsToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + helpTSMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + aboutTSMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + proceduresToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + processToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + resultsToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + graphsToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + MainWnd + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/MainWnd.ru.resx b/TBF_V2/Sources/TBF/TBF/MainWnd.ru.resx new file mode 100644 index 00000000..06591de0 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/MainWnd.ru.resx @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Процесс + + + Процедура + + + Прогресс + + + Гидравлика + + + Процесс + + + Вставить + + + Результаты + + + Логи + + + Изображения + + + Измерение + + + Строка состояния 1 + + + Установка + + + Компоненты + + + Пути + + + Переходы + + + Метрология + + + Выход + + + Домой + + + Результаты + + + Логи + + + Пользователь + + + Язык + + + База данных + + + Пароль + + + Обновить + + + Установки + + + Помощь + + + О + + + Процедуры + + + Процессы + + + Результаты + + + Печать + + + Заголовок главного меню + + + Framework поверочной установки + + + Пожалуйста, запустите процедуру + + + Измерение + + + Изображения + + + Пользователь: admin + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/MainWnd.zh-CN.resx b/TBF_V2/Sources/TBF/TBF/MainWnd.zh-CN.resx new file mode 100644 index 00000000..3609482d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/MainWnd.zh-CN.resx @@ -0,0 +1,280 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 活动 + + + 程序 + + + 进度 + + + 液压 + + + 过程 + + + 插入 + + + 结果 + + + 日志 + + + 图片 + + + 测量 + + + 状态栏1 + + + + 55, 20 + + + 工作台 + + + 98, 22 + + + 组件 + + + 98, 22 + + + 路径 + + + 98, 22 + + + 转换 + + + 98, 22 + + + 测量 + + + 95, 6 + + + 98, 22 + + + 退出 + + + 55, 20 + + + 主页面 + + + 结果 + + + 43, 20 + + + 日志 + + + 88, 20 + + + 设置 Settings + + + 153, 22 + + + 用户 + + + 153, 22 + + + 语言 Language + + + 153, 22 + + + 数据库 + + + 153, 22 + + + 密码 + + + 43, 20 + + + 帮助 + + + 98, 22 + + + 关于 + + + 维护菜单状态栏 + + + 43, 20 + + + 程序 + + + 43, 20 + + + 过程 + + + 43, 20 + + + 结果 + + + 43, 20 + + + 打印 + + + 校验台框架 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/MetrologyDlg.Designer.cs b/TBF_V2/Sources/TBF/TBF/MetrologyDlg.Designer.cs new file mode 100644 index 00000000..f9de3224 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/MetrologyDlg.Designer.cs @@ -0,0 +1,103 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF +{ + partial class MetrologyDlg + { + /// + /// 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() + { + this.splitContainer = new System.Windows.Forms.SplitContainer(); + this.metrologyTabControl = new System.Windows.Forms.TabControl(); + this.sharedButtons = new TBF.UiControls.SharedButtons(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit(); + this.splitContainer.Panel1.SuspendLayout(); + this.splitContainer.Panel2.SuspendLayout(); + this.splitContainer.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer + // + this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.splitContainer.Location = new System.Drawing.Point(0, 0); + this.splitContainer.Name = "splitContainer"; + // + // splitContainer.Panel1 + // + this.splitContainer.Panel1.Controls.Add(this.metrologyTabControl); + // + // splitContainer.Panel2 + // + this.splitContainer.Panel2.Controls.Add(this.sharedButtons); + this.splitContainer.Size = new System.Drawing.Size(965, 344); + this.splitContainer.SplitterDistance = 863; + this.splitContainer.TabIndex = 0; + // + // metrologyTabControl + // + this.metrologyTabControl.Dock = System.Windows.Forms.DockStyle.Fill; + this.metrologyTabControl.ItemSize = new System.Drawing.Size(60, 30); + this.metrologyTabControl.Location = new System.Drawing.Point(0, 0); + this.metrologyTabControl.Name = "metrologyTabControl"; + this.metrologyTabControl.SelectedIndex = 0; + this.metrologyTabControl.Size = new System.Drawing.Size(863, 344); + this.metrologyTabControl.TabIndex = 0; + this.metrologyTabControl.SelectedIndexChanged += new System.EventHandler(this.metrologyTabControl_SelectedIndexChanged); + // + // sharedButtons + // + this.sharedButtons.Location = new System.Drawing.Point(-2, 0); + this.sharedButtons.Name = "sharedButtons"; + this.sharedButtons.Size = new System.Drawing.Size(100, 400); + this.sharedButtons.TabIndex = 0; + // + // MetrologyDlg + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(965, 344); + this.Controls.Add(this.splitContainer); + this.Name = "MetrologyDlg"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Metrology"; + this.Load += new System.EventHandler(this.MetrologyDlg_Load); + this.splitContainer.Panel1.ResumeLayout(false); + this.splitContainer.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit(); + this.splitContainer.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer splitContainer; + private System.Windows.Forms.TabControl metrologyTabControl; + private UiControls.SharedButtons sharedButtons; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/MetrologyDlg.cs b/TBF_V2/Sources/TBF/TBF/MetrologyDlg.cs new file mode 100644 index 00000000..1681b79a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/MetrologyDlg.cs @@ -0,0 +1,231 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using NHibernate; +using log4net; +using Config.Entities; +using TBF.UiControls; +using TBF.BenchControl; +using TBF.Resources; + +namespace TBF +{ + public partial class MetrologyDlg : Form, IParentOfListViewEx + { + static readonly ILog log = LogManager.GetLogger(typeof(MetrologyDlg)); + + public IList cmpntEntities; + + ISession session; + + public MetrologyDlg() + { + InitializeComponent(); + + /// SharedDlgButtons configuration + sharedButtons.RequiredGroupMembership = Users.Grp.GID.Metrologists; + sharedButtons.OptionalButtons = SharedButtons.Buttons.Add | SharedButtons.Buttons.Remove; + sharedButtons.Unlocked += unlockButton_Click; + sharedButtons.OKClicked += okButton_Click; + sharedButtons.CancelClicked += cancelButton_Click; + sharedButtons.AddClicked += addButton_Click; + sharedButtons.RemoveClicked += removeButton_Click; + } + + private void MetrologyDlg_Load(object sender, EventArgs e) + { + TBF.LocalSettings ls = Program.LocalSettings; + Width = (ls.MetrologyDlgWidth > 0) ? ls.MetrologyDlgWidth : 900; + Height = (ls.MetrologyDlgHeight > 0) ? ls.MetrologyDlgHeight : 500; + Left = (ls.MetrologyDlgLeft != 0) ? ls.MetrologyDlgLeft : 200; + Top = (ls.MetrologyDlgTop != 0) ? ls.MetrologyDlgTop : 100; + + Text = Strings.Metrology; + + int fixedCount = 0; + int balancesCount = 0; + int flowMetersCount = 0; + int pressMetersCount = 0; + int tempMetersCount = 0; + int platinumTempMetersCount = 0; + + session = Config.FluentCommon.CreateSession(Users.Entities.DBKind.Config); + cmpntEntities = session.QueryOver() + .OrderBy(x => x. ItemNr).Asc + .List(); + + // Density tab-page + fixedCount++; + TabPage dstyTabPage = new TabPage(" " + Strings.Density + " "); + MetrologyDlgDensityTab uiCtl = new MetrologyDlgDensityTab(); + uiCtl.Dock = DockStyle.Fill; + dstyTabPage.Tag = uiCtl; + dstyTabPage.Controls.Add(uiCtl); + metrologyTabControl.TabPages.Add(dstyTabPage); + + foreach (var cmpnt in cmpntEntities) + { + BenchControl.Generic.IComponentFactory factory = TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName); + + // Balance tab-pages + if (factory is BenchControl.MettlerToledo.Standard.BalanceFactory || + factory is BenchControl.MettlerToledo.Standard.BalanceOldFactory || + factory is BenchControl.MettlerToledo.Standard.BalanceNewFactory || + factory is BenchControl.MettlerToledo.Multi.BalanceFactory) + { + balancesCount++; + TabPage tabPage = new TabPage(" " + cmpnt.Name + " "); + MetrologyDlgBalanceTab uiControl = new MetrologyDlgBalanceTab(); + uiControl.MeterEntity = cmpnt; + uiControl.BalanceCfg = factory.CmpntCfgFromCmpntEntity(cmpnt) as BenchControl.GenericDevices.IScaleCfg; + uiControl.Dock = DockStyle.Fill; + tabPage.Tag = uiControl; + tabPage.Controls.Add(uiControl); + metrologyTabControl.TabPages.Add(tabPage); + } + + // Flowmeter tab-pages + if (factory is BenchControl.Elde.FlowMeter.FlowMeterFactory) + { + BenchControl.Elde.FlowMeter.FlowMeterCfg flowMeterCfg = factory.CmpntCfgFromCmpntEntity(cmpnt) as BenchControl.Elde.FlowMeter.FlowMeterCfg; + + for (int r = 0; r <= 5; r++) + { + if (flowMeterCfg.RangeEnabled(r)) + { + flowMetersCount++; + TabPage tabPage = new TabPage(string.Format(((r == 0) ? " {0} " : " {0} r{1} "), cmpnt.Name, r)); + MetrologyDlgFlowMeterTab uiControl = new MetrologyDlgFlowMeterTab(r); + uiControl.MeterEntity = cmpnt; + uiControl.CalibInfoCfg = factory.CmpntCfgFromCmpntEntity(cmpnt) as BenchControl.GenericDevices.ICalibInfoCfg; + uiControl.Dock = DockStyle.Fill; + tabPage.Tag = uiControl; + tabPage.Controls.Add(uiControl); + metrologyTabControl.TabPages.Add(tabPage); + } + } + } + + // Pressure meter tab-pages + if (factory is BenchControl.Elde.PressureMeter.PressureMeterFactory) + { + pressMetersCount++; + TabPage tabPage = new TabPage(" " + cmpnt.Name + " "); + MetrologyDlgPressMeterTab uiControl = new MetrologyDlgPressMeterTab(); + uiControl.MeterEntity = cmpnt; + uiControl.Dock = DockStyle.Fill; + tabPage.Tag = uiControl; + tabPage.Controls.Add(uiControl); + metrologyTabControl.TabPages.Add(tabPage); + } + + // Temperature meter tab-pages + if (factory is BenchControl.Elde.TempMeter.TempMeterFactory || + factory is BenchControl.Elde.TempMeterInternal.TempMeterFactory) + { + tempMetersCount++; + TabPage tabPage = new TabPage(" " + cmpnt.Name + " "); + MetrologyDlgTempMeterTab uiControl = new MetrologyDlgTempMeterTab(); + uiControl.MeterEntity = cmpnt; + uiControl.Dock = DockStyle.Fill; + tabPage.Tag = uiControl; + tabPage.Controls.Add(uiControl); + metrologyTabControl.TabPages.Add(tabPage); + } + + // Platinum resistance temperature meter tab-pages + if (factory is BenchControl.Keithley.TempMeter.Factory) + { + platinumTempMetersCount++; + TabPage tabPage = new TabPage(" " + cmpnt.Name + " "); + MetrologyDlgPlatinumResistanceTMeterTab uiControl = new MetrologyDlgPlatinumResistanceTMeterTab(); + uiControl.MeterEntity = cmpnt; + uiControl.TempMeterCfg = factory.CmpntCfgFromCmpntEntity(cmpnt) as BenchControl.Keithley.TempMeter.TempMeterCfg; + uiControl.Dock = DockStyle.Fill; + tabPage.Tag = uiControl; + tabPage.Controls.Add(uiControl); + metrologyTabControl.TabPages.Add(tabPage); + } + } + } + + private void unlockButton_Click(object sender, EventArgs e) + { + foreach (TabPage tabPage in metrologyTabControl.TabPages) + { + (tabPage.Tag as IMetrologyDlgTab).Unlock(); + } + } + + private void okButton_Click(object sender, EventArgs e) + { + foreach (TabPage tabPage in metrologyTabControl.TabPages) + { + IMetrologyDlgTab tab = tabPage.Tag as IMetrologyDlgTab; + tab.OkBtnClicked(); + + if (!(tabPage.Tag is MetrologyDlgDensityTab)) + { + Config.FluentCommon.SaveToDb(session, tab.MeterEntity); + foreach (var entity in tab.ToBeRemoved) Config.FluentCommon.DeleteFromDb(session, entity); + } + } + + Program.LocalSettings.MetrologyDlgLeft = Location.X; + Program.LocalSettings.MetrologyDlgTop = Location.Y; + Program.LocalSettings.MetrologyDlgWidth = Size.Width; + Program.LocalSettings.MetrologyDlgHeight = Size.Height; + Program.LocalSettings.Save(); + + DialogResult = DialogResult.OK; + Close(); + } + + private void cancelButton_Click(object sender, EventArgs e) + { + foreach (TabPage tabPage in metrologyTabControl.TabPages) + { + (tabPage.Tag as IMetrologyDlgTab).CancelBtnClicked(); + } + + Program.LocalSettings.MetrologyDlgLeft = Location.X; + Program.LocalSettings.MetrologyDlgTop = Location.Y; + Program.LocalSettings.MetrologyDlgWidth = Size.Width; + Program.LocalSettings.MetrologyDlgHeight = Size.Height; + Program.LocalSettings.Save(); + + DialogResult = DialogResult.Cancel; + Close(); + } + + private void addButton_Click(object sender, EventArgs e) + { + (metrologyTabControl.SelectedTab.Tag as IMetrologyDlgTab).AddOne(); + } + + private void removeButton_Click(object sender, EventArgs e) + { + (metrologyTabControl.SelectedTab.Tag as IMetrologyDlgTab).RemoveSelected(); + } + + public void UpdateButtonStates(SharedButtons.SelectedItemPos selectedItemPos) + { + if (selectedItemPos == SharedButtons.SelectedItemPos.None) + { + sharedButtons.DisableButtons(SharedButtons.Buttons.Remove); + } + else + { + sharedButtons.EnableButtons(SharedButtons.Buttons.Remove); + } + } + + private void metrologyTabControl_SelectedIndexChanged(object sender, EventArgs e) + { + sharedButtons.DisableButtons(SharedButtons.Buttons.Remove); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/MetrologyDlg.resx b/TBF_V2/Sources/TBF/TBF/MetrologyDlg.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/MetrologyDlg.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/PathsDlg.Designer.cs b/TBF_V2/Sources/TBF/TBF/PathsDlg.Designer.cs new file mode 100644 index 00000000..e78a271a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/PathsDlg.Designer.cs @@ -0,0 +1,193 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF +{ + partial class PathsDlg + { + /// + /// 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(PathsDlg)); + this.splitContainer = new System.Windows.Forms.SplitContainer(); + this.pathsTabControl = new System.Windows.Forms.TabControl(); + this.feedingTabPage = new System.Windows.Forms.TabPage(); + this.pathsFeedingCtrl = new TBF.UiControls.PathsFeedingCtrl(); + this.benchTabPage = new System.Windows.Forms.TabPage(); + this.pathsBenchCtrl = new TBF.UiControls.PathsBenchCtrl(); + this.outputTabPage = new System.Windows.Forms.TabPage(); + this.pathsOutputCtrl = new TBF.UiControls.PathsOutputCtrl(); + this.metersTabPage = new System.Windows.Forms.TabPage(); + this.pathsMetersCtrl = new TBF.UiControls.PathsMetersCtrl(); + this.sharedButtons = new TBF.UiControls.SharedButtons(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit(); + this.splitContainer.Panel1.SuspendLayout(); + this.splitContainer.Panel2.SuspendLayout(); + this.splitContainer.SuspendLayout(); + this.pathsTabControl.SuspendLayout(); + this.feedingTabPage.SuspendLayout(); + this.benchTabPage.SuspendLayout(); + this.outputTabPage.SuspendLayout(); + this.metersTabPage.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer + // + resources.ApplyResources(this.splitContainer, "splitContainer"); + this.splitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.splitContainer.Name = "splitContainer"; + // + // splitContainer.Panel1 + // + this.splitContainer.Panel1.Controls.Add(this.pathsTabControl); + // + // splitContainer.Panel2 + // + this.splitContainer.Panel2.Controls.Add(this.sharedButtons); + // + // pathsTabControl + // + this.pathsTabControl.Controls.Add(this.feedingTabPage); + this.pathsTabControl.Controls.Add(this.benchTabPage); + this.pathsTabControl.Controls.Add(this.outputTabPage); + this.pathsTabControl.Controls.Add(this.metersTabPage); + resources.ApplyResources(this.pathsTabControl, "pathsTabControl"); + this.pathsTabControl.Name = "pathsTabControl"; + this.pathsTabControl.SelectedIndex = 0; + this.pathsTabControl.SelectedIndexChanged += new System.EventHandler(this.pathsTabControl_SelectedIndexChanged); + // + // feedingTabPage + // + this.feedingTabPage.Controls.Add(this.pathsFeedingCtrl); + resources.ApplyResources(this.feedingTabPage, "feedingTabPage"); + this.feedingTabPage.Name = "feedingTabPage"; + this.feedingTabPage.UseVisualStyleBackColor = true; + // + // pathsFeedingCtrl + // + resources.ApplyResources(this.pathsFeedingCtrl, "pathsFeedingCtrl"); + this.pathsFeedingCtrl.DoubleClickActivation = false; + this.pathsFeedingCtrl.FullRowSelect = true; + this.pathsFeedingCtrl.GridLines = true; + this.pathsFeedingCtrl.Name = "pathsFeedingCtrl"; + this.pathsFeedingCtrl.UseCompatibleStateImageBehavior = false; + this.pathsFeedingCtrl.View = System.Windows.Forms.View.Details; + this.pathsFeedingCtrl.SelectedIndexChanged += new System.EventHandler(this.SelectedIndexChanged); + // + // benchTabPage + // + this.benchTabPage.Controls.Add(this.pathsBenchCtrl); + resources.ApplyResources(this.benchTabPage, "benchTabPage"); + this.benchTabPage.Name = "benchTabPage"; + this.benchTabPage.UseVisualStyleBackColor = true; + // + // pathsBenchCtrl + // + resources.ApplyResources(this.pathsBenchCtrl, "pathsBenchCtrl"); + this.pathsBenchCtrl.DoubleClickActivation = false; + this.pathsBenchCtrl.FullRowSelect = true; + this.pathsBenchCtrl.GridLines = true; + this.pathsBenchCtrl.Name = "pathsBenchCtrl"; + this.pathsBenchCtrl.UseCompatibleStateImageBehavior = false; + this.pathsBenchCtrl.View = System.Windows.Forms.View.Details; + this.pathsBenchCtrl.SelectedIndexChanged += new System.EventHandler(this.SelectedIndexChanged); + // + // outputTabPage + // + this.outputTabPage.Controls.Add(this.pathsOutputCtrl); + resources.ApplyResources(this.outputTabPage, "outputTabPage"); + this.outputTabPage.Name = "outputTabPage"; + this.outputTabPage.UseVisualStyleBackColor = true; + // + // pathsOutputCtrl + // + resources.ApplyResources(this.pathsOutputCtrl, "pathsOutputCtrl"); + this.pathsOutputCtrl.DoubleClickActivation = false; + this.pathsOutputCtrl.FullRowSelect = true; + this.pathsOutputCtrl.GridLines = true; + this.pathsOutputCtrl.Name = "pathsOutputCtrl"; + this.pathsOutputCtrl.UseCompatibleStateImageBehavior = false; + this.pathsOutputCtrl.View = System.Windows.Forms.View.Details; + this.pathsOutputCtrl.SelectedIndexChanged += new System.EventHandler(this.SelectedIndexChanged); + // + // metersTabPage + // + this.metersTabPage.Controls.Add(this.pathsMetersCtrl); + resources.ApplyResources(this.metersTabPage, "metersTabPage"); + this.metersTabPage.Name = "metersTabPage"; + this.metersTabPage.UseVisualStyleBackColor = true; + // + // pathsMetersCtrl + // + resources.ApplyResources(this.pathsMetersCtrl, "pathsMetersCtrl"); + this.pathsMetersCtrl.DoubleClickActivation = false; + this.pathsMetersCtrl.FullRowSelect = true; + this.pathsMetersCtrl.GridLines = true; + this.pathsMetersCtrl.Name = "pathsMetersCtrl"; + this.pathsMetersCtrl.UseCompatibleStateImageBehavior = false; + this.pathsMetersCtrl.View = System.Windows.Forms.View.Details; + this.pathsMetersCtrl.SelectedIndexChanged += new System.EventHandler(this.SelectedIndexChanged); + // + // sharedButtons + // + resources.ApplyResources(this.sharedButtons, "sharedButtons"); + this.sharedButtons.Name = "sharedButtons"; + // + // PathsDlg + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.splitContainer); + this.Name = "PathsDlg"; + this.Load += new System.EventHandler(this.PathsDlg_Load); + this.splitContainer.Panel1.ResumeLayout(false); + this.splitContainer.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit(); + this.splitContainer.ResumeLayout(false); + this.pathsTabControl.ResumeLayout(false); + this.feedingTabPage.ResumeLayout(false); + this.benchTabPage.ResumeLayout(false); + this.outputTabPage.ResumeLayout(false); + this.metersTabPage.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer splitContainer; + private System.Windows.Forms.TabControl pathsTabControl; + private System.Windows.Forms.TabPage feedingTabPage; + private System.Windows.Forms.TabPage benchTabPage; + private System.Windows.Forms.TabPage outputTabPage; + private System.Windows.Forms.TabPage metersTabPage; + private UiControls.SharedButtons sharedButtons; + private UiControls.PathsFeedingCtrl pathsFeedingCtrl; + private UiControls.PathsBenchCtrl pathsBenchCtrl; + private UiControls.PathsOutputCtrl pathsOutputCtrl; + private UiControls.PathsMetersCtrl pathsMetersCtrl; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/PathsDlg.cs b/TBF_V2/Sources/TBF/TBF/PathsDlg.cs new file mode 100644 index 00000000..770961d7 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/PathsDlg.cs @@ -0,0 +1,329 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Windows.Forms; +using NHibernate; +using log4net; +using Config.Entities; +using TBF.UiControls; +using TBF.BenchControl.GenericDevices; +using TBF.Resources; + +namespace TBF +{ + public partial class PathsDlg : Form, IParentOfListViewEx + { + static readonly ILog log = LogManager.GetLogger(typeof(PathsDlg)); + + enum PathsDlgTabs + { + Feeding, + Bench, + Output, + WaterMeters, + HeatMeters, + } + + /// Used when re-scaling the dialog: 100% = 96dpi, 125% = 120dpi, 150% = 144dpi + public readonly int Dpi; + public const int Dpi100pct = 96; + + public IList TbfComponents; + public IList Valves; + public IList FeedingRegulValves; + public ISession Session; /// One common DB session passed also to the controls inside tab pages + public IList Procedures; + public IList Tests; + +#if HEAT_METERS + private System.Windows.Forms.TabPage heatMetersTabPage; + private UiControls.PathsHeatMetersCtrl pathsHeatMetersCtrl; +#endif + + public PathsDlg() + { + /// Detect display setting: 100% = 96dpi, 125% = 120dpi, 150% = 144dpi. + Dpi = (int)this.CreateGraphics().DpiX; + + InitializeComponent(); + + /// SharedDlgButtons configuration + sharedButtons.RequiredGroupMembership = Users.Grp.GID.Metrologists; + sharedButtons.OptionalButtons = SharedButtons.Buttons.Add | SharedButtons.Buttons.Remove | + SharedButtons.Buttons.Up | SharedButtons.Buttons.Down; + sharedButtons.Unlocked += Unlocked; + sharedButtons.OKClicked += okButton_Click; + sharedButtons.CancelClicked += cancelButton_Click; + sharedButtons.AddClicked += addButton_Click; + sharedButtons.RemoveClicked += removeButton_Click; + sharedButtons.UpClicked += upButton_Click; + sharedButtons.DownClicked += downButton_Click; + + /// Load the list of components from the database + TbfComponents = BenchControl.TbfComponents.LoadComponentsFromDB(Config.FluentCommon.CreateSession(Users.Entities.DBKind.Config)); + + /// Find all master valves + Valves = BenchControl.GenericDevices.ValveBase.MasterValves(TbfComponents); + + /// Find all feeding regulation valves + FeedingRegulValves = new List(); + foreach (var cmpnt in TbfComponents) + { + IRegulValve regValve = cmpnt as IRegulValve; + if (regValve != null && (regValve.Category == TBF.BenchControl.ValveCategory.Feeding || regValve.Category == TBF.BenchControl.ValveCategory.All)) + { + FeedingRegulValves.Add(regValve); + } + } + + /// Create the database session for paths + Session = Config.FluentCommon.CreateSession(Users.Entities.DBKind.Config); + + Procedures = Session.QueryOver().List(); + Tests = Session.QueryOver().List(); + + pathsTabControl.TabPages[(int)PathsDlgTabs.Feeding].Tag = pathsFeedingCtrl; + pathsTabControl.TabPages[(int)PathsDlgTabs.Bench].Tag = pathsBenchCtrl; + pathsTabControl.TabPages[(int)PathsDlgTabs.Output].Tag = pathsOutputCtrl; + pathsTabControl.TabPages[(int)PathsDlgTabs.WaterMeters].Tag = pathsMetersCtrl; + + // Requires 'Session' to be created + pathsFeedingCtrl.Initialize(this, pathsTabControl.TabPages[(int)PathsDlgTabs.Feeding]); + pathsBenchCtrl.Initialize(this, pathsTabControl.TabPages[(int)PathsDlgTabs.Bench]); + pathsOutputCtrl.Initialize(this, pathsTabControl.TabPages[(int)PathsDlgTabs.Output]); + pathsMetersCtrl.Initialize(this, pathsTabControl.TabPages[(int)PathsDlgTabs.WaterMeters]); + +#if HEAT_METERS + this.heatMetersTabPage = new System.Windows.Forms.TabPage(); + this.pathsHeatMetersCtrl = new TBF.UiControls.PathsHeatMetersCtrl(); + + this.heatMetersTabPage.SuspendLayout(); + this.SuspendLayout(); + + this.pathsTabControl.Controls.Add(this.heatMetersTabPage); + // + // heatMetersTabPage + // + this.heatMetersTabPage.Controls.Add(this.pathsHeatMetersCtrl); + this.heatMetersTabPage.Name = "heatMetersTabPage"; + this.heatMetersTabPage.UseVisualStyleBackColor = true; + // + // pathsHeatMetersCtrl + // + this.pathsHeatMetersCtrl.DoubleClickActivation = false; + this.pathsHeatMetersCtrl.FullRowSelect = true; + this.pathsHeatMetersCtrl.GridLines = true; + this.pathsHeatMetersCtrl.Name = "pathsHeatMetersCtrl"; + this.pathsHeatMetersCtrl.UseCompatibleStateImageBehavior = false; + this.pathsHeatMetersCtrl.View = System.Windows.Forms.View.Details; + this.pathsHeatMetersCtrl.SelectedIndexChanged += new System.EventHandler(this.SelectedIndexChanged); + + this.heatMetersTabPage.ResumeLayout(false); + this.ResumeLayout(false); + + pathsTabControl.TabPages[(int)PathsDlgTabs.HeatMeters].Tag = pathsHeatMetersCtrl; + + // Requires 'Session' to be created + pathsHeatMetersCtrl.Initialize(this, pathsTabControl.TabPages[(int)PathsDlgTabs.HeatMeters]); +#endif + } + + private void PathsDlg_Load(object sender, EventArgs e) + { + Localize(); + TBF.LocalSettings ls = Program.LocalSettings; + Width = (ls.PathsDlgWidth > 0) ? ls.PathsDlgWidth : 1050; + Height = (ls.PathsDlgHeight > 0) ? ls.PathsDlgHeight : 360; + Left = (ls.PathsDlgLeft != 0) ? ls.PathsDlgLeft : 150; + Top = (ls.PathsDlgTop != 0) ? ls.PathsDlgTop : 150; + } + + private void Localize() + { + Text = Strings.PathsDlgTitle; + pathsTabControl.TabPages[(int)PathsDlgTabs.Feeding].Text = Strings.FeedingTabPageTitle; + pathsTabControl.TabPages[(int)PathsDlgTabs.Bench].Text = Strings.BenchTabPageTitle; + pathsTabControl.TabPages[(int)PathsDlgTabs.Output].Text = Strings.OutputTabPageTitle; + pathsTabControl.TabPages[(int)PathsDlgTabs.WaterMeters].Text = Strings.MetersTabPageTitle; +#if HEAT_METERS + pathsTabControl.TabPages[(int)PathsDlgTabs.HeatMeters].Text = Strings.Heat_meter_sensors; /// Localization +#endif + } + + private void Unlocked(object sender, EventArgs e) + { + foreach (TabPage tab in pathsTabControl.TabPages) + { + (tab.Tag as ITabWithListViewEx).Unlock(); + } + } + + private void okButton_Click(object sender, EventArgs e) + { + string warnings = string.Empty; + Dictionary[] renameInfo = new Dictionary[pathsTabControl.TabPages.Count]; + + for (int i = 0; i < pathsTabControl.TabPages.Count; i++) + { + TabPage tab = pathsTabControl.TabPages[i]; + renameInfo[i] = new Dictionary(); + if (tab.Tag is ITabWithListViewEx) + { + warnings += (tab.Tag as ITabWithListViewEx).GetWarningsBeforeSaving(ref renameInfo[i]); + } + } + + bool updateRelatedItems = false; + if (!string.IsNullOrEmpty(warnings)) + { + string message = string.Format("{0}{1}{2}", warnings, Environment.NewLine, + Strings.Do_you_want_to_update_related_tests_and_procedures); + DialogResult dr = MessageBox.Show(message, Strings.Warning, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation); + if (dr == DialogResult.Cancel) + { + DialogResult = DialogResult.Cancel; + return; + } + else if (dr == DialogResult.Yes) + { + updateRelatedItems = true; + } + } + + Cursor.Current = Cursors.WaitCursor; + + using (var transaction = Session.BeginTransaction()) + { + try + { + if (updateRelatedItems) + { + for (int i = 0; i < pathsTabControl.TabPages.Count; i++) + { + TabPage tab = pathsTabControl.TabPages[i]; + if (tab.Tag is ITabWithListViewEx) (tab.Tag as ITabWithListViewEx).UpdateRelatedItems(renameInfo[i]); + } + } + + foreach (TabPage tab in pathsTabControl.TabPages) + { + (tab.Tag as ITabWithListViewEx).OkBtnClicked(); + } + + transaction.Commit(); + } + catch (Exception exc) + { + transaction.Rollback(); + Cursor.Current = Cursors.Default; + + MessageBox.Show(Strings.Cannot_save_changes, Strings.Error, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + log.ErrorFormat("Update of paths in the database failed: {0}", exc.Message); + } + } + + Cursor.Current = Cursors.Default; + + Program.LocalSettings.PathsDlgLeft = Location.X; + Program.LocalSettings.PathsDlgTop = Location.Y; + Program.LocalSettings.PathsDlgWidth = Size.Width; + Program.LocalSettings.PathsDlgHeight = Size.Height; + Program.LocalSettings.Save(); + + DialogResult = DialogResult.OK; + Close(); + } + + private void cancelButton_Click(object sender, EventArgs e) + { + Program.LocalSettings.PathsDlgLeft = Location.X; + Program.LocalSettings.PathsDlgTop = Location.Y; + Program.LocalSettings.PathsDlgWidth = Size.Width; + Program.LocalSettings.PathsDlgHeight = Size.Height; + Program.LocalSettings.Save(); + + foreach (TabPage tab in pathsTabControl.TabPages) + { + (tab.Tag as ITabWithListViewEx).CancelBtnClicked(); + } + DialogResult = DialogResult.Cancel; + Close(); + } + + private void addButton_Click(object sender, EventArgs e) + { + (pathsTabControl.SelectedTab.Tag as ITabWithListViewEx).AddOne(); + } + + private void removeButton_Click(object sender, EventArgs e) + { + (pathsTabControl.SelectedTab.Tag as ITabWithListViewEx).RemoveSelected(); + } + + private void upButton_Click(object sender, EventArgs e) + { + (pathsTabControl.SelectedTab.Tag as ITabWithListViewEx).MoveUpSelected(); + } + + private void downButton_Click(object sender, EventArgs e) + { + (pathsTabControl.SelectedTab.Tag as ITabWithListViewEx).MoveDownSelected(); + } + + /// + /// Common part for three xxxListViewEx_SelectedIndexChanged event handlers + /// + /// + void SelectedIndexChanged(object sender, EventArgs e) + { + Results.Forms.ListViewEx listViewEx = sender as Results.Forms.ListViewEx; + if (listViewEx.SelectedItems.Count != 1) + { + /// No item selected + sharedButtons.DisableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up | SharedButtons.Buttons.Down); + } + else if (listViewEx.Items.Count == 1) + { + /// One (the first and the last) item selected + sharedButtons.EnableButtons(SharedButtons.Buttons.Remove); + sharedButtons.DisableButtons(SharedButtons.Buttons.Up | SharedButtons.Buttons.Down); + } + else if (listViewEx.SelectedIndices[0] == 0) + { + /// The first of many items selected + sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Down); + sharedButtons.DisableButtons(SharedButtons.Buttons.Up); + } + else if (listViewEx.SelectedIndices[0] == (listViewEx.Items.Count - 1)) + { + /// The last of many items selected + sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up); + sharedButtons.DisableButtons(SharedButtons.Buttons.Down); + } + else + { + /// One of middle items selected + sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up | SharedButtons.Buttons.Down); + } + } + + /// + /// Tab page changed - item is unselected + /// + private void pathsTabControl_SelectedIndexChanged(object sender, EventArgs e) + { + UpdateButtonStates(SharedButtons.SelectedItemPos.None); + } + + public void UpdateButtonStates(SharedButtons.SelectedItemPos selectedItemPos) + { + if (selectedItemPos == SharedButtons.SelectedItemPos.None) + { + sharedButtons.DisableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up | SharedButtons.Buttons.Down); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/PathsDlg.pl.resx b/TBF_V2/Sources/TBF/TBF/PathsDlg.pl.resx new file mode 100644 index 00000000..fc5227b0 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/PathsDlg.pl.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Zasilanie + + + Stanowisko + + + Wyjście + + + Czujniki + + + Czujniki licznika ciepła + + + Ustawienia - Ścieżki + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/PathsDlg.resx b/TBF_V2/Sources/TBF/TBF/PathsDlg.resx new file mode 100644 index 00000000..5aaef699 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/PathsDlg.resx @@ -0,0 +1,495 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + Fill + + + + True + + + + 0, 0 + + + Fill + + + 3, 3 + + + 825, 271 + + + 0 + + + pathsFeedingCtrl + + + TBF.UiControls.PathsFeedingCtrl, TBF, Version=2.8.315.1, Culture=neutral, PublicKeyToken=null + + + feedingTabPage + + + 0 + + + 4, 34 + + + 3, 3, 3, 3 + + + 831, 277 + + + 0 + + + Feeding + + + feedingTabPage + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + pathsTabControl + + + 0 + + + Fill + + + 3, 3 + + + 825, 271 + + + 0 + + + pathsBenchCtrl + + + TBF.UiControls.PathsBenchCtrl, TBF, Version=2.8.315.1, Culture=neutral, PublicKeyToken=null + + + benchTabPage + + + 0 + + + 4, 34 + + + 3, 3, 3, 3 + + + 831, 277 + + + 1 + + + Bench + + + benchTabPage + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + pathsTabControl + + + 1 + + + Fill + + + 3, 3 + + + 825, 271 + + + 0 + + + pathsOutputCtrl + + + TBF.UiControls.PathsOutputCtrl, TBF, Version=2.8.315.1, Culture=neutral, PublicKeyToken=null + + + outputTabPage + + + 0 + + + 4, 34 + + + 3, 3, 3, 3 + + + 831, 277 + + + 2 + + + Output + + + outputTabPage + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + pathsTabControl + + + 2 + + + Fill + + + 0, 0 + + + 831, 277 + + + 0 + + + pathsMetersCtrl + + + TBF.UiControls.PathsMetersCtrl, TBF, Version=2.8.315.1, Culture=neutral, PublicKeyToken=null + + + metersTabPage + + + 0 + + + 4, 34 + + + 831, 277 + + + 3 + + + Sensors + + + metersTabPage + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + pathsTabControl + + + 3 + + + Fill + + + 0, 0 + + + 831, 277 + + + 0 + + + pathsHeatMetersCtrl + + + TBF.UiControls.PathsHeatMetersCtrl, TBF, Version=2.8.315.1, Culture=neutral, PublicKeyToken=null + + + heatMetersTabPage + + + 0 + + + 4, 34 + + + 831, 277 + + + 4 + + + Heat meter sensors + + + heatMetersTabPage + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + pathsTabControl + + + 4 + + + Fill + + + 42, 30 + + + 0, 0 + + + 839, 315 + + + 0 + + + pathsTabControl + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer.Panel1 + + + 0 + + + splitContainer.Panel1 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer + + + 0 + + + -2, 0 + + + 100, 521 + + + 0 + + + sharedButtons + + + TBF.UiControls.SharedButtons, TBF, Version=2.8.315.1, Culture=neutral, PublicKeyToken=null + + + splitContainer.Panel2 + + + 0 + + + splitContainer.Panel2 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer + + + 1 + + + 941, 315 + + + 839 + + + 0 + + + splitContainer + + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + + + 6, 13 + + + 941, 315 + + + CenterParent + + + Bench - Paths + + + PathsDlg + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/PathsDlg.ru.resx b/TBF_V2/Sources/TBF/TBF/PathsDlg.ru.resx new file mode 100644 index 00000000..03b205ed --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/PathsDlg.ru.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Подача + + + Установка + + + Выход + + + Датчики + + + Датчики теплосчетчика + + + Установка - Пути + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/PreferencesDlg.Designer.cs b/TBF_V2/Sources/TBF/TBF/PreferencesDlg.Designer.cs new file mode 100644 index 00000000..59320f2a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/PreferencesDlg.Designer.cs @@ -0,0 +1,85 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF +{ + partial class PreferencesDlg + { + /// + /// 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(PreferencesDlg)); + this.okButton = new System.Windows.Forms.Button(); + this.cancelButton = new System.Windows.Forms.Button(); + this.languageListBox = new System.Windows.Forms.ListBox(); + this.SuspendLayout(); + // + // okButton + // + this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK; + resources.ApplyResources(this.okButton, "okButton"); + this.okButton.Name = "okButton"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // cancelButton + // + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + resources.ApplyResources(this.cancelButton, "cancelButton"); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.UseVisualStyleBackColor = true; + this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click); + // + // languageListBox + // + this.languageListBox.FormattingEnabled = true; + resources.ApplyResources(this.languageListBox, "languageListBox"); + this.languageListBox.Name = "languageListBox"; + this.languageListBox.SelectedIndexChanged += new System.EventHandler(this.languageListBox_SelectedIndexChanged); + // + // PreferencesDlg + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.languageListBox); + this.Controls.Add(this.okButton); + this.Controls.Add(this.cancelButton); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.MaximizeBox = false; + this.Name = "PreferencesDlg"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Load += new System.EventHandler(this.PreferencesDlg_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.ListBox languageListBox; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/PreferencesDlg.cs b/TBF_V2/Sources/TBF/TBF/PreferencesDlg.cs new file mode 100644 index 00000000..882278c6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/PreferencesDlg.cs @@ -0,0 +1,136 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Globalization; +using TBF.Resources; + +namespace TBF +{ + + /// + /// Dialog to edit local settings that specify UI preferences, language, etc. (S1.1) + /// + public partial class PreferencesDlg : Form + { + string[] LanguageName = new string[] + { + "English", + "Česky (Czech)", + "中国 (Chinese simplified)", + "Deutch (German)", + "Español (Spanish)", + "Français (French)", + "Italiano (Italian)", + "Polski (Polish)", + "Română (Romanian)", + "Русский (Russion)", + "Slovensky (Slovak)", + }; + + /// + /// Available languages. + /// Method ToString should give a supported culture info string: + /// ("en","de","fr","es","it","cn", etc.). + /// + string[] LanguageCode = new string[] + { + "en", + "cs", + "zh-CN", + "de", + "es", + "fr", + "it", + "pl", + "ro", + "ru", + "sk", + }; + + // Local copy of 'local settings' initialized to Program.localSettings. + // Dialog modifies this copy and updates Program.localSettings just + // when 'OK' is pressed. + LocalSettings localSettings; + + public PreferencesDlg() + { + Program.LocalSettings.Save(); + localSettings = LocalSettings.Load(Program.LocalSettingsFileName); + if (localSettings == null) throw new Exception("Cannot load local settings"); + + InitializeComponent(); + + // Initialize the list box with langauges + for (int i = 0; i < LanguageName.Length; i++) + { + languageListBox.Items.Add(LanguageName[i]); + if (localSettings.Language == LanguageCode[i]) + { + languageListBox.Text = LanguageName[i]; + } + } + } + + private void PreferencesDlg_Load(object sender, EventArgs e) + { + Text = Strings.Language; + okButton.Text = Strings.OkBtnText; + cancelButton.Text = Strings.CancelBtnText; + } + + private void languageListBox_SelectedIndexChanged(object sender, EventArgs e) + { + localSettings.Language = LanguageCode[languageListBox.SelectedIndex]; + } + + /// + /// Update setting, return DialogResult.OK + /// + /// Not used + /// Not used + private void okButton_Click(object sender, EventArgs e) + { + try + { + string culture = localSettings.Language.Replace('_', '-'); + CultureInfo ci = new CultureInfo(culture); + System.Threading.Thread.CurrentThread.CurrentUICulture = ci; + + localSettings.Save(); + Program.LocalSettings = LocalSettings.Load(Program.LocalSettingsFileName); + + DialogResult response = MessageBox.Show(Strings.Restart_To_Apply_Changes); + + DialogResult = DialogResult.OK; + Close(); + } + catch + { + MessageBox.Show("Selected language not supported.\nUsing English.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); + localSettings.Language = "en"; + System.Threading.Thread.CurrentThread.CurrentUICulture = + new System.Globalization.CultureInfo(localSettings.Language); + } + return; + } + + /// + /// Throw away changes, return DialogResult.Cancel + /// + /// Not used + /// Not used + private void cancelButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + return; + } + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/PreferencesDlg.pl.resx b/TBF_V2/Sources/TBF/TBF/PreferencesDlg.pl.resx new file mode 100644 index 00000000..39bbb974 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/PreferencesDlg.pl.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + OK + + + Anuluj + + + Język + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/PreferencesDlg.resx b/TBF_V2/Sources/TBF/TBF/PreferencesDlg.resx new file mode 100644 index 00000000..3dbf9c81 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/PreferencesDlg.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + 168, 11 + + + 105, 28 + + + + 10 + + + OK + + + okButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + 168, 45 + + + 105, 28 + + + 9 + + + Cancel + + + cancelButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + 13, 12 + + + 143, 225 + + + 11 + + + languageListBox + + + System.Windows.Forms.ListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + + + 6, 13 + + + 283, 247 + + + + CenterParent + + + Language + + + PreferencesDlg + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/PreferencesDlg.ru.resx b/TBF_V2/Sources/TBF/TBF/PreferencesDlg.ru.resx new file mode 100644 index 00000000..a947c847 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/PreferencesDlg.ru.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + OK + + + Отмена + + + Язык + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/ProcedureDlg.Designer.cs b/TBF_V2/Sources/TBF/TBF/ProcedureDlg.Designer.cs new file mode 100644 index 00000000..1b63d2ef --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/ProcedureDlg.Designer.cs @@ -0,0 +1,572 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF +{ + partial class ProcedureDlg + { + /// + /// 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(ProcedureDlg)); + this.mainSplitContainer = new System.Windows.Forms.SplitContainer(); + this.tabControl = new System.Windows.Forms.TabControl(); + this.generalTabPage = new System.Windows.Forms.TabPage(); + this.altProcPeriodTextBox = new System.Windows.Forms.TextBox(); + this.altProcPeriodLabel = new System.Windows.Forms.Label(); + this.altProcNameTextBox = new System.Windows.Forms.TextBox(); + this.altProcNameLabel = new System.Windows.Forms.Label(); + this.manualControlDisabledCheckBox = new System.Windows.Forms.CheckBox(); + this.mustBeCompleteCheckBox = new System.Windows.Forms.CheckBox(); + this.protectedCheckBox = new System.Windows.Forms.CheckBox(); + this.metersKindRadioButton3 = new System.Windows.Forms.RadioButton(); + this.fileWriter4ComboBox = new System.Windows.Forms.ComboBox(); + this.fileWriter3ComboBox = new System.Windows.Forms.ComboBox(); + this.printer2ComboBox = new System.Windows.Forms.ComboBox(); + this.fileWriter2ComboBox = new System.Windows.Forms.ComboBox(); + this.metersKindRadioButton2 = new System.Windows.Forms.RadioButton(); + this.metersKindRadioButton1 = new System.Windows.Forms.RadioButton(); + this.transitionEndComboBox = new System.Windows.Forms.ComboBox(); + this.transitionEndLabel = new System.Windows.Forms.Label(); + this.transitionStartComboBox = new System.Windows.Forms.ComboBox(); + this.transitionStartLabel = new System.Windows.Forms.Label(); + this.fileWriter1ComboBox = new System.Windows.Forms.ComboBox(); + this.printer1ComboBox = new System.Windows.Forms.ComboBox(); + this.dataEntryComboBox = new System.Windows.Forms.ComboBox(); + this.resultsWriterLabel = new System.Windows.Forms.Label(); + this.resultsPrinterLabel = new System.Windows.Forms.Label(); + this.dataEntryLabel = new System.Windows.Forms.Label(); + this.notesTextBox = new System.Windows.Forms.TextBox(); + this.label18 = new System.Windows.Forms.Label(); + this.watermetersTextBox = new System.Windows.Forms.TextBox(); + this.watermetersLabel = new System.Windows.Forms.Label(); + this.lastChangedOnTextBox = new System.Windows.Forms.TextBox(); + this.label15 = new System.Windows.Forms.Label(); + this.lastChangedByTextBox = new System.Windows.Forms.TextBox(); + this.label16 = new System.Windows.Forms.Label(); + this.createdOnTextBox = new System.Windows.Forms.TextBox(); + this.label14 = new System.Windows.Forms.Label(); + this.createdByTextBox = new System.Windows.Forms.TextBox(); + this.label13 = new System.Windows.Forms.Label(); + this.descriptionTextBox = new System.Windows.Forms.TextBox(); + this.label12 = new System.Windows.Forms.Label(); + this.procNameTextBox = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.historyTabPage = new System.Windows.Forms.TabPage(); + this.historyListViewEx = new Results.Forms.ListViewEx(); + this.metrology1TabPage = new System.Windows.Forms.TabPage(); + this.metrology1ListViewEx = new Results.Forms.ListViewEx(); + this.metrology2TabPage = new System.Windows.Forms.TabPage(); + this.metrology2ListViewEx = new Results.Forms.ListViewEx(); + this.processTabPage = new System.Windows.Forms.TabPage(); + this.processListViewEx = new Results.Forms.ListViewEx(); + this.parametersTabPage = new System.Windows.Forms.TabPage(); + this.parametersListViewEx = new Results.Forms.ListViewEx(); + this.sharedButtons = new TBF.UiControls.SharedButtons(); + ((System.ComponentModel.ISupportInitialize)(this.mainSplitContainer)).BeginInit(); + this.mainSplitContainer.Panel1.SuspendLayout(); + this.mainSplitContainer.Panel2.SuspendLayout(); + this.mainSplitContainer.SuspendLayout(); + this.tabControl.SuspendLayout(); + this.generalTabPage.SuspendLayout(); + this.historyTabPage.SuspendLayout(); + this.metrology1TabPage.SuspendLayout(); + this.metrology2TabPage.SuspendLayout(); + this.processTabPage.SuspendLayout(); + this.parametersTabPage.SuspendLayout(); + this.SuspendLayout(); + // + // mainSplitContainer + // + resources.ApplyResources(this.mainSplitContainer, "mainSplitContainer"); + this.mainSplitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.mainSplitContainer.Name = "mainSplitContainer"; + // + // mainSplitContainer.Panel1 + // + this.mainSplitContainer.Panel1.Controls.Add(this.tabControl); + // + // mainSplitContainer.Panel2 + // + this.mainSplitContainer.Panel2.Controls.Add(this.sharedButtons); + // + // tabControl + // + this.tabControl.Controls.Add(this.generalTabPage); + this.tabControl.Controls.Add(this.historyTabPage); + this.tabControl.Controls.Add(this.metrology1TabPage); + this.tabControl.Controls.Add(this.metrology2TabPage); + this.tabControl.Controls.Add(this.processTabPage); + this.tabControl.Controls.Add(this.parametersTabPage); + resources.ApplyResources(this.tabControl, "tabControl"); + this.tabControl.Name = "tabControl"; + this.tabControl.SelectedIndex = 0; + this.tabControl.SelectedIndexChanged += new System.EventHandler(this.tabControl_SelectedIndexChanged); + // + // generalTabPage + // + this.generalTabPage.Controls.Add(this.altProcPeriodTextBox); + this.generalTabPage.Controls.Add(this.altProcPeriodLabel); + this.generalTabPage.Controls.Add(this.altProcNameTextBox); + this.generalTabPage.Controls.Add(this.altProcNameLabel); + this.generalTabPage.Controls.Add(this.manualControlDisabledCheckBox); + this.generalTabPage.Controls.Add(this.mustBeCompleteCheckBox); + this.generalTabPage.Controls.Add(this.protectedCheckBox); + this.generalTabPage.Controls.Add(this.metersKindRadioButton3); + this.generalTabPage.Controls.Add(this.fileWriter4ComboBox); + this.generalTabPage.Controls.Add(this.fileWriter3ComboBox); + this.generalTabPage.Controls.Add(this.printer2ComboBox); + this.generalTabPage.Controls.Add(this.fileWriter2ComboBox); + this.generalTabPage.Controls.Add(this.metersKindRadioButton2); + this.generalTabPage.Controls.Add(this.metersKindRadioButton1); + this.generalTabPage.Controls.Add(this.transitionEndComboBox); + this.generalTabPage.Controls.Add(this.transitionEndLabel); + this.generalTabPage.Controls.Add(this.transitionStartComboBox); + this.generalTabPage.Controls.Add(this.transitionStartLabel); + this.generalTabPage.Controls.Add(this.fileWriter1ComboBox); + this.generalTabPage.Controls.Add(this.printer1ComboBox); + this.generalTabPage.Controls.Add(this.dataEntryComboBox); + this.generalTabPage.Controls.Add(this.resultsWriterLabel); + this.generalTabPage.Controls.Add(this.resultsPrinterLabel); + this.generalTabPage.Controls.Add(this.dataEntryLabel); + this.generalTabPage.Controls.Add(this.notesTextBox); + this.generalTabPage.Controls.Add(this.label18); + this.generalTabPage.Controls.Add(this.watermetersTextBox); + this.generalTabPage.Controls.Add(this.watermetersLabel); + this.generalTabPage.Controls.Add(this.lastChangedOnTextBox); + this.generalTabPage.Controls.Add(this.label15); + this.generalTabPage.Controls.Add(this.lastChangedByTextBox); + this.generalTabPage.Controls.Add(this.label16); + this.generalTabPage.Controls.Add(this.createdOnTextBox); + this.generalTabPage.Controls.Add(this.label14); + this.generalTabPage.Controls.Add(this.createdByTextBox); + this.generalTabPage.Controls.Add(this.label13); + this.generalTabPage.Controls.Add(this.descriptionTextBox); + this.generalTabPage.Controls.Add(this.label12); + this.generalTabPage.Controls.Add(this.procNameTextBox); + this.generalTabPage.Controls.Add(this.label1); + resources.ApplyResources(this.generalTabPage, "generalTabPage"); + this.generalTabPage.Name = "generalTabPage"; + this.generalTabPage.UseVisualStyleBackColor = true; + // + // altProcPeriodTextBox + // + resources.ApplyResources(this.altProcPeriodTextBox, "altProcPeriodTextBox"); + this.altProcPeriodTextBox.Name = "altProcPeriodTextBox"; + // + // altProcPeriodLabel + // + resources.ApplyResources(this.altProcPeriodLabel, "altProcPeriodLabel"); + this.altProcPeriodLabel.Name = "altProcPeriodLabel"; + // + // altProcNameTextBox + // + resources.ApplyResources(this.altProcNameTextBox, "altProcNameTextBox"); + this.altProcNameTextBox.Name = "altProcNameTextBox"; + // + // altProcNameLabel + // + resources.ApplyResources(this.altProcNameLabel, "altProcNameLabel"); + this.altProcNameLabel.Name = "altProcNameLabel"; + // + // manualControlDisabledCheckBox + // + resources.ApplyResources(this.manualControlDisabledCheckBox, "manualControlDisabledCheckBox"); + this.manualControlDisabledCheckBox.Name = "manualControlDisabledCheckBox"; + this.manualControlDisabledCheckBox.UseVisualStyleBackColor = true; + // + // mustBeCompleteCheckBox + // + resources.ApplyResources(this.mustBeCompleteCheckBox, "mustBeCompleteCheckBox"); + this.mustBeCompleteCheckBox.Name = "mustBeCompleteCheckBox"; + this.mustBeCompleteCheckBox.UseVisualStyleBackColor = true; + // + // protectedCheckBox + // + resources.ApplyResources(this.protectedCheckBox, "protectedCheckBox"); + this.protectedCheckBox.Name = "protectedCheckBox"; + this.protectedCheckBox.UseVisualStyleBackColor = true; + // + // metersKindRadioButton3 + // + resources.ApplyResources(this.metersKindRadioButton3, "metersKindRadioButton3"); + this.metersKindRadioButton3.Name = "metersKindRadioButton3"; + this.metersKindRadioButton3.TabStop = true; + this.metersKindRadioButton3.UseVisualStyleBackColor = true; + // + // fileWriter4ComboBox + // + this.fileWriter4ComboBox.FormattingEnabled = true; + resources.ApplyResources(this.fileWriter4ComboBox, "fileWriter4ComboBox"); + this.fileWriter4ComboBox.Name = "fileWriter4ComboBox"; + // + // fileWriter3ComboBox + // + this.fileWriter3ComboBox.FormattingEnabled = true; + resources.ApplyResources(this.fileWriter3ComboBox, "fileWriter3ComboBox"); + this.fileWriter3ComboBox.Name = "fileWriter3ComboBox"; + // + // printer2ComboBox + // + this.printer2ComboBox.FormattingEnabled = true; + resources.ApplyResources(this.printer2ComboBox, "printer2ComboBox"); + this.printer2ComboBox.Name = "printer2ComboBox"; + // + // fileWriter2ComboBox + // + this.fileWriter2ComboBox.FormattingEnabled = true; + resources.ApplyResources(this.fileWriter2ComboBox, "fileWriter2ComboBox"); + this.fileWriter2ComboBox.Name = "fileWriter2ComboBox"; + // + // metersKindRadioButton2 + // + resources.ApplyResources(this.metersKindRadioButton2, "metersKindRadioButton2"); + this.metersKindRadioButton2.Name = "metersKindRadioButton2"; + this.metersKindRadioButton2.TabStop = true; + this.metersKindRadioButton2.UseVisualStyleBackColor = true; + // + // metersKindRadioButton1 + // + resources.ApplyResources(this.metersKindRadioButton1, "metersKindRadioButton1"); + this.metersKindRadioButton1.Name = "metersKindRadioButton1"; + this.metersKindRadioButton1.TabStop = true; + this.metersKindRadioButton1.UseVisualStyleBackColor = true; + // + // transitionEndComboBox + // + this.transitionEndComboBox.FormattingEnabled = true; + resources.ApplyResources(this.transitionEndComboBox, "transitionEndComboBox"); + this.transitionEndComboBox.Name = "transitionEndComboBox"; + // + // transitionEndLabel + // + resources.ApplyResources(this.transitionEndLabel, "transitionEndLabel"); + this.transitionEndLabel.Name = "transitionEndLabel"; + // + // transitionStartComboBox + // + this.transitionStartComboBox.FormattingEnabled = true; + resources.ApplyResources(this.transitionStartComboBox, "transitionStartComboBox"); + this.transitionStartComboBox.Name = "transitionStartComboBox"; + // + // transitionStartLabel + // + resources.ApplyResources(this.transitionStartLabel, "transitionStartLabel"); + this.transitionStartLabel.Name = "transitionStartLabel"; + // + // fileWriter1ComboBox + // + this.fileWriter1ComboBox.FormattingEnabled = true; + resources.ApplyResources(this.fileWriter1ComboBox, "fileWriter1ComboBox"); + this.fileWriter1ComboBox.Name = "fileWriter1ComboBox"; + // + // printer1ComboBox + // + this.printer1ComboBox.FormattingEnabled = true; + resources.ApplyResources(this.printer1ComboBox, "printer1ComboBox"); + this.printer1ComboBox.Name = "printer1ComboBox"; + // + // dataEntryComboBox + // + this.dataEntryComboBox.FormattingEnabled = true; + resources.ApplyResources(this.dataEntryComboBox, "dataEntryComboBox"); + this.dataEntryComboBox.Name = "dataEntryComboBox"; + // + // resultsWriterLabel + // + resources.ApplyResources(this.resultsWriterLabel, "resultsWriterLabel"); + this.resultsWriterLabel.Name = "resultsWriterLabel"; + // + // resultsPrinterLabel + // + resources.ApplyResources(this.resultsPrinterLabel, "resultsPrinterLabel"); + this.resultsPrinterLabel.Name = "resultsPrinterLabel"; + // + // dataEntryLabel + // + resources.ApplyResources(this.dataEntryLabel, "dataEntryLabel"); + this.dataEntryLabel.Name = "dataEntryLabel"; + // + // notesTextBox + // + resources.ApplyResources(this.notesTextBox, "notesTextBox"); + this.notesTextBox.Name = "notesTextBox"; + // + // label18 + // + resources.ApplyResources(this.label18, "label18"); + this.label18.Name = "label18"; + // + // watermetersTextBox + // + resources.ApplyResources(this.watermetersTextBox, "watermetersTextBox"); + this.watermetersTextBox.Name = "watermetersTextBox"; + // + // watermetersLabel + // + resources.ApplyResources(this.watermetersLabel, "watermetersLabel"); + this.watermetersLabel.Name = "watermetersLabel"; + // + // lastChangedOnTextBox + // + resources.ApplyResources(this.lastChangedOnTextBox, "lastChangedOnTextBox"); + this.lastChangedOnTextBox.Name = "lastChangedOnTextBox"; + // + // label15 + // + resources.ApplyResources(this.label15, "label15"); + this.label15.Name = "label15"; + // + // lastChangedByTextBox + // + resources.ApplyResources(this.lastChangedByTextBox, "lastChangedByTextBox"); + this.lastChangedByTextBox.Name = "lastChangedByTextBox"; + // + // label16 + // + resources.ApplyResources(this.label16, "label16"); + this.label16.Name = "label16"; + // + // createdOnTextBox + // + resources.ApplyResources(this.createdOnTextBox, "createdOnTextBox"); + this.createdOnTextBox.Name = "createdOnTextBox"; + // + // label14 + // + resources.ApplyResources(this.label14, "label14"); + this.label14.Name = "label14"; + // + // createdByTextBox + // + resources.ApplyResources(this.createdByTextBox, "createdByTextBox"); + this.createdByTextBox.Name = "createdByTextBox"; + // + // label13 + // + resources.ApplyResources(this.label13, "label13"); + this.label13.Name = "label13"; + // + // descriptionTextBox + // + resources.ApplyResources(this.descriptionTextBox, "descriptionTextBox"); + this.descriptionTextBox.Name = "descriptionTextBox"; + // + // label12 + // + resources.ApplyResources(this.label12, "label12"); + this.label12.Name = "label12"; + // + // procNameTextBox + // + resources.ApplyResources(this.procNameTextBox, "procNameTextBox"); + this.procNameTextBox.Name = "procNameTextBox"; + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // historyTabPage + // + this.historyTabPage.Controls.Add(this.historyListViewEx); + resources.ApplyResources(this.historyTabPage, "historyTabPage"); + this.historyTabPage.Name = "historyTabPage"; + this.historyTabPage.UseVisualStyleBackColor = true; + // + // historyListViewEx + // + this.historyListViewEx.AllowColumnReorder = true; + resources.ApplyResources(this.historyListViewEx, "historyListViewEx"); + this.historyListViewEx.DoubleClickActivation = false; + this.historyListViewEx.FullRowSelect = true; + this.historyListViewEx.GridLines = true; + this.historyListViewEx.Name = "historyListViewEx"; + this.historyListViewEx.UseCompatibleStateImageBehavior = false; + this.historyListViewEx.View = System.Windows.Forms.View.Details; + // + // metrology1TabPage + // + this.metrology1TabPage.Controls.Add(this.metrology1ListViewEx); + resources.ApplyResources(this.metrology1TabPage, "metrology1TabPage"); + this.metrology1TabPage.Name = "metrology1TabPage"; + this.metrology1TabPage.UseVisualStyleBackColor = true; + // + // metrology1ListViewEx + // + this.metrology1ListViewEx.AllowColumnReorder = true; + resources.ApplyResources(this.metrology1ListViewEx, "metrology1ListViewEx"); + this.metrology1ListViewEx.DoubleClickActivation = false; + this.metrology1ListViewEx.FullRowSelect = true; + this.metrology1ListViewEx.GridLines = true; + this.metrology1ListViewEx.Name = "metrology1ListViewEx"; + this.metrology1ListViewEx.UseCompatibleStateImageBehavior = false; + this.metrology1ListViewEx.View = System.Windows.Forms.View.Details; + this.metrology1ListViewEx.SelectedIndexChanged += new System.EventHandler(this.metrology1ListViewEx_SelectedIndexChanged); + // + // metrology2TabPage + // + this.metrology2TabPage.Controls.Add(this.metrology2ListViewEx); + resources.ApplyResources(this.metrology2TabPage, "metrology2TabPage"); + this.metrology2TabPage.Name = "metrology2TabPage"; + this.metrology2TabPage.UseVisualStyleBackColor = true; + // + // metrology2ListViewEx + // + this.metrology2ListViewEx.AllowColumnReorder = true; + resources.ApplyResources(this.metrology2ListViewEx, "metrology2ListViewEx"); + this.metrology2ListViewEx.DoubleClickActivation = false; + this.metrology2ListViewEx.FullRowSelect = true; + this.metrology2ListViewEx.GridLines = true; + this.metrology2ListViewEx.Name = "metrology2ListViewEx"; + this.metrology2ListViewEx.UseCompatibleStateImageBehavior = false; + this.metrology2ListViewEx.View = System.Windows.Forms.View.Details; + this.metrology2ListViewEx.SelectedIndexChanged += new System.EventHandler(this.metrology2ListViewEx_SelectedIndexChanged); + // + // processTabPage + // + this.processTabPage.Controls.Add(this.processListViewEx); + resources.ApplyResources(this.processTabPage, "processTabPage"); + this.processTabPage.Name = "processTabPage"; + this.processTabPage.UseVisualStyleBackColor = true; + // + // processListViewEx + // + this.processListViewEx.AllowColumnReorder = true; + resources.ApplyResources(this.processListViewEx, "processListViewEx"); + this.processListViewEx.DoubleClickActivation = false; + this.processListViewEx.FullRowSelect = true; + this.processListViewEx.GridLines = true; + this.processListViewEx.Name = "processListViewEx"; + this.processListViewEx.UseCompatibleStateImageBehavior = false; + this.processListViewEx.View = System.Windows.Forms.View.Details; + this.processListViewEx.SelectedIndexChanged += new System.EventHandler(this.processListViewEx_SelectedIndexChanged); + // + // parametersTabPage + // + this.parametersTabPage.Controls.Add(this.parametersListViewEx); + resources.ApplyResources(this.parametersTabPage, "parametersTabPage"); + this.parametersTabPage.Name = "parametersTabPage"; + this.parametersTabPage.UseVisualStyleBackColor = true; + // + // parametersListViewEx + // + this.parametersListViewEx.AllowColumnReorder = true; + resources.ApplyResources(this.parametersListViewEx, "parametersListViewEx"); + this.parametersListViewEx.DoubleClickActivation = false; + this.parametersListViewEx.FullRowSelect = true; + this.parametersListViewEx.GridLines = true; + this.parametersListViewEx.Name = "parametersListViewEx"; + this.parametersListViewEx.UseCompatibleStateImageBehavior = false; + this.parametersListViewEx.View = System.Windows.Forms.View.Details; + this.parametersListViewEx.SelectedIndexChanged += new System.EventHandler(this.parametersListViewEx_SelectedIndexChanged); + // + // sharedButtons + // + resources.ApplyResources(this.sharedButtons, "sharedButtons"); + this.sharedButtons.Name = "sharedButtons"; + // + // ProcedureDlg + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.mainSplitContainer); + this.Name = "ProcedureDlg"; + this.Load += new System.EventHandler(this.ProcedureDlg_Load); + this.mainSplitContainer.Panel1.ResumeLayout(false); + this.mainSplitContainer.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.mainSplitContainer)).EndInit(); + this.mainSplitContainer.ResumeLayout(false); + this.tabControl.ResumeLayout(false); + this.generalTabPage.ResumeLayout(false); + this.generalTabPage.PerformLayout(); + this.historyTabPage.ResumeLayout(false); + this.metrology1TabPage.ResumeLayout(false); + this.metrology2TabPage.ResumeLayout(false); + this.processTabPage.ResumeLayout(false); + this.parametersTabPage.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer mainSplitContainer; + private System.Windows.Forms.TabControl tabControl; + private System.Windows.Forms.TabPage historyTabPage; + private Results.Forms.ListViewEx historyListViewEx; + private System.Windows.Forms.TabPage metrology1TabPage; + private Results.Forms.ListViewEx metrology1ListViewEx; + private System.Windows.Forms.TabPage metrology2TabPage; + private Results.Forms.ListViewEx metrology2ListViewEx; + private System.Windows.Forms.TabPage processTabPage; + private Results.Forms.ListViewEx processListViewEx; + private UiControls.SharedButtons sharedButtons; + private System.Windows.Forms.TabPage generalTabPage; + private System.Windows.Forms.ComboBox fileWriter1ComboBox; + private System.Windows.Forms.ComboBox printer1ComboBox; + private System.Windows.Forms.ComboBox dataEntryComboBox; + private System.Windows.Forms.Label resultsWriterLabel; + private System.Windows.Forms.Label resultsPrinterLabel; + private System.Windows.Forms.Label dataEntryLabel; + private System.Windows.Forms.TextBox notesTextBox; + private System.Windows.Forms.Label label18; + private System.Windows.Forms.TextBox watermetersTextBox; + private System.Windows.Forms.Label watermetersLabel; + private System.Windows.Forms.TextBox lastChangedOnTextBox; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.TextBox lastChangedByTextBox; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.TextBox createdOnTextBox; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.TextBox createdByTextBox; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.TextBox descriptionTextBox; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.TextBox procNameTextBox; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox transitionEndComboBox; + private System.Windows.Forms.Label transitionEndLabel; + private System.Windows.Forms.ComboBox transitionStartComboBox; + private System.Windows.Forms.Label transitionStartLabel; + private System.Windows.Forms.RadioButton metersKindRadioButton2; + private System.Windows.Forms.RadioButton metersKindRadioButton1; + private System.Windows.Forms.TabPage parametersTabPage; + private Results.Forms.ListViewEx parametersListViewEx; + private System.Windows.Forms.ComboBox fileWriter2ComboBox; + private System.Windows.Forms.ComboBox fileWriter3ComboBox; + private System.Windows.Forms.ComboBox printer2ComboBox; + private System.Windows.Forms.ComboBox fileWriter4ComboBox; + private System.Windows.Forms.RadioButton metersKindRadioButton3; + private System.Windows.Forms.CheckBox mustBeCompleteCheckBox; + private System.Windows.Forms.CheckBox protectedCheckBox; + private System.Windows.Forms.CheckBox manualControlDisabledCheckBox; + private System.Windows.Forms.TextBox altProcNameTextBox; + private System.Windows.Forms.Label altProcNameLabel; + private System.Windows.Forms.TextBox altProcPeriodTextBox; + private System.Windows.Forms.Label altProcPeriodLabel; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/ProcedureDlg.cs b/TBF_V2/Sources/TBF/TBF/ProcedureDlg.cs new file mode 100644 index 00000000..6b1114c9 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/ProcedureDlg.cs @@ -0,0 +1,2316 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using log4net; + +using TBF.BenchControl.Generic; +using TBF.BenchControl.GenericDevices; +using Config.Entities; +using TBF.Resources; +using TBF.UiControls; + +namespace TBF +{ + public partial class ProcedureDlg : Form, IParentOfListViewEx + { + static readonly ILog log = LogManager.GetLogger(typeof(ProcedureDlg)); + + /// Used when re-scaling the dialog: 100% = 96dpi, 125% = 120dpi, 150% = 144dpi + public readonly int Dpi; + public const int Dpi100pct = 96; + + /// + /// Procedure to be updated by this dialog. + /// Set by the constructor or updated by the parent after creation and before loading. + /// + public Procedure LoadedProcedure; + public int SelectedTestIx; /// -1 = none, 0 = 1st = top + + IList usedNames; /// Already used names + + /// Auxiliary public lists used also by user controls in tab pages + public IList TbfComponents; + public IList Valves; + public IList RegulValves; + public IList TestMethods; + public IList UsedTestMethods; + ComboBox methodCBox; + + /// Auxiliary private lists + IList feedingPaths; + IList benchPaths; + IList outputPaths; + IList metersPaths; + IList heatMetersPaths; + IList transitionSequences; + + IList testParamsCtrls; + IList procedureParamsCtrls; + + bool unlocked; + + public ProcedureDlg() + { + /// Detect display setting: 100% = 96dpi, 125% = 120dpi, 150% = 144dpi. + Dpi = (int)this.CreateGraphics().DpiX; + + InitializeComponent(); + + /// SharedDlgButtons configuration + sharedButtons.RequiredGroupMembership = Users.Grp.GID.TestingSpecialists; + sharedButtons.OptionalButtons = SharedButtons.Buttons.Add | SharedButtons.Buttons.Remove | + SharedButtons.Buttons.Up | SharedButtons.Buttons.Down; + sharedButtons.Unlocked += Unlocked; + sharedButtons.OKClicked += okButton_Click; + sharedButtons.CancelClicked += cancelButton_Click; + sharedButtons.AddClicked += addButton_Click; + sharedButtons.RemoveClicked += removeButton_Click; + sharedButtons.UpClicked += upButton_Click; + sharedButtons.DownClicked += downButton_Click; + + /// ListViewEx-es configuration + metrology1ListViewEx.SubItemClicked += new Results.Forms.SubItemEventHandler(metrology1ListViewEx_SubItemClicked); + metrology1ListViewEx.SubItemRightClicked += new Results.Forms.SubItemEventHandler(metrology1ListViewEx_SubItemRightClicked); + metrology1ListViewEx.SubItemEndEditing += new Results.Forms.SubItemEndEditingEventHandler(metrology1ListViewEx_SubItemEndEditing); + + metrology2ListViewEx.SubItemClicked += new Results.Forms.SubItemEventHandler(metrology2ListViewEx_SubItemClicked); + metrology2ListViewEx.SubItemRightClicked += new Results.Forms.SubItemEventHandler(metrology2ListViewEx_SubItemRightClicked); + metrology2ListViewEx.SubItemEndEditing += new Results.Forms.SubItemEndEditingEventHandler(metrology2ListViewEx_SubItemEndEditing); + + processListViewEx.SubItemClicked += new Results.Forms.SubItemEventHandler(processListViewEx_SubItemClicked); + processListViewEx.SubItemRightClicked += new Results.Forms.SubItemEventHandler(processListViewEx_SubItemRightClicked); + processListViewEx.SubItemEndEditing += new Results.Forms.SubItemEndEditingEventHandler(processListViewEx_SubItemEndEditing); + + parametersListViewEx.SubItemClicked += new Results.Forms.SubItemEventHandler(parametersListViewEx_SubItemClicked); + parametersListViewEx.SubItemRightClicked += new Results.Forms.SubItemEventHandler(parametersListViewEx_SubItemRightClicked); + parametersListViewEx.SubItemEndEditing += new Results.Forms.SubItemEndEditingEventHandler(parametersListViewEx_SubItemEndEditing); + + SelectedTestIx = -1; + } + + public ProcedureDlg(Config.Entities.Procedure procedure, IList usedNames) + : this() + { + if (procedure == null) throw new ArgumentNullException("procedure"); + + LoadedProcedure = procedure; + + this.usedNames = usedNames; + + sharedButtons.RequiredGroupMembership = procedure.Protected ? Users.Grp.GID.Metrologists : Users.Grp.GID.TestingSpecialists; + + /// Prepare a list of components and a list of all valves in the test bench + using (NHibernate.ISession session = Config.FluentCommon.CreateSession(Users.Entities.DBKind.Config)) + { + TbfComponents = BenchControl.TbfComponents.LoadComponentsFromDB(session); + Valves = BenchControl.GenericDevices.ValveBase.MasterValves(TbfComponents); + RegulValves = new List(); + TestMethods = new List(); + dataEntryComboBox.Items.Add("---"); + printer1ComboBox.Items.Add("---"); + printer2ComboBox.Items.Add("---"); + fileWriter1ComboBox.Items.Add("---"); + fileWriter2ComboBox.Items.Add("---"); + fileWriter3ComboBox.Items.Add("---"); + fileWriter4ComboBox.Items.Add("---"); + foreach (var cmpnt in TbfComponents) + { + if (cmpnt is IRegulValve) RegulValves.Add(cmpnt as IRegulValve); + if (cmpnt is ITestMethod) TestMethods.Add(cmpnt as ITestMethod); + if (cmpnt is IDataEntry) dataEntryComboBox.Items.Add(cmpnt.Cfg.Name); + if (cmpnt is IResultsPrinter) + { + printer1ComboBox.Items.Add(cmpnt.Cfg.Name); + printer2ComboBox.Items.Add(cmpnt.Cfg.Name); + } + if (cmpnt is IResultsWriter) + { + fileWriter1ComboBox.Items.Add(cmpnt.Cfg.Name); + fileWriter2ComboBox.Items.Add(cmpnt.Cfg.Name); + fileWriter3ComboBox.Items.Add(cmpnt.Cfg.Name); + fileWriter4ComboBox.Items.Add(cmpnt.Cfg.Name); + } + } + } + + /// Loads paths, this must be done before PrepareMetrology12AndProcessTabs() call + using (NHibernate.ISession session = Config.FluentCommon.CreateSession(Users.Entities.DBKind.Config)) + { + feedingPaths = session.QueryOver().List(); + benchPaths = session.QueryOver().List(); + outputPaths = session.QueryOver().List(); + metersPaths = session.QueryOver().List(); +#if HEAT_METERS + heatMetersPaths = session.QueryOver().List(); +#else + heatMetersPaths = new List(); +#endif + transitionSequences = session.QueryOver().List(); + } + + transitionStartComboBox.Items.Add("---"); + transitionEndComboBox.Items.Add("---"); + foreach (var trans in transitionSequences) + { + transitionStartComboBox.Items.Add(trans.Name); + transitionEndComboBox.Items.Add(trans.Name); + } + + ///-------------------------------------------------------------------------------------- + ///-------------------------- Tab pages with test parameters -------------------------- + ///-------------------------------------------------------------------------------------- + + testParamsCtrls = new List(); /// Initialize the list + + ///--------------------- + /// Used test methods + ///--------------------- + + /// Find all test methods used in this procedure + UsedTestMethods = new List(); + foreach (var test in LoadedProcedure.Tests) + { + ITestMethod method = BenchControl.TbfComponents.FindComponent(test.Method, TbfComponents) as ITestMethod; + if (method != null && !UsedTestMethods.Contains(method)) UsedTestMethods.Add(method); + } + + /// Create a tab with a TestParamsCtrl control for each used test method + foreach (var method in UsedTestMethods) + { + if (method.Cfg.GetRuntimeTestParamsProvider() != null) + { + TestParamsCtrl nwCtrl = new TestParamsCtrl(this, method, true); + testParamsCtrls.Add(nwCtrl); + + TabPage nwTab = new TabPage(method.Cfg.Name); + nwTab.Controls.Add(nwCtrl); + nwTab.Tag = nwCtrl; + tabControl.TabPages.Add(nwTab); + } + } + + /// Create a control for another component with Test parameters which was not handled yet + foreach (var cmpnt in TbfComponents) + { + if ((cmpnt.Cfg.GetRuntimeTestParamsProvider() != null) && !(cmpnt is ITestMethod)) + { + TestParamsCtrl nwCtrl = new TestParamsCtrl(this, cmpnt, true); + testParamsCtrls.Add(nwCtrl); + + TabPage nwTab = new TabPage(cmpnt.Cfg.Name); + nwTab.Controls.Add(nwCtrl); + nwTab.Tag = nwCtrl; + this.tabControl.TabPages.Add(nwTab); + } + } + + ///-------------------------------------------------------------------------------------- + ///----------------------- Tab pages with procedure parameters ------------------------ + ///-------------------------------------------------------------------------------------- + + procedureParamsCtrls = new List(); /// Initialize the list + + ///---------------- + /// Water meters + ///---------------- + + /// Create a control for the water meters and add it to the list. + IList waterMeters = new List(); + foreach (var cmpnt in TbfComponents) + { + if (cmpnt is IWaterMeter) waterMeters.Add(cmpnt); + } + + { + ProcedureParamsCtrl newCtrl = new ProcedureParamsCtrl(this, waterMeters, false); + procedureParamsCtrls.Add(newCtrl); + + TabPage newTab = new TabPage(Strings.Water_meters); + newTab.Controls.Add(newCtrl); + newTab.Tag = newCtrl; + tabControl.TabPages.Add(newTab); + } + + ///--------------------- + /// Used sensor paths + ///--------------------- + + /// Prepare a list of all meters paths used in this procedure (in any test) + IList usedMPaths = new List(); + foreach (var test in LoadedProcedure.Tests) + { + if (test.MetersPath != null && !usedMPaths.Contains(test.MetersPath)) usedMPaths.Add(test.MetersPath); + } + + /// Create controls for each sensors path used in this procedure. + /// Initialize it with its components (sensors or cameras) and add it to the list. + foreach (var usedPathName in usedMPaths) + { + MetersPath usedPath = null; + try { usedPath = metersPaths.First(x => (x.Name == usedPathName)); } + catch { } + if (usedPath != null) + { + IList cmpntsInMPath = new List(); + for (int i = 0; i < Config.Data.WMsCount; i++) + { + IComponent sensor = TbfComponents.FirstOrDefault(x => (x.Cfg.Name.Equals(usedPath.GetSensor(i)))); + cmpntsInMPath.Add(sensor); + } + + ProcedureParamsCtrl nwCtrl = new ProcedureParamsCtrl(this, cmpntsInMPath, true); + procedureParamsCtrls.Add(nwCtrl); + + TabPage nwTab = new TabPage(usedPathName); + nwTab.Controls.Add(nwCtrl); + nwTab.Tag = nwCtrl; + tabControl.TabPages.Add(nwTab); + } + } + + ///--------------------- + /// Other components + ///--------------------- + + /// Create a control for the water meters and add it to the list. + IList other = new List(); + foreach (var cmpnt in TbfComponents) + { + if (cmpnt is TBF.BenchControl.Modbus.Easytherm.Easytherm) other.Add(cmpnt); + } + + if (other.Count > 0) + { + ProcedureParamsCtrl newCtrl = new ProcedureParamsCtrl(this, other, false); + procedureParamsCtrls.Add(newCtrl); + + TabPage newTab = new TabPage(Strings.Temperature); + newTab.Controls.Add(newCtrl); + newTab.Tag = newCtrl; + tabControl.TabPages.Add(newTab); + } + } + + private void ProcedureDlg_Load(object sender, EventArgs e) + { + Localize(); + + if (LoadedProcedure == null) return; /// return in case the dialog is open in the designer + + TBF.LocalSettings ls = Program.LocalSettings; + Width = (ls.OneProcedureDlgWidth > 0) ? ls.OneProcedureDlgWidth : 1050; + Height = (ls.OneProcedureDlgHeight > 0) ? ls.OneProcedureDlgHeight : 420; + Left = (ls.OneProcedureDlgLeft != 0) ? ls.OneProcedureDlgLeft : 150; + Top = (ls.OneProcedureDlgTop != 0) ? ls.OneProcedureDlgTop : 150; + + /// Enable/disable/show/hide controls in General tab +#if IPERL + altProcNameLabel.Visible = true; + altProcNameTextBox.Visible = true; + altProcPeriodLabel.Visible = true; + altProcPeriodTextBox.Visible = true; +#endif + procNameTextBox.Enabled = false; + descriptionTextBox.Enabled = false; + watermetersTextBox.Enabled = false; + protectedCheckBox.Enabled = false; + mustBeCompleteCheckBox.Enabled = false; + manualControlDisabledCheckBox.Enabled = false; + altProcNameTextBox.Enabled = false; + altProcPeriodTextBox.Enabled = false; + dataEntryComboBox.Enabled = false; + transitionStartComboBox.Enabled = false; + transitionEndComboBox.Enabled = false; + printer1ComboBox.Enabled = false; + printer2ComboBox.Enabled = false; + fileWriter1ComboBox.Enabled = false; + fileWriter2ComboBox.Enabled = false; + fileWriter3ComboBox.Enabled = false; + fileWriter4ComboBox.Enabled = false; + metersKindRadioButton1.Enabled = false; + metersKindRadioButton2.Enabled = false; + metersKindRadioButton3.Enabled = false; + notesTextBox.Enabled = false; +#if !HEAT_METERS + metersKindRadioButton3.Visible = false; +#endif + /// Make some controls readonly + createdByTextBox.ReadOnly = true; + createdOnTextBox.ReadOnly = true; + lastChangedByTextBox.ReadOnly = true; + lastChangedOnTextBox.ReadOnly = true; + + /// History tab + InitializeHistoryTab(); /// Create ListViewEx columns for 'History of changes' + + /// LisViewEx columns and edit controls for 'Metrology1', 'Metrology2', 'Process' and 'Parameters' tabs + PrepareMetrology1Tab(); + PrepareMetrology2Tab(); + PrepareProcess(); + PrepareParameters(); + + /// Now refresh the content of the dialog + RefreshGeneralTab(); + RefreshMetrology1Tab(); + RefreshMetrology2Tab(); + RefreshProcessTab(); + RefreshParametersTab(); + + foreach (var ctrl in testParamsCtrls) + { + ctrl.Initialize(); + } + foreach (var ctrl in procedureParamsCtrls) + { + ctrl.Initialize(); + } + } + + void Localize() + { + Text = Strings.Procedure; + + generalTabPage.Text = Strings.General; + historyTabPage.Text = Strings.History_of_changes; + metrology1TabPage.Text = Strings.Metrology + " I."; + metrology2TabPage.Text = Strings.Metrology + " II."; + processTabPage.Text = Strings.Process; + parametersTabPage.Text = Strings.Parameters; + + label1.Text = Strings.Procedure_name; + label12.Text = Strings.Short_description; + label13.Text = Strings.Created_by; + label16.Text = Strings.Last_changed_by; + label14.Text = Strings.Date; + label15.Text = Strings.Date; + label18.Text = Strings.Notes; + watermetersLabel.Text = Strings.Meter_types_tested; + protectedCheckBox.Text = Strings.Protected_procedure; + mustBeCompleteCheckBox.Text = Strings.All_tests_must_be_completed; + manualControlDisabledCheckBox.Text = Strings.Manual_control_disabled; + dataEntryLabel.Text = Strings.Data_entry; + transitionStartLabel.Text = Strings.Purge_Begin; + transitionEndLabel.Text = Strings.Purge_End; + resultsPrinterLabel.Text = Strings.Printing; + resultsWriterLabel.Text = Strings.Saving_results; + + metersKindRadioButton1.Text = Strings.SingleBtnText; + metersKindRadioButton2.Text = Strings.Compound; + metersKindRadioButton3.Text = Strings.Heat_meter; + } + + + #region General + + void RefreshGeneralTab() + { + procNameTextBox.Text = LoadedProcedure.Name; + Text = string.Format("{0} {1} {2}", Strings.Procedure, LoadedProcedure.ItemNr + 1, LoadedProcedure.Name); + + descriptionTextBox.Text = LoadedProcedure.Description; + createdByTextBox.Text = LoadedProcedure.CreationUser; + createdOnTextBox.Text = LoadedProcedure.CreationTime.ToString(); + lastChangedByTextBox.Text = LoadedProcedure.LastChgUser; + if (LoadedProcedure.LastChgTime > LoadedProcedure.CreationTime) + { + lastChangedOnTextBox.Text = LoadedProcedure.LastChgTime.ToString(); + } + watermetersTextBox.Text = LoadedProcedure.Watermeters; + protectedCheckBox.Checked = LoadedProcedure.Protected; + mustBeCompleteCheckBox.Checked = LoadedProcedure.MustBeComplete; + manualControlDisabledCheckBox.Checked = LoadedProcedure.ManualCtrlDisabled; + dataEntryComboBox.Text = string.IsNullOrEmpty(LoadedProcedure.DataEntry) ? "---" : LoadedProcedure.DataEntry; + transitionStartComboBox.Text = string.IsNullOrEmpty(LoadedProcedure.TransitionStart) ? "---" : LoadedProcedure.TransitionStart; + transitionEndComboBox.Text = string.IsNullOrEmpty(LoadedProcedure.TransitionEnd) ? "---" : LoadedProcedure.TransitionEnd; + + altProcNameTextBox.Text = string.IsNullOrEmpty(LoadedProcedure.AltProcName) ? "---" : LoadedProcedure.AltProcName; + altProcPeriodTextBox.Text = LoadedProcedure.AltProcPeriod.ToString(); + + if (string.IsNullOrEmpty(LoadedProcedure.ResultsPrinter)) + { + printer1ComboBox.Text = "---"; + printer2ComboBox.Text = "---"; + } + else + { + string[] fields = LoadedProcedure.ResultsPrinter.Split(new char[] { '~' }); + printer1ComboBox.Text = fields[0]; + printer2ComboBox.Text = (fields.Length == 2) ? fields[1] : "---"; + } + + if (string.IsNullOrEmpty(LoadedProcedure.ResultsWriter)) + { + fileWriter1ComboBox.Text = "---"; + fileWriter2ComboBox.Text = "---"; + fileWriter3ComboBox.Text = "---"; + fileWriter4ComboBox.Text = "---"; + } + else + { + string[] fields = LoadedProcedure.ResultsWriter.Split(new char[] { '~' }); + fileWriter1ComboBox.Text = fields[0]; + fileWriter2ComboBox.Text = (fields.Length >= 2) ? fields[1] : "---"; + fileWriter3ComboBox.Text = (fields.Length >= 3) ? fields[2] : "---"; + fileWriter4ComboBox.Text = (fields.Length >= 4) ? fields[3] : "---"; + } + + metersKindRadioButton1.Checked = (LoadedProcedure.MetersKind == MetersKind.Single + || (LoadedProcedure.MetersKind != MetersKind.Combined && LoadedProcedure.MetersKind != MetersKind.HeatMeter)); + metersKindRadioButton2.Checked = (LoadedProcedure.MetersKind == MetersKind.Combined); + metersKindRadioButton3.Checked = (LoadedProcedure.MetersKind == MetersKind.HeatMeter); + + notesTextBox.Text = LoadedProcedure.LongDescription; + } + + void UpdateFromGeneralTab() + { + LoadedProcedure.Name = procNameTextBox.Text; + Text = string.Format("{0} {1} {2}", Strings.Procedure, LoadedProcedure.ItemNr + 1, LoadedProcedure.Name); + + LoadedProcedure.Description = descriptionTextBox.Text; + LoadedProcedure.Watermeters = watermetersTextBox.Text; + + LoadedProcedure.Protected = protectedCheckBox.Checked; + LoadedProcedure.MustBeComplete = mustBeCompleteCheckBox.Checked; + LoadedProcedure.ManualCtrlDisabled = manualControlDisabledCheckBox.Checked; + + LoadedProcedure.AltProcName = altProcNameTextBox.Text.Equals("---") ? string.Empty : altProcNameTextBox.Text; + + int itmp; + if (int.TryParse(altProcPeriodTextBox.Text, out itmp) && itmp >= 0) + { + LoadedProcedure.AltProcPeriod = itmp; + } + + if (transitionStartComboBox.Items.Contains(transitionStartComboBox.Text)) + { + LoadedProcedure.TransitionStart = transitionStartComboBox.Text.Equals("---") ? string.Empty : transitionStartComboBox.Text; + } + if (transitionEndComboBox.Items.Contains(transitionEndComboBox.Text)) + { + LoadedProcedure.TransitionEnd = transitionEndComboBox.Text.Equals("---") ? string.Empty : transitionEndComboBox.Text; + } + if (dataEntryComboBox.Items.Contains(dataEntryComboBox.Text)) + { + LoadedProcedure.DataEntry = dataEntryComboBox.Text.Equals("---") ? string.Empty : dataEntryComboBox.Text; + } + + if (printer1ComboBox.Items.Contains(printer1ComboBox.Text) && printer2ComboBox.Items.Contains(printer2ComboBox.Text)) + { + bool pr = !printer1ComboBox.Text.Equals("---"); + bool pr2 = !printer2ComboBox.Text.Equals("---") && !printer2ComboBox.Text.Equals(printer1ComboBox.Text); + + if (!pr && !pr2) LoadedProcedure.ResultsPrinter = string.Empty; + else if (pr && !pr2) LoadedProcedure.ResultsPrinter = printer1ComboBox.Text; + else if (!pr && pr2) LoadedProcedure.ResultsPrinter = printer2ComboBox.Text; + else LoadedProcedure.ResultsPrinter = printer1ComboBox.Text + '~' + printer2ComboBox.Text; + } + + if (fileWriter1ComboBox.Items.Contains(fileWriter1ComboBox.Text) && + fileWriter2ComboBox.Items.Contains(fileWriter2ComboBox.Text) && + fileWriter3ComboBox.Items.Contains(fileWriter3ComboBox.Text) && + fileWriter4ComboBox.Items.Contains(fileWriter4ComboBox.Text)) + { + bool first = true; + StringBuilder sb = new StringBuilder(); + if (!fileWriter1ComboBox.Text.Equals("---")) + { + sb.Append(fileWriter1ComboBox.Text); + first = false; + } + if (!fileWriter2ComboBox.Text.Equals("---") && !fileWriter2ComboBox.Text.Equals(fileWriter1ComboBox.Text)) + { + if (!first) sb.Append("~"); + sb.Append(fileWriter2ComboBox.Text); + first = false; + } + if (!fileWriter3ComboBox.Text.Equals("---") && !fileWriter3ComboBox.Text.Equals(fileWriter1ComboBox.Text) + && !fileWriter3ComboBox.Text.Equals(fileWriter2ComboBox.Text)) + { + if (!first) sb.Append("~"); first = false; + sb.Append(fileWriter3ComboBox.Text); + first = false; + } + if (!fileWriter4ComboBox.Text.Equals("---") && !fileWriter4ComboBox.Text.Equals(fileWriter1ComboBox.Text) + && !fileWriter4ComboBox.Text.Equals(fileWriter2ComboBox.Text) + && !fileWriter4ComboBox.Text.Equals(fileWriter3ComboBox.Text)) + { + if (!first) sb.Append("~"); + sb.Append(fileWriter4ComboBox.Text); + } + LoadedProcedure.ResultsWriter = sb.ToString(); + } + + LoadedProcedure.MetersKind = (metersKindRadioButton1.Checked ? MetersKind.Single + : (metersKindRadioButton2.Checked ? MetersKind.Combined + : MetersKind.HeatMeter)); + LoadedProcedure.LongDescription = notesTextBox.Text; + } + + #endregion + + #region History + + void InitializeHistoryTab() + { + TBF.LocalSettings ls = Program.LocalSettings; + + historyListViewEx.Columns.Add(Strings.Name, (ls.HistoryColumnCount > 0) ? ls.HistoryColumnWidths[0] : 80); + historyListViewEx.Columns.Add(Strings.Revision, (ls.HistoryColumnCount > 0) ? ls.HistoryColumnWidths[0] : 80); + historyListViewEx.Columns.Add(Strings.Date_and_time, (ls.HistoryColumnCount > 1) ? ls.HistoryColumnWidths[1] : 120); + historyListViewEx.Columns.Add(Strings.User, (ls.HistoryColumnCount > 2) ? ls.HistoryColumnWidths[2] : 55); + historyListViewEx.Columns.Add(Strings.DescriptionColHdr, (ls.HistoryColumnCount > 3) ? ls.HistoryColumnWidths[3] : 300); + + RefreshHistoryTab(); + } + + void RefreshHistoryTab() + { + NHibernate.ISession session = Config.FluentCommon.CreateSession(Users.Entities.DBKind.Config); + IList procedures = session + .QueryOver() + .Where(x => x.ProcedureState == ProcedureState.History) + .List(); + + int predecessorId = LoadedProcedure.PredecessorId; + + IList oneProcedure = session + .QueryOver() + .Where(x => (x.ProcedureState == ProcedureState.Active)) + .And(x => (x.Id == predecessorId)) + .List(); + + if (oneProcedure.Count == 1) + { + predecessorId = oneProcedure[0].PredecessorId; + } + else + { + return; + } + + while (predecessorId != 0) + { + bool found = false; + foreach (var p in procedures) + { + if (p.Id == predecessorId) + { + found = true; + ListViewItem item = new ListViewItem(p.Name); + item.SubItems.Add(p.Revision.ToString()); + item.SubItems.Add(p.LastChgTime.ToString()); + item.SubItems.Add(p.LastChgUser.ToString()); + item.SubItems.Add(p.Description); + historyListViewEx.Items.Add(item); + + predecessorId = p.PredecessorId; /// Iterate + break; + } + } + if (!found) break; + } + } + + void UpdateFromHistoryTab() + { + // Do nothing + } + + #endregion + + #region Metrology1 + + Control[] metrology1Editors; + + public enum MtrlgyClmn + { + Name, + Part, + Qfrom, + Qto, + Volume, + TestTime, + ErrLimLo, + ErrLimHi, + Method, + Repeats, + CoulumnsCount + } + + void PrepareMetrology1Tab() + { + Results.Forms.ListViewEx lv = metrology1ListViewEx; + lv.Columns.Add(new ColumnHeader { Text = Strings.Test_chdr, Width = 70 }); + lv.Columns.Add(new ColumnHeader { Text = Strings.Part, Width = 40 }); + lv.Columns.Add(new ColumnHeader { Text = Strings.Q_from_m3h, Width = 80 }); + lv.Columns.Add(new ColumnHeader { Text = Strings.Q_to_m3h, Width = 80 }); + lv.Columns.Add(new ColumnHeader { Text = Strings.Volume + " [l]", Width = 70 }); + lv.Columns.Add(new ColumnHeader { Text = Strings.Test_time_s_chdr, Width = 70 }); + lv.Columns.Add(new ColumnHeader { Text = Strings.Err_limit_neg_pct_chdr, Width = 80 }); + lv.Columns.Add(new ColumnHeader { Text = Strings.Err_limit_pos_pct_chdr, Width = 80 }); + //lv.Columns.Add(new ColumnHeader { Text = Strings.Zeroing_chdr, Width = 50 }); + lv.Columns.Add(new ColumnHeader { Text = Strings.Method_chdr, Width = 200 }); + lv.Columns.Add(new ColumnHeader { Text = Strings.Repeats_nr_chdr, Width = 90 }); + + methodCBox = new ComboBox(); + foreach (var m in TestMethods) methodCBox.Items.Add(m.Cfg.Name); + + metrology1Editors = new Control[] + { + new TextBox(), /// Name + new TextBox(), /// Part + new TextBox(), /// Qfrom + new TextBox(), /// Qto + new TextBox(), /// Volume + new TextBox(), /// Test time + new TextBox(), /// Err.Lim. - + new TextBox(), /// Err.Lim. + + methodCBox, /// Method + new TextBox(), /// Repeats count + }; + + foreach (var ctrl in metrology1Editors) + { + metrology1TabPage.Controls.Add(ctrl); + } + } + + void RefreshMetrology1Tab() + { + metrology1ListViewEx.Items.Clear(); + foreach (var test in LoadedProcedure.Tests) AddToMetrology1Tab(test); + + if (0 <= SelectedTestIx && SelectedTestIx < metrology1ListViewEx.Items.Count) + { + metrology1ListViewEx.Items[SelectedTestIx].Selected = true; + } + } + + void AddToMetrology1Tab(Test test) + { + /// + /// Metrology 1 item with subitems + /// + ListViewItem lvi = new ListViewItem(test.Name); /// Name + lvi.Tag = test; + lvi.SubItems.Add((test.Part == 0) ? "-" : test.Part.ToString()); /// Part + lvi.SubItems.Add(test.Qfrom.ToString()); /// Q_from + lvi.SubItems.Add(test.Qto.ToString()); /// Q_to + lvi.SubItems.Add(test.Volume.ToString()); /// VOlume + lvi.SubItems.Add(test.TstTime.ToString()); + lvi.SubItems.Add(test.ErrLimLo.ToString()); + lvi.SubItems.Add(test.ErrLimHi.ToString()); + //lvi.SubItems.Add(test.Zeroing ? Strings.yes : Strings.no); + lvi.SubItems.Add((test.Method != null) ? test.Method.ToString() : string.Empty); + lvi.SubItems.Add(test.Repeats.ToString()); + + metrology1ListViewEx.Items.Add(lvi); + } + + void UpdateFromMetrology1Tab() + { + for (int i = 0; i < metrology1ListViewEx.Items.Count; i++) + { + ListViewItem lvi = metrology1ListViewEx.Items[i]; + Test entity = (Test)lvi.Tag; + + entity.Name = lvi.Text; + + int part = entity.Part; + if (lvi.SubItems[(int)MtrlgyClmn.Part].Text.Equals("-")) + { + entity.Part = 0; + } + else if (int.TryParse(lvi.SubItems[(int)MtrlgyClmn.Part].Text, out part)) + { + entity.Part = part; + } + + float tmp; + if (Utils.TryParseUFloat(lvi.SubItems[(int)MtrlgyClmn.Qfrom].Text, out tmp)) entity.Qfrom = tmp; + if (Utils.TryParseUFloat(lvi.SubItems[(int)MtrlgyClmn.Qto].Text, out tmp)) entity.Qto = tmp; + if (Utils.TryParseUFloat(lvi.SubItems[(int)MtrlgyClmn.Volume].Text, out tmp)) entity.Volume = tmp; + if (Utils.TryParseUFloat(lvi.SubItems[(int)MtrlgyClmn.TestTime].Text,out tmp)) entity.TstTime = tmp; + + if (Utils.TryParseSFloat(lvi.SubItems[(int)MtrlgyClmn.ErrLimLo].Text, out tmp)) entity.ErrLimLo = tmp; + if (Utils.TryParseSFloat(lvi.SubItems[(int)MtrlgyClmn.ErrLimHi].Text, out tmp)) entity.ErrLimHi = tmp; + + if (methodCBox.Items.Contains(lvi.SubItems[(int)MtrlgyClmn.Method].Text)) + { + entity.Method = lvi.SubItems[(int)MtrlgyClmn.Method].Text; + } + + int itmp; + if (int.TryParse(lvi.SubItems[(int)MtrlgyClmn.Repeats].Text, out itmp)) entity.Repeats = itmp; + } + } + + private void metrology1ListViewEx_SubItemClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (unlocked && (e.SubItem < (int)MtrlgyClmn.CoulumnsCount)) + { + metrology1ListViewEx.StartEditing(metrology1Editors[e.SubItem], e.Item, e.SubItem); + } + } + + void metrology1ListViewEx_SubItemRightClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (!unlocked || e.SubItem >= (int)MtrlgyClmn.CoulumnsCount) return; + + if (DialogResult.Yes == MessageBox.Show(Strings.Do_you_want_to_copy_this_value_to_all_cells_below_this_cell, + Strings.Confirmation, MessageBoxButtons.YesNo, MessageBoxIcon.Question)) + { + int columnNr = e.SubItem; + string value = null; + System.Drawing.Color backColor = System.Drawing.Color.White; + foreach (ListViewItem item in metrology1ListViewEx.Items) + { + if (value != null && item.SubItems.Count > columnNr) + { + item.SubItems[columnNr].Text = value; + item.SubItems[columnNr].BackColor = backColor; + } + else if (item == e.Item) + { + value = item.SubItems[columnNr].Text; + backColor = item.SubItems[columnNr].BackColor; + } + } + } + } + + private void metrology1ListViewEx_SubItemEndEditing(object sender, Results.Forms.SubItemEndEditingEventArgs e) + { + if (e.SubItem == (int)MtrlgyClmn.Name) + { + if (!Utils.IsGoodFName(e.DisplayText)) + { + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + return; /// NOK + } + } + + int dummy; + if (e.SubItem == (int)MtrlgyClmn.Part) + { + if (e.DisplayText.Equals("-")) return; /// OK + if (!int.TryParse(e.DisplayText, out dummy) || dummy < 1 || dummy > Config.Data.MaxPartNr) + { + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + return; /// NOK + } + } + + if ((e.SubItem == (int)MtrlgyClmn.Repeats) && !int.TryParse(e.DisplayText, out dummy)) + { + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + return; + } + + if ((e.SubItem != (int)MtrlgyClmn.Qfrom) && + (e.SubItem != (int)MtrlgyClmn.Qto) && + (e.SubItem != (int)MtrlgyClmn.Volume) && + (e.SubItem != (int)MtrlgyClmn.TestTime)) + { + return; + } + + float Qfrom = 1.0f; + float Qto = 1.0f; + float volume = 0.0f; + float testTime = 0.0f; + + bool calculateVolume = false; + bool calculateTime = false; + bool allOk = true; + + if ((e.SubItem == (int)MtrlgyClmn.Qfrom) && Utils.TryParseUFloat(e.DisplayText, out Qfrom)) + { + allOk &= Utils.TryParseUFloat(e.Item.SubItems[(int)MtrlgyClmn.Qto].Text, out Qto); + allOk &= Utils.TryParseUFloat(e.Item.SubItems[(int)MtrlgyClmn.Volume].Text, out volume); + if (allOk) calculateTime = true; + } + else if ((e.SubItem == (int)MtrlgyClmn.Qto) && Utils.TryParseUFloat(e.DisplayText, out Qto)) + { + allOk &= Utils.TryParseUFloat(e.Item.SubItems[(int)MtrlgyClmn.Qfrom].Text, out Qfrom); + allOk &= Utils.TryParseUFloat(e.Item.SubItems[(int)MtrlgyClmn.Volume].Text, out volume); + if (allOk) calculateTime = true; + } + else if ((e.SubItem == (int)MtrlgyClmn.Volume) && Utils.TryParseUFloat(e.DisplayText, out volume)) + { + allOk &= Utils.TryParseUFloat(e.Item.SubItems[(int)MtrlgyClmn.Qfrom].Text, out Qfrom); + allOk &= Utils.TryParseUFloat(e.Item.SubItems[(int)MtrlgyClmn.Qto].Text, out Qto); + if (allOk) calculateTime = true; + } + else if ((e.SubItem == (int)MtrlgyClmn.TestTime) && Utils.TryParseUFloat(e.DisplayText, out testTime)) + { + allOk &= Utils.TryParseUFloat(e.Item.SubItems[(int)MtrlgyClmn.Qfrom].Text, out Qfrom); + allOk &= Utils.TryParseUFloat(e.Item.SubItems[(int)MtrlgyClmn.Qto].Text, out Qto); + if (allOk) calculateVolume = true; + } + + float Qave_lps = (Qfrom + Qto) / 7.2f; + if (calculateTime) + { + testTime = volume / Qave_lps; + e.Item.SubItems[(int)MtrlgyClmn.TestTime].Text = testTime.ToString(); + } + else if (calculateVolume) + { + volume = testTime * Qave_lps; + e.Item.SubItems[(int)MtrlgyClmn.Volume].Text = volume.ToString(); + } + else + { + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + } + } + + #endregion + + #region Metrology2 + + public enum Mtrlgy2Clmn + { + Name, + Part, + TankDraining, + Uncertainty, + ControlWaterTemp, + TempLimLo, + TempLimHi, + Filter, + Publish, + Evaluate, + ColumnsCount + } + + Control[] metrology2Editors; + + void PrepareMetrology2Tab() + { + Results.Forms.ListViewEx lv = metrology2ListViewEx; + lv.Columns.Add(new ColumnHeader { Text = Strings.Test_chdr, Width = 70 }); + lv.Columns.Add(new ColumnHeader { Text = Strings.Part, Width = 40 }); + lv.Columns.Add(new ColumnHeader { Text = Strings.Emptying_chdr, Width = 60 }); + lv.Columns.Add(new ColumnHeader { Text = Strings.Uncertainty_pct_chdr, Width = 90 }); + lv.Columns.Add(new ColumnHeader { Text = Strings.Control_water_temp_chdr, Width = 110 }); + lv.Columns.Add(new ColumnHeader { Text = string.Format("{0} [°C]", Strings.Temp_lim_lo_chdr), Width = 100 }); + lv.Columns.Add(new ColumnHeader { Text = string.Format("{0} [°C]", Strings.Temp_lim_hi_chdr), Width = 100 }); + lv.Columns.Add(new ColumnHeader { Text = "Filter", Width = 80 }); /// Strings.Tol_red_pct_chdr + lv.Columns.Add(new ColumnHeader { Text = Strings.Publish, Width = 100 }); + lv.Columns.Add(new ColumnHeader { Text = Strings.Evaluate, Width = 100 }); + //lv.Columns.Add(new ColumnHeader { Text = Strings.Red_type_chdr, Width = 80 }); + //lv.Columns.Add(new ColumnHeader { Text = Strings.Err_cor_neg_pct_chdr, Width = 90 }); + //lv.Columns.Add(new ColumnHeader { Text = Strings.Err_cor_pos_pct_chdr, Width = 90 }); + + ComboBox publishCBox = new ComboBox(); /// control for Publish + for (Config.Entities.Publish pb = 0; pb < Config.Entities.Publish.Count; pb++) + { + publishCBox.Items.Add(pb.ToDescription()); + } + + + ComboBox yesNo1CBox = new ComboBox(); /// control for Emptying + yesNo1CBox.Items.Add(Strings.yes); + yesNo1CBox.Items.Add(Strings.no); + + ComboBox yesNo2CBox = new ComboBox(); /// control for Control water temp. + yesNo2CBox.Items.Add(Strings.yes); + yesNo2CBox.Items.Add(Strings.no); + + ComboBox yesNo3CBox = new ComboBox(); /// control for Evaluate + yesNo3CBox.Items.Add(Strings.yes); + yesNo3CBox.Items.Add(Strings.no); + + metrology2Editors = new Control[] + { + new TextBox(), /// Name + new TextBox(), /// Part + yesNo1CBox, /// Emptying + new TextBox(), /// Uncertainty + yesNo2CBox, /// Control water temp. + new TextBox(), /// Temp. lim. lo + new TextBox(), /// Temp. lim. hi + new TextBox(), /// Filter + publishCBox, /// Publish + yesNo3CBox, /// Evaluate + }; + + foreach (var ctrl in metrology2Editors) + { + metrology2TabPage.Controls.Add(ctrl); + } + } + + void RefreshMetrology2Tab() + { + metrology2ListViewEx.Items.Clear(); + foreach (var test in LoadedProcedure.Tests) AddToMetrology2Tab(test); + + if (0 <= SelectedTestIx && SelectedTestIx < metrology2ListViewEx.Items.Count) + { + metrology2ListViewEx.Items[SelectedTestIx].Selected = true; + } + } + + void AddToMetrology2Tab(Test test) + { + /// + /// Metrology 2 item with subitems + /// + ListViewItem lvi = new ListViewItem(test.Name); /// Name + lvi.Tag = test; + lvi.SubItems.Add((test.Part == 0) ? "-" : test.Part.ToString()); /// Part + lvi.SubItems.Add(test.DoDraining ? Strings.yes : Strings.no); + lvi.SubItems.Add(test.Uncertainty.ToString()); + lvi.SubItems.Add(test.DoControlWaterTemp ? Strings.yes : Strings.no); + lvi.SubItems.Add(test.TempLimLo.ToString()); + lvi.SubItems.Add(test.TempLimHi.ToString()); + lvi.SubItems.Add(test.TolerRed.ToString()); + lvi.SubItems.Add(((Config.Entities.Publish)test.Publish).ToDescription()); + lvi.SubItems.Add(test.DoEvaluate ? Strings.yes : Strings.no); + + metrology2ListViewEx.Items.Add(lvi); + } + + void UpdateFromMetrology2Tab() + { + for (int i = 0; i < metrology2ListViewEx.Items.Count; i++) + { + ListViewItem lvi = metrology2ListViewEx.Items[i]; + Test entity = (Test)lvi.Tag; + + entity.Name = lvi.Text; + + int part = entity.Part; + if (lvi.SubItems[(int)Mtrlgy2Clmn.Part].Text.Equals("-")) + { + entity.Part = 0; + } + else if (int.TryParse(lvi.SubItems[(int)Mtrlgy2Clmn.Part].Text, out part)) + { + entity.Part = part; + } + + if (lvi.SubItems[(int)Mtrlgy2Clmn.TankDraining].Text.Equals(Strings.yes)) entity.DoDraining = true; + else if (lvi.SubItems[(int)Mtrlgy2Clmn.TankDraining].Text.Equals(Strings.no)) entity.DoDraining = false; + + if (lvi.SubItems[(int)Mtrlgy2Clmn.ControlWaterTemp].Text.Equals(Strings.yes)) entity.DoControlWaterTemp = true; + else if (lvi.SubItems[(int)Mtrlgy2Clmn.ControlWaterTemp].Text.Equals(Strings.no)) entity.DoControlWaterTemp = false; + + float tmp; + if (Utils.TryParseUFloat(lvi.SubItems[(int)Mtrlgy2Clmn.Uncertainty].Text, out tmp)) entity.Uncertainty = tmp; + if (Utils.TryParseUFloat(lvi.SubItems[(int)Mtrlgy2Clmn.TempLimLo].Text, out tmp)) entity.TempLimLo = tmp; + if (Utils.TryParseUFloat(lvi.SubItems[(int)Mtrlgy2Clmn.TempLimHi].Text, out tmp)) entity.TempLimHi = tmp; + if (Utils.TryParseUFloat(lvi.SubItems[(int)Mtrlgy2Clmn.Filter].Text, out tmp)) entity.TolerRed = (double)tmp; + + for (Config.Entities.Publish pb = 0; pb < Config.Entities.Publish.Count; pb++) + { + if (lvi.SubItems[(int)Mtrlgy2Clmn.Publish].Text.Equals(pb.ToDescription())) + { + entity.Publish = (sbyte)pb; + break; + } + } + + if (lvi.SubItems[(int)Mtrlgy2Clmn.Evaluate].Text.Equals(Strings.yes)) entity.DoEvaluate = true; + else if (lvi.SubItems[(int)Mtrlgy2Clmn.Evaluate].Text.Equals(Strings.no)) entity.DoEvaluate = false; + } + } + + private void metrology2ListViewEx_SubItemClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (!unlocked || e.SubItem >= (int)Mtrlgy2Clmn.ColumnsCount) + { + return; + } + + metrology2ListViewEx.StartEditing(metrology2Editors[e.SubItem], e.Item, e.SubItem); + } + + void metrology2ListViewEx_SubItemRightClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (!unlocked || e.SubItem >= (int)Mtrlgy2Clmn.ColumnsCount) + { + return; + } + + if (DialogResult.Yes == MessageBox.Show(Strings.Do_you_want_to_copy_this_value_to_all_cells_below_this_cell, + Strings.Confirmation, MessageBoxButtons.YesNo, MessageBoxIcon.Question)) + { + int columnNr = e.SubItem; + string value = null; + System.Drawing.Color backColor = System.Drawing.Color.White; + foreach (ListViewItem item in metrology2ListViewEx.Items) + { + if (value != null && item.SubItems.Count > columnNr) + { + item.SubItems[columnNr].Text = value; + item.SubItems[columnNr].BackColor = backColor; + } + else if (item == e.Item) + { + value = item.SubItems[columnNr].Text; + backColor = item.SubItems[columnNr].BackColor; + } + } + } + } + + private void metrology2ListViewEx_SubItemEndEditing(object sender, Results.Forms.SubItemEndEditingEventArgs e) + { + if (e.SubItem == (int)Mtrlgy2Clmn.Name) + { + if (!Utils.IsGoodFName(e.DisplayText)) + { + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + return; + } + } + + if ((e.SubItem == (int)Mtrlgy2Clmn.TankDraining) && !(metrology2Editors[(int)Mtrlgy2Clmn.TankDraining] as ComboBox).Items.Contains(e.DisplayText)) + { + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + return; + } + + if ((e.SubItem == (int)Mtrlgy2Clmn.ControlWaterTemp) && !(metrology2Editors[(int)Mtrlgy2Clmn.ControlWaterTemp] as ComboBox).Items.Contains(e.DisplayText)) + { + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + return; + } + + if ((e.SubItem == (int)Mtrlgy2Clmn.Evaluate) && !(metrology2Editors[(int)Mtrlgy2Clmn.Evaluate] as ComboBox).Items.Contains(e.DisplayText)) + { + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + return; + } + + int dummy; + if (e.SubItem == (int)Mtrlgy2Clmn.Part) + { + if (e.DisplayText.Equals("-")) return; /// OK + if (!int.TryParse(e.DisplayText, out dummy) || dummy < 1 || dummy > Config.Data.MaxPartNr) + { + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + return; /// NOK + } + } + if (e.SubItem == (int)Mtrlgy2Clmn.Publish) + { + for (Config.Entities.Publish pb = 0; pb < Config.Entities.Publish.Count; pb++) + { + if (e.DisplayText.Equals(pb.ToDescription())) return; + } + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + return; /// NOK + } + } + + #endregion + + #region Process + + public enum ProcessClmn + { + Name, + Part, + Feeding, + Bench, + Output, + Sensor, +#if HEAT_METERS + HeatMeterSensors, +#endif + TrnStart, + TrnStop, + ColumnsCount + } + + Control[] processEditors; + + void PrepareProcess() + { + Results.Forms.ListViewEx lv = processListViewEx; + lv.Columns.Add(new ColumnHeader { Text = Strings.Test_chdr, Width = 70 }); + lv.Columns.Add(new ColumnHeader { Text = Strings.Part, Width = 40 }); + lv.Columns.Add(new ColumnHeader { Text = Strings.Feeding_chdr, Width = 80 }); + lv.Columns.Add(new ColumnHeader { Text = Strings.Bench_chdr, Width = 80 }); + lv.Columns.Add(new ColumnHeader { Text = Strings.Output_chdr, Width = 80 }); + lv.Columns.Add(new ColumnHeader { Text = Strings.Sensors_chdr, Width = 80 }); +#if HEAT_METERS + lv.Columns.Add(new ColumnHeader { Text = Strings.Heat_meter_sensors, Width = 110 }); +#endif + lv.Columns.Add(new ColumnHeader { Text = Strings.TransitionStart_chdr, Width = 100 }); + lv.Columns.Add(new ColumnHeader { Text = Strings.TransitionEnd_chdr, Width = 100 }); + + processEditors = new Control[] + { + new TextBox(), /// Name + new TextBox(), /// Part + new ComboBox(), /// Feeding + new ComboBox(), /// Table + new ComboBox(), /// Output + new ComboBox(), /// Meters +#if HEAT_METERS + new ComboBox(), /// Heat meters +#endif + new ComboBox(), /// TransitionStart + new ComboBox(), /// TransitionEnd + }; + + foreach (var path in feedingPaths) ((ComboBox)processEditors[(int)ProcessClmn.Feeding]).Items.Add(path.Name); + foreach (var path in benchPaths) ((ComboBox)processEditors[(int)ProcessClmn.Bench]).Items.Add(path.Name); + foreach (var path in outputPaths) ((ComboBox)processEditors[(int)ProcessClmn.Output]).Items.Add(path.Name); + foreach (var path in metersPaths) ((ComboBox)processEditors[(int)ProcessClmn.Sensor]).Items.Add(path.Name); +#if HEAT_METERS + foreach (var path in heatMetersPaths) ((ComboBox)processEditors[(int)ProcessClmn.HeatMeterSensors]).Items.Add(path.Name); +#endif + + ((ComboBox)processEditors[(int)ProcessClmn.TrnStart]).Items.Add("---"); + ((ComboBox)processEditors[(int)ProcessClmn.TrnStop]).Items.Add("---"); + foreach (var trans in transitionSequences) + { + ((ComboBox)processEditors[(int)ProcessClmn.TrnStart]).Items.Add(trans.Name); + ((ComboBox)processEditors[(int)ProcessClmn.TrnStop]).Items.Add(trans.Name); + } + + foreach (var ctrl in processEditors) + { + processTabPage.Controls.Add(ctrl); + } + } + + void RefreshProcessTab() + { + processListViewEx.Items.Clear(); + foreach (var test in LoadedProcedure.Tests) AddToProcessTab(test); + + if (0 <= SelectedTestIx && SelectedTestIx < processListViewEx.Items.Count) + { + processListViewEx.Items[SelectedTestIx].Selected = true; + } + } + + void AddToProcessTab(Test test) + { + /// + /// Process item with subitems + /// + ListViewItem lvi = new ListViewItem(test.Name); /// Name + lvi.Tag = test; + lvi.SubItems.Add((test.Part == 0) ? "-" : test.Part.ToString()); /// Part + lvi.SubItems.Add(test.FeedingPath); + lvi.SubItems.Add(test.BenchPath); + lvi.SubItems.Add(test.OutputPath); + lvi.SubItems.Add(test.MetersPath); +#if HEAT_METERS + lvi.SubItems.Add(test.HeatMetersPath); +#endif + lvi.SubItems.Add(string.IsNullOrEmpty(test.RelTransBefore) ? "---" : test.RelTransBefore); + lvi.SubItems.Add(string.IsNullOrEmpty(test.TransitionAfter) ? "---" : test.TransitionAfter); + + processListViewEx.Items.Add(lvi); + } + + void UpdateFromProcessTab() + { + for (int i = 0; i < processListViewEx.Items.Count; i++) + { + ListViewItem lvi = processListViewEx.Items[i]; + Test entity = (Test)lvi.Tag; + + entity.Name = lvi.Text; + + int part = entity.Part; + if (lvi.SubItems[(int)ProcessClmn.Part].Text.Equals("-")) + { + entity.Part = 0; + } + else if (int.TryParse(lvi.SubItems[(int)ProcessClmn.Part].Text, out part)) + { + entity.Part = part; + } + + if ((processEditors[(int)ProcessClmn.Feeding] as ComboBox).Items.Contains(lvi.SubItems[(int)ProcessClmn.Feeding].Text)) + { + entity.FeedingPath = lvi.SubItems[(int)ProcessClmn.Feeding].Text; + } + if ((processEditors[(int)ProcessClmn.Bench] as ComboBox).Items.Contains(lvi.SubItems[(int)ProcessClmn.Bench].Text)) + { + entity.BenchPath = lvi.SubItems[(int)ProcessClmn.Bench].Text; + } + if ((processEditors[(int)ProcessClmn.Output] as ComboBox).Items.Contains(lvi.SubItems[(int)ProcessClmn.Output].Text)) + { + entity.OutputPath = lvi.SubItems[(int)ProcessClmn.Output].Text; + } + if ((processEditors[(int)ProcessClmn.Sensor] as ComboBox).Items.Contains(lvi.SubItems[(int)ProcessClmn.Sensor].Text)) + { + entity.MetersPath = lvi.SubItems[(int)ProcessClmn.Sensor].Text; + } +#if HEAT_METERS + if ((processEditors[(int)ProcessClmn.HeatMeterSensors] as ComboBox).Items.Contains(lvi.SubItems[(int)ProcessClmn.HeatMeterSensors].Text)) + { + entity.HeatMetersPath = lvi.SubItems[(int)ProcessClmn.HeatMeterSensors].Text; + } +#endif + if ((processEditors[(int)ProcessClmn.TrnStart] as ComboBox).Items.Contains(lvi.SubItems[(int)ProcessClmn.TrnStart].Text)) + { + entity.RelTransBefore = lvi.SubItems[(int)ProcessClmn.TrnStart].Text.Equals("---") ? string.Empty : lvi.SubItems[(int)ProcessClmn.TrnStart].Text; + } + if ((processEditors[(int)ProcessClmn.TrnStop] as ComboBox).Items.Contains(lvi.SubItems[(int)ProcessClmn.TrnStop].Text)) + { + entity.TransitionAfter = lvi.SubItems[(int)ProcessClmn.TrnStop].Text.Equals("---") ? string.Empty : lvi.SubItems[(int)ProcessClmn.TrnStop].Text; + } + } + } + + private void processListViewEx_SubItemClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (!unlocked || e.SubItem >= (int)ProcessClmn.ColumnsCount) + { + return; + } + + processListViewEx.StartEditing(processEditors[e.SubItem], e.Item, e.SubItem); + } + + void processListViewEx_SubItemRightClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (!unlocked || e.SubItem >= (int)ProcessClmn.ColumnsCount) + { + return; + } + + if (DialogResult.Yes == MessageBox.Show(Strings.Do_you_want_to_copy_this_value_to_all_cells_below_this_cell, + Strings.Confirmation, MessageBoxButtons.YesNo, MessageBoxIcon.Question)) + { + int columnNr = e.SubItem; + string value = null; + System.Drawing.Color backColor = System.Drawing.Color.White; + foreach (ListViewItem item in processListViewEx.Items) + { + if (value != null && item.SubItems.Count > columnNr) + { + item.SubItems[columnNr].Text = value; + item.SubItems[columnNr].BackColor = backColor; + } + else if (item == e.Item) + { + value = item.SubItems[columnNr].Text; + backColor = item.SubItems[columnNr].BackColor; + } + } + } + } + + private void processListViewEx_SubItemEndEditing(object sender, Results.Forms.SubItemEndEditingEventArgs e) + { + if (e.SubItem == (int)ProcessClmn.Name) + { + if (!Utils.IsGoodFName(e.DisplayText)) + { + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + return; /// NOK + } + } + + int dummy; + if (e.SubItem == (int)ProcessClmn.Part) + { + if (e.DisplayText.Equals("-")) return; /// OK + if (!int.TryParse(e.DisplayText, out dummy) || dummy < 1 || dummy > 3) + { + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + return; /// NOK + } + } + + if (((e.SubItem == (int)ProcessClmn.Feeding) && !(processEditors[(int)ProcessClmn.Feeding] as ComboBox).Items.Contains(e.DisplayText)) || + ((e.SubItem == (int)ProcessClmn.Bench) && !(processEditors[(int)ProcessClmn.Bench] as ComboBox).Items.Contains(e.DisplayText)) || + ((e.SubItem == (int)ProcessClmn.Output) && !(processEditors[(int)ProcessClmn.Output] as ComboBox).Items.Contains(e.DisplayText)) || + ((e.SubItem == (int)ProcessClmn.Sensor) && !(processEditors[(int)ProcessClmn.Sensor] as ComboBox).Items.Contains(e.DisplayText)) || + ((e.SubItem == (int)ProcessClmn.TrnStart) && !(processEditors[(int)ProcessClmn.TrnStart] as ComboBox).Items.Contains(e.DisplayText)) || + ((e.SubItem == (int)ProcessClmn.TrnStop) && !(processEditors[(int)ProcessClmn.TrnStop] as ComboBox).Items.Contains(e.DisplayText))) + { + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + } + } + + #endregion + + #region Parameters + + public enum ParametersClmn + { + Name, + Part, + PumpPower, + MassRepeats, +#if STABLE_MASS_EXTRAS + MassSpread, + MassMethod, +#endif + Time_Pump2StartV, + Time_BeforeFlow, + Time_Flow2Mass, + Time_Stop2Mass, + ColumnsCount + } + + Control[] parametersEditors; + + void PrepareParameters() + { + Results.Forms.ListViewEx lv = parametersListViewEx; + lv.Columns.Add(new ColumnHeader { Text = Strings.Test_chdr, Width = 70 }); + lv.Columns.Add(new ColumnHeader { Text = Strings.Part, Width = 40 }); + lv.Columns.Add(new ColumnHeader { Text = Strings.Pump_power_pct, Width = 90 }); + lv.Columns.Add(new ColumnHeader { Text = Strings.Mass_repeats, Width = 90 }); +#if STABLE_MASS_EXTRAS + lv.Columns.Add(new ColumnHeader { Text = Strings.Mass_spread_kg, Width = 110 }); + lv.Columns.Add(new ColumnHeader { Text = Strings.Mass_method, Width = 90 }); +#endif + lv.Columns.Add(new ColumnHeader { Text = Strings.TimePump2StartV_chdr, Width = 70 }); + lv.Columns.Add(new ColumnHeader { Text = Strings.TimeBeforeSettingFlow, Width = 70 }); + lv.Columns.Add(new ColumnHeader { Text = Strings.TimeFlow2Start_chdr, Width = 70 }); + lv.Columns.Add(new ColumnHeader { Text = Strings.Time2MassMsrmt_chdr, Width = 70 }); + + parametersEditors = new Control[] + { + new TextBox(), /// Name + new TextBox(), /// Part + new ComboBox(), /// PumpPower + new TextBox(), /// MassRepeats +#if STABLE_MASS_EXTRAS + new TextBox(), /// MassSpread + new ComboBox(), /// MassMethod +#endif + new TextBox(), /// Time_Pump2StartV + new TextBox(), /// Time_BeforeFlow + new TextBox(), /// Time_Flow2Mass + new TextBox(), /// Time_Stop2Mass + }; + + ((ComboBox)parametersEditors[(int)ParametersClmn.PumpPower]).Items.Add("0"); + ((ComboBox)parametersEditors[(int)ParametersClmn.PumpPower]).Items.Add("30"); + ((ComboBox)parametersEditors[(int)ParametersClmn.PumpPower]).Items.Add("40"); + ((ComboBox)parametersEditors[(int)ParametersClmn.PumpPower]).Items.Add("50"); + ((ComboBox)parametersEditors[(int)ParametersClmn.PumpPower]).Items.Add("60"); + ((ComboBox)parametersEditors[(int)ParametersClmn.PumpPower]).Items.Add("70"); + ((ComboBox)parametersEditors[(int)ParametersClmn.PumpPower]).Items.Add("75"); + ((ComboBox)parametersEditors[(int)ParametersClmn.PumpPower]).Items.Add("80"); + ((ComboBox)parametersEditors[(int)ParametersClmn.PumpPower]).Items.Add("85"); + ((ComboBox)parametersEditors[(int)ParametersClmn.PumpPower]).Items.Add("90"); + ((ComboBox)parametersEditors[(int)ParametersClmn.PumpPower]).Items.Add("92"); + ((ComboBox)parametersEditors[(int)ParametersClmn.PumpPower]).Items.Add("94"); + ((ComboBox)parametersEditors[(int)ParametersClmn.PumpPower]).Items.Add("96"); + ((ComboBox)parametersEditors[(int)ParametersClmn.PumpPower]).Items.Add("98"); + ((ComboBox)parametersEditors[(int)ParametersClmn.PumpPower]).Items.Add("100"); +#if STABLE_MASS_EXTRAS + for (MassMethod mm = 0; mm < MassMethod.Count; mm++) + { + ((ComboBox)parametersEditors[(int)ParametersClmn.MassMethod]).Items.Add(mm.ToDescription()); + } +#endif + foreach (var ctrl in parametersEditors) + { + parametersTabPage.Controls.Add(ctrl); + } + } + + void RefreshParametersTab() + { + parametersListViewEx.Items.Clear(); + foreach (var test in LoadedProcedure.Tests) AddToParametersTab(test); + + if (0 <= SelectedTestIx && SelectedTestIx < parametersListViewEx.Items.Count) + { + parametersListViewEx.Items[SelectedTestIx].Selected = true; + } + } + + void AddToParametersTab(Test test) + { + /// + /// Parameters item with subitems + /// + ListViewItem lvi = new ListViewItem(test.Name); /// Name + lvi.Tag = test; + lvi.SubItems.Add((test.Part == 0) ? "-" : test.Part.ToString()); /// + lvi.SubItems.Add(test.PumpPower.ToString("F1")); + lvi.SubItems.Add((test.MassRepeats < 4 ? 5 : test.MassRepeats).ToString()); +#if STABLE_MASS_EXTRAS + lvi.SubItems.Add(test.MassSpread.ToString("F4")); + lvi.SubItems.Add(test.MassMethod.ToDescription()); +#endif + lvi.SubItems.Add(test.TimePump2StartV.ToString()); + lvi.SubItems.Add(test.TimeBeforeFlow.ToString()); + lvi.SubItems.Add(test.TimeFlow2Mass.ToString()); + lvi.SubItems.Add(test.TimeStop2Mass.ToString()); + + parametersListViewEx.Items.Add(lvi); + } + + void UpdateFromParametersTab() + { + for (int i = 0; i < parametersListViewEx.Items.Count; i++) + { + ListViewItem lvi = parametersListViewEx.Items[i]; + Test entity = (Test)lvi.Tag; + + entity.Name = lvi.Text; + + int part = entity.Part; + if (lvi.SubItems[(int)ParametersClmn.Part].Text.Equals("-")) + { + entity.Part = 0; + } + else if (int.TryParse(lvi.SubItems[(int)ParametersClmn.Part].Text, out part)) + { + entity.Part = part; + } + + float powerPct; + if (Utils.TryParseUFloat(lvi.SubItems[(int)ParametersClmn.PumpPower].Text, out powerPct) && powerPct >= 0 && powerPct <= 100.0f) + { + entity.PumpPower = powerPct; + } + + entity.MassRepeats = int.Parse(lvi.SubItems[(int)ParametersClmn.MassRepeats].Text); + +#if STABLE_MASS_EXTRAS + float massSpread; + if (Utils.TryParseUFloat(lvi.SubItems[(int)ParametersClmn.MassSpread].Text, out massSpread) && massSpread >= 0) + { + entity.MassSpread = massSpread; + } + + for (MassMethod mm = 0; mm < MassMethod.Count; mm++) + { + if (mm.ToDescription().Equals(lvi.SubItems[(int)ParametersClmn.MassMethod].Text)) entity.MassMethod = mm; + } +#endif + int itmp; + if (int.TryParse(lvi.SubItems[(int)ParametersClmn.Time_Pump2StartV].Text, out itmp)) entity.TimePump2StartV = itmp; + if (int.TryParse(lvi.SubItems[(int)ParametersClmn.Time_BeforeFlow].Text, out itmp)) entity.TimeBeforeFlow = itmp; + if (int.TryParse(lvi.SubItems[(int)ParametersClmn.Time_Flow2Mass].Text, out itmp)) entity.TimeFlow2Mass = itmp; + if (int.TryParse(lvi.SubItems[(int)ParametersClmn.Time_Stop2Mass].Text, out itmp)) entity.TimeStop2Mass = itmp; + } + } + + private void parametersListViewEx_SubItemClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (!unlocked || e.SubItem >= (int)ParametersClmn.ColumnsCount) + { + return; + } + + parametersListViewEx.StartEditing(parametersEditors[e.SubItem], e.Item, e.SubItem); + } + + void parametersListViewEx_SubItemRightClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (!unlocked || e.SubItem >= (int)ParametersClmn.ColumnsCount) + { + return; + } + + if (DialogResult.Yes == MessageBox.Show(Strings.Do_you_want_to_copy_this_value_to_all_cells_below_this_cell, + Strings.Confirmation, MessageBoxButtons.YesNo, MessageBoxIcon.Question)) + { + int columnNr = e.SubItem; + string value = null; + System.Drawing.Color backColor = System.Drawing.Color.White; + foreach (ListViewItem item in parametersListViewEx.Items) + { + if (value != null && item.SubItems.Count > columnNr) + { + item.SubItems[columnNr].Text = value; + item.SubItems[columnNr].BackColor = backColor; + } + else if (item == e.Item) + { + value = item.SubItems[columnNr].Text; + backColor = item.SubItems[columnNr].BackColor; + } + } + } + } + + private void parametersListViewEx_SubItemEndEditing(object sender, Results.Forms.SubItemEndEditingEventArgs e) + { + if (e.SubItem == (int)ParametersClmn.Name) + { + if (!Utils.IsGoodFName(e.DisplayText)) + { + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + return; /// NOK + } + } + + int dummy; + if (e.SubItem == (int)ParametersClmn.Part) + { + if (e.DisplayText.Equals("-")) return; /// OK + if (!int.TryParse(e.DisplayText, out dummy) || dummy < 1 || dummy > 3) + { + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + return; /// NOK + } + } + + float powerPct; + if ((e.SubItem == (int)ParametersClmn.PumpPower) && + (!Utils.TryParseUFloat(e.DisplayText, out powerPct) || powerPct < 0 || powerPct > 100.0f)) + { + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + } + + int itmp; + if ((e.SubItem == (int)ParametersClmn.Time_Pump2StartV) && + (!int.TryParse(e.DisplayText, out itmp) || itmp < 0 || itmp > 300)) + { + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + } + if ((e.SubItem == (int)ParametersClmn.Time_BeforeFlow) && + (!int.TryParse(e.DisplayText, out itmp) || itmp < 0 || itmp > 300)) + { + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + } + if ((e.SubItem == (int)ParametersClmn.Time_Flow2Mass) && + (!int.TryParse(e.DisplayText, out itmp) || itmp < 0 || itmp > 300)) + { + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + } + if ((e.SubItem == (int)ParametersClmn.Time_Stop2Mass) && + (!int.TryParse(e.DisplayText, out itmp) || itmp < 0 || itmp > 300)) + { + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + } + if ((e.SubItem == (int)ParametersClmn.MassRepeats) && + (!int.TryParse(e.DisplayText, out itmp) || itmp < 4 || itmp > 100)) + { + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + } + +#if STABLE_MASS_EXTRAS + if ((e.SubItem == (int)ParametersClmn.MassSpread) && !Utils.TryParseUFloat(e.DisplayText, out powerPct)) + { + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + } + + if (e.SubItem == (int)ParametersClmn.MassMethod) + { + bool mmIsOk = false; + for (MassMethod mm = 0; mm < MassMethod.Count; mm++) + { + if (mm.ToDescription().Equals(e.DisplayText)) + { + mmIsOk = true; + break; + } + } + if (!mmIsOk) + { + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + } + } +#endif + } + + #endregion + + + void RefreshMetrology12AndProcessTabs() + { + RefreshMetrology1Tab(); + RefreshMetrology2Tab(); + RefreshProcessTab(); + RefreshParametersTab(); + } + + void RefreshOtherTabs() + { + foreach (var ctrl in testParamsCtrls) ctrl.RedrawAll(); + foreach (var ctrl in procedureParamsCtrls) ctrl.RedrawAll(); + } + + + private void Unlocked(object sender, EventArgs e) + { + unlocked = true; + if (testParamsCtrls != null) foreach (var ctrl in testParamsCtrls) ctrl.Unlock(); + if (procedureParamsCtrls != null) foreach (var ctrl in procedureParamsCtrls) ctrl.Unlock(); + + procNameTextBox.Enabled = true; + descriptionTextBox.Enabled = true; + watermetersTextBox.Enabled = true; + protectedCheckBox.Enabled = Users.GlobalData.CurrentUser.IsMemberOf(Users.Grp.GID.Metrologists); + mustBeCompleteCheckBox.Enabled = true; + manualControlDisabledCheckBox.Enabled = true; + dataEntryComboBox.Enabled = true; + metersKindRadioButton1.Enabled = true; + metersKindRadioButton2.Enabled = true; + altProcNameTextBox.Enabled = true; + altProcPeriodTextBox.Enabled = true; +#if HEAT_METERS + metersKindRadioButton3.Enabled = true; +#endif + printer1ComboBox.Enabled = true; + printer2ComboBox.Enabled = true; + fileWriter1ComboBox.Enabled = true; + fileWriter2ComboBox.Enabled = true; + fileWriter3ComboBox.Enabled = true; + fileWriter4ComboBox.Enabled = true; + transitionStartComboBox.Enabled = true; + transitionEndComboBox.Enabled = true; + notesTextBox.Enabled = true; + + Results.Forms.ListViewEx listViewEx; + + switch (selectedTab) + { + case ProcedureTabs.Metrology1: + listViewEx = metrology1ListViewEx; + break; + case ProcedureTabs.Metrology2: + listViewEx = metrology2ListViewEx; + break; + case ProcedureTabs.Process: + listViewEx = processListViewEx; + break; + case ProcedureTabs.Parameters: + listViewEx = parametersListViewEx; + break; + default: + return; + } + + if (listViewEx.SelectedItems.Count == 1) + { + int ix = listViewEx.SelectedIndices[0]; + listViewEx.Focus(); + listViewEx.Items[ix].Selected = true; + listViewEx.Items[ix].EnsureVisible(); + } + } + + private void okButton_Click(object sender, EventArgs e) + { + switch (selectedTab) + { + case ProcedureTabs.General: UpdateFromGeneralTab(); break; + case ProcedureTabs.Metrology1: UpdateFromMetrology1Tab(); break; + case ProcedureTabs.Metrology2: UpdateFromMetrology2Tab(); break; + case ProcedureTabs.Process: UpdateFromProcessTab(); break; + case ProcedureTabs.Parameters: UpdateFromParametersTab(); break; + } + + foreach (var ctrl in testParamsCtrls) ctrl.UpdateAll(); + foreach (var ctrl in procedureParamsCtrls) ctrl.UpdateAll(); + + if (usedNames != null && usedNames.Contains(LoadedProcedure.Name)) + { + MessageBox.Show(string.Format("There is already a procedure named '{0}'.{1}Choose another name please.", LoadedProcedure.Name, Environment.NewLine), + Strings.Warning, + MessageBoxButtons.OK, + MessageBoxIcon.Exclamation); + return; + } + + Program.LocalSettings.OneProcedureDlgLeft = Location.X; + Program.LocalSettings.OneProcedureDlgTop = Location.Y; + Program.LocalSettings.OneProcedureDlgWidth = Size.Width; + Program.LocalSettings.OneProcedureDlgHeight = Size.Height; + Program.LocalSettings.Save(); + + DialogResult = DialogResult.OK; + Close(); + return; + } + + private void cancelButton_Click(object sender, EventArgs e) + { + Program.LocalSettings.OneProcedureDlgLeft = Location.X; + Program.LocalSettings.OneProcedureDlgTop = Location.Y; + Program.LocalSettings.OneProcedureDlgWidth = Size.Width; + Program.LocalSettings.OneProcedureDlgHeight = Size.Height; + Program.LocalSettings.Save(); + + DialogResult = DialogResult.Cancel; + Close(); + return; + } + + #region Tab switching + + enum ProcedureTabs + { + General, + History, + Metrology1, + Metrology2, + Process, + Parameters, + } + + ProcedureTabs selectedTab = ProcedureTabs.General; + + private void tabControl_SelectedIndexChanged(object sender, EventArgs e) + { + switch (selectedTab) + { + case ProcedureTabs.General: + UpdateFromGeneralTab(); + break; + case ProcedureTabs.Metrology1: + UpdateFromMetrology1Tab(); + break; + case ProcedureTabs.Metrology2: + UpdateFromMetrology2Tab(); + break; + case ProcedureTabs.Process: + UpdateFromProcessTab(); + break; + case ProcedureTabs.Parameters: + UpdateFromParametersTab(); + break; + } + + selectedTab = (ProcedureTabs)tabControl.SelectedIndex; + bool isMetr12ProcOrParams = selectedTab == ProcedureTabs.Metrology1 || + selectedTab == ProcedureTabs.Metrology2 || + selectedTab == ProcedureTabs.Process || + selectedTab == ProcedureTabs.Parameters; + + sharedButtons.SetEnabled(SharedButtons.Buttons.Add, isMetr12ProcOrParams); + + //bool removeBtnEnabled = (selectedTab != ProcedureTabs.General && + // selectedTab != ProcedureTabs.History && + // selectedTab != ProcedureTabs.Calibration); + + sharedButtons.DisableButtons(SharedButtons.Buttons.Remove); + + Results.Forms.ListViewEx lv = null; + /// + switch (selectedTab) + { + case ProcedureTabs.General: + RefreshGeneralTab(); + break; + + case ProcedureTabs.Metrology1: + RefreshMetrology1Tab(); + lv = metrology1ListViewEx; /// ListVIewEx for test selection + break; + + case ProcedureTabs.Metrology2: + RefreshMetrology2Tab(); + lv = metrology2ListViewEx; /// ListVIewEx for test selection + break; + + case ProcedureTabs.Process: + RefreshProcessTab(); + lv = processListViewEx; /// ListVIewEx for test selection + break; + + case ProcedureTabs.Parameters: + RefreshParametersTab(); + lv = parametersListViewEx; /// ListVIewEx for test selection + break; + + default: + object ctrl = tabControl.SelectedTab.Tag; + if (ctrl is TestParamsCtrl) + { + (ctrl as TestParamsCtrl).RedrawAll(); + lv = (ctrl as TestParamsCtrl).LVEx; /// ListVIewEx for test selection + } + else if (ctrl is ProcedureParamsCtrl) + { + (ctrl as ProcedureParamsCtrl).RedrawAll(); + } + UpdateButtonStates(SharedButtons.SelectedItemPos.None); + break; + } + + /// + /// Highlight the selected test + /// + if (lv != null && 0 <= SelectedTestIx && SelectedTestIx < lv.Items.Count) + { + lv.Focus(); + lv.Items[SelectedTestIx].Selected = true; + lv.Items[SelectedTestIx].EnsureVisible(); + } + } + + #endregion + + #region 'Add', 'Remove', 'Up' and 'Down' + + private void addButton_Click(object sender, EventArgs e) + { + Results.Forms.ListViewEx listViewEx; + + switch (selectedTab) + { + case ProcedureTabs.Metrology1: listViewEx = metrology1ListViewEx; break; + case ProcedureTabs.Metrology2: listViewEx = metrology2ListViewEx; break; + case ProcedureTabs.Process: listViewEx = processListViewEx; break; + case ProcedureTabs.Parameters: listViewEx = parametersListViewEx; break; + + default: return; + } + + /// Find an unused test name + string newName; + for (int nameId = 1; true; nameId++) + { + newName = Strings.New_test_name + nameId.ToString(); + bool notUsed = true; + foreach (var t in LoadedProcedure.Tests) if (t.Name.Equals(newName)) notUsed = false; + if (notUsed) break; + } + + /// Add a test + Test test = new Test(newName, listViewEx.Items.Count, LoadedProcedure); + TestWizard.RoiData roiData = new TestWizard.RoiData(); + + /// Run a create new test wizard + TestWizard.MethodSelection methodDlg = new TestWizard.MethodSelection(true, false, test, TestMethods); + TestWizard.FlowSelection flowDlg = new TestWizard.FlowSelection(false, false, test, metersPaths); + TestWizard.VolumeAndErrorSelection volumeDlg = new TestWizard.VolumeAndErrorSelection(false, true, test); + TestWizard.PressureSelection pressureDlg = new TestWizard.PressureSelection(false, true, test); + TestWizard.HeatMetersSelection heatMetersDlg = new TestWizard.HeatMetersSelection(false, false, test); + TestWizard.Roi1 roi1Dlg = new TestWizard.Roi1(false, false, roiData); + TestWizard.Roi2 roi2Dlg = new TestWizard.Roi2(false, false, roiData); + TestWizard.Roi3 roi3Dlg = new TestWizard.Roi3(false, false, roiData); + //test. + + methodLabel: + + switch (methodDlg.ShowDialog()) + { + case DialogResult.Cancel: return; + } + + ITestMethod selectedMethod = TestMethods.FirstOrDefault(x => x.Name.Equals(test.Method)); + + if (selectedMethod is TBF.BenchControl.TestMethods.OuterLoop.Start.Component + || selectedMethod is TBF.BenchControl.TestMethods.OuterLoop.End.Component) + { + test.Publish = (sbyte)Publish.Never; + test.DoEvaluate = false; + goto done; + } + if (selectedMethod is BenchControl.TestMethods.PMaxTest.TestMethod) goto pressure_label; + if (selectedMethod is BenchControl.TestMethods.LeakTest.TestMethod) goto pressure_label; +#if HEAT_METERS + if (selectedMethod.CanTest(MetersKind.HeatMeter)) goto heat_meters_label; +#endif + if (!(selectedMethod is BenchControl.TestMethods.RoiDetection.RoiDetection)) goto flowLabel; + + roi_detection_label_1: + switch (roi1Dlg.ShowDialog()) + { + case DialogResult.Cancel: return; + case DialogResult.Retry: goto methodLabel; + } + + roi_detection_label_2: + switch (roi2Dlg.ShowDialog()) + { + case DialogResult.Cancel: return; + case DialogResult.Retry: goto roi_detection_label_1; + } + + switch (roi3Dlg.ShowDialog()) + { + case DialogResult.Cancel: return; + case DialogResult.Retry: goto roi_detection_label_2; + } + + /// Pre-calculate additional data and flow for ROI detection + roiData.Calculate(); + test.Qfrom = (float)(roiData.Q * 0.95); + test.Qto = (float)(roiData.Q * 1.05); + + flowLabel: + switch (flowDlg.ShowDialog()) + { + case DialogResult.Cancel: return; + case DialogResult.Retry: goto methodLabel; + } + + if (selectedMethod is BenchControl.TestMethods.RoiDetection.RoiDetection) + { + AddProcedureParamsToRoiComponents(LoadedProcedure, test.MetersPath, roiData); + goto select_paths; + } + + switch (volumeDlg.ShowDialog()) + { + case DialogResult.Cancel: return; + case DialogResult.Retry: goto flowLabel; + } + + select_paths: + + /// Depending on the chosen Q select the paths + float Qaver = (test.Qfrom + test.Qto) / 2.0f; + foreach (var path in feedingPaths) + { + if ((path.Qfrom <= Qaver) && (Qaver <= path.Qto)) + { + test.FeedingPath = path.Name; + break; + } + } + foreach (var path in benchPaths) + { + if ((path.Qfrom <= Qaver) && (Qaver <= path.Qto)) + { + test.BenchPath = path.Name; + break; + } + } + foreach (var path in outputPaths) + { + if ((path.Qfrom <= Qaver) && (Qaver <= path.Qto)) + { + test.OutputPath = path.Name; + break; + } + } + + goto done; + +#if HEAT_METERS + heat_meters_label: + + DialogResult dr = heatMetersDlg.ShowDialog(); + switch (dr) + { + case DialogResult.Cancel: return; + case DialogResult.Retry: goto methodLabel; + } + goto flowLabel; +#endif + + pressure_label: + + switch (pressureDlg.ShowDialog()) + { + case DialogResult.Cancel: return; + case DialogResult.Retry: goto methodLabel; + } + + done: + + LoadedProcedure.Tests.Add(test); + /// + AddToMetrology1Tab(test); + AddToMetrology2Tab(test); + AddToProcessTab(test); + AddToParametersTab(test); + foreach (var ctrl in testParamsCtrls) ctrl.AddOne(test); + + listViewEx.Focus(); + listViewEx.SelectedItems.Clear(); + listViewEx.Items[listViewEx.Items.Count - 1].Selected = true; + listViewEx.Items[listViewEx.Items.Count - 1].EnsureVisible(); + } + + private void removeButton_Click(object sender, EventArgs e) + { + Results.Forms.ListViewEx listViewEx; + + switch (selectedTab) + { + case ProcedureTabs.Metrology1: + UpdateFromMetrology1Tab(); + listViewEx = metrology1ListViewEx; + break; + + case ProcedureTabs.Metrology2: + UpdateFromMetrology2Tab(); + listViewEx = metrology2ListViewEx; + break; + + case ProcedureTabs.Process: + UpdateFromProcessTab(); + listViewEx = processListViewEx; + break; + + case ProcedureTabs.Parameters: + UpdateFromParametersTab(); + listViewEx = parametersListViewEx; + break; + + default: return; + } + + /// Check the selected index validity + if (listViewEx.SelectedItems.Count != 1) return; + int removeItemNr = listViewEx.SelectedIndices[0]; + + /// Remove the selected test + Test toBeDeleted = LoadedProcedure.Tests[removeItemNr]; + LoadedProcedure.Tests.Remove(toBeDeleted); + for (int i = removeItemNr; i < LoadedProcedure.Tests.Count; i++) LoadedProcedure.Tests[i].ItemNr--; + + RefreshMetrology12AndProcessTabs(); + foreach (var ctrl in testParamsCtrls) ctrl.RedrawAll(); + + if (removeItemNr < listViewEx.Items.Count) + { + listViewEx.Focus(); + listViewEx.Items[removeItemNr].Selected = true; + listViewEx.Items[removeItemNr].EnsureVisible(); + } + else + { + UpdateButtonStates(SharedButtons.SelectedItemPos.None); + } + } + + private void upButton_Click(object sender, EventArgs e) + { + Results.Forms.ListViewEx listViewEx; + + switch (selectedTab) + { + case ProcedureTabs.Metrology1: + UpdateFromMetrology1Tab(); + listViewEx = metrology1ListViewEx; + break; + + case ProcedureTabs.Metrology2: + UpdateFromMetrology2Tab(); + listViewEx = metrology2ListViewEx; + break; + + case ProcedureTabs.Process: + UpdateFromProcessTab(); + listViewEx = processListViewEx; + break; + + case ProcedureTabs.Parameters: + UpdateFromParametersTab(); + listViewEx = parametersListViewEx; + break; + + default: return; + } + + /// Check the selected index validity + if (listViewEx.SelectedItems.Count != 1) return; + int ix = listViewEx.SelectedIndices[0]; + if (ix <= 0 || ix >= listViewEx.Items.Count) return; + + /// Swap two items (move the selected item up) + Test test1 = LoadedProcedure.Tests[ix - 1]; + Test test2 = LoadedProcedure.Tests[ix]; + test1.ItemNr++; + test2.ItemNr--; + LoadedProcedure.Tests.RemoveAt(ix); + LoadedProcedure.Tests.Insert(ix - 1, test2); + + if (SelectedTestIx >= 1) SelectedTestIx--; + + RefreshMetrology12AndProcessTabs(); + + listViewEx.Focus(); + listViewEx.Items[ix - 1].Selected = true; + listViewEx.Items[ix - 1].EnsureVisible(); + } + + private void downButton_Click(object sender, EventArgs e) + { + Results.Forms.ListViewEx listViewEx; + + switch (selectedTab) + { + case ProcedureTabs.Metrology1: + UpdateFromMetrology1Tab(); + listViewEx = metrology1ListViewEx; + break; + + case ProcedureTabs.Metrology2: + UpdateFromMetrology2Tab(); + listViewEx = metrology2ListViewEx; + break; + + case ProcedureTabs.Process: + UpdateFromProcessTab(); + listViewEx = processListViewEx; + break; + + case ProcedureTabs.Parameters: + UpdateFromParametersTab(); + listViewEx = parametersListViewEx; + break; + + default: return; + } + + /// Check the selected index validity + if (listViewEx.SelectedItems.Count != 1) return; + int ix = listViewEx.SelectedIndices[0]; + if (ix < 0 || ix >= listViewEx.Items.Count - 1) return; + + /// Swap two items (move the selected item down) + Test test1 = LoadedProcedure.Tests[ix]; + Test test2 = LoadedProcedure.Tests[ix + 1]; + test1.ItemNr++; + test2.ItemNr--; + LoadedProcedure.Tests.RemoveAt(ix + 1); + LoadedProcedure.Tests.Insert(ix, test2); + + if ((SelectedTestIx >= 0) && (SelectedTestIx < listViewEx.Items.Count - 1)) SelectedTestIx++; + + RefreshMetrology12AndProcessTabs(); + + listViewEx.Focus(); + listViewEx.Items[ix + 1].Selected = true; + listViewEx.Items[ix + 1].EnsureVisible(); + } + + #endregion + + private void metrology1ListViewEx_SelectedIndexChanged(object sender, EventArgs e) { SelectedIndexChanged(sender, e); } + private void metrology2ListViewEx_SelectedIndexChanged(object sender, EventArgs e) { SelectedIndexChanged(sender, e); } + private void processListViewEx_SelectedIndexChanged(object sender, EventArgs e) { SelectedIndexChanged(sender, e); } + private void parametersListViewEx_SelectedIndexChanged(object sender, EventArgs e) { SelectedIndexChanged(sender, e); } + + /// + /// Common part for four xxxListViewEx_SelectedIndexChanged event handlers + /// + void SelectedIndexChanged(object sender, EventArgs e) + { + Results.Forms.ListViewEx listViewEx = sender as Results.Forms.ListViewEx; + if (listViewEx.SelectedItems.Count != 1) + { + UpdateButtonStates(SharedButtons.SelectedItemPos.None); + SelectedTestIx = -1; + return; + } + + SelectedTestIx = listViewEx.SelectedIndices[0]; + + if (listViewEx.Items.Count == 1) + { + UpdateButtonStates(SharedButtons.SelectedItemPos.FirstAndLast); + } + else if (SelectedTestIx == 0) + { + UpdateButtonStates(SharedButtons.SelectedItemPos.First); + } + else if (SelectedTestIx == (listViewEx.Items.Count - 1)) + { + UpdateButtonStates(SharedButtons.SelectedItemPos.Last); + } + else + { + UpdateButtonStates(SharedButtons.SelectedItemPos.Middle); + } + } + + public void UpdateButtonStates(SharedButtons.SelectedItemPos selectedItemPos) + { + if (selectedItemPos == SharedButtons.SelectedItemPos.None) + { + sharedButtons.DisableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up | SharedButtons.Buttons.Down); + } + else if (selectedItemPos == SharedButtons.SelectedItemPos.First) + { + sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Down); + sharedButtons.DisableButtons(SharedButtons.Buttons.Up); + } + else if (selectedItemPos == SharedButtons.SelectedItemPos.Last) + { + sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up); + sharedButtons.DisableButtons(SharedButtons.Buttons.Down); + } + else if (selectedItemPos == SharedButtons.SelectedItemPos.FirstAndLast) + { + sharedButtons.EnableButtons(SharedButtons.Buttons.Remove); + sharedButtons.DisableButtons(SharedButtons.Buttons.Up | SharedButtons.Buttons.Down); + } + else + { + sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up | SharedButtons.Buttons.Down); + } + } + + /// + /// Adds ROI data/process data prepared by the wizard to ROI-components in the selected sensors path + /// + /// Loaded procedure + /// Selected sensors path + /// ROI data + void AddProcedureParamsToRoiComponents(Config.Entities.Procedure procedure, string sensorsPathName, TestWizard.RoiData roiData) + { + IList cmpntsInSensPath = new List(); + + MetersPath sensorsPath = metersPaths.FirstOrDefault(x => (x.Name == sensorsPathName)); + if (sensorsPath != null) + { + for (int i = 0; i < Config.Data.WMsCount; i++) + { + IComponent sensor = TbfComponents.FirstOrDefault(x => (x.Cfg.Name.Equals(sensorsPath.GetSensor(i)))); + cmpntsInSensPath.Add(sensor); + } + } + + foreach (var cmpnt in cmpntsInSensPath) + { + if (cmpnt != null && (cmpnt.Cfg is BenchControl.Network.Camera.Roi.RoiCfg)) + { + BenchControl.Network.Camera.Roi.ProcedureParams roiParams = + new BenchControl.Network.Camera.Roi.ProcedureParams() + { + PulsesPerLtr = (float)roiData.PulsesPerLiter, + DetectionImagesCount = roiData.N, + DetectionPeriod1 = roiData.P1, + DetectionPeriod2 = roiData.P2, + RoiParams = roiData.GetRoiParams() + }; + roiParams.FromDbEntity(cmpnt.Name, LoadedProcedure); + } + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/ProcedureDlg.pl.resx b/TBF_V2/Sources/TBF/TBF/ProcedureDlg.pl.resx new file mode 100644 index 00000000..97bdb472 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/ProcedureDlg.pl.resx @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Licznik ciepła + + + Nazwa protokołu + + + Sprzężony + + + Pojedynczy + + + Usunąć - Koniec + + + Usunąć - Start + + + Zapis wyników + + + Drukarki + + + Wprowadzenie danych + + + Uwagi + + + Typy testowanych liczników + + + Data + + + Ostatnia zmiana + + + Data + + + Utworzono + + + Krótki opis + + + Nazwa procedury + + + Wprowadzenie + + + Historia zmian + + + Metrologia I + + + Merologia II + + + Czynność + + + Parametry + + + Procedura + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/ProcedureDlg.resx b/TBF_V2/Sources/TBF/TBF/ProcedureDlg.resx new file mode 100644 index 00000000..5b88076a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/ProcedureDlg.resx @@ -0,0 +1,1569 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + Fill + + + + True + + + + 0, 0 + + + 676, 128 + + + 34, 20 + + + 19 + + + False + + + altProcPeriodTextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 0 + + + True + + + NoControl + + + 542, 131 + + + 116, 13 + + + 18 + + + Alternative proc. period + + + False + + + altProcPeriodLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 1 + + + 188, 128 + + + 217, 20 + + + 17 + + + False + + + altProcNameTextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 2 + + + True + + + NoControl + + + 20, 131 + + + 113, 13 + + + 16 + + + Alternative proc. name + + + False + + + altProcNameLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 3 + + + True + + + NoControl + + + 545, 197 + + + 138, 17 + + + 39 + + + Manual control disabled + + + manualControlDisabledCheckBox + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 4 + + + True + + + NoControl + + + 545, 176 + + + 152, 17 + + + 38 + + + All tests must be competed + + + mustBeCompleteCheckBox + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 5 + + + True + + + NoControl + + + 545, 155 + + + 123, 17 + + + 37 + + + Protected procedure + + + protectedCheckBox + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 6 + + + True + + + NoControl + + + 396, 196 + + + 77, 17 + + + 36 + + + Heat meter + + + metersKindRadioButton3 + + + System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 7 + + + 188, 336 + + + 121, 21 + + + 33 + + + fileWriter4ComboBox + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 8 + + + 188, 312 + + + 121, 21 + + + 32 + + + fileWriter3ComboBox + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 9 + + + 188, 243 + + + 121, 21 + + + 28 + + + printer2ComboBox + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 10 + + + 188, 289 + + + 121, 21 + + + 31 + + + fileWriter2ComboBox + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 11 + + + True + + + NoControl + + + 396, 175 + + + 72, 17 + + + 35 + + + Combined + + + metersKindRadioButton2 + + + System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 12 + + + True + + + NoControl + + + 396, 154 + + + 54, 17 + + + 34 + + + Single + + + metersKindRadioButton1 + + + System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 13 + + + 188, 197 + + + 121, 21 + + + 25 + + + transitionEndComboBox + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 14 + + + True + + + NoControl + + + 20, 202 + + + 63, 13 + + + 24 + + + Purge - End + + + transitionEndLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 15 + + + 188, 174 + + + 121, 21 + + + 23 + + + transitionStartComboBox + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 16 + + + True + + + NoControl + + + 20, 177 + + + 71, 13 + + + 22 + + + Purge - Begin + + + transitionStartLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 17 + + + 188, 266 + + + 121, 21 + + + 30 + + + fileWriter1ComboBox + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 18 + + + 188, 220 + + + 121, 21 + + + 27 + + + printer1ComboBox + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 19 + + + 188, 151 + + + 121, 21 + + + 21 + + + dataEntryComboBox + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 20 + + + True + + + NoControl + + + 20, 271 + + + 70, 13 + + + 29 + + + Results writer + + + resultsWriterLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 21 + + + True + + + NoControl + + + 20, 225 + + + 42, 13 + + + 26 + + + Printers + + + resultsPrinterLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 22 + + + True + + + NoControl + + + 21, 154 + + + 57, 13 + + + 20 + + + Data Entry + + + dataEntryLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 23 + + + 393, 243 + + + True + + + 317, 113 + + + 41 + + + notesTextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 24 + + + True + + + NoControl + + + 331, 243 + + + 35, 13 + + + 40 + + + Notes + + + label18 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 25 + + + 188, 105 + + + 522, 20 + + + 13 + + + watermetersTextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 26 + + + True + + + NoControl + + + 20, 108 + + + 94, 13 + + + 12 + + + Meter types tested + + + watermetersLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 27 + + + 402, 82 + + + 150, 20 + + + 11 + + + lastChangedOnTextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 28 + + + True + + + NoControl + + + 340, 85 + + + 30, 13 + + + 10 + + + Date + + + label15 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 29 + + + 188, 82 + + + 121, 20 + + + 9 + + + lastChangedByTextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 30 + + + True + + + NoControl + + + 20, 85 + + + 86, 13 + + + 8 + + + Last changed by + + + label16 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 31 + + + 402, 59 + + + 150, 20 + + + 7 + + + createdOnTextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 32 + + + True + + + NoControl + + + 340, 62 + + + 30, 13 + + + 6 + + + Date + + + label14 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 33 + + + 188, 59 + + + 121, 20 + + + 5 + + + createdByTextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 34 + + + True + + + NoControl + + + 20, 62 + + + 58, 13 + + + 4 + + + Created by + + + label13 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 35 + + + 188, 36 + + + 522, 20 + + + 3 + + + descriptionTextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 36 + + + True + + + NoControl + + + 20, 39 + + + 86, 13 + + + 2 + + + Short description + + + label12 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 37 + + + 188, 13 + + + 217, 20 + + + 1 + + + procNameTextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 38 + + + True + + + NoControl + + + 20, 16 + + + 85, 13 + + + 0 + + + Procedure name + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generalTabPage + + + 39 + + + 4, 34 + + + 3, 3, 3, 3 + + + 923, 366 + + + 0 + + + General + + + generalTabPage + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl + + + 0 + + + Fill + + + 3, 3 + + + 917, 360 + + + 0 + + + historyListViewEx + + + Results.Forms.ListViewEx, Results, Version=2.18.893.0, Culture=neutral, PublicKeyToken=null + + + historyTabPage + + + 0 + + + 4, 34 + + + 3, 3, 3, 3 + + + 923, 366 + + + 1 + + + History of Changes + + + historyTabPage + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl + + + 1 + + + Fill + + + 3, 3 + + + 917, 360 + + + 0 + + + metrology1ListViewEx + + + Results.Forms.ListViewEx, Results, Version=2.18.893.0, Culture=neutral, PublicKeyToken=null + + + metrology1TabPage + + + 0 + + + 4, 34 + + + 3, 3, 3, 3 + + + 923, 366 + + + 2 + + + Metrology I. + + + metrology1TabPage + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl + + + 2 + + + Fill + + + 3, 3 + + + 917, 360 + + + 0 + + + metrology2ListViewEx + + + Results.Forms.ListViewEx, Results, Version=2.18.893.0, Culture=neutral, PublicKeyToken=null + + + metrology2TabPage + + + 0 + + + 4, 34 + + + 3, 3, 3, 3 + + + 923, 366 + + + 3 + + + Metrology II. + + + metrology2TabPage + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl + + + 3 + + + Fill + + + 3, 3 + + + 917, 360 + + + 0 + + + processListViewEx + + + Results.Forms.ListViewEx, Results, Version=2.18.893.0, Culture=neutral, PublicKeyToken=null + + + processTabPage + + + 0 + + + 4, 34 + + + 3, 3, 3, 3 + + + 923, 366 + + + 4 + + + Process + + + processTabPage + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl + + + 4 + + + Fill + + + 0, 0 + + + 923, 366 + + + 0 + + + parametersListViewEx + + + Results.Forms.ListViewEx, Results, Version=2.18.893.0, Culture=neutral, PublicKeyToken=null + + + parametersTabPage + + + 0 + + + 4, 34 + + + 923, 366 + + + 5 + + + Parameters + + + parametersTabPage + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl + + + 5 + + + Fill + + + 58, 30 + + + 0, 0 + + + 931, 404 + + + 0 + + + tabControl + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + mainSplitContainer.Panel1 + + + 0 + + + mainSplitContainer.Panel1 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + mainSplitContainer + + + 0 + + + -1, 0 + + + 100, 400 + + + 0 + + + sharedButtons + + + TBF.UiControls.SharedButtons, TBF, Version=2.18.901.0, Culture=neutral, PublicKeyToken=null + + + mainSplitContainer.Panel2 + + + 0 + + + mainSplitContainer.Panel2 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + mainSplitContainer + + + 1 + + + 1034, 404 + + + 931 + + + 1 + + + mainSplitContainer + + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + + + 6, 13 + + + 1034, 404 + + + CenterParent + + + Procedure + + + ProcedureDlg + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/ProcedureDlg.ru.resx b/TBF_V2/Sources/TBF/TBF/ProcedureDlg.ru.resx new file mode 100644 index 00000000..6fba1783 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/ProcedureDlg.ru.resx @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Теплосчетчик + + + Название протокола + + + Комбинированный + + + Единый + + + Очистка - Конец + + + Очистка - Начало + + + Запись результатов + + + Принтеры + + + Ввод данных + + + Заметки + + + Типы испытываемых счетчиков + + + Дата + + + Изменено + + + Дата + + + Создано + + + Краткое описание + + + Наименование процедуры + + + Основные + + + История изменений + + + Метрология I. + + + Метрология II. + + + Процесс + + + Параметры + + + Процедура + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/ProceduresDlg.Designer.cs b/TBF_V2/Sources/TBF/TBF/ProceduresDlg.Designer.cs new file mode 100644 index 00000000..1c940267 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/ProceduresDlg.Designer.cs @@ -0,0 +1,107 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF +{ + partial class ProceduresDlg + { + /// + /// 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() + { + this.splitContainer = new System.Windows.Forms.SplitContainer(); + this.proceduresCtrl = new TBF.UiControls.ProceduresCtrl(); + this.sharedButtons = new TBF.UiControls.SharedButtons(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit(); + this.splitContainer.Panel1.SuspendLayout(); + this.splitContainer.Panel2.SuspendLayout(); + this.splitContainer.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer + // + this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.splitContainer.Location = new System.Drawing.Point(0, 0); + this.splitContainer.Name = "splitContainer"; + // + // splitContainer.Panel1 + // + this.splitContainer.Panel1.Controls.Add(this.proceduresCtrl); + // + // splitContainer.Panel2 + // + this.splitContainer.Panel2.Controls.Add(this.sharedButtons); + this.splitContainer.Size = new System.Drawing.Size(517, 402); + this.splitContainer.SplitterDistance = 412; + this.splitContainer.TabIndex = 0; + // + // proceduresCtrl + // + this.proceduresCtrl.Dock = System.Windows.Forms.DockStyle.Fill; + this.proceduresCtrl.DoubleClickActivation = false; + this.proceduresCtrl.FullRowSelect = true; + this.proceduresCtrl.GridLines = true; + this.proceduresCtrl.Location = new System.Drawing.Point(0, 0); + this.proceduresCtrl.Name = "proceduresCtrl"; + this.proceduresCtrl.Size = new System.Drawing.Size(412, 402); + this.proceduresCtrl.TabIndex = 0; + this.proceduresCtrl.UseCompatibleStateImageBehavior = false; + this.proceduresCtrl.View = System.Windows.Forms.View.Details; + this.proceduresCtrl.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.proceduresCtrl_MouseDoubleClick); + // + // sharedButtons + // + this.sharedButtons.Location = new System.Drawing.Point(1, 0); + this.sharedButtons.Name = "sharedButtons"; + this.sharedButtons.Size = new System.Drawing.Size(100, 649); + this.sharedButtons.TabIndex = 0; + // + // ProceduresDlg + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(517, 402); + this.Controls.Add(this.splitContainer); + this.Name = "ProceduresDlg"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "ProceduresDlg"; + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.ProceduresDlg_FormClosed); + this.Load += new System.EventHandler(this.ProceduresDlg_Load); + this.splitContainer.Panel1.ResumeLayout(false); + this.splitContainer.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit(); + this.splitContainer.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer splitContainer; + private UiControls.SharedButtons sharedButtons; + private UiControls.ProceduresCtrl proceduresCtrl; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/ProceduresDlg.cs b/TBF_V2/Sources/TBF/TBF/ProceduresDlg.cs new file mode 100644 index 00000000..a2c4ac3e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/ProceduresDlg.cs @@ -0,0 +1,246 @@ +/// +/// Copyright (c) 2013-2017 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using log4net; +using TBF.Resources; +using TBF.UiControls; + +namespace TBF +{ + public partial class ProceduresDlg : Form + { + static readonly ILog log = LogManager.GetLogger(typeof(ProceduresDlg)); + + /// Used when re-scaling the dialog: 100% = 96dpi, 125% = 120dpi, 150% = 144dpi + public readonly int Dpi; + public const int Dpi100pct = 96; + + public ProceduresDlg() + { + /// Detect display setting: 100% = 96dpi, 125% = 120dpi, 150% = 144dpi. + Dpi = (int)this.CreateGraphics().DpiX; + + InitializeComponent(); + + /// SharedDlgButtons configuration + sharedButtons.RequiredGroupMembership = Users.Grp.GID.TestingSpecialists; + sharedButtons.OptionalButtons = SharedButtons.Buttons.Add | SharedButtons.Buttons.Remove | + SharedButtons.Buttons.Up | SharedButtons.Buttons.Down | + SharedButtons.Buttons.Edit | SharedButtons.Buttons.Copy | + SharedButtons.Buttons.Export | SharedButtons.Buttons.Import | + SharedButtons.Buttons.Compare; + + sharedButtons.Unlocked += Unlocked; + sharedButtons.OKClicked += okButton_Click; + sharedButtons.CancelClicked += cancelButton_Click; + sharedButtons.AddClicked += addButton_Click; + sharedButtons.RemoveClicked += removeButton_Click; + sharedButtons.UpClicked += upButton_Click; + sharedButtons.DownClicked += downButton_Click; + sharedButtons.EditClicked += proceduresCtrl.editButton_Click; + sharedButtons.CopyClicked += proceduresCtrl.copyButton_Click; + sharedButtons.ExportClicked += proceduresCtrl.exportButton_Click; + sharedButtons.ImportClicked += proceduresCtrl.importButton_Click; + sharedButtons.CompareClicked += proceduresCtrl.compareButton_Click; + } + + private void ProceduresDlg_Load(object sender, EventArgs e) + { + TBF.LocalSettings ls = Program.LocalSettings; + Width = (ls.ProceduresDlgWidth > 0) ? ls.ProceduresDlgWidth : 600; + Height = (ls.ProceduresDlgHeight > 0) ? ls.ProceduresDlgHeight : 500; + Left = (ls.ProceduresDlgLeft != 0) ? ls.ProceduresDlgLeft : 200; + Top = (ls.ProceduresDlgTop != 0) ? ls.ProceduresDlgTop : 100; + + Text = Strings.Procedures; + proceduresCtrl.Initialize(this, splitContainer.Panel1); + } + + /// + /// Called from ProceduresCtrl when item editing is completed with OK. + /// Authorisation occurs in the editted ProcedureDlg dialog. + /// + public void Unlock() + { + sharedButtons.UnlockButtons(); + proceduresCtrl.Unlock(); + } + + /// + /// Called from sharedButtons when user clicks 'Unlock' button an is authorised. + /// + private void Unlocked(object sender, EventArgs e) + { + proceduresCtrl.Unlock(); + } + + /// + /// "OK" button and Windows 'x' buttom functions similarly r + /// + /// + /// + private void okButton_Click(object sender, EventArgs e) + { + ProceduresDlg_FormClosed(sender, null); + + DialogResult = DialogResult.OK; + Close(); + } + + /// + /// Windows 'x' buttom functions similarly r + /// + /// + /// + private void ProceduresDlg_FormClosed(object sender, FormClosedEventArgs e) + { + proceduresCtrl.OkBtnClicked(); + + Program.LocalSettings.ProceduresDlgLeft = Location.X; + Program.LocalSettings.ProceduresDlgTop = Location.Y; + Program.LocalSettings.ProceduresDlgWidth = Size.Width; + Program.LocalSettings.ProceduresDlgHeight = Size.Height; + Program.LocalSettings.Save(); + } + + private void cancelButton_Click(object sender, EventArgs e) + { + proceduresCtrl.CancelBtnClicked(); + + Program.LocalSettings.ProceduresDlgLeft = Location.X; + Program.LocalSettings.ProceduresDlgTop = Location.Y; + Program.LocalSettings.ProceduresDlgWidth = Size.Width; + Program.LocalSettings.ProceduresDlgHeight = Size.Height; + Program.LocalSettings.Save(); + + DialogResult = DialogResult.Cancel; + Close(); + } + + private void addButton_Click(object sender, EventArgs e) + { + proceduresCtrl.AddOne(); + } + + private void removeButton_Click(object sender, EventArgs e) + { + proceduresCtrl.RemoveSelected(); + } + + private void upButton_Click(object sender, EventArgs e) + { + proceduresCtrl.MoveUpSelected(); + } + + private void downButton_Click(object sender, EventArgs e) + { + //if (DialogResult.Yes == MessageBox.Show("Chcete naplnit 'Publish' a 'Evaluate' vsetkych testov?", "Otazka", MessageBoxButtons.YesNo, MessageBoxIcon.Question)) + //{ + // UpgradeAllTests(); + // return; + //} + proceduresCtrl.MoveDownSelected(); + } + + private void proceduresCtrl_MouseDoubleClick(object sender, MouseEventArgs e) + { + proceduresCtrl.editButton_Click(sender, e); + } + + /// + /// Common part for three xxxListViewEx_SelectedIndexChanged event handlers + /// + /// + void SelectedIndexChanged(object sender, EventArgs e) + { + Results.Forms.ListViewEx listViewEx = sender as Results.Forms.ListViewEx; + if (listViewEx.SelectedItems.Count != 1) + { + /// No item selected + sharedButtons.DisableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up | SharedButtons.Buttons.Down); + } + else if (listViewEx.Items.Count == 1) + { + /// One (the first and the last) item selected + sharedButtons.EnableButtons(SharedButtons.Buttons.Remove); + sharedButtons.DisableButtons(SharedButtons.Buttons.Up | SharedButtons.Buttons.Down); + } + else if (listViewEx.SelectedIndices[0] == 0) + { + /// The first of many items selected + sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Down); + sharedButtons.DisableButtons(SharedButtons.Buttons.Up); + } + else if (listViewEx.SelectedIndices[0] == (listViewEx.Items.Count - 1)) + { + /// The last of many items selected + sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up); + sharedButtons.DisableButtons(SharedButtons.Buttons.Down); + } + else + { + /// One of middle items selected + sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up | SharedButtons.Buttons.Down); + } + } + + public void UpdateButtonStates(SharedButtons.SelectedItemPos selectedItemPos) + { + if (selectedItemPos == SharedButtons.SelectedItemPos.None) + { + sharedButtons.DisableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up | SharedButtons.Buttons.Down); + } + } + + private void UpgradeAllTests() + { + NHibernate.ISession session = Config.FluentCommon.CreateSession(Users.Entities.DBKind.Config); + + IList procedures = session.QueryOver() + .OrderBy(x => x.ItemNr).Asc + .List(); + + ///IList components = TBF.BenchControl.TbfComponents.LoadComponentsFromDB(session); + /// + int successful = 0; + int failed = 0; + string lastMsg = string.Empty; + + int N = procedures.Count; + for (int i = 0; i < N; i++) + { + Config.Entities.Procedure proc = procedures[i]; + Text = string.Format("{0} ({1}/{2})", proc.Name, i+1, N); + + //TBF.BenchControl.Generic.IComponent component = TBF.BenchControl.TbfComponents.FindComponent() + + NHibernate.ITransaction transaction = session.BeginTransaction(); + + try + { + IList tests = session.QueryOver() + .Where(x => (x.Procedure == proc)) + .OrderBy(x => x.ItemNr).Desc + .List(); + + + transaction.Commit(); + + successful++; + } + catch (Exception exc) + { + transaction.Rollback(); + lastMsg = exc.Message; + failed++; + } + } + + MessageBox.Show(string.Format("Successful: {0}, Failed: {1}\r\nMessage: {2}", successful, failed, lastMsg), "Result", + MessageBoxButtons.OK, (failed > 0) ? MessageBoxIcon.Error : MessageBoxIcon.Information); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/ProceduresDlg.resx b/TBF_V2/Sources/TBF/TBF/ProceduresDlg.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/ProceduresDlg.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Program.cs b/TBF_V2/Sources/TBF/TBF/Program.cs new file mode 100644 index 00000000..f22fe1cd --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Program.cs @@ -0,0 +1,450 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.IO; +using System.Collections.Generic; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using Users; +using TBF.Resources; +using TBF.Forms; + +namespace TBF +{ + public class Program + { + public const string HomeDir = "C:\\Tbf\\"; /// Contains subdirectories Results, Logs, Images, ... + public const string GraphsDir = "C:\\Tbf\\Graphs\\"; + public const string ImagesDir = "C:\\Tbf\\Images\\"; + public const string TempImagesDir = "C:\\Tbf\\Images\\Temp\\"; + + /// log4net + static ILog log; + const string log4netConfigFName = "log4netConfig.xml"; + + /// Program information + public static string Version; /// version string + public static DateTime BuildDateTime; /// date and time of program build + + /// Local settings + public static LocalSettings LocalSettings; + public const string LocalSettingsFileName = "config.xml"; + public const string LocalSettingsBackupName = "config.backup.xml"; + + public static System.Globalization.CultureInfo AltCulture; + + /// + /// Selected procedure data + /// - before the main program window is open, objects referenced by this variable + /// are loaded from the database. + /// - user interface displays data stored in objects referenced by this variable. + /// When user modifies procedure settings and confirms changes (choses to save them), + /// data referenced by this variable are updated and written to the database. + /// - when users starts a test procedure, state machine creates its own copy + /// of procedure data and uses them for the test. Changes of 'SelectedProcedure' + /// done during the test do not have any influence on the currently running test. + /// + public static Config.Entities.Procedure SelectedProcedure = null; + + /// + /// Main window object. + /// + public static MainWnd MainWnd; + + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler); + + /// Program version string + System.Reflection.Assembly thisAssembly = System.Reflection.Assembly.GetExecutingAssembly(); + Version ver = thisAssembly.GetName().Version; + Version = string.Format("{0}.{1}.{2}", ver.Major, ver.Minor, ver.Build); + BuildDateTime = new System.IO.FileInfo(thisAssembly.Location).LastWriteTime; + + /// Local program configuration directory including the trailing backslash + string locAppDataDir = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + + Path.DirectorySeparatorChar + "TestBenchFramework" + Path.DirectorySeparatorChar; + + /// Check whether local application data directory exists. + /// If not, create it and copy the initial configuration to this directory. + /// This is done only once after a clean program installation on the first program start-up + try + { + if (!Directory.Exists(locAppDataDir)) + { + Directory.CreateDirectory(locAppDataDir); + Environment.CurrentDirectory = locAppDataDir; + + string sampleConfig = Application.StartupPath + Path.DirectorySeparatorChar + "SampleConfig" + Path.DirectorySeparatorChar; + if (File.Exists(sampleConfig + LocalSettingsFileName)) { File.Copy(sampleConfig + LocalSettingsFileName, LocalSettingsFileName); } + if (File.Exists(sampleConfig + log4netConfigFName)) { File.Copy(sampleConfig + log4netConfigFName, log4netConfigFName); } + if (File.Exists(sampleConfig + Config.Data.SQLiteDbFName)) { File.Copy(sampleConfig + Config.Data.SQLiteDbFName, Config.Data.SQLiteDbFName); } + + File.SetAttributes(LocalSettingsFileName, FileAttributes.Normal); + File.SetAttributes(log4netConfigFName, FileAttributes.Normal); + File.SetAttributes(Config.Data.SQLiteDbFName, FileAttributes.Normal); + } + else + { + Environment.CurrentDirectory = locAppDataDir; + } + + if (!Directory.Exists(ImagesDir)) Directory.CreateDirectory(ImagesDir); + if (!Directory.Exists(TempImagesDir)) Directory.CreateDirectory(TempImagesDir); + + IEnumerable files = Directory.EnumerateFiles(TempImagesDir); /// TODO: Implement recursive directory delete + foreach (var file in files) File.Delete(file); + } + catch (Exception e) + { + log.Error("Fatal error when creating a local application data directory and preparing an initial configuration", e); + MessageBox.Show("Error creating a local application data directory and preparing an initial configuration", "Fatal error"); + return; /// Fatal error + } + + /// Configure and start logging + log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(locAppDataDir + log4netConfigFName)); + log = LogManager.GetLogger(typeof(Program)); + log.Fatal("--------------------------------------------------------------------------------"); + log.Fatal(string.Format("TBF ver.{0}", Version)); + + /// + /// Load the local settings + /// + Program.LocalSettings = LocalSettings.Load(Program.LocalSettingsFileName); + if (Program.LocalSettings == null || Program.LocalSettings.TestBenches == null) + { + /// Loading local seetings from regular config file failed. Use the backup + Program.LocalSettings = LocalSettings.Load(Program.LocalSettingsBackupName); + if (Program.LocalSettings == null || Program.LocalSettings.TestBenches == null) + { + log.FatalFormat("Local settings: Could not load file {0}, nor {1}.", Program.LocalSettingsFileName, Program.LocalSettingsBackupName); + log.Fatal("Application terminated."); + MessageBox.Show(string.Format("Could not load file {0}, nor {1}.", Program.LocalSettingsFileName, Program.LocalSettingsBackupName), "Fatal error"); + return; /// Fatal error + } + else + { + LocalSettings.Save(); /// Save the settings to overwrite the wrong file + log.FatalFormat("Local settings: Could not load file {0}, successfully loaded {1}", Program.LocalSettingsFileName, Program.LocalSettingsBackupName); + log.FatalFormat("BatchNr = {0}", LocalSettings.BatchNr); + } + } + else + { + /// Loading local seetings from the regular config file was successful. Update the backup + File.Copy(Program.LocalSettingsFileName, Program.LocalSettingsBackupName, true); + log.FatalFormat("Local settings: Successfully loaded from {0}", Program.LocalSettingsFileName); + log.FatalFormat("BatchNr = {0}", LocalSettings.BatchNr); + } + + + try + { + string culture = LocalSettings.Language.Replace('_', '-'); + System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(culture); + } + catch (Exception e) + { + string msg = e.Message; + MessageBox.Show("Selected language not supported.\nUsing English.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); + System.Threading.Thread.CurrentThread.CurrentUICulture = + new System.Globalization.CultureInfo("en"); + } + + //AltCulture = null; + AltCulture = new System.Globalization.CultureInfo("SK"); + + + /// This belongs to Application.Run(new MainWnd()) ... + /// and should be executed before opening 'loginDlg' + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + + + /// Ensure that there is at least one bench in the configuration + while (Program.LocalSettings.BenchesCount == 0) + { + log.Warn("No test benches in the local configuration -> display an appropriate dialog."); + + /// Ask what to do, ask for the password, open 'DatabaseSetingsDlg' and continue on OK + if ((new Forms.NoBenchOrDatabaseDlg { Message = Strings.NoBenchMsg }.ShowDialog() != DialogResult.OK) || + (new Users.Forms.LoginDlg(true).ShowDialog() == DialogResult.Cancel) || + (new BenchesDlg().ShowDialog() == DialogResult.Cancel)) + { + return; /// Exit program + } + + log.Warn("Loading the local settings again."); + Program.LocalSettings = LocalSettings.Load(Program.LocalSettingsFileName); + if (Program.LocalSettings == null) return; /// Fatal error + } + + /// User login + bool retryLogin = true; /// true = stay in a login loop + do + { + LoginDlgWithBenchSelection loginDlgBench; + if (LocalSettings.LastBenchName != null) + { + loginDlgBench = new LoginDlgWithBenchSelection(LocalSettings.LastBenchName); + } + else + { + loginDlgBench = new LoginDlgWithBenchSelection(); + } + loginDlgBench.Method = LocalSettings.LoginMethod; + DialogResult dr = loginDlgBench.ShowDialog(); + + if (dr == DialogResult.Cancel) + { + return; /// Login canceled --> Exit application + } + else + { + for (int i = 0; i < LocalSettings.BenchesCount; i++) + { + if (LocalSettings.TestBenches[i].BenchName == loginDlgBench.BenchName) + { + log.FatalFormat("Test bench name: {0}", loginDlgBench.BenchName); + + GlobalData.RemoteUsersDB = LocalSettings.TestBenches[i].UsersDBSettings; + GlobalData.LocalUsersDB = LocalSettings.TestBenches[i].ProceduresDBSettings; + + Users.Entities.User loadedUser = null; + try + { + bool authorized = false; + Users.Entities.AuthorizedAs authorizedAs = Users.Entities.AuthorizedAs.PowerUser; + + if (Users.Entities.User.IsPowerUser(loginDlgBench.Alias, loginDlgBench.Password)) + { + loadedUser = new Users.Entities.User(loginDlgBench.Alias, 6, true); + authorized = loadedUser.Authorize(loginDlgBench.Alias, loginDlgBench.Password); + if (authorized) + GlobalData.AuthorizedAs = Users.Entities.AuthorizedAs.PowerUser; + } + + /// + /// Authorisation using databases + /// + if (!authorized) + { + DBSettings[] dbs = new DBSettings[] { GlobalData.RemoteUsersDB, GlobalData.LocalUsersDB }; + + authorizedAs = Users.Entities.AuthorizedAs.RemoteUser; /// Try remote DB first + + foreach (var db in dbs) + { + /// Load and authorise user from the UsersDB database + try + { + Grp.GID requiredGroupMembership = Grp.GID.None; +#if TURA_IPERL || TURA_SPECIAL + requiredGroupMembership = Grp.GID.Testers; +#endif + if (loginDlgBench.Password == LoginDlgWithBenchSelection.UseTheTagPassword) + { + loadedUser = Users.Entities.User.LoadUserByTag(loginDlgBench.Alias, db); + if (loadedUser != null) authorized = loadedUser.AuthorizeTag(loginDlgBench.Alias, requiredGroupMembership); + } + else + { + switch (loginDlgBench.Method) + { + default: + case Users.Entities.LoginMethod.UserName: + loadedUser = Users.Entities.User.LoadUserByName(loginDlgBench.Alias, db); + if (loadedUser != null) authorized = loadedUser.Authorize(loginDlgBench.Alias, loginDlgBench.Password, requiredGroupMembership); + break; + case Users.Entities.LoginMethod.FullName: + loadedUser = Users.Entities.User.LoadUserByFullName(loginDlgBench.Alias, db); + if (loadedUser != null) authorized = loadedUser.AuthorizeFullName(loginDlgBench.Alias, loginDlgBench.Password, requiredGroupMembership); + break; + case Users.Entities.LoginMethod.Number: + int number; + if (!int.TryParse(loginDlgBench.Alias, out number)) break; + loadedUser = Users.Entities.User.LoadUserByNumber(number, db); + if (loadedUser != null) authorized = loadedUser.AuthorizeNumber(number, loginDlgBench.Password, requiredGroupMembership); + break; + } + } + } + catch + { + authorized = false; + } + + if (authorized) break; + + authorizedAs = Users.Entities.AuthorizedAs.LocalUser; /// Try local DB afterwards + } + } + + if (authorized) + { + loadedUser.SetLegalizator(loginDlgBench.Legalizator); + Users.GlobalData.AuthorizedAs = authorizedAs; + + LocalSettings.LoginMethod = loginDlgBench.Method; /// Save the login method actually used + + if (LocalSettings.TestBenches[i].IsRealBench) + { + /// This is a real bench ==> check if another instance is running + string processName = System.IO.Path.GetFileNameWithoutExtension(thisAssembly.Location); + if (System.Diagnostics.Process.GetProcessesByName(processName).Length > 1) + { + MessageBox.Show(Strings.Another_instance_is_running, Strings.Error, MessageBoxButtons.OK, MessageBoxIcon.Asterisk); + return; + } + } + + log.InfoFormat("Password accepted, bench '{0}' parameters loaded.", + LocalSettings.TestBenches[i].BenchName); + + /// Copy the selected bench settings to CurrentBench. + /// Clone() guarantees that current bench settings wont be modified + /// when user modifies the database settings in DatabaseSettingsDlg. + Config.Data.CurrentBench = (Config.DatabaseSettings)LocalSettings.TestBenches[i].Clone(); + + /// Save the selection to local settings + LocalSettings.LastBenchName = Config.Data.CurrentBench.BenchName; + + Results.DB.DbType = Config.Data.CurrentBench.WaterMetersDBSettings.DbType; + Results.DB.ConnectionString = Config.Data.CurrentBench.WaterMetersDBSettings.ConnectionString; + Results.DB.LoadSharedData(); + int maxBatchNr = Results.DB.GetMaxSavedBatchNr(); + if (!Config.Data.CurrentBench.IsRealBench || Program.LocalSettings.BatchNr <= maxBatchNr) + { + log.FatalFormat("Max. BatchNr in DB = {0}, LocalSettings.BatchNr = {1}", maxBatchNr, Program.LocalSettings.BatchNr); + Program.LocalSettings.BatchNr = maxBatchNr + 1; + Program.LocalSettings.Save(); + log.FatalFormat("LocalSettings.BatchNr updated to {0}", Program.LocalSettings.BatchNr); + } + + /// This is to trigger an exception in case of a power user and no Config database + IList listOfProcedures = Config.FluentCommon.CreateSession(Users.Entities.DBKind.Config) + .QueryOver() + .Where(x => (x.ProcedureState == ProcedureState.Active)) + .And(x => (x.Name == LocalSettings.LastProcedureName)) + .List(); + + retryLogin = false; + break; + } + + if (retryLogin) + { + /// Close Fluent NHibernate + MessageBox.Show(Strings.Invalid_user_password_or_bench, Strings.Error, MessageBoxButtons.OK); + } + } + catch (Exception exc) + { + /// Database connect failed, create a log + log.FatalFormat("Connection to database failed: {0}", exc.Message); + if (exc.InnerException != null && !string.IsNullOrEmpty(exc.InnerException.Message)) + { + log.FatalFormat("Inner exception: {0}", exc.InnerException.Message); + } + + /// Ask what to do + switch ((new Forms.NoBenchOrDatabaseDlg { Message = Strings.NoDatabaseMsg, ShowRetry = true }).ShowDialog()) + { + case DialogResult.Abort: + return; /// Exit program + + case DialogResult.Retry: + break; /// Retry connection to the database, stay inside the loop + + case DialogResult.Yes: + new UpgradeSelectionDlg().ShowDialog(); + break; /// Stay inside the loop + + default: + /// Open 'DatabaseSetingsDlg' and retry DB connect on OK + if (new Users.Forms.LoginDlg(true).ShowDialog() == DialogResult.Cancel || + new BenchesDlg().ShowDialog() == DialogResult.Cancel) + { + return; /// Exit program + } + if (Program.LocalSettings == null) + return; /// Fatal error -> Exit program + else + break; /// Stay inside the loop + } + } + } // if benchname is OK + } // for all benches in local settings loop + } // not Canceled + } //do + while (retryLogin); + + /// + /// Load the last procedure or create a new, default one + /// + if (LocalSettings.LastProcedureName != null) + { + IList listOfProcedures = Config.FluentCommon.CreateSession(Users.Entities.DBKind.Config) + .QueryOver() + .Where(x => (x.ProcedureState == ProcedureState.Active)) + .And(x => (x.Name == LocalSettings.LastProcedureName)) + .List(); + + if (listOfProcedures.Count == 1) + { + log.InfoFormat("Pre-selecting the procedure {0}", LocalSettings.LastProcedureName); + SelectedProcedure = listOfProcedures[0]; + } + } + + try + { + /// Open the main application window + log.Info("Creating the main window"); + MainWnd = new MainWnd(); + log.Info("Opening the main window"); + Application.Run(MainWnd); + log.Info("The main window was closed"); + } + catch (Exception e) + { + LogException(log, "Exception in Application.Run(MainWnd)", e); + } + finally + { + /// Save local settings + LocalSettings.Save(); + } + + /// Close Fluent NHibernate + /// Todo + + log.Info("Exiting application."); + } + + static void MyHandler(object sender, UnhandledExceptionEventArgs args) + { + LogException(log, "Unhandled exception", (Exception)args.ExceptionObject); + } + + static void LogException(ILog log, string description, Exception e) + { + log.FatalFormat("---------------( {0} )---------------", description); + log.FatalFormat("Message : {0}", e.Message); + if (e.InnerException != null) + { + log.FatalFormat("InnerMessage : {0}", e.InnerException.Message); + } + log.FatalFormat("StackTrace : {0}{1}", Environment.NewLine, e.StackTrace); + log.Fatal("--------------------------------------"); + } + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Properties/AssemblyInfo.cs b/TBF_V2/Sources/TBF/TBF/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..0f3239dc --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("TestBenchFramework")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Sensus")] +[assembly: AssemblyProduct("TestBenchFramework")] +[assembly: AssemblyCopyright("Copyright © 2013 - 2018 Sensus Slovensko, a.s.")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("2c13538e-15ee-48b2-af0f-2c95afb67186")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("2.20.002.0")] +[assembly: AssemblyFileVersion("2.20.002.0")] diff --git a/TBF_V2/Sources/TBF/TBF/Properties/Resources.Designer.cs b/TBF_V2/Sources/TBF/TBF/Properties/Resources.Designer.cs new file mode 100644 index 00000000..7bda78b6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Properties/Resources.Designer.cs @@ -0,0 +1,183 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace TBF.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("TBF.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Empty { + get { + object obj = ResourceManager.GetObject("Empty", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap RoiStyle1 { + get { + object obj = ResourceManager.GetObject("RoiStyle1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap RoiStyle2 { + get { + object obj = ResourceManager.GetObject("RoiStyle2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap RoiStyle3 { + get { + object obj = ResourceManager.GetObject("RoiStyle3", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap sensus_logo { + get { + object obj = ResourceManager.GetObject("sensus_logo", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap SwitchOff { + get { + object obj = ResourceManager.GetObject("SwitchOff", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap SwitchOn { + get { + object obj = ResourceManager.GetObject("SwitchOn", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap TestFailedImage { + get { + object obj = ResourceManager.GetObject("TestFailedImage", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap TestFailedImage2 { + get { + object obj = ResourceManager.GetObject("TestFailedImage2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap TestNotDoneImage { + get { + object obj = ResourceManager.GetObject("TestNotDoneImage", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap TestPassedImage { + get { + object obj = ResourceManager.GetObject("TestPassedImage", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap TestPassedImage2 { + get { + object obj = ResourceManager.GetObject("TestPassedImage2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Properties/Resources.resx b/TBF_V2/Sources/TBF/TBF/Properties/Resources.resx new file mode 100644 index 00000000..af53d686 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Properties/Resources.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + ..\Resources\sensus-logo.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\TestFailedImage.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\TestNotDoneImage.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\TestPassedImage.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\TestFailedImage2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\TestPassedImage2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\RoiStyle1.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\RoiStyle2.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\RoiStyle3.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\empty.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\switch-off.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\switch-on.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Properties/Settings.Designer.cs b/TBF_V2/Sources/TBF/TBF/Properties/Settings.Designer.cs new file mode 100644 index 00000000..088683a2 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.1008 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace TBF.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Properties/Settings.settings b/TBF_V2/Sources/TBF/TBF/Properties/Settings.settings new file mode 100644 index 00000000..39645652 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/TBF_V2/Sources/TBF/TBF/Properties/app.manifest b/TBF_V2/Sources/TBF/TBF/Properties/app.manifest new file mode 100644 index 00000000..42ff09e5 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Properties/app.manifest @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Resources/RoiStyle1.bmp b/TBF_V2/Sources/TBF/TBF/Resources/RoiStyle1.bmp new file mode 100644 index 00000000..5e03cde2 Binary files /dev/null and b/TBF_V2/Sources/TBF/TBF/Resources/RoiStyle1.bmp differ diff --git a/TBF_V2/Sources/TBF/TBF/Resources/RoiStyle2.bmp b/TBF_V2/Sources/TBF/TBF/Resources/RoiStyle2.bmp new file mode 100644 index 00000000..a6df8364 Binary files /dev/null and b/TBF_V2/Sources/TBF/TBF/Resources/RoiStyle2.bmp differ diff --git a/TBF_V2/Sources/TBF/TBF/Resources/RoiStyle3.bmp b/TBF_V2/Sources/TBF/TBF/Resources/RoiStyle3.bmp new file mode 100644 index 00000000..18ae2ed5 Binary files /dev/null and b/TBF_V2/Sources/TBF/TBF/Resources/RoiStyle3.bmp differ diff --git a/TBF_V2/Sources/TBF/TBF/Resources/Strings.Designer.cs b/TBF_V2/Sources/TBF/TBF/Resources/Strings.Designer.cs new file mode 100644 index 00000000..61ba4914 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Resources/Strings.Designer.cs @@ -0,0 +1,5250 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace TBF.Resources { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Strings { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Strings() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("TBF.Resources.Strings", typeof(Strings).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to {0} - close the drain valve. + /// + internal static string _0_close_the_drain_valve { + get { + return ResourceManager.GetString("_0_close_the_drain_valve", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} - open the drain valve. + /// + internal static string _0_open_the_drain_valve { + get { + return ResourceManager.GetString("_0_open_the_drain_valve", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} path '{1}' used by {2} tests will be removed.{3}. + /// + internal static string _0_path_1_used_by_2_tests_will_be_removed_3 { + get { + return ResourceManager.GetString("_0_path_1_used_by_2_tests_will_be_removed_3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} path '{1}' used by {2} tests will be renamed to '{3}'.{4}. + /// + internal static string _0_path_1_used_by_2_tests_will_be_renamed_to_3_4 { + get { + return ResourceManager.GetString("_0_path_1_used_by_2_tests_will_be_renamed_to_3_4", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} - wait until the tank is empty. + /// + internal static string _0_wait_until_the_tank_is_empty { + get { + return ResourceManager.GetString("_0_wait_until_the_tank_is_empty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to <none>. + /// + internal static string _none_ { + get { + return ResourceManager.GetString("_none_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to (offline). + /// + internal static string _offline { + get { + return ResourceManager.GetString("_offline", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Abort. + /// + internal static string Abort { + get { + return ResourceManager.GetString("Abort", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to About Test Bench Framework. + /// + internal static string About_Test_Bench_Framework { + get { + return ResourceManager.GetString("About_Test_Bench_Framework", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Activate / Deactivate Heads. + /// + internal static string Activate_Deactivate_heads { + get { + return ResourceManager.GetString("Activate_Deactivate_heads", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Activity. + /// + internal static string Activity { + get { + return ResourceManager.GetString("Activity", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add >. + /// + internal static string Add { + get { + return ResourceManager.GetString("Add", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add. + /// + internal static string AddBtnText { + get { + return ResourceManager.GetString("AddBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Address. + /// + internal static string Address { + get { + return ResourceManager.GetString("Address", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Adjustment in progress. + /// + internal static string Adjustment_in_progress { + get { + return ResourceManager.GetString("Adjustment_in_progress", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Administrator. + /// + internal static string Administrator { + get { + return ResourceManager.GetString("Administrator", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Air density [kg/m3]. + /// + internal static string Air_density_kg_m3 { + get { + return ResourceManager.GetString("Air_density_kg_m3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Air humidity. + /// + internal static string Air_humidity { + get { + return ResourceManager.GetString("Air_humidity", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Air pressure. + /// + internal static string Air_pressure { + get { + return ResourceManager.GetString("Air_pressure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Air temperature. + /// + internal static string Air_temperature { + get { + return ResourceManager.GetString("Air_temperature", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to All tests must be completed. + /// + internal static string All_tests_must_be_completed { + get { + return ResourceManager.GetString("All_tests_must_be_completed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ambient humidity. + /// + internal static string Ambient_humidity { + get { + return ResourceManager.GetString("Ambient_humidity", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ambient pressure. + /// + internal static string Ambient_pressure { + get { + return ResourceManager.GetString("Ambient_pressure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ambient temperature. + /// + internal static string Ambient_temperature { + get { + return ResourceManager.GetString("Ambient_temperature", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to An unhandled error occured. + /// + internal static string An_unhandled_error_occured { + get { + return ResourceManager.GetString("An_unhandled_error_occured", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Another instance of Test Bench Framework program is running. Please, close it using Task Manager.. + /// + internal static string Another_instance_is_running { + get { + return ResourceManager.GetString("Another_instance_is_running", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Approval. + /// + internal static string Approval { + get { + return ResourceManager.GetString("Approval", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Approval date. + /// + internal static string Approval_date { + get { + return ResourceManager.GetString("Approval_date", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Approval ID. + /// + internal static string Approval_ID { + get { + return ResourceManager.GetString("Approval_ID", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Approval info.. + /// + internal static string Approval_info { + get { + return ResourceManager.GetString("Approval_info", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Approved by. + /// + internal static string Approved_by { + get { + return ResourceManager.GetString("Approved_by", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Arrangements of tested meters. + /// + internal static string Arrangement_of_meters { + get { + return ResourceManager.GetString("Arrangement_of_meters", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Arrangement of tests. + /// + internal static string Arrangement_of_tests { + get { + return ResourceManager.GetString("Arrangement_of_tests", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to At temperature. + /// + internal static string At_temperature { + get { + return ResourceManager.GetString("At_temperature", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Aux. + /// + internal static string Aux { + get { + return ResourceManager.GetString("Aux", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Aux:. + /// + internal static string Aux_ { + get { + return ResourceManager.GetString("Aux_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Aux Water Meter. + /// + internal static string Aux_Water_Meter { + get { + return ResourceManager.GetString("Aux_Water_Meter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Aux. WM State. + /// + internal static string Aux_Water_Meter_State { + get { + return ResourceManager.GetString("Aux_Water_Meter_State", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Aux. WM Serial Nr.. + /// + internal static string Aux_WM_SerialNr { + get { + return ResourceManager.GetString("Aux_WM_SerialNr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Available Components:. + /// + internal static string Available_Components_ { + get { + return ResourceManager.GetString("Available_Components_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Available results:. + /// + internal static string Available_results { + get { + return ResourceManager.GetString("Available_results", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to < Back. + /// + internal static string BackBtnText { + get { + return ResourceManager.GetString("BackBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Scale. + /// + internal static string Balance { + get { + return ResourceManager.GetString("Balance", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Batch. + /// + internal static string Batch { + get { + return ResourceManager.GetString("Batch", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Batch nr.. + /// + internal static string Batch_nr { + get { + return ResourceManager.GetString("Batch_nr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Bench. + /// + internal static string Bench_chdr { + get { + return ResourceManager.GetString("Bench_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test bench is not running, however you can change the settings to resolve the problem.. + /// + internal static string Bench_is_not_running { + get { + return ResourceManager.GetString("Bench_is_not_running", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test bench name conflict, use another name please. + /// + internal static string Bench_name_conflict_Use_another_name_pls { + get { + return ResourceManager.GetString("Bench_name_conflict_Use_another_name_pls", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Bench parameters. + /// + internal static string Bench_parameters { + get { + return ResourceManager.GetString("Bench_parameters", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Bench. + /// + internal static string BenchTabPageTitle { + get { + return ResourceManager.GetString("BenchTabPageTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Build date {0}. + /// + internal static string BuildDateStr { + get { + return ResourceManager.GetString("BuildDateStr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Bypass. + /// + internal static string Bypass { + get { + return ResourceManager.GetString("Bypass", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Calibration. + /// + internal static string Calibration { + get { + return ResourceManager.GetString("Calibration", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Calibration coefficients. + /// + internal static string Calibration_coefficients { + get { + return ResourceManager.GetString("Calibration_coefficients", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Calibration Specialist. + /// + internal static string Calibration_Specialist { + get { + return ResourceManager.GetString("Calibration_Specialist", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Camera. + /// + internal static string Camera { + get { + return ResourceManager.GetString("Camera", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Camera error. + /// + internal static string Camera_error { + get { + return ResourceManager.GetString("Camera_error", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cancel. + /// + internal static string CancelBtnText { + get { + return ResourceManager.GetString("CancelBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cannot connect to the database. + /// + internal static string Cannot_connect_to_the_database { + get { + return ResourceManager.GetString("Cannot_connect_to_the_database", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cannot load bench path. + /// + internal static string Cannot_load_bench_path { + get { + return ResourceManager.GetString("Cannot_load_bench_path", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cannot load feeding path. + /// + internal static string Cannot_load_feeding_path { + get { + return ResourceManager.GetString("Cannot_load_feeding_path", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cannot load output path. + /// + internal static string Cannot_load_output_path { + get { + return ResourceManager.GetString("Cannot_load_output_path", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cannot load sensor path. + /// + internal static string Cannot_load_sensor_path { + get { + return ResourceManager.GetString("Cannot_load_sensor_path", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cannot save changes. + /// + internal static string Cannot_save_changes { + get { + return ResourceManager.GetString("Cannot_save_changes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Certificate. + /// + internal static string Certificate { + get { + return ResourceManager.GetString("Certificate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Changes will be lost. Do you want to proceed?. + /// + internal static string Changes_will_be_lost_Do_you_want_to_proceed { + get { + return ResourceManager.GetString("Changes_will_be_lost_Do_you_want_to_proceed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Channel. + /// + internal static string Channel { + get { + return ResourceManager.GetString("Channel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Checking tank capacity. + /// + internal static string Checking_tank_capacity { + get { + return ResourceManager.GetString("Checking_tank_capacity", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Clear results. + /// + internal static string Clear_results { + get { + return ResourceManager.GetString("Clear_results", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Clear. + /// + internal static string ClearBtnText { + get { + return ResourceManager.GetString("ClearBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Clockwise. + /// + internal static string Clockwise { + get { + return ResourceManager.GetString("Clockwise", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to close. + /// + internal static string close { + get { + return ResourceManager.GetString("close", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Close emptying valve. + /// + internal static string Close_emptying_valve { + get { + return ResourceManager.GetString("Close_emptying_valve", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Close the cover. + /// + internal static string Close_the_cover { + get { + return ResourceManager.GetString("Close_the_cover", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Close. + /// + internal static string CloseBtnText { + get { + return ResourceManager.GetString("CloseBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test Bench Framework program is closing. + /// + internal static string Closing_Test_Bench_Framework { + get { + return ResourceManager.GetString("Closing_Test_Bench_Framework", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Closing the program. + /// + internal static string Closing_the_program { + get { + return ResourceManager.GetString("Closing_the_program", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Closing the tank. + /// + internal static string Closing_the_tank { + get { + return ResourceManager.GetString("Closing_the_tank", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Closing input valve, switching the pump off. + /// + internal static string Closing_valve_Pump_off { + get { + return ResourceManager.GetString("Closing_valve_Pump_off", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Communication. + /// + internal static string Communication { + get { + return ResourceManager.GetString("Communication", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Component. + /// + internal static string Component { + get { + return ResourceManager.GetString("Component", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Component {0} crashed. Results not printed.. + /// + internal static string Component_0_crashed_Results_not_printed { + get { + return ResourceManager.GetString("Component_0_crashed_Results_not_printed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Component {0} crashed. Results not saved.. + /// + internal static string Component_0_crashed_Results_not_saved { + get { + return ResourceManager.GetString("Component_0_crashed_Results_not_saved", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Component class. + /// + internal static string Component_class { + get { + return ResourceManager.GetString("Component_class", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Compound. + /// + internal static string Compound { + get { + return ResourceManager.GetString("Compound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Compound meter {0}. + /// + internal static string Compound_meter_nr { + get { + return ResourceManager.GetString("Compound_meter_nr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Compound meters. + /// + internal static string Compound_meters { + get { + return ResourceManager.GetString("Compound_meters", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Configuration. + /// + internal static string Configuration { + get { + return ResourceManager.GetString("Configuration", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Configure. + /// + internal static string Configure { + get { + return ResourceManager.GetString("Configure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Configure test benches (password required). + /// + internal static string ConfigureDatabaseText { + get { + return ResourceManager.GetString("ConfigureDatabaseText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Confirmation. + /// + internal static string Confirmation { + get { + return ResourceManager.GetString("Confirmation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Connection string. + /// + internal static string Connection_string { + get { + return ResourceManager.GetString("Connection_string", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Continue in the cycle after this test?. + /// + internal static string Continue_in_the_cycle { + get { + return ResourceManager.GetString("Continue_in_the_cycle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Control water temp.. + /// + internal static string Control_water_temp_chdr { + get { + return ResourceManager.GetString("Control_water_temp_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Copy. + /// + internal static string CopyBtnText { + get { + return ResourceManager.GetString("CopyBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Copyright © 2013 - {0}. + /// + internal static string CopyrightStr { + get { + return ResourceManager.GetString("CopyrightStr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Corrected. + /// + internal static string Corrected { + get { + return ResourceManager.GetString("Corrected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Correction. + /// + internal static string Correction { + get { + return ResourceManager.GetString("Correction", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Counterclockwise. + /// + internal static string Counterclockwise { + get { + return ResourceManager.GetString("Counterclockwise", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Create DB. + /// + internal static string Create_DB { + get { + return ResourceManager.GetString("Create_DB", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Created by. + /// + internal static string Created_by { + get { + return ResourceManager.GetString("Created_by", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to current. + /// + internal static string current { + get { + return ResourceManager.GetString("current", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Data. + /// + internal static string Data { + get { + return ResourceManager.GetString("Data", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Data entry. + /// + internal static string Data_entry { + get { + return ResourceManager.GetString("Data_entry", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Database Settings. + /// + internal static string Database_Settings { + get { + return ResourceManager.GetString("Database_Settings", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Database type. + /// + internal static string Database_type { + get { + return ResourceManager.GetString("Database_type", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Date. + /// + internal static string Date { + get { + return ResourceManager.GetString("Date", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Date and time. + /// + internal static string Date_and_time { + get { + return ResourceManager.GetString("Date_and_time", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The database was successfully created!. + /// + internal static string DB_was_successfully_created { + get { + return ResourceManager.GetString("DB_was_successfully_created", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The database will be overwritten. + /// + internal static string DB_will_be_overwritten { + get { + return ResourceManager.GetString("DB_will_be_overwritten", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Default units. + /// + internal static string Default_units { + get { + return ResourceManager.GetString("Default_units", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Density. + /// + internal static string Density { + get { + return ResourceManager.GetString("Density", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Density correction. + /// + internal static string Density_correction { + get { + return ResourceManager.GetString("Density_correction", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Description. + /// + internal static string DescriptionColHdr { + get { + return ResourceManager.GetString("DescriptionColHdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Detection completed. + /// + internal static string Detection_completed { + get { + return ResourceManager.GetString("Detection_completed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Detection failed. + /// + internal static string Detection_failed { + get { + return ResourceManager.GetString("Detection_failed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Detection threshold [%]. + /// + internal static string DetectionThresholdPct { + get { + return ResourceManager.GetString("DetectionThresholdPct", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device. + /// + internal static string Device { + get { + return ResourceManager.GetString("Device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to dflt. + /// + internal static string dflt { + get { + return ResourceManager.GetString("dflt", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Diverter. + /// + internal static string Diverter { + get { + return ResourceManager.GetString("Diverter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Do you really want to delete sequence '{0}' ?. + /// + internal static string Do_you_really_want_to_delete_sequence_0 { + get { + return ResourceManager.GetString("Do_you_really_want_to_delete_sequence_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Do you want to copy this value to all cells below this cell?. + /// + internal static string Do_you_want_to_copy_this_value_to_all_cells_below_this_cell { + get { + return ResourceManager.GetString("Do_you_want_to_copy_this_value_to_all_cells_below_this_cell", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Do you want to delete the procedure?. + /// + internal static string Do_you_want_to_delete_the_procedure { + get { + return ResourceManager.GetString("Do_you_want_to_delete_the_procedure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Do you want to exit the Test Bench Framework?. + /// + internal static string Do_you_want_to_exit_TBF { + get { + return ResourceManager.GetString("Do_you_want_to_exit_TBF", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Do you want to proceed?. + /// + internal static string Do_you_want_to_proceed { + get { + return ResourceManager.GetString("Do_you_want_to_proceed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Do you want to save changes?. + /// + internal static string Do_you_want_to_save_changes { + get { + return ResourceManager.GetString("Do_you_want_to_save_changes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Do you want to save the procedure?. + /// + internal static string Do_you_want_to_save_the_procedure { + get { + return ResourceManager.GetString("Do_you_want_to_save_the_procedure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Do you want to update related tests and procedures?. + /// + internal static string Do_you_want_to_update_related_tests_and_procedures { + get { + return ResourceManager.GetString("Do_you_want_to_update_related_tests_and_procedures", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Down. + /// + internal static string DownBtnText { + get { + return ResourceManager.GetString("DownBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drain. + /// + internal static string Drain { + get { + return ResourceManager.GetString("Drain", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Leak duration [s]. + /// + internal static string Duration_Leak_s { + get { + return ResourceManager.GetString("Duration_Leak_s", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Duration [ms]. + /// + internal static string Duration_ms { + get { + return ResourceManager.GetString("Duration_ms", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PMax duration [s]. + /// + internal static string Duration_PMax_s { + get { + return ResourceManager.GetString("Duration_PMax_s", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Duration [s]. + /// + internal static string Duration_s { + get { + return ResourceManager.GetString("Duration_s", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Edit User. + /// + internal static string Edit_User { + get { + return ResourceManager.GetString("Edit_User", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Edit. + /// + internal static string EditBtnText { + get { + return ResourceManager.GetString("EditBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Emergency STOP. + /// + internal static string Emergency_STOP { + get { + return ResourceManager.GetString("Emergency_STOP", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Draining. + /// + internal static string Emptying_chdr { + get { + return ResourceManager.GetString("Emptying_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Draining ({0}: step {1}/{2}). + /// + internal static string Emptying_i_n { + get { + return ResourceManager.GetString("Emptying_i_n", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Draining the tank. + /// + internal static string Emptying_tank { + get { + return ResourceManager.GetString("Emptying_tank", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drain valve. + /// + internal static string Emptying_valve { + get { + return ResourceManager.GetString("Emptying_valve", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enable 'Remark'. + /// + internal static string Enable_Remark { + get { + return ResourceManager.GetString("Enable_Remark", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to End. + /// + internal static string End { + get { + return ResourceManager.GetString("End", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to End condition. + /// + internal static string End_Condition { + get { + return ResourceManager.GetString("End_Condition", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to End State. + /// + internal static string End_State { + get { + return ResourceManager.GetString("End_State", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Endurance cycle. + /// + internal static string Endurance_cycle { + get { + return ResourceManager.GetString("Endurance_cycle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Endurance cycle execution. + /// + internal static string Endurance_cycle_execution { + get { + return ResourceManager.GetString("Endurance_cycle_execution", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Endurance cycle steps. + /// + internal static string Endurance_cycle_steps { + get { + return ResourceManager.GetString("Endurance_cycle_steps", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Energy. + /// + internal static string Energy { + get { + return ResourceManager.GetString("Energy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enter password. + /// + internal static string Enter_password { + get { + return ResourceManager.GetString("Enter_password", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enter protocol data. + /// + internal static string Enter_protocol_data { + get { + return ResourceManager.GetString("Enter_protocol_data", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enter serial numbers at the end. + /// + internal static string Enter_SNs_at_the_end { + get { + return ResourceManager.GetString("Enter_SNs_at_the_end", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enter water meter data. + /// + internal static string Enter_water_meter_data { + get { + return ResourceManager.GetString("Enter_water_meter_data", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Err. cor. - [%]. + /// + internal static string Err_cor_neg_pct_chdr { + get { + return ResourceManager.GetString("Err_cor_neg_pct_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Err. cor. +[%]. + /// + internal static string Err_cor_pos_pct_chdr { + get { + return ResourceManager.GetString("Err_cor_pos_pct_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Err. limit lo [%]. + /// + internal static string Err_limit_neg_pct_chdr { + get { + return ResourceManager.GetString("Err_limit_neg_pct_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Err. limit hi [%]. + /// + internal static string Err_limit_pos_pct_chdr { + get { + return ResourceManager.GetString("Err_limit_pos_pct_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error. + /// + internal static string Error { + get { + return ResourceManager.GetString("Error", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error loading users from the database:. + /// + internal static string Error_loading_users_from_the_database { + get { + return ResourceManager.GetString("Error_loading_users_from_the_database", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error [%]. + /// + internal static string Error_pct { + get { + return ResourceManager.GetString("Error_pct", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error while creating the database. Reason: . + /// + internal static string Error_while_creating_DB_Reason { + get { + return ResourceManager.GetString("Error_while_creating_DB_Reason", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error writing into file:. + /// + internal static string Error_writing_into_file_ { + get { + return ResourceManager.GetString("Error_writing_into_file_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Estimated time [s]:. + /// + internal static string Estimated_time_s_ { + get { + return ResourceManager.GetString("Estimated_time_s_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Evaluate. + /// + internal static string Evaluate { + get { + return ResourceManager.GetString("Evaluate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Evaluate volume. + /// + internal static string Evaluate_volume { + get { + return ResourceManager.GetString("Evaluate_volume", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exit. + /// + internal static string ExitBtnText { + get { + return ResourceManager.GetString("ExitBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to NOK. + /// + internal static string Failed { + get { + return ResourceManager.GetString("Failed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to '{0}' activity failed ({1}) !!!. + /// + internal static string failed_0_1_exclamation { + get { + return ResourceManager.GetString("failed_0_1_exclamation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Failed to create a sample database:. + /// + internal static string Failed_to_create_a_sample_database { + get { + return ResourceManager.GetString("Failed_to_create_a_sample_database", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Failed to export the database:. + /// + internal static string Failed_to_export_the_database { + get { + return ResourceManager.GetString("Failed_to_export_the_database", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Failed to initialize component '{0}':{1}{2}. + /// + internal static string Failed_to_initialize_component_0_1_2 { + get { + return ResourceManager.GetString("Failed_to_initialize_component_0_1_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Failed to initialize device '{0}':{1}{2}. + /// + internal static string Failed_to_initialize_device_0_1_2 { + get { + return ResourceManager.GetString("Failed_to_initialize_device_0_1_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to fast. + /// + internal static string fast { + get { + return ResourceManager.GetString("fast", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Feeding. + /// + internal static string Feeding_chdr { + get { + return ResourceManager.GetString("Feeding_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Feeding. + /// + internal static string FeedingTabPageTitle { + get { + return ResourceManager.GetString("FeedingTabPageTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Fill the test bench with water?. + /// + internal static string Fill_with_water { + get { + return ResourceManager.GetString("Fill_with_water", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Finish measurements please. + /// + internal static string Finish_the_session_please { + get { + return ResourceManager.GetString("Finish_the_session_please", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Finish. + /// + internal static string FinishBtnText { + get { + return ResourceManager.GetString("FinishBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Flow. + /// + internal static string Flow { + get { + return ResourceManager.GetString("Flow", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Flow adjustment failed. + /// + internal static string Flow_adjustment_failed { + get { + return ResourceManager.GetString("Flow_adjustment_failed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Flow meter temperature range does not fit this test conditions. + /// + internal static string Flow_meter_temperature_range_does_not_fit_this_test_conditions { + get { + return ResourceManager.GetString("Flow_meter_temperature_range_does_not_fit_this_test_conditions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Flow profile sensitivity class. + /// + internal static string Flow_profile_sensitivity_class { + get { + return ResourceManager.GetString("Flow_profile_sensitivity_class", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Flow Selection. + /// + internal static string Flow_selection { + get { + return ResourceManager.GetString("Flow_selection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Flowmeter. + /// + internal static string Flowmeter { + get { + return ResourceManager.GetString("Flowmeter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Footer. + /// + internal static string Footer { + get { + return ResourceManager.GetString("Footer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to from. + /// + internal static string from { + get { + return ResourceManager.GetString("from", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Full name. + /// + internal static string Full_name { + get { + return ResourceManager.GetString("Full_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to General. + /// + internal static string General { + get { + return ResourceManager.GetString("General", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Get mass of water in the tank. + /// + internal static string Get_mass_of_water_in_the_tank { + get { + return ResourceManager.GetString("Get_mass_of_water_in_the_tank", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Grab. + /// + internal static string Grab { + get { + return ResourceManager.GetString("Grab", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Graphs. + /// + internal static string Graphs { + get { + return ResourceManager.GetString("Graphs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Groups. + /// + internal static string Groups { + get { + return ResourceManager.GetString("Groups", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Head of Lab. + /// + internal static string Head_of_Lab { + get { + return ResourceManager.GetString("Head_of_Lab", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Head was disabled by the user. + /// + internal static string Head_was_disabled_by_the_user { + get { + return ResourceManager.GetString("Head_was_disabled_by_the_user", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Header. + /// + internal static string Header { + get { + return ResourceManager.GetString("Header", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Heat meter. + /// + internal static string Heat_meter { + get { + return ResourceManager.GetString("Heat_meter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Heat meter options. + /// + internal static string Heat_meter_options { + get { + return ResourceManager.GetString("Heat_meter_options", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Heat meter sensors. + /// + internal static string Heat_meter_sensors { + get { + return ResourceManager.GetString("Heat_meter_sensors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Heat meters. + /// + internal static string HeatMetersTabPageTitle { + get { + return ResourceManager.GetString("HeatMetersTabPageTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to History of changes. + /// + internal static string History_of_changes { + get { + return ResourceManager.GetString("History_of_changes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Horizontally. + /// + internal static string Horizontally { + get { + return ResourceManager.GetString("Horizontally", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ID. + /// + internal static string ID { + get { + return ResourceManager.GetString("ID", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ignore. + /// + internal static string Ignore { + get { + return ResourceManager.GetString("Ignore", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ignore. + /// + internal static string IgnoreBtnText { + get { + return ResourceManager.GetString("IgnoreBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Information. + /// + internal static string Information { + get { + return ResourceManager.GetString("Information", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid {0}. + /// + internal static string Invalid_0 { + get { + return ResourceManager.GetString("Invalid_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to At least one of Buoyancy parameters is invalid,\r\ncorrect it please.. + /// + internal static string Invalid_buoyancy_parameter_Correct_pls { + get { + return ResourceManager.GetString("Invalid_buoyancy_parameter_Correct_pls", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid calibration information. Correct it please.. + /// + internal static string Invalid_calib_info_Correct_pls { + get { + return ResourceManager.GetString("Invalid_calib_info_Correct_pls", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid password. + /// + internal static string Invalid_password { + get { + return ResourceManager.GetString("Invalid_password", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid user, password, or bench. + /// + internal static string Invalid_user_password_or_bench { + get { + return ResourceManager.GetString("Invalid_user_password_or_bench", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid username or password. + /// + internal static string Invalid_username_or_password { + get { + return ResourceManager.GetString("Invalid_username_or_password", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to iPerl Communication in progress. + /// + internal static string iPerl_Communication_in_progress { + get { + return ResourceManager.GetString("iPerl_Communication_in_progress", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ITS-27 calibration coefficients. + /// + internal static string ITS27_calibration_coefficients { + get { + return ResourceManager.GetString("ITS27_calibration_coefficients", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ITS-90 calibration coefficients. + /// + internal static string ITS90_calibration_coefficients { + get { + return ResourceManager.GetString("ITS90_calibration_coefficients", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ITS-90 test. + /// + internal static string ITS90_test { + get { + return ResourceManager.GetString("ITS90_test", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Length. + /// + internal static string L { + get { + return ResourceManager.GetString("L", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Language. + /// + internal static string Language { + get { + return ResourceManager.GetString("Language", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Last changed by. + /// + internal static string Last_changed_by { + get { + return ResourceManager.GetString("Last_changed_by", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Last cycle, wait please.. + /// + internal static string Last_cycle_wait_please { + get { + return ResourceManager.GetString("Last_cycle_wait_please", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Legalizator. + /// + internal static string Legalizator { + get { + return ResourceManager.GetString("Legalizator", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Less. + /// + internal static string LessBtnText { + get { + return ResourceManager.GetString("LessBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Live. + /// + internal static string Live { + get { + return ResourceManager.GetString("Live", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Loading the procedure. + /// + internal static string Loading_the_procedure { + get { + return ResourceManager.GetString("Loading_the_procedure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Lock. + /// + internal static string LockBtnText { + get { + return ResourceManager.GetString("LockBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Logging. + /// + internal static string Logging { + get { + return ResourceManager.GetString("Logging", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Main. + /// + internal static string Main { + get { + return ResourceManager.GetString("Main", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Main:. + /// + internal static string Main_ { + get { + return ResourceManager.GetString("Main_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Main Water Meter. + /// + internal static string Main_Water_Meter { + get { + return ResourceManager.GetString("Main_Water_Meter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Main WM State. + /// + internal static string Main_Water_Meter_State { + get { + return ResourceManager.GetString("Main_Water_Meter_State", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Main WM Serial Nr.. + /// + internal static string Main_WM_SerialNr { + get { + return ResourceManager.GetString("Main_WM_SerialNr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Maintenance Specialist. + /// + internal static string Maintenance_Specialist { + get { + return ResourceManager.GetString("Maintenance_Specialist", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Make tank empty. + /// + internal static string Make_tank_empty { + get { + return ResourceManager.GetString("Make_tank_empty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Manual control disabled. + /// + internal static string Manual_control_disabled { + get { + return ResourceManager.GetString("Manual_control_disabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mass. + /// + internal static string Mass { + get { + return ResourceManager.GetString("Mass", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mass diff. [kg]:. + /// + internal static string Mass_diff_kg_ { + get { + return ResourceManager.GetString("Mass_diff_kg_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mass method. + /// + internal static string Mass_method { + get { + return ResourceManager.GetString("Mass_method", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mass repeats. + /// + internal static string Mass_repeats { + get { + return ResourceManager.GetString("Mass_repeats", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mass spread [kg]. + /// + internal static string Mass_spread_kg { + get { + return ResourceManager.GetString("Mass_spread_kg", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to (max. _X_ alphanumeric characters). + /// + internal static string MaxChars { + get { + return ResourceManager.GetString("MaxChars", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Maximum admissible pressure. + /// + internal static string Maximum_admissible_pressure { + get { + return ResourceManager.GetString("Maximum_admissible_pressure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Measure the mass. + /// + internal static string Measure_the_mass { + get { + return ResourceManager.GetString("Measure_the_mass", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Measured. + /// + internal static string Measured { + get { + return ResourceManager.GetString("Measured", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Measuring the weight. + /// + internal static string Measuring_the_weight { + get { + return ResourceManager.GetString("Measuring_the_weight", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Message. + /// + internal static string Message { + get { + return ResourceManager.GetString("Message", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Meter {0}. + /// + internal static string Meter_nr { + get { + return ResourceManager.GetString("Meter_nr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Meter types tested. + /// + internal static string Meter_types_tested { + get { + return ResourceManager.GetString("Meter_types_tested", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sensors. + /// + internal static string MetersTabPageTitle { + get { + return ResourceManager.GetString("MetersTabPageTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Method {0} cannot be used. + /// + internal static string Method_0_cannot_be_used { + get { + return ResourceManager.GetString("Method_0_cannot_be_used", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test method. + /// + internal static string Method_chdr { + get { + return ResourceManager.GetString("Method_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test method selection. + /// + internal static string Method_selection { + get { + return ResourceManager.GetString("Method_selection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Metrological class. + /// + internal static string Metrological_class { + get { + return ResourceManager.GetString("Metrological_class", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Metrologist. + /// + internal static string Metrologist { + get { + return ResourceManager.GetString("Metrologist", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Metrology. + /// + internal static string Metrology { + get { + return ResourceManager.GetString("Metrology", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mode. + /// + internal static string Mode { + get { + return ResourceManager.GetString("Mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to More. + /// + internal static string MoreBtnText { + get { + return ResourceManager.GetString("MoreBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mounting. + /// + internal static string Mounting { + get { + return ResourceManager.GetString("Mounting", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Name. + /// + internal static string Name { + get { + return ResourceManager.GetString("Name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PBench. + /// + internal static string New_bench_path_name { + get { + return ResourceManager.GetString("New_bench_path_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PFeed. + /// + internal static string New_feeding_path_name { + get { + return ResourceManager.GetString("New_feeding_path_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PHeat. + /// + internal static string New_heat_meters_path_name { + get { + return ResourceManager.GetString("New_heat_meters_path_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to - Copy. + /// + internal static string New_name_copy { + get { + return ResourceManager.GetString("New_name_copy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PQ. + /// + internal static string New_output_path_name { + get { + return ResourceManager.GetString("New_output_path_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Procedure. + /// + internal static string New_procedure_name { + get { + return ResourceManager.GetString("New_procedure_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to New Q. + /// + internal static string New_Q_names { + get { + return ResourceManager.GetString("New_Q_names", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PSens. + /// + internal static string New_sensors_path_name { + get { + return ResourceManager.GetString("New_sensors_path_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test. + /// + internal static string New_test_name { + get { + return ResourceManager.GetString("New_test_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to New transition name. + /// + internal static string New_transition_name { + get { + return ResourceManager.GetString("New_transition_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to New Tab. + /// + internal static string NewTabBtnText { + get { + return ResourceManager.GetString("NewTabBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Next test volume. + /// + internal static string Next_test_volume { + get { + return ResourceManager.GetString("Next_test_volume", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Next >. + /// + internal static string NextBtnText { + get { + return ResourceManager.GetString("NextBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to no. + /// + internal static string no { + get { + return ResourceManager.GetString("no", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No results to print. + /// + internal static string No_results_to_print { + get { + return ResourceManager.GetString("No_results_to_print", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No test bench in the program configuration.. + /// + internal static string NoBenchMsg { + get { + return ResourceManager.GetString("NoBenchMsg", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No. + /// + internal static string NoBtn { + get { + return ResourceManager.GetString("NoBtn", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cannot connect to the database.. + /// + internal static string NoDatabaseMsg { + get { + return ResourceManager.GetString("NoDatabaseMsg", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Notes. + /// + internal static string Notes { + get { + return ResourceManager.GetString("Notes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to <nothing to configure>. + /// + internal static string nothing_to_configure { + get { + return ResourceManager.GetString("nothing_to_configure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Notification. + /// + internal static string Notification { + get { + return ResourceManager.GetString("Notification", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Nr.. + /// + internal static string Nr { + get { + return ResourceManager.GetString("Nr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Nr. meters in a group:. + /// + internal static string Nr_meters_in_a_group { + get { + return ResourceManager.GetString("Nr_meters_in_a_group", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to OK. + /// + internal static string OkBtnText { + get { + return ResourceManager.GetString("OkBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to open. + /// + internal static string open { + get { + return ResourceManager.GetString("open", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Other. + /// + internal static string Other { + get { + return ResourceManager.GetString("Other", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Output. + /// + internal static string Output_chdr { + get { + return ResourceManager.GetString("Output_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Output. + /// + internal static string OutputTabPageTitle { + get { + return ResourceManager.GetString("OutputTabPageTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to P delta. + /// + internal static string P_delta { + get { + return ResourceManager.GetString("P_delta", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to P up. + /// + internal static string P_in { + get { + return ResourceManager.GetString("P_in", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to P dn. + /// + internal static string P_out { + get { + return ResourceManager.GetString("P_out", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Page. + /// + internal static string Page { + get { + return ResourceManager.GetString("Page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Parameter. + /// + internal static string Parameter { + get { + return ResourceManager.GetString("Parameter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Parameters. + /// + internal static string Parameters { + get { + return ResourceManager.GetString("Parameters", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Parent. + /// + internal static string Parent { + get { + return ResourceManager.GetString("Parent", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Parent name. + /// + internal static string Parent_name { + get { + return ResourceManager.GetString("Parent_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Part. + /// + internal static string Part { + get { + return ResourceManager.GetString("Part", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to OK. + /// + internal static string Passed { + get { + return ResourceManager.GetString("Passed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Password. + /// + internal static string Password { + get { + return ResourceManager.GetString("Password", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Fields 'Password' and 'Repeat password' are different. Retype them please.. + /// + internal static string Passwords_different { + get { + return ResourceManager.GetString("Passwords_different", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Paths. + /// + internal static string PathsDlgTitle { + get { + return ResourceManager.GetString("PathsDlgTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PID. + /// + internal static string PID { + get { + return ResourceManager.GetString("PID", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Please change the following settings:. + /// + internal static string Please_change_the_following_settings { + get { + return ResourceManager.GetString("Please_change_the_following_settings", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Please choose another transition sequence name. + /// + internal static string Please_choose_another_transition_sequence_name { + get { + return ResourceManager.GetString("Please_choose_another_transition_sequence_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Please select a cycle, a test or empty. + /// + internal static string Please_select_a_cycle_a_test_or_empty { + get { + return ResourceManager.GetString("Please_select_a_cycle_a_test_or_empty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Please select a procedure. + /// + internal static string Please_select_a_procedure { + get { + return ResourceManager.GetString("Please_select_a_procedure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Please select a test. + /// + internal static string Please_select_a_test { + get { + return ResourceManager.GetString("Please_select_a_test", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Please, select a test bench. + /// + internal static string PLs_select_testbench { + get { + return ResourceManager.GetString("PLs_select_testbench", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PO. + /// + internal static string PO { + get { + return ResourceManager.GetString("PO", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Power [%]. + /// + internal static string PowerPct { + get { + return ResourceManager.GetString("PowerPct", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pr down. + /// + internal static string Pr_down { + get { + return ResourceManager.GetString("Pr_down", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pr up. + /// + internal static string Pr_up { + get { + return ResourceManager.GetString("Pr_up", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Press OK to start the bench. + /// + internal static string Press_OK_to_start_the_bench { + get { + return ResourceManager.GetString("Press_OK_to_start_the_bench", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pressure. + /// + internal static string Pressure { + get { + return ResourceManager.GetString("Pressure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pressure Hi [bar]. + /// + internal static string Pressure_hi_bar { + get { + return ResourceManager.GetString("Pressure_hi_bar", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pressure Lo [bar]. + /// + internal static string Pressure_lo_bar { + get { + return ResourceManager.GetString("Pressure_lo_bar", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pressure loss class. + /// + internal static string Pressure_loss_class { + get { + return ResourceManager.GetString("Pressure_loss_class", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pressure meter. + /// + internal static string Pressure_meter { + get { + return ResourceManager.GetString("Pressure_meter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pressure Selection. + /// + internal static string Pressure_selection { + get { + return ResourceManager.GetString("Pressure_selection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Previous results. + /// + internal static string Previous_results { + get { + return ResourceManager.GetString("Previous_results", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Print again. + /// + internal static string Print_again { + get { + return ResourceManager.GetString("Print_again", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Print only good results. + /// + internal static string Print_only_good_results { + get { + return ResourceManager.GetString("Print_only_good_results", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Print only the last measurement. + /// + internal static string Print_only_the_last_measurement { + get { + return ResourceManager.GetString("Print_only_the_last_measurement", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Print watermeter results. + /// + internal static string Print_watermeter_results { + get { + return ResourceManager.GetString("Print_watermeter_results", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Print. + /// + internal static string PrintBtnText { + get { + return ResourceManager.GetString("PrintBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Printed. + /// + internal static string Printed { + get { + return ResourceManager.GetString("Printed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Printer. + /// + internal static string Printer { + get { + return ResourceManager.GetString("Printer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Printer. + /// + internal static string PrinterBtnText { + get { + return ResourceManager.GetString("PrinterBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Printing. + /// + internal static string Printing { + get { + return ResourceManager.GetString("Printing", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Procedure. + /// + internal static string Procedure { + get { + return ResourceManager.GetString("Procedure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Procedure {0} added.. + /// + internal static string Procedure_0_added { + get { + return ResourceManager.GetString("Procedure_0_added", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Procedure {0} modified.. + /// + internal static string Procedure_0_modified { + get { + return ResourceManager.GetString("Procedure_0_modified", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Procedure name. + /// + internal static string Procedure_name { + get { + return ResourceManager.GetString("Procedure_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Procedures. + /// + internal static string Procedures { + get { + return ResourceManager.GetString("Procedures", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Process. + /// + internal static string Process { + get { + return ResourceManager.GetString("Process", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Producer. + /// + internal static string Producer { + get { + return ResourceManager.GetString("Producer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Product name. + /// + internal static string Product_name { + get { + return ResourceManager.GetString("Product_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Program restart is required to apply some settings. + /// + internal static string Program_restart_is_required_to_apply_some_settings { + get { + return ResourceManager.GetString("Program_restart_is_required_to_apply_some_settings", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Progress. + /// + internal static string Progress { + get { + return ResourceManager.GetString("Progress", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Prompt. + /// + internal static string Prompt { + get { + return ResourceManager.GetString("Prompt", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Properties. + /// + internal static string Properties { + get { + return ResourceManager.GetString("Properties", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Protected procedure. + /// + internal static string Protected_procedure { + get { + return ResourceManager.GetString("Protected_procedure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Protocol. + /// + internal static string Protocol { + get { + return ResourceManager.GetString("Protocol", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Protocol title. + /// + internal static string Protocol_title { + get { + return ResourceManager.GetString("Protocol_title", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Publish. + /// + internal static string Publish { + get { + return ResourceManager.GetString("Publish", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pulses:. + /// + internal static string Pulses_ { + get { + return ResourceManager.GetString("Pulses_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pulses per kWh. + /// + internal static string PulsesPerKWh { + get { + return ResourceManager.GetString("PulsesPerKWh", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pulses per liter. + /// + internal static string PulsesPerLtr { + get { + return ResourceManager.GetString("PulsesPerLtr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pump. + /// + internal static string Pump { + get { + return ResourceManager.GetString("Pump", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pump power [%]. + /// + internal static string Pump_power_pct { + get { + return ResourceManager.GetString("Pump_power_pct", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Purchase order. + /// + internal static string Purchase_order { + get { + return ResourceManager.GetString("Purchase_order", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Purchase order may have max {0} characters. + /// + internal static string Purchase_order_may_have_max_N_characters { + get { + return ResourceManager.GetString("Purchase_order_may_have_max_N_characters", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Purge - Begin. + /// + internal static string Purge_Begin { + get { + return ResourceManager.GetString("Purge_Begin", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Fill the test bench with water?. + /// + internal static string Purge_bench_qm { + get { + return ResourceManager.GetString("Purge_bench_qm", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Purge - End. + /// + internal static string Purge_End { + get { + return ResourceManager.GetString("Purge_End", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Purging. + /// + internal static string Purging { + get { + return ResourceManager.GetString("Purging", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Purging ({0}: step {1}/{2}). + /// + internal static string Purging_i_n { + get { + return ResourceManager.GetString("Purging_i_n", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Q from [l/h]. + /// + internal static string Q_from_lph { + get { + return ResourceManager.GetString("Q_from_lph", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Q from [m3/h]. + /// + internal static string Q_from_m3h { + get { + return ResourceManager.GetString("Q_from_m3h", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Q-Set Method. + /// + internal static string Q_set_method_chdr { + get { + return ResourceManager.GetString("Q_set_method_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Q to [l/h]. + /// + internal static string Q_to_lph { + get { + return ResourceManager.GetString("Q_to_lph", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Q to [m3/h]. + /// + internal static string Q_to_m3h { + get { + return ResourceManager.GetString("Q_to_m3h", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Qfall. + /// + internal static string Qfall { + get { + return ResourceManager.GetString("Qfall", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Qmax [m3/h]. + /// + internal static string Qmax { + get { + return ResourceManager.GetString("Qmax", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Qmin [m3/h]. + /// + internal static string Qmin { + get { + return ResourceManager.GetString("Qmin", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Qn [m3/h]. + /// + internal static string Qn { + get { + return ResourceManager.GetString("Qn", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Qrise. + /// + internal static string Qrise { + get { + return ResourceManager.GetString("Qrise", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Qt [m3/h]. + /// + internal static string Qt { + get { + return ResourceManager.GetString("Qt", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Question. + /// + internal static string Question { + get { + return ResourceManager.GetString("Question", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Rate of change [%]. + /// + internal static string RateOfChangePct { + get { + return ResourceManager.GetString("RateOfChangePct", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ready. + /// + internal static string Ready { + get { + return ResourceManager.GetString("Ready", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Red. type. + /// + internal static string Red_type_chdr { + get { + return ResourceManager.GetString("Red_type_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ref. error [%]:. + /// + internal static string Ref_error_pct_ { + get { + return ResourceManager.GetString("Ref_error_pct_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ref. flow [m3/h]:. + /// + internal static string Ref_flow_m3h_ { + get { + return ResourceManager.GetString("Ref_flow_m3h_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ref. freq. [Hz]:. + /// + internal static string Ref_freq_Hz_ { + get { + return ResourceManager.GetString("Ref_freq_Hz_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ref. mass density [kg/m3]. + /// + internal static string Ref_mass_dens_kg_m3 { + get { + return ResourceManager.GetString("Ref_mass_dens_kg_m3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ref.pulses:. + /// + internal static string Ref_pulses_ { + get { + return ResourceManager.GetString("Ref_pulses_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ref. volume [l]:. + /// + internal static string Ref_volume_l_ { + get { + return ResourceManager.GetString("Ref_volume_l_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reference. + /// + internal static string Reference { + get { + return ResourceManager.GetString("Reference", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Refresh. + /// + internal static string Refresh { + get { + return ResourceManager.GetString("Refresh", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reg. valve. + /// + internal static string Reg_valve { + get { + return ResourceManager.GetString("Reg_valve", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reg. valve pos.:. + /// + internal static string Reg_valve_pos_ { + get { + return ResourceManager.GetString("Reg_valve_pos_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Relative Q from. + /// + internal static string RelativeQfrom { + get { + return ResourceManager.GetString("RelativeQfrom", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Relative Q to. + /// + internal static string RelativeQto { + get { + return ResourceManager.GetString("RelativeQto", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to remaining time. + /// + internal static string remaining_time { + get { + return ResourceManager.GetString("remaining_time", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remark. + /// + internal static string Remark { + get { + return ResourceManager.GetString("Remark", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to < Remove. + /// + internal static string Remove { + get { + return ResourceManager.GetString("Remove", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remove all. + /// + internal static string Remove_all { + get { + return ResourceManager.GetString("Remove_all", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remove. + /// + internal static string RemoveBtnText { + get { + return ResourceManager.GetString("RemoveBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remove Tab. + /// + internal static string RemoveTabBtnText { + get { + return ResourceManager.GetString("RemoveTabBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Rename Tab. + /// + internal static string RenameTabBtnText { + get { + return ResourceManager.GetString("RenameTabBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Repeat password. + /// + internal static string Repeat_password { + get { + return ResourceManager.GetString("Repeat_password", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Repeats count. + /// + internal static string Repeats_nr_chdr { + get { + return ResourceManager.GetString("Repeats_nr_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Required temperature [°C]. + /// + internal static string Required_temperature_C { + get { + return ResourceManager.GetString("Required_temperature_C", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Resetting scales. + /// + internal static string Resetting_scales { + get { + return ResourceManager.GetString("Resetting_scales", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Resistance. + /// + internal static string Resistance { + get { + return ResourceManager.GetString("Resistance", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to You must restart to apply these changes. + /// + internal static string Restart_To_Apply_Changes { + get { + return ResourceManager.GetString("Restart_To_Apply_Changes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Restore. + /// + internal static string Restore { + get { + return ResourceManager.GetString("Restore", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Results. + /// + internal static string Results { + get { + return ResourceManager.GetString("Results", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Results of batch {0}. + /// + internal static string Results_of_batch_0 { + get { + return ResourceManager.GetString("Results_of_batch_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Retry. + /// + internal static string Retry { + get { + return ResourceManager.GetString("Retry", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Retry. + /// + internal static string RetryBtnText { + get { + return ResourceManager.GetString("RetryBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Retry connection to the database. + /// + internal static string RetryDatabaseText { + get { + return ResourceManager.GetString("RetryDatabaseText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Revision. + /// + internal static string Revision { + get { + return ResourceManager.GetString("Revision", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to RFID communication failed. + /// + internal static string RFID_communication_failed { + get { + return ResourceManager.GetString("RFID_communication_failed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ROI Data. + /// + internal static string ROI_Data { + get { + return ResourceManager.GetString("ROI_Data", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ROI Detection in Progress. + /// + internal static string ROI_Detection_in_Progress { + get { + return ResourceManager.GetString("ROI_Detection_in_Progress", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Save. + /// + internal static string Save { + get { + return ResourceManager.GetString("Save", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Save again. + /// + internal static string Save_again { + get { + return ResourceManager.GetString("Save_again", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Save column widths. + /// + internal static string Save_column_widths { + get { + return ResourceManager.GetString("Save_column_widths", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Saving and printing results. + /// + internal static string Saving_and_printing_results { + get { + return ResourceManager.GetString("Saving_and_printing_results", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Saving results. + /// + internal static string Saving_results { + get { + return ResourceManager.GetString("Saving_results", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Scale communication error. + /// + internal static string Scale_communication_error { + get { + return ResourceManager.GetString("Scale_communication_error", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Scale communication timeout. + /// + internal static string Scale_communication_timeout { + get { + return ResourceManager.GetString("Scale_communication_timeout", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Screen. + /// + internal static string ScreenBtnText { + get { + return ResourceManager.GetString("ScreenBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to s. + /// + internal static string sec { + get { + return ResourceManager.GetString("sec", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Select COLD water. + /// + internal static string Select_COLD_tank { + get { + return ResourceManager.GetString("Select_COLD_tank", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Select Component. + /// + internal static string Select_Component { + get { + return ResourceManager.GetString("Select_Component", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Select HOT water. + /// + internal static string Select_HOT_tank { + get { + return ResourceManager.GetString("Select_HOT_tank", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Select images and press Retry to retry RoI detection. + /// + internal static string Select_images_and_press_Retry_to_retry_RoI_detection { + get { + return ResourceManager.GetString("Select_images_and_press_Retry_to_retry_RoI_detection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Select WARM water. + /// + internal static string Select_WARM_tank { + get { + return ResourceManager.GetString("Select_WARM_tank", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Selected results. + /// + internal static string Selected_results { + get { + return ResourceManager.GetString("Selected_results", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sensor . + /// + internal static string Sensor_ { + get { + return ResourceManager.GetString("Sensor_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sensors. + /// + internal static string Sensors { + get { + return ResourceManager.GetString("Sensors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sensors. + /// + internal static string Sensors_chdr { + get { + return ResourceManager.GetString("Sensors_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sensus extensions. + /// + internal static string Sensus_extensions { + get { + return ResourceManager.GetString("Sensus_extensions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sent. + /// + internal static string Sent { + get { + return ResourceManager.GetString("Sent", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Serial Number. + /// + internal static string Serial_Number { + get { + return ResourceManager.GetString("Serial_Number", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Serial Nr.. + /// + internal static string SerialNr { + get { + return ResourceManager.GetString("SerialNr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session. + /// + internal static string Session { + get { + return ResourceManager.GetString("Session", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Set cold water cooling temperature. + /// + internal static string Set_cold_water_cooling_temperature { + get { + return ResourceManager.GetString("Set_cold_water_cooling_temperature", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Set flow. + /// + internal static string Set_flow { + get { + return ResourceManager.GetString("Set_flow", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Set hot water cooling temperature. + /// + internal static string Set_hot_water_cooling_temperature { + get { + return ResourceManager.GetString("Set_hot_water_cooling_temperature", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Set hot water heating temperature. + /// + internal static string Set_hot_water_heating_temperature { + get { + return ResourceManager.GetString("Set_hot_water_heating_temperature", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Set route. + /// + internal static string Set_route { + get { + return ResourceManager.GetString("Set_route", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Set warm water cooling temperature. + /// + internal static string Set_warm_water_cooling_temperature { + get { + return ResourceManager.GetString("Set_warm_water_cooling_temperature", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Set warm water heating temperature. + /// + internal static string Set_warm_water_heating_temperature { + get { + return ResourceManager.GetString("Set_warm_water_heating_temperature", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Setting temperature. + /// + internal static string Setting_temperature { + get { + return ResourceManager.GetString("Setting_temperature", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Setting flow. + /// + internal static string Setting_the_flow { + get { + return ResourceManager.GetString("Setting_the_flow", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Setting water pressure. + /// + internal static string Setting_the_water_pressure { + get { + return ResourceManager.GetString("Setting_the_water_pressure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Short description. + /// + internal static string Short_description { + get { + return ResourceManager.GetString("Short_description", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show. + /// + internal static string Show { + get { + return ResourceManager.GetString("Show", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show cycle end form. + /// + internal static string Show_cycle_end_form { + get { + return ResourceManager.GetString("Show_cycle_end_form", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Simultaneous with next step. + /// + internal static string Simultaneous_with_next_step { + get { + return ResourceManager.GetString("Simultaneous_with_next_step", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Simultaneous with previous step. + /// + internal static string Simultaneous_with_previous_step { + get { + return ResourceManager.GetString("Simultaneous_with_previous_step", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Single. + /// + internal static string SingleBtnText { + get { + return ResourceManager.GetString("SingleBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to stable. + /// + internal static string stable { + get { + return ResourceManager.GetString("stable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Start. + /// + internal static string Start { + get { + return ResourceManager.GetString("Start", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Start the pump. + /// + internal static string Start_the_pump { + get { + return ResourceManager.GetString("Start_the_pump", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Start the test. + /// + internal static string Start_the_test { + get { + return ResourceManager.GetString("Start_the_test", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Start the test bench. + /// + internal static string Start_the_test_bench { + get { + return ResourceManager.GetString("Start_the_test_bench", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Starting the system. + /// + internal static string Starting_system { + get { + return ResourceManager.GetString("Starting_system", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Starting the cameras. + /// + internal static string Starting_the_cameras { + get { + return ResourceManager.GetString("Starting_the_cameras", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Starting the pump. + /// + internal static string Starting_the_pump { + get { + return ResourceManager.GetString("Starting_the_pump", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Start valve. + /// + internal static string StartValve { + get { + return ResourceManager.GetString("StartValve", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to State. + /// + internal static string State { + get { + return ResourceManager.GetString("State", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Stop the pump. + /// + internal static string Stop_the_pump { + get { + return ResourceManager.GetString("Stop_the_pump", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Stop the test. + /// + internal static string Stop_the_test { + get { + return ResourceManager.GetString("Stop_the_test", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Stop backflow valve. + /// + internal static string StopBFValve_chdr { + get { + return ResourceManager.GetString("StopBFValve_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Stopping. + /// + internal static string Stopping { + get { + return ResourceManager.GetString("Stopping", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Stopping flow before the fixed start test. + /// + internal static string Stopping_flow_for_the_fixed_start { + get { + return ResourceManager.GetString("Stopping_flow_for_the_fixed_start", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to . + /// + internal static string String1 { + get { + return ResourceManager.GetString("String1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Supress WM trills. + /// + internal static string SupressWMTrills { + get { + return ResourceManager.GetString("SupressWMTrills", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Switching flow detection. + /// + internal static string Switching_flow_detection { + get { + return ResourceManager.GetString("Switching_flow_detection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Switching Points. + /// + internal static string Switching_Points { + get { + return ResourceManager.GetString("Switching_Points", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T bath. + /// + internal static string T_bath { + get { + return ResourceManager.GetString("T_bath", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T cold. + /// + internal static string T_cold { + get { + return ResourceManager.GetString("T_cold", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T cold cooling. + /// + internal static string T_cold_cooling { + get { + return ResourceManager.GetString("T_cold_cooling", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T cold from. + /// + internal static string T_cold_from { + get { + return ResourceManager.GetString("T_cold_from", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T cold to. + /// + internal static string T_cold_to { + get { + return ResourceManager.GetString("T_cold_to", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T div. + /// + internal static string T_div { + get { + return ResourceManager.GetString("T_div", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T hot cooling. + /// + internal static string T_hot_cooling { + get { + return ResourceManager.GetString("T_hot_cooling", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T hot heating. + /// + internal static string T_hot_heating { + get { + return ResourceManager.GetString("T_hot_heating", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T in. + /// + internal static string T_in { + get { + return ResourceManager.GetString("T_in", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T inlet. + /// + internal static string T_inlet { + get { + return ResourceManager.GetString("T_inlet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T out. + /// + internal static string T_out { + get { + return ResourceManager.GetString("T_out", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T outlet. + /// + internal static string T_outlet { + get { + return ResourceManager.GetString("T_outlet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T m cold. + /// + internal static string T_ref_cold { + get { + return ResourceManager.GetString("T_ref_cold", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T m warm. + /// + internal static string T_ref_warm { + get { + return ResourceManager.GetString("T_ref_warm", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T warm. + /// + internal static string T_warm { + get { + return ResourceManager.GetString("T_warm", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T warm cooling. + /// + internal static string T_warm_cooling { + get { + return ResourceManager.GetString("T_warm_cooling", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T warm from. + /// + internal static string T_warm_from { + get { + return ResourceManager.GetString("T_warm_from", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T warm heating. + /// + internal static string T_warm_heating { + get { + return ResourceManager.GetString("T_warm_heating", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T warm to. + /// + internal static string T_warm_to { + get { + return ResourceManager.GetString("T_warm_to", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T v cold. + /// + internal static string T_work_cold { + get { + return ResourceManager.GetString("T_work_cold", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T v warm. + /// + internal static string T_work_warm { + get { + return ResourceManager.GetString("T_work_warm", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Target flow high [m3/h]:. + /// + internal static string Target_flow_hi_m3h_ { + get { + return ResourceManager.GetString("Target_flow_hi_m3h_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Target flow low [m3/h]:. + /// + internal static string Target_flow_lo_m3h_ { + get { + return ResourceManager.GetString("Target_flow_lo_m3h_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Target ref. count:. + /// + internal static string Target_ref_pulses_ { + get { + return ResourceManager.GetString("Target_ref_pulses_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Target volume [l]:. + /// + internal static string Target_volume_l_ { + get { + return ResourceManager.GetString("Target_volume_l_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Target Q [m3/h]. + /// + internal static string TargetQ { + get { + return ResourceManager.GetString("TargetQ", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tarring. + /// + internal static string Tarring { + get { + return ResourceManager.GetString("Tarring", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Temp. lim. hi. + /// + internal static string Temp_lim_hi_chdr { + get { + return ResourceManager.GetString("Temp_lim_hi_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Temp. lim. lo. + /// + internal static string Temp_lim_lo_chdr { + get { + return ResourceManager.GetString("Temp_lim_lo_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Temperature. + /// + internal static string Temperature { + get { + return ResourceManager.GetString("Temperature", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Temperature class. + /// + internal static string Temperature_class { + get { + return ResourceManager.GetString("Temperature_class", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test. + /// + internal static string Test { + get { + return ResourceManager.GetString("Test", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test bench. + /// + internal static string Test_bench { + get { + return ResourceManager.GetString("Test_bench", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test Bench Components Configuration. + /// + internal static string Test_Bench_Components_Configuration { + get { + return ResourceManager.GetString("Test_Bench_Components_Configuration", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test bench data. + /// + internal static string Test_bench_data { + get { + return ResourceManager.GetString("Test_bench_data", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test Bench Databases Specification. + /// + internal static string Test_Bench_Databases_Specification { + get { + return ResourceManager.GetString("Test_Bench_Databases_Specification", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test bench is controlled by this computer. + /// + internal static string Test_bench_is_controlled_by_this_computer { + get { + return ResourceManager.GetString("Test_bench_is_controlled_by_this_computer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test bench name. + /// + internal static string Test_bench_name { + get { + return ResourceManager.GetString("Test_bench_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test bench number. + /// + internal static string Test_bench_number { + get { + return ResourceManager.GetString("Test_bench_number", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test Benches:. + /// + internal static string Test_Benches_ { + get { + return ResourceManager.GetString("Test_Benches_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test. + /// + internal static string Test_chdr { + get { + return ResourceManager.GetString("Test_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test completed. + /// + internal static string Test_completed { + get { + return ResourceManager.GetString("Test_completed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test connection. + /// + internal static string Test_connection { + get { + return ResourceManager.GetString("Test_connection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test in progress. + /// + internal static string Test_in_progress { + get { + return ResourceManager.GetString("Test_in_progress", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test. + /// + internal static string Test_measured_corrected { + get { + return ResourceManager.GetString("Test_measured_corrected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test method. + /// + internal static string Test_method { + get { + return ResourceManager.GetString("Test_method", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test name. + /// + internal static string Test_name { + get { + return ResourceManager.GetString("Test_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test preparation. + /// + internal static string Test_preparation { + get { + return ResourceManager.GetString("Test_preparation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test start ({0}: step {1}/{2}). + /// + internal static string Test_start_sequence_i_n { + get { + return ResourceManager.GetString("Test_start_sequence_i_n", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test stop ({0}: step {1}/{2}). + /// + internal static string Test_stop_sequence_i_n { + get { + return ResourceManager.GetString("Test_stop_sequence_i_n", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test time [s]. + /// + internal static string Test_time_s_chdr { + get { + return ResourceManager.GetString("Test_time_s_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test volume exceeds the scale capacity. + /// + internal static string Test_volume_exceeds_the_scale_capacity { + get { + return ResourceManager.GetString("Test_volume_exceeds_the_scale_capacity", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tester. + /// + internal static string Tester { + get { + return ResourceManager.GetString("Tester", resourceCulture); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap testFailedImage { + get { + object obj = ResourceManager.GetObject("testFailedImage", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized string similar to Testing Specialist. + /// + internal static string Testing_Specialist { + get { + return ResourceManager.GetString("Testing_Specialist", resourceCulture); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap testNotDoneImage { + get { + object obj = ResourceManager.GetObject("testNotDoneImage", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap testPassedImage { + get { + object obj = ResourceManager.GetObject("testPassedImage", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized string similar to Tests are columns. + /// + internal static string Tests_are_columns { + get { + return ResourceManager.GetString("Tests_are_columns", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tests are rows. + /// + internal static string Tests_are_rows { + get { + return ResourceManager.GetString("Tests_are_rows", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The following components are in simulation mode:. + /// + internal static string The_following_components_are_in_simulation_mode_ { + get { + return ResourceManager.GetString("The_following_components_are_in_simulation_mode_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T stop - mass msrmt. [s]. + /// + internal static string Time2MassMsrmt_chdr { + get { + return ResourceManager.GetString("Time2MassMsrmt_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T before setting flow [s]. + /// + internal static string TimeBeforeSettingFlow { + get { + return ResourceManager.GetString("TimeBeforeSettingFlow", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T flow stab. - start [s]. + /// + internal static string TimeFlow2Start_chdr { + get { + return ResourceManager.GetString("TimeFlow2Start_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Timeout. + /// + internal static string Timeout { + get { + return ResourceManager.GetString("Timeout", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T pump - start vlv. [s]. + /// + internal static string TimePump2StartV_chdr { + get { + return ResourceManager.GetString("TimePump2StartV_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to to. + /// + internal static string to { + get { + return ResourceManager.GetString("to", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Toler. red. [%]. + /// + internal static string Tol_red_pct_chdr { + get { + return ResourceManager.GetString("Tol_red_pct_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Transition sequence. + /// + internal static string Transition_sequence { + get { + return ResourceManager.GetString("Transition_sequence", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Transition - End. + /// + internal static string TransitionEnd_chdr { + get { + return ResourceManager.GetString("TransitionEnd_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Transitions. + /// + internal static string Transitions { + get { + return ResourceManager.GetString("Transitions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Transition - Start. + /// + internal static string TransitionStart_chdr { + get { + return ResourceManager.GetString("TransitionStart_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Turning direction. + /// + internal static string Turning_direction { + get { + return ResourceManager.GetString("Turning_direction", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type. + /// + internal static string Type { + get { + return ResourceManager.GetString("Type", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Uncertainty [%]. + /// + internal static string Uncertainty_pct_chdr { + get { + return ResourceManager.GetString("Uncertainty_pct_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unhandled error occured in . + /// + internal static string Unhandled_error_occured_in_ { + get { + return ResourceManager.GetString("Unhandled_error_occured_in_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unlock. + /// + internal static string UnlockBtnText { + get { + return ResourceManager.GetString("UnlockBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unselect current tank. + /// + internal static string Unselect_current_tank { + get { + return ResourceManager.GetString("Unselect_current_tank", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Up. + /// + internal static string UpBtnText { + get { + return ResourceManager.GetString("UpBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use {0}. + /// + internal static string Use_0 { + get { + return ResourceManager.GetString("Use_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to User. + /// + internal static string User { + get { + return ResourceManager.GetString("User", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to User code. + /// + internal static string User_code { + get { + return ResourceManager.GetString("User_code", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to User Login. + /// + internal static string User_Login { + get { + return ResourceManager.GetString("User_Login", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to User Management. + /// + internal static string User_Management { + get { + return ResourceManager.GetString("User_Management", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to User name. + /// + internal static string User_name { + get { + return ResourceManager.GetString("User_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Username. + /// + internal static string Username { + get { + return ResourceManager.GetString("Username", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This Username has already been taken. Please choose another one.. + /// + internal static string Username_taken { + get { + return ResourceManager.GetString("Username_taken", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Users. + /// + internal static string Users { + get { + return ResourceManager.GetString("Users", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Users and groups. + /// + internal static string Users_and_groups { + get { + return ResourceManager.GetString("Users_and_groups", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Valid until. + /// + internal static string Valid_until { + get { + return ResourceManager.GetString("Valid_until", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value. + /// + internal static string Value { + get { + return ResourceManager.GetString("Value", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Version. + /// + internal static string Version { + get { + return ResourceManager.GetString("Version", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Version {0}. + /// + internal static string VersionStr { + get { + return ResourceManager.GetString("VersionStr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Vertically. + /// + internal static string Vertically { + get { + return ResourceManager.GetString("Vertically", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Virtual bench sequence. + /// + internal static string Virtual_bench_sequence { + get { + return ResourceManager.GetString("Virtual_bench_sequence", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Volume. + /// + internal static string Volume { + get { + return ResourceManager.GetString("Volume", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Volume and error limit selection. + /// + internal static string Volume_and_error_selection { + get { + return ResourceManager.GetString("Volume_and_error_selection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Volume to tank. + /// + internal static string Volume_to_tank { + get { + return ResourceManager.GetString("Volume_to_tank", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Volume to tank exceeds the scale capacity. + /// + internal static string Volume_to_tank_exceeds_the_scale_capacity { + get { + return ResourceManager.GetString("Volume_to_tank_exceeds_the_scale_capacity", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Volume to tank is larger then the test volume. + /// + internal static string Volume_to_tank_is_larger_then_the_test_volume { + get { + return ResourceManager.GetString("Volume_to_tank_is_larger_then_the_test_volume", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Wait please. + /// + internal static string Wait_please { + get { + return ResourceManager.GetString("Wait_please", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Wait until {0} tank is empty. + /// + internal static string Wait_until_0_tank_is_empty { + get { + return ResourceManager.GetString("Wait_until_0_tank_is_empty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Warning. + /// + internal static string Warning { + get { + return ResourceManager.GetString("Warning", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Water. + /// + internal static string Water { + get { + return ResourceManager.GetString("Water", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Water Meter. + /// + internal static string Water_Meter { + get { + return ResourceManager.GetString("Water_Meter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Water meter data. + /// + internal static string Water_meter_data { + get { + return ResourceManager.GetString("Water_meter_data", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Water Meter Serial Numbers ans States. + /// + internal static string Water_Meter_SNs_States { + get { + return ResourceManager.GetString("Water_Meter_SNs_States", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Water Meter States. + /// + internal static string Water_Meter_States { + get { + return ResourceManager.GetString("Water_Meter_States", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Water meter types. + /// + internal static string Water_meter_types { + get { + return ResourceManager.GetString("Water_meter_types", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Water meters. + /// + internal static string Water_meters { + get { + return ResourceManager.GetString("Water_meters", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to State [liter]. + /// + internal static string WMState { + get { + return ResourceManager.GetString("WMState", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Year of production. + /// + internal static string Year_of_production { + get { + return ResourceManager.GetString("Year_of_production", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to yes. + /// + internal static string yes { + get { + return ResourceManager.GetString("yes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Yes. + /// + internal static string YesBtn { + get { + return ResourceManager.GetString("YesBtn", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Zeroing. + /// + internal static string Zeroing_chdr { + get { + return ResourceManager.GetString("Zeroing_chdr", resourceCulture); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Resources/Strings.cs.Designer.cs b/TBF_V2/Sources/TBF/TBF/Resources/Strings.cs.Designer.cs new file mode 100644 index 00000000..e69de29b diff --git a/TBF_V2/Sources/TBF/TBF/Resources/Strings.cs.resx b/TBF_V2/Sources/TBF/TBF/Resources/Strings.cs.resx new file mode 100644 index 00000000..ede51e3e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Resources/Strings.cs.resx @@ -0,0 +1,1320 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + <nic> + + + (offline) + + + O zkušební stolici Framework + + + Činnost + + + Přidat > + + + Přidat + + + Adresa + + + Nastavení probíhá + + + Správce + + + Okolní vlhkost + + + Okolní tlak + + + Okolní teplota + + + Neošetřená chyba + + + Schválení + + + Datum schválení + + + Schválení ID + + + Schválení info. + + + Schváleno + + + Uspořádání testovaných měřidel + + + Uspořádání testu + + + Uspořádání testů + + + Výstup: + + + Výstupní vodoměr + + + Výst. WM State + + + Výst. WM Seriové č. + + + Dostupné komponenty: + + + Dostupné výsledky + + + <Zpět + + + Váha + + + Stolice + + + Testovací stolice neběží, ale můžete změnit nastavení k vyřešení problému. + + + Název testu stolice konflikt, použijte jiný název, prosím + + + Parametry stolice + + + Datum sestavení {0} + + + Kalibrace Specialist + + + Chyba kamery + + + Zrušit + + + Vymazat výsledky + + + Zmazat + + + zavřít + + + Zavřít vyprazdňování ventil + + + Zavřít + + + Uzavření vstupního ventilu, vypnutí čerpadla + + + Studený + + + Kombinovaná měřidla + + + Kombinovaný + + + Komunikace + + + Komponent + + + Konfigurace + + + Konfigurovat + + + Konfigurace testovací stolice (vyžadováno heslo) + + + Potvrzení + + + Připojovací řetězec + + + Kopie + + + Copyright © 2013 - {0} + + + Opraveno + + + Vytvořit DB + + + Data + + + Nastavení databáze + + + Typ databáze + + + Datum a čas + + + Databáze byla úspěšně vytvořena! + + + Databáze bude přepsána + + + Hustota + + + Popis + + + Detekce dokončena + + + Detekce se nezdařila + + + Práh detekce [%] + + + Zařízení + + + dflt + + + Klapka + + + Chcete pokračovat? + + + Chcete uložit tento postup? + + + Dolů + + + Doba průtoku [s] + + + Doba PMax [s] + + + Doba [s] + + + Editace + + + Nouzové zastavení + + + Vyprázdnění + + + Vyprazdňování ({0}: Krok {1} / {2}) + + + Vyprázdnění nádrže + + + Vyprazdňovací ventil + + + Konec + + + Koncová podmínka + + + Konečný stav + + + Zadejte heslo + + + Err. cor. - [%] + + + Err. cor. +[%] + + + Err. Limit - [%] + + + Err. Limit + [%] + + + Chyba + + + Chyba při načítání uživatelů z databáze: + + + Chyba [%] + + + Chyba při vytváření databáze. Důvod: + + + Vyhodnocení + + + Výstup + + + NOK + + + Nepodařilo se vytvořit ukázkové databáze: + + + Nepodařilo se exportovat databáze: + + + Plnění + + + Naplnit zkušební stolici s vodou? + + + Dokončit + + + Výběr průtoku + + + Průtokoměr + + + Získat hmotnost vody v nádrži + + + Vedoucí laboratoře + + + Horizontálně + + + horký + + + Změny budou ztraceny. Chcete pokračovat? + + + Ignorovat + + + Ignorovat + + + Neplatné heslo + + + Neplatné uživatelské jméno, heslo, nebo stolice + + + iPERL Komunikace probíhá + + + Jazyk + + + Méně + + + Načítání postupu + + + Zámek + + + Protokolování + + + Hlavní: + + + Hlavní Vodoměr + + + Hlavní WM stav + + + Hlavní WM seriové č. + + + Specialista na údržbu + + + Vyprázdnit nádrž + + + Hmotnost + + + Změřte hmotnost + + + Změřeno + + + Měření hmotnosti + + + Zpráva + + + Zkušební metoda + + + Zkušební metoda výběru + + + Metrologická třída + + + Metrolog + + + Metrologie + + + Mode + + + Více + + + Jméno + + + PBench + + + PFeed + + + - Kopie + + + PQ + + + Procedura + + + PSens + + + Test + + + Nový přechodný název + + + Nová karta + + + Další> + + + ne + + + Žádná zkušební stolice v konfiguraci programu. + + + Ne + + + Nelze se připojit k databázi. + + + <není potřeba nic nastavovat> + + + Oznámení + + + Nr. + + + Nr. měřidla ve skupině: + + + OK + + + otevřít + + + Výstup + + + P up + + + P up end + + + P up start + + + P down + + + P down end + + + P down start + + + str. + + + Parametry + + + Mateřský komponent + + + Část + + + OK + + + Heslo + + + PID + + + Prosím, změňte následující nastavení: + + + Prosím, vyberte cyklus, test nebo žádný + + + Prosím zvolte postup + + + Prosím zvolte test + + + Prosím, vyberte zkušební stolici + + + Výkon [%] + + + Tlak max. [bar] + + + Tlak min. [bar] + + + Tlakoměr + + + Výběr tlaku + + + Tiskárna + + + Tiskárna + + + Postup + + + Postupy + + + Výrobce + + + Jméno výrobku + + + Restart programu vyžaduje použít některá nastavení + + + V činnosti + + + Vlastnosti + + + Protokol + + + Publikovat + + + Impulsy na litr + + + Čerpadlo + + + Výkon čerpadla [%] + + + Naplnit zkušební stolici s vodou? + + + Vyplachování + + + Vypouštění ({0}: Krok {1} / {2}) + + + Objednávka + + + Q od + + + Q od [l/h] + + + Q od [m3/h] + + + Q-Set Metoda + + + Q do + + + Q do [l / h] + + + Q do [m3/h] + + + Qfall + + + Qmin + + + Qn + + + Qrise + + + Qt + + + Otázka + + + Rychlost změny [%] + + + Ready + + + Režim reakce + + + Odkaz + + + Reg. ventil + + + Relativní Q z + + + Relativní Q do + + + zbývající čas + + + < Odebrat + + + << Odebrat vše + + + Odstranit + + + Odstranit Tab + + + Přejmenovat Tab + + + Počet opakování + + + Musíte restartovat, aby tyto změny proběhly + + + Opakovat + + + Opakovat připojení k databázi + + + Rozeznávání ROI probíhá + + + Screen + + + s + + + Výběr komponent + + + Vybrané výsledky + + + Sensor + + + Sensory + + + Sensory + + + Sériové číslo + + + Nastavte průtok + + + Nastavte cestu + + + Nastavení průtoku + + + Nastavení tlaku vody + + + Zobrazit konec cyklu + + + Současně s dalším krokem + + + Současně s předchozím krokem + + + Jednoduchý + + + Start + + + Zapněte čerpadlo + + + Spustit test + + + Spuštění systému + + + Spuštění kamery + + + Spuštění čerpadla + + + Zapnout ventil + + + Stav + + + Zastavte čerpadlo + + + Zastavit test + + + Zastavení + + + Zastavení průtoku před zkouškou s pevným startem + + + Potlačit WM vibrace + + + Přepínání detekce průtoku + + + Spínací body + + + T div + + + T in + + + T out + + + Cílové Q [m3/h] + + + Dehtování + + + Test + + + Zkušební stolice + + + Konfigurace komponentů zkušební stolice + + + Údaje testovací stolice + + + Specifikace databáze zkušební stolice + + + Zkušební stolice je řízena tímto počítačem + + + Název testu stolice + + + Číslo zkušebního stolice + + + Testovací stolice: + + + Test dokončen + + + Zkušební připojení + + + Test + + + Probíhá test + + + Test + + + Zkušební metoda + + + Zkušební metoda 2 + + + Jméno testu + + + příprava zkoušek + + + Zkušební start ({0}: Krok {1} / {2}) + + + Zkouška zastavení ({0}: Krok {1} / {2}) + + + Zkušební doba [s] + + + Tester + + + Testovací technik + + + Testy jsou sloupce + + + Testy jsou řádky + + + T stop - hmotnost msrmt. [s] + + + T průtok stab. - Start [s] + + + Čas vypršel + + + Tol. červený. [%] + + + Přechod - Konec + + + Přechody + + + Přechod - Start + + + Typ + + + Neošetřená chyba v + + + Odemknout + + + Nahoru + + + Uživatel + + + Uživatelský login + + + Uživatelské jméno + + + Uživatelské jméno + + + Toto uživatelské jméno již bylo použito. Prosím, vyberte jiné. + + + Uživatelé a skupiny + + + Verze + + + Verze {0} + + + Vertikálně + + + Objem a výběr mezní chyby + + + Varování + + + Voda + + + Vodoměr + + + Údaje vodoměru + + + Sériová čísla vodoměru a stavy + + + Stav vodoměrů + + + Typy vodoměrů + + + Vodoměry + + + S/N + + + Stav [litr] + + + ano + + + Ano + + + Nulování + + + Pokračovat v cyklu po tomto testu? + + + Kalibrace + + + Datum + + + Platná do + + + Uzavírání programu + + + Chcete ukončit Test Bench Framework? + + + Následující komponenty jsou v simulačním režimu: + + + Změny se nepodařilo uložit + + + Chyba při zapisování do souboru: + + + Zvolte jiné jméno přechodové sekvence + + + Test Bench Framework program se zavírá + + + Tisknout pouze dobré výsledky + + + Tisknout pouze poslední měření + + + Tisk výsledů vodoměrů + + + Uložit znovu + + + Predešlé výsledky + + + Odeslané + + + Zadejte údaje o protokolu + + + Ukládání a tisk výsledků + + + Zadejte údaje o vodoměrech + + + Chcete odstranit tento postup? + + + Obj. + + + Objednávka může mít maximálně {0} znaků + + + Měřič tepla + + + Senzory měřičů tepla + + + Vytvořil + + + Vkládání údajů + + + Obecné + + + Historie změn + + + Poslední změna + + + Testované typy měřičů + + + Poznámky + + + Tisk výsledků + + + Jméno postupu + + + Proces + + + Název protokolu + + + Plnění + + + Vypuštění + + + Ukládání výsledků + + + Stručný popis + + + Další instance programu Test Bench Framework je spuštěna. Uzavřete jí prosím s použitím 'Správce úloh'. + + + Zápatí + + + Hlavička + + + Montáž + + + Objem + + + Vytisknout + + + Chcete uložit změny? + + + Jméno a příjmení + + + Kód uživatele + + + Zrušit + + + Zopakovat + + + Znovu otevřít + + + Zobrazit + + + Číslo dávky + + + Při teplotě + + + Korekce hustoty + + + Uložit + + + Aktivujte / deaktivujte hlavice + + + Informace + + + Korekce + + + Objem na váhu + + + Objem na váhu je větší než zkušební objem + + + Výsledky dávky {0} + + + Objem na váhu je větší než kapacita váhy + + + od + + + do + + + Poznámka + + + Spustit stanici + + + Ukončete měření prosím + + + Obnovit + + + současný + + + Průtok + + + Tlak + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Resources/Strings.de.Designer.cs b/TBF_V2/Sources/TBF/TBF/Resources/Strings.de.Designer.cs new file mode 100644 index 00000000..e69de29b diff --git a/TBF_V2/Sources/TBF/TBF/Resources/Strings.de.resx b/TBF_V2/Sources/TBF/TBF/Resources/Strings.de.resx new file mode 100644 index 00000000..6517f983 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Resources/Strings.de.resx @@ -0,0 +1,1449 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Fehler + + + Fehler beim Laden der Benutzer aus der Datenbank. + + + Fehler beim Erzeugen der Bespiel-Ddaten. + + + Fehler beim Exportieren der Datenbank. + + + Ungueltiger Benutzername, Passwort oder Prüfstand + + + Passwort + + + Bitte wählen Sie einen Prüfstand aus. + + + Bitte starten Sie die Anwendung erneut um die Änderungen zu übernehmen. + + + Prüfstand + + + Benutzername + + + Warnung + + + geschl. + + + Umschaltung + + + Beh.Leeren + + + Name + + + offen + + + Pumpe + + + Dr ein + + + Dr aus + + + Q von + + + Q bis + + + IDM + + + Reg.Ventil + + + Waage + + + Messs. + + + T div + + + T ein + + + T aus + + + Drucksensor + + + Dauer [s] + + + nein + + + ja + + + PBank + + + PS + + + PQ + + + Prüfung + + + PMess + + + Prüfpunkt + + + - Kopie + + + Benutzername + + + Anmelden + + + Neu + + + Abbrechen + + + Kopieren + + + Abwärts + + + Bearbeiten + + + OK + + + Löschen + + + Aufwärts + + + Beenden + + + Ändern + + + Beschreibung + + + Prüfvorlage + + + Prüfvorlagen + + + Prüfpunkt + + + Prüfstrecke + + + Leeren + + + Fehl. Korr.- [%] + + + Fehl. Korr.+ [%] + + + Fehlergrenze - [%] + + + Fehlergrenze + [%] + + + Wasserzulauf + + + Prüfenvahren + + + Regelstrecke + + + Q von [l/h] + + + Q von [m3/h] + + + Q-Set Methode + + + Q bis [l/h] + + + Q bis [m3/h] + + + Reduktionsart + + + Wiederh. Nr. + + + Abtastsysteme + + + Prüfpunkt + + + Tol. Abzug [%] + + + Nullstellen (Ergebnisse) + + + Dauer [s] + + + Metr.Daten + + + Benutzer + + + Der Prüfstand ist nicht im Betrieb. Sie können die Einstellungen ändern, um das Problem zu lösen. + + + Der Prüfstandsname ist ungültig. Bitte wählen Sie einen anderen Namen. + + + Prüfstand konfigurieren (Passwort erforderlich) + + + Bestätigung + + + Korrigiert + + + Die Datenbank wurde erfolgreich erstellt. + + + Die vorhandene Datenbank wird überschrieben. + + + Möchten Sie fortfahren? + + + Möchten Sie den Prüfvorlage speichern? + + + Passwort eingeben. + + + Fehler beim Erzeugen der Datenbank. + + + Beenden + + + Ungültiges Passwort + + + Abschließen + + + Masse + + + Gemessen + + + Es ist keine Prüfstand in der Programmkonfiguration definiert. + + + Datenbankverbindung konnte nicht hergestellt werden. + + + Benachrichtigung + + + Nr. + + + Bitte ändern Sie die folgenden Einstellungen: + + + Eigenschaften + + + Datenbankverbindung wiederherstellen + + + Es trat ein unbehandelter Fehler auf in + + + (Getrennt) + + + Administrator + + + Kalibriertechniker + + + Laborleiter + + + Wartungstechniker + + + Messtechniker + + + Prüfer + + + Prüftechniker + + + Schließe das Entleerventil + + + Ermittle das Gewicht des Wassers im Behälter + + + Ignorieren + + + Laden des Prüfvorgangs + + + Behälter leeren + + + wiegen + + + Wählen Sie eine Prüfvorlage + + + Bitte wählen Sie eine Prüfung aus. + + + Befüllen + + + Fertig + + + setze Durchfluss + + + Setze Route + + + Starte die Pumpe + + + Starte die Prüfung + + + am stoppen + + + Stoppe die Pumpe + + + Stoppe die Prüfung + + + Tara setzen + + + Prüfung läuft + + + Prüfvorlage + + + < Zurück + + + Weiter > + + + <kein> + + + Abtastung + + + Prüfart + + + Ergebnise löschen + + + Konfigurieren + + + Die Anordnung der Zähler + + + Die Anordnung der Prüfpunkte + + + Horizontal + + + Prüfpunkte sind Spalten + + + Prüfpunkte sind Zeilen + + + Vertikal + + + Konfiguration + + + NiO + + + iO + + + Löschen + + + Behälter entleeren + + + Wiegen + + + Prüfdurchfluss einstellen + + + Prüfpunkt fertiggestellt + + + Prüfpunktvorbereitung + + + Prüfstand befüllen ({1}/{2}) + + + Prüfstand leeren ({0}/{1}) + + + Beenden + + + Umschaltpunkt suchen + + + Vorgang + + + Verlauf + + + Ende + + + Ziel Q [m3/h] + + + Zulassungszeichen + + + Metr. Klasse + + + Hersteller + + + Zählerdaten + + + Drucker + + + Version + + + Prüfstand Nr. + + + <nothing to configure> + + + Füllen mit Wasser ? + + + Nein + + + Frage + + + Ja + + + Prüfstand Parameter + + + Verbindungszeichenfolge + + + Datenbank erzeugen + + + Datenbank Typ + + + Prüfstand wird von diesem Computer gesteuert + + + Prüfstandsname + + + Teste Verbindung + + + Benutzer und Gruppen + + + Wasserzähler Daten + + + Wasserzähler Typen + + + Protokoll + + + Modus + + + Parameter + + + übergeordnete Komponente + + + Type + + + Prüfstandskomponenten Konfiguration + + + Übergänge + + + Komponente + + + Schwellwert [%] + + + Impulse pro Liter + + + Durchflussänderung [%] + + + Relativer Q von + + + Relativer Q bis + + + Ubergang - Ende + + + Ubergang - Start + + + Einstellung Durchfluss + + + Auswahl Prüfart + + + Auswahl Volumen und Fehlergrenzen + + + Filterschütteln + + + Prüfstand befüllen? + + + Meldung + + + Startventil + + + Prüfstand starten + + + zeit + + + s + + + Stab. Zeit [s] + + + weniger + + + mehr + + + Durchflussmesser + + + Teil + + + Nebenzähler + + + Eindstand + + + Hauptzähler + + + Protokoll + + + Qfall + + + Qsteig + + + Seriennummer + + + Stand + + + Umschaltpunkte + + + Daten + + + Nebenzählerstand + + + Hauptzählerstand + + + Nebenzählerseriennummer + + + Hauptzählerseriennummer + + + Hinzufügen + + + Justierung .... + + + Ergebnisse + + + Kamerafehler + + + Ergebnisse gehen verloren! Wollen sie fortfahren? + + + Verbund + + + Verbundwasserzähler + + + Erkennung erfolgt + + + Erkennung fehlgeschlagen + + + Gerät + + + Vorgabe + + + Not-Aus + + + Fehler [%] + + + Neue Tabelle + + + Neue Bezeichnung + + + PID-Regler + + + Leistung [%] + + + Drucker + + + Neustart erforderlich + + + Pumpe Leistung [%] + + + Entfernen + + + Tabelle entfernen + + + Alles entfernen + + + ROI-Erkennung läuft + + + Bildschirm + + + Ergebnisse ausgewählt + + + Einzel + + + Kamera Start + + + Durchfluss Anhalten + + + Grunddaten Spezifikation + + + Korrigierte Prüfung + + + Start Vorbereitung Prüfung + + + Stop Vorbereitung Prüfung + + + Zeit abgelaufen + + + WZ-Serienummer_Stand + + + Seriennummer + + + WZ_Stand + + + Dr ein ende + + + Dr ein start + + + Dr aus ende + + + Dr aus start + + + Sprache + + + Prüfstandsdaten + + + Komponenten: + + + Komponenten Auswahl + + + Datenbank Einstellungen + + + Prüfstände : + + + Info + + + Erstellt am {0} + + + © 2013 - {0} Sensus GmbH + + + Version {0} + + + Ein Ausnahmefehler ist aufgetreten! + + + Prüfvorlage {0} hinzugefügt + + + Prüfvorlage {0} bearbeitet + + + Unsicherheit [%] + + + Prüftisch + + + Wasserzulauf + + + Messsensoren + + + Ausgabe + + + Pfade + + + Kamera + + + Luftdichte [kg/m3] + + + Luftfeuchtigkeit + + + Umgebungsdruck + + + Umgebungstemperatur + + + Kalibrierung + + + Datum + + + Datum und Uhrzeit + + + Referenzmassendichte [kg/m3] + + + Gültig bis + + + Luftfeuchtigkeit + + + Umgebungsdruck + + + Umgebungstemperatur + + + Verbundwasserzähler {0} + + + Dauer [s]: + + + Masse dif. [kg]: + + + Wasserzähler {0} + + + Dr. un. + + + Dr. ob. + + + Impulse: + + + Referenzfehler [%]: + + + Ref.durchfluss [m3/h]: + + + Ref.Frequenz [Hz]: + + + Ref.Impulse: + + + Ref.Volumen [l]: + + + Reg.Ventilpos.: + + + Prüfdurchfluss Hi [m3/h]: + + + Prüfdurchfluss Lo [m3/h]: + + + Prüfimpulse: + + + Prüfvolumen [l]: + + + Speichern + + + Wasserzähler + + + Mit dem nächsten Prüfpunkt fortfahren? + + + Eichjahr + + + Montage + + + Schließen des Programms + + + Wollen Sie das TBF Programm beenden? + + + Die folgenden Komponenten sind im Simulationsmodus: + + + Änderungen können nicht gespeichert werden. + + + Fehler beim Schreiben in Datei: + + + Keine Ergebnisse zu drucken + + + Bitte wählen Sie anderen Übergangsekvenzname + + + TBF Programm schließt + + + Zulassung + + + Verbindung mit der Datenbank nicht möglich. + + + Drucken + + + Nur gute Ergebnidse drucken + + + Nur die letzte Messung drucken + + + Wasserzählerergebnisse drucken + + + Wieder speichern + + + Vorherige Ergebnisse + + + Versendet + + + Übergängsequenz + + + Virtualprüfstationsequenz + + + Bestellung + + + Geben Sie Protokolldaten + + + Geben Sie Wasserzähler Daten + + + Speichern und Drucken Ergebnisse + + + Anzahl Zähler in Gruppe + + + Zertifikat + + + Dichte + + + Ende + + + Bedingung für das Ende + + + Gedruckt + + + Bewerten + + + Veröffentlichen + + + Tabelle umbenennen + + + Möchten Sie den Prüfvorlage löschen? + + + Druck bis [bar] + + + Druck von [bar] + + + Einstellung Druck + + + Abpressdruck einstellen + + + Best. + + + schnell + + + Massemessmethode + + + Masse wiederh. + + + Massespanne [kg] + + + stabil + + + Wärmezähler + + + Wärmezählersensoren + + + T kalt + + + T einlass + + + T auslauf + + + T warm + + + Errstellt von + + + Zählerdateneingabe + + + Allgemein + + + Änderungen + + + letzte Änderung von + + + Wasserzellen + + + Bemerkung + + + Drucker + + + Prüfstrecke + + + Protokoll + + + Befüllen + + + Entwässern + + + Speichern auf Festplatte + + + Kurzbeschreibung + + + Das TBF Programm wurde bereits ausgeführt. Bitte schließen Sie das Programm im Taskmanager. + + + Fußzeile + + + Kopfzeile + + + Temperatur einstellen + + + Volumen + + + Druck wiederholen + + + Anzeigen + + + Dr delta + + + Zeit zur Durchfluseinst. [s] + + + Zeit Durchfl. IO-Start [s] + + + Zeit Pumpe-Startventil [s] + + + Waagebehälter Volumen prüfen + + + Pumpe starten + + + Wollen sie die Änderungen speichern? + + + Fehler beim Komponentestart '{0}':{1}{2} + + + Fehler beim Gerätstart '{0}':{1}{2} + + + Adresse + + + Kanal + + + Kommunikation + + + Basis Einheiten + + + Möchten Sie die Abschnit '{0}' löschen? + + + Möchten Sie diese Zelle kopieren in alle Zellen darunter? + + + Prüfvorlage + + + <other> + + + Solltemperatur [°C] + + + Prüfpunktvolumen uberschritt Behalter + + + Q3 (ja)/Qn (nein) + + + Warten bis {0} Behälter ist leer + + + Abrechen + + + Wiederholen + + + Wählen Sie Bilder aus und drücken Sie 'Wiederholen', um die Erkennung zu wiederholen + + + Richtung drehen + + + Im Uhrzeigersinn + + + Gegen den Uhrzeigersinn + + + ROI Daten + + + Wiederherstellen + + + Überbrückung + + + Temperatur + + + Stapel Nr. + + + Tara wiegen + + + Dichtekorektur + + + Bei Temperatur + + + Korrektur + + + Wassertemperaturregelung + + + Obere Temperaturgrenze + + + Untere Temperaturgrenze + + + Alle Prüfpunkte müssen durchgeführt werden + + + Manuelle Steuerung deaktivieren + + + Geschützte Prüfvorlage + + + von + + + bis + + + Bemerkung + + + Starten Sie den Prüfstand + + + Beenden Sie die Messungen bitte + + + Aktualisierung + + + aktuell + + + Durchfluss + + + Druck + + + Durchfluss nicht erreicht + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Resources/Strings.es.resx b/TBF_V2/Sources/TBF/TBF/Resources/Strings.es.resx new file mode 100644 index 00000000..067be8ac --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Resources/Strings.es.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Activity in Spanish + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Resources/Strings.fr.resx b/TBF_V2/Sources/TBF/TBF/Resources/Strings.fr.resx new file mode 100644 index 00000000..a40187cb --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Resources/Strings.fr.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Activité + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Resources/Strings.it.resx b/TBF_V2/Sources/TBF/TBF/Resources/Strings.it.resx new file mode 100644 index 00000000..80bfa721 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Resources/Strings.it.resx @@ -0,0 +1,1755 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Attività + + + conferma + + + vuoi salvare la procedura? + + + Errore + + + Errore durante il caricamento degli utenti dal database: + + + Impossibile creare un database di esempio: + + + impossibile esportare il database: + + + utente, parola d'ordine o banco non valido + + + Password + + + per favore selezionare un banco prova + + + è necessario riavviare per installare le modifiche + + + banco prova + + + nome utente + + + Attenzione + + + massimo X caratteri alfanumerici + + + Questo nome utente è già stato utilizzato. Prego utilizzarene un altro. + + + Chiudi + + + deviare + + + valvola di svuotamento + + + nome + + + aperto + + + pompa + + + P su + + + P giù + + + Q da [m3/h] + + + Q a [m3/h] + + + referenze + + + Reg. valvole + + + Bilance + + + sensore + + + T div + + + T dentro + + + T fuori + + + misuratore pressione + + + durata [s] + + + no + + + si + + + P banco + + + P alimentazione + + + PQ + + + procedura + + + Psens + + + test + + + - Copia + + + numero + + + massa + + + Aggiunta + + + Annulla + + + Chiudi + + + Chiuso + + + rimuovere + + + sbloccare + + + ok + + + flusso + + + pressione + + + Username o password non validi + + + nome utente + + + login utente + + + copia + + + Giù + + + Modifica + + + Su + + + Impossibile collegarsi al database + + + azzeramento (richiesta password) + + + uscita + + + ripetere la connessione al data base + + + Inserire password + + + Password non valida + + + conflitto nome banco prova sceglierne un altro + + + Il database è stato creato con successo! + + + il data base verrà sovrascritto + + + vuoi procedere? + + + notifica + + + nessu banco prova nella configurazione del programma + + + Descrizione + + + procedure + + + procedura + + + test + + + corretti + + + misurati + + + test + + + il banco prova non è in esecuzione tuttavia è possibile modificare le impostazioni per risolvere il problema + + + svuotamento + + + metodo Q-set + + + ripetere il numero + + + test + + + azzeramento + + + banco + + + Errore corr - [%] + + + errore corr + [%] + + + limite errore - [%] + + + limite errore + [%] + + + alimentazione + + + Uscite + + + Qda [l/h] + + + Q a [l/h] + + + tipo rosso + + + sensori + + + tolleranza rossa [%] + + + test time [s] + + + errore durante la creazione del data base. ragioni: + + + metrologia + + + modificare le seguenti impostazioni: + + + proprietà + + + Si è verificato un errore imprevisto in + + + utente + + + (offline) + + + Amministratore + + + esperto in calibrazione + + + capo del laboratorio + + + esperto di manutenzione + + + metrologo + + + tester + + + esperto in tester + + + chiudere la valvola di svuotamento + + + prendi la massa d'acqua nel serbatorio + + + Ignora + + + caricamento della procedura + + + svuotare il serbatoio + + + misurare la massa + + + per favore selezionare la procedura + + + per favore selezionare un test + + + spurgo + + + Pronto + + + impostare il flusso + + + imposta route + + + avviare la pompa + + + avviare il test + + + arrestare + + + arrestare la pompa + + + Arrestare il test + + + taratura + + + test in corso + + + indietro + + + finito + + + prossimo + + + Seleziona Portata + + + nome del test + + + metodo del test + + + Q relativo da + + + Q relativo a + + + target Q [m3/h] + + + metri composti + + + soglia di rilevazione [%] + + + tasso di cambio [%] + + + impulsi per litro + + + componente + + + <none> + + + selezione del metodo di prova + + + sensori + + + metodo di prova + + + selezione dei limiti di volume + + + cancellare i risultati + + + configurare + + + disposizioni dei contatori testati + + + disposizione dei test + + + orizzontalmente + + + le prove sono colonne + + + le prove sono righe + + + verticalmente + + + configurazione + + + nok + + + ok + + + cancellare + + + svuotare il serbatorio + + + misurazione il peso + + + impostazione del flusso + + + prova completata + + + prova in preparazione + + + spurgo {0}: passo {1}/{2} + + + svuotamento {0}: passo {1}/{2} + + + rilevamento del flusso di commutazione + + + progressi + + + seleziona un ciclo, un test o vuota + + + Info approvazione + + + classe metrologica + + + produttore + + + Qn + + + contatori acqua + + + stampa + + + versione + + + numero del banco prova + + + <niente da configurare> + + + riempire il banco prova con acqua? + + + no + + + domanda + + + + + + parametri del banco + + + stringa di connessione + + + Crea DB + + + tipo di data base + + + specifiche del data base del banco di prova + + + il banco prova è controllato da questo computer + + + nome del banco di prova + + + prove di connessione + + + utenti e gruppi + + + dati del contatore + + + tipo di contatore + + + registrazione + + + modalità + + + parametri del banco + + + genitori + + + tipo + + + configurazione dei componenti del banco di prova + + + transizioni + + + nuova scheda + + + rimuovi scheda + + + rinomina scheda + + + nuovo nome di transizione + + + energia [%] + + + rilevamento roi in corso + + + la rilevazione è stata completata + + + STOP di emergenza + + + fine transizione + + + inizio transizione + + + avviare le telecamere + + + inizio test {0}: passo {1}/{2} + + + arresto prova {0}: passo {1}/{2} + + + aggiungi > + + + Risultati disponibili: + + + < rimuovi + + + rimuovi tutto + + + seleziona risultati + + + sostituire i trilli WM + + + riempire il banco prova di acqua? + + + messaggio + + + avviare la valvola + + + dflt + + + arresto del flusso prima del test di avviamento fisso + + + contatore acqua + + + numerazione dei numeri di serie + + + stati del misuratore dell'acqua + + + N. Seriale + + + stato (litro) + + + la rilevazione non è riuscita + + + errore della fotocamera + + + avvio del sistema + + + tempo rimanente + + + s + + + t stop - massa di massa [s] + + + di meno + + + di più + + + è necessario riavviare il programma per installare alcune applicazioni + + + le modifiche verranno perse, vuoi procedere? + + + PID + + + misuratore di flusso + + + parte + + + tempo scaduto + + + composto + + + Dispositivo + + + stampante + + + schermo + + + singolo + + + Aux contatore acqua + + + aux stato contatore acqua + + + dati + + + stato finale + + + contatore principale + + + stato del contatore principale + + + protocollo + + + Qsbaglaita + + + Qalta + + + Numero Seriale + + + stato + + + spostamento dei punti + + + Aux numero seriale contatore acqua + + + numero seriale contatore acqua principale + + + potenza pompa [%] + + + aggiustamento in corso + + + errore [%] + + + avviamento della pompa + + + impostazione della pressione dell'acqua + + + pressione massima [bar] + + + pressione minima [bar] + + + selezione pressione + + + durata delle perdite [s] + + + durata Pmax [s] + + + Chidere imput valvola, spegnere la pompa + + + ordine acquisto + + + Umidità dell'ambiente + + + pressione dell'ambiente + + + Temperatura dell'ambiente + + + Approvazione + + + Data e ora + + + pagina + + + T flusso stab. Inizio [s] + + + Fine + + + inizio + + + @temperatura [°C] + + + densità + + + numero metri in un gruppo: + + + mostra la forma di fine ciclo + + + condizione finale + + + Comunicazione + + + principale: + + + Q minimo + + + Qt + + + acqua + + + nome prodotto + + + Indirizzo + + + Data di approvazione + + + ID approvazione + + + Approvato da + + + Valuta + + + pubblico + + + simultaneo con il passo successivo + + + simultaneo con il passo precedente + + + iPerl comunicazioni in corso + + + lingua + + + dati banco prova + + + componenti disponibili + + + selezionare componenti + + + impostazioni del data base + + + banchi prova + + + informazioni sul banco di prova + + + data di costruzione {0} + + + copyright © 2013 - {0} + + + versione {0} + + + Modifica utente + + + gruppi + + + gestione utenti + + + Si è verificato un errore imprevisto + + + Ignora + + + riprova + + + procedura {0} aggiunta + + + procedura {0} modificata + + + revisione + + + risultati + + + incertezza [%] + + + risultati precedenti + + + banco + + + alimentazione + + + sensori + + + produzione + + + percorso + + + ID + + + messa a fuoco + + + afferrare + + + dal vivo + + + chiusura del serbatoio + + + controllo della capacità del serbatoio + + + T prima di impostare il flusso [s] + + + T pompa inizio viv [s] + + + arrestare la valvola di flusso + + + continuare nel ciclo dopo questo test? + + + almeno uno dei parametri di Buoyancy non è valido\r\ncorreggerlo per favore + + + Informazioni di calibrazione non valida. Prego correggere + + + Q massimo + + + Certificato + + + lunghezza + + + massima pressione ammissibile + + + classe di temperatura + + + classe di sensibilità del profilo di flusso + + + montaggio + + + classe di perdita di pressione + + + inserire i numeri di serie alla fine + + + densità dell'aria [kg/m3] + + + calibrazione + + + Data + + + riferimento densità di massa [kg/m3] + + + valido fino a + + + umidità dell'aria + + + pressione dell'aria + + + Temperatura dell'aria + + + misuratore composto {0} + + + Errore: + + + tempo stimato [s]: + + + mass diff [kg]: + + + metri {0} + + + Pr giù + + + Pr su + + + impulsi: + + + Riferimento errore [%]: + + + riferimento flusso [m3/h]: + + + riferimento frequenza [Hz]: + + + riferimento impulsi + + + riferimento volume [l]: + + + posizionamento della valvola: + + + target flusso massimo [m3/h]: + + + target flusso minimo [m3/h]: + + + Target ref. count: + + + target volume [l]: + + + salva larghezza colonne + + + Anno di produzione + + + ausiliaria + + + principale + + + Chiudere il programma + + + vuoi uscire dall'impianto del banco prova? + + + i seguenti componenti sono in modalità simulazione: + + + Impossibile salvare le modifiche + + + Errore nella scrittura del file: + + + nessun risultato da stampare + + + scegli un altro nome nella sequenza di transizione + + + il programma di prova è in fase di chiusura + + + Impossibile collegarsi al database + + + Stampa + + + stampare solo buoni risultati + + + stampare solo le ultime misurazioni + + + stampare i risultati dei contatori + + + inviato + + + sequenza di transizione + + + sequenza virtruale del banco + + + immettere i dati del protocollo + + + immettere i dati del contatore + + + salvare e stampare i risultati + + + stampare + + + vuoi cancellare la procedura? + + + estensioni sensus + + + veloce + + + posizionamento della valvola + + + metodo di massa + + + l'ordine di acquisto deve avere massimo {0} caratteri + + + ripetizione di massa + + + estendere la massa [kg] + + + stabile + + + calorimetro + + + sensori del calorimetro + + + T freddo + + + T in ingresso + + + T in uscita + + + T caldo + + + P heat + + + Creato da + + + inserimento dati + + + generale + + + storia dei cambiamenti + + + ultimo cambiato da + + + tipi di contatori testati + + + note + + + stampa + + + nome del processo + + + processo + + + titolo del protocollo + + + inizio spurgo + + + fine spurgo + + + salvataggio risultati + + + Breve descrizione + + + T bagno + + + T m freddo + + + T m caldo + + + è in esecuzione un'altra istanza del programma, chiudere con Task Manager + + + piè di pagina + + + intestazione + + + T freddo da + + + T freddo a + + + T caldo da + + + T caldo a + + + opzione del contatore del calore + + + vuoi copiare questo valore di tutte le celle sotto questa cella? + + + T v freddo + + + T v caldo + + + impostazione della temperatura + + + energia + + + Volume + + + unità predefinite + + + Non valido {0} + + + richiesta + + + canale + + + nome del genitore + + + Componente {0} danneggiato. Risultati non stampati. + + + Componente {0} danneggiato. Risultati non salvati. + + + ITS-90 coefficienti di calibrazione + + + ITS-90 prove + + + resistenza + + + temperatura + + + ITS -27 coefficienti di calibrazione + + + uso {0} + + + coefficienti di calibrazione + + + impulsi per Kwh + + + valutare il volume + + + vuoi veramente eliminare la sequenza '{0}' ? + + + P delta + + + stampa ancora + + + mostrare + + + vuoi salvare le modifiche? + + + fasi di ciclo di resistenza + + + ciclo di resistenza + + + durata [ms] + + + eseguuire ciclo di resistenza + + + ultimo ciclo. Attendere per favore + + + attendere per favore + + + Il metodo {0} non può essere utilizzato + + + utenti + + + nome e cognome + + + codice utente + + + inviato + + + Errore dispositivo '{0}':{1}{2} + + + Errore componente '{0}':{1}{2} + + + Seleziona acqua FREDDA + + + Seleziona acqua BOLLENTE + + + Seleziona acqua CALDA + + + Deselezionare cisterna + + + T raffreddamento freddo + + + T raffreddamento bollento + + + T riscaldamento bollente + + + T raffreddamento caldo + + + T riscaldamento caldo + + + Altro + + + Temperatura richiesta [°C] + + + Settaggio temperatura acqua fredda rraffreddameno + + + Settaggio temperatura acqua bollente raffreddamento + + + Settaggio temperatura acqua bollente riscaldamento + + + Settaggio temperatura acqua calda raffreddamento + + + Settaggio temperatura acqua calda riscaldamento + + + Test volume eccede capacita' scala + + + Ripetere password + + + I campi"Password" e "Ripeti Password" sono diferenti. Reinseriscili perfavore. + + + Nuova Q + + + Aspetta fino a {0} la cisterna e' piena + + + Interrompi + + + Riprova + + + Seleziona immagini e premi Riprova per riprovare l'individuazione della Area di interesse + + + Senso orario + + + Senso antiorario + + + Dati dell' Area di Interesse + + + Senso di rotazione + + + Ripristina + + + Il percorso del banco non puo' essere caricato + + + Il percorso dell'alimentazione non puo' essere caricato + + + Il percorso dell'uscita non puo' essere caricato + + + Il percorso del sensore non puo' essere caricato + + + Tutti I tests devono essere completati + + + Procedura protetta + + + Drenare + + + Sessione + + + Bypass + + + Chiudere la copertura + + + {0} - chiudere la valvola di drenaggio + + + {0} - aprire la valvola di drenaggio + + + {0} - aspettare fino al riempimento della cisterna + + + Controllo manule disabilitato + + + Batch + + + Batch nr. + + + Contatore energia termica + + + {0} il percorso '{1}' usato da {2} test sara' rimosso.{3} + + + {0} il percorso '{1}' usato da {2} test sara' rinomina '{3}'. {4} + + + Vuoi aggiornare I test e le procedure collegate + + + Controllo temperatura dell'acqua + + + Limite temperatura alto [°C] + + + Limite temperatura basso [°C] + + + correzione + + + Fotocamera + + + Finire la misurazione perfavore + + + Avvio del banco prova + + + Errore impostazione del flusso + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Resources/Strings.pl.resx b/TBF_V2/Sources/TBF/TBF/Resources/Strings.pl.resx new file mode 100644 index 00000000..2d8ac104 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Resources/Strings.pl.resx @@ -0,0 +1,1605 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aktywność + + + <żaden> + + + (niedostępny) + + + & Dodaj> + + + Dodaj + + + Kalibracja w toku + + + Administrator + + + Wilgotność otoczenia + + + Ciśnienie otoczenia + + + Temperatura otoczenia + + + Zatwierdzenie + + + Info zatwierdzenia + + + Rozmieszczenie badanych wodomierzy + + + Układ testu + + + Układ testów + + + temperatura [degC] + + + We. + + + We. Wodomierz + + + We. Stan wodomierza + + + We. Nr fabryczny wodomierza + + + Dostępne wyniki: + + + < Powrót + + + Waga + + + Stanowisko pomiarowe + + + Stanowisko pomiarowe nie jest uruchomione, jednak aby rozwiązać problem można zmienić ustawienia. + + + Konflikt nazwy stanowiska pomiarowego, należy użyć innej nazwy + + + Parametry stanowiska + + + Specjalistyczna kalibracja + + + Błąd kamery + + + Anuluj + + + Usuń wyniki + + + Usuń + + + Zamknij + + + Zamykanie zawór opróżniania + + + Zamknij + + + Zamknięcie zaworu wejściowego, wyłączanie pompy + + + Wodomierze sprzężone + + + Sprzężone + + + Komunikacja + + + Element + + + Konfiguracja + + + Skonfiguruj + + + Skonfiguruj stanowisko pomiarowe (wymagane hasło) + + + Potwierdzenie + + + Parametry połączenia + + + Kopia + + + Poprawiono + + + Tworzenie bazy danych + + + Dane + + + Typ bazy danych + + + Data i czas + + + Baza danych została utworzona pomyślnie! + + + Baza danych zostanie nadpisana + + + Gęstość + + + Opis + + + Wykrywanie zakończone + + + Wykrywanie nieudane + + + Próg wykrywania [%] + + + Urządzenie + + + Przeszkoda + + + Zawór przerzutowy + + + Czy chcesz kontynuować? + + + Czy chcesz zapisać procedurę? + + + W dół + + + Czas trwania wycieku [s] + + + Czas trwania Pmax [s] + + + Czas trwania [s] + + + Edycja + + + STOP awaryjny + + + Opróżnianie + + + Opróżnianie ({0}: {1} krok / {2}) + + + Opróżnianie zbiornika + + + Zawór opróżniania + + + Koniec + + + Warunek końcowy + + + Stan końcowy + + + Wprowadź hasło + + + Bł. kor. - [%] + + + Bł. kor. + [%] + + + Bł. Limit - [%] + + + Bł. Limit + [%] + + + Błąd + + + Błąd podczas ładowania użytkowników z bazy danych: + + + Błąd [%] + + + Błąd podczas tworzenia bazy danych. Powód: + + + Wyjście + + + NOK + + + Nie udało się utworzyć bazy danych: + + + Nie udało się wyeksportować bazy danych: + + + Napełnianie + + + Napełnić stanowisko pomiarowe wodą? + + + Koniec + + + Przepływ + + + Wybór przepływu + + + Przepływomierz + + + Określenie masy wody w zbiorniku + + + Kierownik Laboratorium + + + Poziomo + + + Zmiany zostaną utracone. Czy chcesz kontynuować? + + + Zignorować + + + Nieprawidłowe hasło + + + Nieprawidłowy użytkownik, hasło lub stanowisko + + + Mniej + + + Ładowanie procedury + + + Blokowanie + + + Logowanie + + + Wodomierz główny + + + Stan wodomierza głównego + + + Nr fabryczny wodomierza głównego + + + Konserwator + + + Opróżnianie zbiornika + + + Masa + + + Pomiar masy + + + Zmierzona + + + Pomiar wagi + + + Wiadomość + + + Metoda sprawdzania + + + Wybór metody sprawdzania + + + Klasa metrologiczna + + + Legalizator + + + Metrologia + + + Tryb + + + Więcej + + + Nazwa + + + PBench + + + PFeed + + + - Kopia + + + PQ + + + Procedura + + + Psens + + + Test + + + Nowa nazwa przejścia + + + Nowa karta + + + Następna> + + + nie + + + Brak konfiguracji stanowiska w programie. + + + Nie + + + Nie można połączyć się z bazą danych. + + + <nic nie konfiguruj> + + + Zgłoszenie + + + Nr. + + + Nr. wodomierza w grupie: + + + OK + + + otwarte + + + Wyjście + + + P w górę + + + P do końca + + + P w górę start + + + P w dół + + + P w dół końca + + + P dół początek + + + Strona + + + Parametry + + + Nadrzędny + + + Część + + + OK + + + Hasło + + + PID + + + Proszę zmienić następujące ustawienia: + + + Proszę wybrać cykl, test lub opróżnianie + + + Proszę wybrać procedurę + + + Proszę wybrać test + + + Proszę wybrać stanowisko pomiarowe + + + Moc [%] + + + Ciśnienie + + + Ciśnienie Hi [bar] + + + Ciśnienie Lo [bar] + + + Miernik ciśnienia + + + Wybór ciśnienia + + + Drukarka + + + Drukarka + + + Procedura + + + Procedury + + + Producent + + + Dla zastosowania niektórych ustawień konieczne jest ponowne uruchomienie programu + + + Postęp + + + Właściwości + + + Zapiska + + + Impulsy na litr + + + Pompa + + + Moc pompy [%] + + + Napełnić stanowisko pomiarowe wodą? + + + Oczyszczanie + + + Czyszczenie ({0}: {1} krok / {2}) + + + Zamówienie + + + Q od + + + Q od [l/h] + + + Q od [m3/h] + + + Metoda Q-Set + + + Q do + + + Q do [l/h] + + + Q od [m3/h] + + + Qopad + + + Qn + + + Qwzras + + + Pytanie + + + Szybkość zmian [%] + + + Gotowy + + + Redukcja typu + + + Odniesienie + + + Reg. zawór + + + Względne Q od + + + Względne Q do + + + pozostały czas + + + Usuń + + + Usuń wszystko + + + Usuń + + + Usuń zakładkę + + + Zmień nazwę Zakładki + + + Powtórzenie nr. + + + Musisz ponownie uruchomić, aby zastosować zmiany + + + Ponów połączenie z bazą danych + + + Wykrywanie ROI w toku + + + Wykrywanie działa + + + Ekran + + + s + + + Wybrane wyniki: + + + Czujnik + + + Czujniki + + + Czujniki + + + Numer fabryczny + + + Ustaw przepływ + + + Ustaw linię pomiarową + + + Ustawienie przepływu + + + Ustawienie ciśnienia wody + + + Pokaż formularz końca cyklu + + + Pojedynczy + + + Start + + + Uruchomić pompę + + + Rozpocznij sprawdzanie + + + Uruchamianie systemu + + + Uruchamianie kamer + + + Uruchamianie pompy + + + Start zaworu + + + Stan + + + Zatrzymanie pompy + + + Zatrzymanie sprawdzania + + + Zatrzymanie + + + Zatrzymanie przepływu przed uruchomieniem ustalonego sprawdzania + + + Tłumienie wibracji wodomierza + + + Włączanie wykrywania przepływu + + + Punkty przełączania + + + T zaw. + + + T we + + + T wyj + + + Docelowe Q [m3/h] + + + Tarowanie + + + Punkt kontrolny + + + Stanowisko pomiarowe + + + Konfiguracja elementów stanowiska pomiarowego + + + Specyfikacja bazy danych stanowiska + + + Stanowisko pomiarowe jest sterowane przez komputer + + + Nazwa stanowiska pomiarowego + + + Numer stanowiska pomiarowego + + + Sprawdzanie zakończone + + + Test połączenia + + + Punkt kontrolny + + + Sprawdzanie w toku + + + Test skorygowany + + + Metoda sprawdzania + + + Metoda sprawdzania + + + Nazwa testu + + + Przygotowanie testu + + + Rozpoczęcie testu ({0}: krok {1}/{2}) + + + Koniec testu ({0}: krok {1}/{2}) + + + Czas testu [s] + + + Pracownik wykonujący testy + + + Specjalista ds. Testów + + + Testy są kolumnami + + + Testy są wierszami + + + T stop - masa msrmt. [s] + + + T stab przepływu - Start [s] + + + Koniec czasu + + + Toler. Czerwony. [%] + + + Przejście - Koniec + + + Przejście + + + Przejście - Początek + + + Typ + + + Wystąpił nieobsługiwany błąd w + + + Odblokować + + + W górę + + + Użytkownik + + + Login użytkownika + + + Nazwa użytkownika + + + Nazwa Użytkownika + + + Użytkownicy i grupy + + + Wersja + + + Pionowo + + + Wybór dopuszczalnej objętości i błędu + + + Ostrzeżenie + + + Obiekt + + + Dane z wodomierza + + + Numery seryjne wodomierzy oraz Stany + + + Stany wodomierzy + + + Typy wodomierzy + + + Wodomierze + + + Nr seryjny + + + Stan [l] + + + tak + + + tak + + + Zerowanie + + + Wersja {0} + + + Licznik ciepła + + + Czujniki licznika ciepła + + + Objętość + + + Główny: + + + Qmin + + + Qt + + + Woda + + + Nazwa produktu + + + Adres + + + Data zatwierdzenia + + + ID Zatwierdzenia + + + Zatwierdzono + + + Ocena + + + Opublikować + + + Jednocześnie z następującym krokiem + + + Jednocześnie z poprzednim krokiem + + + Komunikacja z iPERL w toku + + + Język + + + Dane stanowiska pomiarowego + + + Dostępne elementy: + + + Wybór elementu + + + Ustawienia bazy danych + + + Stanowisko pomiarowe + + + O Framework stanowiska pomiarowego + + + Data przygotowania {0} + + + Prawa autorskie © 2013 - {0} + + + Wystąpił nieobsługiwany błąd + + + Ignoruj + + + Spróbuj ponownie + + + Procedura {0} dodana + + + Procedura {0} zmieniona + + + Sprawdzenie + + + Wyniki + + + Niepewność [%] + + + Wstępne wyniki + + + Stanowisko + + + Zasilanie + + + Czujniki + + + Wyjście + + + Ścieżki + + + ID + + + Zogniskować + + + Przechwycić + + + Online + + + Kamera + + + Zamknięcie zbiornika + + + Sprawdzenie objętości zbiornika + + + T do ustawienia przepływu [s] + + + T pompa - start zaworu [s] + + + Stop zawór zwrotny + + + Kontynuować cykl po tym badaniu ? + + + Co najmniej jeden z parametrów wyporu nieważny \ r \ wymaga korekty. + + + Nieprawidłowa nivormacje o kalibracji. Proszę poprawić. + + + Qmax + + + Certyfikat + + + Długość + + + Mkasymalne dopuszczalne ciśnienia + + + Klasa temperaturowa + + + Klasu czułości i profilu przepływu + + + Montaż + + + Klasa straty ciśnienia + + + Wprowdź nr seryjny i zakończ + + + Gęstość otoczenia [kg/m3] + + + Kalibracja + + + Data + + + Gęstość wzorcowa masy [kg/m3] + + + Ważny do + + + Wilgotność otoczenia + + + Ciśnienie otoczenia + + + Temperatura otoczenia + + + Licznik sprzężony {0} + + + Czas obliczeniowy [s]: + + + Różnica masy [kg]: + + + Wodomierz {0} + + + Pr na dół + + + Pr do góry + + + Impulsy: + + + Zakres błedu [%] + + + Zakres przepływu [m3/h] + + + Zakres częstotliwości [Hz] + + + Zakres impulsów: + + + Zakres objętości [l] + + + Położenie zawaoru regulacyjnego: + + + Zadany przepływ max. [m3/h] + + + Zadany przepływ min. [m3/h] + + + Zadany zakres impulsów + + + Zadana objętość [l] + + + Zachować szerokość kolumn + + + Rok produkcji + + + Dodatkowy + + + Główny + + + Zamknięcie programu + + + Zamknąć Framework stanowiska ? + + + Następne elementy w cyklu modelowania: + + + Niemozliwe zachowanie zmian + + + Błąd zapisu pliku: + + + Brak wyników do wydruku + + + Proszę wybrać inną nazwę sekwencji przejścia + + + Program zamyka Framework stanowiska + + + Nie można połączyć się z bazą danych. + + + Wydruk + + + Drukuj tylko poprawne wyniki + + + Drukuj tylko ostatnie zmiany + + + Wydruk wyników woodmierzy + + + Jeszcze raz + + + Wysłano + + + Kolejność przejścia + + + Wirtualna kolejność ustawienia + + + Wprowadź dane protokołu + + + Wprowadź dane wodomierza + + + Zachowaj i wydrukuj wyniki + + + Wydrukowano + + + Czy usunąć tę procedurę + + + Rozszerzenia Sensus + + + szybko + + + PO + + + Metoda masowa + + + Zamówienie może posiadać max. Symboli {0} + + + Masowe powtórzenia + + + Zakres masy [kg] + + + stabilny + + + T zimna + + + T wejściowa + + + T wyjściowa + + + T gorąca + + + P licznik ciepła + + + Utworzono + + + Wprowadzanie danych + + + Podstawowe + + + Historia zmian + + + Zmieniono + + + Typy testowanych liczników + + + Uwagi + + + Drukuj + + + Nazwa procedury + + + Czynność + + + Nazwa protokołu + + + Oczyszczanie - Start + + + Oczyszczanie - Koniec + + + Zapamiętanie danych + + + Krótki opis + + + T ciepła + + + T m zimna + + + T m gorąca + + + Inny programu stanowiska jest uruchomiony. Proszę zamknąć go za pomocą menedżera zadań. + + + Stopka + + + Nagłówek + + + T zimna wyjście + + + T zimna wejście + + + T gorąca wyjście + + + T gorąca wejście + + + Opcje licznika ciepła + + + Skopiować tę wartość do wszystkich komórek poniżej tej komórki? + + + T v zimna + + + T v gorąca + + + Ustawienie temperatury + + + Energia + + + Jednostka domyślna + + + Niesitniejący {0} + + + Natychmiast + + + Kanał + + + Nazwa nadrzędna + + + Element {0} przestał odpowiadać. Wyniki nie będą wydrukowane. + + + Element {0} przestał odpowiadać. Wyniki nie będą zamamiętane. + + + ITS90 współczynniki kalibracji + + + ITS90 test + + + Rezystnacja + + + Temperatura + + + ITS27 współczynniki kalibracji + + + Wykorzystaj {0} + + + Współczynniki kalibracji + + + Impulsy dla kWh + + + Ocena objętości + + + Czy chcesz odrzucić kolejność {0} + + + P delta + + + Wydrukuj jeszcze raz + + + Pokaż + + + Zachować zmiany ? + + + Etapy cyklu trwałości + + + Cykl trwałości + + + Czas trwania [ms] + + + Wykonanie cyklu trwałości + + + Ostatni cykl. Proszę kontynuować. + + + Proszę kontynuować + + + Metoda {0} nie może być wykorzystana + + + Użytkownicy + + + Imię i Nazwisko + + + Kod użytkownika + + + Wiersz 1 + + + Krótki opis + + + Legalizator + + + Korekta + + + Uruchom stanowisko pomiarowe + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Resources/Strings.resx b/TBF_V2/Sources/TBF/TBF/Resources/Strings.resx new file mode 100644 index 00000000..a0b874f5 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Resources/Strings.resx @@ -0,0 +1,1849 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Confirmation + + + Do you want to save the procedure? + + + Error + + + Error loading users from the database: + + + Failed to create a sample database: + + + Failed to export the database: + + + Invalid user, password, or bench + + + Password + + + Please, select a test bench + + + You must restart to apply these changes + + + Test bench + + + User name + + + Warning + + + (max. _X_ alphanumeric characters) + + + This Username has already been taken. Please choose another one. + + + close + + + Diverter + + + Drain valve + + + Name + + + open + + + Pump + + + P up + + + P dn + + + Q from [m3/h] + + + Q to [m3/h] + + + Reference + + + Reg. valve + + + Scale + + + Sensor + + + T div + + + T in + + + T out + + + Pressure meter + + + Duration [s] + + + no + + + yes + + + PBench + + + PFeed + + + PQ + + + Procedure + + + PSens + + + Test + + + - Copy + + + Nr. + + + Add + + + Cancel + + + Close + + + Lock + + + Remove + + + Unlock + + + OK + + + Invalid username or password + + + Username + + + User Login + + + Copy + + + Down + + + Edit + + + Up + + + Cannot connect to the database. + + + Configure test benches (password required) + + + Exit + + + Retry connection to the database + + + Enter password + + + Invalid password + + + Test bench name conflict, use another name please + + + The database was successfully created! + + + The database will be overwritten + + + Do you want to proceed? + + + Notification + + + No test bench in the program configuration. + + + Description + + + Procedures + + + Procedure + + + Test + + + Corrected + + + Measured + + + Test + + + Test bench is not running, however you can change the settings to resolve the problem. + + + Draining + + + Q-Set Method + + + Repeats count + + + Test + + + Zeroing + + + Bench + + + Err. cor. - [%] + + + Err. cor. +[%] + + + Err. limit lo [%] + + + Err. limit hi [%] + + + Feeding + + + Output + + + Q from [l/h] + + + Q to [l/h] + + + Red. type + + + Sensors + + + Toler. red. [%] + + + Test time [s] + + + Error while creating the database. Reason: + + + Metrology + + + Please change the following settings: + + + Properties + + + Unhandled error occured in + + + User + + + (offline) + + + Administrator + + + Calibration Specialist + + + Head of Lab + + + Maintenance Specialist + + + Metrologist + + + Tester + + + Testing Specialist + + + Close emptying valve + + + Get mass of water in the tank + + + Ignore + + + Loading the procedure + + + Make tank empty + + + Measure the mass + + + Please select a procedure + + + Please select a test + + + Purging + + + Ready + + + Set flow + + + Set route + + + Start the pump + + + Start the test + + + Stopping + + + Stop the pump + + + Stop the test + + + Tarring + + + Test in progress + + + < Back + + + Finish + + + Next > + + + Flow Selection + + + Test name + + + Test method + + + Relative Q from + + + Relative Q to + + + Target Q [m3/h] + + + Compound meters + + + Detection threshold [%] + + + Rate of change [%] + + + Pulses per liter + + + Component + + + <none> + + + Test method selection + + + Sensors + + + Test method + + + Volume and error limit selection + + + + testFailedImage.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + testNotDoneImage.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + testPassedImage.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Clear results + + + Configure + + + Arrangements of tested meters + + + Arrangement of tests + + + Horizontally + + + Tests are columns + + + Tests are rows + + + Vertically + + + Configuration + + + NOK + + + OK + + + Clear + + + Draining the tank + + + Measuring the weight + + + Setting flow + + + Test completed + + + Test preparation + + + Purging ({0}: step {1}/{2}) + + + Draining ({0}: step {1}/{2}) + + + Switching flow detection + + + Activity + + + Progress + + + Please select a cycle, a test or empty + + + Approval info. + + + Metrological class + + + Producer + + + Qn [m3/h] + + + Water meters + + + Printer + + + Version + + + Test bench number + + + <nothing to configure> + + + Fill the test bench with water? + + + No + + + Question + + + Yes + + + Bench parameters + + + Connection string + + + Create DB + + + Database type + + + Test Bench Databases Specification + + + Test bench is controlled by this computer + + + Test bench name + + + Test connection + + + Users and groups + + + Water meter data + + + Water meter types + + + Logging + + + Mode + + + Parameters + + + Parent + + + Type + + + Test Bench Components Configuration + + + Transitions + + + New Tab + + + Remove Tab + + + Rename Tab + + + New transition name + + + Power [%] + + + ROI Detection in Progress + + + Detection completed + + + Emergency STOP + + + Transition - End + + + Transition - Start + + + Starting the cameras + + + Test start ({0}: step {1}/{2}) + + + Test stop ({0}: step {1}/{2}) + + + Add > + + + Available results: + + + < Remove + + + Remove all + + + Selected results + + + Supress WM trills + + + Fill the test bench with water? + + + Message + + + Start valve + + + dflt + + + Stopping flow before the fixed start test + + + Water Meter + + + Water Meter Serial Numbers ans States + + + Water Meter States + + + Serial Nr. + + + State [liter] + + + Detection failed + + + Camera error + + + Starting the system + + + remaining time + + + s + + + T stop - mass msrmt. [s] + + + Less + + + More + + + Program restart is required to apply some settings + + + Changes will be lost. Do you want to proceed? + + + PID + + + Flowmeter + + + Part + + + Timeout + + + Compound + + + Device + + + Printer + + + Screen + + + Single + + + Aux Water Meter + + + Aux. WM State + + + Data + + + End State + + + Main Water Meter + + + Main WM State + + + Protocol + + + Qfall + + + Qrise + + + Serial Number + + + State + + + Switching Points + + + Aux. WM Serial Nr. + + + Main WM Serial Nr. + + + Pump power [%] + + + Adjustment in progress + + + Error [%] + + + Starting the pump + + + Setting water pressure + + + Pressure Hi [bar] + + + Pressure Lo [bar] + + + Pressure Selection + + + Leak duration [s] + + + PMax duration [s] + + + Closing input valve, switching the pump off + + + Purchase order + + + Ambient humidity + + + Ambient pressure + + + Ambient temperature + + + Approval + + + Date and time + + + Page + + + T flow stab. - start [s] + + + End + + + Start + + + Density + + + Nr. meters in a group: + + + Show cycle end form + + + End condition + + + Communication + + + Aux: + + + Main: + + + Qmin [m3/h] + + + Qt [m3/h] + + + Water + + + Product name + + + Address + + + Approval date + + + Approval ID + + + Approved by + + + Evaluate + + + Publish + + + Simultaneous with next step + + + Simultaneous with previous step + + + iPerl Communication in progress + + + Language + + + Test bench data + + + Available Components: + + + Select Component + + + Database Settings + + + Test Benches: + + + About Test Bench Framework + + + Build date {0} + + + Copyright © 2013 - {0} + + + Version {0} + + + Edit User + + + Groups + + + User Management + + + An unhandled error occured + + + Ignore + + + Retry + + + Procedure {0} added. + + + Procedure {0} modified. + + + Revision + + + Results + + + Uncertainty [%] + + + Previous results + + + Bench + + + Feeding + + + Sensors + + + Output + + + Paths + + + ID + + + Grab + + + Live + + + Camera + + + Closing the tank + + + Checking tank capacity + + + T before setting flow [s] + + + T pump - start vlv. [s] + + + Stop backflow valve + + + Continue in the cycle after this test? + + + At least one of Buoyancy parameters is invalid,\r\ncorrect it please. + + + Invalid calibration information. Correct it please. + + + Qmax [m3/h] + + + Certificate + + + Length + + + Maximum admissible pressure + + + Temperature class + + + Flow profile sensitivity class + + + Mounting + + + Pressure loss class + + + Enter serial numbers at the end + + + Air density [kg/m3] + + + Calibration + + + Date + + + Ref. mass density [kg/m3] + + + Valid until + + + Air humidity + + + Air pressure + + + Air temperature + + + Compound meter {0} + + + Estimated time [s]: + + + Mass diff. [kg]: + + + Mass + + + Meter {0} + + + Pr down + + + Pr up + + + Pulses: + + + Ref. error [%]: + + + Ref. flow [m3/h]: + + + Ref. freq. [Hz]: + + + Ref.pulses: + + + Ref. volume [l]: + + + Reg. valve pos.: + + + Target flow high [m3/h]: + + + Target flow low [m3/h]: + + + Target ref. count: + + + Target volume [l]: + + + Save column widths + + + Year of production + + + Aux + + + Main + + + Closing the program + + + Do you want to exit the Test Bench Framework? + + + The following components are in simulation mode: + + + Cannot save changes + + + Error writing into file: + + + No results to print + + + Please choose another transition sequence name + + + Test Bench Framework program is closing + + + Cannot connect to the database + + + Print + + + Print only good results + + + Print only the last measurement + + + Print watermeter results + + + Save again + + + Sent + + + Transition sequence + + + Virtual bench sequence + + + Enter protocol data + + + Enter water meter data + + + Saving and printing results + + + Printed + + + Do you want to delete the procedure? + + + Sensus extensions + + + fast + + + PO + + + Mass method + + + Purchase order may have max {0} characters + + + Mass repeats + + + Mass spread [kg] + + + stable + + + Heat meter + + + Heat meter sensors + + + T cold + + + T inlet + + + T outlet + + + T warm + + + PHeat + + + Created by + + + Data entry + + + General + + + History of changes + + + Last changed by + + + Meter types tested + + + Notes + + + Printing + + + Procedure name + + + Process + + + Protocol title + + + Purge - Begin + + + Purge - End + + + Saving results + + + Short description + + + T bath + + + T m cold + + + T m warm + + + Another instance of Test Bench Framework program is running. Please, close it using Task Manager. + + + Footer + + + Header + + + T cold from + + + T cold to + + + T warm from + + + T warm to + + + Heat meter options + + + Do you want to copy this value to all cells below this cell? + + + T v cold + + + T v warm + + + Setting temperature + + + Energy + + + Volume + + + Default units + + + Invalid {0} + + + Prompt + + + Channel + + + Parent name + + + Component {0} crashed. Results not printed. + + + Component {0} crashed. Results not saved. + + + ITS-90 calibration coefficients + + + ITS-90 test + + + Resistance + + + Temperature + + + ITS-27 calibration coefficients + + + Use {0} + + + Calibration coefficients + + + Pulses per kWh + + + Evaluate volume + + + Do you really want to delete sequence '{0}' ? + + + P delta + + + Print again + + + Show + + + Do you want to save changes? + + + Endurance cycle steps + + + Endurance cycle + + + Duration [ms] + + + Endurance cycle execution + + + Last cycle, wait please. + + + Wait please + + + Method {0} cannot be used + + + Users + + + Full name + + + User code + + + Failed to initialize device '{0}':{1}{2} + + + Failed to initialize component '{0}':{1}{2} + + + Select COLD water + + + Select HOT water + + + Select WARM water + + + Unselect current tank + + + T cold cooling + + + T hot cooling + + + T hot heating + + + T warm cooling + + + T warm heating + + + Other + + + Required temperature [°C] + + + Set cold water cooling temperature + + + Set hot water cooling temperature + + + Set hot water heating temperature + + + Set warm water cooling temperature + + + Set warm water heating temperature + + + Test volume exceeds the scale capacity + + + Repeat password + + + Fields 'Password' and 'Repeat password' are different. Retype them please. + + + New Q + + + Wait until {0} tank is empty + + + Abort + + + Retry + + + Select images and press Retry to retry RoI detection + + + Clockwise + + + Counterclockwise + + + ROI Data + + + Turning direction + + + Restore + + + Cannot load bench path + + + Cannot load feeding path + + + Cannot load output path + + + Cannot load sensor path + + + All tests must be completed + + + Protected procedure + + + Drain + + + Session + + + Bypass + + + Close the cover + + + {0} - close the drain valve + + + {0} - open the drain valve + + + {0} - wait until the tank is empty + + + Manual control disabled + + + Batch + + + Batch nr. + + + Heat meters + + + {0} path '{1}' used by {2} tests will be removed.{3} + + + {0} path '{1}' used by {2} tests will be renamed to '{3}'.{4} + + + Do you want to update related tests and procedures? + + + RFID communication failed + + + Head was disabled by the user + + + '{0}' activity failed ({1}) !!! + + + Save + + + Control water temp. + + + Temp. lim. hi + + + Temp. lim. lo + + + Resetting scales + + + Scale communication error + + + Scale communication timeout + + + Density correction + + + At temperature + + + Legalizator + + + Activate / Deactivate Heads + + + Information + + + Correction + + + Graphs + + + Volume to tank + + + Volume to tank is larger then the test volume + + + Results of batch {0} + + + Volume to tank exceeds the scale capacity + + + from + + + to + + + Flow meter temperature range does not fit this test conditions + + + Next test volume + + + Remark + + + Enable 'Remark' + + + Press OK to start the bench + + + Start the test bench + + + Finish measurements please + + + Refresh + + + current + + + Flow + + + Pressure + + + + + + Flow adjustment failed + + + Component class + + + Parameter + + + Value + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Resources/Strings.ro.resx b/TBF_V2/Sources/TBF/TBF/Resources/Strings.ro.resx new file mode 100644 index 00000000..d3a5a96b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Resources/Strings.ro.resx @@ -0,0 +1,828 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + <none> + + + (offline) + + + Despre test + + + Proces + + + Adauga + + + Nou + + + Adresa + + + Calibrare + + + Administrator + + + C.mediue:Umiditate + + + C.mediue:Presiune + + + C.mediue:Temperatura + + + Eroare + + + Inapoi + + + Balanta + + + Stand + + + Renunta + + + stergere rezultate + + + Stergere + + + Inchide + + + Inchide vana de golire + + + Inchide + + + se inchide vana de alimentare, se opreste pompa + + + rece + + + Contor combinat + + + Combinat + + + Comunicatie + + + Componenta + + + Configuratie + + + Configurare + + + Configurarea instalatie( necesar parola) + + + Confirmare + + + String conexiune + + + Copiere + + + Creare BD + + + Data + + + Setare baza de date + + + Tip baza de date + + + Data si timpul + + + Baza de data a fost creata + + + Baza de date va fi suprascrisa + + + Densitate + + + Descriere + + + Aparat + + + Deviator + + + Doriri sa continuati? + + + Doriti sa salvati procedura? + + + Jos + + + Scurgere_timp [s] + + + Pmax_timp[s] + + + Durata [s] + + + Editare_utilizator + + + Editare + + + STOP-AVARIE + + + Golire + + + Golire vas masurare + + + Introduceti parola + + + Eroare. cor. - [%] + + + Eroare. cor. +[%] + + + Eroare. Limit - [%] + + + Eroare. Limita + [%] + + + Eroare + + + Eroare utilizator + + + Eroarea [%] + + + Eroare creare baza de date + + + Evaluare + + + Iesire + + + Resp + + + Alimentare + + + Umpleti instalatia cu apa? + + + Sfarsit + + + Debit + + + Selectare debit + + + Debitmetru + + + Se determina masa apei din vas + + + Grupuri + + + Sef Laborator + + + Orizontal + + + fierbinte + + + Rezultatele se vor pierde. Doriti sa continuati? + + + Ignora + + + Ignora + + + Parola incorecta + + + Utilizator sau parola incorecta + + + Limba + + + mai putin + + + Incarcarea procedurii + + + Bloca + + + Specialist intretinere + + + Goliti vasul + + + Masa + + + (max. _X_ caractere alfanumerice) + + + Cantarire masa + + + Cantarit + + + Cantarire + + + Mesaj + + + Metoda verificare + + + Selectare metoda verificare + + + Clasa metrologica + + + Metrolog + + + Date Metr. + + + Mod + + + mai mult + + + Nume + + + Copie + + + Procedura + + + Nu + + + Conectare esuata la baza de date + + + <nimic de configurat> + + + Notificare + + + Nr. + + + Nr. contoare intr-un grup + + + OK + + + Deschis + + + Parametri + + + Parola + + + PID + + + Va rugam schimbati urmatoarele setari + + + Putere [%] + + + Presiune + + + Presiune max [bar] + + + Presiune min [bar] + + + Senzor presiune + + + Selectare domen. Pres + + + Imprimanta + + + Imprimanta + + + Procedura + + + Proceduri + + + Producator + + + Se impune repormirea programului pentru a validarea noilor setari + + + in curs + + + Caracteristici + + + impuls pe litru + + + Pompa + + + Putere pompa + + + Alimentati cu apa instalatia? + + + Alimentare + + + Umplere instalatie + + + Q de la [l/h] + + + Q de la [m3/h] + + + Q-Metoda Selectata + + + Q pana la + + + Q pana la [l/h] + + + Q pana la [m3/h] + + + Qn + + + Qt + + + Intrebare + + + Variatie debit [%] + + + Referinta + + + vana reglare + + + Timp + + + Elimina + + + Elimina toate + + + Stergere + + + Stergere tabele + + + Redenumire tabel + + + Nr. repetari + + + Pentru validarea modificarilor trebuie sa reporniti aplicatia + + + Reincercati + + + Reincercati conecxiunea la baza de date + + + Ecranare + + + Selectare componente + + + Rezultatele selectate: + + + Senzor + + + senzori + + + Sistemul senzori + + + Numar serie + + + Setare debit + + + Reglare debit verificare + + + Reglare presiune apa + + + Porneste pompa + + + Pornire verificare + + + Initializare sistem + + + Pornire pompa + + + deschide valva + + + Stop pompa + + + Stop verificare + + + oprire + + + Debit setat Q [m3/h] + + + Tarare + + + Debitul de verificare + + + Instalatia + + + Configurare componente instalatie + + + Date Instlatie + + + Instalatia este asistata de acest PC + + + Nume instalatie + + + Nr. Instalatie + + + Instalatii: + + + Verificare efectuata + + + debit verificare + + + Verificare in curs + + + Metoda verificare + + + Nume verificare + + + Pregatire verificare + + + Start pregatire verif. + + + Stop pregatire verif. + + + Durata + + + Metrolog + + + Metrolog: + + + Expert + + + debitele de verificare_coloane + + + debitele de verificare_linii + + + Stabilizare [s] + + + T stab debit start[s] + + + Timeout + + + Tol verificare + + + sfarsit-pregatire + + + Pregatiri + + + Start-Pregatire + + + Tip + + + A aparut o eroare in + + + Modificare + + + Sus + + + Utilizator + + + Logare utilizator + + + Administrare utilizatori + + + Nume utilizator + + + Nume utilizator + + + Acest nume de utilizator este deja folosit. Va rugam alegeti alt nume. + + + Utilizatori si grupuri + + + Versiunea + + + Versiunea + + + Vertical + + + Selectarea volumului si limitei de erori + + + Atentie + + + Contor de apa + + + Date contor de apa + + + Seria contoarelor + + + Tip contor de apa + + + Contoare de apa + + + seria + + + da + + + da + + + resetare + + + Volum + + + Corectii + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Resources/Strings.ru.resx b/TBF_V2/Sources/TBF/TBF/Resources/Strings.ru.resx new file mode 100644 index 00000000..5fb2658f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Resources/Strings.ru.resx @@ -0,0 +1,1602 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Активность + + + Подтверждение + + + Хотите сохранить процедуру? + + + Ошибка + + + Ошибка при загрузке пользователей из базы данных: + + + Не удалось создать базу данных: + + + Не удалось экспортировать базу данных: + + + Неверный пользователь, пароль, или установка + + + Пароль + + + Пожалуйста, выберите поверочную установку + + + Необходимо перезагрузить, чтобы применить эти изменения + + + Поверочная установка + + + Имя пользователя + + + Предупреждение + + + закрыть + + + Клапан + + + Выпускной клапан + + + Имя + + + открыть + + + Насос + + + P вверх + + + P вниз + + + Q от [м3/ч] + + + Q до [м3/ч] + + + Ссылка + + + Рег. вентиль + + + Весы + + + Датчик + + + T разн + + + T вх + + + T вых + + + Измеритель давления + + + Продолжительность [с] + + + нет + + + да + + + Pbench + + + PFeed + + + PQ + + + Процедура + + + PSens + + + Тест + + + - Копировать + + + + + + Масса + + + Добавить + + + Отмена + + + Закрыть + + + Заблокировать + + + Удалить + + + Разблокировать + + + OK + + + Расход + + + Давление + + + Имя пользователя + + + Логин пользователя + + + Копировать + + + Вниз + + + Редактировать + + + Вверх + + + Не удается подключиться к базе данных. + + + Тестовая конфигурация установки (требуется пароль) + + + Выход + + + Восстановить соединение с базой данных + + + Введите пароль + + + Неверный пароль + + + Имя поверочной установки неверно, используйте другое имя, пожалуйста + + + База данных была успешно создана! + + + База данных будет перезаписана + + + Вы хотите продолжить? + + + Уведомление + + + Нет настройки поверочной установки в конфигурации программы. + + + Описание + + + Процедуры + + + Процедура + + + Тест + + + Исправлено + + + Измерено + + + Тест + + + Поверочная установка не запущена, однако вы можете изменить настройки, чтобы решить эту проблему. + + + Выпуск + + + Метод быстрой установки + + + Повторить номер + + + Тест + + + Обнуление + + + Установка + + + Err. cor. - [%] + + + Err. cor. +[%] + + + Err. Limit - [%] + + + Err. Limit + [%] + + + Подача + + + Выход + + + Q от [л/ч] + + + Q до [л/ч] + + + Тип сокращ. + + + Датчики + + + Toler. red. [%] + + + Время теста [с] + + + Ошибка при создании базы данных. Причина: + + + Метрология + + + Пожалуйста, измените следующие параметры: + + + Свойства + + + Неизвестная ошибка в + + + Пользователь + + + (не в сети) + + + Администратор + + + Специалист по калибровке + + + Руководитель лаборатории + + + Специалист по техобслуживанию + + + Метролог + + + Тестировщик + + + Специалист по тестированию + + + Закрыть выпускной клапан + + + Получить массу воды в резервуаре + + + Отклонить + + + Процедура загрузки + + + Оборожнить бак + + + Измерьте массу + + + Пожалуйста, выберите процесс + + + Пожалуйста, выберите тест + + + Очистка + + + Готов + + + Установить расход + + + Установить путь + + + Запустить насос + + + Запустить тест + + + Остановка + + + Остановите насос + + + Остановите тест + + + Тарирование + + + Тест запущен + + + < Назад + + + Завершить + + + Дальше > + + + Выбор расхода + + + Название испытания + + + Метод испытания + + + Относительный Q от + + + Относительный Q до + + + Заданный Q [м3/ч] + + + Комбинированные счетчики + + + Порог [%] + + + Скорость изменения [%] + + + Импульсов на литр + + + Компонент + + + <нет> + + + Выбор метода испытаний + + + Датчики + + + Метод испытания + + + Объем и предел погрешности + + + Очистить результаты + + + Конфигурировать + + + Расположение испытуемых счетчиков + + + Расположение испытаний + + + Горизонтально + + + Испытания столбцов + + + Испытания строк + + + Вертикально + + + Конфигурация + + + NOK + + + OK + + + Очистить + + + Опорожнение бака + + + Измерение веса + + + Настройка расхода + + + Тест завершен + + + Подготовка теста + + + Промывка ({0}: шаг {1}/{2}) + + + Слив ({0}: шаг {1} / {2}) + + + Переключение потока + + + Прогресс + + + Пожалуйста, выберите цикл, тест или пустой + + + Информация об утверждении + + + Метрологический класс + + + Производитель + + + Qn + + + Счетчики воды + + + Принтер + + + Версия + + + Номер поверочной установки + + + <нечего настраивать> + + + Заполнить установку водой? + + + Нет + + + Вопрос + + + Да + + + Установка параметров + + + Строка подключения + + + Создание БД + + + Тип базы данных + + + Спецификация базы данных поверочной установки + + + Поверочная установка управляется этим компьютером + + + Имя поверочной установки + + + Тестовое соединение + + + Пользователи и группы + + + Данные счетчика воды + + + Тип счетчика воды + + + Логирование + + + Режим + + + Параметры + + + Parent + + + Тип + + + Конфигурация компонентов установки + + + Переходы + + + Новая вкладка + + + Удалить вкладку + + + Переименовать вкладку + + + Новое имя перехода + + + Мощность [%] + + + ROI обнаружение в процессе + + + Обнаружение завершено + + + Аварийная остановка + + + Переход - Конец + + + Переход - Старт + + + Запуск камер + + + Запуск теста ({0}: шаг {1}/{2}) + + + Остановка теста ({0}: шаг {1}/{2}) + + + Добавить > + + + Доступные результаты + + + < Удалить + + + << Удалить все + + + Выбанные результаты + + + Подавить WM дребезг + + + Заполнить установку водой? + + + Сообщение + + + Включить клапан + + + dflt + + + Остановка расхода перед испытанием с фиксированным стартом + + + Счетчик воды + + + Счетчик воды серийный номер и состояние + + + Счетчик воды состояние + + + Серийный № + + + Статус [литров] + + + Обнаружение не удалось + + + Ошибка камеры + + + Запуск системы + + + оставшееся время + + + с + + + T stop - mass msrmt. [s] + + + Меньше + + + Больше + + + Перезапустите программу, чтобы применить некоторые настройки + + + Изменения будут потеряны. Вы хотите продолжить? + + + PID + + + Расходомер + + + Часть + + + Время истекло + + + Комбинированный + + + Устройство + + + Принтер + + + Экран + + + Единый + + + Доп. счетчик воды + + + Статус доп.счетчика + + + Данные + + + Конечное состояние + + + Главный счетчик воды + + + Статус главного счетчика + + + Протокол + + + Qповыш + + + Qпониж + + + Серийный номер + + + Состояние + + + Точки переключения + + + Сер. № доп. счетчика + + + Сер. № главн. счетчика + + + Мощность насоса [%] + + + Настройка выполняется + + + Погрешность [%] + + + Запуск насоса + + + Настройка давления воды + + + Давление макс. [бар] + + + Давлением мин. [бар] + + + Выбор давления + + + Продолжительность расхода [с] + + + Продолжительность Pмакс [с] + + + Закрытие впускного клапана, выключение насоса + + + Заказ + + + Относительная влажность окружающей среды + + + Относительное давление + + + Температура окружающей среды + + + Утверждение + + + Дата и время + + + Страница + + + T стаб.расхода. - старт [с] + + + Конец + + + Старт + + + температура [°C] + + + Плотность + + + № счетчиков в группе + + + Показать конец цикла + + + Конечное состояние + + + Соединение + + + Доп. + + + Главн: + + + Qmin + + + Qt + + + холодный + + + горячий + + + Вода + + + Наименование продукта + + + Адрес + + + Дата утверждения + + + ID Утверждения + + + Утверждено + + + Оценка + + + Публиковать + + + Одновременно со следующим шагом + + + Одновременно с предыдущим шагом + + + Осуществляется связь с iPerl + + + Язык + + + Данные поверочной установки + + + Доступные компоненты: + + + Выбрать компонент + + + Настройки Базы данных + + + Поверочные установки + + + О Framework поверочной установки + + + Дата подготовки {0} + + + Copyright © 2013 - {0} + + + Версия {0} + + + Произошла необрабатываемая ошибка + + + Отклонить + + + Повтор + + + Процедура {0} добавлена. + + + Процедура {0} изменена. + + + Ревизия + + + Результаты + + + Неопределенность [%] + + + Предварительные результаты + + + Установка + + + Подача + + + Датчики + + + Выход + + + Пути + + + ID + + + Сфокусировать + + + Захватить + + + Онлайн + + + Закрытие бака + + + Проверка емкости бака + + + T до настройки расхода [с] + + + T насос - старт кл. [с] + + + Остановить обратный клапан + + + Продолжить цикл после этого теста? + + + По крайней мере один параметр является недействительным, исправьте его. + + + Неверная информация калибровки. Исправьте это, пожалуйста. + + + Qmax + + + Сертификат + + + Длина + + + Максимальное допустимое давление + + + Температурный класс + + + Класс чувствительности к профилю потока + + + Монтаж + + + Класс потери давления + + + Ввести серийный номер и завершить + + + Плотность воздуха [кг/м3] + + + Калибровка + + + Дата + + + Эталонная плотность массы [кг/м3] + + + Годен до + + + Влажность воздуха + + + Давление воздуха + + + Температура воздуха + + + Комбинированный счетчик {0} + + + Расчетное время [с]: + + + Mass diff. [kg]: + + + Счетчик {0} + + + Pr down + + + Pr up + + + Импульсы: + + + Эт. отклонение [%]: + + + Эт. расход[m3/h]: + + + Эт.частота [Hz]: + + + Эт.импульсы: + + + Эт.объем [л]: + + + Полож.рег.вент.: + + + Заданный расход максимальный [м3/ч]: + + + Заданный расход минимальный [м3/ч]: + + + Target ref. count: + + + Заданный объем [л]: + + + Сохранить ширину столбцов + + + Год производства + + + Дополнительный + + + Главный + + + Закрытие программы + + + Хотите завершить Framework поверочной установки? + + + Следующие компоненты в режиме моделирования: + + + Невозможно сохранить изменения + + + Ошибка записи в файл: + + + Нет результатов для печати + + + Выберите другое имя последовательности перехода + + + Программа закрывает Framework поверочной установки + + + Не удается подключиться к базе данных + + + Печатать + + + Печатать только хорошие результаты + + + Печатать только последние измерения + + + Печатать результатов водосчетчиков + + + Снова + + + Отправлено + + + Последовательность перехода + + + Виртуальная последовательность установки + + + Введите данные протокола + + + Введите данные водосчетчика + + + Сохранить и распечатать результаты + + + Распечатано + + + Хотите удалить эту процедуру? + + + расширения Sensus + + + быстро + + + PO + + + Массовый метод + + + Заказ может иметь максимум символов {0} + + + Массовые повторы + + + Диапазон масс [кг] + + + стабильный + + + Теплосчетчик + + + Датчики теплосчетчика + + + T холодн + + + T вх + + + T вых + + + T горяч + + + PHeat + + + Создано + + + Ввод данных + + + Основные + + + История изменений + + + Изменено + + + Типы испытываемых счетчиков + + + Заметки + + + Печать + + + Наименование процедуры + + + Процесс + + + Название протокола + + + Очистка - Начало + + + Очистка - Конец + + + Сохранение результатов + + + Краткое описание + + + T bath + + + T m хол + + + T m гор + + + Другой экземпляр Test Bench Framework работает. Пожалуйста, закройте его с помощью "Диспетчер задач". + + + Нижний колонтитул + + + Заголовок + + + T хол.от + + + T хол.до + + + T гор.от + + + T гор.до + + + Опции теплосчетчика + + + Вы хотите скопировать это значение для всех ячеек ниже этой ячейки? + + + T v хол + + + T v гор + + + Настройка температуры + + + Энергия + + + Объем + + + Единицы по умолчанию + + + Недействительный {0} + + + Подсказка + + + Канал + + + Parent name + + + Компонент {0} перестал отвечать. Результаты не печатаются. + + + Компонент {0} перестал отвечать. Результаты не сохранены. + + + ITS-90 калибровочные коэфициенты + + + ITS-90 тест + + + Сопротивление + + + Температура + + + ITS-27 калибровочные коэфициенты + + + Используйте {0} + + + Калибровочные коэфициенты + + + Импульсов на кВтч + + + Оценка объема + + + Вы действительно хотите удалить последовательность '{0}'? + + + P дельта + + + Печатать снова + + + Показать + + + Хотите сохранить изменения? + + + Endurance Этапы цикла + + + Цикл на износостойкость + + + Продолжительность [мс] + + + Выполнение цикла на износостойкость + + + Последний цикл, подождите пожалуйста. + + + Подождите, пожалуйста + + + Метод {0} не может быть использован + + + Пользователи + + + Имя и фамилия + + + Код пользователя + + + P вверх конец + + + P вверх начало + + + P вниз конец + + + P вниз начало + + + Q от + + + Q до + + + Продолжается распознавание + + + Строка 1 + + + Метод испытаний 2 + + + Краткое описание + + + Коррекция + + + Сброс весов + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Resources/Strings.sk.resx b/TBF_V2/Sources/TBF/TBF/Resources/Strings.sk.resx new file mode 100644 index 00000000..2784b1c3 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Resources/Strings.sk.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Činnosť + + + Zrušiť + + + Združený + + + Združené vodomery + + + Chyba + + + Jazyk + + + Áno + + + Hlavica bola vypnutá používateľom + + + Zlyhala RFID komunikácia + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Resources/Strings.zh-CN.Designer.cs b/TBF_V2/Sources/TBF/TBF/Resources/Strings.zh-CN.Designer.cs new file mode 100644 index 00000000..e69de29b diff --git a/TBF_V2/Sources/TBF/TBF/Resources/Strings.zh-CN.resx b/TBF_V2/Sources/TBF/TBF/Resources/Strings.zh-CN.resx new file mode 100644 index 00000000..c954521a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Resources/Strings.zh-CN.resx @@ -0,0 +1,1188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + <无> + + + (离线) + + + 关于校验台框架 + + + 活动 + + + 加入 Add> + + + 添加 Add + + + 地址 + + + 调整正在进行 + + + 管理员 + + + 环境湿度 + + + 环境压力 + + + 环境温度 + + + 未处理的错误发生 + + + 批准 + + + 批准日期 + + + 认证身份 + + + 审批信息 + + + 批准人 + + + 已测试水表安排 + + + 测试安排 + + + 温度[°C] + + + 辅助: + + + 辅助水表 + + + 辅助水表状态 + + + 辅助水表序列号 + + + 可用组件: + + + 可用的结果: + + + <Back 返回 + + + 平衡 + + + 工作台 + + + 校验台不在运行,但你可以更改设置来解决问题。 + + + 试验台名称冲突,请使用其他名称 + + + 工作台参数 + + + 构建日期 {0} + + + 校准专员 + + + 相机错误 + + + 取消 Cancel + + + 清除结果 + + + 清除 Clear + + + close + + + 关闭放空阀 + + + 关闭 Close + + + 关闭输入阀,关闭水泵 + + + + + + 组合水表 + + + 组合的 + + + 通讯 + + + 部件 + + + 配置 + + + 设置 + + + 设置校验台(需要密码) + + + 确认 + + + 连接字符串 + + + 复制 Copy + + + 版权所有 ©2013 - {0} + + + 更正 + + + 创建数据库 + + + 数据 + + + 数据库设置 + + + 数据库类型 + + + 日期和时间 + + + 数据库创建成功! + + + 该数据库将被覆盖 + + + 密度 + + + 描述 + + + 检测完成 + + + 检测不合格 + + + 检测阈值[%] + + + 设备 + + + 错误 + + + 分流 + + + 要继续吗? + + + 是否要保存该程序? + + + 向下 Down + + + 泄漏持续时间[秒] + + + 最大压力持续时间[秒] + + + 持续时间[秒] + + + 编辑 Edit + + + 紧急停止 + + + 排空 + + + 排空({0}:步骤 {1}/{2}) + + + 排空水箱 + + + 排空阀门 + + + 结束 + + + 结束条件 + + + 结束状态 + + + 输入密码 + + + 错误 修正 - [%] + + + 错误 修正 + [%] + + + 错误范围 - [%] + + + 错误范围 + [%] + + + 错误 Error + + + 从数据库加载用户错误: + + + 错误[%] + + + 建立数据库出错。原因: + + + 评估 + + + 退出 Exit + + + NOK + + + 无法创建一个数据库样例: + + + 无法导出数据库: + + + 进料 + + + 将校验台装满水? + + + 完成 Finish + + + 流量 + + + 流量选择 + + + 流量计 + + + 从水箱中获取水的质量 + + + 实验室负责人 + + + 横向 + + + + + + 更改将丢失。想继续吗? + + + 忽略 + + + 忽略 Ignore + + + 无效的密码 + + + 无效的用户名,密码,或工作台 + + + 正在进行Iperl通信 + + + 语言 + + + 少 Less + + + 加载程序 + + + 锁定 Lock + + + 日志 + + + 主要的 + + + 主要水表 + + + 主要水表状态 + + + 主要水表序列号 + + + 维护专员 + + + 排空水箱 + + + 质量 + + + 测量质量 + + + 已测量的 + + + 测量重量 + + + 信息 + + + 测试方法 + + + 测试方法选择 + + + 计量等级 + + + 计量者 + + + 计量 + + + 模式 + + + 更多 More + + + 名称 + + + 压力台 + + + 压力输入 + + + - 复制 + + + PQ + + + 程序 Procedure + + + pSENS + + + 测试 Test + + + 新的转换名 + + + 新标签 New + + + 下一页 Next> + + + 没有 no + + + 程序中未设置校验台。 + + + 没有 No + + + 无法连接到数据库。 + + + <未设置> + + + 通知 Notification + + + 数量 + + + 一组中的水表数量: + + + 好 OK + + + open + + + 输出 + + + 升高压力 + + + 结束升高压力 + + + 开始升高压力 + + + 降低压力 + + + 结束降低压力 + + + 开始降低压力 + + + + + + 参数 + + + 主体 + + + 部分 + + + 好 OK + + + 密码 + + + PID + + + 请更改以下设置: + + + 请选择一个周期,测试或放空 + + + 请选择一个过程 + + + 请选择一个测试 + + + 请选择一个校验台 + + + 功率[%] + + + 压力 + + + 压力高值[bar] + + + 压力低值[bar] + + + 压力表 + + + 压力选择 + + + 以前的结果 + + + 打印机 + + + 打印机 + + + 程序 + + + 程序{0}添加。 + + + 程序{0}修改。 + + + 程序 + + + 制造者 + + + 产品名称 + + + 程序需要重新启动以应用某些设置 + + + 进度 + + + 属性 + + + 协议 + + + 发布 + + + 每升脉冲 + + + 水泵 + + + 水泵功率[%] + + + 将校验台装满水? + + + 净化 + + + 净化({0}:步骤{1}/{2}) + + + 采购订单 + + + Q起始点 [l/h] + + + Q起始点 [m3/h] + + + Q-设置方法 + + + Q终止点 [l/h] + + + Q终止 [m3/h] + + + Q下降 + + + Qmin + + + Qn + + + Q上升 + + + Qt + + + 问题 + + + 变化率[%] + + + 准备完毕 + + + 完成类型 + + + 参考 + + + 调节阀门 + + + Q相对值起始点 + + + Q相对值终止点 + + + 剩余时间 + + + <&删除 + + + << 删除所有 + + + 删除 Remove + + + 删除标签 Remove Tab + + + 重命名标签 Rename Tab + + + 重复次数 + + + 必须重新启动以使改变生效 + + + 重试 + + + 重试数据库连接 Retry + + + 修改 + + + 进行中的ROI检测 + + + 屏幕 + + + + + + 选择组件 + + + 已选结果 : + + + 传感器 + + + 传感器 + + + 传感器 + + + 序列号 + + + 设置流量 + + + 设置路径 + + + 设置流量 + + + 设置水压 + + + 展示循环和形态 + + + 同时进行以下步骤 + + + 同时进行之前步骤 + + + 单个的 + + + 启动 + + + 启动水泵 + + + 开始测试 + + + 启动系统 + + + 启动相机 + + + 启动水泵 + + + 开启阀门 + + + 状态 + + + 停止水泵 + + + 停止测试 + + + 停止 + + + 设定的开始测试前停止水流 + + + 抑制水表颤音 + + + 切换流量检测 + + + 切换点 + + + T转换 + + + T 入 + + + T出 + + + 目标Q值[m3/h] + + + 涂上焦油 + + + 测试 + + + 校验台 + + + 校验台组件配置 + + + 校验台数据 + + + 校验台数据库说明 + + + 校验台由该计算机控制 + + + 校验台名称 + + + 测试台编号 + + + 校验台: + + + 测试完成 + + + 测试连接 + + + 测试 + + + 测试进行中 + + + 测试 + + + 测试方法 + + + 测试名称 + + + 测试准备 + + + 测试开始({0}:步{1}/{2}) + + + 测试停止({0}:步{1}/{2}) + + + 测试时间[秒] + + + 测试者 + + + 测试专员 + + + 测试列 + + + 测试行 + + + T停止 - [秒] + + + T - 启动[秒] + + + 超时 + + + 弦误差。红色。 [%] + + + 转换 - 结束 + + + 转换 + + + 转换 - 启动 + + + 类型 + + + 不确定性[%] + + + 未处理的错误发生在 + + + 解锁 Unlock + + + 向上 Up + + + 用户 + + + 用户登录 + + + 用户名 + + + 用户名 + + + 用户和组别 + + + 版本 + + + 版本 {0} + + + 垂直 + + + 音量和误差区间选择 + + + 警告 Warning + + + + + + 水表 + + + 水表数据 + + + 水表序列号和状态 + + + 水表状态 + + + 水表类型 + + + 水表 + + + 序列号: + + + 状态[升] + + + 是的 yes + + + 是的 Yes + + + 归零 + + + 工作台 Bench + + + 供给 Feeding + + + 传感器 Sensors + + + 输出 Output + + + 工作台 - 路径 + + + 重点 + + + 抓取 + + + 现场的 + + + 相机 + + + 创建者 + + + 输入数据 + + + 总体情况 + + + 变更历史记录 + + + 最后修改者 + + + 测试仪表型号 + + + 记录 + + + 打印结果 + + + 程序名 + + + 进程 + + + 方案标题 + + + 清除 - 开始 + + + 清除 - 结束 + + + 写入结果 + + + 简短描述 + + + 体积 + + + 更正 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Resources/TestFailedImage.png b/TBF_V2/Sources/TBF/TBF/Resources/TestFailedImage.png new file mode 100644 index 00000000..efe0770a Binary files /dev/null and b/TBF_V2/Sources/TBF/TBF/Resources/TestFailedImage.png differ diff --git a/TBF_V2/Sources/TBF/TBF/Resources/TestFailedImage2.png b/TBF_V2/Sources/TBF/TBF/Resources/TestFailedImage2.png new file mode 100644 index 00000000..332a071e Binary files /dev/null and b/TBF_V2/Sources/TBF/TBF/Resources/TestFailedImage2.png differ diff --git a/TBF_V2/Sources/TBF/TBF/Resources/TestNotDoneImage.png b/TBF_V2/Sources/TBF/TBF/Resources/TestNotDoneImage.png new file mode 100644 index 00000000..1a42b7e5 Binary files /dev/null and b/TBF_V2/Sources/TBF/TBF/Resources/TestNotDoneImage.png differ diff --git a/TBF_V2/Sources/TBF/TBF/Resources/TestPassedImage.png b/TBF_V2/Sources/TBF/TBF/Resources/TestPassedImage.png new file mode 100644 index 00000000..5441ae6b Binary files /dev/null and b/TBF_V2/Sources/TBF/TBF/Resources/TestPassedImage.png differ diff --git a/TBF_V2/Sources/TBF/TBF/Resources/TestPassedImage2.png b/TBF_V2/Sources/TBF/TBF/Resources/TestPassedImage2.png new file mode 100644 index 00000000..1a6ef098 Binary files /dev/null and b/TBF_V2/Sources/TBF/TBF/Resources/TestPassedImage2.png differ diff --git a/TBF_V2/Sources/TBF/TBF/Resources/empty.png b/TBF_V2/Sources/TBF/TBF/Resources/empty.png new file mode 100644 index 00000000..2c81abce Binary files /dev/null and b/TBF_V2/Sources/TBF/TBF/Resources/empty.png differ diff --git a/TBF_V2/Sources/TBF/TBF/Resources/sensus-logo.png b/TBF_V2/Sources/TBF/TBF/Resources/sensus-logo.png new file mode 100644 index 00000000..c7e8a468 Binary files /dev/null and b/TBF_V2/Sources/TBF/TBF/Resources/sensus-logo.png differ diff --git a/TBF_V2/Sources/TBF/TBF/Resources/switch-off.png b/TBF_V2/Sources/TBF/TBF/Resources/switch-off.png new file mode 100644 index 00000000..57a850ef Binary files /dev/null and b/TBF_V2/Sources/TBF/TBF/Resources/switch-off.png differ diff --git a/TBF_V2/Sources/TBF/TBF/Resources/switch-on.png b/TBF_V2/Sources/TBF/TBF/Resources/switch-on.png new file mode 100644 index 00000000..8adaea77 Binary files /dev/null and b/TBF_V2/Sources/TBF/TBF/Resources/switch-on.png differ diff --git a/TBF_V2/Sources/TBF/TBF/SampleConfig/SQLite.db b/TBF_V2/Sources/TBF/TBF/SampleConfig/SQLite.db new file mode 100644 index 00000000..5b8154fc Binary files /dev/null and b/TBF_V2/Sources/TBF/TBF/SampleConfig/SQLite.db differ diff --git a/TBF_V2/Sources/TBF/TBF/SampleConfig/config.xml b/TBF_V2/Sources/TBF/TBF/SampleConfig/config.xml new file mode 100644 index 00000000..af847058 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/SampleConfig/config.xml @@ -0,0 +1,61 @@ + + + en + + + Test Bench + true + + MySql + SERVER=localhost; DATABASE=testbench; UID=root; PASSWORD=; CHARSET=utf8; + + + MySql + SERVER=localhost; DATABASE=testbench-r; UID=root; PASSWORD=; CHARSET=utf8; + + + + Test Bench + 1 + 988.2008 + 20 + 25 + 75 + 5 + 1250 + 750 + false + 200 + 100 + 850 + 500 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + false + false + Vertically + Rows + 0 + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/SampleConfig/log4netConfig.xml b/TBF_V2/Sources/TBF/TBF/SampleConfig/log4netConfig.xml new file mode 100644 index 00000000..9b386fb9 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/SampleConfig/log4netConfig.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TBF_V2/Sources/TBF/TBF/Screens/GraphsTabPageCtrl.cs b/TBF_V2/Sources/TBF/TBF/Screens/GraphsTabPageCtrl.cs new file mode 100644 index 00000000..12332a3b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Screens/GraphsTabPageCtrl.cs @@ -0,0 +1,355 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using System.Drawing; +using System.IO; +using System.Windows.Forms; +using TBF.Resources; +using TBF.UiBridge; +using GraphLib; +using log4net; + +namespace TBF.Screens +{ + public partial class GraphsTabPageCtrl : UserControl + { + static readonly ILog log = LogManager.GetLogger(typeof(GraphsTabPageCtrl)); + + + static readonly GraphInfo[] SupportedGraphs = new GraphInfo[] { + new GraphInfo { FileName = "Flow", Caption = string.Format("Q [m3/h]") }, + new GraphInfo { FileName = "Pressure up", Caption = string.Format("Pr up [bar]") }, + new GraphInfo { FileName = "Pressure down", Caption = string.Format("Pr dw [bar]") }, + new GraphInfo { FileName = "Temperature up", Caption = string.Format("T up [°C]") }, + new GraphInfo { FileName = "Temperature down", Caption = string.Format("T dw [°C]") }, + new GraphInfo { FileName = "Temperature div", Caption = string.Format("T di [°C]") }, + new GraphInfo { FileName = "Div start", Caption = string.Format("Div start") }, + new GraphInfo { FileName = "Div end", Caption = string.Format("Div end") }, + }; + + + PlotterGraphPaneEx.LayoutMode layoutMode; + CheckBox[] checkBoxes; + string selectedGraphsPath; + int selectedBatchNr; + string selectedTestName; + + public GraphsTabPageCtrl() + { + InitializeComponent(); + + /// checkBoxes array must be initialized before other actions + checkBoxes = new CheckBox[] { checkBox1, checkBox2, checkBox3, checkBox4, checkBox5, checkBox6, checkBox7, checkBox8 }; + + Localize(); + + UpdateCheckBoxesVisibility(); + + layoutMode = GraphLib.PlotterGraphPaneEx.LayoutMode.NORMAL; /// Default value + if (Program.LocalSettings != null) + { + checkBox1.Checked = Program.LocalSettings.Graph1_On; + checkBox2.Checked = Program.LocalSettings.Graph2_On; + checkBox3.Checked = Program.LocalSettings.Graph3_On; + checkBox4.Checked = Program.LocalSettings.Graph4_On; + checkBox5.Checked = Program.LocalSettings.Graph5_On; + checkBox6.Checked = Program.LocalSettings.Graph6_On; + checkBox7.Checked = Program.LocalSettings.Graph7_On; + checkBox8.Checked = Program.LocalSettings.Graph8_On; + layoutMode = Program.LocalSettings.GraphsLayoutMode; /// Override the default value + } + + layoutModeComboBox.Text = layoutMode.ToString(); + for (PlotterGraphPaneEx.LayoutMode mode = 0; mode <= PlotterGraphPaneEx.LayoutMode.TILES_HOR; mode++) + { + layoutModeComboBox.Items.Add(mode.ToString()); + } + + UpdateTestsHistory(testsHistoryTreeView); + + selectedGraphsPath = null; + + //Bridge.ProcessDataHandler += delegate(object sender, ProcessDataEventArgs args) + //{ + // if (InvokeRequired) + // { + // Invoke(new EventHandler(OnProcessData), sender, args); + // } + // else OnProcessData(sender, args); + //}; + } + + //void OnProcessData(object sender, ProcessDataEventArgs args) + //{ + + // if (!paused && isRunning == true) + // { + // try + // { + // gPane.starting_idx += Math.Min(RichTextBoxFinds.BenchControl.StateMachine.; + // UpdateScrollBar(); + // gPane.Invalidate(); + // } + // catch { } + // } + //} + + void Localize() + { + refreshButton.Text = Strings.Refresh; + for (int i = 0; i < checkBoxes.Length; i++) + { + if (i < SupportedGraphs.Length) + { + checkBoxes[i].Text = SupportedGraphs[i].Caption; + } + } + } + + void UpdateCheckBoxesVisibility() + { + for (int i = 0; i < checkBoxes.Length; i++) + { + checkBoxes[i].Visible = (i < SupportedGraphs.Length); + } + } + + private void refreshButton_Click(object sender, EventArgs e) + { + UpdateTestsHistory(testsHistoryTreeView); + } + + void UpdateTestsHistory(TreeView treeView) + { + try + { + string[] batches = Directory.GetDirectories(Program.GraphsDir); + treeView.Nodes.Clear(); + for (int i = batches.Length - 1; i >= Math.Max(0, batches.Length - 20); i--) + { + string b = batches[i]; + string batchNrSstr = Path.GetFileName(b); + string rootNodeName = Path.GetFileName(b); + if ((TBF.BenchControl.Sequences.ProcessData.BatchRslts != null) && rootNodeName.Equals(TBF.BenchControl.Sequences.ProcessData.BatchRslts.Batch.BatchNr.ToString())) + { + rootNodeName = Strings.current; + } + TreeNode node = new TreeNode(rootNodeName); + node.Tag = null; + treeView.Nodes.Add(node); + string[] tests = Directory.GetDirectories(b); + foreach (var t in tests) + { + string testNameStr = Path.GetFileName(t); + TreeNode subnode = new TreeNode(testNameStr); + node.Nodes.Add(subnode); + string[] repetitions = Directory.GetDirectories(t); + if (repetitions.Length == 1) + { + subnode.Tag = string.Format("{0}~{1}~{2}", repetitions[0], batchNrSstr, testNameStr); + } + else if (repetitions.Length > 1) + { + subnode.Tag = null; + foreach (var r in repetitions) + { + string repetStr = Path.GetFileName(r); + TreeNode subsubnode = new TreeNode(repetStr); + subsubnode.Tag = string.Format("{0}~{1}~{2}/{3}", r, batchNrSstr, testNameStr, repetStr); + subnode.Nodes.Add(subsubnode); + } + } + else + { + subnode.Tag = null; + } + } + } + } + catch (Exception exc) + { + log.ErrorFormat("UpdateTestsHistory() failed: {0}", exc.Message); + } + } + + + private void testsHistoryTreeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) + { + if (e.Node.Tag is string) + { + string[] fields = (e.Node.Tag as string).Split(new char[]{'~'}); + selectedGraphsPath = fields[0]; + selectedBatchNr = int.Parse(fields[1]); + selectedTestName = fields[2]; + ShowGraphs(plotterDisplayEx, selectedGraphsPath, selectedBatchNr, selectedTestName); + } + } + + + void ShowGraphs(PlotterDisplayEx display, string path, int batchNr, string testName) + { + Color[] colors = { Color.DarkRed, + Color.DarkSlateGray, + Color.DarkCyan, + Color.DarkGreen, + Color.DarkBlue , + Color.DarkMagenta, + Color.DeepPink, + Color.DarkGreen }; + + float[] gridY = { 0.0002f, 0.0005f, 0.001f, 0.002f, 0.005f, 0.01f, 0.02f, 0.05f, 0.1f, 0.2f, 0.5f, 1, 2, 5, 10, 20, 50, 100, 200, 500 }; + + this.SuspendLayout(); + + display.Smoothing = System.Drawing.Drawing2D.SmoothingMode.None; + display.SetDisplayRangeX(0, 300); + display.PanelLayout = layoutMode; + display.BackgroundColorTop = Color.White; + display.BackgroundColorBot = Color.White; + display.SolidGridColor = Color.LightGray; + display.DashedGridColor = Color.LightGray; + + display.DataSources.Clear(); + + bool first = true; + for (int i = 0; i < checkBoxes.Length; i++) + { + if (checkBoxes[i].Checked && SupportedGraphs.Length > i) + { + DataSource dataSrc = new DataSource(); + + float ymin; + float ymax; + int samplesCount = dataSrc.LoadSamples(Path.Combine(path, SupportedGraphs[i].FileName), out ymin, out ymax); + + /// Following section of code makes sure graps 1, 2 and graphs 3, 4, 5 use the same scale (Y-axis) + DataSource dummyDS = new DataSource(); + float y1, y2, y3, y4; + switch (i) + { + case 0: + default: + break; + case 1: + dummyDS.LoadSamples(Path.Combine(path, SupportedGraphs[2].FileName), out y1, out y2); + if (y1 < ymin) ymin = y1; + if (y2 > ymax) ymax = y2; + break; + case 2: + dummyDS.LoadSamples(Path.Combine(path, SupportedGraphs[1].FileName), out y1, out y2); + if (y1 < ymin) ymin = y1; + if (y2 > ymax) ymax = y2; + break; + case 3: + dummyDS.LoadSamples(Path.Combine(path, SupportedGraphs[4].FileName), out y1, out y2); + dummyDS.LoadSamples(Path.Combine(path, SupportedGraphs[5].FileName), out y3, out y4); + if (y1 < ymin) ymin = y1; + if (y2 > ymax) ymax = y2; + if (y3 < ymin) ymin = y3; + if (y4 > ymax) ymax = y4; + break; + case 4: + dummyDS.LoadSamples(Path.Combine(path, SupportedGraphs[3].FileName), out y1, out y2); + dummyDS.LoadSamples(Path.Combine(path, SupportedGraphs[5].FileName), out y3, out y4); + if (y1 < ymin) ymin = y1; + if (y2 > ymax) ymax = y2; + if (y3 < ymin) ymin = y3; + if (y4 > ymax) ymax = y4; + break; + case 5: + dummyDS.LoadSamples(Path.Combine(path, SupportedGraphs[3].FileName), out y1, out y2); + dummyDS.LoadSamples(Path.Combine(path, SupportedGraphs[4].FileName), out y3, out y4); + if (y1 < ymin) ymin = y1; + if (y2 > ymax) ymax = y2; + if (y3 < ymin) ymin = y3; + if (y4 > ymax) ymax = y4; + break; + } + + if (first) + { + first = false; + dataSrc.Name = string.Format("{0} {1} {2}", batchNr, testName, SupportedGraphs[i].Caption); + } + else + { + dataSrc.Name = SupportedGraphs[i].Caption; + } + dataSrc.OnRenderXAxisLabel += RenderXLabel; + dataSrc.OnRenderYAxisLabel = RenderYLabel; + dataSrc.AutoScaleY = false; + dataSrc.SetDisplayRangeY(ymin * 0.9f, ymax * 1.1f); + + float d = ymax * 1.1f - ymin * 0.9f; + int j = gridY.Length - 1; + while ((2 * gridY[j] > d) && (j > 0)) j--; + dataSrc.SetGridDistanceY(gridY[j]); + + dataSrc.GraphColor = colors[i % colors.Length]; + + display.DataSources.Add(dataSrc); + } + } + + this.ResumeLayout(); + display.Refresh(); + } + + + private string RenderXLabel(DataSource s, int idx) + { + if (s.AutoScaleX) + { + //if (idx % 2 == 0) + return ((int)(s.Samples[idx].X)).ToString(); + //else + // return string.Empty; + } + else + { + return ((int)(s.Samples[idx].X)).ToString(); + } + } + + private string RenderYLabel(DataSource s, float value) + { + return value.ToString(Config.Utils.SignificantDigitsToFmt(value, 2)); + } + + private void checkBox1_CheckedChanged(object sender, EventArgs e) { Program.LocalSettings.Graph1_On = checkBox1.Checked; AnyCBChanged(); } + private void checkBox2_CheckedChanged(object sender, EventArgs e) { Program.LocalSettings.Graph2_On = checkBox2.Checked; AnyCBChanged(); } + private void checkBox3_CheckedChanged(object sender, EventArgs e) { Program.LocalSettings.Graph3_On = checkBox3.Checked; AnyCBChanged(); } + private void checkBox4_CheckedChanged(object sender, EventArgs e) { Program.LocalSettings.Graph4_On = checkBox4.Checked; AnyCBChanged(); } + private void checkBox5_CheckedChanged(object sender, EventArgs e) { Program.LocalSettings.Graph5_On = checkBox5.Checked; AnyCBChanged(); } + private void checkBox6_CheckedChanged(object sender, EventArgs e) { Program.LocalSettings.Graph6_On = checkBox6.Checked; AnyCBChanged(); } + private void checkBox7_CheckedChanged(object sender, EventArgs e) { Program.LocalSettings.Graph7_On = checkBox7.Checked; AnyCBChanged(); } + private void checkBox8_CheckedChanged(object sender, EventArgs e) { Program.LocalSettings.Graph8_On = checkBox8.Checked; AnyCBChanged(); } + + void AnyCBChanged() + { + if (selectedGraphsPath != null) + { + ShowGraphs(plotterDisplayEx, selectedGraphsPath, selectedBatchNr, selectedTestName); + } + } + + private void layoutModeComboBox_SelectedIndexChanged(object sender, EventArgs e) + { + for (PlotterGraphPaneEx.LayoutMode mode = 0; mode <= PlotterGraphPaneEx.LayoutMode.TILES_HOR; mode++) + { + if (layoutModeComboBox.Text.Equals(mode.ToString()) && layoutMode != mode) + { + Program.LocalSettings.GraphsLayoutMode = layoutMode = mode; + ShowGraphs(plotterDisplayEx, selectedGraphsPath, selectedBatchNr, selectedTestName); + } + } + } + } + + class GraphInfo + { + public string FileName; /// Name of a file written y the plotter + public string Caption; /// Displayed graph lable + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Screens/GraphsTabPageCtrl.designer.cs b/TBF_V2/Sources/TBF/TBF/Screens/GraphsTabPageCtrl.designer.cs new file mode 100644 index 00000000..6e07d5ce --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Screens/GraphsTabPageCtrl.designer.cs @@ -0,0 +1,222 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.Screens +{ + partial class GraphsTabPageCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(GraphsTabPageCtrl)); + this.splitContainer = new System.Windows.Forms.SplitContainer(); + this.testsHistoryTreeView = new System.Windows.Forms.TreeView(); + this.plotterDisplayEx = new GraphLib.PlotterDisplayEx(); + this.refreshButton = new System.Windows.Forms.Button(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.checkBox8 = new System.Windows.Forms.CheckBox(); + this.checkBox7 = new System.Windows.Forms.CheckBox(); + this.layoutModeComboBox = new System.Windows.Forms.ComboBox(); + this.checkBox6 = new System.Windows.Forms.CheckBox(); + this.checkBox5 = new System.Windows.Forms.CheckBox(); + this.checkBox4 = new System.Windows.Forms.CheckBox(); + this.checkBox3 = new System.Windows.Forms.CheckBox(); + this.checkBox2 = new System.Windows.Forms.CheckBox(); + this.checkBox1 = new System.Windows.Forms.CheckBox(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit(); + this.splitContainer.Panel1.SuspendLayout(); + this.splitContainer.Panel2.SuspendLayout(); + this.splitContainer.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer + // + resources.ApplyResources(this.splitContainer, "splitContainer"); + this.splitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer.Name = "splitContainer"; + // + // splitContainer.Panel1 + // + this.splitContainer.Panel1.BackColor = System.Drawing.SystemColors.Control; + this.splitContainer.Panel1.Controls.Add(this.testsHistoryTreeView); + // + // splitContainer.Panel2 + // + this.splitContainer.Panel2.Controls.Add(this.plotterDisplayEx); + // + // testsHistoryTreeView + // + resources.ApplyResources(this.testsHistoryTreeView, "testsHistoryTreeView"); + this.testsHistoryTreeView.Name = "testsHistoryTreeView"; + this.testsHistoryTreeView.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.testsHistoryTreeView_NodeMouseClick); + // + // plotterDisplayEx + // + this.plotterDisplayEx.BackColor = System.Drawing.Color.Transparent; + this.plotterDisplayEx.BackgroundColorBot = System.Drawing.Color.White; + this.plotterDisplayEx.BackgroundColorTop = System.Drawing.Color.White; + this.plotterDisplayEx.DashedGridColor = System.Drawing.Color.DarkGray; + resources.ApplyResources(this.plotterDisplayEx, "plotterDisplayEx"); + this.plotterDisplayEx.DoubleBuffering = false; + this.plotterDisplayEx.Name = "plotterDisplayEx"; + this.plotterDisplayEx.SolidGridColor = System.Drawing.Color.DarkGray; + // + // refreshButton + // + resources.ApplyResources(this.refreshButton, "refreshButton"); + this.refreshButton.Name = "refreshButton"; + this.refreshButton.UseVisualStyleBackColor = true; + this.refreshButton.Click += new System.EventHandler(this.refreshButton_Click); + // + // splitContainer1 + // + resources.ApplyResources(this.splitContainer1, "splitContainer1"); + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.checkBox8); + this.splitContainer1.Panel1.Controls.Add(this.checkBox7); + this.splitContainer1.Panel1.Controls.Add(this.layoutModeComboBox); + this.splitContainer1.Panel1.Controls.Add(this.checkBox6); + this.splitContainer1.Panel1.Controls.Add(this.checkBox5); + this.splitContainer1.Panel1.Controls.Add(this.checkBox4); + this.splitContainer1.Panel1.Controls.Add(this.checkBox3); + this.splitContainer1.Panel1.Controls.Add(this.checkBox2); + this.splitContainer1.Panel1.Controls.Add(this.checkBox1); + this.splitContainer1.Panel1.Controls.Add(this.refreshButton); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.splitContainer); + // + // checkBox8 + // + resources.ApplyResources(this.checkBox8, "checkBox8"); + this.checkBox8.Name = "checkBox8"; + this.checkBox8.UseVisualStyleBackColor = true; + this.checkBox8.CheckedChanged += new System.EventHandler(this.checkBox8_CheckedChanged); + // + // checkBox7 + // + resources.ApplyResources(this.checkBox7, "checkBox7"); + this.checkBox7.Name = "checkBox7"; + this.checkBox7.UseVisualStyleBackColor = true; + this.checkBox7.CheckedChanged += new System.EventHandler(this.checkBox7_CheckedChanged); + // + // layoutModeComboBox + // + this.layoutModeComboBox.FormattingEnabled = true; + resources.ApplyResources(this.layoutModeComboBox, "layoutModeComboBox"); + this.layoutModeComboBox.Name = "layoutModeComboBox"; + this.layoutModeComboBox.SelectedIndexChanged += new System.EventHandler(this.layoutModeComboBox_SelectedIndexChanged); + // + // checkBox6 + // + resources.ApplyResources(this.checkBox6, "checkBox6"); + this.checkBox6.Name = "checkBox6"; + this.checkBox6.UseVisualStyleBackColor = true; + this.checkBox6.CheckedChanged += new System.EventHandler(this.checkBox6_CheckedChanged); + // + // checkBox5 + // + resources.ApplyResources(this.checkBox5, "checkBox5"); + this.checkBox5.Name = "checkBox5"; + this.checkBox5.UseVisualStyleBackColor = true; + this.checkBox5.CheckedChanged += new System.EventHandler(this.checkBox5_CheckedChanged); + // + // checkBox4 + // + resources.ApplyResources(this.checkBox4, "checkBox4"); + this.checkBox4.Name = "checkBox4"; + this.checkBox4.UseVisualStyleBackColor = true; + this.checkBox4.CheckedChanged += new System.EventHandler(this.checkBox4_CheckedChanged); + // + // checkBox3 + // + resources.ApplyResources(this.checkBox3, "checkBox3"); + this.checkBox3.Name = "checkBox3"; + this.checkBox3.UseVisualStyleBackColor = true; + this.checkBox3.CheckedChanged += new System.EventHandler(this.checkBox3_CheckedChanged); + // + // checkBox2 + // + resources.ApplyResources(this.checkBox2, "checkBox2"); + this.checkBox2.Name = "checkBox2"; + this.checkBox2.UseVisualStyleBackColor = true; + this.checkBox2.CheckedChanged += new System.EventHandler(this.checkBox2_CheckedChanged); + // + // checkBox1 + // + resources.ApplyResources(this.checkBox1, "checkBox1"); + this.checkBox1.Name = "checkBox1"; + this.checkBox1.UseVisualStyleBackColor = true; + this.checkBox1.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged); + // + // GraphsTabPageCtrl + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Silver; + this.Controls.Add(this.splitContainer1); + this.Name = "GraphsTabPageCtrl"; + this.splitContainer.Panel1.ResumeLayout(false); + this.splitContainer.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit(); + this.splitContainer.ResumeLayout(false); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel1.PerformLayout(); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer splitContainer; + private GraphLib.PlotterDisplayEx plotterDisplayEx; + private System.Windows.Forms.TreeView testsHistoryTreeView; + private System.Windows.Forms.Button refreshButton; + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.CheckBox checkBox6; + private System.Windows.Forms.CheckBox checkBox5; + private System.Windows.Forms.CheckBox checkBox4; + private System.Windows.Forms.CheckBox checkBox3; + private System.Windows.Forms.CheckBox checkBox2; + private System.Windows.Forms.CheckBox checkBox1; + private System.Windows.Forms.ComboBox layoutModeComboBox; + private System.Windows.Forms.CheckBox checkBox8; + private System.Windows.Forms.CheckBox checkBox7; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Screens/GraphsTabPageCtrl.resx b/TBF_V2/Sources/TBF/TBF/Screens/GraphsTabPageCtrl.resx new file mode 100644 index 00000000..2260ec5d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Screens/GraphsTabPageCtrl.resx @@ -0,0 +1,567 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + Fill + + + + True + + + + 0, 0 + + + Fill + + + 0, 0 + + + 125, 655 + + + 0 + + + testsHistoryTreeView + + + System.Windows.Forms.TreeView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer.Panel1 + + + 0 + + + splitContainer.Panel1 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer + + + 0 + + + Fill + + + 0, 0 + + + 836, 655 + + + 0 + + + plotterDisplayEx + + + GraphLib.PlotterDisplayEx, GraphLib, Version=1.0.0.1, Culture=neutral, PublicKeyToken=null + + + splitContainer.Panel2 + + + 0 + + + splitContainer.Panel2 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer + + + 1 + + + 965, 655 + + + 125 + + + 2 + + + splitContainer + + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel2 + + + 0 + + + 0, 2 + + + 125, 28 + + + 0 + + + Refresh + + + refreshButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel1 + + + 9 + + + Fill + + + True + + + 0, 0 + + + Horizontal + + + True + + + NoControl + + + 952, 10 + + + 80, 17 + + + 9 + + + checkBox8 + + + checkBox8 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel1 + + + 0 + + + True + + + NoControl + + + 856, 10 + + + 80, 17 + + + 8 + + + checkBox7 + + + checkBox7 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel1 + + + 1 + + + 129, 6 + + + 137, 21 + + + 7 + + + layoutModeComboBox + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel1 + + + 2 + + + True + + + 760, 10 + + + 80, 17 + + + 6 + + + checkBox6 + + + checkBox6 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel1 + + + 3 + + + True + + + 664, 10 + + + 80, 17 + + + 5 + + + checkBox5 + + + checkBox5 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel1 + + + 4 + + + True + + + 568, 10 + + + 80, 17 + + + 4 + + + checkBox4 + + + checkBox4 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel1 + + + 5 + + + True + + + 472, 10 + + + 80, 17 + + + 3 + + + checkBox3 + + + checkBox3 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel1 + + + 6 + + + True + + + 376, 10 + + + 80, 17 + + + 2 + + + checkBox2 + + + checkBox2 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel1 + + + 7 + + + True + + + 280, 10 + + + 80, 17 + + + 1 + + + checkBox1 + + + checkBox1 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel1 + + + 8 + + + splitContainer1.Panel1 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1 + + + 0 + + + splitContainer1.Panel2 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1 + + + 1 + + + 965, 689 + + + 30 + + + 3 + + + splitContainer1 + + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + + + 6, 13 + + + Microsoft Sans Serif, 8.25pt + + + 965, 689 + + + GraphsTabPageCtrl + + + System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Screens/LogsTabPageCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/Screens/LogsTabPageCtrl.Designer.cs new file mode 100644 index 00000000..1956c7ea --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Screens/LogsTabPageCtrl.Designer.cs @@ -0,0 +1,103 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.Screens +{ + partial class LogsTabPageCtrl + { + /// + /// 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 Component 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(LogsTabPageCtrl)); + this.logTextBox = new System.Windows.Forms.TextBox(); + this.clearButton = new System.Windows.Forms.Button(); + this.splitContainer = new System.Windows.Forms.SplitContainer(); + this.logsTextBox = new System.Windows.Forms.TextBox(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit(); + this.splitContainer.Panel1.SuspendLayout(); + this.splitContainer.Panel2.SuspendLayout(); + this.splitContainer.SuspendLayout(); + this.SuspendLayout(); + // + // logTextBox + // + resources.ApplyResources(this.logTextBox, "logTextBox"); + this.logTextBox.Name = "logTextBox"; + // + // clearButton + // + resources.ApplyResources(this.clearButton, "clearButton"); + this.clearButton.Name = "clearButton"; + this.clearButton.UseVisualStyleBackColor = true; + this.clearButton.Click += new System.EventHandler(this.clearButton_Click); + // + // splitContainer + // + resources.ApplyResources(this.splitContainer, "splitContainer"); + this.splitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer.Name = "splitContainer"; + // + // splitContainer.Panel1 + // + this.splitContainer.Panel1.BackColor = System.Drawing.SystemColors.Control; + this.splitContainer.Panel1.Controls.Add(this.clearButton); + // + // splitContainer.Panel2 + // + this.splitContainer.Panel2.Controls.Add(this.logsTextBox); + // + // logsTextBox + // + this.logsTextBox.BackColor = System.Drawing.SystemColors.Control; + resources.ApplyResources(this.logsTextBox, "logsTextBox"); + this.logsTextBox.Name = "logsTextBox"; + // + // LogsTabPageCtrl + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Silver; + this.Controls.Add(this.splitContainer); + this.Controls.Add(this.logTextBox); + this.Name = "LogsTabPageCtrl"; + this.splitContainer.Panel1.ResumeLayout(false); + this.splitContainer.Panel2.ResumeLayout(false); + this.splitContainer.Panel2.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit(); + this.splitContainer.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox logTextBox; + private System.Windows.Forms.Button clearButton; + private System.Windows.Forms.SplitContainer splitContainer; + private System.Windows.Forms.TextBox logsTextBox; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Screens/LogsTabPageCtrl.cs b/TBF_V2/Sources/TBF/TBF/Screens/LogsTabPageCtrl.cs new file mode 100644 index 00000000..409de616 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Screens/LogsTabPageCtrl.cs @@ -0,0 +1,38 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using TBF.Resources; +using TBF.UiBridge; + +namespace TBF.Screens +{ + public partial class LogsTabPageCtrl : UserControl + { + public LogsTabPageCtrl() + { + InitializeComponent(); + clearButton.Text = Strings.ClearBtnText; + + Bridge.LogHandler += delegate(object sender, LogEventArgs args) + { + if (InvokeRequired) + { + Invoke(new EventHandler(OnLog), sender, args); + } + else OnLog(sender, args); + }; + } + + private void clearButton_Click(object sender, EventArgs e) + { + logsTextBox.Clear(); + } + + void OnLog(object sender, LogEventArgs args) + { + logsTextBox.AppendText(args.LogMessage); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Screens/LogsTabPageCtrl.resx b/TBF_V2/Sources/TBF/TBF/Screens/LogsTabPageCtrl.resx new file mode 100644 index 00000000..968ca4f6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Screens/LogsTabPageCtrl.resx @@ -0,0 +1,291 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + 98, 249 + + + + 2, 2, 2, 2 + + + + True + + + Both + + + 644, 420 + + + 0 + + + logTextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + Microsoft Sans Serif, 8.25pt + + + NoControl + + + 20, 10 + + + 2, 2, 2, 2 + + + 100, 30 + + + 1 + + + &Clear + + + clearButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer.Panel1 + + + 0 + + + Fill + + + True + + + 0, 0 + + + Horizontal + + + splitContainer.Panel1 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer + + + 0 + + + Fill + + + 0, 0 + + + True + + + Vertical + + + 965, 643 + + + 0 + + + logsTextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer.Panel2 + + + 0 + + + splitContainer.Panel2 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer + + + 1 + + + 965, 689 + + + 42 + + + 2 + + + splitContainer + + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + + + 6, 13 + + + Microsoft Sans Serif, 8.25pt + + + 965, 689 + + + LogsTabPageCtrl + + + System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Screens/MeasurementTabPageCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/Screens/MeasurementTabPageCtrl.Designer.cs new file mode 100644 index 00000000..acc527aa --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Screens/MeasurementTabPageCtrl.Designer.cs @@ -0,0 +1,208 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.Screens +{ + partial class MeasurementTabPageCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.measurementLabel5 = new System.Windows.Forms.Label(); + this.measurementLabel4 = new System.Windows.Forms.Label(); + this.measurementLabel3 = new System.Windows.Forms.Label(); + this.measurementLabel2 = new System.Windows.Forms.Label(); + this.measurementLabel = new System.Windows.Forms.Label(); + this.measurementTableLayoutPanel4 = new System.Windows.Forms.TableLayoutPanel(); + this.measurementTableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel(); + this.measurementTableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel(); + this.measurementTableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.SuspendLayout(); + // + // measurementLabel5 + // + this.measurementLabel5.AutoSize = true; + this.measurementLabel5.Font = new System.Drawing.Font("Verdana", 11.25F); + this.measurementLabel5.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.measurementLabel5.Location = new System.Drawing.Point(471, 136); + this.measurementLabel5.Name = "measurementLabel5"; + this.measurementLabel5.Size = new System.Drawing.Size(74, 18); + this.measurementLabel5.TabIndex = 17; + this.measurementLabel5.Text = "Time Bar"; + // + // measurementLabel4 + // + this.measurementLabel4.AutoSize = true; + this.measurementLabel4.Font = new System.Drawing.Font("Verdana", 11.25F); + this.measurementLabel4.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.measurementLabel4.Location = new System.Drawing.Point(328, 136); + this.measurementLabel4.Name = "measurementLabel4"; + this.measurementLabel4.Size = new System.Drawing.Size(74, 18); + this.measurementLabel4.TabIndex = 16; + this.measurementLabel4.Text = "Time Bar"; + // + // measurementLabel3 + // + this.measurementLabel3.AutoSize = true; + this.measurementLabel3.Font = new System.Drawing.Font("Verdana", 11.25F); + this.measurementLabel3.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.measurementLabel3.Location = new System.Drawing.Point(484, 164); + this.measurementLabel3.Name = "measurementLabel3"; + this.measurementLabel3.Size = new System.Drawing.Size(45, 18); + this.measurementLabel3.TabIndex = 15; + this.measurementLabel3.Text = "Total"; + // + // measurementLabel2 + // + this.measurementLabel2.AutoSize = true; + this.measurementLabel2.Font = new System.Drawing.Font("Verdana", 11.25F); + this.measurementLabel2.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.measurementLabel2.Location = new System.Drawing.Point(323, 164); + this.measurementLabel2.Name = "measurementLabel2"; + this.measurementLabel2.Size = new System.Drawing.Size(87, 18); + this.measurementLabel2.TabIndex = 14; + this.measurementLabel2.Text = "Actual test"; + // + // measurementLabel + // + this.measurementLabel.AutoSize = true; + this.measurementLabel.Font = new System.Drawing.Font("Verdana", 11.25F); + this.measurementLabel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.measurementLabel.Location = new System.Drawing.Point(639, 514); + this.measurementLabel.Name = "measurementLabel"; + this.measurementLabel.Size = new System.Drawing.Size(108, 18); + this.measurementLabel.TabIndex = 13; + this.measurementLabel.Text = "Target values"; + // + // measurementTableLayoutPanel4 + // + this.measurementTableLayoutPanel4.ColumnCount = 3; + this.measurementTableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.measurementTableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 30F)); + this.measurementTableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20F)); + this.measurementTableLayoutPanel4.Location = new System.Drawing.Point(642, 544); + this.measurementTableLayoutPanel4.Name = "measurementTableLayoutPanel4"; + this.measurementTableLayoutPanel4.RowCount = 4; + this.measurementTableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.measurementTableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.measurementTableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.measurementTableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.measurementTableLayoutPanel4.Size = new System.Drawing.Size(216, 101); + this.measurementTableLayoutPanel4.TabIndex = 12; + // + // measurementTableLayoutPanel3 + // + this.measurementTableLayoutPanel3.ColumnCount = 3; + this.measurementTableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33F)); + this.measurementTableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33F)); + this.measurementTableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 34F)); + this.measurementTableLayoutPanel3.Location = new System.Drawing.Point(521, 11); + this.measurementTableLayoutPanel3.Name = "measurementTableLayoutPanel3"; + this.measurementTableLayoutPanel3.RowCount = 2; + this.measurementTableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.measurementTableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.measurementTableLayoutPanel3.Size = new System.Drawing.Size(348, 55); + this.measurementTableLayoutPanel3.TabIndex = 11; + // + // measurementTableLayoutPanel2 + // + this.measurementTableLayoutPanel2.ColumnCount = 2; + this.measurementTableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.measurementTableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.measurementTableLayoutPanel2.Location = new System.Drawing.Point(11, 245); + this.measurementTableLayoutPanel2.Name = "measurementTableLayoutPanel2"; + this.measurementTableLayoutPanel2.RowCount = 12; + this.measurementTableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.measurementTableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F)); + this.measurementTableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F)); + this.measurementTableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F)); + this.measurementTableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F)); + this.measurementTableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F)); + this.measurementTableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F)); + this.measurementTableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F)); + this.measurementTableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F)); + this.measurementTableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F)); + this.measurementTableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F)); + this.measurementTableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F)); + this.measurementTableLayoutPanel2.Size = new System.Drawing.Size(177, 303); + this.measurementTableLayoutPanel2.TabIndex = 10; + // + // measurementTableLayoutPanel1 + // + this.measurementTableLayoutPanel1.ColumnCount = 3; + this.measurementTableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 30F)); + this.measurementTableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 35F)); + this.measurementTableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 35F)); + this.measurementTableLayoutPanel1.Location = new System.Drawing.Point(11, 21); + this.measurementTableLayoutPanel1.Name = "measurementTableLayoutPanel1"; + this.measurementTableLayoutPanel1.RowCount = 7; + this.measurementTableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.measurementTableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F)); + this.measurementTableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F)); + this.measurementTableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F)); + this.measurementTableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F)); + this.measurementTableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F)); + this.measurementTableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F)); + this.measurementTableLayoutPanel1.Size = new System.Drawing.Size(283, 183); + this.measurementTableLayoutPanel1.TabIndex = 9; + // + // MeasurementTabPageCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(150)))), ((int)(((byte)(180)))), ((int)(((byte)(200))))); + this.Controls.Add(this.measurementLabel5); + this.Controls.Add(this.measurementLabel4); + this.Controls.Add(this.measurementLabel3); + this.Controls.Add(this.measurementLabel2); + this.Controls.Add(this.measurementLabel); + this.Controls.Add(this.measurementTableLayoutPanel4); + this.Controls.Add(this.measurementTableLayoutPanel3); + this.Controls.Add(this.measurementTableLayoutPanel2); + this.Controls.Add(this.measurementTableLayoutPanel1); + this.Font = new System.Drawing.Font("Verdana", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.Margin = new System.Windows.Forms.Padding(4); + this.Name = "MeasurementTabPageCtrl"; + this.Size = new System.Drawing.Size(900, 689); + this.Paint += new System.Windows.Forms.PaintEventHandler(this.measurement_Paint); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label measurementLabel5; + private System.Windows.Forms.Label measurementLabel4; + private System.Windows.Forms.Label measurementLabel3; + private System.Windows.Forms.Label measurementLabel2; + private System.Windows.Forms.Label measurementLabel; + private System.Windows.Forms.TableLayoutPanel measurementTableLayoutPanel4; + private System.Windows.Forms.TableLayoutPanel measurementTableLayoutPanel3; + private System.Windows.Forms.TableLayoutPanel measurementTableLayoutPanel2; + private System.Windows.Forms.TableLayoutPanel measurementTableLayoutPanel1; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Screens/MeasurementTabPageCtrl.cs b/TBF_V2/Sources/TBF/TBF/Screens/MeasurementTabPageCtrl.cs new file mode 100644 index 00000000..0510ae31 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Screens/MeasurementTabPageCtrl.cs @@ -0,0 +1,183 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Drawing; +using System.Windows.Forms; +using log4net; +using TBF.UiBridge; + +namespace TBF.Screens +{ + public partial class MeasurementTabPageCtrl : UserControl + { + static readonly ILog log = LogManager.GetLogger(typeof(MeasurementTabPageCtrl)); + + AttachedTextBoxes measurementTbl1Row1; /// Table 1 + AttachedTextBoxes measurementTbl1Col1; + AttachedTextBoxes measurementTbl1Col2; + AttachedTextBoxes measurementTbl1Col3; + AttachedTextBoxes measurementTbl2Row1; /// Table 2 + AttachedTextBoxes measurementTbl2Col1; + AttachedTextBoxes measurementTbl2Col2; + AttachedTextBoxes measurementTbl3Row1; /// Table 3 + AttachedTextBoxes measurementTbl3Row2; + AttachedTextBoxes measurementTbl4Col1; + AttachedTextBoxes measurementTbl4Col2; + AttachedTextBoxes measurementTbl4Col3; + + BarGraph measurementBar1; + BarGraph measurementBar2; + + public MeasurementTabPageCtrl() + { + InitializeComponent(); + + //Bridge.TestSelectedHandler += delegate(object sender, TestSelectedEventArgs args) + //{ + // if (InvokeRequired) + // { + // Invoke(new EventHandler(OnTestSelected), sender, args); + // } + // else OnTestSelected(sender, args); + //}; + //Bridge.TestProgressHandler += delegate(object sender, TestProgressEventArgs args) + //{ + // if (InvokeRequired) + // { + // Invoke(new EventHandler(OnTestProgress), sender, args); + // } + // else OnTestProgress(sender, args); + //}; + //Bridge.TestCompletedHandler += delegate(object sender, TestCompletedEventArgs args) + //{ + // if (InvokeRequired) + // { + // Invoke(new EventHandler(OnTestCompleted), sender, args); + // } + // else OnTestCompleted(sender, args); + //}; + + Init(); + } + + private void Init() + { + measurementTbl1Row1 = new AttachedTextBoxes(measurementTableLayoutPanel1, Arrangement.RowOfStrings, 1, 0, 2); + measurementTbl1Col1 = new AttachedTextBoxes(measurementTableLayoutPanel1, Arrangement.ColumnOfStrings, 0, 1, 6); + measurementTbl1Col2 = new AttachedTextBoxes(measurementTableLayoutPanel1, Arrangement.ColumnOfDoubles, 1, 1, 6); + measurementTbl1Col3 = new AttachedTextBoxes(measurementTableLayoutPanel1, Arrangement.ColumnOfDoubles, 2, 1, 6); + measurementTbl2Row1 = new AttachedTextBoxes(measurementTableLayoutPanel2, Arrangement.RowOfStrings, 1, 0, 1); + measurementTbl2Col1 = new AttachedTextBoxes(measurementTableLayoutPanel2, Arrangement.ColumnOfStrings, 0, 1, 11); + measurementTbl2Col2 = new AttachedTextBoxes(measurementTableLayoutPanel2, Arrangement.ColumnOfDoubles, 1, 1, 11); + measurementTbl3Row1 = new AttachedTextBoxes(measurementTableLayoutPanel3, Arrangement.RowOfStrings, 0, 0, 3); + measurementTbl3Row2 = new AttachedTextBoxes(measurementTableLayoutPanel3, Arrangement.RowOfDoubles, 0, 1, 3); + measurementTbl4Col1 = new AttachedTextBoxes(measurementTableLayoutPanel4, Arrangement.ColumnOfStrings, 0, 0, 4); + measurementTbl4Col2 = new AttachedTextBoxes(measurementTableLayoutPanel4, Arrangement.ColumnOfDoubles, 1, 0, 4); + measurementTbl4Col3 = new AttachedTextBoxes(measurementTableLayoutPanel4, Arrangement.ColumnOfStrings, 2, 0, 4); + + CustomStyle.Apply(1, measurementTbl1Row1); + CustomStyle.Apply(1, measurementTbl1Col1); + CustomStyle.Apply(1, measurementTbl1Col2); + CustomStyle.Apply(1, measurementTbl1Col3); + CustomStyle.Apply(1, measurementTbl2Row1); + CustomStyle.Apply(1, measurementTbl2Col1); + CustomStyle.Apply(1, measurementTbl2Col2); + CustomStyle.Apply(1, measurementTbl3Row1); + CustomStyle.Apply(1, measurementTbl3Row2); + CustomStyle.Apply(1, measurementTbl4Col1); + CustomStyle.Apply(1, measurementTbl4Col2); + CustomStyle.Apply(1, measurementTbl4Col3); + + measurementTbl1Row1.SetData(0, "Vmer"); + measurementTbl1Row1.SetData(1, "Emer"); + for (int i = 0; i < Config.Data.WMsCount; i++) measurementTbl1Col1.SetData(i, "Meter" + (i + 1).ToString()); + + measurementTbl2Row1.SetData(0, "Ergebnise"); + measurementTbl2Col1.SetData(0, "IMP"); + measurementTbl2Col1.SetData(1, "Zeit"); + measurementTbl2Col1.SetData(2, "V_etn"); + measurementTbl2Col1.SetData(3, "Temp up"); + measurementTbl2Col1.SetData(4, "Temp dn"); + measurementTbl2Col1.SetData(5, "T Kl"); + measurementTbl2Col1.SetData(6, "Druck up"); + measurementTbl2Col1.SetData(7, "Druck dn"); + measurementTbl2Col1.SetData(8, "Durchfl. act"); + measurementTbl2Col1.SetData(9, "Zeit Kl in"); + measurementTbl2Col1.SetData(10, "Zeit Kl out"); + + measurementTbl3Row1.SetData(0, "Temp. Luft"); + measurementTbl3Row1.SetData(1, "Druck Luft"); + measurementTbl3Row1.SetData(2, "Humi. Luft"); + + measurementTbl4Col1.SetData(0, "Durchfl. Tar Min"); + measurementTbl4Col1.SetData(1, "Durchfl. Tar Max"); + measurementTbl4Col1.SetData(2, "Volumen Tar"); + measurementTbl4Col1.SetData(3, "Dauer"); + + //measurementTbl4Col2.SetData(0, 1.5); + //measurementTbl4Col2.SetData(1, 1.65); + //measurementTbl4Col2.SetData(2, 50); + //measurementTbl4Col2.SetData(3, 114.29); + + measurementTbl4Col3.SetData(0, "m3/h"); + measurementTbl4Col3.SetData(1, "m3/h"); + measurementTbl4Col3.SetData(2, "l"); + measurementTbl4Col3.SetData(3, "s"); + + measurementBar1 = new BarGraph(this, 320, 200, 100, 400, Color.DarkBlue, Color.WhiteSmoke); + measurementBar2 = new BarGraph(this, 470, 200, 100, 400, Color.DarkBlue, Color.WhiteSmoke); + } + + private void measurement_Paint(object sender, PaintEventArgs e) + { + Graphics g = e.Graphics; + if (measurementBar1 != null) measurementBar1.Paint(g); + if (measurementBar2 != null) measurementBar2.Paint(g); + g.DrawRectangle(new Pen(Color.Black, 2.0F), 500, -2, 402, 80); + g.DrawRectangle(new Pen(Color.Black, 2.0F), 620, 500, 282, 250); + } + + + public void OnTestSelected(object sender, TestSelectedEventArgs data) + { + measurementTbl4Col2.SetData(0, data.Test.Qfrom.ToString("F2")); + measurementTbl4Col2.SetData(1, data.Test.Qto.ToString("F2")); + measurementTbl4Col2.SetData(2, data.Test.Volume.ToString("F1")); + measurementTbl4Col2.SetData(3, data.Test.TstTime.ToString("F1")); + } + + public void OnTestProgress(object sender, TestProgressEventArgs data) + { + /// TODO: Reimplement + //if (data.TestResult != null) + //{ + // int count = Math.Min(Config.Data.WMsCount, data.TestResult.Meters.Count); + // for (int i = 0; i < count; i++) + // { + // measurementTbl1Col2.SetData(i, data.TestResult.Meters[i].VolumeMeter.ToString("F1")); + // measurementTbl1Col3.SetData(i, data.TestResult.Meters[i].VolumeErrorPct.ToString("F1")); + // } + //} + //measurementTbl2Col2.SetData(0, data.RefPulses); + //measurementTbl2Col2.SetData(1, data.Time.ToString("F1")); + + //measurementTbl2Col2.SetData(3, data.Tin.ToString()); + //measurementTbl2Col2.SetData(4, data.Tout.ToString()); + //measurementTbl2Col2.SetData(5, data.Tdiv.ToString()); + //measurementTbl2Col2.SetData(6, data.Pin.ToString()); + //measurementTbl2Col2.SetData(7, data.Pout.ToString()); + //measurementTbl2Col2.SetData(8, data.Flow.ToString()); + + //measurementTbl3Row2.SetData(0, data.AmbientTemp.ToString()); + //measurementTbl3Row2.SetData(1, data.AmbientPressure.ToString()); + //measurementTbl3Row2.SetData(2, data.AmbientHumidity.ToString()); + + //measurementBar1.FValue = data.Progress; + } + + public void OnTestCompleted(object sender, TestCompletedEventArgs data) + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Screens/MeasurementTabPageCtrl.resx b/TBF_V2/Sources/TBF/TBF/Screens/MeasurementTabPageCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Screens/MeasurementTabPageCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Screens/PicturesTabPageCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/Screens/PicturesTabPageCtrl.Designer.cs new file mode 100644 index 00000000..2cb8e565 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Screens/PicturesTabPageCtrl.Designer.cs @@ -0,0 +1,145 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.Screens +{ + partial class PicturesTabPageCtrl + { + /// + /// 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 Component 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(PicturesTabPageCtrl)); + this.picturesFlowLayoutPanel = new System.Windows.Forms.FlowLayoutPanel(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.minusButton = new System.Windows.Forms.Button(); + this.plusButton = new System.Windows.Forms.Button(); + this.liveButton = new System.Windows.Forms.Button(); + this.stopButton = new System.Windows.Forms.Button(); + this.grabButton = new System.Windows.Forms.Button(); + this.saveImageButton = new System.Windows.Forms.Button(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.SuspendLayout(); + // + // picturesFlowLayoutPanel + // + resources.ApplyResources(this.picturesFlowLayoutPanel, "picturesFlowLayoutPanel"); + this.picturesFlowLayoutPanel.BackColor = System.Drawing.SystemColors.ControlLight; + this.picturesFlowLayoutPanel.ForeColor = System.Drawing.SystemColors.Control; + this.picturesFlowLayoutPanel.Name = "picturesFlowLayoutPanel"; + // + // splitContainer1 + // + this.splitContainer1.BackColor = System.Drawing.SystemColors.ControlLight; + resources.ApplyResources(this.splitContainer1, "splitContainer1"); + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.picturesFlowLayoutPanel); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.BackColor = System.Drawing.SystemColors.ControlLight; + this.splitContainer1.Panel2.Controls.Add(this.saveImageButton); + this.splitContainer1.Panel2.Controls.Add(this.grabButton); + this.splitContainer1.Panel2.Controls.Add(this.stopButton); + this.splitContainer1.Panel2.Controls.Add(this.liveButton); + this.splitContainer1.Panel2.Controls.Add(this.minusButton); + this.splitContainer1.Panel2.Controls.Add(this.plusButton); + // + // minusButton + // + resources.ApplyResources(this.minusButton, "minusButton"); + this.minusButton.Name = "minusButton"; + this.minusButton.UseVisualStyleBackColor = true; + this.minusButton.Click += new System.EventHandler(this.minusButton_Click); + // + // plusButton + // + resources.ApplyResources(this.plusButton, "plusButton"); + this.plusButton.Name = "plusButton"; + this.plusButton.UseVisualStyleBackColor = true; + this.plusButton.Click += new System.EventHandler(this.plusButton_Click); + // + // liveButton + // + resources.ApplyResources(this.liveButton, "liveButton"); + this.liveButton.Name = "liveButton"; + this.liveButton.UseVisualStyleBackColor = true; + this.liveButton.Click += new System.EventHandler(this.liveButton_Click); + // + // stopButton + // + resources.ApplyResources(this.stopButton, "stopButton"); + this.stopButton.Name = "stopButton"; + this.stopButton.UseVisualStyleBackColor = true; + this.stopButton.Click += new System.EventHandler(this.stopButton_Click); + // + // grabButton + // + resources.ApplyResources(this.grabButton, "grabButton"); + this.grabButton.Name = "grabButton"; + this.grabButton.UseVisualStyleBackColor = true; + this.grabButton.Click += new System.EventHandler(this.grabButton_Click); + // + // saveImageButton + // + resources.ApplyResources(this.saveImageButton, "saveImageButton"); + this.saveImageButton.Name = "saveImageButton"; + this.saveImageButton.UseVisualStyleBackColor = true; + this.saveImageButton.Click += new System.EventHandler(this.saveImageButton_Click); + // + // PicturesTabPageCtrl + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Silver; + this.Controls.Add(this.splitContainer1); + this.Name = "PicturesTabPageCtrl"; + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.FlowLayoutPanel picturesFlowLayoutPanel; + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.Button minusButton; + private System.Windows.Forms.Button plusButton; + private System.Windows.Forms.Button grabButton; + private System.Windows.Forms.Button stopButton; + private System.Windows.Forms.Button liveButton; + private System.Windows.Forms.Button saveImageButton; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Screens/PicturesTabPageCtrl.cs b/TBF_V2/Sources/TBF/TBF/Screens/PicturesTabPageCtrl.cs new file mode 100644 index 00000000..0297e3b4 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Screens/PicturesTabPageCtrl.cs @@ -0,0 +1,166 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.Resources; +using TBF.UiBridge; +using TBF.BenchControl; +using TBF.BenchControl.Network.Camera.CLP1611; + +namespace TBF.Screens +{ + public partial class PicturesTabPageCtrl : UserControl + { + static readonly ILog log = LogManager.GetLogger(typeof(MainWnd)); + + CameraDisplayResolution resolution; + IList cameraPictures; + + public PicturesTabPageCtrl() + { + InitializeComponent(); + + cameraPictures = new List(); + if (Program.LocalSettings != null) resolution = Program.LocalSettings.Resolution; + + System.Windows.Forms.Timer timer; + timer = new System.Windows.Forms.Timer(); + timer.Tick += (s, e) => { TimerTick(); }; + timer.Interval = 250; + timer.Start(); + + Bridge.ImageHandler += delegate(object sender, ImageEventArgs args) + { + if (InvokeRequired) + Invoke(new EventHandler(ShowImage), sender, args); + else + ShowImage(sender, args); + }; + + Bridge.CameraInfoHandler += delegate(object sender, CameraInfoEventArgs args) + { + if (InvokeRequired) + Invoke(new EventHandler(ShowInfo), sender, args); + else + ShowInfo(sender, args); + }; + } + + private void TimerTick() + { + DateTime now = DateTime.Now; + for (int i = 0; i < cameraPictures.Count; i++) + { + if (cameraPictures[i] != null) cameraPictures[i].UpdateLed(now); + } + } + + void ShowInfo(object sender, CameraInfoEventArgs args) + { + if (args.CameraIdx < cameraPictures.Count) + { + cameraPictures[args.CameraIdx].Caption = args.Info; + } + else if (args.CameraIdx == cameraPictures.Count) + { + UserControl ctrl; + switch (resolution) + { + default: + case CameraDisplayResolution.Small: ctrl = new TBF.UiControls.CameraPictureCtrl(); break; + case CameraDisplayResolution.Medium: ctrl = new TBF.UiControls.CameraPictureCtrl2(); break; + case CameraDisplayResolution.Large: ctrl = new TBF.UiControls.CameraPictureCtrl3(); break; + } + cameraPictures.Add(ctrl as TBF.UiControls.ICameraPicture); + picturesFlowLayoutPanel.Controls.Add(ctrl); + (ctrl as TBF.UiControls.ICameraPicture).Caption = args.Info; + } + else + { + log.ErrorFormat("Unexpected camera: Idx={0} Info={1}", args.CameraIdx, args.Info); + } + } + + void ShowImage(object sender, ImageEventArgs args) + { + if (args.CameraIdx < cameraPictures.Count && cameraPictures[args.CameraIdx] != null) + { + cameraPictures[args.CameraIdx].NewImage = args.Image; + } + } + + /// + /// Increase image resolution + /// + private void plusButton_Click(object sender, EventArgs e) + { + if (resolution < CameraDisplayResolution.Count - 1) + { + Program.LocalSettings.Resolution = ++resolution; + RedrawPictures(); + } + } + + /// + /// Decrease image resolution + /// + private void minusButton_Click(object sender, EventArgs e) + { + if (resolution > 0) + { + Program.LocalSettings.Resolution = --resolution; + RedrawPictures(); + } + } + + void RedrawPictures() + { + int nrControls = cameraPictures.Count; + TBF.UiControls.ICameraPicture[] oriCamPictures = new TBF.UiControls.ICameraPicture[nrControls]; + for (int i = 0; i < nrControls; i++) oriCamPictures[i] = cameraPictures[i]; + + cameraPictures.Clear(); + picturesFlowLayoutPanel.Controls.Clear(); + + for (int i = 0; i < nrControls; i++) + { + UserControl ctrl; + switch (resolution) + { + default: + case CameraDisplayResolution.Small: ctrl = new TBF.UiControls.CameraPictureCtrl(oriCamPictures[i]); break; + case CameraDisplayResolution.Medium: ctrl = new TBF.UiControls.CameraPictureCtrl2(oriCamPictures[i]); break; + case CameraDisplayResolution.Large: ctrl = new TBF.UiControls.CameraPictureCtrl3(oriCamPictures[i]); break; + } + + cameraPictures.Add(ctrl as TBF.UiControls.ICameraPicture); + picturesFlowLayoutPanel.Controls.Add(ctrl); + } + } + + + private void grabButton_Click(object sender, EventArgs e) + { + Bridge.OnCameraUICmd(this, new CameraUICmdEventArgs(CameraUICmd.Grab, -1)); + } + + private void liveButton_Click(object sender, EventArgs e) + { + Bridge.OnCameraUICmd(this, new CameraUICmdEventArgs(CameraUICmd.Live, -1)); + } + + private void stopButton_Click(object sender, EventArgs e) + { + Bridge.OnCameraUICmd(this, new CameraUICmdEventArgs(CameraUICmd.Stop, -1)); + } + + private void saveImageButton_Click(object sender, EventArgs e) + { + Bridge.OnCameraUICmd(this, new CameraUICmdEventArgs(CameraUICmd.SaveImage, -1)); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Screens/PicturesTabPageCtrl.resx b/TBF_V2/Sources/TBF/TBF/Screens/PicturesTabPageCtrl.resx new file mode 100644 index 00000000..962e8187 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Screens/PicturesTabPageCtrl.resx @@ -0,0 +1,402 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + True + + + + Fill + + + + 0, 0 + + + 1007, 689 + + + 0 + + + picturesFlowLayoutPanel + + + System.Windows.Forms.FlowLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel1 + + + 0 + + + Fill + + + 0, 0 + + + splitContainer1.Panel1 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1 + + + 0 + + + Arial, 8.25pt, style=Bold + + + NoControl + + + 1, 189 + + + 23, 23 + + + 5 + + + S + + + saveImageButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel2 + + + 0 + + + Arial, 8.25pt, style=Bold + + + NoControl + + + 1, 102 + + + 23, 23 + + + 4 + + + o + + + grabButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel2 + + + 1 + + + Arial, 8.25pt + + + NoControl + + + 1, 160 + + + 23, 23 + + + 3 + + + + + + stopButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel2 + + + 2 + + + Arial, 8.25pt + + + NoControl + + + 1, 131 + + + 23, 23 + + + 2 + + + + + + liveButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel2 + + + 3 + + + Arial, 8.25pt + + + NoControl + + + 1, 33 + + + 23, 23 + + + 1 + + + - + + + minusButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel2 + + + 4 + + + Arial, 8.25pt + + + 1, 7 + + + 23, 23 + + + 0 + + + + + + + plusButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel2 + + + 5 + + + splitContainer1.Panel2 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1 + + + 1 + + + 23 + + + 1033, 689 + + + 1007 + + + 1 + + + 1 + + + splitContainer1 + + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + + + 6, 13 + + + Microsoft Sans Serif, 8.25pt + + + 1033, 689 + + + PicturesTabPageCtrl + + + System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Screens/ProcessTabPageCtrl24.Designer.cs b/TBF_V2/Sources/TBF/TBF/Screens/ProcessTabPageCtrl24.Designer.cs new file mode 100644 index 00000000..1e8b5979 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Screens/ProcessTabPageCtrl24.Designer.cs @@ -0,0 +1,3404 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +namespace TBF.Screens +{ + partial class ProcessTabPageCtrl24 + { + /// + /// 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 Component 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(ProcessTabPageCtrl24)); + this.sensor1Label = new System.Windows.Forms.Label(); + this.pulses1Label = new System.Windows.Forms.Label(); + this.refPulses1Label = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.volume1Label = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.error1Label = new System.Windows.Forms.Label(); + this.passed1Label = new System.Windows.Forms.Label(); + this.label35 = new System.Windows.Forms.Label(); + this.passed2Label = new System.Windows.Forms.Label(); + this.error2Label = new System.Windows.Forms.Label(); + this.volume2Label = new System.Windows.Forms.Label(); + this.refPulses2Label = new System.Windows.Forms.Label(); + this.pulses2Label = new System.Windows.Forms.Label(); + this.sensor2Label = new System.Windows.Forms.Label(); + this.passed3Label = new System.Windows.Forms.Label(); + this.error3Label = new System.Windows.Forms.Label(); + this.volume3Label = new System.Windows.Forms.Label(); + this.refPulses3Label = new System.Windows.Forms.Label(); + this.pulses3Label = new System.Windows.Forms.Label(); + this.sensor3Label = new System.Windows.Forms.Label(); + this.label13 = new System.Windows.Forms.Label(); + this.label14 = new System.Windows.Forms.Label(); + this.tInLabel = new System.Windows.Forms.Label(); + this.prInLabel = new System.Windows.Forms.Label(); + this.prOutLabel = new System.Windows.Forms.Label(); + this.tOutLabel = new System.Windows.Forms.Label(); + this.label17 = new System.Windows.Forms.Label(); + this.label18 = new System.Windows.Forms.Label(); + this.label15 = new System.Windows.Forms.Label(); + this.tInCmpntLabel = new System.Windows.Forms.Label(); + this.tOutCmpntLabel = new System.Windows.Forms.Label(); + this.prOutCmpntLabel = new System.Windows.Forms.Label(); + this.prInCmpntLabel = new System.Windows.Forms.Label(); + this.refFlowLabel = new System.Windows.Forms.Label(); + this.label16 = new System.Windows.Forms.Label(); + this.refFreqLabel = new System.Windows.Forms.Label(); + this.label19 = new System.Windows.Forms.Label(); + this.refPulsesLabel = new System.Windows.Forms.Label(); + this.refFlowCmpntLabel = new System.Windows.Forms.Label(); + this.regValveCmpntLabel = new System.Windows.Forms.Label(); + this.regValvePosLabel = new System.Windows.Forms.Label(); + this.label21 = new System.Windows.Forms.Label(); + this.tDivCmpntLabel = new System.Windows.Forms.Label(); + this.tDivLabel = new System.Windows.Forms.Label(); + this.label24 = new System.Windows.Forms.Label(); + this.scaleCmpntLabel = new System.Windows.Forms.Label(); + this.label22 = new System.Windows.Forms.Label(); + this.massLabel = new System.Windows.Forms.Label(); + this.label23 = new System.Windows.Forms.Label(); + this.massDiffLabel = new System.Windows.Forms.Label(); + this.label25 = new System.Windows.Forms.Label(); + this.refVolumeLabel = new System.Windows.Forms.Label(); + this.label26 = new System.Windows.Forms.Label(); + this.volumeCtvLabel = new System.Windows.Forms.Label(); + this.label27 = new System.Windows.Forms.Label(); + this.refErrorLabel = new System.Windows.Forms.Label(); + this.label28 = new System.Windows.Forms.Label(); + this.label29 = new System.Windows.Forms.Label(); + this.label20 = new System.Windows.Forms.Label(); + this.label30 = new System.Windows.Forms.Label(); + this.targetFlowLowLabel = new System.Windows.Forms.Label(); + this.targetFlowHighLabel = new System.Windows.Forms.Label(); + this.targetVolumeLabel = new System.Windows.Forms.Label(); + this.label31 = new System.Windows.Forms.Label(); + this.targetRefCountLabel = new System.Windows.Forms.Label(); + this.estmtdTimeLabel = new System.Windows.Forms.Label(); + this.label32 = new System.Windows.Forms.Label(); + this.label33 = new System.Windows.Forms.Label(); + this.label34 = new System.Windows.Forms.Label(); + this.airTempLabel = new System.Windows.Forms.Label(); + this.airPressLabel = new System.Windows.Forms.Label(); + this.airHumiLabel = new System.Windows.Forms.Label(); + this.reservoirPictureBox = new System.Windows.Forms.PictureBox(); + this.pumpPictureBox = new System.Windows.Forms.PictureBox(); + this.watermeterPictureBox1 = new System.Windows.Forms.PictureBox(); + this.watermeterPictureBox2 = new System.Windows.Forms.PictureBox(); + this.watermeterPictureBox3 = new System.Windows.Forms.PictureBox(); + this.watermeterPictureBox4 = new System.Windows.Forms.PictureBox(); + this.passed4Label = new System.Windows.Forms.Label(); + this.error4Label = new System.Windows.Forms.Label(); + this.volume4Label = new System.Windows.Forms.Label(); + this.refPulses4Label = new System.Windows.Forms.Label(); + this.pulses4Label = new System.Windows.Forms.Label(); + this.sensor4Label = new System.Windows.Forms.Label(); + this.watermeterPictureBox5 = new System.Windows.Forms.PictureBox(); + this.passed5Label = new System.Windows.Forms.Label(); + this.error5Label = new System.Windows.Forms.Label(); + this.volume5Label = new System.Windows.Forms.Label(); + this.refPulses5Label = new System.Windows.Forms.Label(); + this.pulses5Label = new System.Windows.Forms.Label(); + this.sensor5Label = new System.Windows.Forms.Label(); + this.watermeterPictureBox6 = new System.Windows.Forms.PictureBox(); + this.passed6Label = new System.Windows.Forms.Label(); + this.error6Label = new System.Windows.Forms.Label(); + this.volume6Label = new System.Windows.Forms.Label(); + this.refPulses6Label = new System.Windows.Forms.Label(); + this.pulses6Label = new System.Windows.Forms.Label(); + this.sensor6Label = new System.Windows.Forms.Label(); + this.flowMeterPictureBox = new System.Windows.Forms.PictureBox(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.watermeterPictureBox1z = new System.Windows.Forms.PictureBox(); + this.watermeterPictureBox2z = new System.Windows.Forms.PictureBox(); + this.watermeterPictureBox3z = new System.Windows.Forms.PictureBox(); + this.groupBox1z = new System.Windows.Forms.GroupBox(); + this.passed1zLabel = new System.Windows.Forms.Label(); + this.error1zLabel = new System.Windows.Forms.Label(); + this.label56 = new System.Windows.Forms.Label(); + this.volume1zLabel = new System.Windows.Forms.Label(); + this.label58 = new System.Windows.Forms.Label(); + this.groupBox2z = new System.Windows.Forms.GroupBox(); + this.passed2zLabel = new System.Windows.Forms.Label(); + this.error2zLabel = new System.Windows.Forms.Label(); + this.label52 = new System.Windows.Forms.Label(); + this.volume2zLabel = new System.Windows.Forms.Label(); + this.label59 = new System.Windows.Forms.Label(); + this.groupBox3z = new System.Windows.Forms.GroupBox(); + this.passed3zLabel = new System.Windows.Forms.Label(); + this.error3zLabel = new System.Windows.Forms.Label(); + this.label57 = new System.Windows.Forms.Label(); + this.volume3zLabel = new System.Windows.Forms.Label(); + this.label61 = new System.Windows.Forms.Label(); + this.pumpPctTextBox = new System.Windows.Forms.TextBox(); + this.meter1Label = new System.Windows.Forms.Label(); + this.meter2Label = new System.Windows.Forms.Label(); + this.meter3Label = new System.Windows.Forms.Label(); + this.meter4Label = new System.Windows.Forms.Label(); + this.meter5Label = new System.Windows.Forms.Label(); + this.meter6Label = new System.Windows.Forms.Label(); + this.meter12Label = new System.Windows.Forms.Label(); + this.meter11Label = new System.Windows.Forms.Label(); + this.meter10Label = new System.Windows.Forms.Label(); + this.meter9Label = new System.Windows.Forms.Label(); + this.meter8Label = new System.Windows.Forms.Label(); + this.meter7Label = new System.Windows.Forms.Label(); + this.passed12Label = new System.Windows.Forms.Label(); + this.passed11Label = new System.Windows.Forms.Label(); + this.error12Label = new System.Windows.Forms.Label(); + this.passed10Label = new System.Windows.Forms.Label(); + this.error11Label = new System.Windows.Forms.Label(); + this.volume12Label = new System.Windows.Forms.Label(); + this.passed9Label = new System.Windows.Forms.Label(); + this.error10Label = new System.Windows.Forms.Label(); + this.volume11Label = new System.Windows.Forms.Label(); + this.passed8Label = new System.Windows.Forms.Label(); + this.refPulses12Label = new System.Windows.Forms.Label(); + this.error9Label = new System.Windows.Forms.Label(); + this.pulses12Label = new System.Windows.Forms.Label(); + this.sensor12Label = new System.Windows.Forms.Label(); + this.volume10Label = new System.Windows.Forms.Label(); + this.passed7Label = new System.Windows.Forms.Label(); + this.refPulses11Label = new System.Windows.Forms.Label(); + this.pulses11Label = new System.Windows.Forms.Label(); + this.error8Label = new System.Windows.Forms.Label(); + this.sensor11Label = new System.Windows.Forms.Label(); + this.volume9Label = new System.Windows.Forms.Label(); + this.refPulses10Label = new System.Windows.Forms.Label(); + this.pulses10Label = new System.Windows.Forms.Label(); + this.volume8Label = new System.Windows.Forms.Label(); + this.sensor10Label = new System.Windows.Forms.Label(); + this.error7Label = new System.Windows.Forms.Label(); + this.refPulses9Label = new System.Windows.Forms.Label(); + this.volume7Label = new System.Windows.Forms.Label(); + this.pulses9Label = new System.Windows.Forms.Label(); + this.sensor9Label = new System.Windows.Forms.Label(); + this.refPulses7Label = new System.Windows.Forms.Label(); + this.refPulses8Label = new System.Windows.Forms.Label(); + this.pulses8Label = new System.Windows.Forms.Label(); + this.pulses7Label = new System.Windows.Forms.Label(); + this.sensor8Label = new System.Windows.Forms.Label(); + this.sensor7Label = new System.Windows.Forms.Label(); + this.meter24Label = new System.Windows.Forms.Label(); + this.meter23Label = new System.Windows.Forms.Label(); + this.meter22Label = new System.Windows.Forms.Label(); + this.meter21Label = new System.Windows.Forms.Label(); + this.meter20Label = new System.Windows.Forms.Label(); + this.meter19Label = new System.Windows.Forms.Label(); + this.passed24Label = new System.Windows.Forms.Label(); + this.passed23Label = new System.Windows.Forms.Label(); + this.error24Label = new System.Windows.Forms.Label(); + this.passed22Label = new System.Windows.Forms.Label(); + this.error23Label = new System.Windows.Forms.Label(); + this.volume24Label = new System.Windows.Forms.Label(); + this.passed21Label = new System.Windows.Forms.Label(); + this.error22Label = new System.Windows.Forms.Label(); + this.volume23Label = new System.Windows.Forms.Label(); + this.passed20Label = new System.Windows.Forms.Label(); + this.refPulses24Label = new System.Windows.Forms.Label(); + this.error21Label = new System.Windows.Forms.Label(); + this.pulses24Label = new System.Windows.Forms.Label(); + this.sensor24Label = new System.Windows.Forms.Label(); + this.volume22Label = new System.Windows.Forms.Label(); + this.passed19Label = new System.Windows.Forms.Label(); + this.refPulses23Label = new System.Windows.Forms.Label(); + this.pulses23Label = new System.Windows.Forms.Label(); + this.error20Label = new System.Windows.Forms.Label(); + this.sensor23Label = new System.Windows.Forms.Label(); + this.volume21Label = new System.Windows.Forms.Label(); + this.refPulses22Label = new System.Windows.Forms.Label(); + this.pulses22Label = new System.Windows.Forms.Label(); + this.volume20Label = new System.Windows.Forms.Label(); + this.sensor22Label = new System.Windows.Forms.Label(); + this.error19Label = new System.Windows.Forms.Label(); + this.refPulses21Label = new System.Windows.Forms.Label(); + this.volume19Label = new System.Windows.Forms.Label(); + this.pulses21Label = new System.Windows.Forms.Label(); + this.sensor21Label = new System.Windows.Forms.Label(); + this.refPulses19Label = new System.Windows.Forms.Label(); + this.refPulses20Label = new System.Windows.Forms.Label(); + this.pulses20Label = new System.Windows.Forms.Label(); + this.pulses19Label = new System.Windows.Forms.Label(); + this.sensor20Label = new System.Windows.Forms.Label(); + this.sensor19Label = new System.Windows.Forms.Label(); + this.meter18Label = new System.Windows.Forms.Label(); + this.meter17Label = new System.Windows.Forms.Label(); + this.meter16Label = new System.Windows.Forms.Label(); + this.meter15Label = new System.Windows.Forms.Label(); + this.meter14Label = new System.Windows.Forms.Label(); + this.meter13Label = new System.Windows.Forms.Label(); + this.passed18Label = new System.Windows.Forms.Label(); + this.passed17Label = new System.Windows.Forms.Label(); + this.error18Label = new System.Windows.Forms.Label(); + this.passed16Label = new System.Windows.Forms.Label(); + this.error17Label = new System.Windows.Forms.Label(); + this.volume18Label = new System.Windows.Forms.Label(); + this.passed15Label = new System.Windows.Forms.Label(); + this.error16Label = new System.Windows.Forms.Label(); + this.volume17Label = new System.Windows.Forms.Label(); + this.passed14Label = new System.Windows.Forms.Label(); + this.refPulses18Label = new System.Windows.Forms.Label(); + this.error15Label = new System.Windows.Forms.Label(); + this.pulses18Label = new System.Windows.Forms.Label(); + this.sensor18Label = new System.Windows.Forms.Label(); + this.volume16Label = new System.Windows.Forms.Label(); + this.passed13Label = new System.Windows.Forms.Label(); + this.refPulses17Label = new System.Windows.Forms.Label(); + this.pulses17Label = new System.Windows.Forms.Label(); + this.error14Label = new System.Windows.Forms.Label(); + this.sensor17Label = new System.Windows.Forms.Label(); + this.volume15Label = new System.Windows.Forms.Label(); + this.refPulses16Label = new System.Windows.Forms.Label(); + this.label104 = new System.Windows.Forms.Label(); + this.pulses16Label = new System.Windows.Forms.Label(); + this.volume14Label = new System.Windows.Forms.Label(); + this.sensor16Label = new System.Windows.Forms.Label(); + this.error13Label = new System.Windows.Forms.Label(); + this.refPulses15Label = new System.Windows.Forms.Label(); + this.volume13Label = new System.Windows.Forms.Label(); + this.pulses15Label = new System.Windows.Forms.Label(); + this.sensor15Label = new System.Windows.Forms.Label(); + this.refPulses13Label = new System.Windows.Forms.Label(); + this.refPulses14Label = new System.Windows.Forms.Label(); + this.pulses14Label = new System.Windows.Forms.Label(); + this.pulses13Label = new System.Windows.Forms.Label(); + this.sensor14Label = new System.Windows.Forms.Label(); + this.sensor13Label = new System.Windows.Forms.Label(); + this.label119 = new System.Windows.Forms.Label(); + this.label120 = new System.Windows.Forms.Label(); + this.label121 = new System.Windows.Forms.Label(); + this.label122 = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.reservoirPictureBox)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pumpPictureBox)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox3)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox4)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox5)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox6)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.flowMeterPictureBox)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox1z)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox2z)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox3z)).BeginInit(); + this.groupBox1z.SuspendLayout(); + this.groupBox2z.SuspendLayout(); + this.groupBox3z.SuspendLayout(); + this.SuspendLayout(); + // + // sensor1Label + // + this.sensor1Label.AutoSize = true; + this.sensor1Label.Location = new System.Drawing.Point(64, 542); + this.sensor1Label.Name = "sensor1Label"; + this.sensor1Label.Size = new System.Drawing.Size(44, 13); + this.sensor1Label.TabIndex = 0; + this.sensor1Label.Text = "sensor1"; + this.sensor1Label.Visible = false; + // + // pulses1Label + // + this.pulses1Label.AutoSize = true; + this.pulses1Label.Location = new System.Drawing.Point(64, 560); + this.pulses1Label.Name = "pulses1Label"; + this.pulses1Label.Size = new System.Drawing.Size(43, 13); + this.pulses1Label.TabIndex = 1; + this.pulses1Label.Text = "pulses1"; + this.pulses1Label.Visible = false; + // + // refPulses1Label + // + this.refPulses1Label.AutoSize = true; + this.refPulses1Label.Location = new System.Drawing.Point(64, 579); + this.refPulses1Label.Name = "refPulses1Label"; + this.refPulses1Label.Size = new System.Drawing.Size(56, 13); + this.refPulses1Label.TabIndex = 2; + this.refPulses1Label.Text = "refPulses1"; + this.refPulses1Label.Visible = false; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(2, 560); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(38, 13); + this.label1.TabIndex = 3; + this.label1.Text = "Count:"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(1, 579); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(60, 13); + this.label2.TabIndex = 4; + this.label2.Text = "Ref. count:"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(16, 597); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(45, 13); + this.label3.TabIndex = 5; + this.label3.Text = "Volume:"; + // + // volume1Label + // + this.volume1Label.AutoSize = true; + this.volume1Label.Location = new System.Drawing.Point(64, 597); + this.volume1Label.Name = "volume1Label"; + this.volume1Label.Size = new System.Drawing.Size(47, 13); + this.volume1Label.TabIndex = 6; + this.volume1Label.Text = "volume1"; + this.volume1Label.Visible = false; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(12, 616); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(49, 13); + this.label4.TabIndex = 7; + this.label4.Text = "Error [%]:"; + // + // error1Label + // + this.error1Label.AutoSize = true; + this.error1Label.Location = new System.Drawing.Point(64, 616); + this.error1Label.Name = "error1Label"; + this.error1Label.Size = new System.Drawing.Size(34, 13); + this.error1Label.TabIndex = 8; + this.error1Label.Text = "error1"; + this.error1Label.Visible = false; + // + // passed1Label + // + this.passed1Label.AutoSize = true; + this.passed1Label.Location = new System.Drawing.Point(64, 634); + this.passed1Label.Name = "passed1Label"; + this.passed1Label.Size = new System.Drawing.Size(47, 13); + this.passed1Label.TabIndex = 9; + this.passed1Label.Text = "passed1"; + this.passed1Label.Visible = false; + // + // label35 + // + this.label35.AutoSize = true; + this.label35.Location = new System.Drawing.Point(18, 542); + this.label35.Name = "label35"; + this.label35.Size = new System.Drawing.Size(43, 13); + this.label35.TabIndex = 10; + this.label35.Text = "Sensor:"; + // + // passed2Label + // + this.passed2Label.AutoSize = true; + this.passed2Label.Location = new System.Drawing.Point(134, 634); + this.passed2Label.Name = "passed2Label"; + this.passed2Label.Size = new System.Drawing.Size(47, 13); + this.passed2Label.TabIndex = 9; + this.passed2Label.Text = "passed2"; + this.passed2Label.Visible = false; + // + // error2Label + // + this.error2Label.AutoSize = true; + this.error2Label.Location = new System.Drawing.Point(134, 616); + this.error2Label.Name = "error2Label"; + this.error2Label.Size = new System.Drawing.Size(34, 13); + this.error2Label.TabIndex = 8; + this.error2Label.Text = "error2"; + this.error2Label.Visible = false; + // + // volume2Label + // + this.volume2Label.AutoSize = true; + this.volume2Label.Location = new System.Drawing.Point(134, 597); + this.volume2Label.Name = "volume2Label"; + this.volume2Label.Size = new System.Drawing.Size(47, 13); + this.volume2Label.TabIndex = 6; + this.volume2Label.Text = "volume2"; + this.volume2Label.Visible = false; + // + // refPulses2Label + // + this.refPulses2Label.AutoSize = true; + this.refPulses2Label.Location = new System.Drawing.Point(134, 579); + this.refPulses2Label.Name = "refPulses2Label"; + this.refPulses2Label.Size = new System.Drawing.Size(56, 13); + this.refPulses2Label.TabIndex = 2; + this.refPulses2Label.Text = "refPulses2"; + this.refPulses2Label.Visible = false; + // + // pulses2Label + // + this.pulses2Label.AutoSize = true; + this.pulses2Label.Location = new System.Drawing.Point(134, 560); + this.pulses2Label.Name = "pulses2Label"; + this.pulses2Label.Size = new System.Drawing.Size(43, 13); + this.pulses2Label.TabIndex = 1; + this.pulses2Label.Text = "pulses2"; + this.pulses2Label.Visible = false; + // + // sensor2Label + // + this.sensor2Label.AutoSize = true; + this.sensor2Label.Location = new System.Drawing.Point(134, 542); + this.sensor2Label.Name = "sensor2Label"; + this.sensor2Label.Size = new System.Drawing.Size(44, 13); + this.sensor2Label.TabIndex = 0; + this.sensor2Label.Text = "sensor2"; + this.sensor2Label.Visible = false; + // + // passed3Label + // + this.passed3Label.AutoSize = true; + this.passed3Label.Location = new System.Drawing.Point(204, 634); + this.passed3Label.Name = "passed3Label"; + this.passed3Label.Size = new System.Drawing.Size(47, 13); + this.passed3Label.TabIndex = 9; + this.passed3Label.Text = "passed3"; + this.passed3Label.Visible = false; + // + // error3Label + // + this.error3Label.AutoSize = true; + this.error3Label.Location = new System.Drawing.Point(204, 616); + this.error3Label.Name = "error3Label"; + this.error3Label.Size = new System.Drawing.Size(34, 13); + this.error3Label.TabIndex = 8; + this.error3Label.Text = "error3"; + this.error3Label.Visible = false; + // + // volume3Label + // + this.volume3Label.AutoSize = true; + this.volume3Label.Location = new System.Drawing.Point(204, 597); + this.volume3Label.Name = "volume3Label"; + this.volume3Label.Size = new System.Drawing.Size(47, 13); + this.volume3Label.TabIndex = 6; + this.volume3Label.Text = "volume3"; + this.volume3Label.Visible = false; + // + // refPulses3Label + // + this.refPulses3Label.AutoSize = true; + this.refPulses3Label.Location = new System.Drawing.Point(204, 579); + this.refPulses3Label.Name = "refPulses3Label"; + this.refPulses3Label.Size = new System.Drawing.Size(56, 13); + this.refPulses3Label.TabIndex = 2; + this.refPulses3Label.Text = "refPulses3"; + this.refPulses3Label.Visible = false; + // + // pulses3Label + // + this.pulses3Label.AutoSize = true; + this.pulses3Label.Location = new System.Drawing.Point(204, 560); + this.pulses3Label.Name = "pulses3Label"; + this.pulses3Label.Size = new System.Drawing.Size(43, 13); + this.pulses3Label.TabIndex = 1; + this.pulses3Label.Text = "pulses3"; + this.pulses3Label.Visible = false; + // + // sensor3Label + // + this.sensor3Label.AutoSize = true; + this.sensor3Label.Location = new System.Drawing.Point(204, 542); + this.sensor3Label.Name = "sensor3Label"; + this.sensor3Label.Size = new System.Drawing.Size(44, 13); + this.sensor3Label.TabIndex = 0; + this.sensor3Label.Text = "sensor3"; + this.sensor3Label.Visible = false; + // + // label13 + // + this.label13.AutoSize = true; + this.label13.Location = new System.Drawing.Point(60, 129); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(52, 13); + this.label13.TabIndex = 13; + this.label13.Text = "T up [°C]:"; + // + // label14 + // + this.label14.AutoSize = true; + this.label14.Location = new System.Drawing.Point(53, 91); + this.label14.Name = "label14"; + this.label14.Size = new System.Drawing.Size(59, 13); + this.label14.TabIndex = 14; + this.label14.Text = "Pr up [bar]:"; + // + // tInLabel + // + this.tInLabel.AutoSize = true; + this.tInLabel.Location = new System.Drawing.Point(121, 129); + this.tInLabel.Name = "tInLabel"; + this.tInLabel.Size = new System.Drawing.Size(19, 13); + this.tInLabel.TabIndex = 15; + this.tInLabel.Text = "tIn"; + // + // prInLabel + // + this.prInLabel.AutoSize = true; + this.prInLabel.Location = new System.Drawing.Point(121, 91); + this.prInLabel.Name = "prInLabel"; + this.prInLabel.Size = new System.Drawing.Size(25, 13); + this.prInLabel.TabIndex = 16; + this.prInLabel.Text = "prIn"; + // + // prOutLabel + // + this.prOutLabel.AutoSize = true; + this.prOutLabel.Location = new System.Drawing.Point(578, 91); + this.prOutLabel.Name = "prOutLabel"; + this.prOutLabel.Size = new System.Drawing.Size(33, 13); + this.prOutLabel.TabIndex = 20; + this.prOutLabel.Text = "prOut"; + // + // tOutLabel + // + this.tOutLabel.AutoSize = true; + this.tOutLabel.Location = new System.Drawing.Point(578, 129); + this.tOutLabel.Name = "tOutLabel"; + this.tOutLabel.Size = new System.Drawing.Size(27, 13); + this.tOutLabel.TabIndex = 19; + this.tOutLabel.Text = "tOut"; + // + // label17 + // + this.label17.AutoSize = true; + this.label17.Location = new System.Drawing.Point(497, 91); + this.label17.Name = "label17"; + this.label17.Size = new System.Drawing.Size(73, 13); + this.label17.TabIndex = 18; + this.label17.Text = "Pr down [bar]:"; + // + // label18 + // + this.label18.AutoSize = true; + this.label18.Location = new System.Drawing.Point(504, 129); + this.label18.Name = "label18"; + this.label18.Size = new System.Drawing.Size(66, 13); + this.label18.TabIndex = 17; + this.label18.Text = "T down [°C]:"; + // + // label15 + // + this.label15.AutoSize = true; + this.label15.Location = new System.Drawing.Point(697, 114); + this.label15.Name = "label15"; + this.label15.Size = new System.Drawing.Size(86, 13); + this.label15.TabIndex = 21; + this.label15.Text = "Ref. flow [m3/h]:"; + // + // tInCmpntLabel + // + this.tInCmpntLabel.AutoSize = true; + this.tInCmpntLabel.Location = new System.Drawing.Point(121, 113); + this.tInCmpntLabel.Name = "tInCmpntLabel"; + this.tInCmpntLabel.Size = new System.Drawing.Size(49, 13); + this.tInCmpntLabel.TabIndex = 22; + this.tInCmpntLabel.Text = "tInCmpnt"; + // + // tOutCmpntLabel + // + this.tOutCmpntLabel.AutoSize = true; + this.tOutCmpntLabel.Location = new System.Drawing.Point(578, 113); + this.tOutCmpntLabel.Name = "tOutCmpntLabel"; + this.tOutCmpntLabel.Size = new System.Drawing.Size(57, 13); + this.tOutCmpntLabel.TabIndex = 23; + this.tOutCmpntLabel.Text = "tOutCmpnt"; + // + // prOutCmpntLabel + // + this.prOutCmpntLabel.AutoSize = true; + this.prOutCmpntLabel.Location = new System.Drawing.Point(578, 75); + this.prOutCmpntLabel.Name = "prOutCmpntLabel"; + this.prOutCmpntLabel.Size = new System.Drawing.Size(63, 13); + this.prOutCmpntLabel.TabIndex = 24; + this.prOutCmpntLabel.Text = "prOutCmpnt"; + // + // prInCmpntLabel + // + this.prInCmpntLabel.AutoSize = true; + this.prInCmpntLabel.Location = new System.Drawing.Point(121, 75); + this.prInCmpntLabel.Name = "prInCmpntLabel"; + this.prInCmpntLabel.Size = new System.Drawing.Size(55, 13); + this.prInCmpntLabel.TabIndex = 25; + this.prInCmpntLabel.Text = "prInCmpnt"; + // + // refFlowLabel + // + this.refFlowLabel.AutoSize = true; + this.refFlowLabel.Location = new System.Drawing.Point(790, 114); + this.refFlowLabel.Name = "refFlowLabel"; + this.refFlowLabel.Size = new System.Drawing.Size(41, 13); + this.refFlowLabel.TabIndex = 26; + this.refFlowLabel.Text = "refFlow"; + // + // label16 + // + this.label16.AutoSize = true; + this.label16.Location = new System.Drawing.Point(707, 95); + this.label16.Name = "label16"; + this.label16.Size = new System.Drawing.Size(76, 13); + this.label16.TabIndex = 27; + this.label16.Text = "Ref. freq. [Hz]:"; + // + // refFreqLabel + // + this.refFreqLabel.AutoSize = true; + this.refFreqLabel.Location = new System.Drawing.Point(790, 95); + this.refFreqLabel.Name = "refFreqLabel"; + this.refFreqLabel.Size = new System.Drawing.Size(40, 13); + this.refFreqLabel.TabIndex = 28; + this.refFreqLabel.Text = "refFreq"; + // + // label19 + // + this.label19.AutoSize = true; + this.label19.Location = new System.Drawing.Point(723, 77); + this.label19.Name = "label19"; + this.label19.Size = new System.Drawing.Size(60, 13); + this.label19.TabIndex = 29; + this.label19.Text = "Ref. count:"; + // + // refPulsesLabel + // + this.refPulsesLabel.AutoSize = true; + this.refPulsesLabel.Location = new System.Drawing.Point(790, 77); + this.refPulsesLabel.Name = "refPulsesLabel"; + this.refPulsesLabel.Size = new System.Drawing.Size(50, 13); + this.refPulsesLabel.TabIndex = 30; + this.refPulsesLabel.Text = "refPulses"; + // + // refFlowCmpntLabel + // + this.refFlowCmpntLabel.AutoSize = true; + this.refFlowCmpntLabel.Location = new System.Drawing.Point(790, 59); + this.refFlowCmpntLabel.Name = "refFlowCmpntLabel"; + this.refFlowCmpntLabel.Size = new System.Drawing.Size(71, 13); + this.refFlowCmpntLabel.TabIndex = 31; + this.refFlowCmpntLabel.Text = "refFlowCmpnt"; + // + // regValveCmpntLabel + // + this.regValveCmpntLabel.AutoSize = true; + this.regValveCmpntLabel.Location = new System.Drawing.Point(790, 12); + this.regValveCmpntLabel.Name = "regValveCmpntLabel"; + this.regValveCmpntLabel.Size = new System.Drawing.Size(79, 13); + this.regValveCmpntLabel.TabIndex = 34; + this.regValveCmpntLabel.Text = "regValveCmpnt"; + // + // regValvePosLabel + // + this.regValvePosLabel.AutoSize = true; + this.regValvePosLabel.Location = new System.Drawing.Point(790, 30); + this.regValvePosLabel.Name = "regValvePosLabel"; + this.regValvePosLabel.Size = new System.Drawing.Size(67, 13); + this.regValvePosLabel.TabIndex = 35; + this.regValvePosLabel.Text = "regValvePos"; + // + // label21 + // + this.label21.AutoSize = true; + this.label21.Location = new System.Drawing.Point(701, 30); + this.label21.Name = "label21"; + this.label21.Size = new System.Drawing.Size(85, 13); + this.label21.TabIndex = 36; + this.label21.Text = "Reg. valve pos.:"; + // + // tDivCmpntLabel + // + this.tDivCmpntLabel.AutoSize = true; + this.tDivCmpntLabel.Location = new System.Drawing.Point(578, 12); + this.tDivCmpntLabel.Name = "tDivCmpntLabel"; + this.tDivCmpntLabel.Size = new System.Drawing.Size(56, 13); + this.tDivCmpntLabel.TabIndex = 39; + this.tDivCmpntLabel.Text = "tDivCmpnt"; + // + // tDivLabel + // + this.tDivLabel.AutoSize = true; + this.tDivLabel.Location = new System.Drawing.Point(578, 30); + this.tDivLabel.Name = "tDivLabel"; + this.tDivLabel.Size = new System.Drawing.Size(26, 13); + this.tDivLabel.TabIndex = 38; + this.tDivLabel.Text = "tDiv"; + // + // label24 + // + this.label24.AutoSize = true; + this.label24.Location = new System.Drawing.Point(516, 29); + this.label24.Name = "label24"; + this.label24.Size = new System.Drawing.Size(54, 13); + this.label24.TabIndex = 37; + this.label24.Text = "T div [°C]:"; + // + // scaleCmpntLabel + // + this.scaleCmpntLabel.AutoSize = true; + this.scaleCmpntLabel.Location = new System.Drawing.Point(989, 209); + this.scaleCmpntLabel.Name = "scaleCmpntLabel"; + this.scaleCmpntLabel.Size = new System.Drawing.Size(62, 13); + this.scaleCmpntLabel.TabIndex = 40; + this.scaleCmpntLabel.Text = "scaleCmpnt"; + // + // label22 + // + this.label22.AutoSize = true; + this.label22.Location = new System.Drawing.Point(929, 230); + this.label22.Name = "label22"; + this.label22.Size = new System.Drawing.Size(56, 13); + this.label22.TabIndex = 41; + this.label22.Text = "Mass [kg]:"; + // + // massLabel + // + this.massLabel.AutoSize = true; + this.massLabel.Location = new System.Drawing.Point(989, 230); + this.massLabel.Name = "massLabel"; + this.massLabel.Size = new System.Drawing.Size(31, 13); + this.massLabel.TabIndex = 42; + this.massLabel.Text = "mass"; + // + // label23 + // + this.label23.AutoSize = true; + this.label23.Location = new System.Drawing.Point(909, 250); + this.label23.Name = "label23"; + this.label23.Size = new System.Drawing.Size(76, 13); + this.label23.TabIndex = 43; + this.label23.Text = "Mass diff. [kg]:"; + // + // massDiffLabel + // + this.massDiffLabel.AutoSize = true; + this.massDiffLabel.Location = new System.Drawing.Point(989, 250); + this.massDiffLabel.Name = "massDiffLabel"; + this.massDiffLabel.Size = new System.Drawing.Size(47, 13); + this.massDiffLabel.TabIndex = 44; + this.massDiffLabel.Text = "massDiff"; + // + // label25 + // + this.label25.AutoSize = true; + this.label25.Location = new System.Drawing.Point(709, 133); + this.label25.Name = "label25"; + this.label25.Size = new System.Drawing.Size(78, 13); + this.label25.TabIndex = 45; + this.label25.Text = "Ref. volume [l]:"; + // + // refVolumeLabel + // + this.refVolumeLabel.AutoSize = true; + this.refVolumeLabel.Location = new System.Drawing.Point(790, 133); + this.refVolumeLabel.Name = "refVolumeLabel"; + this.refVolumeLabel.Size = new System.Drawing.Size(54, 13); + this.refVolumeLabel.TabIndex = 46; + this.refVolumeLabel.Text = "refVolume"; + // + // label26 + // + this.label26.AutoSize = true; + this.label26.Location = new System.Drawing.Point(929, 271); + this.label26.Name = "label26"; + this.label26.Size = new System.Drawing.Size(56, 13); + this.label26.TabIndex = 47; + this.label26.Text = "Volume [l]:"; + // + // volumeCtvLabel + // + this.volumeCtvLabel.AutoSize = true; + this.volumeCtvLabel.Location = new System.Drawing.Point(989, 271); + this.volumeCtvLabel.Name = "volumeCtvLabel"; + this.volumeCtvLabel.Size = new System.Drawing.Size(57, 13); + this.volumeCtvLabel.TabIndex = 48; + this.volumeCtvLabel.Text = "volumeCtv"; + // + // label27 + // + this.label27.AutoSize = true; + this.label27.Location = new System.Drawing.Point(914, 293); + this.label27.Name = "label27"; + this.label27.Size = new System.Drawing.Size(71, 13); + this.label27.TabIndex = 49; + this.label27.Text = "Ref. error [%]:"; + // + // refErrorLabel + // + this.refErrorLabel.AutoSize = true; + this.refErrorLabel.Location = new System.Drawing.Point(989, 293); + this.refErrorLabel.Name = "refErrorLabel"; + this.refErrorLabel.Size = new System.Drawing.Size(41, 13); + this.refErrorLabel.TabIndex = 50; + this.refErrorLabel.Text = "refError"; + // + // label28 + // + this.label28.AutoSize = true; + this.label28.Location = new System.Drawing.Point(236, 12); + this.label28.Name = "label28"; + this.label28.Size = new System.Drawing.Size(116, 13); + this.label28.TabIndex = 51; + this.label28.Text = "Target flow low [m3/h]:"; + // + // label29 + // + this.label29.AutoSize = true; + this.label29.Location = new System.Drawing.Point(232, 32); + this.label29.Name = "label29"; + this.label29.Size = new System.Drawing.Size(120, 13); + this.label29.TabIndex = 52; + this.label29.Text = "Target flow high [m3/h]:"; + // + // label20 + // + this.label20.AutoSize = true; + this.label20.Location = new System.Drawing.Point(263, 52); + this.label20.Name = "label20"; + this.label20.Size = new System.Drawing.Size(89, 13); + this.label20.TabIndex = 53; + this.label20.Text = "Target volume [l]:"; + // + // label30 + // + this.label30.AutoSize = true; + this.label30.Location = new System.Drawing.Point(260, 94); + this.label30.Name = "label30"; + this.label30.Size = new System.Drawing.Size(92, 13); + this.label30.TabIndex = 54; + this.label30.Text = "Estimated time [s]:"; + // + // targetFlowLowLabel + // + this.targetFlowLowLabel.AutoSize = true; + this.targetFlowLowLabel.Location = new System.Drawing.Point(355, 12); + this.targetFlowLowLabel.Name = "targetFlowLowLabel"; + this.targetFlowLowLabel.Size = new System.Drawing.Size(76, 13); + this.targetFlowLowLabel.TabIndex = 55; + this.targetFlowLowLabel.Text = "targetFlowLow"; + // + // targetFlowHighLabel + // + this.targetFlowHighLabel.AutoSize = true; + this.targetFlowHighLabel.Location = new System.Drawing.Point(355, 32); + this.targetFlowHighLabel.Name = "targetFlowHighLabel"; + this.targetFlowHighLabel.Size = new System.Drawing.Size(78, 13); + this.targetFlowHighLabel.TabIndex = 56; + this.targetFlowHighLabel.Text = "targetFlowHigh"; + // + // targetVolumeLabel + // + this.targetVolumeLabel.AutoSize = true; + this.targetVolumeLabel.Location = new System.Drawing.Point(355, 52); + this.targetVolumeLabel.Name = "targetVolumeLabel"; + this.targetVolumeLabel.Size = new System.Drawing.Size(69, 13); + this.targetVolumeLabel.TabIndex = 57; + this.targetVolumeLabel.Text = "targetVolume"; + // + // label31 + // + this.label31.AutoSize = true; + this.label31.Location = new System.Drawing.Point(263, 73); + this.label31.Name = "label31"; + this.label31.Size = new System.Drawing.Size(89, 13); + this.label31.TabIndex = 58; + this.label31.Text = "Target ref. count:"; + // + // targetRefCountLabel + // + this.targetRefCountLabel.AutoSize = true; + this.targetRefCountLabel.Location = new System.Drawing.Point(355, 73); + this.targetRefCountLabel.Name = "targetRefCountLabel"; + this.targetRefCountLabel.Size = new System.Drawing.Size(79, 13); + this.targetRefCountLabel.TabIndex = 59; + this.targetRefCountLabel.Text = "targetRefCount"; + // + // estmtdTimeLabel + // + this.estmtdTimeLabel.AutoSize = true; + this.estmtdTimeLabel.Location = new System.Drawing.Point(355, 94); + this.estmtdTimeLabel.Name = "estmtdTimeLabel"; + this.estmtdTimeLabel.Size = new System.Drawing.Size(61, 13); + this.estmtdTimeLabel.TabIndex = 60; + this.estmtdTimeLabel.Text = "estmtdTime"; + // + // label32 + // + this.label32.AutoSize = true; + this.label32.Location = new System.Drawing.Point(11, 12); + this.label32.Name = "label32"; + this.label32.Size = new System.Drawing.Size(101, 13); + this.label32.TabIndex = 61; + this.label32.Text = "Air temperature [°C]:"; + // + // label33 + // + this.label33.AutoSize = true; + this.label33.Location = new System.Drawing.Point(14, 29); + this.label33.Name = "label33"; + this.label33.Size = new System.Drawing.Size(98, 13); + this.label33.TabIndex = 62; + this.label33.Text = "Air pressure [mBar]:"; + // + // label34 + // + this.label34.AutoSize = true; + this.label34.Location = new System.Drawing.Point(32, 46); + this.label34.Name = "label34"; + this.label34.Size = new System.Drawing.Size(80, 13); + this.label34.TabIndex = 63; + this.label34.Text = "Air humidity [%]:"; + // + // airTempLabel + // + this.airTempLabel.AutoSize = true; + this.airTempLabel.Location = new System.Drawing.Point(121, 12); + this.airTempLabel.Name = "airTempLabel"; + this.airTempLabel.Size = new System.Drawing.Size(45, 13); + this.airTempLabel.TabIndex = 64; + this.airTempLabel.Text = "airTemp"; + // + // airPressLabel + // + this.airPressLabel.AutoSize = true; + this.airPressLabel.Location = new System.Drawing.Point(121, 29); + this.airPressLabel.Name = "airPressLabel"; + this.airPressLabel.Size = new System.Drawing.Size(44, 13); + this.airPressLabel.TabIndex = 65; + this.airPressLabel.Text = "airPress"; + // + // airHumiLabel + // + this.airHumiLabel.AutoSize = true; + this.airHumiLabel.Location = new System.Drawing.Point(121, 46); + this.airHumiLabel.Name = "airHumiLabel"; + this.airHumiLabel.Size = new System.Drawing.Size(42, 13); + this.airHumiLabel.TabIndex = 66; + this.airHumiLabel.Text = "airHumi"; + // + // reservoirPictureBox + // + this.reservoirPictureBox.Image = ((System.Drawing.Image)(resources.GetObject("reservoirPictureBox.Image"))); + this.reservoirPictureBox.Location = new System.Drawing.Point(880, 406); + this.reservoirPictureBox.Name = "reservoirPictureBox"; + this.reservoirPictureBox.Size = new System.Drawing.Size(142, 109); + this.reservoirPictureBox.TabIndex = 67; + this.reservoirPictureBox.TabStop = false; + // + // pumpPictureBox + // + this.pumpPictureBox.Image = ((System.Drawing.Image)(resources.GetObject("pumpPictureBox.Image"))); + this.pumpPictureBox.Location = new System.Drawing.Point(779, 478); + this.pumpPictureBox.Name = "pumpPictureBox"; + this.pumpPictureBox.Size = new System.Drawing.Size(38, 38); + this.pumpPictureBox.TabIndex = 68; + this.pumpPictureBox.TabStop = false; + // + // watermeterPictureBox1 + // + this.watermeterPictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("watermeterPictureBox1.Image"))); + this.watermeterPictureBox1.Location = new System.Drawing.Point(66, 371); + this.watermeterPictureBox1.Name = "watermeterPictureBox1"; + this.watermeterPictureBox1.Size = new System.Drawing.Size(38, 30); + this.watermeterPictureBox1.TabIndex = 69; + this.watermeterPictureBox1.TabStop = false; + // + // watermeterPictureBox2 + // + this.watermeterPictureBox2.Image = ((System.Drawing.Image)(resources.GetObject("watermeterPictureBox2.Image"))); + this.watermeterPictureBox2.Location = new System.Drawing.Point(207, 371); + this.watermeterPictureBox2.Name = "watermeterPictureBox2"; + this.watermeterPictureBox2.Size = new System.Drawing.Size(38, 30); + this.watermeterPictureBox2.TabIndex = 70; + this.watermeterPictureBox2.TabStop = false; + // + // watermeterPictureBox3 + // + this.watermeterPictureBox3.Image = ((System.Drawing.Image)(resources.GetObject("watermeterPictureBox3.Image"))); + this.watermeterPictureBox3.Location = new System.Drawing.Point(350, 371); + this.watermeterPictureBox3.Name = "watermeterPictureBox3"; + this.watermeterPictureBox3.Size = new System.Drawing.Size(38, 30); + this.watermeterPictureBox3.TabIndex = 71; + this.watermeterPictureBox3.TabStop = false; + // + // watermeterPictureBox4 + // + this.watermeterPictureBox4.Image = ((System.Drawing.Image)(resources.GetObject("watermeterPictureBox4.Image"))); + this.watermeterPictureBox4.Location = new System.Drawing.Point(491, 371); + this.watermeterPictureBox4.Name = "watermeterPictureBox4"; + this.watermeterPictureBox4.Size = new System.Drawing.Size(38, 30); + this.watermeterPictureBox4.TabIndex = 73; + this.watermeterPictureBox4.TabStop = false; + // + // passed4Label + // + this.passed4Label.AutoSize = true; + this.passed4Label.Location = new System.Drawing.Point(273, 634); + this.passed4Label.Name = "passed4Label"; + this.passed4Label.Size = new System.Drawing.Size(47, 13); + this.passed4Label.TabIndex = 9; + this.passed4Label.Text = "passed4"; + this.passed4Label.Visible = false; + // + // error4Label + // + this.error4Label.AutoSize = true; + this.error4Label.Location = new System.Drawing.Point(273, 616); + this.error4Label.Name = "error4Label"; + this.error4Label.Size = new System.Drawing.Size(34, 13); + this.error4Label.TabIndex = 8; + this.error4Label.Text = "error4"; + this.error4Label.Visible = false; + // + // volume4Label + // + this.volume4Label.AutoSize = true; + this.volume4Label.Location = new System.Drawing.Point(273, 597); + this.volume4Label.Name = "volume4Label"; + this.volume4Label.Size = new System.Drawing.Size(47, 13); + this.volume4Label.TabIndex = 6; + this.volume4Label.Text = "volume4"; + this.volume4Label.Visible = false; + // + // refPulses4Label + // + this.refPulses4Label.AutoSize = true; + this.refPulses4Label.Location = new System.Drawing.Point(273, 579); + this.refPulses4Label.Name = "refPulses4Label"; + this.refPulses4Label.Size = new System.Drawing.Size(56, 13); + this.refPulses4Label.TabIndex = 2; + this.refPulses4Label.Text = "refPulses4"; + this.refPulses4Label.Visible = false; + // + // pulses4Label + // + this.pulses4Label.AutoSize = true; + this.pulses4Label.Location = new System.Drawing.Point(273, 560); + this.pulses4Label.Name = "pulses4Label"; + this.pulses4Label.Size = new System.Drawing.Size(43, 13); + this.pulses4Label.TabIndex = 1; + this.pulses4Label.Text = "pulses4"; + this.pulses4Label.Visible = false; + // + // sensor4Label + // + this.sensor4Label.AutoSize = true; + this.sensor4Label.Location = new System.Drawing.Point(273, 542); + this.sensor4Label.Name = "sensor4Label"; + this.sensor4Label.Size = new System.Drawing.Size(44, 13); + this.sensor4Label.TabIndex = 0; + this.sensor4Label.Text = "sensor4"; + this.sensor4Label.Visible = false; + // + // watermeterPictureBox5 + // + this.watermeterPictureBox5.Image = ((System.Drawing.Image)(resources.GetObject("watermeterPictureBox5.Image"))); + this.watermeterPictureBox5.Location = new System.Drawing.Point(632, 371); + this.watermeterPictureBox5.Name = "watermeterPictureBox5"; + this.watermeterPictureBox5.Size = new System.Drawing.Size(38, 30); + this.watermeterPictureBox5.TabIndex = 75; + this.watermeterPictureBox5.TabStop = false; + // + // passed5Label + // + this.passed5Label.AutoSize = true; + this.passed5Label.Location = new System.Drawing.Point(344, 634); + this.passed5Label.Name = "passed5Label"; + this.passed5Label.Size = new System.Drawing.Size(47, 13); + this.passed5Label.TabIndex = 9; + this.passed5Label.Text = "passed5"; + this.passed5Label.Visible = false; + // + // error5Label + // + this.error5Label.AutoSize = true; + this.error5Label.Location = new System.Drawing.Point(344, 616); + this.error5Label.Name = "error5Label"; + this.error5Label.Size = new System.Drawing.Size(34, 13); + this.error5Label.TabIndex = 8; + this.error5Label.Text = "error5"; + this.error5Label.Visible = false; + // + // volume5Label + // + this.volume5Label.AutoSize = true; + this.volume5Label.Location = new System.Drawing.Point(344, 597); + this.volume5Label.Name = "volume5Label"; + this.volume5Label.Size = new System.Drawing.Size(47, 13); + this.volume5Label.TabIndex = 6; + this.volume5Label.Text = "volume5"; + this.volume5Label.Visible = false; + // + // refPulses5Label + // + this.refPulses5Label.AutoSize = true; + this.refPulses5Label.Location = new System.Drawing.Point(344, 579); + this.refPulses5Label.Name = "refPulses5Label"; + this.refPulses5Label.Size = new System.Drawing.Size(56, 13); + this.refPulses5Label.TabIndex = 2; + this.refPulses5Label.Text = "refPulses5"; + this.refPulses5Label.Visible = false; + // + // pulses5Label + // + this.pulses5Label.AutoSize = true; + this.pulses5Label.Location = new System.Drawing.Point(344, 560); + this.pulses5Label.Name = "pulses5Label"; + this.pulses5Label.Size = new System.Drawing.Size(43, 13); + this.pulses5Label.TabIndex = 1; + this.pulses5Label.Text = "pulses5"; + this.pulses5Label.Visible = false; + // + // sensor5Label + // + this.sensor5Label.AutoSize = true; + this.sensor5Label.Location = new System.Drawing.Point(344, 542); + this.sensor5Label.Name = "sensor5Label"; + this.sensor5Label.Size = new System.Drawing.Size(44, 13); + this.sensor5Label.TabIndex = 0; + this.sensor5Label.Text = "sensor5"; + this.sensor5Label.Visible = false; + // + // watermeterPictureBox6 + // + this.watermeterPictureBox6.Image = ((System.Drawing.Image)(resources.GetObject("watermeterPictureBox6.Image"))); + this.watermeterPictureBox6.Location = new System.Drawing.Point(775, 371); + this.watermeterPictureBox6.Name = "watermeterPictureBox6"; + this.watermeterPictureBox6.Size = new System.Drawing.Size(38, 30); + this.watermeterPictureBox6.TabIndex = 77; + this.watermeterPictureBox6.TabStop = false; + // + // passed6Label + // + this.passed6Label.AutoSize = true; + this.passed6Label.Location = new System.Drawing.Point(414, 634); + this.passed6Label.Name = "passed6Label"; + this.passed6Label.Size = new System.Drawing.Size(47, 13); + this.passed6Label.TabIndex = 9; + this.passed6Label.Text = "passed6"; + this.passed6Label.Visible = false; + // + // error6Label + // + this.error6Label.AutoSize = true; + this.error6Label.Location = new System.Drawing.Point(414, 616); + this.error6Label.Name = "error6Label"; + this.error6Label.Size = new System.Drawing.Size(34, 13); + this.error6Label.TabIndex = 8; + this.error6Label.Text = "error6"; + this.error6Label.Visible = false; + // + // volume6Label + // + this.volume6Label.AutoSize = true; + this.volume6Label.Location = new System.Drawing.Point(414, 597); + this.volume6Label.Name = "volume6Label"; + this.volume6Label.Size = new System.Drawing.Size(47, 13); + this.volume6Label.TabIndex = 6; + this.volume6Label.Text = "volume6"; + this.volume6Label.Visible = false; + // + // refPulses6Label + // + this.refPulses6Label.AutoSize = true; + this.refPulses6Label.Location = new System.Drawing.Point(414, 579); + this.refPulses6Label.Name = "refPulses6Label"; + this.refPulses6Label.Size = new System.Drawing.Size(56, 13); + this.refPulses6Label.TabIndex = 2; + this.refPulses6Label.Text = "refPulses6"; + this.refPulses6Label.Visible = false; + // + // pulses6Label + // + this.pulses6Label.AutoSize = true; + this.pulses6Label.Location = new System.Drawing.Point(414, 560); + this.pulses6Label.Name = "pulses6Label"; + this.pulses6Label.Size = new System.Drawing.Size(43, 13); + this.pulses6Label.TabIndex = 1; + this.pulses6Label.Text = "pulses6"; + this.pulses6Label.Visible = false; + // + // sensor6Label + // + this.sensor6Label.AutoSize = true; + this.sensor6Label.Location = new System.Drawing.Point(414, 542); + this.sensor6Label.Name = "sensor6Label"; + this.sensor6Label.Size = new System.Drawing.Size(44, 13); + this.sensor6Label.TabIndex = 0; + this.sensor6Label.Text = "sensor6"; + this.sensor6Label.Visible = false; + // + // flowMeterPictureBox + // + this.flowMeterPictureBox.ErrorImage = null; + this.flowMeterPictureBox.Image = ((System.Drawing.Image)(resources.GetObject("flowMeterPictureBox.Image"))); + this.flowMeterPictureBox.InitialImage = null; + this.flowMeterPictureBox.Location = new System.Drawing.Point(864, 102); + this.flowMeterPictureBox.Name = "flowMeterPictureBox"; + this.flowMeterPictureBox.Size = new System.Drawing.Size(38, 38); + this.flowMeterPictureBox.TabIndex = 78; + this.flowMeterPictureBox.TabStop = false; + // + // pictureBox1 + // + this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image"))); + this.pictureBox1.Location = new System.Drawing.Point(864, 45); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(38, 35); + this.pictureBox1.TabIndex = 79; + this.pictureBox1.TabStop = false; + // + // watermeterPictureBox1z + // + this.watermeterPictureBox1z.Image = ((System.Drawing.Image)(resources.GetObject("watermeterPictureBox1z.Image"))); + this.watermeterPictureBox1z.Location = new System.Drawing.Point(207, 416); + this.watermeterPictureBox1z.Name = "watermeterPictureBox1z"; + this.watermeterPictureBox1z.Size = new System.Drawing.Size(38, 30); + this.watermeterPictureBox1z.TabIndex = 80; + this.watermeterPictureBox1z.TabStop = false; + // + // watermeterPictureBox2z + // + this.watermeterPictureBox2z.Image = ((System.Drawing.Image)(resources.GetObject("watermeterPictureBox2z.Image"))); + this.watermeterPictureBox2z.Location = new System.Drawing.Point(491, 416); + this.watermeterPictureBox2z.Name = "watermeterPictureBox2z"; + this.watermeterPictureBox2z.Size = new System.Drawing.Size(38, 30); + this.watermeterPictureBox2z.TabIndex = 81; + this.watermeterPictureBox2z.TabStop = false; + // + // watermeterPictureBox3z + // + this.watermeterPictureBox3z.Image = ((System.Drawing.Image)(resources.GetObject("watermeterPictureBox3z.Image"))); + this.watermeterPictureBox3z.Location = new System.Drawing.Point(775, 416); + this.watermeterPictureBox3z.Name = "watermeterPictureBox3z"; + this.watermeterPictureBox3z.Size = new System.Drawing.Size(38, 30); + this.watermeterPictureBox3z.TabIndex = 82; + this.watermeterPictureBox3z.TabStop = false; + // + // groupBox1z + // + this.groupBox1z.Controls.Add(this.passed1zLabel); + this.groupBox1z.Controls.Add(this.error1zLabel); + this.groupBox1z.Controls.Add(this.label56); + this.groupBox1z.Controls.Add(this.volume1zLabel); + this.groupBox1z.Controls.Add(this.label58); + this.groupBox1z.Location = new System.Drawing.Point(23, 151); + this.groupBox1z.Name = "groupBox1z"; + this.groupBox1z.Size = new System.Drawing.Size(280, 76); + this.groupBox1z.TabIndex = 83; + this.groupBox1z.TabStop = false; + this.groupBox1z.Text = "Combined meter 1"; + // + // passed1zLabel + // + this.passed1zLabel.AutoSize = true; + this.passed1zLabel.Location = new System.Drawing.Point(141, 55); + this.passed1zLabel.Name = "passed1zLabel"; + this.passed1zLabel.Size = new System.Drawing.Size(52, 13); + this.passed1zLabel.TabIndex = 9; + this.passed1zLabel.Text = "passed1z"; + // + // error1zLabel + // + this.error1zLabel.AutoSize = true; + this.error1zLabel.Location = new System.Drawing.Point(141, 37); + this.error1zLabel.Name = "error1zLabel"; + this.error1zLabel.Size = new System.Drawing.Size(39, 13); + this.error1zLabel.TabIndex = 8; + this.error1zLabel.Text = "error1z"; + // + // label56 + // + this.label56.AutoSize = true; + this.label56.Location = new System.Drawing.Point(86, 37); + this.label56.Name = "label56"; + this.label56.Size = new System.Drawing.Size(49, 13); + this.label56.TabIndex = 7; + this.label56.Text = "Error [%]:"; + // + // volume1zLabel + // + this.volume1zLabel.AutoSize = true; + this.volume1zLabel.Location = new System.Drawing.Point(141, 18); + this.volume1zLabel.Name = "volume1zLabel"; + this.volume1zLabel.Size = new System.Drawing.Size(52, 13); + this.volume1zLabel.TabIndex = 6; + this.volume1zLabel.Text = "volume1z"; + // + // label58 + // + this.label58.AutoSize = true; + this.label58.Location = new System.Drawing.Point(90, 18); + this.label58.Name = "label58"; + this.label58.Size = new System.Drawing.Size(45, 13); + this.label58.TabIndex = 5; + this.label58.Text = "Volume:"; + // + // groupBox2z + // + this.groupBox2z.Controls.Add(this.passed2zLabel); + this.groupBox2z.Controls.Add(this.error2zLabel); + this.groupBox2z.Controls.Add(this.label52); + this.groupBox2z.Controls.Add(this.volume2zLabel); + this.groupBox2z.Controls.Add(this.label59); + this.groupBox2z.Location = new System.Drawing.Point(305, 151); + this.groupBox2z.Name = "groupBox2z"; + this.groupBox2z.Size = new System.Drawing.Size(280, 76); + this.groupBox2z.TabIndex = 84; + this.groupBox2z.TabStop = false; + this.groupBox2z.Text = "Combined meter 2"; + // + // passed2zLabel + // + this.passed2zLabel.AutoSize = true; + this.passed2zLabel.Location = new System.Drawing.Point(141, 56); + this.passed2zLabel.Name = "passed2zLabel"; + this.passed2zLabel.Size = new System.Drawing.Size(52, 13); + this.passed2zLabel.TabIndex = 9; + this.passed2zLabel.Text = "passed2z"; + // + // error2zLabel + // + this.error2zLabel.AutoSize = true; + this.error2zLabel.Location = new System.Drawing.Point(141, 38); + this.error2zLabel.Name = "error2zLabel"; + this.error2zLabel.Size = new System.Drawing.Size(39, 13); + this.error2zLabel.TabIndex = 8; + this.error2zLabel.Text = "error2z"; + // + // label52 + // + this.label52.AutoSize = true; + this.label52.Location = new System.Drawing.Point(86, 38); + this.label52.Name = "label52"; + this.label52.Size = new System.Drawing.Size(49, 13); + this.label52.TabIndex = 7; + this.label52.Text = "Error [%]:"; + // + // volume2zLabel + // + this.volume2zLabel.AutoSize = true; + this.volume2zLabel.Location = new System.Drawing.Point(141, 19); + this.volume2zLabel.Name = "volume2zLabel"; + this.volume2zLabel.Size = new System.Drawing.Size(52, 13); + this.volume2zLabel.TabIndex = 6; + this.volume2zLabel.Text = "volume2z"; + // + // label59 + // + this.label59.AutoSize = true; + this.label59.Location = new System.Drawing.Point(90, 19); + this.label59.Name = "label59"; + this.label59.Size = new System.Drawing.Size(45, 13); + this.label59.TabIndex = 5; + this.label59.Text = "Volume:"; + // + // groupBox3z + // + this.groupBox3z.Controls.Add(this.passed3zLabel); + this.groupBox3z.Controls.Add(this.error3zLabel); + this.groupBox3z.Controls.Add(this.label57); + this.groupBox3z.Controls.Add(this.volume3zLabel); + this.groupBox3z.Controls.Add(this.label61); + this.groupBox3z.Location = new System.Drawing.Point(587, 151); + this.groupBox3z.Name = "groupBox3z"; + this.groupBox3z.Size = new System.Drawing.Size(280, 76); + this.groupBox3z.TabIndex = 85; + this.groupBox3z.TabStop = false; + this.groupBox3z.Text = "Combined meter 3"; + // + // passed3zLabel + // + this.passed3zLabel.AutoSize = true; + this.passed3zLabel.Location = new System.Drawing.Point(141, 56); + this.passed3zLabel.Name = "passed3zLabel"; + this.passed3zLabel.Size = new System.Drawing.Size(52, 13); + this.passed3zLabel.TabIndex = 9; + this.passed3zLabel.Text = "passed3z"; + // + // error3zLabel + // + this.error3zLabel.AutoSize = true; + this.error3zLabel.Location = new System.Drawing.Point(141, 38); + this.error3zLabel.Name = "error3zLabel"; + this.error3zLabel.Size = new System.Drawing.Size(39, 13); + this.error3zLabel.TabIndex = 8; + this.error3zLabel.Text = "error3z"; + // + // label57 + // + this.label57.AutoSize = true; + this.label57.Location = new System.Drawing.Point(86, 38); + this.label57.Name = "label57"; + this.label57.Size = new System.Drawing.Size(49, 13); + this.label57.TabIndex = 7; + this.label57.Text = "Error [%]:"; + // + // volume3zLabel + // + this.volume3zLabel.AutoSize = true; + this.volume3zLabel.Location = new System.Drawing.Point(141, 19); + this.volume3zLabel.Name = "volume3zLabel"; + this.volume3zLabel.Size = new System.Drawing.Size(52, 13); + this.volume3zLabel.TabIndex = 6; + this.volume3zLabel.Text = "volume3z"; + // + // label61 + // + this.label61.AutoSize = true; + this.label61.Location = new System.Drawing.Point(90, 19); + this.label61.Name = "label61"; + this.label61.Size = new System.Drawing.Size(45, 13); + this.label61.TabIndex = 5; + this.label61.Text = "Volume:"; + // + // pumpPctTextBox + // + this.pumpPctTextBox.Location = new System.Drawing.Point(777, 454); + this.pumpPctTextBox.Name = "pumpPctTextBox"; + this.pumpPctTextBox.Size = new System.Drawing.Size(42, 20); + this.pumpPctTextBox.TabIndex = 86; + // + // meter1Label + // + this.meter1Label.AutoSize = true; + this.meter1Label.Location = new System.Drawing.Point(64, 524); + this.meter1Label.Name = "meter1Label"; + this.meter1Label.Size = new System.Drawing.Size(43, 13); + this.meter1Label.TabIndex = 87; + this.meter1Label.Text = "Meter 1"; + this.meter1Label.Visible = false; + // + // meter2Label + // + this.meter2Label.AutoSize = true; + this.meter2Label.Location = new System.Drawing.Point(134, 524); + this.meter2Label.Name = "meter2Label"; + this.meter2Label.Size = new System.Drawing.Size(43, 13); + this.meter2Label.TabIndex = 88; + this.meter2Label.Text = "Meter 2"; + this.meter2Label.Visible = false; + // + // meter3Label + // + this.meter3Label.AutoSize = true; + this.meter3Label.Location = new System.Drawing.Point(204, 524); + this.meter3Label.Name = "meter3Label"; + this.meter3Label.Size = new System.Drawing.Size(43, 13); + this.meter3Label.TabIndex = 89; + this.meter3Label.Text = "Meter 3"; + this.meter3Label.Visible = false; + // + // meter4Label + // + this.meter4Label.AutoSize = true; + this.meter4Label.Location = new System.Drawing.Point(274, 524); + this.meter4Label.Name = "meter4Label"; + this.meter4Label.Size = new System.Drawing.Size(43, 13); + this.meter4Label.TabIndex = 90; + this.meter4Label.Text = "Meter 4"; + this.meter4Label.Visible = false; + // + // meter5Label + // + this.meter5Label.AutoSize = true; + this.meter5Label.Location = new System.Drawing.Point(344, 524); + this.meter5Label.Name = "meter5Label"; + this.meter5Label.Size = new System.Drawing.Size(43, 13); + this.meter5Label.TabIndex = 91; + this.meter5Label.Text = "Meter 5"; + this.meter5Label.Visible = false; + // + // meter6Label + // + this.meter6Label.AutoSize = true; + this.meter6Label.Location = new System.Drawing.Point(414, 524); + this.meter6Label.Name = "meter6Label"; + this.meter6Label.Size = new System.Drawing.Size(43, 13); + this.meter6Label.TabIndex = 92; + this.meter6Label.Text = "Meter 6"; + this.meter6Label.Visible = false; + // + // meter12Label + // + this.meter12Label.AutoSize = true; + this.meter12Label.Location = new System.Drawing.Point(834, 524); + this.meter12Label.Name = "meter12Label"; + this.meter12Label.Size = new System.Drawing.Size(49, 13); + this.meter12Label.TabIndex = 134; + this.meter12Label.Text = "Meter 12"; + this.meter12Label.Visible = false; + // + // meter11Label + // + this.meter11Label.AutoSize = true; + this.meter11Label.Location = new System.Drawing.Point(764, 524); + this.meter11Label.Name = "meter11Label"; + this.meter11Label.Size = new System.Drawing.Size(49, 13); + this.meter11Label.TabIndex = 133; + this.meter11Label.Text = "Meter 11"; + this.meter11Label.Visible = false; + // + // meter10Label + // + this.meter10Label.AutoSize = true; + this.meter10Label.Location = new System.Drawing.Point(694, 524); + this.meter10Label.Name = "meter10Label"; + this.meter10Label.Size = new System.Drawing.Size(49, 13); + this.meter10Label.TabIndex = 132; + this.meter10Label.Text = "Meter 10"; + this.meter10Label.Visible = false; + // + // meter9Label + // + this.meter9Label.AutoSize = true; + this.meter9Label.Location = new System.Drawing.Point(624, 524); + this.meter9Label.Name = "meter9Label"; + this.meter9Label.Size = new System.Drawing.Size(43, 13); + this.meter9Label.TabIndex = 131; + this.meter9Label.Text = "Meter 9"; + this.meter9Label.Visible = false; + // + // meter8Label + // + this.meter8Label.AutoSize = true; + this.meter8Label.Location = new System.Drawing.Point(554, 524); + this.meter8Label.Name = "meter8Label"; + this.meter8Label.Size = new System.Drawing.Size(43, 13); + this.meter8Label.TabIndex = 130; + this.meter8Label.Text = "Meter 8"; + this.meter8Label.Visible = false; + // + // meter7Label + // + this.meter7Label.AutoSize = true; + this.meter7Label.Location = new System.Drawing.Point(484, 524); + this.meter7Label.Name = "meter7Label"; + this.meter7Label.Size = new System.Drawing.Size(43, 13); + this.meter7Label.TabIndex = 129; + this.meter7Label.Text = "Meter 7"; + this.meter7Label.Visible = false; + // + // passed12Label + // + this.passed12Label.AutoSize = true; + this.passed12Label.Location = new System.Drawing.Point(834, 634); + this.passed12Label.Name = "passed12Label"; + this.passed12Label.Size = new System.Drawing.Size(53, 13); + this.passed12Label.TabIndex = 123; + this.passed12Label.Text = "passed12"; + this.passed12Label.Visible = false; + // + // passed11Label + // + this.passed11Label.AutoSize = true; + this.passed11Label.Location = new System.Drawing.Point(764, 634); + this.passed11Label.Name = "passed11Label"; + this.passed11Label.Size = new System.Drawing.Size(53, 13); + this.passed11Label.TabIndex = 124; + this.passed11Label.Text = "passed11"; + this.passed11Label.Visible = false; + // + // error12Label + // + this.error12Label.AutoSize = true; + this.error12Label.Location = new System.Drawing.Point(834, 616); + this.error12Label.Name = "error12Label"; + this.error12Label.Size = new System.Drawing.Size(40, 13); + this.error12Label.TabIndex = 118; + this.error12Label.Text = "error12"; + this.error12Label.Visible = false; + // + // passed10Label + // + this.passed10Label.AutoSize = true; + this.passed10Label.Location = new System.Drawing.Point(693, 634); + this.passed10Label.Name = "passed10Label"; + this.passed10Label.Size = new System.Drawing.Size(53, 13); + this.passed10Label.TabIndex = 125; + this.passed10Label.Text = "passed10"; + this.passed10Label.Visible = false; + // + // error11Label + // + this.error11Label.AutoSize = true; + this.error11Label.Location = new System.Drawing.Point(764, 616); + this.error11Label.Name = "error11Label"; + this.error11Label.Size = new System.Drawing.Size(40, 13); + this.error11Label.TabIndex = 119; + this.error11Label.Text = "error11"; + this.error11Label.Visible = false; + // + // volume12Label + // + this.volume12Label.AutoSize = true; + this.volume12Label.Location = new System.Drawing.Point(834, 597); + this.volume12Label.Name = "volume12Label"; + this.volume12Label.Size = new System.Drawing.Size(53, 13); + this.volume12Label.TabIndex = 114; + this.volume12Label.Text = "volume12"; + this.volume12Label.Visible = false; + // + // passed9Label + // + this.passed9Label.AutoSize = true; + this.passed9Label.Location = new System.Drawing.Point(624, 634); + this.passed9Label.Name = "passed9Label"; + this.passed9Label.Size = new System.Drawing.Size(47, 13); + this.passed9Label.TabIndex = 127; + this.passed9Label.Text = "passed9"; + this.passed9Label.Visible = false; + // + // error10Label + // + this.error10Label.AutoSize = true; + this.error10Label.Location = new System.Drawing.Point(693, 616); + this.error10Label.Name = "error10Label"; + this.error10Label.Size = new System.Drawing.Size(40, 13); + this.error10Label.TabIndex = 117; + this.error10Label.Text = "error10"; + this.error10Label.Visible = false; + // + // volume11Label + // + this.volume11Label.AutoSize = true; + this.volume11Label.Location = new System.Drawing.Point(764, 597); + this.volume11Label.Name = "volume11Label"; + this.volume11Label.Size = new System.Drawing.Size(53, 13); + this.volume11Label.TabIndex = 116; + this.volume11Label.Text = "volume11"; + this.volume11Label.Visible = false; + // + // passed8Label + // + this.passed8Label.AutoSize = true; + this.passed8Label.Location = new System.Drawing.Point(554, 634); + this.passed8Label.Name = "passed8Label"; + this.passed8Label.Size = new System.Drawing.Size(47, 13); + this.passed8Label.TabIndex = 126; + this.passed8Label.Text = "passed8"; + this.passed8Label.Visible = false; + // + // refPulses12Label + // + this.refPulses12Label.AutoSize = true; + this.refPulses12Label.Location = new System.Drawing.Point(834, 579); + this.refPulses12Label.Name = "refPulses12Label"; + this.refPulses12Label.Size = new System.Drawing.Size(62, 13); + this.refPulses12Label.TabIndex = 106; + this.refPulses12Label.Text = "refPulses12"; + this.refPulses12Label.Visible = false; + // + // error9Label + // + this.error9Label.AutoSize = true; + this.error9Label.Location = new System.Drawing.Point(624, 616); + this.error9Label.Name = "error9Label"; + this.error9Label.Size = new System.Drawing.Size(34, 13); + this.error9Label.TabIndex = 120; + this.error9Label.Text = "error9"; + this.error9Label.Visible = false; + // + // pulses12Label + // + this.pulses12Label.AutoSize = true; + this.pulses12Label.Location = new System.Drawing.Point(834, 560); + this.pulses12Label.Name = "pulses12Label"; + this.pulses12Label.Size = new System.Drawing.Size(49, 13); + this.pulses12Label.TabIndex = 102; + this.pulses12Label.Text = "pulses12"; + this.pulses12Label.Visible = false; + // + // sensor12Label + // + this.sensor12Label.AutoSize = true; + this.sensor12Label.Location = new System.Drawing.Point(834, 542); + this.sensor12Label.Name = "sensor12Label"; + this.sensor12Label.Size = new System.Drawing.Size(50, 13); + this.sensor12Label.TabIndex = 95; + this.sensor12Label.Text = "sensor12"; + this.sensor12Label.Visible = false; + // + // volume10Label + // + this.volume10Label.AutoSize = true; + this.volume10Label.Location = new System.Drawing.Point(693, 597); + this.volume10Label.Name = "volume10Label"; + this.volume10Label.Size = new System.Drawing.Size(53, 13); + this.volume10Label.TabIndex = 115; + this.volume10Label.Text = "volume10"; + this.volume10Label.Visible = false; + // + // passed7Label + // + this.passed7Label.AutoSize = true; + this.passed7Label.Location = new System.Drawing.Point(484, 634); + this.passed7Label.Name = "passed7Label"; + this.passed7Label.Size = new System.Drawing.Size(47, 13); + this.passed7Label.TabIndex = 128; + this.passed7Label.Text = "passed7"; + this.passed7Label.Visible = false; + // + // refPulses11Label + // + this.refPulses11Label.AutoSize = true; + this.refPulses11Label.Location = new System.Drawing.Point(764, 579); + this.refPulses11Label.Name = "refPulses11Label"; + this.refPulses11Label.Size = new System.Drawing.Size(62, 13); + this.refPulses11Label.TabIndex = 105; + this.refPulses11Label.Text = "refPulses11"; + this.refPulses11Label.Visible = false; + // + // pulses11Label + // + this.pulses11Label.AutoSize = true; + this.pulses11Label.Location = new System.Drawing.Point(764, 560); + this.pulses11Label.Name = "pulses11Label"; + this.pulses11Label.Size = new System.Drawing.Size(49, 13); + this.pulses11Label.TabIndex = 99; + this.pulses11Label.Text = "pulses11"; + this.pulses11Label.Visible = false; + // + // error8Label + // + this.error8Label.AutoSize = true; + this.error8Label.Location = new System.Drawing.Point(554, 616); + this.error8Label.Name = "error8Label"; + this.error8Label.Size = new System.Drawing.Size(34, 13); + this.error8Label.TabIndex = 121; + this.error8Label.Text = "error8"; + this.error8Label.Visible = false; + // + // sensor11Label + // + this.sensor11Label.AutoSize = true; + this.sensor11Label.Location = new System.Drawing.Point(764, 542); + this.sensor11Label.Name = "sensor11Label"; + this.sensor11Label.Size = new System.Drawing.Size(50, 13); + this.sensor11Label.TabIndex = 96; + this.sensor11Label.Text = "sensor11"; + this.sensor11Label.Visible = false; + // + // volume9Label + // + this.volume9Label.AutoSize = true; + this.volume9Label.Location = new System.Drawing.Point(624, 597); + this.volume9Label.Name = "volume9Label"; + this.volume9Label.Size = new System.Drawing.Size(47, 13); + this.volume9Label.TabIndex = 111; + this.volume9Label.Text = "volume9"; + this.volume9Label.Visible = false; + // + // refPulses10Label + // + this.refPulses10Label.AutoSize = true; + this.refPulses10Label.Location = new System.Drawing.Point(693, 579); + this.refPulses10Label.Name = "refPulses10Label"; + this.refPulses10Label.Size = new System.Drawing.Size(62, 13); + this.refPulses10Label.TabIndex = 110; + this.refPulses10Label.Text = "refPulses10"; + this.refPulses10Label.Visible = false; + // + // pulses10Label + // + this.pulses10Label.AutoSize = true; + this.pulses10Label.Location = new System.Drawing.Point(693, 560); + this.pulses10Label.Name = "pulses10Label"; + this.pulses10Label.Size = new System.Drawing.Size(49, 13); + this.pulses10Label.TabIndex = 100; + this.pulses10Label.Text = "pulses10"; + this.pulses10Label.Visible = false; + // + // volume8Label + // + this.volume8Label.AutoSize = true; + this.volume8Label.Location = new System.Drawing.Point(554, 597); + this.volume8Label.Name = "volume8Label"; + this.volume8Label.Size = new System.Drawing.Size(47, 13); + this.volume8Label.TabIndex = 113; + this.volume8Label.Text = "volume8"; + this.volume8Label.Visible = false; + // + // sensor10Label + // + this.sensor10Label.AutoSize = true; + this.sensor10Label.Location = new System.Drawing.Point(693, 542); + this.sensor10Label.Name = "sensor10Label"; + this.sensor10Label.Size = new System.Drawing.Size(50, 13); + this.sensor10Label.TabIndex = 93; + this.sensor10Label.Text = "sensor10"; + this.sensor10Label.Visible = false; + // + // error7Label + // + this.error7Label.AutoSize = true; + this.error7Label.Location = new System.Drawing.Point(484, 616); + this.error7Label.Name = "error7Label"; + this.error7Label.Size = new System.Drawing.Size(34, 13); + this.error7Label.TabIndex = 122; + this.error7Label.Text = "error7"; + this.error7Label.Visible = false; + // + // refPulses9Label + // + this.refPulses9Label.AutoSize = true; + this.refPulses9Label.Location = new System.Drawing.Point(624, 579); + this.refPulses9Label.Name = "refPulses9Label"; + this.refPulses9Label.Size = new System.Drawing.Size(56, 13); + this.refPulses9Label.TabIndex = 108; + this.refPulses9Label.Text = "refPulses9"; + this.refPulses9Label.Visible = false; + // + // volume7Label + // + this.volume7Label.AutoSize = true; + this.volume7Label.Location = new System.Drawing.Point(484, 597); + this.volume7Label.Name = "volume7Label"; + this.volume7Label.Size = new System.Drawing.Size(47, 13); + this.volume7Label.TabIndex = 112; + this.volume7Label.Text = "volume7"; + this.volume7Label.Visible = false; + // + // pulses9Label + // + this.pulses9Label.AutoSize = true; + this.pulses9Label.Location = new System.Drawing.Point(624, 560); + this.pulses9Label.Name = "pulses9Label"; + this.pulses9Label.Size = new System.Drawing.Size(43, 13); + this.pulses9Label.TabIndex = 104; + this.pulses9Label.Text = "pulses9"; + this.pulses9Label.Visible = false; + // + // sensor9Label + // + this.sensor9Label.AutoSize = true; + this.sensor9Label.Location = new System.Drawing.Point(624, 542); + this.sensor9Label.Name = "sensor9Label"; + this.sensor9Label.Size = new System.Drawing.Size(44, 13); + this.sensor9Label.TabIndex = 94; + this.sensor9Label.Text = "sensor9"; + this.sensor9Label.Visible = false; + // + // refPulses7Label + // + this.refPulses7Label.AutoSize = true; + this.refPulses7Label.Location = new System.Drawing.Point(484, 579); + this.refPulses7Label.Name = "refPulses7Label"; + this.refPulses7Label.Size = new System.Drawing.Size(56, 13); + this.refPulses7Label.TabIndex = 109; + this.refPulses7Label.Text = "refPulses7"; + this.refPulses7Label.Visible = false; + // + // refPulses8Label + // + this.refPulses8Label.AutoSize = true; + this.refPulses8Label.Location = new System.Drawing.Point(554, 579); + this.refPulses8Label.Name = "refPulses8Label"; + this.refPulses8Label.Size = new System.Drawing.Size(56, 13); + this.refPulses8Label.TabIndex = 107; + this.refPulses8Label.Text = "refPulses8"; + this.refPulses8Label.Visible = false; + // + // pulses8Label + // + this.pulses8Label.AutoSize = true; + this.pulses8Label.Location = new System.Drawing.Point(554, 560); + this.pulses8Label.Name = "pulses8Label"; + this.pulses8Label.Size = new System.Drawing.Size(43, 13); + this.pulses8Label.TabIndex = 103; + this.pulses8Label.Text = "pulses8"; + this.pulses8Label.Visible = false; + // + // pulses7Label + // + this.pulses7Label.AutoSize = true; + this.pulses7Label.Location = new System.Drawing.Point(484, 560); + this.pulses7Label.Name = "pulses7Label"; + this.pulses7Label.Size = new System.Drawing.Size(43, 13); + this.pulses7Label.TabIndex = 101; + this.pulses7Label.Text = "pulses7"; + this.pulses7Label.Visible = false; + // + // sensor8Label + // + this.sensor8Label.AutoSize = true; + this.sensor8Label.Location = new System.Drawing.Point(554, 542); + this.sensor8Label.Name = "sensor8Label"; + this.sensor8Label.Size = new System.Drawing.Size(44, 13); + this.sensor8Label.TabIndex = 97; + this.sensor8Label.Text = "sensor8"; + this.sensor8Label.Visible = false; + // + // sensor7Label + // + this.sensor7Label.AutoSize = true; + this.sensor7Label.Location = new System.Drawing.Point(484, 542); + this.sensor7Label.Name = "sensor7Label"; + this.sensor7Label.Size = new System.Drawing.Size(44, 13); + this.sensor7Label.TabIndex = 98; + this.sensor7Label.Text = "sensor7"; + this.sensor7Label.Visible = false; + // + // meter24Label + // + this.meter24Label.AutoSize = true; + this.meter24Label.Location = new System.Drawing.Point(834, 229); + this.meter24Label.Name = "meter24Label"; + this.meter24Label.Size = new System.Drawing.Size(49, 13); + this.meter24Label.TabIndex = 223; + this.meter24Label.Text = "Meter 24"; + this.meter24Label.Visible = false; + // + // meter23Label + // + this.meter23Label.AutoSize = true; + this.meter23Label.Location = new System.Drawing.Point(764, 229); + this.meter23Label.Name = "meter23Label"; + this.meter23Label.Size = new System.Drawing.Size(49, 13); + this.meter23Label.TabIndex = 222; + this.meter23Label.Text = "Meter 23"; + this.meter23Label.Visible = false; + // + // meter22Label + // + this.meter22Label.AutoSize = true; + this.meter22Label.Location = new System.Drawing.Point(694, 229); + this.meter22Label.Name = "meter22Label"; + this.meter22Label.Size = new System.Drawing.Size(49, 13); + this.meter22Label.TabIndex = 221; + this.meter22Label.Text = "Meter 22"; + this.meter22Label.Visible = false; + // + // meter21Label + // + this.meter21Label.AutoSize = true; + this.meter21Label.Location = new System.Drawing.Point(624, 229); + this.meter21Label.Name = "meter21Label"; + this.meter21Label.Size = new System.Drawing.Size(49, 13); + this.meter21Label.TabIndex = 220; + this.meter21Label.Text = "Meter 21"; + this.meter21Label.Visible = false; + // + // meter20Label + // + this.meter20Label.AutoSize = true; + this.meter20Label.Location = new System.Drawing.Point(554, 229); + this.meter20Label.Name = "meter20Label"; + this.meter20Label.Size = new System.Drawing.Size(49, 13); + this.meter20Label.TabIndex = 219; + this.meter20Label.Text = "Meter 20"; + this.meter20Label.Visible = false; + // + // meter19Label + // + this.meter19Label.AutoSize = true; + this.meter19Label.Location = new System.Drawing.Point(484, 229); + this.meter19Label.Name = "meter19Label"; + this.meter19Label.Size = new System.Drawing.Size(49, 13); + this.meter19Label.TabIndex = 218; + this.meter19Label.Text = "Meter 19"; + this.meter19Label.Visible = false; + // + // passed24Label + // + this.passed24Label.AutoSize = true; + this.passed24Label.Location = new System.Drawing.Point(834, 339); + this.passed24Label.Name = "passed24Label"; + this.passed24Label.Size = new System.Drawing.Size(53, 13); + this.passed24Label.TabIndex = 212; + this.passed24Label.Text = "passed24"; + this.passed24Label.Visible = false; + // + // passed23Label + // + this.passed23Label.AutoSize = true; + this.passed23Label.Location = new System.Drawing.Point(764, 339); + this.passed23Label.Name = "passed23Label"; + this.passed23Label.Size = new System.Drawing.Size(53, 13); + this.passed23Label.TabIndex = 213; + this.passed23Label.Text = "passed23"; + this.passed23Label.Visible = false; + // + // error24Label + // + this.error24Label.AutoSize = true; + this.error24Label.Location = new System.Drawing.Point(834, 321); + this.error24Label.Name = "error24Label"; + this.error24Label.Size = new System.Drawing.Size(40, 13); + this.error24Label.TabIndex = 207; + this.error24Label.Text = "error24"; + this.error24Label.Visible = false; + // + // passed22Label + // + this.passed22Label.AutoSize = true; + this.passed22Label.Location = new System.Drawing.Point(693, 339); + this.passed22Label.Name = "passed22Label"; + this.passed22Label.Size = new System.Drawing.Size(53, 13); + this.passed22Label.TabIndex = 214; + this.passed22Label.Text = "passed22"; + this.passed22Label.Visible = false; + // + // error23Label + // + this.error23Label.AutoSize = true; + this.error23Label.Location = new System.Drawing.Point(764, 321); + this.error23Label.Name = "error23Label"; + this.error23Label.Size = new System.Drawing.Size(40, 13); + this.error23Label.TabIndex = 208; + this.error23Label.Text = "error23"; + this.error23Label.Visible = false; + // + // volume24Label + // + this.volume24Label.AutoSize = true; + this.volume24Label.Location = new System.Drawing.Point(834, 302); + this.volume24Label.Name = "volume24Label"; + this.volume24Label.Size = new System.Drawing.Size(53, 13); + this.volume24Label.TabIndex = 203; + this.volume24Label.Text = "volume24"; + this.volume24Label.Visible = false; + // + // passed21Label + // + this.passed21Label.AutoSize = true; + this.passed21Label.Location = new System.Drawing.Point(624, 339); + this.passed21Label.Name = "passed21Label"; + this.passed21Label.Size = new System.Drawing.Size(53, 13); + this.passed21Label.TabIndex = 216; + this.passed21Label.Text = "passed21"; + this.passed21Label.Visible = false; + // + // error22Label + // + this.error22Label.AutoSize = true; + this.error22Label.Location = new System.Drawing.Point(693, 321); + this.error22Label.Name = "error22Label"; + this.error22Label.Size = new System.Drawing.Size(40, 13); + this.error22Label.TabIndex = 206; + this.error22Label.Text = "error22"; + this.error22Label.Visible = false; + // + // volume23Label + // + this.volume23Label.AutoSize = true; + this.volume23Label.Location = new System.Drawing.Point(764, 302); + this.volume23Label.Name = "volume23Label"; + this.volume23Label.Size = new System.Drawing.Size(53, 13); + this.volume23Label.TabIndex = 205; + this.volume23Label.Text = "volume23"; + this.volume23Label.Visible = false; + // + // passed20Label + // + this.passed20Label.AutoSize = true; + this.passed20Label.Location = new System.Drawing.Point(554, 339); + this.passed20Label.Name = "passed20Label"; + this.passed20Label.Size = new System.Drawing.Size(53, 13); + this.passed20Label.TabIndex = 215; + this.passed20Label.Text = "passed20"; + this.passed20Label.Visible = false; + // + // refPulses24Label + // + this.refPulses24Label.AutoSize = true; + this.refPulses24Label.Location = new System.Drawing.Point(834, 284); + this.refPulses24Label.Name = "refPulses24Label"; + this.refPulses24Label.Size = new System.Drawing.Size(62, 13); + this.refPulses24Label.TabIndex = 195; + this.refPulses24Label.Text = "refPulses24"; + this.refPulses24Label.Visible = false; + // + // error21Label + // + this.error21Label.AutoSize = true; + this.error21Label.Location = new System.Drawing.Point(624, 321); + this.error21Label.Name = "error21Label"; + this.error21Label.Size = new System.Drawing.Size(40, 13); + this.error21Label.TabIndex = 209; + this.error21Label.Text = "error21"; + this.error21Label.Visible = false; + // + // pulses24Label + // + this.pulses24Label.AutoSize = true; + this.pulses24Label.Location = new System.Drawing.Point(834, 265); + this.pulses24Label.Name = "pulses24Label"; + this.pulses24Label.Size = new System.Drawing.Size(49, 13); + this.pulses24Label.TabIndex = 191; + this.pulses24Label.Text = "pulses24"; + this.pulses24Label.Visible = false; + // + // sensor24Label + // + this.sensor24Label.AutoSize = true; + this.sensor24Label.Location = new System.Drawing.Point(834, 247); + this.sensor24Label.Name = "sensor24Label"; + this.sensor24Label.Size = new System.Drawing.Size(50, 13); + this.sensor24Label.TabIndex = 184; + this.sensor24Label.Text = "sensor24"; + this.sensor24Label.Visible = false; + // + // volume22Label + // + this.volume22Label.AutoSize = true; + this.volume22Label.Location = new System.Drawing.Point(693, 302); + this.volume22Label.Name = "volume22Label"; + this.volume22Label.Size = new System.Drawing.Size(53, 13); + this.volume22Label.TabIndex = 204; + this.volume22Label.Text = "volume22"; + this.volume22Label.Visible = false; + // + // passed19Label + // + this.passed19Label.AutoSize = true; + this.passed19Label.Location = new System.Drawing.Point(484, 339); + this.passed19Label.Name = "passed19Label"; + this.passed19Label.Size = new System.Drawing.Size(53, 13); + this.passed19Label.TabIndex = 217; + this.passed19Label.Text = "passed19"; + this.passed19Label.Visible = false; + // + // refPulses23Label + // + this.refPulses23Label.AutoSize = true; + this.refPulses23Label.Location = new System.Drawing.Point(764, 284); + this.refPulses23Label.Name = "refPulses23Label"; + this.refPulses23Label.Size = new System.Drawing.Size(62, 13); + this.refPulses23Label.TabIndex = 194; + this.refPulses23Label.Text = "refPulses23"; + this.refPulses23Label.Visible = false; + // + // pulses23Label + // + this.pulses23Label.AutoSize = true; + this.pulses23Label.Location = new System.Drawing.Point(764, 265); + this.pulses23Label.Name = "pulses23Label"; + this.pulses23Label.Size = new System.Drawing.Size(49, 13); + this.pulses23Label.TabIndex = 188; + this.pulses23Label.Text = "pulses23"; + this.pulses23Label.Visible = false; + // + // error20Label + // + this.error20Label.AutoSize = true; + this.error20Label.Location = new System.Drawing.Point(554, 321); + this.error20Label.Name = "error20Label"; + this.error20Label.Size = new System.Drawing.Size(40, 13); + this.error20Label.TabIndex = 210; + this.error20Label.Text = "error20"; + this.error20Label.Visible = false; + // + // sensor23Label + // + this.sensor23Label.AutoSize = true; + this.sensor23Label.Location = new System.Drawing.Point(764, 247); + this.sensor23Label.Name = "sensor23Label"; + this.sensor23Label.Size = new System.Drawing.Size(50, 13); + this.sensor23Label.TabIndex = 185; + this.sensor23Label.Text = "sensor23"; + this.sensor23Label.Visible = false; + // + // volume21Label + // + this.volume21Label.AutoSize = true; + this.volume21Label.Location = new System.Drawing.Point(624, 302); + this.volume21Label.Name = "volume21Label"; + this.volume21Label.Size = new System.Drawing.Size(53, 13); + this.volume21Label.TabIndex = 200; + this.volume21Label.Text = "volume21"; + this.volume21Label.Visible = false; + // + // refPulses22Label + // + this.refPulses22Label.AutoSize = true; + this.refPulses22Label.Location = new System.Drawing.Point(693, 284); + this.refPulses22Label.Name = "refPulses22Label"; + this.refPulses22Label.Size = new System.Drawing.Size(62, 13); + this.refPulses22Label.TabIndex = 199; + this.refPulses22Label.Text = "refPulses22"; + this.refPulses22Label.Visible = false; + // + // pulses22Label + // + this.pulses22Label.AutoSize = true; + this.pulses22Label.Location = new System.Drawing.Point(693, 265); + this.pulses22Label.Name = "pulses22Label"; + this.pulses22Label.Size = new System.Drawing.Size(49, 13); + this.pulses22Label.TabIndex = 189; + this.pulses22Label.Text = "pulses22"; + this.pulses22Label.Visible = false; + // + // volume20Label + // + this.volume20Label.AutoSize = true; + this.volume20Label.Location = new System.Drawing.Point(554, 302); + this.volume20Label.Name = "volume20Label"; + this.volume20Label.Size = new System.Drawing.Size(53, 13); + this.volume20Label.TabIndex = 202; + this.volume20Label.Text = "volume20"; + this.volume20Label.Visible = false; + // + // sensor22Label + // + this.sensor22Label.AutoSize = true; + this.sensor22Label.Location = new System.Drawing.Point(693, 247); + this.sensor22Label.Name = "sensor22Label"; + this.sensor22Label.Size = new System.Drawing.Size(50, 13); + this.sensor22Label.TabIndex = 182; + this.sensor22Label.Text = "sensor22"; + this.sensor22Label.Visible = false; + // + // error19Label + // + this.error19Label.AutoSize = true; + this.error19Label.Location = new System.Drawing.Point(484, 321); + this.error19Label.Name = "error19Label"; + this.error19Label.Size = new System.Drawing.Size(40, 13); + this.error19Label.TabIndex = 211; + this.error19Label.Text = "error19"; + this.error19Label.Visible = false; + // + // refPulses21Label + // + this.refPulses21Label.AutoSize = true; + this.refPulses21Label.Location = new System.Drawing.Point(624, 284); + this.refPulses21Label.Name = "refPulses21Label"; + this.refPulses21Label.Size = new System.Drawing.Size(62, 13); + this.refPulses21Label.TabIndex = 197; + this.refPulses21Label.Text = "refPulses21"; + this.refPulses21Label.Visible = false; + // + // volume19Label + // + this.volume19Label.AutoSize = true; + this.volume19Label.Location = new System.Drawing.Point(484, 302); + this.volume19Label.Name = "volume19Label"; + this.volume19Label.Size = new System.Drawing.Size(53, 13); + this.volume19Label.TabIndex = 201; + this.volume19Label.Text = "volume19"; + this.volume19Label.Visible = false; + // + // pulses21Label + // + this.pulses21Label.AutoSize = true; + this.pulses21Label.Location = new System.Drawing.Point(624, 265); + this.pulses21Label.Name = "pulses21Label"; + this.pulses21Label.Size = new System.Drawing.Size(49, 13); + this.pulses21Label.TabIndex = 193; + this.pulses21Label.Text = "pulses21"; + this.pulses21Label.Visible = false; + // + // sensor21Label + // + this.sensor21Label.AutoSize = true; + this.sensor21Label.Location = new System.Drawing.Point(624, 247); + this.sensor21Label.Name = "sensor21Label"; + this.sensor21Label.Size = new System.Drawing.Size(50, 13); + this.sensor21Label.TabIndex = 183; + this.sensor21Label.Text = "sensor21"; + this.sensor21Label.Visible = false; + // + // refPulses19Label + // + this.refPulses19Label.AutoSize = true; + this.refPulses19Label.Location = new System.Drawing.Point(484, 284); + this.refPulses19Label.Name = "refPulses19Label"; + this.refPulses19Label.Size = new System.Drawing.Size(62, 13); + this.refPulses19Label.TabIndex = 198; + this.refPulses19Label.Text = "refPulses19"; + this.refPulses19Label.Visible = false; + // + // refPulses20Label + // + this.refPulses20Label.AutoSize = true; + this.refPulses20Label.Location = new System.Drawing.Point(554, 284); + this.refPulses20Label.Name = "refPulses20Label"; + this.refPulses20Label.Size = new System.Drawing.Size(62, 13); + this.refPulses20Label.TabIndex = 196; + this.refPulses20Label.Text = "refPulses20"; + this.refPulses20Label.Visible = false; + // + // pulses20Label + // + this.pulses20Label.AutoSize = true; + this.pulses20Label.Location = new System.Drawing.Point(554, 265); + this.pulses20Label.Name = "pulses20Label"; + this.pulses20Label.Size = new System.Drawing.Size(49, 13); + this.pulses20Label.TabIndex = 192; + this.pulses20Label.Text = "pulses20"; + this.pulses20Label.Visible = false; + // + // pulses19Label + // + this.pulses19Label.AutoSize = true; + this.pulses19Label.Location = new System.Drawing.Point(484, 265); + this.pulses19Label.Name = "pulses19Label"; + this.pulses19Label.Size = new System.Drawing.Size(49, 13); + this.pulses19Label.TabIndex = 190; + this.pulses19Label.Text = "pulses19"; + this.pulses19Label.Visible = false; + // + // sensor20Label + // + this.sensor20Label.AutoSize = true; + this.sensor20Label.Location = new System.Drawing.Point(554, 247); + this.sensor20Label.Name = "sensor20Label"; + this.sensor20Label.Size = new System.Drawing.Size(50, 13); + this.sensor20Label.TabIndex = 186; + this.sensor20Label.Text = "sensor20"; + this.sensor20Label.Visible = false; + // + // sensor19Label + // + this.sensor19Label.AutoSize = true; + this.sensor19Label.Location = new System.Drawing.Point(484, 247); + this.sensor19Label.Name = "sensor19Label"; + this.sensor19Label.Size = new System.Drawing.Size(50, 13); + this.sensor19Label.TabIndex = 187; + this.sensor19Label.Text = "sensor19"; + this.sensor19Label.Visible = false; + // + // meter18Label + // + this.meter18Label.AutoSize = true; + this.meter18Label.Location = new System.Drawing.Point(414, 229); + this.meter18Label.Name = "meter18Label"; + this.meter18Label.Size = new System.Drawing.Size(49, 13); + this.meter18Label.TabIndex = 181; + this.meter18Label.Text = "Meter 18"; + this.meter18Label.Visible = false; + // + // meter17Label + // + this.meter17Label.AutoSize = true; + this.meter17Label.Location = new System.Drawing.Point(344, 229); + this.meter17Label.Name = "meter17Label"; + this.meter17Label.Size = new System.Drawing.Size(49, 13); + this.meter17Label.TabIndex = 180; + this.meter17Label.Text = "Meter 17"; + this.meter17Label.Visible = false; + // + // meter16Label + // + this.meter16Label.AutoSize = true; + this.meter16Label.Location = new System.Drawing.Point(274, 229); + this.meter16Label.Name = "meter16Label"; + this.meter16Label.Size = new System.Drawing.Size(49, 13); + this.meter16Label.TabIndex = 179; + this.meter16Label.Text = "Meter 16"; + this.meter16Label.Visible = false; + // + // meter15Label + // + this.meter15Label.AutoSize = true; + this.meter15Label.Location = new System.Drawing.Point(204, 229); + this.meter15Label.Name = "meter15Label"; + this.meter15Label.Size = new System.Drawing.Size(49, 13); + this.meter15Label.TabIndex = 178; + this.meter15Label.Text = "Meter 15"; + this.meter15Label.Visible = false; + // + // meter14Label + // + this.meter14Label.AutoSize = true; + this.meter14Label.Location = new System.Drawing.Point(134, 229); + this.meter14Label.Name = "meter14Label"; + this.meter14Label.Size = new System.Drawing.Size(49, 13); + this.meter14Label.TabIndex = 177; + this.meter14Label.Text = "Meter 14"; + this.meter14Label.Visible = false; + // + // meter13Label + // + this.meter13Label.AutoSize = true; + this.meter13Label.Location = new System.Drawing.Point(64, 229); + this.meter13Label.Name = "meter13Label"; + this.meter13Label.Size = new System.Drawing.Size(49, 13); + this.meter13Label.TabIndex = 176; + this.meter13Label.Text = "Meter 13"; + this.meter13Label.Visible = false; + // + // passed18Label + // + this.passed18Label.AutoSize = true; + this.passed18Label.Location = new System.Drawing.Point(414, 339); + this.passed18Label.Name = "passed18Label"; + this.passed18Label.Size = new System.Drawing.Size(53, 13); + this.passed18Label.TabIndex = 174; + this.passed18Label.Text = "passed18"; + this.passed18Label.Visible = false; + // + // passed17Label + // + this.passed17Label.AutoSize = true; + this.passed17Label.Location = new System.Drawing.Point(344, 339); + this.passed17Label.Name = "passed17Label"; + this.passed17Label.Size = new System.Drawing.Size(53, 13); + this.passed17Label.TabIndex = 169; + this.passed17Label.Text = "passed17"; + this.passed17Label.Visible = false; + // + // error18Label + // + this.error18Label.AutoSize = true; + this.error18Label.Location = new System.Drawing.Point(414, 321); + this.error18Label.Name = "error18Label"; + this.error18Label.Size = new System.Drawing.Size(40, 13); + this.error18Label.TabIndex = 167; + this.error18Label.Text = "error18"; + this.error18Label.Visible = false; + // + // passed16Label + // + this.passed16Label.AutoSize = true; + this.passed16Label.Location = new System.Drawing.Point(273, 339); + this.passed16Label.Name = "passed16Label"; + this.passed16Label.Size = new System.Drawing.Size(53, 13); + this.passed16Label.TabIndex = 170; + this.passed16Label.Text = "passed16"; + this.passed16Label.Visible = false; + // + // error17Label + // + this.error17Label.AutoSize = true; + this.error17Label.Location = new System.Drawing.Point(344, 321); + this.error17Label.Name = "error17Label"; + this.error17Label.Size = new System.Drawing.Size(40, 13); + this.error17Label.TabIndex = 163; + this.error17Label.Text = "error17"; + this.error17Label.Visible = false; + // + // volume18Label + // + this.volume18Label.AutoSize = true; + this.volume18Label.Location = new System.Drawing.Point(414, 302); + this.volume18Label.Name = "volume18Label"; + this.volume18Label.Size = new System.Drawing.Size(53, 13); + this.volume18Label.TabIndex = 159; + this.volume18Label.Text = "volume18"; + this.volume18Label.Visible = false; + // + // passed15Label + // + this.passed15Label.AutoSize = true; + this.passed15Label.Location = new System.Drawing.Point(204, 339); + this.passed15Label.Name = "passed15Label"; + this.passed15Label.Size = new System.Drawing.Size(53, 13); + this.passed15Label.TabIndex = 173; + this.passed15Label.Text = "passed15"; + this.passed15Label.Visible = false; + // + // error16Label + // + this.error16Label.AutoSize = true; + this.error16Label.Location = new System.Drawing.Point(273, 321); + this.error16Label.Name = "error16Label"; + this.error16Label.Size = new System.Drawing.Size(40, 13); + this.error16Label.TabIndex = 165; + this.error16Label.Text = "error16"; + this.error16Label.Visible = false; + // + // volume17Label + // + this.volume17Label.AutoSize = true; + this.volume17Label.Location = new System.Drawing.Point(344, 302); + this.volume17Label.Name = "volume17Label"; + this.volume17Label.Size = new System.Drawing.Size(53, 13); + this.volume17Label.TabIndex = 160; + this.volume17Label.Text = "volume17"; + this.volume17Label.Visible = false; + // + // passed14Label + // + this.passed14Label.AutoSize = true; + this.passed14Label.Location = new System.Drawing.Point(134, 339); + this.passed14Label.Name = "passed14Label"; + this.passed14Label.Size = new System.Drawing.Size(53, 13); + this.passed14Label.TabIndex = 171; + this.passed14Label.Text = "passed14"; + this.passed14Label.Visible = false; + // + // refPulses18Label + // + this.refPulses18Label.AutoSize = true; + this.refPulses18Label.Location = new System.Drawing.Point(414, 284); + this.refPulses18Label.Name = "refPulses18Label"; + this.refPulses18Label.Size = new System.Drawing.Size(62, 13); + this.refPulses18Label.TabIndex = 149; + this.refPulses18Label.Text = "refPulses18"; + this.refPulses18Label.Visible = false; + // + // error15Label + // + this.error15Label.AutoSize = true; + this.error15Label.Location = new System.Drawing.Point(204, 321); + this.error15Label.Name = "error15Label"; + this.error15Label.Size = new System.Drawing.Size(40, 13); + this.error15Label.TabIndex = 166; + this.error15Label.Text = "error15"; + this.error15Label.Visible = false; + // + // pulses18Label + // + this.pulses18Label.AutoSize = true; + this.pulses18Label.Location = new System.Drawing.Point(414, 265); + this.pulses18Label.Name = "pulses18Label"; + this.pulses18Label.Size = new System.Drawing.Size(49, 13); + this.pulses18Label.TabIndex = 144; + this.pulses18Label.Text = "pulses18"; + this.pulses18Label.Visible = false; + // + // sensor18Label + // + this.sensor18Label.AutoSize = true; + this.sensor18Label.Location = new System.Drawing.Point(414, 247); + this.sensor18Label.Name = "sensor18Label"; + this.sensor18Label.Size = new System.Drawing.Size(50, 13); + this.sensor18Label.TabIndex = 140; + this.sensor18Label.Text = "sensor18"; + this.sensor18Label.Visible = false; + // + // volume16Label + // + this.volume16Label.AutoSize = true; + this.volume16Label.Location = new System.Drawing.Point(273, 302); + this.volume16Label.Name = "volume16Label"; + this.volume16Label.Size = new System.Drawing.Size(53, 13); + this.volume16Label.TabIndex = 156; + this.volume16Label.Text = "volume16"; + this.volume16Label.Visible = false; + // + // passed13Label + // + this.passed13Label.AutoSize = true; + this.passed13Label.Location = new System.Drawing.Point(64, 339); + this.passed13Label.Name = "passed13Label"; + this.passed13Label.Size = new System.Drawing.Size(53, 13); + this.passed13Label.TabIndex = 172; + this.passed13Label.Text = "passed13"; + this.passed13Label.Visible = false; + // + // refPulses17Label + // + this.refPulses17Label.AutoSize = true; + this.refPulses17Label.Location = new System.Drawing.Point(344, 284); + this.refPulses17Label.Name = "refPulses17Label"; + this.refPulses17Label.Size = new System.Drawing.Size(62, 13); + this.refPulses17Label.TabIndex = 151; + this.refPulses17Label.Text = "refPulses17"; + this.refPulses17Label.Visible = false; + // + // pulses17Label + // + this.pulses17Label.AutoSize = true; + this.pulses17Label.Location = new System.Drawing.Point(344, 265); + this.pulses17Label.Name = "pulses17Label"; + this.pulses17Label.Size = new System.Drawing.Size(49, 13); + this.pulses17Label.TabIndex = 142; + this.pulses17Label.Text = "pulses17"; + this.pulses17Label.Visible = false; + // + // error14Label + // + this.error14Label.AutoSize = true; + this.error14Label.Location = new System.Drawing.Point(134, 321); + this.error14Label.Name = "error14Label"; + this.error14Label.Size = new System.Drawing.Size(40, 13); + this.error14Label.TabIndex = 164; + this.error14Label.Text = "error14"; + this.error14Label.Visible = false; + // + // sensor17Label + // + this.sensor17Label.AutoSize = true; + this.sensor17Label.Location = new System.Drawing.Point(344, 247); + this.sensor17Label.Name = "sensor17Label"; + this.sensor17Label.Size = new System.Drawing.Size(50, 13); + this.sensor17Label.TabIndex = 139; + this.sensor17Label.Text = "sensor17"; + this.sensor17Label.Visible = false; + // + // volume15Label + // + this.volume15Label.AutoSize = true; + this.volume15Label.Location = new System.Drawing.Point(204, 302); + this.volume15Label.Name = "volume15Label"; + this.volume15Label.Size = new System.Drawing.Size(53, 13); + this.volume15Label.TabIndex = 158; + this.volume15Label.Text = "volume15"; + this.volume15Label.Visible = false; + // + // refPulses16Label + // + this.refPulses16Label.AutoSize = true; + this.refPulses16Label.Location = new System.Drawing.Point(273, 284); + this.refPulses16Label.Name = "refPulses16Label"; + this.refPulses16Label.Size = new System.Drawing.Size(62, 13); + this.refPulses16Label.TabIndex = 147; + this.refPulses16Label.Text = "refPulses16"; + this.refPulses16Label.Visible = false; + // + // label104 + // + this.label104.AutoSize = true; + this.label104.Location = new System.Drawing.Point(18, 247); + this.label104.Name = "label104"; + this.label104.Size = new System.Drawing.Size(43, 13); + this.label104.TabIndex = 175; + this.label104.Text = "Sensor:"; + // + // pulses16Label + // + this.pulses16Label.AutoSize = true; + this.pulses16Label.Location = new System.Drawing.Point(273, 265); + this.pulses16Label.Name = "pulses16Label"; + this.pulses16Label.Size = new System.Drawing.Size(49, 13); + this.pulses16Label.TabIndex = 143; + this.pulses16Label.Text = "pulses16"; + this.pulses16Label.Visible = false; + // + // volume14Label + // + this.volume14Label.AutoSize = true; + this.volume14Label.Location = new System.Drawing.Point(134, 302); + this.volume14Label.Name = "volume14Label"; + this.volume14Label.Size = new System.Drawing.Size(53, 13); + this.volume14Label.TabIndex = 161; + this.volume14Label.Text = "volume14"; + this.volume14Label.Visible = false; + // + // sensor16Label + // + this.sensor16Label.AutoSize = true; + this.sensor16Label.Location = new System.Drawing.Point(273, 247); + this.sensor16Label.Name = "sensor16Label"; + this.sensor16Label.Size = new System.Drawing.Size(50, 13); + this.sensor16Label.TabIndex = 137; + this.sensor16Label.Text = "sensor16"; + this.sensor16Label.Visible = false; + // + // error13Label + // + this.error13Label.AutoSize = true; + this.error13Label.Location = new System.Drawing.Point(64, 321); + this.error13Label.Name = "error13Label"; + this.error13Label.Size = new System.Drawing.Size(40, 13); + this.error13Label.TabIndex = 168; + this.error13Label.Text = "error13"; + this.error13Label.Visible = false; + // + // refPulses15Label + // + this.refPulses15Label.AutoSize = true; + this.refPulses15Label.Location = new System.Drawing.Point(204, 284); + this.refPulses15Label.Name = "refPulses15Label"; + this.refPulses15Label.Size = new System.Drawing.Size(62, 13); + this.refPulses15Label.TabIndex = 148; + this.refPulses15Label.Text = "refPulses15"; + this.refPulses15Label.Visible = false; + // + // volume13Label + // + this.volume13Label.AutoSize = true; + this.volume13Label.Location = new System.Drawing.Point(64, 302); + this.volume13Label.Name = "volume13Label"; + this.volume13Label.Size = new System.Drawing.Size(53, 13); + this.volume13Label.TabIndex = 157; + this.volume13Label.Text = "volume13"; + this.volume13Label.Visible = false; + // + // pulses15Label + // + this.pulses15Label.AutoSize = true; + this.pulses15Label.Location = new System.Drawing.Point(204, 265); + this.pulses15Label.Name = "pulses15Label"; + this.pulses15Label.Size = new System.Drawing.Size(49, 13); + this.pulses15Label.TabIndex = 141; + this.pulses15Label.Text = "pulses15"; + this.pulses15Label.Visible = false; + // + // sensor15Label + // + this.sensor15Label.AutoSize = true; + this.sensor15Label.Location = new System.Drawing.Point(204, 247); + this.sensor15Label.Name = "sensor15Label"; + this.sensor15Label.Size = new System.Drawing.Size(50, 13); + this.sensor15Label.TabIndex = 138; + this.sensor15Label.Text = "sensor15"; + this.sensor15Label.Visible = false; + // + // refPulses13Label + // + this.refPulses13Label.AutoSize = true; + this.refPulses13Label.Location = new System.Drawing.Point(64, 284); + this.refPulses13Label.Name = "refPulses13Label"; + this.refPulses13Label.Size = new System.Drawing.Size(62, 13); + this.refPulses13Label.TabIndex = 152; + this.refPulses13Label.Text = "refPulses13"; + this.refPulses13Label.Visible = false; + // + // refPulses14Label + // + this.refPulses14Label.AutoSize = true; + this.refPulses14Label.Location = new System.Drawing.Point(134, 284); + this.refPulses14Label.Name = "refPulses14Label"; + this.refPulses14Label.Size = new System.Drawing.Size(62, 13); + this.refPulses14Label.TabIndex = 150; + this.refPulses14Label.Text = "refPulses14"; + this.refPulses14Label.Visible = false; + // + // pulses14Label + // + this.pulses14Label.AutoSize = true; + this.pulses14Label.Location = new System.Drawing.Point(134, 265); + this.pulses14Label.Name = "pulses14Label"; + this.pulses14Label.Size = new System.Drawing.Size(49, 13); + this.pulses14Label.TabIndex = 146; + this.pulses14Label.Text = "pulses14"; + this.pulses14Label.Visible = false; + // + // pulses13Label + // + this.pulses13Label.AutoSize = true; + this.pulses13Label.Location = new System.Drawing.Point(64, 265); + this.pulses13Label.Name = "pulses13Label"; + this.pulses13Label.Size = new System.Drawing.Size(49, 13); + this.pulses13Label.TabIndex = 145; + this.pulses13Label.Text = "pulses13"; + this.pulses13Label.Visible = false; + // + // sensor14Label + // + this.sensor14Label.AutoSize = true; + this.sensor14Label.Location = new System.Drawing.Point(134, 247); + this.sensor14Label.Name = "sensor14Label"; + this.sensor14Label.Size = new System.Drawing.Size(50, 13); + this.sensor14Label.TabIndex = 135; + this.sensor14Label.Text = "sensor14"; + this.sensor14Label.Visible = false; + // + // sensor13Label + // + this.sensor13Label.AutoSize = true; + this.sensor13Label.Location = new System.Drawing.Point(64, 247); + this.sensor13Label.Name = "sensor13Label"; + this.sensor13Label.Size = new System.Drawing.Size(50, 13); + this.sensor13Label.TabIndex = 136; + this.sensor13Label.Text = "sensor13"; + this.sensor13Label.Visible = false; + // + // label119 + // + this.label119.AutoSize = true; + this.label119.Location = new System.Drawing.Point(12, 321); + this.label119.Name = "label119"; + this.label119.Size = new System.Drawing.Size(49, 13); + this.label119.TabIndex = 162; + this.label119.Text = "Error [%]:"; + // + // label120 + // + this.label120.AutoSize = true; + this.label120.Location = new System.Drawing.Point(16, 302); + this.label120.Name = "label120"; + this.label120.Size = new System.Drawing.Size(45, 13); + this.label120.TabIndex = 155; + this.label120.Text = "Volume:"; + // + // label121 + // + this.label121.AutoSize = true; + this.label121.Location = new System.Drawing.Point(1, 284); + this.label121.Name = "label121"; + this.label121.Size = new System.Drawing.Size(60, 13); + this.label121.TabIndex = 154; + this.label121.Text = "Ref. count:"; + // + // label122 + // + this.label122.AutoSize = true; + this.label122.Location = new System.Drawing.Point(2, 265); + this.label122.Name = "label122"; + this.label122.Size = new System.Drawing.Size(38, 13); + this.label122.TabIndex = 153; + this.label122.Text = "Count:"; + // + // ProcessTabPageCtrl24 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.Control; + this.Controls.Add(this.meter24Label); + this.Controls.Add(this.meter23Label); + this.Controls.Add(this.meter22Label); + this.Controls.Add(this.meter21Label); + this.Controls.Add(this.meter20Label); + this.Controls.Add(this.meter19Label); + this.Controls.Add(this.passed24Label); + this.Controls.Add(this.passed23Label); + this.Controls.Add(this.error24Label); + this.Controls.Add(this.passed22Label); + this.Controls.Add(this.error23Label); + this.Controls.Add(this.volume24Label); + this.Controls.Add(this.passed21Label); + this.Controls.Add(this.error22Label); + this.Controls.Add(this.volume23Label); + this.Controls.Add(this.passed20Label); + this.Controls.Add(this.refPulses24Label); + this.Controls.Add(this.error21Label); + this.Controls.Add(this.pulses24Label); + this.Controls.Add(this.sensor24Label); + this.Controls.Add(this.volume22Label); + this.Controls.Add(this.passed19Label); + this.Controls.Add(this.refPulses23Label); + this.Controls.Add(this.pulses23Label); + this.Controls.Add(this.error20Label); + this.Controls.Add(this.sensor23Label); + this.Controls.Add(this.volume21Label); + this.Controls.Add(this.refPulses22Label); + this.Controls.Add(this.pulses22Label); + this.Controls.Add(this.volume20Label); + this.Controls.Add(this.sensor22Label); + this.Controls.Add(this.error19Label); + this.Controls.Add(this.refPulses21Label); + this.Controls.Add(this.volume19Label); + this.Controls.Add(this.pulses21Label); + this.Controls.Add(this.sensor21Label); + this.Controls.Add(this.refPulses19Label); + this.Controls.Add(this.refPulses20Label); + this.Controls.Add(this.pulses20Label); + this.Controls.Add(this.pulses19Label); + this.Controls.Add(this.sensor20Label); + this.Controls.Add(this.sensor19Label); + this.Controls.Add(this.meter18Label); + this.Controls.Add(this.meter17Label); + this.Controls.Add(this.meter16Label); + this.Controls.Add(this.meter15Label); + this.Controls.Add(this.meter14Label); + this.Controls.Add(this.meter13Label); + this.Controls.Add(this.passed18Label); + this.Controls.Add(this.passed17Label); + this.Controls.Add(this.error18Label); + this.Controls.Add(this.passed16Label); + this.Controls.Add(this.error17Label); + this.Controls.Add(this.volume18Label); + this.Controls.Add(this.passed15Label); + this.Controls.Add(this.error16Label); + this.Controls.Add(this.volume17Label); + this.Controls.Add(this.passed14Label); + this.Controls.Add(this.refPulses18Label); + this.Controls.Add(this.error15Label); + this.Controls.Add(this.pulses18Label); + this.Controls.Add(this.sensor18Label); + this.Controls.Add(this.volume16Label); + this.Controls.Add(this.passed13Label); + this.Controls.Add(this.refPulses17Label); + this.Controls.Add(this.pulses17Label); + this.Controls.Add(this.error14Label); + this.Controls.Add(this.sensor17Label); + this.Controls.Add(this.volume15Label); + this.Controls.Add(this.refPulses16Label); + this.Controls.Add(this.label104); + this.Controls.Add(this.pulses16Label); + this.Controls.Add(this.volume14Label); + this.Controls.Add(this.sensor16Label); + this.Controls.Add(this.error13Label); + this.Controls.Add(this.refPulses15Label); + this.Controls.Add(this.volume13Label); + this.Controls.Add(this.pulses15Label); + this.Controls.Add(this.sensor15Label); + this.Controls.Add(this.refPulses13Label); + this.Controls.Add(this.refPulses14Label); + this.Controls.Add(this.pulses14Label); + this.Controls.Add(this.pulses13Label); + this.Controls.Add(this.sensor14Label); + this.Controls.Add(this.sensor13Label); + this.Controls.Add(this.label119); + this.Controls.Add(this.label120); + this.Controls.Add(this.label121); + this.Controls.Add(this.label122); + this.Controls.Add(this.meter12Label); + this.Controls.Add(this.meter11Label); + this.Controls.Add(this.meter10Label); + this.Controls.Add(this.meter9Label); + this.Controls.Add(this.meter8Label); + this.Controls.Add(this.meter7Label); + this.Controls.Add(this.passed12Label); + this.Controls.Add(this.passed11Label); + this.Controls.Add(this.error12Label); + this.Controls.Add(this.passed10Label); + this.Controls.Add(this.error11Label); + this.Controls.Add(this.volume12Label); + this.Controls.Add(this.passed9Label); + this.Controls.Add(this.error10Label); + this.Controls.Add(this.volume11Label); + this.Controls.Add(this.passed8Label); + this.Controls.Add(this.refPulses12Label); + this.Controls.Add(this.error9Label); + this.Controls.Add(this.pulses12Label); + this.Controls.Add(this.sensor12Label); + this.Controls.Add(this.volume10Label); + this.Controls.Add(this.passed7Label); + this.Controls.Add(this.refPulses11Label); + this.Controls.Add(this.pulses11Label); + this.Controls.Add(this.error8Label); + this.Controls.Add(this.sensor11Label); + this.Controls.Add(this.volume9Label); + this.Controls.Add(this.refPulses10Label); + this.Controls.Add(this.pulses10Label); + this.Controls.Add(this.volume8Label); + this.Controls.Add(this.sensor10Label); + this.Controls.Add(this.error7Label); + this.Controls.Add(this.refPulses9Label); + this.Controls.Add(this.volume7Label); + this.Controls.Add(this.pulses9Label); + this.Controls.Add(this.sensor9Label); + this.Controls.Add(this.refPulses7Label); + this.Controls.Add(this.refPulses8Label); + this.Controls.Add(this.pulses8Label); + this.Controls.Add(this.pulses7Label); + this.Controls.Add(this.sensor8Label); + this.Controls.Add(this.sensor7Label); + this.Controls.Add(this.meter6Label); + this.Controls.Add(this.meter5Label); + this.Controls.Add(this.meter4Label); + this.Controls.Add(this.meter3Label); + this.Controls.Add(this.meter2Label); + this.Controls.Add(this.meter1Label); + this.Controls.Add(this.passed6Label); + this.Controls.Add(this.passed5Label); + this.Controls.Add(this.error6Label); + this.Controls.Add(this.passed4Label); + this.Controls.Add(this.error5Label); + this.Controls.Add(this.volume6Label); + this.Controls.Add(this.passed3Label); + this.Controls.Add(this.error4Label); + this.Controls.Add(this.volume5Label); + this.Controls.Add(this.passed2Label); + this.Controls.Add(this.refPulses6Label); + this.Controls.Add(this.error3Label); + this.Controls.Add(this.pulses6Label); + this.Controls.Add(this.sensor6Label); + this.Controls.Add(this.volume4Label); + this.Controls.Add(this.passed1Label); + this.Controls.Add(this.refPulses5Label); + this.Controls.Add(this.pulses5Label); + this.Controls.Add(this.error2Label); + this.Controls.Add(this.sensor5Label); + this.Controls.Add(this.volume3Label); + this.Controls.Add(this.refPulses4Label); + this.Controls.Add(this.label35); + this.Controls.Add(this.pulses4Label); + this.Controls.Add(this.volume2Label); + this.Controls.Add(this.sensor4Label); + this.Controls.Add(this.error1Label); + this.Controls.Add(this.refPulses3Label); + this.Controls.Add(this.volume1Label); + this.Controls.Add(this.pulses3Label); + this.Controls.Add(this.pumpPctTextBox); + this.Controls.Add(this.sensor3Label); + this.Controls.Add(this.refPulses1Label); + this.Controls.Add(this.refPulses2Label); + this.Controls.Add(this.groupBox3z); + this.Controls.Add(this.pulses2Label); + this.Controls.Add(this.pulses1Label); + this.Controls.Add(this.sensor2Label); + this.Controls.Add(this.groupBox2z); + this.Controls.Add(this.sensor1Label); + this.Controls.Add(this.label4); + this.Controls.Add(this.groupBox1z); + this.Controls.Add(this.watermeterPictureBox3z); + this.Controls.Add(this.label3); + this.Controls.Add(this.label2); + this.Controls.Add(this.watermeterPictureBox2z); + this.Controls.Add(this.label1); + this.Controls.Add(this.watermeterPictureBox1z); + this.Controls.Add(this.pictureBox1); + this.Controls.Add(this.flowMeterPictureBox); + this.Controls.Add(this.watermeterPictureBox6); + this.Controls.Add(this.watermeterPictureBox5); + this.Controls.Add(this.watermeterPictureBox4); + this.Controls.Add(this.watermeterPictureBox3); + this.Controls.Add(this.watermeterPictureBox2); + this.Controls.Add(this.watermeterPictureBox1); + this.Controls.Add(this.pumpPictureBox); + this.Controls.Add(this.reservoirPictureBox); + this.Controls.Add(this.airHumiLabel); + this.Controls.Add(this.airPressLabel); + this.Controls.Add(this.airTempLabel); + this.Controls.Add(this.label34); + this.Controls.Add(this.label33); + this.Controls.Add(this.label32); + this.Controls.Add(this.estmtdTimeLabel); + this.Controls.Add(this.targetRefCountLabel); + this.Controls.Add(this.label31); + this.Controls.Add(this.targetVolumeLabel); + this.Controls.Add(this.targetFlowHighLabel); + this.Controls.Add(this.targetFlowLowLabel); + this.Controls.Add(this.label30); + this.Controls.Add(this.label20); + this.Controls.Add(this.label29); + this.Controls.Add(this.label28); + this.Controls.Add(this.refErrorLabel); + this.Controls.Add(this.label27); + this.Controls.Add(this.volumeCtvLabel); + this.Controls.Add(this.label26); + this.Controls.Add(this.refVolumeLabel); + this.Controls.Add(this.label25); + this.Controls.Add(this.massDiffLabel); + this.Controls.Add(this.label23); + this.Controls.Add(this.massLabel); + this.Controls.Add(this.label22); + this.Controls.Add(this.scaleCmpntLabel); + this.Controls.Add(this.tDivCmpntLabel); + this.Controls.Add(this.tDivLabel); + this.Controls.Add(this.label24); + this.Controls.Add(this.label21); + this.Controls.Add(this.regValvePosLabel); + this.Controls.Add(this.regValveCmpntLabel); + this.Controls.Add(this.refFlowCmpntLabel); + this.Controls.Add(this.refPulsesLabel); + this.Controls.Add(this.label19); + this.Controls.Add(this.refFreqLabel); + this.Controls.Add(this.label16); + this.Controls.Add(this.refFlowLabel); + this.Controls.Add(this.prInCmpntLabel); + this.Controls.Add(this.prOutCmpntLabel); + this.Controls.Add(this.tOutCmpntLabel); + this.Controls.Add(this.tInCmpntLabel); + this.Controls.Add(this.label15); + this.Controls.Add(this.prOutLabel); + this.Controls.Add(this.tOutLabel); + this.Controls.Add(this.label17); + this.Controls.Add(this.label18); + this.Controls.Add(this.prInLabel); + this.Controls.Add(this.tInLabel); + this.Controls.Add(this.label14); + this.Controls.Add(this.label13); + this.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.Name = "ProcessTabPageCtrl24"; + this.Size = new System.Drawing.Size(1097, 682); + this.Load += new System.EventHandler(this.ProcessTabPageCtrl_Load); + this.Paint += new System.Windows.Forms.PaintEventHandler(this.ProcessTabPageCtrl_Paint); + ((System.ComponentModel.ISupportInitialize)(this.reservoirPictureBox)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pumpPictureBox)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox3)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox4)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox5)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox6)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.flowMeterPictureBox)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox1z)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox2z)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox3z)).EndInit(); + this.groupBox1z.ResumeLayout(false); + this.groupBox1z.PerformLayout(); + this.groupBox2z.ResumeLayout(false); + this.groupBox2z.PerformLayout(); + this.groupBox3z.ResumeLayout(false); + this.groupBox3z.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label sensor1Label; + private System.Windows.Forms.Label pulses1Label; + private System.Windows.Forms.Label refPulses1Label; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label volume1Label; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label error1Label; + private System.Windows.Forms.Label passed1Label; + private System.Windows.Forms.Label passed2Label; + private System.Windows.Forms.Label error2Label; + private System.Windows.Forms.Label volume2Label; + private System.Windows.Forms.Label refPulses2Label; + private System.Windows.Forms.Label pulses2Label; + private System.Windows.Forms.Label sensor2Label; + private System.Windows.Forms.Label passed3Label; + private System.Windows.Forms.Label error3Label; + private System.Windows.Forms.Label volume3Label; + private System.Windows.Forms.Label refPulses3Label; + private System.Windows.Forms.Label pulses3Label; + private System.Windows.Forms.Label sensor3Label; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.Label tInLabel; + private System.Windows.Forms.Label prInLabel; + private System.Windows.Forms.Label prOutLabel; + private System.Windows.Forms.Label tOutLabel; + private System.Windows.Forms.Label label17; + private System.Windows.Forms.Label label18; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.Label tInCmpntLabel; + private System.Windows.Forms.Label tOutCmpntLabel; + private System.Windows.Forms.Label prOutCmpntLabel; + private System.Windows.Forms.Label prInCmpntLabel; + private System.Windows.Forms.Label refFlowLabel; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.Label refFreqLabel; + private System.Windows.Forms.Label label19; + private System.Windows.Forms.Label refPulsesLabel; + private System.Windows.Forms.Label refFlowCmpntLabel; + private System.Windows.Forms.Label regValveCmpntLabel; + private System.Windows.Forms.Label regValvePosLabel; + private System.Windows.Forms.Label label21; + private System.Windows.Forms.Label tDivCmpntLabel; + private System.Windows.Forms.Label tDivLabel; + private System.Windows.Forms.Label label24; + private System.Windows.Forms.Label scaleCmpntLabel; + private System.Windows.Forms.Label label22; + private System.Windows.Forms.Label massLabel; + private System.Windows.Forms.Label label23; + private System.Windows.Forms.Label massDiffLabel; + private System.Windows.Forms.Label label25; + private System.Windows.Forms.Label refVolumeLabel; + private System.Windows.Forms.Label label26; + private System.Windows.Forms.Label volumeCtvLabel; + private System.Windows.Forms.Label label27; + private System.Windows.Forms.Label refErrorLabel; + private System.Windows.Forms.Label label28; + private System.Windows.Forms.Label label29; + private System.Windows.Forms.Label label20; + private System.Windows.Forms.Label label30; + private System.Windows.Forms.Label targetFlowLowLabel; + private System.Windows.Forms.Label targetFlowHighLabel; + private System.Windows.Forms.Label targetVolumeLabel; + private System.Windows.Forms.Label label31; + private System.Windows.Forms.Label targetRefCountLabel; + private System.Windows.Forms.Label estmtdTimeLabel; + private System.Windows.Forms.Label label32; + private System.Windows.Forms.Label label33; + private System.Windows.Forms.Label label34; + private System.Windows.Forms.Label airTempLabel; + private System.Windows.Forms.Label airPressLabel; + private System.Windows.Forms.Label airHumiLabel; + private System.Windows.Forms.PictureBox reservoirPictureBox; + private System.Windows.Forms.PictureBox pumpPictureBox; + private System.Windows.Forms.PictureBox watermeterPictureBox1; + private System.Windows.Forms.PictureBox watermeterPictureBox2; + private System.Windows.Forms.PictureBox watermeterPictureBox3; + private System.Windows.Forms.PictureBox watermeterPictureBox4; + private System.Windows.Forms.Label passed4Label; + private System.Windows.Forms.Label error4Label; + private System.Windows.Forms.Label volume4Label; + private System.Windows.Forms.Label refPulses4Label; + private System.Windows.Forms.Label pulses4Label; + private System.Windows.Forms.Label sensor4Label; + private System.Windows.Forms.PictureBox watermeterPictureBox5; + private System.Windows.Forms.Label passed5Label; + private System.Windows.Forms.Label error5Label; + private System.Windows.Forms.Label volume5Label; + private System.Windows.Forms.Label refPulses5Label; + private System.Windows.Forms.Label pulses5Label; + private System.Windows.Forms.Label sensor5Label; + private System.Windows.Forms.Label label35; + private System.Windows.Forms.PictureBox watermeterPictureBox6; + private System.Windows.Forms.Label passed6Label; + private System.Windows.Forms.Label error6Label; + private System.Windows.Forms.Label volume6Label; + private System.Windows.Forms.Label refPulses6Label; + private System.Windows.Forms.Label pulses6Label; + private System.Windows.Forms.Label sensor6Label; + private System.Windows.Forms.PictureBox flowMeterPictureBox; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.PictureBox watermeterPictureBox1z; + private System.Windows.Forms.PictureBox watermeterPictureBox2z; + private System.Windows.Forms.PictureBox watermeterPictureBox3z; + private System.Windows.Forms.GroupBox groupBox1z; + private System.Windows.Forms.Label passed1zLabel; + private System.Windows.Forms.Label error1zLabel; + private System.Windows.Forms.Label label56; + private System.Windows.Forms.Label volume1zLabel; + private System.Windows.Forms.Label label58; + private System.Windows.Forms.GroupBox groupBox2z; + private System.Windows.Forms.Label passed2zLabel; + private System.Windows.Forms.Label error2zLabel; + private System.Windows.Forms.Label label52; + private System.Windows.Forms.Label volume2zLabel; + private System.Windows.Forms.Label label59; + private System.Windows.Forms.GroupBox groupBox3z; + private System.Windows.Forms.Label passed3zLabel; + private System.Windows.Forms.Label error3zLabel; + private System.Windows.Forms.Label label57; + private System.Windows.Forms.Label volume3zLabel; + private System.Windows.Forms.Label label61; + private System.Windows.Forms.TextBox pumpPctTextBox; + private System.Windows.Forms.Label meter1Label; + private System.Windows.Forms.Label meter2Label; + private System.Windows.Forms.Label meter3Label; + private System.Windows.Forms.Label meter4Label; + private System.Windows.Forms.Label meter5Label; + private System.Windows.Forms.Label meter6Label; + private System.Windows.Forms.Label meter12Label; + private System.Windows.Forms.Label meter11Label; + private System.Windows.Forms.Label meter10Label; + private System.Windows.Forms.Label meter9Label; + private System.Windows.Forms.Label meter8Label; + private System.Windows.Forms.Label meter7Label; + private System.Windows.Forms.Label passed12Label; + private System.Windows.Forms.Label passed11Label; + private System.Windows.Forms.Label error12Label; + private System.Windows.Forms.Label passed10Label; + private System.Windows.Forms.Label error11Label; + private System.Windows.Forms.Label volume12Label; + private System.Windows.Forms.Label passed9Label; + private System.Windows.Forms.Label error10Label; + private System.Windows.Forms.Label volume11Label; + private System.Windows.Forms.Label passed8Label; + private System.Windows.Forms.Label refPulses12Label; + private System.Windows.Forms.Label error9Label; + private System.Windows.Forms.Label pulses12Label; + private System.Windows.Forms.Label sensor12Label; + private System.Windows.Forms.Label volume10Label; + private System.Windows.Forms.Label passed7Label; + private System.Windows.Forms.Label refPulses11Label; + private System.Windows.Forms.Label pulses11Label; + private System.Windows.Forms.Label error8Label; + private System.Windows.Forms.Label sensor11Label; + private System.Windows.Forms.Label volume9Label; + private System.Windows.Forms.Label refPulses10Label; + private System.Windows.Forms.Label pulses10Label; + private System.Windows.Forms.Label volume8Label; + private System.Windows.Forms.Label sensor10Label; + private System.Windows.Forms.Label error7Label; + private System.Windows.Forms.Label refPulses9Label; + private System.Windows.Forms.Label volume7Label; + private System.Windows.Forms.Label pulses9Label; + private System.Windows.Forms.Label sensor9Label; + private System.Windows.Forms.Label refPulses7Label; + private System.Windows.Forms.Label refPulses8Label; + private System.Windows.Forms.Label pulses8Label; + private System.Windows.Forms.Label pulses7Label; + private System.Windows.Forms.Label sensor8Label; + private System.Windows.Forms.Label sensor7Label; + private System.Windows.Forms.Label meter24Label; + private System.Windows.Forms.Label meter23Label; + private System.Windows.Forms.Label meter22Label; + private System.Windows.Forms.Label meter21Label; + private System.Windows.Forms.Label meter20Label; + private System.Windows.Forms.Label meter19Label; + private System.Windows.Forms.Label passed24Label; + private System.Windows.Forms.Label passed23Label; + private System.Windows.Forms.Label error24Label; + private System.Windows.Forms.Label passed22Label; + private System.Windows.Forms.Label error23Label; + private System.Windows.Forms.Label volume24Label; + private System.Windows.Forms.Label passed21Label; + private System.Windows.Forms.Label error22Label; + private System.Windows.Forms.Label volume23Label; + private System.Windows.Forms.Label passed20Label; + private System.Windows.Forms.Label refPulses24Label; + private System.Windows.Forms.Label error21Label; + private System.Windows.Forms.Label pulses24Label; + private System.Windows.Forms.Label sensor24Label; + private System.Windows.Forms.Label volume22Label; + private System.Windows.Forms.Label passed19Label; + private System.Windows.Forms.Label refPulses23Label; + private System.Windows.Forms.Label pulses23Label; + private System.Windows.Forms.Label error20Label; + private System.Windows.Forms.Label sensor23Label; + private System.Windows.Forms.Label volume21Label; + private System.Windows.Forms.Label refPulses22Label; + private System.Windows.Forms.Label pulses22Label; + private System.Windows.Forms.Label volume20Label; + private System.Windows.Forms.Label sensor22Label; + private System.Windows.Forms.Label error19Label; + private System.Windows.Forms.Label refPulses21Label; + private System.Windows.Forms.Label volume19Label; + private System.Windows.Forms.Label pulses21Label; + private System.Windows.Forms.Label sensor21Label; + private System.Windows.Forms.Label refPulses19Label; + private System.Windows.Forms.Label refPulses20Label; + private System.Windows.Forms.Label pulses20Label; + private System.Windows.Forms.Label pulses19Label; + private System.Windows.Forms.Label sensor20Label; + private System.Windows.Forms.Label sensor19Label; + private System.Windows.Forms.Label meter18Label; + private System.Windows.Forms.Label meter17Label; + private System.Windows.Forms.Label meter16Label; + private System.Windows.Forms.Label meter15Label; + private System.Windows.Forms.Label meter14Label; + private System.Windows.Forms.Label meter13Label; + private System.Windows.Forms.Label passed18Label; + private System.Windows.Forms.Label passed17Label; + private System.Windows.Forms.Label error18Label; + private System.Windows.Forms.Label passed16Label; + private System.Windows.Forms.Label error17Label; + private System.Windows.Forms.Label volume18Label; + private System.Windows.Forms.Label passed15Label; + private System.Windows.Forms.Label error16Label; + private System.Windows.Forms.Label volume17Label; + private System.Windows.Forms.Label passed14Label; + private System.Windows.Forms.Label refPulses18Label; + private System.Windows.Forms.Label error15Label; + private System.Windows.Forms.Label pulses18Label; + private System.Windows.Forms.Label sensor18Label; + private System.Windows.Forms.Label volume16Label; + private System.Windows.Forms.Label passed13Label; + private System.Windows.Forms.Label refPulses17Label; + private System.Windows.Forms.Label pulses17Label; + private System.Windows.Forms.Label error14Label; + private System.Windows.Forms.Label sensor17Label; + private System.Windows.Forms.Label volume15Label; + private System.Windows.Forms.Label refPulses16Label; + private System.Windows.Forms.Label label104; + private System.Windows.Forms.Label pulses16Label; + private System.Windows.Forms.Label volume14Label; + private System.Windows.Forms.Label sensor16Label; + private System.Windows.Forms.Label error13Label; + private System.Windows.Forms.Label refPulses15Label; + private System.Windows.Forms.Label volume13Label; + private System.Windows.Forms.Label pulses15Label; + private System.Windows.Forms.Label sensor15Label; + private System.Windows.Forms.Label refPulses13Label; + private System.Windows.Forms.Label refPulses14Label; + private System.Windows.Forms.Label pulses14Label; + private System.Windows.Forms.Label pulses13Label; + private System.Windows.Forms.Label sensor14Label; + private System.Windows.Forms.Label sensor13Label; + private System.Windows.Forms.Label label119; + private System.Windows.Forms.Label label120; + private System.Windows.Forms.Label label121; + private System.Windows.Forms.Label label122; + + + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Screens/ProcessTabPageCtrl24.cs b/TBF_V2/Sources/TBF/TBF/Screens/ProcessTabPageCtrl24.cs new file mode 100644 index 00000000..4c06963f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Screens/ProcessTabPageCtrl24.cs @@ -0,0 +1,674 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// +using System; +using System.Drawing; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.BenchControl.Sequences; +using TBF.UiBridge; +using TBF.Resources; + +#pragma warning disable 162 /// Disables 'Unreachable code detected' warning + +namespace TBF.Screens +{ + public partial class ProcessTabPageCtrl24 : UserControl + { + static readonly ILog log = LogManager.GetLogger(typeof(ProcessTabPageCtrl24)); + + MetersKind currentMetersKind; + + int textBoxesCount; + + Label[] meter; + Label[] sensor; + Label[] pulses; + Label[] refPulses; + Label[] volume; + Label[] error; + Label[] passed; + Label[] cmpndVolume; + Label[] cmpndError; + Label[] cmpndPassed; + + bool pumpOn = true; + bool diverterToTank = true; + + /// + /// Constructor, initializes anonymous event handlers + /// + public ProcessTabPageCtrl24() + { + currentMetersKind = MetersKind.Single; + + InitializeComponent(); + + textBoxesCount = 24; + meter = new Label[] { + meter1Label, meter2Label, meter3Label, meter4Label, meter5Label, meter6Label, + meter7Label, meter8Label, meter9Label, meter10Label, meter11Label, meter12Label, + meter13Label, meter14Label, meter15Label, meter16Label, meter17Label, meter18Label, + meter19Label, meter20Label, meter21Label, meter22Label, meter23Label, meter24Label, + }; + sensor = new Label[] { + sensor1Label, sensor2Label, sensor3Label, sensor4Label, sensor5Label, sensor6Label, + sensor7Label, sensor8Label, sensor9Label, sensor10Label, sensor11Label, sensor12Label, + sensor13Label, sensor14Label, sensor15Label, sensor16Label, sensor17Label, sensor18Label, + sensor19Label, sensor20Label, sensor21Label, sensor22Label, sensor23Label, sensor24Label, + }; + pulses = new Label[] { + pulses1Label, pulses2Label, pulses3Label, pulses4Label, pulses5Label, pulses6Label, + pulses7Label, pulses8Label, pulses9Label, pulses10Label, pulses11Label, pulses12Label, + pulses13Label, pulses14Label, pulses15Label, pulses16Label, pulses17Label, pulses18Label, + pulses19Label, pulses20Label, pulses21Label, pulses22Label, pulses23Label, pulses24Label, + }; + refPulses = new Label[] { + refPulses1Label, refPulses2Label, refPulses3Label, refPulses4Label, refPulses5Label, refPulses6Label, + refPulses7Label, refPulses8Label, refPulses9Label, refPulses10Label, refPulses11Label, refPulses12Label, + refPulses13Label, refPulses14Label, refPulses15Label, refPulses16Label, refPulses17Label, refPulses18Label, + refPulses19Label, refPulses20Label, refPulses21Label, refPulses22Label, refPulses23Label, refPulses24Label, + }; + volume = new Label[] { + volume1Label, volume2Label, volume3Label, volume4Label, volume5Label, volume6Label, + volume7Label, volume8Label, volume9Label, volume10Label, volume11Label, volume12Label, + volume13Label, volume14Label, volume15Label, volume16Label, volume17Label, volume18Label, + volume19Label, volume20Label, volume21Label, volume22Label, volume23Label, volume24Label, + }; + error = new Label[] { + error1Label, error2Label, error3Label, error4Label, error5Label, error6Label, + error7Label, error8Label, error9Label, error10Label, error11Label, error12Label, + error13Label, error14Label, error15Label, error16Label, error17Label, error18Label, + error19Label, error20Label, error21Label, error22Label, error23Label, error24Label, + }; + passed = new Label[] { + passed1Label, passed2Label, passed3Label, passed4Label, passed5Label, passed6Label, + passed7Label, passed8Label, passed9Label, passed10Label, passed11Label, passed12Label, + passed13Label, passed14Label, passed15Label, passed16Label, passed17Label, passed18Label, + passed19Label, passed20Label, passed21Label, passed22Label, passed23Label, passed24Label, + }; + + cmpndVolume = new Label[] { volume1zLabel, volume2zLabel, volume3zLabel }; + cmpndError = new Label[] { error1zLabel, error2zLabel, error3zLabel }; + cmpndPassed = new Label[] { passed1zLabel, passed2zLabel, passed3zLabel }; + + ShuffleLabels(Config.Data.WMsCount, Config.Data.LineSize); + + Bridge.ProcedureSelectedHandler += delegate(object sndr, ProcedureSelectedEventArgs args) + { + try + { + if (InvokeRequired) + Invoke(new EventHandler(OnProcedureSelected), sndr, args); + else + OnProcedureSelected(sndr, args); + } + catch (Exception e) { log.ErrorFormat("ProcessTabPage24.OnProcedureSelected() failed: {0}", e.Message); } + }; + + Bridge.TestSelectedHandler += delegate(object sender, TestSelectedEventArgs args) + { + try + { + if (InvokeRequired) + Invoke(new EventHandler(OnTestSelected), sender, args); + else + OnTestSelected(sender, args); + } + catch (Exception e) { log.ErrorFormat("ProcessTabPage24.OnTestSelected() failed: {0}", e.Message); } + }; + + Bridge.ProcessDataHandler += delegate(object sender, ProcessDataEventArgs args) + { + try + { + if (InvokeRequired) + Invoke(new EventHandler(OnProcessDataChanged), sender, args); + else + OnProcessDataChanged(sender, args); + } + catch (Exception e) { log.ErrorFormat("ProcessTabPage24.OnProcessDataChanged() failed: {0}", e.Message); } + }; + + Bridge.TestCompletedHandler += delegate(object sender, TestCompletedEventArgs args) + { + try + { + if (InvokeRequired) + Invoke(new EventHandler(OnTestCompleted), sender, args); + else + OnTestCompleted(sender, args); + } + catch (Exception e) { log.ErrorFormat("ProcessTabPage24.OnTestCompleted() failed: {0}", e.Message); } + }; + + Bridge.ProcedureCompletedHandler += delegate(object sender, ProcedureCompletedEventArgs args) + { + try + { + if (InvokeRequired) + Invoke(new EventHandler(OnProcedureCompleted), sender, args); + else + OnProcedureCompleted(sender, args); + } + catch (Exception e) { log.ErrorFormat("ProcessTabPage24.OnProcedureCompleted() failed: {0}", e.Message); } + }; + } + + /// + /// Make sure the layout of labels/text boxes on the screen + /// corresponds to the layout of watermeters of the test bench. + /// Enable only used labels. + /// + /// Number of watermeters + /// Number of watermeters in one line + void ShuffleLabels(int wmsCount, int lineSize) + { + if (wmsCount < textBoxesCount && lineSize > 0) + { + int nrLines = (wmsCount + lineSize - 1) / lineSize; + int gap = (textBoxesCount - wmsCount) / nrLines; + + int dest = 0; + for (int l = 0; l < nrLines; l++) + { + for (int i = 0; i < lineSize; i++) + { + meter[dest] = meter[l * lineSize + l * gap + i]; + meter[dest].Visible = true; + meter[dest].Text = string.Format("Meter {0}", dest + 1); + sensor[dest] = sensor[l * lineSize + l * gap + i]; + sensor[dest].Visible = true; + pulses[dest] = pulses[l * lineSize + l * gap + i]; + pulses[dest].Visible = true; + refPulses[dest] = refPulses[l * lineSize + l * gap + i]; + refPulses[dest].Visible = true; + volume[dest] = volume[l * lineSize + l * gap + i]; + volume[dest].Visible = true; + error[dest] = error[l * lineSize + l * gap + i]; + error[dest].Visible = true; + passed[dest] = passed[l * lineSize + l * gap + i]; + passed[dest].Visible = true; + dest++; + } + } + textBoxesCount = wmsCount; + } + } + + private void ProcessTabPageCtrl_Load(object sender, EventArgs e) + { + Once(); + ResetLabelsAndTargetVals(); + ResetReadings(); + } + + void Once() + { + + } + + void UpdateVisibility(MetersKind metersKind) + { + bool visible = (metersKind == MetersKind.Single || metersKind == MetersKind.HeatMeter); + + for (int i = 2 * Config.Data.CompoundWMsCount; i < textBoxesCount; i++) + { + meter[i].Visible = visible; + sensor[i].Visible = visible; + pulses[i].Visible = visible; + refPulses[i].Visible = visible; + volume[i].Visible = visible; + error[i].Visible = visible; + passed[i].Visible = visible; + } + + groupBox1z.Visible = (metersKind == MetersKind.Combined) && (Config.Data.CompoundWMsCount >= 1); + groupBox2z.Visible = (metersKind == MetersKind.Combined) && (Config.Data.CompoundWMsCount >= 2); + groupBox3z.Visible = (metersKind == MetersKind.Combined) && (Config.Data.CompoundWMsCount >= 3); + } + + + /// + /// Called when a new procedure is selected + /// + void ResetLabelsAndTargetVals() + { + /// Target values + targetFlowLowLabel.Text = "---"; + targetFlowHighLabel.Text = "---"; + targetVolumeLabel.Text = "---"; + targetRefCountLabel.Text = "---"; + estmtdTimeLabel.Text = "---"; + + // + refFlowCmpntLabel.Text = "---"; + regValveCmpntLabel.Text = "---"; + + /// Water pressure + prInCmpntLabel.Text = "---"; + prOutCmpntLabel.Text = "---"; + + /// Water temperature + tInCmpntLabel.Text = "---"; + tOutCmpntLabel.Text = "---"; + tDivCmpntLabel.Text = "---"; + + scaleCmpntLabel.Text = "---"; + + if (currentMetersKind == MetersKind.Single || currentMetersKind == MetersKind.HeatMeter) + { + watermeterPictureBox1.Visible = true; + watermeterPictureBox2.Visible = true; + watermeterPictureBox3.Visible = true; + watermeterPictureBox4.Visible = true; + watermeterPictureBox5.Visible = true; + watermeterPictureBox6.Visible = true; + + watermeterPictureBox1z.Visible = false; + watermeterPictureBox2z.Visible = false; + watermeterPictureBox3z.Visible = false; + + groupBox1z.Visible = false; + groupBox2z.Visible = false; + groupBox3z.Visible = false; + + sensor1Label.Text = "---"; + + for (int i = 0; i < textBoxesCount; i++) + { + sensor[i].Text = "---"; + } + } + else if (currentMetersKind == MetersKind.Combined) + { + watermeterPictureBox1.Visible = false; + watermeterPictureBox2.Visible = true; + watermeterPictureBox3.Visible = false; + watermeterPictureBox4.Visible = false; + watermeterPictureBox5.Visible = false; + watermeterPictureBox6.Visible = false; + + watermeterPictureBox1z.Visible = true; + watermeterPictureBox2z.Visible = false; + watermeterPictureBox3z.Visible = false; + + groupBox1z.Visible = true; + groupBox2z.Visible = false; + groupBox3z.Visible = false; + + sensor1Label.Visible = true; + sensor1Label.Text = "---"; + sensor2Label.Visible = true; + sensor2Label.Text = "---"; + } + } + + /// + /// Called when a new procedure or a new test procedure is selected + /// + void ResetReadings() + { + /// Top part + airTempLabel.Text = "---"; + airPressLabel.Text = "---"; + airHumiLabel.Text = "---"; + + refPulsesLabel.Text = "---"; + refFreqLabel.Text = "---"; + refFlowLabel.Text = "---"; + refVolumeLabel.Text = "---"; + + regValvePosLabel.Text = "---"; + tDivLabel.Text = "---"; + + tInLabel.Text = "---"; + tOutLabel.Text = "---"; + prInLabel.Text = "---"; + prOutLabel.Text = "---"; + + massLabel.Text = "---"; + massDiffLabel.Text = "---"; + volumeCtvLabel.Text = "---"; + refErrorLabel.Text = "---"; + + /// Meters + pulses1Label.Text = "---"; + refPulses1Label.Text = "---"; + volume1Label.Text = "---"; + error1Label.Text = "---"; + passed1Label.Text = "---"; + + if (currentMetersKind == MetersKind.Single || currentMetersKind == MetersKind.HeatMeter) + { + for (int i = 0; i < textBoxesCount; i++) + { + pulses[i].Text = "---"; + refPulses[i].Text = "---"; + volume[i].Text = "---"; + error[i].Text = "---"; + passed[i].Text = "---"; + } + } + else if (currentMetersKind == MetersKind.Combined) + { + for (int i = 0; i < 2; i++) + { + pulses[i].Text = "---"; + refPulses[i].Text = "---"; + volume[i].Text = "---"; + error[i].Text = "---"; + passed[i].Text = "---"; + } + volume1zLabel.Text = "---"; + error1zLabel.Text = "---"; + passed1zLabel.Text = "---"; + } + } + + void OnProcedureSelected(object sender, ProcedureSelectedEventArgs args) + { + currentMetersKind = args.Procedure.MetersKind; + UpdateVisibility(currentMetersKind); + ResetLabelsAndTargetVals(); + ResetReadings(); + Invalidate(); + } + + void OnTestSelected(object sender, TestSelectedEventArgs args) + { + /// Readings and target values + ResetReadings(); + + /// Target values + targetFlowLowLabel.Text = args.Test.Qfrom.ToString("F3"); + targetFlowHighLabel.Text = args.Test.Qto.ToString("F3"); + targetVolumeLabel.Text = args.Test.Volume.ToString("F1"); + targetRefCountLabel.Text = args.TotalPulses.ToString(); + estmtdTimeLabel.Text = args.Test.TstTime.ToString("F1"); + + /// Names of virtual bench components + if (args.BenchPath.PressMtrUp != null) prInCmpntLabel.Text = args.BenchPath.PressMtrUp.Name; + if (args.BenchPath.PressMtrDown != null) prOutCmpntLabel.Text = args.BenchPath.PressMtrDown.Name; + if (args.BenchPath.TempMtrUp != null) tInCmpntLabel.Text = args.BenchPath.TempMtrUp.Name; + if (args.BenchPath.TempMtrDown != null) tOutCmpntLabel.Text = args.BenchPath.TempMtrDown.Name; + if (args.OutputPath.TempDiv != null) tDivCmpntLabel.Text = args.OutputPath.TempDiv.Name; + if (args.OutputPath.FlowMeter != null) refFlowCmpntLabel.Text = args.OutputPath.FlowMeter.Name; + if (args.OutputPath.RegulValve != null) regValveCmpntLabel.Text = args.OutputPath.RegulValve.Name; + if (args.OutputPath.Scale != null) scaleCmpntLabel.Text = args.OutputPath.Scale.Name; + + for (int i = 0; i < textBoxesCount; i++) + { + sensor[i].Text = (args.MetersPath.RegisterReaders[i] == null) ? "" : args.MetersPath.RegisterReaders[i].Cfg.Name; + } + + if (args.FeedingPath != null && (args.FeedingPath.Pump is BenchControl.GenericDevices.IPumpFM)) + { + pumpPctTextBox.Visible = true; + pumpPctTextBox.Text = (args.FeedingPath.Pump as BenchControl.GenericDevices.IPumpFM).Power.ToString("F0") + " %"; + } + else + { + pumpPctTextBox.Visible = false; + } + } + + void OnProcessDataChanged(object sender, ProcessDataEventArgs args) + { + ///// + ///// Always available + ///// + //airTempLabel.Text = ProcessData.AmbTemp.ToString(); + // airPressLabel.Text = Config.Units.ConvertTo(Config.Unit.mbar, ProcessData.AmbPress.Val).ToString("F0"); + // airHumiLabel.Text = ProcessData.AmbHumi.ToString(); + + //tInLabel.Text = ProcessData.TempUp.ToString(); + //tOutLabel.Text = ProcessData.TempDown.ToString(); + //tDivLabel.Text = ProcessData.TempDiv.ToString(); + + //prInLabel.Text = ProcessData.PressUp.ToString(); + //prOutLabel.Text = ProcessData.PressDown.ToString(); + + //massLabel.Text = ProcessData.Mass.ToString(); + + //if (args.TestPhase == Config.Entities.Progress.FlowSetting || + // args.TestPhase == Config.Entities.Progress.Test) + //{ + // /// + // /// Available when setting the flow and during a test + // /// + // refFreqLabel.Text = ProcessData.RefFreq.ToString(); + // refFlowLabel.Text = Utils.DoubleToStr(ProcessData.RefFlow.Val, 4); + //} + + //if (args.TestPhase == Config.Entities.Progress.Test) + //{ + // /// + // /// Available only during a test + // /// + // refPulsesLabel.Text = ProcessData.RefPulses.ToString(); + // double refVolume = ProcessData.LtrPerRefPulse * (double)ProcessData.RefPulses; + // refVolumeLabel.Text = refVolume.ToString("F2"); + + // double massDiff = ProcessData.Mass.Val - ProcessData.StartMass.Val; + // massDiffLabel.Text = massDiff.ToString("F3"); + // double volumeCtv = 1000.0 * Config.Formulas.Buoyancy() * massDiff / Config.Formulas.WaterDensityFromTemp((ProcessData.TempUp.Val + ProcessData.TempDown.Val) / 2, Program.LocalSettings.RealDensity, Program.LocalSettings.AtTemperature); + // volumeCtvLabel.Text = volumeCtv.ToString("F2"); + // double refError = Config.Formulas.ErrorFromVolumes(refVolume, volumeCtv); + // refErrorLabel.Text = refError.ToString("F3"); + + // if (currentMetersKind == MetersKind.Single || currentMetersKind == MetersKind.HeatMeter) + // { + // for (int i = 0; i < Math.Min(textBoxesCount, ProcessData.RegisterReaders.Length); i++) + // { + // BenchControl.GenericDevices.IRegisterReader rr = ProcessData.RegisterReaders[i]; + // if (rr != null) + // { + // pulses[i].Text = rr.WMPulses.ToString(); + // refPulses[i].Text = rr.WMRefPulses.ToString(); + // volume[i].Text = rr.WMVolume.ToString("F1"); + // error[i].Text = Config.Formulas.ErrorFromVolumes(rr.WMVolume, rr.WMRefPulses * ProcessData.LtrPerRefPulse).ToString("F1"); + // } + // } + // } + // else if (currentMetersKind == MetersKind.Combined) + // { + // for (int compMtr = 0; compMtr < Config.Data.CompoundWMsCount; compMtr++) + // { + // int end = Math.Min(2 * compMtr + 2, Math.Min(textBoxesCount, ProcessData.RegisterReaders.Length)); + + // double compoundVolume = 0; + // for (int i = 2 * compMtr; i < end; i++) + // { + // BenchControl.GenericDevices.IRegisterReader rr = ProcessData.RegisterReaders[i]; + // if (rr != null) + // { + // pulses[i].Text = rr.WMPulses.ToString(); + // refPulses[i].Text = rr.WMRefPulses.ToString(); + // volume[i].Text = rr.WMVolume.ToString("F1"); + // error[i].Text = Config.Formulas.ErrorFromVolumes(rr.WMVolume, rr.WMRefPulses * ProcessData.LtrPerRefPulse).ToString("F1"); + // compoundVolume += rr.WMVolume; + // } + // } + + // cmpndVolume[compMtr].Text = compoundVolume.ToString("F1"); + // cmpndError[compMtr].Text = Config.Formulas.ErrorFromVolumes(compoundVolume, refVolume).ToString("F1"); + // } + // } + //} + + ////if (pumpOn != args.PumpOn || diverterToTank != args.DivToTank) + ////{ + //// //if (pumpOn != args.PumpOn) + //// //{ + //// // if (pumpOn) pumpPictureBox.Image = System.Resources. + //// // else pumpPictureBox.Image = System.Resources. + //// //} + //// pumpOn = args.PumpOn; + //// diverterToTank = args.DivToTank; + //// Invalidate(); + ////} + } + + void OnTestCompleted(object sender, TestCompletedEventArgs args) + { + //Results.Entities.TestRslt tRes = args.TestRslt; + // if (tRes == null) return; + + //airTempLabel.Text = tRes.AmbTempMean.ToString("F1"); + // airPressLabel.Text = Config.Units.ConvertTo(Config.Unit.mbar, tRes.AmbPressMean).ToString("F0"); + // airHumiLabel.Text = tRes.AmbHumiMean.ToString("F1"); + + //tInLabel.Text = tRes.TempUpMean.ToString("F2"); + //tOutLabel.Text = tRes.TempDownMean.ToString("F2"); + //tDivLabel.Text = tRes.TempDivMean.ToString("F2"); + + //prInLabel.Text = tRes.PressUpMean.ToString("F2"); + //prOutLabel.Text = tRes.PressDownMean.ToString("F2"); + + //massLabel.Text = ProcessData.Mass.ToString(); + //massDiffLabel.Text = (tRes.MassEnd - tRes.MassStart).ToString("F3"); + + //refPulsesLabel.Text = tRes.PulsesMaster.ToString("F0"); + //refFreqLabel.Text = "---"; + //refFlowLabel.Text = Utils.DoubleToStr(tRes.FlowVolume, 4); + + //refVolumeLabel.Text = tRes.VolumeCTV.ToString("F2"); + ////regValvePosLabel.Text = tstRslt. + + //volumeCtvLabel.Text = tRes.VolumeCTV.ToString("F1"); + //refErrorLabel.Text = (tRes.ErrorMaster == 0) ? "---" : tRes.ErrorMaster.ToString("F3"); + + //if (!tRes.Batch.Compound) + //{ + // for (int i = 0; i < Math.Min(textBoxesCount, ProcessData.BatchRslts.WaterMeters.Length); i++) + // { + // Results.Entities.WaterMeter wm = ProcessData.BatchRslts.WaterMeters[i]; + // Results.Entities.MeterTestRslt mtr = (wm != null) ? wm.GetMeterTestRslt(args.TestName) : null; + + // if (mtr != null) + // { + // pulses[i].Text = mtr.PulsesMeter.ToString("F0"); + // refPulses[i].Text = mtr.PulsesMaster.ToString("F0"); + // volume[i].Text = mtr.VolumeMeter.ToString("F2"); + // error[i].Text = mtr.Error.ToString("F2"); + // passed[i].Text = mtr.Passed ? Strings.Passed : Strings.Failed; + // } + // } + //} + //else + //{ + // for (int compMtr = 0; compMtr < Config.Data.CompoundWMsCount; compMtr++) + // { + // Results.Entities.WaterMeter wm = ProcessData.BatchRslts.WaterMeters[compMtr]; + // if (wm == null) continue; + + // int end = Math.Min(textBoxesCount, Config.Data.WMsCount); + + // Results.Entities.MeterTestRslt mtrMain = wm.GetMeterTestRslt(args.TestName, CompoundMeterId.CompoundMain); + // if ((mtrMain != null) && (2 * compMtr < end)) + // { + // pulses[2 * compMtr].Text = mtrMain.PulsesMeter.ToString("F0"); + // refPulses[2 * compMtr].Text = mtrMain.PulsesMaster.ToString("F0"); + // volume[2 * compMtr].Text = mtrMain.VolumeMeter.ToString("F2"); + // error[2 * compMtr].Text = mtrMain.Error.ToString("F2"); + // passed[2 * compMtr].Text = mtrMain.Passed ? Strings.Passed : Strings.Failed; + // } + + // Results.Entities.MeterTestRslt mtrAux = wm.GetMeterTestRslt(args.TestName, CompoundMeterId.CompoundAux); + // if ((mtrAux != null) && (2 * compMtr + 1 < end)) + // { + // pulses[2 * compMtr + 1].Text = mtrAux.PulsesMeter.ToString("F0"); + // refPulses[2 * compMtr + 1].Text = mtrAux.PulsesMaster.ToString("F0"); + // volume[2 * compMtr + 1].Text = mtrAux.VolumeMeter.ToString("F2"); + // error[2 * compMtr + 1].Text = mtrAux.Error.ToString("F2"); + // passed[2 * compMtr + 1].Text = mtrAux.Passed ? Strings.Passed : Strings.Failed; + // } + + // Results.Entities.MeterTestRslt mtrComp = wm.GetMeterTestRslt(args.TestName, CompoundMeterId.Compound); + // if (mtrComp != null) + // { + // cmpndVolume[compMtr].Text = mtrComp.VolumeMeter.ToString("F2"); + // cmpndError[compMtr].Text = mtrComp.Error.ToString("F2"); + // cmpndPassed[compMtr].Text = mtrComp.Passed ? Strings.Passed : Strings.Failed; + // } + // } + //} + } + + void OnProcedureCompleted(object sender, ProcedureCompletedEventArgs args) + { + } + + private void ProcessTabPageCtrl_Paint(object sender, PaintEventArgs e) + { + System.Drawing.Graphics formGraphics = this.CreateGraphics(); + + System.Drawing.SolidBrush filledBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Blue); + System.Drawing.SolidBrush emptyBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Gray); + System.Drawing.SolidBrush benchBrush = (pumpOn ? filledBrush : emptyBrush); + + int diam = 14; // pipe diameter (pixels) + int left = 20; // left-most pipe x-coordinate + int top = 14; // top-most pipe y-coordinate + int topLeft = 876; + int topRight = 966; + int divTop = 40; + int bottom = 504; // bottom-most pipe y-coordinate + int benchTop = 378; // bench-pipe top y-coordinate + int pumpLeft = 779; + int pumpWdth = 38; + + /// Pipes + formGraphics.FillRectangle(filledBrush,new Rectangle(pumpLeft+pumpWdth, bottom-diam, 65, diam)); // tank -> pump + formGraphics.FillRectangle(benchBrush, new Rectangle(left, bottom-diam, pumpLeft-left, diam)); // pump ->bench horizontal + formGraphics.FillRectangle(benchBrush, new Rectangle(left, benchTop, diam, bottom-benchTop)); // ->bench vertical + formGraphics.FillRectangle(benchBrush, new Rectangle(left + diam, benchTop, topLeft-left, diam)); // bench horizontal + formGraphics.FillRectangle(benchBrush, new Rectangle(topLeft, top + diam, diam, benchTop-top-diam)); // bench -> top vertical + formGraphics.FillRectangle(benchBrush, new Rectangle(topLeft, top, topRight-topLeft, diam)); // top horizontal + formGraphics.FillRectangle(benchBrush, new Rectangle(topRight-diam, top+diam, diam, divTop-top-diam)); // top -> diverter vertical + + /// Combined meters bypasses + if (watermeterPictureBox1z.Visible) PaintBypass(formGraphics, benchBrush, 186, benchTop + diam); + if (watermeterPictureBox2z.Visible) PaintBypass(formGraphics, benchBrush, 470, benchTop + diam); + if (watermeterPictureBox3z.Visible) PaintBypass(formGraphics, benchBrush, 754, benchTop + diam); + + /// Diverter + int displacement = diverterToTank ? 25 : -25; + Point[] points = new Point[4]; + points[0].X = topRight - diam; + points[0].Y = divTop; + points[1].X = topRight; + points[1].Y = divTop; + points[2].X = topRight + displacement; + points[2].Y = divTop + 50; + points[3].X = topRight - diam + displacement; + points[3].Y = divTop + 50; + formGraphics.FillPolygon(benchBrush, points); + + /// Sink + formGraphics.FillEllipse(emptyBrush, topRight - diam / 2 - 45, divTop + 50, 40, 30); + formGraphics.DrawEllipse(Pens.Black, topRight - diam / 2 - 45, divTop + 50, 40, 30); + + /// Tank + formGraphics.DrawRectangle(Pens.Black, topRight - diam / 2, divTop + 51, 60, 80); + + + emptyBrush.Dispose(); + filledBrush.Dispose(); + formGraphics.Dispose(); + } + + private void PaintBypass(System.Drawing.Graphics formGraphics, System.Drawing.SolidBrush brush, int startX, int startY) + { + int w = 80; + int h = 43; + int diam = 10; // pipe diameter (pixels) + + formGraphics.FillRectangle(brush, new Rectangle(startX, startY, diam, h - diam)); + formGraphics.FillRectangle(brush, new Rectangle(startX, startY + h - diam, w, diam)); + formGraphics.FillRectangle(brush, new Rectangle(startX + w - diam, startY, diam, h)); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Screens/ProcessTabPageCtrl24.resx b/TBF_V2/Sources/TBF/TBF/Screens/ProcessTabPageCtrl24.resx new file mode 100644 index 00000000..1f4e3da5 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Screens/ProcessTabPageCtrl24.resx @@ -0,0 +1,327 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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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 + zVhuAr/Ce2bVcGWw1gAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACYAAAAeCAYAAABAFGxuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAIGSURBVFhH7de/SwJhGAfwtwJpUlBwaVIEcXDVxcUxQaS1 + QdLVwTnQv0AcGgUdo9U1dNAWHVwiEQKFaAkCwZqq5el53rvT03v8cXqeDQ0fjXu97/PFO+w9MZlMYFO1 + Wg2EEJbg8vX+iy3i8vW2KHaEznbkgm63C6PRiJ1DtijmQLCjMRLg8/mgUqmwsw5UTEN5UfD7/ZDL5eZm + mSqWz+cxyMpimhZS7r12uy1n4d/GG3O5Y8QFWyWCTpCcRy8lRK3XeUJcoJVGaFrsXj34V9hYrFrtQSj0 + wa4Z2VgsGh1Dq9WS79z6PBuLkUbjQZZLJN7Y9ZkVxYrFgQzZl3j83TBz5oDFms02uN3fhrmKAxbzer8M + M2dWFNsH7R4Lh+mXnf+MwsZi6fSLLBUMfrLr82wsVio9ssd5NhYzZ1rsEhXVg4dA3ybN12CnSCQCRCkY + UP0gLmAfnpGQHfQM+zGlIO257hAXZLUMJJPJuQ6yx+KBfr+P/3CreAIVTOoC9uEK8Q8mS3ew5XIZYrEY + nuhCN2qQlQZIQL1eZ+ev3VoHAgFwOOjSXqNXNXRXSqlOp8POJBvt+Xu9ngwS4lQN3oVy+egJybLHt2w2 + K0OFOFeHmJFByn5+2eXTM1WMDIdD8Hg8coAQtyquCKGfHVq/kOekUik2k2O6mKZQKOBAKrea0+nE7Y2b + zVhuAr/Ce2bVcGWw1gAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACYAAAAeCAYAAABAFGxuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAIGSURBVFhH7de/SwJhGAfwtwJpUlBwaVIEcXDVxcUxQaS1 + QdLVwTnQv0AcGgUdo9U1dNAWHVwiEQKFaAkCwZqq5el53rvT03v8cXqeDQ0fjXu97/PFO+w9MZlMYFO1 + Wg2EEJbg8vX+iy3i8vW2KHaEznbkgm63C6PRiJ1DtijmQLCjMRLg8/mgUqmwsw5UTEN5UfD7/ZDL5eZm + mSqWz+cxyMpimhZS7r12uy1n4d/GG3O5Y8QFWyWCTpCcRy8lRK3XeUJcoJVGaFrsXj34V9hYrFrtQSj0 + wa4Z2VgsGh1Dq9WS79z6PBuLkUbjQZZLJN7Y9ZkVxYrFgQzZl3j83TBz5oDFms02uN3fhrmKAxbzer8M + M2dWFNsH7R4Lh+mXnf+MwsZi6fSLLBUMfrLr82wsVio9ssd5NhYzZ1rsEhXVg4dA3ybN12CnSCQCRCkY + UP0gLmAfnpGQHfQM+zGlIO257hAXZLUMJJPJuQ6yx+KBfr+P/3CreAIVTOoC9uEK8Q8mS3ew5XIZYrEY + nuhCN2qQlQZIQL1eZ+ev3VoHAgFwOOjSXqNXNXRXSqlOp8POJBvt+Xu9ngwS4lQN3oVy+egJybLHt2w2 + K0OFOFeHmJFByn5+2eXTM1WMDIdD8Hg8coAQtyquCKGfHVq/kOekUik2k2O6mKZQKOBAKrea0+nE7Y2b + zVhuAr/Ce2bVcGWw1gAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACYAAAAeCAYAAABAFGxuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAIGSURBVFhH7de/SwJhGAfwtwJpUlBwaVIEcXDVxcUxQaS1 + QdLVwTnQv0AcGgUdo9U1dNAWHVwiEQKFaAkCwZqq5el53rvT03v8cXqeDQ0fjXu97/PFO+w9MZlMYFO1 + Wg2EEJbg8vX+iy3i8vW2KHaEznbkgm63C6PRiJ1DtijmQLCjMRLg8/mgUqmwsw5UTEN5UfD7/ZDL5eZm + mSqWz+cxyMpimhZS7r12uy1n4d/GG3O5Y8QFWyWCTpCcRy8lRK3XeUJcoJVGaFrsXj34V9hYrFrtQSj0 + wa4Z2VgsGh1Dq9WS79z6PBuLkUbjQZZLJN7Y9ZkVxYrFgQzZl3j83TBz5oDFms02uN3fhrmKAxbzer8M + M2dWFNsH7R4Lh+mXnf+MwsZi6fSLLBUMfrLr82wsVio9ssd5NhYzZ1rsEhXVg4dA3ybN12CnSCQCRCkY + UP0gLmAfnpGQHfQM+zGlIO257hAXZLUMJJPJuQ6yx+KBfr+P/3CreAIVTOoC9uEK8Q8mS3ew5XIZYrEY + nuhCN2qQlQZIQL1eZ+ev3VoHAgFwOOjSXqNXNXRXSqlOp8POJBvt+Xu9ngwS4lQN3oVy+egJybLHt2w2 + K0OFOFeHmJFByn5+2eXTM1WMDIdD8Hg8coAQtyquCKGfHVq/kOekUik2k2O6mKZQKOBAKrea0+nE7Y2b + zVhuAr/Ce2bVcGWw1gAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACYAAAAeCAYAAABAFGxuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAIGSURBVFhH7de/SwJhGAfwtwJpUlBwaVIEcXDVxcUxQaS1 + QdLVwTnQv0AcGgUdo9U1dNAWHVwiEQKFaAkCwZqq5el53rvT03v8cXqeDQ0fjXu97/PFO+w9MZlMYFO1 + Wg2EEJbg8vX+iy3i8vW2KHaEznbkgm63C6PRiJ1DtijmQLCjMRLg8/mgUqmwsw5UTEN5UfD7/ZDL5eZm + mSqWz+cxyMpimhZS7r12uy1n4d/GG3O5Y8QFWyWCTpCcRy8lRK3XeUJcoJVGaFrsXj34V9hYrFrtQSj0 + wa4Z2VgsGh1Dq9WS79z6PBuLkUbjQZZLJN7Y9ZkVxYrFgQzZl3j83TBz5oDFms02uN3fhrmKAxbzer8M + M2dWFNsH7R4Lh+mXnf+MwsZi6fSLLBUMfrLr82wsVio9ssd5NhYzZ1rsEhXVg4dA3ybN12CnSCQCRCkY + UP0gLmAfnpGQHfQM+zGlIO257hAXZLUMJJPJuQ6yx+KBfr+P/3CreAIVTOoC9uEK8Q8mS3ew5XIZYrEY + nuhCN2qQlQZIQL1eZ+ev3VoHAgFwOOjSXqNXNXRXSqlOp8POJBvt+Xu9ngwS4lQN3oVy+egJybLHt2w2 + K0OFOFeHmJFByn5+2eXTM1WMDIdD8Hg8coAQtyquCKGfHVq/kOekUik2k2O6mKZQKOBAKrea0+nE7Y2b + zVhuAr/Ce2bVcGWw1gAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACYAAAAeCAYAAABAFGxuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAIGSURBVFhH7de/SwJhGAfwtwJpUlBwaVIEcXDVxcUxQaS1 + QdLVwTnQv0AcGgUdo9U1dNAWHVwiEQKFaAkCwZqq5el53rvT03v8cXqeDQ0fjXu97/PFO+w9MZlMYFO1 + Wg2EEJbg8vX+iy3i8vW2KHaEznbkgm63C6PRiJ1DtijmQLCjMRLg8/mgUqmwsw5UTEN5UfD7/ZDL5eZm + mSqWz+cxyMpimhZS7r12uy1n4d/GG3O5Y8QFWyWCTpCcRy8lRK3XeUJcoJVGaFrsXj34V9hYrFrtQSj0 + wa4Z2VgsGh1Dq9WS79z6PBuLkUbjQZZLJN7Y9ZkVxYrFgQzZl3j83TBz5oDFms02uN3fhrmKAxbzer8M + M2dWFNsH7R4Lh+mXnf+MwsZi6fSLLBUMfrLr82wsVio9ssd5NhYzZ1rsEhXVg4dA3ybN12CnSCQCRCkY + UP0gLmAfnpGQHfQM+zGlIO257hAXZLUMJJPJuQ6yx+KBfr+P/3CreAIVTOoC9uEK8Q8mS3ew5XIZYrEY + nuhCN2qQlQZIQL1eZ+ev3VoHAgFwOOjSXqNXNXRXSqlOp8POJBvt+Xu9ngwS4lQN3oVy+egJybLHt2w2 + K0OFOFeHmJFByn5+2eXTM1WMDIdD8Hg8coAQtyquCKGfHVq/kOekUik2k2O6mKZQKOBAKrea0+nE7Y2b + zVhuAr/Ce2bVcGWw1gAAAABJRU5ErkJggg== + + + + + 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 + zVhuAr/Ce2bVcGWw1gAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACYAAAAeCAYAAABAFGxuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAIGSURBVFhH7de/SwJhGAfwtwJpUlBwaVIEcXDVxcUxQaS1 + QdLVwTnQv0AcGgUdo9U1dNAWHVwiEQKFaAkCwZqq5el53rvT03v8cXqeDQ0fjXu97/PFO+w9MZlMYFO1 + Wg2EEJbg8vX+iy3i8vW2KHaEznbkgm63C6PRiJ1DtijmQLCjMRLg8/mgUqmwsw5UTEN5UfD7/ZDL5eZm + mSqWz+cxyMpimhZS7r12uy1n4d/GG3O5Y8QFWyWCTpCcRy8lRK3XeUJcoJVGaFrsXj34V9hYrFrtQSj0 + wa4Z2VgsGh1Dq9WS79z6PBuLkUbjQZZLJN7Y9ZkVxYrFgQzZl3j83TBz5oDFms02uN3fhrmKAxbzer8M + M2dWFNsH7R4Lh+mXnf+MwsZi6fSLLBUMfrLr82wsVio9ssd5NhYzZ1rsEhXVg4dA3ybN12CnSCQCRCkY + UP0gLmAfnpGQHfQM+zGlIO257hAXZLUMJJPJuQ6yx+KBfr+P/3CreAIVTOoC9uEK8Q8mS3ew5XIZYrEY + nuhCN2qQlQZIQL1eZ+ev3VoHAgFwOOjSXqNXNXRXSqlOp8POJBvt+Xu9ngwS4lQN3oVy+egJybLHt2w2 + K0OFOFeHmJFByn5+2eXTM1WMDIdD8Hg8coAQtyquCKGfHVq/kOekUik2k2O6mKZQKOBAKrea0+nE7Y2b + zVhuAr/Ce2bVcGWw1gAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACYAAAAeCAYAAABAFGxuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAIGSURBVFhH7de/SwJhGAfwtwJpUlBwaVIEcXDVxcUxQaS1 + QdLVwTnQv0AcGgUdo9U1dNAWHVwiEQKFaAkCwZqq5el53rvT03v8cXqeDQ0fjXu97/PFO+w9MZlMYFO1 + Wg2EEJbg8vX+iy3i8vW2KHaEznbkgm63C6PRiJ1DtijmQLCjMRLg8/mgUqmwsw5UTEN5UfD7/ZDL5eZm + mSqWz+cxyMpimhZS7r12uy1n4d/GG3O5Y8QFWyWCTpCcRy8lRK3XeUJcoJVGaFrsXj34V9hYrFrtQSj0 + wa4Z2VgsGh1Dq9WS79z6PBuLkUbjQZZLJN7Y9ZkVxYrFgQzZl3j83TBz5oDFms02uN3fhrmKAxbzer8M + M2dWFNsH7R4Lh+mXnf+MwsZi6fSLLBUMfrLr82wsVio9ssd5NhYzZ1rsEhXVg4dA3ybN12CnSCQCRCkY + UP0gLmAfnpGQHfQM+zGlIO257hAXZLUMJJPJuQ6yx+KBfr+P/3CreAIVTOoC9uEK8Q8mS3ew5XIZYrEY + nuhCN2qQlQZIQL1eZ+ev3VoHAgFwOOjSXqNXNXRXSqlOp8POJBvt+Xu9ngwS4lQN3oVy+egJybLHt2w2 + K0OFOFeHmJFByn5+2eXTM1WMDIdD8Hg8coAQtyquCKGfHVq/kOekUik2k2O6mKZQKOBAKrea0+nE7Y2b + zVhuAr/Ce2bVcGWw1gAAAABJRU5ErkJggg== + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Screens/ProcessTabPageCtrl48.Designer.cs b/TBF_V2/Sources/TBF/TBF/Screens/ProcessTabPageCtrl48.Designer.cs new file mode 100644 index 00000000..950e6acc --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Screens/ProcessTabPageCtrl48.Designer.cs @@ -0,0 +1,4861 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// Author: Milan Hanajík +/// +namespace TBF.Screens +{ + partial class ProcessTabPageCtrl48 + { + /// + /// 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 Component 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(ProcessTabPageCtrl48)); + this.sensor1Label = new System.Windows.Forms.Label(); + this.pulses1Label = new System.Windows.Forms.Label(); + this.refPulses1Label = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.volume1Label = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.error1Label = new System.Windows.Forms.Label(); + this.passed1Label = new System.Windows.Forms.Label(); + this.label35 = new System.Windows.Forms.Label(); + this.passed2Label = new System.Windows.Forms.Label(); + this.error2Label = new System.Windows.Forms.Label(); + this.volume2Label = new System.Windows.Forms.Label(); + this.refPulses2Label = new System.Windows.Forms.Label(); + this.pulses2Label = new System.Windows.Forms.Label(); + this.sensor2Label = new System.Windows.Forms.Label(); + this.passed3Label = new System.Windows.Forms.Label(); + this.error3Label = new System.Windows.Forms.Label(); + this.volume3Label = new System.Windows.Forms.Label(); + this.refPulses3Label = new System.Windows.Forms.Label(); + this.pulses3Label = new System.Windows.Forms.Label(); + this.sensor3Label = new System.Windows.Forms.Label(); + this.label13 = new System.Windows.Forms.Label(); + this.label14 = new System.Windows.Forms.Label(); + this.tInLabel = new System.Windows.Forms.Label(); + this.prInLabel = new System.Windows.Forms.Label(); + this.prOutLabel = new System.Windows.Forms.Label(); + this.tOutLabel = new System.Windows.Forms.Label(); + this.label17 = new System.Windows.Forms.Label(); + this.label18 = new System.Windows.Forms.Label(); + this.label15 = new System.Windows.Forms.Label(); + this.tInCmpntLabel = new System.Windows.Forms.Label(); + this.tOutCmpntLabel = new System.Windows.Forms.Label(); + this.prOutCmpntLabel = new System.Windows.Forms.Label(); + this.prInCmpntLabel = new System.Windows.Forms.Label(); + this.refFlowLabel = new System.Windows.Forms.Label(); + this.label16 = new System.Windows.Forms.Label(); + this.refFreqLabel = new System.Windows.Forms.Label(); + this.label19 = new System.Windows.Forms.Label(); + this.refPulsesLabel = new System.Windows.Forms.Label(); + this.refFlowCmpntLabel = new System.Windows.Forms.Label(); + this.regValveCmpntLabel = new System.Windows.Forms.Label(); + this.regValvePosLabel = new System.Windows.Forms.Label(); + this.label21 = new System.Windows.Forms.Label(); + this.tDivCmpntLabel = new System.Windows.Forms.Label(); + this.tDivLabel = new System.Windows.Forms.Label(); + this.label24 = new System.Windows.Forms.Label(); + this.scaleCmpntLabel = new System.Windows.Forms.Label(); + this.label22 = new System.Windows.Forms.Label(); + this.massLabel = new System.Windows.Forms.Label(); + this.label23 = new System.Windows.Forms.Label(); + this.massDiffLabel = new System.Windows.Forms.Label(); + this.label25 = new System.Windows.Forms.Label(); + this.refVolumeLabel = new System.Windows.Forms.Label(); + this.label26 = new System.Windows.Forms.Label(); + this.volumeCtvLabel = new System.Windows.Forms.Label(); + this.label27 = new System.Windows.Forms.Label(); + this.refErrorLabel = new System.Windows.Forms.Label(); + this.label28 = new System.Windows.Forms.Label(); + this.label29 = new System.Windows.Forms.Label(); + this.label20 = new System.Windows.Forms.Label(); + this.label30 = new System.Windows.Forms.Label(); + this.targetFlowLowLabel = new System.Windows.Forms.Label(); + this.targetFlowHighLabel = new System.Windows.Forms.Label(); + this.targetVolumeLabel = new System.Windows.Forms.Label(); + this.label31 = new System.Windows.Forms.Label(); + this.targetRefCountLabel = new System.Windows.Forms.Label(); + this.estmtdTimeLabel = new System.Windows.Forms.Label(); + this.label32 = new System.Windows.Forms.Label(); + this.label33 = new System.Windows.Forms.Label(); + this.label34 = new System.Windows.Forms.Label(); + this.airTempLabel = new System.Windows.Forms.Label(); + this.airPressLabel = new System.Windows.Forms.Label(); + this.airHumiLabel = new System.Windows.Forms.Label(); + this.reservoirPictureBox = new System.Windows.Forms.PictureBox(); + this.pumpPictureBox = new System.Windows.Forms.PictureBox(); + this.watermeterPictureBox1 = new System.Windows.Forms.PictureBox(); + this.watermeterPictureBox2 = new System.Windows.Forms.PictureBox(); + this.watermeterPictureBox3 = new System.Windows.Forms.PictureBox(); + this.watermeterPictureBox4 = new System.Windows.Forms.PictureBox(); + this.passed4Label = new System.Windows.Forms.Label(); + this.error4Label = new System.Windows.Forms.Label(); + this.volume4Label = new System.Windows.Forms.Label(); + this.refPulses4Label = new System.Windows.Forms.Label(); + this.pulses4Label = new System.Windows.Forms.Label(); + this.sensor4Label = new System.Windows.Forms.Label(); + this.watermeterPictureBox5 = new System.Windows.Forms.PictureBox(); + this.passed5Label = new System.Windows.Forms.Label(); + this.error5Label = new System.Windows.Forms.Label(); + this.volume5Label = new System.Windows.Forms.Label(); + this.refPulses5Label = new System.Windows.Forms.Label(); + this.pulses5Label = new System.Windows.Forms.Label(); + this.sensor5Label = new System.Windows.Forms.Label(); + this.watermeterPictureBox6 = new System.Windows.Forms.PictureBox(); + this.passed6Label = new System.Windows.Forms.Label(); + this.error6Label = new System.Windows.Forms.Label(); + this.volume6Label = new System.Windows.Forms.Label(); + this.refPulses6Label = new System.Windows.Forms.Label(); + this.pulses6Label = new System.Windows.Forms.Label(); + this.sensor6Label = new System.Windows.Forms.Label(); + this.flowMeterPictureBox = new System.Windows.Forms.PictureBox(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.watermeterPictureBox1z = new System.Windows.Forms.PictureBox(); + this.watermeterPictureBox2z = new System.Windows.Forms.PictureBox(); + this.watermeterPictureBox3z = new System.Windows.Forms.PictureBox(); + this.groupBox1z = new System.Windows.Forms.GroupBox(); + this.passed1zLabel = new System.Windows.Forms.Label(); + this.error1zLabel = new System.Windows.Forms.Label(); + this.label56 = new System.Windows.Forms.Label(); + this.volume1zLabel = new System.Windows.Forms.Label(); + this.label58 = new System.Windows.Forms.Label(); + this.groupBox2z = new System.Windows.Forms.GroupBox(); + this.passed2zLabel = new System.Windows.Forms.Label(); + this.error2zLabel = new System.Windows.Forms.Label(); + this.label52 = new System.Windows.Forms.Label(); + this.volume2zLabel = new System.Windows.Forms.Label(); + this.label59 = new System.Windows.Forms.Label(); + this.groupBox3z = new System.Windows.Forms.GroupBox(); + this.passed3zLabel = new System.Windows.Forms.Label(); + this.error3zLabel = new System.Windows.Forms.Label(); + this.label57 = new System.Windows.Forms.Label(); + this.volume3zLabel = new System.Windows.Forms.Label(); + this.label61 = new System.Windows.Forms.Label(); + this.pumpPctTextBox = new System.Windows.Forms.TextBox(); + this.meter1Label = new System.Windows.Forms.Label(); + this.meter2Label = new System.Windows.Forms.Label(); + this.meter3Label = new System.Windows.Forms.Label(); + this.meter4Label = new System.Windows.Forms.Label(); + this.meter5Label = new System.Windows.Forms.Label(); + this.meter6Label = new System.Windows.Forms.Label(); + this.meter12Label = new System.Windows.Forms.Label(); + this.meter11Label = new System.Windows.Forms.Label(); + this.meter10Label = new System.Windows.Forms.Label(); + this.meter9Label = new System.Windows.Forms.Label(); + this.meter8Label = new System.Windows.Forms.Label(); + this.meter7Label = new System.Windows.Forms.Label(); + this.passed12Label = new System.Windows.Forms.Label(); + this.passed11Label = new System.Windows.Forms.Label(); + this.error12Label = new System.Windows.Forms.Label(); + this.passed10Label = new System.Windows.Forms.Label(); + this.error11Label = new System.Windows.Forms.Label(); + this.volume12Label = new System.Windows.Forms.Label(); + this.passed9Label = new System.Windows.Forms.Label(); + this.error10Label = new System.Windows.Forms.Label(); + this.volume11Label = new System.Windows.Forms.Label(); + this.passed8Label = new System.Windows.Forms.Label(); + this.refPulses12Label = new System.Windows.Forms.Label(); + this.error9Label = new System.Windows.Forms.Label(); + this.pulses12Label = new System.Windows.Forms.Label(); + this.sensor12Label = new System.Windows.Forms.Label(); + this.volume10Label = new System.Windows.Forms.Label(); + this.passed7Label = new System.Windows.Forms.Label(); + this.refPulses11Label = new System.Windows.Forms.Label(); + this.pulses11Label = new System.Windows.Forms.Label(); + this.error8Label = new System.Windows.Forms.Label(); + this.sensor11Label = new System.Windows.Forms.Label(); + this.volume9Label = new System.Windows.Forms.Label(); + this.refPulses10Label = new System.Windows.Forms.Label(); + this.pulses10Label = new System.Windows.Forms.Label(); + this.volume8Label = new System.Windows.Forms.Label(); + this.sensor10Label = new System.Windows.Forms.Label(); + this.error7Label = new System.Windows.Forms.Label(); + this.refPulses9Label = new System.Windows.Forms.Label(); + this.volume7Label = new System.Windows.Forms.Label(); + this.pulses9Label = new System.Windows.Forms.Label(); + this.sensor9Label = new System.Windows.Forms.Label(); + this.refPulses7Label = new System.Windows.Forms.Label(); + this.refPulses8Label = new System.Windows.Forms.Label(); + this.pulses8Label = new System.Windows.Forms.Label(); + this.pulses7Label = new System.Windows.Forms.Label(); + this.sensor8Label = new System.Windows.Forms.Label(); + this.sensor7Label = new System.Windows.Forms.Label(); + this.meter24Label = new System.Windows.Forms.Label(); + this.meter23Label = new System.Windows.Forms.Label(); + this.meter22Label = new System.Windows.Forms.Label(); + this.meter21Label = new System.Windows.Forms.Label(); + this.meter20Label = new System.Windows.Forms.Label(); + this.meter19Label = new System.Windows.Forms.Label(); + this.passed24Label = new System.Windows.Forms.Label(); + this.passed23Label = new System.Windows.Forms.Label(); + this.error24Label = new System.Windows.Forms.Label(); + this.passed22Label = new System.Windows.Forms.Label(); + this.error23Label = new System.Windows.Forms.Label(); + this.volume24Label = new System.Windows.Forms.Label(); + this.passed21Label = new System.Windows.Forms.Label(); + this.error22Label = new System.Windows.Forms.Label(); + this.volume23Label = new System.Windows.Forms.Label(); + this.passed20Label = new System.Windows.Forms.Label(); + this.refPulses24Label = new System.Windows.Forms.Label(); + this.error21Label = new System.Windows.Forms.Label(); + this.pulses24Label = new System.Windows.Forms.Label(); + this.sensor24Label = new System.Windows.Forms.Label(); + this.volume22Label = new System.Windows.Forms.Label(); + this.passed19Label = new System.Windows.Forms.Label(); + this.refPulses23Label = new System.Windows.Forms.Label(); + this.pulses23Label = new System.Windows.Forms.Label(); + this.error20Label = new System.Windows.Forms.Label(); + this.sensor23Label = new System.Windows.Forms.Label(); + this.volume21Label = new System.Windows.Forms.Label(); + this.refPulses22Label = new System.Windows.Forms.Label(); + this.pulses22Label = new System.Windows.Forms.Label(); + this.volume20Label = new System.Windows.Forms.Label(); + this.sensor22Label = new System.Windows.Forms.Label(); + this.error19Label = new System.Windows.Forms.Label(); + this.refPulses21Label = new System.Windows.Forms.Label(); + this.volume19Label = new System.Windows.Forms.Label(); + this.pulses21Label = new System.Windows.Forms.Label(); + this.sensor21Label = new System.Windows.Forms.Label(); + this.refPulses19Label = new System.Windows.Forms.Label(); + this.refPulses20Label = new System.Windows.Forms.Label(); + this.pulses20Label = new System.Windows.Forms.Label(); + this.pulses19Label = new System.Windows.Forms.Label(); + this.sensor20Label = new System.Windows.Forms.Label(); + this.sensor19Label = new System.Windows.Forms.Label(); + this.meter18Label = new System.Windows.Forms.Label(); + this.meter17Label = new System.Windows.Forms.Label(); + this.meter16Label = new System.Windows.Forms.Label(); + this.meter15Label = new System.Windows.Forms.Label(); + this.meter14Label = new System.Windows.Forms.Label(); + this.meter13Label = new System.Windows.Forms.Label(); + this.passed18Label = new System.Windows.Forms.Label(); + this.passed17Label = new System.Windows.Forms.Label(); + this.error18Label = new System.Windows.Forms.Label(); + this.passed16Label = new System.Windows.Forms.Label(); + this.error17Label = new System.Windows.Forms.Label(); + this.volume18Label = new System.Windows.Forms.Label(); + this.passed15Label = new System.Windows.Forms.Label(); + this.error16Label = new System.Windows.Forms.Label(); + this.volume17Label = new System.Windows.Forms.Label(); + this.passed14Label = new System.Windows.Forms.Label(); + this.refPulses18Label = new System.Windows.Forms.Label(); + this.error15Label = new System.Windows.Forms.Label(); + this.pulses18Label = new System.Windows.Forms.Label(); + this.sensor18Label = new System.Windows.Forms.Label(); + this.volume16Label = new System.Windows.Forms.Label(); + this.passed13Label = new System.Windows.Forms.Label(); + this.refPulses17Label = new System.Windows.Forms.Label(); + this.pulses17Label = new System.Windows.Forms.Label(); + this.error14Label = new System.Windows.Forms.Label(); + this.sensor17Label = new System.Windows.Forms.Label(); + this.volume15Label = new System.Windows.Forms.Label(); + this.refPulses16Label = new System.Windows.Forms.Label(); + this.label104 = new System.Windows.Forms.Label(); + this.pulses16Label = new System.Windows.Forms.Label(); + this.volume14Label = new System.Windows.Forms.Label(); + this.sensor16Label = new System.Windows.Forms.Label(); + this.error13Label = new System.Windows.Forms.Label(); + this.refPulses15Label = new System.Windows.Forms.Label(); + this.volume13Label = new System.Windows.Forms.Label(); + this.pulses15Label = new System.Windows.Forms.Label(); + this.sensor15Label = new System.Windows.Forms.Label(); + this.refPulses13Label = new System.Windows.Forms.Label(); + this.refPulses14Label = new System.Windows.Forms.Label(); + this.pulses14Label = new System.Windows.Forms.Label(); + this.pulses13Label = new System.Windows.Forms.Label(); + this.sensor14Label = new System.Windows.Forms.Label(); + this.sensor13Label = new System.Windows.Forms.Label(); + this.label119 = new System.Windows.Forms.Label(); + this.label120 = new System.Windows.Forms.Label(); + this.label121 = new System.Windows.Forms.Label(); + this.label122 = new System.Windows.Forms.Label(); + this.meter40Label = new System.Windows.Forms.Label(); + this.meter39Label = new System.Windows.Forms.Label(); + this.passed40Label = new System.Windows.Forms.Label(); + this.passed39Label = new System.Windows.Forms.Label(); + this.error40Label = new System.Windows.Forms.Label(); + this.volume40Label = new System.Windows.Forms.Label(); + this.error39Label = new System.Windows.Forms.Label(); + this.volume39Label = new System.Windows.Forms.Label(); + this.refPulses39Label = new System.Windows.Forms.Label(); + this.refPulses40Label = new System.Windows.Forms.Label(); + this.pulses40Label = new System.Windows.Forms.Label(); + this.pulses39Label = new System.Windows.Forms.Label(); + this.sensor40Label = new System.Windows.Forms.Label(); + this.sensor39Label = new System.Windows.Forms.Label(); + this.meter38Label = new System.Windows.Forms.Label(); + this.meter37Label = new System.Windows.Forms.Label(); + this.meter36Label = new System.Windows.Forms.Label(); + this.meter35Label = new System.Windows.Forms.Label(); + this.meter34Label = new System.Windows.Forms.Label(); + this.meter33Label = new System.Windows.Forms.Label(); + this.passed38Label = new System.Windows.Forms.Label(); + this.passed37Label = new System.Windows.Forms.Label(); + this.error38Label = new System.Windows.Forms.Label(); + this.passed36Label = new System.Windows.Forms.Label(); + this.error37Label = new System.Windows.Forms.Label(); + this.volume38Label = new System.Windows.Forms.Label(); + this.passed35Label = new System.Windows.Forms.Label(); + this.error36Label = new System.Windows.Forms.Label(); + this.volume37Label = new System.Windows.Forms.Label(); + this.passed34Label = new System.Windows.Forms.Label(); + this.refPulses38Label = new System.Windows.Forms.Label(); + this.error35Label = new System.Windows.Forms.Label(); + this.pulses38Label = new System.Windows.Forms.Label(); + this.sensor38Label = new System.Windows.Forms.Label(); + this.volume36Label = new System.Windows.Forms.Label(); + this.passed33Label = new System.Windows.Forms.Label(); + this.refPulses37Label = new System.Windows.Forms.Label(); + this.pulses37Label = new System.Windows.Forms.Label(); + this.error34Label = new System.Windows.Forms.Label(); + this.sensor37Label = new System.Windows.Forms.Label(); + this.volume35Label = new System.Windows.Forms.Label(); + this.refPulses36Label = new System.Windows.Forms.Label(); + this.pulses36Label = new System.Windows.Forms.Label(); + this.volume34Label = new System.Windows.Forms.Label(); + this.sensor36Label = new System.Windows.Forms.Label(); + this.error33Label = new System.Windows.Forms.Label(); + this.refPulses35Label = new System.Windows.Forms.Label(); + this.volume33Label = new System.Windows.Forms.Label(); + this.pulses35Label = new System.Windows.Forms.Label(); + this.sensor35Label = new System.Windows.Forms.Label(); + this.refPulses33Label = new System.Windows.Forms.Label(); + this.refPulses34Label = new System.Windows.Forms.Label(); + this.pulses34Label = new System.Windows.Forms.Label(); + this.pulses33Label = new System.Windows.Forms.Label(); + this.sensor34Label = new System.Windows.Forms.Label(); + this.sensor33Label = new System.Windows.Forms.Label(); + this.meter32Label = new System.Windows.Forms.Label(); + this.meter31Label = new System.Windows.Forms.Label(); + this.meter30Label = new System.Windows.Forms.Label(); + this.meter29Label = new System.Windows.Forms.Label(); + this.meter28Label = new System.Windows.Forms.Label(); + this.meter27Label = new System.Windows.Forms.Label(); + this.passed32Label = new System.Windows.Forms.Label(); + this.passed31Label = new System.Windows.Forms.Label(); + this.error32Label = new System.Windows.Forms.Label(); + this.passed30Label = new System.Windows.Forms.Label(); + this.error31Label = new System.Windows.Forms.Label(); + this.volume32Label = new System.Windows.Forms.Label(); + this.passed29Label = new System.Windows.Forms.Label(); + this.error30Label = new System.Windows.Forms.Label(); + this.volume31Label = new System.Windows.Forms.Label(); + this.passed28Label = new System.Windows.Forms.Label(); + this.refPulses32Label = new System.Windows.Forms.Label(); + this.error29Label = new System.Windows.Forms.Label(); + this.pulses32Label = new System.Windows.Forms.Label(); + this.sensor32Label = new System.Windows.Forms.Label(); + this.volume30Label = new System.Windows.Forms.Label(); + this.passed27Label = new System.Windows.Forms.Label(); + this.refPulses31Label = new System.Windows.Forms.Label(); + this.pulses31Label = new System.Windows.Forms.Label(); + this.error28Label = new System.Windows.Forms.Label(); + this.sensor31Label = new System.Windows.Forms.Label(); + this.volume29Label = new System.Windows.Forms.Label(); + this.refPulses30Label = new System.Windows.Forms.Label(); + this.pulses30Label = new System.Windows.Forms.Label(); + this.volume28Label = new System.Windows.Forms.Label(); + this.sensor30Label = new System.Windows.Forms.Label(); + this.error27Label = new System.Windows.Forms.Label(); + this.refPulses29Label = new System.Windows.Forms.Label(); + this.volume27Label = new System.Windows.Forms.Label(); + this.pulses29Label = new System.Windows.Forms.Label(); + this.sensor29Label = new System.Windows.Forms.Label(); + this.refPulses27Label = new System.Windows.Forms.Label(); + this.refPulses28Label = new System.Windows.Forms.Label(); + this.pulses28Label = new System.Windows.Forms.Label(); + this.pulses27Label = new System.Windows.Forms.Label(); + this.sensor28Label = new System.Windows.Forms.Label(); + this.sensor27Label = new System.Windows.Forms.Label(); + this.meter26Label = new System.Windows.Forms.Label(); + this.meter25Label = new System.Windows.Forms.Label(); + this.passed26Label = new System.Windows.Forms.Label(); + this.passed25Label = new System.Windows.Forms.Label(); + this.error26Label = new System.Windows.Forms.Label(); + this.error25Label = new System.Windows.Forms.Label(); + this.volume26Label = new System.Windows.Forms.Label(); + this.volume25Label = new System.Windows.Forms.Label(); + this.refPulses26Label = new System.Windows.Forms.Label(); + this.pulses26Label = new System.Windows.Forms.Label(); + this.sensor26Label = new System.Windows.Forms.Label(); + this.refPulses25Label = new System.Windows.Forms.Label(); + this.pulses25Label = new System.Windows.Forms.Label(); + this.sensor25Label = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.reservoirPictureBox)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pumpPictureBox)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox3)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox4)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox5)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox6)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.flowMeterPictureBox)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox1z)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox2z)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox3z)).BeginInit(); + this.groupBox1z.SuspendLayout(); + this.groupBox2z.SuspendLayout(); + this.groupBox3z.SuspendLayout(); + this.SuspendLayout(); + // + // sensor1Label + // + this.sensor1Label.AutoSize = true; + this.sensor1Label.Location = new System.Drawing.Point(64, 542); + this.sensor1Label.Name = "sensor1Label"; + this.sensor1Label.Size = new System.Drawing.Size(44, 13); + this.sensor1Label.TabIndex = 0; + this.sensor1Label.Text = "sensor1"; + this.sensor1Label.Visible = false; + // + // pulses1Label + // + this.pulses1Label.AutoSize = true; + this.pulses1Label.Location = new System.Drawing.Point(64, 560); + this.pulses1Label.Name = "pulses1Label"; + this.pulses1Label.Size = new System.Drawing.Size(43, 13); + this.pulses1Label.TabIndex = 1; + this.pulses1Label.Text = "pulses1"; + this.pulses1Label.Visible = false; + // + // refPulses1Label + // + this.refPulses1Label.AutoSize = true; + this.refPulses1Label.Location = new System.Drawing.Point(64, 579); + this.refPulses1Label.Name = "refPulses1Label"; + this.refPulses1Label.Size = new System.Drawing.Size(56, 13); + this.refPulses1Label.TabIndex = 2; + this.refPulses1Label.Text = "refPulses1"; + this.refPulses1Label.Visible = false; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(23, 560); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(38, 13); + this.label1.TabIndex = 3; + this.label1.Text = "Count:"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(1, 579); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(60, 13); + this.label2.TabIndex = 4; + this.label2.Text = "Ref. count:"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(16, 597); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(45, 13); + this.label3.TabIndex = 5; + this.label3.Text = "Volume:"; + // + // volume1Label + // + this.volume1Label.AutoSize = true; + this.volume1Label.Location = new System.Drawing.Point(64, 597); + this.volume1Label.Name = "volume1Label"; + this.volume1Label.Size = new System.Drawing.Size(47, 13); + this.volume1Label.TabIndex = 6; + this.volume1Label.Text = "volume1"; + this.volume1Label.Visible = false; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(12, 616); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(49, 13); + this.label4.TabIndex = 7; + this.label4.Text = "Error [%]:"; + // + // error1Label + // + this.error1Label.AutoSize = true; + this.error1Label.Location = new System.Drawing.Point(64, 616); + this.error1Label.Name = "error1Label"; + this.error1Label.Size = new System.Drawing.Size(34, 13); + this.error1Label.TabIndex = 8; + this.error1Label.Text = "error1"; + this.error1Label.Visible = false; + // + // passed1Label + // + this.passed1Label.AutoSize = true; + this.passed1Label.Location = new System.Drawing.Point(64, 634); + this.passed1Label.Name = "passed1Label"; + this.passed1Label.Size = new System.Drawing.Size(47, 13); + this.passed1Label.TabIndex = 9; + this.passed1Label.Text = "passed1"; + this.passed1Label.Visible = false; + // + // label35 + // + this.label35.AutoSize = true; + this.label35.Location = new System.Drawing.Point(18, 542); + this.label35.Name = "label35"; + this.label35.Size = new System.Drawing.Size(43, 13); + this.label35.TabIndex = 10; + this.label35.Text = "Sensor:"; + // + // passed2Label + // + this.passed2Label.AutoSize = true; + this.passed2Label.Location = new System.Drawing.Point(134, 634); + this.passed2Label.Name = "passed2Label"; + this.passed2Label.Size = new System.Drawing.Size(47, 13); + this.passed2Label.TabIndex = 9; + this.passed2Label.Text = "passed2"; + this.passed2Label.Visible = false; + // + // error2Label + // + this.error2Label.AutoSize = true; + this.error2Label.Location = new System.Drawing.Point(134, 616); + this.error2Label.Name = "error2Label"; + this.error2Label.Size = new System.Drawing.Size(34, 13); + this.error2Label.TabIndex = 8; + this.error2Label.Text = "error2"; + this.error2Label.Visible = false; + // + // volume2Label + // + this.volume2Label.AutoSize = true; + this.volume2Label.Location = new System.Drawing.Point(134, 597); + this.volume2Label.Name = "volume2Label"; + this.volume2Label.Size = new System.Drawing.Size(47, 13); + this.volume2Label.TabIndex = 6; + this.volume2Label.Text = "volume2"; + this.volume2Label.Visible = false; + // + // refPulses2Label + // + this.refPulses2Label.AutoSize = true; + this.refPulses2Label.Location = new System.Drawing.Point(134, 579); + this.refPulses2Label.Name = "refPulses2Label"; + this.refPulses2Label.Size = new System.Drawing.Size(56, 13); + this.refPulses2Label.TabIndex = 2; + this.refPulses2Label.Text = "refPulses2"; + this.refPulses2Label.Visible = false; + // + // pulses2Label + // + this.pulses2Label.AutoSize = true; + this.pulses2Label.Location = new System.Drawing.Point(134, 560); + this.pulses2Label.Name = "pulses2Label"; + this.pulses2Label.Size = new System.Drawing.Size(43, 13); + this.pulses2Label.TabIndex = 1; + this.pulses2Label.Text = "pulses2"; + this.pulses2Label.Visible = false; + // + // sensor2Label + // + this.sensor2Label.AutoSize = true; + this.sensor2Label.Location = new System.Drawing.Point(134, 542); + this.sensor2Label.Name = "sensor2Label"; + this.sensor2Label.Size = new System.Drawing.Size(44, 13); + this.sensor2Label.TabIndex = 0; + this.sensor2Label.Text = "sensor2"; + this.sensor2Label.Visible = false; + // + // passed3Label + // + this.passed3Label.AutoSize = true; + this.passed3Label.Location = new System.Drawing.Point(204, 634); + this.passed3Label.Name = "passed3Label"; + this.passed3Label.Size = new System.Drawing.Size(47, 13); + this.passed3Label.TabIndex = 9; + this.passed3Label.Text = "passed3"; + this.passed3Label.Visible = false; + // + // error3Label + // + this.error3Label.AutoSize = true; + this.error3Label.Location = new System.Drawing.Point(204, 616); + this.error3Label.Name = "error3Label"; + this.error3Label.Size = new System.Drawing.Size(34, 13); + this.error3Label.TabIndex = 8; + this.error3Label.Text = "error3"; + this.error3Label.Visible = false; + // + // volume3Label + // + this.volume3Label.AutoSize = true; + this.volume3Label.Location = new System.Drawing.Point(204, 597); + this.volume3Label.Name = "volume3Label"; + this.volume3Label.Size = new System.Drawing.Size(47, 13); + this.volume3Label.TabIndex = 6; + this.volume3Label.Text = "volume3"; + this.volume3Label.Visible = false; + // + // refPulses3Label + // + this.refPulses3Label.AutoSize = true; + this.refPulses3Label.Location = new System.Drawing.Point(204, 579); + this.refPulses3Label.Name = "refPulses3Label"; + this.refPulses3Label.Size = new System.Drawing.Size(56, 13); + this.refPulses3Label.TabIndex = 2; + this.refPulses3Label.Text = "refPulses3"; + this.refPulses3Label.Visible = false; + // + // pulses3Label + // + this.pulses3Label.AutoSize = true; + this.pulses3Label.Location = new System.Drawing.Point(204, 560); + this.pulses3Label.Name = "pulses3Label"; + this.pulses3Label.Size = new System.Drawing.Size(43, 13); + this.pulses3Label.TabIndex = 1; + this.pulses3Label.Text = "pulses3"; + this.pulses3Label.Visible = false; + // + // sensor3Label + // + this.sensor3Label.AutoSize = true; + this.sensor3Label.Location = new System.Drawing.Point(204, 542); + this.sensor3Label.Name = "sensor3Label"; + this.sensor3Label.Size = new System.Drawing.Size(44, 13); + this.sensor3Label.TabIndex = 0; + this.sensor3Label.Text = "sensor3"; + this.sensor3Label.Visible = false; + // + // label13 + // + this.label13.AutoSize = true; + this.label13.Location = new System.Drawing.Point(60, 129); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(52, 13); + this.label13.TabIndex = 13; + this.label13.Text = "T up [°C]:"; + // + // label14 + // + this.label14.AutoSize = true; + this.label14.Location = new System.Drawing.Point(53, 91); + this.label14.Name = "label14"; + this.label14.Size = new System.Drawing.Size(59, 13); + this.label14.TabIndex = 14; + this.label14.Text = "Pr up [bar]:"; + // + // tInLabel + // + this.tInLabel.AutoSize = true; + this.tInLabel.Location = new System.Drawing.Point(121, 129); + this.tInLabel.Name = "tInLabel"; + this.tInLabel.Size = new System.Drawing.Size(19, 13); + this.tInLabel.TabIndex = 15; + this.tInLabel.Text = "tIn"; + // + // prInLabel + // + this.prInLabel.AutoSize = true; + this.prInLabel.Location = new System.Drawing.Point(121, 91); + this.prInLabel.Name = "prInLabel"; + this.prInLabel.Size = new System.Drawing.Size(25, 13); + this.prInLabel.TabIndex = 16; + this.prInLabel.Text = "prIn"; + // + // prOutLabel + // + this.prOutLabel.AutoSize = true; + this.prOutLabel.Location = new System.Drawing.Point(578, 91); + this.prOutLabel.Name = "prOutLabel"; + this.prOutLabel.Size = new System.Drawing.Size(33, 13); + this.prOutLabel.TabIndex = 20; + this.prOutLabel.Text = "prOut"; + // + // tOutLabel + // + this.tOutLabel.AutoSize = true; + this.tOutLabel.Location = new System.Drawing.Point(578, 129); + this.tOutLabel.Name = "tOutLabel"; + this.tOutLabel.Size = new System.Drawing.Size(27, 13); + this.tOutLabel.TabIndex = 19; + this.tOutLabel.Text = "tOut"; + // + // label17 + // + this.label17.AutoSize = true; + this.label17.Location = new System.Drawing.Point(497, 91); + this.label17.Name = "label17"; + this.label17.Size = new System.Drawing.Size(73, 13); + this.label17.TabIndex = 18; + this.label17.Text = "Pr down [bar]:"; + // + // label18 + // + this.label18.AutoSize = true; + this.label18.Location = new System.Drawing.Point(504, 129); + this.label18.Name = "label18"; + this.label18.Size = new System.Drawing.Size(66, 13); + this.label18.TabIndex = 17; + this.label18.Text = "T down [°C]:"; + // + // label15 + // + this.label15.AutoSize = true; + this.label15.Location = new System.Drawing.Point(697, 114); + this.label15.Name = "label15"; + this.label15.Size = new System.Drawing.Size(86, 13); + this.label15.TabIndex = 21; + this.label15.Text = "Ref. flow [m3/h]:"; + // + // tInCmpntLabel + // + this.tInCmpntLabel.AutoSize = true; + this.tInCmpntLabel.Location = new System.Drawing.Point(121, 113); + this.tInCmpntLabel.Name = "tInCmpntLabel"; + this.tInCmpntLabel.Size = new System.Drawing.Size(49, 13); + this.tInCmpntLabel.TabIndex = 22; + this.tInCmpntLabel.Text = "tInCmpnt"; + // + // tOutCmpntLabel + // + this.tOutCmpntLabel.AutoSize = true; + this.tOutCmpntLabel.Location = new System.Drawing.Point(578, 113); + this.tOutCmpntLabel.Name = "tOutCmpntLabel"; + this.tOutCmpntLabel.Size = new System.Drawing.Size(57, 13); + this.tOutCmpntLabel.TabIndex = 23; + this.tOutCmpntLabel.Text = "tOutCmpnt"; + // + // prOutCmpntLabel + // + this.prOutCmpntLabel.AutoSize = true; + this.prOutCmpntLabel.Location = new System.Drawing.Point(578, 75); + this.prOutCmpntLabel.Name = "prOutCmpntLabel"; + this.prOutCmpntLabel.Size = new System.Drawing.Size(63, 13); + this.prOutCmpntLabel.TabIndex = 24; + this.prOutCmpntLabel.Text = "prOutCmpnt"; + // + // prInCmpntLabel + // + this.prInCmpntLabel.AutoSize = true; + this.prInCmpntLabel.Location = new System.Drawing.Point(121, 75); + this.prInCmpntLabel.Name = "prInCmpntLabel"; + this.prInCmpntLabel.Size = new System.Drawing.Size(55, 13); + this.prInCmpntLabel.TabIndex = 25; + this.prInCmpntLabel.Text = "prInCmpnt"; + // + // refFlowLabel + // + this.refFlowLabel.AutoSize = true; + this.refFlowLabel.Location = new System.Drawing.Point(790, 114); + this.refFlowLabel.Name = "refFlowLabel"; + this.refFlowLabel.Size = new System.Drawing.Size(41, 13); + this.refFlowLabel.TabIndex = 26; + this.refFlowLabel.Text = "refFlow"; + // + // label16 + // + this.label16.AutoSize = true; + this.label16.Location = new System.Drawing.Point(707, 95); + this.label16.Name = "label16"; + this.label16.Size = new System.Drawing.Size(76, 13); + this.label16.TabIndex = 27; + this.label16.Text = "Ref. freq. [Hz]:"; + // + // refFreqLabel + // + this.refFreqLabel.AutoSize = true; + this.refFreqLabel.Location = new System.Drawing.Point(790, 95); + this.refFreqLabel.Name = "refFreqLabel"; + this.refFreqLabel.Size = new System.Drawing.Size(40, 13); + this.refFreqLabel.TabIndex = 28; + this.refFreqLabel.Text = "refFreq"; + // + // label19 + // + this.label19.AutoSize = true; + this.label19.Location = new System.Drawing.Point(723, 77); + this.label19.Name = "label19"; + this.label19.Size = new System.Drawing.Size(60, 13); + this.label19.TabIndex = 29; + this.label19.Text = "Ref. count:"; + // + // refPulsesLabel + // + this.refPulsesLabel.AutoSize = true; + this.refPulsesLabel.Location = new System.Drawing.Point(790, 77); + this.refPulsesLabel.Name = "refPulsesLabel"; + this.refPulsesLabel.Size = new System.Drawing.Size(50, 13); + this.refPulsesLabel.TabIndex = 30; + this.refPulsesLabel.Text = "refPulses"; + // + // refFlowCmpntLabel + // + this.refFlowCmpntLabel.AutoSize = true; + this.refFlowCmpntLabel.Location = new System.Drawing.Point(790, 59); + this.refFlowCmpntLabel.Name = "refFlowCmpntLabel"; + this.refFlowCmpntLabel.Size = new System.Drawing.Size(71, 13); + this.refFlowCmpntLabel.TabIndex = 31; + this.refFlowCmpntLabel.Text = "refFlowCmpnt"; + // + // regValveCmpntLabel + // + this.regValveCmpntLabel.AutoSize = true; + this.regValveCmpntLabel.Location = new System.Drawing.Point(790, 12); + this.regValveCmpntLabel.Name = "regValveCmpntLabel"; + this.regValveCmpntLabel.Size = new System.Drawing.Size(79, 13); + this.regValveCmpntLabel.TabIndex = 34; + this.regValveCmpntLabel.Text = "regValveCmpnt"; + // + // regValvePosLabel + // + this.regValvePosLabel.AutoSize = true; + this.regValvePosLabel.Location = new System.Drawing.Point(790, 30); + this.regValvePosLabel.Name = "regValvePosLabel"; + this.regValvePosLabel.Size = new System.Drawing.Size(67, 13); + this.regValvePosLabel.TabIndex = 35; + this.regValvePosLabel.Text = "regValvePos"; + // + // label21 + // + this.label21.AutoSize = true; + this.label21.Location = new System.Drawing.Point(701, 30); + this.label21.Name = "label21"; + this.label21.Size = new System.Drawing.Size(85, 13); + this.label21.TabIndex = 36; + this.label21.Text = "Reg. valve pos.:"; + // + // tDivCmpntLabel + // + this.tDivCmpntLabel.AutoSize = true; + this.tDivCmpntLabel.Location = new System.Drawing.Point(578, 12); + this.tDivCmpntLabel.Name = "tDivCmpntLabel"; + this.tDivCmpntLabel.Size = new System.Drawing.Size(56, 13); + this.tDivCmpntLabel.TabIndex = 39; + this.tDivCmpntLabel.Text = "tDivCmpnt"; + // + // tDivLabel + // + this.tDivLabel.AutoSize = true; + this.tDivLabel.Location = new System.Drawing.Point(578, 30); + this.tDivLabel.Name = "tDivLabel"; + this.tDivLabel.Size = new System.Drawing.Size(26, 13); + this.tDivLabel.TabIndex = 38; + this.tDivLabel.Text = "tDiv"; + // + // label24 + // + this.label24.AutoSize = true; + this.label24.Location = new System.Drawing.Point(516, 29); + this.label24.Name = "label24"; + this.label24.Size = new System.Drawing.Size(54, 13); + this.label24.TabIndex = 37; + this.label24.Text = "T div [°C]:"; + // + // scaleCmpntLabel + // + this.scaleCmpntLabel.AutoSize = true; + this.scaleCmpntLabel.Location = new System.Drawing.Point(1115, 61); + this.scaleCmpntLabel.Name = "scaleCmpntLabel"; + this.scaleCmpntLabel.Size = new System.Drawing.Size(62, 13); + this.scaleCmpntLabel.TabIndex = 40; + this.scaleCmpntLabel.Text = "scaleCmpnt"; + // + // label22 + // + this.label22.AutoSize = true; + this.label22.Location = new System.Drawing.Point(1055, 82); + this.label22.Name = "label22"; + this.label22.Size = new System.Drawing.Size(56, 13); + this.label22.TabIndex = 41; + this.label22.Text = "Mass [kg]:"; + // + // massLabel + // + this.massLabel.AutoSize = true; + this.massLabel.Location = new System.Drawing.Point(1115, 82); + this.massLabel.Name = "massLabel"; + this.massLabel.Size = new System.Drawing.Size(31, 13); + this.massLabel.TabIndex = 42; + this.massLabel.Text = "mass"; + // + // label23 + // + this.label23.AutoSize = true; + this.label23.Location = new System.Drawing.Point(1035, 102); + this.label23.Name = "label23"; + this.label23.Size = new System.Drawing.Size(76, 13); + this.label23.TabIndex = 43; + this.label23.Text = "Mass diff. [kg]:"; + // + // massDiffLabel + // + this.massDiffLabel.AutoSize = true; + this.massDiffLabel.Location = new System.Drawing.Point(1115, 102); + this.massDiffLabel.Name = "massDiffLabel"; + this.massDiffLabel.Size = new System.Drawing.Size(47, 13); + this.massDiffLabel.TabIndex = 44; + this.massDiffLabel.Text = "massDiff"; + // + // label25 + // + this.label25.AutoSize = true; + this.label25.Location = new System.Drawing.Point(709, 133); + this.label25.Name = "label25"; + this.label25.Size = new System.Drawing.Size(78, 13); + this.label25.TabIndex = 45; + this.label25.Text = "Ref. volume [l]:"; + // + // refVolumeLabel + // + this.refVolumeLabel.AutoSize = true; + this.refVolumeLabel.Location = new System.Drawing.Point(790, 133); + this.refVolumeLabel.Name = "refVolumeLabel"; + this.refVolumeLabel.Size = new System.Drawing.Size(54, 13); + this.refVolumeLabel.TabIndex = 46; + this.refVolumeLabel.Text = "refVolume"; + // + // label26 + // + this.label26.AutoSize = true; + this.label26.Location = new System.Drawing.Point(1055, 123); + this.label26.Name = "label26"; + this.label26.Size = new System.Drawing.Size(56, 13); + this.label26.TabIndex = 47; + this.label26.Text = "Volume [l]:"; + // + // volumeCtvLabel + // + this.volumeCtvLabel.AutoSize = true; + this.volumeCtvLabel.Location = new System.Drawing.Point(1115, 123); + this.volumeCtvLabel.Name = "volumeCtvLabel"; + this.volumeCtvLabel.Size = new System.Drawing.Size(57, 13); + this.volumeCtvLabel.TabIndex = 48; + this.volumeCtvLabel.Text = "volumeCtv"; + // + // label27 + // + this.label27.AutoSize = true; + this.label27.Location = new System.Drawing.Point(1040, 145); + this.label27.Name = "label27"; + this.label27.Size = new System.Drawing.Size(71, 13); + this.label27.TabIndex = 49; + this.label27.Text = "Ref. error [%]:"; + // + // refErrorLabel + // + this.refErrorLabel.AutoSize = true; + this.refErrorLabel.Location = new System.Drawing.Point(1115, 145); + this.refErrorLabel.Name = "refErrorLabel"; + this.refErrorLabel.Size = new System.Drawing.Size(41, 13); + this.refErrorLabel.TabIndex = 50; + this.refErrorLabel.Text = "refError"; + // + // label28 + // + this.label28.AutoSize = true; + this.label28.Location = new System.Drawing.Point(236, 12); + this.label28.Name = "label28"; + this.label28.Size = new System.Drawing.Size(116, 13); + this.label28.TabIndex = 51; + this.label28.Text = "Target flow low [m3/h]:"; + // + // label29 + // + this.label29.AutoSize = true; + this.label29.Location = new System.Drawing.Point(232, 32); + this.label29.Name = "label29"; + this.label29.Size = new System.Drawing.Size(120, 13); + this.label29.TabIndex = 52; + this.label29.Text = "Target flow high [m3/h]:"; + // + // label20 + // + this.label20.AutoSize = true; + this.label20.Location = new System.Drawing.Point(263, 52); + this.label20.Name = "label20"; + this.label20.Size = new System.Drawing.Size(89, 13); + this.label20.TabIndex = 53; + this.label20.Text = "Target volume [l]:"; + // + // label30 + // + this.label30.AutoSize = true; + this.label30.Location = new System.Drawing.Point(260, 94); + this.label30.Name = "label30"; + this.label30.Size = new System.Drawing.Size(92, 13); + this.label30.TabIndex = 54; + this.label30.Text = "Estimated time [s]:"; + // + // targetFlowLowLabel + // + this.targetFlowLowLabel.AutoSize = true; + this.targetFlowLowLabel.Location = new System.Drawing.Point(355, 12); + this.targetFlowLowLabel.Name = "targetFlowLowLabel"; + this.targetFlowLowLabel.Size = new System.Drawing.Size(76, 13); + this.targetFlowLowLabel.TabIndex = 55; + this.targetFlowLowLabel.Text = "targetFlowLow"; + // + // targetFlowHighLabel + // + this.targetFlowHighLabel.AutoSize = true; + this.targetFlowHighLabel.Location = new System.Drawing.Point(355, 32); + this.targetFlowHighLabel.Name = "targetFlowHighLabel"; + this.targetFlowHighLabel.Size = new System.Drawing.Size(78, 13); + this.targetFlowHighLabel.TabIndex = 56; + this.targetFlowHighLabel.Text = "targetFlowHigh"; + // + // targetVolumeLabel + // + this.targetVolumeLabel.AutoSize = true; + this.targetVolumeLabel.Location = new System.Drawing.Point(355, 52); + this.targetVolumeLabel.Name = "targetVolumeLabel"; + this.targetVolumeLabel.Size = new System.Drawing.Size(69, 13); + this.targetVolumeLabel.TabIndex = 57; + this.targetVolumeLabel.Text = "targetVolume"; + // + // label31 + // + this.label31.AutoSize = true; + this.label31.Location = new System.Drawing.Point(263, 73); + this.label31.Name = "label31"; + this.label31.Size = new System.Drawing.Size(89, 13); + this.label31.TabIndex = 58; + this.label31.Text = "Target ref. count:"; + // + // targetRefCountLabel + // + this.targetRefCountLabel.AutoSize = true; + this.targetRefCountLabel.Location = new System.Drawing.Point(355, 73); + this.targetRefCountLabel.Name = "targetRefCountLabel"; + this.targetRefCountLabel.Size = new System.Drawing.Size(79, 13); + this.targetRefCountLabel.TabIndex = 59; + this.targetRefCountLabel.Text = "targetRefCount"; + // + // estmtdTimeLabel + // + this.estmtdTimeLabel.AutoSize = true; + this.estmtdTimeLabel.Location = new System.Drawing.Point(355, 94); + this.estmtdTimeLabel.Name = "estmtdTimeLabel"; + this.estmtdTimeLabel.Size = new System.Drawing.Size(61, 13); + this.estmtdTimeLabel.TabIndex = 60; + this.estmtdTimeLabel.Text = "estmtdTime"; + // + // label32 + // + this.label32.AutoSize = true; + this.label32.Location = new System.Drawing.Point(11, 12); + this.label32.Name = "label32"; + this.label32.Size = new System.Drawing.Size(101, 13); + this.label32.TabIndex = 61; + this.label32.Text = "Air temperature [°C]:"; + // + // label33 + // + this.label33.AutoSize = true; + this.label33.Location = new System.Drawing.Point(14, 29); + this.label33.Name = "label33"; + this.label33.Size = new System.Drawing.Size(98, 13); + this.label33.TabIndex = 62; + this.label33.Text = "Air pressure [mBar]:"; + // + // label34 + // + this.label34.AutoSize = true; + this.label34.Location = new System.Drawing.Point(32, 46); + this.label34.Name = "label34"; + this.label34.Size = new System.Drawing.Size(80, 13); + this.label34.TabIndex = 63; + this.label34.Text = "Air humidity [%]:"; + // + // airTempLabel + // + this.airTempLabel.AutoSize = true; + this.airTempLabel.Location = new System.Drawing.Point(121, 12); + this.airTempLabel.Name = "airTempLabel"; + this.airTempLabel.Size = new System.Drawing.Size(45, 13); + this.airTempLabel.TabIndex = 64; + this.airTempLabel.Text = "airTemp"; + // + // airPressLabel + // + this.airPressLabel.AutoSize = true; + this.airPressLabel.Location = new System.Drawing.Point(121, 29); + this.airPressLabel.Name = "airPressLabel"; + this.airPressLabel.Size = new System.Drawing.Size(44, 13); + this.airPressLabel.TabIndex = 65; + this.airPressLabel.Text = "airPress"; + // + // airHumiLabel + // + this.airHumiLabel.AutoSize = true; + this.airHumiLabel.Location = new System.Drawing.Point(121, 46); + this.airHumiLabel.Name = "airHumiLabel"; + this.airHumiLabel.Size = new System.Drawing.Size(42, 13); + this.airHumiLabel.TabIndex = 66; + this.airHumiLabel.Text = "airHumi"; + // + // reservoirPictureBox + // + this.reservoirPictureBox.Image = ((System.Drawing.Image)(resources.GetObject("reservoirPictureBox.Image"))); + this.reservoirPictureBox.Location = new System.Drawing.Point(880, 406); + this.reservoirPictureBox.Name = "reservoirPictureBox"; + this.reservoirPictureBox.Size = new System.Drawing.Size(142, 109); + this.reservoirPictureBox.TabIndex = 67; + this.reservoirPictureBox.TabStop = false; + // + // pumpPictureBox + // + this.pumpPictureBox.Image = ((System.Drawing.Image)(resources.GetObject("pumpPictureBox.Image"))); + this.pumpPictureBox.Location = new System.Drawing.Point(779, 478); + this.pumpPictureBox.Name = "pumpPictureBox"; + this.pumpPictureBox.Size = new System.Drawing.Size(38, 38); + this.pumpPictureBox.TabIndex = 68; + this.pumpPictureBox.TabStop = false; + // + // watermeterPictureBox1 + // + this.watermeterPictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("watermeterPictureBox1.Image"))); + this.watermeterPictureBox1.Location = new System.Drawing.Point(66, 371); + this.watermeterPictureBox1.Name = "watermeterPictureBox1"; + this.watermeterPictureBox1.Size = new System.Drawing.Size(38, 30); + this.watermeterPictureBox1.TabIndex = 69; + this.watermeterPictureBox1.TabStop = false; + // + // watermeterPictureBox2 + // + this.watermeterPictureBox2.Image = ((System.Drawing.Image)(resources.GetObject("watermeterPictureBox2.Image"))); + this.watermeterPictureBox2.Location = new System.Drawing.Point(207, 371); + this.watermeterPictureBox2.Name = "watermeterPictureBox2"; + this.watermeterPictureBox2.Size = new System.Drawing.Size(38, 30); + this.watermeterPictureBox2.TabIndex = 70; + this.watermeterPictureBox2.TabStop = false; + // + // watermeterPictureBox3 + // + this.watermeterPictureBox3.Image = ((System.Drawing.Image)(resources.GetObject("watermeterPictureBox3.Image"))); + this.watermeterPictureBox3.Location = new System.Drawing.Point(350, 371); + this.watermeterPictureBox3.Name = "watermeterPictureBox3"; + this.watermeterPictureBox3.Size = new System.Drawing.Size(38, 30); + this.watermeterPictureBox3.TabIndex = 71; + this.watermeterPictureBox3.TabStop = false; + // + // watermeterPictureBox4 + // + this.watermeterPictureBox4.Image = ((System.Drawing.Image)(resources.GetObject("watermeterPictureBox4.Image"))); + this.watermeterPictureBox4.Location = new System.Drawing.Point(491, 371); + this.watermeterPictureBox4.Name = "watermeterPictureBox4"; + this.watermeterPictureBox4.Size = new System.Drawing.Size(38, 30); + this.watermeterPictureBox4.TabIndex = 73; + this.watermeterPictureBox4.TabStop = false; + // + // passed4Label + // + this.passed4Label.AutoSize = true; + this.passed4Label.Location = new System.Drawing.Point(273, 634); + this.passed4Label.Name = "passed4Label"; + this.passed4Label.Size = new System.Drawing.Size(47, 13); + this.passed4Label.TabIndex = 9; + this.passed4Label.Text = "passed4"; + this.passed4Label.Visible = false; + // + // error4Label + // + this.error4Label.AutoSize = true; + this.error4Label.Location = new System.Drawing.Point(273, 616); + this.error4Label.Name = "error4Label"; + this.error4Label.Size = new System.Drawing.Size(34, 13); + this.error4Label.TabIndex = 8; + this.error4Label.Text = "error4"; + this.error4Label.Visible = false; + // + // volume4Label + // + this.volume4Label.AutoSize = true; + this.volume4Label.Location = new System.Drawing.Point(273, 597); + this.volume4Label.Name = "volume4Label"; + this.volume4Label.Size = new System.Drawing.Size(47, 13); + this.volume4Label.TabIndex = 6; + this.volume4Label.Text = "volume4"; + this.volume4Label.Visible = false; + // + // refPulses4Label + // + this.refPulses4Label.AutoSize = true; + this.refPulses4Label.Location = new System.Drawing.Point(273, 579); + this.refPulses4Label.Name = "refPulses4Label"; + this.refPulses4Label.Size = new System.Drawing.Size(56, 13); + this.refPulses4Label.TabIndex = 2; + this.refPulses4Label.Text = "refPulses4"; + this.refPulses4Label.Visible = false; + // + // pulses4Label + // + this.pulses4Label.AutoSize = true; + this.pulses4Label.Location = new System.Drawing.Point(273, 560); + this.pulses4Label.Name = "pulses4Label"; + this.pulses4Label.Size = new System.Drawing.Size(43, 13); + this.pulses4Label.TabIndex = 1; + this.pulses4Label.Text = "pulses4"; + this.pulses4Label.Visible = false; + // + // sensor4Label + // + this.sensor4Label.AutoSize = true; + this.sensor4Label.Location = new System.Drawing.Point(273, 542); + this.sensor4Label.Name = "sensor4Label"; + this.sensor4Label.Size = new System.Drawing.Size(44, 13); + this.sensor4Label.TabIndex = 0; + this.sensor4Label.Text = "sensor4"; + this.sensor4Label.Visible = false; + // + // watermeterPictureBox5 + // + this.watermeterPictureBox5.Image = ((System.Drawing.Image)(resources.GetObject("watermeterPictureBox5.Image"))); + this.watermeterPictureBox5.Location = new System.Drawing.Point(632, 371); + this.watermeterPictureBox5.Name = "watermeterPictureBox5"; + this.watermeterPictureBox5.Size = new System.Drawing.Size(38, 30); + this.watermeterPictureBox5.TabIndex = 75; + this.watermeterPictureBox5.TabStop = false; + // + // passed5Label + // + this.passed5Label.AutoSize = true; + this.passed5Label.Location = new System.Drawing.Point(344, 634); + this.passed5Label.Name = "passed5Label"; + this.passed5Label.Size = new System.Drawing.Size(47, 13); + this.passed5Label.TabIndex = 9; + this.passed5Label.Text = "passed5"; + this.passed5Label.Visible = false; + // + // error5Label + // + this.error5Label.AutoSize = true; + this.error5Label.Location = new System.Drawing.Point(344, 616); + this.error5Label.Name = "error5Label"; + this.error5Label.Size = new System.Drawing.Size(34, 13); + this.error5Label.TabIndex = 8; + this.error5Label.Text = "error5"; + this.error5Label.Visible = false; + // + // volume5Label + // + this.volume5Label.AutoSize = true; + this.volume5Label.Location = new System.Drawing.Point(344, 597); + this.volume5Label.Name = "volume5Label"; + this.volume5Label.Size = new System.Drawing.Size(47, 13); + this.volume5Label.TabIndex = 6; + this.volume5Label.Text = "volume5"; + this.volume5Label.Visible = false; + // + // refPulses5Label + // + this.refPulses5Label.AutoSize = true; + this.refPulses5Label.Location = new System.Drawing.Point(344, 579); + this.refPulses5Label.Name = "refPulses5Label"; + this.refPulses5Label.Size = new System.Drawing.Size(56, 13); + this.refPulses5Label.TabIndex = 2; + this.refPulses5Label.Text = "refPulses5"; + this.refPulses5Label.Visible = false; + // + // pulses5Label + // + this.pulses5Label.AutoSize = true; + this.pulses5Label.Location = new System.Drawing.Point(344, 560); + this.pulses5Label.Name = "pulses5Label"; + this.pulses5Label.Size = new System.Drawing.Size(43, 13); + this.pulses5Label.TabIndex = 1; + this.pulses5Label.Text = "pulses5"; + this.pulses5Label.Visible = false; + // + // sensor5Label + // + this.sensor5Label.AutoSize = true; + this.sensor5Label.Location = new System.Drawing.Point(344, 542); + this.sensor5Label.Name = "sensor5Label"; + this.sensor5Label.Size = new System.Drawing.Size(44, 13); + this.sensor5Label.TabIndex = 0; + this.sensor5Label.Text = "sensor5"; + this.sensor5Label.Visible = false; + // + // watermeterPictureBox6 + // + this.watermeterPictureBox6.Image = ((System.Drawing.Image)(resources.GetObject("watermeterPictureBox6.Image"))); + this.watermeterPictureBox6.Location = new System.Drawing.Point(775, 371); + this.watermeterPictureBox6.Name = "watermeterPictureBox6"; + this.watermeterPictureBox6.Size = new System.Drawing.Size(38, 30); + this.watermeterPictureBox6.TabIndex = 77; + this.watermeterPictureBox6.TabStop = false; + // + // passed6Label + // + this.passed6Label.AutoSize = true; + this.passed6Label.Location = new System.Drawing.Point(414, 634); + this.passed6Label.Name = "passed6Label"; + this.passed6Label.Size = new System.Drawing.Size(47, 13); + this.passed6Label.TabIndex = 9; + this.passed6Label.Text = "passed6"; + this.passed6Label.Visible = false; + // + // error6Label + // + this.error6Label.AutoSize = true; + this.error6Label.Location = new System.Drawing.Point(414, 616); + this.error6Label.Name = "error6Label"; + this.error6Label.Size = new System.Drawing.Size(34, 13); + this.error6Label.TabIndex = 8; + this.error6Label.Text = "error6"; + this.error6Label.Visible = false; + // + // volume6Label + // + this.volume6Label.AutoSize = true; + this.volume6Label.Location = new System.Drawing.Point(414, 597); + this.volume6Label.Name = "volume6Label"; + this.volume6Label.Size = new System.Drawing.Size(47, 13); + this.volume6Label.TabIndex = 6; + this.volume6Label.Text = "volume6"; + this.volume6Label.Visible = false; + // + // refPulses6Label + // + this.refPulses6Label.AutoSize = true; + this.refPulses6Label.Location = new System.Drawing.Point(414, 579); + this.refPulses6Label.Name = "refPulses6Label"; + this.refPulses6Label.Size = new System.Drawing.Size(56, 13); + this.refPulses6Label.TabIndex = 2; + this.refPulses6Label.Text = "refPulses6"; + this.refPulses6Label.Visible = false; + // + // pulses6Label + // + this.pulses6Label.AutoSize = true; + this.pulses6Label.Location = new System.Drawing.Point(414, 560); + this.pulses6Label.Name = "pulses6Label"; + this.pulses6Label.Size = new System.Drawing.Size(43, 13); + this.pulses6Label.TabIndex = 1; + this.pulses6Label.Text = "pulses6"; + this.pulses6Label.Visible = false; + // + // sensor6Label + // + this.sensor6Label.AutoSize = true; + this.sensor6Label.Location = new System.Drawing.Point(414, 542); + this.sensor6Label.Name = "sensor6Label"; + this.sensor6Label.Size = new System.Drawing.Size(44, 13); + this.sensor6Label.TabIndex = 0; + this.sensor6Label.Text = "sensor6"; + this.sensor6Label.Visible = false; + // + // flowMeterPictureBox + // + this.flowMeterPictureBox.ErrorImage = null; + this.flowMeterPictureBox.Image = ((System.Drawing.Image)(resources.GetObject("flowMeterPictureBox.Image"))); + this.flowMeterPictureBox.InitialImage = null; + this.flowMeterPictureBox.Location = new System.Drawing.Point(864, 102); + this.flowMeterPictureBox.Name = "flowMeterPictureBox"; + this.flowMeterPictureBox.Size = new System.Drawing.Size(38, 38); + this.flowMeterPictureBox.TabIndex = 78; + this.flowMeterPictureBox.TabStop = false; + // + // pictureBox1 + // + this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image"))); + this.pictureBox1.Location = new System.Drawing.Point(864, 45); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(38, 35); + this.pictureBox1.TabIndex = 79; + this.pictureBox1.TabStop = false; + // + // watermeterPictureBox1z + // + this.watermeterPictureBox1z.Image = ((System.Drawing.Image)(resources.GetObject("watermeterPictureBox1z.Image"))); + this.watermeterPictureBox1z.Location = new System.Drawing.Point(207, 416); + this.watermeterPictureBox1z.Name = "watermeterPictureBox1z"; + this.watermeterPictureBox1z.Size = new System.Drawing.Size(38, 30); + this.watermeterPictureBox1z.TabIndex = 80; + this.watermeterPictureBox1z.TabStop = false; + // + // watermeterPictureBox2z + // + this.watermeterPictureBox2z.Image = ((System.Drawing.Image)(resources.GetObject("watermeterPictureBox2z.Image"))); + this.watermeterPictureBox2z.Location = new System.Drawing.Point(491, 416); + this.watermeterPictureBox2z.Name = "watermeterPictureBox2z"; + this.watermeterPictureBox2z.Size = new System.Drawing.Size(38, 30); + this.watermeterPictureBox2z.TabIndex = 81; + this.watermeterPictureBox2z.TabStop = false; + // + // watermeterPictureBox3z + // + this.watermeterPictureBox3z.Image = ((System.Drawing.Image)(resources.GetObject("watermeterPictureBox3z.Image"))); + this.watermeterPictureBox3z.Location = new System.Drawing.Point(775, 416); + this.watermeterPictureBox3z.Name = "watermeterPictureBox3z"; + this.watermeterPictureBox3z.Size = new System.Drawing.Size(38, 30); + this.watermeterPictureBox3z.TabIndex = 82; + this.watermeterPictureBox3z.TabStop = false; + // + // groupBox1z + // + this.groupBox1z.Controls.Add(this.passed1zLabel); + this.groupBox1z.Controls.Add(this.error1zLabel); + this.groupBox1z.Controls.Add(this.label56); + this.groupBox1z.Controls.Add(this.volume1zLabel); + this.groupBox1z.Controls.Add(this.label58); + this.groupBox1z.Location = new System.Drawing.Point(23, 151); + this.groupBox1z.Name = "groupBox1z"; + this.groupBox1z.Size = new System.Drawing.Size(280, 76); + this.groupBox1z.TabIndex = 83; + this.groupBox1z.TabStop = false; + this.groupBox1z.Text = "Combined meter 1"; + // + // passed1zLabel + // + this.passed1zLabel.AutoSize = true; + this.passed1zLabel.Location = new System.Drawing.Point(141, 55); + this.passed1zLabel.Name = "passed1zLabel"; + this.passed1zLabel.Size = new System.Drawing.Size(52, 13); + this.passed1zLabel.TabIndex = 9; + this.passed1zLabel.Text = "passed1z"; + // + // error1zLabel + // + this.error1zLabel.AutoSize = true; + this.error1zLabel.Location = new System.Drawing.Point(141, 37); + this.error1zLabel.Name = "error1zLabel"; + this.error1zLabel.Size = new System.Drawing.Size(39, 13); + this.error1zLabel.TabIndex = 8; + this.error1zLabel.Text = "error1z"; + // + // label56 + // + this.label56.AutoSize = true; + this.label56.Location = new System.Drawing.Point(86, 37); + this.label56.Name = "label56"; + this.label56.Size = new System.Drawing.Size(49, 13); + this.label56.TabIndex = 7; + this.label56.Text = "Error [%]:"; + // + // volume1zLabel + // + this.volume1zLabel.AutoSize = true; + this.volume1zLabel.Location = new System.Drawing.Point(141, 18); + this.volume1zLabel.Name = "volume1zLabel"; + this.volume1zLabel.Size = new System.Drawing.Size(52, 13); + this.volume1zLabel.TabIndex = 6; + this.volume1zLabel.Text = "volume1z"; + // + // label58 + // + this.label58.AutoSize = true; + this.label58.Location = new System.Drawing.Point(90, 18); + this.label58.Name = "label58"; + this.label58.Size = new System.Drawing.Size(45, 13); + this.label58.TabIndex = 5; + this.label58.Text = "Volume:"; + // + // groupBox2z + // + this.groupBox2z.Controls.Add(this.passed2zLabel); + this.groupBox2z.Controls.Add(this.error2zLabel); + this.groupBox2z.Controls.Add(this.label52); + this.groupBox2z.Controls.Add(this.volume2zLabel); + this.groupBox2z.Controls.Add(this.label59); + this.groupBox2z.Location = new System.Drawing.Point(305, 151); + this.groupBox2z.Name = "groupBox2z"; + this.groupBox2z.Size = new System.Drawing.Size(280, 76); + this.groupBox2z.TabIndex = 84; + this.groupBox2z.TabStop = false; + this.groupBox2z.Text = "Combined meter 2"; + // + // passed2zLabel + // + this.passed2zLabel.AutoSize = true; + this.passed2zLabel.Location = new System.Drawing.Point(141, 56); + this.passed2zLabel.Name = "passed2zLabel"; + this.passed2zLabel.Size = new System.Drawing.Size(52, 13); + this.passed2zLabel.TabIndex = 9; + this.passed2zLabel.Text = "passed2z"; + // + // error2zLabel + // + this.error2zLabel.AutoSize = true; + this.error2zLabel.Location = new System.Drawing.Point(141, 38); + this.error2zLabel.Name = "error2zLabel"; + this.error2zLabel.Size = new System.Drawing.Size(39, 13); + this.error2zLabel.TabIndex = 8; + this.error2zLabel.Text = "error2z"; + // + // label52 + // + this.label52.AutoSize = true; + this.label52.Location = new System.Drawing.Point(86, 38); + this.label52.Name = "label52"; + this.label52.Size = new System.Drawing.Size(49, 13); + this.label52.TabIndex = 7; + this.label52.Text = "Error [%]:"; + // + // volume2zLabel + // + this.volume2zLabel.AutoSize = true; + this.volume2zLabel.Location = new System.Drawing.Point(141, 19); + this.volume2zLabel.Name = "volume2zLabel"; + this.volume2zLabel.Size = new System.Drawing.Size(52, 13); + this.volume2zLabel.TabIndex = 6; + this.volume2zLabel.Text = "volume2z"; + // + // label59 + // + this.label59.AutoSize = true; + this.label59.Location = new System.Drawing.Point(90, 19); + this.label59.Name = "label59"; + this.label59.Size = new System.Drawing.Size(45, 13); + this.label59.TabIndex = 5; + this.label59.Text = "Volume:"; + // + // groupBox3z + // + this.groupBox3z.Controls.Add(this.passed3zLabel); + this.groupBox3z.Controls.Add(this.error3zLabel); + this.groupBox3z.Controls.Add(this.label57); + this.groupBox3z.Controls.Add(this.volume3zLabel); + this.groupBox3z.Controls.Add(this.label61); + this.groupBox3z.Location = new System.Drawing.Point(587, 151); + this.groupBox3z.Name = "groupBox3z"; + this.groupBox3z.Size = new System.Drawing.Size(280, 76); + this.groupBox3z.TabIndex = 85; + this.groupBox3z.TabStop = false; + this.groupBox3z.Text = "Combined meter 3"; + // + // passed3zLabel + // + this.passed3zLabel.AutoSize = true; + this.passed3zLabel.Location = new System.Drawing.Point(141, 56); + this.passed3zLabel.Name = "passed3zLabel"; + this.passed3zLabel.Size = new System.Drawing.Size(52, 13); + this.passed3zLabel.TabIndex = 9; + this.passed3zLabel.Text = "passed3z"; + // + // error3zLabel + // + this.error3zLabel.AutoSize = true; + this.error3zLabel.Location = new System.Drawing.Point(141, 38); + this.error3zLabel.Name = "error3zLabel"; + this.error3zLabel.Size = new System.Drawing.Size(39, 13); + this.error3zLabel.TabIndex = 8; + this.error3zLabel.Text = "error3z"; + // + // label57 + // + this.label57.AutoSize = true; + this.label57.Location = new System.Drawing.Point(86, 38); + this.label57.Name = "label57"; + this.label57.Size = new System.Drawing.Size(49, 13); + this.label57.TabIndex = 7; + this.label57.Text = "Error [%]:"; + // + // volume3zLabel + // + this.volume3zLabel.AutoSize = true; + this.volume3zLabel.Location = new System.Drawing.Point(141, 19); + this.volume3zLabel.Name = "volume3zLabel"; + this.volume3zLabel.Size = new System.Drawing.Size(52, 13); + this.volume3zLabel.TabIndex = 6; + this.volume3zLabel.Text = "volume3z"; + // + // label61 + // + this.label61.AutoSize = true; + this.label61.Location = new System.Drawing.Point(90, 19); + this.label61.Name = "label61"; + this.label61.Size = new System.Drawing.Size(45, 13); + this.label61.TabIndex = 5; + this.label61.Text = "Volume:"; + // + // pumpPctTextBox + // + this.pumpPctTextBox.Location = new System.Drawing.Point(777, 454); + this.pumpPctTextBox.Name = "pumpPctTextBox"; + this.pumpPctTextBox.Size = new System.Drawing.Size(42, 20); + this.pumpPctTextBox.TabIndex = 86; + // + // meter1Label + // + this.meter1Label.AutoSize = true; + this.meter1Label.Location = new System.Drawing.Point(64, 524); + this.meter1Label.Name = "meter1Label"; + this.meter1Label.Size = new System.Drawing.Size(43, 13); + this.meter1Label.TabIndex = 87; + this.meter1Label.Text = "Meter 1"; + this.meter1Label.Visible = false; + // + // meter2Label + // + this.meter2Label.AutoSize = true; + this.meter2Label.Location = new System.Drawing.Point(134, 524); + this.meter2Label.Name = "meter2Label"; + this.meter2Label.Size = new System.Drawing.Size(43, 13); + this.meter2Label.TabIndex = 88; + this.meter2Label.Text = "Meter 2"; + this.meter2Label.Visible = false; + // + // meter3Label + // + this.meter3Label.AutoSize = true; + this.meter3Label.Location = new System.Drawing.Point(204, 524); + this.meter3Label.Name = "meter3Label"; + this.meter3Label.Size = new System.Drawing.Size(43, 13); + this.meter3Label.TabIndex = 89; + this.meter3Label.Text = "Meter 3"; + this.meter3Label.Visible = false; + // + // meter4Label + // + this.meter4Label.AutoSize = true; + this.meter4Label.Location = new System.Drawing.Point(274, 524); + this.meter4Label.Name = "meter4Label"; + this.meter4Label.Size = new System.Drawing.Size(43, 13); + this.meter4Label.TabIndex = 90; + this.meter4Label.Text = "Meter 4"; + this.meter4Label.Visible = false; + // + // meter5Label + // + this.meter5Label.AutoSize = true; + this.meter5Label.Location = new System.Drawing.Point(344, 524); + this.meter5Label.Name = "meter5Label"; + this.meter5Label.Size = new System.Drawing.Size(43, 13); + this.meter5Label.TabIndex = 91; + this.meter5Label.Text = "Meter 5"; + this.meter5Label.Visible = false; + // + // meter6Label + // + this.meter6Label.AutoSize = true; + this.meter6Label.Location = new System.Drawing.Point(414, 524); + this.meter6Label.Name = "meter6Label"; + this.meter6Label.Size = new System.Drawing.Size(43, 13); + this.meter6Label.TabIndex = 92; + this.meter6Label.Text = "Meter 6"; + this.meter6Label.Visible = false; + // + // meter12Label + // + this.meter12Label.AutoSize = true; + this.meter12Label.Location = new System.Drawing.Point(834, 524); + this.meter12Label.Name = "meter12Label"; + this.meter12Label.Size = new System.Drawing.Size(49, 13); + this.meter12Label.TabIndex = 134; + this.meter12Label.Text = "Meter 12"; + this.meter12Label.Visible = false; + // + // meter11Label + // + this.meter11Label.AutoSize = true; + this.meter11Label.Location = new System.Drawing.Point(764, 524); + this.meter11Label.Name = "meter11Label"; + this.meter11Label.Size = new System.Drawing.Size(49, 13); + this.meter11Label.TabIndex = 133; + this.meter11Label.Text = "Meter 11"; + this.meter11Label.Visible = false; + // + // meter10Label + // + this.meter10Label.AutoSize = true; + this.meter10Label.Location = new System.Drawing.Point(694, 524); + this.meter10Label.Name = "meter10Label"; + this.meter10Label.Size = new System.Drawing.Size(49, 13); + this.meter10Label.TabIndex = 132; + this.meter10Label.Text = "Meter 10"; + this.meter10Label.Visible = false; + // + // meter9Label + // + this.meter9Label.AutoSize = true; + this.meter9Label.Location = new System.Drawing.Point(624, 524); + this.meter9Label.Name = "meter9Label"; + this.meter9Label.Size = new System.Drawing.Size(43, 13); + this.meter9Label.TabIndex = 131; + this.meter9Label.Text = "Meter 9"; + this.meter9Label.Visible = false; + // + // meter8Label + // + this.meter8Label.AutoSize = true; + this.meter8Label.Location = new System.Drawing.Point(554, 524); + this.meter8Label.Name = "meter8Label"; + this.meter8Label.Size = new System.Drawing.Size(43, 13); + this.meter8Label.TabIndex = 130; + this.meter8Label.Text = "Meter 8"; + this.meter8Label.Visible = false; + // + // meter7Label + // + this.meter7Label.AutoSize = true; + this.meter7Label.Location = new System.Drawing.Point(484, 524); + this.meter7Label.Name = "meter7Label"; + this.meter7Label.Size = new System.Drawing.Size(43, 13); + this.meter7Label.TabIndex = 129; + this.meter7Label.Text = "Meter 7"; + this.meter7Label.Visible = false; + // + // passed12Label + // + this.passed12Label.AutoSize = true; + this.passed12Label.Location = new System.Drawing.Point(834, 634); + this.passed12Label.Name = "passed12Label"; + this.passed12Label.Size = new System.Drawing.Size(53, 13); + this.passed12Label.TabIndex = 123; + this.passed12Label.Text = "passed12"; + this.passed12Label.Visible = false; + // + // passed11Label + // + this.passed11Label.AutoSize = true; + this.passed11Label.Location = new System.Drawing.Point(764, 634); + this.passed11Label.Name = "passed11Label"; + this.passed11Label.Size = new System.Drawing.Size(53, 13); + this.passed11Label.TabIndex = 124; + this.passed11Label.Text = "passed11"; + this.passed11Label.Visible = false; + // + // error12Label + // + this.error12Label.AutoSize = true; + this.error12Label.Location = new System.Drawing.Point(834, 616); + this.error12Label.Name = "error12Label"; + this.error12Label.Size = new System.Drawing.Size(40, 13); + this.error12Label.TabIndex = 118; + this.error12Label.Text = "error12"; + this.error12Label.Visible = false; + // + // passed10Label + // + this.passed10Label.AutoSize = true; + this.passed10Label.Location = new System.Drawing.Point(693, 634); + this.passed10Label.Name = "passed10Label"; + this.passed10Label.Size = new System.Drawing.Size(53, 13); + this.passed10Label.TabIndex = 125; + this.passed10Label.Text = "passed10"; + this.passed10Label.Visible = false; + // + // error11Label + // + this.error11Label.AutoSize = true; + this.error11Label.Location = new System.Drawing.Point(764, 616); + this.error11Label.Name = "error11Label"; + this.error11Label.Size = new System.Drawing.Size(40, 13); + this.error11Label.TabIndex = 119; + this.error11Label.Text = "error11"; + this.error11Label.Visible = false; + // + // volume12Label + // + this.volume12Label.AutoSize = true; + this.volume12Label.Location = new System.Drawing.Point(834, 597); + this.volume12Label.Name = "volume12Label"; + this.volume12Label.Size = new System.Drawing.Size(53, 13); + this.volume12Label.TabIndex = 114; + this.volume12Label.Text = "volume12"; + this.volume12Label.Visible = false; + // + // passed9Label + // + this.passed9Label.AutoSize = true; + this.passed9Label.Location = new System.Drawing.Point(624, 634); + this.passed9Label.Name = "passed9Label"; + this.passed9Label.Size = new System.Drawing.Size(47, 13); + this.passed9Label.TabIndex = 127; + this.passed9Label.Text = "passed9"; + this.passed9Label.Visible = false; + // + // error10Label + // + this.error10Label.AutoSize = true; + this.error10Label.Location = new System.Drawing.Point(693, 616); + this.error10Label.Name = "error10Label"; + this.error10Label.Size = new System.Drawing.Size(40, 13); + this.error10Label.TabIndex = 117; + this.error10Label.Text = "error10"; + this.error10Label.Visible = false; + // + // volume11Label + // + this.volume11Label.AutoSize = true; + this.volume11Label.Location = new System.Drawing.Point(764, 597); + this.volume11Label.Name = "volume11Label"; + this.volume11Label.Size = new System.Drawing.Size(53, 13); + this.volume11Label.TabIndex = 116; + this.volume11Label.Text = "volume11"; + this.volume11Label.Visible = false; + // + // passed8Label + // + this.passed8Label.AutoSize = true; + this.passed8Label.Location = new System.Drawing.Point(554, 634); + this.passed8Label.Name = "passed8Label"; + this.passed8Label.Size = new System.Drawing.Size(47, 13); + this.passed8Label.TabIndex = 126; + this.passed8Label.Text = "passed8"; + this.passed8Label.Visible = false; + // + // refPulses12Label + // + this.refPulses12Label.AutoSize = true; + this.refPulses12Label.Location = new System.Drawing.Point(834, 579); + this.refPulses12Label.Name = "refPulses12Label"; + this.refPulses12Label.Size = new System.Drawing.Size(62, 13); + this.refPulses12Label.TabIndex = 106; + this.refPulses12Label.Text = "refPulses12"; + this.refPulses12Label.Visible = false; + // + // error9Label + // + this.error9Label.AutoSize = true; + this.error9Label.Location = new System.Drawing.Point(624, 616); + this.error9Label.Name = "error9Label"; + this.error9Label.Size = new System.Drawing.Size(34, 13); + this.error9Label.TabIndex = 120; + this.error9Label.Text = "error9"; + this.error9Label.Visible = false; + // + // pulses12Label + // + this.pulses12Label.AutoSize = true; + this.pulses12Label.Location = new System.Drawing.Point(834, 560); + this.pulses12Label.Name = "pulses12Label"; + this.pulses12Label.Size = new System.Drawing.Size(49, 13); + this.pulses12Label.TabIndex = 102; + this.pulses12Label.Text = "pulses12"; + this.pulses12Label.Visible = false; + // + // sensor12Label + // + this.sensor12Label.AutoSize = true; + this.sensor12Label.Location = new System.Drawing.Point(834, 542); + this.sensor12Label.Name = "sensor12Label"; + this.sensor12Label.Size = new System.Drawing.Size(50, 13); + this.sensor12Label.TabIndex = 95; + this.sensor12Label.Text = "sensor12"; + this.sensor12Label.Visible = false; + // + // volume10Label + // + this.volume10Label.AutoSize = true; + this.volume10Label.Location = new System.Drawing.Point(693, 597); + this.volume10Label.Name = "volume10Label"; + this.volume10Label.Size = new System.Drawing.Size(53, 13); + this.volume10Label.TabIndex = 115; + this.volume10Label.Text = "volume10"; + this.volume10Label.Visible = false; + // + // passed7Label + // + this.passed7Label.AutoSize = true; + this.passed7Label.Location = new System.Drawing.Point(484, 634); + this.passed7Label.Name = "passed7Label"; + this.passed7Label.Size = new System.Drawing.Size(47, 13); + this.passed7Label.TabIndex = 128; + this.passed7Label.Text = "passed7"; + this.passed7Label.Visible = false; + // + // refPulses11Label + // + this.refPulses11Label.AutoSize = true; + this.refPulses11Label.Location = new System.Drawing.Point(764, 579); + this.refPulses11Label.Name = "refPulses11Label"; + this.refPulses11Label.Size = new System.Drawing.Size(62, 13); + this.refPulses11Label.TabIndex = 105; + this.refPulses11Label.Text = "refPulses11"; + this.refPulses11Label.Visible = false; + // + // pulses11Label + // + this.pulses11Label.AutoSize = true; + this.pulses11Label.Location = new System.Drawing.Point(764, 560); + this.pulses11Label.Name = "pulses11Label"; + this.pulses11Label.Size = new System.Drawing.Size(49, 13); + this.pulses11Label.TabIndex = 99; + this.pulses11Label.Text = "pulses11"; + this.pulses11Label.Visible = false; + // + // error8Label + // + this.error8Label.AutoSize = true; + this.error8Label.Location = new System.Drawing.Point(554, 616); + this.error8Label.Name = "error8Label"; + this.error8Label.Size = new System.Drawing.Size(34, 13); + this.error8Label.TabIndex = 121; + this.error8Label.Text = "error8"; + this.error8Label.Visible = false; + // + // sensor11Label + // + this.sensor11Label.AutoSize = true; + this.sensor11Label.Location = new System.Drawing.Point(764, 542); + this.sensor11Label.Name = "sensor11Label"; + this.sensor11Label.Size = new System.Drawing.Size(50, 13); + this.sensor11Label.TabIndex = 96; + this.sensor11Label.Text = "sensor11"; + this.sensor11Label.Visible = false; + // + // volume9Label + // + this.volume9Label.AutoSize = true; + this.volume9Label.Location = new System.Drawing.Point(624, 597); + this.volume9Label.Name = "volume9Label"; + this.volume9Label.Size = new System.Drawing.Size(47, 13); + this.volume9Label.TabIndex = 111; + this.volume9Label.Text = "volume9"; + this.volume9Label.Visible = false; + // + // refPulses10Label + // + this.refPulses10Label.AutoSize = true; + this.refPulses10Label.Location = new System.Drawing.Point(693, 579); + this.refPulses10Label.Name = "refPulses10Label"; + this.refPulses10Label.Size = new System.Drawing.Size(62, 13); + this.refPulses10Label.TabIndex = 110; + this.refPulses10Label.Text = "refPulses10"; + this.refPulses10Label.Visible = false; + // + // pulses10Label + // + this.pulses10Label.AutoSize = true; + this.pulses10Label.Location = new System.Drawing.Point(693, 560); + this.pulses10Label.Name = "pulses10Label"; + this.pulses10Label.Size = new System.Drawing.Size(49, 13); + this.pulses10Label.TabIndex = 100; + this.pulses10Label.Text = "pulses10"; + this.pulses10Label.Visible = false; + // + // volume8Label + // + this.volume8Label.AutoSize = true; + this.volume8Label.Location = new System.Drawing.Point(554, 597); + this.volume8Label.Name = "volume8Label"; + this.volume8Label.Size = new System.Drawing.Size(47, 13); + this.volume8Label.TabIndex = 113; + this.volume8Label.Text = "volume8"; + this.volume8Label.Visible = false; + // + // sensor10Label + // + this.sensor10Label.AutoSize = true; + this.sensor10Label.Location = new System.Drawing.Point(693, 542); + this.sensor10Label.Name = "sensor10Label"; + this.sensor10Label.Size = new System.Drawing.Size(50, 13); + this.sensor10Label.TabIndex = 93; + this.sensor10Label.Text = "sensor10"; + this.sensor10Label.Visible = false; + // + // error7Label + // + this.error7Label.AutoSize = true; + this.error7Label.Location = new System.Drawing.Point(484, 616); + this.error7Label.Name = "error7Label"; + this.error7Label.Size = new System.Drawing.Size(34, 13); + this.error7Label.TabIndex = 122; + this.error7Label.Text = "error7"; + this.error7Label.Visible = false; + // + // refPulses9Label + // + this.refPulses9Label.AutoSize = true; + this.refPulses9Label.Location = new System.Drawing.Point(624, 579); + this.refPulses9Label.Name = "refPulses9Label"; + this.refPulses9Label.Size = new System.Drawing.Size(56, 13); + this.refPulses9Label.TabIndex = 108; + this.refPulses9Label.Text = "refPulses9"; + this.refPulses9Label.Visible = false; + // + // volume7Label + // + this.volume7Label.AutoSize = true; + this.volume7Label.Location = new System.Drawing.Point(484, 597); + this.volume7Label.Name = "volume7Label"; + this.volume7Label.Size = new System.Drawing.Size(47, 13); + this.volume7Label.TabIndex = 112; + this.volume7Label.Text = "volume7"; + this.volume7Label.Visible = false; + // + // pulses9Label + // + this.pulses9Label.AutoSize = true; + this.pulses9Label.Location = new System.Drawing.Point(624, 560); + this.pulses9Label.Name = "pulses9Label"; + this.pulses9Label.Size = new System.Drawing.Size(43, 13); + this.pulses9Label.TabIndex = 104; + this.pulses9Label.Text = "pulses9"; + this.pulses9Label.Visible = false; + // + // sensor9Label + // + this.sensor9Label.AutoSize = true; + this.sensor9Label.Location = new System.Drawing.Point(624, 542); + this.sensor9Label.Name = "sensor9Label"; + this.sensor9Label.Size = new System.Drawing.Size(44, 13); + this.sensor9Label.TabIndex = 94; + this.sensor9Label.Text = "sensor9"; + this.sensor9Label.Visible = false; + // + // refPulses7Label + // + this.refPulses7Label.AutoSize = true; + this.refPulses7Label.Location = new System.Drawing.Point(484, 579); + this.refPulses7Label.Name = "refPulses7Label"; + this.refPulses7Label.Size = new System.Drawing.Size(56, 13); + this.refPulses7Label.TabIndex = 109; + this.refPulses7Label.Text = "refPulses7"; + this.refPulses7Label.Visible = false; + // + // refPulses8Label + // + this.refPulses8Label.AutoSize = true; + this.refPulses8Label.Location = new System.Drawing.Point(554, 579); + this.refPulses8Label.Name = "refPulses8Label"; + this.refPulses8Label.Size = new System.Drawing.Size(56, 13); + this.refPulses8Label.TabIndex = 107; + this.refPulses8Label.Text = "refPulses8"; + this.refPulses8Label.Visible = false; + // + // pulses8Label + // + this.pulses8Label.AutoSize = true; + this.pulses8Label.Location = new System.Drawing.Point(554, 560); + this.pulses8Label.Name = "pulses8Label"; + this.pulses8Label.Size = new System.Drawing.Size(43, 13); + this.pulses8Label.TabIndex = 103; + this.pulses8Label.Text = "pulses8"; + this.pulses8Label.Visible = false; + // + // pulses7Label + // + this.pulses7Label.AutoSize = true; + this.pulses7Label.Location = new System.Drawing.Point(484, 560); + this.pulses7Label.Name = "pulses7Label"; + this.pulses7Label.Size = new System.Drawing.Size(43, 13); + this.pulses7Label.TabIndex = 101; + this.pulses7Label.Text = "pulses7"; + this.pulses7Label.Visible = false; + // + // sensor8Label + // + this.sensor8Label.AutoSize = true; + this.sensor8Label.Location = new System.Drawing.Point(554, 542); + this.sensor8Label.Name = "sensor8Label"; + this.sensor8Label.Size = new System.Drawing.Size(44, 13); + this.sensor8Label.TabIndex = 97; + this.sensor8Label.Text = "sensor8"; + this.sensor8Label.Visible = false; + // + // sensor7Label + // + this.sensor7Label.AutoSize = true; + this.sensor7Label.Location = new System.Drawing.Point(484, 542); + this.sensor7Label.Name = "sensor7Label"; + this.sensor7Label.Size = new System.Drawing.Size(44, 13); + this.sensor7Label.TabIndex = 98; + this.sensor7Label.Text = "sensor7"; + this.sensor7Label.Visible = false; + // + // meter24Label + // + this.meter24Label.AutoSize = true; + this.meter24Label.Location = new System.Drawing.Point(274, 229); + this.meter24Label.Name = "meter24Label"; + this.meter24Label.Size = new System.Drawing.Size(49, 13); + this.meter24Label.TabIndex = 223; + this.meter24Label.Text = "Meter 24"; + this.meter24Label.Visible = false; + // + // meter23Label + // + this.meter23Label.AutoSize = true; + this.meter23Label.Location = new System.Drawing.Point(204, 229); + this.meter23Label.Name = "meter23Label"; + this.meter23Label.Size = new System.Drawing.Size(49, 13); + this.meter23Label.TabIndex = 222; + this.meter23Label.Text = "Meter 23"; + this.meter23Label.Visible = false; + // + // meter22Label + // + this.meter22Label.AutoSize = true; + this.meter22Label.Location = new System.Drawing.Point(134, 229); + this.meter22Label.Name = "meter22Label"; + this.meter22Label.Size = new System.Drawing.Size(49, 13); + this.meter22Label.TabIndex = 221; + this.meter22Label.Text = "Meter 22"; + this.meter22Label.Visible = false; + // + // meter21Label + // + this.meter21Label.AutoSize = true; + this.meter21Label.Location = new System.Drawing.Point(64, 229); + this.meter21Label.Name = "meter21Label"; + this.meter21Label.Size = new System.Drawing.Size(49, 13); + this.meter21Label.TabIndex = 220; + this.meter21Label.Text = "Meter 21"; + this.meter21Label.Visible = false; + // + // meter20Label + // + this.meter20Label.AutoSize = true; + this.meter20Label.Location = new System.Drawing.Point(1399, 524); + this.meter20Label.Name = "meter20Label"; + this.meter20Label.Size = new System.Drawing.Size(49, 13); + this.meter20Label.TabIndex = 219; + this.meter20Label.Text = "Meter 20"; + this.meter20Label.Visible = false; + // + // meter19Label + // + this.meter19Label.AutoSize = true; + this.meter19Label.Location = new System.Drawing.Point(1329, 524); + this.meter19Label.Name = "meter19Label"; + this.meter19Label.Size = new System.Drawing.Size(49, 13); + this.meter19Label.TabIndex = 218; + this.meter19Label.Text = "Meter 19"; + this.meter19Label.Visible = false; + // + // passed24Label + // + this.passed24Label.AutoSize = true; + this.passed24Label.Location = new System.Drawing.Point(274, 339); + this.passed24Label.Name = "passed24Label"; + this.passed24Label.Size = new System.Drawing.Size(53, 13); + this.passed24Label.TabIndex = 212; + this.passed24Label.Text = "passed24"; + this.passed24Label.Visible = false; + // + // passed23Label + // + this.passed23Label.AutoSize = true; + this.passed23Label.Location = new System.Drawing.Point(204, 339); + this.passed23Label.Name = "passed23Label"; + this.passed23Label.Size = new System.Drawing.Size(53, 13); + this.passed23Label.TabIndex = 213; + this.passed23Label.Text = "passed23"; + this.passed23Label.Visible = false; + // + // error24Label + // + this.error24Label.AutoSize = true; + this.error24Label.Location = new System.Drawing.Point(274, 321); + this.error24Label.Name = "error24Label"; + this.error24Label.Size = new System.Drawing.Size(40, 13); + this.error24Label.TabIndex = 207; + this.error24Label.Text = "error24"; + this.error24Label.Visible = false; + // + // passed22Label + // + this.passed22Label.AutoSize = true; + this.passed22Label.Location = new System.Drawing.Point(133, 339); + this.passed22Label.Name = "passed22Label"; + this.passed22Label.Size = new System.Drawing.Size(53, 13); + this.passed22Label.TabIndex = 214; + this.passed22Label.Text = "passed22"; + this.passed22Label.Visible = false; + // + // error23Label + // + this.error23Label.AutoSize = true; + this.error23Label.Location = new System.Drawing.Point(204, 321); + this.error23Label.Name = "error23Label"; + this.error23Label.Size = new System.Drawing.Size(40, 13); + this.error23Label.TabIndex = 208; + this.error23Label.Text = "error23"; + this.error23Label.Visible = false; + // + // volume24Label + // + this.volume24Label.AutoSize = true; + this.volume24Label.Location = new System.Drawing.Point(274, 302); + this.volume24Label.Name = "volume24Label"; + this.volume24Label.Size = new System.Drawing.Size(53, 13); + this.volume24Label.TabIndex = 203; + this.volume24Label.Text = "volume24"; + this.volume24Label.Visible = false; + // + // passed21Label + // + this.passed21Label.AutoSize = true; + this.passed21Label.Location = new System.Drawing.Point(64, 339); + this.passed21Label.Name = "passed21Label"; + this.passed21Label.Size = new System.Drawing.Size(53, 13); + this.passed21Label.TabIndex = 216; + this.passed21Label.Text = "passed21"; + this.passed21Label.Visible = false; + // + // error22Label + // + this.error22Label.AutoSize = true; + this.error22Label.Location = new System.Drawing.Point(133, 321); + this.error22Label.Name = "error22Label"; + this.error22Label.Size = new System.Drawing.Size(40, 13); + this.error22Label.TabIndex = 206; + this.error22Label.Text = "error22"; + this.error22Label.Visible = false; + // + // volume23Label + // + this.volume23Label.AutoSize = true; + this.volume23Label.Location = new System.Drawing.Point(204, 302); + this.volume23Label.Name = "volume23Label"; + this.volume23Label.Size = new System.Drawing.Size(53, 13); + this.volume23Label.TabIndex = 205; + this.volume23Label.Text = "volume23"; + this.volume23Label.Visible = false; + // + // passed20Label + // + this.passed20Label.AutoSize = true; + this.passed20Label.Location = new System.Drawing.Point(1399, 634); + this.passed20Label.Name = "passed20Label"; + this.passed20Label.Size = new System.Drawing.Size(53, 13); + this.passed20Label.TabIndex = 215; + this.passed20Label.Text = "passed20"; + this.passed20Label.Visible = false; + // + // refPulses24Label + // + this.refPulses24Label.AutoSize = true; + this.refPulses24Label.Location = new System.Drawing.Point(274, 284); + this.refPulses24Label.Name = "refPulses24Label"; + this.refPulses24Label.Size = new System.Drawing.Size(62, 13); + this.refPulses24Label.TabIndex = 195; + this.refPulses24Label.Text = "refPulses24"; + this.refPulses24Label.Visible = false; + // + // error21Label + // + this.error21Label.AutoSize = true; + this.error21Label.Location = new System.Drawing.Point(64, 321); + this.error21Label.Name = "error21Label"; + this.error21Label.Size = new System.Drawing.Size(40, 13); + this.error21Label.TabIndex = 209; + this.error21Label.Text = "error21"; + this.error21Label.Visible = false; + // + // pulses24Label + // + this.pulses24Label.AutoSize = true; + this.pulses24Label.Location = new System.Drawing.Point(274, 265); + this.pulses24Label.Name = "pulses24Label"; + this.pulses24Label.Size = new System.Drawing.Size(49, 13); + this.pulses24Label.TabIndex = 191; + this.pulses24Label.Text = "pulses24"; + this.pulses24Label.Visible = false; + // + // sensor24Label + // + this.sensor24Label.AutoSize = true; + this.sensor24Label.Location = new System.Drawing.Point(274, 247); + this.sensor24Label.Name = "sensor24Label"; + this.sensor24Label.Size = new System.Drawing.Size(50, 13); + this.sensor24Label.TabIndex = 184; + this.sensor24Label.Text = "sensor24"; + this.sensor24Label.Visible = false; + // + // volume22Label + // + this.volume22Label.AutoSize = true; + this.volume22Label.Location = new System.Drawing.Point(133, 302); + this.volume22Label.Name = "volume22Label"; + this.volume22Label.Size = new System.Drawing.Size(53, 13); + this.volume22Label.TabIndex = 204; + this.volume22Label.Text = "volume22"; + this.volume22Label.Visible = false; + // + // passed19Label + // + this.passed19Label.AutoSize = true; + this.passed19Label.Location = new System.Drawing.Point(1329, 634); + this.passed19Label.Name = "passed19Label"; + this.passed19Label.Size = new System.Drawing.Size(53, 13); + this.passed19Label.TabIndex = 217; + this.passed19Label.Text = "passed19"; + this.passed19Label.Visible = false; + // + // refPulses23Label + // + this.refPulses23Label.AutoSize = true; + this.refPulses23Label.Location = new System.Drawing.Point(204, 284); + this.refPulses23Label.Name = "refPulses23Label"; + this.refPulses23Label.Size = new System.Drawing.Size(62, 13); + this.refPulses23Label.TabIndex = 194; + this.refPulses23Label.Text = "refPulses23"; + this.refPulses23Label.Visible = false; + // + // pulses23Label + // + this.pulses23Label.AutoSize = true; + this.pulses23Label.Location = new System.Drawing.Point(204, 265); + this.pulses23Label.Name = "pulses23Label"; + this.pulses23Label.Size = new System.Drawing.Size(49, 13); + this.pulses23Label.TabIndex = 188; + this.pulses23Label.Text = "pulses23"; + this.pulses23Label.Visible = false; + // + // error20Label + // + this.error20Label.AutoSize = true; + this.error20Label.Location = new System.Drawing.Point(1399, 616); + this.error20Label.Name = "error20Label"; + this.error20Label.Size = new System.Drawing.Size(40, 13); + this.error20Label.TabIndex = 210; + this.error20Label.Text = "error20"; + this.error20Label.Visible = false; + // + // sensor23Label + // + this.sensor23Label.AutoSize = true; + this.sensor23Label.Location = new System.Drawing.Point(204, 247); + this.sensor23Label.Name = "sensor23Label"; + this.sensor23Label.Size = new System.Drawing.Size(50, 13); + this.sensor23Label.TabIndex = 185; + this.sensor23Label.Text = "sensor23"; + this.sensor23Label.Visible = false; + // + // volume21Label + // + this.volume21Label.AutoSize = true; + this.volume21Label.Location = new System.Drawing.Point(64, 302); + this.volume21Label.Name = "volume21Label"; + this.volume21Label.Size = new System.Drawing.Size(53, 13); + this.volume21Label.TabIndex = 200; + this.volume21Label.Text = "volume21"; + this.volume21Label.Visible = false; + // + // refPulses22Label + // + this.refPulses22Label.AutoSize = true; + this.refPulses22Label.Location = new System.Drawing.Point(133, 284); + this.refPulses22Label.Name = "refPulses22Label"; + this.refPulses22Label.Size = new System.Drawing.Size(62, 13); + this.refPulses22Label.TabIndex = 199; + this.refPulses22Label.Text = "refPulses22"; + this.refPulses22Label.Visible = false; + // + // pulses22Label + // + this.pulses22Label.AutoSize = true; + this.pulses22Label.Location = new System.Drawing.Point(133, 265); + this.pulses22Label.Name = "pulses22Label"; + this.pulses22Label.Size = new System.Drawing.Size(49, 13); + this.pulses22Label.TabIndex = 189; + this.pulses22Label.Text = "pulses22"; + this.pulses22Label.Visible = false; + // + // volume20Label + // + this.volume20Label.AutoSize = true; + this.volume20Label.Location = new System.Drawing.Point(1399, 597); + this.volume20Label.Name = "volume20Label"; + this.volume20Label.Size = new System.Drawing.Size(53, 13); + this.volume20Label.TabIndex = 202; + this.volume20Label.Text = "volume20"; + this.volume20Label.Visible = false; + // + // sensor22Label + // + this.sensor22Label.AutoSize = true; + this.sensor22Label.Location = new System.Drawing.Point(133, 247); + this.sensor22Label.Name = "sensor22Label"; + this.sensor22Label.Size = new System.Drawing.Size(50, 13); + this.sensor22Label.TabIndex = 182; + this.sensor22Label.Text = "sensor22"; + this.sensor22Label.Visible = false; + // + // error19Label + // + this.error19Label.AutoSize = true; + this.error19Label.Location = new System.Drawing.Point(1329, 616); + this.error19Label.Name = "error19Label"; + this.error19Label.Size = new System.Drawing.Size(40, 13); + this.error19Label.TabIndex = 211; + this.error19Label.Text = "error19"; + this.error19Label.Visible = false; + // + // refPulses21Label + // + this.refPulses21Label.AutoSize = true; + this.refPulses21Label.Location = new System.Drawing.Point(64, 284); + this.refPulses21Label.Name = "refPulses21Label"; + this.refPulses21Label.Size = new System.Drawing.Size(62, 13); + this.refPulses21Label.TabIndex = 197; + this.refPulses21Label.Text = "refPulses21"; + this.refPulses21Label.Visible = false; + // + // volume19Label + // + this.volume19Label.AutoSize = true; + this.volume19Label.Location = new System.Drawing.Point(1329, 597); + this.volume19Label.Name = "volume19Label"; + this.volume19Label.Size = new System.Drawing.Size(53, 13); + this.volume19Label.TabIndex = 201; + this.volume19Label.Text = "volume19"; + this.volume19Label.Visible = false; + // + // pulses21Label + // + this.pulses21Label.AutoSize = true; + this.pulses21Label.Location = new System.Drawing.Point(64, 265); + this.pulses21Label.Name = "pulses21Label"; + this.pulses21Label.Size = new System.Drawing.Size(49, 13); + this.pulses21Label.TabIndex = 193; + this.pulses21Label.Text = "pulses21"; + this.pulses21Label.Visible = false; + // + // sensor21Label + // + this.sensor21Label.AutoSize = true; + this.sensor21Label.Location = new System.Drawing.Point(64, 247); + this.sensor21Label.Name = "sensor21Label"; + this.sensor21Label.Size = new System.Drawing.Size(50, 13); + this.sensor21Label.TabIndex = 183; + this.sensor21Label.Text = "sensor21"; + this.sensor21Label.Visible = false; + // + // refPulses19Label + // + this.refPulses19Label.AutoSize = true; + this.refPulses19Label.Location = new System.Drawing.Point(1329, 579); + this.refPulses19Label.Name = "refPulses19Label"; + this.refPulses19Label.Size = new System.Drawing.Size(62, 13); + this.refPulses19Label.TabIndex = 198; + this.refPulses19Label.Text = "refPulses19"; + this.refPulses19Label.Visible = false; + // + // refPulses20Label + // + this.refPulses20Label.AutoSize = true; + this.refPulses20Label.Location = new System.Drawing.Point(1399, 579); + this.refPulses20Label.Name = "refPulses20Label"; + this.refPulses20Label.Size = new System.Drawing.Size(62, 13); + this.refPulses20Label.TabIndex = 196; + this.refPulses20Label.Text = "refPulses20"; + this.refPulses20Label.Visible = false; + // + // pulses20Label + // + this.pulses20Label.AutoSize = true; + this.pulses20Label.Location = new System.Drawing.Point(1399, 560); + this.pulses20Label.Name = "pulses20Label"; + this.pulses20Label.Size = new System.Drawing.Size(49, 13); + this.pulses20Label.TabIndex = 192; + this.pulses20Label.Text = "pulses20"; + this.pulses20Label.Visible = false; + // + // pulses19Label + // + this.pulses19Label.AutoSize = true; + this.pulses19Label.Location = new System.Drawing.Point(1329, 560); + this.pulses19Label.Name = "pulses19Label"; + this.pulses19Label.Size = new System.Drawing.Size(49, 13); + this.pulses19Label.TabIndex = 190; + this.pulses19Label.Text = "pulses19"; + this.pulses19Label.Visible = false; + // + // sensor20Label + // + this.sensor20Label.AutoSize = true; + this.sensor20Label.Location = new System.Drawing.Point(1399, 542); + this.sensor20Label.Name = "sensor20Label"; + this.sensor20Label.Size = new System.Drawing.Size(50, 13); + this.sensor20Label.TabIndex = 186; + this.sensor20Label.Text = "sensor20"; + this.sensor20Label.Visible = false; + // + // sensor19Label + // + this.sensor19Label.AutoSize = true; + this.sensor19Label.Location = new System.Drawing.Point(1329, 542); + this.sensor19Label.Name = "sensor19Label"; + this.sensor19Label.Size = new System.Drawing.Size(50, 13); + this.sensor19Label.TabIndex = 187; + this.sensor19Label.Text = "sensor19"; + this.sensor19Label.Visible = false; + // + // meter18Label + // + this.meter18Label.AutoSize = true; + this.meter18Label.Location = new System.Drawing.Point(1259, 524); + this.meter18Label.Name = "meter18Label"; + this.meter18Label.Size = new System.Drawing.Size(49, 13); + this.meter18Label.TabIndex = 181; + this.meter18Label.Text = "Meter 18"; + this.meter18Label.Visible = false; + // + // meter17Label + // + this.meter17Label.AutoSize = true; + this.meter17Label.Location = new System.Drawing.Point(1189, 524); + this.meter17Label.Name = "meter17Label"; + this.meter17Label.Size = new System.Drawing.Size(49, 13); + this.meter17Label.TabIndex = 180; + this.meter17Label.Text = "Meter 17"; + this.meter17Label.Visible = false; + // + // meter16Label + // + this.meter16Label.AutoSize = true; + this.meter16Label.Location = new System.Drawing.Point(1119, 524); + this.meter16Label.Name = "meter16Label"; + this.meter16Label.Size = new System.Drawing.Size(49, 13); + this.meter16Label.TabIndex = 179; + this.meter16Label.Text = "Meter 16"; + this.meter16Label.Visible = false; + // + // meter15Label + // + this.meter15Label.AutoSize = true; + this.meter15Label.Location = new System.Drawing.Point(1049, 524); + this.meter15Label.Name = "meter15Label"; + this.meter15Label.Size = new System.Drawing.Size(49, 13); + this.meter15Label.TabIndex = 178; + this.meter15Label.Text = "Meter 15"; + this.meter15Label.Visible = false; + // + // meter14Label + // + this.meter14Label.AutoSize = true; + this.meter14Label.Location = new System.Drawing.Point(979, 524); + this.meter14Label.Name = "meter14Label"; + this.meter14Label.Size = new System.Drawing.Size(49, 13); + this.meter14Label.TabIndex = 177; + this.meter14Label.Text = "Meter 14"; + this.meter14Label.Visible = false; + // + // meter13Label + // + this.meter13Label.AutoSize = true; + this.meter13Label.Location = new System.Drawing.Point(909, 524); + this.meter13Label.Name = "meter13Label"; + this.meter13Label.Size = new System.Drawing.Size(49, 13); + this.meter13Label.TabIndex = 176; + this.meter13Label.Text = "Meter 13"; + this.meter13Label.Visible = false; + // + // passed18Label + // + this.passed18Label.AutoSize = true; + this.passed18Label.Location = new System.Drawing.Point(1259, 634); + this.passed18Label.Name = "passed18Label"; + this.passed18Label.Size = new System.Drawing.Size(53, 13); + this.passed18Label.TabIndex = 174; + this.passed18Label.Text = "passed18"; + this.passed18Label.Visible = false; + // + // passed17Label + // + this.passed17Label.AutoSize = true; + this.passed17Label.Location = new System.Drawing.Point(1189, 634); + this.passed17Label.Name = "passed17Label"; + this.passed17Label.Size = new System.Drawing.Size(53, 13); + this.passed17Label.TabIndex = 169; + this.passed17Label.Text = "passed17"; + this.passed17Label.Visible = false; + // + // error18Label + // + this.error18Label.AutoSize = true; + this.error18Label.Location = new System.Drawing.Point(1259, 616); + this.error18Label.Name = "error18Label"; + this.error18Label.Size = new System.Drawing.Size(40, 13); + this.error18Label.TabIndex = 167; + this.error18Label.Text = "error18"; + this.error18Label.Visible = false; + // + // passed16Label + // + this.passed16Label.AutoSize = true; + this.passed16Label.Location = new System.Drawing.Point(1118, 634); + this.passed16Label.Name = "passed16Label"; + this.passed16Label.Size = new System.Drawing.Size(53, 13); + this.passed16Label.TabIndex = 170; + this.passed16Label.Text = "passed16"; + this.passed16Label.Visible = false; + // + // error17Label + // + this.error17Label.AutoSize = true; + this.error17Label.Location = new System.Drawing.Point(1189, 616); + this.error17Label.Name = "error17Label"; + this.error17Label.Size = new System.Drawing.Size(40, 13); + this.error17Label.TabIndex = 163; + this.error17Label.Text = "error17"; + this.error17Label.Visible = false; + // + // volume18Label + // + this.volume18Label.AutoSize = true; + this.volume18Label.Location = new System.Drawing.Point(1259, 597); + this.volume18Label.Name = "volume18Label"; + this.volume18Label.Size = new System.Drawing.Size(53, 13); + this.volume18Label.TabIndex = 159; + this.volume18Label.Text = "volume18"; + this.volume18Label.Visible = false; + // + // passed15Label + // + this.passed15Label.AutoSize = true; + this.passed15Label.Location = new System.Drawing.Point(1049, 634); + this.passed15Label.Name = "passed15Label"; + this.passed15Label.Size = new System.Drawing.Size(53, 13); + this.passed15Label.TabIndex = 173; + this.passed15Label.Text = "passed15"; + this.passed15Label.Visible = false; + // + // error16Label + // + this.error16Label.AutoSize = true; + this.error16Label.Location = new System.Drawing.Point(1118, 616); + this.error16Label.Name = "error16Label"; + this.error16Label.Size = new System.Drawing.Size(40, 13); + this.error16Label.TabIndex = 165; + this.error16Label.Text = "error16"; + this.error16Label.Visible = false; + // + // volume17Label + // + this.volume17Label.AutoSize = true; + this.volume17Label.Location = new System.Drawing.Point(1189, 597); + this.volume17Label.Name = "volume17Label"; + this.volume17Label.Size = new System.Drawing.Size(53, 13); + this.volume17Label.TabIndex = 160; + this.volume17Label.Text = "volume17"; + this.volume17Label.Visible = false; + // + // passed14Label + // + this.passed14Label.AutoSize = true; + this.passed14Label.Location = new System.Drawing.Point(979, 634); + this.passed14Label.Name = "passed14Label"; + this.passed14Label.Size = new System.Drawing.Size(53, 13); + this.passed14Label.TabIndex = 171; + this.passed14Label.Text = "passed14"; + this.passed14Label.Visible = false; + // + // refPulses18Label + // + this.refPulses18Label.AutoSize = true; + this.refPulses18Label.Location = new System.Drawing.Point(1259, 579); + this.refPulses18Label.Name = "refPulses18Label"; + this.refPulses18Label.Size = new System.Drawing.Size(62, 13); + this.refPulses18Label.TabIndex = 149; + this.refPulses18Label.Text = "refPulses18"; + this.refPulses18Label.Visible = false; + // + // error15Label + // + this.error15Label.AutoSize = true; + this.error15Label.Location = new System.Drawing.Point(1049, 616); + this.error15Label.Name = "error15Label"; + this.error15Label.Size = new System.Drawing.Size(40, 13); + this.error15Label.TabIndex = 166; + this.error15Label.Text = "error15"; + this.error15Label.Visible = false; + // + // pulses18Label + // + this.pulses18Label.AutoSize = true; + this.pulses18Label.Location = new System.Drawing.Point(1259, 560); + this.pulses18Label.Name = "pulses18Label"; + this.pulses18Label.Size = new System.Drawing.Size(49, 13); + this.pulses18Label.TabIndex = 144; + this.pulses18Label.Text = "pulses18"; + this.pulses18Label.Visible = false; + // + // sensor18Label + // + this.sensor18Label.AutoSize = true; + this.sensor18Label.Location = new System.Drawing.Point(1259, 542); + this.sensor18Label.Name = "sensor18Label"; + this.sensor18Label.Size = new System.Drawing.Size(50, 13); + this.sensor18Label.TabIndex = 140; + this.sensor18Label.Text = "sensor18"; + this.sensor18Label.Visible = false; + // + // volume16Label + // + this.volume16Label.AutoSize = true; + this.volume16Label.Location = new System.Drawing.Point(1118, 597); + this.volume16Label.Name = "volume16Label"; + this.volume16Label.Size = new System.Drawing.Size(53, 13); + this.volume16Label.TabIndex = 156; + this.volume16Label.Text = "volume16"; + this.volume16Label.Visible = false; + // + // passed13Label + // + this.passed13Label.AutoSize = true; + this.passed13Label.Location = new System.Drawing.Point(909, 634); + this.passed13Label.Name = "passed13Label"; + this.passed13Label.Size = new System.Drawing.Size(53, 13); + this.passed13Label.TabIndex = 172; + this.passed13Label.Text = "passed13"; + this.passed13Label.Visible = false; + // + // refPulses17Label + // + this.refPulses17Label.AutoSize = true; + this.refPulses17Label.Location = new System.Drawing.Point(1189, 579); + this.refPulses17Label.Name = "refPulses17Label"; + this.refPulses17Label.Size = new System.Drawing.Size(62, 13); + this.refPulses17Label.TabIndex = 151; + this.refPulses17Label.Text = "refPulses17"; + this.refPulses17Label.Visible = false; + // + // pulses17Label + // + this.pulses17Label.AutoSize = true; + this.pulses17Label.Location = new System.Drawing.Point(1189, 560); + this.pulses17Label.Name = "pulses17Label"; + this.pulses17Label.Size = new System.Drawing.Size(49, 13); + this.pulses17Label.TabIndex = 142; + this.pulses17Label.Text = "pulses17"; + this.pulses17Label.Visible = false; + // + // error14Label + // + this.error14Label.AutoSize = true; + this.error14Label.Location = new System.Drawing.Point(979, 616); + this.error14Label.Name = "error14Label"; + this.error14Label.Size = new System.Drawing.Size(40, 13); + this.error14Label.TabIndex = 164; + this.error14Label.Text = "error14"; + this.error14Label.Visible = false; + // + // sensor17Label + // + this.sensor17Label.AutoSize = true; + this.sensor17Label.Location = new System.Drawing.Point(1189, 542); + this.sensor17Label.Name = "sensor17Label"; + this.sensor17Label.Size = new System.Drawing.Size(50, 13); + this.sensor17Label.TabIndex = 139; + this.sensor17Label.Text = "sensor17"; + this.sensor17Label.Visible = false; + // + // volume15Label + // + this.volume15Label.AutoSize = true; + this.volume15Label.Location = new System.Drawing.Point(1049, 597); + this.volume15Label.Name = "volume15Label"; + this.volume15Label.Size = new System.Drawing.Size(53, 13); + this.volume15Label.TabIndex = 158; + this.volume15Label.Text = "volume15"; + this.volume15Label.Visible = false; + // + // refPulses16Label + // + this.refPulses16Label.AutoSize = true; + this.refPulses16Label.Location = new System.Drawing.Point(1118, 579); + this.refPulses16Label.Name = "refPulses16Label"; + this.refPulses16Label.Size = new System.Drawing.Size(62, 13); + this.refPulses16Label.TabIndex = 147; + this.refPulses16Label.Text = "refPulses16"; + this.refPulses16Label.Visible = false; + // + // label104 + // + this.label104.AutoSize = true; + this.label104.Location = new System.Drawing.Point(18, 247); + this.label104.Name = "label104"; + this.label104.Size = new System.Drawing.Size(43, 13); + this.label104.TabIndex = 175; + this.label104.Text = "Sensor:"; + // + // pulses16Label + // + this.pulses16Label.AutoSize = true; + this.pulses16Label.Location = new System.Drawing.Point(1118, 560); + this.pulses16Label.Name = "pulses16Label"; + this.pulses16Label.Size = new System.Drawing.Size(49, 13); + this.pulses16Label.TabIndex = 143; + this.pulses16Label.Text = "pulses16"; + this.pulses16Label.Visible = false; + // + // volume14Label + // + this.volume14Label.AutoSize = true; + this.volume14Label.Location = new System.Drawing.Point(979, 597); + this.volume14Label.Name = "volume14Label"; + this.volume14Label.Size = new System.Drawing.Size(53, 13); + this.volume14Label.TabIndex = 161; + this.volume14Label.Text = "volume14"; + this.volume14Label.Visible = false; + // + // sensor16Label + // + this.sensor16Label.AutoSize = true; + this.sensor16Label.Location = new System.Drawing.Point(1118, 542); + this.sensor16Label.Name = "sensor16Label"; + this.sensor16Label.Size = new System.Drawing.Size(50, 13); + this.sensor16Label.TabIndex = 137; + this.sensor16Label.Text = "sensor16"; + this.sensor16Label.Visible = false; + // + // error13Label + // + this.error13Label.AutoSize = true; + this.error13Label.Location = new System.Drawing.Point(909, 616); + this.error13Label.Name = "error13Label"; + this.error13Label.Size = new System.Drawing.Size(40, 13); + this.error13Label.TabIndex = 168; + this.error13Label.Text = "error13"; + this.error13Label.Visible = false; + // + // refPulses15Label + // + this.refPulses15Label.AutoSize = true; + this.refPulses15Label.Location = new System.Drawing.Point(1049, 579); + this.refPulses15Label.Name = "refPulses15Label"; + this.refPulses15Label.Size = new System.Drawing.Size(62, 13); + this.refPulses15Label.TabIndex = 148; + this.refPulses15Label.Text = "refPulses15"; + this.refPulses15Label.Visible = false; + // + // volume13Label + // + this.volume13Label.AutoSize = true; + this.volume13Label.Location = new System.Drawing.Point(909, 597); + this.volume13Label.Name = "volume13Label"; + this.volume13Label.Size = new System.Drawing.Size(53, 13); + this.volume13Label.TabIndex = 157; + this.volume13Label.Text = "volume13"; + this.volume13Label.Visible = false; + // + // pulses15Label + // + this.pulses15Label.AutoSize = true; + this.pulses15Label.Location = new System.Drawing.Point(1049, 560); + this.pulses15Label.Name = "pulses15Label"; + this.pulses15Label.Size = new System.Drawing.Size(49, 13); + this.pulses15Label.TabIndex = 141; + this.pulses15Label.Text = "pulses15"; + this.pulses15Label.Visible = false; + // + // sensor15Label + // + this.sensor15Label.AutoSize = true; + this.sensor15Label.Location = new System.Drawing.Point(1049, 542); + this.sensor15Label.Name = "sensor15Label"; + this.sensor15Label.Size = new System.Drawing.Size(50, 13); + this.sensor15Label.TabIndex = 138; + this.sensor15Label.Text = "sensor15"; + this.sensor15Label.Visible = false; + // + // refPulses13Label + // + this.refPulses13Label.AutoSize = true; + this.refPulses13Label.Location = new System.Drawing.Point(909, 579); + this.refPulses13Label.Name = "refPulses13Label"; + this.refPulses13Label.Size = new System.Drawing.Size(62, 13); + this.refPulses13Label.TabIndex = 152; + this.refPulses13Label.Text = "refPulses13"; + this.refPulses13Label.Visible = false; + // + // refPulses14Label + // + this.refPulses14Label.AutoSize = true; + this.refPulses14Label.Location = new System.Drawing.Point(979, 579); + this.refPulses14Label.Name = "refPulses14Label"; + this.refPulses14Label.Size = new System.Drawing.Size(62, 13); + this.refPulses14Label.TabIndex = 150; + this.refPulses14Label.Text = "refPulses14"; + this.refPulses14Label.Visible = false; + // + // pulses14Label + // + this.pulses14Label.AutoSize = true; + this.pulses14Label.Location = new System.Drawing.Point(979, 560); + this.pulses14Label.Name = "pulses14Label"; + this.pulses14Label.Size = new System.Drawing.Size(49, 13); + this.pulses14Label.TabIndex = 146; + this.pulses14Label.Text = "pulses14"; + this.pulses14Label.Visible = false; + // + // pulses13Label + // + this.pulses13Label.AutoSize = true; + this.pulses13Label.Location = new System.Drawing.Point(909, 560); + this.pulses13Label.Name = "pulses13Label"; + this.pulses13Label.Size = new System.Drawing.Size(49, 13); + this.pulses13Label.TabIndex = 145; + this.pulses13Label.Text = "pulses13"; + this.pulses13Label.Visible = false; + // + // sensor14Label + // + this.sensor14Label.AutoSize = true; + this.sensor14Label.Location = new System.Drawing.Point(979, 542); + this.sensor14Label.Name = "sensor14Label"; + this.sensor14Label.Size = new System.Drawing.Size(50, 13); + this.sensor14Label.TabIndex = 135; + this.sensor14Label.Text = "sensor14"; + this.sensor14Label.Visible = false; + // + // sensor13Label + // + this.sensor13Label.AutoSize = true; + this.sensor13Label.Location = new System.Drawing.Point(909, 542); + this.sensor13Label.Name = "sensor13Label"; + this.sensor13Label.Size = new System.Drawing.Size(50, 13); + this.sensor13Label.TabIndex = 136; + this.sensor13Label.Text = "sensor13"; + this.sensor13Label.Visible = false; + // + // label119 + // + this.label119.AutoSize = true; + this.label119.Location = new System.Drawing.Point(12, 321); + this.label119.Name = "label119"; + this.label119.Size = new System.Drawing.Size(49, 13); + this.label119.TabIndex = 162; + this.label119.Text = "Error [%]:"; + // + // label120 + // + this.label120.AutoSize = true; + this.label120.Location = new System.Drawing.Point(16, 302); + this.label120.Name = "label120"; + this.label120.Size = new System.Drawing.Size(45, 13); + this.label120.TabIndex = 155; + this.label120.Text = "Volume:"; + // + // label121 + // + this.label121.AutoSize = true; + this.label121.Location = new System.Drawing.Point(1, 284); + this.label121.Name = "label121"; + this.label121.Size = new System.Drawing.Size(60, 13); + this.label121.TabIndex = 154; + this.label121.Text = "Ref. count:"; + // + // label122 + // + this.label122.AutoSize = true; + this.label122.Location = new System.Drawing.Point(23, 265); + this.label122.Name = "label122"; + this.label122.Size = new System.Drawing.Size(38, 13); + this.label122.TabIndex = 153; + this.label122.Text = "Count:"; + // + // meter40Label + // + this.meter40Label.AutoSize = true; + this.meter40Label.Location = new System.Drawing.Point(1399, 229); + this.meter40Label.Name = "meter40Label"; + this.meter40Label.Size = new System.Drawing.Size(49, 13); + this.meter40Label.TabIndex = 335; + this.meter40Label.Text = "Meter 40"; + this.meter40Label.Visible = false; + // + // meter39Label + // + this.meter39Label.AutoSize = true; + this.meter39Label.Location = new System.Drawing.Point(1329, 229); + this.meter39Label.Name = "meter39Label"; + this.meter39Label.Size = new System.Drawing.Size(49, 13); + this.meter39Label.TabIndex = 334; + this.meter39Label.Text = "Meter 39"; + this.meter39Label.Visible = false; + // + // passed40Label + // + this.passed40Label.AutoSize = true; + this.passed40Label.Location = new System.Drawing.Point(1399, 339); + this.passed40Label.Name = "passed40Label"; + this.passed40Label.Size = new System.Drawing.Size(53, 13); + this.passed40Label.TabIndex = 332; + this.passed40Label.Text = "passed40"; + this.passed40Label.Visible = false; + // + // passed39Label + // + this.passed39Label.AutoSize = true; + this.passed39Label.Location = new System.Drawing.Point(1329, 339); + this.passed39Label.Name = "passed39Label"; + this.passed39Label.Size = new System.Drawing.Size(53, 13); + this.passed39Label.TabIndex = 333; + this.passed39Label.Text = "passed39"; + this.passed39Label.Visible = false; + // + // error40Label + // + this.error40Label.AutoSize = true; + this.error40Label.Location = new System.Drawing.Point(1399, 321); + this.error40Label.Name = "error40Label"; + this.error40Label.Size = new System.Drawing.Size(40, 13); + this.error40Label.TabIndex = 330; + this.error40Label.Text = "error40"; + this.error40Label.Visible = false; + // + // volume40Label + // + this.volume40Label.AutoSize = true; + this.volume40Label.Location = new System.Drawing.Point(1399, 302); + this.volume40Label.Name = "volume40Label"; + this.volume40Label.Size = new System.Drawing.Size(53, 13); + this.volume40Label.TabIndex = 329; + this.volume40Label.Text = "volume40"; + this.volume40Label.Visible = false; + // + // error39Label + // + this.error39Label.AutoSize = true; + this.error39Label.Location = new System.Drawing.Point(1329, 321); + this.error39Label.Name = "error39Label"; + this.error39Label.Size = new System.Drawing.Size(40, 13); + this.error39Label.TabIndex = 331; + this.error39Label.Text = "error39"; + this.error39Label.Visible = false; + // + // volume39Label + // + this.volume39Label.AutoSize = true; + this.volume39Label.Location = new System.Drawing.Point(1329, 302); + this.volume39Label.Name = "volume39Label"; + this.volume39Label.Size = new System.Drawing.Size(53, 13); + this.volume39Label.TabIndex = 328; + this.volume39Label.Text = "volume39"; + this.volume39Label.Visible = false; + // + // refPulses39Label + // + this.refPulses39Label.AutoSize = true; + this.refPulses39Label.Location = new System.Drawing.Point(1329, 284); + this.refPulses39Label.Name = "refPulses39Label"; + this.refPulses39Label.Size = new System.Drawing.Size(62, 13); + this.refPulses39Label.TabIndex = 327; + this.refPulses39Label.Text = "refPulses39"; + this.refPulses39Label.Visible = false; + // + // refPulses40Label + // + this.refPulses40Label.AutoSize = true; + this.refPulses40Label.Location = new System.Drawing.Point(1399, 284); + this.refPulses40Label.Name = "refPulses40Label"; + this.refPulses40Label.Size = new System.Drawing.Size(62, 13); + this.refPulses40Label.TabIndex = 326; + this.refPulses40Label.Text = "refPulses40"; + this.refPulses40Label.Visible = false; + // + // pulses40Label + // + this.pulses40Label.AutoSize = true; + this.pulses40Label.Location = new System.Drawing.Point(1399, 265); + this.pulses40Label.Name = "pulses40Label"; + this.pulses40Label.Size = new System.Drawing.Size(49, 13); + this.pulses40Label.TabIndex = 325; + this.pulses40Label.Text = "pulses40"; + this.pulses40Label.Visible = false; + // + // pulses39Label + // + this.pulses39Label.AutoSize = true; + this.pulses39Label.Location = new System.Drawing.Point(1329, 265); + this.pulses39Label.Name = "pulses39Label"; + this.pulses39Label.Size = new System.Drawing.Size(49, 13); + this.pulses39Label.TabIndex = 324; + this.pulses39Label.Text = "pulses39"; + this.pulses39Label.Visible = false; + // + // sensor40Label + // + this.sensor40Label.AutoSize = true; + this.sensor40Label.Location = new System.Drawing.Point(1399, 247); + this.sensor40Label.Name = "sensor40Label"; + this.sensor40Label.Size = new System.Drawing.Size(50, 13); + this.sensor40Label.TabIndex = 322; + this.sensor40Label.Text = "sensor40"; + this.sensor40Label.Visible = false; + // + // sensor39Label + // + this.sensor39Label.AutoSize = true; + this.sensor39Label.Location = new System.Drawing.Point(1329, 247); + this.sensor39Label.Name = "sensor39Label"; + this.sensor39Label.Size = new System.Drawing.Size(50, 13); + this.sensor39Label.TabIndex = 323; + this.sensor39Label.Text = "sensor39"; + this.sensor39Label.Visible = false; + // + // meter38Label + // + this.meter38Label.AutoSize = true; + this.meter38Label.Location = new System.Drawing.Point(1259, 229); + this.meter38Label.Name = "meter38Label"; + this.meter38Label.Size = new System.Drawing.Size(49, 13); + this.meter38Label.TabIndex = 321; + this.meter38Label.Text = "Meter 38"; + this.meter38Label.Visible = false; + // + // meter37Label + // + this.meter37Label.AutoSize = true; + this.meter37Label.Location = new System.Drawing.Point(1189, 229); + this.meter37Label.Name = "meter37Label"; + this.meter37Label.Size = new System.Drawing.Size(49, 13); + this.meter37Label.TabIndex = 320; + this.meter37Label.Text = "Meter 37"; + this.meter37Label.Visible = false; + // + // meter36Label + // + this.meter36Label.AutoSize = true; + this.meter36Label.Location = new System.Drawing.Point(1119, 229); + this.meter36Label.Name = "meter36Label"; + this.meter36Label.Size = new System.Drawing.Size(49, 13); + this.meter36Label.TabIndex = 319; + this.meter36Label.Text = "Meter 36"; + this.meter36Label.Visible = false; + // + // meter35Label + // + this.meter35Label.AutoSize = true; + this.meter35Label.Location = new System.Drawing.Point(1049, 229); + this.meter35Label.Name = "meter35Label"; + this.meter35Label.Size = new System.Drawing.Size(49, 13); + this.meter35Label.TabIndex = 318; + this.meter35Label.Text = "Meter 35"; + this.meter35Label.Visible = false; + // + // meter34Label + // + this.meter34Label.AutoSize = true; + this.meter34Label.Location = new System.Drawing.Point(979, 229); + this.meter34Label.Name = "meter34Label"; + this.meter34Label.Size = new System.Drawing.Size(49, 13); + this.meter34Label.TabIndex = 317; + this.meter34Label.Text = "Meter 34"; + this.meter34Label.Visible = false; + // + // meter33Label + // + this.meter33Label.AutoSize = true; + this.meter33Label.Location = new System.Drawing.Point(909, 229); + this.meter33Label.Name = "meter33Label"; + this.meter33Label.Size = new System.Drawing.Size(49, 13); + this.meter33Label.TabIndex = 316; + this.meter33Label.Text = "Meter 33"; + this.meter33Label.Visible = false; + // + // passed38Label + // + this.passed38Label.AutoSize = true; + this.passed38Label.Location = new System.Drawing.Point(1259, 339); + this.passed38Label.Name = "passed38Label"; + this.passed38Label.Size = new System.Drawing.Size(53, 13); + this.passed38Label.TabIndex = 315; + this.passed38Label.Text = "passed38"; + this.passed38Label.Visible = false; + // + // passed37Label + // + this.passed37Label.AutoSize = true; + this.passed37Label.Location = new System.Drawing.Point(1189, 339); + this.passed37Label.Name = "passed37Label"; + this.passed37Label.Size = new System.Drawing.Size(53, 13); + this.passed37Label.TabIndex = 310; + this.passed37Label.Text = "passed37"; + this.passed37Label.Visible = false; + // + // error38Label + // + this.error38Label.AutoSize = true; + this.error38Label.Location = new System.Drawing.Point(1259, 321); + this.error38Label.Name = "error38Label"; + this.error38Label.Size = new System.Drawing.Size(40, 13); + this.error38Label.TabIndex = 308; + this.error38Label.Text = "error38"; + this.error38Label.Visible = false; + // + // passed36Label + // + this.passed36Label.AutoSize = true; + this.passed36Label.Location = new System.Drawing.Point(1118, 339); + this.passed36Label.Name = "passed36Label"; + this.passed36Label.Size = new System.Drawing.Size(53, 13); + this.passed36Label.TabIndex = 311; + this.passed36Label.Text = "passed36"; + this.passed36Label.Visible = false; + // + // error37Label + // + this.error37Label.AutoSize = true; + this.error37Label.Location = new System.Drawing.Point(1189, 321); + this.error37Label.Name = "error37Label"; + this.error37Label.Size = new System.Drawing.Size(40, 13); + this.error37Label.TabIndex = 304; + this.error37Label.Text = "error37"; + this.error37Label.Visible = false; + // + // volume38Label + // + this.volume38Label.AutoSize = true; + this.volume38Label.Location = new System.Drawing.Point(1259, 302); + this.volume38Label.Name = "volume38Label"; + this.volume38Label.Size = new System.Drawing.Size(53, 13); + this.volume38Label.TabIndex = 301; + this.volume38Label.Text = "volume38"; + this.volume38Label.Visible = false; + // + // passed35Label + // + this.passed35Label.AutoSize = true; + this.passed35Label.Location = new System.Drawing.Point(1049, 339); + this.passed35Label.Name = "passed35Label"; + this.passed35Label.Size = new System.Drawing.Size(53, 13); + this.passed35Label.TabIndex = 314; + this.passed35Label.Text = "passed35"; + this.passed35Label.Visible = false; + // + // error36Label + // + this.error36Label.AutoSize = true; + this.error36Label.Location = new System.Drawing.Point(1118, 321); + this.error36Label.Name = "error36Label"; + this.error36Label.Size = new System.Drawing.Size(40, 13); + this.error36Label.TabIndex = 306; + this.error36Label.Text = "error36"; + this.error36Label.Visible = false; + // + // volume37Label + // + this.volume37Label.AutoSize = true; + this.volume37Label.Location = new System.Drawing.Point(1189, 302); + this.volume37Label.Name = "volume37Label"; + this.volume37Label.Size = new System.Drawing.Size(53, 13); + this.volume37Label.TabIndex = 302; + this.volume37Label.Text = "volume37"; + this.volume37Label.Visible = false; + // + // passed34Label + // + this.passed34Label.AutoSize = true; + this.passed34Label.Location = new System.Drawing.Point(979, 339); + this.passed34Label.Name = "passed34Label"; + this.passed34Label.Size = new System.Drawing.Size(53, 13); + this.passed34Label.TabIndex = 312; + this.passed34Label.Text = "passed34"; + this.passed34Label.Visible = false; + // + // refPulses38Label + // + this.refPulses38Label.AutoSize = true; + this.refPulses38Label.Location = new System.Drawing.Point(1259, 284); + this.refPulses38Label.Name = "refPulses38Label"; + this.refPulses38Label.Size = new System.Drawing.Size(62, 13); + this.refPulses38Label.TabIndex = 294; + this.refPulses38Label.Text = "refPulses38"; + this.refPulses38Label.Visible = false; + // + // error35Label + // + this.error35Label.AutoSize = true; + this.error35Label.Location = new System.Drawing.Point(1049, 321); + this.error35Label.Name = "error35Label"; + this.error35Label.Size = new System.Drawing.Size(40, 13); + this.error35Label.TabIndex = 307; + this.error35Label.Text = "error35"; + this.error35Label.Visible = false; + // + // pulses38Label + // + this.pulses38Label.AutoSize = true; + this.pulses38Label.Location = new System.Drawing.Point(1259, 265); + this.pulses38Label.Name = "pulses38Label"; + this.pulses38Label.Size = new System.Drawing.Size(49, 13); + this.pulses38Label.TabIndex = 289; + this.pulses38Label.Text = "pulses38"; + this.pulses38Label.Visible = false; + // + // sensor38Label + // + this.sensor38Label.AutoSize = true; + this.sensor38Label.Location = new System.Drawing.Point(1259, 247); + this.sensor38Label.Name = "sensor38Label"; + this.sensor38Label.Size = new System.Drawing.Size(50, 13); + this.sensor38Label.TabIndex = 285; + this.sensor38Label.Text = "sensor38"; + this.sensor38Label.Visible = false; + // + // volume36Label + // + this.volume36Label.AutoSize = true; + this.volume36Label.Location = new System.Drawing.Point(1118, 302); + this.volume36Label.Name = "volume36Label"; + this.volume36Label.Size = new System.Drawing.Size(53, 13); + this.volume36Label.TabIndex = 298; + this.volume36Label.Text = "volume36"; + this.volume36Label.Visible = false; + // + // passed33Label + // + this.passed33Label.AutoSize = true; + this.passed33Label.Location = new System.Drawing.Point(909, 339); + this.passed33Label.Name = "passed33Label"; + this.passed33Label.Size = new System.Drawing.Size(53, 13); + this.passed33Label.TabIndex = 313; + this.passed33Label.Text = "passed33"; + this.passed33Label.Visible = false; + // + // refPulses37Label + // + this.refPulses37Label.AutoSize = true; + this.refPulses37Label.Location = new System.Drawing.Point(1189, 284); + this.refPulses37Label.Name = "refPulses37Label"; + this.refPulses37Label.Size = new System.Drawing.Size(62, 13); + this.refPulses37Label.TabIndex = 296; + this.refPulses37Label.Text = "refPulses37"; + this.refPulses37Label.Visible = false; + // + // pulses37Label + // + this.pulses37Label.AutoSize = true; + this.pulses37Label.Location = new System.Drawing.Point(1189, 265); + this.pulses37Label.Name = "pulses37Label"; + this.pulses37Label.Size = new System.Drawing.Size(49, 13); + this.pulses37Label.TabIndex = 287; + this.pulses37Label.Text = "pulses37"; + this.pulses37Label.Visible = false; + // + // error34Label + // + this.error34Label.AutoSize = true; + this.error34Label.Location = new System.Drawing.Point(979, 321); + this.error34Label.Name = "error34Label"; + this.error34Label.Size = new System.Drawing.Size(40, 13); + this.error34Label.TabIndex = 305; + this.error34Label.Text = "error34"; + this.error34Label.Visible = false; + // + // sensor37Label + // + this.sensor37Label.AutoSize = true; + this.sensor37Label.Location = new System.Drawing.Point(1189, 247); + this.sensor37Label.Name = "sensor37Label"; + this.sensor37Label.Size = new System.Drawing.Size(50, 13); + this.sensor37Label.TabIndex = 284; + this.sensor37Label.Text = "sensor37"; + this.sensor37Label.Visible = false; + // + // volume35Label + // + this.volume35Label.AutoSize = true; + this.volume35Label.Location = new System.Drawing.Point(1049, 302); + this.volume35Label.Name = "volume35Label"; + this.volume35Label.Size = new System.Drawing.Size(53, 13); + this.volume35Label.TabIndex = 300; + this.volume35Label.Text = "volume35"; + this.volume35Label.Visible = false; + // + // refPulses36Label + // + this.refPulses36Label.AutoSize = true; + this.refPulses36Label.Location = new System.Drawing.Point(1118, 284); + this.refPulses36Label.Name = "refPulses36Label"; + this.refPulses36Label.Size = new System.Drawing.Size(62, 13); + this.refPulses36Label.TabIndex = 292; + this.refPulses36Label.Text = "refPulses36"; + this.refPulses36Label.Visible = false; + // + // pulses36Label + // + this.pulses36Label.AutoSize = true; + this.pulses36Label.Location = new System.Drawing.Point(1118, 265); + this.pulses36Label.Name = "pulses36Label"; + this.pulses36Label.Size = new System.Drawing.Size(49, 13); + this.pulses36Label.TabIndex = 288; + this.pulses36Label.Text = "pulses36"; + this.pulses36Label.Visible = false; + // + // volume34Label + // + this.volume34Label.AutoSize = true; + this.volume34Label.Location = new System.Drawing.Point(979, 302); + this.volume34Label.Name = "volume34Label"; + this.volume34Label.Size = new System.Drawing.Size(53, 13); + this.volume34Label.TabIndex = 303; + this.volume34Label.Text = "volume34"; + this.volume34Label.Visible = false; + // + // sensor36Label + // + this.sensor36Label.AutoSize = true; + this.sensor36Label.Location = new System.Drawing.Point(1118, 247); + this.sensor36Label.Name = "sensor36Label"; + this.sensor36Label.Size = new System.Drawing.Size(50, 13); + this.sensor36Label.TabIndex = 282; + this.sensor36Label.Text = "sensor36"; + this.sensor36Label.Visible = false; + // + // error33Label + // + this.error33Label.AutoSize = true; + this.error33Label.Location = new System.Drawing.Point(909, 321); + this.error33Label.Name = "error33Label"; + this.error33Label.Size = new System.Drawing.Size(40, 13); + this.error33Label.TabIndex = 309; + this.error33Label.Text = "error33"; + this.error33Label.Visible = false; + // + // refPulses35Label + // + this.refPulses35Label.AutoSize = true; + this.refPulses35Label.Location = new System.Drawing.Point(1049, 284); + this.refPulses35Label.Name = "refPulses35Label"; + this.refPulses35Label.Size = new System.Drawing.Size(62, 13); + this.refPulses35Label.TabIndex = 293; + this.refPulses35Label.Text = "refPulses35"; + this.refPulses35Label.Visible = false; + // + // volume33Label + // + this.volume33Label.AutoSize = true; + this.volume33Label.Location = new System.Drawing.Point(909, 302); + this.volume33Label.Name = "volume33Label"; + this.volume33Label.Size = new System.Drawing.Size(53, 13); + this.volume33Label.TabIndex = 299; + this.volume33Label.Text = "volume33"; + this.volume33Label.Visible = false; + // + // pulses35Label + // + this.pulses35Label.AutoSize = true; + this.pulses35Label.Location = new System.Drawing.Point(1049, 265); + this.pulses35Label.Name = "pulses35Label"; + this.pulses35Label.Size = new System.Drawing.Size(49, 13); + this.pulses35Label.TabIndex = 286; + this.pulses35Label.Text = "pulses35"; + this.pulses35Label.Visible = false; + // + // sensor35Label + // + this.sensor35Label.AutoSize = true; + this.sensor35Label.Location = new System.Drawing.Point(1049, 247); + this.sensor35Label.Name = "sensor35Label"; + this.sensor35Label.Size = new System.Drawing.Size(50, 13); + this.sensor35Label.TabIndex = 283; + this.sensor35Label.Text = "sensor35"; + this.sensor35Label.Visible = false; + // + // refPulses33Label + // + this.refPulses33Label.AutoSize = true; + this.refPulses33Label.Location = new System.Drawing.Point(909, 284); + this.refPulses33Label.Name = "refPulses33Label"; + this.refPulses33Label.Size = new System.Drawing.Size(62, 13); + this.refPulses33Label.TabIndex = 297; + this.refPulses33Label.Text = "refPulses33"; + this.refPulses33Label.Visible = false; + // + // refPulses34Label + // + this.refPulses34Label.AutoSize = true; + this.refPulses34Label.Location = new System.Drawing.Point(979, 284); + this.refPulses34Label.Name = "refPulses34Label"; + this.refPulses34Label.Size = new System.Drawing.Size(62, 13); + this.refPulses34Label.TabIndex = 295; + this.refPulses34Label.Text = "refPulses34"; + this.refPulses34Label.Visible = false; + // + // pulses34Label + // + this.pulses34Label.AutoSize = true; + this.pulses34Label.Location = new System.Drawing.Point(979, 265); + this.pulses34Label.Name = "pulses34Label"; + this.pulses34Label.Size = new System.Drawing.Size(49, 13); + this.pulses34Label.TabIndex = 291; + this.pulses34Label.Text = "pulses34"; + this.pulses34Label.Visible = false; + // + // pulses33Label + // + this.pulses33Label.AutoSize = true; + this.pulses33Label.Location = new System.Drawing.Point(909, 265); + this.pulses33Label.Name = "pulses33Label"; + this.pulses33Label.Size = new System.Drawing.Size(49, 13); + this.pulses33Label.TabIndex = 290; + this.pulses33Label.Text = "pulses33"; + this.pulses33Label.Visible = false; + // + // sensor34Label + // + this.sensor34Label.AutoSize = true; + this.sensor34Label.Location = new System.Drawing.Point(979, 247); + this.sensor34Label.Name = "sensor34Label"; + this.sensor34Label.Size = new System.Drawing.Size(50, 13); + this.sensor34Label.TabIndex = 280; + this.sensor34Label.Text = "sensor34"; + this.sensor34Label.Visible = false; + // + // sensor33Label + // + this.sensor33Label.AutoSize = true; + this.sensor33Label.Location = new System.Drawing.Point(909, 247); + this.sensor33Label.Name = "sensor33Label"; + this.sensor33Label.Size = new System.Drawing.Size(50, 13); + this.sensor33Label.TabIndex = 281; + this.sensor33Label.Text = "sensor33"; + this.sensor33Label.Visible = false; + // + // meter32Label + // + this.meter32Label.AutoSize = true; + this.meter32Label.Location = new System.Drawing.Point(834, 229); + this.meter32Label.Name = "meter32Label"; + this.meter32Label.Size = new System.Drawing.Size(49, 13); + this.meter32Label.TabIndex = 279; + this.meter32Label.Text = "Meter 32"; + this.meter32Label.Visible = false; + // + // meter31Label + // + this.meter31Label.AutoSize = true; + this.meter31Label.Location = new System.Drawing.Point(764, 229); + this.meter31Label.Name = "meter31Label"; + this.meter31Label.Size = new System.Drawing.Size(49, 13); + this.meter31Label.TabIndex = 278; + this.meter31Label.Text = "Meter 31"; + this.meter31Label.Visible = false; + // + // meter30Label + // + this.meter30Label.AutoSize = true; + this.meter30Label.Location = new System.Drawing.Point(694, 229); + this.meter30Label.Name = "meter30Label"; + this.meter30Label.Size = new System.Drawing.Size(49, 13); + this.meter30Label.TabIndex = 277; + this.meter30Label.Text = "Meter 30"; + this.meter30Label.Visible = false; + // + // meter29Label + // + this.meter29Label.AutoSize = true; + this.meter29Label.Location = new System.Drawing.Point(624, 229); + this.meter29Label.Name = "meter29Label"; + this.meter29Label.Size = new System.Drawing.Size(49, 13); + this.meter29Label.TabIndex = 276; + this.meter29Label.Text = "Meter 29"; + this.meter29Label.Visible = false; + // + // meter28Label + // + this.meter28Label.AutoSize = true; + this.meter28Label.Location = new System.Drawing.Point(554, 229); + this.meter28Label.Name = "meter28Label"; + this.meter28Label.Size = new System.Drawing.Size(49, 13); + this.meter28Label.TabIndex = 275; + this.meter28Label.Text = "Meter 28"; + this.meter28Label.Visible = false; + // + // meter27Label + // + this.meter27Label.AutoSize = true; + this.meter27Label.Location = new System.Drawing.Point(484, 229); + this.meter27Label.Name = "meter27Label"; + this.meter27Label.Size = new System.Drawing.Size(49, 13); + this.meter27Label.TabIndex = 274; + this.meter27Label.Text = "Meter 27"; + this.meter27Label.Visible = false; + // + // passed32Label + // + this.passed32Label.AutoSize = true; + this.passed32Label.Location = new System.Drawing.Point(834, 339); + this.passed32Label.Name = "passed32Label"; + this.passed32Label.Size = new System.Drawing.Size(53, 13); + this.passed32Label.TabIndex = 268; + this.passed32Label.Text = "passed32"; + this.passed32Label.Visible = false; + // + // passed31Label + // + this.passed31Label.AutoSize = true; + this.passed31Label.Location = new System.Drawing.Point(764, 339); + this.passed31Label.Name = "passed31Label"; + this.passed31Label.Size = new System.Drawing.Size(53, 13); + this.passed31Label.TabIndex = 269; + this.passed31Label.Text = "passed31"; + this.passed31Label.Visible = false; + // + // error32Label + // + this.error32Label.AutoSize = true; + this.error32Label.Location = new System.Drawing.Point(834, 321); + this.error32Label.Name = "error32Label"; + this.error32Label.Size = new System.Drawing.Size(40, 13); + this.error32Label.TabIndex = 263; + this.error32Label.Text = "error32"; + this.error32Label.Visible = false; + // + // passed30Label + // + this.passed30Label.AutoSize = true; + this.passed30Label.Location = new System.Drawing.Point(693, 339); + this.passed30Label.Name = "passed30Label"; + this.passed30Label.Size = new System.Drawing.Size(53, 13); + this.passed30Label.TabIndex = 270; + this.passed30Label.Text = "passed30"; + this.passed30Label.Visible = false; + // + // error31Label + // + this.error31Label.AutoSize = true; + this.error31Label.Location = new System.Drawing.Point(764, 321); + this.error31Label.Name = "error31Label"; + this.error31Label.Size = new System.Drawing.Size(40, 13); + this.error31Label.TabIndex = 264; + this.error31Label.Text = "error31"; + this.error31Label.Visible = false; + // + // volume32Label + // + this.volume32Label.AutoSize = true; + this.volume32Label.Location = new System.Drawing.Point(834, 302); + this.volume32Label.Name = "volume32Label"; + this.volume32Label.Size = new System.Drawing.Size(53, 13); + this.volume32Label.TabIndex = 259; + this.volume32Label.Text = "volume32"; + this.volume32Label.Visible = false; + // + // passed29Label + // + this.passed29Label.AutoSize = true; + this.passed29Label.Location = new System.Drawing.Point(624, 339); + this.passed29Label.Name = "passed29Label"; + this.passed29Label.Size = new System.Drawing.Size(53, 13); + this.passed29Label.TabIndex = 272; + this.passed29Label.Text = "passed29"; + this.passed29Label.Visible = false; + // + // error30Label + // + this.error30Label.AutoSize = true; + this.error30Label.Location = new System.Drawing.Point(693, 321); + this.error30Label.Name = "error30Label"; + this.error30Label.Size = new System.Drawing.Size(40, 13); + this.error30Label.TabIndex = 262; + this.error30Label.Text = "error30"; + this.error30Label.Visible = false; + // + // volume31Label + // + this.volume31Label.AutoSize = true; + this.volume31Label.Location = new System.Drawing.Point(764, 302); + this.volume31Label.Name = "volume31Label"; + this.volume31Label.Size = new System.Drawing.Size(53, 13); + this.volume31Label.TabIndex = 261; + this.volume31Label.Text = "volume31"; + this.volume31Label.Visible = false; + // + // passed28Label + // + this.passed28Label.AutoSize = true; + this.passed28Label.Location = new System.Drawing.Point(554, 339); + this.passed28Label.Name = "passed28Label"; + this.passed28Label.Size = new System.Drawing.Size(53, 13); + this.passed28Label.TabIndex = 271; + this.passed28Label.Text = "passed28"; + this.passed28Label.Visible = false; + // + // refPulses32Label + // + this.refPulses32Label.AutoSize = true; + this.refPulses32Label.Location = new System.Drawing.Point(834, 284); + this.refPulses32Label.Name = "refPulses32Label"; + this.refPulses32Label.Size = new System.Drawing.Size(62, 13); + this.refPulses32Label.TabIndex = 251; + this.refPulses32Label.Text = "refPulses32"; + this.refPulses32Label.Visible = false; + // + // error29Label + // + this.error29Label.AutoSize = true; + this.error29Label.Location = new System.Drawing.Point(624, 321); + this.error29Label.Name = "error29Label"; + this.error29Label.Size = new System.Drawing.Size(40, 13); + this.error29Label.TabIndex = 265; + this.error29Label.Text = "error29"; + this.error29Label.Visible = false; + // + // pulses32Label + // + this.pulses32Label.AutoSize = true; + this.pulses32Label.Location = new System.Drawing.Point(834, 265); + this.pulses32Label.Name = "pulses32Label"; + this.pulses32Label.Size = new System.Drawing.Size(49, 13); + this.pulses32Label.TabIndex = 247; + this.pulses32Label.Text = "pulses32"; + this.pulses32Label.Visible = false; + // + // sensor32Label + // + this.sensor32Label.AutoSize = true; + this.sensor32Label.Location = new System.Drawing.Point(834, 247); + this.sensor32Label.Name = "sensor32Label"; + this.sensor32Label.Size = new System.Drawing.Size(50, 13); + this.sensor32Label.TabIndex = 240; + this.sensor32Label.Text = "sensor32"; + this.sensor32Label.Visible = false; + // + // volume30Label + // + this.volume30Label.AutoSize = true; + this.volume30Label.Location = new System.Drawing.Point(693, 302); + this.volume30Label.Name = "volume30Label"; + this.volume30Label.Size = new System.Drawing.Size(53, 13); + this.volume30Label.TabIndex = 260; + this.volume30Label.Text = "volume30"; + this.volume30Label.Visible = false; + // + // passed27Label + // + this.passed27Label.AutoSize = true; + this.passed27Label.Location = new System.Drawing.Point(484, 339); + this.passed27Label.Name = "passed27Label"; + this.passed27Label.Size = new System.Drawing.Size(53, 13); + this.passed27Label.TabIndex = 273; + this.passed27Label.Text = "passed27"; + this.passed27Label.Visible = false; + // + // refPulses31Label + // + this.refPulses31Label.AutoSize = true; + this.refPulses31Label.Location = new System.Drawing.Point(764, 284); + this.refPulses31Label.Name = "refPulses31Label"; + this.refPulses31Label.Size = new System.Drawing.Size(62, 13); + this.refPulses31Label.TabIndex = 250; + this.refPulses31Label.Text = "refPulses31"; + this.refPulses31Label.Visible = false; + // + // pulses31Label + // + this.pulses31Label.AutoSize = true; + this.pulses31Label.Location = new System.Drawing.Point(764, 265); + this.pulses31Label.Name = "pulses31Label"; + this.pulses31Label.Size = new System.Drawing.Size(49, 13); + this.pulses31Label.TabIndex = 244; + this.pulses31Label.Text = "pulses31"; + this.pulses31Label.Visible = false; + // + // error28Label + // + this.error28Label.AutoSize = true; + this.error28Label.Location = new System.Drawing.Point(554, 321); + this.error28Label.Name = "error28Label"; + this.error28Label.Size = new System.Drawing.Size(40, 13); + this.error28Label.TabIndex = 266; + this.error28Label.Text = "error28"; + this.error28Label.Visible = false; + // + // sensor31Label + // + this.sensor31Label.AutoSize = true; + this.sensor31Label.Location = new System.Drawing.Point(764, 247); + this.sensor31Label.Name = "sensor31Label"; + this.sensor31Label.Size = new System.Drawing.Size(50, 13); + this.sensor31Label.TabIndex = 241; + this.sensor31Label.Text = "sensor31"; + this.sensor31Label.Visible = false; + // + // volume29Label + // + this.volume29Label.AutoSize = true; + this.volume29Label.Location = new System.Drawing.Point(624, 302); + this.volume29Label.Name = "volume29Label"; + this.volume29Label.Size = new System.Drawing.Size(53, 13); + this.volume29Label.TabIndex = 256; + this.volume29Label.Text = "volume29"; + this.volume29Label.Visible = false; + // + // refPulses30Label + // + this.refPulses30Label.AutoSize = true; + this.refPulses30Label.Location = new System.Drawing.Point(693, 284); + this.refPulses30Label.Name = "refPulses30Label"; + this.refPulses30Label.Size = new System.Drawing.Size(62, 13); + this.refPulses30Label.TabIndex = 255; + this.refPulses30Label.Text = "refPulses30"; + this.refPulses30Label.Visible = false; + // + // pulses30Label + // + this.pulses30Label.AutoSize = true; + this.pulses30Label.Location = new System.Drawing.Point(693, 265); + this.pulses30Label.Name = "pulses30Label"; + this.pulses30Label.Size = new System.Drawing.Size(49, 13); + this.pulses30Label.TabIndex = 245; + this.pulses30Label.Text = "pulses30"; + this.pulses30Label.Visible = false; + // + // volume28Label + // + this.volume28Label.AutoSize = true; + this.volume28Label.Location = new System.Drawing.Point(554, 302); + this.volume28Label.Name = "volume28Label"; + this.volume28Label.Size = new System.Drawing.Size(53, 13); + this.volume28Label.TabIndex = 258; + this.volume28Label.Text = "volume28"; + this.volume28Label.Visible = false; + // + // sensor30Label + // + this.sensor30Label.AutoSize = true; + this.sensor30Label.Location = new System.Drawing.Point(693, 247); + this.sensor30Label.Name = "sensor30Label"; + this.sensor30Label.Size = new System.Drawing.Size(50, 13); + this.sensor30Label.TabIndex = 238; + this.sensor30Label.Text = "sensor30"; + this.sensor30Label.Visible = false; + // + // error27Label + // + this.error27Label.AutoSize = true; + this.error27Label.Location = new System.Drawing.Point(484, 321); + this.error27Label.Name = "error27Label"; + this.error27Label.Size = new System.Drawing.Size(40, 13); + this.error27Label.TabIndex = 267; + this.error27Label.Text = "error27"; + this.error27Label.Visible = false; + // + // refPulses29Label + // + this.refPulses29Label.AutoSize = true; + this.refPulses29Label.Location = new System.Drawing.Point(624, 284); + this.refPulses29Label.Name = "refPulses29Label"; + this.refPulses29Label.Size = new System.Drawing.Size(62, 13); + this.refPulses29Label.TabIndex = 253; + this.refPulses29Label.Text = "refPulses29"; + this.refPulses29Label.Visible = false; + // + // volume27Label + // + this.volume27Label.AutoSize = true; + this.volume27Label.Location = new System.Drawing.Point(484, 302); + this.volume27Label.Name = "volume27Label"; + this.volume27Label.Size = new System.Drawing.Size(53, 13); + this.volume27Label.TabIndex = 257; + this.volume27Label.Text = "volume27"; + this.volume27Label.Visible = false; + // + // pulses29Label + // + this.pulses29Label.AutoSize = true; + this.pulses29Label.Location = new System.Drawing.Point(624, 265); + this.pulses29Label.Name = "pulses29Label"; + this.pulses29Label.Size = new System.Drawing.Size(49, 13); + this.pulses29Label.TabIndex = 249; + this.pulses29Label.Text = "pulses29"; + this.pulses29Label.Visible = false; + // + // sensor29Label + // + this.sensor29Label.AutoSize = true; + this.sensor29Label.Location = new System.Drawing.Point(624, 247); + this.sensor29Label.Name = "sensor29Label"; + this.sensor29Label.Size = new System.Drawing.Size(50, 13); + this.sensor29Label.TabIndex = 239; + this.sensor29Label.Text = "sensor29"; + this.sensor29Label.Visible = false; + // + // refPulses27Label + // + this.refPulses27Label.AutoSize = true; + this.refPulses27Label.Location = new System.Drawing.Point(484, 284); + this.refPulses27Label.Name = "refPulses27Label"; + this.refPulses27Label.Size = new System.Drawing.Size(62, 13); + this.refPulses27Label.TabIndex = 254; + this.refPulses27Label.Text = "refPulses27"; + this.refPulses27Label.Visible = false; + // + // refPulses28Label + // + this.refPulses28Label.AutoSize = true; + this.refPulses28Label.Location = new System.Drawing.Point(554, 284); + this.refPulses28Label.Name = "refPulses28Label"; + this.refPulses28Label.Size = new System.Drawing.Size(62, 13); + this.refPulses28Label.TabIndex = 252; + this.refPulses28Label.Text = "refPulses28"; + this.refPulses28Label.Visible = false; + // + // pulses28Label + // + this.pulses28Label.AutoSize = true; + this.pulses28Label.Location = new System.Drawing.Point(554, 265); + this.pulses28Label.Name = "pulses28Label"; + this.pulses28Label.Size = new System.Drawing.Size(49, 13); + this.pulses28Label.TabIndex = 248; + this.pulses28Label.Text = "pulses28"; + this.pulses28Label.Visible = false; + // + // pulses27Label + // + this.pulses27Label.AutoSize = true; + this.pulses27Label.Location = new System.Drawing.Point(484, 265); + this.pulses27Label.Name = "pulses27Label"; + this.pulses27Label.Size = new System.Drawing.Size(49, 13); + this.pulses27Label.TabIndex = 246; + this.pulses27Label.Text = "pulses27"; + this.pulses27Label.Visible = false; + // + // sensor28Label + // + this.sensor28Label.AutoSize = true; + this.sensor28Label.Location = new System.Drawing.Point(554, 247); + this.sensor28Label.Name = "sensor28Label"; + this.sensor28Label.Size = new System.Drawing.Size(50, 13); + this.sensor28Label.TabIndex = 242; + this.sensor28Label.Text = "sensor28"; + this.sensor28Label.Visible = false; + // + // sensor27Label + // + this.sensor27Label.AutoSize = true; + this.sensor27Label.Location = new System.Drawing.Point(484, 247); + this.sensor27Label.Name = "sensor27Label"; + this.sensor27Label.Size = new System.Drawing.Size(50, 13); + this.sensor27Label.TabIndex = 243; + this.sensor27Label.Text = "sensor27"; + this.sensor27Label.Visible = false; + // + // meter26Label + // + this.meter26Label.AutoSize = true; + this.meter26Label.Location = new System.Drawing.Point(414, 229); + this.meter26Label.Name = "meter26Label"; + this.meter26Label.Size = new System.Drawing.Size(49, 13); + this.meter26Label.TabIndex = 237; + this.meter26Label.Text = "Meter 26"; + this.meter26Label.Visible = false; + // + // meter25Label + // + this.meter25Label.AutoSize = true; + this.meter25Label.Location = new System.Drawing.Point(344, 229); + this.meter25Label.Name = "meter25Label"; + this.meter25Label.Size = new System.Drawing.Size(49, 13); + this.meter25Label.TabIndex = 236; + this.meter25Label.Text = "Meter 25"; + this.meter25Label.Visible = false; + // + // passed26Label + // + this.passed26Label.AutoSize = true; + this.passed26Label.Location = new System.Drawing.Point(414, 339); + this.passed26Label.Name = "passed26Label"; + this.passed26Label.Size = new System.Drawing.Size(53, 13); + this.passed26Label.TabIndex = 234; + this.passed26Label.Text = "passed26"; + this.passed26Label.Visible = false; + // + // passed25Label + // + this.passed25Label.AutoSize = true; + this.passed25Label.Location = new System.Drawing.Point(344, 339); + this.passed25Label.Name = "passed25Label"; + this.passed25Label.Size = new System.Drawing.Size(53, 13); + this.passed25Label.TabIndex = 235; + this.passed25Label.Text = "passed25"; + this.passed25Label.Visible = false; + // + // error26Label + // + this.error26Label.AutoSize = true; + this.error26Label.Location = new System.Drawing.Point(414, 321); + this.error26Label.Name = "error26Label"; + this.error26Label.Size = new System.Drawing.Size(40, 13); + this.error26Label.TabIndex = 232; + this.error26Label.Text = "error26"; + this.error26Label.Visible = false; + // + // error25Label + // + this.error25Label.AutoSize = true; + this.error25Label.Location = new System.Drawing.Point(344, 321); + this.error25Label.Name = "error25Label"; + this.error25Label.Size = new System.Drawing.Size(40, 13); + this.error25Label.TabIndex = 233; + this.error25Label.Text = "error25"; + this.error25Label.Visible = false; + // + // volume26Label + // + this.volume26Label.AutoSize = true; + this.volume26Label.Location = new System.Drawing.Point(414, 302); + this.volume26Label.Name = "volume26Label"; + this.volume26Label.Size = new System.Drawing.Size(53, 13); + this.volume26Label.TabIndex = 230; + this.volume26Label.Text = "volume26"; + this.volume26Label.Visible = false; + // + // volume25Label + // + this.volume25Label.AutoSize = true; + this.volume25Label.Location = new System.Drawing.Point(344, 302); + this.volume25Label.Name = "volume25Label"; + this.volume25Label.Size = new System.Drawing.Size(53, 13); + this.volume25Label.TabIndex = 231; + this.volume25Label.Text = "volume25"; + this.volume25Label.Visible = false; + // + // refPulses26Label + // + this.refPulses26Label.AutoSize = true; + this.refPulses26Label.Location = new System.Drawing.Point(414, 284); + this.refPulses26Label.Name = "refPulses26Label"; + this.refPulses26Label.Size = new System.Drawing.Size(62, 13); + this.refPulses26Label.TabIndex = 228; + this.refPulses26Label.Text = "refPulses26"; + this.refPulses26Label.Visible = false; + // + // pulses26Label + // + this.pulses26Label.AutoSize = true; + this.pulses26Label.Location = new System.Drawing.Point(414, 265); + this.pulses26Label.Name = "pulses26Label"; + this.pulses26Label.Size = new System.Drawing.Size(49, 13); + this.pulses26Label.TabIndex = 226; + this.pulses26Label.Text = "pulses26"; + this.pulses26Label.Visible = false; + // + // sensor26Label + // + this.sensor26Label.AutoSize = true; + this.sensor26Label.Location = new System.Drawing.Point(414, 247); + this.sensor26Label.Name = "sensor26Label"; + this.sensor26Label.Size = new System.Drawing.Size(50, 13); + this.sensor26Label.TabIndex = 224; + this.sensor26Label.Text = "sensor26"; + this.sensor26Label.Visible = false; + // + // refPulses25Label + // + this.refPulses25Label.AutoSize = true; + this.refPulses25Label.Location = new System.Drawing.Point(344, 284); + this.refPulses25Label.Name = "refPulses25Label"; + this.refPulses25Label.Size = new System.Drawing.Size(62, 13); + this.refPulses25Label.TabIndex = 229; + this.refPulses25Label.Text = "refPulses25"; + this.refPulses25Label.Visible = false; + // + // pulses25Label + // + this.pulses25Label.AutoSize = true; + this.pulses25Label.Location = new System.Drawing.Point(344, 265); + this.pulses25Label.Name = "pulses25Label"; + this.pulses25Label.Size = new System.Drawing.Size(49, 13); + this.pulses25Label.TabIndex = 227; + this.pulses25Label.Text = "pulses25"; + this.pulses25Label.Visible = false; + // + // sensor25Label + // + this.sensor25Label.AutoSize = true; + this.sensor25Label.Location = new System.Drawing.Point(344, 247); + this.sensor25Label.Name = "sensor25Label"; + this.sensor25Label.Size = new System.Drawing.Size(50, 13); + this.sensor25Label.TabIndex = 225; + this.sensor25Label.Text = "sensor25"; + this.sensor25Label.Visible = false; + // + // ProcessTabPageCtrl48 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.Control; + this.Controls.Add(this.meter40Label); + this.Controls.Add(this.meter39Label); + this.Controls.Add(this.passed40Label); + this.Controls.Add(this.passed39Label); + this.Controls.Add(this.error40Label); + this.Controls.Add(this.volume40Label); + this.Controls.Add(this.error39Label); + this.Controls.Add(this.volume39Label); + this.Controls.Add(this.refPulses39Label); + this.Controls.Add(this.refPulses40Label); + this.Controls.Add(this.pulses40Label); + this.Controls.Add(this.pulses39Label); + this.Controls.Add(this.sensor40Label); + this.Controls.Add(this.sensor39Label); + this.Controls.Add(this.meter38Label); + this.Controls.Add(this.meter37Label); + this.Controls.Add(this.meter36Label); + this.Controls.Add(this.meter35Label); + this.Controls.Add(this.meter34Label); + this.Controls.Add(this.meter33Label); + this.Controls.Add(this.passed38Label); + this.Controls.Add(this.passed37Label); + this.Controls.Add(this.error38Label); + this.Controls.Add(this.passed36Label); + this.Controls.Add(this.error37Label); + this.Controls.Add(this.volume38Label); + this.Controls.Add(this.passed35Label); + this.Controls.Add(this.error36Label); + this.Controls.Add(this.volume37Label); + this.Controls.Add(this.passed34Label); + this.Controls.Add(this.refPulses38Label); + this.Controls.Add(this.error35Label); + this.Controls.Add(this.pulses38Label); + this.Controls.Add(this.sensor38Label); + this.Controls.Add(this.volume36Label); + this.Controls.Add(this.passed33Label); + this.Controls.Add(this.refPulses37Label); + this.Controls.Add(this.pulses37Label); + this.Controls.Add(this.error34Label); + this.Controls.Add(this.sensor37Label); + this.Controls.Add(this.volume35Label); + this.Controls.Add(this.refPulses36Label); + this.Controls.Add(this.pulses36Label); + this.Controls.Add(this.volume34Label); + this.Controls.Add(this.sensor36Label); + this.Controls.Add(this.error33Label); + this.Controls.Add(this.refPulses35Label); + this.Controls.Add(this.volume33Label); + this.Controls.Add(this.pulses35Label); + this.Controls.Add(this.sensor35Label); + this.Controls.Add(this.refPulses33Label); + this.Controls.Add(this.refPulses34Label); + this.Controls.Add(this.pulses34Label); + this.Controls.Add(this.pulses33Label); + this.Controls.Add(this.sensor34Label); + this.Controls.Add(this.sensor33Label); + this.Controls.Add(this.meter32Label); + this.Controls.Add(this.meter31Label); + this.Controls.Add(this.meter30Label); + this.Controls.Add(this.meter29Label); + this.Controls.Add(this.meter28Label); + this.Controls.Add(this.meter27Label); + this.Controls.Add(this.passed32Label); + this.Controls.Add(this.passed31Label); + this.Controls.Add(this.error32Label); + this.Controls.Add(this.passed30Label); + this.Controls.Add(this.error31Label); + this.Controls.Add(this.volume32Label); + this.Controls.Add(this.passed29Label); + this.Controls.Add(this.error30Label); + this.Controls.Add(this.volume31Label); + this.Controls.Add(this.passed28Label); + this.Controls.Add(this.refPulses32Label); + this.Controls.Add(this.error29Label); + this.Controls.Add(this.pulses32Label); + this.Controls.Add(this.sensor32Label); + this.Controls.Add(this.volume30Label); + this.Controls.Add(this.passed27Label); + this.Controls.Add(this.refPulses31Label); + this.Controls.Add(this.pulses31Label); + this.Controls.Add(this.error28Label); + this.Controls.Add(this.sensor31Label); + this.Controls.Add(this.volume29Label); + this.Controls.Add(this.refPulses30Label); + this.Controls.Add(this.pulses30Label); + this.Controls.Add(this.volume28Label); + this.Controls.Add(this.sensor30Label); + this.Controls.Add(this.error27Label); + this.Controls.Add(this.refPulses29Label); + this.Controls.Add(this.volume27Label); + this.Controls.Add(this.pulses29Label); + this.Controls.Add(this.sensor29Label); + this.Controls.Add(this.refPulses27Label); + this.Controls.Add(this.refPulses28Label); + this.Controls.Add(this.pulses28Label); + this.Controls.Add(this.pulses27Label); + this.Controls.Add(this.sensor28Label); + this.Controls.Add(this.sensor27Label); + this.Controls.Add(this.meter26Label); + this.Controls.Add(this.meter25Label); + this.Controls.Add(this.passed26Label); + this.Controls.Add(this.passed25Label); + this.Controls.Add(this.error26Label); + this.Controls.Add(this.error25Label); + this.Controls.Add(this.volume26Label); + this.Controls.Add(this.volume25Label); + this.Controls.Add(this.refPulses26Label); + this.Controls.Add(this.pulses26Label); + this.Controls.Add(this.sensor26Label); + this.Controls.Add(this.refPulses25Label); + this.Controls.Add(this.pulses25Label); + this.Controls.Add(this.sensor25Label); + this.Controls.Add(this.meter24Label); + this.Controls.Add(this.meter23Label); + this.Controls.Add(this.meter22Label); + this.Controls.Add(this.meter21Label); + this.Controls.Add(this.meter20Label); + this.Controls.Add(this.meter19Label); + this.Controls.Add(this.passed24Label); + this.Controls.Add(this.passed23Label); + this.Controls.Add(this.error24Label); + this.Controls.Add(this.passed22Label); + this.Controls.Add(this.error23Label); + this.Controls.Add(this.volume24Label); + this.Controls.Add(this.passed21Label); + this.Controls.Add(this.error22Label); + this.Controls.Add(this.volume23Label); + this.Controls.Add(this.passed20Label); + this.Controls.Add(this.refPulses24Label); + this.Controls.Add(this.error21Label); + this.Controls.Add(this.pulses24Label); + this.Controls.Add(this.sensor24Label); + this.Controls.Add(this.volume22Label); + this.Controls.Add(this.passed19Label); + this.Controls.Add(this.refPulses23Label); + this.Controls.Add(this.pulses23Label); + this.Controls.Add(this.error20Label); + this.Controls.Add(this.sensor23Label); + this.Controls.Add(this.volume21Label); + this.Controls.Add(this.refPulses22Label); + this.Controls.Add(this.pulses22Label); + this.Controls.Add(this.volume20Label); + this.Controls.Add(this.sensor22Label); + this.Controls.Add(this.error19Label); + this.Controls.Add(this.refPulses21Label); + this.Controls.Add(this.volume19Label); + this.Controls.Add(this.pulses21Label); + this.Controls.Add(this.sensor21Label); + this.Controls.Add(this.refPulses19Label); + this.Controls.Add(this.refPulses20Label); + this.Controls.Add(this.pulses20Label); + this.Controls.Add(this.pulses19Label); + this.Controls.Add(this.sensor20Label); + this.Controls.Add(this.sensor19Label); + this.Controls.Add(this.meter18Label); + this.Controls.Add(this.meter17Label); + this.Controls.Add(this.meter16Label); + this.Controls.Add(this.meter15Label); + this.Controls.Add(this.meter14Label); + this.Controls.Add(this.meter13Label); + this.Controls.Add(this.passed18Label); + this.Controls.Add(this.passed17Label); + this.Controls.Add(this.error18Label); + this.Controls.Add(this.passed16Label); + this.Controls.Add(this.error17Label); + this.Controls.Add(this.volume18Label); + this.Controls.Add(this.passed15Label); + this.Controls.Add(this.error16Label); + this.Controls.Add(this.volume17Label); + this.Controls.Add(this.passed14Label); + this.Controls.Add(this.refPulses18Label); + this.Controls.Add(this.error15Label); + this.Controls.Add(this.pulses18Label); + this.Controls.Add(this.sensor18Label); + this.Controls.Add(this.volume16Label); + this.Controls.Add(this.passed13Label); + this.Controls.Add(this.refPulses17Label); + this.Controls.Add(this.pulses17Label); + this.Controls.Add(this.error14Label); + this.Controls.Add(this.sensor17Label); + this.Controls.Add(this.volume15Label); + this.Controls.Add(this.refPulses16Label); + this.Controls.Add(this.label104); + this.Controls.Add(this.pulses16Label); + this.Controls.Add(this.volume14Label); + this.Controls.Add(this.sensor16Label); + this.Controls.Add(this.error13Label); + this.Controls.Add(this.refPulses15Label); + this.Controls.Add(this.volume13Label); + this.Controls.Add(this.pulses15Label); + this.Controls.Add(this.sensor15Label); + this.Controls.Add(this.refPulses13Label); + this.Controls.Add(this.refPulses14Label); + this.Controls.Add(this.pulses14Label); + this.Controls.Add(this.pulses13Label); + this.Controls.Add(this.sensor14Label); + this.Controls.Add(this.sensor13Label); + this.Controls.Add(this.label119); + this.Controls.Add(this.label120); + this.Controls.Add(this.label121); + this.Controls.Add(this.label122); + this.Controls.Add(this.meter12Label); + this.Controls.Add(this.meter11Label); + this.Controls.Add(this.meter10Label); + this.Controls.Add(this.meter9Label); + this.Controls.Add(this.meter8Label); + this.Controls.Add(this.meter7Label); + this.Controls.Add(this.passed12Label); + this.Controls.Add(this.passed11Label); + this.Controls.Add(this.error12Label); + this.Controls.Add(this.passed10Label); + this.Controls.Add(this.error11Label); + this.Controls.Add(this.volume12Label); + this.Controls.Add(this.passed9Label); + this.Controls.Add(this.error10Label); + this.Controls.Add(this.volume11Label); + this.Controls.Add(this.passed8Label); + this.Controls.Add(this.refPulses12Label); + this.Controls.Add(this.error9Label); + this.Controls.Add(this.pulses12Label); + this.Controls.Add(this.sensor12Label); + this.Controls.Add(this.volume10Label); + this.Controls.Add(this.passed7Label); + this.Controls.Add(this.refPulses11Label); + this.Controls.Add(this.pulses11Label); + this.Controls.Add(this.error8Label); + this.Controls.Add(this.sensor11Label); + this.Controls.Add(this.volume9Label); + this.Controls.Add(this.refPulses10Label); + this.Controls.Add(this.pulses10Label); + this.Controls.Add(this.volume8Label); + this.Controls.Add(this.sensor10Label); + this.Controls.Add(this.error7Label); + this.Controls.Add(this.refPulses9Label); + this.Controls.Add(this.volume7Label); + this.Controls.Add(this.pulses9Label); + this.Controls.Add(this.sensor9Label); + this.Controls.Add(this.refPulses7Label); + this.Controls.Add(this.refPulses8Label); + this.Controls.Add(this.pulses8Label); + this.Controls.Add(this.pulses7Label); + this.Controls.Add(this.sensor8Label); + this.Controls.Add(this.sensor7Label); + this.Controls.Add(this.meter6Label); + this.Controls.Add(this.meter5Label); + this.Controls.Add(this.meter4Label); + this.Controls.Add(this.meter3Label); + this.Controls.Add(this.meter2Label); + this.Controls.Add(this.meter1Label); + this.Controls.Add(this.passed6Label); + this.Controls.Add(this.passed5Label); + this.Controls.Add(this.error6Label); + this.Controls.Add(this.passed4Label); + this.Controls.Add(this.error5Label); + this.Controls.Add(this.volume6Label); + this.Controls.Add(this.passed3Label); + this.Controls.Add(this.error4Label); + this.Controls.Add(this.volume5Label); + this.Controls.Add(this.passed2Label); + this.Controls.Add(this.refPulses6Label); + this.Controls.Add(this.error3Label); + this.Controls.Add(this.pulses6Label); + this.Controls.Add(this.sensor6Label); + this.Controls.Add(this.volume4Label); + this.Controls.Add(this.passed1Label); + this.Controls.Add(this.refPulses5Label); + this.Controls.Add(this.pulses5Label); + this.Controls.Add(this.error2Label); + this.Controls.Add(this.sensor5Label); + this.Controls.Add(this.volume3Label); + this.Controls.Add(this.refPulses4Label); + this.Controls.Add(this.label35); + this.Controls.Add(this.pulses4Label); + this.Controls.Add(this.volume2Label); + this.Controls.Add(this.sensor4Label); + this.Controls.Add(this.error1Label); + this.Controls.Add(this.refPulses3Label); + this.Controls.Add(this.volume1Label); + this.Controls.Add(this.pulses3Label); + this.Controls.Add(this.pumpPctTextBox); + this.Controls.Add(this.sensor3Label); + this.Controls.Add(this.refPulses1Label); + this.Controls.Add(this.refPulses2Label); + this.Controls.Add(this.groupBox3z); + this.Controls.Add(this.pulses2Label); + this.Controls.Add(this.pulses1Label); + this.Controls.Add(this.sensor2Label); + this.Controls.Add(this.groupBox2z); + this.Controls.Add(this.sensor1Label); + this.Controls.Add(this.label4); + this.Controls.Add(this.groupBox1z); + this.Controls.Add(this.watermeterPictureBox3z); + this.Controls.Add(this.label3); + this.Controls.Add(this.label2); + this.Controls.Add(this.watermeterPictureBox2z); + this.Controls.Add(this.label1); + this.Controls.Add(this.watermeterPictureBox1z); + this.Controls.Add(this.pictureBox1); + this.Controls.Add(this.flowMeterPictureBox); + this.Controls.Add(this.watermeterPictureBox6); + this.Controls.Add(this.watermeterPictureBox5); + this.Controls.Add(this.watermeterPictureBox4); + this.Controls.Add(this.watermeterPictureBox3); + this.Controls.Add(this.watermeterPictureBox2); + this.Controls.Add(this.watermeterPictureBox1); + this.Controls.Add(this.pumpPictureBox); + this.Controls.Add(this.reservoirPictureBox); + this.Controls.Add(this.airHumiLabel); + this.Controls.Add(this.airPressLabel); + this.Controls.Add(this.airTempLabel); + this.Controls.Add(this.label34); + this.Controls.Add(this.label33); + this.Controls.Add(this.label32); + this.Controls.Add(this.estmtdTimeLabel); + this.Controls.Add(this.targetRefCountLabel); + this.Controls.Add(this.label31); + this.Controls.Add(this.targetVolumeLabel); + this.Controls.Add(this.targetFlowHighLabel); + this.Controls.Add(this.targetFlowLowLabel); + this.Controls.Add(this.label30); + this.Controls.Add(this.label20); + this.Controls.Add(this.label29); + this.Controls.Add(this.label28); + this.Controls.Add(this.refErrorLabel); + this.Controls.Add(this.label27); + this.Controls.Add(this.volumeCtvLabel); + this.Controls.Add(this.label26); + this.Controls.Add(this.refVolumeLabel); + this.Controls.Add(this.label25); + this.Controls.Add(this.massDiffLabel); + this.Controls.Add(this.label23); + this.Controls.Add(this.massLabel); + this.Controls.Add(this.label22); + this.Controls.Add(this.scaleCmpntLabel); + this.Controls.Add(this.tDivCmpntLabel); + this.Controls.Add(this.tDivLabel); + this.Controls.Add(this.label24); + this.Controls.Add(this.label21); + this.Controls.Add(this.regValvePosLabel); + this.Controls.Add(this.regValveCmpntLabel); + this.Controls.Add(this.refFlowCmpntLabel); + this.Controls.Add(this.refPulsesLabel); + this.Controls.Add(this.label19); + this.Controls.Add(this.refFreqLabel); + this.Controls.Add(this.label16); + this.Controls.Add(this.refFlowLabel); + this.Controls.Add(this.prInCmpntLabel); + this.Controls.Add(this.prOutCmpntLabel); + this.Controls.Add(this.tOutCmpntLabel); + this.Controls.Add(this.tInCmpntLabel); + this.Controls.Add(this.label15); + this.Controls.Add(this.prOutLabel); + this.Controls.Add(this.tOutLabel); + this.Controls.Add(this.label17); + this.Controls.Add(this.label18); + this.Controls.Add(this.prInLabel); + this.Controls.Add(this.tInLabel); + this.Controls.Add(this.label14); + this.Controls.Add(this.label13); + this.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.Name = "ProcessTabPageCtrl48"; + this.Size = new System.Drawing.Size(1498, 682); + this.Load += new System.EventHandler(this.ProcessTabPageCtrl_Load); + this.Paint += new System.Windows.Forms.PaintEventHandler(this.ProcessTabPageCtrl_Paint); + ((System.ComponentModel.ISupportInitialize)(this.reservoirPictureBox)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pumpPictureBox)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox3)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox4)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox5)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox6)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.flowMeterPictureBox)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox1z)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox2z)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox3z)).EndInit(); + this.groupBox1z.ResumeLayout(false); + this.groupBox1z.PerformLayout(); + this.groupBox2z.ResumeLayout(false); + this.groupBox2z.PerformLayout(); + this.groupBox3z.ResumeLayout(false); + this.groupBox3z.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label sensor1Label; + private System.Windows.Forms.Label pulses1Label; + private System.Windows.Forms.Label refPulses1Label; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label volume1Label; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label error1Label; + private System.Windows.Forms.Label passed1Label; + private System.Windows.Forms.Label passed2Label; + private System.Windows.Forms.Label error2Label; + private System.Windows.Forms.Label volume2Label; + private System.Windows.Forms.Label refPulses2Label; + private System.Windows.Forms.Label pulses2Label; + private System.Windows.Forms.Label sensor2Label; + private System.Windows.Forms.Label passed3Label; + private System.Windows.Forms.Label error3Label; + private System.Windows.Forms.Label volume3Label; + private System.Windows.Forms.Label refPulses3Label; + private System.Windows.Forms.Label pulses3Label; + private System.Windows.Forms.Label sensor3Label; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.Label tInLabel; + private System.Windows.Forms.Label prInLabel; + private System.Windows.Forms.Label prOutLabel; + private System.Windows.Forms.Label tOutLabel; + private System.Windows.Forms.Label label17; + private System.Windows.Forms.Label label18; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.Label tInCmpntLabel; + private System.Windows.Forms.Label tOutCmpntLabel; + private System.Windows.Forms.Label prOutCmpntLabel; + private System.Windows.Forms.Label prInCmpntLabel; + private System.Windows.Forms.Label refFlowLabel; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.Label refFreqLabel; + private System.Windows.Forms.Label label19; + private System.Windows.Forms.Label refPulsesLabel; + private System.Windows.Forms.Label refFlowCmpntLabel; + private System.Windows.Forms.Label regValveCmpntLabel; + private System.Windows.Forms.Label regValvePosLabel; + private System.Windows.Forms.Label label21; + private System.Windows.Forms.Label tDivCmpntLabel; + private System.Windows.Forms.Label tDivLabel; + private System.Windows.Forms.Label label24; + private System.Windows.Forms.Label scaleCmpntLabel; + private System.Windows.Forms.Label label22; + private System.Windows.Forms.Label massLabel; + private System.Windows.Forms.Label label23; + private System.Windows.Forms.Label massDiffLabel; + private System.Windows.Forms.Label label25; + private System.Windows.Forms.Label refVolumeLabel; + private System.Windows.Forms.Label label26; + private System.Windows.Forms.Label volumeCtvLabel; + private System.Windows.Forms.Label label27; + private System.Windows.Forms.Label refErrorLabel; + private System.Windows.Forms.Label label28; + private System.Windows.Forms.Label label29; + private System.Windows.Forms.Label label20; + private System.Windows.Forms.Label label30; + private System.Windows.Forms.Label targetFlowLowLabel; + private System.Windows.Forms.Label targetFlowHighLabel; + private System.Windows.Forms.Label targetVolumeLabel; + private System.Windows.Forms.Label label31; + private System.Windows.Forms.Label targetRefCountLabel; + private System.Windows.Forms.Label estmtdTimeLabel; + private System.Windows.Forms.Label label32; + private System.Windows.Forms.Label label33; + private System.Windows.Forms.Label label34; + private System.Windows.Forms.Label airTempLabel; + private System.Windows.Forms.Label airPressLabel; + private System.Windows.Forms.Label airHumiLabel; + private System.Windows.Forms.PictureBox reservoirPictureBox; + private System.Windows.Forms.PictureBox pumpPictureBox; + private System.Windows.Forms.PictureBox watermeterPictureBox1; + private System.Windows.Forms.PictureBox watermeterPictureBox2; + private System.Windows.Forms.PictureBox watermeterPictureBox3; + private System.Windows.Forms.PictureBox watermeterPictureBox4; + private System.Windows.Forms.Label passed4Label; + private System.Windows.Forms.Label error4Label; + private System.Windows.Forms.Label volume4Label; + private System.Windows.Forms.Label refPulses4Label; + private System.Windows.Forms.Label pulses4Label; + private System.Windows.Forms.Label sensor4Label; + private System.Windows.Forms.PictureBox watermeterPictureBox5; + private System.Windows.Forms.Label passed5Label; + private System.Windows.Forms.Label error5Label; + private System.Windows.Forms.Label volume5Label; + private System.Windows.Forms.Label refPulses5Label; + private System.Windows.Forms.Label pulses5Label; + private System.Windows.Forms.Label sensor5Label; + private System.Windows.Forms.Label label35; + private System.Windows.Forms.PictureBox watermeterPictureBox6; + private System.Windows.Forms.Label passed6Label; + private System.Windows.Forms.Label error6Label; + private System.Windows.Forms.Label volume6Label; + private System.Windows.Forms.Label refPulses6Label; + private System.Windows.Forms.Label pulses6Label; + private System.Windows.Forms.Label sensor6Label; + private System.Windows.Forms.PictureBox flowMeterPictureBox; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.PictureBox watermeterPictureBox1z; + private System.Windows.Forms.PictureBox watermeterPictureBox2z; + private System.Windows.Forms.PictureBox watermeterPictureBox3z; + private System.Windows.Forms.GroupBox groupBox1z; + private System.Windows.Forms.Label passed1zLabel; + private System.Windows.Forms.Label error1zLabel; + private System.Windows.Forms.Label label56; + private System.Windows.Forms.Label volume1zLabel; + private System.Windows.Forms.Label label58; + private System.Windows.Forms.GroupBox groupBox2z; + private System.Windows.Forms.Label passed2zLabel; + private System.Windows.Forms.Label error2zLabel; + private System.Windows.Forms.Label label52; + private System.Windows.Forms.Label volume2zLabel; + private System.Windows.Forms.Label label59; + private System.Windows.Forms.GroupBox groupBox3z; + private System.Windows.Forms.Label passed3zLabel; + private System.Windows.Forms.Label error3zLabel; + private System.Windows.Forms.Label label57; + private System.Windows.Forms.Label volume3zLabel; + private System.Windows.Forms.Label label61; + private System.Windows.Forms.TextBox pumpPctTextBox; + private System.Windows.Forms.Label meter1Label; + private System.Windows.Forms.Label meter2Label; + private System.Windows.Forms.Label meter3Label; + private System.Windows.Forms.Label meter4Label; + private System.Windows.Forms.Label meter5Label; + private System.Windows.Forms.Label meter6Label; + private System.Windows.Forms.Label meter12Label; + private System.Windows.Forms.Label meter11Label; + private System.Windows.Forms.Label meter10Label; + private System.Windows.Forms.Label meter9Label; + private System.Windows.Forms.Label meter8Label; + private System.Windows.Forms.Label meter7Label; + private System.Windows.Forms.Label passed12Label; + private System.Windows.Forms.Label passed11Label; + private System.Windows.Forms.Label error12Label; + private System.Windows.Forms.Label passed10Label; + private System.Windows.Forms.Label error11Label; + private System.Windows.Forms.Label volume12Label; + private System.Windows.Forms.Label passed9Label; + private System.Windows.Forms.Label error10Label; + private System.Windows.Forms.Label volume11Label; + private System.Windows.Forms.Label passed8Label; + private System.Windows.Forms.Label refPulses12Label; + private System.Windows.Forms.Label error9Label; + private System.Windows.Forms.Label pulses12Label; + private System.Windows.Forms.Label sensor12Label; + private System.Windows.Forms.Label volume10Label; + private System.Windows.Forms.Label passed7Label; + private System.Windows.Forms.Label refPulses11Label; + private System.Windows.Forms.Label pulses11Label; + private System.Windows.Forms.Label error8Label; + private System.Windows.Forms.Label sensor11Label; + private System.Windows.Forms.Label volume9Label; + private System.Windows.Forms.Label refPulses10Label; + private System.Windows.Forms.Label pulses10Label; + private System.Windows.Forms.Label volume8Label; + private System.Windows.Forms.Label sensor10Label; + private System.Windows.Forms.Label error7Label; + private System.Windows.Forms.Label refPulses9Label; + private System.Windows.Forms.Label volume7Label; + private System.Windows.Forms.Label pulses9Label; + private System.Windows.Forms.Label sensor9Label; + private System.Windows.Forms.Label refPulses7Label; + private System.Windows.Forms.Label refPulses8Label; + private System.Windows.Forms.Label pulses8Label; + private System.Windows.Forms.Label pulses7Label; + private System.Windows.Forms.Label sensor8Label; + private System.Windows.Forms.Label sensor7Label; + private System.Windows.Forms.Label meter24Label; + private System.Windows.Forms.Label meter23Label; + private System.Windows.Forms.Label meter22Label; + private System.Windows.Forms.Label meter21Label; + private System.Windows.Forms.Label meter20Label; + private System.Windows.Forms.Label meter19Label; + private System.Windows.Forms.Label passed24Label; + private System.Windows.Forms.Label passed23Label; + private System.Windows.Forms.Label error24Label; + private System.Windows.Forms.Label passed22Label; + private System.Windows.Forms.Label error23Label; + private System.Windows.Forms.Label volume24Label; + private System.Windows.Forms.Label passed21Label; + private System.Windows.Forms.Label error22Label; + private System.Windows.Forms.Label volume23Label; + private System.Windows.Forms.Label passed20Label; + private System.Windows.Forms.Label refPulses24Label; + private System.Windows.Forms.Label error21Label; + private System.Windows.Forms.Label pulses24Label; + private System.Windows.Forms.Label sensor24Label; + private System.Windows.Forms.Label volume22Label; + private System.Windows.Forms.Label passed19Label; + private System.Windows.Forms.Label refPulses23Label; + private System.Windows.Forms.Label pulses23Label; + private System.Windows.Forms.Label error20Label; + private System.Windows.Forms.Label sensor23Label; + private System.Windows.Forms.Label volume21Label; + private System.Windows.Forms.Label refPulses22Label; + private System.Windows.Forms.Label pulses22Label; + private System.Windows.Forms.Label volume20Label; + private System.Windows.Forms.Label sensor22Label; + private System.Windows.Forms.Label error19Label; + private System.Windows.Forms.Label refPulses21Label; + private System.Windows.Forms.Label volume19Label; + private System.Windows.Forms.Label pulses21Label; + private System.Windows.Forms.Label sensor21Label; + private System.Windows.Forms.Label refPulses19Label; + private System.Windows.Forms.Label refPulses20Label; + private System.Windows.Forms.Label pulses20Label; + private System.Windows.Forms.Label pulses19Label; + private System.Windows.Forms.Label sensor20Label; + private System.Windows.Forms.Label sensor19Label; + private System.Windows.Forms.Label meter18Label; + private System.Windows.Forms.Label meter17Label; + private System.Windows.Forms.Label meter16Label; + private System.Windows.Forms.Label meter15Label; + private System.Windows.Forms.Label meter14Label; + private System.Windows.Forms.Label meter13Label; + private System.Windows.Forms.Label passed18Label; + private System.Windows.Forms.Label passed17Label; + private System.Windows.Forms.Label error18Label; + private System.Windows.Forms.Label passed16Label; + private System.Windows.Forms.Label error17Label; + private System.Windows.Forms.Label volume18Label; + private System.Windows.Forms.Label passed15Label; + private System.Windows.Forms.Label error16Label; + private System.Windows.Forms.Label volume17Label; + private System.Windows.Forms.Label passed14Label; + private System.Windows.Forms.Label refPulses18Label; + private System.Windows.Forms.Label error15Label; + private System.Windows.Forms.Label pulses18Label; + private System.Windows.Forms.Label sensor18Label; + private System.Windows.Forms.Label volume16Label; + private System.Windows.Forms.Label passed13Label; + private System.Windows.Forms.Label refPulses17Label; + private System.Windows.Forms.Label pulses17Label; + private System.Windows.Forms.Label error14Label; + private System.Windows.Forms.Label sensor17Label; + private System.Windows.Forms.Label volume15Label; + private System.Windows.Forms.Label refPulses16Label; + private System.Windows.Forms.Label label104; + private System.Windows.Forms.Label pulses16Label; + private System.Windows.Forms.Label volume14Label; + private System.Windows.Forms.Label sensor16Label; + private System.Windows.Forms.Label error13Label; + private System.Windows.Forms.Label refPulses15Label; + private System.Windows.Forms.Label volume13Label; + private System.Windows.Forms.Label pulses15Label; + private System.Windows.Forms.Label sensor15Label; + private System.Windows.Forms.Label refPulses13Label; + private System.Windows.Forms.Label refPulses14Label; + private System.Windows.Forms.Label pulses14Label; + private System.Windows.Forms.Label pulses13Label; + private System.Windows.Forms.Label sensor14Label; + private System.Windows.Forms.Label sensor13Label; + private System.Windows.Forms.Label label119; + private System.Windows.Forms.Label label120; + private System.Windows.Forms.Label label121; + private System.Windows.Forms.Label label122; + private System.Windows.Forms.Label meter40Label; + private System.Windows.Forms.Label meter39Label; + private System.Windows.Forms.Label passed40Label; + private System.Windows.Forms.Label passed39Label; + private System.Windows.Forms.Label error40Label; + private System.Windows.Forms.Label volume40Label; + private System.Windows.Forms.Label error39Label; + private System.Windows.Forms.Label volume39Label; + private System.Windows.Forms.Label refPulses39Label; + private System.Windows.Forms.Label refPulses40Label; + private System.Windows.Forms.Label pulses40Label; + private System.Windows.Forms.Label pulses39Label; + private System.Windows.Forms.Label sensor40Label; + private System.Windows.Forms.Label sensor39Label; + private System.Windows.Forms.Label meter38Label; + private System.Windows.Forms.Label meter37Label; + private System.Windows.Forms.Label meter36Label; + private System.Windows.Forms.Label meter35Label; + private System.Windows.Forms.Label meter34Label; + private System.Windows.Forms.Label meter33Label; + private System.Windows.Forms.Label passed38Label; + private System.Windows.Forms.Label passed37Label; + private System.Windows.Forms.Label error38Label; + private System.Windows.Forms.Label passed36Label; + private System.Windows.Forms.Label error37Label; + private System.Windows.Forms.Label volume38Label; + private System.Windows.Forms.Label passed35Label; + private System.Windows.Forms.Label error36Label; + private System.Windows.Forms.Label volume37Label; + private System.Windows.Forms.Label passed34Label; + private System.Windows.Forms.Label refPulses38Label; + private System.Windows.Forms.Label error35Label; + private System.Windows.Forms.Label pulses38Label; + private System.Windows.Forms.Label sensor38Label; + private System.Windows.Forms.Label volume36Label; + private System.Windows.Forms.Label passed33Label; + private System.Windows.Forms.Label refPulses37Label; + private System.Windows.Forms.Label pulses37Label; + private System.Windows.Forms.Label error34Label; + private System.Windows.Forms.Label sensor37Label; + private System.Windows.Forms.Label volume35Label; + private System.Windows.Forms.Label refPulses36Label; + private System.Windows.Forms.Label pulses36Label; + private System.Windows.Forms.Label volume34Label; + private System.Windows.Forms.Label sensor36Label; + private System.Windows.Forms.Label error33Label; + private System.Windows.Forms.Label refPulses35Label; + private System.Windows.Forms.Label volume33Label; + private System.Windows.Forms.Label pulses35Label; + private System.Windows.Forms.Label sensor35Label; + private System.Windows.Forms.Label refPulses33Label; + private System.Windows.Forms.Label refPulses34Label; + private System.Windows.Forms.Label pulses34Label; + private System.Windows.Forms.Label pulses33Label; + private System.Windows.Forms.Label sensor34Label; + private System.Windows.Forms.Label sensor33Label; + private System.Windows.Forms.Label meter32Label; + private System.Windows.Forms.Label meter31Label; + private System.Windows.Forms.Label meter30Label; + private System.Windows.Forms.Label meter29Label; + private System.Windows.Forms.Label meter28Label; + private System.Windows.Forms.Label meter27Label; + private System.Windows.Forms.Label passed32Label; + private System.Windows.Forms.Label passed31Label; + private System.Windows.Forms.Label error32Label; + private System.Windows.Forms.Label passed30Label; + private System.Windows.Forms.Label error31Label; + private System.Windows.Forms.Label volume32Label; + private System.Windows.Forms.Label passed29Label; + private System.Windows.Forms.Label error30Label; + private System.Windows.Forms.Label volume31Label; + private System.Windows.Forms.Label passed28Label; + private System.Windows.Forms.Label refPulses32Label; + private System.Windows.Forms.Label error29Label; + private System.Windows.Forms.Label pulses32Label; + private System.Windows.Forms.Label sensor32Label; + private System.Windows.Forms.Label volume30Label; + private System.Windows.Forms.Label passed27Label; + private System.Windows.Forms.Label refPulses31Label; + private System.Windows.Forms.Label pulses31Label; + private System.Windows.Forms.Label error28Label; + private System.Windows.Forms.Label sensor31Label; + private System.Windows.Forms.Label volume29Label; + private System.Windows.Forms.Label refPulses30Label; + private System.Windows.Forms.Label pulses30Label; + private System.Windows.Forms.Label volume28Label; + private System.Windows.Forms.Label sensor30Label; + private System.Windows.Forms.Label error27Label; + private System.Windows.Forms.Label refPulses29Label; + private System.Windows.Forms.Label volume27Label; + private System.Windows.Forms.Label pulses29Label; + private System.Windows.Forms.Label sensor29Label; + private System.Windows.Forms.Label refPulses27Label; + private System.Windows.Forms.Label refPulses28Label; + private System.Windows.Forms.Label pulses28Label; + private System.Windows.Forms.Label pulses27Label; + private System.Windows.Forms.Label sensor28Label; + private System.Windows.Forms.Label sensor27Label; + private System.Windows.Forms.Label meter26Label; + private System.Windows.Forms.Label meter25Label; + private System.Windows.Forms.Label passed26Label; + private System.Windows.Forms.Label passed25Label; + private System.Windows.Forms.Label error26Label; + private System.Windows.Forms.Label error25Label; + private System.Windows.Forms.Label volume26Label; + private System.Windows.Forms.Label volume25Label; + private System.Windows.Forms.Label refPulses26Label; + private System.Windows.Forms.Label pulses26Label; + private System.Windows.Forms.Label sensor26Label; + private System.Windows.Forms.Label refPulses25Label; + private System.Windows.Forms.Label pulses25Label; + private System.Windows.Forms.Label sensor25Label; + + + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Screens/ProcessTabPageCtrl48.cs b/TBF_V2/Sources/TBF/TBF/Screens/ProcessTabPageCtrl48.cs new file mode 100644 index 00000000..d45cf695 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Screens/ProcessTabPageCtrl48.cs @@ -0,0 +1,703 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// Author: Milan Hanajík +/// +using System; +using System.Drawing; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.BenchControl.Sequences; +using TBF.UiBridge; +using TBF.Resources; + +#pragma warning disable 162 /// Disables 'Unreachable code detected' warning + +namespace TBF.Screens +{ + public partial class ProcessTabPageCtrl48 : UserControl + { + static readonly ILog log = LogManager.GetLogger(typeof(ProcessTabPageCtrl48)); + + MetersKind currentMetersKind; + + int textBoxesCount; + + Label[] meter; + Label[] sensor; + Label[] pulses; + Label[] refPulses; + Label[] volume; + Label[] error; + Label[] passed; + Label[] cmpndVolume; + Label[] cmpndError; + Label[] cmpndPassed; + + bool pumpOn = true; + bool diverterToTank = true; + + /// + /// Constructor, initializes anonymous event handlers + /// + public ProcessTabPageCtrl48() + { + currentMetersKind = MetersKind.Single; + + InitializeComponent(); + + textBoxesCount = 40; + meter = new Label[] { + meter1Label, meter2Label, meter3Label, meter4Label, meter5Label, + meter6Label, meter7Label, meter8Label, meter9Label, meter10Label, + meter11Label, meter12Label, meter13Label, meter14Label, meter15Label, + meter16Label, meter17Label, meter18Label, meter19Label, meter20Label, + meter21Label, meter22Label, meter23Label, meter24Label, meter25Label, + meter26Label, meter27Label, meter28Label, meter29Label, meter30Label, + meter31Label, meter32Label, meter33Label, meter34Label, meter35Label, + meter36Label, meter37Label, meter38Label, meter39Label, meter40Label, + }; + sensor = new Label[] { + sensor1Label, sensor2Label, sensor3Label, sensor4Label, sensor5Label, + sensor6Label, sensor7Label, sensor8Label, sensor9Label, sensor10Label, + sensor11Label, sensor12Label, sensor13Label, sensor14Label, sensor15Label, + sensor16Label, sensor17Label, sensor18Label, sensor19Label, sensor20Label, + sensor21Label, sensor22Label, sensor23Label, sensor24Label, sensor25Label, + sensor26Label, sensor27Label, sensor28Label, sensor29Label, sensor30Label, + sensor31Label, sensor32Label, sensor33Label, sensor34Label, sensor35Label, + sensor36Label, sensor37Label, sensor38Label, sensor39Label, sensor40Label, + }; + pulses = new Label[] { + pulses1Label, pulses2Label, pulses3Label, pulses4Label, pulses5Label, + pulses6Label, pulses7Label, pulses8Label, pulses9Label, pulses10Label, + pulses11Label, pulses12Label, pulses13Label, pulses14Label, pulses15Label, + pulses16Label, pulses17Label, pulses18Label, pulses19Label, pulses20Label, + pulses21Label, pulses22Label, pulses23Label, pulses24Label, pulses25Label, + pulses26Label, pulses27Label, pulses28Label, pulses29Label, pulses30Label, + pulses31Label, pulses32Label, pulses33Label, pulses34Label, pulses35Label, + pulses36Label, pulses37Label, pulses38Label, pulses39Label, pulses40Label, + }; + refPulses = new Label[] { + refPulses1Label, refPulses2Label, refPulses3Label, refPulses4Label, refPulses5Label, + refPulses6Label, refPulses7Label, refPulses8Label, refPulses9Label, refPulses10Label, + refPulses11Label, refPulses12Label, refPulses13Label, refPulses14Label, refPulses15Label, + refPulses16Label, refPulses17Label, refPulses18Label, refPulses19Label, refPulses20Label, + refPulses21Label, refPulses22Label, refPulses23Label, refPulses24Label, refPulses25Label, + refPulses26Label, refPulses27Label, refPulses28Label, refPulses29Label, refPulses30Label, + refPulses31Label, refPulses32Label, refPulses33Label, refPulses34Label, refPulses35Label, + refPulses36Label, refPulses37Label, refPulses38Label, refPulses39Label, refPulses40Label, + }; + volume = new Label[] { + volume1Label, volume2Label, volume3Label, volume4Label, volume5Label, + volume6Label, volume7Label, volume8Label, volume9Label, volume10Label, + volume11Label, volume12Label, volume13Label, volume14Label, volume15Label, + volume16Label, volume17Label, volume18Label, volume19Label, volume20Label, + volume21Label, volume22Label, volume23Label, volume24Label, volume25Label, + volume26Label, volume27Label, volume28Label, volume29Label, volume30Label, + volume31Label, volume32Label, volume33Label, volume34Label, volume35Label, + volume36Label, volume37Label, volume38Label, volume39Label, volume40Label, + }; + error = new Label[] { + error1Label, error2Label, error3Label, error4Label, error5Label, + error6Label, error7Label, error8Label, error9Label, error10Label, + error11Label, error12Label, error13Label, error14Label, error15Label, + error16Label, error17Label, error18Label, error19Label, error20Label, + error21Label, error22Label, error23Label, error24Label, error25Label, + error26Label, error27Label, error28Label, error29Label, error30Label, + error31Label, error32Label, error33Label, error34Label, error35Label, + error36Label, error37Label, error38Label, error39Label, error40Label, + }; + passed = new Label[] { + passed1Label, passed2Label, passed3Label, passed4Label, passed5Label, + passed6Label, passed7Label, passed8Label, passed9Label, passed10Label, + passed11Label, passed12Label, passed13Label, passed14Label, passed15Label, + passed16Label, passed17Label, passed18Label, passed19Label, passed20Label, + passed21Label, passed22Label, passed23Label, passed24Label, passed25Label, + passed26Label, passed27Label, passed28Label, passed29Label, passed30Label, + passed31Label, passed32Label, passed33Label, passed34Label, passed35Label, + passed36Label, passed37Label, passed38Label, passed39Label, passed40Label, + }; + + cmpndVolume = new Label[] { volume1zLabel, volume2zLabel, volume3zLabel }; + cmpndError = new Label[] { error1zLabel, error2zLabel, error3zLabel }; + cmpndPassed = new Label[] { passed1zLabel, passed2zLabel, passed3zLabel }; + + ShuffleLabels(Config.Data.WMsCount, Config.Data.LineSize); + + Bridge.ProcedureSelectedHandler += delegate(object sndr, ProcedureSelectedEventArgs args) + { + try + { + if (InvokeRequired) + Invoke(new EventHandler(OnProcedureSelected), sndr, args); + else + OnProcedureSelected(sndr, args); + } + catch (Exception e) { log.ErrorFormat("ProcessTabPage48.OnProcedureSelected() failed: {0}", e.Message); } + }; + + Bridge.TestSelectedHandler += delegate(object sender, TestSelectedEventArgs args) + { + try + { + if (InvokeRequired) + Invoke(new EventHandler(OnTestSelected), sender, args); + else + OnTestSelected(sender, args); + } + catch (Exception e) { log.ErrorFormat("ProcessTabPage48.OnTestSelected() failed: {0}", e.Message); } + }; + + Bridge.ProcessDataHandler += delegate(object sender, ProcessDataEventArgs args) + { + try + { + if (InvokeRequired) + Invoke(new EventHandler(OnProcessDataChanged), sender, args); + else + OnProcessDataChanged(sender, args); + } + catch (Exception e) { log.ErrorFormat("ProcessTabPage48.OnProcessDataChanged() failed: {0}", e.Message); } + }; + + Bridge.TestCompletedHandler += delegate(object sender, TestCompletedEventArgs args) + { + try + { + if (InvokeRequired) + Invoke(new EventHandler(OnTestCompleted), sender, args); + else + OnTestCompleted(sender, args); + } + catch (Exception e) { log.ErrorFormat("ProcessTabPage48.OnTestCompleted() failed: {0}", e.Message); } + }; + + Bridge.ProcedureCompletedHandler += delegate(object sender, ProcedureCompletedEventArgs args) + { + try + { + if (InvokeRequired) + Invoke(new EventHandler(OnProcedureCompleted), sender, args); + else + OnProcedureCompleted(sender, args); + } + catch (Exception e) { log.ErrorFormat("ProcessTabPage48.OnProcedureCompleted() failed: {0}", e.Message); } + }; + } + + /// + /// Make sure the layout of labels/text boxes on the screen + /// corresponds to the layout of watermeters of the test bench. + /// Enable only used labels. + /// + /// Number of watermeters + /// Number of watermeters in one line + void ShuffleLabels(int wmsCount, int lineSize) + { + if (wmsCount <= textBoxesCount && lineSize > 0) + { + int nrLines = (wmsCount + lineSize - 1) / lineSize; + int gap = (textBoxesCount - wmsCount) / nrLines; + + int dest = 0; + for (int l = 0; l < nrLines; l++) + { + for (int i = 0; i < lineSize; i++) + { + meter[dest] = meter[l * lineSize + l * gap + i]; + meter[dest].Visible = true; + meter[dest].Text = string.Format("Meter {0}", dest + 1); + sensor[dest] = sensor[l * lineSize + l * gap + i]; + sensor[dest].Visible = true; + pulses[dest] = pulses[l * lineSize + l * gap + i]; + pulses[dest].Visible = true; + refPulses[dest] = refPulses[l * lineSize + l * gap + i]; + refPulses[dest].Visible = true; + volume[dest] = volume[l * lineSize + l * gap + i]; + volume[dest].Visible = true; + error[dest] = error[l * lineSize + l * gap + i]; + error[dest].Visible = true; + passed[dest] = passed[l * lineSize + l * gap + i]; + passed[dest].Visible = true; + dest++; + } + } + textBoxesCount = wmsCount; + } + } + + private void ProcessTabPageCtrl_Load(object sender, EventArgs e) + { + Once(); + ResetLabelsAndTargetVals(); + ResetReadings(); + } + + void Once() + { + + } + + void UpdateVisibility(MetersKind metersKind) + { + bool visible = (metersKind == MetersKind.Single); + + for (int i = 2 * Config.Data.CompoundWMsCount; i < textBoxesCount; i++) + { + meter[i].Visible = visible; + sensor[i].Visible = visible; + pulses[i].Visible = visible; + refPulses[i].Visible = visible; + volume[i].Visible = visible; + error[i].Visible = visible; + passed[i].Visible = visible; + } + + groupBox1z.Visible = (metersKind == MetersKind.Combined) && (Config.Data.CompoundWMsCount >= 1); + groupBox2z.Visible = (metersKind == MetersKind.Combined) && (Config.Data.CompoundWMsCount >= 2); + groupBox3z.Visible = (metersKind == MetersKind.Combined) && (Config.Data.CompoundWMsCount >= 3); + } + + + /// + /// Called when a new procedure is selected + /// + void ResetLabelsAndTargetVals() + { + /// Target values + targetFlowLowLabel.Text = "---"; + targetFlowHighLabel.Text = "---"; + targetVolumeLabel.Text = "---"; + targetRefCountLabel.Text = "---"; + estmtdTimeLabel.Text = "---"; + + // + refFlowCmpntLabel.Text = "---"; + regValveCmpntLabel.Text = "---"; + + /// Water pressure + prInCmpntLabel.Text = "---"; + prOutCmpntLabel.Text = "---"; + + /// Water temperature + tInCmpntLabel.Text = "---"; + tOutCmpntLabel.Text = "---"; + tDivCmpntLabel.Text = "---"; + + scaleCmpntLabel.Text = "---"; + + if (currentMetersKind == MetersKind.Single) + { + watermeterPictureBox1.Visible = true; + watermeterPictureBox2.Visible = true; + watermeterPictureBox3.Visible = true; + watermeterPictureBox4.Visible = true; + watermeterPictureBox5.Visible = true; + watermeterPictureBox6.Visible = true; + + watermeterPictureBox1z.Visible = false; + watermeterPictureBox2z.Visible = false; + watermeterPictureBox3z.Visible = false; + + groupBox1z.Visible = false; + groupBox2z.Visible = false; + groupBox3z.Visible = false; + + sensor1Label.Text = "---"; + + for (int i = 0; i < textBoxesCount; i++) + { + sensor[i].Text = "---"; + } + } + else if (currentMetersKind == MetersKind.Combined) + { + watermeterPictureBox1.Visible = false; + watermeterPictureBox2.Visible = true; + watermeterPictureBox3.Visible = false; + watermeterPictureBox4.Visible = false; + watermeterPictureBox5.Visible = false; + watermeterPictureBox6.Visible = false; + + watermeterPictureBox1z.Visible = true; + watermeterPictureBox2z.Visible = false; + watermeterPictureBox3z.Visible = false; + + groupBox1z.Visible = true; + groupBox2z.Visible = false; + groupBox3z.Visible = false; + + sensor1Label.Visible = true; + sensor1Label.Text = "---"; + sensor2Label.Visible = true; + sensor2Label.Text = "---"; + } + } + + /// + /// Called when a new procedure or a new test procedure is selected + /// + void ResetReadings() + { + /// Top part + airTempLabel.Text = "---"; + airPressLabel.Text = "---"; + airHumiLabel.Text = "---"; + + refPulsesLabel.Text = "---"; + refFreqLabel.Text = "---"; + refFlowLabel.Text = "---"; + refVolumeLabel.Text = "---"; + + regValvePosLabel.Text = "---"; + tDivLabel.Text = "---"; + + tInLabel.Text = "---"; + tOutLabel.Text = "---"; + prInLabel.Text = "---"; + prOutLabel.Text = "---"; + + massLabel.Text = "---"; + massDiffLabel.Text = "---"; + volumeCtvLabel.Text = "---"; + refErrorLabel.Text = "---"; + + /// Meters + pulses1Label.Text = "---"; + refPulses1Label.Text = "---"; + volume1Label.Text = "---"; + error1Label.Text = "---"; + passed1Label.Text = "---"; + + if (currentMetersKind == MetersKind.Single) + { + for (int i = 0; i < textBoxesCount; i++) + { + pulses[i].Text = "---"; + refPulses[i].Text = "---"; + volume[i].Text = "---"; + error[i].Text = "---"; + passed[i].Text = "---"; + } + } + else if (currentMetersKind == MetersKind.Combined) + { + for (int i = 0; i < 2; i++) + { + pulses[i].Text = "---"; + refPulses[i].Text = "---"; + volume[i].Text = "---"; + error[i].Text = "---"; + passed[i].Text = "---"; + } + volume1zLabel.Text = "---"; + error1zLabel.Text = "---"; + passed1zLabel.Text = "---"; + } + } + + void OnProcedureSelected(object sender, ProcedureSelectedEventArgs args) + { + currentMetersKind = args.Procedure.MetersKind; + UpdateVisibility(currentMetersKind); + ResetLabelsAndTargetVals(); + ResetReadings(); + Invalidate(); + } + + void OnTestSelected(object sender, TestSelectedEventArgs args) + { + /// Readings and target values + ResetReadings(); + + /// Target values + targetFlowLowLabel.Text = args.Test.Qfrom.ToString("F3"); + targetFlowHighLabel.Text = args.Test.Qto.ToString("F3"); + targetVolumeLabel.Text = args.Test.Volume.ToString("F1"); + targetRefCountLabel.Text = args.TotalPulses.ToString(); + estmtdTimeLabel.Text = args.Test.TstTime.ToString("F1"); + + /// Names of virtual bench components + if (args.BenchPath.PressMtrUp != null) prInCmpntLabel.Text = args.BenchPath.PressMtrUp.Name; + if (args.BenchPath.PressMtrDown != null) prOutCmpntLabel.Text = args.BenchPath.PressMtrDown.Name; + if (args.BenchPath.TempMtrUp != null) tInCmpntLabel.Text = args.BenchPath.TempMtrUp.Name; + if (args.BenchPath.TempMtrDown != null) tOutCmpntLabel.Text = args.BenchPath.TempMtrDown.Name; + if (args.OutputPath.TempDiv != null) tDivCmpntLabel.Text = args.OutputPath.TempDiv.Name; + if (args.OutputPath.FlowMeter != null) refFlowCmpntLabel.Text = args.OutputPath.FlowMeter.Name; + if (args.OutputPath.RegulValve != null) regValveCmpntLabel.Text = args.OutputPath.RegulValve.Name; + if (args.OutputPath.Scale != null) scaleCmpntLabel.Text = args.OutputPath.Scale.Name; + + for (int i = 0; i < textBoxesCount; i++) + { + sensor[i].Text = (args.MetersPath.RegisterReaders[i] == null) ? "" : args.MetersPath.RegisterReaders[i].Cfg.Name; + } + + if (args.FeedingPath != null && (args.FeedingPath.Pump is BenchControl.GenericDevices.IPumpFM)) + { + pumpPctTextBox.Visible = true; + pumpPctTextBox.Text = (args.FeedingPath.Pump as BenchControl.GenericDevices.IPumpFM).Power.ToString("F0") + " %"; + } + else + { + pumpPctTextBox.Visible = false; + } + } + + void OnProcessDataChanged(object sender, ProcessDataEventArgs args) + { + ///// + ///// Always available + ///// + //airTempLabel.Text = ProcessData.AmbTemp.ToString(); + // airPressLabel.Text = Config.Units.ConvertTo(Config.Unit.mbar, ProcessData.AmbPress.Val).ToString("F0"); + // airHumiLabel.Text = ProcessData.AmbHumi.ToString(); + + // tInLabel.Text = ProcessData.TempUp.ToString(); + // tOutLabel.Text = ProcessData.TempDown.ToString(); + //tDivLabel.Text = ProcessData.TempDiv.ToString(); + + //prInLabel.Text = ProcessData.PressUp.ToString(); + //prOutLabel.Text = ProcessData.PressDown.ToString(); + + //massLabel.Text = ProcessData.Mass.ToString(); + + //if (args.TestPhase == Config.Entities.Progress.FlowSetting || + // args.TestPhase == Config.Entities.Progress.Test) + //{ + // /// + // /// Available when setting the flow and during a test + // /// + // refFreqLabel.Text = ProcessData.RefFreq.ToString(); + // refFlowLabel.Text = Utils.DoubleToStr(ProcessData.RefFlow.Val, 4); + //} + + //if (args.TestPhase == Config.Entities.Progress.Test) + //{ + // /// + // /// Available only during a test + // /// + // refPulsesLabel.Text = ProcessData.RefPulses.ToString(); + // double refVolume = ProcessData.LtrPerRefPulse * (double)ProcessData.RefPulses; + // refVolumeLabel.Text = refVolume.ToString("F2"); + + // double massDiff = ProcessData.Mass.Val - ProcessData.StartMass.Val; + // massDiffLabel.Text = massDiff.ToString("F3"); + // double volumeCtv = 1000.0 * Config.Formulas.Buoyancy() * massDiff / (float)Config.Formulas.WaterDensityFromTemp((ProcessData.TempUp.Val + ProcessData.TempDown.Val) / 2, Program.LocalSettings.RealDensity, Program.LocalSettings.AtTemperature); + // volumeCtvLabel.Text = volumeCtv.ToString("F2"); + // double refError = Config.Formulas.ErrorFromVolumes(refVolume, volumeCtv); + // refErrorLabel.Text = refError.ToString("F3"); + + // if (currentMetersKind == MetersKind.Single) + // { + // for (int i = 0; i < Math.Min(textBoxesCount, ProcessData.RegisterReaders.Length); i++) + // { + // BenchControl.GenericDevices.IRegisterReader rr = ProcessData.RegisterReaders[i]; + // if (rr != null) + // { + // pulses[i].Text = rr.WMPulses.ToString(); + // refPulses[i].Text = rr.WMRefPulses.ToString(); + // volume[i].Text = rr.WMVolume.ToString("F1"); + // error[i].Text = Config.Formulas.ErrorFromVolumes(rr.WMVolume, rr.WMRefPulses * ProcessData.LtrPerRefPulse).ToString("F1"); + // } + // } + // } + // else if (currentMetersKind == MetersKind.Combined) + // { + // for (int compMtr = 0; compMtr < Config.Data.CompoundWMsCount; compMtr++) + // { + // int end = Math.Min(2 * compMtr+2, Math.Min(textBoxesCount, ProcessData.RegisterReaders.Length)); + + // double compoundVolume = 0; + // for (int i = 2 * compMtr; i < end; i++) + // { + // BenchControl.GenericDevices.IRegisterReader rr = ProcessData.RegisterReaders[i]; + // if (rr != null) + // { + // pulses[i].Text = rr.WMPulses.ToString(); + // refPulses[i].Text = rr.WMRefPulses.ToString(); + // volume[i].Text = rr.WMVolume.ToString("F1"); + // error[i].Text = Config.Formulas.ErrorFromVolumes(rr.WMVolume, rr.WMRefPulses * ProcessData.LtrPerRefPulse).ToString("F1"); + // compoundVolume += rr.WMVolume; + // } + // } + + // cmpndVolume[compMtr].Text = compoundVolume.ToString("F1"); + // cmpndError[compMtr].Text = Config.Formulas.ErrorFromVolumes(compoundVolume, refVolume).ToString("F1"); + // } + // } + //} + + ////if (pumpOn != args.PumpOn || diverterToTank != args.DivToTank) + ////{ + //// //if (pumpOn != args.PumpOn) + //// //{ + //// // if (pumpOn) pumpPictureBox.Image = System.Resources. + //// // else pumpPictureBox.Image = System.Resources. + //// //} + //// pumpOn = args.PumpOn; + //// diverterToTank = args.DivToTank; + //// Invalidate(); + ////} + } + + void OnTestCompleted(object sender, TestCompletedEventArgs args) + { + Results.Entities.TestRslt tRes = args.TestRslt; + if (tRes == null) return; + + airTempLabel.Text = tRes.AmbTempMean.ToString("F1"); + airPressLabel.Text = Config.Units.ConvertTo(Config.Unit.mbar, tRes.AmbPressMean).ToString("F0"); + airHumiLabel.Text = tRes.AmbHumiMean.ToString("F1"); + + tInLabel.Text = tRes.TempUpMean.ToString("F2"); + tOutLabel.Text = tRes.TempDownMean.ToString("F2"); + tDivLabel.Text = tRes.TempDivMean.ToString("F2"); + + prInLabel.Text = tRes.PressUpMean.ToString("F2"); + prOutLabel.Text = tRes.PressDownMean.ToString("F2"); + + massLabel.Text = ProcessData.Mass.ToString(); + massDiffLabel.Text = (tRes.MassEnd - tRes.MassStart).ToString("F3"); + + refPulsesLabel.Text = tRes.PulsesMaster.ToString("F0"); + refFreqLabel.Text = "---"; + refFlowLabel.Text = Utils.DoubleToStr(tRes.FlowVolume, 4); + + refVolumeLabel.Text = tRes.VolumeCTV.ToString("F2"); + //regValvePosLabel.Text = tstRslt. + + volumeCtvLabel.Text = tRes.VolumeCTV.ToString("F1"); + refErrorLabel.Text = (tRes.ErrorMaster == 0) ? "---" : tRes.ErrorMaster.ToString("F3"); + + if (!tRes.Batch.Compound) + { + for (int i = 0; i < Math.Min(textBoxesCount, ProcessData.BatchRslts.WaterMeters.Length); i++) + { + Results.Entities.WaterMeter wm = ProcessData.BatchRslts.WaterMeters[i]; + Results.Entities.MeterTestRslt mtr = (wm != null) ? wm.GetMeterTestRslt(args.TestName) : null; + + if (mtr != null) + { + pulses[i].Text = mtr.PulsesMeter.ToString("F0"); + refPulses[i].Text = mtr.PulsesMaster.ToString("F0"); + volume[i].Text = mtr.VolumeMeter.ToString("F2"); + error[i].Text = mtr.Error.ToString("F2"); + passed[i].Text = mtr.Passed ? Strings.Passed : Strings.Failed; + } + } + } + else + { + for (int compMtr = 0; compMtr < Config.Data.CompoundWMsCount; compMtr++) + { + Results.Entities.WaterMeter wm = ProcessData.BatchRslts.WaterMeters[compMtr]; + if (wm == null) continue; + + int end = Math.Min(textBoxesCount, Config.Data.WMsCount); + + Results.Entities.MeterTestRslt mtrMain = wm.GetMeterTestRslt(args.TestName, CompoundMeterId.CompoundMain); + if ((mtrMain != null) && (2 * compMtr < end)) + { + pulses[2 * compMtr].Text = mtrMain.PulsesMeter.ToString("F0"); + refPulses[2 * compMtr].Text = mtrMain.PulsesMaster.ToString("F0"); + volume[2 * compMtr].Text = mtrMain.VolumeMeter.ToString("F2"); + error[2 * compMtr].Text = mtrMain.Error.ToString("F2"); + passed[2 * compMtr].Text = mtrMain.Passed ? Strings.Passed : Strings.Failed; + } + + Results.Entities.MeterTestRslt mtrAux = wm.GetMeterTestRslt(args.TestName, CompoundMeterId.CompoundAux); + if ((mtrAux != null) && (2 * compMtr + 1 < end)) + { + pulses[2 * compMtr + 1].Text = mtrAux.PulsesMeter.ToString("F0"); + refPulses[2 * compMtr + 1].Text = mtrAux.PulsesMaster.ToString("F0"); + volume[2 * compMtr + 1].Text = mtrAux.VolumeMeter.ToString("F2"); + error[2 * compMtr + 1].Text = mtrAux.Error.ToString("F2"); + passed[2 * compMtr + 1].Text = mtrAux.Passed ? Strings.Passed : Strings.Failed; + } + + Results.Entities.MeterTestRslt mtrComp = wm.GetMeterTestRslt(args.TestName, CompoundMeterId.Compound); + if (mtrComp != null) + { + cmpndVolume[compMtr].Text = mtrComp.VolumeMeter.ToString("F2"); + cmpndError[compMtr].Text = mtrComp.Error.ToString("F2"); + cmpndPassed[compMtr].Text = mtrComp.Passed ? Strings.Passed : Strings.Failed; + } + } + } + } + + void OnProcedureCompleted(object sender, ProcedureCompletedEventArgs args) + { + } + + private void ProcessTabPageCtrl_Paint(object sender, PaintEventArgs e) + { + System.Drawing.Graphics formGraphics = this.CreateGraphics(); + + System.Drawing.SolidBrush filledBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Blue); + System.Drawing.SolidBrush emptyBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Gray); + System.Drawing.SolidBrush benchBrush = (pumpOn ? filledBrush : emptyBrush); + + int diam = 14; // pipe diameter (pixels) + int left = 20; // left-most pipe x-coordinate + int top = 14; // top-most pipe y-coordinate + int topLeft = 876; + int topRight = 966; + int divTop = 40; + int bottom = 504; // bottom-most pipe y-coordinate + int benchTop = 378; // bench-pipe top y-coordinate + int pumpLeft = 779; + int pumpWdth = 38; + + /// Pipes + formGraphics.FillRectangle(filledBrush,new Rectangle(pumpLeft+pumpWdth, bottom-diam, 65, diam)); // tank -> pump + formGraphics.FillRectangle(benchBrush, new Rectangle(left, bottom-diam, pumpLeft-left, diam)); // pump ->bench horizontal + formGraphics.FillRectangle(benchBrush, new Rectangle(left, benchTop, diam, bottom-benchTop)); // ->bench vertical + formGraphics.FillRectangle(benchBrush, new Rectangle(left + diam, benchTop, topLeft-left, diam)); // bench horizontal + formGraphics.FillRectangle(benchBrush, new Rectangle(topLeft, top + diam, diam, benchTop-top-diam)); // bench -> top vertical + formGraphics.FillRectangle(benchBrush, new Rectangle(topLeft, top, topRight-topLeft, diam)); // top horizontal + formGraphics.FillRectangle(benchBrush, new Rectangle(topRight-diam, top+diam, diam, divTop-top-diam)); // top -> diverter vertical + + /// Combined meters bypasses + if (watermeterPictureBox1z.Visible) PaintBypass(formGraphics, benchBrush, 186, benchTop + diam); + if (watermeterPictureBox2z.Visible) PaintBypass(formGraphics, benchBrush, 470, benchTop + diam); + if (watermeterPictureBox3z.Visible) PaintBypass(formGraphics, benchBrush, 754, benchTop + diam); + + /// Diverter + int displacement = diverterToTank ? 25 : -25; + Point[] points = new Point[4]; + points[0].X = topRight - diam; + points[0].Y = divTop; + points[1].X = topRight; + points[1].Y = divTop; + points[2].X = topRight + displacement; + points[2].Y = divTop + 50; + points[3].X = topRight - diam + displacement; + points[3].Y = divTop + 50; + formGraphics.FillPolygon(benchBrush, points); + + /// Sink + formGraphics.FillEllipse(emptyBrush, topRight - diam / 2 - 45, divTop + 50, 40, 30); + formGraphics.DrawEllipse(Pens.Black, topRight - diam / 2 - 45, divTop + 50, 40, 30); + + /// Tank + formGraphics.DrawRectangle(Pens.Black, topRight - diam / 2, divTop + 51, 60, 80); + + + emptyBrush.Dispose(); + filledBrush.Dispose(); + formGraphics.Dispose(); + } + + private void PaintBypass(System.Drawing.Graphics formGraphics, System.Drawing.SolidBrush brush, int startX, int startY) + { + int w = 80; + int h = 43; + int diam = 10; // pipe diameter (pixels) + + formGraphics.FillRectangle(brush, new Rectangle(startX, startY, diam, h - diam)); + formGraphics.FillRectangle(brush, new Rectangle(startX, startY + h - diam, w, diam)); + formGraphics.FillRectangle(brush, new Rectangle(startX + w - diam, startY, diam, h)); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Screens/ProcessTabPageCtrl48.resx b/TBF_V2/Sources/TBF/TBF/Screens/ProcessTabPageCtrl48.resx new file mode 100644 index 00000000..1f4e3da5 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Screens/ProcessTabPageCtrl48.resx @@ -0,0 +1,327 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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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 + zVhuAr/Ce2bVcGWw1gAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACYAAAAeCAYAAABAFGxuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAIGSURBVFhH7de/SwJhGAfwtwJpUlBwaVIEcXDVxcUxQaS1 + QdLVwTnQv0AcGgUdo9U1dNAWHVwiEQKFaAkCwZqq5el53rvT03v8cXqeDQ0fjXu97/PFO+w9MZlMYFO1 + Wg2EEJbg8vX+iy3i8vW2KHaEznbkgm63C6PRiJ1DtijmQLCjMRLg8/mgUqmwsw5UTEN5UfD7/ZDL5eZm + mSqWz+cxyMpimhZS7r12uy1n4d/GG3O5Y8QFWyWCTpCcRy8lRK3XeUJcoJVGaFrsXj34V9hYrFrtQSj0 + wa4Z2VgsGh1Dq9WS79z6PBuLkUbjQZZLJN7Y9ZkVxYrFgQzZl3j83TBz5oDFms02uN3fhrmKAxbzer8M + M2dWFNsH7R4Lh+mXnf+MwsZi6fSLLBUMfrLr82wsVio9ssd5NhYzZ1rsEhXVg4dA3ybN12CnSCQCRCkY + UP0gLmAfnpGQHfQM+zGlIO257hAXZLUMJJPJuQ6yx+KBfr+P/3CreAIVTOoC9uEK8Q8mS3ew5XIZYrEY + nuhCN2qQlQZIQL1eZ+ev3VoHAgFwOOjSXqNXNXRXSqlOp8POJBvt+Xu9ngwS4lQN3oVy+egJybLHt2w2 + K0OFOFeHmJFByn5+2eXTM1WMDIdD8Hg8coAQtyquCKGfHVq/kOekUik2k2O6mKZQKOBAKrea0+nE7Y2b + zVhuAr/Ce2bVcGWw1gAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACYAAAAeCAYAAABAFGxuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAIGSURBVFhH7de/SwJhGAfwtwJpUlBwaVIEcXDVxcUxQaS1 + QdLVwTnQv0AcGgUdo9U1dNAWHVwiEQKFaAkCwZqq5el53rvT03v8cXqeDQ0fjXu97/PFO+w9MZlMYFO1 + Wg2EEJbg8vX+iy3i8vW2KHaEznbkgm63C6PRiJ1DtijmQLCjMRLg8/mgUqmwsw5UTEN5UfD7/ZDL5eZm + mSqWz+cxyMpimhZS7r12uy1n4d/GG3O5Y8QFWyWCTpCcRy8lRK3XeUJcoJVGaFrsXj34V9hYrFrtQSj0 + wa4Z2VgsGh1Dq9WS79z6PBuLkUbjQZZLJN7Y9ZkVxYrFgQzZl3j83TBz5oDFms02uN3fhrmKAxbzer8M + M2dWFNsH7R4Lh+mXnf+MwsZi6fSLLBUMfrLr82wsVio9ssd5NhYzZ1rsEhXVg4dA3ybN12CnSCQCRCkY + UP0gLmAfnpGQHfQM+zGlIO257hAXZLUMJJPJuQ6yx+KBfr+P/3CreAIVTOoC9uEK8Q8mS3ew5XIZYrEY + nuhCN2qQlQZIQL1eZ+ev3VoHAgFwOOjSXqNXNXRXSqlOp8POJBvt+Xu9ngwS4lQN3oVy+egJybLHt2w2 + K0OFOFeHmJFByn5+2eXTM1WMDIdD8Hg8coAQtyquCKGfHVq/kOekUik2k2O6mKZQKOBAKrea0+nE7Y2b + zVhuAr/Ce2bVcGWw1gAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACYAAAAeCAYAAABAFGxuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAIGSURBVFhH7de/SwJhGAfwtwJpUlBwaVIEcXDVxcUxQaS1 + QdLVwTnQv0AcGgUdo9U1dNAWHVwiEQKFaAkCwZqq5el53rvT03v8cXqeDQ0fjXu97/PFO+w9MZlMYFO1 + Wg2EEJbg8vX+iy3i8vW2KHaEznbkgm63C6PRiJ1DtijmQLCjMRLg8/mgUqmwsw5UTEN5UfD7/ZDL5eZm + mSqWz+cxyMpimhZS7r12uy1n4d/GG3O5Y8QFWyWCTpCcRy8lRK3XeUJcoJVGaFrsXj34V9hYrFrtQSj0 + wa4Z2VgsGh1Dq9WS79z6PBuLkUbjQZZLJN7Y9ZkVxYrFgQzZl3j83TBz5oDFms02uN3fhrmKAxbzer8M + M2dWFNsH7R4Lh+mXnf+MwsZi6fSLLBUMfrLr82wsVio9ssd5NhYzZ1rsEhXVg4dA3ybN12CnSCQCRCkY + UP0gLmAfnpGQHfQM+zGlIO257hAXZLUMJJPJuQ6yx+KBfr+P/3CreAIVTOoC9uEK8Q8mS3ew5XIZYrEY + nuhCN2qQlQZIQL1eZ+ev3VoHAgFwOOjSXqNXNXRXSqlOp8POJBvt+Xu9ngwS4lQN3oVy+egJybLHt2w2 + K0OFOFeHmJFByn5+2eXTM1WMDIdD8Hg8coAQtyquCKGfHVq/kOekUik2k2O6mKZQKOBAKrea0+nE7Y2b + zVhuAr/Ce2bVcGWw1gAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACYAAAAeCAYAAABAFGxuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAIGSURBVFhH7de/SwJhGAfwtwJpUlBwaVIEcXDVxcUxQaS1 + QdLVwTnQv0AcGgUdo9U1dNAWHVwiEQKFaAkCwZqq5el53rvT03v8cXqeDQ0fjXu97/PFO+w9MZlMYFO1 + Wg2EEJbg8vX+iy3i8vW2KHaEznbkgm63C6PRiJ1DtijmQLCjMRLg8/mgUqmwsw5UTEN5UfD7/ZDL5eZm + mSqWz+cxyMpimhZS7r12uy1n4d/GG3O5Y8QFWyWCTpCcRy8lRK3XeUJcoJVGaFrsXj34V9hYrFrtQSj0 + wa4Z2VgsGh1Dq9WS79z6PBuLkUbjQZZLJN7Y9ZkVxYrFgQzZl3j83TBz5oDFms02uN3fhrmKAxbzer8M + M2dWFNsH7R4Lh+mXnf+MwsZi6fSLLBUMfrLr82wsVio9ssd5NhYzZ1rsEhXVg4dA3ybN12CnSCQCRCkY + UP0gLmAfnpGQHfQM+zGlIO257hAXZLUMJJPJuQ6yx+KBfr+P/3CreAIVTOoC9uEK8Q8mS3ew5XIZYrEY + nuhCN2qQlQZIQL1eZ+ev3VoHAgFwOOjSXqNXNXRXSqlOp8POJBvt+Xu9ngwS4lQN3oVy+egJybLHt2w2 + K0OFOFeHmJFByn5+2eXTM1WMDIdD8Hg8coAQtyquCKGfHVq/kOekUik2k2O6mKZQKOBAKrea0+nE7Y2b + zVhuAr/Ce2bVcGWw1gAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACYAAAAeCAYAAABAFGxuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAIGSURBVFhH7de/SwJhGAfwtwJpUlBwaVIEcXDVxcUxQaS1 + QdLVwTnQv0AcGgUdo9U1dNAWHVwiEQKFaAkCwZqq5el53rvT03v8cXqeDQ0fjXu97/PFO+w9MZlMYFO1 + Wg2EEJbg8vX+iy3i8vW2KHaEznbkgm63C6PRiJ1DtijmQLCjMRLg8/mgUqmwsw5UTEN5UfD7/ZDL5eZm + mSqWz+cxyMpimhZS7r12uy1n4d/GG3O5Y8QFWyWCTpCcRy8lRK3XeUJcoJVGaFrsXj34V9hYrFrtQSj0 + wa4Z2VgsGh1Dq9WS79z6PBuLkUbjQZZLJN7Y9ZkVxYrFgQzZl3j83TBz5oDFms02uN3fhrmKAxbzer8M + M2dWFNsH7R4Lh+mXnf+MwsZi6fSLLBUMfrLr82wsVio9ssd5NhYzZ1rsEhXVg4dA3ybN12CnSCQCRCkY + UP0gLmAfnpGQHfQM+zGlIO257hAXZLUMJJPJuQ6yx+KBfr+P/3CreAIVTOoC9uEK8Q8mS3ew5XIZYrEY + nuhCN2qQlQZIQL1eZ+ev3VoHAgFwOOjSXqNXNXRXSqlOp8POJBvt+Xu9ngwS4lQN3oVy+egJybLHt2w2 + K0OFOFeHmJFByn5+2eXTM1WMDIdD8Hg8coAQtyquCKGfHVq/kOekUik2k2O6mKZQKOBAKrea0+nE7Y2b + zVhuAr/Ce2bVcGWw1gAAAABJRU5ErkJggg== + + + + + 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 + zVhuAr/Ce2bVcGWw1gAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACYAAAAeCAYAAABAFGxuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAIGSURBVFhH7de/SwJhGAfwtwJpUlBwaVIEcXDVxcUxQaS1 + QdLVwTnQv0AcGgUdo9U1dNAWHVwiEQKFaAkCwZqq5el53rvT03v8cXqeDQ0fjXu97/PFO+w9MZlMYFO1 + Wg2EEJbg8vX+iy3i8vW2KHaEznbkgm63C6PRiJ1DtijmQLCjMRLg8/mgUqmwsw5UTEN5UfD7/ZDL5eZm + mSqWz+cxyMpimhZS7r12uy1n4d/GG3O5Y8QFWyWCTpCcRy8lRK3XeUJcoJVGaFrsXj34V9hYrFrtQSj0 + wa4Z2VgsGh1Dq9WS79z6PBuLkUbjQZZLJN7Y9ZkVxYrFgQzZl3j83TBz5oDFms02uN3fhrmKAxbzer8M + M2dWFNsH7R4Lh+mXnf+MwsZi6fSLLBUMfrLr82wsVio9ssd5NhYzZ1rsEhXVg4dA3ybN12CnSCQCRCkY + UP0gLmAfnpGQHfQM+zGlIO257hAXZLUMJJPJuQ6yx+KBfr+P/3CreAIVTOoC9uEK8Q8mS3ew5XIZYrEY + nuhCN2qQlQZIQL1eZ+ev3VoHAgFwOOjSXqNXNXRXSqlOp8POJBvt+Xu9ngwS4lQN3oVy+egJybLHt2w2 + K0OFOFeHmJFByn5+2eXTM1WMDIdD8Hg8coAQtyquCKGfHVq/kOekUik2k2O6mKZQKOBAKrea0+nE7Y2b + zVhuAr/Ce2bVcGWw1gAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACYAAAAeCAYAAABAFGxuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAIGSURBVFhH7de/SwJhGAfwtwJpUlBwaVIEcXDVxcUxQaS1 + QdLVwTnQv0AcGgUdo9U1dNAWHVwiEQKFaAkCwZqq5el53rvT03v8cXqeDQ0fjXu97/PFO+w9MZlMYFO1 + Wg2EEJbg8vX+iy3i8vW2KHaEznbkgm63C6PRiJ1DtijmQLCjMRLg8/mgUqmwsw5UTEN5UfD7/ZDL5eZm + mSqWz+cxyMpimhZS7r12uy1n4d/GG3O5Y8QFWyWCTpCcRy8lRK3XeUJcoJVGaFrsXj34V9hYrFrtQSj0 + wa4Z2VgsGh1Dq9WS79z6PBuLkUbjQZZLJN7Y9ZkVxYrFgQzZl3j83TBz5oDFms02uN3fhrmKAxbzer8M + M2dWFNsH7R4Lh+mXnf+MwsZi6fSLLBUMfrLr82wsVio9ssd5NhYzZ1rsEhXVg4dA3ybN12CnSCQCRCkY + UP0gLmAfnpGQHfQM+zGlIO257hAXZLUMJJPJuQ6yx+KBfr+P/3CreAIVTOoC9uEK8Q8mS3ew5XIZYrEY + nuhCN2qQlQZIQL1eZ+ev3VoHAgFwOOjSXqNXNXRXSqlOp8POJBvt+Xu9ngwS4lQN3oVy+egJybLHt2w2 + K0OFOFeHmJFByn5+2eXTM1WMDIdD8Hg8coAQtyquCKGfHVq/kOekUik2k2O6mKZQKOBAKrea0+nE7Y2b + zVhuAr/Ce2bVcGWw1gAAAABJRU5ErkJggg== + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Screens/ProcessTabPageCtrl6.Designer.cs b/TBF_V2/Sources/TBF/TBF/Screens/ProcessTabPageCtrl6.Designer.cs new file mode 100644 index 00000000..1cfb0c6a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Screens/ProcessTabPageCtrl6.Designer.cs @@ -0,0 +1,1982 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.Screens +{ + partial class ProcessTabPageCtrl6 + { + /// + /// 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 Component 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(ProcessTabPageCtrl6)); + this.sensor1Label = new System.Windows.Forms.Label(); + this.pulses1Label = new System.Windows.Forms.Label(); + this.refPulses1Label = new System.Windows.Forms.Label(); + this.pulses1CapLabel = new System.Windows.Forms.Label(); + this.refPulses1CapLabel = new System.Windows.Forms.Label(); + this.volume1CapLabel = new System.Windows.Forms.Label(); + this.volume1Label = new System.Windows.Forms.Label(); + this.error1CapLabel = new System.Windows.Forms.Label(); + this.error1Label = new System.Windows.Forms.Label(); + this.passed1Label = new System.Windows.Forms.Label(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.sensor1CapLabel = new System.Windows.Forms.Label(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.sensor2CapLabel = new System.Windows.Forms.Label(); + this.passed2Label = new System.Windows.Forms.Label(); + this.error2Label = new System.Windows.Forms.Label(); + this.error2CapLabel = new System.Windows.Forms.Label(); + this.volume2Label = new System.Windows.Forms.Label(); + this.volume2CapLabel = new System.Windows.Forms.Label(); + this.refPulses2CapLabel = new System.Windows.Forms.Label(); + this.pulses2CapLabel = new System.Windows.Forms.Label(); + this.refPulses2Label = new System.Windows.Forms.Label(); + this.pulses2Label = new System.Windows.Forms.Label(); + this.sensor2Label = new System.Windows.Forms.Label(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.sensor3CapLabel = new System.Windows.Forms.Label(); + this.passed3Label = new System.Windows.Forms.Label(); + this.error3Label = new System.Windows.Forms.Label(); + this.error3CapLabel = new System.Windows.Forms.Label(); + this.volume3Label = new System.Windows.Forms.Label(); + this.volume3CapLabel = new System.Windows.Forms.Label(); + this.refPulses3CapLabel = new System.Windows.Forms.Label(); + this.pulses3CapLabel = new System.Windows.Forms.Label(); + this.refPulses3Label = new System.Windows.Forms.Label(); + this.pulses3Label = new System.Windows.Forms.Label(); + this.sensor3Label = new System.Windows.Forms.Label(); + this.tInCapLabel = new System.Windows.Forms.Label(); + this.prUpCapLabel = new System.Windows.Forms.Label(); + this.tInLabel = new System.Windows.Forms.Label(); + this.prUpLabel = new System.Windows.Forms.Label(); + this.prDownLabel = new System.Windows.Forms.Label(); + this.tOutLabel = new System.Windows.Forms.Label(); + this.prDownCapLabel = new System.Windows.Forms.Label(); + this.tOutCapLabel = new System.Windows.Forms.Label(); + this.refFlowCapLabel = new System.Windows.Forms.Label(); + this.tInCmpntLabel = new System.Windows.Forms.Label(); + this.tOutCmpntLabel = new System.Windows.Forms.Label(); + this.prOutCmpntLabel = new System.Windows.Forms.Label(); + this.prInCmpntLabel = new System.Windows.Forms.Label(); + this.refFlowLabel = new System.Windows.Forms.Label(); + this.refFreqCapLabel = new System.Windows.Forms.Label(); + this.refFreqLabel = new System.Windows.Forms.Label(); + this.refPulsesCapLabel = new System.Windows.Forms.Label(); + this.refPulsesLabel = new System.Windows.Forms.Label(); + this.refFlowCmpntLabel = new System.Windows.Forms.Label(); + this.regValveCmpntLabel = new System.Windows.Forms.Label(); + this.regValvePosLabel = new System.Windows.Forms.Label(); + this.regValvePosCapLabel = new System.Windows.Forms.Label(); + this.tDivCmpntLabel = new System.Windows.Forms.Label(); + this.tDivLabel = new System.Windows.Forms.Label(); + this.tDivCapLabel = new System.Windows.Forms.Label(); + this.scaleCmpntLabel = new System.Windows.Forms.Label(); + this.massCapLabel = new System.Windows.Forms.Label(); + this.massLabel = new System.Windows.Forms.Label(); + this.massDiffCapLabel = new System.Windows.Forms.Label(); + this.massDiffLabel = new System.Windows.Forms.Label(); + this.refVolumeCapLabel = new System.Windows.Forms.Label(); + this.refVolumeLabel = new System.Windows.Forms.Label(); + this.volumeCtvCapLabel = new System.Windows.Forms.Label(); + this.volumeCtvLabel = new System.Windows.Forms.Label(); + this.refErrorCapLabel = new System.Windows.Forms.Label(); + this.refErrorLabel = new System.Windows.Forms.Label(); + this.targetFlowLowCapLabel = new System.Windows.Forms.Label(); + this.targetFlowHighCapLabel = new System.Windows.Forms.Label(); + this.targetVolumeCapLabel = new System.Windows.Forms.Label(); + this.estmtdTimeCapLabel = new System.Windows.Forms.Label(); + this.targetFlowLowLabel = new System.Windows.Forms.Label(); + this.targetFlowHighLabel = new System.Windows.Forms.Label(); + this.targetVolumeLabel = new System.Windows.Forms.Label(); + this.targetRefCountCapLabel = new System.Windows.Forms.Label(); + this.targetRefCountLabel = new System.Windows.Forms.Label(); + this.estmtdTimeLabel = new System.Windows.Forms.Label(); + this.airTempCapLabel = new System.Windows.Forms.Label(); + this.airPressCapLabel = new System.Windows.Forms.Label(); + this.airHumiCapLabel = new System.Windows.Forms.Label(); + this.airTempLabel = new System.Windows.Forms.Label(); + this.airPressLabel = new System.Windows.Forms.Label(); + this.airHumiLabel = new System.Windows.Forms.Label(); + this.reservoirPictureBox = new System.Windows.Forms.PictureBox(); + this.pumpPictureBox = new System.Windows.Forms.PictureBox(); + this.watermeterPictureBox1 = new System.Windows.Forms.PictureBox(); + this.watermeterPictureBox2 = new System.Windows.Forms.PictureBox(); + this.watermeterPictureBox3 = new System.Windows.Forms.PictureBox(); + this.watermeterPictureBox4 = new System.Windows.Forms.PictureBox(); + this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.sensor4CapLabel = new System.Windows.Forms.Label(); + this.passed4Label = new System.Windows.Forms.Label(); + this.error4Label = new System.Windows.Forms.Label(); + this.error4CapLabel = new System.Windows.Forms.Label(); + this.volume4Label = new System.Windows.Forms.Label(); + this.volume4CapLabel = new System.Windows.Forms.Label(); + this.refPulses4CapLabel = new System.Windows.Forms.Label(); + this.pulses4CapLabel = new System.Windows.Forms.Label(); + this.refPulses4Label = new System.Windows.Forms.Label(); + this.pulses4Label = new System.Windows.Forms.Label(); + this.sensor4Label = new System.Windows.Forms.Label(); + this.watermeterPictureBox5 = new System.Windows.Forms.PictureBox(); + this.groupBox5 = new System.Windows.Forms.GroupBox(); + this.sensor5CapLabel = new System.Windows.Forms.Label(); + this.passed5Label = new System.Windows.Forms.Label(); + this.error5Label = new System.Windows.Forms.Label(); + this.error5CapLabel = new System.Windows.Forms.Label(); + this.volume5Label = new System.Windows.Forms.Label(); + this.volume5CapLabel = new System.Windows.Forms.Label(); + this.refPulses5CapLabel = new System.Windows.Forms.Label(); + this.pulses5CapLabel = new System.Windows.Forms.Label(); + this.refPulses5Label = new System.Windows.Forms.Label(); + this.pulses5Label = new System.Windows.Forms.Label(); + this.sensor5Label = new System.Windows.Forms.Label(); + this.watermeterPictureBox6 = new System.Windows.Forms.PictureBox(); + this.groupBox6 = new System.Windows.Forms.GroupBox(); + this.sensor6CapLabel = new System.Windows.Forms.Label(); + this.passed6Label = new System.Windows.Forms.Label(); + this.error6Label = new System.Windows.Forms.Label(); + this.error6CapLabel = new System.Windows.Forms.Label(); + this.volume6Label = new System.Windows.Forms.Label(); + this.volume6CapLabel = new System.Windows.Forms.Label(); + this.refPulses6CapLabel = new System.Windows.Forms.Label(); + this.pulses6CapLabel = new System.Windows.Forms.Label(); + this.refPulses6Label = new System.Windows.Forms.Label(); + this.pulses6Label = new System.Windows.Forms.Label(); + this.sensor6Label = new System.Windows.Forms.Label(); + this.flowMeterPictureBox = new System.Windows.Forms.PictureBox(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.watermeterPictureBox1z = new System.Windows.Forms.PictureBox(); + this.watermeterPictureBox2z = new System.Windows.Forms.PictureBox(); + this.watermeterPictureBox3z = new System.Windows.Forms.PictureBox(); + this.groupBox1z = new System.Windows.Forms.GroupBox(); + this.passed1zLabel = new System.Windows.Forms.Label(); + this.error1zLabel = new System.Windows.Forms.Label(); + this.error1zCapLabel = new System.Windows.Forms.Label(); + this.volume1zLabel = new System.Windows.Forms.Label(); + this.volume1zCapLabel = new System.Windows.Forms.Label(); + this.groupBox2z = new System.Windows.Forms.GroupBox(); + this.passed2zLabel = new System.Windows.Forms.Label(); + this.error2zLabel = new System.Windows.Forms.Label(); + this.error2zCapLabel = new System.Windows.Forms.Label(); + this.volume2zLabel = new System.Windows.Forms.Label(); + this.volume2zCapLabel = new System.Windows.Forms.Label(); + this.groupBox3z = new System.Windows.Forms.GroupBox(); + this.passed3zLabel = new System.Windows.Forms.Label(); + this.error3zLabel = new System.Windows.Forms.Label(); + this.error3zCapLabel = new System.Windows.Forms.Label(); + this.volume3zLabel = new System.Windows.Forms.Label(); + this.volume3zCapLabel = new System.Windows.Forms.Label(); + this.pumpPctTextBox = new System.Windows.Forms.TextBox(); + this.groupBox1.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.groupBox3.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.reservoirPictureBox)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pumpPictureBox)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox3)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox4)).BeginInit(); + this.groupBox4.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox5)).BeginInit(); + this.groupBox5.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox6)).BeginInit(); + this.groupBox6.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.flowMeterPictureBox)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox1z)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox2z)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox3z)).BeginInit(); + this.groupBox1z.SuspendLayout(); + this.groupBox2z.SuspendLayout(); + this.groupBox3z.SuspendLayout(); + this.SuspendLayout(); + // + // sensor1Label + // + this.sensor1Label.AutoSize = true; + this.sensor1Label.Location = new System.Drawing.Point(72, 16); + this.sensor1Label.Name = "sensor1Label"; + this.sensor1Label.Size = new System.Drawing.Size(44, 13); + this.sensor1Label.TabIndex = 0; + this.sensor1Label.Text = "sensor1"; + // + // pulses1Label + // + this.pulses1Label.AutoSize = true; + this.pulses1Label.Location = new System.Drawing.Point(72, 34); + this.pulses1Label.Name = "pulses1Label"; + this.pulses1Label.Size = new System.Drawing.Size(43, 13); + this.pulses1Label.TabIndex = 1; + this.pulses1Label.Text = "pulses1"; + // + // refPulses1Label + // + this.refPulses1Label.AutoSize = true; + this.refPulses1Label.Location = new System.Drawing.Point(72, 53); + this.refPulses1Label.Name = "refPulses1Label"; + this.refPulses1Label.Size = new System.Drawing.Size(56, 13); + this.refPulses1Label.TabIndex = 2; + this.refPulses1Label.Text = "refPulses1"; + // + // pulses1CapLabel + // + this.pulses1CapLabel.AutoSize = true; + this.pulses1CapLabel.Location = new System.Drawing.Point(2, 34); + this.pulses1CapLabel.Name = "pulses1CapLabel"; + this.pulses1CapLabel.Size = new System.Drawing.Size(38, 13); + this.pulses1CapLabel.TabIndex = 3; + this.pulses1CapLabel.Text = "Count:"; + // + // refPulses1CapLabel + // + this.refPulses1CapLabel.AutoSize = true; + this.refPulses1CapLabel.Location = new System.Drawing.Point(1, 53); + this.refPulses1CapLabel.Name = "refPulses1CapLabel"; + this.refPulses1CapLabel.Size = new System.Drawing.Size(60, 13); + this.refPulses1CapLabel.TabIndex = 4; + this.refPulses1CapLabel.Text = "Ref. count:"; + // + // volume1CapLabel + // + this.volume1CapLabel.AutoSize = true; + this.volume1CapLabel.Location = new System.Drawing.Point(21, 71); + this.volume1CapLabel.Name = "volume1CapLabel"; + this.volume1CapLabel.Size = new System.Drawing.Size(45, 13); + this.volume1CapLabel.TabIndex = 5; + this.volume1CapLabel.Text = "Volume:"; + // + // volume1Label + // + this.volume1Label.AutoSize = true; + this.volume1Label.Location = new System.Drawing.Point(72, 71); + this.volume1Label.Name = "volume1Label"; + this.volume1Label.Size = new System.Drawing.Size(47, 13); + this.volume1Label.TabIndex = 6; + this.volume1Label.Text = "volume1"; + // + // error1CapLabel + // + this.error1CapLabel.AutoSize = true; + this.error1CapLabel.Location = new System.Drawing.Point(17, 90); + this.error1CapLabel.Name = "error1CapLabel"; + this.error1CapLabel.Size = new System.Drawing.Size(49, 13); + this.error1CapLabel.TabIndex = 7; + this.error1CapLabel.Text = "Error [%]:"; + // + // error1Label + // + this.error1Label.AutoSize = true; + this.error1Label.Location = new System.Drawing.Point(72, 90); + this.error1Label.Name = "error1Label"; + this.error1Label.Size = new System.Drawing.Size(34, 13); + this.error1Label.TabIndex = 8; + this.error1Label.Text = "error1"; + // + // passed1Label + // + this.passed1Label.AutoSize = true; + this.passed1Label.Location = new System.Drawing.Point(72, 108); + this.passed1Label.Name = "passed1Label"; + this.passed1Label.Size = new System.Drawing.Size(47, 13); + this.passed1Label.TabIndex = 9; + this.passed1Label.Text = "passed1"; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.sensor1CapLabel); + this.groupBox1.Controls.Add(this.passed1Label); + this.groupBox1.Controls.Add(this.error1Label); + this.groupBox1.Controls.Add(this.error1CapLabel); + this.groupBox1.Controls.Add(this.volume1Label); + this.groupBox1.Controls.Add(this.volume1CapLabel); + this.groupBox1.Controls.Add(this.refPulses1CapLabel); + this.groupBox1.Controls.Add(this.pulses1CapLabel); + this.groupBox1.Controls.Add(this.refPulses1Label); + this.groupBox1.Controls.Add(this.pulses1Label); + this.groupBox1.Controls.Add(this.sensor1Label); + this.groupBox1.Location = new System.Drawing.Point(23, 229); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(139, 131); + this.groupBox1.TabIndex = 10; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Meter 1"; + // + // sensor1CapLabel + // + this.sensor1CapLabel.AutoSize = true; + this.sensor1CapLabel.Location = new System.Drawing.Point(23, 16); + this.sensor1CapLabel.Name = "sensor1CapLabel"; + this.sensor1CapLabel.Size = new System.Drawing.Size(43, 13); + this.sensor1CapLabel.TabIndex = 10; + this.sensor1CapLabel.Text = "Sensor:"; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.sensor2CapLabel); + this.groupBox2.Controls.Add(this.passed2Label); + this.groupBox2.Controls.Add(this.error2Label); + this.groupBox2.Controls.Add(this.error2CapLabel); + this.groupBox2.Controls.Add(this.volume2Label); + this.groupBox2.Controls.Add(this.volume2CapLabel); + this.groupBox2.Controls.Add(this.refPulses2CapLabel); + this.groupBox2.Controls.Add(this.pulses2CapLabel); + this.groupBox2.Controls.Add(this.refPulses2Label); + this.groupBox2.Controls.Add(this.pulses2Label); + this.groupBox2.Controls.Add(this.sensor2Label); + this.groupBox2.Location = new System.Drawing.Point(164, 229); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(139, 131); + this.groupBox2.TabIndex = 11; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Meter 2"; + // + // sensor2CapLabel + // + this.sensor2CapLabel.AutoSize = true; + this.sensor2CapLabel.Location = new System.Drawing.Point(23, 16); + this.sensor2CapLabel.Name = "sensor2CapLabel"; + this.sensor2CapLabel.Size = new System.Drawing.Size(43, 13); + this.sensor2CapLabel.TabIndex = 11; + this.sensor2CapLabel.Text = "Sensor:"; + // + // passed2Label + // + this.passed2Label.AutoSize = true; + this.passed2Label.Location = new System.Drawing.Point(72, 108); + this.passed2Label.Name = "passed2Label"; + this.passed2Label.Size = new System.Drawing.Size(47, 13); + this.passed2Label.TabIndex = 9; + this.passed2Label.Text = "passed2"; + // + // error2Label + // + this.error2Label.AutoSize = true; + this.error2Label.Location = new System.Drawing.Point(72, 90); + this.error2Label.Name = "error2Label"; + this.error2Label.Size = new System.Drawing.Size(34, 13); + this.error2Label.TabIndex = 8; + this.error2Label.Text = "error2"; + // + // error2CapLabel + // + this.error2CapLabel.AutoSize = true; + this.error2CapLabel.Location = new System.Drawing.Point(17, 90); + this.error2CapLabel.Name = "error2CapLabel"; + this.error2CapLabel.Size = new System.Drawing.Size(49, 13); + this.error2CapLabel.TabIndex = 7; + this.error2CapLabel.Text = "Error [%]:"; + // + // volume2Label + // + this.volume2Label.AutoSize = true; + this.volume2Label.Location = new System.Drawing.Point(72, 71); + this.volume2Label.Name = "volume2Label"; + this.volume2Label.Size = new System.Drawing.Size(47, 13); + this.volume2Label.TabIndex = 6; + this.volume2Label.Text = "volume2"; + // + // volume2CapLabel + // + this.volume2CapLabel.AutoSize = true; + this.volume2CapLabel.Location = new System.Drawing.Point(21, 71); + this.volume2CapLabel.Name = "volume2CapLabel"; + this.volume2CapLabel.Size = new System.Drawing.Size(45, 13); + this.volume2CapLabel.TabIndex = 5; + this.volume2CapLabel.Text = "Volume:"; + // + // refPulses2CapLabel + // + this.refPulses2CapLabel.AutoSize = true; + this.refPulses2CapLabel.Location = new System.Drawing.Point(1, 53); + this.refPulses2CapLabel.Name = "refPulses2CapLabel"; + this.refPulses2CapLabel.Size = new System.Drawing.Size(60, 13); + this.refPulses2CapLabel.TabIndex = 4; + this.refPulses2CapLabel.Text = "Ref. count:"; + // + // pulses2CapLabel + // + this.pulses2CapLabel.AutoSize = true; + this.pulses2CapLabel.Location = new System.Drawing.Point(2, 34); + this.pulses2CapLabel.Name = "pulses2CapLabel"; + this.pulses2CapLabel.Size = new System.Drawing.Size(38, 13); + this.pulses2CapLabel.TabIndex = 3; + this.pulses2CapLabel.Text = "Count:"; + // + // refPulses2Label + // + this.refPulses2Label.AutoSize = true; + this.refPulses2Label.Location = new System.Drawing.Point(72, 53); + this.refPulses2Label.Name = "refPulses2Label"; + this.refPulses2Label.Size = new System.Drawing.Size(56, 13); + this.refPulses2Label.TabIndex = 2; + this.refPulses2Label.Text = "refPulses2"; + // + // pulses2Label + // + this.pulses2Label.AutoSize = true; + this.pulses2Label.Location = new System.Drawing.Point(72, 34); + this.pulses2Label.Name = "pulses2Label"; + this.pulses2Label.Size = new System.Drawing.Size(43, 13); + this.pulses2Label.TabIndex = 1; + this.pulses2Label.Text = "pulses2"; + // + // sensor2Label + // + this.sensor2Label.AutoSize = true; + this.sensor2Label.Location = new System.Drawing.Point(72, 16); + this.sensor2Label.Name = "sensor2Label"; + this.sensor2Label.Size = new System.Drawing.Size(44, 13); + this.sensor2Label.TabIndex = 0; + this.sensor2Label.Text = "sensor2"; + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.sensor3CapLabel); + this.groupBox3.Controls.Add(this.passed3Label); + this.groupBox3.Controls.Add(this.error3Label); + this.groupBox3.Controls.Add(this.error3CapLabel); + this.groupBox3.Controls.Add(this.volume3Label); + this.groupBox3.Controls.Add(this.volume3CapLabel); + this.groupBox3.Controls.Add(this.refPulses3CapLabel); + this.groupBox3.Controls.Add(this.pulses3CapLabel); + this.groupBox3.Controls.Add(this.refPulses3Label); + this.groupBox3.Controls.Add(this.pulses3Label); + this.groupBox3.Controls.Add(this.sensor3Label); + this.groupBox3.Location = new System.Drawing.Point(305, 229); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(139, 131); + this.groupBox3.TabIndex = 12; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "Meter 3"; + // + // sensor3CapLabel + // + this.sensor3CapLabel.AutoSize = true; + this.sensor3CapLabel.Location = new System.Drawing.Point(23, 16); + this.sensor3CapLabel.Name = "sensor3CapLabel"; + this.sensor3CapLabel.Size = new System.Drawing.Size(43, 13); + this.sensor3CapLabel.TabIndex = 11; + this.sensor3CapLabel.Text = "Sensor:"; + // + // passed3Label + // + this.passed3Label.AutoSize = true; + this.passed3Label.Location = new System.Drawing.Point(72, 108); + this.passed3Label.Name = "passed3Label"; + this.passed3Label.Size = new System.Drawing.Size(47, 13); + this.passed3Label.TabIndex = 9; + this.passed3Label.Text = "passed3"; + // + // error3Label + // + this.error3Label.AutoSize = true; + this.error3Label.Location = new System.Drawing.Point(72, 90); + this.error3Label.Name = "error3Label"; + this.error3Label.Size = new System.Drawing.Size(34, 13); + this.error3Label.TabIndex = 8; + this.error3Label.Text = "error3"; + // + // error3CapLabel + // + this.error3CapLabel.AutoSize = true; + this.error3CapLabel.Location = new System.Drawing.Point(17, 90); + this.error3CapLabel.Name = "error3CapLabel"; + this.error3CapLabel.Size = new System.Drawing.Size(49, 13); + this.error3CapLabel.TabIndex = 7; + this.error3CapLabel.Text = "Error [%]:"; + // + // volume3Label + // + this.volume3Label.AutoSize = true; + this.volume3Label.Location = new System.Drawing.Point(72, 71); + this.volume3Label.Name = "volume3Label"; + this.volume3Label.Size = new System.Drawing.Size(47, 13); + this.volume3Label.TabIndex = 6; + this.volume3Label.Text = "volume3"; + // + // volume3CapLabel + // + this.volume3CapLabel.AutoSize = true; + this.volume3CapLabel.Location = new System.Drawing.Point(21, 71); + this.volume3CapLabel.Name = "volume3CapLabel"; + this.volume3CapLabel.Size = new System.Drawing.Size(45, 13); + this.volume3CapLabel.TabIndex = 5; + this.volume3CapLabel.Text = "Volume:"; + // + // refPulses3CapLabel + // + this.refPulses3CapLabel.AutoSize = true; + this.refPulses3CapLabel.Location = new System.Drawing.Point(1, 53); + this.refPulses3CapLabel.Name = "refPulses3CapLabel"; + this.refPulses3CapLabel.Size = new System.Drawing.Size(60, 13); + this.refPulses3CapLabel.TabIndex = 4; + this.refPulses3CapLabel.Text = "Ref. count:"; + // + // pulses3CapLabel + // + this.pulses3CapLabel.AutoSize = true; + this.pulses3CapLabel.Location = new System.Drawing.Point(2, 34); + this.pulses3CapLabel.Name = "pulses3CapLabel"; + this.pulses3CapLabel.Size = new System.Drawing.Size(38, 13); + this.pulses3CapLabel.TabIndex = 3; + this.pulses3CapLabel.Text = "Count:"; + // + // refPulses3Label + // + this.refPulses3Label.AutoSize = true; + this.refPulses3Label.Location = new System.Drawing.Point(72, 53); + this.refPulses3Label.Name = "refPulses3Label"; + this.refPulses3Label.Size = new System.Drawing.Size(56, 13); + this.refPulses3Label.TabIndex = 2; + this.refPulses3Label.Text = "refPulses3"; + // + // pulses3Label + // + this.pulses3Label.AutoSize = true; + this.pulses3Label.Location = new System.Drawing.Point(72, 34); + this.pulses3Label.Name = "pulses3Label"; + this.pulses3Label.Size = new System.Drawing.Size(43, 13); + this.pulses3Label.TabIndex = 1; + this.pulses3Label.Text = "pulses3"; + // + // sensor3Label + // + this.sensor3Label.AutoSize = true; + this.sensor3Label.Location = new System.Drawing.Point(72, 16); + this.sensor3Label.Name = "sensor3Label"; + this.sensor3Label.Size = new System.Drawing.Size(44, 13); + this.sensor3Label.TabIndex = 0; + this.sensor3Label.Text = "sensor3"; + // + // tInCapLabel + // + this.tInCapLabel.AutoSize = true; + this.tInCapLabel.Location = new System.Drawing.Point(60, 129); + this.tInCapLabel.Name = "tInCapLabel"; + this.tInCapLabel.Size = new System.Drawing.Size(48, 13); + this.tInCapLabel.TabIndex = 13; + this.tInCapLabel.Text = "T in [°C]:"; + // + // prUpCapLabel + // + this.prUpCapLabel.AutoSize = true; + this.prUpCapLabel.Location = new System.Drawing.Point(49, 91); + this.prUpCapLabel.Name = "prUpCapLabel"; + this.prUpCapLabel.Size = new System.Drawing.Size(59, 13); + this.prUpCapLabel.TabIndex = 14; + this.prUpCapLabel.Text = "Pr up [bar]:"; + // + // tInLabel + // + this.tInLabel.AutoSize = true; + this.tInLabel.Location = new System.Drawing.Point(132, 129); + this.tInLabel.Name = "tInLabel"; + this.tInLabel.Size = new System.Drawing.Size(19, 13); + this.tInLabel.TabIndex = 15; + this.tInLabel.Text = "tIn"; + // + // prUpLabel + // + this.prUpLabel.AutoSize = true; + this.prUpLabel.Location = new System.Drawing.Point(132, 91); + this.prUpLabel.Name = "prUpLabel"; + this.prUpLabel.Size = new System.Drawing.Size(30, 13); + this.prUpLabel.TabIndex = 16; + this.prUpLabel.Text = "prUp"; + // + // prDownLabel + // + this.prDownLabel.AutoSize = true; + this.prDownLabel.Location = new System.Drawing.Point(578, 91); + this.prDownLabel.Name = "prDownLabel"; + this.prDownLabel.Size = new System.Drawing.Size(44, 13); + this.prDownLabel.TabIndex = 20; + this.prDownLabel.Text = "prDown"; + // + // tOutLabel + // + this.tOutLabel.AutoSize = true; + this.tOutLabel.Location = new System.Drawing.Point(578, 129); + this.tOutLabel.Name = "tOutLabel"; + this.tOutLabel.Size = new System.Drawing.Size(27, 13); + this.tOutLabel.TabIndex = 19; + this.tOutLabel.Text = "tOut"; + // + // prDownCapLabel + // + this.prDownCapLabel.AutoSize = true; + this.prDownCapLabel.Location = new System.Drawing.Point(486, 91); + this.prDownCapLabel.Name = "prDownCapLabel"; + this.prDownCapLabel.Size = new System.Drawing.Size(73, 13); + this.prDownCapLabel.TabIndex = 18; + this.prDownCapLabel.Text = "Pr down [bar]:"; + // + // tOutCapLabel + // + this.tOutCapLabel.AutoSize = true; + this.tOutCapLabel.Location = new System.Drawing.Point(504, 129); + this.tOutCapLabel.Name = "tOutCapLabel"; + this.tOutCapLabel.Size = new System.Drawing.Size(55, 13); + this.tOutCapLabel.TabIndex = 17; + this.tOutCapLabel.Text = "T out [°C]:"; + // + // refFlowCapLabel + // + this.refFlowCapLabel.AutoSize = true; + this.refFlowCapLabel.Location = new System.Drawing.Point(689, 114); + this.refFlowCapLabel.Name = "refFlowCapLabel"; + this.refFlowCapLabel.Size = new System.Drawing.Size(86, 13); + this.refFlowCapLabel.TabIndex = 21; + this.refFlowCapLabel.Text = "Ref. flow [m3/h]:"; + // + // tInCmpntLabel + // + this.tInCmpntLabel.AutoSize = true; + this.tInCmpntLabel.Location = new System.Drawing.Point(132, 113); + this.tInCmpntLabel.Name = "tInCmpntLabel"; + this.tInCmpntLabel.Size = new System.Drawing.Size(49, 13); + this.tInCmpntLabel.TabIndex = 22; + this.tInCmpntLabel.Text = "tInCmpnt"; + // + // tOutCmpntLabel + // + this.tOutCmpntLabel.AutoSize = true; + this.tOutCmpntLabel.Location = new System.Drawing.Point(578, 113); + this.tOutCmpntLabel.Name = "tOutCmpntLabel"; + this.tOutCmpntLabel.Size = new System.Drawing.Size(57, 13); + this.tOutCmpntLabel.TabIndex = 23; + this.tOutCmpntLabel.Text = "tOutCmpnt"; + // + // prOutCmpntLabel + // + this.prOutCmpntLabel.AutoSize = true; + this.prOutCmpntLabel.Location = new System.Drawing.Point(578, 75); + this.prOutCmpntLabel.Name = "prOutCmpntLabel"; + this.prOutCmpntLabel.Size = new System.Drawing.Size(63, 13); + this.prOutCmpntLabel.TabIndex = 24; + this.prOutCmpntLabel.Text = "prOutCmpnt"; + // + // prInCmpntLabel + // + this.prInCmpntLabel.AutoSize = true; + this.prInCmpntLabel.Location = new System.Drawing.Point(132, 75); + this.prInCmpntLabel.Name = "prInCmpntLabel"; + this.prInCmpntLabel.Size = new System.Drawing.Size(55, 13); + this.prInCmpntLabel.TabIndex = 25; + this.prInCmpntLabel.Text = "prInCmpnt"; + // + // refFlowLabel + // + this.refFlowLabel.AutoSize = true; + this.refFlowLabel.Location = new System.Drawing.Point(790, 114); + this.refFlowLabel.Name = "refFlowLabel"; + this.refFlowLabel.Size = new System.Drawing.Size(41, 13); + this.refFlowLabel.TabIndex = 26; + this.refFlowLabel.Text = "refFlow"; + // + // refFreqCapLabel + // + this.refFreqCapLabel.AutoSize = true; + this.refFreqCapLabel.Location = new System.Drawing.Point(699, 95); + this.refFreqCapLabel.Name = "refFreqCapLabel"; + this.refFreqCapLabel.Size = new System.Drawing.Size(76, 13); + this.refFreqCapLabel.TabIndex = 27; + this.refFreqCapLabel.Text = "Ref. freq. [Hz]:"; + // + // refFreqLabel + // + this.refFreqLabel.AutoSize = true; + this.refFreqLabel.Location = new System.Drawing.Point(790, 95); + this.refFreqLabel.Name = "refFreqLabel"; + this.refFreqLabel.Size = new System.Drawing.Size(40, 13); + this.refFreqLabel.TabIndex = 28; + this.refFreqLabel.Text = "refFreq"; + // + // refPulsesCapLabel + // + this.refPulsesCapLabel.AutoSize = true; + this.refPulsesCapLabel.Location = new System.Drawing.Point(715, 77); + this.refPulsesCapLabel.Name = "refPulsesCapLabel"; + this.refPulsesCapLabel.Size = new System.Drawing.Size(60, 13); + this.refPulsesCapLabel.TabIndex = 29; + this.refPulsesCapLabel.Text = "Ref. count:"; + // + // refPulsesLabel + // + this.refPulsesLabel.AutoSize = true; + this.refPulsesLabel.Location = new System.Drawing.Point(790, 77); + this.refPulsesLabel.Name = "refPulsesLabel"; + this.refPulsesLabel.Size = new System.Drawing.Size(50, 13); + this.refPulsesLabel.TabIndex = 30; + this.refPulsesLabel.Text = "refPulses"; + // + // refFlowCmpntLabel + // + this.refFlowCmpntLabel.AutoSize = true; + this.refFlowCmpntLabel.Location = new System.Drawing.Point(790, 59); + this.refFlowCmpntLabel.Name = "refFlowCmpntLabel"; + this.refFlowCmpntLabel.Size = new System.Drawing.Size(71, 13); + this.refFlowCmpntLabel.TabIndex = 31; + this.refFlowCmpntLabel.Text = "refFlowCmpnt"; + // + // regValveCmpntLabel + // + this.regValveCmpntLabel.AutoSize = true; + this.regValveCmpntLabel.Location = new System.Drawing.Point(790, 12); + this.regValveCmpntLabel.Name = "regValveCmpntLabel"; + this.regValveCmpntLabel.Size = new System.Drawing.Size(79, 13); + this.regValveCmpntLabel.TabIndex = 34; + this.regValveCmpntLabel.Text = "regValveCmpnt"; + // + // regValvePosLabel + // + this.regValvePosLabel.AutoSize = true; + this.regValvePosLabel.Location = new System.Drawing.Point(790, 30); + this.regValvePosLabel.Name = "regValvePosLabel"; + this.regValvePosLabel.Size = new System.Drawing.Size(67, 13); + this.regValvePosLabel.TabIndex = 35; + this.regValvePosLabel.Text = "regValvePos"; + // + // regValvePosCapLabel + // + this.regValvePosCapLabel.AutoSize = true; + this.regValvePosCapLabel.Location = new System.Drawing.Point(693, 30); + this.regValvePosCapLabel.Name = "regValvePosCapLabel"; + this.regValvePosCapLabel.Size = new System.Drawing.Size(85, 13); + this.regValvePosCapLabel.TabIndex = 36; + this.regValvePosCapLabel.Text = "Reg. valve pos.:"; + // + // tDivCmpntLabel + // + this.tDivCmpntLabel.AutoSize = true; + this.tDivCmpntLabel.Location = new System.Drawing.Point(578, 12); + this.tDivCmpntLabel.Name = "tDivCmpntLabel"; + this.tDivCmpntLabel.Size = new System.Drawing.Size(56, 13); + this.tDivCmpntLabel.TabIndex = 39; + this.tDivCmpntLabel.Text = "tDivCmpnt"; + // + // tDivLabel + // + this.tDivLabel.AutoSize = true; + this.tDivLabel.Location = new System.Drawing.Point(578, 30); + this.tDivLabel.Name = "tDivLabel"; + this.tDivLabel.Size = new System.Drawing.Size(26, 13); + this.tDivLabel.TabIndex = 38; + this.tDivLabel.Text = "tDiv"; + // + // tDivCapLabel + // + this.tDivCapLabel.AutoSize = true; + this.tDivCapLabel.Location = new System.Drawing.Point(516, 29); + this.tDivCapLabel.Name = "tDivCapLabel"; + this.tDivCapLabel.Size = new System.Drawing.Size(54, 13); + this.tDivCapLabel.TabIndex = 37; + this.tDivCapLabel.Text = "T div [°C]:"; + // + // scaleCmpntLabel + // + this.scaleCmpntLabel.AutoSize = true; + this.scaleCmpntLabel.Location = new System.Drawing.Point(989, 209); + this.scaleCmpntLabel.Name = "scaleCmpntLabel"; + this.scaleCmpntLabel.Size = new System.Drawing.Size(62, 13); + this.scaleCmpntLabel.TabIndex = 40; + this.scaleCmpntLabel.Text = "scaleCmpnt"; + // + // massCapLabel + // + this.massCapLabel.AutoSize = true; + this.massCapLabel.Location = new System.Drawing.Point(929, 230); + this.massCapLabel.Name = "massCapLabel"; + this.massCapLabel.Size = new System.Drawing.Size(56, 13); + this.massCapLabel.TabIndex = 41; + this.massCapLabel.Text = "Mass [kg]:"; + // + // massLabel + // + this.massLabel.AutoSize = true; + this.massLabel.Location = new System.Drawing.Point(989, 230); + this.massLabel.Name = "massLabel"; + this.massLabel.Size = new System.Drawing.Size(31, 13); + this.massLabel.TabIndex = 42; + this.massLabel.Text = "mass"; + // + // massDiffCapLabel + // + this.massDiffCapLabel.AutoSize = true; + this.massDiffCapLabel.Location = new System.Drawing.Point(909, 250); + this.massDiffCapLabel.Name = "massDiffCapLabel"; + this.massDiffCapLabel.Size = new System.Drawing.Size(76, 13); + this.massDiffCapLabel.TabIndex = 43; + this.massDiffCapLabel.Text = "Mass diff. [kg]:"; + // + // massDiffLabel + // + this.massDiffLabel.AutoSize = true; + this.massDiffLabel.Location = new System.Drawing.Point(989, 250); + this.massDiffLabel.Name = "massDiffLabel"; + this.massDiffLabel.Size = new System.Drawing.Size(47, 13); + this.massDiffLabel.TabIndex = 44; + this.massDiffLabel.Text = "massDiff"; + // + // refVolumeCapLabel + // + this.refVolumeCapLabel.AutoSize = true; + this.refVolumeCapLabel.Location = new System.Drawing.Point(701, 133); + this.refVolumeCapLabel.Name = "refVolumeCapLabel"; + this.refVolumeCapLabel.Size = new System.Drawing.Size(78, 13); + this.refVolumeCapLabel.TabIndex = 45; + this.refVolumeCapLabel.Text = "Ref. volume [l]:"; + // + // refVolumeLabel + // + this.refVolumeLabel.AutoSize = true; + this.refVolumeLabel.Location = new System.Drawing.Point(790, 133); + this.refVolumeLabel.Name = "refVolumeLabel"; + this.refVolumeLabel.Size = new System.Drawing.Size(54, 13); + this.refVolumeLabel.TabIndex = 46; + this.refVolumeLabel.Text = "refVolume"; + // + // volumeCtvCapLabel + // + this.volumeCtvCapLabel.AutoSize = true; + this.volumeCtvCapLabel.Location = new System.Drawing.Point(929, 271); + this.volumeCtvCapLabel.Name = "volumeCtvCapLabel"; + this.volumeCtvCapLabel.Size = new System.Drawing.Size(56, 13); + this.volumeCtvCapLabel.TabIndex = 47; + this.volumeCtvCapLabel.Text = "Volume [l]:"; + // + // volumeCtvLabel + // + this.volumeCtvLabel.AutoSize = true; + this.volumeCtvLabel.Location = new System.Drawing.Point(989, 271); + this.volumeCtvLabel.Name = "volumeCtvLabel"; + this.volumeCtvLabel.Size = new System.Drawing.Size(57, 13); + this.volumeCtvLabel.TabIndex = 48; + this.volumeCtvLabel.Text = "volumeCtv"; + // + // refErrorCapLabel + // + this.refErrorCapLabel.AutoSize = true; + this.refErrorCapLabel.Location = new System.Drawing.Point(914, 293); + this.refErrorCapLabel.Name = "refErrorCapLabel"; + this.refErrorCapLabel.Size = new System.Drawing.Size(71, 13); + this.refErrorCapLabel.TabIndex = 49; + this.refErrorCapLabel.Text = "Ref. error [%]:"; + // + // refErrorLabel + // + this.refErrorLabel.AutoSize = true; + this.refErrorLabel.Location = new System.Drawing.Point(989, 293); + this.refErrorLabel.Name = "refErrorLabel"; + this.refErrorLabel.Size = new System.Drawing.Size(41, 13); + this.refErrorLabel.TabIndex = 50; + this.refErrorLabel.Text = "refError"; + // + // targetFlowLowCapLabel + // + this.targetFlowLowCapLabel.AutoSize = true; + this.targetFlowLowCapLabel.Location = new System.Drawing.Point(228, 12); + this.targetFlowLowCapLabel.Name = "targetFlowLowCapLabel"; + this.targetFlowLowCapLabel.Size = new System.Drawing.Size(116, 13); + this.targetFlowLowCapLabel.TabIndex = 51; + this.targetFlowLowCapLabel.Text = "Target flow low [m3/h]:"; + // + // targetFlowHighCapLabel + // + this.targetFlowHighCapLabel.AutoSize = true; + this.targetFlowHighCapLabel.Location = new System.Drawing.Point(224, 32); + this.targetFlowHighCapLabel.Name = "targetFlowHighCapLabel"; + this.targetFlowHighCapLabel.Size = new System.Drawing.Size(120, 13); + this.targetFlowHighCapLabel.TabIndex = 52; + this.targetFlowHighCapLabel.Text = "Target flow high [m3/h]:"; + // + // targetVolumeCapLabel + // + this.targetVolumeCapLabel.AutoSize = true; + this.targetVolumeCapLabel.Location = new System.Drawing.Point(263, 52); + this.targetVolumeCapLabel.Name = "targetVolumeCapLabel"; + this.targetVolumeCapLabel.Size = new System.Drawing.Size(89, 13); + this.targetVolumeCapLabel.TabIndex = 53; + this.targetVolumeCapLabel.Text = "Target volume [l]:"; + // + // estmtdTimeCapLabel + // + this.estmtdTimeCapLabel.AutoSize = true; + this.estmtdTimeCapLabel.Location = new System.Drawing.Point(260, 94); + this.estmtdTimeCapLabel.Name = "estmtdTimeCapLabel"; + this.estmtdTimeCapLabel.Size = new System.Drawing.Size(92, 13); + this.estmtdTimeCapLabel.TabIndex = 54; + this.estmtdTimeCapLabel.Text = "Estimated time [s]:"; + // + // targetFlowLowLabel + // + this.targetFlowLowLabel.AutoSize = true; + this.targetFlowLowLabel.Location = new System.Drawing.Point(355, 12); + this.targetFlowLowLabel.Name = "targetFlowLowLabel"; + this.targetFlowLowLabel.Size = new System.Drawing.Size(76, 13); + this.targetFlowLowLabel.TabIndex = 55; + this.targetFlowLowLabel.Text = "targetFlowLow"; + // + // targetFlowHighLabel + // + this.targetFlowHighLabel.AutoSize = true; + this.targetFlowHighLabel.Location = new System.Drawing.Point(355, 32); + this.targetFlowHighLabel.Name = "targetFlowHighLabel"; + this.targetFlowHighLabel.Size = new System.Drawing.Size(78, 13); + this.targetFlowHighLabel.TabIndex = 56; + this.targetFlowHighLabel.Text = "targetFlowHigh"; + // + // targetVolumeLabel + // + this.targetVolumeLabel.AutoSize = true; + this.targetVolumeLabel.Location = new System.Drawing.Point(355, 52); + this.targetVolumeLabel.Name = "targetVolumeLabel"; + this.targetVolumeLabel.Size = new System.Drawing.Size(69, 13); + this.targetVolumeLabel.TabIndex = 57; + this.targetVolumeLabel.Text = "targetVolume"; + // + // targetRefCountCapLabel + // + this.targetRefCountCapLabel.AutoSize = true; + this.targetRefCountCapLabel.Location = new System.Drawing.Point(263, 73); + this.targetRefCountCapLabel.Name = "targetRefCountCapLabel"; + this.targetRefCountCapLabel.Size = new System.Drawing.Size(89, 13); + this.targetRefCountCapLabel.TabIndex = 58; + this.targetRefCountCapLabel.Text = "Target ref. count:"; + // + // targetRefCountLabel + // + this.targetRefCountLabel.AutoSize = true; + this.targetRefCountLabel.Location = new System.Drawing.Point(355, 73); + this.targetRefCountLabel.Name = "targetRefCountLabel"; + this.targetRefCountLabel.Size = new System.Drawing.Size(79, 13); + this.targetRefCountLabel.TabIndex = 59; + this.targetRefCountLabel.Text = "targetRefCount"; + // + // estmtdTimeLabel + // + this.estmtdTimeLabel.AutoSize = true; + this.estmtdTimeLabel.Location = new System.Drawing.Point(355, 94); + this.estmtdTimeLabel.Name = "estmtdTimeLabel"; + this.estmtdTimeLabel.Size = new System.Drawing.Size(61, 13); + this.estmtdTimeLabel.TabIndex = 60; + this.estmtdTimeLabel.Text = "estmtdTime"; + // + // airTempCapLabel + // + this.airTempCapLabel.AutoSize = true; + this.airTempCapLabel.Location = new System.Drawing.Point(11, 12); + this.airTempCapLabel.Name = "airTempCapLabel"; + this.airTempCapLabel.Size = new System.Drawing.Size(101, 13); + this.airTempCapLabel.TabIndex = 61; + this.airTempCapLabel.Text = "Air temperature [°C]:"; + // + // airPressCapLabel + // + this.airPressCapLabel.AutoSize = true; + this.airPressCapLabel.Location = new System.Drawing.Point(14, 29); + this.airPressCapLabel.Name = "airPressCapLabel"; + this.airPressCapLabel.Size = new System.Drawing.Size(97, 13); + this.airPressCapLabel.TabIndex = 62; + this.airPressCapLabel.Text = "Air pressure [mbar]:"; + // + // airHumiCapLabel + // + this.airHumiCapLabel.AutoSize = true; + this.airHumiCapLabel.Location = new System.Drawing.Point(32, 46); + this.airHumiCapLabel.Name = "airHumiCapLabel"; + this.airHumiCapLabel.Size = new System.Drawing.Size(80, 13); + this.airHumiCapLabel.TabIndex = 63; + this.airHumiCapLabel.Text = "Air humidity [%]:"; + // + // airTempLabel + // + this.airTempLabel.AutoSize = true; + this.airTempLabel.Location = new System.Drawing.Point(132, 12); + this.airTempLabel.Name = "airTempLabel"; + this.airTempLabel.Size = new System.Drawing.Size(45, 13); + this.airTempLabel.TabIndex = 64; + this.airTempLabel.Text = "airTemp"; + // + // airPressLabel + // + this.airPressLabel.AutoSize = true; + this.airPressLabel.Location = new System.Drawing.Point(132, 29); + this.airPressLabel.Name = "airPressLabel"; + this.airPressLabel.Size = new System.Drawing.Size(44, 13); + this.airPressLabel.TabIndex = 65; + this.airPressLabel.Text = "airPress"; + // + // airHumiLabel + // + this.airHumiLabel.AutoSize = true; + this.airHumiLabel.Location = new System.Drawing.Point(132, 46); + this.airHumiLabel.Name = "airHumiLabel"; + this.airHumiLabel.Size = new System.Drawing.Size(42, 13); + this.airHumiLabel.TabIndex = 66; + this.airHumiLabel.Text = "airHumi"; + // + // reservoirPictureBox + // + this.reservoirPictureBox.Image = ((System.Drawing.Image)(resources.GetObject("reservoirPictureBox.Image"))); + this.reservoirPictureBox.Location = new System.Drawing.Point(880, 406); + this.reservoirPictureBox.Name = "reservoirPictureBox"; + this.reservoirPictureBox.Size = new System.Drawing.Size(142, 109); + this.reservoirPictureBox.TabIndex = 67; + this.reservoirPictureBox.TabStop = false; + // + // pumpPictureBox + // + this.pumpPictureBox.Image = ((System.Drawing.Image)(resources.GetObject("pumpPictureBox.Image"))); + this.pumpPictureBox.Location = new System.Drawing.Point(779, 478); + this.pumpPictureBox.Name = "pumpPictureBox"; + this.pumpPictureBox.Size = new System.Drawing.Size(38, 38); + this.pumpPictureBox.TabIndex = 68; + this.pumpPictureBox.TabStop = false; + // + // watermeterPictureBox1 + // + this.watermeterPictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("watermeterPictureBox1.Image"))); + this.watermeterPictureBox1.Location = new System.Drawing.Point(66, 371); + this.watermeterPictureBox1.Name = "watermeterPictureBox1"; + this.watermeterPictureBox1.Size = new System.Drawing.Size(38, 30); + this.watermeterPictureBox1.TabIndex = 69; + this.watermeterPictureBox1.TabStop = false; + // + // watermeterPictureBox2 + // + this.watermeterPictureBox2.Image = ((System.Drawing.Image)(resources.GetObject("watermeterPictureBox2.Image"))); + this.watermeterPictureBox2.Location = new System.Drawing.Point(207, 371); + this.watermeterPictureBox2.Name = "watermeterPictureBox2"; + this.watermeterPictureBox2.Size = new System.Drawing.Size(38, 30); + this.watermeterPictureBox2.TabIndex = 70; + this.watermeterPictureBox2.TabStop = false; + // + // watermeterPictureBox3 + // + this.watermeterPictureBox3.Image = ((System.Drawing.Image)(resources.GetObject("watermeterPictureBox3.Image"))); + this.watermeterPictureBox3.Location = new System.Drawing.Point(350, 371); + this.watermeterPictureBox3.Name = "watermeterPictureBox3"; + this.watermeterPictureBox3.Size = new System.Drawing.Size(38, 30); + this.watermeterPictureBox3.TabIndex = 71; + this.watermeterPictureBox3.TabStop = false; + // + // watermeterPictureBox4 + // + this.watermeterPictureBox4.Image = ((System.Drawing.Image)(resources.GetObject("watermeterPictureBox4.Image"))); + this.watermeterPictureBox4.Location = new System.Drawing.Point(491, 371); + this.watermeterPictureBox4.Name = "watermeterPictureBox4"; + this.watermeterPictureBox4.Size = new System.Drawing.Size(38, 30); + this.watermeterPictureBox4.TabIndex = 73; + this.watermeterPictureBox4.TabStop = false; + // + // groupBox4 + // + this.groupBox4.Controls.Add(this.sensor4CapLabel); + this.groupBox4.Controls.Add(this.passed4Label); + this.groupBox4.Controls.Add(this.error4Label); + this.groupBox4.Controls.Add(this.error4CapLabel); + this.groupBox4.Controls.Add(this.volume4Label); + this.groupBox4.Controls.Add(this.volume4CapLabel); + this.groupBox4.Controls.Add(this.refPulses4CapLabel); + this.groupBox4.Controls.Add(this.pulses4CapLabel); + this.groupBox4.Controls.Add(this.refPulses4Label); + this.groupBox4.Controls.Add(this.pulses4Label); + this.groupBox4.Controls.Add(this.sensor4Label); + this.groupBox4.Location = new System.Drawing.Point(446, 229); + this.groupBox4.Name = "groupBox4"; + this.groupBox4.Size = new System.Drawing.Size(139, 131); + this.groupBox4.TabIndex = 72; + this.groupBox4.TabStop = false; + this.groupBox4.Text = "Meter 4"; + // + // sensor4CapLabel + // + this.sensor4CapLabel.AutoSize = true; + this.sensor4CapLabel.Location = new System.Drawing.Point(23, 16); + this.sensor4CapLabel.Name = "sensor4CapLabel"; + this.sensor4CapLabel.Size = new System.Drawing.Size(43, 13); + this.sensor4CapLabel.TabIndex = 11; + this.sensor4CapLabel.Text = "Sensor:"; + // + // passed4Label + // + this.passed4Label.AutoSize = true; + this.passed4Label.Location = new System.Drawing.Point(72, 108); + this.passed4Label.Name = "passed4Label"; + this.passed4Label.Size = new System.Drawing.Size(47, 13); + this.passed4Label.TabIndex = 9; + this.passed4Label.Text = "passed4"; + // + // error4Label + // + this.error4Label.AutoSize = true; + this.error4Label.Location = new System.Drawing.Point(72, 90); + this.error4Label.Name = "error4Label"; + this.error4Label.Size = new System.Drawing.Size(34, 13); + this.error4Label.TabIndex = 8; + this.error4Label.Text = "error4"; + // + // error4CapLabel + // + this.error4CapLabel.AutoSize = true; + this.error4CapLabel.Location = new System.Drawing.Point(17, 90); + this.error4CapLabel.Name = "error4CapLabel"; + this.error4CapLabel.Size = new System.Drawing.Size(49, 13); + this.error4CapLabel.TabIndex = 7; + this.error4CapLabel.Text = "Error [%]:"; + // + // volume4Label + // + this.volume4Label.AutoSize = true; + this.volume4Label.Location = new System.Drawing.Point(72, 71); + this.volume4Label.Name = "volume4Label"; + this.volume4Label.Size = new System.Drawing.Size(47, 13); + this.volume4Label.TabIndex = 6; + this.volume4Label.Text = "volume4"; + // + // volume4CapLabel + // + this.volume4CapLabel.AutoSize = true; + this.volume4CapLabel.Location = new System.Drawing.Point(21, 71); + this.volume4CapLabel.Name = "volume4CapLabel"; + this.volume4CapLabel.Size = new System.Drawing.Size(45, 13); + this.volume4CapLabel.TabIndex = 5; + this.volume4CapLabel.Text = "Volume:"; + // + // refPulses4CapLabel + // + this.refPulses4CapLabel.AutoSize = true; + this.refPulses4CapLabel.Location = new System.Drawing.Point(1, 53); + this.refPulses4CapLabel.Name = "refPulses4CapLabel"; + this.refPulses4CapLabel.Size = new System.Drawing.Size(60, 13); + this.refPulses4CapLabel.TabIndex = 4; + this.refPulses4CapLabel.Text = "Ref. count:"; + // + // pulses4CapLabel + // + this.pulses4CapLabel.AutoSize = true; + this.pulses4CapLabel.Location = new System.Drawing.Point(2, 34); + this.pulses4CapLabel.Name = "pulses4CapLabel"; + this.pulses4CapLabel.Size = new System.Drawing.Size(38, 13); + this.pulses4CapLabel.TabIndex = 3; + this.pulses4CapLabel.Text = "Count:"; + // + // refPulses4Label + // + this.refPulses4Label.AutoSize = true; + this.refPulses4Label.Location = new System.Drawing.Point(72, 53); + this.refPulses4Label.Name = "refPulses4Label"; + this.refPulses4Label.Size = new System.Drawing.Size(56, 13); + this.refPulses4Label.TabIndex = 2; + this.refPulses4Label.Text = "refPulses4"; + // + // pulses4Label + // + this.pulses4Label.AutoSize = true; + this.pulses4Label.Location = new System.Drawing.Point(72, 34); + this.pulses4Label.Name = "pulses4Label"; + this.pulses4Label.Size = new System.Drawing.Size(43, 13); + this.pulses4Label.TabIndex = 1; + this.pulses4Label.Text = "pulses4"; + // + // sensor4Label + // + this.sensor4Label.AutoSize = true; + this.sensor4Label.Location = new System.Drawing.Point(72, 16); + this.sensor4Label.Name = "sensor4Label"; + this.sensor4Label.Size = new System.Drawing.Size(44, 13); + this.sensor4Label.TabIndex = 0; + this.sensor4Label.Text = "sensor4"; + // + // watermeterPictureBox5 + // + this.watermeterPictureBox5.Image = ((System.Drawing.Image)(resources.GetObject("watermeterPictureBox5.Image"))); + this.watermeterPictureBox5.Location = new System.Drawing.Point(632, 371); + this.watermeterPictureBox5.Name = "watermeterPictureBox5"; + this.watermeterPictureBox5.Size = new System.Drawing.Size(38, 30); + this.watermeterPictureBox5.TabIndex = 75; + this.watermeterPictureBox5.TabStop = false; + // + // groupBox5 + // + this.groupBox5.Controls.Add(this.sensor5CapLabel); + this.groupBox5.Controls.Add(this.passed5Label); + this.groupBox5.Controls.Add(this.error5Label); + this.groupBox5.Controls.Add(this.error5CapLabel); + this.groupBox5.Controls.Add(this.volume5Label); + this.groupBox5.Controls.Add(this.volume5CapLabel); + this.groupBox5.Controls.Add(this.refPulses5CapLabel); + this.groupBox5.Controls.Add(this.pulses5CapLabel); + this.groupBox5.Controls.Add(this.refPulses5Label); + this.groupBox5.Controls.Add(this.pulses5Label); + this.groupBox5.Controls.Add(this.sensor5Label); + this.groupBox5.Location = new System.Drawing.Point(587, 229); + this.groupBox5.Name = "groupBox5"; + this.groupBox5.Size = new System.Drawing.Size(139, 131); + this.groupBox5.TabIndex = 74; + this.groupBox5.TabStop = false; + this.groupBox5.Text = "Meter 5"; + // + // sensor5CapLabel + // + this.sensor5CapLabel.AutoSize = true; + this.sensor5CapLabel.Location = new System.Drawing.Point(23, 16); + this.sensor5CapLabel.Name = "sensor5CapLabel"; + this.sensor5CapLabel.Size = new System.Drawing.Size(43, 13); + this.sensor5CapLabel.TabIndex = 11; + this.sensor5CapLabel.Text = "Sensor:"; + // + // passed5Label + // + this.passed5Label.AutoSize = true; + this.passed5Label.Location = new System.Drawing.Point(72, 108); + this.passed5Label.Name = "passed5Label"; + this.passed5Label.Size = new System.Drawing.Size(47, 13); + this.passed5Label.TabIndex = 9; + this.passed5Label.Text = "passed5"; + // + // error5Label + // + this.error5Label.AutoSize = true; + this.error5Label.Location = new System.Drawing.Point(72, 90); + this.error5Label.Name = "error5Label"; + this.error5Label.Size = new System.Drawing.Size(34, 13); + this.error5Label.TabIndex = 8; + this.error5Label.Text = "error5"; + // + // error5CapLabel + // + this.error5CapLabel.AutoSize = true; + this.error5CapLabel.Location = new System.Drawing.Point(17, 90); + this.error5CapLabel.Name = "error5CapLabel"; + this.error5CapLabel.Size = new System.Drawing.Size(49, 13); + this.error5CapLabel.TabIndex = 7; + this.error5CapLabel.Text = "Error [%]:"; + // + // volume5Label + // + this.volume5Label.AutoSize = true; + this.volume5Label.Location = new System.Drawing.Point(72, 71); + this.volume5Label.Name = "volume5Label"; + this.volume5Label.Size = new System.Drawing.Size(47, 13); + this.volume5Label.TabIndex = 6; + this.volume5Label.Text = "volume5"; + // + // volume5CapLabel + // + this.volume5CapLabel.AutoSize = true; + this.volume5CapLabel.Location = new System.Drawing.Point(21, 71); + this.volume5CapLabel.Name = "volume5CapLabel"; + this.volume5CapLabel.Size = new System.Drawing.Size(45, 13); + this.volume5CapLabel.TabIndex = 5; + this.volume5CapLabel.Text = "Volume:"; + // + // refPulses5CapLabel + // + this.refPulses5CapLabel.AutoSize = true; + this.refPulses5CapLabel.Location = new System.Drawing.Point(1, 53); + this.refPulses5CapLabel.Name = "refPulses5CapLabel"; + this.refPulses5CapLabel.Size = new System.Drawing.Size(60, 13); + this.refPulses5CapLabel.TabIndex = 4; + this.refPulses5CapLabel.Text = "Ref. count:"; + // + // pulses5CapLabel + // + this.pulses5CapLabel.AutoSize = true; + this.pulses5CapLabel.Location = new System.Drawing.Point(2, 34); + this.pulses5CapLabel.Name = "pulses5CapLabel"; + this.pulses5CapLabel.Size = new System.Drawing.Size(38, 13); + this.pulses5CapLabel.TabIndex = 3; + this.pulses5CapLabel.Text = "Count:"; + // + // refPulses5Label + // + this.refPulses5Label.AutoSize = true; + this.refPulses5Label.Location = new System.Drawing.Point(72, 53); + this.refPulses5Label.Name = "refPulses5Label"; + this.refPulses5Label.Size = new System.Drawing.Size(56, 13); + this.refPulses5Label.TabIndex = 2; + this.refPulses5Label.Text = "refPulses5"; + // + // pulses5Label + // + this.pulses5Label.AutoSize = true; + this.pulses5Label.Location = new System.Drawing.Point(72, 34); + this.pulses5Label.Name = "pulses5Label"; + this.pulses5Label.Size = new System.Drawing.Size(43, 13); + this.pulses5Label.TabIndex = 1; + this.pulses5Label.Text = "pulses5"; + // + // sensor5Label + // + this.sensor5Label.AutoSize = true; + this.sensor5Label.Location = new System.Drawing.Point(72, 16); + this.sensor5Label.Name = "sensor5Label"; + this.sensor5Label.Size = new System.Drawing.Size(44, 13); + this.sensor5Label.TabIndex = 0; + this.sensor5Label.Text = "sensor5"; + // + // watermeterPictureBox6 + // + this.watermeterPictureBox6.Image = ((System.Drawing.Image)(resources.GetObject("watermeterPictureBox6.Image"))); + this.watermeterPictureBox6.Location = new System.Drawing.Point(775, 371); + this.watermeterPictureBox6.Name = "watermeterPictureBox6"; + this.watermeterPictureBox6.Size = new System.Drawing.Size(38, 30); + this.watermeterPictureBox6.TabIndex = 77; + this.watermeterPictureBox6.TabStop = false; + // + // groupBox6 + // + this.groupBox6.Controls.Add(this.sensor6CapLabel); + this.groupBox6.Controls.Add(this.passed6Label); + this.groupBox6.Controls.Add(this.error6Label); + this.groupBox6.Controls.Add(this.error6CapLabel); + this.groupBox6.Controls.Add(this.volume6Label); + this.groupBox6.Controls.Add(this.volume6CapLabel); + this.groupBox6.Controls.Add(this.refPulses6CapLabel); + this.groupBox6.Controls.Add(this.pulses6CapLabel); + this.groupBox6.Controls.Add(this.refPulses6Label); + this.groupBox6.Controls.Add(this.pulses6Label); + this.groupBox6.Controls.Add(this.sensor6Label); + this.groupBox6.Location = new System.Drawing.Point(727, 229); + this.groupBox6.Name = "groupBox6"; + this.groupBox6.Size = new System.Drawing.Size(139, 131); + this.groupBox6.TabIndex = 76; + this.groupBox6.TabStop = false; + this.groupBox6.Text = "Meter 6"; + // + // sensor6CapLabel + // + this.sensor6CapLabel.AutoSize = true; + this.sensor6CapLabel.Location = new System.Drawing.Point(23, 16); + this.sensor6CapLabel.Name = "sensor6CapLabel"; + this.sensor6CapLabel.Size = new System.Drawing.Size(43, 13); + this.sensor6CapLabel.TabIndex = 11; + this.sensor6CapLabel.Text = "Sensor:"; + // + // passed6Label + // + this.passed6Label.AutoSize = true; + this.passed6Label.Location = new System.Drawing.Point(72, 108); + this.passed6Label.Name = "passed6Label"; + this.passed6Label.Size = new System.Drawing.Size(47, 13); + this.passed6Label.TabIndex = 9; + this.passed6Label.Text = "passed6"; + // + // error6Label + // + this.error6Label.AutoSize = true; + this.error6Label.Location = new System.Drawing.Point(72, 90); + this.error6Label.Name = "error6Label"; + this.error6Label.Size = new System.Drawing.Size(34, 13); + this.error6Label.TabIndex = 8; + this.error6Label.Text = "error6"; + // + // error6CapLabel + // + this.error6CapLabel.AutoSize = true; + this.error6CapLabel.Location = new System.Drawing.Point(17, 90); + this.error6CapLabel.Name = "error6CapLabel"; + this.error6CapLabel.Size = new System.Drawing.Size(49, 13); + this.error6CapLabel.TabIndex = 7; + this.error6CapLabel.Text = "Error [%]:"; + // + // volume6Label + // + this.volume6Label.AutoSize = true; + this.volume6Label.Location = new System.Drawing.Point(72, 71); + this.volume6Label.Name = "volume6Label"; + this.volume6Label.Size = new System.Drawing.Size(47, 13); + this.volume6Label.TabIndex = 6; + this.volume6Label.Text = "volume6"; + // + // volume6CapLabel + // + this.volume6CapLabel.AutoSize = true; + this.volume6CapLabel.Location = new System.Drawing.Point(21, 71); + this.volume6CapLabel.Name = "volume6CapLabel"; + this.volume6CapLabel.Size = new System.Drawing.Size(45, 13); + this.volume6CapLabel.TabIndex = 5; + this.volume6CapLabel.Text = "Volume:"; + // + // refPulses6CapLabel + // + this.refPulses6CapLabel.AutoSize = true; + this.refPulses6CapLabel.Location = new System.Drawing.Point(1, 53); + this.refPulses6CapLabel.Name = "refPulses6CapLabel"; + this.refPulses6CapLabel.Size = new System.Drawing.Size(60, 13); + this.refPulses6CapLabel.TabIndex = 4; + this.refPulses6CapLabel.Text = "Ref. count:"; + // + // pulses6CapLabel + // + this.pulses6CapLabel.AutoSize = true; + this.pulses6CapLabel.Location = new System.Drawing.Point(2, 34); + this.pulses6CapLabel.Name = "pulses6CapLabel"; + this.pulses6CapLabel.Size = new System.Drawing.Size(38, 13); + this.pulses6CapLabel.TabIndex = 3; + this.pulses6CapLabel.Text = "Count:"; + // + // refPulses6Label + // + this.refPulses6Label.AutoSize = true; + this.refPulses6Label.Location = new System.Drawing.Point(72, 53); + this.refPulses6Label.Name = "refPulses6Label"; + this.refPulses6Label.Size = new System.Drawing.Size(56, 13); + this.refPulses6Label.TabIndex = 2; + this.refPulses6Label.Text = "refPulses6"; + // + // pulses6Label + // + this.pulses6Label.AutoSize = true; + this.pulses6Label.Location = new System.Drawing.Point(72, 34); + this.pulses6Label.Name = "pulses6Label"; + this.pulses6Label.Size = new System.Drawing.Size(43, 13); + this.pulses6Label.TabIndex = 1; + this.pulses6Label.Text = "pulses6"; + // + // sensor6Label + // + this.sensor6Label.AutoSize = true; + this.sensor6Label.Location = new System.Drawing.Point(72, 16); + this.sensor6Label.Name = "sensor6Label"; + this.sensor6Label.Size = new System.Drawing.Size(44, 13); + this.sensor6Label.TabIndex = 0; + this.sensor6Label.Text = "sensor6"; + // + // flowMeterPictureBox + // + this.flowMeterPictureBox.ErrorImage = null; + this.flowMeterPictureBox.Image = ((System.Drawing.Image)(resources.GetObject("flowMeterPictureBox.Image"))); + this.flowMeterPictureBox.InitialImage = null; + this.flowMeterPictureBox.Location = new System.Drawing.Point(864, 102); + this.flowMeterPictureBox.Name = "flowMeterPictureBox"; + this.flowMeterPictureBox.Size = new System.Drawing.Size(38, 38); + this.flowMeterPictureBox.TabIndex = 78; + this.flowMeterPictureBox.TabStop = false; + // + // pictureBox1 + // + this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image"))); + this.pictureBox1.Location = new System.Drawing.Point(864, 45); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(38, 35); + this.pictureBox1.TabIndex = 79; + this.pictureBox1.TabStop = false; + // + // watermeterPictureBox1z + // + this.watermeterPictureBox1z.Image = ((System.Drawing.Image)(resources.GetObject("watermeterPictureBox1z.Image"))); + this.watermeterPictureBox1z.Location = new System.Drawing.Point(207, 416); + this.watermeterPictureBox1z.Name = "watermeterPictureBox1z"; + this.watermeterPictureBox1z.Size = new System.Drawing.Size(38, 30); + this.watermeterPictureBox1z.TabIndex = 80; + this.watermeterPictureBox1z.TabStop = false; + // + // watermeterPictureBox2z + // + this.watermeterPictureBox2z.Image = ((System.Drawing.Image)(resources.GetObject("watermeterPictureBox2z.Image"))); + this.watermeterPictureBox2z.Location = new System.Drawing.Point(491, 416); + this.watermeterPictureBox2z.Name = "watermeterPictureBox2z"; + this.watermeterPictureBox2z.Size = new System.Drawing.Size(38, 30); + this.watermeterPictureBox2z.TabIndex = 81; + this.watermeterPictureBox2z.TabStop = false; + // + // watermeterPictureBox3z + // + this.watermeterPictureBox3z.Image = ((System.Drawing.Image)(resources.GetObject("watermeterPictureBox3z.Image"))); + this.watermeterPictureBox3z.Location = new System.Drawing.Point(775, 416); + this.watermeterPictureBox3z.Name = "watermeterPictureBox3z"; + this.watermeterPictureBox3z.Size = new System.Drawing.Size(38, 30); + this.watermeterPictureBox3z.TabIndex = 82; + this.watermeterPictureBox3z.TabStop = false; + // + // groupBox1z + // + this.groupBox1z.Controls.Add(this.passed1zLabel); + this.groupBox1z.Controls.Add(this.error1zLabel); + this.groupBox1z.Controls.Add(this.error1zCapLabel); + this.groupBox1z.Controls.Add(this.volume1zLabel); + this.groupBox1z.Controls.Add(this.volume1zCapLabel); + this.groupBox1z.Location = new System.Drawing.Point(23, 151); + this.groupBox1z.Name = "groupBox1z"; + this.groupBox1z.Size = new System.Drawing.Size(280, 76); + this.groupBox1z.TabIndex = 83; + this.groupBox1z.TabStop = false; + this.groupBox1z.Text = "Combined meter 1"; + // + // passed1zLabel + // + this.passed1zLabel.AutoSize = true; + this.passed1zLabel.Location = new System.Drawing.Point(141, 55); + this.passed1zLabel.Name = "passed1zLabel"; + this.passed1zLabel.Size = new System.Drawing.Size(52, 13); + this.passed1zLabel.TabIndex = 9; + this.passed1zLabel.Text = "passed1z"; + // + // error1zLabel + // + this.error1zLabel.AutoSize = true; + this.error1zLabel.Location = new System.Drawing.Point(141, 37); + this.error1zLabel.Name = "error1zLabel"; + this.error1zLabel.Size = new System.Drawing.Size(39, 13); + this.error1zLabel.TabIndex = 8; + this.error1zLabel.Text = "error1z"; + // + // error1zCapLabel + // + this.error1zCapLabel.AutoSize = true; + this.error1zCapLabel.Location = new System.Drawing.Point(86, 37); + this.error1zCapLabel.Name = "error1zCapLabel"; + this.error1zCapLabel.Size = new System.Drawing.Size(49, 13); + this.error1zCapLabel.TabIndex = 7; + this.error1zCapLabel.Text = "Error [%]:"; + // + // volume1zLabel + // + this.volume1zLabel.AutoSize = true; + this.volume1zLabel.Location = new System.Drawing.Point(141, 18); + this.volume1zLabel.Name = "volume1zLabel"; + this.volume1zLabel.Size = new System.Drawing.Size(52, 13); + this.volume1zLabel.TabIndex = 6; + this.volume1zLabel.Text = "volume1z"; + // + // volume1zCapLabel + // + this.volume1zCapLabel.AutoSize = true; + this.volume1zCapLabel.Location = new System.Drawing.Point(90, 18); + this.volume1zCapLabel.Name = "volume1zCapLabel"; + this.volume1zCapLabel.Size = new System.Drawing.Size(45, 13); + this.volume1zCapLabel.TabIndex = 5; + this.volume1zCapLabel.Text = "Volume:"; + // + // groupBox2z + // + this.groupBox2z.Controls.Add(this.passed2zLabel); + this.groupBox2z.Controls.Add(this.error2zLabel); + this.groupBox2z.Controls.Add(this.error2zCapLabel); + this.groupBox2z.Controls.Add(this.volume2zLabel); + this.groupBox2z.Controls.Add(this.volume2zCapLabel); + this.groupBox2z.Location = new System.Drawing.Point(305, 151); + this.groupBox2z.Name = "groupBox2z"; + this.groupBox2z.Size = new System.Drawing.Size(280, 76); + this.groupBox2z.TabIndex = 84; + this.groupBox2z.TabStop = false; + this.groupBox2z.Text = "Combined meter 2"; + // + // passed2zLabel + // + this.passed2zLabel.AutoSize = true; + this.passed2zLabel.Location = new System.Drawing.Point(141, 56); + this.passed2zLabel.Name = "passed2zLabel"; + this.passed2zLabel.Size = new System.Drawing.Size(52, 13); + this.passed2zLabel.TabIndex = 9; + this.passed2zLabel.Text = "passed2z"; + // + // error2zLabel + // + this.error2zLabel.AutoSize = true; + this.error2zLabel.Location = new System.Drawing.Point(141, 38); + this.error2zLabel.Name = "error2zLabel"; + this.error2zLabel.Size = new System.Drawing.Size(39, 13); + this.error2zLabel.TabIndex = 8; + this.error2zLabel.Text = "error2z"; + // + // error2zCapLabel + // + this.error2zCapLabel.AutoSize = true; + this.error2zCapLabel.Location = new System.Drawing.Point(86, 38); + this.error2zCapLabel.Name = "error2zCapLabel"; + this.error2zCapLabel.Size = new System.Drawing.Size(49, 13); + this.error2zCapLabel.TabIndex = 7; + this.error2zCapLabel.Text = "Error [%]:"; + // + // volume2zLabel + // + this.volume2zLabel.AutoSize = true; + this.volume2zLabel.Location = new System.Drawing.Point(141, 19); + this.volume2zLabel.Name = "volume2zLabel"; + this.volume2zLabel.Size = new System.Drawing.Size(52, 13); + this.volume2zLabel.TabIndex = 6; + this.volume2zLabel.Text = "volume2z"; + // + // volume2zCapLabel + // + this.volume2zCapLabel.AutoSize = true; + this.volume2zCapLabel.Location = new System.Drawing.Point(90, 19); + this.volume2zCapLabel.Name = "volume2zCapLabel"; + this.volume2zCapLabel.Size = new System.Drawing.Size(45, 13); + this.volume2zCapLabel.TabIndex = 5; + this.volume2zCapLabel.Text = "Volume:"; + // + // groupBox3z + // + this.groupBox3z.Controls.Add(this.passed3zLabel); + this.groupBox3z.Controls.Add(this.error3zLabel); + this.groupBox3z.Controls.Add(this.error3zCapLabel); + this.groupBox3z.Controls.Add(this.volume3zLabel); + this.groupBox3z.Controls.Add(this.volume3zCapLabel); + this.groupBox3z.Location = new System.Drawing.Point(587, 151); + this.groupBox3z.Name = "groupBox3z"; + this.groupBox3z.Size = new System.Drawing.Size(280, 76); + this.groupBox3z.TabIndex = 85; + this.groupBox3z.TabStop = false; + this.groupBox3z.Text = "Combined meter 3"; + // + // passed3zLabel + // + this.passed3zLabel.AutoSize = true; + this.passed3zLabel.Location = new System.Drawing.Point(141, 56); + this.passed3zLabel.Name = "passed3zLabel"; + this.passed3zLabel.Size = new System.Drawing.Size(52, 13); + this.passed3zLabel.TabIndex = 9; + this.passed3zLabel.Text = "passed3z"; + // + // error3zLabel + // + this.error3zLabel.AutoSize = true; + this.error3zLabel.Location = new System.Drawing.Point(141, 38); + this.error3zLabel.Name = "error3zLabel"; + this.error3zLabel.Size = new System.Drawing.Size(39, 13); + this.error3zLabel.TabIndex = 8; + this.error3zLabel.Text = "error3z"; + // + // error3zCapLabel + // + this.error3zCapLabel.AutoSize = true; + this.error3zCapLabel.Location = new System.Drawing.Point(86, 38); + this.error3zCapLabel.Name = "error3zCapLabel"; + this.error3zCapLabel.Size = new System.Drawing.Size(49, 13); + this.error3zCapLabel.TabIndex = 7; + this.error3zCapLabel.Text = "Error [%]:"; + // + // volume3zLabel + // + this.volume3zLabel.AutoSize = true; + this.volume3zLabel.Location = new System.Drawing.Point(141, 19); + this.volume3zLabel.Name = "volume3zLabel"; + this.volume3zLabel.Size = new System.Drawing.Size(52, 13); + this.volume3zLabel.TabIndex = 6; + this.volume3zLabel.Text = "volume3z"; + // + // volume3zCapLabel + // + this.volume3zCapLabel.AutoSize = true; + this.volume3zCapLabel.Location = new System.Drawing.Point(90, 19); + this.volume3zCapLabel.Name = "volume3zCapLabel"; + this.volume3zCapLabel.Size = new System.Drawing.Size(45, 13); + this.volume3zCapLabel.TabIndex = 5; + this.volume3zCapLabel.Text = "Volume:"; + // + // pumpPctTextBox + // + this.pumpPctTextBox.Location = new System.Drawing.Point(777, 454); + this.pumpPctTextBox.Name = "pumpPctTextBox"; + this.pumpPctTextBox.Size = new System.Drawing.Size(42, 20); + this.pumpPctTextBox.TabIndex = 86; + // + // ProcessTabPageCtrl6 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.Control; + this.Controls.Add(this.pumpPctTextBox); + this.Controls.Add(this.groupBox3z); + this.Controls.Add(this.groupBox2z); + this.Controls.Add(this.groupBox1z); + this.Controls.Add(this.watermeterPictureBox3z); + this.Controls.Add(this.watermeterPictureBox2z); + this.Controls.Add(this.watermeterPictureBox1z); + this.Controls.Add(this.pictureBox1); + this.Controls.Add(this.flowMeterPictureBox); + this.Controls.Add(this.watermeterPictureBox6); + this.Controls.Add(this.groupBox6); + this.Controls.Add(this.watermeterPictureBox5); + this.Controls.Add(this.groupBox5); + this.Controls.Add(this.watermeterPictureBox4); + this.Controls.Add(this.groupBox4); + this.Controls.Add(this.watermeterPictureBox3); + this.Controls.Add(this.watermeterPictureBox2); + this.Controls.Add(this.watermeterPictureBox1); + this.Controls.Add(this.pumpPictureBox); + this.Controls.Add(this.reservoirPictureBox); + this.Controls.Add(this.airHumiLabel); + this.Controls.Add(this.airPressLabel); + this.Controls.Add(this.airTempLabel); + this.Controls.Add(this.airHumiCapLabel); + this.Controls.Add(this.airPressCapLabel); + this.Controls.Add(this.airTempCapLabel); + this.Controls.Add(this.estmtdTimeLabel); + this.Controls.Add(this.targetRefCountLabel); + this.Controls.Add(this.targetRefCountCapLabel); + this.Controls.Add(this.targetVolumeLabel); + this.Controls.Add(this.targetFlowHighLabel); + this.Controls.Add(this.targetFlowLowLabel); + this.Controls.Add(this.estmtdTimeCapLabel); + this.Controls.Add(this.targetVolumeCapLabel); + this.Controls.Add(this.targetFlowHighCapLabel); + this.Controls.Add(this.targetFlowLowCapLabel); + this.Controls.Add(this.refErrorLabel); + this.Controls.Add(this.refErrorCapLabel); + this.Controls.Add(this.volumeCtvLabel); + this.Controls.Add(this.volumeCtvCapLabel); + this.Controls.Add(this.refVolumeLabel); + this.Controls.Add(this.refVolumeCapLabel); + this.Controls.Add(this.massDiffLabel); + this.Controls.Add(this.massDiffCapLabel); + this.Controls.Add(this.massLabel); + this.Controls.Add(this.massCapLabel); + this.Controls.Add(this.scaleCmpntLabel); + this.Controls.Add(this.tDivCmpntLabel); + this.Controls.Add(this.tDivLabel); + this.Controls.Add(this.tDivCapLabel); + this.Controls.Add(this.regValvePosCapLabel); + this.Controls.Add(this.regValvePosLabel); + this.Controls.Add(this.regValveCmpntLabel); + this.Controls.Add(this.refFlowCmpntLabel); + this.Controls.Add(this.refPulsesLabel); + this.Controls.Add(this.refPulsesCapLabel); + this.Controls.Add(this.refFreqLabel); + this.Controls.Add(this.refFreqCapLabel); + this.Controls.Add(this.refFlowLabel); + this.Controls.Add(this.prInCmpntLabel); + this.Controls.Add(this.prOutCmpntLabel); + this.Controls.Add(this.tOutCmpntLabel); + this.Controls.Add(this.tInCmpntLabel); + this.Controls.Add(this.refFlowCapLabel); + this.Controls.Add(this.prDownLabel); + this.Controls.Add(this.tOutLabel); + this.Controls.Add(this.prDownCapLabel); + this.Controls.Add(this.tOutCapLabel); + this.Controls.Add(this.prUpLabel); + this.Controls.Add(this.tInLabel); + this.Controls.Add(this.prUpCapLabel); + this.Controls.Add(this.tInCapLabel); + this.Controls.Add(this.groupBox3); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.groupBox1); + this.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.Name = "ProcessTabPageCtrl6"; + this.Size = new System.Drawing.Size(1097, 536); + this.Load += new System.EventHandler(this.ProcessTabPageCtrl_Load); + this.Paint += new System.Windows.Forms.PaintEventHandler(this.ProcessTabPageCtrl_Paint); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.reservoirPictureBox)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pumpPictureBox)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox3)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox4)).EndInit(); + this.groupBox4.ResumeLayout(false); + this.groupBox4.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox5)).EndInit(); + this.groupBox5.ResumeLayout(false); + this.groupBox5.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox6)).EndInit(); + this.groupBox6.ResumeLayout(false); + this.groupBox6.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.flowMeterPictureBox)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox1z)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox2z)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.watermeterPictureBox3z)).EndInit(); + this.groupBox1z.ResumeLayout(false); + this.groupBox1z.PerformLayout(); + this.groupBox2z.ResumeLayout(false); + this.groupBox2z.PerformLayout(); + this.groupBox3z.ResumeLayout(false); + this.groupBox3z.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label sensor1Label; + private System.Windows.Forms.Label pulses1Label; + private System.Windows.Forms.Label refPulses1Label; + private System.Windows.Forms.Label pulses1CapLabel; + private System.Windows.Forms.Label refPulses1CapLabel; + private System.Windows.Forms.Label volume1CapLabel; + private System.Windows.Forms.Label volume1Label; + private System.Windows.Forms.Label error1CapLabel; + private System.Windows.Forms.Label error1Label; + private System.Windows.Forms.Label passed1Label; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.Label passed2Label; + private System.Windows.Forms.Label error2Label; + private System.Windows.Forms.Label error2CapLabel; + private System.Windows.Forms.Label volume2Label; + private System.Windows.Forms.Label volume2CapLabel; + private System.Windows.Forms.Label refPulses2CapLabel; + private System.Windows.Forms.Label pulses2CapLabel; + private System.Windows.Forms.Label refPulses2Label; + private System.Windows.Forms.Label pulses2Label; + private System.Windows.Forms.Label sensor2Label; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.Label passed3Label; + private System.Windows.Forms.Label error3Label; + private System.Windows.Forms.Label error3CapLabel; + private System.Windows.Forms.Label volume3Label; + private System.Windows.Forms.Label volume3CapLabel; + private System.Windows.Forms.Label refPulses3CapLabel; + private System.Windows.Forms.Label pulses3CapLabel; + private System.Windows.Forms.Label refPulses3Label; + private System.Windows.Forms.Label pulses3Label; + private System.Windows.Forms.Label sensor3Label; + private System.Windows.Forms.Label tInCapLabel; + private System.Windows.Forms.Label prUpCapLabel; + private System.Windows.Forms.Label tInLabel; + private System.Windows.Forms.Label prUpLabel; + private System.Windows.Forms.Label prDownLabel; + private System.Windows.Forms.Label tOutLabel; + private System.Windows.Forms.Label prDownCapLabel; + private System.Windows.Forms.Label tOutCapLabel; + private System.Windows.Forms.Label refFlowCapLabel; + private System.Windows.Forms.Label tInCmpntLabel; + private System.Windows.Forms.Label tOutCmpntLabel; + private System.Windows.Forms.Label prOutCmpntLabel; + private System.Windows.Forms.Label prInCmpntLabel; + private System.Windows.Forms.Label refFlowLabel; + private System.Windows.Forms.Label refFreqCapLabel; + private System.Windows.Forms.Label refFreqLabel; + private System.Windows.Forms.Label refPulsesCapLabel; + private System.Windows.Forms.Label refPulsesLabel; + private System.Windows.Forms.Label refFlowCmpntLabel; + private System.Windows.Forms.Label regValveCmpntLabel; + private System.Windows.Forms.Label regValvePosLabel; + private System.Windows.Forms.Label regValvePosCapLabel; + private System.Windows.Forms.Label tDivCmpntLabel; + private System.Windows.Forms.Label tDivLabel; + private System.Windows.Forms.Label tDivCapLabel; + private System.Windows.Forms.Label scaleCmpntLabel; + private System.Windows.Forms.Label massCapLabel; + private System.Windows.Forms.Label massLabel; + private System.Windows.Forms.Label massDiffCapLabel; + private System.Windows.Forms.Label massDiffLabel; + private System.Windows.Forms.Label refVolumeCapLabel; + private System.Windows.Forms.Label refVolumeLabel; + private System.Windows.Forms.Label volumeCtvCapLabel; + private System.Windows.Forms.Label volumeCtvLabel; + private System.Windows.Forms.Label refErrorCapLabel; + private System.Windows.Forms.Label refErrorLabel; + private System.Windows.Forms.Label targetFlowLowCapLabel; + private System.Windows.Forms.Label targetFlowHighCapLabel; + private System.Windows.Forms.Label targetVolumeCapLabel; + private System.Windows.Forms.Label estmtdTimeCapLabel; + private System.Windows.Forms.Label targetFlowLowLabel; + private System.Windows.Forms.Label targetFlowHighLabel; + private System.Windows.Forms.Label targetVolumeLabel; + private System.Windows.Forms.Label targetRefCountCapLabel; + private System.Windows.Forms.Label targetRefCountLabel; + private System.Windows.Forms.Label estmtdTimeLabel; + private System.Windows.Forms.Label airTempCapLabel; + private System.Windows.Forms.Label airPressCapLabel; + private System.Windows.Forms.Label airHumiCapLabel; + private System.Windows.Forms.Label airTempLabel; + private System.Windows.Forms.Label airPressLabel; + private System.Windows.Forms.Label airHumiLabel; + private System.Windows.Forms.PictureBox reservoirPictureBox; + private System.Windows.Forms.PictureBox pumpPictureBox; + private System.Windows.Forms.PictureBox watermeterPictureBox1; + private System.Windows.Forms.PictureBox watermeterPictureBox2; + private System.Windows.Forms.PictureBox watermeterPictureBox3; + private System.Windows.Forms.PictureBox watermeterPictureBox4; + private System.Windows.Forms.GroupBox groupBox4; + private System.Windows.Forms.Label passed4Label; + private System.Windows.Forms.Label error4Label; + private System.Windows.Forms.Label error4CapLabel; + private System.Windows.Forms.Label volume4Label; + private System.Windows.Forms.Label volume4CapLabel; + private System.Windows.Forms.Label refPulses4CapLabel; + private System.Windows.Forms.Label pulses4CapLabel; + private System.Windows.Forms.Label refPulses4Label; + private System.Windows.Forms.Label pulses4Label; + private System.Windows.Forms.Label sensor4Label; + private System.Windows.Forms.PictureBox watermeterPictureBox5; + private System.Windows.Forms.GroupBox groupBox5; + private System.Windows.Forms.Label passed5Label; + private System.Windows.Forms.Label error5Label; + private System.Windows.Forms.Label error5CapLabel; + private System.Windows.Forms.Label volume5Label; + private System.Windows.Forms.Label volume5CapLabel; + private System.Windows.Forms.Label refPulses5CapLabel; + private System.Windows.Forms.Label pulses5CapLabel; + private System.Windows.Forms.Label refPulses5Label; + private System.Windows.Forms.Label pulses5Label; + private System.Windows.Forms.Label sensor5Label; + private System.Windows.Forms.Label sensor1CapLabel; + private System.Windows.Forms.Label sensor2CapLabel; + private System.Windows.Forms.Label sensor3CapLabel; + private System.Windows.Forms.Label sensor5CapLabel; + private System.Windows.Forms.Label sensor4CapLabel; + private System.Windows.Forms.PictureBox watermeterPictureBox6; + private System.Windows.Forms.GroupBox groupBox6; + private System.Windows.Forms.Label sensor6CapLabel; + private System.Windows.Forms.Label passed6Label; + private System.Windows.Forms.Label error6Label; + private System.Windows.Forms.Label error6CapLabel; + private System.Windows.Forms.Label volume6Label; + private System.Windows.Forms.Label volume6CapLabel; + private System.Windows.Forms.Label refPulses6CapLabel; + private System.Windows.Forms.Label pulses6CapLabel; + private System.Windows.Forms.Label refPulses6Label; + private System.Windows.Forms.Label pulses6Label; + private System.Windows.Forms.Label sensor6Label; + private System.Windows.Forms.PictureBox flowMeterPictureBox; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.PictureBox watermeterPictureBox1z; + private System.Windows.Forms.PictureBox watermeterPictureBox2z; + private System.Windows.Forms.PictureBox watermeterPictureBox3z; + private System.Windows.Forms.GroupBox groupBox1z; + private System.Windows.Forms.Label passed1zLabel; + private System.Windows.Forms.Label error1zLabel; + private System.Windows.Forms.Label error1zCapLabel; + private System.Windows.Forms.Label volume1zLabel; + private System.Windows.Forms.Label volume1zCapLabel; + private System.Windows.Forms.GroupBox groupBox2z; + private System.Windows.Forms.Label passed2zLabel; + private System.Windows.Forms.Label error2zLabel; + private System.Windows.Forms.Label error2zCapLabel; + private System.Windows.Forms.Label volume2zLabel; + private System.Windows.Forms.Label volume2zCapLabel; + private System.Windows.Forms.GroupBox groupBox3z; + private System.Windows.Forms.Label passed3zLabel; + private System.Windows.Forms.Label error3zLabel; + private System.Windows.Forms.Label error3zCapLabel; + private System.Windows.Forms.Label volume3zLabel; + private System.Windows.Forms.Label volume3zCapLabel; + private System.Windows.Forms.TextBox pumpPctTextBox; + + + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Screens/ProcessTabPageCtrl6.cs b/TBF_V2/Sources/TBF/TBF/Screens/ProcessTabPageCtrl6.cs new file mode 100644 index 00000000..f92c0d4f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Screens/ProcessTabPageCtrl6.cs @@ -0,0 +1,707 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Drawing; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.BenchControl.Sequences; +using TBF.UiBridge; +using TBF.Resources; + +#pragma warning disable 162 /// Disables 'Unreachable code detected' warning + +namespace TBF.Screens +{ + public partial class ProcessTabPageCtrl6 : UserControl + { + static readonly ILog log = LogManager.GetLogger(typeof(ProcessTabPageCtrl6)); + + MetersKind currentMetersKind; + + int textBoxesCount; + + Label[] sensor; + Label[] pulses; + Label[] refPulses; + Label[] volume; + Label[] error; + Label[] passed; + Label[] cmpndVolume; + Label[] cmpndError; + Label[] cmpndPassed; + + bool pumpOn = true; + bool diverterToTank = true; + + /// + /// Constructor, initializes anonymous event handlers + /// + public ProcessTabPageCtrl6() + { + currentMetersKind = MetersKind.Single; + + InitializeComponent(); + + textBoxesCount = 6; + sensor = new Label[] { sensor1Label, sensor2Label, sensor3Label, sensor4Label, sensor5Label, sensor6Label }; + pulses = new Label[] { pulses1Label, pulses2Label, pulses3Label, pulses4Label, pulses5Label, pulses6Label }; + refPulses = new Label[] { refPulses1Label, refPulses2Label, refPulses3Label, refPulses4Label, refPulses5Label, refPulses6Label }; + volume = new Label[] { volume1Label, volume2Label, volume3Label, volume4Label, volume5Label, volume6Label }; + error = new Label[] { error1Label, error2Label, error3Label, error4Label, error5Label, error6Label }; + passed = new Label[] { passed1Label, passed2Label, passed3Label, passed4Label, passed5Label, passed6Label }; + + cmpndVolume = new Label[] { volume1zLabel, volume2zLabel, volume3zLabel }; + cmpndError = new Label[] { error1zLabel, error2zLabel, error3zLabel }; + cmpndPassed = new Label[] { passed1zLabel, passed2zLabel, passed3zLabel }; + + Bridge.ProcedureSelectedHandler += delegate(object sndr, ProcedureSelectedEventArgs args) + { + try + { + if (InvokeRequired) + Invoke(new EventHandler(OnProcedureSelected), sndr, args); + else + OnProcedureSelected(sndr, args); + } + catch (Exception e) { log.ErrorFormat("ProcessTabPage.OnProcedureSelected() failed: {0}", e.Message); } + }; + + Bridge.TestSelectedHandler += delegate(object sender, TestSelectedEventArgs args) + { + try + { + if (InvokeRequired) + Invoke(new EventHandler(OnTestSelected), sender, args); + else + OnTestSelected(sender, args); + } + catch (Exception e) { log.ErrorFormat("ProcessTabPage.OnTestSelected() failed: {0}", e.Message); } + }; + + Bridge.ProcessDataHandler += delegate(object sender, ProcessDataEventArgs args) + { + try + { + if (InvokeRequired) + Invoke(new EventHandler(OnProcessDataChanged), sender, args); + else + OnProcessDataChanged(sender, args); + } + catch (Exception e) { log.ErrorFormat("ProcessTabPage.OnProcessDataChanged() failed: {0}", e.Message); } + }; + + Bridge.TestCompletedHandler += delegate(object sender, TestCompletedEventArgs args) + { + try + { + if (InvokeRequired) + Invoke(new EventHandler(OnTestCompleted), sender, args); + else + OnTestCompleted(sender, args); + } + catch (Exception e) { log.ErrorFormat("ProcessTabPage.OnTestCompleted() failed: {0}", e.Message); } + }; + + Bridge.ProcedureCompletedHandler += delegate(object sender, ProcedureCompletedEventArgs args) + { + try + { + if (InvokeRequired) + Invoke(new EventHandler(OnProcedureCompleted), sender, args); + else + OnProcedureCompleted(sender, args); + } + catch (Exception e) { log.ErrorFormat("ProcessTabPage.OnProcedureCompleted() failed: {0}", e.Message); } + }; + } + + private void ProcessTabPageCtrl_Load(object sender, EventArgs e) + { + Localize(); + Once(); + ResetLabelsAndTargetVals(); + ResetReadings(); + } + + void Localize() + { + airTempCapLabel.Text = string.Format("{0} [°C]:", Strings.Air_temperature); + airPressCapLabel.Text = string.Format("{0} [mbar]:", Strings.Air_pressure); + airHumiCapLabel.Text = string.Format("{0} [%]:", Strings.Air_humidity); + + targetFlowLowCapLabel.Text = Strings.Target_flow_lo_m3h_; + targetFlowHighCapLabel.Text = Strings.Target_flow_hi_m3h_; + targetVolumeCapLabel.Text = Strings.Target_volume_l_; + targetRefCountCapLabel.Text = Strings.Target_ref_pulses_; + estmtdTimeCapLabel.Text = Strings.Estimated_time_s_; + + prUpCapLabel.Text = string.Format("{0} [bar]:", Strings.Pr_up); + prDownCapLabel.Text = string.Format("{0} [bar]:", Strings.Pr_down); + tInCapLabel.Text = string.Format("{0} [°C]:", Strings.T_in); + tOutCapLabel.Text = string.Format("{0} [°C]:", Strings.T_out); + tDivCapLabel.Text = string.Format("{0} [°C]:", Strings.T_div); + + regValvePosCapLabel.Text = Strings.Reg_valve_pos_; + refPulsesCapLabel.Text = Strings.Ref_pulses_; + refFreqCapLabel.Text = Strings.Ref_freq_Hz_; + refFlowCapLabel.Text = Strings.Ref_flow_m3h_; + refVolumeCapLabel.Text = Strings.Ref_volume_l_; + + massCapLabel.Text = string.Format("{0} [kg]:", Strings.Mass); + massDiffCapLabel.Text = Strings.Mass_diff_kg_; + volumeCtvCapLabel.Text = string.Format("{0} [l]:", Strings.Volume); + refErrorCapLabel.Text = Strings.Ref_error_pct_; + + GroupBox[] groupBoxes = new GroupBox[] { groupBox1, groupBox2, groupBox3, groupBox4, groupBox5, groupBox6 }; + for (int i = 0; i < groupBoxes.Length; i++) groupBoxes[i].Text = string.Format(Strings.Meter_nr, i + 1); + + sensor1CapLabel.Text = sensor2CapLabel.Text = sensor3CapLabel.Text = sensor4CapLabel.Text = sensor5CapLabel.Text = sensor6CapLabel.Text = Strings.Sensor_; + pulses1CapLabel.Text = pulses2CapLabel.Text = pulses3CapLabel.Text = pulses4CapLabel.Text = pulses5CapLabel.Text = pulses6CapLabel.Text = Strings.Pulses_; + refPulses1CapLabel.Text = refPulses2CapLabel.Text = refPulses3CapLabel.Text = refPulses4CapLabel.Text = refPulses5CapLabel.Text = refPulses6CapLabel.Text = Strings.Ref_pulses_; + volume1CapLabel.Text = volume2CapLabel.Text = volume3CapLabel.Text = volume4CapLabel.Text = volume5CapLabel.Text = volume6CapLabel.Text = Strings.Volume + ":"; + error1CapLabel.Text = error2CapLabel.Text = error3CapLabel.Text = error4CapLabel.Text = error5CapLabel.Text = error6CapLabel.Text = Strings.Error + ":"; + + GroupBox[] groupBoxesZ = new GroupBox[] { groupBox1z, groupBox2z, groupBox3z }; + for (int i = 0; i < groupBoxesZ.Length; i++) groupBoxesZ[i].Text = string.Format(Strings.Compound_meter_nr, i + 1); + + volume1zCapLabel.Text = volume2zCapLabel.Text = volume3zCapLabel.Text = Strings.Volume + ":"; + error1zCapLabel.Text = error2zCapLabel.Text = error3zCapLabel.Text = Strings.Error + ":"; + } + + void Once() + { + + } + + /// + /// Called when a new procedure is selected + /// + void ResetLabelsAndTargetVals() + { + /// Target values + targetFlowLowLabel.Text = "---"; + targetFlowHighLabel.Text = "---"; + targetVolumeLabel.Text = "---"; + targetRefCountLabel.Text = "---"; + estmtdTimeLabel.Text = "---"; + + // + refFlowCmpntLabel.Text = "---"; + regValveCmpntLabel.Text = "---"; + + /// Water pressure + prInCmpntLabel.Text = "---"; + prOutCmpntLabel.Text = "---"; + + /// Water temperature + tInCmpntLabel.Text = "---"; + tOutCmpntLabel.Text = "---"; + tDivCmpntLabel.Text = "---"; + + scaleCmpntLabel.Text = "---"; + + if (currentMetersKind == MetersKind.Single) + { + watermeterPictureBox1z.Visible = false; + watermeterPictureBox2z.Visible = false; + watermeterPictureBox3z.Visible = false; + groupBox1z.Visible = false; + groupBox2z.Visible = false; + groupBox3z.Visible = false; + + sensor1Label.Text = "---"; + + if (Config.Data.WMsCount >= 2) { sensor2Label.Text = "---"; } + else { groupBox2.Visible = false; watermeterPictureBox2.Visible = false; } + + if (Config.Data.WMsCount >= 3) { sensor3Label.Text = "---"; } + else { groupBox3.Visible = false; watermeterPictureBox3.Visible = false; } + + if (Config.Data.WMsCount >= 4) { sensor4Label.Text = "---"; } + else { groupBox4.Visible = false; watermeterPictureBox4.Visible = false; } + + if (Config.Data.WMsCount >= 5) { sensor5Label.Text = "---"; } + else { groupBox5.Visible = false; watermeterPictureBox5.Visible = false; } + + if (Config.Data.WMsCount >= 6) { sensor6Label.Text = "---"; } + else { groupBox6.Visible = false; watermeterPictureBox6.Visible = false; } + } + else if (currentMetersKind == MetersKind.Combined) + { + watermeterPictureBox1.Visible = false; + watermeterPictureBox3.Visible = false; + watermeterPictureBox5.Visible = false; + + sensor1Label.Text = "---"; + sensor2Label.Text = "---"; + watermeterPictureBox2.Visible = true; + watermeterPictureBox1z.Visible = true; + groupBox1z.Visible = true; + + if (Config.Data.WMsCount >= 4) + { + watermeterPictureBox4.Visible = true; + watermeterPictureBox2z.Visible = true; + groupBox3.Visible = true; + groupBox4.Visible = true; + groupBox2z.Visible = true; + sensor3Label.Text = "---"; + sensor4Label.Text = "---"; + } + else + { + watermeterPictureBox4.Visible = false; + watermeterPictureBox2z.Visible = false; + groupBox3.Visible = false; + groupBox4.Visible = false; + groupBox2z.Visible = false; + } + + if (Config.Data.WMsCount >= 6) + { + watermeterPictureBox6.Visible = true; + watermeterPictureBox3z.Visible = true; + groupBox5.Visible = true; + groupBox6.Visible = true; + groupBox3z.Visible = true; + sensor5Label.Text = "---"; + sensor6Label.Text = "---"; + } + else + { + watermeterPictureBox6.Visible = false; + watermeterPictureBox3z.Visible = false; + groupBox5.Visible = false; + groupBox6.Visible = false; + groupBox3z.Visible = false; + } + } + } + + /// + /// Called when a new procedure or a new test procedure is selected + /// + void ResetReadings() + { + /// Top part + airTempLabel.Text = "---"; + airPressLabel.Text = "---"; + airHumiLabel.Text = "---"; + + refPulsesLabel.Text = "---"; + refFreqLabel.Text = "---"; + refFlowLabel.Text = "---"; + refVolumeLabel.Text = "---"; + + regValvePosLabel.Text = "---"; + tDivLabel.Text = "---"; + + tInLabel.Text = "---"; + tOutLabel.Text = "---"; + prUpLabel.Text = "---"; + prDownLabel.Text = "---"; + + massLabel.Text = "---"; + massDiffLabel.Text = "---"; + volumeCtvLabel.Text = "---"; + refErrorLabel.Text = "---"; + + /// Meters + pulses1Label.Text = "---"; + refPulses1Label.Text = "---"; + volume1Label.Text = "---"; + error1Label.Text = "---"; + passed1Label.Text = "---"; + + if (Config.Data.WMsCount >= 2) + { + pulses2Label.Text = "---"; + refPulses2Label.Text = "---"; + volume2Label.Text = "---"; + error2Label.Text = "---"; + passed2Label.Text = "---"; + } + + if (currentMetersKind == MetersKind.Combined && Config.Data.WMsCount >= 2) + { + volume1zLabel.Text = "---"; + error1zLabel.Text = "---"; + passed1zLabel.Text = "---"; + } + + if ((currentMetersKind == MetersKind.Single && Config.Data.WMsCount >= 3) || + (currentMetersKind == MetersKind.Combined && Config.Data.WMsCount >= 4)) + { + pulses3Label.Text = "---"; + refPulses3Label.Text = "---"; + volume3Label.Text = "---"; + error3Label.Text = "---"; + passed3Label.Text = "---"; + } + + if (Config.Data.WMsCount >= 4) + { + pulses4Label.Text = "---"; + refPulses4Label.Text = "---"; + volume4Label.Text = "---"; + error4Label.Text = "---"; + passed4Label.Text = "---"; + } + + if (currentMetersKind == MetersKind.Combined && Config.Data.WMsCount >= 4) + { + volume2zLabel.Text = "---"; + error2zLabel.Text = "---"; + passed2zLabel.Text = "---"; + } + + if ((currentMetersKind == MetersKind.Single && Config.Data.WMsCount >= 5) || + (currentMetersKind == MetersKind.Combined && Config.Data.WMsCount >= 6)) + { + pulses5Label.Text = "---"; + refPulses5Label.Text = "---"; + volume5Label.Text = "---"; + error5Label.Text = "---"; + passed5Label.Text = "---"; + } + + if (Config.Data.WMsCount >= 6) + { + pulses6Label.Text = "---"; + refPulses6Label.Text = "---"; + volume6Label.Text = "---"; + error6Label.Text = "---"; + passed6Label.Text = "---"; + } + + if (currentMetersKind == MetersKind.Combined && Config.Data.WMsCount >= 6) + { + volume3zLabel.Text = "---"; + error3zLabel.Text = "---"; + passed3zLabel.Text = "---"; + } + } + + void OnProcedureSelected(object sender, ProcedureSelectedEventArgs args) + { + currentMetersKind = args.Procedure.MetersKind; + ResetLabelsAndTargetVals(); + ResetReadings(); + Invalidate(); + } + + void OnTestSelected(object sender, TestSelectedEventArgs args) + { + /// Readings and target values + ResetReadings(); + + /// Target values + targetFlowLowLabel.Text = args.Test.Qfrom.ToString("F3"); + targetFlowHighLabel.Text = args.Test.Qto.ToString("F3"); + targetVolumeLabel.Text = args.Test.Volume.ToString("F1"); + targetRefCountLabel.Text = args.TotalPulses.ToString(); + estmtdTimeLabel.Text = args.Test.TstTime.ToString("F1"); + + /// Names of virtual bench components + if (args.BenchPath.PressMtrUp != null) prInCmpntLabel.Text = args.BenchPath.PressMtrUp.Name; + if (args.BenchPath.PressMtrDown != null) prOutCmpntLabel.Text = args.BenchPath.PressMtrDown.Name; + if (args.BenchPath.TempMtrUp != null) tInCmpntLabel.Text = args.BenchPath.TempMtrUp.Name; + if (args.BenchPath.TempMtrDown != null) tOutCmpntLabel.Text = args.BenchPath.TempMtrDown.Name; + if (args.OutputPath.TempDiv != null) tDivCmpntLabel.Text = args.OutputPath.TempDiv.Name; + if (args.OutputPath.FlowMeter != null) refFlowCmpntLabel.Text = args.OutputPath.FlowMeter.Name; + if (args.OutputPath.RegulValve != null) regValveCmpntLabel.Text = args.OutputPath.RegulValve.Name; + if (args.OutputPath.Scale != null) scaleCmpntLabel.Text = args.OutputPath.Scale.Name; + + sensor1Label.Text = (args.MetersPath.RegisterReaders[0] == null) ? "" : args.MetersPath.RegisterReaders[0].Cfg.Name; + if (Config.Data.WMsCount >= 2) + { + sensor2Label.Text = (args.MetersPath.RegisterReaders[1] == null) ? "" : args.MetersPath.RegisterReaders[1].Cfg.Name; + } + if (Config.Data.WMsCount >= 3) + { + sensor3Label.Text = (args.MetersPath.RegisterReaders[2] == null) ? "" : args.MetersPath.RegisterReaders[2].Cfg.Name; + } + if (Config.Data.WMsCount >= 4) + { + sensor4Label.Text = (args.MetersPath.RegisterReaders[3] == null) ? "" : args.MetersPath.RegisterReaders[3].Cfg.Name; + } + if (Config.Data.WMsCount >= 5) + { + sensor5Label.Text = (args.MetersPath.RegisterReaders[4] == null) ? "" : args.MetersPath.RegisterReaders[4].Cfg.Name; + } + if (Config.Data.WMsCount >= 6) + { + sensor6Label.Text = (args.MetersPath.RegisterReaders[5] == null) ? "" : args.MetersPath.RegisterReaders[5].Cfg.Name; + } + + if (args.FeedingPath != null && (args.FeedingPath.Pump is BenchControl.GenericDevices.IPumpFM)) + { + pumpPctTextBox.Visible = true; + pumpPctTextBox.Text = (args.FeedingPath.Pump as BenchControl.GenericDevices.IPumpFM).Power.ToString("F0") + " %"; + } + else + { + pumpPctTextBox.Visible = false; + } + } + + void OnProcessDataChanged(object sender, ProcessDataEventArgs args) + { + ///// + ///// Always available + ///// + //airTempLabel.Text = Config.Units.ConvertTo(Config.Unit.C, ProcessData.AmbTemp.Val).ToString("F1"); + // airPressLabel.Text = Config.Units.ConvertTo(Config.Unit.mbar, ProcessData.AmbPress.Val).ToString("F0"); + // airHumiLabel.Text = Config.Units.ConvertTo(Config.Unit.RPct, ProcessData.AmbHumi.Val).ToString("F1"); + + //tInLabel.Text = ProcessData.TempUp.ToString(); + //tOutLabel.Text = ProcessData.TempDown.ToString(); + //tDivLabel.Text = ProcessData.TempDiv.ToString(); + + //prUpLabel.Text = ProcessData.PressUp.ToString(); + //prDownLabel.Text = ProcessData.PressDown.ToString(); + + //massLabel.Text = ProcessData.Mass.ToString(); + + //if (args.TestPhase == Config.Entities.Progress.FlowSetting || + // args.TestPhase == Config.Entities.Progress.Test) + //{ + // /// + // /// Available when setting the flow and during a test + // /// + // refFreqLabel.Text = ProcessData.RefFreq.ToString(); + // refFlowLabel.Text = Utils.DoubleToStr(ProcessData.RefFlow.Val, 4); + //} + + //if (args.TestPhase == Config.Entities.Progress.Test) + //{ + // /// + // /// Available only during a test + // /// + // refPulsesLabel.Text = ProcessData.RefPulses.ToString(); + // double refVolume = ProcessData.LtrPerRefPulse * (double)ProcessData.RefPulses; + // refVolumeLabel.Text = refVolume.ToString("F2"); + + // double massDiff = ProcessData.Mass.Val - ProcessData.StartMass.Val; + // massDiffLabel.Text = massDiff.ToString("F3"); + // double volumeCtv = 1000.0 * Config.Formulas.Buoyancy() * massDiff / (float)Config.Formulas.WaterDensityFromTemp((ProcessData.TempUp.Val + ProcessData.TempDown.Val) / 2, Program.LocalSettings.RealDensity, Program.LocalSettings.AtTemperature); + // volumeCtvLabel.Text = volumeCtv.ToString("F2"); + // double refError = Config.Formulas.ErrorFromVolumes(refVolume, volumeCtv); + // refErrorLabel.Text = refError.ToString("F3"); + + // if (currentMetersKind == MetersKind.Single) + // { + // for (int i = 0; i < Math.Min(textBoxesCount, ProcessData.RegisterReaders.Length); i++) + // { + // BenchControl.GenericDevices.IRegisterReader rr = ProcessData.RegisterReaders[i]; + // if (rr != null) + // { + // pulses[i].Text = rr.WMPulses.ToString(); + // refPulses[i].Text = rr.WMRefPulses.ToString(); + // volume[i].Text = rr.WMVolume.ToString("F1"); + // error[i].Text = Config.Formulas.ErrorFromVolumes(rr.WMVolume, rr.WMRefPulses * ProcessData.LtrPerRefPulse).ToString("F1"); + // } + // } + // } + // else if (currentMetersKind == MetersKind.Combined) + // { + // for (int compMtr = 0; compMtr < Config.Data.CompoundWMsCount; compMtr++) + // { + // int end = Math.Min(2 * compMtr + 2, Math.Min(textBoxesCount, ProcessData.RegisterReaders.Length)); + + // double compoundVolume = 0; + // for (int i = 2 * compMtr; i < end; i++) + // { + // BenchControl.GenericDevices.IRegisterReader rr = ProcessData.RegisterReaders[i]; + // if (rr != null) + // { + // pulses[i].Text = rr.WMPulses.ToString(); + // refPulses[i].Text = rr.WMRefPulses.ToString(); + // volume[i].Text = rr.WMVolume.ToString("F1"); + // error[i].Text = Config.Formulas.ErrorFromVolumes(rr.WMVolume, rr.WMRefPulses * ProcessData.LtrPerRefPulse).ToString("F1"); + // compoundVolume += rr.WMVolume; + // } + // } + + // cmpndVolume[compMtr].Text = compoundVolume.ToString("F1"); + // cmpndError[compMtr].Text = Config.Formulas.ErrorFromVolumes(compoundVolume, refVolume).ToString("F1"); + // } + // } + //} + + ////if (pumpOn != args.PumpOn || diverterToTank != args.DivToTank) + ////{ + //// //if (pumpOn != args.PumpOn) + //// //{ + //// // if (pumpOn) pumpPictureBox.Image = System.Resources. + //// // else pumpPictureBox.Image = System.Resources. + //// //} + //// pumpOn = args.PumpOn; + //// diverterToTank = args.DivToTank; + //// Invalidate(); + ////} + } + + void OnTestCompleted(object sender, TestCompletedEventArgs args) + { + Results.Entities.TestRslt tRes = args.TestRslt; + if (tRes == null) return; + + airTempLabel.Text = tRes.AmbTempMean.ToString("F1"); + airPressLabel.Text = Config.Units.ConvertTo(Config.Unit.mbar, tRes.AmbPressMean).ToString("F0"); + airHumiLabel.Text = tRes.AmbHumiMean.ToString("F1"); + + tInLabel.Text = tRes.TempUpMean.ToString("F2"); + tOutLabel.Text = tRes.TempDownMean.ToString("F2"); + tDivLabel.Text = tRes.TempDivMean.ToString("F2"); + + prUpLabel.Text = tRes.PressUpMean.ToString("F2"); + prDownLabel.Text = tRes.PressDownMean.ToString("F2"); + + massLabel.Text = ProcessData.Mass.ToString(); + massDiffLabel.Text = (tRes.MassEnd - tRes.MassStart).ToString("F3"); + + refPulsesLabel.Text = tRes.PulsesMaster.ToString("F0"); + refFreqLabel.Text = "---"; + refFlowLabel.Text = Utils.DoubleToStr(tRes.FlowVolume, 4); + + refVolumeLabel.Text = tRes.VolumeCTV.ToString("F2"); + //regValvePosLabel.Text = tstRslt. + + volumeCtvLabel.Text = tRes.VolumeCTV.ToString("F1"); + refErrorLabel.Text = (tRes.ErrorMaster == 0) ? "---" : tRes.ErrorMaster.ToString("F3"); + + if (!tRes.Batch.Compound) + { + for (int i = 0; i < Math.Min(textBoxesCount, ProcessData.BatchRslts.WaterMeters.Length); i++) + { + Results.Entities.WaterMeter wm = ProcessData.BatchRslts.WaterMeters[i]; + Results.Entities.MeterTestRslt mtr = (wm != null) ? wm.GetMeterTestRslt(args.TestName) : null; + + if (mtr != null) + { + pulses[i].Text = mtr.PulsesMeter.ToString("F0"); + refPulses[i].Text = mtr.PulsesMaster.ToString("F0"); + volume[i].Text = mtr.VolumeMeter.ToString("F2"); + error[i].Text = mtr.Error.ToString("F2"); + passed[i].Text = mtr.Passed ? Strings.Passed : Strings.Failed; + } + } + } + else + { + for (int compMtr = 0; compMtr < Config.Data.CompoundWMsCount; compMtr++) + { + Results.Entities.WaterMeter wm = ProcessData.BatchRslts.WaterMeters[compMtr]; + if (wm == null) continue; + + int end = Math.Min(textBoxesCount, Config.Data.WMsCount); + + Results.Entities.MeterTestRslt mtrMain = wm.GetMeterTestRslt(args.TestName, CompoundMeterId.CompoundMain); + if ((mtrMain != null) && (2 * compMtr < end)) + { + pulses[2 * compMtr].Text = mtrMain.PulsesMeter.ToString("F0"); + refPulses[2 * compMtr].Text = mtrMain.PulsesMaster.ToString("F0"); + volume[2 * compMtr].Text = mtrMain.VolumeMeter.ToString("F2"); + error[2 * compMtr].Text = mtrMain.Error.ToString("F2"); + passed[2 * compMtr].Text = mtrMain.Passed ? Strings.Passed : Strings.Failed; + } + + Results.Entities.MeterTestRslt mtrAux = wm.GetMeterTestRslt(args.TestName, CompoundMeterId.CompoundAux); + if ((mtrAux != null) && (2 * compMtr + 1 < end)) + { + pulses[2 * compMtr + 1].Text = mtrAux.PulsesMeter.ToString("F0"); + refPulses[2 * compMtr + 1].Text = mtrAux.PulsesMaster.ToString("F0"); + volume[2 * compMtr + 1].Text = mtrAux.VolumeMeter.ToString("F2"); + error[2 * compMtr + 1].Text = mtrAux.Error.ToString("F2"); + passed[2 * compMtr + 1].Text = mtrAux.Passed ? Strings.Passed : Strings.Failed; + } + + Results.Entities.MeterTestRslt mtrComp = wm.GetMeterTestRslt(args.TestName, CompoundMeterId.Compound); + if (mtrComp != null) + { + cmpndVolume[compMtr].Text = mtrComp.VolumeMeter.ToString("F2"); + cmpndError[compMtr].Text = mtrComp.Error.ToString("F2"); + cmpndPassed[compMtr].Text = mtrComp.Passed ? Strings.Passed : Strings.Failed; + } + } + } + } + + void OnProcedureCompleted(object sender, ProcedureCompletedEventArgs args) + { + } + + private void ProcessTabPageCtrl_Paint(object sender, PaintEventArgs e) + { + System.Drawing.Graphics formGraphics = this.CreateGraphics(); + + System.Drawing.SolidBrush filledBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Blue); + System.Drawing.SolidBrush emptyBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Gray); + System.Drawing.SolidBrush benchBrush = (pumpOn ? filledBrush : emptyBrush); + + int diam = 14; // pipe diameter (pixels) + int left = 20; // left-most pipe x-coordinate + int top = 14; // top-most pipe y-coordinate + int topLeft = 876; + int topRight = 966; + int divTop = 40; + int bottom = 504; // bottom-most pipe y-coordinate + int benchTop = 378; // bench-pipe top y-coordinate + int pumpLeft = 779; + int pumpWdth = 38; + + /// Pipes + formGraphics.FillRectangle(filledBrush,new Rectangle(pumpLeft+pumpWdth, bottom-diam, 65, diam)); // tank -> pump + formGraphics.FillRectangle(benchBrush, new Rectangle(left, bottom-diam, pumpLeft-left, diam)); // pump ->bench horizontal + formGraphics.FillRectangle(benchBrush, new Rectangle(left, benchTop, diam, bottom-benchTop)); // ->bench vertical + formGraphics.FillRectangle(benchBrush, new Rectangle(left + diam, benchTop, topLeft-left, diam)); // bench horizontal + formGraphics.FillRectangle(benchBrush, new Rectangle(topLeft, top + diam, diam, benchTop-top-diam)); // bench -> top vertical + formGraphics.FillRectangle(benchBrush, new Rectangle(topLeft, top, topRight-topLeft, diam)); // top horizontal + formGraphics.FillRectangle(benchBrush, new Rectangle(topRight-diam, top+diam, diam, divTop-top-diam)); // top -> diverter vertical + + /// Combined meters bypasses + if (watermeterPictureBox1z.Visible) PaintBypass(formGraphics, benchBrush, 186, benchTop + diam); + if (watermeterPictureBox2z.Visible) PaintBypass(formGraphics, benchBrush, 470, benchTop + diam); + if (watermeterPictureBox3z.Visible) PaintBypass(formGraphics, benchBrush, 754, benchTop + diam); + + /// Diverter + int displacement = diverterToTank ? 25 : -25; + Point[] points = new Point[4]; + points[0].X = topRight - diam; + points[0].Y = divTop; + points[1].X = topRight; + points[1].Y = divTop; + points[2].X = topRight + displacement; + points[2].Y = divTop + 50; + points[3].X = topRight - diam + displacement; + points[3].Y = divTop + 50; + formGraphics.FillPolygon(benchBrush, points); + + /// Sink + formGraphics.FillEllipse(emptyBrush, topRight - diam / 2 - 45, divTop + 50, 40, 30); + formGraphics.DrawEllipse(Pens.Black, topRight - diam / 2 - 45, divTop + 50, 40, 30); + + /// Tank + formGraphics.DrawRectangle(Pens.Black, topRight - diam / 2, divTop + 51, 60, 80); + + + emptyBrush.Dispose(); + filledBrush.Dispose(); + formGraphics.Dispose(); + } + + private void PaintBypass(System.Drawing.Graphics formGraphics, System.Drawing.SolidBrush brush, int startX, int startY) + { + int w = 80; + int h = 43; + int diam = 10; // pipe diameter (pixels) + + formGraphics.FillRectangle(brush, new Rectangle(startX, startY, diam, h - diam)); + formGraphics.FillRectangle(brush, new Rectangle(startX, startY + h - diam, w, diam)); + formGraphics.FillRectangle(brush, new Rectangle(startX + w - diam, startY, diam, h)); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Screens/ProcessTabPageCtrl6.resx b/TBF_V2/Sources/TBF/TBF/Screens/ProcessTabPageCtrl6.resx new file mode 100644 index 00000000..1f4e3da5 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Screens/ProcessTabPageCtrl6.resx @@ -0,0 +1,327 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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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 + zVhuAr/Ce2bVcGWw1gAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACYAAAAeCAYAAABAFGxuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAIGSURBVFhH7de/SwJhGAfwtwJpUlBwaVIEcXDVxcUxQaS1 + QdLVwTnQv0AcGgUdo9U1dNAWHVwiEQKFaAkCwZqq5el53rvT03v8cXqeDQ0fjXu97/PFO+w9MZlMYFO1 + Wg2EEJbg8vX+iy3i8vW2KHaEznbkgm63C6PRiJ1DtijmQLCjMRLg8/mgUqmwsw5UTEN5UfD7/ZDL5eZm + mSqWz+cxyMpimhZS7r12uy1n4d/GG3O5Y8QFWyWCTpCcRy8lRK3XeUJcoJVGaFrsXj34V9hYrFrtQSj0 + wa4Z2VgsGh1Dq9WS79z6PBuLkUbjQZZLJN7Y9ZkVxYrFgQzZl3j83TBz5oDFms02uN3fhrmKAxbzer8M + M2dWFNsH7R4Lh+mXnf+MwsZi6fSLLBUMfrLr82wsVio9ssd5NhYzZ1rsEhXVg4dA3ybN12CnSCQCRCkY + UP0gLmAfnpGQHfQM+zGlIO257hAXZLUMJJPJuQ6yx+KBfr+P/3CreAIVTOoC9uEK8Q8mS3ew5XIZYrEY + nuhCN2qQlQZIQL1eZ+ev3VoHAgFwOOjSXqNXNXRXSqlOp8POJBvt+Xu9ngwS4lQN3oVy+egJybLHt2w2 + K0OFOFeHmJFByn5+2eXTM1WMDIdD8Hg8coAQtyquCKGfHVq/kOekUik2k2O6mKZQKOBAKrea0+nE7Y2b + zVhuAr/Ce2bVcGWw1gAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACYAAAAeCAYAAABAFGxuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAIGSURBVFhH7de/SwJhGAfwtwJpUlBwaVIEcXDVxcUxQaS1 + QdLVwTnQv0AcGgUdo9U1dNAWHVwiEQKFaAkCwZqq5el53rvT03v8cXqeDQ0fjXu97/PFO+w9MZlMYFO1 + Wg2EEJbg8vX+iy3i8vW2KHaEznbkgm63C6PRiJ1DtijmQLCjMRLg8/mgUqmwsw5UTEN5UfD7/ZDL5eZm + mSqWz+cxyMpimhZS7r12uy1n4d/GG3O5Y8QFWyWCTpCcRy8lRK3XeUJcoJVGaFrsXj34V9hYrFrtQSj0 + wa4Z2VgsGh1Dq9WS79z6PBuLkUbjQZZLJN7Y9ZkVxYrFgQzZl3j83TBz5oDFms02uN3fhrmKAxbzer8M + M2dWFNsH7R4Lh+mXnf+MwsZi6fSLLBUMfrLr82wsVio9ssd5NhYzZ1rsEhXVg4dA3ybN12CnSCQCRCkY + UP0gLmAfnpGQHfQM+zGlIO257hAXZLUMJJPJuQ6yx+KBfr+P/3CreAIVTOoC9uEK8Q8mS3ew5XIZYrEY + nuhCN2qQlQZIQL1eZ+ev3VoHAgFwOOjSXqNXNXRXSqlOp8POJBvt+Xu9ngwS4lQN3oVy+egJybLHt2w2 + K0OFOFeHmJFByn5+2eXTM1WMDIdD8Hg8coAQtyquCKGfHVq/kOekUik2k2O6mKZQKOBAKrea0+nE7Y2b + zVhuAr/Ce2bVcGWw1gAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACYAAAAeCAYAAABAFGxuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAIGSURBVFhH7de/SwJhGAfwtwJpUlBwaVIEcXDVxcUxQaS1 + QdLVwTnQv0AcGgUdo9U1dNAWHVwiEQKFaAkCwZqq5el53rvT03v8cXqeDQ0fjXu97/PFO+w9MZlMYFO1 + Wg2EEJbg8vX+iy3i8vW2KHaEznbkgm63C6PRiJ1DtijmQLCjMRLg8/mgUqmwsw5UTEN5UfD7/ZDL5eZm + mSqWz+cxyMpimhZS7r12uy1n4d/GG3O5Y8QFWyWCTpCcRy8lRK3XeUJcoJVGaFrsXj34V9hYrFrtQSj0 + wa4Z2VgsGh1Dq9WS79z6PBuLkUbjQZZLJN7Y9ZkVxYrFgQzZl3j83TBz5oDFms02uN3fhrmKAxbzer8M + M2dWFNsH7R4Lh+mXnf+MwsZi6fSLLBUMfrLr82wsVio9ssd5NhYzZ1rsEhXVg4dA3ybN12CnSCQCRCkY + UP0gLmAfnpGQHfQM+zGlIO257hAXZLUMJJPJuQ6yx+KBfr+P/3CreAIVTOoC9uEK8Q8mS3ew5XIZYrEY + nuhCN2qQlQZIQL1eZ+ev3VoHAgFwOOjSXqNXNXRXSqlOp8POJBvt+Xu9ngwS4lQN3oVy+egJybLHt2w2 + K0OFOFeHmJFByn5+2eXTM1WMDIdD8Hg8coAQtyquCKGfHVq/kOekUik2k2O6mKZQKOBAKrea0+nE7Y2b + zVhuAr/Ce2bVcGWw1gAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACYAAAAeCAYAAABAFGxuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAIGSURBVFhH7de/SwJhGAfwtwJpUlBwaVIEcXDVxcUxQaS1 + QdLVwTnQv0AcGgUdo9U1dNAWHVwiEQKFaAkCwZqq5el53rvT03v8cXqeDQ0fjXu97/PFO+w9MZlMYFO1 + Wg2EEJbg8vX+iy3i8vW2KHaEznbkgm63C6PRiJ1DtijmQLCjMRLg8/mgUqmwsw5UTEN5UfD7/ZDL5eZm + mSqWz+cxyMpimhZS7r12uy1n4d/GG3O5Y8QFWyWCTpCcRy8lRK3XeUJcoJVGaFrsXj34V9hYrFrtQSj0 + wa4Z2VgsGh1Dq9WS79z6PBuLkUbjQZZLJN7Y9ZkVxYrFgQzZl3j83TBz5oDFms02uN3fhrmKAxbzer8M + M2dWFNsH7R4Lh+mXnf+MwsZi6fSLLBUMfrLr82wsVio9ssd5NhYzZ1rsEhXVg4dA3ybN12CnSCQCRCkY + UP0gLmAfnpGQHfQM+zGlIO257hAXZLUMJJPJuQ6yx+KBfr+P/3CreAIVTOoC9uEK8Q8mS3ew5XIZYrEY + nuhCN2qQlQZIQL1eZ+ev3VoHAgFwOOjSXqNXNXRXSqlOp8POJBvt+Xu9ngwS4lQN3oVy+egJybLHt2w2 + K0OFOFeHmJFByn5+2eXTM1WMDIdD8Hg8coAQtyquCKGfHVq/kOekUik2k2O6mKZQKOBAKrea0+nE7Y2b + zVhuAr/Ce2bVcGWw1gAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACYAAAAeCAYAAABAFGxuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAIGSURBVFhH7de/SwJhGAfwtwJpUlBwaVIEcXDVxcUxQaS1 + QdLVwTnQv0AcGgUdo9U1dNAWHVwiEQKFaAkCwZqq5el53rvT03v8cXqeDQ0fjXu97/PFO+w9MZlMYFO1 + Wg2EEJbg8vX+iy3i8vW2KHaEznbkgm63C6PRiJ1DtijmQLCjMRLg8/mgUqmwsw5UTEN5UfD7/ZDL5eZm + mSqWz+cxyMpimhZS7r12uy1n4d/GG3O5Y8QFWyWCTpCcRy8lRK3XeUJcoJVGaFrsXj34V9hYrFrtQSj0 + wa4Z2VgsGh1Dq9WS79z6PBuLkUbjQZZLJN7Y9ZkVxYrFgQzZl3j83TBz5oDFms02uN3fhrmKAxbzer8M + M2dWFNsH7R4Lh+mXnf+MwsZi6fSLLBUMfrLr82wsVio9ssd5NhYzZ1rsEhXVg4dA3ybN12CnSCQCRCkY + UP0gLmAfnpGQHfQM+zGlIO257hAXZLUMJJPJuQ6yx+KBfr+P/3CreAIVTOoC9uEK8Q8mS3ew5XIZYrEY + nuhCN2qQlQZIQL1eZ+ev3VoHAgFwOOjSXqNXNXRXSqlOp8POJBvt+Xu9ngwS4lQN3oVy+egJybLHt2w2 + K0OFOFeHmJFByn5+2eXTM1WMDIdD8Hg8coAQtyquCKGfHVq/kOekUik2k2O6mKZQKOBAKrea0+nE7Y2b + zVhuAr/Ce2bVcGWw1gAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACYAAAAmCAYAAACoPemuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAN+SURBVFhHtZi5SgRBEIbbW8QjkRXBKxPWEwRF1EjQSBDE + RFBxDdRdEDxBUDDyJXwBH8DAzNxQQdDIR9g3aOfv3emp6qkd5zL4PHqqqn/6qO5qVa1WdVwqlYpWSqVG + iumztrZm2NraqtlLRo3IW9j6+rphZGQkbO8aS3x8fOiDg4Owc0ImJib04+OjjYvR8Tk5OeH2VIBEuVzm + DqC9XauODq3u76MZH6/Zuf4en5+f+ufnx7Czs8O+tba2RgsbR2DiYNjb0+ruThbSCPj097M46ByiNjY2 + WPvKyopZa6Kwl5cXY2AdOju1mp+XO03C7q5WU1NMiM/g4KD++vrSs7OzjYUxUZg2qZMsjI0xUT09PXZa + 8T80hISFpu/8XA6ehclJ1kdLS0u0MLbQMVL/IWpxMeiD0Oktl+/vb6vFCkNKsIZYU1LQrFBRXV21NjKt + T09PYWEsT+Wx0F28HGbjg+vr4BtpDwmjH1nAPFhYCGJjpKgogIGofz87OwuEsV2InEOdsrK0FMT2dp9o + A3wbDytsYGCg1ogFf3srO6bB2X3q5ka2A9vb1s4Ks45xjpm4zM0FcbGZrq5kO5/9fWtfLBYdYZJDGpaX + g5i9vbKNRP1cLRQKWnV3d+crbHo6iAeSLI26sKamJvwmQSTjJHjnnI2FG8LFhWzXCH4TsX/IxnGhO7uv + T7b5C1HYzIxsHAc6UkCyiUOuI+ZeY5JOHyU3YXT3pZ0+ChWWOl3QPIWFLtkkpS7MpAsmDHcxycHFzeiX + l7JdEo6PtWpuNvGssC4crOgAiiUnCj37kDzzOsJI5n94eKgJGxoaCjqLOsTpLSHvO5sf18PMIn68vr4G + H1DNSI7u9P119iUBxUc9LgoRKwyYg9PvFNUMdaQ3T1xdom4JaSAz9vz8zIWhQrad47zznaTrcJ6cntr4 + o6OjRgsTZv7xBQDPKPI6nAcofuo7Eby/v8vCULa3tbVxMUC6DmcFy4X0sedtOqqFCbONxMEgBc6C8x5S + KpXCGtwG9y3BgGmVOkgD1hSZPuBqAEwYfXVB2Y4KmQbIVNYhJQwPs3iHh4dMDMUKo+9TeODw21Eh02AG + FA7I1JIAytERy+gUd025GGGbm5vMCa8uvgHKdlTI9LsFR1gUzpQBpAS6+xqh7JunR4cX7O3tTTQEq6ur + rJOk+MkzDp59zYlOXyP+83GYU9W/sZE2jpG87/4AAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAACYAAAAjCAYAAAD48HgdAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAN0SURBVFhHxZg5SDNBGIZHiTZBEA9UEESE2ARvxIMIVuJV + qY0iKoithSBok87CIFgZwUIQlEDEo7EQBRuJKNiYSsFSsDJaeRTf7zvLbvb4drObqH/xNNmZ93symWsj + UqkU6RkeHiYhxH9B72ERA1NTU2zH3+T29tbgwIqdnp7KxvPzgoh+j89PQUVFgmZnZy0OrBg4OzuTcuEw + H5orT0/KSE1OTrL1bcXAxcWF7Hxzw4fnAnILCwvZusBRDAQCARny9sYXyIbVVWcpkFEMBINBKijgi3hl + eVkZrYeHB7aWiisxdb5VVvLF3ILFhJyRkRG2jh5XYiAej8vQtTW+qBuqqwUNDQ2x+WZci4GlpSUpt7nJ + F7bj40NQcbGg/v5+NpfDkxhoaGiQcqkUL8GB9kofPpPDsxioqKiQhd7feRE9h4eC8vPz6erqSuu/sbFB + VVVVEp/Pp4mD7u5u2SYrsUQiIUP8fl5GZXtbKZZMJi0ZJycn37t+kZRWpe7u7rTnWYmBo6MjGeY03/C8 + tbVV6zM3N0dtbW2aiMri4qL8svr8rMWAWiQWs0oFg4La29tpfHycxsbGDCItLS20srIin4XDYTY7JzFQ + X18vix0cpKUCAeOIgNHRUZqentb6mUfITM5ioLa2lpqarDJYJJ2dnWyfTGQthvsTMMuocH284Flsd3eX + SktLKS8vzyLz/CyorOwPxSYmJqirq8sigom7t7cnf8re3vQcwzN8xmW5xVZsZmZGHracTCQS0dph8vf0 + pKUAFgLa4pk+0wsGMezIjY2NFpm+vj65tPVtQU1NDYVCRikVbCHou7W1ZennBoOYuvQBNkanm8Dx8bFs + hyOHEwN1dUoWNmMuwwmDWHNzM0WjUUMDDvV+lkjwQnpwbPn9fnp8fGSz7HA1+fXEYjEplUzyImZw0KM9 + 9jQuzw7PYpiD5eWCvr54EY54XJHDlYnL5PAk1tHR8T0P+eKZiEYVOYw4l23GtRjOOgRzRd0yMKDI7e/v + szX0uBI7Pz+XgevrfEEv4IUGWVwdPRnF7u/vZdDODl8oG3w+XIuCbD0VR7HLy0t5JuqvND/B66syaniZ + 5uoCR7FQKCQDXl74ArkQiSjvAtfX12xtW7HBwUEqKfG2LXgFf9jgi2PDNtdnxRYWFmQHnHe/jd1isIip + b0B/Df4sTHuk6B/rrIep2LXHGgAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACYAAAAeCAYAAABAFGxuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAIGSURBVFhH7de/SwJhGAfwtwJpUlBwaVIEcXDVxcUxQaS1 + QdLVwTnQv0AcGgUdo9U1dNAWHVwiEQKFaAkCwZqq5el53rvT03v8cXqeDQ0fjXu97/PFO+w9MZlMYFO1 + Wg2EEJbg8vX+iy3i8vW2KHaEznbkgm63C6PRiJ1DtijmQLCjMRLg8/mgUqmwsw5UTEN5UfD7/ZDL5eZm + mSqWz+cxyMpimhZS7r12uy1n4d/GG3O5Y8QFWyWCTpCcRy8lRK3XeUJcoJVGaFrsXj34V9hYrFrtQSj0 + wa4Z2VgsGh1Dq9WS79z6PBuLkUbjQZZLJN7Y9ZkVxYrFgQzZl3j83TBz5oDFms02uN3fhrmKAxbzer8M + M2dWFNsH7R4Lh+mXnf+MwsZi6fSLLBUMfrLr82wsVio9ssd5NhYzZ1rsEhXVg4dA3ybN12CnSCQCRCkY + UP0gLmAfnpGQHfQM+zGlIO257hAXZLUMJJPJuQ6yx+KBfr+P/3CreAIVTOoC9uEK8Q8mS3ew5XIZYrEY + nuhCN2qQlQZIQL1eZ+ev3VoHAgFwOOjSXqNXNXRXSqlOp8POJBvt+Xu9ngwS4lQN3oVy+egJybLHt2w2 + K0OFOFeHmJFByn5+2eXTM1WMDIdD8Hg8coAQtyquCKGfHVq/kOekUik2k2O6mKZQKOBAKrea0+nE7Y2b + zVhuAr/Ce2bVcGWw1gAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACYAAAAeCAYAAABAFGxuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAIGSURBVFhH7de/SwJhGAfwtwJpUlBwaVIEcXDVxcUxQaS1 + QdLVwTnQv0AcGgUdo9U1dNAWHVwiEQKFaAkCwZqq5el53rvT03v8cXqeDQ0fjXu97/PFO+w9MZlMYFO1 + Wg2EEJbg8vX+iy3i8vW2KHaEznbkgm63C6PRiJ1DtijmQLCjMRLg8/mgUqmwsw5UTEN5UfD7/ZDL5eZm + mSqWz+cxyMpimhZS7r12uy1n4d/GG3O5Y8QFWyWCTpCcRy8lRK3XeUJcoJVGaFrsXj34V9hYrFrtQSj0 + wa4Z2VgsGh1Dq9WS79z6PBuLkUbjQZZLJN7Y9ZkVxYrFgQzZl3j83TBz5oDFms02uN3fhrmKAxbzer8M + M2dWFNsH7R4Lh+mXnf+MwsZi6fSLLBUMfrLr82wsVio9ssd5NhYzZ1rsEhXVg4dA3ybN12CnSCQCRCkY + UP0gLmAfnpGQHfQM+zGlIO257hAXZLUMJJPJuQ6yx+KBfr+P/3CreAIVTOoC9uEK8Q8mS3ew5XIZYrEY + nuhCN2qQlQZIQL1eZ+ev3VoHAgFwOOjSXqNXNXRXSqlOp8POJBvt+Xu9ngwS4lQN3oVy+egJybLHt2w2 + K0OFOFeHmJFByn5+2eXTM1WMDIdD8Hg8coAQtyquCKGfHVq/kOekUik2k2O6mKZQKOBAKrea0+nE7Y2b + zVhuAr/Ce2bVcGWw1gAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACYAAAAeCAYAAABAFGxuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAIGSURBVFhH7de/SwJhGAfwtwJpUlBwaVIEcXDVxcUxQaS1 + QdLVwTnQv0AcGgUdo9U1dNAWHVwiEQKFaAkCwZqq5el53rvT03v8cXqeDQ0fjXu97/PFO+w9MZlMYFO1 + Wg2EEJbg8vX+iy3i8vW2KHaEznbkgm63C6PRiJ1DtijmQLCjMRLg8/mgUqmwsw5UTEN5UfD7/ZDL5eZm + mSqWz+cxyMpimhZS7r12uy1n4d/GG3O5Y8QFWyWCTpCcRy8lRK3XeUJcoJVGaFrsXj34V9hYrFrtQSj0 + wa4Z2VgsGh1Dq9WS79z6PBuLkUbjQZZLJN7Y9ZkVxYrFgQzZl3j83TBz5oDFms02uN3fhrmKAxbzer8M + M2dWFNsH7R4Lh+mXnf+MwsZi6fSLLBUMfrLr82wsVio9ssd5NhYzZ1rsEhXVg4dA3ybN12CnSCQCRCkY + UP0gLmAfnpGQHfQM+zGlIO257hAXZLUMJJPJuQ6yx+KBfr+P/3CreAIVTOoC9uEK8Q8mS3ew5XIZYrEY + nuhCN2qQlQZIQL1eZ+ev3VoHAgFwOOjSXqNXNXRXSqlOp8POJBvt+Xu9ngwS4lQN3oVy+egJybLHt2w2 + K0OFOFeHmJFByn5+2eXTM1WMDIdD8Hg8coAQtyquCKGfHVq/kOekUik2k2O6mKZQKOBAKrea0+nE7Y2b + zVhuAr/Ce2bVcGWw1gAAAABJRU5ErkJggg== + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Screens/ResultsTabPageCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/Screens/ResultsTabPageCtrl.Designer.cs new file mode 100644 index 00000000..f9813ec8 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Screens/ResultsTabPageCtrl.Designer.cs @@ -0,0 +1,148 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.Screens +{ + partial class ResultsTabPageCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.splitContainer = new System.Windows.Forms.SplitContainer(); + this.reloadPreviousResultsButton = new System.Windows.Forms.Button(); + this.columnWidthsButton = new System.Windows.Forms.Button(); + this.showPreviousResultsButton = new System.Windows.Forms.Button(); + this.configureButton = new System.Windows.Forms.Button(); + this.flowLayoutPanel = new System.Windows.Forms.FlowLayoutPanel(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit(); + this.splitContainer.Panel1.SuspendLayout(); + this.splitContainer.Panel2.SuspendLayout(); + this.splitContainer.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer + // + this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer.IsSplitterFixed = true; + this.splitContainer.Location = new System.Drawing.Point(0, 0); + this.splitContainer.Name = "splitContainer"; + this.splitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer.Panel1 + // + this.splitContainer.Panel1.BackColor = System.Drawing.SystemColors.Control; + this.splitContainer.Panel1.Controls.Add(this.reloadPreviousResultsButton); + this.splitContainer.Panel1.Controls.Add(this.columnWidthsButton); + this.splitContainer.Panel1.Controls.Add(this.showPreviousResultsButton); + this.splitContainer.Panel1.Controls.Add(this.configureButton); + // + // splitContainer.Panel2 + // + this.splitContainer.Panel2.Controls.Add(this.flowLayoutPanel); + this.splitContainer.Size = new System.Drawing.Size(1057, 706); + this.splitContainer.SplitterDistance = 42; + this.splitContainer.TabIndex = 0; + // + // reloadPreviousResultsButton + // + this.reloadPreviousResultsButton.Enabled = false; + this.reloadPreviousResultsButton.Location = new System.Drawing.Point(405, 10); + this.reloadPreviousResultsButton.Name = "reloadPreviousResultsButton"; + this.reloadPreviousResultsButton.Size = new System.Drawing.Size(147, 30); + this.reloadPreviousResultsButton.TabIndex = 3; + this.reloadPreviousResultsButton.Text = "Reload previous results"; + this.reloadPreviousResultsButton.UseVisualStyleBackColor = true; + this.reloadPreviousResultsButton.Click += new System.EventHandler(this.reloadPreviousResultsButton_Click); + // + // columnWidthsButton + // + this.columnWidthsButton.Location = new System.Drawing.Point(126, 10); + this.columnWidthsButton.Name = "columnWidthsButton"; + this.columnWidthsButton.Size = new System.Drawing.Size(120, 30); + this.columnWidthsButton.TabIndex = 1; + this.columnWidthsButton.Text = "Save column widths"; + this.columnWidthsButton.UseVisualStyleBackColor = true; + this.columnWidthsButton.Click += new System.EventHandler(this.columnWidthsButton_Click); + // + // showPreviousResultsButton + // + this.showPreviousResultsButton.Location = new System.Drawing.Point(252, 10); + this.showPreviousResultsButton.Name = "showPreviousResultsButton"; + this.showPreviousResultsButton.Size = new System.Drawing.Size(147, 30); + this.showPreviousResultsButton.TabIndex = 2; + this.showPreviousResultsButton.Text = "Show previous results"; + this.showPreviousResultsButton.UseVisualStyleBackColor = true; + this.showPreviousResultsButton.Click += new System.EventHandler(this.showPreviousResultsButton_Click); + // + // configureButton + // + this.configureButton.Location = new System.Drawing.Point(20, 10); + this.configureButton.Name = "configureButton"; + this.configureButton.Size = new System.Drawing.Size(100, 30); + this.configureButton.TabIndex = 0; + this.configureButton.Text = "Configure"; + this.configureButton.UseVisualStyleBackColor = true; + this.configureButton.Click += new System.EventHandler(this.configureButton_Click); + // + // flowLayoutPanel + // + this.flowLayoutPanel.AutoScroll = true; + this.flowLayoutPanel.BackColor = System.Drawing.SystemColors.Control; + this.flowLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.flowLayoutPanel.Location = new System.Drawing.Point(0, 0); + this.flowLayoutPanel.Name = "flowLayoutPanel"; + this.flowLayoutPanel.Size = new System.Drawing.Size(1057, 660); + this.flowLayoutPanel.TabIndex = 0; + // + // ResultsTabPageCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Silver; + this.Controls.Add(this.splitContainer); + this.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.Name = "ResultsTabPageCtrl"; + this.Size = new System.Drawing.Size(1057, 706); + this.Load += new System.EventHandler(this.ResultsTabPageCtrl_Load); + this.splitContainer.Panel1.ResumeLayout(false); + this.splitContainer.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit(); + this.splitContainer.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer splitContainer; + private System.Windows.Forms.Button configureButton; + private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel; + private System.Windows.Forms.Button columnWidthsButton; + private System.Windows.Forms.Button showPreviousResultsButton; + private System.Windows.Forms.Button reloadPreviousResultsButton; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Screens/ResultsTabPageCtrl.cs b/TBF_V2/Sources/TBF/TBF/Screens/ResultsTabPageCtrl.cs new file mode 100644 index 00000000..c4c3e4a6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Screens/ResultsTabPageCtrl.cs @@ -0,0 +1,463 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using log4net; +using Config; +using Config.Entities; +using TBF.Resources; +using TBF.UiBridge; + +namespace TBF.Screens +{ + public partial class ResultsTabPageCtrl : UserControl + { + static readonly ILog log = LogManager.GetLogger(typeof(ResultsTabPageCtrl)); + + public MetersArrangement MetersArrangement; + public TestsArrangement TestsArrangement; + public int NrMetersInOneGroup; + + public IList RsltItems_Screen_SingleWM; + public IList RsltItems_Screen_CombinedWM; + public IList RsltItems_Screen_HeatM; + + MetersKind metersKind; + ListView firstListView; + + int lvWidth; + int lvHeight; + + /// + /// Constructor + /// + public ResultsTabPageCtrl() + { + InitializeComponent(); + +#if MUNICH + reloadPreviousResultsButton.Visible = false; +#endif + + if (Program.LocalSettings != null) + { + MetersArrangement = Program.LocalSettings.ResultsConfigMeters; + TestsArrangement = Program.LocalSettings.ResultsConfigTests; + NrMetersInOneGroup = Math.Max(1, Program.LocalSettings.ResultsConfigMetersInOneGroup); + RsltItems_Screen_SingleWM = Results.WMeterRsltItemSpec.FromStrArray(Program.LocalSettings.RsltItems_Screen_SingleWM); + RsltItems_Screen_CombinedWM = Results.WMeterRsltItemSpec.FromStrArray(Program.LocalSettings.RsltItems_Screen_CombinedWM); + RsltItems_Screen_HeatM = Results.WMeterRsltItemSpec.FromStrArray(Program.LocalSettings.RsltItems_Screen_HeatM); + } + + Bridge.ProcedureSelectedHandler += delegate(object sender, ProcedureSelectedEventArgs args) + { + if (InvokeRequired) + Invoke(new EventHandler(OnProcedureSelected), sender, args); + else + OnProcedureSelected(sender, args); + }; + + Bridge.TestCompletedHandler += delegate(object sender, TestCompletedEventArgs args) + { + if (InvokeRequired) + Invoke(new EventHandler(OnTestCompleted), sender, args); + else + OnTestCompleted(sender, args); + }; + + Bridge.ButtonsEtcHandler += delegate(object sndr, ButtonsEtcEventArgs args) + { + if (InvokeRequired) + Invoke(new EventHandler(OnButtonsEtc), sndr, args); + else + OnButtonsEtc(sndr, args); + }; + } + + void OnProcedureSelected(object sender, ProcedureSelectedEventArgs args) + { + RedrawAll(TBF.BenchControl.Sequences.ProcessData.BatchRslts); + } + + void OnTestCompleted(object sender, TestCompletedEventArgs args) + { + RedrawAll(TBF.BenchControl.Sequences.ProcessData.BatchRslts); + } + + void OnButtonsEtc(object sender, UiBridge.ButtonsEtcEventArgs args) + { + reloadPreviousResultsButton.Enabled = ((args.Flags & UiBridge.ButtonsEtc.ProcedureCmbBoxEn) != 0); + } + + private void ResultsTabPageCtrl_Load(object sender, EventArgs e) + { + // Localization + configureButton.Text = Strings.Configure; + columnWidthsButton.Text = Strings.Save_column_widths; + showPreviousResultsButton.Text = Strings.Previous_results; + + RedrawAll(TBF.BenchControl.Sequences.ProcessData.BatchRslts); + } + + + IList GetRsltItems(MetersKind metersKind) + { + IList srcItems; + switch (metersKind) + { + default: + case MetersKind.Single: srcItems = RsltItems_Screen_SingleWM; break; + case MetersKind.Combined: srcItems = RsltItems_Screen_CombinedWM; break; + case MetersKind.HeatMeter: srcItems = RsltItems_Screen_HeatM; break; + } + + IList copiedItems = new List(); + if (srcItems != null) + { + foreach (var it in srcItems) copiedItems.Add(it.Clone()); + } + return copiedItems; + } + + + /// + /// Invoke a configuration dialog + /// + private void configureButton_Click(object sender, EventArgs e) + { + TBF.Forms.ResultsArrangementDlg dlg = new TBF.Forms.ResultsArrangementDlg(); + + dlg.MetersKind = metersKind; + dlg.TestsArrangement = TestsArrangement; + dlg.MetersArrangement = MetersArrangement; + dlg.NrMetersInOneGroup = NrMetersInOneGroup; + dlg.SelectedItems = GetRsltItems(metersKind); + + DialogResult dr = dlg.ShowDialog(); + if (dr == DialogResult.OK && dlg.Unlocked) + { + Program.LocalSettings.ResultsConfigMeters = MetersArrangement = dlg.MetersArrangement;; + Program.LocalSettings.ResultsConfigTests = TestsArrangement = dlg.TestsArrangement; + Program.LocalSettings.ResultsConfigMetersInOneGroup = NrMetersInOneGroup = dlg.NrMetersInOneGroup; + + switch (metersKind) + { + default: + case MetersKind.Single: + RsltItems_Screen_SingleWM = dlg.SelectedItems; + Program.LocalSettings.RsltItems_Screen_SingleWM = Results.WMeterRsltItemSpec.ToStrArray(RsltItems_Screen_SingleWM); + break; + case MetersKind.Combined: + RsltItems_Screen_CombinedWM = dlg.SelectedItems; + Program.LocalSettings.RsltItems_Screen_CombinedWM = Results.WMeterRsltItemSpec.ToStrArray(RsltItems_Screen_CombinedWM); + break; + case MetersKind.HeatMeter: + RsltItems_Screen_HeatM = dlg.SelectedItems; + Program.LocalSettings.RsltItems_Screen_HeatM = Results.WMeterRsltItemSpec.ToStrArray(RsltItems_Screen_HeatM); + break; + } + + Program.LocalSettings.Save(); + } + + RedrawAll(TBF.BenchControl.Sequences.ProcessData.BatchRslts); + } + + /// + /// Clear the results + /// + private void showPreviousResultsButton_Click(object sender, EventArgs e) + { + new TBF.Forms.PreviousResultsDlg().ShowDialog(); + } + + private void reloadPreviousResultsButton_Click(object sender, EventArgs e) + { + new TBF.Forms.PreviousResultsDlg(true).ShowDialog(); + } + + #region Redraw + + /// + /// Re-draw the results. Apply new settings if they changed. + /// + void RedrawAll(Results.BatchResults results) + { + this.SuspendLayout(); + + if (results == null) + { + flowLayoutPanel.Controls.Clear(); + ResumeLayout(false); + return; + } + + try + { + /// Determine how many water meters were enabled for result evaluation and printing + int enabledWMsCount = 0; + for (int i = 0; i < results.WMPositionsCount; i++) + { + if (results.WaterMeters[i] != null && !results.WaterMeters[i].Disabled) + { + enabledWMsCount++; + } + } + + int metersInOneGroup = Math.Max(1, Math.Min(enabledWMsCount, NrMetersInOneGroup)); + int nrGroups = Math.Max(1, (enabledWMsCount + metersInOneGroup - 1) / metersInOneGroup); + + if (MetersArrangement == MetersArrangement.Horizontally) + { + flowLayoutPanel.FlowDirection = FlowDirection.LeftToRight; + lvWidth = flowLayoutPanel.Width / metersInOneGroup - 6; + lvHeight = flowLayoutPanel.Height / nrGroups - 6; + } + else + { + flowLayoutPanel.FlowDirection = FlowDirection.TopDown; + lvWidth = flowLayoutPanel.Width / nrGroups - 6; + lvHeight = flowLayoutPanel.Height / metersInOneGroup - 6; + } + flowLayoutPanel.Controls.Clear(); + flowLayoutPanel.WrapContents = true; + flowLayoutPanel.AutoScroll = true; + + bool first = true; + for (int i = 0; i < results.WMPositionsCount; i++) + { + if (results.WaterMeters[i] != null && !results.WaterMeters[i].Disabled) + { + ListView lview = (TestsArrangement == TestsArrangement.Rows) + ? GetResultsTestsAreRows(results.WaterMeters[i], i + 1) + : GetResultsTestsAreColumns(results.WaterMeters[i], i + 1); + if (lview != null) + { + flowLayoutPanel.Controls.Add(lview); + if (first) + { + firstListView = lview; + first = false; + } + } + } + } + } + catch (Exception e) + { + log.FatalFormat("Redrawing results failed : {0}", e.Message); + if (e.InnerException != null) + { + log.FatalFormat("InnerMessage : {0}", e.InnerException.Message); + } + log.FatalFormat("StackTrace : {0}{1}", Environment.NewLine, e.StackTrace); + } + + this.ResumeLayout(false); + } + + /// + /// Get an empty ListView control with appropriate parameters. + /// + /// ListView control + ListView GetListView(Color backColor) + { + ListView lview = new ListView(); + lview.AllowColumnReorder = false; + lview.Dock = System.Windows.Forms.DockStyle.None; + lview.FullRowSelect = true; + lview.GridLines = true; + lview.Location = new System.Drawing.Point(0, 0); + lview.Size = new System.Drawing.Size(lvWidth, lvHeight); + lview.TabIndex = 0; + lview.UseCompatibleStateImageBehavior = false; + lview.View = System.Windows.Forms.View.Details; + lview.BackColor = backColor; + return lview; + } + + + /// + /// Get decorated test names for a specified watermeter + /// + /// Watermeter results entity + /// A list of strings + IList GetAllDecoratedTestNames(Results.Entities.WaterMeter wMtr) + { + IList testNames = new List(); + + foreach (var mtr in wMtr.MeterTestRslts) + { + if ((mtr.CompoundMeterId == (byte)CompoundMeterId.Single || mtr.CompoundMeterId == (byte)CompoundMeterId.Compound || mtr.CompoundMeterId == (byte)CompoundMeterId.HeatMeterEnergy) + && mtr.TestDone + && (mtr.Publish() != Config.Entities.Publish.Never) + && (mtr.Publish() != Config.Entities.Publish.Internal)) + { + testNames.Add(mtr.Name()); + } + } + + return testNames; + } + + + /// + /// Get a ListView control filled with results of the meter 'mtr' + /// + /// Water meter number (1-based): 1 .. Config.Data.WMsCount + /// ListView object + ListView GetResultsTestsAreRows(Results.Entities.WaterMeter wMtr, int printedWMNr) + { + metersKind = wMtr.Compound() ? MetersKind.Combined : (wMtr.HeatMeter() ? MetersKind.HeatMeter : MetersKind.Single); + Color commonBackColor = wMtr.PassedFromTests() ? Color.LightGreen : (wMtr.CompletedFromTests() ? Color.LightPink : Color.White); + ListView lview = GetListView(commonBackColor); + + IList items = GetRsltItems(metersKind); + + if (items == null || items.Count == 0) return lview; + + // Header + TBF.LocalSettings ls = Program.LocalSettings; + lview.Columns.Add(printedWMNr.ToString(), (ls.RsltsClmnCount > 0) ? ls.RsltsClmnWidths[0] : 40); + int col = 1; + foreach (var item in items) + { + lview.Columns.Add(item.Caption, (ls.RsltsClmnCount > col) ? ls.RsltsClmnWidths[col] : 70); + col++; + } + + + IList testNames = GetAllDecoratedTestNames(wMtr); + int ix = 0; + foreach (var mtr in wMtr.MeterTestRslts) + { + if (mtr != null && + (mtr.CompoundMeterId == (byte)CompoundMeterId.Single || + mtr.CompoundMeterId == (byte)CompoundMeterId.Compound || + mtr.CompoundMeterId == (byte)CompoundMeterId.HeatMeterEnergy) && + mtr.TestDone && + mtr.Publish() != Config.Entities.Publish.Never && + mtr.Publish() != Config.Entities.Publish.Internal) + { + ListViewItem lvi = new ListViewItem(testNames[ix++]); + + for (int i = 0; i < items.Count; i++) + { + string str = items[i].Print(wMtr, mtr.Name()); + + /// Extract and use color information + string[] texts = str.Split(new char[] { '|' }); + if (texts.Length == 1) + { + lvi.SubItems.Add(str); + } + else if (texts.Length == 2) + { + Color color = texts[1].Equals("Green") ? Color.Green : (texts[1].Equals("Red") ? Color.Red : commonBackColor); + lvi.UseItemStyleForSubItems = false; + lvi.SubItems.Add(texts[0]); + lvi.SubItems[lvi.SubItems.Count - 1].BackColor = color; + } + else + { + lvi.SubItems.Add(string.Empty); + } + } + + lview.Items.Add(lvi); + } + } + + return lview; + } + + + /// + /// Get a ListView control filled with results of the meter 'mtr' + /// + /// Water meter number (1-based): 1 .. Config.Data.WMsCount + /// ListView object + ListView GetResultsTestsAreColumns(Results.Entities.WaterMeter wMtr, int printedWMNr) + { + metersKind = wMtr.Compound() ? MetersKind.Combined : (wMtr.HeatMeter() ? MetersKind.HeatMeter : MetersKind.Single); + Color commonBackColor = wMtr.PassedFromTests() ? Color.LightGreen : (wMtr.CompletedFromTests() ? Color.LightPink : Color.White); + ListView lview = GetListView(commonBackColor); + + IList items = GetRsltItems(metersKind); + + if (items == null || items.Count == 0) return lview; + + // Header + TBF.LocalSettings ls = Program.LocalSettings; + lview.Columns.Add(printedWMNr.ToString(), (ls.RsltsClmnCount > 0) ? ls.RsltsClmnWidths[0] : 40); + int i = 1; + foreach (var str in GetAllDecoratedTestNames(wMtr)) + { + lview.Columns.Add(str, (ls.RsltsClmnCount > i) ? ls.RsltsClmnWidths[i] : 70); + i++; + } + + foreach (var item in items) + { + ListViewItem lvi = new ListViewItem(item.Caption); + + foreach (var mtr in wMtr.MeterTestRslts) + { + if (mtr != null && + (mtr.CompoundMeterId == (byte)CompoundMeterId.Single || + mtr.CompoundMeterId == (byte)CompoundMeterId.Compound || + mtr.CompoundMeterId == (byte)CompoundMeterId.HeatMeterEnergy) && + mtr.TestDone && + mtr.Publish() != Config.Entities.Publish.Never && + mtr.Publish() != Config.Entities.Publish.Internal) + { + string str = item.Print(wMtr, mtr.Name()); + + string[] texts = str.Split(new char[] { '|' }); + if (texts.Length == 1) + { + lvi.SubItems.Add(str); + } + else if (texts.Length == 2) + { + Color color = texts[1].Equals("Green") ? Color.Green : (texts[1].Equals("Red") ? Color.Red : commonBackColor); + lvi.UseItemStyleForSubItems = false; + lvi.SubItems.Add(texts[0]); + lvi.SubItems[lvi.SubItems.Count - 1].BackColor = color; + } + else + { + lvi.SubItems.Add(string.Empty); + } + } + } + + lview.Items.Add(lvi); + } + + return lview; + } + + #endregion + + private void columnWidthsButton_Click(object sender, EventArgs e) + { + if (firstListView == null) return; + + /// Update the column widths + Program.LocalSettings.RsltsClmnWidths = new int[firstListView.Columns.Count]; + for (int i = 0; i < firstListView.Columns.Count; i++) + { + Program.LocalSettings.RsltsClmnWidths[i] = firstListView.Columns[i].Width; + } + Program.LocalSettings.Save(); + + RedrawAll(TBF.BenchControl.Sequences.ProcessData.BatchRslts); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Screens/ResultsTabPageCtrl.resx b/TBF_V2/Sources/TBF/TBF/Screens/ResultsTabPageCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Screens/ResultsTabPageCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/SelectComponentClassDlg.Designer.cs b/TBF_V2/Sources/TBF/TBF/SelectComponentClassDlg.Designer.cs new file mode 100644 index 00000000..f6804b1d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/SelectComponentClassDlg.Designer.cs @@ -0,0 +1,99 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF +{ + partial class SelectComponentClassDlg + { + /// + /// 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(SelectComponentClassDlg)); + this.availCmpntsLstBox = new System.Windows.Forms.ListBox(); + this.availableComponentsLabel = new System.Windows.Forms.Label(); + this.cancelButton = new System.Windows.Forms.Button(); + this.okButton = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // availCmpntsLstBox + // + this.availCmpntsLstBox.FormattingEnabled = true; + resources.ApplyResources(this.availCmpntsLstBox, "availCmpntsLstBox"); + this.availCmpntsLstBox.Name = "availCmpntsLstBox"; + this.availCmpntsLstBox.DoubleClick += new System.EventHandler(this.availCmpntsLstBox_DoubleClick); + this.availCmpntsLstBox.MouseUp += new System.Windows.Forms.MouseEventHandler(this.availCmpntsLstBox_MouseUp); + // + // availableComponentsLabel + // + resources.ApplyResources(this.availableComponentsLabel, "availableComponentsLabel"); + this.availableComponentsLabel.ImageKey = global::TBF.Resources.Strings.Closing_the_tank; + this.availableComponentsLabel.Name = "availableComponentsLabel"; + // + // cancelButton + // + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cancelButton.ImageKey = global::TBF.Resources.Strings.Closing_the_tank; + resources.ApplyResources(this.cancelButton, "cancelButton"); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.UseVisualStyleBackColor = true; + this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click); + // + // okButton + // + this.okButton.ImageKey = global::TBF.Resources.Strings.Closing_the_tank; + resources.ApplyResources(this.okButton, "okButton"); + this.okButton.Name = "okButton"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // SelectComponentClassDlg + // + this.AcceptButton = this.okButton; + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cancelButton; + this.Controls.Add(this.cancelButton); + this.Controls.Add(this.okButton); + this.Controls.Add(this.availableComponentsLabel); + this.Controls.Add(this.availCmpntsLstBox); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "SelectComponentClassDlg"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Load += new System.EventHandler(this.SelectComponentClassDlg_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ListBox availCmpntsLstBox; + private System.Windows.Forms.Label availableComponentsLabel; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.Button okButton; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/SelectComponentClassDlg.cs b/TBF_V2/Sources/TBF/TBF/SelectComponentClassDlg.cs new file mode 100644 index 00000000..b8b6ba8d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/SelectComponentClassDlg.cs @@ -0,0 +1,100 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF +{ + public partial class SelectComponentClassDlg : Form + { + /// This is the main result of this dialog + public IComponentFactory SlctdCmpntFactory = null; + public string SelectedScriptName = null; /// Filled with a script file name after a right-click + + int selectedIndex = -1; + + /// Constructor + public SelectComponentClassDlg() + { + InitializeComponent(); + + foreach (var componentFactory in BenchControl.TbfComponents.Factories) + { + availCmpntsLstBox.Items.Add(componentFactory.ClassName); + } + } + + /// Load components from BenchControl.SupportedComponents + private void SelectComponentClassDlg_Load(object sender, EventArgs e) + { + Localize(); + + if (selectedIndex >= 0 && selectedIndex < BenchControl.TbfComponents.Factories.Count) + { + availCmpntsLstBox.SelectedIndex = selectedIndex; + } + } + + void Localize() + { + Text = Strings.Select_Component; + availableComponentsLabel.Text = Strings.Available_Components_; + okButton.Text = Strings.OkBtnText; + cancelButton.Text = Strings.CancelBtnText; + } + + /// Double click - Add the clicked component + private void availCmpntsLstBox_DoubleClick(object sender, EventArgs e) + { + okButton_Click(sender, e); + } + + /// OK - Add the selected component + private void okButton_Click(object sender, EventArgs e) + { + int ix = availCmpntsLstBox.SelectedIndex; + if (ix >= 0 && ix < BenchControl.TbfComponents.Factories.Count) + { + selectedIndex = ix; + SlctdCmpntFactory = BenchControl.TbfComponents.Factories[ix]; + DialogResult = DialogResult.OK; + Close(); + return; + } + } + + /// Cancel - Do nothing + private void cancelButton_Click(object sender, EventArgs e) + { + SlctdCmpntFactory = null; + DialogResult = DialogResult.Cancel; + Close(); + return; + } + + private void availCmpntsLstBox_MouseUp(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Right) + { + int index = availCmpntsLstBox.IndexFromPoint(e.Location); + if (index >= 0 && index < BenchControl.TbfComponents.Factories.Count) + { + selectedIndex = index; + SlctdCmpntFactory = BenchControl.TbfComponents.Factories[index]; + + OpenFileDialog dlg = new OpenFileDialog(); + if (dlg.ShowDialog() == DialogResult.OK) + { + SelectedScriptName = dlg.FileName; + } + DialogResult = DialogResult.OK; + Close(); + return; + } + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/SelectComponentClassDlg.pl.resx b/TBF_V2/Sources/TBF/TBF/SelectComponentClassDlg.pl.resx new file mode 100644 index 00000000..7e007f6f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/SelectComponentClassDlg.pl.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Dostępne elementy: + + + &Anuluj + + + &OK + + + Wybór elementu + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/SelectComponentClassDlg.resx b/TBF_V2/Sources/TBF/TBF/SelectComponentClassDlg.resx new file mode 100644 index 00000000..a3c7f582 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/SelectComponentClassDlg.resx @@ -0,0 +1,240 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + 12, 34 + + + 288, 264 + + + + 0 + + + availCmpntsLstBox + + + System.Windows.Forms.ListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + True + + + 9, 9 + + + 115, 13 + + + 1 + + + Available Components: + + + availableComponentsLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + 200, 310 + + + 99, 25 + + + 8 + + + &Cancel + + + cancelButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + 95, 310 + + + 99, 25 + + + 7 + + + &OK + + + okButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + True + + + 6, 13 + + + 311, 347 + + + + CenterParent + + + Select Component + + + SelectComponentClassDlg + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/SelectComponentClassDlg.ru.resx b/TBF_V2/Sources/TBF/TBF/SelectComponentClassDlg.ru.resx new file mode 100644 index 00000000..4c45f487 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/SelectComponentClassDlg.ru.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Доступные компоненты: + + + &Отмена + + + &OK + + + Выбрать компонент + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Strings.Designer.cs b/TBF_V2/Sources/TBF/TBF/Strings.Designer.cs new file mode 100644 index 00000000..3215c3c4 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Strings.Designer.cs @@ -0,0 +1,3159 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.34209 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Config.Resources { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Strings { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Strings() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("TBF.Resources.Strings", typeof(Strings).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to <none>. + /// + internal static string _none_ { + get { + return ResourceManager.GetString("_none_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to (offline). + /// + internal static string _offline { + get { + return ResourceManager.GetString("_offline", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to About Test Bench Framework. + /// + internal static string About_Test_Bench_Framework { + get { + return ResourceManager.GetString("About_Test_Bench_Framework", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Activity. + /// + internal static string Activity { + get { + return ResourceManager.GetString("Activity", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to &Add >. + /// + internal static string Add { + get { + return ResourceManager.GetString("Add", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add. + /// + internal static string AddBtnText { + get { + return ResourceManager.GetString("AddBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Address. + /// + internal static string Address { + get { + return ResourceManager.GetString("Address", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Adjustment in progress. + /// + internal static string Adjustment_in_progress { + get { + return ResourceManager.GetString("Adjustment_in_progress", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Administrator. + /// + internal static string Administrator { + get { + return ResourceManager.GetString("Administrator", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ambient humidity: . + /// + internal static string Ambient_humidity_ { + get { + return ResourceManager.GetString("Ambient_humidity_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ambient pressure: . + /// + internal static string Ambient_pressure_ { + get { + return ResourceManager.GetString("Ambient_pressure_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ambient temperature: . + /// + internal static string Ambient_temperature_ { + get { + return ResourceManager.GetString("Ambient_temperature_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to An unhandled error occured. + /// + internal static string An_unhandled_error_occured { + get { + return ResourceManager.GetString("An_unhandled_error_occured", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Approval: . + /// + internal static string Approval_ { + get { + return ResourceManager.GetString("Approval_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Approval date. + /// + internal static string Approval_date { + get { + return ResourceManager.GetString("Approval_date", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Approval ID. + /// + internal static string Approval_ID { + get { + return ResourceManager.GetString("Approval_ID", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Approval info.. + /// + internal static string Approval_info { + get { + return ResourceManager.GetString("Approval_info", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Approved by. + /// + internal static string Approved_by { + get { + return ResourceManager.GetString("Approved_by", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Arrangements of tested meters. + /// + internal static string Arrangement_of_meters { + get { + return ResourceManager.GetString("Arrangement_of_meters", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Arrangement of tests. + /// + internal static string Arrangement_of_tests { + get { + return ResourceManager.GetString("Arrangement_of_tests", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to @temperature [degC]. + /// + internal static string AtTemperature_C { + get { + return ResourceManager.GetString("AtTemperature_C", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Aux:. + /// + internal static string Aux_ { + get { + return ResourceManager.GetString("Aux_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Aux Water Meter. + /// + internal static string Aux_Water_Meter { + get { + return ResourceManager.GetString("Aux_Water_Meter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Aux. WM State. + /// + internal static string Aux_Water_Meter_State { + get { + return ResourceManager.GetString("Aux_Water_Meter_State", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Aux. WM Serial Nr.. + /// + internal static string Aux_WM_SerialNr { + get { + return ResourceManager.GetString("Aux_WM_SerialNr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Available Components:. + /// + internal static string Available_Components_ { + get { + return ResourceManager.GetString("Available_Components_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Available results:. + /// + internal static string Available_results { + get { + return ResourceManager.GetString("Available_results", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to < Back. + /// + internal static string BackBtnText { + get { + return ResourceManager.GetString("BackBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Balance. + /// + internal static string Balance { + get { + return ResourceManager.GetString("Balance", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Bench. + /// + internal static string Bench_chdr { + get { + return ResourceManager.GetString("Bench_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test bench is not running, however you can change the settings to resolve the problem.. + /// + internal static string Bench_is_not_running { + get { + return ResourceManager.GetString("Bench_is_not_running", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test bench name conflict, use another name please. + /// + internal static string Bench_name_conflict_Use_another_name_pls { + get { + return ResourceManager.GetString("Bench_name_conflict_Use_another_name_pls", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Bench parameters. + /// + internal static string Bench_parameters { + get { + return ResourceManager.GetString("Bench_parameters", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Build date _BUILD_DATE_. + /// + internal static string BuildDateStr { + get { + return ResourceManager.GetString("BuildDateStr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Calibration Specialist. + /// + internal static string Calibration_Specialist { + get { + return ResourceManager.GetString("Calibration_Specialist", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Camera error. + /// + internal static string Camera_error { + get { + return ResourceManager.GetString("Camera_error", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cancel. + /// + internal static string CancelBtnText { + get { + return ResourceManager.GetString("CancelBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Changes will be lost. Do you want to proceed?. + /// + internal static string Changes_will_be_lost_Do_you_want_to_proceed { + get { + return ResourceManager.GetString("Changes_will_be_lost_Do_you_want_to_proceed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Clear results. + /// + internal static string Clear_results { + get { + return ResourceManager.GetString("Clear_results", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Clear. + /// + internal static string ClearBtnText { + get { + return ResourceManager.GetString("ClearBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to close. + /// + internal static string close { + get { + return ResourceManager.GetString("close", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Close emptying valve. + /// + internal static string Close_emptying_valve { + get { + return ResourceManager.GetString("Close_emptying_valve", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Close. + /// + internal static string CloseBtnText { + get { + return ResourceManager.GetString("CloseBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Closing input valve, switching the pump off. + /// + internal static string Closing_valve_Pump_off { + get { + return ResourceManager.GetString("Closing_valve_Pump_off", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to cold. + /// + internal static string cold { + get { + return ResourceManager.GetString("cold", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Combined meters. + /// + internal static string Combined_meters { + get { + return ResourceManager.GetString("Combined_meters", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Combined. + /// + internal static string CombinedBtnText { + get { + return ResourceManager.GetString("CombinedBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Communication. + /// + internal static string Communication { + get { + return ResourceManager.GetString("Communication", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Component. + /// + internal static string Component { + get { + return ResourceManager.GetString("Component", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Configuration. + /// + internal static string Configuration { + get { + return ResourceManager.GetString("Configuration", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Configure. + /// + internal static string Configure { + get { + return ResourceManager.GetString("Configure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Configure test benches (password required). + /// + internal static string ConfigureDatabaseText { + get { + return ResourceManager.GetString("ConfigureDatabaseText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Confirmation. + /// + internal static string Confirmation { + get { + return ResourceManager.GetString("Confirmation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Connection string. + /// + internal static string Connection_string { + get { + return ResourceManager.GetString("Connection_string", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Copy. + /// + internal static string CopyBtnText { + get { + return ResourceManager.GetString("CopyBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Copyright © 2013 - {0}. + /// + internal static string CopyrightStr { + get { + return ResourceManager.GetString("CopyrightStr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Corrected. + /// + internal static string Corrected { + get { + return ResourceManager.GetString("Corrected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Correction [g]. + /// + internal static string Correction_g { + get { + return ResourceManager.GetString("Correction_g", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Correction [l/h]. + /// + internal static string Correction_lph { + get { + return ResourceManager.GetString("Correction_lph", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Correction [mbar]. + /// + internal static string Correction_mbar { + get { + return ResourceManager.GetString("Correction_mbar", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Create DB. + /// + internal static string Create_DB { + get { + return ResourceManager.GetString("Create_DB", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Data. + /// + internal static string Data { + get { + return ResourceManager.GetString("Data", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Database Settings. + /// + internal static string Database_Settings { + get { + return ResourceManager.GetString("Database_Settings", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Database type. + /// + internal static string Database_type { + get { + return ResourceManager.GetString("Database_type", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Date and time: . + /// + internal static string Date_and_time_ { + get { + return ResourceManager.GetString("Date_and_time_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The database was successfully created!. + /// + internal static string DB_was_successfully_created { + get { + return ResourceManager.GetString("DB_was_successfully_created", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The database will be overwritten. + /// + internal static string DB_will_be_overwritten { + get { + return ResourceManager.GetString("DB_will_be_overwritten", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Density. + /// + internal static string Density { + get { + return ResourceManager.GetString("Density", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Description. + /// + internal static string DescriptionColHdr { + get { + return ResourceManager.GetString("DescriptionColHdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Detection completed. + /// + internal static string Detection_completed { + get { + return ResourceManager.GetString("Detection_completed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Detection failed. + /// + internal static string Detection_failed { + get { + return ResourceManager.GetString("Detection_failed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Detection threshold [%]. + /// + internal static string DetectionThresholdPct { + get { + return ResourceManager.GetString("DetectionThresholdPct", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device. + /// + internal static string Device { + get { + return ResourceManager.GetString("Device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to dflt. + /// + internal static string dflt { + get { + return ResourceManager.GetString("dflt", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Diverter. + /// + internal static string Diverter { + get { + return ResourceManager.GetString("Diverter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Do you want to proceed?. + /// + internal static string Do_you_want_to_proceed { + get { + return ResourceManager.GetString("Do_you_want_to_proceed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Do you want to save the procedure?. + /// + internal static string Do_you_want_to_save_the_procedure { + get { + return ResourceManager.GetString("Do_you_want_to_save_the_procedure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Down. + /// + internal static string DownBtnText { + get { + return ResourceManager.GetString("DownBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Leak duration [s]. + /// + internal static string Duration_Leak_s { + get { + return ResourceManager.GetString("Duration_Leak_s", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PMax duration [s]. + /// + internal static string Duration_PMax_s { + get { + return ResourceManager.GetString("Duration_PMax_s", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Duration [s]. + /// + internal static string Duration_s { + get { + return ResourceManager.GetString("Duration_s", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Edit User. + /// + internal static string Edit_User { + get { + return ResourceManager.GetString("Edit_User", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Edit. + /// + internal static string EditBtnText { + get { + return ResourceManager.GetString("EditBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Emergency STOP. + /// + internal static string Emergency_STOP { + get { + return ResourceManager.GetString("Emergency_STOP", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Emptying. + /// + internal static string Emptying_chdr { + get { + return ResourceManager.GetString("Emptying_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Emptying ({0}: step {1}/{2}). + /// + internal static string Emptying_i_n { + get { + return ResourceManager.GetString("Emptying_i_n", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Emptying the tank. + /// + internal static string Emptying_tank { + get { + return ResourceManager.GetString("Emptying_tank", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Emptying valve. + /// + internal static string Emptying_valve { + get { + return ResourceManager.GetString("Emptying_valve", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to End. + /// + internal static string End { + get { + return ResourceManager.GetString("End", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to End condition. + /// + internal static string End_Condition { + get { + return ResourceManager.GetString("End_Condition", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to End State. + /// + internal static string End_State { + get { + return ResourceManager.GetString("End_State", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enter password. + /// + internal static string Enter_password { + get { + return ResourceManager.GetString("Enter_password", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Err. cor. - [%]. + /// + internal static string Err_cor_neg_pct_chdr { + get { + return ResourceManager.GetString("Err_cor_neg_pct_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Err. cor. +[%]. + /// + internal static string Err_cor_pos_pct_chdr { + get { + return ResourceManager.GetString("Err_cor_pos_pct_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Err. Limit - [%]. + /// + internal static string Err_limit_neg_pct_chdr { + get { + return ResourceManager.GetString("Err_limit_neg_pct_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Err. Limit + [%]. + /// + internal static string Err_limit_pos_pct_chdr { + get { + return ResourceManager.GetString("Err_limit_pos_pct_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error. + /// + internal static string Error { + get { + return ResourceManager.GetString("Error", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error loading users from the database:. + /// + internal static string Error_loading_users_from_the_database { + get { + return ResourceManager.GetString("Error_loading_users_from_the_database", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error [%]. + /// + internal static string Error_pct { + get { + return ResourceManager.GetString("Error_pct", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error while creating the database. Reason: . + /// + internal static string Error_while_creating_DB_Reason { + get { + return ResourceManager.GetString("Error_while_creating_DB_Reason", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Evaluate. + /// + internal static string Evaluate { + get { + return ResourceManager.GetString("Evaluate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exit. + /// + internal static string ExitBtnText { + get { + return ResourceManager.GetString("ExitBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to NOK. + /// + internal static string Failed { + get { + return ResourceManager.GetString("Failed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Failed to create a sample database:. + /// + internal static string Failed_to_create_a_sample_database { + get { + return ResourceManager.GetString("Failed_to_create_a_sample_database", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Failed to export the database:. + /// + internal static string Failed_to_export_the_database { + get { + return ResourceManager.GetString("Failed_to_export_the_database", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Feeding. + /// + internal static string Feeding_chdr { + get { + return ResourceManager.GetString("Feeding_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Fill the test bench with water?. + /// + internal static string Fill_with_water { + get { + return ResourceManager.GetString("Fill_with_water", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Finish. + /// + internal static string FinishBtnText { + get { + return ResourceManager.GetString("FinishBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Flow [m3/h]. + /// + internal static string Flow_m3h { + get { + return ResourceManager.GetString("Flow_m3h", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Flow Selection. + /// + internal static string Flow_selection { + get { + return ResourceManager.GetString("Flow_selection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Flowmeter. + /// + internal static string Flowmeter { + get { + return ResourceManager.GetString("Flowmeter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Get mass of water in the tank. + /// + internal static string Get_mass_of_water_in_the_tank { + get { + return ResourceManager.GetString("Get_mass_of_water_in_the_tank", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Groups. + /// + internal static string Groups { + get { + return ResourceManager.GetString("Groups", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Head of Lab. + /// + internal static string Head_of_Lab { + get { + return ResourceManager.GetString("Head_of_Lab", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Horizontally. + /// + internal static string Horizontally { + get { + return ResourceManager.GetString("Horizontally", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to hot. + /// + internal static string hot { + get { + return ResourceManager.GetString("hot", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ignore. + /// + internal static string Ignore { + get { + return ResourceManager.GetString("Ignore", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ignore. + /// + internal static string IgnoreBtnText { + get { + return ResourceManager.GetString("IgnoreBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid password. + /// + internal static string Invalid_password { + get { + return ResourceManager.GetString("Invalid_password", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid user, password, or bench. + /// + internal static string Invalid_user_password_or_bench { + get { + return ResourceManager.GetString("Invalid_user_password_or_bench", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid username or password. + /// + internal static string Invalid_username_or_password { + get { + return ResourceManager.GetString("Invalid_username_or_password", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to iPerl Communication in progress. + /// + internal static string iPerl_Communication_in_progress { + get { + return ResourceManager.GetString("iPerl_Communication_in_progress", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Language. + /// + internal static string Language { + get { + return ResourceManager.GetString("Language", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Less. + /// + internal static string LessBtnText { + get { + return ResourceManager.GetString("LessBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Loading the procedure. + /// + internal static string Loading_the_procedure { + get { + return ResourceManager.GetString("Loading_the_procedure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Lock. + /// + internal static string LockBtnText { + get { + return ResourceManager.GetString("LockBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Logging. + /// + internal static string Logging { + get { + return ResourceManager.GetString("Logging", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Main:. + /// + internal static string Main_ { + get { + return ResourceManager.GetString("Main_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Main Water Meter. + /// + internal static string Main_Water_Meter { + get { + return ResourceManager.GetString("Main_Water_Meter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Main WM State. + /// + internal static string Main_Water_Meter_State { + get { + return ResourceManager.GetString("Main_Water_Meter_State", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Main WM Serial Nr.. + /// + internal static string Main_WM_SerialNr { + get { + return ResourceManager.GetString("Main_WM_SerialNr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Maintenance Specialist. + /// + internal static string Maintenance_Specialist { + get { + return ResourceManager.GetString("Maintenance_Specialist", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Make tank empty. + /// + internal static string Make_tank_empty { + get { + return ResourceManager.GetString("Make_tank_empty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mass [kg]. + /// + internal static string Mass_kg { + get { + return ResourceManager.GetString("Mass_kg", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to (max. _X_ alphanumeric characters). + /// + internal static string MaxChars { + get { + return ResourceManager.GetString("MaxChars", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Measure the mass. + /// + internal static string Measure_the_mass { + get { + return ResourceManager.GetString("Measure_the_mass", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Measured. + /// + internal static string Measured { + get { + return ResourceManager.GetString("Measured", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Measuring the weight. + /// + internal static string Measuring_the_weight { + get { + return ResourceManager.GetString("Measuring_the_weight", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Message. + /// + internal static string Message { + get { + return ResourceManager.GetString("Message", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test method. + /// + internal static string Method_chdr { + get { + return ResourceManager.GetString("Method_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test method selection. + /// + internal static string Method_selection { + get { + return ResourceManager.GetString("Method_selection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Metrological class. + /// + internal static string Metrological_class { + get { + return ResourceManager.GetString("Metrological_class", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Metrologist. + /// + internal static string Metrologist { + get { + return ResourceManager.GetString("Metrologist", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Metrology. + /// + internal static string Metrology { + get { + return ResourceManager.GetString("Metrology", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mode. + /// + internal static string Mode { + get { + return ResourceManager.GetString("Mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to More. + /// + internal static string MoreBtnText { + get { + return ResourceManager.GetString("MoreBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Name. + /// + internal static string Name { + get { + return ResourceManager.GetString("Name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PBench. + /// + internal static string New_bench_path_name { + get { + return ResourceManager.GetString("New_bench_path_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PFeed. + /// + internal static string New_feeding_path_name { + get { + return ResourceManager.GetString("New_feeding_path_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to - Copy. + /// + internal static string New_name_copy { + get { + return ResourceManager.GetString("New_name_copy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PQ. + /// + internal static string New_output_path_name { + get { + return ResourceManager.GetString("New_output_path_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Procedure. + /// + internal static string New_procedure_name { + get { + return ResourceManager.GetString("New_procedure_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PSens. + /// + internal static string New_sensors_path_name { + get { + return ResourceManager.GetString("New_sensors_path_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test. + /// + internal static string New_test_name { + get { + return ResourceManager.GetString("New_test_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to New transition name. + /// + internal static string New_transition_name { + get { + return ResourceManager.GetString("New_transition_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to New Tab. + /// + internal static string NewTabBtnText { + get { + return ResourceManager.GetString("NewTabBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Next >. + /// + internal static string NextBtnText { + get { + return ResourceManager.GetString("NextBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to no. + /// + internal static string no { + get { + return ResourceManager.GetString("no", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No test bench in the program configuration.. + /// + internal static string NoBenchMsg { + get { + return ResourceManager.GetString("NoBenchMsg", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No. + /// + internal static string NoBtn { + get { + return ResourceManager.GetString("NoBtn", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cannot connect to the database.. + /// + internal static string NoDatabaseMsg { + get { + return ResourceManager.GetString("NoDatabaseMsg", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to <nothing to configure>. + /// + internal static string nothing_to_configure { + get { + return ResourceManager.GetString("nothing_to_configure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Notification. + /// + internal static string Notification { + get { + return ResourceManager.GetString("Notification", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Nr.. + /// + internal static string Nr { + get { + return ResourceManager.GetString("Nr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Nr. meters in a group:. + /// + internal static string Nr_meters_in_a_group { + get { + return ResourceManager.GetString("Nr_meters_in_a_group", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to OK. + /// + internal static string OkBtnText { + get { + return ResourceManager.GetString("OkBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to open. + /// + internal static string open { + get { + return ResourceManager.GetString("open", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Output. + /// + internal static string Output_chdr { + get { + return ResourceManager.GetString("Output_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to P up. + /// + internal static string P_in { + get { + return ResourceManager.GetString("P_in", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to P up end. + /// + internal static string P_in_end { + get { + return ResourceManager.GetString("P_in_end", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to P up start. + /// + internal static string P_in_start { + get { + return ResourceManager.GetString("P_in_start", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to P down. + /// + internal static string P_out { + get { + return ResourceManager.GetString("P_out", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to P down end. + /// + internal static string P_out_end { + get { + return ResourceManager.GetString("P_out_end", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to P down start. + /// + internal static string P_out_start { + get { + return ResourceManager.GetString("P_out_start", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Page. + /// + internal static string Page { + get { + return ResourceManager.GetString("Page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Parameters. + /// + internal static string Parameters { + get { + return ResourceManager.GetString("Parameters", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Parent. + /// + internal static string Parent { + get { + return ResourceManager.GetString("Parent", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Part. + /// + internal static string Part { + get { + return ResourceManager.GetString("Part", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to OK. + /// + internal static string Passed { + get { + return ResourceManager.GetString("Passed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Password. + /// + internal static string Password { + get { + return ResourceManager.GetString("Password", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PID. + /// + internal static string PID { + get { + return ResourceManager.GetString("PID", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Please change the following settings:. + /// + internal static string Please_change_the_following_settings { + get { + return ResourceManager.GetString("Please_change_the_following_settings", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Please select a cycle, a test or empty. + /// + internal static string Please_select_a_cycle_a_test_or_empty { + get { + return ResourceManager.GetString("Please_select_a_cycle_a_test_or_empty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Please select a procedure. + /// + internal static string Please_select_a_procedure { + get { + return ResourceManager.GetString("Please_select_a_procedure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Please select a test. + /// + internal static string Please_select_a_test { + get { + return ResourceManager.GetString("Please_select_a_test", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Please, select a test bench. + /// + internal static string PLs_select_testbench { + get { + return ResourceManager.GetString("PLs_select_testbench", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Power [%]. + /// + internal static string PowerPct { + get { + return ResourceManager.GetString("PowerPct", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pressure [bar]. + /// + internal static string Pressure_bar { + get { + return ResourceManager.GetString("Pressure_bar", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pressure Hi [bar]. + /// + internal static string Pressure_hi_bar { + get { + return ResourceManager.GetString("Pressure_hi_bar", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pressure Lo [bar]. + /// + internal static string Pressure_lo_bar { + get { + return ResourceManager.GetString("Pressure_lo_bar", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pressure meter. + /// + internal static string Pressure_meter { + get { + return ResourceManager.GetString("Pressure_meter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pressure Selection. + /// + internal static string Pressure_selection { + get { + return ResourceManager.GetString("Pressure_selection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PreasureHi [bar]. + /// + internal static string PressureHi_bar { + get { + return ResourceManager.GetString("PressureHi_bar", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PressureLo [bar]. + /// + internal static string PressureLo_bar { + get { + return ResourceManager.GetString("PressureLo_bar", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Printer. + /// + internal static string Printer { + get { + return ResourceManager.GetString("Printer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Printer. + /// + internal static string PrinterBtnText { + get { + return ResourceManager.GetString("PrinterBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Procedure. + /// + internal static string Procedure { + get { + return ResourceManager.GetString("Procedure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Procedure: . + /// + internal static string Procedure_ { + get { + return ResourceManager.GetString("Procedure_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Procedure {0} added.. + /// + internal static string Procedure_0_added { + get { + return ResourceManager.GetString("Procedure_0_added", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Procedure {0} modified.. + /// + internal static string Procedure_0_modified { + get { + return ResourceManager.GetString("Procedure_0_modified", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Procedures. + /// + internal static string Procedures { + get { + return ResourceManager.GetString("Procedures", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Producer. + /// + internal static string Producer { + get { + return ResourceManager.GetString("Producer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Product name. + /// + internal static string Product_name { + get { + return ResourceManager.GetString("Product_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Program restart is required to apply some settings. + /// + internal static string Program_restart_is_required_to_apply_some_settings { + get { + return ResourceManager.GetString("Program_restart_is_required_to_apply_some_settings", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Progress. + /// + internal static string Progress { + get { + return ResourceManager.GetString("Progress", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Properties. + /// + internal static string Properties { + get { + return ResourceManager.GetString("Properties", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Protocol. + /// + internal static string Protocol { + get { + return ResourceManager.GetString("Protocol", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Publish. + /// + internal static string Publish { + get { + return ResourceManager.GetString("Publish", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pulses per liter. + /// + internal static string PulsesPerLtr { + get { + return ResourceManager.GetString("PulsesPerLtr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pump. + /// + internal static string Pump { + get { + return ResourceManager.GetString("Pump", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pump power [%]. + /// + internal static string Pump_power_pct { + get { + return ResourceManager.GetString("Pump_power_pct", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Purchase Order. + /// + internal static string Purchase_Order { + get { + return ResourceManager.GetString("Purchase_Order", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Purchase order: . + /// + internal static string Purchase_order_ { + get { + return ResourceManager.GetString("Purchase_order_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Fill the test bench with water?. + /// + internal static string Purge_bench_qm { + get { + return ResourceManager.GetString("Purge_bench_qm", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Purging. + /// + internal static string Purging { + get { + return ResourceManager.GetString("Purging", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Purging ({0}: step {1}/{2}). + /// + internal static string Purging_i_n { + get { + return ResourceManager.GetString("Purging_i_n", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Q from [l/h]. + /// + internal static string Q_from_lph { + get { + return ResourceManager.GetString("Q_from_lph", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Q from [m3/h]. + /// + internal static string Q_from_m3h { + get { + return ResourceManager.GetString("Q_from_m3h", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Q-Set Method. + /// + internal static string Q_set_method_chdr { + get { + return ResourceManager.GetString("Q_set_method_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Q to [l/h]. + /// + internal static string Q_to_lph { + get { + return ResourceManager.GetString("Q_to_lph", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Q to [m3/h]. + /// + internal static string Q_to_m3h { + get { + return ResourceManager.GetString("Q_to_m3h", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Qfall. + /// + internal static string Qfall { + get { + return ResourceManager.GetString("Qfall", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Qmin. + /// + internal static string Qmin { + get { + return ResourceManager.GetString("Qmin", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Qn. + /// + internal static string Qn { + get { + return ResourceManager.GetString("Qn", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Qrise. + /// + internal static string Qrise { + get { + return ResourceManager.GetString("Qrise", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Qt. + /// + internal static string Qt { + get { + return ResourceManager.GetString("Qt", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Question. + /// + internal static string Question { + get { + return ResourceManager.GetString("Question", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Rate of change [%]. + /// + internal static string RateOfChangePct { + get { + return ResourceManager.GetString("RateOfChangePct", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ready. + /// + internal static string Ready { + get { + return ResourceManager.GetString("Ready", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Red. type. + /// + internal static string Red_type_chdr { + get { + return ResourceManager.GetString("Red_type_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reference. + /// + internal static string Reference { + get { + return ResourceManager.GetString("Reference", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reg. valve. + /// + internal static string Reg_valve { + get { + return ResourceManager.GetString("Reg_valve", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Relative Q from. + /// + internal static string RelativeQfrom { + get { + return ResourceManager.GetString("RelativeQfrom", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Relative Q to. + /// + internal static string RelativeQto { + get { + return ResourceManager.GetString("RelativeQto", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to remaining time. + /// + internal static string remaining_time { + get { + return ResourceManager.GetString("remaining_time", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to < &Remove. + /// + internal static string Remove { + get { + return ResourceManager.GetString("Remove", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to << R&emove all. + /// + internal static string Remove_all { + get { + return ResourceManager.GetString("Remove_all", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remove. + /// + internal static string RemoveBtnText { + get { + return ResourceManager.GetString("RemoveBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remove Tab. + /// + internal static string RemoveTabBtnText { + get { + return ResourceManager.GetString("RemoveTabBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Rename Tab. + /// + internal static string RenameTabBtnText { + get { + return ResourceManager.GetString("RenameTabBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Repeats nr.. + /// + internal static string Repeats_nr_chdr { + get { + return ResourceManager.GetString("Repeats_nr_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to You must restart to apply these changes. + /// + internal static string Restart_To_Apply_Changes { + get { + return ResourceManager.GetString("Restart_To_Apply_Changes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Retry. + /// + internal static string RetryBtnText { + get { + return ResourceManager.GetString("RetryBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Retry connection to the database. + /// + internal static string RetryDatabaseText { + get { + return ResourceManager.GetString("RetryDatabaseText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Revision. + /// + internal static string Revision { + get { + return ResourceManager.GetString("Revision", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ROI Detection in Progress. + /// + internal static string ROI_Detection_in_Progress { + get { + return ResourceManager.GetString("ROI_Detection_in_Progress", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Screen. + /// + internal static string ScreenBtnText { + get { + return ResourceManager.GetString("ScreenBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to s. + /// + internal static string sec { + get { + return ResourceManager.GetString("sec", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Select Component. + /// + internal static string Select_Component { + get { + return ResourceManager.GetString("Select_Component", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Selected results:. + /// + internal static string Selected_results { + get { + return ResourceManager.GetString("Selected_results", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sensor . + /// + internal static string Sensor_ { + get { + return ResourceManager.GetString("Sensor_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sensors. + /// + internal static string Sensors { + get { + return ResourceManager.GetString("Sensors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sensors. + /// + internal static string Sensors_chdr { + get { + return ResourceManager.GetString("Sensors_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Serial Number. + /// + internal static string Serial_Number { + get { + return ResourceManager.GetString("Serial_Number", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Set flow. + /// + internal static string Set_flow { + get { + return ResourceManager.GetString("Set_flow", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Set route. + /// + internal static string Set_route { + get { + return ResourceManager.GetString("Set_route", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Setting the flow. + /// + internal static string Setting_the_flow { + get { + return ResourceManager.GetString("Setting_the_flow", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Setting the water pressure. + /// + internal static string Setting_the_water_pressure { + get { + return ResourceManager.GetString("Setting_the_water_pressure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show cycle end form. + /// + internal static string Show_cycle_end_form { + get { + return ResourceManager.GetString("Show_cycle_end_form", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Simultaneous with next step. + /// + internal static string Simultaneous_with_next_step { + get { + return ResourceManager.GetString("Simultaneous_with_next_step", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Simultaneous with previous step. + /// + internal static string Simultaneous_with_previous_step { + get { + return ResourceManager.GetString("Simultaneous_with_previous_step", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Single. + /// + internal static string SingleBtnText { + get { + return ResourceManager.GetString("SingleBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Start. + /// + internal static string Start { + get { + return ResourceManager.GetString("Start", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Start the pump. + /// + internal static string Start_the_pump { + get { + return ResourceManager.GetString("Start_the_pump", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Start the test. + /// + internal static string Start_the_test { + get { + return ResourceManager.GetString("Start_the_test", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Starting the system. + /// + internal static string Starting_system { + get { + return ResourceManager.GetString("Starting_system", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Starting the cameras. + /// + internal static string Starting_the_cameras { + get { + return ResourceManager.GetString("Starting_the_cameras", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Starting the pump. + /// + internal static string Starting_the_pump { + get { + return ResourceManager.GetString("Starting_the_pump", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Start valve. + /// + internal static string StartValve { + get { + return ResourceManager.GetString("StartValve", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to State. + /// + internal static string State { + get { + return ResourceManager.GetString("State", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Stop the pump. + /// + internal static string Stop_the_pump { + get { + return ResourceManager.GetString("Stop_the_pump", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Stop the test. + /// + internal static string Stop_the_test { + get { + return ResourceManager.GetString("Stop_the_test", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Stopping. + /// + internal static string Stopping { + get { + return ResourceManager.GetString("Stopping", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Stopping flow before the fixed start test. + /// + internal static string Stopping_flow_for_the_fixed_start { + get { + return ResourceManager.GetString("Stopping_flow_for_the_fixed_start", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to . + /// + internal static string String1 { + get { + return ResourceManager.GetString("String1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Supress WM trills. + /// + internal static string SupressWMTrills { + get { + return ResourceManager.GetString("SupressWMTrills", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Switching flow detection. + /// + internal static string Switching_flow_detection { + get { + return ResourceManager.GetString("Switching_flow_detection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Switching Points. + /// + internal static string Switching_Points { + get { + return ResourceManager.GetString("Switching_Points", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T div.. + /// + internal static string T_div { + get { + return ResourceManager.GetString("T_div", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T in. + /// + internal static string T_in { + get { + return ResourceManager.GetString("T_in", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T out. + /// + internal static string T_out { + get { + return ResourceManager.GetString("T_out", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Target Q [m3/h]. + /// + internal static string TargetQ { + get { + return ResourceManager.GetString("TargetQ", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tarring. + /// + internal static string Tarring { + get { + return ResourceManager.GetString("Tarring", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test. + /// + internal static string Test { + get { + return ResourceManager.GetString("Test", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test bench. + /// + internal static string Test_bench { + get { + return ResourceManager.GetString("Test_bench", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test Bench Components Configuration. + /// + internal static string Test_Bench_Components_Configuration { + get { + return ResourceManager.GetString("Test_Bench_Components_Configuration", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test bench data. + /// + internal static string Test_bench_data { + get { + return ResourceManager.GetString("Test_bench_data", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test Bench Databases Specification. + /// + internal static string Test_Bench_Databases_Specification { + get { + return ResourceManager.GetString("Test_Bench_Databases_Specification", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test bench is controlled by this computer. + /// + internal static string Test_bench_is_controlled_by_this_computer { + get { + return ResourceManager.GetString("Test_bench_is_controlled_by_this_computer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test bench name. + /// + internal static string Test_bench_name { + get { + return ResourceManager.GetString("Test_bench_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test bench number. + /// + internal static string Test_bench_number { + get { + return ResourceManager.GetString("Test_bench_number", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test Benches:. + /// + internal static string Test_Benches_ { + get { + return ResourceManager.GetString("Test_Benches_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test. + /// + internal static string Test_chdr { + get { + return ResourceManager.GetString("Test_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test completed. + /// + internal static string Test_completed { + get { + return ResourceManager.GetString("Test_completed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test connection. + /// + internal static string Test_connection { + get { + return ResourceManager.GetString("Test_connection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test in progress. + /// + internal static string Test_in_progress { + get { + return ResourceManager.GetString("Test_in_progress", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test. + /// + internal static string Test_measured_corrected { + get { + return ResourceManager.GetString("Test_measured_corrected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test method. + /// + internal static string Test_method { + get { + return ResourceManager.GetString("Test_method", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test name. + /// + internal static string Test_name { + get { + return ResourceManager.GetString("Test_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test preparation. + /// + internal static string Test_preparation { + get { + return ResourceManager.GetString("Test_preparation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test start ({0}: step {1}/{2}). + /// + internal static string Test_start_sequence_i_n { + get { + return ResourceManager.GetString("Test_start_sequence_i_n", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test stop ({0}: step {1}/{2}). + /// + internal static string Test_stop_sequence_i_n { + get { + return ResourceManager.GetString("Test_stop_sequence_i_n", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test time [s]. + /// + internal static string Test_time_s_chdr { + get { + return ResourceManager.GetString("Test_time_s_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tester. + /// + internal static string Tester { + get { + return ResourceManager.GetString("Tester", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tester: . + /// + internal static string Tester_ { + get { + return ResourceManager.GetString("Tester_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Testing Specialist. + /// + internal static string Testing_Specialist { + get { + return ResourceManager.GetString("Testing_Specialist", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tests are columns. + /// + internal static string Tests_are_columns { + get { + return ResourceManager.GetString("Tests_are_columns", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tests are rows. + /// + internal static string Tests_are_rows { + get { + return ResourceManager.GetString("Tests_are_rows", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T stop - mass msrmt. [s]. + /// + internal static string Time2MassMsrmt_chdr { + get { + return ResourceManager.GetString("Time2MassMsrmt_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T flow stab. - start [s]. + /// + internal static string TimeFlow2Start_chdr { + get { + return ResourceManager.GetString("TimeFlow2Start_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Timeout. + /// + internal static string Timeout { + get { + return ResourceManager.GetString("Timeout", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Toler. red. [%]. + /// + internal static string Tol_red_pct_chdr { + get { + return ResourceManager.GetString("Tol_red_pct_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Transition - End. + /// + internal static string TransitionEnd_chdr { + get { + return ResourceManager.GetString("TransitionEnd_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Transitions. + /// + internal static string Transitions { + get { + return ResourceManager.GetString("Transitions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Transition - Start. + /// + internal static string TransitionStart_chdr { + get { + return ResourceManager.GetString("TransitionStart_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type. + /// + internal static string Type { + get { + return ResourceManager.GetString("Type", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unhandled error occured in . + /// + internal static string Unhandled_error_occured_in_ { + get { + return ResourceManager.GetString("Unhandled_error_occured_in_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unlock. + /// + internal static string UnlockBtnText { + get { + return ResourceManager.GetString("UnlockBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Up. + /// + internal static string UpBtnText { + get { + return ResourceManager.GetString("UpBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to User : . + /// + internal static string User_ { + get { + return ResourceManager.GetString("User_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to User Login. + /// + internal static string User_Login { + get { + return ResourceManager.GetString("User_Login", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to User Management. + /// + internal static string User_Management { + get { + return ResourceManager.GetString("User_Management", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to User name. + /// + internal static string User_name { + get { + return ResourceManager.GetString("User_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Username. + /// + internal static string Username { + get { + return ResourceManager.GetString("Username", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This Username has already been taken. Please choose another one.. + /// + internal static string Username_taken { + get { + return ResourceManager.GetString("Username_taken", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Users and groups. + /// + internal static string Users_and_groups { + get { + return ResourceManager.GetString("Users_and_groups", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Version. + /// + internal static string Version { + get { + return ResourceManager.GetString("Version", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Version _VERSION_. + /// + internal static string VersionStr { + get { + return ResourceManager.GetString("VersionStr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Vertically. + /// + internal static string Vertically { + get { + return ResourceManager.GetString("Vertically", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Volume and error limit selection. + /// + internal static string Volume_and_error_selection { + get { + return ResourceManager.GetString("Volume_and_error_selection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Volume [l]. + /// + internal static string Volume_ltr_chdr { + get { + return ResourceManager.GetString("Volume_ltr_chdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Warning. + /// + internal static string Warning { + get { + return ResourceManager.GetString("Warning", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Water. + /// + internal static string Water { + get { + return ResourceManager.GetString("Water", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Water Meter. + /// + internal static string Water_Meter { + get { + return ResourceManager.GetString("Water_Meter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Water meter data. + /// + internal static string Water_meter_data { + get { + return ResourceManager.GetString("Water_meter_data", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Water Meter Serial Numbers ans States. + /// + internal static string Water_Meter_SNs_States { + get { + return ResourceManager.GetString("Water_Meter_SNs_States", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Water Meter States. + /// + internal static string Water_Meter_States { + get { + return ResourceManager.GetString("Water_Meter_States", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Water meter types. + /// + internal static string Water_meter_types { + get { + return ResourceManager.GetString("Water_meter_types", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Water meters. + /// + internal static string Water_meters { + get { + return ResourceManager.GetString("Water_meters", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to S/N:. + /// + internal static string WMSN { + get { + return ResourceManager.GetString("WMSN", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to State [liter]. + /// + internal static string WMState { + get { + return ResourceManager.GetString("WMState", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to yes. + /// + internal static string yes { + get { + return ResourceManager.GetString("yes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Yes. + /// + internal static string YesBtn { + get { + return ResourceManager.GetString("YesBtn", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Zeroing. + /// + internal static string Zeroing_chdr { + get { + return ResourceManager.GetString("Zeroing_chdr", resourceCulture); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/TBF.csproj b/TBF_V2/Sources/TBF/TBF/TBF.csproj new file mode 100644 index 00000000..c52c3ff4 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/TBF.csproj @@ -0,0 +1,3114 @@ + + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48} + WinExe + Properties + TBF + TBF + v4.0 + + + 2.0 + + + false + D:\_Sensus\Temp\Bin\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 1 + 2.12.497.%2a + false + true + true + true + + + true + full + false + bin\Debug\ + TRACE;DEBUG;GENESIS;IPERL;CAMERA;LANG_DE + prompt + 4 + true + x86 + + + pdbonly + true + bin\Release\ + TRACE;GENESIS;IPERL;CAMERA;LANG_DE + prompt + 4 + x86 + true + + + true + bin\Debug\ + TRACE;DEBUG;GENESIS;IPERL;CAMERA;LANG_DE + full + x86 + prompt + MinimumRecommendedRules.ruleset + true + + + bin\x86\Release\ + TRACE;GENESIS;IPERL;CAMERA;LANG_DE + true + pdbonly + x86 + prompt + MinimumRecommendedRules.ruleset + true + + + TBF.Program + + + 8B49DA64678D1638378388DFE38F6441FE720177 + + + TBF_TemporaryKey.pfx + + + false + + + LocalIntranet + + + Properties\app.manifest + + + false + + + + False + ..\packages\Common\CommonCore.ThreadWatcher.dll + + + False + ..\packages\ControlBoard\Genesis\ControlComponent3U.dll + + + ..\packages\FluentNHibernate.2.0.3.0\lib\net40\FluentNHibernate.dll + + + ..\packages\ControlBoard\GaugeIndicator.dll + + + ..\packages\Iesi.Collections.4.0.0.4000\lib\net40\Iesi.Collections.dll + + + False + ..\packages\log4net.2.0.2\lib\net40-full\log4net.dll + + + False + ..\packages\Common\Logic.ProductionToProductMapper.dll + + + True + + + ..\packages\MySql.Data.6.6.5\lib\net40\MySql.Data.dll + + + False + ..\packages\Common\Newtonsoft.Json.dll + + + ..\packages\NHibernate.4.0.4.4000\lib\net40\NHibernate.dll + + + False + ..\packages\Common\NLog.dll + + + False + ..\packages\Oracle\Oracle.DataAccess.dll + + + False + ..\packages\Common\PdfSharp.dll + + + ..\packages\Renci.SshNet\Renci.SshNet.dll + + + False + ..\packages\Common\RestSharp.dll + + + + + + + + + + + False + ..\packages\Common\Xylem.Common.CommonCore.dll + + + False + ..\packages\Common\Xylem.Common.CommonCore.Configuration.dll + + + ..\packages\Common\Xylem.Common.CommonCore.ThreadWatcher.dll + + + False + ..\packages\Common\Xylem.Common.Hardware.Interfaces.Ports.PortCore.dll + + + False + ..\packages\Common\Xylem.Common.Hardware.Interfaces.Ports.SerialPorts.dll + + + False + ..\packages\Common\Xylem.Common.Hardware.Interfaces.Protocols.TransmitProtocol.dll + + + False + ..\packages\Common\Xylem.Common.Hardware.WaterMeter.Genesis.Applications.dll + + + False + ..\packages\Common\Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.dll + + + False + ..\packages\Common\Xylem.Common.Hardware.WaterMeter.Genesis.GenesisConfig.dll + + + False + ..\packages\Common\Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.dll + + + ..\packages\Common\Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile.dll + + + ..\packages\Common\Xylem.Common.Hardware.WaterMeter.Genesis.GenesisPwd.dll + + + False + ..\packages\Common\Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.ProtocolCore.dll + + + False + ..\packages\Common\Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.dll + + + False + ..\packages\Common\Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.dll + + + False + ..\packages\Common\Xylem.Common.Hardware.WaterMeter.Genesis.Registers.dll + + + False + ..\packages\Common\Xylem.Common.Hardware.WaterMeter.WaterMeterCore.dll + + + False + ..\packages\Common\Xylem.Common.Hardware.WaterMeter.WaterMeterRegisters.dll + + + False + ..\packages\Common\Xylem.Common.Logic.ProductionOrderCore.dll + + + False + ..\packages\Common\Xylem.Common.Logic.RelatePcb.dll + + + False + ..\packages\Common\Xylem.Common.Logic.ServiceCore.dll + + + False + ..\packages\Common\Xylem.Common.Logic.SoftwareAccessHelper.dll + + + False + ..\packages\Common\Xylem.Common.Metrology.Measurements.dll + + + False + ..\packages\Common\Xylem.Common.Ui.CordonelPreadjustmentUi.dll + + + ..\packages\Common\Xylem.Common.Utils.ByteArrayStyle.dll + + + False + ..\packages\Common\Xylem.Common.Utils.Crc16Ccitt.dll + + + False + ..\packages\Common\Xylem.Common.Utils.Logging.dll + + + ..\packages\Common\Xylem.Common.Utils.ProcessExec.dll + + + False + ..\packages\Common\XylemCommonUiLegacyGenCtl.dll + + + + + + + UserControl + + + AmbientCfgCtrl.cs + + + + + + UserControl + + + AmbientCfgCtrl.cs + + + + + + UserControl + + + AmbientCfgCtrl.cs + + + + + + + + + UserControl + + + ComponentCfgCtrl.cs + + + + UserControl + + + + UserControl + + + TestMethodCfgCtrl.cs + + + UserControl + + + ComponentCfgCtrl.cs + + + Form + + + TestStartEndForm.cs + + + Form + + + CycleBeginningForm.cs + + + Form + + + CycleEndForm.cs + + + + + UserControl + + + EntryFormCfgCtrl.cs + + + + Form + + + TestStartEndForm.cs + + + Form + + + CycleBeginningForm.cs + + + Form + + + CycleEndForm.cs + + + + + UserControl + + + EntryFormCfgCtrl.cs + + + + Form + + + TestStartEndForm.cs + + + Form + + + CycleBeginningForm.cs + + + Form + + + CycleEndForm.cs + + + + + UserControl + + + EntryFormCfgCtrl.cs + + + + Form + + + TestStartEndForm.cs + + + Form + + + TestStartEndForm.cs + + + Form + + + CycleBeginningForm.cs + + + Form + + + CycleEndForm.cs + + + + + + UserControl + + + EntryFormCfgCtrl.cs + + + + + Form + + + TestStartEndForm.cs + + + Form + + + AdvancedFixedStartTestForm.cs + + + Form + + + CycleBeginningForm.cs + + + Form + + + CycleEndForm.cs + + + + + + UserControl + + + EntryFormCfgCtrl.cs + + + + + Form + + + TestStartEndForm.cs + + + Form + + + CycleBeginningForm.cs + + + Form + + + CycleEndForm.cs + + + + + + UserControl + + + EntryFormCfgCtrl.cs + + + + + Form + + + TestStartEndForm.cs + + + + + Form + + + TestStartEndForm.cs + + + Form + + + CycleBeginningForm.cs + + + Form + + + CycleEndForm.cs + + + Form + + + CycleEndFormMunich.cs + + + + UserControl + + + EntryFormCfgCtrl.cs + + + + + Form + + + TestStartEndForm.cs + + + + + UserControl + + + DatabaseCfgCtrl.cs + + + + + + UserControl + + + + + + + + + + + + UserControl + + + FlowMeterCfgCtrl.cs + + + + + + + + UserControl + + + RegulValveCfgCtrl.cs + + + + + + + + Form + + + CoverTestForm.cs + + + + + UserControl + + + CoverTestCfgCtrl.cs + + + + + + + + UserControl + + + FlowMeterCfgCtrl.cs + + + + + + UserControl + + + PressureMeterCfgCtrl.cs + + + + + + + + + + + UserControl + + + RegulValveCfgCtrl.cs + + + + + + + + + + UserControl + + + TempMeterCfgCtrl.cs + + + + + + UserControl + + + ValveCfgCtrl.cs + + + + + + + + + + + + + + + + + + + + + + + + + + UserControl + + + MultimeterCfgCtrl.cs + + + + + + UserControl + + + TempMeterCfgCtrl.cs + + + + + + UserControl + + + BalanceCfgCtrl.cs + + + + + + + + + + UserControl + + + BalanceCfgCtrl.cs + + + + + + + + + + + + + + + + + + UserControl + + + AmbientCfgCtrl.cs + + + + + + + UserControl + + + EasythermCfgCtrl.cs + + + + + + + + + + UserControl + + + ModbusCfgCtrl.cs + + + + + + + UserControl + + + PressureMeterCfgCtrl.cs + + + + + + UserControl + + + QuidoRSCfgCtrl.cs + + + + + + + + + + UserControl + + + TankSelectorCfgCtrl.cs + + + + + + + + UserControl + + + NetadapterCfgCtrl.cs + + + + + UserControl + + + CameraCfgCtrl.cs + + + + + + + + + + Form + + + TerminalDlg.cs + + + Form + + + DisplayForm.cs + + + + + + UserControl + + + DisplayCfgCtrl.cs + + + + + + + UserControl + + + RoiCfgCtrl.cs + + + + + + UserControl + + + RoiCfgCtrl.cs + + + + + + + UserControl + + + AmbientCfgCtrl.cs + + + + + + + + + + + + + + + + UserControl + + + MonitoringCfgCtrl.cs + + + + + + + + UserControl + + + SaveFlowmeterCorrCfgCtrl.cs + + + + + + + + + + + + UserControl + + + WriterCfgCtrl.cs + + + + + + + UserControl + + + ArchiverCfgCtrl.cs + + + + + + + + UserControl + + + WriterCfgCtrl.cs + + + + + + UserControl + + + WriterCfgCtrl.cs + + + + + + + + UserControl + + + WriterCfgCtrl.cs + + + Form + + + HeaderFooterDlg.cs + + + + + + + UserControl + + + PrinterCfgCtrl.cs + + + + + + UserControl + + + PrinterCfgCtrl.cs + + + + Component + + + + + UserControl + + + PrinterCfgCtrl.cs + + + + + + + + + UserControl + + + PrinterCfgCtrl.cs + + + + + + + + UserControl + + + PrinterCfgCtrl.cs + + + + + UserControl + + + WriterCfgCtrl.cs + + + + + + UserControl + + + SerialStreamCfgCtrl.cs + + + + + + + + + + + + Form + + + WMErrorsForm12.cs + + + Form + + + WMErrorsForm24.cs + + + + + + + + UserControl + + + TestMethodCfgCtrl.cs + + + + Form + + + CycleDlg.cs + + + Component + + + + + + + + + + + + UserControl + + + TestMethodCfgCtrl.cs + + + + + + + + + + + + UserControl + + + TestMethodCfgCtrl.cs + + + + + + + + + + + + UserControl + + + TestMethodCfgCtrl.cs + + + + + + + + + UserControl + + + TestMethodCfgCtrl.cs + + + + + + + + UserControl + + + TestMethodCfgCtrl.cs + + + + + + + UserControl + + + TestMethodCfgCtrl.cs + + + + + + + + UserControl + + + TestMethodCfgCtrl.cs + + + + + + + UserControl + + + TestMethodCfgCtrl.cs + + + + + + + + UserControl + + + TestMethodCfgCtrl.cs + + + + + + + + UserControl + + + TestMethodCfgCtrl.cs + + + + + + + UserControl + + + TestMethodCfgCtrl.cs + + + + + + + UserControl + + + TestMethodCfgCtrl.cs + + + + + + + UserControl + + + TestMethodCfgCtrl.cs + + + + + + + + + + + + UserControl + + + + + + + + + UserControl + + + GrabImageCfgCtrl.cs + + + + + + + + + + + + UserControl + + + IperlHeadCfgCtrl.cs + + + + + + + + + UserControl + + + CfgCtrl.cs + + + + + + + + + + + + + + UserControl + + + TestMethodCfgCtrl.cs + + + Form + + + WMPulsesForm.cs + + + Form + + + WMPulsesForm12.cs + + + Form + + + WMPulsesForm24.cs + + + + + + + UserControl + + + TestMethodCfgCtrl.cs + + + + + + + + UserControl + + + ErrorsCfgCtrl.cs + + + + + + UserControl + + + WaterMeterCfgCtrl.cs + + + + + + + UserControl + + + WaterMeterCfgCtrl.cs + + + + Form + + + DatabaseSettingsDlg.cs + + + Form + + + LoginDlgWithBenchSelection.cs + + + Form + + + ModelessActivityForm.cs + + + UserControl + + + PreviousResultCtrl.cs + + + + Form + + + PreviousResultsDlg.cs + + + Form + + + RemarkDlg.cs + + + Form + + + UpgradeSelectionDlg.cs + + + + + + + + + UserControl + + + PumpCfgCtrl.cs + + + + Form + + + CycleBeginningForm.cs + + + Form + + + CycleEndForm.cs + + + + + UserControl + + + EntryFormCfgCtrl.cs + + + + Form + + + CycleBeginningForm.cs + + + Form + + + CycleEndForm.cs + + + + + UserControl + + + EntryFormCfgCtrl.cs + + + + Form + + + CycleBeginningForm.cs + + + Form + + + CycleEndForm.cs + + + + + UserControl + + + EntryFormCfgCtrl.cs + + + + Form + + + CycleBeginningForm.cs + + + Form + + + CycleEndForm.cs + + + + + UserControl + + + EntryFormCfgCtrl.cs + + + + Form + + + WMSNsAndStatesForm.cs + + + Form + + + WMStatesForm.cs + + + + + UserControl + + + EntryFormCfgCtrl.cs + + + + + + UserControl + + + RegisterReaderCfgCtrl.cs + + + + + + + UserControl + + + FlowMeterCfgCtrl.cs + + + + + + UserControl + + + PumpCfgCtrl.cs + + + + + + UserControl + + + PumpCfgCtrl.cs + + + + + + + + UserControl + + + RegulValveTandemCfgCtrl.cs + + + + + + + + + + + + UserControl + + + DiverterCfgCtrl.cs + + + UserControl + + + FlowMeterCfgCtrl.cs + + + + + + + + UserControl + + + PressureMeterCfgCtrl.cs + + + + + UserControl + + + PumpCfgCtrl.cs + + + + + + UserControl + + + RegisterReaderCfgCtrl.cs + + + + UserControl + + + RegulValveCfgCtrl.cs + + + UserControl + + + TempMeterCfgCtrl.cs + + + + + + + + + + + + + + + + + + + + + + UserControl + + + ValveCfgCtrl.cs + + + + Form + + + AskYesNoForm.cs + + + + Form + + + MessageBoxForm.cs + + + + + + + + + + + + + + + + Form + + + WMErrorsForm.cs + + + + + + UserControl + + + + + + + + UserControl + + + TestMethodCfgCtrl.cs + + + + + + + + + + + + UserControl + + + TestMethodCfgCtrl.cs + + + + + + + + UserControl + + + TestMethodCfgCtrl.cs + + + + + + + + + Form + + + EmergencyStopForm.cs + + + Form + + + PrintOrderForm.cs + + + Form + + + ResultsArrangementDlg.cs + + + Form + + + TabNameDlg.cs + + + True + True + Strings.cs.resx + + + True + True + Strings.de.resx + + + True + True + Strings.zh-CN.resx + + + UserControl + + + GraphsTabPageCtrl.cs + + + UserControl + + + PicturesTabPageCtrl.cs + + + UserControl + + + ProcessTabPageCtrl24.cs + + + UserControl + + + ProcessTabPageCtrl48.cs + + + Form + + + SelectComponentClassDlg.cs + + + + + UserControl + + + ControlBoardCfgCtrl.cs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Form + + + ComponentParametersDlg.cs + + + Form + + + ComponentsManagerDlg.cs + + + + Form + + + AboutDlg.cs + + + + + + + + + + + + + + + Form + + + BenchesDlg.cs + + + Form + + + ErrorDlg.cs + + + Form + + + NoBenchOrDatabaseDlg.cs + + + Form + + + MetrologyDlg.cs + + + Form + + + PathsDlg.cs + + + Form + + + PreferencesDlg.cs + + + + Form + + + MainWnd.cs + + + Form + + + ProcedureDlg.cs + + + Form + + + ProceduresDlg.cs + + + + + + + + + + + True + True + Strings.resx + + + UserControl + + + ProcessTabPageCtrl6.cs + + + UserControl + + + LogsTabPageCtrl.cs + + + UserControl + + + MeasurementTabPageCtrl.cs + + + UserControl + + + ResultsTabPageCtrl.cs + + + + + + Form + + + FlowSelection.cs + + + Form + + + HeatMetersSelection.cs + + + Form + + + MethodSelection.cs + + + Form + + + PressureSelection.cs + + + Form + + + Roi1.cs + + + Form + + + Roi2.cs + + + Form + + + Roi3.cs + + + + Form + + + VolumeAndErrorSelection.cs + + + + + + Form + + + TransitionsDlg.cs + + + + + + + + + + + + + + + + + + + + + Component + + + UserControl + + + BenchControlPanel.cs + + + UserControl + + + CameraPictureCtrl.cs + + + UserControl + + + CameraPictureCtrl2.cs + + + UserControl + + + CameraPictureCtrl3.cs + + + UserControl + + + CameraPictureFullCtrl.cs + + + + + + + UserControl + + + MetrologyDlgDensityTab.cs + + + UserControl + + + MetrologyDlgFlowMeterTab.cs + + + UserControl + + + MetrologyDlgBalanceTab.cs + + + UserControl + + + MetrologyDlgPlatinumResistanceTMeterTab.cs + + + UserControl + + + MetrologyDlgPressMeterTab.cs + + + UserControl + + + MetrologyDlgTempMeterTab.cs + + + Component + + + Component + + + Component + + + Component + + + Component + + + UserControl + + + ProcedureParamsCtrl.cs + + + Component + + + UserControl + + + SharedButtons.cs + + + UserControl + + + TestParamsCtrl.cs + + + UserControl + + + TestProgressCtrl.cs + + + Component + + + Component + + + + AmbientCfgCtrl.cs + + + AmbientCfgCtrl.cs + + + AmbientCfgCtrl.cs + + + ComponentCfgCtrl.cs + + + TestMethodCfgCtrl.cs + + + ComponentCfgCtrl.cs + + + PumpCfgCtrl.cs + + + CycleBeginningForm.cs + + + CycleEndForm.cs + + + EntryFormCfgCtrl.cs + + + TestStartEndForm.cs + + + CycleBeginningForm.cs + + + CycleBeginningForm.cs + + + CycleBeginningForm.cs + + + CycleEndForm.cs + + + EntryFormCfgCtrl.cs + + + TestStartEndForm.cs + + + CycleBeginningForm.cs + + + CycleBeginningForm.cs + + + CycleBeginningForm.cs + + + CycleEndForm.cs + + + EntryFormCfgCtrl.cs + + + TestStartEndForm.cs + + + CycleBeginningForm.cs + + + CycleBeginningForm.cs + + + CycleBeginningForm.cs + + + CycleEndForm.cs + + + EntryFormCfgCtrl.cs + + + TestStartEndForm.cs + + + CycleBeginningForm.cs + + + CycleBeginningForm.cs + + + CycleBeginningForm.cs + + + CycleEndForm.cs + + + EntryFormCfgCtrl.cs + + + TestStartEndForm.cs + + + CycleBeginningForm.cs + + + CycleEndForm.cs + + + EntryFormCfgCtrl.cs + + + CycleBeginningForm.cs + + + CycleBeginningForm.cs + + + CycleBeginningForm.cs + + + CycleEndForm.cs + + + EntryFormCfgCtrl.cs + + + TestStartEndForm.cs + + + AdvancedFixedStartTestForm.cs + + + CycleBeginningForm.cs + + + CycleBeginningForm.cs + + + CycleBeginningForm.cs + + + CycleEndForm.cs + + + EntryFormCfgCtrl.cs + + + TestStartEndForm.cs + + + CycleBeginningForm.cs + + + CycleBeginningForm.cs + + + CycleBeginningForm.cs + + + CycleEndForm.cs + + + EntryFormCfgCtrl.cs + + + TestStartEndForm.cs + + + CycleBeginningForm.cs + + + CycleBeginningForm.cs + + + CycleBeginningForm.cs + + + CycleEndForm.cs + + + EntryFormCfgCtrl.cs + + + TestStartEndForm.cs + + + CycleBeginningForm.cs + + + CycleEndForm.cs + + + CycleEndFormMunich.cs + + + EntryFormCfgCtrl.cs + + + TestStartEndForm.cs + + + WMSNsAndStatesForm.cs + + + WMSNsAndStatesForm.cs + + + WMSNsAndStatesForm.cs + + + WMStatesForm.cs + + + EntryFormCfgCtrl.cs + + + DatabaseCfgCtrl.cs + + + + FlowMeterCfgCtrl.cs + + + RegulValveCfgCtrl.cs + + + CoverTestForm.cs + + + CoverTestCfgCtrl.cs + + + DiverterCfgCtrl.cs + + + RegisterReaderCfgCtrl.cs + + + FlowMeterCfgCtrl.cs + + + FlowMeterCfgCtrl.cs + + + FlowMeterCfgCtrl.cs + + + PressureMeterCfgCtrl.cs + + + PressureMeterCfgCtrl.cs + + + PumpCfgCtrl.cs + + + PumpCfgCtrl.cs + + + PumpCfgCtrl.cs + + + RegisterReaderCfgCtrl.cs + + + RegulValveCfgCtrl.cs + + + RegulValveTandemCfgCtrl.cs + + + RegulValveCfgCtrl.cs + + + TempMeterCfgCtrl.cs + + + TempMeterCfgCtrl.cs + + + ValveCfgCtrl.cs + + + ValveCfgCtrl.cs + + + MultimeterCfgCtrl.cs + + + TempMeterCfgCtrl.cs + + + BalanceCfgCtrl.cs + + + BalanceCfgCtrl.cs + + + AmbientCfgCtrl.cs + + + ModbusCfgCtrl.cs + + + EasythermCfgCtrl.cs + + + PressureMeterCfgCtrl.cs + + + QuidoRSCfgCtrl.cs + + + TankSelectorCfgCtrl.cs + + + NetadapterCfgCtrl.cs + + + CameraCfgCtrl.cs + + + TerminalDlg.cs + + + DisplayForm.cs + + + DisplayCfgCtrl.cs + + + RoiCfgCtrl.cs + + + RoiCfgCtrl.cs + + + AmbientCfgCtrl.cs + + + AskYesNoForm.cs + + + MessageBoxForm.cs + + + MonitoringCfgCtrl.cs + + + SaveFlowmeterCorrCfgCtrl.cs + + + WriterCfgCtrl.cs + + + ArchiverCfgCtrl.cs + + + WriterCfgCtrl.cs + + + WriterCfgCtrl.cs + + + WriterCfgCtrl.cs + + + HeaderFooterDlg.cs + + + PrinterCfgCtrl.cs + + + PrinterCfgCtrl.cs + + + PrinterCfgCtrl.cs + + + PrinterCfgCtrl.cs + + + PrinterCfgCtrl.cs + + + WriterCfgCtrl.cs + + + SerialStreamCfgCtrl.cs + + + WMErrorsForm.cs + + + WMErrorsForm12.cs + + + WMErrorsForm24.cs + + + CycleDlg.cs + + + CycleDlg.cs + + + TestMethodCfgCtrl.cs + + + TestMethodCfgCtrl.cs + + + TestMethodCfgCtrl.cs + + + TestMethodCfgCtrl.cs + + + TestMethodCfgCtrl.cs + + + TestMethodCfgCtrl.cs + + + TestMethodCfgCtrl.cs + + + TestMethodCfgCtrl.cs + + + + GrabImageCfgCtrl.cs + + + IperlHeadCfgCtrl.cs + + + CfgCtrl.cs + + + TestMethodCfgCtrl.cs + + + WMPulsesForm.cs + + + WMPulsesForm12.cs + + + WMPulsesForm24.cs + + + RoiDetectionCfgCtrl.cs + + + TestMethodCfgCtrl.cs + + + TestMethodCfgCtrl.cs + + + CycleDlg.cs + + + TestMethodCfgCtrl.cs + + + TestMethodCfgCtrl.cs + + + TestMethodCfgCtrl.cs + + + TestMethodCfgCtrl.cs + + + TestMethodCfgCtrl.cs + + + TestMethodCfgCtrl.cs + + + TestMethodCfgCtrl.cs + + + TestMethodCfgCtrl.cs + + + ErrorsCfgCtrl.cs + + + WaterMeterCfgCtrl.cs + + + WaterMeterCfgCtrl.cs + + + BenchesDlg.cs + + + BenchesDlg.cs + + + ComponentsManagerDlg.cs + + + ComponentsManagerDlg.cs + + + AboutDlg.cs + + + AboutDlg.cs + + + DatabaseSettingsDlg.cs + + + EmergencyStopForm.cs + + + LoginDlgWithBenchSelection.cs + + + ModelessActivityForm.cs + + + PreviousResultCtrl.cs + + + PreviousResultsDlg.cs + + + PrintOrderForm.cs + + + RemarkDlg.cs + + + ResultsArrangementDlg.cs + + + TabNameDlg.cs + + + UpgradeSelectionDlg.cs + + + MainWnd.cs + + + MainWnd.cs + + + MainWnd.cs + + + MainWnd.cs + + + MainWnd.cs + + + PathsDlg.cs + + + PathsDlg.cs + + + PreferencesDlg.cs + + + PreferencesDlg.cs + + + ProcedureDlg.cs + + + ProcedureDlg.cs + + + ResXFileCodeGenerator + Designer + Strings.cs.Designer.cs + + + + + Designer + + + Designer + + + Designer + + + + + ResXFileCodeGenerator + Strings.zh-CN.Designer.cs + + + GraphsTabPageCtrl.cs + + + PicturesTabPageCtrl.cs + + + ProcessTabPageCtrl24.cs + + + ProcessTabPageCtrl48.cs + + + SelectComponentClassDlg.cs + + + SelectComponentClassDlg.cs + + + ControlBoardCfgCtrl.cs + + + ComponentParametersDlg.cs + + + ComponentsManagerDlg.cs + + + Designer + AboutDlg.cs + + + Designer + BenchesDlg.cs + + + ErrorDlg.cs + + + NoBenchOrDatabaseDlg.cs + + + MainWnd.cs + Designer + + + MainWnd.cs + Designer + + + MetrologyDlg.cs + + + PathsDlg.cs + + + Designer + PreferencesDlg.cs + + + ProcedureDlg.cs + + + ProceduresDlg.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + ResXFileCodeGenerator + Strings.de.Designer.cs + Designer + + + ResXFileCodeGenerator + Strings.Designer.cs + Designer + + + ProcessTabPageCtrl6.cs + + + LogsTabPageCtrl.cs + + + MeasurementTabPageCtrl.cs + + + ResultsTabPageCtrl.cs + + + SelectComponentClassDlg.cs + + + FlowSelection.cs + + + HeatMetersSelection.cs + + + MethodSelection.cs + + + PressureSelection.cs + + + Roi1.cs + + + Roi2.cs + + + Roi3.cs + + + VolumeAndErrorSelection.cs + + + TransitionsDlg.cs + + + TransitionsDlg.cs + + + TransitionsDlg.cs + + + BenchControlPanel.cs + + + BenchControlPanel.cs + + + BenchControlPanel.cs + + + BenchControlPanel.cs + + + BenchControlPanel.cs + + + BenchControlPanel.cs + + + BenchControlPanel.cs + + + CameraPictureCtrl.cs + + + CameraPictureCtrl2.cs + + + CameraPictureCtrl3.cs + + + CameraPictureFullCtrl.cs + + + MetrologyDlgDensityTab.cs + + + MetrologyDlgFlowMeterTab.cs + + + MetrologyDlgBalanceTab.cs + + + MetrologyDlgPlatinumResistanceTMeterTab.cs + + + MetrologyDlgPressMeterTab.cs + + + MetrologyDlgTempMeterTab.cs + + + ProcedureParamsCtrl.cs + + + SharedButtons.cs + + + TestParamsCtrl.cs + + + TestProgressCtrl.cs + + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + + Designer + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + Always + + + + + + + + + False + Microsoft .NET Framework 4 %28x86 and x64%29 + true + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + false + + + False + Windows Installer 4.5 + true + + + + + + + + + + + + + + + + + + + Always + + + Always + + + + Always + + + Always + + + + + {743DF7DB-C7B6-42EB-986D-0F485E5588E4} + Config + + + {439D0878-C76E-452B-B17D-209A89E91D36} + Dirichlet.Numerics + + + {8B10D15A-39DE-4B56-8DD1-710C1EB3A697} + GemCard + + + {0C0A1F4D-1363-4544-A7C5-196C76D26CCA} + GraphLib + + + {EFEC8A31-3022-4DA7-A8F6-16D30A94C3FF} + MonitoringDB + + + {9D0DCC88-DC81-47EB-9FDD-4C3907871BFB} + Results + + + {6E5CB0E9-E1B6-4E5D-AC6E-B1049E180F2B} + Users + + + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/TBF_TemporaryKey.pfx b/TBF_V2/Sources/TBF/TBF/TBF_TemporaryKey.pfx new file mode 100644 index 00000000..e33bf5c9 Binary files /dev/null and b/TBF_V2/Sources/TBF/TBF/TBF_TemporaryKey.pfx differ diff --git a/TBF_V2/Sources/TBF/TBF/Telegram.cs b/TBF_V2/Sources/TBF/TBF/Telegram.cs new file mode 100644 index 00000000..ffed390e --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Telegram.cs @@ -0,0 +1,167 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Text; + +namespace TBF +{ + public class Telegram + { + const UInt16 crcSeed = 0xFFFF; // Initial crc value + const UInt16 crcGP = 0xA001; // Generating polynomial + + /// + /// For standard CRC16 (remainder of division) + /// to start a new crc, set CRC16 = SEED + /// then for each byte call UpdateCRC(byte, &CRC16); + /// CRC16 will contain the result + /// (if you calculate all of the incoming data + /// INCLUDING the crc, the result should be 0x0000 + /// and if you are sending the crc be sure to + /// send the bytes in the correct order) + /// + static void UpdateCRC(byte b, ref UInt16 crc) + { + crc ^= (UInt16)b; + for (int i = 0; i < 8; i++) + { + bool carry = (crc & 0x0001) != 0; + crc >>= 1; + if (carry) crc ^= crcGP; + } + } + + /// + /// Calculates the CRC from a data telegram (an array of bytes). + /// A complete telegram including two bytes reserved for the CRC + /// must be supplied as an argument. + /// + /// Data telegram + /// Calculated CRC + public static UInt16 ClaculateTelegramCRC(byte[] data) + { + UInt16 crc = crcSeed; + for (int i = 0; i < data.Length - 2; i++) UpdateCRC(data[i], ref crc); + return crc; + } + + /// + /// This function modifies the last 2 bytes in the message buffer + /// by the CRC calculated from the remaining first (Lenght - 2) bytes. + /// A complete telegram including two bytes reserved for the CRC + /// must be supplied as an argument. + /// + /// Data telegram + public static void UpdateTelegramCRC(byte[] data) + { + int len = data.Length; + if (len < 2) return; + + UInt16 crc = ClaculateTelegramCRC(data); + + data[len - 2] = (byte)(crc & 0xFF); + data[len - 1] = (byte)(crc >> 8); + } + + /// + /// This function compares the last 2 bytes in the message buffer + /// with the CRC calculated from the remaining first (Lenght - 2) bytes. + /// A complete telegram including two bytes reserved for the CRC + /// must be supplied as an argument. + /// + /// Data telegram + /// true if the CRC in the telegram is correct + public static bool VerifyTelegramCRC(byte[] data) + { + int len = data.Length; + if (len < 2) return false; + + UInt16 crc = ClaculateTelegramCRC(data); + + return (data[len - 2] == (byte)(crc & 0xFF)) && (data[len - 1] == (byte)(crc >> 8)); + } + + + + /// + /// Calculates the checksum from a data telegram (an array of bytes). + /// A complete telegram including one bytes reserved for the checksum + /// must be supplied as an argument. + /// + /// Data telegram + /// Calculated CRC + public static byte ClaculateTelegramChecksum(byte[] data) + { + byte checksum = 0; + for (int i = 0; i < data.Length - 1; i++) checksum = (byte)(checksum ^ data[i]); + return checksum; + } + + /// + /// This function modifies the last byte in the message buffer + /// by the checksum calculated from the remaining first (Lenght - 1) bytes. + /// A complete telegram including one bytes reserved for the checksum + /// must be supplied as an argument. + /// + /// Data telegram + public static void UpdateTelegramChecksum(byte[] data) + { + int len = data.Length; + if (len < 1) return; + data[len - 1] = ClaculateTelegramChecksum(data); + } + + /// + /// This function compares the last byte in the message buffer + /// with the checksum calculated from the remaining first (Lenght - 1) bytes. + /// A complete telegram including two bytes reserved for the checksum + /// must be supplied as an argument. + /// + /// Data telegram + /// true if the CRC in the telegram is correct + public static bool VerifyTelegramChecksum(byte[] data) + { + int len = data.Length; + if (len < 1) return false; + return (data[len - 1] == ClaculateTelegramChecksum(data)); + } + + + + public static string LogTelegram(string intro, byte[] data) + { + System.Text.StringBuilder sb = new System.Text.StringBuilder(80); + + sb.Append(intro); + sb.Append(data.Length.ToString()); + sb.Append(" bytes:"); + foreach (var d in data) + { + sb.Append(" "); + sb.Append(((int)d).ToString("X2")); + } + + return sb.ToString(); + } + + + + public static string LogTelegram(string intro, string data) + { + System.Text.StringBuilder sb = new System.Text.StringBuilder(80); + + sb.Append(intro); + sb.Append(data.Length.ToString()); + sb.Append(" bytes:"); + foreach (var d in data) + { + sb.Append(" "); + sb.Append(((int)d).ToString("X2")); + } + + return sb.ToString(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/TestProgressControls.cs b/TBF_V2/Sources/TBF/TBF/TestProgressControls.cs new file mode 100644 index 00000000..14a1c9dd --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/TestProgressControls.cs @@ -0,0 +1,193 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using TBF.UiBridge; +using TBF.BenchControl; + +namespace TBF +{ + public class TestProgressControls + { + System.Windows.Forms.Control parent; /// parent is progressFlowLayoutPanel of the only MainWnd instance + IList progresses; + UiControls.TestProgressCtrl currentProgress; + + public TestProgressControls(Control parent) + { + this.parent = parent; + progresses = null; + currentProgress = null; + + Bridge.ProcedureSelectedHandler += delegate(object sender, ProcedureSelectedEventArgs args) + { + if (Program.MainWnd.InvokeRequired) + { + Program.MainWnd.Invoke(new EventHandler(OnProcedureSelected), sender, args); + } + else OnProcedureSelected(sender, args); + }; + Bridge.TestSelectedHandler += delegate(object sender, TestSelectedEventArgs args) + { + if (Program.MainWnd.InvokeRequired) + { + Program.MainWnd.Invoke(new EventHandler(OnTestSelected), sender, args); + } + else OnTestSelected(sender, args); + }; + Bridge.TestProgressHandler += delegate(object sender, TestProgressEventArgs args) + { + if (Program.MainWnd.InvokeRequired) + { + Program.MainWnd.Invoke(new EventHandler(OnTestProgress), sender, args); + } + else OnTestProgress(sender, args); + }; + Bridge.TestCompletedHandler += delegate(object sender, TestCompletedEventArgs args) + { + if (Program.MainWnd.InvokeRequired) + { + Program.MainWnd.Invoke(new EventHandler(OnTestCompleted), sender, args); + } + else OnTestCompleted(sender, args); + }; + Bridge.ProcedureCompletedHandler += delegate(object sender, ProcedureCompletedEventArgs args) + { + if (Program.MainWnd.InvokeRequired) + { + Program.MainWnd.Invoke(new EventHandler(OnProcedureCompleted), sender, args); + } + else OnProcedureCompleted(sender, args); + }; + } + + + void ResetProgressBars(Config.Entities.Procedure procedure) + { + currentProgress = null; + parent.Controls.Clear(); + progresses = new List(); + bool isOuterLoopMode = false; + int outerLoopRepeats = 0; + + int i = 0; + while (i < procedure.Tests.Count) + { + Config.Entities.Test test = procedure.Tests[i++]; + TBF.BenchControl.Generic.IComponent testMethod = TbfComponents.FindComponent(test.Method); + if (testMethod is TBF.BenchControl.TestMethods.OuterLoop.Start.Component) + { + isOuterLoopMode = true; + outerLoopRepeats = (i < procedure.Tests.Count) ? procedure.Tests[i].Repeats : 1; + continue; + } + if (testMethod is TBF.BenchControl.TestMethods.OuterLoop.End.Component) + { + isOuterLoopMode = false; + continue; + } + + int repeats = test.Repeats; + int newI = i; + for (int r = 1; r <=repeats ; r++) + { + if (isOuterLoopMode) + { + int j = i - 1; + while (j < procedure.Tests.Count) + { + Config.Entities.Test test2 = procedure.Tests[j++]; + TBF.BenchControl.Generic.IComponent tm2 = TbfComponents.FindComponent(test2.Method); + if (tm2 is TBF.BenchControl.TestMethods.OuterLoop.End.Component) + { + if (r == repeats) newI = j; + break; + } + + UiControls.TestProgressCtrl prgrs = + new UiControls.TestProgressCtrl(test2.Id, Results.Utils.GetTestName(test2.Name, test2.Repeats, r), test2.Part, Utils.TestTitle(test2, r), r, test2.Repeats); + progresses.Add(prgrs); + parent.Controls.Add(prgrs); + } + } + else + { + UiControls.TestProgressCtrl prgrs = + new UiControls.TestProgressCtrl(test.Id, Results.Utils.GetTestName(test.Name, test.Repeats, r), test.Part, Utils.TestTitle(test, r), r, test.Repeats); + progresses.Add(prgrs); + parent.Controls.Add(prgrs); + } + } + + i = newI; + } + } + + + public void ProcedureSelectedInUI(object sender, ProcedureSelectedEventArgs args) + { + ResetProgressBars(args.Procedure); + } + + void OnProcedureSelected(object sender, ProcedureSelectedEventArgs args) + { + ResetProgressBars(args.Procedure); + } + + void OnTestSelected(object sender, TestSelectedEventArgs args) + { + if (progresses != null) + { + foreach (var prgrs in progresses) + { + if ((prgrs.TestId == args.Test.Id) && (prgrs.RepetitionNr == args.RepetitionNr)) + { + currentProgress = prgrs; + currentProgress.Progress = 0; + currentProgress.TestResult = UiControls.TestProgressCtrl.Result.NotDone; + return; + } + } + } + currentProgress = null; + } + + void OnTestProgress(object sender, TestProgressEventArgs args) + { + foreach (var prgrs in progresses) + { + if (prgrs.TestName == args.TestName && prgrs.Part == args.Part) + { + prgrs.Progress = args.Progress; + break; + } + } + } + + void OnTestCompleted(object sender, TestCompletedEventArgs args) + { + if (currentProgress != null) + { + // Test is 'failed' if any meter failed + + /// TODO: Reimplement + //foreach (var meterTestResult in args.TestResult.Meters) + //{ + // if (!meterTestResult.Passed) + // { + // currentProgress.TestResult = UiControls.TestProgressCtrl.Result.Failed; + // return; + // } + //} + currentProgress.TestResult = UiControls.TestProgressCtrl.Result.Failed; + } + } + + void OnProcedureCompleted(object sender, ProcedureCompletedEventArgs args) + { + ResetProgressBars(args.Procedure); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/TestWizard/FlowSelection.Designer.cs b/TBF_V2/Sources/TBF/TBF/TestWizard/FlowSelection.Designer.cs new file mode 100644 index 00000000..d773f483 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/TestWizard/FlowSelection.Designer.cs @@ -0,0 +1,349 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.TestWizard +{ + partial class FlowSelection + { + /// + /// 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() + { + this.horizSplitContainer = new System.Windows.Forms.SplitContainer(); + this.tabControl1 = new System.Windows.Forms.TabControl(); + this.tabPage1 = new System.Windows.Forms.TabPage(); + this.qFromLabel = new System.Windows.Forms.Label(); + this.qToLabel = new System.Windows.Forms.Label(); + this.qFromTextBox = new System.Windows.Forms.TextBox(); + this.qToTextBox = new System.Windows.Forms.TextBox(); + this.tabPage2 = new System.Windows.Forms.TabPage(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.q2TextBox = new System.Windows.Forms.TextBox(); + this.dQTextBox = new System.Windows.Forms.TextBox(); + this.tabPage3 = new System.Windows.Forms.TabPage(); + this.label3 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.q3TextBox = new System.Windows.Forms.TextBox(); + this.dQpctTextBox = new System.Windows.Forms.TextBox(); + this.sensorsComboBox = new System.Windows.Forms.ComboBox(); + this.sensorsLabel = new System.Windows.Forms.Label(); + this.cancelButton = new System.Windows.Forms.Button(); + this.nextButton = new System.Windows.Forms.Button(); + this.backButton = new System.Windows.Forms.Button(); + ((System.ComponentModel.ISupportInitialize)(this.horizSplitContainer)).BeginInit(); + this.horizSplitContainer.Panel1.SuspendLayout(); + this.horizSplitContainer.Panel2.SuspendLayout(); + this.horizSplitContainer.SuspendLayout(); + this.tabControl1.SuspendLayout(); + this.tabPage1.SuspendLayout(); + this.tabPage2.SuspendLayout(); + this.tabPage3.SuspendLayout(); + this.SuspendLayout(); + // + // horizSplitContainer + // + this.horizSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill; + this.horizSplitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.horizSplitContainer.Location = new System.Drawing.Point(0, 0); + this.horizSplitContainer.Name = "horizSplitContainer"; + this.horizSplitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // horizSplitContainer.Panel1 + // + this.horizSplitContainer.Panel1.Controls.Add(this.tabControl1); + this.horizSplitContainer.Panel1.Controls.Add(this.sensorsComboBox); + this.horizSplitContainer.Panel1.Controls.Add(this.sensorsLabel); + // + // horizSplitContainer.Panel2 + // + this.horizSplitContainer.Panel2.Controls.Add(this.cancelButton); + this.horizSplitContainer.Panel2.Controls.Add(this.nextButton); + this.horizSplitContainer.Panel2.Controls.Add(this.backButton); + this.horizSplitContainer.Size = new System.Drawing.Size(284, 262); + this.horizSplitContainer.SplitterDistance = 182; + this.horizSplitContainer.TabIndex = 1; + // + // tabControl1 + // + this.tabControl1.Controls.Add(this.tabPage1); + this.tabControl1.Controls.Add(this.tabPage2); + this.tabControl1.Controls.Add(this.tabPage3); + this.tabControl1.Location = new System.Drawing.Point(0, 3); + this.tabControl1.Name = "tabControl1"; + this.tabControl1.SelectedIndex = 0; + this.tabControl1.Size = new System.Drawing.Size(284, 123); + this.tabControl1.TabIndex = 11; + this.tabControl1.SelectedIndexChanged += new System.EventHandler(this.tabControl1_SelectedIndexChanged); + // + // tabPage1 + // + this.tabPage1.BackColor = System.Drawing.SystemColors.Control; + this.tabPage1.Controls.Add(this.qFromLabel); + this.tabPage1.Controls.Add(this.qToLabel); + this.tabPage1.Controls.Add(this.qFromTextBox); + this.tabPage1.Controls.Add(this.qToTextBox); + this.tabPage1.Location = new System.Drawing.Point(4, 22); + this.tabPage1.Name = "tabPage1"; + this.tabPage1.Padding = new System.Windows.Forms.Padding(3); + this.tabPage1.Size = new System.Drawing.Size(276, 97); + this.tabPage1.TabIndex = 0; + this.tabPage1.Text = "Q from / Q to"; + // + // qFromLabel + // + this.qFromLabel.AutoSize = true; + this.qFromLabel.Location = new System.Drawing.Point(18, 35); + this.qFromLabel.Name = "qFromLabel"; + this.qFromLabel.Size = new System.Drawing.Size(72, 13); + this.qFromLabel.TabIndex = 1; + this.qFromLabel.Text = "Q from [m3/h]"; + // + // qToLabel + // + this.qToLabel.AutoSize = true; + this.qToLabel.Location = new System.Drawing.Point(18, 61); + this.qToLabel.Name = "qToLabel"; + this.qToLabel.Size = new System.Drawing.Size(61, 13); + this.qToLabel.TabIndex = 2; + this.qToLabel.Text = "Q to [m3/h]"; + // + // qFromTextBox + // + this.qFromTextBox.Location = new System.Drawing.Point(134, 32); + this.qFromTextBox.Name = "qFromTextBox"; + this.qFromTextBox.Size = new System.Drawing.Size(124, 20); + this.qFromTextBox.TabIndex = 4; + this.qFromTextBox.TextChanged += new System.EventHandler(this.anyTextBox_TextChanged); + // + // qToTextBox + // + this.qToTextBox.Location = new System.Drawing.Point(134, 58); + this.qToTextBox.Name = "qToTextBox"; + this.qToTextBox.Size = new System.Drawing.Size(124, 20); + this.qToTextBox.TabIndex = 5; + this.qToTextBox.TextChanged += new System.EventHandler(this.anyTextBox_TextChanged); + // + // tabPage2 + // + this.tabPage2.BackColor = System.Drawing.SystemColors.Control; + this.tabPage2.Controls.Add(this.label1); + this.tabPage2.Controls.Add(this.label2); + this.tabPage2.Controls.Add(this.q2TextBox); + this.tabPage2.Controls.Add(this.dQTextBox); + this.tabPage2.Location = new System.Drawing.Point(4, 22); + this.tabPage2.Name = "tabPage2"; + this.tabPage2.Padding = new System.Windows.Forms.Padding(3); + this.tabPage2.Size = new System.Drawing.Size(276, 97); + this.tabPage2.TabIndex = 1; + this.tabPage2.Text = "Q +/- dQ"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(18, 35); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(49, 13); + this.label1.TabIndex = 6; + this.label1.Text = "Q [m3/h]"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(18, 61); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(55, 13); + this.label2.TabIndex = 7; + this.label2.Text = "dQ [m3/h]"; + // + // q2TextBox + // + this.q2TextBox.Location = new System.Drawing.Point(134, 32); + this.q2TextBox.Name = "q2TextBox"; + this.q2TextBox.Size = new System.Drawing.Size(124, 20); + this.q2TextBox.TabIndex = 8; + this.q2TextBox.TextChanged += new System.EventHandler(this.anyTextBox_TextChanged); + // + // dQTextBox + // + this.dQTextBox.Location = new System.Drawing.Point(134, 58); + this.dQTextBox.Name = "dQTextBox"; + this.dQTextBox.Size = new System.Drawing.Size(124, 20); + this.dQTextBox.TabIndex = 9; + this.dQTextBox.TextChanged += new System.EventHandler(this.anyTextBox_TextChanged); + // + // tabPage3 + // + this.tabPage3.BackColor = System.Drawing.SystemColors.Control; + this.tabPage3.Controls.Add(this.label3); + this.tabPage3.Controls.Add(this.label4); + this.tabPage3.Controls.Add(this.q3TextBox); + this.tabPage3.Controls.Add(this.dQpctTextBox); + this.tabPage3.Location = new System.Drawing.Point(4, 22); + this.tabPage3.Name = "tabPage3"; + this.tabPage3.Size = new System.Drawing.Size(276, 97); + this.tabPage3.TabIndex = 2; + this.tabPage3.Text = "Q +/- delta [%]"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(18, 35); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(49, 13); + this.label3.TabIndex = 6; + this.label3.Text = "Q [m3/h]"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(18, 61); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(38, 13); + this.label4.TabIndex = 7; + this.label4.Text = "dQ [%]"; + // + // q3TextBox + // + this.q3TextBox.Location = new System.Drawing.Point(134, 32); + this.q3TextBox.Name = "q3TextBox"; + this.q3TextBox.Size = new System.Drawing.Size(124, 20); + this.q3TextBox.TabIndex = 8; + this.q3TextBox.TextChanged += new System.EventHandler(this.anyTextBox_TextChanged); + // + // dQpctTextBox + // + this.dQpctTextBox.Location = new System.Drawing.Point(134, 58); + this.dQpctTextBox.Name = "dQpctTextBox"; + this.dQpctTextBox.Size = new System.Drawing.Size(124, 20); + this.dQpctTextBox.TabIndex = 9; + this.dQpctTextBox.TextChanged += new System.EventHandler(this.anyTextBox_TextChanged); + // + // sensorsComboBox + // + this.sensorsComboBox.FormattingEnabled = true; + this.sensorsComboBox.Location = new System.Drawing.Point(137, 145); + this.sensorsComboBox.Name = "sensorsComboBox"; + this.sensorsComboBox.Size = new System.Drawing.Size(124, 21); + this.sensorsComboBox.TabIndex = 7; + this.sensorsComboBox.SelectedIndexChanged += new System.EventHandler(this.anyTextBox_TextChanged); + // + // sensorsLabel + // + this.sensorsLabel.AutoSize = true; + this.sensorsLabel.Location = new System.Drawing.Point(21, 148); + this.sensorsLabel.Name = "sensorsLabel"; + this.sensorsLabel.Size = new System.Drawing.Size(45, 13); + this.sensorsLabel.TabIndex = 6; + this.sensorsLabel.Text = "Sensors"; + // + // cancelButton + // + this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cancelButton.Location = new System.Drawing.Point(186, 17); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(75, 42); + this.cancelButton.TabIndex = 27; + this.cancelButton.Text = "&Cancel"; + this.cancelButton.UseVisualStyleBackColor = true; + this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click); + // + // nextButton + // + this.nextButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.nextButton.Location = new System.Drawing.Point(105, 17); + this.nextButton.Name = "nextButton"; + this.nextButton.Size = new System.Drawing.Size(75, 42); + this.nextButton.TabIndex = 26; + this.nextButton.Text = "&Next >"; + this.nextButton.UseVisualStyleBackColor = true; + this.nextButton.Click += new System.EventHandler(this.nextButton_Click); + // + // backButton + // + this.backButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.backButton.DialogResult = System.Windows.Forms.DialogResult.Retry; + this.backButton.Location = new System.Drawing.Point(24, 17); + this.backButton.Name = "backButton"; + this.backButton.Size = new System.Drawing.Size(75, 42); + this.backButton.TabIndex = 25; + this.backButton.Text = "< &Back"; + this.backButton.UseVisualStyleBackColor = true; + this.backButton.Click += new System.EventHandler(this.backButton_Click); + // + // FlowSelection + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(284, 262); + this.Controls.Add(this.horizSplitContainer); + this.Name = "FlowSelection"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "FlowSelection"; + this.Load += new System.EventHandler(this.FlowSelection_Load); + this.horizSplitContainer.Panel1.ResumeLayout(false); + this.horizSplitContainer.Panel1.PerformLayout(); + this.horizSplitContainer.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.horizSplitContainer)).EndInit(); + this.horizSplitContainer.ResumeLayout(false); + this.tabControl1.ResumeLayout(false); + this.tabPage1.ResumeLayout(false); + this.tabPage1.PerformLayout(); + this.tabPage2.ResumeLayout(false); + this.tabPage2.PerformLayout(); + this.tabPage3.ResumeLayout(false); + this.tabPage3.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer horizSplitContainer; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.Button nextButton; + private System.Windows.Forms.Button backButton; + private System.Windows.Forms.TextBox qToTextBox; + private System.Windows.Forms.TextBox qFromTextBox; + private System.Windows.Forms.Label qToLabel; + private System.Windows.Forms.Label qFromLabel; + private System.Windows.Forms.ComboBox sensorsComboBox; + private System.Windows.Forms.Label sensorsLabel; + private System.Windows.Forms.TabControl tabControl1; + private System.Windows.Forms.TabPage tabPage1; + private System.Windows.Forms.TabPage tabPage2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox q2TextBox; + private System.Windows.Forms.TextBox dQTextBox; + private System.Windows.Forms.TabPage tabPage3; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox q3TextBox; + private System.Windows.Forms.TextBox dQpctTextBox; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/TestWizard/FlowSelection.cs b/TBF_V2/Sources/TBF/TBF/TestWizard/FlowSelection.cs new file mode 100644 index 00000000..ff84778f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/TestWizard/FlowSelection.cs @@ -0,0 +1,218 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using Config.Entities; +using TBF.Resources; + +namespace TBF.TestWizard +{ + public partial class FlowSelection : Form + { + enum QSpec + { + Qfrom_Qto, + Q_dQ, + Q_dPct, + } + + Test test; + IList sensorPaths; + QSpec qSpec; + + public FlowSelection() + { + InitializeComponent(); + + qSpec = 0; + + Text = Strings.Flow_selection; + qFromLabel.Text = Strings.Q_from_m3h; + qToLabel.Text = Strings.Q_to_m3h; + sensorsLabel.Text = Strings.Sensors; + } + + public FlowSelection(bool first, bool last, + Test test, + IList sensorPaths) + : this() + { + this.test = test; + this.sensorPaths = sensorPaths; + + if (first) backButton.Visible = false; + + backButton.Text = Strings.BackBtnText; + nextButton.Text = last ? Strings.FinishBtnText : Strings.NextBtnText; + cancelButton.Text = Strings.CancelBtnText; + } + + private void FlowSelection_Load(object sender, EventArgs e) + { + if (test == null) return; + + foreach (var path in sensorPaths) sensorsComboBox.Items.Add(path.Name); + + qFromTextBox.Text = test.Qfrom.ToString(); + qToTextBox.Text = test.Qto.ToString(); + nextButton.Enabled = IsFormValid(); + } + + void UpdateTest() + { + double Q, dQ; + switch (qSpec) + { + default: + case QSpec.Qfrom_Qto: + test.Qfrom = (float)Utils.ParseUDouble(qFromTextBox.Text); + test.Qto = (float)Utils.ParseUDouble(qToTextBox.Text); + break; + + case QSpec.Q_dQ: + Q = Utils.ParseUDouble(q2TextBox.Text); + dQ = Utils.ParseUDouble(dQTextBox.Text); + test.Qfrom = (float)(Q - dQ); + test.Qto = (float)(Q + dQ); + break; + + case QSpec.Q_dPct: + Q = Utils.ParseUDouble(q3TextBox.Text); + dQ = Utils.ParseUDouble(dQpctTextBox.Text); + test.Qfrom = (float)(Q * (1 - dQ / 100.0f)); + test.Qto = (float)(Q * (1 + dQ / 100.0f)); + break; + } + + if (sensorsComboBox.Items.Contains(sensorsComboBox.Text)) + { + test.MetersPath = sensorsComboBox.Text; + } + } + + bool IsFormValid() + { + float dummy; + switch (qSpec) + { + default: + case QSpec.Qfrom_Qto: + return Utils.TryParseUFloat(qFromTextBox.Text, out dummy) && + Utils.TryParseUFloat(qToTextBox.Text, out dummy) && + sensorsComboBox.Items.Contains(sensorsComboBox.Text); + + case QSpec.Q_dQ: + return Utils.TryParseUFloat(q2TextBox.Text, out dummy) && + Utils.TryParseUFloat(dQTextBox.Text, out dummy) && + sensorsComboBox.Items.Contains(sensorsComboBox.Text); + + case QSpec.Q_dPct: + return Utils.TryParseUFloat(q3TextBox.Text, out dummy) && + Utils.TryParseUFloat(dQpctTextBox.Text, out dummy) && + sensorsComboBox.Items.Contains(sensorsComboBox.Text); + } + } + + private void backButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Retry; + Close(); + } + + private void nextButton_Click(object sender, EventArgs e) + { + if (test != null && IsFormValid()) + { + UpdateTest(); + DialogResult = DialogResult.OK; + Close(); + } + else + { + DialogResult = DialogResult.None; + } + } + + private void cancelButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + private void anyTextBox_TextChanged(object sender, EventArgs e) + { + nextButton.Enabled = IsFormValid(); + } + + private void tabControl1_SelectedIndexChanged(object sender, EventArgs e) + { + double Q1,Q2; + + switch ((QSpec)tabControl1.SelectedIndex) + { + default: + case QSpec.Qfrom_Qto: + if (qSpec == QSpec.Q_dQ && + Utils.TryParseUDouble(q2TextBox.Text, out Q1) && + Utils.TryParseUDouble(dQTextBox.Text, out Q2)) + { + qFromTextBox.Text = (Q1 - Q2).ToString(); + qToTextBox.Text = (Q1 + Q2).ToString(); + } + else if (qSpec == QSpec.Q_dPct && + Utils.TryParseUDouble(q3TextBox.Text, out Q1) && + Utils.TryParseUDouble(dQpctTextBox.Text, out Q2)) + { + qFromTextBox.Text = (Q1 * (1 - Q2 / 100.0)).ToString(); + qToTextBox.Text = (Q1 * (1 + Q2 / 100.0)).ToString(); + } + + qSpec = QSpec.Qfrom_Qto; + break; + + case QSpec.Q_dQ: + if (qSpec == QSpec.Qfrom_Qto && + Utils.TryParseUDouble(qFromTextBox.Text, out Q1) && + Utils.TryParseUDouble(qToTextBox.Text, out Q2)) + { + q2TextBox.Text = ((Q1 + Q2) / 2.0).ToString(); + dQTextBox.Text = ((Q2 - Q1) / 2.0).ToString(); + } + else if (qSpec == QSpec.Q_dPct && + Utils.TryParseUDouble(q3TextBox.Text, out Q1) && + Utils.TryParseUDouble(dQpctTextBox.Text, out Q2)) + { + q2TextBox.Text = q3TextBox.Text; + dQTextBox.Text = (Q1 * Q2 / 100.0).ToString(); + } + + qSpec = QSpec.Q_dQ; + break; + + case QSpec.Q_dPct: + if (qSpec == QSpec.Qfrom_Qto && + Utils.TryParseUDouble(qFromTextBox.Text, out Q1) && + Utils.TryParseUDouble(qToTextBox.Text, out Q2)) + { + q3TextBox.Text = ((Q1 + Q2) / 2.0).ToString(); + dQpctTextBox.Text = (Q1 + Q2 != 0) ? (100.0 * (Q2 - Q1) / (Q1 + Q2)).ToString() : string.Empty; + } + else if (qSpec == QSpec.Q_dQ && + Utils.TryParseUDouble(q2TextBox.Text, out Q1) && + Utils.TryParseUDouble(dQTextBox.Text, out Q2) && + Q1 != 0) + { + q3TextBox.Text = q2TextBox.Text; + dQpctTextBox.Text = (Q1 != 0) ? (100.0 * Q2 / Q1).ToString() : string.Empty; + } + + qSpec = QSpec.Q_dPct; + break; + } + + nextButton.Enabled = IsFormValid(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/TestWizard/FlowSelection.resx b/TBF_V2/Sources/TBF/TBF/TestWizard/FlowSelection.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/TestWizard/FlowSelection.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/TestWizard/HeatMetersSelection.Designer.cs b/TBF_V2/Sources/TBF/TBF/TestWizard/HeatMetersSelection.Designer.cs new file mode 100644 index 00000000..450b3b54 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/TestWizard/HeatMetersSelection.Designer.cs @@ -0,0 +1,116 @@ +namespace TBF.TestWizard +{ + partial class HeatMetersSelection + { + /// + /// 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() + { + this.horizSplitContainer = new System.Windows.Forms.SplitContainer(); + this.cancelButton = new System.Windows.Forms.Button(); + this.nextButton = new System.Windows.Forms.Button(); + this.backButton = new System.Windows.Forms.Button(); + ((System.ComponentModel.ISupportInitialize)(this.horizSplitContainer)).BeginInit(); + this.horizSplitContainer.Panel2.SuspendLayout(); + this.horizSplitContainer.SuspendLayout(); + this.SuspendLayout(); + // + // horizSplitContainer + // + this.horizSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill; + this.horizSplitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.horizSplitContainer.Location = new System.Drawing.Point(0, 0); + this.horizSplitContainer.Name = "horizSplitContainer"; + this.horizSplitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // horizSplitContainer.Panel2 + // + this.horizSplitContainer.Panel2.Controls.Add(this.cancelButton); + this.horizSplitContainer.Panel2.Controls.Add(this.nextButton); + this.horizSplitContainer.Panel2.Controls.Add(this.backButton); + this.horizSplitContainer.Size = new System.Drawing.Size(284, 262); + this.horizSplitContainer.SplitterDistance = 182; + this.horizSplitContainer.TabIndex = 2; + // + // cancelButton + // + this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cancelButton.Location = new System.Drawing.Point(186, 17); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(75, 42); + this.cancelButton.TabIndex = 27; + this.cancelButton.Text = "&Cancel"; + this.cancelButton.UseVisualStyleBackColor = true; + this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click); + // + // nextButton + // + this.nextButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.nextButton.Location = new System.Drawing.Point(105, 17); + this.nextButton.Name = "nextButton"; + this.nextButton.Size = new System.Drawing.Size(75, 42); + this.nextButton.TabIndex = 26; + this.nextButton.Text = "&Next >"; + this.nextButton.UseVisualStyleBackColor = true; + this.nextButton.Click += new System.EventHandler(this.nextButton_Click); + // + // backButton + // + this.backButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.backButton.DialogResult = System.Windows.Forms.DialogResult.Retry; + this.backButton.Location = new System.Drawing.Point(24, 17); + this.backButton.Name = "backButton"; + this.backButton.Size = new System.Drawing.Size(75, 42); + this.backButton.TabIndex = 25; + this.backButton.Text = "< &Back"; + this.backButton.UseVisualStyleBackColor = true; + this.backButton.Click += new System.EventHandler(this.backButton_Click); + // + // HeatMetersSelection + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(284, 262); + this.Controls.Add(this.horizSplitContainer); + this.Name = "HeatMetersSelection"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "HeatMetersSelection"; + this.Load += new System.EventHandler(this.HeatMetersSelection_Load); + this.horizSplitContainer.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.horizSplitContainer)).EndInit(); + this.horizSplitContainer.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer horizSplitContainer; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.Button nextButton; + private System.Windows.Forms.Button backButton; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/TestWizard/HeatMetersSelection.cs b/TBF_V2/Sources/TBF/TBF/TestWizard/HeatMetersSelection.cs new file mode 100644 index 00000000..1d42bec6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/TestWizard/HeatMetersSelection.cs @@ -0,0 +1,92 @@ +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.Resources; + +namespace TBF.TestWizard +{ + public partial class HeatMetersSelection : Form + { + Test test; + + public HeatMetersSelection() + { + InitializeComponent(); + } + + public HeatMetersSelection(bool first, bool last, Test test) + : this() + { + this.test = test; + + Text = Strings.Heat_meter_options; + backButton.Text = Strings.BackBtnText; + nextButton.Text = Strings.NextBtnText; + cancelButton.Text = Strings.CancelBtnText; + + if (first) backButton.Visible = false; + if (last) nextButton.Text = Strings.FinishBtnText; + } + + private void HeatMetersSelection_Load(object sender, EventArgs e) + { + if (test == null) return; + + RefreshWizardPage(); + } + + void RefreshWizardPage() + { + /// someTextBox.Text = test.SomeParam.ToString(); + + nextButton.Enabled = IsFormValid(); + } + + void UpdateTest() + { + /// TODO: complete + //test.Qfrom = Utils.ParseUFloat(pressureLoTextBox.Text); + //test.Qto = Utils.ParseUFloat(pressureHiTextBox.Text); + //test.TstTime = int.Parse(durationTextBox.Text); + } + + bool IsFormValid() + { + /// int dummy; + /// return int.TryParse(someTextBox.Text, out dummy); + + return true; + } + + private void backButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Retry; + Close(); + } + + private void nextButton_Click(object sender, EventArgs e) + { + if (test != null && IsFormValid()) + { + UpdateTest(); + DialogResult = DialogResult.OK; + Close(); + } + else + { + DialogResult = DialogResult.None; + } + } + + private void cancelButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + private void anyTextBox_TextChanged(object sender, EventArgs e) + { + nextButton.Enabled = IsFormValid(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/TestWizard/HeatMetersSelection.resx b/TBF_V2/Sources/TBF/TBF/TestWizard/HeatMetersSelection.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/TestWizard/HeatMetersSelection.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/TestWizard/MethodSelection.Designer.cs b/TBF_V2/Sources/TBF/TBF/TestWizard/MethodSelection.Designer.cs new file mode 100644 index 00000000..5f545530 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/TestWizard/MethodSelection.Designer.cs @@ -0,0 +1,172 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.TestWizard +{ + partial class MethodSelection + { + /// + /// 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() + { + this.horizSplitContainer = new System.Windows.Forms.SplitContainer(); + this.testNameTextBox = new System.Windows.Forms.TextBox(); + this.testNameLabel = new System.Windows.Forms.Label(); + this.testMethodComboBox = new System.Windows.Forms.ComboBox(); + this.testMethodLabel = new System.Windows.Forms.Label(); + this.cancelButton = new System.Windows.Forms.Button(); + this.nextButton = new System.Windows.Forms.Button(); + this.backButton = new System.Windows.Forms.Button(); + ((System.ComponentModel.ISupportInitialize)(this.horizSplitContainer)).BeginInit(); + this.horizSplitContainer.Panel1.SuspendLayout(); + this.horizSplitContainer.Panel2.SuspendLayout(); + this.horizSplitContainer.SuspendLayout(); + this.SuspendLayout(); + // + // horizSplitContainer + // + this.horizSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill; + this.horizSplitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.horizSplitContainer.Location = new System.Drawing.Point(0, 0); + this.horizSplitContainer.Name = "horizSplitContainer"; + this.horizSplitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // horizSplitContainer.Panel1 + // + this.horizSplitContainer.Panel1.Controls.Add(this.testNameTextBox); + this.horizSplitContainer.Panel1.Controls.Add(this.testNameLabel); + this.horizSplitContainer.Panel1.Controls.Add(this.testMethodComboBox); + this.horizSplitContainer.Panel1.Controls.Add(this.testMethodLabel); + // + // horizSplitContainer.Panel2 + // + this.horizSplitContainer.Panel2.Controls.Add(this.cancelButton); + this.horizSplitContainer.Panel2.Controls.Add(this.nextButton); + this.horizSplitContainer.Panel2.Controls.Add(this.backButton); + this.horizSplitContainer.Size = new System.Drawing.Size(284, 262); + this.horizSplitContainer.SplitterDistance = 182; + this.horizSplitContainer.TabIndex = 0; + // + // testNameTextBox + // + this.testNameTextBox.Location = new System.Drawing.Point(99, 47); + this.testNameTextBox.Name = "testNameTextBox"; + this.testNameTextBox.Size = new System.Drawing.Size(165, 20); + this.testNameTextBox.TabIndex = 5; + this.testNameTextBox.TextChanged += new System.EventHandler(this.testNameTextBox_TextChanged); + // + // testNameLabel + // + this.testNameLabel.AutoSize = true; + this.testNameLabel.Location = new System.Drawing.Point(15, 50); + this.testNameLabel.Name = "testNameLabel"; + this.testNameLabel.Size = new System.Drawing.Size(57, 13); + this.testNameLabel.TabIndex = 4; + this.testNameLabel.Text = "Test name"; + // + // testMethodComboBox + // + this.testMethodComboBox.FormattingEnabled = true; + this.testMethodComboBox.Location = new System.Drawing.Point(99, 96); + this.testMethodComboBox.Name = "testMethodComboBox"; + this.testMethodComboBox.Size = new System.Drawing.Size(165, 21); + this.testMethodComboBox.TabIndex = 1; + this.testMethodComboBox.TextChanged += new System.EventHandler(this.testMethodComboBox_TextChanged); + // + // testMethodLabel + // + this.testMethodLabel.AutoSize = true; + this.testMethodLabel.Location = new System.Drawing.Point(15, 99); + this.testMethodLabel.Name = "testMethodLabel"; + this.testMethodLabel.Size = new System.Drawing.Size(66, 13); + this.testMethodLabel.TabIndex = 0; + this.testMethodLabel.Text = "Test method"; + // + // cancelButton + // + this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cancelButton.Location = new System.Drawing.Point(186, 17); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(75, 42); + this.cancelButton.TabIndex = 27; + this.cancelButton.Text = "&Cancel"; + this.cancelButton.UseVisualStyleBackColor = true; + this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click); + // + // nextButton + // + this.nextButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.nextButton.Location = new System.Drawing.Point(105, 17); + this.nextButton.Name = "nextButton"; + this.nextButton.Size = new System.Drawing.Size(75, 42); + this.nextButton.TabIndex = 26; + this.nextButton.Text = "&Next >"; + this.nextButton.UseVisualStyleBackColor = true; + this.nextButton.Click += new System.EventHandler(this.nextButton_Click); + // + // backButton + // + this.backButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.backButton.DialogResult = System.Windows.Forms.DialogResult.Retry; + this.backButton.Location = new System.Drawing.Point(24, 17); + this.backButton.Name = "backButton"; + this.backButton.Size = new System.Drawing.Size(75, 42); + this.backButton.TabIndex = 25; + this.backButton.Text = "< &Back"; + this.backButton.UseVisualStyleBackColor = true; + this.backButton.Click += new System.EventHandler(this.backButton_Click); + // + // MethodSelection + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(284, 262); + this.Controls.Add(this.horizSplitContainer); + this.Name = "MethodSelection"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "MethodSelection"; + this.Load += new System.EventHandler(this.MethodSelection_Load); + this.horizSplitContainer.Panel1.ResumeLayout(false); + this.horizSplitContainer.Panel1.PerformLayout(); + this.horizSplitContainer.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.horizSplitContainer)).EndInit(); + this.horizSplitContainer.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer horizSplitContainer; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.Button nextButton; + private System.Windows.Forms.Button backButton; + private System.Windows.Forms.ComboBox testMethodComboBox; + private System.Windows.Forms.Label testMethodLabel; + private System.Windows.Forms.TextBox testNameTextBox; + private System.Windows.Forms.Label testNameLabel; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/TestWizard/MethodSelection.cs b/TBF_V2/Sources/TBF/TBF/TestWizard/MethodSelection.cs new file mode 100644 index 00000000..a834b352 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/TestWizard/MethodSelection.cs @@ -0,0 +1,114 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using Config.Entities; +using TBF.Resources; + +namespace TBF.TestWizard +{ + public partial class MethodSelection : Form + { + Test test; + IList methods; + + public MethodSelection() + { + InitializeComponent(); + } + + public MethodSelection(bool first, bool last, + Test test, + IList methods) + : this() + { + this.test = test; + this.methods = methods; + + Text = Strings.Method_selection; + testNameLabel.Text = Strings.Test_name; + testMethodLabel.Text = Strings.Test_method; + backButton.Text = Strings.BackBtnText; + nextButton.Text = Strings.NextBtnText; + cancelButton.Text = Strings.CancelBtnText; + + if (first) backButton.Visible = false; + if (last) nextButton.Text = Strings.FinishBtnText; + } + + private void MethodSelection_Load(object sender, EventArgs e) + { + if (test == null) return; + + foreach (var method in methods) testMethodComboBox.Items.Add(method.Cfg.Name); + + RefreshWizardPage(); + } + + void RefreshWizardPage() + { + testNameTextBox.Text = test.Name; + nextButton.Enabled = IsFormValid(); + } + + void UpdateTest() + { + test.Name = testNameTextBox.Text; + + if (testMethodComboBox.Items.Contains(testMethodComboBox.Text)) + { + test.Method = testMethodComboBox.Text; + } + } + + bool IsFormValid() + { + bool methodOK = testMethodComboBox.Items.Contains(testMethodComboBox.Text); + return Utils.IsGoodFName(testNameTextBox.Text) && methodOK; + } + + private void backButton_Click(object sender, EventArgs e) + { + if (test != null && IsFormValid()) UpdateTest(); + DialogResult = DialogResult.Retry; + Close(); + } + + private void nextButton_Click(object sender, EventArgs e) + { + if (test != null && IsFormValid()) + { + UpdateTest(); + DialogResult = DialogResult.OK; + Close(); + } + else + { + DialogResult = DialogResult.None; + } + } + + private void cancelButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + private void testNameTextBox_TextChanged(object sender, EventArgs e) + { + nextButton.Enabled = IsFormValid(); + } + + private void testMethodComboBox_TextChanged(object sender, EventArgs e) + { + nextButton.Enabled = IsFormValid(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/TestWizard/MethodSelection.resx b/TBF_V2/Sources/TBF/TBF/TestWizard/MethodSelection.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/TestWizard/MethodSelection.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/TestWizard/PressureSelection.cs b/TBF_V2/Sources/TBF/TBF/TestWizard/PressureSelection.cs new file mode 100644 index 00000000..aafef9d5 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/TestWizard/PressureSelection.cs @@ -0,0 +1,100 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.Resources; + +namespace TBF.TestWizard +{ + public partial class PressureSelection : Form + { + Test test; + + public PressureSelection() + { + InitializeComponent(); + } + + public PressureSelection(bool first, bool last, Test test) + : this() + { + this.test = test; + + Text = Strings.Pressure_selection; + pressureLoLabel.Text = Strings.Pressure_lo_bar; + pressureHiLabel.Text = Strings.Pressure_hi_bar; + durationLabel.Text = Strings.Duration_s; + backButton.Text = Strings.BackBtnText; + nextButton.Text = Strings.NextBtnText; + cancelButton.Text = Strings.CancelBtnText; + + if (first) backButton.Visible = false; + if (last) nextButton.Text = Strings.FinishBtnText; + } + + private void FlowSelection_Load(object sender, EventArgs e) + { + if (test == null) return; + + RefreshWizardPage(); + } + + void RefreshWizardPage() + { + pressureLoTextBox.Text = 1.0f.ToString(); /// TODO: replace constants + pressureHiTextBox.Text = 2.0f.ToString(); + durationTextBox.Text = 10.ToString(); + nextButton.Enabled = IsFormValid(); + } + + void UpdateTest() + { + /// TODO: complete + //test.Qfrom = Utils.ParseUFloat(pressureLoTextBox.Text); + //test.Qto = Utils.ParseUFloat(pressureHiTextBox.Text); + //test.TstTime = int.Parse(durationTextBox.Text); + } + + bool IsFormValid() + { + float dummy; + int iDummy; + return Utils.TryParseUFloat(pressureLoTextBox.Text, out dummy) && + Utils.TryParseUFloat(pressureHiTextBox.Text, out dummy) && + int.TryParse(durationTextBox.Text, out iDummy); + } + + private void backButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Retry; + Close(); + } + + private void nextButton_Click(object sender, EventArgs e) + { + if (test != null && IsFormValid()) + { + UpdateTest(); + DialogResult = DialogResult.OK; + Close(); + } + else + { + DialogResult = DialogResult.None; + } + } + + private void cancelButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + private void anyTextBox_TextChanged(object sender, EventArgs e) + { + nextButton.Enabled = IsFormValid(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/TestWizard/PressureSelection.designer.cs b/TBF_V2/Sources/TBF/TBF/TestWizard/PressureSelection.designer.cs new file mode 100644 index 00000000..e78ea493 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/TestWizard/PressureSelection.designer.cs @@ -0,0 +1,194 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.TestWizard +{ + partial class PressureSelection + { + /// + /// 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() + { + this.horizSplitContainer = new System.Windows.Forms.SplitContainer(); + this.durationTextBox = new System.Windows.Forms.TextBox(); + this.durationLabel = new System.Windows.Forms.Label(); + this.pressureHiTextBox = new System.Windows.Forms.TextBox(); + this.pressureLoTextBox = new System.Windows.Forms.TextBox(); + this.pressureHiLabel = new System.Windows.Forms.Label(); + this.pressureLoLabel = new System.Windows.Forms.Label(); + this.cancelButton = new System.Windows.Forms.Button(); + this.nextButton = new System.Windows.Forms.Button(); + this.backButton = new System.Windows.Forms.Button(); + ((System.ComponentModel.ISupportInitialize)(this.horizSplitContainer)).BeginInit(); + this.horizSplitContainer.Panel1.SuspendLayout(); + this.horizSplitContainer.Panel2.SuspendLayout(); + this.horizSplitContainer.SuspendLayout(); + this.SuspendLayout(); + // + // horizSplitContainer + // + this.horizSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill; + this.horizSplitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.horizSplitContainer.Location = new System.Drawing.Point(0, 0); + this.horizSplitContainer.Name = "horizSplitContainer"; + this.horizSplitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // horizSplitContainer.Panel1 + // + this.horizSplitContainer.Panel1.Controls.Add(this.durationTextBox); + this.horizSplitContainer.Panel1.Controls.Add(this.durationLabel); + this.horizSplitContainer.Panel1.Controls.Add(this.pressureHiTextBox); + this.horizSplitContainer.Panel1.Controls.Add(this.pressureLoTextBox); + this.horizSplitContainer.Panel1.Controls.Add(this.pressureHiLabel); + this.horizSplitContainer.Panel1.Controls.Add(this.pressureLoLabel); + // + // horizSplitContainer.Panel2 + // + this.horizSplitContainer.Panel2.Controls.Add(this.cancelButton); + this.horizSplitContainer.Panel2.Controls.Add(this.nextButton); + this.horizSplitContainer.Panel2.Controls.Add(this.backButton); + this.horizSplitContainer.Size = new System.Drawing.Size(284, 262); + this.horizSplitContainer.SplitterDistance = 182; + this.horizSplitContainer.TabIndex = 1; + // + // durationTextBox + // + this.durationTextBox.Location = new System.Drawing.Point(136, 103); + this.durationTextBox.Name = "durationTextBox"; + this.durationTextBox.Size = new System.Drawing.Size(125, 20); + this.durationTextBox.TabIndex = 7; + // + // durationLabel + // + this.durationLabel.AutoSize = true; + this.durationLabel.Location = new System.Drawing.Point(21, 106); + this.durationLabel.Name = "durationLabel"; + this.durationLabel.Size = new System.Drawing.Size(83, 13); + this.durationLabel.TabIndex = 6; + this.durationLabel.Text = "Test duration [s]"; + // + // pressureHiTextBox + // + this.pressureHiTextBox.Location = new System.Drawing.Point(137, 74); + this.pressureHiTextBox.Name = "pressureHiTextBox"; + this.pressureHiTextBox.Size = new System.Drawing.Size(124, 20); + this.pressureHiTextBox.TabIndex = 5; + this.pressureHiTextBox.TextChanged += new System.EventHandler(this.anyTextBox_TextChanged); + // + // pressureLoTextBox + // + this.pressureLoTextBox.Location = new System.Drawing.Point(137, 44); + this.pressureLoTextBox.Name = "pressureLoTextBox"; + this.pressureLoTextBox.Size = new System.Drawing.Size(124, 20); + this.pressureLoTextBox.TabIndex = 4; + this.pressureLoTextBox.TextChanged += new System.EventHandler(this.anyTextBox_TextChanged); + // + // pressureHiLabel + // + this.pressureHiLabel.AutoSize = true; + this.pressureHiLabel.Location = new System.Drawing.Point(21, 77); + this.pressureHiLabel.Name = "pressureHiLabel"; + this.pressureHiLabel.Size = new System.Drawing.Size(85, 13); + this.pressureHiLabel.TabIndex = 2; + this.pressureHiLabel.Text = "Pressure Hi [bar]"; + // + // pressureLoLabel + // + this.pressureLoLabel.AutoSize = true; + this.pressureLoLabel.Location = new System.Drawing.Point(21, 47); + this.pressureLoLabel.Name = "pressureLoLabel"; + this.pressureLoLabel.Size = new System.Drawing.Size(87, 13); + this.pressureLoLabel.TabIndex = 1; + this.pressureLoLabel.Text = "Pressure Lo [bar]"; + // + // cancelButton + // + this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cancelButton.Location = new System.Drawing.Point(186, 17); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(75, 42); + this.cancelButton.TabIndex = 27; + this.cancelButton.Text = "&Cancel"; + this.cancelButton.UseVisualStyleBackColor = true; + this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click); + // + // nextButton + // + this.nextButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.nextButton.Location = new System.Drawing.Point(105, 17); + this.nextButton.Name = "nextButton"; + this.nextButton.Size = new System.Drawing.Size(75, 42); + this.nextButton.TabIndex = 26; + this.nextButton.Text = "&Next >"; + this.nextButton.UseVisualStyleBackColor = true; + this.nextButton.Click += new System.EventHandler(this.nextButton_Click); + // + // backButton + // + this.backButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.backButton.DialogResult = System.Windows.Forms.DialogResult.Retry; + this.backButton.Location = new System.Drawing.Point(24, 17); + this.backButton.Name = "backButton"; + this.backButton.Size = new System.Drawing.Size(75, 42); + this.backButton.TabIndex = 25; + this.backButton.Text = "< &Back"; + this.backButton.UseVisualStyleBackColor = true; + this.backButton.Click += new System.EventHandler(this.backButton_Click); + // + // PressureSelection + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(284, 262); + this.Controls.Add(this.horizSplitContainer); + this.Name = "PressureSelection"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "PressureSelection"; + this.Load += new System.EventHandler(this.FlowSelection_Load); + this.horizSplitContainer.Panel1.ResumeLayout(false); + this.horizSplitContainer.Panel1.PerformLayout(); + this.horizSplitContainer.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.horizSplitContainer)).EndInit(); + this.horizSplitContainer.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer horizSplitContainer; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.Button nextButton; + private System.Windows.Forms.Button backButton; + private System.Windows.Forms.TextBox pressureHiTextBox; + private System.Windows.Forms.TextBox pressureLoTextBox; + private System.Windows.Forms.Label pressureHiLabel; + private System.Windows.Forms.Label pressureLoLabel; + private System.Windows.Forms.TextBox durationTextBox; + private System.Windows.Forms.Label durationLabel; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/TestWizard/PressureSelection.resx b/TBF_V2/Sources/TBF/TBF/TestWizard/PressureSelection.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/TestWizard/PressureSelection.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/TestWizard/Roi1.Designer.cs b/TBF_V2/Sources/TBF/TBF/TestWizard/Roi1.Designer.cs new file mode 100644 index 00000000..2e934079 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/TestWizard/Roi1.Designer.cs @@ -0,0 +1,188 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.TestWizard +{ + partial class Roi1 + { + /// + /// 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() + { + this.horizSplitContainer = new System.Windows.Forms.SplitContainer(); + this.stylePictureBox = new System.Windows.Forms.PictureBox(); + this.fwButton = new System.Windows.Forms.Button(); + this.bwButton = new System.Windows.Forms.Button(); + this.teetgCountTextBox = new System.Windows.Forms.TextBox(); + this.teethCount = new System.Windows.Forms.Label(); + this.cancelButton = new System.Windows.Forms.Button(); + this.nextButton = new System.Windows.Forms.Button(); + this.backButton = new System.Windows.Forms.Button(); + ((System.ComponentModel.ISupportInitialize)(this.horizSplitContainer)).BeginInit(); + this.horizSplitContainer.Panel1.SuspendLayout(); + this.horizSplitContainer.Panel2.SuspendLayout(); + this.horizSplitContainer.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.stylePictureBox)).BeginInit(); + this.SuspendLayout(); + // + // horizSplitContainer + // + this.horizSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill; + this.horizSplitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.horizSplitContainer.Location = new System.Drawing.Point(0, 0); + this.horizSplitContainer.Name = "horizSplitContainer"; + this.horizSplitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // horizSplitContainer.Panel1 + // + this.horizSplitContainer.Panel1.Controls.Add(this.stylePictureBox); + this.horizSplitContainer.Panel1.Controls.Add(this.fwButton); + this.horizSplitContainer.Panel1.Controls.Add(this.bwButton); + this.horizSplitContainer.Panel1.Controls.Add(this.teetgCountTextBox); + this.horizSplitContainer.Panel1.Controls.Add(this.teethCount); + // + // horizSplitContainer.Panel2 + // + this.horizSplitContainer.Panel2.Controls.Add(this.cancelButton); + this.horizSplitContainer.Panel2.Controls.Add(this.nextButton); + this.horizSplitContainer.Panel2.Controls.Add(this.backButton); + this.horizSplitContainer.Size = new System.Drawing.Size(284, 262); + this.horizSplitContainer.SplitterDistance = 182; + this.horizSplitContainer.TabIndex = 1; + // + // stylePictureBox + // + this.stylePictureBox.Location = new System.Drawing.Point(79, 12); + this.stylePictureBox.Name = "stylePictureBox"; + this.stylePictureBox.Size = new System.Drawing.Size(128, 128); + this.stylePictureBox.TabIndex = 7; + this.stylePictureBox.TabStop = false; + // + // fwButton + // + this.fwButton.Location = new System.Drawing.Point(220, 54); + this.fwButton.Name = "fwButton"; + this.fwButton.Size = new System.Drawing.Size(41, 44); + this.fwButton.TabIndex = 6; + this.fwButton.Text = "->"; + this.fwButton.UseVisualStyleBackColor = true; + this.fwButton.Click += new System.EventHandler(this.fwButton_Click); + // + // bwButton + // + this.bwButton.Location = new System.Drawing.Point(24, 54); + this.bwButton.Name = "bwButton"; + this.bwButton.Size = new System.Drawing.Size(41, 44); + this.bwButton.TabIndex = 5; + this.bwButton.Text = "<-"; + this.bwButton.UseVisualStyleBackColor = true; + this.bwButton.Click += new System.EventHandler(this.bwButton_Click); + // + // teetgCountTextBox + // + this.teetgCountTextBox.Location = new System.Drawing.Point(175, 150); + this.teetgCountTextBox.Name = "teetgCountTextBox"; + this.teetgCountTextBox.Size = new System.Drawing.Size(32, 20); + this.teetgCountTextBox.TabIndex = 4; + this.teetgCountTextBox.TextChanged += new System.EventHandler(this.anyTextBox_TextChanged); + // + // teethCount + // + this.teethCount.AutoSize = true; + this.teethCount.Location = new System.Drawing.Point(76, 153); + this.teethCount.Name = "teethCount"; + this.teethCount.Size = new System.Drawing.Size(65, 13); + this.teethCount.TabIndex = 1; + this.teethCount.Text = "Teeth count"; + // + // cancelButton + // + this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cancelButton.Location = new System.Drawing.Point(186, 17); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(75, 42); + this.cancelButton.TabIndex = 27; + this.cancelButton.Text = "&Cancel"; + this.cancelButton.UseVisualStyleBackColor = true; + this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click); + // + // nextButton + // + this.nextButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.nextButton.Location = new System.Drawing.Point(105, 17); + this.nextButton.Name = "nextButton"; + this.nextButton.Size = new System.Drawing.Size(75, 42); + this.nextButton.TabIndex = 26; + this.nextButton.Text = "&Next >"; + this.nextButton.UseVisualStyleBackColor = true; + this.nextButton.Click += new System.EventHandler(this.nextButton_Click); + // + // backButton + // + this.backButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.backButton.DialogResult = System.Windows.Forms.DialogResult.Retry; + this.backButton.Location = new System.Drawing.Point(24, 17); + this.backButton.Name = "backButton"; + this.backButton.Size = new System.Drawing.Size(75, 42); + this.backButton.TabIndex = 25; + this.backButton.Text = "< &Back"; + this.backButton.UseVisualStyleBackColor = true; + this.backButton.Click += new System.EventHandler(this.backButton_Click); + // + // Roi1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(284, 262); + this.Controls.Add(this.horizSplitContainer); + this.Name = "Roi1"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Pointer/arrow style"; + this.Load += new System.EventHandler(this.Roi1_Load); + this.horizSplitContainer.Panel1.ResumeLayout(false); + this.horizSplitContainer.Panel1.PerformLayout(); + this.horizSplitContainer.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.horizSplitContainer)).EndInit(); + this.horizSplitContainer.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.stylePictureBox)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer horizSplitContainer; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.Button nextButton; + private System.Windows.Forms.Button backButton; + private System.Windows.Forms.TextBox teetgCountTextBox; + private System.Windows.Forms.Label teethCount; + private System.Windows.Forms.PictureBox stylePictureBox; + private System.Windows.Forms.Button fwButton; + private System.Windows.Forms.Button bwButton; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/TestWizard/Roi1.cs b/TBF_V2/Sources/TBF/TBF/TestWizard/Roi1.cs new file mode 100644 index 00000000..dc412d96 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/TestWizard/Roi1.cs @@ -0,0 +1,136 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Drawing; +using System.Windows.Forms; +using TBF.Resources; + +namespace TBF.TestWizard +{ + public partial class Roi1 : Form + { + RoiData roiData; + + const int StylesCount = 3; + int styleIdx; /// 0 .. StylesCount - 1 + + + public Roi1() + { + InitializeComponent(); + } + + public Roi1(bool first, bool last, RoiData roiData) + : this() + { + this.roiData = roiData; + + Text = "Pointer/arrow style"; + teethCount.Text = "Teeth count"; + + backButton.Text = Strings.BackBtnText; + nextButton.Text = Strings.NextBtnText; + cancelButton.Text = Strings.CancelBtnText; + + if (first) backButton.Visible = false; + if (last) nextButton.Text = Strings.FinishBtnText; + } + + + private void Roi1_Load(object sender, EventArgs e) + { + if (roiData == null) return; + + RefreshWizardPage(); + } + + void RefreshWizardPage() + { + teetgCountTextBox.Text = roiData.TeethCount.ToString(); + styleIdx = roiData.StyleIdx; + LoadImageAndUpdateFwBwBtns(); + nextButton.Enabled = IsFormValid(); + } + + void LoadImageAndUpdateFwBwBtns() + { + switch (styleIdx) + { + default: + case 0: + stylePictureBox.Image = new Bitmap(TBF.Properties.Resources.RoiStyle1); + break; + case 1: + stylePictureBox.Image = new Bitmap(TBF.Properties.Resources.RoiStyle2); + break; + case 2: + stylePictureBox.Image = new Bitmap(TBF.Properties.Resources.RoiStyle3); + break; + } + + fwButton.Enabled = styleIdx < StylesCount - 1; + bwButton.Enabled = styleIdx > 0; + } + + void UpdateTest() + { + roiData.StyleIdx = styleIdx; + roiData.TeethCount = int.Parse(teetgCountTextBox.Text); + } + + bool IsFormValid() + { + int teethCnt; + return int.TryParse(teetgCountTextBox.Text, out teethCnt) + && teethCnt > 0 && teethCnt <= 20 + && styleIdx >= 0 && styleIdx < StylesCount + && (styleIdx == 2 || teethCnt == 1); + } + + private void backButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Retry; + Close(); + } + + private void nextButton_Click(object sender, EventArgs e) + { + if (roiData != null && IsFormValid()) + { + UpdateTest(); + DialogResult = DialogResult.OK; + Close(); + } + else + { + DialogResult = DialogResult.None; + } + } + + private void cancelButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + private void anyTextBox_TextChanged(object sender, EventArgs e) + { + nextButton.Enabled = IsFormValid(); + } + + private void bwButton_Click(object sender, EventArgs e) + { + if (styleIdx > 0) styleIdx--; + LoadImageAndUpdateFwBwBtns(); + nextButton.Enabled = IsFormValid(); + } + + private void fwButton_Click(object sender, EventArgs e) + { + if (styleIdx < StylesCount - 1) styleIdx++; + LoadImageAndUpdateFwBwBtns(); + nextButton.Enabled = IsFormValid(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/TestWizard/Roi1.resx b/TBF_V2/Sources/TBF/TBF/TestWizard/Roi1.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/TestWizard/Roi1.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/TestWizard/Roi2.Designer.cs b/TBF_V2/Sources/TBF/TBF/TestWizard/Roi2.Designer.cs new file mode 100644 index 00000000..d96d228c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/TestWizard/Roi2.Designer.cs @@ -0,0 +1,172 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.TestWizard +{ + partial class Roi2 + { + /// + /// 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() + { + this.horizSplitContainer = new System.Windows.Forms.SplitContainer(); + this.r2TextBox = new System.Windows.Forms.TextBox(); + this.r1TextBox = new System.Windows.Forms.TextBox(); + this.r2Label = new System.Windows.Forms.Label(); + this.r1Label = new System.Windows.Forms.Label(); + this.cancelButton = new System.Windows.Forms.Button(); + this.nextButton = new System.Windows.Forms.Button(); + this.backButton = new System.Windows.Forms.Button(); + ((System.ComponentModel.ISupportInitialize)(this.horizSplitContainer)).BeginInit(); + this.horizSplitContainer.Panel1.SuspendLayout(); + this.horizSplitContainer.Panel2.SuspendLayout(); + this.horizSplitContainer.SuspendLayout(); + this.SuspendLayout(); + // + // horizSplitContainer + // + this.horizSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill; + this.horizSplitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.horizSplitContainer.Location = new System.Drawing.Point(0, 0); + this.horizSplitContainer.Name = "horizSplitContainer"; + this.horizSplitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // horizSplitContainer.Panel1 + // + this.horizSplitContainer.Panel1.Controls.Add(this.r2TextBox); + this.horizSplitContainer.Panel1.Controls.Add(this.r1TextBox); + this.horizSplitContainer.Panel1.Controls.Add(this.r2Label); + this.horizSplitContainer.Panel1.Controls.Add(this.r1Label); + // + // horizSplitContainer.Panel2 + // + this.horizSplitContainer.Panel2.Controls.Add(this.cancelButton); + this.horizSplitContainer.Panel2.Controls.Add(this.nextButton); + this.horizSplitContainer.Panel2.Controls.Add(this.backButton); + this.horizSplitContainer.Size = new System.Drawing.Size(284, 262); + this.horizSplitContainer.SplitterDistance = 182; + this.horizSplitContainer.TabIndex = 1; + // + // r2TextBox + // + this.r2TextBox.Location = new System.Drawing.Point(137, 93); + this.r2TextBox.Name = "r2TextBox"; + this.r2TextBox.Size = new System.Drawing.Size(59, 20); + this.r2TextBox.TabIndex = 5; + this.r2TextBox.TextChanged += new System.EventHandler(this.anyTextBox_TextChanged); + // + // r1TextBox + // + this.r1TextBox.Location = new System.Drawing.Point(137, 63); + this.r1TextBox.Name = "r1TextBox"; + this.r1TextBox.Size = new System.Drawing.Size(59, 20); + this.r1TextBox.TabIndex = 4; + this.r1TextBox.TextChanged += new System.EventHandler(this.anyTextBox_TextChanged); + // + // r2Label + // + this.r2Label.AutoSize = true; + this.r2Label.Location = new System.Drawing.Point(83, 96); + this.r2Label.Name = "r2Label"; + this.r2Label.Size = new System.Drawing.Size(21, 13); + this.r2Label.TabIndex = 2; + this.r2Label.Text = "R2"; + // + // r1Label + // + this.r1Label.AutoSize = true; + this.r1Label.Location = new System.Drawing.Point(83, 66); + this.r1Label.Name = "r1Label"; + this.r1Label.Size = new System.Drawing.Size(21, 13); + this.r1Label.TabIndex = 1; + this.r1Label.Text = "R1"; + // + // cancelButton + // + this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cancelButton.Location = new System.Drawing.Point(186, 17); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(75, 42); + this.cancelButton.TabIndex = 27; + this.cancelButton.Text = "&Cancel"; + this.cancelButton.UseVisualStyleBackColor = true; + this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click); + // + // nextButton + // + this.nextButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.nextButton.Location = new System.Drawing.Point(105, 17); + this.nextButton.Name = "nextButton"; + this.nextButton.Size = new System.Drawing.Size(75, 42); + this.nextButton.TabIndex = 26; + this.nextButton.Text = "&Next >"; + this.nextButton.UseVisualStyleBackColor = true; + this.nextButton.Click += new System.EventHandler(this.nextButton_Click); + // + // backButton + // + this.backButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.backButton.DialogResult = System.Windows.Forms.DialogResult.Retry; + this.backButton.Location = new System.Drawing.Point(24, 17); + this.backButton.Name = "backButton"; + this.backButton.Size = new System.Drawing.Size(75, 42); + this.backButton.TabIndex = 25; + this.backButton.Text = "< &Back"; + this.backButton.UseVisualStyleBackColor = true; + this.backButton.Click += new System.EventHandler(this.backButton_Click); + // + // Roi2 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(284, 262); + this.Controls.Add(this.horizSplitContainer); + this.Name = "Roi2"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Pointer/arrow size"; + this.Load += new System.EventHandler(this.Roi2_Load_1); + this.horizSplitContainer.Panel1.ResumeLayout(false); + this.horizSplitContainer.Panel1.PerformLayout(); + this.horizSplitContainer.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.horizSplitContainer)).EndInit(); + this.horizSplitContainer.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer horizSplitContainer; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.Button nextButton; + private System.Windows.Forms.Button backButton; + private System.Windows.Forms.TextBox r2TextBox; + private System.Windows.Forms.TextBox r1TextBox; + private System.Windows.Forms.Label r2Label; + private System.Windows.Forms.Label r1Label; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/TestWizard/Roi2.cs b/TBF_V2/Sources/TBF/TBF/TestWizard/Roi2.cs new file mode 100644 index 00000000..d7d40c57 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/TestWizard/Roi2.cs @@ -0,0 +1,97 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using TBF.Resources; + +namespace TBF.TestWizard +{ + public partial class Roi2 : Form + { + RoiData roiData; + + + public Roi2() + { + InitializeComponent(); + } + + public Roi2(bool first, bool last, RoiData roiData) + : this() + { + this.roiData = roiData; + + Text = "Pointer/arrow size"; + r1Label.Text = "R1"; + r2Label.Text = "R2"; + + backButton.Text = Strings.BackBtnText; + nextButton.Text = Strings.NextBtnText; + cancelButton.Text = Strings.CancelBtnText; + + if (first) backButton.Visible = false; + if (last) nextButton.Text = Strings.FinishBtnText; + } + + + private void Roi2_Load_1(object sender, EventArgs e) + { + if (roiData == null) return; + + RefreshWizardPage(); + } + + void RefreshWizardPage() + { + r1TextBox.Text = roiData.R1.ToString(); + r2TextBox.Text = roiData.R2.ToString(); + nextButton.Enabled = IsFormValid(); + } + + void UpdateTest() + { + roiData.R1 = int.Parse(r1TextBox.Text); + roiData.R2 = int.Parse(r2TextBox.Text); + } + + bool IsFormValid() + { + int r1, r2; + return int.TryParse(r1TextBox.Text, out r1) && + int.TryParse(r2TextBox.Text, out r2) && + (r2 > r1) && (r1 > 0); + } + + private void backButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Retry; + Close(); + } + + private void nextButton_Click(object sender, EventArgs e) + { + if (roiData != null && IsFormValid()) + { + UpdateTest(); + DialogResult = DialogResult.OK; + Close(); + } + else + { + DialogResult = DialogResult.None; + } + } + + private void cancelButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + private void anyTextBox_TextChanged(object sender, EventArgs e) + { + nextButton.Enabled = IsFormValid(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/TestWizard/Roi2.resx b/TBF_V2/Sources/TBF/TBF/TestWizard/Roi2.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/TestWizard/Roi2.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/TestWizard/Roi3.Designer.cs b/TBF_V2/Sources/TBF/TBF/TestWizard/Roi3.Designer.cs new file mode 100644 index 00000000..910bcbc6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/TestWizard/Roi3.Designer.cs @@ -0,0 +1,173 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.TestWizard +{ + partial class Roi3 + { + /// + /// 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() + { + this.horizSplitContainer = new System.Windows.Forms.SplitContainer(); + this.directionComboBox = new System.Windows.Forms.ComboBox(); + this.directionLabel = new System.Windows.Forms.Label(); + this.pulsesPerLiterTextBox = new System.Windows.Forms.TextBox(); + this.pulsesPerLiterLabel = new System.Windows.Forms.Label(); + this.cancelButton = new System.Windows.Forms.Button(); + this.nextButton = new System.Windows.Forms.Button(); + this.backButton = new System.Windows.Forms.Button(); + ((System.ComponentModel.ISupportInitialize)(this.horizSplitContainer)).BeginInit(); + this.horizSplitContainer.Panel1.SuspendLayout(); + this.horizSplitContainer.Panel2.SuspendLayout(); + this.horizSplitContainer.SuspendLayout(); + this.SuspendLayout(); + // + // horizSplitContainer + // + this.horizSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill; + this.horizSplitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.horizSplitContainer.Location = new System.Drawing.Point(0, 0); + this.horizSplitContainer.Name = "horizSplitContainer"; + this.horizSplitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // horizSplitContainer.Panel1 + // + this.horizSplitContainer.Panel1.Controls.Add(this.directionComboBox); + this.horizSplitContainer.Panel1.Controls.Add(this.directionLabel); + this.horizSplitContainer.Panel1.Controls.Add(this.pulsesPerLiterTextBox); + this.horizSplitContainer.Panel1.Controls.Add(this.pulsesPerLiterLabel); + // + // horizSplitContainer.Panel2 + // + this.horizSplitContainer.Panel2.Controls.Add(this.cancelButton); + this.horizSplitContainer.Panel2.Controls.Add(this.nextButton); + this.horizSplitContainer.Panel2.Controls.Add(this.backButton); + this.horizSplitContainer.Size = new System.Drawing.Size(284, 262); + this.horizSplitContainer.SplitterDistance = 182; + this.horizSplitContainer.TabIndex = 1; + // + // directionComboBox + // + this.directionComboBox.FormattingEnabled = true; + this.directionComboBox.Location = new System.Drawing.Point(129, 98); + this.directionComboBox.Name = "directionComboBox"; + this.directionComboBox.Size = new System.Drawing.Size(132, 21); + this.directionComboBox.TabIndex = 5; + this.directionComboBox.SelectedIndexChanged += new System.EventHandler(this.anyTextBox_TextChanged); + // + // directionLabel + // + this.directionLabel.AutoSize = true; + this.directionLabel.Location = new System.Drawing.Point(21, 101); + this.directionLabel.Name = "directionLabel"; + this.directionLabel.Size = new System.Drawing.Size(86, 13); + this.directionLabel.TabIndex = 4; + this.directionLabel.Text = "Turning direction"; + // + // pulsesPerLiterTextBox + // + this.pulsesPerLiterTextBox.Location = new System.Drawing.Point(129, 57); + this.pulsesPerLiterTextBox.Name = "pulsesPerLiterTextBox"; + this.pulsesPerLiterTextBox.Size = new System.Drawing.Size(132, 20); + this.pulsesPerLiterTextBox.TabIndex = 3; + this.pulsesPerLiterTextBox.TextChanged += new System.EventHandler(this.anyTextBox_TextChanged); + // + // pulsesPerLiterLabel + // + this.pulsesPerLiterLabel.AutoSize = true; + this.pulsesPerLiterLabel.Location = new System.Drawing.Point(21, 60); + this.pulsesPerLiterLabel.Name = "pulsesPerLiterLabel"; + this.pulsesPerLiterLabel.Size = new System.Drawing.Size(75, 13); + this.pulsesPerLiterLabel.TabIndex = 2; + this.pulsesPerLiterLabel.Text = "Pulses per liter"; + // + // cancelButton + // + this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cancelButton.Location = new System.Drawing.Point(186, 17); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(75, 42); + this.cancelButton.TabIndex = 2; + this.cancelButton.Text = "&Cancel"; + this.cancelButton.UseVisualStyleBackColor = true; + this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click); + // + // nextButton + // + this.nextButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.nextButton.Location = new System.Drawing.Point(105, 17); + this.nextButton.Name = "nextButton"; + this.nextButton.Size = new System.Drawing.Size(75, 42); + this.nextButton.TabIndex = 1; + this.nextButton.Text = "&Next >"; + this.nextButton.UseVisualStyleBackColor = true; + this.nextButton.Click += new System.EventHandler(this.nextButton_Click); + // + // backButton + // + this.backButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.backButton.DialogResult = System.Windows.Forms.DialogResult.Retry; + this.backButton.Location = new System.Drawing.Point(24, 17); + this.backButton.Name = "backButton"; + this.backButton.Size = new System.Drawing.Size(75, 42); + this.backButton.TabIndex = 0; + this.backButton.Text = "< &Back"; + this.backButton.UseVisualStyleBackColor = true; + this.backButton.Click += new System.EventHandler(this.backButton_Click); + // + // Roi3 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(284, 262); + this.Controls.Add(this.horizSplitContainer); + this.Name = "Roi3"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "ROI Data"; + this.Load += new System.EventHandler(this.Roi3_Load); + this.horizSplitContainer.Panel1.ResumeLayout(false); + this.horizSplitContainer.Panel1.PerformLayout(); + this.horizSplitContainer.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.horizSplitContainer)).EndInit(); + this.horizSplitContainer.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer horizSplitContainer; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.Button nextButton; + private System.Windows.Forms.Button backButton; + private System.Windows.Forms.TextBox pulsesPerLiterTextBox; + private System.Windows.Forms.Label pulsesPerLiterLabel; + private System.Windows.Forms.ComboBox directionComboBox; + private System.Windows.Forms.Label directionLabel; + + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/TestWizard/Roi3.cs b/TBF_V2/Sources/TBF/TBF/TestWizard/Roi3.cs new file mode 100644 index 00000000..1960eb93 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/TestWizard/Roi3.cs @@ -0,0 +1,100 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using TBF.Resources; + +namespace TBF.TestWizard +{ + public partial class Roi3 : Form + { + RoiData roiData; + + + public Roi3() + { + InitializeComponent(); + } + + public Roi3(bool first, bool last, RoiData roiData) + : this() + { + this.roiData = roiData; + + Text = Strings.ROI_Data; + pulsesPerLiterLabel.Text = Strings.PulsesPerLtr; + directionLabel.Text = Strings.Turning_direction; + + backButton.Text = Strings.BackBtnText; + nextButton.Text = Strings.NextBtnText; + cancelButton.Text = Strings.CancelBtnText; + + if (first) backButton.Visible = false; + if (last) nextButton.Text = Strings.FinishBtnText; + } + + + private void Roi3_Load(object sender, EventArgs e) + { + if (roiData == null) return; + + directionComboBox.Items.Add(Strings.Clockwise); + directionComboBox.Items.Add(Strings.Counterclockwise); + + RefreshWizardPage(); + } + + void RefreshWizardPage() + { + pulsesPerLiterTextBox.Text = roiData.PulsesPerLiter.ToString(); + directionComboBox.Text = (roiData.Direction == TurningDirection.Clockwise) ? Strings.Clockwise : Strings.Counterclockwise; + + nextButton.Enabled = IsFormValid(); + } + + void UpdateTest() + { + roiData.PulsesPerLiter = Utils.ParseUDouble(pulsesPerLiterTextBox.Text); + roiData.Direction = (directionComboBox.Text == Strings.Clockwise) ? TurningDirection.Clockwise : TurningDirection.Counterclockwise; + } + + bool IsFormValid() + { + double dummy; + return Utils.TryParseUDouble(pulsesPerLiterTextBox.Text, out dummy) && + directionComboBox.Items.Contains(directionComboBox.Text); + } + + private void backButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Retry; + Close(); + } + + private void nextButton_Click(object sender, EventArgs e) + { + if (IsFormValid()) + { + UpdateTest(); + DialogResult = DialogResult.OK; + Close(); + } + else + { + DialogResult = DialogResult.None; + } + } + + private void cancelButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + private void anyTextBox_TextChanged(object sender, EventArgs e) + { + nextButton.Enabled = IsFormValid(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/TestWizard/Roi3.resx b/TBF_V2/Sources/TBF/TBF/TestWizard/Roi3.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/TestWizard/Roi3.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/TestWizard/RoiData.cs b/TBF_V2/Sources/TBF/TBF/TestWizard/RoiData.cs new file mode 100644 index 00000000..a46a69e9 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/TestWizard/RoiData.cs @@ -0,0 +1,89 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.TestWizard +{ + public enum TurningDirection + { + Clockwise, + Counterclockwise, + Count, + } + + public class RoiData + { + /// Set by the wizard + public int StyleIdx; + public int TeethCount; + public int R1; + public int R2; + public double PulsesPerLiter; + public TurningDirection Direction; + + /// Calculated + public int WidHgh; + public int CxCy; + public int R3; + public int P1; + public int P2; + public int N; + public double Q; /// [m3/h] + + + public RoiData() + { + TeethCount = 1; + R1 = 30; + R2 = 80; + PulsesPerLiter = 36.0; + } + + + /// + /// Calculate additional data from data entered by the wizard + /// + public void Calculate() + { + WidHgh = 2 * R2 + 1; + CxCy = R2; + + double acqTime; /// Duration of image sequence + switch (StyleIdx) + { + default: + case 0: + R3 = (int)System.Math.Round(0.8 * R2); + P1 = 1; + P2 = 19; + N = 10; + acqTime = 3.0; + break; + case 1: + R3 = 0; + P1 = 1; + P2 = 19; + N = 10; + acqTime = 3.0; + break; + case 2: + R3 = 0; + P1 = 1; + P2 = 1; + N = 10; + acqTime = 3.0; + break; + } + + double vol = 360.0 / PulsesPerLiter; /// Liters per 1 rotation + double flowLps = vol / acqTime; + Q = 3.6 * flowLps; /// Convert to m3 / h + } + + public string GetRoiParams() + { + return string.Format("{0} {0} {1} {1} {2} {3} {4} 0 360 360 {5} {6}", + WidHgh, CxCy, R1, R2, R3, TeethCount, + (Direction == TestWizard.TurningDirection.Clockwise) ? 1 : -1); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/TestWizard/VolumeAndErrorSelection.Designer.cs b/TBF_V2/Sources/TBF/TBF/TestWizard/VolumeAndErrorSelection.Designer.cs new file mode 100644 index 00000000..1b3dcc36 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/TestWizard/VolumeAndErrorSelection.Designer.cs @@ -0,0 +1,335 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.TestWizard +{ + partial class VolumeAndErrorSelection + { + /// + /// 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() + { + this.horizSplitContainer = new System.Windows.Forms.SplitContainer(); + this.tabControl1 = new System.Windows.Forms.TabControl(); + this.tabPage1 = new System.Windows.Forms.TabPage(); + this.errLoPctLabel = new System.Windows.Forms.Label(); + this.errHiPctLabel = new System.Windows.Forms.Label(); + this.errHiPctTextBox = new System.Windows.Forms.TextBox(); + this.errLoPctTextBox = new System.Windows.Forms.TextBox(); + this.tabPage2 = new System.Windows.Forms.TabPage(); + this.classComboBox = new System.Windows.Forms.ComboBox(); + this.classLabel = new System.Windows.Forms.Label(); + this.qpLabel = new System.Windows.Forms.Label(); + this.qpTextBox = new System.Windows.Forms.TextBox(); + this.uncertaintyTextBox = new System.Windows.Forms.TextBox(); + this.durationTextBox = new System.Windows.Forms.TextBox(); + this.volumeTextBox = new System.Windows.Forms.TextBox(); + this.uncertaintyLabel = new System.Windows.Forms.Label(); + this.durationLabel = new System.Windows.Forms.Label(); + this.volumeLabel = new System.Windows.Forms.Label(); + this.cancelButton = new System.Windows.Forms.Button(); + this.nextButton = new System.Windows.Forms.Button(); + this.backButton = new System.Windows.Forms.Button(); + ((System.ComponentModel.ISupportInitialize)(this.horizSplitContainer)).BeginInit(); + this.horizSplitContainer.Panel1.SuspendLayout(); + this.horizSplitContainer.Panel2.SuspendLayout(); + this.horizSplitContainer.SuspendLayout(); + this.tabControl1.SuspendLayout(); + this.tabPage1.SuspendLayout(); + this.tabPage2.SuspendLayout(); + this.SuspendLayout(); + // + // horizSplitContainer + // + this.horizSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill; + this.horizSplitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.horizSplitContainer.Location = new System.Drawing.Point(0, 0); + this.horizSplitContainer.Name = "horizSplitContainer"; + this.horizSplitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // horizSplitContainer.Panel1 + // + this.horizSplitContainer.Panel1.Controls.Add(this.tabControl1); + this.horizSplitContainer.Panel1.Controls.Add(this.uncertaintyTextBox); + this.horizSplitContainer.Panel1.Controls.Add(this.durationTextBox); + this.horizSplitContainer.Panel1.Controls.Add(this.volumeTextBox); + this.horizSplitContainer.Panel1.Controls.Add(this.uncertaintyLabel); + this.horizSplitContainer.Panel1.Controls.Add(this.durationLabel); + this.horizSplitContainer.Panel1.Controls.Add(this.volumeLabel); + // + // horizSplitContainer.Panel2 + // + this.horizSplitContainer.Panel2.Controls.Add(this.cancelButton); + this.horizSplitContainer.Panel2.Controls.Add(this.nextButton); + this.horizSplitContainer.Panel2.Controls.Add(this.backButton); + this.horizSplitContainer.Size = new System.Drawing.Size(284, 262); + this.horizSplitContainer.SplitterDistance = 182; + this.horizSplitContainer.TabIndex = 1; + // + // tabControl1 + // + this.tabControl1.Controls.Add(this.tabPage1); + this.tabControl1.Controls.Add(this.tabPage2); + this.tabControl1.Location = new System.Drawing.Point(0, 0); + this.tabControl1.Name = "tabControl1"; + this.tabControl1.SelectedIndex = 0; + this.tabControl1.Size = new System.Drawing.Size(284, 93); + this.tabControl1.TabIndex = 0; + this.tabControl1.SelectedIndexChanged += new System.EventHandler(this.tabControl1_SelectedIndexChanged); + // + // tabPage1 + // + this.tabPage1.BackColor = System.Drawing.SystemColors.Control; + this.tabPage1.Controls.Add(this.errLoPctLabel); + this.tabPage1.Controls.Add(this.errHiPctLabel); + this.tabPage1.Controls.Add(this.errHiPctTextBox); + this.tabPage1.Controls.Add(this.errLoPctTextBox); + this.tabPage1.Location = new System.Drawing.Point(4, 22); + this.tabPage1.Name = "tabPage1"; + this.tabPage1.Padding = new System.Windows.Forms.Padding(3); + this.tabPage1.Size = new System.Drawing.Size(276, 67); + this.tabPage1.TabIndex = 0; + // + // errLoPctLabel + // + this.errLoPctLabel.AutoSize = true; + this.errLoPctLabel.Location = new System.Drawing.Point(31, 16); + this.errLoPctLabel.Name = "errLoPctLabel"; + this.errLoPctLabel.Size = new System.Drawing.Size(85, 13); + this.errLoPctLabel.TabIndex = 0; + this.errLoPctLabel.Text = "Error low limit [%]"; + // + // errHiPctLabel + // + this.errHiPctLabel.AutoSize = true; + this.errHiPctLabel.Location = new System.Drawing.Point(31, 41); + this.errHiPctLabel.Name = "errHiPctLabel"; + this.errHiPctLabel.Size = new System.Drawing.Size(89, 13); + this.errHiPctLabel.TabIndex = 2; + this.errHiPctLabel.Text = "Error high limit [%]"; + // + // errHiPctTextBox + // + this.errHiPctTextBox.Location = new System.Drawing.Point(146, 38); + this.errHiPctTextBox.Name = "errHiPctTextBox"; + this.errHiPctTextBox.Size = new System.Drawing.Size(86, 20); + this.errHiPctTextBox.TabIndex = 3; + this.errHiPctTextBox.TextChanged += new System.EventHandler(this.anyTextBox_TextChanged); + // + // errLoPctTextBox + // + this.errLoPctTextBox.Location = new System.Drawing.Point(146, 13); + this.errLoPctTextBox.Name = "errLoPctTextBox"; + this.errLoPctTextBox.Size = new System.Drawing.Size(86, 20); + this.errLoPctTextBox.TabIndex = 1; + this.errLoPctTextBox.TextChanged += new System.EventHandler(this.anyTextBox_TextChanged); + // + // tabPage2 + // + this.tabPage2.BackColor = System.Drawing.SystemColors.Control; + this.tabPage2.Controls.Add(this.classComboBox); + this.tabPage2.Controls.Add(this.classLabel); + this.tabPage2.Controls.Add(this.qpLabel); + this.tabPage2.Controls.Add(this.qpTextBox); + this.tabPage2.Location = new System.Drawing.Point(4, 22); + this.tabPage2.Name = "tabPage2"; + this.tabPage2.Padding = new System.Windows.Forms.Padding(3); + this.tabPage2.Size = new System.Drawing.Size(276, 67); + this.tabPage2.TabIndex = 1; + // + // classComboBox + // + this.classComboBox.FormattingEnabled = true; + this.classComboBox.Items.AddRange(new object[] { + "1", + "2", + "3"}); + this.classComboBox.Location = new System.Drawing.Point(146, 13); + this.classComboBox.Name = "classComboBox"; + this.classComboBox.Size = new System.Drawing.Size(86, 21); + this.classComboBox.TabIndex = 1; + this.classComboBox.TextChanged += new System.EventHandler(this.anyTextBox_TextChanged); + // + // classLabel + // + this.classLabel.AutoSize = true; + this.classLabel.Location = new System.Drawing.Point(31, 17); + this.classLabel.Name = "classLabel"; + this.classLabel.Size = new System.Drawing.Size(32, 13); + this.classLabel.TabIndex = 0; + this.classLabel.Text = "Class"; + // + // qpLabel + // + this.qpLabel.AutoSize = true; + this.qpLabel.Location = new System.Drawing.Point(31, 42); + this.qpLabel.Name = "qpLabel"; + this.qpLabel.Size = new System.Drawing.Size(55, 13); + this.qpLabel.TabIndex = 2; + this.qpLabel.Text = "Qp [m3/h]"; + // + // qpTextBox + // + this.qpTextBox.Location = new System.Drawing.Point(146, 39); + this.qpTextBox.Name = "qpTextBox"; + this.qpTextBox.Size = new System.Drawing.Size(86, 20); + this.qpTextBox.TabIndex = 3; + this.qpTextBox.TextChanged += new System.EventHandler(this.anyTextBox_TextChanged); + // + // uncertaintyTextBox + // + this.uncertaintyTextBox.Location = new System.Drawing.Point(150, 100); + this.uncertaintyTextBox.Name = "uncertaintyTextBox"; + this.uncertaintyTextBox.Size = new System.Drawing.Size(86, 20); + this.uncertaintyTextBox.TabIndex = 2; + this.uncertaintyTextBox.TextChanged += new System.EventHandler(this.anyTextBox_TextChanged); + // + // durationTextBox + // + this.durationTextBox.Location = new System.Drawing.Point(150, 149); + this.durationTextBox.Name = "durationTextBox"; + this.durationTextBox.Size = new System.Drawing.Size(86, 20); + this.durationTextBox.TabIndex = 6; + this.durationTextBox.TextChanged += new System.EventHandler(this.durationTextBox_TextChanged); + // + // volumeTextBox + // + this.volumeTextBox.Location = new System.Drawing.Point(150, 124); + this.volumeTextBox.Name = "volumeTextBox"; + this.volumeTextBox.Size = new System.Drawing.Size(86, 20); + this.volumeTextBox.TabIndex = 4; + this.volumeTextBox.TextChanged += new System.EventHandler(this.volumeTextBox_TextChanged); + // + // uncertaintyLabel + // + this.uncertaintyLabel.AutoSize = true; + this.uncertaintyLabel.Location = new System.Drawing.Point(35, 103); + this.uncertaintyLabel.Name = "uncertaintyLabel"; + this.uncertaintyLabel.Size = new System.Drawing.Size(78, 13); + this.uncertaintyLabel.TabIndex = 1; + this.uncertaintyLabel.Text = "Uncertainty [%]"; + // + // durationLabel + // + this.durationLabel.AutoSize = true; + this.durationLabel.Location = new System.Drawing.Point(35, 152); + this.durationLabel.Name = "durationLabel"; + this.durationLabel.Size = new System.Drawing.Size(83, 13); + this.durationLabel.TabIndex = 5; + this.durationLabel.Text = "Test duration [s]"; + // + // volumeLabel + // + this.volumeLabel.AutoSize = true; + this.volumeLabel.Location = new System.Drawing.Point(35, 127); + this.volumeLabel.Name = "volumeLabel"; + this.volumeLabel.Size = new System.Drawing.Size(53, 13); + this.volumeLabel.TabIndex = 3; + this.volumeLabel.Text = "Volume [l]"; + // + // cancelButton + // + this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cancelButton.Location = new System.Drawing.Point(186, 17); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(75, 42); + this.cancelButton.TabIndex = 2; + this.cancelButton.Text = "&Cancel"; + this.cancelButton.UseVisualStyleBackColor = true; + this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click); + // + // nextButton + // + this.nextButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.nextButton.Location = new System.Drawing.Point(105, 17); + this.nextButton.Name = "nextButton"; + this.nextButton.Size = new System.Drawing.Size(75, 42); + this.nextButton.TabIndex = 1; + this.nextButton.Text = "&Next >"; + this.nextButton.UseVisualStyleBackColor = true; + this.nextButton.Click += new System.EventHandler(this.nextButton_Click); + // + // backButton + // + this.backButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.backButton.DialogResult = System.Windows.Forms.DialogResult.Retry; + this.backButton.Location = new System.Drawing.Point(24, 17); + this.backButton.Name = "backButton"; + this.backButton.Size = new System.Drawing.Size(75, 42); + this.backButton.TabIndex = 0; + this.backButton.Text = "< &Back"; + this.backButton.UseVisualStyleBackColor = true; + this.backButton.Click += new System.EventHandler(this.backButton_Click); + // + // VolumeAndErrorSelection + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(284, 262); + this.Controls.Add(this.horizSplitContainer); + this.Name = "VolumeAndErrorSelection"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "VolumeAndErrorSelection"; + this.Load += new System.EventHandler(this.VolumeAndErrorSelection_Load); + this.horizSplitContainer.Panel1.ResumeLayout(false); + this.horizSplitContainer.Panel1.PerformLayout(); + this.horizSplitContainer.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.horizSplitContainer)).EndInit(); + this.horizSplitContainer.ResumeLayout(false); + this.tabControl1.ResumeLayout(false); + this.tabPage1.ResumeLayout(false); + this.tabPage1.PerformLayout(); + this.tabPage2.ResumeLayout(false); + this.tabPage2.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer horizSplitContainer; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.Button nextButton; + private System.Windows.Forms.Button backButton; + private System.Windows.Forms.TextBox errLoPctTextBox; + private System.Windows.Forms.TextBox errHiPctTextBox; + private System.Windows.Forms.TextBox durationTextBox; + private System.Windows.Forms.TextBox volumeTextBox; + private System.Windows.Forms.Label errHiPctLabel; + private System.Windows.Forms.Label errLoPctLabel; + private System.Windows.Forms.Label durationLabel; + private System.Windows.Forms.Label volumeLabel; + private System.Windows.Forms.TextBox uncertaintyTextBox; + private System.Windows.Forms.Label uncertaintyLabel; + private System.Windows.Forms.TabControl tabControl1; + private System.Windows.Forms.TabPage tabPage1; + private System.Windows.Forms.TabPage tabPage2; + private System.Windows.Forms.Label classLabel; + private System.Windows.Forms.Label qpLabel; + private System.Windows.Forms.TextBox qpTextBox; + private System.Windows.Forms.ComboBox classComboBox; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/TestWizard/VolumeAndErrorSelection.cs b/TBF_V2/Sources/TBF/TBF/TestWizard/VolumeAndErrorSelection.cs new file mode 100644 index 00000000..c16c3b06 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/TestWizard/VolumeAndErrorSelection.cs @@ -0,0 +1,187 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.Resources; + +namespace TBF.TestWizard +{ + public partial class VolumeAndErrorSelection : Form + { + enum TabId + { + WaterMeterTab, + HeatMeterTab, + } + + Test test; + TabId tabId; + + public VolumeAndErrorSelection() + { + InitializeComponent(); + + tabId = 0; + + Text = Strings.Volume_and_error_selection; + volumeLabel.Text = Strings.Volume + " [l]"; + durationLabel.Text = Strings.Duration_s; + errLoPctLabel.Text = Strings.Err_limit_neg_pct_chdr; + errHiPctLabel.Text = Strings.Err_limit_pos_pct_chdr; + uncertaintyLabel.Text = Strings.Uncertainty_pct_chdr; + backButton.Text = Strings.BackBtnText; + nextButton.Text = Strings.FinishBtnText; + cancelButton.Text = Strings.CancelBtnText; + tabPage1.Text = Strings.Water_Meter; + tabPage2.Text = Strings.Heat_meter; + classLabel.Text = Strings.Metrological_class; + qpLabel.Text = "Qp [m3/h]"; + } + + public VolumeAndErrorSelection(bool first, bool last, Test test) + : this() + { + this.test = test; + + if (first) backButton.Visible = false; + if (last) nextButton.Text = Strings.FinishBtnText; + } + + private void VolumeAndErrorSelection_Load(object sender, EventArgs e) + { + if (test == null) return; + + volumeTextBox.Text = test.Volume.ToString(); + durationTextBox.Text = test.TstTime.ToString(); + errLoPctTextBox.Text = test.ErrLimLo.ToString(); + errHiPctTextBox.Text = test.ErrLimHi.ToString(); + uncertaintyTextBox.Text = test.Uncertainty.ToString(); + classComboBox.Text = "2"; + + nextButton.Enabled = IsFormValid(); + } + + bool IsFormValid() + { + int idummy; + float dummy; + + bool tabsValid; + switch (tabId) + { + default: + case TabId.WaterMeterTab: + tabsValid = Utils.TryParseSFloat(errLoPctTextBox.Text, out dummy) + && Utils.TryParseSFloat(errHiPctTextBox.Text, out dummy); + break; + case TabId.HeatMeterTab: + tabsValid = int.TryParse(classComboBox.Text, out idummy) + && idummy >= 1 && idummy <= 3 + && Utils.TryParseUFloat(qpTextBox.Text, out dummy); + break; + } + + /// Return complete result + return tabsValid && Utils.TryParseUFloat(volumeTextBox.Text, out dummy) + && Utils.TryParseUFloat(durationTextBox.Text, out dummy) + && Utils.TryParseUFloat(uncertaintyTextBox.Text, out dummy); + } + + void UpdateTest() + { + test.Volume = Utils.ParseUFloat(volumeTextBox.Text); + test.TstTime = Utils.ParseUFloat(durationTextBox.Text); + test.Uncertainty = Utils.ParseUFloat(uncertaintyTextBox.Text); + + switch (tabId) + { + default: + case TabId.WaterMeterTab: + test.ErrLimLo = Utils.ParseSFloat(errLoPctTextBox.Text); + test.ErrLimHi = Utils.ParseSFloat(errHiPctTextBox.Text); + break; + case TabId.HeatMeterTab: + test.ErrLimLo = (float)int.Parse(classComboBox.Text); + test.ErrLimHi = -Utils.ParseUFloat(qpTextBox.Text); + break; + } + } + + private void backButton_Click(object sender, EventArgs e) + { + if (test != null && IsFormValid()) UpdateTest(); + DialogResult = DialogResult.Retry; + Close(); + } + + private void nextButton_Click(object sender, EventArgs e) + { + if (test != null && IsFormValid()) + { + UpdateTest(); + DialogResult = DialogResult.OK; + Close(); + } + else + { + DialogResult = DialogResult.None; + } + } + + private void cancelButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + private void anyTextBox_TextChanged(object sender, EventArgs e) + { + nextButton.Enabled = IsFormValid(); + } + + private void volumeTextBox_TextChanged(object sender, EventArgs e) + { + float Qave_lps = (test.Qfrom + test.Qto) / 7.2f; + float volume; + if (Utils.TryParseUFloat(volumeTextBox.Text, out volume)) + { + durationTextBox.TextChanged -= new System.EventHandler(this.durationTextBox_TextChanged); + durationTextBox.Text = (volume / Qave_lps).ToString(); + durationTextBox.TextChanged += new System.EventHandler(this.durationTextBox_TextChanged); + } + anyTextBox_TextChanged(sender, e); + } + + private void durationTextBox_TextChanged(object sender, EventArgs e) + { + float Qave_lps = (test.Qfrom + test.Qto) / 7.2f; + float testTime; + if (Utils.TryParseUFloat(durationTextBox.Text, out testTime)) + { + volumeTextBox.TextChanged -= new System.EventHandler(this.volumeTextBox_TextChanged); + volumeTextBox.Text = (testTime * Qave_lps).ToString(); + volumeTextBox.TextChanged += new System.EventHandler(this.volumeTextBox_TextChanged); + } + anyTextBox_TextChanged(sender, e); + } + + private void tabControl1_SelectedIndexChanged(object sender, EventArgs e) + { + switch ((TabId)tabControl1.SelectedIndex) + { + default: + case TabId.WaterMeterTab: + tabId = TabId.WaterMeterTab; + break; + + case TabId.HeatMeterTab: + tabId = TabId.HeatMeterTab; + break; + } + + nextButton.Enabled = IsFormValid(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/TestWizard/VolumeAndErrorSelection.resx b/TBF_V2/Sources/TBF/TBF/TestWizard/VolumeAndErrorSelection.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/TestWizard/VolumeAndErrorSelection.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/Tools/ByteFormatter.cs b/TBF_V2/Sources/TBF/TBF/Tools/ByteFormatter.cs new file mode 100644 index 00000000..fa1cca4a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Tools/ByteFormatter.cs @@ -0,0 +1,62 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Globalization; + +namespace TBF.Tools +{ + public class ByteFormatter : IFormatProvider, ICustomFormatter + { + public ByteFormatter() + { + } + + public object GetFormat(Type formatType) + { + if (formatType == typeof(ICustomFormatter)) + return this; + else + return null; + } + + public string Format(string fmt, object arg, IFormatProvider formatProvider) + { + if (arg.GetType() != typeof(byte)) + { + try + { + return HandleOtherFormats(fmt, arg); + } + catch (FormatException e) + { + throw new FormatException(String.Format("The format of '{0}' is invalid.", fmt), e); + } + } + + /// + /// Convert one byte to string + /// + byte b = (byte)arg; + if ((32 <= b) && (b <= 127)) return "'" + ((char)b).ToString() + "'"; + if ((char)b == '\r') return "'\\r'"; + if ((char)b == '\n') return "'\\n'"; + if ((char)b == '\t') return "'\\t'"; + if (b == 17) return "XON"; + if (b == 19) return "XOFF"; + if (b == 26) return "Ctrl-Z"; + return b.ToString(); + } + + + private string HandleOtherFormats(string format, object arg) + { + if (arg is IFormattable) + return ((IFormattable)arg).ToString(format, CultureInfo.CurrentCulture); + else if (arg != null) + return arg.ToString(); + else + return String.Empty; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Tools/IniUtil.cs b/TBF_V2/Sources/TBF/TBF/Tools/IniUtil.cs new file mode 100644 index 00000000..a2b3e18f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Tools/IniUtil.cs @@ -0,0 +1,108 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Text; +using System.Runtime.InteropServices; +using System.Collections.Specialized; + +namespace TBF.Tools +{ + /// + /// The class use the WinApi GetPrivateProfileSectionNames, + /// GetPrivateProfileSection, GetPrivateProfileString, WritePrivateProfileString + /// and present easy methods to work from a NET point of view. + /// Usage: + /// IniUtil ini = new IniUtil(@"C:\program files (x86)\myapp\myapp.ini"); + /// string country = ini.GetValue("Carrier","Country","NoCountry"); + /// + public class IniUtil + { + [DllImport("kernel32.dll")] + private static extern int GetPrivateProfileSectionNames(byte[] lpszReturnBuffer, int nSize, string lpFileName); + [DllImport("kernel32.dll")] + private static extern int GetPrivateProfileSection(string lpAppName, byte[] lpReturnedString, int nSize, string lpFileName); + [DllImport("kernel32.dll")] + private static extern int GetPrivateProfileString(string lpApplicationName, string lpKeyName, string lpDefault, byte[] lpReturnedString, int nSize, string lpFileName); + [DllImport("kernel32.dll")] + private static extern bool WritePrivateProfileString(string lpApplicationName, string lpKeyName, string lpString, string lpFileName); + + private const int VALUE_BUFFER = 511; + private const int SECTION_BUFFER = (1024 * 16); + private string m_sIniFile; + + /// + /// .ctor with INI file name + /// + /// Fullpath to the INI file + public IniUtil(string fileName) + { + m_sIniFile = fileName; + } + + /// + /// Set the value for a specific key in a section + /// + /// Section containing the key to write to + /// Key to insert/update + /// Value for the key + /// True if OK + public bool SetValue(string section, string key, string keyvalue) + { + return WritePrivateProfileString(section, key, keyvalue, m_sIniFile); + } + + /// + /// Gets the value of the specidied key in the specified section, + /// If the key doesn't exists returns the default value + /// + /// Section containing the key to read from + /// Required key + /// Value to return in case the key is missing + /// string value of the key or missing value + public string GetValue(string section, string key, string ifMissing) + { + byte[] by = new byte[VALUE_BUFFER]; + int n = GetPrivateProfileString(section, key, ifMissing, by, VALUE_BUFFER, m_sIniFile); + string s = Encoding.ASCII.GetString(by); + return s.Substring(0, n); + } + + /// + /// Returns the NameValueCollection for every key in the section + /// + /// Section name + /// NameValueCollection with nake=Key and value=value + public NameValueCollection GetSectionKeysvalues(string section) + { + NameValueCollection n = new NameValueCollection(); + if(section.Length > 0) + { + byte[] by = new byte[SECTION_BUFFER]; + int x = GetPrivateProfileSection(section, by, SECTION_BUFFER, m_sIniFile); + if(x > 0) x--; + string keysvalues = Encoding.ASCII.GetString(by, 0, x); + string[] temp = keysvalues.Split('\0'); + foreach(string s in temp) + { + string[] t = s.Split('='); + n.Add(t[0], t[1]); + } + } + return n; + } + + /// + /// Get the names of all sections in .INI + /// + /// string array with all the key names + public string[] GetSectionNames() + { + byte[] by = new byte[SECTION_BUFFER]; + int x = GetPrivateProfileSectionNames(by, SECTION_BUFFER, m_sIniFile); + if(x > 0) x--; + string keys = Encoding.ASCII.GetString(by, 0, x); + return keys.Split('\0'); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Tools/XmlTools.cs b/TBF_V2/Sources/TBF/TBF/Tools/XmlTools.cs new file mode 100644 index 00000000..d1f3c71b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Tools/XmlTools.cs @@ -0,0 +1,30 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System.IO; +using System.Xml.Serialization; + +namespace TBF.Tools +{ + public static class XmlTools + { + public static string ToXmlString(this T input) + { + using (var writer = new StringWriter()) + { + input.ToXml(writer); + return writer.ToString(); + } + } + + public static void ToXml(this T objectToSerialize, Stream stream) + { + new XmlSerializer(typeof(T)).Serialize(stream, objectToSerialize); + } + + public static void ToXml(this T objectToSerialize, StringWriter writer) + { + new XmlSerializer(typeof(T)).Serialize(writer, objectToSerialize); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/TransitionsDlg.Designer.cs b/TBF_V2/Sources/TBF/TBF/TransitionsDlg.Designer.cs new file mode 100644 index 00000000..3351a8fb --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/TransitionsDlg.Designer.cs @@ -0,0 +1,91 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF +{ + partial class TransitionsDlg + { + /// + /// 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(TransitionsDlg)); + this.mainSplitContainer = new System.Windows.Forms.SplitContainer(); + this.tabControl = new System.Windows.Forms.TabControl(); + this.sharedButtons = new TBF.UiControls.SharedButtons(); + ((System.ComponentModel.ISupportInitialize)(this.mainSplitContainer)).BeginInit(); + this.mainSplitContainer.Panel1.SuspendLayout(); + this.mainSplitContainer.Panel2.SuspendLayout(); + this.mainSplitContainer.SuspendLayout(); + this.SuspendLayout(); + // + // mainSplitContainer + // + resources.ApplyResources(this.mainSplitContainer, "mainSplitContainer"); + this.mainSplitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.mainSplitContainer.Name = "mainSplitContainer"; + // + // mainSplitContainer.Panel1 + // + this.mainSplitContainer.Panel1.Controls.Add(this.tabControl); + // + // mainSplitContainer.Panel2 + // + this.mainSplitContainer.Panel2.Controls.Add(this.sharedButtons); + // + // tabControl + // + resources.ApplyResources(this.tabControl, "tabControl"); + this.tabControl.Name = "tabControl"; + this.tabControl.SelectedIndex = 0; + this.tabControl.SelectedIndexChanged += new System.EventHandler(this.tabControl_SelectedIndexChanged); + // + // sharedButtons + // + resources.ApplyResources(this.sharedButtons, "sharedButtons"); + this.sharedButtons.Name = "sharedButtons"; + // + // TransitionsDlg + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.mainSplitContainer); + this.Name = "TransitionsDlg"; + this.Load += new System.EventHandler(this.TransitionsDlg_Load); + this.mainSplitContainer.Panel1.ResumeLayout(false); + this.mainSplitContainer.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.mainSplitContainer)).EndInit(); + this.mainSplitContainer.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer mainSplitContainer; + private System.Windows.Forms.TabControl tabControl; + private UiControls.SharedButtons sharedButtons; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/TransitionsDlg.cs b/TBF_V2/Sources/TBF/TBF/TransitionsDlg.cs new file mode 100644 index 00000000..2f4dde8f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/TransitionsDlg.cs @@ -0,0 +1,629 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; +using log4net; +using NHibernate; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.BenchControl.GenericDevices; +using TBF.Resources; +using TBF.UiControls; + +namespace TBF +{ + public partial class TransitionsDlg : Form, IParentOfListViewEx + { + static readonly ILog log = LogManager.GetLogger(typeof(TransitionsDlg)); + + /// Used when re-scaling the dialog: 100% = 96dpi, 125% = 120dpi, 150% = 144dpi + public readonly int Dpi; + public const int Dpi100pct = 96; + + /// + /// Fluent-NHibernate database session + /// + public ISession Session; + + IList procedures; + IList tests; + + Dictionary renameInfo; /// Pairs original name / new name + + + /// + /// Transition sequences to be updated by this dialog. + /// Set by the constructor or updated by the parent after creation and before loading. + /// + public IList TransitionSequences; + public IList RemovedTransitionSequences; + + /// + /// Virtual bench sequences to be updated by this dialog. + /// Set by the constructor or updated by the parent after creation and before loading. + /// + public IList VirtualBenchSequences; + public IList RemovedVirtualBenchSequences; + + + /// Auxiliary public lists used also by user controls in tab pages + public IList TbfComponents; + public IList Valves; + public IList RegulValves; + + + IList seqStepsCtrls; + + public TransitionsDlg() + { + /// Detect display setting: 100% = 96dpi, 125% = 120dpi, 150% = 144dpi. + Dpi = (int)this.CreateGraphics().DpiX; + + InitializeComponent(); + + /// SharedDlgButtons configuration + sharedButtons.RequiredGroupMembership = Users.Grp.GID.Metrologists; + sharedButtons.OptionalButtons = SharedButtons.Buttons.Add | SharedButtons.Buttons.Remove | + SharedButtons.Buttons.Up | SharedButtons.Buttons.Down | + SharedButtons.Buttons.NewTab | SharedButtons.Buttons.RenameTab | + SharedButtons.Buttons.RemoveTab; + sharedButtons.Unlocked += Unlocked; + sharedButtons.OKClicked += okButton_Click; + sharedButtons.CancelClicked += cancelButton_Click; + sharedButtons.AddClicked += addButton_Click; + sharedButtons.RemoveClicked += removeButton_Click; + sharedButtons.UpClicked += upButton_Click; + sharedButtons.DownClicked += downButton_Click; + sharedButtons.NewTabClicked += newTabButton_Click; + sharedButtons.RenameTabClicked += renameTabButton_Click; + sharedButtons.RemoveTabClicked += removeTabButton_Click; + + seqStepsCtrls = new List(); + + /// Open the database + Session = Config.FluentCommon.CreateSession(Users.Entities.DBKind.Config); + + /// Prepare a list of components and a list of all valves in the test bench + TbfComponents = BenchControl.TbfComponents.LoadComponentsFromDB(Session); + Valves = BenchControl.GenericDevices.ValveBase.MasterValves(TbfComponents); + RegulValves = new List(); + foreach (var cmpnt in TbfComponents) + { + if ((cmpnt is IRegulValve) && !(cmpnt is BenchControl.Elde.RegulValveTandem.RegulValveTandem)) + { + RegulValves.Add(cmpnt as IRegulValve); + } + } + + /// Load the sequences + /// Note: Each sequence (in both sequences together) has a unique ItemNr (0 .. N-1) + TransitionSequences = Session.QueryOver().OrderBy(x => x.ItemNr).Asc.List(); + VirtualBenchSequences = Session.QueryOver().OrderBy(x => x.ItemNr).Asc.List(); + procedures = Session.QueryOver().List(); + tests = Session.QueryOver().List(); + + RemovedTransitionSequences = new List(); + RemovedVirtualBenchSequences = new List(); + + /// Create a tab with sequence steps for each sequence ordered by ItemNr. + foreach (var transSeq in TransitionSequences) + { + transSeq.OriName = transSeq.Name; + AddTransitionSeqTab(transSeq); + } + + foreach (var vBenchSeq in VirtualBenchSequences) + { + vBenchSeq.OriName = vBenchSeq.Name; + AddVirtualBenchSeqTab(vBenchSeq); + } + } + + void AddTransitionSeqTab(TransitionSequence sequence) + { + TabPage nwTab = new TabPage(sequence.Name); + nwTab.Tag = sequence; + TransitionStepsCtrl newCtrl = new TransitionStepsCtrl(); + seqStepsCtrls.Add(newCtrl); + nwTab.Controls.Add(newCtrl); + tabControl.TabPages.Add(nwTab); + newCtrl.Initialize(sequence, this, tabControl.TabPages[tabControl.TabPages.Count - 1]); + newCtrl.SelectedIndexChanged += new System.EventHandler(SelectedIndexChanged); + } + + void AddVirtualBenchSeqTab(VirtualBenchSequence sequence) + { + TabPage nwTab = new TabPage(sequence.Name); + nwTab.Tag = sequence; + VirtualBenchStepsCtrl newCtrl = new VirtualBenchStepsCtrl(); + seqStepsCtrls.Add(newCtrl); + nwTab.Controls.Add(newCtrl); + tabControl.TabPages.Add(nwTab); + newCtrl.Initialize(sequence, this, tabControl.TabPages[tabControl.TabPages.Count - 1]); + newCtrl.SelectedIndexChanged += new System.EventHandler(SelectedIndexChanged); + } + + private void TransitionsDlg_Load(object sender, EventArgs e) + { + Localize(); + + TBF.LocalSettings ls = Program.LocalSettings; + Width = (ls.TransitionsDlgWidth > 0) ? ls.TransitionsDlgWidth : 1050; + Height = (ls.TransitionsDlgHeight > 0) ? ls.TransitionsDlgHeight : 360; + Left = (ls.TransitionsDlgLeft != 0) ? ls.TransitionsDlgLeft : 150; + Top = (ls.TransitionsDlgTop != 0) ? ls.TransitionsDlgTop : 150; + + /// Now refresh the content of the dialog + RefreshAllTabs(); + } + + void Localize() + { + Text = Strings.Transitions; + } + + void RefreshAllTabs() + { + foreach (var ctrl in seqStepsCtrls) (ctrl as Results.Forms.ListViewEx).Refresh(); + } + + private void Unlocked(object sender, EventArgs e) + { + foreach (var ctrl in seqStepsCtrls) ctrl.Unlock(); + } + + private void newTabButton_Click(object sender, EventArgs e) + { + Forms.TabNameDlg dlg; + bool nameUsed; + int tabId = TransitionSequences.Count + VirtualBenchSequences.Count; + + do + { + /// Find an unused procedure name + string newName; + for (int nameId = 1; true; nameId++) + { + newName = "Tr" + nameId.ToString(); + nameUsed = false; + foreach (var seq in TransitionSequences) if (seq.Name.Equals(newName)) nameUsed = true; + if (!nameUsed) break; + } + + dlg = new Forms.TabNameDlg(); + dlg.TabNameLabel = Strings.New_transition_name; + dlg.TabName = newName; + + if (DialogResult.OK != dlg.ShowDialog()) return; + + foreach (var seq in TransitionSequences) if (seq.Name.Equals(dlg.TabName)) nameUsed = true; + if (nameUsed) MessageBox.Show(Strings.Please_choose_another_transition_sequence_name, + Strings.Warning, + MessageBoxButtons.OK, + MessageBoxIcon.Information); + } + while (nameUsed); + + if (dlg.IsVirtualBenchSeq) + { + VirtualBenchSequence sequence = new VirtualBenchSequence(dlg.TabName, tabId); + VirtualBenchSequences.Add(sequence); + AddVirtualBenchSeqTab(sequence); + seqStepsCtrls[tabId].Unlock(); + } + else + { + TransitionSequence sequence = new TransitionSequence(dlg.TabName, tabId); + TransitionSequences.Add(sequence); + AddTransitionSeqTab(sequence); + seqStepsCtrls[tabId].Unlock(); + } + tabControl.SelectTab(tabId); + } + + private void renameTabButton_Click(object sender, EventArgs e) + { + TabPage tabPage = tabControl.SelectedTab; + TransitionSequence transitionSeq = tabPage.Tag as TransitionSequence; + VirtualBenchSequence virtualBenchSeq = tabPage.Tag as VirtualBenchSequence; + + Forms.TabNameDlg dlg = new Forms.TabNameDlg(true); + dlg.TabNameLabel = Strings.New_transition_name; + + if (dlg.ShowDialog() == DialogResult.OK) + { + bool nameUsed = false; + foreach (var seq in TransitionSequences) if (seq != transitionSeq && seq.Name == dlg.TabName) nameUsed = true; + foreach (var seq in VirtualBenchSequences) if (seq != virtualBenchSeq && seq.Name == dlg.TabName) nameUsed = true; + + if (nameUsed) + { + MessageBox.Show(Strings.Please_choose_another_transition_sequence_name, + Strings.Warning, + MessageBoxButtons.OK, + MessageBoxIcon.Information); + } + else + { + if (transitionSeq != null) + { + transitionSeq.Name = dlg.TabName; + tabPage.Text = dlg.TabName; + } + else if (virtualBenchSeq != null) + { + virtualBenchSeq.Name = dlg.TabName; + tabPage.Text = dlg.TabName; + } + } + } + } + + private void removeTabButton_Click(object sender, EventArgs e) + { + TabPage tabPage = tabControl.SelectedTab; + TransitionSequence transitionSeq = tabPage.Tag as TransitionSequence; + VirtualBenchSequence virtualBenchSeq = tabPage.Tag as VirtualBenchSequence; + + if (DialogResult.Yes == MessageBox.Show(string.Format(Strings.Do_you_really_want_to_delete_sequence_0, tabPage.Text), + Strings.Warning, + MessageBoxButtons.YesNo, + MessageBoxIcon.Question)) + { + if (transitionSeq != null) + { + RemovedTransitionSequences.Add(transitionSeq); + TransitionSequences.Remove(transitionSeq); + tabControl.TabPages.Remove(tabPage); + } + else if (virtualBenchSeq != null) + { + RemovedVirtualBenchSequences.Add(virtualBenchSeq); + VirtualBenchSequences.Remove(virtualBenchSeq); + tabControl.TabPages.Remove(tabPage); + } + } + } + + void RetrieveData() + { + if (seqStepsCtrls.Count > slctdTab) seqStepsCtrls[slctdTab].OkBtnClicked(); + } + + string GetWarningsBeforeSaving(ref Dictionary renmInfo) + { + string warnings = string.Empty; + renmInfo = new Dictionary(); + + foreach (var seq in RemovedTransitionSequences) + { + if (!string.IsNullOrEmpty(seq.OriName)) + { + int occurances = 0; + foreach (var test in tests) + { + if (!string.IsNullOrEmpty(test.RelTransBefore) && test.RelTransBefore == seq.OriName) occurances++; + if (!string.IsNullOrEmpty(test.TransitionAfter) && test.TransitionAfter == seq.OriName) occurances++; + } + foreach (var proc in procedures) + { + if (!string.IsNullOrEmpty(proc.TransitionStart) && proc.TransitionStart == seq.OriName) occurances++; + if (!string.IsNullOrEmpty(proc.TransitionEnd) && proc.TransitionEnd == seq.OriName) occurances++; + } + if (occurances > 0) + { + warnings += string.Format("Deleting transition sequence {0} used in {1} tests and procedures{2}", seq.OriName, occurances, Environment.NewLine); + renmInfo.Add(seq.OriName, string.Empty); + } + } + } + foreach (var seq in RemovedVirtualBenchSequences) + { + if (!string.IsNullOrEmpty(seq.OriName)) + { + int occurances = 0; + foreach (var test in tests) + { + if (!string.IsNullOrEmpty(test.RelTransBefore) && test.RelTransBefore == seq.OriName) occurances++; + if (!string.IsNullOrEmpty(test.TransitionAfter) && test.TransitionAfter == seq.OriName) occurances++; + } + foreach (var proc in procedures) + { + if (!string.IsNullOrEmpty(proc.TransitionStart) && proc.TransitionStart == seq.OriName) occurances++; + if (!string.IsNullOrEmpty(proc.TransitionEnd) && proc.TransitionEnd == seq.OriName) occurances++; + } + if (occurances > 0) + { + warnings += string.Format("Deleting virtual bench sequence {0} used in {1} tests and procedures{2}", seq.OriName, occurances, Environment.NewLine); + renmInfo.Add(seq.OriName, string.Empty); + } + } + } + + foreach (var seq in TransitionSequences) + { + if (!string.IsNullOrEmpty(seq.OriName) && seq.OriName != seq.Name) + { + int occurances = 0; + foreach (var test in tests) + { + if (!string.IsNullOrEmpty(test.RelTransBefore) && test.RelTransBefore == seq.OriName) occurances++; + if (!string.IsNullOrEmpty(test.TransitionAfter) && test.TransitionAfter == seq.OriName) occurances++; + } + foreach (var proc in procedures) + { + if (!string.IsNullOrEmpty(proc.TransitionStart) && proc.TransitionStart == seq.OriName) occurances++; + if (!string.IsNullOrEmpty(proc.TransitionEnd) && proc.TransitionEnd == seq.OriName) occurances++; + } + if (occurances > 0) + { + warnings += string.Format("Renaming transition sequence {0} used in {1} tests and procedures{2}", seq.OriName, occurances, Environment.NewLine); + renmInfo.Add(seq.OriName, seq.Name); + } + } + } + foreach (var seq in VirtualBenchSequences) + { + if (!string.IsNullOrEmpty(seq.OriName) && seq.OriName != seq.Name) + { + int occurances = 0; + foreach (var test in tests) + { + if (!string.IsNullOrEmpty(test.RelTransBefore) && test.RelTransBefore == seq.OriName) occurances++; + if (!string.IsNullOrEmpty(test.TransitionAfter) && test.TransitionAfter == seq.OriName) occurances++; + } + foreach (var proc in procedures) + { + if (!string.IsNullOrEmpty(proc.TransitionStart) && proc.TransitionStart == seq.OriName) occurances++; + if (!string.IsNullOrEmpty(proc.TransitionEnd) && proc.TransitionEnd == seq.OriName) occurances++; + } + if (occurances > 0) + { + warnings += string.Format("Renaming virtual bench sequence {0} used in {1} tests and procedures{2}", seq.OriName, occurances, Environment.NewLine); + renmInfo.Add(seq.OriName, seq.Name); + } + } + } + + return warnings; + } + + private void okButton_Click(object sender, EventArgs e) + { + RetrieveData(); + + string warnings = GetWarningsBeforeSaving(ref renameInfo); + + bool updateRelatedItems = false; + if (!string.IsNullOrEmpty(warnings)) + { + string message = string.Format("{0}{1}{2}", warnings, Environment.NewLine, + Strings.Do_you_want_to_update_related_tests_and_procedures); + DialogResult dr = MessageBox.Show(message, Strings.Warning, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation); + if (dr == DialogResult.Cancel) + { + DialogResult = DialogResult.Cancel; + return; + } + else if (dr == DialogResult.Yes) + { + updateRelatedItems = true; + } + } + + Cursor.Current = Cursors.WaitCursor; + + using (var transaction = Session.BeginTransaction()) + { + try + { + if (updateRelatedItems) + { + foreach (var ri in renameInfo) + { + var tests = Session.QueryOver() + .Where(x => (x.RelTransBefore == ri.Key)) + .List(); + foreach (var t in tests) + { + t.RelTransBefore = ri.Value; + Session.Update(t); + } + + tests = Session.QueryOver() + .Where(x => (x.TransitionAfter == ri.Key)) + .List(); + foreach (var t in tests) + { + t.TransitionAfter = ri.Value; + Session.Update(t); + } + + var procedures = Session.QueryOver() + .Where(x => (x.TransitionStart == ri.Key)) + .List(); + foreach (var p in procedures) + { + p.TransitionStart = ri.Value; + Session.Update(p); + } + + procedures = Session.QueryOver() + .Where(x => (x.TransitionEnd == ri.Key)) + .List(); + foreach (var p in procedures) + { + p.TransitionEnd = ri.Value; + Session.Update(p); + } + } + } + + foreach (var transSeq in RemovedTransitionSequences) + { + foreach (var step in transSeq.TransitionSteps) Session.Delete(step); + Session.Delete(transSeq); + } + foreach (var vBnchSeq in RemovedVirtualBenchSequences) + { + foreach (var step in vBnchSeq.VirtualBenchSteps) Session.Delete(step); + Session.Delete(vBnchSeq); + } + + int itemNr = 0; + foreach (var transSeq in TransitionSequences) + { + transSeq.ItemNr = itemNr++; + Session.SaveOrUpdate(transSeq); + } + itemNr = 0; + foreach (var vBnchSeq in VirtualBenchSequences) + { + vBnchSeq.ItemNr = itemNr++; + Session.SaveOrUpdate(vBnchSeq); + } + + transaction.Commit(); + } + catch (Exception e2) + { + transaction.Rollback(); + Cursor.Current = Cursors.Default; + + MessageBox.Show(Strings.Cannot_save_changes, Strings.Error, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + log.ErrorFormat("Update of sequences in the database failed: {0}", e2.Message); + } + } + + Cursor.Current = Cursors.Default; + + Program.LocalSettings.TransitionsDlgLeft = Location.X; + Program.LocalSettings.TransitionsDlgTop = Location.Y; + Program.LocalSettings.TransitionsDlgWidth = Size.Width; + Program.LocalSettings.TransitionsDlgHeight = Size.Height; + Program.LocalSettings.Save(); + + DialogResult = DialogResult.OK; + Close(); + return; + } + + private void cancelButton_Click(object sender, EventArgs e) + { + Program.LocalSettings.TransitionsDlgLeft = Location.X; + Program.LocalSettings.TransitionsDlgTop = Location.Y; + Program.LocalSettings.TransitionsDlgWidth = Size.Width; + Program.LocalSettings.TransitionsDlgHeight = Size.Height; + Program.LocalSettings.Save(); + + DialogResult = DialogResult.Cancel; + Close(); + return; + } + + + + int slctdTab; + + private void tabControl_SelectedIndexChanged(object sender, EventArgs e) + { + if (seqStepsCtrls.Count > slctdTab) + { + seqStepsCtrls[slctdTab].OkBtnClicked(); + } + slctdTab = tabControl.SelectedIndex; + sharedButtons.SetEnabled(SharedButtons.Buttons.Add, true); + sharedButtons.DisableButtons(SharedButtons.Buttons.Remove); + RefreshAllTabs(); + } + + private void addButton_Click(object sender, EventArgs e) + { + if (seqStepsCtrls.Count > slctdTab) seqStepsCtrls[slctdTab].AddOne(); + } + + private void removeButton_Click(object sender, EventArgs e) + { + if (seqStepsCtrls.Count > slctdTab) seqStepsCtrls[slctdTab].RemoveSelected(); + } + + private void upButton_Click(object sender, EventArgs e) + { + if (seqStepsCtrls.Count > slctdTab) seqStepsCtrls[slctdTab].MoveUpSelected(); + } + + private void downButton_Click(object sender, EventArgs e) + { + if (seqStepsCtrls.Count > slctdTab) seqStepsCtrls[slctdTab].MoveDownSelected(); + } + + public void UpdateButtonStates(SharedButtons.SelectedItemPos selectedItemPos) + { + if (selectedItemPos == SharedButtons.SelectedItemPos.None) + { + sharedButtons.DisableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up | SharedButtons.Buttons.Down); + } + else if (selectedItemPos == SharedButtons.SelectedItemPos.First) + { + sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Down); + sharedButtons.DisableButtons(SharedButtons.Buttons.Up); + } + else if (selectedItemPos == SharedButtons.SelectedItemPos.Last) + { + sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up); + sharedButtons.DisableButtons(SharedButtons.Buttons.Down); + } + else if (selectedItemPos == SharedButtons.SelectedItemPos.FirstAndLast) + { + sharedButtons.EnableButtons(SharedButtons.Buttons.Remove); + sharedButtons.DisableButtons(SharedButtons.Buttons.Up | SharedButtons.Buttons.Down); + } + else + { + sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up | SharedButtons.Buttons.Down); + } + } + + private void purgeStartCtrl_SelectedIndexChanged(object sender, EventArgs e) + { + SelectedIndexChanged(sender, e); + } + + private void purgeEndCtrl_SelectedIndexChanged(object sender, EventArgs e) + { + SelectedIndexChanged(sender, e); + } + + /// + /// Common part for three xxxListViewEx_SelectedIndexChanged event handlers + /// + /// + void SelectedIndexChanged(object sender, EventArgs e) + { + Results.Forms.ListViewEx listViewEx = sender as Results.Forms.ListViewEx; + if (listViewEx.SelectedItems.Count != 1) + { + UpdateButtonStates(SharedButtons.SelectedItemPos.None); + } + else if (listViewEx.Items.Count == 1) + { + UpdateButtonStates(SharedButtons.SelectedItemPos.FirstAndLast); + } + else if (listViewEx.SelectedIndices[0] == 0) + { + UpdateButtonStates(SharedButtons.SelectedItemPos.First); + } + else if (listViewEx.SelectedIndices[0] == (listViewEx.Items.Count - 1)) + { + UpdateButtonStates(SharedButtons.SelectedItemPos.Last); + } + else + { + UpdateButtonStates(SharedButtons.SelectedItemPos.Middle); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/TransitionsDlg.pl.resx b/TBF_V2/Sources/TBF/TBF/TransitionsDlg.pl.resx new file mode 100644 index 00000000..03a89eec --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/TransitionsDlg.pl.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Przejścia + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/TransitionsDlg.resx b/TBF_V2/Sources/TBF/TBF/TransitionsDlg.resx new file mode 100644 index 00000000..f2190cf2 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/TransitionsDlg.resx @@ -0,0 +1,249 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + Fill + + + + True + + + + 0, 0 + + + Fill + + + 58, 30 + + + 0, 0 + + + 760, 366 + + + 1 + + + tabControl + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + mainSplitContainer.Panel1 + + + 0 + + + mainSplitContainer.Panel1 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + mainSplitContainer + + + 0 + + + -1, 0 + + + 100, 636 + + + 0 + + + sharedButtons + + + TBF.UiControls.SharedButtons, TBF, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + + + mainSplitContainer.Panel2 + + + 0 + + + mainSplitContainer.Panel2 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + mainSplitContainer + + + 1 + + + 863, 366 + + + 760 + + + 1 + + + mainSplitContainer + + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + + + 6, 13 + + + 863, 366 + + + NoControl + + + CenterParent + + + Transitions + + + TransitionsDlg + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/TransitionsDlg.ru.resx b/TBF_V2/Sources/TBF/TBF/TransitionsDlg.ru.resx new file mode 100644 index 00000000..60a0d6cf --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/TransitionsDlg.ru.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Переходы + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/UiBridge/ActivityEventArgs.cs b/TBF_V2/Sources/TBF/TBF/UiBridge/ActivityEventArgs.cs new file mode 100644 index 00000000..02b503b3 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiBridge/ActivityEventArgs.cs @@ -0,0 +1,25 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; + +namespace TBF.UiBridge +{ + public class ActivityEventArgs : EventArgs + { + public enum Update { All, Activity, Message }; + + public Update Cmd; /// specifies what should be updated, makes it possible to update just one field + public string Activity; /// activity text + public string Message; /// message text + public bool ErrorMsg; /// true = use red color to print the message + + public ActivityEventArgs(Update cmd, string activity, string message, bool errorMsg) + { + this.Cmd = cmd; + this.Activity = activity; + this.Message = message; + this.ErrorMsg = errorMsg; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiBridge/AdjustmentInProgressEventArgs.cs b/TBF_V2/Sources/TBF/TBF/UiBridge/AdjustmentInProgressEventArgs.cs new file mode 100644 index 00000000..ce645de4 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiBridge/AdjustmentInProgressEventArgs.cs @@ -0,0 +1,18 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using Config.Entities; + +namespace TBF.UiBridge +{ + public class AdjustmentInProgressEventArgs : EventArgs + { + public string TestName; + + public AdjustmentInProgressEventArgs(string testName) + { + this.TestName = testName; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiBridge/Bridge.cs b/TBF_V2/Sources/TBF/TBF/UiBridge/Bridge.cs new file mode 100644 index 00000000..30206263 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiBridge/Bridge.cs @@ -0,0 +1,270 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using Config.Entities; +using log4net; + +namespace TBF.UiBridge +{ + /// + /// Provides separation of the UI and the state machine. + /// + static class Bridge + { + static readonly ILog log = LogManager.GetLogger(typeof(Bridge)); + + public static readonly Queue Ui2MachineQueue; + + public static int BatchNr; + + public static ProcedureInfo SelectedProcedure { get { return Program.MainWnd.SelectedProcedure; } } + + public static string SelectedTestName { get { return Program.MainWnd.BenchControlPanel.TestName; } } + + + static Bridge() + { + Ui2MachineQueue = new Queue(); + } + + /// + /// This function should be called from the UI + /// + /// + public static void Ui2Bench(UI2BenchCmd cmd) + { + lock (Ui2MachineQueue) + { + Ui2MachineQueue.Enqueue(cmd); + } + } + + /// + /// This function should be called from state machine operations + /// + public static void Bench2UI(ButtonsEtc flags) + { + if (ButtonsEtcHandler == null) return; + try { ButtonsEtcHandler(null, new ButtonsEtcEventArgs(flags)); } + catch (Exception e) { log.Error("UiEventHandler(...) failed", e); } + } + public static event EventHandler ButtonsEtcHandler; + + + /// + /// Called from the state machine when a procedure is selected and UI needs to be updated. + /// + public static void OnProcedureSelected(object sender, ProcedureSelectedEventArgs data) + { + if (ProcedureSelectedHandler == null) return; + try { ProcedureSelectedHandler(sender, data); } + catch (Exception e) { log.Error("ProcedureSelectedHandler(...) failed", e); } + } + public static event EventHandler ProcedureSelectedHandler; + + + /// + /// Called from the state machine when a test is selected and UI needs to be updated. + /// + public static void OnTestSelected(object sender, TestSelectedEventArgs data) + { + if (TestSelectedHandler == null) return; + try { TestSelectedHandler(sender, data); } + catch (Exception e) { log.Error("TestSelectedHandler(...) failed", e); } + } + public static event EventHandler TestSelectedHandler; + + + /// + /// Called from the state machine when process data changed and UI needs to be updated. + /// + public static void OnProcessData(object sender, ProcessDataEventArgs data) + { + if (ProcessDataHandler == null) return; + try { ProcessDataHandler(sender, data); } + catch (Exception e) { log.Error("ProcessDataHandler(...) failed", e); } + } + public static event EventHandler ProcessDataHandler; + + + /// + /// Called from the state machine when progress bars need to be updated. + /// + public static void OnTestProgress(object sender, TestProgressEventArgs data) + { + if (TestProgressHandler == null) return; + try { TestProgressHandler(sender, data); } + catch (Exception e) { log.Error("TestProgressHandler(...) failed", e); } + } + public static event EventHandler TestProgressHandler; + + + /// + /// Called from the state machine when one test of the adjustment process was completed and UI needs to be updated. + /// + public static void OnAdjustmentInProgress(object sender, AdjustmentInProgressEventArgs data) + { + if (AdjustmentInProgressHandler == null) return; + try { AdjustmentInProgressHandler(sender, data); } + catch (Exception e) { log.Error("AdjustmentInProgressHandler(...) failed", e); } + } + public static event EventHandler AdjustmentInProgressHandler; + + + /// + /// Called from the state machine when one test of the pulses test process was completed and UI needs to be updated. + /// + public static void OnPulsesTestInProgress(object sender, PulsesTestInProgressEventArgs data) + { + if (PulsesTestInProgressHandler == null) return; + try { PulsesTestInProgressHandler(sender, data); } + catch (Exception e) { log.Error("PulsesTestInProgressHandler(...) failed", e); } + } + public static event EventHandler PulsesTestInProgressHandler; + + + /// + /// Called from the state machine when the test is completed and UI needs to be updated. + /// + public static void OnTestCompleted(object sender, TestCompletedEventArgs data) + { + if (TestCompletedHandler == null) return; + try { TestCompletedHandler(sender, data); } + catch (Exception e) { log.Error("TestCompletedHandler(...) failed", e); } + } + public static event EventHandler TestCompletedHandler; + + + /// + /// Called from the state machine when the procedure is completed and UI needs to be updated. + /// + public static void OnProcedureCompleted(object sender, ProcedureCompletedEventArgs data) + { + if (ProcedureCompletedHandler == null) return; + try { ProcedureCompletedHandler(sender, data); } + catch (Exception e) { log.Error("ProcedureCompletedHandler(...) failed", e); } + } + public static event EventHandler ProcedureCompletedHandler; + + + /// + /// Called from the state machine when there is and information to be logged. + /// + public static void OnLog(object sender, string message) + { + if (LogHandler == null) return; + try { LogHandler(sender, new LogEventArgs(message)); } + catch (Exception e) { log.Error("LogHandler(...) failed", e); } + } + public static event EventHandler LogHandler; + + + /// + /// Called from the state machine when 'Activity' information changes. + /// + public static void OnActivity(object sender, string activity) + { + if (ActivityHandler == null) return; + try { ActivityHandler(sender, new ActivityEventArgs(ActivityEventArgs.Update.Activity, activity, null, false)); } + catch (Exception e) { log.Error("ActivityHandler(...) failed", e); } + } + public static void OnMessage(object sender, string message) + { + if (ActivityHandler == null) return; + try { ActivityHandler(sender, new ActivityEventArgs(ActivityEventArgs.Update.Message, null, message, false)); } + catch (Exception e) { log.Error("ActivityHandler(...) failed", e); } + } + public static void OnError(object sender, string message) + { + if (ActivityHandler == null) return; + try { ActivityHandler(sender, new ActivityEventArgs(ActivityEventArgs.Update.Message, null, message, true)); } + catch (Exception e) { log.Error("ActivityHandler(...) failed", e); } + } + public static event EventHandler ActivityHandler; + + + /// + /// 'State machine state has changed' event handler + /// + public static void OnStateChanged(object sender, string stateChangedMsg) + { + if (StateChangedHandler == null) return; + try { StateChangedHandler(sender, new StateChangedEventArgs(stateChangedMsg)); } + catch (Exception e) { string s = e.ToString(); } + } + public static event EventHandler StateChangedHandler; + + + /// + /// Called from the state machine when 'Activity' information changes. + /// + public static void OnEmergencyStopChanged(object sender, EmergencyStopEventArgs.State state) + { + if (EmergencyStopChangedHandler == null) return; + try { EmergencyStopChangedHandler(sender, new EmergencyStopEventArgs(state)); } + catch (Exception e) { log.Error("EmergencyStopHandler(...) failed", e); } + } + public static event EventHandler EmergencyStopChangedHandler; + + + /// + /// Called from the state machine when an operation forces a modeless dialog close. + /// + public static void OnCloseModelessForm(object sender, EventArgs args) + { + if (CloseModelessFormHandler == null) return; + try { CloseModelessFormHandler(sender, null); } + catch (Exception e) { log.Error("CloseModelessFormHandler(...) failed", e); } + } + public static event EventHandler CloseModelessFormHandler; + + + /// + /// Used by CoverTest, AskYesNoOp and MessageBoxOp. + /// + public static void OnCloseQandAForm(object sender, EventArgs args) + { + if (CloseQandAFormHandler == null) return; + try { CloseQandAFormHandler(sender, null); } + catch (Exception e) { log.Error("CloseQandAFormHandler(...) failed", e); } + } + public static event EventHandler CloseQandAFormHandler; + + + + /// + /// Called from the state machine when a procedure is selected and UI needs to be updated. + /// + public static void OnCameraUICmd(object sender, CameraUICmdEventArgs data) + { + if (CameraUICmdHandler == null) return; + try { CameraUICmdHandler(sender, data); } + catch (Exception e) { log.Error("CameraUICmdHandler(...) failed", e); } + } + public static event EventHandler CameraUICmdHandler; + + /// + /// Called from a camera when camera state (shown as a caption in PicturesTabPage) changes + /// + public static void OnCameraInfo(int cameraIdx, string info) + { + if (CameraInfoHandler == null) return; + try { CameraInfoHandler(null, new CameraInfoEventArgs(cameraIdx, info)); } + catch (Exception e) { log.Error("CameraInfoHandler(...) failed", e); } + } + public static event EventHandler CameraInfoHandler; + + /// + /// Called from any RTP listener thread (e.g. MJpeg RTP listener thread) + /// + public static void OnImage(int cameraIdx, System.Drawing.Image image) + { + if (ImageHandler == null) return; + try { ImageHandler(null, new ImageEventArgs(cameraIdx, image)); } + catch (Exception e) { log.Error("ImageHandler(...) failed", e); } + } + public static event EventHandler ImageHandler; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiBridge/ButtonsEtcEventArgs.cs b/TBF_V2/Sources/TBF/TBF/UiBridge/ButtonsEtcEventArgs.cs new file mode 100644 index 00000000..67284489 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiBridge/ButtonsEtcEventArgs.cs @@ -0,0 +1,20 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; + +namespace TBF.UiBridge +{ + /// + /// Argument of UiBridgeEventHandler. + /// + public class ButtonsEtcEventArgs : EventArgs + { + public ButtonsEtc Flags; /// Flags to be passed to the UI. + + public ButtonsEtcEventArgs(ButtonsEtc flags) + { + this.Flags = flags; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiBridge/CameraInfoEventArgs.cs b/TBF_V2/Sources/TBF/TBF/UiBridge/CameraInfoEventArgs.cs new file mode 100644 index 00000000..9904d4fd --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiBridge/CameraInfoEventArgs.cs @@ -0,0 +1,22 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace TBF.UiBridge +{ + public class CameraInfoEventArgs : EventArgs + { + public int CameraIdx; + public string Info; + + public CameraInfoEventArgs(int cameraIdx, string info) + { + this.CameraIdx = cameraIdx; + this.Info = info; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiBridge/CameraUICmdEventArgs.cs b/TBF_V2/Sources/TBF/TBF/UiBridge/CameraUICmdEventArgs.cs new file mode 100644 index 00000000..ef0f39d6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiBridge/CameraUICmdEventArgs.cs @@ -0,0 +1,28 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; + +namespace TBF.UiBridge +{ + public enum CameraUICmd + { + None, + Grab, + Live, + Stop, + SaveImage, + } + + public class CameraUICmdEventArgs : EventArgs + { + public CameraUICmd CameraUICmd; + public int CameraIdx; /// 0-based camera index/identifier. -1 = all cameras + + public CameraUICmdEventArgs(CameraUICmd cameraUICmd, int cameraIdx) + { + CameraUICmd = cameraUICmd; + CameraIdx = cameraIdx; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiBridge/EmergencyStopEventArgs.cs b/TBF_V2/Sources/TBF/TBF/UiBridge/EmergencyStopEventArgs.cs new file mode 100644 index 00000000..b544f3a3 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiBridge/EmergencyStopEventArgs.cs @@ -0,0 +1,25 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; + +namespace TBF.UiBridge +{ + public class EmergencyStopEventArgs : EventArgs + { + public enum State + { + Unknown, + Inactive, + Active, + CloseForm, + } + + public State EmergencyStopState; + + public EmergencyStopEventArgs(State emergencyStopState) + { + this.EmergencyStopState = emergencyStopState; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiBridge/Enums.cs b/TBF_V2/Sources/TBF/TBF/UiBridge/Enums.cs new file mode 100644 index 00000000..9c170b20 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiBridge/Enums.cs @@ -0,0 +1,66 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +namespace TBF.UiBridge +{ + /// UI command ID-s used by UiBridge + public enum UI2BenchCmd + { + None = 0, + ReloadBatch, + StartTest, + StartQ1, + StartQ2, + StartQ3, + StartCycle, + Stop, + PurgeBegin, + PurgeEnd, + DrainTank1, + DrainTank2, + DrainTank3, + StopDrainingTank1, + StopDrainingTank2, + StopDrainingTank3, + Break, + ResetResults, + AcceptResults, + Shutdown, + SensitivityTest, + CameraTest, + B1, + B2, + B3, + Custom, + Next, /// Used for debugging + } + + public enum ButtonsEtc + { + None = 0, + ProcedureCmbBoxEn = (1 << 0), + TestCmbBoxEn = (1 << 1), + StopBtnEn = (1 << 2), + StartTestBtnsEn = (1 << 3), + StartCycleBtnEn = (1 << 4), + PurgeBeginBtnEn = (1 << 5), + PurgeEndBtnEn = (1 << 6), + DrainTankBtn1En = (1 << 7), + DrainTankBtn1Hi = (1 << 8), + DrainTankBtn2En = (1 << 9), + DrainTankBtn2Hi = (1 << 10), + DrainTankBtn3En = (1 << 11), + DrainTankBtn3Hi = (1 << 12), + Break = (1 << 13), + ResetResultsBtnEn = (1 << 14), + AcceptResultsBtnEn = (1 << 15), + CalibrationBtnEn = (1 << 16), + SensitivityTestBtnEn = (1 << 17), + CustomBtnEn = (1 << 18), + + /// If one of the following flags is set, flags 0x1 through 0x2000 are ignored + /// + ShowBenchEmpty = 0x1000000, + ShowBenchFilled = 0x2000000, + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiBridge/ImageEventArgs.cs b/TBF_V2/Sources/TBF/TBF/UiBridge/ImageEventArgs.cs new file mode 100644 index 00000000..644f9331 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiBridge/ImageEventArgs.cs @@ -0,0 +1,20 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Drawing; + +namespace TBF.UiBridge +{ + public class ImageEventArgs : EventArgs + { + public int CameraIdx; /// 0-based camera index/identifier + public Image Image; + + public ImageEventArgs(int cameraIdx, Image image) + { + this.CameraIdx = cameraIdx; + this.Image = image; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiBridge/LogEventArgs.cs b/TBF_V2/Sources/TBF/TBF/UiBridge/LogEventArgs.cs new file mode 100644 index 00000000..a01f4dde --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiBridge/LogEventArgs.cs @@ -0,0 +1,17 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; + +namespace TBF.UiBridge +{ + public class LogEventArgs : EventArgs + { + public string LogMessage; + + public LogEventArgs(string logMessage) + { + this.LogMessage = logMessage; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiBridge/ProcedureCompletedEventArgs.cs b/TBF_V2/Sources/TBF/TBF/UiBridge/ProcedureCompletedEventArgs.cs new file mode 100644 index 00000000..aa6930ad --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiBridge/ProcedureCompletedEventArgs.cs @@ -0,0 +1,19 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using Config.Entities; +using TBF.BenchControl; + +namespace TBF.UiBridge +{ + public class ProcedureCompletedEventArgs : EventArgs + { + public Procedure Procedure; + + public ProcedureCompletedEventArgs(Procedure procedure) + { + Procedure = procedure; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiBridge/ProcedureSelectedEventArgs.cs b/TBF_V2/Sources/TBF/TBF/UiBridge/ProcedureSelectedEventArgs.cs new file mode 100644 index 00000000..397885a3 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiBridge/ProcedureSelectedEventArgs.cs @@ -0,0 +1,19 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using Config.Entities; +using TBF.BenchControl; + +namespace TBF.UiBridge +{ + public class ProcedureSelectedEventArgs : EventArgs + { + public Procedure Procedure; + + public ProcedureSelectedEventArgs(Procedure procedure) + { + this.Procedure = procedure; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiBridge/ProcessDataEventArgs.cs b/TBF_V2/Sources/TBF/TBF/UiBridge/ProcessDataEventArgs.cs new file mode 100644 index 00000000..bc434913 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiBridge/ProcessDataEventArgs.cs @@ -0,0 +1,62 @@ +/// +/// Copyright (c) 2016-2017 Sensus Metering Systems +/// +using System; +using Config.Entities; + +namespace TBF.UiBridge +{ + class ProcessDataEventArgs : EventArgs + { + public string CompleteTestName; + public int Part; + public int Repeats; + public int RepetitionNr; + public Progress TestPhase; + + //public FloatBox RegValvePos; /// Current regulation valve position in [%] (0 .. 100.0) + //public bool PumpOn; + //public bool DivToTank; + + public int Time; + public float Flow; + public float Temperature; + public float Pressure; + public float RegValvePosition; + + public ProcessDataEventArgs(string testName, int testRepeats, int testPart, int repetitionNr, Progress testPhase) + { + CompleteTestName = Results.Utils.GetTestName(testName, testRepeats, repetitionNr); + Part = testPart; + Repeats = testRepeats; + RepetitionNr = repetitionNr; + TestPhase = testPhase; + + Time = TBF.BenchControl.StateMachine.Time; + Flow = CalcSinusFunction_2(1, Time); + Temperature = CalcSinusFunction_2(2, Time); + Pressure = CalcSinusFunction_2(3, Time); + RegValvePosition = CalcSinusFunction_2(4, Time); + } + + public ProcessDataEventArgs(Test test, int repetitionNr, Progress testPhase) + { + CompleteTestName = Results.Utils.GetTestName(test.Name, test.Repeats, repetitionNr); + Part = test.Part; + Repeats = test.Repeats; + RepetitionNr = repetitionNr; + TestPhase = testPhase; + } + + public ProcessDataEventArgs(Test test, Progress testPhase) + : this(test, 1, testPhase) + { + } + + protected float CalcSinusFunction_2(int idx, int time) + { + return (float)((20.0f * Math.Sin(40 * (idx + 1) * time * Math.PI / 5800)) * Math.Sin(160 * (idx + 1) * time * Math.PI / 5800)) + + (float)((200.0f * Math.Sin(4 * (idx + 1) * time * Math.PI / 5800))); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiBridge/PulsesTestInProgressEventArgs.cs b/TBF_V2/Sources/TBF/TBF/UiBridge/PulsesTestInProgressEventArgs.cs new file mode 100644 index 00000000..51cbfa8f --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiBridge/PulsesTestInProgressEventArgs.cs @@ -0,0 +1,20 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; +using Config.Entities; + +namespace TBF.UiBridge +{ + public class PulsesTestInProgressEventArgs : EventArgs + { + public string TestName; + public double MinPulsesCount; + + public PulsesTestInProgressEventArgs(string testName, double minPulsesCount) + { + this.TestName = testName; + this.MinPulsesCount = minPulsesCount; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiBridge/StateChangedEventArgs.cs b/TBF_V2/Sources/TBF/TBF/UiBridge/StateChangedEventArgs.cs new file mode 100644 index 00000000..82ae4538 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiBridge/StateChangedEventArgs.cs @@ -0,0 +1,17 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; + +namespace TBF.UiBridge +{ + public class StateChangedEventArgs : EventArgs + { + public string StateChangedMsg; + + public StateChangedEventArgs(string stateChangedMsg) + { + StateChangedMsg = stateChangedMsg; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiBridge/TestCompletedEventArgs.cs b/TBF_V2/Sources/TBF/TBF/UiBridge/TestCompletedEventArgs.cs new file mode 100644 index 00000000..2dc74b91 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiBridge/TestCompletedEventArgs.cs @@ -0,0 +1,20 @@ +/// +/// Copyright (c) 2013-2016 Sensus Metering Systems +/// +using System; +using Config.Entities; + +namespace TBF.UiBridge +{ + public class TestCompletedEventArgs : EventArgs + { + public string TestName; + public Results.Entities.TestRslt TestRslt; /// If null => just redraw results + + public TestCompletedEventArgs(string testName, Results.Entities.TestRslt testRslt) + { + this.TestName = testName; + this.TestRslt = testRslt; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiBridge/TestProgressEventArgs.cs b/TBF_V2/Sources/TBF/TBF/UiBridge/TestProgressEventArgs.cs new file mode 100644 index 00000000..5ecfe0f7 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiBridge/TestProgressEventArgs.cs @@ -0,0 +1,112 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; + +namespace TBF.UiBridge +{ + public class TestProgressEventArgs : EventArgs + { + public string TestName; + public int Part; + public int Repeats; + public int RepetitionNr; + + public Config.Entities.Progress Phase; + public int Progress; /// value in the range 0..100 + public float OveralProgress; + + +#region Static and base constructor part + + static int[] estimatedTime; /// Estimated time of each phase to calculate the progress [s] + static int[] cumulativeSumsOfEstimates; + static int currentPhaseStartTime; + static Config.Entities.Progress currentPhase; + + + static TestProgressEventArgs() + { + int[] estTime = new int[(int)Config.Entities.Progress.Count]; + for (int i = 0; i < estTime.Length; i++) estTime[i] = 10; + cumulativeSumsOfEstimates = new int[(int)Config.Entities.Progress.Count]; + SetEstimatedTimes(estTime); + + currentPhaseStartTime = BenchControl.StateMachine.Time; + currentPhase = Config.Entities.Progress.JustStarted; + } + + + /// + /// Set estimated time of each phase in [s] (see Config.Entities.Progress). + /// + /// Array: estimated time of each phase in [s] + public static void SetEstimatedTimes(int[] estTime) + { + if (estTime.Length != (int)Config.Entities.Progress.Count) return; + estimatedTime = estTime; + for (int i = 0; i < estTime.Length; i++) + { + cumulativeSumsOfEstimates[i] = (i > 0) ? cumulativeSumsOfEstimates[i - 1] : 0; + cumulativeSumsOfEstimates[i] += estTime[i]; + } + } + + + /// + /// Base constructor which maintains currentPhase, currentPhaseStartTime + /// and calculates 'Progress'. + /// + /// + private TestProgressEventArgs(Config.Entities.Progress phase) + { + if (phase != currentPhase) + { + currentPhase = phase; + currentPhaseStartTime = BenchControl.StateMachine.Time; + } + + Phase = phase; + int phaseNr = (int)phase; + + int currentPhaseTime = Math.Min(BenchControl.StateMachine.Time - currentPhaseStartTime, estimatedTime[phaseNr]); + int currentTestTime = currentPhaseTime + ((phaseNr == 0) ? 0 : cumulativeSumsOfEstimates[phaseNr - 1]); + + int add10pct = cumulativeSumsOfEstimates[(int)Config.Entities.Progress.Count - 1] / 9; + + + Progress = 100 * (currentTestTime + add10pct) + / (cumulativeSumsOfEstimates[(int)Config.Entities.Progress.Count - 1] + add10pct); + } + +#endregion + + public TestProgressEventArgs(Config.Entities.Test test, int repetitionNr, Config.Entities.Progress progress) + : this(progress) + { + TestName = Results.Utils.GetTestName(test.Name, test.Repeats, repetitionNr); + Part = test.Part; + Repeats = test.Repeats; + RepetitionNr = repetitionNr; + } + + + public TestProgressEventArgs(Config.Entities.Test test, Config.Entities.Progress progress) + : this(test, 1, progress) + { + } + + + /// + /// Used by iPearl communication dialog + /// + public TestProgressEventArgs(string testName, Config.Entities.Progress progress) + : this(progress) + { + TestName = testName; + Part = 0; + Repeats = 1; + RepetitionNr = 1; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiBridge/TestSelectedEventArgs.cs b/TBF_V2/Sources/TBF/TBF/UiBridge/TestSelectedEventArgs.cs new file mode 100644 index 00000000..c4390935 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiBridge/TestSelectedEventArgs.cs @@ -0,0 +1,30 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using TBF.BenchControl; + +namespace TBF.UiBridge +{ + public class TestSelectedEventArgs : EventArgs + { + public Config.Entities.Test Test; + public int RepetitionNr; + public FeedingPath FeedingPath; + public BenchPath BenchPath; + public OutputPath OutputPath; + public MetersPath MetersPath; + public int TotalPulses; + + public TestSelectedEventArgs(Config.Entities.Test test, int repetitionNr, FeedingPath f, BenchPath b, OutputPath o, MetersPath m, int tp) + { + Test = test; + RepetitionNr = repetitionNr; + FeedingPath = f; + BenchPath = b; + OutputPath = o; + MetersPath = m; + TotalPulses = tp; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/BaseWithListViewEx.cs b/TBF_V2/Sources/TBF/TBF/UiControls/BaseWithListViewEx.cs new file mode 100644 index 00000000..59597c7b --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/BaseWithListViewEx.cs @@ -0,0 +1,216 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using Config.Entities; + +namespace TBF.UiControls +{ + public class BaseWithListViewEx : Results.Forms.ListViewEx + { + /// + /// List of items to be edited + /// + public IList MyItems; + + /// + /// Number of items/rows with lowest ItemNr = 0,... + /// that cannot be deleted, moved down, renamed, etc. + /// + public int FixedRowsCount; + + /// + /// List of removed items that have to be removed from the database + /// when completed with OK. + /// + public IList ToBeRemovedItems; + + /// + /// true = editing was unlocked + /// + public bool Unlocked { get { return unlocked; } } /// read only + bool unlocked; + + public BaseWithListViewEx() + : base() + { + ToBeRemovedItems = new List(); + + /// Initialize the base (ListViewEx) + this.SuspendLayout(); + AllowColumnReorder = false; + Dock = System.Windows.Forms.DockStyle.Fill; + DoubleClickActivation = false; + FullRowSelect = true; + GridLines = true; + Location = new System.Drawing.Point(0, 0); + Name = "baseWithListViewEx"; + Size = new System.Drawing.Size(150, 150); + TabIndex = 0; + UseCompatibleStateImageBehavior = false; + View = System.Windows.Forms.View.Details; + ResumeLayout(false); + } + + public void Unlock() + { + unlocked = true; + + if (base.SelectedItems.Count == 1) + { + int ix = SelectedIndices[0]; + Focus(); + Items[ix].Selected = true; + Items[ix].EnsureVisible(); + } + } + + protected void RedrawAll() + { + Items.Clear(); + foreach (var myItem in MyItems) DrawOne(myItem); + } + + public virtual void DrawOne(object myItem) + { + } + + void UpdateAll() + { + if (MyItems == null || (MyItems.Count != Items.Count)) return; + + foreach (ListViewItem lvi in Items) + { + UpdateOne(lvi, (MyItem)lvi.Tag); + } + } + + public virtual void UpdateOne(ListViewItem lvi, object myItem) + { + } + + public void OkBtnClicked() + { + UpdateAll(); + } + + public void CancelBtnClicked() + { + } + + public void AddOne(MyItem myItem) + { + MyItems.Add(myItem); + DrawOne(myItem); + + Focus(); + SelectedItems.Clear(); + Items[Items.Count - 1].Selected = true; + Items[Items.Count - 1].EnsureVisible(); + } + + /// + /// Called when 'Remove' button was clicked. + /// + /// true when the last item was removed and 'Remove' button should be disabled + public bool RemoveSelected() + { + if (SelectedItems.Count != 1) return false; + + UpdateAll(); + + int removeItemNr = SelectedIndices[0]; + if (removeItemNr < FixedRowsCount) return false; + + MyItem selectedItem = (MyItem)SelectedItems[0].Tag; + + if (selectedItem is IHasItemNr && (selectedItem as IHasItemNr).Id != 0) + { + ToBeRemovedItems.Add(selectedItem); + } + MyItems.RemoveAt(removeItemNr); + if (selectedItem is IHasItemNr) + { + for (int i = removeItemNr; i < MyItems.Count; i++) + { + (MyItems[i] as IHasItemNr).ItemNr--; + } + } + + RedrawAll(); + + if (removeItemNr < base.Items.Count) + { + Focus(); + Items[removeItemNr].Selected = true; + Items[removeItemNr].EnsureVisible(); + return false; + } + else + { + return true; + } + } + + public void MoveUpSelected() + { + if (SelectedItems.Count != 1) return; + + int ix = base.SelectedIndices[0]; + if (ix <= FixedRowsCount || ix >= MyItems.Count) return; + + UpdateAll(); + + MyItem item1 = (MyItem)(Items[ix - 1].Tag); + MyItem item2 = (MyItem)(Items[ix].Tag); + (item1 as IHasItemNr).ItemNr++; + (item2 as IHasItemNr).ItemNr--; + MyItems.RemoveAt(ix); + MyItems.Insert(ix - 1, item2); + + RedrawAll(); + + Focus(); + Items[ix - 1].Selected = true; + Items[ix - 1].EnsureVisible(); + } + + public void MoveDownSelected() + { + if (base.SelectedItems.Count != 1) return; + + int ix = base.SelectedIndices[0]; + if (ix < FixedRowsCount || ix >= MyItems.Count - 1) return; + + UpdateAll(); + + MyItem item1 = (MyItem)(Items[ix].Tag); + MyItem item2 = (MyItem)(Items[ix + 1].Tag); + (item1 as IHasItemNr).ItemNr++; + (item2 as IHasItemNr).ItemNr--; + MyItems.RemoveAt(ix + 1); + MyItems.Insert(ix, item2); + + RedrawAll(); + + Focus(); + Items[ix + 1].Selected = true; + Items[ix + 1].EnsureVisible(); + } + + + public IList GetUsedNames() + { + IList usedNames = new List(); + + if (MyItems != null) + { + foreach (var item in MyItems) if (item is IHasName) usedNames.Add((item as IHasName).Name); + } + + return usedNames; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/BenchControlPanel.Designer.cs b/TBF_V2/Sources/TBF/TBF/UiControls/BenchControlPanel.Designer.cs new file mode 100644 index 00000000..3b96d7f1 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/BenchControlPanel.Designer.cs @@ -0,0 +1,320 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.UiControls +{ + partial class BenchControlPanel + { + /// + /// 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 Component 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(BenchControlPanel)); + this.stopBtn = new System.Windows.Forms.Button(); + this.startTestBtn = new System.Windows.Forms.Button(); + this.startCycleBtn = new System.Windows.Forms.Button(); + this.purgeBeginBtn = new System.Windows.Forms.Button(); + this.purgeEndBtn = new System.Windows.Forms.Button(); + this.breakBtn = new System.Windows.Forms.Button(); + this.resetResultsBtn = new System.Windows.Forms.Button(); + this.emptyTank1Btn = new System.Windows.Forms.Button(); + this.emptyTank2Btn = new System.Windows.Forms.Button(); + this.testGroupBox = new System.Windows.Forms.GroupBox(); + this.acceptResultsBtn = new System.Windows.Forms.Button(); + this.startQ3Btn = new System.Windows.Forms.Button(); + this.startQ2Btn = new System.Windows.Forms.Button(); + this.startQ1Btn = new System.Windows.Forms.Button(); + this.testComboBox = new System.Windows.Forms.ComboBox(); + this.purgeGroupBox = new System.Windows.Forms.GroupBox(); + this.emptyGroupBox = new System.Windows.Forms.GroupBox(); + this.emptyTank3Btn = new System.Windows.Forms.Button(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.cameraTestBtn = new System.Windows.Forms.Button(); + this.nextButton = new System.Windows.Forms.Button(); + this.sensitivityTestBtn = new System.Windows.Forms.Button(); + this.customButton = new System.Windows.Forms.Button(); + this.testGroupBox.SuspendLayout(); + this.purgeGroupBox.SuspendLayout(); + this.emptyGroupBox.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // stopBtn + // + resources.ApplyResources(this.stopBtn, "stopBtn"); + this.stopBtn.BackColor = System.Drawing.Color.Tomato; + this.stopBtn.ImageKey = global::TBF.Resources.Strings.Camera; + this.stopBtn.Name = "stopBtn"; + this.stopBtn.UseVisualStyleBackColor = false; + this.stopBtn.Click += new System.EventHandler(this.stopBtn_Click); + // + // startTestBtn + // + resources.ApplyResources(this.startTestBtn, "startTestBtn"); + this.startTestBtn.BackColor = System.Drawing.Color.DarkSeaGreen; + this.startTestBtn.ImageKey = global::TBF.Resources.Strings.Camera; + this.startTestBtn.Name = "startTestBtn"; + this.startTestBtn.UseVisualStyleBackColor = false; + this.startTestBtn.Click += new System.EventHandler(this.startTestBtn_Click); + // + // startCycleBtn + // + resources.ApplyResources(this.startCycleBtn, "startCycleBtn"); + this.startCycleBtn.BackColor = System.Drawing.Color.SteelBlue; + this.startCycleBtn.ImageKey = global::TBF.Resources.Strings.Camera; + this.startCycleBtn.Name = "startCycleBtn"; + this.startCycleBtn.UseVisualStyleBackColor = false; + this.startCycleBtn.Click += new System.EventHandler(this.startCycleBtn_Click); + // + // purgeBeginBtn + // + resources.ApplyResources(this.purgeBeginBtn, "purgeBeginBtn"); + this.purgeBeginBtn.BackColor = System.Drawing.Color.LightSteelBlue; + this.purgeBeginBtn.ImageKey = global::TBF.Resources.Strings.Camera; + this.purgeBeginBtn.Name = "purgeBeginBtn"; + this.purgeBeginBtn.UseVisualStyleBackColor = false; + this.purgeBeginBtn.Click += new System.EventHandler(this.purgeBeginBtn_Click); + // + // purgeEndBtn + // + resources.ApplyResources(this.purgeEndBtn, "purgeEndBtn"); + this.purgeEndBtn.BackColor = System.Drawing.Color.LightSteelBlue; + this.purgeEndBtn.ImageKey = global::TBF.Resources.Strings.Camera; + this.purgeEndBtn.Name = "purgeEndBtn"; + this.purgeEndBtn.UseVisualStyleBackColor = false; + this.purgeEndBtn.Click += new System.EventHandler(this.purgeEndBtn_Click); + // + // breakBtn + // + resources.ApplyResources(this.breakBtn, "breakBtn"); + this.breakBtn.BackColor = System.Drawing.Color.DarkGray; + this.breakBtn.ImageKey = global::TBF.Resources.Strings.Camera; + this.breakBtn.Name = "breakBtn"; + this.breakBtn.UseVisualStyleBackColor = false; + this.breakBtn.Click += new System.EventHandler(this.breakBtn_Click); + // + // resetResultsBtn + // + resources.ApplyResources(this.resetResultsBtn, "resetResultsBtn"); + this.resetResultsBtn.BackColor = System.Drawing.Color.Tomato; + this.resetResultsBtn.ImageKey = global::TBF.Resources.Strings.Camera; + this.resetResultsBtn.Name = "resetResultsBtn"; + this.resetResultsBtn.UseVisualStyleBackColor = false; + this.resetResultsBtn.Click += new System.EventHandler(this.resetResultsBtn_Click); + // + // emptyTank1Btn + // + resources.ApplyResources(this.emptyTank1Btn, "emptyTank1Btn"); + this.emptyTank1Btn.BackColor = System.Drawing.Color.LightSteelBlue; + this.emptyTank1Btn.ImageKey = global::TBF.Resources.Strings.Camera; + this.emptyTank1Btn.Name = "emptyTank1Btn"; + this.emptyTank1Btn.UseVisualStyleBackColor = false; + this.emptyTank1Btn.Click += new System.EventHandler(this.emptyTank1Btn_Click); + // + // emptyTank2Btn + // + resources.ApplyResources(this.emptyTank2Btn, "emptyTank2Btn"); + this.emptyTank2Btn.BackColor = System.Drawing.Color.LightSteelBlue; + this.emptyTank2Btn.ImageKey = global::TBF.Resources.Strings.Camera; + this.emptyTank2Btn.Name = "emptyTank2Btn"; + this.emptyTank2Btn.UseVisualStyleBackColor = false; + this.emptyTank2Btn.Click += new System.EventHandler(this.emptyTank2Btn_Click); + // + // testGroupBox + // + resources.ApplyResources(this.testGroupBox, "testGroupBox"); + this.testGroupBox.Controls.Add(this.acceptResultsBtn); + this.testGroupBox.Controls.Add(this.startQ3Btn); + this.testGroupBox.Controls.Add(this.startQ2Btn); + this.testGroupBox.Controls.Add(this.startQ1Btn); + this.testGroupBox.Controls.Add(this.breakBtn); + this.testGroupBox.Controls.Add(this.testComboBox); + this.testGroupBox.Controls.Add(this.startTestBtn); + this.testGroupBox.Controls.Add(this.startCycleBtn); + this.testGroupBox.Name = "testGroupBox"; + this.testGroupBox.TabStop = false; + // + // acceptResultsBtn + // + resources.ApplyResources(this.acceptResultsBtn, "acceptResultsBtn"); + this.acceptResultsBtn.BackColor = System.Drawing.Color.DarkKhaki; + this.acceptResultsBtn.ImageKey = global::TBF.Resources.Strings.Camera; + this.acceptResultsBtn.Name = "acceptResultsBtn"; + this.acceptResultsBtn.UseVisualStyleBackColor = false; + this.acceptResultsBtn.Click += new System.EventHandler(this.acceptResultsBtn_Click); + // + // startQ3Btn + // + resources.ApplyResources(this.startQ3Btn, "startQ3Btn"); + this.startQ3Btn.BackColor = System.Drawing.Color.DarkSeaGreen; + this.startQ3Btn.ImageKey = global::TBF.Resources.Strings.Camera; + this.startQ3Btn.Name = "startQ3Btn"; + this.startQ3Btn.UseVisualStyleBackColor = false; + this.startQ3Btn.Click += new System.EventHandler(this.startQ3Btn_Click); + // + // startQ2Btn + // + resources.ApplyResources(this.startQ2Btn, "startQ2Btn"); + this.startQ2Btn.BackColor = System.Drawing.Color.DarkSeaGreen; + this.startQ2Btn.ImageKey = global::TBF.Resources.Strings.Camera; + this.startQ2Btn.Name = "startQ2Btn"; + this.startQ2Btn.UseVisualStyleBackColor = false; + this.startQ2Btn.Click += new System.EventHandler(this.startQ2Btn_Click); + // + // startQ1Btn + // + resources.ApplyResources(this.startQ1Btn, "startQ1Btn"); + this.startQ1Btn.BackColor = System.Drawing.Color.DarkSeaGreen; + this.startQ1Btn.ImageKey = global::TBF.Resources.Strings.Camera; + this.startQ1Btn.Name = "startQ1Btn"; + this.startQ1Btn.UseVisualStyleBackColor = false; + this.startQ1Btn.Click += new System.EventHandler(this.startQ1Btn_Click); + // + // testComboBox + // + resources.ApplyResources(this.testComboBox, "testComboBox"); + this.testComboBox.FormattingEnabled = true; + this.testComboBox.Name = "testComboBox"; + this.testComboBox.SelectedIndexChanged += new System.EventHandler(this.testComboBox_SelectedIndexChanged); + // + // purgeGroupBox + // + resources.ApplyResources(this.purgeGroupBox, "purgeGroupBox"); + this.purgeGroupBox.BackColor = System.Drawing.SystemColors.Control; + this.purgeGroupBox.Controls.Add(this.purgeEndBtn); + this.purgeGroupBox.Controls.Add(this.purgeBeginBtn); + this.purgeGroupBox.Name = "purgeGroupBox"; + this.purgeGroupBox.TabStop = false; + // + // emptyGroupBox + // + resources.ApplyResources(this.emptyGroupBox, "emptyGroupBox"); + this.emptyGroupBox.Controls.Add(this.emptyTank3Btn); + this.emptyGroupBox.Controls.Add(this.emptyTank1Btn); + this.emptyGroupBox.Controls.Add(this.emptyTank2Btn); + this.emptyGroupBox.Name = "emptyGroupBox"; + this.emptyGroupBox.TabStop = false; + // + // emptyTank3Btn + // + resources.ApplyResources(this.emptyTank3Btn, "emptyTank3Btn"); + this.emptyTank3Btn.BackColor = System.Drawing.Color.LightSteelBlue; + this.emptyTank3Btn.ImageKey = global::TBF.Resources.Strings.Camera; + this.emptyTank3Btn.Name = "emptyTank3Btn"; + this.emptyTank3Btn.UseVisualStyleBackColor = false; + this.emptyTank3Btn.Click += new System.EventHandler(this.emptyTank3Btn_Click); + // + // groupBox1 + // + resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Controls.Add(this.resetResultsBtn); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.TabStop = false; + // + // cameraTestBtn + // + resources.ApplyResources(this.cameraTestBtn, "cameraTestBtn"); + this.cameraTestBtn.BackColor = System.Drawing.Color.DarkGray; + this.cameraTestBtn.ImageKey = global::TBF.Resources.Strings.Camera; + this.cameraTestBtn.Name = "cameraTestBtn"; + this.cameraTestBtn.UseVisualStyleBackColor = false; + this.cameraTestBtn.Click += new System.EventHandler(this.cameraTestBtn_Click); + // + // nextButton + // + resources.ApplyResources(this.nextButton, "nextButton"); + this.nextButton.ImageKey = global::TBF.Resources.Strings.Camera; + this.nextButton.Name = "nextButton"; + this.nextButton.UseVisualStyleBackColor = true; + this.nextButton.Click += new System.EventHandler(this.nextButton_Click); + // + // sensitivityTestBtn + // + resources.ApplyResources(this.sensitivityTestBtn, "sensitivityTestBtn"); + this.sensitivityTestBtn.BackColor = System.Drawing.Color.DarkGray; + this.sensitivityTestBtn.ImageKey = global::TBF.Resources.Strings.Camera; + this.sensitivityTestBtn.Name = "sensitivityTestBtn"; + this.sensitivityTestBtn.UseVisualStyleBackColor = false; + this.sensitivityTestBtn.Click += new System.EventHandler(this.sensitivityTestBtn_Click); + // + // customButton + // + resources.ApplyResources(this.customButton, "customButton"); + this.customButton.ImageKey = global::TBF.Resources.Strings.Camera; + this.customButton.Name = "customButton"; + this.customButton.UseVisualStyleBackColor = true; + this.customButton.Click += new System.EventHandler(this.customButton_Click); + // + // BenchControlPanel + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.Control; + this.Controls.Add(this.cameraTestBtn); + this.Controls.Add(this.sensitivityTestBtn); + this.Controls.Add(this.customButton); + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.nextButton); + this.Controls.Add(this.emptyGroupBox); + this.Controls.Add(this.purgeGroupBox); + this.Controls.Add(this.testGroupBox); + this.Controls.Add(this.stopBtn); + this.Name = "BenchControlPanel"; + this.Load += new System.EventHandler(this.BenchControlPanel_Load); + this.testGroupBox.ResumeLayout(false); + this.purgeGroupBox.ResumeLayout(false); + this.emptyGroupBox.ResumeLayout(false); + this.groupBox1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button stopBtn; + private System.Windows.Forms.Button startTestBtn; + private System.Windows.Forms.Button startCycleBtn; + private System.Windows.Forms.Button purgeBeginBtn; + private System.Windows.Forms.Button purgeEndBtn; + private System.Windows.Forms.Button breakBtn; + private System.Windows.Forms.Button resetResultsBtn; + private System.Windows.Forms.Button emptyTank1Btn; + private System.Windows.Forms.Button emptyTank2Btn; + private System.Windows.Forms.GroupBox testGroupBox; + private System.Windows.Forms.ComboBox testComboBox; + private System.Windows.Forms.Button startQ1Btn; + private System.Windows.Forms.Button startQ3Btn; + private System.Windows.Forms.Button startQ2Btn; + private System.Windows.Forms.GroupBox purgeGroupBox; + private System.Windows.Forms.GroupBox emptyGroupBox; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Button acceptResultsBtn; + private System.Windows.Forms.Button emptyTank3Btn; + private System.Windows.Forms.Button cameraTestBtn; + private System.Windows.Forms.Button nextButton; + private System.Windows.Forms.Button sensitivityTestBtn; + private System.Windows.Forms.Button customButton; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/BenchControlPanel.cs b/TBF_V2/Sources/TBF/TBF/UiControls/BenchControlPanel.cs new file mode 100644 index 00000000..eb9c36b7 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/BenchControlPanel.cs @@ -0,0 +1,418 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.UiBridge; +using TBF.Resources; + +namespace TBF.UiControls +{ + public partial class BenchControlPanel : UserControl + { + static readonly ILog log = LogManager.GetLogger(typeof(BenchControlPanel)); + + public string TestName; + + // Original (enabled) colors of buttons and empty bench + Color colorStopEn; + Color colorTestsEn; + Color colorCycleEn; + Color colorPurgeEn; + Color colorAcceptEn; + Color colorDrainEn; + Color colorOtherEn; + + Color colorBenchEmpty; + + // Colors of disabled buttons + Color colorStopDis; + Color colorTestsDis; + Color colorCycleDis; + Color colorPurgeDis; + Color colorAcceptDis; + Color colorDrainDis; + Color colorOtherDis; + + // Colors of Highlighted buttons + Color colorDrainHi; + + + bool drain1Highlighted; + bool drain2Highlighted; + bool drain3Highlighted; + + + public int BalancesCount + { + set + { + if (value <= 2) + { + emptyTank1Btn.Size = new Size(92, 35); + emptyTank2Btn.Size = new Size(92, 35); + emptyTank2Btn.Location = new Point(106, 26); + emptyTank3Btn.Visible = false; + } + } + } + + + public BenchControlPanel() + { + InitializeComponent(); + + drain1Highlighted = false; + drain2Highlighted = false; + drain3Highlighted = false; + + Bridge.ButtonsEtcHandler += delegate(object sender, ButtonsEtcEventArgs args) + { + if (InvokeRequired) + { + Invoke(new EventHandler(OnButtonsEtc), sender, args); + } + else OnButtonsEtc(sender, args); + }; + + Bridge.ProcedureSelectedHandler += delegate(object sender, ProcedureSelectedEventArgs args) + { + if (InvokeRequired) + { + Invoke(new EventHandler(OnProcedureSelected), sender, args); + } + else OnProcedureSelected(sender, args); + }; + + Bridge.TestSelectedHandler += delegate(object sender, TestSelectedEventArgs args) + { + if (InvokeRequired) + { + Invoke(new EventHandler(OnTestSelected), sender, args); + } + else OnTestSelected(sender, args); + }; + +#if DEBUG + nextButton.Visible = true; + nextButton.Enabled = true; +#endif + } + + /// This is to calculate an RGB component of a lighter color + int Lghtr(int component) + { + return 255 - (255 - component) / 2; + } + + /// This is to calculate an RGB component of a darker color + int Drkr(int component) + { + return component / 2; + } + + + private void BenchControlPanel_Load(object sender, EventArgs e) + { + //Localize(); + + // Original (enabled) colors of buttons + colorStopEn = stopBtn.BackColor; + colorTestsEn = startTestBtn.BackColor; + colorCycleEn = startCycleBtn.BackColor; + colorPurgeEn = purgeBeginBtn.BackColor; + colorAcceptEn = acceptResultsBtn.BackColor; + colorDrainEn = emptyTank1Btn.BackColor; + colorOtherEn = breakBtn.BackColor; + + colorBenchEmpty = emptyGroupBox.BackColor; + + /// Colors of disabled buttons + //colorStopDis = Color.FromArgb(Lghtr(colorStopEn.R), Lghtr(colorStopEn.G), Lghtr(colorStopEn.B)); + //colorTestsDis = Color.FromArgb(Lghtr(colorTestsEn.R), Lghtr(colorTestsEn.G), Lghtr(colorTestsEn.B)); + //colorCycleDis = Color.FromArgb(Lghtr(colorCycleEn.R), Lghtr(colorCycleEn.G), Lghtr(colorCycleEn.B)); + //colorPurgeDis = Color.FromArgb(Lghtr(colorPurgeEn.R), Lghtr(colorPurgeEn.G), Lghtr(colorPurgeEn.B)); + //colorAcceptDis = Color.FromArgb(Lghtr(colorAcceptEn.R), Lghtr(colorAcceptEn.G), Lghtr(colorAcceptEn.B)); + //colorDrainDis = Color.FromArgb(Lghtr(colorDrainEn.R), Lghtr(colorDrainEn.G), Lghtr(colorDrainEn.B)); + //colorOtherDis = Color.FromArgb(Lghtr(colorOtherEn.R), Lghtr(colorOtherEn.G), Lghtr(colorOtherEn.B)); + colorStopDis = System.Drawing.SystemColors.Control; + colorTestsDis = System.Drawing.SystemColors.Control; + colorCycleDis = System.Drawing.SystemColors.Control; + colorPurgeDis = System.Drawing.SystemColors.Control; + colorAcceptDis = System.Drawing.SystemColors.Control; + colorDrainDis = System.Drawing.SystemColors.Control; + colorOtherDis = System.Drawing.SystemColors.Control; + + colorDrainHi = Color.FromArgb(Drkr(colorDrainEn.R), Drkr(colorDrainEn.G), Drkr(colorDrainEn.B)); + } + + void Localize() + { + testGroupBox.Text = Strings.Session; + emptyGroupBox.Text = Strings.Drain; + } + + /// + /// Read the database and re-initialize testComboBox items. + /// Try to preserve the original selection. + /// + public void ReloadTests() + { + if (Program.MainWnd.SelectedProcedure == null || string.IsNullOrEmpty(Program.MainWnd.SelectedProcedure.Name)) return; + + string oriTestName = testComboBox.Text; + + IList procedures = Config.FluentCommon.CreateSession(Program.MainWnd.SelectedProcedure.DBKind) + .QueryOver() + .Where(x => (x.ProcedureState == ProcedureState.Active)) + .And(x => (x.Name == Program.MainWnd.SelectedProcedure.Name)) + .List(); + if (procedures.Count != 1) + { + testComboBox.Text = string.Empty; + TestName = null; + Program.MainWnd.CurrentProcedure = null; + return; + } + + Program.MainWnd.CurrentProcedure = procedures[0]; + + testComboBox.Items.Clear(); + foreach (var test in procedures[0].Tests) + { + for (int i = 1; i <= test.Repeats; i++) + { + testComboBox.Items.Add(Utils.TestTitle(test, i)); + } + } + + if (testComboBox.Items.Contains(oriTestName)) + { + testComboBox.Text = oriTestName; + TestName = oriTestName; + } + else if (procedures[0].Tests.Count > 0) + { + Test test = procedures[0].Tests[0]; + string title; + if (test.Repeats == 1) + { + if (test.Part == 0) + title = test.Name; /// Single test + else + title = string.Format("{0} ({1})", test.Name, test.Part); /// A part of a single test + } + else + { + title = string.Format("{0} ({1}/{2})", test.Name, 1, test.Repeats); /// More test repetitions + } + + testComboBox.Text = title; + TestName = title; + } + else + { + testComboBox.Text = string.Empty; + TestName = null; + } + } + + private void testComboBox_SelectedIndexChanged(object sender, EventArgs e) + { + TestName = testComboBox.Text; + startTestBtn.Select(); + } + + + private void startTestBtn_Click(object sender, EventArgs e) { Bridge.Ui2Bench(UI2BenchCmd.StartTest); } + private void startQ1Btn_Click(object sender, EventArgs e) { Bridge.Ui2Bench(UI2BenchCmd.StartQ1); } + private void startQ2Btn_Click(object sender, EventArgs e) { Bridge.Ui2Bench(UI2BenchCmd.StartQ2); } + private void startQ3Btn_Click(object sender, EventArgs e) { Bridge.Ui2Bench(UI2BenchCmd.StartQ3); } + private void startCycleBtn_Click(object sender, EventArgs e) { Bridge.Ui2Bench(UI2BenchCmd.StartCycle); } + private void stopBtn_Click(object sender, EventArgs e) { Bridge.Ui2Bench(UI2BenchCmd.Stop); } + private void purgeBeginBtn_Click(object sender, EventArgs e) { Bridge.Ui2Bench(UI2BenchCmd.PurgeBegin); } + private void purgeEndBtn_Click(object sender, EventArgs e) { Bridge.Ui2Bench(UI2BenchCmd.PurgeEnd); } + private void breakBtn_Click(object sender, EventArgs e) { Bridge.Ui2Bench(UI2BenchCmd.Break); } + private void resetResultsBtn_Click(object sender, EventArgs e) { Bridge.Ui2Bench(UI2BenchCmd.ResetResults); } + private void acceptResultsBtn_Click(object sender, EventArgs e) { Bridge.Ui2Bench(UI2BenchCmd.AcceptResults); } + private void cameraTestBtn_Click(object sender, EventArgs e) { Bridge.Ui2Bench(UI2BenchCmd.CameraTest); } + private void sensitivityTestBtn_Click(object sender, EventArgs e){ Bridge.Ui2Bench(UI2BenchCmd.SensitivityTest); } + private void button1_Click(object sender, EventArgs e) { Bridge.Ui2Bench(UI2BenchCmd.B1); } + private void button2_Click(object sender, EventArgs e) { Bridge.Ui2Bench(UI2BenchCmd.B2); } + private void nextButton_Click(object sender, EventArgs e) { Bridge.Ui2Bench(UI2BenchCmd.Next); } + private void customButton_Click(object sender, EventArgs e) { Bridge.Ui2Bench(UI2BenchCmd.Custom); } + + private void emptyTank1Btn_Click(object sender, EventArgs e) + { +#if TURA_IPERL + /// Prevent 'Stop draining' by password + if (drain1Highlighted && !Users.GlobalData.CurrentUser.IsMemberOf(Users.Grp.GID.TestingSpecialists)) + { + if ((new Users.Forms.LoginDlg(Users.Grp.GID.TestingSpecialists)).ShowDialog() != DialogResult.OK) + return; + + if (Program.MainWnd != null) Program.MainWnd.UpdateUser(); + Bridge.Ui2Bench(UI2BenchCmd.StopDrainingTank1); + return; + } +#endif + Bridge.Ui2Bench(drain1Highlighted ? UI2BenchCmd.StopDrainingTank1 : UI2BenchCmd.DrainTank1); + } + + private void emptyTank2Btn_Click(object sender, EventArgs e) + { +#if TURA_IPERL + /// Prevent 'Stop draining' by password + if (drain1Highlighted && !Users.GlobalData.CurrentUser.IsMemberOf(Users.Grp.GID.TestingSpecialists)) + { + if ((new Users.Forms.LoginDlg(Users.Grp.GID.TestingSpecialists)).ShowDialog() != DialogResult.OK) + return; + + if (Program.MainWnd != null) Program.MainWnd.UpdateUser(); + Bridge.Ui2Bench(UI2BenchCmd.StopDrainingTank2); + return; + } +#endif + Bridge.Ui2Bench(drain2Highlighted ? UI2BenchCmd.StopDrainingTank2 : UI2BenchCmd.DrainTank2); + } + + private void emptyTank3Btn_Click(object sender, EventArgs e) + { +#if TURA_IPERL + /// Prevent 'Stop draining' by password + if (drain1Highlighted && !Users.GlobalData.CurrentUser.IsMemberOf(Users.Grp.GID.TestingSpecialists)) + { + if ((new Users.Forms.LoginDlg(Users.Grp.GID.TestingSpecialists)).ShowDialog() != DialogResult.OK) + return; + + if (Program.MainWnd != null) Program.MainWnd.UpdateUser(); + Bridge.Ui2Bench(UI2BenchCmd.StopDrainingTank3); + return; + } +#endif + Bridge.Ui2Bench(drain3Highlighted ? UI2BenchCmd.StopDrainingTank3 : UI2BenchCmd.DrainTank3); + } + + + /// + /// Processes a pressed keys. + /// + /// key (char) + /// true when the key is handled, otherwise false + public bool ProcessKey(char key) + { + switch (key) + { + case '0': if (stopBtn.Enabled) { Bridge.Ui2Bench(UI2BenchCmd.Stop); } return true; + case '1': if (startQ1Btn.Enabled) { Bridge.Ui2Bench(UI2BenchCmd.StartQ1); } return true; + case '2': if (startQ2Btn.Enabled) { Bridge.Ui2Bench(UI2BenchCmd.StartQ2); } return true; + case '3': if (startQ3Btn.Enabled) { Bridge.Ui2Bench(UI2BenchCmd.StartQ3); } return true; + case '4': if (startTestBtn.Enabled) { Bridge.Ui2Bench(UI2BenchCmd.StartTest); } return true; + case '5': if (startCycleBtn.Enabled) { Bridge.Ui2Bench(UI2BenchCmd.StartCycle); } return true; + case '6': if (purgeBeginBtn.Enabled) { Bridge.Ui2Bench(UI2BenchCmd.PurgeBegin); } return true; + case '7': if (purgeEndBtn.Enabled) { Bridge.Ui2Bench(UI2BenchCmd.PurgeEnd); } return true; + case '8': + if (emptyTank1Btn.Enabled) + { + Bridge.Ui2Bench(drain1Highlighted ? UI2BenchCmd.StopDrainingTank1 : UI2BenchCmd.DrainTank1); + } + return true; + case '9': + if (emptyTank2Btn.Enabled) + { + Bridge.Ui2Bench(drain2Highlighted ? UI2BenchCmd.StopDrainingTank2 : UI2BenchCmd.DrainTank2); + } + return true; + default: + return false; + } + } + + + public void OnProcedureSelected(object sender, ProcedureSelectedEventArgs args) + { + ReloadTests(); + } + + public void OnTestSelected(object sender, TestSelectedEventArgs args) + { + testComboBox.Text = args.Test.Name; + } + + + public void OnButtonsEtc(object sender, ButtonsEtcEventArgs args) + { + if ((args.Flags & ButtonsEtc.ShowBenchEmpty) != 0) + { + purgeGroupBox.BackColor = colorBenchEmpty; + return; + } + else if ((args.Flags & ButtonsEtc.ShowBenchFilled) != 0) + { + purgeGroupBox.BackColor = Color.RoyalBlue; + return; + } + + testComboBox.Enabled = ((args.Flags & ButtonsEtc.TestCmbBoxEn) != 0); + + stopBtn.Enabled = ((args.Flags & ButtonsEtc.StopBtnEn) != 0); + stopBtn.BackColor = stopBtn.Enabled ? colorStopEn : colorStopDis; + + startTestBtn.Enabled = ((args.Flags & ButtonsEtc.StartTestBtnsEn) != 0); + startTestBtn.BackColor = startTestBtn.Enabled ? colorTestsEn : colorTestsDis; + + startQ1Btn.Enabled = ((args.Flags & ButtonsEtc.StartTestBtnsEn) != 0); + startQ1Btn.BackColor = startQ1Btn.Enabled ? colorTestsEn : colorTestsDis; + + startQ2Btn.Enabled = ((args.Flags & ButtonsEtc.StartTestBtnsEn) != 0); + startQ2Btn.BackColor = startQ2Btn.Enabled ? colorTestsEn : colorTestsDis; + + startQ3Btn.Enabled = ((args.Flags & ButtonsEtc.StartTestBtnsEn) != 0); + startQ3Btn.BackColor = startQ3Btn.Enabled ? colorTestsEn : colorTestsDis; + + startCycleBtn.Enabled = ((args.Flags & ButtonsEtc.StartCycleBtnEn) != 0); + startCycleBtn.BackColor = startCycleBtn.Enabled ? colorCycleEn : colorCycleDis; + +#if OPRAV_DEWY + customButton.Visible = ((args.Flags & ButtonsEtc.StartCycleBtnEn) != 0); + customButton.BackColor = customButton.Visible ? colorCycleEn : colorCycleDis; +#endif + purgeBeginBtn.Enabled = ((args.Flags & ButtonsEtc.PurgeBeginBtnEn) != 0); + purgeBeginBtn.BackColor = purgeBeginBtn.Enabled ? colorPurgeEn : colorPurgeDis; + + purgeEndBtn.Enabled = ((args.Flags & ButtonsEtc.PurgeEndBtnEn) != 0); + purgeEndBtn.BackColor = purgeEndBtn.Enabled ? colorPurgeEn : colorPurgeDis; + + emptyTank1Btn.Enabled = ((args.Flags & (ButtonsEtc.DrainTankBtn1En | ButtonsEtc.DrainTankBtn1Hi)) != 0); + drain1Highlighted = ((args.Flags & ButtonsEtc.DrainTankBtn1Hi) != 0); + emptyTank1Btn.BackColor = emptyTank1Btn.Enabled ? (drain1Highlighted ? colorDrainHi : colorDrainEn) : colorDrainDis; + + emptyTank2Btn.Enabled = ((args.Flags & (ButtonsEtc.DrainTankBtn2En | ButtonsEtc.DrainTankBtn2Hi)) != 0); + drain2Highlighted = ((args.Flags & ButtonsEtc.DrainTankBtn2Hi) != 0); + emptyTank2Btn.BackColor = emptyTank2Btn.Enabled ? (drain2Highlighted ? colorDrainHi : colorDrainEn) : colorDrainDis; + + emptyTank3Btn.Enabled = ((args.Flags & (ButtonsEtc.DrainTankBtn3En | ButtonsEtc.DrainTankBtn3Hi)) != 0); + drain3Highlighted = ((args.Flags & ButtonsEtc.DrainTankBtn3Hi) != 0); + emptyTank3Btn.BackColor = emptyTank3Btn.Enabled ? (drain3Highlighted ? colorDrainHi : colorDrainEn) : colorDrainDis; + + resetResultsBtn.Enabled = ((args.Flags & ButtonsEtc.ResetResultsBtnEn) != 0); + resetResultsBtn.BackColor = resetResultsBtn.Enabled ? colorStopEn : colorStopDis; + + acceptResultsBtn.Enabled = ((args.Flags & ButtonsEtc.AcceptResultsBtnEn) != 0); + acceptResultsBtn.BackColor = acceptResultsBtn.Enabled ? colorAcceptEn : colorAcceptDis; + + breakBtn.Enabled = ((args.Flags & ButtonsEtc.Break) != 0); + breakBtn.BackColor = breakBtn.Enabled ? colorOtherEn : colorOtherDis; + + cameraTestBtn.Enabled = ((args.Flags & ButtonsEtc.CalibrationBtnEn) != 0); + cameraTestBtn.BackColor = cameraTestBtn.Enabled ? colorOtherEn : colorOtherDis; + + sensitivityTestBtn.Enabled = ((args.Flags & ButtonsEtc.SensitivityTestBtnEn) != 0); + sensitivityTestBtn.BackColor = sensitivityTestBtn.Enabled ? colorOtherEn : colorOtherDis; + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/BenchControlPanel.cs.resx b/TBF_V2/Sources/TBF/TBF/UiControls/BenchControlPanel.cs.resx new file mode 100644 index 00000000..6adc5d1d --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/BenchControlPanel.cs.resx @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Spustit test + + + Spustit postup + + + + Verdana, 12pt + + + Napustit + + + Verdana, 12pt + + + Vypustit + + + Zrušit + + + Zamítnout + + + Test kamery + + + Citlivost + + + Trať + + + Vyprázdnit + + + Další + + + Pomocné funkce + + + Uložit a ukončit + + + Výsledky + + + Relace + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/BenchControlPanel.de.resx b/TBF_V2/Sources/TBF/TBF/UiControls/BenchControlPanel.de.resx new file mode 100644 index 00000000..a8700617 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/BenchControlPanel.de.resx @@ -0,0 +1,241 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + Verdana, 14.25pt + + + 69, 282 + + + Stopp + + + Verdana, 14.25pt + + + Start Prüfpunkt + + + Verdana, 14.25pt + + + Start Prüfvorlage + + + Verdana, 11pt + + + 93, 35 + + + 6 Befüllen + + + Verdana, 8pt + + + 104, 23 + + + 94, 35 + + + 7 Entwässern + + + Verdana, 14.25pt + + + Unterbrechen + + + Verdana, 12pt + + + zurücks. + + + Verdana, 14.25pt + + + Verdana, 14.25pt + + + 13, 3 + + + Prüfvorlage + + + Verdana, 14.25pt + + + Ergeb. speichern + + + Verdana, 14.25pt + + + Verdana, 14.25pt + + + Verdana, 14.25pt + + + 13, 358 + + + Prüfstrecke + + + 13, 432 + + + Leeren + + + 13, 642 + + + Ergebnisse + + + 113, 553 + + + 113, 506 + + + Verdana, 11.25pt + + + 15, 553 + + + Empfind- lichkeit + + + 14, 506 + + + 235, 1000 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/BenchControlPanel.it.resx b/TBF_V2/Sources/TBF/TBF/UiControls/BenchControlPanel.it.resx new file mode 100644 index 00000000..b0f78746 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/BenchControlPanel.it.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Inizio prove + + + risultati + + + ausiliaria + + + prove della fotocamera + + + azzerare + + + Fine + + + WT1 + + + Inizia + + + Q3 + + + WT2 + + + Q1 + + + Inizio ciclo + + + spurgo + + + Vuoto + + + prossimo + + + prova + + + Q2 + + + Fine ciclo + + + WT3 + + + Stop + + + Interrompere + + + sensibilità + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/BenchControlPanel.pl.resx b/TBF_V2/Sources/TBF/TBF/UiControls/BenchControlPanel.pl.resx new file mode 100644 index 00000000..ca511d14 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/BenchControlPanel.pl.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Start testu + + + Wyniki + + + Wspomagający + + + Test kamery + + + Zrzut + + + Koniec + + + W1 + + + Początek + + + Q3 + + + W2 + + + Q1 + + + Start cyklu + + + Usunąć + + + Pusty + + + Następny + + + Test + + + Q2 + + + Akceptuj + + + W3 + + + Stop + + + Przerwać + + + Czułość + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/BenchControlPanel.resx b/TBF_V2/Sources/TBF/TBF/UiControls/BenchControlPanel.resx new file mode 100644 index 00000000..a4fc07d1 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/BenchControlPanel.resx @@ -0,0 +1,834 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + W3 + + + $this + + + Start test + + + + NoControl + + + 1 + + + + Verdana, 15.75pt + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 5 + + + Verdana, 15.75pt + + + 5 + + + NoControl + + + 106, 23 + + + 4, 4, 4, 4 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 3 + + + + 5 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + False + + + Verdana, 12pt + + + NoControl + + + Verdana, 15.75pt + + + NoControl + + + 19 + + + Verdana, 15.75pt + + + purgeGroupBox + + + 12 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Camera test + + + 1 + + + Reset + + + 22 + + + startQ2Btn + + + sensitivityTestBtn + + + 92, 25 + + + 91, 25 + + + Sensi- tivity + + + Verdana, 11.25pt + + + 17 + + + 7, 355 + + + 10 + + + emptyTank3Btn + + + Drain + + + testGroupBox + + + testGroupBox + + + 8, 100 + + + Verdana, 15.75pt + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + W1 + + + 60, 38 + + + 1 + + + groupBox1 + + + $this + + + 7, 429 + + + startQ3Btn + + + NoControl + + + emptyGroupBox + + + Verdana, 15.75pt + + + testGroupBox + + + 6 + + + 15, 504 + + + 8 + + + 207, 68 + + + breakBtn + + + $this + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Verdana, 15.75pt + + + 7 + + + Flood + + + 0 + + + 8, 184 + + + 112, 504 + + + 0 + + + 22 + + + 21 + + + $this + + + Q1 + + + Start cycle + + + 60, 35 + + + nextButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + purgeEndBtn + + + Q3 + + + $this + + + 11 + + + 2 + + + 92, 35 + + + stopBtn + + + $this + + + 190, 38 + + + BenchControlPanel + + + Line + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 8, 142 + + + 8 + + + 14 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 92, 35 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 3 + + + 92, 42 + + + purgeBeginBtn + + + NoControl + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + testGroupBox + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Drain water tank + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + + + startQ1Btn + + + 0 + + + 13 + + + Verdana, 15.75pt + + + Verdana, 15.75pt + + + 7 + + + 6 + + + purgeGroupBox + + + 7, 588 + + + 7 + + + testGroupBox + + + resetResultsBtn + + + Verdana, 15.75pt + + + 190, 38 + + + Session + + + 60, 35 + + + 138, 26 + + + 73, 26 + + + Verdana, 15.75pt + + + startTestBtn + + + False + + + emptyTank1Btn + + + 92, 45 + + + 15 + + + False + + + 16 + + + 9 + + + testComboBox + + + 60, 35 + + + 60, 38 + + + 4 + + + 9 + + + 224, 736 + + + startCycleBtn + + + emptyTank2Btn + + + Verdana, 12pt + + + acceptResultsBtn + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 4 + + + emptyGroupBox + + + emptyGroupBox + + + 2 + + + cameraTestBtn + + + False + + + 8, 68 + + + testGroupBox + + + System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 138, 24 + + + NoControl + + + NoControl + + + 8 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + + + 8, 24 + + + Verdana, 15.75pt + + + NoControl + + + 4 + + + Stop + + + W2 + + + NoControl + + + NoControl + + + Abort session + + + 64, 282 + + + 2 + + + testGroupBox + + + 190, 33 + + + 112, 537 + + + 9, 18 + + + $this + + + Verdana, 12pt + + + Lucida Console, 8.25pt + + + NoControl + + + 1 + + + 15, 537 + + + NoControl + + + 7 + + + 190, 38 + + + 207, 68 + + + $this + + + Verdana, 15.75pt + + + Verdana, 12pt + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + Verdana, 15.75pt + + + emptyGroupBox + + + NoControl + + + 73, 24 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + False + + + 8, 26 + + + 18 + + + Lucida Console, 8.25pt + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 207, 68 + + + 92, 45 + + + End session + + + 7, 3 + + + 0 + + + Verdana, 12pt + + + purgeGroupBox + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 8, 226 + + + 8, 20 + + + Q2 + + + 190, 38 + + + groupBox1 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + testGroupBox + + + NoControl + + + customButton + + + NoControl + + + Verdana, 15.75pt + + + testGroupBox + + + Next + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Results + + + 92, 72 + + + 8, 23 + + + 15 + + + 207, 273 + + + Oprav DEWY + + + False + + + 6 + + + 60, 38 + + + Verdana, 12pt + + + True + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/BenchControlPanel.ru.resx b/TBF_V2/Sources/TBF/TBF/UiControls/BenchControlPanel.ru.resx new file mode 100644 index 00000000..07e81213 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/BenchControlPanel.ru.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Начать тест + + + Результаты + + + Вспомогательный + + + Тест камеры + + + Сброс + + + Конец + + + W1 + + + Начать + + + Q3 + + + W2 + + + Q1 + + + Запустить цикл + + + Очистка + + + Пустой + + + Следующий + + + Тест + + + Q2 + + + Принять + + + W3 + + + Стоп + + + Прервать + + + Чувствительность + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/BenchControlPanel.zh-CN.resx b/TBF_V2/Sources/TBF/TBF/UiControls/BenchControlPanel.zh-CN.resx new file mode 100644 index 00000000..ff7ebe98 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/BenchControlPanel.zh-CN.resx @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 停止 + + + 开始测试 + + + 启动循环 + + + 开始 + + + 结束 + + + 断开 + + + 重置 + + + 相机测试 + + + 水箱 1 + + + 灵敏度 + + + 水箱 2 + + + 测试 + + + 清除 + + + 清空 + + + 下一个 + + + 辅助的 + + + 接受 + + + 结果 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureCtrl.Designer.cs new file mode 100644 index 00000000..a8f44380 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureCtrl.Designer.cs @@ -0,0 +1,127 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.UiControls +{ + partial class CameraPictureCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.captionLabel = new System.Windows.Forms.Label(); + this.ledPictureBox = new System.Windows.Forms.PictureBox(); + this.pictureBox = new System.Windows.Forms.PictureBox(); + this.stopButton = new System.Windows.Forms.Button(); + this.saveButton = new System.Windows.Forms.Button(); + this.maxButton = new System.Windows.Forms.Button(); + ((System.ComponentModel.ISupportInitialize)(this.ledPictureBox)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit(); + this.SuspendLayout(); + // + // captionLabel + // + this.captionLabel.AutoSize = true; + this.captionLabel.ForeColor = System.Drawing.Color.Black; + this.captionLabel.Location = new System.Drawing.Point(16, 4); + this.captionLabel.Name = "captionLabel"; + this.captionLabel.Size = new System.Drawing.Size(86, 13); + this.captionLabel.TabIndex = 6; + this.captionLabel.Text = "No info available"; + // + // ledPictureBox + // + this.ledPictureBox.Location = new System.Drawing.Point(2, 4); + this.ledPictureBox.Name = "ledPictureBox"; + this.ledPictureBox.Size = new System.Drawing.Size(12, 12); + this.ledPictureBox.TabIndex = 5; + this.ledPictureBox.TabStop = false; + // + // pictureBox + // + this.pictureBox.Location = new System.Drawing.Point(2, 20); + this.pictureBox.Name = "pictureBox"; + this.pictureBox.Size = new System.Drawing.Size(320, 240); + this.pictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.pictureBox.TabIndex = 0; + this.pictureBox.TabStop = false; + // + // stopButton + // + this.stopButton.Location = new System.Drawing.Point(249, 1); + this.stopButton.Name = "stopButton"; + this.stopButton.Size = new System.Drawing.Size(24, 18); + this.stopButton.TabIndex = 7; + this.stopButton.UseVisualStyleBackColor = true; + this.stopButton.Click += new System.EventHandler(this.stopButton_Click); + // + // saveButton + // + this.saveButton.Location = new System.Drawing.Point(274, 1); + this.saveButton.Name = "saveButton"; + this.saveButton.Size = new System.Drawing.Size(24, 18); + this.saveButton.TabIndex = 8; + this.saveButton.UseVisualStyleBackColor = true; + this.saveButton.Click += new System.EventHandler(this.saveButton_Click); + // + // maxButton + // + this.maxButton.Location = new System.Drawing.Point(299, 1); + this.maxButton.Name = "maxButton"; + this.maxButton.Size = new System.Drawing.Size(24, 18); + this.maxButton.TabIndex = 9; + this.maxButton.UseVisualStyleBackColor = true; + this.maxButton.Click += new System.EventHandler(this.maxButton_Click); + // + // CameraPictureCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.ControlLight; + this.Controls.Add(this.maxButton); + this.Controls.Add(this.saveButton); + this.Controls.Add(this.stopButton); + this.Controls.Add(this.pictureBox); + this.Controls.Add(this.captionLabel); + this.Controls.Add(this.ledPictureBox); + this.Name = "CameraPictureCtrl"; + this.Size = new System.Drawing.Size(324, 262); + ((System.ComponentModel.ISupportInitialize)(this.ledPictureBox)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.PictureBox ledPictureBox; + private System.Windows.Forms.Label captionLabel; + private System.Windows.Forms.PictureBox pictureBox; + private System.Windows.Forms.Button stopButton; + private System.Windows.Forms.Button saveButton; + private System.Windows.Forms.Button maxButton; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureCtrl.cs b/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureCtrl.cs new file mode 100644 index 00000000..eb6ff78c --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureCtrl.cs @@ -0,0 +1,85 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Drawing; +using System.Windows.Forms; +using TBF.Resources; + +namespace TBF.UiControls +{ + public partial class CameraPictureCtrl : UserControl, ICameraPicture + { + private DateTime imageTimeStamp; + + public Image NewImage + { + set + { + pictureBox.Image = value; + imageTimeStamp = DateTime.Now; + ledPictureBox.BackColor = Color.Red; + } + } + + public Image Image + { + set { pictureBox.Image = value; } + get { return pictureBox.Image; } + } + + public DateTime TimeStamp + { + set { imageTimeStamp = value; } + get { return imageTimeStamp; } + } + + public string Caption + { + set { captionLabel.Text = value; } + get { return captionLabel.Text; } + } + + + public CameraPictureCtrl() + { + InitializeComponent(); + + captionLabel.Text = "No info available"; + } + + public CameraPictureCtrl(ICameraPicture oriCamPicture) + { + InitializeComponent(); + + captionLabel.Text = oriCamPicture.Caption; + pictureBox.Image = oriCamPicture.Image; + imageTimeStamp = oriCamPicture.TimeStamp; + + UpdateLed(DateTime.Now); + } + + + public void UpdateLed(DateTime now) + { + ledPictureBox.BackColor = (now - imageTimeStamp > TimeSpan.FromMilliseconds(500)) + ? SystemColors.Control + : Color.Red; + } + + private void stopButton_Click(object sender, EventArgs e) + { + + } + + private void saveButton_Click(object sender, EventArgs e) + { + + } + + private void maxButton_Click(object sender, EventArgs e) + { + + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureCtrl.resx b/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureCtrl2.Designer.cs b/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureCtrl2.Designer.cs new file mode 100644 index 00000000..8aaa2374 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureCtrl2.Designer.cs @@ -0,0 +1,130 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.UiControls +{ + partial class CameraPictureCtrl2 + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.captionLabel = new System.Windows.Forms.Label(); + this.ledPictureBox = new System.Windows.Forms.PictureBox(); + this.pictureBox = new System.Windows.Forms.PictureBox(); + this.stopButton = new System.Windows.Forms.Button(); + this.saveButton = new System.Windows.Forms.Button(); + this.maxButton = new System.Windows.Forms.Button(); + ((System.ComponentModel.ISupportInitialize)(this.ledPictureBox)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit(); + this.SuspendLayout(); + // + // captionLabel + // + this.captionLabel.AutoSize = true; + this.captionLabel.ForeColor = System.Drawing.Color.Black; + this.captionLabel.Location = new System.Drawing.Point(16, 4); + this.captionLabel.Name = "captionLabel"; + this.captionLabel.Size = new System.Drawing.Size(86, 13); + this.captionLabel.TabIndex = 6; + this.captionLabel.Text = "No info available"; + // + // ledPictureBox + // + this.ledPictureBox.Location = new System.Drawing.Point(2, 4); + this.ledPictureBox.Name = "ledPictureBox"; + this.ledPictureBox.Size = new System.Drawing.Size(12, 12); + this.ledPictureBox.TabIndex = 5; + this.ledPictureBox.TabStop = false; + // + // pictureBox + // + this.pictureBox.Location = new System.Drawing.Point(2, 20); + this.pictureBox.Name = "pictureBox"; + this.pictureBox.Size = new System.Drawing.Size(444, 333); + this.pictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.pictureBox.TabIndex = 0; + this.pictureBox.TabStop = false; + // + // stopButton + // + this.stopButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.stopButton.Location = new System.Drawing.Point(373, 1); + this.stopButton.Name = "stopButton"; + this.stopButton.Size = new System.Drawing.Size(24, 18); + this.stopButton.TabIndex = 7; + this.stopButton.UseVisualStyleBackColor = true; + this.stopButton.Click += new System.EventHandler(this.stopButton_Click); + // + // saveButton + // + this.saveButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.saveButton.Location = new System.Drawing.Point(398, 1); + this.saveButton.Name = "saveButton"; + this.saveButton.Size = new System.Drawing.Size(24, 18); + this.saveButton.TabIndex = 8; + this.saveButton.UseVisualStyleBackColor = true; + this.saveButton.Click += new System.EventHandler(this.saveButton_Click); + // + // maxButton + // + this.maxButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.maxButton.Location = new System.Drawing.Point(423, 1); + this.maxButton.Name = "maxButton"; + this.maxButton.Size = new System.Drawing.Size(24, 18); + this.maxButton.TabIndex = 9; + this.maxButton.UseVisualStyleBackColor = true; + this.maxButton.Click += new System.EventHandler(this.maxButton_Click); + // + // CameraPictureCtrl2 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.ControlLight; + this.Controls.Add(this.maxButton); + this.Controls.Add(this.saveButton); + this.Controls.Add(this.stopButton); + this.Controls.Add(this.pictureBox); + this.Controls.Add(this.captionLabel); + this.Controls.Add(this.ledPictureBox); + this.Name = "CameraPictureCtrl2"; + this.Size = new System.Drawing.Size(448, 355); + ((System.ComponentModel.ISupportInitialize)(this.ledPictureBox)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.PictureBox ledPictureBox; + private System.Windows.Forms.Label captionLabel; + private System.Windows.Forms.PictureBox pictureBox; + private System.Windows.Forms.Button stopButton; + private System.Windows.Forms.Button saveButton; + private System.Windows.Forms.Button maxButton; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureCtrl2.cs b/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureCtrl2.cs new file mode 100644 index 00000000..e1343b40 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureCtrl2.cs @@ -0,0 +1,85 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Drawing; +using System.Windows.Forms; +using TBF.Resources; + +namespace TBF.UiControls +{ + public partial class CameraPictureCtrl2 : UserControl, ICameraPicture + { + private DateTime imageTimeStamp; + + public Image NewImage + { + set + { + pictureBox.Image = value; + imageTimeStamp = DateTime.Now; + ledPictureBox.BackColor = Color.Red; + } + } + + public Image Image + { + set { pictureBox.Image = value; } + get { return pictureBox.Image; } + } + + public DateTime TimeStamp + { + set { imageTimeStamp = value; } + get { return imageTimeStamp; } + } + + public string Caption + { + set { captionLabel.Text = value; } + get { return captionLabel.Text; } + } + + + public CameraPictureCtrl2() + { + InitializeComponent(); + + captionLabel.Text = "No info available"; + } + + public CameraPictureCtrl2(ICameraPicture oriCamPicture) + { + InitializeComponent(); + + captionLabel.Text = oriCamPicture.Caption; + pictureBox.Image = oriCamPicture.Image; + imageTimeStamp = oriCamPicture.TimeStamp; + + UpdateLed(DateTime.Now); + } + + + public void UpdateLed(DateTime now) + { + ledPictureBox.BackColor = (now - imageTimeStamp > TimeSpan.FromMilliseconds(500)) + ? SystemColors.Control + : Color.Red; + } + + private void stopButton_Click(object sender, EventArgs e) + { + + } + + private void saveButton_Click(object sender, EventArgs e) + { + + } + + private void maxButton_Click(object sender, EventArgs e) + { + + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureCtrl2.resx b/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureCtrl2.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureCtrl2.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureCtrl3.Designer.cs b/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureCtrl3.Designer.cs new file mode 100644 index 00000000..158e88fc --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureCtrl3.Designer.cs @@ -0,0 +1,130 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.UiControls +{ + partial class CameraPictureCtrl3 + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.captionLabel = new System.Windows.Forms.Label(); + this.ledPictureBox = new System.Windows.Forms.PictureBox(); + this.pictureBox = new System.Windows.Forms.PictureBox(); + this.stopButton = new System.Windows.Forms.Button(); + this.saveButton = new System.Windows.Forms.Button(); + this.maxButton = new System.Windows.Forms.Button(); + ((System.ComponentModel.ISupportInitialize)(this.ledPictureBox)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit(); + this.SuspendLayout(); + // + // captionLabel + // + this.captionLabel.AutoSize = true; + this.captionLabel.ForeColor = System.Drawing.Color.Black; + this.captionLabel.Location = new System.Drawing.Point(16, 4); + this.captionLabel.Name = "captionLabel"; + this.captionLabel.Size = new System.Drawing.Size(86, 13); + this.captionLabel.TabIndex = 6; + this.captionLabel.Text = "No info available"; + // + // ledPictureBox + // + this.ledPictureBox.Location = new System.Drawing.Point(2, 4); + this.ledPictureBox.Name = "ledPictureBox"; + this.ledPictureBox.Size = new System.Drawing.Size(12, 12); + this.ledPictureBox.TabIndex = 5; + this.ledPictureBox.TabStop = false; + // + // pictureBox + // + this.pictureBox.Location = new System.Drawing.Point(2, 20); + this.pictureBox.Name = "pictureBox"; + this.pictureBox.Size = new System.Drawing.Size(640, 480); + this.pictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.pictureBox.TabIndex = 0; + this.pictureBox.TabStop = false; + // + // stopButton + // + this.stopButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.stopButton.Location = new System.Drawing.Point(569, 1); + this.stopButton.Name = "stopButton"; + this.stopButton.Size = new System.Drawing.Size(24, 18); + this.stopButton.TabIndex = 7; + this.stopButton.UseVisualStyleBackColor = true; + this.stopButton.Click += new System.EventHandler(this.stopButton_Click); + // + // saveButton + // + this.saveButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.saveButton.Location = new System.Drawing.Point(594, 1); + this.saveButton.Name = "saveButton"; + this.saveButton.Size = new System.Drawing.Size(24, 18); + this.saveButton.TabIndex = 8; + this.saveButton.UseVisualStyleBackColor = true; + this.saveButton.Click += new System.EventHandler(this.saveButton_Click); + // + // maxButton + // + this.maxButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.maxButton.Location = new System.Drawing.Point(619, 1); + this.maxButton.Name = "maxButton"; + this.maxButton.Size = new System.Drawing.Size(24, 18); + this.maxButton.TabIndex = 9; + this.maxButton.UseVisualStyleBackColor = true; + this.maxButton.Click += new System.EventHandler(this.maxButton_Click); + // + // CameraPictureCtrl3 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.ControlLight; + this.Controls.Add(this.maxButton); + this.Controls.Add(this.saveButton); + this.Controls.Add(this.stopButton); + this.Controls.Add(this.pictureBox); + this.Controls.Add(this.captionLabel); + this.Controls.Add(this.ledPictureBox); + this.Name = "CameraPictureCtrl3"; + this.Size = new System.Drawing.Size(644, 502); + ((System.ComponentModel.ISupportInitialize)(this.ledPictureBox)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.PictureBox ledPictureBox; + private System.Windows.Forms.Label captionLabel; + private System.Windows.Forms.PictureBox pictureBox; + private System.Windows.Forms.Button stopButton; + private System.Windows.Forms.Button saveButton; + private System.Windows.Forms.Button maxButton; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureCtrl3.cs b/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureCtrl3.cs new file mode 100644 index 00000000..ea525696 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureCtrl3.cs @@ -0,0 +1,84 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Drawing; +using System.Windows.Forms; +using TBF.Resources; + +namespace TBF.UiControls +{ + public partial class CameraPictureCtrl3 : UserControl, ICameraPicture + { + private DateTime imageTimeStamp; + + public Image NewImage + { + set + { + pictureBox.Image = value; + imageTimeStamp = DateTime.Now; + ledPictureBox.BackColor = Color.Red; + } + } + + public Image Image + { + set { pictureBox.Image = value; } + get { return pictureBox.Image; } + } + + public DateTime TimeStamp + { + set { imageTimeStamp = value; } + get { return imageTimeStamp; } + } + + public string Caption + { + set { captionLabel.Text = value; } + get { return captionLabel.Text; } + } + + public CameraPictureCtrl3() + { + InitializeComponent(); + + captionLabel.Text = "No info available"; + } + + public CameraPictureCtrl3(ICameraPicture oriCamPicture) + { + InitializeComponent(); + + captionLabel.Text = oriCamPicture.Caption; + pictureBox.Image = oriCamPicture.Image; + imageTimeStamp = oriCamPicture.TimeStamp; + + UpdateLed(DateTime.Now); + } + + + public void UpdateLed(DateTime now) + { + ledPictureBox.BackColor = (now - imageTimeStamp > TimeSpan.FromMilliseconds(500)) + ? SystemColors.Control + : Color.Red; + } + + private void stopButton_Click(object sender, EventArgs e) + { + + } + + private void saveButton_Click(object sender, EventArgs e) + { + + } + + private void maxButton_Click(object sender, EventArgs e) + { + + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureCtrl3.resx b/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureCtrl3.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureCtrl3.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureFullCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureFullCtrl.Designer.cs new file mode 100644 index 00000000..a04971ef --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureFullCtrl.Designer.cs @@ -0,0 +1,161 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.UiControls +{ + partial class CameraPictureFullCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.captionLabel = new System.Windows.Forms.Label(); + this.ledPictureBox = new System.Windows.Forms.PictureBox(); + this.pictureBox = new System.Windows.Forms.PictureBox(); + this.stopButton = new System.Windows.Forms.Button(); + this.saveButton = new System.Windows.Forms.Button(); + this.maxButton = new System.Windows.Forms.Button(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + ((System.ComponentModel.ISupportInitialize)(this.ledPictureBox)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.SuspendLayout(); + // + // captionLabel + // + this.captionLabel.AutoSize = true; + this.captionLabel.ForeColor = System.Drawing.Color.Black; + this.captionLabel.Location = new System.Drawing.Point(16, 2); + this.captionLabel.Name = "captionLabel"; + this.captionLabel.Size = new System.Drawing.Size(86, 13); + this.captionLabel.TabIndex = 6; + this.captionLabel.Text = "No info available"; + // + // ledPictureBox + // + this.ledPictureBox.Location = new System.Drawing.Point(4, 2); + this.ledPictureBox.Name = "ledPictureBox"; + this.ledPictureBox.Size = new System.Drawing.Size(12, 12); + this.ledPictureBox.TabIndex = 5; + this.ledPictureBox.TabStop = false; + // + // pictureBox + // + this.pictureBox.Dock = System.Windows.Forms.DockStyle.Fill; + this.pictureBox.Location = new System.Drawing.Point(0, 0); + this.pictureBox.Name = "pictureBox"; + this.pictureBox.Size = new System.Drawing.Size(964, 720); + this.pictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.pictureBox.TabIndex = 0; + this.pictureBox.TabStop = false; + // + // stopButton + // + this.stopButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.stopButton.Location = new System.Drawing.Point(890, 0); + this.stopButton.Name = "stopButton"; + this.stopButton.Size = new System.Drawing.Size(24, 18); + this.stopButton.TabIndex = 7; + this.stopButton.UseVisualStyleBackColor = true; + this.stopButton.Click += new System.EventHandler(this.stopButton_Click); + // + // saveButton + // + this.saveButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.saveButton.Location = new System.Drawing.Point(915, 0); + this.saveButton.Name = "saveButton"; + this.saveButton.Size = new System.Drawing.Size(24, 18); + this.saveButton.TabIndex = 8; + this.saveButton.UseVisualStyleBackColor = true; + this.saveButton.Click += new System.EventHandler(this.saveButton_Click); + // + // maxButton + // + this.maxButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.maxButton.Location = new System.Drawing.Point(940, 0); + this.maxButton.Name = "maxButton"; + this.maxButton.Size = new System.Drawing.Size(24, 18); + this.maxButton.TabIndex = 9; + this.maxButton.UseVisualStyleBackColor = true; + this.maxButton.Click += new System.EventHandler(this.maxButton_Click); + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.IsSplitterFixed = true; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.captionLabel); + this.splitContainer1.Panel1.Controls.Add(this.maxButton); + this.splitContainer1.Panel1.Controls.Add(this.ledPictureBox); + this.splitContainer1.Panel1.Controls.Add(this.saveButton); + this.splitContainer1.Panel1.Controls.Add(this.stopButton); + this.splitContainer1.Panel1MinSize = 18; + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.pictureBox); + this.splitContainer1.Size = new System.Drawing.Size(964, 742); + this.splitContainer1.SplitterDistance = 18; + this.splitContainer1.TabIndex = 10; + // + // CameraPictureFullCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.ControlLight; + this.Controls.Add(this.splitContainer1); + this.Name = "CameraPictureFullCtrl"; + this.Size = new System.Drawing.Size(964, 742); + ((System.ComponentModel.ISupportInitialize)(this.ledPictureBox)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit(); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel1.PerformLayout(); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.Panel2.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.PictureBox ledPictureBox; + private System.Windows.Forms.Label captionLabel; + private System.Windows.Forms.PictureBox pictureBox; + private System.Windows.Forms.Button stopButton; + private System.Windows.Forms.Button saveButton; + private System.Windows.Forms.Button maxButton; + private System.Windows.Forms.SplitContainer splitContainer1; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureFullCtrl.cs b/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureFullCtrl.cs new file mode 100644 index 00000000..1d6e15b8 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureFullCtrl.cs @@ -0,0 +1,72 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Drawing; +using System.Windows.Forms; +using TBF.Resources; + +namespace TBF.UiControls +{ + public partial class CameraPictureFullCtrl : UserControl, ICameraPicture + { + private DateTime imageTimeStamp; + + public Image NewImage + { + set + { + pictureBox.Image = value; + imageTimeStamp = DateTime.Now; + ledPictureBox.BackColor = Color.Red; + } + } + + public Image Image + { + set { pictureBox.Image = value; } + get { return pictureBox.Image; } + } + + public DateTime TimeStamp + { + set { imageTimeStamp = value; } + get { return imageTimeStamp; } + } + + public string Caption + { + set { captionLabel.Text = value; } + get { return captionLabel.Text; } + } + + public CameraPictureFullCtrl() + { + InitializeComponent(); + + captionLabel.Text = "No info available"; + } + + public void UpdateLed(DateTime now) + { + ledPictureBox.BackColor = (now - imageTimeStamp > TimeSpan.FromMilliseconds(500)) + ? SystemColors.Control + : Color.Red; + } + + private void stopButton_Click(object sender, EventArgs e) + { + + } + + private void saveButton_Click(object sender, EventArgs e) + { + + } + + private void maxButton_Click(object sender, EventArgs e) + { + + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureFullCtrl.resx b/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureFullCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/CameraPictureFullCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/ICameraPicture.cs b/TBF_V2/Sources/TBF/TBF/UiControls/ICameraPicture.cs new file mode 100644 index 00000000..63c744bc --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/ICameraPicture.cs @@ -0,0 +1,16 @@ +using System; +using System.Drawing; + +namespace TBF.UiControls +{ + public interface ICameraPicture + { + Image NewImage { set; } + + string Caption { get; set; } + Image Image { get; set; } + DateTime TimeStamp { get; set; } + + void UpdateLed(DateTime now); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/IMetrologyDlgTab.cs b/TBF_V2/Sources/TBF/TBF/UiControls/IMetrologyDlgTab.cs new file mode 100644 index 00000000..50732863 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/IMetrologyDlgTab.cs @@ -0,0 +1,21 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System.Collections.Generic; + +namespace TBF.UiControls +{ + interface IMetrologyDlgTab : ITabWithListViewEx + { + /// + /// Component entity that has a list of 'measurement-correction' pairs + /// to be updated in the database on OK. + /// + Config.Entities.Component MeterEntity { get; set; } + + /// + /// A list of 'measurement-correction' pairs to be deleted from the database on OK. + /// + IList ToBeRemoved { get; set; } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/IParentOfListViewEx.cs b/TBF_V2/Sources/TBF/TBF/UiControls/IParentOfListViewEx.cs new file mode 100644 index 00000000..fb940ce9 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/IParentOfListViewEx.cs @@ -0,0 +1,10 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.UiControls +{ + interface IParentOfListViewEx + { + void UpdateButtonStates(SharedButtons.SelectedItemPos selectedItemPos); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/ITabWithListViewEx.cs b/TBF_V2/Sources/TBF/TBF/UiControls/ITabWithListViewEx.cs new file mode 100644 index 00000000..500e9794 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/ITabWithListViewEx.cs @@ -0,0 +1,23 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace TBF.UiControls +{ + interface ITabWithListViewEx + { + void Unlock(); + void OkBtnClicked(); + void CancelBtnClicked(); + void AddOne(); + void RemoveSelected(); + void MoveUpSelected(); + void MoveDownSelected(); + string GetWarningsBeforeSaving(ref Dictionary renameInfo); + void UpdateRelatedItems(Dictionary renameInfo); + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgBalanceTab.Designer.cs b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgBalanceTab.Designer.cs new file mode 100644 index 00000000..e2b991d5 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgBalanceTab.Designer.cs @@ -0,0 +1,398 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.UiControls +{ + partial class MetrologyDlgBalanceTab + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.cmpntNameLabel = new System.Windows.Forms.Label(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.calibrationGroupBox = new System.Windows.Forms.GroupBox(); + this.calibValidDateTextBox = new System.Windows.Forms.TextBox(); + this.calibValidDateLabel = new System.Windows.Forms.Label(); + this.calibDateTextBox = new System.Windows.Forms.TextBox(); + this.calibDateLabel = new System.Windows.Forms.Label(); + this.calibCertificateNrTextBox = new System.Windows.Forms.TextBox(); + this.calibCertificateNrLabel = new System.Windows.Forms.Label(); + this.buoancyGroupBox = new System.Windows.Forms.GroupBox(); + this.weightStandardDensityTextBox = new System.Windows.Forms.TextBox(); + this.weightStandardDensityLabel = new System.Windows.Forms.Label(); + this.airDensityTextBox = new System.Windows.Forms.TextBox(); + this.airDensityLabel = new System.Windows.Forms.Label(); + this.buoyancyHumiTextBox = new System.Windows.Forms.TextBox(); + this.buoyancyPressTextBox = new System.Windows.Forms.TextBox(); + this.buoyancyTempTextBox = new System.Windows.Forms.TextBox(); + this.buoyancyHumiLabel = new System.Windows.Forms.Label(); + this.buoyancyPressLabel = new System.Windows.Forms.Label(); + this.buoyancyTempLabel = new System.Windows.Forms.Label(); + this.nameGroupBox = new System.Windows.Forms.GroupBox(); + this.testGroupBox = new System.Windows.Forms.GroupBox(); + this.correctedTextBox = new System.Windows.Forms.TextBox(); + this.measuredTextBox = new System.Windows.Forms.TextBox(); + this.correctedLabel = new System.Windows.Forms.Label(); + this.measuredLabel = new System.Windows.Forms.Label(); + this.listViewEx = new Results.Forms.ListViewEx(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.calibrationGroupBox.SuspendLayout(); + this.buoancyGroupBox.SuspendLayout(); + this.nameGroupBox.SuspendLayout(); + this.testGroupBox.SuspendLayout(); + this.SuspendLayout(); + // + // cmpntNameLabel + // + this.cmpntNameLabel.AutoSize = true; + this.cmpntNameLabel.Location = new System.Drawing.Point(69, 16); + this.cmpntNameLabel.Name = "cmpntNameLabel"; + this.cmpntNameLabel.Size = new System.Drawing.Size(64, 13); + this.cmpntNameLabel.TabIndex = 0; + this.cmpntNameLabel.Text = "cmpntName"; + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.calibrationGroupBox); + this.splitContainer1.Panel1.Controls.Add(this.buoancyGroupBox); + this.splitContainer1.Panel1.Controls.Add(this.nameGroupBox); + this.splitContainer1.Panel1.Controls.Add(this.testGroupBox); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.listViewEx); + this.splitContainer1.Size = new System.Drawing.Size(668, 400); + this.splitContainer1.SplitterDistance = 150; + this.splitContainer1.TabIndex = 1; + // + // calibrationGroupBox + // + this.calibrationGroupBox.Controls.Add(this.calibValidDateTextBox); + this.calibrationGroupBox.Controls.Add(this.calibValidDateLabel); + this.calibrationGroupBox.Controls.Add(this.calibDateTextBox); + this.calibrationGroupBox.Controls.Add(this.calibDateLabel); + this.calibrationGroupBox.Controls.Add(this.calibCertificateNrTextBox); + this.calibrationGroupBox.Controls.Add(this.calibCertificateNrLabel); + this.calibrationGroupBox.Location = new System.Drawing.Point(16, 54); + this.calibrationGroupBox.Name = "calibrationGroupBox"; + this.calibrationGroupBox.Size = new System.Drawing.Size(208, 86); + this.calibrationGroupBox.TabIndex = 6; + this.calibrationGroupBox.TabStop = false; + this.calibrationGroupBox.Text = "Calibration"; + // + // calibValidDateTextBox + // + this.calibValidDateTextBox.Enabled = false; + this.calibValidDateTextBox.Location = new System.Drawing.Point(120, 59); + this.calibValidDateTextBox.Name = "calibValidDateTextBox"; + this.calibValidDateTextBox.Size = new System.Drawing.Size(82, 20); + this.calibValidDateTextBox.TabIndex = 15; + // + // calibValidDateLabel + // + this.calibValidDateLabel.AutoSize = true; + this.calibValidDateLabel.Location = new System.Drawing.Point(17, 62); + this.calibValidDateLabel.Name = "calibValidDateLabel"; + this.calibValidDateLabel.Size = new System.Drawing.Size(52, 13); + this.calibValidDateLabel.TabIndex = 14; + this.calibValidDateLabel.Text = "Valid until"; + // + // calibDateTextBox + // + this.calibDateTextBox.Enabled = false; + this.calibDateTextBox.Location = new System.Drawing.Point(120, 37); + this.calibDateTextBox.Name = "calibDateTextBox"; + this.calibDateTextBox.Size = new System.Drawing.Size(82, 20); + this.calibDateTextBox.TabIndex = 13; + // + // calibDateLabel + // + this.calibDateLabel.AutoSize = true; + this.calibDateLabel.Location = new System.Drawing.Point(17, 40); + this.calibDateLabel.Name = "calibDateLabel"; + this.calibDateLabel.Size = new System.Drawing.Size(30, 13); + this.calibDateLabel.TabIndex = 12; + this.calibDateLabel.Text = "Date"; + // + // calibCertificateNrTextBox + // + this.calibCertificateNrTextBox.Enabled = false; + this.calibCertificateNrTextBox.Location = new System.Drawing.Point(120, 15); + this.calibCertificateNrTextBox.Name = "calibCertificateNrTextBox"; + this.calibCertificateNrTextBox.Size = new System.Drawing.Size(82, 20); + this.calibCertificateNrTextBox.TabIndex = 11; + // + // calibCertificateNrLabel + // + this.calibCertificateNrLabel.AutoSize = true; + this.calibCertificateNrLabel.Location = new System.Drawing.Point(17, 18); + this.calibCertificateNrLabel.Name = "calibCertificateNrLabel"; + this.calibCertificateNrLabel.Size = new System.Drawing.Size(54, 13); + this.calibCertificateNrLabel.TabIndex = 10; + this.calibCertificateNrLabel.Text = "Certificate"; + // + // buoancyGroupBox + // + this.buoancyGroupBox.Controls.Add(this.weightStandardDensityTextBox); + this.buoancyGroupBox.Controls.Add(this.weightStandardDensityLabel); + this.buoancyGroupBox.Controls.Add(this.airDensityTextBox); + this.buoancyGroupBox.Controls.Add(this.airDensityLabel); + this.buoancyGroupBox.Controls.Add(this.buoyancyHumiTextBox); + this.buoancyGroupBox.Controls.Add(this.buoyancyPressTextBox); + this.buoancyGroupBox.Controls.Add(this.buoyancyTempTextBox); + this.buoancyGroupBox.Controls.Add(this.buoyancyHumiLabel); + this.buoancyGroupBox.Controls.Add(this.buoyancyPressLabel); + this.buoancyGroupBox.Controls.Add(this.buoyancyTempLabel); + this.buoancyGroupBox.Location = new System.Drawing.Point(233, 10); + this.buoancyGroupBox.Name = "buoancyGroupBox"; + this.buoancyGroupBox.Size = new System.Drawing.Size(248, 130); + this.buoancyGroupBox.TabIndex = 5; + this.buoancyGroupBox.TabStop = false; + this.buoancyGroupBox.Text = "Buoyancy"; + // + // weightStandardDensityTextBox + // + this.weightStandardDensityTextBox.Enabled = false; + this.weightStandardDensityTextBox.Location = new System.Drawing.Point(160, 103); + this.weightStandardDensityTextBox.Name = "weightStandardDensityTextBox"; + this.weightStandardDensityTextBox.Size = new System.Drawing.Size(82, 20); + this.weightStandardDensityTextBox.TabIndex = 9; + // + // weightStandardDensityLabel + // + this.weightStandardDensityLabel.AutoSize = true; + this.weightStandardDensityLabel.Location = new System.Drawing.Point(17, 106); + this.weightStandardDensityLabel.Name = "weightStandardDensityLabel"; + this.weightStandardDensityLabel.Size = new System.Drawing.Size(133, 13); + this.weightStandardDensityLabel.TabIndex = 8; + this.weightStandardDensityLabel.Text = "Ref. mass density [kg/m3]:"; + // + // airDensityTextBox + // + this.airDensityTextBox.Enabled = false; + this.airDensityTextBox.Location = new System.Drawing.Point(160, 81); + this.airDensityTextBox.Name = "airDensityTextBox"; + this.airDensityTextBox.Size = new System.Drawing.Size(82, 20); + this.airDensityTextBox.TabIndex = 7; + // + // airDensityLabel + // + this.airDensityLabel.AutoSize = true; + this.airDensityLabel.Location = new System.Drawing.Point(17, 84); + this.airDensityLabel.Name = "airDensityLabel"; + this.airDensityLabel.Size = new System.Drawing.Size(95, 13); + this.airDensityLabel.TabIndex = 6; + this.airDensityLabel.Text = "Air density [kg/m3]"; + // + // buoyancyHumiTextBox + // + this.buoyancyHumiTextBox.Enabled = false; + this.buoyancyHumiTextBox.Location = new System.Drawing.Point(160, 59); + this.buoyancyHumiTextBox.Name = "buoyancyHumiTextBox"; + this.buoyancyHumiTextBox.Size = new System.Drawing.Size(82, 20); + this.buoyancyHumiTextBox.TabIndex = 5; + // + // buoyancyPressTextBox + // + this.buoyancyPressTextBox.Enabled = false; + this.buoyancyPressTextBox.Location = new System.Drawing.Point(160, 37); + this.buoyancyPressTextBox.Name = "buoyancyPressTextBox"; + this.buoyancyPressTextBox.Size = new System.Drawing.Size(82, 20); + this.buoyancyPressTextBox.TabIndex = 4; + // + // buoyancyTempTextBox + // + this.buoyancyTempTextBox.Enabled = false; + this.buoyancyTempTextBox.Location = new System.Drawing.Point(160, 15); + this.buoyancyTempTextBox.Name = "buoyancyTempTextBox"; + this.buoyancyTempTextBox.Size = new System.Drawing.Size(82, 20); + this.buoyancyTempTextBox.TabIndex = 3; + // + // buoyancyHumiLabel + // + this.buoyancyHumiLabel.AutoSize = true; + this.buoyancyHumiLabel.Location = new System.Drawing.Point(17, 62); + this.buoyancyHumiLabel.Name = "buoyancyHumiLabel"; + this.buoyancyHumiLabel.Size = new System.Drawing.Size(72, 13); + this.buoyancyHumiLabel.TabIndex = 2; + this.buoyancyHumiLabel.Text = "Humidity [R%]"; + // + // buoyancyPressLabel + // + this.buoyancyPressLabel.AutoSize = true; + this.buoyancyPressLabel.Location = new System.Drawing.Point(17, 40); + this.buoyancyPressLabel.Name = "buoyancyPressLabel"; + this.buoyancyPressLabel.Size = new System.Drawing.Size(76, 13); + this.buoyancyPressLabel.TabIndex = 1; + this.buoyancyPressLabel.Text = "Pressure [hPa]"; + // + // buoyancyTempLabel + // + this.buoyancyTempLabel.AutoSize = true; + this.buoyancyTempLabel.Location = new System.Drawing.Point(17, 18); + this.buoyancyTempLabel.Name = "buoyancyTempLabel"; + this.buoyancyTempLabel.Size = new System.Drawing.Size(83, 13); + this.buoyancyTempLabel.TabIndex = 0; + this.buoyancyTempLabel.Text = "Temperature [C]"; + // + // nameGroupBox + // + this.nameGroupBox.Controls.Add(this.cmpntNameLabel); + this.nameGroupBox.Location = new System.Drawing.Point(16, 10); + this.nameGroupBox.Name = "nameGroupBox"; + this.nameGroupBox.Size = new System.Drawing.Size(208, 40); + this.nameGroupBox.TabIndex = 4; + this.nameGroupBox.TabStop = false; + this.nameGroupBox.Text = "Component"; + // + // testGroupBox + // + this.testGroupBox.Controls.Add(this.correctedTextBox); + this.testGroupBox.Controls.Add(this.measuredTextBox); + this.testGroupBox.Controls.Add(this.correctedLabel); + this.testGroupBox.Controls.Add(this.measuredLabel); + this.testGroupBox.Location = new System.Drawing.Point(490, 10); + this.testGroupBox.Name = "testGroupBox"; + this.testGroupBox.Size = new System.Drawing.Size(170, 88); + this.testGroupBox.TabIndex = 3; + this.testGroupBox.TabStop = false; + this.testGroupBox.Text = "Correction test"; + // + // correctedTextBox + // + this.correctedTextBox.Location = new System.Drawing.Point(91, 37); + this.correctedTextBox.Name = "correctedTextBox"; + this.correctedTextBox.ReadOnly = true; + this.correctedTextBox.Size = new System.Drawing.Size(73, 20); + this.correctedTextBox.TabIndex = 5; + // + // measuredTextBox + // + this.measuredTextBox.Location = new System.Drawing.Point(91, 15); + this.measuredTextBox.Name = "measuredTextBox"; + this.measuredTextBox.Size = new System.Drawing.Size(73, 20); + this.measuredTextBox.TabIndex = 4; + this.measuredTextBox.TextChanged += new System.EventHandler(this.measuredTextBox_TextChanged); + // + // correctedLabel + // + this.correctedLabel.AutoSize = true; + this.correctedLabel.Location = new System.Drawing.Point(17, 40); + this.correctedLabel.Name = "correctedLabel"; + this.correctedLabel.Size = new System.Drawing.Size(53, 13); + this.correctedLabel.TabIndex = 3; + this.correctedLabel.Text = "Corrected"; + // + // measuredLabel + // + this.measuredLabel.AutoSize = true; + this.measuredLabel.Location = new System.Drawing.Point(17, 18); + this.measuredLabel.Name = "measuredLabel"; + this.measuredLabel.Size = new System.Drawing.Size(54, 13); + this.measuredLabel.TabIndex = 2; + this.measuredLabel.Text = "Measured"; + // + // listViewEx + // + this.listViewEx.AllowColumnReorder = true; + this.listViewEx.Dock = System.Windows.Forms.DockStyle.Fill; + this.listViewEx.DoubleClickActivation = false; + this.listViewEx.FullRowSelect = true; + this.listViewEx.GridLines = true; + this.listViewEx.Location = new System.Drawing.Point(0, 0); + this.listViewEx.Name = "listViewEx"; + this.listViewEx.Size = new System.Drawing.Size(668, 246); + this.listViewEx.TabIndex = 0; + this.listViewEx.UseCompatibleStateImageBehavior = false; + this.listViewEx.View = System.Windows.Forms.View.Details; + this.listViewEx.SelectedIndexChanged += new System.EventHandler(this.listViewEx_SelectedIndexChanged); + // + // MetrologyDlgBalanceTab + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.splitContainer1); + this.Name = "MetrologyDlgBalanceTab"; + this.Size = new System.Drawing.Size(668, 400); + this.Load += new System.EventHandler(this.MetrologyDlgBalanceTab_Load); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + this.calibrationGroupBox.ResumeLayout(false); + this.calibrationGroupBox.PerformLayout(); + this.buoancyGroupBox.ResumeLayout(false); + this.buoancyGroupBox.PerformLayout(); + this.nameGroupBox.ResumeLayout(false); + this.nameGroupBox.PerformLayout(); + this.testGroupBox.ResumeLayout(false); + this.testGroupBox.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label cmpntNameLabel; + private System.Windows.Forms.SplitContainer splitContainer1; + private Results.Forms.ListViewEx listViewEx; + private System.Windows.Forms.Label measuredLabel; + private System.Windows.Forms.GroupBox testGroupBox; + private System.Windows.Forms.TextBox correctedTextBox; + private System.Windows.Forms.TextBox measuredTextBox; + private System.Windows.Forms.Label correctedLabel; + private System.Windows.Forms.GroupBox buoancyGroupBox; + private System.Windows.Forms.GroupBox nameGroupBox; + private System.Windows.Forms.TextBox buoyancyHumiTextBox; + private System.Windows.Forms.TextBox buoyancyPressTextBox; + private System.Windows.Forms.TextBox buoyancyTempTextBox; + private System.Windows.Forms.Label buoyancyHumiLabel; + private System.Windows.Forms.Label buoyancyPressLabel; + private System.Windows.Forms.Label buoyancyTempLabel; + private System.Windows.Forms.TextBox weightStandardDensityTextBox; + private System.Windows.Forms.Label weightStandardDensityLabel; + private System.Windows.Forms.TextBox airDensityTextBox; + private System.Windows.Forms.Label airDensityLabel; + private System.Windows.Forms.GroupBox calibrationGroupBox; + private System.Windows.Forms.TextBox calibValidDateTextBox; + private System.Windows.Forms.Label calibValidDateLabel; + private System.Windows.Forms.TextBox calibDateTextBox; + private System.Windows.Forms.Label calibDateLabel; + private System.Windows.Forms.TextBox calibCertificateNrTextBox; + private System.Windows.Forms.Label calibCertificateNrLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgBalanceTab.cs b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgBalanceTab.cs new file mode 100644 index 00000000..b01d7ae7 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgBalanceTab.cs @@ -0,0 +1,359 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.Resources; + +namespace TBF.UiControls +{ + public partial class MetrologyDlgBalanceTab : UserControl, IMetrologyDlgTab + { + static readonly ILog log = LogManager.GetLogger(typeof(MetrologyDlgBalanceTab)); + + /// + /// Component entity that has a list of 'measurement-correction' pairs + /// to be updated in the database on OK. + /// + public Component MeterEntity + { + get { return meterEntity; } + set { meterEntity = value; } + } + Component meterEntity; + + /// + /// Balance configuration (with buoyancy parameters) + /// + public BenchControl.GenericDevices.IScaleCfg BalanceCfg; + + /// + /// A list of 'measurement-correction' pairs to be deleted from the database on OK. + /// + public IList ToBeRemoved + { + get { return toBeRemoved; } + set { toBeRemoved = value; } + } + IList toBeRemoved; + + MetrologyDlg parent; + bool unlocked; + Control measurementTextBox; + Control correctionTextBox; + + public MetrologyDlgBalanceTab() + { + InitializeComponent(); + toBeRemoved = new List(); + unlocked = false; + } + + private void MetrologyDlgBalanceTab_Load(object sender, System.EventArgs e) + { + if (meterEntity == null) return; + + parent = ParentForm as MetrologyDlg; + + Localize(); + + /// Panel1 + cmpntNameLabel.Text = meterEntity.Name; + measuredTextBox.Text = string.Empty; + correctedTextBox.Text = string.Empty; + + /// Panel2 + measurementTextBox = new TextBox(); + correctionTextBox = new TextBox(); + this.Controls.Add(measurementTextBox); + this.Controls.Add(correctionTextBox); + + listViewEx.SubItemClicked += new Results.Forms.SubItemEventHandler(listViewEx_SubItemClicked); + listViewEx.SubItemRightClicked += new Results.Forms.SubItemEventHandler(listViewEx_SubItemRightClicked); + listViewEx.SubItemEndEditing += new Results.Forms.SubItemEndEditingEventHandler(listViewEx_SubItemEndEditing); + + listViewEx.Columns.Add(new ColumnHeader() { Text = Strings.Nr, Width = 60 }); + listViewEx.Columns.Add(new ColumnHeader() { Text = string.Format("{0} [kg]", Strings.Mass), Width = 100 }); + listViewEx.Columns.Add(new ColumnHeader() { Text = string.Format("{0} [g]", Strings.Correction), Width = 100 }); + + RefreshAll(); + } + + void Localize() + { + nameGroupBox.Text = Strings.Component; + + calibrationGroupBox.Text = Strings.Calibration; + calibCertificateNrLabel.Text = Strings.Certificate; + calibDateLabel.Text = Strings.Date; + calibValidDateLabel.Text = Strings.Valid_until; + + buoyancyTempLabel.Text = string.Format("{0} [°C]", Strings.Ambient_temperature); + buoyancyPressLabel.Text = string.Format("{0} [mbar]", Strings.Ambient_pressure); + buoyancyHumiLabel.Text = string.Format("{0} [%]", Strings.Ambient_humidity); + airDensityLabel.Text = Strings.Air_density_kg_m3; + weightStandardDensityLabel.Text = Strings.Ref_mass_dens_kg_m3; + + testGroupBox.Text = Strings.Test_measured_corrected; + measuredLabel.Text = Strings.Measured; + correctedLabel.Text = Strings.Corrected; + } + + void RefreshAll() + { + if (BalanceCfg != null) + { + calibCertificateNrTextBox.Text = BalanceCfg.CalibCertificateNr; + calibDateTextBox.Text = BalanceCfg.CalibDate.ToShortDateString(); + calibValidDateTextBox.Text = BalanceCfg.CalibValidDate.ToShortDateString(); + + buoyancyTempTextBox.Text = BalanceCfg.BuoyancyTemp.ToString("F2"); + buoyancyPressTextBox.Text = BalanceCfg.BuoyancyPress.ToString("F4"); + buoyancyHumiTextBox.Text = BalanceCfg.BuoyancyHumi.ToString("F1"); + /// airDensityTextBox.Text = //calculate air density + weightStandardDensityTextBox.Text = BalanceCfg.WeightStandardDensity.ToString("F1"); + } + + listViewEx.Items.Clear(); + foreach (var corr in MeterEntity.Corrections) AddOneLVI(corr); + } + + void AddOneLVI(MeasurementCorrection corr) + { + int nr = listViewEx.Items.Count + 1; + ListViewItem lvi = new ListViewItem(nr.ToString()); + lvi.SubItems.Add(corr.Measurement.ToString()); + lvi.SubItems.Add((corr.Correction * 1000.0f).ToString()); + lvi.Tag = corr; + listViewEx.Items.Add(lvi); + } + + void listViewEx_SubItemClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (unlocked && e.SubItem == 1) + { + listViewEx.StartEditing(measurementTextBox, e.Item, e.SubItem); + } + else if (unlocked && e.SubItem == 2) + { + listViewEx.StartEditing(correctionTextBox, e.Item, e.SubItem); + } + } + + void listViewEx_SubItemRightClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (!unlocked || e.SubItem < 1 || e.SubItem > 2) return; + + if (DialogResult.Yes == MessageBox.Show(Strings.Do_you_want_to_copy_this_value_to_all_cells_below_this_cell, + Strings.Confirmation, MessageBoxButtons.YesNo, MessageBoxIcon.Question)) + { + int columnNr = e.SubItem; + string value = null; + System.Drawing.Color backColor = System.Drawing.Color.White; + + foreach (ListViewItem item in listViewEx.Items) + { + if (value != null && item.SubItems.Count > columnNr) + { + item.SubItems[columnNr].Text = value; + item.SubItems[columnNr].BackColor = backColor; + ParseItem(item, columnNr, value); + } + else if (item == e.Item) + { + value = item.SubItems[columnNr].Text; + backColor = item.SubItems[columnNr].BackColor; + } + } + } + } + + void listViewEx_SubItemEndEditing(object sender, Results.Forms.SubItemEndEditingEventArgs e) + { + if (ParseItem(e.Item, e.SubItem, e.DisplayText)) return; + + /// New value NOK, revert the original text + e.DisplayText = e.Item.Text; + e.Cancel = true; + } + + /// + /// Parse text of a ListViewItem + /// + /// true = value parsed OK + bool ParseItem(ListViewItem item, int subItem, string value) + { + float fvalue; + if (subItem == 1 && Utils.TryParseEFloat(value, out fvalue) && fvalue >= 0) + { + (item.Tag as MeasurementCorrection).Measurement = fvalue; + return true; + } + else if (subItem == 2 && Utils.TryParseEFloat(value, out fvalue)) + { + (item.Tag as MeasurementCorrection).Correction = fvalue / 1000.0f; + return true; + } + else + { + return false; + } + } + + public void Unlock() + { + unlocked = true; + + calibCertificateNrTextBox.Enabled = true; + calibDateTextBox.Enabled = true; + calibValidDateTextBox.Enabled = true; + + buoyancyTempTextBox.Enabled = true; + buoyancyPressTextBox.Enabled = true; + buoyancyHumiTextBox.Enabled = true; + weightStandardDensityTextBox.Enabled = true; + + if (listViewEx.SelectedItems.Count == 1) + { + int ix = listViewEx.SelectedIndices[0]; + listViewEx.Focus(); + listViewEx.Items[ix].Selected = true; + listViewEx.Items[ix].EnsureVisible(); + } + } + + public void OkBtnClicked() + { + if (BalanceCfg != null) + { + try + { + BalanceCfg.CalibCertificateNr = calibCertificateNrTextBox.Text; + BalanceCfg.CalibDate = DateTime.Parse(calibDateTextBox.Text); + BalanceCfg.CalibValidDate = DateTime.Parse(calibValidDateTextBox.Text); + + BalanceCfg.BuoyancyTemp = Utils.ParseSFloat(buoyancyTempTextBox.Text); + BalanceCfg.BuoyancyPress = Utils.ParseUFloat(buoyancyPressTextBox.Text); + BalanceCfg.BuoyancyHumi = Utils.ParseUFloat(buoyancyHumiTextBox.Text); + BalanceCfg.WeightStandardDensity = Utils.ParseUFloat(weightStandardDensityTextBox.Text); + + Component modified = BalanceCfg.CreateDbEntity(); + MeterEntity.Parameters = modified.Parameters; + } + catch + { + MessageBox.Show(Strings.Invalid_buoyancy_parameter_Correct_pls, + Strings.Error, + MessageBoxButtons.OK, + MessageBoxIcon.Exclamation); + } + } + } + + public void CancelBtnClicked() + { + } + + public void AddOne() + { + MeasurementCorrection corr = new MeasurementCorrection(); + MeterEntity.Corrections.Add(corr); + AddOneLVI(corr); + + listViewEx.Focus(); + listViewEx.SelectedItems.Clear(); + listViewEx.Items[listViewEx.Items.Count - 1].Selected = true; + listViewEx.Items[listViewEx.Items.Count - 1].EnsureVisible(); + } + + public void RemoveSelected() + { + if (listViewEx.SelectedItems.Count != 1) return; + + int removeItemNr = listViewEx.SelectedIndices[0]; + + MeasurementCorrection selected = + (MeasurementCorrection)listViewEx.SelectedItems[0].Tag; + if (selected.Id != 0) toBeRemoved.Add(selected); + MeterEntity.Corrections.RemoveAt(removeItemNr); + RefreshAll(); + + if (removeItemNr < listViewEx.Items.Count) + { + listViewEx.Focus(); + listViewEx.Items[removeItemNr].Selected = true; + listViewEx.Items[removeItemNr].EnsureVisible(); + } + else + { + parent.UpdateButtonStates(SharedButtons.SelectedItemPos.None); + } + } + + public void MoveUpSelected() + { + } + + public void MoveDownSelected() + { + } + + /// + /// Event handler that indicates the selected item position + /// and updates 'Remove', 'Up' and 'Down' buttons in the parent dialog. + /// + private void listViewEx_SelectedIndexChanged(object sender, EventArgs e) + { + if (listViewEx.SelectedItems.Count != 1) + { + parent.UpdateButtonStates(SharedButtons.SelectedItemPos.None); + } + else if (listViewEx.Items.Count == 1) + { + parent.UpdateButtonStates(SharedButtons.SelectedItemPos.FirstAndLast); + } + else if (listViewEx.SelectedIndices[0] == 0) + { + parent.UpdateButtonStates(SharedButtons.SelectedItemPos.First); + } + else if (listViewEx.SelectedIndices[0] == (listViewEx.Items.Count - 1)) + { + parent.UpdateButtonStates(SharedButtons.SelectedItemPos.Last); + } + else + { + parent.UpdateButtonStates(SharedButtons.SelectedItemPos.Middle); + } + } + + private void measuredTextBox_TextChanged(object sender, EventArgs e) + { + float measured; + if (float.TryParse(measuredTextBox.Text, + NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowExponent, + CultureInfo.CurrentCulture, + out measured) || + float.TryParse(measuredTextBox.Text, + NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowExponent, + CultureInfo.InvariantCulture, + out measured)) + { + double corrected = Config.Formulas.CorrectedValue(measured, meterEntity.Corrections); + correctedTextBox.Text = corrected.ToString(); + } + } + + public string GetWarningsBeforeSaving(ref Dictionary renmInfo) + { + return string.Empty; + } + + public void UpdateRelatedItems(Dictionary renameInfo) + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgBalanceTab.resx b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgBalanceTab.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgBalanceTab.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgDensityTab.Designer.cs b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgDensityTab.Designer.cs new file mode 100644 index 00000000..061a73ac --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgDensityTab.Designer.cs @@ -0,0 +1,145 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.UiControls +{ + partial class MetrologyDlgDensityTab + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.densityCorrTextBox = new System.Windows.Forms.TextBox(); + this.densityCorrLabel = new System.Windows.Forms.Label(); + this.temperatureTextBox = new System.Windows.Forms.TextBox(); + this.temperatureLabel = new System.Windows.Forms.Label(); + this.densityTextBox = new System.Windows.Forms.TextBox(); + this.densityLabel = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.densityCorrTextBox); + this.splitContainer1.Panel1.Controls.Add(this.densityCorrLabel); + this.splitContainer1.Panel1.Controls.Add(this.temperatureTextBox); + this.splitContainer1.Panel1.Controls.Add(this.temperatureLabel); + this.splitContainer1.Panel1.Controls.Add(this.densityTextBox); + this.splitContainer1.Panel1.Controls.Add(this.densityLabel); + this.splitContainer1.Size = new System.Drawing.Size(420, 300); + this.splitContainer1.SplitterDistance = 120; + this.splitContainer1.TabIndex = 1; + // + // densityCorrTextBox + // + this.densityCorrTextBox.Enabled = false; + this.densityCorrTextBox.Location = new System.Drawing.Point(185, 86); + this.densityCorrTextBox.Name = "densityCorrTextBox"; + this.densityCorrTextBox.Size = new System.Drawing.Size(100, 20); + this.densityCorrTextBox.TabIndex = 5; + // + // densityCorrLabel + // + this.densityCorrLabel.AutoSize = true; + this.densityCorrLabel.Location = new System.Drawing.Point(37, 89); + this.densityCorrLabel.Name = "densityCorrLabel"; + this.densityCorrLabel.Size = new System.Drawing.Size(132, 13); + this.densityCorrLabel.TabIndex = 4; + this.densityCorrLabel.Text = "Density correction [kg/m3]"; + // + // temperatureTextBox + // + this.temperatureTextBox.Enabled = false; + this.temperatureTextBox.Location = new System.Drawing.Point(185, 43); + this.temperatureTextBox.Name = "temperatureTextBox"; + this.temperatureTextBox.Size = new System.Drawing.Size(100, 20); + this.temperatureTextBox.TabIndex = 3; + this.temperatureTextBox.TextChanged += new System.EventHandler(this.temperatureTextBox_TextChanged); + // + // temperatureLabel + // + this.temperatureLabel.AutoSize = true; + this.temperatureLabel.Location = new System.Drawing.Point(37, 46); + this.temperatureLabel.Name = "temperatureLabel"; + this.temperatureLabel.Size = new System.Drawing.Size(112, 13); + this.temperatureLabel.TabIndex = 2; + this.temperatureLabel.Text = "@Temperature [degC]"; + // + // densityTextBox + // + this.densityTextBox.Enabled = false; + this.densityTextBox.Location = new System.Drawing.Point(185, 17); + this.densityTextBox.Name = "densityTextBox"; + this.densityTextBox.Size = new System.Drawing.Size(100, 20); + this.densityTextBox.TabIndex = 1; + this.densityTextBox.TextChanged += new System.EventHandler(this.densityTextBox_TextChanged); + // + // densityLabel + // + this.densityLabel.AutoSize = true; + this.densityLabel.Location = new System.Drawing.Point(37, 20); + this.densityLabel.Name = "densityLabel"; + this.densityLabel.Size = new System.Drawing.Size(82, 13); + this.densityLabel.TabIndex = 0; + this.densityLabel.Text = "Density [kg/m3]"; + // + // MetrologyDlgDensityTab + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.splitContainer1); + this.Name = "MetrologyDlgDensityTab"; + this.Size = new System.Drawing.Size(420, 300); + this.Load += new System.EventHandler(this.MetrologyDlgDensityTab_Load); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.TextBox temperatureTextBox; + private System.Windows.Forms.Label temperatureLabel; + private System.Windows.Forms.TextBox densityTextBox; + private System.Windows.Forms.Label densityLabel; + private System.Windows.Forms.TextBox densityCorrTextBox; + private System.Windows.Forms.Label densityCorrLabel; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgDensityTab.cs b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgDensityTab.cs new file mode 100644 index 00000000..789d4eda --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgDensityTab.cs @@ -0,0 +1,141 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.Resources; + +namespace TBF.UiControls +{ + public partial class MetrologyDlgDensityTab : UserControl, IMetrologyDlgTab + { + static readonly ILog log = LogManager.GetLogger(typeof(MetrologyDlgDensityTab)); + + /// + /// Component entity that has a list of 'measurement-correction' pairs + /// to be updated in the database on OK. + /// + public Component MeterEntity + { + get { return null; } + set { } + } + + /// + /// A list of 'measurement-correction' pairs to be deleted from the database on OK. + /// + public IList ToBeRemoved + { + get { return toBeRemoved; } + set { toBeRemoved = value; } + } + IList toBeRemoved; + + MetrologyDlg parent; + bool unlocked; + + public MetrologyDlgDensityTab() + { + InitializeComponent(); + toBeRemoved = new List(); + unlocked = false; + } + + private void MetrologyDlgDensityTab_Load(object sender, System.EventArgs e) + { + parent = ParentForm as MetrologyDlg; + + /// Panel1 + densityLabel.Text = string.Format("{0} [{1}]", Strings.Density, Config.Unit.kgpm3.ToDescription()); + temperatureLabel.Text = string.Format("{0} [{1}]", Strings.At_temperature, Config.Unit.C.ToDescription()); + densityCorrLabel.Text = string.Format("{0} [{1}]", Strings.Density_correction, Config.Unit.kgpm3.ToDescription()); + + /// Panel2 + + RefreshAll(); + } + + void RefreshAll() + { + densityTextBox.Text = Program.LocalSettings.RealDensity.ToString(); + temperatureTextBox.Text = Program.LocalSettings.AtTemperature.ToString(); + densityCorrTextBox.Text = Config.Formulas.DensityCorrection(Program.LocalSettings.RealDensity, Program.LocalSettings.AtTemperature).ToString(); + } + + public void Unlock() + { + unlocked = true; + + densityTextBox.Enabled = true; + temperatureTextBox.Enabled = true; + } + + public void OkBtnClicked() + { + double tmp; + if (Utils.TryParseUDouble(densityTextBox.Text, out tmp)) + { + Program.LocalSettings.RealDensity = tmp; + } + if (Utils.TryParseUDouble(temperatureTextBox.Text, out tmp)) + { + Program.LocalSettings.AtTemperature = tmp; + } + Program.LocalSettings.Save(); + } + + public void CancelBtnClicked() + { + } + + public void AddOne() + { + } + + public void RemoveSelected() + { + } + + public void MoveUpSelected() + { + } + + public void MoveDownSelected() + { + } + + public string GetWarningsBeforeSaving(ref Dictionary renmInfo) + { + return string.Empty; + } + + public void UpdateRelatedItems(Dictionary renameInfo) + { + } + + private void densityTextBox_TextChanged(object sender, EventArgs e) + { + UpdateDensityCorrectionDisplay(); + } + + private void temperatureTextBox_TextChanged(object sender, EventArgs e) + { + UpdateDensityCorrectionDisplay(); + } + + void UpdateDensityCorrectionDisplay() + { + double density; + double temp; + if (Utils.TryParseUDouble(densityTextBox.Text, out density) && + Utils.TryParseUDouble(temperatureTextBox.Text, out temp)) + { + densityCorrTextBox.Text = Config.Formulas.DensityCorrection(density, temp).ToString(); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgDensityTab.resx b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgDensityTab.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgDensityTab.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgFlowMeterTab.Designer.cs b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgFlowMeterTab.Designer.cs new file mode 100644 index 00000000..cfc506eb --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgFlowMeterTab.Designer.cs @@ -0,0 +1,291 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.UiControls +{ + partial class MetrologyDlgFlowMeterTab + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.calibrationGroupBox = new System.Windows.Forms.GroupBox(); + this.calibValidDateTextBox = new System.Windows.Forms.TextBox(); + this.calibValidDateLabel = new System.Windows.Forms.Label(); + this.calibDateTextBox = new System.Windows.Forms.TextBox(); + this.calibDateLabel = new System.Windows.Forms.Label(); + this.calibCertificateNrTextBox = new System.Windows.Forms.TextBox(); + this.calibCertificateNrLabel = new System.Windows.Forms.Label(); + this.nameGroupBox = new System.Windows.Forms.GroupBox(); + this.pressFromToLabel = new System.Windows.Forms.Label(); + this.tempFromToLabel = new System.Windows.Forms.Label(); + this.cmpntNameLabel = new System.Windows.Forms.Label(); + this.testGroupBox = new System.Windows.Forms.GroupBox(); + this.correctedTextBox = new System.Windows.Forms.TextBox(); + this.measuredTextBox = new System.Windows.Forms.TextBox(); + this.correctedLabel = new System.Windows.Forms.Label(); + this.measuredLabel = new System.Windows.Forms.Label(); + this.listViewEx = new Results.Forms.ListViewEx(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.calibrationGroupBox.SuspendLayout(); + this.nameGroupBox.SuspendLayout(); + this.testGroupBox.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.calibrationGroupBox); + this.splitContainer1.Panel1.Controls.Add(this.nameGroupBox); + this.splitContainer1.Panel1.Controls.Add(this.testGroupBox); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.listViewEx); + this.splitContainer1.Size = new System.Drawing.Size(650, 400); + this.splitContainer1.SplitterDistance = 102; + this.splitContainer1.TabIndex = 2; + // + // calibrationGroupBox + // + this.calibrationGroupBox.Controls.Add(this.calibValidDateTextBox); + this.calibrationGroupBox.Controls.Add(this.calibValidDateLabel); + this.calibrationGroupBox.Controls.Add(this.calibDateTextBox); + this.calibrationGroupBox.Controls.Add(this.calibDateLabel); + this.calibrationGroupBox.Controls.Add(this.calibCertificateNrTextBox); + this.calibrationGroupBox.Controls.Add(this.calibCertificateNrLabel); + this.calibrationGroupBox.Location = new System.Drawing.Point(186, 10); + this.calibrationGroupBox.Name = "calibrationGroupBox"; + this.calibrationGroupBox.Size = new System.Drawing.Size(228, 86); + this.calibrationGroupBox.TabIndex = 7; + this.calibrationGroupBox.TabStop = false; + this.calibrationGroupBox.Text = "Calibration"; + // + // calibValidDateTextBox + // + this.calibValidDateTextBox.Enabled = false; + this.calibValidDateTextBox.Location = new System.Drawing.Point(140, 59); + this.calibValidDateTextBox.Name = "calibValidDateTextBox"; + this.calibValidDateTextBox.Size = new System.Drawing.Size(82, 20); + this.calibValidDateTextBox.TabIndex = 15; + // + // calibValidDateLabel + // + this.calibValidDateLabel.AutoSize = true; + this.calibValidDateLabel.Location = new System.Drawing.Point(17, 62); + this.calibValidDateLabel.Name = "calibValidDateLabel"; + this.calibValidDateLabel.Size = new System.Drawing.Size(52, 13); + this.calibValidDateLabel.TabIndex = 14; + this.calibValidDateLabel.Text = "Valid until"; + // + // calibDateTextBox + // + this.calibDateTextBox.Enabled = false; + this.calibDateTextBox.Location = new System.Drawing.Point(140, 37); + this.calibDateTextBox.Name = "calibDateTextBox"; + this.calibDateTextBox.Size = new System.Drawing.Size(82, 20); + this.calibDateTextBox.TabIndex = 13; + // + // calibDateLabel + // + this.calibDateLabel.AutoSize = true; + this.calibDateLabel.Location = new System.Drawing.Point(17, 40); + this.calibDateLabel.Name = "calibDateLabel"; + this.calibDateLabel.Size = new System.Drawing.Size(30, 13); + this.calibDateLabel.TabIndex = 12; + this.calibDateLabel.Text = "Date"; + // + // calibCertificateNrTextBox + // + this.calibCertificateNrTextBox.Enabled = false; + this.calibCertificateNrTextBox.Location = new System.Drawing.Point(140, 15); + this.calibCertificateNrTextBox.Name = "calibCertificateNrTextBox"; + this.calibCertificateNrTextBox.Size = new System.Drawing.Size(82, 20); + this.calibCertificateNrTextBox.TabIndex = 11; + // + // calibCertificateNrLabel + // + this.calibCertificateNrLabel.AutoSize = true; + this.calibCertificateNrLabel.Location = new System.Drawing.Point(17, 18); + this.calibCertificateNrLabel.Name = "calibCertificateNrLabel"; + this.calibCertificateNrLabel.Size = new System.Drawing.Size(69, 13); + this.calibCertificateNrLabel.TabIndex = 10; + this.calibCertificateNrLabel.Text = "Certificate nr."; + // + // nameGroupBox + // + this.nameGroupBox.Controls.Add(this.pressFromToLabel); + this.nameGroupBox.Controls.Add(this.tempFromToLabel); + this.nameGroupBox.Controls.Add(this.cmpntNameLabel); + this.nameGroupBox.Location = new System.Drawing.Point(16, 10); + this.nameGroupBox.Name = "nameGroupBox"; + this.nameGroupBox.Size = new System.Drawing.Size(160, 86); + this.nameGroupBox.TabIndex = 5; + this.nameGroupBox.TabStop = false; + this.nameGroupBox.Text = "Component"; + // + // pressFromToLabel + // + this.pressFromToLabel.AutoSize = true; + this.pressFromToLabel.Location = new System.Drawing.Point(14, 62); + this.pressFromToLabel.Name = "pressFromToLabel"; + this.pressFromToLabel.Size = new System.Drawing.Size(0, 13); + this.pressFromToLabel.TabIndex = 2; + // + // tempFromToLabel + // + this.tempFromToLabel.AutoSize = true; + this.tempFromToLabel.Location = new System.Drawing.Point(14, 44); + this.tempFromToLabel.Name = "tempFromToLabel"; + this.tempFromToLabel.Size = new System.Drawing.Size(0, 13); + this.tempFromToLabel.TabIndex = 1; + // + // cmpntNameLabel + // + this.cmpntNameLabel.AutoSize = true; + this.cmpntNameLabel.Location = new System.Drawing.Point(43, 22); + this.cmpntNameLabel.Name = "cmpntNameLabel"; + this.cmpntNameLabel.Size = new System.Drawing.Size(64, 13); + this.cmpntNameLabel.TabIndex = 0; + this.cmpntNameLabel.Text = "cmpntName"; + // + // testGroupBox + // + this.testGroupBox.Controls.Add(this.correctedTextBox); + this.testGroupBox.Controls.Add(this.measuredTextBox); + this.testGroupBox.Controls.Add(this.correctedLabel); + this.testGroupBox.Controls.Add(this.measuredLabel); + this.testGroupBox.Location = new System.Drawing.Point(424, 10); + this.testGroupBox.Name = "testGroupBox"; + this.testGroupBox.Size = new System.Drawing.Size(170, 88); + this.testGroupBox.TabIndex = 4; + this.testGroupBox.TabStop = false; + this.testGroupBox.Text = "Correction test"; + // + // correctedTextBox + // + this.correctedTextBox.Location = new System.Drawing.Point(91, 37); + this.correctedTextBox.Name = "correctedTextBox"; + this.correctedTextBox.ReadOnly = true; + this.correctedTextBox.Size = new System.Drawing.Size(73, 20); + this.correctedTextBox.TabIndex = 5; + // + // measuredTextBox + // + this.measuredTextBox.Location = new System.Drawing.Point(91, 15); + this.measuredTextBox.Name = "measuredTextBox"; + this.measuredTextBox.Size = new System.Drawing.Size(73, 20); + this.measuredTextBox.TabIndex = 4; + this.measuredTextBox.TextChanged += new System.EventHandler(this.measuredTextBox_TextChanged); + // + // correctedLabel + // + this.correctedLabel.AutoSize = true; + this.correctedLabel.Location = new System.Drawing.Point(17, 40); + this.correctedLabel.Name = "correctedLabel"; + this.correctedLabel.Size = new System.Drawing.Size(53, 13); + this.correctedLabel.TabIndex = 3; + this.correctedLabel.Text = "Corrected"; + // + // measuredLabel + // + this.measuredLabel.AutoSize = true; + this.measuredLabel.Location = new System.Drawing.Point(17, 18); + this.measuredLabel.Name = "measuredLabel"; + this.measuredLabel.Size = new System.Drawing.Size(54, 13); + this.measuredLabel.TabIndex = 2; + this.measuredLabel.Text = "Measured"; + // + // listViewEx + // + this.listViewEx.AllowColumnReorder = true; + this.listViewEx.Dock = System.Windows.Forms.DockStyle.Fill; + this.listViewEx.DoubleClickActivation = false; + this.listViewEx.FullRowSelect = true; + this.listViewEx.GridLines = true; + this.listViewEx.Location = new System.Drawing.Point(0, 0); + this.listViewEx.Name = "listViewEx"; + this.listViewEx.Size = new System.Drawing.Size(650, 294); + this.listViewEx.TabIndex = 0; + this.listViewEx.UseCompatibleStateImageBehavior = false; + this.listViewEx.View = System.Windows.Forms.View.Details; + this.listViewEx.SelectedIndexChanged += new System.EventHandler(this.listViewEx_SelectedIndexChanged); + // + // MetrologyDlgFlowMeterTab + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.splitContainer1); + this.Name = "MetrologyDlgFlowMeterTab"; + this.Size = new System.Drawing.Size(650, 400); + this.Load += new System.EventHandler(this.MetrologyDlgFlowMeterTab_Load); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + this.calibrationGroupBox.ResumeLayout(false); + this.calibrationGroupBox.PerformLayout(); + this.nameGroupBox.ResumeLayout(false); + this.nameGroupBox.PerformLayout(); + this.testGroupBox.ResumeLayout(false); + this.testGroupBox.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.Label cmpntNameLabel; + private Results.Forms.ListViewEx listViewEx; + private System.Windows.Forms.GroupBox testGroupBox; + private System.Windows.Forms.TextBox correctedTextBox; + private System.Windows.Forms.TextBox measuredTextBox; + private System.Windows.Forms.Label correctedLabel; + private System.Windows.Forms.Label measuredLabel; + private System.Windows.Forms.GroupBox nameGroupBox; + private System.Windows.Forms.GroupBox calibrationGroupBox; + private System.Windows.Forms.TextBox calibValidDateTextBox; + private System.Windows.Forms.Label calibValidDateLabel; + private System.Windows.Forms.TextBox calibDateTextBox; + private System.Windows.Forms.Label calibDateLabel; + private System.Windows.Forms.TextBox calibCertificateNrTextBox; + private System.Windows.Forms.Label calibCertificateNrLabel; + private System.Windows.Forms.Label pressFromToLabel; + private System.Windows.Forms.Label tempFromToLabel; + + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgFlowMeterTab.cs b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgFlowMeterTab.cs new file mode 100644 index 00000000..31570403 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgFlowMeterTab.cs @@ -0,0 +1,356 @@ +/// +/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.Resources; + +namespace TBF.UiControls +{ + public partial class MetrologyDlgFlowMeterTab : UserControl, IMetrologyDlgTab + { + static readonly ILog log = LogManager.GetLogger(typeof(MetrologyDlgFlowMeterTab)); + + /// + /// Component entity that has a list of 'measurement-correction' pairs + /// to be updated in the database on OK. + /// + Component meterEntity; + public Component MeterEntity + { + get { return meterEntity; } + set { meterEntity = value; } + } + + /// + /// Calibration information configuration + /// + public BenchControl.GenericDevices.ICalibInfoCfg CalibInfoCfg; + + /// + /// A list of 'measurement-correction' pairs to be deleted from the database on OK. + /// + public IList ToBeRemoved + { + get { return toBeRemoved; } + set { toBeRemoved = value; } + } + IList toBeRemoved; + + MetrologyDlg parent; + bool unlocked; + Control measurementTextBox; + Control correctionTextBox; + int rangeIx; /// 0 (no range) or 1..5 (range #) + + + public MetrologyDlgFlowMeterTab() : this(0) {} + + public MetrologyDlgFlowMeterTab(int rangeIx1) + { + InitializeComponent(); + this.rangeIx = rangeIx1; + toBeRemoved = new List(); + } + + private void MetrologyDlgFlowMeterTab_Load(object sender, System.EventArgs e) + { + if (meterEntity == null) return; + + parent = ParentForm as MetrologyDlg; + + Localize(); + + /// Panel1 + if (rangeIx == 0) + { + cmpntNameLabel.Text = meterEntity.Name; + } + else + { + cmpntNameLabel.Text = string.Format("{0} Range {1}", meterEntity.Name, rangeIx); + tempFromToLabel.Text = string.Format("{0} {1} {2} {3} °C", Strings.from, CalibInfoCfg.GetTempLo(rangeIx), Strings.to, CalibInfoCfg.GetTempHi(rangeIx)); + pressFromToLabel.Text = string.Format("{0} {1} {2} {3} bar", Strings.from, CalibInfoCfg.GetPressLo(rangeIx), Strings.to, CalibInfoCfg.GetPressHi(rangeIx)); + } + + testGroupBox.Text = Strings.Test_measured_corrected; + measuredLabel.Text = Strings.Measured; + correctedLabel.Text = Strings.Corrected; + measuredTextBox.Text = string.Empty; + correctedTextBox.Text = string.Empty; + + /// Panel2 + measurementTextBox = new TextBox(); + correctionTextBox = new TextBox(); + this.Controls.Add(measurementTextBox); + this.Controls.Add(correctionTextBox); + + listViewEx.SubItemClicked += new Results.Forms.SubItemEventHandler(listViewEx_SubItemClicked); + listViewEx.SubItemRightClicked += new Results.Forms.SubItemEventHandler(listViewEx_SubItemRightClicked); + listViewEx.SubItemEndEditing += new Results.Forms.SubItemEndEditingEventHandler(listViewEx_SubItemEndEditing); + + listViewEx.Columns.Add(new ColumnHeader() { Text = Strings.Nr, Width = 60 }); + listViewEx.Columns.Add(new ColumnHeader() { Text = string.Format("{0} [m3/h]", Strings.Flow), Width = 100 }); + listViewEx.Columns.Add(new ColumnHeader() { Text = string.Format("{0} [l/h]", Strings.Correction), Width = 100 }); + + RefreshAll(rangeIx); + } + + void Localize() + { + nameGroupBox.Text = Strings.Component; + + calibrationGroupBox.Text = Strings.Calibration; + calibCertificateNrLabel.Text = Strings.Certificate; + calibDateLabel.Text = Strings.Date; + calibValidDateLabel.Text = Strings.Valid_until; + + testGroupBox.Text = Strings.Test_measured_corrected; + measuredLabel.Text = Strings.Measured; + correctedLabel.Text = Strings.Corrected; + } + + void RefreshAll(int rangeIx1) + { + if (CalibInfoCfg != null) + { + calibCertificateNrTextBox.Text = CalibInfoCfg.GetCalibCertificate(rangeIx1); + calibDateTextBox.Text = CalibInfoCfg.GetCalibDate(rangeIx1).ToShortDateString(); + calibValidDateTextBox.Text = CalibInfoCfg.GetCalibValidDate(rangeIx1).ToShortDateString(); + } + + listViewEx.Items.Clear(); + foreach (var corr in MeterEntity.Corrections) + { + if (corr.RangeIx == rangeIx) AddOneLVI(corr); + } + } + + void AddOneLVI(MeasurementCorrection corr) + { + int nr = listViewEx.Items.Count + 1; + ListViewItem lvi = new ListViewItem(nr.ToString()); + lvi.SubItems.Add(corr.Measurement.ToString()); + lvi.SubItems.Add((corr.Correction * 1000.0f).ToString()); + lvi.Tag = corr; + listViewEx.Items.Add(lvi); + } + + void listViewEx_SubItemClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (unlocked && e.SubItem == 1) + { + listViewEx.StartEditing(measurementTextBox, e.Item, e.SubItem); + } + else if (unlocked && e.SubItem == 2) + { + listViewEx.StartEditing(correctionTextBox, e.Item, e.SubItem); + } + } + + void listViewEx_SubItemRightClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (!unlocked || e.SubItem < 1 || e.SubItem > 2) return; + + if (DialogResult.Yes == MessageBox.Show(Strings.Do_you_want_to_copy_this_value_to_all_cells_below_this_cell, + Strings.Confirmation, MessageBoxButtons.YesNo, MessageBoxIcon.Question)) + { + int columnNr = e.SubItem; + string value = null; + System.Drawing.Color backColor = System.Drawing.Color.White; + + foreach (ListViewItem item in listViewEx.Items) + { + if (value != null && item.SubItems.Count > columnNr) + { + item.SubItems[columnNr].Text = value; + item.SubItems[columnNr].BackColor = backColor; + ParseItem(item, columnNr, value); + } + else if (item == e.Item) + { + value = item.SubItems[columnNr].Text; + backColor = item.SubItems[columnNr].BackColor; + } + } + } + } + + void listViewEx_SubItemEndEditing(object sender, Results.Forms.SubItemEndEditingEventArgs e) + { + if (ParseItem(e.Item, e.SubItem, e.DisplayText)) return; + + /// New value NOK, revert the original text + e.DisplayText = e.Item.Text; + e.Cancel = true; + } + + /// + /// Parse text of a ListViewItem + /// + /// true = value parsed OK + bool ParseItem(ListViewItem item, int subItem, string value) + { + float fvalue; + if (subItem == 1 && Utils.TryParseEFloat(value, out fvalue) && fvalue >= 0) + { + (item.Tag as MeasurementCorrection).Measurement = fvalue; + return true; + } + else if (subItem == 2 && Utils.TryParseEFloat(value, out fvalue)) + { + (item.Tag as MeasurementCorrection).Correction = fvalue / 1000.0f; + return true; + } + else + { + return false; + } + } + + public void Unlock() + { + unlocked = true; + + calibCertificateNrTextBox.Enabled = true; + calibDateTextBox.Enabled = true; + calibValidDateTextBox.Enabled = true; + + if (listViewEx.SelectedItems.Count == 1) + { + int ix = listViewEx.SelectedIndices[0]; + listViewEx.Focus(); + listViewEx.Items[ix].Selected = true; + listViewEx.Items[ix].EnsureVisible(); + } + } + + public void OkBtnClicked() + { + if (CalibInfoCfg != null) + { + try + { + CalibInfoCfg.SetCalibCertificate(rangeIx, calibCertificateNrTextBox.Text); + CalibInfoCfg.SetCalibDate(rangeIx, DateTime.Parse(calibDateTextBox.Text)); + CalibInfoCfg.SetCalibValidDate(rangeIx, DateTime.Parse(calibValidDateTextBox.Text)); + + Component modified = CalibInfoCfg.CreateDbEntity(); + MeterEntity.Parameters = modified.Parameters; + } + catch + { + MessageBox.Show(Strings.Invalid_calib_info_Correct_pls, + Strings.Error, + MessageBoxButtons.OK, + MessageBoxIcon.Exclamation); + } + } + } + + public void CancelBtnClicked() + { + } + + public void AddOne() + { + MeasurementCorrection corr = new MeasurementCorrection(rangeIx); + MeterEntity.Corrections.Add(corr); + AddOneLVI(corr); + + listViewEx.Focus(); + listViewEx.SelectedItems.Clear(); + listViewEx.Items[listViewEx.Items.Count - 1].Selected = true; + listViewEx.Items[listViewEx.Items.Count - 1].EnsureVisible(); + } + + public void RemoveSelected() + { + if (listViewEx.SelectedItems.Count != 1) return; + + int removeItemNr = listViewEx.SelectedIndices[0]; + + MeasurementCorrection selected = (MeasurementCorrection)listViewEx.SelectedItems[0].Tag; + if (selected.Id != 0) toBeRemoved.Add(selected); + MeterEntity.Corrections.RemoveAt(removeItemNr); + RefreshAll(rangeIx); + + if (removeItemNr < listViewEx.Items.Count) + { + listViewEx.Focus(); + listViewEx.Items[removeItemNr].Selected = true; + listViewEx.Items[removeItemNr].EnsureVisible(); + } + else + { + parent.UpdateButtonStates(SharedButtons.SelectedItemPos.None); + } + } + + public void MoveUpSelected() + { + } + + public void MoveDownSelected() + { + } + + /// + /// Event handler that indicates the selected item position + /// and updates 'Remove', 'Up' and 'Down' buttons in the parent dialog. + /// + private void listViewEx_SelectedIndexChanged(object sender, EventArgs e) + { + if (listViewEx.SelectedItems.Count != 1) + { + parent.UpdateButtonStates(SharedButtons.SelectedItemPos.None); + } + else if (listViewEx.Items.Count == 1) + { + parent.UpdateButtonStates(SharedButtons.SelectedItemPos.FirstAndLast); + } + else if (listViewEx.SelectedIndices[0] == 0) + { + parent.UpdateButtonStates(SharedButtons.SelectedItemPos.First); + } + else if (listViewEx.SelectedIndices[0] == (listViewEx.Items.Count - 1)) + { + parent.UpdateButtonStates(SharedButtons.SelectedItemPos.Last); + } + else + { + parent.UpdateButtonStates(SharedButtons.SelectedItemPos.Middle); + } + } + + private void measuredTextBox_TextChanged(object sender, EventArgs e) + { + float measured; + if (float.TryParse(measuredTextBox.Text, + NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowExponent, + CultureInfo.CurrentCulture, + out measured) || + float.TryParse(measuredTextBox.Text, + NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowExponent, + CultureInfo.InvariantCulture, + out measured)) + { + double corrected = Config.Formulas.CorrectedValue(measured, meterEntity.Corrections); + correctedTextBox.Text = corrected.ToString(); + } + } + + public string GetWarningsBeforeSaving(ref Dictionary renmInfo) + { + return string.Empty; + } + + public void UpdateRelatedItems(Dictionary renameInfo) + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgFlowMeterTab.resx b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgFlowMeterTab.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgFlowMeterTab.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgPlatinumResistanceTMeterTab.Designer.cs b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgPlatinumResistanceTMeterTab.Designer.cs new file mode 100644 index 00000000..f6ebb615 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgPlatinumResistanceTMeterTab.Designer.cs @@ -0,0 +1,465 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.UiControls +{ + partial class MetrologyDlgPlatinumResistanceTMeterTab + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.cmpntNameLabel = new System.Windows.Forms.Label(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.radioButton2 = new System.Windows.Forms.RadioButton(); + this.radioButton1 = new System.Windows.Forms.RadioButton(); + this.testGroupBox = new System.Windows.Forms.GroupBox(); + this.temperatureTextBox = new System.Windows.Forms.TextBox(); + this.resistanceLabel = new System.Windows.Forms.Label(); + this.temperatureLabel = new System.Windows.Forms.Label(); + this.resistanceTextBox = new System.Windows.Forms.TextBox(); + this.calibrationGroupBox = new System.Windows.Forms.GroupBox(); + this.calibValidDateTextBox = new System.Windows.Forms.TextBox(); + this.calibValidDateLabel = new System.Windows.Forms.Label(); + this.calibDateTextBox = new System.Windows.Forms.TextBox(); + this.calibDateLabel = new System.Windows.Forms.Label(); + this.calibCertificateNrTextBox = new System.Windows.Forms.TextBox(); + this.calibCertificateNrLabel = new System.Windows.Forms.Label(); + this.its90CalibrationCoefficientsGroupBox = new System.Windows.Forms.GroupBox(); + this.c7TextBox = new System.Windows.Forms.TextBox(); + this.c7Label = new System.Windows.Forms.Label(); + this.b7TextBox = new System.Windows.Forms.TextBox(); + this.a7TextBox = new System.Windows.Forms.TextBox(); + this.r001cTextBox = new System.Windows.Forms.TextBox(); + this.b7Label = new System.Windows.Forms.Label(); + this.a7Label = new System.Windows.Forms.Label(); + this.r0Label = new System.Windows.Forms.Label(); + this.nameGroupBox = new System.Windows.Forms.GroupBox(); + this.its27CalibrationCoefficientsGroupBox = new System.Windows.Forms.GroupBox(); + this.bTextBox = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.aTextBox = new System.Windows.Forms.TextBox(); + this.r0TextBox = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.testGroupBox.SuspendLayout(); + this.calibrationGroupBox.SuspendLayout(); + this.its90CalibrationCoefficientsGroupBox.SuspendLayout(); + this.nameGroupBox.SuspendLayout(); + this.its27CalibrationCoefficientsGroupBox.SuspendLayout(); + this.SuspendLayout(); + // + // cmpntNameLabel + // + this.cmpntNameLabel.AutoSize = true; + this.cmpntNameLabel.Location = new System.Drawing.Point(69, 16); + this.cmpntNameLabel.Name = "cmpntNameLabel"; + this.cmpntNameLabel.Size = new System.Drawing.Size(64, 13); + this.cmpntNameLabel.TabIndex = 0; + this.cmpntNameLabel.Text = "cmpntName"; + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.radioButton2); + this.splitContainer1.Panel1.Controls.Add(this.radioButton1); + this.splitContainer1.Panel1.Controls.Add(this.testGroupBox); + this.splitContainer1.Panel1.Controls.Add(this.calibrationGroupBox); + this.splitContainer1.Panel1.Controls.Add(this.its90CalibrationCoefficientsGroupBox); + this.splitContainer1.Panel1.Controls.Add(this.nameGroupBox); + this.splitContainer1.Panel1.Controls.Add(this.its27CalibrationCoefficientsGroupBox); + this.splitContainer1.Size = new System.Drawing.Size(668, 400); + this.splitContainer1.SplitterDistance = 300; + this.splitContainer1.TabIndex = 1; + // + // radioButton2 + // + this.radioButton2.AutoSize = true; + this.radioButton2.Location = new System.Drawing.Point(462, 24); + this.radioButton2.Name = "radioButton2"; + this.radioButton2.Size = new System.Drawing.Size(187, 17); + this.radioButton2.TabIndex = 11; + this.radioButton2.TabStop = true; + this.radioButton2.Text = "Use ITS-27 calibration coefficients"; + this.radioButton2.UseVisualStyleBackColor = true; + // + // radioButton1 + // + this.radioButton1.AutoSize = true; + this.radioButton1.Location = new System.Drawing.Point(235, 24); + this.radioButton1.Name = "radioButton1"; + this.radioButton1.Size = new System.Drawing.Size(187, 17); + this.radioButton1.TabIndex = 10; + this.radioButton1.TabStop = true; + this.radioButton1.Text = "Use ITS-90 calibration coefficients"; + this.radioButton1.UseVisualStyleBackColor = true; + // + // testGroupBox + // + this.testGroupBox.Controls.Add(this.temperatureTextBox); + this.testGroupBox.Controls.Add(this.resistanceLabel); + this.testGroupBox.Controls.Add(this.temperatureLabel); + this.testGroupBox.Controls.Add(this.resistanceTextBox); + this.testGroupBox.Location = new System.Drawing.Point(16, 155); + this.testGroupBox.Name = "testGroupBox"; + this.testGroupBox.Size = new System.Drawing.Size(208, 77); + this.testGroupBox.TabIndex = 9; + this.testGroupBox.TabStop = false; + this.testGroupBox.Text = "Test"; + // + // temperatureTextBox + // + this.temperatureTextBox.Location = new System.Drawing.Point(121, 46); + this.temperatureTextBox.Name = "temperatureTextBox"; + this.temperatureTextBox.ReadOnly = true; + this.temperatureTextBox.Size = new System.Drawing.Size(79, 20); + this.temperatureTextBox.TabIndex = 5; + // + // resistanceLabel + // + this.resistanceLabel.AutoSize = true; + this.resistanceLabel.Location = new System.Drawing.Point(16, 23); + this.resistanceLabel.Name = "resistanceLabel"; + this.resistanceLabel.Size = new System.Drawing.Size(78, 13); + this.resistanceLabel.TabIndex = 2; + this.resistanceLabel.Text = "Resistance [Ω]"; + // + // temperatureLabel + // + this.temperatureLabel.AutoSize = true; + this.temperatureLabel.Location = new System.Drawing.Point(16, 49); + this.temperatureLabel.Name = "temperatureLabel"; + this.temperatureLabel.Size = new System.Drawing.Size(87, 13); + this.temperatureLabel.TabIndex = 3; + this.temperatureLabel.Text = "Temperature [°C]"; + // + // resistanceTextBox + // + this.resistanceTextBox.Location = new System.Drawing.Point(121, 20); + this.resistanceTextBox.Name = "resistanceTextBox"; + this.resistanceTextBox.Size = new System.Drawing.Size(79, 20); + this.resistanceTextBox.TabIndex = 4; + this.resistanceTextBox.TextChanged += new System.EventHandler(this.measuredTextBox_TextChanged); + // + // calibrationGroupBox + // + this.calibrationGroupBox.Controls.Add(this.calibValidDateTextBox); + this.calibrationGroupBox.Controls.Add(this.calibValidDateLabel); + this.calibrationGroupBox.Controls.Add(this.calibDateTextBox); + this.calibrationGroupBox.Controls.Add(this.calibDateLabel); + this.calibrationGroupBox.Controls.Add(this.calibCertificateNrTextBox); + this.calibrationGroupBox.Controls.Add(this.calibCertificateNrLabel); + this.calibrationGroupBox.Location = new System.Drawing.Point(16, 54); + this.calibrationGroupBox.Name = "calibrationGroupBox"; + this.calibrationGroupBox.Size = new System.Drawing.Size(208, 95); + this.calibrationGroupBox.TabIndex = 6; + this.calibrationGroupBox.TabStop = false; + this.calibrationGroupBox.Text = "Calibration"; + // + // calibValidDateTextBox + // + this.calibValidDateTextBox.Enabled = false; + this.calibValidDateTextBox.Location = new System.Drawing.Point(105, 65); + this.calibValidDateTextBox.Name = "calibValidDateTextBox"; + this.calibValidDateTextBox.Size = new System.Drawing.Size(95, 20); + this.calibValidDateTextBox.TabIndex = 15; + // + // calibValidDateLabel + // + this.calibValidDateLabel.AutoSize = true; + this.calibValidDateLabel.Location = new System.Drawing.Point(17, 68); + this.calibValidDateLabel.Name = "calibValidDateLabel"; + this.calibValidDateLabel.Size = new System.Drawing.Size(52, 13); + this.calibValidDateLabel.TabIndex = 14; + this.calibValidDateLabel.Text = "Valid until"; + // + // calibDateTextBox + // + this.calibDateTextBox.Enabled = false; + this.calibDateTextBox.Location = new System.Drawing.Point(105, 40); + this.calibDateTextBox.Name = "calibDateTextBox"; + this.calibDateTextBox.Size = new System.Drawing.Size(95, 20); + this.calibDateTextBox.TabIndex = 13; + // + // calibDateLabel + // + this.calibDateLabel.AutoSize = true; + this.calibDateLabel.Location = new System.Drawing.Point(17, 43); + this.calibDateLabel.Name = "calibDateLabel"; + this.calibDateLabel.Size = new System.Drawing.Size(30, 13); + this.calibDateLabel.TabIndex = 12; + this.calibDateLabel.Text = "Date"; + // + // calibCertificateNrTextBox + // + this.calibCertificateNrTextBox.Enabled = false; + this.calibCertificateNrTextBox.Location = new System.Drawing.Point(105, 15); + this.calibCertificateNrTextBox.Name = "calibCertificateNrTextBox"; + this.calibCertificateNrTextBox.Size = new System.Drawing.Size(95, 20); + this.calibCertificateNrTextBox.TabIndex = 11; + // + // calibCertificateNrLabel + // + this.calibCertificateNrLabel.AutoSize = true; + this.calibCertificateNrLabel.Location = new System.Drawing.Point(17, 18); + this.calibCertificateNrLabel.Name = "calibCertificateNrLabel"; + this.calibCertificateNrLabel.Size = new System.Drawing.Size(54, 13); + this.calibCertificateNrLabel.TabIndex = 10; + this.calibCertificateNrLabel.Text = "Certificate"; + // + // its90CalibrationCoefficientsGroupBox + // + this.its90CalibrationCoefficientsGroupBox.Controls.Add(this.c7TextBox); + this.its90CalibrationCoefficientsGroupBox.Controls.Add(this.c7Label); + this.its90CalibrationCoefficientsGroupBox.Controls.Add(this.b7TextBox); + this.its90CalibrationCoefficientsGroupBox.Controls.Add(this.a7TextBox); + this.its90CalibrationCoefficientsGroupBox.Controls.Add(this.r001cTextBox); + this.its90CalibrationCoefficientsGroupBox.Controls.Add(this.b7Label); + this.its90CalibrationCoefficientsGroupBox.Controls.Add(this.a7Label); + this.its90CalibrationCoefficientsGroupBox.Controls.Add(this.r0Label); + this.its90CalibrationCoefficientsGroupBox.Location = new System.Drawing.Point(230, 54); + this.its90CalibrationCoefficientsGroupBox.Name = "its90CalibrationCoefficientsGroupBox"; + this.its90CalibrationCoefficientsGroupBox.Size = new System.Drawing.Size(220, 140); + this.its90CalibrationCoefficientsGroupBox.TabIndex = 5; + this.its90CalibrationCoefficientsGroupBox.TabStop = false; + this.its90CalibrationCoefficientsGroupBox.Text = "ITS-90 calibration coefficients"; + // + // c7TextBox + // + this.c7TextBox.Enabled = false; + this.c7TextBox.Location = new System.Drawing.Point(82, 104); + this.c7TextBox.Name = "c7TextBox"; + this.c7TextBox.Size = new System.Drawing.Size(124, 20); + this.c7TextBox.TabIndex = 7; + // + // c7Label + // + this.c7Label.AutoSize = true; + this.c7Label.Location = new System.Drawing.Point(20, 107); + this.c7Label.Name = "c7Label"; + this.c7Label.Size = new System.Drawing.Size(19, 13); + this.c7Label.TabIndex = 6; + this.c7Label.Text = "c7"; + // + // b7TextBox + // + this.b7TextBox.Enabled = false; + this.b7TextBox.Location = new System.Drawing.Point(82, 79); + this.b7TextBox.Name = "b7TextBox"; + this.b7TextBox.Size = new System.Drawing.Size(124, 20); + this.b7TextBox.TabIndex = 5; + // + // a7TextBox + // + this.a7TextBox.Enabled = false; + this.a7TextBox.Location = new System.Drawing.Point(82, 54); + this.a7TextBox.Name = "a7TextBox"; + this.a7TextBox.Size = new System.Drawing.Size(124, 20); + this.a7TextBox.TabIndex = 4; + // + // r001cTextBox + // + this.r001cTextBox.Enabled = false; + this.r001cTextBox.Location = new System.Drawing.Point(82, 29); + this.r001cTextBox.Name = "r001cTextBox"; + this.r001cTextBox.Size = new System.Drawing.Size(124, 20); + this.r001cTextBox.TabIndex = 3; + // + // b7Label + // + this.b7Label.AutoSize = true; + this.b7Label.Location = new System.Drawing.Point(20, 82); + this.b7Label.Name = "b7Label"; + this.b7Label.Size = new System.Drawing.Size(19, 13); + this.b7Label.TabIndex = 2; + this.b7Label.Text = "b7"; + // + // a7Label + // + this.a7Label.AutoSize = true; + this.a7Label.Location = new System.Drawing.Point(20, 57); + this.a7Label.Name = "a7Label"; + this.a7Label.Size = new System.Drawing.Size(19, 13); + this.a7Label.TabIndex = 1; + this.a7Label.Text = "a7"; + // + // r0Label + // + this.r0Label.AutoSize = true; + this.r0Label.Location = new System.Drawing.Point(20, 32); + this.r0Label.Name = "r0Label"; + this.r0Label.Size = new System.Drawing.Size(53, 13); + this.r0Label.TabIndex = 0; + this.r0Label.Text = "R(0.01°C)"; + // + // nameGroupBox + // + this.nameGroupBox.Controls.Add(this.cmpntNameLabel); + this.nameGroupBox.Location = new System.Drawing.Point(16, 10); + this.nameGroupBox.Name = "nameGroupBox"; + this.nameGroupBox.Size = new System.Drawing.Size(208, 40); + this.nameGroupBox.TabIndex = 4; + this.nameGroupBox.TabStop = false; + this.nameGroupBox.Text = "Component"; + // + // its27CalibrationCoefficientsGroupBox + // + this.its27CalibrationCoefficientsGroupBox.Controls.Add(this.bTextBox); + this.its27CalibrationCoefficientsGroupBox.Controls.Add(this.label1); + this.its27CalibrationCoefficientsGroupBox.Controls.Add(this.aTextBox); + this.its27CalibrationCoefficientsGroupBox.Controls.Add(this.r0TextBox); + this.its27CalibrationCoefficientsGroupBox.Controls.Add(this.label2); + this.its27CalibrationCoefficientsGroupBox.Controls.Add(this.label3); + this.its27CalibrationCoefficientsGroupBox.Location = new System.Drawing.Point(459, 54); + this.its27CalibrationCoefficientsGroupBox.Name = "its27CalibrationCoefficientsGroupBox"; + this.its27CalibrationCoefficientsGroupBox.Size = new System.Drawing.Size(190, 140); + this.its27CalibrationCoefficientsGroupBox.TabIndex = 3; + this.its27CalibrationCoefficientsGroupBox.TabStop = false; + this.its27CalibrationCoefficientsGroupBox.Text = "ITS-27 calibration coefficients"; + // + // bTextBox + // + this.bTextBox.Enabled = false; + this.bTextBox.Location = new System.Drawing.Point(52, 79); + this.bTextBox.Name = "bTextBox"; + this.bTextBox.Size = new System.Drawing.Size(124, 20); + this.bTextBox.TabIndex = 13; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(22, 82); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(14, 13); + this.label1.TabIndex = 12; + this.label1.Text = "B"; + // + // aTextBox + // + this.aTextBox.Enabled = false; + this.aTextBox.Location = new System.Drawing.Point(52, 54); + this.aTextBox.Name = "aTextBox"; + this.aTextBox.Size = new System.Drawing.Size(124, 20); + this.aTextBox.TabIndex = 11; + // + // r0TextBox + // + this.r0TextBox.Enabled = false; + this.r0TextBox.Location = new System.Drawing.Point(52, 29); + this.r0TextBox.Name = "r0TextBox"; + this.r0TextBox.Size = new System.Drawing.Size(124, 20); + this.r0TextBox.TabIndex = 10; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(22, 57); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(14, 13); + this.label2.TabIndex = 9; + this.label2.Text = "A"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(22, 32); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(21, 13); + this.label3.TabIndex = 8; + this.label3.Text = "R0"; + // + // MetrologyDlgPlatinumResistanceTMeterTab + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.splitContainer1); + this.Name = "MetrologyDlgPlatinumResistanceTMeterTab"; + this.Size = new System.Drawing.Size(668, 400); + this.Load += new System.EventHandler(this.MetrologyDlgBalanceTab_Load); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + this.testGroupBox.ResumeLayout(false); + this.testGroupBox.PerformLayout(); + this.calibrationGroupBox.ResumeLayout(false); + this.calibrationGroupBox.PerformLayout(); + this.its90CalibrationCoefficientsGroupBox.ResumeLayout(false); + this.its90CalibrationCoefficientsGroupBox.PerformLayout(); + this.nameGroupBox.ResumeLayout(false); + this.nameGroupBox.PerformLayout(); + this.its27CalibrationCoefficientsGroupBox.ResumeLayout(false); + this.its27CalibrationCoefficientsGroupBox.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label cmpntNameLabel; + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.Label resistanceLabel; + private System.Windows.Forms.GroupBox its27CalibrationCoefficientsGroupBox; + private System.Windows.Forms.TextBox temperatureTextBox; + private System.Windows.Forms.TextBox resistanceTextBox; + private System.Windows.Forms.Label temperatureLabel; + private System.Windows.Forms.GroupBox its90CalibrationCoefficientsGroupBox; + private System.Windows.Forms.GroupBox nameGroupBox; + private System.Windows.Forms.TextBox b7TextBox; + private System.Windows.Forms.TextBox a7TextBox; + private System.Windows.Forms.TextBox r001cTextBox; + private System.Windows.Forms.Label b7Label; + private System.Windows.Forms.Label a7Label; + private System.Windows.Forms.Label r0Label; + private System.Windows.Forms.TextBox c7TextBox; + private System.Windows.Forms.Label c7Label; + private System.Windows.Forms.GroupBox calibrationGroupBox; + private System.Windows.Forms.TextBox calibValidDateTextBox; + private System.Windows.Forms.Label calibValidDateLabel; + private System.Windows.Forms.TextBox calibDateTextBox; + private System.Windows.Forms.Label calibDateLabel; + private System.Windows.Forms.TextBox calibCertificateNrTextBox; + private System.Windows.Forms.Label calibCertificateNrLabel; + private System.Windows.Forms.GroupBox testGroupBox; + private System.Windows.Forms.TextBox bTextBox; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox aTextBox; + private System.Windows.Forms.TextBox r0TextBox; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.RadioButton radioButton2; + private System.Windows.Forms.RadioButton radioButton1; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgPlatinumResistanceTMeterTab.cs b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgPlatinumResistanceTMeterTab.cs new file mode 100644 index 00000000..1fccacd9 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgPlatinumResistanceTMeterTab.cs @@ -0,0 +1,231 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.Resources; + +namespace TBF.UiControls +{ + public partial class MetrologyDlgPlatinumResistanceTMeterTab : UserControl, IMetrologyDlgTab + { + static readonly ILog log = LogManager.GetLogger(typeof(MetrologyDlgPlatinumResistanceTMeterTab)); + + /// + /// Component entity that has a list of 'measurement-correction' pairs + /// to be updated in the database on OK. + /// + public Component MeterEntity + { + get { return meterEntity; } + set { meterEntity = value; } + } + Component meterEntity; + + /// + /// Balance configuration (with buoyancy parameters) + /// + public BenchControl.Keithley.TempMeter.TempMeterCfg TempMeterCfg; + + /// + /// A list of 'measurement-correction' pairs to be deleted from the database on OK. + /// + public IList ToBeRemoved + { + get { return toBeRemoved; } + set { toBeRemoved = value; } + } + IList toBeRemoved; + + MetrologyDlg parent; + bool unlocked; + + public MetrologyDlgPlatinumResistanceTMeterTab() + { + InitializeComponent(); + toBeRemoved = new List(); + unlocked = false; + } + + private void MetrologyDlgBalanceTab_Load(object sender, System.EventArgs e) + { + if (meterEntity == null) return; + + parent = ParentForm as MetrologyDlg; + + Localize(); + + /// Panel1 + cmpntNameLabel.Text = TempMeterCfg.Name; + resistanceTextBox.Text = string.Empty; + temperatureTextBox.Text = string.Empty; + + RefreshAll(); + } + + void Localize() + { + nameGroupBox.Text = Strings.Component; + + calibrationGroupBox.Text = Strings.Calibration; + calibCertificateNrLabel.Text = Strings.Certificate; + calibDateLabel.Text = Strings.Date; + calibValidDateLabel.Text = Strings.Valid_until; + + testGroupBox.Text = Strings.Test; + resistanceLabel.Text = string.Format("{0} [Ω]", Strings.Resistance); + temperatureLabel.Text = string.Format("{0} [°C]", Strings.Temperature); + + radioButton1.Text = string.Format(Strings.Use_0, Strings.ITS90_calibration_coefficients); + radioButton2.Text = string.Format(Strings.Use_0, Strings.ITS27_calibration_coefficients); + + its90CalibrationCoefficientsGroupBox.Text = Strings.ITS90_calibration_coefficients; + its27CalibrationCoefficientsGroupBox.Text = Strings.ITS27_calibration_coefficients; + } + + void RefreshAll() + { + if (TempMeterCfg != null) + { + calibCertificateNrTextBox.Text = TempMeterCfg.CalibCertificateNr; + calibDateTextBox.Text = TempMeterCfg.CalibDate.ToShortDateString(); + calibValidDateTextBox.Text = TempMeterCfg.CalibValidDate.ToShortDateString(); + + radioButton1.Checked = TempMeterCfg.UseITS90; + radioButton2.Checked = !TempMeterCfg.UseITS90; + + r001cTextBox.Text = TempMeterCfg.R001C.ToString(); + a7TextBox.Text = TempMeterCfg.a7.ToString(); + b7TextBox.Text = TempMeterCfg.b7.ToString(); + c7TextBox.Text = TempMeterCfg.c7.ToString(); + + r0TextBox.Text = TempMeterCfg.R0.ToString(); + aTextBox.Text = TempMeterCfg.A.ToString(); + bTextBox.Text = TempMeterCfg.B.ToString(); + } + } + + public void Unlock() + { + unlocked = true; + + calibCertificateNrTextBox.Enabled = true; + calibDateTextBox.Enabled = true; + calibValidDateTextBox.Enabled = true; + + radioButton1.Enabled = true; + radioButton2.Enabled = true; + + r001cTextBox.Enabled = true; + a7TextBox.Enabled = true; + b7TextBox.Enabled = true; + c7TextBox.Enabled = true; + + r0TextBox.Enabled = true; + aTextBox.Enabled = true; + bTextBox.Enabled = true; + } + + public void OkBtnClicked() + { + if (TempMeterCfg != null) + { + try + { + TempMeterCfg.CalibCertificateNr = calibCertificateNrTextBox.Text; + TempMeterCfg.CalibDate = DateTime.Parse(calibDateTextBox.Text); + TempMeterCfg.CalibValidDate = DateTime.Parse(calibValidDateTextBox.Text); + + TempMeterCfg.UseITS90 = radioButton1.Checked; + + TempMeterCfg.R001C = Utils.ParseUDouble(r001cTextBox.Text); + TempMeterCfg.a7 = Utils.ParseEDouble(a7TextBox.Text); + TempMeterCfg.b7 = Utils.ParseEDouble(b7TextBox.Text); + TempMeterCfg.c7 = Utils.ParseEDouble(c7TextBox.Text); + + TempMeterCfg.R0 = Utils.ParseUDouble(r0TextBox.Text); + TempMeterCfg.A = Utils.ParseEDouble(aTextBox.Text); + TempMeterCfg.B = Utils.ParseEDouble(bTextBox.Text); + + Component modified = TempMeterCfg.CreateDbEntity(); + MeterEntity.Parameters = modified.Parameters; + } + catch + { + MessageBox.Show(string.Format(Strings.Invalid_0, Strings.Calibration_coefficients), + Strings.Error, + MessageBoxButtons.OK, + MessageBoxIcon.Exclamation); + } + } + } + + private void measuredTextBox_TextChanged(object sender, EventArgs e) + { + double resistance; + if (Utils.TryParseUDouble(resistanceTextBox.Text, out resistance)) + { + try + { + double temperature; + if (radioButton1.Checked) + { + double R001C = Utils.ParseUDouble(r001cTextBox.Text); + double a7 = Utils.ParseEDouble(a7TextBox.Text); + double b7 = Utils.ParseEDouble(b7TextBox.Text); + double c7 = Utils.ParseEDouble(c7TextBox.Text); + temperature = Config.Formulas.PlatinumResistanceTM_ITS90_R2T(resistance, R001C, a7, b7, c7); + } + else + { + double R0 = Utils.ParseUDouble(r0TextBox.Text); + double a = Utils.ParseEDouble(aTextBox.Text); + double b = Utils.ParseEDouble(bTextBox.Text); + temperature = Config.Formulas.PlatinumResistanceTM_ITS27_R2T(resistance, R0, a, b); + } + temperatureTextBox.Text = temperature.ToString(); + } + catch + { + MessageBox.Show(string.Format(Strings.Invalid_0, Strings.Calibration_coefficients), + Strings.Error, + MessageBoxButtons.OK, + MessageBoxIcon.Exclamation); + } + } + } + + public void CancelBtnClicked() + { + } + + public void AddOne() + { + } + + public void RemoveSelected() + { + } + + public void MoveUpSelected() + { + } + + public void MoveDownSelected() + { + } + + public string GetWarningsBeforeSaving(ref Dictionary renmInfo) + { + return string.Empty; + } + + public void UpdateRelatedItems(Dictionary renameInfo) + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgPlatinumResistanceTMeterTab.resx b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgPlatinumResistanceTMeterTab.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgPlatinumResistanceTMeterTab.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgPressMeterTab.Designer.cs b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgPressMeterTab.Designer.cs new file mode 100644 index 00000000..e9e82a65 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgPressMeterTab.Designer.cs @@ -0,0 +1,183 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.UiControls +{ + partial class MetrologyDlgPressMeterTab + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.testGroupBox = new System.Windows.Forms.GroupBox(); + this.correctedTextBox = new System.Windows.Forms.TextBox(); + this.measuredTextBox = new System.Windows.Forms.TextBox(); + this.correctedLabel = new System.Windows.Forms.Label(); + this.measuredLabel = new System.Windows.Forms.Label(); + this.componentLabel = new System.Windows.Forms.Label(); + this.cmpntNameLabel = new System.Windows.Forms.Label(); + this.listViewEx = new Results.Forms.ListViewEx(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.testGroupBox.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.testGroupBox); + this.splitContainer1.Panel1.Controls.Add(this.componentLabel); + this.splitContainer1.Panel1.Controls.Add(this.cmpntNameLabel); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.listViewEx); + this.splitContainer1.Size = new System.Drawing.Size(420, 300); + this.splitContainer1.SplitterDistance = 80; + this.splitContainer1.TabIndex = 2; + // + // testGroupBox + // + this.testGroupBox.Controls.Add(this.correctedTextBox); + this.testGroupBox.Controls.Add(this.measuredTextBox); + this.testGroupBox.Controls.Add(this.correctedLabel); + this.testGroupBox.Controls.Add(this.measuredLabel); + this.testGroupBox.Location = new System.Drawing.Point(245, 7); + this.testGroupBox.Name = "testGroupBox"; + this.testGroupBox.Size = new System.Drawing.Size(157, 64); + this.testGroupBox.TabIndex = 4; + this.testGroupBox.TabStop = false; + this.testGroupBox.Text = "Test"; + // + // correctedTextBox + // + this.correctedTextBox.Location = new System.Drawing.Point(74, 38); + this.correctedTextBox.Name = "correctedTextBox"; + this.correctedTextBox.ReadOnly = true; + this.correctedTextBox.Size = new System.Drawing.Size(73, 20); + this.correctedTextBox.TabIndex = 5; + // + // measuredTextBox + // + this.measuredTextBox.Location = new System.Drawing.Point(74, 13); + this.measuredTextBox.Name = "measuredTextBox"; + this.measuredTextBox.Size = new System.Drawing.Size(73, 20); + this.measuredTextBox.TabIndex = 4; + this.measuredTextBox.TextChanged += new System.EventHandler(this.measuredTextBox_TextChanged); + // + // correctedLabel + // + this.correctedLabel.AutoSize = true; + this.correctedLabel.Location = new System.Drawing.Point(7, 41); + this.correctedLabel.Name = "correctedLabel"; + this.correctedLabel.Size = new System.Drawing.Size(53, 13); + this.correctedLabel.TabIndex = 3; + this.correctedLabel.Text = "Corrected"; + // + // measuredLabel + // + this.measuredLabel.AutoSize = true; + this.measuredLabel.Location = new System.Drawing.Point(6, 20); + this.measuredLabel.Name = "measuredLabel"; + this.measuredLabel.Size = new System.Drawing.Size(54, 13); + this.measuredLabel.TabIndex = 2; + this.measuredLabel.Text = "Measured"; + // + // componentLabel + // + this.componentLabel.AutoSize = true; + this.componentLabel.Location = new System.Drawing.Point(14, 12); + this.componentLabel.Name = "componentLabel"; + this.componentLabel.Size = new System.Drawing.Size(64, 13); + this.componentLabel.TabIndex = 1; + this.componentLabel.Text = "Component:"; + // + // cmpntNameLabel + // + this.cmpntNameLabel.AutoSize = true; + this.cmpntNameLabel.Location = new System.Drawing.Point(97, 12); + this.cmpntNameLabel.Name = "cmpntNameLabel"; + this.cmpntNameLabel.Size = new System.Drawing.Size(88, 13); + this.cmpntNameLabel.TabIndex = 0; + this.cmpntNameLabel.Text = "componentName"; + // + // listViewEx + // + this.listViewEx.AllowColumnReorder = true; + this.listViewEx.Dock = System.Windows.Forms.DockStyle.Fill; + this.listViewEx.DoubleClickActivation = false; + this.listViewEx.FullRowSelect = true; + this.listViewEx.GridLines = true; + this.listViewEx.Location = new System.Drawing.Point(0, 0); + this.listViewEx.Name = "listViewEx"; + this.listViewEx.Size = new System.Drawing.Size(420, 216); + this.listViewEx.TabIndex = 0; + this.listViewEx.UseCompatibleStateImageBehavior = false; + this.listViewEx.View = System.Windows.Forms.View.Details; + this.listViewEx.SelectedIndexChanged += new System.EventHandler(this.listViewEx_SelectedIndexChanged); + // + // MetrologyDlgPressMeterTab + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.splitContainer1); + this.Name = "MetrologyDlgPressMeterTab"; + this.Size = new System.Drawing.Size(420, 300); + this.Load += new System.EventHandler(this.MetrologyDlgPressMeterTab_Load); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel1.PerformLayout(); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + this.testGroupBox.ResumeLayout(false); + this.testGroupBox.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.Label componentLabel; + private System.Windows.Forms.Label cmpntNameLabel; + private Results.Forms.ListViewEx listViewEx; + private System.Windows.Forms.GroupBox testGroupBox; + private System.Windows.Forms.TextBox correctedTextBox; + private System.Windows.Forms.TextBox measuredTextBox; + private System.Windows.Forms.Label correctedLabel; + private System.Windows.Forms.Label measuredLabel; + + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgPressMeterTab.cs b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgPressMeterTab.cs new file mode 100644 index 00000000..f4823e58 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgPressMeterTab.cs @@ -0,0 +1,290 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.Resources; + +namespace TBF.UiControls +{ + public partial class MetrologyDlgPressMeterTab : UserControl, IMetrologyDlgTab + { + static readonly ILog log = LogManager.GetLogger(typeof(MetrologyDlgPressMeterTab)); + + /// + /// Component entity that has a list of 'measurement-correction' pairs + /// to be updated in the database on OK. + /// + Component meterEntity; + public Component MeterEntity + { + get { return meterEntity; } + set { meterEntity = value; } + } + + /// + /// A list of 'measurement-correction' pairs to be deleted from the database on OK. + /// + public IList ToBeRemoved + { + get { return toBeRemoved; } + set { toBeRemoved = value; } + } + IList toBeRemoved; + + MetrologyDlg parent; + bool unlocked; + Control measurementTextBox; + Control correctionTextBox; + + public MetrologyDlgPressMeterTab() + { + InitializeComponent(); + toBeRemoved = new List(); + } + + private void MetrologyDlgPressMeterTab_Load(object sender, System.EventArgs e) + { + if (meterEntity == null) return; + + parent = ParentForm as MetrologyDlg; + + /// Panel1 + cmpntNameLabel.Text = meterEntity.Name; + + componentLabel.Text = Strings.Component; + testGroupBox.Text = Strings.Test_measured_corrected; + measuredLabel.Text = Strings.Measured; + correctedLabel.Text = Strings.Corrected; + measuredTextBox.Text = string.Empty; + correctedTextBox.Text = string.Empty; + + /// Panel2 + measurementTextBox = new TextBox(); + correctionTextBox = new TextBox(); + this.Controls.Add(measurementTextBox); + this.Controls.Add(correctionTextBox); + + listViewEx.SubItemClicked += new Results.Forms.SubItemEventHandler(listViewEx_SubItemClicked); + listViewEx.SubItemRightClicked += new Results.Forms.SubItemEventHandler(listViewEx_SubItemRightClicked); + listViewEx.SubItemEndEditing += new Results.Forms.SubItemEndEditingEventHandler(listViewEx_SubItemEndEditing); + + listViewEx.Columns.Add(new ColumnHeader() { Text = Strings.Nr, Width = 60 }); + listViewEx.Columns.Add(new ColumnHeader() { Text = string.Format("{0} [bar]", Strings.Pressure), Width = 100 }); + listViewEx.Columns.Add(new ColumnHeader() { Text = string.Format("{0} [mbar]", Strings.Correction), Width = 100 }); + + RefreshAll(); + } + + void RefreshAll() + { + listViewEx.Items.Clear(); + foreach (var corr in MeterEntity.Corrections) AddOneLVI(corr); + } + + void AddOneLVI(MeasurementCorrection corr) + { + int nr = listViewEx.Items.Count + 1; + ListViewItem lvi = new ListViewItem(nr.ToString()); + lvi.SubItems.Add(corr.Measurement.ToString()); + lvi.SubItems.Add((corr.Correction * 1000.0f).ToString()); + lvi.Tag = corr; + listViewEx.Items.Add(lvi); + } + + void listViewEx_SubItemClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (unlocked && e.SubItem == 1) + { + listViewEx.StartEditing(measurementTextBox, e.Item, e.SubItem); + } + else if (unlocked && e.SubItem == 2) + { + listViewEx.StartEditing(correctionTextBox, e.Item, e.SubItem); + } + } + + void listViewEx_SubItemRightClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (!unlocked || e.SubItem < 1 || e.SubItem > 2) return; + + if (DialogResult.Yes == MessageBox.Show(Strings.Do_you_want_to_copy_this_value_to_all_cells_below_this_cell, + Strings.Confirmation, MessageBoxButtons.YesNo, MessageBoxIcon.Question)) + { + int columnNr = e.SubItem; + string value = null; + System.Drawing.Color backColor = System.Drawing.Color.White; + + foreach (ListViewItem item in listViewEx.Items) + { + if (value != null && item.SubItems.Count > columnNr) + { + item.SubItems[columnNr].Text = value; + item.SubItems[columnNr].BackColor = backColor; + ParseItem(item, columnNr, value); + } + else if (item == e.Item) + { + value = item.SubItems[columnNr].Text; + backColor = item.SubItems[columnNr].BackColor; + } + } + } + } + + void listViewEx_SubItemEndEditing(object sender, Results.Forms.SubItemEndEditingEventArgs e) + { + if (ParseItem(e.Item, e.SubItem, e.DisplayText)) return; + + /// New value NOK, revert the original text + e.DisplayText = e.Item.Text; + e.Cancel = true; + } + + /// + /// Parse text of a ListViewItem + /// + /// true = value parsed OK + bool ParseItem(ListViewItem item, int subItem, string value) + { + float fvalue; + if (subItem == 1 && Utils.TryParseEFloat(value, out fvalue) && fvalue >= 0) + { + (item.Tag as MeasurementCorrection).Measurement = fvalue; + return true; + } + else if (subItem == 2 && Utils.TryParseEFloat(value, out fvalue)) + { + (item.Tag as MeasurementCorrection).Correction = fvalue / 1000.0f; + return true; + } + else + { + return false; + } + } + + public void Unlock() + { + unlocked = true; + + if (listViewEx.SelectedItems.Count == 1) + { + int ix = listViewEx.SelectedIndices[0]; + listViewEx.Focus(); + listViewEx.Items[ix].Selected = true; + listViewEx.Items[ix].EnsureVisible(); + } + } + + public void OkBtnClicked() + { + } + + public void CancelBtnClicked() + { + } + + public void AddOne() + { + MeasurementCorrection corr = new MeasurementCorrection(); + MeterEntity.Corrections.Add(corr); + AddOneLVI(corr); + + listViewEx.Focus(); + listViewEx.SelectedItems.Clear(); + listViewEx.Items[listViewEx.Items.Count - 1].Selected = true; + listViewEx.Items[listViewEx.Items.Count - 1].EnsureVisible(); + } + + public void RemoveSelected() + { + if (listViewEx.SelectedItems.Count != 1) return; + + int removeItemNr = listViewEx.SelectedIndices[0]; + + MeasurementCorrection selected = + (MeasurementCorrection)listViewEx.SelectedItems[0].Tag; + if (selected.Id != 0) toBeRemoved.Add(selected); + MeterEntity.Corrections.RemoveAt(removeItemNr); + RefreshAll(); + + if (removeItemNr < listViewEx.Items.Count) + { + listViewEx.Focus(); + listViewEx.Items[removeItemNr].Selected = true; + listViewEx.Items[removeItemNr].EnsureVisible(); + } + else + { + parent.UpdateButtonStates(SharedButtons.SelectedItemPos.None); + } + } + + public void MoveUpSelected() + { + } + + public void MoveDownSelected() + { + } + + /// + /// Event handler that indicates the selected item position + /// and updates 'Remove', 'Up' and 'Down' buttons in the parent dialog. + /// + private void listViewEx_SelectedIndexChanged(object sender, EventArgs e) + { + if (listViewEx.SelectedItems.Count != 1) + { + parent.UpdateButtonStates(SharedButtons.SelectedItemPos.None); + } + else if (listViewEx.Items.Count == 1) + { + parent.UpdateButtonStates(SharedButtons.SelectedItemPos.FirstAndLast); + } + else if (listViewEx.SelectedIndices[0] == 0) + { + parent.UpdateButtonStates(SharedButtons.SelectedItemPos.First); + } + else if (listViewEx.SelectedIndices[0] == (listViewEx.Items.Count - 1)) + { + parent.UpdateButtonStates(SharedButtons.SelectedItemPos.Last); + } + else + { + parent.UpdateButtonStates(SharedButtons.SelectedItemPos.Middle); + } + } + + private void measuredTextBox_TextChanged(object sender, EventArgs e) + { + float measured; + if (float.TryParse(measuredTextBox.Text, + NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowExponent, + CultureInfo.CurrentCulture, + out measured) || + float.TryParse(measuredTextBox.Text, + NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowExponent, + CultureInfo.InvariantCulture, + out measured)) + { + double corrected = Config.Formulas.CorrectedValue(measured, meterEntity.Corrections); + correctedTextBox.Text = corrected.ToString(); + } + } + + public string GetWarningsBeforeSaving(ref Dictionary renmInfo) + { + return string.Empty; + } + + public void UpdateRelatedItems(Dictionary renameInfo) + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgPressMeterTab.resx b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgPressMeterTab.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgPressMeterTab.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgTempMeterTab.Designer.cs b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgTempMeterTab.Designer.cs new file mode 100644 index 00000000..663753e6 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgTempMeterTab.Designer.cs @@ -0,0 +1,183 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.UiControls +{ + partial class MetrologyDlgTempMeterTab + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.testGroupBox = new System.Windows.Forms.GroupBox(); + this.correctedTextBox = new System.Windows.Forms.TextBox(); + this.measuredTextBox = new System.Windows.Forms.TextBox(); + this.correctedLabel = new System.Windows.Forms.Label(); + this.measuredLabel = new System.Windows.Forms.Label(); + this.componentLabel = new System.Windows.Forms.Label(); + this.cmpntNameLabel = new System.Windows.Forms.Label(); + this.listViewEx = new Results.Forms.ListViewEx(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.testGroupBox.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.testGroupBox); + this.splitContainer1.Panel1.Controls.Add(this.componentLabel); + this.splitContainer1.Panel1.Controls.Add(this.cmpntNameLabel); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.listViewEx); + this.splitContainer1.Size = new System.Drawing.Size(420, 300); + this.splitContainer1.SplitterDistance = 80; + this.splitContainer1.TabIndex = 2; + // + // testGroupBox + // + this.testGroupBox.Controls.Add(this.correctedTextBox); + this.testGroupBox.Controls.Add(this.measuredTextBox); + this.testGroupBox.Controls.Add(this.correctedLabel); + this.testGroupBox.Controls.Add(this.measuredLabel); + this.testGroupBox.Location = new System.Drawing.Point(245, 7); + this.testGroupBox.Name = "testGroupBox"; + this.testGroupBox.Size = new System.Drawing.Size(157, 64); + this.testGroupBox.TabIndex = 4; + this.testGroupBox.TabStop = false; + this.testGroupBox.Text = "Test"; + // + // correctedTextBox + // + this.correctedTextBox.Location = new System.Drawing.Point(74, 38); + this.correctedTextBox.Name = "correctedTextBox"; + this.correctedTextBox.ReadOnly = true; + this.correctedTextBox.Size = new System.Drawing.Size(73, 20); + this.correctedTextBox.TabIndex = 5; + // + // measuredTextBox + // + this.measuredTextBox.Location = new System.Drawing.Point(74, 13); + this.measuredTextBox.Name = "measuredTextBox"; + this.measuredTextBox.Size = new System.Drawing.Size(73, 20); + this.measuredTextBox.TabIndex = 4; + this.measuredTextBox.TextChanged += new System.EventHandler(this.measuredTextBox_TextChanged); + // + // correctedLabel + // + this.correctedLabel.AutoSize = true; + this.correctedLabel.Location = new System.Drawing.Point(7, 41); + this.correctedLabel.Name = "correctedLabel"; + this.correctedLabel.Size = new System.Drawing.Size(53, 13); + this.correctedLabel.TabIndex = 3; + this.correctedLabel.Text = "Corrected"; + // + // measuredLabel + // + this.measuredLabel.AutoSize = true; + this.measuredLabel.Location = new System.Drawing.Point(6, 20); + this.measuredLabel.Name = "measuredLabel"; + this.measuredLabel.Size = new System.Drawing.Size(54, 13); + this.measuredLabel.TabIndex = 2; + this.measuredLabel.Text = "Measured"; + // + // componentLabel + // + this.componentLabel.AutoSize = true; + this.componentLabel.Location = new System.Drawing.Point(14, 12); + this.componentLabel.Name = "componentLabel"; + this.componentLabel.Size = new System.Drawing.Size(64, 13); + this.componentLabel.TabIndex = 1; + this.componentLabel.Text = "Component:"; + // + // cmpntNameLabel + // + this.cmpntNameLabel.AutoSize = true; + this.cmpntNameLabel.Location = new System.Drawing.Point(97, 12); + this.cmpntNameLabel.Name = "cmpntNameLabel"; + this.cmpntNameLabel.Size = new System.Drawing.Size(88, 13); + this.cmpntNameLabel.TabIndex = 0; + this.cmpntNameLabel.Text = "componentName"; + // + // listViewEx + // + this.listViewEx.AllowColumnReorder = true; + this.listViewEx.Dock = System.Windows.Forms.DockStyle.Fill; + this.listViewEx.DoubleClickActivation = false; + this.listViewEx.FullRowSelect = true; + this.listViewEx.GridLines = true; + this.listViewEx.Location = new System.Drawing.Point(0, 0); + this.listViewEx.Name = "listViewEx"; + this.listViewEx.Size = new System.Drawing.Size(420, 216); + this.listViewEx.TabIndex = 0; + this.listViewEx.UseCompatibleStateImageBehavior = false; + this.listViewEx.View = System.Windows.Forms.View.Details; + this.listViewEx.SelectedIndexChanged += new System.EventHandler(this.listViewEx_SelectedIndexChanged); + // + // MetrologyDlgTempMeterTab + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.splitContainer1); + this.Name = "MetrologyDlgTempMeterTab"; + this.Size = new System.Drawing.Size(420, 300); + this.Load += new System.EventHandler(this.MetrologyDlgTempMeterTab_Load); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel1.PerformLayout(); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + this.testGroupBox.ResumeLayout(false); + this.testGroupBox.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.Label componentLabel; + private System.Windows.Forms.Label cmpntNameLabel; + private Results.Forms.ListViewEx listViewEx; + private System.Windows.Forms.GroupBox testGroupBox; + private System.Windows.Forms.TextBox correctedTextBox; + private System.Windows.Forms.TextBox measuredTextBox; + private System.Windows.Forms.Label correctedLabel; + private System.Windows.Forms.Label measuredLabel; + + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgTempMeterTab.cs b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgTempMeterTab.cs new file mode 100644 index 00000000..12e3375a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgTempMeterTab.cs @@ -0,0 +1,290 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.Resources; + +namespace TBF.UiControls +{ + public partial class MetrologyDlgTempMeterTab : UserControl, IMetrologyDlgTab + { + static readonly ILog log = LogManager.GetLogger(typeof(MetrologyDlgTempMeterTab)); + + /// + /// Component entity that has a list of 'measurement-correction' pairs + /// to be updated in the database on OK. + /// + Component meterEntity; + public Component MeterEntity + { + get { return meterEntity; } + set { meterEntity = value; } + } + + /// + /// A list of 'measurement-correction' pairs to be deleted from the database on OK. + /// + public IList ToBeRemoved + { + get { return toBeRemoved; } + set { toBeRemoved = value; } + } + IList toBeRemoved; + + MetrologyDlg parent; + bool unlocked; + Control measurementTextBox; + Control correctionTextBox; + + public MetrologyDlgTempMeterTab() + { + InitializeComponent(); + toBeRemoved = new List(); + } + + private void MetrologyDlgTempMeterTab_Load(object sender, System.EventArgs e) + { + if (meterEntity == null) return; + + parent = ParentForm as MetrologyDlg; + + /// Panel1 + cmpntNameLabel.Text = meterEntity.Name; + + componentLabel.Text = Strings.Component; + testGroupBox.Text = Strings.Test_measured_corrected; + measuredLabel.Text = Strings.Measured; + correctedLabel.Text = Strings.Corrected; + measuredTextBox.Text = string.Empty; + correctedTextBox.Text = string.Empty; + + /// Panel2 + measurementTextBox = new TextBox(); + correctionTextBox = new TextBox(); + this.Controls.Add(measurementTextBox); + this.Controls.Add(correctionTextBox); + + listViewEx.SubItemClicked += new Results.Forms.SubItemEventHandler(listViewEx_SubItemClicked); + listViewEx.SubItemRightClicked += new Results.Forms.SubItemEventHandler(listViewEx_SubItemRightClicked); + listViewEx.SubItemEndEditing += new Results.Forms.SubItemEndEditingEventHandler(listViewEx_SubItemEndEditing); + + listViewEx.Columns.Add(new ColumnHeader() { Text = Strings.Nr, Width = 40 }); + listViewEx.Columns.Add(new ColumnHeader() { Text = string.Format("{0} [°C]", Strings.Temperature), Width = 120 }); + listViewEx.Columns.Add(new ColumnHeader() { Text = string.Format("{0} [1/1000 °C]", Strings.Correction), Width = 150 }); + + RefreshAll(); + } + + void RefreshAll() + { + listViewEx.Items.Clear(); + foreach (var corr in MeterEntity.Corrections) AddOneLVI(corr); + } + + void AddOneLVI(MeasurementCorrection corr) + { + int nr = listViewEx.Items.Count + 1; + ListViewItem lvi = new ListViewItem(nr.ToString()); + lvi.SubItems.Add(corr.Measurement.ToString()); + lvi.SubItems.Add((corr.Correction * 1000.0f).ToString()); + lvi.Tag = corr; + listViewEx.Items.Add(lvi); + } + + void listViewEx_SubItemClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (unlocked && e.SubItem == 1) + { + listViewEx.StartEditing(measurementTextBox, e.Item, e.SubItem); + } + else if (unlocked && e.SubItem == 2) + { + listViewEx.StartEditing(correctionTextBox, e.Item, e.SubItem); + } + } + + void listViewEx_SubItemRightClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (!unlocked || e.SubItem < 1 || e.SubItem > 2) return; + + if (DialogResult.Yes == MessageBox.Show(Strings.Do_you_want_to_copy_this_value_to_all_cells_below_this_cell, + Strings.Confirmation, MessageBoxButtons.YesNo, MessageBoxIcon.Question)) + { + int columnNr = e.SubItem; + string value = null; + System.Drawing.Color backColor = System.Drawing.Color.White; + + foreach (ListViewItem item in listViewEx.Items) + { + if (value != null && item.SubItems.Count > columnNr) + { + item.SubItems[columnNr].Text = value; + item.SubItems[columnNr].BackColor = backColor; + ParseItem(item, columnNr, value); + } + else if (item == e.Item) + { + value = item.SubItems[columnNr].Text; + backColor = item.SubItems[columnNr].BackColor; + } + } + } + } + + void listViewEx_SubItemEndEditing(object sender, Results.Forms.SubItemEndEditingEventArgs e) + { + if (ParseItem(e.Item, e.SubItem, e.DisplayText)) return; + + /// New value NOK, revert the original text + e.DisplayText = e.Item.Text; + e.Cancel = true; + } + + /// + /// Parse text of a ListViewItem + /// + /// true = value parsed OK + bool ParseItem(ListViewItem item, int subItem, string value) + { + float fvalue; + if (subItem == 1 && Utils.TryParseEFloat(value, out fvalue) && fvalue >= 0) + { + (item.Tag as MeasurementCorrection).Measurement = fvalue; + return true; + } + else if (subItem == 2 && Utils.TryParseEFloat(value, out fvalue)) + { + (item.Tag as MeasurementCorrection).Correction = fvalue / 1000.0f; + return true; + } + else + { + return false; + } + } + + public void Unlock() + { + unlocked = true; + + if (listViewEx.SelectedItems.Count == 1) + { + int ix = listViewEx.SelectedIndices[0]; + listViewEx.Focus(); + listViewEx.Items[ix].Selected = true; + listViewEx.Items[ix].EnsureVisible(); + } + } + + public void OkBtnClicked() + { + } + + public void CancelBtnClicked() + { + } + + public void AddOne() + { + MeasurementCorrection corr = new MeasurementCorrection(); + MeterEntity.Corrections.Add(corr); + AddOneLVI(corr); + + listViewEx.Focus(); + listViewEx.SelectedItems.Clear(); + listViewEx.Items[listViewEx.Items.Count - 1].Selected = true; + listViewEx.Items[listViewEx.Items.Count - 1].EnsureVisible(); + } + + public void RemoveSelected() + { + if (listViewEx.SelectedItems.Count != 1) return; + + int removeItemNr = listViewEx.SelectedIndices[0]; + + MeasurementCorrection selected = + (MeasurementCorrection)listViewEx.SelectedItems[0].Tag; + if (selected.Id != 0) toBeRemoved.Add(selected); + MeterEntity.Corrections.RemoveAt(removeItemNr); + RefreshAll(); + + if (removeItemNr < listViewEx.Items.Count) + { + listViewEx.Focus(); + listViewEx.Items[removeItemNr].Selected = true; + listViewEx.Items[removeItemNr].EnsureVisible(); + } + else + { + parent.UpdateButtonStates(SharedButtons.SelectedItemPos.None); + } + } + + public void MoveUpSelected() + { + } + + public void MoveDownSelected() + { + } + + /// + /// Event handler that indicates the selected item position + /// and updates 'Remove', 'Up' and 'Down' buttons in the parent dialog. + /// + private void listViewEx_SelectedIndexChanged(object sender, EventArgs e) + { + if (listViewEx.SelectedItems.Count != 1) + { + parent.UpdateButtonStates(SharedButtons.SelectedItemPos.None); + } + else if (listViewEx.Items.Count == 1) + { + parent.UpdateButtonStates(SharedButtons.SelectedItemPos.FirstAndLast); + } + else if (listViewEx.SelectedIndices[0] == 0) + { + parent.UpdateButtonStates(SharedButtons.SelectedItemPos.First); + } + else if (listViewEx.SelectedIndices[0] == (listViewEx.Items.Count - 1)) + { + parent.UpdateButtonStates(SharedButtons.SelectedItemPos.Last); + } + else + { + parent.UpdateButtonStates(SharedButtons.SelectedItemPos.Middle); + } + } + + private void measuredTextBox_TextChanged(object sender, EventArgs e) + { + float measured; + if (float.TryParse(measuredTextBox.Text, + NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowExponent, + CultureInfo.CurrentCulture, + out measured) || + float.TryParse(measuredTextBox.Text, + NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowExponent, + CultureInfo.InvariantCulture, + out measured)) + { + double corrected = Config.Formulas.CorrectedValue(measured, meterEntity.Corrections); + correctedTextBox.Text = corrected.ToString(); + } + } + + public string GetWarningsBeforeSaving(ref Dictionary renmInfo) + { + return string.Empty; + } + + public void UpdateRelatedItems(Dictionary renameInfo) + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgTempMeterTab.resx b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgTempMeterTab.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/MetrologyDlgTempMeterTab.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/PathsBenchCtrl.cs b/TBF_V2/Sources/TBF/TBF/UiControls/PathsBenchCtrl.cs new file mode 100644 index 00000000..46a98227 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/PathsBenchCtrl.cs @@ -0,0 +1,394 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Globalization; +using System.Windows.Forms; +using log4net; +using TBF.BenchControl; +using TBF.BenchControl.GenericDevices; +using TBF.Resources; +using NHibernate; + +namespace TBF.UiControls +{ + public class PathsBenchCtrl : BaseWithListViewEx, ITabWithListViewEx + { + static readonly ILog log = LogManager.GetLogger(typeof(PathsBenchCtrl)); + + /// + /// Fixed ListViewEx columns + /// + enum Column + { + Name, + Qfrom, + Qto, + Tup, + Tdown, + Pup, + Pdown, + Pdelta, + StopBFValve, + FixedColumnsCount, + } + readonly int fixedColumnsCount = (int)Column.FixedColumnsCount; + + PathsDlg parent; + Control parentControl; + Control[] editors; + + public PathsBenchCtrl() + : base() + { + FixedRowsCount = 1; + } + + public void Initialize(PathsDlg parent, Control parentControl) + { + this.parent = parent; + this.parentControl = parentControl; + + /// Load the paths + MyItems = parent.Session.QueryOver() + .OrderBy(x => x.ItemNr).Asc + .List(); + + foreach (var path in MyItems) path.OriName = path.Name; + + SubItemClicked += new Results.Forms.SubItemEventHandler(listViewEx_SubItemClicked); + SubItemRightClicked += new Results.Forms.SubItemEventHandler(listViewEx_SubItemRightClicked); + SubItemEndEditing += new Results.Forms.SubItemEndEditingEventHandler(listViewEx_SubItemEndEditing); + + /// ListViewEx columns + TBF.LocalSettings ls = Program.LocalSettings; + Columns.Add(Strings.Name, (ls.BenchColumnCount > 0) ? ls.BenchColumnWidths[0] : 60 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(Strings.Q_from_m3h, (ls.BenchColumnCount > 1) ? ls.BenchColumnWidths[1] : 50 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(Strings.Q_to_m3h, (ls.BenchColumnCount > 2) ? ls.BenchColumnWidths[2] : 50 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(Strings.T_in, (ls.BenchColumnCount > 3) ? ls.BenchColumnWidths[3] : 50 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(Strings.T_out, (ls.BenchColumnCount > 4) ? ls.BenchColumnWidths[4] : 50 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(Strings.P_in, (ls.BenchColumnCount > 5) ? ls.BenchColumnWidths[5] : 50 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(Strings.P_out, (ls.BenchColumnCount > 6) ? ls.BenchColumnWidths[6] : 50 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(Strings.P_delta, (ls.BenchColumnCount > 7) ? ls.BenchColumnWidths[7] : 50 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(Strings.StopBFValve_chdr, (ls.BenchColumnCount > 8) ? ls.BenchColumnWidths[8] : 70 * parent.Dpi / PathsDlg.Dpi100pct); + int clmn = (int)Column.FixedColumnsCount; + foreach (var vlv in parent.Valves) + { + if (vlv.Category == ValveCategory.All || vlv.Category == ValveCategory.Bench) + { + Columns.Add(vlv.Cfg.Name, (ls.BenchColumnCount > clmn) ? ls.BenchColumnWidths[clmn] : 50 * parent.Dpi / PathsDlg.Dpi100pct); + clmn++; + } + } + + /// Temperatures, pressures + ComboBox tUpCBox = new ComboBox(); + ComboBox tDownCBox = new ComboBox(); + ComboBox prUpCBox = new ComboBox(); + ComboBox prDownCBox = new ComboBox(); + ComboBox prDeltaCBox = new ComboBox(); + ComboBox stopBFValveComboBox = new ComboBox(); + stopBFValveComboBox.Items.Add("---"); + foreach (var cmpnt in parent.TbfComponents) + { + if (cmpnt is BenchControl.GenericDevices.ITempMeter) + { + tUpCBox.Items.Add(cmpnt.Cfg.Name); + tDownCBox.Items.Add(cmpnt.Cfg.Name); + } + if (cmpnt is BenchControl.GenericDevices.IPressureMeter) + { + prUpCBox.Items.Add(cmpnt.Cfg.Name); + prDownCBox.Items.Add(cmpnt.Cfg.Name); + prDeltaCBox.Items.Add(cmpnt.Cfg.Name); + } + if (cmpnt is IValve && (cmpnt as IValve).CoupledTo == null) + { + stopBFValveComboBox.Items.Add(cmpnt.Cfg.Name); + } + } + + editors = new Control[fixedColumnsCount + 64]; + /// + editors[(int)Column.Name] = new TextBox(); /// Name + editors[(int)Column.Qfrom] = new TextBox(); /// Q_from + editors[(int)Column.Qto] = new TextBox(); /// Q_to + editors[(int)Column.Tup] = tUpCBox; + editors[(int)Column.Tdown] = tDownCBox; + editors[(int)Column.Pup] = prUpCBox; + editors[(int)Column.Pdown] = prDownCBox; + editors[(int)Column.Pdelta] = prDownCBox; + editors[(int)Column.StopBFValve] = stopBFValveComboBox; + /// Prepare valve combo-boxes (max. 64 valves) + for (int i = 0; i < 64; i++) + { + ComboBox cb = new ComboBox(); + cb.Items.Add("---"); + cb.Items.Add(Strings.open); + cb.Items.Add(Strings.close); + editors[fixedColumnsCount + i] = cb; + } + /// + for (int i = 0; i < editors.Length; i++) + { + editors[i].Visible = false; + parent.Controls.Add(editors[i]); + } + + base.RedrawAll(); + } + + void listViewEx_SubItemClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (!Unlocked || e.SubItem >= editors.Length) return; + if ((e.Item.Tag is Config.Entities.IHasItemNr) && + ((e.Item.Tag as Config.Entities.IHasItemNr).ItemNr < FixedRowsCount) && + (e.SubItem < fixedColumnsCount)) + { + return; + } + StartEditing(editors[e.SubItem], e.Item, e.SubItem); + } + + void listViewEx_SubItemRightClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (!Unlocked || e.SubItem >= editors.Length) return; + + if (DialogResult.Yes == MessageBox.Show(Strings.Do_you_want_to_copy_this_value_to_all_cells_below_this_cell, + Strings.Confirmation, MessageBoxButtons.YesNo, MessageBoxIcon.Question)) + { + int columnNr = e.SubItem; + string value = null; + Color backColor = Color.White; + foreach (ListViewItem item in Items) + { + if (value != null && item.SubItems.Count > columnNr) + { + item.SubItems[columnNr].Text = value; + item.SubItems[columnNr].BackColor = backColor; + } + else if (item == e.Item) + { + value = item.SubItems[columnNr].Text; + backColor = item.SubItems[columnNr].BackColor; + } + } + } + } + + void listViewEx_SubItemEndEditing(object sender, Results.Forms.SubItemEndEditingEventArgs e) + { + if (e.SubItem >= fixedColumnsCount) + { + e.Item.SubItems[e.SubItem].BackColor = e.DisplayText == Strings.open ? Color.LightGray : Color.White; + } + } + + public override void DrawOne(object myItem) + { + Config.Entities.BenchPath entity =(Config.Entities.BenchPath)myItem; + BenchControl.BenchPath path = new BenchControl.BenchPath(entity, parent.TbfComponents); + + ListViewItem lvi = new ListViewItem(entity.Name); + lvi.UseItemStyleForSubItems = false; + + lvi.SubItems.Add(path.Qfrom.ToString()); + lvi.SubItems.Add(path.Qto.ToString()); + lvi.SubItems.Add(path.TempMtrUp != null ? path.TempMtrUp.Cfg.Name : "---"); + lvi.SubItems.Add(path.TempMtrDown != null ? path.TempMtrDown.Cfg.Name : "---"); + lvi.SubItems.Add(path.PressMtrUp != null ? path.PressMtrUp.Cfg.Name : "---"); + lvi.SubItems.Add(path.PressMtrDown != null ? path.PressMtrDown.Cfg.Name : "---"); + lvi.SubItems.Add(path.PressMtrDelta != null ? path.PressMtrDelta.Cfg.Name : "---"); + lvi.SubItems.Add((path.StopBFValve != null) ? path.StopBFValve.Cfg.Name : "---"); + + foreach (var valve in parent.Valves) + { + if (valve.Category == ValveCategory.All || valve.Category == ValveCategory.Bench) + { + if (path.ValvesOpen != null && path.ValvesOpen.Contains(valve)) + { + lvi.SubItems.Add(Strings.open); + lvi.SubItems[lvi.SubItems.Count - 1].BackColor = Color.LightGray; + } + else if (path.ValvesClose != null && path.ValvesClose.Contains(valve)) + { + lvi.SubItems.Add(Strings.close); + lvi.SubItems[lvi.SubItems.Count - 1].BackColor = Color.White; + } + else + { + lvi.SubItems.Add("---"); + lvi.SubItems[lvi.SubItems.Count - 1].BackColor = Color.White; + } + } + } + + lvi.Tag = entity; + + Items.Add(lvi); + } + + public override void UpdateOne(ListViewItem lvi, object myItem) + { + Config.Entities.BenchPath entity = (Config.Entities.BenchPath)myItem; + + entity.Name = lvi.Text; + + float Qfrom; + bool allOk = Utils.TryParseUFloat(lvi.SubItems[(int)Column.Qfrom].Text, out Qfrom); + entity.Qfrom = Qfrom; + + float Qto; + allOk &= Utils.TryParseUFloat(lvi.SubItems[(int)Column.Qto].Text, out Qto); + entity.Qto = Qto; + + entity.TempMtrUp = lvi.SubItems[(int)Column.Tup].Text; + entity.TempMtrDown = lvi.SubItems[(int)Column.Tdown].Text; + entity.PressMtrUp = lvi.SubItems[(int)Column.Pup].Text; + entity.PressMtrDown = lvi.SubItems[(int)Column.Pdown].Text; + entity.PressMtrDelta = lvi.SubItems[(int)Column.Pdelta].Text; + entity.StopBFValve = lvi.SubItems[(int)Column.StopBFValve].Text.Equals("---") ? null : lvi.SubItems[(int)Column.StopBFValve].Text; + + string valvesOpen = string.Empty; + string valvesClose = string.Empty; + int k = 0; + for (int j = 0; j < parent.Valves.Count; j++) + { + if (parent.Valves[j].Category == ValveCategory.All || parent.Valves[j].Category == ValveCategory.Bench) + { + string text = lvi.SubItems[fixedColumnsCount + k].Text; + if (text.Equals(Strings.open)) + { + if (valvesOpen != string.Empty) valvesOpen += ";"; + valvesOpen += parent.Valves[j].Cfg.Name; + } + if (text.Equals(Strings.close)) + { + if (valvesClose != string.Empty) valvesClose += ";"; + valvesClose += parent.Valves[j].Cfg.Name; + } + k++; + } + } + entity.ValvesOpen = valvesOpen; + entity.ValvesClose = valvesClose; + } + + public void AddOne() + { + Config.Entities.BenchPath entity; + + if (MyItems.Count < FixedRowsCount) + { + entity = new Config.Entities.BenchPath(Strings._none_, MyItems.Count); + } + else + { + /// Find an unused test name + string newName; + for (int nameId = 1; true; nameId++) + { + newName = Strings.New_bench_path_name + nameId.ToString(); + bool notUsed = true; + foreach (var t in MyItems) if (t.Name.Equals(newName)) notUsed = false; + if (notUsed) break; + } + entity = new Config.Entities.BenchPath(newName, MyItems.Count); + } + + base.AddOne(entity); + } + + public new void RemoveSelected() + { + bool lastOneRemoved = base.RemoveSelected(); + if (lastOneRemoved && parent != null) + { + parent.UpdateButtonStates(SharedButtons.SelectedItemPos.None); + } + } + + public string GetWarningsBeforeSaving(ref Dictionary renmInfo) + { + base.OkBtnClicked(); /// = UpdateAll() + + string warnings = string.Empty; + + foreach (var entity in ToBeRemovedItems) + { + if (!string.IsNullOrEmpty(entity.OriName)) + { + int occurances = 0; + foreach (var tst in parent.Tests) if (!string.IsNullOrEmpty(tst.BenchPath) && tst.BenchPath.Equals(entity.OriName)) occurances++; + + if (occurances > 0) + { + warnings += string.Format(Strings._0_path_1_used_by_2_tests_will_be_removed_3, Strings.BenchTabPageTitle, entity.Name, occurances, Environment.NewLine); + renmInfo.Add(entity.OriName, string.Empty); + } + } + } + + foreach (var entity in MyItems) + { + if (!string.IsNullOrEmpty(entity.OriName) && entity.OriName != entity.Name) + { + int occurances = 0; + foreach (var tst in parent.Tests) if (!string.IsNullOrEmpty(tst.BenchPath) && tst.BenchPath.Equals(entity.OriName)) occurances++; + + if (occurances > 0) + { + warnings += string.Format(Strings._0_path_1_used_by_2_tests_will_be_renamed_to_3_4, Strings.BenchTabPageTitle, entity.OriName, occurances, entity.Name, Environment.NewLine); + renmInfo.Add(entity.OriName, entity.Name); + } + } + } + + return warnings; + } + + public void UpdateRelatedItems(Dictionary renameInfo) + { + foreach (var ri in renameInfo) + { + var tests = parent.Session.QueryOver() + .Where(x => x.BenchPath == ri.Key) + .List(); + + foreach (var t in tests) + { + t.BenchPath = ri.Value; + parent.Session.Update(t); + } + } + } + + /// + /// Update the entities and save them to the database + /// + public new void OkBtnClicked() + { + base.OkBtnClicked(); + + /// Update the database + foreach (var entity in ToBeRemovedItems) + { + parent.Session.Delete(entity); + } + foreach (var entity in MyItems) + { + parent.Session.SaveOrUpdate(entity); + } + + /// Update the column widths + Program.LocalSettings.BenchColumnWidths = new int[Columns.Count]; + for (int i = 0; i < Columns.Count; i++) + { + Program.LocalSettings.BenchColumnWidths[i] = Columns[i].Width; + } + Program.LocalSettings.Save(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/PathsFeedingCtrl.cs b/TBF_V2/Sources/TBF/TBF/UiControls/PathsFeedingCtrl.cs new file mode 100644 index 00000000..ec288966 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/PathsFeedingCtrl.cs @@ -0,0 +1,402 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Globalization; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.BenchControl.GenericDevices; +using TBF.Resources; + +namespace TBF.UiControls +{ + public class PathsFeedingCtrl : BaseWithListViewEx, ITabWithListViewEx + { + static readonly ILog log = LogManager.GetLogger(typeof(PathsFeedingCtrl)); + + /// + /// Fixed ListViewEx columns + /// + enum Column + { + Name, + Qfrom, + Qto, + Pump, + FixedColumnsCount, + } + readonly int fixedColumnsCount = (int)Column.FixedColumnsCount; + int regvCount; + int valvesCount; + + PathsDlg parent; + Control parentControl; + Control[] editors; + + public PathsFeedingCtrl() + : base() + { + FixedRowsCount = 1; + } + + public void Initialize(PathsDlg parent, Control parentControl) + { + this.parent = parent; + this.parentControl = parentControl; + + /// Load the paths + MyItems = parent.Session.QueryOver() + .OrderBy(x => x.ItemNr).Asc + .List(); + + foreach (var path in MyItems) path.OriName = path.Name; + + SubItemClicked += new Results.Forms.SubItemEventHandler(listViewEx_SubItemClicked); + SubItemRightClicked += new Results.Forms.SubItemEventHandler(listViewEx_SubItemRightClicked); + SubItemEndEditing += new Results.Forms.SubItemEndEditingEventHandler(listViewEx_SubItemEndEditing); + + /// ListViewEx columns + TBF.LocalSettings ls = Program.LocalSettings; + Columns.Add(Strings.Name, (ls.FeedingColumnCount > 0) ? ls.FeedingColumnWidths[0] : 60 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(Strings.Q_from_m3h, (ls.FeedingColumnCount > 1) ? ls.FeedingColumnWidths[1] : 50 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(Strings.Q_to_m3h, (ls.FeedingColumnCount > 2) ? ls.FeedingColumnWidths[2] : 50 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(Strings.Pump, (ls.FeedingColumnCount > 3) ? ls.FeedingColumnWidths[3] : 60 * parent.Dpi / PathsDlg.Dpi100pct); + int clmn = (int)Column.FixedColumnsCount; + + foreach (var rv in parent.FeedingRegulValves) + { + Columns.Add(rv.Cfg.Name, (ls.FeedingColumnCount > clmn) ? ls.FeedingColumnWidths[clmn] : 50 * parent.Dpi / PathsDlg.Dpi100pct); + clmn++; + } + regvCount = clmn - (int)Column.FixedColumnsCount; + + foreach (var vlv in parent.Valves) + { + if (vlv.Category == TBF.BenchControl.ValveCategory.All || vlv.Category == TBF.BenchControl.ValveCategory.Feeding) + { + Columns.Add(vlv.Cfg.Name, (ls.FeedingColumnCount > clmn) ? ls.FeedingColumnWidths[clmn] : 50 * parent.Dpi / PathsDlg.Dpi100pct); + clmn++; + } + } + valvesCount = clmn - (int)Column.FixedColumnsCount - regvCount; + + /// Pump + ComboBox pumpCBox = new ComboBox(); + pumpCBox.Items.Add("---"); + foreach (var cmpnt in parent.TbfComponents) + { + if (cmpnt is IPump) pumpCBox.Items.Add(cmpnt.Cfg.Name); + } + + editors = new Control[fixedColumnsCount + regvCount + 64]; + /// + editors[(int)Column.Name] = new TextBox(); /// Name + editors[(int)Column.Qfrom] = new TextBox(); /// Q_from + editors[(int)Column.Qto] = new TextBox(); /// Q_to + editors[(int)Column.Pump] = pumpCBox; + for (int i = 0; i < regvCount; i++) + { + ComboBox cb = new ComboBox(); + cb.Items.Add("---"); + cb.Items.Add("0"); + cb.Items.Add("25"); + cb.Items.Add("50"); + cb.Items.Add("75"); + cb.Items.Add("100"); + editors[fixedColumnsCount + i] = cb; + } + + /// Prepare valve combo-boxes (max. 64 valves) + for (int i = 0; i < 64; i++) + { + ComboBox cb = new ComboBox(); + cb.Items.Add("---"); + cb.Items.Add(Strings.open); + cb.Items.Add(Strings.close); + editors[fixedColumnsCount + regvCount + i] = cb; + } + /// + for (int i = 0; i < editors.Length; i++) + { + editors[i].Visible = false; + parent.Controls.Add(editors[i]); + } + + base.RedrawAll(); + } + + void listViewEx_SubItemClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (!Unlocked || e.SubItem >= editors.Length) return; + if ((e.Item.Tag is IHasItemNr) && + ((e.Item.Tag as IHasItemNr).ItemNr < FixedRowsCount) && + (e.SubItem < fixedColumnsCount)) + { + return; + } + StartEditing(editors[e.SubItem], e.Item, e.SubItem); + } + + void listViewEx_SubItemRightClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (!Unlocked || e.SubItem >= editors.Length) return; + + if (DialogResult.Yes == MessageBox.Show(Strings.Do_you_want_to_copy_this_value_to_all_cells_below_this_cell, + Strings.Confirmation, MessageBoxButtons.YesNo, MessageBoxIcon.Question)) + { + int columnNr = e.SubItem; + string value = null; + Color backColor = Color.White; + foreach (ListViewItem item in Items) + { + if (value != null && item.SubItems.Count > columnNr) + { + item.SubItems[columnNr].Text = value; + item.SubItems[columnNr].BackColor = backColor; + } + else if (item == e.Item) + { + value = item.SubItems[columnNr].Text; + backColor = item.SubItems[columnNr].BackColor; + } + } + } + } + + void listViewEx_SubItemEndEditing(object sender, Results.Forms.SubItemEndEditingEventArgs e) + { + if (e.SubItem >= fixedColumnsCount + regvCount) + { + e.Item.SubItems[e.SubItem].BackColor = (e.DisplayText == Strings.open) ? Color.LightGray : Color.White; + } + } + + public override void DrawOne(object myItem) + { + Config.Entities.FeedingPath entity = (Config.Entities.FeedingPath)myItem; + BenchControl.FeedingPath path = new BenchControl.FeedingPath(entity, parent.TbfComponents); + + ListViewItem lvi = new ListViewItem(entity.Name); + lvi.UseItemStyleForSubItems = false; + + lvi.SubItems.Add(path.Qfrom.ToString()); + lvi.SubItems.Add(path.Qto.ToString()); + lvi.SubItems.Add(path.Pump != null ? path.Pump.Cfg.Name : "---"); + + string[] rvPosStr = (entity.RegulValvesPct != null) ? entity.RegulValvesPct.Split(new char[] {';'}) + : new string[0]; + for (int i = 0; i < regvCount; i++) + { + lvi.SubItems.Add((i < rvPosStr.Length) ? rvPosStr[i] : "---"); + } + + foreach (var valve in parent.Valves) + { + if (valve.Category == TBF.BenchControl.ValveCategory.All || valve.Category == TBF.BenchControl.ValveCategory.Feeding) + { + if (path.ValvesOpen != null && path.ValvesOpen.Contains(valve)) + { + lvi.SubItems.Add(Strings.open); + lvi.SubItems[lvi.SubItems.Count - 1].BackColor = Color.LightGray; + } + else if (path.ValvesClose != null && path.ValvesClose.Contains(valve)) + { + lvi.SubItems.Add(Strings.close); + lvi.SubItems[lvi.SubItems.Count - 1].BackColor = Color.White; + } + else + { + lvi.SubItems.Add("---"); + lvi.SubItems[lvi.SubItems.Count - 1].BackColor = Color.White; + } + } + } + + lvi.Tag = entity; + + Items.Add(lvi); + } + + public override void UpdateOne(ListViewItem lvi, object myItem) + { + Config.Entities.FeedingPath entity = (Config.Entities.FeedingPath)myItem; + + entity.Name = lvi.Text; + + float Qfrom; + bool allOk = Utils.TryParseUFloat(lvi.SubItems[(int)Column.Qfrom].Text, out Qfrom); + entity.Qfrom = Qfrom; + + float Qto; + allOk &= Utils.TryParseUFloat(lvi.SubItems[(int)Column.Qto].Text, out Qto); + entity.Qto = Qto; + + ComboBox pumpCB = editors[(int)Column.Pump] as ComboBox; + if (pumpCB.Items.Contains(lvi.SubItems[(int)Column.Pump].Text)) + { + entity.Pump = lvi.SubItems[(int)Column.Pump].Text.Equals("---") ? string.Empty : lvi.SubItems[(int)Column.Pump].Text; + } + + /// + /// Regulation valves + /// + string regulValvesPct = string.Empty; + for (int i = fixedColumnsCount; i < fixedColumnsCount + regvCount; i++) + { + if (regulValvesPct.Length > 0) regulValvesPct += ";"; + float fdummy; + if (lvi.SubItems[i].Text.Equals("---") || + (Utils.TryParseUFloat(lvi.SubItems[i].Text, out fdummy) && (fdummy >= 0) && (fdummy <= 100.0f))) + { + regulValvesPct += lvi.SubItems[i].Text; + } + } + entity.RegulValvesPct = regulValvesPct; + + /// + /// Valves + /// + string valvesOpen = string.Empty; + string valvesClose = string.Empty; + int k = 0; + for (int j = 0; j < parent.Valves.Count; j++) + { + if (parent.Valves[j].Category == TBF.BenchControl.ValveCategory.All || parent.Valves[j].Category == TBF.BenchControl.ValveCategory.Feeding) + { + string text = lvi.SubItems[fixedColumnsCount + regvCount + k].Text; + if (text.Equals(Strings.open)) + { + if (valvesOpen != string.Empty) valvesOpen += ";"; + valvesOpen += parent.Valves[j].Cfg.Name; + } + if (text.Equals(Strings.close)) + { + if (valvesClose != string.Empty) valvesClose += ";"; + valvesClose += parent.Valves[j].Cfg.Name; + } + k++; + } + } + entity.ValvesOpen = valvesOpen; + entity.ValvesClose = valvesClose; + } + + public void AddOne() + { + Config.Entities.FeedingPath entity; + + if (MyItems.Count < FixedRowsCount) + { + entity = new Config.Entities.FeedingPath(Strings._none_, MyItems.Count); + } + else + { + /// Find an unused test name + string newName; + for (int nameId = 1; true; nameId++) + { + newName = Strings.New_feeding_path_name + nameId.ToString(); + bool notUsed = true; + foreach (var t in MyItems) if (t.Name.Equals(newName)) notUsed = false; + if (notUsed) break; + } + entity = new Config.Entities.FeedingPath(newName, MyItems.Count); + } + + base.AddOne(entity); + } + + public new void RemoveSelected() + { + bool lastOneRemoved = base.RemoveSelected(); + if (lastOneRemoved && parent != null) + { + parent.UpdateButtonStates(SharedButtons.SelectedItemPos.None); + } + } + + public string GetWarningsBeforeSaving(ref Dictionary renmInfo) + { + base.OkBtnClicked(); /// = UpdateAll() + + string warnings = string.Empty; + + foreach (var entity in ToBeRemovedItems) + { + if (!string.IsNullOrEmpty(entity.OriName)) + { + int occurances = 0; + foreach (var tst in parent.Tests) if (!string.IsNullOrEmpty(tst.FeedingPath) && tst.FeedingPath.Equals(entity.OriName)) occurances++; + + if (occurances > 0) + { + warnings += string.Format(Strings._0_path_1_used_by_2_tests_will_be_removed_3, Strings.FeedingTabPageTitle, entity.Name, occurances, Environment.NewLine); + renmInfo.Add(entity.OriName, string.Empty); + } + } + } + + foreach (var entity in MyItems) + { + if (!string.IsNullOrEmpty(entity.OriName) && entity.OriName != entity.Name) + { + int occurances = 0; + foreach (var tst in parent.Tests) if (!string.IsNullOrEmpty(tst.FeedingPath) && tst.FeedingPath.Equals(entity.OriName)) occurances++; + + if (occurances > 0) + { + warnings += string.Format(Strings._0_path_1_used_by_2_tests_will_be_renamed_to_3_4, Strings.FeedingTabPageTitle, entity.OriName, occurances, entity.Name, Environment.NewLine); + renmInfo.Add(entity.OriName, entity.Name); + } + } + } + + return warnings; + } + + public void UpdateRelatedItems(Dictionary renameInfo) + { + foreach (var ri in renameInfo) + { + var tests = parent.Session.QueryOver() + .Where(x => x.FeedingPath == ri.Key) + .List(); + + foreach (var t in tests) + { + t.FeedingPath = ri.Value; + parent.Session.Update(t); + } + } + } + + /// + /// Update the entities and save them to the database + /// + public new void OkBtnClicked() + { + base.OkBtnClicked(); + + /// Update the database + foreach (var entity in ToBeRemovedItems) + { + parent.Session.Delete(entity); + } + foreach (var entity in MyItems) + { + parent.Session.SaveOrUpdate(entity); + } + + /// Update the column widths + Program.LocalSettings.FeedingColumnWidths = new int[Columns.Count]; + for (int i = 0; i < Columns.Count; i++) + { + Program.LocalSettings.FeedingColumnWidths[i] = Columns[i].Width; + } + Program.LocalSettings.Save(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/PathsHeatMetersCtrl.cs b/TBF_V2/Sources/TBF/TBF/UiControls/PathsHeatMetersCtrl.cs new file mode 100644 index 00000000..4f3c3ba0 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/PathsHeatMetersCtrl.cs @@ -0,0 +1,338 @@ +/// +/// Copyright (c) 2016-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Windows.Forms; +using log4net; +using TBF.BenchControl; +using TBF.BenchControl.GenericDevices; +using TBF.Resources; + +namespace TBF.UiControls +{ + public class PathsHeatMetersCtrl : BaseWithListViewEx, ITabWithListViewEx + { + static readonly ILog log = LogManager.GetLogger(typeof(PathsHeatMetersCtrl)); + + /// + /// Fixed ListViewEx columns + /// + enum Column + { + Name, + TWarmFrom, + TWarmTo, + TColdFrom, + TColdTo, + TMRefW1, + TMRefW2, + TMRefC1, + TMRefC2, + TMWrkW1, + TMWrkW2, + TMWrkC1, + TMWrkC2, + FixedColumnsCount, + } + readonly int fixedColumnsCount = (int)Column.FixedColumnsCount; + + PathsDlg parent; + Control parentControl; + Control[] editors; + + public PathsHeatMetersCtrl() + : base() + { + } + + public void Initialize(PathsDlg parent, Control parentControl) + { + this.parent = parent; + this.parentControl = parentControl; + +#if HEAT_METERS + /// Load the paths + MyItems = parent.Session.QueryOver() + .OrderBy(x => x.ItemNr).Asc + .List(); + + foreach (var path in MyItems) path.OriName = path.Name; + + SubItemClicked += new Results.Forms.SubItemEventHandler(listViewEx_SubItemClicked); + SubItemRightClicked += new Results.Forms.SubItemEventHandler(listViewEx_SubItemRightClicked); + SubItemEndEditing += new Results.Forms.SubItemEndEditingEventHandler(listViewEx_SubItemEndEditing); + + IList tempMeters = new List(); + foreach (var cmpnt in parent.TbfComponents) + { + if (cmpnt is ITempMeter) tempMeters.Add(cmpnt as ITempMeter); + } + + /// ListViewEx columns + TBF.LocalSettings ls = Program.LocalSettings; + Columns.Add(Strings.Name, (ls.HeatMetersColumnCount > 0) ? ls.HeatMetersColumnWidths[0] : 60 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(Strings.T_warm_from, (ls.HeatMetersColumnCount > 1) ? ls.HeatMetersColumnWidths[1] : 50 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(Strings.T_warm_to, (ls.HeatMetersColumnCount > 2) ? ls.HeatMetersColumnWidths[2] : 50 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(Strings.T_cold_from, (ls.HeatMetersColumnCount > 3) ? ls.HeatMetersColumnWidths[3] : 50 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(Strings.T_cold_to, (ls.HeatMetersColumnCount > 4) ? ls.HeatMetersColumnWidths[4] : 50 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(string.Format("{0} {1}", Strings.T_ref_warm, 1), (ls.HeatMetersColumnCount > 5) ? ls.HeatMetersColumnWidths[5] : 50 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(string.Format("{0} {1}", Strings.T_ref_warm, 2), (ls.HeatMetersColumnCount > 6) ? ls.HeatMetersColumnWidths[6] : 50 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(string.Format("{0} {1}", Strings.T_ref_cold, 1), (ls.HeatMetersColumnCount > 7) ? ls.HeatMetersColumnWidths[7] : 50 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(string.Format("{0} {1}", Strings.T_ref_cold, 2), (ls.HeatMetersColumnCount > 8) ? ls.HeatMetersColumnWidths[8] : 50 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(string.Format("{0} {1}", Strings.T_work_warm, 1), (ls.HeatMetersColumnCount > 9) ? ls.HeatMetersColumnWidths[9] : 50 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(string.Format("{0} {1}", Strings.T_work_warm, 2), (ls.HeatMetersColumnCount > 10) ? ls.HeatMetersColumnWidths[10] : 50 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(string.Format("{0} {1}", Strings.T_work_cold, 1), (ls.HeatMetersColumnCount > 11) ? ls.HeatMetersColumnWidths[11] : 50 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(string.Format("{0} {1}", Strings.T_work_cold, 2), (ls.HeatMetersColumnCount > 12) ? ls.HeatMetersColumnWidths[12] : 50 * parent.Dpi / PathsDlg.Dpi100pct); + + /// Temperatures, pressures + ComboBox tWarmCBox = new ComboBox(); + ComboBox tColdCBox = new ComboBox(); + foreach (var cmpnt in parent.TbfComponents) + { + if (cmpnt is BenchControl.GenericDevices.ITempMeter) + { + tWarmCBox.Items.Add(cmpnt.Cfg.Name); + tColdCBox.Items.Add(cmpnt.Cfg.Name); + } + } + + editors = new Control[fixedColumnsCount]; + /// + for (int i = 0; i < (int)Column.TMRefW1; i++) + { + editors[i] = new TextBox(); /// Name + editors[i].Visible = false; + parent.Controls.Add(editors[i]); + } + for (int i = (int)Column.TMRefW1; i < editors.Length; i++) + { + editors[i] = new ComboBox(); + (editors[i] as ComboBox).Items.Add("---"); + foreach (var t in tempMeters) (editors[i] as ComboBox).Items.Add(t.Name); + editors[i].Visible = false; + parent.Controls.Add(editors[i]); + } + + base.RedrawAll(); +#endif + } + + void listViewEx_SubItemClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (!Unlocked || e.SubItem >= editors.Length) return; + if ((e.Item.Tag is Config.Entities.IHasItemNr) && + ((e.Item.Tag as Config.Entities.IHasItemNr).ItemNr < FixedRowsCount) && + (e.SubItem < fixedColumnsCount)) + { + return; + } + StartEditing(editors[e.SubItem], e.Item, e.SubItem); + } + + void listViewEx_SubItemRightClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (!Unlocked || e.SubItem >= editors.Length) return; + + if (DialogResult.Yes == MessageBox.Show(Strings.Do_you_want_to_copy_this_value_to_all_cells_below_this_cell, + Strings.Confirmation, MessageBoxButtons.YesNo, MessageBoxIcon.Question)) + { + int columnNr = e.SubItem; + string value = null; + System.Drawing.Color backColor = System.Drawing.Color.White; + foreach (ListViewItem item in Items) + { + if (value != null && item.SubItems.Count > columnNr) + { + item.SubItems[columnNr].Text = value; + item.SubItems[columnNr].BackColor = backColor; + } + else if (item == e.Item) + { + value = item.SubItems[columnNr].Text; + backColor = item.SubItems[columnNr].BackColor; + } + } + } + } + + void listViewEx_SubItemEndEditing(object sender, Results.Forms.SubItemEndEditingEventArgs e) + { + if (e.SubItem >= (int)Column.TWarmFrom && e.SubItem <= (int)Column.TColdTo) + { + try + { + Utils.ParseUFloat(e.DisplayText); + } + catch + { + /// NOK -> revert + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + } + } + } + + public override void DrawOne(object myItem) + { + Config.Entities.HeatMetersPath entity = (Config.Entities.HeatMetersPath)myItem; + BenchControl.HeatMetersPath path = new BenchControl.HeatMetersPath(entity, parent.TbfComponents); + + ListViewItem lvi = new ListViewItem(entity.Name); + + lvi.SubItems.Add(path.TempWarmFrom.ToString()); + lvi.SubItems.Add(path.TempWarmTo.ToString()); + lvi.SubItems.Add(path.TempColdFrom.ToString()); + lvi.SubItems.Add(path.TempColdTo.ToString()); + + lvi.SubItems.Add(path.TMeterRefWarm1 != null ? path.TMeterRefWarm1.Cfg.Name : "---"); + lvi.SubItems.Add(path.TMeterRefWarm2 != null ? path.TMeterRefWarm2.Cfg.Name : "---"); + lvi.SubItems.Add(path.TMeterRefCold1 != null ? path.TMeterRefCold1.Cfg.Name : "---"); + lvi.SubItems.Add(path.TMeterRefCold2 != null ? path.TMeterRefCold2.Cfg.Name : "---"); + + lvi.SubItems.Add(path.TMeterWorkWarm1 != null ? path.TMeterWorkWarm1.Cfg.Name : "---"); + lvi.SubItems.Add(path.TMeterWorkWarm2 != null ? path.TMeterWorkWarm2.Cfg.Name : "---"); + lvi.SubItems.Add(path.TMeterWorkCold1 != null ? path.TMeterWorkCold1.Cfg.Name : "---"); + lvi.SubItems.Add(path.TMeterWorkCold2 != null ? path.TMeterWorkCold2.Cfg.Name : "---"); + + lvi.Tag = entity; + + Items.Add(lvi); + } + + public override void UpdateOne(ListViewItem lvi, object myItem) + { + Config.Entities.HeatMetersPath entity = (Config.Entities.HeatMetersPath)myItem; + + entity.Name = lvi.Text; + + entity.TempWarmFrom = Utils.ParseUFloat(lvi.SubItems[(int)Column.TWarmFrom].Text); + entity.TempWarmTo = Utils.ParseUFloat(lvi.SubItems[(int)Column.TWarmTo].Text); + entity.TempColdFrom = Utils.ParseUFloat(lvi.SubItems[(int)Column.TColdFrom].Text); + entity.TempColdTo = Utils.ParseUFloat(lvi.SubItems[(int)Column.TColdTo].Text); + + entity.TMeterRefWarm1 = lvi.SubItems[(int)Column.TMRefW1].Text == "---" ? null : lvi.SubItems[(int)Column.TMRefW1].Text; + entity.TMeterRefWarm2 = lvi.SubItems[(int)Column.TMRefW2].Text == "---" ? null : lvi.SubItems[(int)Column.TMRefW2].Text; + entity.TMeterRefCold1 = lvi.SubItems[(int)Column.TMRefC1].Text == "---" ? null : lvi.SubItems[(int)Column.TMRefC1].Text; + entity.TMeterRefCold2 = lvi.SubItems[(int)Column.TMRefC2].Text == "---" ? null : lvi.SubItems[(int)Column.TMRefC2].Text; + + entity.TMeterWorkWarm1 = lvi.SubItems[(int)Column.TMWrkW1].Text == "---" ? null : lvi.SubItems[(int)Column.TMWrkW1].Text; + entity.TMeterWorkWarm2 = lvi.SubItems[(int)Column.TMWrkW2].Text == "---" ? null : lvi.SubItems[(int)Column.TMWrkW2].Text; + entity.TMeterWorkCold1 = lvi.SubItems[(int)Column.TMWrkC1].Text == "---" ? null : lvi.SubItems[(int)Column.TMWrkC1].Text; + entity.TMeterWorkCold2 = lvi.SubItems[(int)Column.TMWrkC2].Text == "---" ? null : lvi.SubItems[(int)Column.TMWrkC2].Text; + } + + public void AddOne() + { + /// Find an unused test name + string newName; + for (int nameId = 1; true; nameId++) + { + newName = Strings.New_heat_meters_path_name + nameId.ToString(); + bool notUsed = true; + foreach (var t in MyItems) if (t.Name.Equals(newName)) notUsed = false; + if (notUsed) break; + } + + Config.Entities.HeatMetersPath entity = new Config.Entities.HeatMetersPath(newName, MyItems.Count); + + base.AddOne(entity); + } + + public new void RemoveSelected() + { + bool lastOneRemoved = base.RemoveSelected(); + if (lastOneRemoved && parent != null) + { + parent.UpdateButtonStates(SharedButtons.SelectedItemPos.None); + } + } + + public string GetWarningsBeforeSaving(ref Dictionary renmInfo) + { + base.OkBtnClicked(); /// = UpdateAll() + + string warnings = string.Empty; + +#if HEAT_METERS + foreach (var entity in ToBeRemovedItems) + { + if (!string.IsNullOrEmpty(entity.OriName)) + { + int occurances = 0; + foreach (var tst in parent.Tests) if (!string.IsNullOrEmpty(tst.HeatMetersPath) && tst.HeatMetersPath.Equals(entity.OriName)) occurances++; + + if (occurances > 0) + { + warnings += string.Format(Strings._0_path_1_used_by_2_tests_will_be_removed_3, Strings.Heat_meter_sensors, entity.Name, occurances, Environment.NewLine); + renmInfo.Add(entity.OriName, string.Empty); + } + } + } + + foreach (var entity in MyItems) + { + if (!string.IsNullOrEmpty(entity.OriName) && entity.OriName != entity.Name) + { + int occurances = 0; + foreach (var tst in parent.Tests) if (!string.IsNullOrEmpty(tst.HeatMetersPath) && tst.HeatMetersPath.Equals(entity.OriName)) occurances++; + + if (occurances > 0) + { + warnings += string.Format(Strings._0_path_1_used_by_2_tests_will_be_renamed_to_3_4, Strings.Heat_meter_sensors, entity.OriName, occurances, entity.Name, Environment.NewLine); + renmInfo.Add(entity.OriName, entity.Name); + } + } + } +#endif + return warnings; + } + + public void UpdateRelatedItems(Dictionary renameInfo) + { +#if HEAT_METERS + foreach (var ri in renameInfo) + { + var tests = parent.Session.QueryOver() + .Where(x => x.HeatMetersPath == ri.Key) + .List(); + + foreach (var t in tests) + { + t.HeatMetersPath = ri.Value; + parent.Session.Update(t); + } + } +#endif + } + + /// + /// Update the entities and save them to the database + /// + public new void OkBtnClicked() + { + base.OkBtnClicked(); + +#if HEAT_METERS + /// Update the database + foreach (var entity in ToBeRemovedItems) + { + parent.Session.Delete(entity); + } + foreach (var entity in MyItems) + { + parent.Session.SaveOrUpdate(entity); + } + + /// Update the column widths + Program.LocalSettings.HeatMetersColumnWidths = new int[Columns.Count]; + for (int i = 0; i < Columns.Count; i++) + { + Program.LocalSettings.HeatMetersColumnWidths[i] = Columns[i].Width; + } + Program.LocalSettings.Save(); +#endif + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/PathsMetersCtrl.cs b/TBF_V2/Sources/TBF/TBF/UiControls/PathsMetersCtrl.cs new file mode 100644 index 00000000..0ce02b40 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/PathsMetersCtrl.cs @@ -0,0 +1,270 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Windows.Forms; +using log4net; +using TBF.BenchControl; +using TBF.BenchControl.GenericDevices; +using TBF.Resources; + +namespace TBF.UiControls +{ + public class PathsMetersCtrl : BaseWithListViewEx, ITabWithListViewEx + { + static readonly ILog log = LogManager.GetLogger(typeof(PathsMetersCtrl)); + + /// + /// Fixed ListViewEx columns + /// + enum Column + { + Name, + FixedColumnsCount, + } + readonly int fixedColumnsCount = (int)Column.FixedColumnsCount; + + PathsDlg parent; + Control parentControl; + Control[] editors; + + public PathsMetersCtrl() + : base() + { + } + + public void Initialize(PathsDlg parent, Control parentControl) + { + this.parent = parent; + this.parentControl = parentControl; + + /// Load the paths + MyItems = parent.Session.QueryOver() + .OrderBy(x => x.ItemNr).Asc + .List(); + + foreach (var path in MyItems) path.OriName = path.Name; + + SubItemClicked += new Results.Forms.SubItemEventHandler(listViewEx_SubItemClicked); + SubItemRightClicked += new Results.Forms.SubItemEventHandler(listViewEx_SubItemRightClicked); + SubItemEndEditing += new Results.Forms.SubItemEndEditingEventHandler(listViewEx_SubItemEndEditing); + + IList readers = new List(); + foreach (var cmpnt in parent.TbfComponents) + { + if (cmpnt is IRegisterReader) readers.Add(cmpnt as IRegisterReader); + } + + /// ListViewEx columns + TBF.LocalSettings ls = Program.LocalSettings; + Columns.Add(Strings.Name, (ls.MetersColumnCount > 0) ? ls.MetersColumnWidths[0] : 60 * parent.Dpi / PathsDlg.Dpi100pct); + int clmn = (int)Column.FixedColumnsCount; + for (int i = 0; i < Config.Data.WMsCount; i++) + { + Columns.Add(Strings.Sensor_ + (i + 1).ToString(), (ls.MetersColumnCount > clmn) ? ls.MetersColumnWidths[clmn] : 50 * parent.Dpi / PathsDlg.Dpi100pct); + clmn++; + } + + /// Editors + editors = new Control[fixedColumnsCount + Config.Data.WMsCount]; + /// + editors[(int)Column.Name] = new TextBox(); /// Name + /// Prepare valve combo-boxes (max. 64 valves) + for (int i = 0; i < Config.Data.WMsCount; i++) + { + ComboBox cb = new ComboBox(); + foreach (var rr in readers) cb.Items.Add(rr.Cfg.Name); + editors[fixedColumnsCount + i] = cb; + } + /// + for (int i = 0; i < editors.Length; i++) + { + editors[i].Visible = false; + parent.Controls.Add(editors[i]); + } + + base.RedrawAll(); + } + + void listViewEx_SubItemClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (!Unlocked || e.SubItem >= editors.Length) return; + StartEditing(editors[e.SubItem], e.Item, e.SubItem); + } + + void listViewEx_SubItemRightClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (!Unlocked || e.SubItem >= editors.Length) return; + + if (DialogResult.Yes == MessageBox.Show(Strings.Do_you_want_to_copy_this_value_to_all_cells_below_this_cell, + Strings.Confirmation, MessageBoxButtons.YesNo, MessageBoxIcon.Question)) + { + int columnNr = e.SubItem; + string value = null; + System.Drawing.Color backColor = System.Drawing.Color.White; + foreach (ListViewItem item in Items) + { + if (value != null && item.SubItems.Count > columnNr) + { + item.SubItems[columnNr].Text = value; + item.SubItems[columnNr].BackColor = backColor; + } + else if (item == e.Item) + { + value = item.SubItems[columnNr].Text; + backColor = item.SubItems[columnNr].BackColor; + } + } + } + } + + void listViewEx_SubItemEndEditing(object sender, Results.Forms.SubItemEndEditingEventArgs e) + { + } + + public override void DrawOne(object myItem) + { + Config.Entities.MetersPath entity =(Config.Entities.MetersPath)myItem; + BenchControl.MetersPath path = new BenchControl.MetersPath(entity, parent.TbfComponents); + + ListViewItem lvi = new ListViewItem(entity.Name); + + for (int i = 0; i < Config.Data.WMsCount; i++) + { + if (path.RegisterReaders != null && path.RegisterReaders[i] != null) + { + lvi.SubItems.Add(path.RegisterReaders[i].Cfg.Name); + } + else + { + lvi.SubItems.Add("---"); + } + } + + lvi.Tag = entity; + + Items.Add(lvi); + } + + public override void UpdateOne(ListViewItem lvi, object myItem) + { + Config.Entities.MetersPath entity = (Config.Entities.MetersPath)myItem; + + entity.Name = lvi.Text; + + for (int j = 0; j < Config.Data.WMsCount; j++) + { + entity.SetSensor(j, lvi.SubItems[fixedColumnsCount + j].Text); + } + } + + public void AddOne() + { + /// Find an unused test name + string newName; + for (int nameId = 1; true; nameId++) + { + newName = Strings.New_sensors_path_name + nameId.ToString(); + bool notUsed = true; + foreach (var t in MyItems) if (t.Name.Equals(newName)) notUsed = false; + if (notUsed) break; + } + + Config.Entities.MetersPath entity = new Config.Entities.MetersPath(newName, MyItems.Count); + + base.AddOne(entity); + } + + public new void RemoveSelected() + { + bool lastOneRemoved = base.RemoveSelected(); + if (lastOneRemoved && parent != null) + { + parent.UpdateButtonStates(SharedButtons.SelectedItemPos.None); + } + } + + public string GetWarningsBeforeSaving(ref Dictionary renmInfo) + { + base.OkBtnClicked(); /// = UpdateAll() + + string warnings = string.Empty; + + foreach (var entity in ToBeRemovedItems) + { + if (!string.IsNullOrEmpty(entity.OriName)) + { + int occurances = 0; + foreach (var tst in parent.Tests) if (!string.IsNullOrEmpty(tst.MetersPath) && tst.MetersPath.Equals(entity.OriName)) occurances++; + + if (occurances > 0) + { + warnings += string.Format(Strings._0_path_1_used_by_2_tests_will_be_removed_3, Strings.MetersTabPageTitle, entity.Name, occurances, Environment.NewLine); + renmInfo.Add(entity.OriName, string.Empty); + } + } + } + + foreach (var entity in MyItems) + { + if (!string.IsNullOrEmpty(entity.OriName) && entity.OriName != entity.Name) + { + int occurances = 0; + foreach (var tst in parent.Tests) if (!string.IsNullOrEmpty(tst.MetersPath) && tst.MetersPath.Equals(entity.OriName)) occurances++; + + if (occurances > 0) + { + warnings += string.Format(Strings._0_path_1_used_by_2_tests_will_be_renamed_to_3_4, Strings.MetersTabPageTitle, entity.OriName, occurances, entity.Name, Environment.NewLine); + renmInfo.Add(entity.OriName, entity.Name); + } + } + } + + return warnings; + } + + public void UpdateRelatedItems(Dictionary renameInfo) + { + foreach (var ri in renameInfo) + { + var tests = parent.Session.QueryOver() + .Where(x => x.MetersPath == ri.Key) + .List(); + + foreach (var t in tests) + { + t.MetersPath = ri.Value; + parent.Session.Update(t); + } + } + } + + /// + /// Update the entities and save them to the database + /// + public new void OkBtnClicked() + { + base.OkBtnClicked(); + + /// Update the database + foreach (var entity in ToBeRemovedItems) + { + parent.Session.Delete(entity); + } + foreach (var entity in MyItems) + { + parent.Session.SaveOrUpdate(entity); + } + + /// Update the column widths + Program.LocalSettings.MetersColumnWidths = new int[Columns.Count]; + for (int i = 0; i < Columns.Count; i++) + { + Program.LocalSettings.MetersColumnWidths[i] = Columns[i].Width; + } + Program.LocalSettings.Save(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/PathsOutputCtrl.cs b/TBF_V2/Sources/TBF/TBF/UiControls/PathsOutputCtrl.cs new file mode 100644 index 00000000..b0b0347a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/PathsOutputCtrl.cs @@ -0,0 +1,460 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Drawing; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.BenchControl; +using TBF.BenchControl.GenericDevices; +using TBF.Resources; +using System.Collections.Generic; + +namespace TBF.UiControls +{ + public class PathsOutputCtrl : BaseWithListViewEx, ITabWithListViewEx + { + static readonly ILog log = LogManager.GetLogger(typeof(PathsOutputCtrl)); + + /// + /// Fixed ListViewEx columns + /// + enum Column + { + Name, + Qfrom, + Qto, + RefFlowmtr, + RegulValve, + PidCoef, + Div, + Tdiv, + Scale, + StartValve1, + InvertSV1, + StartValve2, + InvertSV2, + LagSV2, + StartValve3, + InvertSV3, + LagSV3, + FixedColumnsCount, + } + readonly int fixedColumnsCount = (int)Column.FixedColumnsCount; + + PathsDlg parent; + Control parentControl; + Control[] editors; + + public PathsOutputCtrl() + : base() + { + FixedRowsCount = 1; + } + + public void Initialize(PathsDlg parent, Control parentControl) + { + this.parent = parent; + this.parentControl = parentControl; + + /// Load the paths + MyItems = parent.Session.QueryOver() + .OrderBy(x => x.ItemNr).Asc + .List(); + + foreach (var path in MyItems) path.OriName = path.Name; + + SubItemClicked += new Results.Forms.SubItemEventHandler(listViewEx_SubItemClicked); + SubItemRightClicked += new Results.Forms.SubItemEventHandler(listViewEx_SubItemRightClicked); + SubItemEndEditing += new Results.Forms.SubItemEndEditingEventHandler(listViewEx_SubItemEndEditing); + + /// ListViewEx columns + TBF.LocalSettings ls = Program.LocalSettings; + Columns.Add(Strings.Name, (ls.OutputColumnCount > 0) ? ls.OutputColumnWidths[0] : 60 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(Strings.Q_from_m3h, (ls.OutputColumnCount > 1) ? ls.OutputColumnWidths[1] : 50 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(Strings.Q_to_m3h, (ls.OutputColumnCount > 2) ? ls.OutputColumnWidths[2] : 50 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(Strings.Flowmeter, (ls.OutputColumnCount > 3) ? ls.OutputColumnWidths[3] : 85 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(Strings.Reg_valve, (ls.OutputColumnCount > 4) ? ls.OutputColumnWidths[4] : 80 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(Strings.PID, (ls.OutputColumnCount > 5) ? ls.OutputColumnWidths[5] : 50 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(Strings.Diverter, (ls.OutputColumnCount > 6) ? ls.OutputColumnWidths[6] : 60 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(Strings.T_div, (ls.OutputColumnCount > 7) ? ls.OutputColumnWidths[7] : 70 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(Strings.Balance, (ls.OutputColumnCount > 8) ? ls.OutputColumnWidths[8] : 50 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(string.Format("{0} 1", Strings.StartValve), (ls.OutputColumnCount > 9) ? ls.OutputColumnWidths[9] : 80 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(string.Format("Inv. SV1"), (ls.OutputColumnCount > 10) ? ls.OutputColumnWidths[10] : 80 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(string.Format("{0} 2", Strings.StartValve), (ls.OutputColumnCount > 11) ? ls.OutputColumnWidths[11] : 80 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(string.Format("Inv.SV2"), (ls.OutputColumnCount > 12) ? ls.OutputColumnWidths[12] : 80 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(string.Format("Lag SV2"), (ls.OutputColumnCount > 13) ? ls.OutputColumnWidths[13] : 80 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(string.Format("{0} 3", Strings.StartValve), (ls.OutputColumnCount > 14) ? ls.OutputColumnWidths[14] : 80 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(string.Format("Inv.SV3"), (ls.OutputColumnCount > 15) ? ls.OutputColumnWidths[15] : 80 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(string.Format("Lag SV3"), (ls.OutputColumnCount > 16) ? ls.OutputColumnWidths[16] : 80 * parent.Dpi / PathsDlg.Dpi100pct); + int clmn = (int)Column.FixedColumnsCount; + foreach (var vlv in parent.Valves) + { + if (vlv.Category == ValveCategory.All || vlv.Category == ValveCategory.Output) + { + Columns.Add(vlv.Cfg.Name, (ls.OutputColumnCount > clmn) ? ls.OutputColumnWidths[clmn] : 50 * parent.Dpi / PathsDlg.Dpi100pct); + clmn++; + } + } + + /// Prepare fixed columns combo boxes + ComboBox flowMeterComboBox = new ComboBox(); + ComboBox regulValveComboBox = new ComboBox(); + ComboBox diverterComboBox = new ComboBox(); + ComboBox tempMeterDivComboBox = new ComboBox(); + ComboBox scaleComboBox = new ComboBox(); + ComboBox startValve1ComboBox = new ComboBox(); + ComboBox invertSV1ComboBox = new ComboBox(); + ComboBox startValve2ComboBox = new ComboBox(); + ComboBox invertSV2ComboBox = new ComboBox(); + TextBox lagSV2TextBox = new TextBox(); + ComboBox startValve3ComboBox = new ComboBox(); + ComboBox invertSV3ComboBox = new ComboBox(); + TextBox lagSV3TextBox = new TextBox(); + flowMeterComboBox.Items.Add("---"); + regulValveComboBox.Items.Add("---"); + diverterComboBox.Items.Add("---"); + tempMeterDivComboBox.Items.Add("---"); + scaleComboBox.Items.Add("---"); + startValve1ComboBox.Items.Add("---"); + invertSV1ComboBox.Items.Add(Strings.no); + invertSV1ComboBox.Items.Add(Strings.yes); + startValve2ComboBox.Items.Add("---"); + invertSV2ComboBox.Items.Add(Strings.no); + invertSV2ComboBox.Items.Add(Strings.yes); + startValve3ComboBox.Items.Add("---"); + invertSV3ComboBox.Items.Add(Strings.no); + invertSV3ComboBox.Items.Add(Strings.yes); + foreach (var cmpnt in parent.TbfComponents) + { + if (cmpnt is IFlowMeter) flowMeterComboBox.Items.Add(cmpnt.Cfg.Name); + if (cmpnt is IRegulValve) regulValveComboBox.Items.Add(cmpnt.Cfg.Name); + if (cmpnt is IDiverter) diverterComboBox.Items.Add(cmpnt.Cfg.Name); + if (cmpnt is ITempMeter) tempMeterDivComboBox.Items.Add(cmpnt.Cfg.Name); + if (cmpnt is IScale) scaleComboBox.Items.Add(cmpnt.Cfg.Name); + if (cmpnt is IValve && (cmpnt as IValve).CoupledTo == null) + { + startValve1ComboBox.Items.Add(cmpnt.Cfg.Name); + startValve2ComboBox.Items.Add(cmpnt.Cfg.Name); + startValve3ComboBox.Items.Add(cmpnt.Cfg.Name); + } + } + + editors = new Control[fixedColumnsCount + 64]; + /// + editors[(int)Column.Name] = new TextBox(); /// Name + editors[(int)Column.Qfrom] = new TextBox(); /// Q_from + editors[(int)Column.Qto] = new TextBox(); /// Q_to + editors[(int)Column.RefFlowmtr] = flowMeterComboBox; + editors[(int)Column.RegulValve] = regulValveComboBox; + editors[(int)Column.PidCoef] = new TextBox(); /// PID + editors[(int)Column.Div] = diverterComboBox; + editors[(int)Column.Tdiv] = tempMeterDivComboBox; + editors[(int)Column.Scale] = scaleComboBox; + editors[(int)Column.StartValve1] = startValve1ComboBox; + editors[(int)Column.InvertSV1] = invertSV1ComboBox; + editors[(int)Column.StartValve2] = startValve2ComboBox; + editors[(int)Column.InvertSV2] = invertSV2ComboBox; + editors[(int)Column.LagSV2] = lagSV2TextBox; + editors[(int)Column.StartValve3] = startValve3ComboBox; + editors[(int)Column.InvertSV3] = invertSV3ComboBox; + editors[(int)Column.LagSV3] = lagSV3TextBox; + /// Prepare valve combo-boxes (max. 64 valves) + for (int i = 0; i < 64; i++) + { + ComboBox cb = new ComboBox(); + cb.Items.Add("---"); + cb.Items.Add(Strings.open); + cb.Items.Add(Strings.close); + editors[fixedColumnsCount + i] = cb; + } + /// + for (int i = 0; i < editors.Length; i++) + { + editors[i].Visible = false; + parent.Controls.Add(editors[i]); + } + + base.RedrawAll(); + } + + void listViewEx_SubItemClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (!Unlocked || e.SubItem >= editors.Length) return; + if ((e.Item.Tag is IHasItemNr) && + ((e.Item.Tag as IHasItemNr).ItemNr < FixedRowsCount) && + (e.SubItem < fixedColumnsCount)) + { + return; + } + StartEditing(editors[e.SubItem], e.Item, e.SubItem); + } + + void listViewEx_SubItemRightClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (!Unlocked || e.SubItem >= editors.Length) return; + + if (DialogResult.Yes == MessageBox.Show(Strings.Do_you_want_to_copy_this_value_to_all_cells_below_this_cell, + Strings.Confirmation, MessageBoxButtons.YesNo, MessageBoxIcon.Question)) + { + int columnNr = e.SubItem; + string value = null; + System.Drawing.Color backColor = System.Drawing.Color.White; + foreach (ListViewItem item in Items) + { + if (value != null && item.SubItems.Count > columnNr) + { + item.SubItems[columnNr].Text = value; + item.SubItems[columnNr].BackColor = backColor; + } + else if (item == e.Item) + { + value = item.SubItems[columnNr].Text; + backColor = item.SubItems[columnNr].BackColor; + } + } + } + } + + void listViewEx_SubItemEndEditing(object sender, Results.Forms.SubItemEndEditingEventArgs e) + { + if (e.SubItem >= fixedColumnsCount) + { + e.Item.SubItems[e.SubItem].BackColor = e.DisplayText == Strings.open ? Color.LightGray : Color.White; + } + } + + public override void DrawOne(object myItem) + { + Config.Entities.OutputPath entity =(Config.Entities.OutputPath)myItem; + BenchControl.OutputPath path = new BenchControl.OutputPath(entity, parent.TbfComponents); + + ListViewItem lvi = new ListViewItem(entity.Name); + lvi.UseItemStyleForSubItems = false; + + lvi.SubItems.Add(path.Qfrom.ToString()); + lvi.SubItems.Add(path.Qto.ToString()); + lvi.SubItems.Add((path.FlowMeter != null) ? path.FlowMeter.Cfg.Name : "---"); + lvi.SubItems.Add((path.RegulValve != null) ? path.RegulValve.Cfg.Name : "---"); + lvi.SubItems.Add(path.PidCoef.ToString("F1")); + lvi.SubItems.Add((path.Diverter != null) ? path.Diverter.Cfg.Name : "---"); + lvi.SubItems.Add((path.TempDiv != null) ? path.TempDiv.Cfg.Name : "---"); + lvi.SubItems.Add((path.Scale != null) ? path.Scale.Cfg.Name : "---"); + + + lvi.SubItems.Add((path.StartValve1 != null) ? path.StartValve1.Cfg.Name : "---"); + lvi.SubItems.Add(path.InvertSV1 ? Strings.yes : Strings.no); + lvi.SubItems.Add((path.StartValve2 != null) ? path.StartValve2.Cfg.Name : "---"); + lvi.SubItems.Add(path.InvertSV2 ? Strings.yes : Strings.no); + lvi.SubItems.Add(path.LagSV2.ToString()); + lvi.SubItems.Add((path.StartValve3 != null) ? path.StartValve3.Cfg.Name : "---"); + lvi.SubItems.Add(path.InvertSV3 ? Strings.yes : Strings.no); + lvi.SubItems.Add(path.LagSV3.ToString()); + + foreach (var valve in parent.Valves) + { + if (valve.Category == ValveCategory.All || valve.Category == ValveCategory.Output) + { + if (path.ValvesOpen != null && path.ValvesOpen.Contains(valve)) + { + lvi.SubItems.Add(Strings.open); + lvi.SubItems[lvi.SubItems.Count - 1].BackColor = Color.LightGray; + } + else if (path.ValvesClose != null && path.ValvesClose.Contains(valve)) + { + lvi.SubItems.Add(Strings.close); + lvi.SubItems[lvi.SubItems.Count - 1].BackColor = Color.White; + } + else + { + lvi.SubItems.Add("---"); + lvi.SubItems[lvi.SubItems.Count - 1].BackColor = Color.White; + } + } + } + + lvi.Tag = entity; + + Items.Add(lvi); + } + + public override void UpdateOne(ListViewItem lvi, object myItem) + { + Config.Entities.OutputPath entity = (Config.Entities.OutputPath)myItem; + + entity.Name = lvi.Text; + + float Qfrom; + bool allOk = Utils.TryParseUFloat(lvi.SubItems[(int)Column.Qfrom].Text, out Qfrom); + entity.Qfrom = Qfrom; + + float Qto; + allOk &= Utils.TryParseUFloat(lvi.SubItems[(int)Column.Qto].Text, out Qto); + entity.Qto = Qto; + + entity.FlowMeter = lvi.SubItems[(int)Column.RefFlowmtr].Text.Equals("---") ? null : lvi.SubItems[(int)Column.RefFlowmtr].Text; + entity.RegulValve = lvi.SubItems[(int)Column.RegulValve].Text.Equals("---") ? null : lvi.SubItems[(int)Column.RegulValve].Text; + + float pid; + allOk &= Utils.TryParseSFloat(lvi.SubItems[(int)Column.PidCoef].Text, out pid); + entity.PidCoef = pid; + + entity.Diverter = lvi.SubItems[(int)Column.Div].Text.Equals("---") ? null : lvi.SubItems[(int)Column.Div].Text; + entity.TempDiv = lvi.SubItems[(int)Column.Tdiv].Text.Equals("---") ? null : lvi.SubItems[(int)Column.Tdiv].Text; + entity.Scale = lvi.SubItems[(int)Column.Scale].Text.Equals("---") ? null : lvi.SubItems[(int)Column.Scale].Text; + + string sv1 = lvi.SubItems[(int)Column.StartValve1].Text.Equals("---") ? string.Empty : lvi.SubItems[(int)Column.StartValve1].Text; + bool invertSV1 = lvi.SubItems[(int)Column.InvertSV1].Text.Equals(Strings.yes); + string sv2 = lvi.SubItems[(int)Column.StartValve2].Text.Equals("---") ? string.Empty : lvi.SubItems[(int)Column.StartValve2].Text; + bool invertSV2 = lvi.SubItems[(int)Column.InvertSV2].Text.Equals(Strings.yes); + int lagSV2 = 0; + int.TryParse(lvi.SubItems[(int)Column.LagSV2].Text, out lagSV2); + string sv3 = lvi.SubItems[(int)Column.StartValve3].Text.Equals("---") ? string.Empty : lvi.SubItems[(int)Column.StartValve3].Text; + bool invertSV3 = lvi.SubItems[(int)Column.InvertSV3].Text.Equals(Strings.yes); + int lagSV3 = 0; + int.TryParse(lvi.SubItems[(int)Column.LagSV3].Text, out lagSV3); + /// + entity.StartValve = string.Format("{0}~{1}~{2}~{3}~{4}~{5}~{6}~{7}", sv1, (invertSV1 ? "i" : "n"), sv2, (invertSV2 ? "i" : "n"), lagSV2, sv3, (invertSV3 ? "i" : "n"), lagSV3); + + string valvesOpen = string.Empty; + string valvesClose = string.Empty; + int k = 0; + for (int j = 0; j < parent.Valves.Count; j++) + { + if (parent.Valves[j].Category == ValveCategory.All || parent.Valves[j].Category == ValveCategory.Output) + { + string text = lvi.SubItems[fixedColumnsCount + k].Text; + if (text.Equals(Strings.open)) + { + if (valvesOpen != string.Empty) valvesOpen += ";"; + valvesOpen += parent.Valves[j].Cfg.Name; + } + if (text.Equals(Strings.close)) + { + if (valvesClose != string.Empty) valvesClose += ";"; + valvesClose += parent.Valves[j].Cfg.Name; + } + k++; + } + } + entity.ValvesOpen = valvesOpen; + entity.ValvesClose = valvesClose; + } + + public void AddOne() + { + Config.Entities.OutputPath entity; + + if (MyItems.Count < FixedRowsCount) + { + entity = new Config.Entities.OutputPath(Strings._none_, MyItems.Count); + } + else + { + /// Find an unused test name + string newName; + for (int nameId = 1; true; nameId++) + { + newName = Strings.New_output_path_name + nameId.ToString(); + bool notUsed = true; + foreach (var t in MyItems) if (t.Name.Equals(newName)) notUsed = false; + if (notUsed) break; + } + entity = new Config.Entities.OutputPath(newName, MyItems.Count); + } + + base.AddOne(entity); + } + + public new void RemoveSelected() + { + bool lastOneRemoved = base.RemoveSelected(); + if (lastOneRemoved && parent != null) + { + parent.UpdateButtonStates(SharedButtons.SelectedItemPos.None); + } + } + + public string GetWarningsBeforeSaving(ref Dictionary renmInfo) + { + base.OkBtnClicked(); /// = UpdateAll() + + string warnings = string.Empty; + + foreach (var entity in ToBeRemovedItems) + { + if (!string.IsNullOrEmpty(entity.OriName)) + { + int occurances = 0; + foreach (var tst in parent.Tests) if (!string.IsNullOrEmpty(tst.OutputPath) && tst.OutputPath.Equals(entity.OriName)) occurances++; + + if (occurances > 0) + { + warnings += string.Format(Strings._0_path_1_used_by_2_tests_will_be_removed_3, Strings.OutputTabPageTitle, entity.Name, occurances, Environment.NewLine); + renmInfo.Add(entity.OriName, string.Empty); + } + } + } + + foreach (var entity in MyItems) + { + if (!string.IsNullOrEmpty(entity.OriName) && entity.OriName != entity.Name) + { + int occurances = 0; + foreach (var tst in parent.Tests) if (!string.IsNullOrEmpty(tst.OutputPath) && tst.OutputPath.Equals(entity.OriName)) occurances++; + + if (occurances > 0) + { + warnings += string.Format(Strings._0_path_1_used_by_2_tests_will_be_renamed_to_3_4, Strings.OutputTabPageTitle, entity.OriName, occurances, entity.Name, Environment.NewLine); + renmInfo.Add(entity.OriName, entity.Name); + } + } + } + + return warnings; + } + + public void UpdateRelatedItems(Dictionary renameInfo) + { + foreach (var ri in renameInfo) + { + var tests = parent.Session.QueryOver() + .Where(x => x.OutputPath == ri.Key) + .List(); + + foreach (var t in tests) + { + t.OutputPath = ri.Value; + parent.Session.Update(t); + } + } + } + + /// + /// Update the entities and save them to the database + /// + public new void OkBtnClicked() + { + base.OkBtnClicked(); + + /// Update the database + foreach (var entity in ToBeRemovedItems) + { + parent.Session.Delete(entity); + } + foreach (var entity in MyItems) + { + parent.Session.SaveOrUpdate(entity); + } + + /// Update the column widths + Program.LocalSettings.OutputColumnWidths = new int[Columns.Count]; + for (int i = 0; i < Columns.Count; i++) + { + Program.LocalSettings.OutputColumnWidths[i] = Columns[i].Width; + } + Program.LocalSettings.Save(); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/ProcedureParamsCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/UiControls/ProcedureParamsCtrl.Designer.cs new file mode 100644 index 00000000..5dfc45d9 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/ProcedureParamsCtrl.Designer.cs @@ -0,0 +1,65 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.UiControls +{ + partial class ProcedureParamsCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.listViewEx = new Results.Forms.ListViewEx(); + this.SuspendLayout(); + // + // listViewEx + // + this.listViewEx.AllowColumnReorder = true; + this.listViewEx.Dock = System.Windows.Forms.DockStyle.Fill; + this.listViewEx.DoubleClickActivation = false; + this.listViewEx.FullRowSelect = true; + this.listViewEx.GridLines = true; + this.listViewEx.Location = new System.Drawing.Point(0, 0); + this.listViewEx.Name = "listViewEx"; + this.listViewEx.Size = new System.Drawing.Size(150, 150); + this.listViewEx.TabIndex = 1; + this.listViewEx.UseCompatibleStateImageBehavior = false; + this.listViewEx.View = System.Windows.Forms.View.Details; + // + // ProcedureParams + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.listViewEx); + this.Name = "ProcedureParams"; + this.ResumeLayout(false); + + } + + #endregion + + private Results.Forms.ListViewEx listViewEx; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/ProcedureParamsCtrl.cs b/TBF_V2/Sources/TBF/TBF/UiControls/ProcedureParamsCtrl.cs new file mode 100644 index 00000000..423f6688 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/ProcedureParamsCtrl.cs @@ -0,0 +1,204 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.UiControls +{ + /// --------------- + /// / Path or other \ + /// |------------------------------ + /// | param1 param2 param3 ... + /// Component1 | + /// Component2 | + /// ... | + /// + public partial class ProcedureParamsCtrl : UserControl + { + ProcedureDlg parent; + bool showSensorsColumn; + int nrFixedColumns; + IList selectedCmpnts; + IList cmpntsParams; + + int paramsCount; + Control[] editors; + bool unlocked; + public void Unlock(){ unlocked = true; } + + public ProcedureParamsCtrl() + { + InitializeComponent(); + cmpntsParams = new List(); + } + + public ProcedureParamsCtrl(ProcedureDlg parent, IList selectedCmpnts, bool showSensorsColumn) + : this() + { + this.parent = parent; + this.selectedCmpnts = selectedCmpnts; + this.showSensorsColumn = showSensorsColumn; + nrFixedColumns = (showSensorsColumn ? 2 : 1); + unlocked = false; + + this.SuspendLayout(); + Dock = System.Windows.Forms.DockStyle.Fill; + listViewEx.Dock = System.Windows.Forms.DockStyle.Fill; + listViewEx.AllowColumnReorder = false; + listViewEx.DoubleClickActivation = false; + listViewEx.FullRowSelect = true; + listViewEx.GridLines = true; + listViewEx.Location = new System.Drawing.Point(0, 0); + listViewEx.TabIndex = 0; + listViewEx.UseCompatibleStateImageBehavior = false; + listViewEx.View = System.Windows.Forms.View.Details; + ResumeLayout(false); + } + + public void Initialize() + { + if (selectedCmpnts == null) return; + + IParamsProvider sampleToCreateHeader = null; + + foreach (var cmpnt in selectedCmpnts) + { + IParamsProvider procedureParams = null; + + if (cmpnt != null) + { + procedureParams = cmpnt.Cfg.GetUIProcParamsProvider(parent.LoadedProcedure); + if ((sampleToCreateHeader == null) || + ((procedureParams != null) && (procedureParams.ParamsCount() > sampleToCreateHeader.ParamsCount()))) + { + sampleToCreateHeader = procedureParams; + } + } + + cmpntsParams.Add(procedureParams); + } + + if (sampleToCreateHeader != null) + { + if (showSensorsColumn) listViewEx.Columns.Add(Strings.Sensor_, 60); + listViewEx.Columns.Add(Strings.Component, 80); + + paramsCount = sampleToCreateHeader.ParamsCount(); + editors = new Control[paramsCount]; + for (int i = 0; i < paramsCount; i++) + { + listViewEx.Columns.Add(sampleToCreateHeader.ParamName(i), 80); + editors[i] = new TextBox(); + editors[i].Visible = false; + this.Controls.Add(editors[i]); + } + } + + listViewEx.SubItemClicked += new Results.Forms.SubItemEventHandler(listViewEx_SubItemClicked); + listViewEx.SubItemRightClicked += new Results.Forms.SubItemEventHandler(listViewEx_SubItemRightClicked); + listViewEx.SubItemEndEditing += new Results.Forms.SubItemEndEditingEventHandler(listViewEx_SubItemEndEditing); + + RedrawAll(); + } + + private void listViewEx_SubItemClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (!unlocked || e.Item.Tag == null || e.SubItem < nrFixedColumns || e.SubItem >= nrFixedColumns + editors.Length) return; + listViewEx.StartEditing(editors[e.SubItem - nrFixedColumns], e.Item, e.SubItem); + } + + void listViewEx_SubItemRightClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (!unlocked || e.Item.Tag == null || e.SubItem < nrFixedColumns || e.SubItem >= nrFixedColumns + editors.Length) return; + + if (DialogResult.Yes == MessageBox.Show(Strings.Do_you_want_to_copy_this_value_to_all_cells_below_this_cell, + Strings.Confirmation, MessageBoxButtons.YesNo, MessageBoxIcon.Question)) + { + int columnNr = e.SubItem; + string value = null; + System.Drawing.Color backColor = System.Drawing.Color.White; + foreach (ListViewItem item in listViewEx.Items) + { + if (value != null && item.SubItems.Count > columnNr) + { + item.SubItems[columnNr].Text = value; + item.SubItems[columnNr].BackColor = backColor; + + int itemNr = columnNr - nrFixedColumns; + string message; + if ((item.Tag as IParamsProvider).ValidateParam(itemNr, value, out message)) + { + (item.Tag as IParamsProvider).UpdateParam(itemNr, value); + } + } + else if (item == e.Item) + { + value = item.SubItems[columnNr].Text; + backColor = item.SubItems[columnNr].BackColor; + } + } + } + } + + private void listViewEx_SubItemEndEditing(object sender, Results.Forms.SubItemEndEditingEventArgs e) + { + string message; + if ((e.Item.Tag as IParamsProvider).ValidateParam(e.SubItem - nrFixedColumns, e.DisplayText, out message)) + { + (e.Item.Tag as IParamsProvider).UpdateParam(e.SubItem - nrFixedColumns, e.DisplayText); + } + else + { + MessageBox.Show(message); + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + return; /// NOK + } + } + + + public void RedrawAll() + { + listViewEx.Items.Clear(); + foreach (var item in cmpntsParams) DrawOne(item); + } + + void DrawOne(IParamsProvider item) + { + if (item == null) + { + listViewEx.Items.Add(new ListViewItem()); + return; + } + + ListViewItem lvi; + if (showSensorsColumn) + { + lvi = new ListViewItem((listViewEx.Items.Count + 1).ToString()); + lvi.SubItems.Add(selectedCmpnts[listViewEx.Items.Count].Cfg.Name); + } + else + { + lvi = new ListViewItem(selectedCmpnts[listViewEx.Items.Count].Cfg.Name); + } + for (int i = 0; i < paramsCount; i++) lvi.SubItems.Add(item.ToString(i)); + lvi.Tag = item; + listViewEx.Items.Add(lvi); + } + + public void UpdateAll() + { + if (!unlocked) return; + + foreach (ListViewItem lvi in listViewEx.Items) + { + if (lvi.Tag is IParamsProvider) (lvi.Tag as IParamsProvider).UpdateEmbeddedDbEntity(); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/ProcedureParamsCtrl.resx b/TBF_V2/Sources/TBF/TBF/UiControls/ProcedureParamsCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/ProcedureParamsCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/ProceduresCtrl.cs b/TBF_V2/Sources/TBF/TBF/UiControls/ProceduresCtrl.cs new file mode 100644 index 00000000..8661db2a --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/ProceduresCtrl.cs @@ -0,0 +1,388 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Windows.Forms; +using NHibernate; +using log4net; +using Config.Entities; +using TBF.BenchControl; +using TBF.BenchControl.GenericDevices; +using TBF.Resources; +using System.Linq; + +namespace TBF.UiControls +{ + public class ProceduresCtrl : BaseWithListViewEx, ITabWithListViewEx + { + static readonly ILog log = LogManager.GetLogger(typeof(ProceduresCtrl)); + + /// + /// ListViewEx columns + /// + enum Column + { + ItemNr, + Name, + Description, + ColumnsCount, + } + readonly int columnsCount = (int)Column.ColumnsCount; + + ProceduresDlg parent; + Control parentControl; + Control[] editors; + + ISession session; + + public ProceduresCtrl() + : base() + { + session = null; + } + + public void Initialize(ProceduresDlg parent, Control parentControl) + { + this.parent = parent; + this.parentControl = parentControl; + + SubItemClicked += new Results.Forms.SubItemEventHandler(listViewEx_SubItemClicked); + SubItemEndEditing += new Results.Forms.SubItemEndEditingEventHandler(listViewEx_SubItemEndEditing); + + /// ListViewEx columns + TBF.LocalSettings ls = Program.LocalSettings; + Columns.Add(Strings.Nr, (ls.ProceduresColumnCount > 0) ? ls.ProceduresColumnWidths[0] : (30 * parent.Dpi / PathsDlg.Dpi100pct)); + Columns.Add(Strings.Name, (ls.ProceduresColumnCount > 1) ? ls.ProceduresColumnWidths[1] : (100 * parent.Dpi / PathsDlg.Dpi100pct)); + Columns.Add(Strings.DescriptionColHdr, (ls.ProceduresColumnCount > 2) ? ls.ProceduresColumnWidths[2] : (300 * parent.Dpi / PathsDlg.Dpi100pct)); + + editors = new Control[columnsCount]; + /// + editors[(int)Column.ItemNr] = new TextBox(); /// ItemNr + editors[(int)Column.Name] = new TextBox(); /// Name + editors[(int)Column.Description] = new TextBox(); /// Description + /// + for (int i = 0; i < editors.Length; i++) + { + editors[i].Visible = false; + parent.Controls.Add(editors[i]); + } + + ReloadAndRedrawAll(); + } + + void ReloadAndRedrawAll() + { + /// Load the procedures + if (session == null) session = Config.FluentCommon.CreateSession(Users.Entities.DBKind.Config); + + MyItems = session.QueryOver() + .Where(x => (x.ProcedureState == ProcedureState.Active)) + .OrderBy(x => x.ItemNr).Desc + .List(); + + base.RedrawAll(); + } + + void listViewEx_SubItemClicked(object sender, Results.Forms.SubItemEventArgs e) + { + } + + void listViewEx_SubItemEndEditing(object sender, Results.Forms.SubItemEndEditingEventArgs e) + { + } + + public override void DrawOne(object myItem) + { + Procedure entity = (Procedure)myItem; + + ListViewItem lvi = new ListViewItem((entity.ItemNr + 1).ToString()); + lvi.SubItems.Add(entity.Name); + lvi.SubItems.Add(entity.Description); + lvi.Tag = entity; + + Items.Add(lvi); + } + + /// + /// Update the entities and save them to the database + /// + public new void OkBtnClicked() + { + base.OkBtnClicked(); + + foreach (var entity in ToBeRemovedItems) + { + Config.FluentCommon.DeleteFromDb(session, entity); + } + ToBeRemovedItems.Clear(); + int itemNr = 0; + foreach (var entity in MyItems.OrderBy(x => x.ItemNr)) + { + (entity as Procedure).ItemNr = itemNr++; + Config.FluentCommon.SaveToDb(session, entity); + } + session.Flush(); + + /// Update the column widths + Program.LocalSettings.ProceduresColumnWidths = new int[Columns.Count]; + for (int i = 0; i < Columns.Count; i++) + { + Program.LocalSettings.ProceduresColumnWidths[i] = Columns[i].Width; + } + Program.LocalSettings.Save(); + + Program.MainWnd.ReloadProcedureComboBoxItems(); + } + + public void AddOne() + { + /// Find an unused procedure name + string newName; + for (int nameId = 1; true; nameId++) + { + newName = Strings.New_procedure_name + nameId.ToString(); + bool notUsed = true; + foreach (var t in MyItems) if (t.Name.Equals(newName)) notUsed = false; + if (notUsed) break; + } + + Procedure newProcedure = new Procedure(newName, MyItems.Count); + newProcedure.ProcedureState = ProcedureState.Active; + newProcedure.Revision = 1; + newProcedure.PredecessorId = 0; + newProcedure.ObtainedByCopy = false; + newProcedure.CreationUser = Users.GlobalData.CurrentUser.UserName; + newProcedure.CreationTime = DateTime.Now; + + if (new ProcedureDlg(newProcedure, GetUsedNames()).ShowDialog() == DialogResult.OK) + { + /// TODO: Make name uniqueness test + parent.Unlock(); + + using(var transaction = session.BeginTransaction()) + { + try + { + newProcedure.LastChgUser = Users.GlobalData.CurrentUser.UserName; + newProcedure.LastChgTime = DateTime.Now; + + base.AddOne(newProcedure); + session.SaveOrUpdate(newProcedure); + transaction.Commit(); + + MessageBox.Show(string.Format(Strings.Procedure_0_added, newProcedure.Name), + Strings.Confirmation, + MessageBoxButtons.OK, + MessageBoxIcon.Information); + } + catch (Exception exc) + { + transaction.Rollback(); + log.ErrorFormat("Exception when saving Procedure '{0}' : {1}", newProcedure.Name, exc.Message); + } + } + } + } + + public new void RemoveSelected() + { + if (MessageBox.Show(Strings.Do_you_want_to_delete_the_procedure, + Strings.Question, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + bool lastOneRemoved = base.RemoveSelected(); + + if (lastOneRemoved && parent != null) + { + parent.UpdateButtonStates(SharedButtons.SelectedItemPos.None); + } + + /// Update the database + foreach (var entity in ToBeRemovedItems) + { + Config.FluentCommon.DeleteFromDb(session, entity); + } + ToBeRemovedItems.Clear(); + int itemNr = 0; + foreach (var entity in MyItems) + { + (entity as Procedure).ItemNr = itemNr++; + Config.FluentCommon.SaveToDb(session, entity); + } + } + } + + public void editButton_Click(object sender, EventArgs e) + { + if (SelectedItems.Count != 1) return; + + Procedure originalProcedure = SelectedItems[0].Tag as Procedure; + Procedure modifiedProcedure = originalProcedure.Clone(); + + modifiedProcedure.Revision = originalProcedure.Revision + 1; + modifiedProcedure.ObtainedByCopy = false; + + IList usedNames = GetUsedNames(); + usedNames.Remove(originalProcedure.Name); /// Allow original procedure name + /// + if (new ProcedureDlg(modifiedProcedure, usedNames).ShowDialog() == DialogResult.OK) + { + parent.Unlock(); + + using (var transaction = session.BeginTransaction()) + { + try + { + originalProcedure.ProcedureState = ProcedureState.History; + modifiedProcedure.LastChgUser = Users.GlobalData.CurrentUser.UserName; + modifiedProcedure.LastChgTime = DateTime.Now; + + session.SaveOrUpdate(originalProcedure); + session.SaveOrUpdate(modifiedProcedure); + transaction.Commit(); + + SelectedItems[0].Tag = modifiedProcedure; + MessageBox.Show(string.Format(Strings.Procedure_0_modified, string.Format(" {0} '{1}' ", modifiedProcedure.ItemNr + 1, modifiedProcedure.Name)), + Strings.Confirmation, + MessageBoxButtons.OK, + MessageBoxIcon.Information); + } + catch (Exception exc) + { + log.ErrorFormat("Exception when saving Procedure '{0}' : {1}", modifiedProcedure.Name, exc.Message); + transaction.Rollback(); + } + } + session.Flush(); + } + + ReloadAndRedrawAll(); + } + + public void copyButton_Click(object sender, EventArgs e) + { + if (SelectedItems.Count != 1) return; + + Procedure selectedProcedure = (Procedure)SelectedItems[0].Tag; + + /// Make a copy of the selected procedure + Procedure newProcedure = selectedProcedure.Clone(); + + newProcedure.Name = selectedProcedure.Name + Strings.New_name_copy; + newProcedure.ItemNr = MyItems.Count; + newProcedure.ProcedureState = ProcedureState.Active; + newProcedure.Revision = 1; + newProcedure.PredecessorId = selectedProcedure.Id; + newProcedure.ObtainedByCopy = true; + newProcedure.CreationUser = Users.GlobalData.CurrentUser.UserName; + newProcedure.CreationTime = DateTime.Now; + newProcedure.Protected = false; + + if ((new ProcedureDlg(newProcedure, GetUsedNames())).ShowDialog() == DialogResult.OK) + { + /// TODO: Make name uniqueness test + parent.Unlock(); + + using (var transaction = session.BeginTransaction()) + { + newProcedure.LastChgUser = Users.GlobalData.CurrentUser.UserName; + newProcedure.LastChgTime = DateTime.Now; + + base.AddOne(newProcedure); + session.SaveOrUpdate(newProcedure); + transaction.Commit(); + + MessageBox.Show(string.Format(Strings.Procedure_0_added, newProcedure.Name), + Strings.Confirmation, + MessageBoxButtons.OK, + MessageBoxIcon.Information); + } + } + } + + public void exportButton_Click(object sender, EventArgs e) + { + if (SelectedItems.Count != 1) return; + + Procedure selectedProcedure = (Procedure)SelectedItems[0].Tag; + + SaveFileDialog dlg = new SaveFileDialog(); + if (dlg.ShowDialog() == DialogResult.OK) + { + selectedProcedure.Export(new StreamWriter(dlg.FileName, false, System.Text.Encoding.UTF8)); + } + } + + public void importButton_Click(object sender, EventArgs e) + { + OpenFileDialog dlg = new OpenFileDialog(); + + if (dlg.ShowDialog() != DialogResult.OK) return; + + /// Import a procedure from a file + Procedure newProcedure = Procedure.Import(new StreamReader(dlg.FileName, System.Text.Encoding.UTF8)); + + newProcedure.Name = newProcedure.Name + " imported"; + newProcedure.ItemNr = MyItems.Count; + newProcedure.ProcedureState = ProcedureState.Active; + newProcedure.Revision = 1; + newProcedure.PredecessorId = 0; + newProcedure.ObtainedByCopy = false; + newProcedure.CreationUser = Users.GlobalData.CurrentUser.UserName; + newProcedure.CreationTime = DateTime.Now; + + if ((new ProcedureDlg(newProcedure, GetUsedNames())).ShowDialog() == DialogResult.OK) + { + /// TODO: Make name uniqueness test + parent.Unlock(); + + using (var transaction = session.BeginTransaction()) + { + newProcedure.LastChgUser = Users.GlobalData.CurrentUser.UserName; + newProcedure.LastChgTime = DateTime.Now; + + base.AddOne(newProcedure); + session.SaveOrUpdate(newProcedure); + transaction.Commit(); + + MessageBox.Show(string.Format(Strings.Procedure_0_added, newProcedure.Name), + Strings.Confirmation, + MessageBoxButtons.OK, + MessageBoxIcon.Information); + } + } + } + + public void compareButton_Click(object sender, EventArgs e) + { + if (SelectedItems.Count != 1) return; + + Procedure selectedProcedure = (Procedure)SelectedItems[0].Tag; + + OpenFileDialog dlg = new OpenFileDialog(); + if (dlg.ShowDialog() == DialogResult.OK) + { + string diff = selectedProcedure.Compare(new StreamReader(dlg.FileName, System.Text.Encoding.UTF8)); + if (!string.IsNullOrEmpty(diff)) + { + MessageBox.Show(diff, "Differences", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + } + else + { + MessageBox.Show("No differences found", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + } + + public string GetWarningsBeforeSaving(ref Dictionary renmInfo) + { + return string.Empty; + } + + public void UpdateRelatedItems(Dictionary renameInfo) + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/SharedButtons.Designer.cs b/TBF_V2/Sources/TBF/TBF/UiControls/SharedButtons.Designer.cs new file mode 100644 index 00000000..3847a479 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/SharedButtons.Designer.cs @@ -0,0 +1,274 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.UiControls +{ + partial class SharedButtons + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.removeButton = new System.Windows.Forms.Button(); + this.addButton = new System.Windows.Forms.Button(); + this.unlockButton = new System.Windows.Forms.Button(); + this.cancelButton = new System.Windows.Forms.Button(); + this.okButton = new System.Windows.Forms.Button(); + this.upButton = new System.Windows.Forms.Button(); + this.downButton = new System.Windows.Forms.Button(); + this.editButton = new System.Windows.Forms.Button(); + this.copyButton = new System.Windows.Forms.Button(); + this.newTabButton = new System.Windows.Forms.Button(); + this.renameTabButton = new System.Windows.Forms.Button(); + this.removeTabButton = new System.Windows.Forms.Button(); + this.moreButton = new System.Windows.Forms.Button(); + this.exportButton = new System.Windows.Forms.Button(); + this.importButton = new System.Windows.Forms.Button(); + this.compareButton = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // removeButton + // + this.removeButton.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.removeButton.Location = new System.Drawing.Point(10, 179); + this.removeButton.Name = "removeButton"; + this.removeButton.Size = new System.Drawing.Size(80, 40); + this.removeButton.TabIndex = 4; + this.removeButton.Text = " Remove"; + this.removeButton.UseVisualStyleBackColor = true; + this.removeButton.Click += new System.EventHandler(this.removeBtn_Click); + // + // addButton + // + this.addButton.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.addButton.Location = new System.Drawing.Point(10, 136); + this.addButton.Name = "addButton"; + this.addButton.Size = new System.Drawing.Size(80, 40); + this.addButton.TabIndex = 3; + this.addButton.Text = " Add"; + this.addButton.UseVisualStyleBackColor = true; + this.addButton.Click += new System.EventHandler(this.addBtn_Click); + // + // unlockButton + // + this.unlockButton.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.unlockButton.Location = new System.Drawing.Point(10, 7); + this.unlockButton.Name = "unlockButton"; + this.unlockButton.Size = new System.Drawing.Size(80, 40); + this.unlockButton.TabIndex = 0; + this.unlockButton.Text = "Unlock"; + this.unlockButton.UseVisualStyleBackColor = true; + this.unlockButton.Click += new System.EventHandler(this.unlockBtn_Click); + // + // cancelButton + // + this.cancelButton.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.cancelButton.Location = new System.Drawing.Point(10, 93); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(80, 40); + this.cancelButton.TabIndex = 2; + this.cancelButton.Text = "Cancel"; + this.cancelButton.UseVisualStyleBackColor = true; + this.cancelButton.Click += new System.EventHandler(this.cancelBtn_Click); + // + // okButton + // + this.okButton.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.okButton.Location = new System.Drawing.Point(10, 50); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(80, 40); + this.okButton.TabIndex = 1; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okBtn_Click); + // + // upButton + // + this.upButton.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.upButton.Location = new System.Drawing.Point(10, 222); + this.upButton.Name = "upButton"; + this.upButton.Size = new System.Drawing.Size(80, 40); + this.upButton.TabIndex = 5; + this.upButton.Text = " Up"; + this.upButton.UseVisualStyleBackColor = true; + this.upButton.Click += new System.EventHandler(this.upBtn_Click); + // + // downButton + // + this.downButton.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.downButton.Location = new System.Drawing.Point(10, 265); + this.downButton.Name = "downButton"; + this.downButton.Size = new System.Drawing.Size(80, 40); + this.downButton.TabIndex = 6; + this.downButton.Text = " Down"; + this.downButton.UseVisualStyleBackColor = true; + this.downButton.Click += new System.EventHandler(this.downBtn_Click); + // + // editButton + // + this.editButton.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.editButton.Location = new System.Drawing.Point(10, 308); + this.editButton.Name = "editButton"; + this.editButton.Size = new System.Drawing.Size(80, 40); + this.editButton.TabIndex = 7; + this.editButton.Text = " Edit"; + this.editButton.UseVisualStyleBackColor = true; + this.editButton.Click += new System.EventHandler(this.editBtn_Click); + // + // copyButton + // + this.copyButton.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.copyButton.Location = new System.Drawing.Point(10, 351); + this.copyButton.Name = "copyButton"; + this.copyButton.Size = new System.Drawing.Size(80, 40); + this.copyButton.TabIndex = 8; + this.copyButton.Text = " Copy"; + this.copyButton.UseVisualStyleBackColor = true; + this.copyButton.Click += new System.EventHandler(this.copyBtn_Click); + // + // newTabButton + // + this.newTabButton.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.newTabButton.Location = new System.Drawing.Point(10, 394); + this.newTabButton.Name = "newTabButton"; + this.newTabButton.Size = new System.Drawing.Size(80, 40); + this.newTabButton.TabIndex = 9; + this.newTabButton.Text = "New Tab"; + this.newTabButton.UseVisualStyleBackColor = true; + this.newTabButton.Click += new System.EventHandler(this.newTabButton_Click); + // + // renameTabButton + // + this.renameTabButton.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.renameTabButton.Location = new System.Drawing.Point(10, 437); + this.renameTabButton.Name = "renameTabButton"; + this.renameTabButton.Size = new System.Drawing.Size(80, 40); + this.renameTabButton.TabIndex = 10; + this.renameTabButton.Text = "Rename Tab"; + this.renameTabButton.UseVisualStyleBackColor = true; + this.renameTabButton.Click += new System.EventHandler(this.renameTabButton_Click); + // + // removeTabButton + // + this.removeTabButton.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.removeTabButton.Location = new System.Drawing.Point(10, 480); + this.removeTabButton.Name = "removeTabButton"; + this.removeTabButton.Size = new System.Drawing.Size(80, 40); + this.removeTabButton.TabIndex = 11; + this.removeTabButton.Text = "Remove Tab"; + this.removeTabButton.UseVisualStyleBackColor = true; + this.removeTabButton.Click += new System.EventHandler(this.removeTabButton_Click); + // + // moreButton + // + this.moreButton.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.moreButton.Location = new System.Drawing.Point(10, 523); + this.moreButton.Name = "moreButton"; + this.moreButton.Size = new System.Drawing.Size(80, 40); + this.moreButton.TabIndex = 12; + this.moreButton.Text = "More"; + this.moreButton.UseVisualStyleBackColor = true; + this.moreButton.Click += new System.EventHandler(this.moreButton_Click); + // + // exportButton + // + this.exportButton.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.exportButton.Location = new System.Drawing.Point(10, 415); + this.exportButton.Name = "exportButton"; + this.exportButton.Size = new System.Drawing.Size(80, 40); + this.exportButton.TabIndex = 13; + this.exportButton.Text = "Export"; + this.exportButton.UseVisualStyleBackColor = true; + this.exportButton.Click += new System.EventHandler(this.exportButton_Click); + // + // importButton + // + this.importButton.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.importButton.Location = new System.Drawing.Point(10, 458); + this.importButton.Name = "importButton"; + this.importButton.Size = new System.Drawing.Size(80, 40); + this.importButton.TabIndex = 14; + this.importButton.Text = "Import"; + this.importButton.UseVisualStyleBackColor = true; + this.importButton.Click += new System.EventHandler(this.importButton_Click); + // + // compareButton + // + this.compareButton.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.compareButton.Location = new System.Drawing.Point(10, 501); + this.compareButton.Name = "compareButton"; + this.compareButton.Size = new System.Drawing.Size(80, 40); + this.compareButton.TabIndex = 15; + this.compareButton.Text = "Compare"; + this.compareButton.UseVisualStyleBackColor = true; + this.compareButton.Click += new System.EventHandler(this.compareButton_Click); + // + // SharedButtons + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.compareButton); + this.Controls.Add(this.importButton); + this.Controls.Add(this.exportButton); + this.Controls.Add(this.moreButton); + this.Controls.Add(this.removeTabButton); + this.Controls.Add(this.renameTabButton); + this.Controls.Add(this.newTabButton); + this.Controls.Add(this.copyButton); + this.Controls.Add(this.editButton); + this.Controls.Add(this.downButton); + this.Controls.Add(this.upButton); + this.Controls.Add(this.removeButton); + this.Controls.Add(this.addButton); + this.Controls.Add(this.unlockButton); + this.Controls.Add(this.cancelButton); + this.Controls.Add(this.okButton); + this.Name = "SharedButtons"; + this.Size = new System.Drawing.Size(100, 649); + this.Load += new System.EventHandler(this.SharedDlgButtons_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button removeButton; + private System.Windows.Forms.Button addButton; + private System.Windows.Forms.Button unlockButton; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.Button upButton; + private System.Windows.Forms.Button downButton; + private System.Windows.Forms.Button editButton; + private System.Windows.Forms.Button copyButton; + private System.Windows.Forms.Button newTabButton; + private System.Windows.Forms.Button renameTabButton; + private System.Windows.Forms.Button removeTabButton; + private System.Windows.Forms.Button moreButton; + private System.Windows.Forms.Button exportButton; + private System.Windows.Forms.Button importButton; + private System.Windows.Forms.Button compareButton; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/SharedButtons.cs b/TBF_V2/Sources/TBF/TBF/UiControls/SharedButtons.cs new file mode 100644 index 00000000..6cafd4d3 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/SharedButtons.cs @@ -0,0 +1,315 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using Config.Entities; +using TBF.Resources; + +namespace TBF.UiControls +{ + public partial class SharedButtons : UserControl + { + /// + /// Masks to specify the enabled state and the visibility of buttons. + /// Unlock button is hard coded in this control, cannot be set from the parent. + /// + public enum Buttons + { + None = 0, + OK = 1, /// always visible, text = 'Close' when locked + Cancel = 2, /// always visible + Add = 4, /// optional + Remove = 8, /// optional + Up = 0x10, /// optional + Down = 0x20, /// optional + Edit = 0x40, /// optional + Copy = 0x80, /// optional + NewTab = 0x100, /// optional + RenameTab = 0x200, /// optional + RemoveTab = 0x400, /// optional + More = 0x800, /// optional + Export = 0x1000, /// optional + Import = 0x2000, /// optional + Compare = 0x4000, /// optional + } + + /// + /// Optional buttons are Add, Remove, Up, Down, Edit and Copy. + /// OK and Cancel buttons are always visible (after unlock), but not always enabled. + /// + public Buttons OptionalButtons; + + public enum LockState + { + Locked, /// 'Unlock', 'Close' (=OK) are shown, all the othere are hidden + Unlocked, /// Unlock, Ok, Cancel, Add,Remove and all optional buttons are shown + } + LockState lockState; + + public bool MoreActive; + public int MoreButtonTop; + + /// + /// Used by controls to indicate which item is selected + /// and to appropriately update Remove, Up and Down Buttons. + /// + public enum SelectedItemPos + { + None, + First, + Last, + FirstAndLast, + Middle, + } + + public Users.Grp.GID RequiredGroupMembership; + + Users.Entities.User originalUser; + + /// + /// Default constructor + /// + public SharedButtons() + { + originalUser = Users.GlobalData.CurrentUser; + lockState = LockState.Locked; + MoreActive = false; + OptionalButtons = Buttons.None; + RequiredGroupMembership = Users.Grp.GID.None; + InitializeComponent(); + } + + /// + /// Initialize the buttons when the dialog is loaded + /// + /// + /// + private void SharedDlgButtons_Load(object sender, EventArgs e) + { + unlockButton.Text = Strings.UnlockBtnText; + okButton.Text = Strings.CloseBtnText; + cancelButton.Text = Strings.CancelBtnText; + addButton.Text = Strings.AddBtnText; + removeButton.Text = Strings.RemoveBtnText; + upButton.Text = Strings.UpBtnText; + downButton.Text = Strings.DownBtnText; + editButton.Text = Strings.EditBtnText; + copyButton.Text = Strings.CopyBtnText; + newTabButton.Text = Strings.NewTabBtnText; + renameTabButton.Text = Strings.RenameTabBtnText; + removeTabButton.Text = Strings.RemoveTabBtnText; + moreButton.Text = Strings.MoreBtnText; + + cancelButton.Hide(); + addButton.Hide(); + removeButton.Hide(); + upButton.Hide(); + downButton.Hide(); + editButton.Hide(); + copyButton.Hide(); + newTabButton.Hide(); + renameTabButton.Hide(); + removeTabButton.Hide(); + moreButton.Hide(); + exportButton.Hide(); + importButton.Hide(); + compareButton.Hide(); + + /// Reposition 'Edit' and 'Copy" buttons in case both 'Up' and 'Down' are hidden + if (((OptionalButtons & Buttons.Up) == 0) && + ((OptionalButtons & Buttons.Down) == 0)) + { + editButton.Top = upButton.Top; + copyButton.Top = downButton.Top; + } + + /// Reposition Tab-related button in case both 'Edit' and 'Copy" are hidden + if (((OptionalButtons & Buttons.Edit) == 0) && + ((OptionalButtons & Buttons.Copy) == 0)) + { + removeTabButton.Top = newTabButton.Top + 15; + newTabButton.Top = editButton.Top + 15; + renameTabButton.Top = copyButton.Top + 15; + } + + if ((OptionalButtons & Buttons.Add) == 0 && + (OptionalButtons & Buttons.Remove) == 0 && + (OptionalButtons & Buttons.Up) == 0 && + (OptionalButtons & Buttons.Down) == 0 && + (OptionalButtons & Buttons.Edit) == 0 && + (OptionalButtons & Buttons.Copy) == 0 && + (OptionalButtons & Buttons.NewTab) == 0 && + (OptionalButtons & Buttons.RenameTab) == 0 && + (OptionalButtons & Buttons.RemoveTab) == 0) + { + moreButton.Top = MoreButtonTop; + } +#if DEBUG + //unlockBtn_Click(sender, e); +#endif + } + + /// + /// Update the visibility of buttons and OK button text when the dialog is unlocked + /// + public void UnlockButtons() + { + unlockButton.Enabled = false; + okButton.Text = Strings.OkBtnText; + cancelButton.Show(); + if ((OptionalButtons & Buttons.Add) != 0) addButton.Show(); + if ((OptionalButtons & Buttons.Remove) != 0) removeButton.Show(); + if ((OptionalButtons & Buttons.Up) != 0) upButton.Show(); + if ((OptionalButtons & Buttons.Down) != 0) downButton.Show(); + if ((OptionalButtons & Buttons.Edit) != 0) editButton.Show(); + if ((OptionalButtons & Buttons.Copy) != 0) copyButton.Show(); + if ((OptionalButtons & Buttons.NewTab) != 0) newTabButton.Show(); + if ((OptionalButtons & Buttons.RenameTab) != 0) renameTabButton.Show(); + if ((OptionalButtons & Buttons.RemoveTab) != 0) removeTabButton.Show(); + if ((OptionalButtons & Buttons.More) != 0) moreButton.Show(); + if ((OptionalButtons & Buttons.Export) != 0) exportButton.Show(); + if ((OptionalButtons & Buttons.Import) != 0) importButton.Show(); + if ((OptionalButtons & Buttons.Compare) != 0) compareButton.Show(); + + lockState = LockState.Unlocked; + } + + /// + /// Enable specified buttons + /// + public void EnableButtons(Buttons buttons) + { + SetEnabled(buttons, true); + } + + /// + /// Disable specified buttons + /// + public void DisableButtons(Buttons buttons) + { + SetEnabled(buttons, false); + } + + public void SetEnabled(Buttons buttons, bool value) + { + if ((buttons & Buttons.OK) != 0) okButton.Enabled = value; + if ((buttons & Buttons.Cancel) != 0) cancelButton.Enabled = value; + if ((buttons & Buttons.Add) != 0) addButton.Enabled = value; + if ((buttons & Buttons.Remove) != 0) removeButton.Enabled = value; + if ((buttons & Buttons.Up) != 0) upButton.Enabled = value; + if ((buttons & Buttons.Down) != 0) downButton.Enabled = value; + if ((buttons & Buttons.Edit) != 0) editButton.Enabled = value; + if ((buttons & Buttons.Copy) != 0) copyButton.Enabled = value; + if ((buttons & Buttons.NewTab) != 0) newTabButton.Enabled = value; + if ((buttons & Buttons.RenameTab) != 0) renameTabButton.Enabled = value; + if ((buttons & Buttons.RemoveTab) != 0) removeTabButton.Enabled = value; + if ((buttons & Buttons.More) != 0) moreButton.Enabled = value; + if ((buttons & Buttons.Export) != 0) exportButton.Enabled = value; + if ((buttons & Buttons.Import) != 0) importButton.Enabled = value; + if ((buttons & Buttons.Compare) != 0) compareButton.Enabled = value; + } + + void RestoreUser() + { + Users.GlobalData.CurrentUser = originalUser; + Program.MainWnd.UpdateUser(); + } + + /// + /// Events invoked when buttons are clicked (and in case of Unlock kbutton also accepted) + /// + public event EventHandler Unlocked; + public event EventHandler OKClicked; + public event EventHandler CancelClicked; + public event EventHandler AddClicked; + public event EventHandler RemoveClicked; + public event EventHandler UpClicked; + public event EventHandler DownClicked; + public event EventHandler EditClicked; + public event EventHandler CopyClicked; + public event EventHandler NewTabClicked; + public event EventHandler RenameTabClicked; + public event EventHandler RemoveTabClicked; + public event EventHandler MoreClicked; + public event EventHandler ExportClicked; + public event EventHandler ImportClicked; + public event EventHandler CompareClicked; + + /// + /// 'Unlock' button handler + /// + /// + /// + public void unlockBtn_Click(object sender, EventArgs e) + { + if (lockState == LockState.Locked) + { + if (!Users.GlobalData.CurrentUser.IsMemberOf(RequiredGroupMembership)) + { + if ((new Users.Forms.LoginDlg(RequiredGroupMembership)).ShowDialog() != DialogResult.OK) + return; + } + else if (Program.LocalSettings.AlwaysAskPasswdWhenUnlocking) + { + if ((new Users.Forms.LoginDlg(Users.GlobalData.CurrentUser.UserName, RequiredGroupMembership)).ShowDialog() != DialogResult.OK) + return; + } + + if (Program.MainWnd != null) Program.MainWnd.UpdateUser(); + + UnlockButtons(); + + if (Unlocked != null) Unlocked(sender, e); + } + } + + /// + /// 'OK'/'Close' button handler. Handled as 'Cancel' in the locked state ('Close' button). + /// + private void okBtn_Click(object sender, EventArgs e) + { + if (lockState == LockState.Locked) + { + if (CancelClicked != null) CancelClicked(sender, e); + } + else + { + if (OKClicked != null) OKClicked(sender, e); + } + } + + private void moreButton_Click(object sender, EventArgs e) + { + if (MoreActive) + { + MoreActive = false; + moreButton.Text = Strings.MoreBtnText; + } + else + { + MoreActive = true; + moreButton.Text = Strings.LessBtnText; + } + + if (MoreClicked != null) MoreClicked(sender, e); + } + + /// + /// All remaining handlers: + /// + private void cancelBtn_Click(object s, EventArgs e) { if (CancelClicked != null) CancelClicked(s, e); } + private void addBtn_Click(object s, EventArgs e) { if (AddClicked != null) AddClicked(s, e); } + private void removeBtn_Click(object s, EventArgs e) { if (RemoveClicked != null) RemoveClicked(s, e); } + private void upBtn_Click(object s, EventArgs e) { if (UpClicked != null) UpClicked(s, e); } + private void downBtn_Click(object s, EventArgs e) { if (DownClicked != null) DownClicked(s, e); } + private void editBtn_Click(object s, EventArgs e) { if (EditClicked != null) EditClicked(s, e); } + private void copyBtn_Click(object s, EventArgs e) { if (CopyClicked != null) CopyClicked(s, e); } + private void newTabButton_Click(object s, EventArgs e) { if (NewTabClicked != null) NewTabClicked(s, e); } + private void renameTabButton_Click(object s, EventArgs e) { if (RenameTabClicked != null) RenameTabClicked(s, e); } + private void removeTabButton_Click(object s, EventArgs e) { if (RemoveTabClicked != null) RemoveTabClicked(s, e); } + private void exportButton_Click(object s, EventArgs e) { if (ExportClicked != null) ExportClicked(s, e); } + private void importButton_Click(object s, EventArgs e) { if (ImportClicked != null) ImportClicked(s, e); } + private void compareButton_Click(object s, EventArgs e) { if (CompareClicked != null) CompareClicked(s, e); } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/SharedButtons.resx b/TBF_V2/Sources/TBF/TBF/UiControls/SharedButtons.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/SharedButtons.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/TestParamsCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/UiControls/TestParamsCtrl.Designer.cs new file mode 100644 index 00000000..3624dae9 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/TestParamsCtrl.Designer.cs @@ -0,0 +1,65 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.UiControls +{ + partial class TestParamsCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.listViewEx = new Results.Forms.ListViewEx(); + this.SuspendLayout(); + // + // listViewEx + // + this.listViewEx.AllowColumnReorder = true; + this.listViewEx.Dock = System.Windows.Forms.DockStyle.Fill; + this.listViewEx.DoubleClickActivation = false; + this.listViewEx.FullRowSelect = true; + this.listViewEx.GridLines = true; + this.listViewEx.Location = new System.Drawing.Point(0, 0); + this.listViewEx.Name = "listViewEx"; + this.listViewEx.Size = new System.Drawing.Size(150, 150); + this.listViewEx.TabIndex = 0; + this.listViewEx.UseCompatibleStateImageBehavior = false; + this.listViewEx.View = System.Windows.Forms.View.Details; + // + // TestParamsCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.listViewEx); + this.Name = "TestParamsCtrl"; + this.ResumeLayout(false); + + } + + #endregion + + private Results.Forms.ListViewEx listViewEx; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/TestParamsCtrl.cs b/TBF_V2/Sources/TBF/TBF/UiControls/TestParamsCtrl.cs new file mode 100644 index 00000000..c9a12f27 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/TestParamsCtrl.cs @@ -0,0 +1,242 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using Config.Entities; +using TBF.BenchControl.Generic; +using TBF.Resources; + +namespace TBF.UiControls +{ + // ----------- + // / Component \ + // |------------------------------ + // | param1 param2 param3 ... + // Test1 | + // Test2 | + // ... | + // + public partial class TestParamsCtrl : UserControl + { + ProcedureDlg parent; + bool showTestsColumn; + BenchControl.Generic.IComponent cmpnt; + + + IList testParamsProviders; + + int paramsCount; + + Control[] editors; + + bool unlocked; + public void Unlock() { unlocked = true; } + + public Results.Forms.ListViewEx LVEx { get { return listViewEx; } } + + public TestParamsCtrl() + { + InitializeComponent(); + testParamsProviders = new List(); + } + + public TestParamsCtrl(ProcedureDlg parent, BenchControl.Generic.IComponent cmpnt, bool showTestsColumn) + : this() + { + this.parent = parent; + this.showTestsColumn = showTestsColumn; + this.cmpnt = cmpnt; + unlocked = false; + + this.SuspendLayout(); + Dock = System.Windows.Forms.DockStyle.Fill; + listViewEx.Dock = System.Windows.Forms.DockStyle.Fill; + listViewEx.AllowColumnReorder = false; + listViewEx.DoubleClickActivation = false; + listViewEx.FullRowSelect = true; + listViewEx.GridLines = true; + listViewEx.Location = new System.Drawing.Point(0, 0); + listViewEx.TabIndex = 0; + listViewEx.UseCompatibleStateImageBehavior = false; + listViewEx.View = System.Windows.Forms.View.Details; + ResumeLayout(false); + } + + public void Initialize() + { + IParamsProvider sampleToCreateHeader; + + testParamsProviders = GetTestParamsProviders(parent.LoadedProcedure.Tests, out sampleToCreateHeader); + + /// Create the header + if (sampleToCreateHeader != null) + { + if (showTestsColumn) listViewEx.Columns.Add(Strings.Test, 70); + + paramsCount = sampleToCreateHeader.ParamsCount(); + editors = new Control[paramsCount]; + for (int i = 0; i < paramsCount; i++) + { + listViewEx.Columns.Add(sampleToCreateHeader.ParamName(i), 90); + editors[i] = new TextBox(); + editors[i].Visible = false; + this.Controls.Add(editors[i]); + } + } + + listViewEx.SubItemClicked += new Results.Forms.SubItemEventHandler(listViewEx_SubItemClicked); + listViewEx.SubItemRightClicked += new Results.Forms.SubItemEventHandler(listViewEx_SubItemRightClicked); + listViewEx.SubItemEndEditing += new Results.Forms.SubItemEndEditingEventHandler(listViewEx_SubItemEndEditing); + + RedrawAll(); + } + + IList GetTestParamsProviders(IList tests, out IParamsProvider sampleToCreateHeader) + { + IList providers = new List(); + sampleToCreateHeader = null; + + /// For each test (with an appropriate method in case of ITestMethod-s) + foreach (var test in tests) + { + IParamsProvider testParams = cmpnt.Cfg.GetUITestParamsProvider(test); + if (testParams != null && (sampleToCreateHeader == null || testParams.ParamsCount() > sampleToCreateHeader.ParamsCount())) + { + sampleToCreateHeader = testParams; + } + providers.Add(testParams); + } + + return providers; + } + + private void listViewEx_SubItemClicked(object sender, Results.Forms.SubItemEventArgs e) + { + int itemNr = showTestsColumn ? (e.SubItem - 1) : e.SubItem; + if (!unlocked || e.Item.Tag == null || itemNr >= editors.Length || itemNr < 0) return; + + listViewEx.StartEditing(editors[itemNr], e.Item, e.SubItem); + } + + void listViewEx_SubItemRightClicked(object sender, Results.Forms.SubItemEventArgs e) + { + int itemNr = showTestsColumn ? (e.SubItem - 1) : e.SubItem; + if (!unlocked || e.Item.Tag == null || itemNr >= editors.Length || itemNr < 0) return; + + if (DialogResult.Yes == MessageBox.Show(Strings.Do_you_want_to_copy_this_value_to_all_cells_below_this_cell, + Strings.Confirmation, MessageBoxButtons.YesNo, MessageBoxIcon.Question)) + { + int columnNr = e.SubItem; + string value = null; + System.Drawing.Color backColor = System.Drawing.Color.White; + foreach (ListViewItem item in listViewEx.Items) + { + if (value != null && item.SubItems.Count > columnNr) + { + item.SubItems[columnNr].Text = value; + item.SubItems[columnNr].BackColor = backColor; + + string message; + if ((item.Tag as IParamsProvider).ValidateParam(itemNr, value, out message)) + { + (item.Tag as IParamsProvider).UpdateParam(itemNr, value); + } + } + else if (item == e.Item) + { + value = item.SubItems[columnNr].Text; + backColor = item.SubItems[columnNr].BackColor; + } + } + } + } + + private void listViewEx_SubItemEndEditing(object sender, Results.Forms.SubItemEndEditingEventArgs e) + { + string message; + int itemNr = showTestsColumn ? (e.SubItem - 1) : e.SubItem; + + if ((e.Item.Tag as IParamsProvider).ValidateParam(itemNr, e.DisplayText, out message)) + { + (e.Item.Tag as IParamsProvider).UpdateParam(itemNr, e.DisplayText); + } + else + { + MessageBox.Show(message); + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + return; /// NOK + } + } + + public void RedrawAll() + { + IParamsProvider dummy; + testParamsProviders = GetTestParamsProviders(parent.LoadedProcedure.Tests, out dummy); + listViewEx.Items.Clear(); + for (int i = 0; i < testParamsProviders.Count && i < parent.LoadedProcedure.Tests.Count; i++) + { + DrawOne(testParamsProviders[i], parent.LoadedProcedure.Tests[i].Name); + } + } + + void DrawOne(IParamsProvider item, string testName) + { + if (item == null) + { + listViewEx.Items.Add(new ListViewItem()); + return; + } + + ListViewItem lvi; + if (showTestsColumn) + { + lvi = new ListViewItem(testName); + lvi.SubItems.Add(item.ToString(0)); + } + else + { + lvi = new ListViewItem(item.ToString(0)); + } + for (int i = 1; i < paramsCount; i++) lvi.SubItems.Add(item.ToString(i)); + + lvi.Tag = item; + listViewEx.Items.Add(lvi); + } + + public void AddOne(Test test) + { + if (test.Method == cmpnt.Cfg.Name) + { + IParamsProvider testParams = cmpnt.Cfg.CreateTestParamsProvider(); /// Load or create ComponentTest entity + if (testParams != null) + { + var writer = new System.IO.StringWriter(); + testParams.GetSerializer().Serialize(writer, testParams); /// Serialize this class with parameters + + ComponentTest entity = new ComponentTest(test.Method, writer.ToString(), test); + entity.SetParamsProvider(testParams); + testParamsProviders.Add(testParams); + } + DrawOne(testParams, test.Name); + } + else + { + testParamsProviders.Add(null); + DrawOne(null, null); + } + } + + public void UpdateAll() + { + if (!unlocked) return; + + foreach (ListViewItem lvi in listViewEx.Items) + { + if (lvi.Tag is IParamsProvider) (lvi.Tag as IParamsProvider).UpdateEmbeddedDbEntity(); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/TestParamsCtrl.resx b/TBF_V2/Sources/TBF/TBF/UiControls/TestParamsCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/TestParamsCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/TestProgressCtrl.Designer.cs b/TBF_V2/Sources/TBF/TBF/UiControls/TestProgressCtrl.Designer.cs new file mode 100644 index 00000000..5cd08494 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/TestProgressCtrl.Designer.cs @@ -0,0 +1,76 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +namespace TBF.UiControls +{ + partial class TestProgressCtrl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.testNameLabel = new System.Windows.Forms.Label(); + this.testProgressBar = new System.Windows.Forms.ProgressBar(); + this.SuspendLayout(); + // + // testNameLabel + // + this.testNameLabel.AutoSize = true; + this.testNameLabel.Font = new System.Drawing.Font("Verdana", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.testNameLabel.Location = new System.Drawing.Point(3, 5); + this.testNameLabel.Name = "testNameLabel"; + this.testNameLabel.Size = new System.Drawing.Size(51, 18); + this.testNameLabel.TabIndex = 0; + this.testNameLabel.Text = "label1"; + this.testNameLabel.Click += new System.EventHandler(this.TestProgressCtrl_Click); + // + // testProgressBar + // + this.testProgressBar.Location = new System.Drawing.Point(105, 2); + this.testProgressBar.Name = "testProgressBar"; + this.testProgressBar.Size = new System.Drawing.Size(100, 25); + this.testProgressBar.TabIndex = 1; + this.testProgressBar.Click += new System.EventHandler(this.TestProgressCtrl_Click); + // + // TestProgressCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.testProgressBar); + this.Controls.Add(this.testNameLabel); + this.Name = "TestProgressCtrl"; + this.Size = new System.Drawing.Size(207, 29); + this.Click += new System.EventHandler(this.TestProgressCtrl_Click); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label testNameLabel; + private System.Windows.Forms.ProgressBar testProgressBar; + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/TestProgressCtrl.cs b/TBF_V2/Sources/TBF/TBF/UiControls/TestProgressCtrl.cs new file mode 100644 index 00000000..0c2decae --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/TestProgressCtrl.cs @@ -0,0 +1,86 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Drawing; +using System.Windows.Forms; + +namespace TBF.UiControls +{ + public partial class TestProgressCtrl : UserControl + { + public enum Result + { + NotDone, + Passed, + Failed, + } + + public Result TestResult + { + set + { + //switch (value) + //{ + // case Result.NotDone: resultPictureBox.Image = Properties.Resources.TestNotDoneImage; break; + // case Result.Passed: resultPictureBox.Image = Properties.Resources.TestPassedImage; break; + // case Result.Failed: resultPictureBox.Image = Properties.Resources.TestFailedImage; break; + //} + } + } + + public bool Selected; + + int testId; + public int TestId { get { return testId; } } + + string testName; + public string TestName { get { return testName; } } + + int part; + public int Part { get { return part; } } + + string title; + public string Title2 { get { return title; } } + + int repetitionNr; + public int RepetitionNr { get { return repetitionNr; } } + + public string Title { set { testNameLabel.Text = value; } } + + public int Progress { set { testProgressBar.Value = value; } } + public ProgressBar TestProgressBar { get { return testProgressBar; } } + + public TestProgressCtrl() + { + InitializeComponent(); + this.Progress = 0; + this.TestResult = UiControls.TestProgressCtrl.Result.NotDone; + } + + public TestProgressCtrl(int testId, string testName, int part, string title, int repetitionNr, int testRepeats) + : this() + { + this.testId = testId; + this.part = part; + this.testName = testName; + this.title = title; + this.repetitionNr = repetitionNr; + this.Title = title; + } + + private void TestProgressCtrl_Click(object sender, System.EventArgs e) + { + if (Selected) + { + Selected = false; + BackColor = Color.Transparent; + } + else + { + Selected = true; + BackColor = Color.Orange; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/TestProgressCtrl.resx b/TBF_V2/Sources/TBF/TBF/UiControls/TestProgressCtrl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/TestProgressCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/TransitionStepsCtrl.cs b/TBF_V2/Sources/TBF/TBF/UiControls/TransitionStepsCtrl.cs new file mode 100644 index 00000000..85b21877 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/TransitionStepsCtrl.cs @@ -0,0 +1,516 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System.Collections.Generic; +using System.Drawing; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.BenchControl; +using TBF.BenchControl.GenericDevices; +using TBF.Resources; + +namespace TBF.UiControls +{ + public partial class TransitionStepsCtrl : BaseWithListViewEx, ITabWithListViewEx + { + static readonly ILog log = LogManager.GetLogger(typeof(TransitionStepsCtrl)); + + /// + /// Fixed ListViewEx columns + /// + enum Column + { + Duration, + Message, + Condition, + FixedColumnsCount, + } + readonly int fixedCount = (int)Column.FixedColumnsCount; + + TransitionSequence sequence; + + TransitionsDlg parent; + Control parentControl; + Control[] editors; + + int fmPumpCount; /// Number of pumps with FM control + int regvCount; /// Number of regulating valves + int vCount; /// Number of valves + + IList conditionNames; + IList conditionComponents; + IList conditionIDs; + + + public TransitionStepsCtrl() + : base() + { + conditionNames = new List(); + conditionComponents = new List(); + conditionIDs = new List(); + } + + public void Initialize(TransitionSequence sequence, TransitionsDlg parent, Control parentControl) + { + this.sequence = sequence; + this.parent = parent; + this.parentControl = parentControl; + Name = sequence.Name; + MyItems = sequence.TransitionSteps; + + SubItemClicked += new Results.Forms.SubItemEventHandler(listViewEx_SubItemClicked); + SubItemRightClicked += new Results.Forms.SubItemEventHandler(listViewEx_SubItemRightClicked); + SubItemEndEditing += new Results.Forms.SubItemEndEditingEventHandler(listViewEx_SubItemEndEditing); + + vCount = 0; + fmPumpCount = 0; + regvCount = parent.RegulValves.Count; + + /// + /// ListViewEx columns + /// + Columns.Add(Strings.Duration_s, 70 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(Strings.Message, 100 * parent.Dpi / PathsDlg.Dpi100pct); + Columns.Add(Strings.End_Condition, 80 * parent.Dpi / PathsDlg.Dpi100pct); + foreach (var vlv in parent.Valves) + { + if (vlv is BenchControl.GenericDevices.IPumpFM) + { + Columns.Add(vlv.Cfg.Name + " [%]", 45 * parent.Dpi / PathsDlg.Dpi100pct); + fmPumpCount++; + } + } + foreach (var rvlv in parent.RegulValves) + { + Columns.Add(rvlv.Cfg.Name + " [%]", 55 * parent.Dpi / PathsDlg.Dpi100pct); + } + foreach (var vlv in parent.Valves) + { + if (!(vlv is BenchControl.GenericDevices.IPumpFM)) + { + Columns.Add(vlv.Cfg.Name, 40 * parent.Dpi / PathsDlg.Dpi100pct); + vCount++; + } + } + + /// + /// Prepare valve combo-boxes + /// + TextBox tb; + ComboBox cb; + editors = new Control[fixedCount + fmPumpCount + regvCount + vCount]; + + /// Duration + editors[(int)Column.Duration] = tb = new TextBox(); + tb.Visible = false; + parent.Controls.Add(tb); + + /// Message + editors[(int)Column.Message] = tb = new TextBox(); + tb.Visible = false; + parent.Controls.Add(tb); + + + /// End condition + editors[(int)Column.Condition] = cb = new ComboBox(); + cb.Visible = false; + cb.Items.Add("---"); + ///for (int i = 1; i < (int)StepCondition.Count; i++) cb.Items.Add(((StepCondition)i).ToString()); + foreach (var cmpnt in parent.TbfComponents) + { + if (cmpnt is ISequenceCondition) + { + ISequenceCondition c = cmpnt as ISequenceCondition; + for (int i = 0; i < c.ConditionsCount; i++) + { + cb.Items.Add(c.ConditionName(i)); + conditionNames.Add(c.ConditionName(i)); + conditionComponents.Add(cmpnt.Name); + conditionIDs.Add(i); + } + } + } + parent.Controls.Add(cb); + + + /// FM controlled pumps + for (int i = fixedCount; i < fixedCount + fmPumpCount; i++) + { + editors[i] = cb = new ComboBox(); + cb.Visible = false; + cb.Items.Add("---"); + cb.Items.Add(Strings.dflt); + cb.Items.Add("0"); + cb.Items.Add("30"); + cb.Items.Add("40"); + cb.Items.Add("50"); + cb.Items.Add("60"); + cb.Items.Add("70"); + cb.Items.Add("75"); + cb.Items.Add("80"); + cb.Items.Add("85"); + cb.Items.Add("90"); + cb.Items.Add("92"); + cb.Items.Add("94"); + cb.Items.Add("96"); + cb.Items.Add("98"); + cb.Items.Add("100"); + parent.Controls.Add(cb); + } + + /// Regulation valves + for (int i = fixedCount + fmPumpCount; i < fixedCount + fmPumpCount + regvCount; i++) + { + editors[i] = cb = new ComboBox(); + cb.Visible = false; + cb.Items.Add("---"); + cb.Items.Add("0"); + cb.Items.Add("25"); + cb.Items.Add("50"); + cb.Items.Add("75"); + cb.Items.Add("100"); + parent.Controls.Add(cb); + } + + /// Valves + for (int i = fixedCount + fmPumpCount + regvCount; i < fixedCount + fmPumpCount + regvCount + vCount; i++) + { + editors[i] = cb = new ComboBox(); + cb.Visible = false; + cb.Items.Add("---"); + cb.Items.Add(Strings.open); + cb.Items.Add(Strings.close); + parent.Controls.Add(cb); + } + + base.RedrawAll(); + } + + void listViewEx_SubItemClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (!Unlocked || e.SubItem >= editors.Length) return; + StartEditing(editors[e.SubItem], e.Item, e.SubItem); + } + + void listViewEx_SubItemRightClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (!Unlocked || e.SubItem >= editors.Length) return; + + if (DialogResult.Yes == MessageBox.Show(Strings.Do_you_want_to_copy_this_value_to_all_cells_below_this_cell, + Strings.Confirmation, MessageBoxButtons.YesNo, MessageBoxIcon.Question)) + { + int columnNr = e.SubItem; + string value = null; + System.Drawing.Color backColor = System.Drawing.Color.White; + foreach (ListViewItem item in Items) + { + if (value != null && item.SubItems.Count > columnNr) + { + item.SubItems[columnNr].Text = value; + item.SubItems[columnNr].BackColor = backColor; + } + else if (item == e.Item) + { + value = item.SubItems[columnNr].Text; + backColor = item.SubItems[columnNr].BackColor; + } + } + } + } + + void listViewEx_SubItemEndEditing(object sender, Results.Forms.SubItemEndEditingEventArgs e) + { + if (e.SubItem == (int)Column.Duration) + { + int duration; + if (!int.TryParse(e.DisplayText, out duration) || duration <= 0) + { + e.DisplayText = e.Item.Text; + e.Cancel = true; + } + } + else if (e.SubItem == (int)Column.Message) + { + if (e.DisplayText.Length >= 255) + { + // Message too long + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + } + } + else if (e.SubItem == (int)Column.Condition) + { + if (!((ComboBox)editors[(int)Column.Condition]).Items.Contains(e.DisplayText)) + { + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + } + } + else if ((e.SubItem >= fixedCount) && (e.SubItem < fixedCount + fmPumpCount)) + { + float pct; + if (!e.DisplayText.Equals("---") && + !e.DisplayText.Equals(Strings.dflt) && + !(Utils.TryParseUFloat(e.DisplayText, out pct) && (pct >= 0) && (pct <= 100.0f))) + { + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + } + } + else if ((e.SubItem >= fixedCount + fmPumpCount) && (e.SubItem < fixedCount + fmPumpCount + regvCount)) + { + float pct; + if (!e.DisplayText.Equals("---") && + !(Utils.TryParseUFloat(e.DisplayText, out pct) && (pct >= 0) && (pct <= 100.0f))) + { + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + } + } + else if ((e.SubItem >= fixedCount + fmPumpCount + regvCount) && (e.SubItem < fixedCount + fmPumpCount + regvCount + vCount)) + { + if ((e.DisplayText != Strings.open) && (e.DisplayText != Strings.close) && (e.DisplayText != "---")) + { + e.DisplayText = e.Item.SubItems[e.SubItem].Text; + e.Cancel = true; + } + else + { + e.Item.SubItems[e.SubItem].BackColor = e.DisplayText == Strings.open ? Color.LightGray : Color.White; + } + } + } + + public override void DrawOne(object myItem) + { + TransitionStep step = (TransitionStep)myItem; + + IList valvesOpen = new List(); + if (step.ValvesOpen != null) + { + string[] vOpen = step.ValvesOpen.Split(new char[] { ';' }); + foreach (var vName in vOpen) valvesOpen.Add((IValve)TbfComponents.FindComponent(vName, parent.TbfComponents)); + } + + IList valvesClose = new List(); + if (step.ValvesClose != null) + { + string[] vClose = step.ValvesClose.Split(new char[] { ';' }); + foreach (var vName in vClose) valvesClose.Add((IValve)TbfComponents.FindComponent(vName, parent.TbfComponents)); + } + + ListViewItem lvi = new ListViewItem(step.Duration.ToString()); + lvi.UseItemStyleForSubItems = false; + + lvi.SubItems.Add(string.IsNullOrEmpty(step.Message) ? string.Empty : step.Message); + + if (step.EndCondition == "None") + { + lvi.SubItems.Add("---"); + } + else + { + string[] fields = step.EndCondition.Split( new char[] { '~' } ); + if (fields.Length == 2) + { + ISequenceCondition cmpnt = TbfComponents.FindComponent(fields[0], parent.TbfComponents) as ISequenceCondition; + int id; + if (cmpnt != null && int.TryParse(fields[1], out id) && id >= 0 && id < cmpnt.ConditionsCount) + { + lvi.SubItems.Add(cmpnt.ConditionName(id)); + } + else + { + lvi.SubItems.Add("---"); + } + } + else + { + lvi.SubItems.Add("---"); + } + } + + string[] fmPumpsStr = (step.PumpWithFMPcts != null) ? step.PumpWithFMPcts.Split(new char[] { ';' }) + : new string[0]; + for (int i = 0; i < fmPumpCount; i++) + { + lvi.SubItems.Add((i < fmPumpsStr.Length) ? fmPumpsStr[i] : "---"); + } + + string[] rvPosStr = (step.RegulValvesPct != null) ? step.RegulValvesPct.Split(new char[] { ';' }) + : new string[0]; + for (int i = 0; i < regvCount; i++) + { + lvi.SubItems.Add((i < rvPosStr.Length) ? rvPosStr[i] : "---"); + } + + foreach (var valve in parent.Valves) + { + if (!(valve is BenchControl.GenericDevices.IPumpFM)) + { + if (valvesOpen != null && valvesOpen.Contains(valve)) + { + lvi.SubItems.Add(Strings.open); + lvi.SubItems[lvi.SubItems.Count - 1].BackColor = Color.LightGray; + } + else if (valvesClose != null && valvesClose.Contains(valve)) + { + lvi.SubItems.Add(Strings.close); + lvi.SubItems[lvi.SubItems.Count - 1].BackColor = Color.White; + } + else + { + lvi.SubItems.Add("---"); + lvi.SubItems[lvi.SubItems.Count - 1].BackColor = Color.White; + } + } + } + + lvi.Tag = step; + + Items.Add(lvi); + } + + public override void UpdateOne(ListViewItem lvi, object myItem) + { + TransitionStep step = (TransitionStep)myItem; + + /// + /// Duration + /// + int duration; + if (int.TryParse(lvi.Text, out duration) && duration > 0) + step.Duration = duration; + else + lvi.Text = step.Duration.ToString(); + + /// + /// Message + /// + if (lvi.SubItems[(int)Column.Message].Text.Length == 0) + step.Message = string.Empty; + else + step.Message = lvi.SubItems[(int)Column.Message].Text; + + /// + /// Condition + /// + step.EndCondition = "None"; /// When item text is "---" or a wrong value + for (int cix = 0; cix < conditionNames.Count; cix++) + { + if (lvi.SubItems[(int)Column.Condition].Text.Equals(conditionNames[cix])) + { + step.EndCondition = string.Format("{0}~{1}", conditionComponents[cix], conditionIDs[cix]); + break; + } + } + + /// Required for pumps with FM and valves + string valvesOpen = string.Empty; + string valvesClose = string.Empty; + + /// + /// Pumps with FM control + /// + string fmPumpsPcts = string.Empty; + int i = 0; + foreach (var valve in parent.Valves) + { + if (valve is BenchControl.GenericDevices.IPumpFM) + { + string lviSubitText = lvi.SubItems[fixedCount + i++].Text; + if (fmPumpsPcts.Length > 0) fmPumpsPcts += ";"; + float fdummy; + if (lviSubitText.Equals("---")) + { + fmPumpsPcts += lviSubitText; + } + else if (lviSubitText.Equals(Strings.dflt)) + { + fmPumpsPcts += lviSubitText; + if (valvesOpen != string.Empty) valvesOpen += ";"; + valvesOpen += valve.Cfg.Name; + } + else if (Utils.TryParseUFloat(lviSubitText, out fdummy) && (fdummy >= 0) && (fdummy <= 100.0f)) + { + fmPumpsPcts += lviSubitText; + if (fdummy > 0) + { + if (valvesOpen != string.Empty) valvesOpen += ";"; + valvesOpen += valve.Cfg.Name; + } + else + { + if (valvesClose != string.Empty) valvesClose += ";"; + valvesClose += valve.Cfg.Name; + } + } + } + } + step.PumpWithFMPcts = fmPumpsPcts; + + /// + /// Regulation valves + /// + string regulValvesPct = string.Empty; + for (int k = fixedCount + fmPumpCount; k < fixedCount + fmPumpCount + regvCount; k++) + { + if (regulValvesPct.Length > 0) regulValvesPct += ";"; + float fdummy; + if (lvi.SubItems[k].Text.Equals("---") || + (Utils.TryParseUFloat(lvi.SubItems[k].Text, out fdummy) && (fdummy >= 0) && (fdummy <= 100.0f))) + { + regulValvesPct += lvi.SubItems[k].Text; + } + } + step.RegulValvesPct = regulValvesPct; + + /// + /// Valves + /// + for (int j = 0, k = 0; j < parent.Valves.Count; j++) + { + if (!(parent.Valves[j] is BenchControl.GenericDevices.IPumpFM)) + { + string lviSubitText = lvi.SubItems[fixedCount + fmPumpCount + regvCount + k++].Text; + if (lviSubitText.Equals(Strings.open)) + { + if (valvesOpen != string.Empty) valvesOpen += ";"; + valvesOpen += parent.Valves[j].Cfg.Name; + } + if (lviSubitText.Equals(Strings.close)) + { + if (valvesClose != string.Empty) valvesClose += ";"; + valvesClose += parent.Valves[j].Cfg.Name; + } + } + } + step.ValvesOpen = valvesOpen; + step.ValvesClose = valvesClose; + } + + public void AddOne() + { + base.AddOne(new TransitionStep(MyItems.Count, sequence)); + } + + public new void RemoveSelected() + { + bool lastItemRemoved = base.RemoveSelected(); + if (lastItemRemoved && parent != null) + { + parent.UpdateButtonStates(SharedButtons.SelectedItemPos.None); + } + } + + public string GetWarningsBeforeSaving(ref Dictionary renmInfo) + { + return string.Empty; + } + + public void UpdateRelatedItems(Dictionary renameInfo) + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/UiControls/VirtualBenchStepsCtrl.cs b/TBF_V2/Sources/TBF/TBF/UiControls/VirtualBenchStepsCtrl.cs new file mode 100644 index 00000000..a846af34 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/UiControls/VirtualBenchStepsCtrl.cs @@ -0,0 +1,271 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System.Collections.Generic; +using System.Drawing; +using System.Windows.Forms; +using log4net; +using Config.Entities; +using TBF.BenchControl; +using TBF.BenchControl.GenericDevices; +using TBF.Resources; + +namespace TBF.UiControls +{ + public partial class VirtualBenchStepsCtrl : BaseWithListViewEx, ITabWithListViewEx + { + static readonly ILog log = LogManager.GetLogger(typeof(VirtualBenchStepsCtrl)); + + /// + /// Fixed ListViewEx columns + /// + enum Column + { + Duration, + FixedColumnsCount, + } + readonly int fixedCount = (int)Column.FixedColumnsCount; + + VirtualBenchSequence sequence; + + TransitionsDlg parent; + Control parentControl; + Control[] editors; + + int fmPumpCount; /// Number of pumps with FM control + int regvCount; /// Number of regulating valves + int vCount; /// Number of valves + + public VirtualBenchStepsCtrl() + : base() + { + } + + public void Initialize(VirtualBenchSequence sequence, TransitionsDlg parent, Control parentControl) + { + this.sequence = sequence; + this.parent = parent; + this.parentControl = parentControl; + Name = sequence.Name; + MyItems = sequence.VirtualBenchSteps; + + SubItemClicked += new Results.Forms.SubItemEventHandler(listViewEx_SubItemClicked); + SubItemRightClicked += new Results.Forms.SubItemEventHandler(listViewEx_SubItemRightClicked); + SubItemEndEditing += new Results.Forms.SubItemEndEditingEventHandler(listViewEx_SubItemEndEditing); + + vCount = 0; + fmPumpCount = 0; + regvCount = 0; + + /// + /// ListViewEx columns + /// + Columns.Add(Strings.Duration_s, 70 * parent.Dpi / PathsDlg.Dpi100pct); + //foreach (var vlv in parent.Valves) + //{ + // if (vlv is BenchControl.GenericDevices.IPumpFM) + // { + // Columns.Add(vlv.Cfg.Name + " [%]", 45 * parent.Dpi / PathsDlg.Dpi100pct); + // fmPumpCount++; + // } + //} + //foreach (var rvlv in parent.RegulValves) + //{ + // Columns.Add(rvlv.Cfg.Name + " [%]", 55 * parent.Dpi / PathsDlg.Dpi100pct); + //} + //foreach (var vlv in parent.Valves) + //{ + // if (!(vlv is BenchControl.GenericDevices.IPumpFM)) + // { + // Columns.Add(vlv.Cfg.Name, 40 * parent.Dpi / PathsDlg.Dpi100pct); + // vCount++; + // } + //} + + /// + /// Prepare valve combo-boxes + /// + editors = new Control[fixedCount + vCount + fmPumpCount + regvCount]; + + editors[0] = new TextBox(); /// Duration + editors[0].Visible = false; + parent.Controls.Add(editors[0]); + + //for (int i = fixedCount; i < fixedCount + fmPumpCount; i++) + //{ + // ComboBox cb = new ComboBox(); + // cb.Items.Add("---"); + // cb.Items.Add(Strings.dflt); + // cb.Items.Add("0"); + // cb.Items.Add("25"); + // cb.Items.Add("50"); + // cb.Items.Add("75"); + // cb.Items.Add("100"); + // editors[i] = cb; + // parent.Controls.Add(editors[i]); + //} + + //for (int i = fixedCount + fmPumpCount; i < fixedCount + fmPumpCount + regvCount; i++) + //{ + // ComboBox cb = new ComboBox(); + // cb.Items.Add("---"); + // cb.Items.Add("0"); + // cb.Items.Add("25"); + // cb.Items.Add("50"); + // cb.Items.Add("75"); + // cb.Items.Add("100"); + // editors[i] = cb; + // parent.Controls.Add(editors[i]); + //} + + //for (int i = fixedCount + fmPumpCount + regvCount; i < fixedCount + fmPumpCount + regvCount + vCount; i++) + //{ + // ComboBox cb = new ComboBox(); + // cb.Items.Add("---"); + // cb.Items.Add(Strings.open); + // cb.Items.Add(Strings.close); + // editors[i] = cb; + // parent.Controls.Add(cb); + //} + + base.RedrawAll(); + } + + void listViewEx_SubItemClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (!Unlocked || e.SubItem >= editors.Length) return; + StartEditing(editors[e.SubItem], e.Item, e.SubItem); + } + + void listViewEx_SubItemRightClicked(object sender, Results.Forms.SubItemEventArgs e) + { + if (!Unlocked || e.SubItem >= editors.Length) return; + + if (DialogResult.Yes == MessageBox.Show(Strings.Do_you_want_to_copy_this_value_to_all_cells_below_this_cell, + Strings.Confirmation, MessageBoxButtons.YesNo, MessageBoxIcon.Question)) + { + int columnNr = e.SubItem; + string value = null; + System.Drawing.Color backColor = System.Drawing.Color.White; + foreach (ListViewItem item in Items) + { + if (value != null && item.SubItems.Count > columnNr) + { + item.SubItems[columnNr].Text = value; + item.SubItems[columnNr].BackColor = backColor; + } + else if (item == e.Item) + { + value = item.SubItems[columnNr].Text; + backColor = item.SubItems[columnNr].BackColor; + } + } + } + } + + void listViewEx_SubItemEndEditing(object sender, Results.Forms.SubItemEndEditingEventArgs e) + { + if (e.SubItem == (int)Column.Duration) + { + int duration; + if (!int.TryParse(e.DisplayText, out duration) || duration <= 0) + { + e.DisplayText = e.Item.Text; + e.Cancel = true; + } + } + //else if ((e.SubItem >= fixedCount) && (e.SubItem < fixedCount + fmPumpCount)) + //{ + // float pct; + // if (!e.DisplayText.Equals("---") && + // !e.DisplayText.Equals(Strings.dflt) && + // !(Utils.TryParseUFloat(e.DisplayText, out pct) && (pct >= 0) && (pct <= 100.0f))) + // { + // e.DisplayText = e.Item.SubItems[e.SubItem].Text; + // e.Cancel = true; + // } + //} + //else if ((e.SubItem >= fixedCount + fmPumpCount) && (e.SubItem < fixedCount + fmPumpCount + regvCount)) + //{ + // float pct; + // if (!e.DisplayText.Equals("---") && + // !(Utils.TryParseUFloat(e.DisplayText, out pct) && (pct >= 0) && (pct <= 100.0f))) + // { + // e.DisplayText = e.Item.SubItems[e.SubItem].Text; + // e.Cancel = true; + // } + //} + //else if ((e.SubItem >= fixedCount + fmPumpCount + regvCount) && (e.SubItem < fixedCount + fmPumpCount + regvCount + vCount)) + //{ + // if ((e.DisplayText != Strings.open) && (e.DisplayText != Strings.close) && (e.DisplayText != "---")) + // { + // e.DisplayText = e.Item.SubItems[e.SubItem].Text; + // e.Cancel = true; + // } + //} + + if (e.SubItem >= fixedCount) + { + e.Item.SubItems[e.SubItem].BackColor = e.DisplayText == Strings.open ? Color.LightGray : Color.White; + } + } + + public override void DrawOne(object myItem) + { + VirtualBenchStep step = (VirtualBenchStep)myItem; + + ListViewItem lvi = new ListViewItem(step.Duration.ToString()); + + /// TODO: All the rest + + lvi.Tag = step; + + Items.Add(lvi); + } + + public override void UpdateOne(ListViewItem lvi, object myItem) + { + VirtualBenchStep step = (VirtualBenchStep)myItem; + + /// Duration + int duration; + if (int.TryParse(lvi.Text, out duration) && duration > 0) + { + step.Duration = duration; + } + else + { + lvi.Text = step.Duration.ToString(); + } + + // TODO: Replace the following: + //step.PumpWithFMPcts = fmPumpsPcts; + //step.RegulValvesPct = regulValvesPct; + //step.ValvesOpen = valvesOpen; + //step.ValvesClose = valvesClose; + } + + public void AddOne() + { + base.AddOne(new VirtualBenchStep(MyItems.Count, sequence)); + } + + public new void RemoveSelected() + { + bool lastItemRemoved = base.RemoveSelected(); + if (lastItemRemoved && parent != null) + { + parent.UpdateButtonStates(SharedButtons.SelectedItemPos.None); + } + } + + public string GetWarningsBeforeSaving(ref Dictionary renmInfo) + { + return string.Empty; + } + + public void UpdateRelatedItems(Dictionary renameInfo) + { + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/Utils.cs b/TBF_V2/Sources/TBF/TBF/Utils.cs new file mode 100644 index 00000000..2c1575ca --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/Utils.cs @@ -0,0 +1,388 @@ +/// +/// Copyright (c) 2013-2015 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using Config.Entities; +using Dirichlet.Numerics; + +namespace TBF +{ + public class Utils + { + /// + /// Parse unsigned float + /// + public static bool TryParseUFloat(string text, out float result) + { + return float.TryParse(text, NumberStyles.AllowDecimalPoint, CultureInfo.CurrentCulture, out result) || + float.TryParse(text, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out result) || + (Program.AltCulture != null && float.TryParse(text, NumberStyles.AllowDecimalPoint, Program.AltCulture, out result)); + + } + public static float ParseUFloat(string text, float dfltVal) + { + float result; + if (float.TryParse(text, NumberStyles.AllowDecimalPoint, CultureInfo.CurrentCulture, out result)) return result; + if (float.TryParse(text, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out result)) return result; + if (Program.AltCulture != null && float.TryParse(text, NumberStyles.AllowDecimalPoint, Program.AltCulture, out result)) return result; + return dfltVal; + } + public static float ParseUFloat(string text) + { + return ParseUFloat(text, 0); + } + + /// + /// Parse float, sign allowed + /// + public static bool TryParseSFloat(string text, out float result) + { + return float.TryParse(text, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, CultureInfo.CurrentCulture, out result) || + float.TryParse(text, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out result) || + (Program.AltCulture != null && float.TryParse(text, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, Program.AltCulture, out result)); + } + public static float ParseSFloat(string text, float dfltVal) + { + float result; + if (float.TryParse(text, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, CultureInfo.CurrentCulture, out result)) return result; + if (float.TryParse(text, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out result)) return result; + if (Program.AltCulture != null && float.TryParse(text, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, Program.AltCulture, out result)) return result; + return dfltVal; + } + public static float ParseSFloat(string text) + { + return ParseSFloat(text, 0); + } + + /// + /// Parse float, sign allowed, exponent allowed + /// + public static bool TryParseEFloat(string text, out float result) + { + return float.TryParse(text, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowExponent, CultureInfo.CurrentCulture, out result) || + float.TryParse(text, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowExponent, CultureInfo.InvariantCulture, out result) || + (Program.AltCulture != null && float.TryParse(text, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowExponent, Program.AltCulture, out result)); + } + public static float ParseEFloat(string text, float dfltVal) + { + float result; + if (float.TryParse(text, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowExponent, CultureInfo.CurrentCulture, out result)) return result; + if (float.TryParse(text, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowExponent, CultureInfo.InvariantCulture, out result)) return result; + if (Program.AltCulture != null && float.TryParse(text, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowExponent, Program.AltCulture, out result)) return result; + return dfltVal; + } + public static float ParseEFloat(string text) + { + return ParseEFloat(text, 0); + } + + + /// + /// Parse unsigned double + /// + public static bool TryParseUDouble(string text, out double result) + { + return double.TryParse(text, NumberStyles.AllowDecimalPoint, CultureInfo.CurrentCulture, out result) || + double.TryParse(text, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out result) || + (Program.AltCulture != null && double.TryParse(text, NumberStyles.AllowDecimalPoint, Program.AltCulture, out result)); + + } + public static double ParseUDouble(string text, double dfltVal) + { + double result; + if (double.TryParse(text, NumberStyles.AllowDecimalPoint, CultureInfo.CurrentCulture, out result)) return result; + if (double.TryParse(text, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out result)) return result; + if (Program.AltCulture != null && double.TryParse(text, NumberStyles.AllowDecimalPoint, Program.AltCulture, out result)) return result; + return dfltVal; + } + public static double ParseUDouble(string text) + { + return ParseUDouble(text, 0); + } + + /// + /// Parse double, sign allowed + /// + public static bool TryParseSDouble(string text, out double result) + { + return double.TryParse(text, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, CultureInfo.CurrentCulture, out result) || + double.TryParse(text, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out result) || + (Program.AltCulture != null && double.TryParse(text, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, Program.AltCulture, out result)); + } + public static double ParseSDouble(string text, double dfltVal) + { + double result; + if (double.TryParse(text, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, CultureInfo.CurrentCulture, out result)) return result; + if (double.TryParse(text, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out result)) return result; + if (Program.AltCulture != null && double.TryParse(text, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, Program.AltCulture, out result)) return result; + return dfltVal; + } + public static double ParseSDouble(string text) + { + return ParseSDouble(text, 0); + } + + /// + /// Parse double, sign allowed, exponent allowed + /// + public static bool TryParseEDouble(string text, out double result) + { + return double.TryParse(text, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowExponent, CultureInfo.CurrentCulture, out result) || + double.TryParse(text, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowExponent, CultureInfo.InvariantCulture, out result) || + (Program.AltCulture != null && double.TryParse(text, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowExponent, Program.AltCulture, out result)); + } + public static double ParseEDouble(string text, double dfltVal) + { + double result; + if (double.TryParse(text, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowExponent, CultureInfo.CurrentCulture, out result)) return result; + if (double.TryParse(text, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowExponent, CultureInfo.InvariantCulture, out result)) return result; + if (Program.AltCulture != null && double.TryParse(text, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowExponent, Program.AltCulture, out result)) return result; + return dfltVal; + } + public static double ParseEDouble(string text) + { + return ParseEDouble(text, 0); + } + + + /// + /// Get a list of IValve-s from an entity implementing IHasValves + /// + /// Entity implementing IHasValves + /// A list of IValves + public static IList ValvesOpen(IHasValves entity) + { + var valvesOpen = new List(); + if (entity != null && entity.ValvesOpen != null && entity.ValvesOpen != string.Empty) + { + string[] vOpen = entity.ValvesOpen.Split(new char[] { ';' }); + foreach (var vName in vOpen) + { + valvesOpen.Add((BenchControl.GenericDevices.IValve)BenchControl.TbfComponents.FindComponent(vName)); + } + } + return valvesOpen; + } + + /// + /// Get a list of IValve-s from an entity implementing IHasValves + /// + /// Entity implementing IHasValves + /// A list of IValves + public static IList ValvesClose(IHasValves entity) + { + var valvesClose = new List(); + if (entity != null && entity.ValvesClose != null && entity.ValvesClose != string.Empty) + { + string[] vClose = entity.ValvesClose.Split(new char[] { ';' }); + foreach (var vName in vClose) + { + valvesClose.Add((BenchControl.GenericDevices.IValve)BenchControl.TbfComponents.FindComponent(vName)); + } + } + return valvesClose; + } + + + /// + /// Get an array of RegulValve positions from a TransitionStep entity + /// + /// TransitionStep entity + /// float[] of regulation valve positions from 0 to 100.0f + public static float[] GetRegulValvesPositions(TransitionStep step) + { + int regvCount = BenchControl.Sequences.SequenceBase.RegulValves.Count; + float[] result = new float[regvCount]; + + string[] rvPosStr = (step.RegulValvesPct != null) ? step.RegulValvesPct.Split(new char[] { ';' }) : new string[0]; + for (int i = 0; i < regvCount; i++) + { + float fdummy; + if ((i < rvPosStr.Length) && Utils.TryParseUFloat(rvPosStr[i], out fdummy) && + (fdummy >= 0) && (fdummy <= 100.0f)) + { + result[i] = fdummy; + } + else // if ((i < rvPosStr.Length) && rvPosStr[i].Equals("---")) + { + result[i] = -1.0f; /// Negative value means no regulation valve position change + } + } + + return result; + } + + + /// + /// Get an array of Pump-With-FM power percentages from a TransitionStep entity + /// + /// TransitionStep entity + /// float[] of FM-pump power percentages from 0 to 100.0f + public static float[] GetPumpWithFMPcts(TransitionStep step) + { + int fmPumpCount = BenchControl.Sequences.SequenceBase.PumpsWithFM.Count; + float[] result = new float[fmPumpCount]; + + string[] fmPctsStr = (step.PumpWithFMPcts != null) ? step.PumpWithFMPcts.Split(new char[] { ';' }) : new string[0]; + for (int i = 0; i < fmPumpCount; i++) + { + float fdummy; + if ((i < fmPctsStr.Length) && Utils.TryParseUFloat(fmPctsStr[i], out fdummy) && + (fdummy >= 0) && (fdummy <= 100.0f)) + { + result[i] = fdummy; + } + else if ((i < fmPctsStr.Length) && fmPctsStr[i].Equals("Dflt")) + { + result[i] = -2.0f; /// This value means default pump power defined by the Test parameter + } + else //if ((i < rvPosStr.Length) && rvPosStr[i].Equals("---")) + { + result[i] = -1.0f; /// This value means no pump power change + } + } + + return result; + } + + /// + /// To prepare the last argument of GetSortedTestResults() and GetDecoratedTestNames() functions + /// + /// Watermeter nr. (1-based) + /// Meter: false=standard, true=combined + /// Part nr. of the meter + public static int PartNr(int wmNr1, bool combined) + { + if (wmNr1 == 0) return 0; + + if (combined) return wmNr1; + + int wmPartSize = 1 + (wmNr1 - 1) / Config.Data.LineSize; + return wmPartSize; + } + + /// + /// Return test title for a given test and a repetition number + /// + /// Test entity + /// 1 .. Nr. repetitions + /// Test title (string) + public static string TestTitle(Test test, int repetitonNr) + { + if (test.Repeats == 1) + { + if (test.Part == 0) + { + return test.Name; /// Single test + } + else + { + return string.Format("{0} ({1})", test.Name, test.Part); /// A part of a single test + } + } + else + { + /// More test repetitions + return string.Format("{0} ({1}/{2})", test.Name, repetitonNr, test.Repeats); + } + } + + /// + /// Return test title for a given test data and a repetition number + /// + /// TestData entity + /// 1 .. Nr. repetitions + /// Test title (string) + public static string TestTitle(Results.Entities.TestData testData, int repetitonNr) + { + if (testData.Repeats == 1) + { + return testData.Name; /// Single test + } + else + { + return string.Format("{0} ({1}/{2})", testData.Name, repetitonNr, testData.Repeats); /// More test repetitions + } + } + + /// + /// Converts number to a string with the specified number of significant digits + /// + /// Float value to be converted to a string + /// Number of significant digits: 5, 4, 3, 2 or 1 (otherwise a full precision number is printed) + /// String representation of a float number + public static string FloatToStr(float value, int significantDigits) + { + return DoubleToStr(value, significantDigits); + } + public static string FloatToStr(float value, int significantDigits, bool altCulture) + { + return DoubleToStr(value, significantDigits, altCulture); + } + public static string DoubleToStr(double value, int significantDigits) + { + return DoubleToStr(value, significantDigits, false); + } + + /// + /// Converts a double number to a string with the specified number of significant digits + /// + /// Double value to be converted to a string + /// Number of significant digits: 5, 4, 3, 2 or 1 (otherwise a full precision number is printed) + /// true = use alternative culture (use decimal comma) + /// String representation of a double number + public static string DoubleToStr(double value, int significantDigits, bool altCulture) + { + if (-float.Epsilon <= value && value <= float.Epsilon) + { + return "0"; + } + else if (significantDigits <= 5) + { + string fmt = Config.Utils.SignificantDigitsToFmt(value, significantDigits); + return altCulture ? value.ToString(fmt, Program.AltCulture) : value.ToString(fmt); + } + else + { + return altCulture ? value.ToString(Program.AltCulture) : value.ToString(); + } + } + + public static string RouteToStr(UInt128 route) + { + return string.Format("{0}-{1} {2}-{3}-{4}-{5}", ((route >> 80) & 0xFFFF).ToString("X4"), /// 0 + ((route >> 64) & 0xFFFF).ToString("X4"), /// 1 + ((route >> 48) & 0xFFFF).ToString("X4"), /// 2 + ((route >> 32) & 0xFFFF).ToString("X4"), /// 3 + ((route >> 16) & 0xFFFF).ToString("X4"), /// 4 + (route & 0xFFFF).ToString("X4")); /// 5 + } + + public static string ToMyString(DateTime dateTime) + { + return string.Format("{0}{1}{2}_{3}{4}", + dateTime.Year, + dateTime.Month.ToString("D2"), + dateTime.Day.ToString("D2"), + dateTime.Hour.ToString("D2"), + dateTime.Minute.ToString("D2")); + } + + public static bool IsGoodFName(string fname) + { + return !fname.Contains('\\') && + !fname.Contains('/') && + !fname.Contains(':') && + !fname.Contains('*') && + !fname.Contains('?') && + !fname.Contains('"') && + !fname.Contains('<') && + !fname.Contains('>') && + !fname.Contains('|'); + } + } +} diff --git a/TBF_V2/Sources/TBF/TBF/app.config b/TBF_V2/Sources/TBF/TBF/app.config new file mode 100644 index 00000000..86fcc8b7 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/app.config @@ -0,0 +1,6 @@ + + + + + + diff --git a/TBF_V2/Sources/TBF/TBF/packages.config b/TBF_V2/Sources/TBF/TBF/packages.config new file mode 100644 index 00000000..671236a8 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBF/packages.config @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/TBF/pic/flowmeter.png b/TBF_V2/Sources/TBF/TBF/pic/flowmeter.png new file mode 100644 index 00000000..ac90b6ae Binary files /dev/null and b/TBF_V2/Sources/TBF/TBF/pic/flowmeter.png differ diff --git a/TBF_V2/Sources/TBF/TBF/pic/regulvalve.png b/TBF_V2/Sources/TBF/TBF/pic/regulvalve.png new file mode 100644 index 00000000..59e0f5c9 Binary files /dev/null and b/TBF_V2/Sources/TBF/TBF/pic/regulvalve.png differ diff --git a/TBF_V2/Sources/TBF/TBF/pic/reservoir.png b/TBF_V2/Sources/TBF/TBF/pic/reservoir.png new file mode 100644 index 00000000..ad2bbac7 Binary files /dev/null and b/TBF_V2/Sources/TBF/TBF/pic/reservoir.png differ diff --git a/TBF_V2/Sources/TBF/TBF/pic/valve-closed.png b/TBF_V2/Sources/TBF/TBF/pic/valve-closed.png new file mode 100644 index 00000000..e591572c Binary files /dev/null and b/TBF_V2/Sources/TBF/TBF/pic/valve-closed.png differ diff --git a/TBF_V2/Sources/TBF/TBF/pic/valve-open.png b/TBF_V2/Sources/TBF/TBF/pic/valve-open.png new file mode 100644 index 00000000..1135c50d Binary files /dev/null and b/TBF_V2/Sources/TBF/TBF/pic/valve-open.png differ diff --git a/TBF_V2/Sources/TBF/TBF/pic/watermeter.png b/TBF_V2/Sources/TBF/TBF/pic/watermeter.png new file mode 100644 index 00000000..31df9ab2 Binary files /dev/null and b/TBF_V2/Sources/TBF/TBF/pic/watermeter.png differ diff --git a/TBF_V2/Sources/TBF/TBFSetup/TBFSetup.vdproj b/TBF_V2/Sources/TBF/TBFSetup/TBFSetup.vdproj new file mode 100644 index 00000000..09e53d86 --- /dev/null +++ b/TBF_V2/Sources/TBF/TBFSetup/TBFSetup.vdproj @@ -0,0 +1,1444 @@ +"DeployProject" +{ +"VSVersion" = "3:800" +"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}" +"IsWebType" = "8:FALSE" +"ProjectName" = "8:TBFSetup" +"LanguageId" = "3:1031" +"CodePage" = "3:1252" +"UILanguageId" = "3:1031" +"SccProjectName" = "8:" +"SccLocalPath" = "8:" +"SccAuxPath" = "8:" +"SccProvider" = "8:" + "Hierarchy" + { + "Entry" + { + "MsmKey" = "8:_043C6A80BCC670942A72501E2EE84703" + "OwnerKey" = "8:_DEB8C3F405014A3C9E16DB622E3ADAA3" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_23F1CC0D8B6AF8F91B2A7070C5B7AE31" + "OwnerKey" = "8:_DEB8C3F405014A3C9E16DB622E3ADAA3" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_23F1CC0D8B6AF8F91B2A7070C5B7AE31" + "OwnerKey" = "8:_043C6A80BCC670942A72501E2EE84703" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_23F1CC0D8B6AF8F91B2A7070C5B7AE31" + "OwnerKey" = "8:_FF6BF68B28099618A0126A3EB1DAED35" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_283A6E24D61E03A025CAA05070E40C02" + "OwnerKey" = "8:_DEB8C3F405014A3C9E16DB622E3ADAA3" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_328013E6099F40CE0D297D6D8E721AA1" + "OwnerKey" = "8:_B08A4A98A96A64B48235C5B8F14DC0DA" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_328013E6099F40CE0D297D6D8E721AA1" + "OwnerKey" = "8:_DEB8C3F405014A3C9E16DB622E3ADAA3" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_328013E6099F40CE0D297D6D8E721AA1" + "OwnerKey" = "8:_425D09E1DEE0BE9FDA22562C97B6583D" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_425D09E1DEE0BE9FDA22562C97B6583D" + "OwnerKey" = "8:_B08A4A98A96A64B48235C5B8F14DC0DA" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_425D09E1DEE0BE9FDA22562C97B6583D" + "OwnerKey" = "8:_DEB8C3F405014A3C9E16DB622E3ADAA3" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_4BA45D5F5FF94462B5A1570EE26FAC2D" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_7B5851865AFE4C17A02FBD07C31F4D14" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_890B3B7A50ACB2A808B8E0F55F28E03A" + "OwnerKey" = "8:_DEB8C3F405014A3C9E16DB622E3ADAA3" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_898989B0B45C4163A991395483ACF598" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_A1B42674559342099A330E0C5AC4D92C" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_AE60F46605F78EEB772FD76B1DFE8A9B" + "OwnerKey" = "8:_DEB8C3F405014A3C9E16DB622E3ADAA3" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_AE60F46605F78EEB772FD76B1DFE8A9B" + "OwnerKey" = "8:_890B3B7A50ACB2A808B8E0F55F28E03A" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_B08A4A98A96A64B48235C5B8F14DC0DA" + "OwnerKey" = "8:_DEB8C3F405014A3C9E16DB622E3ADAA3" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_D0DA6A8DDCCE4EAEA7B5CC962D3A080A" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_DEB8C3F405014A3C9E16DB622E3ADAA3" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_EFA7D555FCA3168E5305C2ACB9D46055" + "OwnerKey" = "8:_DEB8C3F405014A3C9E16DB622E3ADAA3" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_FF6BF68B28099618A0126A3EB1DAED35" + "OwnerKey" = "8:_DEB8C3F405014A3C9E16DB622E3ADAA3" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_FF6BF68B28099618A0126A3EB1DAED35" + "OwnerKey" = "8:_043C6A80BCC670942A72501E2EE84703" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_DEB8C3F405014A3C9E16DB622E3ADAA3" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_23F1CC0D8B6AF8F91B2A7070C5B7AE31" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_890B3B7A50ACB2A808B8E0F55F28E03A" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_AE60F46605F78EEB772FD76B1DFE8A9B" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_283A6E24D61E03A025CAA05070E40C02" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_EFA7D555FCA3168E5305C2ACB9D46055" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_B08A4A98A96A64B48235C5B8F14DC0DA" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_425D09E1DEE0BE9FDA22562C97B6583D" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_328013E6099F40CE0D297D6D8E721AA1" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_043C6A80BCC670942A72501E2EE84703" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_FF6BF68B28099618A0126A3EB1DAED35" + "MsmSig" = "8:_UNDEFINED" + } + } + "Configurations" + { + "Debug" + { + "DisplayName" = "8:Debug" + "IsDebugOnly" = "11:TRUE" + "IsReleaseOnly" = "11:FALSE" + "OutputFilename" = "8:Debug\\Setup1.msi" + "PackageFilesAs" = "3:2" + "PackageFileSize" = "3:-2147483648" + "CabType" = "3:1" + "Compression" = "3:2" + "SignOutput" = "11:FALSE" + "CertificateFile" = "8:" + "PrivateKeyFile" = "8:" + "TimeStampServer" = "8:" + "InstallerBootstrapper" = "3:2" + "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}" + { + "Enabled" = "11:TRUE" + "PromptEnabled" = "11:TRUE" + "PrerequisitesLocation" = "2:1" + "Url" = "8:" + "ComponentsUrl" = "8:" + "Items" + { + "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:.NETFramework,Version=v4.0,Profile=Client" + { + "Name" = "8:Microsoft .NET Framework 4 Client Profile (x86 and x64)" + "ProductCode" = "8:.NETFramework,Version=v4.0,Profile=Client" + } + "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Windows.Installer.3.1" + { + "Name" = "8:Windows Installer 3.1" + "ProductCode" = "8:Microsoft.Windows.Installer.3.1" + } + } + } + } + "Release" + { + "DisplayName" = "8:Release" + "IsDebugOnly" = "11:FALSE" + "IsReleaseOnly" = "11:TRUE" + "OutputFilename" = "8:Release\\TestBenchFramework.msi" + "PackageFilesAs" = "3:2" + "PackageFileSize" = "3:-2147483648" + "CabType" = "3:1" + "Compression" = "3:2" + "SignOutput" = "11:FALSE" + "CertificateFile" = "8:" + "PrivateKeyFile" = "8:" + "TimeStampServer" = "8:" + "InstallerBootstrapper" = "3:2" + "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}" + { + "Enabled" = "11:TRUE" + "PromptEnabled" = "11:TRUE" + "PrerequisitesLocation" = "2:1" + "Url" = "8:" + "ComponentsUrl" = "8:" + "Items" + { + "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:.NETFramework,Version=v4.0" + { + "Name" = "8:Microsoft .NET Framework 4 (x86 and x64)" + "ProductCode" = "8:.NETFramework,Version=v4.0" + } + "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Windows.Installer.3.1" + { + "Name" = "8:Windows Installer 3.1" + "ProductCode" = "8:Microsoft.Windows.Installer.3.1" + } + } + } + } + } + "Deployable" + { + "CustomAction" + { + } + "DefaultFeature" + { + "Name" = "8:DefaultFeature" + "Title" = "8:" + "Description" = "8:" + } + "ExternalPersistence" + { + "LaunchCondition" + { + "{A06ECF26-33A3-4562-8140-9B0E340D4F24}:_7D48DA36B42B4C5B806ABE60A1581562" + { + "Name" = "8:.NET Framework" + "Message" = "8:[VSDNETMSG]" + "FrameworkVersion" = "8:.NETFramework,Version=v4.0,Profile=Client" + "AllowLaterVersions" = "11:FALSE" + "InstallUrl" = "8:http://go.microsoft.com/fwlink/?LinkId=131000" + } + } + } + "File" + { + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_043C6A80BCC670942A72501E2EE84703" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:ControlComponent3U, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_043C6A80BCC670942A72501E2EE84703" + { + "Name" = "8:ControlComponent3U.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:ControlComponent3U.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_15E376F61DCB49478B2D1D4AA3BF1643" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_23F1CC0D8B6AF8F91B2A7070C5B7AE31" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:Microsoft.VisualBasic.PowerPacks.Vs, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_23F1CC0D8B6AF8F91B2A7070C5B7AE31" + { + "Name" = "8:Microsoft.VisualBasic.PowerPacks.Vs.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Microsoft.VisualBasic.PowerPacks.Vs.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_15E376F61DCB49478B2D1D4AA3BF1643" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_283A6E24D61E03A025CAA05070E40C02" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:MySql.Data, Version=6.6.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_283A6E24D61E03A025CAA05070E40C02" + { + "Name" = "8:MySql.Data.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:MySql.Data.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_15E376F61DCB49478B2D1D4AA3BF1643" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_328013E6099F40CE0D297D6D8E721AA1" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:Iesi.Collections, Version=1.0.1.0, Culture=neutral, PublicKeyToken=aa95f207798dfdb4, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_328013E6099F40CE0D297D6D8E721AA1" + { + "Name" = "8:Iesi.Collections.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Iesi.Collections.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_15E376F61DCB49478B2D1D4AA3BF1643" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_425D09E1DEE0BE9FDA22562C97B6583D" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:NHibernate, Version=3.3.1.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_425D09E1DEE0BE9FDA22562C97B6583D" + { + "Name" = "8:NHibernate.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:NHibernate.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_15E376F61DCB49478B2D1D4AA3BF1643" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_4BA45D5F5FF94462B5A1570EE26FAC2D" + { + "SourcePath" = "8:..\\TestBenchFramework\\SampleConfig\\log4netConfig.xml" + "TargetName" = "8:log4netConfig.xml" + "Tag" = "8:" + "Folder" = "8:_19315A9D87AF4099AD89D23EFEADFF58" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_7B5851865AFE4C17A02FBD07C31F4D14" + { + "SourcePath" = "8:..\\TestBenchFramework\\x64\\SQLite.Interop.dll" + "TargetName" = "8:SQLite.Interop.dll" + "Tag" = "8:" + "Folder" = "8:_9035ED222B1641F2B645BE5910EB7CC6" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_890B3B7A50ACB2A808B8E0F55F28E03A" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:System.Data.SQLite.Linq, Version=1.0.90.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_890B3B7A50ACB2A808B8E0F55F28E03A" + { + "Name" = "8:System.Data.SQLite.Linq.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:System.Data.SQLite.Linq.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_15E376F61DCB49478B2D1D4AA3BF1643" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_898989B0B45C4163A991395483ACF598" + { + "SourcePath" = "8:..\\TestBenchFramework\\x86\\SQLite.Interop.dll" + "TargetName" = "8:SQLite.Interop.dll" + "Tag" = "8:" + "Folder" = "8:_C60FBB52E7A44F19BE31A90A0D376DE5" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_A1B42674559342099A330E0C5AC4D92C" + { + "SourcePath" = "8:..\\TestBenchFramework\\SampleConfig\\config.xml" + "TargetName" = "8:config.xml" + "Tag" = "8:" + "Folder" = "8:_19315A9D87AF4099AD89D23EFEADFF58" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_AE60F46605F78EEB772FD76B1DFE8A9B" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:System.Data.SQLite, Version=1.0.90.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_AE60F46605F78EEB772FD76B1DFE8A9B" + { + "Name" = "8:System.Data.SQLite.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:System.Data.SQLite.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_15E376F61DCB49478B2D1D4AA3BF1643" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_B08A4A98A96A64B48235C5B8F14DC0DA" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:FluentNHibernate, Version=1.3.0.733, Culture=neutral, PublicKeyToken=8aa435e3cb308880, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_B08A4A98A96A64B48235C5B8F14DC0DA" + { + "Name" = "8:FluentNHibernate.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:FluentNHibernate.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_15E376F61DCB49478B2D1D4AA3BF1643" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_D0DA6A8DDCCE4EAEA7B5CC962D3A080A" + { + "SourcePath" = "8:..\\TestBenchFramework\\SampleConfig\\SQLite.db" + "TargetName" = "8:SQLite.db" + "Tag" = "8:" + "Folder" = "8:_19315A9D87AF4099AD89D23EFEADFF58" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_EFA7D555FCA3168E5305C2ACB9D46055" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:log4net, Version=1.2.12.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_EFA7D555FCA3168E5305C2ACB9D46055" + { + "Name" = "8:log4net.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:log4net.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_15E376F61DCB49478B2D1D4AA3BF1643" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_FF6BF68B28099618A0126A3EB1DAED35" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:GaugeIndicator, Version=1.0.0.1, Culture=neutral, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_FF6BF68B28099618A0126A3EB1DAED35" + { + "Name" = "8:GaugeIndicator.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:GaugeIndicator.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_15E376F61DCB49478B2D1D4AA3BF1643" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + } + "FileType" + { + } + "Folder" + { + "{3C67513D-01DD-4637-8A68-80971EB9504F}:_15E376F61DCB49478B2D1D4AA3BF1643" + { + "DefaultLocation" = "8:[ProgramFilesFolder][Manufacturer]\\[ProductName]" + "Name" = "8:#1925" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:TARGETDIR" + "Folders" + { + "{9EF0B969-E518-4E46-987F-47570745A589}:_19315A9D87AF4099AD89D23EFEADFF58" + { + "Name" = "8:SampleConfig" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:_ABCF08C606F341FCA505AC9ABFD5F89F" + "Folders" + { + } + } + "{9EF0B969-E518-4E46-987F-47570745A589}:_9035ED222B1641F2B645BE5910EB7CC6" + { + "Name" = "8:x64" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:_15F2276452F94B6981E263B8B7F6F2EA" + "Folders" + { + } + } + "{9EF0B969-E518-4E46-987F-47570745A589}:_C60FBB52E7A44F19BE31A90A0D376DE5" + { + "Name" = "8:x86" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:_F2A8FFF674364AEFB94E4E0E0F37A4B3" + "Folders" + { + } + } + } + } + "{1525181F-901A-416C-8A58-119130FE478E}:_239AA733EB2143EB8CA44BF70E87B8C0" + { + "Name" = "8:#1916" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:DesktopFolder" + "Folders" + { + } + } + "{1525181F-901A-416C-8A58-119130FE478E}:_DEC3421EED6148A6B6857DFB5D000597" + { + "Name" = "8:#1919" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:ProgramMenuFolder" + "Folders" + { + } + } + } + "LaunchCondition" + { + } + "Locator" + { + } + "MsiBootstrapper" + { + "LangId" = "3:1031" + "RequiresElevation" = "11:FALSE" + } + "Product" + { + "Name" = "8:Microsoft Visual Studio" + "ProductName" = "8:TestBenchFramework" + "ProductCode" = "8:{9041D2C0-3100-4816-8DEE-E6DE9C271E71}" + "PackageCode" = "8:{593ACBEE-4B83-4ED6-BD71-9E36061B3667}" + "UpgradeCode" = "8:{B4C65EC8-E0B8-4D5F-863C-6AC07A114A88}" + "AspNetVersion" = "8:4.0.30319.0" + "RestartWWWService" = "11:FALSE" + "RemovePreviousVersions" = "11:FALSE" + "DetectNewerInstalledVersion" = "11:TRUE" + "InstallAllUsers" = "11:FALSE" + "ProductVersion" = "8:1.0.0" + "Manufacturer" = "8:Sensus" + "ARPHELPTELEPHONE" = "8:" + "ARPHELPLINK" = "8:" + "Title" = "8:TestBenchFramework" + "Subject" = "8:" + "ARPCONTACT" = "8:Sensus" + "Keywords" = "8:" + "ARPCOMMENTS" = "8:" + "ARPURLINFOABOUT" = "8:" + "ARPPRODUCTICON" = "8:" + "ARPIconIndex" = "3:0" + "SearchPath" = "8:" + "UseSystemSearchPath" = "11:TRUE" + "TargetPlatform" = "3:0" + "PreBuildEvent" = "8:" + "PostBuildEvent" = "8:" + "RunPostBuildEvent" = "3:0" + } + "Registry" + { + "HKLM" + { + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_E36C944AD28D443F857C28D0879C93E0" + { + "Name" = "8:Software" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_FEB9BE0D71EF42AB81A090C53EF4D43F" + { + "Name" = "8:[Manufacturer]" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + } + "Values" + { + } + } + } + "Values" + { + } + } + } + } + "HKCU" + { + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_CDD304D340C64940981928ED484C7BE2" + { + "Name" = "8:Software" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_2EE1D21B99974636B82D3C33A3316C72" + { + "Name" = "8:[Manufacturer]" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + } + "Values" + { + } + } + } + "Values" + { + } + } + } + } + "HKCR" + { + "Keys" + { + } + } + "HKU" + { + "Keys" + { + } + } + "HKPU" + { + "Keys" + { + } + } + } + "Sequences" + { + } + "Shortcut" + { + "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_0B7A7707CF9248659A38D74F6E905B89" + { + "Name" = "8:Shortcut to Primary output from TBF (Active)" + "Arguments" = "8:" + "Description" = "8:" + "ShowCmd" = "3:1" + "IconIndex" = "3:0" + "Transitive" = "11:FALSE" + "Target" = "8:_DEB8C3F405014A3C9E16DB622E3ADAA3" + "Folder" = "8:_15E376F61DCB49478B2D1D4AA3BF1643" + "WorkingFolder" = "8:_15E376F61DCB49478B2D1D4AA3BF1643" + "Icon" = "8:" + "Feature" = "8:" + } + "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_794AB96145AD4405ACE0EC46F244A8A4" + { + "Name" = "8:Test Bench Framework" + "Arguments" = "8:" + "Description" = "8:" + "ShowCmd" = "3:1" + "IconIndex" = "3:0" + "Transitive" = "11:FALSE" + "Target" = "8:_DEB8C3F405014A3C9E16DB622E3ADAA3" + "Folder" = "8:_DEC3421EED6148A6B6857DFB5D000597" + "WorkingFolder" = "8:_15E376F61DCB49478B2D1D4AA3BF1643" + "Icon" = "8:" + "Feature" = "8:" + } + "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_FDABF3BA4E9D4EE0973839A92C645C73" + { + "Name" = "8:Test Bench Framework" + "Arguments" = "8:" + "Description" = "8:" + "ShowCmd" = "3:1" + "IconIndex" = "3:0" + "Transitive" = "11:FALSE" + "Target" = "8:_DEB8C3F405014A3C9E16DB622E3ADAA3" + "Folder" = "8:_239AA733EB2143EB8CA44BF70E87B8C0" + "WorkingFolder" = "8:_15E376F61DCB49478B2D1D4AA3BF1643" + "Icon" = "8:" + "Feature" = "8:" + } + } + "UserInterface" + { + "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_08DF1CCB2D50467381CED0EB2C683743" + { + "UseDynamicProperties" = "11:FALSE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdBasicDialogs.wim" + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_0A0CA6ED1B92415CB35182B7B865A8FE" + { + "Name" = "8:#1902" + "Sequence" = "3:1" + "Attributes" = "3:3" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_3612B3D2670A40CB8A445041A253B385" + { + "Sequence" = "3:100" + "DisplayName" = "8:Finished" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdFinishedDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "UpdateText" + { + "Name" = "8:UpdateText" + "DisplayName" = "8:#1058" + "Description" = "8:#1158" + "Type" = "3:15" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1258" + "DefaultValue" = "8:#1258" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_55783492191E4774830A5BCCB9F64FA0" + { + "Name" = "8:#1901" + "Sequence" = "3:2" + "Attributes" = "3:2" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_36F602B5E9054C99A8F72BE2713B04BE" + { + "Sequence" = "3:100" + "DisplayName" = "8:Progress" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminProgressDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "ShowProgress" + { + "Name" = "8:ShowProgress" + "DisplayName" = "8:#1009" + "Description" = "8:#1109" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_650D8AA300504F2DA676F39A65DDF579" + { + "Name" = "8:#1900" + "Sequence" = "3:2" + "Attributes" = "3:1" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_2C7C9252312B49839118F14D43D58109" + { + "Sequence" = "3:200" + "DisplayName" = "8:Installation Folder" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminFolderDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_616009F70B794A0BA46604F7C20D5312" + { + "Sequence" = "3:300" + "DisplayName" = "8:Confirm Installation" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminConfirmDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_D2FB2C83836E4602A3A862A3FDB749C0" + { + "Sequence" = "3:100" + "DisplayName" = "8:Welcome" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminWelcomeDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "CopyrightWarning" + { + "Name" = "8:CopyrightWarning" + "DisplayName" = "8:#1002" + "Description" = "8:#1102" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1202" + "DefaultValue" = "8:#1202" + "UsePlugInResources" = "11:TRUE" + } + "Welcome" + { + "Name" = "8:Welcome" + "DisplayName" = "8:#1003" + "Description" = "8:#1103" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1203" + "DefaultValue" = "8:#1203" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_7C99DD96B1C7487A9F743990A1114028" + { + "UseDynamicProperties" = "11:FALSE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdUserInterface.wim" + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_824B7E4BF24C466A87B87D17CC65D4AF" + { + "Name" = "8:#1901" + "Sequence" = "3:1" + "Attributes" = "3:2" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_2E3FC737908C4857A264A8B98116ABF7" + { + "Sequence" = "3:100" + "DisplayName" = "8:Progress" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdProgressDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "ShowProgress" + { + "Name" = "8:ShowProgress" + "DisplayName" = "8:#1009" + "Description" = "8:#1109" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_8EB7CDC7B3204CE0866764F72CC9C5D8" + { + "Name" = "8:#1902" + "Sequence" = "3:2" + "Attributes" = "3:3" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_BA30D47E757A4352B4154E136B4EDE8D" + { + "Sequence" = "3:100" + "DisplayName" = "8:Finished" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminFinishedDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_927C7B611C2A4DE8AA0EC0FC59929E3D" + { + "Name" = "8:#1900" + "Sequence" = "3:1" + "Attributes" = "3:1" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_A47297BB3F1A47DD82E98165D5C8DD33" + { + "Sequence" = "3:300" + "DisplayName" = "8:Confirm Installation" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdConfirmDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_C4860F31B6C14EF391F084926C8353DF" + { + "Sequence" = "3:200" + "DisplayName" = "8:Installation Folder" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdFolderDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "InstallAllUsersVisible" + { + "Name" = "8:InstallAllUsersVisible" + "DisplayName" = "8:#1059" + "Description" = "8:#1159" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_FCB3435041744C7BA621B72B78F2DCA5" + { + "Sequence" = "3:100" + "DisplayName" = "8:Welcome" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdWelcomeDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "CopyrightWarning" + { + "Name" = "8:CopyrightWarning" + "DisplayName" = "8:#1002" + "Description" = "8:#1102" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1202" + "DefaultValue" = "8:#1202" + "UsePlugInResources" = "11:TRUE" + } + "Welcome" + { + "Name" = "8:Welcome" + "DisplayName" = "8:#1003" + "Description" = "8:#1103" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1203" + "DefaultValue" = "8:#1203" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + } + "MergeModule" + { + } + "ProjectOutput" + { + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_DEB8C3F405014A3C9E16DB622E3ADAA3" + { + "SourcePath" = "8:..\\TestBenchFramework\\obj\\Release\\TBF.exe" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_15E376F61DCB49478B2D1D4AA3BF1643" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_FF4706C2A732448C8C10AA09954EF022" + { + "SourcePath" = "8:" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_15E376F61DCB49478B2D1D4AA3BF1643" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:LocalizedResourceDlls" + "OutputProjectGuid" = "8:{8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + } + } +} diff --git a/TBF_V2/Sources/TBF/UpgradeLog.htm b/TBF_V2/Sources/TBF/UpgradeLog.htm new file mode 100644 index 00000000..f22b55e4 Binary files /dev/null and b/TBF_V2/Sources/TBF/UpgradeLog.htm differ diff --git a/TBF_V2/Sources/TBF/UpgradeLog2.htm b/TBF_V2/Sources/TBF/UpgradeLog2.htm new file mode 100644 index 00000000..a5cd4034 Binary files /dev/null and b/TBF_V2/Sources/TBF/UpgradeLog2.htm differ diff --git a/TBF_V2/Sources/TBF/UpgradeLog3.htm b/TBF_V2/Sources/TBF/UpgradeLog3.htm new file mode 100644 index 00000000..f22b55e4 Binary files /dev/null and b/TBF_V2/Sources/TBF/UpgradeLog3.htm differ diff --git a/TBF_V2/Sources/TBF/UpgradeLog4.htm b/TBF_V2/Sources/TBF/UpgradeLog4.htm new file mode 100644 index 00000000..f22b55e4 Binary files /dev/null and b/TBF_V2/Sources/TBF/UpgradeLog4.htm differ diff --git a/TBF_V2/Sources/TBF/UpgradeLog5.htm b/TBF_V2/Sources/TBF/UpgradeLog5.htm new file mode 100644 index 00000000..e94e2adf Binary files /dev/null and b/TBF_V2/Sources/TBF/UpgradeLog5.htm differ diff --git a/TBF_V2/Sources/TBF/UserManagement/DatabaseSettingsDlg.Designer.cs b/TBF_V2/Sources/TBF/UserManagement/DatabaseSettingsDlg.Designer.cs new file mode 100644 index 00000000..17078f96 --- /dev/null +++ b/TBF_V2/Sources/TBF/UserManagement/DatabaseSettingsDlg.Designer.cs @@ -0,0 +1,123 @@ +namespace UserManagement +{ + partial class DatabaseSettingsDlg + { + /// + /// 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() + { + this.connectionStringTextBox1 = new System.Windows.Forms.TextBox(); + this.connectionStringLabel = new System.Windows.Forms.Label(); + this.okButton = new System.Windows.Forms.Button(); + this.cancelButton = new System.Windows.Forms.Button(); + this.languageLabel = new System.Windows.Forms.Label(); + this.languageTextBox = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // connectionStringTextBox1 + // + this.connectionStringTextBox1.Location = new System.Drawing.Point(29, 44); + this.connectionStringTextBox1.Name = "connectionStringTextBox1"; + this.connectionStringTextBox1.Size = new System.Drawing.Size(555, 20); + this.connectionStringTextBox1.TabIndex = 0; + // + // connectionStringLabel + // + this.connectionStringLabel.AutoSize = true; + this.connectionStringLabel.Location = new System.Drawing.Point(26, 19); + this.connectionStringLabel.Name = "connectionStringLabel"; + this.connectionStringLabel.Size = new System.Drawing.Size(89, 13); + this.connectionStringLabel.TabIndex = 3; + this.connectionStringLabel.Text = "Connection string"; + // + // okButton + // + this.okButton.Location = new System.Drawing.Point(378, 85); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(95, 38); + this.okButton.TabIndex = 6; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // cancelButton + // + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cancelButton.Location = new System.Drawing.Point(489, 85); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(95, 38); + this.cancelButton.TabIndex = 7; + this.cancelButton.Text = "Cancel"; + this.cancelButton.UseVisualStyleBackColor = true; + this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click); + // + // languageLabel + // + this.languageLabel.AutoSize = true; + this.languageLabel.Location = new System.Drawing.Point(26, 79); + this.languageLabel.Name = "languageLabel"; + this.languageLabel.Size = new System.Drawing.Size(55, 13); + this.languageLabel.TabIndex = 11; + this.languageLabel.Text = "Language"; + // + // languageTextBox + // + this.languageTextBox.Location = new System.Drawing.Point(29, 103); + this.languageTextBox.Name = "languageTextBox"; + this.languageTextBox.Size = new System.Drawing.Size(100, 20); + this.languageTextBox.TabIndex = 12; + // + // DatabaseSettingsDlg + // + this.AcceptButton = this.okButton; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cancelButton; + this.ClientSize = new System.Drawing.Size(613, 141); + this.Controls.Add(this.languageTextBox); + this.Controls.Add(this.languageLabel); + this.Controls.Add(this.cancelButton); + this.Controls.Add(this.okButton); + this.Controls.Add(this.connectionStringLabel); + this.Controls.Add(this.connectionStringTextBox1); + this.Name = "DatabaseSettingsDlg"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Database Settings"; + this.Load += new System.EventHandler(this.DatabaseSettings_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox connectionStringTextBox1; + private System.Windows.Forms.Label connectionStringLabel; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.Label languageLabel; + private System.Windows.Forms.TextBox languageTextBox; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/UserManagement/DatabaseSettingsDlg.cs b/TBF_V2/Sources/TBF/UserManagement/DatabaseSettingsDlg.cs new file mode 100644 index 00000000..cfdbe465 --- /dev/null +++ b/TBF_V2/Sources/TBF/UserManagement/DatabaseSettingsDlg.cs @@ -0,0 +1,51 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Windows.Forms; +using UserManagement.Resources; + +namespace UserManagement +{ + public partial class DatabaseSettingsDlg : Form + { + public DatabaseSettingsDlg() + { + InitializeComponent(); + } + + private void DatabaseSettings_Load(object sender, EventArgs e) + { + Localize(); + + connectionStringTextBox1.Text = Program.LocalSettings.ConnectionString; + languageTextBox.Text = Program.LocalSettings.Language; + } + + void Localize() + { + Text = Strings.Settings; + connectionStringLabel.Text = Strings.Connection_string; + languageLabel.Text = Strings.Language; + okButton.Text = Strings.OkBtnText; + cancelButton.Text = Strings.CancelBtnText; + } + + private void okButton_Click(object sender, EventArgs e) + { + Program.LocalSettings.ConnectionString = connectionStringTextBox1.Text; + Program.LocalSettings.Language = languageTextBox.Text; + + Program.LocalSettings.Save(); + + DialogResult = DialogResult.OK; + Close(); + } + + private void cancelButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + } +} diff --git a/TBF_V2/Sources/TBF/UserManagement/DatabaseSettingsDlg.resx b/TBF_V2/Sources/TBF/UserManagement/DatabaseSettingsDlg.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/TBF_V2/Sources/TBF/UserManagement/DatabaseSettingsDlg.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/UserManagement/LocalSettings.cs b/TBF_V2/Sources/TBF/UserManagement/LocalSettings.cs new file mode 100644 index 00000000..82c59e58 --- /dev/null +++ b/TBF_V2/Sources/TBF/UserManagement/LocalSettings.cs @@ -0,0 +1,132 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; + +namespace UserManagement +{ + /// + /// Class to be serialized to an XML file... + /// Public members are local settings. + /// These settings are modified by dialogs invoked by menu items + /// Edit->Preferences ... PreferencesDlg ... S1.1(language, etc. local settings), and + /// Edit->Advanced settings ... AdvancedSettingsDlg ... S1.2(spec. where bench settings are stored) + /// + [XmlRootAttribute("UserManagement")] + public class LocalSettings + { + static XmlSerializer serializer = XmlSerializer.FromTypes(new[] { typeof(LocalSettings) })[0]; + + /// + /// User interface language (used as CultureInfo(..) constructor argument). + /// + public string Language = "en"; + + public string ConnectionString = "SERVER=10.42.128.16; DATABASE=st_wr_shared_config; UID=u9305784; PASSWORD=p89344390; CHARSET=utf8;"; + + /// + /// Login method: UserName, FullName or Number + /// + public Users.Entities.LoginMethod LoginMethod; + + /// MainWnd + public int MainWndLeft; + public int MainWndTop; + public int MainWndWidth; + public int MainWndHeight; + public bool ManiWndMaximized; + + + public LocalSettings() + { + } + + /// + /// Load public fields of this class from the XML file. + /// + /// LocalSettings object or null when Load() fails + public static LocalSettings Load(string fileName) + { + try + { + using (TextReader reader = new StreamReader(fileName)) + { + return serializer.Deserialize(reader) as LocalSettings; + } + } + catch (Exception e) + { + string msg = e.Message; + return null; + } + } + + /// + /// Save public fields of this class to the XML file. + /// + public void Save() + { + try + { + using (TextWriter writer = new StreamWriter(Program.LocalSettingsFileName)) + { + serializer.Serialize(writer, this); + } + } + catch (Exception e) + { + string msg = e.Message; + } + } + + /// + /// Updates history stored in a string array by a new latest string. + /// + /// Lste entered string + /// true = updated and saved + public bool UpdateHistory(string lastStrValue, ref string[] history, int maxHistoryLen = 10) + { + if (string.IsNullOrEmpty(lastStrValue)) return false; + + int currentHistoryCount = (history != null) ? history.Length : 0; + + int match = -1; + for (int i = 0; i < currentHistoryCount; i++) + { + if (history[i] == lastStrValue) + { + match = i; + break; + } + } + + if (match >= 0 || currentHistoryCount >= maxHistoryLen) + { + /// History does not have to be (because of a match) or should not be extended (because of the lenght) + if (match < 0) match = currentHistoryCount - 1; + + for (int j = match; j > 0; j--) + { + history[j] = history[j - 1]; + } + history[0] = lastStrValue; + } + else + { + /// History wiil be extended, new item inserted at the beginning + string[] newHistory = new string[currentHistoryCount + 1]; + newHistory[0] = lastStrValue; + for (int j = 1; j <= currentHistoryCount; j++) + { + newHistory[j] = history[j - 1]; + } + history = newHistory; + } + Save(); + return true; + } + } +} diff --git a/TBF_V2/Sources/TBF/UserManagement/Program.cs b/TBF_V2/Sources/TBF/UserManagement/Program.cs new file mode 100644 index 00000000..715cd545 --- /dev/null +++ b/TBF_V2/Sources/TBF/UserManagement/Program.cs @@ -0,0 +1,150 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.IO; +using System.Windows.Forms; +using log4net; + +namespace UserManagement +{ + static class Program + { + static readonly ILog log; /// log4net + + public const string HomeDir = "C:\\UserManagement\\"; /// Contains subdirectories Cfg, Logs + + /// Program information + public static string Version; /// version string + public static DateTime BuildDateTime; /// date and time of program build + + /// Local settings + public static readonly string ExecutableDirectory; + public static readonly string ConfigDirectory; + public static readonly string LogDirectory; + public static readonly string LocalSettingsFileName; + public static readonly string LocalSettingsBackupName; + public static LocalSettings LocalSettings; + + /// + /// Initializes static variables above and starts logging. + /// + static Program() + { + /// Program version string + System.Reflection.Assembly thisAssembly = System.Reflection.Assembly.GetExecutingAssembly(); + Version ver = thisAssembly.GetName().Version; + Version = string.Format("{0}.{1}.{2}", ver.Major, ver.Minor, ver.Build); + BuildDateTime = new System.IO.FileInfo(thisAssembly.Location).LastWriteTime; + + /// Local program configuration directory including the trailing backslash + ExecutableDirectory = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); + ConfigDirectory = Path.Combine(ExecutableDirectory, "..\\Cfg\\"); + LogDirectory = Path.Combine(ExecutableDirectory, "..\\Logs\\"); + LocalSettingsFileName = ConfigDirectory + "config.xml"; + LocalSettingsBackupName = ConfigDirectory + "config.backup.xml"; + + /// Configue and start logging + log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(ConfigDirectory + "log4netConfig.xml")); + log = LogManager.GetLogger(typeof(Program)); + log.Fatal("------------------------------------------------------------------------------------------------"); + log.Fatal("started"); + } + + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + /// This belongs to Application.Run(new MainWnd()) ... + /// and should be executed before opening 'loginDlg' + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + + bool authorized = false; + do + { + /// + /// Load the local settings + /// + Program.LocalSettings = LocalSettings.Load(Program.LocalSettingsFileName); + if (Program.LocalSettings == null) + { + /// Loading local seetings from regular config file failed. Use the backup + Program.LocalSettings = LocalSettings.Load(Program.LocalSettingsBackupName); + if (Program.LocalSettings == null) + { + MessageBox.Show("Na tomto počítači nebol tento program ani raz spustený." + + Environment.NewLine + "Použijú sa základné nastavenia.", + "Upozornenie", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + Program.LocalSettings = new LocalSettings(); + Directory.CreateDirectory(ConfigDirectory); + Program.LocalSettings.Save(); + } + else + { + LocalSettings.Save(); /// Save the settings to overwrite the wrong file + } + } + else + { + /// Loading local seetings from the regular config file was successful. Update the backup + File.Copy(Program.LocalSettingsFileName, Program.LocalSettingsBackupName, true); + } + + try + { + Users.DB.ConnectionString = Program.LocalSettings.ConnectionString; + Users.DB.LoadSharedData(); + + authorized = true; /// No LoginDlg, authorized when reading users from the DB is successfull + } + catch (Exception exc) + { + MessageBox.Show(string.Format("Cannot read a list of users from the database:{0}{1}", Environment.NewLine, exc.Message), + "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + + if (new DatabaseSettingsDlg().ShowDialog() == DialogResult.Cancel) return; /// 'OK' = stay in the loop, 'Cancel' = exit loop + } + } + while (!authorized); + + + try + { + string culture = LocalSettings.Language.Replace('_', '-'); + System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(culture); + } + catch (Exception e) + { + string msg = e.Message; + MessageBox.Show("Selected language not supported.\nUsing English.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); + System.Threading.Thread.CurrentThread.CurrentUICulture = + new System.Globalization.CultureInfo("en"); + } + + + try + { + Users.Forms.UserManagementDlg dlg = new Users.Forms.UserManagementDlg(Users.DB.CreateSession(), false); + + string connStr = LocalSettings.ConnectionString; + int len = connStr.ToUpper().IndexOf("; UID="); + dlg.TitleExtension = connStr.Substring(0, len); + Application.Run(dlg); + } + catch (Exception exc) + { + log.FatalFormat("Program havaroval:{0}{1}Stack trace:{0}{2}", Environment.NewLine, exc.Message, exc.StackTrace); + + MessageBox.Show("Program havaroval:" + + Environment.NewLine + Environment.NewLine + exc.Message + + ((exc.InnerException == null) ? string.Empty : (Environment.NewLine + exc.InnerException.Message)) + + Environment.NewLine + exc.StackTrace, + "Pozor!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/UserManagement/Properties/AssemblyInfo.cs b/TBF_V2/Sources/TBF/UserManagement/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..bdc2ee47 --- /dev/null +++ b/TBF_V2/Sources/TBF/UserManagement/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("UserManagement")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("UserManagement")] +[assembly: AssemblyCopyright("Copyright © 2018")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("e246c49a-1f02-4c85-a245-e4d7053e479d")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("2.18.976.0")] +[assembly: AssemblyFileVersion("2.18.976.0")] diff --git a/TBF_V2/Sources/TBF/UserManagement/Properties/Resources.Designer.cs b/TBF_V2/Sources/TBF/UserManagement/Properties/Resources.Designer.cs new file mode 100644 index 00000000..7842a60b --- /dev/null +++ b/TBF_V2/Sources/TBF/UserManagement/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace UsersManagement.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("UsersManagement.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/UserManagement/Properties/Resources.resx b/TBF_V2/Sources/TBF/UserManagement/Properties/Resources.resx new file mode 100644 index 00000000..af7dbebb --- /dev/null +++ b/TBF_V2/Sources/TBF/UserManagement/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/UserManagement/Properties/Settings.Designer.cs b/TBF_V2/Sources/TBF/UserManagement/Properties/Settings.Designer.cs new file mode 100644 index 00000000..5bb5767c --- /dev/null +++ b/TBF_V2/Sources/TBF/UserManagement/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace UsersManagement.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/TBF_V2/Sources/TBF/UserManagement/Properties/Settings.settings b/TBF_V2/Sources/TBF/UserManagement/Properties/Settings.settings new file mode 100644 index 00000000..39645652 --- /dev/null +++ b/TBF_V2/Sources/TBF/UserManagement/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/TBF_V2/Sources/TBF/UserManagement/Resources/Strings.Designer.cs b/TBF_V2/Sources/TBF/UserManagement/Resources/Strings.Designer.cs new file mode 100644 index 00000000..7831d9fc --- /dev/null +++ b/TBF_V2/Sources/TBF/UserManagement/Resources/Strings.Designer.cs @@ -0,0 +1,108 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace UserManagement.Resources { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Strings { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Strings() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("UserManagement.Resources.Strings", typeof(Strings).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Cancel. + /// + internal static string CancelBtnText { + get { + return ResourceManager.GetString("CancelBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Connection string. + /// + internal static string Connection_string { + get { + return ResourceManager.GetString("Connection_string", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Language. + /// + internal static string Language { + get { + return ResourceManager.GetString("Language", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to OK. + /// + internal static string OkBtnText { + get { + return ResourceManager.GetString("OkBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Settings. + /// + internal static string Settings { + get { + return ResourceManager.GetString("Settings", resourceCulture); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/UserManagement/Resources/Strings.resx b/TBF_V2/Sources/TBF/UserManagement/Resources/Strings.resx new file mode 100644 index 00000000..810de16e --- /dev/null +++ b/TBF_V2/Sources/TBF/UserManagement/Resources/Strings.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cancel + + + Connection string + + + Language + + + OK + + + Settings + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/UserManagement/UserManagement.csproj b/TBF_V2/Sources/TBF/UserManagement/UserManagement.csproj new file mode 100644 index 00000000..3c7083be --- /dev/null +++ b/TBF_V2/Sources/TBF/UserManagement/UserManagement.csproj @@ -0,0 +1,161 @@ + + + + Debug + x86 + 8.0.30703 + 2.0 + {B2CD81B3-AF09-4978-996C-02EDB5F819B7} + WinExe + Properties + UserManagement + UserManagement + v4.0 + + + 512 + false + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 1 + 2.12.497.%2a + false + true + + + x86 + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + x86 + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + UserManagement.Program + + + + ..\packages\FluentNHibernate.2.0.3.0\lib\net40\FluentNHibernate.dll + + + ..\packages\Iesi.Collections.4.0.0.4000\lib\net40\Iesi.Collections.dll + + + ..\packages\log4net.2.0.2\lib\net40-full\log4net.dll + + + ..\packages\MySql.Data.6.6.5\lib\net40\MySql.Data.dll + + + ..\packages\NHibernate.4.0.4.4000\lib\net40\NHibernate.dll + + + + + + + + + + + + + + + Form + + + DatabaseSettingsDlg.cs + + + + + + True + True + Strings.resx + + + DatabaseSettingsDlg.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + ResXFileCodeGenerator + Strings.Designer.cs + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + {6E5CB0E9-E1B6-4E5D-AC6E-B1049E180F2B} + Users + + + + + False + Microsoft .NET Framework 4 %28x86 and x64%29 + true + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + false + + + False + Windows Installer 3.1 + true + + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/UserManagement/app.config b/TBF_V2/Sources/TBF/UserManagement/app.config new file mode 100644 index 00000000..e3656033 --- /dev/null +++ b/TBF_V2/Sources/TBF/UserManagement/app.config @@ -0,0 +1,3 @@ + + + diff --git a/TBF_V2/Sources/TBF/Users/DB.cs b/TBF_V2/Sources/TBF/Users/DB.cs new file mode 100644 index 00000000..04069fb0 --- /dev/null +++ b/TBF_V2/Sources/TBF/Users/DB.cs @@ -0,0 +1,183 @@ +/// +/// Copyright (c) 2016-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using FluentNHibernate.Cfg; +using FluentNHibernate.Cfg.Db; +using log4net; +using NHibernate; +using NHibernate.Cfg; +using NHibernate.Tool.hbm2ddl; +using Users.Entities; + +namespace Users +{ + public static class DB + { + static readonly ILog log = LogManager.GetLogger(typeof(DB)); + + /// Session factory for all regular sessions, not for CreateEmptyResultsDB(). + public static ISessionFactory SessionFactory; + + /// Connection string for all sessions + private static string connectionString; + /// + public static string ConnectionString + { + get { return connectionString; } + set { connectionString = value; SessionFactory = null; } + } + + /// Database type (MySQL or SQLite) for all sessions + private static DBType dbType; + /// + public static DBType DbType + { + get { return dbType; } + set { dbType = value; SessionFactory = null; } + } + + /// + /// NHibernate session factory (to create the database session 'SessionFactory') + /// + /// A database session + static ISessionFactory CreateSessionFactory() + { + return CreateSessionFactory(false); + } + + /// + /// NHibernate session factory (to create the database session 'SessionFactory') + /// + /// true = Create a new DB, false = Regular DB + /// A database session + public static ISessionFactory CreateSessionFactory(bool createDB) + { + FluentConfiguration cfg = Fluently.Configure(); + + switch (dbType) + { + default: + case DBType.SQLite: + cfg = cfg.Database(SQLiteConfiguration.Standard.UsingFile(connectionString)); + break; + case DBType.MySql: + cfg = cfg.Database(MySQLConfiguration.Standard.ConnectionString(connectionString)); + break; + } + + cfg = cfg.Mappings(m => m.FluentMappings.AddFromAssemblyOf()); + + if (createDB) + { + return cfg.ExposeConfiguration(BuildSchemaCreate).BuildSessionFactory(); + } + else + { + return cfg.ExposeConfiguration(BuildSchema).BuildSessionFactory(); + } + } + + static void BuildSchema(Configuration config) + { + /// This NHibernate tool takes a configuration with mapping info and exports a database schema + new SchemaExport(config).SetOutputFile("db_schema"); + } + + static void BuildSchemaCreate(Configuration config) + { + /// This NHibernate tool takes a configuration with mapping info and exports a database schema + new SchemaExport(config).Create(true, true); + } + + /// Create a NHibernate session for the given database + public static ISession CreateSession() + { + if (string.IsNullOrEmpty(connectionString)) + { + throw new Exception("Connection string was not specified"); + } + + if (SessionFactory == null) SessionFactory = CreateSessionFactory(); + + return SessionFactory.OpenSession(); + } + + + public static void SaveObject(object obj) + { + SaveObject(CreateSession(), obj); + } + /// + public static void SaveObject(ISession session, object obj) + { + using (var transaction = session.BeginTransaction()) + { + session.SaveOrUpdate(obj); + try { transaction.Commit(); } + catch { } + } + } + + + public static void DeleteObject(object obj) + { + DeleteObject(CreateSession(), obj); + } + /// + public static void DeleteObject(ISession session, object obj) + { + using (var transaction = session.BeginTransaction()) + { + session.Delete(obj); + transaction.Commit(); + } + } + + + /// + /// Create an empty users database. + /// Database contains only the user 'admin' and the control board component 'CB'. + /// + /// DBType.SQLite or DBType.MySql + /// Connection string + /// true=success, false=error + public static bool CreateEmptyDB() + { + ISessionFactory sessionFactory = CreateSessionFactory(true); + if (sessionFactory == null) return false; + + /// Populate the database + using (var session = sessionFactory.OpenSession()) + { + using (var transaction = session.BeginTransaction()) + { + transaction.Commit(); + } + } + + return true; + } + + + /// + /// Shared data + /// + public static IList Users; + public static IList Groups; + + + /// + /// Loads shared data from the database + /// + /// Throws NHibernate exceptions + public static void LoadSharedData() + { + ISession session = DB.CreateSession(); + + Users = session.QueryOver().List(); + Groups = session.QueryOver().List(); + } + } +} diff --git a/TBF_V2/Sources/TBF/Users/DBSettings.cs b/TBF_V2/Sources/TBF/Users/DBSettings.cs new file mode 100644 index 00000000..0c478f0a --- /dev/null +++ b/TBF_V2/Sources/TBF/Users/DBSettings.cs @@ -0,0 +1,31 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; + +namespace Users +{ + /// + /// Database settings required to make a connection + /// + public class DBSettings : ICloneable + { + public Users.Entities.DBType DbType; + public string ConnectionString; + + public DBSettings() + { + } + + public DBSettings(Users.Entities.DBType dbType, string connectionString) + { + this.DbType = dbType; + this.ConnectionString = connectionString; + } + + public object Clone() + { + return new DBSettings(DbType, ConnectionString); + } + } +} diff --git a/TBF_V2/Sources/TBF/Users/Entities/Enums.cs b/TBF_V2/Sources/TBF/Users/Entities/Enums.cs new file mode 100644 index 00000000..63717427 --- /dev/null +++ b/TBF_V2/Sources/TBF/Users/Entities/Enums.cs @@ -0,0 +1,40 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; + +namespace Users.Entities +{ + /// Identifies the type of a database + public enum DBType + { + MySql, /// MySQL database + SQLite, /// SQLite + Count + } + + /// Identifies the database based on the content + public enum DBKind + { + Config, + Results, + RemoteConfig, + Count + } + + public enum LoginMethod + { + UserName, /// = alias, abbreviation + FullName, /// = description + Number, + Count + } + + public enum AuthorizedAs + { + PowerUser, + LocalUser, + RemoteUser, + Count + } +} diff --git a/TBF_V2/Sources/TBF/Users/Entities/Group.cs b/TBF_V2/Sources/TBF/Users/Entities/Group.cs new file mode 100644 index 00000000..374e3c55 --- /dev/null +++ b/TBF_V2/Sources/TBF/Users/Entities/Group.cs @@ -0,0 +1,25 @@ +/// +/// Copyright (c) 2016-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; + +namespace Users.Entities +{ + public class Group + { + public virtual int Id { get; protected set; } + public virtual int Gid { get; set; } + public virtual string Name { get; set; } + + public Group() + { + } + + public Group(int gid, string name) + { + Gid = gid; + Name = name; + } + } +} diff --git a/TBF_V2/Sources/TBF/Users/Entities/User.cs b/TBF_V2/Sources/TBF/Users/Entities/User.cs new file mode 100644 index 00000000..012b7154 --- /dev/null +++ b/TBF_V2/Sources/TBF/Users/Entities/User.cs @@ -0,0 +1,531 @@ +/// +/// Copyright (c) 2016-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Security.Cryptography; +using System.Text; +using log4net; + +namespace Users.Entities +{ + public class User + { + static readonly ILog log = LogManager.GetLogger(typeof(User)); + + public virtual int Id { get; protected set; } + public virtual string UserName { get; set; } /// = name, alias, abbreviation + public virtual string FullName { get; set; } /// = description + public virtual string Tag { get; set; } + public virtual int Number { get; set; } + public virtual string Password { get; set; } + public virtual DateTime LastPwChange { get; set; } + public virtual IList Groups { get; set; } //User can be a member of a list of groups + + private bool powerUser; /// true for built-in users, power users have full access even with empty Groups list + public virtual bool IsPowerUser() { return powerUser; } + + private string legalizator; /// Not mapped to a database !!!, 2nd user entered in a logging dialog + public virtual void SetLegalizator(string value) { legalizator = value; } + public virtual string GetLegalizator() { return legalizator; } + + public User() + { + this.powerUser = false; + Groups = new List(); + Number = 0; + Tag = string.Empty; + } + + public User(string userName, int number, bool powerUser) + { + UserName = userName; + Number = number; + this.powerUser = powerUser; + Groups = new List(); + FullName = powerUser ? "Power User" : string.Empty; + } + + public virtual void AddGroup(Group group) + { + Groups.Add(group); + } + + + /// + /// All members are copied except of ID (so that NHibernate works properly). + /// List of groups is empty. + /// + /// + /// + public virtual object Clone() + { + User newUser = new User(UserName, Number, false); + newUser.FullName = FullName; + newUser.Number = Number; + newUser.Tag = Tag; + newUser.Password = Password; + newUser.LastPwChange = LastPwChange; + return newUser; + } + + /// ------------- Additional stuff not mapped into the database ------------- + + /// + /// Check whether user is a member of a group. + /// + /// Group GID + /// true is user is a member of the specified group + public virtual bool IsMemberOf(Grp.GID groupId) + { + if (groupId == Grp.GID.None || powerUser) + { + return true; + } + else if (groupId >= 0 && (int)groupId < Grp.Count) + { + // for all group elements in User.groups + for (int i = 0; i < Groups.Count; ++i) + { + // element GID = parameter GroupId ? + if (((Group)Groups[i]).Gid == (int)groupId) + { + return true; + } + } + return false; + } + else + { + return false; + } + } + + /// + /// Sets users password. It then will be encrypted. + /// + /// Password + public virtual void SetPassword(string password) + { + this.Password = EncryptedPassword(password); + LastPwChange = DateTime.Now; + } + + + public virtual string EncryptedPassword(string password) + { + return getHash(password); + } + + /// + /// Verifies users password. Used by static bool Authorisation(...) + /// + /// Password + /// true if password is correct + public virtual bool CheckPassword(string password) + { + return (Password == EncryptedPassword(password)); + } + + + /// + /// The FIRST of TWO possible user authorization method to be used + /// when a specific group membership is required (you can use Grp.GID.None). + /// If the user is not authorized, the current user remains to be a current user + /// (i.e. the access rights were not risen to a higher level). + /// If you require different behavior, use Unauthorize() before calling Authorize(). + /// + /// User name + /// Password + /// + /// true = authorized + public virtual bool Authorize(string userName, string password, Grp.GID requiredGroupMembership) + { + if (IsPowerUser(userName, password)) + { + GlobalData.CurrentUser = this; + GlobalData.LastAuthorization = DateTime.Now; + log.FatalFormat("Power user '{0}' authorized @level '{1}'", userName, requiredGroupMembership); + return true; + } + + if (UserName.ToLower() == userName.ToLower()) + { + if (IsMemberOf(requiredGroupMembership) && CheckPassword(password)) + { + GlobalData.CurrentUser = this; + GlobalData.LastAuthorization = DateTime.Now; + log.FatalFormat("User '{0}' authorized @level '{1}'", userName, requiredGroupMembership); + return true; + } + else + { + return false; + } + } + return false; + } + + /// + /// The SECOND of TWO possible user authorization method to be used when + /// no specific group membership is required. + /// + public virtual bool Authorize(string userName, string password) + { + return Authorize(userName, password, Grp.GID.None); + } + + /// + /// The FIRST of TWO possible user authorization method to be used + /// when a specific group membership is required (you can use Grp.GID.None). + /// If the user is not authorized, the current user remains to be a current user + /// (i.e. the access rights were not risen to a higher level). + /// If you require different behavior, use Unauthorize() before calling Authorize(). + /// + /// User ID number + /// Password + /// + /// true = authorized + public virtual bool AuthorizeNumber(int number, string password, Grp.GID requiredGroupMembership) + { + if (Number == number) + { + if (IsMemberOf(requiredGroupMembership) && CheckPassword(password)) + { + GlobalData.CurrentUser = this; + GlobalData.LastAuthorization = DateTime.Now; + log.FatalFormat("User ID={0} authorized @level '{1}'", number, requiredGroupMembership); + return true; + } + else + { + return false; + } + } + return false; + } + + /// + /// The SECOND of TWO possible user authorization method to be used when + /// no specific group membership is required. + /// + public virtual bool AuthorizeNumber(int number, string password) + { + return AuthorizeNumber(number, password, Grp.GID.None); + } + + /// + /// The FIRST of TWO possible user authorization method to be used + /// when a specific group membership is required (you can use Grp.GID.None). + /// If the user is not authorized, the current user remains to be a current user + /// (i.e. the access rights were not risen to a higher level). + /// If you require different behavior, use Unauthorize() before calling Authorize(). + /// + /// + /// + /// + /// true = authorized + public virtual bool AuthorizeFullName(string fullName, string password, Grp.GID requiredGroupMembership) + { + if (FullName.ToLower() == fullName.ToLower()) + { + if (IsMemberOf(requiredGroupMembership) && CheckPassword(password)) + { + GlobalData.CurrentUser = this; + GlobalData.LastAuthorization = DateTime.Now; + log.FatalFormat("User alias={0} authorized @level '{1}'", fullName, requiredGroupMembership); + return true; + } + else + { + return false; + } + } + return false; + } + + /// + /// The SECOND of TWO possible user authorization method to be used when + /// no specific group membership is required. + /// + public virtual bool AuthorizeFullName(string fullName, string password) + { + return AuthorizeFullName(fullName, password, Grp.GID.None); + } + + /// + /// The FIRST of TWO possible user authorization method to be used + /// when a specific group membership is required (you can use Grp.GID.None). + /// If the user is not authorized, the current user remains to be a current user + /// (i.e. the access rights were not risen to a higher level). + /// If you require different behavior, use Unauthorize() before calling Authorize(). + /// + /// Tag (RFID, NFC, ... s/n) + /// + /// true = authorized + public virtual bool AuthorizeTag(string tag, Grp.GID requiredGroupMembership) + { + if (Tag == tag) + { + if (IsMemberOf(requiredGroupMembership)) + { + GlobalData.CurrentUser = this; + GlobalData.LastAuthorization = DateTime.Now; + log.FatalFormat("User with Tag={0} authorized @level '{1}'", tag, requiredGroupMembership); + return true; + } + else + { + return false; + } + } + return false; + } + + /// + /// The SECOND of TWO possible user authorization method to be used when + /// no specific group membership is required. + /// + public virtual bool AuthorizeTag(string tag) + { + return AuthorizeTag(tag, Grp.GID.None); + } + + + /// + /// Returns a 'User' with a given username from a database. + /// + /// User name for the query + /// reference to a 'User' (if it exists) or null + public static User AuthorizeDummyUser(string username) + { + User user = new User(); + user.UserName = username; + GlobalData.CurrentUser = user; + return user; + } + + + /// + /// Returns a 'User' with a given username from an ARBITRARY database. + /// + /// User name for the query + /// reference to a 'User' (if it exists) or null + public static User LoadUserByName(string userName, DBSettings dbSettings) + { + if (dbSettings == null || string.IsNullOrEmpty(dbSettings.ConnectionString)) return null; + + DB.DbType = dbSettings.DbType; + DB.ConnectionString = dbSettings.ConnectionString; + IList listOfUsers = DB.CreateSession() + .CreateQuery("FROM User WHERE LOWER(UserName) = :username") /// Note: QueryOver().Where(x => x.UserName.ToLower() == ... does not work + .SetParameter("username", userName.ToLower()) + .List(); + if (listOfUsers.Count > 0) return listOfUsers[0]; + return null; + } + + /// + /// Returns a 'User' with a given username from the users database. + /// + /// User name for the query + /// reference to a 'User' (if it exists) or null + public static User LoadUserByName(string userName) + { + string upperCaseUserName = userName.ToUpper(); + IList listOfUsers = DB.CreateSession() + .CreateQuery("FROM User WHERE LOWER(UserName) = :username") /// Note: QueryOver().Where(x => x.UserName.ToLower() == ... does not work + .SetParameter("username", userName.ToLower()) + .List(); + if (listOfUsers.Count > 0) return listOfUsers[0]; + return null; + } + + + /// + /// Returns a 'User' with a given full name from an ARBITRARY database. + /// + /// Full name for the query + /// reference to a 'User' (if it exists) or null + public static User LoadUserByFullName(string fullName, DBSettings dbSettings) + { + if (dbSettings == null || string.IsNullOrEmpty(dbSettings.ConnectionString)) return null; + + DB.DbType = dbSettings.DbType; + DB.ConnectionString = dbSettings.ConnectionString; + IList listOfUsers = DB.CreateSession() + .CreateQuery("FROM User WHERE LOWER(Description) = :fullname") /// Note: QueryOver().Where(x => x.FullName.ToLower() == ... does not work + .SetParameter("fullname", fullName.ToLower()) + .List(); + if (listOfUsers.Count > 0) return listOfUsers[0]; + return null; + } + + /// + /// Returns a 'User' with a given full name from the users database. + /// + /// Full name for the query + /// reference to a 'User' (if it exists) or null + public static User LoadUserByFullName(string fullName) + { + IList listOfUsers = DB.CreateSession() + .CreateQuery("FROM User WHERE LOWER(Description) = :fullname") /// Note: QueryOver().Where(x => x.FullName.ToLower() == ... does not work + .SetParameter("fullname", fullName.ToLower()) + .List(); + if (listOfUsers.Count > 0) return listOfUsers[0]; + return null; + } + + + /// + /// Returns a 'User' with a given username from an ARBITRARY database. + /// + /// User ID number for the query + /// reference to a 'User' (if it exists) or null + public static User LoadUserByNumber(int number, DBSettings dbSettings) + { + if (dbSettings == null || string.IsNullOrEmpty(dbSettings.ConnectionString)) return null; + + DB.DbType = dbSettings.DbType; + DB.ConnectionString = dbSettings.ConnectionString; + IList listOfUsers = DB.CreateSession() + .QueryOver() + .Where(x => (x.Number == number)) + .List(); + if (listOfUsers.Count > 0) return listOfUsers[0]; + return null; + } + + /// + /// Returns a 'User' with a given username from the users database. + /// + /// User ID number for the query + /// reference to a 'User' (if it exists) or null + public static User LoadUserByNumber(int number) + { + IList listOfUsers = DB.CreateSession() + .QueryOver() + .Where(x => (x.Number == number)) + .List(); + if (listOfUsers.Count > 0) return listOfUsers[0]; + return null; + } + + + /// + /// Returns a 'User' with a given RFID/NFC tag s/n from an ARBITRARY database. + /// + /// Tag of a user for the query + /// reference to a 'User' (if it exists) or null + public static User LoadUserByTag(string tag, DBSettings dbSettings) + { + if (dbSettings == null || string.IsNullOrEmpty(dbSettings.ConnectionString)) return null; + + DB.DbType = dbSettings.DbType; + DB.ConnectionString = dbSettings.ConnectionString; + IList listOfUsers = DB.CreateSession() + .QueryOver() + .Where(x => (x.Tag == tag)) + .List(); + if (listOfUsers.Count > 0) return listOfUsers[0]; + return null; + } + + /// + /// Returns a 'User' with a given RFID/NFC tag s/n from the users database. + /// + /// Tag of a user for the query + /// reference to a 'User' (if it exists) or null + public static User LoadUserByTag(string tag) + { + IList listOfUsers = DB.CreateSession() + .QueryOver() + .Where(x => (x.Tag == tag)) + .List(); + if (listOfUsers.Count > 0) return listOfUsers[0]; + return null; + } + + + /// + /// returns an IList of all Users + /// + public static IList GetAllUsers() + { + return DB.CreateSession().QueryOver().List(); + } + + + /// + /// Unauthorize, abandon current users authorization. + /// + public static void Unauthorize() + { + GlobalData.CurrentUser = null; + GlobalData.LastAuthorization = DateTime.Now; + } + + /// + /// getHash encrypts a string + /// + /// the string to encrypt + /// + public static string getHash(string text) + { + byte[] bytes = Encoding.Unicode.GetBytes(text); + SHA512Managed hashstring = new SHA512Managed(); + byte[] hash = hashstring.ComputeHash(bytes); + string hashString = string.Empty; + foreach (byte x in hash) + { + hashString += String.Format("{0:x2}", x); + } + return hashString; + } + + + public virtual string ToEncodedStr() + { + return string.Format("{0}~{1}~{2}", UserName, FullName, legalizator); + } + + public static string EncodedStrToUserName(string encodedStr) + { + string[] subStrings = encodedStr.Split(new char[] { '~' }); + return (subStrings.Length >= 1) ? subStrings[0] : string.Empty; + } + + public static string EncodedStrToFullName(string encodedStr) + { + string[] subStrings = encodedStr.Split(new char[] { '~' }); + return (subStrings.Length >= 2) ? subStrings[1] : string.Empty; + } + + public static string EncodedStrToLegalizator(string encodedStr) + { + string[] subStrings = encodedStr.Split(new char[] { '~' }); + return (subStrings.Length >= 3) ? subStrings[2] : string.Empty; + } + + + /// + /// Returns 'true' when authentication data are valid for a power user. + /// + /// User name + /// Password + /// true = authenticated, false = refused + public static bool IsPowerUser(string userName, string password) + { + return (userName.Equals("milan") && password.Equals("kremik")) || + (userName.Equals("igor") && password.Equals("mojronko8")) || + (userName.Equals("MARIAN") && password.Equals("NM-309BN")) || + (userName.Equals("lubo1212") && password.Equals("Tatry52")) || + (userName.Equals("Michal") && password.Equals("1236natahA8")) || + (userName.Equals("martin") && password.Equals("vaclavek84")) || + (userName.Equals("pakan") && password.Equals("kuriatko")) || + (userName.Equals("augustin") && password.Equals("jaugust")) || + (userName.Equals("JCermak") && password.Equals("Zt6911")) || + (userName.Equals("gilles") && password.Equals("alibaba")); + } + } +} diff --git a/TBF_V2/Sources/TBF/Users/Forms/EditSelectedUser.Designer.cs b/TBF_V2/Sources/TBF/Users/Forms/EditSelectedUser.Designer.cs new file mode 100644 index 00000000..2257b8c8 --- /dev/null +++ b/TBF_V2/Sources/TBF/Users/Forms/EditSelectedUser.Designer.cs @@ -0,0 +1,202 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace Users.Forms +{ + partial class EditSelectedUser + { + /// + /// 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() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(EditSelectedUser)); + this.txtName = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.okBtn = new System.Windows.Forms.Button(); + this.cancelBtn = new System.Windows.Forms.Button(); + this.txtPassword = new System.Windows.Forms.TextBox(); + this.passwordLabel = new System.Windows.Forms.Label(); + this.txtDescription = new System.Windows.Forms.TextBox(); + this.descriptionLabel = new System.Windows.Forms.Label(); + this.checkedListBoxGroups = new System.Windows.Forms.CheckedListBox(); + this.groupsLabel = new System.Windows.Forms.Label(); + this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); + this.repeatPasswordLabel = new System.Windows.Forms.Label(); + this.txtRepeatPassword = new System.Windows.Forms.TextBox(); + this.codeLabel = new System.Windows.Forms.Label(); + this.txtCode = new System.Windows.Forms.TextBox(); + this.tagLabel = new System.Windows.Forms.Label(); + this.txtTag = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // txtName + // + resources.ApplyResources(this.txtName, "txtName"); + this.txtName.Name = "txtName"; + this.txtName.TextChanged += new System.EventHandler(this.txtName_TextChanged); + this.txtName.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txtName_KeyPress); + this.txtName.Validated += new System.EventHandler(this.txtName_Validated); + // + // nameLabel + // + resources.ApplyResources(this.nameLabel, "nameLabel"); + this.nameLabel.Name = "nameLabel"; + // + // okBtn + // + resources.ApplyResources(this.okBtn, "okBtn"); + this.okBtn.Name = "okBtn"; + this.okBtn.UseVisualStyleBackColor = true; + this.okBtn.Click += new System.EventHandler(this.okBtn_Click); + // + // cancelBtn + // + resources.ApplyResources(this.cancelBtn, "cancelBtn"); + this.cancelBtn.Name = "cancelBtn"; + this.cancelBtn.UseVisualStyleBackColor = true; + this.cancelBtn.Click += new System.EventHandler(this.cancelBtn_Click); + // + // txtPassword + // + resources.ApplyResources(this.txtPassword, "txtPassword"); + this.txtPassword.Name = "txtPassword"; + this.txtPassword.TextChanged += new System.EventHandler(this.txtPassword_TextChanged); + // + // passwordLabel + // + resources.ApplyResources(this.passwordLabel, "passwordLabel"); + this.passwordLabel.Name = "passwordLabel"; + // + // txtDescription + // + resources.ApplyResources(this.txtDescription, "txtDescription"); + this.txtDescription.Name = "txtDescription"; + this.txtDescription.TextChanged += new System.EventHandler(this.txtDescription_TextChanged); + this.txtDescription.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txtDescription_KeyPress); + // + // descriptionLabel + // + resources.ApplyResources(this.descriptionLabel, "descriptionLabel"); + this.descriptionLabel.Name = "descriptionLabel"; + // + // checkedListBoxGroups + // + this.checkedListBoxGroups.CheckOnClick = true; + this.checkedListBoxGroups.FormattingEnabled = true; + resources.ApplyResources(this.checkedListBoxGroups, "checkedListBoxGroups"); + this.checkedListBoxGroups.Name = "checkedListBoxGroups"; + this.checkedListBoxGroups.Click += new System.EventHandler(this.checkedListBoxGroups_Click); + // + // groupsLabel + // + resources.ApplyResources(this.groupsLabel, "groupsLabel"); + this.groupsLabel.Name = "groupsLabel"; + // + // repeatPasswordLabel + // + resources.ApplyResources(this.repeatPasswordLabel, "repeatPasswordLabel"); + this.repeatPasswordLabel.Name = "repeatPasswordLabel"; + // + // txtRepeatPassword + // + resources.ApplyResources(this.txtRepeatPassword, "txtRepeatPassword"); + this.txtRepeatPassword.Name = "txtRepeatPassword"; + this.txtRepeatPassword.TextChanged += new System.EventHandler(this.txtRepeatPassword_TextChanged); + // + // codeLabel + // + resources.ApplyResources(this.codeLabel, "codeLabel"); + this.codeLabel.Name = "codeLabel"; + // + // txtCode + // + resources.ApplyResources(this.txtCode, "txtCode"); + this.txtCode.Name = "txtCode"; + this.txtCode.TextChanged += new System.EventHandler(this.txtCode_TextChanged); + // + // tagLabel + // + resources.ApplyResources(this.tagLabel, "tagLabel"); + this.tagLabel.Name = "tagLabel"; + // + // txtTag + // + resources.ApplyResources(this.txtTag, "txtTag"); + this.txtTag.Name = "txtTag"; + // + // EditSelectedUser + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.tagLabel); + this.Controls.Add(this.txtTag); + this.Controls.Add(this.codeLabel); + this.Controls.Add(this.txtCode); + this.Controls.Add(this.repeatPasswordLabel); + this.Controls.Add(this.txtRepeatPassword); + this.Controls.Add(this.groupsLabel); + this.Controls.Add(this.checkedListBoxGroups); + this.Controls.Add(this.cancelBtn); + this.Controls.Add(this.okBtn); + this.Controls.Add(this.descriptionLabel); + this.Controls.Add(this.passwordLabel); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.txtDescription); + this.Controls.Add(this.txtPassword); + this.Controls.Add(this.txtName); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.Name = "EditSelectedUser"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.EditSelectedUser_FormClosing); + this.Load += new System.EventHandler(this.EditSelectedUser_Load); + this.Shown += new System.EventHandler(this.EditSelectedUser_Shown); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox txtName; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Button okBtn; + private System.Windows.Forms.Button cancelBtn; + private System.Windows.Forms.TextBox txtPassword; + private System.Windows.Forms.Label passwordLabel; + private System.Windows.Forms.TextBox txtDescription; + private System.Windows.Forms.Label descriptionLabel; + private System.Windows.Forms.CheckedListBox checkedListBoxGroups; + private System.Windows.Forms.Label groupsLabel; + private System.Windows.Forms.ToolTip toolTip1; + private System.Windows.Forms.Label repeatPasswordLabel; + private System.Windows.Forms.TextBox txtRepeatPassword; + private System.Windows.Forms.Label codeLabel; + private System.Windows.Forms.TextBox txtCode; + private System.Windows.Forms.Label tagLabel; + private System.Windows.Forms.TextBox txtTag; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Users/Forms/EditSelectedUser.cs b/TBF_V2/Sources/TBF/Users/Forms/EditSelectedUser.cs new file mode 100644 index 00000000..646c4060 --- /dev/null +++ b/TBF_V2/Sources/TBF/Users/Forms/EditSelectedUser.cs @@ -0,0 +1,317 @@ +/// +/// Copyright (c) 2017-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; +using NHibernate; +using Users.Entities; +using Users.Resources; +using GemCard; +using System.Drawing; + +namespace Users.Forms +{ + public partial class EditSelectedUser : Form + { + NHibernate.ISession session; + User user; + bool[] oriGroupMember; /// index is gid, size is Grp.Count + + + /// Smart card support, card S/N is used as user.Tag + GemCard.CardNative card; + string[] cardReaders; + string smartCardReader; + + + public EditSelectedUser() + { + InitializeComponent(); + this.toolTip1.SetToolTip(this.txtName, string.Format(Strings.max_0_alphanum_chars, 20)); + oriGroupMember = new bool[Grp.Count]; + okBtn.Enabled = false; + } + + public EditSelectedUser(NHibernate.ISession session, User user) + : this() + { + this.session = session; + this.user = user; + } + + private void EditSelectedUser_Load(object sender, EventArgs e) + { + Localize(); + + txtName.Text = user.UserName; + txtCode.Text = user.Number.ToString(); + txtTag.Text = string.IsNullOrEmpty(user.Tag) ? string.Empty : user.Tag; + txtDescription.Text = user.FullName; + txtPassword.Text = string.Empty; + txtRepeatPassword.Text = string.Empty; + + ShowGroups(); + + smartCardReader = null; /// null = No smart card reader detected + +#if TURA_IPERL || TURA_SPECIAL + try + { + card = new CardNative(); + + /// Find NFC smart card reader + cardReaders = card.ListReaders(); + foreach (var crd in cardReaders) + { + if (crd.Contains("NFC")) + { + smartCardReader = crd; /// NFC smart card reader detected + break; + } + } + + if (!string.IsNullOrEmpty(smartCardReader)) + { + /// Reader found, initialize NFC smart card reader + + card.OnCardInserted += delegate(object sndr, CardInsertedEventArgs args) + { + if (InvokeRequired) { Invoke(new EventHandler(OnCardInserted), sndr, args); } + else OnCardInserted(sndr, args); + }; + + card.OnCardRemoved += delegate(object sndr, CardRemovedEventArgs args) + { + if (InvokeRequired) { Invoke(new EventHandler(OnCardRemoved), sndr, args); } + else OnCardRemoved(sndr, args); + }; + + card.StartCardEvents(smartCardReader); + + Text += " (NFC)"; + txtTag.Enabled = true; + } + } + catch (Exception) + { + smartCardReader = null; + } +#endif + } + + void Localize() + { + Text = Strings.Edit_User; + nameLabel.Text = Strings.Name; + passwordLabel.Text = Strings.Password; + repeatPasswordLabel.Text = Strings.Repeat_password; + codeLabel.Text = Strings.User_code; + tagLabel.Text = Strings.Tag; + descriptionLabel.Text = Strings.DescriptionColHdr; + groupsLabel.Text = Strings.Groups; + okBtn.Text = Strings.OkBtnText; + cancelBtn.Text = Strings.CancelBtnText; + } + + public void ShowGroups() + { + checkedListBoxGroups.Items.Clear(); + for (int i= 0; i < Grp.Count; i++) + { + Group group = Grp.FromId((Grp.GID)i); + + bool boolIsMember = oriGroupMember[i] = user.IsMemberOf((Grp.GID)group.Gid); + + checkedListBoxGroups.Items.Add(Grp.Gid2Str(i)); + checkedListBoxGroups.SetItemCheckState(i, boolIsMember ? CheckState.Checked : CheckState.Unchecked); + } + } + + private void EditSelectedUser_Shown(object sender, EventArgs e) + { + txtName.Focus(); + } + + + public bool Save() + { + // todo: check if this name is given to another user + if (IsUserNameAlreadyTaken(txtName.Text)) + { + MessageBox.Show(Strings.Username_taken); + return false; + } + + if (IsTagAlreadyTaken(txtTag.Text)) + { + MessageBox.Show(Strings.Tag_taken); + return false; + } + + ITransaction transaction = session.BeginTransaction(); + + try + { + Cursor.Current = Cursors.WaitCursor; + + user.UserName = txtName.Text; + user.FullName = txtDescription.Text; + user.Number = int.Parse(txtCode.Text); + user.Tag = string.IsNullOrEmpty(txtTag.Text) ? null : txtTag.Text; + + if (txtPassword.Text != string.Empty) + { + user.SetPassword(txtPassword.Text); + } + + /// Groups + IList groups = user.Groups; /// = session.QueryOver().Where(x => (x.User.Id == user.Id)).List(); + for (int gid = 0; gid < Grp.Count; gid++) + { + bool newIsMember = checkedListBoxGroups.GetItemChecked(gid); + + if (!newIsMember && oriGroupMember[gid]) + { + for (int j = 0; j < user.Groups.Count; j++) + { + if (user.Groups[j].Gid == gid) + { + session.Delete(user.Groups[j]); + user.Groups.RemoveAt(j); + break; + } + } + } + else if (newIsMember && !oriGroupMember[gid]) + { + Group newGroup = new Group(gid, ((Grp.GID)gid).ToString()); + user.Groups.Add(newGroup); + } + } + + session.SaveOrUpdate(user); + transaction.Commit(); + session.Flush(); + Cursor.Current = Cursors.Default; + return true; + } + catch (Exception exc) + { + transaction.Rollback(); + MessageBox.Show(string.Format("{0}{1}{2}", Strings.Save_or_update_user_failed, Environment.NewLine, exc.Message), + Strings.Error, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + Cursor.Current = Cursors.Default; + return false; + } + } + + /// + /// returns true if the username allready exists for another user + /// + private bool IsUserNameAlreadyTaken(string userName) + { + // Have a look into all other users + IList ListOfUsers = User.GetAllUsers(); + foreach (var person in ListOfUsers) + { + if (person.Id != user.Id) + { + /// Other user then the current one + if (person.UserName.ToLower() == userName.ToLower()) + { + return true; // Name is equal = already taken + } + } + } + return false; + } + + /// + /// returns true if the username allready exists for another user + /// + private bool IsTagAlreadyTaken(string tag) + { + if (string.IsNullOrEmpty(tag)) return false; /// No tag + + // Have a look into all other users + IList ListOfUsers = User.GetAllUsers(); + foreach (var person in ListOfUsers) + { + if (person.Id != user.Id) + { + // Other user then the current one + if (person.Tag == tag) + { + return true; // Tag is equal = already taken + } + } + } + return false; + } + + + private void okBtn_Click(object sender, EventArgs e) + { + if (Save()) + { + DialogResult = DialogResult.OK; + this.Close(); + } + } + + private void cancelBtn_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + this.Close(); + } + + + private void txtName_Validated(object sender, EventArgs e) { UpdateOKButton(); } + private void txtName_KeyPress(object sender, KeyPressEventArgs e) { UpdateOKButton(); } + private void txtName_TextChanged(object sender, EventArgs e) { UpdateOKButton(); } + private void txtPassword_TextChanged(object sender, EventArgs e) { UpdateOKButton(); } + private void txtRepeatPassword_TextChanged(object sender, EventArgs e) { UpdateOKButton(); } + private void txtDescription_TextChanged(object sender, EventArgs e) { UpdateOKButton(); } + private void txtDescription_KeyPress(object sender, KeyPressEventArgs e) { UpdateOKButton(); } + private void checkedListBoxGroups_Click(object sender, EventArgs e) { UpdateOKButton(); } + private void txtCode_TextChanged(object sender, EventArgs e) { UpdateOKButton(); } + + private void UpdateOKButton() + { + int userCode; + + okBtn.Enabled = (txtName.Text != string.Empty) + && int.TryParse(txtCode.Text, out userCode) + && (txtPassword.Text == txtRepeatPassword.Text); + } + + + void OnCardInserted(object sender, CardInsertedEventArgs args) + { + BackColor = Color.Green; + card.Connect(smartCardReader, SHARE.Shared, PROTOCOL.T0orT1); + + /// Read the serial number of the card + APDUResponse response = card.Transmit(new APDUCommand(0xFF, 0xCA, 0x00, 0x00, null, 7)); + txtTag.Text = response.ToString(); + + card.Disconnect(DISCONNECT.Leave); + } + + + void OnCardRemoved(object sender, CardRemovedEventArgs args) + { + BackColor = SystemColors.Control; + } + + private void EditSelectedUser_FormClosing(object sender, FormClosingEventArgs e) + { + if (!string.IsNullOrEmpty(smartCardReader)) + { + card.StopCardEvents(); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/Users/Forms/EditSelectedUser.resx b/TBF_V2/Sources/TBF/Users/Forms/EditSelectedUser.resx new file mode 100644 index 00000000..90fef290 --- /dev/null +++ b/TBF_V2/Sources/TBF/Users/Forms/EditSelectedUser.resx @@ -0,0 +1,558 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + 137, 9 + + + 200, 20 + + + + 1 + + + txtName + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 15 + + + True + + + 9, 12 + + + 35, 13 + + + 0 + + + Name + + + nameLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 12 + + + + NoControl + + + 137, 365 + + + 94, 31 + + + 15 + + + OK + + + okBtn + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 9 + + + 243, 365 + + + 94, 31 + + + 16 + + + Cancel + + + cancelBtn + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 8 + + + 137, 35 + + + * + + + 200, 20 + + + 3 + + + txtPassword + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 14 + + + True + + + 9, 38 + + + 53, 13 + + + 2 + + + Password + + + passwordLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 11 + + + 137, 135 + + + True + + + 200, 59 + + + 12 + + + txtDescription + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 13 + + + True + + + 9, 138 + + + 60, 13 + + + 11 + + + Description + + + descriptionLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 10 + + + 137, 199 + + + 200, 154 + + + 14 + + + checkedListBoxGroups + + + System.Windows.Forms.CheckedListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 7 + + + True + + + 9, 199 + + + 41, 13 + + + 13 + + + Groups + + + groupsLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 6 + + + 17, 17 + + + True + + + NoControl + + + 9, 63 + + + 90, 13 + + + 4 + + + Repeat password + + + repeatPasswordLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + + + 137, 60 + + + * + + + 200, 20 + + + 5 + + + txtRepeatPassword + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 5 + + + True + + + NoControl + + + 9, 88 + + + 32, 13 + + + 6 + + + Code + + + codeLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + 137, 85 + + + 200, 20 + + + 7 + + + txtCode + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + True + + + NoControl + + + 9, 113 + + + 26, 13 + + + 8 + + + Tag + + + tagLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + False + + + 137, 110 + + + 200, 20 + + + 9 + + + txtTag + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + True + + + 6, 13 + + + 375, 408 + + + Edit User + + + toolTip1 + + + System.Windows.Forms.ToolTip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + EditSelectedUser + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Users/Forms/LoginDlg.Designer.cs b/TBF_V2/Sources/TBF/Users/Forms/LoginDlg.Designer.cs new file mode 100644 index 00000000..14938db9 --- /dev/null +++ b/TBF_V2/Sources/TBF/Users/Forms/LoginDlg.Designer.cs @@ -0,0 +1,113 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace Users.Forms +{ + partial class LoginDlg + { + /// + /// 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(LoginDlg)); + this.aliasLabel = new System.Windows.Forms.Label(); + this.passwordLabel = new System.Windows.Forms.Label(); + this.passwordTextBox = new System.Windows.Forms.TextBox(); + this.cancelButton = new System.Windows.Forms.Button(); + this.okButton = new System.Windows.Forms.Button(); + this.userNameTextBox = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // aliasLabel + // + resources.ApplyResources(this.aliasLabel, "aliasLabel"); + this.aliasLabel.Name = "aliasLabel"; + this.aliasLabel.Click += new System.EventHandler(this.aliasLabel_Click); + // + // passwordLabel + // + resources.ApplyResources(this.passwordLabel, "passwordLabel"); + this.passwordLabel.Name = "passwordLabel"; + // + // passwordTextBox + // + resources.ApplyResources(this.passwordTextBox, "passwordTextBox"); + this.passwordTextBox.Name = "passwordTextBox"; + this.passwordTextBox.UseSystemPasswordChar = true; + this.passwordTextBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.passwordTextBox_KeyPress); + // + // cancelButton + // + resources.ApplyResources(this.cancelButton, "cancelButton"); + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cancelButton.Name = "cancelButton"; + this.cancelButton.UseVisualStyleBackColor = true; + this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click); + // + // okButton + // + resources.ApplyResources(this.okButton, "okButton"); + this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK; + this.okButton.Name = "okButton"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // userNameTextBox + // + resources.ApplyResources(this.userNameTextBox, "userNameTextBox"); + this.userNameTextBox.Name = "userNameTextBox"; + this.userNameTextBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.userNameTextBox_KeyPress); + // + // LoginDlg + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cancelButton; + this.Controls.Add(this.userNameTextBox); + this.Controls.Add(this.okButton); + this.Controls.Add(this.cancelButton); + this.Controls.Add(this.passwordTextBox); + this.Controls.Add(this.passwordLabel); + this.Controls.Add(this.aliasLabel); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Name = "LoginDlg"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.LoginDlg_FormClosing); + this.Load += new System.EventHandler(this.LoginDlg_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label aliasLabel; + private System.Windows.Forms.Label passwordLabel; + private System.Windows.Forms.TextBox userNameTextBox; + private System.Windows.Forms.TextBox passwordTextBox; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.Button okButton; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Users/Forms/LoginDlg.cs b/TBF_V2/Sources/TBF/Users/Forms/LoginDlg.cs new file mode 100644 index 00000000..f9b451e5 --- /dev/null +++ b/TBF_V2/Sources/TBF/Users/Forms/LoginDlg.cs @@ -0,0 +1,318 @@ +/// +/// Copyright (c) 2017-2018 Sensus Slovensko a.s. +/// +using System; +using System.Windows.Forms; +using GemCard; +using Users.Resources; +using System.Drawing; + +namespace Users.Forms +{ + /// + /// Provides login dialog as well as user authorization using TBF.User.Authorize(...) + /// (i.e. when DialogResult is OK, user was authorized). + /// + public partial class LoginDlg : Form + { + // Private fields + string user; + string password; + Grp.GID requiredGroupMembership = Grp.GID.Invalid; + bool noDatabase; + + /// Smart card support, card S/N is used as user.Tag + GemCard.CardNative card; + string[] cardReaders; + string smartCardReader; + + public Users.Entities.LoginMethod Method; + public string VersionString; + + /// + /// Constructor. + /// + public LoginDlg() + { + InitializeComponent(); + } + + /// + /// Constructor with a predefined user. + /// + public LoginDlg(string predefinedUser) + : this() + { + user = predefinedUser; + userNameTextBox.Text = predefinedUser; + } + + /// + /// Constructor with 'no Database' flag. + /// + public LoginDlg(bool noDatabase) + : this() + { + this.noDatabase = noDatabase; + } + + /// + /// Constructor when a specific group membership is required. + /// + public LoginDlg(Grp.GID requiredGroupMembership) + : this() + { + this.requiredGroupMembership = requiredGroupMembership; + } + + /// + /// Constructor with a predefined user when a specific group membership is required. + /// + public LoginDlg(string predefinedUser, Grp.GID requiredGroupMembership) + : this() + { + user = predefinedUser; + userNameTextBox.Text = predefinedUser; + this.requiredGroupMembership = requiredGroupMembership; + } + + private void LoginDlg_Load(object sender, EventArgs e) + { + Localize(); + + if (user == null) + userNameTextBox.Select(); + else + passwordTextBox.Select(); + + smartCardReader = null; /// null = No smart card reader detected + +#if TURA_IPERL || TURA_SPECIAL + try + { + card = new CardNative(); + + /// Find NFC smart card reader + cardReaders = card.ListReaders(); + foreach (var crd in cardReaders) + { + if (crd.Contains("NFC")) + { + smartCardReader = crd; /// NFC smart card reader detected + break; + } + } + + if (!string.IsNullOrEmpty(smartCardReader)) + { + /// Reader found, initialize NFC smart card reader + + card.OnCardInserted += delegate(object sndr, CardInsertedEventArgs args) + { + if (InvokeRequired) { Invoke(new EventHandler(OnCardInserted), sndr, args); } + else OnCardInserted(sndr, args); + }; + + card.OnCardRemoved += delegate(object sndr, CardRemovedEventArgs args) + { + if (InvokeRequired) { Invoke(new EventHandler(OnCardRemoved), sndr, args); } + else OnCardRemoved(sndr, args); + }; + + card.StartCardEvents(smartCardReader); + + Text += " (NFC)"; + } + } + catch (Exception) + { + smartCardReader = null; + } +#endif + } + + void Localize() + { + Text = Strings.User_Login + (string.IsNullOrEmpty(VersionString) ? "" : (" " + VersionString)); + aliasLabel.Text = GetAliasLabel(); + passwordLabel.Text = Strings.Password; + okButton.Text = Strings.OkBtnText; + cancelButton.Text = Strings.CancelBtnText; + } + + string GetAliasLabel() + { + switch (Method) + { + default: + case Entities.LoginMethod.UserName: return Strings.User_name; + case Entities.LoginMethod.FullName: return Strings.Full_name; + case Entities.LoginMethod.Number: return Strings.User_code; + } + } + + /// + /// Try to authorize the user when OK clicked. + /// + private void okButton_Click(object sender, EventArgs e) + { + user = userNameTextBox.Text; + password = passwordTextBox.Text; + + Entities.AuthorizedAs authorizedAs = Entities.AuthorizedAs.PowerUser; + + bool authorized = Entities.User.IsPowerUser(user, password); + if (authorized) + { + Users.GlobalData.CurrentUser = new Users.Entities.User(user, 6, true); + } + + if (!authorized && !noDatabase) + { + DBSettings[] dbs = new DBSettings[] { GlobalData.RemoteUsersDB, GlobalData.LocalUsersDB }; + authorizedAs = Entities.AuthorizedAs.RemoteUser; + + foreach (var db in dbs) + { + try + { + Users.Entities.User loadedUser = Users.Entities.User.LoadUserByName(user, db); + if (loadedUser != null) + { + switch (Method) + { + default: + case Entities.LoginMethod.UserName: + authorized = (requiredGroupMembership == Grp.GID.Invalid) ? loadedUser.Authorize(user, password) : loadedUser.Authorize(user, password, requiredGroupMembership); + break; + case Entities.LoginMethod.FullName: + authorized = (requiredGroupMembership == Grp.GID.Invalid) ? loadedUser.AuthorizeFullName(user, password) : loadedUser.AuthorizeFullName(user, password, requiredGroupMembership); + break; + case Entities.LoginMethod.Number: + int number; + if (!int.TryParse(user, out number)) break; + authorized = (requiredGroupMembership == Grp.GID.Invalid) ? loadedUser.AuthorizeNumber(number, password) : loadedUser.AuthorizeNumber(number, password, requiredGroupMembership); + break; + } + } + } + catch (Exception) { } + + if (authorized) break; + + authorizedAs = Entities.AuthorizedAs.LocalUser; + } + } + + if (authorized) + { + Users.GlobalData.AuthorizedAs = authorizedAs; + DialogResult = DialogResult.OK; + Close(); + return; + } + + MessageBox.Show(Strings.Invalid_username_or_password, Strings.Error, MessageBoxButtons.OK); + DialogResult = DialogResult.None; + return; + } + + /// + /// Cancel clicked, do not try to authorize. + /// + private void cancelButton_Click(object sender, EventArgs e) + { + if (requiredGroupMembership == Grp.GID.Invalid) + { + Entities.User.Unauthorize(); + } + + DialogResult = DialogResult.Cancel; + Close(); + return; + } + + private void aliasLabel_Click(object sender, EventArgs e) + { + if (++Method == Entities.LoginMethod.Count) Method = 0; + + aliasLabel.Text = GetAliasLabel(); + } + + private void userNameTextBox_KeyPress(object sender, KeyPressEventArgs e) + { + if (Convert.ToInt32(e.KeyChar) == 13) + { + passwordTextBox.Focus(); + } + } + + private void passwordTextBox_KeyPress(object sender, KeyPressEventArgs e) + { + if (Convert.ToInt32(e.KeyChar) == 13) + { + okButton_Click(sender, e); + } + } + + + void OnCardInserted(object sender, CardInsertedEventArgs args) + { + BackColor = Color.Green; + card.Connect(smartCardReader, SHARE.Shared, PROTOCOL.T0orT1); + + /// Read the serial number of the card + APDUResponse response = card.Transmit(new APDUCommand(0xFF, 0xCA, 0x00, 0x00, null, 7)); + string tag = response.ToString(); + + card.Disconnect(DISCONNECT.Leave); + + DBSettings[] dbs = new DBSettings[] { GlobalData.RemoteUsersDB, GlobalData.LocalUsersDB }; + bool authorized = false; + Entities.AuthorizedAs authorizedAs = Entities.AuthorizedAs.RemoteUser; + /// + foreach (var db in dbs) + { + try + { + Users.Entities.User loadedUser = Users.Entities.User.LoadUserByTag(tag, db); + if (loadedUser != null) + { + authorized = (requiredGroupMembership == Grp.GID.Invalid) ? loadedUser.AuthorizeTag(tag) : loadedUser.AuthorizeTag(tag, requiredGroupMembership); + } + } + catch (Exception) { } + + if (authorized) break; + + authorizedAs = Entities.AuthorizedAs.LocalUser; + } + + if (authorized) + { + Users.GlobalData.AuthorizedAs = authorizedAs; + DialogResult = DialogResult.OK; + Close(); + return; + } + + MessageBox.Show(Strings.Invalid_username_or_password, Strings.Error, MessageBoxButtons.OK); + DialogResult = DialogResult.None; + return; + } + + + void OnCardRemoved(object sender, CardRemovedEventArgs args) + { + BackColor = SystemColors.Control; + } + + private void LoginDlg_FormClosing(object sender, FormClosingEventArgs e) + { + if (!string.IsNullOrEmpty(smartCardReader)) + { + card.StopCardEvents(); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/Users/Forms/LoginDlg.resx b/TBF_V2/Sources/TBF/Users/Forms/LoginDlg.resx new file mode 100644 index 00000000..955e22ac --- /dev/null +++ b/TBF_V2/Sources/TBF/Users/Forms/LoginDlg.resx @@ -0,0 +1,300 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + True + + + + 11, 24 + + + 58, 13 + + + 0 + + + User name + + + aliasLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 5 + + + True + + + 11, 51 + + + 53, 13 + + + 1 + + + Password + + + passwordLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + + + + Top, Right + + + 150, 48 + + + 168, 20 + + + 3 + + + passwordTextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + Top, Right + + + 336, 48 + + + 105, 28 + + + 5 + + + Cancel + + + cancelButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + Top, Right + + + 336, 14 + + + 105, 28 + + + 4 + + + OK + + + okButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + Top, Right + + + 150, 22 + + + 168, 20 + + + 2 + + + userNameTextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + + + 6, 13 + + + 456, 88 + + + CenterScreen + + + User login + + + LoginDlg + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Users/Forms/UserManagementDlg.cs b/TBF_V2/Sources/TBF/Users/Forms/UserManagementDlg.cs new file mode 100644 index 00000000..46154dee --- /dev/null +++ b/TBF_V2/Sources/TBF/Users/Forms/UserManagementDlg.cs @@ -0,0 +1,246 @@ +/// +/// Copyright (c) 2017-2018 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using NHibernate; +using Users.Entities; +using Users.Resources; + + +namespace Users.Forms +{ + public partial class UserManagementDlg: Form + { + public string TitleExtension; + + NHibernate.ISession session; + bool showExtensions; + IList ListOfUsers; + int LastSelectedIndex; + + public UserManagementDlg(NHibernate.ISession session, bool showLocalExtensions) + { + InitializeComponent(); + this.session = session; + this.showExtensions = showLocalExtensions; + if (showLocalExtensions) copyFromRemoteButton.Visible = true; + } + + private void UserManagementDlg_Load(object sender, EventArgs e) + { + Text = string.Format(string.IsNullOrEmpty(TitleExtension) ? "{0}" : "{0} : {1}", Strings.User_Management, TitleExtension); + addButton.Text = Strings.AddBtnText; + editButton.Text = Strings.EditBtnText; + deleteButton.Text = Strings.RemoveBtnText; + closeButton.Text = Strings.CloseBtnText; + + listViewUsers.Columns.Add(Strings.User_name, 100); + listViewUsers.Columns.Add(Strings.User_code, 70); + listViewUsers.Columns.Add(Strings.Full_name, 150); +#if TURA_IPERL || TURA_SPECIAL + listViewUsers.Columns.Add(Strings.Tag, 110); +#endif + listViewUsers.Columns.Add(Strings.Groups, 370); + + try + { + ListOfUsers = session.QueryOver().List(); + } + catch (Exception exc) + { + string msg = exc.Message; + } + ListUsers(); + } + + public void ListUsers() + { + Cursor.Current = Cursors.WaitCursor; + + listViewUsers.Items.Clear(); + foreach (User u in ListOfUsers) + { + string grps = string.Empty; + /// +#if TURA_IPERL + foreach (var gid in new Grp.GID[] { Grp.GID.TraceabilityManagement, + Grp.GID.Administrators, + Grp.GID.HeadOfLab, + Grp.GID.Metrologists, + Grp.GID.CalibrationSpecialists, + Grp.GID.TestingSpecialists, + Grp.GID.MaintenanceSpecialists, + Grp.GID.Testers }) +#else + foreach (var gid in new Grp.GID[] { Grp.GID.Administrators, + Grp.GID.HeadOfLab, + Grp.GID.Metrologists, + Grp.GID.CalibrationSpecialists, + Grp.GID.TestingSpecialists, + Grp.GID.MaintenanceSpecialists, + Grp.GID.Testers }) +#endif + { + if (u.IsMemberOf(gid)) + { + if (!string.IsNullOrEmpty(grps)) grps += ", "; + grps += Grp.Gid2Str(gid); + } + } + + ListViewItem item = new ListViewItem(u.UserName); + item.SubItems.Add(u.Number.ToString()); + item.SubItems.Add(u.FullName); +#if TURA_IPERL || TURA_SPECIAL + item.SubItems.Add(string.IsNullOrEmpty(u.Tag) ? string.Empty : u.Tag); +#endif + item.SubItems.Add(grps); + item.Tag = u; + this.listViewUsers.Items.Add(item); + } + this.listViewUsers.Refresh(); + + Cursor.Current = Cursors.Default; + } + + private void closeButton_Click(object sender, EventArgs e) + { + this.Close(); + } + + + private void RefreshButtonStates() + { + editButton.Enabled = (listViewUsers.SelectedItems.Count > 0); + deleteButton.Enabled = (listViewUsers.SelectedItems.Count > 0); + } + + private void listViewUsers_SelectedIndexChanged(object sender, EventArgs e) + { + RefreshButtonStates(); + if (listViewUsers.SelectedItems.Count > 0) + { + LastSelectedIndex = listViewUsers.SelectedItems[0].Index; + } + else + { + LastSelectedIndex = -1; + } + } + + private void editButton_Click(object sender, EventArgs e) + { + if (listViewUsers.SelectedItems.Count == 1 && listViewUsers.SelectedItems[0].Tag is User) + { + new Forms.EditSelectedUser(session, (User)listViewUsers.SelectedItems[0].Tag).ShowDialog(); + ListUsers(); + } + } + + private void listViewUsers_DoubleClick(object sender, EventArgs e) + { + editButton_Click (sender, e); + } + + private void addButton_Click(object sender, EventArgs e) + { + User newUser = new User(); + if (new Forms.EditSelectedUser(session, newUser).ShowDialog() == DialogResult.OK) + { + ListOfUsers.Add(newUser); + } + ListUsers(); + } + + private void deleteButton_Click(object sender, EventArgs e) + { + if (listViewUsers.SelectedItems.Count == 1 && listViewUsers.SelectedItems[0].Tag is User) + { + User Selecteduser = listViewUsers.SelectedItems[0].Tag as User; + Users.DB.DeleteObject(session, Selecteduser); + ListOfUsers.Remove(Selecteduser); + ListUsers(); + } + } + + private void copyFromRemoteButton_Click(object sender, EventArgs e) + { + if (GlobalData.RemoteUsersDB == null || string.IsNullOrEmpty(GlobalData.RemoteUsersDB.ConnectionString) || + GlobalData.LocalUsersDB == null || string.IsNullOrEmpty(GlobalData.LocalUsersDB.ConnectionString)) + { + MessageBox.Show(Strings.No_remote_database_of_users, + Strings.Error, + MessageBoxButtons.OK, + MessageBoxIcon.Exclamation); + return; + } + + if (MessageBox.Show(Strings.Are_you_sure, + Strings.Warning, + MessageBoxButtons.YesNo, + MessageBoxIcon.Exclamation) != DialogResult.Yes) + { + return; + } + + try + { + /// + /// Remote DB session, read remote users + /// + DB.DbType = GlobalData.RemoteUsersDB.DbType; + DB.ConnectionString = GlobalData.RemoteUsersDB.ConnectionString; + ISession session = DB.CreateSession(); + IList remoteUsers = session.QueryOver().List(); + IList remoteGroups = session.QueryOver().List(); + + /// + /// Local DB session + /// + DB.DbType = GlobalData.LocalUsersDB.DbType; + DB.ConnectionString = GlobalData.LocalUsersDB.ConnectionString; + session = DB.CreateSession(); + + /// + /// Delete all local users + /// + IList users = session.QueryOver().List(); + foreach (var user in users) session.Delete(user); + IList groups = session.QueryOver().List(); + foreach (var group in groups) session.Delete(group); + + /// + /// Save all remote users to the local DB + /// + IList newUsers = session.QueryOver().List(); + IList newGroups = session.QueryOver().List(); + foreach (var user in remoteUsers) + { + User newUser = (User)user.Clone(); + newUsers.Add(newUser); + foreach (var group in user.Groups) + { + Group newGroup = new Group(group.Gid, group.Name); + newUser.AddGroup(newGroup); + } + DB.SaveObject(session, newUser); + } + session.Flush(); + + MessageBox.Show(string.Format(Strings.N_users_copied, remoteUsers.Count), + Strings.Confirmation, + MessageBoxButtons.OK, + MessageBoxIcon.Information); + } + catch (Exception) + { + MessageBox.Show(Strings.Copying_remote_users_failed, + Strings.Confirmation, + MessageBoxButtons.OK, + MessageBoxIcon.Information); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/Users/Forms/UserManagementDlg.designer.cs b/TBF_V2/Sources/TBF/Users/Forms/UserManagementDlg.designer.cs new file mode 100644 index 00000000..31afd5cf --- /dev/null +++ b/TBF_V2/Sources/TBF/Users/Forms/UserManagementDlg.designer.cs @@ -0,0 +1,147 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace Users.Forms +{ + partial class UserManagementDlg + { + /// + /// 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(UserManagementDlg)); + this.listViewUsers = new System.Windows.Forms.ListView(); + this.addButton = new System.Windows.Forms.Button(); + this.editButton = new System.Windows.Forms.Button(); + this.deleteButton = new System.Windows.Forms.Button(); + this.closeButton = new System.Windows.Forms.Button(); + this.statusStrip1 = new System.Windows.Forms.StatusStrip(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.copyFromRemoteButton = new System.Windows.Forms.Button(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.SuspendLayout(); + // + // listViewUsers + // + resources.ApplyResources(this.listViewUsers, "listViewUsers"); + this.listViewUsers.FullRowSelect = true; + this.listViewUsers.GridLines = true; + this.listViewUsers.MultiSelect = false; + this.listViewUsers.Name = "listViewUsers"; + this.listViewUsers.UseCompatibleStateImageBehavior = false; + this.listViewUsers.View = System.Windows.Forms.View.Details; + this.listViewUsers.SelectedIndexChanged += new System.EventHandler(this.listViewUsers_SelectedIndexChanged); + this.listViewUsers.DoubleClick += new System.EventHandler(this.listViewUsers_DoubleClick); + // + // addButton + // + resources.ApplyResources(this.addButton, "addButton"); + this.addButton.Name = "addButton"; + this.addButton.UseVisualStyleBackColor = true; + this.addButton.Click += new System.EventHandler(this.addButton_Click); + // + // editButton + // + resources.ApplyResources(this.editButton, "editButton"); + this.editButton.Name = "editButton"; + this.editButton.UseVisualStyleBackColor = true; + this.editButton.Click += new System.EventHandler(this.editButton_Click); + // + // deleteButton + // + resources.ApplyResources(this.deleteButton, "deleteButton"); + this.deleteButton.Name = "deleteButton"; + this.deleteButton.UseVisualStyleBackColor = true; + this.deleteButton.Click += new System.EventHandler(this.deleteButton_Click); + // + // closeButton + // + resources.ApplyResources(this.closeButton, "closeButton"); + this.closeButton.Name = "closeButton"; + this.closeButton.UseVisualStyleBackColor = true; + this.closeButton.Click += new System.EventHandler(this.closeButton_Click); + // + // statusStrip1 + // + resources.ApplyResources(this.statusStrip1, "statusStrip1"); + this.statusStrip1.Name = "statusStrip1"; + // + // splitContainer1 + // + resources.ApplyResources(this.splitContainer1, "splitContainer1"); + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.listViewUsers); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.copyFromRemoteButton); + this.splitContainer1.Panel2.Controls.Add(this.addButton); + this.splitContainer1.Panel2.Controls.Add(this.editButton); + this.splitContainer1.Panel2.Controls.Add(this.closeButton); + this.splitContainer1.Panel2.Controls.Add(this.deleteButton); + // + // copyFromRemoteButton + // + resources.ApplyResources(this.copyFromRemoteButton, "copyFromRemoteButton"); + this.copyFromRemoteButton.Name = "copyFromRemoteButton"; + this.copyFromRemoteButton.UseVisualStyleBackColor = true; + this.copyFromRemoteButton.Click += new System.EventHandler(this.copyFromRemoteButton_Click); + // + // UserManagementDlg + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.splitContainer1); + this.Controls.Add(this.statusStrip1); + this.Name = "UserManagementDlg"; + this.Load += new System.EventHandler(this.UserManagementDlg_Load); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ListView listViewUsers; + private System.Windows.Forms.Button addButton; + private System.Windows.Forms.Button editButton; + private System.Windows.Forms.Button deleteButton; + private System.Windows.Forms.Button closeButton; + private System.Windows.Forms.StatusStrip statusStrip1; + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.Button copyFromRemoteButton; + } +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Users/Forms/UserManagementDlg.resx b/TBF_V2/Sources/TBF/Users/Forms/UserManagementDlg.resx new file mode 100644 index 00000000..2a960f81 --- /dev/null +++ b/TBF_V2/Sources/TBF/Users/Forms/UserManagementDlg.resx @@ -0,0 +1,372 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + Fill + + + + 0, 0 + + + 821, 502 + + + + 0 + + + listViewUsers + + + System.Windows.Forms.ListView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel1 + + + 0 + + + 23, 85 + + + 85, 40 + + + 1 + + + Add + + + addButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel2 + + + 1 + + + 23, 130 + + + 85, 40 + + + 1 + + + Edit + + + editButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel2 + + + 2 + + + 23, 175 + + + 85, 40 + + + 1 + + + Delete + + + deleteButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel2 + + + 4 + + + 23, 18 + + + 85, 40 + + + 1 + + + Close + + + closeButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel2 + + + 3 + + + 17, 17 + + + 0, 502 + + + 956, 22 + + + 2 + + + statusStrip1 + + + statusStrip1 + + + System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + Fill + + + True + + + 0, 0 + + + splitContainer1.Panel1 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1 + + + 0 + + + NoControl + + + 23, 243 + + + 85, 40 + + + 2 + + + Copy all users from remote + + + False + + + copyFromRemoteButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel2 + + + 0 + + + splitContainer1.Panel2 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1 + + + 1 + + + 956, 502 + + + 821 + + + 3 + + + splitContainer1 + + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + + + 6, 13 + + + 956, 524 + + + User Management + + + UserManagementDlg + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Users/GlobalData.cs b/TBF_V2/Sources/TBF/Users/GlobalData.cs new file mode 100644 index 00000000..5be24974 --- /dev/null +++ b/TBF_V2/Sources/TBF/Users/GlobalData.cs @@ -0,0 +1,14 @@ +using System; + +namespace Users +{ + public class GlobalData + { + public static DBSettings RemoteUsersDB = null; + public static DBSettings LocalUsersDB = null; + + public static Entities.User CurrentUser; + public static Entities.AuthorizedAs AuthorizedAs; + public static DateTime LastAuthorization = DateTime.Now; + } +} diff --git a/TBF_V2/Sources/TBF/Users/Grp.cs b/TBF_V2/Sources/TBF/Users/Grp.cs new file mode 100644 index 00000000..e7d97622 --- /dev/null +++ b/TBF_V2/Sources/TBF/Users/Grp.cs @@ -0,0 +1,125 @@ +/// +/// Copyright (c) 2013-2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Text; +using NHibernate; +using FluentNHibernate; +using Users.Entities; +using Users.Resources; + +namespace Users +{ + /// + /// Enum Grp.GID specifies GID-s of user groups. + /// An instance of this class represenst a group, which contains a list of its members (users). + /// Static private array 'groups' of this class, accesible through indexer, contains all groups. + /// + public class Grp + { + /// + /// GID-s of user groups, each user is member of one or more groups. + /// + public enum GID + { + // The first NrOfGroups items are GroupID-s (0..NrOfGroups-1) + Testers = 0, + TestingSpecialists, + HeadOfLab, + MaintenanceSpecialists, + Metrologists, + CalibrationSpecialists, + Administrators, // application / network / database administrator +#if TURA_IPERL + TraceabilityManagement, +#endif + NrOfGroups, // Number of groups (this is not a GroupID) + None, // Not a GroupID, can be used to indicate no group membership is required + Invalid = -1, // Not a GroupID, indicates a variable has not been properly set so far + } + + public static string Gid2Str(int gid) + { + return Gid2Str((GID)gid); + } + + public static string Gid2Str(GID gid) + { + switch (gid) + { + case GID.Testers: return Strings.tester; + case GID.TestingSpecialists: return Strings.specialist; + case GID.HeadOfLab: return Strings.head_of_lab; + case GID.MaintenanceSpecialists: return Strings.maintenance; + case GID.Metrologists: return Strings.metrologist; + case GID.CalibrationSpecialists: return Strings.calibration_specialist; + case GID.Administrators: return Strings.administrator; +#if TURA_IPERL + case GID.TraceabilityManagement: return "správca sledovania vyroby"; +#endif + default: return Strings.invalid; + } + } + + + /// + /// Number of groups. + /// + public const int Count = (int)GID.NrOfGroups; + + // Static array of all groups. + static Grp[] groups; + + /// + /// Static constructor, creates all groups with no members. + /// + static Grp() + { + groups = new Grp[Count]; + for (int i = 0; i < Count; i++) + { + groups[i] = new Grp((GID)i); + } + } + + /// + /// Returns a Group from Id. + /// + /// Group Gid + /// Entities.Group object reference + public static Entities.Group FromId(GID gid) + { + int i = (int)gid; + + if (i >= 0 && i < Count) + { + return groups[i].group; + } + else + { + return null; + } + } + + ///////////////////// ^ static ^ ///////////////////// v instance v ///////////////////// + + /// Public properties + public GID Gid { get { return (GID)group.Gid; } } + public string Name { get { return group.Name; } set { group.Name = value; } } + + /// Private fields + Entities.Group group; + + /// + /// Instance constructor. + /// + /// + public Grp(GID gid) + { + group = new Entities.Group(); + this.group.Gid = (int)gid; + this.group.Name = gid.ToString(); + } + } +} diff --git a/TBF_V2/Sources/TBF/Users/Mappings/GroupMap.cs b/TBF_V2/Sources/TBF/Users/Mappings/GroupMap.cs new file mode 100644 index 00000000..c0fe9dd6 --- /dev/null +++ b/TBF_V2/Sources/TBF/Users/Mappings/GroupMap.cs @@ -0,0 +1,17 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using FluentNHibernate.Mapping; + +namespace Users.Mappings +{ + class GroupMap : ClassMap + { + public GroupMap() + { + Id(x => x.Id); + Map(x => x.Gid); + Map(x => x.Name); + } + } +} diff --git a/TBF_V2/Sources/TBF/Users/Mappings/UserMap.cs b/TBF_V2/Sources/TBF/Users/Mappings/UserMap.cs new file mode 100644 index 00000000..7e47dd80 --- /dev/null +++ b/TBF_V2/Sources/TBF/Users/Mappings/UserMap.cs @@ -0,0 +1,25 @@ +/// +/// Copyright (c) 2016-2018 Sensus Slovensko a.s. +/// +using FluentNHibernate.Mapping; + +namespace Users.Mappings +{ + class UserMap : ClassMap + { + public UserMap() + { + Id(x => x.Id); + Map(x => x.UserName).Column("Name"); + Map(x => x.Number); +#if TURA_IPERL || TURA_SPECIAL + Map(x => x.Tag); +#endif + Map(x => x.Password); + Map(x => x.FullName).Column("Description"); + Map(x => x.LastPwChange); + HasMany(x => x.Groups) + .Cascade.All(); + } + } +} diff --git a/TBF_V2/Sources/TBF/Users/Properties/AssemblyInfo.cs b/TBF_V2/Sources/TBF/Users/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..8787cbea --- /dev/null +++ b/TBF_V2/Sources/TBF/Users/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Users")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Users")] +[assembly: AssemblyCopyright("Copyright © 2018")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("f05db1fc-0a24-4319-802b-d13e9a4b7efe")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("2.18.928.0")] +[assembly: AssemblyFileVersion("2.18.928.0")] diff --git a/TBF_V2/Sources/TBF/Users/Resources/Strings.Designer.cs b/TBF_V2/Sources/TBF/Users/Resources/Strings.Designer.cs new file mode 100644 index 00000000..ed4bf51c --- /dev/null +++ b/TBF_V2/Sources/TBF/Users/Resources/Strings.Designer.cs @@ -0,0 +1,414 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Users.Resources { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Strings { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Strings() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Users.Resources.Strings", typeof(Strings).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Add. + /// + internal static string AddBtnText { + get { + return ResourceManager.GetString("AddBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to administrator. + /// + internal static string administrator { + get { + return ResourceManager.GetString("administrator", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Are you sure?. + /// + internal static string Are_you_sure { + get { + return ResourceManager.GetString("Are_you_sure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to calibration specialist. + /// + internal static string calibration_specialist { + get { + return ResourceManager.GetString("calibration_specialist", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cancel. + /// + internal static string CancelBtnText { + get { + return ResourceManager.GetString("CancelBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Close. + /// + internal static string CloseBtnText { + get { + return ResourceManager.GetString("CloseBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Confirmation. + /// + internal static string Confirmation { + get { + return ResourceManager.GetString("Confirmation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Copying remote users failed. + /// + internal static string Copying_remote_users_failed { + get { + return ResourceManager.GetString("Copying_remote_users_failed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Description. + /// + internal static string DescriptionColHdr { + get { + return ResourceManager.GetString("DescriptionColHdr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Edit User. + /// + internal static string Edit_User { + get { + return ResourceManager.GetString("Edit_User", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Edit. + /// + internal static string EditBtnText { + get { + return ResourceManager.GetString("EditBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error. + /// + internal static string Error { + get { + return ResourceManager.GetString("Error", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Name and Surname. + /// + internal static string Full_name { + get { + return ResourceManager.GetString("Full_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Groups. + /// + internal static string Groups { + get { + return ResourceManager.GetString("Groups", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to head of lab.. + /// + internal static string head_of_lab { + get { + return ResourceManager.GetString("head_of_lab", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ID. + /// + internal static string ID { + get { + return ResourceManager.GetString("ID", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to invalid. + /// + internal static string invalid { + get { + return ResourceManager.GetString("invalid", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid username or password. + /// + internal static string Invalid_username_or_password { + get { + return ResourceManager.GetString("Invalid_username_or_password", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to maintenance. + /// + internal static string maintenance { + get { + return ResourceManager.GetString("maintenance", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to (max. {0} alphanumeric characters). + /// + internal static string max_0_alphanum_chars { + get { + return ResourceManager.GetString("max_0_alphanum_chars", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to metrologist. + /// + internal static string metrologist { + get { + return ResourceManager.GetString("metrologist", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} users copied. + /// + internal static string N_users_copied { + get { + return ResourceManager.GetString("N_users_copied", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Name. + /// + internal static string Name { + get { + return ResourceManager.GetString("Name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No remote database of users. + /// + internal static string No_remote_database_of_users { + get { + return ResourceManager.GetString("No_remote_database_of_users", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to OK. + /// + internal static string OkBtnText { + get { + return ResourceManager.GetString("OkBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Password. + /// + internal static string Password { + get { + return ResourceManager.GetString("Password", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remove. + /// + internal static string RemoveBtnText { + get { + return ResourceManager.GetString("RemoveBtnText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Repeat password. + /// + internal static string Repeat_password { + get { + return ResourceManager.GetString("Repeat_password", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Save or update user failed. + /// + internal static string Save_or_update_user_failed { + get { + return ResourceManager.GetString("Save_or_update_user_failed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to specialist. + /// + internal static string specialist { + get { + return ResourceManager.GetString("specialist", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to NFC Tag. + /// + internal static string Tag { + get { + return ResourceManager.GetString("Tag", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This NFC tag has already been taken. Please use another one.. + /// + internal static string Tag_taken { + get { + return ResourceManager.GetString("Tag_taken", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to tester. + /// + internal static string tester { + get { + return ResourceManager.GetString("tester", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to User code. + /// + internal static string User_code { + get { + return ResourceManager.GetString("User_code", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to User Login. + /// + internal static string User_Login { + get { + return ResourceManager.GetString("User_Login", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to User Management. + /// + internal static string User_Management { + get { + return ResourceManager.GetString("User_Management", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to User name. + /// + internal static string User_name { + get { + return ResourceManager.GetString("User_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This Username has already been taken. Please choose another one.. + /// + internal static string Username_taken { + get { + return ResourceManager.GetString("Username_taken", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Warning. + /// + internal static string Warning { + get { + return ResourceManager.GetString("Warning", resourceCulture); + } + } + } +} diff --git a/TBF_V2/Sources/TBF/Users/Resources/Strings.cs.resx b/TBF_V2/Sources/TBF/Users/Resources/Strings.cs.resx new file mode 100644 index 00000000..b60a642d --- /dev/null +++ b/TBF_V2/Sources/TBF/Users/Resources/Strings.cs.resx @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Přidat + + + Zrušit + + + Popis + + + Editovat + + + Editace uživatele + + + Chyba + + + Jméno a příjmení + + + Skupiny + + + ID + + + Neplatné uživatelské jméno či heslo + + + (max. {0} alfanumerických znaků) + + + Jméno + + + OK + + + Heslo + + + Odstranit + + + Zopakujte heslo + + + Toto uživatelské jméno již bylo použito. Prosím, vyberte jiné. + + + Kód uživatele + + + Uživatelský login + + + Správa uživatelů + + + Uživatelské jméno + + + Zavřít + + + Potvrzení + + + Vytvořených {0} uživatelů v lokální databáze. + + + Varování + + + administrátor + + + může kalibrovat + + + vedoucí + + + úderžbář + + + metrológ + + + specialista + + + tester + + + neplatný + + + Tento NFC tag již byl použit. Prosím, použite jiný. + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Users/Resources/Strings.de.resx b/TBF_V2/Sources/TBF/Users/Resources/Strings.de.resx new file mode 100644 index 00000000..9f78167d --- /dev/null +++ b/TBF_V2/Sources/TBF/Users/Resources/Strings.de.resx @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Neu + + + Abbrechen + + + Beschreibung + + + Bearbeiten + + + Benutzer einrichten + + + Fehler + + + Vorname und Nachname + + + Gruppen + + + ID + + + Ungültiger Benutzername oder Passwort + + + (maximal {0} alphanumerische Zeichen) + + + Name + + + OK + + + Passwort + + + Tabelle entfernen + + + Passwort wiederholen + + + Dieser Benutzername ist bereits vergeben. Bitte wählen Sie einen anderen. + + + Benutzernummer + + + Anmelden + + + Benutzerverwaltung + + + Benutzername + + + Beenden + + + Bestätigung + + + {0} Benutzer gemacht. + + + Warnung + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Users/Resources/Strings.pl.resx b/TBF_V2/Sources/TBF/Users/Resources/Strings.pl.resx new file mode 100644 index 00000000..0ca750b2 --- /dev/null +++ b/TBF_V2/Sources/TBF/Users/Resources/Strings.pl.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Dodaj + + + Anuluj + + + Opis + + + Edycja + + + Edytuj użytkownika + + + Błąd + + + Imię i Nazwisko + + + Grupy + + + ID + + + Nieprawidłowa nazwa użytkownika lub hasło + + + (max. {0} znaków alfanumerycznych) + + + Nazwa + + + OK + + + Hasło + + + Usuń + + + Hasło 2 + + + Ta Nazwa użytkownika jest już zajęta. Proszę wybrać inną. + + + Kod użytkownika + + + Login użytkownika + + + Uprawnienia użytkownika + + + Nazwa użytkownika + + + Zamknij + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Users/Resources/Strings.resx b/TBF_V2/Sources/TBF/Users/Resources/Strings.resx new file mode 100644 index 00000000..d78cf1e5 --- /dev/null +++ b/TBF_V2/Sources/TBF/Users/Resources/Strings.resx @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Add + + + Cancel + + + Description + + + Edit + + + Edit User + + + Error + + + Name and Surname + + + Groups + + + ID + + + Invalid username or password + + + (max. {0} alphanumeric characters) + + + Name + + + OK + + + Password + + + Remove + + + Repeat password + + + This Username has already been taken. Please choose another one. + + + User code + + + User Login + + + User Management + + + User name + + + Close + + + No remote database of users + + + Are you sure? + + + Warning + + + Confirmation + + + {0} users copied + + + Copying remote users failed + + + Save or update user failed + + + administrator + + + calibration specialist + + + head of lab. + + + maintenance + + + metrologist + + + specialist + + + tester + + + invalid + + + NFC Tag + + + This NFC tag has already been taken. Please use another one. + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Users/Resources/Strings.ru.resx b/TBF_V2/Sources/TBF/Users/Resources/Strings.ru.resx new file mode 100644 index 00000000..6e392282 --- /dev/null +++ b/TBF_V2/Sources/TBF/Users/Resources/Strings.ru.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Добавить + + + Отмена + + + Описание + + + Редактировать + + + Редактировать пользователя + + + Ошибка + + + Имя и фамилия + + + Группы + + + ID + + + Неправильное имя пользователя или пароль + + + (макс. {0} вуквенно-цифровых символов) + + + Имя + + + OK + + + Пароль + + + Удалить + + + Пароль 2 + + + Это Имя пользователя уже принято. Пожалуйста, выберите другое. + + + Код пользователя + + + Логин пользователя + + + Управление пользователями + + + Имя пользователя + + + Закрыть + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Users/Resources/Strings.zh-CN.resx b/TBF_V2/Sources/TBF/Users/Resources/Strings.zh-CN.resx new file mode 100644 index 00000000..bb3d9179 --- /dev/null +++ b/TBF_V2/Sources/TBF/Users/Resources/Strings.zh-CN.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 添加 Add + + + 取消 Cancel + + + 描述 + + + 编辑 Edit + + + 编辑用户 + + + 错误 Error + + + + + + 组别 + + + ID + + + 无效的用户名或密码 + + + (最大 {0} 字母数字字符) + + + 名称 + + + 好 OK + + + 密码 + + + 删除 Remove + + + 密码2 + + + 此用户名已被占用。请选择另外一个。 + + + + + + 用户登录 + + + 用户管理 + + + 用户名 + + + 关闭 Close + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/Users/Users.csproj b/TBF_V2/Sources/TBF/Users/Users.csproj new file mode 100644 index 00000000..0a4cbff4 --- /dev/null +++ b/TBF_V2/Sources/TBF/Users/Users.csproj @@ -0,0 +1,128 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {6E5CB0E9-E1B6-4E5D-AC6E-B1049E180F2B} + Library + Properties + Users + Users + v4.0 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\FluentNHibernate.2.0.3.0\lib\net40\FluentNHibernate.dll + + + ..\packages\Iesi.Collections.4.0.0.4000\lib\net40\Iesi.Collections.dll + + + ..\packages\log4net.2.0.2\lib\net40-full\log4net.dll + + + ..\packages\MySql.Data.6.6.5\lib\net40\MySql.Data.dll + + + ..\packages\NHibernate.4.0.4.4000\lib\net40\NHibernate.dll + + + + + + + + + + + + + + + + + + + + Form + + + EditSelectedUser.cs + + + Form + + + UserManagementDlg.cs + + + Form + + + LoginDlg.cs + + + + + + + True + True + Strings.resx + + + + + {8B10D15A-39DE-4B56-8DD1-710C1EB3A697} + GemCard + + + + + EditSelectedUser.cs + + + UserManagementDlg.cs + + + LoginDlg.cs + + + + + + ResXFileCodeGenerator + Strings.Designer.cs + + + + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/clean.bat b/TBF_V2/Sources/TBF/clean.bat new file mode 100644 index 00000000..450f20ee --- /dev/null +++ b/TBF_V2/Sources/TBF/clean.bat @@ -0,0 +1,22 @@ +rmdir /s /q Config\bin +rmdir /s /q Config\obj +rmdir /s /q DeviceTest\bin +rmdir /s /q DeviceTest\obj +rmdir /s /q Dirichlet.Numerics\bin +rmdir /s /q Dirichlet.Numerics\obj +rmdir /s /q GraphLib\bin +rmdir /s /q GraphLib\obj +rmdir /s /q MonitoringDB\bin +rmdir /s /q MonitoringDB\obj +rmdir /s /q Results\bin +rmdir /s /q Results\obj +rmdir /s /q ResultsBrowser\bin +rmdir /s /q ResultsBrowser\obj +rmdir /s /q TBF\bin +rmdir /s /q TBF\obj +rmdir /s /q TBFSetup\Debug +rmdir /s /q TBFSetup\Release +rmdir /s /q Users\bin +rmdir /s /q Users\obj +rmdir /s /q UserManagement\bin +rmdir /s /q UserManagement\obj diff --git a/TBF_V2/Sources/TBF/packages/Common/Logic.ProductionToProductMapper.dll.config b/TBF_V2/Sources/TBF/packages/Common/Logic.ProductionToProductMapper.dll.config new file mode 100644 index 00000000..e936cc13 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Common/Logic.ProductionToProductMapper.dll.config @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/Common/NLog.xml b/TBF_V2/Sources/TBF/packages/Common/NLog.xml new file mode 100644 index 00000000..b886eaa7 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Common/NLog.xml @@ -0,0 +1,28548 @@ + + + + NLog + + + + + Indicates that the value of the marked element could be null sometimes, + so the check for null is necessary before its usage. + + + [CanBeNull] object Test() => null; + + void UseTest() { + var p = Test(); + var s = p.ToString(); // Warning: Possible 'System.NullReferenceException' + } + + + + + Indicates that the value of the marked element could never be null. + + + [NotNull] object Foo() { + return null; // Warning: Possible 'null' assignment + } + + + + + Can be appplied to symbols of types derived from IEnumerable as well as to symbols of Task + and Lazy classes to indicate that the value of a collection item, of the Task.Result property + or of the Lazy.Value property can never be null. + + + + + Can be appplied to symbols of types derived from IEnumerable as well as to symbols of Task + and Lazy classes to indicate that the value of a collection item, of the Task.Result property + or of the Lazy.Value property can be null. + + + + + Indicates that the marked method builds string by format pattern and (optional) arguments. + Parameter, which contains format string, should be given in constructor. The format string + should be in -like form. + + + [StringFormatMethod("message")] + void ShowError(string message, params object[] args) { /* do something */ } + + void Foo() { + ShowError("Failed: {0}"); // Warning: Non-existing argument in format string + } + + + + + Specifies which parameter of an annotated method should be treated as format-string + + + + + For a parameter that is expected to be one of the limited set of values. + Specify fields of which type should be used as values for this parameter. + + + + + Indicates that the function argument should be string literal and match one + of the parameters of the caller function. For example, ReSharper annotates + the parameter of . + + + void Foo(string param) { + if (param == null) + throw new ArgumentNullException("par"); // Warning: Cannot resolve symbol + } + + + + + Indicates that the method is contained in a type that implements + System.ComponentModel.INotifyPropertyChanged interface and this method + is used to notify that some property value changed. + + + The method should be non-static and conform to one of the supported signatures: + + NotifyChanged(string) + NotifyChanged(params string[]) + NotifyChanged{T}(Expression{Func{T}}) + NotifyChanged{T,U}(Expression{Func{T,U}}) + SetProperty{T}(ref T, T, string) + + + + public class Foo : INotifyPropertyChanged { + public event PropertyChangedEventHandler PropertyChanged; + + [NotifyPropertyChangedInvocator] + protected virtual void NotifyChanged(string propertyName) { ... } + + string _name; + + public string Name { + get { return _name; } + set { _name = value; NotifyChanged("LastName"); /* Warning */ } + } + } + + Examples of generated notifications: + + NotifyChanged("Property") + NotifyChanged(() => Property) + NotifyChanged((VM x) => x.Property) + SetProperty(ref myField, value, "Property") + + + + + + Describes dependency between method input and output. + + +

Function Definition Table syntax:

+ + FDT ::= FDTRow [;FDTRow]* + FDTRow ::= Input => Output | Output <= Input + Input ::= ParameterName: Value [, Input]* + Output ::= [ParameterName: Value]* {halt|stop|void|nothing|Value} + Value ::= true | false | null | notnull | canbenull + + If method has single input parameter, it's name could be omitted.
+ Using halt (or void/nothing, which is the same) for method output + means that the methods doesn't return normally (throws or terminates the process).
+ Value canbenull is only applicable for output parameters.
+ You can use multiple [ContractAnnotation] for each FDT row, or use single attribute + with rows separated by semicolon. There is no notion of order rows, all rows are checked + for applicability and applied per each program state tracked by R# analysis.
+
+ + + [ContractAnnotation("=> halt")] + public void TerminationMethod() + + + [ContractAnnotation("halt <= condition: false")] + public void Assert(bool condition, string text) // regular assertion method + + + [ContractAnnotation("s:null => true")] + public bool IsNullOrEmpty(string s) // string.IsNullOrEmpty() + + + // A method that returns null if the parameter is null, + // and not null if the parameter is not null + [ContractAnnotation("null => null; notnull => notnull")] + public object Transform(object data) + + + [ContractAnnotation("=> true, result: notnull; => false, result: null")] + public bool TryParse(string s, out Person result) + + +
+ + + Indicates that marked element should be localized or not. + + + [LocalizationRequiredAttribute(true)] + class Foo { + string str = "my string"; // Warning: Localizable string + } + + + + + Indicates that the value of the marked type (or its derivatives) + cannot be compared using '==' or '!=' operators and Equals() + should be used instead. However, using '==' or '!=' for comparison + with null is always permitted. + + + [CannotApplyEqualityOperator] + class NoEquality { } + + class UsesNoEquality { + void Test() { + var ca1 = new NoEquality(); + var ca2 = new NoEquality(); + if (ca1 != null) { // OK + bool condition = ca1 == ca2; // Warning + } + } + } + + + + + When applied to a target attribute, specifies a requirement for any type marked + with the target attribute to implement or inherit specific type or types. + + + [BaseTypeRequired(typeof(IComponent)] // Specify requirement + class ComponentAttribute : Attribute { } + + [Component] // ComponentAttribute requires implementing IComponent interface + class MyComponent : IComponent { } + + + + + Indicates that the marked symbol is used implicitly (e.g. via reflection, in external library), + so this symbol will not be marked as unused (as well as by other usage inspections). + + + + + Should be used on attributes and causes ReSharper to not mark symbols marked with such attributes + as unused (as well as by other usage inspections) + + + + Only entity marked with attribute considered used. + + + Indicates implicit assignment to a member. + + + + Indicates implicit instantiation of a type with fixed constructor signature. + That means any unused constructor parameters won't be reported as such. + + + + Indicates implicit instantiation of a type. + + + + Specify what is considered used implicitly when marked + with or . + + + + Members of entity marked with attribute are considered used. + + + Entity marked with attribute and all its members considered used. + + + + This attribute is intended to mark publicly available API + which should not be removed and so is treated as used. + + + + + Tells code analysis engine if the parameter is completely handled when the invoked method is on stack. + If the parameter is a delegate, indicates that delegate is executed while the method is executed. + If the parameter is an enumerable, indicates that it is enumerated while the method is executed. + + + + + Indicates that a method does not make any observable state changes. + The same as System.Diagnostics.Contracts.PureAttribute. + + + [Pure] int Multiply(int x, int y) => x * y; + + void M() { + Multiply(123, 42); // Waring: Return value of pure method is not used + } + + + + + Indicates that the return value of method invocation must be used. + + + + + Indicates the type member or parameter of some type, that should be used instead of all other ways + to get the value that type. This annotation is useful when you have some "context" value evaluated + and stored somewhere, meaning that all other ways to get this value must be consolidated with existing one. + + + class Foo { + [ProvidesContext] IBarService _barService = ...; + + void ProcessNode(INode node) { + DoSomething(node, node.GetGlobalServices().Bar); + // ^ Warning: use value of '_barService' field + } + } + + + + + Indicates that a parameter is a path to a file or a folder within a web project. + Path can be relative or absolute, starting from web root (~). + + + + + An extension method marked with this attribute is processed by ReSharper code completion + as a 'Source Template'. When extension method is completed over some expression, it's source code + is automatically expanded like a template at call site. + + + Template method body can contain valid source code and/or special comments starting with '$'. + Text inside these comments is added as source code when the template is applied. Template parameters + can be used either as additional method parameters or as identifiers wrapped in two '$' signs. + Use the attribute to specify macros for parameters. + + + In this example, the 'forEach' method is a source template available over all values + of enumerable types, producing ordinary C# 'foreach' statement and placing caret inside block: + + [SourceTemplate] + public static void forEach<T>(this IEnumerable<T> xs) { + foreach (var x in xs) { + //$ $END$ + } + } + + + + + + Allows specifying a macro for a parameter of a source template. + + + You can apply the attribute on the whole method or on any of its additional parameters. The macro expression + is defined in the property. When applied on a method, the target + template parameter is defined in the property. To apply the macro silently + for the parameter, set the property value = -1. + + + Applying the attribute on a source template method: + + [SourceTemplate, Macro(Target = "item", Expression = "suggestVariableName()")] + public static void forEach<T>(this IEnumerable<T> collection) { + foreach (var item in collection) { + //$ $END$ + } + } + + Applying the attribute on a template method parameter: + + [SourceTemplate] + public static void something(this Entity x, [Macro(Expression = "guid()", Editable = -1)] string newguid) { + /*$ var $x$Id = "$newguid$" + x.ToString(); + x.DoSomething($x$Id); */ + } + + + + + + Allows specifying a macro that will be executed for a source template + parameter when the template is expanded. + + + + + Allows specifying which occurrence of the target parameter becomes editable when the template is deployed. + + + If the target parameter is used several times in the template, only one occurrence becomes editable; + other occurrences are changed synchronously. To specify the zero-based index of the editable occurrence, + use values >= 0. To make the parameter non-editable when the template is expanded, use -1. + > + + + + Identifies the target parameter of a source template if the + is applied on a template method. + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter + is an MVC action. If applied to a method, the MVC action name is calculated + implicitly from the context. Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper, String). + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC area. + Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper, String). + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter is + an MVC controller. If applied to a method, the MVC controller name is calculated + implicitly from the context. Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper, String, String). + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC Master. Use this attribute + for custom wrappers similar to System.Web.Mvc.Controller.View(String, String). + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC model type. Use this attribute + for custom wrappers similar to System.Web.Mvc.Controller.View(String, Object). + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter is an MVC + partial view. If applied to a method, the MVC partial view name is calculated implicitly + from the context. Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.RenderPartialExtensions.RenderPartial(HtmlHelper, String). + + + + + ASP.NET MVC attribute. Allows disabling inspections for MVC views within a class or a method. + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC display template. + Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.DisplayExtensions.DisplayForModel(HtmlHelper, String). + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC editor template. + Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.EditorExtensions.EditorForModel(HtmlHelper, String). + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC template. + Use this attribute for custom wrappers similar to + System.ComponentModel.DataAnnotations.UIHintAttribute(System.String). + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter + is an MVC view component. If applied to a method, the MVC view name is calculated implicitly + from the context. Use this attribute for custom wrappers similar to + System.Web.Mvc.Controller.View(Object). + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter + is an MVC view component name. + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter + is an MVC view component view. If applied to a method, the MVC view component view name is default. + + + + + ASP.NET MVC attribute. When applied to a parameter of an attribute, + indicates that this parameter is an MVC action name. + + + [ActionName("Foo")] + public ActionResult Login(string returnUrl) { + ViewBag.ReturnUrl = Url.Action("Foo"); // OK + return RedirectToAction("Bar"); // Error: Cannot resolve action + } + + + + + Razor attribute. Indicates that a parameter or a method is a Razor section. + Use this attribute for custom wrappers similar to + System.Web.WebPages.WebPageBase.RenderSection(String). + + + + + Indicates how method, constructor invocation or property access + over collection type affects content of the collection. + + + + Method does not use or modify content of the collection. + + + Method only reads content of the collection but does not modify it. + + + Method can change content of the collection but does not add new elements. + + + Method can add new elements to the collection. + + + + Indicates that the marked method is assertion method, i.e. it halts control flow if + one of the conditions is satisfied. To set the condition, mark one of the parameters with + attribute. + + + + + Indicates the condition parameter of the assertion method. The method itself should be + marked by attribute. The mandatory argument of + the attribute is the assertion type. + + + + + Specifies assertion type. If the assertion method argument satisfies the condition, + then the execution continues. Otherwise, execution is assumed to be halted. + + + + Marked parameter should be evaluated to true. + + + Marked parameter should be evaluated to false. + + + Marked parameter should be evaluated to null value. + + + Marked parameter should be evaluated to not null value. + + + + Indicates that the marked method unconditionally terminates control flow execution. + For example, it could unconditionally throw exception. + + + + + Indicates that method is pure LINQ method, with postponed enumeration (like Enumerable.Select, + .Where). This annotation allows inference of [InstantHandle] annotation for parameters + of delegate type by analyzing LINQ method chains. + + + + + Indicates that IEnumerable, passed as parameter, is not enumerated. + + + + + Indicates that parameter is regular expression pattern. + + + + + Prevents the Member Reordering feature from tossing members of the marked class. + + + The attribute must be mentioned in your member reordering patterns + + + + + XAML attribute. Indicates the type that has ItemsSource property and should be treated + as ItemsControl-derived type, to enable inner items DataContext type resolve. + + + + + XAML attribute. Indicates the property of some BindingBase-derived type, that + is used to bind some item of ItemsControl-derived type. This annotation will + enable the DataContext type resolve for XAML bindings for such properties. + + + Property should have the tree ancestor of the ItemsControl type or + marked with the attribute. + + + + + Support implementation of + + + + + + + + + + + + + + + + + Asynchronous continuation delegate - function invoked at the end of asynchronous + processing. + + Exception during asynchronous processing or null if no exception + was thrown. + + + + Helpers for asynchronous operations. + + + + + Iterates over all items in the given collection and runs the specified action + in sequence (each action executes only after the preceding one has completed without an error). + + Type of each item. + The items to iterate. + The asynchronous continuation to invoke once all items + have been iterated. + The action to invoke for each item. + + + + Repeats the specified asynchronous action multiple times and invokes asynchronous continuation at the end. + + The repeat count. + The asynchronous continuation to invoke at the end. + The action to invoke. + + + + Modifies the continuation by pre-pending given action to execute just before it. + + The async continuation. + The action to pre-pend. + Continuation which will execute the given action before forwarding to the actual continuation. + + + + Attaches a timeout to a continuation which will invoke the continuation when the specified + timeout has elapsed. + + The asynchronous continuation. + The timeout. + Wrapped continuation. + + + + Iterates over all items in the given collection and runs the specified action + in parallel (each action executes on a thread from thread pool). + + Type of each item. + The items to iterate. + The asynchronous continuation to invoke once all items + have been iterated. + The action to invoke for each item. + + + + Runs the specified asynchronous action synchronously (blocks until the continuation has + been invoked). + + The action. + + Using this method is not recommended because it will block the calling thread. + + + + + Wraps the continuation with a guard which will only make sure that the continuation function + is invoked only once. + + The asynchronous continuation. + Wrapped asynchronous continuation. + + + + Gets the combined exception from all exceptions in the list. + + The exceptions. + Combined exception or null if no exception was thrown. + + + + Disposes the Timer, and waits for it to leave the Timer-callback-method + + The Timer object to dispose + Timeout to wait (TimeSpan.Zero means dispose without wating) + Timer disposed within timeout (true/false) + + + + Asynchronous action. + + Continuation to be invoked at the end of action. + + + + Asynchronous action with one argument. + + Type of the argument. + Argument to the action. + Continuation to be invoked at the end of action. + + + + Represents the logging event with asynchronous continuation. + + + + + Initializes a new instance of the struct. + + The log event. + The continuation. + + + + Gets the log event. + + + + + Gets the continuation. + + + + + Implements the operator ==. + + The event info1. + The event info2. + The result of the operator. + + + + Implements the operator ==. + + The event info1. + The event info2. + The result of the operator. + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + A value of true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + String Conversion Helpers + + + + + Converts input string value into + + Input value + Output value + Default value + Returns failure if the input value could not be parsed + + + + Converts the string representation of the name or numeric value of one or more enumerated constants to an equivalent enumerated object. A parameter specifies whether the operation is case-sensitive. The return value indicates whether the conversion succeeded. + + The enumeration type to which to convert value. + The string representation of the enumeration name or underlying value to convert. + When this method returns, result contains an object of type TEnum whose value is represented by value if the parse operation succeeds. If the parse operation fails, result contains the default value of the underlying type of TEnum. Note that this value need not be a member of the TEnum enumeration. This parameter is passed uninitialized. + true if the value parameter was converted successfully; otherwise, false. + Wrapper because Enum.TryParse is not present in .net 3.5 + + + + Converts the string representation of the name or numeric value of one or more enumerated constants to an equivalent enumerated object. A parameter specifies whether the operation is case-sensitive. The return value indicates whether the conversion succeeded. + + The enumeration type to which to convert value. + The string representation of the enumeration name or underlying value to convert. + true to ignore case; false to consider case. + When this method returns, result contains an object of type TEnum whose value is represented by value if the parse operation succeeds. If the parse operation fails, result contains the default value of the underlying type of TEnum. Note that this value need not be a member of the TEnum enumeration. This parameter is passed uninitialized. + true if the value parameter was converted successfully; otherwise, false. + Wrapper because Enum.TryParse is not present in .net 3.5 + + + + Enum.TryParse implementation for .net 3.5 + + + + Don't uses reflection + + + + NLog internal logger. + + Writes to file, console or custom textwriter (see ) + + + Don't use as that can lead to recursive calls - stackoverflows + + + + + Gets a value indicating whether internal log includes Trace messages. + + + + + Gets a value indicating whether internal log includes Debug messages. + + + + + Gets a value indicating whether internal log includes Info messages. + + + + + Gets a value indicating whether internal log includes Warn messages. + + + + + Gets a value indicating whether internal log includes Error messages. + + + + + Gets a value indicating whether internal log includes Fatal messages. + + + + + Logs the specified message without an at the Trace level. + + Message which may include positional parameters. + Arguments to the message. + + + + Logs the specified message without an at the Trace level. + + Log message. + + + + Logs the specified message without an at the Trace level. + will be only called when logging is enabled for level Trace. + + Function that returns the log message. + + + + Logs the specified message with an at the Trace level. + + Exception to be logged. + Message which may include positional parameters. + Arguments to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + Message which may include positional parameters. + Argument {0} to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + The type of the second argument. + Message which may include positional parameters. + Argument {0} to the message. + Argument {1} to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + Message which may include positional parameters. + Argument {0} to the message. + Argument {1} to the message. + Argument {2} to the message. + + + + Logs the specified message with an at the Trace level. + + Exception to be logged. + Log message. + + + + Logs the specified message with an at the Trace level. + will be only called when logging is enabled for level Trace. + + Exception to be logged. + Function that returns the log message. + + + + Logs the specified message without an at the Debug level. + + Message which may include positional parameters. + Arguments to the message. + + + + Logs the specified message without an at the Debug level. + + Log message. + + + + Logs the specified message without an at the Debug level. + will be only called when logging is enabled for level Debug. + + Function that returns the log message. + + + + Logs the specified message with an at the Debug level. + + Exception to be logged. + Message which may include positional parameters. + Arguments to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + Message which may include positional parameters. + Argument {0} to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + The type of the second argument. + Message which may include positional parameters. + Argument {0} to the message. + Argument {1} to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + Message which may include positional parameters. + Argument {0} to the message. + Argument {1} to the message. + Argument {2} to the message. + + + + Logs the specified message with an at the Debug level. + + Exception to be logged. + Log message. + + + + Logs the specified message with an at the Debug level. + will be only called when logging is enabled for level Debug. + + Exception to be logged. + Function that returns the log message. + + + + Logs the specified message without an at the Info level. + + Message which may include positional parameters. + Arguments to the message. + + + + Logs the specified message without an at the Info level. + + Log message. + + + + Logs the specified message without an at the Info level. + will be only called when logging is enabled for level Info. + + Function that returns the log message. + + + + Logs the specified message with an at the Info level. + + Exception to be logged. + Message which may include positional parameters. + Arguments to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + Message which may include positional parameters. + Argument {0} to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + The type of the second argument. + Message which may include positional parameters. + Argument {0} to the message. + Argument {1} to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + Message which may include positional parameters. + Argument {0} to the message. + Argument {1} to the message. + Argument {2} to the message. + + + + Logs the specified message with an at the Info level. + + Exception to be logged. + Log message. + + + + Logs the specified message with an at the Info level. + will be only called when logging is enabled for level Info. + + Exception to be logged. + Function that returns the log message. + + + + Logs the specified message without an at the Warn level. + + Message which may include positional parameters. + Arguments to the message. + + + + Logs the specified message without an at the Warn level. + + Log message. + + + + Logs the specified message without an at the Warn level. + will be only called when logging is enabled for level Warn. + + Function that returns the log message. + + + + Logs the specified message with an at the Warn level. + + Exception to be logged. + Message which may include positional parameters. + Arguments to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + Message which may include positional parameters. + Argument {0} to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + The type of the second argument. + Message which may include positional parameters. + Argument {0} to the message. + Argument {1} to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + Message which may include positional parameters. + Argument {0} to the message. + Argument {1} to the message. + Argument {2} to the message. + + + + Logs the specified message with an at the Warn level. + + Exception to be logged. + Log message. + + + + Logs the specified message with an at the Warn level. + will be only called when logging is enabled for level Warn. + + Exception to be logged. + Function that returns the log message. + + + + Logs the specified message without an at the Error level. + + Message which may include positional parameters. + Arguments to the message. + + + + Logs the specified message without an at the Error level. + + Log message. + + + + Logs the specified message without an at the Error level. + will be only called when logging is enabled for level Error. + + Function that returns the log message. + + + + Logs the specified message with an at the Error level. + + Exception to be logged. + Message which may include positional parameters. + Arguments to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + Message which may include positional parameters. + Argument {0} to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + The type of the second argument. + Message which may include positional parameters. + Argument {0} to the message. + Argument {1} to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + Message which may include positional parameters. + Argument {0} to the message. + Argument {1} to the message. + Argument {2} to the message. + + + + Logs the specified message with an at the Error level. + + Exception to be logged. + Log message. + + + + Logs the specified message with an at the Error level. + will be only called when logging is enabled for level Error. + + Exception to be logged. + Function that returns the log message. + + + + Logs the specified message without an at the Fatal level. + + Message which may include positional parameters. + Arguments to the message. + + + + Logs the specified message without an at the Fatal level. + + Log message. + + + + Logs the specified message without an at the Fatal level. + will be only called when logging is enabled for level Fatal. + + Function that returns the log message. + + + + Logs the specified message with an at the Fatal level. + + Exception to be logged. + Message which may include positional parameters. + Arguments to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + Message which may include positional parameters. + Argument {0} to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + The type of the second argument. + Message which may include positional parameters. + Argument {0} to the message. + Argument {1} to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + Message which may include positional parameters. + Argument {0} to the message. + Argument {1} to the message. + Argument {2} to the message. + + + + Logs the specified message with an at the Fatal level. + + Exception to be logged. + Log message. + + + + Logs the specified message with an at the Fatal level. + will be only called when logging is enabled for level Fatal. + + Exception to be logged. + Function that returns the log message. + + + + Initializes static members of the InternalLogger class. + + + + + Set the config of the InternalLogger with defaults and config. + + + + + Gets or sets the minimal internal log level. + + If set to , then messages of the levels , and will be written. + + + + Gets or sets a value indicating whether internal messages should be written to the console output stream. + + Your application must be a console application. + + + + Gets or sets a value indicating whether internal messages should be written to the console error stream. + + Your application must be a console application. + + + + Gets or sets a value indicating whether internal messages should be written to the .Trace + + + + + Gets or sets the file path of the internal log file. + + A value of value disables internal logging to a file. + + + + Gets or sets the text writer that will receive internal logs. + + + + + Gets or sets a value indicating whether timestamp should be included in internal log output. + + + + + Is there an thrown when writing the message? + + + + + Logs the specified message without an at the specified level. + + Log level. + Message which may include positional parameters. + Arguments to the message. + + + + Logs the specified message without an at the specified level. + + Log level. + Log message. + + + + Logs the specified message without an at the specified level. + will be only called when logging is enabled for level . + + Log level. + Function that returns the log message. + + + + Logs the specified message with an at the specified level. + will be only called when logging is enabled for level . + + Exception to be logged. + Log level. + Function that returns the log message. + + + + Logs the specified message with an at the specified level. + + Exception to be logged. + Log level. + Message which may include positional parameters. + Arguments to the message. + + + + Logs the specified message with an at the specified level. + + Exception to be logged. + Log level. + Log message. + + + + Write to internallogger. + + optional exception to be logged. + level + message + optional args for + + + + Determine if logging should be avoided because of exception type. + + The exception to check. + true if logging should be avoided; otherwise, false. + + + + Determine if logging is enabled for given LogLevel + + The for the log event. + true if logging is enabled; otherwise, false. + + + + Determine if logging is enabled. + + true if logging is enabled; otherwise, false. + + + + Write internal messages to the log file defined in . + + Message to write. + + Message will be logged only when the property is not null, otherwise the + method has no effect. + + + + + Write internal messages to the defined in . + + Message to write. + + Message will be logged only when the property is not null, otherwise the + method has no effect. + + + + + Write internal messages to the . + + Message to write. + + Message will be logged only when the property is true, otherwise the + method has no effect. + + + + + Write internal messages to the . + + Message to write. + + Message will be logged when the property is true, otherwise the + method has no effect. + + + + + Write internal messages to the . + + A message to write. + + Works when property set to true. + The is used in Debug and Release configuration. + The works only in Debug configuration and this is reason why is replaced by . + in DEBUG + + + + + Logs the assembly version and file version of the given Assembly. + + The assembly to log. + + + + A cyclic buffer of object. + + + + + Initializes a new instance of the class. + + Buffer size. + Whether buffer should grow as it becomes full. + The maximum number of items that the buffer can grow to. + + + + Gets the capacity of the buffer + + + + + Gets the number of items in the buffer + + + + + Adds the specified log event to the buffer. + + Log event. + The number of items in the buffer. + + + + Gets the array of events accumulated in the buffer and clears the buffer as one atomic operation. + + Events in the buffer. + + + + Condition and expression. + + + + + Initializes a new instance of the class. + + Left hand side of the AND expression. + Right hand side of the AND expression. + + + + Gets the left hand side of the AND expression. + + + + + Gets the right hand side of the AND expression. + + + + + Returns a string representation of this expression. + + A concatenated '(Left) and (Right)' string. + + + + Evaluates the expression by evaluating and recursively. + + Evaluation context. + The value of the conjunction operator. + + + + Exception during evaluation of condition expression. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + The inner exception. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + The parameter is null. + + + The class name is null or is zero (0). + + + + + Base class for representing nodes in condition expression trees. + + + + + Converts condition text to a condition expression tree. + + Condition text to be converted. + Condition expression tree. + + + + Evaluates the expression. + + Evaluation context. + Expression result. + + + + Returns a string representation of the expression. + + + A that represents the condition expression. + + + + + Evaluates the expression. + + Evaluation context. + Expression result. + + + + Condition layout expression (represented by a string literal + with embedded ${}). + + + + + Initializes a new instance of the class. + + The layout. + + + + Gets the layout. + + The layout. + + + + Returns a string representation of this expression. + + String literal in single quotes. + + + + Evaluates the expression by calculating the value + of the layout in the specified evaluation context. + + Evaluation context. + The value of the layout. + + + + Condition level expression (represented by the level keyword). + + + + + Returns a string representation of the expression. + + The 'level' string. + + + + Evaluates to the current log level. + + Evaluation context. Ignored. + The object representing current log level. + + + + Condition literal expression (numeric, LogLevel.XXX, true or false). + + + + + Initializes a new instance of the class. + + Literal value. + + + + Gets the literal value. + + The literal value. + + + + Returns a string representation of the expression. + + The literal value. + + + + Evaluates the expression. + + Evaluation context. + The literal value as passed in the constructor. + + + + Condition logger name expression (represented by the logger keyword). + + + + + Returns a string representation of this expression. + + A logger string. + + + + Evaluates to the logger name. + + Evaluation context. + The logger name. + + + + Condition message expression (represented by the message keyword). + + + + + Returns a string representation of this expression. + + The 'message' string. + + + + Evaluates to the logger message. + + Evaluation context. + The logger message. + + + + Marks class as a log event Condition and assigns a name to it. + + + + + Initializes a new instance of the class. + + Condition method name. + + + + Condition method invocation expression (represented by method(p1,p2,p3) syntax). + + + + + Initializes a new instance of the class. + + Name of the condition method. + of the condition method. + The method parameters. + + + + Gets the method info. + + + + + Gets the method parameters. + + The method parameters. + + + + Returns a string representation of the expression. + + + A that represents the condition expression. + + + + + Evaluates the expression. + + Evaluation context. + Expression result. + + + + A bunch of utility methods (mostly predicates) which can be used in + condition expressions. Partially inspired by XPath 1.0. + + + + + Compares two values for equality. + + The first value. + The second value. + true when two objects are equal, false otherwise. + + + + Compares two strings for equality. + + The first string. + The second string. + Optional. If true, case is ignored; if false (default), case is significant. + true when two strings are equal, false otherwise. + + + + Gets or sets a value indicating whether the second string is a substring of the first one. + + The first string. + The second string. + Optional. If true (default), case is ignored; if false, case is significant. + true when the second string is a substring of the first string, false otherwise. + + + + Gets or sets a value indicating whether the second string is a prefix of the first one. + + The first string. + The second string. + Optional. If true (default), case is ignored; if false, case is significant. + true when the second string is a prefix of the first string, false otherwise. + + + + Gets or sets a value indicating whether the second string is a suffix of the first one. + + The first string. + The second string. + Optional. If true (default), case is ignored; if false, case is significant. + true when the second string is a prefix of the first string, false otherwise. + + + + Returns the length of a string. + + A string whose lengths is to be evaluated. + The length of the string. + + + + Indicates whether the specified regular expression finds a match in the specified input string. + + The string to search for a match. + The regular expression pattern to match. + A string consisting of the desired options for the test. The possible values are those of the separated by commas. + true if the regular expression finds a match; otherwise, false. + + + + + + + + + + + Marks the class as containing condition methods. + + + + + Condition not expression. + + + + + Initializes a new instance of the class. + + The expression. + + + + Gets the expression to be negated. + + The expression. + + + + Returns a string representation of the expression. + + + A that represents the condition expression. + + + + + Evaluates the expression. + + Evaluation context. + Expression result. + + + + Condition or expression. + + + + + Initializes a new instance of the class. + + Left hand side of the OR expression. + Right hand side of the OR expression. + + + + Gets the left expression. + + The left expression. + + + + Gets the right expression. + + The right expression. + + + + Returns a string representation of the expression. + + + A that represents the condition expression. + + + + + Evaluates the expression by evaluating and recursively. + + Evaluation context. + The value of the alternative operator. + + + + Exception during parsing of condition expression. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + The inner exception. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + The parameter is null. + + + The class name is null or is zero (0). + + + + + Condition parser. Turns a string representation of condition expression + into an expression tree. + + + + + Initializes a new instance of the class. + + The string reader. + Instance of used to resolve references to condition methods and layout renderers. + + + + Parses the specified condition string and turns it into + tree. + + The expression to be parsed. + The root of the expression syntax tree which can be used to get the value of the condition in a specified context. + + + + Parses the specified condition string and turns it into + tree. + + The expression to be parsed. + Instance of used to resolve references to condition methods and layout renderers. + The root of the expression syntax tree which can be used to get the value of the condition in a specified context. + + + + Parses the specified condition string and turns it into + tree. + + The string reader. + Instance of used to resolve references to condition methods and layout renderers. + + The root of the expression syntax tree which can be used to get the value of the condition in a specified context. + + + + + Try stringed keyword to + + + + success? + + + + Parse number + + negative number? minus should be parsed first. + + + + + Condition relational (==, !=, <, <=, + > or >=) expression. + + + + + Initializes a new instance of the class. + + The left expression. + The right expression. + The relational operator. + + + + Gets the left expression. + + The left expression. + + + + Gets the right expression. + + The right expression. + + + + Gets the relational operator. + + The operator. + + + + Returns a string representation of the expression. + + + A that represents the condition expression. + + + + + Evaluates the expression. + + Evaluation context. + Expression result. + + + + Compares the specified values using specified relational operator. + + The first value. + The second value. + The relational operator. + Result of the given relational operator. + + + + Promote values to the type needed for the comparision, e.g. parse a string to int. + + + + + + + Promotes to type + + + + success? + + + + Try to promote both values. First try to promote to , + when failed, try to . + + + + + + Get the order for the type for comparision. + + + index, 0 to maxint. Lower is first + + + + Dictionary from type to index. Lower index should be tested first. + + + + + Build the dictionary needed for the order of the types. + + + + + + Get the string representing the current + + + + + + Relational operators used in conditions. + + + + + Equality (==). + + + + + Inequality (!=). + + + + + Less than (<). + + + + + Greater than (>). + + + + + Less than or equal (<=). + + + + + Greater than or equal (>=). + + + + + Hand-written tokenizer for conditions. + + + + + Initializes a new instance of the class. + + The string reader. + + + + Gets the type of the token. + + The type of the token. + + + + Gets the token value. + + The token value. + + + + Gets the value of a string token. + + The string token value. + + + + Asserts current token type and advances to the next token. + + Expected token type. + If token type doesn't match, an exception is thrown. + + + + Asserts that current token is a keyword and returns its value and advances to the next token. + + Keyword value. + + + + Gets or sets a value indicating whether current keyword is equal to the specified value. + + The keyword. + + A value of true if current keyword is equal to the specified value; otherwise, false. + + + + + Gets or sets a value indicating whether the tokenizer has reached the end of the token stream. + + + A value of true if the tokenizer has reached the end of the token stream; otherwise, false. + + + + + Gets or sets a value indicating whether current token is a number. + + + A value of true if current token is a number; otherwise, false. + + + + + Gets or sets a value indicating whether the specified token is of specified type. + + The token type. + + A value of true if current token is of specified type; otherwise, false. + + + + + Gets the next token and sets and properties. + + + + + Try the comparison tokens (greater, smaller, greater-equals, smaller-equals) + + current char + is match + + + + Try the logical tokens (and, or, not, equals) + + current char + is match + + + + Mapping between characters and token types for punctuations. + + + + + Initializes a new instance of the CharToTokenType struct. + + The character. + Type of the token. + + + + Token types for condition expressions. + + + + + Marks the class or a member as advanced. Advanced classes and members are hidden by + default in generated documentation. + + + + + Initializes a new instance of the class. + + + + + Identifies that the output of layout or layout render does not change for the lifetime of the current appdomain. + + + A layout(renderer) could be converted to a literal when: + - The layout and all layout properies are SimpleLayout or [AppDomainFixedOutput] + + Recommendation: Apply this attribute to a layout or layout-renderer which have the result only changes by properties of type Layout. + + + + + Used to mark configurable parameters which are arrays. + Specifies the mapping between XML elements and .NET types. + + + + + Initializes a new instance of the class. + + The type of the array item. + The XML element name that represents the item. + + + + Gets the .NET type of the array item. + + + + + Gets the XML element name. + + + + + An assembly is trying to load. + + + + + New event args + + + + + + The assembly that is trying to load. + + + + + NLog configuration section handler class for configuring NLog from App.config. + + + + + Creates a configuration section handler. + + Parent object. + Configuration context object. + Section XML node. + The created section handler object. + + + + Constructs a new instance the configuration item (target, layout, layout renderer, etc.) given its type. + + Type of the item. + Created object of the specified type. + + + + Provides registration information for named items (targets, layouts, layout renderers, etc.) managed by NLog. + + Everything of an assembly could be loaded by + + + + + Called before the assembly will be loaded. + + + + + Initializes a new instance of the class. + + The assemblies to scan for named items. + + + + Gets or sets default singleton instance of . + + + This property implements lazy instantiation so that the is not built before + the internal logger is configured. + + + + + Gets or sets the creator delegate used to instantiate configuration objects. + + + By overriding this property, one can enable dependency injection or interception for created objects. + + + + + Gets the factory. + + The target factory. + + + + Gets the factory. + + The filter factory. + + + + gets the factory + + not using due to backwardscomp. + + + + + Gets the factory. + + The layout renderer factory. + + + + Gets the factory. + + The layout factory. + + + + Gets the ambient property factory. + + The ambient property factory. + + + + Legacy interface, no longer used by the NLog engine + + + + + Gets or sets the JSON serializer to use with or + + + + + Gets or sets the string serializer to use with + + + + + Gets or sets the parameter converter to use with , or + + + + + Perform message template parsing and formatting of LogEvent messages (True = Always, False = Never, Null = Auto Detect) + + + - Null (Auto Detect) : NLog-parser checks for positional parameters, and will then fallback to string.Format-rendering. + - True: Always performs the parsing of and rendering of using the NLog-parser (Allows custom formatting with ) + - False: Always performs parsing and rendering using string.Format (Fastest if not using structured logging) + + + + + Gets the time source factory. + + The time source factory. + + + + Gets the condition method factory. + + The condition method factory. + + + + Registers named items from the assembly. + + The assembly. + + + + Registers named items from the assembly. + + The assembly. + Item name prefix. + + + + Call Preload for NLogPackageLoader + + + Every package could implement a class "NLogPackageLoader" (namespace not important) with the public static method "Preload" (no arguments) + This method will be called just before registering all items in the assembly. + + + + + + Call the Preload method for . The Preload method must be static. + + + + + + Clears the contents of all factories. + + + + + Registers the type. + + The type to register. + The item name prefix. + + + + Builds the default configuration item factory. + + Default factory. + + + + Registers items in NLog.Extended.dll using late-bound types, so that we don't need a reference to NLog.Extended.dll. + + + + + Attribute used to mark the default parameters for layout renderers. + + + + + Initializes a new instance of the class. + + + + + Dynamic filtering with a positive list of enabled levels + + + + + Dynamic filtering with a minlevel and maxlevel range + + + + + Format of the exception output to the specific target. + + + + + Appends the Message of an Exception to the specified target. + + + + + Appends the type of an Exception to the specified target. + + + + + Appends the short type of an Exception to the specified target. + + + + + Appends the result of calling ToString() on an Exception to the specified target. + + + + + Appends the method name from Exception's stack trace to the specified target. + + + + + Appends the stack trace from an Exception to the specified target. + + + + + Appends the contents of an Exception's Data property to the specified target. + + + + + Destructure the exception (usually into JSON) + + + + + Appends the from the application or the object that caused the error. + + + + + Factory for class-based items. + + The base type of each item. + The type of the attribute used to annotate items. + + + + Scans the assembly. + + The types to scan. + The prefix. + + + + Registers the type. + + The type to register. + The item name prefix. + + + + Registers the item based on a type name. + + Name of the item. + Name of the type. + + + + Clears the contents of the factory. + + + + + Registers a single type definition. + + The item name. + The type of the item. + + + + Tries to get registered item definition. + + Name of the item. + Reference to a variable which will store the item definition. + Item definition. + + + + Tries to create an item instance. + + Name of the item. + The result. + True if instance was created successfully, false otherwise. + + + + Creates an item instance. + + The name of the item. + Created item. + + + + Factory specialized for s. + + + + + Clear all func layouts + + + + + Register a layout renderer with a callback function. + + Name of the layoutrenderer, without ${}. + the renderer that renders the value. + + + + Tries to create an item instance. + + Name of the item. + The result. + True if instance was created successfully, false otherwise. + + + + Provides means to populate factories of named items (such as targets, layouts, layout renderers, etc.). + + + + + Implemented by objects which support installation and uninstallation. + + + + + Performs installation which requires administrative permissions. + + The installation context. + + + + Performs uninstallation which requires administrative permissions. + + The installation context. + + + + Determines whether the item is installed. + + The installation context. + + Value indicating whether the item is installed or null if it is not possible to determine. + + + + + Interface for accessing configuration details + + + + + Name of the config section + + + + + Configuration Key/Value Pairs + + + + + Child config sections + + + + + Interface for loading NLog + + + + + Finds and loads the NLog configuration + + LogFactory that owns the NLog configuration + NLog configuration (or null if none found) + + + + Notifies when LoggingConfiguration has been successfully applied + + LogFactory that owns the NLog configuration + NLog Config + + + + Get file paths (including filename) for the possible NLog config files. + + The filepaths to the possible config file + + + + Level enabled flags for each LogLevel ordinal + + + + + Converts the filter into a simple + + + + + Represents a factory of named items (such as targets, layouts, layout renderers, etc.). + + Base type for each item instance. + Item definition type (typically or ). + + + + Registers new item definition. + + Name of the item. + Item definition. + + + + Tries to get registered item definition. + + Name of the item. + Reference to a variable which will store the item definition. + Item definition. + + + + Creates item instance. + + Name of the item. + Newly created item instance. + + + + Tries to create an item instance. + + Name of the item. + The result. + True if instance was created successfully, false otherwise. + + + + Provides context for install/uninstall operations. + + + + + Mapping between log levels and console output colors. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The log output. + + + + Gets or sets the installation log level. + + + + + Gets or sets a value indicating whether to ignore failures during installation. + + + + + Whether installation exceptions should be rethrown. If IgnoreFailures is set to true, + this property has no effect (there are no exceptions to rethrow). + + + + + Gets the installation parameters. + + + + + Gets or sets the log output. + + + + + Logs the specified trace message. + + The message. + The arguments. + + + + Logs the specified debug message. + + The message. + The arguments. + + + + Logs the specified informational message. + + The message. + The arguments. + + + + Logs the specified warning message. + + The message. + The arguments. + + + + Logs the specified error message. + + The message. + The arguments. + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Creates the log event which can be used to render layouts during installation/uninstallations. + + Log event info object. + + + + Convert object-value into specified type + + + + + Parses the input value and converts into the wanted type + + Input Value + Wanted Type + Format to use when parsing + Culture to use when parsing + Output value with wanted type + + + + Encapsulates and the logic to match the actual logger name + All subclasses defines immutable objects. + Concrete subclasses defines various matching rules through + + + + + Creates a concrete based on . + + + Rules used to select the concrete implementation returned: + + if is null => returns (never matches) + if doesn't contains any '*' nor '?' => returns (matches only on case sensitive equals) + if == '*' => returns (always matches) + if doesn't contain '?' + + if contains exactly 2 '*' one at the beginning and one at the end (i.e. "*foobar*) => returns + if contains exactly 1 '*' at the beginning (i.e. "*foobar") => returns + if contains exactly 1 '*' at the end (i.e. "foobar*") => returns + + + returns + + + + It may include one or more '*' or '?' wildcards at any position. + + '*' means zero or more occurrecnces of any character + '?' means exactly one occurrence of any character + + + A concrete + + + + Returns the argument passed to + + + + + Checks whether given name matches the logger name pattern. + + String to be matched. + A value of when the name matches, otherwise. + + + + Defines a that never matches. + Used when pattern is null + + + + + Defines a that always matches. + Used when pattern is '*' + + + + + Defines a that matches with a case-sensitive Equals + Used when pattern is a string without wildcards '?' '*' + + + + + Defines a that matches with a case-sensitive StartsWith + Used when pattern is a string like "*foobar" + + + + + Defines a that matches with a case-sensitive EndsWith + Used when pattern is a string like "foobar*" + + + + + Defines a that matches with a case-sensitive Contains + Used when pattern is a string like "*foobar*" + + + + + Defines a that matches with a complex wildcards combinations: + + '*' means zero or more occurrences of any character + '?' means exactly one occurrence of any character + + used when pattern is a string containing any number of '?' or '*' in any position + i.e. "*Server[*].Connection[?]" + + + + + Keeps logging configuration and provides simple API to modify it. + + This class is thread-safe..ToList() is used for that purpose. + + + + Variables defined in xml or in API. name is case case insensitive. + + + + + Gets the factory that will be configured + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Use the old exception log handling of NLog 3.0? + + This method was marked as obsolete on NLog 4.1 and it may be removed in a future release. + + + + Gets the variables defined in the configuration. + + + + + Gets a collection of named targets specified in the configuration. + + + A list of named targets. + + + Unnamed targets (such as those wrapped by other targets) are not returned. + + + + + Gets the collection of file names which should be watched for changes by NLog. + + + + + Gets the collection of logging rules. + + + + + Gets or sets the default culture info to use as . + + + Specific culture info or null to use + + + + + Gets all targets. + + + + + Compare objects based on their name. + + This property is use to cache the comparer object. + + + + Defines methods to support the comparison of objects for equality based on their name. + + + + + Registers the specified target object. The name of the target is read from . + + + The target object with a non + + when is + + + + Registers the specified target object under a given name. + + Name of the target. + The target object. + when is + when is + + + + Finds the target with the specified name. + + + The name of the target to be found. + + + Found target or when the target is not found. + + + + + Finds the target with the specified name and specified type. + + + The name of the target to be found. + + Type of the target + + Found target or when the target is not found of not of type + + + + + Add a rule with min- and maxLevel. + + Minimum log level needed to trigger this rule. + Maximum log level needed to trigger this rule. + Name of the target to be written when the rule matches. + Logger name pattern. It may include the '*' wildcard at the beginning, at the end or at both ends. + + + + Add a rule with min- and maxLevel. + + Minimum log level needed to trigger this rule. + Maximum log level needed to trigger this rule. + Target to be written to when the rule matches. + Logger name pattern. It may include the '*' wildcard at the beginning, at the end or at both ends. + + + + Add a rule with min- and maxLevel. + + Minimum log level needed to trigger this rule. + Maximum log level needed to trigger this rule. + Target to be written to when the rule matches. + Logger name pattern. It may include the '*' wildcard at the beginning, at the end or at both ends. + Gets or sets a value indicating whether to quit processing any further rule when this one matches. + + + + Add a rule for one loglevel. + + log level needed to trigger this rule. + Name of the target to be written when the rule matches. + Logger name pattern. It may include the '*' wildcard at the beginning, at the end or at both ends. + + + + Add a rule for one loglevel. + + log level needed to trigger this rule. + Target to be written to when the rule matches. + Logger name pattern. It may include the '*' wildcard at the beginning, at the end or at both ends. + + + + Add a rule for one loglevel. + + log level needed to trigger this rule. + Target to be written to when the rule matches. + Logger name pattern. It may include the '*' wildcard at the beginning, at the end or at both ends. + Gets or sets a value indicating whether to quit processing any further rule when this one matches. + + + + Add a rule for all loglevels. + + Name of the target to be written when the rule matches. + Logger name pattern. It may include the '*' wildcard at the beginning, at the end or at both ends. + + + + Add a rule for all loglevels. + + Target to be written to when the rule matches. + Logger name pattern. It may include the '*' wildcard at the beginning, at the end or at both ends. + + + + Add a rule for all loglevels. + + Target to be written to when the rule matches. + Logger name pattern. It may include the '*' wildcard at the beginning, at the end or at both ends. + Gets or sets a value indicating whether to quit processing any further rule when this one matches. + + + + Finds the logging rule with the specified name. + + The name of the logging rule to be found. + Found logging rule or when not found. + + + + Removes the specified named logging rule. + + The name of the logging rule to be removed. + Found one or more logging rule to remove, or when not found. + + + + Called by LogManager when one of the log configuration files changes. + + + A new instance of that represents the updated configuration. + + + + + Removes the specified named target. + + Name of the target. + + + + Installs target-specific objects on current system. + + The installation context. + + Installation typically runs with administrative permissions. + + + + + Uninstalls target-specific objects from current system. + + The installation context. + + Uninstallation typically runs with administrative permissions. + + + + + Closes all targets and releases any unmanaged resources. + + + + + Log to the internal (NLog) logger the information about the and associated with this instance. + + + The information are only recorded in the internal logger if Debug level is enabled, otherwise nothing is + recorded. + + + + + Flushes any pending log messages on all appenders. + + The asynchronous continuation. + + + + Validates the configuration. + + + + + Copies all variables from provided dictionary into current configuration variables. + + Master variables dictionary + + + + Replace a simple variable with a value. The orginal value is removed and thus we cannot redo this in a later stage. + + + + + + + Checks whether unused targets exist. If found any, just write an internal log at Warn level. + If initializing not started or failed, then checking process will be canceled + + + + + Arguments for events. + + + + + Initializes a new instance of the class. + + The new configuration. + The old configuration. + + + + Gets the old configuration. + + The old configuration. + + + + Gets the new configuration. + + The new configuration. + + + + Gets the new configuration + + The new configuration. + + + + Gets the old configuration + + The old configuration. + + + + Enables loading of NLog configuration from a file + + + + + + + + Get default file paths (including filename) for possible NLog config files. + + + + + Get default file paths (including filename) for possible NLog config files. + + + + + Loads NLog configuration from + + + + + Constructor + + + + + + Loads NLog configuration from provided config section + + + + + + + Builds list with unique keys, using last value of duplicates. High priority keys placed first. + + + + + + + Parse loglevel, but don't throw if exception throwing is disabled + + Name of attribute for logging. + Value of parse. + Used if there is an exception + + + + + Parses a single config section within the NLog-config + + + Section was recognized + + + + Parse {Rules} xml element + + + Rules are added to this parameter. + + + + Parse {Logger} xml element + + + + + + Parse boolean + + Name of the property for logging. + value to parse + Default value to return if the parse failed + Boolean attribute value or default. + + + + Remove the namespace (before :) + + + x:a, will be a + + + + + + + Gets the optional boolean attribute value. + + + Name of the attribute. + Default value to return if the attribute is not found or if there is a parse error + Boolean attribute value or default. + + + + Arguments for . + + + + + Initializes a new instance of the class. + + Whether configuration reload has succeeded. + + + + Initializes a new instance of the class. + + Whether configuration reload has succeeded. + The exception during configuration reload. + + + + Gets a value indicating whether configuration reload has succeeded. + + A value of true if succeeded; otherwise, false. + + + + Gets the exception which occurred during configuration reload. + + The exception. + + + + Enables FileWatcher for the currently loaded NLog Configuration File, + and supports automatic reload on file modification. + + + + + Represents a logging rule. An equivalent of <logger /> configuration element. + + + + + Create an empty . + + + + + Create an empty . + + + + + Create a new with a and which writes to . + + Logger name pattern used for . It may include one or more '*' or '?' wildcards at any position. + Minimum log level needed to trigger this rule. + Maximum log level needed to trigger this rule. + Target to be written to when the rule matches. + + + + Create a new with a which writes to . + + Logger name pattern used for . It may include one or more '*' or '?' wildcards at any position. + Minimum log level needed to trigger this rule. + Target to be written to when the rule matches. + + + + Create a (disabled) . You should call or see cref="EnableLoggingForLevels"/> to enable logging. + + Logger name pattern used for . It may include one or more '*' or '?' wildcards at any position. + Target to be written to when the rule matches. + + + + Rule identifier to allow rule lookup + + + + + Gets a collection of targets that should be written to when this rule matches. + + + + + Gets a collection of child rules to be evaluated when this rule matches. + + + + + Gets a collection of filters to be checked before writing to targets. + + + + + Gets or sets a value indicating whether to quit processing any further rule when this one matches. + + + + + Gets or sets logger name pattern. + + + Logger name pattern used by to check if a logger name matches this rule. + It may include one or more '*' or '?' wildcards at any position. + + '*' means zero or more occurrecnces of any character + '?' means exactly one occurrence of any character + + + + + + Gets the collection of log levels enabled by this rule. + + + + + Default action if none of the filters match + + + + + Enables logging for a particular level. + + Level to be enabled. + + + + Enables logging for a particular levels between (included) and . + + Minimum log level needed to trigger this rule. + Maximum log level needed to trigger this rule. + + + + Disables logging for a particular level. + + Level to be disabled. + + + + Disables logging for particular levels between (included) and . + + Minimum log level to be disables. + Maximum log level to de disabled. + + + + Enables logging the levels between (included) and . All the other levels will be disabled. + + >Minimum log level needed to trigger this rule. + Maximum log level needed to trigger this rule. + + + + Returns a string representation of . Used for debugging. + + + A that represents the current . + + + + + Checks whether te particular log level is enabled for this rule. + + Level to be checked. + A value of when the log level is enabled, otherwise. + + + + Checks whether given name matches the . + + String to be matched. + A value of when the name matches, otherwise. + + + + Default filtering with static level config + + + + + Factory for locating methods. + + The type of the class marker attribute. + The type of the method marker attribute. + + + + Gets a collection of all registered items in the factory. + + + Sequence of key/value pairs where each key represents the name + of the item and value is the of + the item. + + + + + Scans the assembly for classes marked with + and methods marked with and adds them + to the factory. + + The types to scan. + The prefix to use for names. + + + + Registers the type. + + The type to register. + The item name prefix. + + + + Clears contents of the factory. + + + + + Registers the definition of a single method. + + The method name. + The method info. + + + + Tries to retrieve method by name. + + The method name. + The result. + A value of true if the method was found, false otherwise. + + + + Retrieves method by name. + + Method name. + MethodInfo object. + + + + Tries to get method definition. + + The method name. + The result. + A value of true if the method was found, false otherwise. + + + + Marks the layout or layout renderer depends on mutable objects from the LogEvent + + This can be or + + + + + Attaches a simple name to an item (such as , + , , etc.). + + + + + Initializes a new instance of the class. + + The name of the item. + + + + Gets the name of the item. + + The name of the item. + + + + Indicates NLog should not scan this property during configuration. + + + + + Initializes a new instance of the class. + + + + + Marks the object as configuration item for NLog. + + + + + Initializes a new instance of the class. + + + + + Represents simple XML element with case-insensitive attribute semantics. + + + + + Initializes a new instance of the class. + + The input URI. + + + + Initializes a new instance of the class. + + The reader to initialize element from. + + + + Prevents a default instance of the class from being created. + + + + + Gets the element name. + + + + + Gets the dictionary of attribute values. + + + + + Gets the collection of child elements. + + + + + Gets the value of the element. + + + + + Last error occured during configuration read + + + + + Returns children elements with the specified element name. + + Name of the element. + Children elements with the specified element name. + + + + Asserts that the name of the element is among specified element names. + + The allowed names. + + + + Returns all parsing errors from current and all child elements. + + + + + Special attribute we could ignore + + + + + Default implementation of + + + + + + + + Attribute used to mark the required parameters for targets, + layout targets and filters. + + + + + Provides simple programmatic configuration API used for trivial logging cases. + + Warning, these methods will overwrite the current config. + + + + + Configures NLog for console logging so that all messages above and including + the level are output to the console. + + + + + Configures NLog for console logging so that all messages above and including + the specified level are output to the console. + + The minimal logging level. + + + + Configures NLog for to log to the specified target so that all messages + above and including the level are output. + + The target to log all messages to. + + + + Configures NLog for to log to the specified target so that all messages + above and including the specified level are output. + + The target to log all messages to. + The minimal logging level. + + + + Configures NLog for file logging so that all messages above and including + the level are written to the specified file. + + Log file name. + + + + Configures NLog for file logging so that all messages above and including + the specified level are written to the specified file. + + Log file name. + The minimal logging level. + + + + Value indicating how stack trace should be captured when processing the log event. + + + + + Stack trace should not be captured. + + + + + Stack trace should be captured without source-level information. + + + + + Stack trace should be captured including source-level information such as line numbers. + + + + + Capture maximum amount of the stack trace information supported on the platform. + + + + + Marks the layout or layout renderer as thread independent - it producing correct results + regardless of the thread it's running on. + + Without this attribute everything is rendered on the main thread. + + + If this attribute is set on a layout, it could be rendered on the another thread. + This could be more efficient as it's skipped when not needed. + + If context like HttpContext.Current is needed, which is only available on the main thread, this attribute should not be applied. + + See the AsyncTargetWrapper and BufferTargetWrapper with the , using + + Apply this attribute when: + - The result can we rendered in another thread. Delaying this could be more efficient. And/Or, + - The result should not be precalculated, for example the target sends some extra context information. + + + + + Marks the layout or layout renderer as thread safe - it producing correct results + regardless of the number of threads it's running on. + + Without this attribute then the target concurrency will be reduced + + + + + A class for configuring NLog through an XML configuration file + (App.config style or App.nlog style). + + Parsing of the XML file is also implemented in this class. + + + - This class is thread-safe..ToList() is used for that purpose. + - Update TemplateXSD.xml for changes outside targets + + + + + Initializes a new instance of the class. + + Configuration file to be read. + + + + Initializes a new instance of the class. + + Configuration file to be read. + The to which to apply any applicable configuration values. + + + + Initializes a new instance of the class. + + Configuration file to be read. + Ignore any errors during configuration. + + + + Initializes a new instance of the class. + + Configuration file to be read. + Ignore any errors during configuration. + The to which to apply any applicable configuration values. + + + + Initializes a new instance of the class. + + XML reader to read from. + + + + Create XML reader for (xml config) file. + + filepath + reader or null if filename is empty. + + + + Initializes a new instance of the class. + + containing the configuration section. + Name of the file that contains the element (to be used as a base for including other files). null is allowed. + + + + Initializes a new instance of the class. + + containing the configuration section. + Name of the file that contains the element (to be used as a base for including other files). null is allowed. + The to which to apply any applicable configuration values. + + + + Initializes a new instance of the class. + + containing the configuration section. + Name of the file that contains the element (to be used as a base for including other files). null is allowed. + Ignore any errors during configuration. + + + + Initializes a new instance of the class. + + containing the configuration section. + Name of the file that contains the element (to be used as a base for including other files). null is allowed. + Ignore any errors during configuration. + The to which to apply any applicable configuration values. + + + + Initializes a new instance of the class. + + The XML contents. + Name of the XML file. + The to which to apply any applicable configuration values. + + + + Parse XML string as NLog configuration + + NLog configuration + + + + + Gets the default object by parsing + the application configuration file (app.exe.config). + + + + + Did the Succeeded? true= success, false= error, null = initialize not started yet. + + + + + Gets or sets a value indicating whether all of the configuration files + should be watched for changes and reloaded automatically when changed. + + + + + Gets the collection of file names which should be watched for changes by NLog. + This is the list of configuration files processed. + If the autoReload attribute is not set it returns empty collection. + + + + + Re-reads the original configuration file and returns the new object. + + The new object. + + + + Get file paths (including filename) for the possible NLog config files. + + The filepaths to the possible config file + + + + Overwrite the paths (including filename) for the possible NLog config files. + + The filepaths to the possible config file + + + + Clear the candidate file paths and return to the defaults. + + + + + Initializes the configuration. + + containing the configuration section. + Name of the file that contains the element (to be used as a base for including other files). null is allowed. + Ignore any errors during configuration. + + + + Checks whether any error during XML configuration parsing has occured. + If there are any and ThrowConfigExceptions or ThrowExceptions + setting is enabled - throws NLogConfigurationException, otherwise + just write an internal log at Warn level. + + Root NLog configuration xml element + + + + Add a file with configuration. Check if not already included. + + + + + + + Parse the root + + + path to config file. + The default value for the autoReload option. + + + + Parse {configuration} xml element. + + + path to config file. + The default value for the autoReload option. + + + + Parse {NLog} xml element. + + + path to config file. + The default value for the autoReload option. + + + + Parses a single config section within the NLog-config + + + Section was recognized + + + + Include (multiple) files by filemask, e.g. *.nlog + + base directory in case if is relative + relative or absolute fileMask + + + + + Matches when the specified condition is met. + + + Conditions are expressed using a simple language + described here. + + + + + Gets or sets the condition expression. + + + + + + Checks whether log event should be logged or not. + + Log event. + + - if the log event should be ignored
+ - if the filter doesn't want to decide
+ - if the log event should be logged
+ .
+
+ + + An abstract filter class. Provides a way to eliminate log messages + based on properties other than logger name and log level. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the action to be taken when filter matches. + + + + + + Gets the result of evaluating filter against given log event. + + The log event. + Filter result. + + + + Checks whether log event should be logged or not. + + Log event. + + - if the log event should be ignored
+ - if the filter doesn't want to decide
+ - if the log event should be logged
+ .
+
+ + + Marks class as a layout renderer and assigns a name to it. + + + + + Initializes a new instance of the class. + + Name of the filter. + + + + Filter result. + + + + + The filter doesn't want to decide whether to log or discard the message. + + + + + The message should be logged. + + + + + The message should not be logged. + + + + + The message should be logged and processing should be finished. + + + + + The message should not be logged and processing should be finished. + + + + + A base class for filters that are based on comparing a value to a layout. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the layout to be used to filter log messages. + + The layout. + + + + + Matches when the calculated layout contains the specified substring. + This filter is deprecated in favor of <when /> which is based on conditions. + + + + + Gets or sets a value indicating whether to ignore case when comparing strings. + + + + + + Gets or sets the substring to be matched. + + + + + + Checks whether log event should be logged or not. + + Log event. + + - if the log event should be ignored
+ - if the filter doesn't want to decide
+ - if the log event should be logged
+ .
+
+ + + Matches when the calculated layout is equal to the specified substring. + This filter is deprecated in favor of <when /> which is based on conditions. + + + + + Gets or sets a value indicating whether to ignore case when comparing strings. + + + + + + Gets or sets a string to compare the layout to. + + + + + + Checks whether log event should be logged or not. + + Log event. + + - if the log event should be ignored
+ - if the filter doesn't want to decide
+ - if the log event should be logged
+ .
+
+ + + Matches the provided filter-method + + + + + Initializes a new instance of the class. + + + + + + + + Matches when the calculated layout does NOT contain the specified substring. + This filter is deprecated in favor of <when /> which is based on conditions. + + + + + Gets or sets the substring to be matched. + + + + + + Gets or sets a value indicating whether to ignore case when comparing strings. + + + + + + Checks whether log event should be logged or not. + + Log event. + + - if the log event should be ignored
+ - if the filter doesn't want to decide
+ - if the log event should be logged
+ .
+
+ + + Matches when the calculated layout is NOT equal to the specified substring. + This filter is deprecated in favor of <when /> which is based on conditions. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a string to compare the layout to. + + + + + + Gets or sets a value indicating whether to ignore case when comparing strings. + + + + + + Checks whether log event should be logged or not. + + Log event. + + - if the log event should be ignored
+ - if the filter doesn't want to decide
+ - if the log event should be logged
+ .
+
+ + + Matches when the result of the calculated layout has been repeated a moment ago + + + + + How long before a filter expires, and logging is accepted again + + + + + + Max length of filter values, will truncate if above limit + + + + + + Applies the configured action to the initial logevent that starts the timeout period. + Used to configure that it should ignore all events until timeout. + + + + + + Max number of unique filter values to expect simultaneously + + + + + + Default number of unique filter values to expect, will automatically increase if needed + + + + + + Insert FilterCount value into when an event is no longer filtered + + + + + + Append FilterCount to the when an event is no longer filtered + + + + + + Reuse internal buffers, and doesn't have to constantly allocate new buffers + + + + + + Default buffer size for the internal buffers + + + + + + Can be used if has been enabled. + + + + + Initializes a new instance of the class. + + + + + Checks whether log event should be logged or not. In case the LogEvent has just been repeated. + + Log event. + + - if the log event should be ignored
+ - if the filter doesn't want to decide
+ - if the log event should be logged
+ .
+
+ + + Uses object pooling, and prunes stale filter items when the pool runs dry + + + + + Remove stale filter-value from the cache, and fill them into the pool for reuse + + + + + Renders the Log Event into a filter value, that is used for checking if just repeated + + + + + Repeated LogEvent detected. Checks if it should activate filter-action + + + + + Filter Value State (mutable) + + + + + Filter Lookup Key (immutable) + + + + + A fluent class to build log events for NLog. + + + + + Initializes a new instance of the class. + + The to send the log event. + + + + Initializes a new instance of the class. + + The to send the log event. + The for the log event. + + + + Gets the created by the builder. + + + + + Sets the information of the logging event. + + The exception information of the logging event. + current for chaining calls. + + + + Sets the level of the logging event. + + The level of the logging event. + current for chaining calls. + + + + Sets the logger name of the logging event. + + The logger name of the logging event. + current for chaining calls. + + + + Sets the log message on the logging event. + + The log message for the logging event. + current for chaining calls. + + + + Sets the log message and parameters for formatting on the logging event. + + A composite format string. + The object to format. + current for chaining calls. + + + + Sets the log message and parameters for formatting on the logging event. + + A composite format string. + The first object to format. + The second object to format. + current for chaining calls. + + + + Sets the log message and parameters for formatting on the logging event. + + A composite format string. + The first object to format. + The second object to format. + The third object to format. + current for chaining calls. + + + + Sets the log message and parameters for formatting on the logging event. + + A composite format string. + The first object to format. + The second object to format. + The third object to format. + The fourth object to format. + current for chaining calls. + + + + Sets the log message and parameters for formatting on the logging event. + + A composite format string. + An object array that contains zero or more objects to format. + current for chaining calls. + + + + Sets the log message and parameters for formatting on the logging event. + + An object that supplies culture-specific formatting information. + A composite format string. + An object array that contains zero or more objects to format. + current for chaining calls. + + + + Sets a per-event context property on the logging event. + + The name of the context property. + The value of the context property. + current for chaining calls. + + + + Sets multiple per-event context properties on the logging event. + + The properties to set. + current for chaining calls. + + + + Sets the timestamp of the logging event. + + The timestamp of the logging event. + current for chaining calls. + + + + Sets the stack trace for the event info. + + The stack trace. + Index of the first user stack frame within the stack trace. + current for chaining calls. + + + + Writes the log event to the underlying logger. + + + + + Writes the log event to the underlying logger. + + If condition is true, write log event; otherwise ignore event. + + + + Writes the log event to the underlying logger. + + If condition is true, write log event; otherwise ignore event. + + + + Extension methods for NLog . + + + + + Starts building a log event with the specified . + + The logger to write the log event to. + The log level. + current for chaining calls. + + + + Starts building a log event at the Trace level. + + The logger to write the log event to. + current for chaining calls. + + + + Starts building a log event at the Debug level. + + The logger to write the log event to. + current for chaining calls. + + + + Starts building a log event at the Info level. + + The logger to write the log event to. + current for chaining calls. + + + + Starts building a log event at the Warn level. + + The logger to write the log event to. + current for chaining calls. + + + + Starts building a log event at the Error level. + + The logger to write the log event to. + current for chaining calls. + + + + Starts building a log event at the Fatal level. + + The logger to write the log event to. + current for chaining calls. + + + + Global Diagnostics Context + + This class was marked as obsolete on NLog 2.0 and it may be removed in a future release. + + + + Sets the Global Diagnostics Context item to the specified value. + + Item name. + Item value. + + + + Gets the Global Diagnostics Context named item. + + Item name. + The value of , if defined; otherwise . + If the value isn't a already, this call locks the for reading the needed for converting to . + + + + Gets the Global Diagnostics Context item. + + Item name. + to use when converting the item's value to a string. + The value of as a string, if defined; otherwise . + If is null and the value isn't a already, this call locks the for reading the needed for converting to . + + + + Gets the Global Diagnostics Context named item. + + Item name. + The value of , if defined; otherwise null. + + + + Checks whether the specified item exists in the Global Diagnostics Context. + + Item name. + A boolean indicating whether the specified item exists in current thread GDC. + + + + Removes the specified item from the Global Diagnostics Context. + + Item name. + + + + Clears the content of the GDC. + + + + + Global Diagnostics Context - a dictionary structure to hold per-application-instance values. + + + + + Sets the Global Diagnostics Context item to the specified value. + + Item name. + Item value. + + + + Sets the Global Diagnostics Context item to the specified value. + + Item name. + Item value. + + + + Gets the Global Diagnostics Context named item. + + Item name. + The value of , if defined; otherwise . + If the value isn't a already, this call locks the for reading the needed for converting to . + + + + Gets the Global Diagnostics Context item. + + Item name. + to use when converting the item's value to a string. + The value of as a string, if defined; otherwise . + If is null and the value isn't a already, this call locks the for reading the needed for converting to . + + + + Gets the Global Diagnostics Context named item. + + Item name. + The item value, if defined; otherwise null. + + + + Returns all item names + + A collection of the names of all items in the Global Diagnostics Context. + + + + Checks whether the specified item exists in the Global Diagnostics Context. + + Item name. + A boolean indicating whether the specified item exists in current thread GDC. + + + + Removes the specified item from the Global Diagnostics Context. + + Item name. + + + + Clears the content of the GDC. + + + + + Include context properties + + + + + Gets or sets a value indicating whether to include contents of the dictionary. + + + + + + Gets or sets a value indicating whether to include contents of the stack. + + + + + + Gets or sets the option to include all properties from the log events + + + + + + Gets or sets a value indicating whether to include contents of the dictionary. + + + + + + Gets or sets a value indicating whether to include contents of the stack. + + + + + + Interface for serialization of object values into JSON format + + + + + Serialization of an object into JSON format. + + The object to serialize to JSON. + Output destination. + Serialize succeeded (true/false) + + + + Auto-generated Logger members for binary compatibility with NLog 1.0. + + + Provides logging interface and utility functions. + + + + + Writes the diagnostic message at the Trace level. + + A to be written. + + + + Writes the diagnostic message at the Trace level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + + + + Writes the diagnostic message at the Trace level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + + + + Writes the diagnostic message at the Trace level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + Third argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format.s + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level. + + A to be written. + + + + Writes the diagnostic message at the Debug level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + + + + Writes the diagnostic message at the Debug level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + + + + Writes the diagnostic message at the Debug level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + Third argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level. + + A to be written. + + + + Writes the diagnostic message at the Info level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + + + + Writes the diagnostic message at the Info level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + + + + Writes the diagnostic message at the Info level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + Third argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level. + + A to be written. + + + + Writes the diagnostic message at the Warn level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + + + + Writes the diagnostic message at the Warn level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + + + + Writes the diagnostic message at the Warn level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + Third argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level. + + A to be written. + + + + Writes the diagnostic message at the Error level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + + + + Writes the diagnostic message at the Error level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + + + + Writes the diagnostic message at the Error level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + Third argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level. + + A to be written. + + + + Writes the diagnostic message at the Fatal level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + + + + Writes the diagnostic message at the Fatal level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + Third argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Gets a value indicating whether logging is enabled for the Trace level. + + A value of if logging is enabled for the Trace level, otherwise it returns . + + + + Gets a value indicating whether logging is enabled for the Debug level. + + A value of if logging is enabled for the Debug level, otherwise it returns . + + + + Gets a value indicating whether logging is enabled for the Info level. + + A value of if logging is enabled for the Info level, otherwise it returns . + + + + Gets a value indicating whether logging is enabled for the Warn level. + + A value of if logging is enabled for the Warn level, otherwise it returns . + + + + Gets a value indicating whether logging is enabled for the Error level. + + A value of if logging is enabled for the Error level, otherwise it returns . + + + + Gets a value indicating whether logging is enabled for the Fatal level. + + A value of if logging is enabled for the Fatal level, otherwise it returns . + + + + Writes the diagnostic message at the Trace level using the specified format provider and format parameters. + + + Writes the diagnostic message at the Trace level. + + Type of the value. + The value to be written. + + + + Writes the diagnostic message at the Trace level. + + Type of the value. + An IFormatProvider that supplies culture-specific formatting information. + The value to be written. + + + + Writes the diagnostic message at the Trace level. + + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Trace level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message and exception at the Trace level. + + A to be written. + An exception to be logged. + + + + Writes the diagnostic message and exception at the Trace level. + + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message and exception at the Trace level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message at the Trace level using the specified parameters and formatting them with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the Trace level. + + Log message. + + + + Writes the diagnostic message at the Trace level using the specified parameters. + + A containing format items. + Arguments to format. + + + + Writes the diagnostic message and exception at the Trace level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message at the Trace level using the specified parameter and formatting it with the supplied format provider. + + The type of the argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified parameter. + + The type of the argument. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Trace level using the specified parameters. + + The type of the first argument. + The type of the second argument. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Trace level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Trace level using the specified parameters. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Debug level using the specified format provider and format parameters. + + + Writes the diagnostic message at the Debug level. + + Type of the value. + The value to be written. + + + + Writes the diagnostic message at the Debug level. + + Type of the value. + An IFormatProvider that supplies culture-specific formatting information. + The value to be written. + + + + Writes the diagnostic message at the Debug level. + + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Debug level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message and exception at the Debug level. + + A to be written. + An exception to be logged. + + + + Writes the diagnostic message and exception at the Debug level. + + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message and exception at the Debug level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message at the Debug level using the specified parameters and formatting them with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the Debug level. + + Log message. + + + + Writes the diagnostic message at the Debug level using the specified parameters. + + A containing format items. + Arguments to format. + + + + Writes the diagnostic message and exception at the Debug level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message at the Debug level using the specified parameter and formatting it with the supplied format provider. + + The type of the argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified parameter. + + The type of the argument. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Debug level using the specified parameters. + + The type of the first argument. + The type of the second argument. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Debug level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Debug level using the specified parameters. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Info level using the specified format provider and format parameters. + + + Writes the diagnostic message at the Info level. + + Type of the value. + The value to be written. + + + + Writes the diagnostic message at the Info level. + + Type of the value. + An IFormatProvider that supplies culture-specific formatting information. + The value to be written. + + + + Writes the diagnostic message at the Info level. + + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Info level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message and exception at the Info level. + + A to be written. + An exception to be logged. + + + + Writes the diagnostic message and exception at the Info level. + + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message and exception at the Info level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message at the Info level using the specified parameters and formatting them with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the Info level. + + Log message. + + + + Writes the diagnostic message at the Info level using the specified parameters. + + A containing format items. + Arguments to format. + + + + Writes the diagnostic message and exception at the Info level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message at the Info level using the specified parameter and formatting it with the supplied format provider. + + The type of the argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified parameter. + + The type of the argument. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Info level using the specified parameters. + + The type of the first argument. + The type of the second argument. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Info level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Info level using the specified parameters. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Warn level using the specified format provider and format parameters. + + + Writes the diagnostic message at the Warn level. + + Type of the value. + The value to be written. + + + + Writes the diagnostic message at the Warn level. + + Type of the value. + An IFormatProvider that supplies culture-specific formatting information. + The value to be written. + + + + Writes the diagnostic message at the Warn level. + + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Warn level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message and exception at the Warn level. + + A to be written. + An exception to be logged. + + + + Writes the diagnostic message and exception at the Warn level. + + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message and exception at the Warn level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message at the Warn level using the specified parameters and formatting them with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the Warn level. + + Log message. + + + + Writes the diagnostic message at the Warn level using the specified parameters. + + A containing format items. + Arguments to format. + + + + Writes the diagnostic message and exception at the Warn level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message at the Warn level using the specified parameter and formatting it with the supplied format provider. + + The type of the argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified parameter. + + The type of the argument. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Warn level using the specified parameters. + + The type of the first argument. + The type of the second argument. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Warn level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Warn level using the specified parameters. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Error level using the specified format provider and format parameters. + + + Writes the diagnostic message at the Error level. + + Type of the value. + The value to be written. + + + + Writes the diagnostic message at the Error level. + + Type of the value. + An IFormatProvider that supplies culture-specific formatting information. + The value to be written. + + + + Writes the diagnostic message at the Error level. + + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Error level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message and exception at the Error level. + + A to be written. + An exception to be logged. + + + + Writes the diagnostic message and exception at the Error level. + + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message and exception at the Error level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message at the Error level using the specified parameters and formatting them with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the Error level. + + Log message. + + + + Writes the diagnostic message at the Error level using the specified parameters. + + A containing format items. + Arguments to format. + + + + Writes the diagnostic message and exception at the Error level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message at the Error level using the specified parameter and formatting it with the supplied format provider. + + The type of the argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified parameter. + + The type of the argument. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Error level using the specified parameters. + + The type of the first argument. + The type of the second argument. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Error level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Error level using the specified parameters. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified format provider and format parameters. + + + Writes the diagnostic message at the Fatal level. + + Type of the value. + The value to be written. + + + + Writes the diagnostic message at the Fatal level. + + Type of the value. + An IFormatProvider that supplies culture-specific formatting information. + The value to be written. + + + + Writes the diagnostic message at the Fatal level. + + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Fatal level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message and exception at the Fatal level. + + A to be written. + An exception to be logged. + + + + Writes the diagnostic message and exception at the Fatal level. + + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message and exception at the Fatal level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message at the Fatal level using the specified parameters and formatting them with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the Fatal level. + + Log message. + + + + Writes the diagnostic message at the Fatal level using the specified parameters. + + A containing format items. + Arguments to format. + + + + Writes the diagnostic message and exception at the Fatal level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message at the Fatal level using the specified parameter and formatting it with the supplied format provider. + + The type of the argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified parameter. + + The type of the argument. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified parameters. + + The type of the first argument. + The type of the second argument. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified parameters. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Auto-generated Logger members for binary compatibility with NLog 1.0. + + + Logger with only generic methods (passing 'LogLevel' to methods) and core properties. + + + + + Writes the diagnostic message at the specified level. + + The log level. + A to be written. + + + + Writes the diagnostic message at the specified level. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + + + + Writes the diagnostic message at the specified level using the specified parameters. + + The log level. + A containing format items. + First argument to format. + Second argument to format. + + + + Writes the diagnostic message at the specified level using the specified parameters. + + The log level. + A containing format items. + First argument to format. + Second argument to format. + Third argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Occurs when logger configuration changes. + + + + + Gets the name of the logger. + + + + + Gets the factory that created this logger. + + + + + Gets a value indicating whether logging is enabled for the specified level. + + Log level to be checked. + A value of if logging is enabled for the specified level, otherwise it returns . + + + + Writes the specified diagnostic message. + + Log event. + + + + Writes the specified diagnostic message. + + The name of the type that wraps Logger. + Log event. + + + + Writes the diagnostic message at the specified level using the specified format provider and format parameters. + + + Writes the diagnostic message at the specified level. + + Type of the value. + The log level. + The value to be written. + + + + Writes the diagnostic message at the specified level. + + Type of the value. + The log level. + An IFormatProvider that supplies culture-specific formatting information. + The value to be written. + + + + Writes the diagnostic message at the specified level. + + The log level. + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the specified level. + + The log level. + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message and exception at the specified level. + + The log level. + A to be written. + Arguments to format. + An exception to be logged. + + + + Writes the diagnostic message and exception at the specified level. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + Arguments to format. + An exception to be logged. + + + + Writes the diagnostic message at the specified level using the specified parameters and formatting them with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the specified level. + + The log level. + Log message. + + + + Writes the diagnostic message at the specified level using the specified parameters. + + The log level. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message and exception at the specified level. + + The log level. + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message at the specified level using the specified parameter and formatting it with the supplied format provider. + + The type of the argument. + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified parameter. + + The type of the argument. + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the specified level using the specified parameters. + + The type of the first argument. + The type of the second argument. + The log level. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the specified level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the specified level using the specified parameters. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + The log level. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Extensions for NLog . + + + + + Writes the diagnostic message and exception at the specified level. + + A logger implementation that will handle the message. + The log level. + An exception to be logged. + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Trace level. + + A logger implementation that will handle the message. + An exception to be logged. + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Debug level. + + A logger implementation that will handle the message. + An exception to be logged. + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Info level. + + A logger implementation that will handle the message. + An exception to be logged. + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Warn level. + + A logger implementation that will handle the message. + An exception to be logged. + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Error level. + + A logger implementation that will handle the message. + An exception to be logged. + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Fatal level. + + A logger implementation that will handle the message. + An exception to be logged. + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Allocates new builder and appends to the provided target builder on dispose + + + + + Access the new builder allocated + + + + + Helpers for . + + + + + Load from url + + file or path, including .dll + basepath, optional + + + + + Load from url + + name without .dll + + + + + Forward declare of system delegate type for use by other classes + + + + + Keeps track of pending operation count, and can notify when pending operation count reaches zero + + + + + Mark operation has started + + + + + Mark operation has completed + + Exception coming from the completed operation [optional] + + + + Registers an AsyncContinuation to be called when all pending operations have completed + + Invoked on completion + AsyncContinuation operation + + + + Clear o + + + + + Sets the stack trace for the event info. + + The stack trace. + Index of the first user stack frame within the stack trace. + Index of the first user stack frame within the stack trace. + + + + Sets the details retrieved from the Caller Information Attributes + + + + + + + + + Gets the stack frame of the method that did the logging. + + + + + Gets the number index of the stack frame that represents the user + code (not the NLog code). + + + + + Legacy attempt to skip async MoveNext, but caused source file line number to be lost + + + + + Gets the entire stack trace. + + + + + Memory optimized filtering + + Passing state too avoid delegate capture and memory-allocations. + + + + Internal configuration manager used to read .NET configuration files. + Just a wrapper around the BCL ConfigurationManager, but used to enable + unit testing. + + + + + Gets the wrapper around ConfigurationManager.AppSettings. + + + + + Provides untyped IDictionary interface on top of generic IDictionary. + + The type of the key. + The type of the value. + + + + Initializes a new instance of the DictionaryAdapter class. + + The implementation. + + + + Gets an object containing the values in the object. + + + + An object containing the values in the object. + + + + + Gets the number of elements contained in the . + + + + The number of elements contained in the . + + + + + Gets a value indicating whether access to the is synchronized (thread safe). + + + true if access to the is synchronized (thread safe); otherwise, false. + + + + + Gets an object that can be used to synchronize access to the . + + + + An object that can be used to synchronize access to the . + + + + + Gets a value indicating whether the object has a fixed size. + + + true if the object has a fixed size; otherwise, false. + + + + + Gets a value indicating whether the object is read-only. + + + true if the object is read-only; otherwise, false. + + + + + Gets an object containing the keys of the object. + + + + An object containing the keys of the object. + + + + + Gets or sets the with the specified key. + + Dictionary key. + Value corresponding to key or null if not found + + + + Adds an element with the provided key and value to the object. + + The to use as the key of the element to add. + The to use as the value of the element to add. + + + + Removes all elements from the object. + + + + + Determines whether the object contains an element with the specified key. + + The key to locate in the object. + + True if the contains an element with the key; otherwise, false. + + + + + Returns an object for the object. + + + An object for the object. + + + + + Removes the element with the specified key from the object. + + The key of the element to remove. + + + + Copies the elements of the to an , starting at a particular index. + + The one-dimensional that is the destination of the elements copied from . The must have zero-based indexing. + The zero-based index in at which copying begins. + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + + + + Wrapper IDictionaryEnumerator. + + + + + Initializes a new instance of the class. + + The wrapped. + + + + Gets both the key and the value of the current dictionary entry. + + + + A containing both the key and the value of the current dictionary entry. + + + + + Gets the key of the current dictionary entry. + + + + The key of the current element of the enumeration. + + + + + Gets the value of the current dictionary entry. + + + + The value of the current element of the enumeration. + + + + + Gets the current element in the collection. + + + + The current element in the collection. + + + + + Advances the enumerator to the next element of the collection. + + + True if the enumerator was successfully advanced to the next element; false if the enumerator has passed the end of the collection. + + + + + Sets the enumerator to its initial position, which is before the first element in the collection. + + + + + Ensures that IDictionary.GetEnumerator returns DictionaryEntry values + + + + + UTF-8 BOM 239, 187, 191 + + + + + Safe way to get environment variables. + + + + + Helper class for dealing with exceptions. + + + + + Mark this exception as logged to the . + + + + + + + Is this exception logged to the ? + + + trueif the has been logged to the . + + + + Determines whether the exception must be rethrown and logs the error to the if is false. + + Advised to log first the error to the before calling this method. + + The exception to check. + trueif the must be rethrown, false otherwise. + + + + Determines whether the exception must be rethrown immediately, without logging the error to the . + + Only used this method in special cases. + + The exception to check. + trueif the must be rethrown, false otherwise. + + + + Object construction helper. + + + + + Adapter for to + + + + + Initializes a new instance of the class. + + The to wrap. + + + + Creates an AppDomainWrapper for the current + + + + + Gets or sets the base directory that the assembly resolver uses to probe for assemblies. + + + + + Gets or sets the name of the configuration file for an application domain. + + + + + Gets or sets the list of directories under the application base directory that are probed for private assemblies. + + + + + Gets or set the friendly name. + + + + + Gets an integer that uniquely identifies the application domain within the process. + + + + + Gets the assemblies that have been loaded into the execution context of this application domain. + + A list of assemblies in this application domain. + + + + Process exit event. + + + + + Domain unloaded event. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Interface for fakeable the current . Not fully implemented, please methods/properties as necessary. + + + + + Gets or sets the base directory that the assembly resolver uses to probe for assemblies. + + + + + Gets or sets the name of the configuration file for an application domain. + + + + + Gets or sets the list of directories under the application base directory that are probed for private assemblies. + + + + + Gets or set the friendly name. + + + + + Gets an integer that uniquely identifies the application domain within the process. + + + + + Gets the assemblies that have been loaded into the execution context of this application domain. + + A list of assemblies in this application domain. + + + + Process exit event. + + + + + Domain unloaded event. + + + + + Abstract calls for the application environment + + + + + Abstract calls to FileSystem + + + + Determines whether the specified file exists. + The file to check. + + + Returns the content of the specified file + The file to load. + + + + Base class for optimized file appenders. + + + + + Initializes a new instance of the class. + + Name of the file. + The create parameters. + + + + Gets the path of the file, including file extension. + + The name of the file. + + + + Gets or sets the creation time for a file associated with the appender. The time returned is in Coordinated + Universal Time [UTC] standard. + + The creation time of the file. + + + + Gets or sets the creation time for a file associated with the appender. Synchronized by + The time format is based on + + + + + Gets the last time the file associated with the appender is opened. The time returned is in Coordinated + Universal Time [UTC] standard. + + The time the file was last opened. + + + + Gets the file creation parameters. + + The file creation parameters. + + + + Writes the specified bytes. + + The bytes. + + + + Flushes this instance. + + + + + Closes this instance. + + + + + Gets the creation time for a file associated with the appender. The time returned is in Coordinated Universal + Time [UTC] standard. + + The file creation time. + + + + Gets the length in bytes of the file associated with the appender. + + A long value representing the length of the file in bytes. + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Releases unmanaged and - optionally - managed resources. + + True to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Creates the file stream. + + If set to true sets the file stream to allow shared writing. + If larger than 0 then it will be used instead of the default BufferSize for the FileStream. + A object which can be used to write to the file. + + + + Base class for optimized file appenders which require the usage of a mutex. + + It is possible to use this class as replacement of BaseFileAppender and the mutex functionality + is not enforced to the implementing subclasses. + + + + + Initializes a new instance of the class. + + Name of the file. + The create parameters. + + + + Gets the mutually-exclusive lock for archiving files. + + The mutex for archiving. + + + + Releases unmanaged and - optionally - managed resources. + + True to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Creates a mutex that is sharable by more than one process. + + The prefix to use for the name of the mutex. + A object which is sharable by multiple processes. + + + + Implementation of which caches + file information. + + + + + Initializes a new instance of the class. + + Name of the file. + The parameters. + + + + Closes this instance of the appender. + + + + + Flushes this current appender. + + + + + Gets the creation time for a file associated with the appender. The time returned is in Coordinated Universal + Time [UTC] standard. + + The file creation time. + + + + Gets the length in bytes of the file associated with the appender. + + A long value representing the length of the file in bytes. + + + + Writes the specified bytes to a file. + + The bytes array. + The bytes array offset. + The number of bytes. + + + + Factory class which creates objects. + + + + + Opens the appender for given file name and parameters. + + Name of the file. + Creation parameters. + + Instance of which can be used to write to the file. + + + + + Maintains a collection of file appenders usually associated with file targets. + + + + + An "empty" instance of the class with zero size and empty list of appenders. + + + + + Initializes a new "empty" instance of the class with zero size and empty + list of appenders. + + + + + Initializes a new instance of the class. + + + The size of the list should be positive. No validations are performed during initialisation as it is an + intenal class. + + Total number of appenders allowed in list. + Factory used to create each appender. + Parameters used for creating a file. + + + + The archive file path pattern that is used to detect when archiving occurs. + + + + + Invalidates appenders for all files that were archived. + + + + + Gets the parameters which will be used for creating a file. + + + + + Gets the file appender factory used by all the appenders in this list. + + + + + Gets the number of appenders which the list can hold. + + + + + Subscribe to background monitoring of active file appenders + + + + + It allocates the first slot in the list when the file name does not already in the list and clean up any + unused slots. + + File name associated with a single appender. + The allocated appender. + + Thrown when is called on an Empty instance. + + + + + Close all the allocated appenders. + + + + + Close the allocated appenders initialized before the supplied time. + + The time which prior the appenders considered expired + + + + Fluch all the allocated appenders. + + + + + File Archive Logic uses the File-Creation-TimeStamp to detect if time to archive, and the File-LastWrite-Timestamp to name the archive-file. + + + NLog always closes all relevant appenders during archive operation, so no need to lookup file-appender + + + + + Closes the specified appender and removes it from the list. + + File name of the appender to be closed. + File Appender that matched the filePath (null if none found) + + + + Interface that provides parameters for create file function. + + + + + Gets or sets the delay in milliseconds to wait before attempting to write to the file again. + + + + + Gets or sets the number of times the write is appended on the file before NLog + discards the log message. + + + + + Gets or sets a value indicating whether concurrent writes to the log file by multiple processes on the same host. + + + This makes multi-process logging possible. NLog uses a special technique + that lets it keep the files open for writing. + + + + + Gets or sets a value indicating whether to create directories if they do not exist. + + + Setting this to false may improve performance a bit, but you'll receive an error + when attempting to write to a directory that's not present. + + + + + Gets or sets a value indicating whether to enable log file(s) to be deleted. + + + + + Gets or sets the log file buffer size in bytes. + + + + + Gets or set a value indicating whether a managed file stream is forced, instead of using the native implementation. + + + + + Gets or sets the file attributes (Windows only). + + + + + Should archive mutex be created? + + + + + Should manual simple detection of file deletion be enabled? + + + + + Interface implemented by all factories capable of creating file appenders. + + + + + Opens the appender for given file name and parameters. + + Name of the file. + Creation parameters. + Instance of which can be used to write to the file. + + + + Provides a multiprocess-safe atomic file appends while + keeping the files open. + + + On Unix you can get all the appends to be atomic, even when multiple + processes are trying to write to the same file, because setting the file + pointer to the end of the file and appending can be made one operation. + On Win32 we need to maintain some synchronization between processes + (global named mutex is used for this) + + + + + Initializes a new instance of the class. + + Name of the file. + The parameters. + + + + Writes the specified bytes. + + The bytes array. + The bytes array offset. + The number of bytes. + + + + Closes this instance. + + + + + Flushes this instance. + + + + + Gets the creation time for a file associated with the appender. The time returned is in Coordinated Universal + Time [UTC] standard. + + The file creation time. + + + + Gets the length in bytes of the file associated with the appender. + + A long value representing the length of the file in bytes. + + + + Factory class. + + + + + Opens the appender for given file name and parameters. + + Name of the file. + Creation parameters. + + Instance of which can be used to write to the file. + + + + + Appender used to discard data for the FileTarget. + Used mostly for testing entire stack except the actual writing to disk. + Throws away all data. + + + + + Factory class. + + + + + Opens the appender for given file name and parameters. + + Name of the file. + Creation parameters. + + Instance of which can be used to write to the file. + + + + + Multi-process and multi-host file appender which attempts + to get exclusive write access and retries if it's not available. + + + + + Initializes a new instance of the class. + + Name of the file. + The parameters. + + + + Writes the specified bytes. + + The bytes array. + The bytes array offset. + The number of bytes. + + + + Flushes this instance. + + + + + Closes this instance. + + + + + Gets the creation time for a file associated with the appender. The time returned is in Coordinated Universal + Time [UTC] standard. + + The file creation time. + + + + Gets the length in bytes of the file associated with the appender. + + A long value representing the length of the file in bytes. + + + + Factory class. + + + + + Opens the appender for given file name and parameters. + + Name of the file. + Creation parameters. + + Instance of which can be used to write to the file. + + + + + Optimized single-process file appender which keeps the file open for exclusive write. + + + + + Initializes a new instance of the class. + + Name of the file. + The parameters. + + + + Writes the specified bytes. + + The bytes array. + The bytes array offset. + The number of bytes. + + + + Flushes this instance. + + + + + Closes this instance. + + + + + Gets the creation time for a file associated with the appender. The time returned is in Coordinated Universal + Time [UTC] standard. + + The file creation time. + + + + Gets the length in bytes of the file associated with the appender. + + A long value representing the length of the file in bytes. + + + + Factory class. + + + + + Opens the appender for given file name and parameters. + + Name of the file. + Creation parameters. + + Instance of which can be used to write to the file. + + + + + Provides a multiprocess-safe atomic file append while + keeping the files open. + + + + + Initializes a new instance of the class. + + Name of the file. + The parameters. + + + + Creates or opens a file in a special mode, so that writes are automatically + as atomic writes at the file end. + See also "UnixMultiProcessFileAppender" which does a similar job on *nix platforms. + + File to create or open + + + + Writes the specified bytes. + + The bytes array. + The bytes array offset. + The number of bytes. + + + + Closes this instance. + + + + + Flushes this instance. + + + + + Gets the length in bytes of the file associated with the appender. + + A long value representing the length of the file in bytes. + + + + Factory class. + + + + + Opens the appender for given file name and parameters. + + Name of the file. + Creation parameters. + + Instance of which can be used to write to the file. + + + + + An immutable object that stores basic file info. + + + + + Constructs a FileCharacteristics object. + + The time the file was created in UTC. + The time the file was last written to in UTC. + The size of the file in bytes. + + + + The time the file was created in UTC. + + + + + The time the file was last written to in UTC. + + + + + The size of the file in bytes. + + + + + Optimized routines to get the basic file characteristics of the specified file. + + + + + Initializes static members of the FileCharacteristicsHelper class. + + + + + Gets the information about a file. + + Name of the file. + The file stream. + The file characteristics, if the file information was retrieved successfully, otherwise null. + + + + A layout that represents a filePath. + + + + + Cached directory separator char array to avoid memory allocation on each method call. + + + + + Cached invalid filenames char array to avoid memory allocation everytime Path.GetInvalidFileNameChars() is called. + + + + + not null when == false + + + + + non null is fixed, + + + + + is the cache-key, and when newly rendered filename matches the cache-key, + then it reuses the cleaned cache-value . + + + + + is the cache-value that is reused, when the newly rendered filename + matches the cache-key + + + + Initializes a new instance of the class. + + + + Render the raw filename from Layout + + The log event. + StringBuilder to minimize allocations [optional]. + String representation of a layout. + + + + Convert the raw filename to a correct filename + + The filename generated by Layout. + String representation of a correct filename. + + + + Is this (templated/invalid) path an absolute, relative or unknown? + + + + + Is this (templated/invalid) path an absolute, relative or unknown? + + + + + Convert object to string + + value + format for conversion. + + + If is null and isn't a already, then the will get a locked by + + + + + Interface for the wrapper around System.Configuration.ConfigurationManager. + + + + + Gets the wrapper around ConfigurationManager.AppSettings. + + + + + Format a log message + + + + + Format the message and return + + LogEvent with message to be formatted + formatted message + + + + Has the logevent properties? + + LogEvent with message to be formatted + False when logevent has no properties to be extracted + + + + Appends the logevent message to the provided StringBuilder + + LogEvent with message to be formatted + The to append the formatted message. + + + + Get the Raw, unformatted and unstrinyfied, value + + + + + Get the raw value + + + The value + RawValue supported? + + + + Interface implemented by layouts and layout renderers. + + + + + Renders the the value of layout or layout renderer in the context of the specified log event. + + The log event. + String representation of a layout. + + + + Supports mocking of SMTP Client code. + + + + + Specifies how outgoing email messages will be handled. + + + + + Gets or sets the name or IP address of the host used for SMTP transactions. + + + + + Gets or sets the port used for SMTP transactions. + + + + + Gets or sets a value that specifies the amount of time after which a synchronous Send call times out. + + + + + Gets or sets the credentials used to authenticate the sender. + + + + + Sends an e-mail message to an SMTP server for delivery. These methods block while the message is being transmitted. + + + System.Net.Mail.MailMessage + MailMessage + A MailMessage that contains the message to send. + + + + Gets or sets the folder where applications save mail messages to be processed by the local SMTP server. + + + + + Supports rendering as string value with limited or no allocations (preferred) + + + + + Renders the value of layout renderer in the context of the specified log event + + + null if not possible or unknown + + + + Supports object initialization and termination. + + + + + Initializes this instance. + + The configuration. + + + + Closes this instance. + + + + + Allows components to request stack trace information to be provided in the . + + + + + Gets the level of stack trace information required by the implementing class. + + + + + Render the event info as parse as short + + current layout + + default value when the render + layout name for log message to internal log when logging fails + + + + + Render the event info as parse as int + + current layout + + default value when the render + layout name for log message to internal log when logging fails + + + + + Render the event info as parse as bool + + current layout + + default value when the render + layout name for log message to internal log when logging fails + + + + + Logger configuration. + + + + + Initializes a new instance of the class. + + The targets by level. + Use the old exception log handling of NLog 3.0? + + + + Use the old exception log handling of NLog 3.0? + + This method was marked as obsolete before NLog 4.3.11 and it will be removed in NLog 5. + + + + Gets targets for the specified level. + + The level. + Chain of targets with attached filters. + + + + When true: Do not fallback to StringBuilder.Format for positional templates + + + + + New formatter + + When true: Do not fallback to StringBuilder.Format for positional templates + + + + + The MessageFormatter delegate + + + + + + + + Most-Recently-Used-Cache, that discards less frequently used items on overflow + + + + + Constructor + + Maximum number of items the cache will hold before discarding. + + + + Attempt to insert item into cache. + + Key of the item to be inserted in the cache. + Value of the item to be inserted in the cache. + true when the key does not already exist in the cache, false otherwise. + + + + Lookup existing item in cache. + + Key of the item to be searched in the cache. + Output value of the item found in the cache. + True when the key is found in the cache, false otherwise. + + + + Watches multiple files at the same time and raises an event whenever + a single change is detected in any of those files. + + + + + The types of changes to watch for. + + + + + Occurs when a change is detected in one of the monitored files. + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Stops watching all files. + + + + + Stops watching the specified file. + + + + + + Watches the specified files for changes. + + The file names. + + + + Supports mocking of SMTP Client code. + + + Disabled Error CS0618 'SmtpClient' is obsolete: 'SmtpClient and its network of types are poorly designed, + we strongly recommend you use https://github.com/jstedfast/MailKit and https://github.com/jstedfast/MimeKit instead' + + + + + Network sender which uses HTTP or HTTPS POST. + + + + + Initializes a new instance of the class. + + The network URL. + + + + Creates instances of objects for given URLs. + + + + + Creates a new instance of the network sender based on a network URL. + + URL that determines the network sender to be created. + The maximum queue size. + SSL protcols for TCP + KeepAliveTime for TCP + + A newly created network sender. + + + + + Interface for mocking socket calls. + + + + + A base class for all network senders. Supports one-way sending of messages + over various protocols. + + + + + Initializes a new instance of the class. + + The network URL. + + + + Gets the address of the network endpoint. + + + + + Gets the last send time. + + + + + Initializes this network sender. + + + + + Closes the sender and releases any unmanaged resources. + + The continuation. + + + + Flushes any pending messages and invokes a continuation. + + The continuation. + + + + Send the given text over the specified protocol. + + Bytes to be sent. + Offset in buffer. + Number of bytes to send. + The asynchronous continuation. + + + + Closes the sender and releases any unmanaged resources. + + + + + Performs sender-specific initialization. + + + + + Performs sender-specific close operation. + + The continuation. + + + + Performs sender-specific flush. + + The continuation. + + + + Actually sends the given text over the specified protocol. + + The bytes to be sent. + Offset in buffer. + Number of bytes to send. + The async continuation to be invoked after the buffer has been sent. + To be overridden in inheriting classes. + + + + Parses the URI into an endpoint address. + + The URI to parse. + The address family. + Parsed endpoint. + + + + Default implementation of . + + + + + + + + A base class for network senders that can block or send out-of-order + + + + + Initializes a new instance of the class. + + URL. Must start with tcp://. + + + + Actually sends the given text over the specified protocol. + + The bytes to be sent. + Offset in buffer. + Number of bytes to send. + The async continuation to be invoked after the buffer has been sent. + To be overridden in inheriting classes. + + + + Performs sender-specific flush. + + The continuation. + + + + Socket proxy for mocking Socket code. + + + + + Initializes a new instance of the class. + + The address family. + Type of the socket. + Type of the protocol. + + + + Gets underlying socket instance. + + + + + Closes the wrapped socket. + + + + + Invokes ConnectAsync method on the wrapped socket. + + The instance containing the event data. + Result of original method. + + + + Invokes SendAsync method on the wrapped socket. + + The instance containing the event data. + Result of original method. + + + + Invokes SendToAsync method on the wrapped socket. + + The instance containing the event data. + Result of original method. + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Sends messages over a TCP network connection. + + + + + Initializes a new instance of the class. + + URL. Must start with tcp://. + The address family. + + + + Creates the socket with given parameters. + + The host address. + The address family. + Type of the socket. + Type of the protocol. + Instance of which represents the socket. + + + + Performs sender-specific initialization. + + + + + Closes the socket. + + The continuation. + + + + Facilitates mocking of class. + + + + + Raises the Completed event. + + + + + Sends messages over the network as UDP datagrams. + + + + + Initializes a new instance of the class. + + URL. Must start with udp://. + The address family. + + + + Creates the socket. + + The address family. + Type of the socket. + Type of the protocol. + Implementation of to use. + + + + Performs sender-specific initialization. + + + + + Closes the socket. + + The continuation. + + + + Sends the specified text as a UDP datagram. + + The bytes to be sent. + Offset in buffer. + Number of bytes to send. + The async continuation to be invoked after the buffer has been sent. + To be overridden in inheriting classes. + + + + Scans (breadth-first) the object graph following all the edges whose are + instances have attached and returns + all objects implementing a specified interfaces. + + + + + Finds the objects which have attached which are reachable + from any of the given root objects when traversing the object graph over public properties. + + Type of the objects to return. + Also search the properties of the wanted objects. + The root objects. + Ordered list of objects implementing T. + + + ISet is not there in .net35, so using HashSet + + + + Helper for extracting propertyPath + + + + + Object Path to check + + + + + Try get value from , using , and set into + + + + + + + + Converts object into a List of property-names and -values using reflection + + + + + Scans properties for name (Skips string-compare and value-lookup until finding match) + + + + + Scans properties for name (Skips property value lookup until finding match) + + + + + Scans properties for name + + + + + Binder for retrieving value of + + + + + + + + Combine paths + + basepath, not null + optional dir + optional file + + + + + Cached directory separator char array to avoid memory allocation on each method call. + + + + + Trims directory separators from the path + + path, could be null + never null + + + + Detects the platform the NLog is running on. + + + + + Gets the current runtime OS. + + + + + Gets a value indicating whether current OS is Win32-based (desktop or mobile). + + + + + Gets a value indicating whether current OS is Unix-based. + + + + + Gets a value indicating whether current runtime is Mono-based + + + + + Gets a value indicating whether current runtime supports use of mutex + + + + + Will creating a mutex succeed runtime? + "Cached" detection + + + + + Will creating a mutex succeed runtime? + + + + + Portable implementation of . + + + + + Gets the information about a file. + + Name of the file. + The file stream. + The file characteristics, if the file information was retrieved successfully, otherwise null. + + + + Portable implementation of . + + + + + Initializes a new instance of the class. + + + + + Gets current process ID. + + + + + + Gets current process name. + + + + + + Returns details about current process and thread in a portable manner. + + + + + Gets the singleton instance of PortableThreadIDHelper or + Win32ThreadIDHelper depending on runtime environment. + + The instance. + + + + Gets current process ID. + + + + + Gets current process absolute file path. + + + + + Gets current process name (excluding filename extension, if any). + + + + + Initializes the ThreadIDHelper class. + + + + + Dictionary that combines the standard with the + MessageTemplate-properties extracted from the . + + The are returned as the first items + in the collection, and in positional order. + + + + + Value of the property + + + + + Is this a property of the message? + + + + + + + Value of the property + Is this a property of the message? + + + + The properties of the logEvent + + + + + The properties extracted from the message + + + + + Injects the list of message-template-parameter into the IDictionary-interface + + Message-template-parameters + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Check if the message-template-parameters can be used directly without allocating a dictionary + + Message-template-parameters + Are all parameter names unique (true / false) + + + + Attempt to insert the message-template-parameters into an empty dictionary + + Message-template-parameters + The initially empty dictionary + Message-template-parameters was inserted into dictionary without trouble (true/false) + + + + Attempt to override the existing dictionary values using the message-template-parameters + + Message-template-parameters + The already filled dictionary + List of unique message-template-parameters + + + + + + + + + + + + + + + + + + + + + Will always throw, as collection is readonly + + + Will always throw, as collection is readonly + + + Will always throw, as collection is readonly + + + + + + + + + + + + + + + + + + + Reflection helpers for accessing properties. + + + + + Set value parsed from string. + + object instance to set with property + name of the property on + The value to be parsed. + + + + + Is the property of array-type? + + Type which has the property + name of the property. + + + + + Get propertyinfo + + object which could have property + propertyname on + result when success. + success. + + + + Try parse of string to (Generic) list, comma separated. + + + If there is a comma in the value, then (single) quote the value. For single quotes, use the backslash as escape + + + + + + + + + Reflection helpers. + + + + + Gets all usable exported types from the given assembly. + + Assembly to scan. + Usable types from the given assembly. + Types which cannot be loaded are skipped. + + + + Is this a static class? + + + + This is a work around, as Type doesn't have this property. + From: https://stackoverflow.com/questions/1175888/determine-if-a-type-is-static + + + + + Optimized delegate for calling MethodInfo + + Object instance, use null for static methods. + Complete list of parameters that matches the method, including optional/default parameters. + + + + + Creates an optimized delegate for calling the MethodInfo using Expression-Trees + + Method to optimize + Optimized delegate for invoking the MethodInfo + + + + Controls a single allocated AsyncLogEventInfo-List for reuse (only one active user) + + + + + Controls a single allocated char[]-buffer for reuse (only one active user) + + + + + Controls a single allocated StringBuilder for reuse (only one active user) + + + + + Controls a single allocated object for reuse (only one active user) + + + + Empty handle when is disabled + + + + Creates handle to the reusable char[]-buffer for active usage + + Handle to the reusable item, that can release it again + + + + Access the acquired reusable object + + + + + Controls a single allocated MemoryStream for reuse (only one active user) + + + + + Supported operating systems. + + + If you add anything here, make sure to add the appropriate detection + code to + + + + + Unknown operating system. + + + + + Unix/Linux operating systems. + + + + + Desktop versions of Windows (95,98,ME). + + + + + Windows NT, 2000, 2003 and future versions based on NT technology. + + + + + Macintosh Mac OSX + + + + + Simple character tokenizer. + + + + + Initializes a new instance of the class. + + The text to be tokenized. + + + + Current position in + + + + + Full text to be parsed + + + + + Check current char while not changing the position. + + + + + + Read the current char and change position + + + + + + Get the substring of the + + + + + + + + Implements a single-call guard around given continuation function. + + + + + Initializes a new instance of the class. + + The asynchronous continuation. + + + + Continuation function which implements the single-call guard. + + The exception. + + + + HashSet optimized for single item + + + + + + Insert single item on scope start, and remove on scope exit + + Item to insert in scope + Existing hashset to update + Force allocation of real hashset-container + HashSet EqualityComparer + + + + Add item to collection, if it not already exists + + Item to insert + + + + Clear hashset + + + + + Check if hashset contains item + + + Item exists in hashset (true/false) + + + + Remove item from hashset + + + Item removed from hashset (true/false) + + + + Copy items in hashset to array + + Destination array + Array offset + + + + Create hashset enumerator + + Enumerator + + + + Provides helpers to sort log events and associated continuations. + + + + + Key selector delegate. + + The type of the value. + The type of the key. + Value to extract key information from. + Key selected from log event. + + + + Performs bucket sort (group by) on an array of items and returns a dictionary for easy traversal of the result set. + + The type of the value. + The type of the key. + The inputs. + The key selector function. + + Dictionary where keys are unique input keys, and values are lists of . + + + + + Performs bucket sort (group by) on an array of items and returns a dictionary for easy traversal of the result set. + + The type of the value. + The type of the key. + The inputs. + The key selector function. + + Dictionary where keys are unique input keys, and values are lists of . + + + + + Performs bucket sort (group by) on an array of items and returns a dictionary for easy traversal of the result set. + + The type of the value. + The type of the key. + The inputs. + The key selector function. + The key comparer function. + + Dictionary where keys are unique input keys, and values are lists of . + + + + + Single-Bucket optimized readonly dictionary. Uses normal internally Dictionary if multiple buckets are needed. + + Avoids allocating a new dictionary, when all items are using the same bucket + + The type of the key. + The type of the value. + + + + + + + + + + + + + + + + Allows direct lookup of existing keys. If trying to access non-existing key exception is thrown. + Consider to use instead for better safety. + + Key value for lookup + Mapped value found + + + + Non-Allocating struct-enumerator + + + + + + + + + + + + + Will always throw, as dictionary is readonly + + + Will always throw, as dictionary is readonly + + + + + + Will always throw, as dictionary is readonly + + + Will always throw, as dictionary is readonly + + + + + + + + + Will always throw, as dictionary is readonly + + + + Utilities for dealing with values. + + + + + Gets the fully qualified name of the class invoking the calling method, including the + namespace but not the assembly. + + + + + Gets the fully qualified name of the class invoking the calling method, including the + namespace but not the assembly. + + StackFrame from the calling method + Fully qualified class name + + + + Returns the assembly from the provided StackFrame (If not internal assembly) + + Valid asssembly, or null if assembly was internal + + + + Returns the classname from the provided StackFrame (If not from internal assembly) + + + Valid class name, or empty string if assembly was internal + + + + Stream helpers + + + + + Copy to output stream and skip BOM if encoding is UTF8 + + + + + + + + Copy stream input to output. Skip the first bytes + + stream to read from + stream to write to + .net35 doesn't have a .copyto + + + + Copy stream input to output. Skip the first bytes + + stream to read from + stream to write to + first bytes to skip (optional) + + + + Helpers for , which is used in e.g. layout renderers. + + + + + Renders the specified log event context item and appends it to the specified . + + append to this + value to be appended + formatstring. If @, then serialize the value with the Default JsonConverter. + provider, for example culture + + + + Appends int without using culture, and most importantly without garbage + + + value to append + + + + Appends uint without using culture, and most importantly without garbage + + Credits Gavin Pugh - https://www.gavpugh.com/2010/04/01/xnac-avoiding-garbage-when-working-with-stringbuilder/ + + + value to append + + + + Clears the provider StringBuilder + + + + + + Copies the contents of the StringBuilder to the MemoryStream using the specified encoding (Without BOM/Preamble) + + StringBuilder source + MemoryStream destination + Encoding used for converter string into byte-stream + Helper char-buffer to minimize memory allocations + + + + Copies the contents of the StringBuilder to the destination StringBuilder + + StringBuilder source + StringBuilder destination + + + + Scans the StringBuilder for the position of needle character + + StringBuilder source + needle character to search for + + Index of the first occurrence (Else -1) + + + + Scans the StringBuilder for the position of needle character + + StringBuilder source + needle characters to search for + + Index of the first occurrence (Else -1) + + + + Compares the contents of two StringBuilders + + + Correct implementation of that also works when is not the same + + True when content is the same + + + + Compares the contents of a StringBuilder and a String + + True when content is the same + + + + Append a number and pad with 0 to 2 digits + + append to this + the number + + + + Append a number and pad with 0 to 4 digits + + append to this + the number + + + + Append a int type (byte, int) as string + + + + + Constructor + + Max number of items + Initial StringBuilder Size + Max StringBuilder Size + + + + Takes StringBuilder from pool + + Allow return to pool + + + + Releases StringBuilder back to pool at its right place + + + + + Keeps track of acquired pool item + + + + + Releases pool item back into pool + + + + + Helpers for . + + + + + IsNullOrWhiteSpace, including for .NET 3.5 + + + + + + + Split a string + + + + + Split string with escape. The escape char is the same as the splitchar + + + split char. escaped also with this char + + + + + Split string with escape + + + + + + + + + Split a string, optional quoted value + + Text to split + Character to split the + Quote character + + Escape for the , not escape for the + , use quotes for that. + + + + + + Represents target with a chain of filters which determine + whether logging should happen. + + + + + cached result as calculating is expensive. + + + + + Initializes a new instance of the class. + + The target. + The filter chain. + Default action if none of the filters match. + + + + Gets the target. + + The target. + + + + Gets the filter chain. + + The filter chain. + + + + Default action if none of the filters match. + + + + + Gets or sets the next item in the chain. + + The next item in the chain. + This is for example the 'target2' logger in writeTo='target1,target2' + + + + Gets the stack trace usage. + + A value that determines stack trace handling. + + + + Helper for dealing with thread-local storage. + + + + + Allocates the data slot for storing thread-local information. + + Allocated slot key. + + + + Gets the data for a slot in thread-local storage. + + Type of the data. + The slot to get data for. + Automatically create the object if it doesn't exist. + + Slot data (will create T if null). + + + + + Wraps with a timeout. + + + + + Initializes a new instance of the class. + + The asynchronous continuation. + The timeout. + + + + Continuation function which implements the timeout logic. + + The exception. + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + URL Encoding helper. + + + + Allow UnreservedMarks instead of ReservedMarks, as specified by chosen RFC + + + Use RFC2396 standard (instead of RFC3986) + + + Should use lowercase when doing HEX escaping of special characters + + + Replace space ' ' with '+' instead of '%20' + + + Skip UTF8 encoding, and prefix special characters with '%u' + + + + Escape unicode string data for use in http-requests + + unicode string-data to be encoded + target for the encoded result + s for how to perform the encoding + + + + Convert the wide-char into utf8-bytes, and then escape + + + + + + + + + Is allowed? + + + + + + + + Is a-z / A-Z / 0-9 + + + + + + + Win32-optimized implementation of . + + + + + Gets the information about a file. + + Name of the file. + The file stream. + The file characteristics, if the file information was retrieved successfully, otherwise null. + + + + Win32-optimized implementation of . + + + + + Initializes a new instance of the class. + + + + + Gets current process ID. + + + + + Gets current process absolute file path. + + + + + Prevents the Xamarin linker from linking the target. + + + By applying this attribute all of the members of the target will be kept as if they had been referenced by the code. + + + + + Ensures that all members of this type are preserved + + + + + Flags the method as a method to preserve during linking if the container class is pulled in. + + + + + Helper class for XML + + + + + removes any unusual unicode characters that can't be encoded into XML + + + + + Cleans string of any invalid XML chars found + + unclean string + string with only valid XML chars + + + + Pretest, small text and not escape needed + + + + + + + + Converts object value to invariant format, and strips any invalid xml-characters + + Object value + Object value converted to string + + + + Converts object value to invariant format (understood by JavaScript) + + Object value + Object value converted to string + + + + XML elements must follow these naming rules: + - Element names are case-sensitive + - Element names must start with a letter or underscore + - Element names can contain letters, digits, hyphens, underscores, and periods + - Element names cannot contain spaces + + + + + + + Converts object value to invariant format (understood by JavaScript) + + Object value + Object TypeCode + Check and remove unusual unicode characters from the result string. + Object value converted to string + + + + Safe version of WriteAttributeString + + + + + + + + + + Safe version of WriteAttributeString + + + + + + + + Safe version of WriteElementSafeString + + + + + + + + + + Safe version of WriteCData + + + + + + + Provides an interface to execute System.Actions without surfacing any exceptions raised for that action. + + + + + Runs the provided action. If the action throws, the exception is logged at Error level. The exception is not propagated outside of this method. + + Action to execute. + + + + Runs the provided function and returns its result. If an exception is thrown, it is logged at Error level. + The exception is not propagated outside of this method; a default value is returned instead. + + Return type of the provided function. + Function to run. + Result returned by the provided function or the default value of type in case of exception. + + + + Runs the provided function and returns its result. If an exception is thrown, it is logged at Error level. + The exception is not propagated outside of this method; a fallback value is returned instead. + + Return type of the provided function. + Function to run. + Fallback value to return in case of exception. + Result returned by the provided function or fallback value in case of exception. + + + + Render a message template property to a string + + + + + Serialization of an object, e.g. JSON and append to + + The object to serialize to string. + Parameter Format + Parameter CaptureType + An object that supplies culture-specific formatting information. + Output destination. + Serialize succeeded (true/false) + + + + Log event context data. + + + + + Initializes a new instance of the class. + + + + + Gets or sets string that will be used to separate key/value pairs. + + + + + + Get or set if empty values should be included. + + A value is empty when null or in case of a string, null or empty string. + + + + + Gets or sets how key/value pairs will be formatted. + + + + + + Renders all log event's properties and appends them to the specified . + + The to append the rendered data to. + Logging event. + + + + Designates a property of the class as an ambient property. + + + non-ambient: ${uppercase:${level}} + ambient : ${level:uppercase} + + + + + Initializes a new instance of the class. + + Ambient property name. + + + + Used to render the application domain name. + + + + + Create a new renderer + + + + + Create a new renderer + + + + + Format string. Possible values: "Short", "Long" or custom like {0} {1}. Default "Long" + The first parameter is the , the second the second the + This string is used in + + + + + + + + + + + + + + + Application setting. + + + Use this layout renderer to insert the value of an application setting + stored in the application's App.config or Web.config file. + + + ${appsetting:item=mysetting:default=mydefault} - produces "mydefault" if no appsetting + + + + + The AppSetting item-name + + + + + + The AppSetting item-name + + + + + The default value to render if the AppSetting value is null. + + + + + + + + + Renders the specified application setting or default value and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + Renders the assembly version information for the entry assembly or a named assembly. + + + As this layout renderer uses reflection and version information is unlikely to change during application execution, + it is recommended to use it in conjunction with the . + + + The entry assembly can't be found in some cases e.g. ASP.NET, unit tests, etc. + + + + + Initializes a new instance of the class. + + + + + The (full) name of the assembly. If null, using the entry assembly. + + + + + + Gets or sets the type of assembly version to retrieve. + + + Some version type and platform combinations are not fully supported. + - UWP earlier than .NET Standard 1.5: Value for is always returned unless the parameter is specified. + - Silverlight: Value for is always returned. + + + + + + Gets or sets the custom format of the assembly version output. + + + Supported placeholders are 'major', 'minor', 'build' and 'revision'. + The default .NET template for version numbers is 'major.minor.build.revision'. See + https://docs.microsoft.com/en-gb/dotnet/api/system.version?view=netframework-4.7.2#remarks + for details. + + + + + + Initializes the layout renderer. + + + + + Closes the layout renderer. + + + + + Renders an assembly version and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + Gets the assembly specified by , or entry assembly otherwise + + Found assembly + + + + Type of assembly version to retrieve. + + + + + Gets the assembly version. + + + + + Gets the file version. + + + + + Gets additional version information. + + + + + The current application domain's base directory. + + + + + cached + + + + + Use base dir of current process. + + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the name of the file to be Path.Combine()'d with with the base directory. + + + + + + Gets or sets the name of the directory to be Path.Combine()'d with with the base directory. + + + + + + Renders the application base directory and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + The call site source file name. Full callsite + + + + + Gets or sets a value indicating whether to include source file path. + + + + + + Gets or sets the number of frames to skip. + + + + + + Gets the level of stack trace information required by the implementing class. + + + + + + + + + + + The call site (class name, method name and source information). + + + + + Initializes a new instance of the class. + + + + + Gets or sets a value indicating whether to render the class name. + + + + + + Gets or sets a value indicating whether to render the include the namespace with . + + + + + + Gets or sets a value indicating whether to render the method name. + + + + + + Gets or sets a value indicating whether the method name will be cleaned up if it is detected as an anonymous delegate. + + + + + + Gets or sets a value indicating whether the method and class names will be cleaned up if it is detected as an async continuation + (everything after an await-statement inside of an async method). + + + + + + Gets or sets the number of frames to skip. + + + + + + Gets or sets a value indicating whether to render the source file name and line number. + + + + + + Gets or sets a value indicating whether to include source file path. + + + + + + Gets the level of stack trace information required by the implementing class. + + + + + Renders the call site and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + The call site source line number. Full callsite + + + + + Gets or sets the number of frames to skip. + + + + + + Gets the level of stack trace information required by the implementing class. + + + + + + + + + + + A counter value (increases on each layout rendering). + + + + + Gets or sets the initial value of the counter. + + + + + + Gets or sets the value to be added to the counter after each layout rendering. + + + + + + Gets or sets the name of the sequence. Different named sequences can have individual values. + + + + + + + + + The current working directory of the application. + + + + + Gets or sets the name of the file to be Path.Combine()'d with the current directory. + + + + + + Gets or sets the name of the directory to be Path.Combine()'d with the current directory. + + + + + + + + + + + + Current date and time. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the culture used for rendering. + + + + + + Gets or sets the date format. Can be any argument accepted by DateTime.ToString(format). + + + + + + Gets or sets a value indicating whether to output UTC time instead of local time. + + + + + + + + + + + + + + + DB null for a database + + + + + + + + + + + The environment variable. + + + + + Gets or sets the name of the environment variable. + + + + + + Gets or sets the default value to be used when the environment variable is not set. + + + + + + + + + + + + Thread identity information (username). + + + + + Initializes a new instance of the class. + + + + + Gets or sets a value indicating whether username should be included. + + + + + + Gets or sets a value indicating whether domain name should be included. + + + + + + Gets or sets the default value to be used when the User is not set. + + + + + + Gets or sets the default value to be used when the Domain is not set. + + + + + + + + + + + + Log event context data. + + This class was marked as obsolete on NLog 2.0 and it may be removed in a future release. + + + + Gets or sets the name of the item. + + + + + + Renders the specified log event context item and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + Log event context data. See . + + + + + Gets or sets the name of the item. + + + + + + Format string for conversion from object to string. + + + + + + Gets or sets the culture used for rendering. + + + + + + Gets or sets the object-property-navigation-path for lookup of nested property + + + + + + + + + + + + + + + Exception information provided through + a call to one of the Logger.*Exception() methods. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the format of the output. Must be a comma-separated list of exception + properties: Message, Type, ShortType, ToString, Method, StackTrace. + This parameter value is case-insensitive. + + + + + + + + Gets or sets the format of the output of inner exceptions. Must be a comma-separated list of exception + properties: Message, Type, ShortType, ToString, Method, StackTrace. + This parameter value is case-insensitive. + + + + + + Gets or sets the separator used to concatenate parts specified in the Format. + + + + + + Gets or sets the separator used to concatenate exception data specified in the Format. + + + + + + Gets or sets the maximum number of inner exceptions to include in the output. + By default inner exceptions are not enabled for compatibility with NLog 1.0. + + + + + + Gets or sets the separator between inner exceptions. + + + + + + Gets the formats of the output of inner exceptions to be rendered in target. + + + + + + + Gets the formats of the output to be rendered in target. + + + + + + + + + + + + + Appends the Message of an Exception to the specified . + + The to append the rendered data to. + The exception containing the Message to append. + + + + Appends the method name from Exception's stack trace to the specified . + + The to append the rendered data to. + The Exception whose method name should be appended. + + + + Appends the stack trace from an Exception to the specified . + + The to append the rendered data to. + The Exception whose stack trace should be appended. + + + + Appends the result of calling ToString() on an Exception to the specified . + + The to append the rendered data to. + The Exception whose call to ToString() should be appended. + + + + Appends the type of an Exception to the specified . + + The to append the rendered data to. + The Exception whose type should be appended. + + + + Appends the short type of an Exception to the specified . + + The to append the rendered data to. + The Exception whose short type should be appended. + + + + Appends the application source of an Exception to the specified . + + The to append the rendered data to. + The Exception whose source should be appended. + + + + Appends the contents of an Exception's Data property to the specified . + + The to append the rendered data to. + The Exception whose Data property elements should be appended. + + + + Appends all the serialized properties of an Exception into the specified . + + The to append the rendered data to. + The Exception whose properties should be appended. + + + + Split the string and then compile into list of Rendering formats. + + + + + + + Renders contents of the specified file. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the name of the file. + + + + + + Gets or sets the encoding used in the file. + + The encoding. + + + + + Renders the contents of the specified file and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + A layout renderer which could have different behavior per instance by using a . + + + + + Create a new. + + Name without ${}. + Method that renders the layout. + + + + Name used in config without ${}. E.g. "test" could be used as "${test}". + + + + + Method that renders the layout. + + + + + + + + The information about the garbage collector. + + + + + Gets or sets the property to retrieve. + + + + + + + + + Gets or sets the property of System.GC to retrieve. + + + + + Total memory allocated. + + + + + Total memory allocated (perform full garbage collection first). + + + + + Gets the number of Gen0 collections. + + + + + Gets the number of Gen1 collections. + + + + + Gets the number of Gen2 collections. + + + + + Maximum generation number supported by GC. + + + + + Render a Global Diagnostics Context item. See + + + + + Gets or sets the name of the item. + + + + + + Format string for conversion from object to string. + + + + + + + + + + + + + + + Globally-unique identifier (GUID). + + + + + Gets or sets the GUID format as accepted by Guid.ToString() method. + + + + + + Generate the Guid from the NLog LogEvent (Will be the same for all targets) + + + + + + + + + + + + + + + The host name that the process is running on. + + + + + + + + Gets the host name and falls back to computer name if not available + + + + + Tries the lookup value. + + The lookup function. + Type of the lookup. + + + + + + + + Thread identity information (name and authentication information). + + + + + Gets or sets the separator to be used when concatenating + parts of identity information. + + + + + + Gets or sets a value indicating whether to render Thread.CurrentPrincipal.Identity.Name. + + + + + + Gets or sets a value indicating whether to render Thread.CurrentPrincipal.Identity.AuthenticationType. + + + + + + Gets or sets a value indicating whether to render Thread.CurrentPrincipal.Identity.IsAuthenticated. + + + + + + + + + Installation parameter (passed to InstallNLogConfig). + + + + + Gets or sets the name of the parameter. + + + + + + Renders the specified installation parameter and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + Render environmental information related to logging events. + + + + + Gets the logging configuration this target is part of. + + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Renders the the value of layout renderer in the context of the specified log event. + + The log event. + String representation of a layout renderer. + + + + Initializes this instance. + + The configuration. + + + + Closes this instance. + + + + + Initializes this instance. + + The configuration. + + + + Closes this instance. + + + + + Renders the value of layout renderer in the context of the specified log event. + + The log event. + The layout render output is appended to builder + + + + Renders the value of layout renderer in the context of the specified log event into . + + The to append the rendered data to. + Logging event. + + + + Initializes the layout renderer. + + + + + Closes the layout renderer. + + + + + Releases unmanaged and - optionally - managed resources. + + True to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Get the for rendering the messages to a + + LogEvent with culture + Culture in on Layout level + + + + + Get the for rendering the messages to a , needed for date and number formats + + LogEvent with culture + Culture in on Layout level + + + is preferred + + + + + Register a custom layout renderer. + + Short-cut for registing to default + Type of the layout renderer. + Name of the layout renderer - without ${}. + + + + Register a custom layout renderer. + + Short-cut for registering to default + Type of the layout renderer. + Name of the layout renderer - without ${}. + + + + Register a custom layout renderer with a callback function . The callback receives the logEvent. + + Name of the layout renderer - without ${}. + Callback that returns the value for the layout renderer. + + + + Register a custom layout renderer with a callback function . The callback recieves the logEvent and the current configuration. + + Name of the layout renderer - without ${}. + Callback that returns the value for the layout renderer. + + + + Marks class as a layout renderer and assigns a name to it. + + This attribute is not required when registering the layout in the API. + + + + Initializes a new instance of the class. + + Name of the layout renderer, without the `${ }` + + + + Format of the ${level} layout renderer output. + + + + + Render the full level name. + + + + + Render the first character of the level. + + + + + Render the ordinal (aka number) for the level. + + + + + The log level. + + + + + Gets or sets a value indicating the output format of the level. + + + + + + + + + + + + + + + A string literal. + + + This is used to escape '${' sequence + as ;${literal:text=${}' + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The literal text value. + This is used by the layout compiler. + + + + Gets or sets the literal text. + + + + + + Renders the specified string literal and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + XML event description compatible with log4j, Chainsaw and NLogViewer. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes the layout renderer. + + + + + Gets or sets a value indicating whether to include NLog-specific extensions to log4j schema. + + + + + + Gets or sets a value indicating whether the XML should use spaces for indentation. + + + + + + Gets or sets the AppInfo field. By default it's the friendly name of the current AppDomain. + + + + + + Gets or sets a value indicating whether to include call site (class and method name) in the information sent over the network. + + + + + + Gets or sets a value indicating whether to include source info (file name and line number) in the information sent over the network. + + + + + + Gets or sets a value indicating whether to include contents of the dictionary. + + + + + + Gets or sets a value indicating whether to include contents of the dictionary. + + + + + + Gets or sets a value indicating whether to include contents of the stack. + + + + + + Gets or sets the NDLC item separator. + + + + + + Gets or sets the option to include all properties from the log events + + + + + + Gets or sets a value indicating whether to include contents of the stack. + + + + + + Gets or sets the NDC item separator. + + + + + + Gets or sets the log4j:event logger-xml-attribute (Default ${logger}) + + + + + + Gets the level of stack trace information required by the implementing class. + + + + + Renders the XML logging event and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + The logger name. + + + + + Gets or sets a value indicating whether to render short logger name (the part after the trailing dot character). + + + + + + + + + + + + The date and time in a long, sortable format yyyy-MM-dd HH:mm:ss.ffff. + + + + + Gets or sets a value indicating whether to output UTC time instead of local time. + + + + + + Renders the date in the long format (yyyy-MM-dd HH:mm:ss.ffff) and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + The machine name that the process is running on. + + + + + + + + + + + Render a Mapped Diagnostic Context item, See + + + + + Gets or sets the name of the item. + + + + + + Format string for conversion from object to string. + + + + + + + + + + + + Render a Mapped Diagnostic Logical Context item (based on CallContext). + See + + + + + Gets or sets the name of the item. + + + + + + Format string for conversion from object to string. + + + + + + + + + + + + The formatted log message. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a value indicating whether to log exception along with message. + + + + + + Gets or sets the string that separates message from the exception. + + + + + + Gets or sets whether it should render the raw message without formatting parameters + + + + + + + + + + + + Render a Nested Diagnostic Context item. + See + + + + + Initializes a new instance of the class. + + + + + Gets or sets the number of top stack frames to be rendered. + + + + + + Gets or sets the number of bottom stack frames to be rendered. + + + + + + Gets or sets the separator to be used for concatenating nested diagnostics context output. + + + + + + Renders the specified Nested Diagnostics Context item and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + Render a Nested Diagnostic Logical Context item (Async scope) + See + + + + + Initializes a new instance of the class. + + + + + Gets or sets the number of top stack frames to be rendered. + + + + + + Gets or sets the number of bottom stack frames to be rendered. + + + + + + Gets or sets the separator to be used for concatenating nested logical context output. + + + + + + Renders the specified Nested Logical Context item and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + Timing Renderer (Async scope) + + + + + Gets or sets whether to only include the duration of the last scope created + + + + + + Gets or sets whether to just display the scope creation time, and not the duration + + + + + + Gets or sets the TimeSpan format. Can be any argument accepted by TimeSpan.ToString(format). + + + + + + Renders the timing details of the Nested Logical Context item and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + A newline literal. + + + + + Renders the specified string literal and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + The directory where NLog.dll is located. + + + + + Initializes static members of the NLogDirLayoutRenderer class. + + + + + Gets or sets the name of the file to be Path.Combine()'d with the directory name. + + + + + + Gets or sets the name of the directory to be Path.Combine()'d with the directory name. + + + + + + Initializes the layout renderer. + + + + + Closes the layout renderer. + + + + + Renders the directory where NLog is located and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + The performance counter. + + + + + Gets or sets the name of the counter category. + + + + + + Gets or sets the name of the performance counter. + + + + + + Gets or sets the name of the performance counter instance (e.g. this.Global_). + + + + + + Gets or sets the name of the machine to read the performance counter from. + + + + + + Format string for conversion from float to string. + + + + + + Gets or sets the culture used for rendering. + + + + + + + + + If having multiple instances with the same process-name, then they will get different instance names + + + + + + + + + + + The identifier of the current process. + + + + + + + + + + + The information about the running process. + + + + + Gets or sets the property to retrieve. + + + + + + Gets or sets the format-string to use if the property supports it (Ex. DateTime / TimeSpan / Enum) + + + + + + + + + + + + + + + Property of System.Diagnostics.Process to retrieve. + + + + + Base Priority. + + + + + Exit Code. + + + + + Exit Time. + + + + + Process Handle. + + + + + Handle Count. + + + + + Whether process has exited. + + + + + Process ID. + + + + + Machine name. + + + + + Handle of the main window. + + + + + Title of the main window. + + + + + Maximum Working Set. + + + + + Minimum Working Set. + + + + + Non-paged System Memory Size. + + + + + Non-paged System Memory Size (64-bit). + + + + + Paged Memory Size. + + + + + Paged Memory Size (64-bit).. + + + + + Paged System Memory Size. + + + + + Paged System Memory Size (64-bit). + + + + + Peak Paged Memory Size. + + + + + Peak Paged Memory Size (64-bit). + + + + + Peak Virtual Memory Size. + + + + + Peak Virtual Memory Size (64-bit).. + + + + + Peak Working Set Size. + + + + + Peak Working Set Size (64-bit). + + + + + Whether priority boost is enabled. + + + + + Priority Class. + + + + + Private Memory Size. + + + + + Private Memory Size (64-bit). + + + + + Privileged Processor Time. + + + + + Process Name. + + + + + Whether process is responding. + + + + + Session ID. + + + + + Process Start Time. + + + + + Total Processor Time. + + + + + User Processor Time. + + + + + Virtual Memory Size. + + + + + Virtual Memory Size (64-bit). + + + + + Working Set Size. + + + + + Working Set Size (64-bit). + + + + + The name of the current process. + + + + + Gets or sets a value indicating whether to write the full path to the process executable. + + + + + + Renders the current process name (optionally with a full path). + + The to append the rendered data to. + Logging event. + + + + The process time in format HH:mm:ss.mmm. + + + + + Gets or sets a value indicating whether to output in culture invariant format + + + + + + + + + + + + Write timestamp to builder with format hh:mm:ss:fff + + + + + High precision timer, based on the value returned from QueryPerformanceCounter() optionally converted to seconds. + + + + + Gets or sets a value indicating whether to normalize the result by subtracting + it from the result of the first call (so that it's effectively zero-based). + + + + + + Gets or sets a value indicating whether to output the difference between the result + of QueryPerformanceCounter and the previous one. + + + + + + Gets or sets a value indicating whether to convert the result to seconds by dividing + by the result of QueryPerformanceFrequency(). + + + + + + Gets or sets the number of decimal digits to be included in output. + + + + + + Gets or sets a value indicating whether to align decimal point (emit non-significant zeros). + + + + + + + + + + + + A value from the Registry. + + + + + Create new renderer + + + + + Gets or sets the registry value name. + + + + + + Gets or sets the value to be output when the specified registry key or value is not found. + + + + + + Require escaping backward slashes in . Need to be backwards-compatible. + + When true: + + `\` in value should be configured as `\\` + `\\` in value should be configured as `\\\\`. + + Default value wasn't a Layout before and needed an escape of the slash + + + + + Gets or sets the registry view (see: https://msdn.microsoft.com/de-de/library/microsoft.win32.registryview.aspx). + Allowed values: Registry32, Registry64, Default + + + + + + Gets or sets the registry key. + + + HKCU\Software\NLogTest + + + Possible keys: +
    +
  • HKEY_LOCAL_MACHINE
  • +
  • HKLM
  • +
  • HKEY_CURRENT_USER
  • +
  • HKCU
  • +
  • HKEY_CLASSES_ROOT
  • +
  • HKEY_USERS
  • +
  • HKEY_CURRENT_CONFIG
  • +
  • HKEY_DYN_DATA
  • +
  • HKEY_PERFORMANCE_DATA
  • +
+
+ +
+ + + Reads the specified registry key and value and appends it to + the passed . + + The to append the rendered data to. + Logging event. Ignored. + + + + Has ? + + + + + Parse key to and subkey. + + full registry key name + Result of parsing, never null. + + + + Aliases for the hives. See https://msdn.microsoft.com/en-us/library/ctb3kd86(v=vs.110).aspx + + + + + The sequence ID + + + + + + + + + + + The short date in a sortable format yyyy-MM-dd. + + + + + Gets or sets a value indicating whether to output UTC time instead of local time. + + + + + + Renders the current short date string (yyyy-MM-dd) and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + System special folder path (includes My Documents, My Music, Program Files, Desktop, and more). + + + + + Gets or sets the system special folder to use. + + + Full list of options is available at MSDN. + The most common ones are: +
    +
  • ApplicationData - roaming application data for current user.
  • +
  • CommonApplicationData - application data for all users.
  • +
  • MyDocuments - My Documents
  • +
  • DesktopDirectory - Desktop directory
  • +
  • LocalApplicationData - non roaming application data
  • +
  • Personal - user profile directory
  • +
  • System - System directory
  • +
+
+ +
+ + + Gets or sets the name of the file to be Path.Combine()'d with the directory name. + + + + + + Gets or sets the name of the directory to be Path.Combine()'d with the directory name. + + + + + + Renders the directory where NLog is located and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + Format of the ${stacktrace} layout renderer output. + + + + + Raw format (multiline - as returned by StackFrame.ToString() method). + + + + + Flat format (class and method names displayed in a single line). + + + + + Detailed flat format (method signatures displayed in a single line). + + + + + Stack trace renderer. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the output format of the stack trace. + + + + + + Gets or sets the number of top stack frames to be rendered. + + + + + + Gets or sets the number of frames to skip. + + + + + + Gets or sets the stack frame separator string. + + + + + + Gets the level of stack trace information required by the implementing class. + + + + + + Renders the call site and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + A temporary directory. + + + + + Gets or sets the name of the file to be Path.Combine()'d with the directory name. + + + + + + Gets or sets the name of the directory to be Path.Combine()'d with the directory name. + + + + + + + + + Renders the directory where NLog is located and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + The identifier of the current thread. + + + + + + + + The name of the current thread. + + + + + + + + The Ticks value of current date and time. + + + + + + + + + + + The time in a 24-hour, sortable format HH:mm:ss.mmmm. + + + + + Gets or sets a value indicating whether to output UTC time instead of local time. + + + + + + Gets or sets a value indicating whether to output in culture invariant format + + + + + + + + + + + + A renderer that puts into log a System.Diagnostics trace correlation id. + + + + + + + + + + + Render a NLog variable (xml or config) + + + + + Gets or sets the name of the NLog variable. + + + + + + Gets or sets the default value to be used when the variable is not set. + + Not used if Name is null + + + + + Initializes the layout renderer. + + + + + Try get the + + + + + + + Renders the specified variable and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + Thread Windows identity information (username). + + + + + Initializes a new instance of the class. + + + + + Gets or sets a value indicating whether domain name should be included. + + + + + + Gets or sets a value indicating whether username should be included. + + + + + + Renders the current thread windows identity information and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + Applies caching to another layout output. + + + The value of the inner layout will be rendered only once and reused subsequently. + + + + + A value indicating when the cache is cleared. + + + + Never clear the cache. + + + Clear the cache whenever the is initialized. + + + Clear the cache whenever the is closed. + + + + Initializes a new instance of the class. + + + + + Gets or sets a value indicating whether this is enabled. + + + + + + Gets or sets a value indicating when the cache is cleared. + + + + + + Cachekey. If the cachekey changes, resets the value. For example, the cachekey would be the current day.s + + + + + + Initializes the layout renderer. + + + + + Closes the layout renderer. + + + + + Transforms the output of another layout. + + Output to be transform. + Transformed text. + + + + Renders the inner layout contents. + + The log event. + Contents of inner layout. + + + + + + + Filters characters not allowed in the file names by replacing them with safe character. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a value indicating whether to modify the output of this renderer so it can be used as a part of file path + (illegal characters are replaced with '_'). + + + + + + + + + + + + Escapes output of another layout using JSON rules. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a value indicating whether to apply JSON encoding. + + + + + + Gets or sets a value indicating whether to escape non-ascii characters + + + + + + + + + + + + Left part of a text + + + + + Gets or sets the length in characters. + + + + + + Same as -property, so it can be used as ambient property. + + + ${message:truncate=80} + + + + + + + + + + + Converts the result of another layout output to lower case. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a value indicating whether lower case conversion should be applied. + + A value of true if lower case conversion should be applied; otherwise, false. + + + + + Gets or sets the culture used for rendering. + + + + + + + + + + + + Render the non-raw value of an object. + + For performance and/or full (formatted) control of the output. + + + + Gets or sets a value indicating whether to disable the IRawValue-interface + + A value of true if IRawValue-interface should be ignored; otherwise, false. + + + + + + + + + + + Render a single property of a object + + + + + + + + Gets or sets the object-property-navigation-path for lookup of nested property + + Shortcut for + + + + + Gets or sets the object-property-navigation-path for lookup of nested property + + + + + + Format string for conversion from object to string. + + + + + + Gets or sets the culture used for rendering. + + + + + + + + + + + + + + + Only outputs the inner layout when exception has been defined for log message. + + + + + + + + Transforms the output of another layout. + + Output to be transform. + Transformed text. + + + + Horizontal alignment for padding layout renderers. + + + + + When layout text is too long, align it to the left + (remove characters from the right). + + + + + When layout text is too long, align it to the right + (remove characters from the left). + + + + + Applies padding to another layout output. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the number of characters to pad the output to. + + + Positive padding values cause left padding, negative values + cause right padding to the desired width. + + + + + + Gets or sets the padding character. + + + + + + Gets or sets a value indicating whether to trim the + rendered text to the absolute value of the padding length. + + + + + + Gets or sets a value indicating whether a value that has + been truncated (when is true) + will be left-aligned (characters removed from the right) + or right-aligned (characters removed from the left). The + default is left alignment. + + RegistryLayoutRenderer + + + + Transforms the output of another layout. + + Output to be transform. + Transformed text. + + + + Replaces a string in the output of another layout with another string. + + + ${replace:searchFor=\\n+:replaceWith=-:regex=true:inner=${message}} + + + + + Gets or sets the text to search for. + + The text search for. + + + + + Gets or sets a value indicating whether regular expressions should be used. + + A value of true if regular expressions should be used otherwise, false. + + + + + Gets or sets the replacement string. + + The replacement string. + + + + + Gets or sets the group name to replace when using regular expressions. + Leave null or empty to replace without using group name. + + The group name. + + + + + Gets or sets a value indicating whether to ignore case. + + A value of true if case should be ignored when searching; otherwise, false. + + + + + Gets or sets a value indicating whether to search for whole words. + + A value of true if whole words should be searched for; otherwise, false. + + + + + Initializes the layout renderer. + + + + + Post-processes the rendered message. + + The text to be post-processed. + Post-processed text. + + + + This class was created instead of simply using a lambda expression so that the "ThreadAgnosticAttributeTest" will pass + + + + + A match evaluator for Regular Expression based replacing + + Input string. + Group name in the regex. + Replace value. + Match from regex. + Groups replaced with . + + + + Replaces newline characters from the result of another layout renderer with spaces. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a value indicating the string that should be used for separating lines. + + + + + + + + + + + + Right part of a text + + + + + Gets or sets the length in characters. + + + + + + + + + + + + Decodes text "encrypted" with ROT-13. + + + See https://en.wikipedia.org/wiki/ROT13. + + + + + Gets or sets the layout to be wrapped. + + The layout to be wrapped. + This variable is for backwards compatibility + + + + + Encodes/Decodes ROT-13-encoded string. + + The string to be encoded/decoded. + Encoded/Decoded text. + + + + + + + + + + Encodes/Decodes ROT-13-encoded string. + + + + + Substring the result + + + ${substring:${level}:start=2:length=2} + ${substring:${level}:start=-2:length=2} + ${substring:Inner=${level}:start=2:length=2} + + + + + Initializes a new instance of the class. + + + + + Gets or sets the start index. + + Index + + + + + Gets or sets the length in characters. If null, then the whole string + + Index + + + + + + + + + + + Calculate start position + + 0 or positive number + + + + Calculate needed length + + 0 or positive number + + + + Trims the whitespace from the result of another layout renderer. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a value indicating whether lower case conversion should be applied. + + A value of true if lower case conversion should be applied; otherwise, false. + + + + + + + + + + + Converts the result of another layout output to upper case. + + + ${uppercase:${level}} //[DefaultParameter] + ${uppercase:Inner=${level}} + ${level:uppercase} // [AmbientProperty] + + + + + Initializes a new instance of the class. + + + + + Gets or sets a value indicating whether upper case conversion should be applied. + + A value of true if upper case conversion should be applied otherwise, false. + + + + + Gets or sets the culture used for rendering. + + + + + + + + + + + + Encodes the result of another layout output for use with URLs. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a value indicating whether spaces should be translated to '+' or '%20'. + + A value of true if space should be translated to '+'; otherwise, false. + + + + + Gets or sets a value whether escaping be done according to Rfc3986 (Supports Internationalized Resource Identifiers - IRIs) + + A value of true if Rfc3986; otherwise, false for legacy Rfc2396. + + + + + Gets or sets a value whether escaping be done according to the old NLog style (Very non-standard) + + A value of true if legacy encoding; otherwise, false for standard UTF8 encoding. + + + + + Transforms the output of another layout. + + Output to be transform. + Transformed text. + + + + Outputs alternative layout when the inner layout produces empty result. + + + + + Gets or sets the layout to be rendered when original layout produced empty result. + + + + + + + + + + + + + + + Only outputs the inner layout when the specified condition has been met. + + + + + Gets or sets the condition that must be met for the layout to be printed. + + + + + + If is not met, print this layout. + + + + + + + + + + + + + + + Replaces newline characters from the result of another layout renderer with spaces. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the line length for wrapping. + + + Only positive values are allowed + + + + + + Post-processes the rendered message. + + The text to be post-processed. + Post-processed text. + + + + Base class for s which wrapping other s. + + This has the property (which is default) and can be used to wrap. + + + ${uppercase:${level}} //[DefaultParameter] + ${uppercase:Inner=${level}} + + + + + Gets or sets the wrapped layout. + + [DefaultParameter] so Inner: is not required if it's the first + + + + + + Notify when has been changed + + Change to private protected in C# 7.3 + + + + + + + Renders the inner message, processes it and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + Appends the rendered output from -layout and transforms the added output (when necessary) + + Logging event. + The to append the rendered data to. + Start position for any necessary transformation of . + + + + Transforms the output of another layout. + + Logging event. + Output to be transform. + Transformed text. + + + + Transforms the output of another layout. + + Output to be transform. + Transformed text. + + + + Renders the inner layout contents. + + The log event. + Contents of inner layout. + + + + Base class for s which wrapping other s. + + This expects the transformation to work on a + + + + + + + + Transforms the output of another layout. + + + Output to be transform. + + + + Transforms the output of another layout. + + Output to be transform. + + + + Renders the inner layout contents. + + + for the result + + + + + + + + + + + + + + + + + + Converts the result of another layout output to be XML-compliant. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a value indicating whether to apply XML encoding. + + Ensures always valid XML, but gives a performance hit + + + + + Gets or sets a value indicating whether to transform newlines (\r\n) into ( ) + + + + + + + + + + + + A layout containing one or more nested layouts. + + + + + Initializes a new instance of the class. + + + + + Gets the inner layouts. + + + + + + Initializes the layout. + + + + + Formats the log event relying on inner layouts. + + The log event to be formatted. + A string representation of the log event. + + + + Formats the log event relying on inner layouts. + + The logging event. + for the result + + + + Closes the layout. + + + + + Generate description of Compound Layout + + Compound Layout String Description + + + + A column in the CSV. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The name of the column. + The layout of the column. + + + + Gets or sets the name of the column. + + + + + + Gets or sets the layout of the column. + + + + + + Gets or sets the override of Quoting mode + + + and are faster than the default + + + + + + Specifies allowed column delimiters. + + + + + Automatically detect from regional settings. + + + + + Comma (ASCII 44). + + + + + Semicolon (ASCII 59). + + + + + Tab character (ASCII 9). + + + + + Pipe character (ASCII 124). + + + + + Space character (ASCII 32). + + + + + Custom string, specified by the CustomDelimiter. + + + + + A specialized layout that renders CSV-formatted events. + + If is set, then the header generation with columnnames will be disabled. + + + + Initializes a new instance of the class. + + + + + Gets the array of parameters to be passed. + + + + + + Gets or sets a value indicating whether CVS should include header. + + A value of true if CVS should include header; otherwise, false. + + + + + Gets or sets the column delimiter. + + + + + + Gets or sets the quoting mode. + + + + + + Gets or sets the quote Character. + + + + + + Gets or sets the custom column delimiter value (valid when ColumnDelimiter is set to 'Custom'). + + + + + + Initializes the layout. + + + + + Formats the log event for write. + + The log event to be formatted. + A string representation of the log event. + + + + Formats the log event for write. + + The logging event. + for the result + + + + Get the headers with the column names. + + + + + + Header with column names for CSV layout. + + + + + Initializes a new instance of the class. + + The parent. + + + + Renders the layout for the specified logging event by invoking layout renderers. + + The logging event. + The rendered layout. + + + + Renders the layout for the specified logging event by invoking layout renderers. + + The logging event. + for the result + + + + Generate description of CSV Layout + + CSV Layout String Description + + + + Specifies CSV quoting modes. + + + + + Quote all column (Fast) + + + + + Quote nothing (Very fast) + + + + + Quote only whose values contain the quote symbol or the separator (Slow) + + + + + JSON attribute. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The name of the attribute. + The layout of the attribute's value. + + + + Initializes a new instance of the class. + + The name of the attribute. + The layout of the attribute's value. + Encode value with json-encode + + + + Gets or sets the name of the attribute. + + + + + + Gets or sets the layout that will be rendered as the attribute's value. + + + + + + Determines whether or not this attribute will be Json encoded. + + + + + + Gets or sets a value indicating whether to escape non-ascii characters + + + + + + Gets or sets whether an attribute with empty value should be included in the output + + + + + + A specialized layout that renders JSON-formatted events. + + + + + Initializes a new instance of the class. + + + + + Gets the array of attributes' configurations. + + + + + + Gets or sets the option to suppress the extra spaces in the output json + + + + + + Gets or sets the option to render the empty object value {} + + + + + + Gets or sets a value indicating whether to include contents of the dictionary. + + + + + + Gets or sets a value indicating whether to include contents of the dictionary. + + + + + + Gets or sets a value indicating whether to include contents of the dictionary. + + + + + + Gets or sets the option to include all properties from the log event (as JSON) + + + + + + List of property names to exclude when is true + + + + + + How far should the JSON serializer follow object references before backing off + + + + + + Initializes the layout. + + + + + Closes the layout. + + + + + Formats the log event as a JSON document for writing. + + The logging event. + for the result + + + + Formats the log event as a JSON document for writing. + + The log event to be formatted. + A JSON string representation of the log event. + + + + Generate description of JSON Layout + + JSON Layout String Description + + + + Abstract interface that layouts must implement. + + + + + Is this layout initialized? See + + + + + Gets a value indicating whether this layout is thread-agnostic (can be rendered on any thread). + + + Layout is thread-agnostic if it has been marked with [ThreadAgnostic] attribute and all its children are + like that as well. + + Thread-agnostic layouts only use contents of for its output. + + + + + Gets the level of stack trace information required for rendering. + + + + + Gets the logging configuration this target is part of. + + + + + Converts a given text to a . + + Text to be converted. + object represented by the text. + + + + Implicitly converts the specified string to a . + + The layout string. + Instance of . + + + + Implicitly converts the specified string to a . + + The layout string. + The NLog factories to use when resolving layout renderers. + Instance of . + + + + Precalculates the layout for the specified log event and stores the result + in per-log event cache. + + Only if the layout doesn't have [ThreadAgnostic] and doesn't contain layouts with [ThreadAgnostic]. + + The log event. + + Calling this method enables you to store the log event in a buffer + and/or potentially evaluate it in another thread even though the + layout may contain thread-dependent renderer. + + + + + Renders the event info in layout. + + The event info. + String representing log event. + + + + Optimized version of for internal Layouts. Works best + when override of is available. + + The event info. + Appends the string representing log event to target + Should rendering result be cached on LogEventInfo + + + + Valid default implementation of , when having implemented the optimized + + The logging event. + StringBuilder to help minimize allocations [optional]. + The rendered layout. + + + + Renders the layout for the specified logging event by invoking layout renderers. + + The logging event. + for the result + + + + Initializes this instance. + + The configuration. + + + + Closes this instance. + + + + + Initializes this instance. + + The configuration. + + + + Closes this instance. + + + + + Initializes the layout. + + + + + Closes the layout. + + + + + Renders the layout for the specified logging event by invoking layout renderers. + + The logging event. + The rendered layout. + + + + Register a custom Layout. + + Short-cut for registering to default + Type of the Layout. + Name of the Layout. + + + + Register a custom Layout. + + Short-cut for registering to default + Type of the Layout. + Name of the Layout. + + + + Optimized version of for internal Layouts, when + override of is available. + + + + + Try get value + + + rawValue if return result is true + false if we could not determine the rawValue + + + + Marks class as a layout renderer and assigns a format string to it. + + + + + Initializes a new instance of the class. + + Layout name. + + + + Parses layout strings. + + + + + Add to + + + + + + + A specialized layout that supports header and footer. + + + + + Gets or sets the body layout (can be repeated multiple times). + + + + + + Gets or sets the header layout. + + + + + + Gets or sets the footer layout. + + + + + + Renders the layout for the specified logging event by invoking layout renderers. + + The logging event. + The rendered layout. + + + + Renders the layout for the specified logging event by invoking layout renderers. + + The logging event. + for the result. + + + + A specialized layout that renders Log4j-compatible XML events. + + + This layout is not meant to be used explicitly. Instead you can use ${log4jxmlevent} layout renderer. + + + + + Initializes a new instance of the class. + + + + + Gets the instance that renders log events. + + + + + Gets the collection of parameters. Each parameter contains a mapping + between NLog layout and a named parameter. + + + + + + Gets or sets a value indicating whether to include contents of the dictionary. + + + + + + Gets or sets the option to include all properties from the log events + + + + + + Gets or sets a value indicating whether to include contents of the stack. + + + + + + Gets or sets a value indicating whether to include contents of the dictionary. + + + + + + Gets or sets a value indicating whether to include contents of the stack. + + + + + + Gets or sets a value indicating whether to include call site (class and method name) in the information sent over the network. + + + + + + Gets or sets a value indicating whether to include source info (file name and line number) in the information sent over the network. + + + + + + Renders the layout for the specified logging event by invoking layout renderers. + + The logging event. + The rendered layout. + + + + Renders the layout for the specified logging event by invoking layout renderers. + + The logging event. + for the result + + + + Represents a string with embedded placeholders that can render contextual information. + + + This layout is not meant to be used explicitly. Instead you can just use a string containing layout + renderers everywhere the layout is required. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The layout string to parse. + + + + Initializes a new instance of the class. + + The layout string to parse. + The NLog factories to use when creating references to layout renderers. + + + + Original text before compile to Layout renderes + + + + + Gets or sets the layout text. + + + + + + Is the message fixed? (no Layout renderers used) + + + + + Get the fixed text. Only set when is true + + + + + Is the message a simple formatted string? (Can skip StringBuilder) + + + + + Gets a collection of objects that make up this layout. + + + + + Gets the level of stack trace information required for rendering. + + + + + Converts a text to a simple layout. + + Text to be converted. + A object. + + + + Escapes the passed text so that it can + be used literally in all places where + layout is normally expected without being + treated as layout. + + The text to be escaped. + The escaped text. + + Escaping is done by replacing all occurrences of + '${' with '${literal:text=${}' + + + + + Evaluates the specified text by expanding all layout renderers. + + The text to be evaluated. + Log event to be used for evaluation. + The input text with all occurrences of ${} replaced with + values provided by the appropriate layout renderers. + + + + Evaluates the specified text by expanding all layout renderers + in new context. + + The text to be evaluated. + The input text with all occurrences of ${} replaced with + values provided by the appropriate layout renderers. + + + + Returns a that represents the current object. + + + A that represents the current object. + + + + + + + + + + + + + + + + + + + + XML attribute. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The name of the attribute. + The layout of the attribute's value. + + + + Initializes a new instance of the class. + + The name of the attribute. + The layout of the attribute's value. + Encode value with xml-encode + + + + Gets or sets the name of the attribute. + + + + + + Gets or sets the layout that will be rendered as the attribute's value. + + + + + + Determines whether or not this attribute will be Xml encoded. + + + + + + Gets or sets whether an attribute with empty value should be included in the output + + + + + + A XML Element + + + + + + + + + + + Name of the element + + + + + Value inside the element + + + + + Determines whether or not this attribute will be Xml encoded. + + + + + A specialized layout that renders XML-formatted events. + + + + + Initializes a new instance of the class. + + The name of the top XML node + The value of the top XML node + + + + Name of the XML element + + Upgrade to private protected when using C# 7.2 + + + + + Value inside the XML element + + Upgrade to private protected when using C# 7.2 + + + + + Xml Encode the value for the XML element + + Ensures always valid XML, but gives a performance hit + + + + + Auto indent and create new lines + + + + + + Gets the array of xml 'elements' configurations. + + + + + + Gets the array of 'attributes' configurations for the element + + + + + + Gets or sets whether a ElementValue with empty value should be included in the output + + + + + + Gets or sets a value indicating whether to include contents of the dictionary. + + + + + + Gets or sets a value indicating whether to include contents of the dictionary. + + + + + + Gets or sets the option to include all properties from the log event (as XML) + + + + + + List of property names to exclude when is true + + + + + + XML element name to use when rendering properties + + + Support string-format where {0} means property-key-name + + Skips closing element tag when having configured + + + + + + XML attribute name to use when rendering property-key + + When null (or empty) then key-attribute is not included + + + Will replace newlines in attribute-value with + + + + + + XML attribute name to use when rendering property-value + + When null (or empty) then value-attribute is not included and + value is formatted as XML-element-value + + + Skips closing element tag when using attribute for value + + Will replace newlines in attribute-value with + + + + + + XML element name to use for rendering IList-collections items + + + + + + How far should the XML serializer follow object references before backing off + + + + + + Initializes the layout. + + + + + Formats the log event as a XML document for writing. + + The logging event. + for the result + + + + Formats the log event as a XML document for writing. + + The log event to be formatted. + A XML string representation of the log event. + + + + write attribute, only if is not empty + + + + + rendered + + + + Generate description of XML Layout + + XML Layout String Description + + + + A specialized layout that renders XML-formatted events. + + + + + Initializes a new instance of the class. + + + + + + + + Name of the root XML element + + + + + + Value inside the root XML element + + + + + + Determines whether or not this attribute will be Xml encoded. + + + + + + Represents the logging event. + + + + + Gets the date of the first log event created. + + + + + The formatted log message. + + + + + The log message including any parameter placeholders + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Log level. + Logger name. + Log message including parameter placeholders. + + + + Initializes a new instance of the class. + + Log level. + Logger name. + Log message including parameter placeholders. + Log message including parameter placeholders. + + + + Initializes a new instance of the class. + + Log level. + Logger name. + An IFormatProvider that supplies culture-specific formatting information. + Log message including parameter placeholders. + Parameter array. + + + + Initializes a new instance of the class. + + Log level. + Logger name. + An IFormatProvider that supplies culture-specific formatting information. + Log message including parameter placeholders. + Parameter array. + Exception information. + + + + Gets the unique identifier of log event which is automatically generated + and monotonously increasing. + + + + + Gets or sets the timestamp of the logging event. + + + + + Gets or sets the level of the logging event. + + + + + Gets a value indicating whether stack trace has been set for this event. + + + + + Gets the stack frame of the method that did the logging. + + + + + Gets the number index of the stack frame that represents the user + code (not the NLog code). + + + + + Gets the entire stack trace. + + + + + Gets the callsite class name + + + + + Gets the callsite member function name + + + + + Gets the callsite source file path + + + + + Gets the callsite source file line number + + + + + Gets or sets the exception information. + + + + + Gets or sets the logger name. + + + + + Gets the logger short name. + + This property was marked as obsolete on NLog 2.0 and it may be removed in a future release. + + + + Gets or sets the log message including any parameter placeholders. + + + + + Gets or sets the parameter values or null if no parameters have been specified. + + + + + Gets or sets the format provider that was provided while logging or + when no formatProvider was specified. + + + + + Gets or sets the message formatter for generating + Uses string.Format(...) when nothing else has been configured. + + + + + Gets the formatted message. + + + + + Checks if any per-event properties (Without allocation) + + + + + Gets the dictionary of per-event context properties. + + + + + Gets the dictionary of per-event context properties. + Internal helper for the PropertiesDictionary type. + + Create the event-properties dictionary, even if no initial template parameters + Provided when having parsed the message template and capture template parameters (else null) + + + + + Gets the named parameters extracted from parsing as MessageTemplate + + + + + Gets the dictionary of per-event context properties. + + This property was marked as obsolete on NLog 2.0 and it may be removed in a future release. + + + + Creates the null event. + + Null log event. + + + + Creates the log event. + + The log level. + Name of the logger. + The message. + Instance of . + + + + Creates the log event. + + The log level. + Name of the logger. + The format provider. + The message. + The parameters. + Instance of . + + + + Creates the log event. + + The log level. + Name of the logger. + The format provider. + The message. + Instance of . + + + + Creates the log event. + + The log level. + Name of the logger. + The message. + The exception. + Instance of . + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Creates the log event. + + The log level. + Name of the logger. + The exception. + The format provider. + The message. + Instance of . + + + + Creates the log event. + + The log level. + Name of the logger. + The exception. + The format provider. + The message. + The parameters. + Instance of . + + + + Creates from this by attaching the specified asynchronous continuation. + + The asynchronous continuation. + Instance of with attached continuation. + + + + Returns a string representation of this log event. + + String representation of the log event. + + + + Sets the stack trace for the event info. + + The stack trace. + Index of the first user stack frame within the stack trace. + + + + Sets the details retrieved from the Caller Information Attributes + + + + + + + + + Set the + + true = Always, false = Never, null = Auto Detect + + + + Specialized LogFactory that can return instances of custom logger types. + + The type of the logger to be returned. Must inherit from . + + + + Gets the logger with type . + + The logger name. + An instance of . + + + + Gets a custom logger with the name of the current class and type . + + An instance of . + This is a slow-running method. + Make sure you're not doing this in a loop. + + + + Creates and manages instances of objects. + + + + + Internal for unit tests + + + + + Overwrite possible file paths (including filename) for possible NLog config files. + When this property is null, the default file paths ( are used. + + + + + Occurs when logging changes. + + + + + Occurs when logging gets reloaded. + + + + + Initializes static members of the LogManager class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The config. + + + + Initializes a new instance of the class. + + The config loader + + + + Gets the current . + + + + + Gets or sets a value indicating whether exceptions should be thrown. See also . + + A value of true if exception should be thrown; otherwise, false. + By default exceptions are not thrown under any circumstances. + + + + Gets or sets a value indicating whether should be thrown. + + If null then is used. + + A value of true if exception should be thrown; otherwise, false. + + This option is for backwards-compatiblity. + By default exceptions are not thrown under any circumstances. + + + + + Gets or sets a value indicating whether Variables should be kept on configuration reload. + Default value - false. + + + + + Gets or sets the current logging configuration. After setting this property all + existing loggers will be re-configured, so there is no need to call + manually. + + + + + Gets or sets the global log level threshold. Log events below this threshold are not logged. + + + + + Gets the default culture info to use as . + + + Specific culture info or null to use + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting + unmanaged resources. + + + + + Creates a logger that discards all log messages. + + Null logger instance. + + + + Gets the logger with the name of the current class. + + The logger. + This is a slow-running method. + Make sure you're not doing this in a loop. + + + + Gets the logger with the name of the current class. + + The logger with type . + Type of the logger + This is a slow-running method. + Make sure you're not doing this in a loop. + + + + Gets a custom logger with the name of the current class. Use to pass the type of the needed Logger. + + The type of the logger to create. The type must inherit from + The logger of type . + This is a slow-running method. Make sure you are not calling this method in a + loop. + + + + Gets the specified named logger. + + Name of the logger. + The logger reference. Multiple calls to GetLogger with the same argument + are not guaranteed to return the same logger reference. + + + + Gets the specified named logger. + + Name of the logger. + Type of the logger + The logger reference with type . Multiple calls to GetLogger with the same argument + are not guaranteed to return the same logger reference. + + + + Gets the specified named logger. Use to pass the type of the needed Logger. + + Name of the logger. + The type of the logger to create. The type must inherit from . + The logger of type . Multiple calls to GetLogger with the + same argument aren't guaranteed to return the same logger reference. + + + + Loops through all loggers previously returned by GetLogger and recalculates their + target and filter list. Useful after modifying the configuration programmatically + to ensure that all loggers have been properly configured. + + + + + Flush any pending log messages (in case of asynchronous targets) with the default timeout of 15 seconds. + + + + + Flush any pending log messages (in case of asynchronous targets). + + Maximum time to allow for the flush. Any messages after that time + will be discarded. + + + + Flush any pending log messages (in case of asynchronous targets). + + Maximum time to allow for the flush. Any messages + after that time will be discarded. + + + + Flush any pending log messages (in case of asynchronous targets). + + The asynchronous continuation. + + + + Flush any pending log messages (in case of asynchronous targets). + + The asynchronous continuation. + Maximum time to allow for the flush. Any messages + after that time will be discarded. + + + + Flush any pending log messages (in case of asynchronous targets). + + The asynchronous continuation. + Maximum time to allow for the flush. Any messages after that time will be discarded. + + + + Decreases the log enable counter and if it reaches -1 the logs are disabled. + + + Logging is enabled if the number of calls is greater than + or equal to calls. + + This method was marked as obsolete on NLog 4.0 and it may be removed in a future release. + + An object that implements IDisposable whose Dispose() method re-enables logging. + To be used with C# using () statement. + + + + Increases the log enable counter and if it reaches 0 the logs are disabled. + + + Logging is enabled if the number of calls is greater than + or equal to calls. + + This method was marked as obsolete on NLog 4.0 and it may be removed in a future release. + + + + + Decreases the log enable counter and if it reaches -1 the logs are disabled. + + + Logging is enabled if the number of calls is greater than + or equal to calls. + + An object that implements IDisposable whose Dispose() method re-enables logging. + To be used with C# using () statement. + + + + Increases the log enable counter and if it reaches 0 the logs are disabled. + + Logging is enabled if the number of calls is greater + than or equal to calls. + + + + Returns if logging is currently enabled. + + A value of if logging is currently enabled, + otherwise. + Logging is enabled if the number of calls is greater + than or equal to calls. + + + + Raises the event when the configuration is reloaded. + + Event arguments. + + + + Raises the event when the configuration is reloaded. + + Event arguments + + + + Currently this logfactory is disposing? + + + + + Releases unmanaged and - optionally - managed resources. + + True to release both managed and unmanaged resources; + false to release only unmanaged resources. + + + + Get file paths (including filename) for the possible NLog config files. + + The filepaths to the possible config file + + + + Overwrite the paths (including filename) for the possible NLog config files. + + The filepaths to the possible config file + + + + Clear the candidate file paths and return to the defaults. + + + + + Loads logging configuration from file (Currently only XML configuration files supported) + + Configuration file to be read + LogFactory instance for fluent interface + + + + Logger cache key. + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Determines if two objects are equal in value. + + Other object to compare to. + True if objects are equal, false otherwise. + + + + Determines if two objects of the same type are equal in value. + + Other object to compare to. + True if objects are equal, false otherwise. + + + + Logger cache. + + + + + Inserts or updates. + + + + + + + Internal for unit tests + + + + + Enables logging in implementation. + + + + + Initializes a new instance of the class. + + The factory. + + + + Enables logging. + + + + + Logging methods which only are executed when the DEBUG conditional compilation symbol is set. + + Remarks: + The DEBUG conditional compilation symbol is default enabled (only) in a debug build. + + If the DEBUG conditional compilation symbol isn't set in the calling library, the compiler will remove all the invocations to these methods. + This could lead to better performance. + + See: https://msdn.microsoft.com/en-us/library/4xssyw96%28v=vs.90%29.aspx + + + Provides logging interface and utility functions. + + + Auto-generated Logger members for binary compatibility with NLog 1.0. + + + Provides logging interface and utility functions. + + + + + Writes the diagnostic message at the Debug level using the specified format provider and format parameters. + + + Writes the diagnostic message at the Debug level. + Only executed when the DEBUG conditional compilation symbol is set. + Type of the value. + The value to be written. + + + + Writes the diagnostic message at the Debug level. + Only executed when the DEBUG conditional compilation symbol is set. + Type of the value. + An IFormatProvider that supplies culture-specific formatting information. + The value to be written. + + + + Writes the diagnostic message at the Debug level. + Only executed when the DEBUG conditional compilation symbol is set. + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Debug level. + Only executed when the DEBUG conditional compilation symbol is set. + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message and exception at the Debug level. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message at the Debug level using the specified parameters and formatting them with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the Debug level. + Only executed when the DEBUG conditional compilation symbol is set. + Log message. + + + + Writes the diagnostic message at the Debug level using the specified parameters. + Only executed when the DEBUG conditional compilation symbol is set. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the Debug level using the specified parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + The type of the argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified parameter. + Only executed when the DEBUG conditional compilation symbol is set. + The type of the argument. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified arguments formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + The type of the first argument. + The type of the second argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Debug level using the specified parameters. + Only executed when the DEBUG conditional compilation symbol is set. + The type of the first argument. + The type of the second argument. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Debug level using the specified arguments formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + The type of the first argument. + The type of the second argument. + The type of the third argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Debug level using the specified parameters. + Only executed when the DEBUG conditional compilation symbol is set. + The type of the first argument. + The type of the second argument. + The type of the third argument. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Debug level. + Only executed when the DEBUG conditional compilation symbol is set. + A to be written. + + + + Writes the diagnostic message at the Debug level. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + + + + Writes the diagnostic message at the Debug level using the specified parameters. + Only executed when the DEBUG conditional compilation symbol is set. + A containing format items. + First argument to format. + Second argument to format. + + + + Writes the diagnostic message at the Debug level using the specified parameters. + Only executed when the DEBUG conditional compilation symbol is set. + A containing format items. + First argument to format. + Second argument to format. + Third argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified format provider and format parameters. + + + Writes the diagnostic message at the Trace level. + Only executed when the DEBUG conditional compilation symbol is set. + Type of the value. + The value to be written. + + + + Writes the diagnostic message at the Trace level. + Only executed when the DEBUG conditional compilation symbol is set. + Type of the value. + An IFormatProvider that supplies culture-specific formatting information. + The value to be written. + + + + Writes the diagnostic message at the Trace level. + Only executed when the DEBUG conditional compilation symbol is set. + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Trace level. + Only executed when the DEBUG conditional compilation symbol is set. + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message and exception at the Trace level. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message at the Trace level using the specified parameters and formatting them with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the Trace level. + Only executed when the DEBUG conditional compilation symbol is set. + Log message. + + + + Writes the diagnostic message at the Trace level using the specified parameters. + Only executed when the DEBUG conditional compilation symbol is set. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the Trace level using the specified parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + The type of the argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified parameter. + Only executed when the DEBUG conditional compilation symbol is set. + The type of the argument. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified arguments formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + The type of the first argument. + The type of the second argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Trace level using the specified parameters. + Only executed when the DEBUG conditional compilation symbol is set. + The type of the first argument. + The type of the second argument. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Trace level using the specified arguments formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + The type of the first argument. + The type of the second argument. + The type of the third argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Trace level using the specified parameters. + Only executed when the DEBUG conditional compilation symbol is set. + The type of the first argument. + The type of the second argument. + The type of the third argument. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Trace level. + Only executed when the DEBUG conditional compilation symbol is set. + A to be written. + + + + Writes the diagnostic message at the Trace level. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + + + + Writes the diagnostic message at the Trace level using the specified parameters. + Only executed when the DEBUG conditional compilation symbol is set. + A containing format items. + First argument to format. + Second argument to format. + + + + Writes the diagnostic message at the Trace level using the specified parameters. + Only executed when the DEBUG conditional compilation symbol is set. + A containing format items. + First argument to format. + Second argument to format. + Third argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Gets a value indicating whether logging is enabled for the Trace level. + + A value of if logging is enabled for the Trace level, otherwise it returns . + + + + Gets a value indicating whether logging is enabled for the Debug level. + + A value of if logging is enabled for the Debug level, otherwise it returns . + + + + Gets a value indicating whether logging is enabled for the Info level. + + A value of if logging is enabled for the Info level, otherwise it returns . + + + + Gets a value indicating whether logging is enabled for the Warn level. + + A value of if logging is enabled for the Warn level, otherwise it returns . + + + + Gets a value indicating whether logging is enabled for the Error level. + + A value of if logging is enabled for the Error level, otherwise it returns . + + + + Gets a value indicating whether logging is enabled for the Fatal level. + + A value of if logging is enabled for the Fatal level, otherwise it returns . + + + + Writes the diagnostic message at the Trace level using the specified format provider and format parameters. + + + Writes the diagnostic message at the Trace level. + + Type of the value. + The value to be written. + + + + Writes the diagnostic message at the Trace level. + + Type of the value. + An IFormatProvider that supplies culture-specific formatting information. + The value to be written. + + + + Writes the diagnostic message at the Trace level. + + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Trace level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message at the Trace level using the specified parameters and formatting them with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the Trace level. + + Log message. + + + + Writes the diagnostic message at the Trace level using the specified parameters. + + A containing format items. + Arguments to format. + + + + Writes the diagnostic message and exception at the Trace level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message and exception at the Trace level. + + A to be written. + An exception to be logged. + + + + Writes the diagnostic message and exception at the Trace level. + + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message and exception at the Trace level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message at the Trace level using the specified parameter and formatting it with the supplied format provider. + + The type of the argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified parameter. + + The type of the argument. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Trace level using the specified parameters. + + The type of the first argument. + The type of the second argument. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Trace level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Trace level using the specified parameters. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Debug level using the specified format provider and format parameters. + + + Writes the diagnostic message at the Debug level. + + Type of the value. + The value to be written. + + + + Writes the diagnostic message at the Debug level. + + Type of the value. + An IFormatProvider that supplies culture-specific formatting information. + The value to be written. + + + + Writes the diagnostic message at the Debug level. + + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Debug level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message at the Debug level using the specified parameters and formatting them with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the Debug level. + + Log message. + + + + Writes the diagnostic message at the Debug level using the specified parameters. + + A containing format items. + Arguments to format. + + + + Writes the diagnostic message and exception at the Debug level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message and exception at the Debug level. + + A to be written. + An exception to be logged. + + + + Writes the diagnostic message and exception at the Debug level. + + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message and exception at the Debug level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message at the Debug level using the specified parameter and formatting it with the supplied format provider. + + The type of the argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified parameter. + + The type of the argument. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Debug level using the specified parameters. + + The type of the first argument. + The type of the second argument. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Debug level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Debug level using the specified parameters. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Info level using the specified format provider and format parameters. + + + Writes the diagnostic message at the Info level. + + Type of the value. + The value to be written. + + + + Writes the diagnostic message at the Info level. + + Type of the value. + An IFormatProvider that supplies culture-specific formatting information. + The value to be written. + + + + Writes the diagnostic message at the Info level. + + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Info level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message at the Info level using the specified parameters and formatting them with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the Info level. + + Log message. + + + + Writes the diagnostic message at the Info level using the specified parameters. + + A containing format items. + Arguments to format. + + + + Writes the diagnostic message and exception at the Info level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message and exception at the Info level. + + A to be written. + An exception to be logged. + + + + Writes the diagnostic message and exception at the Info level. + + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message and exception at the Info level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message at the Info level using the specified parameter and formatting it with the supplied format provider. + + The type of the argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified parameter. + + The type of the argument. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Info level using the specified parameters. + + The type of the first argument. + The type of the second argument. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Info level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Info level using the specified parameters. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Warn level using the specified format provider and format parameters. + + + Writes the diagnostic message at the Warn level. + + Type of the value. + The value to be written. + + + + Writes the diagnostic message at the Warn level. + + Type of the value. + An IFormatProvider that supplies culture-specific formatting information. + The value to be written. + + + + Writes the diagnostic message at the Warn level. + + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Warn level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message at the Warn level using the specified parameters and formatting them with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the Warn level. + + Log message. + + + + Writes the diagnostic message at the Warn level using the specified parameters. + + A containing format items. + Arguments to format. + + + + Writes the diagnostic message and exception at the Warn level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message and exception at the Warn level. + + A to be written. + An exception to be logged. + + + + Writes the diagnostic message and exception at the Warn level. + + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message and exception at the Warn level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message at the Warn level using the specified parameter and formatting it with the supplied format provider. + + The type of the argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified parameter. + + The type of the argument. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Warn level using the specified parameters. + + The type of the first argument. + The type of the second argument. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Warn level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Warn level using the specified parameters. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Error level using the specified format provider and format parameters. + + + Writes the diagnostic message at the Error level. + + Type of the value. + The value to be written. + + + + Writes the diagnostic message at the Error level. + + Type of the value. + An IFormatProvider that supplies culture-specific formatting information. + The value to be written. + + + + Writes the diagnostic message at the Error level. + + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Error level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message at the Error level using the specified parameters and formatting them with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the Error level. + + Log message. + + + + Writes the diagnostic message at the Error level using the specified parameters. + + A containing format items. + Arguments to format. + + + + Writes the diagnostic message and exception at the Error level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message and exception at the Error level. + + A to be written. + An exception to be logged. + + + + Writes the diagnostic message and exception at the Error level. + + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message and exception at the Error level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message at the Error level using the specified parameter and formatting it with the supplied format provider. + + The type of the argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified parameter. + + The type of the argument. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Error level using the specified parameters. + + The type of the first argument. + The type of the second argument. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Error level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Error level using the specified parameters. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified format provider and format parameters. + + + Writes the diagnostic message at the Fatal level. + + Type of the value. + The value to be written. + + + + Writes the diagnostic message at the Fatal level. + + Type of the value. + An IFormatProvider that supplies culture-specific formatting information. + The value to be written. + + + + Writes the diagnostic message at the Fatal level. + + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Fatal level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message at the Fatal level using the specified parameters and formatting them with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the Fatal level. + + Log message. + + + + Writes the diagnostic message at the Fatal level using the specified parameters. + + A containing format items. + Arguments to format. + + + + Writes the diagnostic message and exception at the Fatal level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message and exception at the Fatal level. + + A to be written. + An exception to be logged. + + + + Writes the diagnostic message and exception at the Fatal level. + + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message and exception at the Fatal level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message at the Fatal level using the specified parameter and formatting it with the supplied format provider. + + The type of the argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified parameter. + + The type of the argument. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified parameters. + + The type of the first argument. + The type of the second argument. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified parameters. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the specified level. + + The log level. + A to be written. + + + + Writes the diagnostic message at the specified level. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + + + + Writes the diagnostic message at the specified level using the specified parameters. + + The log level. + A containing format items. + First argument to format. + Second argument to format. + + + + Writes the diagnostic message at the specified level using the specified parameters. + + The log level. + A containing format items. + First argument to format. + Second argument to format. + Third argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level. + + A to be written. + + + + Writes the diagnostic message at the Trace level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + + + + Writes the diagnostic message at the Trace level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + + + + Writes the diagnostic message at the Trace level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + Third argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level. + + A to be written. + + + + Writes the diagnostic message at the Debug level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + + + + Writes the diagnostic message at the Debug level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + + + + Writes the diagnostic message at the Debug level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + Third argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level. + + A to be written. + + + + Writes the diagnostic message at the Info level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + + + + Writes the diagnostic message at the Info level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + + + + Writes the diagnostic message at the Info level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + Third argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level. + + A to be written. + + + + Writes the diagnostic message at the Warn level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + + + + Writes the diagnostic message at the Warn level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + + + + Writes the diagnostic message at the Warn level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + Third argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level. + + A to be written. + + + + Writes the diagnostic message at the Error level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + + + + Writes the diagnostic message at the Error level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + + + + Writes the diagnostic message at the Error level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + Third argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level. + + A to be written. + + + + Writes the diagnostic message at the Fatal level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + + + + Writes the diagnostic message at the Fatal level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + Third argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Initializes a new instance of the class. + + + + + Occurs when logger configuration changes. + + + + + Gets the name of the logger. + + + + + Gets the factory that created this logger. + + + + + Collection of context properties for the Logger. The logger will append it for all log events + + + It is recommended to use for modifying context properties + when same named logger is used at multiple locations or shared by different thread contexts. + + + + + Gets a value indicating whether logging is enabled for the specified level. + + Log level to be checked. + A value of if logging is enabled for the specified level, otherwise it returns . + + + + Creates new logger that automatically appends the specified property to all log events (without changing current logger) + + Property Name + Property Value + New Logger object that automatically appends specified property + + + + Updates the specified context property for the current logger. The logger will append it for all log events. + + It could be rendered with ${event-properties:YOURNAME} + + With property, all properties could be changed. + + + Will affect all locations/contexts that makes use of the same named logger object. + + Property Name + Property Value + + It is recommended to use for modifying context properties + when same named logger is used at multiple locations or shared by different thread contexts. + + + + + Writes the specified diagnostic message. + + Log event. + + + + Writes the specified diagnostic message. + + The name of the type that wraps Logger. + Log event. + + + + Writes the diagnostic message at the specified level using the specified format provider and format parameters. + + + Writes the diagnostic message at the specified level. + + Type of the value. + The log level. + The value to be written. + + + + Writes the diagnostic message at the specified level. + + Type of the value. + The log level. + An IFormatProvider that supplies culture-specific formatting information. + The value to be written. + + + + Writes the diagnostic message at the specified level. + + The log level. + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the specified level. + + The log level. + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message at the specified level using the specified parameters and formatting them with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the specified level. + + The log level. + Log message. + + + + Writes the diagnostic message at the specified level using the specified parameters. + + The log level. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message and exception at the specified level. + + The log level. + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message and exception at the specified level. + + The log level. + A to be written. + Arguments to format. + An exception to be logged. + + + + Writes the diagnostic message and exception at the specified level. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + Arguments to format. + An exception to be logged. + + + + Writes the diagnostic message at the specified level using the specified parameter and formatting it with the supplied format provider. + + The type of the argument. + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified parameter. + + The type of the argument. + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the specified level using the specified parameters. + + The type of the first argument. + The type of the second argument. + The log level. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the specified level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the specified level using the specified parameters. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + The log level. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Runs the provided action. If the action throws, the exception is logged at Error level. The exception is not propagated outside of this method. + + Action to execute. + + + + Runs the provided function and returns its result. If an exception is thrown, it is logged at Error level. + The exception is not propagated outside of this method; a default value is returned instead. + + Return type of the provided function. + Function to run. + Result returned by the provided function or the default value of type in case of exception. + + + + Runs the provided function and returns its result. If an exception is thrown, it is logged at Error level. + The exception is not propagated outside of this method; a fallback value is returned instead. + + Return type of the provided function. + Function to run. + Fallback value to return in case of exception. + Result returned by the provided function or fallback value in case of exception. + + + + Raises the event when the logger is reconfigured. + + Event arguments + + + + Implementation of logging engine. + + + + + Finds first user stack frame in a stack trace + + The stack trace of the logging method invocation + Type of the logger or logger wrapper. This is still Logger if it's a subclass of Logger. + Index of the first user stack frame or 0 if all stack frames are non-user + + + + This is only done for legacy reason, as the correct method-name and line-number should be extracted from the MoveNext-StackFrame + + The stack trace of the logging method invocation + Starting point for skipping async MoveNext-frames + + + + Assembly to skip? + + Find assembly via this frame. + true, we should skip. + + + + Is this the type of the logger? + + get type of this logger in this frame. + Type of the logger. + + + + + Gets the filter result. + + The filter chain. + The log event. + default result if there are no filters, or none of the filters decides. + The result of the filter. + + + + Defines available log levels. + + + + + Trace log level. + + + + + Debug log level. + + + + + Info log level. + + + + + Warn log level. + + + + + Error log level. + + + + + Fatal log level. + + + + + Off log level. + + + + + Gets all the available log levels (Trace, Debug, Info, Warn, Error, Fatal, Off). + + + + + Gets all the log levels that can be used to log events (Trace, Debug, Info, Warn, Error, Fatal) + i.e LogLevel.Off is excluded. + + + + + Initializes a new instance of . + + The log level name. + The log level ordinal number. + + + + Gets the name of the log level. + + + + + Gets the ordinal of the log level. + + + + + Compares two objects + and returns a value indicating whether + the first one is equal to the second one. + + The first level. + The second level. + The value of level1.Ordinal == level2.Ordinal. + + + + Compares two objects + and returns a value indicating whether + the first one is not equal to the second one. + + The first level. + The second level. + The value of level1.Ordinal != level2.Ordinal. + + + + Compares two objects + and returns a value indicating whether + the first one is greater than the second one. + + The first level. + The second level. + The value of level1.Ordinal > level2.Ordinal. + + + + Compares two objects + and returns a value indicating whether + the first one is greater than or equal to the second one. + + The first level. + The second level. + The value of level1.Ordinal >= level2.Ordinal. + + + + Compares two objects + and returns a value indicating whether + the first one is less than the second one. + + The first level. + The second level. + The value of level1.Ordinal < level2.Ordinal. + + + + Compares two objects + and returns a value indicating whether + the first one is less than or equal to the second one. + + The first level. + The second level. + The value of level1.Ordinal <= level2.Ordinal. + + + + Gets the that corresponds to the specified ordinal. + + The ordinal. + The instance. For 0 it returns , 1 gives and so on. + + + + Returns the that corresponds to the supplied . + + The textual representation of the log level. + The enumeration value. + + + + Returns a string representation of the log level. + + Log level name. + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + Value of true if the specified is equal to + this instance; otherwise, false. + + + + Determines whether the specified instance is equal to this instance. + + The to compare with this instance. + Value of true if the specified is equal to + this instance; otherwise, false. + + + + Compares the level to the other object. + + + The object object. + + + A value less than zero when this logger's is + less than the other logger's ordinal, 0 when they are equal and + greater than zero when this ordinal is greater than the + other ordinal. + + + + + Creates and manages instances of objects. + + + + + Internal for unit tests + + + + + Delegate used to set/get the culture in use. + + This delegate marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Gets the instance used in the . + + Could be used to pass the to other methods + + + + Occurs when logging changes. + + + + + Occurs when logging gets reloaded. + + + + + Gets or sets a value indicating whether NLog should throw exceptions. + By default exceptions are not thrown under any circumstances. + + + + + Gets or sets a value indicating whether should be thrown. + + A value of true if exception should be thrown; otherwise, false. + + This option is for backwards-compatibility. + By default exceptions are not thrown under any circumstances. + + + + + + Gets or sets a value indicating whether Variables should be kept on configuration reload. + Default value - false. + + + + + Gets or sets the current logging configuration. + + + + + + Loads logging configuration from file (Currently only XML configuration files supported) + + Configuration file to be read + LogFactory instance for fluent interface + + + + Gets or sets the global log threshold. Log events below this threshold are not logged. + + + + + Gets or sets the default culture to use. + + This property was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Gets the logger with the name of the current class. + + The logger. + This is a slow-running method. + Make sure you're not doing this in a loop. + + + + Adds the given assembly which will be skipped + when NLog is trying to find the calling method on stack trace. + + The assembly to skip. + + + + Gets a custom logger with the name of the current class. Use to pass the type of the needed Logger. + + The logger class. The class must inherit from . + The logger of type . + This is a slow-running method. + Make sure you're not doing this in a loop. + + + + Creates a logger that discards all log messages. + + Null logger which discards all log messages. + + + + Gets the specified named logger. + + Name of the logger. + The logger reference. Multiple calls to GetLogger with the same argument aren't guaranteed to return the same logger reference. + + + + Gets the specified named custom logger. Use to pass the type of the needed Logger. + + Name of the logger. + The logger class. The class must inherit from . + The logger of type . Multiple calls to GetLogger with the same argument aren't guaranteed to return the same logger reference. + The generic way for this method is + + + + Loops through all loggers previously returned by GetLogger. + and recalculates their target and filter list. Useful after modifying the configuration programmatically + to ensure that all loggers have been properly configured. + + + + + Flush any pending log messages (in case of asynchronous targets) with the default timeout of 15 seconds. + + + + + Flush any pending log messages (in case of asynchronous targets). + + Maximum time to allow for the flush. Any messages after that time will be discarded. + + + + Flush any pending log messages (in case of asynchronous targets). + + Maximum time to allow for the flush. Any messages after that time will be discarded. + + + + Flush any pending log messages (in case of asynchronous targets). + + The asynchronous continuation. + + + + Flush any pending log messages (in case of asynchronous targets). + + The asynchronous continuation. + Maximum time to allow for the flush. Any messages after that time will be discarded. + + + + Flush any pending log messages (in case of asynchronous targets). + + The asynchronous continuation. + Maximum time to allow for the flush. Any messages after that time will be discarded. + + + + Decreases the log enable counter and if it reaches -1 the logs are disabled. + + Logging is enabled if the number of calls is greater + than or equal to calls. + An object that implements IDisposable whose Dispose() method reenables logging. + To be used with C# using () statement. + + + + Increases the log enable counter and if it reaches 0 the logs are disabled. + + Logging is enabled if the number of calls is greater + than or equal to calls. + + + + Checks if logging is currently enabled. + + if logging is currently enabled, + otherwise. + Logging is enabled if the number of calls is greater + than or equal to calls. + + + + Dispose all targets, and shutdown logging. + + + + + Generates a formatted message from the log event + + Log event. + Formatted message + + + + Returns a log message. Used to defer calculation of + the log message until it's actually needed. + + Log message. + + + + Base implementation of a log receiver server which forwards received logs through or a given . + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The log factory. + + + + Processes the log messages. + + The events to process. + + + + Processes the log messages. + + The log events. + + + + Service contract for Log Receiver client. + + This class marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Begins processing of log messages. + + The events. + The callback. + Asynchronous state. + + IAsyncResult value which can be passed to . + + + + + Ends asynchronous processing of log messages. + + The result. + + + + Service contract for Log Receiver client. + + + + + Begins processing of log messages. + + The events. + The callback. + Asynchronous state. + + IAsyncResult value which can be passed to . + + + + + Ends asynchronous processing of log messages. + + The result. + + + + Service contract for Log Receiver server. + + + + + Processes the log messages. + + The events. + + + + Service contract for Log Receiver server. + + + + + Processes the log messages. + + The events. + + + + Service contract for Log Receiver client. + + + + + Begins processing of log messages. + + The events. + The callback. + Asynchronous state. + + IAsyncResult value which can be passed to . + + + + + Ends asynchronous processing of log messages. + + The result. + + + + Client of + + + + + Occurs when the log message processing has completed. + + + + + Occurs when Open operation has completed. + + + + + Occurs when Close operation has completed. + + + + + Enables the user to configure client and service credentials as well as service credential authentication settings for use on the client side of communication. + + + + + Gets the underlying implementation. + + + + + Gets the target endpoint for the service to which the WCF client can connect. + + + + + Opens the client asynchronously. + + + + + Opens the client asynchronously. + + User-specific state. + + + + Closes the client asynchronously. + + + + + Closes the client asynchronously. + + User-specific state. + + + + Processes the log messages asynchronously. + + The events to send. + + + + Processes the log messages asynchronously. + + The events to send. + User-specific state. + + + + Begins processing of log messages. + + The events to send. + The callback. + Asynchronous state. + + IAsyncResult value which can be passed to . + + + + + Ends asynchronous processing of log messages. + + The result. + + + + Instructs the inner channel to display a user interface if one is required to initialize the channel prior to using it. + + + + + Implementation of which forwards received logs through or a given . + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The log factory. + + + + Implementation of which forwards received logs through or a given . + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The log factory. + + + + Internal configuration of Log Receiver Service contracts. + + + + + Wire format for NLog Event. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the client-generated identifier of the event. + + + + + Gets or sets the ordinal of the log level. + + + + + Gets or sets the logger ordinal (index into . + + The logger ordinal. + + + + Gets or sets the time delta (in ticks) between the time of the event and base time. + + + + + Gets or sets the message string index. + + + + + Gets or sets the collection of layout values. + + + + + Gets the collection of indexes into array for each layout value. + + + + + Converts the to . + + The object this is part of.. + The logger name prefix to prepend in front of the logger name. + Converted . + + + + Wire format for NLog event package. + + + + + Gets or sets the name of the client. + + The name of the client. + + + + Gets or sets the base time (UTC ticks) for all events in the package. + + The base time UTC. + + + + Gets or sets the collection of layout names which are shared among all events. + + The layout names. + + + + Gets or sets the collection of logger names. + + The logger names. + + + + Gets or sets the list of events. + + The events. + + + + Converts the events to sequence of objects suitable for routing through NLog. + + The logger name prefix to prepend in front of each logger name. + + Sequence of objects. + + + + + Converts the events to sequence of objects suitable for routing through NLog. + + + Sequence of objects. + + + + + List of strings annotated for more terse serialization. + + + + + Initializes a new instance of the class. + + + + + Log Receiver Client using WCF. + + + This class marked as obsolete before NLog 4.3.11 and it will be removed in a future release. + + It provides an implementation of the legacy interface and it will be completely obsolete when the + ILogReceiverClient is removed. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the endpoint configuration. + + + + Initializes a new instance of the class. + + Name of the endpoint configuration. + The remote address. + + + + Initializes a new instance of the class. + + Name of the endpoint configuration. + The remote address. + + + + Initializes a new instance of the class. + + The binding. + The remote address. + + + + Begins processing of log messages. + + The events to send. + The callback. + Asynchronous state. + + IAsyncResult value which can be passed to . + + + + + Ends asynchronous processing of log messages. + + The result. + + + + Log Receiver Client facade. It allows the use either of the one way or two way + service contract using WCF through its unified interface. + + + Delegating methods are generated with Resharper. + 1. change ProxiedClient to private field (instead of public property) + 2. delegate members + 3. change ProxiedClient back to public property. + + + + + + The client getting proxied + + + + + Do we use one-way or two-way messaging? + + + + + Initializes a new instance of the class. + + Whether to use the one way or two way WCF client. + + + + Initializes a new instance of the class. + + Whether to use the one way or two way WCF client. + Name of the endpoint configuration. + + + + Initializes a new instance of the class. + + Whether to use the one way or two way WCF client. + Name of the endpoint configuration. + The remote address. + + + + Initializes a new instance of the class. + + Whether to use the one way or two way WCF client. + Name of the endpoint configuration. + The remote address. + + + + Initializes a new instance of the class. + + Whether to use the one way or two way WCF client. + The binding. + The remote address. + + + + Causes a communication object to transition immediately from its current state into the closed state. + + + + + Begins an asynchronous operation to close a communication object. + + + The that references the asynchronous close operation. + + The delegate that receives notification of the completion of the asynchronous close operation.An object, specified by the application, that contains state information associated with the asynchronous close operation. was called on an object in the state.The default timeout elapsed before the was able to close gracefully. + + + + Begins an asynchronous operation to close a communication object with a specified timeout. + + + The that references the asynchronous close operation. + + The that specifies how long the send operation has to complete before timing out.The delegate that receives notification of the completion of the asynchronous close operation.An object, specified by the application, that contains state information associated with the asynchronous close operation. was called on an object in the state.The specified timeout elapsed before the was able to close gracefully. + + + + Begins an asynchronous operation to open a communication object. + + + The that references the asynchronous open operation. + + The delegate that receives notification of the completion of the asynchronous open operation.An object, specified by the application, that contains state information associated with the asynchronous open operation.The was unable to be opened and has entered the state.The default open timeout elapsed before the was able to enter the state and has entered the state. + + + + Begins an asynchronous operation to open a communication object within a specified interval of time. + + + The that references the asynchronous open operation. + + The that specifies how long the send operation has to complete before timing out.The delegate that receives notification of the completion of the asynchronous open operation.An object, specified by the application, that contains state information associated with the asynchronous open operation.The was unable to be opened and has entered the state.The specified timeout elapsed before the was able to enter the state and has entered the state. + + + + Begins processing of log messages. + + The events to send. + The callback. + Asynchronous state. + + IAsyncResult value which can be passed to . + + + + + Enables the user to configure client and service credentials as well as service credential authentication settings for use on the client side of communication. + + + + + Causes a communication object to transition from its current state into the closed state. + + The that specifies how long the send operation has to complete before timing out. was called on an object in the state.The timeout elapsed before the was able to close gracefully. + + + + Causes a communication object to transition from its current state into the closed state. + + was called on an object in the state.The default close timeout elapsed before the was able to close gracefully. + + + + Closes the client asynchronously. + + User-specific state. + + + + Closes the client asynchronously. + + + + + Occurs when Close operation has completed. + + + + + Occurs when the communication object completes its transition from the closing state into the closed state. + + + + + Occurs when the communication object first enters the closing state. + + + + + Instructs the inner channel to display a user interface if one is required to initialize the channel prior to using it. + + + + + Completes an asynchronous operation to close a communication object. + + The that is returned by a call to the method. was called on an object in the state.The timeout elapsed before the was able to close gracefully. + + + + Completes an asynchronous operation to open a communication object. + + The that is returned by a call to the method.The was unable to be opened and has entered the state.The timeout elapsed before the was able to enter the state and has entered the state. + + + + Gets the target endpoint for the service to which the WCF client can connect. + + + + + Ends asynchronous processing of log messages. + + The result. + + + + Occurs when the communication object first enters the faulted state. + + + + + Gets the underlying implementation. + + + + + Causes a communication object to transition from the created state into the opened state. + + The was unable to be opened and has entered the state.The default open timeout elapsed before the was able to enter the state and has entered the state. + + + + Causes a communication object to transition from the created state into the opened state within a specified interval of time. + + The that specifies how long the send operation has to complete before timing out.The was unable to be opened and has entered the state.The specified timeout elapsed before the was able to enter the state and has entered the state. + + + + Opens the client asynchronously. + + + + + Opens the client asynchronously. + + User-specific state. + + + + Occurs when Open operation has completed. + + + + + Occurs when the communication object completes its transition from the opening state into the opened state. + + + + + Occurs when the communication object first enters the opening state. + + + + + Processes the log messages asynchronously. + + The events to send. + + + + Processes the log messages asynchronously. + + The events to send. + User-specific state. + + + + Occurs when the log message processing has completed. + + + + + Gets the current state of the communication-oriented object. + + + The value of the of the object. + + + + + Causes a communication object to transition from its current state into the closed state. + + + + + Abstract base class for the WcfLogReceiverXXXWay classes. It can only be + used internally (see internal constructor). It passes off any Channel usage + to the inheriting class. + + Type of the WCF service. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the endpoint configuration. + + + + Initializes a new instance of the class. + + Name of the endpoint configuration. + The remote address. + + + + Initializes a new instance of the class. + + Name of the endpoint configuration. + The remote address. + + + + Initializes a new instance of the class. + + The binding. + The remote address. + + + + Occurs when the log message processing has completed. + + + + + Occurs when Open operation has completed. + + + + + Occurs when Close operation has completed. + + + + + Opens the client asynchronously. + + + + + Opens the client asynchronously. + + User-specific state. + + + + Closes the client asynchronously. + + + + + Closes the client asynchronously. + + User-specific state. + + + + Processes the log messages asynchronously. + + The events to send. + + + + Processes the log messages asynchronously. + + The events to send. + User-specific state. + + + + Begins processing of log messages. + + The events to send. + The callback. + Asynchronous state. + + IAsyncResult value which can be passed to . + + + + + Ends asynchronous processing of log messages. + + The result. + + + + Log Receiver Client using WCF. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the endpoint configuration. + + + + Initializes a new instance of the class. + + Name of the endpoint configuration. + The remote address. + + + + Initializes a new instance of the class. + + Name of the endpoint configuration. + The remote address. + + + + Initializes a new instance of the class. + + The binding. + The remote address. + + + + Begins processing of log messages. + + The events to send. + The callback. + Asynchronous state. + + IAsyncResult value which can be passed to . + + + + + Ends asynchronous processing of log messages. + + The result. + + + + Log Receiver Client using WCF. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the endpoint configuration. + + + + Initializes a new instance of the class. + + Name of the endpoint configuration. + The remote address. + + + + Initializes a new instance of the class. + + Name of the endpoint configuration. + The remote address. + + + + Initializes a new instance of the class. + + The binding. + The remote address. + + + + Begins processing of log messages. + + The events to send. + The callback. + Asynchronous state. + + IAsyncResult value which can be passed to . + + + + + Ends asynchronous processing of log messages. + + The result. + + + + Mapped Diagnostics Context - a thread-local structure that keeps a dictionary + of strings and provides methods to output them in layouts. + + + + + Gets the thread-local dictionary + + Must be true for any subsequent dictionary modification operation + + + + + Sets the current thread MDC item to the specified value. + + Item name. + Item value. + An that can be used to remove the item from the current thread MDC. + + + + Sets the current thread MDC item to the specified value. + + Item name. + Item value. + >An that can be used to remove the item from the current thread MDC. + + + + Sets the current thread MDC item to the specified value. + + Item name. + Item value. + + + + Sets the current thread MDC item to the specified value. + + Item name. + Item value. + + + + Gets the current thread MDC named item, as . + + Item name. + The value of , if defined; otherwise . + If the value isn't a already, this call locks the for reading the needed for converting to . + + + + Gets the current thread MDC named item, as . + + Item name. + The to use when converting a value to a . + The value of , if defined; otherwise . + If is null and the value isn't a already, this call locks the for reading the needed for converting to . + + + + Gets the current thread MDC named item, as . + + Item name. + The value of , if defined; otherwise null. + + + + Returns all item names + + A set of the names of all items in current thread-MDC. + + + + Checks whether the specified item exists in current thread MDC. + + Item name. + A boolean indicating whether the specified exists in current thread MDC. + + + + Removes the specified from current thread MDC. + + Item name. + + + + Clears the content of current thread MDC. + + + + + Async version of Mapped Diagnostics Context - a logical context structure that keeps a dictionary + of strings and provides methods to output them in layouts. Allows for maintaining state across + asynchronous tasks and call contexts. + + + Ideally, these changes should be incorporated as a new version of the MappedDiagnosticsContext class in the original + NLog library so that state can be maintained for multiple threads in asynchronous situations. + + + + + Simulate ImmutableDictionary behavior (which is not yet part of all .NET frameworks). + In future the real ImmutableDictionary could be used here to minimize memory usage and copying time. + + Must be true for any subsequent dictionary modification operation + Prepare dictionary for additional inserts + + + + + Gets the current logical context named item, as . + + Item name. + The value of , if defined; otherwise . + If the value isn't a already, this call locks the for reading the needed for converting to . + + + + Gets the current logical context named item, as . + + Item name. + The to use when converting a value to a string. + The value of , if defined; otherwise . + If is null and the value isn't a already, this call locks the for reading the needed for converting to . + + + + Gets the current logical context named item, as . + + Item name. + The value of , if defined; otherwise null. + + + + Sets the current logical context item to the specified value. + + Item name. + Item value. + >An that can be used to remove the item from the current logical context. + + + + Sets the current logical context item to the specified value. + + Item name. + Item value. + >An that can be used to remove the item from the current logical context. + + + + Sets the current logical context item to the specified value. + + Item name. + Item value. + >An that can be used to remove the item from the current logical context. + + + + Sets the current logical context item to the specified value. + + Item name. + Item value. + + + + Sets the current logical context item to the specified value. + + Item name. + Item value. + + + + Sets the current logical context item to the specified value. + + Item name. + Item value. + + + + Returns all item names + + A collection of the names of all items in current logical context. + + + + Checks whether the specified exists in current logical context. + + Item name. + A boolean indicating whether the specified exists in current logical context. + + + + Removes the specified from current logical context. + + Item name. + + + + Clears the content of current logical context. + + + + + Clears the content of current logical context. + + Free the full slot. + + + + Mapped Diagnostics Context + + This class marked as obsolete before NLog 2.0 and it may be removed in a future release. + + + + Sets the current thread MDC item to the specified value. + + Item name. + Item value. + + + + Gets the current thread MDC named item. + + Item name. + The value of , if defined; otherwise . + If the value isn't a already, this call locks the for reading the needed for converting to . + + + + Gets the current thread MDC named item. + + Item name. + The value of , if defined; otherwise null. + + + + Checks whether the specified item exists in current thread MDC. + + Item name. + A boolean indicating whether the specified item exists in current thread MDC. + + + + Removes the specified item from current thread MDC. + + Item name. + + + + Clears the content of current thread MDC. + + + + + Mark a parameter of a method for message templating + + + + + Specifies which parameter of an annotated method should be treated as message-template-string + + + + + The name of the parameter that should be as treated as message-template-string + + + + + The type of the captured hole + + + + + Not decided + + + + + normal {x} + + + + + Serialize operator {@x} (aka destructure) + + + + + stringification operator {$x} + + + + + A hole that will be replaced with a value + + + + + Constructor + + + + Parameter name sent to structured loggers. + This is everything between "{" and the first of ",:}". + Including surrounding spaces and names that are numbers. + + + Format to render the parameter. + This is everything between ":" and the first unescaped "}" + + + + Type + + + + When the template is positional, this is the parsed name of this parameter. + For named templates, the value of Index is undefined. + + + Alignment to render the parameter, by default 0. + This is the parsed value between "," and the first of ":}" + + + + A fixed value + + + + Number of characters from the original template to copy at the current position. + This can be 0 when the template starts with a hole or when there are multiple consecutive holes. + + + Number of characters to skip in the original template at the current position. + 0 is a special value that mean: 1 escaped char, no hole. It can also happen last when the template ends with a literal. + + + + Combines Literal and Hole + + + + Literal + + + Hole + Uninitialized when = 0. + + + + Description of a single parameter extracted from a MessageTemplate + + + + + Parameter Name extracted from + This is everything between "{" and the first of ",:}". + + + + + Parameter Value extracted from the -array + + + + + Format to render the parameter. + This is everything between ":" and the first unescaped "}" + + + + + Parameter method that should be used to render the parameter + See also + + + + + Returns index for , when + + + + + Constructs a single message template parameter + + Parameter Name + Parameter Value + Parameter Format + + + + Constructs a single message template parameter + + Parameter Name + Parameter Value + Parameter Format + Parameter CaptureType + + + + Parameters extracted from parsing as MessageTemplate + + + + + + + + + + + Gets the parameters at the given index + + + + + Number of parameters + + + + Indicates whether the template should be interpreted as positional + (all holes are numbers) or named. + + + + Indicates whether the template was parsed successful, and there are no unmatched parameters + + + + + Constructor for parsing the message template with parameters + + including any parameter placeholders + All + + + + Constructor for named parameters that already has been parsed + + + + + Create MessageTemplateParameter from + + + + + + + + + + A message template + + + + The original template string. + This is the key passed to structured targets. + + + The list of literal parts, useful for string rendering. + It indicates the number of characters from the original string to print, + then there's a hole with how many chars to skip. + + "Hello {firstName} {lastName}!" + ------------------------------------- + ║P |S ║P|S ║P|S║ + ║6 |11 ║1|10 ║1|0║ + ║Hello |{firstName}║ |{lastName}║!║ + + "{x} * 2 = {2x}" + -------------------- + ║P|S ║P |S ║ + ║0|3 ║7 |4 ║ + ║{x}║ * 2 = |{2x}║ + + The tricky part is escaped braces. They are represented by a skip = 0, + which is interpreted as "move one char forward, no hole". + + "Escaped }} is fun." + ---------------------- + ║P |S║P |S║ + ║9 |0║8 |0║ + ║Escaped }|}║ is fun.|║ + + + + This list of holes. It's used both to fill the string rendering + and to send values along the template to structured targets. + + + Indicates whether the template should be interpreted as positional + (all holes are numbers) or named. + + + + Create a template, which is already parsed + + + + + + + + + Create a template, which is already parsed + + + + + + + + This is for testing only: recreates from the parsed data. + + + + This is for testing only: rebuilds the hole + + Add to this string builder + ref for performance + + + + Parse templates. + + + + + Parse a template. + + Template to be parsed. + When is null. + Template, never null + + + + Gets the current literal/hole in the template + + + + + Clears the enumerator + + + + + Restarts the enumerator of the template + + + + + Moves to the next literal/hole in the template + + Found new element [true/false] + + + + Parse format after hole name/index. Handle the escaped { and } in the format. Don't read the last } + + + + + + Parse templates. + + + + + Parse a template. + + Template to be parsed. + When is null. + Template, never null + + + + Error when parsing a template. + + + + + Current index when the error occurred. + + + + + The template we were parsing + + + + + New exception + + The message to be shown. + Current index when the error occurred. + + + + + Render templates + + + + + Render a template to a string. + + The template. + Culture. + Parameters for the holes. + Do not fallback to StringBuilder.Format for positional templates. + The String Builder destination. + Parameters for the holes. + + + + Render a template to a string. + + The template. + The String Builder destination. + Culture. + Parameters for the holes. + Rendered template, never null. + + + + Convert Render or serialize a value, with optionally backwards-compatible with + + + + Singleton + + + + Serialization of an object, e.g. JSON and append to + + The object to serialize to string. + Parameter Format + Parameter CaptureType + An object that supplies culture-specific formatting information. + Output destination. + Serialize succeeded (true/false) + + + + Format an object to a readable string, or if it's an object, serialize + + The value to convert + + + + + + + + Try serialising a scalar (string, int, NULL) or simple type (IFormattable) + + + + + Serialize Dictionary as JSON like structure, without { and } + + + "FirstOrder"=true, "Previous login"=20-12-2017 14:55:32, "number of tries"=1 + + + formatstring of an item + + + + + + + + + Convert a value to a string with format and append to . + + The value to convert. + Format sting for the value. + Format provider for the value. + Append to this + + + + Nested Diagnostics Context + + This class marked as obsolete on NLog 2.0 and it may be removed in a future release. + + + + Gets the top NDC message but doesn't remove it. + + The top message. . + + + + Gets the top NDC object but doesn't remove it. + + The object from the top of the NDC stack, if defined; otherwise null. + + + + Pushes the specified text on current thread NDC. + + The text to be pushed. + An instance of the object that implements IDisposable that returns the stack to the previous level when IDisposable.Dispose() is called. To be used with C# using() statement. + + + + Pops the top message off the NDC stack. + + The top message which is no longer on the stack. + + + + Pops the top object off the NDC stack. The object is removed from the stack. + + The top object from the NDC stack, if defined; otherwise null. + + + + Clears current thread NDC stack. + + + + + Gets all messages on the stack. + + Array of strings on the stack. + + + + Gets all objects on the NDC stack. The objects are not removed from the stack. + + Array of objects on the stack. + + + + Nested Diagnostics Context - a thread-local structure that keeps a stack + of strings and provides methods to output them in layouts + + + + + Gets the top NDC message but doesn't remove it. + + The top message. . + + + + Gets the top NDC object but doesn't remove it. + + The object at the top of the NDC stack if defined; otherwise null. + + + + Pushes the specified text on current thread NDC. + + The text to be pushed. + An instance of the object that implements IDisposable that returns the stack to the previous level when IDisposable.Dispose() is called. To be used with C# using() statement. + + + + Pushes the specified object on current thread NDC. + + The object to be pushed. + An instance of the object that implements IDisposable that returns the stack to the previous level when IDisposable.Dispose() is called. To be used with C# using() statement. + + + + Pops the top message off the NDC stack. + + The top message which is no longer on the stack. + + + + Pops the top message from the NDC stack. + + The to use when converting the value to a string. + The top message, which is removed from the stack, as a string value. + + + + Pops the top object off the NDC stack. + + The object from the top of the NDC stack, if defined; otherwise null. + + + + Peeks the first object on the NDC stack + + The object from the top of the NDC stack, if defined; otherwise null. + + + + Clears current thread NDC stack. + + + + + Gets all messages on the stack. + + Array of strings on the stack. + + + + Gets all messages from the stack, without removing them. + + The to use when converting a value to a string. + Array of strings. + + + + Gets all objects on the stack. + + Array of objects on the stack. + + + + Resets the stack to the original count during . + + + + + Initializes a new instance of the class. + + The stack. + The previous count. + + + + Reverts the stack to original item count. + + + + + Async version of - a logical context structure that keeps a stack + Allows for maintaining scope across asynchronous tasks and call contexts. + + + + + Pushes the specified value on current stack + + The value to be pushed. + An instance of the object that implements IDisposable that returns the stack to the previous level when IDisposable.Dispose() is called. To be used with C# using() statement. + + + + Pushes the specified value on current stack + + The value to be pushed. + An instance of the object that implements IDisposable that returns the stack to the previous level when IDisposable.Dispose() is called. To be used with C# using() statement. + + + + Pops the top message off the NDLC stack. + + The top message which is no longer on the stack. + this methods returns a object instead of string, this because of backwardscompatibility + + + + Pops the top message from the NDLC stack. + + The to use when converting the value to a string. + The top message, which is removed from the stack, as a string value. + + + + Pops the top message off the current NDLC stack + + The object from the top of the NDLC stack, if defined; otherwise null. + + + + Peeks the top object on the current NDLC stack + + The object from the top of the NDLC stack, if defined; otherwise null. + + + + Peeks the current scope, and returns its start time + + Scope Creation Time + + + + Peeks the first scope, and returns its start time + + Scope Creation Time + + + + Clears current stack. + + + + + Gets all messages on the stack. + + Array of strings on the stack. + + + + Gets all messages from the stack, without removing them. + + The to use when converting a value to a string. + Array of strings. + + + + Gets all objects on the stack. The objects are not removed from the stack. + + Array of objects on the stack. + + + + Exception thrown during NLog configuration. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + Parameters for the message + + + + Initializes a new instance of the class. + + The inner exception. + The message. + Parameters for the message + + + + Initializes a new instance of the class. + + The message. + The inner exception. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + The parameter is null. + + + The class name is null or is zero (0). + + + + + Exception thrown during log event processing. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + Parameters for the message + + + + Initializes a new instance of the class. + + The message. + The inner exception. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + The parameter is null. + + + The class name is null or is zero (0). + + + + + TraceListener which routes all messages through NLog. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the log factory to use when outputting messages (null - use LogManager). + + + + + Gets or sets the default log level. + + + + + Gets or sets the log which should be always used regardless of source level. + + + + + Gets or sets a value indicating whether flush calls from trace sources should be ignored. + + + + + Gets a value indicating whether the trace listener is thread safe. + + + true if the trace listener is thread safe; otherwise, false. The default is false. + + + + Gets or sets a value indicating whether to use auto logger name detected from the stack trace. + + + + + When overridden in a derived class, writes the specified message to the listener you create in the derived class. + + A message to write. + + + + When overridden in a derived class, writes a message to the listener you create in the derived class, followed by a line terminator. + + A message to write. + + + + When overridden in a derived class, closes the output stream so it no longer receives tracing or debugging output. + + + + + Emits an error message. + + A message to emit. + + + + Emits an error message and a detailed error message. + + A message to emit. + A detailed message to emit. + + + + Flushes the output (if is not true) buffer with the default timeout of 15 seconds. + + + + + Writes trace information, a data object and event information to the listener specific output. + + A object that contains the current process ID, thread ID, and stack trace information. + A name used to identify the output, typically the name of the application that generated the trace event. + One of the values specifying the type of event that has caused the trace. + A numeric identifier for the event. + The trace data to emit. + + + + Writes trace information, an array of data objects and event information to the listener specific output. + + A object that contains the current process ID, thread ID, and stack trace information. + A name used to identify the output, typically the name of the application that generated the trace event. + One of the values specifying the type of event that has caused the trace. + A numeric identifier for the event. + An array of objects to emit as data. + + + + Writes trace and event information to the listener specific output. + + A object that contains the current process ID, thread ID, and stack trace information. + A name used to identify the output, typically the name of the application that generated the trace event. + One of the values specifying the type of event that has caused the trace. + A numeric identifier for the event. + + + + Writes trace information, a formatted array of objects and event information to the listener specific output. + + A object that contains the current process ID, thread ID, and stack trace information. + A name used to identify the output, typically the name of the application that generated the trace event. + One of the values specifying the type of event that has caused the trace. + A numeric identifier for the event. + A format string that contains zero or more format items, which correspond to objects in the array. + An object array containing zero or more objects to format. + + + + Writes trace information, a message, and event information to the listener specific output. + + A object that contains the current process ID, thread ID, and stack trace information. + A name used to identify the output, typically the name of the application that generated the trace event. + One of the values specifying the type of event that has caused the trace. + A numeric identifier for the event. + A message to write. + + + + Writes trace information, a message, a related activity identity and event information to the listener specific output. + + A object that contains the current process ID, thread ID, and stack trace information. + A name used to identify the output, typically the name of the application that generated the trace event. + A numeric identifier for the event. + A message to write. + A object identifying a related activity. + + + + Gets the custom attributes supported by the trace listener. + + + A string array naming the custom attributes supported by the trace listener, or null if there are no custom attributes. + + + + + Translates the event type to level from . + + Type of the event. + Translated log level. + + + + Process the log event + The log level. + The name of the logger. + The log message. + The log parameters. + The event id. + The event type. + The related activity id. + + + + + It works as a normal but it discards all messages which an application requests + to be logged. + + It effectively implements the "Null Object" pattern for objects. + + + + + Initializes a new instance of . + + The factory class to be used for the creation of this logger. + + + + Specifies the way archive numbering is performed. + + + + + Sequence style numbering. The most recent archive has the highest number. + + + + + Rolling style numbering (the most recent is always #0 then #1, ..., #N. + + + + + Date style numbering. Archives will be stamped with the prior period + (Year, Month, Day, Hour, Minute) datetime. + + + + + Date and sequence style numbering. + Archives will be stamped with the prior period (Year, Month, Day) datetime. + The most recent archive has the highest number (in combination with the date). + + + + + Abstract Target with async Task support + + + + + How many milliseconds to delay the actual write operation to optimize for batching + + + + + How many seconds a Task is allowed to run before it is cancelled. + + + + + How many attempts to retry the same Task, before it is aborted + + + + + How many milliseconds to wait before next retry (will double with each retry) + + + + + Gets or sets whether to use the locking queue, instead of a lock-free concurrent queue + The locking queue is less concurrent when many logger threads, but reduces memory allocation + + + + + Gets or sets the action to be taken when the lazy writer thread request queue count + exceeds the set limit. + + + + + + Gets or sets the limit on the number of requests in the lazy writer thread request queue. + + + + + + Gets or sets the number of log events that should be processed in a batch + by the lazy writer thread. + + + + + + Task Scheduler used for processing async Tasks + + + + + Constructor + + + + + Initializes the internal queue for pending logevents + + + + + Override this to create the actual logging task + + Example of how to override this method, and call custom async method + + protected override Task WriteAsyncTask(LogEventInfo logEvent, CancellationToken token) + { + return CustomWriteAsync(logEvent, token); + } + + private async Task CustomWriteAsync(LogEventInfo logEvent, CancellationToken token) + { + await MyLogMethodAsync(logEvent, token).ConfigureAwait(false); + } + + + The log event. + The cancellation token + + + + + Override this to create the actual logging task for handling batch of logevents + + A batch of logevents. + The cancellation token + + + + + Handle cleanup after failed write operation + + Exception from previous failed Task + The cancellation token + Number of retries remaining + Time to sleep before retrying + Should attempt retry + + + + Schedules the LogEventInfo for async writing + + The log event. + + + + Write to queue without locking + + + + + + Schedules notification of when all messages has been written + + + + + + Closes Target by updating CancellationToken + + + + + Releases any managed resources + + + + + + Checks the internal queue for the next to create a new task for + + Used for race-condition validation between task-completion and timeout + Signals whether previousTask completed an almost full BatchSize + + + + Generates recursive task-chain to perform retry of writing logevents with increasing retry-delay + + + + + Creates new task to handle the writing of the input + + LogEvents to write + New Task created [true / false] + + + + Handles that scheduled task has completed (successfully or failed), and starts the next pending task + + Task just completed + AsyncContinuation to notify of success or failure + + + + Timer method, that is fired when pending task fails to complete within timeout + + + + + + Sends log messages to the remote instance of Chainsaw application from log4j. + + Documentation on NLog Wiki + +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ This assumes just one target and a single rule. More configuration + options are described here. +

+

+ To set up the log target programmatically use code like this: +

+ +

+ NOTE: If your receiver application is ever likely to be off-line, don't use TCP protocol + or you'll get TCP timeouts and your application will crawl. + Either switch to UDP transport or use AsyncWrapper target + so that your application threads will not be blocked by the timing-out connection attempts. +

+
+
+ + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a name. + + Name of the target. + + + + Color formatting for using ANSI Color Codes + + + + + Not using bold to get light colors, as it has to be cleared + + + + + Not using bold to get light colors, as it has to be cleared (And because it only works for text, and not background) + + + + + Resets both foreground and background color. + + + + + ANSI have 8 color-codes (30-37) by default. The "bright" (or "intense") color-codes (90-97) are extended values not supported by all terminals + + + + + Color formatting for using + and + + + + + Writes log messages to the console with customizable coloring. + + Documentation on NLog Wiki + + + + Should logging being paused/stopped because of the race condition bug in Console.Writeline? + + + Console.Out.Writeline / Console.Error.Writeline could throw 'IndexOutOfRangeException', which is a bug. + See https://stackoverflow.com/questions/33915790/console-out-and-console-error-race-condition-error-in-a-windows-service-written + and https://connect.microsoft.com/VisualStudio/feedback/details/2057284/console-out-probable-i-o-race-condition-issue-in-multi-threaded-windows-service + + Full error: + Error during session close: System.IndexOutOfRangeException: Probable I/ O race condition detected while copying memory. + The I/ O package is not thread safe by default.In multithreaded applications, + a stream must be accessed in a thread-safe way, such as a thread - safe wrapper returned by TextReader's or + TextWriter's Synchronized methods.This also applies to classes like StreamWriter and StreamReader. + + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + Name of the target. + + + + Gets or sets a value indicating whether the error stream (stderr) should be used instead of the output stream (stdout). + + + + + + Gets or sets a value indicating whether to use default row highlighting rules. + + + The default rules are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ConditionForeground ColorBackground Color
level == LogLevel.FatalRedNoChange
level == LogLevel.ErrorYellowNoChange
level == LogLevel.WarnMagentaNoChange
level == LogLevel.InfoWhiteNoChange
level == LogLevel.DebugGrayNoChange
level == LogLevel.TraceDarkGrayNoChange
+
+ +
+ + + The encoding for writing messages to the . + + Has side effect + + + + + Gets or sets a value indicating whether to auto-check if the console is available. + - Disables console writing if Environment.UserInteractive = False (Windows Service) + - Disables console writing if Console Standard Input is not available (Non-Console-App) + + + + + + Gets or sets a value indicating whether to auto-check if the console has been redirected to file + - Disables coloring logic when System.Console.IsOutputRedirected = true + + + + + + Gets or sets a value indicating whether to auto-flush after + + + Normally not required as standard Console.Out will have = true, but not when pipe to file + + + + + Enables output using ANSI Color Codes + + + + + + Gets the row highlighting rules. + + + + + + Gets the word highlighting rules. + + + + + + Initializes the target. + + + + + Closes the target and releases any unmanaged resources. + + + + + + + + Writes the specified log event to the console highlighting entries + and words based on a set of defined rules. + + Log event. + + + + Colored console output color. + + + Note that this enumeration is defined to be binary compatible with + .NET 2.0 System.ConsoleColor + some additions + + + + + Black Color (#000000). + + + + + Dark blue Color (#000080). + + + + + Dark green Color (#008000). + + + + + Dark Cyan Color (#008080). + + + + + Dark Red Color (#800000). + + + + + Dark Magenta Color (#800080). + + + + + Dark Yellow Color (#808000). + + + + + Gray Color (#C0C0C0). + + + + + Dark Gray Color (#808080). + + + + + Blue Color (#0000FF). + + + + + Green Color (#00FF00). + + + + + Cyan Color (#00FFFF). + + + + + Red Color (#FF0000). + + + + + Magenta Color (#FF00FF). + + + + + Yellow Color (#FFFF00). + + + + + White Color (#FFFFFF). + + + + + Don't change the color. + + + + + The row-highlighting condition. + + + + + Initializes static members of the ConsoleRowHighlightingRule class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The condition. + Color of the foreground. + Color of the background. + + + + Gets the default highlighting rule. Doesn't change the color. + + + + + Gets or sets the condition that must be met in order to set the specified foreground and background color. + + + + + + Gets or sets the foreground color. + + + + + + Gets or sets the background color. + + + + + + Checks whether the specified log event matches the condition (if any). + + + Log event. + + + A value of if the condition is not defined or + if it matches, otherwise. + + + + + Writes log messages to the console. + + Documentation on NLog Wiki + +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ This assumes just one target and a single rule. More configuration + options are described here. +

+

+ To set up the log target programmatically use code like this: +

+ +
+
+ + + Should logging being paused/stopped because of the race condition bug in Console.Writeline? + + + Console.Out.Writeline / Console.Error.Writeline could throw 'IndexOutOfRangeException', which is a bug. + See https://stackoverflow.com/questions/33915790/console-out-and-console-error-race-condition-error-in-a-windows-service-written + and https://connect.microsoft.com/VisualStudio/feedback/details/2057284/console-out-probable-i-o-race-condition-issue-in-multi-threaded-windows-service + + Full error: + Error during session close: System.IndexOutOfRangeException: Probable I/ O race condition detected while copying memory. + The I/ O package is not thread safe by default.In multithreaded applications, + a stream must be accessed in a thread-safe way, such as a thread - safe wrapper returned by TextReader's or + TextWriter's Synchronized methods.This also applies to classes like StreamWriter and StreamReader. + + + + + + Gets or sets a value indicating whether to send the log messages to the standard error instead of the standard output. + + + + + + The encoding for writing messages to the . + + Has side effect + + + + + Gets or sets a value indicating whether to auto-check if the console is available + - Disables console writing if Environment.UserInteractive = False (Windows Service) + - Disables console writing if Console Standard Input is not available (Non-Console-App) + + + + + + Gets or sets a value indicating whether to auto-flush after + + + Normally not required as standard Console.Out will have = true, but not when pipe to file + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + Name of the target. + + + + Initializes the target. + + + + + Closes the target and releases any unmanaged resources. + + + + + + + + Writes the specified logging event to the Console.Out or + Console.Error depending on the value of the Error flag. + + The logging event. + + Note that the Error option is not supported on .NET Compact Framework. + + + + + Write to output + + text to be written. + + + + Highlighting rule for Win32 colorful console. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The text to be matched.. + Color of the foreground. + Color of the background. + + + + Gets or sets the regular expression to be matched. You must specify either text or regex. + + + + + + Compile the ? This can improve the performance, but at the costs of more memory usage. If false, the Regex Cache is used. + + + + + + Gets or sets the text to be matched. You must specify either text or regex. + + + + + + Gets or sets a value indicating whether to match whole words only. + + + + + + Gets or sets a value indicating whether to ignore case when comparing texts. + + + + + + Gets or sets the foreground color. + + + + + + Gets or sets the background color. + + + + + + Gets the compiled regular expression that matches either Text or Regex property. Only used when is true. + + Access this property will compile the Regex. + + + + Get regex options. + + Default option to start with. + + + + + Get Expression for a . + + + + + + Information about database command + parameters. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the type of the command. + + The type of the command. + + + + + Gets or sets the connection string to run the command against. If not provided, connection string from the target is used. + + + + + + Gets or sets the command text. + + + + + + Gets or sets a value indicating whether to ignore failures. + + + + + + Gets the collection of parameters. Each parameter contains a mapping + between NLog layout and a database named or positional parameter. + + + + + + Represents a parameter to a Database target. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the parameter. + The parameter layout. + + + + Gets or sets the database parameter name. + + + + + + Gets or sets the layout that should be use to calculate the value for the parameter. + + + + + + Gets or sets the database parameter DbType. + + + + + + Gets or sets the database parameter size. + + + + + + Gets or sets the database parameter precision. + + + + + + Gets or sets the database parameter scale. + + + + + + Gets or sets the type of the parameter. + + + + + + Gets or sets convert format of the database parameter value . + + + + + + Gets or sets the culture used for parsing parameter string-value for type-conversion + + + + + + Writes log messages to the database using an ADO.NET provider. + + + - NETSTANDARD cannot load connectionstrings from .config + + Documentation on NLog Wiki + + + The configuration is dependent on the database type, because + there are differnet methods of specifying connection string, SQL + command and command parameters. + + MS SQL Server using System.Data.SqlClient: + + Oracle using System.Data.OracleClient: + + Oracle using System.Data.OleDBClient: + + To set up the log target programmatically use code like this (an equivalent of MSSQL configuration): + + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target. + + + + Gets or sets the name of the database provider. + + + + The parameter name should be a provider invariant name as registered in machine.config or app.config. Common values are: + +
    +
  • System.Data.SqlClient - SQL Sever Client
  • +
  • System.Data.SqlServerCe.3.5 - SQL Sever Compact 3.5
  • +
  • System.Data.OracleClient - Oracle Client from Microsoft (deprecated in .NET Framework 4)
  • +
  • Oracle.DataAccess.Client - ODP.NET provider from Oracle
  • +
  • System.Data.SQLite - System.Data.SQLite driver for SQLite
  • +
  • Npgsql - Npgsql driver for PostgreSQL
  • +
  • MySql.Data.MySqlClient - MySQL Connector/Net
  • +
+ (Note that provider invariant names are not supported on .NET Compact Framework). + + Alternatively the parameter value can be be a fully qualified name of the provider + connection type (class implementing ) or one of the following tokens: + +
    +
  • sqlserver, mssql, microsoft or msde - SQL Server Data Provider
  • +
  • oledb - OLEDB Data Provider
  • +
  • odbc - ODBC Data Provider
  • +
+
+ +
+ + + Gets or sets the name of the connection string (as specified in <connectionStrings> configuration section. + + + + + + Gets or sets the connection string. When provided, it overrides the values + specified in DBHost, DBUserName, DBPassword, DBDatabase. + + + + + + Gets or sets the connection string using for installation and uninstallation. If not provided, regular ConnectionString is being used. + + + + + + Gets the installation DDL commands. + + + + + + Gets the uninstallation DDL commands. + + + + + + Gets or sets a value indicating whether to keep the + database connection open between the log events. + + + + + + Obsolete - value will be ignored! The logging code always runs outside of transaction. + + Gets or sets a value indicating whether to use database transactions. + Some data providers require this. + + + + This option was removed in NLog 4.0 because the logging code always runs outside of transaction. + This ensures that the log gets written to the database if you rollback the main transaction because of an error and want to log the error. + + + + + Gets or sets the database host name. If the ConnectionString is not provided + this value will be used to construct the "Server=" part of the + connection string. + + + + + + Gets or sets the database user name. If the ConnectionString is not provided + this value will be used to construct the "User ID=" part of the + connection string. + + + + + + Gets or sets the database password. If the ConnectionString is not provided + this value will be used to construct the "Password=" part of the + connection string. + + + + + + Gets or sets the database name. If the ConnectionString is not provided + this value will be used to construct the "Database=" part of the + connection string. + + + + + + Gets or sets the text of the SQL command to be run on each log level. + + + Typically this is a SQL INSERT statement or a stored procedure call. + It should use the database-specific parameters (marked as @parameter + for SQL server or :parameter for Oracle, other data providers + have their own notation) and not the layout renderers, + because the latter is prone to SQL injection attacks. + The layout renderers should be specified as <parameter /> elements instead. + + + + + + Gets or sets the type of the SQL command to be run on each log level. + + + This specifies how the command text is interpreted, as "Text" (default) or as "StoredProcedure". + When using the value StoredProcedure, the commandText-property would + normally be the name of the stored procedure. TableDirect method is not supported in this context. + + + + + + Gets the collection of parameters. Each parameter contains a mapping + between NLog layout and a database named or positional parameter. + + + + + + Performs installation which requires administrative permissions. + + The installation context. + + + + Performs uninstallation which requires administrative permissions. + + The installation context. + + + + Determines whether the item is installed. + + The installation context. + + Value indicating whether the item is installed or null if it is not possible to determine. + + + + + Initializes the target. Can be used by inheriting classes + to initialize logging. + + + + + Set the to use it for opening connections to the database. + + + + + Closes the target and releases any unmanaged resources. + + + + + Writes the specified logging event to the database. It creates + a new database command, prepares parameters for it by calculating + layouts and executes the command. + + The logging event. + + + + NOTE! Obsolete, instead override Write(IList{AsyncLogEventInfo} logEvents) + + Writes an array of logging events to the log target. By default it iterates on all + events and passes them to "Write" method. Inheriting classes can use this method to + optimize batch writes. + + Logging events to be written out. + + + + Writes an array of logging events to the log target. By default it iterates on all + events and passes them to "Write" method. Inheriting classes can use this method to + optimize batch writes. + + Logging events to be written out. + + + + Write logEvent to database + + + + + Build the connectionstring from the properties. + + + Using at first, and falls back to the properties , + , and + + Event to render the layout inside the properties. + + + + + Create database parameter + + Current command. + Parameter configuration info. + + + + Extract parameter value from the logevent + + Current logevent. + Parameter configuration info. + + + + Create Default Value of Type + + + + + + + A descriptor for an archive created with the DateAndSequence numbering mode. + + + + + The full name of the archive file. + + + + + The parsed date contained in the file name. + + + + + The parsed sequence number contained in the file name. + + + + + Determines whether produces the same string as the current instance's date once formatted with the current instance's date format. + + The date to compare the current object's date to. + True if the formatted dates are equal, otherwise False. + + + + Initializes a new instance of the class. + + + + + Writes log messages to the attached managed debugger. + + +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ This assumes just one target and a single rule. More configuration + options are described here. +

+

+ To set up the log target programmatically use code like this: +

+ +
+
+ + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + Name of the target. + + + + Initializes the target. + + + + + Closes the target and releases any unmanaged resources. + + + + + Writes the specified logging event to the attached debugger. + + The logging event. + + + + Mock target - useful for testing. + + Documentation on NLog Wiki + +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ This assumes just one target and a single rule. More configuration + options are described here. +

+

+ To set up the log target programmatically use code like this: +

+ +
+
+ + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + Name of the target. + + + + Gets the number of times this target has been called. + + + + + + Gets the last message rendered by this target. + + + + + + Increases the number of messages. + + The logging event. + + + + Default class for serialization of values to JSON format. + + + + + Singleton instance of the serializer. + + + + + Private. Use + + + + + Returns a serialization of an object into JSON format. + + The object to serialize to JSON. + Serialized value. + + + + Returns a serialization of an object into JSON format. + + The object to serialize to JSON. + serialisation options + Serialized value. + + + + Serialization of the object in JSON format to the destination StringBuilder + + The object to serialize to JSON. + Write the resulting JSON to this destination. + Object serialized successfully (true/false). + + + + Serialization of the object in JSON format to the destination StringBuilder + + The object to serialize to JSON. + Write the resulting JSON to this destination. + serialisation options + Object serialized successfully (true/false). + + + + Serialization of the object in JSON format to the destination StringBuilder + + The object to serialize to JSON. + Write the resulting JSON to this destination. + serialisation options + The objects in path (Avoid cyclic reference loop). + The current depth (level) of recursion. + Object serialized successfully (true/false). + + + + No quotes needed for this type? + + + + + Checks the object if it is numeric + + TypeCode for the object + Accept fractional types as numeric type. + + + + + Checks input string if it needs JSON escaping, and makes necessary conversion + + Destination Builder + Input string + Should non-ascii characters be encoded + JSON escaped string + + + + Writes log message to the Event Log. + + Documentation on NLog Wiki + +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ This assumes just one target and a single rule. More configuration + options are described here. +

+

+ To set up the log target programmatically use code like this: +

+ +
+
+ + + Max size in characters (limitation of the EventLog API). + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target. + + + + Initializes a new instance of the class. + + . to be used as Source. + + + + Initializes a new instance of the class. + + + + + Gets or sets the name of the machine on which Event Log service is running. + + + + + + Gets or sets the layout that renders event ID. + + + + + + Gets or sets the layout that renders event Category. + + + + + + Optional entrytype. When not set, or when not convertible to then determined by + + + + + + Gets or sets the value to be used as the event Source. + + + By default this is the friendly name of the current AppDomain. + + + + + + Gets or sets the name of the Event Log to write to. This can be System, Application or any user-defined name. + + + + + + Gets or sets the message length limit to write to the Event Log. + + MaxMessageLength cannot be zero or negative + + + + + Gets or sets the maximum Event log size in kilobytes. + + + MaxKilobytes cannot be less than 64 or greater than 4194240 or not a multiple of 64. + If null, the value will not be specified while creating the Event log. + + + + + + Gets or sets the action to take if the message is larger than the option. + + + + + + Performs installation which requires administrative permissions. + + The installation context. + + + + Performs uninstallation which requires administrative permissions. + + The installation context. + + + + Determines whether the item is installed. + + The installation context. + + Value indicating whether the item is installed or null if it is not possible to determine. + + + + + Initializes the target. + + + + + Writes the specified logging event to the event log. + + The logging event. + + + + Get the entry type for logging the message. + + The logging event - for rendering the + + + + Get the source, if and only if the source is fixed. + + null when not + Internal for unit tests + + + + Gets the to write to. + + Event if the source needs to be rendered. + + + + (re-)create an event source, if it isn't there. Works only with fixed source names. + + The source name. If source is not fixed (see , then pass null or . + always throw an Exception when there is an error + + + + A wrapper for Windows event log. + + + + + A wrapper for the property . + + + + + A wrapper for the property . + + + + + A wrapper for the property . + + + + + A wrapper for the property . + + + + + Indicates whether an event log instance is associated. + + + + + A wrapper for the method . + + + + + Creates a new association with an instance of the event log. + + + + + A wrapper for the static method . + + + + + A wrapper for the static method . + + + + + A wrapper for the static method . + + + + + A wrapper for the static method . + + + + + The implementation of , that uses Windows . + + + + + + + + + + + + + + + + + + + + + + + + Creates a new association with an instance of Windows . + + + + + + + + + + + + + + + + + Action that should be taken if the message is greater than + the max message size allowed by the Event Log. + + + + + Truncate the message before writing to the Event Log. + + + + + Split the message and write multiple entries to the Event Log. + + + + + Discard of the message. It will not be written to the Event Log. + + + + + Check if cleanup should be performed on initialize new file + + Skip cleanup when initializing new file, just after having performed archive operation + + Base archive file pattern + Maximum number of archive files that should be kept + True, when archive cleanup is needed + + + + Characters determining the start of the . + + + + + Characters determining the end of the . + + + + + File name which is used as template for matching and replacements. + It is expected to contain a pattern to match. + + + + + The begging position of the + within the . -1 is returned + when no pattern can be found. + + + + + The ending position of the + within the . -1 is returned + when no pattern can be found. + + + + + Replace the pattern with the specified String. + + + + + + + Archives the log-files using a date style numbering. Archives will be stamped with the + prior period (Year, Month, Day, Hour, Minute) datetime. When the number of archive files exceed the obsolete archives are deleted. + + + + + + Archives the log-files using a date and sequence style numbering. Archives will be stamped + with the prior period (Year, Month, Day) datetime. The most recent archive has the highest number (in + combination with the date). + + + When the number of archive files exceed the obsolete archives are deleted. + + + + + + Parse filename with date and sequence pattern + + + dateformat for archive + + the found pattern. When failed, then default + the found pattern. When failed, then default + + + + + Archives the log-files using the provided base-archive-filename. If the base-archive-filename causes + duplicate archive filenames, then sequence-style is automatically enforced. + + Example: + Base Filename trace.log + Next Filename trace.0.log + + The most recent archive has the highest number. When the number of archive files + exceed the obsolete archives are deleted. + + + + + Dynamically converts a non-template archiveFilePath into a correct archiveFilePattern. + Before called the original IFileArchiveMode, that has been wrapped by this + + + + + Determines if the file name as contains a numeric pattern i.e. {#} in it. + + Example: + trace{#}.log Contains the numeric pattern. + trace{###}.log Contains the numeric pattern. + trace{#X#}.log Contains the numeric pattern (See remarks). + trace.log Does not contain the pattern. + + Occasionally, this method can identify the existence of the {#} pattern incorrectly. + File name to be checked. + when the pattern is found; otherwise. + + + + Determine if old archive files should be deleted. + + Maximum number of archive files that should be kept + when old archives should be deleted; otherwise. + + + + Archives the log-files using a rolling style numbering (the most recent is always #0 then + #1, ..., #N. When the number of archive files exceed the obsolete archives + are deleted. + + + + + Replaces the numeric pattern i.e. {#} in a file name with the parameter value. + + File name which contains the numeric pattern. + Value which will replace the numeric pattern. + File name with the value of in the position of the numeric pattern. + + + + Archives the log-files using a sequence style numbering. The most recent archive has the + highest number. When the number of archive files exceed the obsolete + archives are deleted. + + + + + Modes of archiving files based on time. + + + + + Don't archive based on time. + + + + + AddToArchive every year. + + + + + AddToArchive every month. + + + + + AddToArchive daily. + + + + + AddToArchive every hour. + + + + + AddToArchive every minute. + + + + + AddToArchive every Sunday. + + + + + AddToArchive every Monday. + + + + + AddToArchive every Tuesday. + + + + + AddToArchive every Wednesday. + + + + + AddToArchive every Thursday. + + + + + AddToArchive every Friday. + + + + + AddToArchive every Saturday. + + + + + Type of filepath + + + + + Detect of relative or absolute + + + + + Relative path + + + + + Absolute path + + Best for performance + + + + Writes log messages to one or more files. + + Documentation on NLog Wiki + + + + Default clean up period of the initialized files. When a file exceeds the clean up period is removed from the list. + + Clean up period is defined in days. + + + + The maximum number of initialized files before clean up procedures are initiated, + to keep the number of initialized files to a minimum. Chose 25 to cater for monthly rolling of log-files. + + + + + This value disables file archiving based on the size. + + + + + Holds the initialised files each given time by the instance. Against each file, the last write time is stored. + + Last write time is store in local time (no UTC). + + + + List of the associated file appenders with the instance. + + + + + The number of initialized files at any one time. + + + + + The maximum number of archive files that should be kept. + + + + + The filename as target + + + + + The archive file name as target + + + + + The date of the previous log event. + + + + + The file name of the previous log event. + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + Name of the target. + + + + Gets or sets the name of the file to write to. + + + This FileName string is a layout which may include instances of layout renderers. + This lets you use a single target to write to multiple files. + + + The following value makes NLog write logging events to files based on the log level in the directory where + the application runs. + ${basedir}/${level}.log + All Debug messages will go to Debug.log, all Info messages will go to Info.log and so on. + You can combine as many of the layout renderers as you want to produce an arbitrary log file name. + + + + + + Cleanup invalid values in a filename, e.g. slashes in a filename. If set to true, this can impact the performance of massive writes. + If set to false, nothing gets written when the filename is wrong. + + + + + + Is the an absolute or relative path? + + + + + + Gets or sets a value indicating whether to create directories if they do not exist. + + + Setting this to false may improve performance a bit, but you'll receive an error + when attempting to write to a directory that's not present. + + + + + + Gets or sets a value indicating whether to delete old log file on startup. + + + This option works only when the "FileName" parameter denotes a single file. + + + + + + Gets or sets a value indicating whether to replace file contents on each write instead of appending log message at the end. + + + + + + Gets or sets a value indicating whether to keep log file open instead of opening and closing it on each logging event. + + + Setting this property to True helps improve performance. + + + + + + Gets or sets the maximum number of log filenames that should be stored as existing. + + + The bigger this number is the longer it will take to write each log record. The smaller the number is + the higher the chance that the clean function will be run when no new files have been opened. + + + + + Gets or sets a value indicating whether to enable log file(s) to be deleted. + + + + + + Gets or sets the file attributes (Windows only). + + + + + + Gets or sets the line ending mode. + + + + + + Gets or sets a value indicating whether to automatically flush the file buffers after each log message. + + + + + + Gets or sets the number of files to be kept open. Setting this to a higher value may improve performance + in a situation where a single File target is writing to many files + (such as splitting by level or by logger). + + + The files are managed on a LRU (least recently used) basis, which flushes + the files that have not been used for the longest period of time should the + cache become full. As a rule of thumb, you shouldn't set this parameter to + a very high value. A number like 10-15 shouldn't be exceeded, because you'd + be keeping a large number of files open which consumes system resources. + + + + + + Gets or sets the maximum number of seconds that files are kept open. If this number is negative the files are + not automatically closed after a period of inactivity. + + + + + + Gets or sets the maximum number of seconds before open files are flushed. If this number is negative or zero + the files are not flushed by timer. + + + + + + Gets or sets the log file buffer size in bytes. + + + + + + Gets or sets the file encoding. + + + + + + Gets or sets whether or not this target should just discard all data that its asked to write. + Mostly used for when testing NLog Stack except final write + + + + + + Gets or sets a value indicating whether concurrent writes to the log file by multiple processes on the same host. + + + This makes multi-process logging possible. NLog uses a special technique + that lets it keep the files open for writing. + + + + + + Gets or sets a value indicating whether concurrent writes to the log file by multiple processes on different network hosts. + + + This effectively prevents files from being kept open. + + + + + + Gets or sets a value indicating whether to write BOM (byte order mark) in created files + + + + + + Gets or sets the number of times the write is appended on the file before NLog + discards the log message. + + + + + + Gets or sets the delay in milliseconds to wait before attempting to write to the file again. + + + The actual delay is a random value between 0 and the value specified + in this parameter. On each failed attempt the delay base is doubled + up to times. + + + Assuming that ConcurrentWriteAttemptDelay is 10 the time to wait will be:

+ a random value between 0 and 10 milliseconds - 1st attempt
+ a random value between 0 and 20 milliseconds - 2nd attempt
+ a random value between 0 and 40 milliseconds - 3rd attempt
+ a random value between 0 and 80 milliseconds - 4th attempt
+ ...

+ and so on. + + + + +

+ Gets or sets a value indicating whether to archive old log file on startup. + + + This option works only when the "FileName" parameter denotes a single file. + After archiving the old file, the current log file will be empty. + + +
+ + + Gets or sets a value specifying the date format to use when archiving files. + + + This option works only when the "ArchiveNumbering" parameter is set either to Date or DateAndSequence. + + + + + + Gets or sets the size in bytes above which log files will be automatically archived. + + Warning: combining this with isn't supported. We cannot create multiple archive files, if they should have the same name. + Choose: + + + Caution: Enabling this option can considerably slow down your file + logging in multi-process scenarios. If only one process is going to + be writing to the file, consider setting ConcurrentWrites + to false for maximum performance. + + + + + + Gets or sets a value indicating whether to automatically archive log files every time the specified time passes. + + + Files are moved to the archive as part of the write operation if the current period of time changes. For example + if the current hour changes from 10 to 11, the first write that will occur + on or after 11:00 will trigger the archiving. +

+ Caution: Enabling this option can considerably slow down your file + logging in multi-process scenarios. If only one process is going to + be writing to the file, consider setting ConcurrentWrites + to false for maximum performance. +

+
+ +
+ + + Is the an absolute or relative path? + + + + + + Gets or sets the name of the file to be used for an archive. + + + It may contain a special placeholder {#####} + that will be replaced with a sequence of numbers depending on + the archiving strategy. The number of hash characters used determines + the number of numerical digits to be used for numbering files. + + + + + + Gets or sets the maximum number of archive files that should be kept. + + + + + + Gets or sets the way file archives are numbered. + + + + + + Used to compress log files during archiving. + This may be used to provide your own implementation of a zip file compressor, + on platforms other than .Net4.5. + Defaults to ZipArchiveFileCompressor on .Net4.5 and to null otherwise. + + + + + + Gets or sets a value indicating whether to compress archive files into the zip archive format. + + + + + + Gets or set a value indicating whether a managed file stream is forced, instead of using the native implementation. + + + + + + Gets or sets a value indicating whether file creation calls should be synchronized by a system global mutex. + + + + + + Gets or sets a value indicating whether the footer should be written only when the file is archived. + + + + + + Gets the characters that are appended after each line. + + + + + Refresh the ArchiveFilePatternToWatch option of the . + The log file must be watched for archiving when multiple processes are writing to the same + open file. + + + + + Removes records of initialized files that have not been + accessed in the last two days. + + + Files are marked 'initialized' for the purpose of writing footers when the logging finishes. + + + + + Removes records of initialized files that have not been + accessed after the specified date. + + The cleanup threshold. + + Files are marked 'initialized' for the purpose of writing footers when the logging finishes. + + + + + Flushes all pending file operations. + + The asynchronous continuation. + + The timeout parameter is ignored, because file APIs don't provide + the needed functionality. + + + + + Returns the suitable appender factory ( ) to be used to generate the file + appenders associated with the instance. + + The type of the file appender factory returned depends on the values of various properties. + + suitable for this instance. + + + + Initializes file logging by creating data structures that + enable efficient multi-file logging. + + + + + Closes the file(s) opened for writing. + + + + + Can be used if has been enabled. + + + + + Can be used if has been enabled. + + + + + Can be used if has been enabled. + + + + + Writes the specified logging event to a file specified in the FileName + parameter. + + The logging event. + + + + Get full filename (=absolute) and cleaned if needed. + + + + + + + NOTE! Obsolete, instead override Write(IList{AsyncLogEventInfo} logEvents) + + Writes an array of logging events to the log target. By default it iterates on all + events and passes them to "Write" method. Inheriting classes can use this method to + optimize batch writes. + + Logging events to be written out. + + + + Writes the specified array of logging events to a file specified in the FileName + parameter. + + An array of objects. + + This function makes use of the fact that the events are batched by sorting + the requests by filename. This optimizes the number of open/close calls + and can help improve performance. + + + + + Returns estimated size for memory stream, based on events count and first event size in bytes. + + Count of events + Bytes count of first event + + + + Formats the log event for write. + + The log event to be formatted. + A string representation of the log event. + + + + Gets the bytes to be written to the file. + + Log event. + Array of bytes that are ready to be written. + + + + Modifies the specified byte array before it gets sent to a file. + + The byte array. + The modified byte array. The function can do the modification in-place. + + + + Gets the bytes to be written to the file. + + The log event to be formatted. + to help format log event. + Optional temporary char-array to help format log event. + Destination for the encoded result. + + + + Formats the log event for write. + + The log event to be formatted. + for the result. + + + + Modifies the specified byte array before it gets sent to a file. + + The LogEvent being written + The byte array. + + + + Archives fileName to archiveFileName. + + File name to be archived. + Name of the archive file. + + + + Gets the correct formatting to be used based on the value of for converting values which will be inserting into file + names during archiving. + + This value will be computed only when a empty value or is passed into + + Date format to used irrespectively of value. + Formatting for dates. + + + + Calculate the DateTime of the requested day of the week. + + The DateTime of the previous log event. + The next occuring day of the week to return a DateTime for. + The DateTime of the next occuring dayOfWeek. + For example: if previousLogEventTimestamp is Thursday 2017-03-02 and dayOfWeek is Sunday, this will return + Sunday 2017-03-05. If dayOfWeek is Thursday, this will return *next* Thursday 2017-03-09. + + + + Invokes the archiving process after determining when and which type of archiving is required. + + File name to be checked and archived. + Log event that the instance is currently processing. + The DateTime of the previous log event for this file. + File has just been opened. + + + + Gets the pattern that archive files will match + + Filename of the log file + Log event that the instance is currently processing. + A string with a pattern that will match the archive filenames + + + + Archives the file if it should be archived. + + The file name to check for. + Log event that the instance is currently processing. + The size in bytes of the next chunk of data to be written in the file. + The DateTime of the previous log event for this file. + File has just been opened. + True when archive operation of the file was completed (by this target or a concurrent target) + + + + Indicates if the automatic archiving process should be executed. + + File name to be written. + Log event that the instance is currently processing. + The size in bytes of the next chunk of data to be written in the file. + The DateTime of the previous log event for this file. + Filename to archive. If null, then nothing to archive. + + + + Returns the correct filename to archive + + + + + + Gets the file name for archiving, or null if archiving should not occur based on file size. + + File name to be written. + The size in bytes of the next chunk of data to be written in the file. + Filename to archive. If null, then nothing to archive. + + + + Returns the file name for archiving, or null if archiving should not occur based on date/time. + + File name to be written. + Log event that the instance is currently processing. + The DateTime of the previous log event for this file. + Filename to archive. If null, then nothing to archive. + + + + Truncates the input-time, so comparison of low resolution times (like dates) are not affected by ticks + + High resolution Time + Time Resolution Level + Truncated Low Resolution Time + + + + Evaluates which parts of a file should be written (header, content, footer) based on various properties of + instance and writes them. + + File name to be written. + Raw sequence of to be written into the content part of the file. + File has just been opened. + + + + Initialise a file to be used by the instance. Based on the number of initialized + files and the values of various instance properties clean up and/or archiving processes can be invoked. + + File name to be written. + Log event that the instance is currently processing. + The DateTime of the previous log event for this file (DateTime.MinValue if just initialized). + + + + Writes the file footer and finalizes the file in instance internal structures. + + File name to close. + Indicates if the file is being finalized for archiving. + + + + Writes the footer information to a file. + + The file path to write to. + + + + Invokes the archiving and clean up of older archive file based on the values of + and + properties respectively. + + File name to be written. + Log event that the instance is currently processing. + + + + Creates the file specified in and writes the file content in each entirety i.e. + Header, Content and Footer. + + The name of the file to be written. + Sequence of to be written in the content section of the file. + First attempt to write? + This method is used when the content of the log file is re-written on every write. + + + + Writes the header information and byte order mark to a file. + + File appender associated with the file. + + + + The sequence of to be written in a file after applying any formating and any + transformations required from the . + + The layout used to render output message. + Sequence of to be written. + Usually it is used to render the header and hooter of the files. + + + + Controls the text and color formatting for + + + + + Creates a TextWriter for the console to start building a colored text message + + Active console stream + Optional StringBuilder to optimize performance + TextWriter for the console + + + + Releases the TextWriter for the console after having built a colored text message (Restores console colors) + + Colored TextWriter + Active console stream + Original foreground color for console (If changed) + Original background color for console (If changed) + + + + Changes foreground color for the Colored TextWriter + + Colored TextWriter + New foreground color for the console + Old foreground color for the console + + + + Changes backgroundColor color for the Colored TextWriter + + Colored TextWriter + New backgroundColor color for the console + Old backgroundColor color for the console + + + + Restores console colors back to their original state + + Colored TextWriter + Original foregroundColor color for the console + Original backgroundColor color for the console + + + + Writes multiple characters to console in one operation (faster) + + Colored TextWriter + Output Text + Start Index + End Index + + + + Writes single character to console + + Colored TextWriter + Output Text + + + + Writes whole string and completes with newline + + Colored TextWriter + Output Text + + + + Default row highlight rules for the console printer + + + + + Check if cleanup should be performed on initialize new file + + Base archive file pattern + Maximum number of archive files that should be kept + True, when archive cleanup is needed + + + + Create a wildcard file-mask that allows one to find all files belonging to the same archive. + + Base archive file pattern + Wildcard file-mask + + + + Search directory for all existing files that are part of the same archive. + + Base archive file pattern + + + + + Generate the next archive filename for the archive. + + Base archive file pattern + File date of archive + Existing files in the same archive + + + + + Return all files that should be removed from the provided archive. + + Base archive file pattern + Existing files in the same archive + Maximum number of archive files that should be kept + + + + + may be configured to compress archived files in a custom way + by setting before logging your first event. + + + + + Create archiveFileName by compressing fileName. + + Absolute path to the log file to compress. + Absolute path to the compressed archive file to create. + + + + Interface for serialization of values, maybe even objects to JSON format. + Useful for wrappers for existing serializers. + + + + + Returns a serialization of an object + into JSON format. + + The object to serialize to JSON. + Serialized value (null = Serialize failed). + + + + Options for JSON serialisation + + + + + Add quotes around object keys? + + + + + Formatprovider for value + + + + + Format string for value + + + + + Should non-ascii characters be encoded + + + + + Serialize enum as string value + + + + + Should dictionary keys be sanitized. All characters must either be letters, numbers or underscore character (_). + + Any other characters will be converted to underscore character (_) + + + + + How far down the rabbit hole should the Json Serializer go with object-reflection before stopping + + + + Initializes a new instance of the class. + + + + Line ending mode. + + + + + Insert platform-dependent end-of-line sequence after each line. + + + + + Insert CR LF sequence (ASCII 13, ASCII 10) after each line. + + + + + Insert CR character (ASCII 13) after each line. + + + + + Insert LF character (ASCII 10) after each line. + + + + + Insert null terminator (ASCII 0) after each line. + + + + + Do not insert any line ending. + + + + + Gets the name of the LineEndingMode instance. + + + + + Gets the new line characters (value) of the LineEndingMode instance. + + + + + Initializes a new instance of . + + The mode name. + The new line characters to be used. + + + + Returns the that corresponds to the supplied . + + + The textual representation of the line ending mode, such as CRLF, LF, Default etc. + Name is not case sensitive. + + The value, that corresponds to the . + There is no line ending mode with the specified name. + + + + Compares two objects and returns a + value indicating whether the first one is equal to the second one. + + The first level. + The second level. + The value of mode1.NewLineCharacters == mode2.NewLineCharacters. + + + + Compares two objects and returns a + value indicating whether the first one is not equal to the second one. + + The first mode + The second mode + The value of mode1.NewLineCharacters != mode2.NewLineCharacters. + + + + Returns a string representation of the log level. + + Log level name. + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms + and data structures like a hash table. + + + + + Determines whether the specified is + equal to this instance. + + The to compare with + this instance. + + Value of true if the specified + is equal to this instance; otherwise, false. + + + The parameter is null. + + + + Indicates whether the current object is equal to another object of the same type. + true if the current object is equal to the parameter; otherwise, false. + An object to compare with this object. + + + + Provides a type converter to convert objects to and from other representations. + + + + + Returns whether this converter can convert an object of the given type to the type of this converter, using the specified context. + + + true if this converter can perform the conversion; otherwise, false. + + An that provides a format context. A that represents the type you want to convert from. + + + + Converts the given object to the type of this converter, using the specified context and culture information. + + + An that represents the converted value. + + An that provides a format context. The to use as the current culture. The to convert. The conversion cannot be performed. + + + + Sends log messages to a NLog Receiver Service (using WCF or Web Services). + + Documentation on NLog Wiki + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target. + + + + Gets or sets the endpoint address. + + The endpoint address. + + + + + Gets or sets the name of the endpoint configuration in WCF configuration file. + + The name of the endpoint configuration. + + + + + Gets or sets a value indicating whether to use binary message encoding. + + + + + + Gets or sets a value indicating whether to use a WCF service contract that is one way (fire and forget) or two way (request-reply) + + + + + + Gets or sets the client ID. + + The client ID. + + + + + Gets the list of parameters. + + The parameters. + + + + + Gets or sets a value indicating whether to include per-event properties in the payload sent to the server. + + + + + + Called when log events are being sent (test hook). + + The events. + The async continuations. + True if events should be sent, false to stop processing them. + + + + Writes logging event to the log target. Must be overridden in inheriting + classes. + + Logging event to be written out. + + + + NOTE! Obsolete, instead override Write(IList{AsyncLogEventInfo} logEvents) + + Writes an array of logging events to the log target. By default it iterates on all + events and passes them to "Write" method. Inheriting classes can use this method to + optimize batch writes. + + Logging events to be written out. + + + + Writes an array of logging events to the log target. By default it iterates on all + events and passes them to "Append" method. Inheriting classes can use this method to + optimize batch writes. + + Logging events to be written out. + + + + Flush any pending log messages asynchronously (in case of asynchronous targets). + + The asynchronous continuation. + + + + Add value to the , returns ordinal in + + + lookup so only unique items will be added to + value to add + + + + + Creating a new instance of WcfLogReceiverClient + + Inheritors can override this method and provide their own + service configuration - binding and endpoint address + + This method marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Creating a new instance of IWcfLogReceiverClient + + Inheritors can override this method and provide their own + service configuration - binding and endpoint address + + + virtual is used by endusers + + + + Sends log messages by email using SMTP protocol. + + Documentation on NLog Wiki + +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ This assumes just one target and a single rule. More configuration + options are described here. +

+

+ To set up the log target programmatically use code like this: +

+ +

+ Mail target works best when used with BufferingWrapper target + which lets you send multiple log messages in single mail +

+

+ To set up the buffered mail target in the configuration file, + use the following syntax: +

+ +

+ To set up the buffered mail target programmatically use code like this: +

+ +
+
+ + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + + + + Gets the mailSettings/smtp configuration from app.config in cases when we need those configuration. + E.g when UseSystemNetMailSettings is enabled and we need to read the From attribute from system.net/mailSettings/smtp + + Internal for mocking + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + Name of the target. + + + + Gets or sets sender's email address (e.g. joe@domain.com). + + + + + + Gets or sets recipients' email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com). + + + + + + Gets or sets CC email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com). + + + + + + Gets or sets BCC email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com). + + + + + + Gets or sets a value indicating whether to add new lines between log entries. + + A value of true if new lines should be added; otherwise, false. + + + + + Gets or sets the mail subject. + + + + + + Gets or sets mail message body (repeated for each log message send in one mail). + + Alias for the Layout property. + + + + + Gets or sets encoding to be used for sending e-mail. + + + + + + Gets or sets a value indicating whether to send message as HTML instead of plain text. + + + + + + Gets or sets SMTP Server to be used for sending. + + + + + + Gets or sets SMTP Authentication mode. + + + + + + Gets or sets the username used to connect to SMTP server (used when SmtpAuthentication is set to "basic"). + + + + + + Gets or sets the password used to authenticate against SMTP server (used when SmtpAuthentication is set to "basic"). + + + + + + Gets or sets a value indicating whether SSL (secure sockets layer) should be used when communicating with SMTP server. + + . + + + + Gets or sets the port number that SMTP Server is listening on. + + + + + + Gets or sets a value indicating whether the default Settings from System.Net.MailSettings should be used. + + + + + + Specifies how outgoing email messages will be handled. + + + + + + Gets or sets the folder where applications save mail messages to be processed by the local SMTP server. + + + + + + Gets or sets the priority used for sending mails. + + + + + + Gets or sets a value indicating whether NewLine characters in the body should be replaced with
tags. +
+ Only happens when is set to true. + +
+ + + Gets or sets a value indicating the SMTP client timeout. + + Warning: zero is not infinite waiting + + + + + Renders the logging event message and adds it to the internal ArrayList of log messages. + + The logging event. + + + + NOTE! Obsolete, instead override Write(IList{AsyncLogEventInfo} logEvents) + + Writes an array of logging events to the log target. By default it iterates on all + events and passes them to "Write" method. Inheriting classes can use this method to + optimize batch writes. + + Logging events to be written out. + + + + Renders an array logging events. + + Array of logging events. + + + + Initializes the target. Can be used by inheriting classes + to initialize logging. + + + + + Create mail and send with SMTP + + event printed in the body of the event + + + + Create buffer for body + + all events + first event for header + last event for footer + + + + + Set properties of + + last event for username/password + client to set properties on + Configure not at , as the properties could have layout renderers. + + + + Handle if it is a virtual directory. + + + + + + + Create key for grouping. Needed for multiple events in one mailmessage + + event for rendering layouts + string to group on + + + + Append rendered layout to the stringbuilder + + append to this + event for rendering + append if not null + + + + Create the mailmessage with the addresses, properties and body. + + + + + Render and add the addresses to + + Addresses appended to this list + layout with addresses, ; separated + event for rendering the + added a address? + + + + Writes log messages to an ArrayList in memory for programmatic retrieval. + + Documentation on NLog Wiki + +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ This assumes just one target and a single rule. More configuration + options are described here. +

+

+ To set up the log target programmatically use code like this: +

+ +
+
+ + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + Name of the target. + + + + Gets the list of logs gathered in the . + + + + + Gets or sets the max number of items to have in memory + + + + + + Renders the logging event message and adds it to the internal ArrayList of log messages. + + The logging event. + + + + A parameter to MethodCall. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The layout to use for parameter value. + + + + Initializes a new instance of the class. + + Name of the parameter. + The layout. + + + + Initializes a new instance of the class. + + The name of the parameter. + The layout. + The type of the parameter. + + + + Gets or sets the name of the parameter. + + + + + + Gets or sets the type of the parameter. Obsolete alias for + + + + + + Gets or sets the type of the parameter. + + + + + + Gets or sets the layout that should be use to calculate the value for the parameter. + + + + + + Calls the specified static method on each log message and passes contextual parameters to it. + + Documentation on NLog Wiki + +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ This assumes just one target and a single rule. More configuration + options are described here. +

+

+ To set up the log target programmatically use code like this: +

+ +
+
+ + + Gets or sets the class name. + + + + + + Gets or sets the method name. The method must be public and static. + + Use the AssemblyQualifiedName , https://msdn.microsoft.com/en-us/library/system.type.assemblyqualifiedname(v=vs.110).aspx + e.g. + + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target. + + + + Initializes a new instance of the class. + + Name of the target. + Method to call on logevent. + + + + Initializes the target. + + + + + Calls the specified Method. + + Method parameters. + The logging event. + + + + Calls the specified Method. + + Method parameters. + + + + The base class for all targets which call methods (local or remote). + Manages parameters and type coercion. + + + + + Initializes a new instance of the class. + + + + + Gets the array of parameters to be passed. + + + + + + + + + Prepares an array of parameters to be passed based on the logging event and calls DoInvoke(). + + The logging event. + + + + Calls the target DoInvoke method, and handles AsyncContinuation callback + + Method call parameters. + The logging event. + + + + Calls the target DoInvoke method, and handles AsyncContinuation callback + + Method call parameters. + The continuation. + + + + Calls the target method. Must be implemented in concrete classes. + + Method call parameters. + + + + Sends log messages over the network. + + Documentation on NLog Wiki + +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ This assumes just one target and a single rule. More configuration + options are described here. +

+

+ To set up the log target programmatically use code like this: +

+ +

+ To print the results, use any application that's able to receive messages over + TCP or UDP. NetCat is + a simple but very powerful command-line tool that can be used for that. This image + demonstrates the NetCat tool receiving log messages from Network target. +

+ +

+ NOTE: If your receiver application is ever likely to be off-line, don't use TCP protocol + or you'll get TCP timeouts and your application will be very slow. + Either switch to UDP transport or use AsyncWrapper target + so that your application threads will not be blocked by the timing-out connection attempts. +

+

+ There are two specialized versions of the Network target: Chainsaw + and NLogViewer which write to instances of Chainsaw log4j viewer + or NLogViewer application respectively. +

+
+
+ + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + Name of the target. + + + + Gets or sets the network address. + + + The network address can be: +
    +
  • tcp://host:port - TCP (auto select IPv4/IPv6) (not supported on Windows Phone 7.0)
  • +
  • tcp4://host:port - force TCP/IPv4 (not supported on Windows Phone 7.0)
  • +
  • tcp6://host:port - force TCP/IPv6 (not supported on Windows Phone 7.0)
  • +
  • udp://host:port - UDP (auto select IPv4/IPv6, not supported on Silverlight and on Windows Phone 7.0)
  • +
  • udp4://host:port - force UDP/IPv4 (not supported on Silverlight and on Windows Phone 7.0)
  • +
  • udp6://host:port - force UDP/IPv6 (not supported on Silverlight and on Windows Phone 7.0)
  • +
  • http://host:port/pageName - HTTP using POST verb
  • +
  • https://host:port/pageName - HTTPS using POST verb
  • +
+ For SOAP-based webservice support over HTTP use WebService target. +
+ +
+ + + Gets or sets a value indicating whether to keep connection open whenever possible. + + + + + + Gets or sets a value indicating whether to append newline at the end of log message. + + + + + + Gets or sets the end of line value if a newline is appended at the end of log message . + + + + + + Gets or sets the maximum message size in bytes. + + + + + + Gets or sets the size of the connection cache (number of connections which are kept alive). + + + + + + Gets or sets the maximum current connections. 0 = no maximum. + + + + + + Gets or sets the action that should be taken if the will be more connections than . + + + + + + Gets or sets the maximum queue size. + + + + + + Gets or sets the action that should be taken if the message is larger than + maxMessageSize. + + + + + + Gets or sets the encoding to be used. + + + + + + Get or set the SSL/TLS protocols. Default no SSL/TLS is used. Currently only implemented for TCP. + + + + + + The number of seconds a connection will remain idle before the first keep-alive probe is sent + + + + + Flush any pending log messages asynchronously (in case of asynchronous targets). + + The asynchronous continuation. + + + + Closes the target. + + + + + Sends the + rendered logging event over the network optionally concatenating it with a newline character. + + The logging event. + + + + Try to remove. + + + + + removed something? + + + + Gets the bytes to be written. + + Log event. + Byte array. + + + + The action to be taken when there are more connections then the max. + + + + + Just allow it. + + + + + Discard the connection item. + + + + + Block until there's more room in the queue. + + + + + Action that should be taken if the message overflows. + + + + + Report an error. + + + + + Split the message into smaller pieces. + + + + + Discard the entire message. + + + + + Represents a parameter to a NLogViewer target. + + + + + Initializes a new instance of the class. + + + + + Gets or sets viewer parameter name. + + + + + + Gets or sets the layout that should be use to calculate the value for the parameter. + + + + + + Gets or sets whether an attribute with empty value should be included in the output + + + + + + Sends log messages to the remote instance of NLog Viewer. + + Documentation on NLog Wiki + +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ This assumes just one target and a single rule. More configuration + options are described here. +

+

+ To set up the log target programmatically use code like this: +

+ +

+ NOTE: If your receiver application is ever likely to be off-line, don't use TCP protocol + or you'll get TCP timeouts and your application will crawl. + Either switch to UDP transport or use AsyncWrapper target + so that your application threads will not be blocked by the timing-out connection attempts. +

+
+
+ + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + Name of the target. + + + + Gets or sets a value indicating whether to include NLog-specific extensions to log4j schema. + + + + + + Gets or sets the AppInfo field. By default it's the friendly name of the current AppDomain. + + + + + + Gets or sets a value indicating whether to include call site (class and method name) in the information sent over the network. + + + + + + Gets or sets a value indicating whether to include source info (file name and line number) in the information sent over the network. + + + + + + Gets or sets a value indicating whether to include dictionary contents. + + + + + + Gets or sets a value indicating whether to include stack contents. + + + + + + Gets or sets a value indicating whether to include dictionary contents. + + + + + + Gets or sets a value indicating whether to include contents of the stack. + + + + + + Gets or sets the NDLC item separator. + + + + + + Gets or sets the option to include all properties from the log events + + + + + + Gets or sets the NDC item separator. + + + + + + Gets or sets the renderer for log4j:event logger-xml-attribute (Default ${logger}) + + + + + + Gets the collection of parameters. Each parameter contains a mapping + between NLog layout and a named parameter. + + + + + + Gets the layout renderer which produces Log4j-compatible XML events. + + + + + Gets or sets the instance of that is used to format log messages. + + + + + + Discards log messages. Used mainly for debugging and benchmarking. + + Documentation on NLog Wiki + +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ This assumes just one target and a single rule. More configuration + options are described here. +

+

+ To set up the log target programmatically use code like this: +

+ +
+
+ + + Gets or sets a value indicating whether to perform layout calculation. + + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + + + + + Does nothing. Optionally it calculates the layout text but + discards the results. + + The logging event. + + + + Outputs log messages through the OutputDebugString() Win32 API. + + Documentation on NLog Wiki + +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ This assumes just one target and a single rule. More configuration + options are described here. +

+

+ To set up the log target programmatically use code like this: +

+ +
+
+ + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + Name of the target. + + + + Outputs the rendered logging event through the OutputDebugString() Win32 API. + + The logging event. + + + + Increments specified performance counter on each write. + + Documentation on NLog Wiki + +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ This assumes just one target and a single rule. More configuration + options are described here. +

+

+ To set up the log target programmatically use code like this: +

+ +
+ + TODO: + 1. Unable to create a category allowing multiple counter instances (.Net 2.0 API only, probably) + 2. Is there any way of adding new counters without deleting the whole category? + 3. There should be some mechanism of resetting the counter (e.g every day starts from 0), or auto-switching to + another counter instance (with dynamic creation of new instance). This could be done with layouts. + +
+ + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target. + + + + Gets or sets a value indicating whether performance counter should be automatically created. + + + + + + Gets or sets the name of the performance counter category. + + + + + + Gets or sets the name of the performance counter. + + + + + + Gets or sets the performance counter instance name. + + + + + + Gets or sets the counter help text. + + + + + + Gets or sets the performance counter type. + + + + + + The value by which to increment the counter. + + + + + + Performs installation which requires administrative permissions. + + The installation context. + + + + Performs uninstallation which requires administrative permissions. + + The installation context. + + + + Determines whether the item is installed. + + The installation context. + + Value indicating whether the item is installed or null if it is not possible to determine. + + + + + Increments the configured performance counter. + + Log event. + + + + Closes the target and releases any unmanaged resources. + + + + + Ensures that the performance counter has been initialized. + + True if the performance counter is operational, false otherwise. + + + + SMTP authentication modes. + + + + + No authentication. + + + + + Basic - username and password. + + + + + NTLM Authentication. + + + + + Represents logging target. + + + + Are all layouts in this target thread-agnostic, if so we don't precalculate the layouts + + + + The Max StackTraceUsage of all the in this Target + + + + + Gets or sets the name of the target. + + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers + Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + Gets the object which can be used to synchronize asynchronous operations that must rely on the . + + + + + Gets the logging configuration this target is part of. + + + + + Gets a value indicating whether the target has been initialized. + + + + + Can be used if has been enabled. + + + + + Initializes this instance. + + The configuration. + + + + Closes this instance. + + + + + Closes the target. + + + + + Flush any pending log messages (in case of asynchronous targets). + + The asynchronous continuation. + + + + Calls the on each volatile layout + used by this target. + This method won't prerender if all layouts in this target are thread-agnostic. + + + The log event. + + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Writes the log to the target. + + Log event to write. + + + + Writes the array of log events. + + The log events. + + + + Writes the array of log events. + + The log events. + + + + Initializes this instance. + + The configuration. + + + + Closes this instance. + + + + + Releases unmanaged and - optionally - managed resources. + + True to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Initializes the target. Can be used by inheriting classes + to initialize logging. + + + + + Closes the target and releases any unmanaged resources. + + + + + Flush any pending log messages asynchronously (in case of asynchronous targets). + + The asynchronous continuation. + + + + Writes logging event to the log target. Must be overridden in inheriting + classes. + + Logging event to be written out. + + + + Writes async log event to the log target. + + Async Log event to be written out. + + + + Writes a log event to the log target, in a thread safe manner. + Any override of this method has to provide their own synchronization mechanism. + + !WARNING! Custom targets should only override this method if able to provide their + own synchronization mechanism. -objects are not guaranteed to be + threadsafe, so using them without a SyncRoot-object can be dangerous. + + Log event to be written out. + + + + NOTE! Obsolete, instead override Write(IList{AsyncLogEventInfo} logEvents) + + Writes an array of logging events to the log target. By default it iterates on all + events and passes them to "Write" method. Inheriting classes can use this method to + optimize batch writes. + + Logging events to be written out. + + + + Writes an array of logging events to the log target. By default it iterates on all + events and passes them to "Write" method. Inheriting classes can use this method to + optimize batch writes. + + Logging events to be written out. + + + + NOTE! Obsolete, instead override WriteAsyncThreadSafe(IList{AsyncLogEventInfo} logEvents) + + Writes an array of logging events to the log target, in a thread safe manner. + + !WARNING! Custom targets should only override this method if able to provide their + own synchronization mechanism. -objects are not guaranteed to be + threadsafe, so using them without a SyncRoot-object can be dangerous. + + Logging events to be written out. + + + + Writes an array of logging events to the log target, in a thread safe manner. + Any override of this method has to provide their own synchronization mechanism. + + !WARNING! Custom targets should only override this method if able to provide their + own synchronization mechanism. -objects are not guaranteed to be + threadsafe, so using them without a SyncRoot-object can be dangerous. + + Logging events to be written out. + + + + Merges (copies) the event context properties from any event info object stored in + parameters of the given event info object. + + The event info object to perform the merge to. + + + + Renders the event info in layout. + + The layout. + The event info. + String representing log event. + + + + Register a custom Target. + + Short-cut for registering to default + Type of the Target. + Name of the Target. + + + + Register a custom Target. + + Short-cut for registering to default + Type of the Target. + Name of the Target. + + + + Marks class as a logging target and assigns a name to it. + + This attribute is not required when registering the target in the API. + + + + Initializes a new instance of the class. + + Name of the target. + + + + Gets or sets a value indicating whether to the target is a wrapper target (used to generate the target summary documentation page). + + + + + Gets or sets a value indicating whether to the target is a compound target (used to generate the target summary documentation page). + + + + + Attribute details for + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The name of the attribute. + The layout of the attribute's value. + + + + Gets or sets the name of the attribute. + + + + + + Gets or sets the layout that will be rendered as the attribute's value. + + + + + + Gets or sets when an empty value should cause the property to be included + + + + + Gets or sets the type of the property. + + + + + Represents target that supports context capture using MDLC, MDC, NDLC and NDC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gets or sets a value indicating whether to include contents of the dictionary + + + + + + Gets or sets a value indicating whether to include call site (class and method name) in the + + + + + + Gets or sets a value indicating whether to include source info (file name and line number) in the + + + + + + Gets the array of custom attributes to be passed into the logevent context + + + + + + Constructor + + + + + + + + Check if logevent has properties (or context properties) + + + True if properties should be included + + + + Checks if any context properties, and if any returns them as a single dictionary + + + Dictionary with any context properties for the logEvent (Null if none found) + + + + Checks if any context properties, and if any returns them as a single dictionary + + + Optional prefilled dictionary + Dictionary with any context properties for the logEvent (Null if none found) + + + + Creates combined dictionary of all configured properties for logEvent + + + Dictionary with all collected properties for logEvent + + + + Creates combined dictionary of all configured properties for logEvent + + + Optional prefilled dictionary + Dictionary with all collected properties for logEvent + + + + Generates a new unique name, when duplicate names are detected + + LogEvent that triggered the duplicate name + Duplicate item name + Item Value + Dictionary of context values + New (unique) value (or null to skip value). If the same value is used then the item will be overwritten + + + + Returns the captured snapshot of for the + + + Dictionary with MDC context if any, else null + + + + Returns the captured snapshot of for the + + + Dictionary with MDLC context if any, else null + + + + Returns the captured snapshot of for the + + + Dictionary with NDC context if any, else null + + + + Returns the captured snapshot of for the + + + Dictionary with NDLC context if any, else null + + + + Takes snapshot of for the + + + Optional pre-allocated dictionary for the snapshot + Dictionary with GDC context if any, else null + + + + Takes snapshot of for the + + + Optional pre-allocated dictionary for the snapshot + Dictionary with MDC context if any, else null + + + + Take snapshot of a single object value from + + Log event + MDC key + MDC value + Snapshot of MDC value + Include object value in snapshot + + + + Takes snapshot of for the + + + Optional pre-allocated dictionary for the snapshot + Dictionary with MDLC context if any, else null + + + + Take snapshot of a single object value from + + Log event + MDLC key + MDLC value + Snapshot of MDLC value + Include object value in snapshot + + + + Takes snapshot of for the + + + Dictionary with NDC context if any, else null + + + + Take snapshot of a single object value from + + Log event + NDC value + Snapshot of NDC value + Include object value in snapshot + + + + Takes snapshot of for the + + + Dictionary with NDLC context if any, else null + + + + Take snapshot of a single object value from + + Log event + NDLC value + Snapshot of NDLC value + Include object value in snapshot + + + + Take snapshot of a single object value + + Log event + Key Name (null when NDC / NDLC) + Object Value + Snapshot of value + Include object value in snapshot + + + Internal Layout that allows capture of MDC context + + + Internal Layout that allows capture of NDC context + + + Internal Layout that allows capture of MDLC context + + + Internal Layout that allows capture of NDLC context + + + + Represents target that supports string formatting using layouts. + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + + + + Gets or sets the layout used to format log messages. + + + + + + Represents target that supports string formatting using layouts. + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + + + + Gets or sets the text to be rendered. + + + + + + Gets or sets the footer. + + + + + + Gets or sets the header. + + + + + + Gets or sets the layout with header and footer. + + The layout with header and footer. + + + + Sends log messages through System.Diagnostics.Trace. + + Documentation on NLog Wiki + +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ This assumes just one target and a single rule. More configuration + options are described here. +

+

+ To set up the log target programmatically use code like this: +

+ +
+
+ + + Always use independent of + + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + Name of the target. + + + + Writes the specified logging event to the facility. + + Redirects the log message depending on and . + When is false: + - writes to + - writes to + - writes to + - writes to + - writes to + - writes to + + The logging event. + + + + Web service protocol. + + + + + Use SOAP 1.1 Protocol. + + + + + Use SOAP 1.2 Protocol. + + + + + Use HTTP POST Protocol. + + + + + Use HTTP GET Protocol. + + + + + Do an HTTP POST of a JSON document. + + + + + Do an HTTP POST of an XML document. + + + + + Web Service Proxy Configuration Type + + + + + Default proxy configuration from app.config (System.Net.WebRequest.DefaultWebProxy) + + + Example of how to configure default proxy using app.config + + <system.net> + <defaultProxy enabled = "true" useDefaultCredentials = "true" > + <proxy usesystemdefault = "True" /> + </defaultProxy> + </system.net> + + + + + + Automatic use of proxy with authentication (cached) + + + + + Disables use of proxy (fast) + + + + + Custom proxy address (cached) + + + + + Calls the specified web service on each log message. + + Documentation on NLog Wiki + + The web service must implement a method that accepts a number of string parameters. + + +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ This assumes just one target and a single rule. More configuration + options are described here. +

+

+ To set up the log target programmatically use code like this: +

+ +

The example web service that works with this example is shown below

+ +
+
+ + + dictionary that maps a concrete implementation + to a specific -value. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target + + + + Gets or sets the web service URL. + + + + + + Gets or sets the Web service method name. Only used with Soap. + + + + + + Gets or sets the Web service namespace. Only used with Soap. + + + + + + Gets or sets the protocol to be used when calling web service. + + + + + + Gets or sets the proxy configuration when calling web service + + + + + + Gets or sets the custom proxy address, include port separated by a colon + + + + + + Should we include the BOM (Byte-order-mark) for UTF? Influences the property. + + This will only work for UTF-8. + + + + + + Gets or sets the encoding. + + + + + + Gets or sets a value whether escaping be done according to Rfc3986 (Supports Internationalized Resource Identifiers - IRIs) + + A value of true if Rfc3986; otherwise, false for legacy Rfc2396. + + + + + Gets or sets a value whether escaping be done according to the old NLog style (Very non-standard) + + A value of true if legacy encoding; otherwise, false for standard UTF8 encoding. + + + + + Gets or sets the name of the root XML element, + if POST of XML document chosen. + If so, this property must not be null. + (see and ). + + + + + + Gets or sets the (optional) root namespace of the XML document, + if POST of XML document chosen. + (see and ). + + + + + + Gets the array of parameters to be passed. + + + + + + Indicates whether to pre-authenticate the HttpWebRequest (Requires 'Authorization' in parameters) + + + + + + Calls the target method. Must be implemented in concrete classes. + + Method call parameters. + + + + Calls the target DoInvoke method, and handles AsyncContinuation callback + + Method call parameters. + The continuation. + + + + Invokes the web service method. + + Parameters to be passed. + The logging event. + + + + Flush any pending log messages asynchronously (in case of asynchronous targets). + + The asynchronous continuation. + + + + Closes the target. + + + + + Builds the URL to use when calling the web service for a message, depending on the WebServiceProtocol. + + + + + + + Write from input to output. Fix the UTF-8 bom + + + + + + + + + base class for POST formatters, that + implement former PrepareRequest() method, + that creates the content for + the requested kind of HTTP request + + + + + Win32 file attributes. + + + For more information see https://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/createfile.asp. + + + + + Read-only file. + + + + + Hidden file. + + + + + System file. + + + + + File should be archived. + + + + + Device file. + + + + + Normal file. + + + + + File is temporary (should be kept in cache and not + written to disk if possible). + + + + + Sparse file. + + + + + Reparse point. + + + + + Compress file contents. + + + + + File should not be indexed by the content indexing service. + + + + + Encrypted file. + + + + + The system writes through any intermediate cache and goes directly to disk. + + + + + The system opens a file with no system caching. + + + + + Delete file after it is closed. + + + + + A file is accessed according to POSIX rules. + + + + + Asynchronous request queue. + + + + + Initializes a new instance of the AsyncRequestQueue class. + + Request limit. + The overflow action. + + + + Gets the number of requests currently in the queue. + + + + + Enqueues another item. If the queue is overflown the appropriate + action is taken as specified by . + + The log event info. + Queue was empty before enqueue + + + + Dequeues a maximum of count items from the queue + and adds returns the list containing them. + + Maximum number of items to be dequeued (-1 means everything). + The array of log events. + + + + Dequeues into a preallocated array, instead of allocating a new one + + Maximum number of items to be dequeued + Preallocated list + + + + Clears the queue. + + + + + Gets or sets the request limit. + + + + + Gets or sets the action to be taken when there's no more room in + the queue and another request is enqueued. + + + + + Notifies about log event that was dropped when setted to + + + + + Notifies when queue size is growing over + + + + + Raise event when queued element was dropped because of queue overflow + + Dropped queue item + + + + Raise event when RequestCount overflow + + current requests count + + + + Provides asynchronous, buffered execution of target writes. + + Documentation on NLog Wiki + +

+ Asynchronous target wrapper allows the logger code to execute more quickly, by queueing + messages and processing them in a separate thread. You should wrap targets + that spend a non-trivial amount of time in their Write() method with asynchronous + target to speed up logging. +

+

+ Because asynchronous logging is quite a common scenario, NLog supports a + shorthand notation for wrapping all targets with AsyncWrapper. Just add async="true" to + the <targets/> element in the configuration file. +

+ + + ... your targets go here ... + + ]]> +
+ +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ The above examples assume just one target and a single rule. See below for + a programmatic configuration that's equivalent to the above config file: +

+ +
+
+ + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target. + The wrapped target. + + + + Initializes a new instance of the class. + + The wrapped target. + + + + Initializes a new instance of the class. + + The wrapped target. + Maximum number of requests in the queue. + The action to be taken when the queue overflows. + + + + Gets or sets the number of log events that should be processed in a batch + by the lazy writer thread. + + + + + + Gets or sets the time in milliseconds to sleep between batches. (1 or less means trigger on new activity) + + + + + + Raise event when Target cannot store LogEvent. + Event arg contains lost LogEvents + + + + + Raises when event queue grow. + Queue can grow when was setted to + + + + + Gets or sets the action to be taken when the lazy writer thread request queue count + exceeds the set limit. + + + + + + Gets or sets the limit on the number of requests in the lazy writer thread request queue. + + + + + + Gets or sets the limit of full s to write before yielding into + Performance is better when writing many small batches, than writing a single large batch + + + + + + Gets or sets whether to use the locking queue, instead of a lock-free concurrent queue + The locking queue is less concurrent when many logger threads, but reduces memory allocation + + + + + + Gets the queue of lazy writer thread requests. + + + + + Schedules a flush of pending events in the queue (if any), followed by flushing the WrappedTarget. + + The asynchronous continuation. + + + + Initializes the target by starting the lazy writer timer. + + + + + Shuts down the lazy writer timer. + + + + + Starts the lazy writer thread which periodically writes + queued log messages. + + + + + Attempts to start an instant timer-worker-thread which can write + queued log messages. + + Returns true when scheduled a timer-worker-thread + + + + Stops the lazy writer thread. + + + + + Adds the log event to asynchronous queue to be processed by + the lazy writer thread. + + The log event. + + The is called + to ensure that the log event can be processed in another thread. + + + + + Write to queue without locking + + + + + + The action to be taken when the queue overflows. + + + + + Grow the queue. + + + + + Discard the overflowing item. + + + + + Block until there's more room in the queue. + + + + + Causes a flush on a wrapped target if LogEvent satisfies the . + If condition isn't set, flushes on each write. + + Documentation on NLog Wiki + +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ The above examples assume just one target and a single rule. See below for + a programmatic configuration that's equivalent to the above config file: +

+ +
+
+ + + Gets or sets the condition expression. Log events who meet this condition will cause + a flush on the wrapped target. + + + + + + Delay the flush until the LogEvent has been confirmed as written + + + + + + Only flush when LogEvent matches condition. Ignore explicit-flush, config-reload-flush and shutdown-flush + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + The wrapped target. + Name of the target + + + + Initializes a new instance of the class. + + The wrapped target. + + + + Initializes the target. + + + + + Forwards the call to the .Write() + and calls on it if LogEvent satisfies + the flush condition or condition is null. + + Logging event to be written out. + + + + Schedules a flush operation, that triggers when all pending flush operations are completed (in case of asynchronous targets). + + The asynchronous continuation. + + + + Closes the target. + + + + + A target that buffers log events and sends them in batches to the wrapped target. + + Documentation on NLog Wiki + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target. + The wrapped target. + + + + Initializes a new instance of the class. + + The wrapped target. + + + + Initializes a new instance of the class. + + The wrapped target. + Size of the buffer. + + + + Initializes a new instance of the class. + + The wrapped target. + Size of the buffer. + The flush timeout. + + + + Initializes a new instance of the class. + + The wrapped target. + Size of the buffer. + The flush timeout. + The aciton to take when the buffer overflows. + + + + Gets or sets the number of log events to be buffered. + + + + + + Gets or sets the timeout (in milliseconds) after which the contents of buffer will be flushed + if there's no write in the specified period of time. Use -1 to disable timed flushes. + + + + + + Gets or sets a value indicating whether to use sliding timeout. + + + This value determines how the inactivity period is determined. If sliding timeout is enabled, + the inactivity timer is reset after each write, if it is disabled - inactivity timer will + count from the first event written to the buffer. + + + + + + Gets or sets the action to take if the buffer overflows. + + + Setting to will replace the + oldest event with new events without sending events down to the wrapped target, and + setting to will flush the + entire buffer to the wrapped target. + + + + + + Flushes pending events in the buffer (if any), followed by flushing the WrappedTarget. + + The asynchronous continuation. + + + + Initializes the target. + + + + + Closes the target by flushing pending events in the buffer (if any). + + + + + Adds the specified log event to the buffer and flushes + the buffer in case the buffer gets full. + + The log event. + + + + The action to be taken when the buffer overflows. + + + + + Flush the content of the buffer. + + + + + Discard the oldest item. + + + + + A base class for targets which wrap other (multiple) targets + and provide various forms of target routing. + + + + + Initializes a new instance of the class. + + The targets. + + + + Gets the collection of targets managed by this compound target. + + + + + Returns the text representation of the object. Used for diagnostics. + + A string that describes the target. + + + + Writes logging event to the log target. + + Logging event to be written out. + + + + Flush any pending log messages for all wrapped targets. + + The asynchronous continuation. + + + + Concurrent Asynchronous request queue based on + + + + + Initializes a new instance of the AsyncRequestQueue class. + + Request limit. + The overflow action. + + + + Gets the number of requests currently in the queue. + + + Only for debugging purposes + + + + + Enqueues another item. If the queue is overflown the appropriate + action is taken as specified by . + + The log event info. + Queue was empty before enqueue + + + + Dequeues a maximum of count items from the queue + and adds returns the list containing them. + + Maximum number of items to be dequeued (-1 means everything). + The array of log events. + + + + Dequeues into a preallocated array, instead of allocating a new one + + Maximum number of items to be dequeued + Preallocated list + + + + Clears the queue. + + + + + Provides fallback-on-error. + + Documentation on NLog Wiki + +

This example causes the messages to be written to server1, + and if it fails, messages go to server2.

+

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ The above examples assume just one target and a single rule. See below for + a programmatic configuration that's equivalent to the above config file: +

+ +
+
+ + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target. + The targets. + + + + Initializes a new instance of the class. + + The targets. + + + + Gets or sets a value indicating whether to return to the first target after any successful write. + + + + + + + + + + + + Forwards the log event to the sub-targets until one of them succeeds. + + The log event. + + The method remembers the last-known-successful target + and starts the iteration from it. + If is set, the method + resets the target to the first target + stored in . + + + + + Filtering rule for . + + + + + Initializes a new instance of the FilteringRule class. + + + + + Initializes a new instance of the FilteringRule class. + + Condition to be tested against all events. + Filter to apply to all log events when the first condition matches any of them. + + + + Gets or sets the condition to be tested. + + + + + + Gets or sets the resulting filter to be applied when the condition matches. + + + + + + Filters log entries based on a condition. + + Documentation on NLog Wiki + +

This example causes the messages not contains the string '1' to be ignored.

+

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ The above examples assume just one target and a single rule. See below for + a programmatic configuration that's equivalent to the above config file: +

+ +
+
+ + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target. + The wrapped target. + The condition. + + + + Initializes a new instance of the class. + + The wrapped target. + The condition. + + + + Gets or sets the condition expression. Log events who meet this condition will be forwarded + to the wrapped target. + + + + + + Gets or sets the filter. Log events who evaluates to will be discarded + + + + + + + + + Checks the condition against the passed log event. + If the condition is met, the log event is forwarded to + the wrapped target. + + Log event. + + + + + + + Impersonates another user for the duration of the write. + + Documentation on NLog Wiki + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target. + The wrapped target. + + + + Initializes a new instance of the class. + + The wrapped target. + + + + Gets or sets username to change context to. + + + + + + Gets or sets the user account password. + + + + + + Gets or sets Windows domain name to change context to. + + + + + + Gets or sets the Logon Type. + + + + + + Gets or sets the type of the logon provider. + + + + + + Gets or sets the required impersonation level. + + + + + + Gets or sets a value indicating whether to revert to the credentials of the process instead of impersonating another user. + + + + + + Initializes the impersonation context. + + + + + Closes the impersonation context. + + + + + Changes the security context, forwards the call to the .Write() + and switches the context back to original. + + The log event. + + + + NOTE! Obsolete, instead override Write(IList{AsyncLogEventInfo} logEvents) + + Writes an array of logging events to the log target. By default it iterates on all + events and passes them to "Write" method. Inheriting classes can use this method to + optimize batch writes. + + Logging events to be written out. + + + + Changes the security context, forwards the call to the .Write() + and switches the context back to original. + + Log events. + + + + Flush any pending log messages (in case of asynchronous targets). + + The asynchronous continuation. + + + + Helper class which reverts the given + to its original value as part of . + + + + + Initializes a new instance of the class. + + The windows impersonation context. + + + + Reverts the impersonation context. + + + + + Limits the number of messages written per timespan to the wrapped target. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The name of the target. + The wrapped target. + + + + Initializes a new instance of the class. + + The wrapped target. + + + + Initializes a new instance of the class. + + The wrapped target. + Maximum number of messages written per interval. + Interval in which the maximum number of messages can be written. + + + + Gets or sets the maximum allowed number of messages written per . + + + Messages received after has been reached in the current will be discarded. + + + + + + Gets or sets the interval in which messages will be written up to the number of messages. + + + Messages received after has been reached in the current will be discarded. + + + + + + Gets the DateTime when the current will be reset. + + + + + + Gets the number of written in the current . + + + + + + Initializes the target and resets the current Interval and . + + + + + Writes log event to the wrapped target if the current is lower than . + If the is already reached, no log event will be written to the wrapped target. + resets when the current is expired. + + Log event to be written out. + + + + Arguments for events. + + + + + + + + Instance of that was dropped by + + + + + Raises by when + queue is full + and setted to + By default queue doubles it size. + + + + + Contains items count and new queue size. + + Required queue size + Current queue size + + + + New queue size + + + + + Current requests count + + + + + Logon provider. + + + + + Use the standard logon provider for the system. + + + The default security provider is negotiate, unless you pass NULL for the domain name and the user name + is not in UPN format. In this case, the default provider is NTLM. + NOTE: Windows 2000/NT: The default security provider is NTLM. + + + + + Filters buffered log entries based on a set of conditions that are evaluated on a group of events. + + Documentation on NLog Wiki + + PostFilteringWrapper must be used with some type of buffering target or wrapper, such as + AsyncTargetWrapper, BufferingWrapper or ASPNetBufferingWrapper. + + +

+ This example works like this. If there are no Warn,Error or Fatal messages in the buffer + only Info messages are written to the file, but if there are any warnings or errors, + the output includes detailed trace (levels >= Debug). You can plug in a different type + of buffering wrapper (such as ASPNetBufferingWrapper) to achieve different + functionality. +

+

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ The above examples assume just one target and a single rule. See below for + a programmatic configuration that's equivalent to the above config file: +

+ +
+
+ + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target. + The wrapped target. + + + + Gets or sets the default filter to be applied when no specific rule matches. + + + + + + Gets the collection of filtering rules. The rules are processed top-down + and the first rule that matches determines the filtering condition to + be applied to log events. + + + + + + + + + + + + NOTE! Obsolete, instead override Write(IList{AsyncLogEventInfo} logEvents) + + Writes an array of logging events to the log target. By default it iterates on all + events and passes them to "Write" method. Inheriting classes can use this method to + optimize batch writes. + + Logging events to be written out. + + + + Evaluates all filtering rules to find the first one that matches. + The matching rule determines the filtering condition to be applied + to all items in a buffer. If no condition matches, default filter + is applied to the array of log events. + + Array of log events to be post-filtered. + + + + Evaluate all the rules to get the filtering condition + + + + + + + Sends log messages to a randomly selected target. + + Documentation on NLog Wiki + +

This example causes the messages to be written to either file1.txt or file2.txt + chosen randomly on a per-message basis. +

+

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ The above examples assume just one target and a single rule. See below for + a programmatic configuration that's equivalent to the above config file: +

+ +
+
+ + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target. + The targets. + + + + Initializes a new instance of the class. + + The targets. + + + + Forwards the log event to one of the sub-targets. + The sub-target is randomly chosen. + + The log event. + + + + Repeats each log event the specified number of times. + + Documentation on NLog Wiki + +

This example causes each log message to be repeated 3 times.

+

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ The above examples assume just one target and a single rule. See below for + a programmatic configuration that's equivalent to the above config file: +

+ +
+
+ + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target. + The wrapped target. + The repeat count. + + + + Initializes a new instance of the class. + + The wrapped target. + The repeat count. + + + + Gets or sets the number of times to repeat each log message. + + + + + + Forwards the log message to the by calling the method times. + + The log event. + + + + Retries in case of write error. + + Documentation on NLog Wiki + +

This example causes each write attempt to be repeated 3 times, + sleeping 1 second between attempts if first one fails.

+

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ The above examples assume just one target and a single rule. See below for + a programmatic configuration that's equivalent to the above config file: +

+ +
+
+ + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target. + The wrapped target. + The retry count. + The retry delay milliseconds. + + + + Initializes a new instance of the class. + + The wrapped target. + The retry count. + The retry delay milliseconds. + + + + Gets or sets the number of retries that should be attempted on the wrapped target in case of a failure. + + + + + + Gets or sets the time to wait between retries in milliseconds. + + + + + + Special SyncObject to allow closing down Target while busy retrying + + + + + Writes the specified log event to the wrapped target, retrying and pausing in case of an error. + + The log event. + + + + Writes the specified log event to the wrapped target in a thread-safe manner. + + The log event. + + + + Writes the specified log event to the wrapped target, retrying and pausing in case of an error. + + The log event. + + + + Distributes log events to targets in a round-robin fashion. + + Documentation on NLog Wiki + +

This example causes the messages to be written to either file1.txt or file2.txt. + Each odd message is written to file2.txt, each even message goes to file1.txt. +

+

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ The above examples assume just one target and a single rule. See below for + a programmatic configuration that's equivalent to the above config file: +

+ +
+
+ + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target. + The targets. + + + + Initializes a new instance of the class. + + The targets. + + + + Ensures forwarding happens without holding lock + + + + + + Forwards the write to one of the targets from + the collection. + + The log event. + + The writes are routed in a round-robin fashion. + The first log event goes to the first target, the second + one goes to the second target and so on looping to the + first target when there are no more targets available. + In general request N goes to Targets[N % Targets.Count]. + + + + + Impersonation level. + + + + + Anonymous Level. + + + + + Identification Level. + + + + + Impersonation Level. + + + + + Delegation Level. + + + + + Logon type. + + + + + Interactive Logon. + + + This logon type is intended for users who will be interactively using the computer, such as a user being logged on + by a terminal server, remote shell, or similar process. + This logon type has the additional expense of caching logon information for disconnected operations; + therefore, it is inappropriate for some client/server applications, + such as a mail server. + + + + + Network Logon. + + + This logon type is intended for high performance servers to authenticate plaintext passwords. + The LogonUser function does not cache credentials for this logon type. + + + + + Batch Logon. + + + This logon type is intended for batch servers, where processes may be executing on behalf of a user without + their direct intervention. This type is also for higher performance servers that process many plaintext + authentication attempts at a time, such as mail or Web servers. + The LogonUser function does not cache credentials for this logon type. + + + + + Logon as a Service. + + + Indicates a service-type logon. The account provided must have the service privilege enabled. + + + + + Network Clear Text Logon. + + + This logon type preserves the name and password in the authentication package, which allows the server to make + connections to other network servers while impersonating the client. A server can accept plaintext credentials + from a client, call LogonUser, verify that the user can access the system across the network, and still + communicate with other servers. + NOTE: Windows NT: This value is not supported. + + + + + New Network Credentials. + + + This logon type allows the caller to clone its current token and specify new credentials for outbound connections. + The new logon session has the same local identifier but uses different credentials for other network connections. + NOTE: This logon type is supported only by the LOGON32_PROVIDER_WINNT50 logon provider. + NOTE: Windows NT: This value is not supported. + + + + + Writes log events to all targets. + + Documentation on NLog Wiki + +

This example causes the messages to be written to both file1.txt or file2.txt +

+

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ The above examples assume just one target and a single rule. See below for + a programmatic configuration that's equivalent to the above config file: +

+ +
+
+ + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target. + The targets. + + + + Initializes a new instance of the class. + + The targets. + + + + Forwards the specified log event to all sub-targets. + + The log event. + + + + NOTE! Obsolete, instead override Write(IList{AsyncLogEventInfo} logEvents) + + Writes an array of logging events to the log target. By default it iterates on all + events and passes them to "Write" method. Inheriting classes can use this method to + optimize batch writes. + + Logging events to be written out. + + + + Writes an array of logging events to the log target. By default it iterates on all + events and passes them to "Write" method. Inheriting classes can use this method to + optimize batch writes. + + Logging events to be written out. + + + + Base class for targets wrap other (single) targets. + + + + + Gets or sets the target that is wrapped by this target. + + + + + + Returns the text representation of the object. Used for diagnostics. + + A string that describes the target. + + + + Flush any pending log messages (in case of asynchronous targets). + + The asynchronous continuation. + + + + Writes logging event to the log target. Must be overridden in inheriting + classes. + + Logging event to be written out. + + + + Current local time retrieved directly from DateTime.Now. + + + + + Gets current local time directly from DateTime.Now. + + + + + Converts the specified system time to the same form as the time value originated from this time source. + + The system originated time value to convert. + + The value of converted to local time. + + + + + Current UTC time retrieved directly from DateTime.UtcNow. + + + + + Gets current UTC time directly from DateTime.UtcNow. + + + + + Converts the specified system time to the same form as the time value originated from this time source. + + The system originated time value to convert. + + The value of converted to UTC time. + + + + + Fast time source that updates current time only once per tick (15.6 milliseconds). + + + + + Gets raw uncached time from derived time source. + + + + + Gets current time cached for one system tick (15.6 milliseconds). + + + + + Fast local time source that is updated once per tick (15.6 milliseconds). + + + + + Gets uncached local time directly from DateTime.Now. + + + + + Converts the specified system time to the same form as the time value originated from this time source. + + The system originated time value to convert. + + The value of converted to local time. + + + + + Fast UTC time source that is updated once per tick (15.6 milliseconds). + + + + + Gets uncached UTC time directly from DateTime.UtcNow. + + + + + Converts the specified system time to the same form as the time value originated from this time source. + + The system originated time value to convert. + + The value of converted to UTC time. + + + + + Defines source of current time. + + + + + Gets current time. + + + + + Gets or sets current global time source used in all log events. + + + Default time source is . + + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Converts the specified system time to the same form as the time value originated from this time source. + + The system originated time value to convert. + + The value of converted to the same form + as time values originated from this source. + + + + There are situations when NLog have to compare the time originated from TimeSource + to the time originated externally in the system. + To be able to provide meaningful result of such comparisons the system time must be expressed in + the same form as TimeSource time. + + + Examples: + - If the TimeSource provides time values of local time, it should also convert the provided + to the local time. + - If the TimeSource shifts or skews its time values, it should also apply + the same transform to the given . + + + + + + Marks class as a time source and assigns a name to it. + + + + + Initializes a new instance of the class. + + Name of the time source. + +
+
diff --git a/TBF_V2/Sources/TBF/packages/Common/Newtonsoft.Json.xml b/TBF_V2/Sources/TBF/packages/Common/Newtonsoft.Json.xml new file mode 100644 index 00000000..0cbf62cd --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Common/Newtonsoft.Json.xml @@ -0,0 +1,9646 @@ + + + + Newtonsoft.Json + + + + + Represents a BSON Oid (object id). + + + + + Gets or sets the value of the Oid. + + The value of the Oid. + + + + Initializes a new instance of the class. + + The Oid value. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized BSON data. + + + + + Gets or sets a value indicating whether binary data reading should be compatible with incorrect Json.NET 3.5 written binary. + + + true if binary data reading will be compatible with incorrect Json.NET 3.5 written binary; otherwise, false. + + + + + Gets or sets a value indicating whether the root object will be read as a JSON array. + + + true if the root object will be read as a JSON array; otherwise, false. + + + + + Gets or sets the used when reading values from BSON. + + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating BSON data. + + + + + Gets or sets the used when writing values to BSON. + When set to no conversion will occur. + + The used when writing values to BSON. + + + + Initializes a new instance of the class. + + The to write to. + + + + Initializes a new instance of the class. + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying stream. + + + + + Writes the end. + + The token. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes the beginning of a JSON array. + + + + + Writes the beginning of a JSON object. + + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value that represents a BSON object id. + + The Object ID value to write. + + + + Writes a BSON regex. + + The regex pattern. + The regex options. + + + + Specifies how constructors are used when initializing objects during deserialization by the . + + + + + First attempt to use the public default constructor, then fall back to a single parameterized constructor, then to the non-public default constructor. + + + + + Json.NET will use a non-public default constructor before falling back to a parameterized constructor. + + + + + Converts a binary value to and from a base 64 string value. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Creates a custom object. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Creates an object which will then be populated by the serializer. + + Type of the object. + The created object. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Provides a base class for converting a to and from JSON. + + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a F# discriminated union type to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an Entity Framework to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Converts a to and from the ISO 8601 date format (e.g. "2008-04-12T12:53Z"). + + + + + Gets or sets the date time styles used when converting a date to and from JSON. + + The date time styles used when converting a date to and from JSON. + + + + Gets or sets the date time format used when converting a date to and from JSON. + + The date time format used when converting a date to and from JSON. + + + + Gets or sets the culture used when converting a date to and from JSON. + + The culture used when converting a date to and from JSON. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Converts a to and from a JavaScript Date constructor (e.g. new Date(52231943)). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from its name string value. + + + + + Gets or sets a value indicating whether the written enum text should be camel case. + The default value is false. + + true if the written enum text will be camel case; otherwise, false. + + + + Gets or sets the naming strategy used to resolve how enum text is written. + + The naming strategy used to resolve how enum text is written. + + + + Gets or sets a value indicating whether integer values are allowed when serializing and deserializing. + The default value is true. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + true if the written enum text will be camel case; otherwise, false. + + + + Initializes a new instance of the class. + + The naming strategy used to resolve how enum text is written. + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from Unix epoch time + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from a string (e.g. "1.2.3.4"). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts XML to and from JSON. + + + + + Gets or sets the name of the root element to insert when deserializing to XML if the JSON structure has produced multiple root elements. + + The name of the deserialized root element. + + + + Gets or sets a value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + true if the array attribute is written to the XML; otherwise, false. + + + + Gets or sets a value indicating whether to write the root JSON object. + + true if the JSON root object is omitted; otherwise, false. + + + + Gets or sets a value indicating whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + true if special characters are encoded; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The calling serializer. + The value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Checks if the is a namespace attribute. + + Attribute name to test. + The attribute name prefix if it has one, otherwise an empty string. + true if attribute name is for a namespace attribute, otherwise false. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Specifies how dates are formatted when writing JSON text. + + + + + Dates are written in the ISO 8601 format, e.g. "2012-03-21T05:40Z". + + + + + Dates are written in the Microsoft JSON format, e.g. "\/Date(1198908717056)\/". + + + + + Specifies how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON text. + + + + + Date formatted strings are not parsed to a date type and are read as strings. + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Specifies how to treat the time value when converting between string and . + + + + + Treat as local time. If the object represents a Coordinated Universal Time (UTC), it is converted to the local time. + + + + + Treat as a UTC. If the object represents a local time, it is converted to a UTC. + + + + + Treat as a local time if a is being converted to a string. + If a string is being converted to , convert to a local time if a time zone is specified. + + + + + Time zone information should be preserved when converting. + + + + + The default JSON name table implementation. + + + + + Initializes a new instance of the class. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Adds the specified string into name table. + + The string to add. + This method is not thread-safe. + The resolved string. + + + + Specifies default value handling options for the . + + + + + + + + + Include members where the member value is the same as the member's default value when serializing objects. + Included members are written to JSON. Has no effect when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + so that it is not written to JSON. + This option will ignore all default values (e.g. null for objects and nullable types; 0 for integers, + decimals and floating point numbers; and false for booleans). The default value ignored can be changed by + placing the on the property. + + + + + Members with a default value but no JSON will be set to their default value when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + and set members to their default value when deserializing. + + + + + Specifies float format handling options when writing special floating point numbers, e.g. , + and with . + + + + + Write special floating point values as strings in JSON, e.g. "NaN", "Infinity", "-Infinity". + + + + + Write special floating point values as symbols in JSON, e.g. NaN, Infinity, -Infinity. + Note that this will produce non-valid JSON. + + + + + Write special floating point values as the property's default value in JSON, e.g. 0.0 for a property, null for a of property. + + + + + Specifies how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Floating point numbers are parsed to . + + + + + Floating point numbers are parsed to . + + + + + Specifies formatting options for the . + + + + + No special formatting is applied. This is the default. + + + + + Causes child objects to be indented according to the and settings. + + + + + Provides an interface for using pooled arrays. + + The array type content. + + + + Rent an array from the pool. This array must be returned when it is no longer needed. + + The minimum required length of the array. The returned array may be longer. + The rented array from the pool. This array must be returned when it is no longer needed. + + + + Return an array to the pool. + + The array that is being returned. + + + + Provides an interface to enable a class to return line and position information. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + The current line number or 0 if no line information is available (for example, when returns false). + + + + Gets the current line position. + + The current line position or 0 if no line information is available (for example, when returns false). + + + + Instructs the how to serialize the collection. + + + + + Gets or sets a value indicating whether null items are allowed in the collection. + + true if null items are allowed in the collection; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a flag indicating whether the array can contain null items. + + A flag indicating whether the array can contain null items. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to use the specified constructor when deserializing that object. + + + + + Instructs the how to serialize the object. + + + + + Gets or sets the id. + + The id. + + + + Gets or sets the title. + + The title. + + + + Gets or sets the description. + + The description. + + + + Gets or sets the collection's items converter. + + The collection's items converter. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets a value that indicates whether to preserve object references. + + + true to keep object reference; otherwise, false. The default is false. + + + + + Gets or sets a value that indicates whether to preserve collection's items references. + + + true to keep collection's items object references; otherwise, false. The default is false. + + + + + Gets or sets the reference loop handling used when serializing the collection's items. + + The reference loop handling. + + + + Gets or sets the type name handling used when serializing the collection's items. + + The type name handling. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Provides methods for converting between .NET types and JSON types. + + + + + + + + Gets or sets a function that creates default . + Default settings are automatically used by serialization methods on , + and and on . + To serialize without using any default settings create a with + . + + + + + Represents JavaScript's boolean value true as a string. This field is read-only. + + + + + Represents JavaScript's boolean value false as a string. This field is read-only. + + + + + Represents JavaScript's null as a string. This field is read-only. + + + + + Represents JavaScript's undefined as a string. This field is read-only. + + + + + Represents JavaScript's positive infinity as a string. This field is read-only. + + + + + Represents JavaScript's negative infinity as a string. This field is read-only. + + + + + Represents JavaScript's NaN as a string. This field is read-only. + + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + The time zone handling when the date is converted to a string. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + The string escape handling. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Serializes the specified object to a JSON string. + + The object to serialize. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting. + + The object to serialize. + Indicates how the output should be formatted. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a collection of . + + The object to serialize. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting and a collection of . + + The object to serialize. + Indicates how the output should be formatted. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Deserializes the JSON to a .NET object. + + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to a .NET object using . + + The JSON to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The JSON to deserialize. + The of object being deserialized. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The type of the object to deserialize to. + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the given anonymous type. + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the given anonymous type using . + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The type of the object to deserialize to. + The JSON to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The type of the object to deserialize to. + The object to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The JSON to deserialize. + The type of the object to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The JSON to deserialize. + The type of the object to deserialize to. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Populates the object with values from the JSON string. + + The JSON to populate values from. + The target object to populate values onto. + + + + Populates the object with values from the JSON string using . + + The JSON to populate values from. + The target object to populate values onto. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + + + + Serializes the to a JSON string. + + The node to serialize. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to serialize. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Serializes the to a JSON string. + + The node to convert to JSON. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to convert to JSON. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Converts an object to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can read JSON. + + true if this can read JSON; otherwise, false. + + + + Gets a value indicating whether this can write JSON. + + true if this can write JSON; otherwise, false. + + + + Converts an object to and from JSON. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. If there is no existing value then null will be used. + The existing value has a value. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Instructs the to use the specified when serializing the member or class. + + + + + Gets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + + + + + Initializes a new instance of the class. + + Type of the . + + + + Initializes a new instance of the class. + + Type of the . + Parameter list to use when constructing the . Can be null. + + + + Represents a collection of . + + + + + Instructs the how to serialize the collection. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Instructs the to deserialize properties with no matching class member into the specified collection + and write values during serialization. + + + + + Gets or sets a value that indicates whether to write extension data when serializing the object. + + + true to write extension data when serializing the object; otherwise, false. The default is true. + + + + + Gets or sets a value that indicates whether to read extension data when deserializing the object. + + + true to read extension data when deserializing the object; otherwise, false. The default is true. + + + + + Initializes a new instance of the class. + + + + + Instructs the not to serialize the public field or public read/write property value. + + + + + Base class for a table of atomized string objects. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Instructs the how to serialize the object. + + + + + Gets or sets the member serialization. + + The member serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified member serialization. + + The member serialization. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to always serialize the member with the specified name. + + + + + Gets or sets the type used when serializing the property's collection items. + + The collection's items type. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the null value handling used when serializing this property. + + The null value handling. + + + + Gets or sets the default value handling used when serializing this property. + + The default value handling. + + + + Gets or sets the reference loop handling used when serializing this property. + + The reference loop handling. + + + + Gets or sets the object creation handling used when deserializing this property. + + The object creation handling. + + + + Gets or sets the type name handling used when serializing this property. + + The type name handling. + + + + Gets or sets whether this property's value is serialized as a reference. + + Whether this property's value is serialized as a reference. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets a value indicating whether this property is required. + + + A value indicating whether this property is required. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified name. + + Name of the property. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Specifies the state of the reader. + + + + + A read method has not been called. + + + + + The end of the file has been reached successfully. + + + + + Reader is at a property. + + + + + Reader is at the start of an object. + + + + + Reader is in an object. + + + + + Reader is at the start of an array. + + + + + Reader is in an array. + + + + + The method has been called. + + + + + Reader has just read a value. + + + + + Reader is at the start of a constructor. + + + + + Reader is in a constructor. + + + + + An error occurred that prevents the read operation from continuing. + + + + + The end of the file has been reached successfully. + + + + + Gets the current reader state. + + The current reader state. + + + + Gets or sets a value indicating whether the source should be closed when this reader is closed. + + + true to close the source when this reader is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether multiple pieces of JSON content can + be read from a continuous stream without erroring. + + + true to support reading multiple pieces of JSON content; otherwise false. + The default is false. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + Gets or sets how time zones are handled when reading JSON. + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Gets or sets how custom date formatted strings are parsed when reading JSON. + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + + + + + Gets the type of the current JSON token. + + + + + Gets the text value of the current JSON token. + + + + + Gets the .NET type for the current JSON token. + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets or sets the culture used when reading JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Reads the next JSON token from the source. + + true if the next token was read successfully; false if there are no more tokens to read. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Skips the children of the current token. + + + + + Sets the current token. + + The new token. + + + + Sets the current token and value. + + The new token. + The value. + + + + Sets the current token and value. + + The new token. + The value. + A flag indicating whether the position index inside an array should be updated. + + + + Sets the state based on current token type. + + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Changes the reader's state to . + If is set to true, the source is also closed. + + + + + The exception thrown when an error occurs while reading JSON text. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Instructs the to always serialize the member, and to require that the member has a value. + + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Serializes and deserializes objects into and from the JSON format. + The enables you to control how objects are encoded into JSON. + + + + + Occurs when the errors during serialization and deserialization. + + + + + Gets or sets the used by the serializer when resolving references. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + + + + Gets or sets how reference loops (e.g. a class referencing itself) is handled. + The default value is . + + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets a collection that will be used during serialization. + + Collection that will be used during serialization. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is null. + + + + + Gets a value indicating whether there will be a check for additional JSON content after deserializing an object. + The default value is false. + + + true if there will be a check for additional JSON content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Creates a new instance. + The will not use default settings + from . + + + A new instance. + The will not use default settings + from . + + + + + Creates a new instance using the specified . + The will not use default settings + from . + + The settings to be applied to the . + + A new instance using the specified . + The will not use default settings + from . + + + + + Creates a new instance. + The will use default settings + from . + + + A new instance. + The will use default settings + from . + + + + + Creates a new instance using the specified . + The will use default settings + from as well as the specified . + + The settings to be applied to the . + + A new instance using the specified . + The will use default settings + from as well as the specified . + + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Deserializes the JSON structure contained by the specified . + + The that contains the JSON structure to deserialize. + The being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The type of the object to deserialize. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Specifies the settings on a object. + + + + + Gets or sets how reference loops (e.g. a class referencing itself) are handled. + The default value is . + + Reference loop handling. + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + Missing member handling. + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + Null value handling. + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + The default value handling. + + + + Gets or sets a collection that will be used during serialization. + + The converters. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + The preserve references handling. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + The type name handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + The contract resolver. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets the used by the serializer when resolving references. + + The reference resolver. + + + + Gets or sets a function that creates the used by the serializer when resolving references. + + A function that creates the used by the serializer when resolving references. + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the error handler called during serialization and deserialization. + + The error handler called during serialization and deserialization. + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is null. + + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets a value indicating whether there will be a check for additional content after deserializing an object. + The default value is false. + + + true if there will be a check for additional content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Represents a reader that provides fast, non-cached, forward-only access to JSON text data. + + + + + Initializes a new instance of the class with the specified . + + The containing the JSON data to read. + + + + Gets or sets the reader's property name table. + + + + + Gets or sets the reader's character buffer pool. + + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + + The current line number or 0 if no line information is available (for example, returns false). + + + + + Gets the current line position. + + + The current line position or 0 if no line information is available (for example, returns false). + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets or sets the writer's character array pool. + + + + + Gets or sets how many s to write for each level in the hierarchy when is set to . + + + + + Gets or sets which character to use to quote attribute values. + + + + + Gets or sets which character to use for indenting when is set to . + + + + + Gets or sets a value indicating whether object names will be surrounded with quotes. + + + + + Initializes a new instance of the class using the specified . + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying . + + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the specified end token. + + The end token to write. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Specifies the type of JSON token. + + + + + This is returned by the if a read method has not been called. + + + + + An object start token. + + + + + An array start token. + + + + + A constructor start token. + + + + + An object property name. + + + + + A comment. + + + + + Raw JSON. + + + + + An integer. + + + + + A float. + + + + + A string. + + + + + A boolean. + + + + + A null token. + + + + + An undefined token. + + + + + An object end token. + + + + + An array end token. + + + + + A constructor end token. + + + + + A Date. + + + + + Byte data. + + + + + + Represents a reader that provides validation. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Sets an event handler for receiving schema validation errors. + + + + + Gets the text value of the current JSON token. + + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + + Gets the type of the current JSON token. + + + + + + Gets the .NET type for the current JSON token. + + + + + + Initializes a new instance of the class that + validates the content returned from the given . + + The to read from while validating. + + + + Gets or sets the schema. + + The schema. + + + + Gets the used to construct this . + + The specified in the constructor. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a []. + + + A [] or null if the next JSON token is null. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets or sets a value indicating whether the destination should be closed when this writer is closed. + + + true to close the destination when this writer is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether the JSON should be auto-completed when this writer is closed. + + + true to auto-complete the JSON when this writer is closed; otherwise false. The default is true. + + + + + Gets the top. + + The top. + + + + Gets the state of the writer. + + + + + Gets the path of the writer. + + + + + Gets or sets a value indicating how JSON text output should be formatted. + + + + + Gets or sets how dates are written to JSON text. + + + + + Gets or sets how time zones are handled when writing JSON text. + + + + + Gets or sets how strings are escaped when writing JSON text. + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written to JSON text. + + + + + Gets or sets how and values are formatted when writing JSON text. + + + + + Gets or sets the culture used when writing JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the destination and also flushes the destination. + + + + + Closes this writer. + If is set to true, the destination is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the end of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the end of an array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end constructor. + + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes the end of the current JSON object or array. + + + + + Writes the current token and its children. + + The to read the token from. + + + + Writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + + + + Writes the token and its value. + + The to write. + + The value to write. + A value is only required for tokens that have an associated value, e.g. the property name for . + null can be passed to the method for tokens that don't have a value, e.g. . + + + + + Writes the token. + + The to write. + + + + Writes the specified end token. + + The end token to write. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON without changing the writer's state. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Sets the state of the . + + The being written. + The value being written. + + + + The exception thrown when an error occurs while writing JSON text. + + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Specifies how JSON comments are handled when loading JSON. + + + + + Ignore comments. + + + + + Load comments as a with type . + + + + + Specifies how duplicate property names are handled when loading JSON. + + + + + Replace the existing value when there is a duplicate property. The value of the last property in the JSON object will be used. + + + + + Ignore the new value when there is a duplicate property. The value of the first property in the JSON object will be used. + + + + + Throw a when a duplicate property is encountered. + + + + + Contains the LINQ to JSON extension methods. + + + + + Returns a collection of tokens that contains the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the descendants of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, and the descendants of every token in the source collection. + + + + Returns a collection of child properties of every object in the source collection. + + An of that contains the source collection. + An of that contains the properties of every object in the source collection. + + + + Returns a collection of child values of every object in the source collection with the given key. + + An of that contains the source collection. + The token key. + An of that contains the values of every token in the source collection with the given key. + + + + Returns a collection of child values of every object in the source collection. + + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child values of every object in the source collection with the given key. + + The type to convert the values to. + An of that contains the source collection. + The token key. + An that contains the converted values of every token in the source collection with the given key. + + + + Returns a collection of converted child values of every object in the source collection. + + The type to convert the values to. + An of that contains the source collection. + An that contains the converted values of every token in the source collection. + + + + Converts the value. + + The type to convert the value to. + A cast as a of . + A converted value. + + + + Converts the value. + + The source collection type. + The type to convert the value to. + A cast as a of . + A converted value. + + + + Returns a collection of child tokens of every array in the source collection. + + The source collection type. + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child tokens of every array in the source collection. + + An of that contains the source collection. + The type to convert the values to. + The source collection type. + An that contains the converted values of every token in the source collection. + + + + Returns the input typed as . + + An of that contains the source collection. + The input typed as . + + + + Returns the input typed as . + + The source collection type. + An of that contains the source collection. + The input typed as . + + + + Represents a collection of objects. + + The type of token. + + + + Gets the of with the specified key. + + + + + + Represents a JSON array. + + + + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads an from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the at the specified index. + + + + + + Determines the index of a specific item in the . + + The object to locate in the . + + The index of if found in the list; otherwise, -1. + + + + + Inserts an item to the at the specified index. + + The zero-based index at which should be inserted. + The object to insert into the . + + is not a valid index in the . + + + + + Removes the item at the specified index. + + The zero-based index of the item to remove. + + is not a valid index in the . + + + + + Returns an enumerator that iterates through the collection. + + + A of that can be used to iterate through the collection. + + + + + Adds an item to the . + + The object to add to the . + + + + Removes all items from the . + + + + + Determines whether the contains a specific value. + + The object to locate in the . + + true if is found in the ; otherwise, false. + + + + + Copies the elements of the to an array, starting at a particular array index. + + The array. + Index of the array. + + + + Gets a value indicating whether the is read-only. + + true if the is read-only; otherwise, false. + + + + Removes the first occurrence of a specific object from the . + + The object to remove from the . + + true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . + + + + + Represents a JSON constructor. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets or sets the name of this constructor. + + The constructor name. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name. + + The constructor name. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a token that can contain other tokens. + + + + + Occurs when the list changes or an item in the list changes. + + + + + Occurs before an item is added to the collection. + + + + + Occurs when the items list of the collection has changed, or the collection is reset. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Raises the event. + + The instance containing the event data. + + + + Raises the event. + + The instance containing the event data. + + + + Raises the event. + + The instance containing the event data. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Get the first child token of this token. + + + A containing the first child token of the . + + + + + Get the last child token of this token. + + + A containing the last child token of the . + + + + + Returns a collection of the child tokens of this token, in document order. + + + An of containing the child tokens of this , in document order. + + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + + A containing the child values of this , in document order. + + + + + Returns a collection of the descendant tokens for this token in document order. + + An of containing the descendant tokens of the . + + + + Returns a collection of the tokens that contain this token, and all descendant tokens of this token, in document order. + + An of containing this token, and all the descendant tokens of the . + + + + Adds the specified content as children of this . + + The content to be added. + + + + Adds the specified content as the first children of this . + + The content to be added. + + + + Creates a that can be used to add tokens to the . + + A that is ready to have content written to it. + + + + Replaces the child nodes of this token with the specified content. + + The content. + + + + Removes the child nodes from this token. + + + + + Merge the specified content into this . + + The content to be merged. + + + + Merge the specified content into this using . + + The content to be merged. + The used to merge the content. + + + + Gets the count of child JSON tokens. + + The count of child JSON tokens. + + + + Represents a collection of objects. + + The type of token. + + + + An empty collection of objects. + + + + + Initializes a new instance of the struct. + + The enumerable. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Gets the of with the specified key. + + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Represents a JSON object. + + + + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Occurs when a property value changes. + + + + + Occurs when a property value is changing. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Gets the node type for this . + + The type. + + + + Gets an of of this object's properties. + + An of of this object's properties. + + + + Gets a with the specified name. + + The property name. + A with the specified name or null. + + + + Gets the with the specified name. + The exact name will be searched for first and if no matching property is found then + the will be used to match a property. + + The property name. + One of the enumeration values that specifies how the strings will be compared. + A matched with the specified name or null. + + + + Gets a of of this object's property values. + + A of of this object's property values. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the with the specified property name. + + + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified property name. + + Name of the property. + The with the specified property name. + + + + Gets the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + One of the enumeration values that specifies how the strings will be compared. + The with the specified property name. + + + + Tries to get the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + The value. + One of the enumeration values that specifies how the strings will be compared. + true if a value was successfully retrieved; otherwise, false. + + + + Adds the specified property name. + + Name of the property. + The value. + + + + Determines whether the JSON object has the specified property name. + + Name of the property. + true if the JSON object has the specified property name; otherwise, false. + + + + Removes the property with the specified name. + + Name of the property. + true if item was successfully removed; otherwise, false. + + + + Tries to get the with the specified property name. + + Name of the property. + The value. + true if a value was successfully retrieved; otherwise, false. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Represents a JSON property. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the property name. + + The property name. + + + + Gets or sets the property value. + + The property value. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a view of a . + + + + + Initializes a new instance of the class. + + The name. + + + + When overridden in a derived class, returns whether resetting an object changes its value. + + + true if resetting the component changes its value; otherwise, false. + + The component to test for reset capability. + + + + When overridden in a derived class, gets the current value of the property on a component. + + + The value of a property for a given component. + + The component with the property for which to retrieve the value. + + + + When overridden in a derived class, resets the value for this property of the component to the default value. + + The component with the property value that is to be reset to the default value. + + + + When overridden in a derived class, sets the value of the component to a different value. + + The component with the property value that is to be set. + The new value. + + + + When overridden in a derived class, determines a value indicating whether the value of this property needs to be persisted. + + + true if the property should be persisted; otherwise, false. + + The component with the property to be examined for persistence. + + + + When overridden in a derived class, gets the type of the component this property is bound to. + + + A that represents the type of component this property is bound to. + When the or + + methods are invoked, the object specified might be an instance of this type. + + + + + When overridden in a derived class, gets a value indicating whether this property is read-only. + + + true if the property is read-only; otherwise, false. + + + + + When overridden in a derived class, gets the type of the property. + + + A that represents the type of the property. + + + + + Gets the hash code for the name of the member. + + + + The hash code for the name of the member. + + + + + Represents a raw JSON string. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class. + + The raw json. + + + + Creates an instance of with the content of the reader's current token. + + The reader. + An instance of with the content of the reader's current token. + + + + Specifies the settings used when loading JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets how JSON comments are handled when loading JSON. + The default value is . + + The JSON comment handling. + + + + Gets or sets how JSON line info is handled when loading JSON. + The default value is . + + The JSON line info handling. + + + + Gets or sets how duplicate property names in JSON objects are handled when loading JSON. + The default value is . + + The JSON duplicate property name handling. + + + + Specifies the settings used when merging JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the method used when merging JSON arrays. + + The method used when merging JSON arrays. + + + + Gets or sets how null value properties are merged. + + How null value properties are merged. + + + + Gets or sets the comparison used to match property names while merging. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + The comparison used to match property names while merging. + + + + Represents an abstract JSON token. + + + + + Gets a comparer that can compare two tokens for value equality. + + A that can compare two nodes for value equality. + + + + Gets or sets the parent. + + The parent. + + + + Gets the root of this . + + The root of this . + + + + Gets the node type for this . + + The type. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Compares the values of two tokens, including the values of all descendant tokens. + + The first to compare. + The second to compare. + true if the tokens are equal; otherwise false. + + + + Gets the next sibling token of this node. + + The that contains the next sibling token. + + + + Gets the previous sibling token of this node. + + The that contains the previous sibling token. + + + + Gets the path of the JSON token. + + + + + Adds the specified content immediately after this token. + + A content object that contains simple content or a collection of content objects to be added after this token. + + + + Adds the specified content immediately before this token. + + A content object that contains simple content or a collection of content objects to be added before this token. + + + + Returns a collection of the ancestor tokens of this token. + + A collection of the ancestor tokens of this token. + + + + Returns a collection of tokens that contain this token, and the ancestors of this token. + + A collection of tokens that contain this token, and the ancestors of this token. + + + + Returns a collection of the sibling tokens after this token, in document order. + + A collection of the sibling tokens after this tokens, in document order. + + + + Returns a collection of the sibling tokens before this token, in document order. + + A collection of the sibling tokens before this token, in document order. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets the with the specified key converted to the specified type. + + The type to convert the token to. + The token key. + The converted token value. + + + + Get the first child token of this token. + + A containing the first child token of the . + + + + Get the last child token of this token. + + A containing the last child token of the . + + + + Returns a collection of the child tokens of this token, in document order. + + An of containing the child tokens of this , in document order. + + + + Returns a collection of the child tokens of this token, in document order, filtered by the specified type. + + The type to filter the child tokens on. + A containing the child tokens of this , in document order. + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + A containing the child values of this , in document order. + + + + Removes this token from its parent. + + + + + Replaces this token with the specified token. + + The value. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Returns the indented JSON for this token. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + The indented JSON for this token. + + + + + Returns the JSON for this token using the given formatting and converters. + + Indicates how the output should be formatted. + A collection of s which will be used when writing the token. + The JSON for this token using the given formatting and converters. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to []. + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from [] to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Creates a for this token. + + A that can be used to read this token and its descendants. + + + + Creates a from an object. + + The object that will be used to create . + A with the value of the specified object. + + + + Creates a from an object using the specified . + + The object that will be used to create . + The that will be used when reading the object. + A with the value of the specified object. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + Creates a from a . + + A positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A , or null. + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + A . + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + An of that contains the selected elements. + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A new instance of the . + + + + Adds an object to the annotation list of this . + + The annotation to add. + + + + Get the first annotation object of the specified type from this . + + The type of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets the first annotation object of the specified type from this . + + The of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets a collection of annotations of the specified type for this . + + The type of the annotations to retrieve. + An that contains the annotations for this . + + + + Gets a collection of annotations of the specified type for this . + + The of the annotations to retrieve. + An of that contains the annotations that match the specified type for this . + + + + Removes the annotations of the specified type from this . + + The type of annotations to remove. + + + + Removes the annotations of the specified type from this . + + The of annotations to remove. + + + + Compares tokens to determine whether they are equal. + + + + + Determines whether the specified objects are equal. + + The first object of type to compare. + The second object of type to compare. + + true if the specified objects are equal; otherwise, false. + + + + + Returns a hash code for the specified object. + + The for which a hash code is to be returned. + A hash code for the specified object. + The type of is a reference type and is null. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Gets the at the reader's current position. + + + + + Initializes a new instance of the class. + + The token to read from. + + + + Initializes a new instance of the class. + + The token to read from. + The initial path of the token. It is prepended to the returned . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Gets the path of the current JSON token. + + + + + Specifies the type of token. + + + + + No token type has been set. + + + + + A JSON object. + + + + + A JSON array. + + + + + A JSON constructor. + + + + + A JSON object property. + + + + + A comment. + + + + + An integer value. + + + + + A float value. + + + + + A string value. + + + + + A boolean value. + + + + + A null value. + + + + + An undefined value. + + + + + A date value. + + + + + A raw JSON value. + + + + + A collection of bytes value. + + + + + A Guid value. + + + + + A Uri value. + + + + + A TimeSpan value. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets the at the writer's current position. + + + + + Gets the token being written. + + The token being written. + + + + Initializes a new instance of the class writing to the given . + + The container being written to. + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the underlying . + + + + + Closes this writer. + If is set to true, the JSON is auto-completed. + + + Setting to true has no additional effect, since the underlying is a type that cannot be closed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end. + + The token. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes a value. + An error will be raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Represents a value in JSON (string, integer, date, etc). + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Creates a comment with the given value. + + The value. + A comment with the given value. + + + + Creates a string with the given value. + + The value. + A string with the given value. + + + + Creates a null value. + + A null value. + + + + Creates a undefined value. + + A undefined value. + + + + Gets the node type for this . + + The type. + + + + Gets or sets the underlying token value. + + The underlying token value. + + + + Writes this token to a . + + A into which this method will write. + A collection of s which will be used when writing the token. + + + + Indicates whether the current object is equal to another object of the same type. + + + true if the current object is equal to the parameter; otherwise, false. + + An object to compare with this object. + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Returns a that represents this instance. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format provider. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + The format provider. + + A that represents this instance. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object. + + An object to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the objects being compared. The return value has these meanings: + Value + Meaning + Less than zero + This instance is less than . + Zero + This instance is equal to . + Greater than zero + This instance is greater than . + + + is not of the same type as this instance. + + + + + Specifies how line information is handled when loading JSON. + + + + + Ignore line information. + + + + + Load line information. + + + + + Specifies how JSON arrays are merged together. + + + + Concatenate arrays. + + + Union arrays, skipping items that already exist. + + + Replace all array items. + + + Merge array items together, matched by index. + + + + Specifies how null value properties are merged. + + + + + The content's null value properties will be ignored during merging. + + + + + The content's null value properties will be merged. + + + + + Specifies the member serialization options for the . + + + + + All public members are serialized by default. Members can be excluded using or . + This is the default member serialization mode. + + + + + Only members marked with or are serialized. + This member serialization mode can also be set by marking the class with . + + + + + All public and private fields are serialized. Members can be excluded using or . + This member serialization mode can also be set by marking the class with + and setting IgnoreSerializableAttribute on to false. + + + + + Specifies metadata property handling options for the . + + + + + Read metadata properties located at the start of a JSON object. + + + + + Read metadata properties located anywhere in a JSON object. Note that this setting will impact performance. + + + + + Do not try to read metadata properties. + + + + + Specifies missing member handling options for the . + + + + + Ignore a missing member and do not attempt to deserialize it. + + + + + Throw a when a missing member is encountered during deserialization. + + + + + Specifies null value handling options for the . + + + + + + + + + Include null values when serializing and deserializing objects. + + + + + Ignore null values when serializing and deserializing objects. + + + + + Specifies how object creation is handled by the . + + + + + Reuse existing objects, create new objects when needed. + + + + + Only reuse existing objects. + + + + + Always create new objects. + + + + + Specifies reference handling options for the . + Note that references cannot be preserved when a value is set via a non-default constructor such as types that implement . + + + + + + + + Do not preserve references when serializing types. + + + + + Preserve references when serializing into a JSON object structure. + + + + + Preserve references when serializing into a JSON array structure. + + + + + Preserve references when serializing. + + + + + Specifies reference loop handling options for the . + + + + + Throw a when a loop is encountered. + + + + + Ignore loop references and do not serialize. + + + + + Serialize loop references. + + + + + Indicating whether a property is required. + + + + + The property is not required. The default state. + + + + + The property must be defined in JSON but can be a null value. + + + + + The property must be defined in JSON and cannot be a null value. + + + + + The property is not required but it cannot be a null value. + + + + + + Contains the JSON schema extension methods. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + true if the specified is valid; otherwise, false. + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + When this method returns, contains any error messages generated while validating. + + true if the specified is valid; otherwise, false. + + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + The validation event handler. + + + + + An in-memory representation of a JSON Schema. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the id. + + + + + Gets or sets the title. + + + + + Gets or sets whether the object is required. + + + + + Gets or sets whether the object is read-only. + + + + + Gets or sets whether the object is visible to users. + + + + + Gets or sets whether the object is transient. + + + + + Gets or sets the description of the object. + + + + + Gets or sets the types of values allowed by the object. + + The type. + + + + Gets or sets the pattern. + + The pattern. + + + + Gets or sets the minimum length. + + The minimum length. + + + + Gets or sets the maximum length. + + The maximum length. + + + + Gets or sets a number that the value should be divisible by. + + A number that the value should be divisible by. + + + + Gets or sets the minimum. + + The minimum. + + + + Gets or sets the maximum. + + The maximum. + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the minimum attribute (). + + A flag indicating whether the value can not equal the number defined by the minimum attribute (). + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the maximum attribute (). + + A flag indicating whether the value can not equal the number defined by the maximum attribute (). + + + + Gets or sets the minimum number of items. + + The minimum number of items. + + + + Gets or sets the maximum number of items. + + The maximum number of items. + + + + Gets or sets the of items. + + The of items. + + + + Gets or sets a value indicating whether items in an array are validated using the instance at their array position from . + + + true if items are validated using their array position; otherwise, false. + + + + + Gets or sets the of additional items. + + The of additional items. + + + + Gets or sets a value indicating whether additional items are allowed. + + + true if additional items are allowed; otherwise, false. + + + + + Gets or sets whether the array items must be unique. + + + + + Gets or sets the of properties. + + The of properties. + + + + Gets or sets the of additional properties. + + The of additional properties. + + + + Gets or sets the pattern properties. + + The pattern properties. + + + + Gets or sets a value indicating whether additional properties are allowed. + + + true if additional properties are allowed; otherwise, false. + + + + + Gets or sets the required property if this property is present. + + The required property if this property is present. + + + + Gets or sets the a collection of valid enum values allowed. + + A collection of valid enum values allowed. + + + + Gets or sets disallowed types. + + The disallowed types. + + + + Gets or sets the default value. + + The default value. + + + + Gets or sets the collection of that this schema extends. + + The collection of that this schema extends. + + + + Gets or sets the format. + + The format. + + + + Initializes a new instance of the class. + + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The object representing the JSON Schema. + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The to use when resolving schema references. + The object representing the JSON Schema. + + + + Load a from a string that contains JSON Schema. + + A that contains JSON Schema. + A populated from the string that contains JSON Schema. + + + + Load a from a string that contains JSON Schema using the specified . + + A that contains JSON Schema. + The resolver. + A populated from the string that contains JSON Schema. + + + + Writes this schema to a . + + A into which this method will write. + + + + Writes this schema to a using the specified . + + A into which this method will write. + The resolver used. + + + + Returns a that represents the current . + + + A that represents the current . + + + + + + Returns detailed information about the schema exception. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + + Generates a from a specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets how undefined schemas are handled by the serializer. + + + + + Gets or sets the contract resolver. + + The contract resolver. + + + + Generate a from the specified type. + + The type to generate a from. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + + Resolves from an id. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the loaded schemas. + + The loaded schemas. + + + + Initializes a new instance of the class. + + + + + Gets a for the specified reference. + + The id. + A for the specified reference. + + + + + The value types allowed by the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + No type specified. + + + + + String type. + + + + + Float type. + + + + + Integer type. + + + + + Boolean type. + + + + + Object type. + + + + + Array type. + + + + + Null type. + + + + + Any type. + + + + + + Specifies undefined schema Id handling options for the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Do not infer a schema Id. + + + + + Use the .NET type name as the schema Id. + + + + + Use the assembly qualified .NET type name as the schema Id. + + + + + + Returns detailed information related to the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the associated with the validation error. + + The JsonSchemaException associated with the validation error. + + + + Gets the path of the JSON location where the validation error occurred. + + The path of the JSON location where the validation error occurred. + + + + Gets the text description corresponding to the validation error. + + The text description. + + + + + Represents the callback method that will handle JSON schema validation events and the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + A camel case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Resolves member mappings for a type, camel casing property names. + + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used by to resolve a for a given . + + + + + Gets a value indicating whether members are being get and set using dynamic code generation. + This value is determined by the runtime permissions available. + + + true if using dynamic code generation; otherwise, false. + + + + + Gets or sets the default members search flags. + + The default members search flags. + + + + Gets or sets a value indicating whether compiler generated members should be serialized. + + + true if serialized compiler generated members; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the interface when serializing and deserializing types. + + + true if the interface will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the attribute when serializing and deserializing types. + + + true if the attribute will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore IsSpecified members when serializing and deserializing types. + + + true if the IsSpecified members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore ShouldSerialize members when serializing and deserializing types. + + + true if the ShouldSerialize members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets the naming strategy used to resolve how property names and dictionary keys are serialized. + + The naming strategy used to resolve how property names and dictionary keys are serialized. + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Gets the serializable members for the type. + + The type to get serializable members for. + The serializable members for the type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates the constructor parameters. + + The constructor to create properties for. + The type's member properties. + Properties for the given . + + + + Creates a for the given . + + The matching member property. + The constructor parameter. + A created for the given . + + + + Resolves the default for the contract. + + Type of the object. + The contract's default . + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Determines which contract type is created for the given type. + + Type of the object. + A for the given type. + + + + Creates properties for the given . + + The type to create properties for. + /// The member serialization mode for the type. + Properties for the given . + + + + Creates the used by the serializer to get and set values from a member. + + The member. + The used by the serializer to get and set values from a member. + + + + Creates a for the given . + + The member's parent . + The member to create a for. + A created for the given . + + + + Resolves the name of the property. + + Name of the property. + Resolved name of the property. + + + + Resolves the name of the extension data. By default no changes are made to extension data names. + + Name of the extension data. + Resolved name of the extension data. + + + + Resolves the key of the dictionary. By default is used to resolve dictionary keys. + + Key of the dictionary. + Resolved key of the dictionary. + + + + Gets the resolved name of the property. + + Name of the property. + Name of the property. + + + + The default naming strategy. Property names and dictionary keys are unchanged. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + The default serialization binder used when resolving and loading classes from type names. + + + + + Initializes a new instance of the class. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + The type of the object the formatter creates a new instance of. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer that writes to the application's instances. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Get and set values for a using dynamic methods. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Provides information surrounding an error. + + + + + Gets the error. + + The error. + + + + Gets the original object that caused the error. + + The original object that caused the error. + + + + Gets the member that caused the error. + + The member that caused the error. + + + + Gets the path of the JSON location where the error occurred. + + The path of the JSON location where the error occurred. + + + + Gets or sets a value indicating whether this is handled. + + true if handled; otherwise, false. + + + + Provides data for the Error event. + + + + + Gets the current object the error event is being raised against. + + The current object the error event is being raised against. + + + + Gets the error context. + + The error context. + + + + Initializes a new instance of the class. + + The current object. + The error context. + + + + Get and set values for a using dynamic methods. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Provides methods to get attributes. + + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Used by to resolve a for a given . + + + + + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used to resolve references when serializing and deserializing JSON by the . + + + + + Resolves a reference to its object. + + The serialization context. + The reference to resolve. + The object that was resolved from the reference. + + + + Gets the reference for the specified object. + + The serialization context. + The object to get a reference for. + The reference to the object. + + + + Determines whether the specified object is referenced. + + The serialization context. + The object to test for a reference. + + true if the specified object is referenced; otherwise, false. + + + + + Adds a reference to the specified object. + + The serialization context. + The reference. + The object to reference. + + + + Allows users to control class loading and mandate what class to load. + + + + + When implemented, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object + The type of the object the formatter creates a new instance of. + + + + When implemented, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + The that will be used to filter the trace messages passed to the writer. + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Provides methods to get and set values. + + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Contract details for a used by the . + + + + + Gets the of the collection items. + + The of the collection items. + + + + Gets a value indicating whether the collection type is a multidimensional array. + + true if the collection type is a multidimensional array; otherwise, false. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the collection values. + + true if the creator has a parameter with the collection values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the default collection items . + + The converter. + + + + Gets or sets a value indicating whether the collection items preserve object references. + + true if collection items preserve object references; otherwise, false. + + + + Gets or sets the collection item reference loop handling. + + The reference loop handling. + + + + Gets or sets the collection item type name handling. + + The type name handling. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Handles serialization callback events. + + The object that raised the callback event. + The streaming context. + + + + Handles serialization error callback events. + + The object that raised the callback event. + The streaming context. + The error context. + + + + Sets extension data for an object during deserialization. + + The object to set extension data on. + The extension data key. + The extension data value. + + + + Gets extension data for an object during serialization. + + The object to set extension data on. + + + + Contract details for a used by the . + + + + + Gets the underlying type for the contract. + + The underlying type for the contract. + + + + Gets or sets the type created during deserialization. + + The type created during deserialization. + + + + Gets or sets whether this type contract is serialized as a reference. + + Whether this type contract is serialized as a reference. + + + + Gets or sets the default for this contract. + + The converter. + + + + Gets the internally resolved for the contract's type. + This converter is used as a fallback converter when no other converter is resolved. + Setting will always override this converter. + + + + + Gets or sets all methods called immediately after deserialization of the object. + + The methods called immediately after deserialization of the object. + + + + Gets or sets all methods called during deserialization of the object. + + The methods called during deserialization of the object. + + + + Gets or sets all methods called after serialization of the object graph. + + The methods called after serialization of the object graph. + + + + Gets or sets all methods called before serialization of the object. + + The methods called before serialization of the object. + + + + Gets or sets all method called when an error is thrown during the serialization of the object. + + The methods called when an error is thrown during the serialization of the object. + + + + Gets or sets the default creator method used to create the object. + + The default creator method used to create the object. + + + + Gets or sets a value indicating whether the default creator is non-public. + + true if the default object creator is non-public; otherwise, false. + + + + Contract details for a used by the . + + + + + Gets or sets the dictionary key resolver. + + The dictionary key resolver. + + + + Gets the of the dictionary keys. + + The of the dictionary keys. + + + + Gets the of the dictionary values. + + The of the dictionary values. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the dictionary values. + + true if the creator has a parameter with the dictionary values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets the object's properties. + + The object's properties. + + + + Gets or sets the property name resolver. + + The property name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object constructor. + + The object constructor. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object member serialization. + + The member object serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets the object's properties. + + The object's properties. + + + + Gets a collection of instances that define the parameters used with . + + + + + Gets or sets the function used to create the object. When set this function will override . + This function is called with a collection of arguments which are defined by the collection. + + The function used to create the object. + + + + Gets or sets the extension data setter. + + + + + Gets or sets the extension data getter. + + + + + Gets or sets the extension data value type. + + + + + Gets or sets the extension data name resolver. + + The extension data name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Maps a JSON property to a .NET member or constructor parameter. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the type that declared this property. + + The type that declared this property. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets the name of the underlying member or parameter. + + The name of the underlying member or parameter. + + + + Gets the that will get and set the during serialization. + + The that will get and set the during serialization. + + + + Gets or sets the for this property. + + The for this property. + + + + Gets or sets the type of the property. + + The type of the property. + + + + Gets or sets the for the property. + If set this converter takes precedence over the contract converter for the property type. + + The converter. + + + + Gets or sets the member converter. + + The member converter. + + + + Gets or sets a value indicating whether this is ignored. + + true if ignored; otherwise, false. + + + + Gets or sets a value indicating whether this is readable. + + true if readable; otherwise, false. + + + + Gets or sets a value indicating whether this is writable. + + true if writable; otherwise, false. + + + + Gets or sets a value indicating whether this has a member attribute. + + true if has a member attribute; otherwise, false. + + + + Gets the default value. + + The default value. + + + + Gets or sets a value indicating whether this is required. + + A value indicating whether this is required. + + + + Gets a value indicating whether has a value specified. + + + + + Gets or sets a value indicating whether this property preserves object references. + + + true if this instance is reference; otherwise, false. + + + + + Gets or sets the property null value handling. + + The null value handling. + + + + Gets or sets the property default value handling. + + The default value handling. + + + + Gets or sets the property reference loop handling. + + The reference loop handling. + + + + Gets or sets the property object creation handling. + + The object creation handling. + + + + Gets or sets or sets the type name handling. + + The type name handling. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets a predicate used to determine whether the property should be deserialized. + + A predicate used to determine whether the property should be deserialized. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets an action used to set whether the property has been deserialized. + + An action used to set whether the property has been deserialized. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Gets or sets the converter used when serializing the property's collection items. + + The collection's items converter. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + A collection of objects. + + + + + Initializes a new instance of the class. + + The type. + + + + When implemented in a derived class, extracts the key from the specified element. + + The element from which to extract the key. + The key for the specified element. + + + + Adds a object. + + The property to add to the collection. + + + + Gets the closest matching object. + First attempts to get an exact case match of and then + a case insensitive match. + + Name of the property. + A matching property if found. + + + + Gets a property by property name. + + The name of the property to get. + Type property name string comparison. + A matching property if found. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Lookup and create an instance of the type described by the argument. + + The type to create. + Optional arguments to pass to an initializing constructor of the JsonConverter. + If null, the default constructor is used. + + + + A kebab case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Represents a trace writer that writes to memory. When the trace message limit is + reached then old trace messages will be removed as new messages are added. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Initializes a new instance of the class. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Returns an enumeration of the most recent trace messages. + + An enumeration of the most recent trace messages. + + + + Returns a of the most recent trace messages. + + + A of the most recent trace messages. + + + + + A base class for resolving how property names and dictionary keys are serialized. + + + + + A flag indicating whether dictionary keys should be processed. + Defaults to false. + + + + + A flag indicating whether extension data names should be processed. + Defaults to false. + + + + + A flag indicating whether explicitly specified property names, + e.g. a property name customized with a , should be processed. + Defaults to false. + + + + + Gets the serialized name for a given property name. + + The initial property name. + A flag indicating whether the property has had a name explicitly specified. + The serialized property name. + + + + Gets the serialized name for a given extension data name. + + The initial extension data name. + The serialized extension data name. + + + + Gets the serialized key for a given dictionary key. + + The initial dictionary key. + The serialized dictionary key. + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Hash code calculation + + + + + + Object equality implementation + + + + + + + Compare to another NamingStrategy + + + + + + + Represents a method that constructs an object. + + The object type to create. + + + + When applied to a method, specifies that the method is called when an error occurs serializing an object. + + + + + Provides methods to get attributes from a , , or . + + + + + Initializes a new instance of the class. + + The instance to get attributes for. This parameter should be a , , or . + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Get and set values for a using reflection. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + A snake case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Specifies how strings are escaped when writing JSON text. + + + + + Only control characters (e.g. newline) are escaped. + + + + + All non-ASCII and control characters (e.g. newline) are escaped. + + + + + HTML (<, >, &, ', ") and control characters (e.g. newline) are escaped. + + + + + Indicates the method that will be used during deserialization for locating and loading assemblies. + + + + + In simple mode, the assembly used during deserialization need not match exactly the assembly used during serialization. Specifically, the version numbers need not match as the LoadWithPartialName method of the class is used to load the assembly. + + + + + In full mode, the assembly used during deserialization must match exactly the assembly used during serialization. The Load method of the class is used to load the assembly. + + + + + Specifies type name handling options for the . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Do not include the .NET type name when serializing types. + + + + + Include the .NET type name when serializing into a JSON object structure. + + + + + Include the .NET type name when serializing into a JSON array structure. + + + + + Always include the .NET type name when serializing. + + + + + Include the .NET type name when the type of the object being serialized is not the same as its declared type. + Note that this doesn't include the root serialized object by default. To include the root object's type name in JSON + you must specify a root type object with + or . + + + + + Determines whether the collection is null or empty. + + The collection. + + true if the collection is null or empty; otherwise, false. + + + + + Adds the elements of the specified collection to the specified generic . + + The list to add to. + The collection of elements to add. + + + + Converts the value to the specified type. If the value is unable to be converted, the + value is checked whether it assignable to the specified type. + + The value to convert. + The culture to use when converting. + The type to convert or cast the value to. + + The converted type. If conversion was unsuccessful, the initial value + is returned if assignable to the target type. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic that returns a result + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Returns a Restrictions object which includes our current restrictions merged + with a restriction limiting our type + + + + + Helper class for serializing immutable collections. + Note that this is used by all builds, even those that don't support immutable collections, in case the DLL is GACed + https://github.com/JamesNK/Newtonsoft.Json/issues/652 + + + + + Gets the type of the typed collection's items. + + The type. + The type of the typed collection's items. + + + + Gets the member's underlying type. + + The member. + The underlying type of the member. + + + + Determines whether the property is an indexed property. + + The property. + + true if the property is an indexed property; otherwise, false. + + + + + Gets the member's value on the object. + + The member. + The target object. + The member's value on the object. + + + + Sets the member's value on the target object. + + The member. + The target. + The value. + + + + Determines whether the specified MemberInfo can be read. + + The MemberInfo to determine whether can be read. + /// if set to true then allow the member to be gotten non-publicly. + + true if the specified MemberInfo can be read; otherwise, false. + + + + + Determines whether the specified MemberInfo can be set. + + The MemberInfo to determine whether can be set. + if set to true then allow the member to be set non-publicly. + if set to true then allow the member to be set if read-only. + + true if the specified MemberInfo can be set; otherwise, false. + + + + + Builds a string. Unlike this class lets you reuse its internal buffer. + + + + + Determines whether the string is all white space. Empty string will return false. + + The string to test whether it is all white space. + + true if the string is all white space; otherwise, false. + + + + + Specifies the state of the . + + + + + An exception has been thrown, which has left the in an invalid state. + You may call the method to put the in the Closed state. + Any other method calls result in an being thrown. + + + + + The method has been called. + + + + + An object is being written. + + + + + An array is being written. + + + + + A constructor is being written. + + + + + A property is being written. + + + + + A write method has not been called. + + + + Specifies that an output will not be null even if the corresponding type allows it. + + + Specifies that when a method returns , the parameter will not be null even if the corresponding type allows it. + + + Initializes the attribute with the specified return value condition. + + The return value condition. If the method returns this value, the associated parameter will not be null. + + + + Gets the return value condition. + + + Specifies that an output may be null even if the corresponding type disallows it. + + + Specifies that null is allowed as an input even if the corresponding type disallows it. + + + + Specifies that the method will not return if the associated Boolean parameter is passed the specified value. + + + + + Initializes a new instance of the class. + + + The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to + the associated parameter matches this value. + + + + Gets the condition parameter value. + + + diff --git a/TBF_V2/Sources/TBF/packages/Common/NlogConfig.xml b/TBF_V2/Sources/TBF/packages/Common/NlogConfig.xml new file mode 100644 index 00000000..8ddb1931 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Common/NlogConfig.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/Common/PdfSharp.xml b/TBF_V2/Sources/TBF/packages/Common/PdfSharp.xml new file mode 100644 index 00000000..8ac853e9 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Common/PdfSharp.xml @@ -0,0 +1,23546 @@ + + + + PdfSharp + + + + + Floating point formatting. + + + + + Factor to convert from degree to radian measure. + + + + + Sinus of the angle to turn a regular font to look oblique. Used for italic simulation. + + + + + Factor of the em size of a regular font to look bold. Used for bold simulation. + Value of 2% found in original XPS 1.0 documentation. + + + + + Static locking functions to make PDFsharp thread save. + + + + + A bunch of internal helper functions. + + + + + A bunch of internal helper functions. + + + + + Indirectly throws NotImplementedException. + Required because PDFsharp Release builds tread warnings as errors and + throwing NotImplementedException may lead to unreachable code which + crashes the build. + + + + + Helper class around the Debugger class. + + + + + Call Debugger.Break() if a debugger is attached. + + + + + Call Debugger.Break() if a debugger is attached or when always is set to true. + + + + + Internal stuff for development of PDFsharp. + + + + + Creates font and enforces bold/italic simulation. + + + + + Dumps the font caches to a string. + + + + + Some static helper functions for calculations. + + + + + Degree to radiant factor. + + + + + Get page size in point from specified PageSize. + + + + + Some floating point utilities. Partially reflected from WPF, later equalized with original source code. + + + + + Indicates whether the values are so close that they can be considered as equal. + + + + + Indicates whether the values are so close that they can be considered as equal. + + + + + Indicates whether the values are so close that they can be considered as equal. + + + + + Indicates whether the values are so close that they can be considered as equal. + + + + + Indicates whether the values are so close that they can be considered as equal. + + + + + Indicates whether the values are so close that they can be considered as equal. + + + + + Indicates whether value1 is greater than value2 and the values are not close to each other. + + + + + Indicates whether value1 is greater than value2 or the values are close to each other. + + + + + Indicates whether value1 is less than value2 and the values are not close to each other. + + + + + Indicates whether value1 is less than value2 or the values are close to each other. + + + + + Indicates whether the value is between 0 and 1 or close to 0 or 1. + + + + + Indicates whether the value is not a number. + + + + + Indicates whether at least one of the four rectangle values is not a number. + + + + + Indicates whether the value is 1 or close to 1. + + + + + Indicates whether the value is 0 or close to 0. + + + + + Converts a double to integer. + + + + + Required native Win32 calls. + + + + + Reflected from System.Drawing.SafeNativeMethods+LOGFONT + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Move to next token. + + + + + Move to next token. + + + + + Represents the base class of all bar codes. + + + + + Initializes a new instance of the class. + + + + + + + + Creates a bar code from the specified code type. + + + + + Creates a bar code from the specified code type. + + + + + Creates a bar code from the specified code type. + + + + + Creates a bar code from the specified code type. + + + + + When overridden in a derived class gets or sets the wide narrow ratio. + + + + + Gets or sets the location of the text next to the bar code. + + + + + Gets or sets the length of the data that defines the bar code. + + + + + Gets or sets the optional start character. + + + + + Gets or sets the optional end character. + + + + + Gets or sets a value indicating whether the turbo bit is to be drawn. + (A turbo bit is something special to Kern (computer output processing) company (as far as I know)) + + + + + When defined in a derived class renders the code. + + + + + Holds all temporary information needed during rendering. + + + + + String resources for the empira barcode renderer. + + + + + Implementation of the Code 2 of 5 bar code. + + + + + Initializes a new instance of Interleaved2of5. + + + + + Initializes a new instance of Interleaved2of5. + + + + + Initializes a new instance of Interleaved2of5. + + + + + Initializes a new instance of Interleaved2of5. + + + + + Returns an array of size 5 that represents the thick (true) and thin (false) lines or spaces + representing the specified digit. + + The digit to represent. + + + + Renders the bar code. + + + + + Calculates the thick and thin line widths, + taking into account the required rendering size. + + + + + Renders the next digit pair as bar code element. + + + + + Checks the code to be convertible into an interleaved 2 of 5 bar code. + + The code to be checked. + + + + Imlpementation of the Code 3 of 9 bar code. + + + + + Initializes a new instance of Standard3of9. + + + + + Initializes a new instance of Standard3of9. + + + + + Initializes a new instance of Standard3of9. + + + + + Initializes a new instance of Standard3of9. + + + + + Returns an array of size 9 that represents the thick (true) and thin (false) lines and spaces + representing the specified digit. + + The character to represent. + + + + Calculates the thick and thin line widths, + taking into account the required rendering size. + + + + + Checks the code to be convertible into an standard 3 of 9 bar code. + + The code to be checked. + + + + Renders the bar code. + + + + + Represents the base class of all codes. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the size. + + + + + Gets or sets the text the bar code shall represent. + + + + + Always MiddleCenter. + + + + + Gets or sets the drawing direction. + + + + + When implemented in a derived class, determines whether the specified string can be used as Text + for this bar code type. + + The code string to check. + True if the text can be used for the actual barcode. + + + + Calculates the distance between an old anchor point and a new anchor point. + + + + + + + + Defines the DataMatrix 2D barcode. THIS IS AN EMPIRA INTERNAL IMPLEMENTATION. THE CODE IN + THE OPEN SOURCE VERSION IS A FAKE. + + + + + Initializes a new instance of CodeDataMatrix. + + + + + Initializes a new instance of CodeDataMatrix. + + + + + Initializes a new instance of CodeDataMatrix. + + + + + Initializes a new instance of CodeDataMatrix. + + + + + Initializes a new instance of CodeDataMatrix. + + + + + Initializes a new instance of CodeDataMatrix. + + + + + Initializes a new instance of CodeDataMatrix. + + + + + Initializes a new instance of CodeDataMatrix. + + + + + Initializes a new instance of CodeDataMatrix. + + + + + Sets the encoding of the DataMatrix. + + + + + Gets or sets the size of the Matrix' Quiet Zone. + + + + + Renders the matrix code. + + + + + Determines whether the specified string can be used as data in the DataMatrix. + + The code to be checked. + + + + Represents an OMR code. + + + + + initializes a new OmrCode with the given data. + + + + + Renders the OMR code. + + + + + Gets or sets a value indicating whether a synchronize mark is rendered. + + + + + Gets or sets the distance of the markers. + + + + + Gets or sets the thickness of the makers. + + + + + Determines whether the specified string can be used as Text for the OMR code. + + + + + Creates the XImage object for a DataMatrix. + + + + + Possible ECC200 Matrices. + + + + + Creates the DataMatrix code. + + + + + Encodes the DataMatrix. + + + + + Encodes the barcode with the DataMatrix ECC200 Encoding. + + + + + Places the data in the right positions according to Annex M of the ECC200 specification. + + + + + Places the ECC200 bits in the right positions. + + + + + Calculate and append the Reed Solomon Code. + + + + + Initialize the Galois Field. + + + + + + Initializes the Reed-Solomon Encoder. + + + + + Encodes the Reed-Solomon encoding + + + + + Creates a DataMatrix image object. + + A hex string like "AB 08 C3...". + I.e. 26 for a 26x26 matrix + + + + Creates a DataMatrix image object. + + + + + Creates a DataMatrix image object. + + + + + Specifies whether and how the text is displayed at the code area. + + + + + The anchor is located top left. + + + + + The anchor is located top center. + + + + + The anchor is located top right. + + + + + The anchor is located middle left. + + + + + The anchor is located middle center. + + + + + The anchor is located middle right. + + + + + The anchor is located bottom left. + + + + + The anchor is located bottom center. + + + + + The anchor is located bottom right. + + + + + Specifies the drawing direction of the code. + + + + + Does not rotate the code. + + + + + Rotates the code 180° at the anchor position. + + + + + Rotates the code 180° at the anchor position. + + + + + Rotates the code 180° at the anchor position. + + + + + Specifies the type of the bar code. + + + + + The standard 2 of 5 interleaved bar code. + + + + + The standard 3 of 9 bar code. + + + + + The OMR code. + + + + + The data matrix code. + + + + + docDaSt + + + + + docDaSt + + + + + docDaSt + + + + + docDaSt + + + + + docDaSt + + + + + docDaSt + + + + + docDaSt + + + + + Specifies whether and how the text is displayed at the code. + + + + + No text is drawn. + + + + + The text is located above the code. + + + + + The text is located below the code. + + + + + The text is located above within the code. + + + + + The text is located below within the code. + + + + + Represents the base class of all 2D codes. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the encoding. docDaSt + + + + + docDaSt + + + + + docDaSt + + + + + docDaSt + + + + + When implemented in a derived class renders the 2D code. + + + + + Determines whether the specified string can be used as Text for this matrix code type. + + + + + Internal base class for several bar code types. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the ration between thick an thin lines. Must be between 2 and 3. + Optimal and also default value is 2.6. + + + + + Renders a thick or thin line for the bar code. + + + Determines whether a thick or a thin line is about to be rendered. + + + + Renders a thick or thin gap for the bar code. + + + Determines whether a thick or a thin gap is about to be rendered. + + + + Renders a thick bar before or behind the code. + + + + + Gets the width of a thick or a thin line (or gap). CalcLineWidth must have been called before. + + + Determines whether a thick line's with shall be returned. + + + + Specifies the alignment of a paragraph. + + + + + Default alignment, typically left alignment. + + + + + The paragraph is rendered left aligned. + + + + + The paragraph is rendered centered. + + + + + The paragraph is rendered right aligned. + + + + + The paragraph is rendered justified. + + + + + Represents a very simple text formatter. + If this class does not satisfy your needs on formatting paragraphs I recommend to take a look + at MigraDoc Foundation. Alternatively you should copy this class in your own source code and modify it. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the text. + + The text. + + + + Gets or sets the font. + + + + + Gets or sets the bounding box of the layout. + + + + + Gets or sets the alignment of the text. + + + + + Draws the text. + + The text to be drawn. + The font. + The text brush. + The layout rectangle. + + + + Draws the text. + + The text to be drawn. + The font. + The text brush. + The layout rectangle. + The format. Must be XStringFormat.TopLeft + + + + Align center, right, or justify. + + + + + Represents a single word. + + + + + Initializes a new instance of the class. + + The text of the block. + The type of the block. + The width of the text. + + + + Initializes a new instance of the class. + + The type. + + + + The text represented by this block. + + + + + The type of the block. + + + + + The width of the text. + + + + + The location relative to the upper left corner of the layout rectangle. + + + + + The alignment of this line. + + + + + A flag indicating that this is the last block that fits in the layout rectangle. + + + + + Indicates whether we are within a BT/ET block. + + + + + Graphic mode. This is default. + + + + + Text mode. + + + + + Represents the current PDF graphics state. + + + Completely revised for PDFsharp 1.4. + + + + + Indicates that the text transformation matrix currently skews 20° to the right. + + + + + The already realized part of the current transformation matrix. + + + + + The not yet realized part of the current transformation matrix. + + + + + Product of RealizedCtm and UnrealizedCtm. + + + + + Inverse of EffectiveCtm used for transformation. + + + + + Realizes the CTM. + + + + + Represents a drawing surface for PdfPages. + + + + + Gets the content created by this renderer. + + + + + Strokes a single connection of two points. + + + + + Strokes a series of connected points. + + + + + Clones the current graphics state and push it on a stack. + + + + + Sets the clip path empty. Only possible if graphic state level has the same value as it has when + the first time SetClip was invoked. + + + + + The nesting level of the PDF graphics state stack when the clip region was set to non empty. + Because of the way PDF is made the clip region can only be reset at this level. + + + + + Writes a comment to the PDF content stream. May be useful for debugging purposes. + + + + + Appends one or up to five Bézier curves that interpolate the arc. + + + + + Gets the quadrant (0 through 3) of the specified angle. If the angle lies on an edge + (0, 90, 180, etc.) the result depends on the details how the angle is used. + + + + + Appends a Bézier curve for an arc within a quadrant. + + + + + Appends a Bézier curve for a cardinal spline through pt1 and pt2. + + + + + Appends the content of a GraphicsPath object. + + + + + Initializes the default view transformation, i.e. the transformation from the user page + space to the PDF page space. + + + + + Ends the content stream, i.e. ends the text mode and balances the graphic state stack. + + + + + Begins the graphic mode (i.e. ends the text mode). + + + + + Begins the graphic mode (i.e. ends the text mode). + + + + + Makes the specified pen and brush to the current graphics objects. + + + + + Makes the specified pen to the current graphics object. + + + + + Makes the specified brush to the current graphics object. + + + + + Makes the specified font and brush to the current graphics objects. + + + + + PDFsharp uses the Td operator to set the text position. Td just sets the offset of the text matrix + and produces lesser code as Tm. + + The absolute text position. + The dy. + true if skewing for italic simulation is currently on. + + + + Makes the specified image to the current graphics object. + + + + + Realizes the current transformation matrix, if necessary. + + + + + Convert a point from Windows world space to PDF world space. + + + + + Gets the owning PdfDocument of this page or form. + + + + + Gets the PdfResources of this page or form. + + + + + Gets the size of this page or form. + + + + + Gets the resource name of the specified font within this page or form. + + + + + Gets the resource name of the specified image within this page or form. + + + + + Gets the resource name of the specified form within this page or form. + + + + + The q/Q nesting level is 0. + + + + + The q/Q nesting level is 1. + + + + + The q/Q nesting level is 2. + + + + + Saves the current graphical state. + + + + + Restores the previous graphical state. + + + + + The current graphical state. + + + + + The graphical state stack. + + + + + The height of the PDF page in point including the trim box. + + + + + The final transformation from the world space to the default page space. + + + + + Represents a graphics path that uses the same notation as GDI+. + + + + + Adds an arc that fills exactly one quadrant (quarter) of an ellipse. + Just a quick hack to draw rounded rectangles before AddArc is fully implemented. + + + + + Closes the current subpath. + + + + + Gets or sets the current fill mode (alternate or winding). + + + + + Gets the path points in GDI+ style. + + + + + Gets the path types in GDI+ style. + + + + + Defines the direction an elliptical arc is drawn. + + + + + Specifies that arcs are drawn in a counter clockwise (negative-angle) direction. + + + + + Specifies that arcs are drawn in a clockwise (positive-angle) direction. + + + + + Describes the simulation style of a font. + + + + + No font style simulation. + + + + + Bold style simulation. + + + + + Italic style simulation. + + + + + Bold and Italic style simulation. + + + + + Indicates how to handle the first point of a path. + + + + + Set the current position to the first point. + + + + + Draws a line to the first point. + + + + + Ignores the first point. + + + + + Currently not used. Only DeviceRGB is rendered in PDF. + + + + + Identifies the RGB color space. + + + + + Identifies the CMYK color space. + + + + + Identifies the gray scale color space. + + + + + Specifies how different clipping regions can be combined. + + + + + One clipping region is replaced by another. + + + + + Two clipping regions are combined by taking their intersection. + + + + + Not yet implemented in PDFsharp. + + + + + Not yet implemented in PDFsharp. + + + + + Not yet implemented in PDFsharp. + + + + + Not yet implemented in PDFsharp. + + + + + Specifies the style of dashed lines drawn with an XPen object. + + + + + Specifies a solid line. + + + + + Specifies a line consisting of dashes. + + + + + Specifies a line consisting of dots. + + + + + Specifies a line consisting of a repeating pattern of dash-dot. + + + + + Specifies a line consisting of a repeating pattern of dash-dot-dot. + + + + + Specifies a user-defined custom dash style. + + + + + Specifies how the interior of a closed path is filled. + + + + + Specifies the alternate fill mode. Called the 'odd-even rule' in PDF terminology. + + + + + Specifies the winding fill mode. Called the 'nonzero winding number rule' in PDF terminology. + + + + + Specifies style information applied to text. + + + + + Normal text. + + + + + Bold text. + + + + + Italic text. + + + + + Bold and italic text. + + + + + Underlined text. + + + + + Text with a line through the middle. + + + + + Backward compatibility. + + + + + Normal text. + + + + + Bold text. + + + + + Italic text. + + + + + Bold and italic text. + + + + + Underlined text. + + + + + Text with a line through the middle. + + + + + Determines whether rendering based on GDI+ or WPF. + For internal use in hybrid build only only. + + + + + Rendering does not depent on a particular technology. + + + + + Renders using GDI+. + + + + + Renders using WPF (including Silverlight). + + + + + Universal Windows Platform. + + + + + Type of the path data. + + + + + Specifies how the content of an existing PDF page and new content is combined. + + + + + The new content is inserted behind the old content and any subsequent drawing in done above the existing graphic. + + + + + The new content is inserted before the old content and any subsequent drawing in done beneath the existing graphic. + + + + + The new content entirely replaces the old content and any subsequent drawing in done on a blank page. + + + + + Specifies the unit of measure. + + + + + Specifies a printer's point (1/72 inch) as the unit of measure. + + + + + Specifies the inch (2.54 cm) as the unit of measure. + + + + + Specifies the millimeter as the unit of measure. + + + + + Specifies the centimeter as the unit of measure. + + + + + Specifies a presentation point (1/96 inch) as the unit of measure. + + + + + Specifies all pre-defined colors. Used to identify the pre-defined colors and to + localize their names. + + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + + Specifies the alignment of a text string relative to its layout rectangle + + + + + Specifies the text be aligned near the layout. + In a left-to-right layout, the near position is left. In a right-to-left layout, the near + position is right. + + + + + Specifies that text is aligned in the center of the layout rectangle. + + + + + Specifies that text is aligned far from the origin position of the layout rectangle. + In a left-to-right layout, the far position is right. In a right-to-left layout, the far + position is left. + + + + + Specifies that text is aligned relative to its base line. + With this option the layout rectangle must have a height of 0. + + + + + Specifies the direction of a linear gradient. + + + + + Specifies a gradient from left to right. + + + + + Specifies a gradient from top to bottom. + + + + + Specifies a gradient from upper left to lower right. + + + + + Specifies a gradient from upper right to lower left. + + + + + Specifies the available cap styles with which an XPen object can start and end a line. + + + + + Specifies a flat line cap. + + + + + Specifies a round line cap. + + + + + Specifies a square line cap. + + + + + Specifies how to join consecutive line or curve segments in a figure or subpath. + + + + + Specifies a mitered join. This produces a sharp corner or a clipped corner, + depending on whether the length of the miter exceeds the miter limit + + + + + Specifies a circular join. This produces a smooth, circular arc between the lines. + + + + + Specifies a beveled join. This produces a diagonal corner. + + + + + Specifies the order for matrix transform operations. + + + + + The new operation is applied before the old operation. + + + + + The new operation is applied after the old operation. + + + + + Specifies the direction of the y-axis. + + + + + Increasing Y values go downwards. This is the default. + + + + + Increasing Y values go upwards. This is only possible when drawing on a PDF page. + It is not implemented when drawing on a System.Drawing.Graphics object. + + + + + Specifies whether smoothing (or antialiasing) is applied to lines and curves + and the edges of filled areas. + + + + + Specifies an invalid mode. + + + + + Specifies the default mode. + + + + + Specifies high speed, low quality rendering. + + + + + Specifies high quality, low speed rendering. + + + + + Specifies no antialiasing. + + + + + Specifies antialiased rendering. + + + + + Specifies the alignment of a text string relative to its layout rectangle. + + + + + Specifies the text be aligned near the layout. + In a left-to-right layout, the near position is left. In a right-to-left layout, the near + position is right. + + + + + Specifies that text is aligned in the center of the layout rectangle. + + + + + Specifies that text is aligned far from the origin position of the layout rectangle. + In a left-to-right layout, the far position is right. In a right-to-left layout, the far + position is left. + + + + + Internal implementation class of XFontFamily. + + + + + Gets the family name this family was originally created with. + + + + + Gets the name that uniquely identifies this font family. + + + + + Gets the underlying GDI+ font family object. + Is null if the font was created by a font resolver. + + + + + Gets the DebuggerDisplayAttribute text. + + + + + A bunch of functions that do not have a better place. + + + + + Measure string directly from font data. + + + + + Calculates an Adler32 checksum combined with the buffer length + in a 64 bit unsigned integer. + + + + + Helper class for Geometry paths. + + + + + Creates between 1 and 5 Béziers curves from parameters specified like in GDI+. + + + + + Calculates the quadrant (0 through 3) of the specified angle. If the angle lies on an edge + (0, 90, 180, etc.) the result depends on the details how the angle is used. + + + + + Appends a Bézier curve for an arc within a full quadrant. + + + + + Creates between 1 and 5 Béziers curves from parameters specified like in WPF. + + + + + Represents a stack of XGraphicsState and XGraphicsContainer objects. + + + + + Helper class for processing image files. + + + + + Represents the internal state of an XGraphics object. + Used when the state is saved and restored. + + + + + Gets or sets the current transformation matrix. + + + + + Called after this instanced was pushed on the internal graphics stack. + + + + + Called after this instanced was popped from the internal graphics stack. + + + + + This interface will be implemented by specialized classes, one for JPEG, one for BMP, one for PNG, one for GIF. Maybe more. + + + + + Imports the image. Returns null if the image importer does not support the format. + + + + + Prepares the image data needed for the PDF file. + + + + + Helper for dealing with Stream data. + + + + + Resets this instance. + + + + + Gets the original stream. + + + + + Gets the data as byte[]. + + + + + Gets the length of Data. + + + + + The imported image. + + + + + Initializes a new instance of the class. + + + + + Gets information about the image. + + + + + Gets a value indicating whether image data for the PDF file was already prepared. + + + + + Gets the image data needed for the PDF file. + + + + + Public information about the image, filled immediately. + Note: The stream will be read and decoded on the first call to PrepareImageData(). + ImageInformation can be filled for corrupted images that will throw an expection on PrepareImageData(). + + + + + Standard JPEG format (RGB). + + + + + Grayscale JPEG format. + + + + + JPEG file with inverted CMYK, thus RGBW. + + + + + JPEG file with CMYK. + + + + + The horizontal DPI (dots per inch). Can be 0 if not supported by the image format. + Note: JFIF (JPEG) files may contain either DPI or DPM or just the aspect ratio. Windows BMP files will contain DPM. Other formats may support any combination, including none at all. + + + + + The vertical DPI (dots per inch). Can be 0 if not supported by the image format. + + + + + The horizontal DPM (dots per meter). Can be 0 if not supported by the image format. + + + + + The vertical DPM (dots per meter). Can be 0 if not supported by the image format. + + + + + The horizontal component of the aspect ratio. Can be 0 if not supported by the image format. + Note: Aspect ratio will be set if either DPI or DPM was set, but may also be available in the absence of both DPI and DPM. + + + + + The vertical component of the aspect ratio. Can be 0 if not supported by the image format. + + + + + The colors used. Only valid for images with palettes, will be 0 otherwise. + + + + + Contains internal data. This includes a reference to the Stream if data for PDF was not yet prepared. + + + + + Gets the image. + + + + + Contains data needed for PDF. Will be prepared when needed. + + + + + Bitmap refers to the format used in PDF. Will be used for BMP, PNG, TIFF, GIF and others. + + + + + Initializes a new instance of the class. + + + + + Contains data needed for PDF. Will be prepared when needed. + Bitmap refers to the format used in PDF. Will be used for BMP, PNG, TIFF, GIF and others. + + + + + Gets the data. + + + + + Gets the length. + + + + + Gets the data. + + + + + Gets the length. + + + + + Image data needed for PDF bitmap images. + + + + + Initializes a new instance of the class. + + + + + Gets the data. + + + + + Gets the length. + + + + + True if first line is the top line, false if first line is the bottom line of the image. When needed, lines will be reversed while converting data into PDF format. + + + + + The offset of the image data in Data. + + + + + The offset of the color palette in Data. + + + + + Copies images without color palette. + + 4 (32bpp RGB), 3 (24bpp RGB, 32bpp ARGB) + 8 + true (ARGB), false (RGB) + Destination + + + + Imported JPEG image. + + + + + Initializes a new instance of the class. + + + + + Contains data needed for PDF. Will be prepared when needed. + + + + + Gets the data. + + + + + Gets the length. + + + + + Private data for JPEG images. + + + + + Initializes a new instance of the class. + + + + + Gets the data. + + + + + Gets the length. + + + + + The class that imports images of various formats. + + + + + Gets the image importer. + + + + + Imports the image. + + + + + Imports the image. + + + + + Represents an abstract drawing surface for PdfPages. + + + + + Draws a straight line. + + + + + Draws a series of straight lines. + + + + + Draws a Bézier spline. + + + + + Draws a series of Bézier splines. + + + + + Draws a cardinal spline. + + + + + Draws an arc. + + + + + Draws a rectangle. + + + + + Draws a series of rectangles. + + + + + Draws a rectangle with rounded corners. + + + + + Draws an ellipse. + + + + + Draws a polygon. + + + + + Draws a pie. + + + + + Draws a cardinal spline. + + + + + Draws a graphical path. + + + + + Draws a series of glyphs identified by the specified text and font. + + + + + Draws an image. + + + + + Saves the current graphics state without changing it. + + + + + Restores the specified graphics state. + + + + + + + + + + + + + + + Gets or sets the transformation matrix. + + + + + Writes a comment to the output stream. Comments have no effect on the rendering of the output. + + + + + Specifies details about how the font is used in PDF creation. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Gets a value indicating the font embedding. + + + + + Gets a value indicating how the font is encoded. + + + + + Gets the default options with WinAnsi encoding and always font embedding. + + + + + Gets the default options with Unicode encoding and always font embedding. + + + + + Provides functionality to load a bitmap image encoded in a specific format. + + + + + Gets a new instance of the PNG image decoder. + + + + + Provides functionality to save a bitmap image in a specific format. + + + + + Gets a new instance of the PNG image encoder. + + + + + Gets or sets the bitmap source to be encoded. + + + + + When overridden in a derived class saves the image on the specified stream + in the respective format. + + + + + Saves the image on the specified stream in PNG format. + + + + + Defines a pixel based bitmap image. + + + + + Initializes a new instance of the class. + + + + + Creates a default 24 bit ARGB bitmap with the specified pixel size. + + + + + Classes derived from this abstract base class define objects used to fill the + interiors of paths. + + + + + Brushes for all the pre-defined colors. + + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + + Represents a RGB, CMYK, or gray scale color. + + + + + Creates an XColor structure from a 32-bit ARGB value. + + + + + Creates an XColor structure from a 32-bit ARGB value. + + + + + Creates an XColor structure from the specified 8-bit color values (red, green, and blue). + The alpha value is implicitly 255 (fully opaque). + + + + + Creates an XColor structure from the four ARGB component (alpha, red, green, and blue) values. + + + + + Creates an XColor structure from the specified alpha value and color. + + + + + Creates an XColor structure from the specified CMYK values. + + + + + Creates an XColor structure from the specified CMYK values. + + + + + Creates an XColor structure from the specified gray value. + + + + + Creates an XColor from the specified pre-defined color. + + + + + Creates an XColor from the specified name of a pre-defined color. + + + + + Gets or sets the color space to be used for PDF generation. + + + + + Indicates whether this XColor structure is uninitialized. + + + + + Determines whether the specified object is a Color structure and is equivalent to this + Color structure. + + + + + Returns the hash code for this instance. + + + + + Determines whether two colors are equal. + + + + + Determines whether two colors are not equal. + + + + + Gets a value indicating whether this color is a known color. + + + + + Gets the hue-saturation-brightness (HSB) hue value, in degrees, for this color. + + The hue, in degrees, of this color. The hue is measured in degrees, ranging from 0 through 360, in HSB color space. + + + + Gets the hue-saturation-brightness (HSB) saturation value for this color. + + The saturation of this color. The saturation ranges from 0 through 1, where 0 is grayscale and 1 is the most saturated. + + + + Gets the hue-saturation-brightness (HSB) brightness value for this color. + + The brightness of this color. The brightness ranges from 0 through 1, where 0 represents black and 1 represents white. + + + + One of the RGB values changed; recalculate other color representations. + + + + + One of the CMYK values changed; recalculate other color representations. + + + + + The gray scale value changed; recalculate other color representations. + + + + + Gets or sets the alpha value the specifies the transparency. + The value is in the range from 1 (opaque) to 0 (completely transparent). + + + + + Gets or sets the red value. + + + + + Gets or sets the green value. + + + + + Gets or sets the blue value. + + + + + Gets the RGB part value of the color. Internal helper function. + + + + + Gets the ARGB part value of the color. Internal helper function. + + + + + Gets or sets the cyan value. + + + + + Gets or sets the magenta value. + + + + + Gets or sets the yellow value. + + + + + Gets or sets the black (or key) value. + + + + + Gets or sets the gray scale value. + + + + + Represents the null color. + + + + + Special property for XmlSerializer only. + + + + + Manages the localization of the color class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The culture info. + + + + Gets a known color from an ARGB value. Throws an ArgumentException if the value is not a known color. + + + + + Gets all known colors. + + Indicates whether to include the color Transparent. + + + + Converts a known color to a localized color name. + + + + + Converts a color to a localized color name or an ARGB value. + + + + + Represents a set of 141 pre-defined RGB colors. Incidentally the values are the same + as in System.Drawing.Color. + + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + + Converts XGraphics enums to GDI+ enums. + + + + + Defines an object used to draw text. + + + + + Initializes a new instance of the class. + + Name of the font family. + The em size. + + + + Initializes a new instance of the class. + + Name of the font family. + The em size. + The font style. + + + + Initializes a new instance of the class. + + Name of the font family. + The em size. + The font style. + Additional PDF options. + + + + Initializes a new instance of the class with enforced style simulation. + Only for testing PDFsharp. + + + + + Initializes a new instance of the class from a System.Drawing.FontFamily. + + The System.Drawing.FontFamily. + The em size. + The font style. + + + + Initializes a new instance of the class from a System.Drawing.FontFamily. + + The System.Drawing.FontFamily. + The em size. + The font style. + Additional PDF options. + + + + Initializes a new instance of the class from a System.Drawing.Font. + + The System.Drawing.Font. + + + + Initializes a new instance of the class from a System.Drawing.Font. + + The System.Drawing.Font. + Additional PDF options. + + + + Initializes this instance by computing the glyph typeface, font family, font source and TrueType fontface. + (PDFsharp currently only deals with TrueType fonts.) + + + + + A GDI+ font object is used to setup the internal font objects. + + + + + Code separated from Metric getter to make code easier to debug. + (Setup properties in their getters caused side effects during debugging because Visual Studio calls a getter + to early to show its value in a debugger window.) + + + + + Gets the XFontFamily object associated with this XFont object. + + + + + WRONG: Gets the face name of this Font object. + Indeed it returns the font family name. + + + + + Gets the em-size of this font measured in the unit of this font object. + + + + + Gets style information for this Font object. + + + + + Indicates whether this XFont object is bold. + + + + + Indicates whether this XFont object is italic. + + + + + Indicates whether this XFont object is stroke out. + + + + + Indicates whether this XFont object is underlined. + + + + + Temporary HACK for XPS to PDF converter. + + + + + Gets the PDF options of the font. + + + + + Indicates whether this XFont is encoded as Unicode. + + + + + Gets the cell space for the font. The CellSpace is the line spacing, the sum of CellAscent and CellDescent and optionally some extra space. + + + + + Gets the cell ascent, the area above the base line that is used by the font. + + + + + Gets the cell descent, the area below the base line that is used by the font. + + + + + Gets the font metrics. + + The metrics. + + + + Returns the line spacing, in pixels, of this font. The line spacing is the vertical distance + between the base lines of two consecutive lines of text. Thus, the line spacing includes the + blank space between lines along with the height of the character itself. + + + + + Returns the line spacing, in the current unit of a specified Graphics object, of this font. + The line spacing is the vertical distance between the base lines of two consecutive lines of + text. Thus, the line spacing includes the blank space between lines along with the height of + + + + + Gets the line spacing of this font. + + + + + Override style simulations by using the value of StyleSimulations. + + + + + Used to enforce style simulations by renderer. For development purposes only. + + + + + Gets the GDI family. + + The GDI family. + + + + Implicit conversion form Font to XFont + + + + + Cache PdfFontTable.FontSelector to speed up finding the right PdfFont + if this font is used more than once. + + + + + Gets the DebuggerDisplayAttribute text. + + + + + Global cache of all internal font family objects. + + + + + Caches the font family or returns a previously cached one. + + + + + Gets the singleton. + + + + + Maps family name to internal font family. + + + + + Defines a group of typefaces having a similar basic design and certain variations in styles. + + + + + Initializes a new instance of the class. + + The family name of a font. + + + + Initializes a new instance of the class from FontFamilyInternal. + + + + + An XGlyphTypeface for a font source that comes from a custom font resolver + creates a solitary font family exclusively for it. + + + + + Gets the name of the font family. + + + + + Returns the cell ascent, in design units, of the XFontFamily object of the specified style. + + + + + Returns the cell descent, in design units, of the XFontFamily object of the specified style. + + + + + Gets the height, in font design units, of the em square for the specified style. + + + + + Returns the line spacing, in design units, of the FontFamily object of the specified style. + The line spacing is the vertical distance between the base lines of two consecutive lines of text. + + + + + Indicates whether the specified FontStyle enumeration is available. + + + + + Returns an array that contains all the FontFamily objects associated with the current graphics context. + + + + + Returns an array that contains all the FontFamily objects available for the specified + graphics context. + + + + + The implementation sigleton of font family; + + + + + Collects information of a font. + + + + + Gets the font name. + + + + + Gets the ascent value. + + + + + Gets the ascent value. + + + + + Gets the descent value. + + + + + Gets the average width. + + + + + Gets the height of capital letters. + + + + + Gets the leading value. + + + + + Gets the line spacing value. + + + + + Gets the maximum width of a character. + + + + + Gets an internal value. + + + + + Gets an internal value. + + + + + Gets the height of a lower-case character. + + + + + Gets the underline position. + + + + + Gets the underline thicksness. + + + + + Gets the strikethrough position. + + + + + Gets the strikethrough thicksness. + + + + + Represents a graphical object that can be used to render retained graphics on it. + In GDI+ it is represented by a Metafile, in WPF by a DrawingVisual, and in PDF by a Form XObjects. + + + + + The form is an imported PDF page. + + + + + The template is just created. + + + + + XGraphics.FromForm() was called. + + + + + The form was drawn at least once and is 'frozen' now. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class that represents a page of a PDF document. + + The PDF document. + The view box of the page. + + + + Initializes a new instance of the class that represents a page of a PDF document. + + The PDF document. + The size of the page. + + + + Initializes a new instance of the class that represents a page of a PDF document. + + The PDF document. + The width of the page. + The height of the page + + + + This function should be called when drawing the content of this form is finished. + The XGraphics object used for drawing the content is disposed by this function and + cannot be used for any further drawing operations. + PDFsharp automatically calls this function when this form was used the first time + in a DrawImage function. + + + + + Called from XGraphics constructor that creates an instance that work on this form. + + + + + Disposes this instance. + + + + + Sets the form in the state FormState.Finished. + + + + + Gets the owning document. + + + + + Gets the color model used in the underlying PDF document. + + + + + Gets a value indicating whether this instance is a template. + + + + + Get the width of the page identified by the property PageNumber. + + + + + Get the width of the page identified by the property PageNumber. + + + + + Get the width in point of this image. + + + + + Get the height in point of this image. + + + + + Get the width of the page identified by the property PageNumber. + + + + + Get the height of the page identified by the property PageNumber. + + + + + Get the size of the page identified by the property PageNumber. + + + + + Gets the view box of the form. + + + + + Gets 72, the horizontal resolution by design of a form object. + + + + + Gets 72 always, the vertical resolution by design of a form object. + + + + + Gets or sets the bounding box. + + + + + Gets or sets the transformation matrix. + + + + + Implements the interface because the primary function is internal. + + + + + Gets the resource name of the specified font within this form. + + + + + Tries to get the resource name of the specified font data within this form. + Returns null if no such font exists. + + + + + Gets the resource name of the specified font data within this form. + + + + + Gets the resource name of the specified image within this form. + + + + + Implements the interface because the primary function is internal. + + + + + Gets the resource name of the specified form within this form. + + + + + Implements the interface because the primary function is internal. + + + + + The PdfFormXObject gets invalid when PageNumber or transform changed. This is because a modification + of an XPdfForm must not change objects that are already been drawn. + + + + + The bytes of a font file. + + + + + Gets an existing font source or creates a new one. + A new font source is cached in font factory. + + + + + Gets or sets the fontface. + + + + + Gets the key that uniquely identifies this font source. + + + + + Gets the name of the font's name table. + + + + + Gets the bytes of the font. + + + + + Gets the DebuggerDisplayAttribute text. + + + + + Specifies a physical font face that corresponds to a font file on the disk or in memory. + + + + + Gets the name of the font face. This can be a file name, an uri, or a GUID. + + + + + Gets the English family name of the font, for example "Arial". + + + + + Gets the English subfamily name of the font, + for example "Bold". + + + + + Gets the English display name of the font, + for example "Arial italic". + + + + + Gets a value indicating whether the font weight is bold. + + + + + Gets a value indicating whether the font style is italic. + + + + + Gets the suffix of the face name in a PDF font and font descriptor. + The name based on the effective value of bold and italic from the OS/2 table. + + + + + Computes the bijective key for a typeface. + + + + + Computes the bijective key for a typeface. + + + + + Gets the DebuggerDisplayAttribute text. + + + + + Holds information about the current state of the XGraphics object. + + + + + Represents a drawing surface for a fixed size page. + + + + + Initializes a new instance of the XGraphics class for drawing on a PDF page. + + + + + Initializes a new instance of the XGraphics class used for drawing on a form. + + + + + Creates the measure context. This is a graphics context created only for querying measures of text. + Drawing on a measure context has no effect. + + + + + Creates a new instance of the XGraphics class from a PdfSharp.Pdf.PdfPage object. + + + + + Creates a new instance of the XGraphics class from a PdfSharp.Pdf.PdfPage object. + + + + + Creates a new instance of the XGraphics class from a PdfSharp.Pdf.PdfPage object. + + + + + Creates a new instance of the XGraphics class from a PdfSharp.Pdf.PdfPage object. + + + + + Creates a new instance of the XGraphics class from a PdfSharp.Pdf.PdfPage object. + + + + + Creates a new instance of the XGraphics class from a PdfSharp.Pdf.PdfPage object. + + + + + Creates a new instance of the XGraphics class from a PdfSharp.Pdf.PdfPage object. + + + + + Creates a new instance of the XGraphics class from a PdfSharp.Drawing.XPdfForm object. + + + + + Creates a new instance of the XGraphics class from a PdfSharp.Drawing.XForm object. + + + + + Creates a new instance of the XGraphics class from a PdfSharp.Drawing.XForm object. + + + + + Creates a new instance of the XGraphics class from a PdfSharp.Drawing.XImage object. + + + + + Internal setup. + + + + + Releases all resources used by this object. + + + + + Internal hack for MigraDoc. Will be removed in further releases. + Unicode support requires a global refactoring of MigraDoc and will be done in further releases. + + + + + A value indicating whether GDI+ or WPF is used as context. + + + + + Gets or sets the unit of measure used for page coordinates. + CURRENTLY ONLY POINT IS IMPLEMENTED. + + + + + Gets or sets the a value indicating in which direction y-value grow. + + + + + Gets the current page origin. Setting the origin is not yet implemented. + + + + + Gets the current size of the page. + + + + + Draws a line connecting two XPoint structures. + + + + + Draws a line connecting the two points specified by coordinate pairs. + + + + + Draws a series of line segments that connect an array of points. + + + + + Draws a series of line segments that connect an array of x and y pairs. + + + + + Draws a Bézier spline defined by four points. + + + + + Draws a Bézier spline defined by four points. + + + + + Draws a series of Bézier splines from an array of points. + + + + + Draws a cardinal spline through a specified array of points. + + + + + Draws a cardinal spline through a specified array of point using a specified tension. + The drawing begins offset from the beginning of the array. + + + + + Draws a cardinal spline through a specified array of points using a specified tension. + + + + + Draws an arc representing a portion of an ellipse. + + + + + Draws an arc representing a portion of an ellipse. + + + + + Draws a rectangle. + + + + + Draws a rectangle. + + + + + Draws a rectangle. + + + + + Draws a rectangle. + + + + + Draws a rectangle. + + + + + Draws a rectangle. + + + + + Draws a series of rectangles. + + + + + Draws a series of rectangles. + + + + + Draws a series of rectangles. + + + + + Draws a rectangles with round corners. + + + + + Draws a rectangles with round corners. + + + + + Draws a rectangles with round corners. + + + + + Draws a rectangles with round corners. + + + + + Draws a rectangles with round corners. + + + + + Draws a rectangles with round corners. + + + + + Draws an ellipse defined by a bounding rectangle. + + + + + Draws an ellipse defined by a bounding rectangle. + + + + + Draws an ellipse defined by a bounding rectangle. + + + + + Draws an ellipse defined by a bounding rectangle. + + + + + Draws an ellipse defined by a bounding rectangle. + + + + + Draws an ellipse defined by a bounding rectangle. + + + + + Draws a polygon defined by an array of points. + + + + + Draws a polygon defined by an array of points. + + + + + Draws a polygon defined by an array of points. + + + + + Draws a pie defined by an ellipse. + + + + + Draws a pie defined by an ellipse. + + + + + Draws a pie defined by an ellipse. + + + + + Draws a pie defined by an ellipse. + + + + + Draws a pie defined by an ellipse. + + + + + Draws a pie defined by an ellipse. + + + + + Draws a closed cardinal spline defined by an array of points. + + + + + Draws a closed cardinal spline defined by an array of points. + + + + + Draws a closed cardinal spline defined by an array of points. + + + + + Draws a closed cardinal spline defined by an array of points. + + + + + Draws a closed cardinal spline defined by an array of points. + + + + + Draws a closed cardinal spline defined by an array of points. + + + + + Draws a closed cardinal spline defined by an array of points. + + + + + Draws a closed cardinal spline defined by an array of points. + + + + + Draws a graphical path. + + + + + Draws a graphical path. + + + + + Draws a graphical path. + + + + + Draws the specified text string. + + + + + Draws the specified text string. + + + + + Draws the specified text string. + + + + + Draws the specified text string. + + + + + Draws the specified text string. + + + + + Draws the specified text string. + + + + + Measures the specified string when drawn with the specified font. + + + + + Measures the specified string when drawn with the specified font. + + + + + Draws the specified image. + + + + + Draws the specified image. + + + + + Draws the specified image. + + + + + Draws the specified image. + + + + + Draws the specified image. + + + + + Checks whether drawing is allowed and disposes the XGraphics object, if necessary. + + + + + Draws the specified bar code. + + + + + Draws the specified bar code. + + + + + Draws the specified bar code. + + + + + Draws the specified data matrix code. + + + + + Draws the specified data matrix code. + + + + + Saves the current state of this XGraphics object and identifies the saved state with the + returned XGraphicsState object. + + + + + Restores the state of this XGraphics object to the state represented by the specified + XGraphicsState object. + + + + + Restores the state of this XGraphics object to the state before the most recently call of Save. + + + + + Saves a graphics container with the current state of this XGraphics and + opens and uses a new graphics container. + + + + + Saves a graphics container with the current state of this XGraphics and + opens and uses a new graphics container. + + + + + Closes the current graphics container and restores the state of this XGraphics + to the state saved by a call to the BeginContainer method. + + + + + Gets the current graphics state level. The default value is 0. Each call of Save or BeginContainer + increased and each call of Restore or EndContainer decreased the value by 1. + + + + + Gets or sets the smoothing mode. + + The smoothing mode. + + + + Applies the specified translation operation to the transformation matrix of this object by + prepending it to the object's transformation matrix. + + + + + Applies the specified translation operation to the transformation matrix of this object + in the specified order. + + + + + Applies the specified scaling operation to the transformation matrix of this object by + prepending it to the object's transformation matrix. + + + + + Applies the specified scaling operation to the transformation matrix of this object + in the specified order. + + + + + Applies the specified scaling operation to the transformation matrix of this object by + prepending it to the object's transformation matrix. + + + + + Applies the specified scaling operation to the transformation matrix of this object + in the specified order. + + + + + Applies the specified scaling operation to the transformation matrix of this object by + prepending it to the object's transformation matrix. + + + + + Applies the specified scaling operation to the transformation matrix of this object by + prepending it to the object's transformation matrix. + + + + + Applies the specified rotation operation to the transformation matrix of this object by + prepending it to the object's transformation matrix. + + + + + Applies the specified rotation operation to the transformation matrix of this object + in the specified order. The angle unit of measure is degree. + + + + + Applies the specified rotation operation to the transformation matrix of this object by + prepending it to the object's transformation matrix. + + + + + Applies the specified rotation operation to the transformation matrix of this object by + prepending it to the object's transformation matrix. + + + + + Applies the specified shearing operation to the transformation matrix of this object by + prepending it to the object's transformation matrix. + ShearTransform is a synonym for SkewAtTransform. + Parameter shearX specifies the horizontal skew which is measured in degrees counterclockwise from the y-axis. + Parameter shearY specifies the vertical skew which is measured in degrees counterclockwise from the x-axis. + + + + + Applies the specified shearing operation to the transformation matrix of this object + in the specified order. + ShearTransform is a synonym for SkewAtTransform. + Parameter shearX specifies the horizontal skew which is measured in degrees counterclockwise from the y-axis. + Parameter shearY specifies the vertical skew which is measured in degrees counterclockwise from the x-axis. + + + + + Applies the specified shearing operation to the transformation matrix of this object by + prepending it to the object's transformation matrix. + ShearTransform is a synonym for SkewAtTransform. + Parameter shearX specifies the horizontal skew which is measured in degrees counterclockwise from the y-axis. + Parameter shearY specifies the vertical skew which is measured in degrees counterclockwise from the x-axis. + + + + + Applies the specified shearing operation to the transformation matrix of this object by + prepending it to the object's transformation matrix. + ShearTransform is a synonym for SkewAtTransform. + Parameter shearX specifies the horizontal skew which is measured in degrees counterclockwise from the y-axis. + Parameter shearY specifies the vertical skew which is measured in degrees counterclockwise from the x-axis. + + + + + Multiplies the transformation matrix of this object and specified matrix. + + + + + Multiplies the transformation matrix of this object and specified matrix in the specified order. + + + + + Gets the current transformation matrix. + The transformation matrix cannot be set. Instead use Save/Restore or BeginContainer/EndContainer to + save the state before Transform is called and later restore to the previous transform. + + + + + Applies a new transformation to the current transformation matrix. + + + + + Updates the clip region of this XGraphics to the intersection of the + current clip region and the specified rectangle. + + + + + Updates the clip region of this XGraphics to the intersection of the + current clip region and the specified graphical path. + + + + + Writes a comment to the output stream. Comments have no effect on the rendering of the output. + They may be useful to mark a position in a content stream of a PDF document. + + + + + Permits access to internal data. + + + + + (Under construction. May change in future versions.) + + + + + The transformation matrix from the XGraphics page space to the Graphics world space. + (The name 'default view matrix' comes from Microsoft OS/2 Presentation Manager. I choose + this name because I have no better one.) + + + + + Indicates whether to send drawing operations to _gfx or _dc. + + + + + Interface to an (optional) renderer. Currently it is the XGraphicsPdfRenderer, if defined. + + + + + The transformation matrix from XGraphics world space to page unit space. + + + + + The graphics state stack. + + + + + Gets the PDF page that serves as drawing surface if PDF is rendered, + or null, if no such object exists. + + + + + Provides access to internal data structures of the XGraphics class. + + + + + (This class is under construction.) + Currently used in MigraDoc + + + + + Gets the smallest rectangle in default page space units that completely encloses the specified rect + in world space units. + + + + + Represents the internal state of an XGraphics object. + + + + + Represents a series of connected lines and curves. + + + + + Initializes a new instance of the class. + + + + + Clones this instance. + + + + + Adds a line segment to current figure. + + + + + Adds a line segment to current figure. + + + + + Adds a series of connected line segments to current figure. + + + + + Adds a cubic Bézier curve to the current figure. + + + + + Adds a cubic Bézier curve to the current figure. + + + + + Adds a sequence of connected cubic Bézier curves to the current figure. + + + + + Adds a spline curve to the current figure. + + + + + Adds a spline curve to the current figure. + + + + + Adds a spline curve to the current figure. + + + + + Adds an elliptical arc to the current figure. + + + + + Adds an elliptical arc to the current figure. + + + + + Adds an elliptical arc to the current figure. The arc is specified WPF like. + + + + + Adds a rectangle to this path. + + + + + Adds a rectangle to this path. + + + + + Adds a series of rectangles to this path. + + + + + Adds a rectangle with rounded corners to this path. + + + + + Adds an ellipse to the current path. + + + + + Adds an ellipse to the current path. + + + + + Adds a polygon to this path. + + + + + Adds the outline of a pie shape to this path. + + + + + Adds the outline of a pie shape to this path. + + + + + Adds a closed curve to this path. + + + + + Adds a closed curve to this path. + + + + + Adds the specified path to this path. + + + + + Adds a text string to this path. + + + + + Adds a text string to this path. + + + + + Closes the current figure and starts a new figure. + + + + + Starts a new figure without closing the current figure. + + + + + Gets or sets an XFillMode that determines how the interiors of shapes are filled. + + + + + Converts each curve in this XGraphicsPath into a sequence of connected line segments. + + + + + Converts each curve in this XGraphicsPath into a sequence of connected line segments. + + + + + Converts each curve in this XGraphicsPath into a sequence of connected line segments. + + + + + Replaces this path with curves that enclose the area that is filled when this path is drawn + by the specified pen. + + + + + Replaces this path with curves that enclose the area that is filled when this path is drawn + by the specified pen. + + + + + Replaces this path with curves that enclose the area that is filled when this path is drawn + by the specified pen. + + + + + Grants access to internal objects of this class. + + + + + Gets access to underlying Core graphics path. + + + + + Provides access to the internal data structures of XGraphicsPath. + This class prevents the public interface from pollution with internal functions. + + + + + Represents the internal state of an XGraphics object. + This class is used as a handle for restoring the context. + + + + + Defines an abstract base class for pixel based images. + + + + + Gets the width of the image in pixels. + + + + + Gets the height of the image in pixels. + + + + + Defines an object used to draw image files (bmp, png, jpeg, gif) and PDF forms. + An abstract base class that provides functionality for the Bitmap and Metafile descended classes. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from an image read by ImageImporter. + + The image. + image + + + + Creates an image from the specified file. + + The path to a BMP, PNG, GIF, JPEG, TIFF, or PDF file. + + + + Creates an image from the specified stream.
+ Silverlight supports PNG and JPEG only. +
+ The stream containing a BMP, PNG, GIF, JPEG, TIFF, or PDF file. +
+ + + Tests if a file exist. Supports PDF files with page number suffix. + + The path to a BMP, PNG, GIF, JPEG, TIFF, or PDF file. + + + + Under construction + + + + + Disposes underlying GDI+ object. + + + + + Gets the width of the image. + + + + + Gets the height of the image. + + + + + The factor for conversion from DPM to PointWidth or PointHeight. + 72 points per inch, 1000 mm per meter, 25.4 mm per inch => 72 * 1000 / 25.4. + + + + + The factor for conversion from DPM to PointWidth or PointHeight. + 1000 mm per meter, 25.4 mm per inch => 1000 / 25.4. + + + + + Gets the width of the image in point. + + + + + Gets the height of the image in point. + + + + + Gets the width of the image in pixels. + + + + + Gets the height of the image in pixels. + + + + + Gets the size in point of the image. + + + + + Gets the horizontal resolution of the image. + + + + + Gets the vertical resolution of the image. + + + + + Gets or sets a flag indicating whether image interpolation is to be performed. + + + + + Gets the format of the image. + + + + + If path starts with '*' the image is created from a stream and the path is a GUID. + + + + + Contains a reference to the original stream if image was created from a stream. + + + + + Cache PdfImageTable.ImageSelector to speed up finding the right PdfImage + if this image is used more than once. + + + + + Specifies the format of the image. + + + + + Determines whether the specified object is equal to the current object. + + + + + Returns the hash code for this instance. + + + + + Gets the Portable Network Graphics (PNG) image format. + + + + + Gets the Graphics Interchange Format (GIF) image format. + + + + + Gets the Joint Photographic Experts Group (JPEG) image format. + + + + + Gets the Tag Image File Format (TIFF) image format. + + + + + Gets the Portable Document Format (PDF) image format + + + + + Gets the Windows icon image format. + + + + + Defines a Brush with a linear gradient. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Gets or sets an XMatrix that defines a local geometric transform for this LinearGradientBrush. + + + + + Translates the brush with the specified offset. + + + + + Translates the brush with the specified offset. + + + + + Scales the brush with the specified scalars. + + + + + Scales the brush with the specified scalars. + + + + + Rotates the brush with the specified angle. + + + + + Rotates the brush with the specified angle. + + + + + Multiply the brush transformation matrix with the specified matrix. + + + + + Multiply the brush transformation matrix with the specified matrix. + + + + + Resets the brush transformation matrix with identity matrix. + + + + + Represents a 3-by-3 matrix that represents an affine 2D transformation. + + + + + Initializes a new instance of the XMatrix struct. + + + + + Gets the identity matrix. + + + + + Sets this matrix into an identity matrix. + + + + + Gets a value indicating whether this matrix instance is the identity matrix. + + + + + Gets an array of double values that represents the elements of this matrix. + + + + + Multiplies two matrices. + + + + + Multiplies two matrices. + + + + + Appends the specified matrix to this matrix. + + + + + Prepends the specified matrix to this matrix. + + + + + Appends the specified matrix to this matrix. + + + + + Prepends the specified matrix to this matrix. + + + + + Multiplies this matrix with the specified matrix. + + + + + Appends a translation of the specified offsets to this matrix. + + + + + Appends a translation of the specified offsets to this matrix. + + + + + Prepends a translation of the specified offsets to this matrix. + + + + + Translates the matrix with the specified offsets. + + + + + Appends the specified scale vector to this matrix. + + + + + Appends the specified scale vector to this matrix. + + + + + Prepends the specified scale vector to this matrix. + + + + + Scales the matrix with the specified scalars. + + + + + Scales the matrix with the specified scalar. + + + + + Appends the specified scale vector to this matrix. + + + + + Prepends the specified scale vector to this matrix. + + + + + Scales the matrix with the specified scalar. + + + + + Function is obsolete. + + + + + Apppends the specified scale about the specified point of this matrix. + + + + + Prepends the specified scale about the specified point of this matrix. + + + + + Function is obsolete. + + + + + Appends a rotation of the specified angle to this matrix. + + + + + Prepends a rotation of the specified angle to this matrix. + + + + + Rotates the matrix with the specified angle. + + + + + Function is obsolete. + + + + + Appends a rotation of the specified angle at the specified point to this matrix. + + + + + Prepends a rotation of the specified angle at the specified point to this matrix. + + + + + Rotates the matrix with the specified angle at the specified point. + + + + + Appends a rotation of the specified angle at the specified point to this matrix. + + + + + Prepends a rotation of the specified angle at the specified point to this matrix. + + + + + Rotates the matrix with the specified angle at the specified point. + + + + + Function is obsolete. + + + + + Appends a skew of the specified degrees in the x and y dimensions to this matrix. + + + + + Prepends a skew of the specified degrees in the x and y dimensions to this matrix. + + + + + Shears the matrix with the specified scalars. + + + + + Function is obsolete. + + + + + Appends a skew of the specified degrees in the x and y dimensions to this matrix. + + + + + Prepends a skew of the specified degrees in the x and y dimensions to this matrix. + + + + + Transforms the specified point by this matrix and returns the result. + + + + + Transforms the specified points by this matrix. + + + + + Multiplies all points of the specified array with the this matrix. + + + + + Transforms the specified vector by this Matrix and returns the result. + + + + + Transforms the specified vectors by this matrix. + + + + + Gets the determinant of this matrix. + + + + + Gets a value that indicates whether this matrix is invertible. + + + + + Inverts the matrix. + + + + + Gets or sets the value of the first row and first column of this matrix. + + + + + Gets or sets the value of the first row and second column of this matrix. + + + + + Gets or sets the value of the second row and first column of this matrix. + + + + + Gets or sets the value of the second row and second column of this matrix. + + + + + Gets or sets the value of the third row and first column of this matrix. + + + + + Gets or sets the value of the third row and second column of this matrix. + + + + + Determines whether the two matrices are equal. + + + + + Determines whether the two matrices are not equal. + + + + + Determines whether the two matrices are equal. + + + + + Determines whether this matrix is equal to the specified object. + + + + + Determines whether this matrix is equal to the specified matrix. + + + + + Returns the hash code for this instance. + + + + + Parses a matrix from a string. + + + + + Converts this XMatrix to a human readable string. + + + + + Converts this XMatrix to a human readable string. + + + + + Converts this XMatrix to a human readable string. + + + + + Sets the matrix. + + + + + Internal matrix helper. + + + + + Gets the DebuggerDisplayAttribute text. + + The debugger display. + + + + Represents a so called 'PDF form external object', which is typically an imported page of an external + PDF document. XPdfForm objects are used like images to draw an existing PDF page of an external + document in the current document. XPdfForm objects can only be placed in PDF documents. If you try + to draw them using a XGraphics based on an GDI+ context no action is taken if no placeholder image + is specified. Otherwise the place holder is drawn. + + + + + Initializes a new instance of the XPdfForm class from the specified path to an external PDF document. + Although PDFsharp internally caches XPdfForm objects it is recommended to reuse XPdfForm objects + in your code and change the PageNumber property if more than one page is needed form the external + document. Furthermore, because XPdfForm can occupy very much memory, it is recommended to + dispose XPdfForm objects if not needed anymore. + + + + + Initializes a new instance of the class from a stream. + + The stream. + + + + Creates an XPdfForm from a file. + + + + + Creates an XPdfForm from a stream. + + + + + Sets the form in the state FormState.Finished. + + + + + Frees the memory occupied by the underlying imported PDF document, even if other XPdfForm objects + refer to this document. A reuse of this object doesn't fail, because the underlying PDF document + is re-imported if necessary. + + + + + Gets or sets an image that is used for drawing if the current XGraphics object cannot handle + PDF forms. A place holder is useful for showing a preview of a page on the display, because + PDFsharp cannot render native PDF objects. + + + + + Gets the underlying PdfPage (if one exists). + + + + + Gets the number of pages in the PDF form. + + + + + Gets the width in point of the page identified by the property PageNumber. + + + + + Gets the height in point of the page identified by the property PageNumber. + + + + + Gets the width in point of the page identified by the property PageNumber. + + + + + Gets the height in point of the page identified by the property PageNumber. + + + + + Gets the width in point of the page identified by the property PageNumber. + + + + + Gets the height in point of the page identified by the property PageNumber. + + + + + Get the size of the page identified by the property PageNumber. + + + + + Gets or sets the transformation matrix. + + + + + Gets or sets the page number in the external PDF document this object refers to. The page number + is one-based, i.e. it is in the range from 1 to PageCount. The default value is 1. + + + + + Gets or sets the page index in the external PDF document this object refers to. The page index + is zero-based, i.e. it is in the range from 0 to PageCount - 1. The default value is 0. + + + + + Gets the underlying document from which pages are imported. + + + + + Extracts the page number if the path has the form 'MyFile.pdf#123' and returns + the actual path without the number sign and the following digits. + + + + + Defines an object used to draw lines and curves. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Clones this instance. + + + + + Gets or sets the color. + + + + + Gets or sets the width. + + + + + Gets or sets the line join. + + + + + Gets or sets the line cap. + + + + + Gets or sets the miter limit. + + + + + Gets or sets the dash style. + + + + + Gets or sets the dash offset. + + + + + Gets or sets the dash pattern. + + + + + Gets or sets a value indicating whether the pen enables overprint when used in a PDF document. + Experimental, takes effect only on CMYK color mode. + + + + + Pens for all the pre-defined colors. + + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + + Represents a pair of floating point x- and y-coordinates that defines a point + in a two-dimensional plane. + + + + + Initializes a new instance of the XPoint class with the specified coordinates. + + + + + Determines whether two points are equal. + + + + + Determines whether two points are not equal. + + + + + Indicates whether the specified points are equal. + + + + + Indicates whether this instance and a specified object are equal. + + + + + Indicates whether this instance and a specified point are equal. + + + + + Returns the hash code for this instance. + + + + + Parses the point from a string. + + + + + Parses an array of points from a string. + + + + + Gets the x-coordinate of this XPoint. + + + + + Gets the x-coordinate of this XPoint. + + + + + Converts this XPoint to a human readable string. + + + + + Converts this XPoint to a human readable string. + + + + + Converts this XPoint to a human readable string. + + + + + Implements ToString. + + + + + Offsets the x and y value of this point. + + + + + Adds a point and a vector. + + + + + Adds a point and a size. + + + + + Adds a point and a vector. + + + + + Subtracts a vector from a point. + + + + + Subtracts a vector from a point. + + + + + Subtracts a point from a point. + + + + + Subtracts a size from a point. + + + + + Subtracts a point from a point. + + + + + Multiplies a point with a matrix. + + + + + Multiplies a point with a matrix. + + + + + Multiplies a point with a scalar value. + + + + + Multiplies a point with a scalar value. + + + + + Performs an explicit conversion from XPoint to XSize. + + + + + Performs an explicit conversion from XPoint to XVector. + + + + + Gets the DebuggerDisplayAttribute text. + + + + + Makes fonts that are not installed on the system available within the current application domain.
+ In Silverlight required for all fonts used in PDF documents. +
+
+ + + Initializes a new instance of the class. + + + + + Gets the global font collection. + + + + + Adds the specified font data to the global PrivateFontCollection. + Family name and style are automatically retrieved from the font. + + + + + Adds the specified font data to the global PrivateFontCollection. + Family name and style are automatically retrieved from the font. + + + + + Stores a set of four floating-point numbers that represent the location and size of a rectangle. + + + + + Initializes a new instance of the XRect class. + + + + + Initializes a new instance of the XRect class. + + + + + Initializes a new instance of the XRect class. + + + + + Initializes a new instance of the XRect class. + + + + + Initializes a new instance of the XRect class. + + + + + Creates a rectangle from for straight lines. + + + + + Determines whether the two rectangles are equal. + + + + + Determines whether the two rectangles are not equal. + + + + + Determines whether the two rectangles are equal. + + + + + Determines whether this instance and the specified object are equal. + + + + + Determines whether this instance and the specified rect are equal. + + + + + Returns the hash code for this instance. + + + + + Parses the rectangle from a string. + + + + + Converts this XRect to a human readable string. + + + + + Converts this XRect to a human readable string. + + + + + Converts this XRect to a human readable string. + + + + + Gets the empty rectangle. + + + + + Gets a value indicating whether this instance is empty. + + + + + Gets or sets the location of the rectangle. + + + + + Gets or sets the size of the rectangle. + + + + + Gets or sets the X value of the rectangle. + + + + + Gets or sets the Y value of the rectangle. + + + + + Gets or sets the width of the rectangle. + + + + + Gets or sets the height of the rectangle. + + + + + Gets the x-axis value of the left side of the rectangle. + + + + + Gets the y-axis value of the top side of the rectangle. + + + + + Gets the x-axis value of the right side of the rectangle. + + + + + Gets the y-axis value of the bottom side of the rectangle. + + + + + Gets the position of the top-left corner of the rectangle. + + + + + Gets the position of the top-right corner of the rectangle. + + + + + Gets the position of the bottom-left corner of the rectangle. + + + + + Gets the position of the bottom-right corner of the rectangle. + + + + + Gets the center of the rectangle. + + + + + Indicates whether the rectangle contains the specified point. + + + + + Indicates whether the rectangle contains the specified point. + + + + + Indicates whether the rectangle contains the specified rectangle. + + + + + Indicates whether the specified rectangle intersects with the current rectangle. + + + + + Sets current rectangle to the intersection of the current rectangle and the specified rectangle. + + + + + Returns the intersection of two rectangles. + + + + + Sets current rectangle to the union of the current rectangle and the specified rectangle. + + + + + Returns the union of two rectangles. + + + + + Sets current rectangle to the union of the current rectangle and the specified point. + + + + + Returns the intersection of a rectangle and a point. + + + + + Moves a rectangle by the specified amount. + + + + + Moves a rectangle by the specified amount. + + + + + Returns a rectangle that is offset from the specified rectangle by using the specified vector. + + + + + Returns a rectangle that is offset from the specified rectangle by using specified horizontal and vertical amounts. + + + + + Translates the rectangle by adding the specified point. + + + + + Translates the rectangle by subtracting the specified point. + + + + + Expands the rectangle by using the specified Size, in all directions. + + + + + Expands or shrinks the rectangle by using the specified width and height amounts, in all directions. + + + + + Returns the rectangle that results from expanding the specified rectangle by the specified Size, in all directions. + + + + + Creates a rectangle that results from expanding or shrinking the specified rectangle by the specified width and height amounts, in all directions. + + + + + Returns the rectangle that results from applying the specified matrix to the specified rectangle. + + + + + Transforms the rectangle by applying the specified matrix. + + + + + Multiplies the size of the current rectangle by the specified x and y values. + + + + + Gets the DebuggerDisplayAttribute text. + + The debugger display. + + + + Represents a pair of floating-point numbers, typically the width and height of a + graphical object. + + + + + Initializes a new instance of the XPoint class with the specified values. + + + + + Determines whether two size objects are equal. + + + + + Determines whether two size objects are not equal. + + + + + Indicates whether this two instance are equal. + + + + + Indicates whether this instance and a specified object are equal. + + + + + Indicates whether this instance and a specified size are equal. + + + + + Returns the hash code for this instance. + + + + + Parses the size from a string. + + + + + Converts this XSize to an XPoint. + + + + + Converts this XSize to an XVector. + + + + + Converts this XSize to a human readable string. + + + + + Converts this XSize to a human readable string. + + + + + Converts this XSize to a human readable string. + + + + + Returns an empty size, i.e. a size with a width or height less than 0. + + + + + Gets a value indicating whether this instance is empty. + + + + + Gets or sets the width. + + + + + Gets or sets the height. + + + + + Performs an explicit conversion from XSize to XVector. + + + + + Performs an explicit conversion from XSize to XPoint. + + + + + Gets the DebuggerDisplayAttribute text. + + The debugger display. + + + + Defines a single color object used to fill shapes and draw text. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the color of this brush. + + + + + Gets or sets a value indicating whether the brush enables overprint when used in a PDF document. + Experimental, takes effect only on CMYK color mode. + + + + + Represents the text layout information. + + + + + Initializes a new instance of the class. + + + + + Gets or sets horizontal text alignment information. + + + + + Gets or sets the line alignment. + + + + + Gets a new XStringFormat object that aligns the text left on the base line. + + + + + Gets a new XStringFormat object that aligns the text top left of the layout rectangle. + + + + + Gets a new XStringFormat object that centers the text in the middle of the layout rectangle. + + + + + Gets a new XStringFormat object that centers the text at the top of the layout rectangle. + + + + + Gets a new XStringFormat object that centers the text at the bottom of the layout rectangle. + + + + + Represents predefined text layouts. + + + + + Gets a new XStringFormat object that aligns the text left on the base line. + This is the same as BaseLineLeft. + + + + + Gets a new XStringFormat object that aligns the text left on the base line. + This is the same as Default. + + + + + Gets a new XStringFormat object that aligns the text top left of the layout rectangle. + + + + + Gets a new XStringFormat object that aligns the text center left of the layout rectangle. + + + + + Gets a new XStringFormat object that aligns the text bottom left of the layout rectangle. + + + + + Gets a new XStringFormat object that centers the text in the middle of the base line. + + + + + Gets a new XStringFormat object that centers the text at the top of the layout rectangle. + + + + + Gets a new XStringFormat object that centers the text in the middle of the layout rectangle. + + + + + Gets a new XStringFormat object that centers the text at the bottom of the layout rectangle. + + + + + Gets a new XStringFormat object that aligns the text in right on the base line. + + + + + Gets a new XStringFormat object that aligns the text top right of the layout rectangle. + + + + + Gets a new XStringFormat object that aligns the text center right of the layout rectangle. + + + + + Gets a new XStringFormat object that aligns the text at the bottom right of the layout rectangle. + + + + + Represents a value and its unit of measure. The structure converts implicitly from and to + double with a value measured in point. + + + + + Initializes a new instance of the XUnit class with type set to point. + + + + + Initializes a new instance of the XUnit class. + + + + + Gets the raw value of the object without any conversion. + To determine the XGraphicsUnit use property Type. + To get the value in point use the implicit conversion to double. + + + + + Gets the unit of measure. + + + + + Gets or sets the value in point. + + + + + Gets or sets the value in inch. + + + + + Gets or sets the value in millimeter. + + + + + Gets or sets the value in centimeter. + + + + + Gets or sets the value in presentation units (1/96 inch). + + + + + Returns the object as string using the format information. + The unit of measure is appended to the end of the string. + + + + + Returns the object as string using the specified format and format information. + The unit of measure is appended to the end of the string. + + + + + Returns the object as string. The unit of measure is appended to the end of the string. + + + + + Returns the unit of measure of the object as a string like 'pt', 'cm', or 'in'. + + + + + Returns an XUnit object. Sets type to point. + + + + + Returns an XUnit object. Sets type to inch. + + + + + Returns an XUnit object. Sets type to millimeters. + + + + + Returns an XUnit object. Sets type to centimeters. + + + + + Returns an XUnit object. Sets type to Presentation. + + + + + Converts a string to an XUnit object. + If the string contains a suffix like 'cm' or 'in' the object will be converted + to the appropriate type, otherwise point is assumed. + + + + + Converts an int to an XUnit object with type set to point. + + + + + Converts a double to an XUnit object with type set to point. + + + + + Returns a double value as point. + + + + + Memberwise comparison. To compare by value, + use code like Math.Abs(a.Pt - b.Pt) < 1e-5. + + + + + Memberwise comparison. To compare by value, + use code like Math.Abs(a.Pt - b.Pt) < 1e-5. + + + + + Calls base class Equals. + + + + + Returns the hash code for this instance. + + + + + This member is intended to be used by XmlDomainObjectReader only. + + + + + Converts an existing object from one unit into another unit type. + + + + + Represents a unit with all values zero. + + + + + Gets the DebuggerDisplayAttribute text. + + The debugger display. + + + + Represents a two-dimensional vector specified by x- and y-coordinates. + + + + + Gets the DebuggerDisplayAttribute text. + + The debugger display. + + + + Identifies the technology of an OpenType font file. + + + + + Font is Adobe Postscript font in CFF. + + + + + Font is a TrueType font. + + + + + Font is a TrueType font collection. + + + + + TrueType font table names. + + + + + Character to glyph mapping. + + + + + Font header . + + + + + Horizontal header. + + + + + Horizontal Metrics. + + + + + Maximum profile. + + + + + Naming table. + + + + + OS/2 and Windows specific Metrics. + + + + + PostScript information. + + + + + Control Value Table. + + + + + Font program. + + + + + Glyph data. + + + + + Index to location. + + + + + CVT Program. + + + + + PostScript font program (compact font format). + + + + + Vertical Origin. + + + + + Embedded bitmap data. + + + + + Embedded bitmap location data. + + + + + Embedded bitmap scaling data. + + + + + Baseline data. + + + + + Glyph definition data. + + + + + Glyph positioning data. + + + + + Glyph substitution data. + + + + + Justification data. + + + + + Digital signature. + + + + + Grid-fitting/Scan-conversion. + + + + + Horizontal device Metrics. + + + + + Kerning. + + + + + Linear threshold data. + + + + + PCL 5 data. + + + + + Vertical device Metrics. + + + + + Vertical Header. + + + + + Vertical Metrics. + + + + + Base class for all font descriptors. + Currently only OpenTypeDescriptor is derived from this base class. + + + + + + + + + + + + + + + Gets a value indicating whether this instance belongs to a bold font. + + + + + + + + + + Gets a value indicating whether this instance belongs to an italic font. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This table contains information that describes the glyphs in the font in the TrueType outline format. + Information regarding the rasterizer (scaler) refers to the TrueType rasterizer. + http://www.microsoft.com/typography/otspec/glyf.htm + + + + + Converts the bytes in a handy representation + + + + + Gets the data of the specified glyph. + + + + + Gets the size of the byte array that defines the glyph. + + + + + Gets the offset of the specified glyph relative to the first byte of the font image. + + + + + Adds for all composite glyphs the glyphs the composite one is made of. + + + + + If the specified glyph is a composite glyph add the glyphs it is made of to the glyph table. + + + + + Prepares the font table to be compiled into its binary representation. + + + + + Converts the font into its binary representation. + + + + + Global table of all OpenType fontfaces cached by their face name and check sum. + + + + + Tries to get fontface by its key. + + + + + Tries to get fontface by its check sum. + + + + + Gets the singleton. + + + + + Maps face name to OpenType fontface. + + + + + Maps font source key to OpenType fontface. + + + + + Gets the DebuggerDisplayAttribute text. + + + + + Global table of all glyph typefaces. + + + + + Gets the singleton. + + + + + Maps typeface key to glyph typeface. + + + + + The indexToLoc table stores the offsets to the locations of the glyphs in the font, + relative to the beginning of the glyphData table. In order to compute the length of + the last glyph element, there is an extra entry after the last valid index. + + + + + Converts the bytes in a handy representation + + + + + Prepares the font table to be compiled into its binary representation. + + + + + Converts the font into its binary representation. + + + + + Represents an indirect reference to an existing font table in a font image. + Used to create binary copies of an existing font table that is not modified. + + + + + Prepares the font table to be compiled into its binary representation. + + + + + Converts the font into its binary representation. + + + + + The OpenType font descriptor. + Currently the only font type PDFsharp supports. + + + + + New... + + + + + Gets a value indicating whether this instance belongs to a bold font. + + + + + Gets a value indicating whether this instance belongs to an italic font. + + + + + Maps a unicode to the index of the corresponding glyph. + See OpenType spec "cmap - Character To Glyph Index Mapping Table / Format 4: Segment mapping to delta values" + for details about this a little bit strange looking algorithm. + + + + + Converts the width of a glyph identified by its index to PDF design units. + + + + + //Converts the width of a glyph identified by its index to PDF design units. + + + + + //Converts the width of a glyph identified by its index to PDF design units. + + + + + Represents an OpenType fontface in memory. + + + + + Shallow copy for font subset. + + + + + Initializes a new instance of the class. + + + + + Gets the full face name from the name table. + Name is also used as the key. + + + + + Gets the bytes that represents the font data. + + + + + The dictionary of all font tables. + + + + + Adds the specified table to this font image. + + + + + Reads all required tables from the font data. + + + + + Creates a new font image that is a subset of this font image containing only the specified glyphs. + + + + + Compiles the font to its binary representation. + + + + + Reads a System.Byte. + + + + + Reads a System.Int16. + + + + + Reads a System.UInt16. + + + + + Reads a System.Int32. + + + + + Reads a System.UInt32. + + + + + Reads a System.Int32. + + + + + Reads a System.Int16. + + + + + Reads a System.UInt16. + + + + + Reads a System.Int64. + + + + + Reads a System.String with the specified size. + + + + + Reads a System.Byte[] with the specified size. + + + + + Reads the specified buffer. + + + + + Reads the specified buffer. + + + + + Reads a System.Char[4] as System.String. + + + + + Gets the DebuggerDisplayAttribute text. + + + + + Represents the font offset table. + + + + + 0x00010000 for Version 1.0. + + + + + Number of tables. + + + + + (Maximum power of 2 ≤ numTables) x 16. + + + + + Log2(maximum power of 2 ≤ numTables). + + + + + NumTables x 16-searchRange. + + + + + Writes the offset table. + + + + + Base class for all OpenType tables used in PDFsharp. + + + + + Creates a deep copy of the current instance. + + + + + Gets the font image the table belongs to. + + + + + When overridden in a derived class, prepares the font table to be compiled into its binary representation. + + + + + When overridden in a derived class, converts the font into its binary representation. + + + + + Calculates the checksum of a table represented by its bytes. + + + + + Only Symbol and Unicode is used by PDFsharp. + + + + + CMap format 4: Segment mapping to delta values. + The Windows standard format. + + + + + This table defines the mapping of character codes to the glyph index values used in the font. + It may contain more than one subtable, in order to support more than one character encoding scheme. + + + + + Is true for symbol font encoding. + + + + + Initializes a new instance of the class. + + + + + This table gives global information about the font. The bounding box values should be computed using + only glyphs that have contours. Glyphs with no contours should be ignored for the purposes of these calculations. + + + + + This table contains information for horizontal layout. The values in the minRightSidebearing, + MinLeftSideBearing and xMaxExtent should be computed using only glyphs that have contours. + Glyphs with no contours should be ignored for the purposes of these calculations. + All reserved areas must be set to 0. + + + + + The type longHorMetric is defined as an array where each element has two parts: + the advance width, which is of type USHORT, and the left side bearing, which is of type SHORT. + These fields are in font design units. + + + + + The vertical Metrics table allows you to specify the vertical spacing for each glyph in a + vertical font. This table consists of either one or two arrays that contain metric + information (the advance heights and top sidebearings) for the vertical layout of each + of the glyphs in the font. + + + + + This table establishes the memory requirements for this font. + Fonts with CFF data must use Version 0.5 of this table, specifying only the numGlyphs field. + Fonts with TrueType outlines must use Version 1.0 of this table, where all data is required. + Both formats of OpenType require a 'maxp' table because a number of applications call the + Windows GetFontData() API on the 'maxp' table to determine the number of glyphs in the font. + + + + + The naming table allows multilingual strings to be associated with the OpenTypeTM font file. + These strings can represent copyright notices, font names, family names, style names, and so on. + To keep this table short, the font manufacturer may wish to make a limited set of entries in some + small set of languages; later, the font can be "localized" and the strings translated or added. + Other parts of the OpenType font file that require these strings can then refer to them simply by + their index number. Clients that need a particular string can look it up by its platform ID, character + encoding ID, language ID and name ID. Note that some platforms may require single byte character + strings, while others may require double byte strings. + + For historical reasons, some applications which install fonts perform Version control using Macintosh + platform (platform ID 1) strings from the 'name' table. Because of this, we strongly recommend that + the 'name' table of all fonts include Macintosh platform strings and that the syntax of the Version + number (name id 5) follows the guidelines given in this document. + + + + + Get the font family name. + + + + + Get the font subfamily name. + + + + + Get the full font name. + + + + + The OS/2 table consists of a set of Metrics that are required in OpenType fonts. + + + + + This table contains additional information needed to use TrueType or OpenTypeTM fonts + on PostScript printers. + + + + + This table contains a list of values that can be referenced by instructions. + They can be used, among other things, to control characteristics for different glyphs. + The length of the table must be an integral number of FWORD units. + + + + + This table is similar to the CVT Program, except that it is only run once, when the font is first used. + It is used only for FDEFs and IDEFs. Thus the CVT Program need not contain function definitions. + However, the CVT Program may redefine existing FDEFs or IDEFs. + + + + + The Control Value Program consists of a set of TrueType instructions that will be executed whenever the font or + point size or transformation matrix change and before each glyph is interpreted. Any instruction is legal in the + CVT Program but since no glyph is associated with it, instructions intended to move points within a particular + glyph outline cannot be used in the CVT Program. The name 'prep' is anachronistic. + + + + + This table contains information that describes the glyphs in the font in the TrueType outline format. + Information regarding the rasterizer (scaler) refers to the TrueType rasterizer. + + + + + Represents a writer for True Type font files. + + + + + Initializes a new instance of the class. + + + + + Writes a table name. + + + + + Represents an entry in the fonts table dictionary. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + 4 -byte identifier. + + + + + CheckSum for this table. + + + + + Offset from beginning of TrueType font file. + + + + + Actual length of this table in bytes. + + + + + Gets the length rounded up to a multiple of four bytes. + + + + + Associated font table. + + + + + Creates and reads a TableDirectoryEntry from the font image. + + + + + Helper class that determines the characters used in a particular font. + + + + + Adds the characters of the specified string to the hashtable. + + + + + Adds the glyphIndices to the hashtable. + + + + + Adds a ANSI characters. + + + + + Parameters that affect font selection. + + + + + Represents a font resolver info created by the platform font resolver. + + + + + Default platform specific font resolving. + + + + + Resolves the typeface by generating a font resolver info. + + Name of the font family. + Indicates whether a bold font is requested. + Indicates whether an italic font is requested. + + + + Internal implementation. + + + + + Create a GDI+ font and use its handle to retrieve font data using native calls. + + + + + Describes the physical font that must be used to render a particular XFont. + + + + + Initializes a new instance of the struct. + + The name that uniquely identifies the fontface. + + + + Initializes a new instance of the struct. + + The name that uniquely identifies the fontface. + Set to true to simulate bold when rendered. Not implemented and must be false. + Set to true to simulate italic when rendered. + Index of the font in a true type font collection. + Not yet implemented and must be zero. + + + + + Initializes a new instance of the struct. + + The name that uniquely identifies the fontface. + Set to true to simulate bold when rendered. Not implemented and must be false. + Set to true to simulate italic when rendered. + + + + Initializes a new instance of the struct. + + The name that uniquely identifies the fontface. + The style simulation flags. + + + + Gets the key for this object. + + + + + A name that uniquely identifies the font (not the family), e.g. the file name of the font. PDFsharp does not use this + name internally, but passes it to the GetFont function of the IFontResolver interface to retrieve the font data. + + + + + Indicates whether bold must be simulated. Bold simulation is not implemented in PDFsharp. + + + + + Indicates whether italic must be simulated. + + + + + Gets the style simulation flags. + + + + + The number of the font in a Truetype font collection file. The number of the first font is 0. + NOT YET IMPLEMENTED. Must be zero. + + + + + Gets the DebuggerDisplayAttribute text. + + + + + Provides functionality that converts a requested typeface into a physical font. + + + + + Converts specified information about a required typeface into a specific font. + + Name of the font family. + Set to true when a bold fontface is required. + Set to true when an italic fontface is required. + Information about the physical font, or null if the request cannot be satisfied. + + + + Gets the bytes of a physical font with specified face name. + + A face name previously retrieved by ResolveTypeface. + + + + Provides functionality to specify information about the handling of fonts in the current application domain. + + + + + The name of the default font. + + + + + Gets or sets the global font resolver for the current application domain. + This static function must be called only once and before any font operation was executed by PDFsharp. + If this is not easily to obtain, e.g. because your code is running on a web server, you must provide the + same instance of your font resolver in every subsequent setting of this property. + In a web application set the font resolver in Global.asax. + + + + + Gets or sets the default font encoding used for XFont objects where encoding is not explicitly specified. + If it is not set, the default value is PdfFontEncoding.Unicode. + If you are sure your document contains only Windows-1252 characters (see https://en.wikipedia.org/wiki/Windows-1252) + set default encoding to PdfFontEncodingj.Windows1252. + Must be set only once per app domain. + + + + + Global table of OpenType font descriptor objects. + + + + + Gets the FontDescriptor identified by the specified XFont. If no such object + exists, a new FontDescriptor is created and added to the cache. + + + + + Gets the FontDescriptor identified by the specified FontSelector. If no such object + exists, a new FontDescriptor is created and added to the stock. + + + + + Gets the singleton. + + + + + Maps font font descriptor key to font descriptor. + + + + + Provides functionality to map a fontface request to a physical font. + + + + + Converts specified information about a required typeface into a specific font. + + Name of the font family. + The font resolving options. + Typeface key if already known by caller, null otherwise. + + Information about the typeface, or null if no typeface can be found. + + + + + Gets the bytes of a physical font with specified face name. + + + + + Gets the bytes of a physical font with specified face name. + + + + + Gets a value indicating whether at least one font source was created. + + + + + Caches a font source under its face name and its key. + + + + + Caches a font source under its face name and its key. + + + + + Maps font typeface key to font resolver info. + + + + + Maps typeface key or font name to font source. + + + + + Maps font source key to font source. + + + + + Represents a writer for generation of font file streams. + + + + + Initializes a new instance of the class. + Data is written in Motorola format (big-endian). + + + + + Closes the writer and, if specified, the underlying stream. + + + + + Closes the writer and the underlying stream. + + + + + Gets or sets the position within the stream. + + + + + Writes the specified value to the font stream. + + + + + Writes the specified value to the font stream. + + + + + Writes the specified value to the font stream using big-endian. + + + + + Writes the specified value to the font stream using big-endian. + + + + + Writes the specified value to the font stream using big-endian. + + + + + Writes the specified value to the font stream using big-endian. + + + + + Writes the specified value to the font stream using big-endian. + + + + + Writes the specified value to the font stream using big-endian. + + + + + Gets the underlying stream. + + + + + Specifies the flags of AcroForm fields. + + + + + If set, the user may not change the value of the field. Any associated widget + annotations will not interact with the user; that is, they will not respond to + mouse clicks or change their appearance in response to mouse motions. This + flag is useful for fields whose values are computed or imported from a database. + + + + + If set, the field must have a value at the time it is exported by a submit-form action. + + + + + If set, the field must not be exported by a submit-form action. + + + + + If set, the field is a pushbutton that does not retain a permanent value. + + + + + If set, the field is a set of radio buttons; if clear, the field is a checkbox. + This flag is meaningful only if the Pushbutton flag is clear. + + + + + (Radio buttons only) If set, exactly one radio button must be selected at all times; + clicking the currently selected button has no effect. If clear, clicking + the selected button deselects it, leaving no button selected. + + + + + If set, the field may contain multiple lines of text; if clear, the field’s text + is restricted to a single line. + + + + + If set, the field is intended for entering a secure password that should + not be echoed visibly to the screen. Characters typed from the keyboard + should instead be echoed in some unreadable form, such as + asterisks or bullet characters. + To protect password confidentiality, viewer applications should never + store the value of the text field in the PDF file if this flag is set. + + + + + (PDF 1.4) If set, the text entered in the field represents the pathname of + a file whose contents are to be submitted as the value of the field. + + + + + (PDF 1.4) If set, the text entered in the field will not be spell-checked. + + + + + (PDF 1.4) If set, the field will not scroll (horizontally for single-line + fields, vertically for multiple-line fields) to accommodate more text + than will fit within its annotation rectangle. Once the field is full, no + further text will be accepted. + + + + + If set, the field is a combo box; if clear, the field is a list box. + + + + + If set, the combo box includes an editable text box as well as a drop list; + if clear, it includes only a drop list. This flag is meaningful only if the + Combo flag is set. + + + + + If set, the field’s option items should be sorted alphabetically. This flag is + intended for use by form authoring tools, not by PDF viewer applications; + viewers should simply display the options in the order in which they occur + in the Opt array. + + + + + (PDF 1.4) If set, more than one of the field’s option items may be selected + simultaneously; if clear, no more than one item at a time may be selected. + + + + + (PDF 1.4) If set, the text entered in the field will not be spell-checked. + This flag is meaningful only if the Combo and Edit flags are both set. + + + + + Represents the base class for all interactive field dictionaries. + + + + + Initializes a new instance of PdfAcroField. + + + + + Initializes a new instance of the class. Used for type transformation. + + + + + Gets the name of this field. + + + + + Gets the field flags of this instance. + + + + + Gets or sets the value of the field. + + + + + Gets or sets a value indicating whether the field is read only. + + + + + Gets the field with the specified name. + + + + + Gets a child field by name. + + + + + Indicates whether the field has child fields. + + + + + Gets the names of all descendants of this field. + + + + + Gets the names of all descendants of this field. + + + + + Gets the names of all appearance dictionaries of this AcroField. + + + + + Gets the collection of fields within this field. + + + + + Holds a collection of interactive fields. + + + + + Gets the number of elements in the array. + + + + + Gets the names of all fields in the collection. + + + + + Gets an array of all descendant names. + + + + + Gets a field from the collection. For your convenience an instance of a derived class like + PdfTextField or PdfCheckBox is returned if PDFsharp can guess the actual type of the dictionary. + If the actual type cannot be guessed by PDFsharp the function returns an instance + of PdfGenericField. + + + + + Gets the field with the specified name. + + + + + Create a derived type like PdfTextField or PdfCheckBox if possible. + If the actual cannot be guessed by PDFsharp the function returns an instance + of PdfGenericField. + + + + + Predefined keys of this dictionary. + The description comes from PDF 1.4 Reference. + + + + + (Required for terminal fields; inheritable) The type of field that this dictionary + describes: + Btn Button + Tx Text + Ch Choice + Sig (PDF 1.3) Signature + Note: This entry may be present in a nonterminal field (one whose descendants + are themselves fields) in order to provide an inheritable FT value. However, a + nonterminal field does not logically have a type of its own; it is merely a container + for inheritable attributes that are intended for descendant terminal fields of + any type. + + + + + (Required if this field is the child of another in the field hierarchy; absent otherwise) + The field that is the immediate parent of this one (the field, if any, whose Kids array + includes this field). A field can have at most one parent; that is, it can be included + in the Kids array of at most one other field. + + + + + (Optional) An array of indirect references to the immediate children of this field. + + + + + (Optional) The partial field name. + + + + + (Optional; PDF 1.3) An alternate field name, to be used in place of the actual + field name wherever the field must be identified in the user interface (such as + in error or status messages referring to the field). This text is also useful + when extracting the document’s contents in support of accessibility to disabled + users or for other purposes. + + + + + (Optional; PDF 1.3) The mapping name to be used when exporting interactive form field + data from the document. + + + + + (Optional; inheritable) A set of flags specifying various characteristics of the field. + Default value: 0. + + + + + (Optional; inheritable) The field’s value, whose format varies depending on + the field type; see the descriptions of individual field types for further information. + + + + + (Optional; inheritable) The default value to which the field reverts when a + reset-form action is executed. The format of this value is the same as that of V. + + + + + (Optional; PDF 1.2) An additional-actions dictionary defining the field’s behavior + in response to various trigger events. This entry has exactly the same meaning as + the AA entry in an annotation dictionary. + + + + + (Required; inheritable) A resource dictionary containing default resources + (such as fonts, patterns, or color spaces) to be used by the appearance stream. + At a minimum, this dictionary must contain a Font entry specifying the resource + name and font dictionary of the default font for displaying the field’s text. + + + + + (Required; inheritable) The default appearance string, containing a sequence of + valid page-content graphics or text state operators defining such properties as + the field’s text size and color. + + + + + (Optional; inheritable) A code specifying the form of quadding (justification) + to be used in displaying the text: + 0 Left-justified + 1 Centered + 2 Right-justified + Default value: 0 (left-justified). + + + + + Represents an interactive form (or AcroForm), a collection of fields for + gathering information interactively from the user. + + + + + Initializes a new instance of AcroForm. + + + + + Gets the fields collection of this form. + + + + + Predefined keys of this dictionary. + The description comes from PDF 1.4 Reference. + + + + + (Required) An array of references to the document’s root fields (those with + no ancestors in the field hierarchy). + + + + + (Optional) A flag specifying whether to construct appearance streams and + appearance dictionaries for all widget annotations in the document. + Default value: false. + + + + + (Optional; PDF 1.3) A set of flags specifying various document-level characteristics + related to signature fields. + Default value: 0. + + + + + (Required if any fields in the document have additional-actions dictionaries + containing a C entry; PDF 1.3) An array of indirect references to field dictionaries + with calculation actions, defining the calculation order in which their values will + be recalculated when the value of any field changes. + + + + + (Optional) A document-wide default value for the DR attribute of variable text fields. + + + + + (Optional) A document-wide default value for the DA attribute of variable text fields. + + + + + (Optional) A document-wide default value for the Q attribute of variable text fields. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents the base class for all button fields. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Gets the name which represents the opposite of /Off. + + + + + Predefined keys of this dictionary. + The description comes from PDF 1.4 Reference. + + + + + Represents the check box field. + + + + + Initializes a new instance of PdfCheckBoxField. + + + + + Indicates whether the field is checked. + + + + + Gets or sets the name of the dictionary that represents the Checked state. + + The default value is "/Yes". + + + + Gets or sets the name of the dictionary that represents the Unchecked state. + The default value is "/Off". + + + + + Predefined keys of this dictionary. + The description comes from PDF 1.4 Reference. + + + + + (Optional; inheritable; PDF 1.4) A text string to be used in place of the V entry for the + value of the field. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents the base class for all choice field dictionaries. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Gets the index of the specified string in the /Opt array or -1, if no such string exists. + + + + + Gets the value from the index in the /Opt array. + + + + + Predefined keys of this dictionary. + The description comes from PDF 1.4 Reference. + + + + + (Required; inheritable) An array of options to be presented to the user. Each element of + the array is either a text string representing one of the available options or a two-element + array consisting of a text string together with a default appearance string for constructing + the item’s appearance dynamically at viewing time. + + + + + (Optional; inheritable) For scrollable list boxes, the top index (the index in the Opt array + of the first option visible in the list). + + + + + (Sometimes required, otherwise optional; inheritable; PDF 1.4) For choice fields that allow + multiple selection (MultiSelect flag set), an array of integers, sorted in ascending order, + representing the zero-based indices in the Opt array of the currently selected option + items. This entry is required when two or more elements in the Opt array have different + names but the same export value, or when the value of the choice field is an array; in + other cases, it is permitted but not required. If the items identified by this entry differ + from those in the V entry of the field dictionary (see below), the V entry takes precedence. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents the combo box field. + + + + + Initializes a new instance of PdfComboBoxField. + + + + + Gets or sets the index of the selected item. + + + + + Gets or sets the value of the field. + + + + + Predefined keys of this dictionary. + The description comes from PDF 1.4 Reference. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents a generic field. Used for AcroForm dictionaries unknown to PDFsharp. + + + + + Initializes a new instance of PdfGenericField. + + + + + Predefined keys of this dictionary. + The description comes from PDF 1.4 Reference. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents the list box field. + + + + + Initializes a new instance of PdfListBoxField. + + + + + Gets or sets the index of the selected item + + + + + Predefined keys of this dictionary. + The description comes from PDF 1.4 Reference. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents the push button field. + + + + + Initializes a new instance of PdfPushButtonField. + + + + + Predefined keys of this dictionary. + The description comes from PDF 1.4 Reference. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents the radio button field. + + + + + Initializes a new instance of PdfRadioButtonField. + + + + + Gets or sets the index of the selected radio button in a radio button group. + + + + + Predefined keys of this dictionary. + The description comes from PDF 1.4 Reference. + + + + + (Optional; inheritable; PDF 1.4) An array of text strings to be used in + place of the V entries for the values of the widget annotations representing + the individual radio buttons. Each element in the array represents + the export value of the corresponding widget annotation in the + Kids array of the radio button field. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents the signature field. + + + + + Initializes a new instance of PdfSignatureField. + + + + + Predefined keys of this dictionary. + The description comes from PDF 1.4 Reference. + + + + + (Optional) The type of PDF object that this dictionary describes; if present, + must be Sig for a signature dictionary. + + + + + (Required; inheritable) The name of the signature handler to be used for + authenticating the field’s contents, such as Adobe.PPKLite, Entrust.PPKEF, + CICI.SignIt, or VeriSign.PPKVS. + + + + + (Optional) The name of a specific submethod of the specified handler. + + + + + (Required) An array of pairs of integers (starting byte offset, length in bytes) + describing the exact byte range for the digest calculation. Multiple discontinuous + byte ranges may be used to describe a digest that does not include the + signature token itself. + + + + + (Required) The encrypted signature token. + + + + + (Optional) The name of the person or authority signing the document. + + + + + (Optional) The time of signing. Depending on the signature handler, this + may be a normal unverified computer time or a time generated in a verifiable + way from a secure time server. + + + + + (Optional) The CPU host name or physical location of the signing. + + + + + (Optional) The reason for the signing, such as (I agree…). + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents the text field. + + + + + Initializes a new instance of PdfTextField. + + + + + Gets or sets the text value of the text field. + + + + + Gets or sets the font used to draw the text of the field. + + + + + Gets or sets the foreground color of the field. + + + + + Gets or sets the background color of the field. + + + + + Gets or sets the maximum length of the field. + + The length of the max. + + + + Gets or sets a value indicating whether the field has multiple lines. + + + + + Gets or sets a value indicating whether this field is used for passwords. + + + + + Creates the normal appearance form X object for the annotation that represents + this acro form text field. + + + + + Predefined keys of this dictionary. + The description comes from PDF 1.4 Reference. + + + + + (Optional; inheritable) The maximum length of the field’s text, in characters. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Specifies the predefined PDF actions. + + + + + Go to next page. + + + + + Go to previous page. + + + + + Go to first page. + + + + + Go to last page. + + + + + Represents a PDF Goto actions. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The document that owns this object. + + + + Predefined keys of this dictionary. + + + + + (Required) The destination to jump to (see Section 8.2.1, “Destinations”). + + + + + Represents the base class for all PDF actions. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The document that owns this object. + + + + Predefined keys of this dictionary. + + + + + (Optional) The type of PDF object that this dictionary describes; + if present, must be Action for an action dictionary. + + + + + (Required) The type of action that this dictionary describes. + + + + + (Optional; PDF 1.2) The next action or sequence of actions to be performed + after the action represented by this dictionary. The value is either a + single action dictionary or an array of action dictionaries to be performed + in order; see below for further discussion. + + + + + Represents the catalog dictionary. + + + + + Initializes a new instance of the class. + + + + + Get or sets the version of the PDF specification to which the document conforms. + + + + + Gets the pages collection of this document. + + + + + Implementation of PdfDocument.PageLayout. + + + + + Implementation of PdfDocument.PageMode. + + + + + Implementation of PdfDocument.ViewerPreferences. + + + + + Implementation of PdfDocument.Outlines. + + + + + Gets the AcroForm dictionary of this document. + + + + + Gets or sets the language identifier specifying the natural language for all text in the document. + Sample values are 'en-US' for 'English United States' or 'de-DE' for 'deutsch Deutschland' (i.e. 'German Germany'). + + + + + Dispatches PrepareForSave to the objects that need it. + + + + + Predefined keys of this dictionary. + + + + + (Required) The type of PDF object that this dictionary describes; + must be Catalog for the catalog dictionary. + + + + + (Optional; PDF 1.4) The version of the PDF specification to which the document + conforms (for example, 1.4) if later than the version specified in the file’s header. + If the header specifies a later version, or if this entry is absent, the document + conforms to the version specified in the header. This entry enables a PDF producer + application to update the version using an incremental update. + + + + + (Required; must be an indirect reference) The page tree node that is the root of + the document’s page tree. + + + + + (Optional; PDF 1.3) A number tree defining the page labeling for the document. + The keys in this tree are page indices; the corresponding values are page label dictionaries. + Each page index denotes the first page in a labeling range to which the specified page + label dictionary applies. The tree must include a value for pageindex 0. + + + + + (Optional; PDF 1.2) The document’s name dictionary. + + + + + (Optional; PDF 1.1; must be an indirect reference) A dictionary of names and + corresponding destinations. + + + + + (Optional; PDF 1.2) A viewer preferences dictionary specifying the way the document + is to be displayed on the screen. If this entry is absent, applications should use + their own current user preference settings. + + + + + (Optional) A name object specifying the page layout to be used when the document is + opened: + SinglePage - Display one page at a time. + OneColumn - Display the pages in one column. + TwoColumnLeft - Display the pages in two columns, with oddnumbered pages on the left. + TwoColumnRight - Display the pages in two columns, with oddnumbered pages on the right. + TwoPageLeft - (PDF 1.5) Display the pages two at a time, with odd-numbered pages on the left + TwoPageRight - (PDF 1.5) Display the pages two at a time, with odd-numbered pages on the right. + + + + + (Optional) A name object specifying how the document should be displayed when opened: + UseNone - Neither document outline nor thumbnail images visible. + UseOutlines - Document outline visible. + UseThumbs - Thumbnail images visible. + FullScreen - Full-screen mode, with no menu bar, windowcontrols, or any other window visible. + UseOC - (PDF 1.5) Optional content group panel visible. + UseAttachments (PDF 1.6) Attachments panel visible. + Default value: UseNone. + + + + + (Optional; must be an indirect reference) The outline dictionary that is the root + of the document’s outline hierarchy. + + + + + (Optional; PDF 1.1; must be an indirect reference) An array of thread dictionaries + representing the document’s article threads. + + + + + (Optional; PDF 1.1) A value specifying a destination to be displayed or an action to be + performed when the document is opened. The value is either an array defining a destination + or an action dictionary representing an action. If this entry is absent, the document + should be opened to the top of the first page at the default magnification factor. + + + + + (Optional; PDF 1.4) An additional-actions dictionary defining the actions to be taken + in response to various trigger events affecting the document as a whole. + + + + + (Optional; PDF 1.1) A URI dictionary containing document-level information for URI + (uniform resource identifier) actions. + + + + + (Optional; PDF 1.2) The document’s interactive form (AcroForm) dictionary. + + + + + (Optional; PDF 1.4; must be an indirect reference) A metadata stream + containing metadata for the document. + + + + + (Optional; PDF 1.3) The document’s structure tree root dictionary. + + + + + (Optional; PDF 1.4) A mark information dictionary containing information + about the document’s usage of Tagged PDF conventions. + + + + + (Optional; PDF 1.4) A language identifier specifying the natural language for all + text in the document except where overridden by language specifications for structure + elements or marked content. If this entry is absent, the language is considered unknown. + + + + + (Optional; PDF 1.3) A Web Capture information dictionary containing state information + used by the Acrobat Web Capture (AcroSpider) plugin extension. + + + + + (Optional; PDF 1.4) An array of output intent dictionaries describing the color + characteristics of output devices on which the document might be rendered. + + + + + (Optional; PDF 1.4) A page-piece dictionary associated with the document. + + + + + (Optional; PDF 1.5; required if a document contains optional content) The document’s + optional content properties dictionary. + + + + + (Optional; PDF 1.5) A permissions dictionary that specifies user access permissions + for the document. + + + + + (Optional; PDF 1.5) A dictionary containing attestations regarding the content of a + PDF document, as it relates to the legality of digital signatures. + + + + + (Optional; PDF 1.7) An array of requirement dictionaries representing + requirements for the document. + + + + + (Optional; PDF 1.7) A collection dictionary that a PDF consumer uses to enhance + the presentation of file attachments stored in the PDF document. + + + + + (Optional; PDF 1.7) A flag used to expedite the display of PDF documents containing XFA forms. + It specifies whether the document must be regenerated when the document is first opened. + If true, the viewer application treats the document as a shell and regenerates the content + when the document is opened, regardless of any dynamic forms settings that appear in the XFA + stream itself. This setting is used to expedite the display of documents whose layout varies + depending on the content of the XFA streams. + If false, the viewer application does not regenerate the content when the document is opened. + See the XML Forms Architecture (XFA) Specification (Bibliography). + Default value: false. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents a CIDFont dictionary. + + + + + Prepares the object to get saved. + + + + + Predefined keys of this dictionary. + + + + + (Required) The type of PDF object that this dictionary describes; + must be Font for a CIDFont dictionary. + + + + + (Required) The type of CIDFont; CIDFontType0 or CIDFontType2. + + + + + (Required) The PostScript name of the CIDFont. For Type 0 CIDFonts, this + is usually the value of the CIDFontName entry in the CIDFont program. For + Type 2 CIDFonts, it is derived the same way as for a simple TrueType font; + In either case, the name can have a subset prefix if appropriate. + + + + + (Required) A dictionary containing entries that define the character collection + of the CIDFont. + + + + + (Required; must be an indirect reference) A font descriptor describing the + CIDFont’s default metrics other than its glyph widths. + + + + + (Optional) The default width for glyphs in the CIDFont. + Default value: 1000. + + + + + (Optional) A description of the widths for the glyphs in the CIDFont. The + array’s elements have a variable format that can specify individual widths + for consecutive CIDs or one width for a range of CIDs. + Default value: none (the DW value is used for all glyphs). + + + + + (Optional; applies only to CIDFonts used for vertical writing) An array of two + numbers specifying the default metrics for vertical writing. + Default value: [880 −1000]. + + + + + (Optional; applies only to CIDFonts used for vertical writing) A description + of the metrics for vertical writing for the glyphs in the CIDFont. + Default value: none (the DW2 value is used for all glyphs). + + + + + (Optional; Type 2 CIDFonts only) A specification of the mapping from CIDs + to glyph indices. If the value is a stream, the bytes in the stream contain the + mapping from CIDs to glyph indices: the glyph index for a particular CID + value c is a 2-byte value stored in bytes 2 × c and 2 × c + 1, where the first + byte is the high-order byte. If the value of CIDToGIDMap is a name, it must + be Identity, indicating that the mapping between CIDs and glyph indices is + the identity mapping. + Default value: Identity. + This entry may appear only in a Type 2 CIDFont whose associated True-Type font + program is embedded in the PDF file. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents the content of a page. PDFsharp supports only one content stream per page. + If an imported page has an array of content streams, the streams are concatenated to + one single stream. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The dict. + + + + Sets a value indicating whether the content is compressed with the ZIP algorithm. + + + + + Unfilters the stream. + + + + + Surround content with q/Q operations if necessary. + + + + + Predefined keys of this dictionary. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents an array of PDF content streams of a page. + + + + + Initializes a new instance of the class. + + The document. + + + + Appends a new content stream and returns it. + + + + + Prepends a new content stream and returns it. + + + + + Creates a single content stream with the bytes from the array of the content streams. + This operation does not modify any of the content streams in this array. + + + + + Replaces the current content of the page with the specified content sequence. + + + + + Replaces the current content of the page with the specified bytes. + + + + + Gets the enumerator. + + + + + Represents a PDF cross-reference stream. + + + + + Initializes a new instance of the class. + + + + + Predefined keys for cross-reference dictionaries. + + + + + (Required) The type of PDF object that this dictionary describes; + must be XRef for a cross-reference stream. + + + + + (Required) The number one greater than the highest object number + used in this section or in any section for which this is an update. + It is equivalent to the Size entry in a trailer dictionary. + + + + + (Optional) An array containing a pair of integers for each subsection in this section. + The first integer is the first object number in the subsection; the second integer + is the number of entries in the subsection. + The array is sorted in ascending order by object number. Subsections cannot overlap; + an object number may have at most one entry in a section. + Default value: [0 Size]. + + + + + (Present only if the file has more than one cross-reference stream; not meaningful in + hybrid-reference files) The byte offset from the beginning of the file to the beginning + of the previous cross-reference stream. This entry has the same function as the Prev + entry in the trailer dictionary. + + + + + (Required) An array of integers representing the size of the fields in a single + cross-reference entry. The table describes the types of entries and their fields. + For PDF 1.5, W always contains three integers; the value of each integer is the + number of bytes (in the decoded stream) of the corresponding field. For example, + [1 2 1] means that the fields are one byte, two bytes, and one byte, respectively. + + A value of zero for an element in the W array indicates that the corresponding field + is not present in the stream, and the default value is used, if there is one. If the + first element is zero, the type field is not present, and it defaults to type 1. + + The sum of the items is the total length of each entry; it can be used with the + Indexarray to determine the starting position of each subsection. + + Note: Different cross-reference streams in a PDF file may use different values for W. + + Entries in a cross-reference stream. + + TYPE FIELD DESCRIPTION + 0 1 The type of this entry, which must be 0. Type 0 entries define the linked list of free objects (corresponding to f entries in a cross-reference table). + 2 The object number of the next free object. + 3 The generation number to use if this object number is used again. + 1 1 The type of this entry, which must be 1. Type 1 entries define objects that are in use but are not compressed (corresponding to n entries in a cross-reference table). + 2 The byte offset of the object, starting from the beginning of the file. + 3 The generation number of the object. Default value: 0. + 2 1 The type of this entry, which must be 2. Type 2 entries define compressed objects. + 2 The object number of the object stream in which this object is stored. (The generation number of the object stream is implicitly 0.) + 3 The index of this object within the object stream. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents the cross-reference table of a PDF document. + It contains all indirect objects of a document. + + + + + Represents the relation between PdfObjectID and PdfReference for a PdfDocument. + + + + + Adds a cross reference entry to the table. Used when parsing the trailer. + + + + + Adds a PdfObject to the table. + + + + + Gets a cross reference entry from an object identifier. + Returns null if no object with the specified ID exists in the object table. + + + + + Indicates whether the specified object identifier is in the table. + + + + + Returns the next free object number. + + + + + Writes the xref section in pdf stream. + + + + + Gets an array of all object identifiers. For debugging purposes only. + + + + + Gets an array of all cross references in ascending order by their object identifier. + + + + + Removes all objects that cannot be reached from the trailer. + Returns the number of removed objects. + + + + + Renumbers the objects starting at 1. + + + + + Checks the logical consistence for debugging purposes (useful after reconstruction work). + + + + + Calculates the transitive closure of the specified PdfObject, i.e. all indirect objects + recursively reachable from the specified object. + + + + + Calculates the transitive closure of the specified PdfObject with the specified depth, i.e. all indirect objects + recursively reachable from the specified object in up to maximally depth steps. + + + + + Gets the cross reference to an objects used for undefined indirect references. + + + + + Represents a base class for dictionaries with a content stream. + Implement IContentStream for use with a content writer. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The document. + + + + Initializes a new instance from an existing dictionary. Used for object type transformation. + + + + + Gets the resources dictionary of this dictionary. If no such dictionary exists, it is created. + + + + + Implements the interface because the primary function is internal. + + + + + Gets the resource name of the specified image within this dictionary. + + + + + Implements the interface because the primary function is internal. + + + + + Gets the resource name of the specified form within this dictionary. + + + + + Implements the interface because the primary function is internal. + + + + + Predefined keys of this dictionary. + + + + + (Optional but strongly recommended; PDF 1.2) A dictionary specifying any + resources (such as fonts and images) required by the form XObject. + + + + + Represents an extended graphics state object. + + + + + Initializes a new instance of the class. + + The document. + + + + Used in Edf.Xps. + + + + + Used in Edf.Xps. + ...for shading patterns + + + + + Sets the alpha value for stroking operations. + + + + + Sets the alpha value for nonstroking operations. + + + + + Sets the overprint value for stroking operations. + + + + + Sets the overprint value for nonstroking operations. + + + + + Sets a soft mask object. + + + + + Common keys for all streams. + + + + + (Optional) The type of PDF object that this dictionary describes; + must be ExtGState for a graphics state parameter dictionary. + + + + + (Optional; PDF 1.3) The line width (see “Line Width” on page 185). + + + + + (Optional; PDF 1.3) The line cap style. + + + + + (Optional; PDF 1.3) The line join style. + + + + + (Optional; PDF 1.3) The miter limit. + + + + + (Optional; PDF 1.3) The line dash pattern, expressed as an array of the form + [dashArray dashPhase], where dashArray is itself an array and dashPhase is an integer. + + + + + (Optional; PDF 1.3) The name of the rendering intent. + + + + + (Optional) A flag specifying whether to apply overprint. In PDF 1.2 and earlier, + there is a single overprint parameter that applies to all painting operations. + Beginning with PDF 1.3, there are two separate overprint parameters: one for stroking + and one for all other painting operations. Specifying an OP entry sets both parameters + unless there is also an op entry in the same graphics state parameter dictionary, in + which case the OP entry sets only the overprint parameter for stroking. + + + + + (Optional; PDF 1.3) A flag specifying whether to apply overprint for painting operations + other than stroking. If this entry is absent, the OP entry, if any, sets this parameter. + + + + + (Optional; PDF 1.3) The overprint mode. + + + + + (Optional; PDF 1.3) An array of the form [font size], where font is an indirect + reference to a font dictionary and size is a number expressed in text space units. + These two objects correspond to the operands of the Tf operator; however, + the first operand is an indirect object reference instead of a resource name. + + + + + (Optional) The black-generation function, which maps the interval [0.0 1.0] + to the interval [0.0 1.0]. + + + + + (Optional; PDF 1.3) Same as BG except that the value may also be the name Default, + denoting the black-generation function that was in effect at the start of the page. + If both BG and BG2 are present in the same graphics state parameter dictionary, + BG2 takes precedence. + + + + + (Optional) The undercolor-removal function, which maps the interval + [0.0 1.0] to the interval [-1.0 1.0]. + + + + + (Optional; PDF 1.3) Same as UCR except that the value may also be the name Default, + denoting the undercolor-removal function that was in effect at the start of the page. + If both UCR and UCR2 are present in the same graphics state parameter dictionary, + UCR2 takes precedence. + + + + + (Optional) A flag specifying whether to apply automatic stroke adjustment. + + + + + (Optional; PDF 1.4) The current blend mode to be used in the transparent imaging model. + + + + + (Optional; PDF 1.4) The current soft mask, specifying the mask shape or + mask opacity values to be used in the transparent imaging model. + + + + + (Optional; PDF 1.4) The current stroking alpha constant, specifying the constant + shape or constant opacity value to be used for stroking operations in the transparent + imaging model. + + + + + (Optional; PDF 1.4) Same as CA, but for nonstroking operations. + + + + + (Optional; PDF 1.4) The alpha source flag (“alpha is shape”), specifying whether + the current soft mask and alpha constant are to be interpreted as shape values (true) + or opacity values (false). + + + + + (Optional; PDF 1.4) The text knockout flag, which determines the behavior of + overlapping glyphs within a text object in the transparent imaging model. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Contains all used ExtGState objects of a document. + + + + + Initializes a new instance of this class, which is a singleton for each document. + + + + + Gets a PdfExtGState with the key 'CA' set to the specified alpha value. + + + + + Gets a PdfExtGState with the key 'ca' set to the specified alpha value. + + + + + Represents a PDF font. + + + + + Initializes a new instance of the class. + + + + + Gets a value indicating whether this instance is symbol font. + + + + + Gets or sets the CMapInfo. + + + + + Gets or sets ToUnicodeMap. + + + + + Adds a tag of exactly six uppercase letters to the font name + according to PDF Reference Section 5.5.3 'Font Subsets' + + + + + Predefined keys common to all font dictionaries. + + + + + (Required) The type of PDF object that this dictionary describes; + must be Font for a font dictionary. + + + + + (Required) The type of font. + + + + + (Required) The PostScript name of the font. + + + + + (Required except for the standard 14 fonts; must be an indirect reference) + A font descriptor describing the font’s metrics other than its glyph widths. + Note: For the standard 14 fonts, the entries FirstChar, LastChar, Widths, and + FontDescriptor must either all be present or all be absent. Ordinarily, they are + absent; specifying them enables a standard font to be overridden. + + + + + The PDF font descriptor flags. + + + + + All glyphs have the same width (as opposed to proportional or variable-pitch + fonts, which have different widths). + + + + + Glyphs have serifs, which are short strokes drawn at an angle on the top and + bottom of glyph stems. (Sans serif fonts do not have serifs.) + + + + + Font contains glyphs outside the Adobe standard Latin character set. This + flag and the Nonsymbolic flag cannot both be set or both be clear. + + + + + Glyphs resemble cursive handwriting. + + + + + Font uses the Adobe standard Latin character set or a subset of it. + + + + + Glyphs have dominant vertical strokes that are slanted. + + + + + Font contains no lowercase letters; typically used for display purposes, + such as for titles or headlines. + + + + + Font contains both uppercase and lowercase letters. The uppercase letters are + similar to those in the regular version of the same typeface family. The glyphs + for the lowercase letters have the same shapes as the corresponding uppercase + letters, but they are sized and their proportions adjusted so that they have the + same size and stroke weight as lowercase glyphs in the same typeface family. + + + + + Determines whether bold glyphs are painted with extra pixels even at very small + text sizes. + + + + + A PDF font descriptor specifies metrics and other attributes of a simple font, + as distinct from the metrics of individual glyphs. + + + + + Gets or sets the name of the font. + + + + + Gets a value indicating whether this instance is symbol font. + + + + + Predefined keys of this dictionary. + + + + + (Required) The type of PDF object that this dictionary describes; must be + FontDescriptor for a font descriptor. + + + + + (Required) The PostScript name of the font. This name should be the same as the + value of BaseFont in the font or CIDFont dictionary that refers to this font descriptor. + + + + + (Optional; PDF 1.5; strongly recommended for Type 3 fonts in Tagged PDF documents) + A string specifying the preferred font family name. For example, for the font + Times Bold Italic, the FontFamily is Times. + + + + + (Optional; PDF 1.5; strongly recommended for Type 3 fonts in Tagged PDF documents) + The font stretch value. It must be one of the following names (ordered from + narrowest to widest): UltraCondensed, ExtraCondensed, Condensed, SemiCondensed, + Normal, SemiExpanded, Expanded, ExtraExpanded or UltraExpanded. + Note: The specific interpretation of these values varies from font to font. + For example, Condensed in one font may appear most similar to Normal in another. + + + + + (Optional; PDF 1.5; strongly recommended for Type 3 fonts in Tagged PDF documents) + The weight (thickness) component of the fully-qualified font name or font specifier. + The possible values are 100, 200, 300, 400, 500, 600, 700, 800, or 900, where each + number indicates a weight that is at least as dark as its predecessor. A value of + 400 indicates a normal weight; 700 indicates bold. + Note: The specific interpretation of these values varies from font to font. + For example, 300 in one font may appear most similar to 500 in another. + + + + + (Required) A collection of flags defining various characteristics of the font. + + + + + (Required, except for Type 3 fonts) A rectangle (see Section 3.8.4, “Rectangles”), + expressed in the glyph coordinate system, specifying the font bounding box. This + is the smallest rectangle enclosing the shape that would result if all of the + glyphs of the font were placed with their origins coincident and then filled. + + + + + (Required) The angle, expressed in degrees counterclockwise from the vertical, of + the dominant vertical strokes of the font. (For example, the 9-o’clock position is 90 + degrees, and the 3-o’clock position is –90 degrees.) The value is negative for fonts + that slope to the right, as almost all italic fonts do. + + + + + (Required, except for Type 3 fonts) The maximum height above the baseline reached + by glyphs in this font, excluding the height of glyphs for accented characters. + + + + + (Required, except for Type 3 fonts) The maximum depth below the baseline reached + by glyphs in this font. The value is a negative number. + + + + + (Optional) The spacing between baselines of consecutive lines of text. + Default value: 0. + + + + + (Required for fonts that have Latin characters, except for Type 3 fonts) The vertical + coordinate of the top of flat capital letters, measured from the baseline. + + + + + (Optional) The font’s x height: the vertical coordinate of the top of flat nonascending + lowercase letters (like the letter x), measured from the baseline, in fonts that have + Latin characters. Default value: 0. + + + + + (Required, except for Type 3 fonts) The thickness, measured horizontally, of the dominant + vertical stems of glyphs in the font. + + + + + (Optional) The thickness, measured vertically, of the dominant horizontal stems + of glyphs in the font. Default value: 0. + + + + + (Optional) The average width of glyphs in the font. Default value: 0. + + + + + (Optional) The maximum width of glyphs in the font. Default value: 0. + + + + + (Optional) The width to use for character codes whose widths are not specified in a + font dictionary’s Widths array. This has a predictable effect only if all such codes + map to glyphs whose actual widths are the same as the value of the MissingWidth entry. + Default value: 0. + + + + + (Optional) A stream containing a Type 1 font program. + + + + + (Optional; PDF 1.1) A stream containing a TrueType font program. + + + + + (Optional; PDF 1.2) A stream containing a font program whose format is specified + by the Subtype entry in the stream dictionary. + + + + + (Optional; meaningful only in Type 1 fonts; PDF 1.1) A string listing the character + names defined in a font subset. The names in this string must be in PDF syntax—that is, + each name preceded by a slash (/). The names can appear in any order. The name .notdef + should be omitted; it is assumed to exist in the font subset. If this entry is absent, + the only indication of a font subset is the subset tag in the FontName entry. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + TrueType with WinAnsi encoding. + + + + + TrueType with Identity-H or Identity-V encoding (unicode). + + + + + Contains all used fonts of a document. + + + + + Initializes a new instance of this class, which is a singleton for each document. + + + + + Gets a PdfFont from an XFont. If no PdfFont already exists, a new one is created. + + + + + Gets a PdfFont from a font program. If no PdfFont already exists, a new one is created. + + + + + Tries to gets a PdfFont from the font dictionary. + Returns null if no such PdfFont exists. + + + + + Map from PdfFontSelector to PdfFont. + + + + + Represents an external form object (e.g. an imported page). + + + + + Gets the PdfResources object of this form. + + + + + Gets the resource name of the specified font data within this form XObject. + + + + + Predefined keys of this dictionary. + + + + + (Optional) The type of PDF object that this dictionary describes; if present, + must be XObject for a form XObject. + + + + + (Required) The type of XObject that this dictionary describes; must be Form + for a form XObject. + + + + + (Optional) A code identifying the type of form XObject that this dictionary + describes. The only valid value defined at the time of publication is 1. + Default value: 1. + + + + + (Required) An array of four numbers in the form coordinate system, giving the + coordinates of the left, bottom, right, and top edges, respectively, of the + form XObject’s bounding box. These boundaries are used to clip the form XObject + and to determine its size for caching. + + + + + (Optional) An array of six numbers specifying the form matrix, which maps + form space into user space. + Default value: the identity matrix [1 0 0 1 0 0]. + + + + + (Optional but strongly recommended; PDF 1.2) A dictionary specifying any + resources (such as fonts and images) required by the form XObject. + + + + + (Optional; PDF 1.4) A group attributes dictionary indicating that the contents + of the form XObject are to be treated as a group and specifying the attributes + of that group (see Section 4.9.2, “Group XObjects”). + Note: If a Ref entry (see below) is present, the group attributes also apply to the + external page imported by that entry, which allows such an imported page to be + treated as a group without further modification. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Contains all external PDF files from which PdfFormXObjects are imported into the current document. + + + + + Initializes a new instance of this class, which is a singleton for each document. + + + + + Gets a PdfFormXObject from an XPdfForm. Because the returned objects must be unique, always + a new instance of PdfFormXObject is created if none exists for the specified form. + + + + + Gets the imported object table. + + + + + Gets the imported object table. + + + + + Map from Selector to PdfImportedObjectTable. + + + + + A collection of information that uniquely identifies a particular ImportedObjectTable. + + + + + Initializes a new instance of FormSelector from an XPdfForm. + + + + + Initializes a new instance of FormSelector from a PdfPage. + + + + + Represents a PDF group XObject. + + + + + Predefined keys of this dictionary. + + + + + (Optional) The type of PDF object that this dictionary describes; + if present, must be Group for a group attributes dictionary. + + + + + (Required) The group subtype, which identifies the type of group whose + attributes this dictionary describes and determines the format and meaning + of the dictionary’s remaining entries. The only group subtype defined in + PDF 1.4 is Transparency. Other group subtypes may be added in the future. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents an image. + + + + + Initializes a new instance of PdfImage from an XImage. + + + + + Gets the underlying XImage object. + + + + + Returns 'Image'. + + + + + Creates the keys for a JPEG image. + + + + + Creates the keys for a FLATE image. + + + + + Reads images that are returned from GDI+ without color palette. + + 4 (32bpp RGB), 3 (24bpp RGB, 32bpp ARGB) + 8 + true (ARGB), false (RGB) + + + + Common keys for all streams. + + + + + (Optional) The type of PDF object that this dictionary describes; + if present, must be XObject for an image XObject. + + + + + (Required) The type of XObject that this dictionary describes; + must be Image for an image XObject. + + + + + (Required) The width of the image, in samples. + + + + + (Required) The height of the image, in samples. + + + + + (Required for images, except those that use the JPXDecode filter; not allowed for image masks) + The color space in which image samples are specified; it can be any type of color space except + Pattern. If the image uses the JPXDecode filter, this entry is optional: + • If ColorSpace is present, any color space specifications in the JPEG2000 data are ignored. + • If ColorSpace is absent, the color space specifications in the JPEG2000 data are used. + The Decode array is also ignored unless ImageMask is true. + + + + + (Required except for image masks and images that use the JPXDecode filter) + The number of bits used to represent each color component. Only a single value may be specified; + the number of bits is the same for all color components. Valid values are 1, 2, 4, 8, and + (in PDF 1.5) 16. If ImageMask is true, this entry is optional, and if specified, its value + must be 1. + If the image stream uses a filter, the value of BitsPerComponent must be consistent with the + size of the data samples that the filter delivers. In particular, a CCITTFaxDecode or JBIG2Decode + filter always delivers 1-bit samples, a RunLengthDecode or DCTDecode filter delivers 8-bit samples, + and an LZWDecode or FlateDecode filter delivers samples of a specified size if a predictor function + is used. + If the image stream uses the JPXDecode filter, this entry is optional and ignored if present. + The bit depth is determined in the process of decoding the JPEG2000 image. + + + + + (Optional; PDF 1.1) The name of a color rendering intent to be used in rendering the image. + Default value: the current rendering intent in the graphics state. + + + + + (Optional) A flag indicating whether the image is to be treated as an image mask. + If this flag is true, the value of BitsPerComponent must be 1 and Mask and ColorSpace should + not be specified; unmasked areas are painted using the current nonstroking color. + Default value: false. + + + + + (Optional except for image masks; not allowed for image masks; PDF 1.3) + An image XObject defining an image mask to be applied to this image, or an array specifying + a range of colors to be applied to it as a color key mask. If ImageMask is true, this entry + must not be present. + + + + + (Optional) An array of numbers describing how to map image samples into the range of values + appropriate for the image’s color space. If ImageMask is true, the array must be either + [0 1] or [1 0]; otherwise, its length must be twice the number of color components required + by ColorSpace. If the image uses the JPXDecode filter and ImageMask is false, Decode is ignored. + Default value: see “Decode Arrays”. + + + + + (Optional) A flag indicating whether image interpolation is to be performed. + Default value: false. + + + + + (Optional; PDF 1.3) An array of alternate image dictionaries for this image. The order of + elements within the array has no significance. This entry may not be present in an image + XObject that is itself an alternate image. + + + + + (Optional; PDF 1.4) A subsidiary image XObject defining a soft-mask image to be used as a + source of mask shape or mask opacity values in the transparent imaging model. The alpha + source parameter in the graphics state determines whether the mask values are interpreted as + shape or opacity. If present, this entry overrides the current soft mask in the graphics state, + as well as the image’s Mask entry, if any. (However, the other transparency related graphics + state parameters — blend mode and alpha constant — remain in effect.) If SMask is absent, the + image has no associated soft mask (although the current soft mask in the graphics state may + still apply). + + + + + (Optional for images that use the JPXDecode filter, meaningless otherwise; PDF 1.5) + A code specifying how soft-mask information encoded with image samples should be used: + 0 If present, encoded soft-mask image information should be ignored. + 1 The image’s data stream includes encoded soft-mask values. An application can create + a soft-mask image from the information to be used as a source of mask shape or mask + opacity in the transparency imaging model. + 2 The image’s data stream includes color channels that have been preblended with a + background; the image data also includes an opacity channel. An application can create + a soft-mask image with a Matte entry from the opacity channel information to be used as + a source of mask shape or mask opacity in the transparency model. If this entry has a + nonzero value, SMask should not be specified. + Default value: 0. + + + + + (Required in PDF 1.0; optional otherwise) The name by which this image XObject is + referenced in the XObject subdictionary of the current resource dictionary. + + + + + (Required if the image is a structural content item; PDF 1.3) The integer key of the + image’s entry in the structural parent tree. + + + + + (Optional; PDF 1.3; indirect reference preferred) The digital identifier of the image’s + parent Web Capture content set. + + + + + (Optional; PDF 1.2) An OPI version dictionary for the image. If ImageMask is true, + this entry is ignored. + + + + + (Optional; PDF 1.4) A metadata stream containing metadata for the image. + + + + + (Optional; PDF 1.5) An optional content group or optional content membership dictionary, + specifying the optional content properties for this image XObject. Before the image is + processed, its visibility is determined based on this entry. If it is determined to be + invisible, the entire image is skipped, as if there were no Do operator to invoke it. + + + + + Counts the consecutive one bits in an image line. + + The reader. + The bits left. + + + + Counts the consecutive zero bits in an image line. + + The reader. + The bits left. + + + + Returns the offset of the next bit in the range + [bitStart..bitEnd] that is different from the + specified color. The end, bitEnd, is returned + if no such bit exists. + + The reader. + The offset of the start bit. + The offset of the end bit. + If set to true searches "one" (i. e. white), otherwise searches black. + The offset of the first non-matching bit. + + + + Returns the offset of the next bit in the range + [bitStart..bitEnd] that is different from the + specified color. The end, bitEnd, is returned + if no such bit exists. + Like FindDifference, but also check the + starting bit against the end in case start > end. + + The reader. + The offset of the start bit. + The offset of the end bit. + If set to true searches "one" (i. e. white), otherwise searches black. + The offset of the first non-matching bit. + + + + 2d-encode a row of pixels. Consult the CCITT documentation for the algorithm. + + The writer. + Offset of image data in bitmap file. + The bitmap file. + Index of the current row. + Index of the reference row (0xffffffff if there is none). + The width of the image. + The height of the image. + The bytes per line in the bitmap file. + + + + Encodes a bitonal bitmap using 1D CCITT fax encoding. + + Space reserved for the fax encoded bitmap. An exception will be thrown if this buffer is too small. + The bitmap to be encoded. + Offset of image data in bitmap file. + The width of the image. + The height of the image. + The size of the fax encoded image (0 on failure). + + + + Encodes a bitonal bitmap using 2D group 4 CCITT fax encoding. + + Space reserved for the fax encoded bitmap. An exception will be thrown if this buffer is too small. + The bitmap to be encoded. + Offset of image data in bitmap file. + The width of the image. + The height of the image. + The size of the fax encoded image (0 on failure). + + + + Writes the image data. + + The writer. + The count of bits (pels) to encode. + The color of the pels. + + + + Helper class for creating bitmap masks (8 pels per byte). + + + + + Returns the bitmap mask that will be written to PDF. + + + + + Creates a bitmap mask. + + + + + Starts a new line. + + + + + Adds a pel to the current line. + + + + + + Adds a pel from an alpha mask value. + + + + + The BitReader class is a helper to read bits from an in-memory bitmap file. + + + + + Initializes a new instance of the class. + + The in-memory bitmap file. + The offset of the line to read. + The count of bits that may be read (i. e. the width of the image for normal usage). + + + + Sets the position within the line (needed for 2D encoding). + + The new position. + + + + Gets a single bit at the specified position. + + The position. + True if bit is set. + + + + Returns the bits that are in the buffer (without changing the position). + Data is MSB aligned. + + The count of bits that were returned (1 through 8). + The MSB aligned bits from the buffer. + + + + Moves the buffer to the next byte. + + + + + "Removes" (eats) bits from the buffer. + + The count of bits that were processed. + + + + A helper class for writing groups of bits into an array of bytes. + + + + + Initializes a new instance of the class. + + The byte array to be written to. + + + + Writes the buffered bits into the byte array. + + + + + Masks for n bits in a byte (with n = 0 through 8). + + + + + Writes bits to the byte array. + + The bits to be written (LSB aligned). + The count of bits. + + + + Writes a line from a look-up table. + A "line" in the table are two integers, one containing the values, one containing the bit count. + + + + + Flushes the buffer and returns the count of bytes written to the array. + + + + + Contains all used images of a document. + + + + + Initializes a new instance of this class, which is a singleton for each document. + + + + + Gets a PdfImage from an XImage. If no PdfImage already exists, a new one is created. + + + + + Map from ImageSelector to PdfImage. + + + + + A collection of information that uniquely identifies a particular PdfImage. + + + + + Initializes a new instance of ImageSelector from an XImage. + + + + + Represents the imported objects of an external document. Used to cache objects that are + already imported when a PdfFormXObject is added to a page. + + + + + Initializes a new instance of this class with the document the objects are imported from. + + + + + Gets the document this table belongs to. + + + + + Gets the external document, or null, if the external document is garbage collected. + + + + + Indicates whether the specified object is already imported. + + + + + Adds a cloned object to this table. + + The object identifier in the foreign object. + The cross reference to the clone of the foreign object, which belongs to + this document. In general the clone has a different object identifier. + + + + Gets the cloned object that corresponds to the specified external identifier. + + + + + Maps external object identifiers to cross reference entries of the importing document + {PdfObjectID -> PdfReference}. + + + + + Provides access to the internal document data structures. This class prevents the public + interfaces from pollution with to much internal functions. + + + + + Gets or sets the first document identifier. + + + + + Gets the first document identifier as GUID. + + + + + Gets or sets the second document identifier. + + + + + Gets the first document identifier as GUID. + + + + + Gets the catalog dictionary. + + + + + Gets the ExtGStateTable object. + + + + + Returns the object with the specified Identifier, or null, if no such object exists. + + + + + Maps the specified external object to the substitute object in this document. + Returns null if no such object exists. + + + + + Returns the PdfReference of the specified object, or null, if the object is not in the + document's object table. + + + + + Gets the object identifier of the specified object. + + + + + Gets the object number of the specified object. + + + + + Gets the generation number of the specified object. + + + + + Gets all indirect objects ordered by their object identifier. + + + + + Gets all indirect objects ordered by their object identifier. + + + + + Creates the indirect object of the specified type, adds it to the document, + and returns the object. + + + + + Adds an object to the PDF document. This operation and only this operation makes the object + an indirect object owned by this document. + + + + + Removes an object from the PDF document. + + + + + Returns an array containing the specified object as first element follows by its transitive + closure. The closure of an object are all objects that can be reached by indirect references. + The transitive closure is the result of applying the calculation of the closure to a closure + as long as no new objects came along. This is e.g. useful for getting all objects belonging + to the resources of a page. + + + + + Returns an array containing the specified object as first element follows by its transitive + closure limited by the specified number of iterations. + + + + + Writes a PdfItem into the specified stream. + + + + + The name of the custom value key. + + + + + Provides access to the internal PDF object data structures. This class prevents the public + interfaces from pollution with to much internal functions. + + + + + Gets the object identifier. Returns PdfObjectID.Empty for direct objects. + + + + + Gets the object number. + + + + + Gets the generation number. + + + + + Gets the name of the current type. + Not a very useful property, but can be used for data binding. + + + + + Represents an object stream that contains compressed objects. + PDF 1.5. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance from an existing dictionary. Used for object type transformation. + + + + + Reads the compressed object with the specified index. + + + + + Reads the compressed object with the specified index. + + + + + N pairs of integers. + The first integer represents the object number of the compressed object. + The second integer represents the absolute offset of that object in the decoded stream, + i.e. the byte offset plus First entry. + + + + + Predefined keys common to all font dictionaries. + + + + + (Required) The type of PDF object that this dictionary describes; + must be ObjStmfor an object stream. + + + + + (Required) The number of compressed objects in the stream. + + + + + (Required) The byte offset (in the decoded stream) of the first + compressed object. + + + + + (Optional) A reference to an object stream, of which the current object + stream is considered an extension. Both streams are considered part of + a collection of object streams (see below). A given collection consists + of a set of streams whose Extendslinks form a directed acyclic graph. + + + + + Represents a PDF page object. + + + + + + + + + + Represents an indirect reference to a PdfObject. + + + + + Initializes a new PdfReference instance for the specified indirect object. + + + + + Initializes a new PdfReference instance from the specified object identifier and file position. + + + + + Writes the object in PDF iref table format. + + + + + Writes an indirect reference. + + + + + Gets or sets the object identifier. + + + + + Gets the object number of the object identifier. + + + + + Gets the generation number of the object identifier. + + + + + Gets or sets the file position of the related PdfObject. + + + + + Gets or sets the referenced PdfObject. + + + + + Hack for dead objects. + + + + + Gets or sets the document this object belongs to. + + + + + Gets a string representing the object identifier. + + + + + Implements a comparer that compares PdfReference objects by their PdfObjectID. + + + + + Base class for all dictionaries that map resource names to objects. + + + + + Adds all imported resource names to the specified hashtable. + + + + + Represents a PDF resource object. + + + + + Initializes a new instance of the class. + + The document. + + + + Adds the specified font to this resource dictionary and returns its local resource name. + + + + + Adds the specified image to this resource dictionary + and returns its local resource name. + + + + + Adds the specified form object to this resource dictionary + and returns its local resource name. + + + + + Adds the specified graphics state to this resource dictionary + and returns its local resource name. + + + + + Adds the specified pattern to this resource dictionary + and returns its local resource name. + + + + + Adds the specified pattern to this resource dictionary + and returns its local resource name. + + + + + Adds the specified shading to this resource dictionary + and returns its local resource name. + + + + + Gets the fonts map. + + + + + Gets the external objects map. + + + + + Gets a new local name for this resource. + + + + + Gets a new local name for this resource. + + + + + Gets a new local name for this resource. + + + + + Gets a new local name for this resource. + + + + + Gets a new local name for this resource. + + + + + Gets a new local name for this resource. + + + + + Check whether a resource name is already used in the context of this resource dictionary. + PDF4NET uses GUIDs as resource names, but I think this weapon is to heavy. + + + + + All the names of imported resources. + + + + + Maps all PDFsharp resources to their local resource names. + + + + + Predefined keys of this dictionary. + + + + + (Optional) A dictionary that maps resource names to graphics state + parameter dictionaries. + + + + + (Optional) A dictionary that maps each resource name to either the name of a + device-dependent color space or an array describing a color space. + + + + + (Optional) A dictionary that maps each resource name to either the name of a + device-dependent color space or an array describing a color space. + + + + + (Optional; PDF 1.3) A dictionary that maps resource names to shading dictionaries. + + + + + (Optional) A dictionary that maps resource names to external objects. + + + + + (Optional) A dictionary that maps resource names to font dictionaries. + + + + + (Optional) An array of predefined procedure set names. + + + + + (Optional; PDF 1.2) A dictionary that maps resource names to property list + dictionaries for marked content. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Base class for FontTable, ImageTable, FormXObjectTable etc. + + + + + Base class for document wide resource tables. + + + + + Gets the owning document of this resource table. + + + + + Represents a shading dictionary. + + + + + Initializes a new instance of the class. + + + + + Setups the shading from the specified brush. + + + + + Common keys for all streams. + + + + + (Required) The shading type: + 1 Function-based shading + 2 Axial shading + 3 Radial shading + 4 Free-form Gouraud-shaded triangle mesh + 5 Lattice-form Gouraud-shaded triangle mesh + 6 Coons patch mesh + 7 Tensor-product patch mesh + + + + + (Required) The color space in which color values are expressed. This may be any device, + CIE-based, or special color space except a Pattern space. + + + + + (Optional) An array of color components appropriate to the color space, specifying + a single background color value. If present, this color is used, before any painting + operation involving the shading, to fill those portions of the area to be painted + that lie outside the bounds of the shading object. In the opaque imaging model, + the effect is as if the painting operation were performed twice: first with the + background color and then with the shading. + + + + + (Optional) An array of four numbers giving the left, bottom, right, and top coordinates, + respectively, of the shading’s bounding box. The coordinates are interpreted in the + shading’s target coordinate space. If present, this bounding box is applied as a temporary + clipping boundary when the shading is painted, in addition to the current clipping path + and any other clipping boundaries in effect at that time. + + + + + (Optional) A flag indicating whether to filter the shading function to prevent aliasing + artifacts. The shading operators sample shading functions at a rate determined by the + resolution of the output device. Aliasing can occur if the function is not smooth—that + is, if it has a high spatial frequency relative to the sampling rate. Anti-aliasing can + be computationally expensive and is usually unnecessary, since most shading functions + are smooth enough or are sampled at a high enough frequency to avoid aliasing effects. + Anti-aliasing may not be implemented on some output devices, in which case this flag + is ignored. + Default value: false. + + + + + (Required) An array of four numbers [x0 y0 x1 y1] specifying the starting and + ending coordinates of the axis, expressed in the shading’s target coordinate space. + + + + + (Optional) An array of two numbers [t0 t1] specifying the limiting values of a + parametric variable t. The variable is considered to vary linearly between these + two values as the color gradient varies between the starting and ending points of + the axis. The variable t becomes the input argument to the color function(s). + Default value: [0.0 1.0]. + + + + + (Required) A 1-in, n-out function or an array of n 1-in, 1-out functions (where n + is the number of color components in the shading dictionary’s color space). The + function(s) are called with values of the parametric variable t in the domain defined + by the Domain entry. Each function’s domain must be a superset of that of the shading + dictionary. If the value returned by the function for a given color component is out + of range, it is adjusted to the nearest valid value. + + + + + (Optional) An array of two boolean values specifying whether to extend the shading + beyond the starting and ending points of the axis, respectively. + Default value: [false false]. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents a shading pattern dictionary. + + + + + Initializes a new instance of the class. + + + + + Setups the shading pattern from the specified brush. + + + + + Common keys for all streams. + + + + + (Optional) The type of PDF object that this dictionary describes; if present, + must be Pattern for a pattern dictionary. + + + + + (Required) A code identifying the type of pattern that this dictionary describes; + must be 2 for a shading pattern. + + + + + (Required) A shading object (see below) defining the shading pattern’s gradient fill. + + + + + (Optional) An array of six numbers specifying the pattern matrix. + Default value: the identity matrix [1 0 0 1 0 0]. + + + + + (Optional) A graphics state parameter dictionary containing graphics state parameters + to be put into effect temporarily while the shading pattern is painted. Any parameters + that are not so specified are inherited from the graphics state that was in effect + at the beginning of the content stream in which the pattern is defined as a resource. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents a PDF soft mask. + + + + + Initializes a new instance of the class. + + The document that owns the object. + + + + Predefined keys of this dictionary. + + + + + (Optional) The type of PDF object that this dictionary describes; + if present, must be Mask for a soft-mask dictionary. + + + + + (Required) A subtype specifying the method to be used in deriving the mask values + from the transparency group specified by the G entry: + Alpha: Use the group’s computed alpha, disregarding its color. + Luminosity: Convert the group’s computed color to a single-component luminosity value. + + + + + (Required) A transparency group XObject to be used as the source of alpha + or color values for deriving the mask. If the subtype S is Luminosity, the + group attributes dictionary must contain a CS entry defining the color space + in which the compositing computation is to be performed. + + + + + (Optional) An array of component values specifying the color to be used + as the backdrop against which to composite the transparency group XObject G. + This entry is consulted only if the subtype S is Luminosity. The array consists of + n numbers, where n is the number of components in the color space specified + by the CS entry in the group attributes dictionary. + Default value: the color space’s initial value, representing black. + + + + + (Optional) A function object specifying the transfer function to be used in + deriving the mask values. The function accepts one input, the computed + group alpha or luminosity (depending on the value of the subtype S), and + returns one output, the resulting mask value. Both the input and output + must be in the range 0.0 to 1.0; if the computed output falls outside this + range, it is forced to the nearest valid value. The name Identity may be + specified in place of a function object to designate the identity function. + Default value: Identity. + + + + + Represents a tiling pattern dictionary. + + + + + Initializes a new instance of the class. + + + + + Common keys for all streams. + + + + + (Optional) The type of PDF object that this dictionary describes; if present, + must be Pattern for a pattern dictionary. + + + + + (Required) A code identifying the type of pattern that this dictionary describes; + must be 1 for a tiling pattern. + + + + + (Required) A code that determines how the color of the pattern cell is to be specified: + 1: Colored tiling pattern. The pattern’s content stream specifies the colors used to + paint the pattern cell. When the content stream begins execution, the current color + is the one that was initially in effect in the pattern’s parent content stream. + 2: Uncolored tiling pattern. The pattern’s content stream does not specify any color + information. Instead, the entire pattern cell is painted with a separately specified color + each time the pattern is used. Essentially, the content stream describes a stencil + through which the current color is to be poured. The content stream must not invoke + operators that specify colors or other color-related parameters in the graphics state; + otherwise, an error occurs. The content stream may paint an image mask, however, + since it does not specify any color information. + + + + + (Required) A code that controls adjustments to the spacing of tiles relative to the device + pixel grid: + 1: Constant spacing. Pattern cells are spaced consistently—that is, by a multiple of a + device pixel. To achieve this, the application may need to distort the pattern cell slightly + by making small adjustments to XStep, YStep, and the transformation matrix. The amount + of distortion does not exceed 1 device pixel. + 2: No distortion. The pattern cell is not distorted, but the spacing between pattern cells + may vary by as much as 1 device pixel, both horizontally and vertically, when the pattern + is painted. This achieves the spacing requested by XStep and YStep on average but not + necessarily for each individual pattern cell. + 3: Constant spacing and faster tiling. Pattern cells are spaced consistently as in tiling + type 1 but with additional distortion permitted to enable a more efficient implementation. + + + + + (Required) An array of four numbers in the pattern coordinate system giving the + coordinates of the left, bottom, right, and top edges, respectively, of the pattern + cell’s bounding box. These boundaries are used to clip the pattern cell. + + + + + (Required) The desired horizontal spacing between pattern cells, measured in the + pattern coordinate system. + + + + + (Required) The desired vertical spacing between pattern cells, measured in the pattern + coordinate system. Note that XStep and YStep may differ from the dimensions of the + pattern cell implied by the BBox entry. This allows tiling with irregularly shaped figures. + XStep and YStep may be either positive or negative but not zero. + + + + + (Required) A resource dictionary containing all of the named resources required by + the pattern’s content stream (see Section 3.7.2, “Resource Dictionaries”). + + + + + (Optional) An array of six numbers specifying the pattern matrix. + Default value: the identity matrix [1 0 0 1 0 0]. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents a ToUnicode map for composite font. + + + + + Gets or sets the CMap info. + + + + + Creates the ToUnicode map from the CMapInfo. + + + + + Represents a PDF trailer dictionary. Even though trailers are dictionaries they never have a cross + reference entry in PdfReferenceTable. + + + + + Initializes a new instance of PdfTrailer. + + + + + Initializes a new instance of the class from a . + + + + + (Required; must be an indirect reference) + The catalog dictionary for the PDF document contained in the file. + + + + + Gets the first or second document identifier. + + + + + Sets the first or second document identifier. + + + + + Creates and sets two identical new document IDs. + + + + + Gets the standard security handler. + + + + + Replace temporary irefs by their correct counterparts from the iref table. + + + + + Predefined keys of this dictionary. + + + + + (Required; must not be an indirect reference) The total number of entries in the file’s + cross-reference table, as defined by the combination of the original section and all + update sections. Equivalently, this value is 1 greater than the highest object number + used in the file. + Note: Any object in a cross-reference section whose number is greater than this value is + ignored and considered missing. + + + + + (Present only if the file has more than one cross-reference section; must not be an indirect + reference) The byte offset from the beginning of the file to the beginning of the previous + cross-reference section. + + + + + (Required; must be an indirect reference) The catalog dictionary for the PDF document + contained in the file. + + + + + (Required if document is encrypted; PDF 1.1) The document’s encryption dictionary. + + + + + (Optional; must be an indirect reference) The document’s information dictionary. + + + + + (Optional, but strongly recommended; PDF 1.1) An array of two strings constituting + a file identifier for the file. Although this entry is optional, + its absence might prevent the file from functioning in some workflows + that depend on files being uniquely identified. + + + + + (Optional) The byte offset from the beginning of the file of a cross-reference stream. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents a PDF transparency group XObject. + + + + + Predefined keys of this dictionary. + + + + + (Sometimes required, as discussed below) + The group color space, which is used for the following purposes: + • As the color space into which colors are converted when painted into the group + • As the blending color space in which objects are composited within the group + • As the color space of the group as a whole when it in turn is painted as an object onto its backdrop + The group color space may be any device or CIE-based color space that + treats its components as independent additive or subtractive values in the + range 0.0 to 1.0, subject to the restrictions described in Section 7.2.3, “Blending Color Space.” + These restrictions exclude Lab and lightness-chromaticity ICCBased color spaces, + as well as the special color spaces Pattern, Indexed, Separation, and DeviceN. + Device color spaces are subject to remapping according to the DefaultGray, + DefaultRGB, and DefaultCMYK entries in the ColorSpace subdictionary of the + current resource dictionary. + Ordinarily, the CS entry is allowed only for isolated transparency groups + (those for which I, below, is true), and even then it is optional. However, + this entry is required in the group attributes dictionary for any transparency + group XObject that has no parent group or page from which to inherit — in + particular, one that is the value of the G entry in a soft-mask dictionary of + subtype Luminosity. + In addition, it is always permissible to specify CS in the group attributes + dictionary associated with a page object, even if I is false or absent. In the + normal case in which the page is imposed directly on the output medium, + the page group is effectively isolated regardless of the I value, and the + specified CS value is therefore honored. But if the page is in turn used as an + element of some other page and if the group is non-isolated, CS is ignored + and the color space is inherited from the actual backdrop with which the + page is composited. + Default value: the color space of the parent group or page into which this + transparency group is painted. (The parent’s color space in turn can be + either explicitly specified or inherited.) + + + + + (Optional) A flag specifying whether the transparency group is isolated. + If this flag is true, objects within the group are composited against a fully + transparent initial backdrop; if false, they are composited against the + group’s backdrop. + Default value: false. + In the group attributes dictionary for a page, the interpretation of this + entry is slightly altered. In the normal case in which the page is imposed + directly on the output medium, the page group is effectively isolated and + the specified I value is ignored. But if the page is in turn used as an + element of some other page, it is treated as if it were a transparency + group XObject; the I value is interpreted in the normal way to determine + whether the page group is isolated. + + + + + (Optional) A flag specifying whether the transparency group is a knockout + group. If this flag is false, later objects within the group are composited + with earlier ones with which they overlap; if true, they are composited with + the group’s initial backdrop and overwrite (“knock out”) any earlier + overlapping objects. + Default value: false. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents a TrueType font. + + + + + Initializes a new instance of PdfTrueTypeFont from an XFont. + + + + + Prepares the object to get saved. + + + + + Predefined keys of this dictionary. + + + + + (Required) The type of PDF object that this dictionary describes; + must be Font for a font dictionary. + + + + + (Required) The type of font; must be TrueType for a TrueType font. + + + + + (Required in PDF 1.0; optional otherwise) The name by which this font is + referenced in the Font subdictionary of the current resource dictionary. + + + + + (Required) The PostScript name of the font. For Type 1 fonts, this is usually + the value of the FontName entry in the font program; for more information. + The Post-Script name of the font can be used to find the font’s definition in + the consumer application or its environment. It is also the name that is used when + printing to a PostScript output device. + + + + + (Required except for the standard 14 fonts) The first character code defined + in the font’s Widths array. + + + + + (Required except for the standard 14 fonts) The last character code defined + in the font’s Widths array. + + + + + (Required except for the standard 14 fonts; indirect reference preferred) + An array of (LastChar - FirstChar + 1) widths, each element being the glyph width + for the character code that equals FirstChar plus the array index. For character + codes outside the range FirstChar to LastChar, the value of MissingWidth from the + FontDescriptor entry for this font is used. The glyph widths are measured in units + in which 1000 units corresponds to 1 unit in text space. These widths must be + consistent with the actual widths given in the font program. + + + + + (Required except for the standard 14 fonts; must be an indirect reference) + A font descriptor describing the font’s metrics other than its glyph widths. + Note: For the standard 14 fonts, the entries FirstChar, LastChar, Widths, and + FontDescriptor must either all be present or all be absent. Ordinarily, they are + absent; specifying them enables a standard font to be overridden. + + + + + (Optional) A specification of the font’s character encoding if different from its + built-in encoding. The value of Encoding is either the name of a predefined + encoding (MacRomanEncoding, MacExpertEncoding, or WinAnsiEncoding, as described in + Appendix D) or an encoding dictionary that specifies differences from the font’s + built-in encoding or from a specified predefined encoding. + + + + + (Optional; PDF 1.2) A stream containing a CMap file that maps character + codes to Unicode values. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents a composite font. Used for Unicode encoding. + + + + + Predefined keys of this dictionary. + + + + + (Required) The type of PDF object that this dictionary describes; + must be Font for a font dictionary. + + + + + (Required) The type of font; must be Type0 for a Type 0 font. + + + + + (Required) The PostScript name of the font. In principle, this is an arbitrary + name, since there is no font program associated directly with a Type 0 font + dictionary. The conventions described here ensure maximum compatibility + with existing Acrobat products. + If the descendant is a Type 0 CIDFont, this name should be the concatenation + of the CIDFont’s BaseFont name, a hyphen, and the CMap name given in the + Encoding entry (or the CMapName entry in the CMap). If the descendant is a + Type 2 CIDFont, this name should be the same as the CIDFont’s BaseFont name. + + + + + (Required) The name of a predefined CMap, or a stream containing a CMap + that maps character codes to font numbers and CIDs. If the descendant is a + Type 2 CIDFont whose associated TrueType font program is not embedded + in the PDF file, the Encoding entry must be a predefined CMap name. + + + + + (Required) A one-element array specifying the CIDFont dictionary that is the + descendant of this Type 0 font. + + + + + ((Optional) A stream containing a CMap file that maps character codes to + Unicode values. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Base class for all PDF external objects. + + + + + Initializes a new instance of the class. + + The document that owns the object. + + + + Predefined keys of this dictionary. + + + + + Specifies the annotation flags. + + + + + If set, do not display the annotation if it does not belong to one of the standard + annotation types and no annotation handler is available. If clear, display such an + unknown annotation using an appearance stream specified by its appearancedictionary, + if any. + + + + + (PDF 1.2) If set, do not display or print the annotation or allow it to interact + with the user, regardless of its annotation type or whether an annotation + handler is available. In cases where screen space is limited, the ability to hide + and show annotations selectively can be used in combination with appearance + streams to display auxiliary pop-up information similar in function to online + help systems. + + + + + (PDF 1.2) If set, print the annotation when the page is printed. If clear, never + print the annotation, regardless of whether it is displayed on the screen. This + can be useful, for example, for annotations representing interactive pushbuttons, + which would serve no meaningful purpose on the printed page. + + + + + (PDF 1.3) If set, do not scale the annotation’s appearance to match the magnification + of the page. The location of the annotation on the page (defined by the + upper-left corner of its annotation rectangle) remains fixed, regardless of the + page magnification. See below for further discussion. + + + + + (PDF 1.3) If set, do not rotate the annotation’s appearance to match the rotation + of the page. The upper-left corner of the annotation rectangle remains in a fixed + location on the page, regardless of the page rotation. See below for further discussion. + + + + + (PDF 1.3) If set, do not display the annotation on the screen or allow it to + interact with the user. The annotation may be printed (depending on the setting + of the Print flag) but should be considered hidden for purposes of on-screen + display and user interaction. + + + + + (PDF 1.3) If set, do not allow the annotation to interact with the user. The + annotation may be displayed or printed (depending on the settings of the + NoView and Print flags) but should not respond to mouse clicks or change its + appearance in response to mouse motions. + Note: This flag is ignored for widget annotations; its function is subsumed by + the ReadOnly flag of the associated form field. + + + + + (PDF 1.4) If set, do not allow the annotation to be deleted or its properties + (including position and size) to be modified by the user. However, this flag does + not restrict changes to the annotation’s contents, such as the value of a form + field. + + + + + (PDF 1.5) If set, invert the interpretation of the NoView flag for certain events. + A typical use is to have an annotation that appears only when a mouse cursor is + held over it. + + + + + Specifies the predefined icon names of rubber stamp annotations. + + + + + A pre-defined rubber stamp annotation icon. + + + + + A pre-defined rubber stamp annotation icon. + + + + + A pre-defined rubber stamp annotation icon. + + + + + A pre-defined rubber stamp annotation icon. + + + + + A pre-defined rubber stamp annotation icon. + + + + + A pre-defined rubber stamp annotation icon. + + + + + A pre-defined rubber stamp annotation icon. + + + + + A pre-defined rubber stamp annotation icon. + + + + + A pre-defined rubber stamp annotation icon. + + + + + A pre-defined rubber stamp annotation icon. + + + + + A pre-defined rubber stamp annotation icon. + + + + + A pre-defined rubber stamp annotation icon. + + + + + A pre-defined rubber stamp annotation icon. + + + + + A pre-defined rubber stamp annotation icon. + + + + + A pre-defined rubber stamp annotation icon. + + + + + Specifies the pre-defined icon names of text annotations. + + + + + A pre-defined annotation icon. + + + + + A pre-defined annotation icon. + + + + + A pre-defined annotation icon. + + + + + A pre-defined annotation icon. + + + + + A pre-defined annotation icon. + + + + + A pre-defined annotation icon. + + + + + A pre-defined annotation icon. + + + + + A pre-defined annotation icon. + + + + + Represents the base class of all annotations. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Removes an annotation from the document + + + + + + Gets or sets the annotation flags of this instance. + + + + + Gets or sets the PdfAnnotations object that this annotation belongs to. + + + + + Gets or sets the annotation rectangle, defining the location of the annotation + on the page in default user space units. + + + + + Gets or sets the text label to be displayed in the title bar of the annotation’s + pop-up window when open and active. By convention, this entry identifies + the user who added the annotation. + + + + + Gets or sets text representing a short description of the subject being + addressed by the annotation. + + + + + Gets or sets the text to be displayed for the annotation or, if this type of + annotation does not display text, an alternate description of the annotation’s + contents in human-readable form. + + + + + Gets or sets the color representing the components of the annotation. If the color + has an alpha value other than 1, it is ignored. Use property Opacity to get or set the + opacity of an annotation. + + + + + Gets or sets the constant opacity value to be used in painting the annotation. + This value applies to all visible elements of the annotation in its closed state + (including its background and border) but not to the popup window that appears when + the annotation is opened. + + + + + Predefined keys of this dictionary. + + + + + (Optional) The type of PDF object that this dictionary describes; if present, + must be Annot for an annotation dictionary. + + + + + (Required) The type of annotation that this dictionary describes. + + + + + (Required) The annotation rectangle, defining the location of the annotation + on the page in default user space units. + + + + + (Optional) Text to be displayed for the annotation or, if this type of annotation + does not display text, an alternate description of the annotation’s contents + in human-readable form. In either case, this text is useful when + extracting the document’s contents in support of accessibility to users with + disabilities or for other purposes. + + + + + (Optional; PDF 1.4) The annotation name, a text string uniquely identifying it + among all the annotations on its page. + + + + + (Optional; PDF 1.1) The date and time when the annotation was most recently + modified. The preferred format is a date string, but viewer applications should be + prepared to accept and display a string in any format. + + + + + (Optional; PDF 1.1) A set of flags specifying various characteristics of the annotation. + Default value: 0. + + + + + (Optional; PDF 1.2) A border style dictionary specifying the characteristics of + the annotation’s border. + + + + + (Optional; PDF 1.2) An appearance dictionary specifying how the annotation + is presented visually on the page. Individual annotation handlers may ignore + this entry and provide their own appearances. + + + + + (Required if the appearance dictionary AP contains one or more subdictionaries; PDF 1.2) + The annotation’s appearance state, which selects the applicable appearance stream from + an appearance subdictionary. + + + + + (Optional) An array specifying the characteristics of the annotation’s border. + The border is specified as a rounded rectangle. + In PDF 1.0, the array consists of three numbers defining the horizontal corner + radius, vertical corner radius, and border width, all in default user space units. + If the corner radii are 0, the border has square (not rounded) corners; if the border + width is 0, no border is drawn. + In PDF 1.1, the array may have a fourth element, an optional dash array defining a + pattern of dashes and gaps to be used in drawing the border. The dash array is + specified in the same format as in the line dash pattern parameter of the graphics state. + For example, a Border value of [0 0 1 [3 2]] specifies a border 1 unit wide, with + square corners, drawn with 3-unit dashes alternating with 2-unit gaps. Note that no + dash phase is specified; the phase is assumed to be 0. + Note: In PDF 1.2 or later, this entry may be ignored in favor of the BS entry. + + + + + (Optional; PDF 1.1) An array of three numbers in the range 0.0 to 1.0, representing + the components of a color in the DeviceRGB color space. This color is used for the + following purposes: + • The background of the annotation’s icon when closed + • The title bar of the annotation’s pop-up window + • The border of a link annotation + + + + + (Required if the annotation is a structural content item; PDF 1.3) + The integer key of the annotation’s entry in the structural parent tree. + + + + + (Optional; PDF 1.1) An action to be performed when the annotation is activated. + Note: This entry is not permitted in link annotations if a Dest entry is present. + Also note that the A entry in movie annotations has a different meaning. + + + + + (Optional; PDF 1.1) The text label to be displayed in the title bar of the annotation’s + pop-up window when open and active. By convention, this entry identifies + the user who added the annotation. + + + + + (Optional; PDF 1.3) An indirect reference to a pop-up annotation for entering or + editing the text associated with this annotation. + + + + + (Optional; PDF 1.4) The constant opacity value to be used in painting the annotation. + This value applies to all visible elements of the annotation in its closed state + (including its background and border) but not to the popup window that appears when + the annotation is opened. + The specified value is not used if the annotation has an appearance stream; in that + case, the appearance stream must specify any transparency. (However, if the viewer + regenerates the annotation’s appearance stream, it may incorporate the CA value + into the stream’s content.) + The implicit blend mode is Normal. + Default value: 1.0. + + + + + (Optional; PDF 1.5) Text representing a short description of the subject being + addressed by the annotation. + + + + + Represents the annotations array of a page. + + + + + Adds the specified annotation. + + The annotation. + + + + Removes an annotation from the document. + + + + + Removes all the annotations from the current page. + + + + + Gets the number of annotations in this collection. + + + + + Gets the at the specified index. + + + + + Gets the page the annotations belongs to. + + + + + Fixes the /P element in imported annotation. + + + + + Returns an enumerator that iterates through a collection. + + + + + Represents a generic annotation. Used for annotation dictionaries unknown to PDFsharp. + + + + + Predefined keys of this dictionary. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents a link annotation. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Creates a link within the current document. + + The link area in default page coordinates. + The one-based destination page number. + + + + Creates a link to the web. + + + + + Creates a link to a file. + + + + + Predefined keys of this dictionary. + + + + + (Optional; not permitted if an A entry is present) A destination to be displayed + when the annotation is activated. + + + + + (Optional; PDF 1.2) The annotation’s highlighting mode, the visual effect to be + used when the mouse button is pressed or held down inside its active area: + N (None) No highlighting. + I (Invert) Invert the contents of the annotation rectangle. + O (Outline) Invert the annotation’s border. + P (Push) Display the annotation as if it were being pushed below the surface of the page. + Default value: I. + Note: In PDF 1.1, highlighting is always done by inverting colors inside the annotation rectangle. + + + + + (Optional; PDF 1.3) A URI action formerly associated with this annotation. When Web + Capture changes and annotation from a URI to a go-to action, it uses this entry to save + the data from the original URI action so that it can be changed back in case the target page for + the go-to action is subsequently deleted. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents a rubber stamp annotation. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The document. + + + + Gets or sets an icon to be used in displaying the annotation. + + + + + Predefined keys of this dictionary. + + + + + (Optional) The name of an icon to be used in displaying the annotation. Viewer + applications should provide predefined icon appearances for at least the following + standard names: + Approved + AsIs + Confidential + Departmental + Draft + Experimental + Expired + Final + ForComment + ForPublicRelease + NotApproved + NotForPublicRelease + Sold + TopSecret + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents a text annotation. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a flag indicating whether the annotation should initially be displayed open. + + + + + Gets or sets an icon to be used in displaying the annotation. + + + + + Predefined keys of this dictionary. + + + + + (Optional) A flag specifying whether the annotation should initially be displayed open. + Default value: false (closed). + + + + + (Optional) The name of an icon to be used in displaying the annotation. Viewer + applications should provide predefined icon appearances for at least the following + standard names: + Comment + Help + Insert + Key + NewParagraph + Note + Paragraph + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents a text annotation. + + + + + Predefined keys of this dictionary. + + + + + (Optional) The annotation’s highlighting mode, the visual effect to be used when + the mouse button is pressed or held down inside its active area: + N (None) No highlighting. + I (Invert) Invert the contents of the annotation rectangle. + O (Outline) Invert the annotation’s border. + P (Push) Display the annotation’s down appearance, if any. If no down appearance is defined, + offset the contents of the annotation rectangle to appear as if it were being pushed below + the surface of the page. + T (Toggle) Same as P (which is preferred). + A highlighting mode other than P overrides any down appearance defined for the annotation. + Default value: I. + + + + + (Optional) An appearance characteristics dictionary to be used in constructing a dynamic + appearance stream specifying the annotation’s visual presentation on the page. + The name MK for this entry is of historical significance only and has no direct meaning. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Base class for all PDF content stream objects. + + + + + Initializes a new instance of the class. + + + + + Creates a new object that is a copy of the current instance. + + + + + Creates a new object that is a copy of the current instance. + + + + + Implements the copy mechanism. Must be overridden in derived classes. + + + + + + + + + + Represents a comment in a PDF content stream. + + + + + Creates a new object that is a copy of the current instance. + + + + + Implements the copy mechanism of this class. + + + + + Gets or sets the comment text. + + + + + Returns a string that represents the current comment. + + + + + Represents a sequence of objects in a PDF content stream. + + + + + Creates a new object that is a copy of the current instance. + + + + + Implements the copy mechanism of this class. + + + + + Adds the specified sequence. + + The sequence. + + + + Adds the specified value add the end of the sequence. + + + + + Removes all elements from the sequence. + + + + + Determines whether the specified value is in the sequence. + + + + + Returns the index of the specified value in the sequence or -1, if no such value is in the sequence. + + + + + Inserts the specified value in the sequence. + + + + + Removes the specified value from the sequence. + + + + + Removes the value at the specified index from the sequence. + + + + + Gets or sets a CObject at the specified index. + + + + + + Copies the elements of the sequence to the specified array. + + + + + Gets the number of elements contained in the sequence. + + + + + Returns an enumerator that iterates through the sequence. + + + + + Converts the sequence to a PDF content stream. + + + + + Returns a string containing all elements of the sequence. + + + + + Represents the base class for numerical objects in a PDF content stream. + + + + + Creates a new object that is a copy of the current instance. + + + + + Implements the copy mechanism of this class. + + + + + Represents an integer value in a PDF content stream. + + + + + Creates a new object that is a copy of the current instance. + + + + + Implements the copy mechanism of this class. + + + + + Gets or sets the value. + + + + + Returns a string that represents the current value. + + + + + Represents a real value in a PDF content stream. + + + + + Creates a new object that is a copy of the current instance. + + + + + Implements the copy mechanism of this class. + + + + + Gets or sets the value. + + + + + Returns a string that represents the current value. + + + + + Type of the parsed string. + + + + + The string has the format "(...)". + + + + + The string has the format "<...>". + + + + + The string... TODO. + + + + + The string... TODO. + + + + + HACK: The string is the content of a dictionary. + Currently there is no parser for dictionaries in Content Streams. + + + + + Represents a string value in a PDF content stream. + + + + + Creates a new object that is a copy of the current instance. + + + + + Implements the copy mechanism of this class. + + + + + Gets or sets the value. + + + + + Gets or sets the type of the content string. + + + + + Returns a string that represents the current value. + + + + + Represents a name in a PDF content stream. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The name. + + + + Creates a new object that is a copy of the current instance. + + + + + Implements the copy mechanism of this class. + + + + + Gets or sets the name. Names must start with a slash. + + + + + Returns a string that represents the current value. + + + + + Represents an array of objects in a PDF content stream. + + + + + Creates a new object that is a copy of the current instance. + + + + + Implements the copy mechanism of this class. + + + + + Returns a string that represents the current value. + + + + + Represents an operator a PDF content stream. + + + + + Initializes a new instance of the class. + + + + + Creates a new object that is a copy of the current instance. + + + + + Implements the copy mechanism of this class. + + + + + Gets or sets the name of the operator + + The name. + + + + Gets or sets the operands. + + The operands. + + + + Gets the operator description for this instance. + + + + + Returns a string that represents the current operator. + + + + + Specifies the group of operations the op-code belongs to. + + + + + + + + + + + + + + + The names of the op-codes. + + + + + Close, fill, and stroke path using nonzero winding number rule. + + + + + Fill and stroke path using nonzero winding number rule. + + + + + Close, fill, and stroke path using even-odd rule. + + + + + Fill and stroke path using even-odd rule. + + + + + (PDF 1.2) Begin marked-content sequence with property list. + + + + + Begin inline image object. + + + + + (PDF 1.2) Begin marked-content sequence. + + + + + Begin text object. + + + + + (PDF 1.1) Begin compatibility section. + + + + + (PDF 1.2) Define marked-content point with property list. + + + + + (PDF 1.2) End marked-content sequence. + + + + + (PDF 1.1) End compatibility section. + + + + + (PDF 1.2) Define marked-content point + + + + + Move to next line and show text. + + + + + Set word and character spacing, move to next line, and show text. + + + + + Represents a PDF content stream operator description. + + + + + Initializes a new instance of the class. + + The name. + The enum value of the operator. + The number of operands. + The postscript equivalent, or null, if no such operation exists. + The flags. + The description from Adobe PDF Reference. + + + + The name of the operator. + + + + + The enum value of the operator. + + + + + The number of operands. -1 indicates a variable number of operands. + + + + + The flags. + + + + + The postscript equivalent, or null, if no such operation exists. + + + + + The description from Adobe PDF Reference. + + + + + Static class with all PDF op-codes. + + + + + Operators from name. + + The name. + + + + Initializes the class. + + + + + Array of all OpCodes. + + + + + Character table by name. Same as PdfSharp.Pdf.IO.Chars. Not yet clear if necessary. + + + + + Lexical analyzer for PDF content files. Adobe specifies no grammar, but it seems that it + is a simple post-fix notation. + + + + + Initializes a new instance of the Lexer class. + + + + + Initializes a new instance of the Lexer class. + + + + + Reads the next token and returns its type. + + + + + Scans a comment line. (Not yet used, comments are skipped by lexer.) + + + + + Scans the bytes of an inline image. + NYI: Just scans over it. + + + + + Scans a name. + + + + + Scans an integer or real number. + + + + + Scans an operator. + + + + + Move current position one character further in content stream. + + + + + Resets the current token to the empty string. + + + + + Appends current character to the token and reads next one. + + + + + If the current character is not a white space, the function immediately returns it. + Otherwise the PDF cursor is moved forward to the first non-white space or EOF. + White spaces are NUL, HT, LF, FF, CR, and SP. + + + + + Gets or sets the current symbol. + + + + + Gets the current token. + + + + + Interprets current token as integer literal. + + + + + Interpret current token as real or integer literal. + + + + + Indicates whether the specified character is a content stream white-space character. + + + + + Indicates whether the specified character is an content operator character. + + + + + Indicates whether the specified character is a PDF delimiter character. + + + + + Gets the length of the content. + + + + + Represents the functionality for reading PDF content streams. + + + + + Reads the content stream(s) of the specified page. + + The page. + + + + Reads the specified content. + + The content. + + + + Reads the specified content. + + The content. + + + + Exception thrown by ContentReader. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + The inner exception. + + + + Represents a writer for generation of PDF streams. + + + + + Writes the specified value to the PDF stream. + + + + + Gets or sets the indentation for a new indentation level. + + + + + Increases indent level. + + + + + Decreases indent level. + + + + + Gets an indent string of current indent. + + + + + Gets the underlying stream. + + + + + Provides the functionality to parse PDF content streams. + + + + + Parses whatever comes until the specified stop symbol is reached. + + + + + Reads the next symbol that must be the specified one. + + + + + Terminal symbols recognized by PDF content stream lexer. + + + + + Implements the ASCII85Decode filter. + + + + + Encodes the specified data. + + + + + Decodes the specified data. + + + + + Implements the ASCIIHexDecode filter. + + + + + Encodes the specified data. + + + + + Decodes the specified data. + + + + + Reserved for future extension. + + + + + Base class for all stream filters + + + + + When implemented in a derived class encodes the specified data. + + + + + Encodes a raw string. + + + + + When implemented in a derived class decodes the specified data. + + + + + Decodes the specified data. + + + + + Decodes to a raw string. + + + + + Decodes to a raw string. + + + + + Removes all white spaces from the data. The function assumes that the bytes are characters. + + + + + Applies standard filters to streams. + + + + + Gets the filter specified by the case sensitive name. + + + + + Gets the filter singleton. + + + + + Gets the filter singleton. + + + + + Gets the filter singleton. + + + + + Gets the filter singleton. + + + + + Encodes the data with the specified filter. + + + + + Encodes a raw string with the specified filter. + + + + + Decodes the data with the specified filter. + + + + + Decodes the data with the specified filter. + + + + + Decodes the data with the specified filter. + + + + + Decodes to a raw string with the specified filter. + + + + + Decodes to a raw string with the specified filter. + + + + + Implements the FlateDecode filter by wrapping SharpZipLib. + + + + + Encodes the specified data. + + + + + Encodes the specified data. + + + + + Decodes the specified data. + + + + + Implements the LzwDecode filter. + + + + + Throws a NotImplementedException because the obsolete LZW encoding is not supported by PDFsharp. + + + + + Decodes the specified data. + + + + + Initialize the dictionary. + + + + + Add a new entry to the Dictionary. + + + + + Returns the next set of bits. + + + + + An encoder for PDF AnsiEncoding. + + + + + Gets the byte count. + + + + + Gets the bytes. + + + + + Gets the character count. + + + + + Gets the chars. + + + + + When overridden in a derived class, calculates the maximum number of bytes produced by encoding the specified number of characters. + + The number of characters to encode. + + The maximum number of bytes produced by encoding the specified number of characters. + + + + + When overridden in a derived class, calculates the maximum number of characters produced by decoding the specified number of bytes. + + The number of bytes to decode. + + The maximum number of characters produced by decoding the specified number of bytes. + + + + + Indicates whether the specified Unicode character is available in the ANSI code page 1252. + + + + + Maps Unicode to ANSI code page 1252. + + + + + Maps WinAnsi to Unicode characters. + + + + + Helper functions for RGB and CMYK colors. + + + + + Checks whether a color mode and a color match. + + + + + Checks whether the color mode of a document and a color match. + + + + + Determines whether two colors are equal referring to their CMYK color values. + + + + + An encoder for PDF DocEncoding. + + + + + Converts WinAnsi to DocEncode characters. Based upon PDF Reference 1.6. + + + + + Groups a set of static encoding helper functions. + + + + + Gets the raw encoding. + + + + + Gets the raw Unicode encoding. + + + + + Gets the Windows 1252 (ANSI) encoding. + + + + + Gets the PDF DocEncoding encoding. + + + + + Gets the UNICODE little-endian encoding. + + + + + Converts a raw string into a raw string literal, possibly encrypted. + + + + + Converts a raw string into a raw string literal, possibly encrypted. + + + + + Converts a raw string into a raw hexadecimal string literal, possibly encrypted. + + + + + Converts a raw string into a raw hexadecimal string literal, possibly encrypted. + + + + + Converts the specified byte array into a byte array representing a string literal. + + The bytes of the string. + Indicates whether one or two bytes are one character. + Indicates whether to use Unicode prefix. + Indicates whether to create a hexadecimal string literal. + Encrypts the bytes if specified. + The PDF bytes. + + + + Converts WinAnsi to DocEncode characters. Incomplete, just maps € and some other characters. + + + + + ...because I always forget CultureInfo.InvariantCulture and wonder why Acrobat + cannot understand my German decimal separator... + + + + + Converts a float into a string with up to 3 decimal digits and a decimal point. + + + + + Converts an XColor into a string with up to 3 decimal digits and a decimal point. + + + + + Converts an XMatrix into a string with up to 4 decimal digits and a decimal point. + + + + + An encoder for raw strings. The raw encoding is simply the identity relation between + characters and bytes. PDFsharp internally works with raw encoded strings instead of + byte arrays because strings are much more handy than byte arrays. + + + Raw encoded strings represent an array of bytes. Therefore a character greater than + 255 is not valid in a raw encoded string. + + + + + Initializes a new instance of the class. + + + + + When overridden in a derived class, calculates the number of bytes produced by encoding a set of characters from the specified character array. + + The character array containing the set of characters to encode. + The index of the first character to encode. + The number of characters to encode. + + The number of bytes produced by encoding the specified characters. + + + + + When overridden in a derived class, encodes a set of characters from the specified character array into the specified byte array. + + The character array containing the set of characters to encode. + The index of the first character to encode. + The number of characters to encode. + The byte array to contain the resulting sequence of bytes. + The index at which to start writing the resulting sequence of bytes. + + The actual number of bytes written into . + + + + + When overridden in a derived class, calculates the number of characters produced by decoding a sequence of bytes from the specified byte array. + + The byte array containing the sequence of bytes to decode. + The index of the first byte to decode. + The number of bytes to decode. + + The number of characters produced by decoding the specified sequence of bytes. + + + + + When overridden in a derived class, decodes a sequence of bytes from the specified byte array into the specified character array. + + The byte array containing the sequence of bytes to decode. + The index of the first byte to decode. + The number of bytes to decode. + The character array to contain the resulting set of characters. + The index at which to start writing the resulting set of characters. + + The actual number of characters written into . + + + + + When overridden in a derived class, calculates the maximum number of bytes produced by encoding the specified number of characters. + + The number of characters to encode. + + The maximum number of bytes produced by encoding the specified number of characters. + + + + + When overridden in a derived class, calculates the maximum number of characters produced by decoding the specified number of bytes. + + The number of bytes to decode. + + The maximum number of characters produced by decoding the specified number of bytes. + + + + + An encoder for Unicode strings. + (That means, a character represents a glyph index.) + + + + + Provides a thread-local cache for large objects. + + + + + Maps path to document handle. + + + + + Character table by name. + + + + + The EOF marker. + + + + + The null byte. + + + + + The carriage return character (ignored by lexer). + + + + + The line feed character. + + + + + The bell character. + + + + + The backspace character. + + + + + The form feed character. + + + + + The horizontal tab character. + + + + + The vertical tab character. + + + + + The non-breakable space character (aka no-break space or non-breaking space). + + + + + The space character. + + + + + The double quote character. + + + + + The single quote character. + + + + + The left parenthesis. + + + + + The right parenthesis. + + + + + The left brace. + + + + + The right brace. + + + + + The left bracket. + + + + + The right bracket. + + + + + The less-than sign. + + + + + The greater-than sign. + + + + + The equal sign. + + + + + The period. + + + + + The semicolon. + + + + + The colon. + + + + + The slash. + + + + + The bar character. + + + + + The back slash. + + + + + The percent sign. + + + + + The dollar sign. + + + + + The at sign. + + + + + The number sign. + + + + + The question mark. + + + + + The hyphen. + + + + + The soft hyphen. + + + + + The currency sign. + + + + + Determines the type of the password. + + + + + Password is neither user nor owner password. + + + + + Password is user password. + + + + + Password is owner password. + + + + + Determines how a PDF document is opened. + + + + + The PDF stream is completely read into memory and can be modified. Pages can be deleted or + inserted, but it is not possible to extract pages. This mode is useful for modifying an + existing PDF document. + + + + + The PDF stream is opened for importing pages from it. A document opened in this mode cannot + be modified. + + + + + The PDF stream is completely read into memory, but cannot be modified. This mode preserves the + original internal structure of the document and is useful for analyzing existing PDF files. + + + + + The PDF stream is partially read for information purposes only. The only valid operation is to + call the Info property at the imported document. This option is very fast and needs less memory + and is e.g. useful for browsing information about a collection of PDF documents in a user interface. + + + + + Determines how the PDF output stream is formatted. Even all formats create valid PDF files, + only Compact or Standard should be used for production purposes. + + + + + The PDF stream contains no unnecessary characters. This is default in release build. + + + + + The PDF stream contains some superfluous line feeds, but is more readable. + + + + + The PDF stream is indented to reflect the nesting levels of the objects. This is useful + for analyzing PDF files, but increases the size of the file significantly. + + + + + The PDF stream is indented to reflect the nesting levels of the objects and contains additional + information about the PDFsharp objects. Furthermore content streams are not deflated. This + is useful for debugging purposes only and increases the size of the file significantly. + + + + + INTERNAL USE ONLY. + + + + + If only this flag is specified the result is a regular valid PDF stream. + + + + + Omit writing stream data. For debugging purposes only. + With this option the result is not valid PDF. + + + + + Omit inflate filter. For debugging purposes only. + + + + + Terminal symbols recognized by lexer. + + + + + Lexical analyzer for PDF files. Technically a PDF file is a stream of bytes. Some chunks + of bytes represent strings in several encodings. The actual encoding depends on the + context where the string is used. Therefore the bytes are 'raw encoded' into characters, + i.e. a character or token read by the lexer has always character values in the range from + 0 to 255. + + + + + Initializes a new instance of the Lexer class. + + + + + Gets or sets the position within the PDF stream. + + + + + Reads the next token and returns its type. If the token starts with a digit, the parameter + testReference specifies how to treat it. If it is false, the lexer scans for a single integer. + If it is true, the lexer checks if the digit is the prefix of a reference. If it is a reference, + the token is set to the object ID followed by the generation number separated by a blank + (the 'R' is omitted from the token). + + + + + Reads the raw content of a stream. + + + + + Reads a string in raw encoding. + + + + + Scans a comment line. + + + + + Scans a name. + + + + + Scans a number. + + + + + Scans a keyword. + + + + + Scans a literal string, contained between "(" and ")". + + + + + Move current position one character further in PDF stream. + + + + + Appends current character to the token and reads next one. + + + + + If the current character is not a white space, the function immediately returns it. + Otherwise the PDF cursor is moved forward to the first non-white space or EOF. + White spaces are NUL, HT, LF, FF, CR, and SP. + + + + + Gets the current symbol. + + + + + Gets the current token. + + + + + Interprets current token as boolean literal. + + + + + Interprets current token as integer literal. + + + + + Interprets current token as unsigned integer literal. + + + + + Interprets current token as real or integer literal. + + + + + Interprets current token as object ID. + + + + + Indicates whether the specified character is a PDF white-space character. + + + + + Indicates whether the specified character is a PDF delimiter character. + + + + + Gets the length of the PDF output. + + + + + Provides the functionality to parse PDF documents. + + + + + Sets PDF input stream position to the specified object. + + + + + Reads PDF object from input stream. + + Either the instance of a derived type or null. If it is null + an appropriate object is created. + The address of the object. + If true, specifies that all indirect objects + are included recursively. + If true, the objects is parsed from an object stream. + + + + Reads the stream of a dictionary. + + + + + Parses whatever comes until the specified stop symbol is reached. + + + + + Reads the object ID and the generation and sets it into the specified object. + + + + + Reads the next symbol that must be the specified one. + + + + + Reads the next token that must be the specified one. + + + + + Reads a name from the PDF data stream. The preceding slash is part of the result string. + + + + + Reads an integer value directly from the PDF data stream. + + + + + Reads an object from the PDF input stream using the default parser. + + + + + Reads the irefs from the compressed object with the specified index in the object stream + of the object with the specified object id. + + + + + Reads the compressed object with the specified index in the object stream + of the object with the specified object id. + + + + + Reads the compressed object with the specified number at the given offset. + The parser must be initialized with the stream an object stream object. + + + + + Reads the object stream header as pairs of integers from the beginning of the + stream of an object stream. Parameter first is the value of the First entry of + the object stream object. + + + + + Reads the cross-reference table(s) and their trailer dictionary or + cross-reference streams. + + + + + Reads cross reference table(s) and trailer(s). + + + + + Checks the x reference table entry. Returns true if everything is correct. + Return false if the keyword "obj" was found, but ID or Generation are incorrect. + Throws an exception otherwise. + + The position where the object is supposed to be. + The ID from the XRef table. + The generation from the XRef table. + The identifier found in the PDF file. + The generation found in the PDF file. + + + + + Reads cross reference stream(s). + + + + + Parses a PDF date string. + + + + + Encapsulates the arguments of the PdfPasswordProvider delegate. + + + + + Sets the password to open the document with. + + + + + When set to true the PdfReader.Open function returns null indicating that no PdfDocument was created. + + + + + A delegated used by the PdfReader.Open function to retrieve a password if the document is protected. + + + + + Represents the functionality for reading PDF documents. + + + + + Determines whether the file specified by its path is a PDF file by inspecting the first eight + bytes of the data. If the file header has the form «%PDF-x.y» the function returns the version + number as integer (e.g. 14 for PDF 1.4). If the file header is invalid or inaccessible + for any reason, 0 is returned. The function never throws an exception. + + + + + Determines whether the specified stream is a PDF file by inspecting the first eight + bytes of the data. If the data begins with «%PDF-x.y» the function returns the version + number as integer (e.g. 14 for PDF 1.4). If the data is invalid or inaccessible + for any reason, 0 is returned. The function never throws an exception. + + + + + Determines whether the specified data is a PDF file by inspecting the first eight + bytes of the data. If the data begins with «%PDF-x.y» the function returns the version + number as integer (e.g. 14 for PDF 1.4). If the data is invalid or inaccessible + for any reason, 0 is returned. The function never throws an exception. + + + + + Implements scanning the PDF file version. + + + + + Opens an existing PDF document. + + + + + Opens an existing PDF document. + + + + + Opens an existing PDF document. + + + + + Opens an existing PDF document. + + + + + Opens an existing PDF document. + + + + + Opens an existing PDF document. + + + + + Opens an existing PDF document. + + + + + Opens an existing PDF document. + + + + + Opens an existing PDF document. + + + + + Opens an existing PDF document. + + + + + Opens an existing PDF document. + + + + + Exception thrown by PdfReader. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + The inner exception. + + + + Represents a writer for generation of PDF streams. + + + + + Gets or sets the kind of layout. + + + + + Writes the specified value to the PDF stream. + + + + + Writes the specified value to the PDF stream. + + + + + Writes the specified value to the PDF stream. + + + + + Writes the specified value to the PDF stream. + + + + + Writes the specified value to the PDF stream. + + + + + Writes the specified value to the PDF stream. + + + + + Writes the specified value to the PDF stream. + + + + + Writes the specified value to the PDF stream. + + + + + Writes the specified value to the PDF stream. + + + + + Writes the specified value to the PDF stream. + + + + + Begins a direct or indirect dictionary or array. + + + + + Ends a direct or indirect dictionary or array. + + + + + Writes the stream of the specified dictionary. + + + + + Gets or sets the indentation for a new indentation level. + + + + + Increases indent level. + + + + + Decreases indent level. + + + + + Gets an indent string of current indent. + + + + + Gets the underlying stream. + + + + + Represents the stack for the shift-reduce parser. It seems that it is only needed for + reduction of indirect references. + + + + + Gets the stack pointer index. + + + + + Gets the value at the specified index. Valid index is in range 0 up to sp-1. + + + + + Gets an item relative to the current stack pointer. The index must be a negative value (-1, -2, etc.). + + + + + Gets an item relative to the current stack pointer. The index must be a negative value (-1, -2, etc.). + + + + + Pushes the specified item onto the stack. + + + + + Replaces the last 'count' items with the specified item. + + + + + Replaces the last 'count' items with the specified item. + + + + + The stack pointer index. Points to the next free item. + + + + + An array representing the stack. + + + + + Specifies the security level of the PDF document. + + + + + Document is not protected. + + + + + Document is protected with 40-bit security. This option is for compatibility with + Acrobat 3 and 4 only. Use Encrypted128Bit whenever possible. + + + + + Document is protected with 128-bit security. + + + + + Specifies which operations are permitted when the document is opened with user access. + + + + + Permits everything. This is the default value. + + + + + Represents the base of all security handlers. + + + + + Predefined keys of this dictionary. + + + + + (Required) The name of the preferred security handler for this document. Typically, + it is the name of the security handler that was used to encrypt the document. If + SubFilter is not present, only this security handler should be used when opening + the document. If it is present, consumer applications can use any security handler + that implements the format specified by SubFilter. + Standard is the name of the built-in password-based security handler. Names for other + security handlers can be registered by using the procedure described in Appendix E. + + + + + (Optional; PDF 1.3) A name that completely specifies the format and interpretation of + the contents of the encryption dictionary. It is needed to allow security handlers other + than the one specified by Filter to decrypt the document. If this entry is absent, other + security handlers should not be allowed to decrypt the document. + + + + + (Optional but strongly recommended) A code specifying the algorithm to be used in encrypting + and decrypting the document: + 0 An algorithm that is undocumented and no longer supported, and whose use is strongly discouraged. + 1 Algorithm 3.1, with an encryption key length of 40 bits. + 2 (PDF 1.4) Algorithm 3.1, but permitting encryption key lengths greater than 40 bits. + 3 (PDF 1.4) An unpublished algorithm that permits encryption key lengths ranging from 40 to 128 bits. + 4 (PDF 1.5) The security handler defines the use of encryption and decryption in the document, using + the rules specified by the CF, StmF, and StrF entries. + The default value if this entry is omitted is 0, but a value of 1 or greater is strongly recommended. + + + + + (Optional; PDF 1.4; only if V is 2 or 3) The length of the encryption key, in bits. + The value must be a multiple of 8, in the range 40 to 128. Default value: 40. + + + + + (Optional; meaningful only when the value of V is 4; PDF 1.5) + A dictionary whose keys are crypt filter names and whose values are the corresponding + crypt filter dictionaries. Every crypt filter used in the document must have an entry + in this dictionary, except for the standard crypt filter names. + + + + + (Optional; meaningful only when the value of V is 4; PDF 1.5) + The name of the crypt filter that is used by default when decrypting streams. + The name must be a key in the CF dictionary or a standard crypt filter name. All streams + in the document, except for cross-reference streams or streams that have a Crypt entry in + their Filter array, are decrypted by the security handler, using this crypt filter. + Default value: Identity. + + + + + (Optional; meaningful only when the value of V is 4; PDF 1.) + The name of the crypt filter that is used when decrypting all strings in the document. + The name must be a key in the CF dictionary or a standard crypt filter name. + Default value: Identity. + + + + + (Optional; meaningful only when the value of V is 4; PDF 1.6) + The name of the crypt filter that should be used by default when encrypting embedded + file streams; it must correspond to a key in the CF dictionary or a standard crypt + filter name. This entry is provided by the security handler. Applications should respect + this value when encrypting embedded files, except for embedded file streams that have + their own crypt filter specifier. If this entry is not present, and the embedded file + stream does not contain a crypt filter specifier, the stream should be encrypted using + the default stream crypt filter specified by StmF. + + + + + Encapsulates access to the security settings of a PDF document. + + + + + Indicates whether the granted access to the document is 'owner permission'. Returns true if the document + is unprotected or was opened with the owner password. Returns false if the document was opened with the + user password. + + + + + Gets or sets the document security level. If you set the security level to anything but PdfDocumentSecurityLevel.None + you must also set a user and/or an owner password. Otherwise saving the document will fail. + + + + + Sets the user password of the document. Setting a password automatically sets the + PdfDocumentSecurityLevel to PdfDocumentSecurityLevel.Encrypted128Bit if its current + value is PdfDocumentSecurityLevel.None. + + + + + Sets the owner password of the document. Setting a password automatically sets the + PdfDocumentSecurityLevel to PdfDocumentSecurityLevel.Encrypted128Bit if its current + value is PdfDocumentSecurityLevel.None. + + + + + Determines whether the document can be saved. + + + + + Permits printing the document. Should be used in conjunction with PermitFullQualityPrint. + + + + + Permits modifying the document. + + + + + Permits content copying or extraction. + + + + + Permits commenting the document. + + + + + Permits filling of form fields. + + + + + Permits content extraction for accessibility. + + + + + Permits to insert, rotate, or delete pages and create bookmarks or thumbnail images even if + PermitModifyDocument is not set. + + + + + Permits to print in high quality. insert, rotate, or delete pages and create bookmarks or thumbnail images + even if PermitModifyDocument is not set. + + + + + PdfStandardSecurityHandler is the only implemented handler. + + + + + Represents the standard PDF security handler. + + + + + Sets the user password of the document. Setting a password automatically sets the + PdfDocumentSecurityLevel to PdfDocumentSecurityLevel.Encrypted128Bit if its current + value is PdfDocumentSecurityLevel.None. + + + + + Sets the owner password of the document. Setting a password automatically sets the + PdfDocumentSecurityLevel to PdfDocumentSecurityLevel.Encrypted128Bit if its current + value is PdfDocumentSecurityLevel.None. + + + + + Gets or sets the user access permission represented as an integer in the P key. + + + + + Encrypts the whole document. + + + + + Encrypts an indirect object. + + + + + Encrypts a dictionary. + + + + + Encrypts an array. + + + + + Encrypts a string. + + + + + Encrypts an array. + + + + + Checks the password. + + Password or null if no password is provided. + + + + Pads a password to a 32 byte array. + + + + + Generates the user key based on the padded user password. + + + + + Generates the user key based on the padded owner password. + + + + + Computes the padded user password from the padded owner password. + + + + + Computes the encryption key. + + + + + Computes the user key. + + + + + Prepare the encryption key. + + + + + Prepare the encryption key. + + + + + Prepare the encryption key. + + + + + Encrypts the data. + + + + + Encrypts the data. + + + + + Encrypts the data. + + + + + Encrypts the data. + + + + + Checks whether the calculated key correct. + + + + + Set the hash key for the specified object. + + + + + Prepares the security handler for encrypting the document. + + + + + The global encryption key. + + + + + The message digest algorithm MD5. + + + + + Bytes used for RC4 encryption. + + + + + The encryption key for the owner. + + + + + The encryption key for the user. + + + + + The encryption key for a particular object/generation. + + + + + The encryption key length for a particular object/generation. + + + + + Predefined keys of this dictionary. + + + + + (Required) A number specifying which revision of the standard security handler + should be used to interpret this dictionary: + • 2 if the document is encrypted with a V value less than 2 and does not have any of + the access permissions set (by means of the P entry, below) that are designated + "Revision 3 or greater". + • 3 if the document is encrypted with a V value of 2 or 3, or has any "Revision 3 or + greater" access permissions set. + • 4 if the document is encrypted with a V value of 4 + + + + + (Required) A 32-byte string, based on both the owner and user passwords, that is + used in computing the encryption key and in determining whether a valid owner + password was entered. + + + + + (Required) A 32-byte string, based on the user password, that is used in determining + whether to prompt the user for a password and, if so, whether a valid user or owner + password was entered. + + + + + (Required) A set of flags specifying which operations are permitted when the document + is opened with user access. + + + + + (Optional; meaningful only when the value of V is 4; PDF 1.5) Indicates whether + the document-level metadata stream is to be encrypted. Applications should respect this value. + Default value: true. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Specifies the type of a key's value in a dictionary. + + + + + Summary description for KeyInfo. + + + + + Identifies the state of the document + + + + + The document was created from scratch. + + + + + The document was created by opening an existing PDF file. + + + + + The document is disposed. + + + + + Sets the mode for the Deflater (FlateEncoder). + + + + + The default mode. + + + + + Fast encoding, but larger PDF files. + + + + + Best compression, but takes more time. + + + + + Specifies whether to compress JPEG images with the FlateDecode filter. + + + + + PDFsharp will try FlateDecode and use it if it leads to a reduction in PDF file size. + When FlateEncodeMode is set to BestCompression, this is more likely to reduce the file size, + but it takes considerably more time to create the PDF file. + + + + + PDFsharp will never use FlateDecode - files may be a few bytes larger, but file creation is faster. + + + + + PDFsharp will always use FlateDecode, even if this leads to larger files; + this option is meant for testing purposes only and should not be used for production code. + + + + + Specifies what color model is used in a PDF document. + + + + + All color values are written as specified in the XColor objects they come from. + + + + + All colors are converted to RGB. + + + + + All colors are converted to CMYK. + + + + + This class is undocumented and may change or drop in future releases. + + + + + Use document default to determine compression. + + + + + Leave custom values uncompressed. + + + + + Compress custom values using FlateDecode. + + + + + Specifies the embedding options of an XFont when converted into PDF. + Font embedding is not optional anymore. So Always is the only option. + + + + + All fonts are embedded. + + + + + Fonts are not embedded. This is not an option anymore. + + + + + Unicode fonts are embedded, WinAnsi fonts are not embedded. + + + + + Not yet implemented. + + + + + Specifies the encoding schema used for an XFont when converted into PDF. + + + + + Cause a font to use Windows-1252 encoding to encode text rendered with this font. + Same as Windows1252 encoding. + + + + + Cause a font to use Unicode encoding to encode text rendered with this font. + + + + + Unicode encoding. + + + + + Specifies the type of a page destination in outline items, annotations, or actions.. + + + + + Display the page with the coordinates (left, top) positioned at the upper-left corner of + the window and the contents of the page magnified by the factor zoom. + + + + + Display the page with its contents magnified just enough to fit the + entire page within the window both horizontally and vertically. + + + + + Display the page with the vertical coordinate top positioned at the top edge of + the window and the contents of the page magnified just enough to fit the entire + width of the page within the window. + + + + + Display the page with the horizontal coordinate left positioned at the left edge of + the window and the contents of the page magnified just enough to fit the entire + height of the page within the window. + + + + + Display the page designated by page, with its contents magnified just enough to + fit the rectangle specified by the coordinates left, bottom, right, and topentirely + within the window both horizontally and vertically. If the required horizontal and + vertical magnification factors are different, use the smaller of the two, centering + the rectangle within the window in the other dimension. A null value for any of + the parameters may result in unpredictable behavior. + + + + + Display the page with its contents magnified just enough to fit the rectangle specified + by the coordinates left, bottom, right, and topentirely within the window both + horizontally and vertically. + + + + + Display the page with the vertical coordinate top positioned at the top edge of + the window and the contents of the page magnified just enough to fit the entire + width of its bounding box within the window. + + + + + Display the page with the horizontal coordinate left positioned at the left edge of + the window and the contents of the page magnified just enough to fit the entire + height of its bounding box within the window. + + + + + Specifies the font style for the outline (bookmark) text. + + + + + Outline text is displayed using a regular font. + + + + + Outline text is displayed using an italic font. + + + + + Outline text is displayed using a bold font. + + + + + Outline text is displayed using a bold and italic font. + + + + + Specifies the page layout to be used by a viewer when the document is opened. + + + + + Display one page at a time. + + + + + Display the pages in one column. + + + + + Display the pages in two columns, with oddnumbered pages on the left. + + + + + Display the pages in two columns, with oddnumbered pages on the right. + + + + + (PDF 1.5) Display the pages two at a time, with odd-numbered pages on the left. + + + + + (PDF 1.5) Display the pages two at a time, with odd-numbered pages on the right. + + + + + Specifies how the document should be displayed by a viewer when opened. + + + + + Neither document outline nor thumbnail images visible. + + + + + Document outline visible. + + + + + Thumbnail images visible. + + + + + Full-screen mode, with no menu bar, windowcontrols, or any other window visible. + + + + + (PDF 1.5) Optional content group panel visible. + + + + + (PDF 1.6) Attachments panel visible. + + + + + Specifies how the document should be displayed by a viewer when opened. + + + + + Left to right. + + + + + Right to left (including vertical writing systems, such as Chinese, Japanese, and Korean) + + + + + Specifies how text strings are encoded. A text string is any text used outside of a page content + stream, e.g. document information, outline text, annotation text etc. + + + + + Specifies that hypertext uses PDF DocEncoding. + + + + + Specifies that hypertext uses unicode encoding. + + + + + Base class for all dictionary Keys classes. + + + + + Holds information about the value of a key in a dictionary. This information is used to create + and interpret this value. + + + + + Initializes a new instance of KeyDescriptor from the specified attribute during a KeysMeta + initializes itself using reflection. + + + + + Gets or sets the PDF version starting with the availability of the described key. + + + + + Returns the type of the object to be created as value for the described key. + + + + + Contains meta information about all keys of a PDF dictionary. + + + + + Gets the KeyDescriptor of the specified key, or null if no such descriptor exits. + + + + + Represents a PDF array object. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The document. + + + + Initializes a new instance of the class. + + The document. + The items. + + + + Initializes a new instance from an existing dictionary. Used for object type transformation. + + The array. + + + + Creates a copy of this array. Direct elements are deep copied. + Indirect references are not modified. + + + + + Implements the copy mechanism. + + + + + Gets the collection containing the elements of this object. + + + + + Returns an enumerator that iterates through a collection. + + + + + Returns a string with the content of this object in a readable form. Useful for debugging purposes only. + + + + + Represents the elements of an PdfArray. + + + + + Creates a shallow copy of this object. + + + + + Moves this instance to another array during object type transformation. + + + + + Converts the specified value to boolean. + If the value does not exist, the function returns false. + If the value is not convertible, the function throws an InvalidCastException. + If the index is out of range, the function throws an ArgumentOutOfRangeException. + + + + + Converts the specified value to integer. + If the value does not exist, the function returns 0. + If the value is not convertible, the function throws an InvalidCastException. + If the index is out of range, the function throws an ArgumentOutOfRangeException. + + + + + Converts the specified value to double. + If the value does not exist, the function returns 0. + If the value is not convertible, the function throws an InvalidCastException. + If the index is out of range, the function throws an ArgumentOutOfRangeException. + + + + + Converts the specified value to double?. + If the value does not exist, the function returns null. + If the value is not convertible, the function throws an InvalidCastException. + If the index is out of range, the function throws an ArgumentOutOfRangeException. + + + + + Converts the specified value to string. + If the value does not exist, the function returns the empty string. + If the value is not convertible, the function throws an InvalidCastException. + If the index is out of range, the function throws an ArgumentOutOfRangeException. + + + + + Converts the specified value to a name. + If the value does not exist, the function returns the empty string. + If the value is not convertible, the function throws an InvalidCastException. + If the index is out of range, the function throws an ArgumentOutOfRangeException. + + + + + Returns the indirect object if the value at the specified index is a PdfReference. + + + + + Gets the PdfObject with the specified index, or null, if no such object exists. If the index refers to + a reference, the referenced PdfObject is returned. + + + + + Gets the PdfArray with the specified index, or null, if no such object exists. If the index refers to + a reference, the referenced PdfArray is returned. + + + + + Gets the PdfArray with the specified index, or null, if no such object exists. If the index refers to + a reference, the referenced PdfArray is returned. + + + + + Gets the PdfReference with the specified index, or null, if no such object exists. + + + + + Gets all items of this array. + + + + + Returns false. + + + + + Gets or sets an item at the specified index. + + + + + + Removes the item at the specified index. + + + + + Removes the first occurrence of a specific object from the array/>. + + + + + Inserts the item the specified index. + + + + + Determines whether the specified value is in the array. + + + + + Removes all items from the array. + + + + + Gets the index of the specified item. + + + + + Appends the specified object to the array. + + + + + Returns false. + + + + + Returns false. + + + + + Gets the number of elements in the array. + + + + + Copies the elements of the array to the specified array. + + + + + The current implementation return null. + + + + + Returns an enumerator that iterates through the array. + + + + + The elements of the array. + + + + + The array this objects belongs to. + + + + + Gets the DebuggerDisplayAttribute text. + + + + + Represents a direct boolean value. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Gets the value of this instance as boolean value. + + + + + A pre-defined value that represents true. + + + + + A pre-defined value that represents false. + + + + + Returns 'false' or 'true'. + + + + + Writes 'true' or 'false'. + + + + + Represents an indirect boolean value. This type is not used by PDFsharp. If it is imported from + an external PDF file, the value is converted into a direct object. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Gets the value of this instance as boolean value. + + + + + Returns "false" or "true". + + + + + Writes the keyword «false» or «true». + + + + + This class is intended for empira internal use only and may change or drop in future releases. + + + + + This function is intended for empira internal use only. + + + + + This function is intended for empira internal use only. + + + + + This property is intended for empira internal use only. + + + + + This property is intended for empira internal use only. + + + + + This class is intended for empira internal use only and may change or drop in future releases. + + + + + This function is intended for empira internal use only. + + + + + This function is intended for empira internal use only. + + + + + This function is intended for empira internal use only. + + + + + This function is intended for empira internal use only. + + + + + Represents a direct date value. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Gets the value as DateTime. + + + + + Returns the value in the PDF date format. + + + + + Writes the value in the PDF date format. + + + + + Value creation flags. Specifies whether and how a value that does not exist is created. + + + + + Don't create the value. + + + + + Create the value as direct object. + + + + + Create the value as indirect object. + + + + + Represents a PDF dictionary object. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The document. + + + + Initializes a new instance from an existing dictionary. Used for object type transformation. + + + + + Creates a copy of this dictionary. Direct values are deep copied. Indirect references are not + modified. + + + + + This function is useful for importing objects from external documents. The returned object is not + yet complete. irefs refer to external objects and directed objects are cloned but their document + property is null. A cloned dictionary or array needs a 'fix-up' to be a valid object. + + + + + Gets the dictionary containing the elements of this dictionary. + + + + + The elements of the dictionary. + + + + + Returns an enumerator that iterates through the dictionary elements. + + + + + Returns a string with the content of this object in a readable form. Useful for debugging purposes only. + + + + + Writes a key/value pair of this dictionary. This function is intended to be overridden + in derived classes. + + + + + Writes the stream of this dictionary. This function is intended to be overridden + in a derived class. + + + + + Gets or sets the PDF stream belonging to this dictionary. Returns null if the dictionary has + no stream. To create the stream, call the CreateStream function. + + + + + Creates the stream of this dictionary and initializes it with the specified byte array. + The function must not be called if the dictionary already has a stream. + + + + + When overridden in a derived class, gets the KeysMeta of this dictionary type. + + + + + Represents the interface to the elements of a PDF dictionary. + + + + + Creates a shallow copy of this object. The clone is not owned by a dictionary anymore. + + + + + Moves this instance to another dictionary during object type transformation. + + + + + Gets the dictionary to which this elements object belongs to. + + + + + Converts the specified value to boolean. + If the value does not exist, the function returns false. + If the value is not convertible, the function throws an InvalidCastException. + + + + + Converts the specified value to boolean. + If the value does not exist, the function returns false. + If the value is not convertible, the function throws an InvalidCastException. + + + + + Sets the entry to a direct boolean value. + + + + + Converts the specified value to integer. + If the value does not exist, the function returns 0. + If the value is not convertible, the function throws an InvalidCastException. + + + + + Converts the specified value to integer. + If the value does not exist, the function returns 0. + If the value is not convertible, the function throws an InvalidCastException. + + + + + Sets the entry to a direct integer value. + + + + + Converts the specified value to double. + If the value does not exist, the function returns 0. + If the value is not convertible, the function throws an InvalidCastException. + + + + + Converts the specified value to double. + If the value does not exist, the function returns 0. + If the value is not convertible, the function throws an InvalidCastException. + + + + + Sets the entry to a direct double value. + + + + + Converts the specified value to String. + If the value does not exist, the function returns the empty string. + + + + + Converts the specified value to String. + If the value does not exist, the function returns the empty string. + + + + + Tries to get the string. TODO: more TryGet... + + + + + Sets the entry to a direct string value. + + + + + Converts the specified value to a name. + If the value does not exist, the function returns the empty string. + + + + + Sets the specified name value. + If the value doesn't start with a slash, it is added automatically. + + + + + Converts the specified value to PdfRectangle. + If the value does not exist, the function returns an empty rectangle. + If the value is not convertible, the function throws an InvalidCastException. + + + + + Converts the specified value to PdfRectangle. + If the value does not exist, the function returns an empty rectangle. + If the value is not convertible, the function throws an InvalidCastException. + + + + + Sets the entry to a direct rectangle value, represented by an array with four values. + + + + Converts the specified value to XMatrix. + If the value does not exist, the function returns an identity matrix. + If the value is not convertible, the function throws an InvalidCastException. + + + Converts the specified value to XMatrix. + If the value does not exist, the function returns an identity matrix. + If the value is not convertible, the function throws an InvalidCastException. + + + + Sets the entry to a direct matrix value, represented by an array with six values. + + + + + Converts the specified value to DateTime. + If the value does not exist, the function returns the specified default value. + If the value is not convertible, the function throws an InvalidCastException. + + + + + Sets the entry to a direct datetime value. + + + + + Gets the value for the specified key. If the value does not exist, it is optionally created. + + + + + Short cut for GetValue(key, VCF.None). + + + + + Returns the type of the object to be created as value of the specified key. + + + + + Sets the entry with the specified value. DON'T USE THIS FUNCTION - IT MAY BE REMOVED. + + + + + Gets the PdfObject with the specified key, or null, if no such object exists. If the key refers to + a reference, the referenced PdfObject is returned. + + + + + Gets the PdfDictionary with the specified key, or null, if no such object exists. If the key refers to + a reference, the referenced PdfDictionary is returned. + + + + + Gets the PdfArray with the specified key, or null, if no such object exists. If the key refers to + a reference, the referenced PdfArray is returned. + + + + + Gets the PdfReference with the specified key, or null, if no such object exists. + + + + + Sets the entry to the specified object. The object must not be an indirect object, + otherwise an exception is raised. + + + + + Sets the entry as a reference to the specified object. The object must be an indirect object, + otherwise an exception is raised. + + + + + Sets the entry as a reference to the specified iref. + + + + + Gets a value indicating whether the object is read-only. + + + + + Returns an object for the object. + + + + + Gets or sets an entry in the dictionary. The specified key must be a valid PDF name + starting with a slash '/'. This property provides full access to the elements of the + PDF dictionary. Wrong use can lead to errors or corrupt PDF files. + + + + + Gets or sets an entry in the dictionary identified by a PdfName object. + + + + + Removes the value with the specified key. + + + + + Removes the value with the specified key. + + + + + Determines whether the dictionary contains the specified name. + + + + + Determines whether the dictionary contains a specific value. + + + + + Removes all elements from the dictionary. + + + + + Adds the specified value to the dictionary. + + + + + Adds an item to the dictionary. + + + + + Gets all keys currently in use in this dictionary as an array of PdfName objects. + + + + + Get all keys currently in use in this dictionary as an array of string objects. + + + + + Gets the value associated with the specified key. + + + + + Gets all values currently in use in this dictionary as an array of PdfItem objects. + + + + + Return false. + + + + + Return false. + + + + + Gets the number of elements contained in the dictionary. + + + + + Copies the elements of the dictionary to an array, starting at a particular index. + + + + + The current implementation returns null. + + + + + Gets the DebuggerDisplayAttribute text. + + + + + The elements of the dictionary with a string as key. + Because the string is a name it starts always with a '/'. + + + + + The dictionary this objects belongs to. + + + + + The PDF stream objects. + + + + + A .NET string can contain char(0) as a valid character. + + + + + Clones this stream by creating a deep copy. + + + + + Moves this instance to another dictionary during object type transformation. + + + + + The dictionary the stream belongs to. + + + + + Gets the length of the stream, i.e. the actual number of bytes in the stream. + + + + + Gets a value indicating whether this stream has decode parameters. + + + + + Gets the decode predictor for LZW- or FlateDecode. + Returns 0 if no such value exists. + + + + + Gets the decode Columns for LZW- or FlateDecode. + Returns 0 if no such value exists. + + + + + Get or sets the bytes of the stream as they are, i.e. if one or more filters exist the bytes are + not unfiltered. + + + + + Gets the value of the stream unfiltered. The stream content is not modified by this operation. + + + + + Tries to unfilter the bytes of the stream. If the stream is filtered and PDFsharp knows the filter + algorithm, the stream content is replaced by its unfiltered value and the function returns true. + Otherwise the content remains untouched and the function returns false. + The function is useful for analyzing existing PDF files. + + + + + Compresses the stream with the FlateDecode filter. + If a filter is already defined, the function has no effect. + + + + + Returns the stream content as a raw string. + + + + + Common keys for all streams. + + + + + (Required) The number of bytes from the beginning of the line following the keyword + stream to the last byte just before the keyword endstream. (There may be an additional + EOL marker, preceding endstream, that is not included in the count and is not logically + part of the stream data.) + + + + + (Optional) The name of a filter to be applied in processing the stream data found between + the keywords stream and endstream, or an array of such names. Multiple filters should be + specified in the order in which they are to be applied. + + + + + (Optional) A parameter dictionary or an array of such dictionaries, used by the filters + specified by Filter. If there is only one filter and that filter has parameters, DecodeParms + must be set to the filter’s parameter dictionary unless all the filter’s parameters have + their default values, in which case the DecodeParms entry may be omitted. If there are + multiple filters and any of the filters has parameters set to nondefault values, DecodeParms + must be an array with one entry for each filter: either the parameter dictionary for that + filter, or the null object if that filter has no parameters (or if all of its parameters have + their default values). If none of the filters have parameters, or if all their parameters + have default values, the DecodeParms entry may be omitted. + + + + + (Optional; PDF 1.2) The file containing the stream data. If this entry is present, the bytes + between stream and endstream are ignored, the filters are specified by FFilter rather than + Filter, and the filter parameters are specified by FDecodeParms rather than DecodeParms. + However, the Length entry should still specify the number of those bytes. (Usually, there are + no bytes and Length is 0.) + + + + + (Optional; PDF 1.2) The name of a filter to be applied in processing the data found in the + stream’s external file, or an array of such names. The same rules apply as for Filter. + + + + + (Optional; PDF 1.2) A parameter dictionary, or an array of such dictionaries, used by the + filters specified by FFilter. The same rules apply as for DecodeParms. + + + + + Optional; PDF 1.5) A non-negative integer representing the number of bytes in the decoded + (defiltered) stream. It can be used to determine, for example, whether enough disk space is + available to write a stream to a file. + This value should be considered a hint only; for some stream filters, it may not be possible + to determine this value precisely. + + + + + Gets the DebuggerDisplayAttribute text. + + + + + Represents a PDF document. + + + + + Creates a new PDF document in memory. + To open an existing PDF file, use the PdfReader class. + + + + + Creates a new PDF document with the specified file name. The file is immediately created and keeps + locked until the document is closed, at that time the document is saved automatically. + Do not call Save() for documents created with this constructor, just call Close(). + To open an existing PDF file and import it, use the PdfReader class. + + + + + Creates a new PDF document using the specified stream. + The stream won't be used until the document is closed, at that time the document is saved automatically. + Do not call Save() for documents created with this constructor, just call Close(). + To open an existing PDF file, use the PdfReader class. + + + + + Disposes all references to this document stored in other documents. This function should be called + for documents you finished importing pages from. Calling Dispose is technically not necessary but + useful for earlier reclaiming memory of documents you do not need anymore. + + + + + Gets or sets a user defined object that contains arbitrary information associated with this document. + The tag is not used by PDFsharp. + + + + + Gets or sets a value used to distinguish PdfDocument objects. + The name is not used by PDFsharp. + + + + + Get a new default name for a new document. + + + + + Closes this instance. + + + + + Saves the document to the specified path. If a file already exists, it will be overwritten. + + + + + Saves the document to the specified stream. + + + + + Saves the document to the specified stream. + The stream is not closed by this function. + (Older versions of PDFsharp closes the stream. That was not very useful.) + + + + + Implements saving a PDF file. + + + + + Dispatches PrepareForSave to the objects that need it. + + + + + Determines whether the document can be saved. + + + + + Gets the document options used for saving the document. + + + + + Gets PDF specific document settings. + + + + + NYI Indicates whether large objects are written immediately to the output stream to relieve + memory consumption. + + + + + Gets or sets the PDF version number. Return value 14 e.g. means PDF 1.4 / Acrobat 5 etc. + + + + + Gets the number of pages in the document. + + + + + Gets the file size of the document. + + + + + Gets the full qualified file name if the document was read form a file, or an empty string otherwise. + + + + + Gets a Guid that uniquely identifies this instance of PdfDocument. + + + + + Returns a value indicating whether the document was newly created or opened from an existing document. + Returns true if the document was opened with the PdfReader.Open function, false otherwise. + + + + + Returns a value indicating whether the document is read only or can be modified. + + + + + Gets information about the document. + + + + + This function is intended to be undocumented. + + + + + Get the pages dictionary. + + + + + Gets or sets a value specifying the page layout to be used when the document is opened. + + + + + Gets or sets a value specifying how the document should be displayed when opened. + + + + + Gets the viewer preferences of this document. + + + + + Gets the root of the outline (or bookmark) tree. + + + + + Get the AcroForm dictionary. + + + + + Gets or sets the default language of the document. + + + + + Gets the security settings of this document. + + + + + Gets the document font table that holds all fonts used in the current document. + + + + + Gets the document image table that holds all images used in the current document. + + + + + Gets the document form table that holds all form external objects used in the current document. + + + + + Gets the document ExtGState table that holds all form state objects used in the current document. + + + + + Gets the PdfCatalog of the current document. + + + + + Gets the PdfInternals object of this document, that grants access to some internal structures + which are not part of the public interface of PdfDocument. + + + + + Creates a new page and adds it to this document. + Depending of the IsMetric property of the current region the page size is set to + A4 or Letter respectively. If this size is not appropriate it should be changed before + any drawing operations are performed on the page. + + + + + Adds the specified page to this document. If the page is from an external document, + it is imported to this document. In this case the returned page is not the same + object as the specified one. + + + + + Creates a new page and inserts it in this document at the specified position. + + + + + Inserts the specified page in this document. If the page is from an external document, + it is imported to this document. In this case the returned page is not the same + object as the specified one. + + + + + Flattens a document (make the fields non-editable). + + + + + Gets the security handler. + + + + + Occurs when the specified document is not used anymore for importing content. + + + + + Gets the ThreadLocalStorage object. It is used for caching objects that should created + only once. + + + + + Represents the PDF document information dictionary. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the document's title. + + + + + Gets or sets the name of the person who created the document. + + + + + Gets or sets the name of the subject of the document. + + + + + Gets or sets keywords associated with the document. + + + + + Gets or sets the name of the application (for example, MigraDoc) that created the document. + + + + + Gets the producer application (for example, PDFsharp). + + + + + Gets or sets the creation date of the document. + Breaking Change: If the date is not set in a PDF file DateTime.MinValue is returned. + + + + + Gets or sets the modification date of the document. + Breaking Change: If the date is not set in a PDF file DateTime.MinValue is returned. + + + + + Predefined keys of this dictionary. + + + + + (Optional; PDF 1.1) The document’s title. + + + + + (Optional) The name of the person who created the document. + + + + + (Optional; PDF 1.1) The subject of the document. + + + + + (Optional; PDF 1.1) Keywords associated with the document. + + + + + (Optional) If the document was converted to PDF from another format, + the name of the application (for example, empira MigraDoc) that created the + original document from which it was converted. + + + + + (Optional) If the document was converted to PDF from another format, + the name of the application (for example, this library) that converted it to PDF. + + + + + (Optional) The date and time the document was created, in human-readable form. + + + + + (Required if PieceInfo is present in the document catalog; otherwise optional; PDF 1.1) + The date and time the document was most recently modified, in human-readable form. + + + + + (Optional; PDF 1.3) A name object indicating whether the document has been modified + to include trapping information. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Holds information how to handle the document when it is saved as PDF stream. + + + + + Gets or sets the color mode. + + + + + Gets or sets a value indicating whether to compress content streams of PDF pages. + + + + + Gets or sets a value indicating that all objects are not compressed. + + + + + Gets or sets the flate encode mode. Besides the balanced default mode you can set modes for best compression (slower) or best speed (larger files). + + + + + Gets or sets a value indicating whether to compress bilevel images using CCITT compression. + With true, PDFsharp will try FlateDecode CCITT and will use the smallest one or a combination of both. + With false, PDFsharp will always use FlateDecode only - files may be a few bytes larger, but file creation is faster. + + + + + Gets or sets a value indicating whether to compress JPEG images with the FlateDecode filter. + + + + + Holds PDF specific information of the document. + + + + + Gets or sets the default trim margins. + + + + + Represents a direct integer value. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The value. + + + + Gets the value as integer. + + + + + Returns the integer as string. + + + + + Writes the integer as string. + + + + + Returns TypeCode for 32-bit integers. + + + + + Represents an indirect integer value. This type is not used by PDFsharp. If it is imported from + an external PDF file, the value is converted into a direct object. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Gets the value as integer. + + + + + Returns the integer as string. + + + + + Writes the integer literal. + + + + + The base class of all PDF objects and simple PDF types. + + + + + Creates a copy of this object. + + + + + Implements the copy mechanism. Must be overridden in derived classes. + + + + + When overridden in a derived class, appends a raw string representation of this object + to the specified PdfWriter. + + + + + Represents text that is written 'as it is' into the PDF stream. This class can lead to invalid PDF files. + E.g. strings in a literal are not encrypted when the document is saved with a password. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance with the specified string. + + + + + Initializes a new instance with the culture invariant formatted specified arguments. + + + + + Creates a literal from an XMatrix + + + + + Gets the value as litaral string. + + + + + Returns a string that represents the current value. + + + + + Represents a PDF name value. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + Parameter value always must start with a '/'. + + + + + Determines whether the specified object is equal to this name. + + + + + Returns the hash code for this instance. + + + + + Gets the name as a string. + + + + + Returns the name. The string always begins with a slash. + + + + + Determines whether the specified name and string are equal. + + + + + Determines whether the specified name and string are not equal. + + + + + Represents the empty name. + + + + + Writes the name including the leading slash. + + + + + Gets the comparer for this type. + + + + + Implements a comparer that compares PdfName objects. + + + + + Compares two objects and returns a value indicating whether one is less than, equal to, or greater than the other. + + The first object to compare. + The second object to compare. + + + + Represents an indirect name value. This type is not used by PDFsharp. If it is imported from + an external PDF file, the value is converted into a direct object. Acrobat sometime uses indirect + names to save space, because an indirect reference to a name may be shorter than a long name. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The document. + The value. + + + + Determines whether the specified object is equal to the current object. + + + + + Serves as a hash function for this type. + + + + + Gets or sets the name value. + + + + + Returns the name. The string always begins with a slash. + + + + + Determines whether a name is equal to a string. + + + + + Determines whether a name is not equal to a string. + + + + + Writes the name including the leading slash. + + + + + Represents a indirect reference that is not in the cross reference table. + + + + + Returns a that represents the current . + + + A that represents the current . + + + + + The only instance of this class. + + + + + Represents an indirect null value. This type is not used by PDFsharp, but at least + one tool from Adobe creates PDF files with a null object. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The document. + + + + Returns the string "null". + + + + + Writes the keyword «null». + + + + + Base class for direct number values (not yet used, maybe superfluous). + + + + + Base class for indirect number values (not yet used, maybe superfluous). + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The document. + + + + Base class of all composite PDF objects. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance from an existing object. Used for object type transformation. + + + + + Creates a copy of this object. The clone does not belong to a document, i.e. its owner and its iref are null. + + + + + Implements the copy mechanism. Must be overridden in derived classes. + + + + + Sets the object and generation number. + Setting the object identifier makes this object an indirect object, i.e. the object gets + a PdfReference entry in the PdfReferenceTable. + + + + + Gets the PdfDocument this object belongs to. + + + + + Sets the PdfDocument this object belongs to. + + + + + Indicates whether the object is an indirect object. + + + + + Gets the PdfInternals object of this document, that grants access to some internal structures + which are not part of the public interface of PdfDocument. + + + + + When overridden in a derived class, prepares the object to get saved. + + + + + Saves the stream position. 2nd Edition. + + + + + Gets the object identifier. Returns PdfObjectID.Empty for direct objects, + i.e. never returns null. + + + + + Gets the object number. + + + + + Gets the generation number. + + + + The document that owns the cloned objects. + The root object to be cloned. + The clone of the root object + + + The imported object table of the owner for the external document. + The document that owns the cloned objects. + The root object to be cloned. + The clone of the root object + + + + Replace all indirect references to external objects by their cloned counterparts + owned by the importer document. + + + + + Ensure for future versions of PDFsharp not to forget code for a new kind of PdfItem. + + The item. + + + + Gets the indirect reference of this object. If the value is null, this object is a direct object. + + + + + Represents a PDF object identifier, a pair of object and generation number. + + + + + Initializes a new instance of the class. + + The object number. + + + + Initializes a new instance of the class. + + The object number. + The generation number. + + + + Gets or sets the object number. + + + + + Gets or sets the generation number. + + + + + Indicates whether this object is an empty object identifier. + + + + + Indicates whether this instance and a specified object are equal. + + + + + Returns the hash code for this instance. + + + + + Determines whether the two objects are equal. + + + + + Determines whether the tow objects not are equal. + + + + + Returns the object and generation numbers as a string. + + + + + Creates an empty object identifier. + + + + + Compares the current object id with another object. + + + + + Gets the DebuggerDisplayAttribute text. + + + + + Represents an outline item in the outlines tree. An 'outline' is also known as a 'bookmark'. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The document. + + + + Initializes a new instance from an existing dictionary. Used for object type transformation. + + + + + Initializes a new instance of the class. + + The outline text. + The destination page. + Specifies whether the node is displayed expanded (opened) or collapsed. + The font style used to draw the outline text. + The color used to draw the outline text. + + + + Initializes a new instance of the class. + + The outline text. + The destination page. + Specifies whether the node is displayed expanded (opened) or collapsed. + The font style used to draw the outline text. + + + + Initializes a new instance of the class. + + The outline text. + The destination page. + Specifies whether the node is displayed expanded (opened) or collapsed. + + + + Initializes a new instance of the class. + + The outline text. + The destination page. + + + + The total number of open descendants at all lower levels. + + + + + Counts the open outline items. Not yet used. + + + + + Gets the parent of this outline item. The root item has no parent and returns null. + + + + + Gets or sets the title. + + + + + Gets or sets the destination page. + + + + + Gets or sets the left position of the page positioned at the left side of the window. + Applies only if PageDestinationType is Xyz, FitV, FitR, or FitBV. + + + + + Gets or sets the top position of the page positioned at the top side of the window. + Applies only if PageDestinationType is Xyz, FitH, FitR, ob FitBH. + + + + + Gets or sets the right position of the page positioned at the right side of the window. + Applies only if PageDestinationType is FitR. + + + + + Gets or sets the bottom position of the page positioned at the bottom side of the window. + Applies only if PageDestinationType is FitR. + + + + + Gets or sets the zoom faction of the page. + Applies only if PageDestinationType is Xyz. + + + + + Gets or sets whether the outline item is opened (or expanded). + + + + + Gets or sets the style of the outline text. + + + + + Gets or sets the type of the page destination. + + + + + Gets or sets the color of the text. + + The color of the text. + + + + Gets a value indicating whether this outline object has child items. + + + + + Gets the outline collection of this node. + + + + + Initializes this instance from an existing PDF document. + + + + + Creates key/values pairs according to the object structure. + + + + + Format double. + + + + + Format nullable double. + + + + + Predefined keys of this dictionary. + + + + + (Optional) The type of PDF object that this dictionary describes; if present, + must be Outlines for an outline dictionary. + + + + + (Required) The text to be displayed on the screen for this item. + + + + + (Required; must be an indirect reference) The parent of this item in the outline hierarchy. + The parent of a top-level item is the outline dictionary itself. + + + + + (Required for all but the first item at each level; must be an indirect reference) + The previous item at this outline level. + + + + + (Required for all but the last item at each level; must be an indirect reference) + The next item at this outline level. + + + + + (Required if the item has any descendants; must be an indirect reference) + The first of this item’s immediate children in the outline hierarchy. + + + + + (Required if the item has any descendants; must be an indirect reference) + The last of this item’s immediate children in the outline hierarchy. + + + + + (Required if the item has any descendants) If the item is open, the total number of its + open descendants at all lower levels of the outline hierarchy. If the item is closed, a + negative integer whose absolute value specifies how many descendants would appear if the + item were reopened. + + + + + (Optional; not permitted if an A entry is present) The destination to be displayed when this + item is activated. + + + + + (Optional; not permitted if a Dest entry is present) The action to be performed when + this item is activated. + + + + + (Optional; PDF 1.3; must be an indirect reference) The structure element to which the item + refers. + Note: The ability to associate an outline item with a structure element (such as the beginning + of a chapter) is a PDF 1.3 feature. For backward compatibility with earlier PDF versions, such + an item should also specify a destination (Dest) corresponding to an area of a page where the + contents of the designated structure element are displayed. + + + + + (Optional; PDF 1.4) An array of three numbers in the range 0.0 to 1.0, representing the + components in the DeviceRGB color space of the color to be used for the outline entry’s text. + Default value: [0.0 0.0 0.0]. + + + + + (Optional; PDF 1.4) A set of flags specifying style characteristics for displaying the outline + item’s text. Default value: 0. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents a collection of outlines. + + + + + Can only be created as part of PdfOutline. + + + + + Indicates whether the outline collection has at least one entry. + + + + + Removes the first occurrence of a specific item from the collection. + + + + + Gets the number of entries in this collection. + + + + + Returns false. + + + + + Adds the specified outline. + + + + + Removes all elements form the collection. + + + + + Determines whether the specified element is in the collection. + + + + + Copies the collection to an array, starting at the specified index of the target array. + + + + + Adds the specified outline entry. + + The outline text. + The destination page. + Specifies whether the node is displayed expanded (opened) or collapsed. + The font style used to draw the outline text. + The color used to draw the outline text. + + + + Adds the specified outline entry. + + The outline text. + The destination page. + Specifies whether the node is displayed expanded (opened) or collapsed. + The font style used to draw the outline text. + + + + Adds the specified outline entry. + + The outline text. + The destination page. + Specifies whether the node is displayed expanded (opened) or collapsed. + + + + Creates a PdfOutline and adds it into the outline collection. + + + + + Gets the index of the specified item. + + + + + Inserts the item at the specified index. + + + + + Removes the outline item at the specified index. + + + + + Gets the at the specified index. + + + + + Returns an enumerator that iterates through the outline collection. + + + + + The parent outine of this collection. + + + + + Represents a page in a PDF document. + + + + + Initializes a new page. The page must be added to a document before it can be used. + Depending of the IsMetric property of the current region the page size is set to + A4 or Letter respectively. If this size is not appropriate it should be changed before + any drawing operations are performed on the page. + + + + + Initializes a new instance of the class. + + The document. + + + + Gets or sets a user defined object that contains arbitrary information associated with this PDF page. + The tag is not used by PDFsharp. + + + + + Closes the page. A closed page cannot be modified anymore and it is not possible to + get an XGraphics object for a closed page. Closing a page is not required, but may save + resources if the document has many pages. + + + + + Gets a value indicating whether the page is closed. + + + + + Gets or sets the PdfDocument this page belongs to. + + + + + Gets or sets the orientation of the page. The default value PageOrientation.Portrait. + If an imported page has a /Rotate value that matches the formula 90 + n * 180 the + orientation is set to PageOrientation.Landscape. + + + + + Gets or sets one of the predefined standard sizes like. + + + + + Gets or sets the trim margins. + + + + + Gets or sets the media box directly. XGrahics is not prepared to work with a media box + with an origin other than (0,0). + + + + + Gets or sets the crop box. + + + + + Gets or sets the bleed box. + + + + + Gets or sets the art box. + + + + + Gets or sets the trim box. + + + + + Gets or sets the height of the page. If orientation is Landscape, this function applies to + the width. + + + + + Gets or sets the width of the page. If orientation is Landscape, this function applies to + the height. + + + + + Gets or sets the /Rotate entry of the PDF page. The value is the number of degrees by which the page + should be rotated clockwise when displayed or printed. The value must be a multiple of 90. + PDFsharp does not set this value, but for imported pages this value can be set and must be taken + into account when adding graphic to such a page. + + + + + The content stream currently used by an XGraphics object for rendering. + + + + + Gets the array of content streams of the page. + + + + + Gets the annotations array of this page. + + + + + Gets the annotations array of this page. + + + + + Adds an intra document link. + + The rect. + The destination page. + + + + Adds a link to the Web. + + The rect. + The URL. + + + + Adds a link to a file. + + The rect. + Name of the file. + + + + Gets or sets the custom values. + + + + + Gets the PdfResources object of this page. + + + + + Implements the interface because the primary function is internal. + + + + + Gets the resource name of the specified font within this page. + + + + + Tries to get the resource name of the specified font data within this page. + Returns null if no such font exists. + + + + + Gets the resource name of the specified font data within this page. + + + + + Gets the resource name of the specified image within this page. + + + + + Implements the interface because the primary function is internal. + + + + + Gets the resource name of the specified form within this page. + + + + + Implements the interface because the primary function is internal. + + + + + Hack to indicate that a page-level transparency group must be created. + + + + + Inherit values from parent node. + + + + + Add all inheritable values from the specified page to the specified values structure. + + + + + Predefined keys of this dictionary. + + + + + (Required) The type of PDF object that this dictionary describes; + must be Page for a page object. + + + + + (Required; must be an indirect reference) + The page tree node that is the immediate parent of this page object. + + + + + (Required if PieceInfo is present; optional otherwise; PDF 1.3) The date and time + when the page’s contents were most recently modified. If a page-piece dictionary + (PieceInfo) is present, the modification date is used to ascertain which of the + application data dictionaries that it contains correspond to the current content + of the page. + + + + + (Optional; PDF 1.3) A rectangle, expressed in default user space units, defining the + region to which the contents of the page should be clipped when output in a production + environment. Default value: the value of CropBox. + + + + + (Optional; PDF 1.3) A rectangle, expressed in default user space units, defining the + intended dimensions of the finished page after trimming. Default value: the value of + CropBox. + + + + + (Optional; PDF 1.3) A rectangle, expressed in default user space units, defining the + extent of the page’s meaningful content (including potential white space) as intended + by the page’s creator. Default value: the value of CropBox. + + + + + (Optional; PDF 1.4) A box color information dictionary specifying the colors and other + visual characteristics to be used in displaying guidelines on the screen for the various + page boundaries. If this entry is absent, the application should use its own current + default settings. + + + + + (Optional) A content stream describing the contents of this page. If this entry is absent, + the page is empty. The value may be either a single stream or an array of streams. If the + value is an array, the effect is as if all of the streams in the array were concatenated, + in order, to form a single stream. This allows PDF producers to create image objects and + other resources as they occur, even though they interrupt the content stream. The division + between streams may occur only at the boundaries between lexical tokens but is unrelated + to the page’s logical content or organization. Applications that consume or produce PDF + files are not required to preserve the existing structure of the Contents array. + + + + + (Optional; PDF 1.4) A group attributes dictionary specifying the attributes of the page’s + page group for use in the transparent imaging model. + + + + + (Optional) A stream object defining the page’s thumbnail image. + + + + + (Optional; PDF 1.1; recommended if the page contains article beads) An array of indirect + references to article beads appearing on the page. The beads are listed in the array in + natural reading order. + + + + + (Optional; PDF 1.1) The page’s display duration (also called its advance timing): the + maximum length of time, in seconds, that the page is displayed during presentations before + the viewer application automatically advances to the next page. By default, the viewer does + not advance automatically. + + + + + (Optional; PDF 1.1) A transition dictionary describing the transition effect to be used + when displaying the page during presentations. + + + + + (Optional) An array of annotation dictionaries representing annotations associated with + the page. + + + + + (Optional; PDF 1.2) An additional-actions dictionary defining actions to be performed + when the page is opened or closed. + + + + + (Optional; PDF 1.4) A metadata stream containing metadata for the page. + + + + + (Optional; PDF 1.3) A page-piece dictionary associated with the page. + + + + + (Required if the page contains structural content items; PDF 1.3) + The integer key of the page’s entry in the structural parent tree. + + + + + (Optional; PDF 1.3; indirect reference preferred) The digital identifier of + the page’s parent Web Capture content set. + + + + + (Optional; PDF 1.3) The page’s preferred zoom (magnification) factor: the factor + by which it should be scaled to achieve the natural display magnification. + + + + + (Optional; PDF 1.3) A separation dictionary containing information needed + to generate color separations for the page. + + + + + (Optional; PDF 1.5) A name specifying the tab order to be used for annotations + on the page. The possible values are R (row order), C (column order), + and S (structure order). + + + + + (Required if this page was created from a named page object; PDF 1.5) + The name of the originating page object. + + + + + (Optional; PDF 1.5) A navigation node dictionary representing the first node + on the page. + + + + + (Optional; PDF 1.6) A positive number giving the size of default user space units, + in multiples of 1/72 inch. The range of supported values is implementation-dependent. + + + + + (Optional; PDF 1.6) An array of viewport dictionaries specifying rectangular regions + of the page. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Predefined keys common to PdfPage and PdfPages. + + + + + (Required; inheritable) A dictionary containing any resources required by the page. + If the page requires no resources, the value of this entry should be an empty dictionary. + Omitting the entry entirely indicates that the resources are to be inherited from an + ancestor node in the page tree. + + + + + (Required; inheritable) A rectangle, expressed in default user space units, defining the + boundaries of the physical medium on which the page is intended to be displayed or printed. + + + + + (Optional; inheritable) A rectangle, expressed in default user space units, defining the + visible region of default user space. When the page is displayed or printed, its contents + are to be clipped (cropped) to this rectangle and then imposed on the output medium in some + implementation defined manner. Default value: the value of MediaBox. + + + + + (Optional; inheritable) The number of degrees by which the page should be rotated clockwise + when displayed or printed. The value must be a multiple of 90. Default value: 0. + + + + + Values inherited from a parent in the parent chain of a page tree. + + + + + Represents the pages of the document. + + + + + Gets the number of pages. + + + + + Gets the page with the specified index. + + + + + Finds a page by its id. Transforms it to PdfPage if necessary. + + + + + Creates a new PdfPage, adds it to the end of this document, and returns it. + + + + + Adds the specified PdfPage to the end of this document and maybe returns a new PdfPage object. + The value returned is a new object if the added page comes from a foreign document. + + + + + Creates a new PdfPage, inserts it at the specified position into this document, and returns it. + + + + + Inserts the specified PdfPage at the specified position to this document and maybe returns a new PdfPage object. + The value returned is a new object if the inserted page comes from a foreign document. + + + + + Inserts pages of the specified document into this document. + + The index in this document where to insert the page . + The document to be inserted. + The index of the first page to be inserted. + The number of pages to be inserted. + + + + Inserts all pages of the specified document into this document. + + The index in this document where to insert the page . + The document to be inserted. + + + + Inserts all pages of the specified document into this document. + + The index in this document where to insert the page . + The document to be inserted. + The index of the first page to be inserted. + + + + Removes the specified page from the document. + + + + + Removes the specified page from the document. + + + + + Moves a page within the page sequence. + + The page index before this operation. + The page index after this operation. + + + + Imports an external page. The elements of the imported page are cloned and added to this document. + Important: In contrast to PdfFormXObject adding an external page always make a deep copy + of their transitive closure. Any reuse of already imported objects is not intended because + any modification of an imported page must not change another page. + + + + + Helper function for ImportExternalPage. + + + + + Gets a PdfArray containing all pages of this document. The array must not be modified. + + + + + Replaces the page tree by a flat array of indirect references to the pages objects. + + + + + Recursively converts the page tree into a flat array. + + + + + Prepares the document for saving. + + + + + Gets the enumerator. + + + + + Predefined keys of this dictionary. + + + + + (Required) The type of PDF object that this dictionary describes; + must be Pages for a page tree node. + + + + + (Required except in root node; must be an indirect reference) + The page tree node that is the immediate parent of this one. + + + + + (Required) An array of indirect references to the immediate children of this node. + The children may be page objects or other page tree nodes. + + + + + (Required) The number of leaf nodes (page objects) that are descendants of this node + within the page tree. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents a direct real value. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The value. + + + + Gets the value as double. + + + + + Returns the real number as string. + + + + + Writes the real value with up to three digits. + + + + + Represents an indirect real value. This type is not used by PDFsharp. If it is imported from + an external PDF file, the value is converted into a direct object. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The value. + + + + Initializes a new instance of the class. + + The document. + The value. + + + + Gets or sets the value. + + + + + Returns the real as a culture invariant string. + + + + + Writes the real literal. + + + + + Represents a PDF rectangle value, that is internally an array with 4 real values. + + + + + Initializes a new instance of the PdfRectangle class. + + + + + Initializes a new instance of the PdfRectangle class with two points specifying + two diagonally opposite corners. Notice that in contrast to GDI+ convention the + 3rd and the 4th parameter specify a point and not a width. This is so much confusing + that this function is for internal use only. + + + + + Initializes a new instance of the PdfRectangle class with two points specifying + two diagonally opposite corners. + + + + + Initializes a new instance of the PdfRectangle class with the specified location and size. + + + + + Initializes a new instance of the PdfRectangle class with the specified XRect. + + + + + Initializes a new instance of the PdfRectangle class with the specified PdfArray. + + + + + Clones this instance. + + + + + Implements cloning this instance. + + + + + Tests whether all coordinate are zero. + + + + + Tests whether the specified object is a PdfRectangle and has equal coordinates. + + + + + Serves as a hash function for a particular type. + + + + + Tests whether two structures have equal coordinates. + + + + + Tests whether two structures differ in one or more coordinates. + + + + + Gets or sets the x-coordinate of the first corner of this PdfRectangle. + + + + + Gets or sets the y-coordinate of the first corner of this PdfRectangle. + + + + + Gets or sets the x-coordinate of the second corner of this PdfRectangle. + + + + + Gets or sets the y-coordinate of the second corner of this PdfRectangle. + + + + + Gets X2 - X1. + + + + + Gets Y2 - Y1. + + + + + Gets or sets the coordinates of the first point of this PdfRectangle. + + + + + Gets or sets the size of this PdfRectangle. + + + + + Determines if the specified point is contained within this PdfRectangle. + + + + + Determines if the specified point is contained within this PdfRectangle. + + + + + Determines if the rectangular region represented by rect is entirely contained within this PdfRectangle. + + + + + Determines if the rectangular region represented by rect is entirely contained within this PdfRectangle. + + + + + Returns the rectangle as an XRect object. + + + + + Returns the rectangle as a string in the form «[x1 y1 x2 y2]». + + + + + Writes the rectangle. + + + + + Gets the DebuggerDisplayAttribute text. + + + + + Represents an empty PdfRectangle. + + + + + Represents the cross-reference table of a PDF document. + It contains all indirect objects of a document. + + + + + Represents the relation between PdfObjectID and PdfReference for a PdfDocument. + + + + + Adds a cross reference entry to the table. Used when parsing the trailer. + + + + + Adds a PdfObject to the table. + + + + + Gets a cross reference entry from an object identifier. + Returns null if no object with the specified ID exists in the object table. + + + + + Indicates whether the specified object identifier is in the table. + + + + + Returns the next free object number. + + + + + Writes the xref section in pdf stream. + + + + + Gets an array of all object identifier. For debugging purposes only. + + + + + Gets an array of all cross references in ascending order by their object identifier. + + + + + Removes all objects that cannot be reached from the trailer. + Returns the number of removed objects. + + + + + Renumbers the objects starting at 1. + + + + + Checks the logical consistence for debugging purposes (useful after reconstruction work). + + + + + Calculates the transitive closure of the specified PdfObject, i.e. all indirect objects + recursively reachable from the specified object. + + + + + Calculates the transitive closure of the specified PdfObject with the specified depth, i.e. all indirect objects + recursively reachable from the specified object in up to maximally depth steps. + + + + + Gets the cross reference to an objects used for undefined indirect references. + + + + + Determines the encoding of a PdfString or PdfStringObject. + + + + + The characters of the string are actually bytes with an unknown or context specific meaning or encoding. + With this encoding the 8 high bits of each character is zero. + + + + + Not yet used by PDFsharp. + + + + + The characters of the string are actually bytes with PDF document encoding. + With this encoding the 8 high bits of each character is zero. + + + + + The characters of the string are actually bytes with Windows ANSI encoding. + With this encoding the 8 high bits of each character is zero. + + + + + Not yet used by PDFsharp. + + + + + Not yet used by PDFsharp. + + + + + The characters of the string are Unicode characters. + + + + + Internal wrapper for PdfStringEncoding. + + + + + Represents a direct text string value. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The value. + + + + Initializes a new instance of the class. + + The value. + The encoding. + + + + Gets the number of characters in this string. + + + + + Gets the encoding. + + + + + Gets a value indicating whether the string is a hexadecimal literal. + + + + + Gets the string value. + + + + + Gets or sets the string value for encryption purposes. + + + + + Returns the string. + + + + + Hack for document encoded bookmarks. + + + + + Writes the string DocEncoded. + + + + + Represents an indirect text string value. This type is not used by PDFsharp. If it is imported from + an external PDF file, the value is converted into a direct object. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The document. + The value. + + + + Initializes a new instance of the class. + + The value. + The encoding. + + + + Gets the number of characters in this string. + + + + + Gets or sets the encoding. + + + + + Gets a value indicating whether the string is a hexadecimal literal. + + + + + Gets or sets the value as string + + + + + Gets or sets the string value for encryption purposes. + + + + + Returns the string. + + + + + Writes the string literal with encoding DOCEncoded. + + + + + Represents a direct unsigned integer value. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Gets the value as integer. + + + + + Returns the unsigned integer as string. + + + + + Writes the integer as string. + + + + + Converts the value of this instance to an equivalent 64-bit unsigned integer. + + + + + Converts the value of this instance to an equivalent 8-bit signed integer. + + + + + Converts the value of this instance to an equivalent double-precision floating-point number. + + + + + Returns an undefined DateTime structure. + + + + + Converts the value of this instance to an equivalent single-precision floating-point number. + + + + + Converts the value of this instance to an equivalent Boolean value. + + + + + Converts the value of this instance to an equivalent 32-bit signed integer. + + + + + Converts the value of this instance to an equivalent 16-bit unsigned integer. + + + + + Converts the value of this instance to an equivalent 16-bit signed integer. + + + + + Converts the value of this instance to an equivalent . + + + + + Converts the value of this instance to an equivalent 8-bit unsigned integer. + + + + + Converts the value of this instance to an equivalent Unicode character. + + + + + Converts the value of this instance to an equivalent 64-bit signed integer. + + + + + Returns type code for 32-bit integers. + + + + + Converts the value of this instance to an equivalent number. + + + + + Returns null. + + + + + Converts the value of this instance to an equivalent 32-bit unsigned integer. + + + + + Represents an indirect integer value. This type is not used by PDFsharp. If it is imported from + an external PDF file, the value is converted into a direct object. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The value. + + + + Initializes a new instance of the class. + + The document. + The value. + + + + Gets the value as unsigned integer. + + + + + Returns the integer as string. + + + + + Writes the integer literal. + + + + + Represents the PDF document viewer preferences dictionary. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a value indicating whether to hide the viewer application’s tool + bars when the document is active. + + + + + Gets or sets a value indicating whether to hide the viewer application’s + menu bar when the document is active. + + + + + Gets or sets a value indicating whether to hide user interface elements in + the document’s window (such as scroll bars and navigation controls), + leaving only the document’s contents displayed. + + + + + Gets or sets a value indicating whether to resize the document’s window to + fit the size of the first displayed page. + + + + + Gets or sets a value indicating whether to position the document’s window + in the center of the screen. + + + + + Gets or sets a value indicating whether the window’s title bar + should display the document title taken from the Title entry of the document + information dictionary. If false, the title bar should instead display the name + of the PDF file containing the document. + + + + + The predominant reading order for text: LeftToRight or RightToLeft + (including vertical writing systems, such as Chinese, Japanese, and Korean). + This entry has no direct effect on the document’s contents or page numbering + but can be used to determine the relative positioning of pages when displayed + side by side or printed n-up. Default value: LeftToRight. + + + + + Predefined keys of this dictionary. + + + + + (Optional) A flag specifying whether to hide the viewer application’s tool + bars when the document is active. Default value: false. + + + + + (Optional) A flag specifying whether to hide the viewer application’s + menu bar when the document is active. Default value: false. + + + + + (Optional) A flag specifying whether to hide user interface elements in + the document’s window (such as scroll bars and navigation controls), + leaving only the document’s contents displayed. Default value: false. + + + + + (Optional) A flag specifying whether to resize the document’s window to + fit the size of the first displayed page. Default value: false. + + + + + (Optional) A flag specifying whether to position the document’s window + in the center of the screen. Default value: false. + + + + + (Optional; PDF 1.4) A flag specifying whether the window’s title bar + should display the document title taken from the Title entry of the document + information dictionary. If false, the title bar should instead display the name + of the PDF file containing the document. Default value: false. + + + + + (Optional) The document’s page mode, specifying how to display the document on + exiting full-screen mode: + UseNone Neither document outline nor thumbnail images visible + UseOutlines Document outline visible + UseThumbs Thumbnail images visible + UseOC Optional content group panel visible + This entry is meaningful only if the value of the PageMode entry in the catalog + dictionary is FullScreen; it is ignored otherwise. Default value: UseNone. + + + + + (Optional; PDF 1.3) The predominant reading order for text: + L2R Left to right + R2L Right to left (including vertical writing systems, such as Chinese, Japanese, and Korean) + This entry has no direct effect on the document’s contents or page numbering + but can be used to determine the relative positioning of pages when displayed + side by side or printed n-up. Default value: L2R. + + + + + (Optional; PDF 1.4) The name of the page boundary representing the area of a page + to be displayed when viewing the document on the screen. The value is the key + designating the relevant page boundary in the page object. If the specified page + boundary is not defined in the page object, its default value is used. + Default value: CropBox. + Note: This entry is intended primarily for use by prepress applications that + interpret or manipulate the page boundaries as described in Section 10.10.1, “Page Boundaries.” + Most PDF consumer applications disregard it. + + + + + (Optional; PDF 1.4) The name of the page boundary to which the contents of a page + are to be clipped when viewing the document on the screen. The value is the key + designating the relevant page boundary in the page object. If the specified page + boundary is not defined in the page object, its default value is used. + Default value: CropBox. + Note: This entry is intended primarily for use by prepress applications that + interpret or manipulate the page boundaries as described in Section 10.10.1, “Page Boundaries.” + Most PDF consumer applications disregard it. + + + + + (Optional; PDF 1.4) The name of the page boundary representing the area of a page + to be rendered when printing the document. The value is the key designating the + relevant page boundary in the page object. If the specified page boundary is not + defined in the page object, its default value is used. + Default value: CropBox. + Note: This entry is intended primarily for use by prepress applications that + interpret or manipulate the page boundaries as described in Section 10.10.1, “Page Boundaries.” + Most PDF consumer applications disregard it. + + + + + (Optional; PDF 1.4) The name of the page boundary to which the contents of a page + are to be clipped when printing the document. The value is the key designating the + relevant page boundary in the page object. If the specified page boundary is not + defined in the page object, its default value is used. + Default value: CropBox. + Note: This entry is intended primarily for use by prepress applications that interpret + or manipulate the page boundaries. Most PDF consumer applications disregard it. + + + + + (Optional; PDF 1.6) The page scaling option to be selected when a print dialog is + displayed for this document. Valid values are None, which indicates that the print + dialog should reflect no page scaling, and AppDefault, which indicates that + applications should use the current print scaling. If this entry has an unrecognized + value, applications should use the current print scaling. + Default value: AppDefault. + Note: If the print dialog is suppressed and its parameters are provided directly + by the application, the value of this entry should still be used. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents trim margins added to the page. + + + + + Sets all four crop margins simultaneously. + + + + + Gets or sets the left crop margin. + + + + + Gets or sets the right crop margin. + + + + + Gets or sets the top crop margin. + + + + + Gets or sets the bottom crop margin. + + + + + Gets a value indicating whether this instance has at least one margin with a value other than zero. + + + + + Base namespace of PDFsharp. Most classes are implemented in nested namespaces like e. g. PdfSharp.Pdf. + + + + + + Specifies the orientation of a page. + + + + + The default page orientation. + + + + + The width and height of the page are reversed. + + + + + Identifies the most popular predefined page sizes. + + + + + The width or height of the page are set manually and override the PageSize property. + + + + + Identifies a paper sheet size of 841 mm times 1189 mm or 33.11 inch times 46.81 inch. + + + + + Identifies a paper sheet size of 594 mm times 841 mm or 23.39 inch times 33.1 inch. + + + + + Identifies a paper sheet size of 420 mm times 594 mm or 16.54 inch times 23.29 inch. + + + + + Identifies a paper sheet size of 297 mm times 420 mm or 11.69 inch times 16.54 inch. + + + + + Identifies a paper sheet size of 210 mm times 297 mm or 8.27 inch times 11.69 inch. + + + + + Identifies a paper sheet size of 148 mm times 210 mm or 5.83 inch times 8.27 inch. + + + + + Identifies a paper sheet size of 860 mm times 1220 mm. + + + + + Identifies a paper sheet size of 610 mm times 860 mm. + + + + + Identifies a paper sheet size of 430 mm times 610 mm. + + + + + Identifies a paper sheet size of 305 mm times 430 mm. + + + + + Identifies a paper sheet size of 215 mm times 305 mm. + + + + + Identifies a paper sheet size of 153 mm times 215 mm. + + + + + Identifies a paper sheet size of 1000 mm times 1414 mm or 39.37 inch times 55.67 inch. + + + + + Identifies a paper sheet size of 707 mm times 1000 mm or 27.83 inch times 39.37 inch. + + + + + Identifies a paper sheet size of 500 mm times 707 mm or 19.68 inch times 27.83 inch. + + + + + Identifies a paper sheet size of 353 mm times 500 mm or 13.90 inch times 19.68 inch. + + + + + Identifies a paper sheet size of 250 mm times 353 mm or 9.84 inch times 13.90 inch. + + + + + Identifies a paper sheet size of 176 mm times 250 mm or 6.93 inch times 9.84 inch. + + + + + Identifies a paper sheet size of 10 inch times 8 inch or 254 mm times 203 mm. + + + + + Identifies a paper sheet size of 13 inch times 8 inch or 330 mm times 203 mm. + + + + + Identifies a paper sheet size of 10.5 inch times 7.25 inch or 267 mm times 184 mm. + + + + + Identifies a paper sheet size of 10.5 inch times 8 inch 267 mm times 203 mm. + + + + + Identifies a paper sheet size of 11 inch times 8.5 inch 279 mm times 216 mm. + + + + + Identifies a paper sheet size of 14 inch times 8.5 inch 356 mm times 216 mm. + + + + + Identifies a paper sheet size of 17 inch times 11 inch or 432 mm times 279 mm. + + + + + Identifies a paper sheet size of 17 inch times 11 inch or 432 mm times 279 mm. + + + + + Identifies a paper sheet size of 19.25 inch times 15.5 inch 489 mm times 394 mm. + + + + + 20 ×Identifies a paper sheet size of 20 inch times 15 inch or 508 mm times 381 mm. + + + + + Identifies a paper sheet size of 21 inch times 16.5 inch 533 mm times 419 mm. + + + + + Identifies a paper sheet size of 22.5 inch times 17.5 inch 572 mm times 445 mm. + + + + + Identifies a paper sheet size of 23 inch times 18 inch or 584 mm times 457 mm. + + + + + Identifies a paper sheet size of 25 inch times 20 inch or 635 mm times 508 mm. + + + + + Identifies a paper sheet size of 28 inch times 23 inch or 711 mm times 584 mm. + + + + + Identifies a paper sheet size of 35 inch times 23.5 inch or 889 mm times 597 mm. + + + + + Identifies a paper sheet size of 45 inch times 35 inch 1143 times 889 mm. + + + + + Identifies a paper sheet size of 8.5 inch times 5.5 inch or 216 mm times 396 mm. + + + + + Identifies a paper sheet size of 8.5 inch times 13 inch or 216 mm times 330 mm. + + + + + Identifies a paper sheet size of 5.5 inch times 8.5 inch or 396 mm times 216 mm. + + + + + Identifies a paper sheet size of 10 inch times 14 inch. + + + + + Represents IDs for error and diagnostic messages generated by PDFsharp. + + + + + PSMsgID. + + + + + PSMsgID. + + + + + PSMsgID. + + + + + PSMsgID. + + + + + PSMsgID. + + + + + PSMsgID. + + + + + Converter from to . + + + + + Converts the specified page size enumeration to a pair of values in point. + + + + + Base class of all exceptions in the PDFsharp frame work. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The exception message. + + + + Initializes a new instance of the class. + + The exception message. + The inner exception. + + + + Version info base for all PDFsharp related assemblies. + + + + + The title of the product. + + + + + A characteristic description of the product. + + + + + The PDF producer information string. + TODO: Called Creator in MigraDoc??? + + + + + The PDF producer information string including VersionPatch. + + + + + The full version number. + + + + + The full version string. + + + + + The home page of this product. + + + + + Unused. + + + + + The company that created/owned the product. + + + + + The name the product. + + + + + The copyright information. + + + + + The trademark the product. + + + + + Unused. + + + + + The major version number of the product. + + + + + The minor version number of the product. + + + + + The build number of the product. + + + + + The patch number of the product. + + + + + The Version Prerelease String for NuGet. + + + + + E.g. "2005-01-01", for use in NuGet Script. + + + + + Use _ instead of blanks and special characters. Can be complemented with a suffix in the NuGet Script. + Nuspec Doc: The unique identifier for the package. This is the package name that is shown when packages + are listed using the Package Manager Console. These are also used when installing a package using the + Install-Package command within the Package Manager Console. Package IDs may not contain any spaces + or characters that are invalid in an URL. In general, they follow the same rules as .NET namespaces do. + So Foo.Bar is a valid ID, Foo! and Foo Bar are not. + + + + + Nuspec Doc: The human-friendly title of the package displayed in the Manage NuGet Packages dialog. + If none is specified, the ID is used instead. + + + + + Nuspec Doc: A comma-separated list of authors of the package code. + + + + + Nuspec Doc: A comma-separated list of the package creators. This is often the same list as in authors. + This is ignored when uploading the package to the NuGet.org Gallery. + + + + + Nuspec Doc: A long description of the package. This shows up in the right pane of the Add Package Dialog + as well as in the Package Manager Console when listing packages using the Get-Package command. + + + + + Nuspec Doc: A description of the changes made in each release of the package. This field only shows up + when the _Updates_ tab is selected and the package is an update to a previously installed package. + It is displayed where the Description would normally be displayed. + + + + + Nuspec Doc: A short description of the package. If specified, this shows up in the middle pane of the + Add Package Dialog. If not specified, a truncated version of the description is used instead. + + + + + Nuspec Doc: The locale ID for the package, such as en-us. + + + + + Nuspec Doc: A URL for the home page of the package. + + + http://www.pdfsharp.net/NuGetPackage_PDFsharp-GDI.ashx + http://www.pdfsharp.net/NuGetPackage_PDFsharp-WPF.ashx + + + + + Nuspec Doc: A URL for the image to use as the icon for the package in the Manage NuGet Packages + dialog box. This should be a 32x32-pixel .png file that has a transparent background. + + + + + Nuspec Doc: A link to the license that the package is under. + + + + + Nuspec Doc: A Boolean value that specifies whether the client needs to ensure that the package license (described by licenseUrl) is accepted before the package is installed. + + + + + Nuspec Doc: A space-delimited list of tags and keywords that describe the package. This information is used to help make sure users can find the package using + searches in the Add Package Reference dialog box or filtering in the Package Manager Console window. + + + + + The technology tag of the product: + (none) Pure .NET + -gdi : GDI+, + -wpf : WPF, + -hybrid : Both GDI+ and WPF (hybrid). + -sl : Silverlight + -wp : Windows Phone + -wrt : Windows RunTime + + + + + The Pdf-Sharp-String-Resources. + + + + + Loads the message from the resource associated with the enum type and formats it + using 'String.Format'. Because this function is intended to be used during error + handling it never raises an exception. + + The type of the parameter identifies the resource + and the name of the enum identifies the message in the resource. + Parameters passed through 'String.Format'. + The formatted message. + + + + Gets the localized message identified by the specified DomMsgID. + + + + + Gets the resource manager for this module. + + + + + Writes all messages defined by PSMsgID. + + + + + Version info of this assembly. + + + + + Computes Adler32 checksum for a stream of data. An Adler32 + checksum is not as reliable as a CRC32 checksum, but a lot faster to + compute. + + The specification for Adler32 may be found in RFC 1950. + ZLIB Compressed Data Format Specification version 3.3) + + + From that document: + + "ADLER32 (Adler-32 checksum) + This contains a checksum value of the uncompressed data + (excluding any dictionary data) computed according to Adler-32 + algorithm. This algorithm is a 32-bit extension and improvement + of the Fletcher algorithm, used in the ITU-T X.224 / ISO 8073 + standard. + + Adler-32 is composed of two sums accumulated per byte: s1 is + the sum of all bytes, s2 is the sum of all s1 values. Both sums + are done modulo 65521. s1 is initialized to 1, s2 to zero. The + Adler-32 checksum is stored as s2*65536 + s1 in most- + significant-byte first (network) order." + + "8.2. The Adler-32 algorithm + + The Adler-32 algorithm is much faster than the CRC32 algorithm yet + still provides an extremely low probability of undetected errors. + + The modulo on unsigned long accumulators can be delayed for 5552 + bytes, so the modulo operation time is negligible. If the bytes + are a, b, c, the second sum is 3a + 2b + c + 3, and so is position + and order sensitive, unlike the first sum, which is just a + checksum. That 65521 is prime is important to avoid a possible + large class of two-byte errors that leave the check unchanged. + (The Fletcher checksum uses 255, which is not prime and which also + makes the Fletcher check insensitive to single byte changes 0 - + 255.) + + The sum s1 is initialized to 1 instead of zero to make the length + of the sequence part of s2, so that the length does not have to be + checked separately. (Any sequence of zeroes has a Fletcher + checksum of zero.)" + + + + + + + largest prime smaller than 65536 + + + + + Returns the Adler32 data checksum computed so far. + + + + + Creates a new instance of the Adler32 class. + The checksum starts off with a value of 1. + + + + + Resets the Adler32 checksum to the initial value. + + + + + Updates the checksum with a byte value. + + + The data value to add. The high byte of the int is ignored. + + + + + Updates the checksum with an array of bytes. + + + The source of the data to update with. + + + + + Updates the checksum with the bytes taken from the array. + + + an array of bytes + + + the start of the data used for this update + + + the number of bytes to use for this update + + + + + Generate a table for a byte-wise 32-bit CRC calculation on the polynomial: + x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. + + Polynomials over GF(2) are represented in binary, one bit per coefficient, + with the lowest powers in the most significant bit. Then adding polynomials + is just exclusive-or, and multiplying a polynomial by x is a right shift by + one. If we call the above polynomial p, and represent a byte as the + polynomial q, also with the lowest power in the most significant bit (so the + byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, + where a mod b means the remainder after dividing a by b. + + This calculation is done using the shift-register method of multiplying and + taking the remainder. The register is initialized to zero, and for each + incoming bit, x^32 is added mod p to the register if the bit is a one (where + x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by + x (which is shifting right by one and adding x^32 mod p if the bit shifted + out is a one). We start with the highest power (least significant bit) of + q and repeat for all eight bits of q. + + The table is simply the CRC of all possible eight bit values. This is all + the information needed to generate CRC's on data a byte at a time for all + combinations of CRC register values and incoming bytes. + + + + + The crc data checksum so far. + + + + + Returns the CRC32 data checksum computed so far. + + + + + Resets the CRC32 data checksum as if no update was ever called. + + + + + Updates the checksum with the int bval. + + + the byte is taken as the lower 8 bits of value + + + + + Updates the checksum with the bytes taken from the array. + + + buffer an array of bytes + + + + + Adds the byte array to the data checksum. + + + The buffer which contains the data + + + The offset in the buffer where the data starts + + + The number of data bytes to update the CRC with. + + + + + Interface to compute a data checksum used by checked input/output streams. + A data checksum can be updated by one byte or with a byte array. After each + update the value of the current checksum can be returned by calling + getValue. The complete checksum object can also be reset + so it can be used again with new data. + + + + + Returns the data checksum computed so far. + + + + + Resets the data checksum as if no update was ever called. + + + + + Adds one byte to the data checksum. + + + the data value to add. The high byte of the int is ignored. + + + + + Updates the data checksum with the bytes taken from the array. + + + buffer an array of bytes + + + + + Adds the byte array to the data checksum. + + + The buffer which contains the data + + + The offset in the buffer where the data starts + + + the number of data bytes to add. + + + + + SharpZipBaseException is the base exception class for the SharpZipLibrary. + All library exceptions are derived from this. + + NOTE: Not all exceptions thrown will be derived from this class. + A variety of other exceptions are possible for example + + + + Initializes a new instance of the SharpZipBaseException class. + + + + + Initializes a new instance of the SharpZipBaseException class with a specified error message. + + A message describing the exception. + + + + Initializes a new instance of the SharpZipBaseException class with a specified + error message and a reference to the inner exception that is the cause of this exception. + + A message describing the exception. + The inner exception + + + + This is the Deflater class. The deflater class compresses input + with the deflate algorithm described in RFC 1951. It has several + compression levels and three different strategies described below. + + This class is not thread safe. This is inherent in the API, due + to the split of deflate and setInput. + + Author of the original java version: Jochen Hoenicke + + + + + The best and slowest compression level. This tries to find very + long and distant string repetitions. + + + + + The worst but fastest compression level. + + + + + The default compression level. + + + + + This level won't compress at all but output uncompressed blocks. + + + + + The compression method. This is the only method supported so far. + There is no need to use this constant at all. + + + + + Creates a new deflater with default compression level. + + + + + Creates a new deflater with given compression level. + + + the compression level, a value between NO_COMPRESSION + and BEST_COMPRESSION, or DEFAULT_COMPRESSION. + + if lvl is out of range. + + + + Creates a new deflater with given compression level. + + + the compression level, a value between NO_COMPRESSION + and BEST_COMPRESSION. + + + true, if we should suppress the Zlib/RFC1950 header at the + beginning and the adler checksum at the end of the output. This is + useful for the GZIP/PKZIP formats. + + if lvl is out of range. + + + + Resets the deflater. The deflater acts afterwards as if it was + just created with the same compression level and strategy as it + had before. + + + + + Gets the current adler checksum of the data that was processed so far. + + + + + Gets the number of input bytes processed so far. + + + + + Gets the number of output bytes so far. + + + + + Flushes the current input block. Further calls to deflate() will + produce enough output to inflate everything in the current input + block. This is not part of Sun's JDK so I have made it package + private. It is used by DeflaterOutputStream to implement + flush(). + + + + + Finishes the deflater with the current input block. It is an error + to give more input after this method was called. This method must + be called to force all bytes to be flushed. + + + + + Returns true if the stream was finished and no more output bytes + are available. + + + + + Returns true, if the input buffer is empty. + You should then call setInput(). + NOTE: This method can also return true when the stream + was finished. + + + + + Sets the data which should be compressed next. This should be only + called when needsInput indicates that more input is needed. + If you call setInput when needsInput() returns false, the + previous input that is still pending will be thrown away. + The given byte array should not be changed, before needsInput() returns + true again. + This call is equivalent to setInput(input, 0, input.length). + + + the buffer containing the input data. + + + if the buffer was finished() or ended(). + + + + + Sets the data which should be compressed next. This should be + only called when needsInput indicates that more input is needed. + The given byte array should not be changed, before needsInput() returns + true again. + + + the buffer containing the input data. + + + the start of the data. + + + the number of data bytes of input. + + + if the buffer was Finish()ed or if previous input is still pending. + + + + + Sets the compression level. There is no guarantee of the exact + position of the change, but if you call this when needsInput is + true the change of compression level will occur somewhere near + before the end of the so far given input. + + + the new compression level. + + + + + Get current compression level + + Returns the current compression level + + + + Sets the compression strategy. Strategy is one of + DEFAULT_STRATEGY, HUFFMAN_ONLY and FILTERED. For the exact + position where the strategy is changed, the same as for + SetLevel() applies. + + + The new compression strategy. + + + + + Deflates the current input block with to the given array. + + + The buffer where compressed data is stored + + + The number of compressed bytes added to the output, or 0 if either + IsNeedingInput() or IsFinished returns true or length is zero. + + + + + Deflates the current input block to the given array. + + + Buffer to store the compressed data. + + + Offset into the output array. + + + The maximum number of bytes that may be stored. + + + The number of compressed bytes added to the output, or 0 if either + needsInput() or finished() returns true or length is zero. + + + If Finish() was previously called. + + + If offset or length don't match the array length. + + + + + Sets the dictionary which should be used in the deflate process. + This call is equivalent to setDictionary(dict, 0, dict.Length). + + + the dictionary. + + + if SetInput () or Deflate () were already called or another dictionary was already set. + + + + + Sets the dictionary which should be used in the deflate process. + The dictionary is a byte array containing strings that are + likely to occur in the data which should be compressed. The + dictionary is not stored in the compressed output, only a + checksum. To decompress the output you need to supply the same + dictionary again. + + + The dictionary data + + + The index where dictionary information commences. + + + The number of bytes in the dictionary. + + + If SetInput () or Deflate() were already called or another dictionary was already set. + + + + + Compression level. + + + + + If true no Zlib/RFC1950 headers or footers are generated + + + + + The current state. + + + + + The total bytes of output written. + + + + + The pending output. + + + + + The deflater engine. + + + + + This class contains constants used for deflation. + + + + + Set to true to enable debugging + + + + + Written to Zip file to identify a stored block + + + + + Identifies static tree in Zip file + + + + + Identifies dynamic tree in Zip file + + + + + Header flag indicating a preset dictionary for deflation + + + + + Sets internal buffer sizes for Huffman encoding + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Strategies for deflater + + + + + The default strategy + + + + + This strategy will only allow longer string repetitions. It is + useful for random data with a small character set. + + + + + This strategy will not look for string repetitions at all. It + only encodes with Huffman trees (which means, that more common + characters get a smaller encoding. + + + + + Low level compression engine for deflate algorithm which uses a 32K sliding window + with secondary compression from Huffman/Shannon-Fano codes. + + + + + Construct instance with pending buffer + + + Pending buffer to use + > + + + + Deflate drives actual compression of data + + True to flush input buffers + Finish deflation with the current input. + Returns true if progress has been made. + + + + Sets input data to be deflated. Should only be called when NeedsInput() + returns true + + The buffer containing input data. + The offset of the first byte of data. + The number of bytes of data to use as input. + + + + Determines if more input is needed. + + Return true if input is needed via SetInput + + + + Set compression dictionary + + The buffer containing the dictionary data + The offset in the buffer for the first byte of data + The length of the dictionary data. + + + + Reset internal state + + + + + Reset Adler checksum + + + + + Get current value of Adler checksum + + + + + Total data processed + + + + + Get/set the deflate strategy + + + + + Set the deflate level (0-9) + + The value to set the level to. + + + + Fill the window + + + + + Inserts the current string in the head hash and returns the previous + value for this hash. + + The previous hash value + + + + Find the best (longest) string in the window matching the + string starting at strstart. + + Preconditions: + + strstart + MAX_MATCH <= window.length. + + + True if a match greater than the minimum length is found + + + + Hashtable, hashing three characters to an index for window, so + that window[index]..window[index+2] have this hash code. + Note that the array should really be unsigned short, so you need + to and the values with 0xffff. + + + + + prev[index & WMASK] points to the previous index that has the + same hash code as the string starting at index. This way + entries with the same hash code are in a linked list. + Note that the array should really be unsigned short, so you need + to and the values with 0xffff. + + + + + Points to the current character in the window. + + + + + lookahead is the number of characters starting at strstart in + window that are valid. + So window[strstart] until window[strstart+lookahead-1] are valid + characters. + + + + + This array contains the part of the uncompressed stream that + is of relevance. The current character is indexed by strstart. + + + + + The current compression function. + + + + + The input data for compression. + + + + + The total bytes of input read. + + + + + The offset into inputBuf, where input data starts. + + + + + The end offset of the input data. + + + + + The adler checksum + + + + + This is the DeflaterHuffman class. + + This class is not thread safe. This is inherent in the API, due + to the split of Deflate and SetInput. + + author of the original java version : Jochen Hoenicke + + + + + Resets the internal state of the tree + + + + + Check that all frequencies are zero + + + At least one frequency is non-zero + + + + + Set static codes and length + + new codes + length for new codes + + + + Build dynamic codes and lengths + + + + + Get encoded length + + Encoded length, the sum of frequencies * lengths + + + + Scan a literal or distance tree to determine the frequencies of the codes + in the bit length tree. + + + + + Write tree values + + Tree to write + + + + Pending buffer to use + + + + + Construct instance with pending buffer + + Pending buffer to use + + + + Reset internal state + + + + + Write all trees to pending buffer + + The number/rank of treecodes to send. + + + + Compress current buffer writing data to pending buffer + + + + + Flush block to output with no compression + + Data to write + Index of first byte to write + Count of bytes to write + True if this is the last block + + + + Flush block to output with compression + + Data to flush + Index of first byte to flush + Count of bytes to flush + True if this is the last block + + + + Get value indicating if internal buffer is full + + true if buffer is full + + + + Add literal to buffer + + Literal value to add to buffer. + Value indicating internal buffer is full + + + + Add distance code and length to literal and distance trees + + Distance code + Length + Value indicating if internal buffer is full + + + + Reverse the bits of a 16 bit value. + + Value to reverse bits + Value with bits reversed + + + + This class stores the pending output of the Deflater. + + Author of the original java version: Jochen Hoenicke + + + + + Construct instance with default buffer size + + + + + Inflater is used to decompress data that has been compressed according + to the "deflate" standard described in rfc1951. + + By default Zlib (rfc1950) headers and footers are expected in the input. + You can use constructor public Inflater(bool noHeader) passing true + if there is no Zlib header information + + The usage is as following. First you have to set some input with + SetInput(), then Inflate() it. If inflate doesn't + inflate any bytes there may be three reasons: +
    +
  • IsNeedingInput() returns true because the input buffer is empty. + You have to provide more input with SetInput(). + NOTE: IsNeedingInput() also returns true when, the stream is finished. +
  • +
  • IsNeedingDictionary() returns true, you have to provide a preset + dictionary with SetDictionary().
  • +
  • IsFinished returns true, the inflater has finished.
  • +
+ Once the first output byte is produced, a dictionary will not be + needed at a later stage. + + Author of the original java version: John Leuner, Jochen Hoenicke +
+
+ + + Copy lengths for literal codes 257..285 + + + + + Extra bits for literal codes 257..285 + + + + + Copy offsets for distance codes 0..29 + + + + + Extra bits for distance codes + + + + + These are the possible states for an inflater + + + + + This variable contains the current state. + + + + + The adler checksum of the dictionary or of the decompressed + stream, as it is written in the header resp. footer of the + compressed stream. + Only valid if mode is DECODE_DICT or DECODE_CHKSUM. + + + + + The number of bits needed to complete the current state. This + is valid, if mode is DECODE_DICT, DECODE_CHKSUM, + DECODE_HUFFMAN_LENBITS or DECODE_HUFFMAN_DISTBITS. + + + + + True, if the last block flag was set in the last block of the + inflated stream. This means that the stream ends after the + current block. + + + + + The total number of inflated bytes. + + + + + The total number of bytes set with setInput(). This is not the + value returned by the TotalIn property, since this also includes the + unprocessed input. + + + + + This variable stores the noHeader flag that was given to the constructor. + True means, that the inflated stream doesn't contain a Zlib header or + footer. + + + + + Creates a new inflater or RFC1951 decompressor + RFC1950/Zlib headers and footers will be expected in the input data + + + + + Creates a new inflater. + + + True if no RFC1950/Zlib header and footer fields are expected in the input data + + This is used for GZIPed/Zipped input. + + For compatibility with + Sun JDK you should provide one byte of input more than needed in + this case. + + + + + Resets the inflater so that a new stream can be decompressed. All + pending input and output will be discarded. + + + + + Decodes a zlib/RFC1950 header. + + + False if more input is needed. + + + The header is invalid. + + + + + Decodes the dictionary checksum after the deflate header. + + + False if more input is needed. + + + + + Decodes the huffman encoded symbols in the input stream. + + + false if more input is needed, true if output window is + full or the current block ends. + + + if deflated stream is invalid. + + + + + Decodes the adler checksum after the deflate stream. + + + false if more input is needed. + + + If checksum doesn't match. + + + + + Decodes the deflated stream. + + + false if more input is needed, or if finished. + + + if deflated stream is invalid. + + + + + Sets the preset dictionary. This should only be called, if + needsDictionary() returns true and it should set the same + dictionary, that was used for deflating. The getAdler() + function returns the checksum of the dictionary needed. + + + The dictionary. + + + + + Sets the preset dictionary. This should only be called, if + needsDictionary() returns true and it should set the same + dictionary, that was used for deflating. The getAdler() + function returns the checksum of the dictionary needed. + + + The dictionary. + + + The index into buffer where the dictionary starts. + + + The number of bytes in the dictionary. + + + No dictionary is needed. + + + The adler checksum for the buffer is invalid + + + + + Sets the input. This should only be called, if needsInput() + returns true. + + + the input. + + + + + Sets the input. This should only be called, if needsInput() + returns true. + + + The source of input data + + + The index into buffer where the input starts. + + + The number of bytes of input to use. + + + No input is needed. + + + The index and/or count are wrong. + + + + + Inflates the compressed stream to the output buffer. If this + returns 0, you should check, whether IsNeedingDictionary(), + IsNeedingInput() or IsFinished() returns true, to determine why no + further output is produced. + + + the output buffer. + + + The number of bytes written to the buffer, 0 if no further + output can be produced. + + + if buffer has length 0. + + + if deflated stream is invalid. + + + + + Inflates the compressed stream to the output buffer. If this + returns 0, you should check, whether needsDictionary(), + needsInput() or finished() returns true, to determine why no + further output is produced. + + + the output buffer. + + + the offset in buffer where storing starts. + + + the maximum number of bytes to output. + + + the number of bytes written to the buffer, 0 if no further output can be produced. + + + if count is less than 0. + + + if the index and / or count are wrong. + + + if deflated stream is invalid. + + + + + Returns true, if the input buffer is empty. + You should then call setInput(). + NOTE: This method also returns true when the stream is finished. + + + + + Returns true, if a preset dictionary is needed to inflate the input. + + + + + Returns true, if the inflater has finished. This means, that no + input is needed and no output can be produced. + + + + + Gets the adler checksum. This is either the checksum of all + uncompressed bytes returned by inflate(), or if needsDictionary() + returns true (and thus no output was yet produced) this is the + adler checksum of the expected dictionary. + + + the adler checksum. + + + + + Gets the total number of output bytes returned by Inflate(). + + + the total number of output bytes. + + + + + Gets the total number of processed compressed input bytes. + + + The total number of bytes of processed input bytes. + + + + + Gets the number of unprocessed input bytes. Useful, if the end of the + stream is reached and you want to further process the bytes after + the deflate stream. + + + The number of bytes of the input which have not been processed. + + + + + Huffman tree used for inflation + + + + + Literal length tree + + + + + Distance tree + + + + + Constructs a Huffman tree from the array of code lengths. + + + the array of code lengths + + + + + Reads the next symbol from input. The symbol is encoded using the + huffman tree. + + + input the input source. + + + the next symbol, or -1 if not enough input is available. + + + + + This class is general purpose class for writing data to a buffer. + + It allows you to write bits as well as bytes + Based on DeflaterPending.java + + Author of the original java version: Jochen Hoenicke + + + + + Internal work buffer + + + + + construct instance using default buffer size of 4096 + + + + + construct instance using specified buffer size + + + size to use for internal buffer + + + + + Clear internal state/buffers + + + + + Write a byte to buffer + + + The value to write + + + + + Write a short value to buffer LSB first + + + The value to write. + + + + + write an integer LSB first + + The value to write. + + + + Write a block of data to buffer + + data to write + offset of first byte to write + number of bytes to write + + + + The number of bits written to the buffer + + + + + Align internal buffer on a byte boundary + + + + + Write bits to internal buffer + + source of bits + number of bits to write + + + + Write a short value to internal buffer most significant byte first + + value to write + + + + Indicates if buffer has been flushed + + + + + Flushes the pending buffer into the given output array. If the + output array is to small, only a partial flush is done. + + The output array. + The offset into output array. + The maximum number of bytes to store. + The number of bytes flushed. + + + + Convert internal buffer to byte array. + Buffer is empty on completion + + + The internal buffer contents converted to a byte array. + + + + + A special stream deflating or compressing the bytes that are + written to it. It uses a Deflater to perform actual deflating.
+ Authors of the original java version: Tom Tromey, Jochen Hoenicke +
+
+ + + Creates a new DeflaterOutputStream with a default Deflater and default buffer size. + + + the output stream where deflated output should be written. + + + + + Creates a new DeflaterOutputStream with the given Deflater and + default buffer size. + + + the output stream where deflated output should be written. + + + the underlying deflater. + + + + + Creates a new DeflaterOutputStream with the given Deflater and + buffer size. + + + The output stream where deflated output is written. + + + The underlying deflater to use + + + The buffer size in bytes to use when deflating (minimum value 512) + + + bufsize is less than or equal to zero. + + + baseOutputStream does not support writing + + + deflater instance is null + + + + + Finishes the stream by calling finish() on the deflater. + + + Not all input is deflated + + + + + Get/set flag indicating ownership of the underlying stream. + When the flag is true will close the underlying stream also. + + + + + Allows client to determine if an entry can be patched after its added + + + + + Get/set the password used for encryption. + + When set to null or if the password is empty no encryption is performed + + + + Encrypt a block of data + + + Data to encrypt. NOTE the original contents of the buffer are lost + + + Offset of first byte in buffer to encrypt + + + Number of bytes in buffer to encrypt + + + + + Initializes encryption keys based on given . + + The password. + + + + Encrypt a single byte + + + The encrypted value + + + + + Update encryption keys + + + + + Deflates everything in the input buffers. This will call + def.deflate() until all bytes from the input buffers + are processed. + + + + + Gets value indicating stream can be read from + + + + + Gets a value indicating if seeking is supported for this stream + This property always returns false + + + + + Get value indicating if this stream supports writing + + + + + Get current length of stream + + + + + Gets the current position within the stream. + + Any attempt to set position + + + + Sets the current position of this stream to the given value. Not supported by this class! + + The offset relative to the to seek. + The to seek from. + The new position in the stream. + Any access + + + + Sets the length of this stream to the given value. Not supported by this class! + + The new stream length. + Any access + + + + Read a byte from stream advancing position by one + + The byte read cast to an int. THe value is -1 if at the end of the stream. + Any access + + + + Read a block of bytes from stream + + The buffer to store read data in. + The offset to start storing at. + The maximum number of bytes to read. + The actual number of bytes read. Zero if end of stream is detected. + Any access + + + + Asynchronous reads are not supported a NotSupportedException is always thrown + + The buffer to read into. + The offset to start storing data at. + The number of bytes to read + The async callback to use. + The state to use. + Returns an + Any access + + + + Asynchronous writes arent supported, a NotSupportedException is always thrown + + The buffer to write. + The offset to begin writing at. + The number of bytes to write. + The to use. + The state object. + Returns an IAsyncResult. + Any access + + + + Flushes the stream by calling Flush on the deflater and then + on the underlying stream. This ensures that all bytes are flushed. + + + + + Calls and closes the underlying + stream when is true. + + + + + Writes a single byte to the compressed output stream. + + + The byte value. + + + + + Writes bytes from an array to the compressed stream. + + + The byte array + + + The offset into the byte array where to start. + + + The number of bytes to write. + + + + + This buffer is used temporarily to retrieve the bytes from the + deflater and write them to the underlying output stream. + + + + + The deflater which is used to deflate the stream. + + + + + Base stream the deflater depends on. + + + + + An input buffer customised for use by + + + The buffer supports decryption of incoming data. + + + + + Initialise a new instance of with a default buffer size + + The stream to buffer. + + + + Initialise a new instance of + + The stream to buffer. + The size to use for the buffer + A minimum buffer size of 1KB is permitted. Lower sizes are treated as 1KB. + + + + Get the length of bytes bytes in the + + + + + Get the contents of the raw data buffer. + + This may contain encrypted data. + + + + Get the number of useable bytes in + + + + + Get the contents of the clear text buffer. + + + + + Get/set the number of bytes available + + + + + Call passing the current clear text buffer contents. + + The inflater to set input for. + + + + Fill the buffer from the underlying input stream. + + + + + Read a buffer directly from the input stream + + The buffer to fill + Returns the number of bytes read. + + + + Read a buffer directly from the input stream + + The buffer to read into + The offset to start reading data into. + The number of bytes to read. + Returns the number of bytes read. + + + + Read clear text data from the input stream. + + The buffer to add data to. + The offset to start adding data at. + The number of bytes to read. + Returns the number of bytes actually read. + + + + Read a from the input stream. + + Returns the byte read. + + + + Read an in little endian byte order. + + The short value read case to an int. + + + + Read an in little endian byte order. + + The int value read. + + + + Read a in little endian byte order. + + The long value read. + + + + This filter stream is used to decompress data compressed using the "deflate" + format. The "deflate" format is described in RFC 1951. + + This stream may form the basis for other decompression filters, such + as the GZipInputStream. + + Author of the original java version: John Leuner. + + + + + Create an InflaterInputStream with the default decompressor + and a default buffer size of 4KB. + + + The InputStream to read bytes from + + + + + Create an InflaterInputStream with the specified decompressor + and a default buffer size of 4KB. + + + The source of input data + + + The decompressor used to decompress data read from baseInputStream + + + + + Create an InflaterInputStream with the specified decompressor + and the specified buffer size. + + + The InputStream to read bytes from + + + The decompressor to use + + + Size of the buffer to use + + + + + Get/set flag indicating ownership of underlying stream. + When the flag is true will close the underlying stream also. + + + The default value is true. + + + + + Skip specified number of bytes of uncompressed data + + + Number of bytes to skip + + + The number of bytes skipped, zero if the end of + stream has been reached + + + The number of bytes to skip is less than or equal to zero. + + + + + Clear any cryptographic state. + + + + + Returns 0 once the end of the stream (EOF) has been reached. + Otherwise returns 1. + + + + + Fills the buffer with more data to decompress. + + + Stream ends early + + + + + Gets a value indicating whether the current stream supports reading + + + + + Gets a value of false indicating seeking is not supported for this stream. + + + + + Gets a value of false indicating that this stream is not writeable. + + + + + A value representing the length of the stream in bytes. + + + + + The current position within the stream. + Throws a NotSupportedException when attempting to set the position + + Attempting to set the position + + + + Flushes the baseInputStream + + + + + Sets the position within the current stream + Always throws a NotSupportedException + + The relative offset to seek to. + The defining where to seek from. + The new position in the stream. + Any access + + + + Set the length of the current stream + Always throws a NotSupportedException + + The new length value for the stream. + Any access + + + + Writes a sequence of bytes to stream and advances the current position + This method always throws a NotSupportedException + + Thew buffer containing data to write. + The offset of the first byte to write. + The number of bytes to write. + Any access + + + + Writes one byte to the current stream and advances the current position + Always throws a NotSupportedException + + The byte to write. + Any access + + + + Entry point to begin an asynchronous write. Always throws a NotSupportedException. + + The buffer to write data from + Offset of first byte to write + The maximum number of bytes to write + The method to be called when the asynchronous write operation is completed + A user-provided object that distinguishes this particular asynchronous write request from other requests + An IAsyncResult that references the asynchronous write + Any access + + + + Closes the input stream. When + is true the underlying stream is also closed. + + + + + Reads decompressed data into the provided buffer byte array + + + The array to read and decompress data into + + + The offset indicating where the data should be placed + + + The number of bytes to decompress + + The number of bytes read. Zero signals the end of stream + + Inflater needs a dictionary + + + + + Decompressor for this stream + + + + + Input buffer for this stream. + + + + + Base stream the inflater reads from. + + + + + Flag indicating wether this instance has been closed or not. + + + + + Flag indicating wether this instance is designated the stream owner. + When closing if this flag is true the underlying stream is closed. + + + + + Contains the output from the Inflation process. + We need to have a window so that we can refer backwards into the output stream + to repeat stuff.
+ Author of the original java version: John Leuner +
+
+ + + Write a byte to this output window + + value to write + + if window is full + + + + + Append a byte pattern already in the window itself + + length of pattern to copy + distance from end of window pattern occurs + + If the repeated data overflows the window + + + + + Copy from input manipulator to internal window + + source of data + length of data to copy + the number of bytes copied + + + + Copy dictionary to window + + source dictionary + offset of start in source dictionary + length of dictionary + + If window isnt empty + + + + + Get remaining unfilled space in window + + Number of bytes left in window + + + + Get bytes available for output in window + + Number of bytes filled + + + + Copy contents of window to output + + buffer to copy to + offset to start at + number of bytes to count + The number of bytes copied + + If a window underflow occurs + + + + + Reset by clearing window so GetAvailable returns 0 + + + + + This class allows us to retrieve a specified number of bits from + the input buffer, as well as copy big byte blocks. + + It uses an int buffer to store up to 31 bits for direct + manipulation. This guarantees that we can get at least 16 bits, + but we only need at most 15, so this is all safe. + + There are some optimizations in this class, for example, you must + never peek more than 8 bits more than needed, and you must first + peek bits before you may drop them. This is not a general purpose + class but optimized for the behaviour of the Inflater. + + Authors of the original java version: John Leuner, Jochen Hoenicke + + + + + Constructs a default StreamManipulator with all buffers empty + + + + + Get the next sequence of bits but don't increase input pointer. bitCount must be + less or equal 16 and if this call succeeds, you must drop + at least n - 8 bits in the next call. + + The number of bits to peek. + + the value of the bits, or -1 if not enough bits available. */ + + + + + Drops the next n bits from the input. You should have called PeekBits + with a bigger or equal n before, to make sure that enough bits are in + the bit buffer. + + The number of bits to drop. + + + + Gets the next n bits and increases input pointer. This is equivalent + to followed by , except for correct error handling. + + The number of bits to retrieve. + + the value of the bits, or -1 if not enough bits available. + + + + + Gets the number of bits available in the bit buffer. This must be + only called when a previous PeekBits() returned -1. + + + the number of bits available. + + + + + Gets the number of bytes available. + + + The number of bytes available. + + + + + Skips to the next byte boundary. + + + + + Returns true when SetInput can be called + + + + + Copies bytes from input buffer to output buffer starting + at output[offset]. You have to make sure, that the buffer is + byte aligned. If not enough bytes are available, copies fewer + bytes. + + + The buffer to copy bytes to. + + + The offset in the buffer at which copying starts + + + The length to copy, 0 is allowed. + + + The number of bytes copied, 0 if no bytes were available. + + + Length is less than zero + + + Bit buffer isnt byte aligned + + + + + Resets state and empties internal buffers + + + + + Add more input for consumption. + Only call when IsNeedingInput returns true + + data to be input + offset of first byte of input + number of bytes of input to add. + + + + Determines how entries are tested to see if they should use Zip64 extensions or not. + + + + + Zip64 will not be forced on entries during processing. + + An entry can have this overridden if required ZipEntry.ForceZip64" + + + + Zip64 should always be used. + + + + + #ZipLib will determine use based on entry values when added to archive. + + + + + The kind of compression used for an entry in an archive + + + + + A direct copy of the file contents is held in the archive + + + + + Common Zip compression method using a sliding dictionary + of up to 32KB and secondary compression from Huffman/Shannon-Fano trees + + + + + An extension to deflate with a 64KB window. Not supported by #Zip currently + + + + + BZip2 compression. Not supported by #Zip. + + + + + WinZip special for AES encryption, Now supported by #Zip. + + + + + Identifies the encryption algorithm used for an entry + + + + + No encryption has been used. + + + + + Encrypted using PKZIP 2.0 or 'classic' encryption. + + + + + DES encryption has been used. + + + + + RC2 encryption has been used for encryption. + + + + + Triple DES encryption with 168 bit keys has been used for this entry. + + + + + Triple DES with 112 bit keys has been used for this entry. + + + + + AES 128 has been used for encryption. + + + + + AES 192 has been used for encryption. + + + + + AES 256 has been used for encryption. + + + + + RC2 corrected has been used for encryption. + + + + + Blowfish has been used for encryption. + + + + + Twofish has been used for encryption. + + + + + RC4 has been used for encryption. + + + + + An unknown algorithm has been used for encryption. + + + + + Defines the contents of the general bit flags field for an archive entry. + + + + + Bit 0 if set indicates that the file is encrypted + + + + + Bits 1 and 2 - Two bits defining the compression method (only for Method 6 Imploding and 8,9 Deflating) + + + + + Bit 3 if set indicates a trailing data desciptor is appended to the entry data + + + + + Bit 4 is reserved for use with method 8 for enhanced deflation + + + + + Bit 5 if set indicates the file contains Pkzip compressed patched data. + Requires version 2.7 or greater. + + + + + Bit 6 if set indicates strong encryption has been used for this entry. + + + + + Bit 7 is currently unused + + + + + Bit 8 is currently unused + + + + + Bit 9 is currently unused + + + + + Bit 10 is currently unused + + + + + Bit 11 if set indicates the filename and + comment fields for this file must be encoded using UTF-8. + + + + + Bit 12 is documented as being reserved by PKware for enhanced compression. + + + + + Bit 13 if set indicates that values in the local header are masked to hide + their actual values, and the central directory is encrypted. + + + Used when encrypting the central directory contents. + + + + + Bit 14 is documented as being reserved for use by PKware + + + + + Bit 15 is documented as being reserved for use by PKware + + + + + This class contains constants used for Zip format files + + + + + The version made by field for entries in the central header when created by this library + + + This is also the Zip version for the library when comparing against the version required to extract + for an entry. See ZipEntry.CanDecompress. + + + + + The version made by field for entries in the central header when created by this library + + + This is also the Zip version for the library when comparing against the version required to extract + for an entry. See ZipInputStream.CanDecompressEntry. + + + + + The minimum version required to support strong encryption + + + + + The minimum version required to support strong encryption + + + + + Version indicating AES encryption + + + + + The version required for Zip64 extensions (4.5 or higher) + + + + + Size of local entry header (excluding variable length fields at end) + + + + + Size of local entry header (excluding variable length fields at end) + + + + + Size of Zip64 data descriptor + + + + + Size of data descriptor + + + + + Size of data descriptor + + + + + Size of central header entry (excluding variable fields) + + + + + Size of central header entry + + + + + Size of end of central record (excluding variable fields) + + + + + Size of end of central record (excluding variable fields) + + + + + Size of 'classic' cryptographic header stored before any entry data + + + + + Size of cryptographic header stored before entry data + + + + + Signature for local entry header + + + + + Signature for local entry header + + + + + Signature for spanning entry + + + + + Signature for spanning entry + + + + + Signature for temporary spanning entry + + + + + Signature for temporary spanning entry + + + + + Signature for data descriptor + + + This is only used where the length, Crc, or compressed size isnt known when the + entry is created and the output stream doesnt support seeking. + The local entry cannot be 'patched' with the correct values in this case + so the values are recorded after the data prefixed by this header, as well as in the central directory. + + + + + Signature for data descriptor + + + This is only used where the length, Crc, or compressed size isnt known when the + entry is created and the output stream doesnt support seeking. + The local entry cannot be 'patched' with the correct values in this case + so the values are recorded after the data prefixed by this header, as well as in the central directory. + + + + + Signature for central header + + + + + Signature for central header + + + + + Signature for Zip64 central file header + + + + + Signature for Zip64 central file header + + + + + Signature for Zip64 central directory locator + + + + + Signature for archive extra data signature (were headers are encrypted). + + + + + Central header digitial signature + + + + + Central header digitial signature + + + + + End of central directory record signature + + + + + End of central directory record signature + + + + + Default encoding used for string conversion. 0 gives the default system OEM code page. + Dont use unicode encodings if you want to be Zip compatible! + Using the default code page isnt the full solution necessarily + there are many variable factors, codepage 850 is often a good choice for + European users, however be careful about compatibility. + + + + + Convert a portion of a byte array to a string. + + + Data to convert to string + + + Number of bytes to convert starting from index 0 + + + data[0]..data[count - 1] converted to a string + + + + + Convert a byte array to string + + + Byte array to convert + + + dataconverted to a string + + + + + Convert a byte array to string + + The applicable general purpose bits flags + + Byte array to convert + + The number of bytes to convert. + + dataconverted to a string + + + + + Convert a byte array to string + + + Byte array to convert + + The applicable general purpose bits flags + + dataconverted to a string + + + + + Convert a string to a byte array + + + String to convert to an array + + Converted array + + + + Convert a string to a byte array + + The applicable general purpose bits flags + + String to convert to an array + + Converted array + + + + Initialise default instance of ZipConstants + + + Private to prevent instances being created. + + + + + Represents exception conditions specific to Zip archive handling + + + + + Initializes a new instance of the ZipException class. + + + + + Initializes a new instance of the ZipException class with a specified error message. + + The error message that explains the reason for the exception. + + + + Initialise a new instance of ZipException. + + A message describing the error. + The exception that is the cause of the current exception. + +
+
diff --git a/TBF_V2/Sources/TBF/packages/Common/RestSharp.xml b/TBF_V2/Sources/TBF/packages/Common/RestSharp.xml new file mode 100644 index 00000000..5069712d --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Common/RestSharp.xml @@ -0,0 +1,3024 @@ + + + + RestSharp + + + + + Tries to Authenticate with the credentials of the currently logged in user, or impersonate a user + + + + + Authenticate with the credentials of the currently logged in user + + + + + Authenticate by impersonation + + + + + + + Authenticate by impersonation, using an existing ICredentials instance + + + + + + + + + Base class for OAuth 2 Authenticators. + + + Since there are many ways to authenticate in OAuth2, + this is used as a base class to differentiate between + other authenticators. + + Any other OAuth2 authenticators must derive from this + abstract class. + + + + + Access token to be used when authenticating. + + + + + Initializes a new instance of the class. + + + The access token. + + + + + Gets the access token. + + + + + The OAuth 2 authenticator using URI query parameter. + + + Based on http://tools.ietf.org/html/draft-ietf-oauth-v2-10#section-5.1.2 + + + + + Initializes a new instance of the class. + + + The access token. + + + + + The OAuth 2 authenticator using the authorization request header field. + + + Based on http://tools.ietf.org/html/draft-ietf-oauth-v2-10#section-5.1.1 + + + + + Stores the Authorization header value as "[tokenType] accessToken". used for performance. + + + + + Initializes a new instance of the class. + + + The access token. + + + + + Initializes a new instance of the class. + + + The access token. + + + The token type. + + + + + All text parameters are UTF-8 encoded (per section 5.1). + + + + + + Generates a random 16-byte lowercase alphanumeric string. + + + + + + + Generates a timestamp based on the current elapsed seconds since '01/01/1970 0000 GMT" + + + + + + + Generates a timestamp based on the elapsed seconds of a given time since '01/01/1970 0000 GMT" + + + A specified point in time. + + + + + The set of characters that are unreserved in RFC 2396 but are NOT unreserved in RFC 3986. + + + + + + URL encodes a string based on section 5.1 of the OAuth spec. + Namely, percent encoding with [RFC3986], avoiding unreserved characters, + upper-casing hexadecimal characters, and UTF-8 encoding for text value pairs. + + The value to escape. + The escaped value. + + The method is supposed to take on + RFC 3986 behavior if certain elements are present in a .config file. Even if this + actually worked (which in my experiments it doesn't), we can't rely on every + host actually having this configuration element present. + + + + + + + URL encodes a string based on section 5.1 of the OAuth spec. + Namely, percent encoding with [RFC3986], avoiding unreserved characters, + upper-casing hexadecimal characters, and UTF-8 encoding for text value pairs. + + + + + + + Sorts a collection of key-value pairs by name, and then value if equal, + concatenating them into a single string. This string should be encoded + prior to, or after normalization is run. + + + + + + + + Sorts a by name, and then value if equal. + + A collection of parameters to sort + A sorted parameter collection + + + + Creates a request URL suitable for making OAuth requests. + Resulting URLs must exclude port 80 or port 443 when accompanied by HTTP and HTTPS, respectively. + Resulting URLs must be lower case. + + + The original request URL + + + + + Creates a request elements concatentation value to send with a request. + This is also known as the signature base. + + + + The request's HTTP method type + The request URL + The request's parameters + A signature base string + + + + Creates a signature value given a signature base and the consumer secret. + This method is used when the token secret is currently unknown. + + + The hashing method + The signature base + The consumer key + + + + + Creates a signature value given a signature base and the consumer secret. + This method is used when the token secret is currently unknown. + + + The hashing method + The treatment to use on a signature value + The signature base + The consumer key + + + + + Creates a signature value given a signature base and the consumer secret and a known token secret. + + + The hashing method + The signature base + The consumer secret + The token secret + + + + + Creates a signature value given a signature base and the consumer secret and a known token secret. + + + The hashing method + The treatment to use on a signature value + The signature base + The consumer secret + The token secret + + + + + A class to encapsulate OAuth authentication flow. + + + + + + Generates a instance to pass to an + for the purpose of requesting an + unauthorized request token. + + The HTTP method for the intended request + + + + + + Generates a instance to pass to an + for the purpose of requesting an + unauthorized request token. + + The HTTP method for the intended request + Any existing, non-OAuth query parameters desired in the request + + + + + + Generates a instance to pass to an + for the purpose of exchanging a request token + for an access token authorized by the user at the Service Provider site. + + The HTTP method for the intended request + + + + + Generates a instance to pass to an + for the purpose of exchanging a request token + for an access token authorized by the user at the Service Provider site. + + The HTTP method for the intended request + + Any existing, non-OAuth query parameters desired in the request + + + + Generates a instance to pass to an + for the purpose of exchanging user credentials + for an access token authorized by the user at the Service Provider site. + + The HTTP method for the intended request + + Any existing, non-OAuth query parameters desired in the request + + + + + + + + + + + + + Allows control how class and property names and values are deserialized by XmlAttributeDeserializer + + + + + The name to use for the serialized element + + + + + Sets if the property to Deserialize is an Attribute or Element (Default: false) + + + + + Wrapper for System.Xml.Serialization.XmlSerializer. + + + + + Types of parameters that can be added to requests + + + + + Data formats + + + + + HTTP method to use when making requests + + + + + Format strings for commonly-used date formats + + + + + .NET format string for ISO 8601 date format + + + + + .NET format string for roundtrip date format + + + + + Status for responses (surprised?) + + + + + Extension method overload! + + + + + Save a byte array to a file + + Bytes to save + Full path to save file to + + + + Read a stream into a byte array + + Stream to read + byte[] + + + + Copies bytes from one stream to another + + The input stream. + The output stream. + + + + Converts a byte array to a string, using its byte order mark to convert it to the right encoding. + http://www.shrinkrays.net/code-snippets/csharp/an-extension-method-for-converting-a-byte-array-to-a-string.aspx + + An array of bytes to convert + The byte as a string. + + + + Decodes an HTML-encoded string and returns the decoded string. + + The HTML string to decode. + The decoded text. + + + + Decodes an HTML-encoded string and sends the resulting output to a TextWriter output stream. + + The HTML string to decode + The TextWriter output stream containing the decoded string. + + + + HTML-encodes a string and sends the resulting output to a TextWriter output stream. + + The string to encode. + The TextWriter output stream containing the encoded string. + + + + Reflection extensions + + + + + Retrieve an attribute from a member (property) + + Type of attribute to retrieve + Member to retrieve attribute from + + + + + Retrieve an attribute from a type + + Type of attribute to retrieve + Type to retrieve attribute from + + + + + Checks a type to see if it derives from a raw generic (e.g. List[[]]) + + + + + + + + Find a value from a System.Enum by trying several possible variants + of the string value of the enum. + + Type of enum + Value for which to search + The culture used to calculate the name variants + + + + + Convert a to a instance. + + The response status. + + responseStatus + + + + Uses Uri.EscapeDataString() based on recommendations on MSDN + http://blogs.msdn.com/b/yangxind/archive/2006/11/09/don-t-use-net-system-uri-unescapedatastring-in-url-decoding.aspx + + + + + Check that a string is not null or empty + + String to check + bool + + + + Remove underscores from a string + + String to process + string + + + + Parses most common JSON date formats + + JSON value to parse + + DateTime + + + + Remove leading and trailing " from a string + + String to parse + String + + + + Checks a string to see if it matches a regex + + String to check + Pattern to match + bool + + + + Converts a string to pascal case + + String to convert + + string + + + + Converts a string to pascal case with the option to remove underscores + + String to convert + Option to remove underscores + + + + + + Converts a string to camel case + + String to convert + + String + + + + Convert the first letter of a string to lower case + + String to convert + string + + + + Checks to see if a string is all uppper case + + String to check + bool + + + + Add underscores to a pascal-cased string + + String to convert + string + + + + Add dashes to a pascal-cased string + + String to convert + string + + + + Add an undescore prefix to a pascasl-cased string + + + + + + + Add spaces to a pascal-cased string + + String to convert + string + + + + Return possible variants of a name for name matching. + + String to convert + The culture to use for conversion + IEnumerable<string> + + + + XML Extension Methods + + + + + Returns the name of an element with the namespace if specified + + Element name + XML Namespace + + + + + Container for files to be uploaded with requests + + + + + Creates a file parameter from an array of bytes. + + The parameter name to use in the request. + The data to use as the file's contents. + The filename to use in the request. + The content type to use in the request. + The + + + + Creates a file parameter from an array of bytes. + + The parameter name to use in the request. + The data to use as the file's contents. + The filename to use in the request. + The using the default content type. + + + + The length of data to be sent + + + + + Provides raw data for file + + + + + Name of the file to use when uploading + + + + + MIME content type of file + + + + + Name of the parameter + + + + + HttpWebRequest wrapper (async methods) + + + HttpWebRequest wrapper + + + HttpWebRequest wrapper (sync methods) + + + + + Always send a multipart/form-data request - even when no Files are present. + + + + + An alternative to RequestBody, for when the caller already has the byte array. + + + + + Execute an async POST-style request with the specified HTTP Method. + + + The HTTP method to execute. + + + + + Execute an async GET-style request with the specified HTTP Method. + + + The HTTP method to execute. + + + + + Creates an IHttp + + + + + + Default constructor + + + + + Execute a POST request + + + + + Execute a PUT request + + + + + Execute a GET request + + + + + Execute a HEAD request + + + + + Execute an OPTIONS request + + + + + Execute a DELETE request + + + + + Execute a PATCH request + + + + + Execute a MERGE request + + + + + Execute a GET-style request with the specified HTTP Method. + + The HTTP method to execute. + + + + + Execute a POST-style request with the specified HTTP Method. + + The HTTP method to execute. + + + + + True if this HTTP request has any HTTP parameters + + + + + True if this HTTP request has any HTTP cookies + + + + + True if a request body has been specified + + + + + True if files have been set to be uploaded + + + + + Always send a multipart/form-data request - even when no Files are present. + + + + + UserAgent to be sent with request + + + + + Timeout in milliseconds to be used for the request + + + + + The number of milliseconds before the writing or reading times out. + + + + + System.Net.ICredentials to be sent with request + + + + + The System.Net.CookieContainer to be used for the request + + + + + The method to use to write the response instead of reading into RawBytes + + + + + Collection of files to be sent with request + + + + + Whether or not HTTP 3xx response redirects should be automatically followed + + + + + X509CertificateCollection to be sent with request + + + + + Maximum number of automatic redirects to follow if FollowRedirects is true + + + + + Determine whether or not the "default credentials" (e.g. the user account under which the current process is running) + will be sent along to the server. + + + + + HTTP headers to be sent with request + + + + + HTTP parameters (QueryString or Form values) to be sent with request + + + + + HTTP cookies to be sent with request + + + + + Request body to be sent with request + + + + + Content type of the request body. + + + + + An alternative to RequestBody, for when the caller already has the byte array. + + + + + URL to call for this request + + + + + Flag to send authorisation header with the HttpWebRequest + + + + + Proxy info to be sent with request + + + + + Representation of an HTTP cookie + + + + + Comment of the cookie + + + + + Comment of the cookie + + + + + Indicates whether the cookie should be discarded at the end of the session + + + + + Domain of the cookie + + + + + Indicates whether the cookie is expired + + + + + Date and time that the cookie expires + + + + + Indicates that this cookie should only be accessed by the server + + + + + Name of the cookie + + + + + Path of the cookie + + + + + Port of the cookie + + + + + Indicates that the cookie should only be sent over secure channels + + + + + Date and time the cookie was created + + + + + Value of the cookie + + + + + Version of the cookie + + + + + Container for HTTP file + + + + + The length of data to be sent + + + + + Provides raw data for file + + + + + Name of the file to use when uploading + + + + + MIME content type of file + + + + + Name of the parameter + + + + + Representation of an HTTP header + + + + + Name of the header + + + + + Value of the header + + + + + Representation of an HTTP parameter (QueryString or Form value) + + + + + Name of the parameter + + + + + Value of the parameter + + + + + HTTP response data + + + + + HTTP response data + + + + + MIME content type of response + + + + + Length in bytes of the response content + + + + + Encoding of the response content + + + + + String representation of response content + + + + + HTTP response status code + + + + + Description of HTTP status returned + + + + + Response content + + + + + The URL that actually responded to the content (different from request if redirected) + + + + + HttpWebResponse.Server + + + + + Headers returned by server with the response + + + + + Cookies returned by server with the response + + + + + Status of the request. Will return Error for transport errors. + HTTP errors will still return ResponseStatus.Completed, check StatusCode instead + + + + + Transport or other non-HTTP error generated while attempting request + + + + + Exception thrown when error is encountered. + + + + + Default constructor + + + + + MIME content type of response + + + + + Length in bytes of the response content + + + + + Encoding of the response content + + + + + Lazy-loaded string representation of response content + + + + + HTTP response status code + + + + + Description of HTTP status returned + + + + + Response content + + + + + The URL that actually responded to the content (different from request if redirected) + + + + + HttpWebResponse.Server + + + + + Headers returned by server with the response + + + + + Cookies returned by server with the response + + + + + Status of the request. Will return Error for transport errors. + HTTP errors will still return ResponseStatus.Completed, check StatusCode instead + + + + + Transport or other non-HTTP error generated while attempting request + + + + + Exception thrown when error is encountered. + + + + + + + + + + + + + + + + + + + + + + + + Executes a GET-style request and callback asynchronously, authenticating if needed + + Request to be executed + Callback function to be executed upon completion providing access to the async handle. + The HTTP method to execute + + + + Executes a POST-style request and callback asynchronously, authenticating if needed + + Request to be executed + Callback function to be executed upon completion providing access to the async handle. + The HTTP method to execute + + + + Executes a GET-style request and callback asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + Callback function to be executed upon completion + The HTTP method to execute + + + + Executes a GET-style request and callback asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + Callback function to be executed upon completion + The HTTP method to execute + + + + Executes the request and callback asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + The cancellation token + + + + Executes the request asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + + + + Executes a GET-style request asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + + + + Executes a GET-style request asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + The cancellation token + + + + Executes a POST-style request asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + + + + Executes a POST-style request asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + The cancellation token + + + + Executes the request and callback asynchronously, authenticating if needed + + Request to be executed + The cancellation token + + + + Executes the request asynchronously, authenticating if needed + + Request to be executed + + + + Executes a GET-style asynchronously, authenticating if needed + + Request to be executed + + + + Executes a GET-style asynchronously, authenticating if needed + + Request to be executed + The cancellation token + + + + Executes a POST-style asynchronously, authenticating if needed + + Request to be executed + + + + Executes a POST-style asynchronously, authenticating if needed + + Request to be executed + The cancellation token + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + X509CertificateCollection to be sent with request + + + + + Adds a file to the Files collection to be included with a POST or PUT request + (other methods do not support file uploads). + + The parameter name to use in the request + Full path to file to upload + This request + + + + Adds the bytes to the Files collection with the specified file name + + The parameter name to use in the request + The file data + The file name to use for the uploaded file + This request + + + + Adds the bytes to the Files collection with the specified file name and content type + + The parameter name to use in the request + The file data + The file name to use for the uploaded file + The MIME type of the file to upload + This request + + + + Serializes obj to format specified by RequestFormat, but passes xmlNamespace if using the default XmlSerializer + The default format is XML. Change RequestFormat if you wish to use a different serialization format. + + The object to serialize + The XML namespace to use when serializing + This request + + + + Serializes obj to data format specified by RequestFormat and adds it to the request body. + The default format is XML. Change RequestFormat if you wish to use a different serialization format. + + The object to serialize + This request + + + + Serializes obj to JSON format and adds it to the request body. + + The object to serialize + This request + + + + Serializes obj to XML format and adds it to the request body. + + The object to serialize + This request + + + + Serializes obj to format specified by RequestFormat, but passes xmlNamespace if using the default XmlSerializer + Serializes obj to XML format and passes xmlNamespace then adds it to the request body. + + The object to serialize + The XML namespace to use when serializing + This request + + + + Calls AddParameter() for all public, readable properties specified in the includedProperties list + + + request.AddObject(product, "ProductId", "Price", ...); + + The object with properties to add as parameters + The names of the properties to include + This request + + + + Calls AddParameter() for all public, readable properties of obj + + The object with properties to add as parameters + This request + + + + Add the parameter to the request + + Parameter to add + + + + + Adds a HTTP parameter to the request (QueryString for GET, DELETE, OPTIONS and HEAD; Encoded form for POST and PUT) + + Name of the parameter + Value of the parameter + This request + + + + Adds a parameter to the request. There are five types of parameters: + - GetOrPost: Either a QueryString value or encoded form value based on method + - HttpHeader: Adds the name/value pair to the HTTP request's Headers collection + - UrlSegment: Inserted into URL if there is a matching url token e.g. {AccountId} + - Cookie: Adds the name/value pair to the HTTP request's Cookies collection + - RequestBody: Used by AddBody() (not recommended to use directly) + + Name of the parameter + Value of the parameter + The type of parameter to add + This request + + + + Shortcut to AddParameter(name, value, HttpHeader) overload + + Name of the header to add + Value of the header to add + + + + + Shortcut to AddParameter(name, value, Cookie) overload + + Name of the cookie to add + Value of the cookie to add + + + + + Shortcut to AddParameter(name, value, UrlSegment) overload + + Name of the segment to add + Value of the segment to add + + + + + Shortcut to AddParameter(name, value, QueryString) overload + + Name of the parameter to add + Value of the parameter to add + + + + + Always send a multipart/form-data request - even when no Files are present. + + + + + Serializer to use when writing JSON request bodies. Used if RequestFormat is Json. + By default the included JsonSerializer is used (currently using JSON.NET default serialization). + + + + + Serializer to use when writing XML request bodies. Used if RequestFormat is Xml. + By default the included XmlSerializer is used. + + + + + Set this to write response to Stream rather than reading into memory. + + + + + Container of all HTTP parameters to be passed with the request. + See AddParameter() for explanation of the types of parameters that can be passed + + + + + Container of all the files to be uploaded with the request. + + + + + Determines what HTTP method to use for this request. Supported methods: GET, POST, PUT, DELETE, HEAD, OPTIONS + Default is GET + + + + + The Resource URL to make the request against. + Tokens are substituted with UrlSegment parameters and match by name. + Should not include the scheme or domain. Do not include leading slash. + Combined with RestClient.BaseUrl to assemble final URL: + {BaseUrl}/{Resource} (BaseUrl is scheme + domain, e.g. http://example.com) + + + // example for url token replacement + request.Resource = "Products/{ProductId}"; + request.AddParameter("ProductId", 123, ParameterType.UrlSegment); + + + + + Serializer to use when writing XML request bodies. Used if RequestFormat is Xml. + By default XmlSerializer is used. + + + + + Used by the default deserializers to determine where to start deserializing from. + Can be used to skip container or root elements that do not have corresponding deserialzation targets. + + + + + Used by the default deserializers to explicitly set which date format string to use when parsing dates. + + + + + Used by XmlDeserializer. If not specified, XmlDeserializer will flatten response by removing namespaces from element names. + + + + + In general you would not need to set this directly. Used by the NtlmAuthenticator. + + + + + Timeout in milliseconds to be used for the request. This timeout value overrides a timeout set on the RestClient. + + + + + The number of milliseconds before the writing or reading times out. This timeout value overrides a timeout set on the RestClient. + + + + + How many attempts were made to send this Request? + + + This Number is incremented each time the RestClient sends the request. + Useful when using Asynchronous Execution with Callbacks + + + + + Determine whether or not the "default credentials" (e.g. the user account under which the current process is running) + will be sent along to the server. The default is false. + + + + + Container for data sent back from API + + + + + The RestRequest that was made to get this RestResponse + + + Mainly for debugging if ResponseStatus is not OK + + + + + MIME content type of response + + + + + Length in bytes of the response content + + + + + Encoding of the response content + + + + + String representation of response content + + + + + HTTP response status code + + + + + Description of HTTP status returned + + + + + Response content + + + + + The URL that actually responded to the content (different from request if redirected) + + + + + HttpWebResponse.Server + + + + + Cookies returned by server with the response + + + + + Headers returned by server with the response + + + + + Status of the request. Will return Error for transport errors. + HTTP errors will still return ResponseStatus.Completed, check StatusCode instead + + + + + Transport or other non-HTTP error generated while attempting request + + + + + Exceptions thrown during the request, if any. + + Will contain only network transport or framework exceptions thrown during the request. + HTTP protocol errors are handled by RestSharp and will not appear here. + + + + Container for data sent back from API including deserialized data + + Type of data to deserialize to + + + + Deserialized entity data + + + + + Parameter container for REST requests + + + + + Return a human-readable representation of this parameter + + String + + + + Name of the parameter + + + + + Value of the parameter + + + + + Type of the parameter + + + + + Client to translate RestRequests into Http requests and process response result + + + + + Executes the request and callback asynchronously, authenticating if needed + + Request to be executed + Callback function to be executed upon completion providing access to the async handle. + + + + Executes a GET-style request and callback asynchronously, authenticating if needed + + Request to be executed + Callback function to be executed upon completion providing access to the async handle. + The HTTP method to execute + + + + Executes a POST-style request and callback asynchronously, authenticating if needed + + Request to be executed + Callback function to be executed upon completion providing access to the async handle. + The HTTP method to execute + + + + Executes the request and callback asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + Callback function to be executed upon completion + + + + Executes a GET-style request and callback asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + Callback function to be executed upon completion + The HTTP method to execute + + + + Executes a POST-style request and callback asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + Callback function to be executed upon completion + The HTTP method to execute + + + + Executes a GET-style request asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + + + + Executes a GET-style request asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + The cancellation token + + + + Executes a POST-style request asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + + + + Executes a POST-style request asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + The cancellation token + + + + Executes the request asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + + + + Executes the request asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + The cancellation token + + + + Executes the request asynchronously, authenticating if needed + + Request to be executed + + + + Executes a GET-style asynchronously, authenticating if needed + + Request to be executed + + + + Executes a GET-style asynchronously, authenticating if needed + + Request to be executed + The cancellation token + + + + Executes a POST-style asynchronously, authenticating if needed + + Request to be executed + + + + Executes a POST-style asynchronously, authenticating if needed + + Request to be executed + The cancellation token + + + + Executes the request asynchronously, authenticating if needed + + Request to be executed + The cancellation token + + + + Default constructor that registers default content handlers + + + + + Sets the BaseUrl property for requests made by this client instance + + + + + + Sets the BaseUrl property for requests made by this client instance + + + + + + Registers a content handler to process response content + + MIME content type of the response content + Deserializer to use to process content + + + + Remove a content handler for the specified MIME content type + + MIME content type to remove + + + + Remove all content handlers + + + + + Retrieve the handler for the specified MIME content type + + MIME content type to retrieve + IDeserializer instance + + + + Assembles URL to call based on parameters, method and resource + + RestRequest to execute + Assembled System.Uri + + + + Executes the specified request and downloads the response data + + Request to execute + Response data + + + + Executes the request and returns a response, authenticating if needed + + Request to be executed + RestResponse + + + + Executes the specified request and deserializes the response content using the appropriate content handler + + Target deserialization type + Request to execute + RestResponse[[T]] with deserialized data in Data property + + + + Parameters included with every request made with this instance of RestClient + If specified in both client and request, the request wins + + + + + Maximum number of redirects to follow if FollowRedirects is true + + + + + X509CertificateCollection to be sent with request + + + + + Proxy to use for requests made by this client instance. + Passed on to underlying WebRequest if set. + + + + + Default is true. Determine whether or not requests that result in + HTTP status codes of 3xx should follow returned redirect + + + + + The CookieContainer used for requests made by this client instance + + + + + UserAgent to use for requests made by this client instance + + + + + Timeout in milliseconds to use for requests made by this client instance + + + + + The number of milliseconds before the writing or reading times out. + + + + + Whether to invoke async callbacks using the SynchronizationContext.Current captured when invoked + + + + + Authenticator to use for requests made by this client instance + + + + + Combined with Request.Resource to construct URL for request + Should include scheme and domain without trailing slash. + + + client.BaseUrl = new Uri("http://example.com"); + + + + + Executes the request and callback asynchronously, authenticating if needed + + The IRestClient this method extends + Request to be executed + Callback function to be executed upon completion + + + + Executes the request and callback asynchronously, authenticating if needed + + The IRestClient this method extends + Target deserialization type + Request to be executed + Callback function to be executed upon completion providing access to the async handle + + + + Add a parameter to use on every request made with this client instance + + The IRestClient instance + Parameter to add + + + + + Removes a parameter from the default parameters that are used on every request made with this client instance + + The IRestClient instance + The name of the parameter that needs to be removed + + + + + Adds a HTTP parameter (QueryString for GET, DELETE, OPTIONS and HEAD; Encoded form for POST and PUT) + Used on every request made by this client instance + + The IRestClient instance + Name of the parameter + Value of the parameter + This request + + + + Adds a parameter to the request. There are four types of parameters: + - GetOrPost: Either a QueryString value or encoded form value based on method + - HttpHeader: Adds the name/value pair to the HTTP request's Headers collection + - UrlSegment: Inserted into URL if there is a matching url token e.g. {AccountId} + - RequestBody: Used by AddBody() (not recommended to use directly) + + The IRestClient instance + Name of the parameter + Value of the parameter + The type of parameter to add + This request + + + + Shortcut to AddDefaultParameter(name, value, HttpHeader) overload + + The IRestClient instance + Name of the header to add + Value of the header to add + + + + + Shortcut to AddDefaultParameter(name, value, UrlSegment) overload + + The IRestClient instance + Name of the segment to add + Value of the segment to add + + + + + Container for data used to make requests + + + + + Default constructor + + + + + Sets Method property to value of method + + Method to use for this request + + + + Sets Resource property + + Resource to use for this request + + + + Sets Resource and Method properties + + Resource to use for this request + Method to use for this request + + + + Sets Resource property + + Resource to use for this request + + + + Sets Resource and Method properties + + Resource to use for this request + Method to use for this request + + + + Adds a file to the Files collection to be included with a POST or PUT request + (other methods do not support file uploads). + + The parameter name to use in the request + Full path to file to upload + This request + + + + Adds the bytes to the Files collection with the specified file name + + The parameter name to use in the request + The file data + The file name to use for the uploaded file + This request + + + + Adds the bytes to the Files collection with the specified file name and content type + + The parameter name to use in the request + The file data + The file name to use for the uploaded file + The MIME type of the file to upload + This request + + + + Adds the bytes to the Files collection with the specified file name and content type + + The parameter name to use in the request + A function that writes directly to the stream. Should NOT close the stream. + The file name to use for the uploaded file + This request + + + + Adds the bytes to the Files collection with the specified file name and content type + + The parameter name to use in the request + A function that writes directly to the stream. Should NOT close the stream. + The file name to use for the uploaded file + The MIME type of the file to upload + This request + + + + Serializes obj to format specified by RequestFormat, but passes xmlNamespace if using the default XmlSerializer + The default format is XML. Change RequestFormat if you wish to use a different serialization format. + + The object to serialize + The XML namespace to use when serializing + This request + + + + Serializes obj to data format specified by RequestFormat and adds it to the request body. + The default format is XML. Change RequestFormat if you wish to use a different serialization format. + + The object to serialize + This request + + + + Serializes obj to JSON format and adds it to the request body. + + The object to serialize + This request + + + + Serializes obj to XML format and adds it to the request body. + + The object to serialize + This request + + + + Serializes obj to format specified by RequestFormat, but passes xmlNamespace if using the default XmlSerializer + Serializes obj to XML format and passes xmlNamespace then adds it to the request body. + + The object to serialize + The XML namespace to use when serializing + This request + + + + Calls AddParameter() for all public, readable properties specified in the includedProperties list + + + request.AddObject(product, "ProductId", "Price", ...); + + The object with properties to add as parameters + The names of the properties to include + This request + + + + Calls AddParameter() for all public, readable properties of obj + + The object with properties to add as parameters + This request + + + + Add the parameter to the request + + Parameter to add + + + + + Adds a HTTP parameter to the request (QueryString for GET, DELETE, OPTIONS and HEAD; Encoded form for POST and PUT) + + Name of the parameter + Value of the parameter + This request + + + + Adds a parameter to the request. There are four types of parameters: + - GetOrPost: Either a QueryString value or encoded form value based on method + - HttpHeader: Adds the name/value pair to the HTTP request's Headers collection + - UrlSegment: Inserted into URL if there is a matching url token e.g. {AccountId} + - RequestBody: Used by AddBody() (not recommended to use directly) + + Name of the parameter + Value of the parameter + The type of parameter to add + This request + + + + Shortcut to AddParameter(name, value, HttpHeader) overload + + Name of the header to add + Value of the header to add + + + + + Shortcut to AddParameter(name, value, Cookie) overload + + Name of the cookie to add + Value of the cookie to add + + + + + Shortcut to AddParameter(name, value, UrlSegment) overload + + Name of the segment to add + Value of the segment to add + + + + + Shortcut to AddParameter(name, value, QueryString) overload + + Name of the parameter to add + Value of the parameter to add + + + + + Internal Method so that RestClient can increase the number of attempts + + + + + Always send a multipart/form-data request - even when no Files are present. + + + + + Serializer to use when writing JSON request bodies. Used if RequestFormat is Json. + By default the included JsonSerializer is used (currently using JSON.NET default serialization). + + + + + Serializer to use when writing XML request bodies. Used if RequestFormat is Xml. + By default the included XmlSerializer is used. + + + + + Set this to write response to Stream rather than reading into memory. + + + + + Determine whether or not the "default credentials" (e.g. the user account under which the current process is running) + will be sent along to the server. The default is false. + + + + + Container of all HTTP parameters to be passed with the request. + See AddParameter() for explanation of the types of parameters that can be passed + + + + + Container of all the files to be uploaded with the request. + + + + + Determines what HTTP method to use for this request. Supported methods: GET, POST, PUT, DELETE, HEAD, OPTIONS + Default is GET + + + + + The Resource URL to make the request against. + Tokens are substituted with UrlSegment parameters and match by name. + Should not include the scheme or domain. Do not include leading slash. + Combined with RestClient.BaseUrl to assemble final URL: + {BaseUrl}/{Resource} (BaseUrl is scheme + domain, e.g. http://example.com) + + + // example for url token replacement + request.Resource = "Products/{ProductId}"; + request.AddParameter("ProductId", 123, ParameterType.UrlSegment); + + + + + Serializer to use when writing XML request bodies. Used if RequestFormat is Xml. + By default XmlSerializer is used. + + + + + Used by the default deserializers to determine where to start deserializing from. + Can be used to skip container or root elements that do not have corresponding deserialzation targets. + + + + + A function to run prior to deserializing starting (e.g. change settings if error encountered) + + + + + Used by the default deserializers to explicitly set which date format string to use when parsing dates. + + + + + Used by XmlDeserializer. If not specified, XmlDeserializer will flatten response by removing namespaces from element names. + + + + + In general you would not need to set this directly. Used by the NtlmAuthenticator. + + + + + Gets or sets a user-defined state object that contains information about a request and which can be later + retrieved when the request completes. + + + + + Timeout in milliseconds to be used for the request. This timeout value overrides a timeout set on the RestClient. + + + + + The number of milliseconds before the writing or reading times out. This timeout value overrides a timeout set on the RestClient. + + + + + How many attempts were made to send this Request? + + + This Number is incremented each time the RestClient sends the request. + Useful when using Asynchronous Execution with Callbacks + + + + + Base class for common properties shared by RestResponse and RestResponse[[T]] + + + + + Default constructor + + + + + The RestRequest that was made to get this RestResponse + + + Mainly for debugging if ResponseStatus is not OK + + + + + MIME content type of response + + + + + Length in bytes of the response content + + + + + Encoding of the response content + + + + + String representation of response content + + + + + HTTP response status code + + + + + Description of HTTP status returned + + + + + Response content + + + + + The URL that actually responded to the content (different from request if redirected) + + + + + HttpWebResponse.Server + + + + + Cookies returned by server with the response + + + + + Headers returned by server with the response + + + + + Status of the request. Will return Error for transport errors. + HTTP errors will still return ResponseStatus.Completed, check StatusCode instead + + + + + Transport or other non-HTTP error generated while attempting request + + + + + The exception thrown during the request, if any + + + + + Container for data sent back from API including deserialized data + + Type of data to deserialize to + + + + Deserialized entity data + + + + + Container for data sent back from API + + + + + Comment of the cookie + + + + + Comment of the cookie + + + + + Indicates whether the cookie should be discarded at the end of the session + + + + + Domain of the cookie + + + + + Indicates whether the cookie is expired + + + + + Date and time that the cookie expires + + + + + Indicates that this cookie should only be accessed by the server + + + + + Name of the cookie + + + + + Path of the cookie + + + + + Port of the cookie + + + + + Indicates that the cookie should only be sent over secure channels + + + + + Date and time the cookie was created + + + + + Value of the cookie + + + + + Version of the cookie + + + + + Wrapper for System.Xml.Serialization.XmlSerializer. + + + + + Default constructor, does not specify namespace + + + + + Specify the namespaced to be used when serializing + + XML namespace + + + + Serialize the object as XML + + Object to serialize + XML as string + + + + Name of the root element to use when serializing + + + + + XML namespace to use when serializing + + + + + Format string to use when serializing dates + + + + + Content type for serialized content + + + + + Encoding for serialized content + + + + + Need to subclass StringWriter in order to override Encoding + + + + + Default JSON serializer for request bodies + Doesn't currently use the SerializeAs attribute, defers to Newtonsoft's attributes + + + + + Default serializer + + + + + Serialize the object as JSON + + Object to serialize + JSON as String + + + + Unused for JSON Serialization + + + + + Unused for JSON Serialization + + + + + Unused for JSON Serialization + + + + + Content type for serialized content + + + + + Allows control how class and property names and values are serialized by XmlSerializer + Currently not supported with the JsonSerializer + When specified at the property level the class-level specification is overridden + + + + + Called by the attribute when NameStyle is speficied + + The string to transform + String + + + + The name to use for the serialized element + + + + + Sets the value to be serialized as an Attribute instead of an Element + + + + + The culture to use when serializing + + + + + Transforms the casing of the name based on the selected value. + + + + + The order to serialize the element. Default is int.MaxValue. + + + + + Options for transforming casing of element names + + + + + Default XML Serializer + + + + + Default constructor, does not specify namespace + + + + + Specify the namespaced to be used when serializing + + XML namespace + + + + Serialize the object as XML + + Object to serialize + XML as string + + + + Determines if a given object is numeric in any way + (can be integer, double, null, etc). + + + + + Name of the root element to use when serializing + + + + + XML namespace to use when serializing + + + + + Format string to use when serializing dates + + + + + Content type for serialized content + + + + + Helper methods for validating required values + + + + + Require a parameter to not be null + + Name of the parameter + Value of the parameter + + + + Represents the json array. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The capacity of the json array. + + + + The json representation of the array. + + The json representation of the array. + + + + Represents the json object. + + + + + The internal member dictionary. + + + + + Initializes a new instance of . + + + + + Initializes a new instance of . + + The implementation to use when comparing keys, or null to use the default for the type of the key. + + + + Adds the specified key. + + The key. + The value. + + + + Determines whether the specified key contains key. + + The key. + + true if the specified key contains key; otherwise, false. + + + + + Removes the specified key. + + The key. + + + + + Tries the get value. + + The key. + The value. + + + + + Adds the specified item. + + The item. + + + + Clears this instance. + + + + + Determines whether [contains] [the specified item]. + + The item. + + true if [contains] [the specified item]; otherwise, false. + + + + + Copies to. + + The array. + Index of the array. + + + + Removes the specified item. + + The item. + + + + + Gets the enumerator. + + + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + + + + Returns a json that represents the current . + + + A json that represents the current . + + + + + Gets the at the specified index. + + + + + + Gets the keys. + + The keys. + + + + Gets the values. + + The values. + + + + Gets or sets the with the specified key. + + + + + + Gets the count. + + The count. + + + + Gets a value indicating whether this instance is read only. + + + true if this instance is read only; otherwise, false. + + + + + This class encodes and decodes JSON strings. + Spec. details, see http://www.json.org/ + + JSON uses Arrays and Objects. These correspond here to the datatypes JsonArray(IList<object>) and JsonObject(IDictionary<string,object>). + All numbers are parsed to doubles. + + + + + Parses the string json into a value + + A JSON string. + An IList<object>, a IDictionary<string,object>, a double, a string, null, true, or false + + + + Try parsing the json string into a value. + + + A JSON string. + + + The object. + + + Returns true if successfull otherwise false. + + + + + Converts a IDictionary<string,object> / IList<object> object into a JSON string + + A IDictionary<string,object> / IList<object> + Serializer strategy to use + A JSON encoded string, or null if object 'json' is not serializable + + + + Determines if a given object is numeric in any way + (can be integer, double, null, etc). + + + + + Helper methods for validating values + + + + + Validate an integer value is between the specified values (exclusive of min/max) + + Value to validate + Exclusive minimum value + Exclusive maximum value + + + + Validate a string length + + String to be validated + Maximum length of the string + + + diff --git a/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Hardware.Interfaces.Ports.PortCore.xml b/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Hardware.Interfaces.Ports.PortCore.xml new file mode 100644 index 00000000..31aa9063 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Hardware.Interfaces.Ports.PortCore.xml @@ -0,0 +1,223 @@ + + + + Xylem.Common.Hardware.Interfaces.Ports.PortCore + + + + + + + + Marker for incoming record at time of the PC + + + + + + + + + + + + + + + + + + + + + + + Interface for port data event arguments + + + + + Read data + + + + + + Write data + + + + + + Reading received time + + + + + + Writing received time + + + + + + Setting the data marker + + + + + + Getting the data marker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Interface for Ports + + + + + event for record received, either bytes or string + + + + + event for record received, either bytes or string + + + + + set specific mark + and flush or delete all incoming byte from buffer when SyncMarkRecord is or + + + + + + + if the port needs stuff to open, always open for better logical handling + + + + + close and dispose all connections + + + + + indicates if the Port is open (also on Ports that did not have an open state) + + + + + + Write byte[] to the Stream/Port on Child Class + wrapped with base class error handling + + Array of bytes to write + + + + discard all buffers + + + + + Return the port name + + name of the port as string + + + + Store Port settings set most likely from transmit protocol + + + + + The transmission protocol needs to inform the communication port how to setup, + this is the data container. + + + + + + + + + + + + start of receiving synchronization byte at byte receive routine + syncByte == null: use the readLine routine (ASCII) and NOT the BYTE routine, + lengthPosition and additionalLength are not used + + + + + position of length information field in received BYTE record + lengthIndex == null: take the constant receive length of additionalLength + because the record doesn't contain length information + + + + + additional record length NOT covert by the record length information field + lengthIndex == null: constant length for received record + Being used for the BYTE records indicated by a valid syncByte, + not being used for ASCII records. + + + + + Response time out in milliseconds + + + + + BaudRate for Port + + + + + lower threshold for buffer flushing if dataMarker != SkipDecoding + receiveBufferFlushThreshold == null: never flush the communication buffer + receiveBufferFlushThreshold == 0: flush always the communication buffer + receiveBufferFlushThreshold == x: flush communication buffer if it exceeds x Byte + waste old records if an up-to-date record is being needed for start/stop synchronization + of a measurement. This is the level at which the old data have to be flushed because the + data have been dammed up in the communication port input buffer which means they are to + old for synchronization purposes. + /// + + + + a special implementation may require the doubling of the sync byte to re-synchronize + + + + diff --git a/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.Applications.dll.config b/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.Applications.dll.config new file mode 100644 index 00000000..e936cc13 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.Applications.dll.config @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.xml b/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.xml new file mode 100644 index 00000000..76a62c82 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.xml @@ -0,0 +1,205 @@ + + + + Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages + + + + + + abstract for set structure for BaseDataEventArgs + + + + + 'Base' get event record form real child. + + + + + + get real Event record + + + + + + Holds the record before decoding, for logging + + + + + + + + Stream record for calibration on channel + + + + + + + + + + + new record from Stream + + + + + + + + + + + + Ctor with base record + + base record + base record + + + + Register witch has updated + + + + + New Value in Register + + + + + + EventArgs for Request Responses + + + + + Request response from meter + + + + + + + + + hold streaming record for protocol H (contains calibration record) + + + + + record validation + + + + + total time of flight in seconds + + + + + delta time of flight in seconds + + + + + total time of flight in cordonel units + + + + + delta time of flight in cordonel units + + + + + volume scale (default: 1024) means + 1024digits = 1ml + + + + + volume factor to convert raw to m³ + uses 1E-6 (ml to m³) / VolumeScaleRawPerMl + + + + + raw volume between two samples + + + + + calculated out of dRawVolume * VolumeFactorRawToQm . + in cubic meters + + + + + accumulated raw volume + + + + + sample interval between two samples in seconds + + + + + high threshold amplitude in V + + + + + low threshold amplitude in V + + + + + high ratio for pulse width + + + + + low ratio for pulse width + + + + + raw temperature + + + + + temperature scale + + + + + calculated temperature in degree C + + + + + Get result as string + + + + + + + struct to hold Led record for protocol F (contains measurement record) + + + + + Get result as string + + + + + diff --git a/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.dll.config b/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.dll.config new file mode 100644 index 00000000..e936cc13 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.dll.config @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.xml b/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.xml new file mode 100644 index 00000000..89e81e45 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.xml @@ -0,0 +1,1082 @@ + + + + Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore + + + + + Streaming modes that supported by genesis meter. + Set meter to this Streaming mode means that , the meter pushes mode-specific record to port without any responses + + + + + Test mode with raw record to log. Should give one + 3 times and repeat this till led mode is switch + + + + + Test mode should give out + + + + + Calibration mode should give out + + + + + Deactivate streaming + + + + + not set or an new not supported Streaming mode + + + + + + Genesis meter, main class for all action that occurs on production life of meter + one meter always have a linked port for UART communication and one for LED (even if you don't need them) + it´s has to be open for vb6 COM so don't use any record types or objects that vb6 didn't understand or + interprets differently than dotNet + + + + Default constructor. + + R.Drabesch, 2018-Feb-16. + + + + Transmit protocol access for underlie objects to change response timeout + + + + + + Slot number for test-bench + for request Port + for streaming Port + don´t send CRC error or telegrams with error flag to caller + + If you have a password for highest access level you need, if you don't want to access the meter + (just read led record) than you can leave it null + + + + + Keep up the highest access level for all function in where used + + + + + Logout with level 0 + + + + + + Property is redundant because is also stored in + but never less is + is the identification of the meter it has a separate Property + + + + + + Save Slot Number (position at test-bench) for logging purposes + + + + + Represent + proposed for login + + + + + + + + Add on ctor a password and it will be used for login in if no other password is set + + + + + default false only enabled by + when it is true, the meter will enforce the login when session is gone or access is denied + + + + + Enable raw record logging, if set every incoming package will be logged + + + + + Enable use of registers that are not valid (last version not match the current app) + + + + + All parameter store in this Genesis is up in here + if you want to read them from meter use + if you want to set them to meter use + + + + + All applications defined by configuration.json + + + + + request port assignment/info + + + + + request protocol assignment/info + + + + + streaming port assignment/info + + + + + streaming protocol assignment/info + + + + + Response received after request for record + + + + + + + + Returns meter registers + + + + + + + + + do not use it to set ProcessStatus + if you want to change ProcessStatus of this genesis use + is just store for some routines + + + + + if state is change + + will be invoked. + on some states other events will be invoke as well + + + + do not use it to set ErrorStatus + if you want to change ErrorStatus of this genesis use + is just store for some routines + + + + + fires up + + + + + Logged in to device + + + + + Hold the current process name e.g. FlowTest, Preadjustemtn for logging + + + + + + + + Setup water meter from configuration file: + -slot, + -streaming protocol, + -streaming port + -request port + + + + + + + + + + just internal setup. called on ctor or from vb6 setup function + + Slot Number for test-bench + for RFID/UART/IrDA Port + for LED Port + don´t send CRC error or telegrams with error flag to caller + + If you have a password for highest access level you need, if you don't want to access the meter + (just read led record) than you can leave it nullS + + + + + + Start Event listening, has to be called after + + + + + Add a port to working queue + + On should one once added in runtime + + + + + Synchronization of the record for the streaming interface + + + + + + + + + + + + + + + + + + + + + + + + + + + + call this if session is expired and you need an re-authorization + + + + + A helper to invoke events only if someone is listening, otherwise nothing will happen + + Event handler to call + Sender (can be null) + Event arguments (can be null) + + + + Track all incoming led record packages (Calibration and Flow) + + + + I should be or + otherwise this method does nothing + + + + + tracking request record processing + + + + + + + QueryCaps can send before login + arrange record for communication (e.g. Baud rate) + + + Running outgoing command + + + + + The backup login level is needed for re-authorization + + + + + SetRegister to loginLvl and wait for response + + + true = process command; false = add command to list. call + to process login command + if is completed and no error occurred it is true + + + + Set + + if null , use password from initialization + true = process command; false = add command to list. call + to process login command + + + + + + Login with identical password as last time + + + + - Initial + + + + + + Get password from server + + + + + + Starting a timer to keep session active, + starting the . + + password string to login + + + + + Starting a timer to keep session active, + starting the . + + password string to login + true = process command; false = add command to list. call + to process login command + + + pass runImmediately for auto login + + + - Avoid retries during login, a retry will lock the Genesis for 2s, 4s, 8s, 16s and so on. + + + + + Building the FW Version string out of 2 bytes of data. + REASON: FLEXNETVERSION is one application which does not follow the same rule of + decimal numbers. Instead it uses hexadecimal digits. After the conversion of this + number to a pure Uint32, needed for comparison of file versions in configuration.json, + the hexadecimal outline will be lost and the comparison with the rowproduct.txt fails. + FW-update needs this information to validate a tested package! + + most significant byte + last significant byte + converted "msb.lsb" as string e.g. "12.34" or "2.0C" + + + + List of all present meter applications + + + + + Core revision of boot code. + + + + + Metrology upgrade permission. + + + + + Reading all applications which can be found in the configuration.json and have been stored + to the meter register dictionary in advance. + The read process covers the FW version and the CRC. + After reading the version, all valid registers are going to be selected. + + + - Removed "Cordonel " from CoreRevision to have the e.g. "1.64" remaining + + + + + Automatic login to meter enabled if logged out by lost authentication + + + + + If the timeout timer elapsed to keep the session active, this routine will be called + awaking the . + + + + + + + Thread to keep the connection to the meter open and the session alive, + because on missing communication the meter is going to logout automatically. + This thread will be started at and aborted on + + + + + + + + + Check if EMPTY_PIPE or REBOOT is set + + + + + + Check if alarmToCheck is set on register + + is Flags so you can use more than one alarms (like Alarm.EMPTY_PIPE | Alarm.REBOOT) + + + + + Read out all AlarmStatus register and combine them to one + + + + + + Reset the empty pipe alarm + + + + + Reads the PCB Identification, can be accessed at all login levels, + Read Privilege is always needed to BUGFIX read access to PCB ID + + PCB ID + + + + Get the actual register dictionary + + + + + + Serial number of meter married with PcbId + + + + + + + + + Event to Sync Register on MeterSide and + Fired on Write or read register + + + Register to update with value to update + + + + Write Register, optional: wait for result and validate, + write register will ALWAYS log the data DON'T use for password write + + Data type of Register + Register to change + Value to save + wait until result is ready + check the content of the register by read back + skip retries on this error code return + true on successful operation + + + + Read Register and return byte array + + + expected length for response + skip retries on this error code return + + + + + - Removed throw because the throw always kicks in to + the FW-Update process causing an unpredictable stop! + + + + + Clear Ports + + + + + + + + + + + + + + + + + + + + + + + Logging of register write processes to meter + ATTENTION: DON'T USE FOR PASSWORDS! + + + + + + + Storage of calibration values + + + + + + + + Calibration factors for all channels + + + + + Registers needed to store the calibration for the individual channel + + + + + + + + + + + + Just stop recording without calculation + + + + + + + + + + + + + + List of ongoing measurements, base- and calibration-measurements + + + + + All channels required to process + + + + + + Perpetration of Measurement + SampleRate 10 and Led mode Test + + + + + + + + + + + Testing the flow direction + + + + + + + the first measurement is ALWAYS a FlowTestRecord due to the underlying routine logic. + + + + + The first measurement is ALWAYS a FlowTestRecord. + + + + + + + + + + + Calibration content + + + + + has been calibrated + + + + + Channel for calibration + + + + + Register to store the calibration + + + + + Ctor for calibration factor + + + + + + + set the user readable relative (around 1.0) calibration factor + and convert it to the raw calibration factor for the meter + + + + + + + Read the relative (around 1.0) calibration factor calculated from the actual + meter calibration factor divided by the default calibration factor + + + + + + Genesis internal raw default value (around 15625) + + + + + + Set the meter raw calibration factor (around 15625) + + + + + + Get the meter raw calibration factor (around 15625) + + + + + + Port scanner: + using the Windows Device Manager listed ports, + tries to open the port with an exception if it cannot be accessed (very time consuming), + tries to use the request protocol to detect a Genesis device. + + + + + Genesis for test access + + + + + Auto detected port name + + + + + Port scan result event for message dispatcher to caller + + + + + Stop the port scan + + + + + Number of ports + + + + + Actual Port Counter + + + + + Returns the port scan state + + + + - Initial + + + + + Ctor + + true if one port has been validated + + - Initial + + type of communication port to meter like IrDA + + + + + - Initial. + + + + + Use initially the port configuration to speed up search, + If configuration file contains wrong port setup than scan all serial ports listed in + the windows device manager, + Read available ports, + Try to open port and connect to Genesis meter. + + slot to search for + configuration of port to speed up search + true if port found + true if one port has been validated + + - Initial + + + - Port type from Ctor, + - Event message changed: + - Overall message: ctr / counts - ongoing scan, + - Actual message: Information to log + + + - Changed exit of function, + - Added configuration file handling. + + + + + JSON filer reader for generation of register lists + + + + + Registers defined in configuration.json file + + + + + Applications defined in configuration.json file + + + + + Ctor + + the file path for configuration.json as interface description to the meter + + + + Convert file content to register list + + + + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to Compare register. + + + + + Looks up a localized string similar to Access request.. + + + + + Looks up a localized string similar to Failed to open.. + + + + + Looks up a localized string similar to Ports listed in the Windows device manager.. + + + + + Looks up a localized string similar to Automatic port scan started.. + + + + + Looks up a localized string similar to Successfully accessed.. + + + + + Looks up a localized string similar to Read register. + + + + + Looks up a localized string similar to Reading registers after update. + + + + + Looks up a localized string similar to Reading registers before update. + + + + + Looks up a localized string similar to Cordonel not detected!. + + + + + Looks up a localized string similar to Scan port. + + + + + Looks up a localized string similar to Write register. + + + + + Read, compare and restore if unequal al registers marked with + equals + ". + The reader will use the byte values as they are unmodified and + will not be rounded and therefor possibly fail the comparison. + For logging the register value will be converted its unit. + + + + + PCB ID for pre update for comparison + + + + + PCB ID for post update for comparison + + + + + Register content before update + + + + + Register content after update + + + + + Register access event for message dispatcher to caller + + + + + Actual Port Counter + + + + + Stop register access + + + + + Genesis meter object + + + + + Extraction of registers names needed to restore after FW-Update + + + + + Extraction of registers names needed to log + + + + + Ctor + + + + + + Assign new genesis after reboot and keep the RegisterRestorer object. + + + + - Initial + + + + + Avoid doubling of register restore on subsequent FW-Update trials. + + true if registers already backed up + + - Initial. + + + + + Avoid doubling of register backup on subsequent FW-Update trials. + + true if registers already backed up + + - Initial. + + + - Extended checks for Genesis is assigned and PCB ID is identical. + + + + + Restore all registers which can be restored and finalize with "safe configuration process". + + true if restoring succeeded + + - Initial. + + + + + Compare all registers which can be restored. + + true if equal + + - Initial. + + + + + Read the registers after the update for comparision. Build the post update registers here, + because an update may have changed the registers (new or removed registers). + + true if registers could be read + + - Initial. + + + - Build here the post update registers, they may have changed due to update! + + + - Clear pre update registers if post indicates a different PCB ID to avoid wrong overwriting of + registers to non matching new meter. + + + + + Get DEFINED registers from GenesisMeter class and read all + registers which are flagged with read write (RW) or read only (RO). + Build a list of all registers being able to restore referenced by name, + flagged with + equals ". + The defined registers are based on the "configuration.json" and + the installed application with a specific version. + + true if registers could be read + + - Initial. + + + - Stored registers before and after update. + + + - Extended register check. + + + - Removed after update registers and moved them to PostUpdateReadRegisters. They may have changed + during the update. + + + - Deny register pre update if _pcbIdPreUpdate indicates, that this has been already processed. + + + + + Register read loop. + All registers needed to be read with from the Genesis meter as they are only + prepared as template and NOT filled with the register data! + The uses the overall process text and value for user information process + bar and text and the actual process text for logging to the report file! + + registers to read + list of registers to read + true if registers could be read + + - Initial. + + + - Set value to actual process message. + + + - Added PCB ID to logging. + + + - Removed PCB ID from logging. + + + + diff --git a/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile.dll.config b/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile.dll.config new file mode 100644 index 00000000..e936cc13 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile.dll.config @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.xml b/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.xml new file mode 100644 index 00000000..1782ca8d --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.xml @@ -0,0 +1,618 @@ + + + + Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol + + + + + Commands that the genesis meter support over the request protocol. + Functional Specification Breeze Core and Applications Revision:3.03(12748DOC11 - functional spec ICOE472.pdf) + + + + + 9.2.5 + Command 0x00 (NOP) + This command will do nothing, and will have no response. + + + + + 9.2.6 + Command 0x01 (Query capabilities) + This command will be used by the external computer to discover the protocol parameters that may be varied. + These can then be compared with the external computer’s capabilities and the best match selected. + + + + + response on + + + + + 9.2.7 + Command 0x03 (Set capabilities) + Used to finalize the baud rate and packet settings after negotiation. + The reply will be sent at the currently selected baud rate and packet length, + after which the settings will take effect + + + + + response on + + + + + 9.2.8 + Command 0x05 (Train) + This command will perform target driven data training, that is, where the target is in control of the data flow. + See also command 0x11. + + + + + response on + + + + + 9.2.9 + Command 0x07 (Repeat last) + Used by the external computer to request the last response to be resent, for example if it was found to be corrupted. + Note that the response 0x08 will never be sent, the reply to command 0x07 will be a verbatim resend of the last response. + + + + + response on + + + + + 9.2.10 + Command 0x09 (Read data) + This command makes reads of any random selection of configuration registers, up to the maximum packet size negotiated. + + + + + response on + + + + + 9.2.11 + Command 0x0B (Write data) + This command makes writes to any random selection of configuration registers, up to the maximum packet size negotiated. + + + + + response on + + + + + 9.2.12 + Command 0x0D (Multiple read data) + This command makes reads of one register multiple times, which will be more efficient than performing successive reads using command 0x09. + This command will be available from protocol version 0.40, for earlier protocol versions command 0x09 should be used. + + + + + response on + + + + + 9.2.13 + Command 0x0F (Multiple write data) + This command makes writes to one register multiple times, which will be more efficient than performing successive reads using command 0x0B. + This command will be available from protocol version 0.40, for earlier protocol versions command 0x0B should be used. + + + + + response on + + + + + 9.2.14 + Command 0x11 (Set level) + This command will perform external driven data training, that is, where the external computer is in control of the data flow. + This command will be available from protocol version 0.42, for earlier protocol versions command 0x05 should be used. + + + + + response on + + + + + Config Exchange error codes. + + + + + Transport errors for request protocol + + + + + List of constance for error codes from genesis meter + + + + + everything is fine + + + + + Port is not open + + + + + fails to write to serial port + + + + + fails to read from serial port + + + + + Command is to long + + + + + deeper exception, check out log if this happen + + + + + wrong CRC + + + + + something strange + + + + + Timeout occur + + + + + Acknowledge feedback from meter after communication + + + + + Response missing + + + + + Response command not match the required command + + + + + Lost connection (logged out from meter), a re-authorization is required + to access this command and/or register + + + + + Meter error received, a retry may be useful + + + + + The response record couldn't be decoded + + + + + Valid meter response record + + + + + Holds all errors can occur on the request protocol + + + + + Exception occurred on this command + + + + + Exception occurred while receiving this data + + + + + Error is interpreted and has a define error code + if its not null is Genesis.Protocols.Request.Const.ConfigExErrors + + + + + Error is interpreted and has a define error code + if its not null is Genesis.Protocols.Request.Const.HighLevelError + + + + + Ctor with only message + + error message + + + + Ctor with message and + + error message + + + + + Ctor with message, and + + error message + + + + + + Holds request commands with detail parameters to see processing state + + + + + Indicates the base command + + + + + Indicates the base command + + + + + the register the command refers to. + needed to set Register dictionary to link response with dictionary key + + + + + Command acknowledged + + + + + Retry counter + + + + + Wakeup-message retry counter + + + + + indicates error base on + + + + + indicates error reason on + + + + + Combined error code of base and reason + + + + + Chunk position of error on multiple read/write access + + + + + Data containing the request protocol + + + + + Encoded with transmit protocol, ready to stream to port as is + + + + + Extracted payload of response + + + + + Extracted payload of response + + + + + avoid logging for e.g. password + + + + + error mask to skip retries for functional errors + + + + + Ctor for an base command + + as an byte + Request protocol data for logging + Ready to send data encoded with transmit protocol retries + Timeout for response + to do command with + hiding data in log file to avoid spying of passwords + error mask to skip retries + + + + + if session is gone and a re authorization is necessary + + + + + + Ctor + + this command will be resend after authorization + + + + Command to resend + + + + + a bidirectional protocol support read and write genesis meter registers + needed for + + + + + FIFO of records to be send next + + + + + This is the actual record in the send loop + + + + + Last communication time for session refresh + + + + + + + + + + + Occurs when a meter Response for write password is good + + + + + Event after a register entries changed + + + + + User adjustable additional retry timeout. This is 0 ms for standard operation. + + + + + + + + Process all records needed to be sent, this routine has to be called + to kick-off the communication of all RequestRecords saved to the send + FIFO + + + - Initial + + + - Logging of raw RequestProtocol at time of sending, + - Logging of retries. + + + - Added timeout from transmit protocol. + + + - Added reorder FIFO to bring login at first position + + + - Hide data in logging for e.g. passwords + + + - Retry counter reset if authorization required and this record will be put back into FIFO, + - Retry delay corrected for all errors. + + + - Dynamic retry delay: ResponseTimeoutMs * Retry counter. + + + - Skip retries on specific error mask to speed up communication on functional errors + or informational feed backs (e.g FW not installed 0x0004) + + + + - User adjustable additional retry timeout. + + + - Response timeout message output, + - Initialize acknowledge code before communication to NoResponse. + + + - Response timeout deviated from system time. + + + - Avoid enqueue of _recordInProcess if retry counter is 0. + + + + + Assemble record with transmit protocol and put it to record-send-FIFO, + backup the ready-to-send, which is the dataEncodedWithTransmitProtocol, + to the RequestRecord object for sending including the retry capability. + + Data package with all details like CRC, etc + Command identifier + which is intend + hiding data in log file to avoid spying of passwords + error mask to skip retries + the assembled record for the send FIFO + + - Initial + + + - Logging of raw data (RequestProtocol) moved to ProcessRecordList. + + + - Added timeout from transmit protocol. + + + - Hide data in logging for e.g. passwords + + + - Skip retries on specific error mask to speed up communication on functional errors + or informational feed backs (e.g FW not installed 0x0004) + + + + - Initial skip retry error code set to 0x0004 (e.g FW not installed 0x0004). + + + + + Called after successful response. + Decode and check record, handle Errors and dispatch result. + Invokes if somebody is listening + + + - Initial + + + - First part reworked to extract the response protocol information + + + - Hide data in logging for e.g. passwords + + + - Error code extraction changed for + + + - Wakeup-message will avoid further timeout (during FW update this is in the range + of 15000ms). + - Allow one additional retry on decoding error, which is often the wakeup-message. + + + - Send time reminder for timeout time calculation as output in log-file, + - OnRecordIsDecoded?.Invoke moved before return to assure that the Acknowledge status is set. + + + - Avoid activation of wakeup retry if record is meanwhile acknowledged. + + + + + Method to send basic Commands to Meter. Creates an integer of 4 bytes for the payload. + Supported Commands are: ,, + , and . + Calculate CRCs and Command length and check if command is valid. + Use to push data to Port/Meter. + + + Supported ,, + , and . + + Register to Read or Write, null for + + Data to push into the . + must be null on Read Commands ( ,) + and not null on WriteData ( and ) + + + hiding data in log file to avoid spying of passwords + mask to skip reties on error + an new command just send to port/meter + + - Initial + + + - Reworked to zero pad payload with chunks of 4 bytes, the caller needn't take care of the size + + + - Corrected payload content in request protocol + + + - Hide data in logging for e.g. passwords + + + - Skip retries on specific error mask to speed up communication on functional errors + or informational feed backs (e.g FW not installed 0x0004) + + + + - Multiple read for string split to simple reads. + + + - Default set. + + + + + Analyzes the error code + + + + + Reorders the record list so that first entry is the defined topRegister + + + + + + Checks the active register to access + + + + + + diff --git a/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.xml b/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.xml new file mode 100644 index 00000000..aed76d31 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.xml @@ -0,0 +1,99 @@ + + + + Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol + + + + + + Layer between CRC16CCITT handler and Events + block trashy telegrams + + + + + Decode data and hold results + + + + + + + + + + + + + + Data fields and definitions for GENESIS streaming protocol + + + + + Default data for + + + + + Calibration data + + + + + Constructor initializes all decoded members with default values + + + + + Flow test data + + + + + Decoding the raw message + + message received as one line delimited with LF + true if decoding was successful and data has been validated + + + + Extracting message from string fields for protocol 'f' + + Separated fields containing the measurement as string + + + + + Extracting message from string fields to individual raw channel for protocol 'g' + + Reference to result structure for raw data for one channel + Separated fields containing the measurement as string + true if protocol is valid + + - Usage of VolumeFactorRawToQm and calculation of AccuDutOverflowVolumeCm + + + + + Extracting message from string fields to individual raw channel for protocol 'g' + + Reference to result structure for raw data for one channel + Separated fields containing the measurement as string + true if protocol is valid + + - Usage of VolumeFactorRawToQm and calculation of AccuDutOverflowVolumeCm + + + + field position in protocol 'f' + + + field position in protocol 'g' + + + field position in protocol 'h' + + + diff --git a/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Hardware.WaterMeter.WaterMeterCore.xml b/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Hardware.WaterMeter.WaterMeterCore.xml new file mode 100644 index 00000000..4fad021d --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Hardware.WaterMeter.WaterMeterCore.xml @@ -0,0 +1,563 @@ + + + + Xylem.Common.Hardware.WaterMeter.WaterMeterCore + + + + + Applies an action to a list of meters in a separate thread + + + + + Starts a new task for a list of meters + + + + + + Apply a single action to a specific meter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Common definition for Meter handling in production and on test benches + + + represents any error state a meter can have + if hash code is 0 everything is running + is Flags, so watch out to check with hasFlag! + + + + + everything is good + + + + + problems on initialization + + + + + problems on Measurement + + + + + Problem on communication with meter + + + + + Problem on optical output on meter + + + + + if pulse can not readout + + + + + no (or no good) reference flow available + + + + + Calibration went wrong + + + + + calibration is out of range. Check documentation from meter to find limitation + + + + + blue screen like error + + + + + Can hold various s and hold connection record to relieve the meter. + Every contact with meter has to go over even if you have just only one. + + + + + holds all + Add and delete with + + + + + Remove Meter from batch and clear communication + + meter to be removed + + + + Get meter from slot number. + + + null if slot has no genesis + + + + Remove all Meters and comports + + + + + + + + + + + Detect all meters + + + + + + login to all meters + + + + + Initialize all meters + + + + + Initialize calibration for all meters + + + + + Initialize measurement for all meters + + + + + Store new calculated calibration to all meters + + + + + Start calibration for all meters + + + + + Start measurement for all meters + + + + + Stop calibration of all meters + + + + + Stop measurements of all meters + + + + + Can hold various s and hold connection record to relieve the meter. + Every contact with meter has to go over even if you have only one. + + + + + ctor + + + + + Registered list of meters + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IMeter is the highest level interface between a meter with direct communication to a test bench. + has general things like calibration, measurement and set up routines. + no specific meter stuff in here! + it is always disposable + + + + + occurs when ProcessState has changed + + + + + occurs when ErrorState has changed + + + + + occurs when Init is completed + + + + + occurs when the initialization for Measurement is completed + + + + + occurs when the Measurement is completed + + + + + occurs when the initialization for calibration is completed + + + + + occurs when the calibration is completed + + + + + occurs when meter gets disposed + + + + + unique meter identification + + + + + read-only to see current Process state + + + + + read-only to see current Error state + + + + + the current slot in test-bench + + + + + Setup of intermediate update time for measurement updates and overflow detections, + has to be calculated depending on flow-rate and nominal diameter (DN) + + + + + Open Com ports, try some communication, login + + + + + Setup up meter from config file. just a workaround for vb6 calls. please do not use if your working with .net + + Slot Number for Test bench + don´t send CRC error or telegrams with error flag to caller + + + + Logout from device + + + + + Start Login with password service + + + + + Start Login with out password service and a fixed password + + password for login + + + + set up measurement parameter and set meter into test-mode + + + + + Starting a Measurement + Meter must be initialized + Start to receive record from meter and decode this record into MeasurementRecord + + + + + + Meter must have a active measurement + Stop receive record from meter and decode record + + + + + - simplify the measurement results handling + - getting the main measurement of the entire device (combination of all paths) + - add MeasurementResult + - remove all other methods + + + After a completed measurement , you can grab + + Calculated results + + + + The first measurement is ALWAYS a FlowTestRecord. + + + + + get current state of the running measurement + + leave empty for an aggregate state for all measurements or pass the channel number to check + + + + + set up calibration parameter (calibration factor to default) and set meter into calibration mode + + + + + Starting a Calibration + Meter must be initialized + Start to receive record from meter, decode and store this record + no available + To finish calibration process run + + + + + Meter must have a active for calibration + Stop receive record from meter, decode and store record + record will not calculate or store + + + + + Get current state of the running calibration + + + + + + Calculate calibration factor for static and flying start / stop + Results kept internal and not being saved to meter. + if you want to store them on meter use + + the reference volume is essential for calculation of calibration factor + the reference time is needed for flying start/stop + the required deviation to set the scale apart from 0 + override the default max calibration factor tolerance + + + + Save calculated calibration on meter if no calibration results available an exception occurred + + + + + To control the LCD from meter for status information etc. + + if set to true the meter will show his normal screen, if set to false the next parameter will shown in display + test shown in LCD in byte array as hex value (0x33,0xFF shows 33FF on screen) + + + + Sets Display text and update production database + + New ProductionState + web logging required per default true, for offline usage set to false + + + + Get last Process State + + + + + Add external text to internal log file handling + + text to log + + + + Enable/Disable Raw record Logging + + True = Write Raw record into log/ false = Stop write raw record into log + + + + Check if the meter has any errors that can occur on a measurement + the error reason has find out in the log files + + false = everything is good, detect at least one error + + + + Clear all object set up on runtime + + + + + Interface for Events + you can use without events (so with out ) + + + + + occurs when ProcessState has changed + + + + + occurs when ErrorState has changed + + + + + occurs when Init is completed + + + + + occurs when the initializations for Measurement is completed + + + + + occurs when the Measurement is completed + + + + + occurs when the initializations for calibration is completed + + + + + occurs when the calibration is completed + + + + diff --git a/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Metrology.Measurements.xml b/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Metrology.Measurements.xml new file mode 100644 index 00000000..083f9298 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Metrology.Measurements.xml @@ -0,0 +1,680 @@ + + + + Xylem.Common.Metrology.Measurements + + + + + + Holds all stuff for calibration of a Genesis Meter + + + + + Record at the start of the measurement + + + + + Record at the end of the measurement + + + + + Backup of intermediate record + + + + + Backup of intermediate record for short term result + This can be used to observe a result (e.g. flow rate) + between two intermediate records. The update time is + set in the ctor by intermediateUpdateTimeS. + + + + + Intermediate record for ongoing measurement + + + + + + + + Holds the accumulated overflow volume, will work only if + is being called cyclically. + The overflow will take place due to the fixed point number format or the + display resolution setting. + + + + + Holds the accumulated overflow time, will work only if + is being called cyclically. + The overflow takes place due to the fixed point number format. + + + + + Logger for debug output of measurement + + + + + Physical slot of the device + + + + + Identification of the channel + + + + + + State machine for one measurement (on one meter and one channel) + + + - add State-machine for better handling + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Set flag for starting Calibration. + The next record is going to set the start values. + + + + + + + + + Holds all stuff for calibration of a Genesis Meter + + + + + Calibration default value used to reset meter calibration + + + + + relative value (e.g. 0.05) + + + + + Setup the required tolerance in percent for check (e.g. 5 = +/-5%) + + + + + Check the tolerance of the calibration factor (e.g. 0.95 to 1.05 at 0.05 tolerance) + + + true if the calibration factor is inside the tolerance + + + + + Remind the calibration factor for the register write access + + + FlowTestRecord or CalibrationRecord + Update time needed for overflow detection in seconds + + + + + Calculate calibration factor from reference volume and reference time if set. + The deviation can adjust the factor to a required offset, it may be useful not to calibrate to 0.0). + The Result is NOT being stored to the meter. + CAN BE USED FOR STATIC START/STOP AND FLYING START/STOP PROCEDURE + + reference volume in m³ + reference time in seconds + the deviation to set the calibration in % + calibration factor as relative value or null if calibration factor cannot be calculated + + - The scale factor for calibration is going to adjusted here to keep the measurement result accurate. + + + + + information about measurement results to identify on input depending results + + + + + everything is good + + + + + inconsistent channel assignment + + + + + DUT time zero + + + + + DUT time is invalid + + + + + over flow time is invalid + + + + + REF time zero + + + + + REF time is invalid + + + + + DUT volume zero + + + + + REF volume is unknown + + + + + holds the current state for genesis actions (e.g. calibration,measurement) + + + + + If Measurement/Calibration/Action is not started + + + + + Measurement/Calibration/Action waits for next record package and sore this as start record, + After this Measurement/Calibration/Action IsRunning + + + + + Measurement/Calibration/Action collecting record and wait for end call + + + + + Measurement/Calibration/Action collecting next record record + + + + + Measurement/Calibration/Action waits for next record package and sore this as end record, + After this Measurement/Calibration/Action IsCompleted + + + + + Measurement/Calibration/Action has start and end record and can calculate a result + + + + + ProcessState nearly linear + + + + + meter not initialized + + + + + meter currently in initialization + + + + + initialization done + + + + + meter is on measurement + + + + + Measurement is done (not equal to succeed) + + + + + Meter is prepared for calibration + + + + + meter is on calibration + + + + + need Q from reference meter for calculation + + + + + Calibration is calculated + + + + + Calibration is stored on meter + + + + + + Collection of measurement interfaces + + + + + Event for new action of measurement state + + + + + Get the Type of the measurement record + + + + + + Get the channel no. the measurement collecting record for + + returns 0 when all channels should be collected + + + + Actual state of the measurement + + + + + Clear start, intermediate and end record and set action state to idle + + + + + Adding measurement record to processing FIFO + + + + + + Returns the actual state of the ongoing measurement + + + + + + Fist clear all record from earlier calibrations. + Set flag for starting measurement. + The next record is going to set the start values. + + + + + Stop grabbing record from streaming. + Last Data package is count as end volume (and time) + + + + + Returning the results of the ongoing measurement between two updates. + This can be used to update the screen during measurements like actual flow rate. + The timing will be set by the IntermediateUpdateTimeS. + + + + + + + + Returning the intermediate results of the ongoing measurement from the start of measurement until now! + + + + + + + + Returning the results of the measurements from start until stop. + + Measurement duration is needed explicit for flying start/stop procedure + reference volume is ALWAYS needed for scale and deviation + + + + + Sets a marker that a mesaurment start looking for an intermediate record + + + + + + interface for all incoming streaming protocol + to simplify measurements + + + + + Get volume of the record + + + + + Get time stamp of the record from meter + + + + + Get Data + + + + + + Get the channel the record comes from + + returns 0 if the channel is unavailable for this type of record (e.g. protocol f) + + + + Get overflow volume + + + + + + get overflow time + + + + + + + struct to hold a measurement record + + + + + physical channel 1, 2 and 3 + + + + + actual volume in cubic meters + + + + + Overflow volume + + + + + time converted to seconds + + + + + Overflow time + + + + + CRC16 CCITT + + + + + record is valid + + + + + Mark package as start, end, intermediate or not sync + + + + + time when package was decoded + + + + + time when package was received + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Channel being needed for later analysis of channel number + as feedback to the caller + + + + + Accumulated overflow volume in cubic-meters, + the DUT internal range can overflow due to + the limitation of the number or the display resolution. + + + + + Accumulated overflow time in seconds, + the number-range can cause an timer overflow. + + + + + DUT start record + + + + + DUT end record + + + + + Volume = (End Volume + overflow) - Start Volume in cubic meters, + real DUT measurement uncorrected + + + + + DUT measurement corrected if REF time is given + + + + + REF volume in cubic meters + + + + + Time = (End time + overflow) - Start time in seconds, + real DUT measurement uncorrected + + + + + REF time in seconds + + + + + Flow rate in cubic meters per hour based on DUT + + + + + Flow rate in cubic meters per hour based on REF + + + + + Scale factor between REF volume and DUT volume + this will use the + /// + + + + Deviation between DUT volume and REF volume relative, + this will use the + + + + + Deviation between DUT volume and REF volume in percent, + this will use the + + + + + Calculation of measurement results, overflow will be taken into account: + - DutVolumeCm in cubic meters: + DUT volume measurement uncorrected, direct measurement from the DUT, + - CorrectedDutVolumeCm in cubic meters: + equals the uncorrected DutVolumeCm if REF time is unknown, + else it is the volume calculated from the DUT flow-rate with the REF time, + - DutTimeS in seconds: + DUT time measurement, + - DutFlowRateCmPh in cubic meters per hour: + based on DUT volume and DUT time uncorrected, + - RefFlowRateCmPh in cubic meters per hour: + REF volume and REF time being used, + - ScaleFactorRefToDut unit less: + calculated with absolute and corrected DUT volume and REF volume + needed for calibration, is higher than one if DUT volume is less than the REF volume, + can be directly used to calculate the new scale by multiplication with the current scale, + - DeviationDutToRefRel unit less: + calculated with absolute and corrected DUT volume and REF volume + deviation needed for verification relative of DUT to REF, + - DeviationDutToRefPer in percent: + calculated with absolute and corrected DUT volume and REF volume + deviation needed for verification of DUT to REF in percent. + + + - Scale factor calculation added, + - Deviation calculation added. + + + - Flow rate calculation added, + - Slot added. + + + - RefVolumeCm, RefTimeSS and absVolumeQm added, + - Slot removed. + + + - FlowRateQmPh split to DutFlowRateCmPh and RefFlowRateCmPh, + - CorrectedDutVolumeCm added, + - input channel compared with start and end record channels. + + + - State implemented. + + + - Check and states for DUT time zero, DUT volume zero, over flow volume below zero, + start and end record time below zero. + + + - Supported static start/stop with DUT- and REF-volume, this is time independent but the + DUT- and over-flow-times shouldn't be negative or zero. + - Meter renamed to DUT (Device under Test). + + Start of measurement record set + End of measurement record set + accumulated overflow volume, will add to result volume + accumulated overflow time, will add to result time + measured REF time + REF volume + physical channel of measurement path (0 for main measurement) + + + diff --git a/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Ui.CordonelPreadjustmentUi.dll.config b/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Ui.CordonelPreadjustmentUi.dll.config new file mode 100644 index 00000000..e936cc13 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Ui.CordonelPreadjustmentUi.dll.config @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Ui.GenesisToolBox.application b/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Ui.GenesisToolBox.application new file mode 100644 index 00000000..568d5734 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Ui.GenesisToolBox.application @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + U2ZjfkL+CLLSVrOK2B9vl0lgArI= + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Ui.GenesisToolBox.exe.config b/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Ui.GenesisToolBox.exe.config new file mode 100644 index 00000000..9dafed42 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Ui.GenesisToolBox.exe.config @@ -0,0 +1,68 @@ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Ui.GenesisToolBox.exe.manifest b/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Ui.GenesisToolBox.exe.manifest new file mode 100644 index 00000000..5e3e3c06 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Common/Xylem.Common.Ui.GenesisToolBox.exe.manifest @@ -0,0 +1,530 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + VcarN6VnN39Q2dTSKkabepbVsxI= + + + + + + + + + + + + fPRsuBw7UZZcH3h2KEDrV5dZR3g= + + + + + + + + + + + + N8bfu5NE4Mqj/usnD7lzG+uC/XI= + + + + + + + + + + + + o5lptA+hf3Vw/hMU6eiyHaabOf4= + + + + + + + + + + + + Kc8r1l/csUf3l37w+jqpUh79JoE= + + + + + + + + + + + + 8rcd5Qxo0sVyAgbWlsuf57PmM1Q= + + + + + + + + + + + + 8hXybZbA8tFxU/9U1PZc/b6K9Pc= + + + + + + + + + + + + gmvhBHk1F8TIJW/dVrFPDyY1yrI= + + + + + + + + + + + + woQ8ks0FI41FMuMihpEYPYvKvkU= + + + + + + + + + + + + rckLFgpVLYxcF+doQZZ/Zhhnh/U= + + + + + + + + + + + + PI2BFqTg7GTjefSuY/N0f27J/HQ= + + + + + + + + + + + + kG4RfTYuQ5GklzM2wWU7NZGP8Hc= + + + + + + + + + + + + Tq2LSF58pN+derfw0BOGKhfsWlA= + + + + + + + + + + + + AHRWNxae7o33qE7h4PxjXyH2rkg= + + + + + + + + + + + + WBAsi7m8azRcOTu3IR2qKWQ7b6Q= + + + + + + + + + + + + Ck/9dkdCy4IR7hWBr3iJFYUjnp0= + + + + + + + + + + + + XRdjfYa6HVPxBdrKeZLetxwENro= + + + + + + + + + + + + jn5A+Zol/Q6L4goHOqSeCZCyhDM= + + + + + + + + + + + + xjLt1qg2w/kNjJjd7EXdPcRGz5M= + + + + + + + + + + + + 2USlDsx1BoRAk9staA7aU3lgnR8= + + + + + + + + + + + + 8rVHUeIGxJdZXAeJdIRRjJWDNic= + + + + + + + + + + + + nDlgYr7UYly8ALYUecJ5M/DgvzY= + + + + + + + + + + + + SjW6X5+uU6VMUECrAmVaMAqTzRs= + + + + + + + + + + + + BXJldASKW8Mh825+BOPikFMv5ME= + + + + + + + + + + + + I09mLNrO7++PJ0mLkdtokcFjN24= + + + + + + + + + + + + cfBWXcs/WpZuX3G2vOgPlJztb5M= + + + + + + + + + + + + E+3ytPgyrGK7/64uUG76yx3i+H0= + + + + + + + + + + + + EDJy4Fr56tPoB+fTiw4SgsqPtiY= + + + + + + + + + + + + FVG30NZnQVQudu2wcNyqUTsoKtU= + + + + + + + + + + + + GYR10u0LUSPvDsdladbUx1l890o= + + + + + + + + + + + + FT9fqXCShyolEvXRpG+rqSSlXgo= + + + + + + + + + + + + nQWNKmjCEsQ+gFyNU6HmARzHsfM= + + + + + + + + + + + + hnoNZRSRy5+/xwKeBkM2HrvitWc= + + + + + + + + + + + + fI12wZbxXTJmVAFIZ0p7BzxielM= + + + + + + + + + + + + VeAYgzsWz9w0DS1G5Sh5HBDljz0= + + + + + + + + + + + + 2UoZx9sv2UtBQOk03CKgaHj0mwQ= + + + + + + + + + + + + OPUGuRR0XTYDzq1TxMY6x56RG3U= + + + + + + + + + + + + c5k1CLp2hRve7ieXCt/OAMk1FfM= + + + + + + + + + + + + gzzd+FbR0mZmEGBLujFi3FWKsPw= + + + + + + + + + + 6QumIA2Y1nwacpor2o3QZrk+Bhg= + + + + + + + + + Orw6BCdXrOWNj759VJEtj16a+KQ= + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/Common/XylemCommonUiLegacyGenCtl.dll.config b/TBF_V2/Sources/TBF/packages/Common/XylemCommonUiLegacyGenCtl.dll.config new file mode 100644 index 00000000..e936cc13 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Common/XylemCommonUiLegacyGenCtl.dll.config @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/Common/XylemCommonUiLegacyGenCtl.tlb b/TBF_V2/Sources/TBF/packages/Common/XylemCommonUiLegacyGenCtl.tlb new file mode 100644 index 00000000..9dbd4240 Binary files /dev/null and b/TBF_V2/Sources/TBF/packages/Common/XylemCommonUiLegacyGenCtl.tlb differ diff --git a/TBF_V2/Sources/TBF/packages/Common/configuration.json b/TBF_V2/Sources/TBF/packages/Common/configuration.json new file mode 100644 index 00000000..32a126f0 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Common/configuration.json @@ -0,0 +1,16726 @@ +{ + "CUSTOMER": { + "id": 9, + "version": { + "first": 1, + "last": 151 + }, + "registers": { + "AlarmStatus0": { + "id": 0, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "8 bit counts corresponding to alarms 0-3.", + "version": { + "first": 1, + "last": 151 + }, + "statictype": "dynamic" + } + ] + }, + "AlarmStatus1": { + "id": 1, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "8 bit counts corresponding to alarms 4-7.", + "version": { + "first": 1, + "last": 151 + }, + "statictype": "dynamic" + } + ] + }, + "TriggerAlarmCancel": { + "id": 2, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Any set bits manually clear the corresponding alarm.", + "version": { + "first": 1, + "last": 110 + }, + "statictype": "dynamic" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Any set bits manually clear the corresponding alarm.", + "version": { + "first": 111, + "last": 151 + }, + "statictype": "dynamic" + } + ] + }, + "AlarmStatus2": { + "id": 3, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "8 bit counts corresponding to alarms 8-11.", + "version": { + "first": 26, + "last": 151 + }, + "statictype": "dynamic" + } + ] + }, + "AlarmStatus3": { + "id": 4, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "8 bit counts corresponding to alarms 12-15.", + "version": { + "first": 26, + "last": 151 + }, + "statictype": "dynamic" + } + ] + }, + "AlarmStatus4": { + "id": 5, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "8 bit counts corresponding to alarms 16-19.", + "version": { + "first": 26, + "last": 151 + }, + "statictype": "dynamic" + } + ] + }, + "AlarmStatus5": { + "id": 6, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "8 bit counts corresponding to alarms 20-23.", + "version": { + "first": 26, + "last": 151 + }, + "statictype": "dynamic" + } + ] + }, + "AlarmStatus6": { + "id": 7, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "8 bit counts corresponding to alarms 24-27.", + "version": { + "first": 26, + "last": 151 + }, + "statictype": "dynamic" + } + ] + }, + "AlarmStatus7": { + "id": 8, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "8 bit counts corresponding to alarms 28-31.", + "version": { + "first": 26, + "last": 151 + }, + "statictype": "dynamic" + } + ] + }, + "AlarmEnableMask": { + "id": 9, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit set of those alarms which are being monitored.", + "version": { + "first": 26, + "last": 110 + }, + "values": { + "default": 4294967295, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit set of those alarms which are being monitored.", + "version": { + "first": 111, + "last": 151 + }, + "values": { + "default": 4294967295, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "AlarmBroadcastMask": { + "id": 10, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit set of those alarms which will generate events.", + "version": { + "first": 26, + "last": 110 + }, + "values": { + "default": 4294967295, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit set of those alarms which will generate events.", + "version": { + "first": 111, + "last": 151 + }, + "values": { + "default": 4294967295, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "AlarmVisualMask": { + "id": 11, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit set of those alarms which are displayed with IDs and the alarm icon.", + "version": { + "first": 110, + "last": 110 + }, + "values": { + "default": 4294967295, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit set of those alarms which are displayed with IDs and the alarm icon.", + "version": { + "first": 111, + "last": 151 + }, + "values": { + "default": 4294967295, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "AlarmVisualAutoClearMask": { + "id": 12, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Alarms that have their display automatically cleared", + "version": { + "first": 110, + "last": 110 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Alarms that have their display automatically cleared", + "version": { + "first": 111, + "last": 151 + }, + "statictype": "static" + } + ] + }, + "ExcessFlowVolumeThreshold": { + "id": 13, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Flow rate above which broken pipe alarm is set in 1/256 l/h", + "version": { + "first": 61, + "last": 110 + }, + "values": { + "default": 639590, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Flow rate above which broken pipe alarm is set in 1/256 l/h", + "version": { + "first": 111, + "last": 118 + }, + "values": { + "default": 639590, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Flow rate above which broken pipe alarm is set in 1/256 l/h", + "version": { + "first": 119, + "last": 132 + }, + "values": { + "default": 639590, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Flow rate above which broken pipe alarm is set in 1/256 l/h", + "version": { + "first": 133, + "last": 151 + }, + "values": { + "default": 639999, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "LeakTimeThreshold": { + "id": 14, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for leak alarm in minutes", + "version": { + "first": 61, + "last": 110 + }, + "values": { + "default": 10080, + "minimum": 0, + "maximum": 69632 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for leak alarm in minutes", + "version": { + "first": 111, + "last": 118 + }, + "values": { + "default": 10080, + "minimum": 0, + "maximum": 69632 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for leak alarm in minutes", + "version": { + "first": 119, + "last": 151 + }, + "values": { + "default": 360, + "minimum": 0, + "maximum": 69632 + }, + "statictype": "static" + } + ] + }, + "ReverseFlowTimeThreshold": { + "id": 15, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Number of measurements in reverse flow required to set reverse flow alarm", + "version": { + "first": 61, + "last": 110 + }, + "values": { + "default": 15, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Number of measurements in reverse flow required to set reverse flow alarm", + "version": { + "first": 111, + "last": 142 + }, + "values": { + "default": 15, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Number of measurements in reverse flow required to set reverse flow alarm", + "version": { + "first": 143, + "last": 151 + }, + "values": { + "default": 15, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + } + ] + }, + "Locale": { + "id": 18, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Timezone in which this application is set to run.", + "version": { + "first": 24, + "last": 151 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "AppArrangement": { + "id": 19, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "A name for the arrangement of applications on the meter", + "version": { + "first": 130, + "last": 151 + }, + "statictype": "dynamic" + } + ] + }, + "RebootCount": { + "id": 20, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of times the meter has rebooted", + "version": { + "first": 73, + "last": 110 + }, + "values": { + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of times the meter has rebooted", + "version": { + "first": 111, + "last": 151 + }, + "values": { + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "ExcessFlowTimeThreshold": { + "id": 21, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for broken pipe alarm in minutes", + "version": { + "first": 80, + "last": 110 + }, + "values": { + "default": 15, + "minimum": 0, + "maximum": 69632 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for broken pipe alarm in minutes", + "version": { + "first": 111, + "last": 118 + }, + "values": { + "default": 15, + "minimum": 0, + "maximum": 69632 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for broken pipe alarm in minutes", + "version": { + "first": 119, + "last": 151 + }, + "values": { + "default": 180, + "minimum": 0, + "maximum": 69632 + }, + "statictype": "static" + } + ] + }, + "LeakFlowThreshold": { + "id": 22, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Flow rate above which leak alarm can be set in 1/256 l/h", + "version": { + "first": 80, + "last": 110 + }, + "values": { + "default": 12800, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Flow rate above which leak alarm can be set in 1/256 l/h", + "version": { + "first": 111, + "last": 118 + }, + "values": { + "default": 12800, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Flow rate above which leak alarm can be set in 1/256 l/h", + "version": { + "first": 119, + "last": 132 + }, + "values": { + "default": 5529, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Flow rate above which leak alarm can be set in 1/256 l/h", + "version": { + "first": 133, + "last": 151 + }, + "values": { + "default": 6399, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "MfgCharge": { + "id": 23, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Charge in uAs available in manufacturing (read only)", + "version": { + "first": 84, + "last": 151 + }, + "values": { + "default": 181440000 + }, + "statictype": "static" + } + ] + }, + "TemperatureHighThreshold": { + "id": 24, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "High temperature alarm threshold in 0.1°C", + "version": { + "first": 88, + "last": 100 + }, + "values": { + "default": 500, + "minimum": 0, + "maximum": 800 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "High temperature alarm threshold in 0.1°C", + "version": { + "first": 101, + "last": 110 + }, + "values": { + "default": 500, + "minimum": 0, + "maximum": 800 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "High temperature alarm threshold in 0.1°C", + "version": { + "first": 111, + "last": 151 + }, + "values": { + "default": 500, + "minimum": 0, + "maximum": 800 + }, + "statictype": "static" + } + ] + }, + "TemperatureHighDelay": { + "id": 25, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for high temperature alarm in seconds", + "version": { + "first": 88, + "last": 110 + }, + "values": { + "default": 600, + "minimum": 0, + "maximum": 10800 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for high temperature alarm in seconds", + "version": { + "first": 111, + "last": 151 + }, + "values": { + "default": 600, + "minimum": 0, + "maximum": 10800 + }, + "statictype": "static" + } + ] + }, + "TemperatureLowThreshold": { + "id": 26, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Low temperature alarm threshold in 0.1°C", + "version": { + "first": 88, + "last": 100 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Low temperature alarm threshold in 0.1°C", + "version": { + "first": 101, + "last": 110 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Low temperature alarm threshold in 0.1°C", + "version": { + "first": 111, + "last": 151 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "TemperatureLowDelay": { + "id": 27, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for low temperature alarm in seconds", + "version": { + "first": 88, + "last": 110 + }, + "values": { + "default": 600, + "minimum": 0, + "maximum": 10800 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for low temperature alarm in seconds", + "version": { + "first": 111, + "last": 151 + }, + "values": { + "default": 600, + "minimum": 0, + "maximum": 10800 + }, + "statictype": "static" + } + ] + }, + "PressureHighThreshold": { + "id": 28, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "High pressure alarm threshold in Pa", + "version": { + "first": 88, + "last": 110 + }, + "values": { + "default": 1600000, + "minimum": 0, + "maximum": 2550000 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "High pressure alarm threshold in Pa", + "version": { + "first": 111, + "last": 121 + }, + "values": { + "default": 1600000, + "minimum": 0, + "maximum": 2550000 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "High pressure alarm threshold in Pa", + "version": { + "first": 122, + "last": 151 + }, + "values": { + "default": 1600000, + "minimum": 0, + "maximum": 2550000 + }, + "statictype": "static" + } + ] + }, + "PressureHighDelay": { + "id": 29, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for high pressure alarm in seconds", + "version": { + "first": 88, + "last": 110 + }, + "values": { + "default": 300, + "minimum": 0, + "maximum": 10800 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for high pressure alarm in seconds", + "version": { + "first": 111, + "last": 118 + }, + "values": { + "default": 300, + "minimum": 0, + "maximum": 10800 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for high pressure alarm in seconds", + "version": { + "first": 119, + "last": 151 + }, + "values": { + "default": 600, + "minimum": 0, + "maximum": 10800 + }, + "statictype": "static" + } + ] + }, + "PressureLowThreshold": { + "id": 30, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Low pressure alarm threshold in Pa", + "version": { + "first": 88, + "last": 110 + }, + "values": { + "default": 30000, + "minimum": 0, + "maximum": 2550000 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Low pressure alarm threshold in Pa", + "version": { + "first": 111, + "last": 121 + }, + "values": { + "default": 30000, + "minimum": 0, + "maximum": 2550000 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Low pressure alarm threshold in Pa", + "version": { + "first": 122, + "last": 151 + }, + "values": { + "default": 30000, + "minimum": 0, + "maximum": 2550000 + }, + "statictype": "static" + } + ] + }, + "PressureLowDelay": { + "id": 31, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for low pressure alarm in seconds", + "version": { + "first": 88, + "last": 110 + }, + "values": { + "default": 300, + "minimum": 0, + "maximum": 10800 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for low pressure alarm in seconds", + "version": { + "first": 111, + "last": 118 + }, + "values": { + "default": 300, + "minimum": 0, + "maximum": 10800 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for low pressure alarm in seconds", + "version": { + "first": 119, + "last": 151 + }, + "values": { + "default": 600, + "minimum": 0, + "maximum": 10800 + }, + "statictype": "static" + } + ] + }, + "StoreConfiguration": { + "id": 32, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Store all configuration items in non-volatile memory.", + "version": { + "first": 88, + "last": 130 + }, + "statictype": "dynamic" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Store all configuration items in non-volatile memory.", + "version": { + "first": 131, + "last": 151 + }, + "statictype": "dynamic" + } + ] + }, + "SerialNumber": { + "id": 33, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Customer serial number string", + "version": { + "first": 139, + "last": 151 + }, + "statictype": "static" + } + ] + }, + "BackupCalendarSeconds": { + "id": 34, + "details": [ + { + "type": "time_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "NA", + "lvl8": "NA" + }, + "description": "Internal backup of calendar seconds", + "version": { + "first": 145, + "last": 151 + }, + "statictype": "dynamic" + } + ] + }, + "InstallationTime": { + "id": 35, + "details": [ + { + "type": "time_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time meter was determined to have been installed. 0 means not installed", + "version": { + "first": 147, + "last": 151 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "LocaleDecimalPoint": { + "id": 36, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Read to view the string used as a decimal point for this locale", + "version": { + "first": 151, + "last": 151 + }, + "statictype": "dynamic" + } + ] + }, + "LocaleThousandsSeparator": { + "id": 37, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Read to view the string used as a thousands separarator for this locale", + "version": { + "first": 151, + "last": 151 + }, + "statictype": "dynamic" + } + ] + } + }, + "status": { + "REBOOT": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 0 + }, + "REBOOT_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 1 + }, + "LOW_BATTERY": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 2 + }, + "LOW_BATTERY_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 3 + }, + "VERY_LOW_BATTERY": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 4 + }, + "VERY_LOW_BATTERY_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 5 + }, + "CONFIG_ERROR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 6 + }, + "CONFIG_ERROR_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 7 + }, + "EMPTY_PIPE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 8 + }, + "EMPTY_PIPE_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 9 + }, + "MAGNETIC_TAMPER": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 10 + }, + "MAGNETIC_TAMPER_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 11 + }, + "REVERSE_FLOW": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 12 + }, + "REVERSE_FLOW_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 13 + }, + "SUSPECT_LEAK": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 14 + }, + "SUSPECT_LEAK_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 15 + }, + "BROKEN_PIPE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 16 + }, + "BROKEN_PIPE_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 17 + }, + "LOW_PRESSURE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 18 + }, + "LOW_PRESSURE_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 19 + }, + "HIGH_PRESSURE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 20 + }, + "HIGH_PRESSURE_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 21 + }, + "LOW_TEMPERATURE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 22 + }, + "LOW_TEMPERATURE_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 23 + }, + "HIGH_TEMPERATURE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 24 + }, + "HIGH_TEMPERATURE_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 25 + }, + "RADIO_ERROR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 26 + }, + "RADIO_ERROR_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 27 + }, + "METROLOGY_PARAMS": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 28 + }, + "METROLOGY_PARAMS_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 29 + }, + "METROLOGY_MEASURE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 30 + }, + "METROLOGY_MEASURE_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 31 + }, + "UNALLOCATED_6": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 32 + }, + "UNALLOCATED_6_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 33 + }, + "UNALLOCATED_7": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 34 + }, + "UNALLOCATED_7_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 35 + }, + "UNALLOCATED_8": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 36 + }, + "UNALLOCATED_8_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 37 + }, + "UNALLOCATED_9": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 38 + }, + "UNALLOCATED_9_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 39 + }, + "UNALLOCATED_10": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 40 + }, + "UNALLOCATED_10_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 41 + }, + "UNALLOCATED_11": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 42 + }, + "UNALLOCATED_11_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 43 + }, + "UNALLOCATED_12": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 44 + }, + "UNALLOCATED_12_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 45 + }, + "UNALLOCATED_13": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 46 + }, + "UNALLOCATED_13_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 47 + }, + "UNALLOCATED_14": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 48 + }, + "UNALLOCATED_14_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 49 + }, + "UNALLOCATED_15": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 50 + }, + "UNALLOCATED_15_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 51 + }, + "UNALLOCATED_16": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 52 + }, + "UNALLOCATED_16_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 53 + }, + "UNALLOCATED_17": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 54 + }, + "UNALLOCATED_17_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 55 + }, + "UNALLOCATED_18": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 56 + }, + "UNALLOCATED_18_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 57 + }, + "UNALLOCATED_19": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 58 + }, + "UNALLOCATED_19_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 59 + }, + "UNALLOCATED_20": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 60 + }, + "UNALLOCATED_20_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 61 + }, + "UNALLOCATED_21": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 62 + }, + "UNALLOCATED_21_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 63 + }, + "UNKNOWN_PARAMETER": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 64 + }, + "LOCALE_UNDEFINED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 65 + }, + "NO_SUCH_ALARM": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 66 + }, + "OUT_OF_RANGE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 67 + }, + "NOT_IMPLEMENTED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 68 + }, + "BAD_CONFIG": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 69 + }, + "DID_NOT_STORE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 70 + }, + "STORE_PENDING": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 71 + } + } + }, + "FUNCTEST": { + "id": 10, + "version": { + "first": null, + "last": null + }, + "registers": { + "GP30Test": { + "id": 0, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + }, + "statictype": null + } + ] + }, + "LCDTest": { + "id": 1, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + }, + "statictype": null + } + ] + }, + "Iloop": { + "id": 2, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + }, + "statictype": null + } + ] + }, + "Pulse": { + "id": 3, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + }, + "statictype": null + } + ] + }, + "Pressure": { + "id": 4, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + }, + "statictype": null + } + ] + }, + "BatteryVoltage": { + "id": 5, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + }, + "statictype": null + } + ] + }, + "SupplyVoltage": { + "id": 6, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + }, + "statictype": null + } + ] + }, + "Temperature": { + "id": 7, + "details": [ + { + "type": "int16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + }, + "statictype": null + } + ] + }, + "RFID": { + "id": 8, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + }, + "statictype": null + } + ] + }, + "OpticalOutput": { + "id": 9, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + }, + "statictype": null + } + ] + }, + "Radio": { + "id": 10, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + }, + "statictype": null + } + ] + }, + "MultiTest": { + "id": 11, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + }, + "statictype": null + } + ] + }, + "NFCUID": { + "id": 12, + "details": [ + { + "type": "uint64_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + }, + "statictype": null + } + ] + }, + "CPUTest": { + "id": 13, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + }, + "statictype": null + } + ] + } + }, + "status": { + "BAD_CONFIG": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 0 + }, + "BAD_TEST": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 1 + }, + "NO_RESULT": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 2 + } + } + }, + "OPTICALPORT": { + "id": 5, + "version": { + "first": 1, + "last": 55 + }, + "registers": { + "BaudRateCapabilities": { + "id": 0, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Bitmask of supported rates on the given hardware.", + "version": { + "first": 2, + "last": 55 + }, + "statictype": "static" + } + ] + }, + "PacketSizeCapabilities": { + "id": 1, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Bitmask of supported packet sizes.", + "version": { + "first": 2, + "last": 55 + }, + "values": { + "default": 64 + }, + "statictype": "static" + } + ] + }, + "ProtocolVersion": { + "id": 2, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Version number as fixed point 16.16 format BCD.", + "version": { + "first": 2, + "last": 55 + }, + "statictype": "static" + } + ] + }, + "BaudRateSelected": { + "id": 3, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Baud rate in bits per second.", + "version": { + "first": 2, + "last": 55 + }, + "statictype": "dynamic" + } + ] + }, + "PacketSizeSelected": { + "id": 4, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Packet size in bytes.", + "version": { + "first": 2, + "last": 55 + }, + "statictype": "dynamic" + } + ] + }, + "ExternalUartControl": { + "id": 5, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "WO", + "lvl2": "WO", + "lvl3": "WO", + "lvl4": "WO", + "lvl5": "WO", + "lvl6": "WO", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Surrenders the UART to another application", + "version": { + "first": 49, + "last": 55 + }, + "statictype": "dynamic" + } + ] + } + }, + "status": { + "PAYLOAD_COUNT": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 0 + }, + "INVALID_SUBREASON": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 1 + }, + "INVALID_BAUDRATE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 2 + }, + "INVALID_BUFFERSIZE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 3 + }, + "CRCFAILURE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 4 + }, + "UNRECOGNISEDCMD": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 5 + }, + "FRAMING": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 6 + }, + "OVERFLOW": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 7 + }, + "PACKETTIMEOUT": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 8 + }, + "INVALIDESCAPE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 9 + }, + "UNKNOWN_PARAMETER": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 10 + }, + "TRAINING_FAILED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 11 + }, + "NOBREAK": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 12 + } + } + }, + "SENSUSRADIO": { + "id": 16, + "version": { + "first": 100, + "last": 456 + }, + "registers": { + "TxInterval": { + "id": 0, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 15, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "OmTxInterval": { + "id": 1, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 3600, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "LatInterval": { + "id": 2, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 3, + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "WakeupInterval": { + "id": 3, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 3, + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "MbusState": { + "id": 4, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 7, + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "FrequencyIndicator": { + "id": 5, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 433, + "minimum": 868, + "maximum": 65535 + }, + "statictype": "static" + } + ] + }, + "FrequencyOffset": { + "id": 6, + "details": [ + { + "type": "int16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 0, + "minimum": -32768, + "maximum": 32767 + }, + "statictype": "static" + } + ] + }, + "PowerLevel": { + "id": 7, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 127 + }, + "statictype": "static" + } + ] + }, + "SystemState": { + "id": 9, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "RadioAddress": { + "id": 10, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "UtcTimeOffset": { + "id": 11, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 0, + "minimum": -32768, + "maximum": 32767 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "SentBytesCounter": { + "id": 12, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "dynamic" + } + ] + }, + "ReceivedBytesCounter": { + "id": 13, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "dynamic" + } + ] + }, + "ResetCounter": { + "id": 14, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "BootLoaderState": { + "id": 15, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "statictype": "static" + } + ] + }, + "LeakFlowThreshold": { + "id": 16, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 25, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "LeakFlowTimeThreshold": { + "id": 17, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 360, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "BrokenPipeFlowThreshold": { + "id": 18, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 2500, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "BrokenPipeFlowTimeThreshold": { + "id": 19, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 180, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "PressureMaxThreshold": { + "id": 20, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 160, + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "PressureMinThreshold": { + "id": 21, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 3, + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "PressureLimitTimeMaxThreshold": { + "id": 22, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 600, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "PressureLimitTimeMinThreshold": { + "id": 23, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 600, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "PressureMeasurePeriod": { + "id": 24, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 60, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "PressureUnit": { + "id": 25, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 2 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "PressureGaugeOffset": { + "id": 26, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "TemperatureMaxThreshold": { + "id": 27, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 50, + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "TemperatureMinThreshold": { + "id": 28, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 2, + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "TemperatureTimeMaxThreshold": { + "id": 29, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 600, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "TemperatureTimeMinThreshold": { + "id": 30, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 600, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "TemperatureMeasurePeriod": { + "id": 31, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 60, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "TemperatureUnit": { + "id": 32, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 2 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "PulseOutWidth": { + "id": 33, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "An enumerator defining the currently active PulseWidth (0 ... 8 for non testmode values and 9 ... 15 for testmode)", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 4, + "minimum": 0, + "maximum": 15 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "PulseOutDivisor": { + "id": 34, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 1000 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "PulseOutMode": { + "id": 35, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 3 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "CurrentLoopMax": { + "id": 36, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "CurrentLoopSource": { + "id": 37, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "MainAlarmMask": { + "id": 38, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 207, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "ExtendedAlarmMask": { + "id": 39, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 60, + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "HistoricalAlarmsDays": { + "id": 40, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 29, + "minimum": 0, + "maximum": 250 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "TestModeTime": { + "id": 43, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "dynamic" + } + ] + }, + "EncryptionKey": { + "id": 44, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "statictype": "static" + } + ] + }, + "Authentification": { + "id": 45, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "statictype": "static" + } + ] + }, + "UpgFWVersion": { + "id": 46, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + } + ] + }, + "CustomerText": { + "id": 47, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "RadioLastReadTime": { + "id": 48, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "dynamic" + } + ] + }, + "LowBatDateTime": { + "id": 49, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "dynamic" + } + ] + }, + "VeryLowBatDateTime": { + "id": 50, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "dynamic" + } + ] + }, + "Unit": { + "id": 51, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 19, + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "ExtendedUnitFlags": { + "id": 52, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "OTAControlFlags": { + "id": 53, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "Tfx_Structure": { + "id": 54, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "statictype": "dynamic" + } + ] + }, + "Dewa_Structure": { + "id": 55, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "dynamic" + } + ] + }, + "DataLogContents": { + "id": 56, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 201335811, + "minimum": 3, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "DataLogPeriod": { + "id": 57, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 60, + "minimum": 1, + "maximum": 1440 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "AverageFlowPeriod": { + "id": 58, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 5, + "minimum": 1, + "maximum": 60 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "FixedDateReadingContents": { + "id": 59, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 201335811, + "minimum": 3, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "FixedDateDayOfMonth": { + "id": 60, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 1, + "minimum": 1, + "maximum": 28 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "MetroRadioLifeTimeCounter": { + "id": 61, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "dynamic" + } + ] + }, + "PowerLevelOption": { + "id": 62, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 127 + }, + "statictype": "static" + } + ] + }, + "ImpedanceCodeNew": { + "id": 63, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 4, + "minimum": 0, + "maximum": 32767 + }, + "statictype": "static" + } + ] + }, + "ImpedanceCodeOption": { + "id": 64, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 4, + "minimum": 0, + "maximum": 32767 + }, + "statictype": "static" + } + ] + }, + "IrDAModulePresent": { + "id": 65, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "dynamic" + } + ] + }, + "StoreConfiguration": { + "id": 66, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "dynamic" + } + ] + }, + "LifeTimeSeconds": { + "id": 67, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 100, + "last": 456 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "dynamic" + } + ] + }, + "DutyCycleCredit": { + "id": 68, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 412, + "last": 456 + }, + "values": { + "default": 4320000, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "dynamic" + } + ] + }, + "ActivityCredit": { + "id": 69, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": 412, + "last": 456 + }, + "values": { + "default": 1000, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "dynamic" + } + ] + }, + "PersistenceGroup1": { + "id": 70, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Storage item for HistoricalErrorLimitCounters Reverse(1, hi) and Leak(0, lo)", + "version": { + "first": 437, + "last": 456 + }, + "values": { + "default": 16711935, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "PersistenceGroup2": { + "id": 71, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Storage item for HistoricalErrorLimitCounters Magnet(3, hi) and Air(2, lo)", + "version": { + "first": 437, + "last": 456 + }, + "values": { + "default": 16711935, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "PersistenceGroup3": { + "id": 72, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Storage item for HistoricalErrorLimitCounters PressureMin(5, hi) and PressureMax(4, lo)", + "version": { + "first": 437, + "last": 456 + }, + "values": { + "default": 16711935, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "PersistenceGroup4": { + "id": 73, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Storage item for HistoricalErrorLimitCounters TempMin(7, hi) and TempMax(6, lo)", + "version": { + "first": 437, + "last": 456 + }, + "values": { + "default": 16711935, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated" + } + ] + } + }, + "status": { + "UNKNOWN_PARAMETER": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 0 + }, + "BAD_CONFIG": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 1 + }, + "NO_CHANGE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 2 + } + } + }, + "CONFIGEXCHANGE": { + "id": 4, + "version": { + "first": 3, + "last": 219 + }, + "registers": { + "Privilege": { + "id": 0, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Written to set the login level, followed by the password. Note, this can be read at any login level including 0.", + "version": { + "first": 3, + "last": 219 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 8 + }, + "statictype": "dynamic" + } + ] + }, + "Password": { + "id": 1, + "details": [ + { + "type": "uint96_t", + "privilege": { + "lvl1": "WO", + "lvl2": "WO", + "lvl3": "WO", + "lvl4": "WO", + "lvl5": "WO", + "lvl6": "WO", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Password for logging in, requires 3 consecutive writes", + "version": { + "first": 3, + "last": 219 + }, + "statictype": "dynamic" + } + ] + }, + "FOpen": { + "id": 2, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this to open a file on the meter, handle returned", + "version": { + "first": 20, + "last": 219 + }, + "statictype": "dynamic" + } + ] + }, + "FClose": { + "id": 3, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this to close a file on the meter", + "version": { + "first": 20, + "last": 219 + }, + "statictype": "dynamic" + } + ] + }, + "FRead": { + "id": 4, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this to read bytes from an open file", + "version": { + "first": 20, + "last": 219 + }, + "statictype": "dynamic" + } + ] + }, + "FWrite": { + "id": 5, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this to write bytes to an open file", + "version": { + "first": 20, + "last": 219 + }, + "statictype": "dynamic" + } + ] + }, + "FSeek": { + "id": 6, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this to seek within an open file", + "version": { + "first": 20, + "last": 219 + }, + "statictype": "dynamic" + } + ] + }, + "FTell": { + "id": 7, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this to determine position within an open file", + "version": { + "first": 20, + "last": 219 + }, + "statictype": "dynamic" + } + ] + }, + "Remove": { + "id": 8, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this to delete a file", + "version": { + "first": 20, + "last": 219 + }, + "statictype": "dynamic" + } + ] + }, + "FEOF": { + "id": 9, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this determine whether the current position in an open file is the end of the file", + "version": { + "first": 20, + "last": 219 + }, + "statictype": "dynamic" + } + ] + }, + "Catalogue": { + "id": 10, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Returns a list of files in the filesystem that matches a string containing wildcards passed in", + "version": { + "first": 49, + "last": 219 + }, + "statictype": "dynamic" + } + ] + }, + "PCBSerialNumber": { + "id": 12, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "String containing the PCB serial number. Note, this can be read at any login level including 0", + "version": { + "first": 59, + "last": 219 + }, + "statictype": "static" + } + ] + }, + "ConfigAccessRights": { + "id": 13, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bitmask of login levels permitted to manipulate dangerous files", + "version": { + "first": 59, + "last": 219 + }, + "statictype": "static" + } + ] + }, + "FFlush": { + "id": 14, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this to flush write buffers to an open file", + "version": { + "first": 66, + "last": 219 + }, + "statictype": "dynamic" + } + ] + } + }, + "status": { + "LOCKED_OUT": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 0 + }, + "AUTHENTICATION_FAILURE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 1 + }, + "ACCESS_DENIED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 2 + }, + "UNKNOWN_PARAMETER": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 3 + }, + "IN_USE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 4 + }, + "SIZES_DONT_MATCH": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 5 + }, + "CANT_READ_CONFIG_FILE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 6 + }, + "USER_NOT_KNOWN": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 7 + }, + "CANT_CREATE_CONFIG_FILE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 8 + }, + "STORE_DIDNT_STORE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 9 + }, + "STORE_CORRUPT": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 10 + }, + "EXPECTED_WRITE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 11 + }, + "EXPECTED_READ": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 12 + }, + "STOP_CYCLING": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 13 + }, + "TOO_MANY_OPEN": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 14 + }, + "NEVER_OPENED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 15 + }, + "FILE_PROTECTED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 16 + }, + "PARTIAL_RECALL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 17 + }, + "DEFAULT_PASSWORD_USED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 18 + } + } + }, + "NFC": { + "id": 21, + "version": { + "first": 1, + "last": 53 + }, + "registers": { + "EraseRMA": { + "id": 0, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RW" + }, + "description": "Writing TRUE to this register erases the RMA area", + "version": { + "first": 7, + "last": 53 + }, + "statictype": "dynamic" + } + ] + }, + "ForceUpdate": { + "id": 1, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write to this to force an update of some data. 0 - NDEF readings, 1 - NDEF details, 2 - RMA details", + "version": { + "first": 49, + "last": 53 + }, + "statictype": "dynamic" + } + ] + } + }, + "status": { + "BAD_CONFIG": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 0 + }, + "NDEF_WRITE_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 1 + }, + "NDEF_VERIFY_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 2 + }, + "NDEF_UPDATE_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 3 + }, + "RMA_WRITE_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 4 + }, + "RMA_VERIFY_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 5 + }, + "RMA_BAD_ENTRY": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 6 + }, + "INIT_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 7 + }, + "NDEF_CONFIG_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 8 + }, + "RMA_CONFIG_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 9 + }, + "NDEF_START_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 10 + }, + "RMA_START_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 11 + } + } + }, + "SYSTEM": { + "id": 0, + "version": { + "first": 141, + "last": 494 + }, + "registers": { + "TriggerUpgrade": { + "id": 0, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Writing TRUE to this register internally calls SysTriggerUpgrade() then returns the result.", + "version": { + "first": 141, + "last": 494 + }, + "statictype": "dynamic" + } + ] + }, + "CheckPresence": { + "id": 1, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Writing an application id number allows the version number of that application to be read back.", + "version": { + "first": 150, + "last": 494 + }, + "statictype": "dynamic" + } + ] + }, + "PCBSerialNumber": { + "id": 2, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "A string reporting the PCB serial number, this string must be set using production equipment.", + "version": { + "first": 169, + "last": 494 + }, + "values": { + "default": "" + }, + "statictype": "static" + } + ] + }, + "CustomerSerialNumber0": { + "id": 3, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A string reported relating to the customer, this string can be written only once after manufacture. If subsequent changes are needed CUSTOMERSERIALNUMBER1 must be used.", + "version": { + "first": 170, + "last": 494 + }, + "values": { + "default": "" + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "CustomerSerialNumber1": { + "id": 4, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A string reported relating to the customer, this string can be written only once after manufacture. If subsequent changes are needed CUSTOMERSERIALNUMBER2 must be used.", + "version": { + "first": 170, + "last": 494 + }, + "values": { + "default": "" + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "CustomerSerialNumber2": { + "id": 5, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A string reported relating to the customer, this string can be written only once after manufacture. If subsequent changes are needed CUSTOMERSERIALNUMBER3 must be used.", + "version": { + "first": 170, + "last": 494 + }, + "values": { + "default": "" + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "CustomerSerialNumber3": { + "id": 6, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A string reported relating to the customer, this string can be written only once after manufacture. This is the last customer serial number change slot.", + "version": { + "first": 170, + "last": 494 + }, + "values": { + "default": "" + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "MonotonicSeconds": { + "id": 7, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "The number of seconds since reboot.", + "version": { + "first": 176, + "last": 494 + }, + "statictype": "dynamic" + } + ] + }, + "CalendarSeconds": { + "id": 8, + "details": [ + { + "type": "time_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of seconds since 01-Jan-2000.", + "version": { + "first": 176, + "last": 494 + }, + "statictype": "dynamic" + } + ] + }, + "CoreRevision": { + "id": 9, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "A string reporting the product version string held in the system core binary.", + "version": { + "first": 196, + "last": 494 + }, + "statictype": "static" + } + ] + }, + "DriveCapacity": { + "id": 10, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Writing a drive number returns the drive capacity in bytes, or 0 if the drive is not ready, or an error if the driver is not configured to be present.", + "version": { + "first": 233, + "last": 494 + }, + "statictype": "dynamic" + } + ] + }, + "ExitReason": { + "id": 11, + "details": [ + { + "type": "status_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Writing an application id number allows the exit error number of that application to be read back.", + "version": { + "first": 258, + "last": 494 + }, + "statictype": "dynamic" + } + ] + }, + "CorePlatform": { + "id": 12, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Reports the instruction set of the hosting microprocessor in b8-15 and allocated platform number in b0-7.", + "version": { + "first": 265, + "last": 494 + }, + "statictype": "static" + } + ] + }, + "CRC": { + "id": 13, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Writing an application id number allows the CRC of that application to be read back.", + "version": { + "first": 279, + "last": 494 + }, + "statictype": "dynamic" + } + ] + }, + "UpgradePermissions": { + "id": 14, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bitfield of permissions releated to firmware upgrade", + "version": { + "first": 470, + "last": 494 + }, + "statictype": "static" + } + ] + } + }, + "status": { + "OK": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 0 + }, + "ZERO_APPS": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 1 + }, + "NO_MEMORY": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 2 + }, + "NOT_IMPLEMENTED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 3 + }, + "BLOCK_NOT_FOUND": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 4 + }, + "NO_SUCH_VAR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 5 + }, + "NO_CLIB": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 6 + }, + "KEY_FAILURE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 7 + }, + "NO_SLOTS_FREE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 8 + }, + "VECTOR_OUT_OF_RANGE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 9 + }, + "BAD_VECTOR_RELEASE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 10 + }, + "DRIVER_BUSY": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 11 + }, + "OUT_OF_RANGE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 12 + }, + "CANT_CANCEL_TICK": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 13 + }, + "ID_OUT_OF_RANGE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 14 + }, + "HANDLE_OUT_OF_RANGE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 15 + }, + "INCAPABLE_HARDWARE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 16 + }, + "ALREADY_OPEN": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 17 + }, + "STRING_TOO_LONG": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 18 + }, + "CORRUPT_CONFIGURATION": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 19 + }, + "TIMEOUT": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 20 + }, + "NO_PRIVILEGE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 21 + }, + "DEVICE_DORMANT": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 22 + }, + "MEDIA_FAILURE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 23 + }, + "BUFFER_OVERFLOW": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 24 + }, + "UPGRADE_SYNTAX_ERROR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 25 + }, + "UPGRADE_DEPENDENCY_NOT_MET": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 26 + }, + "UPGRADE_MISSING": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 27 + }, + "UPGRADE_FRAGMENTED_BY_CLIB": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 28 + }, + "TRUNCATED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 29 + }, + "INVALID_HEADER": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 30 + }, + "WONT_DELETE_CLIB": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 31 + }, + "BAD_REGISTER_VALUE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 32 + }, + "NO_CHANGE_MADE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 33 + }, + "NOT_ATOMIC": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 34 + }, + "CALENDAR_CHANGED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 35 + }, + "WORM_FIELD": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 36 + }, + "CONVERSION_UNSUPPORTED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 37 + }, + "CPU_PERMISSION_FAULT": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 38 + }, + "CPU_SOFTWARE_FAULT": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 39 + }, + "CPU_DECODE_FAULT": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 40 + }, + "CPU_ADDRESS_ACCESS_FAULT": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 41 + }, + "CPU_UNCAUGHT_FAULT": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 42 + }, + "ACCURACY_LOST": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 43 + }, + "EXIT_FAILURE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 44 + }, + "CANT_CANCEL_CALLBACK": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 45 + }, + "RECOVERED_SPACE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 46 + }, + "DRIVE_FULL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 47 + }, + "NO_FILE_HANDLES_AVAILABLE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 48 + }, + "EXCESSIVE_RESTARTS": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 49 + }, + "MPU_SETUP_FAILED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 50 + }, + "DEVICE_NOT_OPEN": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 51 + }, + "NO_RESPONSE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 52 + } + } + }, + "METROLOGYASST": { + "id": 18, + "version": { + "first": 4, + "last": 107 + }, + "registers": { + "ILoopMaxFlowRate": { + "id": 0, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The flow rate that gives max output on the current loop", + "version": { + "first": 5, + "last": 36 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The flow rate that gives max output on the current loop", + "version": { + "first": 82, + "last": 107 + }, + "statictype": "static" + } + ] + }, + "StoreConfiguration": { + "id": 1, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Writing TRUE to this register stores the values of the other registers to the non-volatile memory", + "version": { + "first": 7, + "last": 81 + }, + "statictype": "dynamic" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Writing TRUE to this register stores the values of the other registers to the non-volatile memory", + "version": { + "first": 82, + "last": 107 + }, + "statictype": "dynamic" + } + ] + }, + "PulseWeight": { + "id": 2, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Volume represented by one pulse in ml. If this is zero pulse output will not be enabled", + "version": { + "first": 7, + "last": 81 + }, + "values": { + "default": 1000, + "minimum": 1, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Volume represented by one pulse in ml. If this is zero pulse output will not be enabled", + "version": { + "first": 82, + "last": 101 + }, + "values": { + "default": 1000, + "minimum": 1, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Volume represented by one pulse. Units of (2^-5)ml. If this is zero pulse output will not be enabled", + "version": { + "first": 102, + "last": 107 + }, + "values": { + "default": 32000, + "minimum": 1, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "PulseMode": { + "id": 3, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The way pulses are output on the two available channels. This is an enum of type pulse_mode_t.", + "version": { + "first": 7, + "last": 81 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 6 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The way pulses are output on the two available channels. This is an enum of type pulse_mode_t.", + "version": { + "first": 82, + "last": 97 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 6 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The way pulses are output on the two available channels. This is an enum of type pulse_mode_t.", + "version": { + "first": 98, + "last": 107 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 7 + }, + "statictype": "static" + } + ] + }, + "PulseLength": { + "id": 4, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The length of a pulse. This is an enum of type pulse_length_t.", + "version": { + "first": 7, + "last": 72 + }, + "values": { + "default": 5, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The length of a pulse. This is an enum of type pulse_length_t.", + "version": { + "first": 73, + "last": 81 + }, + "values": { + "default": 4, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The length of a pulse. This is an enum of type pulse_length_t.", + "version": { + "first": 82, + "last": 107 + }, + "values": { + "default": 4, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "FlowUnits": { + "id": 5, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The units of flow rate to display on the LCD. An enum of type displayflowunits_t", + "version": { + "first": 8, + "last": 81 + }, + "values": { + "default": 4, + "minimum": 0, + "maximum": 8 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The units of flow rate to display on the LCD. An enum of type displayflowunits_t", + "version": { + "first": 82, + "last": 107 + }, + "values": { + "default": 4, + "minimum": 0, + "maximum": 8 + }, + "statictype": "static" + } + ] + }, + "FlowPoint": { + "id": 6, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Position of the decimal point on the LCD for flow rate. An enum of type displayflowpoint_t", + "version": { + "first": 8, + "last": 81 + }, + "values": { + "default": 2, + "minimum": 0, + "maximum": 4 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Position of the decimal point on the LCD for flow rate. An enum of type displayflowpoint_t", + "version": { + "first": 82, + "last": 107 + }, + "values": { + "default": 2, + "minimum": 0, + "maximum": 4 + }, + "statictype": "static" + } + ] + }, + "ILoopRate": { + "id": 7, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The update rate for the current loop", + "version": { + "first": 9, + "last": 36 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The update rate for the current loop", + "version": { + "first": 82, + "last": 107 + }, + "statictype": "static" + } + ] + }, + "TemperatureUnits": { + "id": 8, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Units for displaying temperature on the LCD. 0 – Celcius, 1 – Fahrenheit.", + "version": { + "first": 13, + "last": 81 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Units for displaying temperature on the LCD. 0 – Celcius, 1 – Fahrenheit.", + "version": { + "first": 82, + "last": 107 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "static" + } + ] + }, + "PressureUnits": { + "id": 9, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Units for displaying pressure on the LCD. 0 – Mpa, 1 – PSI.", + "version": { + "first": 13, + "last": 81 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Units for displaying pressure on the LCD. 0 – Mpa, 1 – PSI.", + "version": { + "first": 82, + "last": 107 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "static" + } + ] + }, + "PressureRate": { + "id": 10, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time between pressure measurements in milliseconds", + "version": { + "first": 13, + "last": 71 + }, + "values": { + "default": 300000, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time between pressure measurements in milliseconds", + "version": { + "first": 72, + "last": 81 + }, + "values": { + "default": 60000, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time between pressure measurements in milliseconds", + "version": { + "first": 82, + "last": 107 + }, + "values": { + "default": 60000, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "PressureOffset": { + "id": 11, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Value in Pa to subtract from measured value to correct for atmospheric pressure", + "version": { + "first": 13, + "last": 58 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Value in Pa to subtract from measured value to correct for atmospheric pressure", + "version": { + "first": 59, + "last": 79 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Value in Pa to subtract from measured value to correct for atmospheric pressure", + "version": { + "first": 80, + "last": 81 + }, + "values": { + "default": 0, + "minimum": -2000000, + "maximum": 2000000 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Value in Pa to subtract from measured value to correct for atmospheric pressure", + "version": { + "first": 82, + "last": 107 + }, + "values": { + "default": 0, + "minimum": -2000000, + "maximum": 2000000 + }, + "statictype": "static" + } + ] + }, + "PressurePresent": { + "id": 12, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Whether there is a pressure sensor present", + "version": { + "first": 63, + "last": 70 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 1 + }, + "statictype": "static" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Whether there is a pressure sensor present", + "version": { + "first": 71, + "last": 107 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "static" + } + ] + }, + "PressureMeasure": { + "id": 13, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write TRUE to trigger a pressure measurement, Read to get the latest measured value in Pa", + "version": { + "first": 65, + "last": 107 + }, + "statictype": "dynamic" + } + ] + }, + "LatestFlowRate": { + "id": 14, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Returns the latest flow rate. Write 0 to change scaling to internal scaling, 1 to change to display scaling", + "version": { + "first": 92, + "last": 107 + }, + "statictype": "dynamic" + } + ] + }, + "GenerateFwdPulses": { + "id": 15, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Generate some artificial pulses, used for testing", + "version": { + "first": 97, + "last": 107 + }, + "values": { + "minimum": 0, + "maximum": 255 + }, + "statictype": "dynamic" + } + ] + }, + "GenerateRevPulses": { + "id": 16, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Generate some artificial pulses, used for testing", + "version": { + "first": 97, + "last": 107 + }, + "values": { + "minimum": 0, + "maximum": 255 + }, + "statictype": "dynamic" + } + ] + }, + "PulseEvenDistribution": { + "id": 17, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Boolean value for whether pulse output is to space the pulses evenly (TRUE) or grouped (FALSE)", + "version": { + "first": 98, + "last": 107 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 1 + }, + "statictype": "static" + } + ] + }, + "PulseResolution": { + "id": 18, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "The number of bits of fractional resolution in a pulse event", + "version": { + "first": 98, + "last": 107 + }, + "values": { + "minimum": 0, + "maximum": 7 + }, + "statictype": "dynamic" + } + ] + } + }, + "status": { + "BAD_CONFIG": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 0 + }, + "DID_NOT_STORE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 1 + }, + "PENDING_STORE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 2 + } + } + }, + "LOGGER": { + "id": 8, + "version": { + "first": 1, + "last": 17 + }, + "registers": { + "Quota": { + "id": 0, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A quota in bytes for the log. The Logger does not apply any policy to how the quota is allocated, this is left as a restriction to be applied on a product by product basis.", + "version": { + "first": 1, + "last": 17 + }, + "values": { + "default": 4096, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "Drive": { + "id": 1, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The drive to write to.", + "version": { + "first": 1, + "last": 17 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "TriggerLogFlush": { + "id": 2, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Writing TRUE will force a log flush", + "version": { + "first": 7, + "last": 17 + }, + "statictype": "dynamic" + } + ] + }, + "StoreConfiguration": { + "id": 3, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store configuration values to non-volatile storage. Read back for status", + "version": { + "first": 16, + "last": 17 + }, + "statictype": "dynamic" + } + ] + } + }, + "status": { + "UNKNOWN_PARAMETER": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 0 + }, + "RESTARTED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 1 + }, + "BLOCK_LISTING": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 2 + }, + "PENDING_STORE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 3 + }, + "DID_NOT_STORE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 4 + } + } + }, + "TESTMANAGER": { + "id": 98, + "version": { + "first": null, + "last": null + }, + "registers": { + "OutputFile": { + "id": 0, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + }, + "statictype": null + } + ] + }, + "TestNumber": { + "id": 1, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + }, + "statictype": null + } + ] + }, + "TestStatus": { + "id": 2, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + }, + "statictype": null + } + ] + }, + "TrapError": { + "id": 3, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + }, + "statictype": null + } + ] + }, + "TestParameter": { + "id": 4, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + }, + "statictype": null + } + ] + } + }, + "status": { + "FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 0 + }, + "UNKNOWN_PARAMETER": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 1 + }, + "READ_ONLY_PARAMETER": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 2 + }, + "BUSY": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 3 + }, + "STRING_TOO_LONG": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 4 + }, + "FOPEN_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 5 + }, + "FSEEK_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 6 + }, + "FWRITE_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 7 + }, + "FCLOSE_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 8 + }, + "MALFORMED_FILENAME": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 9 + }, + "UNKNOWN_ACTION": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 10 + }, + "FILEREMOVE_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 11 + }, + "FREAD_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 12 + } + } + }, + "PERIODICLOG": { + "id": 17, + "version": { + "first": 1, + "last": 70 + }, + "registers": { + "DataLogContents": { + "id": 0, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit Mask of the items to store in LOG memory", + "version": { + "first": 10, + "last": 70 + }, + "values": { + "default": 201335811, + "minimum": 3, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "DataLogPeriod": { + "id": 1, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Storage Period of the LOG memory in minutes", + "version": { + "first": 10, + "last": 70 + }, + "values": { + "default": 60, + "minimum": 1, + "maximum": 1440 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "AverageFlowPeriod": { + "id": 2, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Averiging period for the Min/Max calculation of LOG&FDR memory", + "version": { + "first": 10, + "last": 70 + }, + "values": { + "default": 5, + "minimum": 1, + "maximum": 60 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "FixedDateReadingContents": { + "id": 3, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit Mask of the items to store in FDR memory", + "version": { + "first": 10, + "last": 70 + }, + "values": { + "default": 201335811, + "minimum": 3, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "FixedDateDayOfMonth": { + "id": 4, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The day of month the FDR storage will take place at 00:00", + "version": { + "first": 10, + "last": 70 + }, + "values": { + "default": 1, + "minimum": 1, + "maximum": 28 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "PeriodicLogLifeTimeCounter": { + "id": 5, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A counter used for internal purposes", + "version": { + "first": 15, + "last": 70 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "dynamic" + } + ] + }, + "ResetCounter": { + "id": 6, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A counter to monitor the application resets", + "version": { + "first": 20, + "last": 70 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated" + } + ] + } + }, + "status": { + "FOPEN": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 0 + }, + "BAD_CONFIG": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 1 + }, + "STRING_TOO_LONG": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 2 + }, + "FILES_IN_USE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 3 + } + } + }, + "POWERMON": { + "id": 1, + "version": { + "first": 17, + "last": 67 + }, + "registers": { + "BatteryVoltage": { + "id": 0, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Measured battery terminal voltage in 1mV units.", + "version": { + "first": 17, + "last": 67 + }, + "statictype": "dynamic" + } + ] + }, + "BatteryManufacturer": { + "id": 1, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "String describing the battery brand.", + "version": { + "first": 17, + "last": 67 + }, + "values": { + "default": "Tadiran" + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "BatterySize": { + "id": 2, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "One of: 0 = battery absent; 1 = built in; 2 = other; 3 = AA; 4 = AAA; 5 = C; 6 = D; 255 = unknown", + "version": { + "first": 17, + "last": 67 + }, + "values": { + "default": 6, + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "BatteryQuantity": { + "id": 4, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "The number of installed batteries.", + "version": { + "first": 17, + "last": 59 + }, + "values": { + "default": 1 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of installed batteries.", + "version": { + "first": 60, + "last": 67 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "BatteryRatedVoltage": { + "id": 5, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Datasheet terminal voltage in 100mV units as manufactured.", + "version": { + "first": 17, + "last": 67 + }, + "values": { + "default": 36, + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "BatteryVoltageMinThreshold": { + "id": 7, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Datasheet terminal voltage in 100mV units below which the cell is considered empty.", + "version": { + "first": 17, + "last": 67 + }, + "values": { + "default": 28, + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "BatterySelection": { + "id": 8, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Chosen manufacturer from the internal lookup table of known batteries.", + "version": { + "first": 20, + "last": 67 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "static" + } + ] + }, + "TotalUsedCharge": { + "id": 9, + "details": [ + { + "type": "uint64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Accumulated charge used in uAs.", + "version": { + "first": 24, + "last": 67 + }, + "statictype": "dynamic" + } + ] + }, + "TotalUsedSeconds": { + "id": 10, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Elapsed time since manufacture in seconds.", + "version": { + "first": 39, + "last": 67 + }, + "statictype": "dynamic" + } + ] + }, + "WarnFromClamp": { + "id": 11, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time in seconds for which the projected end time cannot exceed.", + "version": { + "first": 39, + "last": 67 + }, + "values": { + "default": 473040000, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "BatteryMilliAHrRating": { + "id": 12, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Datasheet capacity in mAh units as manufactured.", + "version": { + "first": 45, + "last": 67 + }, + "values": { + "default": 19000, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "StoreConfiguration": { + "id": 13, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store configuration values to non-volatile storage. Read back for status", + "version": { + "first": 61, + "last": 67 + }, + "statictype": "dynamic" + } + ] + }, + "CriticalRepeatLimit": { + "id": 14, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of 15 minute periods of consecutive low battery voltage required for the battery to be deemed critically low", + "version": { + "first": 66, + "last": 67 + }, + "values": { + "default": 96, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + } + }, + "status": { + "TABLE_FULL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 0 + }, + "UNKNOWN_PARAMETER": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 1 + }, + "OUT_OF_RANGE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 2 + }, + "STOP_CYCLING": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 3 + }, + "TEMPERATURE_LIMIT": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 4 + }, + "BATTERY_STATUS_CHANGED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 5 + }, + "BATTERY_CRITICAL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 6 + }, + "PENDING_STORE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 7 + }, + "DID_NOT_STORE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 8 + } + } + }, + "GENESISFLOW": { + "id": 15, + "version": { + "first": 7, + "last": 605 + }, + "registers": { + "SampleRate": { + "id": 0, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The rate in Hz that each GP30 takes measurements", + "version": { + "first": 7, + "last": 203 + }, + "values": { + "default": 6, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The rate in Hz that each GP30 takes measurements", + "version": { + "first": 204, + "last": 267 + }, + "values": { + "default": 2, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The rate in Hz that each GP30 takes measurements", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 2, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The rate in Hz that each GP30 takes measurements", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 2, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The rate in Hz that each GP30 takes measurements", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 2, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The rate in Hz that each GP30 takes measurements", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 2, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "FirstHitLvlUp1": { + "id": 1, + "details": [ + { + "type": "int8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 1, units of 0.88mV", + "version": { + "first": 7, + "last": 267 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 1, units of 0.88mV", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 1, units of 0.88mV", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 1, units of 0.88mV", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 1, units of 0.88mV", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + } + ] + }, + "FirstHitLvlUp2": { + "id": 2, + "details": [ + { + "type": "int8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 2, units of 0.88mV", + "version": { + "first": 7, + "last": 267 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 2, units of 0.88mV", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 2, units of 0.88mV", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 2, units of 0.88mV", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 2, units of 0.88mV", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + } + ] + }, + "FirstHitLvlUp3": { + "id": 3, + "details": [ + { + "type": "int8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 3, units of 0.88mV", + "version": { + "first": 7, + "last": 267 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 3, units of 0.88mV", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 3, units of 0.88mV", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 3, units of 0.88mV", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 3, units of 0.88mV", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + } + ] + }, + "FirstHitLvlDown1": { + "id": 4, + "details": [ + { + "type": "int8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 1, units of 0.88mV", + "version": { + "first": 7, + "last": 267 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 1, units of 0.88mV", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 1, units of 0.88mV", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 1, units of 0.88mV", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 1, units of 0.88mV", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + } + ] + }, + "FirstHitLvlDown2": { + "id": 5, + "details": [ + { + "type": "int8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 2, units of 0.88mV", + "version": { + "first": 7, + "last": 267 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 2, units of 0.88mV", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 2, units of 0.88mV", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 2, units of 0.88mV", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 2, units of 0.88mV", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + } + ] + }, + "FirstHitLvlDown3": { + "id": 6, + "details": [ + { + "type": "int8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 3, units of 0.88mV", + "version": { + "first": 7, + "last": 267 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 3, units of 0.88mV", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 3, units of 0.88mV", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 3, units of 0.88mV", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 3, units of 0.88mV", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + } + ] + }, + "StartHit": { + "id": 7, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The hit number to consider as the first hit", + "version": { + "first": 7, + "last": 267 + }, + "values": { + "default": 6, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The hit number to consider as the first hit", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 6, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The hit number to consider as the first hit", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 6, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The hit number to consider as the first hit", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 6, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The hit number to consider as the first hit", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 6, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "AmplitudePeakDetectEnd": { + "id": 8, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Where to stop running the amplitude peak detection", + "version": { + "first": 7, + "last": 267 + }, + "values": { + "default": 19, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Where to stop running the amplitude peak detection", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 19, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Where to stop running the amplitude peak detection", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 19, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Where to stop running the amplitude peak detection", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 19, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Where to stop running the amplitude peak detection", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 19, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "NumFirePulses": { + "id": 9, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of pulses to fire for a measurement", + "version": { + "first": 7, + "last": 267 + }, + "values": { + "default": 17, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of pulses to fire for a measurement", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 17, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of pulses to fire for a measurement", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 17, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of pulses to fire for a measurement", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 17, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of pulses to fire for a measurement", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 17, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "DisplayPow10": { + "id": 10, + "details": [ + { + "type": "int8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The weight of the lowest display digit as a power of 10. The accepted range of values depends on the LCD present and the DisplayUnits chosen", + "version": { + "first": 36, + "last": 267 + }, + "values": { + "default": -6, + "minimum": -128, + "maximum": 127 + }, + "statictype": "static" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The weight of the lowest display digit as a power of 10. The accepted range of values depends on the LCD present and the DisplayUnits chosen", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": -6, + "minimum": -128, + "maximum": 127 + }, + "statictype": "static" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The weight of the lowest display digit as a power of 10. The accepted range of values depends on the LCD present and the DisplayUnits chosen", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": -6, + "minimum": -128, + "maximum": 127 + }, + "statictype": "static" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The weight of the lowest display digit as a power of 10. The accepted range of values depends on the LCD present and the DisplayUnits chosen", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": -6, + "minimum": -128, + "maximum": 127 + }, + "statictype": "static" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The weight of the lowest display digit as a power of 10. The accepted range of values depends on the LCD present and the DisplayUnits chosen", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": -6, + "minimum": -128, + "maximum": 127 + }, + "statictype": "static" + } + ] + }, + "DisplayUnits": { + "id": 11, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The units of volume to display. The accepted range of values depends on the LCD present and the DisplayPow10 chosen", + "version": { + "first": 36, + "last": 267 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 6 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The units of volume to display. The accepted range of values depends on the LCD present and the DisplayPow10 chosen", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 6 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The units of volume to display. The accepted range of values depends on the LCD present and the DisplayPow10 chosen", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 6 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The units of volume to display. The accepted range of values depends on the LCD present and the DisplayPow10 chosen", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 6 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The units of volume to display. The accepted range of values depends on the LCD present and the DisplayPow10 chosen", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 6 + }, + "statictype": "static" + } + ] + }, + "MeterSize": { + "id": 12, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The meter pipe size", + "version": { + "first": 45, + "last": 237 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 9 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The meter pipe size", + "version": { + "first": 238, + "last": 267 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 17 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The meter pipe size", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 17 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The meter pipe size", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 17 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The meter pipe size", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 17 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The meter pipe size", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 17 + }, + "statictype": "static" + } + ] + }, + "CalFactor1": { + "id": 13, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 1", + "version": { + "first": 45, + "last": 204 + }, + "values": { + "default": 62500, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 1", + "version": { + "first": 201, + "last": 267 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 1", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 1", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 1", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 1", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + } + ] + }, + "CalFactor2": { + "id": 14, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 2", + "version": { + "first": 45, + "last": 204 + }, + "values": { + "default": 62500, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 2", + "version": { + "first": 201, + "last": 267 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 2", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 2", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 2", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 2", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + } + ] + }, + "CalFactor3": { + "id": 15, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 3", + "version": { + "first": 45, + "last": 204 + }, + "values": { + "default": 62500, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 3", + "version": { + "first": 201, + "last": 267 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 3", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 3", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 3", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 3", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + } + ] + }, + "ZeroOffset1": { + "id": 16, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 1 at zero flow. Value is in usual time of flight scaling (ie LS bit is 2^-38 seconds)", + "version": { + "first": 45, + "last": 132 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 1 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 133, + "last": 267 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 1 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 1 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 1 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 1 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + } + ] + }, + "ZeroOffset2": { + "id": 17, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 2 at zero flow. Value is in usual time of flight scaling (ie LS bit is 2^-38 seconds)", + "version": { + "first": 45, + "last": 132 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 2 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 133, + "last": 267 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 2 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 2 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 2 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 2 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + } + ] + }, + "ZeroOffset3": { + "id": 18, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 3 at zero flow. Value is in usual time of flight scaling (ie LS bit is 2^-38 seconds)", + "version": { + "first": 45, + "last": 132 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 3 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 133, + "last": 267 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 3 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 3 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 3 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 3 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + } + ] + }, + "ScaledBilling": { + "id": 19, + "details": [ + { + "type": "int64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "The scaled volume value shown on the display. In the units and precision set by DisplayUnits and DisplayPow10 respectively. Decimal point is not represented in this value", + "version": { + "first": 47, + "last": 295 + }, + "statictype": "dynamic" + }, + { + "type": "int64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "The scaled volume value shown on the display. In the units and precision set by DisplayUnits and DisplayPow10 respectively. Decimal point is not represented in this value", + "version": { + "first": 450, + "last": 459 + }, + "statictype": "dynamic" + }, + { + "type": "int64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "The scaled volume value shown on the display. In the units and precision set by DisplayUnits and DisplayPow10 respectively. Decimal point is not represented in this value", + "version": { + "first": 500, + "last": 508 + }, + "statictype": "dynamic" + }, + { + "type": "int64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "The scaled volume value shown on the display. In the units and precision set by DisplayUnits and DisplayPow10 respectively. Decimal point is not represented in this value", + "version": { + "first": 601, + "last": 605 + }, + "statictype": "dynamic" + } + ] + }, + "ResetAccumulators": { + "id": 20, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "WO", + "lvl2": "WO", + "lvl3": "WO", + "lvl4": "WO", + "lvl5": "WO", + "lvl6": "WO", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write 1 to reset all accumulated volume to zero", + "version": { + "first": 47, + "last": 267 + }, + "statictype": "dynamic" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write 1 to reset all accumulated volume to zero", + "version": { + "first": 268, + "last": 295 + }, + "statictype": "dynamic" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write 1 to reset all accumulated volume to zero", + "version": { + "first": 450, + "last": 459 + }, + "statictype": "dynamic" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write 1 to reset all accumulated volume to zero", + "version": { + "first": 500, + "last": 508 + }, + "statictype": "dynamic" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write 1 to reset all accumulated volume to zero", + "version": { + "first": 601, + "last": 605 + }, + "statictype": "dynamic" + } + ] + }, + "ForwardArrow": { + "id": 21, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The forward flow direction. 0 - undecided, 1 - right, 2 - left", + "version": { + "first": 47, + "last": 267 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 2 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The forward flow direction. 0 - undecided, 1 - right, 2 - left", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 2 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The forward flow direction. 0 - undecided, 1 - right, 2 - left", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 2 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The forward flow direction. 0 - undecided, 1 - right, 2 - left", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 2 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The forward flow direction. 0 - undecided, 1 - right, 2 - left", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 2 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "LedMode": { + "id": 22, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The type of data output by the green LED", + "version": { + "first": 47, + "last": 203 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 6 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The type of data output by the green LED", + "version": { + "first": 204, + "last": 267 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 6 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The type of data output by the green LED", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 6 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The type of data output by the green LED", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 6 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The type of data output by the green LED", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 6 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The type of data output by the green LED", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 6 + }, + "statictype": "static" + } + ] + }, + "StoreCalibration": { + "id": 23, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store calibration values to non-volatile storage. Read back for status", + "version": { + "first": 54, + "last": 295 + }, + "statictype": "dynamic" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store calibration values to non-volatile storage. Read back for status", + "version": { + "first": 450, + "last": 459 + }, + "statictype": "dynamic" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store calibration values to non-volatile storage. Read back for status", + "version": { + "first": 500, + "last": 508 + }, + "statictype": "dynamic" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store calibration values to non-volatile storage. Read back for status", + "version": { + "first": 601, + "last": 605 + }, + "statictype": "dynamic" + } + ] + }, + "UnscaledFwd": { + "id": 24, + "details": [ + { + "type": "uint64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The forward flow accumulator volume. The scale depends on the meter size", + "version": { + "first": 54, + "last": 295 + }, + "statictype": "dynamic" + }, + { + "type": "uint64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The forward flow accumulator volume. The scale depends on the meter size", + "version": { + "first": 450, + "last": 459 + }, + "statictype": "dynamic" + }, + { + "type": "uint64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The forward flow accumulator volume. The scale depends on the meter size", + "version": { + "first": 500, + "last": 508 + }, + "statictype": "dynamic" + }, + { + "type": "uint64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The forward flow accumulator volume. The scale depends on the meter size", + "version": { + "first": 601, + "last": 605 + }, + "statictype": "dynamic" + } + ] + }, + "UnscaledRev": { + "id": 25, + "details": [ + { + "type": "uint64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The reverse flow accumulator volume. The scale depends on the meter size", + "version": { + "first": 54, + "last": 295 + }, + "statictype": "dynamic" + }, + { + "type": "uint64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The reverse flow accumulator volume. The scale depends on the meter size", + "version": { + "first": 450, + "last": 459 + }, + "statictype": "dynamic" + }, + { + "type": "uint64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The reverse flow accumulator volume. The scale depends on the meter size", + "version": { + "first": 500, + "last": 508 + }, + "statictype": "dynamic" + }, + { + "type": "uint64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The reverse flow accumulator volume. The scale depends on the meter size", + "version": { + "first": 601, + "last": 605 + }, + "statictype": "dynamic" + } + ] + }, + "LowFlowThreshold": { + "id": 26, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The volume that must pass in LowFlowMaxPeriod for it to be registered as real flow. Units of ml", + "version": { + "first": 55, + "last": 267 + }, + "values": { + "default": 200, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The volume that must pass in LowFlowMaxPeriod for it to be registered as real flow. Units of ml", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 200, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The volume that must pass in LowFlowMaxPeriod for it to be registered as real flow. Units of ml", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 200, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The volume that must pass in LowFlowMaxPeriod for it to be registered as real flow. Units of ml", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 200, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The volume that must pass in LowFlowMaxPeriod for it to be registered as real flow. Units of ml", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 200, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "LowFlowMaxPeriod": { + "id": 27, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The time during which LowFlowThreshold volume must pass for it to be registered as real flow. Units of seconds << 16", + "version": { + "first": 55, + "last": 267 + }, + "values": { + "default": 3932160, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The time during which LowFlowThreshold volume must pass for it to be registered as real flow. Units of seconds << 16", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 3932160, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The time during which LowFlowThreshold volume must pass for it to be registered as real flow. Units of seconds << 16", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 3932160, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The time during which LowFlowThreshold volume must pass for it to be registered as real flow. Units of seconds << 16", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 3932160, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The time during which LowFlowThreshold volume must pass for it to be registered as real flow. Units of seconds << 16", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 3932160, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "UpdateThreshold": { + "id": 28, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The amount of flow in ml to accumulate before updating the main scaled accumulators.", + "version": { + "first": 55, + "last": 267 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The amount of flow in ml to accumulate before updating the main scaled accumulators.", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The amount of flow in ml to accumulate before updating the main scaled accumulators.", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The amount of flow in ml to accumulate before updating the main scaled accumulators.", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The amount of flow in ml to accumulate before updating the main scaled accumulators.", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "ArrowThreshold": { + "id": 29, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The net volume in ml that must flow in one direction for the forward arrow to be set", + "version": { + "first": 55, + "last": 267 + }, + "values": { + "default": 5000000, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The net volume in ml that must flow in one direction for the forward arrow to be set", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 5000000, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The net volume in ml that must flow in one direction for the forward arrow to be set", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 5000000, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The net volume in ml that must flow in one direction for the forward arrow to be set", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 5000000, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The net volume in ml that must flow in one direction for the forward arrow to be set", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 5000000, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "FireBuffer1": { + "id": 30, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 1 to be used", + "version": { + "first": 64, + "last": 267 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 1 to be used", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 1 to be used", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 1 to be used", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 1 to be used", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "FireBuffer2": { + "id": 31, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 2 to be used", + "version": { + "first": 64, + "last": 267 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 2 to be used", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 2 to be used", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 2 to be used", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 2 to be used", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "FireBuffer3": { + "id": 32, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 3 to be used", + "version": { + "first": 64, + "last": 267 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 3 to be used", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 3 to be used", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 3 to be used", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 3 to be used", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "TriggerActive": { + "id": 33, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "WO", + "lvl2": "WO", + "lvl3": "WO", + "lvl4": "WO", + "lvl5": "WO", + "lvl6": "WO", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write 1 to put GenesisFlow in Active mode. This is the normal measurement mode", + "version": { + "first": 75, + "last": 267 + }, + "statictype": "dynamic" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "WO", + "lvl4": "NA", + "lvl5": "WO", + "lvl6": "WO", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write 1 to put GenesisFlow in Active mode. This is the normal measurement mode", + "version": { + "first": 268, + "last": 295 + }, + "statictype": "dynamic" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "WO", + "lvl4": "NA", + "lvl5": "WO", + "lvl6": "WO", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write 1 to put GenesisFlow in Active mode. This is the normal measurement mode", + "version": { + "first": 450, + "last": 459 + }, + "statictype": "dynamic" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "WO", + "lvl4": "NA", + "lvl5": "WO", + "lvl6": "WO", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write 1 to put GenesisFlow in Active mode. This is the normal measurement mode", + "version": { + "first": 500, + "last": 508 + }, + "statictype": "dynamic" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "WO", + "lvl4": "NA", + "lvl5": "WO", + "lvl6": "WO", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write 1 to put GenesisFlow in Active mode. This is the normal measurement mode", + "version": { + "first": 601, + "last": 605 + }, + "statictype": "dynamic" + } + ] + }, + "TriggerIdle": { + "id": 34, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 0 to put GenesisFlow in Active mode, otherwise put GenesisFlow in Idle mode. Idle mode displays just the number written to TriggerIdle. No measurements are performed. Read returns the number written", + "version": { + "first": 75, + "last": 295 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "dynamic" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 0 to put GenesisFlow in Active mode, otherwise put GenesisFlow in Idle mode. Idle mode displays just the number written to TriggerIdle. No measurements are performed. Read returns the number written", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "dynamic" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 0 to put GenesisFlow in Active mode, otherwise put GenesisFlow in Idle mode. Idle mode displays just the number written to TriggerIdle. No measurements are performed. Read returns the number written", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "dynamic" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 0 to put GenesisFlow in Active mode, otherwise put GenesisFlow in Idle mode. Idle mode displays just the number written to TriggerIdle. No measurements are performed. Read returns the number written", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "dynamic" + } + ] + }, + "MaxValidDeltaToF": { + "id": 35, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum delta time of flight, above this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 87, + "last": 267 + }, + "values": { + "default": 247390, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum delta time of flight, above this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 309237, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum delta time of flight, above this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 309237, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum delta time of flight, above this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 309237, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum delta time of flight, above this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 309237, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "MaxValidToF": { + "id": 36, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum absolute time of flight, above this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 87, + "last": 267 + }, + "values": { + "default": 24739011, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum absolute time of flight, above this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 24739011, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum absolute time of flight, above this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 24739011, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum absolute time of flight, above this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 24739011, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum absolute time of flight, above this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 24739011, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "MinValidToF": { + "id": 37, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The minimum absolute time of flight, below this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 87, + "last": 267 + }, + "values": { + "default": 13743895, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The minimum absolute time of flight, below this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 13743895, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The minimum absolute time of flight, below this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 13743895, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The minimum absolute time of flight, below this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 13743895, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The minimum absolute time of flight, below this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 13743895, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "FirstHitPercent1": { + "id": 38, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 1", + "version": { + "first": 93, + "last": 267 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 1", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 1", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 1", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 1", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "FirstHitPercent2": { + "id": 39, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 2", + "version": { + "first": 93, + "last": 267 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 2", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 2", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 2", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 2", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "FirstHitPercent3": { + "id": 40, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 3", + "version": { + "first": 93, + "last": 267 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 3", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 3", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 3", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 3", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "FirstHitShift": { + "id": 41, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A value describing how long the amplitude is averaged over for calculating the first hit level. This is the amount each amplitude value is shifted down before being added to the moving average", + "version": { + "first": 93, + "last": 267 + }, + "values": { + "default": 4, + "minimum": 3, + "maximum": 8 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A value describing how long the amplitude is averaged over for calculating the first hit level. This is the amount each amplitude value is shifted down before being added to the moving average", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 4, + "minimum": 3, + "maximum": 8 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A value describing how long the amplitude is averaged over for calculating the first hit level. This is the amount each amplitude value is shifted down before being added to the moving average", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 4, + "minimum": 3, + "maximum": 8 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A value describing how long the amplitude is averaged over for calculating the first hit level. This is the amount each amplitude value is shifted down before being added to the moving average", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 4, + "minimum": 3, + "maximum": 8 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A value describing how long the amplitude is averaged over for calculating the first hit level. This is the amount each amplitude value is shifted down before being added to the moving average", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 4, + "minimum": 3, + "maximum": 8 + }, + "statictype": "static" + } + ] + }, + "FirstHitMinimum": { + "id": 42, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Minimum absolute first hit level value", + "version": { + "first": 93, + "last": 267 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Minimum absolute first hit level value", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Minimum absolute first hit level value", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Minimum absolute first hit level value", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Minimum absolute first hit level value", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "ToFErrorLimit": { + "id": 43, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of ToF errors to allow before resetting the first hit levels to FirstHitMinimum", + "version": { + "first": 93, + "last": 267 + }, + "values": { + "default": 16, + "minimum": 1, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of ToF errors to allow before resetting the first hit levels to FirstHitMinimum", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 16, + "minimum": 1, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of ToF errors to allow before resetting the first hit levels to FirstHitMinimum", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 16, + "minimum": 1, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of ToF errors to allow before resetting the first hit levels to FirstHitMinimum", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 16, + "minimum": 1, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of ToF errors to allow before resetting the first hit levels to FirstHitMinimum", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 16, + "minimum": 1, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "FirstHitUpdatePeriod": { + "id": 44, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The period (in seconds) between first hit level updates", + "version": { + "first": 99, + "last": 267 + }, + "values": { + "default": 10, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The period (in seconds) between first hit level updates", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 10, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The period (in seconds) between first hit level updates", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 10, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The period (in seconds) between first hit level updates", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 10, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The period (in seconds) between first hit level updates", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 10, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "PipeFillingDelay": { + "id": 45, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The time (in seconds) to maintain zero flow after leaving empty pipe", + "version": { + "first": 119, + "last": 267 + }, + "values": { + "default": 30, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The time (in seconds) to maintain zero flow after leaving empty pipe", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 30, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The time (in seconds) to maintain zero flow after leaving empty pipe", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 30, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The time (in seconds) to maintain zero flow after leaving empty pipe", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 30, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The time (in seconds) to maintain zero flow after leaving empty pipe", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 30, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "ToFTempOffset1": { + "id": 46, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 1. In units of 2^-38 seconds", + "version": { + "first": 124, + "last": 267 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 1. In units of 2^-38 seconds", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 1. In units of 2^-38 seconds", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 1. In units of 2^-38 seconds", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 1. In units of 2^-38 seconds", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "ToFTempOffset2": { + "id": 47, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 2. In units of 2^-38 seconds", + "version": { + "first": 124, + "last": 267 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 2. In units of 2^-38 seconds", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 2. In units of 2^-38 seconds", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 2. In units of 2^-38 seconds", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 2. In units of 2^-38 seconds", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "ToFTempOffset3": { + "id": 48, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 3. In units of 2^-38 seconds", + "version": { + "first": 124, + "last": 267 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 3. In units of 2^-38 seconds", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 3. In units of 2^-38 seconds", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 3. In units of 2^-38 seconds", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 3. In units of 2^-38 seconds", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "ToFTempCalibrate": { + "id": 49, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "WO", + "lvl2": "WO", + "lvl3": "WO", + "lvl4": "WO", + "lvl5": "WO", + "lvl6": "WO", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write the current temperature to this register to trigger a calibration step. In units of 2^-12 degrees celcius", + "version": { + "first": 124, + "last": 204 + }, + "values": { + "minimum": 0, + "maximum": 270336 + }, + "statictype": "dynamic" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write the current temperature to this register to trigger a calibration step. In units of 2^-12 degrees celcius", + "version": { + "first": 205, + "last": 295 + }, + "values": { + "minimum": 0, + "maximum": 286720 + }, + "statictype": "dynamic" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write the current temperature to this register to trigger a calibration step. In units of 2^-12 degrees celcius", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "minimum": 0, + "maximum": 286720 + }, + "statictype": "dynamic" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write the current temperature to this register to trigger a calibration step. In units of 2^-12 degrees celcius", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "minimum": 0, + "maximum": 286720 + }, + "statictype": "dynamic" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write the current temperature to this register to trigger a calibration step. In units of 2^-12 degrees celcius", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "minimum": 0, + "maximum": 286720 + }, + "statictype": "dynamic" + } + ] + }, + "StoreConfiguration": { + "id": 50, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store configuration values to non-volatile storage. Read back for status", + "version": { + "first": 141, + "last": 267 + }, + "statictype": "dynamic" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store configuration values to non-volatile storage. Read back for status", + "version": { + "first": 268, + "last": 295 + }, + "statictype": "dynamic" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store configuration values to non-volatile storage. Read back for status", + "version": { + "first": 450, + "last": 459 + }, + "statictype": "dynamic" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store configuration values to non-volatile storage. Read back for status", + "version": { + "first": 500, + "last": 508 + }, + "statictype": "dynamic" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store configuration values to non-volatile storage. Read back for status", + "version": { + "first": 601, + "last": 605 + }, + "statictype": "dynamic" + } + ] + }, + "SealDisplay": { + "id": 51, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to stop various display related registers being changed. Read back 1 for 'sealed' 0 for 'unsealed'", + "version": { + "first": 161, + "last": 267 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "static" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to stop various display related registers being changed. Read back 1 for 'sealed' 0 for 'unsealed'", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "static" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to stop various display related registers being changed. Read back 1 for 'sealed' 0 for 'unsealed'", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "static" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to stop various display related registers being changed. Read back 1 for 'sealed' 0 for 'unsealed'", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "static" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to stop various display related registers being changed. Read back 1 for 'sealed' 0 for 'unsealed'", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "static" + } + ] + }, + "TriggerTest": { + "id": 52, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to put GenesisFlow in Test mode. This differs from normal measurement mode in that the volume is presented to 3 extra decimal places if possible. Read back 1 for Test mode, 0 otherwise", + "version": { + "first": 162, + "last": 267 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "dynamic" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to put GenesisFlow in Test mode. This differs from normal measurement mode in that the volume is presented to 3 extra decimal places if possible. Read back 1 for Test mode, 0 otherwise", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "dynamic" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to put GenesisFlow in Test mode. This differs from normal measurement mode in that the volume is presented to 3 extra decimal places if possible. Read back 1 for Test mode, 0 otherwise", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "dynamic" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to put GenesisFlow in Test mode. This differs from normal measurement mode in that the volume is presented to 3 extra decimal places if possible. Read back 1 for Test mode, 0 otherwise", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "dynamic" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to put GenesisFlow in Test mode. This differs from normal measurement mode in that the volume is presented to 3 extra decimal places if possible. Read back 1 for Test mode, 0 otherwise", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "dynamic" + } + ] + }, + "MaxValidAmplitude": { + "id": 53, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Maximum amplitude for a valid signal in 2^-22mV units", + "version": { + "first": 168, + "last": 267 + }, + "values": { + "default": 2936012800, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Maximum amplitude for a valid signal in 2^-22mV units", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 2936012800, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Maximum amplitude for a valid signal in 2^-22mV units", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 2936012800, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Maximum amplitude for a valid signal in 2^-22mV units", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 2936012800, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Maximum amplitude for a valid signal in 2^-22mV units", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 2936012800, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "MinValidAmplitude": { + "id": 54, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Minimum amplitude for a valid signal in 2^-22mV units", + "version": { + "first": 168, + "last": 267 + }, + "values": { + "default": 209715200, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Minimum amplitude for a valid signal in 2^-22mV units", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 209715200, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Minimum amplitude for a valid signal in 2^-22mV units", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 209715200, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Minimum amplitude for a valid signal in 2^-22mV units", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 209715200, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Minimum amplitude for a valid signal in 2^-22mV units", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 209715200, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "HardErrorLimit": { + "id": 55, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Number of hard errors to allow before declaring a fatal error", + "version": { + "first": 176, + "last": 267 + }, + "values": { + "default": 4, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Number of hard errors to allow before declaring a fatal error", + "version": { + "first": 268, + "last": 295 + }, + "values": { + "default": 4, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Number of hard errors to allow before declaring a fatal error", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 4, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Number of hard errors to allow before declaring a fatal error", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 4, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Number of hard errors to allow before declaring a fatal error", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 4, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + } + ] + }, + "Timeout": { + "id": 56, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The timeout for an ultrasonic measurement (0 - 128us, 1 - 256us, 2 - 1024us, 3 - 4096us)", + "version": { + "first": 273, + "last": 295 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The timeout for an ultrasonic measurement (0 - 128us, 1 - 256us, 2 - 1024us, 3 - 4096us)", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The timeout for an ultrasonic measurement (0 - 128us, 1 - 256us, 2 - 1024us, 3 - 4096us)", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The timeout for an ultrasonic measurement (0 - 128us, 1 - 256us, 2 - 1024us, 3 - 4096us)", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "MaxDeltaToFDeviation": { + "id": 57, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum deviation of a valid delta tof from the recent mean. In 2^-38 seconds units", + "version": { + "first": 280, + "last": 295 + }, + "values": { + "default": 109951, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum deviation of a valid delta tof from the recent mean. In 2^-38 seconds units", + "version": { + "first": 450, + "last": 459 + }, + "values": { + "default": 109951, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum deviation of a valid delta tof from the recent mean. In 2^-38 seconds units", + "version": { + "first": 500, + "last": 508 + }, + "values": { + "default": 109951, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum deviation of a valid delta tof from the recent mean. In 2^-38 seconds units", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 109951, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "MaxTempRange": { + "id": 58, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum range of temperatures between channels before one is rejected. In units of 2^-12 degrees celcius", + "version": { + "first": 289, + "last": 295 + }, + "values": { + "default": 8192, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum range of temperatures between channels before one is rejected. In units of 2^-12 degrees celcius", + "version": { + "first": 451, + "last": 459 + }, + "values": { + "default": 8192, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum range of temperatures between channels before one is rejected. In units of 2^-12 degrees celcius", + "version": { + "first": 504, + "last": 508 + }, + "values": { + "default": 8192, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum range of temperatures between channels before one is rejected. In units of 2^-12 degrees celcius", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 8192, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "MaxDeltaToFRange": { + "id": 59, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum range of delta time of flight between channels before one is rejected. In 2^-38 seconds units", + "version": { + "first": 289, + "last": 295 + }, + "values": { + "default": 137438, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum range of delta time of flight between channels before one is rejected. In 2^-38 seconds units", + "version": { + "first": 451, + "last": 459 + }, + "values": { + "default": 137438, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum range of delta time of flight between channels before one is rejected. In 2^-38 seconds units", + "version": { + "first": 504, + "last": 508 + }, + "values": { + "default": 137438, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum range of delta time of flight between channels before one is rejected. In 2^-38 seconds units", + "version": { + "first": 601, + "last": 605 + }, + "values": { + "default": 137438, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + } + }, + "status": { + "BAD_TEST": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 0 + }, + "BAD_CONFIG": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 1 + }, + "DID_NOT_STORE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 2 + }, + "STORE_PENDING": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 3 + }, + "STORE_BUFFER_SIZE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 4 + }, + "STRING_TOO_LONG": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 5 + }, + "BAD_DISPLAY_MODE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 6 + }, + "GLASS_TOO_LONG": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 7 + }, + "SLOT_NOT_YOURS": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 8 + }, + "SUBLIST_TOO_LONG": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 9 + }, + "NO_TEMP_SENSOR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 10 + }, + "UNDER_TEMP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 11 + }, + "LOW_TEMP_WARNING": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 12 + }, + "HIGH_TEMP_WARNING": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 13 + }, + "OVER_TEMP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 14 + }, + "MISMATCHING_LSB": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 15 + }, + "OUT_OF_RANGE_PWDIFF": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 16 + }, + "OUT_OF_RANGE_AMPLITUDE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 17 + }, + "OUT_OF_RANGE_TOF": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 18 + }, + "OUT_OF_RANGE_DTOF": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 19 + }, + "TOF_TIMEOUT": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 20 + }, + "CAL_CHANGE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 21 + }, + "OUT_OF_RANGE_INTERVAL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 22 + }, + "VALIDATE_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 23 + }, + "OUT_OF_RANGE_TEMP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 24 + }, + "NOT_READY": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 25 + }, + "METROLOGY_ERROR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 26 + }, + "GP30_ID_ERROR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 27 + }, + "GP30_FLAG_ERROR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 28 + }, + "GP30_TIMEOUT_ERROR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 29 + }, + "GP30_REQUEST_ERROR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 30 + }, + "GP30_SEQ_ERROR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 31 + }, + "VALUE_SEALED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 32 + }, + "IN_TEST_MODE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 33 + }, + "UNKNOWN_STATE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 34 + }, + "DISPLAY_INIT_SUCCEEDED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 35 + }, + "DISPLAY_INIT_FAILED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 36 + }, + "GP30_INIT_FAILED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 37 + }, + "START_TIMER_SUCCEEDED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 38 + }, + "START_TIMER_FAILED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 39 + }, + "VOLUME_STORE_FAILED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 40 + }, + "EMPTY_PIPE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 41 + }, + "PARAMETER_ERROR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 42 + }, + "GP30_INTERNAL_ERROR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 43 + }, + "GLASS_TOO_SHORT": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 44 + }, + "STORE_CAL_FAILED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 45 + }, + "STORE_CONF_FAILED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 46 + }, + "MODE_CHANGE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 47 + }, + "BAD_POW10": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 48 + }, + "BAD_DECIMAL_SEPARATOR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 49 + }, + "BAD_UNITS": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 50 + }, + "BAD_ICONS": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 51 + }, + "BAD_THOUSAND_SEPARATOR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 52 + }, + "NEW_LOCALE_REJECTED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 53 + }, + "SET_ACCUMULATORS": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 54 + }, + "SEAL_OPENED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 55 + }, + "CALIBRATION_RECALL_INCOMPLETE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 56 + }, + "BAD_AMR_SETTINGS": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 57 + }, + "SUSPECT_CYCLE_SKIP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 58 + } + } + }, + "IRDA": { + "id": 20, + "version": { + "first": 10, + "last": 198 + }, + "registers": { + "PulseReportRate": { + "id": 0, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The rate at which pulse reports are sent to the IrDA pulse adapter", + "version": { + "first": 10, + "last": 97 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The rate at which pulse reports are sent to the IrDA pulse adapter", + "version": { + "first": 98, + "last": 136 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The rate at which pulse reports are sent to the IrDA pulse adapter", + "version": { + "first": 161, + "last": 198 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "AdapterPresenceLimit": { + "id": 1, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of 15 minute periods we have to have received no valid IrDA messages to assume there is no adapter present", + "version": { + "first": 18, + "last": 28 + }, + "values": { + "default": 1, + "minimum": 1, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of 15 minute periods we have to have received no valid IrDA messages to assume there is no adapter present", + "version": { + "first": 29, + "last": 97 + }, + "values": { + "default": 3, + "minimum": 1, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of 15 minute periods we have to have received no valid IrDA messages to assume there is no adapter present", + "version": { + "first": 98, + "last": 136 + }, + "values": { + "default": 3, + "minimum": 1, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of 15 minute periods we have to have received no valid IrDA messages to assume there is no adapter present", + "version": { + "first": 161, + "last": 198 + }, + "values": { + "default": 3, + "minimum": 1, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "PulseSequence": { + "id": 2, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The present sequence number used in pulse reports", + "version": { + "first": 26, + "last": 97 + }, + "values": { + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The present sequence number used in pulse reports", + "version": { + "first": 98, + "last": 114 + }, + "values": { + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The present sequence number used in pulse reports", + "version": { + "first": 115, + "last": 136 + }, + "values": { + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The present sequence number used in pulse reports", + "version": { + "first": 161, + "last": 198 + }, + "values": { + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "StoreConfiguration": { + "id": 3, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store configuration values to non-volatile storage. Read back for status", + "version": { + "first": 26, + "last": 97 + }, + "statictype": "dynamic" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store configuration values to non-volatile storage. Read back for status", + "version": { + "first": 98, + "last": 136 + }, + "statictype": "dynamic" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store configuration values to non-volatile storage. Read back for status", + "version": { + "first": 161, + "last": 198 + }, + "statictype": "dynamic" + } + ] + }, + "AMRDigits": { + "id": 4, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of digits to use for AMR", + "version": { + "first": 40, + "last": 53 + }, + "values": { + "default": 9, + "minimum": 0, + "maximum": 9 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of digits to use for AMR", + "version": { + "first": 53, + "last": 97 + }, + "values": { + "default": 9, + "minimum": 0, + "maximum": 9 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of digits to use for AMR", + "version": { + "first": 98, + "last": 136 + }, + "values": { + "default": 8, + "minimum": 0, + "maximum": 9 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of digits to use for AMR", + "version": { + "first": 161, + "last": 198 + }, + "values": { + "default": 8, + "minimum": 0, + "maximum": 9 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "AMROffset": { + "id": 5, + "details": [ + { + "type": "int8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The offset of the AMR smallest digit from the right (always negative)", + "version": { + "first": 40, + "last": 97 + }, + "values": { + "default": 0, + "minimum": -9, + "maximum": 0 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The offset of the AMR smallest digit from the right (always negative)", + "version": { + "first": 98, + "last": 136 + }, + "values": { + "default": 0, + "minimum": -9, + "maximum": 0 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The offset of the AMR smallest digit from the right (always negative)", + "version": { + "first": 161, + "last": 198 + }, + "values": { + "default": 0, + "minimum": -9, + "maximum": 0 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "UI1203Fields": { + "id": 6, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A bitfield of the optional fields being used for UI-1203", + "version": { + "first": 40, + "last": 97 + }, + "values": { + "default": 268, + "minimum": 0, + "maximum": 268 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A bitfield of the optional fields being used for UI-1203", + "version": { + "first": 98, + "last": 136 + }, + "values": { + "default": 268, + "minimum": 0, + "maximum": 268 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A bitfield of the optional fields being used for UI-1203", + "version": { + "first": 161, + "last": 198 + }, + "values": { + "default": 268, + "minimum": 0, + "maximum": 268 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "MfgDate": { + "id": 7, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A timestamp of meter manufacture in seconds since 1/1/2000 00:00:00 UTC", + "version": { + "first": 43, + "last": 136 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A timestamp of meter manufacture in seconds since 1/1/2000 00:00:00 UTC", + "version": { + "first": 161, + "last": 198 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "DisplayAMRDigits": { + "id": 8, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Whether or not to display AMR digits on the screen", + "version": { + "first": 92, + "last": 97 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Whether or not to display AMR digits on the screen", + "version": { + "first": 98, + "last": 136 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Whether or not to display AMR digits on the screen", + "version": { + "first": 161, + "last": 198 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "AdapterID": { + "id": 9, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "The serial number of the current pulse adapter", + "version": { + "first": 193, + "last": 198 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "AdapterFwVersion": { + "id": 10, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "The firmware version of the current pulse adapter", + "version": { + "first": 193, + "last": 198 + }, + "statictype": "infrequentlyupdated" + } + ] + } + }, + "status": { + "BAD_CONFIG": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 0 + }, + "BAD_LENGTH": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 1 + }, + "OUT_OF_RANGE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 2 + }, + "PENDING_STORE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 3 + }, + "DID_NOT_STORE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 4 + }, + "TOO_MANY_BYTES": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 5 + } + } + }, + "NA2WALARMS": { + "id": 23, + "version": { + "first": 41, + "last": 98 + }, + "registers": { + "StoreConfiguration": { + "id": 0, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store configuration values to non-volatile storage. Read back for status", + "version": { + "first": 41, + "last": 98 + }, + "statictype": "dynamic" + } + ] + }, + "PredefEnable": { + "id": 1, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bitmask of enabled predefined alarms", + "version": { + "first": 41, + "last": 98 + }, + "values": { + "default": 561047, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated" + } + ] + } + }, + "status": { + "SENSOR_INVALID": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 0 + }, + "UNKNOWN_PARAMETER": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 1 + }, + "ALARM_INVALID": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 2 + }, + "UNIMPLEMENTED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 3 + }, + "UNCONFIGURED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 4 + }, + "CONFIG_INVALID": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 5 + }, + "NO_LATEST": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 6 + }, + "FIXED_TYPE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 7 + }, + "PREDEF_SET": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 8 + }, + "USERDEF_VOLUME_SET": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 9 + }, + "USERDEF_TEMPERATURE_SET": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 10 + }, + "USERDEF_PRESSURE_SET": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 11 + }, + "PREDEF_CLEAR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 12 + }, + "USERDEF_VOLUME_CLEAR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 13 + }, + "USERDEF_TEMPERATURE_CLEAR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 14 + }, + "USERDEF_PRESSURE_CLEAR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 15 + }, + "DID_NOT_STORE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 16 + }, + "STORE_PENDING": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 17 + }, + "PREDEF_BACKUP_FAILED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 18 + }, + "PREDEF_RESTORE_FAILED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 19 + }, + "USERDEF_BACKUP_FAILED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 20 + }, + "USERDEF_RESTORE_FAILED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 21 + }, + "USERDEF_UNSUPPORTED_TYPE_FOR_SENSOR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 22 + } + } + }, + "NA2WLOGGER": { + "id": 22, + "version": { + "first": 1, + "last": 195 + }, + "registers": { + "StoreConfiguration": { + "id": 0, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Store all configuration items in non-volatile memory.", + "version": { + "first": 147, + "last": 195 + }, + "statictype": "dynamic" + } + ] + }, + "LimitLogSize": { + "id": 1, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Override the maximum number of entries per log (0 keeps default)", + "version": { + "first": 147, + "last": 195 + }, + "statictype": "static" + } + ] + } + } + }, + "FLEXNETVERSION": { + "id": 24, + "version": { + "first": 1, + "last": 9999 + } + }, + "FLEXNETSERIAL": { + "id": 26, + "version": { + "first": 1, + "last": 17 + }, + "registers": { + "UpgState": { + "id": 0, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem Ipsum", + "version": { + "first": 2, + "last": 17 + }, + "statictype": "dynamic" + } + ] + }, + "FwdlState": { + "id": 1, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem Ipsum", + "version": { + "first": 2, + "last": 17 + }, + "statictype": "dynamic" + } + ] + } + }, + "status": { + "UNKNOWN_PARAMETER": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 0 + }, + "TOO_MANY_APPS": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 1 + } + } + } +} diff --git a/TBF_V2/Sources/TBF/packages/Common/meterconfig.json b/TBF_V2/Sources/TBF/packages/Common/meterconfig.json new file mode 100644 index 00000000..955bd390 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Common/meterconfig.json @@ -0,0 +1,10 @@ +{ + "UseRegisterWatchService": true, + "RegisterWatchServiceUrl": "http://sla12iis01/MeterProcessState/api/RegisterWatch/", + "UseMinMaxCheck": true, + "UseErrorLogger": false, + "ErrorLoggerServiceUrl": "http://sla12iis01/MeterProcessState/api/GenesisMeter/", + "UseCalibrationLogger": false, + "CalibrationLoggerServiceUrl": "http://sla12iis01/MeterProcessState/api/GenesisMeter/", + "AutoUpdateFiles":true +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/Common/register_net4.bat b/TBF_V2/Sources/TBF/packages/Common/register_net4.bat new file mode 100644 index 00000000..9a7da68a --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Common/register_net4.bat @@ -0,0 +1,4 @@ +@echo Start +.\RegAsm4.exe XylemCommonUiLegacyGenCtl.dll /register /tlb XylemCommonUiLegacyGenCtl.tlb /verbose /codebase +@echo Done +@pause \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/ControlBoard/GaugeIndicator.dll b/TBF_V2/Sources/TBF/packages/ControlBoard/GaugeIndicator.dll new file mode 100644 index 00000000..37676d89 Binary files /dev/null and b/TBF_V2/Sources/TBF/packages/ControlBoard/GaugeIndicator.dll differ diff --git a/TBF_V2/Sources/TBF/packages/ControlBoard/Genesis/ControlComponent3U.dll b/TBF_V2/Sources/TBF/packages/ControlBoard/Genesis/ControlComponent3U.dll new file mode 100644 index 00000000..f2b203b4 Binary files /dev/null and b/TBF_V2/Sources/TBF/packages/ControlBoard/Genesis/ControlComponent3U.dll differ diff --git a/TBF_V2/Sources/TBF/packages/FluentNHibernate.2.0.3.0/FluentNHibernate.2.0.3.0.nupkg b/TBF_V2/Sources/TBF/packages/FluentNHibernate.2.0.3.0/FluentNHibernate.2.0.3.0.nupkg new file mode 100644 index 00000000..a595e1ce Binary files /dev/null and b/TBF_V2/Sources/TBF/packages/FluentNHibernate.2.0.3.0/FluentNHibernate.2.0.3.0.nupkg differ diff --git a/TBF_V2/Sources/TBF/packages/FluentNHibernate.2.0.3.0/lib/net40/FluentNHibernate.XML b/TBF_V2/Sources/TBF/packages/FluentNHibernate.2.0.3.0/lib/net40/FluentNHibernate.XML new file mode 100644 index 00000000..8bfeb2dd --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/FluentNHibernate.2.0.3.0/lib/net40/FluentNHibernate.XML @@ -0,0 +1,5850 @@ + + + + FluentNHibernate + + + + + Built-in alteration for altering an AutoPersistenceModel with instance of IAutoMappingOverride<T>. + + + + + Provides a mechanism for altering an AutoPersistenceModel prior to + the generation of mappings. + + + + + Alter the model + + AutoPersistenceModel instance to alter + + + + Constructor for AutoMappingOverrideAlteration. + + Assembly to load overrides from. + + + + Alter the model + + + Finds all types in the assembly (passed in the constructor) that implement IAutoMappingOverride<T>, then + creates an AutoMapping<T> and applies the override to it. + + AutoPersistenceModel instance to alter + + + + A mapping override for an auto mapped entity. + + Entity who's auto-mapping you're overriding + + + + Alter the automapping for this type + + Automapping + + + + Facade over an assembly for retrieving type instances. + + + + + A source for Type instances, acts as a facade for an Assembly or as an alternative Type provider. + + + + + Called when a member is mapped by a builder method. + + Member being mapped. + + + + Create a property mapping. + + Property to map + + Map(x => x.Name); + + + + + Create a property mapping. + + Property to map + Property column name + + Map(x => x.Name, "person_name"); + + + + + Create a reference to another entity. In database terms, this is a many-to-one + relationship. + + Other entity + Property on the current entity + + References(x => x.Company); + + + + + Create a reference to another entity. In database terms, this is a many-to-one + relationship. + + Other entity + Property on the current entity + Column name + + References(x => x.Company, "company_id"); + + + + + Create a reference to another entity. In database terms, this is a many-to-one + relationship. + + Other entity + Property on the current entity + + References(x => x.Company, "company_id"); + + + + + Create a reference to another entity. In database terms, this is a many-to-one + relationship. + + Other entity + Property on the current entity + Column name + + References(x => x.Company, "company_id"); + + + + + Create a reference to any other entity. This is an "any" polymorphic relationship. + + Other entity to reference + Property + + + + Create a reference to another entity based exclusively on the primary-key values. + This is sometimes called a one-to-one relationship, in database terms. Generally + you should use + whenever possible. + + Other entity + Property + + HasOne(x => x.ExtendedInfo); + + + + + Create a reference to another entity based exclusively on the primary-key values. + This is sometimes called a one-to-one relationship, in database terms. Generally + you should use + whenever possible. + + Other entity + Property + + HasOne(x => x.ExtendedInfo); + + + + + Create a dynamic component mapping. This is a dictionary that represents + a limited number of columns in the database. + + Property containing component + Component setup action + + DynamicComponent(x => x.Data, comp => + { + comp.Map(x => (int)x["age"]); + }); + + + + + Creates a component reference. This is a place-holder for a component that is defined externally with a + ; the mapping defined in said will be merged + with any options you specify from this call. + + Component type + Property exposing the component + Component reference builder + + + + Maps a component + + Type of component + Component property + Component mapping + + Component(x => x.Address, comp => + { + comp.Map(x => x.Street); + comp.Map(x => x.City); + }); + + + + + Maps a component + + Type of component + Component property + Component mapping + + Component(x => x.Address, comp => + { + comp.Map(x => x.Street); + comp.Map(x => x.City); + }); + + + + + Allows the user to add a custom component mapping to the class mapping. + Note: not a fluent method. + + + In some cases, our users need a way to add an instance of their own implementation of IComponentMappingProvider. + For an example of where this might be necessary, see: http://codebetter.com/blogs/jeremy.miller/archive/2010/02/16/our-extension-properties-story.aspx + + + + + Maps a collection of entities as a one-to-many + + Child entity type + Collection property + + HasMany(x => x.Locations); + + + + + Maps a collection of entities as a one-to-many + + Child entity type + Collection property + + HasMany(x => x.Locations); + + + + + Maps a collection of entities as a many-to-many + + Child entity type + Collection property + + HasManyToMany(x => x.Locations); + + + + + Maps a collection of entities as a many-to-many + + Child entity type + Collection property + + HasManyToMany(x => x.Locations); + + + + + Specify an insert stored procedure + + Stored procedure call + + + + Specify an update stored procedure + + Stored procedure call + + + + Specify an delete stored procedure + + Stored procedure call + + + + Specify an delete all stored procedure + + Stored procedure call + + + + Specifies an entity-name. + + See http://nhforge.org/blogs/nhibernate/archive/2008/10/21/entity-name-in-action-a-strongly-typed-entity.aspx + + + + Inverts the next boolean + + + + + Maps to the Join element in NH 2.0 + + + + + + Specify the key column name + + Column name + + + + Specify the key column name + + Column names + + + + Specify the schema + + Schema name + + + + Inverse the ownership of this relationship + + + + + Specify this relationship as optional + + + + + Specify the catalog + + Catalog + + + + Specify a subselect for fetching this join + + Query + + + + Specify the table name + + Table name + + + + Specify the fetching strategy + + + + + Invert the next boolean operation + + + + + Starting point for automapping your entities. + + + + + Automatically map classes in the assembly that contains . + + Class in the assembly you want to map + + + + Automatically map classes in the assembly that contains . + + Class in the assembly you want to map + Automapping configuration + + + + Automatically map the classes in . + + Assembly containing the classes to map + + + + Automatically map the classes in . + + Assembly containing the classes to map + Automapping configuration + + + + Automatically map the classes in each assembly supplied. + + Assemblies containing classes to map + + + + Automatically map the classes in each assembly supplied. + + Automapping configuration + Assemblies containing classes to map + + + + Automatically map the classes in each assembly supplied. + + Automapping configuration + Assemblies containing classes to map + + + + Automatically map the classes exposed through the supplied . + + containing classes to map + + + + Automatically map the classes exposed through the supplied . + + containing classes to map + Automapping configuration + + + + Automatically map the classes exposed through the supplied . + + containing classes to map + Criteria for selecting a subset of the types in the assembly for mapping + + + + Automatically map the classes in . + + Assembly containing the classes to map + Criteria for selecting a subset of the types in the assembly for mapping + + + + Automatically map classes in the assembly that contains . + + Class in the assembly you want to map + Criteria for selecting a subset of the types in the assembly for mapping + + + + Defines a mapping for an entity. Derive from this class to create a mapping, + and use the constructor to control how your entity is persisted. + + + public class PersonMap : ClassMap<Person> + { + public PersonMap() + { + Id(x => x.PersonId); + Map(x => x.Name); + Map(x => x.Age); + } + } + + Entity type to map + + + + Specify the identifier for this entity. + + Identity property + + Id(x => x.PersonId); + + + + + Specify the identifier for this entity. + + Identity property + Column name + + Id(x => x.PersonId, "id"); + + + + + Create an Id that doesn't have a corresponding property in + the domain object, or a column in the database. This is mainly + for use with read-only access and/or views. Defaults to an int + identity with an "increment" generator. + + + + + Create an Id that doesn't have a corresponding property in + the domain object, or a column in the database. This is mainly + for use with read-only access and/or views. + + Type of the id + + + + Create an Id that doesn't have a corresponding property in + the domain object. + + Type of the id + Name and column name of the id + + + + Create a natural identity. This is a secondary identifier + that has "business meaning" moreso than the primary key. + + + NaturalId() + .Property(x => x.Name); + + + + + Create a composite identity. This is an identity composed of multiple + columns. + Note: Prefer using a surrogate key over a composite key whenever possible. + + + CompositeId() + .KeyProperty(x => x.FirstName) + .KeyProperty(x => x.LastName); + + + + + Create a composite identity represented by an identity class. This is an + identity composed of multiple columns. + Note: Prefer using a surrogate key over a composite key whenever possible. + + Composite id property + + CompositeId(x => x.Id) + .KeyProperty(x => x.FirstName) + .KeyProperty(x => x.LastName); + + + + + Specifies that this class should be versioned/timestamped using the + given property. + + Version/timestamp property + + Version(x => x.Timestamp); + + + + + Specify that this entity should use a discriminator with it's subclasses. + This is a mapping strategy called table-per-inheritance-hierarchy; where all + subclasses are stored in the same table, differenciated by a discriminator + column value. + + Type of the discriminator column + Discriminator column name + Default discriminator value + + + + Specify that this entity should use a discriminator with it's subclasses. + This is a mapping strategy called table-per-inheritance-hierarchy; where all + subclasses are stored in the same table, differenciated by a discriminator + column value. + + Type of the discriminator column + Discriminator column name + + + + Specify that this entity should use a discriminator with it's subclasses. + This is a mapping strategy called table-per-inheritance-hierarchy; where all + subclasses are stored in the same table, differenciated by a discriminator + column value. + + Discriminator column name + + + + Specifies that any subclasses of this entity should be treated as union-subclass + mappings. Don't use this in combination with a discriminator, as they are mutually + exclusive. + + + + + Sets the schema for this class. + + Schema name + + + + Sets the table for the class. + + Table name + + + + Sets this entity to be lazy-loaded (overrides the default lazy load configuration). + + + + + Links this entity to another table, to create a composite entity from two or + more tables. + + Joined table name + Joined table mapping + + Join("another_table", join => + { + join.Map(x => x.Name); + join.Map(x => x.Age); + }); + + + + + Imports an existing type for use in the mapping. + + Type to import. + + + + Set the mutability of this class, sets the mutable attribute. + + + + + Sets this entity to be dynamic update + + + + + Sets this entity to be dynamic insert + + + + + Sets the query batch size for this entity. + + Batch size + + + + Specifies a check constraint + + Constraint name + + + + Specifies a persister to be used with this entity + + Persister type + + + + Specifies a persister to be used with this entity + + Persister type + + + + Specifies a persister to be used with this entity + + Persister type + + + + Specifies a proxy class for this entity. + + Proxy type + + + + Specifies a proxy class for this entity. + + Proxy type + + + + Specifies a proxy class for this entity. + + Proxy type + + + + Specifies that a select should be performed before updating + this entity + + + + + Defines a SQL 'where' clause used when retrieving objects of this type. + + + + + Sets the SQL statement used in subselect fetching. + + Subselect SQL Query + + + + Specifies an entity-name. + + See http://nhforge.org/blogs/nhibernate/archive/2008/10/21/entity-name-in-action-a-strongly-typed-entity.aspx + + + + Applies a filter to this entity given its name. + + The filter's name + The condition to apply + + + + Applies a filter to this entity given its name. + + The filter's name + + + + Applies a named filter to this entity. + + The condition to apply + + The type of a implementation + defining the filter to apply. + + + + + Applies a named filter to this entity. + + + The type of a implementation + defining the filter to apply. + + + + + Configures the tuplizer for this entity. The tuplizer defines how to transform + a Property-Value to its persistent representation, and viceversa a Column-Value + to its in-memory representation, and the EntityMode defines which tuplizer is in use. + + Tuplizer entity-mode + Tuplizer type + + + + Specify the caching for this entity. + + + Cache.ReadWrite(); + + + + + Specify settings for the container/hibernate-mapping for this class. + Note: Avoid using this, if possible prefer using conventions. + + + HibernateMapping.Schema("dto"); + + + + + Inverts the next boolean option + + + + + Sets the optimistic locking strategy + + + + + Sets the polymorphism behaviour + + + + + Sets the schema action behaviour + + + + + Flags a type as already mapped, stop it from being auto-mapped. + + + + + Creates an instance of an IAutoMappingAlteration from a type instance, then adds it to the alterations collection. + + Type of an IAutoMappingAlteration + + + + Creates an instance of an IAutoMappingAlteration from a generic type parameter, then adds it to the alterations collection. + + Type of an IAutoMappingAlteration + Container + + + + Adds an alteration + + Alteration to add + Container + + + + Adds all alterations from an assembly + + Assembly to search + Container + + + + Adds all alterations from an assembly that contains T. + + Type who's assembly to search + Container + + + + Apply alterations to an AutoPersisteceModel + + AutoPersistenceModel instance to apply alterations to + + + + Determines whether a member is to be automapped. + + + + + Determines whether a member is the identity of an entity. + + + + + Determines whether an abstract class is a layer supertype or part of a mapped inheritance hierarchy. + + + + + Specifies the value column used in a table of simple types. + + + + + Implement this interface to control how the automapper behaves. + Typically you're better off deriving from the + class, which is pre-configured with the default settings; you can then + just override specific methods that you'd like to alter. + + + + + Determines whether a type should be auto-mapped. + Override to restrict which types are mapped in your domain. + + + You normally want to override this method and restrict via something known, like + Namespace. + + + return type.Namespace.EndsWith("Domain"); + + Type to map + Should map type + + + + Determines whether a member of a type should be auto-mapped. + Override to restrict which members are considered in automapping. + + + You normally want to override this method to restrict which members will be + used for mapping. This method will be called for every property, field, and method + on your types. + + + // all writable public properties: + return member.IsProperty && member.IsPublic && member.CanWrite; + + Member to map + Should map member + + + + Determines whether a member is the id of an entity. + + + This method is called for each member that ShouldMap(Type) returns true for. + + Member + Member is id + + + + Gets the access strategy to be used for a read-only property. This method is + called for every setterless property and private-setter autoproperty in your + domain that has been accepted through . + + Member to get access strategy for + Access strategy + + + + Controls which side of a many-to-many relationship is considered the "parent". + + Left side of the relationship + Right side of the relationship + left or right + + + + Determines whether a type is a concrete, or instantiatable, base class. This + affects how the inheritance mappings are built, specifically that any types + this method returns true for will not be mapped as a subclass. + + Type + Base type is concrete? + + + + Specifies that a particular type should be mapped as a component rather than + an entity. + + Type + Type is a component? + + + + Gets the column prefix for a component. + + Member defining the component + Component column prefix + + + + Specifies whether a particular type is mapped with a discriminator. + This method will be called for every type that has already been + approved by . + + Type to check + Whether the type is to be discriminated + + + + Gets the column name of the discriminator. + + Type + Discriminator column name + + + + Specifies whether an abstract type is considered a Layer Supertype + (http://martinfowler.com/eaaCatalog/layerSupertype.html). Defaults to + true for all abstract classes. Override this method if you have an + abstract class that you want mapping as a regular entity. + + Abstract class type + Whether the type is a Layer Supertype + + + + Gets the value column for a collection of simple types. + + + This is the name of the <element> column. + + Collection property + Value column name + + + + Specifies whether the current member is a version property + + Candidate member + Is member a version + + + + Gets the steps that are executed to map a type. + + Collection of mapping steps + + + + Gets or sets whether validation of mappings is performed. + + + + + Specify alterations to be used with this AutoPersisteceModel + + Lambda to declare alterations + AutoPersistenceModel + + + + Use auto mapping overrides defined in the assembly of T. + + Type to get assembly from + AutoPersistenceModel + + + + Use auto mapping overrides defined in the assembly of T. + + Assembly to scan + AutoPersistenceModel + + + + Alter some of the configuration options that control how the automapper works. + Depreciated in favour of supplying your own IAutomappingConfiguration instance to AutoMap: . + Cannot be used in combination with a user-defined configuration. + + + + + Supply a criteria for which types will be mapped. + Cannot be used in combination with a user-defined configuration. + + Where clause + + + + Adds all entities from a specific assembly. + + Assembly to load from + + + + Adds all entities from the . + + to load from + + + + Override the mapping of a specific entity. + + This may affect subclasses, depending on the alterations you do. + Entity who's mapping to override + Lambda performing alterations + + + + Adds an IAutoMappingOverride reflectively + + Override type, expected to be an IAutoMappingOverride + + + + Override all mappings. + + Currently only supports ignoring properties on all entities. + Lambda performing alterations + + + + Ignore a base type. This removes it from any mapped inheritance hierarchies, good for non-abstract layer + supertypes. + + Type to ignore + + + + Ignore a base type. This removes it from any mapped inheritance hierarchies, good for non-abstract layer + supertypes. + + Type to ignore + + + + Explicitly includes a type to be used as part of a mapped inheritance hierarchy. + + + Abstract classes are probably what you'll be using this method with. Fluent NHibernate considers abstract + classes to be layer supertypes, so doesn't automatically map them as part of an inheritance hierarchy. You + can use this method to override that behavior for a specific type; otherwise you should consider using the + setting. + + Type to include + + + + Explicitly includes a type to be used as part of a mapped inheritance hierarchy. + + + Abstract classes are probably what you'll be using this method with. Fluent NHibernate considers abstract + classes to be layer supertypes, so doesn't automatically map them as part of an inheritance hierarchy. You + can use this method to override that behavior for a specific type; otherwise you should consider using the + setting. + + Type to include + + + + Alter convention discovery + + + + + Sets whether this subclass is lazy loaded + + + + + + Specifies an entity-name. + + See http://nhforge.org/blogs/nhibernate/archive/2008/10/21/entity-name-in-action-a-strongly-typed-entity.aspx + + + + Inverts the next boolean + + + + + Sets the database dialect. This shouldn't be necessary + if you've used one of the provided database configurations. + + Configuration builder + + + + Sets the database dialect. This shouldn't be necessary + if you've used one of the provided database configurations. + + Configuration builder + + + + Sets the default database schema + + Default schema name + Configuration builder + + + + Enables the outer-join option. + + Configuration builder + + + + Sets the max fetch depth. + + Max fetch depth + Configuration builder + + + + Enables the reflection optimizer. + + Configuration builder + + + + Sets any query stubstitutions that NHibernate should + perform. + + Substitutions + Configuration builder + + + + Enables the show SQL option. + + Configuration builder + + + + Enables the format SQL option. + + Configuration builder + + + + Sets the database provider. This shouldn't be necessary + if you're using one of the provided database configurations. + + Provider type + Configuration builder + + + + Sets the database provider. This shouldn't be necessary + if you're using one of the provided database configurations. + + Provider type + Configuration builder + + + + Specify the database driver. This isn't necessary + if you're using one of the provided database configurations. + + Driver type + Configuration builder + + + + Specify the database driver. This isn't necessary + if you're using one of the provided database configurations. + + Driver type + Configuration builder + + + + Configure the connection string + + + ConnectionString(x => + { + x.Server("db_server"); + x.Database("Products"); + }); + + Closure for building the connection string + Configuration builder + + + + Set the connection string. + + Connection string to use + Configuration builder + + + + Sets a raw property on the NHibernate configuration. Use this method + if there isn't a specific option available in the API. + + Setting key + Setting value + Configuration builder + + + + Sets the adonet.batch_size property. + + Batch size + Configuration + + + + Sets the connection isolation level. NHibernate setting: connection.isolation + + Isolation level + Configuration builder + + + + Sets the connection isolation level. NHibernate setting: connection.isolation + + Isolation level + Configuration builder + + + + Negates the next boolean option. + + + + + Initializes a new instance of the class using the + Oracle Data Provider (Oracle.DataAccess) library specifying the Oracle 9i dialect. + The Oracle.DataAccess library must be available to the calling application/library. + + + + + Initializes a new instance of the class using the + Oracle Data Provider (Oracle.DataAccess) library specifying the Oracle 10g dialect. + The Oracle.DataAccess library must be available to the calling application/library. + + + + + Provides types for mapping from multiple assemblies + + + + + Basic convention interface. Don't use directly. + + Inspector instance for use in retrieving values and setting expectations + Apply instance + + + + Ignore - this is used for generic restrictions only + + + + + Apply changes to the target + + + + + Whether this convention will be applied to the target. + + Instace that could be supplied + Apply on this target? + + + + Represents a string identifier for the model instance, used in conventions for a lazy + shortcut. + + e.g. for a ColumnMapping the StringIdentifierForModel would be the Name attribute, + this allows the user to find any columns with the matching name. + + + + + Diagnostic logging configuration + + + + + Conditionally enable logging + + Enable logging + + + + Enable logging + + + + + Disable logging + + + + + Register a logging listener + + Listener + + + + Register a default Console.Write listener + + + + + + Register a Console.Write listener with a custom result formatter + + Result formatter + + + + Register a default file output listener + + Output path + + + + Register a file output listener with a custom result formatter + + Result formatter + Output path + + + + DB2 Data Server/Client supports Informix 11.50+ with Informix syntax + + + + + Base class for attribute based conventions. Create a subclass of this to supply your own + attribute based conventions. + + Attribute identifier + + + + Apply changes to a property with an attribute matching T. + + Instance of attribute found on property. + Property with attribute + + + + Convention for identities, implement this interface to apply changes to + identity mappings. + + + + + Version convention, implement this interface to apply changes to version mappings. + + + + + Property convention, implement this interface to apply changes to + property mappings. + + + + + Convention for a component mapping. Implement this interface to + apply changes to components. + + + + + Convention for dynamic components. Implement this member to apply changes + to dynamic components. + + + + + Reference convention, implement this interface to apply changes to Reference/many-to-one + relationships. + + + + + HasOne convention, used for applying changes to one-to-one relationships. + + + + + Convention for the hibernate-mapping container for a class, this can be used to + set some class-wide settings such as lazy-load and access strategies. + + + + + Joined subclass convention, implement this interface to alter joined-subclass mappings. + + + + + Join convention, implement this interface to alter join mappings. + + + + + Convention for a single class mapping. Implement this interface to apply + changes to class mappings. + + + + + Subclass convention, implement this interface to alter subclass mappings. + + + + + Apply changes to the target + + + + + Apply changes to the target + + + + + Apply changes to the target + + + + + Apply changes to the target + + + + + Apply changes to the target + + + + + Represents a string identifier for the model instance, used in conventions for a lazy + shortcut. + + e.g. for a ColumnMapping the StringIdentifierForModel would be the Name attribute, + this allows the user to find any columns with the matching name. + + + + + Gets the requested value off the first column, as all columns are (currently) created equal + + + + + + + Applies to the joining table for this many-to-many. + + + + + Applies to the joining table for this many-to-many. + + + + + generates identifiers of any integral type that are unique only when no other + process is inserting data into the same table. Do not use in a cluster. + + + + + + generates identifiers of any integral type that are unique only when no other + process is inserting data into the same table. Do not use in a cluster. + + Params configuration + + + + supports identity columns in DB2, MySQL, MS SQL Server and Sybase. + The identifier returned by the database is converted to the property type using + Convert.ChangeType. Any integral property type is thus supported. + + + + + + supports identity columns in DB2, MySQL, MS SQL Server and Sybase. + The identifier returned by the database is converted to the property type using + Convert.ChangeType. Any integral property type is thus supported. + + Params configuration + + + + uses a sequence in DB2, PostgreSQL, Oracle or a generator in Firebird. + The identifier returned by the database is converted to the property type + using Convert.ChangeType. Any integral property type is thus supported. + + + + + + + uses a sequence in DB2, PostgreSQL, Oracle or a generator in Firebird. + The identifier returned by the database is converted to the property type + using Convert.ChangeType. Any integral property type is thus supported. + + + Params configuration + + + + uses a hi/lo algorithm to efficiently generate identifiers of any integral type, + given a table and column (by default hibernate_unique_key and next_hi respectively) + as a source of hi values. The hi/lo algorithm generates identifiers that are unique + only for a particular database. Do not use this generator with a user-supplied connection. + requires a "special" database table to hold the next available "hi" value + + The table. + The column. + The max lo. + The where. + + + + uses a hi/lo algorithm to efficiently generate identifiers of any integral type, + given a table and column (by default hibernate_unique_key and next_hi respectively) + as a source of hi values. The hi/lo algorithm generates identifiers that are unique + only for a particular database. Do not use this generator with a user-supplied connection. + requires a "special" database table to hold the next available "hi" value + + + + + + + + + uses a hi/lo algorithm to efficiently generate identifiers of any integral type, + given a table and column (by default hibernate_unique_key and next_hi respectively) + as a source of hi values. The hi/lo algorithm generates identifiers that are unique + only for a particular database. Do not use this generator with a user-supplied connection. + requires a "special" database table to hold the next available "hi" value + + + + + Params configuration + + + + uses a hi/lo algorithm to efficiently generate identifiers of any integral type, + given a table and column (by default hibernate_unique_key and next_hi respectively) + as a source of hi values. The hi/lo algorithm generates identifiers that are unique + only for a particular database. Do not use this generator with a user-supplied connection. + requires a "special" database table to hold the next available "hi" value + + + + + + + uses a hi/lo algorithm to efficiently generate identifiers of any integral type, + given a table and column (by default hibernate_unique_key and next_hi respectively) + as a source of hi values. The hi/lo algorithm generates identifiers that are unique + only for a particular database. Do not use this generator with a user-supplied connection. + requires a "special" database table to hold the next available "hi" value + + + Params configuration + + + + uses an Oracle-style sequence (where supported) + + + + + + + + uses an Oracle-style sequence (where supported) + + + + Params configuration + + + + uses System.Guid and its ToString(string format) method to generate identifiers + of type string. The length of the string returned depends on the configured format. + + http://msdn.microsoft.com/en-us/library/97af8hh4.aspx + + + + + uses System.Guid and its ToString(string format) method to generate identifiers + of type string. The length of the string returned depends on the configured format. + + http://msdn.microsoft.com/en-us/library/97af8hh4.aspx + Params configuration + + + + uses a new System.Guid to create a byte[] that is converted to a string. + + + + + + uses a new System.Guid to create a byte[] that is converted to a string. + + Params configuration + + + + uses a new System.Guid as the identifier. + + + + + + uses a new System.Guid as the identifier. + + Params configuration + + + + Recommended for Guid identifiers! + uses the algorithm to generate a new System.Guid described by Jimmy Nilsson + in the article http://www.informit.com/articles/article.asp?p=25862. + + + + + + Recommended for Guid identifiers! + uses the algorithm to generate a new System.Guid described by Jimmy Nilsson + in the article http://www.informit.com/articles/article.asp?p=25862. + + Params configuration + + + + Generator that uses the RDBMS native function to generate a GUID. + The behavior is similar to the “sequence” generator. When a new + object is saved NH run two queries: the first to retrieve the GUID + value and the second to insert the entity using the Guid retrieved + from the RDBMS. Your entity Id must be System.Guid and the SQLType + will depend on the dialect (RAW(16) in Oracle, UniqueIdentifier in + MsSQL for example). + + + + + Generator that uses the RDBMS native function to generate a GUID. + The behavior is similar to the “sequence” generator. When a new + object is saved NH run two queries: the first to retrieve the GUID + value and the second to insert the entity using the Guid retrieved + from the RDBMS. Your entity Id must be System.Guid and the SQLType + will depend on the dialect (RAW(16) in Oracle, UniqueIdentifier in + MsSQL for example). + + + GuidNative(x => + { + x.AddParam("key", "value"); + }); + + Parameter builder closure + + + + A deviation of the trigger-identity. This generator works + together with the feature. + The difference with trigger-identity is that the POID value + is retrieved by a SELECT using the natural-id fields as filter. + + + + + A deviation of the trigger-identity. This generator works + together with the feature. + The difference with trigger-identity is that the POID value + is retrieved by a SELECT using the natural-id fields as filter. + + + Select(x => + { + x.AddParam("key", "value"); + }); + + Parameter builder closure + + + + Based on sequence but works like an identity. The POID + value is retrieved with an INSERT query. Your entity Id must + be an integral type. + "hibernate_sequence" is the default name for the sequence, unless + another is provided. + + + + + Based on sequence but works like an identity. The POID + value is retrieved with an INSERT query. Your entity Id must + be an integral type. + "hibernate_sequence" is the default name for the sequence, unless + another is provided. + + Custom sequence name + + + + Based on sequence but works like an identity. The POID + value is retrieved with an INSERT query. Your entity Id must + be an integral type. + "hibernate_sequence" is the default name for the sequence, unless + another is provided. + + Parameter builder closure + + + + Based on sequence but works like an identity. The POID + value is retrieved with an INSERT query. Your entity Id must + be an integral type. + "hibernate_sequence" is the default name for the sequence, unless + another is provided. + + Custom sequence name + Parameter builder closure + + + + trigger-identity is a NHibernate specific feature where the POID + is generated by the RDBMS with an INSERT query through a + BEFORE INSERT trigger. In this case you can use any supported type, + including a custom type, with the limitation of a single column usage. + + + + + trigger-identity is a NHibernate specific feature where the POID + is generated by the RDBMS with an INSERT query through a + BEFORE INSERT trigger. In this case you can use any supported type, + including a custom type, with the limitation of a single column usage. + + Parameter builder closure + + + + lets the application to assign an identifier to the object before Save() is called. + + + + + + lets the application to assign an identifier to the object before Save() is called. + + Params configuration + + + + picks identity, sequence or hilo depending upon the capabilities of the underlying database. + + + + + + picks identity, sequence or hilo depending upon the capabilities of the underlying database. + + Params configuration + + + + picks identity, sequence or hilo depending upon the capabilities of the underlying database. + + + + + picks identity, sequence or hilo depending upon the capabilities of the underlying database. + + + + + uses the identifier of another associated object. Usually used in conjunction with a one-to-one primary key association. + + + + + + + uses the identifier of another associated object. Usually used in conjunction with a one-to-one primary key association. + + + Params configuration + + + + Applies to the joining table for this many-to-many. + + + + + Applies to the joining table for this many-to-many. + + + + + Applies a filter to this relationship given its name. + + The filter's name + The condition to apply + + + + Applies a filter to this relationship given its name. + + The filter's name + + + + Applies a named filter to this relationship. + + The condition to apply + + The type of a implementation + defining the filter to apply. + + + + + Applies a named filter to this relationship. + + + The type of a implementation + defining the filter to apply. + + + + + Applies a filter to this entity given its name. + + The filter's name + The condition to apply + + + + Applies a filter to this entity given its name. + + The filter's name + + + + Applies a named filter to this entity. + + The condition to apply + + The type of a implementation + defining the filter to apply. + + + + + Applies a named filter to this entity. + + + The type of a implementation + defining the filter to apply. + + + + + Specify the lazy behaviour of this relationship. + + + Defaults to Proxy lazy-loading. Use the modifier to disable + lazy-loading, and use the + overload to specify alternative lazy strategies. + + + LazyLoad(); + Not.LazyLoad(); + + + + + Specify the lazy behaviour of this relationship. Cannot be used + with the modifier. + + Laziness strategy + + LazyLoad(Laziness.NoProxy); + + + + + Adds a column to the index if columns have not yet been specified + + The column name to add + + + + Adds a column to the index if columns have not yet been specified + + The column name to add + + + + Specify the lazy behaviour of this relationship. + + + Defaults to Proxy lazy-loading. Use the modifier to disable + lazy-loading, and use the + overload to specify alternative lazy strategies. + + + LazyLoad(); + Not.LazyLoad(); + + + + + Specify the lazy behaviour of this relationship. Cannot be used + with the modifier. + + Laziness strategy + + LazyLoad(Laziness.NoProxy); + + + + + Applies a filter to this relationship given its name. + + The filter's name + The condition to apply + + + + Applies a filter to this relationship given its name. + + The filter's name + + + + Applies a named filter to this relationship. + + The condition to apply + + The type of a implementation + defining the filter to apply. + + + + + Applies a named filter to this relationship. + + + The type of a implementation + defining the filter to apply. + + + + + (optional) Specifies the entity from which this subclass descends/extends. + + Type of the entity to extend + + + + (optional) Specifies the entity from which this subclass descends/extends. + + Type of the entity to extend + + + + Checks whether a collection contains an inspector identified by the string value. + + + + + + + + + Checks whether a collection contains an inspector identified by a predicate. + + + + + + + + + (optional) Specifies the entity from which this subclass descends/extends. + + Type of the entity to extend + + + + (optional) Specifies the entity from which this subclass descends/extends. + + Type of the entity to extend + + + + Base convention for specifying your own many-to-many table naming style. Implement + the abstract members defined by this class to control how your join tables are named + for uni and bi-directional many-to-many's. + + + + + Gets the name used for bi-directional many-to-many tables. Implement this member to control how + your join table is named for bi-directional relationships. + + + This method will be called once per bi-directional relationship; once one side of the relationship + has been saved, then the other side will assume that name aswell. + + Main collection + Inverse collection + Many-to-many table name + + + + Gets the name used for uni-directional many-to-many tables. Implement this member to control how + your join table is named for uni-directional relationships. + + Main collection + Many-to-many table name + + + + A component that is declared external to a class mapping. + + + + + Determines the lazy-loading strategy for a collection mapping. + + + + + Collection will be eager loaded (lazy=false). + + + + + Collection will lazy loaded (lazy=true). + + + + + collection will be extra lazy loaded (lazy=extra). + + + "Extra" lazy collections are mostly similar to lazy=true, except certain operations on the collection will not load the whol collection + but issue a smarter SQL statement. For example, invoking Count on an extra-lazy collection will issue a "SELECT COUNT(*)..." rather than selecting + and loading the whole collection of entities. + + + + + This bad boy is the entry point to the visitor + + + + + + offset added to index in column + + mutual exclusive with Type() + offset + + + + Specifies the column name for the index or key of the dictionary. + + Column name + + + + Specifies the type of the index/key column + + mutual exclusive with offset + Index type + + + + Specifies the type of the index/key column + + mutual exclusive with offset + Type + + + + Specifies the type of the index/key column + + mutual exclusive with offset + Type + + + + Laziness strategy for relationships + + + + + No lazy loading + + + + + Proxy-based lazy-loading + + + + + No proxy lazy loading + + + + + Defines a property to be used for this natural-id. + + A member access lambda expression for the property + The natural id part fluent interface + + + + Defines a property to be used for this natural-id with an explicit column name. + + A member access lambda expression for the property + The column name in the database to use for this natural id, or null to use the property name + The natural id part fluent interface + + + + Defines a reference to be used as a many-to-one key for this natural-id with an explicit column name. + + A member access lambda expression for the property + The natural ID part fluent interface + + + + Defines a reference to be used as a many-to-one key for this natural-id with an explicit column name. + + A member access lambda expression for the property + The column name in the database to use for this key, or null to use the property name + The natural id part fluent interface + + + + Specifies that this id is read-only + + This is the same as setting the mutable attribute to false + + + + Inverts the next boolean operation + + + + + This collection optimizes search for already mapped types in subclasses providers. Matters in models with huge inheritance trees. + + + + + Sets the tuplizer type. + + Type + + + + Sets the tuplizer type. + + Type + + + + Sets the tuplizer type. + + Type + + + + Sets the tuplizer mode + + Mode + + + + Specifies an entity-name. + + See http://nhforge.org/blogs/nhibernate/archive/2008/10/21/entity-name-in-action-a-strongly-typed-entity.aspx + + + Computes the Levenshtein Edit Distance between two enumerables. + The type of the items in the enumerables. + The first enumerable. + The second enumerable. + The edit distance. + + + + A reference to a component which is declared externally. Contains properties + that can't be declared externally (property name, for example) + + + + + Specify the column name + + Column name + + + + Specify the column length + + Column length + + + + Specify the nullability of the column + + + + + Specify the uniquness of the column + + + + + Specify the unique key constraint name + + Constraint name + + + + Specify the SQL type for the column + + SQL type + + + + Specify the index name + + Index name + + + + Inverts the next boolean + + + + + Defines a mapping for a component. Derive from this class to create a mapping, + and use the constructor to control how your component is persisted. + + + public class AddressMap : ComponentMap<Address> + { + public AddressMap() + { + Map(x => x.Street); + Map(x => x.City); + } + } + + Component type to map + + + + Specify a parent reference for this component + + Parent property + + ParentReference(x => x.Parent); + + + + + Specifies that this component is read-only + + + This is the same as calling both Not.Insert() and Not.Update() + + + + + Specifies that this component is insertable. + + + + + Specifies that this component is updatable + + + + + Specifies the uniqueness of this component + + + + + Specify that this component should be optimistically locked on access + + + + + Set the access and naming strategy for this component. + + + + + Invert the next boolean operation + + + + + Creates a component reference. This is a place-holder for a component that is defined externally with a + ; the mapping defined in said will be merged + with any options you specify from this call. + + Component type + Property exposing the component + Component reference builder + + + + The fluent-interface part for a external component reference. These are + components which have their bulk/body declared external to a class mapping + and are reusable. + + Component type + + + + Sets the prefix for any columns defined within the component. To refer to the property + that exposes this component use {property}. + + + // Entity using Address component + public class Person + { + public Address PostalAddress { get; set; } + } + + ColumnPrefix("{property}_") will result in any columns of Person.Address being prefixed with "PostalAddress_". + + Prefix for column names + + + + Maps to the Filter element in NH 2.0 + + + + + Specifies an entity-name. + + See http://nhforge.org/blogs/nhibernate/archive/2008/10/21/entity-name-in-action-a-strongly-typed-entity.aspx + + + + Inverts the next boolean + + + + + Defines how NHibernate will access the object for persisting/hydrating (Defaults to Property) + + + + + Implicit polymorphism + + + + + Explicit polymorphism + + + + + Takes a type that represents the level in the class/subclass-hiearchy that we're starting from, the parent, + this can be a class or subclass; also takes a list of subclass providers. The providers are then iterated + and added to a dictionary key'd by the types "distance" from the parentType; distance being the number of levels + between parentType and the subclass-type. + + By default if the Parent type is an interface the level will always be zero. At this time there is no check for + hierarchical interface inheritance. + + Starting point, parent type. + List of subclasses + Dictionary key'd by the distance from the parentType. + + + + The evalType starts out as the original subclass. The class hiearchy is only + walked if the subclass inherits from a class that is included in the subclassProviders. + + + + + + + + + The evalType is always one class higher in the hiearchy starting from the original subclass. The class + hiearchy is walked until the IsTopLevel (base class is Object) is met. The level is only incremented if + the subclass inherits from a class that is also in the subclassProviders. + + + + + + + + + Defines a mapping for an entity subclass. Derive from this class to create a mapping, + and use the constructor to control how your entity is persisted. + + + public class EmployeeMap : SubclassMap<Employee> + { + public EmployeeMap() + { + Map(x => x.Name); + Map(x => x.Age); + } + } + + Entity type to map + + + + (optional) Specifies that this subclass is abstract + + + + + Sets the dynamic insert behaviour + + + + + Sets the dynamic update behaviour + + + + + Specifies that this entity should be lazy loaded + + + + + Specify a proxy type for this entity + + Proxy type + + + + Specify a proxy type for this entity + + Proxy type + + + + Specify that a select should be performed before an update of this entity + + + + + Set the discriminator value, if this entity is in a table-per-class-hierarchy + mapping strategy. + + Discriminator value + + + + Sets the table name + + Table name + + + + Sets the schema + + Schema + + + + Specifies a check constraint + + Constraint name + + + + Adds a column to the key for this subclass, if used + in a table-per-subclass strategy. + + Column name + + + + Subselect query + + Subselect query + + + + Specifies a persister for this entity + + Persister type + + + + Specifies a persister for this entity + + Persister type + + + + Specifies a persister for this entity + + Persister type + + + + Set the query batch size + + Batch size + + + + Specifies an entity-name. + + See http://nhforge.org/blogs/nhibernate/archive/2008/10/21/entity-name-in-action-a-strongly-typed-entity.aspx + + + + Links this entity to another table, to create a composite entity from two or + more tables. This only works if you're in a table-per-inheritance-hierarchy + strategy. + + Joined table name + Joined table mapping + + Join("another_table", join => + { + join.Map(x => x.Name); + join.Map(x => x.Age); + }); + + + + + (optional) Specifies the entity from which this subclass descends/extends. + + Type of the entity to extend + + + + (optional) Specifies the entity from which this subclass descends/extends. + + Type of the entity to extend + + + + Inverts the next boolean setting + + + + + Container for automatic mappings + + + + + Add automatic mappings + + Lambda returning an auto mapping setup + Auto mappings configuration + + + + Add automatic mappings + + Auto mapping setup + Auto mappings configuration + + + + Sets the export location for generated mappings + + Path to folder for mappings + Auto mappings configuration + + + + Sets the text writer to write the generated mappings to. + + Fluent mappings configuration + + + + Applies any added mappings to the NHibernate Configuration + + NHibernate Configuration instance + + + + + Gets whether any mappings were added + + + + + Initializes a new instance of the class using the + MS Oracle Client (System.Data.OracleClient) library specifying the Oracle 9i dialect. + + + + + Initializes a new instance of the class using the + MS Oracle Client (System.Data.OracleClient) library specifying the Oracle 10g dialect. + This allows for ANSI join syntax. + + + + + Initializes a new instance of the class using the + Oracle Data Provider (Oracle.DataAccess) library specifying the Oracle 8i dialect. + The Oracle.DataAccess library must be available to the calling application/library. + + + + + Initializes a new instance of the class using the + Oracle Data Provider (Oracle.DataAccess) library specifying the Oracle 9i dialect. + The Oracle.DataAccess library must be available to the calling application/library. + + + + + Initializes a new instance of the class using the + Oracle Data Provider (Oracle.DataAccess) library specifying the Oracle 10g dialect. + The Oracle.DataAccess library must be available to the calling application/library. + This allows for ANSI join syntax. + + + + + Specifies the server to connect. This can be either the DNS name of the + server or the IP (as a string). + + The server. + + + + + Specifies the instance (database name) to use. This can be the short name or the + fully qualified name (Oracle service name). + + The instance. + + + + + Specifies the name of the user account accessing the database. + + The username. + + + + + Specifies the password of the user account accessing the database. + + The password. + + + + + Optional. Ports the specified port the oracle database is running on. This defaults to 1521. + + The port. + + + + + Enable or disable pooling connections for this data configuration. + + if set to true enable pooling. + + + + + Specifies the SQL statement cache size to use for this connection. + + Size of the cache. + + + + + Specifies, as a string, other Oracle options to pass to the connection. + + The other options. + + + + + Initializes a new instance of the class using the + Oracle Data Provider (Oracle.DataAccess) library specifying the Oracle 9i dialect. + The Oracle.DataAccess library must be available to the calling application/library. + + + + + Initializes a new instance of the class using the + Oracle Data Provider (Oracle.DataAccess) library specifying the Oracle 10g dialect. + The Oracle.DataAccess library must be available to the calling application/library. + + + + + The type of authentication to be used. Acceptable values: + + + SERVER + + + SERVER_ENCRYPT + + + DATA_ENCRYPT + + + KERBEROS + + + GSSPLUGIN + + + + + IfxDRDAConnectionStringBuilder object + + + + The name of the database within the server instance. + + + IfxSQLIConnectionStringBuilder object + + + + + + true + - host variable (:param) support enabled. + + + false (default) + - host variable support disabled. + + + + + IfxSQLIConnectionStringBuilder object + + + + Isolation level for the connection. Possible values: + + + ReadCommitted + + + ReadUncommitted + + + RepeatableRead + + + Serializable + + + Transaction + + + This keyword is only supported for applications participating in a + distributed transaction. + + + IfxDRDAConnectionStringBuilder object + + + + The maximum number of connections allowed in the pool. + + + IfxDRDAConnectionStringBuilder object + + + + The minimum number of connections allowed in the pool. Default value 0. + + + IfxDRDAConnectionStringBuilder object + + + + The password associated with the User ID. + + + IfxDRDAConnectionStringBuilder object + + + + When set to true, the IfxConnection object is drawn from + the appropriate pool, or if necessary, it is created and added + to the appropriate pool. Default value 'true'. + + + IfxDRDAConnectionStringBuilder object + + + + Server name with optional port number for direct connection using either + IPv4 notation ([:]]]>) or IPv6 notation. + + + IfxDRDAConnectionStringBuilder object + + + + The login account. + + + IfxDRDAConnectionStringBuilder object + + + + Other options: Connection Lifetime, Connection Reset, Connection Timeout, CurrentSchema, Enlist, + Interrupt, Persist Security Info, ResultArrayAsReturnValue, Security, TrustedContextSystemUserID, + TrustedContextSystemPassword + + + IfxDRDAConnectionStringBuilder object + + + + Client locale, default value is en_us.CP1252 (Windows) + + + IfxSQLIConnectionStringBuilder object + + + + The name of the database within the server instance. + + + IfxSQLIConnectionStringBuilder object + + + + The language locale of the database. Default value is en_US.8859-1 + + + IfxSQLIConnectionStringBuilder object + + + + When set to true or y for yes, any string within double + quotes (") is treated as an identifier, and any string within + single quotes (') is treated as a string literal. Default value 'y'. + + + IfxSQLIConnectionStringBuilder object + + + + The name or IP address of the machine on which the + Informix server is running. Required. + + + IfxSQLIConnectionStringBuilder object + + + + The maximum number of connections allowed in the pool. Default value 100. + + + IfxSQLIConnectionStringBuilder object + + + + The minimum number of connections allowed in the pool. Default value 0. + + + IfxSQLIConnectionStringBuilder object + + + + The password associated with the User ID. Required if the + client machine or user account is not trusted by the host. + Prohibited if a User ID is not given. + + + IfxSQLIConnectionStringBuilder object + + + + When set to true, the IfxConnection object is drawn from + the appropriate pool, or if necessary, it is created and added + to the appropriate pool. Default value 'true'. + + + IfxSQLIConnectionStringBuilder object + + + + The name or alias of the instance of the Informix server to + which to connect. Required. + + + IfxSQLIConnectionStringBuilder object + + + + The service name or port number through which the server + is listening for connection requests. + + + IfxSQLIConnectionStringBuilder object + + + + The login account. Required, unless the client machine is + trusted by the host machine. + + + IfxSQLIConnectionStringBuilder object + + + + Other options like: Connection Lifetime, Enlist, Exclusive, Optimize OpenFetchClose, + Fetch Buffer Size, Persist Security Info, Protocol, Single Threaded, Skip Parsing + + + IfxSQLIConnectionStringBuilder object + + + + Fluent configuration API for NHibernate + + + + + Configure diagnostic logging + + Diagnostic configuration + + + + Apply database settings + + Lambda returning database configuration + Fluent configuration + + + + Apply database settings + + Database configuration instance + Fluent configuration + + + + Configure caching. + + + Cache(x => + { + x.UseQueryCache(); + x.UseMinimalPuts(); + }); + + Closure for configuring caching + Configuration builder + + + + Sets the collectiontype.factory_class property. + NOTE: NHibernate 2.1 only + + factory class + Configuration + + + + Sets the collectiontype.factory_class property. + NOTE: NHibernate 2.1 only + + factory class + Configuration + + + + Sets the collectiontype.factory_class property. + NOTE: NHibernate 2.1 only + + factory class + Configuration + + + + Sets the proxyfactory.factory_class property. + NOTE: NHibernate 2.1 only + + factory class + Configuration + + + + Sets the proxyfactory.factory_class property. + NOTE: NHibernate 2.1 only + + factory class + Configuration + + + + Sets the proxyfactory.factory_class property. + NOTE: NHibernate 2.1 only + + factory class + Configuration + + + + Sets the current_session_context_class property. + + current session context class + Configuration + + + + Sets the current_session_context_class property. + + Implementation of ICurrentSessionContext to use + Configuration + + + + Apply mappings to NHibernate + + Lambda used to apply mappings + Fluent configuration + + + + Allows altering of the raw NHibernate Configuration object before creation + + Lambda used to alter Configuration + Fluent configuration + + + + Verify's the configuration and instructs NHibernate to build a SessionFactory. + + ISessionFactory from supplied settings. + + + + Verifies the configuration and populates the NHibernate Configuration instance. + + NHibernate Configuration instance + + + + Creates an exception based on the current state of the configuration. + + Inner exception + FluentConfigurationException with state + + + + Fluently configure NHibernate + + + + + Begin fluently configuring NHibernate + + Fluent Configuration + + + + Begin fluently configuring NHibernate + + Fluent Configuration + + + + Begin fluently configuring NHibernate + + Instance of an NHibernate Configuration + Fluent Configuration + + + + Begin fluently configuring NHibernate + + Instance of an NHibernate Configuration + Fluent Configuration + + + + Container for fluent mappings + + + + + Add all fluent mappings in the assembly that contains T. + + Type from the assembly + Fluent mappings configuration + + + + Add all fluent mappings in the assembly + + Assembly to add mappings from + Fluent mappings configuration + + + + Adds a single represented by the specified type. + + Fluent mappings configuration + + + + Adds a single represented by the specified type. + + The type. + Fluent mappings configuration + + + + Sets the export location for generated mappings + + Path to folder for mappings + Fluent mappings configuration + + + + Sets the text writer to write the generated mappings to. + + Fluent mappings configuration + + + + Applies any added mappings to the NHibernate Configuration + + PersistenceModel to alter + + + + Alter convention discovery + + + + + Gets whether any mappings were added + + + + + Container for Hbm mappings + + + + + Add explicit classes with Hbm mappings + + List of types to map + Hbm mappings configuration + + + + Add all Hbm mappings in the assembly that contains T. + + Type from the assembly + Hbm mappings configuration + + + + Add all Hbm mappings in the assembly + + Assembly to add mappings from + Hbm mappings configuration + + + + Applies any added mappings to the NHibernate Configuration + + NHibernate Configuration instance + + + + Gets whether any mappings were added + + + + + Fluent mapping configuration + + + + + Applies any mappings to the NHibernate Configuration + + NHibernate Configuration instance + + + + Fluent mappings + + + + + Automatic mapping configurations + + + + + Hbm mappings + + + + + Get whether any mappings of any kind were added + + + + + Convention finder - used to search through assemblies for types that implement a specific convention interface. + + + + + Add a source to be queried. + + Source to query + + + + Add an assembly to be queried. + + + All convention types must have a parameterless constructor, or a single parameter of . + + Assembly instance to query + + + + Adds all conventions found in the assembly that contains . + + + All convention types must have a parameterless constructor, or a single parameter of . + + + + + Add a single convention by type. + + + Type must have a parameterless constructor, or a single parameter of . + + Convention type + + + + Add a single convention by type. + + + Types must have a parameterless constructor, or a single parameter of . + + Type of convention + + + + Add an instance of a convention. + + + Useful for supplying conventions that require extra constructor parameters. + + Convention type + Instance of convention + + + + Find any conventions implementing T. + + Convention interface type + IEnumerable of T + + + + Default convention finder - doesn't do anything special. + + + + + Find any conventions implementing T. + + Convention interface type + IEnumerable of T + + + + Add an assembly to be queried. + + + All convention types must have a parameterless constructor, or a single parameter of IConventionFinder. + + Assembly instance to query + + + + Adds all conventions found in the assembly that contains T. + + + All convention types must have a parameterless constructor, or a single parameter of IConventionFinder. + + + + + Add a single convention by type. + + + Type must have a parameterless constructor, or a single parameter of IConventionFinder. + + Convention type + + + + Add a single convention by type. + + + Types must have a parameterless constructor, or a single parameter of . + + Type of convention + + + + Add an instance of a convention. + + + Useful for supplying conventions that require extra constructor parameters. + + Convention type + Instance of convention + + + + Indicates whether the current is equal to another . + + + true if the current object is equal to the parameter; otherwise, false. + + An Entity to compare with this object. + + + + Determines whether the specified is equal to the current . + + + true if the specified is equal to the current ; otherwise, false. + + The to compare with the current . + The parameter is null.2 + + + + Serves as a hash function for a Entity. + + + A hash code for the current . + + 2 + + + + Set which type this subclass extends. + Note: This doesn't actually get output into the XML, it's + instead used as a marker for the + to pair things up. + + + + + Represents the "Any" mapping in NHibernate. It is impossible to specify a foreign key constraint for this kind of association. For more information + please reference chapter 5.2.4 in the NHibernate online documentation + + + + + Sets the meta-type value for this any mapping. + + Meta type + + + + Sets the meta-type value for this any mapping. + + Meta type + + + + Sets the meta-type value for this any mapping. + + Meta type + + + + Defines how NHibernate will access the object for persisting/hydrating (Defaults to Property) + + + + + Cascade style (Defaults to none) + + + + + Access strategy mapping builder. + + + + + Access strategy mapping builder. + + + + + Sets the access-strategy to property. + + + + + Sets the access-strategy to field. + + + + + Sets the access-strategy to use the backing-field of an auto-property. + + + + + Sets the access-strategy to readonly. + + + + + Sets the access-strategy to field and the naming-strategy to camelcase (field.camelcase). + + + + + Sets the access-strategy to field and the naming-strategy to camelcase, with the specified prefix. + + Naming-strategy prefix + + + + Sets the access-strategy to field and the naming-strategy to lowercase. + + + + + Sets the access-strategy to field and the naming-strategy to lowercase, with the specified prefix. + + Naming-strategy prefix + + + + Sets the access-strategy to field and the naming-strategy to pascalcase, with the specified prefix. + + Naming-strategy prefix + + + + Sets the access-strategy to read-only property (nosetter) and the naming-strategy to camelcase. + + + + + Sets the access-strategy to read-only property (nosetter) and the naming-strategy to camelcase, with the specified prefix. + + Naming-strategy prefix + + + + Sets the access-strategy to read-only property (nosetter) and the naming-strategy to lowercase. + + + + + Sets the access-strategy to read-only property (nosetter) and the naming-strategy to lowercase. + + Naming-strategy prefix + + + + Sets the access-strategy to read-only property (nosetter) and the naming-strategy to pascalcase, with the specified prefix. + + Naming-strategy prefix + + + + Sets the access-strategy to use the type referenced. + + Assembly qualified name of the type to use as the access-strategy + + + + Sets the access-strategy to use the type referenced. + + Type to use as the access-strategy + + + + Sets the access-strategy to use the type referenced. + + Type to use as the access-strategy + + + + Force NHibernate to always select using the discriminator value, even when selecting all subclasses. This + can be useful when your table contains more discriminator values than you have classes (legacy). + + Sets the "force" attribute. + + + + Set this discriminator as read-only. Call this if your discriminator column is also part of a mapped composite identifier. + + Sets the "insert" attribute. + + + + An arbitrary SQL expression that is executed when a type has to be evaluated. Allows content-based discrimination. + + SQL expression + + + + Sets the precision for decimals + + Decimal precision + + + + Specifies the scale for decimals + + Decimal scale + + + + Specify the column length + + Column length + + + + Specify the nullability of this column + + + + + Specifies the uniqueness of this column + + + + + Specifies the unique key constraint name + + Constraint columns + + + + Specifies the index name + + Index name + + + + Specifies a check constraint name + + Constraint name + + + + Specifies the default value for the discriminator + + Default value + + + + Specifies a custom type for the discriminator + + + This is often used with + + Custom type + + + + Specifies a custom type for the discriminator + + + This is often used with + + Custom type + + + + Specifies a custom type for the discriminator + + + This is often used with + + Custom type + + + + Specifies a custom SQL type for the discriminator. + + Custom SQL type. + + + + Invert the next boolean operation + + + + + Pre-defined discriminator values + + + + + Null discriminator value + + + + + Non-null discriminator value + + + + + Specify the element column name + + Column name + + + + Specify the element type + + Element type + + + + Specify the element column length + + Column length + + + + Specify the element column formula + + Formula + + + + Specify the nullability of the column + + + + + Modify the columns for this element + + + + + Inverts the next boolean operation + + + + + Sets caching to read-write + + + + + Sets caching to non-strict read-write + + + + + Sets caching to read-only + + + + + Sets caching to transactional + + + + + Specifies a custom cache behaviour + + Custom behaviour + + + + Specifies the cache region + + + + + + Include all properties for caching + + + + + + Include only non-lazy properties for caching + + + + + Specify a custom property inclusion strategy + + Inclusion strategy + + + + Base class for user type conventions. Create a subclass of this to automatically + map all properties that the user type can be used against. Override Accept or + Apply to alter the behavior. + + IUserType implementation + + + + Base class for attribute based conventions. Create a subclass of this to supply your own + attribute based conventions. + + Attribute identifier + + + + Apply changes to a property with an attribute matching T. + + Instance of attribute found on property. + Property with attribute + + + + Cascade all actions + + + + + Cascade no actions + + + + + Cascade saves and updates + + + + + Cascade deletes + + + + + Cascade merges + + + + + Cascade on replication + + + + + Cascade refreshes + + + + + Cascade deletes orphans + + + + + Cascade evicts + + + + + Cascade locks + + + + + Cascade persists + + + + + Cascade all actions, deleting any orphaned records + + + + + Cascade deletes, deleting any orphaned records + + + + + Map a property + + Dictionary key + + Map("Age"); + + + + + Map a property + + Dictionary key + Property type + + Map<int>("Age"); + + + + + Join fetching + + + + + Select fetching + + + + + Subselect/subquery fetching + + + + + Specifies an entity-name. + + See http://nhforge.org/blogs/nhibernate/archive/2008/10/21/entity-name-in-action-a-strongly-typed-entity.aspx + + + + Thrown when a prefix is specified for an access-strategy that isn't supported. + + + + + Naming strategy prefix. + + + + + Property is never database generated + + + + + Property is only generated on insert + + + + + Property is always database generated + + + + + Checks a list of components for validity. + + Entity type + Type of list element + Persistence specification + Property + Value to save + Equality comparer + + + + Converts an expression to a best guess SQL string + + + + + Converts a Func expression to a best guess SQL string + + + + + Converts a boolean Func expression to a best guess SQL string + + + + + Gets the value of a method call. + + Method call expression + + + + Specify an alternative name for the type + + Alternative name + + + + Used to set the Not-Found attribute to ignore. This tells NHibernate to + return a null object rather then throw an exception when the join fails + + + + + Used to set the Not-Found attribute to exception (Nhibernate default). This + tells NHibernate to throw an exception when the join fails + + + + + Specifies the child class + + Child + + + + Specifies the child class + + Child + + + + Specifies that this relationship should be created with a default-named + foreign-key + + + + + Specify the foreign-key constraint name + + Foreign-key constraint + + + + Sets the property reference + + Property + + + + Sets the property reference + + Property + + + + Specifies that this relationship is constrained + + + + + Specify the lazy behaviour of this relationship. + + + Defaults to Proxy lazy-loading. Use the modifier to disable + lazy-loading, and use the + overload to specify alternative lazy strategies. + + + LazyLoad(); + Not.LazyLoad(); + + + + + Specify the lazy behaviour of this relationship. Cannot be used + with the modifier. + + Laziness strategy + + LazyLoad(Laziness.NoProxy); + + + + + Specifies an entity-name. + + See http://nhforge.org/blogs/nhibernate/archive/2008/10/21/entity-name-in-action-a-strongly-typed-entity.aspx + + + + Sets the fetch behaviour for this relationship + + + Fetch.Select(); + + + + + Sets the cascade behaviour for this relationship + + + Cascade.All(); + + + + + Specifies the access strategy for this relationship + + + Access.Field(); + + + + + Inverts the next boolean operation + + + + + No optimistic locking + + + + + Version locking + + + + + Dirty locking + + + + + Lock on everything + + + + + Use no locking strategy + + + + + Use version locking + + + + + Use dirty locking + + + + + Use all locking + + + + + This method is used to set a different key column in this table to be used for joins. + The output is set as the property-ref attribute in the "key" subelement of the collection + + The name of the column in this table which is linked to the foreign key + OneToManyPart + + + + Specify the lazy-load behaviour + + + + + Specify extra lazy loading + + + + + Inverse the ownership of this entity. Make the other side of the relationship + responsible for saving. + + + + + Use a set collection + + + + + Use a set collection + + Sorting + + + + Use a set collection + + Item comparer + + + + Use a bag collection + + + + + Use a list collection + + + + + Use a list collection with an index + + Index mapping + + + + Use a map collection + + Index type + Index property + + + + Use a map collection + + Index type + Index property + Sorting + + + + Use a map collection + + Index column name + + + + Use a map collection + + Index column name + Sorting + + + + Use a map collection + + Index type + Index column name + + + + Use a map collection + + Index type + Index column name + Sorting + + + + Use a map collection + + Index type + Comparer + Index column name + + + + Use a map collection + + Index type + Index property + Index mapping + + + + Use a map collection + + Index type + Index property + Index mapping + Sorting + + + + Use a map collection + + Index type + Index mapping + Element mapping + + + + Use an array + + Index type + Index property + + + + Use an array + + Index type + Index property + Index mapping + + + + Make this collection indexed + + Index type + Index property + Index mapping + + + + Make this collection index + + Index type + Index column + Index mapping + + + + Map an element/value type + + Column name + + + + Map an element/value type + + Column name + Custom mapping + + + + Maps this collection as a collection of components. + + Component mapping + + + + Sets the table name for this one-to-many. + + Table name + + + + Specify that the deletes should be cascaded + + + + + Specifies whether this collection should be optimistically locked. + + + + + Specify a custom persister + + Persister + + + + Specify a check constraint + + Constraint name + + + + Specify that this collection is generic (optional) + + + + + Sets the where clause for this one-to-many relationship. + + + + + Specify the select batch size + + Batch size + + + + Sets a custom collection type + + + + + Sets a custom collection type + + + + + Sets a custom collection type + + + + + Sets a custom collection type + + + + + Specify the table schema + + Schema name + + + + Specifies an entity-name. + + See http://nhforge.org/blogs/nhibernate/archive/2008/10/21/entity-name-in-action-a-strongly-typed-entity.aspx + + + + Applies a filter to this entity given it's name. + + + Applies a filter to this entity given it's name. + + The filter's name + The condition to apply + + + + Applies a filter to this entity given it's name. + + + Applies a filter to this entity given it's name. + + The filter's name + + + + Applies a named filter to this one-to-many. + + + Applies a named filter to this one-to-many. + + The condition to apply + + The type of a implementation + defining the filter to apply. + + + + + Applies a named filter to this one-to-many. + + + The type of a implementation + defining the filter to apply. + + + + + Return the type of the owning entity + + Type + + + + Specify caching for this entity. + + + + + Specify the cascade behaviour + + + + + Specify the fetching behaviour + + + + + Set the access and naming strategy for this one-to-many. + + + + + Inverts the next boolean operation + + + + + Access strategy mapping builder. + + Mapping part to be applied to + + + + Access strategy mapping builder. + + Instance of the parent mapping part. + Setter for altering the model + + + + Sets the access-strategy to property. + + + + + Sets the access-strategy to field. + + + + + Sets the access-strategy to use the backing-field of an auto-property. + + + + + Sets the access-strategy to readonly. + + + + + + Sets the access-strategy to field and the naming-strategy to camelcase (field.camelcase). + + + + + Sets the access-strategy to field and the naming-strategy to camelcase, with the specified prefix. + + Naming-strategy prefix + + + + Sets the access-strategy to field and the naming-strategy to lowercase. + + + + + Sets the access-strategy to field and the naming-strategy to lowercase, with the specified prefix. + + Naming-strategy prefix + + + + Sets the access-strategy to field and the naming-strategy to pascalcase, with the specified prefix. + + Naming-strategy prefix + + + + Sets the access-strategy to read-only property (nosetter) and the naming-strategy to camelcase. + + + + + Sets the access-strategy to read-only property (nosetter) and the naming-strategy to camelcase, with the specified prefix. + + Naming-strategy prefix + + + + Sets the access-strategy to read-only property (nosetter) and the naming-strategy to lowercase. + + + + + Sets the access-strategy to read-only property (nosetter) and the naming-strategy to lowercase. + + Naming-strategy prefix + + + + Sets the access-strategy to read-only property (nosetter) and the naming-strategy to pascalcase, with the specified prefix. + + Naming-strategy prefix + + + + Sets the access-strategy to use the type referenced. + + Assembly qualified name of the type to use as the access-strategy + + + + Sets the access-strategy to use the type referenced. + + Type to use as the access-strategy + + + + Sets the access-strategy to use the type referenced. + + Type to use as the access-strategy + + + + Sets the prefix for every column defined within the component. To refer to the name of a member that exposes + the component use {property} + + + + + + Specify the lazy-load behaviour + + + + + Component-element for component HasMany's. + + Component type + + + + Map a property + + Property + + Map(x => x.Age); + + + + + Map a property + + Property + Column name + + Map(x => x.Age, "person_age"); + + + + + Create a reference to another entity. In database terms, this is a many-to-one + relationship. + + Other entity + Property on the current entity + + References(x => x.Company); + + + + + Create a reference to another entity. In database terms, this is a many-to-one + relationship. + + Other entity + Property on the current entity + Column name + + References(x => x.Company, "person_company_id"); + + + + + Maps a property of the component class as a reference back to the containing entity + + Parent reference property + Component being mapped + + + + Create a nested component mapping. + + Component property + Action for creating the component + + HasMany(x => x.Locations) + .Component(c => + { + c.Map(x => x.Name); + c.Component(x => x.Address, addr => + { + addr.Map(x => x.Street); + addr.Map(x => x.PostCode); + }); + }); + + + + + Defines a property to be used as a key for this composite-id. + + A member access lambda expression for the property + The composite identity part fluent interface + + + + Defines a property to be used as a key for this composite-id with an explicit column name. + + A member access lambda expression for the property + The column name in the database to use for this key, or null to use the property name + The composite identity part fluent interface + + + + Defines a property to be used as a key for this composite-id with an explicit column name. + + A member access lambda expression for the property + Additional settings for the key property + The composite identity part fluent interface + + + + Defines a reference to be used as a many-to-one key for this composite-id with an explicit column name. + + A member access lambda expression for the property + The composite identity part fluent interface + + + + Defines a reference to be used as a many-to-one key for this composite-id with an explicit column name. + + A member access lambda expression for the property + A list of column names used for this key + The composite identity part fluent interface + + + + Defines a reference to be used as a many-to-one key for this composite-id with an explicit column name. + + A member access lambda expression for the property + A lambda expression specifying additional settings for the key reference + A list of column names used for this key + The composite identity part fluent interface + + + + Specifies that this composite id is "mapped"; aka, a composite id where + the properties exist in the identity class as well as in the entity itself + + + + + Specifies the unsaved value for the identity + + Unsaved value + + + + You may use a component as an identifier of an entity class. Your component class must + satisfy certain requirements: + + * It must be Serializable. + * It must re-implement Equals() and GetHashCode(), consistently with the database's + notion of composite key equality. + + You can't use an IIdentifierGenerator to generate composite keys. Instead the application + must assign its own identifiers. Since a composite identifier must be assigned to the object + before saving it, we can't use unsaved-value of the identifier to distinguish between newly + instantiated instances and instances saved in a previous session. You may instead implement + IInterceptor.IsUnsaved() if you wish to use SaveOrUpdate() or cascading save / update. As an + alternative, you may also set the unsaved-value attribute on a version or timestamp to specify + a value that indicates a new transient instance. In this case, the version of the entity is + used instead of the (assigned) identifier and you don't have to implement + IInterceptor.IsUnsaved() yourself. + + The property of component type that holds the composite identifier. + + Your persistent class must override Equals() and GetHashCode() to implement composite identifier + equality. It must also be Serializable. + + + + + Set the access and naming strategy for this identity. + + + + + Invert the next boolean operation + + + + + generates identifiers of any integral type that are unique only when no other + process is inserting data into the same table. Do not use in a cluster. + + + + + + generates identifiers of any integral type that are unique only when no other + process is inserting data into the same table. Do not use in a cluster. + + Params configuration + + + + supports identity columns in DB2, MySQL, MS SQL Server and Sybase. + The identifier returned by the database is converted to the property type using + Convert.ChangeType. Any integral property type is thus supported. + + + + + + supports identity columns in DB2, MySQL, MS SQL Server and Sybase. + The identifier returned by the database is converted to the property type using + Convert.ChangeType. Any integral property type is thus supported. + + Params configuration + + + + uses a sequence in DB2, PostgreSQL, Oracle or a generator in Firebird. + The identifier returned by the database is converted to the property type + using Convert.ChangeType. Any integral property type is thus supported. + + + + + + + uses a sequence in DB2, PostgreSQL, Oracle or a generator in Firebird. + The identifier returned by the database is converted to the property type + using Convert.ChangeType. Any integral property type is thus supported. + + + Params configuration + + + + uses a hi/lo algorithm to efficiently generate identifiers of any integral type, + given a table and column (by default hibernate_unique_key and next_hi respectively) + as a source of hi values. The hi/lo algorithm generates identifiers that are unique + only for a particular database. Do not use this generator with a user-supplied connection. + requires a "special" database table to hold the next available "hi" value + + The table. + The column. + The max lo. + The where. + + + + + uses a hi/lo algorithm to efficiently generate identifiers of any integral type, + given a table and column (by default hibernate_unique_key and next_hi respectively) + as a source of hi values. The hi/lo algorithm generates identifiers that are unique + only for a particular database. Do not use this generator with a user-supplied connection. + requires a "special" database table to hold the next available "hi" value + + + + + + + + + uses a hi/lo algorithm to efficiently generate identifiers of any integral type, + given a table and column (by default hibernate_unique_key and next_hi respectively) + as a source of hi values. The hi/lo algorithm generates identifiers that are unique + only for a particular database. Do not use this generator with a user-supplied connection. + requires a "special" database table to hold the next available "hi" value + + + + + Params configuration + + + + uses a hi/lo algorithm to efficiently generate identifiers of any integral type, + given a table and column (by default hibernate_unique_key and next_hi respectively) + as a source of hi values. The hi/lo algorithm generates identifiers that are unique + only for a particular database. Do not use this generator with a user-supplied connection. + requires a "special" database table to hold the next available "hi" value + + + + + + + uses a hi/lo algorithm to efficiently generate identifiers of any integral type, + given a table and column (by default hibernate_unique_key and next_hi respectively) + as a source of hi values. The hi/lo algorithm generates identifiers that are unique + only for a particular database. Do not use this generator with a user-supplied connection. + requires a "special" database table to hold the next available "hi" value + + + Params configuration + + + + uses an Oracle-style sequence (where supported) + + + + + + + + uses an Oracle-style sequence (where supported) + + + + Params configuration + + + + uses System.Guid and its ToString(string format) method to generate identifiers + of type string. The length of the string returned depends on the configured format. + + http://msdn.microsoft.com/en-us/library/97af8hh4.aspx + + + + + uses System.Guid and its ToString(string format) method to generate identifiers + of type string. The length of the string returned depends on the configured format. + + http://msdn.microsoft.com/en-us/library/97af8hh4.aspx + Params configuration + + + + uses a new System.Guid to create a byte[] that is converted to a string. + + + + + + uses a new System.Guid to create a byte[] that is converted to a string. + + Params configuration + + + + uses a new System.Guid as the identifier. + + + + + + uses a new System.Guid as the identifier. + + Params configuration + + + + Recommended for Guid identifiers! + uses the algorithm to generate a new System.Guid described by Jimmy Nilsson + in the article http://www.informit.com/articles/article.asp?p=25862. + + + + + + Recommended for Guid identifiers! + uses the algorithm to generate a new System.Guid described by Jimmy Nilsson + in the article http://www.informit.com/articles/article.asp?p=25862. + + Params configuration + + + + lets the application to assign an identifier to the object before Save() is called. + + + + + + lets the application to assign an identifier to the object before Save() is called. + + Params configuration + + + + picks identity, sequence or hilo depending upon the capabilities of the underlying database. + + + + + + picks identity, sequence or hilo depending upon the capabilities of the underlying database. + + Params configuration + + + + picks identity, sequence or hilo depending upon the capabilities of the underlying database. + + + + + picks identity, sequence or hilo depending upon the capabilities of the underlying database. + + + + + uses the identifier of another associated object. Usually used in conjunction with a one-to-one primary key association. + + + + + + + uses the identifier of another associated object. Usually used in conjunction with a one-to-one primary key association. + + + Params configuration + + + + Generator that uses the RDBMS native function to generate a GUID. + The behavior is similar to the “sequence” generator. When a new + object is saved NH run two queries: the first to retrieve the GUID + value and the second to insert the entity using the Guid retrieved + from the RDBMS. Your entity Id must be System.Guid and the SQLType + will depend on the dialect (RAW(16) in Oracle, UniqueIdentifier in + MsSQL for example). + + + + + Generator that uses the RDBMS native function to generate a GUID. + The behavior is similar to the “sequence” generator. When a new + object is saved NH run two queries: the first to retrieve the GUID + value and the second to insert the entity using the Guid retrieved + from the RDBMS. Your entity Id must be System.Guid and the SQLType + will depend on the dialect (RAW(16) in Oracle, UniqueIdentifier in + MsSQL for example). + + + GuidNative(x => + { + x.AddParam("key", "value"); + }); + + Parameter builder closure + + + + A deviation of the trigger-identity. This generator works + together with the feature. + The difference with trigger-identity is that the POID value + is retrieved by a SELECT using the natural-id fields as filter. + + + + + A deviation of the trigger-identity. This generator works + together with the feature. + The difference with trigger-identity is that the POID value + is retrieved by a SELECT using the natural-id fields as filter. + + + Select(x => + { + x.AddParam("key", "value"); + }); + + Parameter builder closure + + + + Based on sequence but works like an identity. The POID + value is retrieved with an INSERT query. Your entity Id must + be an integral type. + "hibernate_sequence" is the default name for the sequence, unless + another is provided. + + + + + Based on sequence but works like an identity. The POID + value is retrieved with an INSERT query. Your entity Id must + be an integral type. + "hibernate_sequence" is the default name for the sequence, unless + another is provided. + + Custom sequence name + + + + Based on sequence but works like an identity. The POID + value is retrieved with an INSERT query. Your entity Id must + be an integral type. + "hibernate_sequence" is the default name for the sequence, unless + another is provided. + + Parameter builder closure + + + + Based on sequence but works like an identity. The POID + value is retrieved with an INSERT query. Your entity Id must + be an integral type. + "hibernate_sequence" is the default name for the sequence, unless + another is provided. + + Custom sequence name + Parameter builder closure + + + + trigger-identity is a NHibernate specific feature where the POID + is generated by the RDBMS with an INSERT query through a + BEFORE INSERT trigger. In this case you can use any supported type, + including a custom type, with the limitation of a single column usage. + + + + + trigger-identity is a NHibernate specific feature where the POID + is generated by the RDBMS with an INSERT query through a + BEFORE INSERT trigger. In this case you can use any supported type, + including a custom type, with the limitation of a single column usage. + + Parameter builder closure + + + + Sets the unsaved-value of the identity. + + Value that represents an unsaved value. + + + + Sets the column name for the identity field. + + Column name + + + + Specify the identity column length + + Column length + + + + Specify the decimal precision + + Decimal precision + + + + Specify the decimal scale + + Decimal scale + + + + Specify the nullability of the identity column + + + + + Specify the uniqueness of the identity column + + + + + Specify a unique key constraint + + Constraint columns + + + + Specify a custom SQL type + + SQL type + + + + Specify an index name + + Index name + + + + Specify a check constraint + + Constraint name + + + + Specify a default value + + Default value + + + + Specify a custom type + + + This is usually used with an + + Custom type + + + + Specify a custom type + + + This is usually used with an + + Custom type + + + + Specify a custom type + + + This is usually used with an + + Custom type + + + + Specify the generator + + + Id("PersonId") + .GeneratedBy.Assigned(); + + + + + Set the access and naming strategy for this identity. + + + + + Invert the next boolean operation + + + + + Sets a single child key column. If there are multiple columns, use ChildKeyColumns.Add + + + + + Sets a single parent key column. If there are multiple columns, use ParentKeyColumns.Add + + + + + Sets the order-by clause on the collection element. + + + + + Sets the order-by clause on the many-to-many element. + + + + + Applies a filter to the child element of this entity given it's name. + + + Applies a filter to the child element of this entity given it's name. + + The filter's name + The condition to apply + + + + Applies a filter to the child element of this entity given it's name. + + + Applies a filter to the child element of this entity given it's name. + + The filter's name + + + + Applies a named filter to the child element of this many-to-many. + + + Applies a named filter to the child element of this many-to-many. + + The condition to apply + + The type of a implementation + defining the filter to apply. + + + + + Applies a named filter to the child element of this many-to-many. + + + The type of a implementation + defining the filter to apply. + + + + + Sets the where clause for this relationship, on the many-to-many element. + + + + + Sets the where clause for this relationship, on the many-to-many element. + Note: This only supports simple cases, use the string overload for more complex clauses. + + + + + Sets whether this relationship is unique + + + Unique(); + Not.Unique(); + + + + + Specifies the name of a multi-column unique constraint. + + Name of constraint + + + + Specifies the index name + + Index name + + + + Specifies the child class of this relationship + + Child + + + + Specifies the child class of this relationship + + Child + + + + Sets this relationship to read-only + + + This is the same as calling both Not.Insert() and Not.Update() + + + ReadOnly(); + Not.ReadOnly(); + + + + + Specify the lazy behaviour of this relationship. + + + Defaults to Proxy lazy-loading. Use the modifier to disable + lazy-loading, and use the + overload to specify alternative lazy strategies. + + + LazyLoad(); + Not.LazyLoad(); + + + + + Specify the lazy behaviour of this relationship. Cannot be used + with the modifier. + + Laziness strategy + + LazyLoad(Laziness.NoProxy); + + + + + Specifies this relationship should be created with a default-named + foreign key. + + + + + Specifies the foreign-key constraint name + + Constraint name + + + + Specifies that this relationship is insertable + + + + + Specifies that this relationship is updatable + + + + + Sets the single column used in this relationship. Use + if you need to specify more than one column. + + Column name + + + + Specifies the columns used in this relationship + + Columns + + + + Specifies the columns used in this relationship + + Columns + + + + Specifies the sql formula used for this relationship + + Formula + + + + Specifies the property reference + + Property + + + + Specifies the property reference + + Property + + + + Sets this relationship to nullable + + + Nullable(); + Not.Nullable(); + + + + + Specifies an entity-name. + + See http://nhforge.org/blogs/nhibernate/archive/2008/10/21/entity-name-in-action-a-strongly-typed-entity.aspx + + + + Set the fetching strategy + + + Fetch.Select(); + + + + + Set the behaviour for when this relationship is null in the database + + + NotFound.Exception(); + + + + + Specifies the cascade behaviour for this relationship + + + Cascade.All(); + + + + + Specifies the access strategy for this relationship + + + Access.Field(); + + + + + Inverts the next boolean + + + + + Specify that this is a ternary association + + + + + Specify that this is a ternary association + + Index column + + + + Specify this as an entity map + + + + + Specify this as an entity map + + Index column + + + + Specify the key column name + + Column name + + + + Specify a foreign key constraint + + Constraint name + + + + Sets the order-by clause for this one-to-many relationship. + + + + + Specify that this collection is read-only + + + + + Specify a sub-select query for fetching this collection + + Query + + + + Specify that the key is updatable + + + + + Specify that the key is nullable + + + + + Sets the where clause for this one-to-many relationship. + Note: This only supports simple cases, use the string overload for more complex clauses. + + + + + Specifies the behaviour for if this collection is not found + + + + + Specify the cascade behaviour + + + + + Modify the key columns collection + + + + + Specify the property column name + + Column name + + + + Specify that this property is insertable + + + + + Specify that this property is updatable + + + + + Specify the column length + + Column length + + + + Specify the nullability of this property + + + + + Specify that this property is read-only + + + + + Specify the property formula + + Formula + + + + Specify the lazy-loading behaviour + + + + + Specify an index name + + Index name + + + + Specifies that a custom type (an implementation of ) should be used for this property for mapping it to/from one or more database columns whose format or type doesn't match this .NET property. + + A type which implements . + This property mapping to continue the method chain + + + + Specifies that a custom type (an implementation of ) should be used for this property for mapping it to/from one or more database columns whose format or type doesn't match this .NET property. + + A type which implements . + This property mapping to continue the method chain + + + + Specifies that a custom type (an implementation of ) should be used for this property for mapping it to/from one or more database columns whose format or type doesn't match this .NET property. + + A type which implements . + This property mapping to continue the method chain + + + + Specifies that a custom type (an implementation of ) should be used for this property for mapping it to/from one or more database columns whose format or type doesn't match this .NET property. + + A function which returns a type which implements . The argument of the function is the mapped property type + This property mapping to continue the method chain + + + + Specify a custom SQL type + + SQL type + + + + Specify that this property has a unique constraint + + + + + Specify decimal precision + + Decimal precision + + + + Specify decimal scale + + Decimal scale + + + + Specify a default value + + Default value + + + + Specifies the name of a multi-column unique constraint. + + Name of constraint + + + + Specify that this property is optimistically locked + + + + + Specify a check constraint + + Constraint name + + + + Specify if this property is database generated + + + Generated.Insert(); + + + + + Modify the columns collection + + + + + Set the access and naming strategy for this property. + + + + + Inverts the next boolean + + + + + Specify the column name + + Column name + + + + Specify the unsaved value + + Unsaved value + + + + Specify the column length + + Column length + + + + Specify decimal precision + + Decimal precision + + + + Specify decimal scale + + Decimal scale + + + + Specify the nullability of the column + + + + + Specify the uniqueness of the column + + + + + Specify a unique key constraint + + Constraint columns + + + + Specify an index name + + Index name + + + + Specify a check constraint + + Constraint name + + + + Specify a default value + + Default value + + + + Specify a custom type + + Usually used with an + Custom type + + + + Specify a custom type + + Usually used with an + Custom type + + + + Specify a custom type + + Usually used with an + Custom type + + + + Specify a custom SQL type + + SQL type + + + + Specify if this version is database generated + + + + + Specify the access strategy + + + + + Invert the next boolean operation + + + + + Reveals a hidden property or field for use instead of expressions. + + Entity type + Name of property or field + Expression for the hidden property or field + + + + Reveals a hidden property or field with a specific return type for use instead of expressions. + + Entity type + Property or field return type + Name of property or field + Expression for the hidden property or field + + + + Visitor that performs validation against the mapping model. + + + + + Gets or sets whether validation is performed. + + + + diff --git a/TBF_V2/Sources/TBF/packages/FluentNHibernate.2.0.3.0/lib/net40/FluentNHibernate.dll b/TBF_V2/Sources/TBF/packages/FluentNHibernate.2.0.3.0/lib/net40/FluentNHibernate.dll new file mode 100644 index 00000000..c8f03b91 Binary files /dev/null and b/TBF_V2/Sources/TBF/packages/FluentNHibernate.2.0.3.0/lib/net40/FluentNHibernate.dll differ diff --git a/TBF_V2/Sources/TBF/packages/FluentNHibernate.2.0.3.0/lib/net40/FluentNHibernate.pdb b/TBF_V2/Sources/TBF/packages/FluentNHibernate.2.0.3.0/lib/net40/FluentNHibernate.pdb new file mode 100644 index 00000000..f8fc3e94 Binary files /dev/null and b/TBF_V2/Sources/TBF/packages/FluentNHibernate.2.0.3.0/lib/net40/FluentNHibernate.pdb differ diff --git a/TBF_V2/Sources/TBF/packages/Iesi.Collections.4.0.0.4000/Iesi.Collections.4.0.0.4000.nupkg b/TBF_V2/Sources/TBF/packages/Iesi.Collections.4.0.0.4000/Iesi.Collections.4.0.0.4000.nupkg new file mode 100644 index 00000000..b0a83b2a Binary files /dev/null and b/TBF_V2/Sources/TBF/packages/Iesi.Collections.4.0.0.4000/Iesi.Collections.4.0.0.4000.nupkg differ diff --git a/TBF_V2/Sources/TBF/packages/Iesi.Collections.4.0.0.4000/lib/net40/Iesi.Collections.dll b/TBF_V2/Sources/TBF/packages/Iesi.Collections.4.0.0.4000/lib/net40/Iesi.Collections.dll new file mode 100644 index 00000000..a4199b72 Binary files /dev/null and b/TBF_V2/Sources/TBF/packages/Iesi.Collections.4.0.0.4000/lib/net40/Iesi.Collections.dll differ diff --git a/TBF_V2/Sources/TBF/packages/Iesi.Collections.4.0.0.4000/lib/net40/Iesi.Collections.xml b/TBF_V2/Sources/TBF/packages/Iesi.Collections.4.0.0.4000/lib/net40/Iesi.Collections.xml new file mode 100644 index 00000000..d189350c --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Iesi.Collections.4.0.0.4000/lib/net40/Iesi.Collections.xml @@ -0,0 +1,541 @@ + + + + Iesi.Collections + + + + + Implementation of ISet that also maintains a linked list over all elements. + Enumeration of this set is guaranteed to return the elements in the order + they were added. + + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + 1 + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + 2 + + + + Adds an item to the . + + The object to add to the .The is read-only. + + + + Removes all items from the . + + The is read-only. + + + + Determines whether the contains a specific value. + + + true if is found in the ; otherwise, false. + + The object to locate in the . + + + + Copies the elements of the to an , starting at a particular index. + + The one-dimensional that is the destination of the elements copied from . The must have zero-based indexing.The zero-based index in at which copying begins. is null. is less than 0. is multidimensional.-or-The number of elements in the source is greater than the available space from to the end of the destination .-or-Type cannot be cast automatically to the type of the destination . + + + + Removes the first occurrence of a specific object from the . + + + true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . + + The object to remove from the .The is read-only. + + + + Modifies the current set so that it contains all elements that are present in either the current set or the specified collection. + + The collection to compare to the current set. is null. + + + + Modifies the current set so that it contains only elements that are also in a specified collection. + + The collection to compare to the current set. is null. + + + + Removes all elements in the specified collection from the current set. + + The collection of items to remove from the set. is null. + + + + Modifies the current set so that it contains only elements that are present either in the current set or in the specified collection, but not both. + + The collection to compare to the current set. is null. + + + + Determines whether a set is a subset of a specified collection. + + + true if the current set is a subset of ; otherwise, false. + + The collection to compare to the current set. is null. + + + + Determines whether the current set is a superset of a specified collection. + + + true if the current set is a superset of ; otherwise, false. + + The collection to compare to the current set. is null. + + + + Determines whether the current set is a correct superset of a specified collection. + + + true if the object is a correct superset of ; otherwise, false. + + The collection to compare to the current set. is null. + + + + Determines whether the current set is a proper (strict) subset of a specified collection. + + + true if the current set is a correct subset of ; otherwise, false. + + The collection to compare to the current set. is null. + + + + Determines whether the current set overlaps with the specified collection. + + + true if the current set and share at least one common element; otherwise, false. + + The collection to compare to the current set. is null. + + + + Determines whether the current set and the specified collection contain the same elements. + + + true if the current set is equal to ; otherwise, false. + + The collection to compare to the current set. is null. + + + + Adds an element to the current set and returns a value to indicate if the element was successfully added. + + + true if the element is added to the set; false if the element is already in the set. + + The element to add to the set. + + + + Count the elements in the given collection and determine both the total + count and how many of the elements that are present in the current set. + + + + + Cast the given collection to an ISet<T> if possible. If not, + return a new set containing the items. + + + + + Unlink a node from the linked list by updating the node pointers in + its preceeding and subsequent node. Also update the _first and _last + pointers if necessary. + + + + + Gets the number of elements contained in the . + + + The number of elements contained in the . + + + + + Gets a value indicating whether the is read-only. + + + true if the is read-only; otherwise, false. + + + + +

Implements a read-only Set wrapper.

+

Although this is advertised as immutable, it really isn't. Anyone with access to the + wrapped set can still change the set.

+
+
+ + + Constructs an immutable (read-only) Set wrapper. + + The Set that is wrapped. + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + 2 + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + 1 + + + + Adds an item to the . + + The object to add to the . + is always thrown + + + + Removes all items from the . + + is always thrown + + + + Determines whether the contains a specific value. + + + true if is found in the ; otherwise, false. + + The object to locate in the . + + + + Copies the elements of the to an , starting at a particular index. + + The one-dimensional that is the destination of the elements copied from . The must have zero-based indexing.The zero-based index in at which copying begins. is null. is less than 0. is multidimensional.-or-The number of elements in the source is greater than the available space from to the end of the destination .-or-Type cannot be cast automatically to the type of the destination . + + + + Removes the first occurrence of a specific object from the . + + + true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . + + The object to remove from the . + is always thrown + + + + Adds an element to the current set and returns a value to indicate if the element was successfully added. + + + true if the element is added to the set; false if the element is already in the set. + + The element to add to the set. + is always thrown + + + + Modifies the current set so that it contains all elements that are present in both the current set and in the specified collection. + + The collection to compare to the current set. is null. + is always thrown + + + + Modifies the current set so that it contains only elements that are also in a specified collection. + + The collection to compare to the current set. is null. + is always thrown + + + + Removes all elements in the specified collection from the current set. + + The collection of items to remove from the set. is null. + is always thrown + + + + Modifies the current set so that it contains only elements that are present either in the current set or in the specified collection, but not both. + + The collection to compare to the current set. is null. + is always thrown + + + + Determines whether a set is a subset of a specified collection. + + + true if the current set is a subset of ; otherwise, false. + + The collection to compare to the current set. is null. + + + + Determines whether the current set is a superset of a specified collection. + + + true if the current set is a superset of ; otherwise, false. + + The collection to compare to the current set. is null. + + + + Determines whether the current set is a correct superset of a specified collection. + + + true if the object is a correct superset of ; otherwise, false. + + The collection to compare to the current set. is null. + + + + Determines whether the current set is a property (strict) subset of a specified collection. + + + true if the current set is a correct subset of ; otherwise, false. + + The collection to compare to the current set. is null. + + + + Determines whether the current set overlaps with the specified collection. + + + true if the current set and share at least one common element; otherwise, false. + + The collection to compare to the current set. is null. + + + + Determines whether the current set and the specified collection contain the same elements. + + + true if the current set is equal to ; otherwise, false. + + The collection to compare to the current set. is null. + + + + Gets the number of elements contained in the . + + + The number of elements contained in the . + + + + + Gets a value indicating whether the is read-only. + + + True. + + + + +

Implements a thread-safe Set wrapper. The implementation is extremely conservative, + serializing critical sections to prevent possible deadlocks, and locking on everything. + The one exception is for enumeration, which is inherently not thread-safe. For this, you + have to lock the SyncRoot object for the duration of the enumeration.

+
+
+ + + Constructs a thread-safe ISet wrapper. + + The Set object that this object will wrap. + + + + Adds an item to the . + + The object to add to the .The is read-only. + + + + Removes all items from the . + + The is read-only. + + + + Determines whether the contains a specific value. + + + true if is found in the ; otherwise, false. + + The object to locate in the . + + + + Copies the elements of the to an , starting at a particular index. + + The one-dimensional that is the destination of the elements copied from . The must have zero-based indexing.The zero-based index in at which copying begins. is null. is less than 0. is multidimensional.-or-The number of elements in the source is greater than the available space from to the end of the destination .-or-Type cannot be cast automatically to the type of the destination . + + + + Removes the first occurrence of a specific object from the . + + + true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . + + The object to remove from the .The is read-only. + + + + Modifies the current set so that it contains all elements that are present in either the current set or in the specified collection. + + The collection to compare to the current set. is null. + + + + Modifies the current set so that it contains only elements that are also in a specified collection. + + The collection to compare to the current set. is null. + + + + Removes all elements in the specified collection from the current set. + + The collection of items to remove from the set. is null. + + + + Modifies the current set so that it contains only elements that are present either in the current set or in the specified collection, but not both. + + The collection to compare to the current set. is null. + + + + Determines whether a set is a subset of a specified collection. + + + true if the current set is a subset of ; otherwise, false. + + The collection to compare to the current set. is null. + + + + Determines whether the current set is a superset of a specified collection. + + + true if the current set is a superset of ; otherwise, false. + + The collection to compare to the current set. is null. + + + + Determines whether the current set is a correct superset of a specified collection. + + + true if the object is a correct superset of ; otherwise, false. + + The collection to compare to the current set. is null. + + + + Determines whether the current set is a property (strict) subset of a specified collection. + + + true if the current set is a correct subset of ; otherwise, false. + + The collection to compare to the current set. is null. + + + + Determines whether the current set overlaps with the specified collection. + + + true if the current set and share at least one common element; otherwise, false. + + The collection to compare to the current set. is null. + + + + Determines whether the current set and the specified collection contain the same elements. + + + true if the current set is equal to ; otherwise, false. + + The collection to compare to the current set. is null. + + + + Adds an element to the current set and returns a value to indicate if the element was successfully added. + + + true if the element is added to the set; false if the element is already in the set. + + The element to add to the set. + + + + Returns an enumerator that iterates through a collection. Enumeration is inherently not + thread-safe. Use a lock on the SyncRoot to synchronize the entire enumeration process. + + + An object that can be used to iterate through the collection. + + 2 + + + + Returns an enumerator that iterates through the collection. Enumeration is inherently not + thread-safe. Use a lock on the SyncRoot to synchronize the entire enumeration process. + + + A that can be used to iterate through the collection. + + 1 + + + + Gets the number of elements contained in the . + + + The number of elements contained in the . + + + + + Gets a value indicating whether the is read-only. + + + true if the is read-only; otherwise, false. + + +
+
diff --git a/TBF_V2/Sources/TBF/packages/MSVisualBasic/lib/net40/Microsoft.VisualBasic.dll b/TBF_V2/Sources/TBF/packages/MSVisualBasic/lib/net40/Microsoft.VisualBasic.dll new file mode 100644 index 00000000..8c06fb28 Binary files /dev/null and b/TBF_V2/Sources/TBF/packages/MSVisualBasic/lib/net40/Microsoft.VisualBasic.dll differ diff --git a/TBF_V2/Sources/TBF/packages/MSVisualBasic/lib/net40/Microsoft.VisualBasic.xml b/TBF_V2/Sources/TBF/packages/MSVisualBasic/lib/net40/Microsoft.VisualBasic.xml new file mode 100644 index 00000000..40fe6450 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/MSVisualBasic/lib/net40/Microsoft.VisualBasic.xml @@ -0,0 +1,10708 @@ + + + + Microsoft.VisualBasic + + + + Indicates the window style to use for the invoked program when calling the Shell function. + 2 + + + Window is hidden and focus is passed to the hidden window. This member is equivalent to the Visual Basic constant vbHide. + + + Window has focus and is restored to its original size and position. This member is equivalent to the Visual Basic constant vbNormalFocus. + + + Window is displayed as an icon with focus. This member is equivalent to the Visual Basic constant vbMinimizedFocus. + + + Window is maximized with focus. This member is equivalent to the Visual Basic constant vbMaximizedFocus. + + + Window is restored to its most recent size and position. The currently active window remains active. This member is equivalent to the Visual Basic constant vbNormalNoFocus. + + + Window is displayed as an icon. The currently active window remains active. This member is equivalent to the Visual Basic constant vbMinimizedNoFocus. + + + Indicates how to play sounds when calling audio methods. + 1 + + + Causes the My.Computer.Audio.Play method to play the sound, and waits until it completes before calling code continues. + + + Causes the My.Computer.Audio.Play method to play the sound in the background. The calling code continues to execute. + + + Causes the My.Computer.Audio.Play method to play the sound in the background until the method is called. The calling code continues to execute. + + + Indicates the type of procedure being invoked when calling the CallByName function. + 1 + + + A method is being invoked. This member is equivalent to the Visual Basic constant vbMethod. + + + A property value is being retrieved. This member is equivalent to the Visual Basic constant vbGet. + + + An Object property value is being determined. This member is equivalent to the Visual Basic constant vbLet. + + + A property value is being determined. This member is equivalent to the Visual Basic constant vbSet. + + + A Visual Basic Collection is an ordered set of items that can be referred to as a unit. + 1 + + + Creates and returns a new Visual Basic  object. + + + Adds an element to a Collection object. + Required. An object of any type that specifies the element to add to the collection. + Optional. A unique String expression that specifies a key string that can be used instead of a positional index to access this new element in the collection. + Optional. An expression that specifies a relative position in the collection. The element to be added is placed in the collection before the element identified by the argument. If is a numeric expression, it must be a number from 1 through the value of the collection's property. If is a String expression, it must correspond to the key string specified when the element being referred to was added to the collection. You cannot specify both and . + Optional. An expression that specifies a relative position in the collection. The element to be added is placed in the collection after the element identified by the argument. If is a numeric expression, it must be a number from 1 through the value of the collection's Count property. If is a String expression, it must correspond to the key string specified when the element referred to was added to the collection. You cannot specify both and . + 1 + + + + + + Deletes all elements of a Visual Basic Collection object. + 1 + + + Returns a Boolean value indicating whether a Visual Basic Collection object contains an element with a specific key. + Returns a Boolean value indicating whether a Visual Basic Collection object contains an element with a specific key. + Required. A String expression that specifies the key for which to search the elements of the collection. + 1 + + + Returns an Integer containing the number of elements in a collection. Read-only. + Returns an Integer containing the number of elements in a collection. Read-only. + 1 + + + Returns a reference to an enumerator object, which is used to iterate over a object. + Returns a reference to an enumerator object, which is used to iterate over a object. + 1 + + + Returns the data needed to serialize the object. Implements the interface. + A object containing the information required to serialize the object. + A object containing the source and destination of the serialized stream associated with the object. + + + Copies the elements of the to an , starting at a particular index. Implements the interface. + The one-dimensional that is the destination of the elements copied from object. The must have zero-based indexing. + The zero-based index in at which copying begins. + + is null. + + is less than zero. + + is multidimensional.-or- The number of elements in the source object is greater than the available space from to the end of the destination . + The type of the source object cannot be cast automatically to the type of the destination . + + + Gets the number of items in this collection. Implements the interface. + The number of items in this collection. + + + Returns an enumerator that iterates through the collection. Implements the interface. + An object that can be used to iterate through the collection. + + + Gets a value indicating whether access to the object is synchronized (thread safe). Implements the interface. + Returns True if access to the object is synchronized (thread safe); otherwise, False. + + + Gets an object that can be used to synchronize access to the object. Implements the interface. + An object that can be used to synchronize access to the object. + + + Adds an item to the object. Implements the interface. + The position into which the new element was inserted. + The to add to the object. + The object is read-only.-or- The object has a fixed size. + + + Removes all items from the object. Implements the interface. + The is read-only. + + + Determines whether the object contains a specific value. Implements the interface. + Returns True if the is found in the object; otherwise, False. + The to locate in the object. + + + Determines the index of a specific item in the object. Implements the interface. + The index of if found in the collection; otherwise, -1. + The to locate in the object. + + + Inserts an item to the object at the specified index. Implements the interface. + The zero-based index at which should be inserted. + The to insert into the object. + + is not a valid index in the object. + The object is read-only.-or- The object has a fixed size. + + is null reference in the object. + + + Gets a value indicating whether the object has a fixed size. Implements the interface. + Returns True if the object has a fixed size; otherwise, False. + + + Gets a value indicating whether the object is read-only. Implements the interface. + Returns True if the object is read-only; otherwise, False. + + + Gets or sets the element at the specified index. Implements the interface + The element at the specified index. + The zero-based index of the element to get or set. + + is not a valid index in the object. + The property is set and the object is read-only. + + + Removes the first occurrence of a specific object from the object. Implements the interface. + The to remove from the object. + The object is read-only.-or- The object has a fixed size. + + + Removes the object item at the specified index. Implements the interface. + The zero-based index of the item to remove. + + is not a valid index in the object. + The object is read-only.-or- The object has a fixed size. + + + Returns a specific element of a Collection object either by position or by key. Read-only. + Returns a specific element of a Collection object either by position or by key. Read-only. + (A) A numeric expression that specifies the position of an element of the collection. must be a number from 1 through the value of the collection's property. Or (B) An Object expression that specifies the position or key string of an element of the collection. + 1 + + + + + + Returns a specific element of a Collection object either by position or by key. Read-only. + Returns a specific element of a Collection object either by position or by key. Read-only. + (A) A numeric expression that specifies the position of an element of the collection. must be a number from 1 through the value of the collection's property. Or (B) An Object expression that specifies the position or key string of an element of the collection. + 1 + + + + + + Returns a specific element of a Collection object either by position or by key. Read-only. + Returns a specific element of a Collection object either by position or by key. Read-only. + A unique String expression that specifies a key string that can be used, instead of a positional index, to access an element of the collection. must correspond to the argument specified when the element was added to the collection. + 1 + + + + + + Runs after the entire object graph has been deserialized. Implements the interface. + The object that initiated the callback. + + + Removes an element from a Collection object. + A numeric expression that specifies the position of an element of the collection. must be a number from 1 through the value of the collection's property. + 1 + + + Removes an element from a Collection object. + A unique String expression that specifies a key string that can be used, instead of a positional index, to access an element of the collection. must correspond to the argument specified when the element was added to the collection. + 1 + + + The ComClassAttribute attribute instructs the compiler to add metadata that allows a class to be exposed as a COM object. + 1 + + + Initializes a new instance of the ComClassAttribute class. + + + Initializes a new instance of the ComClassAttribute class. + Initializes the value of the ClassID property that is used to uniquely identify a class. + + + Initializes a new instance of the ComClassAttribute class. + Initializes the value of the ClassID property that is used to uniquely identify a class. + Initializes the value of the InterfaceID property that is used to uniquely identify an interface. + + + Initializes a new instance of the ComClassAttribute class. + Initializes the value of the ClassID property that is used to uniquely identify a class. + Initializes the value of the InterfaceID property that is used to uniquely identify an interface. + Initializes the value of the EventID property that is used to uniquely identify an event. + + + Gets a class ID used to uniquely identify a class. + Read-only. A string that can be used by the compiler to uniquely identify the class when a COM object is created. + 1 + + + Gets an event ID used to uniquely identify an event. + Read only. A string that can be used by the compiler to uniquely identify an event for the class when a COM object is created. + 1 + + + Gets an interface ID used to uniquely identify an interface. + Read-only. A string that can be used by the compiler to uniquely identify an interface for the class when a COM object is created. + 1 + + + Indicates that the COM interface name shadows another member of the class or base class. + A Boolean value that indicates that the COM interface name shadows another member of the class or base class. + 1 + + + Indicates how to compare strings when calling comparison functions. + 1 + + + Performs a binary comparison. This member is equivalent to the Visual Basic constant vbBinaryCompare. + + + Performs a textual comparison. This member is equivalent to the Visual Basic constant vbTextCompare. + + + The Constants module contains miscellaneous constants. These constants can be used anywhere in your code. + 1 + + + Indicates that the Abort button was clicked in a message box. Returned by the MsgBox function. + 1 + + + Indicates that the Abort, Retry, and Ignore buttons will be displayed when the MsgBox function is called. + 1 + + + Indicates that the message box will be displayed as a modal dialog box when the MsgBox function is called. + 1 + + + Indicates that the file has changed since the last backup operation for file-access functions. + 1 + + + Indicates that the type of a variant object is an array. Returned by the VarType function. + 1 + + + Represents a backspace character for print and display functions. + 1 + + + Specifies that a binary comparison should be performed when comparison functions are called. + 1 + + + Indicates that the type of a variant object is Boolean. Returned by the VarType function. + 1 + + + Indicates that the type of a variant object is Byte. Returned by the VarType function. + 1 + + + Indicates that the Cancel button was clicked in a message box. Returned by the MsgBox function. + 1 + + + Represents a carriage-return character for print and display functions. + 1 + + + Indicates that the critical message icon will be displayed when the MsgBox function is called. + 1 + + + Represents a carriage-return character combined with a linefeed character for print and display functions. + 1 + + + Indicates that the type of a variant object is Currency. Returned by the VarType function. + 1 + + + Indicates that the type of a variant object is Date. Returned by the VarType function. + 1 + + + Indicates that the type of a variant object is Decimal. Returned by the VarType function. + 1 + + + Indicates that the leftmost button is selected as the default button when the message box appears. + 1 + + + Indicates that the second button from the left is selected as the default button when the message box appears. + 1 + + + Indicates that the third button from the left is selected as the default button when the message box appears. + 1 + + + Indicates that the file is a directory or folder for file-access functions. + 1 + + + Indicates that the type of a variant object is Double. Returned by the VarType function. + 1 + + + Indicates that the type of a variant object is Empty. Returned by the VarType function. + 1 + + + Indicates that the exclamation icon will be displayed when the MsgBox function is called. + 1 + + + Indicates that a Boolean value of False should be used when number-formatting functions are called. + 1 + + + Indicates that the first week of the year that has at least four days should be used when date-related functions are called. + 1 + + + Indicates that the first full week of the year should be used when date-related functions are called. + 1 + + + Indicates that the week of the year in which January 1 occurs should be used when date-related functions are called. + 1 + + + Represents a form-feed character for print functions. + 1 + + + Specifies that Friday should be used as the first day of the week when date-related functions are called. + 1 + + + Indicates that the general date format for the current culture should be used when the FormatDateTime function is called. + 1 + + + Specifies that a property value should be retrieved when the CallByName function is called. + 1 + + + Indicates that the file is a hidden file for file-access functions. + 1 + + + Indicates that the window style is hidden for the invoked program when the Shell function is called. + 1 + + + Indicates Hiragana characters should be converted to Katakana characters when the StrConv function is called. + 1 + + + Indicates that the Ignore button was clicked in a message box. Returned by the MsgBox function. + 1 + + + Indicates that the information icon will display when the MsgBox function is called. + 1 + + + Indicates that the type of a variant object is Integer. Returned by the VarType function. + 1 + + + Indicates that Katakana characters should be converted to Hiragana characters when the StrConv function is called. + 1 + + + Indicates that a property value should be set to an object instance when the CallByName function is called. + 1 + + + Represents a linefeed character for print and display functions. + 1 + + + Indicates that characters should be converted to use linguistic rules for casing instead of file system rules for casing to when the StrConv function is called. + 1 + + + Indicates the type of a variant object is Long. Returned by the VarType function. + 1 + + + Indicates that the long date format for the current culture should be used when the FormatDateTime function is called. + 1 + + + Indicates that the long time format for the current culture should be used when the FormatDateTime function is called. + 1 + + + Indicates that characters should be converted to lowercase when the StrConv function is called. + 1 + + + Indicates that the window style is maximized with focus for the invoked program when the Shell function is called. + 1 + + + Specifies that a method should be called when the CallByName function is called. + 1 + + + Indicates that the window style is minimized with focus for the invoked program when the Shell function is called. + 1 + + + Indicates that the window style is minimized without focus for the invoked program when the Shell function is called. + 1 + + + Specifies that Monday should be used as the first day of the week when date-related functions are called. + 1 + + + Indicates that the Help button will be displayed when the MsgBox function is called. + 1 + + + Indicates that text will be right-aligned when the MsgBox function is called. + 1 + + + Indicates that right-to-left reading text (Hebrew and Arabic systems) will be displayed when the MsgBox function is called. + 1 + + + Indicates that the message box will display in the foreground when the MsgBox function is called. + 1 + + + Indicates that wide (double-byte) characters should be converted to narrow (single-byte) characters when the StrConv function is called. + 1 + + + Represents a newline character for print and display functions. + 1 + + + Indicates that the No button was clicked in a message box. Returned by the MsgBox function. + 1 + + + Indicates that the file is a normal file for file-access functions. + 1 + + + Indicates that the window style is normal with focus for the invoked program when the Shell function is called. + 1 + + + Indicates that the window style is normal without focus for the invoked program when the Shell function is called. + 1 + + + Indicates that the type of a variant object is Nothing. Returned by the VarType function. + 1 + + + Represents a null character for print and display functions. + 1 + + + Represents a zero-length string for print and display functions, and for calling external procedures. + 1 + + + Indicates that the type of a variant object is Object. Returned by the VarType function. + 1 + + + Represents the object error number. User-defined error numbers should be greater than this value. + 1 + + + Indicates that the OK button was clicked in a message box. Returned by the MsgBox function. + 1 + + + Indicates that the OK and Cancel buttons will be displayed when the MsgBox function is called. + 1 + + + Indicates that only the OK button will be displayed when the MsgBox function is called. + 1 + + + Indicates that the first letter of every word in a string should be converted to uppercase and the remaining characters to lowercase when the StrConv function is called. + 1 + + + Indicates that the question icon will be displayed when the MsgBox function is called. + 1 + + + Indicates that the file is a read-only file for file-access functions. + 1 + + + Indicates that the Retry button was clicked in a message box. Returned by the MsgBox function. + 1 + + + Indicates that the Retry and Cancel buttons will be displayed when the MsgBox function is called. + 1 + + + Specifies that Saturday should be used as the first day of the week when date-related functions are called. + 1 + + + Indicates that a property value should be set when the CallByName function is called. + 1 + + + Indicates that the short-date format for the current culture should be used when the FormatDateTime function is called. + 1 + + + Indicates that the short-time format for the current culture should be used when the FormatDateTime function is called. + 1 + + + Indicates that characters should be converted to Simplified Chinese when the StrConv function is called. + 1 + + + Indicates that the type of a variant object is Single. Returned by the VarType function. + 1 + + + Indicates that the type of a variant object is String. Returned by the VarType function. + 1 + + + Specifies that Sunday should be used as the first day of the week when date-related functions are called. + 1 + + + Indicates that the file is a system file for file-access functions. + 1 + + + Indicates that the message box will be displayed as a modal dialog box when the MsgBox function is called. + 1 + + + Represents a tab character for print and display functions. + 1 + + + Indicates that a text comparison should be performed when comparison functions are called. + 1 + + + Specifies that Thursday should be used as the first day of the week when date-related functions are called. + 1 + + + Indicates that characters should be converted to Traditional Chinese when the StrConv function is called. + 1 + + + Indicates that a Boolean value of True should be used when number-formatting functions are called. + 1 + + + Specifies that Tuesday should be used as the first day of the week when date-related functions are called. + 1 + + + Indicates that characters should be converted to uppercase when the StrConv function is called. + 1 + + + Indicates that the default Boolean value should be used when number-formatting functions are called. + 1 + + + Indicates that the type of a variant object is a user-defined type. Returned by the VarType function. + 1 + + + Indicates that the week specified by your system as the first week of the year should be used when date-related functions are called. + 1 + + + Indicates that the day specified by your system as the first day of the week should be used when date-related functions are called. + 1 + + + Indicates that the type of a variant object is Variant. Returned by the VarType function. + 1 + + + Represents a carriage-return character for print functions. + 1 + + + Indicates the volume label file attribute for file-access functions. + 1 + + + Specifies that Wednesday should be used as the first day of the week when date-related functions are called. + 1 + + + Indicates that narrow (single-byte) characters should be converted to wide (double-byte) characters when the StrConv function is called. + 1 + + + Indicates that the Yes button was clicked in a message box. Returned by the MsgBox function. + 1 + + + Indicates that the Yes and No buttons will be displayed when the MsgBox function is called. + 1 + + + Indicates that the Yes, No, and Cancel buttons will be displayed when the MsgBox function is called. + 1 + + + The ControlChars module contains constants used as control characters. These constants can be used anywhere in your code. + 1 + + + Initializes a new instance of the class. + + + Represents a backspace character (vbBack). + 1 + + + Represents a carriage return character (vbCr). + 1 + + + Represents a carriage return/linefeed character combination (vbCrLf). + 1 + + + Represents a form feed character for print functions (vbFormFeed). + 1 + + + Represents a line feed character (vbLf). + 1 + + + Represents a new line character (vbNewLine). + 1 + + + Represents a null character (vbNullChar). + 1 + + + Represents a double-quote character. + 1 + + + Represents a tab character (vbTab). + 1 + + + Represents a vertical tab character (vbVerticalTab). + 1 + + + The Conversion module contains the procedures used to perform various conversion operations. + 1 + + + Converts an object to the specified generic type. + An object statically typed as the requested generic type. + The object to convert. + The type to which to convert the object. + + + Converts an object to the specified type. + An object whose type at run time is the requested target type. + The object to convert. + The type to which to convert the object. + + + Returns the error message that corresponds to a given error number. + The error message that corresponds to the most recent run-time error. + + is out of range. + 1 + + + Returns the error message that corresponds to a given error number. + The error message that corresponds to a given error number. + Optional. Any valid error number. + + is out of range. + 1 + + + Return the integer portion of a number. + Return the integer portion of a number. + Required. A number of type Double or any valid numeric expression. If contains Nothing, Nothing is returned. + Number is not specified. + Number is not a numeric type. + 1 + + + Return the integer portion of a number. + Return the integer portion of a number. + Required. A number of type Double or any valid numeric expression. If contains Nothing, Nothing is returned. + Number is not specified. + Number is not a numeric type. + 1 + + + Return the integer portion of a number. + Return the integer portion of a number. + Required. A number of type Double or any valid numeric expression. If contains Nothing, Nothing is returned. + Number is not specified. + Number is not a numeric type. + 1 + + + Return the integer portion of a number. + Return the integer portion of a number. + Required. A number of type Double or any valid numeric expression. If contains Nothing, Nothing is returned. + Number is not specified. + Number is not a numeric type. + 1 + + + Return the integer portion of a number. + Return the integer portion of a number. + Required. A number of type Double or any valid numeric expression. If contains Nothing, Nothing is returned. + Number is not specified. + Number is not a numeric type. + 1 + + + Return the integer portion of a number. + Return the integer portion of a number. + Required. A number of type Double or any valid numeric expression. If contains Nothing, Nothing is returned. + Number is not specified. + Number is not a numeric type. + 1 + + + Return the integer portion of a number. + Return the integer portion of a number. + Required. A number of type Double or any valid numeric expression. If contains Nothing, Nothing is returned. + Number is not specified. + Number is not a numeric type. + 1 + + + Returns a string representing the hexadecimal value of a number. + Returns a string representing the hexadecimal value of a number. + Required. Any valid numeric expression or String expression. + + is not specified. + + is not a numeric type. + 1 + + + + + + Returns a string representing the hexadecimal value of a number. + Returns a string representing the hexadecimal value of a number. + Required. Any valid numeric expression or String expression. + + is not specified. + + is not a numeric type. + 1 + + + + + + Returns a string representing the hexadecimal value of a number. + Returns a string representing the hexadecimal value of a number. + Required. Any valid numeric expression or String expression. + + is not specified. + + is not a numeric type. + 1 + + + + + + Returns a string representing the hexadecimal value of a number. + Returns a string representing the hexadecimal value of a number. + Required. Any valid numeric expression or String expression. + + is not specified. + + is not a numeric type. + 1 + + + + + + Returns a string representing the hexadecimal value of a number. + Returns a string representing the hexadecimal value of a number. + Required. Any valid numeric expression or String expression. + + is not specified. + + is not a numeric type. + 1 + + + + + + Returns a string representing the hexadecimal value of a number. + Returns a string representing the hexadecimal value of a number. + Required. Any valid numeric expression or String expression. + + is not specified. + + is not a numeric type. + 1 + + + + + + Returns a string representing the hexadecimal value of a number. + Returns a string representing the hexadecimal value of a number. + Required. Any valid numeric expression or String expression. + + is not specified. + + is not a numeric type. + 1 + + + + + + Returns a string representing the hexadecimal value of a number. + Returns a string representing the hexadecimal value of a number. + Required. Any valid numeric expression or String expression. + + is not specified. + + is not a numeric type. + 1 + + + + + + Returns a string representing the hexadecimal value of a number. + Returns a string representing the hexadecimal value of a number. + Required. Any valid numeric expression or String expression. + + is not specified. + + is not a numeric type. + 1 + + + + + + Return the integer portion of a number. + Return the integer portion of a number. + Required. A number of type Double or any valid numeric expression. If contains Nothing, Nothing is returned. + Number is not specified. + Number is not a numeric type. + 1 + + + Return the integer portion of a number. + Return the integer portion of a number. + Required. A number of type Double or any valid numeric expression. If contains Nothing, Nothing is returned. + Number is not specified. + Number is not a numeric type. + 1 + + + Return the integer portion of a number. + Return the integer portion of a number. + Required. A number of type Double or any valid numeric expression. If contains Nothing, Nothing is returned. + Number is not specified. + Number is not a numeric type. + 1 + + + Return the integer portion of a number. + Return the integer portion of a number. + Required. A number of type Double or any valid numeric expression. If contains Nothing, Nothing is returned. + Number is not specified. + Number is not a numeric type. + 1 + + + Return the integer portion of a number. + Return the integer portion of a number. + Required. A number of type Double or any valid numeric expression. If contains Nothing, Nothing is returned. + Number is not specified. + Number is not a numeric type. + 1 + + + Return the integer portion of a number. + Return the integer portion of a number. + Required. A number of type Double or any valid numeric expression. If contains Nothing, Nothing is returned. + Number is not specified. + Number is not a numeric type. + 1 + + + Return the integer portion of a number. + Return the integer portion of a number. + Required. A number of type Double or any valid numeric expression. If contains Nothing, Nothing is returned. + Number is not specified. + Number is not a numeric type. + 1 + + + Returns a string representing the octal value of a number. + Returns a string representing the octal value of a number. + Required. Any valid numeric expression or String expression. + + is not specified. + + is not a numeric type. + 1 + + + + + + Returns a string representing the octal value of a number. + Returns a string representing the octal value of a number. + Required. Any valid numeric expression or String expression. + + is not specified. + + is not a numeric type. + 1 + + + + + + Returns a string representing the octal value of a number. + Returns a string representing the octal value of a number. + Required. Any valid numeric expression or String expression. + + is not specified. + + is not a numeric type. + 1 + + + + + + Returns a string representing the octal value of a number. + Returns a string representing the octal value of a number. + Required. Any valid numeric expression or String expression. + + is not specified. + + is not a numeric type. + 1 + + + + + + Returns a string representing the octal value of a number. + Returns a string representing the octal value of a number. + Required. Any valid numeric expression or String expression. + + is not specified. + + is not a numeric type. + 1 + + + + + + Returns a string representing the octal value of a number. + Returns a string representing the octal value of a number. + Required. Any valid numeric expression or String expression. + + is not specified. + + is not a numeric type. + 1 + + + + + + Returns a string representing the octal value of a number. + Returns a string representing the octal value of a number. + Required. Any valid numeric expression or String expression. + + is not specified. + + is not a numeric type. + 1 + + + + + + Returns a string representing the octal value of a number. + Returns a string representing the octal value of a number. + Required. Any valid numeric expression or String expression. + + is not specified. + + is not a numeric type. + 1 + + + + + + Returns a string representing the octal value of a number. + Returns a string representing the octal value of a number. + Required. Any valid numeric expression or String expression. + + is not specified. + + is not a numeric type. + 1 + + + + + + Returns a String representation of a number. + Returns a String representation of a number. + Required. An Object containing any valid numeric expression. + + is not specified. + + is not a numeric type. + 1 + + + + + + Returns the numbers contained in a string as a numeric value of appropriate type. + Returns the numbers contained in a string as a numeric value of appropriate type. + Required. Any valid String expression, Object variable, or Char value. If is of type Object, its value must be convertible to String or an error occurs. + + is too large. + + is an Object type expression that is not convertible to String. + 1 + + + + + + Returns the numbers contained in a string as a numeric value of appropriate type. + Returns the numbers contained in a string as a numeric value of appropriate type. + Required. Any valid String expression, Object variable, or Char value. If is of type Object, its value must be convertible to String or an error occurs. + + is too large. + + is an Object type expression that is not convertible to String. + 1 + + + + + + Returns the numbers contained in a string as a numeric value of appropriate type. + Returns the numbers contained in a string as a numeric value of appropriate type. + Required. Any valid String expression, Object variable, or Char value. If is of type Object, its value must be convertible to String or an error occurs. + + is too large. + + is an Object type expression that is not convertible to String. + 1 + + + + + + The DateAndTime module contains the procedures and properties used in date and time operations. + 1 + + + Returns a Date value containing a date and time value to which a specified time interval has been added. + Returns a Date value containing a date and time value to which a specified time interval has been added. + Required. DateInterval enumeration value or String expression representing the time interval you want to add. + Required. Double. Floating-point expression representing the number of intervals you want to add. can be positive (to get date/time values in the future) or negative (to get date/time values in the past). It can contain a fractional part when specifies hours, minutes, or seconds. For other values of , any fractional part of is ignored. + Required. Date. An expression representing the date and time to which the interval is to be added. itself is not changed in the calling program. + + is not coercible to Date. + Interval is invalid. + Calculated date is before 00:00:00 on January 1 of the year 1, or later than 23:59:59 on December 31, 9999. + 1 + + + + + + Returns a Date value containing a date and time value to which a specified time interval has been added. + Returns a Date value containing a date and time value to which a specified time interval has been added. + Required. DateInterval enumeration value or String expression representing the time interval you want to add. + Required. Double. Floating-point expression representing the number of intervals you want to add. can be positive (to get date/time values in the future) or negative (to get date/time values in the past). It can contain a fractional part when specifies hours, minutes, or seconds. For other values of , any fractional part of is ignored. + Required. Date. An expression representing the date and time to which the interval is to be added. itself is not changed in the calling program. + + is not coercible to Date. + Interval is invalid. + Calculated date is before 00:00:00 on January 1 of the year 1, or later than 23:59:59 on December 31, 9999. + 1 + + + + + + Returns a Long value specifying the number of time intervals between two Date values. + Returns a Long value specifying the number of time intervals between two Date values. + Required. DateInterval enumeration value or String expression representing the time interval you want to use as the unit of difference between and . + Required. Date. The first date/time value you want to use in the calculation. + Required. Date. The second date/time value you want to use in the calculation. + Optional. A value chosen from the FirstDayOfWeek enumeration that specifies the first day of the week. If not specified, FirstDayOfWeek.Sunday is used. + Optional. A value chosen from the FirstWeekOfYear enumeration that specifies the first week of the year. If not specified, FirstWeekOfYear.Jan1 is used. + Invalid . + + , , or is out of range. + + or is of an invalid type. + 1 + + + + + + Returns a Long value specifying the number of time intervals between two Date values. + Returns a Long value specifying the number of time intervals between two Date values. + Required. DateInterval enumeration value or String expression representing the time interval you want to use as the unit of difference between and . + Required. Date. The first date/time value you want to use in the calculation. + Required. Date. The second date/time value you want to use in the calculation. + Optional. A value chosen from the FirstDayOfWeek enumeration that specifies the first day of the week. If not specified, FirstDayOfWeek.Sunday is used. + Optional. A value chosen from the FirstWeekOfYear enumeration that specifies the first week of the year. If not specified, FirstWeekOfYear.Jan1 is used. + Invalid . + + , , or is out of range. + + or is of an invalid type. + 1 + + + + + + Returns an Integer value containing the specified component of a given Date value. + Returns an Integer value containing the specified component of a given Date value. + Required. DateInterval enumeration value or String expression representing the part of the date/time value you want to return. + Required. Date value that you want to evaluate. + Optional. A value chosen from the FirstDayOfWeek enumeration that specifies the first day of the week. If not specified, FirstDayOfWeek.Sunday is used. + Optional. A value chosen from the FirstWeekOfYear enumeration that specifies the first week of the year. If not specified, FirstWeekOfYear.Jan1 is used. + + is invalid. + + is not coercible to Date. + 1 + + + + + + Returns an Integer value containing the specified component of a given Date value. + Returns an Integer value containing the specified component of a given Date value. + Required. DateInterval enumeration value or String expression representing the part of the date/time value you want to return. + Required. Date value that you want to evaluate. + Optional. A value chosen from the FirstDayOfWeek enumeration that specifies the first day of the week. If not specified, FirstDayOfWeek.Sunday is used. + Optional. A value chosen from the FirstWeekOfYear enumeration that specifies the first week of the year. If not specified, FirstWeekOfYear.Jan1 is used. + + is invalid. + + is not coercible to Date. + 1 + + + + + + Returns a Date value representing a specified year, month, and day, with the time information set to midnight (00:00:00). + Returns a Date value representing a specified year, month, and day, with the time information set to midnight (00:00:00). + Required. Integer expression from 1 through 9999. However, values below this range are also accepted. If is 0 through 99, it is interpreted as being between 1930 and 2029, as explained in the "Remarks" section below. If is less than 1, it is subtracted from the current year. + Required. Integer expression from 1 through 12. However, values outside this range are also accepted. The value of is offset by 1 and applied to January of the calculated year. In other words, ( - 1) is added to January. The year is recalculated if necessary. The following results illustrate this effect:If is 1, the result is January of the calculated year.If is 0, the result is December of the previous year.If is -1, the result is November of the previous year.If is 13, the result is January of the following year. + Required. Integer expression from 1 through 31. However, values outside this range are also accepted. The value of is offset by 1 and applied to the first day of the calculated month. In other words, ( - 1) is added to the first of the month. The month and year are recalculated if necessary. The following results illustrate this effect:If is 1, the result is the first day of the calculated month.If is 0, the result is the last day of the previous month.If is -1, the result is the penultimate day of the previous month.If is past the end of the current month, the result is the appropriate day of the following month. For example, if is 4 and is 31, the result is May 1. + 1 + + + Returns or sets a String value representing the current date according to your system. + Returns or sets a String value representing the current date according to your system. + Invalid format used to set value of DateString. + 1 + + + + + + Returns a Date value containing the date information represented by a string, with the time information set to midnight (00:00:00). + Date value containing the date information represented by a string, with the time information set to midnight (00:00:00). + Required. String expression representing a date/time value from 00:00:00 on January 1 of the year 1 through 23:59:59 on December 31, 9999. + + includes invalid time information. + 1 + + + Returns an Integer value from 1 through 31 representing the day of the month. + Returns an Integer value from 1 through 31 representing the day of the month. + Required. Date value from which you want to extract the day. + 1 + + + Returns an Integer value from 0 through 23 representing the hour of the day. + Returns an Integer value from 0 through 23 representing the hour of the day. + Required. Date value from which you want to extract the hour. + 1 + + + Returns an Integer value from 0 through 59 representing the minute of the hour. + Returns an Integer value from 0 through 59 representing the minute of the hour. + Required. Date value from which you want to extract the minute. + 1 + + + Returns an Integer value from 1 through 12 representing the month of the year. + Returns an Integer value from 1 through 12 representing the month of the year. + Required. Date value from which you want to extract the month. + 1 + + + Returns a String value containing the name of the specified month. + Returns a String value containing the name of the specified month. + Required. Integer. The numeric designation of the month, from 1 through 13; 1 indicates January and 12 indicates December. You can use the value 13 with a 13-month calendar. If your system is using a 12-month calendar and is 13, MonthName returns an empty string. + Optional. Boolean value that indicates if the month name is to be abbreviated. If omitted, the default is False, which means the month name is not abbreviated. + + is less than 1 or greater than 13. + 1 + + + Returns a Date value containing the current date and time according to your system. + Returns a Date value containing the current date and time according to your system. + 1 + + + Returns an Integer value from 0 through 59 representing the second of the minute. + Returns an Integer value from 0 through 59 representing the second of the minute. + Required. Date value from which you want to extract the second. + 1 + + + Returns or sets a Date value containing the current time of day according to your system. + Returns or sets a Date value containing the current time of day according to your system. + 1 + + + + + + Returns a Double value representing the number of seconds elapsed since midnight. + Returns a Double value representing the number of seconds elapsed since midnight. + 1 + + + Returns a Date value representing a specified hour, minute, and second, with the date information set relative to January 1 of the year 1. + Returns a Date value representing a specified hour, minute, and second, with the date information set relative to January 1 of the year 1. + Required. Integer expression from 0 through 23. However, values outside this range are also accepted. + Required. Integer expression from 0 through 59. However, values outside this range are also accepted. The value of is added to the calculated hour, so a negative value specifies minutes before that hour. + Required. Integer expression from 0 through 59. However, values outside this range are also accepted. The value of is added to the calculated minute, so a negative value specifies seconds before that minute. + Argument is outside the range -2,147,483,648 through 2,147,483,647 + Calculated time is less than negative 24 hours. + 1 + + + Returns or sets a String value representing the current time of day according to your system. + Returns or sets a String value representing the current time of day according to your system. + Invalid format used to set value of TimeString. + 1 + + + + + + Returns a Date value containing the time information represented by a string, with the date information set to January 1 of the year 1. + Returns a Date value containing the time information represented by a string, with the date information set to January 1 of the year 1. + Required. String expression representing a date/time value from 00:00:00 on January 1 of the year 1 through 23:59:59 on December 31, 9999. + + includes invalid date information. + 1 + + + Returns or sets a Date value containing the current date according to your system. + Returns or sets a Date value containing the current date according to your system. + 1 + + + + + + Returns an Integer value containing a number representing the day of the week. + Returns an Integer value containing a number representing the day of the week. + Required. Date value for which you want to determine the day of the week. + Optional. A value chosen from the FirstDayOfWeek enumeration that specifies the first day of the week. If not specified, FirstDayOfWeek.Sunday is used. + + is less than 0 or more than 7. + 1 + + + Returns a String value containing the name of the specified weekday. + Returns a String value containing the name of the specified weekday. + Required. Integer. The numeric designation for the weekday, from 1 through 7; 1 indicates the first day of the week and 7 indicates the last day of the week. The identities of the first and last days depend on the setting of . + Optional. Boolean value that indicates if the weekday name is to be abbreviated. If omitted, the default is False, which means the weekday name is not abbreviated. + Optional. A value chosen from the FirstDayOfWeek enumeration that specifies the first day of the week. If not specified, FirstDayOfWeek.System is used. + + is less than 1 or greater than 7, or is less than 0 or greater than 7. + 1 + + + Returns an Integer value from 1 through 9999 representing the year. + Returns an Integer value from 1 through 9999 representing the year. + Required. Date value from which you want to extract the year. + 1 + + + Indicates how to display dates when calling the FormatDateTime function. + 1 + + + For real numbers, displays a date and time. If the number has no fractional part, displays only a date. If the number has no integer part, displays time only. Date and time display is determined by your computer's regional settings. This member is equivalent to the Visual Basic constant vbGeneralDate. + + + Displays a date using the long-date format specified in your computer's regional settings. This member is equivalent to the Visual Basic constant vbLongDate. + + + Displays a date using the short-date format specified in your computer's regional settings. This member is equivalent to the Visual Basic constant vbShortDate. + + + Displays a time using the long-time format specified in your computer's regional settings. This member is equivalent to the Visual Basic constant vbLongTime. + + + Displays a time using the short-time format specified in your computer's regional settings. This member is equivalent to the Visual Basic constant vbShortTime. + + + Indicates how to determine and format date intervals when calling date-related functions. + 1 + + + Year + + + Quarter of year (1 through 4) + + + Month (1 through 12) + + + Day of year (1 through 366) + + + Day of month (1 through 31) + + + Week of year (1 through 53) + + + Day of week (1 through 7) + + + Hour (1 through 24) + + + Minute (1 through 60) + + + Second (1 through 60) + + + Indicates when payments are due when calling financial methods. + 1 + + + Falls at the end of the date interval + + + Falls at the beginning of the date interval + + + The ErrObject module contains properties and procedures used to identify and handle run-time errors using the Err object. + 1 + + + Clears all property settings of the Err object. + 1 + + + Returns or sets a String expression containing a descriptive string associated with an error. Read/write. + Returns or sets a String expression containing a descriptive string associated with an error. Read/write. + 1 + + + Returns an integer indicating the line number of the last executed statement. Read-only. + Returns an integer indicating the line number of the last executed statement. Read-only. + 1 + + + Returns the exception representing the error that occurred. + Returns the exception representing the error that occurred. + 1 + + + Returns or sets an Integer containing the context ID for a topic in a Help file. Read/write. + Returns or sets an Integer containing the context ID for a topic in a Help file. Read/write. + 1 + + + Returns or sets a String expression containing the fully qualified path to a Help file. Read/write. + Returns or sets a String expression containing the fully qualified path to a Help file. Read/write. + 1 + + + Returns a system error code produced by a call to a dynamic-link library (DLL). Read-only. + Returns a system error code produced by a call to a dynamic-link library (DLL). Read-only. + 1 + + + + + + Returns or sets a numeric value specifying an error. Read/write. + Returns or sets a numeric value specifying an error. Read/write. + + is greater than 65535. + 1 + + + Generates a run-time error; can be used instead of the Error statement. + Required. Long integer that identifies the nature of the error. Visual Basic errors are in the range 0–65535; the range 0–512 is reserved for system errors; the range 513–65535 is available for user-defined errors. When setting the Number property to your own error code in a class module, you add your error code number to the vbObjectError constant. For example, to generate the error number 513, assign vbObjectError + 513 to the Number property. + Optional. String expression naming the object or application that generated the error. When setting this property for an object, use the form project.class. If is not specified, the process ID of the current Visual Basic project is used. + Optional. String expression describing the error. If unspecified, the value in the Number property is examined. If it can be mapped to a Visual Basic run-time error code, the string that would be returned by the Error function is used as the Description property. If there is no Visual Basic error corresponding to the Number property, the "Application-defined or object-defined error" message is used. + Optional. The fully qualified path to the Help file in which help on this error can be found. If unspecified, Visual Basic uses the fully qualified drive, path, and file name of the Visual Basic Help file. + Optional. The context ID identifying a topic within that provides help for the error. If omitted, the Visual Basic Help-file context ID for the error corresponding to the Number property is used, if it exists. + 1 + + + + + + Returns or sets a String expression specifying the name of the object or application that originally generated the error. Read/write. + Returns or sets a String expression specifying the name of the object or application that originally generated the error. Read/write. + 1 + + + Indicates the file attributes to use when calling file-access functions. + 1 + + + Normal (default for Dir and SetAttr). No special characteristics apply to this file. This member is equivalent to the Visual Basic constant vbNormal. + + + Read only. This member is equivalent to the Visual Basic constant vbReadOnly. + + + Hidden. This member is equivalent to the Visual Basic constant vbHidden. + + + System file. This member is equivalent to the Visual Basic constant vbSystem. + + + Volume label. This attribute is not valid when used with SetAttr. This member is equivalent to the Visual Basic constant vbVolume. + + + Directory or folder. This member is equivalent to the Visual Basic constant vbDirectory. + + + File has changed since last backup. This member is equivalent to the Visual Basic constant vbArchive. + + + The FileSystem module contains the procedures that are used to perform file, directory or folder, and system operations. The My feature gives you better productivity and performance in file I/O operations than using the FileSystem module. For more information, see . + 1 + + + Changes the current directory or folder. The My feature gives you better productivity and performance in file I/O operations than the ChDir function. For more information, see . + Required. A String expression that identifies which directory or folder becomes the new default directory or folder. may include the drive. If no drive is specified, ChDir changes the default directory or folder on the current drive. + + is empty. + Invalid drive is specified, or drive is unavailable. + 1 + + + + + + + Changes the current drive. + Required. String expression that specifies an existing drive. If you supply a zero-length string (""), the current drive does not change. If the argument is a multiple-character string, ChDrive uses only the first letter. + Invalid drive is specified, or drive is unavailable. + 1 + + + + + + Changes the current drive. + Required. String expression that specifies an existing drive. If you supply a zero-length string (""), the current drive does not change. If the argument is a multiple-character string, ChDrive uses only the first letter. + Invalid drive is specified, or drive is unavailable. + 1 + + + + + + Returns a string representing the current path. The gives you better productivity and performance in file I/O operations than CurDir. For more information, see . + A string representing the current path. + 1 + + + + + + + Returns a string representing the current path. The gives you better productivity and performance in file I/O operations than CurDir. For more information, see . + A string representing the current path. + Optional. Char expression that specifies an existing drive. If no drive is specified, or if is a zero-length string (""), CurDir returns the path for the current drive. + 1 + + + + + + + Returns a string representing the name of a file, directory, or folder that matches a specified pattern or file attribute, or the volume label of a drive. The gives you better productivity and performance in file I/O operations than the Dir function. See for more information. + A string representing the name of a file, directory, or folder that matches a specified pattern or file attribute, or the volume label of a drive. + 1 + + + + + + Returns a string representing the name of a file, directory, or folder that matches a specified pattern or file attribute, or the volume label of a drive. The gives you better productivity and performance in file I/O operations than the Dir function. See for more information. + A string representing the name of a file, directory, or folder that matches a specified pattern or file attribute, or the volume label of a drive. + Optional. String expression that specifies a file name, directory or folder name, or drive volume label. A zero-length string ("") is returned if is not found. + Optional. Enumeration or numeric expression whose value specifies file attributes. If omitted, Dir returns files that match but have no attributes. + 1 + + + + + + + Returns a Boolean value True when the end of a file opened for Random or sequential Input has been reached. + Returns a Boolean value True when the end of a file opened for Random or sequential Input has been reached. + Required. An Integer that contains any valid file number. + + does not exist. + File mode is invalid. + 1 + + + + + + Returns an enumeration representing the file mode for files opened using the FileOpen function. The gives you better productivity and performance in file I/O operations than the FileAttr function. See for more information. + The following enumeration values indicate the file access mode:ValueMode1OpenMode.Input2OpenMode.Output4OpenMode.Random8OpenMode.Append32OpenMode.Binary + Required. Integer. Any valid file number. + 1 + + + + + + Concludes input/output (I/O) to a file opened using the FileOpen function. My gives you better productivity and performance in file I/O operations. See for more information. + Optional. Parameter array of 0 or more channels to be closed. + + does not exist. + 1 + + + + + + + Copies a file. The gives you better productivity and performance in file I/O operations than FileCopy. See for more information. + Required. String expression that specifies the name of the file to be copied. may include the directory or folder, and drive, of the source file. + Required. String expression that specifies the destination file name. may include the directory or folder, and drive, of the destination file. + + or is invalid or not specified. + File is already open. + File does not exist. + 1 + + + + + + + Returns a Date value that indicates the date and time a file was written to. The My feature gives you better productivity and performance in file I/O operations than FileDateTime. For more information, see + Date value that indicates the date and time a file was created or last modified. + Required. String expression that specifies a file name. may include the directory or folder, and the drive. + + is invalid or contains wildcards. + Target file does not exist. + 1 + + + + + + + Reads data from an open disk file into a variable. The My feature gives you better productivity and performance in file I/O operations than FileGet. For more information, see . + Required. Any valid file number. + Required. Valid variable name into which data is read. + Optional. Record number (Random mode files) or byte number (Binary mode files) at which reading starts. + Optional. Applies only when writing an array. Specifies whether the array is to be treated as dynamic and whether an array descriptor describing the size and bounds of the array is necessary. + Optional. Applies only when writing a string. Specifies whether to write a two-byte descriptor for the string that describes the length. The default is False. + + < 1 and not equal to -1. + + does not exist. + File mode is invalid. + 1 + + + + + + Reads data from an open disk file into a variable. The My feature gives you better productivity and performance in file I/O operations than FileGet. For more information, see + Required. Any valid file number. + Required. Valid variable name into which data is read. + Optional. Record number (Random mode files) or byte number (Binary mode files) at which reading starts. + + < 1 and not equal to -1. + + does not exist. + File mode is invalid. + 1 + + + + + + Reads data from an open disk file into a variable. The My feature gives you better productivity and performance in file I/O operations than FileGet. For more information, see . + Required. Any valid file number. + Required. Valid variable name into which data is read. + Optional. Record number (Random mode files) or byte number (Binary mode files) at which reading starts. + + < 1 and not equal to -1. + + does not exist. + File mode is invalid. + 1 + + + + + + Reads data from an open disk file into a variable. The My feature gives you better productivity and performance in file I/O operations than FileGet. For more information, see . + Required. Any valid file number. + Required. Valid variable name into which data is read. + Optional. Record number (Random mode files) or byte number (Binary mode files) at which reading starts. + + < 1 and not equal to -1. + + does not exist. + File mode is invalid. + 1 + + + + + + Reads data from an open disk file into a variable. The My feature gives you better productivity and performance in file I/O operations than FileGet. For more information, see . + Required. Any valid file number. + Required. Valid variable name into which data is read. + Optional. Record number (Random mode files) or byte number (Binary mode files) at which reading starts. + + < 1 and not equal to -1. + + does not exist. + File mode is invalid. + 1 + + + + + + Reads data from an open disk file into a variable. The My feature gives you better productivity and performance in file I/O operations than FileGet. For more information, see . + Required. Any valid file number. + Required. Valid variable name into which data is read. + Optional. Record number (Random mode files) or byte number (Binary mode files) at which reading starts. + + < 1 and not equal to -1. + + does not exist. + File mode is invalid. + 1 + + + + + + Reads data from an open disk file into a variable. The My feature gives you better productivity and performance in file I/O operations than FileGet. For more information, see . + Required. Any valid file number. + Required. Valid variable name into which data is read. + Optional. Record number (Random mode files) or byte number (Binary mode files) at which reading starts. + + < 1 and not equal to -1. + + does not exist. + File mode is invalid. + 1 + + + + + + Reads data from an open disk file into a variable. The My feature gives you better productivity and performance in file I/O operations than FileGet. For more information, see . + Required. Any valid file number. + Required. Valid variable name into which data is read. + Optional. Record number (Random mode files) or byte number (Binary mode files) at which reading starts. + + < 1 and not equal to -1. + + does not exist. + File mode is invalid. + 1 + + + + + + Reads data from an open disk file into a variable. The My feature gives you better productivity and performance in file I/O operations than FileGet. For more information, see . + Required. Any valid file number. + Required. Valid variable name into which data is read. + Optional. Record number (Random mode files) or byte number (Binary mode files) at which reading starts. + + < 1 and not equal to -1. + + does not exist. + File mode is invalid. + 1 + + + + + + Reads data from an open disk file into a variable. The My feature gives you better productivity and performance in file I/O operations than FileGet. For more information, see . + Required. Any valid file number. + Required. Valid variable name into which data is read. + Optional. Record number (Random mode files) or byte number (Binary mode files) at which reading starts. + + < 1 and not equal to -1. + + does not exist. + File mode is invalid. + 1 + + + + + + Reads data from an open disk file into a variable. The My feature gives you better productivity and performance in file I/O operations than FileGet. For more information, see . + Required. Any valid file number. + Required. Valid variable name into which data is read. + Optional. Record number (Random mode files) or byte number (Binary mode files) at which reading starts. + + < 1 and not equal to -1. + + does not exist. + File mode is invalid. + 1 + + + + + + Reads data from an open disk file into a variable. The My feature gives you better productivity and performance in file I/O operations than FileGet. For more information, see . + Required. Any valid file number. + Required. Valid variable name into which data is read. + Optional. Record number (Random mode files) or byte number (Binary mode files) at which reading starts. + Optional. Applies only when writing a string. Specifies whether to write a two-byte descriptor for the string that describes the length. The default is False. + + < 1 and not equal to -1. + + does not exist. + File mode is invalid. + 1 + + + + + + Reads data from an open disk file into a variable. The My feature gives you better productivity and performance in file I/O operations than FileGet. For more information, see . + Required. Any valid file number. + Required. Valid variable name into which data is read. + Optional. Record number (Random mode files) or byte number (Binary mode files) at which reading starts. + + < 1 and not equal to -1. + + does not exist. + File mode is invalid. + 1 + + + + + + Reads data from an open disk file into a variable. The My feature gives you better productivity and performance in file I/O operations than FileGetObject. For more information, see . + Required. Any valid file number. + Required. Valid variable name into which data is read. + Optional. Record number (Random mode files) or byte number (Binary mode files) at which reading starts. + 1 + + + + + + Returns a Long value that specifies the length of a file in bytes. The My feature gives you better productivity and performance in file I/O operations than FileLen. For more information, see . + Long value that specifies the length of a file in bytes. + Required. String expression that specifies a file. may include the directory or folder, and the drive. + File does not exist. + 1 + + + + + + + Opens a file for input or output. The My feature gives you better productivity and performance in file I/O operations than FileOpen. For more information, see . + Required. Any valid file number. Use the FreeFile function to obtain the next available file number. + Required. String expression that specifies a file name—may include directory or folder, and drive. + Required. Enumeration specifying the file mode: Append, Binary, Input, Output, or Random. For more information, see . + Optional. Enumeration specifying the operations permitted on the open file: Read, Write, or ReadWrite. Defaults to ReadWrite. For more information, see . + Optional. Enumeration specifying the operations not permitted on the open file by other processes: Shared, Lock Read, Lock Write, and Lock Read Write. Defaults to Lock Read Write. For more information, see . + Optional. Number less than or equal to 32,767 (bytes). For files opened for random access, this value is the record length. For sequential files, this value is the number of characters buffered. + Invalid Access, Share, or Mode. + WriteOnly file is opened for Input. + ReadOnly file is opened for Output. + ReadOnly file is opened for Append. + Record length is negative (and not equal to -1). + + is invalid (<-1 or >255), or is already in use. + + is already open, or is invalid. + 1 + + + + + + + Writes data from a variable to a disk file. The My feature gives you better productivity and performance in file I/O operations than FilePut. For more information, see . + Required. Any valid file number. + Required. Valid variable name that contains data written to disk. + Optional. Record number (Random mode files) or byte number (Binary mode files) at which writing starts. + Optional. Applies only when writing an array. Specifies whether the array is to be treated as dynamic, and whether to write an array descriptor for the string that describes the length. + Optional. Applies only when writing a string. Specifies whether to write a two-byte string length descriptor for the string to the file. The default is False. + + < 1 and not equal to -1. + + does not exist. + File mode is invalid. + 1 + + + + + + Writes data from a variable to a disk file. The My feature gives you better productivity and performance in file I/O operations than FilePut. For more information, see . + Required. Any valid file number. + Required. Valid variable name that contains data written to disk. + Optional. Record number (Random mode files) or byte number (Binary mode files) at which writing starts. + + < 1 and not equal to -1. + + does not exist. + File mode is invalid. + 1 + + + + + + Writes data from a variable to a disk file. The My feature gives you better productivity and performance in file I/O operations than FilePut. For more information, see . + Required. Any valid file number. + Required. Valid variable name that contains data written to disk. + Optional. Record number (Random mode files) or byte number (Binary mode files) at which writing starts. + + < 1 and not equal to -1. + + does not exist. + File mode is invalid. + 1 + + + + + + Writes data from a variable to a disk file. The My feature gives you better productivity and performance in file I/O operations than FilePut. For more information, see . + Required. Any valid file number. + Required. Valid variable name that contains data written to disk. + Optional. Record number (Random mode files) or byte number (Binary mode files) at which writing starts. + + < 1 and not equal to -1. + + does not exist. + File mode is invalid. + 1 + + + + + + Writes data from a variable to a disk file. The My feature gives you better productivity and performance in file I/O operations than FilePut. For more information, see . + Required. Any valid file number. + Required. Valid variable name that contains data written to disk. + Optional. Record number (Random mode files) or byte number (Binary mode files) at which writing starts. + + < 1 and not equal to -1. + + does not exist. + File mode is invalid. + 1 + + + + + + Writes data from a variable to a disk file. The My feature gives you better productivity and performance in file I/O operations than FilePut. For more information, see . + Required. Any valid file number. + Required. Valid variable name that contains data written to disk. + Optional. Record number (Random mode files) or byte number (Binary mode files) at which writing starts. + + < 1 and not equal to -1. + + does not exist. + File mode is invalid. + 1 + + + + + + Writes data from a variable to a disk file. The My feature gives you better productivity and performance in file I/O operations than FilePut. For more information, see . + Required. Any valid file number. + Required. Valid variable name that contains data written to disk. + Optional. Record number (Random mode files) or byte number (Binary mode files) at which writing starts. + + < 1 and not equal to -1. + + does not exist. + File mode is invalid. + 1 + + + + + + Writes data from a variable to a disk file. The My feature gives you better productivity and performance in file I/O operations than FilePut. For more information, see . + Required. Any valid file number. + Required. Valid variable name that contains data written to disk. + Optional. Record number (Random mode files) or byte number (Binary mode files) at which writing starts. + + < 1 and not equal to -1. + + does not exist. + File mode is invalid. + 1 + + + + + + Writes data from a variable to a disk file. The My feature gives you better productivity and performance in file I/O operations than FilePut. For more information, see . + Required. Any valid file number. + Required. Valid variable name that contains data written to disk. + Optional. Record number (Random mode files) or byte number (Binary mode files) at which writing starts. + + < 1 and not equal to -1. + + does not exist. + File mode is invalid. + 1 + + + + + + Writes data from a variable to a disk file. The My feature gives you better productivity and performance in file I/O operations than FilePut. For more information, see . + Required. Any valid file number. + Required. Valid variable name that contains data written to disk. + Optional. Record number (Random mode files) or byte number (Binary mode files) at which writing starts. + + < 1 and not equal to -1. + + does not exist. + File mode is invalid. + 1 + + + + + + Writes data from a variable to a disk file. The My feature gives you better productivity and performance in file I/O operations than FilePut. For more information, see . + Required. Any valid file number. + Required. Valid variable name that contains data written to disk. + Optional. Record number (Random mode files) or byte number (Binary mode files) at which writing starts. + + < 1 and not equal to -1. + + does not exist. + File mode is invalid. + 1 + + + + + + Writes data from a variable to a disk file. The My feature gives you better productivity and performance in file I/O operations than FilePut. For more information, see .. + Required. Any valid file number. + Required. Valid variable name that contains data written to disk. + Optional. Record number (Random mode files) or byte number (Binary mode files) at which writing starts. + Optional. Applies only when writing a string. Specifies whether to write a two-byte string length descriptor for the string to the file. The default is False. + + < 1 and not equal to -1. + + does not exist. + File mode is invalid. + 1 + + + + + + Writes data from a variable to a disk file. The My feature gives you better productivity and performance in file I/O operations than FilePut. For more information, see . + Required. Any valid file number. + Required. Valid variable name that contains data written to disk. + Optional. Record number (Random mode files) or byte number (Binary mode files) at which writing starts. + + < 1 and not equal to -1. + + does not exist. + File mode is invalid. + 1 + + + + + + Writes data from a variable to a disk file. The My feature gives you better productivity and performance in file I/O operations than FilePut. For more information, see . + Required. Any valid file number. + Required. Valid variable name that contains data written to disk. + Optional. Record number (Random mode files) or byte number (Binary mode files) at which writing starts. + + < 1 and not equal to -1. + + does not exist. + File mode is invalid. + 1 + + + + + + Writes data from a variable to a disk file. The My feature gives you better productivity and performance in file I/O operations than FilePutObject. For more information, see . + Required. Any valid file number. + Required. Valid variable name that contains data written to disk. + Optional. Record number (Random mode files) or byte number (Binary mode files) at which writing starts. + 1 + + + + + + Assigns an output line width to a file opened by using the FileOpen function. + Required. Any valid file number. + Required. Numeric expression in the range 0–255, inclusive, which indicates how many characters appear on a line before a new line is started. If equals 0, there is no limit to the length of a line. The default value for is 0. + + does not exist. + File mode is invalid. + 1 + + + + + + Returns an Integer value that represents the next file number available for use by the FileOpen function. + Returns an Integer value that represents the next file number available for use by the FileOpen function. + More than 255 files are in use. + 1 + + + + + + Returns a FileAttribute value that represents the attributes of a file, directory, or folder. The My feature gives you better productivity and performance in file I/O operations than FileAttribute. For more information, see . + The value returned by GetAttr is the sum of the following enumeration values:ValueConstantDescriptionNormalvbNormalNormal.ReadOnlyvbReadOnlyRead-only.HiddenvbHiddenHidden.SystemvbSystemSystem file.DirectoryvbDirectoryDirectory or folder.ArchivevbArchiveFile has changed since last backup.AliasvbAliasFile has a different name.NoteThese enumerations are specified by the Visual Basic language. The names can be used anywhere in your code in place of the actual values. + Required. String expression that specifies a file, directory, or folder name. can include the directory or folder, and the drive. + + is invalid or contains wildcards. + Target file does not exist. + 1 + + + + + + + Reads data from an open sequential file and assigns the data to variables. + Required. Any valid file number. + Required. Variable that is assigned the values read from the file—cannot be an array or object variable. + + does not exist. + File mode is invalid. + 1 + + + + + + Reads data from an open sequential file and assigns the data to variables. + Required. Any valid file number. + Required. Variable that is assigned the values read from the file—cannot be an array or object variable. + + does not exist. + File mode is invalid. + 1 + + + + + + Reads data from an open sequential file and assigns the data to variables. + Required. Any valid file number. + Required. Variable that is assigned the values read from the file—cannot be an array or object variable. + + does not exist. + File mode is invalid. + 1 + + + + + + Reads data from an open sequential file and assigns the data to variables. + Required. Any valid file number. + Required. Variable that is assigned the values read from the file—cannot be an array or object variable. + + does not exist. + File mode is invalid. + 1 + + + + + + Reads data from an open sequential file and assigns the data to variables. + Required. Any valid file number. + Required. Variable that is assigned the values read from the file—cannot be an array or object variable. + + does not exist. + File mode is invalid. + 1 + + + + + + Reads data from an open sequential file and assigns the data to variables. + Required. Any valid file number. + Required. Variable that is assigned the values read from the file—cannot be an array or object variable. + + does not exist. + File mode is invalid. + 1 + + + + + + Reads data from an open sequential file and assigns the data to variables. + Required. Any valid file number. + Required. Variable that is assigned the values read from the file—cannot be an array or object variable. + + does not exist. + File mode is invalid. + 1 + + + + + + Reads data from an open sequential file and assigns the data to variables. + Required. Any valid file number. + Required. Variable that is assigned the values read from the file—cannot be an array or object variable. + + does not exist. + File mode is invalid. + 1 + + + + + + Reads data from an open sequential file and assigns the data to variables. + Required. Any valid file number. + Required. Variable that is assigned the values read from the file—cannot be an array or object variable. + + does not exist. + File mode is invalid. + 1 + + + + + + Reads data from an open sequential file and assigns the data to variables. + Required. Any valid file number. + Required. Variable that is assigned the values read from the file—cannot be an array or object variable. + + does not exist. + File mode is invalid. + 1 + + + + + + Reads data from an open sequential file and assigns the data to variables. + Required. Any valid file number. + Required. Variable that is assigned the values read from the file—cannot be an array or object variable. + + does not exist. + File mode is invalid. + 1 + + + + + + Reads data from an open sequential file and assigns the data to variables. + Required. Any valid file number. + Required. Variable that is assigned the values read from the file—cannot be an array or object variable. + + does not exist. + File mode is invalid. + 1 + + + + + + Returns String value that contains characters from a file opened in Input or Binary mode. The My feature gives you better productivity and performance in file I/O operations than InputString. For more information, see . + Returns String value that contains characters from a file opened in Input or Binary mode. The My feature gives you better productivity and performance in file I/O operations than InputString. + Required. Any valid file number. + Required. Any valid numeric expression specifying the number of characters to read. + + does not exist. + + < 0 or > 214. + 1 + + + + + + Deletes files from a disk. The My feature gives you better productivity and performance in file I/O operations than Kill. For more information, see . + Required. String expression that specifies one or more file names to be deleted. can include the directory or folder, and the drive. + Target file(s) open. + Target file(s) not found. + Permission denied. + 1 + + + + + + + Reads a single line from an open sequential file and assigns it to a String variable. + Reads a single line from an open sequential file and assigns it to a String variable. + Required. Any valid file number. + End of file reached. + + does not exist. + 1 + + + + + + Returns a Long value that specifies the current read/write position in an open file. + Returns a Long value that specifies the current read/write position in an open file. + Required. Any valid Integer file number. + + does not exist. + File mode is invalid. + 1 + + + + + + Controls access by other processes to all or part of a file opened by using the Open function. The My feature gives you better productivity and performance in file I/O operations than Lock and Unlock. For more information, see . + Required. Any valid file number. + + does not exist. + File mode is invalid. + 1 + + + + + + Controls access by other processes to all or part of a file opened by using the Open function. The My feature gives you better productivity and performance in file I/O operations than Lock and Unlock. For more information, see . + Required. Any valid file number. + Optional. Number of the only record or byte to lock or unlock + + does not exist. + File mode is invalid. + 1 + + + + + + Controls access by other processes to all or part of a file opened by using the Open function. The My feature gives you better productivity and performance in file I/O operations than Lock and Unlock. For more information, see . + Required. Any valid file number. + Optional. Number of the first record or byte to lock or unlock. + Optional. Number of the last record or byte to lock or unlock. + + does not exist. + File mode is invalid. + 1 + + + + + + Returns a Long representing the size, in bytes, of a file opened by using the FileOpen function. The My feature gives you better productivity and performance in file I/O operations than LOF. For more information, see . + Returns a Long representing the size, in bytes, of a file opened by using the FileOpen function. The My feature gives you better productivity and performance in file I/O operations than LOF. + Required. An Integer that contains a valid file number. + + does not exist. + File mode is invalid. + 1 + + + + + + Creates a new directory. The My feature gives you better productivity and performance in file I/O operations than MkDir. For more information, see . + Required. String expression that identifies the directory to be created. The may include the drive. If no drive is specified, MkDir creates the new directory on the current drive. + + is not specified or is empty. + Permission denied. + Directory already exists. + 1 + + + + + + + Writes display-formatted data to a sequential file. + Required. Any valid file number. + Optional. Zero or more comma-delimited expressions to write to a file.The argument settings are: + 1 + + + + + + Writes display-formatted data to a sequential file. + Required. Any valid file number. + Optional. Zero or more comma-delimited expressions to write to a file.The argument settings are: + 1 + + + + + + Renames a disk file or directory. The My feature gives you better productivity and performance in file I/O operations than Rename. For more information, see . + Required. String expression that specifies the existing file name and location. may include the directory, and drive, of the file. + Required. String expression that specifies the new file name and location. may include directory and drive of the destination location. The file name specified by cannot already exist. + Path is invalid. + + file does not exist. + + file already exists. + Access is invalid. + Cannot rename to different device. + 1 + + + + + + + Closes all disk files opened by using the FileOpen function. The My feature gives you better productivity and performance in file I/O operations than Reset. For more information, see . + 1 + + + + + + + Removes an existing directory. The My feature gives you better productivity and performance in file I/O operations than RmDir. For more information, see . + Required. String expression that identifies the directory or folder to be removed. can include the drive. If no drive is specified, RmDir removes the directory on the current drive. + + is not specified or is empty. + Target directory contains files. + Directory does not exist. + 1 + + + + + + + Returns a Long specifying the current read/write position in a file opened by using the FileOpen function, or sets the position for the next read/write operation in a file opened by using the FileOpen function. The My feature gives you better productivity and performance in file I/O operations than Seek. For more information, see . + Returns a Long specifying the current read/write position in a file opened by using the FileOpen function, or sets the position for the next read/write operation in a file opened by using the FileOpen function. + Required. An Integer that contains a valid file number. + + does not exist. + File mode is invalid. + 1 + + + + + + Returns a Long specifying the current read/write position in a file opened by using the FileOpen function, or sets the position for the next read/write operation in a file opened by using the FileOpen function. The My feature gives you better productivity and performance in file I/O operations than Seek. For more information, see . + Required. An Integer that contains a valid file number. + Required. Number in the range 1–2,147,483,647, inclusive, that indicates where the next read/write operation should occur. + + does not exist. + File mode is invalid. + 1 + + + + + + Sets attribute information for a file. The My feature gives you better productivity and performance in file I/O operations than SetAttr. For more information, see . + Required. String expression that specifies a file name. can include directory or folder, and drive. + Required. Constant or numeric expression, whose sum specifies file attributes. + + invalid or does not exist. + + type is invalid. + 1 + + + + + + + Used with the Print or PrintLine function to position output. + Used with the Print or PrintLine function to position output. + Required. The number of spaces to insert before displaying or printing the next expression in a list. + 1 + + + + + + Used with the Print or PrintLine functions to position output. + Used with the Print or PrintLine functions to position output. + 1 + + + + + + Used with the Print or PrintLine functions to position output. + Used with the Print or PrintLine functions to position output. + Optional. The column number moved to before displaying or printing the next expression in a list. If omitted, TAB moves the insertion point to the start of the next print zone. + 1 + + + + + + Controls access by other processes to all or part of a file opened by using the Open function. The My feature gives you better productivity and performance in file I/O operations than Lock and Unlock. For more information, see . + Required. Any valid file number. + + does not exist. + File mode is invalid. + 1 + + + + + + Controls access by other processes to all or part of a file opened by using the Open function. The My feature gives you better productivity and performance in file I/O operations than Lock and Unlock. For more information, see . + Required. Any valid file number. + Optional. Number of the only record or byte to lock or unlock + + does not exist. + File mode is invalid. + 1 + + + + + + Controls access by other processes to all or part of a file opened by using the Open function. The My feature gives you better productivity and performance in file I/O operations than Lock and Unlock. For more information, see . + Required. Any valid file number. + Optional. Number of the first record or byte to lock or unlock. + Optional. Number of the last record or byte to lock or unlock. + + does not exist. + File mode is invalid. + 1 + + + + + + Writes data to a sequential file. Data written with Write is usually read from a file by using Input. + Required. An Integer expression that contains any valid file number. + Optional. One or more comma-delimited expressions to write to a file. + + does not exist. + File mode is invalid. + 1 + + + + + + Writes data to a sequential file. Data written with Write is usually read from a file by using Input. + Required. An Integer expression that contains any valid file number. + Optional. One or more comma-delimited expressions to write to a file. + 1 + + + + + + The Financial module contains procedures used to perform financial operations. + 1 + + + Returns a Double specifying the depreciation of an asset for a specific time period using the double-declining balance method or some other method you specify. + Returns a Double specifying the depreciation of an asset for a specific time period using the double-declining balance method or some other method you specify. + Required. Double specifying initial cost of the asset. + Required. Double specifying value of the asset at the end of its useful life. + Required. Double specifying length of useful life of the asset. + Required. Double specifying period for which asset depreciation is calculated. + Optional. Double specifying rate at which the balance declines. If omitted, 2 (double-declining method) is assumed. + + <= 0, < 0, <= 0, or > + 1 + + + Returns a Double specifying the future value of an annuity based on periodic, fixed payments and a fixed interest rate. + Returns a Double specifying the future value of an annuity based on periodic, fixed payments and a fixed interest rate. + Required. Double specifying interest rate per period. For example, if you get a car loan at an annual percentage rate (APR) of 10 percent and make monthly payments, the rate per period is 0.1/12, or 0.0083. + Required. Double specifying total number of payment periods in the annuity. For example, if you make monthly payments on a four-year car loan, your loan has a total of 4 x 12 (or 48) payment periods. + Required. Double specifying payment to be made each period. Payments usually contain principal and interest that doesn't change over the life of the annuity. + Optional. Double specifying present value (or lump sum) of a series of future payments. For example, when you borrow money to buy a car, the loan amount is the present value to the lender of the monthly car payments you will make. If omitted, 0 is assumed. + Optional. Object of type that specifies when payments are due. This argument must be either DueDate.EndOfPeriod if payments are due at the end of the payment period, or DueDate.BegOfPeriod if payments are due at the beginning of the period. If omitted, DueDate.EndOfPeriod is assumed. + 1 + + + Returns a Double specifying the interest payment for a given period of an annuity based on periodic, fixed payments and a fixed interest rate. + Returns a Double specifying the interest payment for a given period of an annuity based on periodic, fixed payments and a fixed interest rate. + Required. Double specifying interest rate per period. For example, if you get a car loan at an annual percentage rate (APR) of 10 percent and make monthly payments, the rate per period is 0.1/12, or 0.0083. + Required. Double specifying payment period in the range 1 through . + Required. Double specifying total number of payment periods in the annuity. For example, if you make monthly payments on a four-year car loan, your loan has a total of 4 x 12 (or 48) payment periods. + Required. Double specifying present value, or value today, of a series of future payments or receipts. For example, when you borrow money to buy a car, the loan amount is the present value to the lender of the monthly car payments you will make. + Optional. Double specifying future value or cash balance you want after you've made the final payment. For example, the future value of a loan is $0 because that's its value after the final payment. However, if you want to save $50,000 over 18 years for your child's education, then $50,000 is the future value. If omitted, 0 is assumed. + Optional. Object of type that specifies when payments are due. This argument must be either DueDate.EndOfPeriod if payments are due at the end of the payment period, or DueDate.BegOfPeriod if payments are due at the beginning of the period. If omitted, DueDate.EndOfPeriod is assumed. + + <= 0 or > + 1 + + + Returns a Double specifying the internal rate of return for a series of periodic cash flows (payments and receipts). + Returns a Double specifying the internal rate of return for a series of periodic cash flows (payments and receipts). + Required. Array of Double specifying cash flow values. The array must contain at least one negative value (a payment) and one positive value (a receipt). + Optional. Object specifying value you estimate will be returned by IRR. If omitted, is 0.1 (10 percent). + Array argument values are invalid or <= -1. + 1 + + + Returns a Double specifying the modified internal rate of return for a series of periodic cash flows (payments and receipts). + Returns a Double specifying the modified internal rate of return for a series of periodic cash flows (payments and receipts). + Required. Array of Double specifying cash-flow values. The array must contain at least one negative value (a payment) and one positive value (a receipt). + Required. Double specifying interest rate paid as the cost of financing. + Required. Double specifying interest rate received on gains from cash reinvestment. + Rank of does not equal 1, = -1, or = -1 + Division by zero has occurred. + 1 + + + Returns a Double specifying the number of periods for an annuity based on periodic fixed payments and a fixed interest rate. + Returns a Double specifying the number of periods for an annuity based on periodic fixed payments and a fixed interest rate. + Required. Double specifying interest rate per period. For example, if you get a car loan at an annual percentage rate (APR) of 10 percent and make monthly payments, the rate per period is 0.1/12, or 0.0083. + Required. Double specifying payment to be made each period. Payments usually contain principal and interest that does not change over the life of the annuity. + Required. Double specifying present value, or value today, of a series of future payments or receipts. For example, when you borrow money to buy a car, the loan amount is the present value to the lender of the monthly car payments you will make. + Optional. Double specifying future value or cash balance you want after you have made the final payment. For example, the future value of a loan is $0 because that is its value after the final payment. However, if you want to save $50,000 over 18 years for your child's education, then $50,000 is the future value. If omitted, 0 is assumed. + Optional. Object of type that specifies when payments are due. This argument must be either DueDate.EndOfPeriod if payments are due at the end of the payment period, or DueDate.BegOfPeriod if payments are due at the beginning of the period. If omitted, DueDate.EndOfPeriod is assumed. + + <= -1. + + = 0 and = 0 + 1 + + + Returns a Double specifying the net present value of an investment based on a series of periodic cash flows (payments and receipts) and a discount rate. + Returns a Double specifying the net present value of an investment based on a series of periodic cash flows (payments and receipts) and a discount rate. + Required. Double specifying discount rate over the length of the period, expressed as a decimal. + Required. Array of Double specifying cash flow values. The array must contain at least one negative value (a payment) and one positive value (a receipt). + + is Nothing, rank of <> 1, or = -1 + 1 + + + Returns a Double specifying the payment for an annuity based on periodic, fixed payments and a fixed interest rate. + Returns a Double specifying the payment for an annuity based on periodic, fixed payments and a fixed interest rate. + Required. Double specifies the interest rate per period. For example, if you get a car loan at an annual percentage rate (APR) of 10 percent and make monthly payments, the rate per period is 0.1/12, or 0.0083. + Required. Double specifies the total number of payment periods in the annuity. For example, if you make monthly payments on a four-year car loan, your loan has a total of 4 × 12 (or 48) payment periods. + Required. Double specifies the present value (or lump sum) that a series of payments to be paid in the future is worth now. For example, when you borrow money to buy a car, the loan amount is the present value to the lender of the monthly car payments you will make. + Optional. Double specifying future value or cash balance you want after you have made the final payment. For example, the future value of a loan is $0 because that is its value after the final payment. However, if you want to save $50,000 during 18 years for your child's education, then $50,000 is the future value. If omitted, 0 is assumed. + Optional. Object of type that specifies when payments are due. This argument must be either DueDate.EndOfPeriod if payments are due at the end of the payment period, or DueDate.BegOfPeriod if payments are due at the beginning of the period. If omitted, DueDate.EndOfPeriod is assumed. + + = 0. + 1 + + + Returns a Double specifying the principal payment for a given period of an annuity based on periodic fixed payments and a fixed interest rate. + Returns a Double specifying the principal payment for a given period of an annuity based on periodic fixed payments and a fixed interest rate. + Required. Double specifies the interest rate per period. For example, if you get a car loan at an annual percentage rate (APR) of 10 percent and make monthly payments, the rate per period is 0.1/12, or 0.0083. + Required. Double specifies the payment period in the range 1 through . + Required. Double specifies the total number of payment periods in the annuity. For example, if you make monthly payments on a four-year car loan, your loan has a total of 4 x 12 (or 48) payment periods. + Required. Double specifies the current value of a series of future payments or receipts. For example, when you borrow money to buy a car, the loan amount is the present value to the lender of the monthly car payments you will make. + Optional. Double specifying future value or cash balance you want after you have made the final payment. For example, the future value of a loan is $0 because that is its value after the final payment. However, if you want to save $50,000 over 18 years for your child's education, then $50,000 is the future value. If omitted, 0 is assumed. + Optional. Object of type that specifies when payments are due. This argument must be either DueDate.EndOfPeriod if payments are due at the end of the payment period, or DueDate.BegOfPeriod if payments are due at the beginning of the period. If omitted, DueDate.EndOfPeriod is assumed. + + <=0 or > . + 1 + + + Returns a Double specifying the present value of an annuity based on periodic, fixed payments to be paid in the future and a fixed interest rate. + Returns a Double specifying the present value of an annuity based on periodic, fixed payments to be paid in the future and a fixed interest rate. + Required. Double specifies the interest rate per period. For example, if you get a car loan at an annual percentage rate (APR) of 10 percent and make monthly payments, the rate per period is 0.1/12, or 0.0083. + Required. Double specifies the total number of payment periods in the annuity. For example, if you make monthly payments on a four-year car loan, your loan has 4 x 12 (or 48) payment periods. + Required. Double specifies the payment to be made each period. Payments usually contain principal and interest that does not change during the life of the annuity. + Optional. Double specifies the future value or cash balance you want after you make the final payment. For example, the future value of a loan is $0 because that is its value after the final payment. However, if you want to save $50,000 over 18 years for your child's education, then $50,000 is the future value. If omitted, 0 is assumed. + Optional. Object of type that specifies when payments are due. This argument must be either DueDate.EndOfPeriod if payments are due at the end of the payment period, or DueDate.BegOfPeriod if payments are due at the beginning of the period. If omitted, DueDate.EndOfPeriod is assumed. + 1 + + + Returns a Double specifying the interest rate per period for an annuity. + Returns a Double specifying the interest rate per period for an annuity. + Required. Double specifies the total number of payment periods in the annuity. For example, if you make monthly payments on a four-year car loan, your loan has a total of 4 * 12 (or 48) payment periods. + Required. Double specifies the payment to be made each period. Payments usually contain principal and interest that doesn't change over the life of the annuity. + Required. Double specifies the present value, or value today, of a series of future payments or receipts. For example, when you borrow money to buy a car, the loan amount is the present value to the lender of the monthly car payments you will make. + Optional. Double specifies the future value or cash balance you want after you make the final payment. For example, the future value of a loan is $0 because that is its value after the final payment. However, if you want to save $50,000 over 18 years for your child's education, then $50,000 is the future value. If omitted, 0 is assumed. + Optional. Object of type that specifies when payments are due. This argument must be either DueDate.EndOfPeriod if payments are due at the end of the payment period, or DueDate.BegOfPeriod if payments are due at the beginning of the period. If omitted, DueDate.EndOfPeriod is assumed. + Optional. Double specifying value you estimate is returned by Rate. If omitted, is 0.1 (10 percent). + + <= 0. + 1 + + + Returns a Double specifying the straight-line depreciation of an asset for a single period. + Returns a Double specifying the straight-line depreciation of an asset for a single period. + Required. Double specifying initial cost of the asset. + Required. Double specifying value of the asset at the end of its useful life. + Required. Double specifying length of the useful life of the asset. + + = 0. + 1 + + + Returns a Double specifying the sum-of-years digits depreciation of an asset for a specified period. + Returns a Double specifying the sum-of-years digits depreciation of an asset for a specified period. + Required. Double specifying the initial cost of the asset. + Required. Double specifying the value of the asset at the end of its useful life. + Required. Double specifying the length of the useful life of the asset. + Required. Double specifying the period for which asset depreciation is calculated. + + < 0, > , or <=0. + 1 + + + Indicates the first day of the week to use when calling date-related functions. + 1 + + + The first day of the week as specified in your system settings This member is equivalent to the Visual Basic constant vbUseSystemDayOfWeek. + + + Sunday (default) This member is equivalent to the Visual Basic constant vbSunday. + + + Monday This member is equivalent to the Visual Basic constant vbMonday. + + + Tuesday This member is equivalent to the Visual Basic constant vbTuesday. + + + Wednesday This member is equivalent to the Visual Basic constant vbWednesday. + + + Thursday This member is equivalent to the Visual Basic constant vbThursday. + + + Friday This member is equivalent to the Visual Basic constant vbFriday. + + + Saturday This member is equivalent to the Visual Basic constant vbSaturday. + + + Indicates the first week of the year to use when calling date-related functions. + 1 + + + The weekspecified in your system settings as the first week of the year. This member is equivalent to the Visual Basic constant vbUseSystem. + + + The week in which January 1 occurs (default). This member is equivalent to the Visual Basic constant vbFirstJan1. + + + The first week that has at least four days in the new year. This member is equivalent to the Visual Basic constant vbFirstFourDays. + + + The first full week of the year. This member is equivalent to the Visual Basic constant vbFirstFullWeek. + + + The Globals module contains script engine functions. + 1 + + + Returns a String representing the runtime currently in use. + Returns a String representing the runtime currently in use. + 1 + + + Returns an Integer containing the build version number of the runtime currently in use. + Returns an Integer containing the build version number of the runtime currently in use. + 1 + + + Returns an Integer containing the major version number of the runtime currently in use. + Returns an Integer containing the major version number of the runtime currently in use. + 1 + + + Returns an Integer containing the minor version number of the runtime currently in use. + Returns an Integer containing the minor version number of the runtime currently in use. + 1 + + + The HideModuleNameAttribute attribute, when applied to a module, allows the module members to be accessed using only the qualification needed for the module. + 1 + + + Initializes a new instance of the attribute. + + + The Information module contains the procedures used to return, test for, or verify information. + 1 + + + Returns an integer indicating the line number of the last executed statement. Read-only. + Returns an integer indicating the line number of the last executed statement. Read-only. + 1 + + + Contains information about run-time errors. + Contains information about run-time errors. + 1 + + + Returns a Boolean value indicating whether a variable points to an array. + Returns a Boolean value indicating whether a variable points to an array. + Required. Object variable. + 1 + + + Returns a Boolean value indicating whether an expression represents a valid Date value. + Returns a Boolean value indicating whether an expression represents a valid Date value. + Required. Object expression. + 1 + + + Returns a Boolean value indicating whether an expression evaluates to the class. + Returns a Boolean value indicating whether an expression evaluates to the class. + Required. Object expression. + 1 + + + Returns a Boolean value indicating whether an expression is an exception type. + Returns a Boolean value indicating whether an expression is an exception type. + Required. Object expression. + 1 + + + Returns a Boolean value indicating whether an expression has no object assigned to it. + Returns a Boolean value indicating whether an expression has no object assigned to it. + Required. Object expression. + 1 + + + Returns a Boolean value indicating whether an expression can be evaluated as a number. + Returns a Boolean value indicating whether an expression can be evaluated as a number. + Required. Object expression. + 1 + + + Returns a Boolean value indicating whether an expression evaluates to a reference type. + Returns a Boolean value indicating whether an expression evaluates to a reference type. + Required. Object expression. + 1 + + + Returns the lowest available subscript for the indicated dimension of an array. + Integer. The lowest value the subscript for the specified dimension can contain. LBound always returns 0 as long as has been initialized, even if it has no elements, for example if it is a zero-length string. If is Nothing, LBound throws an . + Required. Array of any data type. The array in which you want to find the lowest possible subscript of a dimension. + Optional. Integer. The dimension for which the lowest possible subscript is to be returned. Use 1 for the first dimension, 2 for the second, and so on. If is omitted, 1 is assumed. + + is Nothing. + + < 1 or is greater than the rank of . + 1 + + + Returns an Integer value representing the RGB color code corresponding to the specified color number. + Returns an Integer value representing the RGB color code corresponding to the specified color number. + Required. A whole number in the range 0–15. + + is outside of range 0 to 15, inclusive. + 1 + + + Returns an Integer value representing an RGB color value from a set of red, green and blue color components. + Returns an Integer value representing an RGB color value from a set of red, green and blue color components. + Required. Integer in the range 0–255, inclusive, that represents the intensity of the red component of the color. + Required. Integer in the range 0–255, inclusive, that represents the intensity of the green component of the color. + Required. Integer in the range 0–255, inclusive, that represents the intensity of the blue component of the color. + + , , or outside of range 0 and 255, inclusive. + 1 + + + Returns a String value containing the system data type name of a variable. + Returns a String value containing the system data type name of a variable. + Required. A String variable containing a Visual Basic type name. + 1 + + + Returns a String value containing data-type information about a variable. + Returns a String value containing data-type information about a variable. + Required. Object variable. If Option Strict is Off, you can pass a variable of any data type except a structure. + 1 + + + + + + Returns the highest available subscript for the indicated dimension of an array. + Integer. The highest value the subscript for the specified dimension can contain. If has only one element, UBound returns 0. If has no elements, for example if it is a zero-length string, UBound returns -1. + Required. Array of any data type. The array in which you want to find the highest possible subscript of a dimension. + Optional. Integer. The dimension for which the highest possible subscript is to be returned. Use 1 for the first dimension, 2 for the second, and so on. If is omitted, 1 is assumed. + + is Nothing + + is less than 1 or is greater than the rank of . + 1 + + + Returns an Integer value containing the data type classification of a variable. + Returns an Integer value containing the data type classification of a variable. + Required. Object variable. If Option Strict is Off, you can pass a variable of any data type except a structure. + 1 + + + Returns a String value containing the Visual Basic data type name of a variable. + Returns a String value containing the Visual Basic data type name of a variable. + Required. String variable containing a type name used by the common language runtime. + 1 + + + The Interaction module contains procedures used to interact with objects, applications, and systems. + 1 + + + Activates an application that is already running. + Integer specifying the Win32 process ID number assigned to this process. You can use the ID returned by the , provided it is not zero. + 1 + + + + + + + Activates an application that is already running. + String expression specifying the title in the title bar of the application you want to activate. You can use the title assigned to the application when it was launched. + 1 + + + + + + + Sounds a tone through the computer's speaker. + 1 + + + + + + Executes a method on an object, or sets or returns a property on an object. + Executes a method on an object, or sets or returns a property on an object. + Required. Object. A pointer to the object exposing the property or method. + Required. String. A string expression containing the name of the property or method on the object. + Required. An enumeration member of type representing the type of procedure being called. The value of CallType can be Method, Get, or Set. + Optional. ParamArray. A parameter array containing the arguments to be passed to the property or method being called. + Invalid value; must be Method, Get, or Set. + 1 + + + + + + Selects and returns a value from a list of arguments. + Selects and returns a value from a list of arguments. + Required. Double. Numeric expression that results in a value between 1 and the number of elements passed in the argument. + Required. Object parameter array. You can supply either a single variable or an expression that evaluates to the Object data type, to a list of Object variables or expressions separated by commas, or to a single-dimensional array of Object elements. + 1 + + + Returns the argument portion of the command line used to start Visual Basic or an executable program developed with Visual Basic. The My feature provides greater productivity and performance than the Command function. For more information, see . + Returns the argument portion of the command line used to start Visual Basic or an executable program developed with Visual Basic.The My feature provides greater productivity and performance than the Command function. For more information, see . + 1 + + + + + + Creates and returns a reference to a COM object. CreateObject cannot be used to create instances of classes in Visual Basic unless those classes are explicitly exposed as COM components. + Creates and returns a reference to a COM object. CreateObject cannot be used to create instances of classes in Visual Basic unless those classes are explicitly exposed as COM components. + Required. String. The program ID of the object to create. + Optional. String. The name of the network server where the object will be created. If is an empty string (""), the local computer is used. + + not found or not supplied-or- fails the DnsValidateName function, most likely because it is longer than 63 characters or contains an invalid character. + Server is unavailable + No object of the specified type exists + 1 + + + + + + + Deletes a section or key setting from an application's entry in the Windows registry. The My feature gives you greater productivity and performance in registry operations than the DeleteSetting function. For more information, see . + Required. String expression containing the name of the application or project to which the section or key setting applies. + Required. String expression containing the name of the section from which the key setting is being deleted. If only and are provided, the specified section is deleted along with all related key settings. + Optional. String expression containing the name of the key setting being deleted. + + , , or setting does not exist. + User is not logged in. + 1 + + + + + + + + Returns the string associated with an operating-system environment variable. + Returns the string associated with an operating-system environment variable. + Required. Expression that evaluates either a string containing the name of an environment variable, or an integer corresponding to the numeric order of an environment string in the environment-string table. + + is missing. + 1 + + + + + + Returns the string associated with an operating-system environment variable. + Returns the string associated with an operating-system environment variable. + Required. Expression that evaluates either a string containing the name of an environment variable, or an integer corresponding to the numeric order of an environment string in the environment-string table. + + is missing. + 1 + + + + + + Returns a list of key settings and their respective values (originally created with SaveSetting) from an application's entry in the Windows registry. Using the My feature gives you greater productivity and performance in registry operations than GetAllSettings. For more information, see . + Returns a list of key settings and their respective values (originally created with SaveSetting) from an application's entry in the Windows registry.Using the My feature gives you greater productivity and performance in registry operations than GetAllSettings. For more information, see . + Required. String expression containing the name of the application or project whose key settings are requested. + Required. String expression containing the name of the section whose key settings are requested. GetAllSettings returns an object that contains a two-dimensional array of strings. The strings contain all the key settings in the specified section, plus their corresponding values. + User is not logged in. + + + + 1 + + + Returns a reference to an object provided by a COM component. + Returns a reference to an object provided by a COM component. + Optional. String. The full path and name of the file containing the object to retrieve. If is omitted, is required. + Required if is not supplied. String. A string representing the class of the object. The argument has the following syntax and parts:.ParameterDescriptionRequired. String. The name of the application providing the object.Required. String. The type or class of object to create. + No object of the specified class type exists. + No object with the specified path and file name exists. + 1 + + + + + + Returns a key setting value from an application's entry in the Windows registry. The My feature gives you greater productivity and performance in registry operations than GetAllSettings. For more information, see . + Returns a key setting value from an application's entry in the Windows registry.The My feature gives you greater productivity and performance in registry operations than GetAllSettings. + Required. String expression containing the name of the application or project whose key setting is requested. + Required. String expression containing the name of the section in which the key setting is found. + Required. String expression containing the name of the key setting to return. + Optional. Expression containing the value to return if no value is set in the setting. If omitted, is assumed to be a zero-length string (""). + One or more arguments are not String expressions, or user is not logged in. + 1 + + + + + + Returns one of two objects, depending on the evaluation of an expression. + Returns one of two objects, depending on the evaluation of an expression. + Required. Boolean. The expression you want to evaluate. + Required. Object. Returned if evaluates to True. + Required. Object. Returned if evaluates to False. + 1 + + + Displays a prompt in a dialog box, waits for the user to input text or click a button, and then returns a string containing the contents of the text box. + Displays a prompt in a dialog box, waits for the user to input text or click a button, and then returns a string containing the contents of the text box. + Required String expression displayed as the message in the dialog box. The maximum length of is approximately 1024 characters, depending on the width of the characters used. If consists of more than one line, you can separate the lines using a carriage return character (Chr(13)), a line feed character (Chr(10)), or a carriage return/line feed combination (Chr(13) & Chr(10)) between each line. + Optional. String expression displayed in the title bar of the dialog box. If you omit , the application name is placed in the title bar. + Optional. String expression displayed in the text box as the default response if no other input is provided. If you omit , the displayed text box is empty. + Optional. Numeric expression that specifies, in twips, the distance of the left edge of the dialog box from the left edge of the screen. If you omit , the dialog box is centered horizontally. + Optional. Numeric expression that specifies, in twips, the distance of the upper edge of the dialog box from the top of the screen. If you omit , the dialog box is positioned vertically approximately one-third of the way down the screen. + 1 + + + + + + + + Displays a message in a dialog box, waits for the user to click a button, and then returns an integer indicating which button the user clicked. + ConstantValueOK1Cancel2Abort3Retry4Ignore5Yes6No7 + Required. String expression displayed as the message in the dialog box. The maximum length of is approximately 1024 characters, depending on the width of the characters used. If consists of more than one line, you can separate the lines using a carriage return character (Chr(13)), a line feed character (Chr(10)), or a carriage return/linefeed character combination (Chr(13) & Chr(10)) between each line. + Optional. Numeric expression that is the sum of values specifying the number and type of buttons to display, the icon style to use, the identity of the default button, and the modality of the message box. If you omit , the default value is zero. + Optional. String expression displayed in the title bar of the dialog box. If you omit , the application name is placed in the title bar. + + is not a String expression, or is invalid. + Process is not running in User Interactive mode. + One or more parameters not a member of MsgBoxResult or MsgBoxStyle enumeration. + 1 + + + + + + + + Returns a string representing the calculated range that contains a number. + Returns a string representing the calculated range that contains a number. + Required. Long. Whole number that you want to locate within one of the calculated ranges. + Required. Long. Whole number that indicates the start of the set of calculated ranges. cannot be less than 0. + Required. Long. Whole number that indicates the end of the set of calculated ranges. cannot be less than or equal to . + Required. Long. Whole number that indicates the size of each range calculated between and . cannot be less than 1. + + < 0, <= , or < 1. + 1 + + + Saves or creates an application entry in the Windows registry. The My feature gives you greater productivity and performance in registry operations than SaveSetting. For more information, see . + Required. String expression containing the name of the application or project to which the setting applies. + Required. String expression containing the name of the section in which the key setting is being saved. + Required. String expression containing the name of the key setting being saved. + Required. Expression containing the value to which is being set. + Key registry could not be created, or user is not logged in. + 1 + + + + + + Runs an executable program and returns an integer containing the program's process ID if it is still running. + Runs an executable program and returns an integer containing the program's process ID if it is still running. + Required. String. Name of the program to execute, together with any required arguments and command-line switches. can also include the drive and the directory path or folder.If you do not know the path to the program, you can use the to locate it. For example, you can call My.Computer.FileSystem.GetFiles("C:\", True, "testFile.txt"), which returns the full path of every file named testFile.txt anywhere on drive C:\. + Optional. AppWinStyle. A value chosen from the specifying the style of the window in which the program is to run. If is omitted, Shell uses AppWinStyle.MinimizedFocus, which starts the program minimized and with focus. + Optional. Boolean. A value indicating whether the Shell function should wait for completion of the program. If is omitted, Shell uses False. + Optional. Integer. The number of milliseconds to wait for completion if is True. If is omitted, Shell uses -1, which means there is no timeout and Shell does not return until the program finishes. Therefore, if you omit or set it to -1, it is possible that Shell might never return control to your program. + + is not within range 0 through 9, inclusive. + Shell cannot find the file. + + is Nothing. + 1 + + + + + + + Evaluates a list of expressions and returns an Object value corresponding to the first expression in the list that is True. + Evaluates a list of expressions and returns an Object value corresponding to the first expression in the list that is True. + Required. Object parameter array. Must have an even number of elements. You can supply a list of Object variables or expressions separated by commas, or a single-dimensional array of Object elements. + Number of arguments is odd. + 1 + + + + + + Indicates which button was pressed on a message box, returned by the MsgBox function. + 1 + + + OK button was pressed. This member is equivalent to the Visual Basic constant vbOK. + + + Cancel button was pressed. This member is equivalent to the Visual Basic constant vbCancel. + + + Abort button was pressed. This member is equivalent to the Visual Basic constant vbAbort. + + + Retry button was pressed. This member is equivalent to the Visual Basic constant vbRetry. + + + Ignore button was pressed. This member is equivalent to the Visual Basic constant vbIgnore. + + + Yes button was pressed. This member is equivalent to the Visual Basic constant vbYes. + + + No button was pressed. This member is equivalent to the Visual Basic constant vbNo. + + + + + + Indicates which buttons to display when calling the MsgBox function. + 1 + + + OK button only (default). This member is equivalent to the Visual Basic constant vbOKOnly. + + + OK and Cancel buttons. This member is equivalent to the Visual Basic constant vbOKCancel. + + + Abort, Retry, and Ignore buttons. This member is equivalent to the Visual Basic constant vbAbortRetryIgnore. + + + Yes, No, and Cancel buttons. This member is equivalent to the Visual Basic constant vbYesNoCancel. + + + Yes and No buttons. This member is equivalent to the Visual Basic constant vbYesNo. + + + Retry and Cancel buttons. This member is equivalent to the Visual Basic constant vbRetryCancel. + + + Critical message. This member is equivalent to the Visual Basic constant vbCritical. + + + Warning query. This member is equivalent to the Visual Basic constant vbQuestion. + + + Warning message. This member is equivalent to the Visual Basic constant vbExclamation. + + + Information message. This member is equivalent to the Visual Basic constant vbInformation. + + + First button is default. This member is equivalent to the Visual Basic constant vbDefaultButton1. + + + Second button is default. This member is equivalent to the Visual Basic constant vbDefaultButton2. + + + Third button is default. This member is equivalent to the Visual Basic constant vbDefaultButton3. + + + Application modal message box. This member is equivalent to the Visual Basic constant vbApplicationModal. + + + System modal message box. This member is equivalent to the Visual Basic constant vbSystemModal. + + + Help text. This member is equivalent to the Visual Basic constant vbMsgBoxHelp. + + + Right-aligned text. This member is equivalent to the Visual Basic constant vbMsgBoxRight. + + + Right-to-left reading text (Hebrew and Arabic systems). This member is equivalent to the Visual Basic constant vbMsgBoxRtlReading. + + + Foreground message box window. This member is equivalent to the Visual Basic constant vbMsgBoxSetForeground. + + + + + + + + + This attribute supports My.Forms and My.WebServices in Visual Basic. + 1 + + + This attribute supports My.Forms and My.WebServices in Visual Basic. + String. Initializes the property. The compiler generates accessor properties for classes that derive from this type. + String. Initializes the property. Specifies the method in the class that creates the type's instances. + String. Initializes the property. Specifies the method in the class that disposes of the type's instances. + String. Initializes the property. Specifies the name of the property that returns the default instance of the class. + + + This property supports My in Visual Basic. + Specifies the method in the class that creates the type's instances. + 1 + + + This property supports My in Visual Basic. + Specifies the name of the property that returns the default instance of the class. + 1 + + + This property supports My in Visual Basic. + Specifies the method in the class that disposes of the type's instances. + 1 + + + This property supports My in Visual Basic. + Specifies the name of the type for which the compiler generates accessor properties. + 1 + + + Indicates how to open a file when calling file-access functions. + 1 + + + Read and write access permitted. This is the default. + + + Read access permitted. + + + Read and write access permitted. + + + Write access permitted. + + + Indicates how to open a file when calling file-access functions. + 1 + + + File opened for read access. + + + File opened for write access. + + + File opened for random access. + + + File opened to append to it. Default. + + + File opened for binary access. + + + Indicates how to open a file when calling file-access functions. + 1 + + + LockReadWrite. This is the default. + + + Any process can read or write to the file. + + + Other processes cannot read the file. + + + Other processes cannot read or write to the file. + + + Other processes cannot write to the file. + + + This class supports the Visual Basic Print and PrintLine functions. + 2 + + + This field supports the Visual Basic Print and PrintLine functions. + 1 + + + The Strings module contains procedures used to perform string operations. + 1 + + + Returns an Integer value representing the character code corresponding to a character. + Returns an Integer value representing the character code corresponding to a character. + Required. Any valid Char or String expression. If is a String expression, only the first character of the string is used for input. If is Nothing or contains no characters, an error occurs. + 1 + + + Returns an Integer value representing the character code corresponding to a character. + Returns an Integer value representing the character code corresponding to a character. + Required. Any valid Char or String expression. If is a String expression, only the first character of the string is used for input. If is Nothing or contains no characters, an error occurs. + 1 + + + Returns an Integer value representing the character code corresponding to a character. + Returns an Integer value representing the character code corresponding to a character. + Required. Any valid Char or String expression. If is a String expression, only the first character of the string is used for input. If is Nothing or contains no characters, an error occurs. + 1 + + + Returns an Integer value representing the character code corresponding to a character. + Returns an Integer value representing the character code corresponding to a character. + Required. Any valid Char or String expression. If is a String expression, only the first character of the string is used for input. If is Nothing or contains no characters, an error occurs. + 1 + + + Returns the character associated with the specified character code. + Returns the character associated with the specified character code. + Required. An Integer expression representing the code point, or character code, for the character. + + < 0 or > 255 for Chr. + 1 + + + Returns the character associated with the specified character code. + Returns the character associated with the specified character code. + Required. An Integer expression representing the code point, or character code, for the character. + + < -32768 or > 65535 for ChrW. + 1 + + + Returns a zero-based array containing a subset of a String array based on specified filter criteria. + Returns a zero-based array containing a subset of a String array based on specified filter criteria. + Required. One-dimensional array of strings to be searched. + Required. String to search for. + Optional. Boolean value indicating whether to return substrings that include or exclude . If is True, the Filter function returns the subset of the array that contains as a substring. If is False, the Filter function returns the subset of the array that does not contain as a substring. + Optional. Numeric value indicating the kind of string comparison to use. See "Settings" for values. + + is Nothing or is not a one-dimensional array. + 1 + + + + + + Returns a zero-based array containing a subset of a String array based on specified filter criteria. + Returns a zero-based array containing a subset of a String array based on specified filter criteria. + Required. One-dimensional array of strings to be searched. + Required. String to search for. + Optional. Boolean value indicating whether to return substrings that include or exclude . If is True, the Filter function returns the subset of the array that contains as a substring. If is False, the Filter function returns the subset of the array that does not contain as a substring. + Optional. Numeric value indicating the kind of string comparison to use. See "Settings" for values. + + is Nothing or is not a one-dimensional array. + 1 + + + + + + Returns a string formatted according to instructions contained in a format String expression. + Returns a string formatted according to instructions contained in a format String expression. + Required. Any valid expression. + Optional. A valid named or user-defined format String expression. + 1 + + + + + + Returns an expression formatted as a currency value using the currency symbol defined in the system control panel. + Returns an expression formatted as a currency value using the currency symbol defined in the system control panel. + Required. Expression to be formatted. + Optional. Numeric value indicating how many places are displayed to the right of the decimal. Default value is –1, which indicates that the computer's regional settings are used. + Optional. enumeration that indicates whether or not a leading zero is displayed for fractional values. See "Remarks" for values. + Optional. enumeration that indicates whether or not to place negative values within parentheses. See "Remarks" for values. + Optional. enumeration that indicates whether or not numbers are grouped using the group delimiter specified in the computer's regional settings. See "Remarks" for values. + Number of digits after decimal point is greater than 99. + Type is not numeric. + 1 + + + + + + Returns a string expression representing a date/time value. + Returns a string expression representing a date/time value. + Required. Date expression to be formatted. + Optional. Numeric value that indicates the date/time format used. If omitted, DateFormat.GeneralDate is used. + + setting is not valid. + 1 + + + Returns an expression formatted as a number. + Returns an expression formatted as a number. + Required. Expression to be formatted. + Optional. Numeric value indicating how many places are displayed to the right of the decimal. The default value is –1, which indicates that the computer's regional settings are used. + Optional. constant that indicates whether a leading 0 is displayed for fractional values. See "Settings" for values. + Optional. constant that indicates whether to place negative values within parentheses. See "Settings" for values. + Optional. constant that indicates whether or not numbers are grouped using the group delimiter specified in the locale settings. See "Settings" for values. + Type is not numeric. + 1 + + + + + + Returns an expression formatted as a percentage (that is, multiplied by 100) with a trailing % character. + Returns an expression formatted as a percentage (that is, multiplied by 100) with a trailing % character. + Required. Expression to be formatted. + Optional. Numeric value indicating how many places to the right of the decimal are displayed. Default value is –1, which indicates that the locale settings are used. + Optional. constant that indicates whether or not a leading zero displays for fractional values. See "Settings" for values. + Optional. constant that indicates whether or not to place negative values within parentheses. See "Settings" for values. + Optional. constant that indicates whether or not numbers are grouped using the group delimiter specified in the locale settings. See "Settings" for values. + Type is not numeric. + 1 + + + + + + Returns a Char value representing the character from the specified index in the supplied string. + Char value representing the character from the specified index in the supplied string. + Required. Any valid String expression. + Required. Integer expression. The (1-based) index of the character in to be returned. + + is Nothing, < 1, or is greater than index of last character of . + 1 + + + Returns an integer specifying the start position of the first occurrence of one string within another. + IfInStr returns is zero length or Nothing0 is zero length or Nothing is not found0 is found within Position where match begins > 0 + Optional. Numeric expression that sets the starting position for each search. If omitted, search begins at the first character position. The start index is 1-based. + Required. String expression being searched. + Required. String expression sought. + Optional. Specifies the type of string comparison. If is omitted, the Option Compare setting determines the type of comparison. + + < 1. + 1 + + + Returns an integer specifying the start position of the first occurrence of one string within another. + IfInStr returns is zero length or Nothing0 is zero length or Nothing is not found0 is found within Position where match begins > 0 + Required. String expression being searched. + Required. String expression sought. + Optional. Specifies the type of string comparison. If is omitted, the Option Compare setting determines the type of comparison. + + < 1. + 1 + + + Returns the position of the first occurrence of one string within another, starting from the right side of the string. + IfInStrRev returns is zero-length0 is zero-length is not found0 is found within Position at which the first match is found, starting with the right side of the string. is greater than length of 0 + Required. String expression being searched. + Required. String expression being searched for. + Optional. Numeric expression setting the one-based starting position for each search, starting from the left side of the string. If is omitted then –1 is used, meaning the search begins at the last character position. Search then proceeds from right to left. + Optional. Numeric value indicating the kind of comparison to use when evaluating substrings. If omitted, a binary comparison is performed. See Settings for values. + + = 0 or < -1. + 1 + + + Returns a string created by joining a number of substrings contained in an array. + Returns a string created by joining a number of substrings contained in an array. + Required. One-dimensional array containing substrings to be joined. + Optional. Any string, used to separate the substrings in the returned string. If omitted, the space character (" ") is used. If is a zero-length string ("") or Nothing, all items in the list are concatenated with no delimiters. + + is not one dimensional. + 1 + + + + + + Returns a string created by joining a number of substrings contained in an array. + Returns a string created by joining a number of substrings contained in an array. + Required. One-dimensional array containing substrings to be joined. + Optional. Any string, used to separate the substrings in the returned string. If omitted, the space character (" ") is used. If is a zero-length string ("") or Nothing, all items in the list are concatenated with no delimiters. + + is not one dimensional. + 1 + + + + + + Returns a string or character converted to lowercase. + Returns a string or character converted to lowercase. + Required. Any valid String or Char expression. + 1 + + + Returns a string or character converted to lowercase. + Returns a string or character converted to lowercase. + Required. Any valid String or Char expression. + 1 + + + Returns a string containing a specified number of characters from the left side of a string. + Returns a string containing a specified number of characters from the left side of a string. + Required. String expression from which the leftmost characters are returned. + Required. Integer expression. Numeric expression indicating how many characters to return. If 0, a zero-length string ("") is returned. If greater than or equal to the number of characters in , the entire string is returned. + + < 0. + 1 + + + Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable. + Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable. + Any valid String expression or variable name. If is of type Object, the Len function returns the size as it will be written to the file by the FilePut function. + 1 + + + Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable. + Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable. + Any valid String expression or variable name. If is of type Object, the Len function returns the size as it will be written to the file by the FilePut function. + 1 + + + Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable. + Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable. + Any valid String expression or variable name. If is of type Object, the Len function returns the size as it will be written to the file by the FilePut function. + 1 + + + Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable. + Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable. + Any valid String expression or variable name. If is of type Object, the Len function returns the size as it will be written to the file by the FilePut function. + 1 + + + Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable. + Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable. + Any valid String expression or variable name. If is of type Object, the Len function returns the size as it will be written to the file by the FilePut function. + 1 + + + Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable. + Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable. + Any valid String expression or variable name. If is of type Object, the Len function returns the size as it will be written to the file by the FilePut function. + 1 + + + Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable. + Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable. + Any valid String expression or variable name. If is of type Object, the Len function returns the size as it will be written to the file by the FilePut function. + 1 + + + Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable. + Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable. + Any valid String expression or variable name. If is of type Object, the Len function returns the size as it will be written to the file by the FilePut function. + 1 + + + Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable. + Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable. + Any valid String expression or variable name. If is of type Object, the Len function returns the size as it will be written to the file by the FilePut function. + 1 + + + Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable. + Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable. + Any valid String expression or variable name. If is of type Object, the Len function returns the size as it will be written to the file by the FilePut function. + 1 + + + Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable. + Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable. + Any valid String expression or variable name. If is of type Object, the Len function returns the size as it will be written to the file by the FilePut function. + 1 + + + Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable. + Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable. + Any valid String expression or variable name. If is of type Object, the Len function returns the size as it will be written to the file by the FilePut function. + 1 + + + Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable. + Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable. + Any valid String expression or variable name. If is of type Object, the Len function returns the size as it will be written to the file by the FilePut function. + 1 + + + Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable. + Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable. + Any valid String expression or variable name. If is of type Object, the Len function returns the size as it will be written to the file by the FilePut function. + 1 + + + Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable. + Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable. + Any valid String expression or variable name. If is of type Object, the Len function returns the size as it will be written to the file by the FilePut function. + 1 + + + Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable. + Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable. + Any valid String expression or variable name. If is of type Object, the Len function returns the size as it will be written to the file by the FilePut function. + 1 + + + Returns a left-aligned string containing the specified string adjusted to the specified length. + Returns a left-aligned string containing the specified string adjusted to the specified length. + Required. String expression. Name of string variable. + Required. Integer expression. Length of returned string. + 1 + + + Returns a string containing a copy of a specified string with no leading spaces (LTrim), no trailing spaces (RTrim), or no leading or trailing spaces (Trim). + Returns a string containing a copy of a specified string with no leading spaces (LTrim), no trailing spaces (RTrim), or no leading or trailing spaces (Trim). + Required. Any valid String expression. + 1 + + + Returns a string containing a specified number of characters from a string. + Returns a string containing a specified number of characters from a string. + Required. String expression from which characters are returned. + Required. Integer expression. Starting position of the characters to return. If is greater than the number of characters in , the Mid function returns a zero-length string (""). is one based. + + <= 0 or < 0. + 1 + + + Returns a string containing a specified number of characters from a string. + Returns a string containing a specified number of characters from a string. + Required. String expression from which characters are returned. + Required. Integer expression. Starting position of the characters to return. If is greater than the number of characters in , the Mid function returns a zero-length string (""). is one based. + Optional. Integer expression. Number of characters to return. If omitted or if there are fewer than characters in the text (including the character at position ), all characters from the start position to the end of the string are returned. + + <= 0 or < 0. + 1 + + + Returns a string in which a specified substring has been replaced with another substring a specified number of times. + Replace returns the following values.IfReplace returns is zero-length or NothingCopy of is zero-lengthCopy of with no occurrences of is zero-length or Nothing, or is greater than length of Nothing is 0Copy of + Required. String expression containing substring to replace. + Required. Substring being searched for. + Required. Replacement substring. + Optional. Position within where substring search is to begin. If omitted, 1 is assumed. + Optional. Number of substring substitutions to perform. If omitted, the default value is –1, which means "make all possible substitutions." + Optional. Numeric value indicating the kind of comparison to use when evaluating substrings. See Settings for values. + + < -1 or <= 0. + 1 + + + Returns a string containing a specified number of characters from the right side of a string. + Returns a string containing a specified number of characters from the right side of a string. + Required. String expression from which the rightmost characters are returned. + Required. Integer. Numeric expression indicating how many characters to return. If 0, a zero-length string ("") is returned. If greater than or equal to the number of characters in , the entire string is returned. + + < 0. + 1 + + + Returns a right-aligned string containing the specified string adjusted to the specified length. + Returns a right-aligned string containing the specified string adjusted to the specified length. + Required. String expression. Name of string variable. + Required. Integer expression. Length of returned string. + 1 + + + Returns a string containing a copy of a specified string with no leading spaces (LTrim), no trailing spaces (RTrim), or no leading or trailing spaces (Trim). + Returns a string containing a copy of a specified string with no leading spaces (LTrim), no trailing spaces (RTrim), or no leading or trailing spaces (Trim). + Required. Any valid String expression. + 1 + + + Returns a string consisting of the specified number of spaces. + Returns a string consisting of the specified number of spaces. + Required. Integer expression. The number of spaces you want in the string. + + < 0. + 1 + + + Returns a zero-based, one-dimensional array containing a specified number of substrings. + String array. If is a zero-length string (""), Split returns a single-element array containing a zero-length string. If is a zero-length string, or if it does not appear anywhere in , Split returns a single-element array containing the entire string. + Required. String expression containing substrings and delimiters. + Optional. Any single character used to identify substring limits. If is omitted, the space character (" ") is assumed to be the delimiter. + Optional. Maximum number of substrings into which the input string should be split. The default, –1, indicates that the input string should be split at every occurrence of the string. + Optional. Numeric value indicating the comparison to use when evaluating substrings. See "Settings" for values. + 1 + + + Returns -1, 0, or 1, based on the result of a string comparison. + The StrComp function has the following return values.IfStrComp returns sorts ahead of -1 is equal to 0 sorts after 1 + Required. Any valid String expression. + Required. Any valid String expression. + Optional. Specifies the type of string comparison. If is omitted, the Option Compare setting determines the type of comparison. + + value is not valid. + 1 + + + Returns a string converted as specified. + Returns a string converted as specified. + Required. String expression to be converted. + Required. member. The enumeration value specifying the type of conversion to perform. + Optional. The LocaleID value, if different from the system LocaleID value. (The system LocaleID value is the default.) + Unsupported , < 0 or > 2048, or unsupported conversion for specified locale. + 1 + + + Returns a string or object consisting of the specified character repeated the specified number of times. + Returns a string or object consisting of the specified character repeated the specified number of times. + Required. Integer expression. The length to the string to be returned. + Required. Any valid Char, String, or Object expression. Only the first character of the expression will be used. If Character is of type Object, it must contain either a Char or a String value. + + is less than 0 or type is not valid. + + is Nothing. + 1 + + + + + + Returns a string or object consisting of the specified character repeated the specified number of times. + Returns a string or object consisting of the specified character repeated the specified number of times. + Required. Integer expression. The length to the string to be returned. + Required. Any valid Char, String, or Object expression. Only the first character of the expression will be used. If Character is of type Object, it must contain either a Char or a String value. + + is less than 0 or type is not valid. + + is Nothing. + 1 + + + + + + Returns a string or object consisting of the specified character repeated the specified number of times. + Returns a string or object consisting of the specified character repeated the specified number of times. + Required. Integer expression. The length to the string to be returned. + Required. Any valid Char, String, or Object expression. Only the first character of the expression will be used. If Character is of type Object, it must contain either a Char or a String value. + + is less than 0 or type is not valid. + + is Nothing. + 1 + + + + + + Returns a string in which the character order of a specified string is reversed. + Returns a string in which the character order of a specified string is reversed. + Required. String expression whose characters are to be reversed. If is a zero-length string (""), a zero-length string is returned. + 1 + + + Returns a string containing a copy of a specified string with no leading spaces (LTrim), no trailing spaces (RTrim), or no leading or trailing spaces (Trim). + Returns a string containing a copy of a specified string with no leading spaces (LTrim), no trailing spaces (RTrim), or no leading or trailing spaces (Trim). + Required. Any valid String expression. + 1 + + + Returns a string or character containing the specified string converted to uppercase. + Returns a string or character containing the specified string converted to uppercase. + Required. Any valid String or Char expression. + 1 + + + Returns a string or character containing the specified string converted to uppercase. + Returns a string or character containing the specified string converted to uppercase. + Required. Any valid String or Char expression. + 1 + + + This class supports the Visual Basic Print and PrintLine functions. + 2 + + + This field supports the Visual Basic Print and PrintLine functions. + 1 + + + Indicates a Boolean value or whether the default should be used when calling number-formatting functions. + 1 + + + False. The numeric value of this member is 0. + + + True. The numeric value of this member is -1. + + + Default setting. The numeric value of this member is -2. + + + Indicates the type of a variant object, returned by the VarType function. + 1 + + + Null reference. This member is equivalent to the Visual Basic constant vbEmpty. + + + Null object. This member is equivalent to the Visual Basic constant vbNull. + + + Short. (-32,768 through 32,767.) + + + Integer. (-2,147,483,648 through 2,147,483,647.) This member is equivalent to the Visual Basic constant vbInteger. + + + Single. (-3.402823E+38 through -1.401298E-45 for negative values; 1.401298E-45 through 3.402823E+38 for positive values.) This member is equivalent to the Visual Basic constant vbSingle. + + + Double. (-1.79769313486231E+308 through -4.94065645841247E-324 for negative values; 4.94065645841247E-324 through 1.79769313486231E+308 for positive values.) This member is equivalent to the Visual Basic constant vbDouble. + + + Currency. This member is equivalent to the Visual Basic constant vbCurrency. + + + Date. (0:00:00 on January 1, 0001 through 11:59:59 PM on December 31, 9999.) This member is equivalent to the Visual Basic constant vbDate. + + + String. (0 to approximately 2 billion Unicode characters.) This member is equivalent to the Visual Basic constant vbString. + + + Any type can be stored in a variable of type Object. This member is equivalent to the Visual Basic constant vbObject. + + + + + + + + Boolean. (True or False.) This member is equivalent to the Visual Basic constant vbBoolean. + + + Variant. This member is equivalent to the Visual Basic constant vbVariant. + + + DataObject. + + + Decimal. (0 through +/-79,228,162,514,264,337,593,543,950,335 with no decimal point; 0 through +/-7.9228162514264337593543950335 with 28 places to the right of the decimal; smallest non-zero number is +/-0.0000000000000000000000000001.) This member is equivalent to the Visual Basic constant vbDecimal. + + + Byte. (0 through 255.) This member is equivalent to the Visual Basic constant vbByte. + + + Char. (0 through 65535.) This member is equivalent to the Visual Basic constant vbChar. + + + Long. (-9,223,372,036,854,775,808 through 9,223,372,036,854,775,807.) This member is equivalent to the Visual Basic constant vbLong. + + + User-defined type. Each member of the structure has a range determined by its data type and independent of the ranges of the other members. This member is equivalent to the Visual Basic constant vbUserDefinedType. + + + Array. This member is equivalent to the Visual Basic constant vbArray. + + + Indicates that an array in a structure or non-local variable should be treated as a fixed-length array. + 1 + + + Initializes the value of the Bounds property. + Initializes the value of upper field, which represents the size of the first dimension of the array. + + + Initializes the value of the Bounds property. + Initializes the value of upper field, which represents the size of the first dimension of the array. + Initializes the value of upper field, which represents the size of the second dimension of the array. + + + Returns the bounds of the array. + Contains an integer array that represents the bounds of the array. + 1 + + + Returns the size of the array. + Contains an integer that represents the number of elements in the array. + 1 + + + Indicates that a string should be treated as if it were fixed length. + 1 + + + Initializes the value of the SizeConst field. + The length of the fixed string. + + + Gets the length of the string. + Returns the length of the string. + 1 + + + The VbMath module contains procedures used to perform mathematical operations. + 1 + + + Initializes the random-number generator. + 1 + + + Initializes the random-number generator. + Optional. An Object or any valid numeric expression. + 1 + + + Returns a random number of type Single. + The next random number in the sequence. + 1 + + + Returns a random number of type Single. + If number is less than zero, Rnd generates the same number every time, using as the seed. If number is greater than zero, Rnd generates the next random number in the sequence. If number is equal to zero, Rnd generates the most recently generated number. If number is not supplied, Rnd generates the next random number in the sequence. + Optional. A Single value or any valid Single expression. + 1 + + + Indicates which type of conversion to perform when calling the StrConv function. + 1 + + + Performs no conversion. + + + Converts the string to uppercase characters. This member is equivalent to the Visual Basic constant vbUpperCase. + + + Converts the string to lowercase characters. This member is equivalent to the Visual Basic constant vbLowerCase. + + + Converts the first letter of every word in the string to uppercase. This member is equivalent to the Visual Basic constant vbProperCase. + + + Converts narrow (single-byte) characters in the string to wide (double-byte) characters. Applies to Asian locales. This member is equivalent to the Visual Basic constant vbWide. + + + Converts wide (double-byte) characters in the string to narrow (single-byte) characters. Applies to Asian locales. This member is equivalent to the Visual Basic constant vbNarrow. + + + Converts Hiragana characters in the string to Katakana characters. Applies to Japanese locale only. This member is equivalent to the Visual Basic constant vbKatakana. + + + Converts Katakana characters in the string to Hiragana characters. Applies to Japanese locale only. This member is equivalent to the Visual Basic constant vbHiragana. + + + Converts the string to Simplified Chinese characters. This member is equivalent to the Visual Basic constant vbSimplifiedChinese. + + + Converts the string to Traditional Chinese characters. This member is equivalent to the Visual Basic constant vbTraditionalChinese. + + + Converts the string from file system rules for casing to linguistic rules. This member is equivalent to the Visual Basic constant vbLinguisticCasing. + + + + + + + + + Provides properties, methods, and events related to the current application. + 1 + + + Initializes a new instance of the class. + + + Changes the culture used by the current thread for string manipulation and for string formatting. + String. Name of the culture as a string. For a list of possible names, see . + + is Nothing. + + is not a valid culture name. + + + Changes the culture that the current thread uses for retrieving culture-specific resources. + String. Name of the culture as a string. For a list of possible names, see . + + is Nothing. + + is not a valid culture name. + + + Gets the culture that the current thread uses for string manipulation and string formatting. + A object that represents the culture the current thread uses for string manipulation and string formatting. + + + Returns the value of the specified environment variable. + A String containing the value of the environment variable with the name . + A String containing the name of the environment variable. + + is Nothing. + The environment variable specified by does not exist. + The calling code does not have with Read access. + 1 + + + + + + Gets an object that provides properties for getting information about the application's assembly, such as the version number, description, and so on. + The object for the current application. + + + Gets an object that provides properties and methods for writing event and exception information to the application's log listeners. + The object for the current application. + 1 + + + + + + + Gets the culture that the current thread uses for retrieving culture-specific resources. + A object that represents the culture that the current thread uses for retrieving culture-specific resources. + + + Provides properties for getting the information about the application, such as the version number, description, loaded assemblies, and so on. + 1 + + + Initializes a new instance of the class with the specified assembly information. + + . The assembly for which to obtain the information. + + + Gets the name, without the extension, of the assembly file for the application. + A String containing the file name. + + + Gets the company name associated with the application. + A String that contains the company name associated with the application. + The assembly does not have an attribute. + 1 + + + Gets the copyright notice associated with the application. + A String containing the copyright notice associated with the application. + The assembly does not have an attribute. + + + Gets the description associated with the application. + A String containing the description associated with the application. + The assembly does not have an attribute. + 1 + + + Gets the directory where the application is stored. + A String that contains the directory where the application is stored. + 1 + + + + + + Gets a collection of all assemblies loaded by the application. + A of containing all the assemblies loaded by the application. + The application domain is not loaded. + + + Gets the product name associated with the application. + A String containing the product name associated with the application. + The assembly does not have an attribute. + 1 + + + Gets the current stack-trace information. + A String containing the current stack-trace information. The return value can be . + The requested stack-trace information is out of range. + + + Gets the title associated with the application. + A String containing the associated with the application. + The assembly does not have an attribute. + 1 + + + Gets the trademark notice associated with the application. + A String containing the trademark notice associated with the application. + The assembly does not have an attribute. + + + Gets the version number of the application. + A object containing the version number of the application. + The application does not have sufficient permissions to access the assembly version. + 1 + + + + + + Gets the amount of physical memory mapped to the process context. + A Long containing the number of bytes of physical memory mapped to the process context. + A situation in which partial trust exists and the user lacks necessary permissions. + + + Indicates how a Visual Basic application authenticates the user for the My.User object. + 2 + + + The constructor initializes the principal for the application's main thread with the current user's Windows user information. + + + The constructor does not initialize the principal for the application's main thread. The application needs to initialize the principal for the application's main thread. + + + Indicates the type of role to check when calling the method. + 1 + + + Account operators manage the user accounts on a computer or domain. + + + Administrators have complete and unrestricted access to the computer or domain. + + + Backup operators can override security restrictions for the sole purpose of backing up or restoring files. + + + Guests are more restricted than users. + + + Power users possess most administrative permissions with some restrictions. Thus, power users can run legacy applications, in addition to certified applications. + + + Print operators can take control of a printer. + + + Replicators support file replication in a domain. + + + System operators manage a particular computer. + + + Users are prevented from making accidental or intentional system-wide changes. Thus, users can run certified applications, but not most legacy applications. + + + Provides a type converter to convert enumeration values to enumeration values. + 2 + + + Initializes a new instance of the class. + + + Gets a value indicating whether this converter can convert an object to the given destination type using the context. + A object that indicates whether this converter can perform the conversion. + An object that provides a format context. + A object that represents the type you wish to convert to. + 1 + + + Converts the given object to another type. + The converted object. + A formatter context. + The culture into which will be converted. + The object to convert. + The type to convert the object to. + + is Nothing. + The conversion cannot be performed. + 1 + + + This exception is thrown when a subsequent instance of a single-instance application is unable to connect to the first application instance. + + + Initializes a new instance of the class. + + + Initializes a new instance of the class with serialized data. + The object that holds the serialized object data about the exception being thrown. + The object that contains contextual information about the source or destination. + + + Initializes a new instance of the class with a specified error message. + A message that describes the error. + + + Initializes a new instance of the class with a specified error message and a reference to the inner exception that is the cause of this exception. + A object describing the error. + The object that is the cause of the current exception. If the parameter is not a null reference (Nothing in Visual Basic), the current exception is raised in a Catch block that handles the inner exception. + + + Provides properties, methods, and events related to the current application. + + + Initializes a new instance of the class. + + + Gets a collection containing the command-line arguments as strings for the current application. + A of String, containing the command-line arguments as strings for the current application. + + + Gets the current application's ClickOnce deployment object, which provides support for updating the current deployment programmatically and support for the on-demand download of files. + Returns the object for the application's ClickOnce deployment. + The application is not deployed as a ClickOnce application. + + + Sets the values to use as the current application's command-line arguments. + A of String, containing the strings to use as the command-line arguments for the current application. + + + Gets a Boolean that represents whether the application was deployed from a network using ClickOnce. + A Boolean that represents whether the application was deployed from a network. The value is True if the current application was deployed from a network; otherwise the value is False. + + + This exception is thrown by the Visual Basic Application Model when the property has not been set. + + + Initializes a new instance of the class. + + + Initializes a new instance of the class with serialized data. + The object that holds the serialized object data about the exception being thrown. + The object that contains contextual information about the source or destination. + + + Initializes a new instance of the class with a specified error message. + A message that describes the error. + + + Initializes a new instance of the class with a specified error message and a reference to the inner exception that is the cause of this exception. + A object describing the error. + The object that is the cause of the current exception. If the parameter is not a null reference (Nothing in Visual Basic), the current exception is raised in a catch block that handles the inner exception. + + + Represents the method that will handle the My.Application.Shutdown event. + The source of the event. + A object that contains the event data. + 2 + + + Indicates which condition should cause a Windows Forms application to shut down. + 2 + + + Shut down when the main form closes. + + + Shut down only after the last form closes. + + + Provides data for the My.Application.Startup event. + 2 + + + Initializes a new instance of the class. + A object that contains the command-line arguments of the application. + + + Gets the command-line arguments of the application. + A object that contains the command-line arguments of the application. + 1 + + + Represents the method that will handle the My.Application.Startup event. + The source of the event. + A object that contains the event data. + 2 + + + Provides data for the My.Application.StartupNextInstance event. + + + Initializes a new instance of the class. + A object that contains the command-line arguments of the subsequent application instance. + A that indicates whether the first application instance should be brought to the foreground upon exiting the exception handler. + + + Indicates whether the first application instance should be brought to the foreground upon exiting the exception handler. + A that indicates whether the first application instance should be brought to the foreground upon exiting the exception handler. + + + Gets the command-line arguments of the subsequent application instance. + A object that contains the command-line arguments of the subsequent application instance. + + + Represents the method that will handle the My.Application.StartupNextInstance event. + The source of the event. + A object that contains the event data. + + + Provides data for the My.Application.UnhandledException event. + 2 + + + Initializes a new instance of the class. + A that indicates whether the application should exit upon exiting the exception handler. + The that occurred. + + + Indicates whether the application should exit upon exiting the exception handler. + A that indicates whether the application should exit upon exiting the exception handler. + 1 + + + Represents the method that will handle the My.Application.UnhandledException event. + The source of the event. + A object that contains the event data. + 2 + + + Provides access to the information about the current user. + 1 + + + Initializes a new instance of the class. + + + Gets or sets the current principal (for role-based security). + A value representing the security context. + The caller does not have the permission required to set the principal. + 1 + + + + + + + Sets the thread's current principal to the Windows user that started the application. + + + Gets or sets the principal object representing the current user. + An object representing the current user. + + + Gets a value that indicates whether the user has been authenticated. + True if the user was authenticated; otherwise, False. + 1 + + + + + + + Determines whether the current user belongs to the specified role. + True if the current user is a member of the specified role; otherwise, False. + The built-in Windows role for which to check membership. + 1 + + + + + + + Determines whether the current user belongs to the specified role. + True if the current user is a member of the specified role; otherwise, False. + The name of the role for which to check membership. + 1 + + + + + + + Gets the name of the current user. + String. The name of the current user. + 1 + + + + + + + Provides access to the information about the current user. + 1 + + + Initializes a new instance of the class. + + + Gets or sets the principal object representing the current user. + An object representing the current user. + + + Provides properties, methods, and events related to the current application. + 1 + + + Initializes a new instance of the class. + + + Initializes a new instance of the class with the specified authentication mode. + + . Specifies the application's authentication mode. + + + Gets the object for the current thread of a Windows Forms application. + This property returns the object for the current thread. That object contains contextual information about the thread. + 1 + + + Processes all Windows messages currently in the message queue. + 2 + + + + + + + + Determines whether this application will use the Windows XP styles for windows, controls, and so on. + A value that indicates whether this application will use the XP Windows styles for windows, controls, and so on. + + + Hides the application's splash screen. + + + Determines whether this application is a single-instance application. + A value that indicates whether this application is a single-instance application. + + + Gets or sets the main form for this application. + Gets or sets the main form for this application. + + + Determines the minimum length of time, in milliseconds, for which the splash screen is displayed. + Integer. The minimum length of time, in milliseconds, for which the splash screen is displayed. + + + Occurs when the network availability changes. + 1 + + + When overridden in a derived class, allows a designer to emit code that configures the splash screen and main form. + + + When overridden in a derived class, allows a designer to emit code that initializes the splash screen. + + + Sets the visual styles, text display styles, and current principal for the main application thread (if the application uses Windows authentication), and initializes the splash screen, if defined. + A indicating if application startup should continue. + A of String, containing the command-line arguments as strings for the current application. + + + Provides the starting point for when the main application is ready to start running, after the initialization is done. + + + When overridden in a derived class, allows for code to run when the application shuts down. + + + When overridden in a derived class, allows for code to run when the application starts. + A that indicates if the application should continue starting up. + + . Contains the command-line arguments of the application and indicates whether the application startup should be canceled. + + + When overridden in a derived class, allows for code to run when a subsequent instance of a single-instance application starts. + + . Contains the command-line arguments of the subsequent application instance and indicates whether the first application instance should be brought to the foreground upon exiting the exception handler. + + + When overridden in a derived class, allows for code to run when an unhandled exception occurs in the application. + A that indicates whether the event was raised. + + . + + + Gets a collection of all the application's open forms. + A object that contains all of the application's open forms. + 1 + + + + + + Sets up and starts the Visual Basic Application model. + Array of type String. The command line from Sub Main. + 2 + + + + + + + + + + + + Determines whether the application saves the user settings on exit. + Boolean. True indicates that the application saves the user settings on exit. Otherwise, the settings are not implicitly saved. + + + Determines if the application has a splash screen defined, and if it does, displays it. + + + Occurs when the application shuts down. + 1 + + + Determines what happens when the application's main form closes. + A enumeration value, indicating what the application should do when the main form closes. + + + Gets or sets the splash screen for this application. + A object that the application uses as the splash screen. + The same value is assigned to this property and the property. + 1 + + + Occurs when the application starts. + 1 + + + Occurs when attempting to start a single-instance application and the application is already active. + 1 + + + Occurs when the application encounters an unhandled exception. + 1 + + + When overridden in a derived class, this property allows a designer to specify the default text rendering engine for the application's forms. + Boolean. A value of False indicates that the application should use the default text rendering engine for Visual Basic 2005. A value of True indicates that the application should use the text rendering engine for Visual Basic .NET 2002 and Visual Basic .NET 2003. + + + This class has been deprecated as of Visual Basic 2005. + 1 + + + Returns a Boolean value that corresponds to the specified object. + The Boolean value that corresponds to . + Required. Object to convert to a Boolean value. + + + + + + Returns a Boolean value that corresponds to the specified string. + The Boolean value that corresponds to . + Required. String to convert to a Boolean value. + + + This class has been deprecated as of Visual Basic 2005. + 1 + + + Returns a Byte value that corresponds to the specified object. + The Byte value that corresponds to . + Required. Object to convert to a Byte value. + + + + + + Returns a Byte value that corresponds to the specified string. + The Byte value that corresponds to . + Required. String to convert to a Byte value. + + + This class has been deprecated as of Visual Basic 2005. + 1 + + + Returns a CharArray value that corresponds to the specified object. + The CharArray value that corresponds to . + Required. Object to convert to a CharArray value. + + + + + + Returns a CharArray value that corresponds to the specified string. + The CharArray value that corresponds to . + Required. String to convert to a CharArray value. + + + This class has been deprecated as of Visual Basic 2005. + 1 + + + Returns a Char value that corresponds to the specified object. + The Char value that corresponds to . + Required. Object to convert to a Char value. + + + + + + Returns a Char value that corresponds to the specified string. + The Char value that corresponds to . + Required. String to convert to a Char value. + + + Provides methods that perform various type conversions. + 1 + + + Converts an object to the specified type. + An object of the specified target type. + The object to convert. + The type to which to convert the object. + + + Executes a late-bound call to a user-defined conversion expression. This helper method is not meant to be called directly from your code. + The result returned from the user-defined conversion expression. + The user-defined conversion expression. + The type to convert to. + + + Converts a value to a string, given a byte count. + The string representation of the specified value. + The Char value to convert. + The byte count of the Char value. + + + Converts a array to a string. + The string representation of the specified array. + The Char array to convert. + + + Converts a subset of a array to a string. + The string representation of the specified array from the start position to the specified length. + The Char array to convert. + Zero-based index of the start position. + Length of the subset in bytes. + + + Converts an object to a value. + A Boolean value. Returns False if the object is null; otherwise, True. + The object to convert. + + + + + + Converts a string to a value. + A Boolean value. Returns False if the string is null; otherwise, True. + The string to convert. + + + + + + Converts an object to a value. + The Byte value of the object. + The object to convert. + + + + + + Converts a string to a value. + The Byte value of the string. + The string to convert. + + + + + + Converts an object to a value. + The Char value of the object. + The object to convert. + + + + + + Converts a string to a value. + The Char value of the string. + The string to convert. + + + + + + Converts an object to a one-dimensional array. + A one-dimensional Char array. + The object to convert. + + + + + + Converts a string to a one-dimensional array. + A one-dimensional Char array. + The string to convert. + + + + + + Converts an object to a value. + The DateTime value of the object. + The object to convert. + + + + + + Converts a string to a value. + The DateTime value of the string. + The string to convert. + + + + + + Converts a value to a value. + The Decimal value of the Boolean value. + A Boolean value to convert. + + + + + + Converts an object to a value. + The Decimal value of the object. + The object to convert. + + + + + + Converts a string to a value. + The Decimal value of the string. + The string to convert. + + + + + + Converts an object to a value. + The Double value of the object. + The object to convert. + + + + + + Converts a string to a value. + The Double value of the string. + The string to convert. + + + + + + Converts an object to a generic type . + A structure or object of generic type . + The object to convert. + The type to convert to. + + + Converts an object to an integer value. + The int value of the object. + The object to convert. + + + + + + Converts a string to an integer value. + The int value of the string. + The string to convert. + + + + + + Converts an object to a Long value. + The Long value of the object. + The object to convert. + + + + + + Converts a string to a Long value. + The Long value of the string. + The string to convert. + + + + + + Converts an object to an value. + The SByte value of the object. + The object to convert. + + + + + + Converts a string to an value. + The SByte value of the string. + The string to convert. + + + + + + Converts an object to a Short value. + The Short value of the object. + The object to convert. + + + + + + Converts a string to a Short value. + The Short value of the string. + The string to convert. + + + + + + Converts an object to a value. + The Single value of the object. + The object to convert. + + + + + + Converts a to a value. + The Single value of the string. + The string to convert. + + + + + + Converts a value to a . + The String representation of the Boolean value. + The Boolean value to convert. + + + + + + Converts a value to a . + The String representation of the Byte value. + The Byte value to convert. + + + + + + Converts a value to a . + The String representation of the Char value. + The Char value to convert. + + + + + + Converts a value to a value. + The String representation of the DateTime value. + The DateTime value to convert. + + + + + + Converts a value to a value. + The String representation of the Decimal value. + The Decimal value to convert. + + + + + + Converts a value to a value, using the specified number format. + The String representation of the Decimal value. + The decimal value to convert. + The number format to use, according to . + + + + + + Converts a value to a value. + The String representation of the Double value. + The Double value to convert. + + + + + + Converts a value to a value, using the specified number format. + The String representation of the Double value. + The Double value to convert. + The number format to use, according to . + + + + + + Converts a Short value to a value. + The String representation of the Short value. + The Short value to convert. + + + + + + Converts an integer value to a value. + The String representation of the int value. + The int value to convert. + + + + + + Converts a Long value to a value. + The String representation of the Long value. + The Long value to convert. + + + + + + Converts an object to a value. + The String representation of the object. + The object to convert. + + + + + + Converts a value (a single-precision floating point number) to a value. + The String representation of the Single value. + The Single value to convert. + + + + + + Converts a value to a value, using the specified number format. + The String representation of the Single value. + The Single value to convert. + The number format to use, according to . + + + + + + Converts a uint value to a value. + The String representation of the Uint value. + The Uint value to convert. + + + + + + Converts a Ulong value to a value. + The String representation of the Ulong value. + The Ulong value to convert. + + + + + + Converts an object to a Uint value. + The Uint value of the object. + The object to convert. + + + + + + Converts a string to a Uint value. + The Uint value of the string. + The string to convert. + + + + + + Converts an object to a Ulong value. + The Ulong value of the object. + The object to convert. + + + + + + Converts a string to a Ulong value. + The Ulong value of the string. + The string to convert. + + + + + + Converts an object to a Ushort value. + The Ushort value of the object. + The object to convert. + + + + + + Converts a string to a Ushort value. + The Ushort value of the string. + The string to convert. + + + + + + This class has been deprecated as of Visual Basic 2005. + 1 + + + Returns a Date value that corresponds to the specified object. + The Date value that corresponds to . + Required. Object to convert to a Date value. + + + + + + Returns a Date value that corresponds to the specified string. + The Date value that corresponds to . + Required. String to convert to a Date value. + + + Returns a Date value that corresponds to the specified string and culture information. + The Date value that corresponds to . + Required. String to convert to a Date value. + Required. A object that defines how date values are formatted and displayed, depending on the culture. + + + This class has been deprecated as of Visual Basic 2005. + 1 + + + Returns a Decimal value that corresponds to the specified Boolean value. + The Decimal value that corresponds to . + Required. Boolean value to convert to a Decimal value. + + + Returns a Decimal value that corresponds to the specified object. + The Decimal value that corresponds to . + Required. Object to convert to a Decimal value. + + + + + + Returns a Decimal value that corresponds to the specified object and number format information. + The Decimal value that corresponds to . + Required. Object to convert to a Decimal value. + A object that defines how numeric values are formatted and displayed, depending on the culture. + + + + + + Returns a Decimal value that corresponds to the specified string. + The Decimal value that corresponds to . + Required. String to convert to a Decimal value. + + + Returns a Decimal value that corresponds to the specified string and number format information. + The Decimal value that corresponds to . + Required. String to convert to a Decimal value. + A object that defines how numeric values are formatted and displayed, depending on the culture. + + + Returns a Decimal value that corresponds to the specified string and number format information. + The Decimal value that corresponds to . + Required. String to convert to a Decimal value. + A object that defines how numeric values are formatted and displayed, depending on the culture. + + + When applied to a class, the compiler implicitly calls a component-initializing method from the default synthetic constructor. + + + Initializes a new instance of the attribute. + + + This class has been deprecated as of Visual Basic 2005. + 1 + + + Returns a Double value that corresponds to the specified object. + The Double value corresponding to . + Required. Object to convert to a Double value. + + + + + + Returns a Double value that corresponds to the specified object. + The Double value corresponding to . + Required. Object to convert to a Double value. + A object that defines how numeric values are formatted and displayed, depending on the culture. + + + + + + Returns a Double value that corresponds to the specified string. + The Double value corresponding to . + Required. String to convert to a Double value. + + + Returns a Double value that corresponds to the specified string and number format information. + The Double value corresponding to . + Required. String to convert to a Double value. + A object that defines how numeric values are formatted and displayed, depending on the culture. + + + Returns a Double value that corresponds to the specified string. + The Double value corresponding to . + Required. String to convert to a Double value. + + + Returns a Double value that corresponds to the specified string and number format information. + The Double value corresponding to . + Required. String to convert to a Double value. + A object that defines how numeric values are formatted and displayed, depending on the culture. + + + Provides exception handling support for the Visual Basic runtime. This class is not intended to be used from your code. + 1 + + + Provides services to the Visual Basic compiler for compiling For...Next and For Each loops. + 1 + + + Checks for a synchronization lock on the specified type. + The data type for which to check for synchronization lock. + + + Gets the enumerator for an array being iterated over in a For Each loop. + The enumerator for . + An array being iterated over in a For Each loop. + + + Gets the enumerator for an object being iterated over in a For Each loop. + The enumerator for . + An object being iterated over in a For Each loop. + + + Sets a reference to the next object in a For Each loop. + True if refers to the next object; False if there are no more objects and is Nothing. + The range variable of the For Each loop. + The of the object being iterated over in the For Each loop. + + + Initializes a For...Next loop. + False if the loop has terminated; otherwise, True. + The loop counter variable. + The initial value of the loop counter. + The value of the To option. + The value of the Step option. + An object that contains verified values for loop values. + The counter value for the next loop iteration. + + + + + + Checks for valid values for the loop counter, Step, and To values. + True if is greater than zero and is less than or equal to , or if is less than or equal to zero and is greater than or equal to ; otherwise, False. + Required. A Decimal value that represents the initial value passed for the loop counter variable. + Required. A Decimal value that represents the value passed by using the To keyword. + Required. A Decimal value that represents the value passed by using the Step keyword. + + + Increments a For...Next loop. + False if the loop has terminated; otherwise, True. + The loop counter variable. + An object that contains verified values for loop values. + The counter value for the next loop iteration. + + + + + + Checks for valid values for the loop counter, Step, and To values. + True if is greater than zero and is less than or equal to , or if is less than or equal to zero and is greater than or equal to ; otherwise, False. + Required. A Single value that represents the initial value passed for the loop counter variable. + Required. A Single value that represents the value passed by using the To keyword. + Required. A Single value that represents the value passed by using the Step keyword. + + + Checks for valid values for the loop counter, Step, and To values. + True if is greater than zero and is less than or equal to , or if is less than or equal to zero and is greater than or equal to ; otherwise, False. + Required. A Double value that represents the initial value passed for the loop counter variable. + Required. A Double value that represents the value passed by using the To keyword. + Required. A Double value that represents the value passed by using the Step keyword. + + + Returns a reference to and information about the current Visual Basic host window. + 1 + + + Initializes a new instance of the class. + + + Gets the current Visual Basic host object. + A object that returns a reference to and information about the current Visual Basic host window. + + + The Visual Basic compiler uses this class during static local initialization; it is not meant to be called directly from your code. An exception of this type is thrown if a static local variable fails to initialize. + 1 + + + Initializes a new instance of the class. + + + Initializes a new instance of the class. + A string representing the message to be sent. + + + Initializes a new instance of the class. + A string representing the message to be sent. + An object. + + + This class has been deprecated as of Visual Basic 2005. + 1 + + + Returns an Integer value that corresponds to the specified object. + The Integer value that corresponds to . + Required. Object to convert to an Integer value. + + + + + + Returns an Integer value that corresponds to the specified string. + The Integer value that corresponds to . + Required. String to convert to an Integer value. + + + The exception thrown for internal Visual Basic compiler errors. + + + Initializes a new instance of the class. + + + Initializes a new instance of the class, specifying an error message. + The message that describes the error. + + + Initializes a new instance of the class, specifying an error message and an inner exception. + The message that describes the error. + The exception that is the cause of the current internal exception. + + + Provides properties and methods that support Visual Basic XML literals. This class is not intended to be used directly from your code. + + + Gets or sets the value of an XML attribute. This property is not intended to be used from your code. + The value of the XML attribute identified by the parameter from the first element in the supplied collection of XML elements. If the collection is empty, returns Nothing. + A collection of XML elements to get an attribute value from or set an attribute value for. + The name of the XML attribute to get a value from or set a value for. + + + Gets or sets the value of an XML attribute. This property is not intended to be used from your code. + The value of the XML attribute identified by the parameter in the supplied XML element. + An XML element to get an attribute value from or set an attribute value for. + The name of the XML attribute to get a value from or set a value for. + + + Creates an XML attribute that has the supplied name and value. This method is not intended to be used from your code. + An object that has the supplied name and value. + The name of the XML attribute to create. + The value to assign to the created XML attribute. If is Nothing, this method returns Nothing. + + + Creates an XML attribute that has the supplied name and namespace value. This method is not intended to be used from your code. + An object that has the supplied name and namespace value. + The name of the XML attribute to create. + The namespace value to assign to the created XML attribute. + + + Removes XML namespace attributes from an XML element. This method is not intended to be used from your code. + The supplied XML element with the specified XML namespace attributes removed. + The list of XML namespace prefixes for XML elements in the current scope. + The list of XML namespaces for XML elements in the current scope. + The list of namespace attributes to remove from the XML element. + The XML element to remove XML namespace attributes from. + + + Removes XML namespace attributes from an XML element. This method is not intended to be used from your code. + The supplied XML element with the specified XML namespace attributes removed. + The list of XML namespace prefixes for XML elements in the current scope. + The list of XML namespaces for XML elements in the current scope. + The list of namespace attributes to remove from the XML element. + The XML element to remove XML namespace attributes from. + + + Removes XML namespace attributes from an XML element. This method is not intended to be used from your code. + The supplied XML element with the specified XML namespace attributes removed. + The list of XML namespace prefixes for XML elements in the current scope. + The list of XML namespaces for XML elements in the current scope. + The list of namespace attributes to remove from the XML element. + The XML element to remove XML namespace attributes from. + + + Gets or sets the value of an XML element. This property is not intended to be used from your code. + The value of the first XML element in the supplied collection. If the collection is empty, returns Nothing. + A collection of XML elements to get a value from or set a value for. + + + Represents a host window for Visual Basic. + 1 + + + Gets the host Window for the current Visual Basic environment. + The host window for the current Visual Basic environment. + + + Gets the title of the host window for the current Visual Basic environment. + The title of the host window for the current Visual Basic environment. + + + This class has been deprecated since Visual Basic 2005. + 1 + + + Performs a late-bound call to an object method. + The object to call a method on. + The type of the object. + The method name of to call. + An array of parameter values to pass to the method. + An array that contains the names of the parameters to which the values in the array are passed. + An array of Boolean values, where True indicates that the associated parameter is passed ByRef. + + + + + + Returns a late-bound value from an object. + If is an array, the value from at the location specified by . If is an object, the return value of invoked by using the named parameters in and their associated values in . + The object to return the value from. + The type of the object. + The member name of to retrieve a value from. + An array of one or more index values that specify the location in if is a one-dimensional or multi-dimensional array, or argument values to pass to the object . + An array that contains the names of the parameters to which the values in the array are passed. + An array of Boolean values, where True indicates that the associated parameter is passed ByRef. + + + + + + Returns a late-bound value from an object, using the specified index or parameters. + If is an array, the value from at the location specified by . If is an object, the return value of invoked by using the named parameters in and their associated values in . + The object to return the value from. + An array of one or more index values that specify the location in if is a one-dimensional or multi-dimensional array, or argument values to pass to the object . + An array that contains the names of the parameters to which the values in the array are passed. + + + + + + Sets a late-bound value of an object, using the specified parameters. + The object to set the value for. + An array of one or more index values that specify the location in if is a one-dimensional or multi-dimensional array, or argument values to pass to the object . + An array that contains the names of the parameters to which the values in the array are passed. + + + + + + Sets a late-bound value of an object, using the specified parameters. + The object to set the value for. + An array of one or more parameter values to pass to the object . + An array that contains the names of the parameters to which the values in the array are passed. + True to suppress the exception thrown when the set member is not found. + True to identify as the result of a late-bound expression. + + + + + + Sets a late-bound value of a member of an object, using the specified parameters. + The object to set the member value for. + The type of the object. + The member name to set. + An array of one or parameter values to pass to the member of . + An array that contains the names of the parameters to which the values in the array are passed. + + + + + + Sets a late-bound value of a member of an object, using the specified parameters. + The object to set the member value for. + The type of the object. + The member name to set. + An array of one or more parameter values to pass to the member of . + An array that contains the names of the parameters to which the values in the array are passed. + True to suppress the exception thrown when the set member is not found. + True to identify as the result of a late-bound expression. + + + + + + This class provides helpers that the Visual Basic compiler uses to do the work for the Like Operator (Visual Basic). It is not meant to be called directly from your code. + + + Performs binary or text string comparison given two objects. This helper method is not meant to be called directly from your code. + A Boolean value indicating whether the strings match. Returns True if the strings match; otherwise False. + The string to compare. + The string against which is being compared. + A enumeration specifying whether or not to use text comparison. If , this method uses text comparison; if , this method uses binary comparison. + + + Performs binary or text string comparison given two strings. This helper method is not meant to be called directly from your code. + A Boolean value indicating whether the strings match. Returns True if the strings match; otherwise False. + The string to compare. + The string against which is being compared. + A enumeration specifying whether or not to use text comparison. If , this method uses text comparison; if , this method uses binary comparison. + + + This class has been deprecated as of Visual Basic 2005. + 1 + + + Returns a Long value that corresponds to the specified object. + The Long value that corresponds to . + Required. Object to convert to a Long value. + + + + + + Returns a Long value that corresponds to the specified string. + The Long value that corresponds to . + Required. String to convert to a Long value. + + + This class provides helpers that the Visual Basic compiler uses for late binding calls; it is not meant to be called directly from your code. + 1 + + + Executes a late-bound method or function call. This helper method is not meant to be called directly from your code. + An instance of the call object. + An instance of the call object exposing the property or method. + The name of the property or method on the call object. + An array containing the arguments to be passed to the property or method being called. + An array of argument names. + A Boolean value indicating whether or not the return value can be ignored. + + + Executes a late-bound property get or field access call. This helper method is not meant to be called directly from your code. + An instance of the call object. + An instance of the call object exposing the property or method. + The name of the property or method on the call object. + An array containing the arguments to be passed to the property or method being called. + An array of argument names. + + + Executes a late-bound property set or field write call. This helper method is not meant to be called directly from your code. + An instance of the call object exposing the property or method. + An array containing the arguments to be passed to the property or method being called. + An array of argument names. + + + Executes a late-bound property set or field write call. This helper method is not meant to be called directly from your code. + An instance of the call object exposing the property or method. + An array containing the arguments to be passed to the property or method being called. + An array of argument names. + A Boolean value used to determine whether the set operation will work. Set to True when you believe that an intermediate value has been set in the property or field; otherwise False. + A Boolean value that specifies when the base reference of the late reference is an RValue. Set to True when the base reference of the late reference is an RValue; this allows you to generate a run-time exception for late assignments to fields of RValues of value types. Otherwise, set to False. + + + Executes a late-bound get of the default property or field, or call to the default method or function. This helper method is not meant to be called directly from your code. + An instance of the call object. + An instance of the call object exposing the property or method. If is of type , then bind using the Dynamic Language Runtime; otherwise perform standard late-binding. + An array containing the arguments to be passed to the property or method being called. + An array of argument names. + A Boolean value used to specify whether to throw exceptions when an error is encountered. Set to True to throw exceptions. Set to False to return Nothing when an error is encountered. + + + Executes a late-bound get of the default property or field, or call to the default method or function. This helper method is not meant to be called directly from your code. + An instance of the call object. + An instance of the call object exposing the property or method. + An array containing the arguments to be passed to the property or method being called. + An array of argument names. + A Boolean value used to specify whether to throw exceptions when an error is encountered. Set to True to throw exceptions. Set to False to return Nothing when an error is encountered. + + + Executes a late-bound property set or field write call. This helper method is not meant to be called directly from your code. + An instance of the call object exposing the property or method. + The name of the property or method on the call object. + An array containing the arguments to be passed to the property or method being called. + + + Executes a late-bound property set or field write call. This helper method is not meant to be called directly from your code. + An instance of the call object exposing the property or method. + The name of the property or method on the call object. + An array containing the arguments to be passed to the property or method being called. + A Boolean value used to determine whether the set operation will work. Set to True when you believe that an intermediate value has been set in the property or field; otherwise False. + A Boolean value that specifies when the base reference of the late reference is an RValue. Set to True when the base reference of the late reference is an RValue; this allows you to generate a run-time exception for late assignments to fields of RValues of value types. Otherwise, set to False. + + + Executes a late-bound method or function call. This helper method is not meant to be called directly from your code. + An instance of the call object. + An instance of the call object exposing the property or method. + The type of the call object. + The name of the property or method on the call object. + An array containing the arguments to be passed to the property or method being called. + An array of argument names. + An array of argument types; used only for generic calls to pass argument types. + An array of Boolean values that the late binder uses to communicate back to the call site which arguments match ByRef parameters. Each True value indicates that the arguments matched and should be copied out after the call to LateCall is complete. + A Boolean value indicating whether or not the return value can be ignored. + + + + + + Executes a late-bound call to the default method or function. This helper method is not meant to be called directly from your code. + An instance of the call object. + An instance of the call object exposing the property or method. + An array containing the arguments to be passed to the property or method being called. + An array of argument names. + A Boolean value used to specify whether to throw exceptions when an error is encountered. Set to True to throw exceptions. Set to False to return Nothing when an error is encountered. + + + Indicates whether a call requires late-bound evaluation. This helper method is not meant to be called directly from your code. + A Boolean value that indicates whether the expression requires late-bound evaluation. + An instance of the call object exposing the property or method. + The type of the call object. + The name of the property or method on the call object. + An array containing the arguments to be passed to the property or method being called. + A Boolean value that specifies whether to allow function evaluation. + A Boolean value that specifies whether to allow property evaluation. + + + Executes a late-bound property get or field access call. This helper method is not meant to be called directly from your code. + An instance of the call object. + An instance of the call object exposing the property or method. + The type of the call object. + The name of the property or method on the call object. + An array containing the arguments to be passed to the property or method being called. + An array of argument names. + An array of argument types; used only for generic calls to pass argument types. + An array of Boolean values that the late binder uses to communicate back to the call site which arguments match ByRef parameters. Each True value indicates that the arguments matched and should be copied out after the call to LateCall is complete. + + + + + + Executes a late-bound get of the default property or field. This helper method is not meant to be called directly from your code. + An instance of the call object. + An instance of the call object exposing the property or method. + An array containing the arguments to be passed to the property or method being called. + An array of argument names. + A Boolean value used to specify whether to throw exceptions when an error is encountered. Set to True to throw exceptions. Set to False to return Nothing when an error is encountered. + + + Executes a late-bound property get or field access call. This helper method is not meant to be called directly from your code. + An instance of the call object. + An instance of the call object exposing the property or method. + An array containing the arguments to be passed to the property or method being called. + An array of argument names. + + + + + + Executes a late-bound property set or field write call. This helper method is not meant to be called directly from your code. + An instance of the call object exposing the property or method. + An array containing the arguments to be passed to the property or method being called. + An array of argument names. + + + + + + Executes a late-bound property set or field write call. This helper method is not meant to be called directly from your code. + An instance of the call object exposing the property or method. + An array containing the arguments to be passed to the property or method being called. + An array of argument names. + A Boolean value used to determine whether the set operation will work. Set to True when you believe that an intermediate value has been set in the property or field; otherwise False. + A Boolean value that specifies when the base reference of the late reference is an RValue. Set to True when the base reference of the late reference is an RValue; this allows you to generate a run-time exception for late assignments to fields of RValues of value types. Otherwise, set to False. + + + + + + Executes a late-bound property set or field write call. This helper method is not meant to be called directly from your code. + An instance of the call object exposing the property or method. + The type of the call object. + The name of the property or method on the call object. + An array containing the arguments to be passed to the property or method being called. + An array of argument names. + An array of argument types; used only for generic calls to pass argument types. + + + + + + Executes a late-bound property set or field write call. This helper method is not meant to be called directly from your code. + An instance of the call object exposing the property or method. + The type of the call object. + The name of the property or method on the call object. + An array containing the arguments to be passed to the property or method being called. + An array of argument names. + An array of argument types; used only for generic calls to pass argument types. + A Boolean value used to determine whether the set operation will work. Set to True when you believe that an intermediate value has been set in the property or field; otherwise False. + A Boolean value that specifies when the base reference of the late reference is an RValue. Set to True when the base reference of the late reference is an RValue; this allows you to generate a run-time exception for late assignments to fields of RValues of value types. Otherwise, set to False. + An enumeration member of type representing the type of procedure being called. The value of CallType can be Method, Get, or Set. Only Set is used. + + + + + + Executes a late-bound property set or field write call. This helper method is not meant to be called directly from your code. + An instance of the call object exposing the property or method. + The type of the call object. + The name of the property or method on the call object. + An array containing the arguments to be passed to the property or method being called. + An array of argument names. + An array of argument types; used only for generic calls to pass argument types. + A Boolean value used to determine whether the set operation will work. Set to True when you believe that an intermediate value has been set in the property or field; otherwise False. + A Boolean value that specifies when the base reference of the late reference is an RValue. Set to True when the base reference of the late reference is an RValue; this allows you to generate a run-time exception for late assignments to fields of RValues of value types. Otherwise, set to False. + + + + + + The Visual Basic compiler uses this class for object flow control; it is not meant to be called directly from your code. + 1 + + + Checks for a synchronization lock on the specified type. + The data type for which to check for synchronization lock. + + + Provides services to the Visual Basic compiler for compiling For...Next loops. + + + Initializes a For...Next loop. + False if the loop has terminated; otherwise, True. + The loop counter variable. + The initial value of the loop counter. + The value of the To option. + The value of the Step option. + An object that contains verified values for loop values. + The counter value for the next loop iteration. + + + Checks for valid values for the loop counter, Step, and To values. + True if is greater than zero and is less than or equal to or is less than or equal to zero and is greater than or equal to ; otherwise, False. + Required. A Decimal value that represents the initial value passed for the loop counter variable. + Required. A Decimal value that represents the value passed by using the To keyword. + Required. A Decimal value that represents the value passed by using the Step keyword. + + + Increments a For...Next loop. + False if the loop has terminated; otherwise, True. + The loop counter variable. + An object that contains verified values for loop values. + The counter value for the next loop iteration. + + + Checks for valid values for the loop counter, Step, and To values. + True if is greater than zero and is less than or equal to , or if is less than or equal to zero and is greater than or equal to ; otherwise, False. + Required. A Single value that represents the initial value passed for the loop counter variable. + Required. A Single value that represents the value passed by using the To keyword. + Required. A Single value that represents the value passed by using the Step keyword. + + + Checks for valid values for the loop counter, Step, and To values. + True if is greater than zero and is less than or equal to , or if is less than or equal to zero and is greater than or equal to ; otherwise, False. + Required. A Double value that represents the initial value passed for the loop counter variable. + Required. A Double value that represents the value passed by using the To keyword. + Required. A Double value that represents the value passed by using the Step keyword. + + + This class has been deprecated as of Visual Basic 2005. + 1 + + + Initializes a new instance of the class. + + + Performs an addition (+) operation. + The sum of and . + Required. Any numeric expression. + Required. Any numeric expression. + + + + + + Performs a bitwise And operation. + 1 if both and evaluate to 1; otherwise, 0. + Required. Any Boolean or numeric expression. + Required. Any Boolean or numeric expression. + + + + + + Performs a bitwise Or operation. + 0 if both and evaluate to 0; otherwise, 1. + Required. Any Boolean or numeric expression. + Required. Any Boolean or numeric expression. + + + + + + Performs an Xor operation. + A numeric value that represents the bitwise exclusion (exclusive bitwise disjunction) of two numeric bit patterns. For more information, see Xor Operator (Visual Basic). + Required. Any Boolean or numeric expression. + Required. Any Boolean or numeric expression. + + + + + + Performs a division (/) operation. + The full quotient of divided by , including any remainder. + Required. Any numeric expression. + Required. Any numeric expression. + + + + + + Returns a boxed primitive value. This method is used to prevent copying structures multiple times. + The primitive value of typed as object. + Required. Any expression. + + + Performs an integer division (\) operation. + The integer quotient of divided by , which discards any remainder and retains only the integer portion. + Required. Any numeric expression. + Required. Any numeric expression. + + + + + + Performs a Like comparison. + True if the string representation of the value in satisfies the pattern that is contained in ; otherwise, False. True if both and are Nothing. + Required. Any expression. + Required. Any string expression conforming to the pattern-matching conventions described in Like Operator (Visual Basic). + Required. A value that specifies that the operation use either text or binary comparison. + + + + + + Performs a modulus (Mod) operation. + The remainder after is divided by . + Required. Any numeric expression. + Required. Any numeric expression. + + + + + + Performs a multiplication (*) operation. + The product of and . + Required. Any numeric expression. + Required. Any numeric expression. + + + + + + Performs a unary minus (–) operation. + The negative value of . + Required. Any numeric expression. + + + + + + Performs a Not operation. + For Boolean operations, False if is True; otherwise, True. For bitwise operations, 1 if is 0; otherwise, 0. + Required. Any Boolean or numeric expression. + + + + + + Performs binary or text string comparison when given two objects. + Value Condition -1 is less than . 0 is equal to . 1 is greater than . + Required. Any expression. + Required. Any expression. + Required. True to perform a case-insensitive string comparison; otherwise, False. + + + + + + Performs a unary plus (+) operation. + The value of . (The sign of the is unchanged.) + Required. Any numeric expression. + + + + + + Performs an exponent (^) operation. + The result of raised to the power of . + Required. Any numeric expression. + Required. Any numeric expression. + + + + + + Performs an arithmetic left shift (<<) operation. + An integral numeric value. The result of shifting the bit pattern. The data type is the same as that of . + Required. Integral numeric expression. The bit pattern to be shifted. The data type must be an integral type (SByte, Byte, Short, UShort, Integer, UInteger, Long, or ULong). + Required. Numeric expression. The number of bits to shift the bit pattern. The data type must be Integer or widen to Integer. + + + + + + Performs an arithmetic right shift (>>) operation. + An integral numeric value. The result of shifting the bit pattern. The data type is the same as that of . + Required. Integral numeric expression. The bit pattern to be shifted. The data type must be an integral type (SByte, Byte, Short, UShort, Integer, UInteger, Long, or ULong). + Required. Numeric expression. The number of bits to shift the bit pattern. The data type must be Integer or widen to Integer. + + + + + + Performs a string concatenation (&) operation. + A string representing the concatenation of and . + Required. Any expression. + Required. Any expression. + + + + + + Performs a subtraction (–) operation. + The difference between and . + Required. Any numeric expression. + Required. Any numeric expression. + + + + + + Performs an Xor comparison. + A Boolean or numeric value. For a Boolean comparison, the return value is the logical exclusion (exclusive logical disjunction) of two Boolean values. For bitwise (numeric) operations, the return value is a numeric value that represents the bitwise exclusion (exclusive bitwise disjunction) of two numeric bit patterns. For more information, see Xor Operator (Visual Basic). + Required. Any Boolean or numeric expression. + Required. Any Boolean or numeric expression. + + + + + + Provides late-bound math operators, such as and , which the Visual Basic compiler uses internally. + 1 + + + Represents the Visual Basic addition (+) operator. + The sum of and . + Required. Any numeric expression. + Required. Any numeric expression. + + + + + + Represents the Visual Basic And operator. + For Boolean operations, True if both and evaluate to True; otherwise, False. For bitwise operations, 1 if both and evaluate to 1; otherwise, 0. + Required. Any Boolean or numeric expression. + Required. Any Boolean or numeric expression. + + + + + + Represents Visual Basic comparison operators. + Value Condition -1 is less than .0 and are equal.1 is greater than . + Required. Any expression. + Required. Any expression. + Required. True to perform a case-insensitive string comparison; otherwise, False. + + + + + + Represents the Visual Basic equal (=) operator. + True if and are equal; otherwise, False. + Required. Any expression. + Required. Any expression. + Required. True to perform a case-insensitive string comparison; otherwise, False. + + + + + + Represents the Visual Basic greater-than (>) operator. + True if is greater than ; otherwise, False. + Required. Any expression. + Required. Any expression. + Required. True to perform a case-insensitive string comparison; otherwise, False. + + + + + + Represents the Visual Basic greater-than or equal-to (>=) operator. + True if is greater than or equal to ; otherwise, False. + Required. Any expression. + Required. Any expression. + Required. True to perform a case-insensitive string comparison; otherwise, False. + + + + + + Represents the Visual Basic less-than (<) operator. + True if is less than ; otherwise, False. + Required. Any expression. + Required. Any expression. + Required. True to perform a case-insensitive string comparison; otherwise, False. + + + + + + Represents the Visual Basic less-than or equal-to (<=) operator. + True if is less than or equal to ; otherwise, False. + Required. Any expression. + Required. Any expression. + Required. True to perform a case-insensitive string comparison; otherwise, False. + + + + + + Represents the Visual Basic not-equal (<>) operator. + True if is not equal to ; otherwise, False. + Required. Any expression. + Required. Any expression. + Required. True to perform a case-insensitive string comparison; otherwise, False. + + + + + + Performs binary or text string comparison when given two strings. + Value Condition -1 is less than . 0 is equal to . 1 is greater than . + Required. Any String expression. + Required. Any String expression. + Required. True to perform a case-insensitive string comparison; otherwise, False. + + + Represents the Visual Basic concatenation (&) operator. + A string representing the concatenation of and . + Required. Any expression. + Required. Any expression. + + + + + + Represents the overloaded Visual Basic equals (=) operator. + The result of the overloaded equals operator. False if operator overloading is not supported. + Required. Any expression. + Required. Any expression. + Required. True to perform a case-insensitive string comparison; otherwise, False. + + + + + + Represents the overloaded Visual Basic greater-than (>) operator. + The result of the overloaded greater-than operator. False if operator overloading is not supported. + Required. Any expression. + Required. Any expression. + Required. True to perform a case-insensitive string comparison; otherwise, False. + + + + + + Represents the overloaded Visual Basic greater-than or equal-to (>=) operator. + The result of the overloaded greater-than or equal-to operator. False if operator overloading is not supported. + Required. Any expression. + Required. Any expression. + Required. True to perform a case-insensitive string comparison; otherwise, False. + + + + + + Represents the overloaded Visual Basic less-than (<) operator. + The result of the overloaded less-than operator. False if operator overloading is not supported. + Required. Any expression. + Required. Any expression. + Required. True to perform a case-insensitive string comparison; otherwise, False. + + + + + + Represents the overloaded Visual Basic less-than or equal-to (<=) operator. + The result of the overloaded less-than or equal-to operator. False if operator overloading is not supported. + Required. Any expression. + Required. Any expression. + Required. True to perform a case-insensitive string comparison; otherwise, False. + + + + + + Represents the overloaded Visual Basic not-equal (<>) operator. + The result of the overloaded not-equal operator. False if operator overloading is not supported. + Required. Any expression. + Required. Any expression. + Required. True to perform a case-insensitive string comparison; otherwise, False. + + + + + + Represents the Visual Basic division (/) operator. + The full quotient of divided by , including any remainder. + Required. Any numeric expression. + Required. Any numeric expression. + + + + + + Represents the Visual Basic exponent (^) operator. + The result of raised to the power of . + Required. Any numeric expression. + Required. Any numeric expression. + + + + + + Executes a late-bound evaluation of a user-defined operator. This helper method is not meant to be called directly from your code. + The result returned from the user-defined operator. + The user-defined operator. + Argument values to pass to the user-defined operator. + + + Represents the Visual Basic integer division (\) operator. + The integer quotient of divided by , which discards any remainder and retains only the integer portion. + Required. Any numeric expression. + Required. Any numeric expression. + + + + + + Represents the Visual Basic arithmetic left shift (<<) operator. + An integral numeric value. The result of shifting the bit pattern. The data type is the same as that of . + Required. Integral numeric expression. The bit pattern to be shifted. The data type must be an integral type (SByte, Byte, Short, UShort, Integer, UInteger, Long, or ULong). + Required. Numeric expression. The number of bits to shift the bit pattern. The data type must be Integer or widen to Integer. + + + + + + Represents the Visual Basic Like operator. + True if the string representation of the value in satisfies the pattern that is contained in ; otherwise, False. True if both and are Nothing. + Required. Any expression. + Required. Any string expression conforming to the pattern-matching conventions described in Like Operator (Visual Basic). + Required. A value that specifies that the operation use either text or binary comparison. + + + + + + Represents the Visual Basic Like operator. + True if the value in satisfies the pattern that is contained in ; otherwise, False. True if both and are empty. + Required. Any String expression. + Required. Any String expression conforming to the pattern-matching conventions described in Like Operator (Visual Basic). + Required. A value that specifies that the operation use either text or binary comparison. + + + Represents the Visual Basic Mod operator. + The remainder after is divided by . + Required. Any numeric expression. + Required. Any numeric expression. + + + + + + Represents the Visual Basic multiply (*) operator. + The product of and . + Required. Any numeric expression. + Required. Any numeric expression. + + + + + + Represents the Visual Basic unary minus (–) operator. + The negative value of . + Required. Any numeric expression. + + + + + + Represents the Visual Basic Not operator. + For Boolean operations, False if is True; otherwise, True. For bitwise operations, 1 if is 0; otherwise, 0. + Required. Any Boolean or numeric expression. + + + + + + Represents the Visual Basic Or operator. + For Boolean operations, False if both and evaluate to False; otherwise, True. For bitwise operations, 0 if both and evaluate to 0; otherwise, 1. + Required. Any Boolean or numeric expression. + Required. Any Boolean or numeric expression. + + + + + + Represents the Visual Basic unary plus (+) operator. + The value of . (The sign of the is unchanged.) + Required. Any numeric expression. + + + + + + Represents the Visual Basic arithmetic right shift (>>) operator. + An integral numeric value. The result of shifting the bit pattern. The data type is the same as that of . + Required. Integral numeric expression. The bit pattern to be shifted. The data type must be an integral type (SByte, Byte, Short, UShort, Integer, UInteger, Long, or ULong). + Required. Numeric expression. The number of bits to shift the bit pattern. The data type must be Integer or widen to Integer. + + + + + + Represents the Visual Basic subtraction (–) operator. + The difference between and . + Required. Any numeric expression. + Required. Any numeric expression. + + + + + + Represents the Visual Basic Xor operator. + A Boolean or numeric value. For a Boolean comparison, the return value is the logical exclusion (exclusive logical disjunction) of two Boolean values. For bitwise (numeric) operations, the return value is a numeric value that represents the bitwise exclusion (exclusive bitwise disjunction) of two numeric bit patterns. For more information, see Xor Operator (Visual Basic). + Required. Any Boolean or numeric expression. + Required. Any Boolean or numeric expression. + + + + + + Specifies that the current Option Compare setting should be passed as the default value for an argument. + 1 + + + Initializes a new instance of the class. + + + The Visual Basic compiler emits this helper class to indicate (for Visual Basic debugging) which comparison option, binary or text, is being used + 1 + + + Initializes a new instance of the class. This is a helper method. + + + Provides helpers for the Visual Basic Err object. + 1 + + + Performs the work for the Clear method of the Err object. A helper method. + + + Performs the work for the Raise method of the Err object. A helper method. + An object. + An integer value that identifies the nature of the error. Visual Basic errors are in the range 0–65535; the range 0–512 is reserved for system errors; the range 513–65535 is available for user-defined errors. + + + Closes all files for the calling assembly and stops the process. + + + + + + + The Visual Basic compiler uses this helper method to capture exceptions in the Err object. + The object to be caught. + + + The Visual Basic compiler uses this helper method to capture exceptions in the Err object. + The object to be caught. + The line number of the exception. + + + This class has been deprecated as of Visual Basic 2005. + 1 + + + Returns a Short value that corresponds to the specified object. + The Short value that corresponds to . + Required. Object to convert to a Short value. + + + + + + Returns a Short value that corresponds to the specified string. + The Short value that corresponds to . + Required. String to convert to a Short value. + + + This class has been deprecated as of Visual Basic 2005. + 1 + + + Returns a Single value that corresponds to the specified object. + The Single value corresponding to . + Required. Object to convert to a Single value. + + + + + + Returns a Single value that corresponds to the specified object. + The Single value corresponding to . + Required. Object to convert to a Single value. + A object that defines how numeric values are formatted and displayed, depending on the culture. + + + + + + Returns a Single value that corresponds to the specified string. + The Single value that corresponds to . + Required. String to convert to a Single value. + + + Returns a Single value that corresponds to the specified string and number format information. + The Single value corresponding to . + Required. String to convert to a Single value. + A object that defines how numeric values are formatted and displayed, depending on the culture. + + + This class provides attributes that are applied to the standard module construct when it is emitted to Intermediate Language (IL). It is not intended to be called directly from your code. + 1 + + + Initializes a new instance of the class. + + + The Visual Basic compiler uses this class internally when initializing static local members; it is not meant to be called directly from your code. + 1 + + + Initializes a new instance of the class. + + + Returns the state of the static local member's initialization flag (initialized or not). + + + This class has been deprecated as of Visual Basic 2005. + 1 + + + Returns a String value that corresponds to the specified Boolean. + The String value corresponding to . + Required. Boolean to convert to a String value. + + + Returns a String value that corresponds to the specified Byte. + The String value corresponding to . + Required. Byte to convert to a String value. + + + Returns a String value that corresponds to the specified Char. + The String value corresponding to . + Required. Char to convert to a String value. + + + Returns a String value that corresponds to the specified date. + The String value corresponding to . + Required. Date to convert to a String value. + + + Returns a String value that corresponds to the specified Decimal. + The String value corresponding to . + Required. Decimal to convert to a String value. + + + Returns a String value that corresponds to a specified Decimal and number format information. + The String value corresponding to . + Required. Decimal to convert to a String value. + A object that defines how numeric values are formatted and displayed, depending on the culture. + + + Returns a String value that corresponds to a specified Double. + The String value corresponding to . + Required. Double to convert to a String value. + + + Returns a String value that corresponds to a specified Double and number format information. + The String value corresponding to . + Required. Double to convert to a String value. + A object that defines how numeric values are formatted and displayed, depending on the culture. + + + Returns a String value that corresponds to a specified Integer. + The String value corresponding to . + Required. Integer to convert to a String value. + + + Returns a String value that corresponds to a specified Int64 (64-bit integer). + The String value corresponding to . + Required. Int64 to convert to a String value. + + + Returns a String value that corresponds to the specified object. + The String value corresponding to . + Required. Object to convert to a String value. + + + + + + Returns a String value that corresponds to a specified Int16 (16-bit integer). + The String value corresponding to . + Required. Int616 to convert to a String value. + + + Returns a String value that corresponds to a specified Single. + The String value corresponding to . + Required. Single to convert to a String value. + + + Returns a String value that corresponds to a specified Single and number format information. + The String value corresponding to . + Required. Sinble to convert to a String value. + A object that defines how numeric values are formatted and displayed, depending on the culture. + + + Overwrites the parameter with the contents of the parameter. + Required. String variable to modify. + Required. Location in the parameter to begin overwriting from. The index is 1-based. + Required. Maximum number of characters from the parameter to use, starting from the first character. + Required. String value to overwrite the parameter with. + + + Compares two strings. + Value Condition zero The two strings are equal. less than zero is less than . greater than zero is greater than . + Required. String to compare with . + Required. String to compare with . + Required. True to perform a case-insensitive comparison; otherwise False. + + + Compares the parameters and and returns the same results as the Like operator. + A Boolean value indicating whether or not the string satisfies the pattern. If the value in string satisfies the pattern contained in pattern, result is True. If the string does not satisfy the pattern, result is False. If both string and pattern are empty strings, the result is True. + Required. Any String expression. + Any String expression conforming to the pattern-matching conventions described in Like Operator (Visual Basic). + Specifies how to compare strings to patterns, according to the . Can be vbBinaryCompare for binary comparison or vbTextCompare for comparison based on a case-insensitive text sort order determined by your system's LocaleID value. + + + Compares the parameters and and returns the same results as the Like operator, using binary comparison. + A Boolean value indicating whether or not the string satisfies the pattern. If the value in string satisfies the pattern contained in pattern, result is True. If the string does not satisfy the pattern, result is False. If both string and pattern are empty strings, the result is True. + Required. Any String expression. + Required. Any String expression conforming to the pattern-matching conventions described in Like Operator (Visual Basic). + + + Compares the parameters and and returns the same results as the Like operator, using text comparison. + A Boolean value indicating whether or not the string satisfies the pattern. If the value in string satisfies the pattern contained in pattern, result is True. If the string does not satisfy the pattern, result is False. If both string and pattern are empty strings, the result is True. + Required. Any String expression. + Required. Any String expression conforming to the pattern-matching conventions described in Like Operator (Visual Basic). + + + Contains utilities that the Visual Basic compiler uses. + 1 + + + Used by the Visual Basic compiler as a helper for Redim. + The copied array. + The array to be copied. + The destination array. + + + Retrieves and formats a localized resource string or error message. + A formatted resource string or error message. + The identifier of the string or error message to retrieve. + An array of parameters to replace placeholders in the string or error message. + + + Returns a Visual Basic method signature. + The Visual Basic method signature for the supplied object. + A object to return a Visual Basic method signature for. + + + Sets the culture of the current thread. + The previous value of the property for the current thread. + A object to set as the culture of the current thread. + + + + + + Throws a localized Visual Basic exception. + The Visual Basic error identifier. + + + The module contains procedures used to interact with objects, applications, and systems. + 1 + + + Executes a method on an object, or sets or returns a property on an object. + Executes a method on an object, or sets or returns a property on an object. + Required. Object. A pointer to the object exposing the property or method. + Required. String. A string expression containing the name of the property or method on the object. + Required. An enumeration member of type representing the type of procedure being called. The value of CallType can be Method, Get, or Set. + Optional. ParamArray. A parameter array containing the arguments to be passed to the property or method being called. + + + + + + Returns a Boolean value indicating whether an expression can be evaluated as a number. + Returns a Boolean value indicating whether an expression can be evaluated as a number. + Required. Object expression. + + + Returns a string value containing the system data type name of a variable. + Returns a string value containing the system data type name of a variable. + Required. A string variable containing a Visual Basic type name. + + + Returns a string value containing data type information about a variable. + Returns a string value containing data type information about a variable. + Required. Object variable. If Option Strict is Off, you can pass a variable of any data type except a structure. + + + + + + Returns a string value containing the Visual Basic data type name of a variable. + Returns a string value containing the Visual Basic data type name of a variable. + Required. String variable containing a type name used by the common language runtime. + + + Provides methods for playing sounds. + 1 + + + Initializes a new instance of the class. + + + Plays a .wav sound file. + Byte array that represents the sound file. + + mode for playing the sound. By default, AudioPlayMode.Background. + + is Nothing. + + is not one of the enumeration values. + A partial-trust situation exists in which the user lacks necessary permissions. + 1 + + + + + + + + + Plays a .wav sound file. + + that represents the sound file. + + mode for playing the sound. By default, AudioPlayMode.Background. + + is Nothing. + + is not one of the enumeration values. + A partial-trust situation exists in which the user lacks necessary permissions. + 1 + + + + + + + + + Plays a .wav sound file. + A String containing the name of the sound file + + is an empty string. + The user does not have sufficient permissions to access the file named by . + The file path is malformed in . + The path name in is too long. + A partial-trust situation exists in which the user lacks necessary permissions. + 1 + + + + + + + + + Plays a .wav sound file. + A String containing the name of the sound file + + mode for playing the sound. By default, AudioPlayMode.Background. + + is an empty string. + The user does not have sufficient permissions to access the file named by . + The file path is malformed in . + The path name in is too long. + + is not one of the enumeration values. + A partial-trust situation exists in which the user lacks necessary permissions. + 1 + + + + + + + + + Plays a system sound. + + object representing the system sound to play. + + is Nothing. + + + Stops a sound playing in the background. + 1 + + + Provides properties for accessing the current local time and Universal Coordinated Time (equivalent to Greenwich Mean Time) from the system clock. + 1 + + + Initializes a new instance of the class. + + + Gets a Date object that contains the current local date and time on the computer, expressed as a UTC (GMT) time. + A Date object that contains the current date and time expressed as UTC (GMT) time. + 1 + + + Gets a Date object that contains the current local date and time on this computer. + A Date object that contains the current local date and time. + 1 + + + Gets the millisecond count from the computer's system timer. + An Integer containing the millisecond count from the computer's system timer. + 1 + + + Provides properties for manipulating computer components such as audio, the clock, the keyboard, the file system, and so on. + 1 + + + Initializes a new instance of the class. + + + Gets an object that provides properties for methods for playing sounds. + The My.Computer.Audio object for the computer. + 1 + + + Gets an object that provides methods for manipulating the Clipboard. + The My.Computer.Clipboard object for the computer. + 1 + + + Gets an object that provides properties for accessing the current state of the keyboard, such as what keys are currently pressed, and provides a method to send keystrokes to the active window. + The My.Computer.Keyboard object for the computer. + 1 + + + Gets an object that provides properties for getting information about the format and configuration of the mouse installed on the local computer. + The My.Computer.Mouse object for the computer. + 1 + + + Gets an object that provides a property and a method for accessing the computer's serial ports. + The My.Computer.Ports object. + 1 + + + Gets the object that represents the computer's primary display screen. + A object that represents the computer's primary screen. + 1 + + + Provides properties for getting information about the computer's memory, loaded assemblies, name, and operating system. + 1 + + + Initializes a new instance of the class. + + + Gets the total amount of free physical memory for the computer. + A ULong containing the number of bytes of free physical memory for the computer. + The application cannot obtain the memory status. + 1 + + + + + + Gets the total amount of the computer's free virtual address space. + A ULong containing the number of bytes of the computer's free virtual address space. + The application cannot obtain the memory status. + 1 + + + + + + Gets the current UI culture installed with the operating system. + A object represents the UI culture installed on the computer. + 1 + + + Gets the full operating system name. + A String containing the operating-system name. + The calling code does not have full trust. + 1 + + + + + + + + Gets the platform identifier for the operating system of the computer. + A String containing the platform identifier for the operating system of the computer, chosen from the member names of the enumeration. + The application cannot obtain the operating-system platform information. + 1 + + + Gets the version of the computer's operating system. + A String containing the current version number of the operating system. + The application cannot obtain the operating-system version information. + 1 + + + Gets the total amount of physical memory for the computer. + A ULong containing the number of bytes of physical memory for the computer. + The application cannot obtain the memory status. + 1 + + + + + + Gets the total amount of virtual address space available for the computer. + A ULong containing the number of bytes of virtual address space available for the computer. + The application cannot obtain the memory status. + 1 + + + + + + Provides properties for accessing the current state of the keyboard, such as what keys are currently pressed, and provides a method to send keystrokes to the active window. + 1 + + + Initializes a new instance of the class. + + + Gets a Boolean indicating if the ALT key is down. + A Boolean value: True if the ALT key is down; otherwise False. + 1 + + + Gets a Boolean indicating if CAPS LOCK is turned on. + A Boolean value: True if CAPS LOCK is turned on; otherwise False. + 1 + + + Gets a Boolean indicating if a CTRL key is down. + A Boolean value. True if a CTRL key is down; otherwise False. + 1 + + + Gets a Boolean indicating if the NUM LOCK key is on. + A Boolean value. True if NUM LOCK is on; otherwise False. + 1 + + + Gets a Boolean indicating whether the SCROLL LOCK key is on. + A Boolean value. True if SCROLL LOCK is on; otherwise False. + 1 + + + Sends one or more keystrokes to the active window, as if typed on the keyboard. + A String that defines the keys to send. + A partial-trust situation exists in which the user lacks necessary permissions. + + + Sends one or more keystrokes to the active window, as if typed on the keyboard. + A String that defines the keys to send. + Optional. A Boolean that specifies whether or not to wait for keystrokes to get processed before the application continues. True by default. + A partial-trust situation exists in which the user lacks necessary permissions. + 1 + + + + + + + + Gets a Boolean indicating if a SHIFT key is down. + A Boolean value. True if a SHIFT key is down; otherwise False. + 1 + + + Provides properties for getting information about the format and configuration of the mouse installed on the local computer. + 1 + + + Initializes a new instance of the class. + + + Gets a Boolean that indicates if the functionality of the left and right mouse buttons has been swapped. + A Boolean with a value True if the functionality of the left and right mouse buttons has been swapped; otherwise, False. + The computer has no mouse installed. + 1 + + + Gets a Boolean that indicates if the mouse has a scroll wheel. + A Boolean with value True if the mouse has a scroll wheel; otherwise False. + The computer has no mouse installed. + 1 + + + Gets a number that indicates how much to scroll when the mouse wheel is rotated one notch. + An Integer that indicates how much to scroll when the mouse wheel is rotated one notch. A positive value indicates scrolling by that number of lines, while a negative value indicates scrolling by one screen at a time. + The computer has no mouse installed. + The mouse has no scroll wheel. + 1 + + + Provides a property, event, and methods for interacting with the network to which the computer is connected. + 1 + + + Initializes a new instance of the class. + + + Downloads the specified remote file and saves it in the specified location. + Path of the file to download, including file name and host address. + File name and path of the downloaded file. + The drive name is not valid + + ends with a trailing slash. + The server does not respond within the default timeout (100 seconds). + The target web site requires user credentials. + User lacks necessary permissions to perform a network operation. + The request is denied by the target web server. + 1 + + + + + + + + Downloads the specified remote file and saves it in the specified location. + Path of the file to download, including file name and host address. + File name and path of the downloaded file. + User name to authenticate. Default is an empty string, "". + Password to authenticate. Default is an empty string, "". + The drive name is not valid + + ends with a trailing slash. + The server does not respond within the default timeout (100 seconds). + The user authentication fails. + User lacks necessary permissions to perform a network operation. + The request is denied by the target web server. + 1 + + + + + + + + Downloads the specified remote file and saves it in the specified location. + Path of the file to download, including file name and host address. + File name and path of the downloaded file. + User name to authenticate. Default is an empty string, "". + Password to authenticate. Default is an empty string, "". + True to display the progress of the operation; otherwise False. Default is False. + + . Timeout interval, in milliseconds. Default is 100 seconds. + True to overwrite existing files; otherwise False. Default is False. + The drive name is not valid + + ends with a trailing slash. + + is set to False and the destination file already exists. + The server does not respond within the specified . + The user authentication fails. + User lacks necessary permissions to perform a network operation. + The request is denied by the target web server. + 1 + + + + + + + + Downloads the specified remote file and saves it in the specified location. + Path of the file to download, including file name and host address. + File name and path of the downloaded file. + User name to authenticate. Default is an empty string, "". + Password to authenticate. Default is an empty string, "". + True to display the progress of the operation; otherwise False. Default is False. + Timeout interval, in milliseconds. Default is 100 seconds. + True to overwrite existing files; otherwise False. Default is False. + Specifies behavior when the user clicks Cancel or No on the dialog box shown as a result of set to True. Default is . + The drive name is not valid + + ends with a trailing slash. + + is set to False and the destination file already exists. + The server does not respond within the specified . + The user authentication fails. + User lacks necessary permissions to perform a network operation. + The request is denied by the target web server. + 1 + + + + + + + + Downloads the specified remote file and saves it in the specified location. + Path of the file to download, including file name and host address. + File name and path of the downloaded file. + The drive name is not valid + + ends with a trailing slash. + The server does not respond within the default timeout (100 seconds). + The target web site requires user credentials. + User lacks necessary permissions to perform a network operation. + The request is denied by the target web server. + 1 + + + + + + + + Downloads the specified remote file and saves it in the specified location. + String or . Path of the file to download, including file name and host address. + String. File name and path of the downloaded file. + + . Credentials to be supplied. + True to display the progress of the operation; otherwise False. Default is False. + Timeout interval, in milliseconds. Default is 100 seconds. + True to overwrite existing files; otherwise False. Default is False. + The drive name is not valid + + ends with a trailing slash. + + is set to False and the destination file already exists. + The server does not respond within the specified . + The user authentication fails. + User lacks necessary permissions to perform a network operation. + The request is denied by the target web server. + 1 + + + + + + + + Downloads the specified remote file and saves it in the specified location. + Path of the file to download, including file name and host address. + File name and path of the downloaded file. + Credentials to be supplied. + True to display the progress of the operation; otherwise False. Default is False. + Timeout interval, in milliseconds. Default is 100 seconds. + True to overwrite existing files; otherwise False. Default is False. + Specifies behavior when the user clicks Cancel or No on the dialog box shown as a result of set to True. Default is . + The drive name is not valid + + ends with a trailing slash. + + is set to False and the destination file already exists. + The server does not respond within the specified . + The user authentication fails. + User lacks necessary permissions to perform a network operation. + The request is denied by the target web server. + 1 + + + + + + + + Downloads the specified remote file and saves it in the specified location. + Path of the file to download, including file name and host address. + File name and path of the downloaded file. + User name to authenticate. Default is an empty string, "". + Password to authenticate. Default is an empty string, "". + The drive name is not valid + + ends with a trailing slash. + The server does not respond within the default timeout (100 seconds). + The user authentication fails. + User lacks necessary permissions to perform a network operation. + The request is denied by the target web server. + 1 + + + + + + + + Downloads the specified remote file and saves it in the specified location. + Path of the file to download, including file name and host address. + File name and path of the downloaded file. + User name to authenticate. Default is an empty string, "". + Password to authenticate. Default is an empty string, "". + True to display the progress of the operation; otherwise False. Default is False. + Timeout interval, in milliseconds. Default is 100 seconds. + True to overwrite existing files; otherwise False. Default is False. + The drive name is not valid + + ends with a trailing slash. + + is set to False and the destination file already exists. + The server does not respond within the specified . + The user authentication fails. + User lacks necessary permissions to perform a network operation. + The request is denied by the target web server. + 1 + + + + + + + + Downloads the specified remote file and saves it in the specified location. + Path of the file to download, including file name and host address. + File name and path of the downloaded file. + User name to authenticate. Default is an empty string, "". + Password to authenticate. Default is an empty string, "". + True to display the progress of the operation; otherwise False. Default is False. + Timeout interval, in milliseconds. Default is 100 seconds. + True to overwrite existing files; otherwise False. Default is False. + Specifies behavior when the user clicks Cancel or No on the dialog box shown as a result of set to True. Default is . + The drive name is not valid + + ends with a trailing slash. + + is set to False and the destination file already exists. + The server does not respond within the specified . + The user authentication fails. + User lacks necessary permissions to perform a network operation. + The request is denied by the target web server. + 1 + + + + + + + + Indicates whether a computer is connected to a network. + True if the computer is connected to a network; otherwise False. + 1 + + + + + + + + + + Occurs when the network availability changes. + 1 + + + Pings the specified server. + True if the operation was successful; otherwise False. + The URL, computer name, or IP number of the server to ping. + No network connection is available. + URL was not valid. + 1 + + + + + + + + + + + + Pings the specified server. + True if the operation was successful; otherwise False. + The URL, computer name, or IP number of the server to ping. + Time threshold in milliseconds for contacting the destination. Default is 500. + No network connection is available. + URL was not valid. + 1 + + + + + + + + + + + + Pings the specified server. + True if the operation was successful; otherwise False. + The URI of the server to ping. + No network connection is available. + URL was not valid. + 1 + + + + + + + + + + + + Pings the specified server. + True if the operation was successful; otherwise False. + The URI of the server to ping. + Time threshold in milliseconds for contacting the destination. Default is 500. + No network connection is available. + URL was not valid. + 1 + + + + + + + + + + + + Sends the specified file to the specified host address. + Path and name of file to upload. + URL, IP address, or URI of destination server. + The source file path is not valid. + + does not include a file name. + The target server requires user credentials. + The server does not respond within the default timeout (100 seconds). + User lacks necessary permissions to perform a network operation. + The request is denied by the target web server. + 1 + + + + + + + + Sends the specified file to the specified host address. + Path and name of file to upload. + URL, IP address, or URI of destination server. + User name to authenticate. Default is an empty string: "". + Password to authenticate. Default is an empty string: "". + The source file path is not valid. + + is less than or equal to zero. + + does not include a file name. + Authentication failed. + The server does not respond within the default timeout (100 seconds). + The user authentication fails. + User lacks necessary permissions to perform a network operation. + The request is denied by the target web server. + 1 + + + + + + + + Sends the specified file to the specified host address. + Path and name of file to upload. + URL, IP address, or URI of destination server. + User name to authenticate. Default is an empty string: "". + Password to authenticate. Default is an empty string: "". + True to display progress of the operation; otherwise False. Default is False. + Timeout interval in milliseconds. Default is 100 seconds. + The source file path is not valid. + + is less than or equal to zero. + + does not include a file name. + Authentication failed. + The server does not respond within the specified . + The user authentication fails. + User lacks necessary permissions to perform a network operation. + The request is denied by the target web server. + 1 + + + + + + + + Sends the specified file to the specified host address. + Path and name of file to upload. + URL, IP address, or URI of destination server. + User name to authenticate. Default is an empty string: "". + Password to authenticate. Default is an empty string: "". + Whether to display progress of the operation. Default is False. + Timeout interval in milliseconds. Default is 100 seconds. + Action to be taken when the user clicks Cancel. Default is . + The source file path is not valid. + + is less than or equal to zero. + + does not include a file name. + Authentication failed. + The server does not respond within the specified . + The user authentication fails. + User lacks necessary permissions to perform a network operation. + The request is denied by the target web server. + 1 + + + + + + + + Sends the specified file to the specified host address. + Path and name of file to upload. + URL, IP address, or URI of destination server. + The source file path is not valid. + + does not include a file name. + The target server requires user credentials. + The server does not respond within the default timeout (100 seconds). + User lacks necessary permissions to perform a network operation. + The request is denied by the target web server. + 1 + + + + + + + + Sends the specified file to the specified host address. + Path and name of file to upload. + URL, IP address, or URI of destination server. + Credentials for authentication. + True to display progress of the operation; otherwise False. Default is False. + Timeout interval in milliseconds. Default is 100 seconds. + The source file path is not valid. + + is less than or equal to zero. + + does not include a file name. + Authentication failed. + The server does not respond within the specified . + The user authentication fails. + User lacks necessary permissions to perform a network operation. + The request is denied by the target web server. + 1 + + + + + + + + Sends the specified file to the specified host address. + Path and name of file to upload. + URL, IP address, or URI of destination server. + Credentials for authentication. + True to display progress of the operation; otherwise False. Default is False. + Timeout interval in milliseconds. Default is 100 seconds. + Action to be taken when the user clicks Cancel. Default is . + The source file path is not valid. + + is less than or equal to zero. + + does not include a file name. + Authentication failed. + The server does not respond within the specified . + The user authentication fails. + User lacks necessary permissions to perform a network operation. + The request is denied by the target web server. + 1 + + + + + + + + Sends the specified file to the specified host address. + Path and name of file to upload. + URL, IP address, or URI of destination server. + User name to authenticate. Default is an empty string: "". + Password to authenticate. Default is an empty string: "". + The source file path is not valid. + + is less than or equal to zero. + + does not include a file name. + Authentication failed. + The server does not respond within the default timeout (100 seconds). + The user authentication fails. + User lacks necessary permissions to perform a network operation. + The request is denied by the target web server. + 1 + + + + + + + + Sends the specified file to the specified host address. + Path and name of file to upload. + URL, IP address, or URI of destination server. + User name to authenticate. Default is an empty string: "". + Password to authenticate. Default is an empty string: "". + True to display progress of the operation; otherwise False. Default is False. + Timeout interval in milliseconds. Default is 100 seconds. + The source file path is not valid. + + is less than or equal to zero. + + does not include a file name. + Authentication failed. + The server does not respond within the specified . + The user authentication fails. + User lacks necessary permissions to perform a network operation. + The request is denied by the target web server. + 1 + + + + + + + + Sends the specified file to the specified host address. + Path and name of file to upload. + URL, IP address, or URI of destination server. + User name to authenticate. Default is an empty string: "". + Password to authenticate. Default is an empty string: "". + Whether to display progress of the operation. Default is False. + Timeout interval in milliseconds. Default is 100 seconds. + Action to be taken when the user clicks Cancel. Default is . + The source file path is not valid. + + is less than or equal to zero. + + does not include a file name. + Authentication failed. + The server does not respond within the specified . + The user authentication fails. + User lacks necessary permissions to perform a network operation. + The request is denied by the target web server. + 1 + + + + + + + + Provides data for the My.Application.NetworkAvailabilityChanged and My.Computer.Network.NetworkAvailabilityChanged events. + 1 + + + Initializes a new instance of the class. + A that indicates whether a network is available to the application. + + + Gets a value indicating whether a network is available to the application. + A that indicates whether a network is available to the application. + 1 + + + Represents the method that will handle the My.Application.NetworkAvailabilityChanged or My.Computer.Network.NetworkAvailabilityChanged event. + The source of the event. + A object that contains the event data. + 1 + + + Provides a property and a method for accessing the computer's serial ports. + 1 + + + Initializes a new instance of the class. + + + Creates and opens a object. + An open object, configured with the supplied arguments. + String. Required. Name of the port to open. + + is Nothing or an empty string. + 1 + + + + + + Creates and opens a object. + An open object, configured with the supplied arguments. + String. Required. Name of the port to open. + Integer. Baud rate of the port. + + is Nothing or an empty string. + + is less than or equal to zero. + 1 + + + + + + Creates and opens a object. + An open object, configured with the supplied arguments. + String. Required. Name of the port to open. + Integer. Baud rate of the port. + + . Parity of the port. + + is Nothing or an empty string. + + is less than or equal to zero. + + is not one of the enumeration values. + 1 + + + + + + Creates and opens a object. + An open object, configured with the supplied arguments. + String. Required. Name of the port to open. + Integer. Baud rate of the port. + + . Parity of the port. + Integer. Data-bit setting of the port. + + is Nothing or an empty string. + + is less than or equal to zero. + + is less than or equal to zero. + + is not one of the enumeration values. + 1 + + + + + + Creates and opens a object. + An open object, configured with the supplied arguments. + String. Required. Name of the port to open. + Integer. Baud rate of the port. + + . Parity of the port. + Integer. Data-bit setting of the port. + + . Stop-bit setting of the port. + + is Nothing or an empty string. + + is less than or equal to zero. + + is less than or equal to zero. + + is not one of the enumeration values. + + is not one of the enumeration values. + 1 + + + + + + Gets a collection of the names of the serial ports on the computer. + A collection of the names of the serial ports on the computer. + 1 + + + Provides properties for manipulating computer components such as audio, the clock, the keyboard, the file system, and so on. + 1 + + + Initializes a new instance of the class. + + + Gets an object that provides properties for accessing the current local time and Universal Coordinated Time (the equivalent to Greenwich Mean Time) from the system clock. + The My.Computer.Clock object for the computer. + 1 + + + Gets an object that provides properties and methods for working with drives, files, and directories. + The My.Computer.FileSystem object for the computer. + 1 + + + Gets an object that provides properties for getting information about the computer's memory, loaded assemblies, name, and operating system. + The My.Computer.Info object for the computer. + 1 + + + Gets the computer name. + A String containing the name of the computer. + 1 + + + + + + + Gets an object that provides a property and methods for interacting with the network to which the computer is connected. + The My.Computer.Network object for the computer. + 1 + + + + + + + + + + Gets an object that provides properties and methods for manipulating the registry. + The My.Computer.Registry object for the computer. + 1 + + + Specifies what should be done when a directory that is to be deleted contains files or directories. + + + Throw an if the directory is not empty. The Data property of the exception lists the file(s) that could not be deleted. + + + Delete the contents of the directory along with the directory. Default. + + + Indicates whether text fields are delimited or fixed width. + 1 + + + Indicates that the fields are delimited. + + + Indicates that the fields are fixed width. + + + Provides properties and methods for working with drives, files, and directories. + 1 + + + Initializes a new instance of the class. + + + Combines two paths and returns a properly formatted path. + The combination of the specified paths. + String. First path to be combined. + String. Second path to be combined. + + or are malformed paths. + 1 + + + + + + Copies a directory to another directory. + The directory to be copied. + The location to which the directory should be copied. + The new name specified for the directory contains a colon (:) or slash (\ or /). + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + or is Nothing or an empty string. + The source directory does not exist. + The source directory is a root directory + The combined path points to an existing file. + The source path and target path are the same. + The operation is cyclic. + The path exceeds the system-defined maximum length. + A folder name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + A destination file exists but cannot be accessed. + 1 + + + + + + + + Copies a directory to another directory. + The directory to be copied. + The location to which the directory should be copied. + Whether to visually track the operation's progress. Default is UIOption.OnlyErrorDialogs. + The new name specified for the directory contains a colon (:) or slash (\ or /). + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + or is Nothing or an empty string. + The source directory does not exist. + The source directory is a root directory + The combined path points to an existing file. + The source path and target path are the same. + The operation is cyclic. + The path exceeds the system-defined maximum length. + A folder name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + A destination file exists but cannot be accessed. + + is set to UIOption.AllDialogs and the user cancels the operation, or one or more files in the directory cannot be copied. + + + Copies a directory to another directory. + The directory to be copied. + The location to which the directory should be copied. + Whether to visually track the operation's progress. Default is UIOption.OnlyErrorDialogs. + Specifies what should be done if the user clicks Cancel during the operation. Default is . + The new name specified for the directory contains a colon (:) or slash (\ or /). + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + or is Nothing or an empty string. + The source directory does not exist. + The source directory is a root directory + The combined path points to an existing file. + The source path and target path are the same. + The operation is cyclic. + The path exceeds the system-defined maximum length. + A folder name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + A destination file exists but cannot be accessed. + + is set to UIOption.AllDialogs and the user cancels the operation, or one or more files in the directory cannot be copied. + + + Copies a directory to another directory. + The directory to be copied. + The location to which the directory should be copied. + True to overwrite existing files; otherwise False. Default is False. + The new name specified for the directory contains a colon (:) or slash (\ or /). + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + or is Nothing or an empty string. + The source directory does not exist. + The source directory is a root directory + The combined path points to an existing file. + The source path and target path are the same. + The operation is cyclic. + The path exceeds the system-defined maximum length. + A folder name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + A destination file exists but cannot be accessed. + 1 + + + + + + + + Copies a file to a new location. + The file to be copied. + The location to which the file should be copied. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + The system could not retrieve the absolute path. + + contains path information. + + or is Nothing or an empty string. + The source file is not valid or does not exist. + The combined path points to an existing directory. + The user does not have sufficient permissions to access the file. + A file in the target directory with the same name is in use. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The path exceeds the system-defined maximum length. + The user does not have required permission. + The user lacks necessary permissions to view the path. + 1 + + + + + + + + Copies a file to a new location. + The file to be copied. + The location to which the file should be copied. + Whether to visually track the operation's progress. Default is UIOption.OnlyErrorDialogs. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + The system could not retrieve the absolute path. + + contains path information. + + or is Nothing or an empty string. + The source file is not valid or does not exist. + The combined path points to an existing directory. + The user does not have sufficient permissions to access the file. + A file in the target directory with the same name is in use. + The destination file exists and is set to False. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The path exceeds the system-defined maximum length. + The user does not have required permission. + The user lacks necessary permissions to view the path. + + + Copies a file to a new location. + The file to be copied. + The location to which the file should be copied. + Whether to visually track the operation's progress. Default is UIOption.OnlyErrorDialogs. + Specifies what should be done if the user clicks Cancel during the operation. Default is . + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + The system could not retrieve the absolute path. + + contains path information. + + or is Nothing or an empty string. + The source file is not valid or does not exist. + The combined path points to an existing directory. + The user does not have sufficient permissions to access the file. + A file in the target directory with the same name is in use. + The destination file exists and is set to False. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The path exceeds the system-defined maximum length. + The user does not have required permission. + The user lacks necessary permissions to view the path. + + is set to ThrowException, and the user has canceled the operation or an unspecified I/O error occurs. + + + Copies a file to a new location. + The file to be copied. + The location to which the file should be copied. + True if existing files should be overwritten; otherwise False. Default is False. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + The system could not retrieve the absolute path. + + contains path information. + + or is Nothing or an empty string. + The source file is not valid or does not exist. + The combined path points to an existing directory. + The user does not have sufficient permissions to access the file. + A file in the target directory with the same name is in use. + The destination file exists and is set to False. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The path exceeds the system-defined maximum length. + The user does not have required permission. + The user lacks necessary permissions to view the path. + 1 + + + + + + + + Creates a directory. + Name and location of the directory. + The directory name is malformed. For example, it contains illegal characters or is only white space. + + is Nothing or an empty string. + The directory name is too long. + The directory name is only a colon (:). + The parent directory of the directory to be created is read-only + The user does not have permission to create the directory. + 1 + + + + + + Gets or sets the current directory. + The current directory for file I/O operations. + The path is not valid. + The user lacks necessary permissions. + 1 + + + + + + + Deletes a directory. + Directory to be deleted. + Specifies what should be done when a directory that is to be deleted contains files or directories. Default is DeleteDirectoryOption.DeleteAllContents. + The path is a zero-length string, is malformed, contains only white space, or contains invalid characters (including wildcard characters). The path is a device path (starts with \\.\). + + is Nothing or an empty string. + The directory does not exist or is a file. + The directory is not empty, and is set to ThrowIfDirectoryNonEmpty. + The user does not have permission to delete the directory or subdirectory. + A file in the directory or subdirectory is in use. + The directory name contains a colon (:). + The path exceeds the system-defined maximum length. + The user does not have required permissions. + The user cancels the operation or the directory cannot be deleted. + + + Deletes a directory. + Directory to be deleted. + Specifies whether to visually track the operation's progress. Default is UIOption.OnlyErrorDialogs. + Specifies whether or not the deleted file should be sent to the Recycle Bin. Default is RecycleOption.DeletePermanently. + The path is a zero-length string, is malformed, contains only white space, or contains invalid characters (including wildcard characters). The path is a device path (starts with \\.\). + + is Nothing or an empty string. + The directory does not exist or is a file. + The directory is not empty, and is set to ThrowIfDirectoryNonEmpty. + The user does not have permission to delete the directory or subdirectory. + A file in the directory or subdirectory is in use. + The directory name contains a colon (:). + The path exceeds the system-defined maximum length. + The user does not have required permissions. + The user cancels the operation or the directory cannot be deleted. + + + Deletes a directory. + Directory to be deleted. + Specifies whether to visually track the operation's progress. Default is UIOption.OnlyErrorDialogs. + Specifies whether or not the deleted file should be sent to the Recycle Bin. Default is RecycleOption.DeletePermanently. + Specifies whether to throw an exception if the user clicks Cancel. + The path is a zero-length string, is malformed, contains only white space, or contains invalid characters (including wildcard characters). The path is a device path (starts with \\.\). + + is Nothing or an empty string. + The directory does not exist or is a file. + The directory is not empty, and is set to ThrowIfDirectoryNonEmpty. + The user does not have permission to delete the directory or subdirectory. + A file in the directory or subdirectory is in use. + The directory name contains a colon (:). + The path exceeds the system-defined maximum length. + The user does not have required permissions. + The user cancels the operation or the directory cannot be deleted. + + + Deletes a file. + Name and path of the file to be deleted. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; it has a trailing slash where a file must be specified; or it is a device path (starts with \\.\). + + is Nothing or an empty string. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The file is in use. + The user lacks necessary permissions to view the path. + The file does not exist. + The user does not have permission to delete the file or the file is read-only. + 1 + + + + + + + + Deletes a file. + Name and path of the file to be deleted. + Whether to visually track the operation's progress. Default is UIOption.OnlyErrorDialogs. + Whether or not the deleted file should be sent to the Recycle Bin. Default is RecycleOption.DeletePermanently. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; it has a trailing slash where a file must be specified; or it is a device path (starts with \\.\). + + is Nothing or an empty string. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The file is in use. + The user lacks necessary permissions to view the path. + The file does not exist. + The user does not have permission to delete the file or the file is read-only. + + + Deletes a file. + Name and path of the file to be deleted. + Whether to visually track the operation's progress. Default is UIOption.OnlyErrorDialogs. + Whether or not the deleted file should be sent to the Recycle Bin. Default is RecycleOption.DeletePermanently. + Specifies whether or not an exception is thrown when the user cancels the operation. Default is UICancelOption.ThrowException. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; it has a trailing slash where a file must be specified; or it is a device path (starts with \\.\). + + is Nothing or an empty string. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The file is in use. + The user lacks necessary permissions to view the path. + The file does not exist. + The user does not have permission to delete the file or the file is read-only. + The user cancelled the operation and is set to . + + + Returns True if the specified directory exists. + True if the directory exists; otherwise False. + Path of the directory. + 1 + + + + + + Returns a read-only collection of all available drive names. + A read-only collection of all available drives as objects. + 1 + + + + + + + + + Returns True if the specified file exists. + Returns True if the file exists; otherwise this method returns False. + Name and path of the file. + The name of the file ends with a backslash (\). + 1 + + + + + + Returns a read-only collection of strings representing the names of files containing the specified text. + Read-only collection of the names of files containing the specified text.. + The directory to be searched. + The search text. + True if the search should be case-sensitive; otherwise False. Default is True. + Whether to include subfolders. Default is SearchOption.SearchTopLevelOnly. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + is Nothing or an empty string. + The specified directory does not exist. + The specified directory points to an existing file. + The path exceeds the system-defined maximum length. + The specified directory path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + The user lacks necessary permissions. + + + Returns a read-only collection of strings representing the names of files containing the specified text. + Read-only collection of the names of files containing the specified text.. + The directory to be searched. + The search text. + True if the search should be case-sensitive; otherwise False. Default is True. + Whether to include subfolders. Default is SearchOption.SearchTopLevelOnly. + Pattern to be matched. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + is Nothing or an empty string. + The specified directory does not exist. + The specified directory points to an existing file. + The path exceeds the system-defined maximum length. + The specified directory path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + The user lacks necessary permissions. + + + Returns a collection of strings representing the path names of subdirectories within a directory. + Read-only collection of the path names of subdirectories within the specified directory.. + Name and path of directory. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + is Nothing or an empty string. + The specified directory does not exist. + The specified directory points to an existing file. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + The user lacks necessary permissions. + 1 + + + + + + + + + Returns a collection of strings representing the path names of subdirectories within a directory. + Read-only collection of the path names of subdirectories within the specified directory. + Name and path of directory. + Whether to include subfolders. Default is SearchOption.SearchTopLevelOnly. + Pattern to match names. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + is Nothing or an empty string. + One or more of the specified wildcard characters is Nothing, an empty string, or contains only spaces. + The specified directory does not exist. + The specified directory points to an existing file. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + The user lacks necessary permissions. + + + Returns a object for the specified path. + + object for the specified path. + String. Path of directory. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + is Nothing or an empty string. + The path exceeds the system-defined maximum length. + The directory path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path + 1 + + + + + + Returns a object for the specified drive. + + object for the specified drive. + Drive to be examined. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + is Nothing or an empty string. + The path exceeds the system-defined maximum length. + The user lacks necessary permissions to view the path + 1 + + + + + + Returns a object for the specified file. + + object for the specified file + Name and path of the file. + The path name is malformed. For example, it contains invalid characters or is only white space. The file name has a trailing slash mark. + + is Nothing or an empty string. + The path contains a colon in the middle of the string. + The path is too long. + The user lacks necessary permissions. + The user lacks ACL (access control list) access to the file. + 1 + + + + + + Returns a read-only collection of strings representing the names of files within a directory. + Read-only collection of file names from the specified directory. + Directory to be searched. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + is Nothing. + The directory to search does not exist. + + points to an existing file. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + The user lacks necessary permissions. + 1 + + + + + + + + + Returns a read-only collection of strings representing the names of files within a directory. + Read-only collection of file names from the specified directory. + Directory to be searched. + Whether to include subfolders. Default is SearchOption.SearchTopLevelOnly. + Pattern to be matched. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + is Nothing. + The directory to search does not exist. + + points to an existing file. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + The user lacks necessary permissions. + + + Parses the file name out of the path provided. + The file name from the specified path. + Required. Path to be parsed. String. + + + Returns the parent path of the provided path. + The parent path of the provided path. + Path to be examined. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + Path does not have a parent path because it is a root path. + + is Nothing. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + 1 + + + + + + Creates a uniquely named zero-byte temporary file on disk and returns the full path of that file. + String containing the full path of the temporary file. + 1 + + + + + + + Moves a directory from one location to another. + Path of the directory to be moved. + Path of the directory to which the source directory is being moved. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + or is Nothing or an empty string. + + or is Nothing or an empty string. + The directory does not exist. + The source is a root directory or The source path and the target path are the same. + The path exceeds the system-defined maximum length. + The operation is cyclic. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + The user does not have required permission. + 1 + + + + + + + + Moves a directory from one location to another. + Path of the directory to be moved. + Path of the directory to which the source directory is being moved. + Specifies whether to visually track the operation's progress. Default is UIOption.OnlyErrorDialogs. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + or is Nothing or an empty string. + + or is Nothing or an empty string. + The directory does not exist. + The source is a root directory or The source path and the target path are the same. + The target directory already exists and o is set to False. + The path exceeds the system-defined maximum length. + The operation is cyclic. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + The user does not have required permission. + + + Moves a directory from one location to another. + Path of the directory to be moved. + Path of the directory to which the source directory is being moved. + Specifies whether to visually track the operation's progress. Default is UIOption.OnlyErrorDialogs. + Specifies whether or not an exception is thrown when the user cancels the operation. Default is UICancelOption.ThrowException. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + or is Nothing or an empty string. + + or is Nothing or an empty string. + The directory does not exist. + The source is a root directory or The source path and the target path are the same. + The target directory already exists and o is set to False. + + is set to ThrowException and a subdirectory of the file cannot be copied. + + is set to ThrowException, and the user cancels the operation, or the operation cannot be completed. + + is set to ThrowException, and the user lacks necessary permissions. + The path exceeds the system-defined maximum length. + The operation is cyclic. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + The user does not have required permission. + + + Moves a directory from one location to another. + Path of the directory to be moved. + Path of the directory to which the source directory is being moved. + True if existing directories should be overwritten; otherwise False. Default is False. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + or is Nothing or an empty string. + + or is Nothing or an empty string. + The directory does not exist. + The source is a root directory or The source path and the target path are the same. + The target directory already exists and o is set to False. + The path exceeds the system-defined maximum length. + The operation is cyclic. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + The user does not have required permission. + 1 + + + + + + + + Moves a file to a new location. + Path of the file to be moved. + Path of the directory into which the file should be moved. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\); it ends with a trailing slash. + + is Nothing or an empty string. + The source file is not valid or does not exist. + The file is in use by another process, or an I/O error occurs. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + 1 + + + + + + + + Moves a file to a new location. + Path of the file to be moved. + Path of the directory into which the file should be moved. + Specifies whether to visually track the operation's progress. Default is UIOption.OnlyErrorDialogs. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\); it ends with a trailing slash. + + is Nothing or an empty string. + The source file is not valid or does not exist. + The destination file exists and is set to False. + The file is in use by another process, or an I/O error occurs. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + + + Moves a file to a new location. + Path of the file to be moved. + Path of the directory into which the file should be moved. + Specifies whether to visually track the operation's progress. Default is UIOption.OnlyErrorDialogs. + Specifies whether or not an exception is thrown when the user cancels the operation. Default is UICancelOption.ThrowException. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\); it ends with a trailing slash. + + is Nothing or an empty string. + The source file is not valid or does not exist. + The destination file exists and is set to False. + The file is in use by another process, or an I/O error occurs. + + is set to ThrowException, and either the user has cancelled the operation or an unspecified I/O error occurs. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + + + Moves a file to a new location. + Path of the file to be moved. + Path of the directory into which the file should be moved. + True to overwrite existing files; otherwise False. Default is False. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\); it ends with a trailing slash. + + is Nothing or an empty string. + The source file is not valid or does not exist. + The destination file exists and is set to False. + The file is in use by another process, or an I/O error occurs. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + 1 + + + + + + + + The OpenTextFieldParser method allows you to create a object, which provides a way to easily and efficiently parse structured text files, such as logs. The TextFieldParser object can be used to read both delimited and fixed-width files. + + to read the specified file. + The file to be opened with the TextFieldParser. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\); it ends with a trailing slash. + + is Nothing. + The file does not exist. + The file is in use by another process, or an I/O error occurs. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + A row cannot be parsed using the specified format. The exception message specifies the line causing the exception, while the property is assigned the text contained in the line. + The user lacks necessary permissions to view the path. + 1 + + + + + + The OpenTextFieldParser method allows you to create a object, which provides a way to easily and efficiently parse structured text files, such as logs. The TextFieldParser object can be used to read both delimited and fixed-width files. + + to read the specified file. + The file to be opened with the TextFieldParser. + Widths of the fields. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\); it ends with a trailing slash. + + is Nothing. + The file does not exist. + The file is in use by another process, or an I/O error occurs. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + A row cannot be parsed using the specified format. The exception message specifies the line causing the exception, while the property is assigned the text contained in the line. + The user lacks necessary permissions to view the path. + + + The OpenTextFieldParser method allows you to create a object, which provides a way to easily and efficiently parse structured text files, such as logs. The TextFieldParser object can be used to read both delimited and fixed-width files. + + to read the specified file. + The file to be opened with the TextFieldParser. + Delimiters for the fields. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\); it ends with a trailing slash. + + is Nothing. + The file does not exist. + The file is in use by another process, or an I/O error occurs. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + A row cannot be parsed using the specified format. The exception message specifies the line causing the exception, while the property is assigned the text contained in the line. + The user lacks necessary permissions to view the path. + + + Opens a object to read from a file. + + object to read from the file + File to be read. + The file name ends with a backslash (\). + The specified file cannot be found. + The user lacks necessary permissions to read from the file. + 1 + + + + + + Opens a object to read from a file. + + object to read from the file + File to be read. + The encoding to use for the file contents. Default is ASCII. + The file name ends with a backslash (\). + The specified file cannot be found. + The user lacks necessary permissions to read from the file. + 1 + + + + + + Opens a object to write to the specified file. + + object to write to the specified file. + File to be written to. + True to append to the contents of the file; False to overwrite the contents of the file. Default is False. + The file name ends with a trailing slash. + 1 + + + + + + Opens a to write to the specified file. + + object to write to the specified file. + File to be written to. + True to append to the contents in the file; False to overwrite the contents of the file. Default is False. + Encoding to be used in writing to the file. Default is ASCII. + The file name ends with a trailing slash. + 1 + + + + + + Returns the contents of a file as a byte array. + Byte array containing the contents of the file. + File to be read. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\); it ends with a trailing slash. + + is Nothing. + The file does not exist. + The file is in use by another process, or an I/O error occurs. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + There is not enough memory to write the string to buffer. + The user lacks necessary permissions to view the path. + 1 + + + + + + Returns the contents of a text file as a String. + String containing the contents of the file. + Name and path of the file to read. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\); it ends with a trailing slash. + + is Nothing. + The file does not exist. + The file is in use by another process, or an I/O error occurs. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + There is not enough memory to write the string to buffer. + The user lacks necessary permissions to view the path. + 1 + + + + + + Returns the contents of a text file as a String. + String containing the contents of the file. + Name and path of the file to read. + Character encoding to use in reading the file. Default is UTF-8. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\); it ends with a trailing slash. + + is Nothing. + The file does not exist. + The file is in use by another process, or an I/O error occurs. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + There is not enough memory to write the string to buffer. + The user lacks necessary permissions to view the path. + 1 + + + + + + Renames a directory. + Path and name of directory to be renamed. + New name for directory. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + contains path information. + + is Nothing.-or- is Nothing or an empty string. + The directory does not exist. + There is an existing file or directory with the name specified in . + The path exceeds 248 characters. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + The user does not have required permission. + 1 + + + + + + Renames a file. + File to be renamed. + New name of file. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + contains path information or ends with a backslash (\). + + is Nothing.-or- is Nothing or an empty string. + The directory does not exist. + There is an existing file or directory with the name specified in . + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + The user does not have required permission. + 1 + + + + + + Writes data to a binary file. + Path and name of the file to be written to. + Data to be written to the file. + True to append to the file contents; False to overwrite the file contents. Default is False. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\); it ends with a trailing slash. + + is Nothing. + The file does not exist. + The file is in use by another process, or an I/O error occurs. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + There is not enough memory to write the string to buffer. + The user lacks necessary permissions to view the path. + 1 + + + + + + Writes text to a file. + File to be written to. + Text to be written to file. + True to append to the contents of the file; False to overwrite the contents of the file. Default is False. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\); it ends with a trailing slash. + + is Nothing. + The file does not exist. + The file is in use by another process, or an I/O error occurs. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + There is not enough memory to write the string to buffer. + The user lacks necessary permissions to view the path. + 1 + + + + + + Writes text to a file. + File to be written to. + Text to be written to file. + True to append to the contents of the file; False to overwrite the contents of the file. Default is False. + What encoding to use when writing to file. Default is UTF-8. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\); it ends with a trailing slash. + + is Nothing. + The file does not exist. + The file is in use by another process, or an I/O error occurs. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + There is not enough memory to write the string to buffer. + The user lacks necessary permissions to view the path. + 1 + + + + + + The exception that is thrown when the method cannot parse a row using the specified format. + 1 + + + Initializes a new instance of the class. + + + Initializes a new instance of the class with serialized data. + The object that holds the serialized object data about the exception being thrown. + The structure that contains contextual information about the source or destination. + + + Initializes a new instance of the class with a specified error message. + A message that describes the error. + + + Initializes a new instance of the class with a specified error message and a reference to the inner exception that is the cause of this exception. + A describing the error. + The object that is the cause of the current exception. If the parameter is not a null reference (Nothing in Visual Basic), the current exception is raised in a catch block that handles the inner exception. + + + Initializes a new instance of the class with a specified error message and a line number. + The message for the exception. + The line number of the malformed line. + + + Initializes a new instance of the class with a specified error message, a line number, and a reference to the inner exception that is the cause of this exception. + The message for the exception. + The line number of the malformed line. + The that is the cause of the current exception. If the parameter is not a null reference (Nothing in Visual Basic), the current exception is raised in a catch block that handles the inner exception. + + + Sets the object with information about the exception. + The object that holds the serialized object data about the exception being thrown. + The structure that contains contextual information about the source or destination. + 1 + + + + + + + Gets the line number of the malformed line. + The line number of the malformed line. + 1 + + + Creates and returns a string representation of the current exception. + A string representation of the current exception. + 1 + + + + + + Specifies whether a file should be deleted permanently or placed in the Recycle Bin. + + + Delete the file or directory permanently. Default. + + + Send the file or directory to the Recycle Bin. + + + Specifies whether to search all or only top-level directories. + + + Search only the specified directory and exclude subdirectories. + + + Search the specified directory and all subdirectories within it. Default. + + + Provides properties for accessing commonly referenced directories. + 1 + + + Returns an instance of the class. + + + Gets a path name pointing to the Application Data directory for the all users. + The path to the Application Data directory for the all users. + Controls access to system and user environment variables. Associated enumeration: . + The path is empty, usually because the operating system does not support the directory. + 1 + + + + + + Gets a path name pointing to the Application Data directory for the current user. + The path to the Application Data directory for the current user. + The path is empty, usually because the operating system does not support the directory. + 1 + + + + + + Gets a path name pointing to the Desktop directory. + The path to the Desktop directory. + The path is empty, usually because the operating system does not support the directory. + 1 + + + + + + Gets a path name pointing to the My Documents directory. + The path to the My Documents directory. + The path is empty, usually because the operating system does not support the directory. + 1 + + + + + + Gets a path name pointing to the My Music directory. + The path to the My Music directory. + The path is empty, usually because the operating system does not support the directory. + 1 + + + + + + Gets a path name pointing to the My Pictures directory. + The path to the My Pictures directory. + The path is empty, usually because the operating system does not support the directory. + 1 + + + + + + Gets a path pointing to the Program Files directory. + The path to the Program Files directory. + The path is empty, usually because the operating system does not support the directory. + + + Gets a path name pointing to the Programs directory. + The path to the Programs directory. + The path is empty, usually because the operating system does not support the directory. + 1 + + + + + + Gets a path name pointing to the Temp directory. + The path to the Temp directory. + The path is empty, usually because the operating system does not support the directory. + 1 + + + + + + + Provides methods and properties for parsing structured text files. + 1 + + + Initializes a new instance of the TextFieldParser class. + + . The stream to be parsed. + + is Nothing. + + cannot be read from. + + + Initializes a new instance of the TextFieldParser class. + + . The stream to be parsed. + + . The character encoding to use if encoding is not determined from file. Default is . + + or is Nothing. + + cannot be read from. + + + Initializes a new instance of the TextFieldParser class. + + . The stream to be parsed. + + . The character encoding to use if encoding is not determined from file. Default is . + Boolean. Indicates whether to look for byte order marks at the beginning of the file. Default is True. + + or is Nothing. + + cannot be read from. + + + Initializes a new instance of the TextFieldParser class. + + . The stream to be parsed. + + . The character encoding to use if encoding is not determined from file. Default is . + Boolean. Indicates whether to look for byte order marks at the beginning of the file. Default is True. + Boolean. Indicates whether to leave open when the TextFieldParser object is closed. Default is False. + + or is Nothing. + + cannot be read from. + + + Initializes a new instance of the TextFieldParser class. + + . The stream to be parsed. + + is Nothing. + + + Initializes a new instance of the TextFieldParser class. + String. The complete path of the file to be parsed. + + is an empty string. + + + Initializes a new instance of the TextFieldParser class. + String. The complete path of the file to be parsed. + + . The character encoding to use if encoding is not determined from file. Default is . + + is an empty string or is Nothing. + + + Initializes a new instance of the TextFieldParser class. + String. The complete path of the file to be parsed. + + . The character encoding to use if encoding is not determined from file. Default is . + Boolean. Indicates whether to look for byte order marks at the beginning of the file. Default is True. + + is an empty string or is Nothing. + + + Closes the current TextFieldParser object. + 1 + + + Defines comment tokens. A comment token is a string that, when placed at the beginning of a line, indicates that the line is a comment and should be ignored by the parser. + A string array that contains all of the comment tokens for the object. + A comment token includes white space. + 1 + + + Defines the delimiters for a text file. + A string array that contains all of the field delimiters for the object. + A delimiter value is set to a newline character, an empty string, or Nothing. + 1 + + + Releases resources used by the object. + + + Releases resources used by the object. + Boolean. True releases both managed and unmanaged resources; False releases only unmanaged resources. + + + Returns True if there are no non-blank, non-comment lines between the current cursor position and the end of the file. + True if there is no more data to read; otherwise, False. + 1 + + + + + + Returns the line that caused the most recent exception. + The line that caused the most recent exception. + 1 + + + Returns the number of the line that caused the most recent exception. + The number of the line that caused the most recent exception. + 1 + + + Denotes the width of each column in the text file being parsed. + An integer array that contains the width of each column in the text file that is being parsed. + A width value in any location other than the last entry of the array is less than or equal to zero. + 1 + + + Allows the object to attempt to free resources and perform other cleanup operations before it is reclaimed by garbage collection. + + + Denotes whether fields are enclosed in quotation marks when a delimited file is being parsed. + True if fields are enclosed in quotation marks; otherwise, False. + 1 + + + Returns the current line number, or returns -1 if no more characters are available in the stream. + The current line number. + 1 + + + Reads the specified number of characters without advancing the cursor. + A string that contains the specified number of characters read. + Int32. Number of characters to read. Required. + + is less than 0. + 1 + + + + + + Reads all fields on the current line, returns them as an array of strings, and advances the cursor to the next line containing data. + An array of strings that contains field values for the current line. + A field cannot be parsed by using the specified format. + 1 + + + + + + Returns the current line as a string and advances the cursor to the next line. + The current line from the file or stream. + 1 + + + Reads the remainder of the text file and returns it as a string. + The remaining text from the file or stream. + 1 + + + Sets the delimiters for the reader to the specified values, and sets the field type to Delimited. + Array of type String. + A delimiter is zero-length. + + + Sets the delimiters for the reader to the specified values. + Array of Integer. + + + Indicates whether the file to be parsed is delimited or fixed-width. + A value that indicates whether the file to be parsed is delimited or fixed-width. + 1 + + + Indicates whether leading and trailing white space should be trimmed from field values. + True if leading and trailing white space should be trimmed from field values; otherwise, False. + 1 + + + Specifies whether an exception is thrown if the user clicks Cancel during an operation. + 1 + + + Do nothing when the user clicks Cancel. + + + Throw an exception when the user clicks Cancel. + + + Specifies which dialog boxes to show when copying, deleting, or moving files or directories. + + + Only show error dialog boxes and hide progress dialog boxes. Default. + + + Show progress dialog box and any error dialog boxes. + + + Provides a property and methods for writing event and exception information to the application's log listeners. + + + Initializes a new instance of the class. + + + Initializes a new instance of the class. + + . The name to give to the property object. + + + Creates a new and adds it to the collection. + + + Determines what to do when the object attempts to write to a log and there is less free disk space available than specified by the property. + 1 + + + Throw an exception. + + + Discard log messages. + + + Provides a simple listener that directs logging output to file. + 1 + + + Initializes a new instance of the class with the default name. + + + Initializes a new instance of the class with the supplied name. + String. The name of the instance object. + + + Determines whether to append the output to the current file or write it to a new file. + Boolean, with True indicating that the output is appended to the current file, and False indicating that output is written to a new file. The default setting for this property is True. + 1 + + + + + + + Indicates whether or not the writing to the log file stream flushes the buffer. + Boolean, with True indicating that the stream is flushed after every write; otherwise the log entries are buffered and written more efficiently. The default setting for this property is False. + 1 + + + + + + + Gets or sets the base name for the log files, which is used to create the full log-file name. + String. The base name for the log files. The default is the application's product name. + 1 + + + + + + Closes the underlying stream for the current log file and releases any resources associated with the current stream. + 1 + + + Gets or sets the log file directory when the property is set to . + String, which is the name of the log-file directory. The default setting for this property is the user's directory for application data. + 1 + + + + + + Gets or sets the delimiter used to delimit fields within a log message. + String, which is the delimiter used for fields within a log message. The default setting for this property is the TAB character. + 1 + + + Determines what to do when writing to the log file and there is less free disk space available than specified by the property. + + . Determines what to do when attempting to write to the log file and there is less free disk space available than specified by the property, or if the log file size is greater than what the property allows. The default value is . + 1 + + + + + + + Closes the underlying stream and optionally releases the managed resources. + True releases both managed and unmanaged resources; False releases only unmanaged resources. + + + Gets or sets the encoding to use when creating a new log file. + + , which is the encoding to use when creating a new log file. The default value of this property is . + 1 + + + Flushes the underlying stream that writes to the current log file. + 1 + + + Gets the current full log-file name. + String, which is the current full log-file name. + 1 + + + + + + + Gets the custom XML configuration attributes supported by the trace listener. + String array containing the XML configuration attributes recognized by this listener. + + + Indicates whether or not the host name of the logging machine should be included in the output. + Boolean. Use True if the host identifier should be included; otherwise use False. The default value is False. + 1 + + + + + + + Gets or sets location for the log files. + + , which is the location for the log file. The default value is . + 1 + + + Determines which date to include in the names of the log files. + + . This indicates which date to include in the log-file names. The default value is . + + + Gets or sets the maximum allowed size of the log file, in bytes. + Long. This is the maximum allowed log-file size, in bytes. The default value is 5000000. + When this property is set to a value less than 1000. + 1 + + + + + + + Gets or sets the amount of free disk space, in bytes, necessary before messages can be written to the log file. + Long. This is the amount of free disk space necessary. The default value is 10000000. + When this property is set to a value less than 0. + 1 + + + + + + + Writes trace information, a data object, and event information to the output file or stream. + A object that contains the current process ID, thread ID, and stack trace information. + A name of the trace source that invoked this method. + One of the enumeration values. + A numeric identifier for the event. + The trace data to emit. + + + Writes trace information, an array of data objects, and event information to the output file or stream. + A object that contains the current process ID, thread ID, and stack trace information. + The name of the trace source that invoked this method. + One of the enumeration values. + A numeric identifier for the event. + An array of objects to emit as data. + + + Writes trace information, a message and event information to the output file or stream. + A object that contains the current process ID, thread ID, and stack trace information. + A name of the trace source that invoked this method. + One of the enumeration values. + A numeric identifier for the event. + A message to write. + 1 + + + + + + + + Writes trace information, a formatted array of objects, and event information to the output file or stream. + A object that contains the current process ID, thread ID, and stack trace information. + A name of the trace source that invoked this method. + One of the enumeration values. + A numeric identifier for the event. + A format string that contains zero or more format items, which correspond to objects in the array. + An Object array containing zero or more objects to format. + 1 + + + + + + + + Writes a verbatim message to disk, without any additional context information. + String. The custom message to write. + 1 + + + + + + + + Writes a verbatim message to disk, followed by the current line terminator, without any additional context information. + String. The custom message to write. + 1 + + + + + + + + Provides a property and methods for writing event and exception information to the application's log listeners. + 1 + + + Initializes a new instance of the class. + + + Initializes a new instance of the class. + + . The name to give to the property object. + + + Gets the file the object that underlies the Log object. + Returns the object that underlies the Log object. + 2 + + + Creates a new object and adds it to the collection. + + + Gets to the object that underlies the Log object. + Returns the object that underlies the Log object. + 2 + + + Writes a message to the application's log listeners. + Required. The message to log. If is Nothing, an empty string is used. + Code with partial trust calls the method, but writes to an event log listener that requires full trust. + 1 + + + + + + + + Writes a message to the application's log listeners. + Required. The message to log. If is Nothing, an empty string is used. + The type of message. By default, TraceEventType.Information. + The message type is not one of the enumeration values. + Code with partial trust calls the method, but writes to an event log listener that requires full trust. + 1 + + + + + + + + Writes a message to the application's log listeners. + Required. The message to log. If is Nothing, an empty string is used. + The type of message. By default, TraceEventType.Information. + Message identifier, typically used for correlation. By default, related to as described in the table. + The message type is not one of the enumeration values. + Code with partial trust calls the method, but writes to an event log listener that requires full trust. + 1 + + + + + + + + Writes exception information to the application's log listeners. + Required. Exception to log. + + is Nothing. + Code with partial trust calls the method, but writes to an event log listener that requires full trust. + + + Writes exception information to the application's log listeners. + Required. Exception to log. + The type of message. By default, . + String to append to the message. By default, this is an empty string. + + is Nothing. + The message type is not one of the enumeration values. + Code with partial trust calls the method, but writes to an event log listener that requires full trust. + + + Writes exception information to the application's log listeners. + Required. Exception to log. + The type of message. By default, . + String to append to the message. By default, this is an empty string. + Message identifier, typically used for correlation. By default, related to as described in the table in the Remarks section. + + is Nothing. + The message type is not one of the enumeration values. + Code with partial trust calls the method, but writes to an event log listener that requires full trust. + + + Determines which date to include in the names of the class log files. + + + Do not include the date in the log file name. + + + Include the current date in the log file name. + + + Include the first day of the current week in the log file name. + + + Determines which predefined path the class uses to write its log files. + 1 + + + Use the path of the current system's temporary folder. + + + Use the path for a user's application data. + + + Use the path for the application data that is shared among all users. + + + Use the path for the executable file that started the application. + + + If the string specified by is not empty, then use it as the path. Otherwise, use the path for a user's application data. + + + Provides methods for manipulating the Clipboard. + 2 + + + Clears the Clipboard. + 1 + + + Indicates whether the Clipboard contains audio data. + True if audio data is stored on the Clipboard; otherwise False. + 1 + + + + + + + + Indicates whether the Clipboard contains data in the specified custom format. + True if data in the specified custom format is stored on the Clipboard; otherwise False. + String. Name of the custom format to be checked. Required. + 1 + + + + + + + + Returns a Boolean indicating whether the Clipboard contains a file drop list. + True if a file drop list is stored on the Clipboard; otherwise False. + 1 + + + + + + + + Returns a Boolean indicating whether an image is stored on the Clipboard. + True if an image is stored on the Clipboard; otherwise False. + 1 + + + + + + + + Determines if there is text on the Clipboard. + True if the Clipboard contains text; otherwise False. + 1 + + + + + + + + Determines if there is text on the Clipboard. + True if the Clipboard contains text; otherwise False. + + . If specified, identifies what text format to be checked for. Required. + 1 + + + + + + + + Retrieves an audio stream from the Clipboard. + A object containing audio data or Nothing if the Clipboard does not contain any audio data. + 1 + + + + + + + + Retrieves data in a custom format from the Clipboard. + An Object representing the Clipboard data or Nothing if the Clipboard does not contain any data that is in the specified format or can be converted to that format. + String. Name of the data format. Required. + 1 + + + + + + + + Retrieves data from the Clipboard as an . + An object that represents the data currently on the Clipboard, or Nothing if there is no data on the Clipboard. + 1 + + + + + + + + Retrieves a collection of strings representing file names from the Clipboard. + A containing file names or Nothing if the Clipboard does not contain any data that is in the format or can be converted to that format. + 1 + + + + + + + + Retrieves an image from the Clipboard. + An representing the Clipboard image data or Nothing if the Clipboard does not contain any data that is in the format or can be converted to that format. + 1 + + + + + + + + Retrieves text from the Clipboard. + The Clipboard text data or an empty string if the Clipboard does not contain data in the or format, depending on the operating system. + 1 + + + + + + + + Retrieves text from the Clipboard. + The Clipboard text data or an empty string if the Clipboard does not contain data in the specified format. + + . If specified, identifies what text format should be retrieved. Default is . Required. + 1 + + + + + + + + Writes audio data to the Clipboard. + Byte array. Audio data to be written to the Clipboard. Required. + 1 + + + Writes audio data to the Clipboard. + + Audio data to be written to the clipboard. Required. + 1 + + + Writes data in a custom format to the Clipboard. + String. Format of data. Required. + Object. Data object to be written to the Clipboard. Required. + 1 + + + Writes a to the Clipboard. + + . Data object to be written to the Clipboard. Required. + 1 + + + Writes a collection of strings representing file paths to the Clipboard. + + . List of file names. Required. + 1 + + + Writes an image to the Clipboard. + + . Image to be written. Required. + 1 + + + Writes text to the Clipboard. + String. Text to be written. Required. + + is an empty string. + + is Nothing. + 1 + + + Writes text to the Clipboard. + String. Text to be written. Required. + + . Format to be used when writing text. Default is . Required. + + is an empty string. + + is Nothing. + 1 + + + Provides properties and methods for working with drives, files, and directories. + 2 + + + Combines two paths and returns a properly formatted path. + The combination of the specified paths. + String. First path to be combined. + String. Second path to be combined. + + or are malformed paths. + 1 + + + + + + Copies a directory to another directory. + The directory to be copied. + The location to which the directory should be copied. + The new name specified for the directory contains a colon (:) or slash (\ or /). + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + or is Nothing or an empty string. + The source directory does not exist. + The source directory is a root directory + The combined path points to an existing file. + The source path and target path are the same. + The operation is cyclic. + The path exceeds the system-defined maximum length. + A folder name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + A destination file exists but cannot be accessed. + 1 + + + + + + + + Copies a directory to another directory. + The directory to be copied. + The location to which the directory should be copied. + Whether to visually track the operation's progress. Default is UIOption.OnlyErrorDialogs. + The new name specified for the directory contains a colon (:) or slash (\ or /). + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + or is Nothing or an empty string. + The source directory does not exist. + The source directory is a root directory + The combined path points to an existing file. + The source path and target path are the same. + The operation is cyclic. + The path exceeds the system-defined maximum length. + A folder name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + A destination file exists but cannot be accessed. + + is set to UIOption.AllDialogs and the user cancels the operation, or one or more files in the directory cannot be copied. + + + Copies a directory to another directory. + The directory to be copied. + The location to which the directory should be copied. + Whether to visually track the operation's progress. Default is UIOption.OnlyErrorDialogs. + Specifies what should be done if the user clicks Cancel during the operation. Default is . + The new name specified for the directory contains a colon (:) or slash (\ or /). + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + or is Nothing or an empty string. + The source directory does not exist. + The source directory is a root directory + The combined path points to an existing file. + The source path and target path are the same. + The operation is cyclic. + The path exceeds the system-defined maximum length. + A folder name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + A destination file exists but cannot be accessed. + + is set to UIOption.AllDialogs and the user cancels the operation, or one or more files in the directory cannot be copied. + + + Copies a directory to another directory. + The directory to be copied. + The location to which the directory should be copied. + True to overwrite existing files; otherwise False. Default is False. + The new name specified for the directory contains a colon (:) or slash (\ or /). + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + or is Nothing or an empty string. + The source directory does not exist. + The source directory is a root directory + The combined path points to an existing file. + The source path and target path are the same. + The operation is cyclic. + The path exceeds the system-defined maximum length. + A folder name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + A destination file exists but cannot be accessed. + 1 + + + + + + + + Copies a file to a new location. + The file to be copied. + The location to which the file should be copied. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + The system could not retrieve the absolute path. + + contains path information. + + or is Nothing or an empty string. + The source file is not valid or does not exist. + The combined path points to an existing directory. + The user does not have sufficient permissions to access the file. + A file in the target directory with the same name is in use. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The path exceeds the system-defined maximum length. + The user does not have required permission. + The user lacks necessary permissions to view the path. + 1 + + + + + + + + Copies a file to a new location. + The file to be copied. + The location to which the file should be copied. + Whether to visually track the operation's progress. Default is UIOption.OnlyErrorDialogs. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + The system could not retrieve the absolute path. + + contains path information. + + or is Nothing or an empty string. + The source file is not valid or does not exist. + The combined path points to an existing directory. + The user does not have sufficient permissions to access the file. + A file in the target directory with the same name is in use. + The destination file exists and is set to False. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The path exceeds the system-defined maximum length. + The user does not have required permission. + The user lacks necessary permissions to view the path. + + + Copies a file to a new location. + The file to be copied. + The location to which the file should be copied. + Whether to visually track the operation's progress. Default is UIOption.OnlyErrorDialogs. + Specifies what should be done if the user clicks Cancel during the operation. Default is . + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + The system could not retrieve the absolute path. + + contains path information. + + or is Nothing or an empty string. + The source file is not valid or does not exist. + The combined path points to an existing directory. + The user does not have sufficient permissions to access the file. + A file in the target directory with the same name is in use. + The destination file exists and is set to False. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The path exceeds the system-defined maximum length. + The user does not have required permission. + The user lacks necessary permissions to view the path. + + is set to ThrowException, and the user has canceled the operation or an unspecified I/O error occurs. + + + Copies a file to a new location. + The file to be copied. + The location to which the file should be copied. + True if existing files should be overwritten; otherwise False. Default is False. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + The system could not retrieve the absolute path. + + contains path information. + + or is Nothing or an empty string. + The source file is not valid or does not exist. + The combined path points to an existing directory. + The user does not have sufficient permissions to access the file. + A file in the target directory with the same name is in use. + The destination file exists and is set to False. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The path exceeds the system-defined maximum length. + The user does not have required permission. + The user lacks necessary permissions to view the path. + 1 + + + + + + + + Creates a directory. + Name and location of the directory. + The directory name is malformed. For example, it contains illegal characters or is only white space. + + is Nothing or an empty string. + The directory name is too long. + The directory name is only a colon (:). + The parent directory of the directory to be created is read-only + The user does not have permission to create the directory. + 1 + + + + + + Gets or sets the current directory. + The current directory for file I/O operations. + The path is not valid. + The user lacks necessary permissions. + 1 + + + + + + + Deletes a directory. + Directory to be deleted. + Specifies what should be done when a directory that is to be deleted contains files or directories. Default is DeleteDirectoryOption.DeleteAllContents. + The path is a zero-length string, is malformed, contains only white space, or contains invalid characters (including wildcard characters). The path is a device path (starts with \\.\). + + is Nothing or an empty string. + The directory does not exist or is a file. + The directory is not empty, and is set to ThrowIfDirectoryNonEmpty. + The user does not have permission to delete the directory or subdirectory. + A file in the directory or subdirectory is in use. + The directory name contains a colon (:). + The path exceeds the system-defined maximum length. + The user does not have required permissions. + The user cancels the operation or the directory cannot be deleted. + 1 + + + + + + + + Deletes a directory. + Directory to be deleted. + Specifies whether to visually track the operation's progress. Default is UIOption.OnlyErrorDialogs. + Specifies whether or not the deleted file should be sent to the Recycle Bin. Default is RecycleOption.DeletePermanently. + The path is a zero-length string, is malformed, contains only white space, or contains invalid characters (including wildcard characters). The path is a device path (starts with \\.\). + + is Nothing or an empty string. + The directory does not exist or is a file. + The directory is not empty, and is set to ThrowIfDirectoryNonEmpty. + The user does not have permission to delete the directory or subdirectory. + A file in the directory or subdirectory is in use. + The directory name contains a colon (:). + The path exceeds the system-defined maximum length. + The user does not have required permissions. + The user cancels the operation or the directory cannot be deleted. + 1 + + + + + + + + Deletes a directory. + Directory to be deleted. + Specifies whether to visually track the operation's progress. Default is UIOption.OnlyErrorDialogs. + Specifies whether or not the deleted file should be sent to the Recycle Bin. Default is RecycleOption.DeletePermanently. + Specifies whether to throw an exception if the user clicks Cancel. + The path is a zero-length string, is malformed, contains only white space, or contains invalid characters (including wildcard characters). The path is a device path (starts with \\.\). + + is Nothing or an empty string. + The directory does not exist or is a file. + The directory is not empty, and is set to ThrowIfDirectoryNonEmpty. + The user does not have permission to delete the directory or subdirectory. + A file in the directory or subdirectory is in use. + The directory name contains a colon (:). + The path exceeds the system-defined maximum length. + The user does not have required permissions. + The user cancels the operation or the directory cannot be deleted. + 1 + + + + + + + + Deletes a file. + Name and path of the file to be deleted. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; it has a trailing slash where a file must be specified; or it is a device path (starts with \\.\). + + is Nothing or an empty string. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The file is in use. + The user lacks necessary permissions to view the path. + The file does not exist. + The user does not have permission to delete the file or the file is read-only. + 1 + + + + + + + + Deletes a file. + Name and path of the file to be deleted. + Whether to visually track the operation's progress. Default is UIOption.OnlyErrorDialogs. + Whether or not the deleted file should be sent to the Recycle Bin. Default is RecycleOption.DeletePermanently. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; it has a trailing slash where a file must be specified; or it is a device path (starts with \\.\). + + is Nothing or an empty string. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The file is in use. + The user lacks necessary permissions to view the path. + The file does not exist. + The user does not have permission to delete the file or the file is read-only. + + + Deletes a file. + Name and path of the file to be deleted. + Whether to visually track the operation's progress. Default is UIOption.OnlyErrorDialogs. + Whether or not the deleted file should be sent to the Recycle Bin. Default is RecycleOption.DeletePermanently. + Specifies whether or not an exception is thrown when the user cancels the operation. Default is UICancelOption.ThrowException. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; it has a trailing slash where a file must be specified; or it is a device path (starts with \\.\). + + is Nothing or an empty string. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The file is in use. + The user lacks necessary permissions to view the path. + The file does not exist. + The user does not have permission to delete the file or the file is read-only. + The user cancelled the operation and is set to . + + + Returns True if the specified directory exists. + True if the directory exists; otherwise False. + Path of the directory. + 1 + + + + + + Returns a read-only collection of all available drive names. + A read-only collection of all available drives as objects. + 1 + + + + + + Returns True if the specified file exists. + Returns True if the file exists; otherwise this method returns False. + Name and path of the file. + The name of the file ends with a backslash (\). + 1 + + + + + + Returns a read-only collection of strings representing the names of files containing the specified text. + Read-only collection of the names of files containing the specified text.. + The directory to be searched. + The search text. + True if the search should be case-sensitive; otherwise False. Default is True. + Whether to include subfolders. Default is SearchOption.SearchTopLevelOnly. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + is Nothing or an empty string. + The specified directory does not exist. + The specified directory points to an existing file. + The path exceeds the system-defined maximum length. + The specified directory path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + The user lacks necessary permissions. + + + + 1 + + + Returns a read-only collection of strings representing the names of files containing the specified text. + Read-only collection of the names of files containing the specified text.. + The directory to be searched. + The search text. + True if the search should be case-sensitive; otherwise False. Default is True. + Whether to include subfolders. Default is SearchOption.SearchTopLevelOnly. + Pattern to be matched. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + is Nothing or an empty string. + The specified directory does not exist. + The specified directory points to an existing file. + The path exceeds the system-defined maximum length. + The specified directory path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + The user lacks necessary permissions. + + + + 1 + + + Returns a collection of strings representing the path names of subdirectories within a directory. + Read-only collection of the path names of subdirectories within the specified directory.. + Name and path of directory. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + is Nothing or an empty string. + The specified directory does not exist. + The specified directory points to an existing file. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + The user lacks necessary permissions. + 1 + + + + + + Returns a collection of strings representing the path names of subdirectories within a directory. + Read-only collection of the path names of subdirectories within the specified directory. + Name and path of directory. + Whether to include subfolders. Default is SearchOption.SearchTopLevelOnly. + Pattern to match names. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + is Nothing or an empty string. + One or more of the specified wildcard characters is Nothing, an empty string, or contains only spaces. + The specified directory does not exist. + The specified directory points to an existing file. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + The user lacks necessary permissions. + 1 + + + + + + Returns a object for the specified path. + + object for the specified path. + String. Path of directory. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + is Nothing or an empty string. + The path exceeds the system-defined maximum length. + The directory path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path + 1 + + + + + + Returns a object for the specified drive. + + object for the specified drive. + Drive to be examined. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + is Nothing or an empty string. + The path exceeds the system-defined maximum length. + The user lacks necessary permissions to view the path + 1 + + + + + + Returns a object for the specified file. + + object for the specified file + Name and path of the file. + The path name is malformed. For example, it contains invalid characters or is only white space. The file name has a trailing slash mark. + + is Nothing or an empty string. + The path contains a colon in the middle of the string. + The path is too long. + The user lacks necessary permissions. + The user lacks ACL (access control list) access to the file. + 1 + + + + + + Returns a read-only collection of strings representing the names of files within a directory. + Read-only collection of file names from the specified directory. + Directory to be searched. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + is Nothing. + The directory to search does not exist. + + points to an existing file. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + The user lacks necessary permissions. + 1 + + + + + + Returns a read-only collection of strings representing the names of files within a directory. + Read-only collection of file names from the specified directory. + Directory to be searched. + Whether to include subfolders. Default is SearchOption.SearchTopLevelOnly. + Pattern to be matched. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + is Nothing. + The directory to search does not exist. + + points to an existing file. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + The user lacks necessary permissions. + 1 + + + + + + Parses the file name out of the path provided. + The file name from the specified path. + Required. Path to be parsed. String. + + + Returns the parent path of the provided path. + The parent path of the provided path. + Path to be examined. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + Path does not have a parent path because it is a root path. + + is Nothing. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + 1 + + + + + + Creates a uniquely named zero-byte temporary file on disk and returns the full path of that file. + String containing the full path of the temporary file. + 1 + + + + + + + Moves a directory from one location to another. + Path of the directory to be moved. + Path of the directory to which the source directory is being moved. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + or is Nothing or an empty string. + + or is Nothing or an empty string. + The directory does not exist. + The source is a root directory or The source path and the target path are the same. + The path exceeds the system-defined maximum length. + The operation is cyclic. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + The user does not have required permission. + 1 + + + + + + + + Moves a directory from one location to another. + Path of the directory to be moved. + Path of the directory to which the source directory is being moved. + Specifies whether to visually track the operation's progress. Default is UIOption.OnlyErrorDialogs. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + or is Nothing or an empty string. + + or is Nothing or an empty string. + The directory does not exist. + The source is a root directory or The source path and the target path are the same. + The target directory already exists and o is set to False. + The path exceeds the system-defined maximum length. + The operation is cyclic. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + The user does not have required permission. + + + Moves a directory from one location to another. + Path of the directory to be moved. + Path of the directory to which the source directory is being moved. + Specifies whether to visually track the operation's progress. Default is UIOption.OnlyErrorDialogs. + Specifies whether or not an exception is thrown when the user cancels the operation. Default is UICancelOption.ThrowException. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + or is Nothing or an empty string. + + or is Nothing or an empty string. + The directory does not exist. + The source is a root directory or The source path and the target path are the same. + The target directory already exists and o is set to False. + + is set to ThrowException and a subdirectory of the file cannot be copied. + + is set to ThrowException, and the user cancels the operation, or the operation cannot be completed. + + is set to ThrowException, and the user lacks necessary permissions. + The path exceeds the system-defined maximum length. + The operation is cyclic. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + The user does not have required permission. + + + Moves a directory from one location to another. + Path of the directory to be moved. + Path of the directory to which the source directory is being moved. + True if existing directories should be overwritten; otherwise False. Default is False. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + or is Nothing or an empty string. + + or is Nothing or an empty string. + The directory does not exist. + The source is a root directory or The source path and the target path are the same. + The target directory already exists and o is set to False. + The path exceeds the system-defined maximum length. + The operation is cyclic. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + The user does not have required permission. + 1 + + + + + + + + Moves a file to a new location. + Path of the file to be moved. + Path of the directory into which the file should be moved. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\); it ends with a trailing slash. + + is Nothing or an empty string. + The source file is not valid or does not exist. + The file is in use by another process, or an I/O error occurs. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + 1 + + + + + + + + Moves a file to a new location. + Path of the file to be moved. + Path of the directory into which the file should be moved. + Specifies whether to visually track the operation's progress. Default is UIOption.OnlyErrorDialogs. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\); it ends with a trailing slash. + + is Nothing or an empty string. + The source file is not valid or does not exist. + The destination file exists and is set to False. + The file is in use by another process, or an I/O error occurs. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + + + Moves a file to a new location. + Path of the file to be moved. + Path of the directory into which the file should be moved. + Specifies whether to visually track the operation's progress. Default is UIOption.OnlyErrorDialogs. + Specifies whether or not an exception is thrown when the user cancels the operation. Default is UICancelOption.ThrowException. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\); it ends with a trailing slash. + + is Nothing or an empty string. + The source file is not valid or does not exist. + The destination file exists and is set to False. + The file is in use by another process, or an I/O error occurs. + + is set to ThrowException, and either the user has cancelled the operation or an unspecified I/O error occurs. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + + + Moves a file to a new location. + Path of the file to be moved. + Path of the directory into which the file should be moved. + True to overwrite existing files; otherwise False. Default is False. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\); it ends with a trailing slash. + + is Nothing or an empty string. + The source file is not valid or does not exist. + The destination file exists and is set to False. + The file is in use by another process, or an I/O error occurs. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + 1 + + + + + + + + The OpenTextFieldParser method allows you to create a object, which provides a way to easily and efficiently parse structured text files, such as logs. The TextFieldParser object can be used to read both delimited and fixed-width files. + + to read the specified file. + The file to be opened with the TextFieldParser. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\); it ends with a trailing slash. + + is Nothing. + The file does not exist. + The file is in use by another process, or an I/O error occurs. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + A row cannot be parsed using the specified format. The exception message specifies the line causing the exception, while the property is assigned the text contained in the line. + The user lacks necessary permissions to view the path. + 1 + + + + + + + The OpenTextFieldParser method allows you to create a object, which provides a way to easily and efficiently parse structured text files, such as logs. The TextFieldParser object can be used to read both delimited and fixed-width files. + + to read the specified file. + The file to be opened with the TextFieldParser. + Widths of the fields. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\); it ends with a trailing slash. + + is Nothing. + The file does not exist. + The file is in use by another process, or an I/O error occurs. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + A row cannot be parsed using the specified format. The exception message specifies the line causing the exception, while the property is assigned the text contained in the line. + The user lacks necessary permissions to view the path. + + + The OpenTextFieldParser method allows you to create a object, which provides a way to easily and efficiently parse structured text files, such as logs. The TextFieldParser object can be used to read both delimited and fixed-width files. + + to read the specified file. + The file to be opened with the TextFieldParser. + Delimiters for the fields. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\); it ends with a trailing slash. + + is Nothing. + The file does not exist. + The file is in use by another process, or an I/O error occurs. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + A row cannot be parsed using the specified format. The exception message specifies the line causing the exception, while the property is assigned the text contained in the line. + The user lacks necessary permissions to view the path. + + + Opens a object to read from a file. + + object to read from the file + File to be read. + The file name ends with a backslash (\). + The specified file cannot be found. + The user lacks necessary permissions to read from the file. + 1 + + + + + + Opens a object to read from a file. + + object to read from the file + File to be read. + The encoding to use for the file contents. Default is ASCII. + The file name ends with a backslash (\). + The specified file cannot be found. + The user lacks necessary permissions to read from the file. + 1 + + + + + + Opens a object to write to the specified file. + + object to write to the specified file. + File to be written to. + True to append to the contents of the file; False to overwrite the contents of the file. Default is False. + The file name ends with a trailing slash. + 1 + + + + + + Opens a to write to the specified file. + + object to write to the specified file. + File to be written to. + True to append to the contents in the file; False to overwrite the contents of the file. Default is False. + Encoding to be used in writing to the file. Default is ASCII. + The file name ends with a trailing slash. + 1 + + + + + + Returns the contents of a file as a byte array. + Byte array containing the contents of the file. + File to be read. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\); it ends with a trailing slash. + + is Nothing. + The file does not exist. + The file is in use by another process, or an I/O error occurs. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + There is not enough memory to write the string to buffer. + The user lacks necessary permissions to view the path. + 1 + + + + + + Returns the contents of a text file as a String. + String containing the contents of the file. + Name and path of the file to read. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\); it ends with a trailing slash. + + is Nothing. + The file does not exist. + The file is in use by another process, or an I/O error occurs. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + There is not enough memory to write the string to buffer. + The user lacks necessary permissions to view the path. + 1 + + + + + + Returns the contents of a text file as a String. + String containing the contents of the file. + Name and path of the file to read. + Character encoding to use in reading the file. Default is UTF-8. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\); it ends with a trailing slash. + + is Nothing. + The file does not exist. + The file is in use by another process, or an I/O error occurs. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + There is not enough memory to write the string to buffer. + The user lacks necessary permissions to view the path. + 1 + + + + + + Renames a directory. + Path and name of directory to be renamed. + New name for directory. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + contains path information. + + is Nothing.-or- is Nothing or an empty string. + The directory does not exist. + There is an existing file or directory with the name specified in . + The path exceeds 248 characters. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + The user does not have required permission. + 1 + + + + + + Renames a file. + File to be renamed. + New name of file. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\). + + contains path information or ends with a backslash (\). + + is Nothing.-or- is Nothing or an empty string. + The file does not exist. + There is an existing file or directory with the name specified in . + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + The user lacks necessary permissions to view the path. + The user does not have required permission. + 1 + + + + + + Gets an object that provides properties for accessing commonly referenced directories. + This property returns the object for the computer. + 1 + + + Writes data to a binary file. + Path and name of the file to be written to. + Data to be written to the file. + True to append to the file contents; False to overwrite the file contents. Default is False. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\); it ends with a trailing slash. + + is Nothing. + The file does not exist. + The file is in use by another process, or an I/O error occurs. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + There is not enough memory to write the string to buffer. + The user lacks necessary permissions to view the path. + 1 + + + + + + Writes text to a file. + File to be written to. + Text to be written to file. + True to append to the contents of the file; False to overwrite the contents of the file. Default is False. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\); it ends with a trailing slash. + + is Nothing. + The file does not exist. + The file is in use by another process, or an I/O error occurs. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + There is not enough memory to write the string to buffer. + The user lacks necessary permissions to view the path. + 1 + + + + + + Writes text to a file. + File to be written to. + Text to be written to file. + True to append to the contents of the file; False to overwrite the contents of the file. Default is False. + What encoding to use when writing to file. Default is UTF-8. + The path is not valid for one of the following reasons: it is a zero-length string; it contains only white space; it contains invalid characters; or it is a device path (starts with \\.\); it ends with a trailing slash. + + is Nothing. + The file does not exist. + The file is in use by another process, or an I/O error occurs. + The path exceeds the system-defined maximum length. + A file or directory name in the path contains a colon (:) or is in an invalid format. + There is not enough memory to write the string to buffer. + The user lacks necessary permissions to view the path. + 1 + + + + + + Provides properties and methods for manipulating the registry. + 1 + + + Returns a type which provides access to HKEY_CLASSES_ROOT. + + + + 1 + + + Returns a type which provides access to HKEY_CURRENT_CONFIG. + + + + 1 + + + Returns a type which provides access to HKEY_CURRENT_USER. + + + + 1 + + + Returns a type, which provides access to HKEY_DYNDATA. + + + + 1 + + + Gets a value from a registry key. + Gets a value from a registry key. + String. Key from which the value is to be retrieved. Required. + String. Value to be retrieved. Required. + Object. Default value to be supplied if the value does not exist. Required. + The user does not have the permissions required to read from the registry key. + The that contains the specified value has been marked for deletion. + + does not begin with a valid registry root. + 1 + + + + + + + + + Returns a type, which provides access to HKEY_LOCAL_MACHINE. + + + + 1 + + + Returns a type, which provides access to HKEY_PERFORMANCE_DATA. + + + + 1 + + + Writes a value to a registry key. + String. Name of the key to be written to. Required. + String. Name of the value to be written. Required. + Object. Value to be written. Required. + + is Nothing. + + does not begin with a valid registry root.-or- is longer than the maximum length allowed (255 characters). + The is read-only and thus cannot be written to; for example, it is a root-level node, or it has not been opened with write access.. + The user does not have the permissions required to create or modify registry keys. + 1 + + + + + + + + Writes a value to a registry key. + String. Name of the key to be written to. Required. + String. Name of the value to be written. Required. + Object. Value to be written. Required. + + . Required. + + is Nothing. + + does not begin with a valid registry root.-or- is longer than the maximum length allowed (255 characters).-or- The type of does not match the registry data type specified by , therefore the data cannot be converted properly. + The is read-only, and thus cannot be written to; for example, it is a root-level node, or it has not been opened with write access. + The user does not have the permissions required to create or modify registry keys. + 1 + + + + + + + + Returns a type, which provides access to HKEY_USERS. + + + + 1 + + + Provides properties for accessing commonly referenced directories. + 2 + + + Gets a path name pointing to the Application Data directory for the all users. + The path to the Application Data directory for the all users. + The path is empty, usually because the operating system does not support the directory. + 1 + + + + + + Gets a path name pointing to the Application Data directory for the current user. + The path to the Application Data directory for the current user. + The path is empty, usually because the operating system does not support the directory. + 1 + + + + + + Gets a path name pointing to the Desktop directory. + The path to the Desktop directory. + The path is empty, usually because the operating system does not support the directory. + 1 + + + + + + Gets a path name pointing to the My Documents directory. + The path to the My Documents directory. + The path is empty, usually because the operating system does not support the directory. + 1 + + + + + + Gets a path name pointing to the My Music directory. + The path to the My Music directory. + The path is empty, usually because the operating system does not support the directory. + 1 + + + + + + Gets a path name pointing to the My Pictures directory. + The path to the My Pictures directory. + The path is empty, usually because the operating system does not support the directory. + 1 + + + + + + Gets a path pointing to the Program Files directory. + The path to the Program Files directory. + The path is empty, usually because the operating system does not support the directory. + 1 + + + + + + Gets a path name pointing to the Programs directory. + The path to the Programs directory. + The path is empty, usually because the operating system does not support the directory. + 1 + + + + + + Gets a path name pointing to the Temp directory. + The path to the Temp directory. + The path is empty, usually because the operating system does not support the directory. + 1 + + + + + + + This class supports My in Visual Basic. + The type of the object to store. + + + This class supports My in Visual Basic. + + + This property supports My in Visual Basic. + The value associated with this class. + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/MySql.Data.6.6.5/MySql.Data.6.6.5.nupkg b/TBF_V2/Sources/TBF/packages/MySql.Data.6.6.5/MySql.Data.6.6.5.nupkg new file mode 100644 index 00000000..feb8498f Binary files /dev/null and b/TBF_V2/Sources/TBF/packages/MySql.Data.6.6.5/MySql.Data.6.6.5.nupkg differ diff --git a/TBF_V2/Sources/TBF/packages/MySql.Data.6.6.5/MySql.Data.6.6.5.nuspec b/TBF_V2/Sources/TBF/packages/MySql.Data.6.6.5/MySql.Data.6.6.5.nuspec new file mode 100644 index 00000000..3f97b20b --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/MySql.Data.6.6.5/MySql.Data.6.6.5.nuspec @@ -0,0 +1,19 @@ + + + + MySql.Data + 6.6.5 + MySql.Data + Oracle Corporation + Oracle Corporation + http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + http://www.mysql.com/downloads/connector/net/ + http://www.mysql.com/common/logos/logo-mysql-110x57.png + false + Connector/Net is a fully-managed ADO.NET driver for MySQL. + + + + MySQL + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/MySql.Data.6.6.5/lib/net40/MySql.Data.dll b/TBF_V2/Sources/TBF/packages/MySql.Data.6.6.5/lib/net40/MySql.Data.dll new file mode 100644 index 00000000..fd3c20ab Binary files /dev/null and b/TBF_V2/Sources/TBF/packages/MySql.Data.6.6.5/lib/net40/MySql.Data.dll differ diff --git a/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/ConfigurationTemplates/FireBird.cfg.xml b/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/ConfigurationTemplates/FireBird.cfg.xml new file mode 100644 index 00000000..17747f9a --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/ConfigurationTemplates/FireBird.cfg.xml @@ -0,0 +1,30 @@ + + + + + + NHibernate.Driver.FirebirdClientDriver + + Server=localhost; + Database=C:\nhibernate.fdb; + User=SYSDBA;Password=masterkey + + false + NHibernate.Dialect.FirebirdDialect + 60 + true 1, false 0, yes 1, no 0 + + diff --git a/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/ConfigurationTemplates/MSSQL.cfg.xml b/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/ConfigurationTemplates/MSSQL.cfg.xml new file mode 100644 index 00000000..70397662 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/ConfigurationTemplates/MSSQL.cfg.xml @@ -0,0 +1,16 @@ + + + + + + NHibernate.Driver.SqlClientDriver + + Server=(local);initial catalog=nhibernate;Integrated Security=SSPI + + NHibernate.Dialect.MsSql2008Dialect + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/ConfigurationTemplates/MySql.cfg.xml b/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/ConfigurationTemplates/MySql.cfg.xml new file mode 100644 index 00000000..3b106269 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/ConfigurationTemplates/MySql.cfg.xml @@ -0,0 +1,16 @@ + + + + + + NHibernate.Driver.MySqlDataDriver + + Database=test;Data Source=someip;User Id=blah;Password=blah + + NHibernate.Dialect.MySQLDialect + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/ConfigurationTemplates/Oracle.cfg.xml b/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/ConfigurationTemplates/Oracle.cfg.xml new file mode 100644 index 00000000..523090cb --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/ConfigurationTemplates/Oracle.cfg.xml @@ -0,0 +1,18 @@ + + + + + + NHibernate.Driver.OracleClientDriver + + User ID=nhibernate;Password=nhibernate;Data Source=localhost + + false + NHibernate.Dialect.OracleDialect + true 1, false 0, yes 'Y', no 'N' + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/ConfigurationTemplates/PostgreSQL.cfg.xml b/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/ConfigurationTemplates/PostgreSQL.cfg.xml new file mode 100644 index 00000000..d01718ed --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/ConfigurationTemplates/PostgreSQL.cfg.xml @@ -0,0 +1,15 @@ + + + + + NHibernate.Driver.NpgsqlDriver + + Server=localhost;Database=nhibernate;User ID=nhibernate;Password=nhibernate; + + NHibernate.Dialect.PostgreSQL82Dialect + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/ConfigurationTemplates/SQLite.cfg.xml b/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/ConfigurationTemplates/SQLite.cfg.xml new file mode 100644 index 00000000..d07b7eeb --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/ConfigurationTemplates/SQLite.cfg.xml @@ -0,0 +1,15 @@ + + + + + NHibernate.Driver.SQLite20Driver + + Data Source=nhibernate.db + + NHibernate.Dialect.SQLiteDialect + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/ConfigurationTemplates/SybaseASE.cfg.xml b/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/ConfigurationTemplates/SybaseASE.cfg.xml new file mode 100644 index 00000000..4f722b1f --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/ConfigurationTemplates/SybaseASE.cfg.xml @@ -0,0 +1,16 @@ + + + + + NHibernate.Driver.SybaseAseClientDriver + + Data Source=10.0.0.1;Port=5000;Database=nhibernate;User ID=nhibernate;Password=password + + NHibernate.Dialect.SybaseASE15Dialect + true=1;false=0 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/ConfigurationTemplates/SybaseSQLAnywhere.cfg.xml b/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/ConfigurationTemplates/SybaseSQLAnywhere.cfg.xml new file mode 100644 index 00000000..04a929b7 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/ConfigurationTemplates/SybaseSQLAnywhere.cfg.xml @@ -0,0 +1,16 @@ + + + + + NHibernate.Driver.SybaseSQLAnywhereDriver + + UID=DBA;PWD=sql;Server=localhost;DBN=nhibernate;DBF=c:\nhibernate.db;ASTOP=No + + NHibernate.Dialect.SybaseSQLAnywhere12Dialect + true=1;false=0 + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/NHibernate.4.0.4.4000.nupkg b/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/NHibernate.4.0.4.4000.nupkg new file mode 100644 index 00000000..480f2153 Binary files /dev/null and b/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/NHibernate.4.0.4.4000.nupkg differ diff --git a/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/NHibernate.license.txt b/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/NHibernate.license.txt new file mode 100644 index 00000000..866688db --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/NHibernate.license.txt @@ -0,0 +1,460 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + diff --git a/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/NHibernate.readme.html b/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/NHibernate.readme.html new file mode 100644 index 00000000..e62ac003 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/NHibernate.readme.html @@ -0,0 +1,54 @@ +

Welcome to NHibernate

+ +

NHibernate is a mature, open source object-relational mapper for the .NET framework. It is actively developed, +fully featured and used in thousands of successful projects.

+ +

The NHibernate community website - http://www.nhforge.org - has a range of resources to help you get started, +including wikis, blogs and reference documentation.

+ +

Latest Version

+ +

The quickest way to get the latest release of NHibernate is to add it to your project using +NuGet (http://nuget.org/List/Packages/NHibernate).

+ +

Alternatively binaries are available from SourceForge at http://sourceforge.net/projects/nhibernate.

+ +

You are encouraged to review the release notes (releasenotes.txt), particularly when upgrading to a +later version. The release notes will generally document any breaking changes.

+ +

Community Forums

+ +

There are two official NHibernate community forums:

+ + + +

Bug Reports

+ +

If you find any bugs, please report them using the JIRA bug tracker. A +test-case that demonstrates the issue is usually required. Instructions on providing a test-case +can be found here.

+ +

Licenses

+ +

This software is distributed under the terms of the Free Software Foundation Lesser GNU Public License (LGPL), version 2.1 (see lgpl.txt).

+ +

Credits

+ +

Many thanks to the following individuals, organisations and projects whose work is so important to the success +of NHibernate (in no particular order):

+ + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/NHibernate.releasenotes.txt b/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/NHibernate.releasenotes.txt new file mode 100644 index 00000000..584bc571 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/NHibernate.releasenotes.txt @@ -0,0 +1,3048 @@ +Build 4.0.4.GA +============================= + +** Bug + * [NH-3795] - C# compiler "Roslyn" regression + + +Build 4.0.3.GA +============================= + +** Bug + * [NH-2504] - Can't use Cacheable with Group By + * [NH-3457] - TemplatedViolatedConstraintNameExtracter.ExtractUsingTemplate calls Substring with wrong arguments + * [NH-3468] - InvalidCastException when deleting entities containing uninitialized lazy components + * [NH-3573] - Query cache statistics not updated when using MultiCriteria + * [NH-3731] - Unable to serialize session after modifying the index of entities in a list + + +Build 4.0.2.GA +============================= + +** Bug + * [NH-2779] - Session.Get() can throw InvalidCastException when log-level is set to DEBUG + * [NH-2782] - Linq: selecting into a new array doesn't work + * [NH-2831] - NH cannot load mapping assembly from GAC + * [NH-3049] - Mapping by code to Field not working + * [NH-3222] - NHibernate Futures passes empty tuples to ResultSetTransformer + * [NH-3650] - ComponentAsId used more than once, cache first mapping and produces subsequently a sql select wrong + * [NH-3709] - Fix Reference to One Shot Delete and Inverse Collections + * [NH-3710] - Use of SetLockMode with DetachedCriteria causes null reference exception + +** Task + * [NH-3697] - Ignore Firebird in NHSpecificTest.NH1981 + * [NH-3698] - NHSpecificTest.NH1989 fails for some drivers + + +Build 4.0.1.GA +============================= + +** Bug + * [NH-3102] - Wrong mapping produced by Map + * [NH-3214] - PropertyContainerCustomizer.Bag() throws NullReferenceException when mapping a property of type IList + * [NH-3575] - DefaultReadOnly not working for Future() queries + * [NH-3656] - Firebird doesn't accept Currency as parameter type + * [NH-3667] - MappingByCode produce wrong table field name 'idx' in Dictionary<,> mappings + * [NH-3679] - SchemaExport.Create(false, false) does not write to file specified via SchemaExport.SetOutputFile + * [NH-3691] - All dialect checks in NHSpecificTest.NH1487.Fixture are broken + * [NH-3692] - TypedManyToOneTest is broken for Firebird + * [NH-3694] - Criteria or QueryOver with join to components collection does not return data. It worked in NH 3.3. + * [NH-3695] - NHSpecificTest.NH1845 fails for some Dialects + * [NH-3696] - Connection pooling + Multi threraded tests + * [NH-3701] - NHSpecificTest.NH2302 Fails under Firebird + +** Improvement + * [NH-3604] - Map ByCode fails when property is protected (not public) + * [NH-3687] - Change Id mapping of TimesheetEntry from native to assigned + * [NH-3688] - Modify NHSpecificTest.NH1391 so that it doesn't depend on preknown id values + * [NH-3690] - Add LEFT function to Firebird + +** Patch + * [NH-3383] - Fix for multiple objects of CascadeStyle in Memory that should be singleton + * [NH-3577] - Fix in SessionFactory.Statistics.LogSummary() method to show 0 milisecond as MaxQueryTime when no query was executed, instead of -922337203685477 + +** Task + * [NH-3085] - Document enhanced id generators + * [NH-3660] - Ignore Firebird in DtcFailuresFixture + * [NH-3689] - Ignore Firebird in NHSpecificTest.NH1171 + + +Build 4.0.0.GA +============================= + +** Known BREAKING CHANGES from NH3.3.3.GA to 4.0.0.GA + + NHibernate now targets .Net 4.0. Many uses of set types from Iesi.Collections have + now been changed to use corresponding types from the BCL. The API for these types + are slightly different. + + Support for persistent non-generic collections removed. Use the generic counterparts instead. + + ##### Possible Breaking Changes ##### + * IDeleteEventListener, IEventSource: Use generic ISet<> instead of non-generic in method signatures. + * SqlString.Parts removed. Use SqlString.Count and SqlString.GetEnumerator(). + * IPersistentCollection.GetSnapshot() now returns object instead of ICollection. The snapshot should be opaque to outside code. + * Removed IsDiscriminatorFormula, DiscriminatorFormula and GenerateSelectString from UnionSubclassEntityPersister class. + * Removed ManagedWebSessionContext. Any configuration files which use the "managed_web" session context should now use "web" + * SybaseASADialect removed: Use SybaseSQLAnywhere10Dialect instead. + * ASA10ClientDriver, ASAClientDriver and SQLiteDriver removed: Use SybaseSQLAnywhereDriver, SybaseAsaClientDriver, SQLite20Driver instead. + * Removed Classic HQL Parser. + * Removed IQueryTranslatorFactory2. It's methods were pulled up to IQueryTranslatorFactory. Method CreateQueryTranslators accepting string as first argument marked as Obsolete. + * IQueryExpression.Translate now has second boolean argument 'filter' + * Added several methods which accepts IQueryExpression to ISessionImplementor, which is duplicating methods which accepts string. + * Miss-spelled AdoNetWithDistrubtedTransactionFactory removed: Use AdoNetWithDistributedTransactionFactory instead + * HqlDistinctHolder removed: Use HqlExpressionSubTreeHolder instead + * DisableLogFormattedSql method removed: the default is disabled + * ISession.SaveOrUpdateCopy removed: Use Merge instead + * Oracle and MySQL: The atan2 and power functions now return double (instead of single) for consistency with other dialects. + * Removed FirebirdDriver. It was the same as FirebirdClientDriver since 3.2, and the latter have been the default since then. + * Removed bunch of unused methods on *Helper classes + * Static fields on NHibernateUtil are declared as their exact class + + From NH4.0.0.Alpha1 to 4.0.0.Alpha2: + Fixed mapping by code behaviour when map child subclasses (see NH-3135 and NH-3269) + + The constructor of AbstractComponentTuplizer now behaves like AbstractEntityTuplizer in the way + that it doesn't create the instantiator any more. Custom component tuplizers that derive + directly from AbstractComponentTuplizer need to add this line of code in their constructor: + instantiator = BuildInstantiator(component); + + From NH4.0.0.Alpha2 to 4.0.0.CR1: + The interface IEnhancedProjection was removed and its methods moved to IProjection. + Two other overloads of the GetColumnAliases() methods was removed from IProjection. + + * [NH-2290] Invalid hql parenthesis expansion in generated sql + Unary minus before parentheses in HQL lost the parentheses when translated + to SQL and therefore the wrong value was returned. This use of unary minus is now + implemented in the mathematically correct way. + + +** Bug + * [NH-3638] - Mapping-by-code is occasionally picking the wrong column name + * [NH-3654] - Internal access of PersistentGenericBag removed + +** Improvement + * [NH-3415] - Add Overload to IGeneratorMapper.Params That Receives a Dictionary + * [NH-3657] - Map By Code - One to One Missing Class Action + +** Patch + * [NH-3529] - Add linqtohql.generatorsregistry to nhibernate-configuration.xsd + + +Build 4.0.0.CR1 +============================= + +** Bug + * [NH-3455] - QueryOver + selecting a component + OrderBy = wrong OrderBy in SQL + * [NH-3581] - nhibernate.everything.sln doesn't compile + * [NH-3587] - Parameters within a select clause + * [NH-3620] - ORA-01483 when inserting two blobs and a date using the OracleManagedDataClientDriver + * [NH-3624] - broken insert statement with select + * [NH-3629] - Translation of string.IndexOf() in Linq is broken for firebird + * [NH-3641] - Missing Outer Join + * [NH-3642] - PostgreSQL: Support LINQ DateTime.Date in select clause + * [NH-3649] - Missing support for round() in SQLite and SQL Server CE dialects (affected criteria queries) + +** Improvement + * [NH-3623] - Add FirebirdExceptionConverterExample + * [NH-3626] - avoid double parens around a select statement + * [NH-3627] - change some id mappings from native to assigned in linq tests + * [NH-3628] - add keyword "date" and function "date" to FirebirdDialect + * [NH-3647] - Support Math.Round() in QueryOver projections + +** Task + * [NH-3251] - Update to antlr 3.5.0.2 + * [NH-3644] - Merge IEnhancedProjection into IProjection + +Build 4.0.0.Alpha2 +============================= + +** Known BREAKING CHANGES from NH4.0.0.Alpha1 to 4.0.0.Alpha2 + + Fixed mapping by code behaviour when map child subclasses (see NH-3135 and NH-3269) + + The constructor of AbstractComponentTuplizer now behaves like AbstractEntityTuplizer in the way + that it doesn't create the instantiator any more. Custom component tuplizers that derive + directly from AbstractComponentTuplizer need to add this line of code in their constructor: + instantiator = BuildInstantiator(component); + + +** Bug + * [NH-2380] - Cannot perform distinct when selecting an anonymous type + * [NH-2486] - Distinct() extension method problem with Object Initialisers + * [NH-2655] - DbType.Double should be float(53) instead of DOUBLE PRECISION in the SQL-Severer2000 Dialect + * [NH-2692] - Using Any() on a collection of components results in invalid SQL: Column of parent ID is used instead of key column + * [NH-2861] - doesn't work in conjunction with + * [NH-2865] - "Expression type 'NhSumExpression' is not supported by this SelectClauseVisitor." + * [NH-2961] - "Index was outside the bounds of the array" error when executing cached query for single result with distinct results transformer + * [NH-3135] - Collection of Components in BaseClass cannot be mapped to a different table + * [NH-3269] - UniqueKey on property of base class will affect all inherited class + * [NH-3392] - Add ability to expand subcollections with composites ids with WCF Data Services + * [NH-3417] - Nested projection of subcollection throws + * [NH-3423] - MemberInitExpression causing problem in HqlGeneratorExpressionTreeVisitor (WCF DS) + * [NH-3571] - Linq does not support dynamic components inside components + * [NH-3579] - Session leak in the Query Plan Cache + * [NH-3586] - Firebird Decimals + * [NH-3588] - Creating and dropping of Temporary Tables in an isolated transaction is broken + * [NH-3590] - Detached entity with set of primitives throws + * [NH-3591] - IncrementGenerator unnecessarily creates a new connection to the db + +** Improvement + * [NH-1082] - Exceptions thrown in IInterceptor.BeforeTransactionCompletion should cause the transaction to be rolled back + * [NH-3041] - Expression-based PropertyRef missing in OneToOne mapping + * [NH-3072] - OneToManyPersister improvements + * [NH-3141] - Don't fetch id from proxy target + * [NH-3437] - Turn SqlMethods.Like into an extension method + + +** Patch + * [NH-3558] - Table check and enhanced id generators in Mapping By Code + * [NH-3559] - UnionSubclassEntityPersister does not quote column names + +** Task + * [NH-3363] - Refactor Loader/Result Transformer interaction to match Hibernate + +Build 4.0.0.Alpha1 +============================= + +** Known BREAKING CHANGES from NH3.3.3.GA to 4.0.0.Alpha1 + + NHibernate now targets .Net 4.0. Many uses of set types from Iesi.Collections have + now been changed to use corresponding types from the BCL. The API for these types + are slightly different. + + Support for persistent non-generic collections removed. Use the generic counterparts instead. + + ##### Possible Breaking Changes ##### + * IDeleteEventListener, IEventSource: Use generic ISet<> instead of non-generic in method signatures. + * SqlString.Parts removed. Use SqlString.Count and SqlString.GetEnumerator(). + * IPersistentCollection.GetSnapshot() now returns object instead of ICollection. The snapshot should be opaque to outside code. + * Removed IsDiscriminatorFormula, DiscriminatorFormula and GenerateSelectString from UnionSubclassEntityPersister class. + * Removed ManagedWebSessionContext. Any configuration files which use the "managed_web" session context should now use "web" + * SybaseASADialect removed: Use SybaseSQLAnywhere10Dialect instead. + * ASA10ClientDriver, ASAClientDriver and SQLiteDriver removed: Use SybaseSQLAnywhereDriver, SybaseAsaClientDriver, SQLite20Driver instead. + * Removed Classic HQL Parser. + * Removed IQueryTranslatorFactory2. It's methods were pulled up to IQueryTranslatorFactory. Method CreateQueryTranslators accepting string as first argument marked as Obsolete. + * IQueryExpression.Translate now has second boolean argument 'filter' + * Added several methods which accepts IQueryExpression to ISessionImplementor, which is duplicating methods which accepts string. + * Miss-spelled AdoNetWithDistrubtedTransactionFactory removed: Use AdoNetWithDistributedTransactionFactory instead + * HqlDistinctHolder removed: Use HqlExpressionSubTreeHolder instead + * DisableLogFormattedSql method removed: the default is disabled + * ISession.SaveOrUpdateCopy removed: Use Merge instead + * Oracle and MySQL: The atan2 and power functions now return double (instead of single) for consistency with other dialects. + * Removed FirebirdDriver. It was the same as FirebirdClientDriver since 3.2, and the latter have been the default since then. + * Removed bunch of unused methods on *Helper classes + * Static fields on NHibernateUtil are declared as their exact class + +** Sub-task + * [NH-3038] - Add Support for SQL Server 2012 Query Paging + * [NH-3098] - Pull code/history from nhibernate-core repository to new iesi.collections repository + * [NH-3099] - Remove Iesi.Collection-related code from nhibernate-core repository + * [NH-3163] - Remove internal use of non-generic ISet + * [NH-3165] - Remove support for non-generic ISet in mapped classes + + +** Bug + * [NH-2008] - Mapping with HashSet generates unecessary update on collection owner + * [NH-2033] - Composite-Id relationships (key-many-to-one) do not appear to be used in CreateCriteria + * [NH-2762] - Failed to use IGrouping.Contains() from Lookup to make SQL IN statement + * [NH-2772] - Lazy-collection not loaded when a property is Lazy-loaded + * [NH-2819] - DefaultDynamicLazyFieldInterceptor does not handle generic methods correctly + * [NH-2852] - Linq ThenFetch fails on deep where clause. + * [NH-2897] - MultiQuery/ToFuture broken with Contains (in) + * [NH-2915] - In Linq, Where clause is ignored if followed by Fetch and then by OrderBy + * [NH-2923] - Extra lazy indexed collection throws InvalidCastException fetching Count + * [NH-2955] - AbstractQueryImpl accepts IEnumerables in SetParameterList but breaks if they're not ICollections + * [NH-2977] - MsSqlServer dialects reject custom SQL Server queries with limits + * [NH-2985] - Wrong equals operator when you use mapping when child has property with lazy="true" + * [NH-3056] - Fetch clause suppresses where clause if positioned before Select clause + * [NH-3058] - Methods on entities with lazy properties do not trigger load of lazy properties + * [NH-3070] - Proxy for an entity with a lazy property and a formula property is not .Equal to itself + * [NH-3132] - Property with access="field.camelcase" not working when another property is lazy + * [NH-3139] - Optional Entity association using lazy property returns proxy instead of null + * [NH-3160] - Null reference Exception when creating schema for dialect that doesn't support unique + * [NH-3183] - Linq ToFuture/ToFutureValue does not fall-back if dialect does not support multi-queries + * [NH-3186] - Simple query with Fetch and SingleOrDefault throws exception (regression from 3.3.0) + * [NH-3202] - Offset parameter is off by one for dialects with OffsetStartsAtOne set (SybaseSQLAnywhere10+) + * [NH-3235] - Query plan cache cannot be set to size zero + * [NH-3236] - Build menu incorrectly launches NUnit + * [NH-3244] - Proxying fails for methods with generic class as generic parameter constraints or generic parameter attributes + * [NH-3256] - GroupBySelectClauseRewriter fails or is suboptimal on .Net 4.0 + * [NH-3260] - Unable to proxy generic methods with constraints referencing type parameters from containing class + * [NH-3274] - Take() support broken with Informix + * [NH-3281] - Linq providers are not being passed Limit and/or Offset as value only as parameters + * [NH-3340] - NHibernate assembly loses the AllowPartiallyTrustedCallers attribute after ILMerge + * [NH-3381] - atan2 should be defined to return double on Oracle and MySql + * [NH-3420] - Race Condition in result set wrapper because of the ColumnNameCache + +** Improvement + * [NH-2005] - hql concat function not registered in MsSqlCeDialect + * [NH-2808] - Missing overloads for Session.Save/Update/SaveOrUpdate + * [NH-3037] - ActionQueue Insertion sort performance degrades exponentially (HHH-2957 Port) + * [NH-3054] - Mapping By-Code support for non-generic User Collection Types + * [NH-3133] - Support for importing classes in mapping. + * [NH-3175] - Joins should support additional restrictions (HQL-with) + * [NH-3238] - Add Sql2008ClientDriver support in DatabaseSetup for testing + * [NH-3272] - Move TypeHelperExtensionMethods to a more internal namespace + * [NH-3319] - Typo in a folder name in NHibernate.Test project + * [NH-3343] - Remove NHibernate custom Tuple classes + * [NH-3382] - Improve materialization performance (for simple Linq query, may reduce 50%+ time) + * [NH-3398] - Support PostgreSQL trigonometric functions + * [NH-3399] - Static fields on NHibernateUtil should be declared as their exact class + * [NH-3459] - DefaultIfEmpty not supported when used with a GroupBy + * [NH-3553] - Support the 'power' function on MS SQL Server + +** New Feature + * [NH-3164] - Support building NHibernate on .Net 4 + * [NH-3166] - Support for Microsoft Sql Server 2012 + * [NH-3193] - MsSqlCeDialect should correct override string manipulation functions + * [NH-3195] - MsSqlCeDialect should support TOP limit + * [NH-3284] - New Ingres9+ Dialect + * [NH-3349] - Add support for managed ODP.NET + +** Patch + * [NH-2778] - Batcher for MySql + * [NH-3540] - Null pointer exception for empty BaseDirectory (Path.combine) + +** Task + * [NH-2997] - Where() clause with many-to-many relation is missing (solution in description) + * [NH-3097] - Move Iesi.Collections project to own repository + * [NH-3185] - Update included Iesi.Collections.dll and add its pdb file + * [NH-3314] - Remove ManagedWebSessionContext + * [NH-3322] - Remove one of the Firebird drivers + * [NH-3339] - Remove SecurityPermission attributes with LinkDemand for .NET 4.0 assemblies + * [NH-3344] - Remove the classical HQL parser + * [NH-3345] - Remove support for persistent non-generic collections + * [NH-3346] - Remove members obsolete in NH3 from NH4 + * [NH-3347] - Remove obsolete dialects for NH4 + + +Build 3.4.0.GA +============================= +** Known BREAKING CHANGES from NH3.3.0.GA to NH3.4.0.GA + + ##### Possible Breaking Changes ##### + * [NH-2290] Invalid hql parenthesis expansion in generated sql + Unary minus before parentheses in HQL lost the parentheses when translated + to SQL and therefore the wrong value was returned. This use of unary minus is now + implemented in the mathematically correct way. + + +** Sub-task + * [NH-3432] - Merge fix for bug NH-3058 into 3.Next + +** Bug + * [NH-2819] - DefaultDynamicLazyFieldInterceptor does not handle generic methods correctly + * [NH-2977] - MsSqlServer dialects reject custom SQL Server queries with limits + * [NH-3058] - Methods on entities with lazy properties do not trigger load of lazy properties + * [NH-3132] - Property with access="field.camelcase" not working when another property is lazy + * [NH-3244] - Proxying fails for methods with generic class as generic parameter constraints or generic parameter attributes + * [NH-3638] - Mapping-by-code is occasionally picking the wrong column name + +** Patch + * [NH-3529] - Add linqtohql.generatorsregistry to nhibernate-configuration.xsd + +** Task + * [NH-3412] - Need to reconcile changes to MsSql2005DialectQueryPager for NH-2977 between 3.3.3 and vNext + + +Build 3.4.0.CR1 +============================= + +** Sub-task + * [NH-3434] - Need to be sure NH-3428 is resolved in 3.Next. + +** Bug + * [NH-1882] - Collection was not processed by flush when iterate through collection in PostUpdateEvent + * [NH-2128] - Interceptor fires AfterTransactionCompletion too many times with distributed transactions and user-supplied connections + * [NH-2290] - Invalid hql parenthesis expansion in generated sql + * [NH-2921] - IsSpecialName of getter/setter method of proxy property returns false + * [NH-2923] - Extra lazy indexed collection throws InvalidCastException fetching Count + * [NH-2943] - Mapping XmlDocument (.NET) to XmlType (Oracle). Class XmlDocType not working. + * [NH-2963] - Validation on a collection property (mapped with Loquacious config) raise an exception [Invalid expression type: Expected ExpressionType.MemberAccess, Found Convert] + * [NH-3103] - ManyToAny ByCode does not use field customizer + * [NH-3140] - Bag ManyToMany column is ignored if it's the same as the child entity name and is replaced with "elt" in the sql. + * [NH-3190] - QuerySyntaxException is thrown when where contains subselect that matches bool value + * [NH-3234] - Merge is failing with "Unable to resolve property" + * [NH-3237] - Max and Min aggregate expressions do not work for custom UserType due to unnecessary HQL Cast + * [NH-3277] - LINQ Projection of Int64 using ToString method causes "cast as char" instead of "cast as nvarchar" in MsSqlCe dialect + * [NH-3280] - Mapping OneToOne doesn't work for inherited members + * [NH-3315] - Distinct paging problem with alias SQL Server 2005 + * [NH-3316] - Mapping parent property on component in a set adds bogus property element + * [NH-3405] - Cannot Use XDocument When Setting Wrap Resultsets + * [NH-3496] - NHibernate SqlServer2012Dialect drop sequence bug + * [NH-3505] - Stateless sessions fail to save relationships pointing to proxies when versioning is enabled + * [NH-3572] - AfterTransactionCompletion called twice if a distributed transaction is rolled back + * [NH-3592] - Failed to execute multi criteria with Ms Sql Ce 4.0 + * [NH-3611] - NHibernateUtil.GuessType(typeof(string)) returns ClassMetaType + * [NH-3614] - Cannot create project an enumerable of non-mapped objects (List) + * [NH-3615] - Incorrect assumption that namespace always exists + * [NH-3618] - ManyToOne does not allow to set "unique"="true", "unique-key" and "index" for multi-column properties + * [NH-3641] - Missing Outer Join + +** Improvement + * [NH-2005] - hql concat function not registered in MsSqlCeDialect + * [NH-2958] - Delay creation of instance of XmlSerializer (loading xml assembly) until its needed. + * [NH-3465] - Add support of IIF function for Oracle + * [NH-3466] - Register MySQL functions + * [NH-3467] - Add support of 2-arg LOCATE function + * [NH-3608] - AbstractSessionImpl abstract method visibility + +** New Feature + * [NH-2405] - MySQL5InnoDBDialect + * [NH-3192] - MsSqlCeDialect should override date manipulation functions + * [NH-3193] - MsSqlCeDialect should correct override string manipulation functions + * [NH-3194] - MsSqlCe40Dialect should support variable limits + * [NH-3195] - MsSqlCeDialect should support TOP limit + * [NH-3196] - MsSqlCeDialect should support guid.native id generator + +** Patch + * [NH-2996] - MySQL 5.5 + .NET Connector 6.2+ and GUIDs: Need to use CHAR(36) + * [NH-3209] - DateTimeOffset properties have not been considered; only the properties of DateTime have been considered + +** Task + * [NH-3251] - Update to antlr 3.5.0.2 + +Build 3.3.4.GA +============================= + +** Bug + * [NH-3638] - Mapping-by-code is occasionally picking the wrong column name + +Build 3.3.3.SP1 +============================= + +Fixes for regressions introduced in the 3.3.3 cycle. + +** Bug + * [NH-3429] - Exception when debug logging is enabled when using a linq expression that requires a proxy class. + * [NH-3436] - Linq-Query with IList.Contains fails with NotSupportedException(The constant for 'System.Collections.Generic.List`1[System.Guid]' is not supported) at HqlTreeBuilder.Constant + +Build 3.3.3.GA +============================= + +BEWARE: In versions prior to 3.3.3.CR1, the handling of the LINQ Take() method + was flawed - no matter where in the query Take() was placed it was + always applied as if it had been placed at the end. 3.3.3 fixes this, + so that Take() now correctly follows the .Net semantics. That is, in + 3.3.3, the following queries might now give different results: + + session.Query.OrderBy(...).Take(5).Where(...); + session.Query.Where(...).OrderBy(...).Take(5); + + Starting with 3.3.3, the first query will generate a subquery to correctly + apply the row limit before the where-clause. + +** Bug + * [NH-2408] - SQL Server pessimistic locking syntax incorrect for union-subclass + * [NH-3109] - Rounding float values in aggregate functions with group by statements (MySQL). + * [NH-3324] - HQL: ArgumentNullException when using LEFT OUTER JOIN and SetMaxResults + * [NH-3408] - System.IndexOutOfRangeException when using Contains on a List + * [NH-3413] - Clearing a list used by Contains causes subsequent queries to fail + +Build 3.3.3.CR1 +============================= + +** Fix + * [NH-3148] - ComponentAsId properties do not maintain the Column specified using property mapper when component is from base class + +** Sub-task + * [NH-3052] - Projection of one-to-many generates invalid SQL + * [NH-3385] - Add ability to expand many subcollections with WCF Data Services + +** Bug + * [NH-2042] - Table per subclass, using a discriminator mappings with formula in child class error + * [NH-2539] - Contains/StartsWith fails when invoked via WCF Data Service. + * [NH-2566] - NotSupportedException when using Skip/Take/First/Single/Any on GroupBy + * [NH-2588] - NotSupportedException when using Skip/Take with Where clause + * [NH-2860] - Lazy property throwing casting exception + * [NH-2979] - MsSqlCe dialect doesn't give the correct SQL type for Decimal with Scale defined + * [NH-3039] - IndexOutOfRangeException thrown when web server is processing multiple sessionfactory creation requests + * [NH-3057] - Collection subquery constraint on joined-subclass inherited properties causes invalid sql (base classes are not joined in). + * [NH-3105] - ComponentAsId does not find property that belongs to a parent class + * [NH-3108] - OrderBy with Select throws exception + * [NH-3129] - Linq Provider doesn't recognize CompareTo method + * [NH-3241] - Linq: Mixing Fetch/FetchMany with Any() throws: ArgumentException: Expression of type 'System.Collections.IList' cannot be used for parameter of type 'System.Collections.Generic.IEnumerable`1[System.Object]' + * [NH-3261] - Linq Query throws when there is a conditional operator + * [NH-3305] - SybaseSQLAnywhere10Dialect defaults a numeric datatype to (19,255) precision, which is not compatible with the DB + * [NH-3318] - Composite-id does not allow superclass properties + * [NH-3320] - Exception in LINQ projection with OrderBy/Take - block using WCF Data Services projection's + * [NH-3326] - Exception in LINQ with pagination - block using WCF Data Services + * [NH-3330] - Exception in LINQ for nullable strings in Oracle - blocks using WCF Data Services + * [NH-3332] - The NH linq driver generates sql code that doesn't match the semantics of the original linq query + * [NH-3337] - Exception in LINQ for complex nullable conditionals - blocks using WCF Data Services + * [NH-3357] - System.NotSupportedException : Don't currently support idents of type DateTimeOffset + * [NH-3366] - LINQ query with various Compare() and CompareTo() fails (WCF Data Services) + * [NH-3369] - ToFuture/ToFutureValue should fall-back on dialects without MultiQuery support + * [NH-3378] - MySQLDialect incorrect handle DbType.Currency as MONEY + * [NH-3379] - Oracle8iDialect and FirebirdDialect incorrect handle DbType.Currency type + +** Improvement + * [NH-2297] - Configuration.BuildSessionFactory throws a NullReferenceException when loading an invalid ICompositeUserType + * [NH-3301] - Support SqlMethods.Like() in LINQ queries. + * [NH-3360] - Allow setting timeout on a LINQ query + * [NH-3367] - Support string.Equals() + * [NH-3368] - Add support for Equals method of sbyte, DateTimeOffset and unsigned numerics + * [NH-3371] - NHibernate should log LINQ expression trees to ease debugging + +** New Feature + * [NH-2986] - Add ability to include collections into projections + * [NH-3092] - Nhibernate Linq provider does not support Math functions like Math.Cos, Math.Sin, etc + * [NH-3180] - Could not select first element of the group + * [NH-3184] - Add ability to use ToFutureValue with aggregating queries + * [NH-3283] - New driver: Devart.Data.MySql + * [NH-3333] - Add ability to expand subcollections with WCF Data Services + +** Patch + * [NH-3255] - The IDbCommand that performs the cleanup of data in AbstractStatementExecutor.DropTemporaryTableIfNecessary does not have a connection. + +Build 3.3.2.GA +============================= + +** Bug + * [NH-2463] - Exception in LINQ projection with redundant type cast - block using WCF Data Services projection's + * [NH-2688] - SelectMany with cast throws QuerySyntaxException + * [NH-2898] - Retrieving object from 2nd cache with lazy property fails + * [NH-3050] - Contributed patch as solution to Unable to cast object of type 'NHibernate.Impl.ExpandedQueryExpression' to type 'NHibernate.Linq.NhLinqExpression' at NHibernate.Linq.NhQueryProvider.PrepareQuery + * [NH-3123] - Nuget package should contain the NHibernate logo + * [NH-3217] - OrderBy with a parameter then Skip and Take produces sql error + * [NH-3239] - Linq to NHibernate and Dynamic LINQ - query caching not working + * [NH-3271] - Threading problem in TypeFactory + +** Improvement + * [NH-3296] - Tweak build system to allow keeping a constant assembly version between compatible releases + * [NH-3297] - NHibernate 3.x NuGet package should forbid Iesi.Collections 4.0 or higher + +** Patch + * [NH-3293] - SimpleExpression.ToString() returns hashes for strings and dates + +Build 3.3.1.GA +============================= + +** Sub-task + * [NH-3167] - Support for Microsoft Sql Server 2012 sequences + * [NH-3170] - Add native "iif" function to MsSql2012Dialect + +** Bug + * [NH-2789] - LINQ query on byte? simple property fails on MSSQL 2005 (tinyint) + * [NH-2812] - Performing a Linq query on a non-null byte property throws an InvalidCastException + * [NH-3121] - Silent truncation of binary data + * [NH-3124] - invalid cast to int in generated sql with a char property + * [NH-3125] - Invalid SQL when querying via LINQ with grouping (regression from 3.2) + * [NH-3126] - InvalidCastException when cascading saves to transient dictionary values + * [NH-3138] - Distinct Bug on MSSQL with OrderBy/Limit and functions in Projection/Order + * [NH-3142] - Batch-loading of lazy children failing when key is composite + * [NH-3145] - HQL query using base class entity with lazy properties throws "No Persister For" error + * [NH-3147] - Calling Contains on a subquery that contains a join throws an Exception + * [NH-3153] - Duplicated id generator tables if schema is specified using different methods for different classes. + * [NH-3162] - Byte.Equals in LINQ Where clauses throws NotSupportedException + * [NH-3172] - "Duplicate dynamic module name within an assembly" + +** Improvement + * [NH-3104] - Typo in Warning Messages + * [NH-3149] - MsSql2005Dialect should use nowait in LockMode.UPGRADE_NOWAIT + * [NH-3156] - ShowBuildMenu.bat does not work with spaces in repository folder name + * [NH-3168] - Add support for bit_length function for MsSql2000Dialect and above + * [NH-3169] - Add supprot for extract function for MsSql2000Dialect and above + +Build 3.3.0.GA +============================= + +** Known BREAKING CHANGES from NH3.2.0.GA to NH3.3.0.GA + + ##### Possible Breaking Changes ##### + * [NH-2214] - SQL Server 2005/2008: Exception is now thrown when paging a statement that requires distinct results, and is ordered by a column that is not included in the result set of the query + - Dialog.ExtractColumnOrAliasNames method signature and visibility changed - may affect custom dialects that use this method + * [NH-2950] - IAccessCallback.NextValue property renamed and changed to a method called IAccessCallback.GetNextValue() + * [NH-2953] - SequenceStyleGenerator now forces use of a table if a pooled optimizer is chosen and the dialect doesn't support pooled sequences. + * [NH-2960] - Queries for an entity name will now not include instances of the same class mapped using a different entity name. + * [NH-2664] - IHqlExpressionVisitor has new property ISessionFactory SessionFactory { get; } + * [NH-3067] - The use of Substring() in Linq queries have been corrected so the zero-based index parameter in C# is converted to one-based index in SQL. + * [NH-2528] - Throw exception instead of silently truncate string and blob data + * [NH-3086] - The base dialect now defaults to ANSI syntax for substring. A custom dialect may need to adjust for this. + +** Bug + * [NH-2956] - SybaseSQLAnywhere10Dialect doesn't override OffsetStartsAtOne + * [NH-3111] - Wrong SQL generated when subquery uses objects from parent query + +** Improvement + * [NH-3086] - All dialects should support substring() with two arguments + +Build 3.3.0.CR1 +============================= + +** Bug + * [NH-1477] - Saving a collection (thats been Cleared) with all-delete-orphan using Oracle with ODP drivers + * [NH-2214] - Distinct and Row_number problem + * [NH-2347] - Casts inside aggregate functions are incorrectly applied outside of them + * [NH-2419] - Linq Provider Problem with group by with an order by clause + * [NH-2429] - SQL Server Linq Average function on Interger field only returns truncated interger value + * [NH-2439] - LINQ 'in' query not fully interpreted + * [NH-2451] - LINQ Issue - joining twice with same table when used in both select and where. Second join is a full select and filtered in where instead of a join .. on + * [NH-2452] - NH 3.0 Linq provider does not correctly translate standard .Key property when grouping + * [NH-2492] - Problem with ROW_NUMBER and DISTINCT operator using LINQ + * [NH-2511] - System.ArgumentException: Object of type 'System.Linq.Expressions.ConstantExpression' cannot be converted to type 'System.Linq.Expressions.LambdaExpression' when passing an expression through a method + * [NH-2527] - AbstractBatcher reuses disposed IDbCommands which causes an ArgumentOutOfRangeException with OracleDataClientDriver + * [NH-2560] - NoViableAltException with ordering by projection in GroupBy + * [NH-2664] - Linq, cannot query dynamic-component + * [NH-2706] - subselect in LINQ query with Contains clause produces wrong SQL + * [NH-2722] - Linq Count() does not respect previous calls to Select() or Distinct() + * [NH-2744] - NewArrayInit Is not Implemented + * [NH-2763] - queryover fails where referencing enum in VB.NET + * [NH-2781] - linq's OrderBy by a calculated column doesn't work + * [NH-2809] - Incorrect specification of VARBINARY(MAX) in MsSql2005Dialect + * [NH-2828] - Persist uploads not initialized collections on flush + * [NH-2833] - "where" clause not working after "group by", generates wrong SQL + * [NH-2846] - Fetch on Count Throws Error + * [NH-2850] - Unable to use enums in NH 3.2 QueryOver checked comparison + * [NH-2853] - SetFirstResult and SetMaxResults do not work correctly on Oracle (ODP.NET) + * [NH-2856] - Retrieval of cached query with Fetch throws exception + * [NH-2857] - Medium Trust Bug in 3.2 + * [NH-2858] - ToString() on Guid column with SQL Server Dialects + * [NH-2863] - Criteria API restriction over aggregate function wrapped in NotExpression is wrongly placed in WHERE clause instead of HAVING clause which generates invalid SQL + * [NH-2869] - Custom extension methods in the select clause are not projected using HQL + * [NH-2880] - Proxies loose their session reference on session deserialization + * [NH-2881] - Fix not found key handling on extra lazy one to many maps + * [NH-2886] - Informix support broken + * [NH-2889] - QueryOver component with multiple properties results in Sql Error + * [NH-2891] - Too many parameters removed (Pervasive SQL) - SELECT doesn't work + * [NH-2893] - NHibernate SQL Parameter on IBM.Data.DB2.iSeries provider + * [NH-2904] - Wrong query generation with LINQ subquery + * [NH-2906] - Using the same parameter name for two differently typed where clauses throws an exception + * [NH-2913] - LINQ query that contains .Any() produces invalid SQL + * [NH-2917] - Paging error with Skip().Take(). + * [NH-2925] - Improper SQL is generated for Take (pagination) for dialects which have UseMaxForLimit = true (like Oracle) + * [NH-2927] - Oracle Dialect does not handle the correct resolution for timestamp version columns + * [NH-2937] - Invalid index 0 for this DB2ParameterCollection with Count=0. + * [NH-2940] - OracleDialect creates wrong sql using SetFirstResult with criteria queries + * [NH-2946] - Superfluous join when querying by foreign key given Id with LINQ + * [NH-2954] - PostgreSQL should SupportsPooledSequences + * [NH-2959] - Polymorphic queries in MultiQuery, MultiCriteria and Futures cause ArgumentOutOfRangeException + * [NH-2960] - Query using entity name also returns entities of same type but different entity name + * [NH-2967] - MySQL Schema Update tool fails with exception + * [NH-2976] - AbstractPersistentCollection.Remove does not remove item from an uninitialized dictionary + * [NH-2989] - ComponentAsId does not set Id Property + * [NH-2998] - Allow to use AsQueryable on child collection + * [NH-3000] - QuerySyntaxException: Exception of type 'Antlr.Runtime.NoViableAltException' was thrown. when projection contains complex code [regression] + * [NH-3001] - NHibernate.HibernateException: Query Source could not be identified + * [NH-3002] - HQL: parser is trying to reuse parent implied join for subquery + * [NH-3003] - Linq: extra joins + * [NH-3004] - DriverBase.RemoveUnusedCommandParameters removes all parameters when UseNamedPrefixInSql = true and UseNamedPrefixInParameter = false + * [NH-3008] - Excess DB parameters created when passing SqlFunctionProjection to LHS of InExpression + * [NH-3009] - Linq trying to add parameters twice if same predicate is used in query more then once + * [NH-3016] - Mapping by code does not properly support nested types + * [NH-3019] - LINQ: Select Key from group by generates wrong SQL + * [NH-3020] - Firebird and DB2 dialect claims to support sequences, but throws in GetSelectSequenceNextValString(string) (since not overriden) + * [NH-3026] - Linq order by grouped count before select clause gives wrong sql + * [NH-3031] - Cannot Sum Property of Type Single + * [NH-3032] - Group By and Condition Throws Exception + * [NH-3036] - Wrong SqlType size set for LIKE statement + * [NH-3044] - Self-joined query with subquery and where - where applied to subquery rather than the external query + * [NH-3059] - Contains broken when used on a path (Works in previous version) + * [NH-3063] - Turkish-I problem in ValidateColumn + * [NH-3064] - Schema validation fails for ODBC + * [NH-3073] - Equal in Linq-provider is only implemented for string + +** Improvement + * [NH-1007] - Add a generator attribute to id + * [NH-2528] - Throw exception instead of silently truncate string and blob data + * [NH-2825] - Add property-ref and not-found attributes in mapping by code + * [NH-2835] - SQL Anywhere dialect/driver improvements + * [NH-2870] - Simplify Development on NHibernate for Contributors + * [NH-2875] - Add Foreign Key to one-to-one mapping by code + * [NH-2883] - DisableLogFormatedSql is not useful + * [NH-2899] - Support for "in ()" in Linq + * [NH-2950] - Update optimizers for enhanced id generators (ported from Hibernate) + * [NH-2953] - Update the SequenceStyleGenerator + * [NH-2962] - Fix PostgreSQL and Firebird timestamp selection and precision + * [NH-2974] - Add unsaved-value attribute in mapping by code. + * [NH-2980] - Port enhanced TableGenerator from Hibernate + * [NH-3024] - Mapping-by-Code does not allow Unique in Component mapping + * [NH-3040] - SymbolSource support along with NuGet + +** Patch + * [NH-2004] - SequenceStyleGenerator + TableStructure opens multiple transactions. + * [NH-2545] - Comparing strings in VB throws NotSupportedException + * [NH-2840] - Improper SQL is generated for Take (pagination) for dialects which have UseMaxForLimit = true (like Oracle) + * [NH-2864] - Fix for nuget package creation. + * [NH-2905] - Support for multistep joins in Linq + * [NH-2914] - Functions for DateTime properties in OracleDialect + * [NH-2924] - CLONE - Improper SQL is generated for Take (pagination) for dialects which have UseMaxForLimit = true (like Oracle) + * [NH-2936] - Better Sequence Support for Firebird + * [NH-2964] - WhereRestrictionOn().IsInG() is a icollection not ienumerable like it should be + * [NH-2982] - SimpleExpression.ToString() can result in unwanted loading of lazy objects + * [NH-3010] - Fix for batching/command behaviour in OneToManyPersister + * [NH-3067] - Linq - substring function does not work + +** Task + * [NH-2672] - Upgrade Npgsql lib file to next release after 2.0.11.91. + * [NH-2752] - Re-enable CriteriaQueryTest.AllowToSetLimitOnSubquries for SQLite + +Build 3.2.0.GA (rev6000) +============================= + +** Known BREAKING CHANGES from NH3.1.0.GA to NH3.2.0.GA + + ##### Design time ##### + * removed obsolete "use_outer_join" property from nhibernate-configuration.xsd (simply remove it from your xml configuration) + + ##### Possible Breaking Changes ##### + * All Dialect.GetLimitString() methods replaced with a single GetLimitString method with a new signature. + For dialects the developers don't perform routine tests on, efforts were made to ensure the new limit string + method conforms to the database documentation. Please report any limit-related bugs discovered at runtime. + * [NH-2550] - Allow public access to FieldInterceptor Session (IFieldInterceptor changed) + * [NH-2593] - For Microsoft SQL Server the default batch-size (adonet.batch_size) is set to 20 where not explicit defined in the session-factory configuration + * - ICollectionPersister added property to fix [NH-2489] + * [NH-2605] Refactorize MultiQuery/MultiCriteria implementation to delegate responsibility to IDrive (IDrive changed). + * For users who don't look at Log-ERROR, to prevent wrong behavior when lazy-properties are used the DynamicProxyValidator validates the accessability of properties setters. + * For those implementing IDrive without inherit from DriveBase: IDrive.AdjustCommand + * Dialect base: removed some no more needed properties + +** Bug + * [NH-2792] - Using a named parameter multiple times in a native SQL query results in invalid parameter binding (exception in some drivers) + * [NH-2813] - Cache DefaultExpiration type is "byte" + +** Improvement + * [NH-2571] - Full PostgreSQL Support + * [NH-2743] - Generic version of ISession.Merge() + * [NH-2800] - Change internal primitive type constructor to protected + +** Patch + * [NH-2811] - Wrong logger type into AdoNetTransactionFactory & AdoNetWithDistributedTransactionFactory classes + * [NH-2814] - Documentation Error: Section 3.5 - Table 3.2 - transaction.factory_class (with patch) + +Build 3.2.0.CR1 (rev5976) +============================= +** Bug + * [NH-2118] - GroupBy without Select doesnt work + * [NH-2387] - Postgres - Unable to run LINQ query using boolean predicate - ERROR: 42883: operator does not exist: boolean = integer + * [NH-2435] - No order by clause generated with self referencing orderby clause. + * [NH-2583] - Query with || operator and navigations (many-to-one) creates wrong joins + * [NH-2773] - ProxyObjectReference creates a new ProxyFactory for each deserialization which disables proxy caching + +** Improvement + * [NH-2748] - Support % operator + +** Patch + * [NH-2774] - Perf - reusing same regex object in joinwalker objects + +Build 3.2.0.Beta2 (rev5964) +============================= +** Bug + * [NH-2206] - Cast is not supported by the new Linq provider + * [NH-2213] - CLONE -Wrong parameters order in IQuery with SetParameterList and Filter. SQL Server 2005 + * [NH-2296] - Subselect fetching strategy with a "SetMaxResults" query generates *extremely* inefficient sql + * [NH-2317] - Select after Take does not work properly + * [NH-2318] - Template functions fail with certain combinations of arguments. + * [NH-2328] - Linq query on fails + * [NH-2415] - HQL parameters not converted correctly to SQL + * [NH-2657] - OrderBy After Cast Not Working + * [NH-2662] - Casting a joined alias in QueryOver loses alias context and looks for property on QueryOver root + * [NH-2700] - SqlFunctionProjection does not honor parameter order + * [NH-2701] - Cannot use Linq Skip() in conjunction with FetchMany and ToFuture + * [NH-2703] - Using a "with" restriction in outer joins result in wrong SQL + * [NH-2708] - Cast<>() with a where clause fails with a NotSupportedException + * [NH-2712] - Linq query doesn't support enums in VB.NET + * [NH-2717] - Count() after Cast<>() causes InvalidOperationException + * [NH-2729] - Parameter values are not set using OffsetStartsAtOne + * [NH-2733] - Using an expression in QueryOver gives: Lambda Parameter not in scope + * [NH-2736] - Inverted parameters in HQL statement using take + * [NH-2739] - Can't get ByCode mapping to produce not nullable varbinary(max) + * [NH-2741] - CLONE -HQL .class query on mapping does not work + * [NH-2746] - Invalid SQL generated for MSSQL when using Filter and paging subquery together [regression from 2.1] + +** Improvement + * [NH-941] - One-Many Requiring Nullable Foreign Keys + * [NH-1050] - Unidirectional One To Many Without Nullable Foreign Key + * [NH-2070] - Better error message for "object references an unsaved transient instance" + * [NH-2427] - Support querying HasValue on Nullable types + * [NH-2683] - Add common dialect functions as extension methods for QueryOver + * [NH-2702] - Support HQL pagination with parameters + * [NH-2728] - ManyToAny missing from ICollectionElementRelation + * [NH-2732] - Dialect.GetLimitString simplifications and improvements + * [NH-2738] - Exception thrown when mapping contains empty enum + * [NH-2749] - Externalize Remotion.Linq namespace + * [NH-2753] - one-shot-insert for and for unidirectional one-to-many + * [NH-2760] - Unable to order by sub-collection's count + * [NH-2770] - Property spelling of IDbIntegrationConfigurationProperties.LogFormatedSql + +** New Feature + * [NH-2616] - Support Trim() function in Linq + +** Patch + * [NH-2125] - Solution for NH2123 - Subselect in combination with a disjuction query causes an enormous memory cons + * [NH-2363] - Patch for ComponentCollectionCriteriaInfoProvider, fixed persister.ElementType cast in constructor. + +Build 3.2.0.Beta1 (rev5839) +============================= +** Bug + * [NH-2404] - Future queries crash (MultiQuery) when using projection queries using hql + result transformer or the linq provider (which compiles into hql) + * [NH-2421] - NotSupportedException text in ToFuture and ToFutureValue does not make sense (or help) + * [NH-2422] - ToFuture throws NotSupportedException on IQueryable if Fetch is used. + * [NH-2559] - NH 3.0 Linq Provider : Issue using multiple filters on the same entity + * [NH-2615] - Linq Fetch cannot traverse through components + * [NH-2690] - Linq Select() broken with .ToFuture() + * [NH-2691] - Linq LongCount() behavior different from Count() + * [NH-2697] - Named parameter not found in HQL with mapping using "entity-name" + * [NH-2698] - Proxying fails for methods with generic type constraints + +** Improvement + * [NH-2568] - Create Custom Persister for Collection Type inherited from OneToManyPersister + * [NH-2695] - update default driver of firebird dialect to FirebirdClientDriver (FirebirdDriver is obsolete) + +** New Feature + * [NH-2699] - Sql Azure dialect + +Build 3.2.0.Aplha3 (rev5803) +============================= +** Sub-task + * [NH-1344] - QueryTranslator: Invalid Cast to object array when using IResultTransformer + * [NH-1642] - one-to-many collection doesn't work if the child is mapped using table per class + +** Bug + * [NH-1090] - Query cache does not work when using Criteria API to create a projection query with a result transformer + * [NH-1747] - Lazy load failure on items using if FK for bag is in the secondary table + * [NH-2510] - Lazy-loading doesn't work with cache + * [NH-2569] - IDGeneratorBinding seems broken when mixing schemas + * [NH-2587] - .Cacheable().Fetch() throws 'Exception occurred getter of xxx' + * [NH-2661] - NHibernate cannot handle SQL Server TIME columns when built with the .NET 4 framework + * [NH-2673] - Nhibernate 2nd level cache and Result transformer + * [NH-2685] - Unnecessary proxy initialisation in CriteriaQueryTranslator + * [NH-2686] - Embedded ResultsTransformers should implements Equals/GetHashCode + +** Improvement + * [NH-2505] - Querries with WHERE containing SQL Server 'bit' datatype produce CASE construction + * [NH-2551] - Bad code practice. Function SessionFactoryImpl.GetImplementors: if type not found - value from ReflectHelper.ClassForFullName returns through TypeLoadException. + * [NH-2670] - Stateless Session load no-lazy collection + * [NH-2684] - More simple way to add NamedQueries by-code + +** New Feature + * [NH-2674] - QueryOver doesn't have support for entity-name + +** Patch + * [NH-2669] - Patch to prevent "NHibernate.AssertionFailure: possible non-threadsafe access to the session" error caused by stateless sessions + +Build 3.2.0.Aplha2 (rev5715) +============================= +** Bug + * [NH-2540] - Linq generates invalid boolean case statements (was: Linq ignoring configured query-substitutions) + * [NH-2640] - HQL Having clause is ignored without preceeding group by + * [NH-2641] - HQL does not throw exception on unexpected trailing tokens + * [NH-2642] - BatcherDataReaderWrapper.GetValue has a typo + * [NH-2643] - MSSQL configuration template is still using "use_outer_join" + * [NH-2652] - SchemaMetadataUpdater does not take Dialect default properties + +** Improvement + * [NH-2644] - schemaaction is not supported in joinedsubclass + +** New Feature + * [NH-2533] - Support paging in HQL + +** Task + * [NH-2653] - Remove just added ExpressionTreeVisitor class + +Build 3.2.0.Aplha1 (rev5664) +============================= +** Bug + * [NH-1925] - Wrong SQL aliases generated for HQL subselect + * [NH-2480] - AssertByIds test function with unordered Ids + * [NH-2488] - Subclass join does not exclude lazy properties + * [NH-2489] - AbstractPersistentCollection.ReadElementByIndex gives wrong result for missing element with lazy="extra" + * [NH-2490] - Mapping.Join.IsLazy always returns true + * [NH-2491] - ObjectNotFoundException in HQL query when referencing joined subclass + * [NH-2498] - Lazy="no-proxy" does eager load + * [NH-2554] - NHibernate Formula doesnt recognize varbinary as a keyword on Sql Server 2008 or 2008 R2 + * [NH-2565] - session.Persist does not work with entities with lazy properties (no-proxy) + * [NH-2584] - An entity with a lazy property cannot be saved in new session + * [NH-2603] - lazy="extra" return different count than initialized collection. + * [NH-2604] - Problem with MSTest and Relinq (possibly due to ILMerge) + * [NH-2607] - Proxifier should not try to proxy sealed and non public methods + * [NH-2610] - ISQLExceptionConverter doesn't work with MultiCriteria and MultiQuery + * [NH-2622] - Proxying fails for methods with out and ref arguments + * [NH-2626] - LinqExtensionMethods.Query implements wrong NhQueryable + * [NH-2627] - Cloning subcriteria loses WithClause + * [NH-2628] - Fails to create proxy for class with method that has argument "ref of Dictionary" + * [NH-2632] - Lazy Properties Causing An Exception If Containing Class Is Set To Not Lazy + * [NH-2633] - MapperByCode don't Register Component + +** Improvement + * [NH-1513] - MultiCriteria, MultiQuery improvements + * [NH-2382] - HQL, Criteria, QueryOver need Set methods for all NHibernate types + * [NH-2418] - Dialect.IsQuoted fails on empty name + * [NH-2495] - Support ISqlQuery in MultiQuery + * [NH-2518] - disable/truncate SQL parameter logging of BLOBs + * [NH-2526] - Sybase ASE 15 support + * [NH-2530] - Include WHERE clause in error message if we aren't able to locate a 'High' value + * [NH-2531] - NHibernate.Impl.CriteriaImpl.cs: Fix for possible ArgumentNullException in sub-criteria alias handling + * [NH-2550] - Allow public access to FieldInterceptor Session + * [NH-2563] - Support calls to ToString() in Linq queries + * [NH-2570] - Full SQLite Support + * [NH-2573] - Ability to retrieve longest registered type for a specified DbType + * [NH-2580] - "Unable to locate persister" exception message should be more helpful + * [NH-2586] - Default ProxyFactory + * [NH-2592] - Add ICriteria functionality missing in QueryOver + * [NH-2593] - Default common values per dialect + * [NH-2601] - Remove Dialect.HasAlterTable + * [NH-2605] - Refactorize MultiQuery/MultiCriteria implementation to delegate responsibility to IDrive + * [NH-2612] - Move the lambda con to the same namespace than Configuration + * [NH-2630] - Truncate SQL parameter logging of very long strings + +** New Feature + * [NH-2015] - Implement Hibernate's Order.IgnoreCase() + * [NH-2426] - postgresql schema metadata + * [NH-2591] - Insert ordering + * [NH-2602] - Mapping node in collection, subclass, join and so on + * [NH-2635] - Mapping by code + +** Patch + * [NH-2548] - HQL Select Clause Parameters + * [NH-2590] - Missed registration of Concat function for SQLCE4 + * [NH-2600] - Increase visibility of components in AbstractPersistentCollection + +** Task + * [NH-2561] - Consider current_timestamp semantics + * [NH-2575] - Update documentation for immutable classes + * [NH-2608] - Integrate Remotion 1.13.100 to fix duplicate mscorlib problem + * [NH-2636] - Expose ExpressionTreeVisitor Members + +Build 3.1.0.GA (rev5425) +============================= + +** Known BREAKING CHANGES from NH3.0.0.GA to NH3.1.0.GA + + ##### Design time ##### + * [NH-2481] - Deprecated: ISession.SaveOrUpdateCopy methods - use ISession.Merge methods instead + + ##### Run time ##### + * [NH-2481] - An exception will now be thrown when an entity references a transient entity and cascade="merge|all" is not configured on the association + + ##### Possible Breaking Changes ##### + * [NH-2461] - Signature change for IQuery.SetParameterList + * [NH-2556] - NH is too tolerante to incorrect naming when access="field.XXX" is used + +** Sub-task + * [NH-2525] - Wrong parameter used for limit claues in MySQL + +** Bug + * [NH-1985] - NHibernate is allowing deletion of immutable objects + * [NH-2037] - Reattaching an entity with many-to-one inside a natural-id + * [NH-2130] - Reporting query containing sum crashes when there are no rows + * [NH-2179] - String constants are not useable in Linq query projection + * [NH-2203] - problem with orderby in linq query + * [NH-2280] - LINQ Query on Composite key creates invalid SQL + * [NH-2311] - .Any() extension method does not work in most cases + * [NH-2362] - GroupBy with multiple fields fails with exception + * [NH-2375] - OfType with a where clause fails with a NotSupportedException + * [NH-2381] - Fetch clause fails with a NotSupportedException + * [NH-2386] - Unecessary update / invalid SQL generated when collection updated with a versioned (generated) parent entity + * [NH-2400] - Linq query fail when using contains from an empty Collection + * [NH-2407] - Linq provider doesn't support enums in VB.NET + * [NH-2412] - OrderBy generates an inner join instead a left join + * [NH-2433] - When using extensions methods with generic parameters the provider uses the first use even if the generic parameter is different. + * [NH-2441] - Logical bool values are not mapped properly (query execution returns incorrect result with SQLite) + * [NH-2443] - Error compiling NH with ShowBuildMenu.bat -> Cannot run Tests + * [NH-2450] - Multi Query in MySQL no longer working in 3.0 (was in 2.1) + * [NH-2459] - LINQ provider query plan cache issue with use of type check expression .Where(o=>o is SomeType) + * [NH-2460] - version generator is not working with DateTime2 data type. + * [NH-2464] - NHibernate DLLs not built with optimization in 'release' mode. + * [NH-2467] - Futures in 3.0.0.GA go bananas when using PostgreSQL + * [NH-2470] - PersistentIdentifierBag not creating snapshot correctly for new collections. + * [NH-2482] - SerializationException when writing object to viewstate + * [NH-2484] - Regression - Binary Blob SerializationException - MSSQL 2k8 / varbinary(max) + * [NH-2499] - Case statement does not handle multiple when clauses + * [NH-2501] - Case statement does not allow a parameter in the first then clause + * [NH-2503] - HQL subselect with addition fails + * [NH-2507] - LINQ queries tha compare enumeration values with /checked+ compiler option throw NotSupportedException + * [NH-2512] - QueryOver with Where clause and Take crashes + * [NH-2524] - Linq converts enums to integers prematurely + * [NH-2529] - Linq on Informix using take gives an exception + * [NH-2536] - Second call to OfType don't change the query + * [NH-2543] - IQueryOver support is not implemented for IStatelessSession + * [NH-2549] - Disposing an Stateless Session that has already been closed causes a SessionException + * [NH-2555] - Linq with Contains doesn't work with read only collections + * [NH-2556] - NH is too tolerante to incorrect naming when access="field.XXX" is used + +** Improvement + * [NH-1342] - Very slow inserts for large BLOB + * [NH-2023] - Batch operations - introduce SetBatchSize for IStatelessSession + * [NH-2098] - Support for transaction isolation levels in stateless sessions. + * [NH-2211] - Stateless Session Linq Support + * [NH-2228] - Cascading StaleStateException doesn't show which Entity caused the problem + * [NH-2425] - Cache the XmlSerializer for HbmMapping class + * [NH-2449] - Add IStatelessSession.BeginTransaction(IsolationLevel) Method + * [NH-2454] - Add auto-quote settings to main documentation + * [NH-2455] - Centralization of proxy check to IProxyFactoryFactory (better support for static proxy) + * [NH-2457] - Ability to use DetachedCriteria from stateless session + * [NH-2461] - Allow parameter list as ienumerable and simplify IQuery + * [NH-2471] - ShowBuildMenu.bat and Windows XP + * [NH-2481] - Merge can fail when there is a transient entity reachable by multiple paths and at least one path does not cascade on merge + * [NH-2502] - Fetch/Cacheable Should be Allowed to be Called Anywhere + * [NH-2508] - Deprecate the ISession.SaveAndUpdateCopy API + * [NH-2522] - ILMerge Antlr and ReLinq + * [NH-2537] - Implement camelcase-m-underscore naming strategy + * [NH-2557] - Improves log message, of CustomType not serializable, by adding additional data + +** New Feature + * [NH-908] - Implement read-only entities + * [NH-2410] - Port from Hibernate + +** Patch + * [NH-2153] - Unused parameter in SetCommandTimeout method in DriverBase + * [NH-2172] - Unrecognised method call in expression when using QueryOver queries in VB.Net + * [NH-2445] - Add IStatelessSession.IsOpen and IStatelessSession.IsConnected + * [NH-2473] - EntityName + inheritance doesn't work + * [NH-2474] - Xsd for on subclass missing + * [NH-2478] - Docs for + * [NH-2513] - SetMaxResults issue with DB2400Dialect + +** Task + * [NH-2506] - Fix first example of ternary association in documentation + * [NH-2541] - Upgrade ReLinq to 1.13.93 + +Build 3.0.0.GA (rev5290) +============================= +** Known BREAKING CHANGES from NH2.1.1.GA to NH3.0.0.GA + + ##### Design time ##### + * [NH-2392] - ICompositeUserType.NullSafeSet method signature changed + + ##### Run time ##### + * [NH-2199] - null values in maps/dictionaries are no longer silenty ignored/deleted + * [NH-1894] - SybaseAnywhereDialect has been removed, and replaced with SybaseASA9Dialect. + - Sybase Adaptive Server Enterprise (ASE) dialects removed. + + ##### Possible Breaking Changes ##### + * [NH-2251] - Signature change for GetLimitString in Dialect + * [NH-2284] - Obsolete members removed + * Related to [NH-2358]: DateTimeOffset type now works as a DateTimeOffset instead a "surrogate" of DateTime + +** Bug + * [NH-2222] - Wrong type for constant/parameter value used + * [NH-2234] - Query on Property mapped with IUserType + * [NH-2244] - Linq provider does not has full supporting of components in queries. + * [NH-2370] - NHibernate.Linq simple where clause results in a table scan. + * [NH-2394] - Comparing an enum (stored as a string with a user type) to an enum literal fails + * [NH-2398] - Null equality uses non-boolean expression + * [NH-2402] - LINQ equality should map to SQL equality + * [NH-2403] - Linq boolean constants are of wrong type (integer) + * [NH-2409] - Using WithClause in Criteria API causes NH to mix up query parameters + * [NH-2416] - NHibernate.Linq does not support queries against elements + * [NH-2417] - NHibernate fails to correctly load a child collection if the parent contains a many-to-one + * [NH-2420] - Cannot use distributed transactions while providing connection to the session + * [NH-2438] - LINQ 'in' query not fully interpreted + +** Improvement + * [NH-2423] - NHibernate.Linq queries against Dictionaries with ContainsKey + + +** Patch + * [NH-2413] - Micro optimization in DefaultFlushEntityEventListener + * [NH-2437] - Typo + +Build 3.0.0.CR1 (rev5265) +============================= + +** Bug + * [NH-1897] - boolean discriminator formulas broken on PostgreSQL + * [NH-2154] - Booleans may not be used in expression HQL in PostgreSQLDialect + +** Patch + * [NH-2392] - ICompositeUserType support for cases where not all parameters should be set (such as dynamic-update) + +Build 3.0.0.Beta2 (rev5254) +============================= + +** Bug + * [NH-1155] - SubselectFetch doesn't take into account paging + * [NH-2371] - Exception is thrown when using SetMaxResults on query using MySQL + * [NH-2374] - ForeignGenerator does not support EntityMode.Map + +** Improvement + * [NH-1799] - Change SQL Server dialect to support variable limits + * [NH-2376] - Allow IDisposable for event-listeners + +** Patch + * [NH-2342] - Added XDocument type + * [NH-2378] - Don't currently support idents of type Int16 + * [NH-2391] - Updated Chapter 4 + +Build 3.0.0.Beta1 (rev5241) +============================= + +** Bug + * [NH-2001] - Filter by Null in Linq (hql ast version) doesn't work + * [NH-2077] - SQL Server Dialect: Nhibernate fails to execute native queries with parameters, separated with ';' + * [NH-2084] - Future + hql queries + same parameter name leads to "NHibernate.QueryException: The named parameter personId was used in more than one query. Either give unique names to your parameters, or use the multi query SetParameter() methods" + * [NH-2331] - ICriteria: Correlated query throws "Could not find a matching criteria info provider to", works in 2.1.0 broken in 2.1.2 + * [NH-2352] - Null reference exception in GetDefaultConfigurationFilePath when AppDomain.CurrentDomain.RelativeSearchPath is null + * [NH-2358] - DateTimeOffsetType doesnt properly convert to-from database; milliseconds are lost. + * [NH-2364] - Dynamic entities with "full name" result in incorrect queries + +** Improvement + * [NH-1108] - Reference Data - Ability to load all rows from a table using an HBM file. + * [NH-2313] - Better logging when SessionFactory is being built + * [NH-2355] - Allow composite-id without class on dynamic entity + +** New Feature + * [NH-2309] - Add support for Future() with the new Linq provider + * [NH-2367] - Native support for System.Uri as string + +** Patch + * [NH-2073] - Missing QuerySequencesString override in FirebirdDialect + * [NH-2082] - AdoTransaction sometimes writes to log wrong information about IsolationLevel + * [NH-2357] - Support for custom boolean functions in the linq provider (as FREETEXT). + + +Build 3.0.0.Alpha3 (rev5226) +============================= + +** Bug + * [NH-1927] - Criteria generates wrong sql when eager fetching one-to-many with filter + * [NH-1928] - SQL line comments swallow next line + * [NH-2024] - Max results parameter could not provided to subquery + * [NH-2061] - Merge operation causes null exception for null components that contain many-to-many relations + * [NH-2096] - IndexOutOfRangeException reading zero-length binary value from MySQL + * [NH-2112] - Update executed on the DB during a Session.Merge of an unmodified entity + * [NH-2138] - Entity name support in custom SQL is broken: sql-query/return/@entity-name attribute is ignored + * [NH-2147] - default_batch_fetch_size has no effect + * [NH-2188] - Exception occurs when configuration searches default config file and multiple search path were defined for current AppDomain. + * [NH-2202] - Unable to use ICriteria with projection property that references a composite key relationship + * [NH-2258] - Paging params in subquery breaks query execution. + * [NH-2265] - Any linq query using oracle fails when restricting the number of results returned + * [NH-2270] - NHibernatethrows MappingException on Linux/Mono 2.7 + * [NH-2279] - PersistentIdentifierBag fails to maintain ID map in many cases + * [NH-2288] - The drop scripts from SchemaExport in SQL2005 dialect will not work for constraints when using DefaultSchema setting other than dbo + * [NH-2289] - Linq query fail when using contains from ICollection or IList + * [NH-2302] - MsSql Dialect, mapping an nvarchar(max) using string(10000) causes string truncation + * [NH-2303] - Regression bug: hibernate-mapping/subclass element can no longer extend hibernate-mapping/class//subclass element + * [NH-2322] - Performing updates in OnPostUpdate event causes enumeration error + * [NH-2339] - After rev 5139 (apply NH-2335) NHibernate does not work under Medium Trust + * [NH-2343] - NHibernate.Type.GenericBagType.Wrap() incorrectly assumes collection implements IList + * [NH-2344] - Coalesce expression does not work on linq provider + +** Improvement + * [NH-626] - Adding XmlDoc to NH types + * [NH-1618] - Lazy loading for one-to-one association + * [NH-1894] - New SQL Anywhere NHibernate dialect + * [NH-2135] - Compatible with Mono + * [NH-2292] - Set Initialize in AbstractLazyInitializer as virtual + * [NH-2301] - Castle Bytecode with last released 2.5 + * [NH-2321] - Recommended method for xml intellisense + * [NH-2340] - Workaround, for some DataProviders, in AbstractCharType for char? + +** New Feature + * [NH-866] - SQL Server 2005 XML Support + * [NH-2348] - Support polymorphism with Get and Load + +** Patch + * [NH-2006] - Additional test to use-many-to-one + * [NH-2111] - PersistentIdentifierBag has null reference exception when accessing SyncRoot on lazy loaded collection + * [NH-2278] - PersistentGenericIdentifierBag instantiates wrong list type + * [NH-2284] - Obsolete members can be removed + * [NH-2293] - When query has only a "from" throw QuerySyntaxException instead of InvalidCastException + * [NH-2307] - Fix ByteCode Framework Targets + * [NH-2332] - Update SybaseAnywhereMetaData.cs to support fetching the reserved words + * [NH-2335] - ReflectiveHttpContext support for different .NET versions + * [NH-2336] - Leading and trailing ansi trim emulation functions are reversed + * [NH-2346] - Dialect.TableTypeString is not used when creating schema. + +** Task + * [NH-2161] - Breaking change in naming strategy from 2.0 to 2.1 + * [NH-2315] - Spring version does not match antlr version + * [NH-2338] - Upgrade to Castle.Core 2.5.1 + +Build 3.0.0.Alpha2 (rev5159) +============================= + +** Bug + * [NH-1653] - SubqueryExpression don't support Dialect with VariableLimit + * [NH-1836] - AliasToBean transformer doesn't work correctly with MultiQuery + * [NH-2133] - Incorrect number of command parameters + * [NH-2148] - Not possible to call methods on Proxy for lazy-property + * [NH-2149] - CAST() statements fail in MySql due to invalid type parameters + * [NH-2158] - NVL Sql Function is broken + * [NH-2160] - MSSql DateTime2 type is not supported when preparing + * [NH-2162] - Formulas containing a DateTime data type incorrectly have that data type aliased with the outer entity alias + * [NH-2224] - SQLite 'In'-Restriction with year function + * [NH-2245] - AbstractEntityPersister ignores optimistic-lock when generating delete SQL on versioned objects + * [NH-2251] - System.FormatException mixing Future and Skip/Take + * [NH-2253] - SchemaExport/SchemaUpdate should take in account hbm2ddl.keywords + * [NH-2257] - Parameter ordering not working when driver does not support Named Parameters + * [NH-2261] - Linq Count function fails with MySQL Dialect + * [NH-2273] - SqlClientBatchingBatcher doesn't set timeout on batches after the first + * [NH-2277] - NHibernate.Linq - Eager Fetching Superclass Collection Throws NullReferenceException. + +** Improvement + * [NH-1378] - New Drivers using ADO.NET's DbProviderFactories + * [NH-1421] - Better exception message for Invalid handling of empty parameter lists + * [NH-2103] - Expose hbm mappings + * [NH-2117] - many-to-one mapping with composite-id formula fails + * [NH-2191] - Make a method FilterFragment of class AbstractEntityPersister a virtual + * [NH-2217] - LinFu version 1.0.3 used is not thread-safe. (new LinFu1.0.4 available) + * [NH-2220] - Support temporary tables within SQLite Dialect + * [NH-2226] - Set custom bytecode provider type in app.config + * [NH-2263] - Client Profile Support + * [NH-2266] - better exception if no concrete subclasses exist + * [NH-2267] - Prepared statements should be enabled for PostgreSQL + * [NH-2268] - Substring and Replace functions for PostgreSQLDialect + * [NH-2287] - Wrong HQL should throws QuerySyntaxException + +** New Feature + * [NH-1135] - Local & Utc DateTime Type + * [NH-1554] - Logging Abstraction + * [NH-1946] - Criteria API support for HQL 'with' clause + * [NH-2256] - Add support for user-provided extensions to the Linq provider + * [NH-2259] - Add a way to reset the Any cached type + +** Patch + * [NH-2026] - Fix: SchemaExport fails with foreign key constraints on Informix + * [NH-2120] - CsharpSqlite managed/embedded SQL database driver + * [NH-2142] - Register function Concat fo MySql to avoid null problem + * [NH-2190] - Criteria Join Restrictions Support (HHH-2308 Port) + * [NH-2252] - Added paging support for SQL CE 4 + * [NH-2255] - MsSql2005Dialect resets parameters' positions(for paging parameters) when lock in use. + +Build 3.0.0.Alpha1 (rev5056) +============================= + +** Sub-task + * [NH-2045] - NH 2044 Fixed + +** Bug + * [NH-892] - associated by property-ref generates wrong SQL + * [NH-1849] - Using custom sql function "contains" causes an Antlr exception + * [NH-1891] - Formula - Escape characters break formula + * [NH-1899] - SaveOrUpdateCopy throws InvalidCastException + * [NH-1902] - QBE don't set the '%' wildcards when using an other matchmode than Matchmode.Exact + * [NH-1975] - QueryOver() on char Property yields exception + * [NH-1981] - Multiple SQL parameters generated for same HQL parameter + * [NH-1989] - Future query does not use second level cache + * [NH-2009] - Many-to-one fails when using property-ref against a joined property + * [NH-2020] - ISQLExceptionConverter does not get called if batch size enabled + * [NH-2027] - NH sql-query does not support calling Stored Procedures in Packages + * [NH-2030] - NHibernate.SqlTypes.SqlTypeFactory is not threadsafe + * [NH-2035] - Wrong error "ORDER BY items must appear in the select list if SELECT DISTINCT is specified." + * [NH-2044] - NHibernate.Criterion.Expression.Eq with chartype has a bug + * [NH-2047] - OracleDataClientBatchingBatcher writes misleading log messages in a different format than SqlClientBatchingBatcher + * [NH-2052] - CLONE -Getting identifier on a proxied class initializes it when identifier is defined in parent class + * [NH-2064] - Filter definitions should not be mandatory to be used + * [NH-2069] - When touching the identifier of a proxy object a call to the database is executed. + * [NH-2074] - SQL Server Dialect: unicode literals in formula results in incorrect SQL + * [NH-2086] - MsSqlCeDialect fails when mapping contains schemas + * [NH-2090] - ShemaValidator + Firebird + * [NH-2092] - Constrained lazy loaded one to one relations using Castle DynamicProxy throws ArgumentNullException + * [NH-2093] - When using Castle:s FieldInterceptionProxy, NHibernateProxyHelper.GuessClass() cannot guess the correct entity type. + * [NH-2094] - When using Castle:s FieldInterceptorProxy, accessing an initialized property (even nonlazy) throws LazyInitializationException + * [NH-2102] - Entity with constrained, lazy one-to-one relation should not generate field intercepting proxy + * [NH-2113] - NH force eager loading of key-many-to-one entity with overriden GetHashCode + * [NH-2122] - Nhibernate documentation refers to CriteriaUtil whitch is removed from 2.1 + * [NH-2129] - FutureValue Parameters Missing Quotes + * [NH-2137] - list-index with one-to-many does not work + * [NH-2155] - NHibernate project files contain reference to missing AssemblyInfo.cs file + * [NH-2166] - Custom ISQLExceptionConverter is not called in the case when using query.UniqueResult() + * [NH-2168] - Statistics.QueryExecutionMaxTimeQueryString is empty + * [NH-2173] - SetMaxResults fails when Dialect has BindLimitParametersFirst == true + * [NH-2175] - Cannot Cache NHibernate Future Criteria Results + * [NH-2189] - Fetch Join Not Consistently Working With Future + * [NH-2192] - Thread safety issue with QueryParameters.PrepareParameterTypes + * [NH-2199] - Map with element doesn't support nullable types + * [NH-2205] - NHibernate.Loader.Loader.DoQuery can hide exceptions + * [NH-2210] - Problem with merging detached entities with components + * [NH-2219] - HQL Update of multiple columns only updates the first column + * [NH-2221] - The tuplizer value specified for a component within a HBM file is ignored + * [NH-2225] - New Embedded LINQ Provider & Bitwise Queries + * [NH-2235] - IQueryOver.SelectList uses sub-type type instead of root type + * [NH-2242] - Formula - Escape characters break formula + +** Improvement + * [NH-1248] - Check if result of Subquery is null with Criteria API + * [NH-1838] - Guid support in MySql dialect + * [NH-1850] - NHibernate should log query duration + * [NH-1862] - Strongly typed configuration of SessionFactory properties + * [NH-1877] - Support for Projections.GroupBy(IProjection projection) + * [NH-1892] - Programatic configuration of Cache + * [NH-1935] - Add new WcfSessionContext to the already available ICurrentSessionContext implementations + * [NH-2021] - Exceptions serialization + * [NH-2055] - hbm2ddl SchemaExport support batching (GO in ddl) + * [NH-2065] - provide better exception details + * [NH-2083] - Undocumented attributes on hibernate-mapping element + * [NH-2150] - CreateCriteria / QueryOver inconsistency + * [NH-2186] - Allow MultiCriteria to directly add IQueryOver + * [NH-2215] - MsSql2005Dialect does not use parameters for paging parameters + * [NH-2216] - EnumType as IType + * [NH-2230] - tag does not allow any accessor + * [NH-2249] - DateType as IParameterizedType to customize the BaseDateValue for null + +** New Feature + * [NH-429] - Lazy load columns + * [NH-1922] - Allow DetachedCriteria To Work with IStatelessSession + * [NH-1978] - Add ability to delimit aliases in generated SQL + * [NH-2152] - QueryOver equality to null should generate (x is null or x == value) + +** Patch + * [NH-2031] - Mod function in SqlDialect is broken + * [NH-2041] - SchemaExport does not export Components in Joined tables properly + * [NH-2046] - Release builds do not include PDB files + * [NH-2101] - Missing IsNotIn for WhereRestrictionOn + * [NH-2106] - DetachedCriteria.SetLockMode() is missing + * [NH-2131] - SessionIdLoggingContext perf patch + * [NH-2169] - ToUpper and ToLower functions are inverted in the new Linq provider + * [NH-2194] - NHibernate.Util.PropertiesHelper class throwing FormatException when property values are in-compatible with the expected type + * [NH-2201] - NDataReader doesn't reset the currentrow index when a move to NextResult is executed + * [NH-2227] - Missing [Serializable] attribute on ReadOnlyAccessor + * [NH-2236] - GetSequenceNextValString for Informix is wrong + * [NH-2243] - 'foreign-key' ignored in join/key + +** Task + * [NH-2013] - HQL breaking change + * [NH-2247] - Update FlushMode Documentation + +Build 2.1.2.GA (rev4854) +============================= +** Bug + * [NH-2011] - Many-to-many inside a component will not be saved when using SaveOrUpdateCopy or Merge + * [NH-2283] - CLONE -one-to-many collection with table per subclass, using discriminator: wrong proxies in collection + +** Improvement + * [NH-2022] - Allow overriding in Query By Example + +** Patch + * [NH-2007] - SesssionIdLoggingContext patch for big resultsets + * [NH-2019] - Clarification about the use of for polymorphic queries + +Build 2.1.1.GA (rev4814) +============================= + +** Sub-task + * [NH-1368] - Check same behavior for other persistent collection. + +** Bug + * [NH-1255] - key-many-to-one && not-found + * [NH-1476] - filtering by key-many-to-one causes invalid sql + * [NH-1760] - Missing table join when use a criteria on key-many-to-one part of a Composite Id + * [NH-1785] - Invalid SQL generated for join on composite id using Criteria API + * [NH-1858] - Problem with MsSql2000 and 2005 Dialects GetLimitString when using use_sql_comments=true + * [NH-1895] - delete-orphan mapping, NullReferenceException in DefaultDeleteEventListener.DeleteTransientEntity + * [NH-1898] - HQL query parser can't determine parameter type when using native sql function in hql query. + * [NH-1899] - SaveOrUpdateCopy throws InvalidCastException + * [NH-1902] - QBE don't set the '%' wildcards when using an other matchmode than Matchmode.Exact + * [NH-1904] - Protected properties and public properties cannot have the same name with different case + * [NH-1905] - Join used together with subquery generates wrong SQL + * [NH-1907] - IQuery.SetParameter should use DetermineType + * [NH-1908] - Mishandling of filter parameters causes System.InvalidCastException + * [NH-1911] - Aggregate parameters in projection are not substituted + * [NH-1913] - AdoNet batcher not using CommandTimeout + * [NH-1914] - Collections with out native ID generation is not working + * [NH-1915] - CLONE -HQL AST-Parser: Null-Pointer Exception on Non-Exsistant Entity on Joins + * [NH-1917] - Not retrieving AUTO_INCREMENT identifier on MySQL because of connection closing + * [NH-1920] - Session Filters + collection + parametrized query = bug + * [NH-1926] - Oracle: Schema update crashes + * [NH-1931] - NativeSQLQuerySpecification.Equals compares collections by reference + * [NH-1938] - No 'lower' call in sql-query in LikeExpression with 'ignorecae' = true + * [NH-1939] - Missing element in NHibernate mapping schema. + * [NH-1941] - Custom Enum-String mapping is not written to SQL statement + * [NH-1948] - Hibernate mapping file does not allow a value of 0 for the "scale" attribute of the "property" element + * [NH-1959] - Adding/Removing items to idbag in one transaction causes KeyNotFoundException + * [NH-1963] - System.InvalidCastException on cacheable query with byte array query parameter + * [NH-1964] - Byte array truncation to a length of 8000 + * [NH-1969] - Criteria API does not handle property of type "System.Type" correctly + * [NH-1973] - DateTime sent to dataase is not accurate to millisecond + * [NH-1979] - cast and parameter combination in HQL fails to parse + * [NH-1983] - Blobs and Clobs with Sql Server CE + * [NH-1985] - NHibernate is allowing deletion of immutable objects + * [NH-1987] - MultiQuery does not update statistics + * [NH-1990] - Subquery filter parameters are not set as variables in SQL + * [NH-1992] - BasicFormatter throws exceptions for certain types of data + * [NH-1997] - Original exception information lost when error occurs NHibernate.Engine.TransactionHelper.Work.DoWork + * [NH-2000] - Problem when calling ISession.GetEnableFIilter with a not enabled filter name + * [NH-2003] - IsNullable property is not set properly in ClassIdBinder.cs + +** Improvement + * [NH-847] - Oracle stored procedure with Ref Cursor out + * [NH-1525] - IResultTransformer should override Equals and GetHashCode + * [NH-1912] - Add decimal types to MySQL dialect. + * [NH-1943] - Fix introduction in docs so it won't mention VS 2003 + * [NH-1980] - Ignore exception when trying to set the same type of CollectionTypeFactory + +** New Feature + * [NH-1922] - Allow DetachedCriteria To Work with IStatelessSession + * [NH-1936] - Introduce new Interface IPostEvent in NHibernate.Event + * [NH-1998] - Possibility to turn off many-to-one filters + +** Patch + * [NH-1903] - GetEnumerator().Current inconsistent for generic + * [NH-1970] - SQLite dialect - Fix to substring function + * [NH-1993] - Patch for a bug in MySQLMetaData.cs + +Build 2.1.0 +======================== +** Known BREAKING CHANGES from NH2.0.xGA to NH2.1.0 + ##### Run time ##### + * If you want work using lazy loading with LinFu.DynamicProxy now you must deploy NHibernate.ByteCode.LinFu.dll + * If you want work using lazy loading with Castle.DynamicProxy2 now you must deploy NHibernate.ByteCode.Castle.dll + * If you want work using lazy loading with Spring.Aop now you must deploy NHibernate.ByteCode.Spring.dll + * compatible only with .NET2.0 SP1 or above (System.DateTimeOffset) + * In SchemaExport.Execute the parameter "format" was removed; (NH-1701) enabled configuration property format_sql (default true) + * Antlr3.Runtime.dll is required + * the syntax foo.bar.baz.elements or foo.bar.baz.indices is not longer supported. Use the alternative syntax of elements(foo.bar.baz) or indices(foo.bar.baz) instead + Note: in some case, where a sub-select is needed, the collection is enough example: FROM m IN CLASS Master WHERE NOT EXISTS( FROM m.Details d WHERE NOT d.I=5 ) + * INamingStrategy.PropertyToColumnName does not include the component property path + + ##### Possible Breaking Changes ##### + * ISession interface has additional methods + * ICriteria.SetProjection now takes a params array of projections, instead of a single projection + Only a breaking change if you are implementing ICriteria, there is full source code compatability + * IStatelessSession interface has additional methods + * DefaultProxyFactoryFactory removed + * IProxyFactoryFactory now provide the IProxyValidator implementation + * Now filters are working even with many-to-one association for Criteria and HQL (NH-1293, NH-1179) + + ##### Initialization time ##### + * The ProxyValidator check for "internal virtual" (to be intercepted by proxy need "protected internal virtual") + * The session-factory configuration property "proxyfactory.factory_class" is mandatory; You must choose one of the availables NHibernate.ByteCode + + ##### Breaking Changes ##### + * see NH-1633 if you are using SQL native queries + * CriteriaUtil is gone. NHibernate.Transform.Transformers now returns predefined IResultTransformer. + * ISessionFactory.Settings is gone (moved to ISessionFactoryImplementor.Settings) + * Obsolete ORACLE dialects was removed (new implementations are available) + * ISQLExceptionConverter was changed in order to have more flexibility about information available for the conversion and followed management. + * ADOException now use string instead SqlString + * IParameterizedType is using IDictionary + +Build 2.1.0.Beta2 (rev4501) +============================= +** Sub-task + * [NH-1827] - SchemaUpdate exception + * [NH-1843] - Precision and scale for MySQL is not working, too + +** Bug + * [NH-1734] - NHibernate aggregate function sum() to return Int64 instead of floating point value + * [NH-1810] - Use of custom sorted set leads to "collection not processed by flush" exception + * [NH-1812] - Aggregates + IsNull bug (AST parser) + * [NH-1821] - Wrong SQL executed when the SQL contains new lines + * [NH-1822] - CLONE -NHibernate.Util.TypeNameParser doesn't parse correctly generic types + * [NH-1830] - Missing MatchMode Parameter + * [NH-1831] - AST Parser & Bitwise queries + * [NH-1834] - Formula node in Many-To-One is ignored + * [NH-1835] - prepare_sql = true (creating prepared queries) makes NHibernate set up wrong size for byte arrays larger than 8000 + * [NH-1837] - UniqueResult() executes sql query twice. + +** Improvement + * [NH-473] - order-by in is ignored if FetchMode is Join + * [NH-1069] - Add context information to LazyInitializationException. + * [NH-1097] - Should not parse column names, and consider them as failing HQL queries + * [NH-1192] - Support bitwise operations + * [NH-1266] - ISQLExceptionConverter for various Dialects + * [NH-1672] - Unnecessary calls to planCache.Put + * [NH-1820] - PostgreSQL: support for Temporary Tables + * [NH-1824] - MySQL: support for Temporary Tables + * [NH-1826] - PostgreSQL: support iff() function + * [NH-1833] - OverflowException instead of expected FormatException when trying to parse a "long" literal + * [NH-1846] - DbTimestampType (from H3.3.1) + +** New Feature + * [NH-1623] - Configuration of UserCollection for any collection type + * [NH-1817] - Allow for Id generator class + +** Patch + * [NH-1829] - AbstractEntityPersister.Delete is not virtual + * [NH-1842] - Type.CharBooleanType.ctor(SqlType) is internal for no reason. Making it protected supports better extensibility. + + +Build 2.1.0.Beta1 (rev4424) +============================= +** Bug + * [NH-959] - HQL queries with math operators and aggregates fail + * [NH-1092] - An Aggregate Count(*) on on an Abstract Base Class (Polymorphic) with UniqueResults returns 1 result per subclass when using the table per subclass approach + * [NH-1171] - Named parameters in SQL query are not substituted when query contains comments with apostrophes + * [NH-1182] - Calling session.delete() causes unnecessary update to timestamp before sql:delete + * [NH-1400] - HQL string literals with dots in are tried loaded as types (classes) and fails + * [NH-1427] - XML Comments inside tag cause exception + * [NH-1444] - broken implicit join + * [NH-1487] - schema generation of unique-key with column involved in multiple unique constraints + * [NH-1507] - NHibernate misplaces JOIN conditions when WHERE references their columns and others altoghether + * [NH-1517] - SaveOrUpdateCopy does not call "public LifecycleVeto OnUpdate(ISession s)" + * [NH-1601] - Problems when accessing lists through property + * [NH-1617] - Formulas containing a data type incorrectly have that data type aliased with the outer entity alias + * [NH-1735] - TicksType used as entity version causes exceptions on cache put operation. + * [NH-1789] - A proxy sometimes doesn't call the overriden Equals() method (mapping interface instead class) + * [NH-1801] - Cross join with a where clause where lhs and rhs are different types of associations breaks with the new AST Query Translator + * [NH-1802] - Query Cache does not include filters in QueryKey.ToString + * [NH-1805] - Does ignore on + * [NH-1813] - Not understandable exception message + +** Improvement + * [NH-1019] - Improve error message for HQL in when entity not recognised + * [NH-1814] - Autoregister ReservedWords from MetaData + +** New Feature + * [NH-188] - Should Table/Column names be quoted automatically? + +** Patch + * [NH-1044] - IdBag for component not in XSD + * [NH-1804] - Expiration property of session factory not handled when configured via XML + +Build 2.1.0.Alpha3 (rev4378) +============================= + +** Bug + * [NH-1098] - Problem in filters with parameters and associated logging information + * [NH-1179] - Filter not applied in explicit join + * [NH-1264] - Eager fetching with Criteria/DetachedCriteria does not seem to be working properly + * [NH-1307] - Parameter Postion incorrect in the sql query . + * [NH-1343] - In HQL, when having only one Class for query it fails to work if we forget the Alias. + * [NH-1388] - Map does not delete keys if value of the key is null + * [NH-1574] - Stateless Session isn't ignoring untouched proxy properties on update + * [NH-1725] - When using SELECT NEW (iif(a=0, 2, 1)) From .... Returns error '(' expected after HQL function in SELECT + * [NH-1727] - Hql parameter problems (Sql2005dialect) + * [NH-1736] - NHibernate.Util.TypeNameParser doesn't parse correctly generic types + * [NH-1741] - DetachedNamedQuery is ignoring mapped properties + * [NH-1742] - Wrong parameters order in IQuery with SetParameterList and Filter. SQL Server 2005 and SQL Server 2000 + * [NH-1744] - Open/Close a session inside a TransactionScope fails. + * [NH-1751] - DistinctRootEntityResultTransformer assumes source ILists are always ArrayLists + * [NH-1754] - cast HQLFunction don't cast the result + * [NH-1756] - Updating newly saved entity with generated version causes StaleObjectStateException (explicit flush before commit) + * [NH-1764] - TableHiLoGenerator fail in a TransactionScope with MySQL database + * [NH-1767] - Multiple TransactionScopes inside one Session do not work properly + * [NH-1770] - Not posible to have system properties in web.config and session-factory properties in external hibernate.cfg.xml + * [NH-1773] - HQL Queries with projection and join fetching fail with AST query translator + * [NH-1775] - AST Parser & Bitwise queries + * [NH-1776] - Query executed twice on session with enabled Filter will cause NullReferenceException + * [NH-1780] - Section 18.4 - Incorrect method name IsUnsaved() + * [NH-1788] - Dynamic Update & generated timestamp cause NH to try to update the readonly timestamp column + * [NH-1792] - Invalid Sql for Paging when Subquery contains Order By clause using MsSql2005Dialect + +** Improvement + * [NH-514] - Allow expansion of the "on" clause in joins. + * [NH-1051] - Port AST-based HQL parser / QueryTranslator from H3 + * [NH-1093] - Invalid caching probably shouldn't throw exceptions, but should log warnings. + * [NH-1516] - HQL doesn't support "update" statements + * [NH-1553] - SQL Server 2005: Support for wrapping snapshot isolation update conflict SQLException into a NHibernate StaleObjectStateException. + * [NH-1670] - MutiCriteria and MultiQuery results may be loaded directly into a generic List instead of an ArrayList + * [NH-1745] - SQL formatters for DDL and all others SQLs + * [NH-1750] - Mark NHibernate.Util.WeakHashtable [Serializable] + * [NH-1765] - Add ISessionImplementor property to PreDeleteEvent + * [NH-1791] - Allow passing params of projections to ICriteria.SetProjectios + * [NH-1794] - Allow query only properties and associations + * [NH-1797] - MsSql2005Dialect uses paging query when no offset specified + +** New Feature + * [NH-322] - case when...then...else...end in select clause + * [NH-917] - Allow NHibernate to enlist in arbitrary IDbTransaction + * [NH-1701] - format_sql property of hibernate + * [NH-1786] - IObjectFactory (implementation responsibility by ByteCode provider) to concentrate all Activator.CreateInstance. + +** Patch + * [NH-1726] - ISessionFactory.Settings gone - breaking change + * [NH-1769] - Transaction completion on rollback with TransactionScope can cause ObjectDisposedException + * [NH-1777] - Removed some duplicated casts + * [NH-1783] - DateType should store only the date part of a System.DateTime to a column + +Build 2.1.0.Alpha2 (rev4167) +======================== + +** Sub-task + * [NH-1688] - System.Boolean type incorrectly mapped to YesNoType when the criterion is created by using a projection instead of a property name + +** Bug + * [NH-1635] - should not require a column + * [NH-1671] - SoftLimitMRUCache has a softReferenceCache which is NOT soft + * [NH-1693] - Wrong parameters order in query with subselect and filter + * [NH-1694] - SQL2005Dialect - Sorting fails on a Formula property containing a comma while using paging (MaxResults) + * [NH-1700] - union-subclass with same name as abstract superclass causes NHibernate.DuplicateMappingException. + * [NH-1706] - property-ref does not work for different data type than PK type + * [NH-1710] - Decimal fields are not create correctly in SQL Server 2005/2008 using SchemaExport + * [NH-1711] - Failure of DTC transaction with multiple durable enlistment will crash the process + * [NH-1715] - Timespan type doesn't work with SqlServer 2005 + +** Improvement + * [NH-1707] - MsSQL : prepare_sql should be true by-default + * [NH-1716] - By default map TimeSpan as int64 + +** New Feature + * [NH-1222] - elements: collections support + * [NH-1718] - CurrencyType + * [NH-1719] - Current TimeSpan moved to TimeAsTimeSpan and TimeSpanInt64 moved back to TimeSpan + +** Patch + * [NH-1708] - MS SQL CE Metadata implementation + * [NH-1712] - Release notes missing info about removal of CriteriaUtil + * [NH-1713] - NH-1707 results in buggy PrepareStatement behavior + +Build 2.1.0.Alpha1 +======================== + +** Sub-task + * [NH-1379] - Allow for version custom type + * [NH-1649] - DateTime2 and DateTimeOffset data types support + * [NH-1650] - FileStream data type support + * [NH-1656] - Date and Time data types support + +** Bug + * [NH-1083] - When using a proxy with an interface access strategy on the Id does not get applied + * [NH-1177] - Save/Delete/Evict/Save does not work if collections are mapped + * [NH-1197] - Some tests related to paged subselect are failing under PostgreSQL + * [NH-1251] - TypeFactory.GetSerializableType race condition + * [NH-1253] - Named paramaters with numeric suffix may cause problems + * [NH-1297] - with native ID generator throws InvalidCastException + * [NH-1329] - Expression.Sql with parameters (inside of functions) is broken + * [NH-1345] - PersistentGenericList.GetEnumerator missing Read + * [NH-1357] - ICriteria.ClearOrders is mispelled and belongs on DetachedCriteria too + * [NH-1358] - SchemaUpdate fails for Firebird in released binaries only - NHibernate source and local builds from this source work fine + * [NH-1385] - System.Collections.Generic.KeyNotFoundException exception in PersistentGenericMap.GetDeletes() + * [NH-1395] - Unsaved value null for ValueType + * [NH-1422] - incorrect parameter replacement when one variable is the prefix of another + * [NH-1443] - default_catalog is not used in create table + * [NH-1445] - CriteriaImpl.Clone does not propertly maintain the persistentClass + * [NH-1446] - cast case sensitivity + * [NH-1447] - boolean ConstantProjection fails with MSSQL2005 + * [NH-1480] - SchemaUpdate & Oracle + * [NH-1495] - using access=field.camelcase with interface to create proxy + * [NH-1499] - NullReferenceException construting Criteria query + * [NH-1502] - Order by with projections uses invalid parameter characters + * [NH-1505] - LikeExpression when using projections is invalid + * [NH-1520] - SQLite Dialect does not properly escape names surrounded by backticks + * [NH-1521] - The drop scripts from SchemaExport in SQL2005 dialect will not work when using DefaultSchema setting other than dbo + * [NH-1522] - AdoTransaction.CloseIfRequerid + * [NH-1526] - Cannot use projection for Count in OrderBy + * [NH-1527] - Using projection on order by in conjuction with set max results with parameters passed to the projection will fail + * [NH-1528] - Using order by with a parameter and set max results on 2005 mix up the parameters + * [NH-1549] - Accessing Id of proxy with base class intializes proxy + * [NH-1552] - Paging in NHibernate builds buggy SQL query string, when paging is used against a MS SQL 2005 Database + * [NH-1556] - Cannot order by aggregates in HQL + * [NH-1572] - Small typo in AbstractType.Compare() + * [NH-1573] - "collable" typo in nhibernate-mapping.xsd + * [NH-1578] - The "not" criteria does surround the following or inner criteria with parens only when using MySQLDialect. + * [NH-1584] - one-to-one compositions to a joined subclass don't load + * [NH-1587] - PocoEntityTuplizer don't use ReflectionOptimizer for instantiator + * [NH-1590] - NHibernate.Util.ReflectHelper.TryGetMethod not returning inherited id-getter/setter + * [NH-1593] - SchemaUpdate not create property index. + * [NH-1594] - When setting property in hbm type="Decimal(precision, scale)" - "DECIMAL(19,5)" is always generated + * [NH-1608] - LRUMap Memory Leak + * [NH-1609] - MSSQL2005 dialect: paged query in multicriteria uses wrong parameter values when preceeded by other queries + * [NH-1611] - One-To-One Mappings Fail with Composite ID + * [NH-1612] - Native SQL queries for value collections fail with NullReferenceException + * [NH-1619] - NHibernateUtil returns a wrong IType for Boolean on Postgres + * [NH-1627] - lazy=extra causes the where=".." to be ignored when using collection.Count() + * [NH-1633] - Native SQL queries with addJoin or return object arrays instead of single Entities + * [NH-1637] - Oracle9Dialect Paging based on rownum is not valid. + * [NH-1640] - FETCH JOIN query doesn't work in a StatelessSession + * [NH-1654] - Reserved words in formula + * [NH-1668] - Ingres .NET Data Provider name changed + * [NH-1675] - Problem using distinct query with SetMaxResult + * [NH-1677] - Bug in Criteria API with EntityMode == Map + * [NH-1679] - System.Boolean type incorrectly mapped to YesNoType when the criterion is created by using a projection instead of a property name + * [NH-1685] - Generated Version Not Reloaded After Update + * [NH-1687] - Version tag are ignoring child column tag + +** Improvement + * [NH-298] - After, deleting an item which belongs to a the list indices are not modified + * [NH-545] - Distributed transactions support + * [NH-645] - Support for scalar functions which don't return a value in where clause + * [NH-727] - Allow using sql-insert with generator class="identity" + * [NH-1047] - Add overloads to IQuery.SetParameter to accept System.Type + * [NH-1053] - Allow short class name for collection-type + * [NH-1202] - Improve the error messages when compiling queries + * [NH-1274] - Give the option to exclude a mapped class from the SchemaExport.Create loop. + * [NH-1291] - Example.Create with anonymous objects + * [NH-1336] - Native id generator as default and make generator optional in config + * [NH-1354] - Add support for keyed retrieval of MultiCriteria results + * [NH-1381] - Add support for keyed retrieval of MultiQuery results + * [NH-1396] - Allow override of EmptyInterceptor.GetEntityName + * [NH-1398] - Allow access to EntityMode from ISession + * [NH-1402] - Support Cache for Dynamic entities (entity-name without entity-class) + * [NH-1468] - InFragment ToFragmentString() needs more information in error + * [NH-1496] - Configuration.AddAssembly(Assembly) should do some logging if no mapping files where found + * [NH-1500] - Spelling error of NHibernate.Cfg.ConfigurationSchema.ParseColectionsCache + * [NH-1515] - Proxy validator doesn't check "internal" methods + * [NH-1560] - AbstractDataBaseSchema: Make GetIndexInfo and GetIndexColumns virtual + * [NH-1564] - Generic EnumString Mapping + * [NH-1588] - "Relax" PocoEntityTuplizer + * [NH-1589] - ReflectionOptimizer override CreateCreateInstanceMethod + * [NH-1605] - Typedef support in sql-query/return-scaler/@type attribute + * [NH-1613] - Allow custom action for schema script create/update + * [NH-1643] - Allow to use ICollection and HashSet for + * [NH-1644] - Oracle Lite Driver With Working Query Parameters + * [NH-1657] - TimeSpan as DbType.Time + * [NH-1658] - current_timestamp_offset: current_timestamp for DateTimeOffset + * [NH-1659] - current_timestamp in MsSql2008Dialect using SYSDATETIME() + * [NH-1661] - DriverConnectionProvider.GetConnection doesn't dispose IDbConnection in case of an exception + * [NH-1665] - Supports Hibernate-Quoting sequence name + * [NH-1669] - Add guid.native support to MySQL5Dialect + * [NH-1678] - Add a CreateCriteria method to session + * [NH-1684] - MS SQL Server Dialect - UNION ALL + * [NH-1686] - IStatelessSession.CreateCriteria(System.Type entityType) + * [NH-1703] - Configuration full serializable + * [NH-1704] - AliasToBeanResultTransformer should hold ConstructorInfo + +** New Feature + * [NH-791] - Add always-wrap As a Configuration Option On Collections + * [NH-855] - Port lazy="extra" from Hibernate 3 + * [NH-871] - Implement SelectGenerator + * [NH-1033] - Add support for polymorphic criteria + * [NH-1106] - SQL Anywhere 10 Driver and Dialect + * [NH-1173] - Generic Ordered Set + * [NH-1176] - Trigger generated identities + * [NH-1188] - Provide a method to delete by Id + * [NH-1232] - Enums as discriminators + * [NH-1233] - EnumCharType + * [NH-1305] - Add BuildMappings method to Configuration to eagerly configure mappings + * [NH-1359] - Ability to create an IProjection from a DetachedCriteria + * [NH-1370] - Allow short name for + * [NH-1371] - short name for UserType () + * [NH-1373] - shorter name for UserCollectionType () + * [NH-1393] - Ability to use Aggregate Projections on Projections + * [NH-1394] - Ability to use "order by projection" + * [NH-1397] - from H3.2 + * [NH-1401] - Support for EntityMode.Map and for DefaultEntityMode in Settings + * [NH-1416] - Support DEFAULTs, for properties values, in mappings + * [NH-1451] - Port of from H3.2.6 + * [NH-1458] - Collections events (from H3.2.6) + * [NH-1479] - Add Guid native generation + * [NH-1493] - BackingField accessors + * [NH-1518] - Log info per Operation Threshold in statistics (from H3.2.6) + * [NH-1537] - Comments in Query + * [NH-1538] - Configuration property use_sql_comments (from H3.2) + * [NH-1561] - Dialect, Driver + MetaData for SQL Anywhere 9, and 10 + * [NH-1562] - SQLite MetaData + * [NH-1563] - LinFu ProxyFactoryFactory (LinFu.DynamicProxy) + * [NH-1571] - MSSQL 2008 Dialect + * [NH-1596] - Support Connection to Oracle Lite + * [NH-1621] - Read only property accessor + * [NH-1632] - System.Transactions support issue + * [NH-1646] - Support for IQuery.Future() + * [NH-1662] - sequence-identity generator from H3 + * [NH-1664] - Identity style generic generator support + +** Patch + * [NH-1094] - DecodeCaseFragment ignoring 'returnColumnName' + * [NH-1127] - Use default assembly name and namespace from the element (more than at present). + * [NH-1209] - TableHiLoGenerator Jumps 1 number each lo > maxLo + * [NH-1280] - Adds HAVING support to CreateCriteria queries, Fixes parameter order bugs + * [NH-1295] - ISynchronization support + * [NH-1314] - Change signature of AbstractPersistentCollection.IdentityRemoveAll() from ICollection to IEnumerable for generics + * [NH-1322] - DeleteEvent constructor does not check its parameter properly + * [NH-1356] - Fixes Generic List of Composite Elements + * [NH-1409] - Includes Patch : nant build scripts ignore -D:sign=false + * [NH-1429] - Oracle GUID to Raw(16) + * [NH-1467] - some comment clean ups + * [NH-1485] - MultiQueryImpl.GetResultList does not use Result Transformers correctly. + * [NH-1491] - NoArgSQLFunction is not cls compliant + * [NH-1503] - Support for Sybase ASE ADO.NET 2 Provider + * [NH-1532] - Class called SystemConfiguration does not persist properly + * [NH-1539] - Oracle dialect - incorrect CONCAT behaviour + * [NH-1540] - Oracle dialect - allowing pagging in subqueries + * [NH-1541] - Oracle Dialect - Extra lazy collection count not working under Oracle + * [NH-1542] - Oracle dialect - Fix to some HQL functions + * [NH-1543] - SQLite paging broken + * [NH-1547] - SqLite Paqing does not page properly after the 2nd page + * [NH-1550] - Oracle dialect - pagging correction (+left/right functions) + * [NH-1551] - Update some tests to support Oracle + * [NH-1555] - Add some helper methods for the transformers class + * [NH-1570] - Revision 3859 broke paging support in SQL 2005 dialect for ordered queries + * [NH-1575] - Revision 3860 introduced bug where paged Hql Queries can break unpaged Hql Queries in Sql 2005 + * [NH-1582] - DbType.Date support for SQLite + * [NH-1586] - Informix driver + * [NH-1591] - SetCacheable isn't exposed by DetachedCriteria + * [NH-1592] - Informix dialect update + * [NH-1595] - SQLite dialect does not support the "extract" function + * [NH-1603] - MSSql2005Dialect - Better Data Paging Strategy + * [NH-1606] - Timestamp in Oracle8 + * [NH-1607] - Dictionary should use ContainsKey to check for values + * [NH-1614] - Add support to primitive type (es: unsigned type) to MySql Dialect + * [NH-1660] - Faster retrieval of tuplizer + * [NH-1691] - Nested component broken by fix for NH-1612 + * [NH-1695] - MySQL MetaData implementation + * [NH-1698] - MS SQL Server 2005 creates a clustered primary key by default. Requesting nonclustered as a default to simplify the creation of optimized clustered indexes. + * [NH-1702] - Make AliasToBeanResultTransformer able to return types with a non-public constructor + +** Task + * [NH-1511] - Correctly spell IPropertyAccessor.CanAccessTroughReflectionOptimizer + + +Build 2.0.1.GA +======================== +** Bug + * [NH-1293] - Changed behavior of Filters for many-to-one associations brings up possible bug when used with outer joins. + * [NH-1464] - C++ and Dispose method + * [NH-1466] - current_session_context_class = thread_static doesn't work + * [NH-1473] - IsEqual and Compare broken in EntityType + * [NH-1481] - Named Hql queries w/ Named Parameters broken after upgrade to 2.0 from 1.2.1 + * [NH-1483] - Subclass Not Loaded From Cache as Baseclass + * [NH-1488] - Table per class hierarchy and OUTER JOIN + * [NH-1490] - Wrong order of parameters in query when session uses IFilter + * [NH-1492] - Parameter mismatch enabling filters + * [NH-1499] - NullReferenceException construting Criteria query + +** Improvement + * [NH-1484] - first chance exception 'NHibernate.MappingException' when starting a webapplication + * [NH-1496] - Configuration.AddAssembly(Assembly) should do some logging if no mapping files where found + * [NH-1500] - Spelling error of NHibernate.Cfg.ConfigurationSchema.ParseColectionsCache + + +** Patch + * [NH-1034] - HQL functions - parameters support + * [NH-1434] - Some unit test supplies non-character value to LIKE: not portable across every RDBMS + * [NH-1435] - Explicitly order query in NH-1179 to ensure reliable results + * [NH-1436] - Mapping of NH-1250 not portable across every RDBMS + * [NH-1437] - Mapping of NH-1408 not portable across every RDBMS + * [NH-1438] - Some queries from FooBarTest fixture are not portable across every RDBMS + * [NH-1439] - Handle Dialect.GetIdentityColumnString(DbType type) + * [NH-1459] - Sybase dialect + * [NH-1462] - StringHelper.GetFullClassname fails to parse generic types + +Build 2.0.0.GA +======================== +** BREAKING CHANGES from NH1.2.1GA to NH2.0.0 + ##### Infrastructure ##### + * .NET 1.1 is no longer supported + * Nullables.NHibernate is no longer supported (use nullable types of .NET 2.0) + * Contrib projects moved to http://sourceforge.net/projects/nhcontrib + + ##### Compile time ##### + * NHibernate.Expression namespace was renamed to NHibernate.Criterion + * IInterceptor have additional methods. (IsUnsaved was renamed IsTransient) + * INamingStrategy + * IType + * IEntityPersister + * IVersionType + * IBatcher + * IUserCollectionType + * IEnhancedUserType + * IPropertyAccessor + * ValueTypeType renamed to PrimitiveType + + ##### Possible Breaking Changes for external frameworks ##### + * Various classes were moved between namespaces + * Various classes have been renamed (to match Hibernate 3.2 names) + * ISession interface have additional methods + * ICacheProvider + * ICriterion + * CriteriaQueryTranslator + + ##### Initialization time ##### + * section, in App.config, is no longer supported and will be ignored. Configuration schema for configuration file and App.config is now identical, and the App.config section name is: + * have a different schema and all properties names are cheked + * configuration properties are no longer prefixed by "hibernate.", if before you would specify "hibernate.dialect", now you specify just "dialect" + * All named queries will be validated at initialization time, an exception will be thrown if any is not valid (can be disabled if needed) + * Stricter checks for proxying classes (all public methods must be virtual) + + ##### Run time ##### + * SaveOrUpdateCopy() returns a new instance of the entity without changing the original + * AutoFlush will not occur outside a transaction - Database transactions are never optional, all communication with the database must occur inside a transaction, whatever you read or write data. + * NHibernate will return long for count(*) queries on SQL Server + * must contain parenthesis when needed + * The HQL functions names may cause conflic in your HQL (reserved names are: substring,locate,trim,length,bit_length,coalesce,nullif,abs,mod,sqrt,upper,lower,cast,extract,concat,current_timestamp,sysdate,second,minute,hour,day,month,year,str) + * when meta-type="class" the persistent type is a string containing the Class.FullName (In order to set a parameter in a query you must use SetParameter("paraName", typeof(YourClass).FullName, NHibernateUtil.ClassMetaType) ) + + ##### Mapping ##### + * : default meta-type is "string" (was "class") + +Build 2.0.0.CR2 +======================== +** Sub-task + * [NH-1407] - Actualize documentation of + +Build 2.0.0.CR1 +======================== +** Bug + * [NH-1361] - ProxyTypeValidator: Non-virtual public methods are accepted + * [NH-1389] - Sybase SQLAnywhere 8/9 support broken in Beta1 onword + * [NH-1399] - Database constraint names and hash collisions + * [NH-1403] - Support with meta-type="class" + * [NH-1405] - composite-id property is nulled when related composite many-to-one mapping returns null. + * [NH-1406] - IQuery.SetTimeout work incorrect for ExecuteUpdate + * [NH-1408] - CriteriaTransformer don't clone a DetachedCriteria with sub DetachedCriteria + * [NH-1413] - Paging with multiple orders fail in MSSQL2005 + +** Improvement + * [NH-1304] - Reflection optimizer on != property access + * [NH-1415] - Adding multi query support to MySqlDataDriver + +** New Feature + * [NH-1412] - Allow custom accessors to define if the ReflectionOptimizer can be used. + +** Patch + * [NH-1254] - Sybase ASA10 - Dialect + Driver + * [NH-1390] - Union subclass support for PostgreSQL + +** Task + * [NH-1410] - Spelling mistake in error message: sublcass must be subclass + + +Build 2.0.0.Beta2 +======================== +** Bug + * [NH-1030] - DB2400Dialect : mod(x,y) function triggers a parse exception + * [NH-1077] - Pessimistic locking for SQL Server fails on cached objects + * [NH-1258] - Oracle Sequences mappings without Schema information throwns InvalidKeyException + * [NH-1279] - AggressiveRelease tests fail for MySQL + * [NH-1300] - Detached Entities that have many-to-one associations improperly throw LazyInitializationExceptions when accessing the association outside the loading session + * [NH-1355] - Custom Version type (IUserVersionType) not allowed + * [NH-1362] - Nested cascades on ISession.Refresh() + * [NH-1375] - Disable Multi Query support for Npgsql + * [NH-1383] - Components with (non-C#) Nullables do not follow documentation sect. 7.1 "if all component columns are null, then the entire component is null" + * [NH-1384] - Support for latest Npgsql2 (PostgreSQL) Data Provider + +** Improvement + * [NH-693] - Better error message when user forgets to supply table name + * [NH-803] - Support DML type batch sql statements + * [NH-824] - GetClassname cannot parse generic classnames + * [NH-938] - Escape characters in Like expressions + * [NH-978] - show_sql: Transaction Begin, Commit, Rollback + * [NH-1101] - component directy detection should consider null component value to be equiv to all component member's being null + * [NH-1151] - Improve Configuration to Support ASP.NET Configuration File Hierarchy and Inheritance + * [NH-1216] - SchemaExport creates varchar(255) on MySQL when Property Type is StringClob + * [NH-1236] - XML Entity support in mapping files broken + * [NH-1257] - lazy=true and fetch=join doesn't work together it will be nice to receive a WARN + * [NH-1364] - LinkedHashMap.RemoveImpl can be improved (using try/catch for common scenario) + * [NH-1382] - Oracle Dialect support for Unsigned Int (UInt32, UInt64) + +** New Feature + * [NH-1115] - Add support for "Refresh" cascade style + * [NH-1367] - Add Interceptor or Event to Batcher + + +** Task + * [NH-1144] - Apply patch for NH-1022 (Oracle command batching) to trunk + * [NH-1210] - "table" attribute documented as required when in fact optional + + +Build 2.0.0.Beta1 +======================== +** Bug + * [NH-1238] - NH_1155_ShouldNotLoadAllChildrenInPagedSubSelect fails for MsSql2000Dialect + * [NH-1318] - Enum fields cannot be mapped to database on DB2 + * [NH-1329] - Expression.Sql with parameters (inside of functions) is broken + * [NH-1346] - SchemaUpdate.Execute fails on MS SQL Server 2005 With Locale TURKISH_CI_AS + * [NH-1347] - SetMaxResult does not work with SQLite (SQLiteDialect) + * [NH-1348] - Cannot use multiple listeners for the same event type + +** Improvement + * [NH-1172] - ASA 10 Driver for NHibernate + * [NH-1315] - ForeignGenerator.cs property Key is not found if the generator tag is empty causes exception + * [NH-1335] - Performance improvment of PersistentEnumType class + + +** Patch + * [NH-1254] - Sybase ASA10 - Dialect + Driver + * [NH-1326] - ISession.Disconnect() creates zombied transactions + * [NH-1327] - PostCommitXXXEventListeners invoked even when transaction fails + + +Build 2.0.0.Alpha2 +======================== + +** Bug + * [NH-1100] - Introduce exception if two columns are being selected, but only one being returned by NH + * [NH-1145] - MultiCrieria Does Not Respect MaxResults on Criteria + * [NH-1161] - Java mentioned in NHibernate Documentation + * [NH-1203] - Problem to resolv property name + * [NH-1205] - Various subselect bugs in MultiCriteria + * [NH-1246] - Reading BinaryBlob triggers update when transaction is committed. + * [NH-1250] - Failure with MsSql2005Dialect when paging in polymorphic queries with discriminator formula + * [NH-1252] - Inconsistent behavior of ISession.Get() under certain conditions + * [NH-1263] - CreateSchema works ok for mappings in different schemas but DropSchema not + * [NH-1281] - Regression: Criteria Query does not deliver right result when compared to similar HQL query + * [NH-1285] - Drop schema script generated by SchemaExport has bug + * [NH-1290] - AuxiliaryDatabaseObject with no params causes crash + * [NH-1296] - SQLite dialect does not support empty inserts + * [NH-1301] - Cascade doesn't work for Refresh + * [NH-1309] - Cannot recreate db when using schema and fK + * [NH-1313] - SqlFunctionProjection does not look at custom sql functions + * [NH-1332] - PostCommitDelete only fires when PostCommit is also used (in 2.0.0.alpha1) + * [NH-1334] - SesssionFactoryImpl.BuildCurrentSessionContext does recognize "web" property + * [NH-1340] - Ordering by Formula Property when paging will cause invalid SQL on SQL Server 2005 + +** Improvement + * [NH-763] - NHibernate Does Not Recognize Dependent Resources + * [NH-1158] - Upgrade to DynamicProxy 2 + * [NH-1283] - SetGuid is missing in IMultiQuery interface + * [NH-1303] - UUIDStringGenerator#Generate Improvement + +** New Feature + * [NH-1134] - Allow property-ref for collection keys + +** Patch + * [NH-1058] - automatically create indexes for foreign keys in postgresql dialect + * [NH-1140] - Getting NullReferenceException when using SimpleSubqueryExpression within another subexpression + * [NH-1146] - Expose DetachedCriteria in SubqueryExpression + * [NH-1162] - Add list-index element and property-ref attribute to key element in mapping schema + * [NH-1163] - Add more complete identity column support to SQLiteDialect + * [NH-1166] - Sql server lock patch, pessimistic locking for SQL Server 2000/2005 + * [NH-1201] - Patch: MultiQueryImpl.GetResultList does not use Result Transformers correctly. + * [NH-1292] - No-Dialect Patch + * [NH-1302] - Patches for Visual Studio 2008 / .Net 3.5 + * [NH-1308] - Patch to get a MappingException when association references unmapped class + * [NH-1310] - IStatelessSession invalid return type from Get() + * [NH-1320] - CriteriaTransformer does not properly transforms to rowcount when using subcriteria + * [NH-1325] - Source code does not compile + +** Task + * [NH-802] - Investigate possible use of MSBuild to build the project + * [NH-1321] - Add NCache Express provider to documentation + +Build 2.0.0.Alpha1 +======================== + +** Bug + * [NH-987] - Schema creation on SQL Server 2000 uses SQL 2005 system views + * [NH-1028] - Duplicate column names in queries + * [NH-1042] - MultiQuery force to use parameter in all queries + * [NH-1045] - CastleLazyInitializer throws null pointer exception during proxy creation + * [NH-1055] - Multi Criteria ignored Result Transformer + * [NH-1059] - Join mapping for a subclass is incorrectly applied to the base class + * [NH-1084] - Subclass with Join fail when trying to query + * [NH-1088] - Wrong exception text referring to config property hibernate.dialect + * [NH-1104] - RowCountProjection type should be Int64 + * [NH-1147] - Minor bug with AbstractFlushingEventListener + * [NH-1149] - Second Level Caching with Quey Caching is not working + * [NH-1154] - Delete object broken + * [NH-1168] - HQL functions 'length()' and 'bit_length()' doesn't support a non-string argument type under PostgreSQL 8.3 + * [NH-1170] - Multiple queries issues for UniqueResult + * [NH-1178] - Example.Create(exampleInstance).ExcludeZeroes().ExcludeNulls() seems has a bug.(version 1.2.0.400) + * [NH-1179] - Filter not applied in explicit join + * [NH-1181] - NHibernate.JetDriver - replace 'upper(' with 'ucase(' + * [NH-1187] - concat function fails when a parameter contains a comma, and using MaxResults (MSSQL 2005) + * [NH-1223] - To Change hibernate mapping.xml schma value change for at the runtime + * [NH-1229] - Formula fails when using the pagging on MSSQL 2005 dialect + * [NH-1234] - PersistentEnumType incorrectly assumes enum types have zero-value defined + * [NH-1235] - SetMaxResults() returns one less row when SetFirstResult() is not used + * [NH-1237] - Cannot set PostLoadEventListener event listeners. + * [NH-1246] - Reading BinaryBlob triggers update when transaction is committed. + * [NH-1249] - Bug in GetLimitString for MSSql 05 when ordering by aggregates + * [NH-1255] - key-many-to-one && not-found + * [NH-1259] - Recursive call in SetListener(type,null) causes stack overflow + * [NH-1260] - SessionImpl.EnableFilter returns wrong filter if already enabled + * [NH-1261] - HQL Functions with no arguments add the return type twice + * [NH-1265] - Generated Id does not work for MySQL + * [NH-1268] - one-to-one can never be lazy? + * [NH-1275] - FOR UPDATE statements not generated for pessimistic locking + * [NH-1286] - Binary types are not compared properly and always sent to update + +** Improvement + * [NH-364] - IdBag doesn't work with Identity columns + * [NH-421] - Dialect Improvements + * [NH-568] - year(), month(),date() and some other functions: not supported in HQL + * [NH-628] - HQL functions mapping + * [NH-865] - Change SQL Server dialect to use COUNT_BIG for count + * [NH-913] - make Flush() - return int value for records affected + * [NH-924] - ICriteria - Inspection/traversal, modification and cloning + * [NH-969] - IIf for MS SQL + * [NH-970] - OnPreLoad & OnPostLoad Lifecycle Events + * [NH-975] - Add a way for the user to specify their own ProxyFactory + * [NH-993] - Document MultiCriteria + * [NH-1063] - NHibernate.Mapping.Attributes - Support ImportAttribute when serializing an assembly + * [NH-1085] - When using multi query, allow missing parameters in queries + +** New Feature + * [NH-280] - Using constants in select clause of HQL + * [NH-424] - Add [ Table per subclass, using a discriminator ] Support to Nhibernate + * [NH-543] - Adding GetEntityName to IInterceptor (H3.0 feature) + * [NH-786] - Port statistics from H3 + * [NH-831] - Add MutliCriteria + * [NH-979] - Allow cloning of DetachedCriteria + * [NH-1036] - IQuery.executeUpdate() + * [NH-1111] - PostgreSQL 8.3 dialect with Guid type support + +** Patch + * [NH-387] - Rolling back identifiers + * [NH-466] - Add join mapping element to map one class to several tables + * [NH-982] - Patch for Castle DynamicProxy2 Support + * [NH-1073] - Remove #if NET_2_0 directives + * [NH-1078] - .NET 2.0 Configuration section to store nhibernate configuration + * [NH-1109] - HQL functions 'current_timestamp', 'str' and 'locate' for PostgreSQL dialect + * [NH-1110] - Enable Multi Query support for Npgsql (PostgreSQL) driver + * [NH-1113] - Test DetachedQueryFixture.ExecutableNamedQuery fails on case-sensitive databases + * [NH-1114] - Tests NHSpecificTest NH898 and NH958 failed on databases without DbType.Guid support + * [NH-1231] - Add support for SetResultTransformer to ISQLQuery queries (auto-discovery of return types) + * [NH-1240] - VetoInterceptor - Cancel Calls to Delete, Update, Insert via the IInterceptor Interface + * [NH-1242] - Change path delimiter to '/' to be buildable on non-Windows platforms + * [NH-1243] - NHibernate.Search is not CLS compliant. + * [NH-1244] - NHibernate uses ConfigurationManager which is in System.Configuration.dll which is not referenced. + * [NH-1245] - Update mono targets. + * [NH-1273] - Generic version of AbstractQueryImp.UniqueResult() called twice + +** Task + * [NH-1087] - Discard section and substitute it whit + * [NH-1221] - Implement FullTextQueryImpl.ExecuteUpdate() + * [NH-1239] - Update build script to include configuration templates. + +Build 1.2.1 +======================== + +Bug Fixed: + + * [NH-111] - Oracle "Invalid identifier" exception + * [NH-989] - Assemblies are not registered in the correct order + * [NH-995] - Problem with CompositeId+"key-many-to-one"+Caching + * [NH-999] - One Shot Delete doesn't work - and cause reference violations + * [NH-1006] - Invalid SQL order generated by JetDriver + * [NH-1011] - update=false attribute ignored + * [NH-1012] - DetachedCriteria CreateAlias with joinType (new in1.2) is broken + * [NH-1018] - 'DistinctRootEntity' result transformer throws InvalidCastException + * [NH-1023] - using projections and transformer causes invalid column name when property and alias are the same + * [NH-1039] - NullReferenceException for dynamic-component containing a set + * [NH-1061] - Schema name missing when quering for highest key value + * [NH-1064] - wrong association owner when fetching eagerly + * [NH-1068] - Typo in example-mappings.html + * [NH-1086] - SerializationException when using MemCacheProvider as cache because some classes miss the SerializableAttribute. + * [NH-1124] - Problem in NHibernate.Type.ComponentType.NullSafeSet + * [NH-1155] - SubselectFetch doesn't take into account paging + * [NH-1156] - MS2005Dialect doesn't handle same column & alias names correctly + * [NH-1167] - SubCriteria.CreateCriteria(string associationPath, string alias, JoinType joinType) always uses JoinType.InnerJoin + +Improvements: + + * [NH-901] - ComponentType mappings for with value types (structs) cause incorrect dirty checking + * [NH-1049] - classes which inherit Order can't override ToSqlString + +New Features: + + * [NH-1022] - Add command batching support for OracleClient driver + +Patches Applied: + + * [NH-585] - Unknown version when using replicate and joined-subclass + * [NH-903] - IQuery.SetFirstResult and SetMaxResults break in MsSql2005Dialect for ISQLQuery using WITH keyword + * [NH-990] - Abstract CurrentSessionContext management and add more implementations + * [NH-1014] - NHibernate Cross Join Syntax Causes Issues With SQL Server 2000/2005 + * [NH-1054] - Add hibernate.transaction.factory_class setting + * [NH-1056] - Command batching support for OracleDataClientDriver + * [NH-1076] - Sybase11 Dialect + * [NH-1080] - HQL parser incorrectly registers a many-to-one association as a one-to-one. + * [NH-1119] - valuetypes in uniqueresult give an error when query result is null + * [NH-1160] - Parameter compatibility problem in cached Sql command. + * [NH-1193] - Limit string in MsSql2005 dialect can sort incorrectly on machines with multiple processors + +Task Completed: + + * [NH-1002] - Document undocumented configuration properties + + +Build 1.2.0.GA +======================== + +Patches Applied: + + * [NH-992] - AuxiliaryDatabaseObject enhancement + +Bugs Fixed: + + * [NH-980] - Table name not quoted with increment generator + +Improvements: + + * [NH-974] - Build and distribute a binary zip file along with the installer + * [NH-976] - Better error description when subclass table name is wrong + * [NH-985] - Map DbType.Guid to CHAR(38) for Oracle + * [NH-988] - Proxy validator should complain on non-virtual internal members + +Build 1.2.0.CR2 +======================== + +Patches Applied: + + * [NH-859] - Improve SubselectFetch performance + * [NH-931] - Error Message Improvement for SingleTableEntityPersister.cs + * [NH-934] - Fix Spelling in comments and parameter lists + * [NH-937] - Improve comments and parameter lists + * [NH-954] - Fix build for mono-1.0 on Linux + * [NH-955] - JetDriver breaks on non-standard cultures, on the DateTime fix + * [NH-962] - Parent-Child relationships not properly persisted in certain cases + +Bugs Fixed: + + * [NH-898] - ArgumentException from EntityKey constructor when running a HQL query + * [NH-926] - Identity insert fails with SQL Ce dialect and aggresive connection release mode. + * [NH-929] - session.Save(object) sets bogus ID fields using MySQL with default hibernate.connection.release_mode + * [NH-930] - Schema Export generates duplicate constraints + * [NH-932] - hbm2net: Troubles using "classname, AssemblyName" in Extends attribute of joined-subclass + * [NH-933] - Expression.In does not support Generic lists + * [NH-940] - domain model exception badly handled by proxy NHibernate + * [NH-952] - AddAssembly doesn't seem to order joined-subclass correctly + * [NH-958] - ISession.SaveOrUpdateCopy throws exception when class has mapping + * [NH-965] - Error with computed property (property ... formula="... ) inside block + * [NH-966] - Unsafe type cast code in DetachedCriteria.GetExecutableCriteria + +New Features: + + * [NH-305] - Generated properties + * [NH-428] - Support Multiple Collections join fetch + * [NH-915] - Add pessimistic locking for SQL Server 2000/2005 + * [NH-936] - Sys Cache with SqlCacheDependencies + +Improvements: + + * [NH-944] - Provide API for specifying JoinType in subqueries + * [NH-947] - Add IInterceptor.SetSession + * [NH-948] - Documentation needs update: "Copy the xsd files to ... directory for enabling IntelliSense" + +Build 1.2.0.CR1 +======================== + +Patches Applied: + + * [NH-859] - Improve SubselectFetch performance + * [NH-874] - Named Parameters do not work in Having Clause + * [NH-875] - Query cache does not work when filters are enabled + * [NH-923] - The NHibernate.Expression.Order class doesn't implement ToString() + +Bugs Fixed: + + * [NH-857] - Filter parameter is mandatory and should be optional + * [NH-864] - Dynamic update of NULL column using Nullables.NullableInt32 with "dirty" optimistic locking fails + * [NH-870] - Expression.Disjunction has wrong semantics when empty + * [NH-872] - SetCacheable(true) with an enabled filter fails + * [NH-873] - Setting hibernate.cache.use_second_level_cache to false throws NRE in SessionFactoryImpl constructor + * [NH-876] - NullReferenceException on query exection with SetCacheable(true) and null parameters + * [NH-882] - using binary type in filter does not work + * [NH-883] - Update to Bag cannot be flushed more than once. + * [NH-890] - hbm2net cannot handle wildcards without a path + * [NH-891] - Parameters do not work in HQL array access expression + * [NH-897] - An index attribute in the property tag does not create an index + * [NH-906] - SubselectFetch does not properly handle forumla properties containing "from" + * [NH-907] - Test WhereAttributesOnBags fail on PostgreSQL + * [NH-909] - Test CastFunc() fails on PostgreSQL + * [NH-911] - Allow subqueries with joins using Criteria API and Subqueries with DetachedCriteria + * [NH-912] - NullReferenceException in TypedValue.ToString + * [NH-914] - Test NH826 fails on PostgreSQL + * [NH-916] - Test SelectSqlProjectionTest() fails on PostgreSQL + * [NH-918] - wrong parameters passed to AddIdentitySelectToInsert() + * [NH-920] - DB2400Dialect does not support "mod(x,y)" function + +New Features: + + * [NH-888] - RFE: IQuery.SetGuid + +Tasks Completed: + + * [NH-862] - Document that aggressive connection release does not work well with System.Transactions + * [NH-867] - Write a migration guide from 1.0.x to 1.2.0 + +Improvements: + + * [NH-868] - Add optimistic-lock attribute to all elements that have it in H3 + * [NH-869] - Implement IInterceptor.BeforeTransactionCompletion and others + * [NH-879] - Deprecate ILifecycle and IValidatable; move them to NHibernate.Classic. + * [NH-880] - Move IUserType and ICompositeUserType to NHibernate.UserTypes + * [NH-881] - Add Configuration.AddSqlFunction + * [NH-887] - Support superclass property reference in property-ref + * [NH-902] - Remove usage of string.Intern + * [NH-910] - PostgreSQL 8.2 dialect with "IF EXISTS" + * [NH-922] - PostgreSQL support for identity column using "SERIAL" type + +Build 1.2.0.Beta3 +======================== + +Breaking Changes + * ConnectionReleaseMode support ported from Hibernate. By default, connections are released after every transaction, + or after every operation if no NHibernate transaction is in progress. + +Patches Applied: + + * [NH-807] - Criteria Tests + * [NH-813] - CacheKey key is invalid - memcached fails to store objects. + +Bugs Fixed: + + * [NH-793] - NHybridDataReader.ReadIntoMemory fails when the result is 0 records. "Invalid attempt to read when no data is present". + * [NH-812] - PostgreSQL - for update no wait + * [NH-815] - SQLQueryImpl fails to bind parameter lists + * [NH-816] - Criteria using class with discriminator + * [NH-818] - NHibernate.JetDriver Not Working at all in 1.2.0.Beta2 (encounters System.NullReferenceException) + * [NH-819] - Memcached.Client library is using log4net 1.2.9, instead of 1.2.10 + * [NH-825] - QueryKey doesn't take into account the entity ID when generating ToString() + * [NH-826] - Using Criteria to query for an item throws on Flush in some situations + * [NH-829] - pagination select doesn't support 'distinct' for NHibernate.Dialect.FirebirdDialect + * [NH-830] - ICriteria does not automatically flush the session for many-to-many association change + * [NH-837] - Error using Limits with DB2400Dialect + * [NH-839] - PersistentGenericMap GetSnapshotElement InvalidCastException + * [NH-841] - generator class="native" not works with NHibernate.JetDriver + * [NH-845] - Queries and imports in separate hmb.xml are not parsed (re-opening) + * [NH-850] - Non-portable file path for generated source files by hbm2net + +New Features: + + * [NH-370] - Add Configuration.SetDefaultAssembly and SetDefaultNamespace methods + * [NH-752] - Informix Dialect + * [NH-828] - Port connection release mode from H3 + +Tasks Completed: + + * [NH-796] - Document ISessionFactory.GetCurrentSession functionality + * [NH-801] - Upgrade NAnt libraries to 0.85 + * [NH-833] - Document SQL Server command batching functionality + * [NH-834] - Document hibernate.connection.connection_string_name + +Improvements: + + * [NH-383] - SessionFactory should implement System.IDisposable + * [NH-442] - Medium Trust level support + * [NH-648] - NHibernate.Mapping.Attributes - Allow [(Jcs)Cache], [Discriminator] and [Key] at class-level + * [NH-666] - IQuery.SetParameterList should support generics + * [NH-729] - Add ICurrentSessionContext implementation for ASP.NET apps. + * [NH-730] - make the bag Attribute protected instead of private in PersistentBag.cs + * [NH-743] - change BatcherImpl to public + * [NH-780] - Obsolete code in the tips 'n tricks + * [NH-808] - Type of count(*) should be Int64 + * [NH-810] - Prevent use of many-to-one association in Expression.Eq + * [NH-817] - DetachedCriteria Serializable + * [NH-835] - Document MultiQuery + * [NH-840] - Include Inner Exception on 'Duplicate identifier in table for:' exception msg + * [NH-851] - More descriptive error message for 'Cannot find constructor' on projections + * [NH-852] - Report proxy validator errors in bulk + * [NH-856] - NHibernate.Mapping.Attributes - Allow mapping attributes on interfaces + + +Build 1.2.0.Beta2 +======================== + +Breaking Changes: + * XML schema versions have been changed from 2.0 to 2.2. + * This version includes an updated Castle.DynamicProxy library. However, + its maintainers have not changed the version number with the update. Remember + to update Castle.DynamicProxy when updating NHibernate from an earlier version. + +Patches Applied: + + * [NH-247] - Expression.InsensitiveLike support for Firebird + * [NH-335] - discriminator formula + * [NH-723] - SqlTest for Firebird + * [NH-725] - null reference exception which attempting to flush a versioned object + * [NH-747] - Invalid number of SQL parameters when calling ISession.Delete on an optimistic-locked object with 1 or more NULL properties + * [NH-749] - NHb tests using Firebird + * [NH-751] - hasDataTypeInIdentityColumn to support Informix and similar + * [NH-757] - Patch for JetDriver + * [NH-762] - Patch to fix errors in Expression.AbstractEmptiness + * [NH-765] - Use "(" and ")" to enclose the ToString of LogicalExpression.cs + +Bugs Fixed: + + * [NH-528] - Fix GROUP BY example in documentation (GROUP BY object instance does not work) + * [NH-555] - Problems with complex aggregate queries + * [NH-585] - Unknown version when using replicate and joined-subclass + * [NH-593] - Throw a meaningful exception when using Expression.In with collection types + * [NH-600] - TimestampType precision problems + * [NH-622] - Collection of subtypes with discriminators not working + * [NH-623] - Where attribute of collection not rendered when eager fetched + * [NH-637] - Between Criterion Parameters Applied Incorrectly for Component + * [NH-642] - ArgumentNullException if no setter exists and no access strategy was specified + * [NH-681] - Generic List Error + * [NH-697] - System.MissingMethodException: Method not found: Int32 System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(System.Object). + * [NH-704] - Lock(obj, LockMode.None) not working when there is collection + * [NH-716] - Dirty Checking exception (many-to-one, select-before-update) + * [NH-732] - Can't use UserType for keys + * [NH-734] - ArgumentOutOfRangeException when setting LIMIT parameters using MySQL + * [NH-735] - Oracle Driver/Dialect + * [NH-739] - Saving transient item in the PersistantBag results duplicate items + * [NH-740] - Logging for tests is sometimes not configured properly + * [NH-741] - Invalid parameter handling when using functions + * [NH-742] - Error with computed property (property ... formula="... ) inside block + * [NH-746] - NHibernate.SqlCommand.Template quoted Token when not required + * [NH-750] - with many-to-many + * [NH-753] - Composite ID with Positional Parameters in sql-query + * [NH-768] - Delete fails when using optimistic-lock and bags + * [NH-775] - IQuery.SetResultTransformer() doesn't work + * [NH-776] - one-to-one to proxied types not handling missing associated classes correctly (as null) + * [NH-777] - ArgumentNullException: Value cannot be null. Reflection exception. + * [NH-782] - Update to latest DynamicProxy to fix race condition + * [NH-798] - Custom insert/update/delete SQL ignored for collections + +New Features: + + * [NH-432] - Port sessionFactory.getCurrentSession() from H3.1 + * [NH-499] - NHibernate filters + * [NH-515] - Port subselect fetching from Hibernate 3.1 + * [NH-755] - Port DetachedCriteria from Hibernate 3 + * [NH-758] - Allow Schema Export to work directly against an IDbConnection or TextWriter + * [NH-783] - Port Subquery support for the Criteria API + * [NH-795] - Implement lazy="proxy|false" for *-to-one associations + +Tasks Completed: + + * [NH-412] - Improve build files + * [NH-663] - Update readme.html + +Improvements: + + * [NH-372] - Allow insert="false", update="false" for components + * [NH-575] - Enhance user types support + * [NH-606] - Throw an meaningfull exception when collectionType.GetGenericArguments() returns 0 arguments. + * [NH-608] - Add ICriteria.CreateCriteria and CreateAlias overloads taking a JoinType parameter. + * [NH-614] - Optimize generic IQuery.List implementation + * [NH-615] - Change XML schema names to -2.2 + * [NH-632] - Change the error message for a database driver assembly that wasn't found. + * [NH-696] - upgrade to log4net 1.2.10.0 + * [NH-712] - Improve returned error message when default constructor is not present on a class mapped as a component + * [NH-726] - Document that custom insert sql ignored when id generator not "assigned" + * [NH-744] - Add DDL logging to SchemaExport + * [NH-760] - Allow replacing a registered function in Dialect.RegisterFunction + * [NH-761] - Change ISession.Get() to initialize a proxy if it returns one, like in H3.2 + * [NH-778] - Adding pascalcase-m (without the underscore) + * [NH-792] - Do not wrap exceptions in DriverConnectionProvider.GetConnection + +Build 1.2.0.Beta1 +======================== + +Patches Applied: + + * [NH-604] - Excessive memory consumption bug with heavy HQL usage + * [NH-636] - Add parametrized type + * [NH-638] - Add tests for UserCollectionType + * [NH-650] - DB2400Driver and DB2400Dialect + * [NH-668] - Support Sqlite ADO.Net 2.0 DataProvider + * [NH-673] - SQL Server 2005 Everywhere Edition Driver (SqlServerCeDriver) + * [NH-680] - Updates to NHibernate.Tool.hbm2net-2.0 to map nullable types correctly (and more) + * [NH-689] - NHibernate.SQL - Log the SQL parameters on the same log line as the statement + * [NH-698] - Firebird Dialect Limit Support + * [NH-701] - Log SchemaExport errors using log4net + * [NH-713] - Port property level optimistic-lock functionality from Hibernate 3.0 + * [NH-715] - SQL00029 error on INSERT INTO DB2/400 (with identity column) + +Bugs Fixed: + + * [NH-559] - Memory leak associated with HQL queries + * [NH-621] - IdentifierGeneratorFactory.Get() should use Id's IType conversion methods + * [NH-643] - Parent child problem when using SysCacheProvider + * [NH-649] - Firebird dialect (repeated RegisterFunction) + * [NH-669] - Generic map is not working + * [NH-687] - ISession.Get() strange behavior (probably a bug) + * [NH-690] - SupportsIdentitySelectInInsert property in Dialect class never used + * [NH-705] - With SysCache impossible to strore object after the gc clears the cache + * [NH-709] - CommandTimeout property should not be global + * [NH-719] - Caching of "any" reference to lazy classes + * [NH-720] - Cache regions are not being used + +New Features: + + * [NH-258] - Stored Procedures + * [NH-268] - "not-found" attribute on relation mappings + * [NH-617] - Add support for projections in criteria queries + * [NH-629] - Ingres Driver and Dialect + * [NH-640] - IList parameter for Criteria.List + +Improvements: + + * [NH-530] - Config loader error messages + * [NH-535] - Allow all ID generators to return all integer types, not just Int16/32/64 + * [NH-541] - Error Message Improvement + * [NH-581] - Make MsSql2005Dialect use nvarchar(max), varbinary(max), and varchar(max) instead of ntext, image, and text + * [NH-613] - Guid for Firebird + * [NH-625] - Add Configuration.AddUrl + +NHibernate.Mapping.Attributes: + + * [NH-494] - RawXmlAttribute: Insert XML as-is in the mapping + * [NH-684] - AttributeIdentifierAttribute: Change a string value in an Attribute (column name, ...) + * [NH-589] - Registration of properties' types patterns: Transform FQNs of properties types + * [NH-644] - Pass UnsavedValue as object: Use UnsavedValueObject (in Id, Version, ...) + * [NH-651] - Add methods to HbmSerializer returning a stream + * [NH-652] - Order (joined-)subclasses when they extend each others + * [NH-587] - HbmWriter.WriteUserDefinedContent(): Improve extensibility + * [NH-588] - MappingException: Exception thrown by this library + +Build 1.2.0.Alpha1 +======================== + +Important Breaking Changes: + * Entities and collections are lazy by default. Change by setting default-lazy="false" + in . + * Types used as proxies are now validated (a check is done that all public members are + virtual). Validation can be disabled by setting hibernate.use_proxy_validator to false. + * ISession.Get/Load now obey where="..." attribute of . + * Assemblies are signed using a new, publicly available, key. + * Assembly.LoadWithPartialName is no longer used to load assemblies. If you want NH to load + an assembly from the GAC, use element in the configuration file to + specify its fully qualified name. This change will primarily affect loading of ADO.NET + data provider assemblies. + +Patches Applied: + + * [NH-595] - Possible bug in SessionImpl.EndLoadingCollections method + +Bugs Fixed: + + * [NH-242] - Hbm2Net looks for template file in the current directory but should in the program directory + * [NH-467] - Many-to-one ignores "WHERE" class mapping element on associated Class + * [NH-511] - IVersionType.Seed should be set to 1 instead of 0 for integer types + * [NH-532] - PropertyNotFoundException ctor throws NullReferenceException + * [NH-538] - config.AddDirectory doesn't work + * [NH-540] - Register of AnsiChar type + * [NH-544] - Small Issue about Iesi.Collection.Set + * [NH-548] - Component Parent set to null on 2nd-level cache hit + * [NH-550] - Incorrect SQL Generated when using SetMaxResults() with DB2 + * [NH-551] - Unable to use DB2 in .NET 1.1 when 1.1 & 2.0 installed side by side + * [NH-552] - Collection of "nullifiables" not updated when object saved back + * [NH-560] - Bad alias generated for Generic class + * [NH-563] - Exception in NDataReader.cs when loading BinaryBlob + * [NH-571] - class keyword in WHERE broken for table-per-subclass mappings + * [NH-574] - sort="natural" doen't work when namespace and assemply were set + * [NH-579] - Cannot load class="System.DayOfWeek" + * [NH-580] - Possible bug in hbm2net + * [NH-582] - All IType implementations should be serializable + * [NH-607] - session.GetEntityIdentifierIfNotUnsaved can return null + * [NH-609] - SysCache re-caches items without expiration policy + +New Features: + + * [NH-449] - SQL Server 2005 dialect + * [NH-553] - Driver for Adaptive Server Anywhere 9.0 + +Tasks: + + * [NH-155] - Look at TableHiLoGenerator Impl + +Improvements: + + * [NH-179] - Add Proxy Validator + * [NH-243] - Hbm2Net is unable to extent with own renderer + * [NH-259] - Type-Safe Collections + * [NH-338] - Support .NET 2.0 CLR/BCL features, esp Generics and Nullable Types + * [NH-353] - Assembly.LoadWithPartialName is obsolete in .NET2 + * [NH-416] - Change default laziness of classes and collections to "true" to match Hibernate 3.1 + * [NH-441] - Make proxy validator optional + * [NH-457] - SysCache slidingExpiration property doesn't work properly + * [NH-547] - Add IL-based reflection optimizer + * [NH-602] - Support for new Firebird provider + +Build 1.0.2.0 +======================== + +Bugs Fixed: + + * [NH-409] - Sybase - Polymorphics Queries - wrong SQL generation about aliases/quotes + * [NH-418] - Custom persister cannot be instanciated. + * [NH-464] - DateTime does not work in composite-element mapping + * [NH-470] - Disconnect and Close should not close user-supplied connections + * [NH-471] - Misspelled property in ICriteria throws NullReferenceException + * [NH-476] - GetSetHelperFactory doesn't work with external dependencies + * [NH-477] - IncrementGenerator reads Int64 even if Int32 or Int16 is used. + * [NH-479] - One-To-One SaveAndUpdateCopy - Reference Identifier Bug + * [NH-480] - Should use invariant culture with ToLower and other string calls + * [NH-496] - Reflection optimizer should throw a more informative exception when a property is mapped using a wrong type + * [NH-505] - Reflection optimizer does not work with structures + * [NH-508] - changes to idbag collection not persisted correctly + * [NH-509] - ILMerge is not packaged in the distribution + * [NH-512] - Custom properties accessors do not work + * [NH-523] - SaveOrUpdateCopy throws PersistentObjectException + +New Features: + + * [NH-513] - FOR UPDATE NOWAIT in Postgresql 8.1 + +Improvements: + + * [NH-483] - Improve type resolution to handle dynamic assemblies + * [NH-488] - Change log level for GetSetHelper messages to DEBUG so that users are not confused + * [NH-489] - Remove logging from ADOException constructor + * [NH-491] - SQLite dialect should use DATETIME type for date/time columns + * [NH-493] - Correction in the NHibernate.Type.CharType.cs + * [NH-497] - Add more Hibernate-compatible type names + * [NH-506] - Make Environment.UseReflectionOptimizer property writable + * [NH-516] - Log SQL parameter values + * [NH-521] - Locking an unitialized entity causes its initialization + * [NH-525] - Upgrade to latest DynamicProxy + +Build 1.0.1.0 +======================== + +Bugs Fixed: + + * [NH-406] - NHibernate.Cfg.Configuration.Configure("MyAssembly.dll.config") results in System.NullReferenceException + * [NH-407] - session.Refresh(myObject) does not refresh/load the object from the datbase if it does not exist in the cache. + * [NH-414] - Need to process and in configuration files + * [NH-417] - Column Alias bug + * [NH-422] - child tag missing from + * [NH-440] - one-to-one unique foreign key mapping fails during query + * [NH-415] - AddXmlString should rethrow exceptions it catches + * [NH-463] - IncrementGenerator returns Int64 but uses an Int32 internally + +New Features: + + * [NH-113] - drop table SQL will now check if the table exists on MS SQL + to avoid unnecessary warnings. + * [NH-450] - Added hbm2ddl NAnt task by James Geurts + +Improvements: + * [NH-403] - BinaryType.Get should now perform faster + * [NH-398] - Bulk property get/set optimization in AbstractEntityPersister + contributed by Roberto Paterlini. The optimization is enabled by default, + set hibernate.use_reflection_optimizer property to false in your + App.config file to disable it. Note that the property is global, thus + it is only possible to set it in the app.config file in + session (see above). + * [NH-443] - Added more details to "broken column mapping" message + * [NH-448] - NHibernate configuration process is now closer to Hibernate: + - hibernate.properties file corresponds to section + in app.config (mapped to NameValueSectionHandler) + - configuration through hibernate.cfg.xml is supported + - instead of hibernate.cfg.xml, section + in app.config (mapped to NHibernate.Cfg.ConfigurationSectionHandler) + can also be used. + - creating a new configuration instance in version 1.0 would cause it + to read section immediately. In 1.0.1 this + was changed so that the section is only read when Configure() is called + * HashCodeProvider is now merged into NHibernate assembly during build, + thus it does not have to be distributed along with NHibernate.dll. + +Build 1.0.0.0 +======================== + +Improvements: + * ITransaction.Commit and Rollback will not wrap exceptions that derive + from HibernateException into TransactionExceptions, those exceptions + will instead be propagated untouched. + * FieldAccessor now includes correct type in PropertyNotFoundException. + * Oracle9Dialect will now generate a column of type TIMESTAMP(4) + for date fields mapped as "datetime". + +Build 0.99.3.0 (1.0-rc3) +======================== + +Bug Fixes: + * [NH-376] - Expression.In w/ an empty collection causes a SQL exception + * [NH-382, NH-392] - problems with ADO transactions that plagued previous + 1.0-rcX versions should all be resolved now. + * [NH-391] - Bug in ReadWriteCache when session is opened with existing + connection + * [NH-394] - NullReferenceException in debug print of session objects. + * [NH-396] - User-provided class names should be trimmed before use + * [NH-397] - ConfigurationSectionHandler doesn't reads empty properties + +Improvements: + * [NH-388] - Support for the "Any", "Meta-Value" tags + * Added fetch attribute from Hibernate 3 with values "select"/"join". + fetch="select" is equivalent to outer-join="false", and fetch="join" + matches outer-join="true". + +Build 0.99.2.0 (1.0-rc2) +======================== + +Bug Fixes: + * [NH-377] - Allow whitespace around dialect name in cfg.xml + * [NH-380] - Error with query after comitted transaction + * [NH-385] - ADOException thrown instead of StaleObjectStateException when + updating stale record + * [NH-386] - Aliases generated for properties with initial underscores should + NOT begin with an underscore + * Using Expression.Eq on a many-to-one property now works again (it was broken + by mistake in 1.0-rc1) + +Improvements: + * [NH-329] - If unsaved-value for or is not specified, + NHibernate will now try to guess it by instantiating an empty object and + retrieving default property values from it (as Hibernate 3 does it). + * The documentation has an "installer" to integrate it in VS .NET Help. + +Build 0.99.1.0 (1.0-rc1) +======================== + +Breaking changes to external API: +- Updated to a newer version of Castle.DynamicProxy. + WARNING: this new version has the same number (1.1.5.0) as the version used + by the previous release of NHibernate, but the binaries are in fact + different and the old 1.1.5.0 will not work with 1.0-rc1. +- NHibernate no longer configures log4net internally. It is now up to the user + to configure logging. +- Accessing a disposed or closed ISession or ITransaction now causes + an ObjectDisposedException. HibernateException or TransactionException could + be thrown in this case before, such cases were also changed to + throw ObjectDisposedException. +- Renamed SQLExpression to SQLCriterion per Hibernate 2.1. Now, {alias} should + be used instead of $alias in SQL criteria. +- Unused constructors for some exceptions were removed. + +Breaking changes to NHibernate extension interfaces: +- Renamed IClassPersister.IsDefaultVersion to IsUnsavedVersion. It now takes + as argument an array of property values instead of an object. +- Renamed IClassPersister.CurrentVersion to GetCurrentVersion to follow naming + conventions closer. +- Fixed MatchMode.Start and MatchMode.End for Like expressions, their meanings + were reversed. +- Dialect.AddIdentitySelectToInsert should now return null if the functionality + is not supported, instead of throwing an exception. + +Bug fixes and enhancements: +- Ported almost all remaining Hibernate 2.1 features to NHibernate: + * subcriteria + * meta attributes + * optimistic-lock setting + * query cache + * select-before-update + * batch lazy loading + * dynamic components + Missing features are Databinder, ScrollableResults and SchemaUpdate. +- Allow serializing an unflushed session (NH-292, Yves Dierick). +- Check that composite id classes override GetHashCode and Equals. +- Throw QueryException when attempting to fetch multiple collections in + a query. +- Added a SectionHandler to allow using .cfg.xml syntax to configure NHibernate + from App.config files. (This was already part of 0.9.1 release but was not + announced in the release notes.) +- Fixed bug when using joined-subclass with key-many-to-one (NH-369). +- Added IType implementations and constants in NHibernateUtil for unsigned + integer types. +- Added index attribute for . +- SchemaExport now generates SQL to create an index when index attribute is + used on or . +- SchemaExport will add an "if exists" clause to "drop table" statement, + if supported by the dialect. +- Heavy refactoring of the documentation; it now contains the documentation for + NHibernate Contributions. +- Fixed a bug when generating a TOP clause for MS SQL Server - the whole SQL + string was being converted to lower case. + +Build 0.9.1.0 +======================== +- Fixed bug in limit clause generation on MySQL. +- Fixed bug in Configuration.AddDocument. +- Fixed not working with ints or shorts. +- NHibernate now checks whether object identifier passed to its methods is of the right type. +- Fixed bug with YesNo type generating CHAR(255) column, it now generates CHAR(1). +- Implemented hibernate.show_sql feature, logging all SQL executed using NHibernate.SQL logger. + +Build 0.9.0.0 +======================== +- Added ISession.Clear(). +- Added configurable command timeout property (hibernate.command_timeout). +- Added named SQL query support. +- Allow to specify an isolation level when starting a transaction. +- Upgraded Castle.DynamicProxy library to the latest version (1.1.5). +- Upgraded log4net library to the latest version (1.2.9). +- Fixed bug with Get/Load loading wrong subclasses because of class discriminant not being included in the generated query (Alexander Popov). +- Fixed VersionNegative unsaved-value strategy not to treat 0 as the unsaved value. +- Fixed bug in SchemaExport for a many-to-many relationship, it now generates a table with non-null columns and a primary key. +- Added IncrementGenerator (Mark Holden). +- Fixed bug with insert attribute not being declared in the schema and having a wrong default value. +- Fixed bug in proxy Equals method always either returning true or failing with a NPE. +- Changed LazyInitializer to match Hibernate 2.1, proxies now don't have their own special implementation of Equals and GetHashCode, either System.Object's or the real class methods are used instead. +- Added more naming strategies (lower case, pascal-case underscored). +- Fixed bug with custom access strategy not working for components. +- Allow using structs (value types) as components. +- Added ISession.Replicate(). +- Added support for using MS SQL TOP clause for paging (Yves Derrick). +- Added persister attribute for collection mappings. +- Fixed a NPE in Junction.ToString(). +- Disabled nullability checks when deleting an object. +- Fixed SchemaExport not to generate duplicate foreign key constraints (this caused problems with Oracle). +- Implemented Copy methods for various ITypes, so that SaveOrUpdateCopy actually works. +- Changed visibility of CollectionEntry class to public to aid XML serializability of collections. It should not be expected to work in all cases since XML serialization has many limitations in .NET. +- Several Oracle-related improvements. +- More informative error message for a bad identifier generation strategy. +- Fixed bug with SchemaExport ignoring foreign-key attribute sometimes. +- Fixed bug with Get/Load not updating the internal nonExists collection of the session (Jerry Shea). +- More informative error message for foreign key problems. +- Throw a more informative exception when attempting to set the value of a non-existent query parameter. +- Do not allow reconnecting a closed session. +- More informative error message when executing ISession.Find("from NonexistentClass"). +- Added more information to the exception thrown when expected and actual row counts from a command do not match. +- Remove underscores from the beginning of generated aliases for fields (Oracle cannot handle them). +- Search the current AppDomain's bin directory for hibernate.cfg.xml, in addition to the application directory. +- Added element as a synonym for . + +Build 0.8.4.0 +======================== +- Added limited support for storing an enum type using its string representation. See the documentation of EnumStringType and TypesTest\EnumStringTypeFixture.cs for an example. +- Fixed bug with BatcherImpl cached commands being disposed. The caching functionality was removed. +- Fixed bug when property paths were used in criteria queries and caused an exception. +- Modified DB2Dialect, Oracle9Dialect and PostgreSQLDialect to use Int32 for limit and offset parameters. +- Various code clean-ups and commenting. + +Build 0.8.3.0 +======================== +- Added name of Property to the PropertyNotFoundException message. +- Fixed bug with that has a . +- Fixed bug with extra "AND" being added to sql. +- Fixed NullReferenceException that could occur in InstantiationException. +- Improved efficiency of GuidCombGenerator (Marc C. Brooks). +- Modified BinaryType to work with MySql's buggy version of GetBytes(). + +Build 0.8.2.0 +======================== +- Fixed default value of "unsaved-value" for in xsd. +- Fixed default value of "unsaved-value" for in xsd. +- Modified "proxy" to use "namespace" and "assembly" from + +Build 0.8.1.0 +======================== +- Fixed bug with defaulting to "null" instead of "undefined". + +Build 0.8.0.0 +======================== +- Added "namespace" and "assembly" attributes to . +- Added lazy="true" as short hand for proxy="full type name" +- Added insert attribute to . +- Added ability to set INamingStrategy on Configuration class. +- Added property-ref attribute on and . +- Added "foreign-key" attribute to , , , key allowing a different column to be the foreign key target +- Added check attribute to column element. +- Added element. +- Added "unsaved-value" to / as DateTime can't support null, use 1/1/0001 to align with .NET default value for DateTime +- Added SaveOrUpdateCopy() which allows synchronisation for detached objects +- Added Expression.Example for Query By Example. +- Added IDriver and Dialect for Sybase (Steve Corbin). +- Added UniqueResult() to ICriteria and IQuery. +- Added default value of hibernate.connection.driver_class to Dialect so most of the time this configuration is not needed. +- Added SByteType to built in ITypes. +- Fixed so that two queries are no longer issued when one side is null. +- Fixed bug with ISet.AddAll(ICollection) not being implemented. (Bill Hawes) +- Fixed bug with being initialized from Cache. +- Fixed bug with hql "select new ClassName(...) from ..." where one parameter was an Enum. (Luca Altea) +- Fixed bug in mapping that required type="full.name.of.enum" to be required instead of NH correctly inferring type. (Luca Altea) +- Fixed bug with a decimal and unsaved-value. +- Fixed problem with loading ADO.NET Data Providers from GAC. +- Fixed issue with TableGenerator not disposing of IDbCommand. +- Improved memory consumption of Configuration, smaller footprint and releases objects faster. +- Improved nhibernate-mapping schema to more schema constructs instead of direct dtd port. +- Improved message from NullableType when DataProvider can't cast the database value to .net class. +- Modified to use "null" or "not null" as the value. +- Modified Dialect to use Hibernate 2.1 methods. +- Modified Expression to return ICriterion instead of Expression class. This will break existing code. +- Modified nhibernate-configuration-2.0.xsd to not require . +- Modified TestFixtures in NHibernate.Test to only execute create/drop ddl in the TestFixtureSetUp/TestFixtureTearDown. +- Split QueryFunctionStandard into ISQLFunction interface and StandardSQLFunction. +- Upgraded to nant-0.85-rc3 and nunit-2.2.0. + +Build 0.7.0.0 +======================== +- Renamed class NHibernate.NHibernate to NHibernate.NHibernateUtil. This will break alot of code if you were using ISession.Find with parameters - migrate to IQuery instead. +- Fixed bug with DateTime type where any value less than 1/1/1753 was written to the database as null. If you were relying on this then the Nullables library in NHibernateContrib is the way to code null values for DateTime properties. +- Added ISession.Get() as an alternative to ISession.Load() (Sergey Koshcheyev). +- Added IDisposable to EnumerableImpl, ISession, ITransaction, IBatcher, and IConnectionProvider. +- Added default value of hibernate.connection.driver_class to Dialects. +- Added default value of hibernate.prepare_sql="false" to MsSql2000Dialect. +- Added [ComVisible(false)] to NHibernate AssemblyInfo. +- Added OracleDataClientDriver for Oracle.DataAccess assembly (James Mills). +- Added IDriver and Dialect for SQLite (Ioan Bizau). +- Fixed messages in exceptions from GetGetter and GetSetter in BasicPropertyAccessor and NoSetterAccessor. +- Fixed problem of LazyInitializationException losing InnerException. +- Fixed problem of Collections not always getting cached. +- Fixed Id.TableGenerator so it works with Oracle. +- Fixed problem with SequenceHiLoGenerator and converting to Int64 (Yves Dierick). +- Fixed problem of some NHibernate Exceptions not being serializable. +- Improved documentation in IQuery to explain how SetMaxResult is working. +- Improved messages in Exceptions thrown by ISetter. +- Improved messages in Exceptions for Persisters with problems parsing discriminator values. +- Improved Configuration.AddAssembly() to process hbm.xml files with subclass/joined-subclass files using "extends" in correct order (Mark Traudt). Also added overload of AddAssembly(Assembly,bool) that can be used to skip ordering. +- Many internal cleanups from FxCop reccommendations. +- Modified ISession.Lock() to allow reassociating transient instances like hibernate 2.1 (Sergey Koshcheyev). +- Modified Exception thrown by Preparer when the IDbCommand.Prepare() method fails to ADOException. +- Modified SqlCommand.Parameter to be immutable. +- Modified how constraints are generated to work with MySql 4.1 (Bill Hawes). +- Modified Dialect to throw an ArgumentException when an unsupported DbType is used. +- Modified constructors on NHibernate Collections to be internal instead of public. +- Renamed Transaction to AdoTransaction. + +Build 0.6.0.0 +======================== +- Added support for proxy="" on classes. proxy="" must either specify an Interface or the properties that need to be proxied have to be virtual. +- Added a configuration parameter "hibernate.prepare_sql" to turn on or off calls to IDbCommand.Prepare(). +- Added NHibernate Type for System.SByte. (Sergey Koshcheyev) +- Added support for mapping subclasses and joined-subclasses in different files through addition of extends attribute. (Andrew Mayorov) +- Added support for LIMIT to MySQLDialect. (Sergey Koshcheyev) +- Improved error messages when IDbCommand and IDbConnection can't be found by the IDriver. +- Improved error message when mapped class is missing a constructor with no args. +- Fixed problem with spaces in sql generated from hql and MySql. +- Fixed bug with Configuration when there is a class without a namespace. +- Fixed bug with Sql generated for an IN clause that contains a class/subclass with a discriminator-value="null". +- Fixed potential threading problem with QueryTranslator. +- Modified logging in Transaction to not generate as many messages. +- Modified how exceptions are rethrown so call stack of original exception is not lost. +- Moved NHibernate.Tasks and NHibernate.Tool.hbm2net to the NHibernateContrib package. +- Removed DbType {get;} from IUserType. + +Build 0.5.0.0 +======================== +- Added Iesi.Collections Library that contains an ISet. Code was taken from http://www.codeproject.com/csharp/sets.asp. +- Fixed hbm2net problem with spaces in arguments. (Kevin Williams) +- Added a NHibernateContrib project that contains Nullable Types for .net 1.1 designed for WinForm Databinding. (Donald Mull) +- Added DB2Driver and DB2Dialect to core of NHibernate. (Martijn Boland) +- Fixed IQuery.SetParameter() when the value is an Enum +- Updated to latest MySql Data Provider and changed classes to MySqlDataDriver. Removed binaries from CVS since they are GPL now. +- Isolated test and classes that use DbType.Time into their own fixtures. Data Drivers don't implement this consistently. +- Fixed problem where HQL was not parsing Enums correctly. (Peter Smulovics) +- Fixed Int16 not working as a Property. +- Added CLSCompliantAttribute(true) attribute to NHibernate and Iesi.Collections. +- Fixed how Exceptions are rethrown to not lose the stack trace. +- Added more comments around ISession.Find and ISession.Enumerate to explain Cache usage. +- Fixed bug with dynamic-update generating SQL for all properties. (Sergey Koshcheyev) +- Add Clover.NET into NHibernate build process thanks to license donated by Cenqua (www.cenqua.com). +- Modified TableGenerator to default first id to "1" instead of "0" to work better with unsaved-value. (Karl Andersson) + +Alpha Build 0.4.0.0 +======================== +- Started work on documentation. +- Improved Cache to use pluggable CacheProviders like Hibernate 2.1. (Kevin Williams) +- Removed properties UseScrollableResults, BatchSize, and FetchSize - not applicable to ADO.NET. +- Fixed problem with object not getting removed from Cache when Evicted from Session. +- Added to MySqlDialect a mapping from DbType.Guid to varchar(40) for schema-export. (Thomas Kock) +- Added lowercase-underscore naming strategy. (Corey Behrends) +- Fixed bug with access="field" and no type="" attribute causing Exception in ReflectHelper. +- Removed IVersionType implementation from TimeType and DateType. +- Moved Eg namespace from NHibernate core to NHibernate.Eg project. +- Added guid.comb id generator. (Donald Mull) +- Added ability to configure with a cfg.xml embedded as a resource in an assembly (Thomas Kock) +- Fixed PostgreSQLDialect binding of Limit Parameters. (Martijn Boland) +- Began restructure of lib folder to support net-1.0, net-1.1, net-2.0, and mono-1.0 in build. Still only 'officially' supports net-1.1. + +Alpha Build 0.3.0.0 +======================== +- Removed property AdoTransaction from Transaction. +- Added MsSql7Dialect. +- Added PostgreSQL Driver and Dialect (Oliver Weichhold & Martijn Boland). +- Fixed bug with Expression.Ge() not returning correct Expression. +- PersistentCollection now implements ICollection (Donald Mull). +- BatcherImpl and PreparerImpl were combined and code cleaned up thanks to problems found when using Ngpsql (Martijn Boland). +- ITransaction is now responsible for joining IDbCommand to IDbTransaction instead of IBatcher - if applicable. +- Modified code to help improve performance of Drivers that don't support multiple Open DataReaders on a single IDbConnection. +- Fixed bug with hbm2net and VelocityRenderer throwing Exception (Carlos Guzmn lvarez & Peter Smulovics). +- Clean up of hbm2net (Peter Smulovics). +- Modified internals of AbstractEntityPersister to help with buiding on Mono (Oliver Weichhold). +- Renamed nhibernate.build to NHibernate.build to help with building on Mono (Oliver Weichhold). +- Removed Dialect.GetLimitString(string) should use Dialect.GetLimitString(SqlString) instead. +- SqlStringBuilders were modified to set an initial capacity for the ArrayList. +- Added properties to SqlString to help with SqlStringBuilders and Hql. +- Marked Exceptions as [Serializable]. +- Fixed bug with Hql not being able to use a constant in an imported or mapped Class. +- DateTimeType.DeepCopyNotNull() cleaned up (Mark Traudt). +- Added VersionProperty to IClassMetadata. +- Renamed PrimitiveType to ValueTypeType to be more .net style consistent and fixed them up so they inherit from the appropriate class. +- Fixed bug with caching an ObjectType. +- Much code cleaned up for FxCop (Peter Smulovics). +- Fixed bug with , doing an Add, and then a Flush() resulting in the entity in there twice. + +Alpha Build 0.2.0.0 +======================== +- Removed support for mapping since it doesn't exist in .net. +- Fixed bug in nhibernate.build file when not signing NHibernate.dll. +- Fixed bug with Hql and SetParameter() where there were 2 parameters with same name. +- Fixed bug with Hql and "IN (:namedParam)". +- Fixed bug with Hql and multi column IType. +- Fixed bug with Hql and scalar queries +- Fixed bug with NullReferenceException and TypeType class. +- ISession.Filter() is now working. +- Compiled Queries and Filters are now cached. +- Refactored Hql to use a SqlString instead of string containing sql. +- Dialect has had public API changed because of Sql to SqlCommand refactoring. +- IPreparer has had methods removed from public API. +- type="System.Object" no longer matches to SerializableType - instead it matches to ObjectType. Use type="Serializable" instead. +- Added "access" attribute for NHibernate to get to fields and properties with no setters. See NHibernate.Property.PropertyAccessorFactory for all valid value types and how to plug in your own implementation of IPropertyAccessor. +- Added Types to read BLOB/CLOB columns to a byte[]/string Property. +- Modified Expression.Sql() to require use of SqlString if parameters are used. +- TypeFactory was modified to allow the attribute "type" to be the Assembly Qualified Name, Full Name, NHibernate IType.Name, or Hibernate name to help with porting hibernate hbm.xml files and Net2Hbm that John is writing. +- hibernate.connection.isolation configuration now affects the IDbTransaction's IsolationLevel, it is parsed as the name value of the IsolationLevel enum - "Chaos", "ReadCommitted", "ReadUncommitted", "RepeatableRead", "Serializable", and "Unspecified". +- ICriteria.SetMaxResults() is now working. +- IQuery.SetMaxResults().Enumerable() is now working. +- Modifed Test Fixtures to help isolate problems caused by DataProviders. + +PreAlpha Build 0.1.0.0 +======================== +- NHibernate and HashCodeProvider are now strong named assemblies. The key used to sign the assemblies is not in CVS. +- Many more Tests implemented. +- Added Examples into CVS and zip. +- ConnectionProvider uses settings passed to it by ConnectionProviderFactory instead of default settings. +- Hbm2Net moved from NHibernate folder to its own folder and NAnt Tasks for it contributed by Kevin Williams. +- Adding properties to Cfg instead of using app.config/web.config or cfg.xml now supported. +- In cfg.xml, an assembly where the resource can be found is now needed - ie: . +- nhibernate-configuration-2.0.xsd schema was updated to .net friendly names and all cfg.xml files are now validated. +- Fixed bug with classes having dynamic-insert and dynamic-update causing IndexOutOfRangeExceptions. +- Modified length of string for CultureInfoType. +- Added Firebird fixes contributed by Carlos Guzmn lvarez. +- Changed TimestampType.Set to behaive like hibernate. Will not write a null value anymore - instead replaces it with DateTime.Now. +- Removed IVersionType interface from DecimalType. +- Add PropertyExpressions contributed by Carlos Guzmn lvarez. +- Fixed bug with referencing joined classes properties in hql. +- Fixed IndexOutOfRangeException with NormalizedEntityPersister for versioned entities. +- Added ObjectType to TypeFactory and NHibernate. +- Fixed problem with hql subselects referencing a class in main query. +- Limited support for Serializing a Session. Sometimes a Refresh() is needed after Deserialization. +- Fixed bug with sending a one-to-many collection to be updated that involves inserting a new row. + +PreAlpha Build 6 +======================== +- Fixed Configuration so app.config/web.config behaives like hibernate.properties and a hibernate.cfg.xml. Settings in app.confg/web.config are no longer required if a cfg.xml file is used. +- Dialects now set default values for outer joins. +- Fixed bug in ArrayHolder with null elements. +- Added IDisposable to ISession +- Fixed bug with lazy loaded SortedSet during Flush(). +- Fixed problem with Loading using LockModes because of missing columns with Forumlas. +- Added SetAnsiString to IQuery +- Fixed bug with IDbCommands used in a Session that is Disconnected and Reconnected not being associated with the correct IDbTransaction. +- Driver can disable calls to IDbCommand.Prepare() for Data Providers that don't support it. +- Removed requirement to set length with type attribute - ie, can use type="String" instead of type="String(50)". +- schema-export now functions just like it does with hibernate 2.0.3 +- Converting a SqlString to an IDbCommand is now a Driver specific function because different Driver's have different requirements for IDbCommands. +- Added HashCodeProvider.dll to remove problems with RuntimeHelpers.GetHashCode causing MissingMethodException with App Domain reloading with ASP.NET and NUnit. + +PreAlpha Build 5 +======================== +- Added check in Configuration for 1.1 version of runtime. +- Removed reference in NHibernate.csproj to nunit.framework.dll. +- Fixed update="true" when values different than insert attribute. +- Enumerable with HQL now works with multiple results. +- Fixed NullReferenceException in EvictCollections. +- Fixed bug with lazy loaded sorted collections not loading correctly. +- Fixed problem with cascading deletes causing OutOfMemoryException. +- Implemented more TestFixtures. + +PreAlpha Build 4 +======================== +- Implemented most DomainModel classes and hbms for testing +- Implemented more TestFixtures (both migrated and new) +- Added Oracle Dialects and Drivers (thanks to feilng for contributing those!) +- Modified classes in Type namespace to support reading values from Oracle Driver +- Added DotNetMock.dll to NHibernate.Test assembly to help with testing Type namesapce +- Fixed parameter parsing so both Named Params (:name) and ? can be used in HQL +- Fixed problem with joins in HQL +- Fixed problem with , , and where lazy="true" +- Fixed problem with being bound to a Bag instead of IdentifierBag +- Fixed problem with CollectionPersister.WriteRowSelect and IdentifierBags +- Fixed problem with when a null value was in the array +- Fixed problem with sending an unneeded Update before a Delete +- Fixed problem with null aliases and Parameter.Equals() +- Cleaned up HQL parsing so it internally throws fewer exceptions +- ConnectionProvider's now provide internal IDbConnection cache like h2.0.3 - not on by default +- Fixed problem with StringHelper.Replace being passed a null template +- is now supported +- is now supported +- read only and a read-write can now refer to the same column without problems. +- changed value of Dialect.SupportForUpdateOf to false, like h2.0.3 has it +- Id generation strategies that use TableGenerator now work for all Drivers +- Modified IdentityMap to use SequencedHashMap instead of ListDictionary (thanks to feling for finding the performance problems that ListDictionary was causing) +- Fixed problem with Expresion.Juction.GetTypedValues() not returning correct TypedValue[] + + +PreAlpha Build 3 +======================== +- Synched Cache Namespace with cache package in H2.0.3 +- Synched CollectionPersister with H2.0.3 +- Synched Config Namespace with config package in H2.0.3. +- Synched Cascade strategies with H2.0.3 +- Synched Dialect Namespace with dialect package in H2.0.3 +- Started HQL Namespace synch with hql package in H2.0.3. There are still some issues in there. +- Synched Id Namespace with id package in H2.0.3 +- Synched Mapping namespace with mapping package in H2.0.3. +- Added ForUpdateFragment +- hbm2net created. +- Added AnsiStringType. +- Added GuidType. +- Fixed problem with IdentityMap that caused to not work. +- Added support for and mappings. +- Implemented sorted collections. +- Build files rewritten. +- MsSql Dialect now issues one statement to Insert and retrieve identity value. +- Fixed a bug with +- Implemented SqlExpression for Criteria queries. +- Initial fix of Multiple IDataReaders being opened with Entities that contain mappings. +- Fixed problems with Alias and Ms Sql Server. + +PreAlpha Build 2 +======================== +- Continued to synchronize NHibernate with Hibernate 2.0.3's features. +- Modifed BooleanType to use GetBoolean instead of GetByte +- Modified MsSqlServer2000Dialect to maps a BooleanSqlType to a bit column type. +- Fixed bug with IdentityMap that caused problems with Session.Flush() loading lazy collections +- Added TicksType to TypeFactory +- Fixed bug with SchemaExport committing a non existing IDbTransaction \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/lib/net40/NHibernate.dll b/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/lib/net40/NHibernate.dll new file mode 100644 index 00000000..cc274c49 Binary files /dev/null and b/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/lib/net40/NHibernate.dll differ diff --git a/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/lib/net40/NHibernate.xml b/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/lib/net40/NHibernate.xml new file mode 100644 index 00000000..2d01e198 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/lib/net40/NHibernate.xml @@ -0,0 +1,43816 @@ + + + + NHibernate + + + + + Implementation of BulkOperationCleanupAction. + + + + + An operation which may be scheduled for later execution. + Usually, the operation is a database insert/update/delete, + together with required second-level cache management. + + + + Called before executing any actions + + + Execute this action + + + + What spaces (tables) are affected by this action? + + + + + Get the before-transaction-completion process, if any, for this action. + + + + + Get the after-transaction-completion process, if any, for this action. + + + + + Create an action that will evict collection and entity regions based on queryspaces (table names). + + + + + Any action relating to insert/update/delete of a collection + + + + + Initializes a new instance of . + + The that is responsible for the persisting the Collection. + The Persistent collection. + The identifier of the Collection. + The that the Action is occurring in. + + + Called before executing any actions + + + Execute this action + + + + Compares the current object with another object of the same type. + + + A 32-bit signed integer that indicates the relative order of the objects being compared. The return value has the following meanings: Value Meaning Less than zero This object is less than the other parameter.Zero This object is equal to other. Greater than zero This object is greater than other. + + An object to compare with this object. + + + + What spaces (tables) are affected by this action? + + + + Execute this action + + This method is called when a new non-null collection is persisted + or when an existing (non-null) collection is moved to a new owner + + + + + Removes a persistent collection from its loaded owner. + + The collection to to remove; must be non-null + The collection's persister + The collection key + Indicates if the snapshot is empty + The session + Use this constructor when the collection is non-null. + + + + Removes a persistent collection from a specified owner. + + The collection's owner; must be non-null + The collection's persister + The collection key + Indicates if the snapshot is empty + The session + Use this constructor when the collection to be removed has not been loaded. + + + + Acts as a stand-in for an entity identifier which is supposed to be + generated on insert (like an IDENTITY column) where the insert needed to + be delayed because we were outside a transaction when the persist + occurred (save currently still performs the insert). + + The stand-in is only used within the see cref="NHibernate.Engine.PersistenceContext" + in order to distinguish one instance from another; it is never injected into + the entity instance or returned to the client... + + + + + Base class for actions relating to insert/update/delete of an entity + instance. + + + + + Instantiate an action. + + The session from which this action is coming. + The id of the entity + The entity instance + The entity persister + + + + Entity name accessor + + + + + Entity Id accessor + + + + + Entity Instance + + + + + Session from which this action originated + + + + + The entity persister. + + + + + Delegate representing some process that needs to occur before transaction completion. + + + NH specific: C# does not support dynamic interface proxies so a delegate is used in + place of the Hibernate interface (see Action/BeforeTransactionCompletionProcess). The + delegate omits the parameter as it is not used. + + + + + Delegate representing some process that needs to occur after transaction completion. + + Did the transaction complete successfully? True means it did. + + NH specific: C# does not support dynamic interface proxies so a delegate is used in + place of the Hibernate interface (see Action/AfterTransactionCompletionProcess). The + delegate omits the parameter as it is not used. + + + + Format an SQL statement using simple rules: + a) Insert newline after each comma; + b) Indent three spaces after each inserted newline; + If the statement contains single/double quotes return unchanged, + it is too complex and could be broken by simple formatting. + + + + Represents the the understood types or styles of formatting. + + + Centralize logging handling for SQL statements. + + + Constructs a new SqlStatementLogger instance. + + + Constructs a new SqlStatementLogger instance. + Should we log to STDOUT in addition to our internal logger. + Should we format SQL ('prettify') prior to logging. + + + Log a IDbCommand. + Title + The SQL statement. + The requested formatting style. + + + Log a IDbCommand. + The SQL statement. + The requested formatting style. + + + + Manages prepared statements and batching. Class exists to enforce separation of concerns + + + + + Manages s and s + for an . + + +

+ Abstracts ADO.NET batching to maintain the illusion that a single logical batch + exists for the whole session, even when batching is disabled. + Provides transparent IDbCommand caching. +

+

+ This will be useful once ADO.NET gets support for batching. Until that point + no code exists that will do batching, but this will provide a good point to do + error checking and making sure the correct number of rows were affected. +

+
+
+ + + Get an for using in loading / querying. + + The to convert to an . + The of the command. + The SqlTypes of parameters + in . + + An that is ready to be executed. + + + + If not explicitly released by , it will be + released when the session is closed or disconnected. + + + This does NOT add anything to the batch - it only creates the IDbCommand and + does NOT cause the batch to execute... + + + + + + Get a non-batchable an to use for inserting / deleting / updating. + Must be explicitly released by CloseCommand() + + The to convert to an . + The of the command. + The SqlTypes of parameters + in . + + An that is ready to have the parameter values set + and then executed. + + + + + Close a opened using PrepareCommand() + + The to ensure is closed. + The to ensure is closed. + + + + Close a opened using + + The to ensure is closed. + + + + Get a batchable to use for inserting / deleting / updating + (might be called many times before a single call to ExecuteBatch() + + + After setting parameters, call AddToBatch() - do not execute the statement + explicitly. + + The to convert to an . + The of the command. + The SqlTypes of parameters + in . + + + + + Add an insert / delete / update to the current batch (might be called multiple times + for a single PrepareBatchStatement()) + + Determines whether the number of rows affected by query is correct. + + + + Execute the batch + + + + + Close any query statements that were left lying around + + + Use this method instead of Dispose if the + can be used again. + + + + + Gets an by calling ExecuteReader on the . + + The to execute to get the . + The from the . + + The Batcher is responsible for ensuring that all of the Drivers rules for how many open + s it can have are followed. + + + + + Executes the . + + The to execute. + The number of rows affected. + + The Batcher is responsible for ensuring that all of the Drivers rules for how many open + s it can have are followed. + + + + + Must be called when an exception occurs. + + + + + + Cancel the current query statement + + + + + Gets the value indicating whether there are any open resources + managed by this batcher (IDbCommands or IDataReaders). + + + + + Gets or sets the size of the batch, this can change dynamically by + calling the session's SetBatchSize. + + The size of the batch. + + + + Initializes a new instance of the class. + + The owning this batcher. + + + + + Prepares the for execution in the database. + + + This takes care of hooking the up to an + and if one exists. It will call Prepare if the Driver + supports preparing commands. + + + + + Ensures that the Driver's rules for Multiple Open DataReaders are being followed. + + + + + Adds the expected row count into the batch. + + The number of rows expected to be affected by the query. + + If Batching is not supported, then this is when the Command should be executed. If Batching + is supported then it should hold of on executing the batch until explicitly told to. + + + + + A flag to indicate if Dispose() has been called. + + + + + Finalizer that ensures the object is correctly disposed of. + + + + + Takes care of freeing the managed and unmanaged resources that + this class is responsible for. + + + + + Takes care of freeing the managed and unmanaged resources that + this class is responsible for. + + Indicates if this BatcherImpl is being Disposed of or Finalized. + + If this BatcherImpl is being Finalized (isDisposing==false) then make sure not + to call any methods that could potentially bring this BatcherImpl back to life. + + + + + Gets the current that is contained for this Batch + + The current . + + + + Gets or sets the size of the batch, this can change dynamically by + calling the session's SetBatchSize. + + The size of the batch. + + + + Gets the the Batcher was + created in. + + + The the Batcher was + created in. + + + + + Gets the for this batcher. + + + + Implementation of ColumnNameCache. Thread safe. + + + + Manages the database connection and transaction for an . + + + This class corresponds to ConnectionManager and JDBCContext in Hibernate, + combined. + + + + The batcher managed by this ConnectionManager. + + + + Expected row count. Valid only for batchable expectations. + + + + Factory for instances. + + + + Provide the class of according to the configuration + and the capabilities of the driver. + + + By default, .Net doesn't have any batching capabilities, drivers that does have + batching support. + The BatcherFactory trough session-factory configuration section. + This interface was added in NHibernate for backdraw compatibility to have the ability + to specify a default for a specific . + + + + + An implementation of the + interface that does no batching. + + + + + Initializes a new instance of the class. + + The for this batcher. + + + + + Executes the current and compares the row Count + to the expectedRowCount. + + + The expected number of rows affected by the query. A value of less than 0 + indicates that the number of rows to expect is unknown or should not be a factor. + + + Thrown when there is an expected number of rows to be affected and the + actual number of rows is different. + + + + + This Batcher implementation does not support batching so this is a no-op call. The + actual execution of the is run in the AddToBatch + method. + + + + + + A BatcherFactory implementation which constructs Batcher instances + that do not perform batch operations. + + + + + Summary description for OracleDataClientBatchingBatcher. + By Tomer Avissar + + + + + A ResultSet delegate, responsible for locally caching the columnName-to-columnIndex + resolution that has been found to be inefficient in a few vendor's drivers (i.e., Oracle + and Postgres). + + + + + + Expose the batch functionality in ADO.Net 2.0 + Microsoft in its wisdom decided to make my life hard and mark it internal. + Through the use of Reflection and some delegates magic, I opened up the functionality. + + Observable performance benefits are 50%+ when used, so it is really worth it. + + + + + Append a command to the batch + + + + + + This is required because SqlClient.SqlCommandSet will throw if + the command has no parameters. + + + + + + Executes the batch + + + This seems to be returning the total number of affected rows in all queries + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + 2 + + + + Return the batch command to be executed + + + + + The number of commands batched in this instance + + + + + Any exception that occurs in the O-R persistence layer. + + + Exceptions that occur in the database layer are left as native exceptions. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message that describes the error. + + + + Initializes a new instance of the class. + + + The exception that is the cause of the current exception. If the innerException parameter + is not a null reference, the current exception is raised in a catch block that handles + the inner exception. + + + + + Initializes a new instance of the class. + + The message that describes the error. + + The exception that is the cause of the current exception. If the innerException parameter + is not a null reference, the current exception is raised in a catch block that handles + the inner exception. + + + + + Initializes a new instance of the class + with serialized data. + + + The that holds the serialized object + data about the exception being thrown. + + + The that contains contextual information about the source or destination. + + + + + CodeDOM-based bytecode provider. + + + + + Retrieve the delegate for this provider + capable of generating reflection optimization components. + + The class to be reflected upon. + All property getters to be accessed via reflection. + All property setters to be accessed via reflection. + The reflection optimization delegate. + + + + The specific factory for this provider capable of + generating run-time proxies for lazy-loading purposes. + + + + + NHibernate's object instaciator. + + + For entities and its implementations. + + + + + Instanciator of NHibernate's collections default types. + + + + + ctor + + The target class + Array of setters + Array of getters + + + + Set up the compiler options + + + + + Add an assembly to the list of ReferencedAssemblies + required to build the class + + + + + + Build the generated code + + Generated code + An instance of the generated class + + + + Check if the property is public + + + If IsPublic==true I can directly set the property + If IsPublic==false I need to use the setter/getter + + + + + + + Generate the required code + + C# code + + + + Represents optimized entity property access. + + + + + Factory that generate object based on IReflectionOptimizer needed to replace the use + of reflection. + + + Used in and + + + + + + Generate the IReflectionOptimizer object + + The target class + Array of setters + Array of getters + if the generation fails + + + + Represents reflection optimization for a particular class. + + + + + Represents optimized entity instantiation. + + + + + Perform instantiation of an instance of the underlying class. + + The new instance. + + + + Class constructor. + + + + + Generates a dynamic method which creates a new instance of + when invoked. + + + + + Generates a dynamic method on the given type. + + + + + Generates a dynamic method on the given type. + + + + + + Interface for instanciate all NHibernate objects. + + + + + Creates an instance of the specified type. + + The type of object to create. + A reference to the created object. + + + + Creates an instance of the specified type. + + The type of object to create. + true if a public or nonpublic default constructor can match; false if only a public default constructor can match. + A reference to the created object. + + + + Creates an instance of the specified type using the constructor + that best matches the specified parameters. + + The type of object to create. + An array of constructor arguments. + A reference to the created object. + + + + An interface for factories of proxy factory instances. + + + Used to abstract from the tupizer. + + + + + Build a proxy factory specifically for handling runtime + lazy loading. + + The lazy-load proxy factory. + + + + Emits an ldc.i4 opcode using the fastest available opcode choice. + + + + + Emits IL to unbox a value type and if null, create a new instance of the value type. + + + This does not work if the value type doesn't have a default constructor - we delegate + that to the ISetter. + + + + + Defines a new delegate type. + + + + + Type factory for collections types. + + + + + Creates a new for an . + + The role the collection is in. + The name of the property in the + owner object containing the collection ID, or if it is + the primary key. + The to use to create the array. + Is embedded in XML (not supported yet) + + An for the specified role. + + + + + Creates a new for an + with bag semantics. + + The type of elements in the list. + The role the collection is in. + + The name of the property in the owner object containing the collection ID, + or if it is the primary key. + + Is embedded in XML (not supported yet) + + A for the specified role. + + + + + Creates a new for an + with list + semantics. + + The type of elements in the list. + The role the collection is in. + + The name of the property in the + owner object containing the collection ID, or if it is + the primary key. + + Is embedded in XML (not supported yet) + + A for the specified role. + + + + + Creates a new for an + with identifier + bag semantics. + + The type of elements in the list. + The role the collection is in. + The name of the property in the + owner object containing the collection ID, or if it is + the primary key. + + Is embedded in XML (not supported yet) + + A for the specified role. + + + + + Creates a new for an . + + The type of elements in the collection. + The role the collection is in. + The name of the property in the + owner object containing the collection ID, or if it is + the primary key. + Is embedded in XML (not supported yet) + A for the specified role. + + + + Creates a new for a sorted . + + The type of elements in the collection. + The role the collection is in. + The name of the property in the + owner object containing the collection ID, or if it is + the primary key. + Is embedded in XML (not supported yet) + The to use for the set. + A for the specified role. + + + + Creates a new for an ordered . + + The type of elements in the collection. + The role the collection is in. + + The name of the property in the owner object containing the collection ID, + or if it is the primary key. + + Is embedded in XML (not supported yet) + A for the specified role. + + + + Creates a new for an + . + + The type of keys in the dictionary. + The type of values in the dictionary. + The role the collection is in. + The name of the property in the + owner object containing the collection ID, or if it is + the primary key. + + Is embedded in XML (not supported yet) + + A for the specified role. + + + + + A implementation that returns + , disabling reflection optimization. + + + + + Marker interface, denoting a client-visible "soft lock" on a cached item. + + + + + A cached instance of a persistent class + + + + + An item of cached data, timestamped with the time it was cached, when it was locked, + when it was unlocked + + + + + Caches data that is sometimes updated while maintaining the semantics of + "read committed" isolation level. If the database is set to "repeatable + read", this concurrency strategy almost maintains the semantics. + Repeatable read isolation is compromised in the case of concurrent writes. + This is an "asynchronous" concurrency strategy. + + + If this strategy is used in a cluster, the underlying cache implementation + must support distributed hard locks (which are held only momentarily). This + strategy also assumes that the underlying cache implementation does not do + asynchronous replication and that state has been fully replicated as soon + as the lock is released. + for a faster algorithm + + + + + + Implementors manage transactional access to cached data. + + + + Transactions pass in a timestamp indicating transaction start time. + + + When used to cache entities and collections the key is the identifier of the + entity/collection and the value should be set to the + for an entity and the results of + for a collection. + + + + + + Attempt to retrieve an object from the Cache + + The key (id) of the object to get out of the Cache. + A timestamp prior to the transaction start time + The cached object or + + + + + Attempt to cache an object, after loading from the database + + The key (id) of the object to put in the Cache. + The value + A timestamp prior to the transaction start time + the version number of the object we are putting + a Comparer to be used to compare version numbers + indicates that the cache should avoid a put if the item is already cached + if the object was successfully cached + + + + + We are going to attempt to update/delete the keyed object + + The key + + + This method is used by "asynchronous" concurrency strategies. + + + + Called after an item has become stale (before the transaction completes). + + + + This method is used by "synchronous" concurrency strategies. + + + + Called after an item has been updated (before the transaction completes), + instead of calling Evict(). + + + + + + This method is used by "synchronous" concurrency strategies. + + + + Called after an item has been inserted (before the transaction completes), instead of calling Evict(). + + + + + This method is used by "synchronous" concurrency strategies. + + + + Called when we have finished the attempted update/delete (which may or + may not have been successful), after transaction completion. + + The key + The soft lock + + This method is used by "asynchronous" concurrency strategies. + + + + Called after an item has been updated (after the transaction completes), + instead of calling Release(). + + + + + + This method is used by "asynchronous" concurrency strategies. + + + + Called after an item has been inserted (after the transaction completes), instead of calling release(). + + + + + This method is used by "asynchronous" concurrency strategies. + + + + Evict an item from the cache immediately (without regard for transaction isolation). + + + + + + + Evict all items from the cache immediately. + + + + + + Clean up all resources. + + + + + + Gets the cache region name. + + + + + Gets or sets the for this strategy to use. + + The for this strategy to use. + + + + Generate an id for a new lock. Uniqueness per cache instance is very + desirable but not absolutely critical. Must be called from one of the + synchronized methods of this class. + + + + + + Do not return an item whose timestamp is later than the current + transaction timestamp. (Otherwise we might compromise repeatable + read unnecessarily.) Do not return an item which is soft-locked. + Always go straight to the database instead. + + + Note that since reading an item from that cache does not actually + go to the database, it is possible to see a kind of phantom read + due to the underlying row being updated after we have read it + from the cache. This would not be possible in a lock-based + implementation of repeatable read isolation. It is also possible + to overwrite changes made and committed by another transaction + after the current transaction read the item from the cache. This + problem would be caught by the update-time version-checking, if + the data is versioned or timestamped. + + + + + Stop any other transactions reading or writing this item to/from + the cache. Send them straight to the database instead. (The lock + does time out eventually.) This implementation tracks concurrent + locks by transactions which simultaneously attempt to write to an + item. + + + + + Do not add an item to the cache unless the current transaction + timestamp is later than the timestamp at which the item was + invalidated. (Otherwise, a stale item might be re-added if the + database is operating in repeatable read isolation mode.) + + Whether the item was actually put into the cache + + + + decrement a lock and put it back in the cache + + + + + Re-cache the updated state, if and only if there there are + no other concurrent soft locks. Release our lock. + + + + + Is the client's lock commensurate with the item in the cache? + If it is not, we know that the cache expired the original + lock. + + + + + Gets the cache region name. + + + + + Lock the item + + + + + Is this item visible to the timestamped transaction? + + + + + + + Don't overwrite already cached items + + + + + + + + + The timestamp on the cached data + + + + + The actual cached data + + + + + Not a lock! + + + + + Represents any exception from an . + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message that describes the error. + + + + Initializes a new instance of the class. + + + The exception that is the cause of the current exception. If the innerException parameter + is not a null reference, the current exception is raised in a catch block that handles + the inner exception. + + + + + Initializes a new instance of the class. + + The message that describes the error. + + The exception that is the cause of the current exception. If the innerException parameter + is not a null reference, the current exception is raised in a catch block that handles + the inner exception. + + + + + Initializes a new instance of the class + with serialized data. + + + The that holds the serialized object + data about the exception being thrown. + + + The that contains contextual information about the source or destination. + + + + + Factory class for creating an . + + + + + No providers implement transactional caching currently, + it was ported from Hibernate just for the sake of completeness. + + + + + Creates an from the parameters. + + The name of the strategy that should use for the class. + The name of the class the strategy is being created for. + if the object being stored in the cache is mutable. + Used to retrieve the global cache region prefix. + Properties the cache provider can use to configure the cache. + An to use for this object in the . + + + + Allows multiple entity classes / collection roles to be + stored in the same cache region. Also allows for composite + keys which do not properly implement equals()/hashCode(). + + + + + Construct a new key for a collection or entity instance. + Note that an entity name should always be the root entity + name, not a subclass entity name. + + The identifier associated with the cached data + The Hibernate type mapping + The entity or collection-role name. + The entiyt mode of the originating session + The session factory for which we are caching + + + + A soft lock which supports concurrent locking, + timestamped with the time it was released + + + This class was named Lock in H2.1 + + + + + Increment the lock, setting the + new lock timeout + + + + + Decrement the lock, setting the unlock + timestamp if now unlocked + + + + + + Can the timestamped transaction re-cache this + locked item now? + + + + + locks are not returned to the client! + + + + + Was this lock held concurrently by multiple + transactions? + + + + + Yes, this is a lock + + + + + Used by + + + + + Implementors define a caching algorithm. + + + + + All implementations must be threadsafe. + + + The key is the identifier of the object that is being cached and the + value is a . + + + + + + Get the object from the Cache + + + + + + + + + + + + + + Remove an item from the Cache. + + The Key of the Item in the Cache to remove. + + + + + Clear the Cache + + + + + + Clean up. + + + + + + If this is a clustered cache, lock the item + + The Key of the Item in the Cache to lock. + + + + + If this is a clustered cache, unlock the item + + The Key of the Item in the Cache to unlock. + + + + + Generate a timestamp + + + + + + Get a reasonable "lock timeout" + + + + + Gets the name of the cache region + + + + + A simple -based cache + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Cache Provider plugin for NHibernate that is configured by using + cache.provider_class="NHibernate.Cache.HashtableCacheProvider" + + + + + Support for pluggable caches + + + + + Configure the cache + + the name of the cache region + configuration settings + + + + + generate a timestamp + + + + + + Callback to perform any necessary initialization of the underlying cache implementation + during ISessionFactory construction. + + current configuration settings + + + + Callback to perform any necessary cleanup of the underlying cache implementation + during . + + + + + Contract for sources of optimistically lockable data sent to the second level cache. + + + Note currently EntityPersisters are + the only viable source. + + + + + Does this source represent versioned (i.e., and thus optimistically lockable) data? + + True if this source represents versioned data; false otherwise. + + + Get the comparator used to compare two different version values together. + An appropriate comparator. + + + + Defines the contract for caches capable of storing query results. These + caches should only concern themselves with storing the matching result ids. + The transactional semantics are necessarily less strict than the semantics + of an item cache. + + + + + Defines a factory for query cache instances. These factories are responsible for + creating individual QueryCache instances. + + + + + A cache provider placeholder used when caching is disabled. + + + + + Configure the cache + + the name of the cache region + configuration settings + + + + + Generate a timestamp + + + + + Callback to perform any necessary initialization of the underlying cache implementation during SessionFactory + construction. + + current configuration settings. + + + + Callback to perform any necessary cleanup of the underlying cache implementation during SessionFactory.close(). + + + + + Caches data that is sometimes updated without ever locking the cache. + If concurrent access to an item is possible, this concurrency strategy + makes no guarantee that the item returned from the cache is the latest + version available in the database. Configure your cache timeout accordingly! + This is an "asynchronous" concurrency strategy. + for a much stricter algorithm + + + + + Get the most recent version, if available. + + + + + Add an item to the cache + + + + + Do nothing + + + + + Invalidate the item + + + + + Invalidate the item + + + + + Do nothing + + + + + Invalidate the item (again, for safety). + + + + + Invalidate the item (again, for safety). + + + + + Do nothing + + + + + Gets the cache region name. + + + + + Initializes a new instance of the class. + + the session factory for this query key, required to get the identifiers of entities that are used as values. + The query string. + The query parameters. + The filters. + The result transformer; should be null if data is not transformed before being cached. + + + + Caches data that is never updated + + + + + Unsupported! + + + + + Unsupported! + + + + + Unsupported! + + + + + Do nothing. + + + + + Do nothing. + + + + + Do nothing. + + + + + Unsupported! + + + + + Gets the cache region name. + + + + + The standard implementation of the Hibernate + interface. This implementation is very good at recognizing stale query + results and re-running queries when it detects this condition, recaching + the new results. + + + + + Standard Hibernate implementation of the IQueryCacheFactory interface. Returns + instances of . + + + + + Generates increasing identifiers (in a single application domain only). + + + Not valid across multiple application domains. Identifiers are not necessarily + strictly increasing, but usually are. + + + + + + + + + + + + + + Tracks the timestamps of the most recent updates to particular tables. It is + important that the cache timeout of the underlying cache implementation be set + to a higher value than the timeouts of any of the query caches. In fact, we + recommend that the the underlying cache not be configured for expiry at all. + Note, in particular, that an LRU cache expiry policy is never appropriate. + + + + + + + + Helper to parse hibernate-configuration XmlNode. + + + + + The XML node name for hibernate configuration section in the App.config/Web.config and + for the hibernate.cfg.xml . + + + + The XML Namespace for the nhibernate-configuration + + + XPath expression for bytecode-provider property. + + + XPath expression for reflection-optimizer property. + + + XPath expression for session-factory whole node. + + + XPath expression for session-factory.property nodes + + + XPath expression for session-factory.mapping nodes + + + XPath expression for session-factory.class-cache nodes + + + XPath expression for session-factory.collection-cache nodes + + + XPath expression for session-factory.event nodes + + + XPath expression for session-factory.listener nodes + + + + Convert a string to . + + The string that represent . + + The converted to . + + If the values is invalid. + + See for allowed values. + + + + + Convert a string to . + + The string that represent . + + The converted to . + + If the values is invalid. + + See for allowed values. + + + + + Values for class-cache include. + + Not implemented in Cache. + + + Xml value: all + + + Xml value: non-lazy + + + + Configuration parsed values for a class-cache XML node. + + + + + Initializes a new instance of the class. + + The class full name. + Cache strategy. + When is null or empty. + + + + Initializes a new instance of the class. + + The class full name. + Cache strategy. + Values for class-cache include. + When is null or empty. + + + + Initializes a new instance of the class. + + The class full name. + Cache strategy. + The cache region. + When is null or empty. + + + + Initializes a new instance of the class. + + The class full name. + Cache strategy. + Values for class-cache include. + The cache region. + When is null or empty. + + + + The class full name. + + + + + The cache region. + + If null or empty the is used during configuration. + + + + Cache strategy. + + + + + class-cache include. + + + Not implemented in Cache. + Default value . + + + + + Configuration parsed values for a collection-cache XML node. + + + + + Initializes a new instance of the class. + + The cache role. + Cache strategy. + When is null or empty. + + + + Initializes a new instance of the class. + + The cache role. + Cache strategy. + The cache region. + When is null or empty. + + + + The role. + + + + + The cache region. + + If null or empty the is used during configuration. + + + + Cache strategy. + + + + + Configuration parsed values for a event XML node. + + + + + Initializes a new instance of the class. + + The listener. + The type. + + + + The default type of listeners. + + + + + Listeners for this event. + + + + + Values for bytecode-provider system property. + + + + Xml value: codedom + + + Xml value: lcg + + + Xml value: null + + + + Configuration parsed values for hibernate-configuration section. + + + + + Initializes a new instance of the class. + + The XML reader to parse. + + The nhibernate-configuration.xsd is applied to the XML. + + When nhibernate-configuration.xsd can't be applied. + + + + Value for bytecode-provider system property. + + Default value . + + + + Value for reflection-optimizer system property. + + Default value true. + + + + The if the session-factory exists in hibernate-configuration; + Otherwise null. + + + + + Configuration parsed values for a listener XML node + + + + + Initializes a new instance of the class. + + The class full name. + When is null or empty. + + + + Initializes a new instance of the class. + + The class full name. + The listener type. + When is null or empty. + + + + The class full name. + + + + + The listener type. + + Default value mean that the value is ignored. + + + + Configuration parsed values for a mapping XML node + + + There are 3 possible combinations of mapping attributes + 1 - resource and assembly: NHibernate will read the mapping resource from the specified assembly + 2 - file only: NHibernate will read the mapping from the file. + 3 - assembly only: NHibernate will find all the resources ending in hbm.xml from the assembly. + + + + + Initializes a new instance of the class. + + Mapped file. + When is null or empty. + + + + Initializes a new instance of the class. + + The assembly name. + The mapped embedded resource. + When is null or empty. + + + + Configuration parsed values for a session-factory XML node. + + + + + The session factory name. + + + + + Session factory propeties bag. + + + + + Session factory mapping configuration. + + + + + Session factory class-cache configurations. + + + + + Session factory collection-cache configurations. + + + + + Session factory event configurations. + + + + + Session factory listener configurations. + + + + + The session factory name. + + + + + Session factory propeties bag. + + + + + Session factory mapping configuration. + + + + + Session factory class-cache configurations. + + + + + Session factory collection-cache configurations. + + + + + Session factory event configurations. + + + + + Session factory listener configurations. + + + + + Initializes a new instance of the class. + + The session factory name. Null or empty string are allowed. + + + + Define and configure the dialect to use. + + The dialect implementation inherited from . + The fluent configuration itself. + + + + Maximum depth of outer join fetching + + + 0 (zero) disable the usage of OuterJoinFetching + + + + + Set the SessionFactory mnemonic name. + + The mnemonic name. + The fluent configuration itself. + + The SessionFactory mnemonic name can be used as a surrogate key in a multi-DB application. + + + + + DataBase integration configuration. + + + + + Cache configuration. + + + + + Properties of TypeDef configuration. + + + + + + The key to use the type-definition inside not strongly typed mappings (XML mapping). + + + + + An which public properties are used as + type-definition pareneters or null where type-definition does not need parameters or you want use default values. + + + + As an anonimous object can be used: + + configure.TypeDefinition<TableHiLoGenerator>(c=> + { + c.Alias = "HighLow"; + c.Properties = new {max_lo = 99}; + }); + + + + + + + Responsible for checking that a resource name matches the default pattern of "*.hbm.xml". This is the + default filter for . + + + + + Responsible for determining whether an embedded resource should be parsed for HBM XML data while + iterating through an . + + + + + + + + Implemented by any mapping elemes supports simple and/or multicolumn mapping. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A base class for HBM schema classes that provides helper methods. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The relation of the element of the collection. + + + Can be one of: HbmCompositeElement, HbmElement, HbmManyToAny, HbmManyToMany, HbmOneToMany... + according to the type of the collection. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Columns and Formulas, in declared order + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Responsible for converting a of HBM XML into an instance of + . + + + + + Responsible for building a list of objects from a range of acceptable + sources. + + + + + Calls the greedy constructor, passing it new instances of and + . + + + + Adds any embedded resource streams which pass the . + An assembly containing embedded mapping documents. + A custom filter. + + + Adds any embedded resource streams which pass the default filter. + An assembly containing embedded mapping documents. + + + + Responsible for converting a of HBM XML into an instance of + . + + Uses an to deserialize HBM. + + + + Converts a partial class name into a fully qualified one + + + + + + + + Converts a partial class name into a fully one + + + + The class FullName (without the assembly) + + The FullName is equivalent to the default entity-name + + + + + Attempts to find a type by its full name. Throws a + using the provided in case of failure. + + name of the class to find + Error message to use for + the in case of failure. Should contain + the {0} formatting placeholder. + A instance. + + Thrown when there is an error loading the class. + + + + + Similar to , but handles short class names + by calling . + + + + + + + + + Called for all collections. parameter + was added in NH to allow for reflection related to generic types. + + + + + Called for arrays and primitive arrays + + + + + Called for Maps + + + + + Called for all collections + + + + + Bind columns and formulas in the order in which they were mapped. + + + + + + + + Extracts the names of classes mapped in a given file, + and the names of the classes they extend. + + + + + Returns a collection of containing + information about all classes in this stream. + + A validated representing + a mapping file. + + + + Holds information about mapped classes found in the hbm.xml files. + + + + + Allows the application to specify properties and mapping documents to be used when creating + a . + + + + Usually an application will create a single , build a single instance + of , and then instantiate objects in threads + servicing client requests. + + + The is meant only as an initialization-time object. + is immutable and does not retain any association back to the + + + + + Default name for hibernate configuration file. + + + + Clear the internal state of the object. + + + + + Create a new Configuration object. + + + + + Get the mapping for a particular class + + + + Get the mapping for a particular entity + An entity name. + the entity mapping information + + + + Get the mapping for a particular collection role + + a collection role + + + + + Read mappings from a particular XML file. This method is equivalent + to . + + + + + + + Read mappings from a particular XML file. + + a path to a file + This configuration object. + + + + Read mappings from a . This method is equivalent to + . + + an XML string + The name to use in error reporting. May be . + This configuration object. + + + + Read mappings from a . + + an XML string + This configuration object. + + + + Read mappings from a URL. + + a URL + This configuration object. + + + + Read mappings from a URL. + + a to read the mappings from. + This configuration object. + + + + Read mappings from an . + + A loaded that contains the mappings. + The name of the document, for error reporting purposes. + This configuration object. + + + + Takes the validated XmlDocument and has the Binder do its work of + creating Mapping objects from the Mapping Xml. + + The NamedXmlDocument that contains the validated mapping XML file. + + + + Add mapping data using deserialized class. + + Mapping metadata. + XML file's name where available; otherwise null. + + + + Create a new to add classes and collection + mappings to. + + + + + Read mappings from a . + + The stream containing XML + This Configuration object. + + The passed in through the parameter + is not guaranteed to be cleaned up by this method. It is the caller's responsiblity to + ensure that is properly handled when this method + completes. + + + + + Read mappings from a . + + The stream containing XML + The name of the stream to use in error reporting. May be . + This Configuration object. + + The passed in through the parameter + is not guaranteed to be cleaned up by this method. It is the caller's responsiblity to + ensure that is properly handled when this method + completes. + + + + + Adds the mappings in the resource of the assembly. + + The path to the resource file in the assembly. + The assembly that contains the resource file. + This configuration object. + + + + Adds the mappings from embedded resources of the assembly. + + Paths to the resource files in the assembly. + The assembly that contains the resource files. + This configuration object. + + + + Read a mapping from an embedded resource, using a convention. + + The type to map. + This configuration object. + + The convention is for class Foo.Bar.Foo to be mapped by + the resource named Foo.Bar.Foo.hbm.xml, embedded in + the class' assembly. If the mappings and classes are defined + in different assemblies or don't follow the naming convention, + this method cannot be used. + + + + + Adds all of the assembly's embedded resources whose names end with .hbm.xml. + + The name of the assembly to load. + This configuration object. + + The assembly must be loadable using . If this + condition is not satisfied, load the assembly manually and call + instead. + + + + + Adds all of the assembly's embedded resources whose names end with .hbm.xml. + + The assembly. + This configuration object. + + + + Read all mapping documents from a directory tree. Assume that any + file named *.hbm.xml is a mapping document. + + a directory + + + + Generate DDL for dropping tables + + + + + + Generate DDL for creating tables + + + + + + Call this to ensure the mappings are fully compiled/built. Usefull to ensure getting + access to all information in the metamodel when calling e.g. getClassMappings(). + + + + + This method may be called many times!! + + + + + Instantiate a new , using the properties and mappings in this + configuration. The will be immutable, so changes made to the + configuration after building the will not affect it. + + An instance. + + + + Returns the set of properties computed from the default properties in the dialect combined with the other properties in the configuration. + + + + + + Set the default assembly to use for the mappings added to the configuration + afterwards. + + The default assembly name. + This configuration instance. + + This setting can be overridden for a mapping file by setting default-assembly + attribute of <hibernate-mapping> element. + + + + + Set the default namespace to use for the mappings added to the configuration + afterwards. + + The default namespace. + This configuration instance. + + This setting can be overridden for a mapping file by setting default-namespace + attribute of <hibernate-mapping> element. + + + + + Sets the default interceptor for use by all sessions. + + The default interceptor. + This configuration instance. + + + + Specify a completely new set of properties + + + + + Adds an of configuration properties. The + Key is the name of the Property and the Value is the + value of the Property. + + An of configuration properties. + + This object. + + + + + Sets the value of the configuration property. + + The name of the property. + The value of the property. + + This configuration object. + + + + + Gets the value of the configuration property. + + The name of the property. + The configured value of the property, or if the property was not specified. + + + + Configure NHibernate using the <hibernate-configuration> section + from the application config file, if found, or the file hibernate.cfg.xml if the + <hibernate-configuration> section not include the session-factory configuration. + + A configuration object initialized with the file. + + To configure NHibernate explicitly using hibernate.cfg.xml, appling merge/override + of the application configuration file, use this code: + + configuration.Configure("path/to/hibernate.cfg.xml"); + + + + + + Configure NHibernate using the file specified. + + The location of the XML file to use to configure NHibernate. + A Configuration object initialized with the file. + + Calling Configure(string) will override/merge the values set in app.config or web.config + + + + + Configure NHibernate using a resource contained in an Assembly. + + The that contains the resource. + The name of the manifest resource being requested. + A Configuration object initialized from the manifest resource. + + Calling Configure(Assembly, string) will overwrite the values set in app.config or web.config + + + + + Configure NHibernate using the specified XmlReader. + + The that contains the Xml to configure NHibernate. + A Configuration object initialized with the file. + + Calling Configure(XmlReader) will overwrite the values set in app.config or web.config + + + + + Set up a cache for an entity class + + + + + Set up a cache for a collection role + + + + + Create an object-oriented view of the configuration properties + + A object initialized from the settings properties. + + + + Set a custom naming strategy + + the NamingStrategy to set + + + + + Load and validate the mappings in the against + the nhibernate-mapping-2.2 schema, without adding them to the configuration. + + + This method is made public to be usable from the unit tests. It is not intended + to be called by end users. + + The XmlReader that contains the mapping. + The name of the document, for error reporting purposes. + NamedXmlDocument containing the validated XmlDocument built from the XmlReader. + + + + Adds the Mappings in the after validating it + against the nhibernate-mapping-2.2 schema. + + The XmlReader that contains the mapping. + This Configuration object. + + + + Adds the Mappings in the after validating it + against the nhibernate-mapping-2.2 schema. + + The XmlReader that contains the mapping. + The name of the document to use for error reporting. May be . + This Configuration object. + + + + Set or clear listener for a given . + + The . + The array of AssemblyQualifiedName of each listener for . + + must implements the interface related with . + All listeners of the given will be cleared if the + is null or empty. + + + when an element of have an invalid value or cant be instantiated. + + + + + Set or clear listener for a given . + + The . + The listener for or null to clear. + must implements the interface related with . + + + + + Set or clear listeners for a given . + + The . + The listener for or null to clear. + Listeners of must implements one of the interface of event listenesr. + + + + + Append the listeners to the end of the currently configured + listeners + + + + + Generate DDL for altering tables + + + + + + The class mappings + + + + + The collection mappings + + + + + The table mappings + + + + + The named queries + + + + + Retrieve the user-supplied delegate to handle non-existent entity scenarios. + + + Specify a user-supplied delegate to be used to handle scenarios where an entity could not be + located by specified id. This is mainly intended for EJB3 implementations to be able to + control how proxy initialization errors should be handled... + + + + + Gets or sets the to use. + + The to use. + + + + Gets or sets the that contains the configuration + properties and their values. + + + The that contains the configuration + properties and their values. + + + + + Get the query language imports (entityName/className -> AssemblyQualifiedName) + + + + + The named SQL queries + + + + + Naming strategy for tables and columns + + + + + Defines operations common to "compiled" mappings (ie. SessionFactory) and + "uncompiled" mappings (ie Configuration that are used by implementors of IType + + + + + Add a type-definition for mappings. + + The peristent type. + The where add the type-definition. + The custom configuration action. + The . + + + + + Depending on where you will use the type-definition in the mapping the + can be : + + + + + + + + + + + + + + + + + + + + + Summary description for ConfigurationSectionHandler. + + + + + The default + + See for a better alternative + + + + A set of rules for determining the physical column and table names given the information in the mapping + document. May be used to implement project-scoped naming standards for database objects. + + + + + Return a table name for an entity class + + the fully-qualified class name + a table name + + + + Return a column name for a property path expression + + a property path + a column name + + + + Alter the table name given in the mapping document + + a table name + a table name + + + + Alter the column name given in the mapping document + + a column name + a column name + + + + Return a table name for a collection + + the fully-qualified name of the owning entity class + a property path + a table name + + + + Return the logical column name used to refer to a column in the metadata + (like index, unique constraints etc) + A full bijection is required between logicalNames and physical ones + logicalName have to be case insersitively unique for a given table + + given column name if any + property name of this column + + + + The singleton instance + + + + + Return the unqualified class name + + + + + + + Return the unqualified property name + + + + + + + Return the argument + + + + + + + Return the argument + + + + + + + Return the unqualified property name + + + + + + + + Values for class-cache and collection-cache strategy. + + + + Xml value: read-only + + + Xml value: read-write + + + Xml value: nonstrict-read-write + + + Xml value: transactional + + + + Helper to parse to and from XML string value. + + + + + Convert a in its xml expected value. + + The to convert. + The . + + + + Convert a string to . + + The string that represent . + + The converted to . + + If the values is invalid. + + See for allowed values. + + + + + Provides access to configuration information. + + + NHibernate has two property scopes: + + + Factory-level properties may be passed to the when it is + instantiated. Each instance might have different property values. If no properties are + specified, the factory gets them from Environment + + + System-level properties are shared by all factory instances and are always determined + by the properties + + + In NHibernate, <hibernate-configuration> section in the application configuration file + corresponds to Java system-level properties; <session-factory> + section is the session-factory-level configuration. + + It is possible to use the application configuration file (App.config) together with the NHibernate + configuration file (hibernate.cfg.xml) at the same time. + Properties in hibernate.cfg.xml override/merge properties in application configuration file where same + property is found. For others configuration a merge is applied. + + + + + Used to find the .Net 2.0 named connection string + + + + A default database schema (owner) name to use for unqualified tablenames + + + A default database catalog name to use for unqualified tablenames + + + The EntityMode in which set the Session opened from the SessionFactory. + + + + When using an enhanced id generator and pooled optimizers (), + prefer interpreting the database value as the lower (lo) boundary. The default is to interpret it as the high boundary. + + + + Enable formatting of SQL logged to the console + + + Should named queries be checked during startup (the default is enabled). + Mainly intended for test environments. + + + Enable statistics collection + + + Enable ordering of insert statements for the purpose of more effecient batching. + + + + If this setting is set to false, exceptions in IInterceptor.BeforeTransactionCompletion bubble to the caller of ITransaction.Commit and abort the commit. + If this setting is set to true, exceptions in IInterceptor.BeforeTransactionCompletion are ignored and the commit is performed. + The default setting is false. + + + + + Issue warnings to user when any obsolete property names are used. + + + + + + + NHibernate version (informational). + + + + + Gets a copy of the configuration found in <hibernate-configuration> section + of app.config/web.config. + + + This is the replacement for hibernate.properties + + + + + The bytecode provider to use. + + + This property is read from the <nhibernate> section + of the application configuration file by default. Since it is not + always convenient to configure NHibernate through the application + configuration file, it is also possible to set the property value + manually. This should only be done before a configuration object + is created, otherwise the change may not take effect. + + + + + Whether to enable the use of reflection optimizer + + + This property is read from the <nhibernate> section + of the application configuration file by default. Since it is not + always convenient to configure NHibernate through the application + configuration file, it is also possible to set the property value + manually. This should only be done before a configuration object + is created, otherwise the change may not take effect. + + + + + Represents a mapping queued for delayed processing to await + processing of an extends entity upon which it depends. + + + + + An exception that occurs at configuration time, rather than runtime, as a result of + something screwy in the hibernate.cfg.xml. + + + + + An exception that usually occurs at configuration time, rather than runtime, as a result of + something screwy in the O-R mappings + + + + + Initializes a new instance of the class. + + The message that describes the error. + + + + Initializes a new instance of the class. + + + The exception that is the cause of the current exception. If the innerException parameter + is not a null reference, the current exception is raised in a catch block that handles + the inner exception. + + + + + Initializes a new instance of the class. + + The message that describes the error. + + The exception that is the cause of the current exception. If the innerException parameter + is not a null reference, the current exception is raised in a catch block that handles + the inner exception. + + + + + Initializes a new instance of the class + with serialized data. + + + The that holds the serialized object + data about the exception being thrown. + + + The that contains contextual information about the source or destination. + + + + + Initializes a new instance of the class. + + Default message is used. + + + + Initializes a new instance of the class. + + + The exception that is the cause of the current exception. If the innerException parameter + is not a null reference, the current exception is raised in a catch block that handles + the inner exception. + + + + + Initializes a new instance of the class. + + The message that describes the error. + + + + Initializes a new instance of the class. + + The message that describes the error. + + The exception that is the cause of the current exception. If the innerException parameter + is not a null reference, the current exception is raised in a catch block that handles + the inner exception. + + + + + Initializes a new instance of the class + with serialized data. + + + The that holds the serialized object + data about the exception being thrown. + + + The that contains contextual information about the source or destination. + + + + + Summary description for ImprovedNamingStrategy. + + + + + The singleton instance + + + + + Return the unqualified class name, mixed case converted to underscores + + + + + + + Return the full property path with underscore separators, mixed case converted to underscores + + + + + + + Convert mixed case to underscores + + + + + + + Convert mixed case to underscores + + + + + + + Return the full property path prefixed by the unqualified class name, with underscore separators, mixed case converted to underscores + + + + + + + + A collection of mappings from classes and collections to relational database tables. + + Represents a single <hibernate-mapping> element. + + + + Binding table between the logical column name and the name out of the naming strategy + for each table. + According that when the column name is not set, the property name is considered as such + This means that while theoretically possible through the naming strategy contract, it is + forbidden to have 2 real columns having the same logical name + + + + + Binding between logical table name and physical one (ie after the naming strategy has been applied) + + + + + + + + + + + + + + + + + Adds an import to allow for the full class name Namespace.Entity (AssemblyQualifiedName) + to be referenced as Entity or some other name in HQL. + + The name of the type that is being renamed. + The new name to use in HQL for the type. + Thrown when the rename already identifies another type. + + + + + + + + + The default namespace for persistent classes + + + + + The default assembly for persistent classes + + + + + + + + + + + Gets or sets a boolean indicating if the Fully Qualified Type name should + automatically have an import added as the class name. + + if the class name should be used as an import. + + Auto-import is used to shorten the string used to refer to types to just their + unqualified name. So if the type MyAssembly.MyNamespace.MyClass, MyAssembly has + auto-import="false" then all use of it in HQL would need to be the fully qualified + version MyAssembly.MyNamespace.MyClass. If auto-import="true", the type could + be referred to in HQL as just MyClass. + + + + + Queues mapping files according to their dependency order. + + + + + Adds the specified document to the queue. + + + + + Gets a that can now be processed (i.e. + that doesn't depend on classes not yet processed). + + + + + + Checks that no unprocessed documents remain in the queue. + + + + + Holds information about mapped classes found in an embedded resource + + + + + Gets the names of all entities outside this resource + needed by the classes in this resource. + + + + + Gets the names of all entities in this resource + + + + + Settings that affect the behavior of NHibernate at runtime. + + + + + Get the registry to provide Hql-Generators for known properties/methods. + + + + + Reads configuration properties and configures a instance. + + + + + Provides callbacks from the to the persistent object. Persistent classes may + implement this interface but they are not required to. + + + + , , and are intended to be used + to cascade saves and deletions of dependent objects. This is an alternative to declaring cascaded + operations in the mapping file. + + + may be used to initialize transient properties of the object from its persistent + state. It may not be used to load dependent objects since the interface + may not be invoked from inside this method. + + + A further intended usage of , , and + is to store a reference to the for later use. + + + If , , or return + , the operation is silently vetoed. If a + is thrown, the operation is vetoed and the exception is passed back to the application. + + + Note that is called after an identifier is assigned to the object, except when + identity key generation is used. + + + + + + Called when an entity is saved + + The session + If we should veto the save + + + + Called when an entity is passed to . + + The session + A value indicating whether the operation + should be vetoed or allowed to proceed. + + This method is not called every time the object's state is + persisted during a flush. + + + + + Called when an entity is deleted + + The session + A value indicating whether the operation + should be vetoed or allowed to proceed. + + + + Called after an entity is loaded. + + + It is illegal to access the from inside this method.. + However, the object may keep a reference to the session for later use + + The session + The identifier + + + + Veto the action + + + + + Accept the action + + + + + Implemented by persistent classes with invariants that must be checked before inserting + into or updating the database + + + + + Validate the state of the object before persisting it. If a violation occurs, + throw a . This method must not change the state of the object + by side-effect. + + + + + Thrown from when an invariant was violated. Some applications + might subclass this exception in order to provide more information about the violation + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message that describes the error. + + + + Initializes a new instance of the class. + + + The exception that is the cause of the current exception. If the innerException parameter + is not a null reference, the current exception is raised in a catch block that handles + the inner exception. + + + + + Initializes a new instance of the class. + + The message that describes the error. + + The exception that is the cause of the current exception. If the innerException parameter + is not a null reference, the current exception is raised in a catch block that handles + the inner exception. + + + + + Initializes a new instance of the class + with serialized data. + + + The that holds the serialized object + data about the exception being thrown. + + + The that contains contextual information about the source or destination. + + + + + An unordered, unkeyed collection that can contain the same element + multiple times. The .NET collections API, has no Bag. + Most developers seem to use to represent bag semantics, + so NHibernate follows this practice. + + The type of the element the bag should hold. + The underlying collection used is an + + + + Base class for implementing . + + + + + + Persistent collections are treated as value objects by NHibernate. + ie. they have no independent existence beyond the object holding + a reference to them. Unlike instances of entity classes, they are + automatically deleted when unreferenced and automatically become + persistent when held by a persistent object. Collections can be + passed between different objects (change "roles") and this might + cause their elements to move from one database table to another. + + + NHibernate "wraps" a collection in an instance of + . This mechanism is designed + to support tracking of changes to the collection's persistent + state and lazy instantiation of collection elements. The downside + is that only certain abstract collection types are supported and + any extra semantics are lost. + + + Applications should never use classes in this namespace + directly, unless extending the "framework" here. + + + Changes to structure of the collection are recorded by the + collection calling back to the session. Changes to mutable + elements (ie. composite elements) are discovered by cloning their + state when the collection is initialized and comparing at flush + time. + + + + + + Return the user-visible collection (or array) instance + + + By default, the NHibernate wrapper is an acceptable collection for + the end user code to work with because it is interface compatible. + An NHibernate PersistentList is an IList, an NHibernate PersistentMap is an IDictionary + and those are the types user code is expecting. + + + + After flushing, re-init snapshot state. + + + + Clears out any Queued Additions. + + + After a Flush() the database is in synch with the in-memory + contents of the Collection. Since everything is in synch remove + any Queued Additions. + + + + + Called just before reading any rows from the + + + + + Called after reading all rows from the + + + This should be overridden by sub collections that use temporary collections + to store values read from the db. + + + true if NOT has Queued operations + + + + + Called after initializing from cache + + + true if NOT has Queued operations + + + + + Disassociate this collection from the given session. + + + true if this was currently associated with the given session + + + + Associate the collection with the given session. + + + false if the collection was already associated with the session + + + + Read the state of the collection from a disassembled cached value. + + + + + + + + Iterate all collection entries, during update of the database + + + An that gives access to all entries + in the collection. + + + + + Reads the row from the . + + + This method should be prepared to handle duplicate elements caused by fetching multiple collections. + + The IDataReader that contains the value of the Identifier + The persister for this Collection. + The descriptor providing result set column names + The owner of this Collection. + The object that was contained in the row. + + + + Get the identifier of the given collection entry + + + + + Get the index of the given collection entry + + + + + Get the value of the given collection entry + + + + + Get the snapshot value of the given collection entry + + + + + Called before any elements are read into the collection, + allowing appropriate initializations to occur. + + The for this persistent collection. + The anticipated size of the collection after initilization is complete. + + + + Does the current state exactly match the snapshot? + + The to compare the elements of the Collection. + + if the wrapped collection is different than the snapshot + of the collection or if one of the elements in the collection is + dirty. + + + + Is the snapshot empty? + + + + Disassemble the collection, ready for the cache + + The for this Collection. + The contents of the persistent collection in a cacheable form. + + + + Gets a indicating if the rows for this collection + need to be recreated in the table. + + The for this Collection. + + by default since most collections can determine which rows need to be + individually updated/inserted/deleted. Currently only 's for many-to-many + need to be recreated. + + + + + Return a new snapshot of the current state of the collection + + + + + To be called internally by the session, forcing + immediate initalization. + + + This method is similar to , except that different exceptions are thrown. + + + + + Does an element exist at this entry in the collection? + + + + + Do we need to insert this element? + + + + + Do we need to update this element? + + + + + Get all the elements that need deleting + + + + + Is this the wrapper for the given underlying collection instance? + + The collection to see if this IPersistentCollection is wrapping. + + if the IPersistentCollection is wrappping the collection instance, + otherwise. + + + + Get the "queued" orphans + + + + Clear the dirty flag, after flushing changes + to the database. + + + + + Mark the collection as dirty + + + + + Called before inserting rows, to ensure that any surrogate keys are fully generated + + + + + + Called after inserting a row, to fetch the natively generated id + + + + + Get all "orphaned" elements + + The snapshot of the collection. + The persistent class whose objects + the collection is expected to contain. + + An that contains all of the elements + that have been orphaned. + + + + + The owning entity. + + + Note that the owner is only set during the flush + cycle, and when a new collection wrapper is created + while loading an entity. + + + + Get the current collection key value + + + Get the current role name + + + Is the collection unreferenced? + + + + Is the collection dirty? Note that this is only + reliable during the flush cycle, after the + collection elements are dirty checked against + the snapshot. + + + + Get the snapshot cached by the collection instance + + + + Is the initialized collection empty? + + + + + Gets a indicating if the underlying collection is directly + accessible through code. + + + if we are not guaranteed that the NHibernate collection wrapper + is being used. + + + This is typically whenever a transient object that contains a collection is being + associated with an through or . + NHibernate can't guarantee that it will know about all operations that would cause NHibernate's collections + to call or . + + + + + + + + + + + + + + Not called by Hibernate, but used by non-NET serialization, eg. SOAP libraries. + + + + + Return the user-visible collection (or array) instance + + + By default, the NHibernate wrapper is an acceptable collection for + the end user code to work with because it is interface compatible. + An NHibernate PersistentList is an IList, an NHibernate PersistentMap is an IDictionary + and those are the types user code is expecting. + + + + + Called by any read-only method of the collection interface + + + + Called by the Count property + + + + Called by any writer method of the collection interface + + + + + Queue an addition, delete etc. if the persistent collection supports it + + + + + After reading all existing elements from the database, + add the queued elements to the underlying collection. + + + + + Clears out any Queued operation. + + + After flushing, clear any "queued" additions, since the + database state is now synchronized with the memory state. + + + + + Called just before reading any rows from the + + + + + Called after reading all rows from the + + + This should be overridden by sub collections that use temporary collections + to store values read from the db. + + + + + Initialize the collection, if possible, wrapping any exceptions + in a runtime exception + + currently obsolete + if we cannot initialize + + + + Mark the collection as initialized. + + + + + Disassociate this collection from the given session. + + + true if this was currently associated with the given session + + + + Associate the collection with the given session. + + + false if the collection was already associated with the session + + + + Gets a indicating if the rows for this collection + need to be recreated in the table. + + The for this Collection. + + by default since most collections can determine which rows need to be + individually updated/inserted/deleted. Currently only 's for many-to-many + need to be recreated. + + + + + To be called internally by the session, forcing + immediate initalization. + + + This method is similar to , except that different exceptions are thrown. + + + + + Gets the Snapshot from the current session the collection is in. + + + + + Called before inserting rows, to ensure that any surrogate keys are fully generated + + + + + + Called after inserting a row, to fetch the natively generated id + + + + + Get all "orphaned" elements + + + + + Given a collection of entity instances that used to + belong to the collection, and a collection of instances + that currently belong, return a collection of orphans + + + + + Disassemble the collection, ready for the cache + + + + + + + Is this the wrapper for the given underlying collection instance? + + + + + + + Does an element exist at this entry in the collection? + + + + + + + + Get all the elements that need deleting + + + + + Read the state of the collection from a disassembled cached value. + + + + + + + + Do we need to update this element? + + + + + + + + + Reads the row from the . + + The IDataReader that contains the value of the Identifier + The persister for this Collection. + The descriptor providing result set column names + The owner of this Collection. + The object that was contained in the row. + + + + Do we need to insert this element? + + + + + + + + + Get the index of the given collection entry + + + + + Called before any elements are read into the collection, + allowing appropriate initializations to occur. + + The underlying collection persister. + The anticipated size of the collection after initilization is complete. + + + + Is the collection currently connected to an open session? + + + + + Is this collection in a state that would allow us to "queue" additions? + + + + Is this collection in a state that would allow us to + "queue" puts? This is a special case, because of orphan + delete. + + + + Is this collection in a state that would allow us to + "queue" clear? This is a special case, because of orphan + delete. + + + + Is this the "inverse" end of a bidirectional association? + + + + Is this the "inverse" end of a bidirectional association with + no orphan delete enabled? + + + + + Is this the "inverse" end of a bidirectional one-to-many, or + of a collection with no orphan delete? + + + + + + + + Is the initialized collection empty? + + + + + Gets a indicating if the underlying collection is directly + accessible through code. + + + if we are not guaranteed that the NHibernate collection wrapper + is being used. + + + This is typically whenever a transient object that contains a collection is being + associated with an through or . + NHibernate can't guarantee that it will know about all operations that would cause NHibernate's collections + to call or . + + + + Is this instance initialized? + + + Does this instance have any "queued" additions? + + + + + + + + Initializes this PersistentBag from the cached values. + + The CollectionPersister to use to reassemble the PersistentBag. + The disassembled PersistentBag. + The owner object. + + + + Gets a indicating if this PersistentBag needs to be recreated + in the database. + + + + if this is a one-to-many Bag, if this is not + a one-to-many Bag. Since a Bag is an unordered, unindexed collection + that permits duplicates it is not possible to determine what has changed in a + many-to-many so it is just recreated. + + + + + Counts the number of times that the occurs + in the . + + The element to find in the list. + The to search. + The that can determine equality. + The entity mode. + + The number of occurrences of the element in the list. + + + + + Implements "bag" semantics more efficiently than by adding + a synthetic identifier column to the table. + + + + The identifier is unique for all rows in the table, allowing very efficient + updates and deletes. The value of the identifier is never exposed to the + application. + + + Identifier bags may not be used for a many-to-one association. Furthermore, + there is no reason to use inverse="true". + + + + + + Initializes this Bag from the cached values. + + The CollectionPersister to use to reassemble the PersistentIdentifierBag. + The disassembled PersistentIdentifierBag. + The owner object. + + + + A persistent wrapper for an + + The type of the element the list should hold. + The underlying collection used is a + + + + Initializes an instance of the + in the . + + The the list is in. + + + + Initializes an instance of the + that wraps an existing in the . + + The the list is in. + The to wrap. + + + + Initializes this PersistentGenericList from the cached values. + + The CollectionPersister to use to reassemble the PersistentGenericList. + The disassembled PersistentList. + The owner object. + + + + A persistent wrapper for a . Underlying + collection is a + + The type of the keys in the IDictionary. + The type of the elements in the IDictionary. + + + + Construct an uninitialized PersistentGenericMap. + + The ISession the PersistentGenericMap should be a part of. + + + + Construct an initialized PersistentGenericMap based off the values from the existing IDictionary. + + The ISession the PersistentGenericMap should be a part of. + The IDictionary that contains the initial values. + + + + Initializes this PersistentGenericMap from the cached values. + + The CollectionPersister to use to reassemble the PersistentGenericMap. + The disassembled PersistentGenericMap. + The owner object. + + + + A persistent wrapper for an . + + + + + The that NHibernate is wrapping. + + + + + A temporary list that holds the objects while the PersistentSet is being + populated from the database. + + + This is necessary to ensure that the object being added to the PersistentSet doesn't + have its' GetHashCode() and Equals() methods called during the load + process. + + + + + Constructor matching super. + Instantiates a lazy set (the underlying set is un-initialized). + + The session to which this set will belong. + + + + Instantiates a non-lazy set (the underlying set is constructed + from the incoming set reference). + + The session to which this set will belong. + The underlying set data. + + + + Initializes this PersistentSet from the cached values. + + The CollectionPersister to use to reassemble the PersistentSet. + The disassembled PersistentSet. + The owner object. + + + + Set up the temporary List that will be used in the EndRead() + to fully create the set. + + + + + Takes the contents stored in the temporary list created during BeginRead() + that was populated during ReadFrom() and write it to the underlying + PersistentSet. + + + + + A persistent wrapper for an array. lazy initialization is NOT supported + + Use of Hibernate arrays is not really recommended. + + + + A temporary list that holds the objects while the PersistentArrayHolder is being + populated from the database. + + + + + Returns the user-visible portion of the NHibernate PersistentArrayHolder. + + + The array that contains the data, not the NHibernate wrapper. + + + + + Before is called the PersistentArrayHolder needs to setup + a temporary list to hold the objects. + + + + + Takes the contents stored in the temporary list created during + that was populated during and write it to the underlying + array. + + + + + Initializes this array holder from the cached values. + + The CollectionPersister to use to reassemble the Array. + The disassembled Array. + The owner object. + + + + Gets or sets the array. + + The array. + + + + The base class for the ConnectionProvider. + + + + + A strategy for obtaining ADO.NET . + + + The IConnectionProvider interface is not intended to be exposed to the application. + Instead it is used internally by NHibernate to obtain . + Implementors should provide a public default constructor. + + + + + Initialize the connection provider from the given properties. + + The connection provider settings + + + + Dispose of a used + + The to clean up. + + + + Get an open . + + An open . + + + + Gets the this ConnectionProvider should use to + communicate with the .NET Data Provider + + + The to communicate with the .NET Data Provider. + + + + + Closes the . + + The to clean up. + + + + Configures the ConnectionProvider with the Driver and the ConnectionString. + + An that contains the settings for this ConnectionProvider. + + Thrown when a could not be found + in the settings parameter or the Driver Class could not be loaded. + + + + + Get the .NET 2.0 named connection string + + + Thrown when a was found + in the settings parameter but could not be found in the app.config + + + + + Configures the driver for the ConnectionProvider. + + An that contains the settings for the Driver. + + Thrown when the could not be + found in the settings parameter or there is a problem with creating + the . + + + + + Get an open . + + An open . + + + + A flag to indicate if Disose() has been called. + + + + + Finalizer that ensures the object is correctly disposed of. + + + + + Takes care of freeing the managed and unmanaged resources that + this class is responsible for. + + + + + Takes care of freeing the managed and unmanaged resources that + this class is responsible for. + + Indicates if this ConnectionProvider is being Disposed of or Finalized. + +

+ If this ConnectionProvider is being Finalized (isDisposing==false) then make + sure not to call any methods that could potentially bring this + ConnectionProvider back to life. +

+

+ If any subclasses manage resources that also need to be disposed of this method + should be overridden, but don't forget to call it in the override. +

+
+
+ + + Gets the for the + to connect to the database. + + + The for the + to connect to the database. + + + + + Gets the that can create the object. + + + The that can create the . + + + + + Instanciates a connection provider given configuration properties. + + + + + A ConnectionProvider that uses an IDriver to create connections. + + + + + Closes and Disposes of the . + + The to clean up. + + + + Gets a new open through + the . + + + An Open . + + + If there is any problem creating or opening the . + + + + + An implementation of the IConnectionProvider that simply throws an exception when + a connection is requested. + + + This implementation indicates that the user is expected to supply an ADO.NET connection + + + + + Throws an if this method is called + because the user is responsible for closing s. + + The to clean up. + + Thrown when this method is called. User is responsible for closing + s. + + + + + Throws an if this method is called + because the user is responsible for creating s. + + + No value is returned because an is thrown. + + + Thrown when this method is called. User is responsible for creating + s. + + + + + Configures the ConnectionProvider with only the Driver class. + + + + All other settings of the Connection are the responsibility of the User since they configured + NHibernate to use a Connection supplied by the User. + + + + + Provides a current session + for each . + Not recommended for .NET 2.0 web applications. + + + + + Extends the contract defined by + by providing methods to bind and unbind sessions to the current context. + + + The notion of a contextual session is managed by some external entity + (generally some form of interceptor like the HttpModule). + This external manager is responsible for scoping these contextual sessions + appropriately binding/unbinding them here for exposure to the application + through calls. + + + + + Defines the contract for implementations which know how to + scope the notion of a current session. + + + + Implementations should adhere to the following: + + contain a constructor accepting a single argument of type + + should be thread safe + should be fully serializable + + + + Implementors should be aware that they are also fully responsible for + cleanup of any generated current-sessions. + + + Note that there will be exactly one instance of the configured + ICurrentSessionContext implementation per . + + + It is recommended to inherit from the class + whenever possible as it simplifies the implementation and provides + single entry point with session binding support. + + + + + + Retrieve the current session according to the scoping defined + by this implementation. + + The current session. + Typically indicates an issue + locating or creating the current session. + + + + Retrieve the current session according to the scoping defined + by this implementation. + + The current session. + Indicates an issue + locating the current session. + + + + Binds the specified session to the current context. + + + + + Returns whether there is a session bound to the current context. + + + + + Unbinds and returns the current session. + + + + Gets or sets the currently bound session. + + + + Get the dicitonary mapping session factory to its current session. + + + + + Set the map mapping session factory to its current session. + + + + + Gets or sets the currently bound session. + + + + + The key is the session factory and the value is the bound session. + + + + + The key is the session factory and the value is the bound session. + + + + + This class allows access to the HttpContext without referring to HttpContext at compile time. + The accessors are cached as delegates for performance. + + + + + A impl which scopes the notion of current + session by the current thread of execution. Threads do not give us a + nice hook to perform any type of cleanup making + it questionable for this impl to actually generate Session instances. In + the interest of usability, it was decided to have this default impl + actually generate a session upon first request and then clean it up + after the associated with that session + is committed/rolled-back. In order for ensuring that happens, the sessions + generated here are unusable until after {@link Session#beginTransaction()} + has been called. If Close() is called on a session managed by + this class, it will be automatically unbound. +

+ Additionally, the static and methods are + provided to allow application code to explicitly control opening and + closing of these sessions. This, with some from of interception, + is the preferred approach. It also allows easy framework integration + and one possible approach for implementing long-sessions. +

+

+
+ + + Unassociate a previously bound session from the current thread of execution. + + + + + + + Provides a current session + for each thread using the []. + To avoid if there are two session factories in the same thread. + + + + Gets or sets the currently bound session. + + + + Provides a current session + for the current OperationContext in WCF. Works only during the lifetime of a WCF operation. + + + + + Provides a current session + for each System.Web.HttpContext. Works only with web applications. + + + + + Constructed with property name + + + + + Apply a "between" constraint to the named property + + + + + Apply an "in" constraint to the named property + + + + + Apply an "in" constraint to the named property + + + + + Apply an "in" constraint to the named property + + + + + A case-insensitive "like", similar to Postgres "ilike" operator + + + + + A case-insensitive "like", similar to Postgres "ilike" operator + + + + + Apply a "like" constraint to the named property + + + + + Apply a "like" constraint to the named property + + + + + Apply a "like" constraint to the named property + + + + + Apply an "is empty" constraint to the named property + + + + + Apply a "not is empty" constraint to the named property + + + + + Apply an "is null" constraint to the named property + + + + + Apply an "not is null" constraint to the named property + + + + + Constructed with property name + + + + + Add a property equal subquery criterion + + detached subquery + + + + Add a property equal all subquery criterion + + detached subquery + + + + Create a property greater than or equal subquery criterion + + detached subquery + + + + Create a property greater than or equal all subquery criterion + + detached subquery + + + + Create a property greater than or equal some subquery criterion + + detached subquery + + + + Create a property greater than subquery criterion + + detached subquery + + + + Create a property greater than all subquery criterion + + detached subquery + + + + Create a property greater than some subquery criterion + + detached subquery + + + + Create a property in subquery criterion + + detached subquery + + + + Create a property less than or equal subquery criterion + + detached subquery + + + + Create a property less than or equal all subquery criterion + + detached subquery + + + + Create a property less than or equal some subquery criterion + + detached subquery + + + + Create a property less than subquery criterion + + detached subquery + + + + Create a property less than all subquery criterion + + detached subquery + + + + Create a property less than some subquery criterion + + detached subquery + + + + Create a property not equal subquery criterion + + detached subquery + + + + Create a property not in subquery criterion + + detached subquery + + + + Create an alias for the previous projection + + + + + Select an arbitrary projection + + + + + A property average value + + + + + A property average value + + + + + A property value count + + + + + A property value count + + + + + A distinct property value count + + + + + A distinct property value count + + + + + A grouping property value + + + + + A grouping property value + + + + + A property maximum value + + + + + A property maximum value + + + + + A property minimum value + + + + + A property minimum value + + + + + A projected property value + + + + + A projected property value + + + + + A property value sum + + + + + A property value sum + + + + + Constructed with property name + + + + + Apply a "between" constraint to the named property + + + + + Apply an "in" constraint to the named property + + + + + Apply an "in" constraint to the named property + + + + + Apply an "in" constraint to the named property + + + + + A case-insensitive "like", similar to Postgres "ilike" operator + + + + + A case-insensitive "like", similar to Postgres "ilike" operator + + + + + Apply a "like" constraint to the named property + + + + + Apply a "like" constraint to the named property + + + + + Apply a "like" constraint to the named property + + + + + Apply an "is empty" constraint to the named property + + + + + Apply a "not is empty" constraint to the named property + + + + + Apply an "is null" constraint to the named property + + + + + Apply an "not is null" constraint to the named property + + + + + Add an Exists subquery criterion + + + + + Add a NotExists subquery criterion + + + + + Subquery expression in the format + .Where(t => t.Property [==, !=, >, etc.] detachedQueryOver.As<propertyType>()) + + + + + Subquery expression in the format + .Where(() => alias.Property [==, !=, >, etc.] detachedQueryOver.As<propertyType>()) + + + + + Subquery expression in the format + .WhereAll(t => t.Property [==, !=, >, etc.] detachedQueryOver.As<propertyType>()) + + + + + Subquery expression in the format + .WhereAll(() => alias.Property [==, !=, >, etc.] detachedQueryOver.As<propertyType>()) + + + + + Subquery expression in the format + .WhereSome(t => t.Property [==, !=, >, etc.] detachedQueryOver.As<propertyType>()) + + + + + Subquery expression in the format + .WhereSome(() => alias.Property [==, !=, >, etc.] detachedQueryOver.As<propertyType>()) + + + + + Add a property equal subquery criterion + + detached subquery + + + + Add a property equal all subquery criterion + + detached subquery + + + + Create a property greater than or equal subquery criterion + + detached subquery + + + + Create a property greater than or equal all subquery criterion + + detached subquery + + + + Create a property greater than or equal some subquery criterion + + detached subquery + + + + Create a property greater than subquery criterion + + detached subquery + + + + Create a property greater than all subquery criterion + + detached subquery + + + + Create a property greater than some subquery criterion + + detached subquery + + + + Create a property in subquery criterion + + detached subquery + + + + Create a property less than or equal subquery criterion + + detached subquery + + + + Create a property less than or equal all subquery criterion + + detached subquery + + + + Create a property less than or equal some subquery criterion + + detached subquery + + + + Create a property less than subquery criterion + + detached subquery + + + + Create a property less than all subquery criterion + + detached subquery + + + + Create a property less than some subquery criterion + + detached subquery + + + + Create a property not equal subquery criterion + + detached subquery + + + + Create a property not in subquery criterion + + detached subquery + + + + Base class for implementations. + + + + + An object-oriented representation of a query criterion that may be used as a constraint + in a query. + + + Built-in criterion types are provided by the Expression factory class. + This interface might be implemented by application classes but, more commonly, application + criterion types would extend AbstractCriterion. + + + + + Render a SqlString fragment for the expression. + + A SqlString that contains a valid Sql fragment. + + + + Return typed values for all parameters in the rendered SQL fragment + + An array of TypedValues for the Expression. + + + + Return all projections used in this criterion + + An array of IProjection used by the Expression. + + + + Gets a string representation of the . + + + A String that shows the contents of the . + + + This is not a well formed Sql fragment. It is useful for logging what the + looks like. + + + + + Render a SqlString for the expression. + + A SqlString that contains a valid Sql fragment. + + + + Return typed values for all parameters in the rendered SQL fragment + + An array of TypedValues for the Expression. + + + + Return all projections used in this criterion + + An array of IProjection used by the Expression. + + + + See here for details: + http://steve.emxsoftware.com/NET/Overloading+the++and++operators + + + + + See here for details: + http://steve.emxsoftware.com/NET/Overloading+the++and++operators + + + + + An Aggregation + + + + + A single-column projection that may be aliased + + + + + Render the SQL Fragment. + + The criteria. + The position. + The criteria query. + The enabled filters. + + + + + Render the SQL Fragment to be used in the Group By Clause. + + The criteria. + The criteria query. + The enabled filters. + + + + + Return types for a particular user-visible alias + + + + + + + + + + + + + + + + + Gets the typed values for parameters in this projection + + The criteria. + The criteria query. + + + + + Get the SQL column aliases used by this projection for the columns it writes for inclusion into the + SELECT clause . NHibernate always uses column aliases + to extract data from the , so it is important that these be implemented + correctly in order for NHibernate to be able to extract these values correctly. + + Just as in , represents the number of columns rendered prior to this projection. + The local criteria to which this project is attached (for resolution). + The overall criteria query instance. + The columns aliases. + + + + Get the SQL column aliases used by this projection for the columns it writes for inclusion into the + SELECT clause () for a particular criteria-level alias. + + The criteria-level alias. + Just as in , represents the number of columns rendered prior to this projection. + The local criteria to which this project is attached (for resolution). + The overall criteria query instance. + The columns aliases. + + + + Get the user-visible aliases for this projection (ie. the ones that will be passed to the ResultTransformer) + + + + + Does this projection specify grouping attributes? + + + + + Does this projection specify aggregate attributes? + + + + + Gets the typed values for parameters in this projection + + The criteria. + The criteria query. + + + + + Gets the typed values for parameters in this projection + + The criteria. + The criteria query. + + + + + An that combines two s + with an and between them. + + + + + An that combines two s + with a operator (either "and" or "or") between them. + + + + + Initialize a new instance of the class that + combines two other s. + + The to use in the Left Hand Side. + The to use in the Right Hand Side. + + + + Combines the for the Left Hand Side and the + Right Hand Side of the Expression into one array. + + An array of s. + + + + Converts the LogicalExpression to a . + + A well formed SqlString for the Where clause. + The SqlString will be enclosed by ( and ). + + + + Gets a string representation of the LogicalExpression. + + + The String contains the LeftHandSide.ToString() and the RightHandSide.ToString() + joined by the Op. + + + This is not a well formed Sql fragment. It is useful for logging what Expressions + are being combined. + + + + + Gets the that will be on the Left Hand Side of the Op. + + + + + Gets the that will be on the Right Hand Side of the Op. + + + + + Get the Sql operator to put between the two s. + + + + + Initializes a new instance of the class + that combines two . + + The to use as the left hand side. + The to use as the right hand side. + + + + Get the Sql operator to put between the two s. + + The string "and" + + + + An that represents a "between" constraint. + + + + + Initializes a new instance of the class. + + The _projection. + The _lo. + The _hi. + + + + Initialize a new instance of the class for + the named Property. + + The name of the Property of the Class. + The low value for the BetweenExpression. + The high value for the BetweenExpression. + + + + Casting a value from one type to another, at the database + level + + + + + An that Junctions together multiple + s with an and + + + + + A sequence of logical s combined by some associative + logical operator. + + + + + Adds an to the list of s + to junction together. + + The to add. + + This instance. + + + + + Adds an to the list of s + to junction together. + + + + + Adds an to the list of s + to junction together. + + + + + Get the Sql operator to put between multiple s. + + + + + The corresponding to an instance with no added + subcriteria. + + + + + Get the Sql operator to put between multiple s. + + The string " and " + + + + This is useful if we want to send a value to the database + + + + + A Count + + + + The alias that refers to the "root" entity of the criteria query. + + + Each row of results is a from alias to entity instance + + + Each row of results is an instance of the root entity + + + Each row of results is a distinct instance of the root entity + + + This result transformer is selected implicitly by calling + + + Specifies joining to an entity based on an inner join. + + + Specifies joining to an entity based on a full join. + + + Specifies joining to an entity based on a left outer join. + + + + Some applications need to create criteria queries in "detached + mode", where the Hibernate session is not available. This class + may be instantiated anywhere, and then a ICriteria + may be obtained by passing a session to + GetExecutableCriteria(). All methods have the + same semantics and behavior as the corresponding methods of the + ICriteria interface. + + + + + Get an executable instance of Criteria, + to actually run the query. + + + + Get an executable instance of Criteria, + to actually run the query. + + + + Gets the root entity type if available, throws otherwise + + + This is an NHibernate specific method, used by several dependent + frameworks for advance integration with NHibernate. + + + + + Clear all orders from criteria. + + + + + An that Junctions together multiple + s with an or + + + + + Get the Sql operator to put between multiple s. + + The string " or " + + + + Gets the typed values for parameters in this projection + + The criteria. + The criteria query. + + + + + An that represents an "equal" constraint + between two properties. + + + + + Superclass for an that represents a + constraint between two properties (with SQL binary operators). + + + + + Initializes a new instance of the class. + + The projection. + Name of the RHS property. + + + + Initializes a new instance of the class. + + The LHS projection. + The RHS projection. + + + + Initializes a new instance of the class. + + Name of the LHS property. + Name of the RHS property. + + + + Initializes a new instance of the class. + + Name of the LHS property. + The RHS projection. + + + + + + + Get the Sql operator to use for the property expression. + + + + + Initializes a new instance of the class. + + Name of the LHS property. + The RHS projection. + + + + Initializes a new instance of the class. + + The LHS projection. + The RHS projection. + + + + Initializes a new instance of the class. + + The projection. + Name of the RHS property. + + + + Initializes a new instance of the class + that compares two mapped properties using an "equal" constraint. + + The name of the Property to use as the left hand side. + The name of the Property to use as the right hand side. + + + + Get the Sql operator to use for the . + + The string " = " + + + + Support for Query By Example. + + + + List results = session.CreateCriteria(typeof(Parent)) + .Add( Example.Create(parent).IgnoreCase() ) + .CreateCriteria("child") + .Add( Example.Create( parent.Child ) ) + .List(); + + + + "Examples" may be mixed and matched with "Expressions" in the same + + + + + Set escape character for "like" clause + + + + Set the for this . + + The to determine which properties to include. + This instance. + + This should be used when a custom has + been implemented. Otherwise use the methods + or to set the + to the s built into NHibernate. + + + + + Set the for this + to exclude zero-valued properties. + + + + + Set the for this + to exclude no properties. + + + + + Use the "like" operator for all string-valued properties with + the specified . + + + The to convert the string to the pattern + for the like comparison. + + + + + Use the "like" operator for all string-valued properties. + + + The default is MatchMode.Exact. + + + + + Exclude a particular named property + + The name of the property to exclude. + + + + Create a new instance, which includes all non-null properties + by default + + + A new instance of . + + + + Initialize a new instance of the class for a particular + entity. + + The that the Example is being built from. + The the Example should use. + + + + Determines if the property should be included in the Query. + + The value of the property. + The name of the property. + The of the property. + + if the Property should be included, if + the Property should not be a part of the Query. + + + + + Adds a based on the value + and type parameters to the in the + list parameter. + + The value of the Property. + The of the Property. + The to add the to. + + This method will add objects to the list parameter. + + + + + A strategy for choosing property values for inclusion in the query criteria + + + + + Determine if the Property should be included. + + The value of the property that is being checked for inclusion. + The name of the property that is being checked for inclusion. + The of the property. + + if the Property should be included in the Query, + otherwise. + + + + + Implementation of that includes all + properties regardless of value. + + + + + Implementation of that includes the + properties that are not and do not have an + returned by propertyValue.ToString(). + + + This selector is not present in H2.1. It may be useful if nullable types + are used for some properties. + + + + + This class is semi-deprecated. Use . + + + + + + The namespace may be used by applications as a framework for building + new kinds of . + However, it is intended that most applications will + simply use the built-in criterion types via the static factory methods of this class. + + + + + + + Apply an "equal" constraint to the identifier property + + + ICriterion + + + + Apply an "equal" constraint from the projection to the identifier property + + The projection. + ICriterion + + + + Apply an "equal" constraint to the named property + + The name of the Property in the class. + The value for the Property. + + + + Apply an "equal" constraint to the projection + + The projection. + The value for the Property. + + + + Apply a "like" constraint to the named property + + The name of the Property in the class. + The value for the Property. + A . + + + + Apply a "like" constraint to the project + + The projection. + The value for the Property. + A . + + + + Apply a "like" constraint to the project + + The projection. + The value for the Property. + The match mode. + A . + + + + A case-insensitive "like", similar to Postgres "ilike" operator + + The name of the Property in the class. + The value for the Property. + An . + + + + A case-insensitive "like", similar to Postgres "ilike" operator + + The projection. + The value for the Property. + + An . + + + + + Apply a "greater than" constraint to the named property + + The name of the Property in the class. + The value for the Property. + + + + Apply a "greater than" constraint to the projection + + The projection. + The value for the Property. + + + + Apply a "less than" constraint to the named property + + The name of the Property in the class. + The value for the Property. + + + + Apply a "less than" constraint to the projection + + The projection. + The value for the Property. + + + + Apply a "less than or equal" constraint to the named property + + The name of the Property in the class. + The value for the Property. + + + + Apply a "less than or equal" constraint to the projection + + The projection. + The value for the Property. + + + + Apply a "greater than or equal" constraint to the named property + + The name of the Property in the class. + The value for the Property. + + + + Apply a "greater than or equal" constraint to the projection + + The projection. + The value for the Property. + + + + Apply a "between" constraint to the named property + + The name of the Property in the class. + The low value for the Property. + The high value for the Property. + A . + + + + Apply a "between" constraint to the projection + + The projection. + The low value for the Property. + The high value for the Property. + A . + + + + Apply an "in" constraint to the named property + + The name of the Property in the class. + An array of values. + An . + + + + Apply an "in" constraint to the projection + + The projection. + An array of values. + An . + + + + Apply an "in" constraint to the projection + + The projection. + An ICollection of values. + An . + + + + Apply an "in" constraint to the named property + + The name of the Property in the class. + An ICollection of values. + An . + + + + Apply an "in" constraint to the named property. This is the generic equivalent + of , renamed to avoid ambiguity. + + The name of the Property in the class. + An + of values. + An . + + + + Apply an "in" constraint to the projection. This is the generic equivalent + of , renamed to avoid ambiguity. + + + The projection. + An + of values. + An . + + + + Apply an "is null" constraint to the named property + + The name of the Property in the class. + A . + + + + Apply an "is null" constraint to the projection + + The projection. + A . + + + + Apply an "equal" constraint to two properties + + The lhs Property Name + The rhs Property Name + A . + + + + Apply an "equal" constraint to projection and property + + The projection. + The rhs Property Name + A . + + + + Apply an "equal" constraint to lshProjection and rshProjection + + The LHS projection. + The RSH projection. + A . + + + + Apply an "equal" constraint to the property and rshProjection + + Name of the property. + The RSH projection. + A . + + + + Apply an "not equal" constraint to two properties + + The lhs Property Name + The rhs Property Name + A . + + + + Apply an "not equal" constraint to projection and property + + The projection. + The rhs Property Name + A . + + + + Apply an "not equal" constraint to the projections + + The LHS projection. + The RHS projection. + A . + + + + Apply an "not equal" constraint to the projections + + Name of the property. + The RHS projection. + A . + + + + Apply a "greater than" constraint to two properties + + The lhs Property Name + The rhs Property Name + A . + + + + Apply a "greater than" constraint to two properties + + The projection. + The rhs Property Name + A . + + + + Apply a "greater than" constraint to two properties + + Name of the property. + The projection. + A . + + + + Apply a "greater than" constraint to two properties + + The LHS projection. + The RHS projection. + A . + + + + Apply a "greater than or equal" constraint to two properties + + The lhs Property Name + The rhs Property Name + A . + + + + Apply a "greater than or equal" constraint to two properties + + The LHS projection. + The RHS projection. + A . + + + + Apply a "greater than or equal" constraint to two properties + + The projection. + The rhs Property Name + A . + + + + Apply a "greater than or equal" constraint to two properties + + The lhs Property Name + The projection. + A . + + + + Apply a "less than" constraint to two properties + + The lhs Property Name + The rhs Property Name + A . + + + + Apply a "less than" constraint to two properties + + The projection. + The rhs Property Name + A . + + + + Apply a "less than" constraint to two properties + + The lhs Property Name + The projection. + A . + + + + Apply a "less than" constraint to two properties + + The LHS projection. + The RHS projection. + A . + + + + Apply a "less than or equal" constraint to two properties + + The lhs Property Name + The rhs Property Name + A . + + + + Apply a "less than or equal" constraint to two properties + + The projection. + The rhs Property Name + A . + + + + Apply a "less than or equal" constraint to two properties + + The lhs Property Name + The projection. + A . + + + + Apply a "less than or equal" constraint to two properties + + The LHS projection. + The RHS projection. + A . + + + + Apply an "is not null" constraint to the named property + + The name of the Property in the class. + A . + + + + Apply an "is not null" constraint to the named property + + The projection. + A . + + + + Apply an "is not empty" constraint to the named property + + The name of the Property in the class. + A . + + + + Apply an "is not empty" constraint to the named property + + The name of the Property in the class. + A . + + + + Return the conjunction of two expressions + + The Expression to use as the Left Hand Side. + The Expression to use as the Right Hand Side. + An . + + + + Return the disjuction of two expressions + + The Expression to use as the Left Hand Side. + The Expression to use as the Right Hand Side. + An . + + + + Return the negation of an expression + + The Expression to negate. + A . + + + + Group expressions together in a single conjunction (A and B and C...) + + + + + Group expressions together in a single disjunction (A or B or C...) + + + + + Apply an "equals" constraint to each property in the key set of a IDictionary + + a dictionary from property names to values + + + + + Create an ICriterion for the supplied LambdaExpression + + generic type + lambda expression + return NHibernate.Criterion.ICriterion + + + + Create an ICriterion for the supplied LambdaExpression + + lambda expression + return NHibernate.Criterion.ICriterion + + + + Create an ICriterion for the negation of the supplied LambdaExpression + + generic type + lambda expression + return NHibernate.Criterion.ICriterion + + + + Create an ICriterion for the negation of the supplied LambdaExpression + + lambda expression + return NHibernate.Criterion.ICriterion + + + + Build an ICriterion for the given property + + lambda expression identifying property + returns LambdaRestrictionBuilder + + + + Build an ICriterion for the given property + + lambda expression identifying property + returns LambdaRestrictionBuilder + + + + Apply a constraint expressed in SQL, with the given SQL parameters + + + + + + + + + Apply a constraint expressed in SQL, with the given SQL parameter + + + + + + + + + Apply a constraint expressed in SQL, with the given SQL parameter + + + + + Apply a constraint expressed in SQL + + + + + + + Apply a constraint expressed in SQL + + + + + + + An that represents an "greater than or equal" constraint + between two properties. + + + + + Initializes a new instance of the class. + + Name of the LHS property. + The RHS projection. + + + + Initializes a new instance of the class. + + The LHS projection. + The RHS projection. + + + + Initializes a new instance of the class. + + The projection. + Name of the RHS property. + + + + Initializes a new instance of the class + that compares two mapped properties using an "greater than or equal" constraint. + + The name of the Property to use as the left hand side. + The name of the Property to use as the right hand side. + + + + Get the Sql operator to use for the . + + The string " < " + + + + Gets the typed values for parameters in this projection + + The criteria. + The criteria query. + + + + + An that represents an "greater than" constraint + between two properties. + + + + + Initializes a new instance of the class. + + Name of the LHS property. + The RHS projection. + + + + Initializes a new instance of the class. + + The LHS projection. + The RHS projection. + + + + Initializes a new instance of the class. + + The projection. + Name of the RHS property. + + + + Initializes a new instance of the class + that compares two mapped properties using an "greater than" constraint. + + The name of the Property to use as the left hand side. + The name of the Property to use as the right hand side. + + + + Get the Sql operator to use for the . + + The string " < " + + + + An instance of is passed to criterion, + order and projection instances when actually compiling and + executing the query. This interface is not used by application + code. + + + + Get the name of the column mapped by a property path, ignoring projection alias + + + Get the names of the columns mapped by a property path, ignoring projection aliases + + + Get the type of a property path, ignoring projection aliases + + + Get the names of the columns mapped by a property path + + + Get the type of a property path + + + Get the a typed value for the given property value. + + + Get the entity name of an entity + + + + Get the entity name of an entity, taking into account + the qualifier of the property path + + + + Get the root table alias of an entity + + + + Get the root table alias of an entity, taking into account + the qualifier of the property path + + + + Get the property name, given a possibly qualified property name + + + Get the identifier column names of this entity + + + Get the identifier type of this entity + + + + Create a new query parameter to use in a + + The value and the of the parameter. + A new instance of a query parameter to be added to a . + + + + An identifier constraint + + + + + An that constrains the property + to a specified list of values. + + + InExpression - should only be used with a Single Value column - no multicolumn properties... + + + + + Initializes a new instance of the class. + + The projection. + The _values. + + + + Determine the type of the elements in the IN clause. + + + + + An that represents an "like" constraint + that is not case sensitive. + + + + + Initializes a new instance of the class. + + The projection. + The value. + The match mode. + + + + Initializes a new instance of the class. + + The projection. + The value. + + + + Initialize a new instance of the + class for a named Property and its value. + + The name of the Property in the class. + The value for the Property. + + + + An that represents empty association constraint. + + + + + An that represents non-empty association constraint. + + + + + An that represents an "less than or equal" constraint + between two properties. + + + + + Initializes a new instance of the class. + + Name of the LHS property. + The RHS projection. + + + + Initializes a new instance of the class. + + The LHS projection. + The RHS projection. + + + + Initializes a new instance of the class. + + The projection. + Name of the RHS property. + + + + Initializes a new instance of the class + that compares two mapped properties using an "less than or equal" constraint. + + The name of the Property to use as the left hand side. + The name of the Property to use as the right hand side. + + + + Get the Sql operator to use for the . + + The string " <= " + + + + An that represents an "like" constraint. + + + The case sensitivity depends on the database settings for string + comparisons. Use if the + string comparison should not be case sensitive. + + + + + An that represents an "less than" constraint + between two properties. + + + + + Initializes a new instance of the class. + + Name of the LHS property. + The RHS projection. + + + + Initializes a new instance of the class. + + The LHS projection. + The RHS projection. + + + + Initializes a new instance of the class. + + The projection. + Name of the RHS property. + + + + Initializes a new instance of the class + that compares two mapped properties using an "less than" constraint. + + The name of the Property to use as the left hand side. + The name of the Property to use as the right hand side. + + + + Get the Sql operator to use for the . + + The string " < " + + + + Represents an strategy for matching strings using "like". + + + + + Initialize a new instance of the class. + + The code that identifies the match mode. + The friendly name of the match mode. + + The parameter intCode is used as the key of + to store instances and to ensure only instance of a particular + is created. + + + + + The string representation of the . + + The friendly name used to describe the . + + + + Convert the pattern, by appending/prepending "%" + + The string to convert to the appropriate match pattern. + + A that contains a "%" in the appropriate place + for the Match Strategy. + + + + + Match the entire string to the pattern + + + + + Match the start of the string to the pattern + + + + + Match the end of the string to the pattern + + + + + Match the pattern anywhere in the string + + + + + The that matches the entire string to the pattern. + + + + + Initialize a new instance of the class. + + + + + Converts the string to the Exact MatchMode. + + The string to convert to the appropriate match pattern. + The pattern exactly the same as it was passed in. + + + + The that matches the start of the string to the pattern. + + + + + Initialize a new instance of the class. + + + + + Converts the string to the Start MatchMode. + + The string to convert to the appropriate match pattern. + The pattern with a "%" appended at the end. + + + + The that matches the end of the string to the pattern. + + + + + Initialize a new instance of the class. + + + + + Converts the string to the End MatchMode. + + The string to convert to the appropriate match pattern. + The pattern with a "%" appended at the beginning. + + + + The that exactly matches the string + by appending "%" to the beginning and end. + + + + + Initialize a new instance of the class. + + + + + Converts the string to the Exact MatchMode. + + The string to convert to the appropriate match pattern. + The pattern with a "%" appended at the beginning and the end. + + + + An that negates another . + + + + + Initialize a new instance of the class for an + + + The to negate. + + + + An that represents "not null" constraint. + + + + + Initializes a new instance of the class. + + The projection. + + + + Initialize a new instance of the class for a named + Property that should not be null. + + The name of the Property in the class. + + + + An that represents "null" constraint. + + + + + Initializes a new instance of the class. + + The projection. + + + + Initialize a new instance of the class for a named + Property that should be null. + + The name of the Property in the class. + + + + + + + Represents an order imposed upon a + result set. + + + Should Order implement ICriteriaQuery? + + + + + Render the SQL fragment + + + + + Ascending order + + + + + + + Ascending order + + + + + + + Descending order + + + + + + + Descending order + + + + + + + An that combines two s with an + "or" between them. + + + + + Initialize a new instance of the class for + two s. + + The to use as the left hand side. + The to use as the right hand side. + + + + Get the Sql operator to put between the two s. + + Returns "or" + + + + Gets the typed values for parameters in this projection + + The criteria. + The criteria query. + + + + + The criterion package may be used by applications as a framework for building + new kinds of Projection. However, it is intended that most applications will + simply use the built-in projection types via the static factory methods of this class.
+
+ The factory methods that take an alias allow the projected value to be referred to by + criterion and order instances. +
+
+ + + Create a distinct projection from a projection + + + + + + + Create a new projection list + + + + + + The query row count, ie. count(*) + + The RowCount projection mapped to an . + + + + The query row count, ie. count(*) + + The RowCount projection mapped to an . + + + + A property value count + + + + + + + A property value count + + + + + + + A distinct property value count + + + + + + + A property maximum value + + + + + + + A projection maximum value + + + + + + + A property minimum value + + + + + + + A projection minimum value + + + + + + + A property average value + + + + + + + A property average value + + + + + + + A property value sum + + + + + + + A property value sum + + + + + + + A SQL projection, a typed select clause fragment + + + + + + + + + A grouping SQL projection, specifying both select clause and group by clause fragments + + + + + + + + + + A grouping property value + + + + + + + A grouping projection value + + + + + + + A projected property value + + + + + + + A projected identifier value + + + + + + Assign an alias to a projection, by wrapping it + + + + + + + + Casts the projection result to the specified type. + + The type. + The projection. + + + + + Return a constant value + + The obj. + + + + + Return a constant value + + The obj. + + + + + + Calls the named + + Name of the function. + The type. + The projections. + + + + + Calls the specified + + the function. + The type. + The projections. + + + + + Conditionally return the true or false part, dependention on the criterion + + The criterion. + The when true. + The when false. + + + + + A property average value + + + + + A property average value + + + + + A property value count + + + + + A property value count + + + + + A distinct property value count + + + + + A distinct property value count + + + + + A grouping property value + + + + + A grouping property value + + + + + A property maximum value + + + + + A property maximum value + + + + + A property minimum value + + + + + A property minimum value + + + + + A projected property value + + + + + A projected property value + + + + + A property value sum + + + + + A property value sum + + + + + Project SQL function concat() + Note: throws an exception outside of a QueryOver expression + + + + + Create an alias for a projection + + the projection instance + LambdaExpression returning an alias + return NHibernate.Criterion.IProjection + + + + Project SQL function year() + Note: throws an exception outside of a QueryOver expression + + + + + Project SQL function day() + Note: throws an exception outside of a QueryOver expression + + + + + Project SQL function month() + Note: throws an exception outside of a QueryOver expression + + + + + Project SQL function hour() + Note: throws an exception outside of a QueryOver expression + + + + + Project SQL function minute() + Note: throws an exception outside of a QueryOver expression + + + + + Project SQL function second() + Note: throws an exception outside of a QueryOver expression + + + + + Project SQL function date() + Note: throws an exception outside of a QueryOver expression + + + + + Project SQL function sqrt() + Note: throws an exception outside of a QueryOver expression + + + + + Project SQL function sqrt() + Note: throws an exception outside of a QueryOver expression + + + + + Project SQL function sqrt() + Note: throws an exception outside of a QueryOver expression + + + + + Project SQL function sqrt() + Note: throws an exception outside of a QueryOver expression + + + + + Project SQL function sqrt() + Note: throws an exception outside of a QueryOver expression + + + + + Project SQL function lower() + Note: throws an exception outside of a QueryOver expression + + + + + Project SQL function upper() + Note: throws an exception outside of a QueryOver expression + + + + + Project SQL function abs() + Note: throws an exception outside of a QueryOver expression + + + + + Project SQL function abs() + Note: throws an exception outside of a QueryOver expression + + + + + Project SQL function abs() + Note: throws an exception outside of a QueryOver expression + + + + + Project SQL function trim() + Note: throws an exception outside of a QueryOver expression + + + + + Project SQL function length() + Note: throws an exception outside of a QueryOver expression + + + + + Project SQL function bit_length() + Note: throws an exception outside of a QueryOver expression + + + + + Project SQL function substring() + Note: throws an exception outside of a QueryOver expression + + + + + Project SQL function locate() + Note: throws an exception outside of a QueryOver expression + + + + + Project SQL function coalesce() + Note: throws an exception outside of a QueryOver expression + + + + + Project SQL function coalesce() + Note: throws an exception outside of a QueryOver expression + + + + + Project SQL function mod() + Note: throws an exception outside of a QueryOver expression + + + + + A factory for property-specific AbstractCriterion and projection instances + + + + + A property value, or grouped property value + + + + + Get a component attribute of this property + + + + + A comparison between a property value in the outer query and the + result of a subquery + + + + + QueryOver<TRoot> is an API for retrieving entities by composing + objects expressed using Lambda expression syntax. + + + + IList<Cat> cats = session.QueryOver<Cat>() + .Where( c => c.Name == "Tigger" ) + .And( c => c.Weight > minWeight ) ) + .List(); + + + + + + Access the underlying ICriteria + + + + + Access the root underlying ICriteria + + + + + Get the results of the root type and fill the + + The list filled with the results. + + + + Get the results of the root type and fill the + + The list filled with the results. + + + + Clones the QueryOver, removes orders and paging, and projects the row-count + for the query + + + + + Clones the QueryOver, removes orders and paging, and projects the row-count (Int64) + for the query + + + + + Short for ToRowCountQuery().SingleOrDefault<int>() + + + + + Short for ToRowCountInt64Query().SingleOrDefault<long>() + + + + + Convenience method to return a single instance that matches + the query, or null if the query returns no results. + + the single result or + + If there is more than one matching result + + + + + Override type of . + + + + + Get a enumerable that when enumerated will execute + a batch of queries in a single database roundtrip + + + + + Get a enumerable that when enumerated will execute + a batch of queries in a single database roundtrip + + + + + Get an IFutureValue instance, whose value can be retrieved through + its Value property. The query is not executed until the Value property + is retrieved, which will execute other Future queries as well in a + single roundtrip + + + + + Get an IFutureValue instance, whose value can be retrieved through + its Value property. The query is not executed until the Value property + is retrieved, which will execute other Future queries as well in a + single roundtrip + + + + + Creates an exact clone of the IQueryOver + + + + + Clear all orders from the query. + + + + + Set the first result to be retrieved + + + + + + Set a limit upon the number of objects to be retrieved + + + + + + Enable caching of this query result set + + + + Override the cache mode for this particular query. + The cache mode to use. + this (for method chaining) + + + + Set the name of the cache region. + + the name of a query cache region, or + for the default query cache + + + + Set the read-only mode for entities (and proxies) loaded by this QueryOver. + (see ). + + + + + Get an executable instance of IQueryOver<TRoot>, + to actually run the query. + + + + Get an executable instance of IQueryOver<TRoot>, + to actually run the query. + + + + Clones the QueryOver, clears the orders and paging, and projects the RowCount + + + + + + Clones the QueryOver, clears the orders and paging, and projects the RowCount (Int64) + + + + + + Creates an exact clone of the QueryOver + + + + + Method to allow comparison of detached query in Lambda expression + e.g., p => p.Name == myQuery.As<string> + + type returned (projected) by query + throws an exception if evaluated directly at runtime. + + + + Implementation of the interface + + + + + QueryOver<TRoot,TSubType> is an API for retrieving entities by composing + objects expressed using Lambda expression syntax. + + + + IList<Cat> cats = session.QueryOver<Cat>() + .Where( c => c.Name == "Tigger" ) + .And( c => c.Weight > minWeight ) ) + .List(); + + + + + + Add criterion expressed as a lambda expression + + Lambda expression + criteria instance + + + + Add criterion expressed as a lambda expression + + Lambda expression + criteria instance + + + + Add arbitrary ICriterion (e.g., to allow protected member access) + + + + + Add negation of criterion expressed as a lambda expression + + Lambda expression + criteria instance + + + + Add negation of criterion expressed as a lambda expression + + Lambda expression + criteria instance + + + + Add restriction to a property + + Lambda expression containing path to property + criteria instance + + + + Add restriction to a property + + Lambda expression containing path to property + criteria instance + + + + Identical semantics to And() to allow more readable queries + + Lambda expression + criteria instance + + + + Identical semantics to And() to allow more readable queries + + Lambda expression + criteria instance + + + + Add arbitrary ICriterion (e.g., to allow protected member access) + + + + + Identical semantics to AndNot() to allow more readable queries + + Lambda expression + criteria instance + + + + Identical semantics to AndNot() to allow more readable queries + + Lambda expression + criteria instance + + + + Identical semantics to AndRestrictionOn() to allow more readable queries + + Lambda expression + criteria instance + + + + Identical semantics to AndRestrictionOn() to allow more readable queries + + Lambda expression + criteria instance + + + + Add projection expressed as a lambda expression + + Lambda expressions + criteria instance + + + + Add arbitrary IProjections to query + + + + + Create a list of projections using a projection builder + + + + + Add order expressed as a lambda expression + + Lambda expression + criteria instance + + + + Add order expressed as a lambda expression + + Lambda expression + criteria instance + + + + Order by arbitrary IProjection (e.g., to allow protected member access) + + + + + Add order for an aliased projection expressed as a lambda expression + + Lambda expression + criteria instance + + + + Add order expressed as a lambda expression + + Lambda expression + criteria instance + + + + Add order expressed as a lambda expression + + Lambda expression + criteria instance + + + + Order by arbitrary IProjection (e.g., to allow protected member access) + + + + + Add order for an aliased projection expressed as a lambda expression + + Lambda expression + criteria instance + + + + Transform the results using the supplied IResultTransformer + + + + + Specify an association fetching strategy. Currently, only + one-to-many and one-to-one associations are supported. + + A lambda expression path (e.g., ChildList[0].Granchildren[0].Pets). + + + + + Set the lock mode of the current entity + + + + + Set the lock mode of the aliased entity + + + + + Creates a new NHibernate.IQueryOver<TRoot, U>, "rooted" at the associated entity + + Type of sub-criteria + Lambda expression returning association path + The created "sub criteria" + + + + Creates a new NHibernate.IQueryOver<TRoot, U>, "rooted" at the associated entity + + Type of sub-criteria + Lambda expression returning association path + The created "sub criteria" + + + + Creates a new NHibernate.IQueryOver<TRoot, U>, "rooted" at the associated entity + + Type of sub-criteria + Lambda expression returning association path + Lambda expression returning alias reference + The created "sub criteria" + + + + Creates a new NHibernate.IQueryOver<TRoot, U>, "rooted" at the associated entity + + Type of sub-criteria + Lambda expression returning association path + Lambda expression returning alias reference + The created "sub criteria" + + + + Creates a new NHibernate.IQueryOver<TRoot, U>, "rooted" at the associated entity + + Type of sub-criteria + Lambda expression returning association path + Type of join + The created "sub criteria" + + + + Creates a new NHibernate.IQueryOver<TRoot, U>, "rooted" at the associated entity + + Type of sub-criteria + Lambda expression returning association path + Type of join + The created "sub criteria" + + + + Creates a new NHibernate.IQueryOver<TRoot, U>, "rooted" at the associated entity + + Type of sub-criteria + Lambda expression returning association path + Lambda expression returning alias reference + Type of join + The created "sub criteria" + + + + Creates a new NHibernate.IQueryOver<TRoot, U>, "rooted" at the associated entity + + Type of sub-criteria + Lambda expression returning association path + Lambda expression returning alias reference + Type of join + Additional criterion for the SQL on clause + The created "sub criteria" + + + + Creates a new NHibernate.IQueryOver<TRoot, U>, "rooted" at the associated entity + + Type of sub-criteria + Lambda expression returning association path + Lambda expression returning alias reference + Type of join + The created "sub criteria" + + + + Creates a new NHibernate.IQueryOver<TRoot, U>, "rooted" at the associated entity + + Type of sub-criteria + Lambda expression returning association path + Lambda expression returning alias reference + Type of join + Additional criterion for the SQL on clause + The created "sub criteria" + + + + Creates a new NHibernate.IQueryOver<TRoot, U>, "rooted" at the associated entity + specifying a collection for the join. + + Type of sub-criteria (type of the collection) + Lambda expression returning association path + The created "sub criteria" + + + + Creates a new NHibernate.IQueryOver<TRoot, U>, "rooted" at the associated entity + specifying a collection for the join. + + Type of sub-criteria (type of the collection) + Lambda expression returning association path + The created "sub criteria" + + + + Creates a new NHibernate.IQueryOver<TRoot, U>, "rooted" at the associated entity + specifying a collection for the join. + + Type of sub-criteria (type of the collection) + Lambda expression returning association path + Lambda expression returning alias reference + The created "sub criteria" + + + + Creates a new NHibernate.IQueryOver<TRoot, U>, "rooted" at the associated entity + specifying a collection for the join. + + Type of sub-criteria (type of the collection) + Lambda expression returning association path + Lambda expression returning alias reference + The created "sub criteria" + + + + Creates a new NHibernate.IQueryOver<TRoot, U>, "rooted" at the associated entity + specifying a collection for the join. + + Type of sub-criteria (type of the collection) + Lambda expression returning association path + Type of join + The created "sub criteria" + + + + Creates a new NHibernate.IQueryOver<TRoot, U>, "rooted" at the associated entity + specifying a collection for the join. + + Type of sub-criteria (type of the collection) + Lambda expression returning association path + Type of join + The created "sub criteria" + + + + Creates a new NHibernate.IQueryOver<TRoot, U>, "rooted" at the associated entity + specifying a collection for the join. + + Type of sub-criteria (type of the collection) + Lambda expression returning association path + Lambda expression returning alias reference + Type of join + The created "sub criteria" + + + + Creates a new NHibernate.IQueryOver<TRoot, U>, "rooted" at the associated entity + specifying a collection for the join. + + Type of sub-criteria (type of the collection) + Lambda expression returning association path + Lambda expression returning alias reference + Type of join + Additional criterion for the SQL on clause + The created "sub criteria" + + + + Creates a new NHibernate.IQueryOver<TRoot, U>, "rooted" at the associated entity + specifying a collection for the join. + + Type of sub-criteria (type of the collection) + Lambda expression returning association path + Lambda expression returning alias reference + Type of join + The created "sub criteria" + + + + Creates a new NHibernate.IQueryOver<TRoot, U>, "rooted" at the associated entity + specifying a collection for the join. + + Type of sub-criteria (type of the collection) + Lambda expression returning association path + Lambda expression returning alias reference + Type of join + Additional criterion for the SQL on clause + The created "sub criteria" + + + + Join an association, assigning an alias to the joined entity + + Lambda expression returning association path + Lambda expression returning alias reference + criteria instance + + + + Join an association, assigning an alias to the joined entity + + Lambda expression returning association path + Lambda expression returning alias reference + criteria instance + + + + Join an association, assigning an alias to the joined entity + + Lambda expression returning association path + Lambda expression returning alias reference + Type of join + criteria instance + + + + Join an association, assigning an alias to the joined entity + + Lambda expression returning association path + Lambda expression returning alias reference + Type of join + Additional criterion for the SQL on clause + criteria instance + + + + Join an association, assigning an alias to the joined entity + + Type of sub-criteria (type of the collection) + Lambda expression returning association path + Lambda expression returning alias reference + Type of join + Additional criterion for the SQL on clause + criteria instance + + + + Join an association, assigning an alias to the joined entity + + Lambda expression returning association path + Lambda expression returning alias reference + Type of join + criteria instance + + + + Join an association, assigning an alias to the joined entity + + Lambda expression returning association path + Lambda expression returning alias reference + Type of join + Additional criterion for the SQL on clause + criteria instance + + + + Join an association, assigning an alias to the joined entity + + Type of sub-criteria (type of the collection) + Lambda expression returning association path + Lambda expression returning alias reference + Type of join + Additional criterion for the SQL on clause + criteria instance + + + + Add a subquery expression + + + + + Apply a "like" restriction in a QueryOver expression + Note: throws an exception outside of a QueryOver expression + + + + + Apply a "like" restriction in a QueryOver expression + Note: throws an exception outside of a QueryOver expression + + + + + Apply a "like" restriction in a QueryOver expression + Note: throws an exception outside of a QueryOver expression + + + + + Apply a "like" restriction in a QueryOver expression + Note: throws an exception outside of a QueryOver expression + + + + + Apply a "like" restriction in a QueryOver expression + Note: throws an exception outside of a QueryOver expression + + + + + Apply an "in" constraint to the named property + Note: throws an exception outside of a QueryOver expression + + + + + Apply an "in" constraint to the named property + Note: throws an exception outside of a QueryOver expression + + + + + Apply a "between" constraint to the named property + Note: throws an exception outside of a QueryOver expression + + + + + A comparison between a property value in the outer query and the + result of a subquery + + + + + The base class for an that compares a single Property + to a value. + + + + + Initialize a new instance of the class for a named + Property and its value. + + The name of the Property in the class. + The value for the Property. + The SQL operation. + + + + Converts the SimpleExpression to a . + + A SqlString that contains a valid Sql fragment. + + + + Gets the named Property for the Expression. + + A string that is the name of the Property. + + + + Gets the Value for the Expression. + + An object that is the value for the Expression. + + + + Get the Sql operator to use for the specific + subclass of . + + + + + A comparison between a constant value and the the result of a subquery + + + + + An that creates a SQLExpression. + The string {alias} will be replaced by the alias of the root entity. + + + This allows for database specific Expressions at the cost of needing to + write a correct . + + + + + A SQL fragment. The string {alias} will be replaced by the alias of the root entity. + + + + + Gets the typed values for parameters in this projection + + The criteria. + The criteria query. + + + + + Factory class for AbstractCriterion instances that represent + involving subqueries. + Expression + Projection + AbstractCriterion + + + + + Create a ICriterion for the specified property subquery expression + + generic type + lambda expression + returns LambdaSubqueryBuilder + + + + Create a ICriterion for the specified property subquery expression + + lambda expression + returns LambdaSubqueryBuilder + + + + Create a ICriterion for the specified value subquery expression + + value + returns LambdaSubqueryBuilder + + + + Create ICriterion for subquery expression using lambda syntax + + type of property + lambda expression + NHibernate.ICriterion.AbstractCriterion + + + + Create ICriterion for (exact) subquery expression using lambda syntax + + lambda expression + NHibernate.ICriterion.AbstractCriterion + + + + Create ICriterion for (all) subquery expression using lambda syntax + + type of property + lambda expression + NHibernate.ICriterion.AbstractCriterion + + + + Create ICriterion for (all) subquery expression using lambda syntax + + lambda expression + NHibernate.ICriterion.AbstractCriterion + + + + Create ICriterion for (some) subquery expression using lambda syntax + + type of property + lambda expression + NHibernate.ICriterion.AbstractCriterion + + + + Create ICriterion for (some) subquery expression using lambda syntax + + lambda expression + NHibernate.ICriterion.AbstractCriterion + + + + Add an Exists subquery criterion + + + + + Add a NotExists subquery criterion + + + + + A property value, or grouped property value + + + + + Used to show a better debug display for dictionaries + + + + + + + + ::= + EXTRACT FROM + + ::= + | + + + + Represents HQL functions that can have different representations in different SQL dialects. + E.g. in HQL we can define function concat(?1, ?2) to concatenate two strings + p1 and p2. Target SQL function will be dialect-specific, e.g. (?1 || ?2) for + Oracle, concat(?1, ?2) for MySql, (?1 + ?2) for MS SQL. + Each dialect will define a template as a string (exactly like above) marking function + parameters with '?' followed by parameter's index (first index is 1). + + + + + Provides support routines for the HQL functions as used + in the various SQL Dialects + + Provides an interface for supporting various HQL functions that are + translated to SQL. The Dialect and its sub-classes use this interface to + provide details required for processing of the function. + + + + + The function return type + + The type of the first argument + + + + + + Render the function call as SQL. + + List of arguments + + SQL fragment for the fuction. + + + + Does this function have any arguments? + + + + + If there are no arguments, are parens required? + + + + + Applies the template to passed in arguments. + + args function arguments + generated SQL function call + + + + + ANSI-SQL substring + Documented in: + ANSI X3.135-1992 + American National Standard for Information Systems - Database Language - SQL + + + Syntax: + ::= + SUBSTRING FROM < start position> + [ FOR ] + ]]> + + + + + A SQLFunction implementation that emulates the ANSI SQL trim function + on dialects which do not support the full definition. However, this function + definition does assume the availability of ltrim, rtrim, and replace functions + which it uses in various combinations to emulate the desired ANSI trim() + functionality. + + + + + + + + + + + according to both the ANSI-SQL and EJB3 specs, trim can either take + exactly one parameter or a variable number of parameters between 1 and 4. + from the SQL spec: + ::= + TRIM + + ::= + [ [ ] [ ] FROM ] + + ::= + LEADING + | TRAILING + | BOTH + ]]> + If only trim specification is omitted, BOTH is assumed; + if trim character is omitted, space is assumed + + + + + Initializes a new instance of the StandardSQLFunction class. + + SQL function name. + Whether the function accepts an asterisk (*) in place of arguments + + + + Initializes a new instance of the StandardSQLFunction class. + + SQL function name. + True if accept asterisk like argument + Return type for the fuction. + + + + ANSI-SQL style cast(foo as type) where the type is a NHibernate type + + + + + Emulation of locate() on Sybase + + + + + Classic AVG sqlfunction that return types as it was done in Hibernate 3.1 + + + + + Classic COUNT sqlfunction that return types as it was done in Hibernate 3.1 + + + + + Classic SUM sqlfunction that return types as it was done in Hibernate 3.1 + + + + + Provides a substring implementation of the form substring(expr, start, length) + for SQL dialects where the length argument is mandatory. If this is called + from HQL with only two arguments, this implementation will generate the length + parameter as (len(expr) + 1 - start). + + + + + Provides a standard implementation that supports the majority of the HQL + functions that are translated to SQL. + + + The Dialect and its sub-classes use this class to provide details required + for processing of the associated function. + + + + + Initializes a new instance of the StandardSQLFunction class. + + SQL function name. + + + + Initializes a new instance of the StandardSQLFunction class. + + SQL function name. + Return type for the fuction. + + + + Initializes a new instance of the EmulatedLengthSubstringFunction class. + + + + + Summary description for NoArgSQLFunction. + + + + + Emulation of coalesce() on Oracle, using multiple nvl() calls + + + + + Emulation of locate() on PostgreSQL + + + + + Provides a standard implementation that supports the majority of the HQL + functions that are translated to SQL. + + + The Dialect and its sub-classes use this class to provide details required + for processing of the associated function. + + + + + Initializes a new instance of the StandardSafeSQLFunction class. + + SQL function name. + Exact number of arguments expected. + + + + Initializes a new instance of the StandardSafeSQLFunction class. + + SQL function name. + Return type for the fuction. + Exact number of arguments expected. + + + + Support for slightly more general templating than StandardSQLFunction, + with an unlimited number of arguments. + + + + + A strategy abstraction for how locks are obtained in the underlying database. + + + All locking provided implemenations assume the underlying database supports + (and that the connection is in) at least read-committed transaction isolation. + The most glaring exclusion to this is HSQLDB which only offers support for + READ_UNCOMMITTED isolation. + + + + + + Acquire an appropriate type of lock on the underlying data that will + endure until the end of the current transaction. + + The id of the row to be locked + The current version (or null if not versioned) + The object logically being locked (currently not used) + The session from which the lock request originated + + + + A locking strategy where the locks are obtained through select statements. + + + + + For non-read locks, this is achieved through the Dialect's specific + SELECT ... FOR UPDATE syntax. + + + + + A locking strategy where the locks are obtained through update statements. + + This strategy is not valid for read style locks. + + + + Construct a locking strategy based on SQL UPDATE statements. + + The metadata for the entity to be locked. + Indictates the type of lock to be acquired. + + read-locks are not valid for this strategy. + + + + + Common implementation of schema reader. + + + This implementation of is based on the new of + .NET 2.0. + + + + + + This class is specific of NHibernate and supply DatabaseMetaData of Java. + In the .NET Framework, there is no direct equivalent. + + + Implementation is provide by a dialect. + + + + + Gets a description of the tables available for the catalog + + A catalog, retrieves those without a catalog + Schema pattern, retrieves those without the schema + A table name pattern + a list of table types to include + Each row + + + + Get the Table MetaData. + + The resultSet of . + Include FKs and indexes + + + + + Gets a description of the table columns available + + A catalog, retrieves those without a catalog + Schema pattern, retrieves those without the schema + A table name pattern + a columng name patterm + A description of the table columns available + + + + Get a description of the given table's indices and statistics. + + A catalog, retrieves those without a catalog + Schema pattern, retrieves those without the schema + A table name pattern + A description of the table's indices available + The result is relative to the schema collections "Indexes". + + + + Get a description of the given table's indices and statistics. + + A catalog, retrieves those without a catalog + Schema pattern, retrieves those without the schema + A table name pattern + The name of the index + A description of the table's indices available + The result is relative to the schema collections "IndexColumns". + + + + Gets a description of the foreign keys available + + A catalog, retrieves those without a catalog + Schema name, retrieves those without the schema + A table name + A description of the foreign keys available + + + + Get all reserved words + + A set of reserved words + + + + In the Java language, this field indicates that the database treats mixed-case, + quoted SQL identifiers as case-insensitive and stores them in mixed case. + + + + + In the Java language, this field indicates that the database treats mixed-case, + quoted SQL identifiers as case-insensitive and stores them in upper case. + + + + + In the Java language, this field indicates that the database treats mixed-case, + unquoted SQL identifiers as case-insensitive and stores them in upper case. + + + + + In the Java language, this field indicates that the database treats mixed-case, + quoted SQL identifiers as case-insensitive and stores them in lower case. + + + + + In the Java language, this field indicates that the database treats mixed-case, + unquoted SQL identifiers as case-insensitive and stores them in lower case, + + + + + The name of the column that represent the TABLE_NAME in the + returned by . + + + + + Get a value from the DataRow. Multiple alternative column names can be given. + The names are tried in order, and the value from the first present column + is returned. + + + + + Get a string value from the DataRow. Multiple alternative column names can be given. + The names are tried in order, and the value from the first present column + is returned. + + + + + An SQL dialect for DB2 on iSeries OS/400. + + + The DB2400Dialect defaults the following configuration properties: + + + Property + Default Value + + + connection.driver_class + + + + + + + + An SQL dialect for DB2. + + + The DB2Dialect defaults the following configuration properties: + + + Property + Default Value + + + connection.driver_class + + + + + + + + Represents a dialect of SQL implemented by a particular RDBMS. Subclasses + implement NHibernate compatibility with different systems. + + + Subclasses should provide a public default constructor that Register() + a set of type mappings and default Hibernate properties. + + + + Characters used for quoting sql identifiers + + + Characters used for closing quoted sql identifiers + + + + The base constructor for Dialect. + + + Every subclass should override this and call Register() with every except + , , , , + , . + + + The Default properties for this Dialect should also be set - such as whether or not to use outer-joins + and what the batch size should be. + + + + + Get an instance of the dialect specified by the current properties. + The specified Dialect + + + + Get from a property bag (prop name ) + + The property bag. + An instance of . + When is null. + When the property bag don't contains de property . + + + + Get the name of the database type associated with the given + , + + The SqlType + The database type name used by ddl. + + + + Get the name of the database type associated with the given + . + + The SqlType + The datatype length + The datatype precision + The datatype scale + The database type name used by ddl. + + + + Gets the name of the longest registered type for a particular DbType. + + + + + + + Get the name of the database type appropriate for casting operations + (via the CAST() SQL function) for the given typecode. + + The typecode + The database type name + + + + Subclasses register a typename for the given type code and maximum + column length. $l in the type name will be replaced by the column + length (if appropriate) + + The typecode + Maximum length of database type + The database type name + + + + Subclasses register a typename for the given type code. $l in the + typename will be replaced by the column length (if appropriate). + + The typecode + The database type name + + + + The syntax used to add a foreign key constraint to a table. If SupportsForeignKeyConstraintInAlterTable is false, the returned string will be added to the create table statement instead. In this case, extra strings, like "add", that apply when using alter table should be omitted. + + The FK constraint name. + The names of the columns comprising the FK + The table referenced by the FK + The explicit columns in the referencedTable referenced by this FK. + + if false, constraint should be explicit about which column names the constraint refers to + + the "add FK" fragment + + + + The syntax used to add a primary key constraint to a table + + + + + + Get a strategy instance which knows how to acquire a database-level lock + of the specified mode for this dialect. + + The persister for the entity to be locked. + The type of lock to be acquired. + The appropriate locking strategy. + + + + Given a lock mode, determine the appropriate for update fragment to use. + + The lock mode to apply. + The appropriate for update fragment. + + + + Get the FOR UPDATE OF column_list fragment appropriate for this + dialect given the aliases of the columns to be write locked. + + The columns to be write locked. + The appropriate FOR UPDATE OF column_list clause string. + + + + Get the FOR UPDATE OF column_list NOWAIT fragment appropriate + for this dialect given the aliases of the columns to be write locked. + + The columns to be write locked. + The appropriate FOR UPDATE colunm_list NOWAIT clause string. + + + + Modifies the given SQL by applying the appropriate updates for the specified + lock modes and key columns. + + the SQL string to modify + a map of lock modes indexed by aliased table names. + a map of key columns indexed by aliased table names. + the modified SQL string. + + The behavior here is that of an ANSI SQL SELECT FOR UPDATE. This + method is really intended to allow dialects which do not support + SELECT FOR UPDATE to achieve this in their own fashion. + + + + + Some dialects support an alternative means to SELECT FOR UPDATE, + whereby a "lock hint" is appends to the table name in the from clause. + + The lock mode to apply + The name of the table to which to apply the lock hint. + The table with any required lock hints. + + + + Return SQL needed to drop the named table. May (and should) use + some form of "if exists" clause, and cascade constraints. + + + + + + Generate a temporary table name given the bas table. + The table name from which to base the temp table name. + The generated temp table name. + + + + Does the dialect require that temporary table DDL statements occur in + isolation from other statements? This would be the case if the creation + would cause any current transaction to get committed implicitly. + + see the result matrix above. + + JDBC defines a standard way to query for this information via the + {@link java.sql.DatabaseMetaData#dataDefinitionCausesTransactionCommit()} + method. However, that does not distinguish between temporary table + DDL and other forms of DDL; MySQL, for example, reports DDL causing a + transaction commit via its driver, even though that is not the case for + temporary table DDL. +

+ Possible return values and their meanings:

    +
  • {@link Boolean#TRUE} - Unequivocally, perform the temporary table DDL in isolation.
  • +
  • {@link Boolean#FALSE} - Unequivocally, do not perform the temporary table DDL in isolation.
  • +
  • null - defer to the JDBC driver response in regards to {@link java.sql.DatabaseMetaData#dataDefinitionCausesTransactionCommit()}
  • +
+
+
+ + Do we need to drop the temporary table after use? + + + + Registers an OUT parameter which will be returing a + . How this is accomplished varies greatly + from DB to DB, hence its inclusion (along with {@link #getResultSet}) here. + + The callable statement. + The bind position at which to register the OUT param. + The number of (contiguous) bind positions used. + + + + Given a callable statement previously processed by , + extract the from the OUT parameter. + + The callable statement. + The extracted result set. + SQLException Indicates problems extracting the result set. + + + + The syntax used to drop a foreign key constraint from a table. + + The name of the foreign key constraint to drop. + + The SQL string to drop the foreign key constraint. + + + + + The syntax that is used to check if a constraint does not exists before creating it + + The table. + The name. + + + + + The syntax that is used to close the if for a constraint exists check, used + for dialects that requires begin/end for ifs + + The table. + The name. + + + + + The syntax that is used to check if a constraint exists before dropping it + + The table. + The name. + + + + + The syntax that is used to close the if for a constraint exists check, used + for dialects that requires begin/end for ifs + + The table. + The name. + + + + + The syntax used to drop a primary key constraint from a table. + + The name of the primary key constraint to drop. + + The SQL string to drop the primary key constraint. + + + + + The syntax used to drop an index constraint from a table. + + The name of the index constraint to drop. + + The SQL string to drop the primary key constraint. + + + + + Provided we , then attch the + "select identity" clause to the insert statement. + + The insert command + + The insert command with any necessary identity select clause attached. + Note, if == false then + the insert-string should be returned without modification. + + + + + Get the select command to use to retrieve the last generated IDENTITY + value for a particular table + + The table into which the insert was done + The PK column. + The type code. + The appropriate select command + + + + The syntax used during DDL to define a column as being an IDENTITY of + a particular type. + + The type code. + The appropriate DDL fragment. + + + + Generate the appropriate select statement to to retreive the next value + of a sequence. + + the name of the sequence + String The "nextval" select string. + This should be a "stand alone" select statement. + + + + Typically dialects which support sequences can drop a sequence + with a single command. + + The name of the sequence + The sequence drop commands + + This is convenience form of + to help facilitate that. + + Dialects which support sequences and can drop a sequence in a + single command need *only* override this method. Dialects + which support sequences but require multiple commands to drop + a sequence should instead override . + + + + + The multiline script used to drop a sequence. + + The name of the sequence + The sequence drop commands + + + + Generate the select expression fragment that will retrieve the next + value of a sequence as part of another (typically DML) statement. + + the name of the sequence + The "nextval" fragment. + + This differs from in that this + should return an expression usable within another statement. + + + + + Typically dialects which support sequences can create a sequence + with a single command. + + The name of the sequence + The sequence creation command + + This is convenience form of to help facilitate that. + Dialects which support sequences and can create a sequence in a + single command need *only* override this method. Dialects + which support sequences but require multiple commands to create + a sequence should instead override . + + + + + An optional multi-line form for databases which . + + The name of the sequence + The initial value to apply to 'create sequence' statement + The increment value to apply to 'create sequence' statement + The sequence creation commands + + + + Overloaded form of , additionally + taking the initial value and increment size to be applied to the sequence + definition. + + The name of the sequence + The initial value to apply to 'create sequence' statement + The increment value to apply to 'create sequence' statement + The sequence creation command + + The default definition is to suffix + with the string: " start with {initialValue} increment by {incrementSize}" where + {initialValue} and {incrementSize} are replacement placeholders. Generally + dialects should only need to override this method if different key phrases + are used to apply the allocation information. + + + + + Create a strategy responsible + for handling this dialect's variations in how joins are handled. + + This dialect's strategy. + + + + Create a strategy responsible + for handling this dialect's variations in how CASE statements are + handled. + + This dialect's strategy. + + + The SQL literal value to which this database maps boolean values. + The boolean value + The appropriate SQL literal. + + + + Attempts to add a LIMIT clause to the given SQL SELECT. + Expects any database-specific offset and limit adjustments to have already been performed (ex. UseMaxForLimit, OffsetStartsAtOne). + + The to base the limit query off. + Offset of the first row to be returned by the query. This may be represented as a parameter, a string literal, or a null value if no limit is requested. This should have already been adjusted to account for OffsetStartsAtOne. + Maximum number of rows to be returned by the query. This may be represented as a parameter, a string literal, or a null value if no offset is requested. This should have already been adjusted to account for UseMaxForLimit. + A new that contains the LIMIT clause. Returns null + if represents a SQL statement to which a limit clause cannot be added, + for example when the query string is custom SQL invoking a stored procedure. + + + + Attempts to generate a string to limit the result set to a number of maximum results with a specified offset into the results. + Expects any database-specific offset and limit adjustments to have already been performed (ex. UseMaxForLimit, OffsetStartsAtOne). + Performs error checking based on the various dialect limit support options. If both parameters and fixed valeus are + specified, this will use the parameter option if possible. Otherwise, it will fall back to a fixed string. + + + + + + + + + + + Some databases require that a limit statement contain the maximum row number + instead of the number of rows to retrieve. This method adjusts source + limit and offset values to account for this. + + + + + + + + Some databases use limit row offsets that start at one instead of zero. + This method adjusts a desired offset using the OffsetStartsAtOne flag. + + + + + + + Checks to see if the name has been quoted. + + The name to check if it is quoted + true if name is already quoted. + + The default implementation is to compare the first character + to Dialect.OpenQuote and the last char to Dialect.CloseQuote + + + + + Quotes a name. + + The string that needs to be Quoted. + A QuotedName + +

+ This method assumes that the name is not already Quoted. So if the name passed + in is "name then it will return """name". It escapes the first char + - the " with "" and encloses the escaped string with OpenQuote and CloseQuote. +

+
+
+ + + Quotes a name for being used as a aliasname + + Original implementation calls + Name of the alias + A Quoted name in the format of OpenQuote + aliasName + CloseQuote + +

+ If the aliasName is already enclosed in the OpenQuote and CloseQuote then this + method will return the aliasName that was passed in without going through any + Quoting process. So if aliasName is passed in already Quoted make sure that + you have escaped all of the chars according to your DataBase's specifications. +

+
+
+ + + Quotes a name for being used as a columnname + + Original implementation calls + Name of the column + A Quoted name in the format of OpenQuote + columnName + CloseQuote + +

+ If the columnName is already enclosed in the OpenQuote and CloseQuote then this + method will return the columnName that was passed in without going through any + Quoting process. So if columnName is passed in already Quoted make sure that + you have escaped all of the chars according to your DataBase's specifications. +

+
+
+ + + Quotes a name for being used as a tablename + + Name of the table + A Quoted name in the format of OpenQuote + tableName + CloseQuote + +

+ If the tableName is already enclosed in the OpenQuote and CloseQuote then this + method will return the tableName that was passed in without going through any + Quoting process. So if tableName is passed in already Quoted make sure that + you have escaped all of the chars according to your DataBase's specifications. +

+
+
+ + + Quotes a name for being used as a schemaname + + Name of the schema + A Quoted name in the format of OpenQuote + schemaName + CloseQuote + +

+ If the schemaName is already enclosed in the OpenQuote and CloseQuote then this + method will return the schemaName that was passed in without going through any + Quoting process. So if schemaName is passed in already Quoted make sure that + you have escaped all of the chars according to your DataBase's specifications. +

+
+
+ + + Unquotes and unescapes an already quoted name + + Quoted string + Unquoted string + +

+ This method checks the string quoted to see if it is + quoted. If the string quoted is already enclosed in the OpenQuote + and CloseQuote then those chars are removed. +

+

+ After the OpenQuote and CloseQuote have been cleaned from the string quoted + then any chars in the string quoted that have been escaped by doubling them + up are changed back to a single version. +

+

+ The following quoted values return these results + "quoted" = quoted + "quote""d" = quote"d + quote""d = quote"d +

+

+ If this implementation is not sufficient for your Dialect then it needs to be overridden. + MsSql2000Dialect is an example of where UnQuoting rules are different. +

+
+
+ + + Unquotes an array of Quoted Names. + + strings to Unquote + an array of unquoted strings. + + This use UnQuote(string) for each string in the quoted array so + it should not need to be overridden - only UnQuote(string) needs + to be overridden unless this implementation is not sufficient. + + + + + Given a type code, determine an appropriate + null value to use in a select clause. + + The type code. + The appropriate select clause value fragment. + + One thing to consider here is that certain databases might + require proper casting for the nulls here since the select here + will be part of a UNION/UNION ALL. + + + + + Registers a NHibernate name for the given type code. + + The typecode + The NHibernate name + + + + Build an instance of the preferred by this dialect for + converting into NHibernate's ADOException hierarchy. + + The Dialect's preferred . + + The default Dialect implementation simply returns a converter based on X/Open SQLState codes. + + It is strongly recommended that specific Dialect implementations override this + method, since interpretation of a SQL error is much more accurate when based on + the ErrorCode rather than the SQLState. Unfortunately, the ErrorCode is a vendor-specific approach. + + + + + Do we need to drop constraints before dropping tables in the dialect? + + + + + Do we need to qualify index names with the schema name? + + + + + Does this dialect support the UNIQUE column syntax? + + + + Does this dialect support adding Unique constraints via create and alter table ? + + + + Does this dialect support adding foreign key constraints via alter table? If not, it's assumed they can only be added through create table. + + + + + Does the dialect support the syntax 'drop table if exists NAME' + + + + + Does the dialect support the syntax 'drop table NAME if exists' + + + + Does this dialect support column-level check constraints? + True if column-level CHECK constraints are supported; false otherwise. + + + Does this dialect support table-level check constraints? + True if table-level CHECK constraints are supported; false otherwise. + + + + Get the string to append to SELECT statements to acquire locks + for this dialect. + + The appropriate FOR UPDATE clause string. + + + Is FOR UPDATE OF syntax supported? + True if the database supports FOR UPDATE OF syntax; false otherwise. + + + + Does this dialect support FOR UPDATE in conjunction with outer joined rows? + + True if outer joined rows can be locked via FOR UPDATE. + + + + Retrieves the FOR UPDATE NOWAIT syntax specific to this dialect + + The appropriate FOR UPDATE NOWAIT clause string. + + + Does this dialect support temporary tables? + + + Does this dialect support a way to retrieve the database's current timestamp value? + + + + Gives the best resolution that the database can use for storing + date/time values, in ticks. + + + + For example, if the database can store values with 100-nanosecond + precision, this property is equal to 1L. If the database can only + store values with 1-millisecond precision, this property is equal + to 10000L (number of ticks in a millisecond). + + + Used in TimestampType. + + + + + + Completely optional cascading drop clause + + + + Only needed if the Dialect does not have SupportsForeignKeyConstraintInAlterTable. + + + Only needed if the Dialect does not have SupportsForeignKeyConstraintInAlterTable. + + + + Does this dialect support identity column key generation? + + + + + Does the dialect support some form of inserting and selecting + the generated IDENTITY value all in the same statement. + + + + + Whether this dialect has an identity clause added to the data type or a + completely separate identity data type. + + + + + Get the select command to use to retrieve the last generated IDENTITY value. + + The appropriate select command + + + + The keyword used to specify an identity column, if native key generation is supported + + + + + Set this to false if no table-level primary key constraint should be generated when an identity column has been specified for the table. + This is used as a work-around for SQLite so it doesn't tell us we have "more than one primary key". + + + + + The keyword used to insert a generated value into an identity column (or null). + Need if the dialect does not support inserts that specify no column values. + + + + + Does this dialect support sequences? + + + + + Does this dialect support "pooled" sequences? + + True if such "pooled" sequences are supported; false otherwise. + + A pooled sequence is one that has a configurable initial size and increment + size. It enables NHibernate to be allocated a pool/block/range of IDs, + which can reduce the frequency of round trips to the database during ID + generation. + + + + + + Get the select command used retrieve the names of all sequences. + The select command; or null if sequences are not supported. + + + + The class (which implements ) + which acts as this dialects identity-style generation strategy. + + The native generator class. + + Comes into play whenever the user specifies the "identity" generator. + + + + + The class (which implements ) + which acts as this dialects native generation strategy. + + The native generator class. + + Comes into play whenever the user specifies the native generator. + + + + + Does this Dialect have some kind of LIMIT syntax? + + False, unless overridden. + + + + Does this Dialect support an offset? + + + + + Can parameters be used for a statement containing a LIMIT? + + + + + Does the LIMIT clause take a "maximum" row number instead + of a total number of returned rows? + + True if limit is relative from offset; false otherwise. + + This is easiest understood via an example. Consider you have a table + with 20 rows, but you only want to retrieve rows number 11 through 20. + Generally, a limit with offset would say that the offset = 11 and the + limit = 10 (we only want 10 rows at a time); this is specifying the + total number of returned rows. Some dialects require that we instead + specify offset = 11 and limit = 20, where 20 is the "last" row we want + relative to offset (i.e. total number of rows = 20 - 11 = 9) + So essentially, is limit relative from offset? Or is limit absolute? + + + + + For limit clauses, indicates whether to use 0 or 1 as the offset that returns the first row. Should be true if the first row is at offset 1. + + + + + The opening quote for a quoted identifier. + + + + + The closing quote for a quoted identifier. + + + + + Does this dialect support UNION ALL, which is generally a faster variant of UNION? + True if UNION ALL is supported; false otherwise. + + + + + Does this dialect support empty IN lists? + For example, is [where XYZ in ()] a supported construct? + + True if empty in lists are supported; false otherwise. + + + + Are string comparisons implicitly case insensitive. + In other words, does [where 'XYZ' = 'xyz'] resolve to true? + + True if comparisons are case insensitive. + + + + Is this dialect known to support what ANSI-SQL terms "row value + constructor" syntax; sometimes called tuple syntax. +

+ Basically, does it support syntax like + "... where (FIRST_NAME, LAST_NAME) = ('Steve', 'Ebersole') ...". +

+ + True if this SQL dialect is known to support "row value + constructor" syntax; false otherwise. + +
+ + + If the dialect supports {@link #supportsRowValueConstructorSyntax() row values}, + does it offer such support in IN lists as well? +

+ For example, "... where (FIRST_NAME, LAST_NAME) IN ( (?, ?), (?, ?) ) ..." +

+ + True if this SQL dialect is known to support "row value + constructor" syntax in the IN list; false otherwise. + +
+ + + Should LOBs (both BLOB and CLOB) be bound using stream operations (i.e. + {@link java.sql.PreparedStatement#setBinaryStream}). + + True if BLOBs and CLOBs should be bound using stream operations. + + + + Does this dialect support parameters within the select clause of + INSERT ... SELECT ... statements? + + True if this is supported; false otherwise. + + + + Does this dialect support asking the result set its positioning + information on forward only cursors. Specifically, in the case of + scrolling fetches, Hibernate needs to use + {@link java.sql.ResultSet#isAfterLast} and + {@link java.sql.ResultSet#isBeforeFirst}. Certain drivers do not + allow access to these methods for forward only cursors. +

+ NOTE : this is highly driver dependent! +

+ + True if methods like {@link java.sql.ResultSet#isAfterLast} and + {@link java.sql.ResultSet#isBeforeFirst} are supported for forward + only cursors; false otherwise. + +
+ + + Does this dialect support definition of cascade delete constraints + which can cause circular chains? + + True if circular cascade delete constraints are supported; false otherwise. + + + + Are subselects supported as the left-hand-side (LHS) of + IN-predicates. + + In other words, is syntax like "... {subquery} IN (1, 2, 3) ..." supported? + + True if subselects can appear as the LHS of an in-predicate;false otherwise. + + + + Expected LOB usage pattern is such that I can perform an insert + via prepared statement with a parameter binding for a LOB value + without crazy casting to JDBC driver implementation-specific classes... +

+ Part of the trickiness here is the fact that this is largely + driver dependent. For example, Oracle (which is notoriously bad with + LOB support in their drivers historically) actually does a pretty good + job with LOB support as of the 10.2.x versions of their drivers... +

+ + True if normal LOB usage patterns can be used with this driver; + false if driver-specific hookiness needs to be applied. + +
+ + Does the dialect support propagating changes to LOB + values back to the database? Talking about mutating the + internal value of the locator as opposed to supplying a new + locator instance... +

+ For BLOBs, the internal value might be changed by: + {@link java.sql.Blob#setBinaryStream}, + {@link java.sql.Blob#setBytes(long, byte[])}, + {@link java.sql.Blob#setBytes(long, byte[], int, int)}, + or {@link java.sql.Blob#truncate(long)}. +

+ For CLOBs, the internal value might be changed by: + {@link java.sql.Clob#setAsciiStream(long)}, + {@link java.sql.Clob#setCharacterStream(long)}, + {@link java.sql.Clob#setString(long, String)}, + {@link java.sql.Clob#setString(long, String, int, int)}, + or {@link java.sql.Clob#truncate(long)}. +

+ NOTE : I do not know the correct answer currently for + databases which (1) are not part of the cruise control process + or (2) do not {@link #supportsExpectedLobUsagePattern}. +

+ True if the changes are propagated back to the database; false otherwise. +
+ + + Is it supported to materialize a LOB locator outside the transaction in + which it was created? +

+ Again, part of the trickiness here is the fact that this is largely + driver dependent. +

+ NOTE: all database I have tested which {@link #supportsExpectedLobUsagePattern()} + also support the ability to materialize a LOB outside the owning transaction... +

+ True if unbounded materialization is supported; false otherwise. +
+ + + Does this dialect support referencing the table being mutated in + a subquery. The "table being mutated" is the table referenced in + an UPDATE or a DELETE query. And so can that table then be + referenced in a subquery of said UPDATE/DELETE query. +

+ For example, would the following two syntaxes be supported:

    +
  • delete from TABLE_A where ID not in ( select ID from TABLE_A )
  • +
  • update TABLE_A set NON_ID = 'something' where ID in ( select ID from TABLE_A)
  • +
+
+ True if this dialect allows references the mutating table from a subquery. +
+ + Does the dialect support an exists statement in the select clause? + True if exists checks are allowed in the select clause; false otherwise. + + + + For the underlying database, is READ_COMMITTED isolation implemented by + forcing readers to wait for write locks to be released? + + True if writers block readers to achieve READ_COMMITTED; false otherwise. + + + + For the underlying database, is REPEATABLE_READ isolation implemented by + forcing writers to wait for read locks to be released? + + True if readers block writers to achieve REPEATABLE_READ; false otherwise. + + + + Does this dialect support using a JDBC bind parameter as an argument + to a function or procedure call? + + True if the database supports accepting bind params as args; false otherwise. + + + + Does this dialect support subselects? + + + + + Retrieve a set of default Hibernate properties for this database. + + + + + Aggregate SQL functions as defined in general. This is + a case-insensitive hashtable! + + + The results of this method should be integrated with the + specialization's data. + + + + + Get the command used to select a GUID from the underlying database. + (Optional operation.) + + The appropriate command. + + + Command used to create a table. + + + + Slight variation on . + The command used to create a multiset table. + + + Here, we have the command used to create a table when there is no primary key and + duplicate rows are expected. +

+ Most databases do not care about the distinction; originally added for + Teradata support which does care. + + + +

Command used to create a temporary table. +
+ + + Get any fragments needing to be postfixed to the command for + temporary table creation. + + + + + Should the value returned by + be treated as callable. Typically this indicates that JDBC escape + sytnax is being used... + + + + + Retrieve the command used to retrieve the current timestammp from the database. + + + + + The name of the database-specific SQL function for retrieving the + current timestamp. + + + + + The keyword used to insert a row without specifying any column values + + + + + The name of the SQL function that transforms a string to lowercase + + + + + The syntax used to add a column to a table. Note this is deprecated + + + + + The keyword used to specify a nullable column + + + + + The keyword used to create a primary key constraint + + + + + Supports splitting batches using GO T-SQL command + + + Batches http://msdn.microsoft.com/en-us/library/ms175502.aspx + + + + + This specialized string tokenizier will break a string to tokens, taking + into account single quotes, parenthesis and commas and [ ] + Notice that we aren't differenciating between [ ) and ( ] on purpose, it would complicate + the code and it is not legal at any rate. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Summary description for FirebirdDialect. + + + The FirebirdDialect defaults the following configuration properties: + + + Property + Default Value + + + connection.driver_class + + + + + + + + A generic SQL dialect which may or may not work on any actual databases + + + + + + + + + + + Summary description for InformixDialect. + This dialect is intended to work with IDS version 7.31 + However I can test only version 10.00 as I have only this version at work + + + The InformixDialect defaults the following configuration properties: + + + ConnectionDriver + NHibernate.Driver.OdbcDriver + PrepareSql + true + + + connection.driver_class + + + + + + + + + + + Get the FOR UPDATE OF column_list fragment appropriate for this + dialect given the aliases of the columns to be write locked. + + The columns to be write locked. + The appropriate FOR UPDATE OF column_list clause string. + + + + Does the dialect require that temporary table DDL statements occur in + isolation from other statements? This would be the case if the creation + would cause any current transaction to get committed implicitly. + + see the result matrix above. + + JDBC defines a standard way to query for this information via the + {@link java.sql.DatabaseMetaData#dataDefinitionCausesTransactionCommit()} + method. However, that does not distinguish between temporary table + DDL and other forms of DDL; MySQL, for example, reports DDL causing a + transaction commit via its driver, even though that is not the case for + temporary table DDL. +

+ Possible return values and their meanings:

    +
  • {@link Boolean#TRUE} - Unequivocally, perform the temporary table DDL in isolation.
  • +
  • {@link Boolean#FALSE} - Unequivocally, do not perform the temporary table DDL in isolation.
  • +
  • null - defer to the JDBC driver response in regards to {@link java.sql.DatabaseMetaData#dataDefinitionCausesTransactionCommit()}
  • +
+
+
+ + + Get the select command to use to retrieve the last generated IDENTITY + value for a particular table + + The table into which the insert was done + The PK column. + The type code. + The appropriate select command + + + + The syntax used during DDL to define a column as being an IDENTITY of + a particular type. + + The type code. + The appropriate DDL fragment. + + + + Create a strategy responsible + for handling this dialect's variations in how joins are handled. + + This dialect's strategy. + + + The SQL literal value to which this database maps boolean values. + The boolean value + The appropriate SQL literal. + + + + The keyword used to insert a generated value into an identity column (or null). + Need if the dialect does not support inserts that specify no column values. + + + + Command used to create a temporary table. + + + + Get any fragments needing to be postfixed to the command for + temporary table creation. + + + + + Should the value returned by + be treated as callable. Typically this indicates that JDBC escape + sytnax is being used... + + + + + Retrieve the command used to retrieve the current timestammp from the database. + + + + + The name of the database-specific SQL function for retrieving the + current timestamp. + + + + + + + Is FOR UPDATE OF syntax supported? + True if the database supports FOR UPDATE OF syntax; false otherwise. + + + + Does this dialect support FOR UPDATE in conjunction with outer joined rows? + + True if outer joined rows can be locked via FOR UPDATE. + + + Does this dialect support temporary tables? + + + Does this dialect support a way to retrieve the database's current timestamp value? + + + + Whether this dialect have an Identity clause added to the data type or a + completely separate identity data type + + + + + The syntax that returns the identity value of the last insert, if native + key generation is supported + + + + + The keyword used to specify an identity column, if native key generation is supported + + + + + Does this dialect support sequences? + + + + + Does this Dialect have some kind of LIMIT syntax? + + False, unless overridden. + + + + Does this Dialect support an offset? + + + + + Can parameters be used for a statement containing a LIMIT? + + + + + Does this dialect support UNION ALL, which is generally a faster variant of UNION? + True if UNION ALL is supported; false otherwise. + + + + + Knows how to extract a violated constraint name from an error message based on the + fact that the constraint name is templated within the message. + + + + + Defines a contract for implementations that can extract the name of a violated + constraint from a SQLException that is the result of that constraint violation. + + + + + Extract the name of the violated constraint from the given SQLException. + + The exception that was the result of the constraint violation. + The extracted constraint name. + + + + Extracts the constraint name based on a template (i.e., templateStartconstraintNametemplateEnd). + + The pattern denoting the start of the constraint name within the message. + The pattern denoting the end of the constraint name within the message. + The templated error message containing the constraint name. + The found constraint name, or null. + + + + Extract the name of the violated constraint from the given SQLException. + + The exception that was the result of the constraint violation. + The extracted constraint name. + + + + Extract the name of the violated constraint from the given DbException. + + The exception that was the result of the constraint violation. + The extracted constraint name. + + + + Summary description for InformixDialect. + This dialect is intended to work with IDS version 9.40 + + + The InformixDialect defaults the following configuration properties: + + + ConnectionDriver + NHibernate.Driver.OdbcDriver + PrepareSql + true + + + connection.driver_class + + + + + + + + + + + Generate the appropriate select statement to to retreive the next value + of a sequence. + + the name of the sequence + String The "nextval" select string. + This should be a "stand alone" select statement. + + + + Generate the select expression fragment that will retrieve the next + value of a sequence as part of another (typically DML) statement. + + the name of the sequence + The "nextval" fragment. + + This differs from in that this + should return an expression usable within another statement. + + + + + Create a strategy responsible + for handling this dialect's variations in how joins are handled. + + This dialect's strategy. + + + Get the select command used retrieve the names of all sequences. + The select command; or null if sequences are not supported. + + + + Does this dialect support sequences? + + + + + Does this dialect support "pooled" sequences. Not aware of a better + name for this. Essentially can we specify the initial and increment values? + + True if such "pooled" sequences are supported; false otherwise. + + + + Does this Dialect have some kind of LIMIT syntax? + + False, unless overridden. + + + + Does this Dialect support an offset? + + + + + Summary description for InformixDialect. + This dialect is intended to work with IDS version 10.00 + + + The InformixDialect defaults the following configuration properties: + + + ConnectionDriver + NHibernate.Driver.OdbcDriver + PrepareSql + true + + + connection.driver_class + + + + + + + + + + + Does this Dialect have some kind of LIMIT syntax? + + False, unless overridden. + + + + Does this Dialect support an offset? + + + + + An SQL dialect for IngresSQL. + + + The IngresDialect defaults the following configuration properties: + + + Property + Default Value + + + connection.driver_class + + + + + + + + Attempts to add a LIMIT clause to the given SQL SELECT. + Expects any database-specific offset and limit adjustments to have already been performed (ex. UseMaxForLimit, OffsetStartsAtOne). + + The to base the limit query off. + Offset of the first row to be returned by the query. This may be represented as a parameter, a string literal, or a null value if no limit is requested. This should have already been adjusted to account for OffsetStartsAtOne. + Maximum number of rows to be returned by the query. This may be represented as a parameter, a string literal, or a null value if no offset is requested. This should have already been adjusted to account for UseMaxForLimit. + + A new that contains the LIMIT clause. Returns null + if represents a SQL statement to which a limit clause cannot be added, + for example when the query string is custom SQL invoking a stored procedure. + + + + + Does this Dialect have some kind of LIMIT syntax? + + + False, unless overridden. + + + + + Can parameters be used for a statement containing a LIMIT? + + + + + Does this Dialect support an offset? + + + + + Use a parameter with ParameterDirection.Output + + + + + Use a parameter with ParameterDirection.ReturnValue + + + + + An SQL dialect compatible with Microsoft SQL Server 2000. + + + The MsSql2000Dialect defaults the following configuration properties: + + + Property + Default Value + + + connection.driver_class + + + + adonet.batch_size + 10 + + + query.substitutions + true 1, false 0, yes 'Y', no 'N' + + + + + + + Generates the string to drop the table using SQL Server syntax. + + The name of the table to drop. + The SQL with the inserted. + + + + + + + MsSql does not require the OpenQuote to be escaped as long as the first char + is an OpenQuote. + + + + + Does this Dialect have some kind of LIMIT syntax? + + True, we'll use the SELECT TOP nn syntax. + + + + Does this Dialect support an offset? + + + + + Can parameters be used for a statement containing a LIMIT? + + + + + Does the LIMIT clause take a "maximum" row number + instead of a total number of returned rows? + + false, unless overridden + + + + Sql Server 2005 supports a query statement that provides LIMIT + functionality. + + true + + + + Sql Server 2005 supports a query statement that provides LIMIT + functionality with an offset. + + true + + + + Sql Server 2005 supports a query statement that provides LIMIT + functionality with an offset. + + false + + + + Transforms a T-SQL SELECT statement into a statement that will - when executed - return a 'page' of results. The page is defined + by a page size ('limit'), and/or a starting page number ('offset'). + + + + + Returns a TSQL SELECT statement that will - when executed - return a 'page' of results. + + + + + + + + An SQL dialect compatible with Microsoft SQL Server 7. + + + There have been no test run with this because the NHibernate team does not + have a machine with Sql 7 installed on it. But there have been users using + Ms Sql 7 with NHibernate. As issues with Ms Sql 7 and NHibernate become known + this Dialect will be updated. + + + + + Uses @@identity to get the Id value. + + + There is a well known problem with @@identity and triggers that insert into + rows into other tables that also use an identity column. The only way I know + of to get around this problem is to upgrade your database server to Ms Sql 2000. + + + + + A dialect for SQL Server Everywhere (SQL Server CE). + + + + + A SQL dialect for MySQL + + + The MySQLDialect defaults the following configuration properties: + + + Property + Default Value + + + connection.driver_class + + + + + + + + Create the SQL string to drop a foreign key constraint. + + The name of the foreign key to drop. + The SQL string to drop the foreign key constraint. + + + + Create the SQL string to drop a primary key constraint. + + The name of the primary key to drop. + The SQL string to drop the primary key constraint. + + + + Create the SQL string to drop an index. + + The name of the index to drop. + The SQL string to drop the index constraint. + + + + Subclasses register a typename for the given type code, to be used in CAST() + statements. + + The typecode + The database type name + + + + Subclasses register a typename for the given type code, to be used in CAST() + statements. + + The typecode + + The database type name + + + + Get the name of the database type appropriate for casting operations + (via the CAST() SQL function) for the given typecode. + + The typecode + The database type name + + + + + + + + + + + + + + + + + + + + + + + + + + + + A dialect specifically for use with Oracle 10g. + + + The main difference between this dialect and + is the use of "ANSI join syntax" here... + + + + + A dialect for Oracle 8i. + + + + + Support for the oracle proprietary join syntax... + + The orqacle join fragment + + + + Map case support to the Oracle DECODE function. Oracle did not + add support for CASE until 9i. + + The oracle CASE -> DECODE fragment + + + + Allows access to the basic + implementation... + + The mapping type + The appropriate select cluse fragment + + + + It's a immature version, it just work. + An SQL dialect for Oracle Lite + + + The OracleLiteDialect defaults the following configuration properties: + + + Property + Default Value + + + connection.driver_class + + + + + + + + + + + + + + An SQL dialect for PostgreSQL 8.1 and above. + + + + PostgreSQL 8.1 supports FOR UPDATE ... NOWAIT syntax. + + + PostgreSQL supports Identity column using the "SERIAL" type. + Serial type is a "virtual" type that will automatically: + + + Create a sequence named tablename_colname_seq. + Set the default value of this column to the next value of the + sequence. (using function nextval('tablename_colname_seq')) + Add a "NOT NULL" constraint to this column. + Set the sequence as "owned by" the table. + + + To insert the next value of the sequence into the serial column, + exclude the column from the list of columns + in the INSERT statement or use the DEFAULT key word. + + + If the table or the column is dropped, the sequence is dropped too. + + + + + + + An SQL dialect for PostgreSQL. + + + The PostgreSQLDialect defaults the following configuration properties: + + + Property + Default Value + + + connection.driver_class + + + + + + + PostgreSQL requires to cast NULL values to correctly handle UNION/UNION ALL + + See + PostgreSQL BUG #1847: Error in some kind of UNION query. + + The type code. + null casted as : "null::sqltypename" + + + + Supported with SQL 2003 syntax since 7.4, released 2003-11-17. For older versions + we need to override GetCreateSequenceString(string, int, int) and provide alternative + syntax, but I don't think we need to bother for such ancient releases (considered EOL). + + + + PostgreSQL supports UNION ALL clause + + Reference: + PostgreSQL 8.0 UNION Clause documentation + + + + + + PostgreSQL supports serial and serial4 type for 4 bytes integer auto increment column. + bigserial or serial8 can be used for 8 bytes integer auto increment column. + + bigserial if equal Int64, + serial otherwise + + + + PostgreSQL supports Identity column using the "SERIAL" type. + + + + + PostgreSQL doesn't have type in identity column. + + + To create an identity column it uses the SQL syntax + CREATE TABLE tablename (colname SERIAL); or + CREATE TABLE tablename (colname BIGSERIAL); + + + + + The sql syntax to insert a row without specifying any column in PostgreSQL is + INSERT INTO table DEFAULT VALUES; + + + + + PostgreSQL 8.1 and above defined the fuction lastval() that returns the + value of the last sequence that nextval() was used on in the current session. + Call lastval() if nextval() has not yet been called in the current + session throw an exception. + + + + + An SQL dialect for PostgreSQL 8.2 and above. + + + PostgreSQL 8.2 supports DROP TABLE IF EXISTS tablename + and DROP SEQUENCE IF EXISTS sequencename syntax. + See for more information. + + + + + A SQL dialect for SQLite. + + +

+ Author: Ioan Bizau +

+
+
+ + + + + + + + SQLite does not currently support dropping foreign key constraints by alter statements. + This means that tables cannot be dropped if there are any rows that depend on those. + If there are cycles between tables, it would even be excessively difficult to delete + the data in the right order first. Because of this, we just turn off the foreign + constraints before we drop the schema and hope that we're not going to break anything. :( + We could theoretically check for data consistency afterwards, but we don't currently. + + + + + An SQL dialect for Sybase Adaptive Server Anywhere 9.0 + + +

+ This dialect probably will not work with schema-export. If anyone out there + can fill in the ctor with DbTypes to Strings that would be helpful. +

+ The dialect defaults the following configuration properties: + + + Property + Default Value + + + connection.driver_class + + + + prepare_sql + + + +
+
+ + + ASA does not require to drop constraint before dropping tables, and DROP statement + syntax used by Hibernate to drop constraint is not compatible with ASA, so disable it. + Comments matchs SybaseAnywhereDialect from Hibernate-3.1 src + + + + + An SQL dialect targeting Sybase Adaptive Server Enterprise (ASE) 15 and higher. + + + The dialect defaults the following configuration properties: + + + Property + Default Value + + + connection.driver_class + + + + + + + + Sybase ASE 15 temporary tables are not supported + + + By default, temporary tables in Sybase ASE 15 can only be created outside a transaction. + This is not supported by NHibernate. Temporary tables (and other DDL) statements can only + be run in a transaction if the 'ddl in tran' database option on tempdb is set to 'true'. + However, Sybase does not recommend this setting due to the performance impact arising from + locking and contention on tempdb system tables. + + + + + This is false only by default. The database can be configured to be + case-insensitive. + + + + + SQL Dialect for SQL Anywhere 10 - for the NHibernate 3.0.0 distribution + Copyright (C) 2010 Glenn Paulley + Contact: http://iablog.sybase.com/paulley + + This NHibernate dialect should be considered BETA software. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + The dialect defaults the following configuration properties: + + + Property + Default Value + + + connection.driver_class + + + + prepare_sql + + + + + + + + SQL Anywhere 10 supports READ, WRITE, and INTENT row + locks. INTENT locks are sufficient to ensure that other + concurrent connections cannot modify a row (though other + connections can still read that row). SQL Anywhere also + supports 3 modes of snapshot isolation (multi-version + concurrency control (MVCC). + + SQL Anywhere's FOR UPDATE clause supports + FOR UPDATE BY [ LOCK | VALUES ] + FOR UPDATE OF ( COLUMN LIST ) + + though they cannot be specified at the same time. BY LOCK is + the syntax that acquires INTENT locks. FOR UPDATE BY VALUES + forces the use of the KEYSET cursor, which returns a warning to + the application when a row in the cursor has been subsequently + modified by another connection, and an error if the row has + been deleted. + + SQL Anywhere does not support the FOR UPDATE NOWAIT syntax of + Oracle on a statement-by-statement basis. However, the + identical functionality is provided by setting the connection + option BLOCKING to "OFF", or setting an appropriate timeout + period through the connection option BLOCKING_TIMEOUT. + + + + + SQL Anywhere 10 does not perform a COMMIT upon creation of + a temporary table. However, it does perform an implicit + COMMIT when creating an index over a temporary table, or + upon ALTERing the definition of temporary table. + + + + + SQL Anywhere does support OUT parameters with callable stored procedures. + + + + + SQL Anywhere uses DEFAULT AUTOINCREMENT to identify an IDENTITY + column in a CREATE TABLE statement. + + + + + SQL Anywhere does support FOR UPDATE OF syntax. However, + in SQL Anywhere one cannot specify both FOR UPDATE OF syntax + and FOR UPDATE BY LOCK in the same statement. To achieve INTENT + locking when using FOR UPDATE OF syntax one must use a table hint + in the query's FROM clause, ie. + + SELECT * FROM FOO WITH( UPDLOCK ) FOR UPDATE OF ( column-list ). + + In this dialect, we avoid this issue by supporting only + FOR UPDATE BY LOCK. + + + + + SQL Anywhere supports FOR UPDATE over cursors containing + outer joins. + + + + + Lock rows in the cursor explicitly using INTENT row locks. + + + + + Enforce the condition that this query is read-only. This ensure that certain + query rewrite optimizations, such as join elimination, can be used. + + + + + Lock rows in the cursor explicitly using INTENT row locks. + + + + + SQL Anywhere does not support FOR UPDATE NOWAIT. However, the intent + is to acquire pessimistic locks on the underlying rows; with NHibernate + one can accomplish this through setting the BLOCKING connection option. + Hence, with this API we lock rows in the cursor explicitly using INTENT row locks. + + + + + We assume that applications using this dialect are NOT using + SQL Anywhere's snapshot isolation modes. + + + + + We assume that applications using this dialect are NOT using + SQL Anywhere's snapshot isolation modes. + + + + + SQL Anywhere supports both double quotes or '[' (Microsoft syntax) for + quoted identifiers. + + Note that quoted identifiers are controlled through + the QUOTED_IDENTIFIER connection option. + + + + + SQL Anywhere supports both double quotes or '[' (Microsoft syntax) for + quoted identifiers. + + + + + SQL Anywhere's implementation of KEYSET-DRIVEN cursors does not + permit absolute postioning. With jConnect as the driver, this support + will succeed because jConnect FETCHes the entire result set to the client + first; it will fail with the iAnywhere JDBC driver. Because the server + may decide to use a KEYSET cursor even if the cursor is declared as + FORWARD ONLY, this support is disabled. + + + + + By default, the SQL Anywhere dbinit utility creates a + case-insensitive database for the CHAR collation. This can + be changed through the use of the -c command line switch on + dbinit, and the setting may differ for the NCHAR collation + for national character sets. Whether or not a database + supports case-sensitive comparisons can be determined via + the DB_Extended_property() function, for example + + SELECT DB_EXTENDED_PROPERTY( 'Collation', 'CaseSensitivity'); + + + + + SQL Anywhere supports COMMENT ON statements for a wide variety of + database objects. When the COMMENT statement is executed an implicit + COMMIT is performed. However, COMMENT syntax for CREATE TABLE, as + expected by NHibernate (see Table.cs), is not supported. + + + + + SQL Anywhere currently supports only "VALUES (DEFAULT)", not + the ANSI standard "DEFAULT VALUES". This latter syntax will be + supported in the SQL Anywhere 11.0.1 release. For the moment, + "VALUES (DEFAULT)" works only for a single-column table. + + + + + SQL Anywhere does not require dropping a constraint before + dropping a table, and the DROP statement syntax used by Hibernate + to drop a constraint is not compatible with SQL Anywhere, so disable it. + + + + + In SQL Anywhere, the syntax, DECLARE LOCAL TEMPORARY TABLE ..., + can also be used, which creates a temporary table with procedure scope, + which may be important for stored procedures. + + + + + Assume that temporary table rows should be preserved across COMMITs. + + + + + SQL Dialect for SQL Anywhere 11 - for the NHibernate 3.0.0 distribution + Copyright (C) 2010 Glenn Paulley + Contact: http://iablog.sybase.com/paulley + + This NHibernate dialect should be considered BETA software. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + The dialect defaults the following configuration properties: + + + Property + Default Value + + + connection.driver_class + + + + prepare_sql + + + + + + + + SQL Dialect for SQL Anywhere 12 - for the NHibernate 3.2.0 distribution + Copyright (C) 2011 Glenn Paulley + Contact: http://iablog.sybase.com/paulley + + This NHibernate dialect for SQL Anywhere 12 is a contribution to the NHibernate + open-source project. It is intended to be included in the NHibernate + distribution and is licensed under LGPL. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + The SybaseSQLAnywhere12Dialect uses the SybaseSQLAnywhere11Dialect as its + base class. SybaseSQLAnywhere12Dialect includes support for ISO SQL standard + sequences, which are defined in the catalog table SYSSEQUENCE. + The dialect uses the SybaseSQLAnywhe11MetaData class for metadata API + calls, which correctly supports reserved words defined by SQL Anywhere. + + The dialect defaults the following configuration properties: + + + Property + Default Value + + + connection.driver_class + + + + prepare_sql + + + + + + + + SQL Anywhere supports SEQUENCES using a primarily SQL Standard + syntax. Sequence values can be queried using the .CURRVAL identifier, and the next + value in a sequence can be retrieved using the .NEXTVAL identifier. Sequences + are retained in the SYS.SYSSEQUENCE catalog table. + + + + + Pooled sequences does not refer to the CACHE parameter of the CREATE SEQUENCE + statement, but merely if the DBMS supports sequences that can be incremented or decremented + by values greater than 1. + + + + Get the SELECT command used to retrieve the names of all sequences. + The SELECT command; or NULL if sequences are not supported. + + + + This class maps a DbType to names. + + + Associations may be marked with a capacity. Calling the Get() + method with a type and actual size n will return the associated + name with smallest capacity >= n, if available and an unmarked + default type otherwise. + Eg, setting + + Names.Put(DbType, "TEXT" ); + Names.Put(DbType, 255, "VARCHAR($l)" ); + Names.Put(DbType, 65534, "LONGVARCHAR($l)" ); + + will give you back the following: + + Names.Get(DbType) // --> "TEXT" (default) + Names.Get(DbType,100) // --> "VARCHAR(100)" (100 is in [0:255]) + Names.Get(DbType,1000) // --> "LONGVARCHAR(1000)" (100 is in [256:65534]) + Names.Get(DbType,100000) // --> "TEXT" (default) + + On the other hand, simply putting + + Names.Put(DbType, "VARCHAR($l)" ); + + would result in + + Names.Get(DbType) // --> "VARCHAR($l)" (will cause trouble) + Names.Get(DbType,100) // --> "VARCHAR(100)" + Names.Get(DbType,1000) // --> "VARCHAR(1000)" + Names.Get(DbType,10000) // --> "VARCHAR(10000)" + + + + + + Get default type name for specified type + + the type key + the default type name associated with the specified key + + + + Get the type name specified type and size + + the type key + the SQL length + the SQL scale + the SQL precision + + The associated name with smallest capacity >= size if available and the + default type name otherwise + + + + + For types with a simple length, this method returns the definition + for the longest registered type. + + + + + + + Set a type name for specified type key and capacity + + the type key + the (maximum) type size/length + The associated name + + + + + + + + + + + Execute the given for each command of the resultset. + + The action to perform where the first parameter is the and the second parameter is the parameters offset of the . + + + + Datareader wrapper with the same life cycle of its command (through the batcher) + + + + + NHibernate driver for the Community CsharpSqlite data provider. +

+ Author: Nikolaos Tountas +

+
+ +

+ In order to use this Driver you must have the Community.CsharpSqlite.dll and Community.CsharpSqlite.SQLiteClient assemblies referenced. +

+

+ Please check http://code.google.com/p/csharp-sqlite/ for more information regarding csharp-sqlite. +

+
+
+ + + Base class for the implementation of IDriver + + + + + A strategy for describing how NHibernate should interact with the different .NET Data + Providers. + + + + The IDriver interface is not intended to be exposed to the application. + Instead it is used internally by NHibernate to obtain connection objects, command objects, and + to generate and prepare IDbCommands. Implementors should provide a + public default constructor. + + + This is the interface to implement, or you can inherit from + if you have an ADO.NET data provider that NHibernate does not have built in support for. + To use the driver, NHibernate property connection.driver_class should be + set to the assembly-qualified name of the driver class. + + + key="connection.driver_class" + value="FullyQualifiedClassName, AssemblyName" + + + + + + Configure the driver using . + + + + + Creates an uninitialized IDbConnection object for the specific Driver + + + + + Generates an IDbCommand from the SqlString according to the requirements of the DataProvider. + + The of the command to generate. + The SqlString that contains the SQL. + The types of the parameters to generate for the command. + An IDbCommand with the CommandText and Parameters fully set. + + + + Prepare the by calling . + May be a no-op if the driver does not support preparing commands, or for any other reason. + + The command. + + + + Generates an IDbDataParameter for the IDbCommand. It does not add the IDbDataParameter to the IDbCommand's + Parameter collection. + + The IDbCommand to use to create the IDbDataParameter. + The name to set for IDbDataParameter.Name + The SqlType to set for IDbDataParameter. + An IDbDataParameter ready to be added to an IDbCommand. + + + + Remove 'extra' parameters from the IDbCommand + + + We sometimes create more parameters than necessary (see NH-2792 & also comments in SqlStringFormatter.ISqlStringVisitor.Parameter) + + + + + Expand the parameters of the cmd to have a single parameter for each parameter in the + sql string + + + This is for databases that do not support named parameters. So, instead of a single parameter + for 'select ... from MyTable t where t.Col1 = @p0 and t.Col2 = @p0' we can issue + 'select ... from MyTable t where t.Col1 = ? and t.Col2 = ?' + + + + + Make any adjustments to each IDbCommand object before it is added to the batcher. + + The command. + + This method should be executed before add each single command to the batcher. + If you have to adjust parameters values/type (when the command is full filled) this is a good place where do it. + + + + + Does this Driver support having more than 1 open IDataReader with + the same IDbConnection. + + + + A value of indicates that an exception would be thrown if NHibernate + attempted to have 2 IDataReaders open using the same IDbConnection. NHibernate + (since this version is a close to straight port of Hibernate) relies on the + ability to recursively open 2 IDataReaders. If the Driver does not support it + then NHibernate will read the values from the IDataReader into an . + + + A value of will result in greater performance because an IDataReader can be used + instead of the . So if the Driver supports it then make sure + it is set to . + + + + + + Change the parameterName into the correct format IDbCommand.CommandText + for the ConnectionProvider + + The unformatted name of the parameter + A parameter formatted for an IDbCommand.CommandText + + + + Changes the parameterName into the correct format for an IDbParameter + for the Driver. + + + For SqlServerConnectionProvider it will change id to @id + + The unformatted name of the parameter + A parameter formatted for an IDbParameter. + + + + Generates an IDbDataParameter for the IDbCommand. It does not add the IDbDataParameter to the IDbCommand's + Parameter collection. + + The IDbCommand to use to create the IDbDataParameter. + The name to set for IDbDataParameter.Name + The SqlType to set for IDbDataParameter. + An IDbDataParameter ready to be added to an IDbCommand. + + + + Override to make any adjustments to the IDbCommand object. (e.g., Oracle custom OUT parameter) + Parameters have been bound by this point, so their order can be adjusted too. + This is analagous to the RegisterResultSetOutParameter() function in Hibernate. + + + + + Override to make any adjustments to each IDbCommand object before it added to the batcher. + + The command. + + This method is similar to the but, instead be called just before execute the command (that can be a batch) + is executed before add each single command to the batcher and before . + If you have to adjust parameters values/type (when the command is full filled) this is a good place where do it. + + + + + Does this Driver require the use of a Named Prefix in the SQL statement. + + + For example, SqlClient requires select * from simple where simple_id = @simple_id + If this is false, like with the OleDb provider, then it is assumed that + the ? can be a placeholder for the parameter in the SQL statement. + + + + + Does this Driver require the use of the Named Prefix when trying + to reference the Parameter in the Command's Parameter collection. + + + This is really only useful when the UseNamedPrefixInSql == true. When this is true the + code will look like: + IDbParameter param = cmd.Parameters["@paramName"] + if this is false the code will be + IDbParameter param = cmd.Parameters["paramName"]. + + + + + The Named Prefix for parameters. + + + Sql Server uses "@" and Oracle uses ":". + + + + + Does this Driver support IDbCommand.Prepare(). + + + + A value of indicates that an exception would be thrown or the + company that produces the Driver we are wrapping does not recommend using + IDbCommand.Prepare(). + + + A value of indicates that calling IDbCommand.Prepare() will function + fine on this Driver. + + + + + + Initializes a new instance of with + type names that are loaded from the specified assembly. + + Assembly to load the types from. + Connection type name. + Command type name. + + + + Initializes a new instance of with + type names that are loaded from the specified assembly. + + The Invariant name of a provider. + Assembly to load the types from. + Connection type name. + Command type name. + + + + + Initializes a new instance of . + + + Thrown when the Community.CsharpSqlite.dll assembly can not be loaded. + + + + + A NHibernate Driver for using the IBM.Data.DB2.iSeries DataProvider. + + + + + Initializes a new instance of the class. + + + Thrown when the IBM.Data.DB2.iSeries assembly can not be loaded. + + + + + A NHibernate Driver for using the IBM.Data.DB2 DataProvider. + + + + + Initializes a new instance of the class. + + + Thrown when the IBM.Data.DB2 assembly can not be loaded. + + + + + Provides a database driver for dotConnect for MySQL by DevArt. + + + + In order to use this driver you must have the assembly Devart.Data.MySql.dll available for + NHibernate to load, including its dependencies (Devart.Data.dll). + + + Please check the product's website + for any updates and/or documentation regarding dotConnect for MySQL. + + + + + + Initializes a new instance of the class. + + + Thrown when the Devart.Data.MySql assembly can not be loaded. + + + + + Devart.Data.MySql uses named parameters in the sql. + + - MySql uses @ in the sql. + + + + + + + Devart.Data.MySql use the @ to locate parameters in sql. + + @ is used to locate parameters in sql. + + + + A NHibernate Driver for using the Firebird data provider located in + FirebirdSql.Data.FirebirdClient assembly. + + + + + Initializes a new instance of the class. + + + Thrown when the FirebirdSql.Data.Firebird assembly can not be loaded. + + + + + A NHibernate Driver for using the Informix DataProvider + + + + + Initializes a new instance of the class. + + + Thrown when the IBM.Data.Informix assembly can not be loaded. + + + + + A NHibernate Driver for using the Ingres DataProvider + + + + + + + Provides a database driver for MySQL. + + + + In order to use this driver you must have the assembly MySql.Data.dll available for + NHibernate to load, including its dependencies (ICSharpCode.SharpZipLib.dll is required by + the assembly MySql.Data.dll as of the time of this writing). + + + Please check the product's website + for any updates and/or documentation regarding MySQL. + + + + + + Initializes a new instance of the class. + + + Thrown when the MySql.Data assembly can not be loaded. + + + + + MySql.Data uses named parameters in the sql. + + - MySql uses ? in the sql. + + + + + + + MySql.Data use the ? to locate parameters in sql. + + ? is used to locate parameters in sql. + + + + The MySql.Data driver does NOT support more than 1 open IDataReader + with only 1 IDbConnection. + + - it is not supported. + + + + MySql.Data does not support preparing of commands. + + - it is not supported. + + With the Gamma MySql.Data provider it is throwing an exception with the + message "Expected End of data packet" when a select command is prepared. + + + + + Some Data Providers (ie - SqlClient) do not support Multiple Active Result Sets (MARS). + NHibernate relies on being able to create MARS to read Components and entities inside + of Collections. + + + This is a completely off-line DataReader - the underlying IDataReader that was used to create + this has been closed and no connections to the Db exists. + + + + + Creates a NDataReader from a + + The to get the records from the Database. + if we are loading the in the middle of reading it. + + NHibernate attempts to not have to read the contents of an into memory until it absolutely + has to. What that means is that it might have processed some records from the and will + pick up the midstream so that the underlying can be closed + so a new one can be opened. + + + + + Sets the values that can be cached back to null and sets the + index of the cached column to -1 + + + + + + + + + + + + + + + + + Takes care of freeing the managed and unmanaged resources that + this class is responsible for. + + + There are not any unmanaged resources or any disposable managed + resources that this class is holding onto. It is in here + to comply with the interface. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Stores a Result from a DataReader in memory. + + + + + Initializes a new instance of the NResult class. + + The IDataReader to populate the Result with. + + if the is already positioned on the record + to start reading from. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + An implementation of that will work with either an + returned by Execute or with an + whose contents have been read into a . + + + + This allows NHibernate to use the underlying for as long as + possible without the need to read everything into the . + + + The consumer of the returned from does + not need to know the underlying reader and can use it the same even if it switches from an + to in the middle of its use. + + + + + + Initializes a new instance of the class. + + The underlying IDataReader to use. + + + + Initializes a new instance of the NHybridDataReader class. + + The underlying IDataReader to use. + if the contents of the IDataReader should be read into memory right away. + + + + Reads all of the contents into memory because another + needs to be opened. + + + This will result in a no op if the reader is closed or is already in memory. + + + + + + + + + + + + + + + + + A flag to indicate if Disose() has been called. + + + + + Finalizer that ensures the object is correctly disposed of. + + + + + Takes care of freeing the managed and unmanaged resources that + this class is responsible for. + + + + + Takes care of freeing the managed and unmanaged resources that + this class is responsible for. + + Indicates if this NHybridDataReader is being Disposed of or Finalized. + + If this NHybridDataReader is being Finalized (isDisposing==false) then make sure not + to call any methods that could potentially bring this NHybridDataReader back to life. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gets if the object is in the middle of reading a Result. + + if NextResult and Read have been called on the . + + + + + + + + + + + + + + + + + + + + + + The PostgreSQL data provider provides a database driver for PostgreSQL. +

+ Author: Oliver Weichhold +

+
+ +

+ In order to use this Driver you must have the Npgsql.dll Assembly available for + NHibernate to load it. +

+

+ Please check the products website + http://www.postgresql.org/ + for any updates and or documentation. +

+

+ The homepage for the .NET DataProvider is: + http://pgfoundry.org/projects/npgsql. +

+
+
+ + + Initializes a new instance of the class. + + + Thrown when the Npgsql assembly can not be loaded. + + + + + A NHibernate Driver for using the Odbc DataProvider + + + Always look for a native .NET DataProvider before using the Odbc DataProvider. + + + + + A NHibernate Driver for using the OleDb DataProvider + + + Always look for a native .NET DataProvider before using the OleDb DataProvider. + + + + + OLE DB provider does not support multiple open data readers + + + + + A NHibernate Driver for using the Oracle DataProvider. + + + + + A NHibernate Driver for using the Oracle.DataAccess DataProvider + + + Code was contributed by James Mills + on the NHibernate forums in this + post. + + + + + Initializes a new instance of . + + + Thrown when the Oracle.DataAccess assembly can not be loaded. + + + + + This adds logic to ensure that a DbType.Boolean parameter is not created since + ODP.NET doesn't support it. + + + + + + + + + + + + + + A NHibernate Driver for using the Oracle.DataAccess.Lite DataProvider + + + + + Initializes a new instance of . + + + Thrown when the Oracle.DataAccess.Lite_w32 assembly can not be loaded. + + + + + This adds logic to ensure that a DbType.Boolean parameter is not created since + ODP.NET doesn't support it. + + + + + A NHibernate Driver for using the Oracle.ManagedDataAccess DataProvider + + + + + Initializes a new instance of . + + + Thrown when the Oracle.ManagedDataAccess assembly can not be loaded. + + + + + This adds logic to ensure that a DbType.Boolean parameter is not created since + ODP.NET doesn't support it. + + + + + + + + + + + + + + A NHibernate Driver for using the SqlClient DataProvider + + + + + Creates an uninitialized object for + the SqlClientDriver. + + An unitialized object. + + + + Creates an uninitialized object for + the SqlClientDriver. + + An unitialized object. + + + + Interprets if a parameter is a Clob (for the purposes of setting its default size) + + The parameter + The of the parameter + True, if the parameter should be interpreted as a Clob, otherwise False + + + + Interprets if a parameter is a Blob (for the purposes of setting its default size) + + The parameter + The of the parameter + True, if the parameter should be interpreted as a Blob, otherwise False + + + + MsSql requires the use of a Named Prefix in the SQL statement. + + + because MsSql uses "@". + + + + + MsSql requires the use of a Named Prefix in the Parameter. + + + because MsSql uses "@". + + + + + The Named Prefix for parameters. + + + Sql Server uses "@". + + + + + The SqlClient driver does NOT support more than 1 open IDataReader + with only 1 IDbConnection. + + - it is not supported. + + MS SQL Server 2000 (and 7) throws an exception when multiple IDataReaders are + attempted to be opened. When SQL Server 2005 comes out a new driver will be + created for it because SQL Server 2005 is supposed to support it. + + + + + NHibernate driver for the System.Data.SQLite data provider for .NET 2.0. + + +

+ In order to use this driver you must have the System.Data.SQLite.dll assembly available + for NHibernate to load. This assembly includes the SQLite.dll or SQLite3.dll libraries. +

+

+ You can get the System.Data.SQLite.dll assembly from http://sourceforge.net/projects/sqlite-dotnet2. +

+

+ Please check http://www.sqlite.org/ for more information regarding SQLite. +

+
+
+ + + Initializes a new instance of . + + + Thrown when the SQLite.NET assembly can not be loaded. + + + + + A NHibernate driver for Microsoft SQL Server CE data provider + + + + + Initializes a new instance of the class. + + + + + MsSql requires the use of a Named Prefix in the SQL statement. + + + because MsSql uses "@". + + + + + MsSql requires the use of a Named Prefix in the Parameter. + + + because MsSql uses "@". + + + + + The Named Prefix for parameters. + + + Sql Server uses "@". + + + + + The SqlClient driver does NOT support more than 1 open IDataReader + with only 1 IDbConnection. + + - it is not supported. + + Ms Sql 2000 (and 7) throws an Exception when multiple DataReaders are + attempted to be Opened. When Yukon comes out a new Driver will be + created for Yukon because it is supposed to support it. + + + + + The SybaseAsaClientDriver driver provides a database driver for Adaptive Server Anywhere 9.0. + + + + + Initializes a new instance of the class. + + + Thrown when the iAnywhere.Data.AsaClient assembly is not and can not be loaded. + + + + + This provides a driver for Sybase ASE 15 using the ADO.NET driver. + + + You will need the following libraries available to your application: +
    +
  • Sybase.AdoNet2.AseClient.dll
  • +
  • sybdrvado20.dll
  • +
+
+
+ + + SQL Dialect for SQL Anywhere 12 - for the NHibernate 3.2.0 distribution + Copyright (C) 2011 Glenn Paulley + Contact: http://iablog.sybase.com/paulley + + This NHibernate dialect for SQL Anywhere 12 is a contribution to the NHibernate + open-source project. It is intended to be included in the NHibernate + distribution and is licensed under LGPL. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + The SybaseSQLAnywhereDotNet4Driver provides a .NET 4 database driver for + Sybase SQL Anywhere 12 using the versioned ADO.NET driver + iAnywhere.Data.SQLAnywhere.v4.0. + + + + + Initializes a new instance of the class. + + + Thrown when the iAnywhere.Data.SQLAnywhere.v4.0 assembly is not and can not be loaded. + + + + + The SybaseSQLAnywhereDriver Driver provides a database driver for Sybase SQL Anywhere 10 and above + + + + + Initializes a new instance of the class. + + + Thrown when the iAnywhere.Data.SQLAnywhere assembly is not and can not be loaded. + + + + + Represents state associated with the processing of a given + in regards to loading collections. + + + Another implementation option to consider is to not expose ResultSets + directly (in the JDBC redesign) but to always "wrap" them and apply a [series of] context[s] to that wrapper. + + + + + Creates a collection load context for the given result set. + + Callback to other collection load contexts. + The result set this is "wrapping". + + + + Retrieve the collection that is being loaded as part of processing this result set. + + The persister for the collection being requested. + The key of the collection being requested. + The loading collection (see discussion above). + + Basically, there are two valid return values from this method:
    +
  • an instance of {@link PersistentCollection} which indicates to + continue loading the result set row data into that returned collection + instance; this may be either an instance already associated and in the + midst of being loaded, or a newly instantiated instance as a matching + associated collection was not found.
  • +
  • null indicates to ignore the corresponding result set row + data relating to the requested collection; this indicates that either + the collection was found to already be associated with the persistence + context in a fully loaded state, or it was found in a loading state + associated with another result set processing context.
  • +
+
+
+ + + Finish the process of collection-loading for this bound result set. Mainly this + involves cleaning up resources and notifying the collections that loading is + complete. + + The persister for which to complete loading. + + + Add the collection to the second-level cache + The entry representing the collection to add + The persister + + + + Maps to specific contextual data + related to processing that . + + + Implementation note: internally an is used to maintain + the mappings; was chosen because I'd rather not be + dependent upon potentially bad and + implementations. + Considering the JDBC-redesign work, would further like this contextual info + not mapped separately, but available based on the result set being processed. + This would also allow maintaining a single mapping as we could reliably get + notification of the result-set closing... + + + + Creates and binds this to the given persistence context. + The persistence context to which this will be bound. + + + + Release internal state associated with the given result set. + + The result set for which it is ok to release associated resources. + + This should be called when we are done with processing said result set, + ideally as the result set is being closed. + + + + Release internal state associated with *all* result sets. + + This is intended as a "failsafe" process to make sure we get everything + cleaned up and released. + + + + + Get the {@link CollectionLoadContext} associated with the given + {@link ResultSet}, creating one if needed. + + The result set for which to retrieve the context. + The processing context. + + + + Attempt to locate the loading collection given the owner's key. The lookup here + occurs against all result-set contexts... + + The collection persister + The owner key + The loading collection, or null if not found. + + + + Register a loading collection xref. + + The xref collection key + The corresponding loading collection entry + + This xref map is used because sometimes a collection is in process of + being loaded from one result set, but needs to be accessed from the + context of another "nested" result set processing. + Implementation note: package protected, as this is meant solely for use + by {@link CollectionLoadContext} to be able to locate collections + being loaded by other {@link CollectionLoadContext}s/{@link ResultSet}s. + + + + + The inverse of {@link #registerLoadingCollectionXRef}. Here, we are done + processing the said collection entry, so we remove it from the + load context. + + The key of the collection we are done processing. + + The idea here is that other loading collections can now reference said + collection directly from the {@link PersistenceContext} because it + has completed its load cycle. + Implementation note: package protected, as this is meant solely for use + by {@link CollectionLoadContext} to be able to locate collections + being loaded by other {@link CollectionLoadContext}s/{@link ResultSet}s. + + + + + Locate the LoadingCollectionEntry within *any* of the tracked + s. + + The collection key. + The located entry; or null. + + Implementation note: package protected, as this is meant solely for use + by to be able to locate collections + being loaded by other s/ResultSets. + + + + + Retrieves the persistence context to which this is bound. + + + + + Do we currently have any internal entries corresponding to loading + collections? + + True if we currently hold state pertaining to loading collections; false otherwise. + + + + Do we currently have any registered internal entries corresponding to loading + collections? + True if we currently hold state pertaining to a registered loading collections; false otherwise. + + + + + Represents a collection currently being loaded. + + + + Describes a return in a native SQL query. + + + + Represents a return defined as part of a native sql query which + names a collection role in the form {classname}.{collectionrole}; it + is used in defining a custom sql query for loading an entity's + collection in non-fetching scenarios (i.e., loading the collection + itself as the "root" of the result). + + + + + Represents the base information for a non-scalar return defined as part of + a native sql query. + + + + Constructs some form of non-scalar return descriptor + The result alias + Any user-supplied column->property mappings + The lock mode to apply to the return. + + + Retrieve the defined result alias + + + Retrieve the lock-mode to apply to this return + + + Retrieve the user-supplied column->property mappings. + + + Construct a native-sql return representing a collection initializer + The result alias + + The entity-name of the entity owning the collection to be initialized. + + + The property name (on the owner) which represents + the collection to be initialized. + + Any user-supplied column->property mappings + The lock mode to apply to the collection. + + + + The class owning the collection. + + + + + The name of the property representing the collection from the . + + + + + Represents a return defined as part of a native sql query which + names a fetched role. + + + + Construct a return descriptor representing some form of fetch. + The result alias + The owner's result alias + The owner's property representing the thing to be fetched + Any user-supplied column->property mappings + The lock mode to apply + + + The alias of the owner of this fetched association. + + + + Retrieve the property name (relative to the owner) which maps to + the association to be fetched. + + + + + Represents a return defined as part of a native sql query which + names a "root" entity. A root entity means it is explicitly a + "column" in the result, as opposed to a fetched relationship or role. + + + + + Construct a return representing an entity returned at the root + of the result. + + The result alias + The entity name. + The lock mode to apply + + + + Construct a return representing an entity returned at the root + of the result. + + The result alias + The entity name. + Any user-supplied column->property mappings + The lock mode to apply + + + The name of the entity to be returned. + + + Describes a scalar return in a native SQL query. + + + + Extends an HQLQueryPlan to maintain a reference to the collection-role name + being filtered. + + + + Defines a query execution plan for an HQL query (or filter). + + + Descriptor regarding a named parameter. + + + + Not supported yet (AST parse needed) + + + + Defines a query execution plan for a native-SQL query. + + + Encapsulates metadata about parameters encountered within a query. + + + + The single available method + is responsible for parsing a query string and recognizing tokens in + relation to parameters (either named, ejb3-style, or ordinal) and + providing callbacks about such recognitions. + + + + + Performs the actual parsing and tokenizing of the query string making appropriate + callbacks to the given recognizer upon recognition of the various tokens. + + + Note that currently, this only knows how to deal with a single output + parameter (for callable statements). If we later add support for + multiple output params, this, obviously, needs to change. + + The string to be parsed/tokenized. + The thing which handles recognition events. + + + + + Implements a parameter parser recognizer specifically for the purpose + of journaling parameter locations. + + + + + Convenience method for creating a param location recognizer and + initiating the parse. + + The query to be parsed for parameter locations. + The generated recognizer, with journaled location info. + + + + The dictionary of named parameter locations. + The dictionary is keyed by parameter name. + + + + + The list of ordinal parameter locations. + + + The list elements are integers, representing the location for that given ordinal. + Thus OrdinalParameterLocationList[n] represents the location for the nth parameter. + + + + Acts as a cache for compiled query plans, as well as query-parameter metadata. + + + + Represents work that needs to be performed in a manner + which isolates it from any current application unit of + work transaction. + + + + + Perform the actual work to be done. + + The ADP connection to use. + The active transaction of the connection. + + + + Class which provides the isolation semantics required by + an . + + + + + Processing comes in two flavors: + + + + makes sure the work to be done is performed in a separate, distinct transaction + + + + makes sure the work to be done is performed outside the scope of any transaction + + + + + + + Ensures that all processing actually performed by the given work will + occur on a separate transaction. + + The work to be performed. + The session from which this request is originating. + + + + Ensures that all processing actually performed by the given work will + occur outside of a transaction. + + The work to be performed. + The session from which this request is originating. + + + + Responsible for maintaining the queue of actions related to events. + + The ActionQueue holds the DML operations queued as part of a session's + transactional-write-behind semantics. DML operations are queued here + until a flush forces them to be executed against the database. + + + + + + Perform all currently queued entity-insertion actions. + + + + + Perform all currently queued actions. + + + + + Prepares the internal action queues for execution. + + + + + Execute any registered + + + + + Performs cleanup of any held cache softlocks. + + Was the transaction successful. + + + + Check whether the given tables/query-spaces are to be executed against + given the currently queued actions. + + The table/query-spaces to check. + True if we contain pending actions against any of the given tables; false otherwise. + + + + Check whether any insertion or deletion actions are currently queued. + + True if insertions or deletions are currently queued; false otherwise. + + + + Identifies a named association belonging to a particular + entity instance. Used to record the fact that an association + is null during loading. + + + + + Defines a sequence of elements that are currently + eligible for batch fetching. + + + Even though this is a map, we only use the keys. A map was chosen in + order to utilize a to maintain sequencing + as well as uniqueness. + + + + + A map of subselect-fetch descriptors + keyed by the against which the descriptor is + registered. + + + + + The owning persistence context. + + + + + Constructs a queue for the given context. + + The owning persistence context. + + + + Clears all entries from this fetch queue. + + + + + Retrieve the fetch descriptor associated with the given entity key. + + The entity key for which to locate any defined subselect fetch. + The fetch descriptor; may return null if no subselect fetch queued for + this entity key. + + + + Adds a subselect fetch decriptor for the given entity key. + + The entity for which to register the subselect fetch. + The fetch descriptor. + + + + After evicting or deleting an entity, we don't need to + know the query that was used to load it anymore (don't + call this after loading the entity, since we might still + need to load its collections) + + + + + Clears all pending subselect fetches from the queue. + + + Called after flushing. + + + + + If an EntityKey represents a batch loadable entity, add + it to the queue. + + + Note that the contract here is such that any key passed in should + previously have been been checked for existence within the + ; failure to do so may cause the + referenced entity to be included in a batch even though it is + already associated with the . + + + + + After evicting or deleting or loading an entity, we don't + need to batch fetch it anymore, remove it from the queue + if necessary + + + + + Get a batch of uninitialized collection keys for a given role + + The persister for the collection role. + A key that must be included in the batch fetch + the maximum number of keys to return + The entity mode. + an array of collection keys, of length batchSize (padded with nulls) + + + + Get a batch of unloaded identifiers for this class, using a slightly + complex algorithm that tries to grab keys registered immediately after + the given key. + + The persister for the entities being loaded. + The identifier of the entity currently demanding load. + The maximum number of keys to return + an array of identifiers, of length batchSize (possibly padded with nulls) + + + + The types of children to cascade to + + + + + A cascade point that occurs just after the insertion of the parent + entity and just before deletion + + + + + A cascade point that occurs just before the insertion of the parent entity + and just after deletion + + + + + A cascade point that occurs just after the insertion of the parent entity + and just before deletion, inside a collection + + + + + A cascade point that occurs just after the update of the parent entity + + + + A cascade point that occurs just before the session is flushed + + + + A cascade point that occurs just after eviction of the parent entity from the + session cache + + + + + A cascade point that occurs just after locking a transient parent entity into the + session cache + + + + + A cascade point that occurs just after locking a transient parent entity into the session cache + + + + + A cascade point that occurs just before merging from a transient parent entity into + the object in the session cache + + + + + Delegate responsible, in conjunction with the various + , for implementing cascade processing. + + + + Cascade an action from the parent entity instance to all its children. + The parent's entity persister + The parent reference. + + + + Cascade an action from the parent entity instance to all its children. This + form is typicaly called from within cascade actions. + + The parent's entity persister + The parent reference. + + Typically some form of cascade-local cache + which is specific to each CascadingAction type + + + + Cascade an action to the child or children + + + Cascade an action to a collection + + + Cascade an action to a to-one association or any type + + + Cascade to the collection elements + + + Delete any entities that were removed from the collection + + + A contract for defining the aspects of cascading various persistence actions. + + + + package-protected constructor + + + For this style, should the given action be cascaded? + The action to be checked for cascade-ability. + True if the action should be cascaded under this style; false otherwise. + + + + Probably more aptly named something like doCascadeToCollectionElements(); + it is however used from both the collection and to-one logic branches... + + The action to be checked for cascade-ability. + True if the action should be really cascaded under this style; false otherwise. + + For this style, should the given action really be cascaded? The default + implementation is simply to return {@link #doCascade}; for certain + styles (currently only delete-orphan), however, we need to be able to + control this separately. + + + + Factory method for obtaining named cascade styles + The named cascade style name. + The appropriate CascadeStyle + + + save / delete / update / evict / lock / replicate / merge / persist + delete orphans + + + save / delete / update / evict / lock / replicate / merge / persist + + + save / update + + + lock + + + refresh + + + evict + + + replicate + + + merge + + + create + + + delete + + + delete + delete orphans + + + no cascades + + + Do we need to delete orphaned collection elements? + True if this style need to account for orphan delete operations; false otherwise. + + + + A session action that may be cascaded from parent entity to its children + + + + Cascade the action to the child object. + The session within which the cascade is occurring. + The child to which cascading should be performed. + The child's entity name + Typically some form of cascade-local cache which is specific to each CascadingAction type + Are cascading deletes enabled. + + + + Given a collection, get an iterator of the children upon which the + current cascading action should be visited. + + The session within which the cascade is occurring. + The mapping type of the collection. + The collection instance. + The children iterator. + + + + Called (in the case of returning true) to validate + that no cascade on the given property is considered a valid semantic. + + The session within which the cascade is occurring. + The property value + The property value owner + The entity persister for the owner + The index of the property within the owner. + + + + Given a collection, get an iterator of all its children, loading them + from the database if necessary. + + The session within which the cascade is occurring. + The mapping type of the collection. + The collection instance. + The children iterator. + + + + Iterate just the elements of the collection that are already there. Don't load + any new elements from the database. + + + + + + + + + + + + + + + + + + + + + + + + + Execute persist during flush time + + + + + + + Does this action potentially extrapolate to orphan deletes? + True if this action can lead to deletions of orphans. + + + Does the specified cascading action require verification of no cascade validity? + True if this action requires no-cascade verification; false otherwise. + + + Should this action be performed (or noCascade consulted) in the case of lazy properties. + + + + We need an entry to tell us all about the current state + of a collection with respect to its persistent state + + + + session-start/post-flush persistent state + + + allow the snapshot to be serialized + + + + The when the Collection was loaded. + + + This can be if the Collection was not loaded by NHibernate and + was passed in along with a transient object. + + + + + The identifier of the Entity that is the owner of this Collection + during the load or post flush. + + + + + Indicates that the Collection can still be reached by an Entity + that exist in the . + + + It is also used to ensure that the Collection is not shared between + two Entities. + + + + + Indicates that the Collection has been processed and is ready + to have its state synchronized with the database. + + + + + Indicates that a Collection needs to be updated. + + + A Collection needs to be updated whenever the contents of the Collection + have been changed. + + + + + Indicates that a Collection has old elements that need to be removed. + + + A Collection needs to have removals performed whenever its role changes or + the key changes and it has a loadedPersister - ie - it was loaded by NHibernate. + + + + + Indicates that a Collection needs to be recreated. + + + A Collection needs to be recreated whenever its role changes + or the owner changes. + + + + + If we instantiate a collection during the + process, we must ignore it for the rest of the flush. + + + + + The that is currently responsible + for the Collection. + + + This is set when NHibernate is updating a reachable or an + unreachable collection. + + + + + Initializes a new instance of . + + + For newly wrapped collections, or dereferenced collection wrappers + + + + For collections just loaded from the database + + + + Initializes a new instance of for initialized detached collections. + + + For initialized detached collections + + + + + Determine if the collection is "really" dirty, by checking dirtiness + of the collection elements, if necessary + + + + + Prepares this CollectionEntry for the Flush process. + + The that this CollectionEntry will be responsible for flushing. + + + + Updates the CollectionEntry to reflect that the + has been initialized. + + The initialized that this Entry is for. + + + + Updates the CollectionEntry to reflect that it is has been successfully flushed to the database. + + The that was flushed. + + Called after a successful flush. + + + + + Sets the information in this CollectionEntry that is specific to the + . + + + The that is + responsible for the Collection. + + + + + + + + + + + + + + Uniquely identifies a collection instance in a particular session. + + + + + Record the fact that this collection was dereferenced + + The collection to be updated by unreachability. + The session. + + + + Initialize the role of the collection. + + The collection to be updated by reachibility. + The type of the collection. + The owner of the collection. + The session. + + + + We need an entry to tell us all about the current state + of an object with respect to its persistent state + + + + + Initializes a new instance of EntityEntry. + + The current of the Entity. + The snapshot of the Entity's state when it was loaded. + + The identifier of the Entity in the database. + The version of the Entity. + The for the Entity. + A boolean indicating if the Entity exists in the database. + The that is responsible for this Entity. + + + + + + + After actually inserting a row, record the fact that the instance exists on the + database (needed for identity-column key generation) + + + + + After actually updating the database, update the snapshot information, + and escalate the lock mode. + + + + + After actually deleting a row, record the fact that the instance no longer + exists in the database + + + + + Can the entity be modified? + The entity is modifiable if all of the following are true: + - the entity class is mutable + - the entity is not read-only + - if the current status is Status.Deleted, then the entity was not read-only when it was deleted + + true, if the entity is modifiable; false, otherwise + + + + Gets or sets the current of the Entity. + + The of the Entity. + + + + Gets or sets the of this Entity with respect to its + persistence in the database. + + The of this Entity. + + + + Gets or sets the identifier of the Entity in the database. + + The identifier of the Entity in the database if one has been assigned. + This might be when the is + and the database generates the id. + + + + Gets or sets the snapshot of the Entity when it was loaded from the database. + + The snapshot of the Entity. + + There will only be a value when the Entity was loaded in the current Session. + + + + + Gets or sets the snapshot of the Entity when it was marked as being ready for deletion. + + The snapshot of the Entity. + This will be if the Entity is not being deleted. + + + + Gets or sets a indicating if this Entity exists in the database. + + if it is already in the database. + + It can also be if it does not exists in the database yet and the + is . + + + + + Gets or sets the version of the Entity. + + The version of the Entity. + + + + Gets or sets the that is responsible for this Entity. + + The that is responsible for this Entity. + + + + Gets the Fully Qualified Name of the class this Entity is an instance of. + + The Fully Qualified Name of the class this Entity is an instance of. + + + + Get the EntityKey based on this EntityEntry. + + + + + A globally unique identifier of an instance, consisting of the user-visible identifier + and the identifier space (eg. tablename) + + + + Construct a unique identifier for an entity class instance + + + Used to reconstruct an EntityKey during deserialization. + The identifier value + The root entity name + The specific entity name + The type of the identifier value + Whether represented entity is eligible for batch loading + The session factory + The entity's entity mode + + + + To use in deserialization callback + + + + + + Used to uniquely key an entity instance in relation to a particular session + by some unique property reference, as opposed to identifier. + Uniqueing information consists of the entity-name, the referenced + property name, and the referenced property value. + + + + + + A FilterDefinition defines the global attributes of a dynamic filter. This + information includes its name as well as its defined parameters (name and type). + + + + + Set the named parameter's value list for this filter. + + The name of the filter for which this configuration is in effect. + The default filter condition. + A dictionary storing the NHibernate type + of each parameter under its name. + if set to true used in many to one rel + + + + Retreive the type of the named parameter defined for this filter. + + The name of the filter parameter for which to return the type. + The type of the named parameter. + + + + Gets a value indicating whether to use this filter-def in manytoone refs. + + true if [use in many to one]; otherwise, false. + + + + Get the name of the filter this configuration defines. + + The filter name for this configuration. + + + + Get a set of the parameters defined by this configuration. + + The parameters named by this configuration. + + + Algorithms related to foreign key constraint transparency + + + + Is this instance persistent or detached? + + + If is non-null, don't hit the database to make the + determination, instead assume that value; the client code must be + prepared to "recover" in the case that this assumed result is incorrect. + + + + + Is this instance, which we know is not persistent, actually transient? + If assumed is non-null, don't hit the database to make the + determination, instead assume that value; the client code must be + prepared to "recover" in the case that this assumed result is incorrect. + + + If is non-null, don't hit the database to make the + determination, instead assume that value; the client code must be + prepared to "recover" in the case that this assumed result is incorrect. + + + + + Return the identifier of the persistent or transient object, or throw + an exception if the instance is "unsaved" + + + Used by OneToOneType and ManyToOneType to determine what id value should + be used for an object that may or may not be associated with the session. + This does a "best guess" using any/all info available to use (not just the + EntityEntry). + + + + + Nullify all references to entities that have not yet + been inserted in the database, where the foreign key + points toward that entity + + + + + Return null if the argument is an "unsaved" entity (ie. + one with no existing database row), or the input argument + otherwise. This is how Hibernate avoids foreign key constraint + violations. + + + + + Determine if the object already exists in the database, using a "best guess" + + + + + A strategy for determining if an identifier value is an identifier of a new + transient instance or a previously persistent transient instance. The strategy + is determined by the Unsaved-Value attribute in the mapping file. + + + + + + + + Assume the transient instance is newly instantiated if its identifier is null or + equal to Value + + + + + + Does the given identifier belong to a new instance + + + + + Always assume the transient instance is newly instantiated + + + + + Never assume that transient instance is newly instantiated + + + + + Assume the transient instance is newly instantiated if the identifier + is null. + + + + Assume nothing. + + + + Holds the state of the persistence context, including the + first-level cache, entries, snapshots, proxies, etc. + + + + Add a collection which has no owner loaded + + + + Get and remove a collection whose owner is not yet loaded, + when its owner is being loaded + + + + Clear the state of the persistence context + + + Set the status of an entry + + + Called after transactions end + + + + Get the current state of the entity as known to the underlying + database, or null if there is no corresponding row + + + + + Retrieve the cached database snapshot for the requested entity key. + + The entity key for which to retrieve the cached snapshot + The cached snapshot + + + This differs from is two important respects: + no snapshot is obtained from the database if not already cached + an entry of NO_ROW here is interpreted as an exception + + + + + + Get the values of the natural id fields as known to the underlying + database, or null if the entity has no natural id or there is no + corresponding row. + + + + Add a canonical mapping from entity key to entity instance + + + + Get the entity instance associated with the given EntityKey + + + + Is there an entity with the given key in the persistence context + + + + Remove an entity from the session cache, also clear + up other state associated with the entity, all except + for the EntityEntry + + + + Get an entity cached by unique key + + + Add an entity to the cache by unique key + + + + Retrieve the EntityEntry representation of the given entity. + + The entity for which to locate the EntityEntry. + The EntityEntry for the given entity. + + + Remove an entity entry from the session cache + + + Is there an EntityEntry for this instance? + + + Get the collection entry for a persistent collection + + + Adds an entity to the internal caches. + + + + Generates an appropriate EntityEntry instance and adds it + to the event source's internal caches. + + + + Is the given collection associated with this persistence context? + + + Is the given proxy associated with this persistence context? + + + + Takes the given object and, if it represents a proxy, reassociates it with this event source. + + The possible proxy to be reassociated. + Whether the passed value represented an actual proxy which got initialized. + + + + If a deleted entity instance is re-saved, and it has a proxy, we need to + reset the identifier of the proxy + + + + + Get the entity instance underlying the given proxy, throwing + an exception if the proxy is uninitialized. If the given object + is not a proxy, simply return the argument. + + + + + Possibly unproxy the given reference and reassociate it with the current session. + + The reference to be unproxied if it currently represents a proxy. + The unproxied instance. + + + + Attempts to check whether the given key represents an entity already loaded within the + current session. + + The entity reference against which to perform the uniqueness check. + The entity key. + + + + If the existing proxy is insufficiently "narrow" (derived), instantiate a new proxy + and overwrite the registration of the old one. This breaks == and occurs only for + "class" proxies rather than "interface" proxies. Also init the proxy to point to + the given target implementation if necessary. + + The proxy instance to be narrowed. + The persister for the proxied entity. + The internal cache key for the proxied entity. + (optional) the actual proxied entity instance. + An appropriately narrowed instance. + + + + Return the existing proxy associated with the given EntityKey, or the + third argument (the entity associated with the key) if no proxy exists. Init + the proxy to the target implementation, if necessary. + + + + + Return the existing proxy associated with the given EntityKey, or the + argument (the entity associated with the key) if no proxy exists. + (slower than the form above) + + + + Get the entity that owns this persistent collection + + + Get the entity that owned this persistent collection when it was loaded + The persistent collection + + The owner if its entity ID is available from the collection's loaded key + and the owner entity is in the persistence context; otherwise, returns null + + + + Get the ID for the entity that owned this persistent collection when it was loaded + The persistent collection + the owner ID if available from the collection's loaded key; otherwise, returns null + + + add a collection we just loaded up (still needs initializing) + + + add a detached uninitialized collection + + + + Add a new collection (ie. a newly created one, just instantiated by the + application, with no database state or snapshot) + + The collection to be associated with the persistence context + + + + + add an (initialized) collection that was created by another session and passed + into update() (ie. one with a snapshot and existing state on the database) + + + + add a collection we just pulled out of the cache (does not need initializing) + + + Get the collection instance associated with the CollectionKey + + + + Register a collection for non-lazy loading at the end of the two-phase load + + + + + Force initialization of all non-lazy collections encountered during + the current two-phase load (actually, this is a no-op, unless this + is the "outermost" load) + + + + Get the PersistentCollection object for an array + + + Register a PersistentCollection object for an array. + Associates a holder with an array - MUST be called after loading + array, since the array instance is not created until endLoad(). + + + + + Remove the mapping of collection to holder during eviction of the owning entity + + + + Get the snapshot of the pre-flush collection state + + + + Get the collection entry for a collection passed to filter, + which might be a collection wrapper, an array, or an unwrapped + collection. Return null if there is no entry. + + + + Get an existing proxy by key + + + Add a proxy to the session cache + + + Remove a proxy from the session cache + + + Called before cascading + + + Called after cascading + + + Call this before beginning a two-phase load + + + Call this after finishing a two-phase load + + + + Search the persistence context for an owner for the child object, + given a collection role + + + + + Search the persistence context for an index of the child object, given a collection role + + + + + Record the fact that the association belonging to the keyed entity is null. + + + + Is the association property belonging to the keyed entity null? + + + + Change the read-only status of an entity (or proxy). + + + + Read-only entities can be modified, but changes are not persisted. They are not dirty-checked + and snapshots of persistent state are not maintained. + + + Immutable entities cannot be made read-only. + + + To set the default read-only setting for entities and proxies that are loaded + into the persistence context, see . + + + An entity (or ). + If true, the entity or proxy is made read-only; if false, it is made modifiable. + + + + + + Is the specified entity (or proxy) read-only? + + An entity (or ) + + true if the entity or proxy is read-only, otherwise false. + + + + + + + Add child/parent relation to cache for cascading operations + + The child. + The parent. + + + + Remove child/parent relation from cache + + The child. + + + + Get the session to which this persistence context is bound. + + + + + Retrieve this persistence context's managed load context. + + + + + Get the BatchFetchQueue, instantiating one if necessary. + + + + Retrieve the set of EntityKeys representing nullifiable references + + + Get the mapping from key value to entity instance + + + Get the mapping from entity instance to entity entry + + + Get the mapping from collection instance to collection entry + + + Get the mapping from collection key to collection instance + + + How deep are we cascaded? + + + Is a flush cycle currently in process? + Called before and after the flushcycle + + + + The read-only status for entities (and proxies) loaded into this persistence context. + + + + When a proxy is initialized, the loaded entity will have the same read-only + setting as the uninitialized proxy has, regardless of the persistence context's + current setting. + + + To change the read-only setting for a particular entity or proxy that is already + in the current persistence context, use . + + + + + + + False if we know for certain that all the entities are read-only + + + Is in a two-phase load? + + + + Defines the internal contract between the ISessionFactory and other parts of NHibernate + such as implementors of IType. + + + + + Creates ISessions. + + + + Usually an application has a single SessionFactory. Threads servicing client requests + obtain ISessions from the factory. Implementors must be threadsafe. + + + ISessionFactorys are immutable. The behaviour of a SessionFactory + is controlled by properties supplied at configuration time. + These properties are defined on Environment + + + + + + Open a ISession on the given connection + + A connection provided by the application + A session + + Note that the second-level cache will be disabled if you + supply a ADO.NET connection. NHibernate will not be able to track + any statements you might have executed in the same transaction. + Consider implementing your own . + + + + + Create database connection and open a ISession on it, specifying an interceptor + + A session-scoped interceptor + A session + + + + Open a ISession on the given connection, specifying an interceptor + + A connection provided by the application + A session-scoped interceptor + A session + + Note that the second-level cache will be disabled if you + supply a ADO.NET connection. NHibernate will not be able to track + any statements you might have executed in the same transaction. + Consider implementing your own . + + + + + Create a database connection and open a ISession on it + + + + + + Get the associated with the given entity class + + the given entity type. + The class metadata or if not found. + + + + Get the associated with the given entity name + the given entity name. + The class metadata or if not found. + + + + + Get the CollectionMetadata associated with the named collection role + + + + + + + Get all as a from entityname + to metadata object + + A dictionary from an entity name to + + + + Get all CollectionMetadata as a IDictionary from role name + to metadata object + + + + + + Destroy this SessionFactory and release all resources + connection pools, etc). It is the responsibility of the application + to ensure that there are no open Sessions before calling + close(). + + + + + Evict all entries from the process-level cache. This method occurs outside + of any transaction; it performs an immediate "hard" remove, so does not respect + any transaction isolation semantics of the usage strategy. Use with care. + + + + + + Evict an entry from the process-level cache. This method occurs outside + of any transaction; it performs an immediate "hard" remove, so does not respect + any transaction isolation semantics of the usage strategy. Use with care. + + + + + + + Evict all entries from the second-level cache. This method occurs outside + of any transaction; it performs an immediate "hard" remove, so does not respect + any transaction isolation semantics of the usage strategy. Use with care. + + + + + Evict an entry from the second-level cache. This method occurs outside + of any transaction; it performs an immediate "hard" remove, so does not respect + any transaction isolation semantics of the usage strategy. Use with care. + + + + + Evict all entries from the process-level cache. This method occurs outside + of any transaction; it performs an immediate "hard" remove, so does not respect + any transaction isolation semantics of the usage strategy. Use with care. + + + + + + Evict an entry from the process-level cache. This method occurs outside + of any transaction; it performs an immediate "hard" remove, so does not respect + any transaction isolation semantics of the usage strategy. Use with care. + + + + + + + Evict any query result sets cached in the default query cache region. + + + + + Evict any query result sets cached in the named query cache region. + + + + + Get a new stateless session. + + + Get a new stateless session for the given ADO.NET connection. + + + + Obtain the definition of a filter by name. + + The name of the filter for which to obtain the definition. + The filter definition. + + + + Obtains the current session. + + + + The definition of what exactly "current" means is controlled by the + implementation configured for use. + + + The current session. + Indicates an issue locating a suitable current session. + + + Get the statistics for this session factory + + + Was this already closed? + + + + Obtain a set of the names of all filters defined on this SessionFactory. + + The set of filter names. + + + + Get the persister for the named entity + + The name of the entity that is persisted. + The for the entity. + If no can be found. + + + + Get the persister object for a collection role + + + + + + + Get the return types of a query + + + + + + Get the return aliases of a query + + + + Get the names of all persistent classes that implement/extend the given interface/class + + The entity-name, the class name or full name, the imported class name. + All implementors class names. + + + + Get a class name, using query language imports + + + + + + + Get a particular named query cache, or the default cache + + the name of the cache region, or null for the default + query cache + the existing cache, or a newly created cache if none by that + region name + + + + Gets the hql query identified by the name. + + The name of that identifies the query. + + A hql query or if the named + query does not exist. + + + + + Get the identifier generator for the hierarchy + + + + Get a named second-level cache region + + + + Open a session conforming to the given parameters. Used mainly + for current session processing. + + The external ado.net connection to use, if one (i.e., optional). + + Should the session be auto-flushed + prior to transaction completion? + + + Should the session be auto-closed after + transaction completion? + + The release mode for managed jdbc connections. + An appropriate session. + + + + Retrieves a set of all the collection roles in which the given entity + is a participant, as either an index or an element. + + The entity name for which to get the collection roles. + + Set of all the collection roles in which the given entityName participates. + + + + + Get the persister for the named entity + + The name of the entity that is persisted. + + The for the entity or is the name was not found. + + + + + Get the entity-name for a given mapped class. + + the mapped class + the enntity name where available or null + + + + Get the SQL . + + + + + Get the used. + + + + The cache of table update timestamps + + + Statistics SPI + + + Retrieves the SQLExceptionConverter in effect for this SessionFactory. + The SQLExceptionConverter for this SessionFactory. + + + + Get the default query cache + + + + + Gets the ICurrentSessionContext instance attached to this session factory. + + + + + Defines the internal contract between the Session and other parts of NHibernate + such as implementors of Type or ClassPersister + + + + + Initialize the session after its construction was complete + + + + + Initialize the collection (if not already initialized) + + + + + + + Load an instance without checking if it was deleted. If it does not exist and isn't nullable, throw an exception. + This method may create a new proxy or return an existing proxy. + + The entityName (or class full name) to load. + The identifier of the object in the database. + Allow null instance + When enabled, the object is eagerly fetched. + + A proxy of the object or an instance of the object if the persistentClass does not have a proxy. + + No object could be found with that id. + + + + Load an instance immediately. Do not return a proxy. + + + + + + + + Execute a List() query + + + + + + + + Execute a List() expression query + + + + + + + + Create a new instance of Query for the given query expression + A hibernate query expression + The query + + + + + Strongly-typed version of + + + + + Strongly-typed version of + + + + + Strongly-typed version of + + + + + Execute an Iterate() query + + + + + + + + Execute an Iterate() query + + + + + + + + Strongly-typed version of + + + + + Strongly-typed version of + + + + + Execute a filter + + + + + Execute a filter (strongly-typed version). + + + + + Collection from a filter + + + + + Strongly-typed version of + + + + Get the for any instance + optional entity name + the entity instance + + + + Notify the session that an NHibernate transaction has begun. + + + + + Notify the session that the transaction is about to complete + + + + + Notify the session that the transaction completed, so we no longer own the old locks. + (Also we should release cache softlocks). May be called multiple times during the transaction + completion process. + + + + + Return the identifier of the persistent object, or null if transient + + + + + Instantiate the entity class, initializing with the given identifier + + + + + Execute an SQL Query + + + + + Strongly-typed version of + + + + Execute an SQL Query + + + + Retrieve the currently set value for a filter parameter. + + The filter parameter name in the format + {FILTER_NAME.PARAMETER_NAME}. + The filter parameter value. + + + + Retrieve the type for a given filter parameter. + + The filter parameter name in the format + {FILTER_NAME.PARAMETER_NAME}. + The filter parameter type. + + + + Get the entity instance associated with the given Key, + calling the Interceptor if necessary + + + + The best guess entity name for an entity not in an association + + + The guessed entity name for an entity not in an association + + + Execute a native SQL update or delete query + + + Execute a HQL update or delete query + + + Execute a HQL update or delete query + + + + System time before the start of the transaction + + + + + + Get the creating SessionFactoryImplementor + + + + + + Get the prepared statement Batcher for this session + + + + + Return the currently enabled filters. The filter map is keyed by filter + name, with values corresponding to the + instance. + + The currently enabled filters. + + + Retrieves the configured event listeners from this event source. + + + Get the persistence context for this session + + + + Is the ISession still open? + + + + + Is the ISession currently connected? + + + + Determine whether the session is closed. Provided separately from + {@link #isOpen()} as this method does not attempt any JTA synch + registration, where as {@link #isOpen()} does; which makes this one + nicer to use for most internal purposes. + + True if the session is closed; false otherwise. + + + + + Does this Session have an active Hibernate transaction + or is there a JTA transaction in progress? + + + + Retrieve the entity mode in effect for this session. + + + + Get the columns of the associated table which are to + be used in the join + + + + + Get the aliased columns of the owning entity which are to + be used in the join + + + + + Get the columns of the owning entity which are to + be used in the join + + + + + Implements the algorithm for validating property values + for illegal null values + + + + + Check nullability of the class persister properties + + entity properties + class persister + wether it is intended to be updated or saved + + + + Check sub elements-nullability. Returns property path that break + nullability or null if none + + type to check + value to check + property path + + + + Check component nullability. Returns property path that break + nullability or null if none + + component properties + component not-nullable type + property path + + + + Return a well formed property path. + Basicaly, it will return parent.child + + parent in path + child in path + parent-child path + + + + Container for data that is used during the NHibernate query/load process. + + + + + Ensure the Types and Values are the same length. + + + If the Lengths of and + are not equal. + + + + + Gets or sets an array of objects that is stored at the index + of the Parameter. + + + + + Gets or sets an array of objects that is stored at the index + of the Parameter. + + + + + Gets or sets the for the Query. + + + + + Gets or sets an that contains the alias name of the + object from hql as the key and the as the value. + + An of lock modes. + + + + Information to determine how to run an IDbCommand and what + records to return from the IDataReader. + + + + + Indicates that the no value has been set on the Property. + + + + + Gets or Sets the Index of the First Row to Select + + The Index of the First Rows to Select + Defaults to 0 unless specifically set. + + + + Gets or Sets the Maximum Number of Rows to Select + + The Maximum Number of Rows to Select + Defaults to NoValue unless specifically set. + + + + Gets or Sets the Timeout of the Query + + The Query Timeout + Defaults to NoValue unless specifically set. + + + + A represents the state of persistent "stuff" which + NHibernate is tracking. This includes persistent entities, collections, + as well as proxies generated. + + + There is meant to be a one-to-one correspondence between a SessionImpl and + a PersistentContext. The SessionImpl uses the PersistentContext to track + the current state of its context. Event-listeners then use the + PersistentContext to drive their processing. + + + + Constructs a PersistentContext, bound to the given session. + The session "owning" this context. + + + Add a collection which has no owner loaded + + + + Get and remove a collection whose owner is not yet loaded, + when its owner is being loaded + + + + Clear the state of the persistence context + + + Set the status of an entry + + + Called after transactions end + + + + Get the current state of the entity as known to the underlying + database, or null if there is no corresponding row + + + + + Retrieve the cached database snapshot for the requested entity key. + + The entity key for which to retrieve the cached snapshot + The cached snapshot + + + This differs from is two important respects: + no snapshot is obtained from the database if not already cached + an entry of NO_ROW here is interpreted as an exception + + + + + + Get the values of the natural id fields as known to the underlying + database, or null if the entity has no natural id or there is no + corresponding row. + + + + Add a canonical mapping from entity key to entity instance + + + + Get the entity instance associated with the given EntityKey + + + + Is there an entity with the given key in the persistence context + + + + Remove an entity from the session cache, also clear + up other state associated with the entity, all except + for the EntityEntry + + + + Get an entity cached by unique key + + + Add an entity to the cache by unique key + + + + Retrieve the EntityEntry representation of the given entity. + + The entity for which to locate the EntityEntry. + The EntityEntry for the given entity. + + + Remove an entity entry from the session cache + + + Is there an EntityEntry for this instance? + + + Get the collection entry for a persistent collection + + + Adds an entity to the internal caches. + + + + Generates an appropriate EntityEntry instance and adds it + to the event source's internal caches. + + + + Is the given collection associated with this persistence context? + + + Is the given proxy associated with this persistence context? + + + + Takes the given object and, if it represents a proxy, reassociates it with this event source. + + The possible proxy to be reassociated. + Whether the passed value represented an actual proxy which got initialized. + + + + If a deleted entity instance is re-saved, and it has a proxy, we need to + reset the identifier of the proxy + + + + + Associate a proxy that was instantiated by another session with this session + + The proxy initializer. + The proxy to reassociate. + + + + Get the entity instance underlying the given proxy, throwing + an exception if the proxy is uninitialized. If the given object + is not a proxy, simply return the argument. + + + + + Possibly unproxy the given reference and reassociate it with the current session. + + The reference to be unproxied if it currently represents a proxy. + The unproxied instance. + + + + Attempts to check whether the given key represents an entity already loaded within the + current session. + + The entity reference against which to perform the uniqueness check. + The entity key. + + + + If the existing proxy is insufficiently "narrow" (derived), instantiate a new proxy + and overwrite the registration of the old one. This breaks == and occurs only for + "class" proxies rather than "interface" proxies. Also init the proxy to point to + the given target implementation if necessary. + + The proxy instance to be narrowed. + The persister for the proxied entity. + The internal cache key for the proxied entity. + (optional) the actual proxied entity instance. + An appropriately narrowed instance. + + + + Return the existing proxy associated with the given EntityKey, or the + third argument (the entity associated with the key) if no proxy exists. Init + the proxy to the target implementation, if necessary. + + + + + Return the existing proxy associated with the given EntityKey, or the + argument (the entity associated with the key) if no proxy exists. + (slower than the form above) + + + + Get the entity that owns this persistent collection + + + Get the entity that owned this persistent collection when it was loaded + The persistent collection + + The owner, if its entity ID is available from the collection's loaded key + and the owner entity is in the persistence context; otherwise, returns null + + + + Get the ID for the entity that owned this persistent collection when it was loaded + The persistent collection + the owner ID if available from the collection's loaded key; otherwise, returns null + + + Get the ID for the entity that owned this persistent collection when it was loaded + The collection entry + the owner ID if available from the collection's loaded key; otherwise, returns null + + + add a collection we just loaded up (still needs initializing) + + + add a detached uninitialized collection + + + + Add a new collection (ie. a newly created one, just instantiated by the + application, with no database state or snapshot) + + The collection to be associated with the persistence context + + + + Add an collection to the cache, with a given collection entry. + The collection for which we are adding an entry. + The entry representing the collection. + The key of the collection's entry. + + + Add a collection to the cache, creating a new collection entry for it + The collection for which we are adding an entry. + The collection persister + + + + add an (initialized) collection that was created by another session and passed + into update() (ie. one with a snapshot and existing state on the database) + + + + add a collection we just pulled out of the cache (does not need initializing) + + + Get the collection instance associated with the CollectionKey + + + + Register a collection for non-lazy loading at the end of the two-phase load + + + + + Force initialization of all non-lazy collections encountered during + the current two-phase load (actually, this is a no-op, unless this + is the "outermost" load) + + + + Get the PersistentCollection object for an array + + + Register a PersistentCollection object for an array. + Associates a holder with an array - MUST be called after loading + array, since the array instance is not created until endLoad(). + + + + + Remove the mapping of collection to holder during eviction of the owning entity + + + + Get the snapshot of the pre-flush collection state + + + + Get the collection entry for a collection passed to filter, + which might be a collection wrapper, an array, or an unwrapped + collection. Return null if there is no entry. + + + + Get an existing proxy by key + + + Add a proxy to the session cache + + + Remove a proxy from the session cache + + + Called before cascading + + + Called after cascading + + + Call this before begining a two-phase load + + + Call this after finishing a two-phase load + + + + Search the persistence context for an owner for the child object, + given a collection role + + + + + Search the persistence context for an index of the child object, given a collection role + + + + + Record the fact that the association belonging to the keyed entity is null. + + + + Is the association property belonging to the keyed entity null? + + + + + + + + + + Get the session to which this persistence context is bound. + + + + + Retrieve this persistence context's managed load context. + + + + + Get the BatchFetchQueue, instantiating one if necessary. + + + + Retrieve the set of EntityKeys representing nullifiable references + + + Get the mapping from key value to entity instance + + + Get the mapping from entity instance to entity entry + + + Get the mapping from collection instance to collection entry + + + Get the mapping from collection key to collection instance + + + How deep are we cascaded? + + + Is a flush cycle currently in process? + Called before and after the flushcycle + + + False if we know for certain that all the entities are read-only + + + + + + + Represents the status of an entity with respect to + this session. These statuses are for internal + book-keeping only and are not intended to represent + any notion that is visible to the application. + + + + + The Entity is snapshotted in the Session with the same state as the database + (called Managed in H3). + + + + + The Entity is in the Session and has been marked for deletion but not + deleted from the database yet. + + + + + The Entity has been deleted from database. + + + + + The Entity is in the process of being loaded. + + + + + The Entity is in the process of being saved. + + + + + The entity is read-only. + + + + + Allows work to be done outside the current transaction, by suspending it, + and performing work in a new transaction + + + + The work to be done + + + Suspend the current transaction and perform work in a new transaction + + + + Functionality relating to Hibernate's two-phase loading process, + that may be reused by persisters that do not use the Loader + framework + + + + + Register the "hydrated" state of an entity instance, after the first step of 2-phase loading. + + Add the "hydrated state" (an array) of an uninitialized entity to the session. We don't try + to resolve any associations yet, because there might be other entities waiting to be + read from the JDBC result set we are currently processing + + + + + Perform the second step of 2-phase load. Fully initialize the entity instance. + After processing a JDBC result set, we "resolve" all the associations + between the entities which were instantiated and had their state + "hydrated" into an array + + + + + Add an uninitialized instance of an entity class, as a placeholder to ensure object + identity. Must be called before postHydrate(). + Create a "temporary" entry for a newly instantiated entity. The entity is uninitialized, + but we need the mapping from id to instance in order to guarantee uniqueness. + + + + An ordered pair of a value and its Hibernate type. + + + + Return an IdentifierValue for the specified unsaved-value. If none is specified, + guess the unsaved value by instantiating a test instance of the class and + reading it's id property, or if that is not possible, using the java default + value for the type + + + + + An enum of the different ways a value might be "included". + + + This is really an expanded true/false notion with Partial being the + expansion. Partial deals with components in the cases where + parts of the referenced component might define inclusion, but the + component overall does not. + + + + + Utility methods for managing versions and timestamps + + + + + Increment the given version number + + The value of the current version. + The of the versioned property. + The current . + Returns the next value for the version. + + + + Create an initial version number + + The of the versioned property. + The current . + A seed value to initialize the versioned property with. + + + + Seed the given instance state snapshot with an initial version number + + An array of objects that contains a snapshot of a persistent object. + The index of the version property in the fields parameter. + The of the versioned property. + Force the version to initialize + The current session, if any. + if the version property needs to be seeded with an initial value. + + + + Set the version number of the given instance state snapshot + + An array of objects that contains a snapshot of a persistent object. + The value the version should be set to in the fields parameter. + The that is responsible for persisting the values of the fields parameter. + + + + Get the version number of the given instance state snapshot + + An array of objects that contains a snapshot of a persistent object. + The that is responsible for persisting the values of the fields parameter. + + The value of the version contained in the fields parameter or null if the + Entity is not versioned. + + + + Do we need to increment the version number, given the dirty properties? + The array of property indexes which were deemed dirty + Were any collections found to be dirty (structurally changed) + An array indicating versionability of each property. + True if a version increment is required; false otherwise. + + + + A strategy for determining if a version value is an version of + a new transient instance or a previously persistent transient instance. + The strategy is determined by the Unsaved-Value attribute in the mapping file. + + + + + + + + Assume the transient instance is newly instantiated if its version is null or + equal to Value + + + + + + Does the given identifier belong to a new instance + + + + + Assume the transient instance is newly instantiated if the version + is null, otherwise assume it is a detached instance. + + + + + Assume the transient instance is newly instantiated if the version + is null, otherwise defer to the identifier unsaved-value. + + + + + Assume the transient instance is newly instantiated if the identifier + is null. + + + + + A convenience base class for listeners whose functionality results in flushing. + + + + + Coordinates the processing necessary to get things ready for executions + as db calls by preparing the session caches and moving the appropriate + entities and collections to their respective execution queues. + + The flush event. + + + + Execute all SQL and second-level cache updates, in a + special order so that foreign-key constraints cannot + be violated: + + Inserts, in the order they were performed + Updates + Deletion of collection elements + Insertion of collection elements + Deletes, in the order they were performed + + + The session being flushed + + + + 1. Recreate the collection key -> collection map + 2. rebuild the collection entries + 3. call Interceptor.postFlush() + + + + + A convenience base class for listeners that respond to requests to perform a + pessimistic lock upgrade on an entity. + + + + + A convenience base class for listeners that respond to requests to reassociate an entity + to a session ( such as through lock() or update() ). + + + + + Associates a given entity (either transient or associated with another session) to the given session. + + The event triggering the re-association + The entity to be associated + The id of the entity. + The entity's persister instance. + An EntityEntry representing the entity within this session. + + + + Performs a pessimistic lock upgrade on a given entity, if needed. + + The entity for which to upgrade the lock. + The entity's EntityEntry instance. + The lock mode being requested for locking. + The session which is the source of the event being processed. + + + + A convenience bas class for listeners responding to save events. + + + + + Prepares the save call using the given requested id. + + The entity to be saved. + The id to which to associate the entity. + The name of the entity being saved. + Generally cascade-specific information. + The session which is the source of this save event. + The id used to save the entity. + + + + Prepares the save call using a newly generated id. + + The entity to be saved + The entity-name for the entity to be saved + Generally cascade-specific information. + The session which is the source of this save event. + + does the event context require + access to the identifier immediately after execution of this method (if + not, post-insert style id generators may be postponed if we are outside + a transaction). + + + The id used to save the entity; may be null depending on the + type of id generator used and the requiresImmediateIdAccess value + + + + + Prepares the save call by checking the session caches for a pre-existing + entity and performing any lifecycle callbacks. + + The entity to be saved. + The id by which to save the entity. + The entity's persister instance. + Is an identity column being used? + Generally cascade-specific information. + The session from which the event originated. + + does the event context require + access to the identifier immediately after execution of this method (if + not, post-insert style id generators may be postponed if we are outside + a transaction). + + + The id used to save the entity; may be null depending on the + type of id generator used and the requiresImmediateIdAccess value + + + + + Performs all the actual work needed to save an entity (well to get the save moved to + the execution queue). + + The entity to be saved + The id to be used for saving the entity (or null, in the case of identity columns) + The entity's persister instance. + Should an identity column be used for id generation? + Generally cascade-specific information. + The session which is the source of the current event. + + Is access to the identifier required immediately + after the completion of the save? persist(), for example, does not require this... + + + The id used to save the entity; may be null depending on the + type of id generator used and the requiresImmediateIdAccess value + + + + + Perform any property value substitution that is necessary + (interceptor callback, version initialization...) + + The entity + The entity identifier + The snapshot entity state + The entity persister + The originating session + + True if the snapshot state changed such that + reinjection of the values into the entity is required. + + + + Handles the calls needed to perform pre-save cascades for the given entity. + The session from which the save event originated. + The entity's persister instance. + The entity to be saved. + Generally cascade-specific data + + + Handles to calls needed to perform post-save cascades. + The session from which the event originated. + The entity's persister instance. + The entity being saved. + Generally cascade-specific data + + + + Determine whether the entity is persistent, detached, or transient + + The entity to check + The name of the entity + The entity's entry in the persistence context + The originating session. + The state. + + + + After the save, will te version number be incremented + if the instance is modified? + + True if the version will be incremented on an entity change after save; false otherwise. + + + + Abstract superclass of algorithms that walk a tree of property values of an entity, and + perform specific functionality for collections, components and associated entities. + + + + Dispatch each property value to ProcessValue(). + + + + + + Visit a property value. Dispatch to the correct handler for the property type. + + + + + + + Visit a component. Dispatch each property to + + + + + + + + Visit a many-to-one or one-to-one associated entity. Default superclass implementation is a no-op. + + + + + + + + Visit a collection. Default superclass implementation is a no-op. + + + + + + + + Walk the tree starting from the given entity. + + + + + + + Defines the default flush event listeners used by hibernate for + flushing session state in response to generated auto-flush events. + + + + Defines the contract for handling of session auto-flush events. + + + + Handle the given auto-flush event. + + The auto-flush event to be handled. + + + + Handle the given auto-flush event. + + The auto-flush event to be handled. + + + + Defines the default delete event listener used by hibernate for deleting entities + from the datastore in response to generated delete events. + + + + Defines the contract for handling of deletion events generated from a session. + + + Handle the given delete event. + The delete event to be handled. + + + Handle the given delete event. + The delete event to be handled. + + + Called when we have recognized an attempt to delete a detached entity. + The event. + + This is perfectly valid in Hibernate usage; JPA, however, forbids this. + Thus, this is a hook for HEM to affect this behavior. + + + + + We encountered a delete request on a transient instance. +

+ This is a deviation from historical Hibernate (pre-3.2) behavior to + align with the JPA spec, which states that transient entities can be + passed to remove operation in which case cascades still need to be + performed. +

+ The session which is the source of the event + The entity being delete processed + Is cascading of deletes enabled + The entity persister + + A cache of already visited transient entities (to avoid infinite recursion). + +
+ + + Perform the entity deletion. Well, as with most operations, does not + really perform it; just schedules an action/execution with the + for execution during flush. + + The originating session + The entity to delete + The entity's entry in the + Is delete cascading enabled? + The entity persister. + A cache of already deleted entities. + + + + Defines the default dirty-check event listener used by hibernate for + checking the session for dirtiness in response to generated dirty-check events. + + + + Defines the contract for handling of session dirty-check events. + + + Handle the given dirty-check event. + The dirty-check event to be handled. + + + + Defines the default evict event listener used by hibernate for evicting entities + in response to generated flush events. In particular, this implementation will + remove any hard references to the entity that are held by the infrastructure + (references held by application or other persistent instances are okay) + + + + Defines the contract for handling of evict events generated from a session. + + + Handle the given evict event. + The evict event to be handled. + + + + An event that occurs for each entity instance at flush time + + + + + Flushes a single entity's state to the database, by scheduling an update action, if necessary + + + + + make sure user didn't mangle the id + + The obj. + The persister. + The id. + The entity mode. + + + + Performs all necessary checking to determine if an entity needs an SQL update + to synchronize its state to the database. Modifies the event by side-effect! + Note: this method is quite slow, avoid calling if possible! + + + + Perform a dirty check, and attach the results to the event + + + + Defines the default flush event listeners used by hibernate for + flushing session state in response to generated flush events. + + + + Defines the contract for handling of session flush events. + + + Handle the given flush event. + The flush event to be handled. + + + + Defines the contract for handling of collection initialization events + generated by a session. + + + + called by a collection that wants to initialize itself + + + Try to initialize a collection from the cache + + + + Defines the default load event listeners used by NHibernate for loading entities + in response to generated load events. + + + + + Defines the contract for handling of load events generated from a session. + + + + + Handle the given load event. + + The load event to be handled. + + The result (i.e., the loaded entity). + + + Perfoms the load of an entity. + The loaded entity. + + + + Based on configured options, will either return a pre-existing proxy, + generate a new proxy, or perform an actual load. + + The result of the proxy/load operation. + + + + Given that there is a pre-existing proxy. + Initialize it if necessary; narrow if necessary. + + + + + Given that there is no pre-existing proxy. + Check if the entity is already loaded. If it is, return the entity, + otherwise create and return a proxy. + + + + + If the class to be loaded has been configured with a cache, then lock + given id in that cache and then perform the load. + + The loaded entity + + + + Coordinates the efforts to load a given entity. First, an attempt is + made to load the entity from the session-level cache. If not found there, + an attempt is made to locate it in second-level cache. Lastly, an + attempt is made to load it directly from the datasource. + + The load event + The persister for the entity being requested for load + The EntityKey representing the entity to be loaded. + The load options. + The loaded entity, or null. + + + + Performs the process of loading an entity from the configured underlying datasource. + + The load event + The persister for the entity being requested for load + The EntityKey representing the entity to be loaded. + The load options. + The object loaded from the datasource, or null if not found. + + + + Attempts to locate the entity in the session-level cache. + + The load event + The EntityKey representing the entity to be loaded. + The load options. + The entity from the session-level cache, or null. + + If allowed to return nulls, then if the entity happens to be found in + the session cache, we check the entity type for proper handling + of entity hierarchies. + If checkDeleted was set to true, then if the entity is found in the + session-level cache, it's current status within the session cache + is checked to see if it has previously been scheduled for deletion. + + + + Attempts to load the entity from the second-level cache. + The load event + The persister for the entity being requested for load + The load options. + The entity from the second-level cache, or null. + + + + Defines the default lock event listeners used by hibernate to lock entities + in response to generated lock events. + + + + + Defines the contract for handling of lock events generated from a session. + + + + Handle the given lock event. + The lock event to be handled. + + + Handle the given lock event. + The lock event to be handled. + + + + Defines the default event listener for handling of merge events generated from a session. + + + + + Defines the contract for handling of merge events generated from a session. + + + + Handle the given merge event. + The merge event to be handled. + + + Handle the given merge event. + The merge event to be handled. + + + + + Perform any cascades needed as part of this copy event. + + The merge event being processed. + The persister of the entity being copied. + The entity being copied. + A cache of already copied instance. + + + + Determine which merged entities in the copyCache are transient. + + + + + Should this method be on the EventCache class? + + + + Retry merging transient entities + + + + + + + Cascade behavior is redefined by this subclass, disable superclass behavior + + + Cascade behavior is redefined by this subclass, disable superclass behavior + + + + Defines the default create event listener used by hibernate for creating + transient entities in response to generated create events. + + + + + Defines the contract for handling of create events generated from a session. + + + + Handle the given create event. + The create event to be handled. + + + Handle the given create event. + The create event to be handled. + + + + Handle the given create event. + The save event to be handled. + + + + When persist is used as the cascade action, persistOnFlush should be used + + + Call interface if necessary + + + + Occurs after an an entity instance is fully loaded. + + + + + + + + + + + Called before injecting property values into a newly + loaded entity instance. + + + + + Called before injecting property values into a newly loaded entity instance. + + + + + + + + + + + Defines the default refresh event listener used by hibernate for refreshing entities + in response to generated refresh events. + + + + + Defines the contract for handling of refresh events generated from a session. + + + + Handle the given refresh event. + The refresh event to be handled. + + + + + + + + + + + Defines the default replicate event listener used by Hibernate to replicate + entities in response to generated replicate events. + + + + + Defines the contract for handling of replicate events generated from a session. + + + + Handle the given replicate event. + The replicate event to be handled. + + + An event handler for save() events + + + + Defines the default listener used by Hibernate for handling save-update events. + + + + + Defines the contract for handling of update events generated from a session. + + + + Handle the given update event. + The update event to be handled. + + + + The given save-update event named a transient entity. + Here, we will perform the save processing. + + The save event to be handled. + The entity's identifier after saving. + + + + Save the transient instance, assigning the right identifier + + The initiating event. + The entity's identifier value after saving. + + + + The given save-update event named a detached entity. + Here, we will perform the update processing. + + The update event to be handled. + + + Determine the id to use for updating. + The entity. + The entity persister + The requested identifier + The entity mode. + The id. + + + + Handles the calls needed to perform cascades as part of an update request + for the given entity. + + The event currently being processed. + The defined persister for the entity being updated. + The entity being updated. + + + An event handler for update() events + + + + If the user specified an id, assign it to the instance and use that, + otherwise use the id already assigned to the instance + + + + + A Visitor that determines if a dirty collection was found. + + + + + Reason for dirty collection + + + + If it is a new application-instantiated collection, return true (does not occur anymore!) + + + + + If it is a component, recurse. + + + + + If it is a wrapped collection, ask the collection entry. + + + + + + + + Gets a indicating if a dirty collection was found. + + if a dirty collection was found. + + + + Associates the specified entity with the specified copy in this EventCache; + + + + indicates if the operation is performed on the entity + + + + Returns copy-entity mappings + + + + + + Returns true if the listener is performing the operation on the specified entity. + + Must be non-null and this EventCache must contain a mapping for this entity + + + + + Set flag to indicate if the listener is performing the operation on the specified entity. + + + + + + + Returns the number of entity-copy mappings in this EventCache + + + + + Evict any collections referenced by the object from the session cache. + This will NOT pick up any collections that were dereferenced, so they + will be deleted (suboptimal but not exactly incorrect). + + + + + Process collections reachable from an entity. + This visitor assumes that wrap was already performed for the entity. + + + + + When a transient entity is passed to lock(), we must inspect all its collections and + 1. associate any uninitialized PersistentCollections with this session + 2. associate any initialized PersistentCollections with this session, using the existing snapshot + 3. throw an exception for each "new" collection + + + + + Abstract superclass of visitors that reattach collections + + + + + Reassociates uninitialized proxies with the session + + + + + Visit a many-to-one or one-to-one associated entity. Default superclass implementation is a no-op. + + + + + + + + Has the owner of the collection changed since the collection was snapshotted and detached? + + + + + Reattach a detached (disassociated) initialized or uninitialized + collection wrapper, using a snapshot carried with the collection wrapper + + + + + Schedules a collection for deletion. + + The persister representing the collection to be removed. + The collection key (differs from owner-id in the case of property-refs). + The session from which the request originated. + + + + This version is slightly different in that here we need to assume that + the owner is not yet associated with the session, and thus we cannot + rely on the owner's EntityEntry snapshot... + + The persister for the collection role being processed. + + + + + When an entity is passed to replicate(), and there is an existing row, we must + inspect all its collections and + 1. associate any uninitialized PersistentCollections with this session + 2. associate any initialized PersistentCollections with this session, using the existing snapshot + 3. execute a collection removal (SQL DELETE) for each null collection property or "new" collection + + + + + When an entity is passed to update(), we must inspect all its collections and + 1. associate any uninitialized PersistentCollections with this session + 2. associate any initialized PersistentCollections with this session, using the existing snapshot + 3. execute a collection removal (SQL DELETE) for each null collection property or "new" collection + + + + + Wrap collections in a Hibernate collection wrapper. + + + + Defines a base class for events involving collections. + + + + Defines a base class for Session generated events. + + + + + Returns the session event source for this event. + This is the underlying session from which this event was generated. + + + + + Constructs an event from the given event session. + + The session event source. + + + + Returns the session event source for this event. + This is the underlying session from which this event was generated. + + + + Constructs an AbstractCollectionEvent object. + The collection persister. + The collection + The Session source + The owner that is affected by this event; can be null if unavailable + + The ID for the owner that is affected by this event; can be null if unavailable + that is affected by this event; can be null if unavailable + + + + Get the entity name for the collection owner entity that is affected by this event. + + The entity name; if the owner is not in the PersistenceContext, the + returned value may be a superclass name, instead of the actual class name + + + + The collection owner entity that is affected by this event. + + Returns null if the entity is not in the persistence context + (e.g., because the collection from a detached entity was moved to a new owner) + + + + Get the ID for the collection owner entity that is affected by this event. + + Returns null if the ID cannot be obtained + from the collection's loaded key (e.g., a property-ref is used for the + collection and does not include the entity's ID) + + + + + Represents an operation we performed against the database. + + + + + Represents an operation we performed against the database. + + + + The entity involved in the database operation. + + + The id to be used in the database operation. + + + + The persister for the . + + + + Constructs an event containing the pertinent information. + The session from which the event originated. + The entity to be invloved in the database operation. + The entity id to be invloved in the database operation. + The entity's persister. + + + The entity involved in the database operation. + + + The id to be used in the database operation. + + + + The persister for the . + + + + + Represents an operation we are about to perform against the database. + + + + The entity involved in the database operation. + + + The id to be used in the database operation. + + + + The persister for the . + + + + Constructs an event containing the pertinent information. + The session from which the event originated. + The entity to be invloved in the database operation. + The entity id to be invloved in the database operation. + The entity's persister. + + + The entity involved in the database operation. + + + The id to be used in the database operation. + + + + The persister for the . + + + + Defines an event class for the auto-flushing of a session. + + + Defines an event class for the flushing of a session. + + + Defines an event class for the deletion of an entity. + + + Constructs a new DeleteEvent instance. + The entity to be deleted. + The session from which the delete event was generated. + + + + + Returns the encapsulated entity to be deleed. + + + + Defines an event class for the dirty-checking of a session. + + + + A convience holder for all defined session event listeners. + + + + + Call on any listeners that implement + . + + + + + Defines an event class for the evicting of an entity. + + + + Contract for listeners which require notification of SessionFactory closing, + presumably to destroy internal state. + + + + + Notification of shutdown. + + + + + The main runtime interface between a .NET application and NHibernate. This is the central + API class abstracting the notion of a persistence service. + + + + The lifecycle of a ISession is bounded by the beginning and end of a logical + transaction. (Long transactions might span several database transactions.) + + + The main function of the ISession is to offer create, find, update, and delete operations + for instances of mapped entity classes. Instances may exist in one of two states: + + transient: not associated with any ISession + persistent: associated with a ISession + + + + Transient instances may be made persistent by calling Save(), Insert(), + or Update(). Persistent instances may be made transient by calling Delete(). + Any instance returned by a List(), Enumerable(), Load(), or Create() + method is persistent. + + + Save() results in an SQL INSERT, Delete() + in an SQL DELETE and Update() in an SQL UPDATE. Changes to + persistent instances are detected at flush time and also result in an SQL + UPDATE. + + + It is not intended that implementors be threadsafe. Instead each thread/transaction should obtain + its own instance from an ISessionFactory. + + + A ISession instance is serializable if its persistent classes are serializable + + + A typical transaction should use the following idiom: + + using (ISession session = factory.OpenSession()) + using (ITransaction tx = session.BeginTransaction()) + { + try + { + // do some work + ... + tx.Commit(); + } + catch (Exception e) + { + if (tx != null) tx.Rollback(); + throw; + } + } + + + + If the ISession throws an exception, the transaction must be rolled back and the session + discarded. The internal state of the ISession might not be consistent with the database + after the exception occurs. + + + + + + + Force the ISession to flush. + + + Must be called at the end of a unit of work, before commiting the transaction and closing + the session (Transaction.Commit() calls this method). Flushing is the process + of synchronising the underlying persistent store with persistable state held in memory. + + + + + Disconnect the ISession from the current ADO.NET connection. + + + If the connection was obtained by Hibernate, close it or return it to the connection + pool. Otherwise return it to the application. This is used by applications which require + long transactions. + + The connection provided by the application or + + + + Obtain a new ADO.NET connection. + + + This is used by applications which require long transactions + + + + + Reconnect to the given ADO.NET connection. + + This is used by applications which require long transactions + An ADO.NET connection + + + + End the ISession by disconnecting from the ADO.NET connection and cleaning up. + + + It is not strictly necessary to Close() the ISession but you must + at least Disconnect() it. + + The connection provided by the application or + + + + Cancel execution of the current query. + + + May be called from one thread to stop execution of a query in another thread. + Use with care! + + + + + Does this ISession contain any changes which must be + synchronized with the database? Would any SQL be executed if + we flushed this session? + + + + + Is the specified entity (or proxy) read-only? + + + Facade for . + + An entity (or ) + + true if the entity (or proxy) is read-only, otherwise false. + + + + + + + Change the read-only status of an entity (or proxy). + + + + Read-only entities can be modified, but changes are not persisted. They are not dirty-checked + and snapshots of persistent state are not maintained. + + + Immutable entities cannot be made read-only. + + + To set the default read-only setting for entities and proxies that are loaded + into the session, see . + + + This method a facade for . + + + An entity (or ). + If true, the entity or proxy is made read-only; if false, it is made modifiable. + + + + + + Return the identifier of an entity instance cached by the ISession + + + Throws an exception if the instance is transient or associated with a different + ISession + + a persistent instance + the identifier + + + + Is this instance associated with this Session? + + an instance of a persistent class + true if the given instance is associated with this Session + + + + Remove this instance from the session cache. + + + Changes to the instance will not be synchronized with the database. + This operation cascades to associated instances if the association is mapped + with cascade="all" or cascade="all-delete-orphan". + + a persistent instance + + + + Return the persistent instance of the given entity class with the given identifier, + obtaining the specified lock mode. + + A persistent class + A valid identifier of an existing persistent instance of the class + The lock level + the persistent instance + + + + Return the persistent instance of the given entity class with the given identifier, + obtaining the specified lock mode, assuming the instance exists. + + The entity-name of a persistent class + a valid identifier of an existing persistent instance of the class + the lock level + the persistent instance or proxy + + + + Return the persistent instance of the given entity class with the given identifier, + assuming that the instance exists. + + + You should not use this method to determine if an instance exists (use a query or + instead). Use this only to retrieve an instance + that you assume exists, where non-existence would be an actual error. + + A persistent class + A valid identifier of an existing persistent instance of the class + The persistent instance or proxy + + + + Return the persistent instance of the given entity class with the given identifier, + obtaining the specified lock mode. + + A persistent class + A valid identifier of an existing persistent instance of the class + The lock level + the persistent instance + + + + Return the persistent instance of the given entity class with the given identifier, + assuming that the instance exists. + + + You should not use this method to determine if an instance exists (use a query or + instead). Use this only to retrieve an instance that you + assume exists, where non-existence would be an actual error. + + A persistent class + A valid identifier of an existing persistent instance of the class + The persistent instance or proxy + + + + Return the persistent instance of the given with the given identifier, + assuming that the instance exists. + + The entity-name of a persistent class + a valid identifier of an existing persistent instance of the class + The persistent instance or proxy + + You should not use this method to determine if an instance exists (use + instead). Use this only to retrieve an instance that you assume exists, where non-existence + would be an actual error. + + + + + Read the persistent state associated with the given identifier into the given transient + instance. + + An "empty" instance of the persistent class + A valid identifier of an existing persistent instance of the class + + + + Persist all reachable transient objects, reusing the current identifier + values. Note that this will not trigger the Interceptor of the Session. + + a detached instance of a persistent class + + + + + Persist the state of the given detached instance, reusing the current + identifier value. This operation cascades to associated instances if + the association is mapped with cascade="replicate". + + + a detached instance of a persistent class + + + + + Persist the given transient instance, first assigning a generated identifier. + + + Save will use the current value of the identifier property if the Assigned + generator is used. + + A transient instance of a persistent class + The generated identifier + + + + Persist the given transient instance, using the given identifier. + + A transient instance of a persistent class + An unused valid identifier + + + + Persist the given transient instance, first assigning a generated identifier. (Or + using the current value of the identifier property if the assigned + generator is used.) + + The Entity name. + a transient instance of a persistent class + the generated identifier + + This operation cascades to associated instances if the + association is mapped with cascade="save-update". + + + + + Persist the given transient instance, using the given identifier. + + The Entity name. + a transient instance of a persistent class + An unused valid identifier + + This operation cascades to associated instances if the + association is mapped with cascade="save-update". + + + + + Either Save() or Update() the given instance, depending upon the value of + its identifier property. + + + By default the instance is always saved. This behaviour may be adjusted by specifying + an unsaved-value attribute of the identifier property mapping + + A transient instance containing new or updated state + + + + Either or + the given instance, depending upon resolution of the unsaved-value checks + (see the manual for discussion of unsaved-value checking). + + The name of the entity + a transient or detached instance containing new or updated state + + + + This operation cascades to associated instances if the association is mapped + with cascade="save-update". + + + + + Either Save() or Update() the given instance, depending upon the value of + its identifier property. + + + By default the instance is always saved. This behaviour may be adjusted by specifying + an unsaved-value attribute of the identifier property mapping + + The name of the entity + A transient instance containing new or updated state + Identifier of persistent instance + + + + Update the persistent instance with the identifier of the given transient instance. + + + If there is a persistent instance with the same identifier, an exception is thrown. If + the given transient instance has a identifier, an exception will be thrown. + + A transient instance containing updated state + + + + Update the persistent state associated with the given identifier. + + + An exception is thrown if there is a persistent instance with the same identifier + in the current session. + + A transient instance containing updated state + Identifier of persistent instance + + + + Update the persistent instance with the identifier of the given detached + instance. + + The Entity name. + a detached instance containing updated state + + If there is a persistent instance with the same identifier, + an exception is thrown. This operation cascades to associated instances + if the association is mapped with cascade="save-update". + + + + + Update the persistent instance associated with the given identifier. + + The Entity name. + a detached instance containing updated state + Identifier of persistent instance + + If there is a persistent instance with the same identifier, + an exception is thrown. This operation cascades to associated instances + if the association is mapped with cascade="save-update". + + + + + Copy the state of the given object onto the persistent object with the same + identifier. If there is no persistent instance currently associated with + the session, it will be loaded. Return the persistent instance. If the + given instance is unsaved, save a copy of and return it as a newly persistent + instance. The given instance does not become associated with the session. + This operation cascades to associated instances if the association is mapped + with cascade="merge".
+ The semantics of this method are defined by JSR-220. +
+ a detached instance with state to be copied + an updated persistent instance +
+ + + Copy the state of the given object onto the persistent object with the same + identifier. If there is no persistent instance currently associated with + the session, it will be loaded. Return the persistent instance. If the + given instance is unsaved, save a copy of and return it as a newly persistent + instance. The given instance does not become associated with the session. + This operation cascades to associated instances if the association is mapped + with cascade="merge".
+ The semantics of this method are defined by JSR-220. + Name of the entity. + a detached instance with state to be copied + an updated persistent instance +
+ +
+ + + Copy the state of the given object onto the persistent object with the same + identifier. If there is no persistent instance currently associated with + the session, it will be loaded. Return the persistent instance. If the + given instance is unsaved, save a copy of and return it as a newly persistent + instance. The given instance does not become associated with the session. + This operation cascades to associated instances if the association is mapped + with cascade="merge".
+ The semantics of this method are defined by JSR-220. +
+ a detached instance with state to be copied + an updated persistent instance +
+ + + Copy the state of the given object onto the persistent object with the same + identifier. If there is no persistent instance currently associated with + the session, it will be loaded. Return the persistent instance. If the + given instance is unsaved, save a copy of and return it as a newly persistent + instance. The given instance does not become associated with the session. + This operation cascades to associated instances if the association is mapped + with cascade="merge".
+ The semantics of this method are defined by JSR-220. + Name of the entity. + a detached instance with state to be copied + an updated persistent instance +
+ +
+ + + Make a transient instance persistent. This operation cascades to associated + instances if the association is mapped with cascade="persist".
+ The semantics of this method are defined by JSR-220. +
+ a transient instance to be made persistent +
+ + + Make a transient instance persistent. This operation cascades to associated + instances if the association is mapped with cascade="persist".
+ The semantics of this method are defined by JSR-220. +
+ Name of the entity. + a transient instance to be made persistent +
+ + + Remove a persistent instance from the datastore. + + + The argument may be an instance associated with the receiving ISession or a + transient instance with an identifier associated with existing persistent state. + + The instance to be removed + + + + Remove a persistent instance from the datastore. The object argument may be + an instance associated with the receiving or a transient + instance with an identifier associated with existing persistent state. + This operation cascades to associated instances if the association is mapped + with cascade="delete". + + The entity name for the instance to be removed. + the instance to be removed + + + + Delete all objects returned by the query. + + The query string + Returns the number of objects deleted. + + + + Delete all objects returned by the query. + + The query string + A value to be written to a "?" placeholer in the query + The hibernate type of value. + The number of instances deleted + + + + Delete all objects returned by the query. + + The query string + A list of values to be written to "?" placeholders in the query + A list of Hibernate types of the values + The number of instances deleted + + + + Obtain the specified lock level upon the given object. + + A persistent instance + The lock level + + + + Obtain the specified lock level upon the given object. + + The Entity name. + a persistent or transient instance + the lock level + + This may be used to perform a version check (), to upgrade to a pessimistic + lock (), or to simply reassociate a transient instance + with a session (). This operation cascades to associated + instances if the association is mapped with cascade="lock". + + + + + Re-read the state of the given instance from the underlying database. + + + + It is inadvisable to use this to implement long-running sessions that span many + business tasks. This method is, however, useful in certain special circumstances. + + + For example, + + Where a database trigger alters the object state upon insert or update + After executing direct SQL (eg. a mass update) in the same session + After inserting a Blob or Clob + + + + A persistent instance + + + + Re-read the state of the given instance from the underlying database, with + the given LockMode. + + + It is inadvisable to use this to implement long-running sessions that span many + business tasks. This method is, however, useful in certain special circumstances. + + a persistent or transient instance + the lock mode to use + + + + Determine the current lock mode of the given object + + A persistent instance + The current lock mode + + + + Begin a unit of work and return the associated ITransaction object. + + + If a new underlying transaction is required, begin the transaction. Otherwise + continue the new work in the context of the existing underlying transaction. + The class of the returned object is determined by + the property transaction_factory + + A transaction instance + + + + Begin a transaction with the specified isolationLevel + + Isolation level for the new transaction + A transaction instance having the specified isolation level + + + + Creates a new Criteria for the entity class. + + The entity class + An ICriteria object + + + + Creates a new Criteria for the entity class with a specific alias + + The entity class + The alias of the entity + An ICriteria object + + + + Creates a new Criteria for the entity class. + + The class to Query + An ICriteria object + + + + Creates a new Criteria for the entity class with a specific alias + + The class to Query + The alias of the entity + An ICriteria object + + + + Create a new Criteria instance, for the given entity name. + + The name of the entity to Query + An ICriteria object + + + + Create a new Criteria instance, for the given entity name, + with the given alias. + + The name of the entity to Query + The alias of the entity + An ICriteria object + + + + Creates a new IQueryOver<T> for the entity class. + + The entity class + An IQueryOver<T> object + + + + Creates a new IQueryOver<T> for the entity class. + + The entity class + The alias of the entity + An IQueryOver<T> object + + + + Creates a new IQueryOver{T}; for the entity class. + + The entity class + The name of the entity to Query + An IQueryOver{T} object + + + + Creates a new IQueryOver{T} for the entity class. + + The entity class + The name of the entity to Query + The alias of the entity + An IQueryOver{T} object + + + + Create a new instance of Query for the given query string + + A hibernate query string + The query + + + + Create a new instance of Query for the given collection and filter string + + A persistent collection + A hibernate query + A query + + + + Obtain an instance of for a named query string defined in the + mapping file. + + The name of a query defined externally. + An from a named query string. + + The query can be either in HQL or SQL format. + + + + + Create a new instance of for the given SQL query string. + + a query expressed in SQL + An from the SQL string + + + + Completely clear the session. Evict all loaded instances and cancel all pending + saves, updates and deletions. Do not close open enumerables or instances of + ScrollableResults. + + + + + Return the persistent instance of the given entity class with the given identifier, or null + if there is no such persistent instance. (If the instance, or a proxy for the instance, is + already associated with the session, return that instance or proxy.) + + a persistent class + an identifier + a persistent instance or null + + + + Return the persistent instance of the given entity class with the given identifier, or null + if there is no such persistent instance. Obtain the specified lock mode if the instance + exists. + + a persistent class + an identifier + the lock mode + a persistent instance or null + + + + Return the persistent instance of the given named entity with the given identifier, + or null if there is no such persistent instance. (If the instance, or a proxy for the + instance, is already associated with the session, return that instance or proxy.) + + the entity name + an identifier + a persistent instance or null + + + + Strongly-typed version of + + + + + Strongly-typed version of + + + + + Return the entity name for a persistent entity + + a persistent entity + the entity name + + + + Enable the named filter for this current session. + + The name of the filter to be enabled. + The Filter instance representing the enabled filter. + + + + Retrieve a currently enabled filter by name. + + The name of the filter to be retrieved. + The Filter instance representing the enabled filter. + + + + Disable the named filter for the current session. + + The name of the filter to be disabled. + + + + Create a multi query, a query that can send several + queries to the server, and return all their results in a single + call. + + + An that can return + a list of all the results of all the queries. + Note that each query result is itself usually a list. + + + + + Sets the batch size of the session + + + + + + + Gets the session implementation. + + + This method is provided in order to get the NHibernate implementation of the session from wrapper implementions. + Implementors of the interface should return the NHibernate implementation of this method. + + + An NHibernate implementation of the interface + + + + + An that can return a list of all the results + of all the criterias. + + + + + + Starts a new Session with the given entity mode in effect. This secondary + Session inherits the connection, transaction, and other context + information from the primary Session. It doesn't need to be flushed + or closed by the developer. + + The entity mode to use for the new session. + The new session + + + The entity mode in effect for this session. + + + + Determines at which points Hibernate automatically flushes the session. + + + For a readonly session, it is reasonable to set the flush mode to FlushMode.Never + at the start of the session (in order to achieve some extra performance). + + + + The current cache mode. + + Cache mode determines the manner in which this session can interact with + the second level cache. + + + + + Get the that created this instance. + + + + + Gets the ADO.NET connection. + + + Applications are responsible for calling commit/rollback upon the connection before + closing the ISession. + + + + + Is the ISession still open? + + + + + Is the ISession currently connected? + + + + + The read-only status for entities (and proxies) loaded into this Session. + + + + When a proxy is initialized, the loaded entity will have the same read-only setting + as the uninitialized proxy, regardless of the session's current setting. + + + To change the read-only setting for a particular entity or proxy that is already in + this session, see . + + + To override this session's read-only setting for entities and proxies loaded by a query, + see . + + + This method is a facade for . + + + + + + + + Get the current Unit of Work and return the associated ITransaction object. + + + + Get the statistics for this session. + + + + Instantiate an entity instance, using either an interceptor, + or the given persister + + + + Force an immediate flush + + + Cascade merge an entity instance + + + Cascade persist an entity instance + + + Cascade persist an entity instance during the flush process + + + Cascade refresh an entity instance + + + Cascade delete an entity instance + + + Get the ActionQueue for this session + + + + An event listener that requires access to mappings to + initialize state at initialization time. + + + + + An event that occurs when a collection wants to be initialized + + + + Called after recreating a collection + + + Called after removing a collection + + + Called after updating a collection + + + Called after deleting an item from the datastore + + + + + + + + + Called after inserting an item in the datastore + + + + + + + + + + Called after updating the datastore + + + + + + + + + + Called before recreating a collection + + + Called before removing a collection + + + Called before updating a collection + + + + Called before deleting an item from the datastore + + + + Return true if the operation should be vetoed + + + + + Called before inserting an item in the datastore + + + + Return true if the operation should be vetoed + + + + + Called before updating the datastore + + + + Return true if the operation should be vetoed + + + + + Values for listener type property. + + + + Not allowed in Xml. It represents the default value when an explicit type is assigned. + + + Xml value: auto-flush + + + Xml value: merge + + + Xml value: create + + + Xml value: create-onflush + + + Xml value: delete + + + Xml value: dirty-check + + + Xml value: evict + + + Xml value: flush + + + Xml value: flush-entity + + + Xml value: load + + + Xml value: load-collection + + + Xml value: lock + + + Xml value: refresh + + + Xml value: replicate + + + Xml value: save-update + + + Xml value: save + + + Xml value: pre-update + + + Xml value: update + + + Xml value: pre-load + + + Xml value: pre-delete + + + Xml value: pre-insert + + + Xml value: pre-collection-recreate + + + Xml value: pre-collection-remove + + + Xml value: pre-collection-update + + + Xml value: post-load + + + Xml value: post-insert + + + Xml value: post-update + + + Xml value: post-delete + + + Xml value: post-commit-update + + + Xml value: post-commit-insert + + + Xml value: post-commit-delete + + + Xml value: post-collection-recreate + + + Xml value: post-collection-remove + + + Xml value: post-collection-update + + + Defines an event class for the loading of an entity. + + + + Defines an event class for the locking of an entity. + + + + + An event class for merge() and saveOrUpdateCopy() + + + + An event class for persist() + + + An event that occurs after a collection is recreated + + + An event that occurs after a collection is removed + + + An event that occurs after a collection is updated + + + + Occurs after deleting an item from the datastore + + + + + Occurs after inserting an item in the datastore + + + + + Occurs after an an entity instance is fully loaded. + + + + + Occurs after the datastore is updated + + + + An event that occurs before a collection is recreated + + + An event that occurs before a collection is removed + + + An event that occurs before a collection is updated + + + + Represents a pre-delete event, which occurs just prior to + performing the deletion of an entity from the database. + + + + + Constructs an event containing the pertinent information. + + The entity to be deleted. + The id to use in the deletion. + The entity's state at deletion time. + The entity's persister. + The session from which the event originated. + + + + This is the entity state at the + time of deletion (useful for optomistic locking and such). + + + + + Represents a pre-insert event, which occurs just prior to + performing the insert of an entity into the database. + + + + + These are the values to be inserted. + + + + + Called before injecting property values into a newly loaded entity instance. + + + + + Represents a pre-update event, which occurs just prior to + performing the update of an entity in the database. + + + + + Retrieves the state to be used in the update. + + + + + The old state of the entity at the time it was last loaded from the + database; can be null in the case of detached entities. + + + + + Defines an event class for the refreshing of an object. + + + + + Defines an event class for the replication of an entity. + + + + + An event class for saveOrUpdate() + + + + + Implementation of ADOException indicating problems with communicating with the + database (can also include incorrect ADO setup). + + + + + Wraps exceptions that occur during ADO.NET calls. + + + Exceptions thrown by various ADO.NET providers are not derived from + a common base class (SQLException in Java), so + is used instead in NHibernate. + + + + + Initializes a new instance of the class. + + The message that describes the error. + + The exception that is the cause of the current exception. If the innerException parameter + is not a null reference, the current exception is raised in a catch block that handles + the inner exception. + + + + + Initializes a new instance of the class. + + + The that holds the serialized object + data about the exception being thrown. + + + The that contains contextual information about the source or destination. + + + + + Collect data of an to be converted. + + + + + The to be converted. + + + + + An optional error message. + + + + + The SQL that generate the exception + + + + + Optional EntityName where available in the original exception context. + + + + + Optional EntityId where available in the original exception context. + + + + + Converts the given SQLException into Exception hierarchy, as well as performing + appropriate logging. + + The converter to use. + The exception to convert. + An optional error message. + The SQL executed. + The converted . + + + + Converts the given SQLException into Exception hierarchy, as well as performing + appropriate logging. + + The converter to use. + The exception to convert. + An optional error message. + The converted . + + + For the given , locates the . + The exception from which to extract the + The , or null. + + + + Implementation of ADOException indicating that the requested DML operation + resulted in a violation of a defined integrity constraint. + + + + + Returns the name of the violated constraint, if known. + + The name of the violated constraint, or null if not known. + + + + Implementation of ADOException indicating that evaluation of the + valid SQL statement against the given data resulted in some + illegal operation, mismatched types or incorrect cardinality. + + + + + The Configurable interface defines the contract for impls that + want to be configured prior to usage given the currently defined Hibernate properties. + + + + Configure the component, using the given settings and properties. + All defined startup properties. + + + + Defines a contract for implementations that know how to convert a + into NHibernate's hierarchy. + + + Inspired by Spring's SQLExceptionTranslator. + + Implementations must have a constructor which takes a + parameter. + + Implementations may implement if they need to perform + configuration steps prior to first use. + + + + + + Convert the given into custom Exception. + + Available information during exception throw. + The resulting Exception to throw. + + + + Implementation of ADOException indicating a problem acquiring lock + on the database. + + + + A factory for building SQLExceptionConverter instances. + + + Build a SQLExceptionConverter instance. + The defined dialect. + The configuration properties. + An appropriate instance. + + First, looks for a property to see + if the configuration specified the class of a specific converter to use. If this + property is set, attempt to construct an instance of that class. If not set, or + if construction fails, the converter specific to the dialect will be used. + + + + + Builds a minimal converter. The instance returned here just always converts to . + + The minimal converter. + + + + Implementation of ADOException indicating that the SQL sent to the database + server was invalid (syntax error, invalid object references, etc). + + + + + A SQLExceptionConverter implementation which performs no conversion of + the underlying . + Interpretation of a SQL error based on + is not possible as using the ErrorCode (which is, however, vendor- + specific). Use of a ErrorCode-based converter should be preferred approach + for converting/interpreting SQLExceptions. + + + + Handle an exception not converted to a specific type based on the SQLState. + The exception to be handled. + An optional message + Optionally, the sql being performed when the exception occurred. + The converted exception; should never be null. + + + + Encapsulates the strategy required to execute various types of update, delete, + and insert statements issued through HQL. + + + + + Execute the sql managed by this executor using the given parameters. + + Essentially bind information for this processing. + The session originating the request. + The number of entities updated/deleted. + + + + True if this is a filter query (allow no FROM clause). * + + + + Returns to the previous 'FROM' context. + + + + + + Implementations will report or handle errors invoked by an ANTLR base parser. + Author: josh + Ported by: Steve Strong + + + + all append invocations on the buf should go through this Output instance variable. + The value of this variable may be temporarily substitued by sql function processing code + to catch generated arguments. + This is because sql function templates need arguments as separate string chunks + that will be assembled into the target dialect-specific function call. + + + + Handles parser errors. + + + + + Add a space if the previous token was not a space or a parenthesis. + + + + + The default SQL writer. + + + + + Writes SQL fragments. + + + + todo remove this hack + The parameter is either ", " or " , ". This is needed to pass sql generating tests as the old + sql generator uses " , " in the WHERE and ", " in SELECT. + + @param comma either " , " or ", " + + + + The default SQL writer. + + + + + Base class for nodes dealing 'is null' and 'is not null' operators. + todo : a good deal of this is copied from BinaryLogicOperatorNode; look at consolidating these code fragments + + Author: Steve Ebersole + Ported by: Steve Strong + + + + + Represents a unary operator node. + + Author: Steve Ebersole + Ported by: Steve Strong + + + + + A semantic analysis node, that points back to the main analyzer. + Authoer: josh + Ported by: Steve Strong + + + + + A base AST node for the intermediate tree. + + + + The original text for the node, mostly for debugging. + + + The data type of this node. Null for 'no type'. + + + + Retrieve the text to be used for rendering this particular node. + + The session factory + The text to use for rendering + + + + An interface for initializeable AST nodes. + + + + + Initializes the node with the parameter. + + the initialization parameter. + + + A pointer back to the phase 2 processor. + + + + Contract for nodes representing unary operators. + + Author: Steve Ebersole + Ported by: Steve Strong + + + + + Contract for nodes representing operators (logic or arithmetic). + Author: Steve Ebersole + Ported by: Steve Strong + + + + + Called by the tree walker during hql-sql semantic analysis + after the operator sub-tree is completely built. + + + + + Retrieves the data type for the overall operator expression. + + The expression's data type. + + + + Retrieves the node representing the operator's single operand. + + + + + When (if) we need to expand a row value constructor, what is the type of connector to use between the + expansion fragments. + + The expansion connector type. + + + + When (if) we need to expand a row value constructor, what is the text of connector to use between the + expansion fragments. + + The expansion connector text. + + + + Convenience implementation of Statement to centralize common functionality. + Author: Steve Ebersole + Ported by: Steve Strong + + + + + Implementors will return additional display text, which will be used + by the ASTPrinter to display information (besides the node type and node + text). + + + + + Returns additional display text for the AST node. + + The additional display text. + + + + Common interface modeling the different HQL statements (i.e., INSERT, UPDATE, DELETE, SELECT). + Author: Steve Ebersole + Ported by: Steve Strong + + + + + The "phase 2" walker which generated this statement tree. + + + + + The main token type representing the type of this statement. + + + + + Does this statement require the StatementExecutor? + Essentially, at the JDBC level, does this require an executeUpdate()? + + + + + Returns additional display text for the AST node. + + The additional display text. + + + + Type definition for Statements which are restrictable via a where-clause (and + thus also having a from-clause). + Author: Steve Ebersole + Ported by: Steve Strong + + + + + Retreives the from-clause in effect for this statement; could be null if the from-clause + has not yet been parsed/generated. + + + + + Does this statement tree currently contain a where clause? + Returns True if a where-clause is found in the statement tree and + that where clause actually defines restrictions; false otherwise. + + + + + Retreives the where-clause defining the restriction(s) in effect for + this statement. + Note that this will generate a where-clause if one was not found, so caution + needs to taken prior to calling this that restrictions will actually exist + in the resulting statement tree (otherwise "unexpected end of subtree" errors + might occur during rendering). + + + + + Represents an element of a projection list, i.e. a select expression. + Author: josh + Ported by: Steve Strong + + + + + Appends AST nodes that represent the columns after the current AST node. + (e.g. 'as col0_O_') + + The index of the select expression in the projection list. + + + + Returns the data type of the select expression. + + + + + Returns the FROM element that this expression refers to. + + + + + Returns true if the element is a constructor (e.g. new Foo). + + + + + Returns true if this select expression represents an entity that can be returned. + + + + + Sets the text of the node. + + + + + Represents an aggregate function i.e. min, max, sum, avg. + + Author: Joshua Davis + Ported by: Steve Strong + + + + + Encapsulates the information relating to an individual assignment within the + set clause of an HQL update statement. This information is used during execution + of the update statements when the updates occur against "multi-table" stuff. + + + + + Contract for nodes representing logcial BETWEEN (ternary) operators. + + + + + Nodes which represent binary arithmetic operators. + + + + + Contract for nodes representing binary operators. + Author: Steve Ebersole + Ported by: Steve Strong + + + + + The left-hand operand of the operator. + + + + + The right-hand operand of the operator. + + + + Retrieves the left-hand operand of the operator. + + @return The left-hand operand + + + Retrieves the right-hand operand of the operator. + + @return The right-hand operand + + + + Contract for nodes representing binary operators. + Author: Steve Ebersole + Ported by: Steve Strong + + + + + Currently this is needed in order to deal with {@link FromElement FromElements} which + contain "hidden" JDBC parameters from applying filters. + Would love for this to go away, but that would require that Hibernate's + internal {@link org.hibernate.engine.JoinSequence join handling} be able to either:
    +
  • render the same AST structures
  • +
  • render structures capable of being converted to these AST structures
  • +
+ In the interim, this allows us to at least treat these "hidden" parameters properly which is + the most pressing need. + Author: Steve Ebersole + Ported by: Steve Strong +
+
+ + + Adds a parameter specification for a parameter encountered within this node. We use the term 'embedded' here + because of the fact that the parameter was simply encountered as part of the node's text; it does not exist + as part of a subtree as it might in a true AST. + + The generated specification. + + + + Retrieve all embedded parameter specifications. + + All embedded parameter specifications; may return null. + + + + Set the renderable text of this node. + + + + + Determine whether this node contans embedded parameters. The implication is that + {@link #getEmbeddedParameters()} is allowed to return null if this method returns false. + + + + + Performs the operator node initialization by seeking out any parameter + nodes and setting their expected type, if possible. + + + + Mutate the subtree relating to a row-value-constructor to instead use + a series of ANDed predicates. This allows multi-column type comparisons + and explicit row-value-constructor syntax even on databases which do + not support row-value-constructor. +

+ For example, here we'd mutate "... where (col1, col2) = ('val1', 'val2) ..." to + "... where col1 = 'val1' and col2 = 'val2' ..." + + @param valueElements The number of elements in the row value constructor list. + + +

+ Represents a boolean literal within a query. + +
+ + + Represents a literal. + + Author: josh + Ported by: Steve Strong + + + + + Interface for nodes which wish to be made aware of any determined "expected + type" based on the context within they appear in the query. + Author: Steve Ebersole + Ported by: Steve Strong + + + + Expected-types really only pertinent here for boolean literals... + + @param expectedType + + + + Represents a case ... when .. then ... else ... end expression in a select. + + + + + Represents a case ... when .. then ... else ... end expression in a select. + + Author: Gavin King + Ported by: Steve Strong + + + + + Represents 'elements()' or 'indices()'. + Author: josh + Ported by: Steve strong + + + + + Represents a method call + Author: josh + Ported by: Steve Strong + + + + + Constructor form used to initialize . + + The FROM clause to which this element belongs. + The origin (LHS) of this element. + The alias applied to this element. + + + + Returns the identifier select SQL fragment. + + The total number of returned types. + The sequence of the current returned type. + the identifier select SQL fragment. + + + + Returns the property select SQL fragment. + + The total number of returned types. + The sequence of the current returned type. + the property select SQL fragment. + + + + Render the identifier select, but in a 'scalar' context (i.e. generate the column alias). + + the sequence of the returned type + the identifier select with the column alias. + + + + Returns true if this FromElement was implied by a path, or false if this FROM element is explicitly declared in + the FROM clause. + + + + + Delegate that handles the type and join sequence information for a FromElement. + Author: josh + Ported by: Steve Strong + + + + + Returns the identifier select SQL fragment. + + The total number of returned types. + The sequence of the current returned type. + the identifier select SQL fragment. + + + + Render the identifier select, but in a 'scalar' context (i.e. generate the column alias). + + the sequence of the returned type + the identifier select with the column alias. + + + + Returns the property select SQL fragment. + + The total number of returned types. + The sequence of the current returned type. + + the property select SQL fragment. + + + + Returns the type of a property, given it's name (the last part) and the full path. + + The last part of the full path to the property. + The full property path. + The type + + + + This accounts for a quirk in Queryable, where it sometimes generates ', ' in front of the + SQL fragment. :-P + + A SQL fragment. + The fragment, without the leading comma and spaces. + + + + Returns the Hibernate queryable implementation for the HQL class. + + + + + Abstraction of all mappings that define properties: entities, collection elements. + + + + + Given a component path expression, get the type of the property + + + + + + + Given a component path expression, get the type of the property. + + + + true if a type was found, false if not + + + + Given a query alias and a property path, return the qualified column name + + + + + + + Given a property path, return the corresponding column name(s). + + + + Get the type of the thing containing the properties + + + + + Common behavior - a node that contains a list of select expressions. + Author: josh + Ported by: Steve Strong + + + + + Returns an array of SelectExpressions gathered from the children of the given parent AST node. + + + + + Returns an array of SelectExpressions gathered from the children of the given parent AST node. + + + + + Returns the first select expression node that should be considered when building the array of select + expressions. + + + + + Represents a COUNT expression in a select. + Author: josh + Ported by: Steve Strong + + + + + Defines a top-level AST node representing an HQL delete statement. + + + + + Represents a reference to a property or alias expression. This should duplicate the relevant behaviors in + PathExpressionParser. + Author: Joshua Davis + Ported by: Steve Strong + + + + + The contract for expression sub-trees that can resolve themselves. + Author: josh + Ported by: Steve Strong + + + + + Does the work of resolving an identifier or a dot + + + + + Does the work of resolving an identifier or a dot, but without a parent node + + + + + Does the work of resolving an identifier or a dot, but without a parent node or alias + + + + + Does the work of resolving inside of the scope of a function call + + + + + Does the work of resolving an an index []. + + + + + An AST node with a path property. This path property will be the fully qualified name. + Author: josh + Ported by: Steve Strong + + + + + Returns the full path name represented by the node. + + the full path name represented by the node. + + + + Sub-classes can override this method if they produce implied joins (e.g. DotNode). + + an implied join created by this from reference. + + + + The full path, to the root alias of this dot node. + + + + + The type of dereference that hapened (DEREF_xxx). + + + + + The identifier that is the name of the property. + + + + + The unresolved property path relative to this dot node. + + + + + The column names that this resolves to. + + + + + Fetch join or not. + + + + + The type of join to create. Default is an inner join. + + + + + Is the given property name a reference to the primary key of the associated + entity construed by the given entity type? + For example, consider a fragment like order.customer.id + (where order is a from-element alias). Here, we'd have: + propertyName = "id" AND + owningType = ManyToOneType(Customer) + and are being asked to determine whether "customer.id" is a reference + to customer's PK... + + The name of the property to check. + The type represeting the entity "owning" the property + True if propertyName references the entity's (owningType->associatedEntity) primary key; false otherwise. + + + + Sets the join type for this '.' node structure. + + + + + Returns the full path of the node. + + + + + Represents the 'FROM' part of a query or subquery, containing all mapped class references. + Author: josh + Ported by: Steve Strong + + + + + Counts the from elements as they are added. + + + + + All of the implicit FROM xxx JOIN yyy elements that are the destination of a collection. These are created from + index operators on collection property references. + + + + + Pointer to the parent FROM clause, if there is one. + + + + + Collection of FROM clauses of which this is the parent. + + + + + Convenience method to check whether a given token represents a from-element alias. + + The potential from-element alias to check. + True if the possibleAlias is an alias to a from-element visible from this point in the query graph. + + + + Returns true if the from node contains the class alias name. + + The HQL class alias name. + true if the from node contains the class alias name. + + + + Returns true if the from node contains the table alias name. + + The SQL table alias name. + true if the from node contains the table alias name. + + + + Adds a new from element to the from node. + + The reference to the class. + The alias AST. + The new FROM element. + + + + Retreives the from-element represented by the given alias. + + The alias by which to locate the from-element. + The from-element assigned the given alias, or null if none. + + + + Returns the list of from elements in order. + + The list of from elements (instances of FromElement). + + + + Returns the list of from elements that will be part of the result set. + + the list of from elements that will be part of the result set. + + + + Look for an existing implicit or explicit join by the given path. + + + + + Creates entity from elements. + + + + + + + + Creates collection from elements. + + + + + + + + + + + Insert a new node into both the Tree and the Node Array. Add DOWN and UP nodes if needed. + + The parent node + The child node + + + + Count the number of child nodes (including DOWNs and UPs) of a parent node + + The index of the parent in the node array + The number of child nodes + + + + Represents the [] operator and provides it's semantics. + Author: josh + Ported by: Steve Strong + + + + + Author: Steve Ebersole + Ported by: Steve Strong + + + + + Defines a top-level AST node representing an HQL "insert select" statement. + + + + Performs detailed semantic validation on this insert statement tree. + Indicates validation failure. + + + Retreive this insert statement's into-clause. + The into-clause + + + Retreive this insert statement's select-clause. + The select-clause. + + + + Represents an entity referenced in the INTO clause of an HQL + INSERT statement. + + Author: Steve Ebersole + Ported by: Steve Strong + + + + + Returns additional display text for the AST node. + + The additional display text. + + + + Determine whether the two types are "assignment compatible". + + The type defined in the into-clause. + The type defined in the select clause. + True if they are assignment compatible. + + + + Interface for nodes which require access to the SessionFactory + + Author: Steve Ebersole + Ported by: Steve Strong + + + + + IsNotNullLogicOperatorNode implementation + + Author: Steve Ebersole + Ported by: Steve Strong + + + + + Represents a 'is null' check. + + + + + A node representing a static Java constant. + + Author: Steve Ebersole + Ported by: Steve Strong + + + + + Implementation of OrderByClause. + Author: Steve Ebersole + Ported by: Steve Strong + + + + + Implementation of ParameterNode. + Author: Steve Ebersole + Ported by: Steve Strong + + + + + Locate the select clause that is part of this select statement. + Note, that this might return null as derived select clauses (i.e., no + select clause at the HQL-level) get generated much later than when we + get created; thus it depends upon lifecycle. + + Our select clause, or null. + + + + Represents the list of expressions in a SELECT clause. + Author: josh + Ported by: Steve Strong + + + + + Prepares a derived (i.e., not explicitly defined in the query) select clause. + + The from clause to which this select clause is linked. + + + + Prepares an explicitly defined select clause. + + The from clause linked to this select clause. + + + + + FromElements which need to be accounted for in the load phase (either for return or for fetch). + + + + + The column alias names being used in the generated SQL. + + + + + The constructor to use for dynamic instantiation queries. + + + + + The HQL aliases, or generated aliases + + + + + The types actually being returned from this query at the "object level". + + + + + A select expression that was generated by a FROM element. + Author: josh + Ported by: Steve Strong + + + + + Represents an SQL fragment in the AST. + Author: josh + Ported by: Steve Strong + + + + + Defines a top-level AST node representing an HQL update statement. + + + + + Generates class/table/column aliases during semantic analysis and SQL rendering. + Its essential purpose is to keep an internal counter to ensure that the + generated aliases are unique. + + + + + Appends child nodes to a parent efficiently. + + + + + Depth first iteration of an ANTLR AST. + Author: josh + Ported by: Steve Strong + + + + + Returns the 'list' representation with some brackets around it for debugging. + + The tree. + The list representation of the tree. + + + + Determine if a given node (test) is contained anywhere in the subtree + of another given node (fixture). + + The node against which to be checked for children. + The node to be tested as being a subtree child of the parent. + True if child is contained in the parent's collection of children. + + + + Finds the first node of the specified type in the chain of children. + + The parent + The type to find. + The first node of the specified type, or null if not found. + + + + Filters nodes in/out of a tree. + + The node to check. + true to keep the node, false if the node should be filtered out. + + + + Generates the scalar column AST nodes for a given array of SQL columns + + + + + Performs the post-processing of the join information gathered during semantic analysis. + The join generating classes are complex, this encapsulates some of the JoinSequence-related + code. + Author: Joshua Davis + Ported by: Steve Strong + + + + + Constructs a new JoinProcessor. + + The walker to which we are bound, giving us access to needed resources. + + + + Translates an AST join type (i.e., the token type) into a JoinFragment.XXX join type. + + The AST join type (from HqlSqlWalker) + a JoinType.XXX join type. + + + + Indicates that Float and Double literal values should + be treated using the SQL "exact" format (i.e., '.001') + + + + + Indicates that Float and Double literal values should + be treated using the SQL "approximate" format (i.e., '1E-3') + + + + + In what format should Float and Double literal values be sent + to the database? + See #EXACT, #APPROXIMATE + + + + + Traverse the AST tree depth first. Note that the AST passed in is not visited itself. Visitation starts + with its children. + + ast + + + + Turns a path into an AST. + + The path. + The AST factory to use. + An HQL AST representing the path. + + + + Creates synthetic and nodes based on the where fragment part of a JoinSequence. + Author: josh + Ported by: Steve Strong + + + + + Generates translators which uses the Antlr-based parser to perform + the translation. + + Author: Gavin King + Ported by: Steve Strong + + + + + Facade for generation of + and instances. + + + + + Construct a instance + capable of translating an HQL query string. + + The query string to be translated + + + Currently enabled filters + The session factory + An appropriate translator. + + + + Construct a instance + capable of translating a Linq expression. + + The query expression to be translated + + + Currently enabled filters + The session factory + An appropriate translator. + + + + Look ahead for tokenizing is all lowercase, whereas the original case of an input stream is preserved. + Copied from http://www.antlr.org/wiki/pages/viewpage.action?pageId=1782 + + + + + Provides a map of collection function names to the corresponding property names. + Authoer: josh + Ported by: Steve Strong + + + + + A problem occurred translating a Hibernate query to SQL due to invalid query syntax, etc. + + + + + Initializes a new instance of the class. + + The message that describes the error. + + + + Initializes a new instance of the class. + + The message that describes the error. + + The exception that is the cause of the current exception. If the innerException parameter + is not a null reference, the current exception is raised in a catch block that handles + the inner exception. + + + + + Initializes a new instance of the class. + + The message that describes the error. + The query that contains the error. + + + + Initializes a new instance of the class. + + + The exception that is the cause of the current exception. If the innerException parameter + is not a null reference, the current exception is raised in a catch block that handles + the inner exception. + + + + + Initializes a new instance of the class + with serialized data. + + + The that holds the serialized object + data about the exception being thrown. + + + The that contains contextual information about the source or destination. + + + + + Sets the serialization info for after + getting the info from the base Exception. + + + The that holds the serialized object + data about the exception being thrown. + + + The that contains contextual information about the source or destination. + + + + + Gets or sets the of HQL that caused the Exception. + + + + + Gets a message that describes the current . + + The error message that explains the reason for this exception including the HQL. + + + + An error handler that counts parsing errors and warnings. + + + + + Defines the behavior of an error handler for the HQL parsers. + Author: josh + Ported by: Steve Strong + + + + + A custom token class for the HQL grammar. + + + + + The previous token type. + + + + + Public constructor + + + + + Public constructor + + + + + Returns a string representation of the object. + + The debug string + + + + Indicates if the token could be an identifier. + + + + + Returns the previous token type. + + + + + Exception thrown when an invalid path is found in a query. + Author: josh + Ported by: Steve Strong + + + + + Specialized interface for filters. + + + + + Defines the constract of an HQL->SQL translator. + + + + + Compile a "normal" query. This method may be called multiple times. Subsequent invocations are no-ops. + + Defined query substitutions. + Does this represent a shallow (scalar or entity-id) select? + There was a problem parsing the query string. + There was a problem querying defined mappings. + + + + Perform a list operation given the underlying query definition. + + The session owning this query. + The query bind parameters. + The query list results. + + + + + Perform a bulk update/delete operation given the underlying query defintion. + + The query bind parameters. + The session owning this query. + The number of entities updated or deleted. + + + + + Returns the column names in the generated SQL. + + the column names in the generated SQL. + + + + The set of query spaces (table names) that the query referrs to. + + + + + The SQL string generated by the translator. + + + + + The HQL string processed by the translator. + + + + + Returns the filters enabled for this query translator. + + Filters enabled for this query execution. + + + + Returns an array of Types represented in the query result. + + Query return types. + + + + Returns an array of HQL aliases + + Returns an array of HQL aliases + + + + Does the translated query contain collection fetches? + + True if the query does contain collection fetched; false otherwise. + + + + Compile a filter. This method may be called multiple + times. Subsequent invocations are no-ops. + + the role name of the collection used as the basis for the filter. + Defined query substitutions. + Does this represent a shallow (scalar or entity-id) select? + + + + Creates a new AST-based query translator. + + The query-identifier (used in stats collection) + The hql query to translate + Currently enabled filters + The session factory constructing this translator instance. + + + + Compile a "normal" query. This method may be called multiple + times. Subsequent invocations are no-ops. + + Defined query substitutions. + Does this represent a shallow (scalar or entity-id) select? + + + + Compile a filter. This method may be called multiple + times. Subsequent invocations are no-ops. + + the role name of the collection used as the basis for the filter. + Defined query substitutions. + Does this represent a shallow (scalar or entity-id) select? + + + + Performs both filter and non-filter compiling. + + Defined query substitutions. + Does this represent a shallow (scalar or entity-id) select? + the role name of the collection used as the basis for the filter, NULL if this is not a filter. + + + + Construct a new SessionFactoryHelperExtensions instance. + + The SessionFactory impl to be encapsulated. + + + + Locate a registered sql function by name. + + The name of the function to locate + The sql function, or null if not found. + + + + Locate a registered sql function by name. + + The name of the function to locate + The sql function, or throws QueryException if no matching sql functions could be found. + + + + Find the function return type given the function name and the first argument expression node. + + The function name. + The first argument expression. + the function return type given the function name and the first argument expression node. + + + + Given a (potentially unqualified) class name, locate its imported qualified name. + + The potentially unqualified class name + The qualified class name. + + + + Does the given persister define a physical discriminator column + for the purpose of inheritence discrimination? + + The persister to be checked. + True if the persister does define an actual discriminator column. + + + + Locate the collection persister by the collection role. + + The collection role name. + The defined CollectionPersister for this collection role, or null. + + + + Determine the name of the property for the entity encapsulated by the + given type which represents the id or unique-key. + + The type representing the entity. + The corresponding property name + + + + Retrieves the column names corresponding to the collection elements for the given + collection role. + + The collection role + The sql column-qualification alias (i.e., the table alias) + the collection element columns + + + + Essentially the same as GetElementType, but requiring that the + element type be an association type. + + The collection type to be checked. + The AssociationType of the elements of the collection. + + + + Locate the collection persister by the collection role, requiring that + such a persister exist. + + The collection role name. + The defined CollectionPersister for this collection role. + + + + Locate the persister by class or entity name, requiring that such a persister + exist. + + The class or entity name + The defined persister for this entity + + + + Given a (potentially unqualified) class name, locate its persister. + + The (potentially unqualified) class name. + The defined persister for this class, or null if none found. + + + + Given a (potentially unqualified) class name, locate its persister. + + The session factory implementor. + The (potentially unqualified) class name. + The defined persister for this class, or null if none found. + + + + Locate the persister by class or entity name. + + The class or entity name + The defined persister for this entity, or null if none found. + + + + Create a join sequence rooted at the given collection. + + The persister for the collection at which the join should be rooted. + The alias to use for qualifying column references. + The generated join sequence. + + + + Generate an empty join sequence instance. + + The generated join sequence. + + + + Generate a join sequence representing the given association type. + + Should implicit joins (theta-style) or explicit joins (ANSI-style) be rendered + The type representing the thing to be joined into. + The table alias to use in qualifing the join conditions + The type of join to render (inner, outer, etc) + The columns making up the condition of the join. + The generated join sequence. + + + + Retreive a PropertyMapping describing the given collection role. + + The collection role for whcih to retrieve the property mapping. + The property mapping. + + + + Given a collection type, determine the Type representing elements + within instances of that collection. + + The collection type to be checked. + The Type of the elements of the collection. + + + + Wraps SessionFactoryImpl, adding more lookup behaviors and encapsulating some of the error handling. + + + + + Locate the collection persister by the collection role. + + The collection role name. + The defined CollectionPersister for this collection role, or null. + + + + Locate the persister by class or entity name, requiring that such a persister + exists + + The class or entity name + The defined persister for this entity + + + + Locate the persister by class or entity name. + + The class or entity name + The defined persister for this entity, or null if none found. + + + + Retreive a PropertyMapping describing the given collection role. + + The collection role for whcih to retrieve the property mapping. + The property mapping. + + + + Provides utility methods for generating HQL / SQL names. + Shared by both the 'classic' and 'new' query translators. + + + + + Handle Hibernate "implicit" polymorphism, by translating the query string into + several "concrete" queries against mapped classes. + + + + + + + + + Contract for providing callback access to an , + typically from the . + + + + + Retrieve the next value from the underlying source. + + + + + Encapsulates definition of the underlying data structure backing a sequence-style generator. + + + + + A callback to be able to get the next value from the underlying + structure as needed. + + The session. + The next value. + + + + Prepare this structure for use. Called sometime after instantiation, + but before first use. + + The optimizer being applied to the generator. + + + Commands needed to create the underlying structures. + The database dialect being used. + The creation commands. + + + Commands needed to drop the underlying structures. + The database dialect being used. + The drop commands. + + + The name of the database structure (table or sequence). + + + How many times has this structure been accessed through this reference? + + + The configured increment size + + + + Performs optimization on an optimizable identifier generator. Typically + this optimization takes the form of trying to ensure we do not have to + hit the database on each and every request to get an identifier value. + + + + Optimizers work on constructor injection. They should provide + a constructor with the following arguments. + + - The return type for the generated values. + - int The increment size. + + + + + Generate an identifier value accounting for this specific optimization. + + Callback to access the underlying value source. + The generated identifier value. + + + + A common means to access the last value obtained from the underlying + source. This is intended for testing purposes, since accessing the + unerlying database source directly is much more difficult. + + + The last value we obtained from the underlying source; -1 indicates we have not yet consulted with the source. + + + + + Defined increment size. + + The increment size. + + + + Are increments to be applied to the values stored in the underlying + value source? + + + True if the values in the source are to be incremented + according to the defined increment size; false otherwise, in which + case the increment is totally an in memory construct. + + + + + Marker interface for an optimizer that wishes to know the user-specified initial value. +

+ Used instead of constructor injection since that is already a public understanding and + because not all optimizers care. +

+
+ + + Reports the user-specified initial value to the optimizer. +

+ -1 is used to indicate that the user did not specify. + The initial value specified by the user, or -1 to indicate that the + user did not specify. +

+
+ + + Common support for optimizer implementations. + + + + + Construct an optimizer + + The expected id class. + The increment size. + + + + Exposure intended for testing purposes. + + + + + Exposure intended for testing purposes. + + + + + Optimizer which uses a pool of values, storing the next low value of the range in the database. + + Note that this optimizer works essentially the same as the HiLoOptimizer, except that here the + bucket ranges are actually encoded into the database structures. + + + Note that if you prefer that the database value be interpreted as the bottom end of our current + range, then use the PooledLoOptimizer strategy. + + + + + + Exposure intended for testing purposes. + + + + + Exposure intended for testing purposes. + + + + + Describes a sequence. + + + + + Generates identifier values based on an sequence-style database structure. + Variations range from actually using a sequence to using a table to mimic + a sequence. These variations are encapsulated by the + interface internally. + + + General configuration parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NAMEDEFAULTDESCRIPTION
The name of the sequence/table to use to store/retrieve values
The initial value to be stored for the given segment; the effect in terms of storage varies based on and
The increment size for the underlying segment; the effect in terms of storage varies based on and
depends on defined increment sizeAllows explicit definition of which optimization strategy to use
falseAllows explicit definition of which optimization strategy to use
+

+ Configuration parameters used specifically when the underlying structure is a table: + + + + + + + + + + + +
NAMEDEFAULTDESCRIPTION
The name of column which holds the sequence value for the given segment
+ + + +

+ An that requires creation of database objects + All s that also implement + An have access to a special mapping parameter: schema + +
+ + + The general contract between a class that generates unique + identifiers and the . + + + + It is not intended that this interface ever be exposed to the + application. It is intended that users implement this interface + to provide custom identifier generation strategies. + + + Implementors should provide a public default constructor. + + + Implementations that accept configuration parameters should also + implement . + + + Implementors must be threadsafe. + + + + + + Generate a new identifier + + The this id is being generated in. + The entity for which the id is being generated. + The new identifier + + + + The SQL required to create the underlying database objects + + The to help with creating the sql. + + An array of objects that contain the sql to create the + necessary database objects. + + + + + The SQL required to remove the underlying database objects + + The to help with creating the sql. + + A that will drop the database objects. + + + + + Return a key unique to the underlying database objects. + + + A key unique to the underlying database objects. + + + Prevents us from trying to create/remove them multiple times + + + + + An IdentiferGenerator that supports "configuration". + + + + + Configure this instance, given the values of parameters + specified by the user as <param> elements. + This method is called just once, followed by instantiation. + + The the identifier should be. + An of Param values that are keyed by parameter name. + The to help with Configuration. + + + + Determine the name of the sequence (or table if this resolves to a physical table) to use. + Called during configuration. + + + + + + + + Determine the name of the column used to store the generator value in + the db. Called during configuration, if a physical table is being used. + + + + + Determine the initial sequence value to use. This value is used when + initializing the database structure (i.e. sequence/table). Called + during configuration. + + + + + Determine the increment size to be applied. The exact implications of + this value depends on the optimizer being used. Called during configuration. + + + + + Determine the optimizer to use. Called during configuration. + + + + + In certain cases we need to adjust the increment size based on the + selected optimizer. This is the hook to achieve that. + + The determined optimizer strategy. + The determined, unadjusted, increment size. + + + + Do we require a sequence with the ability to set initialValue and incrementSize + larger than 1? + + + + + An enhanced version of table-based id generation. + + + Unlike the simplistic legacy one (which, btw, was only ever intended for subclassing + support) we "segment" the table into multiple values. Thus a single table can + actually serve as the persistent storage for multiple independent generators. One + approach would be to segment the values by the name of the entity for which we are + performing generation, which would mean that we would have a row in the generator + table for each entity name. Or any configuration really; the setup is very flexible. + + In this respect it is very similar to the legacy + MultipleHiLoPerTableGenerator (not available in NHibernate) in terms of the + underlying storage structure (namely a single table capable of holding + multiple generator values). The differentiator is, as with + as well, the externalized notion + of an optimizer. + + + NOTE that by default we use a single row for all generators (based + on ). The configuration parameter + can be used to change that to + instead default to using a row for each entity name. + + Configuration parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NAMEDEFAULTDESCRIPTION
The name of the table to use to store/retrieve values
The name of column which holds the sequence value for the given segment
The name of the column which holds the segment key
The value indicating which segment is used by this generator; refers to values in the column
The data length of the column; used for schema creation
The initial value to be stored for the given segment
The increment size for the underlying segment; see the discussion on for more details.
depends on defined increment sizeAllows explicit definition of which optimization strategy to use
+
+
+ + + Determine the table name to use for the generator values. Called during configuration. + + The parameters supplied in the generator config (plus some standard useful extras). + + + + Determine the name of the column used to indicate the segment for each + row. This column acts as the primary key. + Called during configuration. + + The parameters supplied in the generator config (plus some standard useful extras). + + + + Determine the name of the column in which we will store the generator persistent value. + Called during configuration. + + + + + Determine the segment value corresponding to this generator instance. Called during configuration. + + + + + Used in the cases where is unable to + determine the value to use. + + + + + Determine the size of the segment column. + Called during configuration. + + + + + Type mapping for the identifier. + + + + + The name of the table in which we store this generator's persistent state. + + + + + The name of the column in which we store the segment to which each row + belongs. The value here acts as primary key. + + + + + The value in the column identified by which + corresponds to this generator instance. In other words, this value + indicates the row in which this generator instance will store values. + + + + + The size of the column identified by + in the underlying table. + + + Should really have been called 'segmentColumnLength' or even better 'segmentColumnSize'. + + + + + The name of the column in which we store our persistent generator value. + + + + + The initial value to use when we find no previous state in the + generator table corresponding to this instance. + + + + + The amount of increment to use. The exact implications of this + depends on the optimizer being used, see . + + + + + The optimizer being used by this generator. This mechanism + allows avoiding calling the database each time a new identifier + is needed. + + + + + The table access count. Only really useful for unit test assertions. + + + + + Describes a table used to mimic sequence behavior + + + + + Abstract InsertGeneratedIdentifierDelegate implementation where the + underlying strategy causes the generated identitifer to be returned as an + effect of performing the insert statement. Thus, there is no need for an + additional sql statement to determine the generated identitifer. + + + + + Responsible for handling delegation relating to variants in how + insert-generated-identifier generator strategies dictate processing: +
    +
  • building the sql insert statement
  • +
  • determination of the generated identifier value
  • +
+
+
+ + + Build a specific to the delegate's mode + of handling generated key values. + + The insert object. + + + + Perform the indicated insert SQL statement and determine the identifier value generated. + + + + + The generated identifier value. + + + + Abstract InsertGeneratedIdentifierDelegate implementation where the + underlying strategy requires an subsequent select after the insert + to determine the generated identifier. + + + + Extract the generated key value from the given result set. + The session + The result set containing the generated primay key values. + The entity being saved. + The generated identifier + + + Bind any required parameter values into the SQL command . + The session + The prepared command + The entity being saved. + + + Get the SQL statement to be used to retrieve generated key values. + The SQL command string + + + + Types of any required parameter values into the SQL command . + + + + + Nothing more than a distinguishing subclass of Insert used to indicate + intent. + Some subclasses of this also provided some additional + functionality or semantic to the genernated SQL statement string. + + + + + A class that builds an INSERT sql statement. + + + + + + + + Builds a SqlString from the internal data. + + A valid SqlString that can be converted into an IDbCommand + + + + Adds the Property's columns to the INSERT sql + + The column name for the Property + The IType of the property. + The SqlInsertBuilder. + The column will be associated with a parameter. + + + + Add a column with a specific value to the INSERT sql + + The name of the Column to add. + The value to set for the column. + The NHibernateType to use to convert the value to a sql string. + The SqlInsertBuilder. + + + + Add a column with a specific value to the INSERT sql + + The name of the Column to add. + A valid sql string to set as the value of the column. + The SqlInsertBuilder. + + + + Specialized IdentifierGeneratingInsert which appends the database + specific clause which signifies to return generated IDENTITY values + to the end of the insert statement. + + + + + Disable comments on insert. + + + + + implementation where the + underlying strategy causes the generated identitifer to be returned, as an + effect of performing the insert statement, in a Output parameter. + Thus, there is no need for an additional sql statement to determine the generated identitifer. + + + + + Specialized IdentifierGeneratingInsert which appends the database + specific clause which signifies to return generated identifier values + to the end of the insert statement. + + + + + + + The IdentityGenerator for autoincrement/identity key generation. + + The this id is being generated in. + The entity the id is being generated for. + + IdentityColumnIndicator Indicates to the Session that identity (i.e. identity/autoincrement column) + key generation should be used. + + + + + An that returns the current identifier + assigned to an instance. + + +

+ This id generation strategy is specified in the mapping file as + <generator class="assigned" /> +

+
+
+ + + Generates a new identifier by getting the value of the identifier + for the obj parameter. + + The this id is being generated in. + The entity for which the id is being generated. + The value that was assigned to the mapped id's property. + + Thrown when a is passed in as the obj or + if the identifier of obj is null. + + + + + An that returns a Int64 constructed from the system + time and a counter value. Not safe for use in a clustser! + + + + + An that uses the value of + the id property of an associated object + + + + This id generation strategy is specified in the mapping file as + + <generator class="foreign"> + <param name="property">AssociatedObject</param> + </generator> + + + The mapping parameter property is required. + + + + + Generates an identifer from the value of a Property. + + The this id is being generated in. + The entity for which the id is being generated. + + The identifier value from the associated object or + if the session + already contains obj. + + + + + Configures the ForeignGenerator by reading the value of property + from the parms parameter. + + The the identifier should be. + An of Param values that are keyed by parameter name. + The to help with Configuration. + + Thrown if the key property is not found in the parms parameter. + + + + + An that generates values + using a strategy suggested Jimmy Nilsson's + article + on informit.com. + + +

+ This id generation strategy is specified in the mapping file as + <generator class="guid.comb" /> +

+

+ The comb algorithm is designed to make the use of GUIDs as Primary Keys, Foreign Keys, + and Indexes nearly as efficient as ints. +

+

+ This code was contributed by Donald Mull. +

+
+
+ + + Generate a new using the comb algorithm. + + The this id is being generated in. + The entity for which the id is being generated. + The new identifier as a . + + + + Generate a new using the comb algorithm. + + + + + An that generates values + using Guid.NewGuid(). + + +

+ This id generation strategy is specified in the mapping file as + <generator class="guid" /> +

+
+
+ + + Generate a new for the identifier. + + The this id is being generated in. + The entity for which the id is being generated. + The new identifier as a . + + + + Thrown by implementation class when ID generation fails + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message that describes the error. + + + + Initializes a new instance of the class. + + The message that describes the error. + + The exception that is the cause of the current exception. If the innerException parameter + is not a null reference, the current exception is raised in a catch block that handles + the inner exception. + + + + + Initializes a new instance of the class + with serialized data. + + + The that holds the serialized object + data about the exception being thrown. + + + The that contains contextual information about the source or destination. + + + + + Factory methods for IdentifierGenerator framework. + + +

The built in strategies for identifier generation in NHibernate are:

+ + + strategy + Implementation of strategy + + + assigned + + + + counter + + + + foreign + + + + guid + + + + guid.comb + + + + guid.native + + + + hilo + + + + identity + + + + native + + Chooses between , + , and based on the + 's capabilities. + + + + seqhilo + + + + sequence + + + + enhanced-sequence + + + + uuid.hex + + + + uuid.string + + + +
+
+ + Get the generated identifier when using identity columns + The to read the identifier value from. + The the value should be converted to. + The the value is retrieved in. + The value for the identifier. + + + + Gets the value of the identifier from the and + ensures it is the correct . + + The to read the identifier value from. + The the value should be converted to. + The the value is retrieved in. + + The value for the identifier. + + + Thrown if there is any problem getting the value from the + or with converting it to the . + + + + + An where the key is the strategy and + the value is the for the strategy. + + + + + When this is returned by Generate() it indicates that the object + has already been saved. + + + String.Empty + + + + + When this is return + + + + + Initializes the static fields in . + + + + + Creates an from the named strategy. + + + The name of the generator to create. This can be one of the NHibernate abbreviations (ie - native, + sequence, guid.comb, etc...), a full class name if the Type is in the NHibernate assembly, or + a full type name if the strategy is in an external assembly. + + The that the retured identifier should be. + An of <param> values from the mapping. + The to help with Configuration. + + An instantiated and configured . + + + Thrown if there are any exceptions while creating the . + + + + + Create the correct boxed for the identifier. + + The value of the new identifier. + The the identifier should be. + + The identifier value converted to the . + + + The type parameter must be an , , + or . + + + + + An that indicates to the that identity + (ie. identity/autoincrement column) key generation should be used. + + +

+ This id generation strategy is specified in the mapping file as + <generator class="identity" /> + or if the database natively supports identity columns + <generator class="native" /> +

+

+ This indicates to NHibernate that the database generates the id when + the entity is inserted. +

+
+
+ + + Delegate for dealing with IDENTITY columns where the dialect supports returning + the generated IDENTITY value directly from the insert statement. + + + + + Delegate for dealing with IDENTITY columns where the dialect requires an + additional command execution to retrieve the generated IDENTITY value + + + + The configuration parameter holding the entity name + + + + An IIdentifierGenerator that returns a Int64, constructed by + counting from the maximum primary key value at startup. Not safe for use in a + cluster! + + + + java author Gavin King, .NET port Mark Holden + + + Mapping parameters supported, but not usually needed: table, column. + + + + + + + + + + + + + + + + + + + + + The configuration parameter holding the schema name + + + + The configuration parameter holding the table name for the + generated id + + + + + The configuration parameter holding the table names for all + tables for which the id must be unique + + + + + The configuration parameter holding the primary key column + name of the generated id + + + + The configuration parameter holding the catalog name + + + + A persister that may have an identity assigned by execution of a SQL INSERT. + + + + + Get a SQL select string that performs a select based on a unique + key determined by the given property name). + + + The name of the property which maps to the + column(s) to use in the select statement restriction. + + The SQL select string + + + + Get the database-specific SQL command to retrieve the last + generated IDENTITY value. + + + + The names of the primary key columns in the root table. + The primary key column names. + + + + Get the identifier type + + + + + Generates Guid values using the server side Guid function. + + + + + A generator that selects the just inserted row to determine the identifier + value assigned by the database. The correct row is located using a unique key. + + One mapping parameter is required: key (unless a natural-id is defined in the mapping). + + + The delegate for the select generation strategy. + + + + An that generates Int64 values using an + oracle-style sequence. A higher performance algorithm is + . + + +

+ This id generation strategy is specified in the mapping file as + + <generator class="sequence"> + <param name="sequence">uid_sequence</param> + <param name="schema">db_schema</param> + </generator> + +

+

+ The sequence parameter is required while the schema is optional. +

+
+
+ + + The name of the sequence parameter. + + + + + The parameters parameter, appended to the create sequence DDL. + For example (Oracle): INCREMENT BY 1 START WITH 1 MAXVALUE 100 NOCACHE. + + + + + Configures the SequenceGenerator by reading the value of sequence and + schema from the parms parameter. + + The the identifier should be. + An of Param values that are keyed by parameter name. + The to help with Configuration. + + + + Generate an , , or + for the identifier by using a database sequence. + + The this id is being generated in. + The entity for which the id is being generated. + The new identifier as a , , or . + + + + The SQL required to create the database objects for a SequenceGenerator. + + The to help with creating the sql. + + An array of objects that contain the Dialect specific sql to + create the necessary database objects for the SequenceGenerator. + + + + + The SQL required to remove the underlying database objects for a SequenceGenerator. + + The to help with creating the sql. + + A that will drop the database objects for the SequenceGenerator. + + + + + Return a key unique to the underlying database objects for a SequenceGenerator. + + + The configured sequence name. + + + + + An that combines a hi/lo algorithm with an underlying + oracle-style sequence that generates hi values. + + +

+ This id generation strategy is specified in the mapping file as + + <generator class="seqhilo"> + <param name="sequence">uid_sequence</param> + <param name="max_lo">max_lo_value</param> + <param name="schema">db_schema</param> + </generator> + +

+

+ The sequence parameter is required, the max_lo and schema are optional. +

+

+ The user may specify a max_lo value to determine how often new hi values are + fetched. If sequences are not avaliable, TableHiLoGenerator might be an + alternative. +

+
+
+ + + The name of the maximum low value parameter. + + + + + Configures the SequenceHiLoGenerator by reading the value of sequence, max_lo, + and schema from the parms parameter. + + The the identifier should be. + An of Param values that are keyed by parameter name. + The to help with Configuration. + + + + Generate an , , or + for the identifier by using a database sequence. + + The this id is being generated in. + The entity for which the id is being generated. + The new identifier as a , , or . + + + + A generator which combines sequence generation with immediate retrieval + by attaching a output parameter to the SQL command + In this respect it works much like ANSI-SQL IDENTITY generation. + + + + + An that uses a database table to store the last + generated value. + + +

+ It is not intended that applications use this strategy directly. However, + it may be used to build other (efficient) strategies. The return type is + System.Int32 +

+

+ The hi value MUST be fetched in a separate transaction to the ISession + transaction so the generator must be able to obtain a new connection and commit it. + Hence this implementation may not be used when the user is supplying connections. +

+

+ The mapping parameters table and column are required. +

+
+
+ + + An additional where clause that is added to + the queries against the table. + + + + + The name of the column parameter. + + + + + The name of the table parameter. + + + + Default column name + + + Default table name + + + + Configures the TableGenerator by reading the value of table, + column, and schema from the parms parameter. + + The the identifier should be. + An of Param values that are keyed by parameter name. + The to help with Configuration. + + + + Generate a , , or + for the identifier by selecting and updating a value in a table. + + The this id is being generated in. + The entity for which the id is being generated. + The new identifier as a , , or . + + + + The SQL required to create the database objects for a TableGenerator. + + The to help with creating the sql. + + An array of objects that contain the Dialect specific sql to + create the necessary database objects and to create the first value as 1 + for the TableGenerator. + + + + + The SQL required to remove the underlying database objects for a TableGenerator. + + The to help with creating the sql. + + A that will drop the database objects for the TableGenerator. + + + + + Return a key unique to the underlying database objects for a TableGenerator. + + + The configured table name. + + + + + An that returns an Int64, constructed using + a hi/lo algorithm. + + +

+ This id generation strategy is specified in the mapping file as + + <generator class="hilo"> + <param name="table">table</param> + <param name="column">id_column</param> + <param name="max_lo">max_lo_value</param> + <param name="schema">db_schema</param> + </generator> + +

+

+ The table and column parameters are required, the max_lo and + schema are optional. +

+

+ The hi value MUST be fecthed in a separate transaction to the ISession + transaction so the generator must be able to obtain a new connection and + commit it. Hence this implementation may not be used when the user is supplying + connections. In that case a would be a + better choice (where supported). +

+
+
+ + + The name of the max lo parameter. + + + + + Configures the TableHiLoGenerator by reading the value of table, + column, max_lo, and schema from the parms parameter. + + The the identifier should be. + An of Param values that are keyed by parameter name. + The to help with Configuration. + + + + Generate a for the identifier by selecting and updating a value in a table. + + The this id is being generated in. + The entity for which the id is being generated. + The new identifier as a . + + + + An that returns a string of length + 32, 36, or 38 depending on the configuration. + + +

+ This id generation strategy is specified in the mapping file as + + <generator class="uuid.hex"> + <param name="format">format_string</param> + <param name="seperator">seperator_string</param> + </generator> + +

+

+ The format and seperator parameters are optional. +

+

+ The identifier string will consist of only hex digits. Optionally, the identifier string + may be generated with enclosing characters and seperators between each component + of the UUID. If there are seperators then the string length will be 36. If a format + that has enclosing brackets is used, then the string length will be 38. +

+

+ format is either + "N" (xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx), + "D" (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx), + "B" ({xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}), + or "P" ((xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)). These formats are described in + the Guid.ToString(String) method. + If no format is specified the default is "N". +

+

+ seperator is the char that will replace the "-" if specified. If no value is + configured then the default seperator for the format will be used. If the format "D", "B", or + "P" is specified, then the seperator will replace the "-". If the format is "N" then this + parameter will be ignored. +

+

+ This class is based on +

+
+
+ + + Generate a new for the identifier using the "uuid.hex" algorithm. + + The this id is being generated in. + The entity for which the id is being generated. + The new identifier as a . + + + + Configures the UUIDHexGenerator by reading the value of format and + seperator from the parms parameter. + + The the identifier should be. + An of Param values that are keyed by parameter name. + The to help with Configuration. + + + + Generate a Guid into a string using the format. + + A new Guid string + + + + An that returns a string of length + 16. + + +

+ This id generation strategy is specified in the mapping file as + <generator class="uuid.string" /> +

+ + The identifier string will NOT consist of only alphanumeric characters. Use + this only if you don't mind unreadable identifiers. + + + This impelementation was known to be incompatible with Postgres. + +
+
+ + + Generate a new for the identifier using the "uuid.string" algorithm. + + The this id is being generated in. + The entity for which the id is being generated. + The new identifier as a . + + + + Base class to create queries in "detached mode" where the NHibernate session is not available. + + + + + The behaviour of each method is basically the same of methods. + The main difference is on : + If you mix with named parameters setter, if same param name are found, + the value of the parameter setter override the value read from the POCO. + + + + + Interface to create queries in "detached mode" where the NHibernate session is not available. + All methods have the same semantics as the corresponding methods of the interface. + + + + + Get an executable instance of , + to actually run the query. + + + + Set the maximum number of rows to retrieve. + + The maximum number of rows to retreive. + + + + Sets the first row to retrieve. + + The first row to retreive. + + + + Enable caching of this query result set. + + Should the query results be cacheable? + + + Set the name of the cache region. + The name of a query cache region, or + for the default query cache + + + + Entities retrieved by this query will be loaded in + a read-only mode where Hibernate will never dirty-check + them or make changes persistent. + + Enable/Disable read -only mode + + + + The timeout for the underlying ADO query + + + + + Set a fetch size for the underlying ADO query. + the fetch size + + + + Set the lockmode for the objects idententified by the + given alias that appears in the FROM clause. + + alias a query alias, or this for a collection filter + + + + Add a comment to the generated SQL. + a human-readable string + + + + Bind a value to an indexed parameter. + + Position of the parameter in the query, numbered from 0 + The possibly null parameter value + The Hibernate type + + + + Bind a value to a named query parameter + + The name of the parameter + The possibly null parameter value + The NHibernate . + + + + Bind a value to an indexed parameter, guessing the Hibernate type from + the class of the given object. + + The position of the parameter in the query, numbered from 0 + The non-null parameter value + + + + Bind a value to a named query parameter, guessing the NHibernate + from the class of the given object. + + The name of the parameter + The non-null parameter value + + + + Bind multiple values to a named query parameter. This is useful for binding a list + of values to an expression such as foo.bar in (:value_list) + + The name of the parameter + A collection of values to list + The Hibernate type of the values + + + + Bind multiple values to a named query parameter, guessing the Hibernate + type from the class of the first object in the collection. This is useful for binding a list + of values to an expression such as foo.bar in (:value_list) + + The name of the parameter + A collection of values to list + + + + Bind the property values of the given object to named parameters of the query, + matching property names with parameter names and mapping property types to + Hibernate types using heuristics. + + Any POCO + + + + Bind an instance of a to an indexed parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + A non-null instance of a . + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + + + + Bind an instance of a array to an indexed parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + A non-null instance of a array. + + + + Bind an instance of a array to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a array. + + + + Bind an instance of a to an indexed parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + A non-null instance of a . + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + + + + Bind an instance of a to an indexed parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + A non-null instance of a . + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + + + + Bind an instance of a to an indexed parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + A non-null instance of a . + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + + + + Bind an instance of a to an indexed parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + A non-null instance of a . + + + + Bind an instance of a to a named parameter + using an NHibernate . + + A non-null instance of a . + The name of the parameter + + + + Bind an instance of a to an indexed parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + A non-null instance of a . + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + + + + Bind an instance of a to an indexed parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + A non-null instance of a . + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + + + + Bind an instance of a mapped persistent class to an indexed parameter. + + Position of the parameter in the query string, numbered from 0 + A non-null instance of a persistent class + + + + Bind an instance of a mapped persistent class to a named parameter. + + The name of the parameter + A non-null instance of a persistent class + + + + Bind an instance of a persistent enumeration class to an indexed parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + A non-null instance of a persistent enumeration + + + + Bind an instance of a persistent enumeration class to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a persistent enumeration + + + + Bind an instance of a to an indexed parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + A non-null instance of a . + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + + + + Bind an instance of a to an indexed parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + A non-null instance of a . + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + + + + Bind an instance of a to an indexed parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + A non-null instance of a . + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + + + + Bind an instance of a to an indexed parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + A non-null instance of a . + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + + + + Bind an instance of a to an indexed parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + A non-null instance of a . + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + + + + Bind an instance of a to an indexed parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + A non-null instance of a . + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + + + + Bind an instance of a to an indexed parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + A non-null instance of a . + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + An instance of a . + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + An instance of a . + + + + Override the current session flush mode, just for this query. + + + + + Set a strategy for handling the query results. This can be used to change + "shape" of the query result. + + + + + Set the value to ignore unknown parameters names. + + True to ignore unknown parameters names. + + + Override the current session cache mode, just for this query. + The cache mode to use. + this (for method chaining) + + + + Interface for DetachedQuery implementors. + + + When you are working with queries in "detached mode" you may need some additional services like clone, + copy of parameters from another query and so on. + + + + + Copy all properties to a given . + + The given . + + Usually the implementation use to set properties to the . + This mean that existing properties are merged/overriden. + + + + + Set only parameters to a given . + + The given . + + Existing parameters are merged/overriden. + + + + + Override all properties reading new values from a given . + + The given origin. + + + + Override all parameters reading new values from a given . + + The given origin. + + + Override the current session cache mode, just for this query. + The cache mode to use. + this (for method chaining) + + + + Fill all properties. + + The . + + Query properties are overriden/merged. + + + + + Copy all properties to a given . + + The given . + + The method use to set properties of . + + + + + Set only parameters to a given . + + The given . + + The method use to set properties of . + Existing parameters in are merged/overriden. + + + + + Clear all existing parameters and copy new parameters from a given origin. + + The origin of parameters. + The current instance + If is null. + + + + Abstract implementation of the IQuery interface. + + + + + An object-oriented representation of a NHibernate query. + + + An IQuery instance is obtained by calling . + Key features of this interface include: + + + Paging: A particular page of the result set may be selected by calling + , . The generated SQL + depends on the capabilities of the . Some + Dialects are for databases that have built in paging (LIMIT) and those capabilities + will be used to limit the number of records returned by the SQL statement. + If the database does not support LIMITs then all of the records will be returned, + but the objects created will be limited to the specific results requested. + + + Named parameters + + + Ability to return 'read-only' entities + + + + Named query parameters are tokens of the form :name in the query string. For example, a + value is bound to the Int32 parameter :foo by calling: + + SetParameter("foo", foo, NHibernateUtil.Int32); + + A name may appear multiple times in the query string. + + + Unnamed parameters ? are also supported. To bind a value to an unnamed + parameter use a Set method that accepts an Int32 positional argument - numbered from + zero. + + + You may not mix and match unnamed parameters and named parameters in the same query. + + + Queries are executed by calling or . A query + may be re-executed by subsequent invocations. Its lifespan is, however, bounded by the lifespan + of the ISession that created it. + + + Implementors are not intended to be threadsafe. + + + + + + Return the query results as an . If the query contains multiple results + per row, the results are returned in an instance of object[]. + + +

+ Entities returned as results are initialized on demand. The first SQL query returns + identifiers only. +

+

+ This is a good strategy to use if you expect a high number of the objects + returned to be already loaded in the or in the 2nd level cache. +

+
+
+ + + Strongly-typed version of . + + + + + + + Return the query results as an . If the query contains multiple results per row, + the results are returned in an instance of object[]. + + The filled with the results. + + This is a good strategy to use if you expect few of the objects being returned are already loaded + or if you want to fill the 2nd level cache. + + + + + Return the query results an place them into the . + + The to place the results in. + + + + Strongly-typed version of . + + + + + Convenience method to return a single instance that matches + the query, or null if the query returns no results. + + the single result or + + Thrown when there is more than one matching result. + + + + + Strongly-typed version of . + + + + + Execute the update or delete statement. + + The number of entities updated or deleted. + + + + Set the maximum number of rows to retrieve. + + The maximum number of rows to retreive. + + + + Sets the first row to retrieve. + + The first row to retreive. + + + + Set the read-only mode for entities (and proxies) loaded by this query. This setting + overrides the default setting for the session (see ). + + + + Read-only entities can be modified, but changes are not persisted. They are not + dirty-checked and snapshots of persistent state are not maintained. + + + When a proxy is initialized, the loaded entity will have the same read-only setting + as the uninitialized proxy, regardless of the session's current setting. + + + The read-only setting has no impact on entities or proxies returned by the criteria + that existed in the session before the criteria was executed. + + + + If true, entities (and proxies) loaded by the query will be read-only. + + this (for method chaining) + + + + + Enable caching of this query result set. + + Should the query results be cacheable? + + + Set the name of the cache region. + The name of a query cache region, or + for the default query cache + + + + The timeout for the underlying ADO query + + + + + Set a fetch size for the underlying ADO query. + the fetch size + + + + Set the lockmode for the objects idententified by the + given alias that appears in the FROM clause. + + alias a query alias, or this for a collection filter + + + + Add a comment to the generated SQL. + a human-readable string + + + + Override the current session flush mode, just for this query. + + + + Override the current session cache mode, just for this query. + The cache mode to use. + this (for method chaining) + + + + Bind a value to an indexed parameter. + + Position of the parameter in the query, numbered from 0 + The possibly null parameter value + The NHibernate type + + + + Bind a value to a named query parameter + + The name of the parameter + The possibly null parameter value + The NHibernate . + + + + Bind a value to an indexed parameter. + + Position of the parameter in the query, numbered from 0 + The possibly null parameter value + The parameter's + + + + Bind a value to a named query parameter + + The name of the parameter + The possibly null parameter value + The parameter's + + + + Bind a value to an indexed parameter, guessing the NHibernate type from + the class of the given object. + + The position of the parameter in the query, numbered from 0 + The non-null parameter value + + + + Bind a value to a named query parameter, guessing the NHibernate + from the class of the given object. + + The name of the parameter + The non-null parameter value + + + + Bind multiple values to a named query parameter. This is useful for binding a list + of values to an expression such as foo.bar in (:value_list) + + The name of the parameter + A collection of values to list + The NHibernate type of the values + + + + Bind multiple values to a named query parameter, guessing the NHibernate + type from the class of the first object in the collection. This is useful for binding a list + of values to an expression such as foo.bar in (:value_list) + + The name of the parameter + A collection of values to list + + + + Bind the property values of the given object to named parameters of the query, + matching property names with parameter names and mapping property types to + NHibernate types using heuristics. + + Any PONO + + + + Bind an instance of a to an indexed parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + A non-null instance of a . + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + + + + Bind an instance of a array to an indexed parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + A non-null instance of a array. + + + + Bind an instance of a array to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a array. + + + + Bind an instance of a to an indexed parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + A non-null instance of a . + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + + + + Bind an instance of a to an indexed parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + A non-null instance of a . + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + + + + Bind an instance of a to an indexed parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + A non-null instance of a . + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + + + + Bind an instance of a to an indexed parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + A non-null instance of a . + + + + Bind an instance of a to a named parameter + using an NHibernate . + + A non-null instance of a . + The name of the parameter + + + + Bind an instance of a to an indexed parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + A non-null instance of a . + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + + + + Bind an instance of a to an indexed parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + A non-null instance of a . + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + + + + Bind an instance of a persistent enumeration class to an indexed parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + A non-null instance of a persistent enumeration + + + + Bind an instance of a persistent enumeration class to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a persistent enumeration + + + + Bind an instance of a to an indexed parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + A non-null instance of a . + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + + + + Bind an instance of a to an indexed parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + A non-null instance of a . + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + + + + Bind an instance of a to an indexed parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + A non-null instance of a . + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + + + + Bind an instance of a to an indexed parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + A non-null instance of a . + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + + + + Bind an instance of a to an indexed parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + A non-null instance of a . + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + + + + Bind an instance of a to an indexed parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + A non-null instance of a . + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + + + + Bind an instance of a to an indexed parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + A non-null instance of a . + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The position of the parameter in the query string, numbered from 0 + An instance of a . + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + An instance of a . + + + + Bind an instance of a mapped persistent class to an indexed parameter. + + Position of the parameter in the query string, numbered from 0 + A non-null instance of a persistent class + + + + Bind an instance of a mapped persistent class to a named parameter. + + The name of the parameter + A non-null instance of a persistent class + + + + Set a strategy for handling the query results. This can be used to change + "shape" of the query result. + + + + + Get a enumerable that when enumerated will execute + a batch of queries in a single database roundtrip + + + + + + + Get an IFutureValue instance, whose value can be retrieved through + its Value property. The query is not executed until the Value property + is retrieved, which will execute other Future queries as well in a + single roundtrip + + + + + + + The query string + + + + + The NHibernate types of the query result set. + + + + Return the HQL select clause aliases (if any) + An array of aliases as strings + + + + The names of all named parameters of the query + + The parameter names, in no particular order + + + + Will entities (and proxies) returned by the query be loaded in read-only mode? + + + + If the query's read-only setting is not initialized (with ), + the value of the session's property is + returned instead. + + + The value of this property has no effect on entities or proxies returned by the + query that existed in the session before the query was executed. + + + + true if entities and proxies loaded by the query will be put in read-only mode, otherwise false. + + + + + + Perform parameter validation. Used prior to executing the encapsulated query. + + + if true, the first ? will not be verified since + its needed for e.g. callable statements returning a out parameter + + + + + Guesses the from the param's value. + + The object to guess the of. + An for the object. + + Thrown when the param is null because the + can't be guess from a null value. + + + + + Guesses the from the . + + The to guess the of. + An for the . + + Thrown when the clazz is null because the + can't be guess from a null type. + + + + + Warning: adds new parameters to the argument by side-effect, as well as mutating the query string! + + + + + Warning: adds new parameters to the argument by side-effect, as well as mutating the query string! + + + + + + + Override the current session cache mode, just for this query. + + The cache mode to use. + this (for method chaining) + + + + + + + Warning: adds new parameters to the argument by side-effect, as well as mutating the query expression tree! + + + + Functionality common to stateless and stateful sessions + + + + Implementation of the interface for collection filters. + + + + + Default implementation of the , + for "ordinary" HQL queries (not collection filters) + + + + + + Implementation of the interface + + + + + Criteria is a simplified API for retrieving entities by composing + objects. + + + + Using criteria is a very convenient approach for functionality like "search" screens + where there is a variable number of conditions to be placed upon the result set. + + + The Session is a factory for ICriteria. Expression instances are usually obtained via + the factory methods on . eg: + + + IList cats = session.CreateCriteria(typeof(Cat)) + .Add(Expression.Like("name", "Iz%")) + .Add(Expression.Gt("weight", minWeight)) + .AddOrder(Order.Asc("age")) + .List(); + + You may navigate associations using + or . eg: + + IList<Cat> cats = session.CreateCriteria<Cat> + .CreateCriteria("kittens") + .Add(Expression.like("name", "Iz%")) + .List<Cat>(); + + + You may specify projection and aggregation using Projection instances obtained + via the factory methods on Projections. eg: + + IList<Cat> cats = session.CreateCriteria<Cat> + .SetProjection( + Projections.ProjectionList() + .Add(Projections.RowCount()) + .Add(Projections.Avg("weight")) + .Add(Projections.Max("weight")) + .Add(Projections.Min("weight")) + .Add(Projections.GroupProperty("color"))) + .AddOrder(Order.Asc("color")) + .List<Cat>(); + + + + + + + Used to specify that the query results will be a projection (scalar in + nature). Implicitly specifies the projection result transformer. + + The projection representing the overall "shape" of the + query results. + This instance (for method chaining) + + + The individual components contained within the given + determines the overall "shape" of the query result. + + + + + + Add an Expression to constrain the results to be retrieved. + + + + + + + An an Order to the result set + + + + + + Specify an association fetching strategy. Currently, only + one-to-many and one-to-one associations are supported. + + A dot separated property path. + The Fetch mode. + + + + + Set the lock mode of the current entity + + the lock mode + + + + + Set the lock mode of the aliased entity + + an alias + the lock mode + + + + + Join an association, assigning an alias to the joined entity + + + + + + + + Join an association using the specified join-type, assigning an alias to the joined + association + + + + The type of join to use. + this (for method chaining) + + + + Join an association using the specified join-type, assigning an alias to the joined + association + + + + The type of join to use. + The criteria to be added to the join condition (ON clause) + this (for method chaining) + + + + Create a new , "rooted" at the associated entity + + + + + + + Create a new , "rooted" at the associated entity, + using the specified join type. + + A dot-separated property path + The type of join to use + The created "sub criteria" + + + + Create a new , "rooted" at the associated entity, + assigning the given alias + + + + + + + + Create a new , "rooted" at the associated entity, + assigning the given alias and using the specified join type. + + A dot-separated property path + The alias to assign to the joined association (for later reference). + The type of join to use. + The created "sub criteria" + + + + Create a new , "rooted" at the associated entity, + assigning the given alias and using the specified join type. + + A dot-separated property path + The alias to assign to the joined association (for later reference). + The type of join to use. + The criteria to be added to the join condition (ON clause) + The created "sub criteria" + + + + Set a strategy for handling the query results. This determines the + "shape" of the query result set. + + + + + + + + + + Set a limit upon the number of objects to be retrieved + + + + + + Set the first result to be retrieved + + + + + Set a fetch size for the underlying ADO query. + the fetch size + this (for method chaining) + + + + Set a timeout for the underlying ADO.NET query + + + + + + + Enable caching of this query result set + + + + + + + Set the name of the cache region. + + the name of a query cache region, or + for the default query cache + + + + Add a comment to the generated SQL. + a human-readable string + this (for method chaining) + + + Override the flush mode for this particular query. + The flush mode to use. + this (for method chaining) + + + Override the cache mode for this particular query. + The cache mode to use. + this (for method chaining) + + + + Get the results + + + + + + Convenience method to return a single instance that matches + the query, or null if the query returns no results. + + the single result or + + If there is more than one matching result + + + + + Get a enumerable that when enumerated will execute + a batch of queries in a single database roundtrip + + + + + + + Get an IFutureValue instance, whose value can be retrieved through + its Value property. The query is not executed until the Value property + is retrieved, which will execute other Future queries as well in a + single roundtrip + + + + + + + Set the read-only mode for entities (and proxies) loaded by this Criteria. This + setting overrides the default for the session (see ). + + + + To set the default read-only setting for entities and proxies that are loaded + into the session, see . + + + Read-only entities can be modified, but changes are not persisted. They are not + dirty-checked and snapshots of persistent state are not maintained. + + + When a proxy is initialized, the loaded entity will have the same read-only setting + as the uninitialized proxy has, regardless of the session's current setting. + + + The read-only setting has no impact on entities or proxies returned by the criteria + that existed in the session before the criteria was executed. + + + + If true, entities (and proxies) loaded by the criteria will be read-only. + + this (for method chaining) + + + + + + Get the results and fill the + + The list to fill with the results. + + + + Strongly-typed version of . + + + + + Strongly-typed version of . + + + + + Clear all orders from criteria. + + + + + Allows to get a sub criteria by path. + Will return null if the criteria does not exists. + + The path. + + + + Alows to get a sub criteria by alias. + Will return null if the criteria does not exists + + The alias. + + + + + Gets the root entity type if available, throws otherwise + + + This is an NHibernate specific method, used by several dependent + frameworks for advance integration with NHibernate. + + + + + Get the alias of the entity encapsulated by this criteria instance. + + The alias for the encapsulated entity. + + + + Was the read-only mode explicitly initialized? + + true if the read-only mode was explicitly initialized, otherwise false. + + /// + + + + Will entities (and proxies) loaded by this Criteria be put in read-only mode? + + + + If the read-only setting was not initialized, then the value of the session's + property is returned instead. + + + The read-only setting has no impact on entities or proxies returned by the + Criteria that existed in the session before the Criteria was executed. + + + + true if entities and proxies loaded by the criteria will be put in read-only mode, + otherwise false. + + + + + + + + + Override the cache mode for this particular query. + The cache mode to use. + this (for method chaining) + + + + + + + + + Override the cache mode for this particular query. + The cache mode to use. + this (for method chaining) + + + + The Clone is supported only by a root criteria. + + The clone of the root criteria. + + + + Named query in "detached mode" where the NHibernate session is not available. + + + + + + + + + Create a new instance of for a named query string defined in the mapping file. + + The name of a query defined externally. + + The query can be either in HQL or SQL format. + + + + + Get an executable instance of , to actually run the query. + + + + + Creates a new DetachedNamedQuery that is a deep copy of the current instance. + + The clone. + + + + Get the query name. + + + + + Query in "detached mode" where the NHibernate session is not available. + + + + + + + + Create a new instance of for the given query string. + + A hibernate query string + + + + Get an executable instance of , to actually run the query. + + + + + Creates a new DetachedQuery that is a deep copy of the current instance. + + The clone. + + + + Get the HQL string. + + + + + Provides an wrapper over the results of an . + + + This is the IteratorImpl in H2.0.3 + + + + + Create an wrapper over an . + + The to enumerate over. + The used to create the . + The to use to load objects. + + The s contained in the . + The names of the columns in the . + The that should be applied to the . + Instantiator of the result holder (used for "select new SomeClass(...)" queries). + + The should already be positioned on the first record in . + + + + + Returns an enumerator that can iterate through the query results. + + + An that can be used to iterate through the query results. + + + + + Advances the enumerator to the next element of the query results. + + + if the enumerator was successfully advanced to the next query results + ; if the enumerator has passed the end of the query results. + + + + + A flag to indicate if Dispose() has been called. + + + + + Finalizer that ensures the object is correctly disposed of. + + + + + Takes care of freeing the managed and unmanaged resources that + this class is responsible for. + + + + + Takes care of freeing the managed and unmanaged resources that + this class is responsible for. + + Indicates if this EnumerableImpl is being Disposed of or Finalized. + + The command is closed and the reader is disposed. This allows other ADO.NET + related actions to occur without needing to move all the way through the + EnumerableImpl. + + + + + Gets the current element in the query results. + + + The current element in the query results which is either an object or + an object array. + + + If the only returns one type of Entity then an object will + be returned. If this is a multi-column resultset then an object array will be + returned. + + + + + Subquery type enumeration + + + + exact + + + all + + + some + + + + Converts lambda expressions to NHibernate criterion/order + + + + + Invoke the expression to extract its runtime value + + + + + Retrieves the projection for the expression + + + + + Retrieves the name of the property from a member expression + + An expression tree that can contain either a member, or a conversion from a member. + If the member is referenced from a null valued object, then the container is treated as an alias. + The name of the member property + + + + Retrieves the name of the property from a member expression (without leading member access) + + + + + Retrieves a detached criteria from an appropriate lambda expression + + Expresson for detached criteria using .As<>() extension"/> + Evaluated detached criteria + + + + Convert a lambda expression to NHibernate ICriterion + + The type of the lambda expression + The lambda expression to convert + NHibernate ICriterion + + + + Convert a lambda expression to NHibernate ICriterion + + The lambda expression to convert + NHibernate ICriterion + + + + Convert a lambda expression to NHibernate Order + + The type of the lambda expression + The lambda expression to convert + The appropriate order delegate (order direction) + NHibernate Order + + + + Convert a lambda expression to NHibernate Order + + The lambda expression to convert + The appropriate order delegate (order direction) + NHibernate Order + + + + Convert a lambda expression to NHibernate Order + + The lambda expression to convert + The appropriate order delegate (order direction) + NHibernate Order + + + + Convert a lambda expression to NHibernate Order + + The lambda expression to convert + The appropriate order delegate (order direction) + The appropriate order delegate (order direction) + NHibernate Order + + + + Convert a lambda expression to NHibernate subquery AbstractCriterion + + type of member expression + type of subquery + lambda expression to convert + NHibernate.ICriterion.AbstractCriterion + + + + Convert a lambda expression to NHibernate subquery AbstractCriterion + + type of subquery + lambda expression to convert + NHibernate.ICriterion.AbstractCriterion + + + + Register a custom method for use in a QueryOver expression + + Lambda expression demonstrating call of custom method + function to convert MethodCallExpression to ICriterion + + + + Register a custom projection for use in a QueryOver expression + + Lambda expression demonstrating call of custom method + function to convert MethodCallExpression to IProjection + + + + Register a custom projection for use in a QueryOver expression + + Lambda expression demonstrating call of custom method + function to convert MethodCallExpression to IProjection + + + + Retreive the property name from a supplied PropertyProjection + Note: throws is the supplied IProjection is not a PropertyProjection + + + + + Warning: adds new parameters to the argument by side-effect, as well as mutating the query expression tree! + + + + + + + + + Type definition of Filter. Filter defines the user's view into enabled dynamic filters, + allowing them to set filter parameter values. + + + + + Set the named parameter's value list for this filter. + + The parameter's name. + The values to be applied. + This FilterImpl instance (for method chaining). + + + + Set the named parameter's value list for this filter. Used + in conjunction with IN-style filter criteria. + + The parameter's name. + The values to be expanded into an SQL IN list. + This FilterImpl instance (for method chaining). + + + + Set the named parameter's value list for this filter. Used + in conjunction with IN-style filter criteria. + + The parameter's name. + The values to be expanded into an SQL IN list. + This FilterImpl instance (for method chaining). + + + + Perform validation of the filter state. This is used to verify the + state of the filter after its enablement and before its use. + + + + + + Get the name of this filter. + + This filter's name. + + + + Get the filter definition containing additional information about the + filter (such as default-condition and expected parameter names/types). + + The filter definition + + + + Set the named parameter's value for this filter. + + The parameter's name. + The value to be applied. + This FilterImpl instance (for method chaining). + + + + Set the named parameter's value list for this filter. Used + in conjunction with IN-style filter criteria. + + The parameter's name. + The values to be expanded into an SQL IN list. + This FilterImpl instance (for method chaining). + + + + Set the named parameter's value list for this filter. Used + in conjunction with IN-style filter criteria. + + The parameter's name. + The values to be expanded into an SQL IN list. + This FilterImpl instance (for method chaining). + + + + Perform validation of the filter state. This is used to verify the + state of the filter after its enablement and before its use. + + + + + Get the name of this filter. + + + + + Helper methods for rendering log messages and exception messages + + + + + Generate small message that can be used in traces and exception messages. + + The to create the string from. + The identifier of the object. + A descriptive in the format of [classname#id] + + + + Generate small message that can be used in traces and exception messages. + + The for the class in question. + The identifier of the object. + The . + A descriptive in the format of [classname#id] + + + + Generate small message that can be used in traces and exception messages. + + The for the class in question. + The identifier of the object. + The . + The NHibernate type of the identifier. + A descriptive in the format of [classname#id] + + + + Generate small message that can be used in traces and exception messages. + + The for the class in question + The id + A descriptive in the form [FooBar#id] + + + + Generate small message that can be used in traces and exception messages. + + The for the class in question + A descriptive in the form [FooBar] + + + + Generate small message that can be used in traces and exception messages. + + The for the class in question + The id + A descriptive in the form [collectionrole#id] + + + + Generate small message that can be used in traces and exception messages. + + The for the class in question + The id + A descriptive in the form [collectionrole#id] + + + + Generate an info message string relating to a given property value + for an entity. + + The entity name + The name of the property + The property value. + An info string, in the form [Foo.bars#1] + + + + Generate an info message string relating to a particular managed + collection. Attempts to intelligently handle property-refs issues + where the collection key is not the same as the owner key. + + The persister for the collection + The collection itself + The collection key + The session + An info string, in the form [Foo.bars#1] + + + + Generate an info message string relating to a particular managed + collection. + + The persister for the collection + The id value of the owner + The session factory + An info string, in the form [Foo.bars#1] + + + + Generate an info message string relating to a particular managed collection. + + The persister for the collection + The id value of the owner + The session factory + An info string, in the form [Foo.bars#1] + + + + Generate an info message string relating to a particular entity, + based on the given entityName and id. + + The defined entity name. + The entity id value. + An info string, in the form [FooBar#1]. + + + + Combines several queries into a single DB call + + + + + Get all the results + + + + + Adds the specified criteria to the query. The result will be contained in a + + Return results in a + The criteria. + + + + + Adds the specified criteria to the query. The result will be contained in a + + The criteria. + + + + + Adds the specified criteria to the query, and associates it with the given key. The result will be contained in a + + The key + The criteria + + + + + Adds the specified detached criteria. The result will be contained in a + + The detached criteria. + + + + + Adds the specified detached criteria, and associates it with the given key. The result will be contained in a + + The key + The detached criteria + + + + + Adds the specified criteria to the query + + The criteria. + + + + + Adds the specified criteria to the query, and associates it with the given key + + The key + The criteria + + + + + Adds the specified detached criteria. + + The detached criteria. + + + + + Adds the specified detached criteria, and associates it with the given key + + The key + The detached criteria + + + + + Adds the specified IQueryOver to the query. The result will be contained in a + + Return results in a + The IQueryOver. + + + + + Adds the specified IQueryOver to the query. The result will be contained in a + + The IQueryOver. + + + + + Adds the specified IQueryOver to the query. The result will be contained in a + + The IQueryOver. + + + + + Adds the specified IQueryOver to the query, and associates it with the given key. The result will be contained in a + + The key + The IQueryOver + + + + + Adds the specified IQueryOver to the query, and associates it with the given key. The result will be contained in a + + The key + The IQueryOver + + + + + Sets whatevert this criteria is cacheable. + + if set to true [cachable]. + + + + Set the cache region for thie criteria + + The region + + + + + Force a cache refresh + + + + + + + Sets the result transformer for all the results in this mutli criteria instance + + The result transformer. + + + + + Returns the result of one of the Criteria based on the key + + The key + + + + + Initializes a new instance of the class. + + The session. + The factory. + + + Return a cacheable "disassembled" representation of the object. + the value to cache + the session + optional parent entity object (needed for collections) + the disassembled, deep cloned state + + + Reconstruct the object from its cached "disassembled" state. + the disassembled state from the cache + the session + the parent entity object + the the object + + + + Called before assembling a query result set from the query cache, to allow batch fetching + of entities missing from the second-level cache. + + + + + Combines sevaral queries into a single database call + + + + + Get all the results + + + The result is a IList of IList. + + + + + Adds the specified query to the query. The result will be contained in a + + Return results in a + The query. + The instance for method chain. + + + + Add the specified HQL query to the multi query. The result will be contained in a + + The query + + + + Add the specified HQL query to the multi query, and associate it with the given key. The result will be contained in a + + The key to get results of the specific query. + The query + The instance for method chain. + + + + + Add the specified HQL Query to the multi query, and associate it with the given key. The result will be contained in a + + The key to get results of the specific query. + The query + The instance for method chain. + + + + + Add the specified HQL query to the multi query. The result will be contained in a + + The query + The instance for method chain. + + + + Add a named query to the multi query. The result will be contained in a + + The query + The instance for method chain. + + + + Add a named query to the multi query, and associate it with the given key. The result will be contained in a + + The key to get results of the specific query. + The query + The instance for method chain. + + + + + Add the specified HQL query to the multi query, and associate it with the given key + + The key to get results of the specific query. + The query + The instance for method chain. + + + + + Add the specified HQL query to the multi query + + The query + The instance for method chain. + + + + Add the specified HQL Query to the multi query, and associate it with the given key + + The key to get results of the specific query. + The query + The instance for method chain. + + + + + Add the specified HQL query to the multi query + + The instance for method chain. + + + + Add a named query to the multi query + + The query + The instance for method chain. + + + + Add a named query to the multi query, and associate it with the given key + + The key to get results of the specific query. + The query + The instance for method chain. + + + + + Enable caching of this query result set. + + Should the query results be cacheable? + The instance for method chain. + + + Set the name of the cache region. + The name of a query cache region, or + for the default query cache + The instance for method chain. + + + Should the query force a refresh of the specified query cache region? + This is particularly useful in cases where underlying data may have been + updated via a separate process (i.e., not modified through Hibernate) and + allows the application to selectively refresh the query cache regions + based on its knowledge of those events. + Should the query result in a forcible refresh of + the query cache? + The instance for method chain. + + + + The timeout for the underlying ADO query + + + The instance for method chain. + + + + Bind a value to a named query parameter + + The name of the parameter + The possibly null parameter value + The NHibernate . + The instance for method chain. + + + + Bind a value to a named query parameter, guessing the NHibernate + from the class of the given object. + + The name of the parameter + The non-null parameter value + The instance for method chain. + + + + Bind multiple values to a named query parameter. This is useful for binding a list + of values to an expression such as foo.bar in (:value_list) + + The name of the parameter + A collection of values to list + The Hibernate type of the values + The instance for method chain. + + + + Bind multiple values to a named query parameter, guessing the Hibernate + type from the class of the first object in the collection. This is useful for binding a list + of values to an expression such as foo.bar in (:value_list) + + The name of the parameter + A collection of values to list + The instance for method chain. + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + The instance for method chain. + + + + Bind an instance of a array to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a array. + The instance for method chain. + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + The instance for method chain. + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + The instance for method chain. + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + The instance for method chain. + + + + Bind an instance of a to a named parameter + using an NHibernate . + + A non-null instance of a . + The name of the parameter + The instance for method chain. + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + The instance for method chain. + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + The instance for method chain. + + + + Bind an instance of a mapped persistent class to a named parameter. + + The name of the parameter + A non-null instance of a persistent class + The instance for method chain. + + + + Bind an instance of a persistent enumeration class to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a persistent enumeration + The instance for method chain. + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + The instance for method chain. + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + The instance for method chain. + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + The instance for method chain. + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + The instance for method chain. + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + The instance for method chain. + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + An instance of a . + The instance for method chain. + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + The instance for method chain. + + + + Bind an instance of a to a named parameter + using an NHibernate . + + The name of the parameter + A non-null instance of a . + The instance for method chain. + + + + Override the current session flush mode, just for this query. + + The instance for method chain. + + + + Set a strategy for handling the query results. This can be used to change + "shape" of the query result. + + + The will be applied after the transformer of each single query. + + The instance for method chain. + + + + Returns the result of one of the query based on the key + + The key + The instance for method chain. + + + + Return the query results of all the queries + + + + + + + an actual entity object, not a proxy! + + + + + + Concrete implementation of a SessionFactory. + + + Has the following responsibilities: + + + Caches configuration settings (immutably) + + Caches "compiled" mappings - ie. + and + + + Caches "compiled" queries (memory sensitive cache) + + + Manages PreparedStatements/IDbCommands - how true in NH? + + + Delegates IDbConnection management to the + + + Factory for instances of + + + + This class must appear immutable to clients, even if it does all kinds of caching + and pooling under the covers. It is crucial that the class is not only thread safe + , but also highly concurrent. Synchronization must be used extremely sparingly. + + + + + + + + + + + NH specific : to avoid the use of entityName for generic implementation + + this is a shortcut. + + + + Gets the hql query identified by the name. + + The name of that identifies the query. + + A hql query or if the named + query does not exist. + + + + Get the return aliases of a query + + + + Return the names of all persistent (mapped) classes that extend or implement the + given class or interface, accounting for implicit/explicit polymorphism settings + and excluding mapped subclasses/joined-subclasses of other classes in the result. + + + + + + + + + + + Closes the session factory, releasing all held resources. + + cleans up used cache regions and "stops" the cache provider. + close the ADO.NET connection + + + + + Get a new stateless session. + + + Get a new stateless session for the given ADO.NET connection. + + + + + + + + + Statistics SPI + + + Get the statistics for this session factory + + + + Gets the ICurrentSessionContext instance attached to this session factory. + + + + + Delegate to handle the scenario of an entity not found by a specified id. + + + + + Delegate method to handle the scenario of an entity not found. + + The entityName (may be the class fullname) + The requested id not founded. + + + + Resolves lookups and deserialization. + + + + This is used heavily be Deserialization. Currently a SessionFactory is not really serialized. + All that is serialized is it's name and uid. During Deserializaiton the serialized SessionFactory + is converted to the one contained in this object. So if you are serializing across AppDomains + you should make sure that "name" is specified for the SessionFactory in the hbm.xml file and that the + other AppDomain has a configured SessionFactory with the same name. If + you are serializing in the same AppDomain then there will be no problem because the uid will + be in this object. + + + + + + + + + Adds an Instance of the SessionFactory to the local "cache". + + The identifier of the ISessionFactory. + The name of the ISessionFactory. + The ISessionFactory. + The configured properties for the ISessionFactory. + + + + Removes the Instance of the SessionFactory from the local "cache". + + The identifier of the ISessionFactory. + The name of the ISessionFactory. + The configured properties for the ISessionFactory. + + + + Returns a Named Instance of the SessionFactory from the local "cache" identified by name. + + The name of the ISessionFactory. + An instantiated ISessionFactory. + + + + Returns an Instance of the SessionFactory from the local "cache" identified by UUID. + + The identifier of the ISessionFactory. + An instantiated ISessionFactory. + + + + We always set the result to use a thread static variable, on the face of it, + it looks like it is not a valid choice, since ASP.Net and WCF may decide to switch + threads on us. But, since SessionIdLoggingContext is only used inside NH calls, and since + NH calls are never async, this isn't an issue for us. + In addition to that, attempting to match to the current context has proven to be performance hit. + + + + + Concrete implementation of an , also the central, organizing component + of NHibernate's internal implementation. + + + Exposes two interfaces: itself, to the application and + to other components of NHibernate. This is where the + hard stuff is... This class is NOT THREADSAFE. + + + + + Constructor used to recreate the Session during the deserialization. + + + + + This is needed because we have to do some checking before the serialization process + begins. I don't know how to add logic in ISerializable.GetObjectData and have .net + write all of the serializable fields out. + + + + + Verify the ISession can be serialized and write the fields to the Serializer. + + + + + The fields are marked with [NonSerializable] as just a point of reference. This method + has complete control and what is serialized and those attributes are ignored. However, + this method should be in synch with the attributes for easy readability. + + + + + Once the entire object graph has been deserialized then we can hook the + collections, proxies, and entities back up to the ISession. + + + + + + Constructor used for OpenSession(...) processing, as well as construction + of sessions for GetCurrentSession(). + + The user-supplied connection to use for this session. + The factory from which this session was obtained + NOT USED + The timestamp for this session + The interceptor to be applied to this session + The entity-mode for this session + Should we auto flush before completion of transaction + Should we auto close after completion of transaction + Should we ignore exceptions in IInterceptor.BeforeTransactionCompletion + The mode by which we should release JDBC connections. + + + + Constructor used in building "child sessions". + + The parent Session + The entity mode + + + + Close the session and release all resources + + Do not call this method inside a transaction scope, use Dispose instead, since + Close() is not aware of distributed transactions + + + + + + Ensure that the locks are downgraded to + and that all of the softlocks in the have + been released. + + + + + Save a transient object. An id is generated, assigned to the object and returned + + + + + + + Save a transient object with a manually assigned ID + + + + + + + Delete a persistent object + + + + + Delete a persistent object (by explicit entity name) + + + + + + + + + + + + Give the interceptor an opportunity to override the default instantiation + + + + + + + Force an immediate flush + + + Cascade merge an entity instance + + + Cascade persist an entity instance + + + Cascade persist an entity instance during the flush process + + + Cascade refresh an entity instance + + + Cascade delete an entity instance + + + + detect in-memory changes, determine if the changes are to tables + named in the query and, if so, complete execution the flush + + + + + + + Load the data for the object with the specified id into a newly created object + using "for update", if supported. A new key will be assigned to the object. + This should return an existing proxy where appropriate. + + If the object does not exist in the database, an exception is thrown. + + + + + + + Thrown when the object with the specified id does not exist in the database. + + + + + Load the data for the object with the specified id into a newly created object + using "for update", if supported. A new key will be assigned to the object. + This should return an existing proxy where appropriate. + + If the object does not exist in the database, null is returned. + + + + + + + + + Load the data for the object with the specified id into a newly created object. + This is only called when lazily initializing a proxy. + Do NOT return a proxy. + + + + + Return the object with the specified id or throw exception if no row with that id exists. Defer the load, + return a new proxy or return an existing proxy if possible. Do not check if the object was deleted. + + + + + + + + This can be called from commit() or at the start of a List() method. + + Perform all the necessary SQL statements in a sensible order, to allow + users to repect foreign key constraints: + + Inserts, in the order they were performed + Updates + Deletion of collection elements + Insertion of collection elements + Deletes, in the order they were performed + + + + Go through all the persistent objects and look for collections they might be + holding. If they had a nonpersistable collection, substitute a persistable one + + + + + + Not for internal use + + + + + + + Get the id value for an object that is actually associated with the session. + This is a bit stricter than GetEntityIdentifierIfNotUnsaved(). + + + + + + + called by a collection that wants to initialize itself + + + + + + + + + + Finalizer that ensures the object is correctly disposed of. + + + + + Perform a soft (distributed transaction aware) close of the session + + + + + Takes care of freeing the managed and unmanaged resources that + this class is responsible for. + + Indicates if this Session is being Disposed of or Finalized. + + If this Session is being Finalized (isDisposing==false) then make sure not + to call any methods that could potentially bring this Session back to life. + + + + + remove any hard references to the entity that are held by the infrastructure + (references held by application or other persistant instances are okay) + + + + + + + + + + + + + + + + + + + + Get the ActionQueue for this session + + + + + + + Gets if the ISession is connected. + + + if the ISession is connected. + + + An ISession is considered connected if there is an (regardless + of its state) or if it the field connect is true. Meaning that it will connect + at the next operation that requires a connection. + + + + Get the statistics for this session. + + + Retrieves the configured event listeners from this event source. + + + + + + + Implements SQL query passthrough + + + An example mapping is: + + <sql-query-name name="mySqlQuery"> + <return alias="person" class="eg.Person" /> + SELECT {person}.NAME AS {person.name}, {person}.AGE AS {person.age}, {person}.SEX AS {person.sex} + FROM PERSON {person} WHERE {person}.NAME LIKE 'Hiber%' + </sql-query-name> + + + + + + Declare a "root" entity, without specifying an alias + + + + + Declare a "root" entity + + + + + Declare a "root" entity, specifying a lock mode + + + + + Declare a "root" entity, without specifying an alias + + + + + Declare a "root" entity + + + + + Declare a "root" entity, specifying a lock mode + + + + + Declare a "joined" entity + + + + + Declare a "joined" entity, specifying a lock mode + + + + + Declare a scalar query result + + + + + Use a predefined named ResultSetMapping + + + + Constructs a SQLQueryImpl given a sql query defined in the mappings. + The representation of the defined sql-query. + The session to which this SQLQueryImpl belongs. + Metadata about parameters found in the query. + + + + A command-oriented API for performing bulk operations against a database. + + + A stateless session does not implement a first-level cache nor + interact with any second-level cache, nor does it implement + transactional write-behind or automatic dirty checking, nor do + operations cascade to associated instances. Collections are + ignored by a stateless session. Operations performed via a + stateless session bypass NHibernate's event model and + interceptors. Stateless sessions are vulnerable to data + aliasing effects, due to the lack of a first-level cache. + + For certain kinds of transactions, a stateless session may + perform slightly faster than a stateful session. + + + + + Gets the stateless session implementation. + + + This method is provided in order to get the NHibernate implementation of the session from wrapper implementations. + Implementors of the interface should return the NHibernate implementation of this method. + + + An NHibernate implementation of the interface + + + + Close the stateless session and release the ADO.NET connection. + + + Insert an entity. + A new transient instance + The identifier of the instance + + + Insert a row. + The name of the entity to be inserted + A new transient instance + The identifier of the instance + + + Update an entity. + A detached entity instance + + + Update an entity. + The name of the entity to be updated + A detached entity instance + + + Delete an entity. + A detached entity instance + + + Delete an entity. + The name of the entity to be deleted + A detached entity instance + + + Retrieve a entity. + A detached entity instance + + + + Retrieve an entity. + + A detached entity instance + + + + Retrieve an entity, obtaining the specified lock mode. + + A detached entity instance + + + + Retrieve an entity, obtaining the specified lock mode. + + A detached entity instance + + + + Refresh the entity instance state from the database. + + The entity to be refreshed. + + + + Refresh the entity instance state from the database. + + The name of the entity to be refreshed. + The entity to be refreshed. + + + + Refresh the entity instance state from the database. + + The entity to be refreshed. + The LockMode to be applied. + + + + Refresh the entity instance state from the database. + + The name of the entity to be refreshed. + The entity to be refreshed. + The LockMode to be applied. + + + + Create a new instance of Query for the given HQL query string. + + Entities returned by the query are detached. + + + + Obtain an instance of for a named query string defined in + the mapping file. + + + The query can be either in HQL or SQL format. + Entities returned by the query are detached. + + + + + Create a new instance, for the given entity class, + or a superclass of an entity class. + + A class, which is persistent, or has persistent subclasses + The . + Entities returned by the query are detached. + + + + Create a new instance, for the given entity class, + or a superclass of an entity class, with the given alias. + + A class, which is persistent, or has persistent subclasses + The alias of the entity + The . + Entities returned by the query are detached. + + + + Create a new instance, for the given entity class, + or a superclass of an entity class. + + A class, which is persistent, or has persistent subclasses + The . + Entities returned by the query are detached. + + + + Create a new instance, for the given entity class, + or a superclass of an entity class, with the given alias. + + A class, which is persistent, or has persistent subclasses + The alias of the entity + The . + Entities returned by the query are detached. + + + + Create a new instance, for the given entity name. + + The entity name. + The . + Entities returned by the query are detached. + + + + Create a new instance, for the given entity name, + with the given alias. + + The entity name. + The alias of the entity + The . + Entities returned by the query are detached. + + + + Creates a new IQueryOver<T> for the entity class. + + The entity class + An ICriteria<T> object + + + + Creates a new IQueryOver<T> for the entity class. + + The entity class + An ICriteria<T> object + + + + Create a new instance of for the given SQL query string. + Entities returned by the query are detached. + + A SQL query + The + + + + Begin a NHibernate transaction + + A NHibernate transaction + + + + Begin a NHibernate transaction with the specified isolation level + + The isolation level + A NHibernate transaction + + + + Sets the batch size of the session + + The batch size. + The same instance of the session for methods chain. + + + + Returns the current ADO.NET connection associated with this instance. + + + If the session is using aggressive connection release (as in a + CMT environment), it is the application's responsibility to + close the connection returned by this call. Otherwise, the + application should not close the connection. + + + + Get the current NHibernate transaction. + + + + Is the IStatelessSession still open? + + + + + Is the IStatelessSession currently connected? + + + + + Gets the stateless session implementation. + + + This method is provided in order to get the NHibernate implementation of the session from wrapper implementations. + Implementors of the interface should return the NHibernate implementation of this method. + + + An NHibernate implementation of the interface + + + + Close the stateless session and release the ADO.NET connection. + + + Insert a entity. + A new transient instance + the identifier of the instance + + + Insert a row. + The entityName for the entity to be inserted + a new transient instance + the identifier of the instance + + + Update a entity. + a detached entity instance + + + Update a entity. + The entityName for the entity to be updated + a detached entity instance + + + Delete a entity. + a detached entity instance + + + Delete a entity. + The entityName for the entity to be deleted + a detached entity instance + + + Retrieve a entity. + a detached entity instance + + + Retrieve a entity. + + + a detached entity instance + + + + + Retrieve a entity, obtaining the specified lock mode. + + a detached entity instance + + + + Retrieve a entity, obtaining the specified lock mode. + + a detached entity instance + + + + Refresh the entity instance state from the database. + + The entity to be refreshed. + + + + Refresh the entity instance state from the database. + + The entityName for the entity to be refreshed. + The entity to be refreshed. + + + + Refresh the entity instance state from the database. + + The entity to be refreshed. + The LockMode to be applied. + + + + Refresh the entity instance state from the database. + + The entityName for the entity to be refreshed. + The entity to be refreshed. + The LockMode to be applied. + + + + Create a new instance, for the given entity class, + or a superclass of an entity class. + + A class, which is persistent, or has persistent subclasses + The . + Entities returned by the query are detached. + + + + Create a new instance, for the given entity class, + or a superclass of an entity class, with the given alias. + + A class, which is persistent, or has persistent subclasses + The alias of the entity + The . + Entities returned by the query are detached. + + + + Create a new instance, for the given entity name. + + The entity name. + The . + Entities returned by the query are detached. + + + + Create a new instance, for the given entity name, + with the given alias. + + The entity name. + The alias of the entity + The . + Entities returned by the query are detached. + + + + Begin a NHibernate transaction + + A NHibernate transaction + + + + Begin a NHibernate transaction with the specified isolation level + + The isolation level + A NHibernate transaction + + + + Finalizer that ensures the object is correctly disposed of. + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + 2 + + + Get the current Hibernate transaction. + + + Contract for field interception handlers. + + + The the given field initialized for the entity to which we are bound? + The name of the field to check + True if the given field is initialized; otherwise false. + + + Forcefully mark the entity as being dirty. + + + Clear the internal dirty flag. + + + Intercept field set/get + + + Is the entity considered dirty? + True if the entity is dirty; otherwise false. + + + Use to associate the entity to which we are bound to the given session. + + + Is the entity to which we are bound completely initialized? + + + Get the entity-name of the field DeclaringType. + + + Get the MappedClass (field container). + + + Helper class for dealing with enhanced entity classes. + + + Marker value for uninitialized properties + + + Contract for controlling how lazy properties get initialized. + + + Initialize the property, and return its new value + + + + All joins are created as outer joins. An optimization in finds + joins that may be inner joined and calls on them. + 's will + then emit the correct HQL join. + + + + + Remove unwanted char-to-int conversions in binary expressions + + + The LINQ expression tree may contain unwanted type conversions that were not in the original expression written by the user. For example, + list.Where(someChar => someChar == 'A') becomes the equivalent of list.Where(someChar => (int)someChar == 55) in the expression + tree. Converting this directly to a HQL/SQL statement would yield CAST(x AS INT) which does not work in MSSQLSERVER, and possibly + other databases. + + + + + Remove redundant casts to the same type or to superclass (upcast) in , + and s + + + + + Applications of the string.Compare(a,b) and a.CompareTo(b) (for various types) + that are then immediately compared to 0 can be simplified by removing the + Compare/CompareTo method call. The comparison operator is then applied + directly to the arguments for the Compare/CompareTo call. + + + + + An AggregatingGroupBy is a query such as: + + from p in db.Products + group p by p.Category.CategoryId + into g + select new + { + g.Key, + MaxPrice = g.Max(p => p.UnitPrice) + }; + + + Where the grouping operation is being fully aggregated and hence does not create any form of hierarchy. + This class takes such queries, flattens out the re-linq sub-query and re-writes the outer select + + + + + + Detects if an expression tree contains naked QuerySourceReferenceExpression + + + + + An AggregatingGroupJoin is a query such as: + + from c in db.Customers + join o in db.Orders on c.CustomerId equals o.Customer.CustomerId into ords + join e in db.Employees on c.Address.City equals e.Address.City into emps + select new { c.ContactName, ords = ords.Count(), emps = emps.Count() }; + + where the results of the joins are being fully aggregated and hence do not create any form of hierarchy. + This class takes such expressions and turns them into this form: + + from c in db.Customers + select new + { + c.ContactName, + ords = (from o2 in db.Orders where o2.Customer.CustomerId == c.CustomerId select o2).Count(), + emps = (from e2 in db.Employees where e2.Address.City == c.Address.City select e2).Count() + }; + + + + + + Removes various result operators from a query so that they can be processed at the same + tree level as the query itself. + + + + + Rewrites expressions so that they sit in the outermost portion of the query. + + + + + Gets an of that were rewritten. + + + + + Gets the representing the type of data that the operator works upon. + + + + + Result of . + + + + + Gets an of implementations that were + rewritten. + + + + + Gets the representing the type of data that the operator works upon. + + + + + Builds HQL Equality nodes and used in joins + + + + + Performs the equivalent of a ToString() on an expression. Swaps out constants for + parameters so that, for example: + from c in Customers where c.City = "London" + generate the same key as + from c in Customers where c.City = "Madrid" + + + + + Locates constants in the expression tree and generates parameters for each one + + + + + If the querySource is a subquery, return the SelectClause's selector if it's + NewExpression. Otherwise, return null. + + + + + Represents a possible set of values for a computation. For example, an expression may + be null, it may be a non-null value, or we may even have a constant value that is known + precisely. This class contains operators that know how to combine these values with + each other. This class is intended to be used to provide static analysis of expressions + before we hit the database. As an example for future improvement, we could handle + ranges of numeric values. We can also improve this by handling operators such as the + comparison operators and arithmetic operators. They are currently handled by naive + null checks. + + + + + Verify that ExpressionType of both this and the other set is bool or nullable bool, + and return the negotiated type (nullable bool if either side is nullable). + + + + + Verify that ExpressionType is bool or nullable bool. + + + + + Identifies and names - using - all QueryModel query sources + + + It may seem expensive to do this as a separate visitation of the query model, but unfortunately + trying to identify query sources on the fly (i.e. while parsing the query model to generate + the HQL expression tree) means a query source may be referenced by a QuerySourceReference + before it has been identified - and named. + + + + + Analyze the select clause to determine what parts can be translated + fully to HQL, and some other properties of the clause. + + + + + The expression parts that can be converted to pure HQL. + + + + + If true after an expression have been analyzed, the + expression as a whole contain at least one method call which + cannot be converted to a registered function, i.e. it must + be executed client side. + + + + + Some conditional expressions can be redured to just their IfTrue or IfFalse part. + + + + + + Possible values of expression if there's set of values for the requested member expression. + For example, if we have an expression "3" and we request the state for "a.B.C", we'll + use "3" from Values since it won't exist in MemberExpressionValuesIfEmptyOuterJoined. + + + + + Stores the possible values of an expression that would result if the given member expression + string was emptily outer joined. For example a.B.C would result in "null" if we try to + outer join to B and there are no rows. Even if an expression tree does contain a particular + member experssion, it may not appear in this list. In that case, the emptily outer joined + value set for that member expression will be whatever's in Values instead. + + + + + Extract the from a given expression. + + The declaring-type of the method. + The method. + The of the no-generic method or the generic-definition for a generic-method. + + + + + Extract the from a given expression. + + The declaring-type of the method. + The method. + The of the method. + + + + Extract the from a given expression. + + The method. + The of the no-generic method or the generic-definition for a generic-method. + + + + + Extract the from a given expression. + + The method. + The of the method. + + + + Gets the field or property to be accessed. + + The declaring-type of the property. + The type of the property. + The expression representing the property getter. + The of the property. + + + + If debug logging is enabled, log a string such as "msg: expression.ToString()". + + + + + Replace all occurances of ConstantExpression where the value is an NHibernate + proxy with a ParameterExpression. The name of the parameter will be a string + representing the proxied entity, without initializing it. + + + + + Provides the main entry point to a LINQ query. + + + + + Associate unique names to query sources. The HQL AST parser will rename them anyway, but we need to + ensure uniqueness that is not provided by IQuerySource.ItemName. + + + + + Implementors define a strategy for transforming criteria query + results into the actual application-visible query result list. + + + + + + + + + + + + + + + + + + + + + Use the SqlMethods.Like() method in a Linq2NHibernate expression to generate + an SQL LIKE expression. (If you want to avoid depending on the NHibernate.Linq namespace, + you can define your own replica of this method. Any 2-argument method named Like in a class named SqlMethods + will be translated.) This method can only be used in Linq2NHibernate expression, and will throw + if called directly. + + + + + Walker for collections of values and many-to-many associations + + + + + Superclass of walkers for collection initializers + + + + + + + + Add on association (one-to-one, many-to-one, or a collection) to a list + of associations to be fetched by outerjoin (if necessary) + + + + + Add on association (one-to-one, many-to-one, or a collection) to a list + of associations to be fetched by outerjoin + + + + + Adds an association and extracts the aliases the association's 'with clause' is dependent on + + + + + For an entity class, return a list of associations to be fetched by outerjoin + + + + + For a collection role, return a list of associations to be fetched by outerjoin + + + + + For a collection role, return a list of associations to be fetched by outerjoin + + + + + For an entity class, add to a list of associations to be fetched + by outerjoin + + + + + For a component, add to a list of associations to be fetched by outerjoin + + + + + For a composite element, add to a list of associations to be fetched by outerjoin + + + + + Extend the path by the given property name + + + + + Get the join type (inner, outer, etc) or -1 if the + association should not be joined. Override on + subclasses. + + + + + Use an inner join if it is a non-null association and this + is the "first" join in a series + + + + + Does the mapping, and Hibernate default semantics, specify that + this association should be fetched by outer joining + + + + + Override on subclasses to enable or suppress joining + of certain association types + + + + + Used to detect circularities in the joined graph, note that + this method is side-effecty + + + + + Used to detect circularities in the joined graph, note that + this method is side-effecty + + + + + Should we join this association? + + + + + Generate a sequence of LEFT OUTER JOIN clauses for the given associations. + + + + + Count the number of instances of IJoinable which are actually + also instances of ILoadable, or are one-to-many associations + + + + + Count the number of instances of which + are actually also instances of + which are being fetched by outer join + + + + + Get the order by string required for collection fetching + + + + + Render the where condition for a (batch) load by identifier / collection key + + + + + Generate a select list of columns containing all properties of the entity classes + + + + + Uniquely identifier a foreign key, so that we don't + join it more than once, and create circularities + + + + + Loads a collection of values or a many-to-many association. + + + The collection persister must implement . For + other collections, create a customized subclass of + + + + + + Superclass for loaders that initialize collections + + + + + + + Implements logic for walking a tree of associated classes. + + + Generates an SQL select string containing all properties of those classes. + Tablse are joined using an ANSI-style left outer join. + + + + + Abstract superclass of object loading (and querying) strategies. + + +

+ This class implements useful common functionality that concrete loaders would delegate to. + It is not intended that this functionality would be directly accessed by client code (Hence, + all methods of this class are declared protected or private.) This class relies heavily upon the + interface, which is the contract between this class and + s that may be loaded by it. +

+

+ The present implementation is able to load any number of columns of entities and at most + one collection role per query. +

+
+ +
+ + + Indicates whether the dialect is able to add limit and/or offset clauses to . + Even if a dialect generally supports the addition of limit and/or offset clauses to SQL statements, + there may (custom) SQL statements where this is not possible, for example in case of SQL Server + stored procedure invocations. + + + + + What lock mode does this load entities with? + + A Collection of lock modes specified dynamically via the Query Interface + + + + + Append FOR UPDATE OF clause, if necessary. This + empty superclass implementation merely returns its first + argument. + + + + + Does this query return objects that might be already cached by + the session, whose lock mode may need upgrading. + + + + + + Modify the SQL, adding lock hints and comments, if necessary + + + + + Execute an SQL query and attempt to instantiate instances of the class mapped by the given + persister from each row of the DataReader. If an object is supplied, will attempt to + initialize that object. If a collection is supplied, attempt to initialize that collection. + + + + + Loads a single row from the result set. This is the processing used from the + ScrollableResults where no collection fetches were encountered. + + The result set from which to do the load. + The session from which the request originated. + The query parameters specified by the user. + Should proxies be generated + The loaded "row". + + + + + Read any collection elements contained in a single row of the result set + + + + + Determine the actual ResultTransformer that will be used to transform query results. + + The specified result transformer. + The actual result transformer. + + + + Are rows transformed immediately after being read from the ResultSet? + + The specified result transformer. + True, if getResultColumnOrRow() transforms the results; false, otherwise + + + + Get the actual object that is returned in the user-visible result list. + + + This empty implementation merely returns its first argument. This is + overridden by some subclasses. + + + + + For missing objects associated by one-to-one with another object in the + result set, register the fact that the the object is missing with the + session. + + + + + Read one collection element from the current row of the ADO.NET result set + + + + + If this is a collection initializer, we need to tell the session that a collection + is being initilized, to account for the possibility of the collection having + no elements (hence no rows in the result set). + + + + + Read a row of EntityKeys from the IDataReader into the given array. + + + Warning: this method is side-effecty. If an id is given, don't bother going + to the IDataReader + + + + + Check the version of the object in the IDataReader against + the object version in the session cache, throwing an exception + if the version numbers are different. + + + + + + Resolve any ids for currently loaded objects, duplications within the IDataReader, + etc. Instanciate empty objects to be initialized from the IDataReader. Return an + array of objects (a row of results) and an array of booleans (by side-effect) that determine + wheter the corresponding object should be initialized + + + + + The entity instance is already in the session cache + + + + + The entity instance is not in the session cache + + + + + Hydrate the state of an object from the SQL IDataReader, into + an array of "hydrated" values (do not resolve associations yet), + and pass the hydrated state to the session. + + + + + Determine the concrete class of an instance for the IDataReader + + + + + Advance the cursor to the first required row of the IDataReader + + + + + Should we pre-process the SQL string, adding a dialect-specific + LIMIT clause. + + + + + + + + Performs dialect-specific manipulations on the offset value before returning it. + This method is applicable for use in limit statements only. + + + + + Performs dialect-specific manipulations on the limit value before returning it. + This method is applicable for use in limit statements only. + + + + + Obtain an IDbCommand with all parameters pre-bound. Bind positional parameters, + named parameters, and limit parameters. + + + Creates an IDbCommand object and populates it with the values necessary to execute it against the + database to Load an Entity. + + The to use for the IDbCommand. + TODO: find out where this is used... + The SessionImpl this Command is being prepared in. + A CommandWrapper wrapping an IDbCommand that is ready to be executed. + + + + Some dialect-specific LIMIT clauses require the maximium last row number + (aka, first_row_number + total_row_count), while others require the maximum + returned row count (the total maximum number of rows to return). + + The selection criteria + The dialect + The appropriate value to bind into the limit clause. + + + + Fetch a IDbCommand, call SetMaxRows and then execute it, + advance to the first result and return an SQL IDataReader + + The to execute. + The to apply to the and . + true if result types need to be auto-discovered by the loader; false otherwise. + The to load in. + + An IDataReader advanced to the first record in RowSelection. + + + + Called by subclasses that load entities + + + + + Called by subclasses that batch load entities + + + + + Called by subclasses that load collections + + + + + Called by wrappers that batch initialize collections + + + + + Called by subclasses that batch initialize collections + + + + + Return the query results, using the query cache, called + by subclasses that implement cacheable queries + + + + + + + + + + Actually execute a query, ignoring the query cache + + + + + + + + Calculate and cache select-clause suffixes. Must be + called by subclasses after instantiation. + + + + + An array indicating whether the entities have eager property fetching + enabled. + + Eager property fetching indicators. + + + + An array of indexes of the entity that owns a one-to-one association + to the entity at the given index (-1 if there is no "owner") + + + The indexes contained here are relative to the result of . + + + + + An array of the owner types corresponding to the + returns. Indices indicating no owner would be null here. + + + + + Get the index of the entity that owns the collection, or -1 + if there is no owner in the query results (i.e. in the case of a + collection initializer) or no collection. + + + + + Return false is this loader is a batch entity loader + + + + + Get the result set descriptor + + + + + The SqlString to be called; implemented by all subclasses + + + + + An array of persisters of entity classes contained in each row of results; + implemented by all subclasses + + + The setter was added so that classes inheriting from Loader could write a + value using the Property instead of directly to the field. + + + + + An (optional) persister for a collection to be initialized; only collection loaders + return a non-null value + + + + + Get the SQL table aliases of entities whose + associations are subselect-loadable, returning + null if this loader does not support subselect + loading + + + + + Returns the aliases that correspond to a result row. + + Returns the aliases that correspond to a result row. + + + + Identifies the query for statistics reporting, if null, + no statistics will be reported + + + + + Utility method that generates 0_, 1_ suffixes. Subclasses don't + necessarily need to use this algorithm, but it is intended that + they will in most cases. + + + + + An interface for collection loaders + + + + + + + Initialize the given collection + + + + + "Batch" loads collections, using multiple foreign key values in the SQL Where clause + + + + + + + Walker for one-to-many associations + + + + + + Loads one-to-many associations + + + The collection persister must implement . + For other collections, create a customized subclass of . + + + + + Implements subselect fetching for a collection + + + + Implements subselect fetching for a one to many association + + + + + A for queries. + + + + + + The superclass deliberately excludes collections + + + + + Don't bother with the discriminator, unless overridden by subclass + + + + + Use the discriminator, to narrow the select to instances + of the queried subclass, also applying any filters. + + + + + A Loader for queries. + + + Note that criteria + queries are more like multi-object Load()s than like HQL queries. + + + + + Get the names of the columns constrained by this criterion. + + + + + Get the a typed value for the given property value. + + + + + Get the aliases of the columns constrained + by this criterion (for use in ORDER BY clause). + + + + Implements Hibernate's built-in support for native SQL queries. + This support is built on top of the notion of "custom queries"... + + + + Extension point allowing any SQL query with named and positional parameters + to be executed by Hibernate, returning managed entities, collections and + simple scalar values. + + + + The SQL query string to be performed. + + + + Any query spaces to apply to the query execution. Query spaces are + used in Hibernate's auto-flushing mechanism to determine which + entities need to be checked for pending changes. + + + + + A collection of descriptors describing the + ADO result set to be expected and how to map this result set. + + + + + Substitues ADO parameter placeholders (?) for all encountered + parameter specifications. It also tracks the positions of these + parameter specifications within the query string. This accounts for + ordinal-params, named-params, and ejb3-positional-params. + + The query string. + The SQL query with parameter substitution complete. + + + Spefically a fetch return that refers to a collection association. + + + Represents a return which names a fetched association. + + + Represents some non-scalar (entity/collection) return within the query result. + + + Represents a return in a custom query. + + + Retrieves the return descriptor for the owner of this fetch. + + + The name of the property on the owner which represents this association. + + + + Represents a return which names a collection role; it + is used in defining a custom query for loading an entity's + collection in non-fetching scenarios (i.e., loading the collection + itself as the "root" of the result). + + + + Returns the class owning the collection. + + + Returns the name of the property representing the collection from the . + + + + that uses columnnames instead of generated aliases. + Aliases can still be overwritten via <return-property> + + + + + Type definition of CollectionAliases. + + + + + Returns the suffixed result-set column-aliases for columns making + up the key for this collection (i.e., its FK to its owner). + + The key result-set column aliases. + + + + Returns the suffixed result-set column-aliases for the columns + making up the collection's index (map or list). + + The index result-set column aliases. + + + + Returns the suffixed result-set column-aliases for the columns + making up the collection's elements. + + The element result-set column aliases. + + + + Returns the suffixed result-set column-aliases for the column + defining the collection's identifier (if any). + + The identifier result-set column aliases. + + + + Returns the suffix used to unique the column aliases for this + particular alias set. + + The uniqued column alias suffix. + + + + Returns the suffixed result-set column-aliases for columns making up the key for this collection (i.e., its FK to + its owner). + + The key result-set column aliases. + + + + Returns the suffixed result-set column-aliases for the columns making up the collection's index (map or list). + + The index result-set column aliases. + + + + Returns the suffixed result-set column-aliases for the columns making up the collection's elements. + + The element result-set column aliases. + + + + Returns the suffixed result-set column-aliases for the column defining the collection's identifier (if any). + + The identifier result-set column aliases. + + + + Returns the suffix used to unique the column aliases for this particular alias set. + + The uniqued column alias suffix. + + + + that chooses the column names over the alias names. + + + + + EntityAliases which handles the logic of selecting user provided aliases (via return-property), + before using the default aliases. + + + + + Metadata describing the SQL result set column aliases + for a particular entity + + + + + The result set column aliases for the property columns of a subclass + + + + + The result set column aliases for the primary key columns + + + + + The result set column aliases for the discriminator columns + + + + + The result set column aliases for the version columns + + + + + The result set column alias for the Oracle row id + + + + + The result set column aliases for the property columns + + + + + Calculate and cache select-clause suffixes. + + + + + Extension point for loaders which use a SQL result set with "unexpected" column aliases. + + + + Build a logical result row. + + Entity data defined as "root returns" and already handled by the normal Loader mechanism. + + The ADO result set (positioned at the row currently being processed). + Does this query have an associated . + The session from which the query request originated. + The logical result row + + At this point, Loader has already processed all non-scalar result data. We + just need to account for scalar result data here... + + + + + Encapsulates the metadata available from the database result set. + + + + + Initializes a new instance of the class. + + The result set. + + + + Gets the column count in the result set. + + The column count. + + + + Gets the (zero-based) position of the column with the specified name. + + Name of the column. + The column position. + + + + Gets the name of the column at the specified position. + + The (zero-based) position. + The column name. + + + + Gets the Hibernate type of the specified column. + + The column position. + The Hibernate type. + + + Specifically a fetch return that refers to an entity association. + + + + Represents a return which names a "root" entity. + + + A root entity means it is explicitly a "column" in the result, as opposed to + a fetched association. + + + + Represent a scalar (AKA simple value) return within a query result. + + + + Abstract superclass for entity loaders that use outer joins + + + + + Loads entities for a + + + + + Load an entity instance. If OptionalObject is supplied, load the entity + state into the given (uninitialized) object + + + + + "Batch" loads entities, using multiple primary key values in the + SQL where clause. + + + + + + A walker for loaders that fetch entities + + + + + + Override to use the persister to change the table-alias for columns in join-tables + + + + + Disable outer join fetching if this loader obtains an + upgrade lock mode + + + + + Load an entity using outerjoin fetching to fetch associated entities. + + + The must implement . For other entities, + create a customized subclass of . + + + + + + + a collection of lock modes specified dynamically via the Query interface + + + + + CollectionAliases which handles the logic of selecting user provided aliases (via return-property), + before using the default aliases. + + + + + Returns the suffixed result-set column-aliases for columns making up the key for this collection (i.e., its FK to + its owner). + + + + + Returns the suffixed result-set column-aliases for the columns making up the collection's index (map or list). + + + + + Returns the suffixed result-set column-aliases for the columns making up the collection's elements. + + + + + Returns the suffixed result-set column-aliases for the column defining the collection's identifier (if any). + + + + + Returns the suffix used to unique the column aliases for this particular alias set. + + + + + Get the position of the join with the given alias in the + list of joins + + + + + Add or modify a value-class pair. + + The value of the DB-field dor a given association instance (should override ) + The class associated to the specific . + + + + Add or modify a value-class pair. + + The value of the DB-field dor a given association instance (should override ) + The class associated to the specific . + + + + + + + Not supported in NH3. + + + + Using the Join, it is possible to split properties of one class to several tables, when there's a 1-to-1 relationship between the table + + The split-group identifier. By default it is assigned to the join-table-name + The lambda to map the join. + + + + Force the component to a different type than the one of the property. + + Mapped component type. + + Useful when the property is an interface and you need the mapping to a concrete class mapped as component. + + + + + Get all candidate persistent properties, or fields, to be used as Persistent-Object-ID, for a given root-entity class or interface. + + The root-entity class or interface. + All candidate properties or fields to be used as Persistent-Object-ID. + + + + Get all candidate persistent properties or fields for a given root-entity class or interface. + + The root-entity class or interface. + All candidate properties or fields. + + + + Get all candidate persistent properties or fields for a given entity subclass or interface. + + The entity subclass or interface. + The superclass (it may be different from ) + All candidate properties or fields. + + In NHibernate, for a subclass, the method should return only those members not included in + its super-classes. + + + + + Get all candidate persistent properties or fields for a given entity subclass or interface. + + The class of the component or an interface. + All candidate properties or fields. + + + + Force the many-to-one to a different type than the one of the property. + + Mapped entity type. + + Useful when the property is an interface and you need the mapping to a concrete class mapped as entity. + + + + + Set the Foreign-Key name + + The name of the Foreign-Key + + Where the is "none" or or all white-spaces the FK won't be created. + Use null to reset the default NHibernate's behavior. + + + + + Manage the mapping of a HbmKeyProperty but implementing + instead a more limitated KeyProperty. + + + + + Defines behavior of soft-cascade actions. + + + To check the content or to include/exclude values, from cascade, is strongly recommanded the usage of extensions methods defined in + + + + + + + + Occurs before apply pattern-appliers on a root class. + + + + + Occurs before apply pattern-appliers on a subclass. + + + + + Occurs before apply pattern-appliers on a joined-subclass. + + + + + Occurs before apply pattern-appliers on a union-subclass. + + + + + Occurs after apply the last customizer on a root class. + + + + + Occurs after apply the last customizer on a subclass. + + + + + Occurs after apply the last customizer on a joined-subclass.. + + + + + Occurs after apply the last customizer on a union-subclass.. + + + + + Util extensions to use in your test or where you need to see the XML mappings + + + + + Immutable value class. By-value equality. + + + + + Provide the list of progressive-paths + + + + Given a path as : Pl1.Pl2.Pl3.Pl4.Pl5 returns paths-sequence as: + Pl5 + Pl4.Pl5 + Pl3.Pl4.Pl5 + Pl2.Pl3.Pl4.Pl5 + Pl1.Pl2.Pl3.Pl4.Pl5 + + + + + Dictionary containing the embedded strategies to find a field giving a property name. + The key is the "partial-name" of the strategy used in XML mapping. + The value is an instance of the strategy. + + + + + A which allows customization of conditions with explicitly declared members. + + + + + Decode a member access expression of a specific ReflectedType + + Type to reflect + The expression of the property getter + The os the ReflectedType. + + + + Decode a member access expression of a specific ReflectedType + + Type to reflect + Type of property + The expression of the property getter + The os the ReflectedType. + + + + Given a property or a field try to get the member from a given possible inherited type. + + The member to find. + The type where find the member. + The member from the reflected-type or the original where the is not accessible from . + + + + Try to find a property or field from a given type. + + The type + The property or field name. + + A or a where the member is found; null otherwise. + + + Where found the member is returned always from the declaring type. + + + + + Convenience base class for AuxiliaryDatabaseObjects. + + + This implementation performs dialect scoping checks strictly based on + dialect name comparisons. Custom implementations might want to do + instanceof-type checks. + + + + + Auxiliary database objects (i.e., triggers, stored procedures, etc) defined + in the mappings. Allows Hibernate to manage their lifecycle as part of + creating/dropping the schema. + + + + + Operations to create/drop the mapping element in the database. + + + + + When implemented by a class, generates the SQL string to create + the mapping element in the database. + + The to use for SQL rules. + + + + + A string that contains the SQL to create an object. + + + + + When implemented by a class, generates the SQL string to drop + the mapping element from the database. + + The to use for SQL rules. + + + + A string that contains the SQL to drop an object. + + + + + Add the given dialect name to the scope of dialects to which + this database object applies. + + The name of a dialect. + + + + Does this database object apply to the given dialect? + + The dialect to check against. + True if this database object does apply to the given dialect. + + + + Gets called by NHibernate to pass the configured type parameters to the implementation. + + + + + A NHibernate any type. + + + Polymorphic association to one of several tables. + + + + + Any value that maps to columns. + + + + + Represents an identifying key of a table: the value for primary key + of an entity, or a foreign key of a collection or join table or + joined subclass table. + + + + + A value is anything that is persisted by value, instead of + by reference. It is essentially a Hibernate IType, together + with zero or more columns. Values are wrapped by things with + higher level semantics, for example properties, collections, + classes. + + + + + + + + + + Determines if the Value is part of a valid mapping. + + The to validate. + + if the Value is part of a valid mapping, + otherwise. + + + + Mainly used to make sure that Value maps to the correct number + of columns. + + + + + Gets the number of columns that this value spans in the table. + + + + + Gets an of objects + that this value is stored in. + + + + + Gets the to read/write the Values. + + + + + Gets the this Value is stored in. + + + + + Gets a indicating if this Value is unique. + + + + + Gets a indicating if this Value can have + null values. + + + + + Gets a indicating if this is a SimpleValue + that does not involve foreign keys. + + + + + Get or set the identifier type name + + + + + Get or set the metatype + + + + + Represent the relation between a meta-value and the related entityName + + + + + An array has a primary key consisting of the key columns + index column + + + + + A list has a primary key consisting of the key columns + index column + + + + + Indexed collections include IList, IDictionary, Arrays + and primitive Arrays. + + + + + Base class that stores the mapping information for <array>, <bag>, + <id-bag>, <list>, <map>, and <set> + collections. + + + Subclasses are responsible for the specialization required for the particular + collection style. + + + + + Any mapping with an outer-join attribute + + + + + Defines mapping elements to which filters may be applied. + + + + + Gets or sets a indicating if this is a + mapping for a generic collection. + + + if a collection from the System.Collections.Generic namespace + should be used, if a collection from the System.Collections + namespace should be used. + + + This has no affect on any versions of the .net framework before .net-2.0. + + + + + Gets or sets an array of that contains the arguments + needed to construct an instance of a closed type. + + + + + Initializes a new instance of the class. + + The that contains this list mapping. + + + + Gets the appropriate that is + specialized for this list mapping. + + + + + Mapping for a property of a .NET class (entity + or component). + + + + Common interface for things that can handle meta attributes. + + + + Retrieve the + + The attribute name + The if exists; null otherwise + + + + Meta-Attribute collection. + + + + + Gets the number of columns this property uses in the db. + + + + + Gets an of s. + + + + + Gets or Sets the name of the Property in the class. + + + + + + + + A bag permits duplicates, so it has no primary key + + + + + A bag permits duplicates, so it has no primary key. + + The that contains this bag mapping. + + + + Gets the appropriate that is + specialized for this bag mapping. + + + + + Represents the mapping to a column in a database. + + + + + Initializes a new instance of . + + + + + Initializes a new instance of . + + The name of the column. + + + + Gets the name of this Column in quoted form if it is necessary. + + + The that knows how to quote + the column name. + + + The column name in a form that is safe to use inside of a SQL statement. + Quoted if it needs to be, not quoted if it does not need to be. + + + + For any column name, generate an alias that is unique + to that column name, and also 10 characters or less + in length. + + + + Gets the name of the data type for the column. + + The to use to get the valid data types. + + + The name of the data type for the column. + + + If the mapping file contains a value of the attribute sql-type this will + return the string contained in that attribute. Otherwise it will use the + typename from the of the object. + + + + + Determines if this instance of and a specified object, + which must be a Column can be considered the same. + + An that should be a . + + if the name of this Column and the other Column are the same, + otherwise . + + + + + Determines if this instance of and the specified Column + can be considered the same. + + A to compare to this Column. + + if the name of this Column and the other Column are the same, + otherwise . + + + + + Returns the hash code for this instance. + + + + returns quoted name as it would be in the mapping file. + + + Shallow copy, the value is not copied + + + + Gets or sets the length of the datatype in the database. + + The length of the datatype in the database. + + + + Gets or sets the name of the column in the database. + + + The name of the column in the database. The get does + not return a Quoted column name. + + +

+ If a value is passed in that is wrapped by ` then + NHibernate will Quote the column whenever SQL is generated + for it. How the column is quoted depends on the Dialect. +

+

+ The value returned by the getter is not Quoted. To get the + column name in quoted form use . +

+
+
+ + + Gets or sets if the column can have null values in it. + + if the column can have a null value in it. + + + + Gets or sets the index of the column in the . + + + The index of the column in the . + + + + + Gets or sets if the column contains unique values. + + if the column contains unique values. + + + + Gets or sets the sql data type name of the column. + + + The sql data type name of the column. + + + This is usually read from the sql-type attribute. + + + + + Gets or sets if the column needs to be quoted in SQL statements. + + if the column is quoted. + + + + Gets or sets whether the column is unique. + + + + + Gets or sets a check constraint on the column + + + + + Do we have a check constraint? + + + + + The underlying columns SqlType. + + + If null, it is because the sqltype code is unknown. + + Use to retreive the sqltypecode used + for the columns associated Value/Type. + + + + + The mapping for a component, composite element, composite identifier, + etc. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Base class for relational constraints in the database. + + + + + Adds the to the of + Columns that are part of the constraint. + + The to include in the Constraint. + + + + Generates the SQL string to drop this Constraint in the database. + + The to use for SQL rules. + + + + A string that contains the SQL to drop this Constraint. + + + + + Generates the SQL string to create this Constraint in the database. + + The to use for SQL rules. + + + + + A string that contains the SQL to create this Constraint. + + + + + When implemented by a class, generates the SQL string to create the named + Constraint in the database. + + The to use for SQL rules. + The name to use as the identifier of the constraint in the database. + + + + A string that contains the SQL to create the named Constraint. + + + + + Gets or sets the Name used to identify the constraint in the database. + + The Name used to identify the constraint in the database. + + + + Gets an of objects that are part of the constraint. + + + An of objects that are part of the constraint. + + + + + Gets the number of columns that this Constraint contains. + + + The number of columns that this Constraint contains. + + + + + Gets or sets the this Constraint is in. + + + The this Constraint is in. + + + + + Represents a Table in a database that an object gets mapped against. + + + + + Initializes a new instance of . + + + + + Generates the SQL string to create this Table in the database. + + The to use for SQL rules. + + + + + A string that contains the SQL to create this Table, Primary Key Constraints + , and Unique Key Constraints. + + + + + Generates the SQL string to drop this Table in the database. + + The to use for SQL rules. + + + + A string that contains the SQL to drop this Table and to cascade the drop to + the constraints if the database supports it. + + + + + Gets the schema qualified name of the Table. + + The that knows how to Quote the Table name. + The name of the table qualified with the schema if one is specified. + + + + Gets the schema qualified name of the Table using the specified qualifier + + The that knows how to Quote the Table name. + The catalog name. + The schema name. + A String representing the Qualified name. + If this were used with MSSQL it would return a dbo.table_name. + + + returns quoted name as it would be in the mapping file. + + + + Gets the name of this Table in quoted form if it is necessary. + + + The that knows how to quote the Table name. + + + The Table name in a form that is safe to use inside of a SQL statement. + Quoted if it needs to be, not quoted if it does not need to be. + + + + returns quoted name as it is in the mapping file. + + + + Gets the schema for this table in quoted form if it is necessary. + + + The that knows how to quote the table name. + + + The schema name for this table in a form that is safe to use inside + of a SQL statement. Quoted if it needs to be, not quoted if it does not need to be. + + + + + Gets the at the specified index. + + The index of the Column to get. + + The at the specified index. + + + + + Adds the to the of + Columns that are part of the Table. + + The to include in the Table. + + + + Gets the identified by the name. + + The name of the to get. + + The identified by the name. If the + identified by the name does not exist then it is created. + + + + + Gets the identified by the name. + + The name of the to get. + + The identified by the name. If the + identified by the name does not exist then it is created. + + + + + Create a for the columns in the Table. + + + An of objects. + + + + A for the columns in the Table. + + + This does not necessarily create a , if + one already exists for the columns then it will return an + existing . + + + + + Generates a unique string for an of + objects. + + An of objects. + + An unique string for the objects. + + + + + Sets the Identifier of the Table. + + The that represents the Identifier. + + + + + + + + + Return the column which is identified by column provided as argument. + column with atleast a name. + + The underlying column or null if not inside this table. + Note: the instance *can* be different than the input parameter, but the name will be the same. + + + + + Gets or sets the name of the Table in the database. + + + The name of the Table in the database. The get does + not return a Quoted Table name. + + +

+ If a value is passed in that is wrapped by ` then + NHibernate will Quote the Table whenever SQL is generated + for it. How the Table is quoted depends on the Dialect. +

+

+ The value returned by the getter is not Quoted. To get the + column name in quoted form use . +

+
+
+ + + Gets the number of columns that this Table contains. + + + The number of columns that this Table contains. + + + + + Gets an of objects that + are part of the Table. + + + An of objects that are + part of the Table. + + + + + Gets an of objects that + are part of the Table. + + + An of objects that are + part of the Table. + + + + + Gets an of objects that + are part of the Table. + + + An of objects that are + part of the Table. + + + + + Gets an of objects that + are part of the Table. + + + An of objects that are + part of the Table. + + + + + Gets or sets the of the Table. + + The of the Table. + + + + Gets or sets the schema the table is in. + + + The schema the table is in or if no schema is specified. + + + + + Gets the unique number of the Table. + + The unique number of the Table. + + + + Gets or sets if the column needs to be quoted in SQL statements. + + if the column is quoted. + + + + A value which is "typed" by reference to some other value + (for example, a foreign key is typed by the referenced primary key). + + + + + A Foreign Key constraint in the database. + + + + + Generates the SQL string to create the named Foreign Key Constraint in the database. + + The to use for SQL rules. + The name to use as the identifier of the constraint in the database. + + + + A string that contains the SQL to create the named Foreign Key Constraint. + + + + + Get the SQL string to drop this Constraint in the database. + + The to use for SQL rules. + + + + A string that contains the SQL to drop this Constraint. + + + + + Validates that columnspan of the foreignkey and the primarykey is the same. + Furthermore it aligns the length of the underlying tables columns. + + + + + Gets or sets the that the Foreign Key is referencing. + + The the Foreign Key is referencing. + + Thrown when the number of columns in this Foreign Key is not the same + amount of columns as the Primary Key in the ReferencedTable. + + + + Does this foreignkey reference the primary key of the reference table + + + + A formula is a derived column value. + + + + + + + + + + + + + + + + + + + An PersistentIdentifierBag has a primary key consistenting of just + the identifier column. + + + + + A collection with a synthetic "identifier" column. + + + + + + + + + + + + + + + + + + + + + + + + + + An Index in the database. + + + + + Generates the SQL string to create this Index in the database. + + The to use for SQL rules. + + + + + A string that contains the SQL to create this Index. + + + + + Generates the SQL string to drop this Index in the database. + + The to use for SQL rules. + + + + A string that contains the SQL to drop this Index. + + + + + Adds the to the of + Columns that are part of the Index. + + The to include in the Index. + + + + Gets or sets the this Index is in. + + + The this Index is in. + + + + + Gets an of objects that are + part of the Index. + + + An of objects that are + part of the Index. + + + + + Gets or sets the Name used to identify the Index in the database. + + The Name used to identify the Index in the database. + + + + Declaration of a System.Type mapped with the <subclass> or + <joined-subclass> element. + + + + + Base class for the mapped by <class> and a + that is mapped by <subclass> or + <joined-subclass>. + + + + + + + + + + + Adds a to the class hierarchy. + + The to add to the hierarchy. + + + + Change the property definition or add a new property definition + + The to add. + + + + Adds a that is implemented by a subclass. + + The implemented by a subclass. + + + + Adds a that a subclass is stored in. + + The the subclass is stored in. + + + + Creates the for the + this type is persisted in. + + The that is used to Alias columns. + + + + Given a property path, locate the appropriate referenceable property reference. + + + A referenceable property is a property which can be a target of a foreign-key + mapping (an identifier or explicitly named in a property-ref). + + The property path to resolve into a property reference. + The property reference (never null). + If the property could not be found. + + + + + + + + + + Gets the that is being mapped. + + The that is being mapped. + + The value of this is set by the name attribute on the <class> + element. + + + + + Gets or sets the to use as a Proxy. + + The to use as a Proxy. + + The value of this is set by the proxy attribute. + + + + + Gets or Sets if the Insert Sql is built dynamically. + + if the Sql is built at runtime. + + The value of this is set by the dynamic-insert attribute. + + + + + Gets or Sets if the Update Sql is built dynamically. + + if the Sql is built at runtime. + + The value of this is set by the dynamic-update attribute. + + + + + Gets or Sets the value to use as the discriminator for the Class. + + + A value that distinguishes this subclass in the database. + + + The value of this is set by the discriminator-value attribute. Each <subclass> + in a hierarchy must define a unique discriminator-value. The default value + is the class name if no value is supplied. + + + + + Gets the number of subclasses that inherit either directly or indirectly. + + The number of subclasses that inherit from this PersistentClass. + + + + Iterate over subclasses in a special 'order', most derived subclasses first. + + + It will recursively go through Subclasses so that if a SubclassType has Subclasses + it will pick those up also. + + + + + Gets an of objects + that directly inherit from this PersistentClass. + + + An of objects + that directly inherit from this PersistentClass. + + + + + When implemented by a class, gets a boolean indicating if this + mapped class is inherited from another. + + + if this class is a subclass or joined-subclass + that inherited from another class. + + + + + When implemented by a class, gets a boolean indicating if the mapped class + has a version property. + + if there is a <version> property. + + + + When implemented by a class, gets an + of objects that this mapped class contains. + + + An of objects that + this mapped class contains. + + + This is all of the properties of this mapped class and each mapped class that + it is inheriting from. + + + + + When implemented by a class, gets an + of objects that this mapped class reads from + and writes to. + + + An of objects that + this mapped class reads from and writes to. + + + This is all of the tables of this mapped class and each mapped class that + it is inheriting from. + + + + + Gets an of objects that + this mapped class contains and that all of its subclasses contain. + + + An of objects that + this mapped class contains and that all of its subclasses contain. + + + + + Gets an of all of the objects that the + subclass finds its information in. + + An of objects. + It adds the TableClosureIterator and the subclassTables into the IEnumerable. + + + + When implemented by a class, gets or sets the of the Persister. + + + + + When implemented by a class, gets the of the class + that is mapped in the class element. + + + The of the class that is mapped in the class element. + + + + + + + + + + + + + + + Build a collection of properties which are "referenceable". + + + See for a discussion of "referenceable". + + + + + + + + + + + + + + + Build an iterator over the properties defined on this class. The returned + iterator only accounts for "normal" properties (i.e. non-identifier + properties). + + + An of objects. + + + Differs from in that the iterator + we return here will include properties defined as part of a join. + + + + + Build an enumerable over the properties defined on this class which + are not defined as part of a join. + As with the returned iterator only accounts + for non-identifier properties. + + An enumerable over the non-joined "normal" properties. + + + + + + + + + Gets a boolean indicating if this PersistentClass has any subclasses. + + if this PeristentClass has any subclasses. + + + + Gets or Sets the that this class is stored in. + + The this class is stored in. + + The value of this is set by the table attribute. + + + + + When implemented by a class, gets or set a boolean indicating + if the mapped class has properties that can be changed. + + if the object is mutable. + + The value of this is set by the mutable attribute. + + + + + When implemented by a class, gets a boolean indicating + if the mapped class has a Property for the id. + + if there is a Property for the id. + + + + When implemented by a class, gets or sets the + that is used as the id. + + + The that is used as the id. + + + + + When implemented by a class, gets or sets the + that contains information about the identifier. + + The that contains information about the identifier. + + + + When implemented by a class, gets or sets the + that is used as the version. + + The that is used as the version. + + + + When implemented by a class, gets or sets the + that contains information about the discriminator. + + The that contains information about the discriminator. + + + + When implemented by a class, gets or sets if the mapped class has subclasses or is + a subclass. + + + if the mapped class has subclasses or is a subclass. + + + + + When implemented by a class, gets or sets the CacheConcurrencyStrategy + to use to read/write instances of the persistent class to the Cache. + + The CacheConcurrencyStrategy used with the Cache. + + + + When implemented by a class, gets or sets the + that this mapped class is extending. + + + The that this mapped class is extending. + + + + + When implemented by a class, gets or sets a boolean indicating if + explicit polymorphism should be used in Queries. + + + if only classes queried on should be returned, + if any class in the heirarchy should implicitly be returned. + + The value of this is set by the polymorphism attribute. + + + + + + + + + + When implemented by a class, gets or sets a boolean indicating if the identifier is + embedded in the class. + + if the class identifies itself. + + An embedded identifier is true when using a composite-id specifying + properties of the class as the key-property instead of using a class + as the composite-id. + + + + + When implemented by a class, gets the of the class + that is mapped in the class element. + + + The of the class that is mapped in the class element. + + + + + When implemented by a class, gets or sets the + that contains information about the Key. + + The that contains information about the Key. + + + + When implemented by a class, gets or sets the sql string that should + be a part of the where clause. + + + The sql string that should be a part of the where clause. + + + The value of this is set by the where attribute. + + + + + Gets or sets a boolean indicating if only values in the discriminator column that + are mapped will be included in the sql. + + if the mapped discriminator values should be forced. + + The value of this is set by the force attribute on the discriminator element. + + + + + Initializes a new instance of the class. + + The that is the superclass. + + + + Add the to this PersistentClass. + + The to add. + + This also adds the to the Superclass' collection + of SubclassType Properties. + + + + + Adds a that is implemented by a subclass. + + The implemented by a subclass. + + This also adds the to the Superclass' collection + of SubclassType Properties. + + + + + Adds a that a subclass is stored in. + + The the subclass is stored in. + + This also adds the to the Superclass' collection + of SubclassType Tables. + + + + + + + + + + Gets a boolean indicating if this mapped class is inherited from another. + + + because this is a SubclassType. + + + + + Gets an of objects that this mapped class contains. + + + An of objects that + this mapped class contains. + + + This is all of the properties of this mapped class and each mapped class that + it is inheriting from. + + + + + Gets an of objects that this + mapped class reads from and writes to. + + + An of objects that + this mapped class reads from and writes to. + + + This is all of the tables of this mapped class and each mapped class that + it is inheriting from. + + + + + Gets a boolean indicating if the mapped class has a version property. + + if for the Superclass there is a Property for a version. + + + + + + + + + Gets the of the class + that is mapped in the class element. + + + The of the Superclass that is mapped in the class element. + + + + + + + + + + Gets or sets the CacheConcurrencyStrategy + to use to read/write instances of the persistent class to the Cache. + + The CacheConcurrencyStrategy used with the Cache. + + + + Gets the of the class that is mapped in the class element. + + + The of the Superclass that is mapped in the class element. + + + + + Gets or sets the that this mapped class is extending. + + + The that this mapped class is extending. + + + + + Gets or sets the that is used as the id. + + + The from the Superclass that is used as the id. + + + + + Gets or sets the that contains information about the identifier. + + The from the Superclass that contains information about the identifier. + + + + Gets a boolean indicating if the mapped class has a Property for the id. + + if in the Superclass there is a Property for the id. + + + + Gets or sets the that contains information about the discriminator. + + The from the Superclass that contains information about the discriminator. + + + + Gets or set a boolean indicating if the mapped class has properties that can be changed. + + if the Superclass is mutable. + + + + Gets or sets if the mapped class is a subclass. + + + since this mapped class is a subclass. + + + The setter should not be used to set the value to anything but . + + + + + Gets or sets the that is used as the version. + + The from the Superclass that is used as the version. + + + + Gets or sets a boolean indicating if the identifier is + embedded in the class. + + if the Superclass has an embedded identifier. + + An embedded identifier is true when using a composite-id specifying + properties of the class as the key-property instead of using a class + as the composite-id. + + + + + Gets or sets the that contains information about the Key. + + The that contains information about the Key. + + + + Gets or sets a boolean indicating if explicit polymorphism should be used in Queries. + + + The value of the Superclasses IsExplicitPolymorphism property. + + + + + Gets the sql string that should be a part of the where clause. + + + The sql string that should be a part of the where clause. + + + Thrown when the setter is called. The where clause can not be set on the + SubclassType, only the RootClass. + + + + + Gets or Sets the that this class is stored in. + + The this class is stored in. + + This also adds the to the Superclass' collection + of SubclassType Tables. + + + + + + + + + A many-to-one association mapping + + + + A simple-point association (ie. a reference to another entity). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A map has a primary key consisting of the key columns + + index columns. + + + + + Initializes a new instance of the class. + + The that contains this map mapping. + + + + Gets the appropriate that is + specialized for this list mapping. + + + + + A meta attribute is a named value or values. + + + + + A mapping for a one-to-many association. + + + + + + + + + + No foreign key element for a one-to-many + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A mapping for a one-to-one association. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A Primary Key constraint in the database. + + + + + Generates the SQL string to create the Primary Key Constraint in the database. + + The to use for SQL rules. + + + A string that contains the SQL to create the Primary Key Constraint. + + + + + Generates the SQL string to create the named Primary Key Constraint in the database. + + The to use for SQL rules. + The name to use as the identifier of the constraint in the database. + + + + A string that contains the SQL to create the named Primary Key Constraint. + + + + + Get the SQL string to drop this Constraint in the database. + + The to use for SQL rules. + + + + A string that contains the SQL to drop this Constraint. + + + + + A primitive array has a primary key consisting + of the key columns + index column. + + + + + Indicates whether given properties are generated by the database and, if + so, at what time(s) they are generated. + + + + + Values for this property are never generated by the database. + + + + + Values for this property are generated by the database on insert. + + + + + Values for this property are generated by the database on both insert and update. + + + + + Declaration of a System.Type mapped with the <class> element that + is the root class of a table-per-subclass, or table-per-concrete-class + inheritance heirarchy. + + + + + The default name of the column for the Identifier + + id is the default column name for the Identifier. + + + + The default name of the column for the Discriminator + + class is the default column name for the Discriminator. + + + + Adds a to the class hierarchy. + + The to add to the hierarchy. + + When a is added this mapped class has the property + set to . + + + + + + + + + + + Gets a boolean indicating if this mapped class is inherited from another. + + + because this is the root mapped class. + + + + + Gets an of objects that this mapped class contains. + + + An of objects that + this mapped class contains. + + + + + Gets an of objects that this + mapped class reads from and writes to. + + + An of objects that + this mapped class reads from and writes to. + + + There is only one in the since + this is the root class. + + + + + Gets a boolean indicating if the mapped class has a version property. + + if there is a Property for a version. + + + + Gets the of the class + that is mapped in the class element. + + + The of the class this mapped class. + + + + + Gets or sets a boolean indicating if the identifier is + embedded in the class. + + if the class identifies itself. + + An embedded identifier is true when using a composite-id specifying + properties of the class as the key-property instead of using a class + as the composite-id. + + + + + Gets or sets the cache region name. + + The region name used with the Cache. + + + + + + + + + Gets or sets the that is used as the id. + + + The that is used as the id. + + + + + Gets or sets the that contains information about the identifier. + + The that contains information about the identifier. + + + + Gets a boolean indicating if the mapped class has a Property for the id. + + if there is a Property for the id. + + + + Gets or sets the that contains information about the discriminator. + + The that contains information about the discriminator. + + + + Gets or sets if the mapped class has subclasses. + + + if the mapped class has subclasses. + + + + + Gets the of the class that is mapped in the class element. + + + this since this is the root mapped class. + + + + + Gets or sets a boolean indicating if explicit polymorphism should be used in Queries. + + + if only classes queried on should be returned, + if any class in the hierarchy should implicitly be returned. + + + + + Gets or sets the that is used as the version. + + The that is used as the version. + + + + Gets or set a boolean indicating if the mapped class has properties that can be changed. + + if the object is mutable. + + + + Gets or sets the that this mapped class is extending. + + + since this is the root class. + + + Thrown when the setter is called. The Superclass can not be set on the + RootClass, only the SubclassType can have a Superclass set. + + + + + Gets or sets the that contains information about the Key. + + The that contains information about the Key. + + + + + + + + + Gets or sets a boolean indicating if only values in the discriminator column that + are mapped will be included in the sql. + + if the mapped discriminator values should be forced. + + + + Gets or sets the sql string that should be a part of the where clause. + + + The sql string that should be a part of the where clause. + + + + + Gets or sets the CacheConcurrencyStrategy + to use to read/write instances of the persistent class to the Cache. + + The CacheConcurrencyStrategy used with the Cache. + + + + A Set with no nullable element columns will have a primary + key consisting of all table columns (ie - key columns + + element columns). + + + + + A simple implementation of AbstractAuxiliaryDatabaseObject in which the CREATE and DROP strings are + provided up front. + + + Contains simple facilities for templating the catalog and schema + names into the provided strings. + This is the form created when the mapping documents use <create/> and <drop/>. + + + + Placeholder for typedef information + + + + An Unique Key constraint in the database. + + + + + Generates the SQL string to create the Unique Key Constraint in the database. + + The to use for SQL rules. + A string that contains the SQL to create the Unique Key Constraint. + + + + Generates the SQL string to create the Unique Key Constraint in the database. + + The to use for SQL rules. + + + + + A string that contains the SQL to create the Unique Key Constraint. + + + + + Get the SQL string to drop this Constraint in the database. + + The to use for SQL rules. + + + + A string that contains the SQL to drop this Constraint. + + + + + Exposes entity class metadata to the application + + + + + Get the type of a particular (named) property + + + Return the values of the mapped properties of the object + + + + The persistent class + + + + + Create a class instance initialized with the given identifier + + + + + Get the value of a particular (named) property + + + + Extract the property values from the given entity. + The entity from which to extract the property values. + The entity-mode of the given entity + The property values. + + + + Set the value of a particular (named) property + + + + + Set the given values to the mapped properties of the given object + + + + + Get the identifier of an instance (throw an exception if no identifier property) + + + + + Set the identifier of an instance (or do nothing if no identifier property) + + + + Does the class implement the interface? + + + Does the class implement the interface? + + + + Get the version number (or timestamp) from the object's version property + (or return null if not versioned) + + + + + The name of the entity + + + + + The name of the identifier property (or return null) + + + + + The names of the class' persistent properties + + + + + The identifier Hibernate type + + + + + The Hibernate types of the classes properties + + + + + Are instances of this class mutable? + + + + + Are instances of this class versioned by a timestamp or version number column? + + + + + Gets the index of the version property + + + + + Get the nullability of the class' persistent properties + + + + Get the "laziness" of the properties of this class + + + Which properties hold the natural id? + + + Does this entity extend a mapped superclass? + + + Does the class support dynamic proxies? + + + Does the class have an identifier property? + + + Does this entity declare a natural id? + + + Does this entity have mapped subclasses? + + + + Exposes collection metadata to the application + + + + + The collection key type + + + + + The collection element type + + + + + The collection index type (or null if the collection has no index) + + + + + Is the collection indexed? + + + + + The name of this collection role + + + + + Is the collection an array? + + + + + Is the collection a primitive array? + + + + + Is the collection lazily initialized? + + + + + Additional information for potential paging parameters in HQL/LINQ + + + + + An additional contract for parameters which originate from parameters explicitly encountered in the source statement + (HQL or native-SQL). + Author: Steve Ebersole + Ported by: Steve Strong + + + + + Maintains information relating to parameters which need to get bound into a . + + + + + Bind the appropriate value into the given command. + + The command into which the value should be bound. + The list of Sql query parameter in the exact sequence they are present in the query. + The defined values for the current query execution. + The session against which the current execution is occuring. + + + + Bind the appropriate value into the given command. + + The command into which the value should be bound. + The parameter-list of the whole query of the command. + The offset from where start the list of in the given for the query where this was used. + The list of Sql query parameter in the exact sequence they are present in the query where this was used. + The defined values for the query where this was used. + The session against which the current execution is occuring. + + Suppose the is composed by two queries. The for the first query is zero. + If the first query in has 12 parameters (size of its SqlType array) the offset to bind all s of the second query in the + is 12 (for the first query we are using from 0 to 11). + + + + + Render this parameter into displayable info (for logging, etc). + + The displayable info + + + + An string array to unique identify this parameter-span inside an . + + The session-factory (used only because required by IType). + + The each id-for-backtrack is supposed to be unique in the context of a query. + + The number of elements returned depend on the column-span of the . + + + + + + Get or set the type which we are expeting for a bind into this parameter based + on translated contextual information. + + + + + Explicit parameters may have no set the during query parse. + + The defined values for the current query execution. + + This method should be removed when the parameter type is inferred during the parse. + + + + + Retrieves the line number on which this parameter occurs in the source query. + + + + + Retrieves the column number (within the {@link #getSourceLine()}) where this parameter occurs. + + + + + Notifies the parameter that it is a 'skip' parameter, and should calculate its value using the dialect settings + + + + + Notifies the parameter that it is a 'take' parameter, and should calculate its value using the dialect settings + and the value of the supplied skipParameter. + + The associated skip parameter (null if there is none). + + + + Retrieve the skip/offset value for the query + + The parameters for the query + The paging skip/offset value + + + + Constructs an AbstractExplicitParameterSpecification. + + sourceLine + sourceColumn + + + + Creates a specialized collection-filter collection-key parameter spec. + + The collection role being filtered. + The mapped collection-key type. + The position within QueryParameters where we can find the appropriate param value to bind. + + + + Constructs a parameter specification for a particular filter parameter. + + The name of the filter + The name of the parameter + The paremeter type specified on the filter metadata + + + + + Defines a mapping from a .NET to a SQL datatype. + This interface is intended to be implemented by applications that need custom types. + + Implementors should usually be immutable and MUST definately be threadsafe. + + + + + When implemented by a class, returns the SqlTypes for the columns mapped by this IType. + The that uses this IType.An array of s. + + + + When implemented by a class, returns how many columns are used to persist this type. + The that uses this IType.The number of columns this IType spans.MappingException + + + + When implemented by a class, should the parent be considered dirty, + given both the old and current field or element value? + The old valueThe current valueThe true if the field is dirty + + + + When implemented by a class, gets an instance of the object mapped by + this IType from the . + The that contains the values + The names of the columns in the that contain the + value to populate the IType with. + The object mapped by this IType. + Implementors should handle possibility of null values. + + + + + When implemented by a class, gets an instance of the object + mapped by this IType from the . + The that contains the valuesThe name of the column in the that contains the + value to populate the IType with.The object mapped by this IType. + Implementations should handle possibility of null values. + This method might be called if the IType is known to be a single-column type. + + + + + When implemented by a class, puts the value/values from the mapped + class into the . + The to put the values into.The object that contains the values.The index of the to start writing the values to.Indicates which columns are to be set. + Implementors should handle possibility of null values. + A multi-column type should be written to parameters starting from . + + + + + When implemented by a class, puts the value/values from the mapped + class into the . + + The to put the values into. + The object that contains the values. + The index of the to start writing the values to. + + Implementors should handle possibility of null values. + A multi-column type should be written to parameters starting from . + + + + + When implemented by a class, a representation of the value to be + embedded in an XML element + The object that contains the values.An Xml formatted string. + + + + When implemented by a class, returns a deep copy of the persistent + state, stopping at entities and at collections. + A Collection element or Entity fieldThe entityMode.The session factory.A deep copy of the object. + + + + When implemented by a class, retrieves an instance of the mapped class, + or the identifier of an entity or collection from a . + The that contains the values. + The names of the columns in the that contain the + value to populate the IType with. + the sessionThe parent EntityAn identifier or actual object mapped by this IType. + + This is useful for 2-phase property initialization - the second phase is a call to + ResolveIdentifier() + + + Most implementors of this method will just pass the call to NullSafeGet(). + + + + + + When implemented by a class, maps identifiers to Entities or Collections. + An identifier or value returned by Hydrate()The sessionThe parent EntityThe Entity or Collection referenced by this Identifier. + This is the second phase of 2-phase property initialization. + + + + + Given a hydrated, but unresolved value, return a value that may be used to + reconstruct property-ref associations. + + + + + + + + During merge, replace the existing (target) value in the entity we are merging to + with a new (original) value from the detached entity we are merging. For immutable + objects, or null values, it is safe to simply return the first parameter. For + mutable objects, it is safe to return a copy of the first parameter. For objects + with component values, it might make sense to recursively replace component values. + + the value from the detached entity being merged + the value in the managed entity + + + + + the value to be merged + + + + Compare two instances of the class mapped by this type for persistence + "equality" - equality of persistent state - taking a shortcut for + entity references. + + + + + boolean + + + + Compare two instances of the class mapped by this type for persistence + "equality" - equality of persistent state. + + + + + boolean + + + + Compare two instances of the class mapped by this type for persistence + "equality" - equality of persistent state. + + + + + + boolean + + + Get a hashcode, consistent with persistence "equality" + + + + + Get a hashcode, consistent with persistence "equality" + + + + + + compare two instances of the type + + + + + + Get the type of a semi-resolved value. + + + A representation of the value to be embedded in an XML element. + + + + + + Parse the XML representation of an instance. + + + an instance of the type + + + + Given an instance of the type, return an array of boolean, indicating + which mapped columns would be null. + + an instance of the type + + + + + When implemented by a class, gets the abbreviated name of the type. + The NHibernate type name. + + + + When implemented by a class, gets the returned + by the NullSafeGet() methods. + + The from the .NET framework. + + This is used to establish the class of an array of this Itype + + + + + When implemented by a class, gets the value indicating if the objects + of this IType are mutable. + true if the objects mapped by this IType are mutable. + With respect to the referencing object... + Entities and Collections are considered immutable because they manage their own internal state. + + + + + When implemented by a class, gets a value indicating if the implementor is castable to an an + true if this is an AssociationThis does not necessarily imply that the type actually represents an association. + + + + When implemented by a class, gets a value indicating if the implementor is a collection type + true if this is a . + + + + When implemented by a class, gets a value indicating if the implementor + is an . + true if this is an + If true, the implementation must be castable to . + A component type may own collections or associations and hence must provide certain extra functionality. + + + + + When implemented by a class, gets a value indicating if the implementor + extends + true if this is an + + + + + + + Parameter bind specification for an explicit named parameter. + + + + + Constructs a named parameter bind specification. + + sourceLine + sourceColumn + The named parameter name. + + + + The user parameter name. + + + + + Parameter bind specification for an explicit positional (or ordinal) parameter. + + + + + Constructs a position/ordinal parameter bind specification. + + sourceLine + sourceColumn + The position in the source query, relative to the other source positional parameters. + + + + Getter for property 'hqlPosition'. + + + + + Autogenerated parameter for . + + + + + Autogenerated parameter for . + + + + + Summary description for AbstractCollectionPersister. + + + + + A collection role that may be queried or loaded by outer join. + + + + + Anything that can be loaded by outer join - namely persisters for classes or collections. + + + + + All columns to select, when loading. + + + + + Get the where clause part of any joins (optional operation) + + + + + + + + + Get the from clause part of any joins (optional operation) + + + + + + + + + Get the where clause filter, given a query alias and considering enabled session filters + + + + + Very, very, very ugly... + + Does this persister "consume" entity column aliases in the result + set? + + + + Very, very, very ugly... + + Does this persister "consume" collection column aliases in the result + set? + + + + An identifying name; a class name or collection role name. + + + + + The columns to join on. + + + + + Is this instance actually a ICollectionPersister? + + + + + The table to join to. + + + + + A strategy for persisting a collection role. + + + Defines a contract between the persistence strategy and the actual persistent collection framework + and session. Does not define operations that are required for querying collections, or loading by outer join. + + Implements persistence of a collection instance while the instance is + referenced in a particular role. + + This class is highly coupled to the + hierarchy, since double dispatch is used to load and update collection + elements. + + May be considered an immutable view of the mapping object + + + + + Initialize the given collection with the given key + + + + + + + Read the key from a row of the + + + + + Read the element from a row of the + + + + + Read the index from a row of the + + + + + Read the identifier from a row of the + + + + + Completely remove the persistent state of the collection + + + + + + + (Re)create the collection's persistent state + + + + + + + + Delete the persistent state of any elements that were removed from the collection + + + + + + + + Update the persistent state of any elements that were modified + + + + + + + + Insert the persistent state of any new collection elements + + + + + + + + Generates the collection's key column aliases, based on the given + suffix. + + The suffix to use in the key column alias generation. + The key column aliases. + + + + Generates the collection's index column aliases, based on the given + suffix. + + The suffix to use in the index column alias generation. + The index column aliases, or null if not indexed. + + + + Generates the collection's element column aliases, based on the given + suffix. + + The suffix to use in the element column alias generation. + The element column aliases. + + + + Generates the collection's identifier column aliases, based on the given + suffix. + + The suffix to use in the identifier column alias generation. + The identifier column aliases. + + + + Try to find an element by a given index. + + The key of the collection (collection-owner identifier) + The given index. + The active . + The owner of the collection. + The value of the element where available; otherwise . + + + + Get the cache + + + + Get the cache structure + + + + Get the associated IType + + + + + Get the "key" type (the type of the foreign key) + + + + + Get the "index" type for a list or map (optional operation) + + + + + Get the "element" type + + + + + Return the element class of an array, or null otherwise + + + + + Is this an array or primitive values? + + + + + Is this an array? + + + + Is this a one-to-many association? + + + + Is this a many-to-many association? Note that this is mainly + a convenience feature as the single persister does not + contain all the information needed to handle a many-to-many + itself, as internally it is looked at as two many-to-ones. + + + + + Is this collection lazily initialized? + + + + + Is this collection "inverse", so state changes are not propogated to the database. + + + + + Get the name of this collection role (the fully qualified class name, extended by a "property path") + + + + Get the persister of the entity that "owns" this collection + + + + Get the surrogate key generation strategy (optional operation) + + + + + Get the type of the surrogate key + + + + Get the "space" that holds the persistent state + + + + Is cascade delete handled by the database-level + foreign key constraint definition? + + + + + Does this collection cause version increment of the owning entity? + + + + Can the elements of this collection change? + + + + Is this collection role cacheable + + + + + Is this an "indexed" collection? (list or map) + + + + + Does this collection implement "orphan delete"? + + + + + Is this an ordered collection? (An ordered collection is + ordered by the initialization operation, not by sorting + that happens in memory, as in the case of a sorted collection.) + + + + + A place-holder to inform that the data-reader was empty. + + + + + Generate a list of collection index and element columns + + + + + Get the names of the collection index columns if + this is an indexed collection (optional operation), + aliased by the given table alias + + + + + Get the names of the collection element columns (or the primary + key columns in the case of a one-to-many association), + aliased by the given table alias + + + + + Get the extra where clause filter SQL + + + + + + + Get the order by SQL + + + + + + + Get the order-by to be applied at the target table of a many to many + + The alias for the many-to-many target table + Appropriate order-by fragment or empty string. + + + + Get the index formulas if this is an indexed collection + (optional operation) + + + + + Get the persister of the element class, if this is a + collection of entities (optional operation). Note that + for a one-to-many association, the returned persister + must be OuterJoinLoadable. + + + + + Should we load this collection role by outer joining? + + + + + Get the names of the collection index columns if this is an indexed collection (optional operation) + + + + + Get the names of the collection element columns (or the primary key columns in the case of a one-to-many association) + + + + + Does this collection role have a where clause filter? + + + + + Reads the Element from the IDataReader. The IDataReader will probably only contain + the id of the Element. + + See ReadElementIdentifier for an explanation of why this method will be depreciated. + + + + Perform an SQL INSERT, and then retrieve a generated identifier. + + the id of the collection entry + + This form is used for PostInsertIdentifierGenerator-style ids (IDENTITY, select, etc). + + + + + Return the element class of an array, or null otherwise + + + + + Get the name of this collection role (the fully qualified class name, + extended by a "property path") + + + + + Collection persister for collections of values and many-to-many associations. + + + + + Generate the SQL DELETE that deletes all rows + + + + + + Generate the SQL INSERT that creates a new row + + + + + + Generate the SQL UPDATE that updates a row + + + + + + Generate the SQL DELETE that deletes a particular row + + + + + + Create the + + + + + Summary description for CollectionPropertyMapping. + + + + + The names of all the collection properties. + + + + + Summary description for CompositeElementPropertyMapping. + + + + + Base implementation of a PropertyMapping. + + + + + Summary description for ElementPropertyMapping. + + + + + Generate the SQL UPDATE that updates all the foreign keys to null + + + + + + Generate the SQL UPDATE that updates a foreign key to a value + + + + + + Not needed for one-to-many association + + + + + + Generate the SQL UPDATE that updates a particular row's foreign + key to null + + + + + + Create the + + + + + Superclass for built-in mapping strategies. Implements functionalty common to both mapping + strategies + + + May be considered an immutable view of the mapping object + + + + + A ClassPersister that may be loaded by outer join using + the OuterJoinLoader hierarchy and may be an element + of a one-to-many association. + + + + + Implemented by ClassPersister that uses Loader. There are several optional + operations used only by loaders that inherit OuterJoinLoader + + + + + Concrete IEntityPersisters implement mapping and persistence logic for a particular class. + + + Implementors must be threadsafe (preferably immutable) and must provide a constructor of type + matching the signature of: (PersistentClass, SessionFactoryImplementor) + + + + + Finish the initialization of this object, once all ClassPersisters have been + instantiated. Called only once, before any other method. + + + + + Determine whether the given name represents a subclass entity + (or this entity itself) of the entity mapped by this persister. + + The entity name to be checked. + + True if the given entity name represents either the entity mapped by this persister or one of its subclass entities; + false otherwise. + + + + + Get the type of a particular property + + + + + + Locate the property-indices of all properties considered to be dirty. + The current state of the entity (the state to be checked). + The previous state of the entity (the state to be checked against). + The entity for which we are checking state dirtiness. + The session in which the check is ccurring. + or the indices of the dirty properties + + + Locate the property-indices of all properties considered to be dirty. + The old state of the entity. + The current state of the entity. + The entity for which we are checking state modification. + The session in which the check is ccurring. + return or the indicies of the modified properties + + + + Retrieve the current state of the natural-id properties from the database. + + + The identifier of the entity for which to retrieve the naturak-id values. + + + The session from which the request originated. + + The natural-id snapshot. + + + + Load an instance of the persistent class. + + + + + Do a version check (optional operation) + + + + + Persist an instance + + + + + Persist an instance, using a natively generated identifier (optional operation) + + + + + Delete a persistent instance + + + + + Update a persistent instance + + The id. + The fields. + The dirty fields. + if set to [has dirty collection]. + The old fields. + The old version. + The obj. + The rowId + The session. + + + + Get the current database state of the object, in a "hydrated" form, without resolving identifiers + + + + if select-before-update is not enabled or not supported + + + + Get the current version of the object, or return null if there is no row for + the given identifier. In the case of unversioned data, return any object + if the row exists. + + + + + + + Try to discover the entity mode from the entity instance + + + Has the class actually been bytecode instrumented? + + + Called just after the entities properties have been initialized + + + Called just after the entity has been reassociated with the session + + + + Create a new proxy instance + + + + + + + Is this a new transient instance? + + + Return the values of the insertable properties of the object (including backrefs) + + + + Perform a select to retrieve the values of any generated properties + back from the database, injecting these generated values into the + given entity as well as writing this state to the persistence context. + + + Note, that because we update the persistence context here, callers + need to take care that they have already written the initial snapshot + to the persistence context before calling this method. + + The entity's id value. + The entity for which to get the state. + The entity state (at the time of Save). + The session. + + + + Perform a select to retrieve the values of any generated properties + back from the database, injecting these generated values into the + given entity as well as writing this state to the persistence context. + + + Note, that because we update the persistence context here, callers + need to take care that they have already written the initial snapshot + to the persistence context before calling this method. + + The entity's id value. + The entity for which to get the state. + The entity state (at the time of Save). + The session. + + + + The persistent class, or null + + + + + Does the class implement the ILifecycle inteface? + + + + + Does the class implement the IValidatable interface? + + + + + Get the proxy interface that instances of this concrete class will be cast to + + + + + Set the given values to the mapped properties of the given object + + + + + Set the value of a particular property + + + + + Return the values of the mapped properties of the object + + + + + Get the value of a particular property + + + + + Get the value of a particular property + + + + + Get the identifier of an instance ( throw an exception if no identifier property) + + + + + Set the identifier of an instance (or do nothing if no identifier property) + + The object to set the Id property on. + The value to set the Id property to. + The EntityMode + + + + Get the version number (or timestamp) from the object's version property (or return null if not versioned) + + + + + Create a class instance initialized with the given identifier + + + + + Determines whether the specified entity is an instance of the class + managed by this persister. + + The entity. + The EntityMode + + if the specified entity is an instance; otherwise, . + + + + Does the given instance have any uninitialized lazy properties? + + + + Set the identifier and version of the given instance back + to its "unsaved" value, returning the id + + + + Get the persister for an instance of this class or a subclass + + + + Check the version value trough . + + The snapshot entity state + The result of . + NHibernate-specific feature, not present in H3.2 + + + + The ISessionFactory to which this persister "belongs". + + + + + Returns an object that identifies the space in which identifiers of + this entity hierarchy are unique. + + + + + The entity name which this persister maps. + + + + + Retrieve the underlying entity metamodel instance... + + The metamodel + + + + Returns an array of objects that identify spaces in which properties of + this entity are persisted, for instances of this class only. + + The property spaces. + + For most implementations, this returns the complete set of table names + to which instances of the mapped entity are persisted (not accounting + for superclass entity mappings). + + + + + Returns an array of objects that identify spaces in which properties of + this entity are persisted, for instances of this class and its subclasses. + + + Much like , except that here we include subclass + entity spaces. + + The query spaces. + + + + Are instances of this class mutable? + + + + + Determine whether the entity is inherited one or more other entities. + In other words, is this entity a subclass of other entities. + + True if other entities extend this entity; false otherwise. + + + + Is the identifier assigned before the insert by an IDGenerator or is it returned + by the Insert() method? + + + This determines which form of Insert() will be called. + + + + + Are instances of this class versioned by a timestamp or version number column? + + + + + Get the type of versioning (optional operation) + + + + + Which property holds the version number? (optional operation) + + + + + If the entity defines a natural id (), which + properties make up the natural id. + + + The indices of the properties making of the natural id; or + null, if no natural id is defined. + + + + + Return the IIdentifierGenerator for the class + + + + + Get the Hibernate types of the class properties + + + + + Get the names of the class properties - doesn't have to be the names of the actual + .NET properties (used for XML generation only) + + + + + Gets if the Property is insertable. + + if the Property's value can be inserted. + + This is for formula columns and if the user sets the insert attribute on the <property> element. + + + + Which of the properties of this class are database generated values on insert? + + + Which of the properties of this class are database generated values on update? + + + + Properties that may be dirty (and thus should be dirty-checked). These + include all updatable properties and some associations. + + + + + Get the nullability of the properties of this class + + + + + Get the "versionability" of the properties of this class (is the property optimistic-locked) + + if the property is optimistic-locked; otherwise, . + + + + Get the cascade styles of the properties (optional operation) + + + + + Get the identifier type + + + + + Get the name of the indentifier property (or return null) - need not return the + name of an actual .NET property + + + + + Should we always invalidate the cache instead of recaching updated state + + + + + Should lazy properties of this entity be cached? + + + + + Get the cache (optional operation) + + + + Get the cache structure + + + + Get the user-visible metadata for the class (optional operation) + + + + + Is batch loading enabled? + + + + Is select snapshot before update enabled? + + + + Does this entity contain a version property that is defined + to be database generated? + + + + + Does this class support dynamic proxies? + + + + + Do instances of this class contain collections? + + + + + Determine whether any properties of this entity are considered mutable. + + + True if any properties of the entity are mutable; false otherwise (meaning none are). + + + + + Determine whether this entity contains references to persistent collections + which are fetchable by subselect? + + + True if the entity contains collections fetchable by subselect; false otherwise. + + + + + Does this class declare any cascading save/update/deletes? + + + + + Does the class have a property holding the identifier value? + + + + + Determine whether detahced instances of this entity carry their own + identifier value. + + + True if either (1) or + (2) the identifier is an embedded composite identifier; false otherwise. + + + The other option is the deprecated feature where users could supply + the id during session calls. + + + + + Determine whether this entity defines a natural identifier. + + True if the entity defines a natural id; false otherwise. + + + + Determine whether this entity defines any lazy properties (ala + bytecode instrumentation). + + + True if the entity has properties mapped as lazy; false otherwise. + + + + + Gets if the Property is updatable + + if the Property's value can be updated. + + This is for formula columns and if the user sets the update attribute on the <property> element. + + + + + Does this class have a cache? + + + + + Does this entity define any properties as being database-generated on insert? + + + + + Does this entity define any properties as being database-generated on update? + + + + + Get the concrete subclass corresponding to the given discriminator value + + + + + Get the result set aliases used for the identifier columns, given a suffix + + + + + Get the result set aliases used for the property columns, given a suffix (properties of this class, only). + + + + + Get the result set column names mapped for this property (properties of this class, only). + + + + + Get the alias used for the discriminator column, given a suffix + + + + + Retrieve property values from one row of a result set + + + + + The discriminator type + + + + + Get the names of columns used to persist the identifier + + + + + Get the name of the column used as a discriminator + + + + + Does the persistent class have subclasses? + + + + Does the result set contain rowids? + + + + Generate a list of collection index and element columns + + + + + + + + How many properties are there, for this class and all subclasses? (optional operation) + + + + + + May this property be fetched using an SQL outerjoin? + + + + + + + Get the cascade style of this (subclass closure) property + + + + + Is this property defined on a subclass of the mapped class? + + + + + + + Get an array of the types of all properties of all subclasses (optional operation) + + + + + + + Get the name of the numbered property of the class or a subclass + (optional operation) + + + + + + + Is the numbered property of the class of subclass nullable? + + + + + Return the column names used to persist all properties of all sublasses of the persistent class + (optional operation) + + + + + Return the table name used to persist the numbered property of + the class or a subclass + (optional operation) + + + + + Given the number of a property of a subclass, and a table alias, return the aliased column names + (optional operation) + + + + + + + + Get the main from table fragment, given a query alias (optional operation) + + + + + + + Get the column names for the given property path + + + + + Get the table name for the given property path + + + + + Return the alised identifier column names + + + + + Get the table alias used for the supplied column + + + + + Extends the generic ILoadable contract to add operations required by HQL + + + + + Given a query alias and an identifying suffix, render the identifier select fragment. + + + + + + + + Given a query alias and an identifying suffix, render the property select fragment. + + + + + Given a property name, determine the number of the table which contains the column + to which this property is mapped. + + The name of the property. + The number of the table to which the property is mapped. + + Note that this is not relative to the results from {@link #getConstraintOrderedTableNameClosure()}. + It is relative to the subclass table name closure maintained internal to the persister (yick!). + It is also relative to the indexing used to resolve {@link #getSubclassTableName}... + + + + Determine whether the given property is declared by our + mapped class, our super class, or one of our subclasses... +

+ Note: the method is called 'subclass property...' simply + for consistency sake (e.g. {@link #getSubclassPropertyTableNumber} +

+ The property name. + The property declarer +
+ + + Get the name of the table with the given index from the internal array. + + The index into the internal array. + + + + + The alias used for any filter conditions (mapped where-fragments or + enabled-filters). + + The root alias + The alias used for "filter conditions" within the where clause. + + This may or may not be different from the root alias depending upon the + inheritance mapping strategy. + + + + + Is this class explicit polymorphism only? + + + + + The class that this class is mapped as a subclass of - not necessarily the direct superclass + + + + + The discriminator value for this particular concrete subclass, as a string that may be + embedded in a select statement + + + + + The discriminator value for this particular concrete subclass + + The DiscriminatorValue is specific of NH since we are using strongly typed parameters for SQL query. + + + + Is the inheritance hierarchy described by this persister contained across + multiple tables? + + True if the inheritance hierarchy is spread across multiple tables; false otherwise. + + + + Get the names of all tables used in the hierarchy (up and down) ordered such + that deletes in the given order would not cause constraint violations. + + The ordered array of table names. + + + + For each table specified in , get + the columns that define the key between the various hierarchy classes. + + + The first dimension here corresponds to the table indexes returned in + . + + The second dimension should have the same length across all the elements in + the first dimension. If not, that'd be a problem ;) + + + + + Get the name of the temporary table to be used to (potentially) store id values + when performing bulk update/deletes. + + The appropriate temporary table name. + + + + Get the appropriate DDL command for generating the temporary table to + be used to (potentially) store id values when performing bulk update/deletes. + + The appropriate temporary table creation command. + + + Is the version property included in insert statements? + + + + Describes a class that may be loaded via a unique key. + + + + + Load an instance of the persistent class, by a unique key other than the primary key. + + + + + Get the property number of the unique key property + + + + + A class persister that supports queries expressed in the platform native SQL dialect. + + + + + Returns the column alias names used to persist/query the numbered property of the class or a subclass (optional operation). + + + + + Return the column names used to persist/query the named property of the class or a subclass (optional operation). + + + + + All columns to select, when loading. + + + + + Get the type + + + + + Contract for things that can be locked via a . + + + Currently only the root table gets locked, except for the case of HQL and Criteria queries + against dialects which do not support either (1) FOR UPDATE OF or (2) support hint locking + (in which case *all* queried tables would be locked). + + + + + Get the SQL alias this persister would use for the root table + given the passed driving alias. + + + The driving alias; or the alias for the table mapped by this persister in the hierarchy. + + The root table alias. + + + + Locks are always applied to the "root table". + + + + + Get the names of columns on the root table used to persist the identifier. + + + + + For versioned entities, get the name of the column (again, expected on the + root table) used to store the version values. + + + + + To build the SQL command in pessimistic lock + + + + + Decide which tables need to be updated + + The indices of all the entity properties considered dirty. + Whether any collections owned by the entity which were considered dirty. + Array of booleans indicating which table require updating. + + The return here is an array of boolean values with each index corresponding + to a given table in the scope of this persister. + + + + + Generate the SQL that selects the version number by id + + + + + Retrieve the version number + + + + + Warning: + When there are duplicated property names in the subclasses + of the class, this method may return the wrong table + number for the duplicated subclass property (note that + SingleTableEntityPersister defines an overloaded form + which takes the entity name. + + + + + Get the column names for the numbered property of this class + + + + + Must be called by subclasses, at the end of their constructors + + + + Generate the SQL that updates a row by id (and version) + + + Generate the SQL that inserts a row + + + Marshall the fields of a persistent instance to a prepared statement + + + + Unmarshall the fields of a persistent instance from a result set, + without resolving associations or collections + + + + + Perform an SQL INSERT, and then retrieve a generated identifier. + + + This form is used for PostInsertIdentifierGenerator-style ids (IDENTITY, select, etc). + + + + + Perform an SQL INSERT. + + + This for is used for all non-root tables as well as the root table + in cases where the identifier value is known before the insert occurs. + + + + Perform an SQL UPDATE or SQL INSERT + + + + Perform an SQL DELETE + + + + + Load an instance using the appropriate loader (as determined by + + + + + Transform the array of property indexes to an array of booleans, true when the property is dirty + + + + Which properties appear in the SQL update? (Initialized, updateable ones!) + + + + Determines whether the specified entity is an instance of the class + managed by this persister. + + The entity. + The entity mode. + + if the specified entity is an instance; otherwise, . + + + + + The queries that delete rows by id (and version) + + + + + The queries that insert rows with a given id + + + + + The queries that update rows by id (and version) + + + + + The query that inserts a row, letting the database generate an id + + The IDENTITY-based insertion query. + + + + We can't immediately add to the cache if we have formulas + which must be evaluated, or if we have the possibility of + two concurrent updates to the same item being merged on + the database. This can happen if (a) the item is not + versioned and either (b) we have dynamic update enabled + or (c) we have multiple tables holding the state of the + item. + + + + The property name of the "special" identifier property in HQL + + + + A IEntityPersister implementing the normalized "table-per-subclass" mapping strategy + + + + + Constructs the NormalizedEntityPerister for the PersistentClass. + + The PersistentClass to create the EntityPersister for. + The configured . + The SessionFactory that this EntityPersister will be stored in. + The mapping used to retrieve type information. + + + + Find the Index of the table name from a list of table names. + + The name of the table to find. + The array of table names + The Index of the table in the array. + Thrown when the tableName specified can't be found + + + + Not really a Loader, just a wrapper around a named query. + + + + + Default implementation of the ClassPersister interface. Implements the + "table-per-class hierarchy" mapping strategy for an entity class. + + + + + Factory for IEntityPersister and ICollectionPersister instances. + + + + + Creates a built in Entity Persister or a custom Persister. + + + + + Creates a specific Persister - could be a built in or custom persister. + + + + + A Strategy for converting a mapped property name to a Field name. + + + + + When implemented by a class, converts the Property's name into a Field name + + The name of the mapped property. + The name of the Field. + + + Represents a "back-reference" to the id of a collection owner. + + + + Abstracts the notion of a "property". Defines a strategy for accessing the + value of a mapped property. + + + + + When implemented by a class, create a "getter" for the mapped property. + + The to find the Property in. + The name of the mapped Property to get. + + The to use to get the value of the Property from an + instance of the . + + Thrown when a Property specified by the propertyName could not + be found in the . + + + + + When implemented by a class, create a "setter" for the mapped property. + + The to find the Property in. + The name of the mapped Property to set. + + The to use to set the value of the Property on an + instance of the . + + + Thrown when a Property specified by the propertyName could not + be found in the . + + + + + Allow embedded and custom accessors to define if the ReflectionOptimizer can be used. + + + + The Setter implementation for id backrefs. + + + + Sets values of a particular mapped property. + + + + + When implemented by a class, sets the value of the Property/Field on the object. + + The object to set the Property value in. + The value to set the Property to. + + Thrown when there is a problem setting the value in the target. + + + + + When implemented by a class, gets the name of the Property. + + The name of the Property or . + + This is an optional operation - if it is not implemented then + is an acceptable value to return. + + + + + When implemented by a class, gets the for the set + accessor of the property. + + + This is an optional operation - if the is not + for a property set then is an acceptable value to return. + It is used by the proxies to determine which setter to intercept for the + identifier property. + + + + The Getter implementation for id backrefs. + + + + Gets values of a particular mapped property. + + + + + When implemented by a class, gets the value of the Property/Field from the object. + + The object to get the Property/Field value from. + + The value of the Property for the target. + + + Thrown when there is a problem getting the value from the target. + + + + Get the property value from the given owner instance. + The instance containing the value to be retrieved. + a map of merged persistent instances to detached instances + The session from which this request originated. + The extracted value. + + + + When implemented by a class, gets the that the Property/Field returns. + + The that the Property returns. + + + + When implemented by a class, gets the name of the Property. + + The name of the Property or . + + This is an optional operation - if the is not + for a Property get then is an acceptable value to return. + + + + + When implemented by a class, gets the for the get + accessor of the property. + + + This is an optional operation - if the is not + for a property get then is an acceptable value to return. + It is used by the proxies to determine which getter to intercept for the + identifier property. + + + + + Accesses mapped property values via a get/set pair, which may be nonpublic. + The default (and recommended strategy). + + + + + Create a for the mapped property. + + The to find the Property in. + The name of the mapped Property to get. + + The to use to get the value of the Property from an + instance of the . + + Thrown when a Property specified by the propertyName could not + be found in the . + + + + + Create a for the mapped property. + + The to find the Property in. + The name of the mapped Property to get. + + The to use to set the value of the Property on an + instance of the . + + + Thrown when a Property specified by the propertyName could not + be found in the . + + + + + Helper method to find the Property get. + + The to find the Property in. + The name of the mapped Property to get. + + The for the Property get or + if the Property could not be found. + + + + + Helper method to find the Property set. + + The to find the Property in. + The name of the mapped Property to set. + + The for the Property set or + if the Property could not be found. + + + + + An for a Property get. + + + + + An that can emit IL to get the property value. + + + + + Emit IL to get the property value from the object on top of the stack. + + + + + Initializes a new instance of . + + The that contains the Property get. + The for reflection. + The name of the Property. + + + + Gets the value of the Property from the object. + + The object to get the Property value from. + + The value of the Property for the target. + + + + + Gets the that the Property returns. + + The that the Property returns. + + + + Gets the name of the Property. + + The name of the Property. + + + + Gets the for the Property. + + + The for the Property. + + + + + An for a Property set. + + + + + An that can emit IL to set the property value. + + + + + Emit IL to set the property of an object to the value. The object + is loaded onto the stack first, then the value, then this method + is called. + + + + + Initializes a new instance of . + + The that contains the Property set. + The for reflection. + The name of the mapped Property. + + + + Sets the value of the Property on the object. + + The object to set the Property value in. + The value to set the Property to. + + Thrown when there is a problem setting the value in the target. + + + + + Gets the name of the mapped Property. + + The name of the mapped Property or . + + + + Gets the for the mapped Property. + + The for the mapped Property. + + + + Implementation of for fields that are prefixed with + an m_ and the PropertyName is changed to camelCase. + + + + + Converts the Property's name into a Field name by making the first character + of the propertyName lowercase and prefixing it with the letter 'm' + and an underscore. + + The name of the mapped property. + The name of the Field in CamelCase format prefixed with an 'm' and an underscore. + + + + Implementation of for fields that are the + camelCase version of the PropertyName + + + + + Converts the Property's name into a Field name by making the first character + lower case. + + The name of the mapped property. + The name of the Field in CamelCase format. + + + + Implementation of for fields that are prefixed with + an underscore and the PropertyName is changed to camelCase. + + + + + Converts the Property's name into a Field name by making the first character + of the propertyName lowercase and prefixing it with an underscore. + + The name of the mapped property. + The name of the Field in CamelCase format prefixed with an underscore. + + + + Access the mapped property by using a Field to get and set the value. + + + The is useful when you expose getter and setters + for a Property, but they have extra code in them that shouldn't be executed when NHibernate + is setting or getting the values for loads or saves. + + + + + Initializes a new instance of . + + + + + Initializes a new instance of . + + The to use. + + + + Create a to get the value of the mapped Property + through a Field. + + The to find the Property in. + The name of the mapped Property to get. + + The to use to get the value of the Property from an + instance of the . + + Thrown when a Field specified by the propertyName could not + be found in the . + + + + + Create a to set the value of the mapped Property + through a Field. + + The to find the mapped Property in. + The name of the mapped Property to set. + + The to use to set the value of the Property on an + instance of the . + + + Thrown when a Field for the Property specified by the propertyName using the + could not be found in the . + + + + + Helper method to find the Field. + + The to find the Field in. + The name of the Field to find. + + The for the field. + + + Thrown when a field could not be found. + + + + + Converts the mapped property's name into a Field using + the if one exists. + + The name of the Property. + The name of the Field. + + + + Gets the used to convert the name of the + mapped Property in the hbm.xml file to the name of the field in the class. + + The or . + + + + An that uses a Field instead of the Property get. + + + + + Initializes a new instance of . + + The that contains the field to use for the Property get. + The for reflection. + The name of the Field. + + + + Gets the value of the Field from the object. + + The object to get the Field value from. + + The value of the Field for the target. + + + + + Gets the that the Field returns. + + The that the Field returns. + + + + Gets the name of the Property. + + since this is a Field - not a Property. + + + + Gets the for the Property. + + since this is a Field - not a Property. + + + + An that uses a Field instead of the Property set. + + + + + Initializes a new instance of . + + The that contains the Field to use for the Property set. + The for reflection. + The name of the Field. + + + + Sets the value of the Field on the object. + + The object to set the Field value in. + The value to set the Field to. + + Thrown when there is a problem setting the value in the target. + + + + + Gets the name of the Property. + + since this is a Field - not a Property. + + + + Gets the for the Property. + + since this is a Field - not a Property. + + + Represents a "back-reference" to the index of a collection. + + + Constructs a new instance of IndexPropertyAccessor. + The collection role which this back ref references. + The owner entity name. + + + The Setter implementation for index backrefs. + + + The Getter implementation for index backrefs. + + + + Implementation of for fields that are + the PropertyName in all LowerCase characters. + + + + + Converts the Property's name into a Field name by making the all characters + of the propertyName lowercase. + + The name of the mapped property. + The name of the Field in lowercase. + + + + Implementation of for fields that are prefixed with + an underscore and the PropertyName is changed to lower case. + + + + + Converts the Property's name into a Field name by making the all characters + of the propertyName lowercase and prefixing it with an underscore. + + The name of the mapped property. + The name of the Field in lowercase prefixed with an underscore. + + + Used to declare properties not represented at the pojo level + + + A Getter which will always return null. It should not be called anyway. + + + A Setter which will just do nothing. + + + + Access the mapped property through a Property get to get the value + and go directly to the Field to set the value. + + + This is most useful because Classes can provider a get for the Property + that is the <id> but tell NHibernate there is no setter for the Property + so the value should be written directly to the field. + + + + + Initializes a new instance of . + + The to use. + + + + Creates an to get the value from the Property. + + The to find the Property in. + The name of the mapped Property to get. + + The to use to get the value of the Property from an + instance of the . + + Thrown when a Property specified by the propertyName could not + be found in the . + + + + + Create a to set the value of the mapped Property + through a Field. + + The to find the mapped Property in. + The name of the mapped Property to set. + + The to use to set the value of the Property on an + instance of the . + + + Thrown when a Field for the Property specified by the propertyName using the + could not be found in the . + + + + + Converts the Property's name into a Field name by making the first character + of the propertyName uppercase and prefixing it with the letter 'm'. + + The name of the mapped property. + The name of the Field in PascalCase format prefixed with an 'm'. + + + + Implementation of for fields that are prefixed with + an m_ and the first character in PropertyName capitalized. + + + + + Converts the Property's name into a Field name by making the first character + of the propertyName uppercase and prefixing it with the letter 'm' + and an underscore. + + The name of the mapped property. + The name of the Field in PascalCase format prefixed with an 'm' and an underscore. + + + + Implementation of for fields that are prefixed with + an _ and the first character in PropertyName capitalized. + + + + + Converts the Property's name into a Field name by making the first character + of the propertyName uppercase and prefixing it with an underscore. + + The name of the mapped property. + The name of the Field in PascalCase format prefixed with an underscore. + + + + Factory for creating the various PropertyAccessor strategies. + + + + + Initializes the static members in . + + + + + Gets or creates the specified by the type. + + + The specified by the type. + + + The built in ways of accessing the values of Properties in your domain class are: + + + + Access Method + How NHibernate accesses the Mapped Class. + + + property + + The name attribute is the name of the Property. This is the + default implementation. + + + + field + + The name attribute is the name of the field. If you have any Properties + in the Mapped Class those will be bypassed and NHibernate will go straight to the + field. This is a good option if your setters have business rules attached to them + or if you don't want to expose a field through a Getter & Setter. + + + + nosetter + + The name attribute is the name of the Property. NHibernate will use the + Property's get method to retrieve the value and will use the field + to set the value. This is a good option for <id> Properties because this access method + allows users of the Class to get the value of the Id but not set the value. + + + + readonly + + The name attribute is the name of the Property. NHibernate will use the + Property's get method to retrieve the value but will never set the value back in the domain. + This is used for read-only calculated properties with only a get method. + + + + Assembly Qualified Name + + If NHibernate's built in s are not what is needed for your + situation then you are free to build your own. Provide an Assembly Qualified Name so that + NHibernate can call Activator.CreateInstance(AssemblyQualifiedName) to create it. + + + + + In order for the nosetter to know the name of the field to access NHibernate needs to know + what the naming strategy is. The following naming strategies are built into NHibernate: + + + + Naming Strategy + How NHibernate converts the value of the name attribute to a field name. + + + camelcase + + The name attribute should be changed to CamelCase to find the field. + <property name="FooBar" ... > finds a field fooBar. + + + + camelcase-underscore + + The name attribute should be changed to CamelCase and prefixed with + an underscore to find the field. + <property name="FooBar" ... > finds a field _fooBar. + + + + camelcase-m-underscore + + The name attribute should be changed to CamelCase and prefixed with + an 'm' and underscore to find the field. + <property name="FooBar" ... > finds a field m_fooBar. + + + + pascalcase-underscore + + The name attribute should be prefixed with an underscore + to find the field. + <property name="FooBar" ... > finds a field _FooBar. + + + + pascalcase-m-underscore + + The name attribute should be prefixed with an 'm' and underscore + to find the field. + <property name="FooBar" ... > finds a field m_FooBar. + + + + pascalcase-m + + The name attribute should be prefixed with an 'm'. + <property name="FooBar" ... > finds a field mFooBar. + + + + lowercase + + The name attribute should be changed to lowercase to find the field. + <property name="FooBar" ... > finds a field foobar. + + + + lowercase-underscore + + The name attribute should be changed to lowercase and prefixed with + and underscore to find the field. + <property name="FooBar" ... > finds a field _foobar. + + + + + The naming strategy can also be appended at the end of the field access method. Where + this could be useful is a scenario where you do expose a get and set method in the Domain Class + but NHibernate should only use the fields. + + + With a naming strategy and a get/set for the Property available the user of the Domain Class + could write an Hql statement from Foo as foo where foo.SomeProperty = 'a'. If no naming + strategy was specified the Hql statement would have to be from Foo as foo where foo._someProperty + (assuming CamelCase with an underscore field naming strategy is used). + + + + + Retrieves a PropertyAccessor instance based on the given property definition and entity mode. + The property for which to retrieve an accessor. + The mode for the resulting entity. + An appropriate accessor. + + + + Access the mapped property through a Property get to get the value + and do nothing to set the value. + + + This is useful to allow calculated properties in the domain that will never + be recovered from the DB but can be used for querying. + + + + + Initializes a new instance of . + + + + + Creates an to get the value from the Property. + + The to find the Property in. + The name of the mapped Property to get. + + The to use to get the value of the Property from an + instance of the . + + Thrown when a Property specified by the propertyName could not + be found in the . + + + + + Create a to do nothing when trying to + se the value of the mapped Property + + The to find the mapped Property in. + The name of the mapped Property to set. + + An instance of . + + + + + Responsible for accessing property values represented as a XmlElement + or XmlAttribute. + + + + For nodes like "@bar" + + + Defines the strategy for getting property values out of a dom4j Node. + + + Get the declared type + + + Optional operation (return null) + + + Optional operation (return null) + + + For nodes like "@bar" + + + Optional operation (return null) + + + Optional operation (return null) + + + For nodes like "foo/@bar" + + + For nodes like "foo/@bar" + + + For nodes like "foo" + + + For nodes like "foo" + + + For nodes like "." + + + For nodes like "." + + + Lazy initializer for "dynamic-map" entity representations. + + + + Provides the base functionality to Handle Member calls into a dynamically + generated NHibernate Proxy. + + + This could be an extension point later if the .net framework ever gets a Proxy + class that is similar to the java.lang.reflect.Proxy or if a library similar + to cglib was made in .net. + + + + + Perform an ImmediateLoad of the actual object for the Proxy. + + + Thrown when the Proxy has no Session or the Session is closed or disconnected. + + + + + Return the underlying persistent object, initializing if necessary. + + The persistent object this proxy is proxying. + + + + Return the underlying persistent object in a given , or null. + + The session to get the object from. + The persistent object this proxy is proxying, or . + + + + Initialize the proxy manually by injecting its target. + + The proxy target (the actual entity being proxied). + + + + Associate the proxy with the given session. + + Care should be given to make certain that the proxy is added to the session's persistence context as well + to maintain the symmetry of the association. That must be done separately as this method simply sets an + internal reference. We do also check that if there is already an associated session that the proxy + reference was removed from that previous session's persistence context. + + The session + + + + Unset this initializer's reference to session. It is assumed that the caller is also taking care or + cleaning up the owning proxy's reference in the persistence context. + + Generally speaking this is intended to be called only during and + processing; most other use-cases should call instead. + + + + + The identifier value for the entity our owning proxy represents. + + + + + The entity-name of the entity our owning proxy represents. + + + + + Get the actual class of the entity. Generally, should be used instead. + + + + + Is the proxy uninitialzed? + + + + + Get the session to which this proxy is associated, or null if it is not attached. + + + + + Is the read-only setting available? + + + + + Read-only status + + + + Not available when the proxy is detached or its associated session is closed. + + + To check if the read-only setting is available, use + + + The read-only status of the entity will be made to match the read-only status of the proxy + upon initialization. + + + + + + If this is returned by Invoke then the subclass needs to Invoke the + method call against the object that is being proxied. + + + + + Create a LazyInitializer to handle all of the Methods/Properties that are called + on the Proxy. + + The entityName + The Id of the Object we are Proxying. + The ISession this Proxy is in. + + + + + + + + + + Perform an ImmediateLoad of the actual object for the Proxy. + + + Thrown when the Proxy has no Session or the Session is closed or disconnected. + + + + + Return the Underlying Persistent Object, initializing if necessary. + + The Persistent Object this proxy is Proxying. + + + + Return the Underlying Persistent Object in a given , or null. + + The Session to get the object from. + The Persistent Object this proxy is Proxying, or . + + + + + + + + + Proxy for "dynamic-map" entity representations. + + + + A marker interface so NHibernate can know if it is dealing with + an object that is a Proxy. + + + + This interface should not be implemented by anything other than + the Dynamically generated Proxy. If it is implemented by a class then + NHibernate will think that class is a Proxy and will not work. + + + It has to be public scope because + the Proxies are created in a separate DLL than NHibernate. + + + + + Get the underlying lazy initialization handler. + + + Contract for run-time, proxy-based lazy initialization proxies. + + + Called immediately after instantiation of this factory. + + The name of the entity for which this factory should generate proxies. + + + The entity class for which to generate proxies; not always the same as the entityName. + + + The interfaces to expose in the generated proxy; + is already included in this collection. + + + Reference to the identifier getter method; invocation on this method should not force initialization + + + Reference to the identifier setter method; invocation on this method should not force initialization + + + For composite identifier types, a reference to + the type of the identifier + property; again accessing the id should generally not cause + initialization - but need to bear in mind key-many-to-one + mappings. + + Indicates a problem completing post + + Essentially equivalent to constructor injection, but contracted + here via interface. + + + + + Create a new proxy + + The id value for the proxy to be generated. + The session to which the generated proxy will be associated. + The generated proxy. + Indicates problems generating requested proxy. + + + Lazy initializer for POCOs + + + + Adds all of the information into the SerializationInfo that is needed to + reconstruct the proxy during deserialization or to replace the proxy + with the instantiated target. + + + This will only be called if the Dynamic Proxy generator does not handle serialization + itself or delegates calls to the method GetObjectData to the LazyInitializer. + + + + + Invokes the method if this is something that the LazyInitializer can handle + without the underlying proxied object being instantiated. + + The name of the method/property to Invoke. + The arguments to pass the method/property. + The proxy object that the method is being invoked on. + + The result of the Invoke if the underlying proxied object is not needed. If the + underlying proxied object is needed then it returns the result + which indicates that the Proxy will need to forward to the real implementation. + + + + + Convenient common implementation for ProxyFactory + + + + + Proxeability validator. + + + + + Validates whether can be specified as the base class + (or an interface) for a dynamically-generated proxy. + + The type to validate. + + A collection of errors messages, if any, or if none were found. + + + When the configuration property "use_proxy_validator" is set to true(default), the result of this method + is used to throw a detailed exception about the proxeability of the given . + + + + + Validate if a single method can be intercepted by proxy. + + The given method to check. + if the method can be intercepted by proxy. + otherwise. + + + This method can be used internally by the and is used + by to log errors when + a property accessor can't be intercepted by proxy. + The validation of property accessors is fairly enough if you ecampsulate each property. + + + + + Validates whether can be specified as the base class + (or an interface) for a dynamically-generated proxy. + + The type to validate. + + A collection of errors messages, if any, or if none were found. + + + + + NHibernateProxyHelper provides convenience methods for working with + objects that might be instances of Classes or the Proxied version of + the Class. + + + + + Get the class of an instance or the underlying class of a proxy (without initializing the proxy!). + It is almost always better to use the entity name! + + The object to get the type of. + The Underlying Type for the object regardless of if it is a Proxy. + + + + Get the true, underlying class of a proxied persistent class. This operation + will NOT initialize the proxy and thus may return an incorrect result. + + a persistable object or proxy + guessed class of the instance + + This method is approximate match for Session.bestGuessEntityName in H3.2 + + + + + Represents SQL Server SELECT query parser, primarily intended to support generation of + limit queries by SQL Server dialects. + + + + + Column definitions in SELECT clause + + + + + Column definitions for columns that appear in ORDER BY clause + but do not appear in SELECT clause. + + + + + Sort orders as defined in ORDER BY clause + + + + + A SQL query token as returned by + + + + + Position at which this token occurs in a . + + + + + Number of characters in this token. + + + + + Splits a into s. + + + + + token types. + + + + + Whitespace + + + + + Single line comment (preceeded by --) or multi-line comment (terminated by /* and */) + + + + + Keywords, operators or undelimited identifiers. + + + + + Delimited identifiers or string literals. + + + + + A query parameter. + + + + + List separator, the ',' character. + + + + + Begin of an expression block, consisting of a '(' character. + + + + + End of an expression block, consisting of a ')' character. + + + + + Tokens for begin or end of expression blocks. + + + + + Includes all token types except whitespace or comments + + + + + Includes all token types except whitespace + + + + + Includes all token types + + + + + Aliases tables and fields for Sql Statements. + + + Several methods of this class take an additional + parameter, while their Java counterparts + do not. The dialect is used to correctly quote and unquote identifiers. + Java versions do the quoting and unquoting themselves and fail to + consider dialect-specific rules, such as escaping closing brackets in + identifiers on MS SQL 2000. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + An ANSI SQL CASE expression. + case when ... then ... end as ... + + This class looks StringHelper.SqlParameter safe... + + + Abstract SQL case fragment renderer + + + + An ANSI-style Join. + + + + + Represents a SQL JOIN + + + + + + + + Sets the op + + The op to set + + + + + + + + + + + + + + + + + + + + + + + + + + + + + An Oracle-style DECODE function. + + decode(pkvalue, key1, 1, key2, 2, ..., 0) + + + + + + + + Represents an SQL for update of ... nowait statement + + + + + An Informix-style (theta) Join + + + + + Represents an ... in (...) expression + + + + + Add a value to the value list. Value may be a string, + a , or one of special values + or . + + + + + + + + An Oracle-style (theta) Join + + + + + This method is a bit of a hack, and assumes + that the column on the "right" side of the + join appears on the "left" side of the + operator, which is extremely weird if this + was a normal join condition, but is natural + for a filter. + + + + + A placeholder for an ADO.NET parameter in an . + + + + + We need to know what the position of the parameter was in a query + before we rearranged the query. + This is the ADO parameter position that this SqlString parameter is + bound to. The SqlString can be safely rearranged once this is set. + + + + + Create a parameter with the specified position + + + + + Generates an array of parameters. + + The number of parameters to generate. + An array of objects + + + + Determines whether this instance and the specified object + are of the same type and have the same values. + + An object to compare to this instance. + + if the object equals the current instance. + + + + + Gets a hash code for the parameter. + + + An value for the hash code. + + + + + Used to determine the parameter's name (p0,p1 etc.) + + + + + Unique identifier of a parameter to be tracked back by its generator. + + + We have various query-systems. Each one, at the end, give us a . + At the same time we have various bad-guys playing the game (hql function implementations, the dialect...). + A bad guy can rearrange a and the query-system can easly lost organization/sequence of parameters. + Using the the query-system can easily find where are its parameters. + + + + + Used as a placeholder when parsing HQL or SQL queries. + + + + + Summary description for QueryJoinFragment. + + + + + Summary description for QuerySelect. + + + + + Certain databases don't like spaces around these operators. + + + This needs to contain both a plain string and a + SqlString version of the operator because the portions in + the WHERE clause will come in as SqlStrings since there + might be parameters, other portions of the clause come in + as strings since there are no parameters. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Adds a string containing a valid "order by" sql statement + to this QuerySelect + + The "order by" sql statement. + + + + + + + + + + + + + + + + + Represents part of an SQL SELECT clause + + + + + Equivalent to ToSqlStringFragment. + + + + In H3, it is called ToFragmentString(). It appears to be + functionally equivalent as ToSqlStringFragment() here. + + + + + The base class for all of the SqlBuilders. + + + + + Converts the ColumnNames and ColumnValues to a WhereFragment + + The names of the Columns to Add to the WhereFragment + A SqlString that contains the WhereFragment + This just calls the overloaded ToWhereFragment() with the operator as " = " and the tableAlias null. + + + + Converts the ColumnNames and ColumnValues to a WhereFragment + + The Alias for the Table. + The names of the Columns to Add to the WhereFragment + A SqlString that contains the WhereFragment + This defaults the op to " = " + + + + Converts the ColumnNames and ColumnValues to a WhereFragment + + The names of the Columns to Add to the WhereFragment + The operator to use between the names & values. For example " = " or "!=" + A SqlString that contains the WhereFragment + + + + Converts the ColumnNames and ColumnValues to a WhereFragment + + The Alias for the Table. + The names of the Columns to Add to the WhereFragment + The operator to use between the names & values. For example " = " or "!=" + A SqlString that contains the WhereFragment + + + + re-set the index of each parameter in the final command. + + The offset from where start the list of , in the given command, for the this . + + Suppose the final command is composed by two queries. The for the first query is zero. + If the first query command has 12 parameters (size of its SqlType array) the offset to bind all s, of the second query in the + command, is 12 (for the first query we are using from 0 to 11). + + This method should be called before call . + + + + + + Bind the appropriate value into the given command. + + The command into which the value should be bound. + The parameter-list of the whole query of the command. + The offset from where start the list of , in the given , for the this . + The session against which the current execution is occuring. + + Suppose the is composed by two queries. The for the first query is zero. + If the first query in has 12 parameters (size of its SqlType array) the offset to bind all s, of the second query in the + , is 12 (for the first query we are using from 0 to 11). + + + + + Bind the appropriate value into the given command. + + The command into which the value should be bound. + The session against which the current execution is occuring. + + Use this method when the contains just 'this' instance of . + Use the overload when the contains more instances of . + + + + + Bind the appropriate value into the given command. + + The command into which the value should be bound. + The parameter-list of the whole query of the command. + The offset from where start the list of , in the given , for the this . + The session against which the current execution is occuring. + + + + Bind the appropriate value into the given command. + + The command into which the value should be bound. + The session against which the current execution is occuring. + + Use this method when the contains just 'this' instance of . + Use the overload when the contains more instances of . + + + + + A class that builds an DELETE sql statement. + + + + + Sets the IdentityColumn for the DELETE sql to use. + + An array of the column names for the Property + The IType of the Identity Property. + The SqlDeleteBuilder. + + + + Sets the VersionColumn for the DELETE sql to use. + + An array of the column names for the Property + The IVersionType of the Version Property. + The SqlDeleteBuilder. + + + + Adds the columns for the Type to the WhereFragment + + The names of the columns to add. + The IType of the property. + The operator to put between the column name and value. + The SqlDeleteBuilder + + + + Adds a string to the WhereFragement + + A well formed sql statement with no parameters. + The SqlDeleteBuilder + + + + Builds a SELECT SQL statement. + + + + + Sets the text that should appear after the FROM + + The fromClause to set + The SqlSelectBuilder + + + + Sets the text that should appear after the FROM + + The name of the Table to get the data from + The Alias to use for the table name. + The SqlSelectBuilder + + + + Sets the text that should appear after the FROM + + The fromClause in a SqlString + The SqlSelectBuilder + + + + Sets the text that should appear after the ORDER BY. + + The orderByClause to set + The SqlSelectBuilder + + + + Sets the text that should appear after the GROUP BY. + + The groupByClause to set + The SqlSelectBuilder + + + + Sets the SqlString for the OUTER JOINs. + + + All of the Sql needs to be included in the SELECT. No OUTER JOINS will automatically be + added. + + The outerJoinsAfterFrom to set + The outerJoinsAfterWhere to set + The SqlSelectBuilder + + + + Sets the text for the SELECT + + The selectClause to set + The SqlSelectBuilder + + + + Sets the text for the SELECT + + The selectClause to set + The SqlSelectBuilder + + + + Sets the criteria to use for the WHERE. It joins all of the columnNames together with an AND. + + + The names of the columns + The Hibernate Type + The SqlSelectBuilder + + + + Sets the prebuilt SqlString to the Where clause + + The SqlString that contains the sql and parameters to add to the WHERE + This SqlSelectBuilder + + + + Sets the criteria to use for the WHERE. It joins all of the columnNames together with an AND. + + + The names of the columns + The Hibernate Type + The SqlSelectBuilder + + + + Sets the prebuilt SqlString to the Having clause + + The SqlString that contains the sql and parameters to add to the HAVING + This SqlSelectBuilder + + + + ToSqlString() is named ToStatementString() in H3 + + + + + + + + + Summary description for SqlSimpleSelectBuilder. + + + + + + + + + + + + Adds a columnName to the SELECT fragment. + + The name of the column to add. + The SqlSimpleSelectBuilder + + + + Adds a columnName and its Alias to the SELECT fragment. + + The name of the column to add. + The alias to use for the column + The SqlSimpleSelectBuilder + + + + Adds an array of columnNames to the SELECT fragment. + + The names of the columns to add. + The SqlSimpleSelectBuilder + + + + Adds an array of columnNames with their Aliases to the SELECT fragment. + + The names of the columns to add. + The aliases to use for the columns + The SqlSimpleSelectBuilder + + + + Gets the Alias that should be used for the column + + The name of the column to get the Alias for. + The Alias if one exists, null otherwise + + + + Sets the IdentityColumn for the SELECT sql to use. + + An array of the column names for the Property + The IType of the Identity Property. + The SqlSimpleSelectBuilder. + + + + Sets the VersionColumn for the SELECT sql to use. + + An array of the column names for the Property + The IVersionType of the Version Property. + The SqlSimpleSelectBuilder. + + + + Set the Order By fragment of the Select Command + + The OrderBy fragment. It should include the SQL "ORDER BY" + The SqlSimpleSelectBuilder + + + + Adds the columns for the Type to the WhereFragment + + The names of the columns to add. + The IType of the property. + The operator to put between the column name and value. + The SqlSimpleSelectBuilder + + + + + + + This is a non-modifiable SQL statement that is ready to be prepared + and sent to the Database for execution. + + + A represents a (potentially partial) SQL query string + that may or may not contain query parameter references. A + decomposes the underlying SQL query string into a list of parts. Each part is either + 1) a string part, which represents a fragment of the underlying SQL query string that + does not contain any parameter references, or 2) a parameter part, which represents + a single query parameter reference in the underlying SQL query string. + + The constructors ensure that the number of string parts + in a are kept to an absolute minimum (as compact as possible) + by concatenating any adjoining string parts into a single string part. + + + Substring operations on a (such as , + , ) return a that reuses the parts + list of the instance on which the operation was performed. + Besides a reference to this parts list, the resulting instance + also stores the character offset into the original underlying SQL string at which the + substring starts and the length of the substring. By avoiding the unnecessary rebuilding + of part lists these operations have O(1) behaviour rather than O(n) behaviour. + + + If you need to modify this object pass it to a and + get a new object back from it. + + + + + + Empty instance. + + + + + Immutable list of string and parameter parts that make up this . + This list may be shared by multiple instances that present + different fragments of a common underlying SQL query string. + + + + + List of SQL query parameter references that occur in this . + + + + + Cached index of first part in that contains (part of) + a SQL fragment that falls within the scope of this instance. + + + + + Cached index of last part in that contains (part of) + a SQL fragment that falls within the scope of this instance. + + + + + Index of first character of the underlying SQL query string that is within scope of + this instance. + + + + + Number of characters of the underlying SQL query string that are within scope of + this instance from onwards. + + + + + Creates copy of other . + + + + + + Creates substring of other . + + + + + + + + Creates consisting of single string part. + + A SQL fragment + + + + Creates consisting of single parameter part. + + A query parameter + + + + Creates consisting of multiple parts. + + Arbitrary number of parts, which must be + either , or + values. + The instance is automatically compacted. + + + + Parse SQL in and create a SqlString representing it. + + + Parameter marks in single quotes will be correctly skipped, but otherwise the + lexer is very simple and will not parse double quotes or escape sequences + correctly, for example. + + + + + Appends the SqlString parameter to the end of the current SqlString to create a + new SqlString object. + + The SqlString to append. + A new SqlString object. + + A SqlString object is immutable so this returns a new SqlString. If multiple Appends + are called it is better to use the SqlStringBuilder. + + + + + Appends the string parameter to the end of the current SqlString to create a + new SqlString object. + + The string to append. + A new SqlString object. + + A SqlString object is immutable so this returns a new SqlString. If multiple Appends + are called it is better to use the SqlStringBuilder. + + + + + Compacts the SqlString into the fewest parts possible. + + A new SqlString. + + Combines all SqlParts that are strings and next to each other into + one SqlPart. + + + + + Makes a copy of the SqlString, with new parameter references (Placeholders) + + + + + Determines whether the end of this instance matches the specified String. + + A string to seek at the end. + if the end of this instance matches value; otherwise, + + + + Returns the index of the first occurrence of , case-insensitive. + + Text to look for in the . Must be in lower + case. + + The text must be located entirely in a string part of the . + Searching for "a ? b" in an consisting of + "a ", Parameter, " b" will result in no matches. + + The index of the first occurrence of , or -1 + if not found. + + + + Returns the index of the first occurrence of , case-insensitive. + + Text to look for in the . Must be in lower + The zero-based index of the search starting position. + The number of character positions to examine. + One of the enumeration values that specifies the rules for the search. + + The text must be located entirely in a string part of the . + Searching for "a ? b" in an consisting of + "a ", Parameter, " b" will result in no matches. + + The index of the first occurrence of , or -1 + if not found. + + + + Returns the index of the first occurrence of , case-insensitive. + + Text to look for in the . Must be in lower + case. + + The text must be located entirely in a string part of the . + Searching for "a ? b" in an consisting of + "a ", Parameter, " b" will result in no matches. + + The index of the first occurrence of , or -1 + if not found. + + + + Returns the index of the first occurrence of , case-insensitive. + + Text to look for in the . Must be in lower case. + The zero-based index of the search starting position. + The number of character positions to examine. + One of the enumeration values that specifies the rules for the search. + + The text must be located entirely in a string part of the . + Searching for "a ? b" in an consisting of + "a ", Parameter, " b" will result in no matches. + + The index of the first occurrence of , or -1 + if not found. + + + + Replaces all occurrences of a specified in this instance, + with another specified . + + A String to be replaced. + A String to replace all occurrences of oldValue. + + A new SqlString with oldValue replaced by the newValue. The new SqlString is + in the compacted form. + + + + + Determines whether the beginning of this SqlString matches the specified System.String, + using case-insensitive comparison. + + The System.String to seek + true if the SqlString starts with the value. + + + + Retrieves a substring from this instance. The substring starts at a specified character position. + + The starting character position of a substring in this instance. + + A new SqlString to the substring that begins at startIndex in this instance. + + + If the startIndex is greater than the length of the SqlString then is returned. + + + + + Returns substring of this SqlString starting with the specified + . If the text is not found, returns an + empty, not-null SqlString. + + + The method performs case-insensitive comparison, so the + passed should be in lower case. + + + + + Removes all occurrences of white space characters from the beginning and end of this instance. + + + A new SqlString equivalent to this instance after white space characters + are removed from the beginning and end. + + + + + Locate the part that contains the requested character index, and return the + part's index. Return -1 if the character position isn't found. + + + + + It the pendingContent is non-empty, append it as a new part and reset the pendingContent + to empty. The new part will be given the sqlIndex. After return, the sqlIndex will have + been updated to the next available index. + + + + + + + Returns the SqlString in a string where it looks like + SELECT col1, col2 FROM table WHERE col1 = ? + + + The question mark is used as the indicator of a parameter because at + this point we are not using the specific provider so we don't know + how that provider wants our parameters formatted. + + A provider-neutral version of the CommandText + + + + Gets the number of SqlParts contained in this SqlString. + + The number of SqlParts contained in this SqlString. + + + + The SqlStringBuilder is used to construct a SqlString. + + + + The SqlString is a nonmutable class so it can't have sql parts added + to it. Instead this class should be used to generate a new SqlString. + The SqlStringBuilder is to SqlString what the StringBuilder is to + a String. + + + This is different from the original version of SqlString because this does not + hold the sql string in the form of "column1=@column1" instead it uses an array to + build the sql statement such that + object[0] = "column1=" + object[1] = ref to column1 parameter + + + What this allows us to do is to delay the generating of the parameter for the sql + until the very end - making testing dialect indifferent. Right now all of our test + to make sure the correct sql is getting built are specific to MsSql2000Dialect. + + + + + + Create an empty StringBuilder with the default capacity. + + + + + Create a StringBuilder with a specific capacity. + + The number of parts expected. + + + + Create a StringBuilder to modify the SqlString + + The SqlString to modify. + + + + Adds the preformatted sql to the SqlString that is being built. + + The string to add. + This SqlStringBuilder + + + + Adds the Parameter to the SqlString that is being built. + The correct operator should be added before the Add(Parameter) is called + because there will be no operator ( such as "=" ) placed between the last Add call + and this Add call. + + The Parameter to add. + This SqlStringBuilder + + + + Attempts to discover what type of object this is and calls the appropriate + method. + + The part to add when it is not known if it is a Parameter, String, or SqlString. + This SqlStringBuilder. + Thrown when the part is not a Parameter, String, or SqlString. + + + + Adds an existing SqlString to this SqlStringBuilder. It does NOT add any + prefix, postfix, operator, or wrap around this. It is equivalent to just + adding a string. + + The SqlString to add to this SqlStringBuilder + This SqlStringBuilder + This calls the overloaded Add(sqlString, null, null, null, false) + + + + Adds an existing SqlString to this SqlStringBuilder + + The SqlString to add to this SqlStringBuilder + String to put at the beginning of the combined SqlString. + How these Statements should be junctioned "AND" or "OR" + String to put at the end of the combined SqlString. + This SqlStringBuilder + + This calls the overloaded Add method with an array of SqlStrings and wrapStatment=false + so it will not be wrapped with a "(" and ")" + + + + + Adds existing SqlStrings to this SqlStringBuilder + + The SqlStrings to combine. + String to put at the beginning of the combined SqlString. + How these SqlStrings should be junctioned "AND" or "OR" + String to put at the end of the combined SqlStrings. + This SqlStringBuilder + This calls the overloaded Add method with wrapStatement=true + + + + Adds existing SqlStrings to this SqlStringBuilder + + The SqlStrings to combine. + String to put at the beginning of the combined SqlStrings. + How these SqlStrings should be junctioned "AND" or "OR" + String to put at the end of the combined SqlStrings. + Wrap each SqlStrings with "(" and ")" + This SqlStringBuilder + + + + Insert a string containing sql into the SqlStringBuilder at the specified index. + + The zero-based index at which the sql should be inserted. + The string containing sql to insert. + This SqlStringBuilder + + + + Insert a Parameter into the SqlStringBuilder at the specified index. + + The zero-based index at which the Parameter should be inserted. + The Parameter to insert. + This SqlStringBuilder + + + + Removes the string or Parameter at the specified index. + + The zero-based index of the item to remove. + This SqlStringBuilder + + + + Converts the mutable SqlStringBuilder into the immutable SqlString. + + The SqlString that was built. + + + + Gets the number of SqlParts in this SqlStringBuilder. + + + The number of SqlParts in this SqlStringBuilder. + + + + + Gets or Sets the element at the index + + Returns a string or Parameter. + + + + + Helper methods for SqlString. + + + + + A class that builds an UPDATE sql statement. + + + + + Add a column with a specific value to the UPDATE sql + + The name of the Column to add. + The value to set for the column. + The NHibernateType to use to convert the value to a sql string. + The SqlUpdateBuilder. + + + + Add a column with a specific value to the UPDATE sql + + The name of the Column to add. + A valid sql string to set as the value of the column. + The SqlUpdateBuilder. + + + + Adds columns with a specific value to the UPDATE sql + + The names of the Columns to add. + A valid sql string to set as the value of the column. This value is assigned to each column. + The SqlUpdateBuilder. + + + + Adds the Property's columns to the UPDATE sql + + An array of the column names for the Property + The IType of the property. + The SqlUpdateBuilder. + + + + Adds the Property's updatable columns to the UPDATE sql + + An array of the column names for the Property + An array of updatable column flags. If this array is null, all supplied columns are considered updatable. + The IType of the property. + The SqlUpdateBuilder. + + + + Sets the IdentityColumn for the UPDATE sql to use. + + An array of the column names for the Property + The IType of the Identity Property. + The SqlUpdateBuilder. + + + + Sets the VersionColumn for the UPDATE sql to use. + + An array of the column names for the Property + The IVersionType of the Version Property. + The SqlUpdateBuilder. + + + + Adds the columns for the Type to the WhereFragment + + The names of the columns to add. + The IType of the property. + The operator to put between the column name and value. + The SqlUpdateBuilder + + + + Adds a string to the WhereFragment + + A well formed sql string with no parameters. + The SqlUpdateBuilder + + + + + + + Given an SQL SELECT statement, parse it to extract clauses starting with + FROM, up to and not including ORDER BY (known collectively + as a subselect clause). + + + + + Contains the subselect clause as it is being built. + + + + + Initializes a new instance of the class. + + The to extract the subselect clause from. + + + + Looks for a FROM clause in the + and adds the clause to the result if found. + + A or a . + if the part contained a FROM clause, + otherwise. + + + + Returns the subselect clause of the statement + being processed. + + An containing + the subselect clause of the original SELECT + statement. + + + + Allows us to construct SQL WHERE fragments + + + + + Describes the details of a with the + information required to to generate an . + + + This can store the length of the string that the can hold. + If no value is provided for the length then the Driver is responsible for + setting the properties on the correctly. + + + + + This is the base class that adds information to the + for the and + to use. + + +

+ The uses the SqlType to get enough + information to create an . +

+

+ The use the SqlType to convert the + to the appropriate sql type for SchemaExport. +

+
+
+ + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The length of the string the should hold. + + + + Describes the details of a with the + information required to generate an . + + + This can store the length of the string that the can hold. + If no value is provided for the length then the Driver is responsible for + setting the properties on the correctly. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The length of the string the should hold. + + + + Describes the details of a that is stored in + a BLOB column with the information required to generate + an . + + +

+ This can store the length of the binary data that the can hold. + If no value is provided for the length then the Driver is responsible for + setting the properties on the correctly. +

+

+ This is only needed by DataProviders (SqlClient) that need to specify a Size for the + IDbDataParameter. Most DataProvider(Oralce) don't need to set the Size so a + BinarySqlType would work just fine. +

+
+
+ + + Describes the details of a with the + information required to to generate an . + + + This can store the binary data that the can hold. + If no value is provided for the length then the Driver is responsible for + setting the properties on the correctly. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The length of the binary data the should hold + + + + SqlTypeFactory provides Singleton access to the SqlTypes. + + + + + Describes the details of a that is stored in + a CLOB column with the information required to generate + an . + + +

+ This can store the length of the binary data that the can hold. + If no value is provided for the length then the Driver is responsible for + setting the properties on the correctly. +

+

+ This is only needed by DataProviders (SqlClient) that need to specify a Size for the + IDbDataParameter. Most DataProvider(Oralce) don't need to set the Size so a + StringSqlType would work just fine. +

+
+
+ + + Describes the details of a with the + information required to generate an . + + + This can store the length of the string that the can hold. + If no value is provided for the length then the Driver is responsible for + setting the properties on the correctly. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The length of the string the should hold. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The length of the string the should hold. + + + + Describes the details of a with the + information required to to generate an . + + + This can store the length of the string that the can hold. + If no value is provided for the length then the Driver is responsible for + setting the properties on the correctly. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The length of the string the should hold. + + + + Statistics for a particular "category" (a named entity, + collection role, second level cache region or query). + + + + Collection related statistics + + + Entity related statistics + + + + Information about the first-level (session) cache for a particular session instance + + + + Get the number of entity instances associated with the session + + + Get the number of collection instances associated with the session + + + Get the set of all EntityKeys. + + + Get the set of all CollectionKeys. + + + + Statistics for a particular . + Beware of metrics, they are dependent of the precision: + + + + Reset all statistics + + + Find entity statistics per name + entity name + EntityStatistics object + + + Get collection statistics per role + collection role + CollectionStatistics + + + Second level cache statistics per region + region name + SecondLevelCacheStatistics + + + Query statistics from query string (HQL or SQL) + query string + QueryStatistics + + + log in info level the main statistics + + + Global number of entity deletes + + + Global number of entity inserts + + + Global number of entity loads + + + Global number of entity fetchs + + + Global number of entity updates + + + Global number of executed queries + + + The of the slowest query. + + + The query string for the slowest query. + + + The global number of cached queries successfully retrieved from cache + + + The global number of cached queries *not* found in cache + + + The global number of cacheable queries put in cache + + + Get the global number of flush executed by sessions (either implicit or explicit) + + + + Get the global number of connections asked by the sessions + (the actual number of connections used may be much smaller depending + whether you use a connection pool or not) + + + + Global number of cacheable entities/collections successfully retrieved from the cache + + + Global number of cacheable entities/collections not found in the cache and loaded from the database. + + + Global number of cacheable entities/collections put in the cache + + + Global number of sessions closed + + + Global number of sessions opened + + + Global number of collections loaded + + + Global number of collections fetched + + + Global number of collections updated + + + Global number of collections removed + + + Global number of collections recreated + + + Start time + + + Enable/Disable statistics logs (this is a dynamic parameter) + + + All executed query strings + + + The names of all entities + + + The names of all collection roles + + + Get all second-level cache region names + + + The number of transactions we know to have been successful + + + The number of transactions we know to have completed + + + The number of prepared statements that were acquired + + + The number of prepared statements that were released + + + The number of StaleObjectStateExceptions that occurred + + + + The OperationThreshold to a value greater than to enable logging of long running operations. + + Operations that exceed the level will be logged. + + + Statistics SPI for the NHibernate core + + + Query statistics (HQL and SQL) + Note that for a cached query, the cache miss is equals to the db count + + + Add statistics report of a DB query + rows count returned + time taken + + + Second level cache statistics of a specific region + + + + Not ported yet + + + + + Not ported yet + + + + + Not ported yet + + + + + Not ported yet + + + + + Contract for delegates responsible for managing connection used by the hbm2ddl tools. + + + + + Prepare the helper for use. + + + + + Release any resources held by this helper. + + + + + Get a reference to the connection we are using. + + + + + A implementation based on an internally + built and managed . + + + + + Generates ddl to export table schema for a configured Configuration to the database + + + This Class can be used directly or the command line wrapper NHibernate.Tool.hbm2ddl.exe can be + used when a dll can not be directly used. + + + + + Create a schema exported for a given Configuration + + The NHibernate Configuration to generate the schema from. + + + + Create a schema exporter for the given Configuration, with the given + database connection properties + + The NHibernate Configuration to generate the schema from. + The Properties to use when connecting to the Database. + + + + Set the output filename. The generated script will be written to this file + + The name of the file to output the ddl to. + The SchemaExport object. + + + + Set the end of statement delimiter + + The end of statement delimiter. + The SchemaExport object. + + + + Run the schema creation script + + if the ddl should be outputted in the Console. + if the ddl should be executed against the Database. + + This is a convenience method that calls and sets + the justDrop parameter to false. + + + + + Run the schema creation script + + an action that will be called for each line of the generated ddl. + if the ddl should be executed against the Database. + + This is a convenience method that calls and sets + the justDrop parameter to false. + + + + + Run the schema creation script + + if non-null, the ddl will be written to this TextWriter. + if the ddl should be executed against the Database. + + This is a convenience method that calls and sets + the justDrop parameter to false. + + + + + Run the drop schema script + + if the ddl should be outputted in the Console. + if the ddl should be executed against the Database. + + This is a convenience method that calls and sets + the justDrop parameter to true. + + + + + Run the drop schema script + + if non-null, the ddl will be written to this TextWriter. + if the ddl should be executed against the Database. + + This is a convenience method that calls and sets + the justDrop parameter to true. + + + + + Executes the Export of the Schema in the given connection + + if the ddl should be outputted in the Console. + if the ddl should be executed against the Database. + if only the ddl to drop the Database objects should be executed. + + The connection to use when executing the commands when export is . + Must be an opened connection. The method doesn't close the connection. + + The writer used to output the generated schema + + This method allows for both the drop and create ddl script to be executed. + This overload is provided mainly to enable use of in memory databases. + It does NOT close the given connection! + + + + + Executes the Export of the Schema. + + if the ddl should be outputted in the Console. + if the ddl should be executed against the Database. + if only the ddl to drop the Database objects should be executed. + + This method allows for both the drop and create ddl script to be executed. + + + + + Execute the schema updates + + + + + Execute the schema updates + + The action to write the each schema line. + Commit the script to DB + + + + Returns a List of all Exceptions which occured during the export. + + + + + Perform the validations. + + + + This acts as a template method. Specific Reader instances + override the component methods. + + + + + A implementation based on an explicitly supplied + connection. + + + + + A implementation based on a provided + . Essentially, ensures that the connection + gets cleaned up, but that the provider itself remains usable since it + was externally provided to us. + + + + + An abstract factory for instances. + Concrete implementations are specified by transaction.factory_class + configuration property. + + Implementors must be threadsafe and should declare a public default constructor. + + + + + + Configure from the given properties + + + + + + Create a new transaction and return it without starting it. + + + + + This is used as a marker interface for the different + transaction context required for each session + + + + + Wraps an ADO.NET to implement + the interface. + + + + + Allows the application to define units of work, while maintaining abstraction from the + underlying transaction implementation + + + A transaction is associated with a ISession and is usually instanciated by a call to + ISession.BeginTransaction(). A single session might span multiple transactions since + the notion of a session (a conversation between the application and the datastore) is of + coarser granularity than the notion of a transaction. However, it is intended that there be + at most one uncommitted ITransaction associated with a particular ISession + at a time. Implementors are not intended to be threadsafe. + + + + + Begin the transaction with the default isolation level. + + + + + Begin the transaction with the specified isolation level. + + Isolation level of the transaction + + + + Flush the associated ISession and end the unit of work. + + + This method will commit the underlying transaction if and only if the transaction + was initiated by this object. + + + + + Force the underlying transaction to roll back. + + + + + Enlist the in the current Transaction. + + The to enlist. + + It is okay for this to be a no op implementation. + + + + + Register a user synchronization callback for this transaction. + + The callback to register. + + + + Is the transaction in progress + + + + + Was the transaction rolled back or set to rollback only? + + + + + Was the transaction successfully committed? + + + This method could return even after successful invocation of Commit() + + + + + Initializes a new instance of the class. + + The the Transaction is for. + + + + Enlist the in the current . + + The to enlist in this Transaction. + + + This takes care of making sure the 's Transaction property + contains the correct or if there is no + Transaction for the ISession - ie BeginTransaction() not called. + + + This method may be called even when the transaction is disposed. + + + + + + Begins the on the + used by the . + + + Thrown if there is any problems encountered while trying to create + the . + + + + + Commits the by flushing the + and committing the . + + + Thrown if there is any exception while trying to call Commit() on + the underlying . + + + + + Rolls back the by calling the method Rollback + on the underlying . + + + Thrown if there is any exception while trying to call Rollback() on + the underlying . + + + + + A flag to indicate if Disose() has been called. + + + + + Finalizer that ensures the object is correctly disposed of. + + + + + Takes care of freeing the managed and unmanaged resources that + this class is responsible for. + + + + + Takes care of freeing the managed and unmanaged resources that + this class is responsible for. + + Indicates if this AdoTransaction is being Disposed of or Finalized. + + If this AdoTransaction is being Finalized (isDisposing==false) then make sure not + to call any methods that could potentially bring this AdoTransaction back to life. + + + + + Gets a indicating if the transaction was rolled back. + + + if the had Rollback called + without any exceptions. + + + + + Gets a indicating if the transaction was committed. + + + if the had Commit called + without any exceptions. + + + + + A mimic to the javax.transaction.Synchronization callback to enable + + + + + Create an AfterTransactionCompletes that will execute the given delegate + when the transaction is completed. The action delegate will receive + the value 'true' if the transaction was completed successfully. + + + + + + An implementation of TupleSubsetResultTransformer that ignores a + tuple element if its corresponding alias is null. + + @author Gail Badner + + + + A ResultTransformer that operates on "well-defined" and consistent + subset of a tuple's elements. + + "Well-defined" means that: +
    +
  1. + the indexes of tuple elements accessed by an + ITupleSubsetResultTransformer depends only on the aliases + and the number of elements in the tuple; i.e, it does + not depend on the value of the tuple being transformed; +
  2. +
  3. + any tuple elements included in the transformed value are + unmodified by the transformation; +
  4. +
  5. + transforming equivalent tuples with the same aliases multiple + times results in transformed values that are equivalent; +
  6. +
  7. + the result of transforming the tuple subset (only those + elements accessed by the transformer) using only the + corresponding aliases is equivalent to transforming the + full tuple with the full array of aliases; +
  8. +
  9. + the result of transforming a tuple with non-accessed tuple + elements and corresponding aliases set to null + is equivalent to transforming the full tuple with the + full array of aliases; +
  10. +
+
+ + @author Gail Badner +
+ + + When a tuple is transformed, is the result a single element of the tuple? + + The aliases that correspond to the tuple. + The number of elements in the tuple. + True, if the transformed value is a single element of the tuple; + false, otherwise. + + + + Returns an array with the i-th element indicating whether the i-th + element of the tuple is included in the transformed value. + + The aliases that correspond to the tuple. + The number of elements in the tuple. + Array with the i-th element indicating whether the i-th + element of the tuple is included in the transformed value. + + + + Result transformer that allows to transform a result to + a user specified class which will be populated via setter + methods or fields matching the alias names. + + + + IList resultWithAliasedBean = s.CreateCriteria(typeof(Enrollment)) + .CreateAlias("Student", "st") + .CreateAlias("Course", "co") + .SetProjection( Projections.ProjectionList() + .Add( Projections.Property("co.Description"), "CourseDescription" ) + ) + .SetResultTransformer( new AliasToBeanResultTransformer(typeof(StudentDTO)) ) + .List(); + + StudentDTO dto = (StudentDTO)resultWithAliasedBean[0]; + + + + + + A ResultTransformer that is used to transform tuples to a value(s) that can be cached. + + @author Gail Badner + + + + Array with the i-th element indicating whether the i-th + expression returned by a query is included in the tuple. + + IMPLEMENTATION NOTE: + "joined" and "fetched" associations may use the same SQL, + but result in different tuple and cached values. This is + because "fetched" associations are excluded from the tuple. + includeInTuple provides a way to distinguish these 2 cases. + + + + Indexes for tuple that are included in the transformation. + Set to null if all elements in the tuple are included. + + + + + Returns a CacheableResultTransformer that is used to transform + tuples to a value(s) that can be cached. + + result transformer that will ultimately be used (after caching results) + the aliases that correspond to the tuple; + if it is non-null, its length must equal the number + of true elements in includeInTuple[] + array with the i-th element indicating + whether the i-th expression returned by a query is + included in the tuple; the number of true values equals + the length of the tuple that will be transformed; + must be non-null + a CacheableResultTransformer that is used to transform + tuples to a value(s) that can be cached. + + + + Returns a CacheableResultTransformer that is used to transform + tuples to a value(s) that can be cached. + + a tuple subset result transformer; + must be non-null; + the aliases that correspond to the tuple; + if it is non-null, its length must equal the number + of true elements in includeInTuple[] + array with the i-th element indicating + whether the i-th expression returned by a query is + included in the tuple; the number of true values equals + the length of the tuple that will be transformed; + must be non-null + a CacheableResultTransformer that is used to transform + tuples to a value(s) that can be cached. + + + + Returns a CacheableResultTransformer that is used to transform + tuples to a value(s) that can be cached. + + array with the i-th element indicating + whether the i-th expression returned by a query is + included in the tuple; the number of true values equals + the length of the tuple that will be transformed; + must be non-null + a CacheableResultTransformer that is used to transform + tuples to a value(s) that can be cached. + + + + Re-transforms, if necessary, a List of values previously + transformed by this (or an equivalent) CacheableResultTransformer. + Each element of the list is re-transformed in place (i.e, List + elements are replaced with re-transformed values) and the original + List is returned. If re-transformation is unnecessary, the original List is returned + unchanged. + + Results that were previously transformed. + The aliases that correspond to the untransformed tuple. + The transformer for the re-transformation. + + transformedResults, with each element re-transformed (if nececessary). + + + + Untransforms, if necessary, a List of values previously + transformed by this (or an equivalent) CacheableResultTransformer. + Each element of the list is untransformed in place (i.e, List + elements are replaced with untransformed values) and the original + List is returned. + + If not unnecessary, the original List is returned + unchanged. + + + + NOTE: If transformed values are a subset of the original + tuple, then, on return, elements corresponding to + excluded tuple elements will be null. + + Results that were previously transformed. + results, with each element untransformed (if nececessary). + + + + Returns the result types for the transformed value. + + + + + "Compact" the given array by picking only the elements identified by + the _includeInTransformIndex array. The picked elements are returned + in a new array. + + + + + Expand the given array by putting each of its elements at the + position identified by the _includeInTransformIndex array. The + elements are placed in a new array - the original array will + not be modified. + + + + + Tranforms each result row from a tuple into a , such that what + you end up with is a of . + + + + + Each row of results is a map () from alias to values/entities + + + + Each row of results is a + + + + Creates a resulttransformer that will inject aliased values into instances + of via property methods or fields. + + + + Support for tuplizers relating to components. + + + + Defines further responsibilities regarding tuplization based on + a mapped components. + + + ComponentTuplizer implementations should have the following constructor signature: + (org.hibernate.mapping.Component) + + + + + A tuplizer defines the contract for things which know how to manage + a particular representation of a piece of data, given that + representation's (the entity-mode + essentially defining which representation). + + + If that given piece of data is thought of as a data structure, then a tuplizer + is the thing which knows how to: + + create such a data structure appropriately + extract values from and inject values into such a data structure + + + For example, a given piece of data might be represented as a POCO class. + Here, it's representation and entity-mode is POCO. Well a tuplizer for POCO + entity-modes would know how to: + + create the data structure by calling the POCO's constructor + extract and inject values through getters/setter, or by direct field access, etc + + + That same piece of data might also be represented as a DOM structure, using + the tuplizer associated with the XML entity-mode, which would generate instances + of as the data structure and know how to access the + values as either nested s or as s. + + + + + + + Extract the current values contained on the given entity. + + The entity from which to extract values. + The current property values. + HibernateException + + + Inject the given values into the given entity. + The entity. + The values to be injected. + + + Extract the value of a particular property from the given entity. + The entity from which to extract the property value. + The index of the property for which to extract the value. + The current value of the given property on the given entity. + + + Generate a new, empty entity. + The new, empty entity instance. + + + + Is the given object considered an instance of the the entity (acconting + for entity-mode) managed by this tuplizer. + + The object to be checked. + True if the object is considered as an instance of this entity within the given mode. + + + + Return the pojo class managed by this tuplizer. + + The persistent class. + + Need to determine how to best handle this for the Tuplizers for EntityModes + other than POCO. + + + + Retrieve the current value of the parent property. + + The component instance from which to extract the parent property value. + + The current value of the parent property. + + + Set the value of the parent property. + The component instance on which to set the parent. + The parent to be set on the component. + The current session factory. + + + Does the component managed by this tuuplizer contain a parent property? + True if the component does contain a parent property; false otherwise. + + + This method does not populate the component parent + + + + Handles mapping s to ComponentTuplizers. +

+ Most of the handling is really in the super class; here we just create + the tuplizers and add them to the superclass +

+
+ + Centralizes handling of to mappings. + + + Given a supposed instance of an entity/component, guess its entity mode. + The supposed instance of the entity/component. + The guessed entity mode. + + + + Locate the contained tuplizer responsible for the given entity-mode. If + no such tuplizer is defined on this mapping, then return null. + + The entity-mode for which the caller wants a tuplizer. + The tuplizer, or null if not found. + + + Locate the tuplizer contained within this mapping which is responsible + for the given entity-mode. If no such tuplizer is defined on this + mapping, then an exception is thrown. + + + The entity-mode for which the caller wants a tuplizer. + + The tuplizer. + + HibernateException Unable to locate the requested tuplizer. + + + Centralizes metamodel information about a component. + + + + A specific to the dynamic-map entity mode. + + + + + A specific to the POCO entity mode. + + + + Support for tuplizers relating to entities. + + + + Defines further responsibilities regarding tuplization based on a mapped entity. + + + EntityTuplizer implementations should have the following constructor signature: + (, ) + + + + Create an entity instance initialized with the given identifier. + The identifier value for the entity to be instantiated. + The instantiated entity. + + + Extract the identifier value from the given entity. + The entity from which to extract the identifier value. + The identifier value. + + + + Inject the identifier value into the given entity. + + The entity to inject with the identifier value. + The value to be injected as the identifier. + Has no effect if the entity does not define an identifier property + + + + Inject the given identifier and version into the entity, in order to + "roll back" to their original values. + + + The identifier value to inject into the entity. + The version value to inject into the entity. + + + Extract the value of the version property from the given entity. + The entity from which to extract the version value. + The value of the version property, or null if not versioned. + + + Inject the value of a particular property. + The entity into which to inject the value. + The property's index. + The property value to inject. + + + Inject the value of a particular property. + The entity into which to inject the value. + The name of the property. + The property value to inject. + + + Extract the values of the insertable properties of the entity (including backrefs) + The entity from which to extract. + a map of instances being merged to merged instances + The session in which the resuest is being made. + The insertable property values. + + + Extract the value of a particular property from the given entity. + The entity from which to extract the property value. + The name of the property for which to extract the value. + The current value of the given property on the given entity. + + + Called just after the entities properties have been initialized. + The entity being initialized. + Are defined lazy properties currently unfecthed + The session initializing this entity. + + + + Generates an appropriate proxy representation of this entity for this entity-mode. + + The id of the instance for which to generate a proxy. + The session to which the proxy should be bound. + The generate proxies. + + + Does the given entity instance have any currently uninitialized lazy properties? + The entity to be check for uninitialized lazy properties. + True if uninitialized lazy properties were found; false otherwise. + + + + Does the class managed by this tuplizer implement + the interface. + + True if the ILifecycle interface is implemented; false otherwise. + + + + Does the class managed by this tuplizer implement + the interface. + + True if the IValidatable interface is implemented; false otherwise. + + + Returns the java class to which generated proxies will be typed. + The .NET class to which generated proxies will be typed + + + Is it an instrumented POCO? + + + Does this entity, for this mode, present a possibility for proxying? + True if this tuplizer can generate proxies for this entity. + + + Constructs a new AbstractEntityTuplizer instance. + The "interpreted" information relating to the mapped entity. + The parsed "raw" mapping data relating to the given entity. + + + Build an appropriate Getter for the given property. + The property to be accessed via the built Getter. + The entity information regarding the mapped entity owning this property. + An appropriate Getter instance. + + + Build an appropriate Setter for the given property. + The property to be accessed via the built Setter. + The entity information regarding the mapped entity owning this property. + An appropriate Setter instance. + + + Build an appropriate Instantiator for the given mapped entity. + The mapping information regarding the mapped entity. + An appropriate Instantiator instance. + + + Build an appropriate ProxyFactory for the given mapped entity. + The mapping information regarding the mapped entity. + The constructed Getter relating to the entity's id property. + The constructed Setter relating to the entity's id property. + An appropriate ProxyFactory instance. + + + Extract a component property value. + The component property types. + The component instance itself. + The property path for the property to be extracted. + The property value extracted. + + + Return the entity-mode handled by this tuplizer instance. + + + Retrieves the defined entity-name for the tuplized entity. + + + + Retrieves the defined entity-names for any subclasses defined for this entity. + + + + + Handles mapping s to s. + + + Most of the handling is really in the super class; here we just create + the tuplizers and add them to the superclass + + + + + Instantiates a EntityEntityModeToTuplizerMapping based on the given + entity mapping and metamodel definitions. + + The entity mapping definition. + The entity metamodel definition. + + + An specific to the POCO entity mode. + + + Contract for implementors responsible for instantiating entity/component instances. + + + Perform the requested entity instantiation. + The id of the entity to be instantiated. + An appropriately instantiated entity. + This form is never called for component instantiation, only entity instantiation. + + + Perform the requested instantiation. + The instantiated data structure. + + + + Performs check to see if the given object is an instance of the entity + or component which this Instantiator instantiates. + + The object to be checked. + True is the object does represent an instance of the underlying entity/component. + + + + Represents a defined entity identifier property within the Hibernate + runtime-metamodel. + + + Author: Steve Ebersole + + + + + Defines the basic contract of a Property within the runtime metamodel. + + + + + Constructor for Property instances. + + The name by which the property can be referenced within its owner. + The node name to use for XML-based representation of this property. + The Hibernate Type of this property. + + + + Construct a non-virtual identifier property. + + The name of the property representing the identifier within + its owning entity. + The node name to use for XML-based representation of this + property. + The Hibernate Type for the identifier property. + Is this an embedded identifier. + The value which, if found as the value on the identifier + property, represents new (i.e., un-saved) instances of the owning entity. + The generator to use for id value generation. + + + + Construct a virtual IdentifierProperty. + + The Hibernate Type for the identifier property. + Is this an embedded identifier. + The value which, if found as the value on the identifier + property, represents new (i.e., un-saved) instances of the owning entity. + The generator to use for id value generation. + + + + Defines a POCO-based instantiator for use from the tuplizers. + + + + Responsible for generation of runtime metamodel representations. + Makes distinction between identifier, version, and other (standard) properties. + + + Author: Steve Ebersole + + + + + Generates an IdentifierProperty representation of the for a given entity mapping. + + The mapping definition of the entity. + The identifier value generator to use for this identifier. + The appropriate IdentifierProperty definition. + + + + Generates a VersionProperty representation for an entity mapping given its + version mapping Property. + + The version mapping Property. + Is property lazy loading currently available. + The appropriate VersionProperty definition. + + + + Generate a "standard" (i.e., non-identifier and non-version) based on the given + mapped property. + + The mapped property. + Is property lazy loading currently available. + The appropriate StandardProperty definition. + + + + Represents a basic property within the Hibernate runtime-metamodel. + + + Author: Steve Ebersole + + + + + Constructs StandardProperty instances. + + The name by which the property can be referenced within + its owner. + The node name to use for XML-based representation of this + property. + The Hibernate Type of this property. + Should this property be handled lazily? + Is this property an insertable value? + Is this property an updateable value? + Is this property generated in the database on insert? + Is this property generated in the database on update? + Is this property a nullable value? + Is this property a checkable value? + Is this property a versionable value? + The cascade style for this property's value. + Any fetch mode defined for this property + + + + Represents a version property within the Hibernate runtime-metamodel. + + + Author: Steve Ebersole + + + + + Constructs VersionProperty instances. + + The name by which the property can be referenced within + its owner. + The node name to use for XML-based representation of this + property. + The Hibernate Type of this property. + Should this property be handled lazily? + Is this property an insertable value? + Is this property an updateable value? + Is this property generated in the database on insert? + Is this property generated in the database on update? + Is this property a nullable value? + Is this property a checkable value? + Is this property a versionable value? + The cascade style for this property's value. + The value which, if found as the value of + this (i.e., the version) property, represents new (i.e., un-saved) + instances of the owning entity. + + + Logic to bind stream of byte into a VARBINARY + + + + Superclass for mutable nullable types. + + + + + Superclass of single-column nullable types. + + + Maps the Property to a single column that is capable of storing nulls in it. If a .net Struct is + used it will be created with its unitialized value and then on Update the uninitialized value of + the Struct will be written to the column - not . + + + + + The base implementation of the interface. + Mapping of the built in Type hierarchy. + + + + + Disassembles the object into a cacheable representation. + + The value to disassemble. + The is not used by this method. + optional parent entity object (needed for collections) + The disassembled, deep cloned state of the object + + This method calls DeepCopy if the value is not null. + + + + + Reconstructs the object from its cached "disassembled" state. + + The disassembled state from the cache + The is not used by this method. + The parent Entity object is not used by this method + The assembled object. + + This method calls DeepCopy if the value is not null. + + + + + Should the parent be considered dirty, given both the old and current + field or element value? + + The old value + The current value + The is not used by this method. + true if the field is dirty + This method uses IType.Equals(object, object) to determine the value of IsDirty. + + + + Retrives an instance of the mapped class, or the identifier of an entity + or collection from a . + + The that contains the values. + + The names of the columns in the that contain the + value to populate the IType with. + + the session + The parent Entity + An identifier or actual object mapped by this IType. + + This method uses the IType.NullSafeGet(IDataReader, string[], ISessionImplementor, object) method + to Hydrate this . + + + + + Maps identifiers to Entities or Collections. + + An identifier or value returned by Hydrate() + The is not used by this method. + The parent Entity is not used by this method. + The value. + + There is nothing done in this method other than return the value parameter passed in. + + + + + Says whether the value has been modified + + + + + When implemented by a class, returns a deep copy of the persistent + state, stopping at entities and at collections. + A Collection element or Entity fieldThe entityMode.The session factory.A deep copy of the object. + + + + When implemented by a class, returns the SqlTypes for the columns mapped by this IType. + The that uses this IType.An array of s. + + + + When implemented by a class, returns how many columns are used to persist this type. + The that uses this IType.The number of columns this IType spans.MappingException + + + + + + + + + + When implemented by a class, puts the value/values from the mapped + class into the . + The to put the values into.The object that contains the values.The index of the to start writing the values to.Indicates which columns are to be set. + Implementors should handle possibility of null values. + A multi-column type should be written to parameters starting from . + + + + + When implemented by a class, puts the value/values from the mapped + class into the . + + The to put the values into. + The object that contains the values. + The index of the to start writing the values to. + + Implementors should handle possibility of null values. + A multi-column type should be written to parameters starting from . + + + + + When implemented by a class, a representation of the value to be + embedded in an XML element + The object that contains the values.An Xml formatted string. + + + + Gets a value indicating if the is an . + + false - by default an is not an . + + + + Gets a value indicating if the is a . + + false - by default an is not a . + + + + Gets a value indicating if the is an . + + false - by default an is not an . + + + + Gets a value indicating if the is a . + + false - by default an is not a . + + + + Gets a value indicating if the implementation is an "object" type + + false - by default an is not a "object" type. + + + + When implemented by a class, gets the value indicating if the objects + of this IType are mutable. + true if the objects mapped by this IType are mutable. + With respect to the referencing object... + Entities and Collections are considered immutable because they manage their own internal state. + + + + + When implemented by a class, gets the abbreviated name of the type. + The NHibernate type name. + + + + When implemented by a class, gets the returned + by the NullSafeGet() methods. + + The from the .NET framework. + + This is used to establish the class of an array of this Itype + + + + + Initialize a new instance of the NullableType class using a + . + + The underlying . + This is used when the Property is mapped to a single column. + + + + When implemented by a class, put the value from the mapped + Property into to the . + + The to put the value into. + The object that contains the value. + The index of the to start writing the values to. + + Implementors do not need to handle possibility of null values because this will + only be called from after + it has checked for nulls. + + + + + When implemented by a class, gets the object in the + for the Property. + + The that contains the value. + The index of the field to get the value from. + An object with the value from the database. + + + + When implemented by a class, gets the object in the + for the Property. + + The that contains the value. + The name of the field to get the value from. + An object with the value from the database. + + Most implementors just call the + overload of this method. + + + + + A representation of the value to be embedded in an XML element + + The object that contains the values. + + An Xml formatted string. + + + + When implemented by a class, a representation of the value to be + embedded in an XML element + The object that contains the values.An Xml formatted string. + + + This implementation forwards the call to if the parameter + value is not null. + + + It has been "sealed" because the Types inheriting from + do not need and should not override this method. All of their implementation + should be in . + + + + + + Parse the XML representation of an instance + + XML string to parse, guaranteed to be non-empty + + + + + When implemented by a class, puts the value/values from the mapped + class into the . + + The to put the values into. + The object that contains the values. + The index of the to start writing the values to. + + Implementors should handle possibility of null values. + A multi-column type should be written to parameters starting from . + + + + This implementation forwards the call to . + + + It has been "sealed" because the Types inheriting from + do not need to and should not override this method. All of their implementation + should be in . + + + + + + Puts the value from the mapped class into the . + + The to put the values into. + The object that contains the values. + The index of the to write the value to. + + + This method checks to see if value is null, if it is then the value of + is written to the . + + + If the value is not null, then the method + is called and that method is responsible for setting the value. + + + + + + When implemented by a class, gets an instance of the object mapped by + this IType from the . + The that contains the values + The names of the columns in the that contain the + value to populate the IType with. + The object mapped by this IType. + Implementors should handle possibility of null values. + + + This has been sealed because no other class should override it. This + method calls for a single value. + It only takes the first name from the string[] names parameter - that is a + safe thing to do because a Nullable Type only has one field. + + + + + Extracts the values of the fields from the DataReader + + The DataReader positioned on the correct record + An array of field names. + The value off the field from the DataReader + + In this class this just ends up passing the first name to the NullSafeGet method + that takes a string, not a string[]. + + I don't know why this method is in here - it doesn't look like anybody that inherits + from NullableType overrides this... + + TODO: determine if this is needed + + + + + Gets the value of the field from the . + + The positioned on the correct record. + The name of the field to get the value from. + The value of the field. + + + This method checks to see if value is null, if it is then the null is returned + from this method. + + + If the value is not null, then the method + is called and that method is responsible for retrieving the value. + + + + + + When implemented by a class, gets an instance of the object + mapped by this IType from the . + The that contains the valuesThe name of the column in the that contains the + value to populate the IType with.The object mapped by this IType. + Implementations should handle possibility of null values. + This method might be called if the IType is known to be a single-column type. + + + + This implementation forwards the call to . + + + It has been "sealed" because the Types inheriting from + do not need to and should not override this method. All of their implementation + should be in . + + + + + + When implemented by a class, returns the SqlTypes for the columns mapped by this IType. + The that uses this IType.An array of s. + + + This implementation forwards the call to . + + + It has been "sealed" because the Types inheriting from + do not need to and should not override this method because they map to a single + column. All of their implementation should be in . + + + + + + Returns the number of columns spanned by this + + A always returns 1. + + This has the hard coding of 1 in there because, by definition of this class, + a NullableType can only map to one column in a table. + + + + + Determines whether the specified is equal to this + . + + The to compare with this NullableType. + true if the SqlType and Name properties are the same. + + + + Serves as a hash function for the , + suitable for use in hashing algorithms and data structures like a hash table. + + + A hash code that is based on the 's + hash code and the 's hash code. + + + + Gets the underlying for + the column mapped by this . + + The underlying . + + This implementation should be suitable for all subclasses unless they need to + do some special things to get the value. There are no built in s + that override this Property. + + + + + Initialize a new instance of the MutableType class using a + . + + The underlying . + + + + Gets the value indicating if this IType is mutable. + + true - a is mutable. + + This has been "sealed" because any subclasses are expected to be mutable. If + the type is immutable then they should inherit from . + + + + + An that may be used to version data. + + + + + When implemented by a class, increments the version. + + The current version + The current session, if available. + an instance of the that has been incremented. + + + + When implemented by a class, gets an initial version. + + The current session, if available. + An instance of the type. + + + + Are the two version values considered equal? + + One value to check. + The other value to check. + true if the values are equal, false otherwise. + + + + Get a comparator for the version numbers + + + + Convert the byte[] into the expected object type + + + Convert the object into the internal byte[] representation + + + + Common base class for and . + + + + + Superclass of types. + + + + + Superclass of nullable immutable types. + + + + + Initialize a new instance of the ImmutableType class using a + . + + The underlying . + + + + Gets the value indicating if this IType is mutable. + + false - an is not mutable. + + This has been "sealed" because any subclasses are expected to be immutable. If + the type is mutable then they should inherit from . + + + + + An that may appear as an SQL literal + + + + + When implemented by a class, return a representation + of the value, suitable for embedding in an SQL statement + + The object to convert to a string for the SQL statement. + + A string that contains a well formed SQL Statement. + + + + Initialize a new instance of the PrimitiveType class using a . + + The underlying . + + + + When implemented by a class, return a representation + of the value, suitable for embedding in an SQL statement + + The object to convert to a string for the SQL statement. + + A string that containts a well formed SQL Statement. + + + + A representation of the value to be embedded in an XML element + + The object that contains the values. + + An Xml formatted string. + + This just calls so if there is + a possibility of this PrimitiveType having any characters + that need to be encoded then this method should be overridden. + + + + + An IType that may be used for a discriminator column. + + + This interface contains no new methods but does require that an + that will be used in a discriminator column must implement + both the and interfaces. + + + + + An that may be used as an identifier. + + + + + When implemented by a class, converts the xml string from the + mapping file to the .NET object. + + The value of discriminator-value or unsaved-value attribute. + The string converted to the object. + + This method needs to be able to handle any string. It should not just + call System.Type.Parse without verifying that it is a parsable value + for the System.Type. + + + + + Maps a Property to a column that + stores date & time down to the accuracy of a second. + + + This only stores down to a second, so if you are looking for the most accurate + date and time storage your provider can give you use the . + or the + + + + + + + + + + + Base class for enum types. + + + + + Maps a Property + to a DbType.AnsiStringFixedLength column. + + + + + Maps a Property + to a column. + + + + + + + + Handles "any" mappings and the old deprecated "object" type. + + + The identifierType is any NHibernate IType that can be serailized by default. + For example, you can specify the identifierType as an Int32 or a custom identifier + type that you built. The identifierType matches to one or many columns. + + The metaType maps to a single column. By default it stores the name of the Type + that the Identifier identifies. + + For example, we can store a link to any table. It will have the results + class_name id_col1 + ======================================== + Simple, AssemblyName 5 + DiffClass, AssemblyName 5 + Simple, AssemblyName 4 + + You can also provide you own type that might map the name of the class to a table + with a giant switch statemet or a good naming convention for your class->table. The + data stored might look like + class_name id_col1 + ======================================== + simple_table 5 + diff_table 5 + simple_table 4 + + + + + + Enables other Component-like types to hold collections and have cascades, etc. + + + + + Get the values of the component properties of + a component instance + + + + + Optional Operation + + + + + Optional operation + + + + Get the types of the component properties + + + Get the names of the component properties + + + + Optional operation + + nullability of component properties + + + + An that represents some kind of association between entities. + + + + + Get the "persister" for this association - a class or collection persister + + + + + + Get the entity name of the associated entity + + + + Get the "filtering" SQL fragment that is applied in the + SQL on clause, in addition to the usual join condition. + + + + + When implemented by a class, gets the type of foreign key directionality + of this association. + + The of this association. + + + + Is the primary key of the owning entity table + to be used in the join? + + + + + Get the name of the property in the owning entity + that provides the join key (null if the identifier) + + + + + The name of a unique property of the associated entity + that provides the join key (null if the identifier of + an entity, or key of a collection) + + + + + Do we dirty check this association, even when there are + no columns to be updated. + + + + + + + + + + + + + + + Not really relevant to AnyType, since it cannot be "joined" + + + + + An that maps an collection + to the database. + + + + + The base class for an that maps collections + to the database. + + + + + Initializes a new instance of a class for + a specific role. + + The role the persistent collection is in. + + The name of the property in the + owner object containing the collection ID, or if it is + the primary key. + + + + + + Instantiate an uninitialized collection wrapper or holder. Callers MUST add the holder to the + persistence context! + + The session from which the request is originating. + The underlying collection persister (metadata) + The owner key. + The instantiated collection. + + + + Wrap the naked collection instance in a wrapper, or instantiate a + holder. Callers MUST add the holder to the persistence context! + + The session from which the request is originating. + The bare collection to be wrapped. + + A subclass of that wraps the non NHibernate collection. + + + + + Get the key value from the owning entity instance, usually the identifier, but might be some + other unique key, in the case of property-ref + + + + + Get the id value from the owning entity key, usually the same as the key, but might be some + other property, in the case of property-ref + + The collection owner key + The session from which the request is originating. + + The collection owner's id, if it can be obtained from the key; + otherwise, null is returned + + + + + Instantiate an empty instance of the "underlying" collection (not a wrapper), + but with the given anticipated size (i.e. accounting for initial capacity + and perhaps load factor). + + + The anticipated size of the instantiated collection after we are done populating it. + + A newly instantiated collection to be wrapped. + + + + Get an iterator over the element set of the collection, which may not yet be wrapped + + The collection to be iterated + The session from which the request is originating. + The iterator. + + + + Get an iterator over the element set of the collection in POCO mode + + The collection to be iterated + The iterator. + + + + We always need to dirty check the collection because we sometimes + need to increment version number of owner and also because of + how assemble/disassemble is implemented for uks + + + + + Initializes a new instance of a class for + a specific role. + + The role the persistent collection is in. + The name of the property in the + owner object containing the collection ID, or if it is + the primary key. + The of the element contained in the array. + + + This creates a bag that is non-generic. + + + + + + + + + + + + + + Wraps a in a . + + The for the collection to be a part of. + The unwrapped array. + + An that wraps the non NHibernate . + + + + + The for the element. + + + + + + + + Maps a System.Byte[] Property to an column that can store a BLOB. + + + This is only needed by DataProviders (SqlClient) that need to specify a Size for the + IDbDataParameter. Most DataProvider(Oralce) don't need to set the Size so a BinaryType + would work just fine. + + + + + BinaryType. + + + + + + + + Maps a Property + to a column. + + + + + Initialize a new instance of the BooleanType + + This is used when the Property is mapped to a native boolean type. + + + + Initialize a new instance of the BooleanType class using a + . + + The underlying . + + This is used when the Property is mapped to a string column + that stores true or false as a string. + + + + + Maps a property + to a column. + + + + + Maps a Property + to a column. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Maps a Property + to a DbType.StringFixedLength column. + + + + + ClassMetaType is a NH specific type to support "any" with meta-type="class" + + + It work like a MetaType where the key is the entity-name it self + + + + + + + + + + + + + + + + + + + + + This method does not populate the component parent + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Maps a Property + to a column. + + + CultureInfoType stores the culture name (not the Culture ID) of the + in the DB. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Maps a Property + to a column. + + + + + A custom type for mapping user-written classes that implement + . + + + + + + + Adapts IUserType to the generic IType interface. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Maps a Property to a + + + + + + + + Maps a Property to a + + + + + + + + Maps the Year, Month, and Day of a Property to a + column + + + + + Support for parameterizable types. A UserType or CustomUserType may be + made parameterizable by implementing this interface. Parameters for a + type may be set by using a nested type element for the property element + + + + + Gets called by Hibernate to pass the configured type parameters to + the implementation. + + + + + + + + + + An extension of which + maps to the database's current timestamp, rather than the vm's + current timestamp. + + + Note: May/may-not cause issues on dialects which do not properly support + a true notion of timestamp + + + + + This is almost the exact same type as the DateTime except it can be used + in the version column, stores it to the accuracy the database supports, + and will default to the value of DateTime.Now if the value is null. + + +

+ The value stored in the database depends on what your data provider is capable + of storing. So there is a possibility that the DateTime you save will not be + the same DateTime you get back when you check DateTime.Equals(DateTime) because + they will have their milliseconds off. +

+

+ For example - SQL Server 2000 is only accurate to 3.33 milliseconds. So if + NHibernate writes a value of 01/01/98 23:59:59.995 to the Prepared Command, MsSql + will store it as 1998-01-01 23:59:59.997. +

+

+ Please review the documentation of your Database server. +

+
+
+ + + Sets the value of this Type in the IDbCommand. + + The IDbCommand to add the Type's value to. + The value of the Type. + The index of the IDataParameter in the IDbCommand. + + No null values will be written to the IDbCommand for this Type. + + + + + Maps a Property + to a column. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A reference to an entity class + + + + Constructs the requested entity type mapping. + The name of the associated entity. + + The property-ref name, or null if we + reference the PK of the associated entity. + + Is eager fetching enabled. + Should values of this mapping be embedded in XML modes? + + Is unwrapping of proxies allowed for this association; unwrapping + says to return the "implementation target" of lazy prooxies; typically only possible + with lazy="no-proxy". + + + + Two entities are considered the same when their instances are the same. + One entity instance + Another entity instance + The entity mode. + True if x == y; false otherwise. + + + + Get the identifier value of an instance or proxy. +

+ Intended only for loggin purposes!!! +

+ The object from which to extract the identifier. + The entity persister + The entity mode + The extracted identifier. +
+ + + Converts the id contained in the to an object. + + The that contains the query results. + A string array of column names that contain the id. + The this is occurring in. + The object that this Entity will be a part of. + + An instance of the object or if the identifer was null. + + + + Retrieves the {@link Joinable} defining the associated entity. + The session factory. + The associated joinable + + + + Determine the type of either (1) the identifier if we reference the + associated entity's PK or (2) the unique key to which we refer (i.e. + the property-ref). + + The mappings... + The appropriate type. + + + + The name of the property on the associated entity to which our FK refers + + The mappings... + The appropriate property name. + + + Convenience method to locate the identifier type of the associated entity. + The mappings... + The identifier type + + + Convenience method to locate the identifier type of the associated entity. + The originating session + The identifier type + + + + Resolves the identifier to the actual object. + + + + + Resolve an identifier or unique key value + + + + + + + + The name of the associated entity. + The session factory, for resolution. + The associated entity name. + + + The name of the associated entity. + The associated entity name. + + + + Load an instance by a unique key that is not the primary key. + + The name of the entity to load + The name of the property defining the uniqie key. + The unique key property value. + The originating session. + The loaded entity + + + Explicitly, an entity type is an entity type + True. + + + + This returns the wrong class for an entity with a proxy, or for a named + entity. Theoretically it should return the proxy class, but it doesn't. +

+ The problem here is that we do not necessarily have a ref to the associated + entity persister (nor to the session factory, to look it up) which is really + needed to "do the right thing" here... +

+
+ + + When implemented by a class, gets the type of foreign key directionality + of this association. + + The of this association. + + + + Is the foreign key the primary key of the table? + + + + + Converts the given enum instance into a basic type. + + + + + + + Maps a to a + DbType.String. + + + If your database should store the + using the named values in the enum instead of the underlying values + then subclass this . + + + All that needs to be done is to provide a default constructor that + NHibernate can use to create the specific type. For example, if + you had an enum defined as. + + + + public enum MyEnum + { + On, + Off, + Dimmed + } + + + + all that needs to be written for your enum string type is: + + + + public class MyEnumStringType : NHibernate.Type.EnumStringType + { + public MyEnumStringType() + : base( typeof( MyEnum ) ) + { + } + } + + + + The mapping would look like: + + + + ... + <property name="Status" type="MyEnumStringType, AssemblyContaining" /> + ... + + + + The TestFixture that shows the working code can be seen + in NHibernate.Test.TypesTest.EnumStringTypeFixture.cs + , NHibernate.Test.TypesTest.EnumStringClass.cs + , and NHibernate.Test.TypesTest.EnumStringClass.hbm.xml + + + + + + Hardcoding of 255 for the maximum length + of the Enum name that will be saved to the db. + + + 255 because that matches the default length that hbm2ddl will + use to create the column. + + + + + Initializes a new instance of . + + The of the Enum. + + + + Initializes a new instance of . + + The of the Enum. + The length of the string that can be written to the column. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This appends enumstring - to the beginning of the underlying + enums name so that could still be stored + using the underlying value through the + also. + + + + + Represents directionality of the foreign key constraint + + + + + A foreign key from parent to child + + + + + A foreign key from child to parent + + + + + Should we cascade at this cascade point? + + + + + An that maps an collection + to the database using bag semantics. + + + + + Initializes a new instance of a class for + a specific role. + + The role the persistent collection is in. + The name of the property in the + owner object containing the collection ID, or if it is + the primary key. + + + + Instantiates a new for the bag. + + The current for the bag. + The current for the bag. + + + + + Wraps an in a . + + The for the collection to be a part of. + The unwrapped . + + An that wraps the non NHibernate . + + + + + An that maps an collection + using bag semantics with an identifier to the database. + + + + + Initializes a new instance of a class for + a specific role. + + The role the persistent collection is in. + The name of the property in the + owner object containing the collection ID, or if it is + the primary key. + + + + Instantiates a new for the identifier bag. + + The current for the identifier bag. + + + + + + + Wraps an in a . + + The for the collection to be a part of. + The unwrapped . + + An that wraps the non NHibernate . + + + + + Instantiate an empty instance of the "underlying" collection (not a wrapper), + but with the given anticipated size (i.e. accounting for initial capacity + and perhaps load factor). + + + The anticipated size of the instantiated collection after we are done populating it. + + A newly instantiated collection to be wrapped. + + + + + + + An that maps an collection + to the database using list semantics. + + + + + Initializes a new instance of a class for + a specific role. + + The role the persistent collection is in. + The name of the property in the + owner object containing the collection ID, or if it is + the primary key. + + + + Instantiates a new for the list. + + The current for the list. + The current for the list. + + + + + Wraps an in a . + + The for the collection to be a part of. + The unwrapped . + + An that wraps the non NHibernate . + + + + + An that maps an collection + to the database. + + + + + Initializes a new instance of a class for + a specific role. + + The role the persistent collection is in. + The name of the property in the + owner object containing the collection ID, or if it is + the primary key. + + + + Instantiates a new for the map. + + The current for the map. + + Not used. + + + + + Wraps an in a . + + The for the collection to be a part of. + The unwrapped . + + An that wraps the + non NHibernate . + + + + + An that maps a sorted collection + to the database. + + + + + An that maps an collection + to the database. + + + + + Initializes a new instance of a class for + a specific role. + + The role the persistent collection is in. + The name of the property in the + owner object containing the collection ID, or if it is + the primary key. + + + + Instantiates a new for the set. + + The current for the set. + The current for the set. + + + + + Wraps an in a . + + The for the collection to be a part of. + The unwrapped . + + An that wraps the non NHibernate . + + + + + Initializes a new instance of a class for + a specific role. + + The role the persistent collection is in. + The name of the property in the + owner object containing the collection ID, or if it is + the primary key. + + + + An that maps a sorted collection + to the database. + + + + + Initializes a new instance of a class for + a specific role. + + The role the persistent collection is in. + The name of the property in the + owner object containing the collection ID, or if it is + the primary key. + The to use to compare + set elements. + + + + Maps a Property + to a column. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Maps a Property + to a column. + + + + + + + + + + + Maps a Property + to a column. + + + + + + + + + + + Maps a Property + to a column. + + + + + + + + + + + A many-to-one association to an entity + + + + + Hydrates the Identifier from . + + The that contains the query results. + A string array of column names to read from. + The this is occurring in. + The object that this Entity will be a part of. + + An instantiated object that used as the identifier of the type. + + + + + A one-to-one association to an entity + + + + + We don't need to dirty check one-to-one because of how + assemble/disassemble is implemented and because a one-to-one + association is never dirty + + + + + PersistentEnumType + + + + + Gets an instance of the Enum + + The underlying value of an item in the Enum. + + An instance of the Enum set to the code value. + + + + + Gets the correct value for the Enum. + + The value to convert (an enum instance). + A boxed version of the code, converted to the correct type. + + This handles situations where the DataProvider returns the value of the Enum + from the db in the wrong underlying type. It uses to + convert it to the correct type. + + + + + Maps a Property + to a column. + + + + + + + + + + + Maps an instance of a that has the + to a column. + + + + For performance reasons, the SerializableType should be used when you know that Bytes are + not going to be greater than 8,000. Implementing a custom type is recommended for larger + types. + + + The base class is because the data is stored in + a byte[]. The System.Array does not have a nice "equals" method so we must + do a custom implementation. + + + + + + + + + + + + + + + + + + + + + + + Thrown when a property cannot be serialized/deserialized + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message that describes the error. + + + + Initializes a new instance of the class. + + The message that describes the error. + + The exception that is the cause of the current exception. If the innerException parameter + is not a null reference, the current exception is raised in a catch block that handles + the inner exception. + + + + + Initializes a new instance of the class + with serialized data. + + + The that holds the serialized object + data about the exception being thrown. + + + The that contains contextual information about the source or destination. + + + + + Maps a Property to an + column. + + + Verify through your database's documentation if there is a column type that + matches up with the capabilities of + + + + + + + + + + + A one-to-one association that maps to specific formula(s) + instead of the primary key column of the owning entity. + + + + + Maps a Property to an + column that can store a CLOB. + + + This is only needed by DataProviders (SqlClient) that need to specify a Size for the + IDbDataParameter. Most DataProvider(Oralce) don't need to set the Size so a StringType + would work just fine. + + + + + Maps a to a column. + + + + + + + + + + + + + + + + + Maps a Property to an column + that stores the DateTime using the Ticks property. + + + This is the recommended way to "timestamp" a column. + The System.DateTime.Ticks is accurate to 100-nanosecond intervals. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Maps a Property to an column + This is an extra way to map a . You already have + but mapping against a . + + + + + Maps a Property to an column + + + + + + + + + + + + + + + + + + + + + + + + + Maps a Property to an DateTime column that only stores the + Hours, Minutes, and Seconds of the DateTime as significant. + Also you have for handling, the NHibernate Type , + the which maps to a . + + + + This defaults the Date to "1753-01-01" - that should not matter because + using this Type indicates that you don't care about the Date portion of the DateTime. + + + A more appropriate choice to store the duration/time is the . + The underlying tends to be handled differently by different + DataProviders. + + + + + + Maps a to a 1 char column + that stores a 'T'/'F' to indicate true/false. + + + If you are using schema-export to generate your tables then you need + to set the column attributes: length=1 or sql-type="char(1)". + + This needs to be done because in Java's JDBC there is a type for CHAR and + in ADO.NET there is not one specifically for char, so you need to tell schema + export to create a char(1) column. + + + + + + + + + + + + + + + + + Used internally to obtain instances of IType. + + + Applications should use static methods and constants on NHibernate.NHibernateUtil if the default + IType is good enough. For example, the TypeFactory should only be used when the String needs + to have a length of 300 instead of 255. At this point NHibernateUtil.String does not get you the + correct IType. Instead use TypeFactory.GetString(300) and keep a local variable that holds + a reference to the IType. + + + + + + + + Register other Default .NET type + + + These type will be used, as default, even when the "type" attribute was NOT specified in the mapping + + + + + Register other NO Default .NET type + + + These type will be used only when the "type" attribute was is specified in the mapping. + These are in here because needed to NO override default CLR types and be available in mappings + + + + + Gets the classification of the Type based on the string. + + The name of the Type to get the classification for. + The Type of Classification + + This parses through the string and makes the assumption that no class + name and no assembly name will contain the "(". + + If it finds + the "(" and then finds a "," afterwards then it is a + TypeClassification.PrecisionScale. + + + If it finds the "(" + and doesn't find a "," afterwards, then it is a + TypeClassification.Length. + + + If it doesn't find the "(" then it assumes that it is a + TypeClassification.Plain. + + + + + + Given the name of a Hibernate type such as Decimal, Decimal(19,0) + , Int32, or even NHibernate.Type.DecimalType, NHibernate.Type.DecimalType(19,0), + NHibernate.Type.Int32Type, then return an instance of NHibernate.Type.IType + + The name of the type. + The instance of the IType that the string represents. + + This method will return null if the name is not found in the basicNameMap. + + + + + Uses heuristics to deduce a NHibernate type given a string naming the + type. + + + An instance of NHibernate.Type.IType + + When looking for the NHibernate type it will look in the cache of the Basic types first. + If it doesn't find it in the cache then it uses the typeName to get a reference to the + Class (Type in .NET). Once we get the reference to the .NET class we check to see if it + implements IType, ICompositeUserType, IUserType, ILifecycle (Association), or + IPersistentEnum. If none of those are implemented then we will serialize the Type to the + database using NHibernate.Type.SerializableType(typeName) + + + + + Uses heuristics to deduce a NHibernate type given a string naming the type. + + the type name + parameters for the type + An instance of NHibernate.Type.IType + + + + Uses heuristics to deduce a NHibernate type given a string naming the type. + + the type name + parameters for the type + optionally, the size of the type + + + + + Gets the BinaryType with the specified length. + + The length of the data to store in the database. + A BinaryType + + In addition to returning the BinaryType it will also ensure that it has + been added to the basicNameMap with the keys Byte[](length) and + NHibernate.Type.BinaryType(length). + + + + + Gets the SerializableType for the specified Type + + The Type that will be Serialized to the database. + A SerializableType + + + In addition to returning the SerializableType it will also ensure that it has + been added to the basicNameMap with the keys Type.FullName (the result + of IType.Name and Type.AssemblyQualifiedName. This is different + from the other items put in the basicNameMap because it is uses the AQN and the + FQN as opposed to the short name used in the maps and the FQN. + + + Since this method calls the method + GetSerializableType(System.Type, Int32) + with the default length, those keys will also be added. + + + + + + A one-to-one association type for the given class and cascade style. + + + + + A many-to-one association type for the given class and cascade style. + + + + + + + A many-to-one association type for the given class and cascade style. + + + + + A many-to-one association type for the given class and cascade style. + + + + + Collection of convenience methods relating to operations across arrays of types... + + + + Deep copy a series of values from one array to another + The values to copy (the source) + The value types + An array indicating which values to include in the copy + The array into which to copy the values + The originating session + + + Apply the operation across a series of values. + The values + The value types + The originating session + + + + Apply the operation across a series of values. + + The values + The value types + The originating session + The entity "owning" the values + + + + Apply the operation across a series of values. + The values + The value types + An array indicating which values to include in the disassembled state + The originating session + The entity "owning" the values + The disassembled state + + + + Apply the operation across a series of values. + + The source of the state + The target into which to replace the source values. + The value types + The originating session + The entity "owning" the values + Represent a cache of already replaced state + The replaced state + + + + Apply the + operation across a series of values. + + The source of the state + The target into which to replace the source values. + The value types + The originating session + The entity "owning" the values + A map representing a cache of already replaced state + FK directionality to be applied to the replacement + The replaced state + + + + Apply the + operation across a series of values, as long as the corresponding is an association. + + The source of the state + The target into which to replace the source values. + The value types + The originating session + The entity "owning" the values + A map representing a cache of already replaced state + FK directionality to be applied to the replacement + The replaced state + + If the corresponding type is a component type, then apply + across the component subtypes but do not replace the component value itself. + + + + + Determine if any of the given field values are dirty, returning an array containing + indices of the dirty fields. + If it is determined that no fields are dirty, null is returned. + + The property definitions + The current state of the entity + The baseline state of the entity + Columns to be included in the dirty checking, per property + Does the entity currently hold any uninitialized property values? + The session from which the dirty check request originated. + Array containing indices of the dirty properties, or null if no properties considered dirty. + + + + Determine if any of the given field values are modified, returning an array containing + indices of the modified fields. + If it is determined that no fields are dirty, null is returned. + + The property definitions + The current state of the entity + The baseline state of the entity + Columns to be included in the mod checking, per property + Does the entity currently hold any uninitialized property values? + The session from which the dirty check request originated. + Array containing indices of the modified properties, or null if no properties considered modified. + + + + Maps the Assembly Qualified Name of a to a + column. + + + + + + + + Initialize a new instance of the TypeType class using a + . + + The underlying . + + + + Gets the in the for the Property. + + The that contains the value. + The index of the field to get the value from. + The from the database. + + Thrown when the value in the database can not be loaded as a + + + + + Gets the in the for the Property. + + The that contains the value. + The name of the field to get the value from. + The from the database. + + This just calls gets the index of the name in the IDataReader + and calls the overloaded version + (IDataReader, Int32). + + + Thrown when the value in the database can not be loaded as a + + + + + Puts the Assembly Qualified Name of the + Property into to the . + + The to put the value into. + The that contains the value. + The index of the to start writing the value to. + + This uses the method of the + object to do the work. + + + + + A representation of the value to be embedded in an XML element + + The that contains the values. + + An Xml formatted string that contains the Assembly Qualified Name. + + + + Gets the that will be returned + by the NullSafeGet() methods. + + + A from the .NET framework. + + + + + + + + Maps a Property + to a column. + + + + + + + + + + + Maps a Property + to a column. + + + + + + + + + + + Maps a Property + to a column. + + + + + + + + Maps a to a 1 char column + that stores a 'Y'/'N' to indicate true/false. + + + If you are using schema-export to generate your tables then you need + to set the column attributes: length=1 or sql-type="char(1)". + + This needs to be done because in Java's JDBC there is a type for CHAR and + in ADO.NET there is not one specifically for char, so you need to tell schema + export to create a char(1) column. + + + + + + + + + + + + + + + + + A UserType that may be dereferenced in a query. + This interface allows a custom type to define "properties". + These need not necessarily correspond to physical .NET style properties. + + A ICompositeUserType may be used in almost every way + that a component may be used. It may even contain many-to-one + associations. + + Implementors must be immutable and must declare a public + default constructor. + + Unlike UserType, cacheability does not depend upon + serializability. Instead, Assemble() and + Disassemble() provide conversion to/from a cacheable + representation. + + + + + Get the value of a property + + an instance of class mapped by this "type" + + the property value + + + + Set the value of a property + + an instance of class mapped by this "type" + + the value to set + + + + Compare two instances of the class mapped by this type for persistence + "equality", ie. equality of persistent state. + + + + + + + + Get a hashcode for the instance, consistent with persistence "equality" + + + + + Retrieve an instance of the mapped class from a IDataReader. Implementors + should handle possibility of null values. + + IDataReader + the column names + + the containing entity + + + + + Write an instance of the mapped class to a prepared statement. + Implementors should handle possibility of null values. + A multi-column type should be written to parameters starting from index. + If a property is not settable, skip it and don't increment the index. + + + + + + + + + + Return a deep copy of the persistent state, stopping at entities and at collections. + + generally a collection element or entity field + + + + + Transform the object into its cacheable representation. + At the very least this method should perform a deep copy. + That may not be enough for some implementations, method should perform a deep copy. That may not be enough for some implementations, however; for example, associations must be cached as identifier values. (optional operation) + + the object to be cached + + + + + + Reconstruct an object from the cacheable representation. + At the very least this method should perform a deep copy. (optional operation) + + the object to be cached + + + + + + + During merge, replace the existing (target) value in the entity we are merging to + with a new (original) value from the detached entity we are merging. For immutable + objects, or null values, it is safe to simply return the first parameter. For + mutable objects, it is safe to return a copy of the first parameter. However, since + composite user types often define component values, it might make sense to recursively + replace component values in the target object. + + + + + Get the "property names" that may be used in a query. + + + + + Get the corresponding "property types" + + + + + The class returned by NullSafeGet(). + + + + + Are objects of this type mutable? + + + + + A custom type that may function as an identifier or discriminator + type, or may be marshalled to and from an XML document. + + + + + The interface to be implemented by user-defined types. + + + + The interface abstracts user code from future changes to the interface, + simplifies the implementation of custom types and hides certain "internal interfaces from + user code. + + + Implementers must be immutable and must declare a public default constructor. + + + The actual class mapped by a IUserType may be just about anything. However, if it is to + be cacheble by a persistent cache, it must be serializable. + + + Alternatively, custom types could implement directly or extend one of the + abstract classes in NHibernate.Type. This approach risks future incompatible changes + to classes or interfaces in the package. + + + + + + Compare two instances of the class mapped by this type for persistent "equality" + ie. equality of persistent state + + + + + + + + Get a hashcode for the instance, consistent with persistence "equality" + + + + + Retrieve an instance of the mapped class from a JDBC resultset. + Implementors should handle possibility of null values. + + a IDataReader + column names + the containing entity + + HibernateException + + + + Write an instance of the mapped class to a prepared statement. + Implementors should handle possibility of null values. + A multi-column type should be written to parameters starting from index. + + a IDbCommand + the object to write + command parameter index + HibernateException + + + + Return a deep copy of the persistent state, stopping at entities and at collections. + + generally a collection element or entity field + a copy + + + + During merge, replace the existing () value in the entity + we are merging to with a new () value from the detached + entity we are merging. For immutable objects, or null values, it is safe to simply + return the first parameter. For mutable objects, it is safe to return a copy of the + first parameter. For objects with component values, it might make sense to + recursively replace component values. + + the value from the detached entity being merged + the value in the managed entity + the managed entity + the value to be merged + + + + Reconstruct an object from the cacheable representation. At the very least this + method should perform a deep copy if the type is mutable. (optional operation) + + the object to be cached + the owner of the cached object + a reconstructed object from the cachable representation + + + + Transform the object into its cacheable representation. At the very least this + method should perform a deep copy if the type is mutable. That may not be enough + for some implementations, however; for example, associations must be cached as + identifier values. (optional operation) + + the object to be cached + a cacheable representation of the object + + + + The SQL types for the columns mapped by this type. + + + + + The type returned by NullSafeGet() + + + + + Are objects of this type mutable? + + + + + Parse a string representation of this value, as it appears + in an XML document. + + + + + Return an SQL literal representation of the value + + + + + Return a string representation of this value, as it + should appear in an XML document + + + + + Marker interface for user types which want to perform custom + logging of their corresponding values + + + + Generate a loggable string representation of the collection (value). + The collection to be logged; guaranteed to be non-null and initialized. + The factory. + The loggable string representation. + + + + Instantiate an uninitialized instance of the collection wrapper + + + + + Wrap an instance of a collection + + + + + Return an over the elements of this collection - the passed collection + instance may or may not be a wrapper + + + + + Optional operation. Does the collection contain the entity instance? + + + + + Optional operation. Return the index of the entity in the collection. + + + + + Replace the elements of a collection with the elements of another collection + + + + + Instantiate an empty instance of the "underlying" collection (not a wrapper), + but with the given anticipated size (i.e. accounting for initial size + and perhaps load factor). + + + The anticipated size of the instantiated collection + after we are done populating it. Note, may be negative to indicate that + we not yet know anything about the anticipated size (i.e., when initializing + from a result set row by row). + + + + + A user type that may be used for a version property. + + + + + Generate an initial version. + + The session from which this request originates. May be + null; currently this only happens during startup when trying to determine + the "unsaved value" of entities. + an instance of the type + + + + Increment the version. + + The session from which this request originates. + the current version + an instance of the type + + + + Helper class that contains common array functions and + data structures used through out NHibernate. + + + + + Append all elements in the 'from' list to the 'to' list. + + + + + + + Calculate a hash code based on the length and contents of the array. + The algorithm is such that if ArrayHelper.ArrayEquals(a,b) returns true, + then ArrayGetHashCode(a) == ArrayGetHashCode(b). + + + + + + + + Computes a hash code for . + + The hash code is computed as the sum of hash codes of + individual elements, so that the value is independent of the + collection iteration order. + + + + + Creates a that uses case-insensitive string comparison + associated with invariant culture. + + + This is different from the method in + in that the latter uses the current culture and is thus vulnerable to the "Turkish I" problem. + + + + + Creates a that uses case-insensitive string comparison + associated with invariant culture. + + + This is different from the method in + in that the latter uses the current culture and is thus vulnerable to the "Turkish I" problem. + + + + + Computes a hash code for . + + The hash code is computed as the sum of hash codes of + individual elements, so that the value is independent of the + collection iteration order. + + + + + A read-only dictionary that is always empty and permits lookup by key. + + + + + A read-only dictionary that is always empty and permits lookup by key. + + + + + Utility class implementing ToString for collections. All ToString + overloads call element.ToString(). + + + To print collections of entities or typed values, use + . + + + + + + + + + Get only filters enabled for many-to-one association. + + All enabled filters + A new for filters enabled for many to one. + + + + An where keys are compared by object identity, rather than equals. + + All external users of this class need to have no knowledge of the IdentityKey - it is all + hidden by this class. + + + + Do NOT use a System.Value type as the key for this Hashtable - only classes. See + the google thread + about why using System.Value is a bad thing. + + + If I understand it correctly, the first call to get an object defined by a DateTime("2003-01-01") + would box the DateTime and return the identity key for the box. If you were to get that Key and + unbox it into a DateTime struct, then the next time you passed it in as the Key the IdentityMap + would box it again (into a different box) and it would have a different IdentityKey - so you would + not get the same value for the same DateTime value. + + + + + + Create a new instance of the IdentityMap that has no + iteration order. + + A new IdentityMap based on a Hashtable. + + + + Create a new instance of the IdentityMap that has an + iteration order of the order the objects were added + to the Map. + + A new IdentityMap based on ListDictionary. + + + + Return the Dictionary Entries (as instances of DictionaryEntry in a collection + that is safe from concurrent modification). Ie - we may safely add new instances + to the underlying IDictionary during enumeration of the Values. + + The IDictionary to get the enumeration safe list. + A Collection of DictionaryEntries + + + + Create the IdentityMap class with the correct class for the IDictionary. + Unsorted = Hashtable + Sorted = ListDictionary + + A class that implements the IDictionary for storing the objects. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Verifies that we are not using a System.ValueType as the Key in the Dictionary + + The object that will be the key. + An object that is safe to be a key. + Thrown when the obj is a System.ValueType + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Returns the Keys used in this IdentityMap + + + + + + + + + + + + + + + + Provides a snapshot VIEW in the form of a List of the contents of the IdentityMap. + You can safely iterate over this VIEW and modify the actual IdentityMap because the + VIEW is a copy of the contents, not a reference to the existing Map. + + Contains a copy (not that actual instance stored) of the DictionaryEntries in a List. + + + + + Set implementation that use reference equals instead of Equals() as its comparison mechanism. + + + + + Concatenates multiple objects implementing into one. + + + + + Creates an IEnumerable object from multiple IEnumerables. + + The IEnumerables to join together. + + + + + + + A flag to indicate if Dispose() has been called. + + + + + Finalizer that ensures the object is correctly disposed of. + + + + + Takes care of freeing the managed and unmanaged resources that + this class is responsible for. + + + + + Takes care of freeing the managed and unmanaged resources that + this class is responsible for. + + Indicates if this JoinedEnumerable is being Disposed of or Finalized. + + The command is closed and the reader is disposed. This allows other ADO.NET + related actions to occur without needing to move all the way through the + EnumerableImpl. + + + + + A map of objects whose mapping entries are sequenced based on the order in which they were + added. This data structure has fast O(1) search time, deletion time, and insertion time + + + This class is not thread safe. + This class is not a really replication of JDK LinkedHashMap{K, V}, + this class is an adaptation of SequencedHashMap with generics. + + + + + Initializes a new instance of the class that is empty, + has the default initial capacity, and uses the default equality comparer for the key type. + + + + + Initializes a new instance of the class that is empty, + has the specified initial capacity, and uses the default equality comparer for the key type. + + The initial number of elements that the can contain. + + + + Initializes a new instance of the class that is empty, has the default initial capacity, and uses the specified . + + The implementation to use when comparing keys, or null to use the default EqualityComparer for the type of the key. + + + + Initializes a new instance of the class that is empty, has the specified initial capacity, and uses the specified . + + The initial number of elements that the can contain. + The implementation to use when comparing keys, or null to use the default EqualityComparer for the type of the key. + + + + An implementation of a Map which has a maximum size and uses a Least Recently Used + algorithm to remove items from the Map when the maximum size is reached and new items are added. + + + + + A map of objects whose mapping entries are sequenced based on the order in which they were + added. This data structure has fast O(1) search time, deletion time, and insertion time + + + This class is not thread safe. + + + + + Construct an empty sentinel used to hold the head (sentinel.next) and the tail (sentinal.prev) + of the list. The sentinal has a key and value + + + + + + Sentinel used to hold the head and tail of the list of entries + + + + + Map of keys to entries + + + + + Holds the number of modifications that have occurred to the map, excluding modifications + made through a collection view's iterator. + + + + + Construct a new sequenced hash map with default initial size and load factor + + + + + Construct a new sequenced hash map with the specified initial size and default load factor + + the initial size for the hash table + + + + Construct a new sequenced hash map with the specified initial size and load factor + + the initial size for the hashtable + the load factor for the hash table + + + + Construct a new sequenced hash map with the specified initial size, hash code provider + and comparer + + the initial size for the hashtable + + + + + Creates an empty Hashtable with the default initial capacity and using the default load factor, + the specified hash code provider and the specified comparer + + + + + + Creates an empty Hashtable with the default initial capacity and using the default load factor, + the specified hash code provider and the specified comparer + + the initial size for the hashtable + the load factor for the hash table + + + + + Removes an internal entry from the linked list. THis does not remove it from the underlying + map. + + + + + + Inserts a new internal entry to the tail of the linked list. This does not add the + entry to the underlying map. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Remove the Entry identified by the Key if it exists. + + The Key to remove. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Return only the Key of the DictionaryEntry + + + + + Return only the Value of the DictionaryEntry + + + + + Return the full DictionaryEntry + + + + + Various small helper methods. + + + + + Return an identifying string representation for the object, taking + NHibernate proxies into account. The returned string will be "null", + "classname@hashcode(hash)", or "entityname#identifier". If the object + is an uninitialized NHibernate proxy, take care not to initialize it. + + + + + + + + Helper class for Reflection related code. + + + + + Determine if the specified overrides the + implementation of Equals from + + The to reflect. + if any type in the hierarchy overrides Equals(object). + + + + Determine if the specified overrides the + implementation of GetHashCode from + + The to reflect. + if any type in the hierarchy overrides GetHashCode(). + + + + Finds the for the property in the . + + The to find the property in. + The name of the Property to find. + The name of the property access strategy. + The to get the value of the Property. + + This one takes a propertyAccessor name as we might know the correct strategy by now so we avoid Exceptions which are costly + + + + + Get the NHibernate for the named property of the . + + The to find the Property in. + The name of the property/field to find in the class. + The name of the property accessor for the property. + + The NHibernate for the named property. + + + + + Get the for the named property of a type. + + The to find the property in. + The name of the property/field to find in the class. + The name of the property accessor for the property. + The for the named property. + + + + Get the for the named property of a type. + + The FullName to find the property in. + The name of the property/field to find in the class. + The name of the property accessor for the property. + The for the named property. + + + + Returns a reference to the Type. + + The name of the class or a fully qualified name. + The Type for the Class. + + + + Load a System.Type given is't name. + + The class FullName or AssemblyQualifiedName + The System.Type + + If the don't represent an + the method try to find the System.Type scanning all Assemblies of the . + + If no System.Type was found for . + + + + Load a System.Type given is't name. + + The class FullName or AssemblyQualifiedName + The System.Type or null + + If the don't represent an + the method try to find the System.Type scanning all Assemblies of the . + + + + + Returns a from an already loaded Assembly or an + Assembly that is loaded with a partial name. + + An . + if an exception should be thrown + in case of an error, otherwise. + + A object that represents the specified type, + or if the type cannot be loaded. + + + Attempts to get a reference to the type from an already loaded assembly. If the + type cannot be found then the assembly is loaded using + . + + + + + Returns the value of the static field of . + + The . + The name of the field in the . + The value contained in the field, or if the type or the field does not exist. + + + + Gets the default no arg constructor for the . + + The to find the constructor for. + + The for the no argument constructor, or if the + type is an abstract class. + + + Thrown when there is a problem calling the method GetConstructor on . + + + + + Finds the constructor that takes the parameters. + + The to find the constructor in. + The objects to use to find the appropriate constructor. + + An that can be used to create the type with + the specified parameters. + + + Thrown when no constructor with the correct signature can be found. + + + + + Determines if the is a non creatable class. + + The to check. + if the is an Abstract Class or an Interface. + + + + Unwraps the supplied + and returns the inner exception preserving the stack trace. + + + The to unwrap. + + The unwrapped exception. + + + + Try to find a method in a given type. + + The given type. + The method info. + The found method or null. + + The , in general, become from another . + + + + + Try to find a property, that can be managed by NHibernate, from a given type. + + The given . + The name of the property to find. + true if the property exists; otherwise false. + + When the user defines a field.xxxxx access strategy should be because both the property and the field exists. + NHibernate can work even when the property does not exist but in this case the user should use the appropiate accessor. + + + + + Check if a method is declared in a given . + + The method to check. + The where the method is really declared. + True if the method is an implementation of the method declared in ; false otherwise. + + + + Used to ensure a collection filtering a given IEnumerable by a certain type. + + The type used like filter. + + + + Cache following a "Most Recently Used" (MRU) algorithm for maintaining a + bounded in-memory size; the "Least Recently Used" (LRU) entry is the first + available for removal from the cache. + + + This implementation uses a bounded MRU Map to limit the in-memory size of + the cache. Thus the size of this cache never grows beyond the stated size. + + + + + Cache following a "Most Recently Used" (MRY) algorithm for maintaining a + bounded in-memory size; the "Least Recently Used" (LRU) entry is the first + available for removal from the cache. + + + This implementation uses a "soft limit" to the in-memory size of the cache, + meaning that all cache entries are kept within a completely + {@link java.lang.ref.SoftReference}-based map with the most recently utilized + entries additionally kept in a hard-reference manner to prevent those cache + entries soft references from becoming enqueued by the garbage collector. + Thus the actual size of this cache impl can actually grow beyond the stated + max size bound as long as GC is not actively seeking soft references for + enqueuement. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This allows for both CRLF and lone LF line separators. + + + + + + + + + + + + + + + + + + + + + + Just a faзade for calling string.Split() + We don't use our StringTokenizer because string.Split() is + more efficient (but it only works when we don't want to retrieve the delimiters) + + separators for the tokens of the list + the string that will be broken into tokens + + + + + Splits the String using the StringTokenizer. + + separators for the tokens of the list + the string that will be broken into tokens + true to include the separators in the tokens. + + + This is more powerful than Split because you have the option of including or + not including the separators in the tokens. + + + + + + + + + + + + + + + + + + + + Takes a fully qualified type name and returns the full name of the + Class - includes namespaces. + + + + + + + Takes a fully qualified type name (can include the assembly) and just returns + the name of the Class. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Converts a in the format of "true", "t", "false", or "f" to + a . + + The string to convert. + + The value converted to a . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Counts the unquoted instances of the character. + + + + + + + + + + + + + + + + Generate a nice alias for the given class name or collection role + name and unique integer. Subclasses do not have to use + aliases of this form. + + an alias of the form foo1_ + + + + Returns the interned string equal to if there is one, or + otherwise. + + A + A + + + + Return the index of the next line separator, starting at startIndex. If will match + the first CRLF or LF line separator. If there is no match, -1 will be returned. When + returning, newLineLength will be set to the number of characters in the matched line + separator (1 if LF was found, 2 if CRLF was found). + + + + + Check if the given index points to a line separator in the string. Both CRLF and LF + line separators are handled. When returning, newLineLength will be set to the number + of characters matched in the line separator. It will be 2 if a CRLF matched, 1 if LF + matched, and 0 if the index doesn't indicate (the start of) a line separator. + + + + + A StringTokenizer java like object + + + + + + + + + + + + + + + + + + + + + + + + + + Returns an unmodifiable view of the specified IDictionary. + This method allows modules to provide users with "read-only" access to internal dictionary. + Query operations on the returned dictionary "read through" to the specified dictionary, + and attempts to modify the returned dictionary, + whether direct or via its collection views, result in an . + + The type of keys in the dictionary. + The type of values in the dictionary. + + + + Initializes a new instance of the UnmodifiableDictionary class that contains elements wrapped + from the specified IDictionary. + + The whose elements are wrapped. + + + + Count of elements in the collection. Unreliable! + + + + + Indicates failure of an assertion: a possible bug in NHibernate + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message that describes the error. + + + + Initializes a new instance of the class. + + The message that describes the error. + + The exception that is the cause of the current exception. If the innerException parameter + is not a null reference, the current exception is raised in a catch block that handles + the inner exception. + + + + + Initializes a new instance of the class. + + + The that holds the serialized object + data about the exception being thrown. + + + The that contains contextual information about the source or destination. + + + + + Controls how the session interacts with the second-level + cache and query cache. + + + + + The session will never interact with the cache, except to invalidate + cache items when updates occur + + + + + The session will never read items from the cache, but will add items + to the cache as it reads them from the database. + + + + + The session may read items from the cache, but will not add items, + except to invalidate items when updates occur + + + + The session may read items from the cache, and add items to the cache + + + + The session will never read items from the cache, but will add items + to the cache as it reads them from the database. In this mode, the + effect of hibernate.cache.use_minimal_puts is bypassed, in + order to force a cache refresh + + + + + + + + Initializes a new instance of the class. + + + The exception that is the cause of the current exception. If the innerException parameter + is not a null reference, the current exception is raised in a catch block that handles + the inner exception. + + + + + Initializes a new instance of the class. + + The message that describes the error. + + + + Initializes a new instance of the class. + + The message that describes the error. + + The exception that is the cause of the current exception. If the innerException parameter + is not a null reference, the current exception is raised in a catch block that handles + the inner exception. + + + + + Initializes a new instance of the class + with serialized data. + + + The that holds the serialized object + data about the exception being thrown. + + + The that contains contextual information about the source or destination. + + + + + Transforms Criteria queries + + + + + Returns a clone of the original criteria, which will return the count + of rows that are returned by the original criteria query. + + + + + Returns a clone of the original criteria, which will return the count + of rows that are returned by the original criteria query. + + + + + Creates an exact clone of the criteria + + + + + + Creates an exact clone of the criteria + + + + + + Initializes a new instance of the class. + + The message that describes the error. + The name of the duplicate object + The type of the duplicate object + + + + Initializes a new instance of the class. + + The name of the duplicate object + The type of the duplicate object + + + + Initializes a new instance of the class + with serialized data. + + + The that holds the serialized object + data about the exception being thrown. + + + The that contains contextual information about the source or destination. + + + + + The type of the duplicated object + + + + + The name of the duplicated object + + + + + Allows user code to inspect and/or change property values before they are written and after they + are read from the database + + + + There might be a single instance of IInterceptor for a SessionFactory, or a new + instance might be specified for each ISession. Whichever approach is used, the interceptor + must be serializable if the ISession is to be serializable. This means that SessionFactory + -scoped interceptors should implement ReadResolve(). + + + The ISession may not be invoked from a callback (nor may a callback cause a collection or + proxy to be lazily initialized). + + + + + + Called just before an object is initialized + + + + + + + + The interceptor may change the state, which will be propagated to the persistent + object. Note that when this method is called, entity will be an empty + uninitialized instance of the class. + if the user modified the state in any way + + + + Called when an object is detected to be dirty, during a flush. + + + + + + + + + The interceptor may modify the detected currentState, which will be propagated to + both the database and the persistent object. Note that all flushes end in an actual + synchronization with the database, in which as the new currentState will be propagated + to the object, but not necessarily (immediately) to the database. It is strongly recommended + that the interceptor not modify the previousState. + + if the user modified the currentState in any way + + + + Called before an object is saved + + + + + + + + The interceptor may modify the state, which will be used for the SQL INSERT + and propagated to the persistent object + + if the user modified the state in any way + + + + Called before an object is deleted + + + + + + + + It is not recommended that the interceptor modify the state. + + + + Called before a collection is (re)created. + + + Called before a collection is deleted. + + + Called before a collection is updated. + + + + Called before a flush + + The entities + + + + Called after a flush that actually ends in execution of the SQL statements required to + synchronize in-memory state with the database. + + The entitites + + + + Called when a transient entity is passed to SaveOrUpdate. + + + The return value determines if the object is saved + + - the entity is passed to Save(), resulting in an INSERT + - the entity is passed to Update(), resulting in an UPDATE + - Hibernate uses the unsaved-value mapping to determine if the object is unsaved + + + A transient entity + Boolean or to choose default behaviour + + + + Called from Flush(). The return value determines whether the entity is updated + + + + an array of property indicies - the entity is dirty + an empty array - the entity is not dirty + - use Hibernate's default dirty-checking algorithm + + + A persistent entity + + + + + + An array of dirty property indicies or to choose default behavior + + + + Instantiate the entity class. Return to indicate that Hibernate should use the default + constructor of the class + + the name of the entity + The type of entity instance to be returned. + the identifier of the new instance + An instance of the class, or to choose default behaviour + + The identifier property of the returned instance + should be initialized with the given identifier. + + + + Get the entity name for a persistent or transient instance + an entity instance + the name of the entity + + + Get a fully loaded entity instance that is cached externally + the name of the entity + the instance identifier + a fully initialized entity + + + + Called when a NHibernate transaction is begun via the NHibernate + API. Will not be called if transactions are being controlled via some other mechanism. + + + + + Called before a transaction is committed (but not before rollback). + + + + + Called after a transaction is committed or rolled back. + + + + Called when sql string is being prepared. + sql to be prepared + original or modified sql + + + + Called when a session-scoped (and only session scoped) interceptor is attached + to a session + + + session-scoped-interceptor is an instance of the interceptor used only for one session. + The use of singleton-interceptor may cause problems in multi-thread scenario. + + + + + + Defines the representation modes available for entities. + + + + Represents a fetching strategy. + + + This is used together with the API to specify + runtime fetching strategies. + + For Hql queries, use the FETCH keyword instead. + + + + + + Default to the setting configured in the mapping file. + + + + + Fetch eagerly, using a separate select. Equivalent to + fetch="select" (and outer-join="false") + + + + + Fetch using an outer join. Equivalent to + fetch="join" (and outer-join="true") + + + + + Indicates that an expected getter or setter method could not be found on a class + + + + + Initializes a new instance of the class. + + The message that describes the error. + + + + Initializes a new instance of the class. + + The message that describes the error. + + The exception that is the cause of the current exception. If the innerException parameter + is not a null reference, the current exception is raised in a catch block that handles + the inner exception. + + + + + Initializes a new instance of the class + with serialized data. + + + The that holds the serialized object + data about the exception being thrown. + + + The that contains contextual information about the source or destination. + + + + + Represents a flushing strategy. + + + The flush process synchronizes database state with session state by detecting state + changes and executing SQL statements + + + + + Special value for unspecified flush mode (like in Java). + + + + + The ISession is never flushed unless Flush() is explicitly + called by the application. This mode is very efficient for read only + transactions + + + + + The ISession is flushed when Transaction.Commit() is called + + + + + The ISession is sometimes flushed before query execution in order to + ensure that queries never return stale state. This is the default flush mode. + + + + + The is flushed before every query. This is + almost always unnecessary and inefficient. + + + + + Provides XML marshalling for classes registered with a SessionFactory + + + + Hibernate defines a generic XML format that may be used to represent any class + (hibernate-generic.dtd). The user configures an XSLT stylesheet for marshalling + data from this generic format to an application and/or user readable format. By default, + Hibernate will use hibernate-default.xslt which maps data to a useful human- + readable format. + + + The property xml.output_stylesheet specifies a user-written stylesheet. + Hibernate will attempt to load the stylesheet from the classpath first and if not found, + will attempt to load it as a file + + + It is not intended that implementors be threadsafe + + + + + + Add an object to the output document. + + A transient or persistent instance + Databinder + + + + Add a collection of objects to the output document + + A collection of transient or persistent instance + Databinder + + + + Output the generic XML representation of the bound objects + + Generic Xml representation + + + + Output the generic XML Representation of the bound objects + to a XmlDocument + + A generic Xml tree + + + + Output the custom XML representation of the bound objects + + Custom Xml representation + + + + Output the custom XML representation of the bound objects as + an XmlDocument + + A custom Xml Tree + + + + Controls whether bound objects (and their associated objects) that are lazily instanciated + are explicityl initialized or left as they are + + True to explicitly initilize lazy objects, false to leave them in the state they are in + + + + Performs a null safe comparison using "==" instead of Object.Equals() + + First object to compare. + Second object to compare. + + true if x is the same instance as y or if both are null references; otherwise, false. + + + This is Lazy collection safe since it uses , + unlike Object.Equals() which currently causes NHibernate to load up the collection. + This behaivior of Collections is likely to change because Java's collections override Equals() and + .net's collections don't. So in .net there is no need to override Equals() and + GetHashCode() on the NHibernate Collection implementations. + + + + + Thrown if Hibernate can't instantiate an entity or component class at runtime. + + + + + Initializes a new instance of the class. + + The message that describes the error. + + The exception that is the cause of the current exception. If the innerException parameter + is not a null reference, the current exception is raised in a catch block that handles + the inner exception. + + The that NHibernate was trying to instantiate. + + + + Initializes a new instance of the class + with serialized data. + + + The that holds the serialized object + data about the exception being thrown. + + + The that contains contextual information about the source or destination. + + + + + Sets the serialization info for after + getting the info from the base Exception. + + + The that holds the serialized object + data about the exception being thrown. + + + The that contains contextual information about the source or destination. + + + + + Gets the that NHibernate was trying to instantiate. + + + + + Gets a message that describes the current . + + + The error message that explains the reason for this exception and the Type that + was trying to be instantiated. + + + + + Thrown when an invalid type is specified as a proxy for a class. + The exception is also thrown when a class is specified as lazy, + but cannot be used as a proxy for itself. + + + + + A problem occurred trying to lazily initialize a collection or proxy (for example the session + was closed) or iterate query results. + + + + + Initializes a new instance of the class. + + The name of the entity where the exception was thrown + The id of the entity where the exception was thrown + The message that describes the error. + + + + Initializes a new instance of the class. + + The message that describes the error. + + + + Initializes a new instance of the class. + + + The exception that is the cause of the current exception. If the innerException parameter + is not a null reference, the current exception is raised in a catch block that handles + the inner exception. + + + + + Initializes a new instance of the class. + + The message that describes the error. + + The exception that is the cause of the current exception. If the innerException parameter + is not a null reference, the current exception is raised in a catch block that handles + the inner exception. + + + + + Initializes a new instance of the class + with serialized data. + + + The that holds the serialized object + data about the exception being thrown. + + + The that contains contextual information about the source or destination. + + + + + Instances represent a lock mode for a row of a relational database table. + + + It is not intended that users spend much time worrying about locking since Hibernate + usually obtains exactly the right lock level automatically. Some "advanced" users may + wish to explicitly specify lock levels. + + + + + + + + + + + + + + + Is this lock mode more restrictive than the given lock mode? + + + + + + Is this lock mode less restrictive than the given lock mode? + + + + + + No lock required. + + + If an object is requested with this lock mode, a Read lock + might be obtained if necessary. + + + + + A shared lock. + + + Objects are loaded in Read mode by default + + + + + An upgrade lock. + + + Objects loaded in this lock mode are materialized using an + SQL SELECT ... FOR UPDATE + + + + + Attempt to obtain an upgrade lock, using an Oracle-style + SELECT ... FOR UPGRADE NOWAIT. + + + The semantics of this lock mode, once obtained, are the same as Upgrade + + + + + A Write lock is obtained when an object is updated or inserted. + + + This is not a valid mode for Load() or Lock(). + + + + + Similar to except that, for versioned entities, + it results in a forced version increment. + + + + + Provides access to the full range of NHibernate built-in types. + IType instances may be used to bind values to query parameters. + Also a factory for new Blobs and Clobs. + + + + + Guesses the IType of this object + + The obj. + + + + + Guesses the IType by the type + + The type. + + + + + NHibernate Ansi String type + + + + + NHibernate binary type + + + + + NHibernate binary blob type + + + + + NHibernate boolean type + + + + + NHibernate byte type + + + + + NHibernate character type + + + + + NHibernate Culture Info type + + + + + NHibernate date type + + + + + NHibernate date type + + + + + NHibernate local date type + + + + + NHibernate utc date type + + + + + NHibernate date type + + + + + NHibernate date type + + + + + NHibernate decimal type + + + + + NHibernate double type + + + + + NHibernate Currency type (System.Decimal - DbType.Currency) + + + + + NHibernate Guid type. + + + + + NHibernate System.Int16 (short in C#) type + + + + + NHibernate System.Int32 (int in C#) type + + + + + NHibernate System.Int64 (long in C#) type + + + + + NHibernate System.SByte type + + + + + NHibernate System.UInt16 (ushort in C#) type + + + + + NHibernate System.UInt32 (uint in C#) type + + + + + NHibernate System.UInt64 (ulong in C#) type + + + + + NHibernate System.Single (float in C#) Type + + + + + NHibernate String type + + + + + NHibernate string clob type + + + + + NHibernate Time type + + + + + NHibernate Ticks type + + + + + NHibernate Ticks type + + + + + NHibernate Ticks type + + + + + NHibernate Timestamp type + + + + + NHibernate TrueFalse type + + + + + NHibernate YesNo type + + + + + NHibernate class type + + + + + NHibernate class meta type for association of kind any. + + + + + + NHibernate serializable type + + + + + NHibernate System.Object type + + + + + A NHibernate persistent enum type + + + + + + + A NHibernate serializable type + + + + + + + A NHibernate serializable type + + a type mapping to a single column + the entity identifier type + + + + + A NHibernate persistent object (entity) type + + a mapped entity class + + + + A Hibernate persistent object (entity) type. + a mapped entity class + + + + A NHibernate custom type + + a class that implements UserType + + + + + Force initialization of a proxy or persistent collection. + + a persistable object, proxy, persistent collection or null + if we can't initialize the proxy at this time, eg. the Session was closed + + + + Is the proxy or persistent collection initialized? + + a persistable object, proxy, persistent collection or null + true if the argument is already initialized, or is not a proxy or collection + + + + Get the true, underlying class of a proxied persistent class. This operation + will initialize a proxy by side-effect. + + a persistable object or proxy + the true class of the instance + + + + Close an obtained from an + returned by NHibernate immediately, instead of waiting until the session is + closed or disconnected. + + + + + Close an returned by NHibernate immediately, + instead of waiting until the session is closed or disconnected. + + + + + Check if the property is initialized. If the named property does not exist + or is not persistent, this method always returns true. + + The potential proxy + the name of a persistent attribute of the object + + true if the named property of the object is not listed as uninitialized; + false if the object is an uninitialized proxy, or the named property is uninitialized + + + + + This exception is thrown when an operation would + break session-scoped identity. This occurs if the + user tries to associate two different instances of + the same class with a particular identifier, + in the scope of a single . + + + + + Initializes a new instance of the class. + + The message that describes the error. + The identifier of the object that caused the exception. + The EntityName of the object attempted to be loaded. + + + + Initializes a new instance of the class. + + The identifier of the object that caused the exception. + The EntityName of the object attempted to be loaded. + + + + Initializes a new instance of the class. + + + + + Sets the serialization info for after + getting the info from the base Exception. + + + The that holds the serialized object + data about the exception being thrown. + + + The that contains contextual information about the source or destination. + + + + + Thrown when the application calls IQuery.UniqueResult() + and the query returned more than one result. Unlike all other NHibernate + exceptions, this one is recoverable! + + + + + Initializes a new instance of the class. + + The number of items in the result. + + + + Initializes a new instance of the class + with serialized data. + + + The that holds the serialized object + data about the exception being thrown. + + + The that contains contextual information about the source or destination. + + + + + Thrown when the user tries to pass a deleted object to the ISession. + + + + + Thrown when Hibernate could not resolve an object by id, especially when + loading an association. + + + + + Initializes a new instance of the class. + + The identifier of the object that caused the exception. + The of the object attempted to be loaded. + + + + Initializes a new instance of the class. + + The message that describes the error. + The identifier of the object that caused the exception. + The of the object attempted to be loaded. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with serialized data. + + + The that holds the serialized object + data about the exception being thrown. + + + The that contains contextual information about the source or destination. + + + + + Thrown when ISession.Load() fails to select a row with + the given primary key (identifier value). This exception might not + be thrown when Load() is called, even if there was no + row on the database, because Load() returns a proxy if + possible. Applications should use ISession.Get() to test if + a row exists in the database. + + + + + Initializes a new instance of the class. + + The identifier of the object that was attempting to be loaded. + The that NHibernate was trying to find a row for in the database. + + + + Initializes a new instance of the class + with serialized data. + + + The that holds the serialized object + data about the exception being thrown. + + + The that contains contextual information about the source or destination. + + + + + Thrown when the user passes a persistent instance to a ISession method that expects a + transient instance + + + + + Initializes a new instance of the class. + + The message that describes the error. + + + + Initializes a new instance of the class + with serialized data. + + + The that holds the serialized object + data about the exception being thrown. + + + The that contains contextual information about the source or destination. + + + + + A problem occurred accessing a property of an instance of a persistent class by reflection + + + + + Initializes a new instance of the class. + + The message that describes the error. + + The exception that is the cause of the current exception. If the innerException parameter + is not a null reference, the current exception is raised in a catch block that handles + the inner exception. + + A indicating if this was a "setter" operation. + The that NHibernate was trying find the Property or Field in. + The mapped property name that was trying to be accessed. + + + + Initializes a new instance of the class + with serialized data. + + + The that holds the serialized object + data about the exception being thrown. + + + The that contains contextual information about the source or destination. + + + + + Sets the serialization info for after + getting the info from the base Exception. + + + The that holds the serialized object + data about the exception being thrown. + + + The that contains contextual information about the source or destination. + + + + + Gets the that NHibernate was trying find the Property or Field in. + + + + + Gets a message that describes the current . + + + The error message that explains the reason for this exception and + information about the mapped property and its usage. + + + + + Indicates that an expected getter or setter method could not be found on a class + + + + + Initializes a new instance of the class, + used when a property get/set accessor is missing. + + The that is missing the property + The name of the missing property + The type of the missing accessor + ("getter" or "setter") + + + + Initializes a new instance of the class, + used when a field is missing. + + The that is missing the field + The name of the missing property + + + + Initializes a new instance of the class + with serialized data. + + + The that holds the serialized object + data about the exception being thrown. + + + The that contains contextual information about the source or destination. + + + + + Initializes a new instance of the class. + + The message that describes the error. + The that NHibernate was trying to access. + The name of the Property that was being get/set. + + + + Initializes a new instance of the class + with serialized data. + + + The that holds the serialized object + data about the exception being thrown. + + + The that contains contextual information about the source or destination. + + + + + Sets the serialization info for after + getting the info from the base Exception. + + + The that holds the serialized object + data about the exception being thrown. + + + The that contains contextual information about the source or destination. + + + + + Represents a replication strategy. + + + + + + Throw an exception when a row already exists + + + + + Ignore replicated entities when a row already exists + + + + + When a row already exists, choose the latest version + + + + + Overwrite existing rows when a row already exists + + + + + Thrown when a version number check failed, indicating that the + contained stale data (when using long transactions with + versioning). + + + + + Initializes a new instance of the class. + + The EntityName that NHibernate was trying to update in the database. + The identifier of the object that is stale. + + + + Initializes a new instance of the class + with serialized data. + + + The that holds the serialized object + data about the exception being thrown. + + + The that contains contextual information about the source or destination. + + + + + Sets the serialization info for after + getting the info from the base Exception. + + + The that holds the serialized object + data about the exception being thrown. + + + The that contains contextual information about the source or destination. + + + + + Gets the EntityName that NHibernate was trying to update in the database. + + + + + Gets the identifier of the object that is stale. + + + + + Gets a message that describes the current . + + The error message that explains the reason for this exception. + + + + Indicated that a transaction could not be begun, committed, or rolled back + + + + + Initializes a new instance of the class. + + The message that describes the error. + + + + Initializes a new instance of the class. + + The message that describes the error. + + The exception that is the cause of the current exception. If the innerException parameter + is not a null reference, the current exception is raised in a catch block that handles + the inner exception. + + + + + Initializes a new instance of the class + with serialized data. + + + The that holds the serialized object + data about the exception being thrown. + + + The that contains contextual information about the source or destination. + + + + + Throw when the user passes a transient instance to a ISession method that expects + a persistent instance + + + + + Initializes a new instance of the class. + + The message that describes the error. + + + + Initializes a new instance of the class + with serialized data. + + + The that holds the serialized object + data about the exception being thrown. + + + The that contains contextual information about the source or destination. + + + + + Used when a user provided type does not match the expected one + + + + + Thrown when ISession.Load() selects a row with the given primary key (identifier value) + but the row's discriminator value specifies a different subclass from the one requested + + + + + Initializes a new instance of the class. + + The message that describes the error. + The identifier of the object that was being loaded. + The name of entity that NHibernate was told to load. + + + + Initializes a new instance of the class + with serialized data. + + + The that holds the serialized object + data about the exception being thrown. + + + The that contains contextual information about the source or destination. + + + + + Sets the serialization info for after + getting the info from the base Exception. + + + The that holds the serialized object + data about the exception being thrown. + + + The that contains contextual information about the source or destination. + + + + + Gets the identifier of the object that was being loaded. + + + + + Gets the name of entity that NHibernate was told to load. + + + + + Gets a message that describes the current . + + The error message that explains the reason for this exception. + + + diff --git a/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/nhibernate-configuration.xsd b/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/nhibernate-configuration.xsd new file mode 100644 index 00000000..db96cf37 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/nhibernate-configuration.xsd @@ -0,0 +1,228 @@ + + + + -- This schema was automatically generated by Syntext Dtd2Schema and changed for NH use -- + -- conversion tool (from file: hibernate-configuration-3.0.dtd) -- + -- Copyright (C) 2002, 2003 Syntext Inc. See http://www.syntext.com for updates. -- + + + + + + + + + + There are 3 default short-cut values + - lcg : default for .NET2.0 and higher. + - codedom : CodeDOM-based bytecode provider (mostly for .NET1.1). + - null : Disable the reflection optimization completely. + In addition you can specify the AssemblyQualifiedName of your custom bytecode-provider (implementation of IBytecodeProvider). + Note: the bytecode-provider will be effective only when specified in the app.config or web.config. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + There are 3 possible combinations of mapping attributes + 1 - resource & assembly: NHibernate will read the mapping resource from the specified assembly + 2 - file only: NHibernate will read the mapping from the file. + 3 - assembly only: NHibernate will find all the resources ending in hbm.xml from the assembly. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/nhibernate-mapping.xsd b/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/nhibernate-mapping.xsd new file mode 100644 index 00000000..396c1905 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/NHibernate.4.0.4.4000/nhibernate-mapping.xsd @@ -0,0 +1,1699 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A composite key may be modelled by a .NET class with a property for each key column. The class must be Serializable and override equals() and hashCode() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Namespace used to find not-Fully Qualified Type Names + + + + + Assembly used to find not-Fully Qualified Type Names + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + undefined|any|none|null|0|-1|... + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The concrete collection should use a generic version or an object-based version. + + + + + + + + + + + + + + Types of polymorphism + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/Oracle/Oracle.DataAccess.dll b/TBF_V2/Sources/TBF/packages/Oracle/Oracle.DataAccess.dll new file mode 100644 index 00000000..fe275c2f Binary files /dev/null and b/TBF_V2/Sources/TBF/packages/Oracle/Oracle.DataAccess.dll differ diff --git a/TBF_V2/Sources/TBF/packages/Renci.SshNet/Renci.SshNet.dll b/TBF_V2/Sources/TBF/packages/Renci.SshNet/Renci.SshNet.dll new file mode 100644 index 00000000..a00f54d8 Binary files /dev/null and b/TBF_V2/Sources/TBF/packages/Renci.SshNet/Renci.SshNet.dll differ diff --git a/TBF_V2/Sources/TBF/packages/Renci.SshNet/Renci.SshNet.xml b/TBF_V2/Sources/TBF/packages/Renci.SshNet/Renci.SshNet.xml new file mode 100644 index 00000000..80648654 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Renci.SshNet/Renci.SshNet.xml @@ -0,0 +1,18882 @@ + + + + Renci.SshNet + + + + + Generates a array of the specified length, and fills it with a + cryptographically strong random sequence of values. + + The length of the array generate. + + + + Fills an array of bytes with a cryptographically strong random sequence of values. + + The array to fill with cryptographically strong random bytes. + is null. + + The length of the byte array determines how many random bytes are produced. + + + + + Returns the Internet Protocol (IP) addresses for the specified host. + + The host name or IP address to resolve + + An array of type that holds the IP addresses for the host that + is specified by the parameter. + + is null. + An error is encountered when resolving . + + + + Returns an enumerable collection of file information that matches a search pattern. + + + The search string to match against the names of files. + + An enumerable collection of files that matches . + + is null. + is null. + The path represented by does not exist or is not valid. + + + + Returns a value indicating whether the specified can be used + to send data. + + The to check. + + true if can be written to; otherwise, false. + + + + + Reads a byte from the specified . + + The to read from. + Specifies the amount of time after which the call will time out. + + The byte read, or -1 if the socket was closed. + + The read operation timed out. + The read failed. + + + + Sends a byte using the specified . + + The to write to. + The value to send. + The write failed. + + + + Receives data from a bound into a receive buffer. + + + An array of type that is the storage location for the received data. + The position in parameter to store the received data. + The number of bytes to receive. + Specifies the amount of time after which the call will time out. + + The number of bytes received. + + + If no data is available for reading, the method will + block until data is available or the time-out value was exceeded. If the time-out value was exceeded, the + call will throw a . + If you are in non-blocking mode, and there is no data available in the in the protocol stack buffer, the + method will complete immediately and throw a . + + + + + Suspends the current thread for the specified number of milliseconds. + + The number of milliseconds for which the thread is suspended. + + + + Executes the specified action in a separate thread. + + The action to execute. + + + + Base class for all supported authentication methods + + + + + Base interface for authentication of a session using a given method. + + + + + Authenticates the specified session. + + The session to authenticate. + + The result of the authentication process. + + + + + Gets the list of allowed authentications. + + + The list of allowed authentications. + + + + + Gets the name of the authentication method. + + + The name of the authentication method. + + + + + Initializes a new instance of the class. + + The username. + is whitespace or null. + + + + Authenticates the specified session. + + The session to authenticate. + + The result of the authentication process. + + + + + Authenticates the specified session. + + The session to authenticate. + + The result of the authentication process. + + + + + Gets the name of the authentication method. + + + The name of the authentication method. + + + + + Gets connection username. + + + + + Gets list of allowed authentications. + + + + + Represents possible authentication methods results + + + + + Authentication was successful. + + + + + Authentication completed with partial success. + + + + + Authentication failed. + + + + + Serves as base class for client implementations, provides common client functionality. + + + + + Holds value indicating whether the connection info is owned by this client. + + + + + Initializes a new instance of the class. + + The connection info. + Specified whether this instance owns the connection info. + is null. + + If is true, then the + connection info will be disposed when this instance is disposed. + + + + + Initializes a new instance of the class. + + The connection info. + Specified whether this instance owns the connection info. + The factory to use for creating new services. + is null. + is null. + + If is true, then the + connection info will be disposed when this instance is disposed. + + + + + Connects client to the server. + + The client is already connected. + The method was called after the client was disposed. + Socket connection to the SSH server or proxy server could not be established, or an error occurred while resolving the hostname. + SSH session could not be established. + Authentication of SSH session failed. + Failed to establish proxy connection. + + + + Disconnects client from the server. + + The method was called after the client was disposed. + + + + Sends a keep-alive message to the server. + + + Use to configure the client to send a keep-alive at regular + intervals. + + The method was called after the client was disposed. + + + + Called when client is connecting to the server. + + + + + Called when client is connected to the server. + + + + + Called when client is disconnecting from the server. + + + + + Called when client is disconnected from the server. + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Check if the current instance is disposed. + + THe current instance is disposed. + + + + Releases unmanaged resources and performs other cleanup operations before the + is reclaimed by garbage collection. + + + + + Stops the keep-alive timer, and waits until all timer callbacks have been + executed. + + + + + Starts the keep-alive timer. + + + When is negative one (-1) milliseconds, then + the timer will not be started. + + + + + Gets the current session. + + + The current session. + + + + + Gets the factory for creating new services. + + + The factory for creating new services. + + + + + Gets the connection info. + + + The connection info. + + The method was called after the client was disposed. + + + + Gets a value indicating whether this client is connected to the server. + + + true if this client is connected; otherwise, false. + + The method was called after the client was disposed. + + + + Gets or sets the keep-alive interval. + + + The keep-alive interval. Specify negative one (-1) milliseconds to disable the + keep-alive. This is the default value. + + The method was called after the client was disposed. + + + + Occurs when an error occurred. + + + + + + + + Occurs when host key received. + + + + + + + + Represents SSH channel. + + + + + Sends a SSH_MSG_CHANNEL_DATA message with the specified payload. + + The payload to send. + + + + Sends a SSH_MSG_CHANNEL_DATA message with the specified payload. + + An array of containing the payload to send. + The zero-based offset in at which to begin taking data from. + The number of bytes of to send. + + + When the size of the data to send exceeds the maximum packet size or the remote window + size does not allow the full data to be sent, then this method will send the data in + multiple chunks and will wait for the remote window size to be adjusted when it's zero. + + + This is done to support SSH servers will a small window size that do not agressively + increase their window size. We need to take into account that there may be SSH servers + that only increase their window size when it has reached zero. + + + + + + Sends a SSH_MSG_CHANNEL_EOF message to the remote server. + + The channel is closed. + + + + Occurs when is received. + + + + + Occurs when an exception is thrown when processing channel messages. + + + + + Occurs when is received. + + + + + Occurs when is received. + + + + + Occurs when is received. + + + + + Gets the local channel number. + + + The local channel number. + + + + + Gets the maximum size of a data packet that we can receive using the channel. + + + The maximum size of a packet. + + + + This is the maximum size (in bytes) we support for the data (payload) of a + SSH_MSG_CHANNEL_DATA message we receive. + + + We currently do not enforce this limit. + + + + + + Gets the maximum size of a data packet that can be sent using the channel. + + + The maximum size of data that can be sent using a + on the current channel. + + The channel has not been opened, or the open has not yet been confirmed. + + + + Gets a value indicating whether this channel is open. + + + true if this channel is open; otherwise, false. + + + + + A "direct-tcpip" SSH channel. + + + + + Opens a channel for a locally forwarded TCP/IP port. + + The name of the remote host to forward to. + The port of the remote hosts to forward to. + The forwarded port for which the channel is opened. + The socket to receive requests from, and send responses from the remote host to. + + + + Binds the channel to the remote host. + + + + + Occurs when an exception is thrown while processing channel messages. + + + + + Gets a value indicating whether this channel is open. + + + true if this channel is open; otherwise, false. + + + + + Gets the local channel number. + + + The local channel number. + + + + + A "forwarded-tcpip" SSH channel. + + + + + Binds the channel to the specified endpoint. + + The endpoint to connect to. + The forwarded port for which the channel is opened. + + + + Occurs when an exception is thrown while processing channel messages. + + + + + Session SSH channel. + + + + + Opens the channel. + + + + + Sends the pseudo terminal request. + + The environment variable. + The columns. + The rows. + The width. + The height. + The terminal mode values. + + true if request was successful; otherwise false. + + + + + Sends the X11 forwarding request. + + if set to true the it is single connection. + The protocol. + The cookie. + The screen number. + + true if request was successful; otherwise false. + + + + + Sends the environment variable request. + + Name of the variable. + The variable value. + + true if request was successful; otherwise false. + + + + + Sends the shell request. + + + true if request was successful; otherwise false. + + + + + Sends the exec request. + + The command. + + true if request was successful; otherwise false. + + + + + Sends the exec request. + + Length of the break. + + true if request was successful; otherwise false. + + + + + Sends the subsystem request. + + The subsystem. + + true if request was successful; otherwise false. + + + + + Sends the window change request. + + The columns. + The rows. + The width. + The height. + + true if request was successful; otherwise false. + + + + + Sends the local flow request. + + if set to true [client can do]. + + true if request was successful; otherwise false. + + + + + Sends the signal request. + + Name of the signal. + + true if request was successful; otherwise false. + + + + + Sends the exit status request. + + The exit status. + + true if request was successful; otherwise false. + + + + + Sends the exit signal request. + + Name of the signal. + if set to true [core dumped]. + The error message. + The language. + + true if request was successful; otherwise false. + + + + + Sends eow@openssh.com request. + + + true if request was successful; otherwise false. + + + + + Sends keepalive@openssh.com request. + + + true if request was successful; otherwise false. + + + + + Provides additional information for asynchronous command execution + + + + + Initializes a new instance of the class. + + + + + Gets or sets the bytes received. If SFTP only file bytes are counted. + + Total bytes received. + + + + Gets or sets the bytes sent by SFTP. + + Total bytes sent. + + + + Gets a user-defined object that qualifies or contains information about an asynchronous operation. + + A user-defined object that qualifies or contains information about an asynchronous operation. + + + + Gets a that is used to wait for an asynchronous operation to complete. + + A that is used to wait for an asynchronous operation to complete. + + + + Gets a value that indicates whether the asynchronous operation completed synchronously. + + true if the asynchronous operation completed synchronously; otherwise, false. + + + + Gets a value that indicates whether the asynchronous operation has completed. + + true if the operation is complete; otherwise, false. + + + + Gets a value indicating whether was already called for this + . + + + true if was already called for this ; + otherwise, false. + + + + + Represents base class for SSH channel implementations. + + + + + Holds a value indicating whether the SSH_MSG_CHANNEL_CLOSE has been sent to the remote party. + + + true when a SSH_MSG_CHANNEL_CLOSE message has been sent to the other party; + otherwise, false. + + + + + Holds a value indicating whether a SSH_MSG_CHANNEL_CLOSE has been received from the other + party. + + + true when a SSH_MSG_CHANNEL_CLOSE message has been received from the other party; + otherwise, false. + + + + + Holds a value indicating whether the SSH_MSG_CHANNEL_EOF has been received from the other party. + + + true when a SSH_MSG_CHANNEL_EOF message has been received from the other party; + otherwise, false. + + + + + Holds a value indicating whether the SSH_MSG_CHANNEL_EOF has been sent to the remote party. + + + true when a SSH_MSG_CHANNEL_EOF message has been sent to the remote party; + otherwise, false. + + + + + Initializes a new instance. + + The session. + The local channel number. + Size of the window. + Size of the packet. + + + + Sends a SSH_MSG_CHANNEL_DATA message with the specified payload. + + The payload to send. + + + + Sends a SSH_MSG_CHANNEL_DATA message with the specified payload. + + An array of containing the payload to send. + The zero-based offset in at which to begin taking data from. + The number of bytes of to send. + + + When the size of the data to send exceeds the maximum packet size or the remote window + size does not allow the full data to be sent, then this method will send the data in + multiple chunks and will wait for the remote window size to be adjusted when it's zero. + + + This is done to support SSH servers will a small window size that do not agressively + increase their window size. We need to take into account that there may be SSH servers + that only increase their window size when it has reached zero. + + + + + + Called when channel window need to be adjust. + + The bytes to add. + + + + Called when channel data is received. + + The data. + + + + Called when channel extended data is received. + + The data. + The data type code. + + + + Called when channel has no more data to receive. + + + + + Called when channel is closed by the server. + + + + + Called when channel request received. + + Channel request information. + + + + Called when channel request was successful + + + + + Called when channel request failed. + + + + + Raises event. + + The exception. + + + + Sends a message to the server. + + The message to send. + + true if the message was sent to the server; otherwise, false. + + The size of the packet exceeds the maximum size defined by the protocol. + + This methods returns false when the attempt to send the message results in a + or a . + + + + + Sends SSH message to the server. + + The message. + + + + Sends a SSH_MSG_CHANNEL_EOF message to the remote server. + + The channel is closed. + + + + Waits for the handle to be signaled or for an error to occurs. + + The wait handle. + + + + Closes the channel, waiting for the SSH_MSG_CHANNEL_CLOSE message to be received from the server. + + + + + Called when an occurs while processing a channel message. + + The . + + This method will in turn invoke , and + raise the event. + + + + + Determines the length of data that currently can be sent in a single message. + + The length of the message that must be sent. + + The actual data length that currently can be sent. + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Releases unmanaged resources and performs other cleanup operations before the + is reclaimed by garbage collection. + + + + + Occurs when an exception is thrown when processing channel messages. + + + + + Gets the session. + + + Thhe session. + + + + + Gets the type of the channel. + + + The type of the channel. + + + + + Gets the local channel number. + + + The local channel number. + + + + + Gets the maximum size of a data packet that we can receive using the channel. + + + The maximum size of a packet. + + + + This is the maximum size (in bytes) we support for the data (payload) of a + SSH_MSG_CHANNEL_DATA message we receive. + + + We currently do not enforce this limit. + + + + + + Gets the size of the local window. + + + The size of the local window. + + + + + Gets the remote channel number. + + + The remote channel number. + + + + + Gets the maximum size of a data packet that we can send using the channel. + + + The maximum size of data that can be sent using a + on the current channel. + + The channel has not been opened, or the open has not yet been confirmed. + + + + Gets the window size of the remote server. + + + The size of the server window. + + + + + Gets a value indicating whether this channel is open. + + + true if this channel is open; otherwise, false. + + + + + Occurs when is received. + + + + + Occurs when is received. + + + + + Occurs when is received. + + + + + Occurs when is received. + + + + + Occurs when is received. + + + + + Occurs when is received. + + + + + Occurs when is received. + + + + + Gets a value indicating whether the session is connected. + + + true if the session is connected; otherwise, false. + + + + + Gets the connection info. + + The connection info. + + + + Gets the session semaphore to control number of session channels. + + The session semaphore. + + + + Implements "direct-tcpip" SSH channel. + + + + + Initializes a new instance. + + The session. + The local channel number. + Size of the window. + Size of the packet. + + + + Called when channel is opened by the server. + + The remote channel number. + Initial size of the window. + Maximum size of the packet. + + + + Send message to open a channel. + + Message to send + + + + Called when channel failed to open. + + The reason code. + The description. + The language. + + + + Unsubscribes the current from session events. + + The session. + + Does nothing when is null. + + + + + Occurs when is received. + + + + + Occurs when is received. + + + + + Initializes a new instance. + + The session. + The local channel number. + Size of the window. + Size of the packet. + + + + Occurs as the forwarded port is being stopped. + + + + + Binds channel to remote host. + + + + + Closes the socket, hereby interrupting the blocking receive in . + + + + + Shuts down the socket. + + One of the values that specifies the operation that will no longer be allowed. + + + + Closes the channel, waiting for the SSH_MSG_CHANNEL_CLOSE message to be received from the server. + + + + + Called when channel data is received. + + The data. + + + + Called when channel is opened by the server. + + The remote channel number. + Initial size of the window. + Maximum size of the packet. + + + + Called when channel has no more data to receive. + + + + + Called whenever an unhandled occurs in causing + the message loop to be interrupted, or when an exception occurred processing a channel message. + + + + + Called when the server wants to terminate the connection immmediately. + + + The sender MUST NOT send or receive any data after this message, and + the recipient MUST NOT accept any data after receiving this message. + + + + + Gets the type of the channel. + + + The type of the channel. + + + + + Implements "forwarded-tcpip" SSH channel. + + + + + Initializes a new instance. + + The session. + The local channel number. + Size of the window. + Size of the packet. + The remote channel number. + The window size of the remote party. + The maximum size of a data packet that we can send to the remote party. + + + + Initializes a new instance. + + The session. + The local channel number. + Size of the window. + Size of the packet. + The remote channel number. + The window size of the remote party. + The maximum size of a data packet that we can send to the remote party. + + + + Binds the channel to the specified endpoint. + + The endpoint to connect to. + The forwarded port for which the channel is opened. + + + + Occurs as the forwarded port is being stopped. + + + + + Shuts down the socket. + + One of the values that specifies the operation that will no longer be allowed. + + + + Closes the socket, hereby interrupting the blocking receive in . + + + + + Closes the channel waiting for the SSH_MSG_CHANNEL_CLOSE message to be received from the server. + + + + + Called when channel data is received. + + The data. + + + + Gets the type of the channel. + + + The type of the channel. + + + + + Implements Session SSH channel. + + + + + Counts failed channel open attempts + + + + + Holds a value indicating whether the session semaphore has been obtained by the current + channel. + + + 0 when the session semaphore has not been obtained or has already been released, + and 1 when the session has been obtained and still needs to be released. + + + + + Wait handle to signal when response was received to open the channel + + + + + Initializes a new instance. + + The session. + The local channel number. + Size of the window. + Size of the packet. + + + + Opens the channel. + + + + + Called when channel is opened by the server. + + The remote channel number. + Initial size of the window. + Maximum size of the packet. + + + + Called when channel failed to open. + + The reason code. + The description. + The language. + + + + Sends the pseudo terminal request. + + The environment variable. + The columns. + The rows. + The width. + The height. + The terminal mode values. + + true if request was successful; otherwise false. + + + + + Sends the X11 forwarding request. + + if set to true the it is single connection. + The protocol. + The cookie. + The screen number. + + true if request was successful; otherwise false. + + + + + Sends the environment variable request. + + Name of the variable. + The variable value. + + true if request was successful; otherwise false. + + + + + Sends the shell request. + + + true if request was successful; otherwise false. + + + + + Sends the exec request. + + The command. + + true if request was successful; otherwise false. + + + + + Sends the exec request. + + Length of the break. + + true if request was successful; otherwise false. + + + + + Sends the subsystem request. + + The subsystem. + + true if request was successful; otherwise false. + + + + + Sends the window change request. + + The columns. + The rows. + The width. + The height. + + true if request was successful; otherwise false. + + + + + Sends the local flow request. + + if set to true [client can do]. + + true if request was successful; otherwise false. + + + + + Sends the signal request. + + Name of the signal. + + true if request was successful; otherwise false. + + + + + Sends the exit status request. + + The exit status. + + true if request was successful; otherwise false. + + + + + Sends the exit signal request. + + Name of the signal. + if set to true [core dumped]. + The error message. + The language. + + true if request was successful; otherwise false. + + + + + Sends eow@openssh.com request. + + + true if request was successful; otherwise false. + + + + + Sends keepalive@openssh.com request. + + + true if request was successful; otherwise false. + + + + + Called when channel request was successful + + + + + Called when channel request failed. + + + + + Sends the channel open message. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Releases the session semaphore. + + + When the session semaphore has already been released, or was never obtained by + this instance, then this method does nothing. + + + + + Gets the type of the channel. + + + The type of the channel. + + + + + Lists channel types as defined by the protocol. + + + + + session + + + + + x11 + + + + + forwarded-tcpip + + + + + direct-tcpip + + + + + Holds information about key size and cipher to use + + + + + Initializes a new instance of the class. + + Size of the key. + The cipher. + + + + Gets the size of the key. + + + The size of the key. + + + + + Gets the cipher. + + + + + Base class to encapsulates the results of an asynchronous operation. + + + + + Initializes a new instance of the class. + + The async callback. + The state. + + + + Marks asynchronous operation as completed. + + The exception. + if set to true [completed synchronously]. + + + + Waits until the asynchronous operation completes, and then returns. + + + + + Gets or sets a value indicating whether has been called on the current + . + + + true if has been called on the current ; + otherwise, false. + + + + + Gets a user-defined object that qualifies or contains information about an asynchronous operation. + + A user-defined object that qualifies or contains information about an asynchronous operation. + + + + Gets a value that indicates whether the asynchronous operation completed synchronously. + + true if the asynchronous operation completed synchronously; otherwise, false. + + + + Gets a that is used to wait for an asynchronous operation to complete. + + A that is used to wait for an asynchronous operation to complete. + + + + Gets a value that indicates whether the asynchronous operation has completed. + + + true if the operation is complete; otherwise, false. + + + + Base class to encapsulates the results of an asynchronous operation that returns result. + + The type of the result. + + + + Initializes a new instance of the class. + + The async callback. + The state. + + + + Marks asynchronous operation as completed. + + The result. + if set to true [completed synchronously]. + + + + Waits until the asynchronous operation completes, and then returns the value generated by the asynchronous operation. + + + The invocation result. + + + + + Provides data for event. + + + + + Base class for authentication events. + + + + + Initializes a new instance of the class. + + The username. + + + + Gets the username. + + + + + Initializes a new instance of the class. + + The username. + Banner message. + Banner language. + + + + Gets banner message. + + + + + Gets banner language. + + + + + Provides data for event. + + + + + Initializes a new instance of the class. + + The username. + + + + Gets or sets the new password. + + + The new password. + + + + + Provides prompt information when is raised + + + + + Initializes a new instance of the class. + + The sequence id. + if set to true the user input should be echoed. + The request. + + + + Gets the prompt sequence id. + + + + + Gets or sets a value indicating whether the user input should be echoed as characters are typed. + + + true if the user input should be echoed as characters are typed; otherwise, false. + + + + + Gets server information request. + + + + + Gets or sets server information response. + + + The response. + + + + + Provides data for event. + + + + + Initializes a new instance of the class. + + The username. + The instruction. + The language. + The information request prompts. + + + + Gets prompt language. + + + + + Gets prompt instruction. + + + + + Gets server information request prompts. + + + + + Gets the list of authentication methods that were previously executed. + + + The list of authentication methods that were previously executed. + + + + + Gets the list of authentications methods that failed. + + + The list of authentications methods that failed. + + + + + Gets the list of supported authentication methods. + + + The list of supported authentication methods. + + + + + Represents an arbitrarily large signed integer. + + + + + Mods the inverse. + + The bi. + The modulus. + + Modulus inverted number. + + + + + Returns positive remainder that results from division with two specified values. + + The value to be divided. + The value to divide by. + + Positive remainder that results from the division. + + + + + Generates a new, random of the specified length. + + The number of bits for the new number. + A random number of the specified length. + + + + Initializes a new instance of the structure using a 32-bit signed integer value. + + A 32-bit signed integer. + + + + Initializes a new instance of the structure using an unsigned 32-bit integer value. + + An unsigned 32-bit integer value. + + + + Initializes a new instance of the structure using a 64-bit signed integer value. + + A 64-bit signed integer. + + + + Initializes a new instance of the structure with an unsigned 64-bit integer value. + + An unsigned 64-bit integer. + + + + Initializes a new instance of the structure using a double-precision floating-point value. + + A double-precision floating-point value. + + + + Initializes a new instance of the structure using a single-precision floating-point value. + + A single-precision floating-point value. + + + + Initializes a new instance of the structure using a value. + + A decimal number. + + + + Initializes a new instance of the structure using the values in a byte array. + + An array of values in little-endian order. + is null. + + + + Defines an explicit conversion of a object to a 32-bit signed integer value. + + The value to convert to a 32-bit signed integer. + + An object that contains the value of the parameter. + + + + + Defines an explicit conversion of a object to an unsigned 32-bit integer value. + + The value to convert to an unsigned 32-bit integer. + + An object that contains the value of the parameter. + + + + + Defines an explicit conversion of a object to a 16-bit signed integer value. + + The value to convert to a 16-bit signed integer. + + An object that contains the value of the parameter. + + + + + + + + + An object that contains the value of the parameter. + + + + + Defines an explicit conversion of a object to an unsigned byte value. + + The value to convert to a . + + An object that contains the value of the parameter. + + + + + Defines an explicit conversion of a object to a signed 8-bit value. + + The value to convert to a signed 8-bit value. + + An object that contains the value of the parameter. + + + + + Defines an explicit conversion of a object to a 64-bit signed integer value. + + The value to convert to a 64-bit signed integer. + + An object that contains the value of the parameter. + + + + + Defines an explicit conversion of a object to an unsigned 64-bit integer value. + + The value to convert to an unsigned 64-bit integer. + + An object that contains the value of the parameter. + + + + + Defines an explicit conversion of a object to a value. + + The value to convert to a . + + An object that contains the value of the parameter. + + + + + Defines an explicit conversion of a object to a single-precision floating-point value. + + The value to convert to a single-precision floating-point value. + + An object that contains the value of the parameter. + + + + + Defines an explicit conversion of a object to a value. + + The value to convert to a . + + An object that contains the value of the parameter. + + + + + Defines an implicit conversion of a signed 32-bit integer to a value. + + The value to convert to a . + + An object that contains the value of the parameter. + + + + + Defines an implicit conversion of a 32-bit unsigned integer to a value. + + The value to convert to a . + + An object that contains the value of the parameter. + + + + + Defines an implicit conversion of a signed 16-bit integer to a BigInteger value. + + The value to convert to a . + + An object that contains the value of the parameter. + + + + + Defines an implicit conversion of a 16-bit unsigned integer to a value. + + The value to convert to a . + + An object that contains the value of the parameter. + + + + + Defines an implicit conversion of an unsigned byte to a value. + + The value to convert to a . + + An object that contains the value of the parameter. + + + + + + + The value to convert to a . + + An object that contains the value of the parameter. + + + + + Defines an implicit conversion of a signed 64-bit integer to a value. + + The value to convert to a . + + An object that contains the value of the parameter. + + + + + Defines an implicit conversion of a 64-bit unsigned integer to a value. + + The value to convert to a . + + An object that contains the value of the parameter. + + + + + Defines an explicit conversion of a value to a value. + + The value to convert to a . + + An object that contains the value of the parameter. + + + + + Defines an explicit conversion of a object to a value. + + The value to convert to a . + + An object that contains the value of the parameter. + + + + + Defines an explicit conversion of a object to a value. + + The value to convert to a . + + An object that contains the value of the parameter. + + + + + Adds the values of two specified objects. + + The first value to add. + The second value to add. + + The sum of and . + + + + + Subtracts a value from another value. + + The value to subtract from (the minuend). + The value to subtract (the subtrahend). + + The result of subtracting from . + + + + + Multiplies two specified values. + + The first value to multiply. + The second value to multiply. + + The product of left and right. + + + + + Divides a specified value by another specified value by using + integer division. + + The value to be divided. + The value to divide by. + + The integral result of the division. + + + + + Returns the remainder that results from division with two specified values. + + The value to be divided. + The value to divide by. + + The remainder that results from the division. + + + + + Negates a specified value. + + The value to negate. + + The result of the parameter multiplied by negative one (-1). + + + + + Returns the value of the operand. + + An integer value. + + The value of the operand. + + + The sign of the operand is unchanged. + + + + + Increments a value by 1. + + The value to increment. + + The value of the parameter incremented by 1. + + + + + Decrements a value by 1. + + The value to decrement. + + The value of the parameter decremented by 1. + + + + + Performs a bitwise And operation on two values. + + The first value. + The second value. + + The result of the bitwise And operation. + + + + + Performs a bitwise Or operation on two values. + + The first value. + The second value. + + The result of the bitwise Or operation. + + + + + Performs a bitwise exclusive Or (XOr) operation on two values. + + The first value. + The second value. + + The result of the bitwise Or operation. + + + + + Returns the bitwise one's complement of a value. + + An integer value. + + The bitwise one's complement of . + + + + + Shifts a value a specified number of bits to the left. + + The value whose bits are to be shifted. + The number of bits to shift value to the left. + + A value that has been shifted to the left by the specified number of bits. + + + + + Shifts a value a specified number of bits to the right. + + The value whose bits are to be shifted. + The number of bits to shift value to the right. + + A value that has been shifted to the right by the specified number of bits. + + + + + Returns a value that indicates whether a value is less than another + value. + + The first value to compare. + The second value to compare. + + true if is less than ; otherwise, false. + + + + + Returns a value that indicates whether a value is less than a 64-bit signed integer. + + The first value to compare. + The second value to compare. + + true if left is than ; otherwise, false. + + + + + Returns a value that indicates whether a 64-bit signed integer is less than a value. + + The first value to compare. + The second value to compare. + + true if is less than ; + otherwise, false. + + + + + Returns a value that indicates whether a 64-bit signed integer is less than a value. + + The first value to compare. + The second value to compare. + + true if is less than ; otherwise, false. + + + + + Returns a value that indicates whether a 64-bit unsigned integer is less than a value. + + The first value to compare. + The second value to compare. + + true if is less than ; otherwise, false. + + + + + Returns a value that indicates whether a value is less than or equal + to another value. + + The first value to compare. + The second value to compare. + + true if is less than or equal to ; + otherwise, false. + + + + + Returns a value that indicates whether a value is less than or equal + to a 64-bit signed integer. + + The first value to compare. + The second value to compare. + + true if is less than or equal to ; + otherwise, false. + + + + + Returns a value that indicates whether a 64-bit signed integer is less than or equal to a value. + + The first value to compare. + The second value to compare. + + true if is less than or equal to ; + otherwise, false. + + + + + Returns a value that indicates whether a value is less than or equal to + a 64-bit unsigned integer. + + The first value to compare. + The second value to compare. + + true if is less than or equal to ; + otherwise, false. + + + + + Returns a value that indicates whether a 64-bit unsigned integer is less than or equal to a + value. + + The first value to compare. + The second value to compare. + + true if is less than or equal to ; + otherwise, false. + + + + + Returns a value that indicates whether a value is greater than another + value. + + The first value to compare. + The second value to compare. + + true if is greater than ; + otherwise, false. + + + + + Returns a value that indicates whether a is greater than a 64-bit signed integer value. + + The first value to compare. + The second value to compare. + + true if is greater than ; + otherwise, false. + + + + + Returns a value that indicates whether a 64-bit signed integer is greater than a value. + + The first value to compare. + The second value to compare. + + true if is greater than ; + otherwise, false. + + + + + Returns a value that indicates whether a value is greater than a 64-bit unsigned integer. + + The first value to compare. + The second value to compare. + + true if is greater than ; + otherwise, false. + + + + + Returns a value that indicates whether a 64-bit unsigned integer is greater than a value. + + The first value to compare. + The second value to compare. + + true if is greater than ; + otherwise, false. + + + + + Returns a value that indicates whether a value is greater than or equal + to another value. + + The first value to compare. + The second value to compare. + + true if is greater than ; + otherwise, false. + + + + + Returns a value that indicates whether a value is greater than or equal + to a 64-bit signed integer value. + + The first value to compare. + The second value to compare. + + true if is greater than ; + otherwise, false. + + + + + Returns a value that indicates whether a 64-bit signed integer is greater than or equal to a + value. + + The first value to compare. + The second value to compare. + + true if is greater than ; + otherwise, false. + + + + + Returns a value that indicates whether a value is greater than or equal to a + 64-bit unsigned integer value. + + The first value to compare. + The second value to compare. + + true if is greater than ; + otherwise, false. + + + + + Returns a value that indicates whether a 64-bit unsigned integer is greater than or equal to a + value. + + The first value to compare. + The second value to compare. + + true if is greater than ; + otherwise, false. + + + + + Returns a value that indicates whether the values of two objects are equal. + + The first value to compare. + The second value to compare. + + true if the and parameters have the same value; + otherwise, false. + + + + + Returns a value that indicates whether a value and a signed long integer value are equal. + + The first value to compare. + The second value to compare. + + true if the and parameters have the same value; + otherwise, false. + + + + + Returns a value that indicates whether a signed long integer value and a value are equal. + + The first value to compare. + The second value to compare. + + true if the and parameters have the same value; + otherwise, false. + + + + + Returns a value that indicates whether a value and an unsigned long integer value are equal. + + The first value to compare. + The second value to compare. + + true if the and parameters have the same value; + otherwise, false. + + + + + Returns a value that indicates whether an unsigned long integer value and a value are equal. + + The first value to compare. + The second value to compare. + + true if the and parameters have the same value; + otherwise, false. + + + + + Returns a value that indicates whether two objects have different values. + + The first value to compare. + The second value to compare. + + true if and are not equal; + otherwise, false. + + + + + Returns a value that indicates whether a value and a 64-bit signed integer are not equal. + + The first value to compare. + The second value to compare. + + true if and are not equal; + otherwise, false. + + + + + Returns a value that indicates whether a 64-bit signed integer and a value are not equal. + + The first value to compare. + The second value to compare. + + true if and are not equal; + otherwise, false. + + + + + Returns a value that indicates whether a value and a 64-bit unsigned integer are not equal. + + The first value to compare. + The second value to compare. + + true if and are not equal; + otherwise, false. + + + + + Returns a value that indicates whether a 64-bit unsigned integer and a value are not equal. + + The first value to compare. + The second value to compare. + + true if and are not equal; + otherwise, false. + + + + + Returns a value that indicates whether the current instance and a specified object have the same value. + + The object to compare. + + true if the parameter is a object or a type capable + of implicit conversion to a value, and its value is equal to the value of the + current object; otherwise, false. + + + + + Returns a value that indicates whether the current instance and a specified object + have the same value. + + The object to compare. + + true if this object and have the same value; + otherwise, false. + + + + + Returns a value that indicates whether the current instance and a signed 64-bit integer have the same value. + + The signed 64-bit integer value to compare. + + true if the signed 64-bit integer and the current instance have the same value; otherwise, false. + + + + + Converts the numeric value of the current object to its equivalent string representation. + + + The string representation of the current value. + + + + + Converts the numeric value of the current object to its equivalent string representation + by using the specified format. + + A standard or custom numeric format string. + + The string representation of the current value in the format specified by the + parameter. + + is not a valid format string. + + + + Converts the numeric value of the current object to its equivalent string representation + by using the specified culture-specific formatting information. + + An object that supplies culture-specific formatting information. + + The string representation of the current value in the format specified by the + parameter. + + + + + Converts the numeric value of the current object to its equivalent string representation + by using the specified format and culture-specific format information. + + A standard or custom numeric format string. + An object that supplies culture-specific formatting information. + + The string representation of the current value as specified by the + and parameters. + + + + + Converts the string representation of a number to its equivalent. + + A string that contains the number to convert. + + A value that is equivalent to the number specified in the parameter. + + is null. + is not in the correct format. + + + + Converts the string representation of a number in a specified style to its equivalent. + + A string that contains a number to convert. + A bitwise combination of the enumeration values that specify the permitted format of . + + A value that is equivalent to the number specified in the parameter. + + + is not a value. + -or- + includes the or flag along with another value. + + is null. + does not comply with the input pattern specified by . + + + + Converts the string representation of a number in a specified style to its equivalent. + + A string that contains a number to convert. + An object that provides culture-specific formatting information about . + + A value that is equivalent to the number specified in the parameter. + + is null. + is not in the correct format. + + + + Converts the string representation of a number in a specified style and culture-specific format to its equivalent. + + A string that contains a number to convert. + A bitwise combination of the enumeration values that specify the permitted format of . + An object that provides culture-specific formatting information about . + + A value that is equivalent to the number specified in the parameter. + + + is not a value. + -or- + includes the or flag along with another value. + + is null. + does not comply with the input pattern specified by . + + + + Tries to convert the string representation of a number to its equivalent, and + returns a value that indicates whether the conversion succeeded. + + The string representation of a number. + When this method returns, contains the equivalent to the number that is contained in value, or zero (0) if the conversion fails. The conversion fails if the parameter is null or is not of the correct format. This parameter is passed uninitialized. + + true if was converted successfully; otherwise, false. + + is null. + + + + Tries to convert the string representation of a number in a specified style and culture-specific format to its + equivalent, and returns a value that indicates whether the conversion succeeded. + + The string representation of a number. + A bitwise combination of enumeration values that indicates the style elements that can be present in . + An object that supplies culture-specific formatting information about . + When this method returns, contains the equivalent to the number that is contained in value, or if the conversion fails. The conversion fails if the parameter is null or is not of the correct format. This parameter is passed uninitialized. + + true if was converted successfully; otherwise, false. + + + is not a value. + -or- + includes the or flag along with another value. + + + + + Returns the smaller of two values. + + The first value to compare. + The second value to compare. + + The or parameter, whichever is smaller. + + + + + Returns the larger of two values. + + The first value to compare. + The second value to compare. + + The or parameter, whichever is larger. + + + + + Gets the absolute value of a object. + + A number. + + The absolute value of . + + + + + Divides one value by another, returns the result, and returns the remainder in + an output parameter. + + The value to be divided. + The value to divide by. + When this method returns, contains a value that represents the remainder from the division. This parameter is passed uninitialized. + + The quotient of the division. + + + + + Raises a value to the power of a specified value. + + The number to raise to the power. + The exponent to raise by. + + The result of raising to the power. + + + + + Performs modulus division on a number raised to the power of another number. + + The number to raise to the power. + The exponent to raise by. + The number by which to divide raised to the power. + + The remainder after dividing raised by by + . + + is negative. + + + + Finds the greatest common divisor of two values. + + The first value. + The second value. + + The greatest common divisor of and . + + + + + Returns the logarithm of a specified number in a specified base. + + A number whose logarithm is to be found. + The base of the logarithm. + + The base logarithm of value, + + The log of is out of range of the data type. + + + + Returns the natural (base e) logarithm of a specified number. + + The number whose logarithm is to be found. + + The natural (base e) logarithm of . + + The base 10 log of value is out of range of the data type. + + + + Returns the base 10 logarithm of a specified number. + + A number whose logarithm is to be found. + + The base 10 logarithm of . + + The base 10 log of value is out of range of the data type. + + + + Returns a value that indicates whether the current instance and an unsigned 64-bit integer have the same value. + + The unsigned 64-bit integer to compare. + + true if the current instance and the unsigned 64-bit integer have the same value; otherwise, false. + + + + + Returns the hash code for the current object. + + + A 32-bit signed integer hash code. + + + + + Adds two values and returns the result. + + The first value to add. + The second value to add. + + The sum of and . + + + + + Subtracts one value from another and returns the result. + + The value to subtract from (the minuend). + The value to subtract (the subtrahend). + + The result of subtracting from . + + + + + Returns the product of two values. + + The first number to multiply. + The second number to multiply. + + The product of the and parameters. + + + + + Divides one value by another and returns the result. + + The value to be divided. + The value to divide by. + + The quotient of the division. + + + + + Performs integer division on two values and returns the remainder. + + The value to be divided. + The value to divide by. + + The remainder after dividing by . + + + + + Negates a specified value. + + The value to negate. + + The result of the parameter multiplied by negative one (-1). + + + + + Compares this instance to a specified object and returns an integer that indicates whether the value of + this instance is less than, equal to, or greater than the value of the specified object. + + The object to compare. + + A signed integer that indicates the relationship of the current instance to the parameter, + as shown in the following table. + + + Value + Condition + + + Less than zero + The current instance is less than . + + + Zero + The current instance equals . + + + Greater than zero + The current instance is greater than . + + + + is not a . + + + + Compares this instance to a second and returns an integer that indicates whether the + value of this instance is less than, equal to, or greater than the value of the specified object. + + The object to compare. + + A signed integer value that indicates the relationship of this instance to , as + shown in the following table. + + + Value + Condition + + + Less than zero + The current instance is less than . + + + Zero + The current instance equals . + + + Greater than zero + The current instance is greater than . + + + + + + + Compares this instance to an unsigned 64-bit integer and returns an integer that indicates whether the value of this + instance is less than, equal to, or greater than the value of the unsigned 64-bit integer. + + The unsigned 64-bit integer to compare. + + A signed integer that indicates the relative value of this instance and , as shown + in the following table. + + + Value + Condition + + + Less than zero + The current instance is less than . + + + Zero + The current instance equals . + + + Greater than zero + The current instance is greater than . + + + + + + + Compares this instance to a signed 64-bit integer and returns an integer that indicates whether the value of this + instance is less than, equal to, or greater than the value of the signed 64-bit integer. + + The signed 64-bit integer to compare. + + A signed integer that indicates the relative value of this instance and , as shown + in the following table. + + + Value + Condition + + + Less than zero + The current instance is less than . + + + Zero + The current instance equals . + + + Greater than zero + The current instance is greater than . + + + + + + + Compares two values and returns an integer that indicates whether the first value is less than, equal to, or greater than the second value. + + The first value to compare. + The second value to compare. + + A signed integer that indicates the relative values of left and right, as shown in the following table. + + + Value + Condition + + + Less than zero + is less than . + + + Zero + equals . + + + Greater than zero + is greater than . + + + + + + + Converts a value to a byte array. + + + The value of the current object converted to an array of bytes. + + + + + Gets number of bits used by the number. + + + The number of the bit used. + + + + + Indicates whether the value of the current object is an even number. + + + true if the value of the BigInteger object is an even number; otherwise, false. + + + + + Indicates whether the value of the current object is . + + + true if the value of the object is ; + otherwise, false. + + + + + Indicates whether the value of the current object is a power of two. + + + true if the value of the object is a power of two; + otherwise, false. + + + + + Indicates whether the value of the current object is . + + + true if the value of the object is ; + otherwise, false. + + + + + Gets a number that indicates the sign (negative, positive, or zero) of the current object. + + + A number that indicates the sign of the object. + + + + + Gets a value that represents the number negative one (-1). + + + An integer whose value is negative one (-1). + + + + + Gets a value that represents the number one (1). + + + An object whose value is one (1). + + + + + Gets a value that represents the number 0 (zero). + + + An integer whose value is 0 (zero). + + + + + Provides data for event. + + + + + Base class for all channel related events. + + + + + Initializes a new instance of the class. + + The channel number. + + + + Gets the channel number. + + + + + Initializes a new instance of the class. + + Channel number. + Channel data. + + + + Gets channel data. + + + + + Provides data for events. + + + + + Initializes a new instance of the class. + + Channel number. + Channel data. + Channel data type code. + + + + Gets the data type code. + + + + + Provides data for event. + + + + + Initializes a new instance of the class. + + The remote channel number. + The initial window size. + The maximum packet size. + + + + Gets the initial size of the window. + + + The initial size of the window. + + + + + Gets the maximum size of the packet. + + + The maximum size of the packet. + + + + + Provides data for event. + + + + + Initializes a new instance of the class. + + Channel number. + Failure reason code. + Failure description. + Failure language. + + + + Gets failure reason code. + + + + + Gets failure description. + + + + + Gets failure language. + + + + + Provides data for event. + + + + + Initializes a new instance of the class. + + Request information. + + + + Gets request information. + + + + + Provides convenience methods for conversion to and from both Big Endian and Little Endian. + + + + + Converts little endian bytes into number. + + The buffer. + Converted . + + + + Converts little endian bytes into number. + + The buffer. + The buffer offset. + Converted . + + + + Converts little endian bytes into number. + + The buffer. + Converted . + + + + Converts little endian bytes into number. + + The buffer. + Converted . + + + + Populates buffer with little endian number representation. + + The number to convert. + + + + Populates buffer with little endian number representation. + + The number to convert. + The buffer. + + + + Populates buffer with little endian number representation. + + The number to convert. + + + + Populates buffer with little endian number representation. + + The number to convert. + The buffer. + + + + Populates buffer with little endian number representation. + + The number to convert. + The buffer. + The buffer offset. + + + + Populates buffer with little endian number representation. + + The number to convert. + + + + Populates buffer with little endian number representation. + + The number to convert. + The buffer. + + + + Returns the specified 64-bit unsigned integer value as an array of bytes. + + The number to convert. + An array of bytes with length 8. + + + + Converts big endian bytes into number. + + The buffer. + Converted . + + + + Converts big endian bytes into number. + + The buffer. + The buffer offset. + Converted . + + + + Converts big endian bytes into number. + + The buffer. + Converted . + + + + Converts big endian bytes into number. + + The buffer. + Converted . + + + + Gets the file name part of a given POSIX path. + + The POSIX path to get the file name for. + + The file name part of . + + + If contains no forward slash or has a trailing + forward slash, then is returned. + + + + + The exception that is thrown when a proxy connection cannot be established. + + + + + The exception that is thrown when SSH exception occurs. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + The inner. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + The inner exception. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Provides data for the HostKeyReceived event. + + + + + Initializes a new instance of the class. + + The host. + + + + Gets or sets a value indicating whether host key can be trusted. + + + true if host key can be trusted; otherwise, false. + + + + + Gets the host key. + + + + + Gets the host key name. + + + + + Gets the finger print. + + + + + Gets the length of the key in bits. + + + The length of the key in bits. + + + + + Base class for DER encoded data. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + DER encoded data. + + + + Encodes written data as DER byte array. + + DER Encoded array. + + + + Reads next mpint data type from internal buffer. + + mpint read. + + + + Reads next int data type from internal buffer. + + int read. + + + + Writes BOOLEAN data into internal buffer. + + UInt32 data to write. + + + + Writes UInt32 data into internal buffer. + + UInt32 data to write. + + + + Writes INTEGER data into internal buffer. + + BigInteger data to write. + + + + Writes OCTETSTRING data into internal buffer. + + The data. + + + + Writes OBJECTIDENTIFIER data into internal buffer. + + The identifier. + + + + Writes NULL data into internal buffer. + + + + + Writes DerData data into internal buffer. + + DerData data to write. + + + + Gets a value indicating whether end of data is reached. + + + true if end of data is reached; otherwise, false. + + + + + Provides data for the ErrorOccured events. + + + + + Initializes a new instance of the class. + + An System.Exception that represents the error that occurred. + + + + Gets the System.Exception that represents the error that occurred. + + + + + Collection of different extension method + + + + + Quotes a in a way to be suitable to be used with a shell. + + The to quote. + + A quoted . + + is null. + + + If contains a single-quote, that character is embedded + in quotation marks (eg. "'"). Sequences of single-quotes are grouped in a one + pair of quotation marks. + + + If the contains an exclamation mark (!), the C-Shell interprets + it as a meta-character for history substitution. This even works inside single-quotes + or quotation marks, unless escaped with a backslash (\). + + + References: + + + Shell Command Language + + + Unix C-Shell special characters and their uses + + + Differences Between Bourne and C Shell Quoting + + + + + + + + Determines whether the specified value is null or white space. + + The value. + + true if is null or white space; otherwise, false. + + + + + Reverses the sequence of the elements in the entire one-dimensional . + + The one-dimensional to reverse. + + The with its elements reversed. + + + + + Prints out + + The bytes. + + + + Creates an instance of the specified type using that type's default constructor. + + The type to create. + Type of the instance to create. + A reference to the newly created object. + + + + Returns a specified number of contiguous bytes from a given offset. + + The array to return a number of bytes from. + The zero-based offset in at which to begin taking bytes. + The number of bytes to take from . + + A array that contains the specified number of bytes at the specified offset + of the input array. + + is null. + + When is zero and equals the length of , + then is returned. + + + + + Returns a specified number of contiguous bytes from the start of the specified byte array. + + The array to return a number of bytes from. + The number of bytes to take from . + + A array that contains the specified number of bytes at the start of the input array. + + is null. + + When equals the length of , then + is returned. + + + + + Trims the leading zero from a byte array. + + The value. + + without leading zeros. + + + + + The exception that is thrown when there is something wrong with the server capabilities. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + The inner exception. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Describes object identifier for DER encoding + + + + + Initializes a new instance of the class. + + The identifiers. + + + + Gets the object identifier. + + + + + PipeStream is a thread-safe read/write data stream for use between two threads in a + single-producer/single-consumer type problem. + + 2006/10/13 1.0 + Update on 2008/10/9 1.1 - uses Monitor instead of Manual Reset events for more elegant synchronicity. + + Copyright (c) 2006 James Kolpack (james dot kolpack at google mail) + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT + OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + + + + Queue of bytes provides the datastructure for transmitting from an + input stream to an output stream. + + Possible more effecient ways to accomplish this. + + + + Indicates that the input stream has been flushed and that + all remaining data should be written to the output stream. + + + + + Maximum number of bytes to store in the buffer. + + + + + Setting this to true will cause Read() to block if it appears + that it will run out of data. + + + + + Indicates whether the current is disposed. + + + + + When overridden in a derived class, clears all buffers for this stream and causes any buffered data to be written to the underlying device. + + An I/O error occurs. + Methods were called after the stream was closed. + + Once flushed, any subsequent read operations no longer block until requested bytes are available. Any write operation reactivates blocking + reads. + + + + + When overridden in a derived class, sets the position within the current stream. + + + The new position within the current stream. + + A byte offset relative to the origin parameter. + A value of type indicating the reference point used to obtain the new position. + The stream does not support seeking, such as if the stream is constructed from a pipe or console output. + + + + When overridden in a derived class, sets the length of the current stream. + + The desired length of the current stream in bytes. + The stream does not support both writing and seeking, such as if the stream is constructed from a pipe or console output. + + + + When overridden in a derived class, reads a sequence of bytes from the current stream and advances the position within the stream by the number of bytes read. + + + The total number of bytes read into the buffer. This can be less than the number of bytes requested if that many bytes are not currently available, or zero if the stream is closed or end of the stream has been reached. + + The zero-based byte offset in buffer at which to begin storing the data read from the current stream. + The maximum number of bytes to be read from the current stream. + An array of bytes. When this method returns, the buffer contains the specified byte array with the values between offset and (offset + count - 1) replaced by the bytes read from the current source. + The sum of offset and count is larger than the buffer length. + Methods were called after the stream was closed. + The stream does not support reading. + is null. + An I/O error occurs. + offset or count is negative. + + + + Returns true if there are + + The count. + True if data available; otherwisefalse. + + + + When overridden in a derived class, writes a sequence of bytes to the current stream and advances the current position within this stream by the number of bytes written. + + The zero-based byte offset in buffer at which to begin copying bytes to the current stream. + The number of bytes to be written to the current stream. + An array of bytes. This method copies count bytes from buffer to the current stream. + An I/O error occurs. + The stream does not support writing. + Methods were called after the stream was closed. + is null. + The sum of offset and count is greater than the buffer length. + offset or count is negative. + + + + Releases the unmanaged resources used by the Stream and optionally releases the managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + Disposing a will interrupt blocking read and write operations. + + + + + Gets or sets the maximum number of bytes to store in the buffer. + + The length of the max buffer. + + + + Gets or sets a value indicating whether to block last read method before the buffer is empty. + When true, Read() will block until it can fill the passed in buffer and count. + When false, Read() will not block, returning all the available buffer data. + + + Setting to true will remove the possibility of ending a stream reader prematurely. + + + true if block last read method before the buffer is empty; otherwise, false. + + Methods were called after the stream was closed. + + + + When overridden in a derived class, gets a value indicating whether the current stream supports reading. + + + true if the stream supports reading; otherwise, false. + + + + + When overridden in a derived class, gets a value indicating whether the current stream supports seeking. + + + true if the stream supports seeking; otherwise, false. + + + + + When overridden in a derived class, gets a value indicating whether the current stream supports writing. + + + true if the stream supports writing; otherwise, false. + + + + + When overridden in a derived class, gets the length in bytes of the stream. + + + A long value representing the length of the stream in bytes. + + A class derived from Stream does not support seeking. + Methods were called after the stream was closed. + + + + When overridden in a derived class, gets or sets the position within the current stream. + + + The current position within the stream. + + The stream does not support seeking. + + + + Provides data for event. + + + + + Initializes a new instance of the class. + + The host. + The port. + is null. + is not within and . + + + + Gets request originator host. + + + + + Gets request originator port. + + + + + Provides data for the Downloading event. + + + + + Initializes a new instance of the class. + + The downloaded filename. + The downloaded file size. + The number of downloaded bytes so far. + + + + Gets the downloaded filename. + + + + + Gets the downloaded file size. + + + + + Gets number of downloaded bytes so far. + + + + + The exception that is thrown when SCP error occurred. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + The inner exception. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Provides data for the Uploading event. + + + + + Initializes a new instance of the class. + + The uploaded filename. + The uploaded file size. + The number of uploaded bytes so far. + + + + Gets the uploaded filename. + + + + + Gets the uploaded file size. + + + + + Gets number of uploaded bytes so far. + + + + + Light implementation of SemaphoreSlim. + + + + + Initializes a new instance of the class, specifying + the initial number of requests that can be granted concurrently. + + The initial number of requests for the semaphore that can be granted concurrently. + is a negative number. + + + + Exits the once. + + The previous count of the . + + + + Exits the a specified number of times. + + The number of times to exit the semaphore. + + The previous count of the . + + + + + Blocks the current thread until it can enter the . + + + + + Blocks the current thread until it can enter the , using a 32-bit signed + integer that specifies the timeout. + + The number of milliseconds to wait, or Infinite(-1) to wait indefinitely. + + true if the current thread successfully entered the ; otherwise, false. + + + + + Blocks the current thread until it can enter the , using a + to specify the timeout. + + A that represents the number of milliseconds to wait, or a that represents -1 milliseconds to wait indefinitely. + + true if the current thread successfully entered the ; otherwise, false. + + + + + Finalizes the current . + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Gets the current count of the . + + + + + Returns a that can be used to wait on the semaphore. + + + A that can be used to wait on the semaphore. + + + A successful wait on the does not imply a successful + wait on the itself. It should be followed by a true wait + on the semaphore. + + + + + The exception that is thrown when file or directory is not found. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + The inner exception. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + The exception that is thrown when operation permission is denied. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + The inner exception. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Provides data for Shell DataReceived event + + + + + Initializes a new instance of the class. + + The data. + + + + Initializes a new instance of the class. + + The line. + + + + Gets the data. + + + + + Gets the line data. + + + + + The exception that is thrown when authentication failed. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + The inner exception. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + The exception that is thrown when connection was terminated. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + The disconnect reason code. + + + + Initializes a new instance of the class. + + The message. + The disconnect reason code. + The inner. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Gets the disconnect reason if provided by the server or client. Otherwise None. + + + + + Base ssh data serialization type + + + + + Gets data bytes array. + + + A array representation of data structure. + + + + + Writes the current message to the specified . + + The to write the message to. + + + + Loads data from specified bytes. + + Bytes array. + is null. + + + + Loads data from the specified buffer. + + Bytes array. + The zero-based offset in at which to begin reading SSH data. + The number of bytes to load. + is null. + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Reads all data left in internal buffer at current position. + + An array of bytes containing the remaining data in the internal buffer. + + + + Reads next specified number of bytes data type from internal buffer. + + Number of bytes to read. + An array of bytes that was read from the internal buffer. + is greater than the internal buffer size. + + + + Reads next byte data type from internal buffer. + + Byte read. + + + + Reads next boolean data type from internal buffer. + + Boolean read. + + + + Reads next uint16 data type from internal buffer. + + uint16 read + + + + Reads next uint32 data type from internal buffer. + + uint32 read + + + + Reads next uint64 data type from internal buffer. + + uint64 read + + + + Reads next string data type from internal buffer using the specific encoding. + + + The read. + + + + + Reads next data type as byte array from internal buffer. + + + The bytes read. + + + + + Reads next name-list data type from internal buffer. + + + String array or read data. + + + + + Reads next extension-pair data type from internal buffer. + + Extensions pair dictionary. + + + + Writes bytes array data into internal buffer. + + Byte array data to write. + is null. + + + + Writes a sequence of bytes to the current SSH data stream and advances the current position + within this stream by the number of bytes written. + + An array of bytes. This method write bytes from buffer to the current SSH data stream. + The zero-based offset in at which to begin writing bytes to the SSH data stream. + The number of bytes to be written to the current SSH data stream. + is null. + The sum of and is greater than the buffer length. + or is negative. + + + + Writes data into internal buffer. + + data to write. + + + + Writes into internal buffer. + + data to write. + + + + Writes data into internal buffer. + + data to write. + + + + Writes data into internal buffer. + + data to write. + + + + Writes data into internal buffer using default encoding. + + data to write. + is null. + + + + Writes data into internal buffer using the specified encoding. + + data to write. + The character encoding to use. + is null. + is null. + + + + Writes data into internal buffer. + + The data to write. + is null. + + + + Writes data into internal buffer. + + An array of bytes. This method write bytes from buffer to the current SSH data stream. + The zero-based byte offset in at which to begin writing bytes to the SSH data stream. + The number of bytes to be written to the current SSH data stream. + is null. + The sum of and is greater than the buffer length. + or is negative. + + + + Writes mpint data into internal buffer. + + mpint data to write. + + + + Writes name-list data into internal buffer. + + name-list data to write. + + + + Writes extension-pair data into internal buffer. + + extension-pair data to write. + + + + Gets the underlying that is used for reading and writing SSH data. + + + The underlying that is used for reading and writing SSH data. + + + + + Gets a value indicating whether all data from the buffer has been read. + + + true if this instance is end of data; otherwise, false. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + The exception that is thrown when operation is timed out. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + The inner exception. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + The exception that is thrown when pass phrase for key file is empty or null + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + The inner exception. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Specifies the initial assignments of the opcode values that are used in the 'encoded terminal modes' valu + + + + + Indicates end of options. + + + + + Interrupt character; 255 if none. Similarly for the other characters. Not all of these characters are supported on all systems. + + + + + The quit character (sends SIGQUIT signal on POSIX systems). + + + + + Erase the character to left of the cursor. + + + + + Kill the current input line. + + + + + End-of-file character (sends EOF from the terminal). + + + + + End-of-line character in addition to carriage return and/or linefeed. + + + + + Additional end-of-line character. + + + + + Continues paused output (normally control-Q). + + + + + Pauses output (normally control-S). + + + + + Suspends the current program. + + + + + Another suspend character. + + + + + Reprints the current input line. + + + + + Erases a word left of cursor. + + + + + Enter the next character typed literally, even if it is a special character + + + + + Character to flush output. + + + + + Switch to a different shell layer. + + + + + Prints system status line (load, command, pid, etc). + + + + + Toggles the flushing of terminal output. + + + + + The ignore parity flag. The parameter SHOULD be 0 if this flag is FALSE, and 1 if it is TRUE. + + + + + Mark parity and framing errors. + + + + + Enable checking of parity errors. + + + + + Strip 8th bit off characters. + + + + + Map NL into CR on input. + + + + + Ignore CR on input. + + + + + Map CR to NL on input. + + + + + Translate uppercase characters to lowercase. + + + + + Enable output flow control. + + + + + Any char will restart after stop. + + + + + Enable input flow control. + + + + + Ring bell on input queue full. + + + + + Enable signals INTR, QUIT, [D]SUSP. + + + + + Canonicalize input lines. + + + + + Enable input and output of uppercase characters by preceding their lowercase equivalents with "\". + + + + + Enable echoing. + + + + + Visually erase chars. + + + + + Kill character discards current line. + + + + + Echo NL even if ECHO is off. + + + + + Don't flush after interrupt. + + + + + Stop background jobs from output. + + + + + Enable extensions. + + + + + Echo control characters as ^(Char). + + + + + Visual erase for line kill. + + + + + Retype pending input. + + + + + Enable output processing. + + + + + Convert lowercase to uppercase. + + + + + Map NL to CR-NL. + + + + + Translate carriage return to newline (output). + + + + + Translate newline to carriage return-newline (output). + + + + + Newline performs a carriage return (output). + + + + + 7 bit mode. + + + + + 8 bit mode. + + + + + Parity enable. + + + + + Odd parity, else even. + + + + + Specifies the input baud rate in bits per second. + + + + + Specifies the output baud rate in bits per second. + + + + + Specifies compression modes + + + + + Specifies that content should be compressed. + + + + + Specifies that content should be decompressed. + + + + + Represents base class for compression algorithm implementation + + + + + Represents the abstract base class from which all implementations of algorithms must inherit. + + + + + Gets algorithm name. + + + + + Initializes a new instance of the class. + + + + + Initializes the algorithm + + The session. + + + + Compresses the specified data. + + Data to compress. + Compressed data + + + + Compresses the specified data. + + Data to compress. + The zero-based byte offset in at which to begin reading the data to compress. + The number of bytes to be compressed. + + The compressed data. + + + + + Decompresses the specified data. + + Compressed data. + + The decompressed data. + + + + + Decompresses the specified data. + + Compressed data. + The zero-based byte offset in at which to begin reading the data to decompress. + The number of bytes to be read from the compressed data. + + The decompressed data. + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Releases unmanaged resources and performs other cleanup operations before the is reclaimed + by garbage collection. + + + + + Gets or sets a value indicating whether compression is active. + + + true if compression is active; otherwise, false. + + + + + Gets the session. + + + + + Represents "zlib" compression implementation + + + + + Initializes the algorithm + + The session. + + + + Gets algorithm name. + + + + + Represents "zlib@openssh.org" compression implementation + + + + + Initializes the algorithm + + The session. + + + + Gets algorithm name. + + + + + Implements Zlib compression algorithm. + + + + + Initializes a new instance of the class. + + The stream. + The mode. + + + + Writes the specified buffer. + + The buffer. + The offset. + The count. + + + + Represents remote connection information class. + + + This class is NOT thread-safe. Do not use the same with multiple + client instances. + + + + + Represents remote connection information. + + + + + Gets the supported channel requests for this connection. + + + The supported channel requests for this connection. + + + + + Gets the character encoding. + + + The character encoding. + + + + + Gets the number of retry attempts when session channel creation failed. + + + The number of retry attempts when session channel creation failed. + + + + + Gets or sets connection timeout. + + + The connection timeout. The default value is 30 seconds. + + + + + + + + Occurs when authentication banner is sent by the server. + + + + + Signals that an authentication banner message was received from the server. + + The session in which the banner message was received. + The banner message.{ + + + + Creates a for the credentials represented + by the current . + + + A for the credentials represented by the + current . + + + + + Gets the supported authentication methods for this connection. + + + The supported authentication methods for this connection. + + + + + Initializes a new instance of the class. + + The host. + The username. + The authentication methods. + is null. + is a zero-length string. + is null, a zero-length string or contains only whitespace characters. + is null. + No specified. + + + + Initializes a new instance of the class. + + The host. + The port. + The username. + The authentication methods. + is null. + is null, a zero-length string or contains only whitespace characters. + is not within and . + is null. + No specified. + + + + Initializes a new instance of the class. + + Connection host. + Connection port. + Connection username. + Type of the proxy. + The proxy host. + The proxy port. + The proxy username. + The proxy password. + The authentication methods. + is null. + is null, a zero-length string or contains only whitespace characters. + is not within and . + is not and is null. + is not and is not within and . + is null. + No specified. + + + + Authenticates the specified session. + + The session to be authenticated. + The factory to use for creating new services. + is null. + is null. + No suitable authentication method found to complete authentication, or permission denied. + + + + Signals that an authentication banner message was received from the server. + + The session in which the banner message was received. + The banner message.{ + + + + Gets supported key exchange algorithms for this connection. + + + + + Gets supported encryptions for this connection. + + + + + Gets supported hash algorithms for this connection. + + + + + Gets supported host key algorithms for this connection. + + + + + Gets supported authentication methods for this connection. + + + + + Gets supported compression algorithms for this connection. + + + + + Gets the supported channel requests for this connection. + + + The supported channel requests for this connection. + + + + + Gets a value indicating whether connection is authenticated. + + + true if connection is authenticated; otherwise, false. + + + + + Gets connection host. + + + + + Gets connection port. + + + The connection port. The default value is 22. + + + + + Gets connection username. + + + + + Gets proxy type. + + + The type of the proxy. + + + + + Gets proxy connection host. + + + + + Gets proxy connection port. + + + + + Gets proxy connection username. + + + + + Gets proxy connection password. + + + + + Gets or sets connection timeout. + + + The connection timeout. The default value is 30 seconds. + + + + + + + + Gets or sets the character encoding. + + + The character encoding. The default is . + + + + + Gets or sets number of retry attempts when session channel creation failed. + + + The number of retry attempts when session channel creation failed. The default + value is 10. + + + + + Gets or sets maximum number of session channels to be open simultaneously. + + + The maximum number of session channels to be open simultaneously. The default + value is 10. + + + + + Occurs when authentication banner is sent by the server. + + + + + + + + Gets the current key exchange algorithm. + + + + + Gets the current server encryption. + + + + + Gets the current client encryption. + + + + + Gets the current server hash algorithm. + + + + + Gets the current client hash algorithm. + + + + + Gets the current host key algorithm. + + + + + Gets the current server compression algorithm. + + + + + Gets the server version. + + + + + Get the client version. + + + + + Gets the current client compression algorithm. + + + + + Returns a value indicating whether has been changed to . + + The status to transition from. + + true if has been changed to ; otherwise, false. + + Cannot transition to . + + While a transition from to is not possible, this method will + return false for any such attempts. This is related to concurrency. + + + + + Returns a value indicating whether has been changed to . + + The status to transition from. + + true if has been changed to ; otherwise, false. + + Cannot transition to . + + While a transition from to is not possible, this method will + return false for any such attempts. This is related to concurrency. + + + + + Holds information about key size and cipher to use + + + + + Initializes a new instance of the class. + + Size of the key. + The hash algorithm to use for a given key. + + + + Gets the size of the key. + + + The size of the key. + + + + + Gets the cipher. + + + + + Supports port forwarding functionality. + + + + + The event occurs as the forwarded port is being stopped. + + + + + Factory for creating new services. + + + + + Creates a new with the specified . + + The to use for creating a new session. + + An for the specified . + + is null. + + + + Creates a new in a given and with + the specified operation timeout and encoding. + + The to create the in. + The number of milliseconds to wait for an operation to complete, or -1 to wait indefinitely. + The encoding. + The factory to use for creating SFTP messages. + + An . + + + + + Create a new . + + + A . + + + + + Negotiates a key exchange algorithm, and creates a for the negotiated + algorithm. + + A of the key exchange algorithms supported by the client where the key is the name of the algorithm, and the value is the type implementing this algorithm. + The names of the key exchange algorithms supported by the SSH server. + + A that was negotiated between client and server. + + is null. + is null. + No key exchange algorithm is supported by both client and server. + + + + Creates a new in a given + and with the specified operation timeout. + + The to create the in. + The number of milliseconds to wait for an operation to complete, or -1 to wait indefinitely. + + An . + + + + + Provides functionality to connect and interact with SSH server. + + + + + Connects to the server. + + Socket connection to the SSH server or proxy server could not be established, or an error occurred while resolving the hostname. + SSH session could not be established. + Authentication of SSH session failed. + Failed to establish proxy connection. + + + + Create a new SSH session channel. + + + A new SSH session channel. + + + + + Create a new channel for a locally forwarded TCP/IP port. + + + A new channel for a locally forwarded TCP/IP port. + + + + + Creates a "forwarded-tcpip" SSH channel. + + + A new "forwarded-tcpip" SSH channel. + + + + + Disconnects from the server. + + + This sends a SSH_MSG_DISCONNECT message to the server, waits for the + server to close the socket on its end and subsequently closes the client socket. + + + + + Called when client is disconnecting from the server. + + + + + Registers SSH message with the session. + + The name of the message to register with the session. + + + + Sends a message to the server. + + The message to send. + The client is not connected. + The operation timed out. + The size of the packet exceeds the maximum size defined by the protocol. + + + + Sends a message to the server. + + The message to send. + + true if the message was sent to the server; otherwise, false. + + The size of the packet exceeds the maximum size defined by the protocol. + + This methods returns false when the attempt to send the message results in a + or a . + + + + + Unregister SSH message from the session. + + The name of the message to unregister with the session. + + + + Waits for the specified handle or the exception handle for the receive thread + to signal within the connection timeout. + + The wait handle. + A received package was invalid or failed the message integrity check. + None of the handles are signaled in time and the session is not disconnecting. + A socket error was signaled while receiving messages from the server. + + When neither handles are signaled in time and the session is not closing, then the + session is disconnected. + + + + + Waits for the specified handle or the exception handle for the receive thread + to signal within the specified timeout. + + The wait handle. + The time to wait for any of the handles to become signaled. + A received package was invalid or failed the message integrity check. + None of the handles are signaled in time and the session is not disconnecting. + A socket error was signaled while receiving messages from the server. + + When neither handles are signaled in time and the session is not closing, then the + session is disconnected. + + + + + Gets or sets the connection info. + + The connection info. + + + + Gets a value indicating whether the session is connected. + + + true if the session is connected; otherwise, false. + + + + + Gets the session semaphore that controls session channels. + + + The session semaphore. + + + + + Gets a that can be used to wait for the message listener loop to complete. + + + A that can be used to wait for the message listener loop to complete, or + null when the session has not been connected. + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Occurs when session has been disconnected from the server. + + + + + Occurs when an error occurred. + + + + + Occurs when host key received. + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Occurs when message is received from the server. + + + + + Base interface for SSH subsystem implementations. + + + + + Connects the subsystem using a new SSH channel session. + + The session is already connected. + The method was called after the session was disposed. + + + + Disconnects the subsystem channel. + + + + + Waits a specified time for a given to get signaled. + + The handle to wait for. + The number of millieseconds wait for to get signaled, or -1 to wait indefinitely. + The connection was closed by the server. + The channel was closed. + The handle did not get signaled within the specified timeout. + + + + Blocks the current thread until the specified gets signaled, using a + 32-bit signed integer to specify the time interval in milliseconds. + + The handle to wait for. + To number of milliseconds to wait for to get signaled, or -1 to wait indefinitely. + + true if received a signal within the specified timeout; + otherwise, false. + + The connection was closed by the server. + The channel was closed. + + The blocking wait is also interrupted when either the established channel is closed, the current + session is disconnected or an unexpected occurred while processing a channel + or session event. + + + + + Blocks the current thread until the specified gets signaled, using a + 32-bit signed integer to specify the time interval in milliseconds. + + The first handle to wait for. + The second handle to wait for. + To number of milliseconds to wait for a to get signaled, or -1 to wait indefinitely. + + 0 if received a signal within the specified timeout and 1 + if received a signal within the specified timeout, or + if no object satisfied the wait. + + The connection was closed by the server. + The channel was closed. + + + The blocking wait is also interrupted when either the established channel is closed, the current + session is disconnected or an unexpected occurred while processing a channel + or session event. + + + When both and are signaled during the call, + then 0 is returned. + + + + + + Waits for any of the elements in the specified array to receive a signal, using a 32-bit signed + integer to specify the time interval. + + A array - constructed using - containing the objects to wait for. + To number of milliseconds to wait for a to get signaled, or -1 to wait indefinitely. + + The array index of the first non-system object that satisfied the wait. + + The connection was closed by the server. + The channel was closed. + No object satified the wait and a time interval equivalent to has passed. + + For the return value, the index of the first non-system object is considered to be zero. + + + + + Creates a array that is composed of system objects and the specified + elements. + + A array containing the objects to wait for. + + A array that is composed of system objects and the specified elements. + + + + + Creates a array that is composed of system objects and the specified + elements. + + The first to wait for. + The second to wait for. + + A array that is composed of system objects and the specified elements. + + + + + Gets or set the number of seconds to wait for an operation to complete. + + + The number of seconds to wait for an operation to complete, or -1 to wait indefinitely. + + + + + Gets a value indicating whether this session is open. + + + true if this session is open; otherwise, false. + + + + + Represents SSH_MSG_GLOBAL_REQUEST message. + + + + + Base class for all SSH protocol messages + + + + + Writes the message to the specified . + + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Process the current message for the specified . + + The for which to process the current message. + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the request. + if set to true [want reply]. + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets the name of the request. + + + The name of the request. + + + + + Gets a value indicating whether message reply should be sent.. + + + true if message reply should be sent; otherwise, false. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets the address to bind to. + + + + + Gets port number to bind to. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets the address to bind to. + + + + + Gets port number to bind to. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Gets the NetConf server capabilities. + + + The NetConf server capabilities. + + + + + Gets the NetConf client capabilities. + + + The NetConf client capabilities. + + + + + Computes a Hash-based Message Authentication Code (HMAC) by using the hash function. + + + + + Initializes a with the specified key. + + The key. + + + + Initializes a with the specified key and size of the computed hash code. + + The key. + The size, in bits, of the computed hash code. + + + + Finalizes the hash computation after the last data is processed by the cryptographic stream object. + + + The computed hash code. + + + + + Gets the size, in bits, of the computed hash code. + + + The size, in bits, of the computed hash code. + + + + + Computes a Hash-based Message Authentication Code (HMAC) by using the hash function. + + + + + Initializes a with the specified key. + + The key. + + + + Initializes a with the specified key and size of the computed hash code. + + The key. + The size, in bits, of the computed hash code. + + + + Finalizes the hash computation after the last data is processed by the cryptographic stream object. + + + The computed hash code. + + + + + Gets the size, in bits, of the computed hash code. + + + The size, in bits, of the computed hash code. + + + + + Computes a Hash-based Message Authentication Code (HMAC) by using the hash function. + + + + + Initializes a with the specified key. + + The key. + + + + Initializes a with the specified key and size of the computed hash code. + + The key. + The size, in bits, of the computed hash code. + + + + Finalizes the hash computation after the last data is processed by the cryptographic stream object. + + + The computed hash code. + + + + + Gets the size, in bits, of the computed hash code. + + + The size, in bits, of the computed hash code. + + + + + Computes a Hash-based Message Authentication Code (HMAC) by using the hash function. + + + + + Initializes a with the specified key. + + The key. + + + + Initializes a with the specified key and size of the computed hash code. + + The key. + The size, in bits, of the computed hash code. + + + + Finalizes the hash computation after the last data is processed by the cryptographic stream object. + + + The computed hash code. + + + + + Gets the size, in bits, of the computed hash code. + + + The size, in bits, of the computed hash code. + + + + + Computes a Hash-based Message Authentication Code (HMAC) by using the hash function. + + + + + Initializes a with the specified key. + + The key. + + + + Initializes a with the specified key and size of the computed hash code. + + The key. + The size, in bits, of the computed hash code. + + + + Finalizes the hash computation after the last data is processed by the cryptographic stream object. + + + The computed hash code. + + + + + Gets the size, in bits, of the computed hash code. + + + The size, in bits, of the computed hash code. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Represents a key exchange algorithm. + + + + + Starts the key exchange algorithm. + + The session. + Key exchange init message. + + + + Finishes the key exchange algorithm. + + + + + Creates the client-side cipher to use. + + + The client cipher. + + + + + Creates the server-side cipher to use. + + + The server cipher. + + + + + Creates the server-side hash algorithm to use. + + + The server hash algorithm. + + + + + Creates the client-side hash algorithm to use. + + + The client hash algorithm. + + + + + Creates the compression algorithm to use to deflate data. + + + The compression method to deflate data. + + + + + Creates the compression algorithm to use to inflate data. + + + The compression method to inflate data. + + + + + Occurs when the host key is received. + + + + + Gets the name of the algorithm. + + + The name of the algorithm. + + + + + Gets the exchange hash. + + + The exchange hash. + + + + + Base class for "diffie-hellman-group-exchange" algorithms. + + + + + Represents base class for Diffie Hellman key exchange algorithm + + + + + Represents base class for different key exchange algorithm implementations + + + + + Starts key exchange algorithm + + The session. + Key exchange init message. + + + + Finishes key exchange algorithm. + + + + + Creates the server side cipher to use. + + Server cipher. + + + + Creates the client side cipher to use. + + Client cipher. + + + + Creates the server side hash algorithm to use. + + Hash algorithm + + + + Creates the client side hash algorithm to use. + + Hash algorithm + + + + Creates the compression algorithm to use to deflate data. + + Compression method. + + + + Creates the compression algorithm to use to inflate data. + + Compression method. + + + + Determines whether the specified host key can be trusted. + + The host algorithm. + + true if the specified host can be trusted; otherwise, false. + + + + + Validates the exchange hash. + + true if exchange hash is valid; otherwise false. + + + + Calculates key exchange hash value. + + Key exchange hash. + + + + Hashes the specified data bytes. + + The hash data. + + Hashed bytes + + + + + Sends SSH message to the server + + The message. + + + + Generates the session key. + + The shared key. + The exchange hash. + The key. + The size. + + + + + Generates the session key. + + The shared key. + The exchange hash. + The p. + The session id. + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Releases unmanaged resources and performs other cleanup operations before the + is reclaimed by garbage collection. + + + + + Gets or sets the session. + + + The session. + + + + + Gets or sets key exchange shared key. + + + The shared key. + + + + + Gets the exchange hash. + + The exchange hash. + + + + Occurs when host key received. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Specifies key exchange group number. + + + + + Specifies key exchange prime number. + + + + + Specifies client payload + + + + + Specifies server payload + + + + + Specifies client exchange number. + + + + + Specifies server exchange number. + + + + + Specifies random generated number. + + + + + Specifies host key data. + + + + + Specifies signature data. + + + + + Validates the exchange hash. + + + true if exchange hash is valid; otherwise false. + + + + + Starts key exchange algorithm + + The session. + Key exchange init message. + + + + Populates the client exchange value. + + + + + Handles the server DH reply message. + + The host key. + The server exchange value. + The signature. + + + + Calculates key exchange hash value. + + + Key exchange hash. + + + + + Starts key exchange algorithm + + The session. + Key exchange init message. + + + + Finishes key exchange algorithm. + + + + + Basic factory for creating new services. + + + + + Creates a . + + + A . + + + + + Creates a new with the specified . + + The to use for creating a new session. + + An for the specified . + + is null. + + + + Creates a new in a given and with + the specified operation timeout and encoding. + + The to create the in. + The number of milliseconds to wait for an operation to complete, or -1 to wait indefinitely. + The encoding. + The factory to use for creating SFTP messages. + + An . + + + + + Create a new . + + + A . + + + + + Negotiates a key exchange algorithm, and creates a for the negotiated + algorithm. + + A of the key exchange algorithms supported by the client where key is the name of the algorithm, and value is the type implementing this algorithm. + The names of the key exchange algorithms supported by the SSH server. + + A that was negotiated between client and server. + + is null. + is null. + No key exchange algorithms are supported by both client and server. + + + + Creates a new in a given + and with the specified operation timeout. + + The to create the in. + The number of milliseconds to wait for an operation to complete, or -1 to wait indefinitely. + + An . + + + + + Changes the current working directory to the specified path. + + The new working directory. + + + + Resolves a given path into an absolute path on the server. + + The path to resolve. + + The absolute path. + + + + + Performs SSH_FXP_FSTAT request. + + The handle. + if set to true returns null instead of throwing an exception. + + File attributes + + + + + Performs SSH_FXP_STAT request. + + The path. + if set to true returns null instead of throwing an exception. + + File attributes + + + + + Performs SSH_FXP_STAT request + + The path. + The delegate that is executed when completes. + An object that contains any additional user-defined data. + + A that represents the asynchronous call. + + + + + Handles the end of an asynchronous read. + + An that represents an asynchronous call. + + The file attributes. + + is null. + + + + Performs SSH_FXP_LSTAT request. + + The path. + + File attributes + + + + + Performs SSH_FXP_LSTAT request. + + The path. + The delegate that is executed when completes. + An object that contains any additional user-defined data. + + A that represents the asynchronous call. + + + + + Handles the end of an asynchronous SSH_FXP_LSTAT request. + + An that represents an asynchronous call. + + The file attributes. + + is null. + + + + Performs SSH_FXP_MKDIR request. + + The path. + + + + Performs SSH_FXP_OPEN request + + The path. + The flags. + if set to true returns null instead of throwing an exception. + File handle. + + + + Performs SSH_FXP_OPEN request + + The path. + The flags. + The delegate that is executed when completes. + An object that contains any additional user-defined data. + + A that represents the asynchronous call. + + + + + Handles the end of an asynchronous read. + + An that represents an asynchronous call. + + A array representing a file handle. + + + If all available data has been read, the method completes + immediately and returns zero bytes. + + is null. + + + + Performs SSH_FXP_OPENDIR request + + The path. + if set to true returns null instead of throwing an exception. + File handle. + + + + Performs posix-rename@openssh.com extended request. + + The old path. + The new path. + + + + Performs SSH_FXP_READ request. + + The handle. + The offset. + The length. + data array; null if EOF + + + + Begins an asynchronous read using a SSH_FXP_READ request. + + The handle to the file to read from. + The offset in the file to start reading from. + The number of bytes to read. + The delegate that is executed when completes. + An object that contains any additional user-defined data. + + A that represents the asynchronous call. + + + + + Handles the end of an asynchronous read. + + An that represents an asynchronous call. + + A array representing the data read. + + + If all available data has been read, the method completes + immediately and returns zero bytes. + + is null. + + + + Performs SSH_FXP_READDIR request + + The handle. + + + + + Performs SSH_FXP_REALPATH request. + + The path. + The delegate that is executed when completes. + An object that contains any additional user-defined data. + + A that represents the asynchronous call. + + + + + Handles the end of an asynchronous SSH_FXP_REALPATH request. + + An that represents an asynchronous call. + + The absolute path. + + is null. + + + + Performs SSH_FXP_REMOVE request. + + The path. + + + + Performs SSH_FXP_RENAME request. + + The old path. + The new path. + + + + Performs SSH_FXP_RMDIR request. + + The path. + + + + Performs SSH_FXP_SETSTAT request. + + The path. + The attributes. + + + + Performs statvfs@openssh.com extended request. + + The path. + if set to true [null on error]. + + + + + Performs SSH_FXP_SYMLINK request. + + The linkpath. + The targetpath. + + + + Performs SSH_FXP_FSETSTAT request. + + The handle. + The attributes. + + + + Performs SSH_FXP_WRITE request. + + The handle. + The the zero-based offset (in bytes) relative to the beginning of the file that the write must start at. + The buffer holding the data to write. + the zero-based offset in at which to begin taking bytes to write. + The length (in bytes) of the data to write. + The wait event handle if needed. + The callback to invoke when the write has completed. + + + + Performs SSH_FXP_CLOSE request. + + The handle. + + + + Performs SSH_FXP_CLOSE request. + + The handle. + The delegate that is executed when completes. + An object that contains any additional user-defined data. + + A that represents the asynchronous call. + + + + + Handles the end of an asynchronous close. + + An that represents an asynchronous call. + is null. + + + + Calculates the optimal size of the buffer to read data from the channel. + + The buffer size configured on the client. + + The optimal size of the buffer to read data from the channel. + + + + + Calculates the optimal size of the buffer to write data on the channel. + + The buffer size configured on the client. + The file handle. + + The optimal size of the buffer to write data on the channel. + + + Currently, we do not take the remote window size into account. + + + + + Gets the SFTP protocol version. + + + The SFTP protocol version. + + + + + Gets the remote working directory. + + + The remote working directory. + + + + + Specialized for reading and writing data SSH data. + + + + + Initializes a new instance of the class with an expandable capacity initialized + as specified. + + The initial size of the internal array in bytes. + + + + Initializes a new non-resizable instance of the class based on the specified byte array. + + The array of unsigned bytes from which to create the current stream. + is null. + + + + Initializes a new non-resizable instance of the class based on the specified byte array. + + The array of unsigned bytes from which to create the current stream. + The zero-based offset in at which to begin reading SSH data. + The number of bytes to load. + is null. + + + + Writes an to the SSH data stream. + + data to write. + + + + Writes an to the SSH data stream. + + data to write. + + + + Writes a into the SSH data stream. + + The to write. + + + + Writes bytes array data into the SSH data stream. + + Byte array data to write. + is null. + + + + Reads a byte array from the SSH data stream. + + + The byte array read from the SSH data stream. + + + + + Writes a buffer preceded by its length into the SSH data stream. + + The data to write. + is null. + + + + Writes a buffer preceded by its length into the SSH data stream. + + An array of bytes. This method write bytes from buffer to the current SSH data stream. + The zero-based byte offset in at which to begin writing bytes to the SSH data stream. + The number of bytes to be written to the current SSH data stream. + is null. + The sum of and is greater than the buffer length. + or is negative. + + + + Writes string data to the SSH data stream using the specified encoding. + + The string data to write. + The character encoding to use. + is null. + is null. + + + + Reads a from the SSH datastream. + + + The read from the SSH data stream. + + + + + Reads the next data type from the SSH data stream. + + + The read from the SSH data stream. + + + + + Reads the next data type from the SSH data stream. + + + The read from the SSH data stream. + + + + + Reads the next data type from the SSH data stream. + + + The read from the SSH data stream. + + + + + Reads next specified number of bytes data type from internal buffer. + + Number of bytes to read. + + An array of bytes that was read from the internal buffer. + + is greater than the internal buffer size. + + + + Writes the stream contents to a byte array, regardless of the . + + + This method returns the contents of the as a byte array. + + + If the current instance was constructed on a provided byte array, a copy of the section of the array + to which this instance has access is returned. + + + + + Gets a value indicating whether all data from the SSH data stream has been read. + + + true if this instance is end of data; otherwise, false. + + + + + Provides additional information for asynchronous command execution + + + + + Initializes a new instance of the class. + + The async callback. + The state. + + + + Represents "diffie-hellman-group1-sha1" algorithm implementation. + + + + + Calculates key exchange hash value. + + + Key exchange hash. + + + + + Starts key exchange algorithm + + The session. + Key exchange init message. + + + + Finishes key exchange algorithm. + + + + + Gets the group prime. + + + The group prime. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Provides functionality to perform keyboard interactive authentication. + + + + + Initializes a new instance of the class. + + The username. + is whitespace or null. + + + + Authenticates the specified session. + + The session to authenticate. + Result of authentication process. + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Releases unmanaged resources and performs other cleanup operations before the + is reclaimed by garbage collection. + + + + + Gets authentication method name + + + + + Occurs when server prompts for more authentication information. + + + + + Provides connection information when keyboard interactive authentication method is used + + + + + + + + Initializes a new instance of the class. + + The host. + The username. + + + + Initializes a new instance of the class. + + The host. + The port. + The username. + + + + Initializes a new instance of the class. + + Connection host. + Connection port. + Connection username. + Type of the proxy. + The proxy host. + The proxy port. + + + + Initializes a new instance of the class. + + Connection host. + Connection port. + Connection username. + Type of the proxy. + The proxy host. + The proxy port. + The proxy username. + + + + Initializes a new instance of the class. + + Connection host. + Connection username. + Type of the proxy. + The proxy host. + The proxy port. + + + + Initializes a new instance of the class. + + Connection host. + Connection username. + Type of the proxy. + The proxy host. + The proxy port. + The proxy username. + + + + Initializes a new instance of the class. + + Connection host. + Connection username. + Type of the proxy. + The proxy host. + The proxy port. + The proxy username. + The proxy password. + + + + Initializes a new instance of the class. + + Connection host. + Connection port. + Connection username. + Type of the proxy. + The proxy host. + The proxy port. + The proxy username. + The proxy password. + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Releases unmanaged resources and performs other cleanup operations before the + is reclaimed by garbage collection. + + + + + Occurs when server prompts for more authentication information. + + + + + + + + Provides functionality for "none" authentication method + + + + + Initializes a new instance of the class. + + The username. + is whitespace or null. + + + + Authenticates the specified session. + + The session. + + Result of authentication process. + + is null. + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Releases unmanaged resources and performs other cleanup operations before the + is reclaimed by garbage collection. + + + + + Gets connection name + + + + + Provides functionality to perform password authentication. + + + + + Initializes a new instance of the class. + + The username. + The password. + is whitespace or null. + is null. + + + + Initializes a new instance of the class. + + The username. + The password. + is whitespace or null. + is null. + + + + Authenticates the specified session. + + The session to authenticate. + + Result of authentication process. + + is null. + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Releases unmanaged resources and performs other cleanup operations before the + is reclaimed by garbage collection. + + + + + Gets authentication method name + + + + + Occurs when user's password has expired and needs to be changed. + + + + + Specifies behavior for expected expression + + + + + Initializes a new instance of the class. + + The expect regular expression. + The action to perform. + or is null. + + + + Initializes a new instance of the class. + + The expect expression. + The action to perform. + or is null. + + + + Gets the expected regular expression. + + + + + Gets the action to perform when expected expression is found. + + + + + Provides functionality for forwarding connections from the client to destination servers via the SSH server, + also known as dynamic port forwarding. + + + + + Base class for port forwarding functionality. + + + + + Starts port forwarding. + + + + + Stops port forwarding. + + + + + Starts port forwarding. + + + + + Stops port forwarding, and waits for the specified timeout until all pending + requests are processed. + + The maximum amount of time to wait for pending requests to finish processing. + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Ensures the current instance is not disposed. + + The current instance is disposed. + + + + Raises event. + + The exception. + + + + Raises event. + + Request originator host. + Request originator port. + + + + Raises the event. + + + + + Handles session ErrorOccured event. + + The source of the event. + The instance containing the event data. + + + + Gets or sets the session. + + + The session. + + + + + The event occurs as the forwarded port is being stopped. + + + + + The event occurs as the forwarded port is being stopped. + + + + + Gets a value indicating whether port forwarding is started. + + + true if port forwarding is started; otherwise, false. + + + + + Occurs when an exception is thrown. + + + + + Occurs when a port forwarding request is received. + + + + + Initializes a new instance of the class. + + The port. + + + + Initializes a new instance of the class. + + The host. + The port. + + + + Starts local port forwarding. + + + + + Stops local port forwarding, and waits for the specified timeout until all pending + requests are processed. + + The maximum amount of time to wait for pending requests to finish processing. + + + + Ensures the current instance is not disposed. + + The current instance is disposed. + + + + Holds a value indicating whether the current instance is disposed. + + + true if the current instance is disposed; otherwise, false. + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Releases unmanaged resources and performs other cleanup operations before the + is reclaimed by garbage collection. + + + + + Initializes the . + + + + When the port is started for the first time, a is created with an initial count + of 1. + + + On subsequent (re)starts, we'll dispose the current and create a new one with + initial count of 1. + + + + + + Interrupts the listener, and unsubscribes from events. + + + + + Waits for pending channels to close. + + The maximum time to wait for the pending channels to close. + + + + Reads a null terminated string from a socket. + + The to read from. + The timeout to apply to individual reads. + + The read, or null when the socket was closed. + + + + + Gets the bound host. + + + + + Gets the bound port. + + + + + Gets a value indicating whether port forwarding is started. + + + true if port forwarding is started; otherwise, false. + + + + + Provides functionality for local port forwarding + + + + + Initializes the . + + + + When the port is started for the first time, a is created with an initial count + of 1. + + + On subsequent (re)starts, we'll dispose the current and create a new one with + initial count of 1. + + + + + + Interrupts the listener, and unsubscribes from events. + + + + + Waits for pending channels to close. + + The maximum time to wait for the pending channels to close. + + + + Initializes a new instance of the class. + + The bound port. + The host. + The port. + is greater than . + is null. + is greater than . + + + + + + + Initializes a new instance of the class. + + The bound host. + The host. + The port. + is null. + is null. + is greater than . + + + + Initializes a new instance of the class. + + The bound host. + The bound port. + The host. + The port. + is null. + is null. + is greater than . + is greater than . + + + + Starts local port forwarding. + + + + + Stops local port forwarding, and waits for the specified timeout until all pending + requests are processed. + + The maximum amount of time to wait for pending requests to finish processing. + + + + Ensures the current instance is not disposed. + + The current instance is disposed. + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Releases unmanaged resources and performs other cleanup operations before the + is reclaimed by garbage collection. + + + + + Gets the bound host. + + + + + Gets the bound port. + + + + + Gets the forwarded host. + + + + + Gets the forwarded port. + + + + + Gets a value indicating whether port forwarding is started. + + + true if port forwarding is started; otherwise, false. + + + + + Indicates that message that implement this interface is allowed during key exchange phase + + + + + Provides connection information when password authentication method is used + + + + + + + + + + Initializes a new instance of the class. + + Connection host. + Connection username. + Connection password. + + + + is null. + is invalid, or is null or contains only whitespace characters. + + + + Initializes a new instance of the class. + + Connection host. + Connection port. + Connection username. + Connection password. + is null. + is invalid, or is null or contains only whitespace characters. + is not within and . + + + + Initializes a new instance of the class. + + Connection host. + The port. + Connection username. + Connection password. + Type of the proxy. + The proxy host. + The proxy port. + + + + Initializes a new instance of the class. + + Connection host. + The port. + Connection username. + Connection password. + Type of the proxy. + The proxy host. + The proxy port. + The proxy username. + + + + Initializes a new instance of the class. + + Connection host. + Connection username. + Connection password. + Type of the proxy. + The proxy host. + The proxy port. + + + + Initializes a new instance of the class. + + Connection host. + Connection username. + Connection password. + Type of the proxy. + The proxy host. + The proxy port. + The proxy username. + + + + Initializes a new instance of the class. + + Connection host. + Connection username. + Connection password. + Type of the proxy. + The proxy host. + The proxy port. + The proxy username. + The proxy password. + + + + Initializes a new instance of the class. + + Connection host. + Connection username. + Connection password. + + + + Initializes a new instance of the class. + + Connection host. + Connection port. + Connection username. + Connection password. + is null. + is invalid, or is null or contains only whitespace characters. + is not within and . + + + + Initializes a new instance of the class. + + Connection host. + The port. + Connection username. + Connection password. + Type of the proxy. + The proxy host. + The proxy port. + + + + Initializes a new instance of the class. + + Connection host. + The port. + Connection username. + Connection password. + Type of the proxy. + The proxy host. + The proxy port. + The proxy username. + + + + Initializes a new instance of the class. + + Connection host. + Connection username. + Connection password. + Type of the proxy. + The proxy host. + The proxy port. + + + + Initializes a new instance of the class. + + Connection host. + Connection username. + Connection password. + Type of the proxy. + The proxy host. + The proxy port. + The proxy username. + + + + Initializes a new instance of the class. + + Connection host. + Connection username. + Connection password. + Type of the proxy. + The proxy host. + The proxy port. + The proxy username. + The proxy password. + + + + Initializes a new instance of the class. + + Connection host. + The port. + Connection username. + Connection password. + Type of the proxy. + The proxy host. + The proxy port. + The proxy username. + The proxy password. + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Releases unmanaged resources and performs other cleanup operations before the + is reclaimed by garbage collection. + + + + + Occurs when user's password has expired and needs to be changed. + + + + + + + + Provides functionality to perform private key authentication. + + + + + Initializes a new instance of the class. + + The username. + The key files. + is whitespace or null. + + + + Authenticates the specified session. + + The session to authenticate. + + Result of authentication process. + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Releases unmanaged resources and performs other cleanup operations before the + is reclaimed by garbage collection. + + + + + Gets authentication method name + + + + + Gets the key files used for authentication. + + + + + Provides connection information when private key authentication method is used + + + + + + + + Initializes a new instance of the class. + + Connection host. + Connection username. + Connection key files. + + + + + + + + Initializes a new instance of the class. + + Connection host. + Connection port. + Connection username. + Connection key files. + + + + Initializes a new instance of the class. + + Connection host. + The port. + Connection username. + Type of the proxy. + The proxy host. + The proxy port. + The key files. + + + + Initializes a new instance of the class. + + Connection host. + The port. + Connection username. + Type of the proxy. + The proxy host. + The proxy port. + The proxy username. + The key files. + + + + Initializes a new instance of the class. + + Connection host. + Connection username. + Type of the proxy. + The proxy host. + The proxy port. + The key files. + + + + Initializes a new instance of the class. + + Connection host. + Connection username. + Type of the proxy. + The proxy host. + The proxy port. + The proxy username. + The key files. + + + + Initializes a new instance of the class. + + Connection host. + Connection username. + Type of the proxy. + The proxy host. + The proxy port. + The proxy username. + The proxy password. + The key files. + + + + Initializes a new instance of the class. + + Connection host. + The port. + Connection username. + Type of the proxy. + The proxy host. + The proxy port. + The proxy username. + The proxy password. + The key files. + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Releases unmanaged resources and performs other cleanup operations before the + is reclaimed by garbage collection. + + + + + Gets the key files used for authentication. + + + + + Specifies the type of proxy client will use to connect to server. + + + + No proxy server. + + + A SOCKS4 proxy server. + + + A SOCKS5 proxy server. + + + A HTTP proxy server. + + + + Provides SCP client functionality. + + + + More information on the SCP protocol is available here: + https://github.com/net-ssh/net-scp/blob/master/lib/net/scp.rb + + + Known issues in OpenSSH: + + + Recursive download (-prf) does not deal well with specific UTF-8 and newline characters. + Recursive update does not support empty path for uploading to home directory. + + + + + + Provides SCP client functionality. + + + + + Initializes a new instance of the class. + + The connection info. + is null. + + + + Initializes a new instance of the class. + + Connection host. + Connection port. + Authentication username. + Authentication password. + is null. + is invalid, or is null or contains only whitespace characters. + is not within and . + + + + Initializes a new instance of the class. + + Connection host. + Authentication username. + Authentication password. + is null. + is invalid, or is null or contains only whitespace characters. + + + + Initializes a new instance of the class. + + Connection host. + Connection port. + Authentication username. + Authentication private key file(s) . + is null. + is invalid, -or- is null or contains only whitespace characters. + is not within and . + + + + Initializes a new instance of the class. + + Connection host. + Authentication username. + Authentication private key file(s) . + is null. + is invalid, -or- is null or contains only whitespace characters. + + + + Initializes a new instance of the class. + + The connection info. + Specified whether this instance owns the connection info. + is null. + + If is true, then the + connection info will be disposed when this instance is disposed. + + + + + Initializes a new instance of the class. + + The connection info. + Specified whether this instance owns the connection info. + The factory to use for creating new services. + is null. + is null. + + If is true, then the + connection info will be disposed when this instance is disposed. + + + + + Uploads the specified stream to the remote host. + + The to upload. + A relative or absolute path for the remote file. + A directory with the specified path exists on the remote host. + The secure copy execution request was rejected by the server. + + + + Downloads the specified file from the remote host to the stream. + + A relative or absolute path for the remote file. + The to download the remote file to. + is null or contains only whitespace characters. + is null. + exists on the remote host, and is not a regular file. + The secure copy execution request was rejected by the server. + + + + Sets mode, size and name of file being upload. + + The channel to perform the upload in. + A from which any feedback from the server can be read. + The size of the content to upload. + The name of the file, without path, to which the content is to be uploaded. + + + When the SCP transfer is already initiated for a file, a zero-length should + be specified for . This prevents the server from uploading the + content to a file with path <file path>/ if there's + already a directory with this path, and allows us to receive an error response. + + + + + + Uploads the content of a file. + + The channel to perform the upload in. + A from which any feedback from the server can be read. + The content to upload. + The name of the remote file, without path, to which the content is uploaded. + + is only used for raising the event. + + + + + Checks the return code. + + The output stream. + + + + Read a LF-terminated string from the . + + The to read from. + + The string without trailing LF. + + + + + Uploads the specified file to the remote host. + + The file system info. + A relative or absolute path for the remote file. + is null. + is null or empty. + A directory with the specified path exists on the remote host. + The secure copy execution request was rejected by the server. + + + + Uploads the specified directory to the remote host. + + The directory info. + A relative or absolute path for the remote directory. + fileSystemInfo + is null or empty. + exists on the remote host, and is not a directory. + The secure copy execution request was rejected by the server. + + + + Downloads the specified file from the remote host to local file. + + Remote host file name. + Local file information. + is null. + is null or empty. + exists on the remote host, and is not a regular file. + The secure copy execution request was rejected by the server. + + + + Downloads the specified directory from the remote host to local directory. + + Remote host directory name. + Local directory information. + is null or empty. + is null. + File or directory with the specified path does not exist on the remote host. + The secure copy execution request was rejected by the server. + + + + Uploads the and + of the next file or directory to upload. + + The channel to perform the upload in. + A from which any feedback from the server can be read. + The file or directory to upload. + + + + Upload the files and subdirectories in the specified directory. + + The channel to perform the upload in. + A from which any feedback from the server can be read. + The directory to upload. + + + + Sets mode and name of the directory being upload. + + + + + Gets or sets the operation timeout. + + + The timeout to wait until an operation completes. The default value is negative + one (-1) milliseconds, which indicates an infinite time-out period. + + + + + Gets or sets the size of the buffer. + + + The size of the buffer. The default buffer size is 16384 bytes. + + + + + Occurs when downloading file. + + + + + Occurs when uploading file. + + + + + Provides functionality for remote port forwarding + + + + + Initializes a new instance of the class. + + The bound host address. + The bound port. + The host address. + The port. + is null. + is null. + is greater than . + is greater than . + + + + Initializes a new instance of the class. + + The bound port. + The host. + The port. + + + + + + + Initializes a new instance of the class. + + The bound host. + The bound port. + The host. + The port. + + + + Starts remote port forwarding. + + + + + Stops remote port forwarding. + + The maximum amount of time to wait for the port to stop. + + + + Ensures the current instance is not disposed. + + The current instance is disposed. + + + + Initializes the . + + + + When the port is started for the first time, a is created with an initial count + of 1. + + + On subsequent (re)starts, we'll dispose the current and create a new one with + initial count of 1. + + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Releases unmanaged resources and performs other cleanup operations before the + is reclaimed by garbage collection. + + + + + Gets a value indicating whether port forwarding is started. + + + true if port forwarding is started; otherwise, false. + + + + + Gets the bound host. + + + + + Gets the bound host. + + + + + Gets the bound port. + + + + + Gets the forwarded host. + + + + + Gets the forwarded host. + + + + + Gets the forwarded port. + + + + + Provides data for message events. + + Message type + + + + Initializes a new instance of the class. + + The message. + is null. + + + + Gets the message. + + + + + Represents SSH_MSG_USERAUTH_BANNER message. + + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets banner message. + + + + + Gets banner language. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Represents SSH_MSG_USERAUTH_FAILURE message. + + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets or sets the allowed authentications if available. + + + The allowed authentications. + + + + + Gets failure message. + + + + + Gets a value indicating whether authentication is partially successful. + + + true if partially successful; otherwise, false. + + + + + Represents SSH_MSG_USERAUTH_INFO_REQUEST message. + + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets information request name. + + + + + Gets information request instruction. + + + + + Gets information request language. + + + + + Gets information request prompts. + + + + + Represents SSH_MSG_USERAUTH_INFO_RESPONSE message. + + + + + Initializes a new instance of the class. + + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets authentication responses. + + + + + Gets the size of the message in bytes. + + + -1 to indicate that the size of the message cannot be determined, + or is too costly to calculate. + + + + + Represents SSH_MSG_USERAUTH_PASSWD_CHANGEREQ message. + + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets password change request message as UTF-8 encoded byte array. + + + + + Gets message language as UTF-8 encoded byte array. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Represents SSH_MSG_USERAUTH_PK_OK message. + + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets the name of the public key algorithm as ASCII encoded byte array. + + + The name of the public key algorithm. + + + + + Gets the public key data. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Represents SSH_MSG_USERAUTH_REQUEST message. Server as a base message for other user authentication requests. + + + + + Returns the authentication message code for SSH_MSG_USERAUTH_REQUEST. + + + + + Initializes a new instance of the class. + + Name of the service. + Authentication username. + The name of the authentication method. + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets authentication username as UTF-8 encoded byte array. + + + + + Gets the name of the service as ASCII encoded byte array. + + + The name of the service. + + + + + Gets the name of the authentication method. + + + The name of the method. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Represents "hostbased" SSH_MSG_USERAUTH_REQUEST message. + + + + + Initializes a new instance of the class. + + Name of the service. + Authentication username. + The public key algorithm. + The public host key. + Name of the client host. + The client username. + The signature. + + + + Called when type specific data need to be saved. + + + + + Gets the public key algorithm for host key as ASCII encoded byte array. + + + + + Gets or sets the public host key and certificates for client host. + + + The public host key. + + + + + Gets or sets the name of the client host as ASCII encoded byte array. + + + The name of the client host. + + + + + Gets or sets the client username on the client host as UTF-8 encoded byte array. + + + The client username. + + + + + Gets or sets the signature. + + + The signature. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Represents "keyboard-interactive" SSH_MSG_USERAUTH_REQUEST message. + + + + + Initializes a new instance of the class. + + Name of the service. + Authentication username. + + + + Called when type specific data need to be saved. + + + + + Gets message language. + + + + + Gets authentication sub methods. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Represents "none" SSH_MSG_USERAUTH_REQUEST message. + + + + + Initializes a new instance of the class. + + Name of the service. + Authentication username. + + + + Represents "password" SSH_MSG_USERAUTH_REQUEST message. + + + + + Initializes a new instance of the class. + + Name of the service. + Authentication username. + Authentication password. + + + + Initializes a new instance of the class. + + Name of the service. + Authentication username. + Authentication password. + New authentication password. + + + + Called when type specific data need to be saved. + + + + + Gets authentication password. + + + + + Gets new authentication password. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Represents "publickey" SSH_MSG_USERAUTH_REQUEST message. + + + + + Initializes a new instance of the class. + + Name of the service. + Authentication username. + Name of private key algorithm. + Private key data. + + + + Initializes a new instance of the class. + + Name of the service. + Authentication username. + Name of private key algorithm. + Private key data. + Private key signature. + + + + Called when type specific data need to be saved. + + + + + Gets the name of the public key algorithm as ASCII encoded byte array. + + + The name of the public key algorithm. + + + + + Gets the public key data. + + + + + Gets or sets public key signature. + + + The signature. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Represents SSH_MSG_USERAUTH_SUCCESS message. + + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Represents SSH_MSG_CHANNEL_CLOSE message. + + + + + Base class for all channel specific SSH messages. + + + + + Initializes a new . + + + + + Initializes a new with the specified local channel number. + + The local channel number. + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Gets or sets the local channel number. + + + The local channel number. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The local channel number. + + + + Represents SSH_MSG_CHANNEL_DATA message. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The local channel number. + Message data. + + + + Initializes a new instance of the class. + + The local channel number. + The message data. + The zero-based byte offset in at which to begin reading or writing data from. + The number of bytes of to read or write. + + + + Loads the data. + + + + + Saves the data. + + + + + Gets or sets message data. + + + The data. + + + The actual data to read or write depends on the and . + + + + + Gets the zero-based offset in at which the data begins. + + + The zero-based offset in at which the data begins. + + + + + Gets the number of bytes of to read or write. + + + The number of bytes of to read or write. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Represents SSH_MSG_CHANNEL_EOF message. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The local channel number. + + + + Represents SSH_MSG_CHANNEL_EXTENDED_DATA message. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The local channel number. + The message data type code. + The message data. + + + + Loads the data. + + + + + Saves the data. + + + + + Gets message data type code. + + + + + Gets message data. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Represents SSH_MSG_CHANNEL_FAILURE message. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The local channel number. + + + + Represents SSH_MSG_CHANNEL_OPEN_CONFIRMATION message. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The local channel number. + Initial size of the window. + Maximum size of the packet. + The remote channel number. + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets the remote channel number. + + + + + Gets the initial size of the window. + + + The initial size of the window. + + + + + Gets the maximum size of the packet. + + + The maximum size of the packet. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Represents SSH_MSG_CHANNEL_OPEN_FAILURE message. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The local channel number. + The description. + The reason code. + + + + Initializes a new instance of the class. + + The local channel number. + The description. + The reason code. + The language (RFC3066). + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets failure reason code. + + + + + Gets description for failure. + + + + + Gets message language. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + List channel open failure reasons defined by the protocol. + + + + + SSH_OPEN_ADMINISTRATIVELY_PROHIBITED + + + + + SSH_OPEN_CONNECT_FAILED + + + + + SSH_OPEN_UNKNOWN_CHANNEL_TYPE + + + + + SSH_OPEN_RESOURCE_SHORTAGE + + + + + Base class for open channel messages + + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets the type of the channel to open. + + + The type of the channel to open. + + + + + Represents SSH_MSG_CHANNEL_OPEN message. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The channel number. + Initial size of the window. + Maximum size of the packet. + Information specific to the type of the channel to open. + is null. + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets the type of the channel as ASCII encoded byte array. + + + The type of the channel. + + + + + Gets or sets the local channel number. + + + The local channel number. + + + + + Gets the initial size of the window. + + + The initial size of the window. + + + + + Gets the maximum size of the packet. + + + The maximum size of the packet. + + + + + Gets channel specific open information. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Used to open "direct-tcpip" channel type + + + + + Specifies channel open type + + + + + Initializes a new instance of the class from the + specified data. + + is null. + + + + Initializes a new instance of the class. + + The host to connect. + The port to connect. + The originator address. + The originator port. + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets the type of the channel to open. + + + The type of the channel to open. + + + + + Gets the host to connect. + + + + + Gets the port to connect. + + + + + Gets the originator address. + + + + + Gets the originator port. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Used to open "forwarded-tcpip" channel type + + + + + Specifies channel open type + + + + + Initializes a new instance of the class from the + specified data. + + is null. + + + + Initializes a new instance with the specified connector + address and port, and originator address and port. + + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets the type of the channel to open. + + + The type of the channel to open. + + + + + Gets the connected address. + + + + + Gets the connected port. + + + + + Gets the originator address. + + + + + Gets the originator port. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Used to open "session" channel type + + + + + Specifies channel open type + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from the + specified data. + + is null. + + + + Gets the type of the channel to open. + + + The type of the channel to open. + + + + + Used to open "x11" channel type + + + + + Specifies channel open type + + + + + Initializes a new instance of the class from the + specified data. + + is null. + + + + Initializes a new instance of the class with the + specified originator address and port. + + The originator address. + The originator port. + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets the type of the channel to open. + + + The type of the channel to open. + + + + + Gets the originator address. + + + + + Gets the originator port. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Represents "break" type channel request information + + + + + Represents type specific information for channel request. + + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets the name of the request. + + + The name of the request. + + + + + Gets or sets a value indicating whether reply message is needed. + + + true if reply message is needed; otherwise, false. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Channel request name + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Length of the break. + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets the name of the request. + + + The name of the request. + + + + + Gets break length in milliseconds. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Represents SSH_MSG_CHANNEL_REQUEST message. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The local channel number. + The info. + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets the name of the request. + + + The name of the request. + + + + + Gets channel request data. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Represents "eow@openssh.com" type channel request information + + + + + Channel request name + + + + + Initializes a new instance of the class. + + + + + Gets the name of the request. + + + The name of the request. + + + + + Represents "env" type channel request information + + + + + Channel request name + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the variable. + The variable value. + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets the name of the request. + + + The name of the request. + + + + + Gets or sets the name of the variable. + + + The name of the variable. + + + + + Gets or sets the variable value. + + + The variable value. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Represents "exec" type channel request information + + + + + Channel request name + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The command. + The character encoding to use. + or is null. + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets the name of the request. + + + The name of the request. + + + + + Gets command to execute. + + + The command. + + + + + Gets the encoding. + + + The encoding. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Represents "exit-signal" type channel request information + + + + + Channel request name + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the signal. + if set to true then core is dumped. + The error message. + The language. + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets the name of the request. + + + The name of the request. + + + + + Gets the name of the signal. + + + The name of the signal. + + + + + Gets a value indicating whether core is dumped. + + + true if core is dumped; otherwise, false. + + + + + Gets the error message. + + + + + Gets message language. + + + + + Represents "exit-status" type channel request information + + + + + Channel request name. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The exit status number. + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets the name of the request. + + + The name of the request. + + + + + Gets the exit status number. + + + + + Represents "keepalive@openssh.com" type channel request information + + + + + Channel request name + + + + + Initializes a new instance of the class. + + + + + Gets the name of the request. + + + The name of the request. + + + + + Represents "pty-req" type channel request information + + + + + Channel request name + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The TERM environment variable which a identifier for the text window’s capabilities. + The terminal width in columns. + The terminal width in rows. + The terminal height in pixels. + The terminal height in pixels. + The terminal mode values. + + + The TERM environment variable contains an identifier for the text window's capabilities. + You can get a detailed list of these cababilities by using the ‘infocmp’ command. + + + The column/row dimensions override the pixel dimensions(when nonzero). Pixel dimensions refer + to the drawable area of the window. + + + + + + Called when type specific data need to be saved. + + + + + Gets the name of the request. + + + The name of the request. + + + + + Gets or sets the value of the TERM environment variable (e.g., vt100). + + + The value of the TERM environment variable. + + + + + Gets or sets the terminal width in columns (e.g., 80). + + + The terminal width in columns. + + + + + Gets or sets the terminal width in rows (e.g., 24). + + + The terminal width in rows. + + + + + Gets or sets the terminal width in pixels (e.g., 640). + + + The terminal width in pixels. + + + + + Gets or sets the terminal height in pixels (e.g., 480). + + + The terminal height in pixels. + + + + + Gets or sets the terminal mode. + + + The terminal mode. + + + + + Gets the size of the message in bytes. + + + -1 to indicate that the size of the message cannot be determined, + or is too costly to calculate. + + + + + Represents "shell" type channel request information + + + + + Channel request name + + + + + Initializes a new instance of the class. + + + + + Gets the name of the request. + + + The name of the request. + + + + + Represents "signal" type channel request information + + + + + Channel request name. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the signal. + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets the name of the request. + + + The name of the request. + + + + + Gets the name of the signal. + + + The name of the signal. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Represents "subsystem" type channel request information + + + + + Channel request name + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The subsystem. + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets the name of the request. + + + The name of the request. + + + + + Gets the name of the subsystem. + + + The name of the subsystem. + + + + + Represents "window-change" type channel request information + + + + + Channe request name + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The columns. + The rows. + The width. + The height. + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets the name of the request. + + + The name of the request. + + + + + Gets the columns. + + + + + Gets the rows. + + + + + Gets the width. + + + + + Gets the height. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Represents "x11-req" type channel request information + + + + + Channel request name + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + if set to true it is a single connection. + The protocol. + The cookie. + The screen number. + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets the name of the request. + + + The name of the request. + + + + + Gets or sets a value indicating whether it is a single connection. + + + true if it is a single connection; otherwise, false. + + + + + Gets or sets the authentication protocol. + + + The authentication protocol. + + + + + Gets or sets the authentication cookie. + + + The authentication cookie. + + + + + Gets or sets the screen number. + + + The screen number. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Represents "xon-xoff" type channel request information + + + + + Channel request type + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + if set to true [client can do]. + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets the name of the request. + + + The name of the request. + + + + + Gets or sets a value indicating whether client can do. + + + true if client can do; otherwise, false. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Represents SSH_MSG_CHANNEL_SUCCESS message. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The local channel number. + + + + Represents SSH_MSG_CHANNEL_SUCCESS message. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The local channel number. + The bytes to add. + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets number of bytes to add to the window. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Specifies supported request names. + + + + + tcpip-forward + + + + + cancel-tcpip-forward + + + + + Represents SSH_MSG_REQUEST_FAILURE message. + + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Represents SSH_MSG_REQUEST_SUCCESS message. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The bound port. + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets the bound port. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Indicates that a class represents SSH message. This class cannot be inherited. + + + + + Initializes a new instance of the class. + + The name. + The number. + + + + Gets or sets message name as defined in RFC 4250. + + + The name. + + + + + Gets or sets message number as defined in RFC 4250. + + + The number. + + + + + Specifies list of supported services + + + + + ssh-userauth + + + + + ssh-connection + + + + + Represents SSH_MSG_DEBUG message. + + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets a value indicating whether the message to be always displayed. + + + true if the message always to be displayed; otherwise, false. + + + + + Gets debug message. + + + + + Gets message language. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Represents SSH_MSG_DISCONNECT message. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The reason code. + The message. + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets disconnect reason code. + + + + + Gets disconnect description. + + + + + Gets message language. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Provides list of disconnect reason as specified by the protocol. + + + + + Disconnect reason is not provided. + + + + + SSH_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT + + + + + SSH_DISCONNECT_PROTOCOL_ERROR + + + + + SSH_DISCONNECT_KEY_EXCHANGE_FAILED + + + + + SSH_DISCONNECT_RESERVED + + + + + SSH_DISCONNECT_MAC_ERROR + + + + + SSH_DISCONNECT_COMPRESSION_ERROR + + + + + SSH_DISCONNECT_SERVICE_NOT_AVAILABLE + + + + + SSH_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED + + + + + SSH_DISCONNECT_HOST_KEY_NOT_VERIFIABLE + + + + + SSH_DISCONNECT_CONNECTION_LOST + + + + + SSH_DISCONNECT_BY_APPLICATION + + + + + SSH_DISCONNECT_TOO_MANY_CONNECTIONS + + + + + SSH_DISCONNECT_AUTH_CANCELLED_BY_USER + + + + + SSH_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE + + + + + SSH_DISCONNECT_ILLEGAL_USER_NAME + + + + + Represents SSH_MSG_IGNORE message. + + + + + Initializes a new instance of the class + + + + + Initializes a new instance of the class. + + The data. + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets ignore message data if any. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Represents SSH_MSG_KEX_DH_GEX_GROUP message. + + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets or sets the safe prime. + + + The safe prime. + + + + + Gets or sets the generator for subgroup in GF(p). + + + The sub group. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Represents SSH_MSG_KEX_DH_GEX_INIT message. + + + + + Initializes a new instance of the class. + + The client exchange value. + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets the E value. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Represents SSH_MSG_KEX_DH_GEX_REPLY message. + + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets server public host key and certificates + + The host key. + + + + Gets the F value. + + + + + Gets the signature of H. + + The signature. + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Represents SSH_MSG_KEX_DH_GEX_REQUEST message. + + + + + Initializes a new instance of the class. + + The minimum. + The preferred. + The maximum. + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets or sets the minimal size in bits of an acceptable group. + + + The minimum. + + + + + Gets or sets the preferred size in bits of the group the server will send. + + + The preferred. + + + + + Gets or sets the maximal size in bits of an acceptable group. + + + The maximum. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Represents SSH_MSG_KEXDH_INIT message. + + + + + Initializes a new instance of the class. + + The client exchange value. + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets the E value. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Represents SSH_MSG_KEXDH_REPLY message. + + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets server public host key and certificates + + The host key. + + + + Gets the F value. + + + + + Gets the signature of H. + + The signature. + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Represents SSH_MSG_KEXINIT message. + + + + + Initializes a new instance of the class. + + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets session cookie. + + + + + Gets or sets supported key exchange algorithms. + + + Supported key exchange algorithms. + + + + + Gets or sets supported server host key algorithms. + + + Supported server host key algorithms. + + + + + Gets or sets supported encryption algorithms client to server. + + + Supported encryption algorithms client to server. + + + + + Gets or sets supported encryption algorithms server to client. + + + Supported encryption algorithms server to client. + + + + + Gets or sets supported hash algorithms client to server. + + + Supported hash algorithms client to server. + + + + + Gets or sets supported hash algorithms server to client. + + + Supported hash algorithms server to client. + + + + + Gets or sets supported compression algorithms client to server. + + + Supported compression algorithms client to server. + + + + + Gets or sets supported compression algorithms server to client. + + + Supported compression algorithms server to client. + + + + + Gets or sets supported languages client to server. + + + Supported languages client to server. + + + + + Gets or sets supported languages server to client. + + + The languages server to client. + + + + + Gets or sets a value indicating whether first key exchange packet follows. + + + true if first key exchange packet follows; otherwise, false. + + + + + Gets or sets the reserved value. + + + The reserved value. + + + + + Gets the size of the message in bytes. + + + -1 to indicate that the size of the message cannot be determined, + or is too costly to calculate. + + + + + Represents SSH_MSG_NEWKEYS message. + + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Represents SSH_MSG_SERVICE_ACCEPT message. + + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets the name of the service. + + + The name of the service. + + + + + Represents SSH_MSG_SERVICE_REQUEST message. + + + + + Initializes a new instance of the class. + + Name of the service. + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets the name of the service. + + + The name of the service. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Represents SSH_MSG_UNIMPLEMENTED message. + + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Contains operation for working with NetConf server. + + + + + Holds instance that used to communicate to the server + + + + + Initializes a new instance of the class. + + The connection info. + is null. + + + + Initializes a new instance of the class. + + Connection host. + Connection port. + Authentication username. + Authentication password. + is null. + is invalid, or is null or contains only whitespace characters. + is not within and . + + + + Initializes a new instance of the class. + + Connection host. + Authentication username. + Authentication password. + is null. + is invalid, or is null or contains only whitespace characters. + + + + Initializes a new instance of the class. + + Connection host. + Connection port. + Authentication username. + Authentication private key file(s) . + is null. + is invalid, -or- is null or contains only whitespace characters. + is not within and . + + + + Initializes a new instance of the class. + + Connection host. + Authentication username. + Authentication private key file(s) . + is null. + is invalid, -or- is null or contains only whitespace characters. + + + + Initializes a new instance of the class. + + The connection info. + Specified whether this instance owns the connection info. + is null. + + If is true, then the + connection info will be disposed when this instance is disposed. + + + + + Initializes a new instance of the class. + + The connection info. + Specified whether this instance owns the connection info. + The factory to use for creating new services. + is null. + is null. + + If is true, then the + connection info will be disposed when this instance is disposed. + + + + + Sends the receive RPC. + + The RPC. + Reply message to RPC request + Client is not connected. + + + + Sends the receive RPC. + + The XML. + Reply message to RPC request + + + + Sends the close RPC. + + Reply message to closing RPC request + Client is not connected. + + + + Called when client is connected to the server. + + + + + Called when client is disconnecting from the server. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Gets or sets the operation timeout. + + + The timeout to wait until an operation completes. The default value is negative + one (-1) milliseconds, which indicates an infinite time-out period. + + + + + Gets the NetConf server capabilities. + + + The NetConf server capabilities. + + + + + Gets the NetConf client capabilities. + + + The NetConf client capabilities. + + + + + Gets or sets a value indicating whether automatic message id handling is + enabled. + + + true if automatic message id handling is enabled; otherwise, false. + The default value is true. + + + + + Base class for SSH subsystem implementations + + + + + Holds the number of system wait handles that are returned as the leading entries in the array returned + in . + + + + + Initializes a new instance of the SubsystemSession class. + + The session. + Name of the subsystem. + The number of milliseconds to wait for a given operation to complete, or -1 to wait indefinitely. + or is null. + + + + Connects the subsystem using a new SSH channel session. + + The session is already connected. + The method was called after the session was disposed. + + + + Disconnects the subsystem channel. + + + + + Sends data to the subsystem. + + The data to be sent. + + + + Called when channel is open. + + + + + Called when data is received. + + The data. + + + + Raises the error. + + The error. + + + + Waits a specified time for a given to get signaled. + + The handle to wait for. + To number of milliseconds to wait for to get signaled, or -1 to wait indefinitely. + The connection was closed by the server. + The channel was closed. + The handle did not get signaled within the specified timeout. + + + + Blocks the current thread until the specified gets signaled, using a + 32-bit signed integer to specify the time interval in milliseconds. + + The handle to wait for. + To number of milliseconds to wait for to get signaled, or -1 to wait indefinitely. + + true if received a signal within the specified timeout; + otherwise, false. + + The connection was closed by the server. + The channel was closed. + + The blocking wait is also interrupted when either the established channel is closed, the current + session is disconnected or an unexpected occurred while processing a channel + or session event. + + + + + Blocks the current thread until the specified gets signaled, using a + 32-bit signed integer to specify the time interval in milliseconds. + + The first handle to wait for. + The second handle to wait for. + To number of milliseconds to wait for a to get signaled, or -1 to wait indefinitely. + + 0 if received a signal within the specified timeout, and 1 + if received a signal within the specified timeout. + + The connection was closed by the server. + The channel was closed. + The handle did not get signaled within the specified timeout. + + + The blocking wait is also interrupted when either the established channel is closed, the current + session is disconnected or an unexpected occurred while processing a channel + or session event. + + + When both and are signaled during the call, + then 0 is returned. + + + + + + Waits for any of the elements in the specified array to receive a signal, using a 32-bit signed + integer to specify the time interval. + + A array - constructed using - containing the objects to wait for. + To number of milliseconds to wait for a to get signaled, or -1 to wait indefinitely. + + The array index of the first non-system object that satisfied the wait. + + The connection was closed by the server. + The channel was closed. + No object satified the wait and a time interval equivalent to has passed. + + For the return value, the index of the first non-system object is considered to be zero. + + + + + Creates a array that is composed of system objects and the specified + elements. + + The first to wait for. + The second to wait for. + + A array that is composed of system objects and the specified elements. + + + + + Creates a array that is composed of system objects and the specified + elements. + + A array containing the objects to wait for. + + A array that is composed of system objects and the specified elements. + + + + + Unsubscribes the current from session events. + + The session. + + Does nothing when is null. + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Finalizes an instance of the class. + + + + + Gets or set the number of seconds to wait for an operation to complete. + + + The number of seconds to wait for an operation to complete, or -1 to wait indefinitely. + + + + + Occurs when an error occurred. + + + + + Occurs when the server has disconnected from the session. + + + + + Gets the channel associated with this session. + + + The channel associated with this session. + + + + + Gets a value indicating whether this session is open. + + + true if this session is open; otherwise, false. + + + + + Initializes a new instance of the class. + + The session. + The number of milliseconds to wait for an operation to complete, or -1 to wait indefinitely. + + + + Gets NetConf server capabilities. + + + + + Gets NetConf client capabilities. + + + + + Represents private key information. + + + + + + + Supports RSA and DSA private key in both OpenSSH and ssh.com format. + + + The following encryption algorithms are supported: + + + DES-EDE3-CBC + + + DES-EDE3-CFB + + + DES-CBC + + + AES-128-CBC + + + AES-192-CBC + + + AES-256-CBC + + + + + + + + Initializes a new instance of the class. + + The private key. + + + + Initializes a new instance of the class. + + Name of the file. + is null or empty. + This method calls internally, this method does not catch exceptions from . + + + + Initializes a new instance of the class. + + Name of the file. + The pass phrase. + is null or empty, or is null. + This method calls internally, this method does not catch exceptions from . + + + + Initializes a new instance of the class. + + The private key. + The pass phrase. + or is null. + + + + Opens the specified private key. + + The private key. + The pass phrase. + + + + Decrypts encrypted private key file data. + + The cipher info. + Encrypted data. + Decryption pass phrase. + Decryption binary salt. + Decrypted byte array. + , , or is null. + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Releases unmanaged resources and performs other cleanup operations before the + is reclaimed by garbage collection. + + + + + Gets the host key. + + + + + Reads next mpint data type from internal buffer where length specified in bits. + + mpint read. + + + + Implements certificate support for host algorithm. + + + + + Base class for SSH host algorithms. + + + + + Initializes a new instance of the class. + + The host key name. + + + + Signs the specified data. + + The data. + Signed data. + + + + Verifies the signature. + + The data. + The signature. + True is signature was successfully verifies; otherwise false. + + + + Gets the host key name. + + + + + Gets the host key data. + + + + + Initializes a new instance of the class. + + The host key name. + + + + Signs the specified data. + + The data. + Signed data. + + + + + Verifies the signature. + + The data. + The signature. + true if signature was successfully verified; otherwise false. + + + + + Gets the host key data. + + + + + Base class for asymmetric cipher implementations. + + + + + Base class for cipher implementation. + + + + + Encrypts the specified input. + + The input. + Encrypted data. + + + + Encrypts the specified input. + + The input. + The zero-based offset in at which to begin encrypting. + The number of bytes to encrypt from . + + The encrypted data. + + + + + Decrypts the specified input. + + The input. + + The decrypted data. + + + + + Decrypts the specified input. + + The input. + The zero-based offset in at which to begin decrypting. + The number of bytes to decrypt from . + + The decrypted data. + + + + + Gets the minimum data size. + + + The minimum data size. + + + + + Gets the minimum data size. + + + The minimum data size. + + + + + Base class for block cipher implementations. + + + + + Base class for symmetric cipher implementations. + + + + + Initializes a new instance of the class. + + The key. + is null. + + + + Encrypts the specified region of the input byte array and copies the encrypted data to the specified region of the output byte array. + + The input data to encrypt. + The offset into the input byte array from which to begin using data. + The number of bytes in the input byte array to use as data. + The output to which to write encrypted data. + The offset into the output byte array from which to begin writing data. + + The number of bytes encrypted. + + + + + Decrypts the specified region of the input byte array and copies the decrypted data to the specified region of the output byte array. + + The input data to decrypt. + The offset into the input byte array from which to begin using data. + The number of bytes in the input byte array to use as data. + The output to which to write decrypted data. + The offset into the output byte array from which to begin writing data. + + The number of bytes decrypted. + + + + + Gets the key. + + + + + Gets the size of the block in bytes. + + + The size of the block in bytes. + + + + + Initializes a new instance of the class. + + The key. + Size of the block. + Cipher mode. + Cipher padding. + is null. + + + + Encrypts the specified data. + + The data. + The zero-based offset in at which to begin encrypting. + The number of bytes to encrypt from . + Encrypted data + + + + Decrypts the specified data. + + The data. + Decrypted data + + + + Decrypts the specified input. + + The input. + The zero-based offset in at which to begin decrypting. + The number of bytes to decrypt from . + + The decrypted data. + + + + + Gets the minimum data size. + + + The minimum data size. + + + + + Gets the size of the block. + + + The size of the block. + + + + + Implements digital signature where where asymmetric cipher is used, + + + + + Base class for signature implementations + + + + + Verifies the signature. + + The input. + The signature. + True if signature was successfully verified; otherwise false. + + + + Creates the signature. + + The input. + Signed input data. + + + + Initializes a new instance of the class. + + The object identifier. + The cipher. + + + + Verifies the signature. + + The input. + The signature. + + True if signature was successfully verified; otherwise false. + + + + + Creates the signature. + + The input. + + Signed input data. + + + + + Hashes the specified input. + + The input. + Hashed data. + + + + Encodes hash using DER. + + The hash data. + DER Encoded byte array + + + + AES cipher implementation. + + + + + Initializes a new instance of the class. + + The key. + The mode. + The padding. + is null. + Keysize is not valid for this algorithm. + + + + Encrypts the specified region of the input byte array and copies the encrypted data to the specified region of the output byte array. + + The input data to encrypt. + The offset into the input byte array from which to begin using data. + The number of bytes in the input byte array to use as data. + The output to which to write encrypted data. + The offset into the output byte array from which to begin writing data. + + The number of bytes encrypted. + + or is null. + or is too short. + + + + Decrypts the specified region of the input byte array and copies the decrypted data to the specified region of the output byte array. + + The input data to decrypt. + The offset into the input byte array from which to begin using data. + The number of bytes in the input byte array to use as data. + The output to which to write decrypted data. + The offset into the output byte array from which to begin writing data. + + The number of bytes decrypted. + + or is null. + or is too short. + + + + Implements ARCH4 cipher algorithm + + + + + Base class of stream cipher algorithms. + + + + + Initializes a new instance of the class. + + The key. + is null. + + + + Holds the state of the RC4 engine + + + + + Initializes a new instance of the class. + + The key. + if set to true will disharged first 1536 bytes. + is null. + + + + Encrypts the specified region of the input byte array and copies the encrypted data to the specified region of the output byte array. + + The input data to encrypt. + The offset into the input byte array from which to begin using data. + The number of bytes in the input byte array to use as data. + The output to which to write encrypted data. + The offset into the output byte array from which to begin writing data. + + The number of bytes encrypted. + + + + + Decrypts the specified region of the input byte array and copies the decrypted data to the specified region of the output byte array. + + The input data to decrypt. + The offset into the input byte array from which to begin using data. + The number of bytes in the input byte array to use as data. + The output to which to write decrypted data. + The offset into the output byte array from which to begin writing data. + + The number of bytes decrypted. + + + + + Encrypts the specified input. + + The input. + The zero-based offset in at which to begin encrypting. + The number of bytes to encrypt from . + + Encrypted data. + + + + + Decrypts the specified input. + + The input. + + The decrypted data. + + + + + Decrypts the specified input. + + The input. + The zero-based offset in at which to begin decrypting. + The number of bytes to decrypt from . + + The decrypted data. + + + + + Gets the minimum data size. + + + The minimum data size. + + + + + Blowfish cipher implementation. + + + + + The s-boxes + + + + + The s-boxes + + + + + The s-boxes + + + + + The s-boxes + + + + + The p-array + + + + + Initializes a new instance of the class. + + The key. + The mode. + The padding. + is null. + Keysize is not valid for this algorithm. + + + + Encrypts the specified region of the input byte array and copies the encrypted data to the specified region of the output byte array. + + The input data to encrypt. + The offset into the input byte array from which to begin using data. + The number of bytes in the input byte array to use as data. + The output to which to write encrypted data. + The offset into the output byte array from which to begin writing data. + + The number of bytes encrypted. + + + + + Decrypts the specified region of the input byte array and copies the decrypted data to the specified region of the output byte array. + + The input data to decrypt. + The offset into the input byte array from which to begin using data. + The number of bytes in the input byte array to use as data. + The output to which to write decrypted data. + The offset into the output byte array from which to begin writing data. + + The number of bytes decrypted. + + + + + apply the encryption cycle to each value pair in the table. + + The xl. + The xr. + The table. + + + + Implements CAST cipher algorithm + + + + + The rotating round key + + + + + The masking round key + + + + + Initializes a new instance of the class. + + The key. + The mode. + The padding. + is null. + Keysize is not valid for this algorithm. + + + + Encrypts the specified region of the input byte array and copies the encrypted data to the specified region of the output byte array. + + The input data to encrypt. + The offset into the input byte array from which to begin using data. + The number of bytes in the input byte array to use as data. + The output to which to write encrypted data. + The offset into the output byte array from which to begin writing data. + + The number of bytes encrypted. + + + + + Decrypts the specified region of the input byte array and copies the decrypted data to the specified region of the output byte array. + + The input data to decrypt. + The offset into the input byte array from which to begin using data. + The number of bytes in the input byte array to use as data. + The output to which to write decrypted data. + The offset into the output byte array from which to begin writing data. + + The number of bytes decrypted. + + + + + Sets the subkeys using the same nomenclatureas described in RFC2144. + + The key. + + + + The first of the three processing functions for the encryption and decryption. + + The input to be processed. + The mask to be used from Km[n]. + The rotation value to be used. + + + + + The second of the three processing functions for the encryption and decryption. + + The input to be processed. + The mask to be used from Km[n]. + The rotation value to be used. + + + + + The third of the three processing functions for the encryption and decryption. + + The input to be processed. + The mask to be used from Km[n]. + The rotation value to be used. + + + + + Does the 16 rounds to encrypt the block. + + The LH-32bits of the plaintext block. + The RH-32bits of the plaintext block. + The result. + + + + Base class for cipher mode implementations + + + + + Gets the cipher. + + + + + Gets the IV vector. + + + + + Holds block size of the cipher. + + + + + Initializes a new instance of the class. + + The iv. + + + + Initializes the specified cipher mode. + + The cipher. + + + + Encrypts the specified region of the input byte array and copies the encrypted data to the specified region of the output byte array. + + The input data to encrypt. + The offset into the input byte array from which to begin using data. + The number of bytes in the input byte array to use as data. + The output to which to write encrypted data. + The offset into the output byte array from which to begin writing data. + + The number of bytes encrypted. + + + + + Decrypts the specified region of the input byte array and copies the decrypted data to the specified region of the output byte array. + + The input data to decrypt. + The offset into the input byte array from which to begin using data. + The number of bytes in the input byte array to use as data. + The output to which to write decrypted data. + The offset into the output byte array from which to begin writing data. + + The number of bytes decrypted. + + + + + Base class for cipher padding implementations + + + + + Pads the specified input to match the block size. + + Size of the block. + The input. + + Padded data array. + + + + + Pads the specified input to match the block size. + + Size of the block. + The input. + The zero-based offset in at which the data to pad starts. + The number of bytes in to take into account. + + The padded data array. + + + + + Pads the specified input with a given number of bytes. + + The input. + The number of bytes to pad the input with. + + The padded data array. + + + + + Pads the specified input with a given number of bytes. + + The input. + The zero-based offset in at which the data to pad starts. + The number of bytes in to take into account. + The number of bytes to pad the input with. + + The padded data array. + + + + + Implements DES cipher algorithm. + + + + + Initializes a new instance of the class. + + The key. + The mode. + The padding. + is null. + + + + Encrypts the specified region of the input byte array and copies the encrypted data to the specified region of the output byte array. + + The input data to encrypt. + The offset into the input byte array from which to begin using data. + The number of bytes in the input byte array to use as data. + The output to which to write encrypted data. + The offset into the output byte array from which to begin writing data. + + The number of bytes encrypted. + + + + + Decrypts the specified region of the input byte array and copies the decrypted data to the specified region of the output byte array. + + The input data to decrypt. + The offset into the input byte array from which to begin using data. + The number of bytes in the input byte array to use as data. + The output to which to write decrypted data. + The offset into the output byte array from which to begin writing data. + + The number of bytes decrypted. + + + + + Generates the working key. + + if set to true [encrypting]. + The key. + Generated working key. + + + + Validates the key. + + + + + Performs DES function. + + The w key. + The input. + The in off. + The out bytes. + The out off. + + + + Implements CBC cipher mode + + + + + Initializes a new instance of the class. + + The iv. + + + + Encrypts the specified region of the input byte array and copies the encrypted data to the specified region of the output byte array. + + The input data to encrypt. + The offset into the input byte array from which to begin using data. + The number of bytes in the input byte array to use as data. + The output to which to write encrypted data. + The offset into the output byte array from which to begin writing data. + + The number of bytes encrypted. + + + + + Decrypts the specified region of the input byte array and copies the decrypted data to the specified region of the output byte array. + + The input data to decrypt. + The offset into the input byte array from which to begin using data. + The number of bytes in the input byte array to use as data. + The output to which to write decrypted data. + The offset into the output byte array from which to begin writing data. + + The number of bytes decrypted. + + + + + Implements CFB cipher mode + + + + + Initializes a new instance of the class. + + The iv. + + + + Encrypts the specified region of the input byte array and copies the encrypted data to the specified region of the output byte array. + + The input data to encrypt. + The offset into the input byte array from which to begin using data. + The number of bytes in the input byte array to use as data. + The output to which to write encrypted data. + The offset into the output byte array from which to begin writing data. + + The number of bytes encrypted. + + + + + Decrypts the specified region of the input byte array and copies the decrypted data to the specified region of the output byte array. + + The input data to decrypt. + The offset into the input byte array from which to begin using data. + The number of bytes in the input byte array to use as data. + The output to which to write decrypted data. + The offset into the output byte array from which to begin writing data. + + The number of bytes decrypted. + + + + + Implements CTR cipher mode + + + + + Initializes a new instance of the class. + + The iv. + + + + Encrypts the specified region of the input byte array and copies the encrypted data to the specified region of the output byte array. + + The input data to encrypt. + The offset into the input byte array from which to begin using data. + The number of bytes in the input byte array to use as data. + The output to which to write encrypted data. + The offset into the output byte array from which to begin writing data. + + The number of bytes encrypted. + + + + + Decrypts the specified region of the input byte array and copies the decrypted data to the specified region of the output byte array. + + The input data to decrypt. + The offset into the input byte array from which to begin using data. + The number of bytes in the input byte array to use as data. + The output to which to write decrypted data. + The offset into the output byte array from which to begin writing data. + + The number of bytes decrypted. + + + + + Implements OFB cipher mode + + + + + Initializes a new instance of the class. + + The iv. + + + + Encrypts the specified region of the input byte array and copies the encrypted data to the specified region of the output byte array. + + The input data to encrypt. + The offset into the input byte array from which to begin using data. + The number of bytes in the input byte array to use as data. + The output to which to write encrypted data. + The offset into the output byte array from which to begin writing data. + + The number of bytes encrypted. + + + + + Decrypts the specified region of the input byte array and copies the decrypted data to the specified region of the output byte array. + + The input data to decrypt. + The offset into the input byte array from which to begin using data. + The number of bytes in the input byte array to use as data. + The output to which to write decrypted data. + The offset into the output byte array from which to begin writing data. + + The number of bytes decrypted. + + + + + Implements PKCS5 cipher padding + + + + + Pads the specified input to match the block size. + + The size of the block. + The input. + The zero-based offset in at which the data to pad starts. + The number of bytes in to take into account. + + The padded data array. + + + + + Pads the specified input with a given number of bytes. + + The input. + The zero-based offset in at which the data to pad starts. + The number of bytes in to take into account. + The number of bytes to pad the input with. + + The padded data array. + + + + + Implements PKCS7 cipher padding + + + + + Pads the specified input to match the block size. + + The size of the block. + The input. + The zero-based offset in at which the data to pad starts. + The number of bytes in to take into account. + + The padded data array. + + + + + Pads the specified input with a given number of bytes. + + The input. + The zero-based offset in at which the data to pad starts. + The number of bytes in to take into account. + The number of bytes to pad the input with. + + The padded data array. + + + + + Implements RSA cipher algorithm. + + + + + Initializes a new instance of the class. + + The RSA key. + + + + Encrypts the specified data. + + The data. + The zero-based offset in at which to begin encrypting. + The number of bytes to encrypt from . + Encrypted data. + + + + Decrypts the specified data. + + The data. + + The decrypted data. + + Only block type 01 or 02 are supported. + Thrown when decrypted block type is not supported. + + + + Decrypts the specified input. + + The input. + The zero-based offset in at which to begin decrypting. + The number of bytes to decrypt from . + + The decrypted data. + + Only block type 01 or 02 are supported. + Thrown when decrypted block type is not supported. + + + + Implements Serpent cipher algorithm. + + + + + Initializes a new instance of the class. + + The key. + The mode. + The padding. + is null. + Keysize is not valid for this algorithm. + + + + Encrypts the specified region of the input byte array and copies the encrypted data to the specified region of the output byte array. + + The input data to encrypt. + The offset into the input byte array from which to begin using data. + The number of bytes in the input byte array to use as data. + The output to which to write encrypted data. + The offset into the output byte array from which to begin writing data. + + The number of bytes encrypted. + + + + + Decrypts the specified region of the input byte array and copies the decrypted data to the specified region of the output byte array. + + The input data to decrypt. + The offset into the input byte array from which to begin using data. + The number of bytes in the input byte array to use as data. + The output to which to write decrypted data. + The offset into the output byte array from which to begin writing data. + + The number of bytes decrypted. + + + + + Expand a user-supplied key material into a session key. + + The user-key bytes to use. + + A session key. + + is not multiple of 4 bytes. + + + + S0 - { 3, 8,15, 1,10, 6, 5,11,14,13, 4, 2, 7, 0, 9,12 } - 15 terms. + + A. + The b. + The c. + The d. + + + + InvSO - {13, 3,11, 0,10, 6, 5,12, 1,14, 4, 7,15, 9, 8, 2 } - 15 terms. + + A. + The b. + The c. + The d. + + + + S1 - {15,12, 2, 7, 9, 0, 5,10, 1,11,14, 8, 6,13, 3, 4 } - 14 terms. + + A. + The b. + The c. + The d. + + + + InvS1 - { 5, 8, 2,14,15, 6,12, 3,11, 4, 7, 9, 1,13,10, 0 } - 14 steps. + + A. + The b. + The c. + The d. + + + + S2 - { 8, 6, 7, 9, 3,12,10,15,13, 1,14, 4, 0,11, 5, 2 } - 16 terms. + + A. + The b. + The c. + The d. + + + + InvS2 - {12, 9,15, 4,11,14, 1, 2, 0, 3, 6,13, 5, 8,10, 7 } - 16 steps. + + A. + The b. + The c. + The d. + + + + S3 - { 0,15,11, 8,12, 9, 6, 3,13, 1, 2, 4,10, 7, 5,14 } - 16 terms. + + A. + The b. + The c. + The d. + + + + InvS3 - { 0, 9,10, 7,11,14, 6,13, 3, 5,12, 2, 4, 8,15, 1 } - 15 terms + + A. + The b. + The c. + The d. + + + + S4 - { 1,15, 8, 3,12, 0,11, 6, 2, 5, 4,10, 9,14, 7,13 } - 15 terms. + + A. + The b. + The c. + The d. + + + + InvS4 - { 5, 0, 8, 3,10, 9, 7,14, 2,12,11, 6, 4,15,13, 1 } - 15 terms. + + A. + The b. + The c. + The d. + + + + S5 - {15, 5, 2,11, 4,10, 9,12, 0, 3,14, 8,13, 6, 7, 1 } - 16 terms. + + A. + The b. + The c. + The d. + + + + InvS5 - { 8,15, 2, 9, 4, 1,13,14,11, 6, 5, 3, 7,12,10, 0 } - 16 terms. + + A. + The b. + The c. + The d. + + + + S6 - { 7, 2,12, 5, 8, 4, 6,11,14, 9, 1,15,13, 3,10, 0 } - 15 terms. + + A. + The b. + The c. + The d. + + + + InvS6 - {15,10, 1,13, 5, 3, 6, 0, 4, 9,14, 7, 2,12, 8,11 } - 15 terms. + + A. + The b. + The c. + The d. + + + + S7 - { 1,13,15, 0,14, 8, 2,11, 7, 4,12,10, 9, 3, 5, 6 } - 16 terms. + + A. + The b. + The c. + The d. + + + + InvS7 - { 3, 0, 6,13, 9,14,15, 8, 5,12,11, 7,10, 1, 4, 2 } - 17 terms. + + A. + The b. + The c. + The d. + + + + Apply the linear transformation to the register set. + + + + + Apply the inverse of the linear transformation to the register set. + + + + + Implements 3DES cipher algorithm. + + + + + Initializes a new instance of the class. + + The key. + The mode. + The padding. + is null. + + + + Encrypts the specified region of the input byte array and copies the encrypted data to the specified region of the output byte array. + + The input data to encrypt. + The offset into the input byte array from which to begin using data. + The number of bytes in the input byte array to use as data. + The output to which to write encrypted data. + The offset into the output byte array from which to begin writing data. + + The number of bytes encrypted. + + + + + Decrypts the specified region of the input byte array and copies the decrypted data to the specified region of the output byte array. + + The input data to decrypt. + The offset into the input byte array from which to begin using data. + The number of bytes in the input byte array to use as data. + The output to which to write decrypted data. + The offset into the output byte array from which to begin writing data. + + The number of bytes decrypted. + + + + + Validates the key. + + + + + Implements Twofish cipher algorithm + + + + Define the fixed p0/p1 permutations used in keyed S-box lookup. + By changing the following constant definitions, the S-boxes will + automatically Get changed in the Twofish engine. + + + + Initializes a new instance of the class. + + The key. + The mode. + The padding. + is null. + Keysize is not valid for this algorithm. + + + + Encrypts the specified region of the input byte array and copies the encrypted data to the specified region of the output byte array. + + The input data to encrypt. + The offset into the input byte array from which to begin using data. + The number of bytes in the input byte array to use as data. + The output to which to write encrypted data. + The offset into the output byte array from which to begin writing data. + + The number of bytes encrypted. + + + + + Decrypts the specified region of the input byte array and copies the decrypted data to the specified region of the output byte array. + + The input data to decrypt. + The offset into the input byte array from which to begin using data. + The number of bytes in the input byte array to use as data. + The output to which to write decrypted data. + The offset into the output byte array from which to begin writing data. + + The number of bytes decrypted. + + + + gSubKeys[] and gSBox[] are eventually used in the + encryption and decryption methods. + + + Use (12, 8) Reed-Solomon code over GF(256) to produce + a key S-box 32-bit entity from 2 key material 32-bit + entities. + + @param k0 first 32-bit entity + @param k1 second 32-bit entity + @return Remainder polynomial Generated using RS code + + + Reed-Solomon code parameters: (12,8) reversible code: +

+

+            G(x) = x^4 + (a+1/a)x^3 + ax^2 + (a+1/a)x + 1
+            
+ where a = primitive root of field generator 0x14D +

+
+ + + Implements DSA digital signature algorithm. + + + + + Initializes a new instance of the class. + + The DSA key. + is null. + + + + Verifies the signature. + + The input. + The signature. + + true if signature was successfully verified; otherwise false. + + Invalid signature. + + + + Creates the signature. + + The input. + + Signed input data. + + Invalid DSA key. + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Releases unmanaged resources and performs other cleanup operations before the + is reclaimed by garbage collection. + + + + + Contains DSA private and public key + + + + + Base class for asymmetric cipher algorithms + + + + + Specifies array of big integers that represent private key + + + + + Initializes a new instance of the class. + + DER encoded private key data. + + + + Initializes a new instance of the class. + + + + + Signs the specified data with the key. + + The data to sign. + + Signed data. + + + + + Verifies the signature. + + The data to verify. + The signature to verify against. + True is signature was successfully verifies; otherwise false. + + + + Gets the key specific digital signature. + + + + + Gets or sets the public key. + + + The public. + + + + + Gets the length of the key. + + + The length of the key. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + DER encoded private key data. + + + + Initializes a new instance of the class. + + The p. + The q. + The g. + The y. + The x. + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Releases unmanaged resources and performs other cleanup operations before the + is reclaimed by garbage collection. + + + + + Gets the P. + + + + + Gets the Q. + + + + + Gets the G. + + + + + Gets public key Y. + + + + + Gets private key X. + + + + + Gets the length of the key. + + + The length of the key. + + + + + Gets the digital signature. + + + + + Gets or sets the public. + + + The public. + + + + + Implements RSA digital signature algorithm. + + + + + Initializes a new instance of the class. + + The RSA key. + + + + Hashes the specified input. + + The input. + + Hashed data. + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Releases unmanaged resources and performs other cleanup operations before the + is reclaimed by garbage collection. + + + + + Contains RSA private and public key + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + DER encoded private key data. + + + + Initializes a new instance of the class. + + The modulus. + The exponent. + The d. + The p. + The q. + The inverse Q. + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Releases unmanaged resources and performs other cleanup operations before the + is reclaimed by garbage collection. + + + + + Gets the modulus. + + + + + Gets the exponent. + + + + + Gets the D. + + + + + Gets the P. + + + + + Gets the Q. + + + + + Gets the DP. + + + + + Gets the DQ. + + + + + Gets the inverse Q. + + + + + Gets the length of the key. + + + The length of the key. + + + + + Gets the digital signature. + + + + + Gets or sets the public. + + + The public. + + + + + Represents "diffie-hellman-group14-sha1" algorithm implementation. + + + + + Gets algorithm name. + + + + + Gets the group prime. + + + The group prime. + + + + + Represents "diffie-hellman-group1-sha1" algorithm implementation. + + + + + Gets algorithm name. + + + + + Gets the group prime. + + + The group prime. + + + + + Represents "diffie-hellman-group-exchange-sha1" algorithm implementation. + + + + + Gets algorithm name. + + + + + Represents "diffie-hellman-group-exchange-sha256" algorithm implementation. + + + + + Hashes the specified data bytes. + + Data to hash. + + Hashed bytes + + + + + Gets algorithm name. + + + + + Implements key support for host algorithm. + + + + + Initializes a new instance of the class. + + Host key name. + Host key. + + + + Initializes a new instance of the class. + + Host key name. + Host key. + Host key encoded data. + + + + Signs the specified data. + + The data. + + Signed data. + + + + + Verifies the signature. + + The data. + The signature. + + True is signature was successfully verifies; otherwise false. + + + + + Gets the key. + + + + + Gets the public key data. + + + + + Called when type specific data need to be loaded. + + + + + Called when type specific data need to be saved. + + + + + Gets or sets the name of the algorithm as UTF-8 encoded byte array. + + + The name of the algorithm. + + + + + Gets or sets the signature. + + + The signature. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Provides functionality to connect and interact with SSH server. + + + + + Specifies maximum packet size defined by the protocol. + + + 68536 (64 KB + 3000 bytes). + + + + + Holds the initial local window size for the channels. + + + 2147483647 (2^31 - 1) bytes. + + + We currently do not define a maximum (remote) window size. + + + + + Holds the maximum size of channel data packets that we receive. + + + 64 KB. + + + + This is the maximum size (in bytes) we support for the data (payload) of a + SSH_MSG_CHANNEL_DATA message we receive. + + + We currently do not enforce this limit. + + + + + + Specifies an infinite waiting period. + + + The value of this field is -1 millisecond. + + + + + Specifies an infinite waiting period. + + + The value of this field is -1. + + + + + Controls how many authentication attempts can take place at the same time. + + + Some server may restrict number to prevent authentication attacks + + + + + Holds metada about session messages + + + + + Holds a that is signaled when the message listener loop has completed. + + + + + Specifies outbound packet number + + + + + Specifies incoming packet number + + + + + WaitHandle to signal that last service request was accepted + + + + + WaitHandle to signal that exception was thrown by another thread. + + + + + WaitHandle to signal that key exchange was completed. + + + + + WaitHandle to signal that key exchange is in progress. + + + + + Exception that need to be thrown by waiting thread + + + + + Specifies whether connection is authenticated + + + + + Specifies whether user issued Disconnect command or not + + + + + Holds the factory to use for creating new services. + + + + + Holds connection socket. + + + + + Holds an object that is used to ensure only a single thread can read from + at any given time. + + + + + Holds an object that is used to ensure only a single thread can write to + at any given time. + + + This is also used to ensure that is + incremented atomatically. + + + + + Holds an object that is used to ensure only a single thread can dispose + at any given time. + + + This is also used to ensure that will not be disposed + while performing a given operation or set of operations on . + + + + + Initializes a new instance of the class. + + The connection info. + The factory to use for creating new services. + is null. + is null. + + + + Connects to the server. + + Socket connection to the SSH server or proxy server could not be established, or an error occurred while resolving the hostname. + SSH session could not be established. + Authentication of SSH session failed. + Failed to establish proxy connection. + + + + Disconnects from the server. + + + This sends a SSH_MSG_DISCONNECT message to the server, waits for the + server to close the socket on its end and subsequently closes the client socket. + + + + + Waits for the specified handle or the exception handle for the receive thread + to signal within the connection timeout. + + The wait handle. + A received package was invalid or failed the message integrity check. + None of the handles are signaled in time and the session is not disconnecting. + A socket error was signaled while receiving messages from the server. + + When neither handles are signaled in time and the session is not closing, then the + session is disconnected. + + + + + Waits for the specified handle or the exception handle for the receive thread + to signal within the specified timeout. + + The wait handle. + The time to wait for any of the handles to become signaled. + A received package was invalid or failed the message integrity check. + None of the handles are signaled in time and the session is not disconnecting. + A socket error was signaled while receiving messages from the server. + + When neither handles are signaled in time and the session is not closing, then the + session is disconnected. + + + + + Waits for the specified handle or the exception handle for the receive thread + to signal within the connection timeout. + + The wait handle. + A received package was invalid or failed the message integrity check. + None of the handles are signaled in time and the session is not disconnecting. + A socket error was signaled while receiving messages from the server. + + When neither handles are signaled in time and the session is not closing, then the + session is disconnected. + + + + + Waits for the specified handle or the exception handle for the receive thread + to signal within the specified timeout. + + The wait handle. + The time to wait for any of the handles to become signaled. + A received package was invalid or failed the message integrity check. + None of the handles are signaled in time and the session is not disconnecting. + A socket error was signaled while receiving messages from the server. + + + + Sends a message to the server. + + The message to send. + The client is not connected. + The operation timed out. + The size of the packet exceeds the maximum size defined by the protocol. + + + + Sends an SSH packet to the server. + + A byte array containing the packet to send. + The offset of the packet. + The length of the packet. + Client is not connected to the server. + + + The send is performed in a dispose lock to avoid + and/or when sending the packet. + + + This method is only to be used when the connection is established, as the locking + overhead is not required while establising the connection. + + + + + + Sends a message to the server. + + The message to send. + + true if the message was sent to the server; otherwise, false. + + The size of the packet exceeds the maximum size defined by the protocol. + + This methods returns false when the attempt to send the message results in a + or a . + + + + + Receives the message from the server. + + + The incoming SSH message, or null if the connection with the SSH server was closed. + + + We need no locking here since all messages are read by a single thread. + + + + + Called when received. + + message. + + + + Called when received. + + message. + + + + Called when message received. + + message. + + + + Called when message received. + + message. + + + + Called when message received. + + message. + + + + Called when message received. + + message. + + + + Called when message received. + + message. + + + + Called when message received. + + message. + + + + Called when client is disconnecting from the server. + + + + + Called when message received. + + message. + + + + Called when message received. + + message. + + + + Called when message received. + + message. + + + + Called when message received. + + message. + + + + Called when message received. + + message. + + + + Called when message received. + + message. + + + + Called when message received. + + message. + + + + Called when message received. + + message. + + + + Called when message received. + + message. + + + + Called when message received. + + message. + + + + Called when message received. + + message. + + + + Called when message received. + + message. + + + + Called when message received. + + message. + + + + Called when message received. + + message. + + + + Called when message received. + + message. + + + + Called when message received. + + message. + + + + Called when message received. + + message. + + + + Called when message received. + + message. + + + + Called when message received. + + message. + + + + Registers SSH message with the session. + + The name of the message to register with the session. + + + + Unregister SSH message from the session. + + The name of the message to unregister with the session. + + + + Loads a message from a given buffer. + + An array of bytes from which to construct the message. + The zero-based byte offset in at which to begin reading. + The number of bytes to load. + + A message constructed from . + + The type of the message is not supported. + + + + Establishes a socket connection to the specified host and port. + + The host name of the server to connect to. + The port to connect to. + The connection failed to establish within the configured . + An error occurred trying to establish the connection. + + + + Performs a blocking read on the socket until bytes are received. + + An array of type that is the storage location for the received data. + The position in parameter to store the received data. + The number of bytes to read. + + The number of bytes read. + + The socket is closed. + The read has timed-out. + The read failed. + + + + Gets a value indicating whether the socket is connected. + + + true if the socket is connected; otherwise, false. + + + + As a first check we verify whether is + true. However, this only returns the state of the socket as of + the last I/O operation. + + + Therefore we use the combination of with mode + and to verify if the socket is still connected. + + + The MSDN doc mention the following on the return value of + with mode : + + + true if data is available for reading; + + + true if the connection has been closed, reset, or terminated; otherwise, returns false. + + + + + Conclusion: when the return value is true - but no data is available for reading - then + the socket is no longer connected. + + + When a is used from multiple threads, there's a race condition + between the invocation of and the moment + when the value of is obtained. To workaround this issue + we synchronize reads from the . + + + + + + Performs a blocking read on the socket until bytes are received. + + An array of type that is the storage location for the received data. + The position in parameter to store the received data. + The number of bytes to read. + + The number of bytes read. + + The read has timed-out. + The read failed. + + + + Performs a blocking read on the socket until a line is read. + + A that represents the time to wait until a line is read. + The read has timed-out. + An error occurred when trying to access the socket. + + The line read from the socket, or null when the remote server has shutdown and all data has been received. + + + + + Shuts down and disposes the socket. + + + + + Listens for incoming message from the server and handles them. This method run as a task on separate thread. + + + + + Raises the event. + + The . + + + + Resets connection-specific information to ensure state of a previous connection + does not affect new connections. + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Releases unmanaged resources and performs other cleanup operations before the + is reclaimed by garbage collection. + + + + + Create a new SSH session channel. + + + A new SSH session channel. + + + + + Create a new channel for a locally forwarded TCP/IP port. + + + A new channel for a locally forwarded TCP/IP port. + + + + + Creates a "forwarded-tcpip" SSH channel. + + + A new "forwarded-tcpip" SSH channel. + + + + + Sends a message to the server. + + The message to send. + The client is not connected. + The operation timed out. + The size of the packet exceeds the maximum size defined by the protocol. + + + + Sends a message to the server. + + The message to send. + + true if the message was sent to the server; otherwise, false. + + The size of the packet exceeds the maximum size defined by the protocol. + + This methods returns false when the attempt to send the message results in a + or a . + + + + + Gets the session semaphore that controls session channels. + + + The session semaphore. + + + + + Gets the next channel number. + + + The next channel number. + + + + + Gets a value indicating whether the session is connected. + + + true if the session is connected; otherwise, false. + + + This methods returns true in all but the following cases: + + + The is disposed. + + + The SSH_MSG_DISCONNECT message - which is used to disconnect from the server - has been sent. + + + The client has not been authenticated successfully. + + + The listener thread - which is used to receive messages from the server - has stopped. + + + The socket used to communicate with the server is no longer connected. + + + + + + + Gets the session id. + + + The session id, or null if the client has not been authenticated. + + + + + Gets the client init message. + + The client init message. + + + + Gets or sets the server version string. + + The server version. + + + + Gets or sets the client version string. + + The client version. + + + + Gets or sets the connection info. + + The connection info. + + + + Occurs when an error occurred. + + + + + Occurs when session has been disconnected from the server. + + + + + Occurs when host key received. + + + + + Occurs when message is received from the server. + + + + + Occurs when message is received from the server. + + + + + Occurs when message is received from the server. + + + + + Occurs when message is received from the server. + + + + + Occurs when message is received from the server. + + + + + Occurs when message is received from the server. + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Occurs when a message is received from the SSH server. + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Occurs when message received + + + + + Gets or sets the connection info. + + The connection info. + + + + Implementation of the SSH File Transfer Protocol (SFTP) over SSH. + + + + + Holds the instance that is used to communicate to the + SFTP server. + + + + + Holds the operation timeout. + + + + + Holds the size of the buffer. + + + + + Initializes a new instance of the class. + + The connection info. + is null. + + + + Initializes a new instance of the class. + + Connection host. + Connection port. + Authentication username. + Authentication password. + is null. + is invalid. -or- is null or contains only whitespace characters. + is not within and . + + + + Initializes a new instance of the class. + + Connection host. + Authentication username. + Authentication password. + is null. + is invalid. -or- is null contains only whitespace characters. + + + + Initializes a new instance of the class. + + Connection host. + Connection port. + Authentication username. + Authentication private key file(s) . + is null. + is invalid. -or- is nunullll or contains only whitespace characters. + is not within and . + + + + Initializes a new instance of the class. + + Connection host. + Authentication username. + Authentication private key file(s) . + is null. + is invalid. -or- is null or contains only whitespace characters. + + + + Initializes a new instance of the class. + + The connection info. + Specified whether this instance owns the connection info. + is null. + + If is true, the connection info will be disposed when this + instance is disposed. + + + + + Initializes a new instance of the class. + + The connection info. + Specified whether this instance owns the connection info. + The factory to use for creating new services. + is null. + is null. + + If is true, the connection info will be disposed when this + instance is disposed. + + + + + Changes remote directory to path. + + New directory path. + is null. + Client is not connected. + Permission to change directory denied by remote host. -or- A SSH command was denied by the server. + was not found on the remote host. + A SSH error where is the message from the remote host. + The method was called after the client was disposed. + + + + Changes permissions of file(s) to specified mode. + + File(s) path, may match multiple files. + The mode. + is null. + Client is not connected. + Permission to change permission on the path(s) was denied by the remote host. -or- A SSH command was denied by the server. + was not found on the remote host. + A SSH error where is the message from the remote host. + The method was called after the client was disposed. + + + + Creates remote directory specified by path. + + Directory path to create. + is null or contains only whitespace characters. + Client is not connected. + Permission to create the directory was denied by the remote host. -or- A SSH command was denied by the server. + A SSH error where is the message from the remote host. + The method was called after the client was disposed. + + + + Deletes remote directory specified by path. + + Directory to be deleted path. + is null or contains only whitespace characters. + Client is not connected. + was not found on the remote host. + Permission to delete the directory was denied by the remote host. -or- A SSH command was denied by the server. + A SSH error where is the message from the remote host. + The method was called after the client was disposed. + + + + Deletes remote file specified by path. + + File to be deleted path. + is null or contains only whitespace characters. + Client is not connected. + was not found on the remote host. + Permission to delete the file was denied by the remote host. -or- A SSH command was denied by the server. + A SSH error where is the message from the remote host. + The method was called after the client was disposed. + + + + Renames remote file from old path to new path. + + Path to the old file location. + Path to the new file location. + is null. -or- or is null. + Client is not connected. + Permission to rename the file was denied by the remote host. -or- A SSH command was denied by the server. + A SSH error where is the message from the remote host. + The method was called after the client was disposed. + + + + Renames remote file from old path to new path. + + Path to the old file location. + Path to the new file location. + if set to true then perform a posix rename. + is null. -or- or is null. + Client is not connected. + Permission to rename the file was denied by the remote host. -or- A SSH command was denied by the server. + A SSH error where is the message from the remote host. + The method was called after the client was disposed. + + + + Creates a symbolic link from old path to new path. + + The old path. + The new path. + is null. -or- is null or contains only whitespace characters. + Client is not connected. + Permission to create the symbolic link was denied by the remote host. -or- A SSH command was denied by the server. + A SSH error where is the message from the remote host. + The method was called after the client was disposed. + + + + Retrieves list of files in remote directory. + + The path. + The list callback. + + A list of files. + + is null. + Client is not connected. + Permission to list the contents of the directory was denied by the remote host. -or- A SSH command was denied by the server. + A SSH error where is the message from the remote host. + The method was called after the client was disposed. + + + + Begins an asynchronous operation of retrieving list of files in remote directory. + + The path. + The method to be called when the asynchronous write operation is completed. + A user-provided object that distinguishes this particular asynchronous write request from other requests. + The list callback. + + An that references the asynchronous operation. + + The method was called after the client was disposed. + + + + Ends an asynchronous operation of retrieving list of files in remote directory. + + The pending asynchronous SFTP request. + + A list of files. + + The object did not come from the corresponding async method on this type.-or- was called multiple times with the same . + + + + Gets reference to remote file or directory. + + The path. + + A reference to file object. + + Client is not connected. + was not found on the remote host. + is null. + The method was called after the client was disposed. + + + + Checks whether file or directory exists; + + The path. + + true if directory or file exists; otherwise false. + + is null or contains only whitespace characters. + Client is not connected. + Permission to perform the operation was denied by the remote host. -or- A SSH command was denied by the server. + A SSH error where is the message from the remote host. + The method was called after the client was disposed. + + + + Downloads remote file specified by the path into the stream. + + File to download. + Stream to write the file into. + The download callback. + is null. + is null or contains only whitespace characters. + Client is not connected. + Permission to perform the operation was denied by the remote host. -or- A SSH command was denied by the server. + was not found on the remote host./// + A SSH error where is the message from the remote host. + The method was called after the client was disposed. + + Method calls made by this method to , may under certain conditions result in exceptions thrown by the stream. + + + + + Begins an asynchronous file downloading into the stream. + + The path. + The output. + + An that references the asynchronous operation. + + is null. + is null or contains only whitespace characters. + Client is not connected. + Permission to perform the operation was denied by the remote host. -or- A SSH command was denied by the server. + A SSH error where is the message from the remote host. + The method was called after the client was disposed. + + Method calls made by this method to , may under certain conditions result in exceptions thrown by the stream. + + + + + Begins an asynchronous file downloading into the stream. + + The path. + The output. + The method to be called when the asynchronous write operation is completed. + + An that references the asynchronous operation. + + is null. + is null or contains only whitespace characters. + Client is not connected. + Permission to perform the operation was denied by the remote host. -or- A SSH command was denied by the server. + A SSH error where is the message from the remote host. + The method was called after the client was disposed. + + Method calls made by this method to , may under certain conditions result in exceptions thrown by the stream. + + + + + Begins an asynchronous file downloading into the stream. + + The path. + The output. + The method to be called when the asynchronous write operation is completed. + A user-provided object that distinguishes this particular asynchronous write request from other requests. + The download callback. + + An that references the asynchronous operation. + + is null. + is null or contains only whitespace characters. + The method was called after the client was disposed. + + Method calls made by this method to , may under certain conditions result in exceptions thrown by the stream. + + + + + Ends an asynchronous file downloading into the stream. + + The pending asynchronous SFTP request. + The object did not come from the corresponding async method on this type.-or- was called multiple times with the same . + Client is not connected. + Permission to perform the operation was denied by the remote host. -or- A SSH command was denied by the server. + The path was not found on the remote host. + A SSH error where is the message from the remote host. + + + + Uploads stream into remote file. + + Data input stream. + Remote file path. + The upload callback. + is null. + is null or contains only whitespace characters. + Client is not connected. + Permission to upload the file was denied by the remote host. -or- A SSH command was denied by the server. + A SSH error where is the message from the remote host. + The method was called after the client was disposed. + + Method calls made by this method to , may under certain conditions result in exceptions thrown by the stream. + + + + + Uploads stream into remote file. + + Data input stream. + Remote file path. + if set to true then existing file will be overwritten. + The upload callback. + is null. + is null or contains only whitespace characters. + Client is not connected. + Permission to upload the file was denied by the remote host. -or- A SSH command was denied by the server. + A SSH error where is the message from the remote host. + The method was called after the client was disposed. + + Method calls made by this method to , may under certain conditions result in exceptions thrown by the stream. + + + + + Begins an asynchronous uploading the stream into remote file. + + Data input stream. + Remote file path. + + An that references the asynchronous operation. + + is null. + is null or contains only whitespace characters. + Client is not connected. + Permission to list the contents of the directory was denied by the remote host. -or- A SSH command was denied by the server. + A SSH error where is the message from the remote host. + The method was called after the client was disposed. + + + Method calls made by this method to , may under certain conditions result in exceptions thrown by the stream. + + + If the remote file already exists, it is overwritten and truncated. + + + + + + Begins an asynchronous uploading the stream into remote file. + + Data input stream. + Remote file path. + The method to be called when the asynchronous write operation is completed. + + An that references the asynchronous operation. + + is null. + is null or contains only whitespace characters. + Client is not connected. + Permission to list the contents of the directory was denied by the remote host. -or- A SSH command was denied by the server. + A SSH error where is the message from the remote host. + The method was called after the client was disposed. + + + Method calls made by this method to , may under certain conditions result in exceptions thrown by the stream. + + + If the remote file already exists, it is overwritten and truncated. + + + + + + Begins an asynchronous uploading the stream into remote file. + + Data input stream. + Remote file path. + The method to be called when the asynchronous write operation is completed. + A user-provided object that distinguishes this particular asynchronous write request from other requests. + The upload callback. + + An that references the asynchronous operation. + + is null. + is null or contains only whitespace characters. + Client is not connected. + Permission to list the contents of the directory was denied by the remote host. -or- A SSH command was denied by the server. + A SSH error where is the message from the remote host. + The method was called after the client was disposed. + + + Method calls made by this method to , may under certain conditions result in exceptions thrown by the stream. + + + If the remote file already exists, it is overwritten and truncated. + + + + + + Begins an asynchronous uploading the stream into remote file. + + Data input stream. + Remote file path. + Specified whether an existing file can be overwritten. + The method to be called when the asynchronous write operation is completed. + A user-provided object that distinguishes this particular asynchronous write request from other requests. + The upload callback. + + An that references the asynchronous operation. + + is null. + is null or contains only whitespace characters. + The method was called after the client was disposed. + + + Method calls made by this method to , may under certain conditions result in exceptions thrown by the stream. + + + When refers to an existing file, set to true to overwrite and truncate that file. + If is false, the upload will fail and will throw an + . + + + + + + Ends an asynchronous uploading the stream into remote file. + + The pending asynchronous SFTP request. + The object did not come from the corresponding async method on this type.-or- was called multiple times with the same . + Client is not connected. + The directory of the file was not found on the remote host. + Permission to upload the file was denied by the remote host. -or- A SSH command was denied by the server. + A SSH error where is the message from the remote host. + + + + Gets status using statvfs@openssh.com request. + + The path. + + A instance that contains file status information. + + Client is not connected. + is null. + The method was called after the client was disposed. + + + + Appends lines to a file, creating the file if it does not already exist. + + The file to append the lines to. The file is created if it does not already exist. + The lines to append to the file. + isnull -or- is null. + Client is not connected. + The specified path is invalid, or its directory was not found on the remote host. + The method was called after the client was disposed. + + The characters are written to the file using UTF-8 encoding without a Byte-Order Mark (BOM) + + + + + Appends lines to a file by using a specified encoding, creating the file if it does not already exist. + + The file to append the lines to. The file is created if it does not already exist. + The lines to append to the file. + The character encoding to use. + is null. -or- is null. -or- is null. + Client is not connected. + The specified path is invalid, or its directory was not found on the remote host. + The method was called after the client was disposed. + + + + Appends the specified string to the file, creating the file if it does not already exist. + + The file to append the specified string to. + The string to append to the file. + is null. -or- is null. + Client is not connected. + The specified path is invalid, or its directory was not found on the remote host. + The method was called after the client was disposed. + + The characters are written to the file using UTF-8 encoding without a Byte-Order Mark (BOM). + + + + + Appends the specified string to the file, creating the file if it does not already exist. + + The file to append the specified string to. + The string to append to the file. + The character encoding to use. + is null. -or- is null. -or- is null. + Client is not connected. + The specified path is invalid, or its directory was not found on the remote host. + The method was called after the client was disposed. + + + + Creates a that appends UTF-8 encoded text to the specified file, + creating the file if it does not already exist. + + The path to the file to append to. + + A that appends text to a file using UTF-8 encoding without a + Byte-Order Mark (BOM). + + is null. + Client is not connected. + The specified path is invalid, or its directory was not found on the remote host. + The method was called after the client was disposed. + + + + Creates a that appends text to a file using the specified + encoding, creating the file if it does not already exist. + + The path to the file to append to. + The character encoding to use. + + A that appends text to a file using the specified encoding. + + is null. -or- is null. + Client is not connected. + The specified path is invalid, or its directory was not found on the remote host. + The method was called after the client was disposed. + + + + Creates or overwrites a file in the specified path. + + The path and name of the file to create. + + A that provides read/write access to the file specified in path. + + is null. + Client is not connected. + The specified path is invalid, or its directory was not found on the remote host. + The method was called after the client was disposed. + + If the target file already exists, it is first truncated to zero bytes. + + + + + Creates or overwrites the specified file. + + The path and name of the file to create. + The maximum number of bytes buffered for reads and writes to the file. + + A that provides read/write access to the file specified in path. + + is null. + Client is not connected. + The specified path is invalid, or its directory was not found on the remote host. + The method was called after the client was disposed. + + If the target file already exists, it is first truncated to zero bytes. + + + + + Creates or opens a file for writing UTF-8 encoded text. + + The file to be opened for writing. + + A that writes text to a file using UTF-8 encoding without + a Byte-Order Mark (BOM). + + is null. + Client is not connected. + The specified path is invalid, or its directory was not found on the remote host. + The method was called after the client was disposed. + + + If the target file already exists, it is overwritten. It is not first truncated to zero bytes. + + + If the target file does not exist, it is created. + + + + + + Creates or opens a file for writing text using the specified encoding. + + The file to be opened for writing. + The character encoding to use. + + A that writes to a file using the specified encoding. + + is null. + Client is not connected. + The specified path is invalid, or its directory was not found on the remote host. + The method was called after the client was disposed. + + + If the target file already exists, it is overwritten. It is not first truncated to zero bytes. + + + If the target file does not exist, it is created. + + + + + + Deletes the specified file or directory. + + The name of the file or directory to be deleted. Wildcard characters are not supported. + is null. + Client is not connected. + was not found on the remote host. + The method was called after the client was disposed. + + + + Returns the date and time the specified file or directory was last accessed. + + The file or directory for which to obtain access date and time information. + + A structure set to the date and time that the specified file or directory was last accessed. + This value is expressed in local time. + + is null. + Client is not connected. + The method was called after the client was disposed. + + + + Returns the date and time, in coordinated universal time (UTC), that the specified file or directory was last accessed. + + The file or directory for which to obtain access date and time information. + + A structure set to the date and time that the specified file or directory was last accessed. + This value is expressed in UTC time. + + is null. + Client is not connected. + The method was called after the client was disposed. + + + + Returns the date and time the specified file or directory was last written to. + + The file or directory for which to obtain write date and time information. + + A structure set to the date and time that the specified file or directory was last written to. + This value is expressed in local time. + + is null. + Client is not connected. + The method was called after the client was disposed. + + + + Returns the date and time, in coordinated universal time (UTC), that the specified file or directory was last written to. + + The file or directory for which to obtain write date and time information. + + A structure set to the date and time that the specified file or directory was last written to. + This value is expressed in UTC time. + + is null. + Client is not connected. + The method was called after the client was disposed. + + + + Opens a on the specified path with read/write access. + + The file to open. + A value that specifies whether a file is created if one does not exist, and determines whether the contents of existing files are retained or overwritten. + + An unshared that provides access to the specified file, with the specified mode and read/write access. + + is null. + Client is not connected. + The method was called after the client was disposed. + + + + Opens a on the specified path, with the specified mode and access. + + The file to open. + A value that specifies whether a file is created if one does not exist, and determines whether the contents of existing files are retained or overwritten. + A value that specifies the operations that can be performed on the file. + + An unshared that provides access to the specified file, with the specified mode and access. + + is null. + Client is not connected. + The method was called after the client was disposed. + + + + Opens an existing file for reading. + + The file to be opened for reading. + + A read-only on the specified path. + + is null. + Client is not connected. + The method was called after the client was disposed. + + + + Opens an existing UTF-8 encoded text file for reading. + + The file to be opened for reading. + + A on the specified path. + + is null. + Client is not connected. + The method was called after the client was disposed. + + + + Opens a file for writing. + + The file to be opened for writing. + + An unshared object on the specified path with access. + + is null. + Client is not connected. + The method was called after the client was disposed. + + If the file does not exist, it is created. + + + + + Opens a binary file, reads the contents of the file into a byte array, and closes the file. + + The file to open for reading. + + A byte array containing the contents of the file. + + is null. + Client is not connected. + The method was called after the client was disposed. + + + + Opens a text file, reads all lines of the file using UTF-8 encoding, and closes the file. + + The file to open for reading. + + A string array containing all lines of the file. + + is null. + Client is not connected. + The method was called after the client was disposed. + + + + Opens a file, reads all lines of the file with the specified encoding, and closes the file. + + The file to open for reading. + The encoding applied to the contents of the file. + + A string array containing all lines of the file. + + is null. + Client is not connected. + The method was called after the client was disposed. + + + + Opens a text file, reads all lines of the file with the UTF-8 encoding, and closes the file. + + The file to open for reading. + + A string containing all lines of the file. + + is null. + Client is not connected. + The method was called after the client was disposed. + + + + Opens a file, reads all lines of the file with the specified encoding, and closes the file. + + The file to open for reading. + The encoding applied to the contents of the file. + + A string containing all lines of the file. + + is null. + Client is not connected. + The method was called after the client was disposed. + + + + Reads the lines of a file with the UTF-8 encoding. + + The file to read. + + The lines of the file. + + is null. + Client is not connected. + The method was called after the client was disposed. + + + + Read the lines of a file that has a specified encoding. + + The file to read. + The encoding that is applied to the contents of the file. + + The lines of the file. + + is null. + Client is not connected. + The method was called after the client was disposed. + + + + Sets the date and time the specified file was last accessed. + + The file for which to set the access date and time information. + A containing the value to set for the last access date and time of path. This value is expressed in local time. + + + + Sets the date and time, in coordinated universal time (UTC), that the specified file was last accessed. + + The file for which to set the access date and time information. + A containing the value to set for the last access date and time of path. This value is expressed in UTC time. + + + + Sets the date and time that the specified file was last written to. + + The file for which to set the date and time information. + A containing the value to set for the last write date and time of path. This value is expressed in local time. + + + + Sets the date and time, in coordinated universal time (UTC), that the specified file was last written to. + + The file for which to set the date and time information. + A containing the value to set for the last write date and time of path. This value is expressed in UTC time. + + + + Writes the specified byte array to the specified file, and closes the file. + + The file to write to. + The bytes to write to the file. + is null. + Client is not connected. + The specified path is invalid, or its directory was not found on the remote host. + The method was called after the client was disposed. + + + If the target file already exists, it is overwritten. It is not first truncated to zero bytes. + + + If the target file does not exist, it is created. + + + + + + Writes a collection of strings to the file using the UTF-8 encoding, and closes the file. + + The file to write to. + The lines to write to the file. + is null. + Client is not connected. + The specified path is invalid, or its directory was not found on the remote host. + The method was called after the client was disposed. + + + The characters are written to the file using UTF-8 encoding without a Byte-Order Mark (BOM). + + + If the target file already exists, it is overwritten. It is not first truncated to zero bytes. + + + If the target file does not exist, it is created. + + + + + + Write the specified string array to the file using the UTF-8 encoding, and closes the file. + + The file to write to. + The string array to write to the file. + is null. + Client is not connected. + The specified path is invalid, or its directory was not found on the remote host. + The method was called after the client was disposed. + + + The characters are written to the file using UTF-8 encoding without a Byte-Order Mark (BOM). + + + If the target file already exists, it is overwritten. It is not first truncated to zero bytes. + + + If the target file does not exist, it is created. + + + + + + Writes a collection of strings to the file using the specified encoding, and closes the file. + + The file to write to. + The lines to write to the file. + The character encoding to use. + is null. + Client is not connected. + The specified path is invalid, or its directory was not found on the remote host. + The method was called after the client was disposed. + + + If the target file already exists, it is overwritten. It is not first truncated to zero bytes. + + + If the target file does not exist, it is created. + + + + + + Writes the specified string array to the file by using the specified encoding, and closes the file. + + The file to write to. + The string array to write to the file. + An object that represents the character encoding applied to the string array. + is null. + Client is not connected. + The specified path is invalid, or its directory was not found on the remote host. + The method was called after the client was disposed. + + + If the target file already exists, it is overwritten. It is not first truncated to zero bytes. + + + If the target file does not exist, it is created. + + + + + + Writes the specified string to the file using the UTF-8 encoding, and closes the file. + + The file to write to. + The string to write to the file. + is null. + Client is not connected. + The specified path is invalid, or its directory was not found on the remote host. + The method was called after the client was disposed. + + + The characters are written to the file using UTF-8 encoding without a Byte-Order Mark (BOM). + + + If the target file already exists, it is overwritten. It is not first truncated to zero bytes. + + + If the target file does not exist, it is created. + + + + + + Writes the specified string to the file using the specified encoding, and closes the file. + + The file to write to. + The string to write to the file. + The encoding to apply to the string. + is null. + Client is not connected. + The specified path is invalid, or its directory was not found on the remote host. + The method was called after the client was disposed. + + + If the target file already exists, it is overwritten. It is not first truncated to zero bytes. + + + If the target file does not exist, it is created. + + + + + + Gets the of the file on the path. + + The path to the file. + + The of the file on the path. + + is null. + Client is not connected. + was not found on the remote host. + The method was called after the client was disposed. + + + + Sets the specified of the file on the specified path. + + The path to the file. + The desired . + is null. + Client is not connected. + The method was called after the client was disposed. + + + + Synchronizes the directories. + + The source path. + The destination path. + The search pattern. + + A list of uploaded files. + + is null. + is null or contains only whitespace. + was not found on the remote host. + + + + Begins the synchronize directories. + + The source path. + The destination path. + The search pattern. + The async callback. + The state. + + An that represents the asynchronous directory synchronization. + + is null. + is null or contains only whitespace. + + + + Ends the synchronize directories. + + The async result. + + A list of uploaded files. + + The object did not come from the corresponding async method on this type.-or- was called multiple times with the same . + The destination path was not found on the remote host. + + + + Internals the list directory. + + The path. + The list callback. + + A list of files in the specfied directory. + + is null. + Client not connected. + + + + Internals the download file. + + The path. + The output. + An that references the asynchronous request. + The download callback. + is null. + is null or contains whitespace. + Client not connected. + + + + Internals the upload file. + + The input. + The path. + The flags. + An that references the asynchronous request. + The upload callback. + is null. + is null or contains whitespace. + Client not connected. + + + + Called when client is connected to the server. + + + + + Called when client is disconnecting from the server. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Gets or sets the operation timeout. + + + The timeout to wait until an operation completes. The default value is negative + one (-1) milliseconds, which indicates an infinite timeout period. + + The method was called after the client was disposed. + + + + Gets or sets the maximum size of the buffer in bytes. + + + The size of the buffer. The default buffer size is 32768 bytes (32 KB). + + + + For write operations, this limits the size of the payload for + individual SSH_FXP_WRITE messages. The actual size is always + capped at the maximum packet size supported by the peer + (minus the size of protocol fields). + + + For read operations, this controls the size of the payload which + is requested from the peer in a SSH_FXP_READ message. The peer + will send the requested number of bytes in a SSH_FXP_DATA message, + possibly split over multiple SSH_MSG_CHANNEL_DATA messages. + + + To optimize the size of the SSH packets sent by the peer, + the actual requested size will take into account the size of the + SSH_FXP_DATA protocol fields. + + + The size of the each indivual SSH_FXP_DATA message is limited to the + local maximum packet size of the channel, which is set to 64 KB + for SSH.NET. However, the peer can limit this even further. + + + The method was called after the client was disposed. + + + + Gets remote working directory. + + Client is not connected. + The method was called after the client was disposed. + + + + Gets sftp protocol version. + + Client is not connected. + The method was called after the client was disposed. + + + + SSH_FXF_READ + + + + + SSH_FXF_WRITE + + + + + SSH_FXF_APPEND + + + + + SSH_FXF_CREAT + + + + + SSH_FXF_TRUNC + + + + + SSH_FXF_EXCL + + + + + Writes the current message to the specified . + + The to write the message to. + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Initializes a new instance of the class. + + The protocol version. + The request id. + Specifies the path name of the new link to create. + Specifies the path of a target object to which the newly created link will refer. In the case of a symbolic link, this path may not exist. + if set to false the link should be a hard link, or a second directory entry referring to the same file or directory object. + The status action. + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Gets the zero-based offset (in bytes) relative to the beginning of the file that the write + must start at. + + + The zero-based offset (in bytes) relative to the beginning of the file that the write must + start at. + + + + + Gets the buffer holding the data to write. + + + The buffer holding the data to write. + + + + + Gets the zero-based offset in at which to begin taking bytes to + write. + + + The zero-based offset in at which to begin taking bytes to write. + + + + + Gets the length (in bytes) of the data to write. + + + The length (in bytes) of the data to write. + + + + + Gets the size of the message in bytes. + + + The size of the messages in bytes. + + + + + Encapsulates the results of an asynchronous download operation. + + + + + Initializes a new instance of the class. + + The async callback. + The state. + + + + Updates asynchronous operation status information. + + Number of downloaded bytes. + + + + Gets or sets a value indicating whether to cancel asynchronous download operation. + + + true if download operation to be canceled; otherwise, false. + + + Download operation will be canceled after finishing uploading current buffer. + + + + + Gets the number of downloaded bytes. + + + + + Represents SFTP file information + + + + + Initializes a new instance of the class. + + The SFTP session. + Full path of the directory or file. + Attributes of the directory or file. + or is null. + + + + Sets file permissions. + + The mode. + + + + Permanently deletes a file on remote machine. + + + + + Moves a specified file to a new location on remote machine, providing the option to specify a new file name. + + The path to move the file to, which can specify a different file name. + is null. + + + + Updates file status on the server. + + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Gets the file attributes. + + + + + Gets the full path of the directory or file. + + + + + For files, gets the name of the file. For directories, gets the name of the last directory in the hierarchy if a hierarchy exists. + Otherwise, the Name property gets the name of the directory. + + + + + Gets or sets the time the current file or directory was last accessed. + + + The time that the current file or directory was last accessed. + + + + + Gets or sets the time when the current file or directory was last written to. + + + The time the current file was last written. + + + + + Gets or sets the time, in coordinated universal time (UTC), the current file or directory was last accessed. + + + The time that the current file or directory was last accessed. + + + + + Gets or sets the time, in coordinated universal time (UTC), when the current file or directory was last written to. + + + The time the current file was last written. + + + + + Gets or sets the size, in bytes, of the current file. + + + The size of the current file in bytes. + + + + + Gets or sets file user id. + + + File user id. + + + + + Gets or sets file group id. + + + File group id. + + + + + Gets a value indicating whether file represents a socket. + + + true if file represents a socket; otherwise, false. + + + + + Gets a value indicating whether file represents a symbolic link. + + + true if file represents a symbolic link; otherwise, false. + + + + + Gets a value indicating whether file represents a regular file. + + + true if file represents a regular file; otherwise, false. + + + + + Gets a value indicating whether file represents a block device. + + + true if file represents a block device; otherwise, false. + + + + + Gets a value indicating whether file represents a directory. + + + true if file represents a directory; otherwise, false. + + + + + Gets a value indicating whether file represents a character device. + + + true if file represents a character device; otherwise, false. + + + + + Gets a value indicating whether file represents a named pipe. + + + true if file represents a named pipe; otherwise, false. + + + + + Gets or sets a value indicating whether the owner can read from this file. + + + true if owner can read from this file; otherwise, false. + + + + + Gets or sets a value indicating whether the owner can write into this file. + + + true if owner can write into this file; otherwise, false. + + + + + Gets or sets a value indicating whether the owner can execute this file. + + + true if owner can execute this file; otherwise, false. + + + + + Gets or sets a value indicating whether the group members can read from this file. + + + true if group members can read from this file; otherwise, false. + + + + + Gets or sets a value indicating whether the group members can write into this file. + + + true if group members can write into this file; otherwise, false. + + + + + Gets or sets a value indicating whether the group members can execute this file. + + + true if group members can execute this file; otherwise, false. + + + + + Gets or sets a value indicating whether the others can read from this file. + + + true if others can read from this file; otherwise, false. + + + + + Gets or sets a value indicating whether the others can write into this file. + + + true if others can write into this file; otherwise, false. + + + + + Gets or sets a value indicating whether the others can execute this file. + + + true if others can execute this file; otherwise, false. + + + + + Contains SFTP file attributes. + + + + + Sets the permissions. + + The mode. + + + + Returns a byte array representing the current . + + + A byte array representing the current . + + + + + Gets or sets the time the current file or directory was last accessed. + + + The time that the current file or directory was last accessed. + + + + + Gets or sets the time when the current file or directory was last written to. + + + The time the current file was last written. + + + + + Gets or sets the size, in bytes, of the current file. + + + The size of the current file in bytes. + + + + + Gets or sets file user id. + + + File user id. + + + + + Gets or sets file group id. + + + File group id. + + + + + Gets a value indicating whether file represents a socket. + + + true if file represents a socket; otherwise, false. + + + + + Gets a value indicating whether file represents a symbolic link. + + + true if file represents a symbolic link; otherwise, false. + + + + + Gets a value indicating whether file represents a regular file. + + + true if file represents a regular file; otherwise, false. + + + + + Gets a value indicating whether file represents a block device. + + + true if file represents a block device; otherwise, false. + + + + + Gets a value indicating whether file represents a directory. + + + true if file represents a directory; otherwise, false. + + + + + Gets a value indicating whether file represents a character device. + + + true if file represents a character device; otherwise, false. + + + + + Gets a value indicating whether file represents a named pipe. + + + true if file represents a named pipe; otherwise, false. + + + + + Gets a value indicating whether the owner can read from this file. + + + true if owner can read from this file; otherwise, false. + + + + + Gets a value indicating whether the owner can write into this file. + + + true if owner can write into this file; otherwise, false. + + + + + Gets a value indicating whether the owner can execute this file. + + + true if owner can execute this file; otherwise, false. + + + + + Gets a value indicating whether the group members can read from this file. + + + true if group members can read from this file; otherwise, false. + + + + + Gets a value indicating whether the group members can write into this file. + + + true if group members can write into this file; otherwise, false. + + + + + Gets a value indicating whether the group members can execute this file. + + + true if group members can execute this file; otherwise, false. + + + + + Gets a value indicating whether the others can read from this file. + + + true if others can read from this file; otherwise, false. + + + + + Gets a value indicating whether the others can write into this file. + + + true if others can write into this file; otherwise, false. + + + + + Gets a value indicating whether the others can execute this file. + + + true if others can execute this file; otherwise, false. + + + + + Gets or sets the extensions. + + + The extensions. + + + + + Holds the size of the file, when available. + + + + + Holds a value indicating whether EOF has already been signaled by the SSH server. + + + + + Holds a value indicating whether the client has read up to the end of the file. + + + + + Initializes a new instance with the specified handle, + and the maximum number of pending reads. + + + + The size of a individual read-ahead chunk. + The maximum number of pending reads. + The size of the file, if known; otherwise, null. + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Returns a value indicating whether the read-ahead loop should be continued. + + + true if the read-ahead loop should be continued; otherwise, false. + + + + + Exposes a around a remote SFTP file, supporting both synchronous and asynchronous read and write operations. + + + + + Releases unmanaged resources and performs other cleanup operations before the + is reclaimed by garbage collection. + + + + + Clears all buffers for this stream and causes any buffered data to be written to the file. + + An I/O error occurs. + Stream is closed. + + + + Reads a sequence of bytes from the current stream and advances the position within the stream by the + number of bytes read. + + An array of bytes. When this method returns, the buffer contains the specified byte array with the values between and ( + - 1) replaced by the bytes read from the current source. + The zero-based byte offset in at which to begin storing the data read from the current stream. + The maximum number of bytes to be read from the current stream. + + The total number of bytes read into the buffer. This can be less than the number of bytes requested + if that many bytes are not currently available, or zero (0) if the end of the stream has been reached. + + The sum of and is larger than the buffer length. + is null. + or is negative. + An I/O error occurs. + The stream does not support reading. + Methods were called after the stream was closed. + + + This method attempts to read up to bytes. This either from the buffer, from the + server (using one or more SSH_FXP_READ requests) or using a combination of both. + + + The read loop is interrupted when either bytes are read, the server returns zero + bytes (EOF) or less bytes than the read buffer size. + + + When a server returns less number of bytes than the read buffer size, this may indicate that EOF has + been reached. A subsequent (SSH_FXP_READ) server request is necessary to make sure EOF has effectively + been reached. Breaking out of the read loop avoids reading from the server twice to determine EOF: once in + the read loop, and once upon the next or invocation. + + + + + + Reads a byte from the stream and advances the position within the stream by one byte, or returns -1 if at the end of the stream. + + + The unsigned byte cast to an , or -1 if at the end of the stream. + + The stream does not support reading. + Methods were called after the stream was closed. + Read operation failed. + + + + Sets the position within the current stream. + + A byte offset relative to the parameter. + A value of type indicating the reference point used to obtain the new position. + + The new position within the current stream. + + An I/O error occurs. + The stream does not support seeking, such as if the stream is constructed from a pipe or console output. + Methods were called after the stream was closed. + + + + Sets the length of the current stream. + + The desired length of the current stream in bytes. + An I/O error occurs. + The stream does not support both writing and seeking. + Methods were called after the stream was closed. + must be greater than zero. + + + Buffers are first flushed. + + + If the specified value is less than the current length of the stream, the stream is truncated and - if the + current position is greater than the new length - the current position is moved to the last byte of the stream. + + + If the given value is greater than the current length of the stream, the stream is expanded and the current + position remains the same. + + + + + + Writes a sequence of bytes to the current stream and advances the current position within this stream by the number of bytes written. + + An array of bytes. This method copies bytes from to the current stream. + The zero-based byte offset in at which to begin copying bytes to the current stream. + The number of bytes to be written to the current stream. + The sum of and is greater than the buffer length. + is null. + or is negative. + An I/O error occurs. + The stream does not support writing. + Methods were called after the stream was closed. + + + + Writes a byte to the current position in the stream and advances the position within the stream by one byte. + + The byte to write to the stream. + An I/O error occurs. + The stream does not support writing, or the stream is already closed. + Methods were called after the stream was closed. + + + + Releases the unmanaged resources used by the and optionally releases the managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Flushes the read data from the buffer. + + + + + Flush any buffered write data to the file. + + + + + Setups the read. + + + + + Setups the write. + + + + + Gets a value indicating whether the current stream supports reading. + + + true if the stream supports reading; otherwise, false. + + + + + Gets a value indicating whether the current stream supports seeking. + + + true if the stream supports seeking; otherwise, false. + + + + + Gets a value indicating whether the current stream supports writing. + + + true if the stream supports writing; otherwise, false. + + + + + Indicates whether timeout properties are usable for . + + + true in all cases. + + + + + Gets the length in bytes of the stream. + + A long value representing the length of the stream in bytes. + A class derived from Stream does not support seeking. + Methods were called after the stream was closed. + IO operation failed. + + + + Gets or sets the position within the current stream. + + The current position within the stream. + An I/O error occurs. + The stream does not support seeking. + Methods were called after the stream was closed. + + + + Gets the name of the path that was used to construct the current . + + + The name of the path that was used to construct the current . + + + + + Gets the operating system file handle for the file that the current encapsulates. + + + The operating system file handle for the file that the current encapsulates. + + + + + Gets or sets the operation timeout. + + + The timeout. + + + + + Contains File system information exposed by statvfs@openssh.com request. + + + + + Initializes a new instance of the class. + + The bsize. + The frsize. + The blocks. + The bfree. + The bavail. + The files. + The ffree. + The favail. + The sid. + The flag. + The namemax. + + + + Gets the file system block size. + + + The file system block size. + + + + + Gets the fundamental file system size of the block. + + + The fundamental file system block size. + + + + + Gets the total blocks. + + + The total blocks. + + + + + Gets the free blocks. + + + The free blocks. + + + + + Gets the available blocks. + + + The available blocks. + + + + + Gets the total nodes. + + + The total nodes. + + + + + Gets the free nodes. + + + The free nodes. + + + + + Gets the available nodes. + + + The available nodes. + + + + + Gets the sid. + + + The sid. + + + + + Gets a value indicating whether this instance is read only. + + + true if this instance is read only; otherwise, false. + + + + + Gets a value indicating whether [supports set uid]. + + + true if [supports set uid]; otherwise, false. + + + + + Gets the max name lenght. + + + The max name lenght. + + + + + Encapsulates the results of an asynchronous directory list operation. + + + + + Initializes a new instance of the class. + + The async callback. + The state. + + + + Updates asynchronous operation status information. + + The files read. + + + + Gets the number of files read so far. + + + + + SSH_FXP_INIT + + + + + SSH_FXP_VERSION + + + + + SSH_FXP_OPEN + + + + + SSH_FXP_CLOSE + + + + + SSH_FXP_READ + + + + + SSH_FXP_WRITE + + + + + SSH_FXP_LSTAT + + + + + SSH_FXP_FSTAT + + + + + SSH_FXP_SETSTAT + + + + + SSH_FXP_FSETSTAT + + + + + SSH_FXP_OPENDIR + + + + + SSH_FXP_READDIR + + + + + SSH_FXP_REMOVE + + + + + SSH_FXP_MKDIR + + + + + SSH_FXP_RMDIR + + + + + SSH_FXP_REALPATH + + + + + SSH_FXP_STAT + + + + + SSH_FXP_RENAME + + + + + SSH_FXP_READLINK + + + + + SSH_FXP_SYMLINK + + + + + SSH_FXP_LINK + + + + + SSH_FXP_BLOCK + + + + + SSH_FXP_UNBLOCK + + + + + SSH_FXP_STATUS + + + + + SSH_FXP_HANDLE + + + + + SSH_FXP_DATA + + + + + SSH_FXP_NAME + + + + + SSH_FXP_ATTRS + + + + + SSH_FXP_EXTENDED + + + + + SSH_FXP_EXTENDED_REPLY + + + + + Changes the current working directory to the specified path. + + The new working directory. + + + + Resolves a given path into an absolute path on the server. + + The path to resolve. + + The absolute path. + + + + + Performs SSH_FXP_OPEN request + + The path. + The flags. + if set to true returns null instead of throwing an exception. + File handle. + + + + Performs SSH_FXP_OPEN request + + The path. + The flags. + The delegate that is executed when completes. + An object that contains any additional user-defined data. + + A that represents the asynchronous call. + + + + + Handles the end of an asynchronous open. + + An that represents an asynchronous call. + + A array representing a file handle. + + + If all available data has been read, the method completes + immediately and returns zero bytes. + + is null. + + + + Performs SSH_FXP_CLOSE request. + + The handle. + + + + Performs SSH_FXP_CLOSE request. + + The handle. + The delegate that is executed when completes. + An object that contains any additional user-defined data. + + A that represents the asynchronous call. + + + + + Handles the end of an asynchronous close. + + An that represents an asynchronous call. + is null. + + + + Begins an asynchronous read using a SSH_FXP_READ request. + + The handle to the file to read from. + The offset in the file to start reading from. + The number of bytes to read. + The delegate that is executed when completes. + An object that contains any additional user-defined data. + + A that represents the asynchronous call. + + + + + Handles the end of an asynchronous read. + + An that represents an asynchronous call. + + A array representing the data read. + + + If all available data has been read, the method completes + immediately and returns zero bytes. + + is null. + + + + Performs SSH_FXP_READ request. + + The handle. + The offset. + The length. + data array; null if EOF + + + + Performs SSH_FXP_WRITE request. + + The handle. + The the zero-based offset (in bytes) relative to the beginning of the file that the write must start at. + The buffer holding the data to write. + the zero-based offset in at which to begin taking bytes to write. + The length (in bytes) of the data to write. + The wait event handle if needed. + The callback to invoke when the write has completed. + + + + Performs SSH_FXP_LSTAT request. + + The path. + + File attributes + + + + + Performs SSH_FXP_LSTAT request. + + The path. + The delegate that is executed when completes. + An object that contains any additional user-defined data. + + A that represents the asynchronous call. + + + + + Handles the end of an asynchronous SSH_FXP_LSTAT request. + + An that represents an asynchronous call. + + The file attributes. + + is null. + + + + Performs SSH_FXP_FSTAT request. + + The handle. + if set to true returns null instead of throwing an exception. + + File attributes + + + + + Performs SSH_FXP_SETSTAT request. + + The path. + The attributes. + + + + Performs SSH_FXP_FSETSTAT request. + + The handle. + The attributes. + + + + Performs SSH_FXP_OPENDIR request + + The path. + if set to true returns null instead of throwing an exception. + File handle. + + + + Performs SSH_FXP_READDIR request + + The handle. + + + + + Performs SSH_FXP_REMOVE request. + + The path. + + + + Performs SSH_FXP_MKDIR request. + + The path. + + + + Performs SSH_FXP_RMDIR request. + + The path. + + + + Performs SSH_FXP_REALPATH request + + The path. + if set to true returns null instead of throwing an exception. + + The absolute path. + + + + + Performs SSH_FXP_REALPATH request. + + The path. + The delegate that is executed when completes. + An object that contains any additional user-defined data. + + A that represents the asynchronous call. + + + + + Handles the end of an asynchronous SSH_FXP_REALPATH request. + + An that represents an asynchronous call. + + The absolute path. + + is null. + + + + Performs SSH_FXP_STAT request. + + The path. + if set to true returns null instead of throwing an exception. + + File attributes + + + + + Performs SSH_FXP_STAT request + + The path. + The delegate that is executed when completes. + An object that contains any additional user-defined data. + + A that represents the asynchronous call. + + + + + Handles the end of an asynchronous stat. + + An that represents an asynchronous call. + + The file attributes. + + is null. + + + + Performs SSH_FXP_RENAME request. + + The old path. + The new path. + + + + Performs SSH_FXP_READLINK request. + + The path. + if set to true returns null instead of throwing an exception. + + + + + Performs SSH_FXP_SYMLINK request. + + The linkpath. + The targetpath. + + + + Performs posix-rename@openssh.com extended request. + + The old path. + The new path. + + + + Performs statvfs@openssh.com extended request. + + The path. + if set to true [null on error]. + + + + + Performs fstatvfs@openssh.com extended request. + + The file handle. + if set to true [null on error]. + + + + + + Performs hardlink@openssh.com extended request. + + The old path. + The new path. + + + + Calculates the optimal size of the buffer to read data from the channel. + + The buffer size configured on the client. + + The optimal size of the buffer to read data from the channel. + + + + + Calculates the optimal size of the buffer to write data on the channel. + + The buffer size configured on the client. + The file handle. + + The optimal size of the buffer to write data on the channel. + + + Currently, we do not take the remote window size into account. + + + + + Gets the character encoding to use. + + + + + Gets the remote working directory. + + + The remote working directory. + + + + + Gets the SFTP protocol version. + + + The SFTP protocol version. + + + + + Gets the next request id for sftp session. + + + + + Encapsulates the results of an asynchronous directory synchronization operation. + + + + + Initializes a new instance of the class. + + The async callback. + The state. + + + + Updates asynchronous operation status information. + + The files read. + + + + Gets the number of files read so far. + + + + + Encapsulates the results of an asynchronous upload operation. + + + + + Initializes a new instance of the class. + + The async callback. + The state. + + + + Updates asynchronous operation status information. + + Number of uploaded bytes. + + + + Gets or sets a value indicating whether to cancel asynchronous upload operation + + + true if upload operation to be canceled; otherwise, false. + + + Upload operation will be canceled after finishing uploading current buffer. + + + + + Gets the number of uploaded bytes. + + + + + SSH_FX_OK + + + + + SSH_FX_EOF + + + + + SSH_FX_NO_SUCH_FILE + + + + + SSH_FX_PERMISSION_DENIED + + + + + SSH_FX_FAILURE + + + + + SSH_FX_BAD_MESSAGE + + + + + SSH_FX_NO_CONNECTION + + + + + SSH_FX_CONNECTION_LOST + + + + + SSH_FX_OP_UNSUPPORTED + + + + + SSH_FX_INVALID_HANDLE + + + + + SSH_FX_NO_SUCH_PATH + + + + + SSH_FX_FILE_ALREADY_EXISTS + + + + + SSH_FX_WRITE_PROTECT + + + + + SSH_FX_NO_MEDIA + + + + + SSH_FX_NO_SPACE_ON_FILESYSTEM + + + + + SSH_FX_QUOTA_EXCEEDED + + + + + SSH_FX_UNKNOWN_PRINCIPAL + + + + + SSH_FX_LOCK_CONFLICT + + + + + SSH_FX_DIR_NOT_EMPTY + + + + + SSH_FX_NOT_A_DIRECTORY + + + + + SSH_FX_INVALID_FILENAME + + + + + SSH_FX_LINK_LOOP + + + + + SSH_FX_CANNOT_DELETE + + + + + SSH_FX_INVALID_PARAMETER + + + + + SSH_FX_FILE_IS_A_DIRECTORY + + + + + SSH_FX_BYTE_RANGE_LOCK_CONFLICT + + + + + SSH_FX_BYTE_RANGE_LOCK_REFUSED + + + + + SSH_FX_DELETE_PENDING + + + + + SSH_FX_FILE_CORRUPT + + + + + SSH_FX_OWNER_INVALID + + + + + SSH_FX_GROUP_INVALID + + + + + SSH_FX_NO_MATCHING_BYTE_RANGE_LOCK + + + + + Represents instance of the SSH shell object + + + + + Initializes a new instance of the class. + + The session. + The input. + The output. + The extended output. + Name of the terminal. + The columns. + The rows. + The width. + The height. + The terminal modes. + Size of the buffer for output stream. + + + + Starts this shell. + + Shell is started. + + + + Stops this shell. + + Shell is not started. + + + + Unsubscribes the current from session events. + + The session. + + Does nothing when is null. + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Releases unmanaged resources and performs other cleanup operations before the + is reclaimed by garbage collection. + + + + + Gets a value indicating whether this shell is started. + + + true if started is started; otherwise, false. + + + + + Occurs when shell is starting. + + + + + Occurs when shell is started. + + + + + Occurs when shell is stopping. + + + + + Occurs when shell is stopped. + + + + + Occurs when an error occurred. + + + + + Contains operation for working with SSH Shell. + + + + + Clears all buffers for this stream and causes any buffered data to be written to the underlying device. + + An I/O error occurs. + + + + Reads a sequence of bytes from the current stream and advances the position within the stream by the number of bytes read. + + An array of bytes. When this method returns, the buffer contains the specified byte array with the values between and ( + - 1) replaced by the bytes read from the current source. + The zero-based byte offset in at which to begin storing the data read from the current stream. + The maximum number of bytes to be read from the current stream. + + The total number of bytes read into the buffer. This can be less than the number of bytes requested if that many bytes are not currently available, or zero (0) if the end of the stream has been reached. + + The sum of and is larger than the buffer length. + is null. + or is negative. + An I/O error occurs. + The stream does not support reading. + Methods were called after the stream was closed. + + + + This method is not supported. + + A byte offset relative to the parameter. + A value of type indicating the reference point used to obtain the new position. + + The new position within the current stream. + + An I/O error occurs. + The stream does not support seeking, such as if the stream is constructed from a pipe or console output. + Methods were called after the stream was closed. + + + + This method is not supported. + + The desired length of the current stream in bytes. + An I/O error occurs. + The stream does not support both writing and seeking, such as if the stream is constructed from a pipe or console output. + Methods were called after the stream was closed. + + + + Writes a sequence of bytes to the current stream and advances the current position within this stream by the number of bytes written. + + An array of bytes. This method copies bytes from to the current stream. + The zero-based byte offset in at which to begin copying bytes to the current stream. + The number of bytes to be written to the current stream. + The sum of and is greater than the buffer length. + is null. + or is negative. + An I/O error occurs. + The stream does not support writing. + Methods were called after the stream was closed. + + + + Expects the specified expression and performs action when one is found. + + The expected expressions and actions to perform. + + + + Expects the specified expression and performs action when one is found. + + Time to wait for input. + The expected expressions and actions to perform, if the specified time elapsed and expected condition have not met, that method will exit without executing any action. + + + + Begins the expect. + + The expect actions. + + An that references the asynchronous operation. + + + + + Begins the expect. + + The callback. + The expect actions. + + An that references the asynchronous operation. + + + + + Begins the expect. + + The callback. + The state. + The expect actions. + + An that references the asynchronous operation. + + + + + Begins the expect. + + The timeout. + The callback. + The state. + The expect actions. + + An that references the asynchronous operation. + + + + + Ends the execute. + + The async result. + Either the IAsyncResult object did not come from the corresponding async method on this type, or EndExecute was called multiple times with the same IAsyncResult. + + + + Expects the expression specified by text. + + The text to expect. + + Text available in the shell that ends with expected text. + + + + + Expects the expression specified by text. + + The text to expect. + Time to wait for input. + + The text available in the shell that ends with expected text, or null if the specified time has elapsed. + + + + + Expects the expression specified by regular expression. + + The regular expression to expect. + + The text available in the shell that contains all the text that ends with expected expression. + + + + + Expects the expression specified by regular expression. + + The regular expression to expect. + Time to wait for input. + + The text available in the shell that contains all the text that ends with expected expression, + or null if the specified time has elapsed. + + + + + Reads the line from the shell. If line is not available it will block the execution and will wait for new line. + + + The line read from the shell. + + + + + Reads a line from the shell. If line is not available it will block the execution and will wait for new line. + + Time to wait for input. + + The line read from the shell, or null when no input is received for the specified timeout. + + + + + Reads text available in the shell. + + + The text available in the shell. + + + + + Writes the specified text to the shell. + + The text to be written to the shell. + + If is null, nothing is written. + + + + + Writes the line to the shell. + + The line to be written to the shell. + + If is null, only the line terminator is written. + + + + + Releases the unmanaged resources used by the and optionally releases the managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Unsubscribes the current from session events. + + The session. + + Does nothing when is null. + + + + + Occurs when data was received. + + + + + Occurs when an error occurred. + + + + + Gets a value that indicates whether data is available on the to be read. + + + true if data is available to be read; otherwise, false. + + + + + Gets a value indicating whether the current stream supports reading. + + + true if the stream supports reading; otherwise, false. + + + + + Gets a value indicating whether the current stream supports seeking. + + + true if the stream supports seeking; otherwise, false. + + + + + Gets a value indicating whether the current stream supports writing. + + + true if the stream supports writing; otherwise, false. + + + + + Gets the length in bytes of the stream. + + A long value representing the length of the stream in bytes. + A class derived from Stream does not support seeking. + Methods were called after the stream was closed. + + + + Gets or sets the position within the current stream. + + + The current position within the stream. + + An I/O error occurs. + The stream does not support seeking. + Methods were called after the stream was closed. + + + + Provides client connection to SSH server. + + + + + Holds the list of forwarded ports + + + + + Holds a value indicating whether the current instance is disposed. + + + true if the current instance is disposed; otherwise, false. + + + + + Initializes a new instance of the class. + + The connection info. + + + + + + + is null. + + + + Initializes a new instance of the class. + + Connection host. + Connection port. + Authentication username. + Authentication password. + is null. + is invalid, or is null or contains only whitespace characters. + is not within and . + + + + Initializes a new instance of the class. + + Connection host. + Authentication username. + Authentication password. + + + + is null. + is invalid, or is null or contains only whitespace characters. + + + + Initializes a new instance of the class. + + Connection host. + Connection port. + Authentication username. + Authentication private key file(s) . + + + + + is null. + is invalid, -or- is null or contains only whitespace characters. + is not within and . + + + + Initializes a new instance of the class. + + Connection host. + Authentication username. + Authentication private key file(s) . + + + + + is null. + is invalid, -or- is null or contains only whitespace characters. + + + + Initializes a new instance of the class. + + The connection info. + Specified whether this instance owns the connection info. + is null. + + If is true, then the + connection info will be disposed when this instance is disposed. + + + + + Initializes a new instance of the class. + + The connection info. + Specified whether this instance owns the connection info. + The factory to use for creating new services. + is null. + is null. + + If is true, then the + connection info will be disposed when this instance is disposed. + + + + + Called when client is disconnecting from the server. + + + + + Adds the forwarded port. + + The port. + + + + + Forwarded port is already added to a different client. + is null. + Client is not connected. + + + + Stops and removes the forwarded port from the list. + + Forwarded port. + is null. + + + + Creates the command to be executed. + + The command text. + object. + Client is not connected. + + + + Creates the command to be executed with specified encoding. + + The command text. + The encoding to use for results. + object which uses specified encoding. + This method will change current default encoding. + Client is not connected. + or is null. + + + + Creates and executes the command. + + The command text. + Returns an instance of with execution results. + This method internally uses asynchronous calls. + + + + + CommandText property is empty. + Invalid Operation - An existing channel was used to execute this command. + Asynchronous operation is already in progress. + Client is not connected. + is null. + + + + Creates the shell. + + The input. + The output. + The extended output. + Name of the terminal. + The columns. + The rows. + The width. + The height. + The terminal mode. + Size of the internal read buffer. + + Returns a representation of a object. + + Client is not connected. + + + + Creates the shell. + + The input. + The output. + The extended output. + Name of the terminal. + The columns. + The rows. + The width. + The height. + The terminal mode. + + Returns a representation of a object. + + Client is not connected. + + + + Creates the shell. + + The input. + The output. + The extended output. + + Returns a representation of a object. + + Client is not connected. + + + + Creates the shell. + + The encoding to use to send the input. + The input. + The output. + The extended output. + Name of the terminal. + The columns. + The rows. + The width. + The height. + The terminal mode. + Size of the internal read buffer. + + Returns a representation of a object. + + Client is not connected. + + + + Creates the shell. + + The encoding. + The input. + The output. + The extended output. + Name of the terminal. + The columns. + The rows. + The width. + The height. + The terminal modes. + + Returns a representation of a object. + + Client is not connected. + + + + Creates the shell. + + The encoding. + The input. + The output. + The extended output. + + Returns a representation of a object. + + Client is not connected. + + + + Creates the shell stream. + + The TERM environment variable. + The terminal width in columns. + The terminal width in rows. + The terminal height in pixels. + The terminal height in pixels. + Size of the buffer. + + The created instance. + + Client is not connected. + + + The TERM environment variable contains an identifier for the text window's capabilities. + You can get a detailed list of these cababilities by using the ‘infocmp’ command. + + + The column/row dimensions override the pixel dimensions(when nonzero). Pixel dimensions refer + to the drawable area of the window. + + + + + + Creates the shell stream. + + The TERM environment variable. + The terminal width in columns. + The terminal width in rows. + The terminal height in pixels. + The terminal height in pixels. + Size of the buffer. + The terminal mode values. + + The created instance. + + Client is not connected. + + + The TERM environment variable contains an identifier for the text window's capabilities. + You can get a detailed list of these cababilities by using the ‘infocmp’ command. + + + The column/row dimensions override the pixel dimensions(when nonzero). Pixel dimensions refer + to the drawable area of the window. + + + + + + Stops forwarded ports. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Gets the list of forwarded ports. + + + + + Represents SSH command that can be executed. + + + + + Initializes a new instance of the class. + + The session. + The command text. + The encoding to use for the results. + Either , is null. + + + + Begins an asynchronous command execution. + + + An that represents the asynchronous command execution, which could still be pending. + + + + + Asynchronous operation is already in progress. + Invalid operation. + CommandText property is empty. + Client is not connected. + Operation has timed out. + Asynchronous operation is already in progress. + CommandText property is empty. + + + + Begins an asynchronous command execution. + + An optional asynchronous callback, to be called when the command execution is complete. + + An that represents the asynchronous command execution, which could still be pending. + + Asynchronous operation is already in progress. + Invalid operation. + CommandText property is empty. + Client is not connected. + Operation has timed out. + Asynchronous operation is already in progress. + CommandText property is empty. + + + + Begins an asynchronous command execution. + + An optional asynchronous callback, to be called when the command execution is complete. + A user-provided object that distinguishes this particular asynchronous read request from other requests. + + An that represents the asynchronous command execution, which could still be pending. + + Asynchronous operation is already in progress. + Invalid operation. + CommandText property is empty. + Client is not connected. + Operation has timed out. + Asynchronous operation is already in progress. + CommandText property is empty. + + + + Begins an asynchronous command execution. + + The command text. + An optional asynchronous callback, to be called when the command execution is complete. + A user-provided object that distinguishes this particular asynchronous read request from other requests. + + An that represents the asynchronous command execution, which could still be pending. + + Client is not connected. + Operation has timed out. + + + + Waits for the pending asynchronous command execution to complete. + + The reference to the pending asynchronous request to finish. + Command execution result. + + + + Either the IAsyncResult object did not come from the corresponding async method on this type, or EndExecute was called multiple times with the same IAsyncResult. + is null. + + + + Executes command specified by property. + + Command execution result + + + + + + Client is not connected. + Operation has timed out. + + + + Cancels command execution in asynchronous scenarios. + + + + + Executes the specified command text. + + The command text. + Command execution result + Client is not connected. + Operation has timed out. + + + Command '{0}' has timed out. + The actual command will be included in the exception message. + + + + Unsubscribes the current from channel events, and disposes + the . + + The channel. + + Does nothing when is null. + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Releases unmanaged resources and performs other cleanup operations before the + is reclaimed by garbage collection. + + + + + Gets the command text. + + + + + Gets or sets the command timeout. + + + The command timeout. + + + + + + + + Gets the command exit status. + + + + + + + + Gets the output stream. + + + + + + + + Gets the extended output stream. + + + + + + + + Gets the command execution result. + + + + + + + + Gets the command execution error. + + + + + + + + Defines the highest message number that is currently supported. + + + + + Defines the total number of supported messages. + + + + + Disables and deactivate all messages. + + +
+
diff --git a/TBF_V2/Sources/TBF/packages/System.Data.SQLite.1.0.90.0/System.Data.SQLite.1.0.90.0.nupkg b/TBF_V2/Sources/TBF/packages/System.Data.SQLite.1.0.90.0/System.Data.SQLite.1.0.90.0.nupkg new file mode 100644 index 00000000..45bfbc27 Binary files /dev/null and b/TBF_V2/Sources/TBF/packages/System.Data.SQLite.1.0.90.0/System.Data.SQLite.1.0.90.0.nupkg differ diff --git a/TBF_V2/Sources/TBF/packages/System.Data.SQLite.1.0.90.0/System.Data.SQLite.1.0.90.0.nuspec b/TBF_V2/Sources/TBF/packages/System.Data.SQLite.1.0.90.0/System.Data.SQLite.1.0.90.0.nuspec new file mode 100644 index 00000000..b1ba142d --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/System.Data.SQLite.1.0.90.0/System.Data.SQLite.1.0.90.0.nuspec @@ -0,0 +1,19 @@ + + + + System.Data.SQLite + 1.0.90.0 + System.Data.SQLite (x86/x64) + SQLite Development Team + SQLite Development Team + http://www.sqlite.org/copyright.html + http://system.data.sqlite.org/ + http://system.data.sqlite.org/images/sqlite32.png + false + The official SQLite database engine for both x86 and x64 along with the ADO.NET provider. + + Public Domain + en-US + sqlite database ado.net provider interop + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/System.Data.SQLite.1.0.90.0/content/net40/x64/SQLite.Interop.dll b/TBF_V2/Sources/TBF/packages/System.Data.SQLite.1.0.90.0/content/net40/x64/SQLite.Interop.dll new file mode 100644 index 00000000..30e75200 Binary files /dev/null and b/TBF_V2/Sources/TBF/packages/System.Data.SQLite.1.0.90.0/content/net40/x64/SQLite.Interop.dll differ diff --git a/TBF_V2/Sources/TBF/packages/System.Data.SQLite.1.0.90.0/content/net40/x86/SQLite.Interop.dll b/TBF_V2/Sources/TBF/packages/System.Data.SQLite.1.0.90.0/content/net40/x86/SQLite.Interop.dll new file mode 100644 index 00000000..092ed077 Binary files /dev/null and b/TBF_V2/Sources/TBF/packages/System.Data.SQLite.1.0.90.0/content/net40/x86/SQLite.Interop.dll differ diff --git a/TBF_V2/Sources/TBF/packages/System.Data.SQLite.1.0.90.0/lib/net40/System.Data.SQLite.Linq.dll b/TBF_V2/Sources/TBF/packages/System.Data.SQLite.1.0.90.0/lib/net40/System.Data.SQLite.Linq.dll new file mode 100644 index 00000000..d9e101d5 Binary files /dev/null and b/TBF_V2/Sources/TBF/packages/System.Data.SQLite.1.0.90.0/lib/net40/System.Data.SQLite.Linq.dll differ diff --git a/TBF_V2/Sources/TBF/packages/System.Data.SQLite.1.0.90.0/lib/net40/System.Data.SQLite.dll b/TBF_V2/Sources/TBF/packages/System.Data.SQLite.1.0.90.0/lib/net40/System.Data.SQLite.dll new file mode 100644 index 00000000..833b8b28 Binary files /dev/null and b/TBF_V2/Sources/TBF/packages/System.Data.SQLite.1.0.90.0/lib/net40/System.Data.SQLite.dll differ diff --git a/TBF_V2/Sources/TBF/packages/System.Data.SQLite.1.0.90.0/lib/net40/System.Data.SQLite.xml b/TBF_V2/Sources/TBF/packages/System.Data.SQLite.1.0.90.0/lib/net40/System.Data.SQLite.xml new file mode 100644 index 00000000..149e17c8 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/System.Data.SQLite.1.0.90.0/lib/net40/System.Data.SQLite.xml @@ -0,0 +1,12758 @@ + + + + System.Data.SQLite + + + + + Defines a source code identifier custom attribute for an assembly + manifest. + + + + + Constructs an instance of this attribute class using the specified + source code identifier value. + + + The source code identifier value to use. + + + + + Gets the source code identifier value. + + + + + Defines a source code time-stamp custom attribute for an assembly + manifest. + + + + + Constructs an instance of this attribute class using the specified + source code time-stamp value. + + + The source code time-stamp value to use. + + + + + Gets the source code time-stamp value. + + + + + This is the method signature for the SQLite core library logging callback + function for use with sqlite3_log() and the SQLITE_CONFIG_LOG. + + WARNING: This delegate is used more-or-less directly by native code, do + not modify its type signature. + + + The extra data associated with this message, if any. + + + The error code associated with this message. + + + The message string to be logged. + + + + + This class implements SQLiteBase completely, and is the guts of the code that interop's SQLite with .NET + + + + + This internal class provides the foundation of SQLite support. It defines all the abstract members needed to implement + a SQLite data provider, and inherits from SQLiteConvert which allows for simple translations of string to and from SQLite. + + + + + This base class provides datatype conversion services for the SQLite provider. + + + + + The format string for DateTime values when using the InvariantCulture or CurrentCulture formats. + + + + + The value for the Unix epoch (e.g. January 1, 1970 at midnight, in UTC). + + + + + The value of the OLE Automation epoch represented as a Julian day. + + + + + An array of ISO-8601 DateTime formats that we support parsing. + + + + + The internal default format for UTC DateTime values when converting + to a string. + + + + + The internal default format for local DateTime values when converting + to a string. + + + + + An UTF-8 Encoding instance, so we can convert strings to and from UTF-8 + + + + + The default DateTime format for this instance. + + + + + The default DateTimeKind for this instance. + + + + + The default DateTime format string for this instance. + + + + + Initializes the conversion class + + The default date/time format to use for this instance + The DateTimeKind to use. + The DateTime format string to use. + + + + Converts a string to a UTF-8 encoded byte array sized to include a null-terminating character. + + The string to convert to UTF-8 + A byte array containing the converted string plus an extra 0 terminating byte at the end of the array. + + + + Convert a DateTime to a UTF-8 encoded, zero-terminated byte array. + + + This function is a convenience function, which first calls ToString() on the DateTime, and then calls ToUTF8() with the + string result. + + The DateTime to convert. + The UTF-8 encoded string, including a 0 terminating byte at the end of the array. + + + + Converts a UTF-8 encoded IntPtr of the specified length into a .NET string + + The pointer to the memory where the UTF-8 string is encoded + The number of bytes to decode + A string containing the translated character(s) + + + + Converts a UTF-8 encoded IntPtr of the specified length into a .NET string + + The pointer to the memory where the UTF-8 string is encoded + The number of bytes to decode + A string containing the translated character(s) + + + + Converts a string into a DateTime, using the DateTimeFormat, DateTimeKind, + and DateTimeFormatString specified for the connection when it was opened. + + + Acceptable ISO8601 DateTime formats are: + + THHmmssK + THHmmK + HH:mm:ss.FFFFFFFK + HH:mm:ssK + HH:mmK + yyyy-MM-dd HH:mm:ss.FFFFFFFK + yyyy-MM-dd HH:mm:ssK + yyyy-MM-dd HH:mmK + yyyy-MM-ddTHH:mm:ss.FFFFFFFK + yyyy-MM-ddTHH:mmK + yyyy-MM-ddTHH:mm:ssK + yyyyMMddHHmmssK + yyyyMMddHHmmK + yyyyMMddTHHmmssFFFFFFFK + THHmmss + THHmm + HH:mm:ss.FFFFFFF + HH:mm:ss + HH:mm + yyyy-MM-dd HH:mm:ss.FFFFFFF + yyyy-MM-dd HH:mm:ss + yyyy-MM-dd HH:mm + yyyy-MM-ddTHH:mm:ss.FFFFFFF + yyyy-MM-ddTHH:mm + yyyy-MM-ddTHH:mm:ss + yyyyMMddHHmmss + yyyyMMddHHmm + yyyyMMddTHHmmssFFFFFFF + yyyy-MM-dd + yyyyMMdd + yy-MM-dd + + If the string cannot be matched to one of the above formats -OR- + the DateTimeFormatString if one was provided, an exception will + be thrown. + + The string containing either a long integer number of 100-nanosecond units since + System.DateTime.MinValue, a Julian day double, an integer number of seconds since the Unix epoch, a + culture-independent formatted date and time string, a formatted date and time string in the current + culture, or an ISO8601-format string. + A DateTime value + + + + Converts a string into a DateTime, using the specified DateTimeFormat, + DateTimeKind and DateTimeFormatString. + + + Acceptable ISO8601 DateTime formats are: + + THHmmssK + THHmmK + HH:mm:ss.FFFFFFFK + HH:mm:ssK + HH:mmK + yyyy-MM-dd HH:mm:ss.FFFFFFFK + yyyy-MM-dd HH:mm:ssK + yyyy-MM-dd HH:mmK + yyyy-MM-ddTHH:mm:ss.FFFFFFFK + yyyy-MM-ddTHH:mmK + yyyy-MM-ddTHH:mm:ssK + yyyyMMddHHmmssK + yyyyMMddHHmmK + yyyyMMddTHHmmssFFFFFFFK + THHmmss + THHmm + HH:mm:ss.FFFFFFF + HH:mm:ss + HH:mm + yyyy-MM-dd HH:mm:ss.FFFFFFF + yyyy-MM-dd HH:mm:ss + yyyy-MM-dd HH:mm + yyyy-MM-ddTHH:mm:ss.FFFFFFF + yyyy-MM-ddTHH:mm + yyyy-MM-ddTHH:mm:ss + yyyyMMddHHmmss + yyyyMMddHHmm + yyyyMMddTHHmmssFFFFFFF + yyyy-MM-dd + yyyyMMdd + yy-MM-dd + + If the string cannot be matched to one of the above formats -OR- + the DateTimeFormatString if one was provided, an exception will + be thrown. + + The string containing either a long integer number of 100-nanosecond units since + System.DateTime.MinValue, a Julian day double, an integer number of seconds since the Unix epoch, a + culture-independent formatted date and time string, a formatted date and time string in the current + culture, or an ISO8601-format string. + The SQLiteDateFormats to use. + The DateTimeKind to use. + The DateTime format string to use. + A DateTime value + + + + Converts a julianday value into a DateTime + + The value to convert + A .NET DateTime + + + + Converts a julianday value into a DateTime + + The value to convert + The DateTimeKind to use. + A .NET DateTime + + + + Converts the specified number of seconds from the Unix epoch into a + value. + + + The number of whole seconds since the Unix epoch. + + + Either Utc or Local time. + + + The new value. + + + + + Converts the specified number of ticks since the epoch into a + value. + + + The number of whole ticks since the epoch. + + + Either Utc or Local time. + + + The new value. + + + + + Converts a DateTime struct to a JulianDay double + + The DateTime to convert + The JulianDay value the Datetime represents + + + + Converts a DateTime struct to the whole number of seconds since the + Unix epoch. + + The DateTime to convert + The whole number of seconds since the Unix epoch + + + + Returns the DateTime format string to use for the specified DateTimeKind. + If is not null, it will be returned verbatim. + + The DateTimeKind to use. + The DateTime format string to use. + + The DateTime format string to use for the specified DateTimeKind. + + + + + Converts a string into a DateTime, using the DateTimeFormat, DateTimeKind, + and DateTimeFormatString specified for the connection when it was opened. + + The DateTime value to convert + Either a string containing the long integer number of 100-nanosecond units since System.DateTime.MinValue, a + Julian day double, an integer number of seconds since the Unix epoch, a culture-independent formatted date and time + string, a formatted date and time string in the current culture, or an ISO8601-format date/time string. + + + + Internal function to convert a UTF-8 encoded IntPtr of the specified length to a DateTime. + + + This is a convenience function, which first calls ToString() on the IntPtr to convert it to a string, then calls + ToDateTime() on the string to return a DateTime. + + A pointer to the UTF-8 encoded string + The length in bytes of the string + The parsed DateTime value + + + + Smart method of splitting a string. Skips quoted elements, removes the quotes. + + + This split function works somewhat like the String.Split() function in that it breaks apart a string into + pieces and returns the pieces as an array. The primary differences are: + + Only one character can be provided as a separator character + Quoted text inside the string is skipped over when searching for the separator, and the quotes are removed. + + Thus, if splitting the following string looking for a comma:
+ One,Two, "Three, Four", Five
+
+ The resulting array would contain
+ [0] One
+ [1] Two
+ [2] Three, Four
+ [3] Five
+
+ Note that the leading and trailing spaces were removed from each item during the split. +
+ Source string to split apart + Separator character + A string array of the split up elements +
+ + + Splits the specified string into multiple strings based on a separator + and returns the result as an array of strings. + + + The string to split into pieces based on the separator character. If + this string is null, null will always be returned. If this string is + empty, an array of zero strings will always be returned. + + + The character used to divide the original string into sub-strings. + This character cannot be a backslash or a double-quote; otherwise, no + work will be performed and null will be returned. + + + If this parameter is non-zero, all double-quote characters will be + retained in the returned list of strings; otherwise, they will be + dropped. + + + Upon failure, this parameter will be modified to contain an appropriate + error message. + + + The new array of strings or null if the input string is null -OR- the + separator character is a backslash or a double-quote -OR- the string + contains an unbalanced backslash or double-quote character. + + + + + Convert a value to true or false. + + A string or number representing true or false + + + + + Convert a string to true or false. + + A string representing true or false + + + "yes", "no", "y", "n", "0", "1", "on", "off" as well as Boolean.FalseString and Boolean.TrueString will all be + converted to a proper boolean value. + + + + + Converts a SQLiteType to a .NET Type object + + The SQLiteType to convert + Returns a .NET Type object + + + + For a given intrinsic type, return a DbType + + The native type to convert + The corresponding (closest match) DbType + + + + Returns the ColumnSize for the given DbType + + The DbType to get the size of + + + + + Determines the type name for the given database value type. + + The database value type. + The flags associated with the parent connection object. + The type name or an empty string if it cannot be determined. + + + + Convert a DbType to a Type + + The DbType to convert from + The closest-match .NET type + + + + For a given type, return the closest-match SQLite TypeAffinity, which only understands a very limited subset of types. + + The type to evaluate + The SQLite type affinity for that type. + + + + Builds and returns a map containing the database column types + recognized by this provider. + + + A map containing the database column types recognized by this + provider. + + + + + For a given type name, return a closest-match .NET type + + The name of the type to match + The flags associated with the parent connection object. + The .NET DBType the text evaluates to. + + + + The error code used for logging exceptions caught in user-provided + code. + + + + + Sets the status of the memory usage tracking subsystem in the SQLite core library. By default, this is enabled. + If this is disabled, memory usage tracking will not be performed. This is not really a per-connection value, it is + global to the process. + + Non-zero to enable memory usage tracking, zero otherwise. + A standard SQLite return code (i.e. zero for success and non-zero for failure). + + + + Attempts to free as much heap memory as possible for the database connection. + + A standard SQLite return code (i.e. zero for success and non-zero for failure). + + + + Shutdown the SQLite engine so that it can be restarted with different config options. + We depend on auto initialization to recover. + + + + + Determines if the associated native connection handle is open. + + + Non-zero if a database connection is open. + + + + + Opens a database. + + + Implementers should call SQLiteFunction.BindFunctions() and save the array after opening a connection + to bind all attributed user-defined functions and collating sequences to the new connection. + + The filename of the database to open. SQLite automatically creates it if it doesn't exist. + The flags associated with the parent connection object + The open flags to use when creating the connection + The maximum size of the pool for the given filename + If true, the connection can be pulled from the connection pool + + + + Closes the currently-open database. + + + After the database has been closed implemeters should call SQLiteFunction.UnbindFunctions() to deallocate all interop allocated + memory associated with the user-defined functions and collating sequences tied to the closed connection. + + Non-zero if the operation is allowed to throw exceptions, zero otherwise. + + + + Sets the busy timeout on the connection. SQLiteCommand will call this before executing any command. + + The number of milliseconds to wait before returning SQLITE_BUSY + + + + Returns the text of the last error issued by SQLite + + + + + + Returns the text of the last error issued by SQLite -OR- the specified default error text if + none is available from the SQLite core library. + + + The error text to return in the event that one is not available from the SQLite core library. + + + The error text. + + + + + When pooling is enabled, force this connection to be disposed rather than returned to the pool + + + + + When pooling is enabled, returns the number of pool entries matching the current file name. + + The number of pool entries matching the current file name. + + + + Prepares a SQL statement for execution. + + The source connection preparing the command. Can be null for any caller except LINQ + The SQL command text to prepare + The previous statement in a multi-statement command, or null if no previous statement exists + The timeout to wait before aborting the prepare + The remainder of the statement that was not processed. Each call to prepare parses the + SQL up to to either the end of the text or to the first semi-colon delimiter. The remaining text is returned + here for a subsequent call to Prepare() until all the text has been processed. + Returns an initialized SQLiteStatement. + + + + Steps through a prepared statement. + + The SQLiteStatement to step through + True if a row was returned, False if not. + + + + Resets a prepared statement so it can be executed again. If the error returned is SQLITE_SCHEMA, + transparently attempt to rebuild the SQL statement and throw an error if that was not possible. + + The statement to reset + Returns -1 if the schema changed while resetting, 0 if the reset was sucessful or 6 (SQLITE_LOCKED) if the reset failed due to a lock + + + + Attempts to interrupt the query currently executing on the associated + native database connection. + + + + + This function binds a user-defined functions to the connection. + + + The object instance containing + the metadata for the function to be bound. + + + The object instance that implements the + function to be bound. + + + The flags associated with the parent connection object. + + + + + Calls the native SQLite core library in order to create a disposable + module containing the implementation of a virtual table. + + + The module object to be used when creating the native disposable module. + + + The flags for the associated object instance. + + + + + Calls the native SQLite core library in order to cleanup the resources + associated with a module containing the implementation of a virtual table. + + + The module object previously passed to the + method. + + + The flags for the associated object instance. + + + + + Calls the native SQLite core library in order to declare a virtual table + in response to a call into the + or virtual table methods. + + + The virtual table module that is to be responsible for the virtual table + being declared. + + + The string containing the SQL statement describing the virtual table to + be declared. + + + Upon success, the contents of this parameter are undefined. Upon failure, + it should contain an appropriate error message. + + + A standard SQLite return code. + + + + + Calls the native SQLite core library in order to declare a virtual table + function in response to a call into the + or virtual table methods. + + + The virtual table module that is to be responsible for the virtual table + function being declared. + + + The number of arguments to the function being declared. + + + The name of the function being declared. + + + Upon success, the contents of this parameter are undefined. Upon failure, + it should contain an appropriate error message. + + + A standard SQLite return code. + + + + + Enables or disabled extension loading by SQLite. + + + True to enable loading of extensions, false to disable. + + + + + Loads a SQLite extension library from the named file. + + + The name of the dynamic link library file containing the extension. + + + The name of the exported function used to initialize the extension. + If null, the default "sqlite3_extension_init" will be used. + + + + + Enables or disabled extened result codes returned by SQLite + + true to enable extended result codes, false to disable. + + + + + Returns the numeric result code for the most recent failed SQLite API call + associated with the database connection. + + Result code + + + + Returns the extended numeric result code for the most recent failed SQLite API call + associated with the database connection. + + Extended result code + + + + Add a log message via the SQLite sqlite3_log interface. + + Error code to be logged with the message. + String to be logged. Unlike the SQLite sqlite3_log() + interface, this should be pre-formatted. Consider using the + String.Format() function. + + + + + Checks if the SQLite core library has been initialized in the current process. + + + Non-zero if the SQLite core library has been initialized in the current process, + zero otherwise. + + + + + Creates a new SQLite backup object based on the provided destination + database connection. The source database connection is the one + associated with this object. The source and destination database + connections cannot be the same. + + The destination database connection. + The destination database name. + The source database name. + The newly created backup object. + + + + Copies up to N pages from the source database to the destination + database associated with the specified backup object. + + The backup object to use. + + The number of pages to copy or negative to copy all remaining pages. + + + Set to true if the operation needs to be retried due to database + locking issues. + + + True if there are more pages to be copied, false otherwise. + + + + + Returns the number of pages remaining to be copied from the source + database to the destination database associated with the specified + backup object. + + The backup object to check. + The number of pages remaining to be copied. + + + + Returns the total number of pages in the source database associated + with the specified backup object. + + The backup object to check. + The total number of pages in the source database. + + + + Destroys the backup object, rolling back any backup that may be in + progess. + + The backup object to destroy. + + + + Returns the error message for the specified SQLite return code using + the internal static lookup table. + + The SQLite return code. + The error message or null if it cannot be found. + + + + Returns the error message for the specified SQLite return code using + the sqlite3_errstr() function, falling back to the internal lookup + table if necessary. + + The SQLite return code. + The error message or null if it cannot be found. + + + + Returns a string representing the active version of SQLite + + + + + Returns an integer representing the active version of SQLite + + + + + Returns the rowid of the most recent successful INSERT into the database from this connection. + + + + + Returns the number of changes the last executing insert/update caused. + + + + + Returns the amount of memory (in bytes) currently in use by the SQLite core library. This is not really a per-connection + value, it is global to the process. + + + + + Returns the maximum amount of memory (in bytes) used by the SQLite core library since the high-water mark was last reset. + This is not really a per-connection value, it is global to the process. + + + + + Returns non-zero if the underlying native connection handle is owned by this instance. + + + + + Returns non-zero if the given database connection is in autocommit mode. + Autocommit mode is on by default. Autocommit mode is disabled by a BEGIN + statement. Autocommit mode is re-enabled by a COMMIT or ROLLBACK. + + + + + The opaque pointer returned to us by the sqlite provider + + + + + The user-defined functions registered on this connection + + + + + The modules created using this connection. + + + + + Constructs the object used to interact with the SQLite core library + using the UTF-8 text encoding. + + + The DateTime format to be used when converting string values to a + DateTime and binding DateTime parameters. + + + The to be used when creating DateTime + values. + + + The format string to be used when parsing and formatting DateTime + values. + + + The native handle to be associated with the database connection. + + + The fully qualified file name associated with . + + + Non-zero if the newly created object instance will need to dispose + of when it is no longer needed. + + + + + This method attempts to dispose of all the derived + object instances currently associated with the native database connection. + + + + + Attempts to interrupt the query currently executing on the associated + native database connection. + + + + + This function binds a user-defined function to the connection. + + + The object instance containing + the metadata for the function to be bound. + + + The object instance that implements the + function to be bound. + + + The flags associated with the parent connection object. + + + + + Attempts to free as much heap memory as possible for the database connection. + + A standard SQLite return code (i.e. zero for success and non-zero for failure). + + + + Attempts to free N bytes of heap memory by deallocating non-essential memory + allocations held by the database library. Memory used to cache database pages + to improve performance is an example of non-essential memory. This is a no-op + returning zero if the SQLite core library was not compiled with the compile-time + option SQLITE_ENABLE_MEMORY_MANAGEMENT. Optionally, attempts to reset and/or + compact the Win32 native heap, if applicable. + + + The requested number of bytes to free. + + + Non-zero to attempt a heap reset. + + + Non-zero to attempt heap compaction. + + + The number of bytes actually freed. This value may be zero. + + + This value will be non-zero if the heap reset was successful. + + + The size of the largest committed free block in the heap, in bytes. + This value will be zero unless heap compaction is enabled. + + + A standard SQLite return code (i.e. zero for success and non-zero + for failure). + + + + + Shutdown the SQLite engine so that it can be restarted with different + configuration options. We depend on auto initialization to recover. + + Returns a standard SQLite result code. + + + + Shutdown the SQLite engine so that it can be restarted with different + configuration options. We depend on auto initialization to recover. + + + Non-zero to reset the database and temporary directories to their + default values, which should be null for both. This parameter has no + effect on non-Windows operating systems. + + Returns a standard SQLite result code. + + + + Determines if the associated native connection handle is open. + + + Non-zero if the associated native connection handle is open. + + + + + Calls the native SQLite core library in order to create a disposable + module containing the implementation of a virtual table. + + + The module object to be used when creating the native disposable module. + + + The flags for the associated object instance. + + + + + Calls the native SQLite core library in order to cleanup the resources + associated with a module containing the implementation of a virtual table. + + + The module object previously passed to the + method. + + + The flags for the associated object instance. + + + + + Calls the native SQLite core library in order to declare a virtual table + in response to a call into the + or virtual table methods. + + + The virtual table module that is to be responsible for the virtual table + being declared. + + + The string containing the SQL statement describing the virtual table to + be declared. + + + Upon success, the contents of this parameter are undefined. Upon failure, + it should contain an appropriate error message. + + + A standard SQLite return code. + + + + + Calls the native SQLite core library in order to declare a virtual table + function in response to a call into the + or virtual table methods. + + + The virtual table module that is to be responsible for the virtual table + function being declared. + + + The number of arguments to the function being declared. + + + The name of the function being declared. + + + Upon success, the contents of this parameter are undefined. Upon failure, + it should contain an appropriate error message. + + + A standard SQLite return code. + + + + + Enables or disabled extension loading by SQLite. + + + True to enable loading of extensions, false to disable. + + + + + Loads a SQLite extension library from the named file. + + + The name of the dynamic link library file containing the extension. + + + The name of the exported function used to initialize the extension. + If null, the default "sqlite3_extension_init" will be used. + + + + Enables or disabled extended result codes returned by SQLite + + + Gets the last SQLite error code + + + Gets the last SQLite extended error code + + + Add a log message via the SQLite sqlite3_log interface. + + + Add a log message via the SQLite sqlite3_log interface. + + + + Allows the setting of a logging callback invoked by SQLite when a + log event occurs. Only one callback may be set. If NULL is passed, + the logging callback is unregistered. + + The callback function to invoke. + Returns a result code + + + + Creates a new SQLite backup object based on the provided destination + database connection. The source database connection is the one + associated with this object. The source and destination database + connections cannot be the same. + + The destination database connection. + The destination database name. + The source database name. + The newly created backup object. + + + + Copies up to N pages from the source database to the destination + database associated with the specified backup object. + + The backup object to use. + + The number of pages to copy, negative to copy all remaining pages. + + + Set to true if the operation needs to be retried due to database + locking issues; otherwise, set to false. + + + True if there are more pages to be copied, false otherwise. + + + + + Returns the number of pages remaining to be copied from the source + database to the destination database associated with the specified + backup object. + + The backup object to check. + The number of pages remaining to be copied. + + + + Returns the total number of pages in the source database associated + with the specified backup object. + + The backup object to check. + The total number of pages in the source database. + + + + Destroys the backup object, rolling back any backup that may be in + progess. + + The backup object to destroy. + + + + Determines if the SQLite core library has been initialized for the + current process. + + + A boolean indicating whether or not the SQLite core library has been + initialized for the current process. + + + + + Determines if the SQLite core library has been initialized for the + current process. + + + A boolean indicating whether or not the SQLite core library has been + initialized for the current process. + + + + + Helper function to retrieve a column of data from an active statement. + + The statement being step()'d through + The flags associated with the connection. + The column index to retrieve + The type of data contained in the column. If Uninitialized, this function will retrieve the datatype information. + Returns the data in the column + + + + Returns non-zero if the underlying native connection handle is owned + by this instance. + + + + + Alternate SQLite3 object, overriding many text behaviors to support UTF-16 (Unicode) + + + + + Constructs the object used to interact with the SQLite core library + using the UTF-8 text encoding. + + + The DateTime format to be used when converting string values to a + DateTime and binding DateTime parameters. + + + The to be used when creating DateTime + values. + + + The format string to be used when parsing and formatting DateTime + values. + + + The native handle to be associated with the database connection. + + + The fully qualified file name associated with . + + + Non-zero if the newly created object instance will need to dispose + of when it is no longer needed. + + + + + Overrides SQLiteConvert.ToString() to marshal UTF-16 strings instead of UTF-8 + + A pointer to a UTF-16 string + The length (IN BYTES) of the string + A .NET string + + + + Represents a single SQL backup in SQLite. + + + + + The underlying SQLite object this backup is bound to. + + + + + The actual backup handle. + + + + + The destination database for the backup. + + + + + The destination database name for the backup. + + + + + The source database for the backup. + + + + + The source database name for the backup. + + + + + The last result from the StepBackup method of the SQLite3 class. + This is used to determine if the call to the FinishBackup method of + the SQLite3 class should throw an exception when it receives a non-Ok + return code from the core SQLite library. + + + + + Initializes the backup. + + The base SQLite object. + The backup handle. + The destination database for the backup. + The destination database name for the backup. + The source database for the backup. + The source database name for the backup. + + + + Disposes and finalizes the backup. + + + + + The extra behavioral flags that can be applied to a connection. + + + + + No extra flags. + + + + + Enable logging of all SQL statements to be prepared. + + + + + Enable logging of all bound parameter types and raw values. + + + + + Enable logging of all bound parameter strongly typed values. + + + + + Enable logging of all exceptions caught from user-provided + managed code called from native code via delegates. + + + + + Enable logging of backup API errors. + + + + + Skip adding the extension functions provided by the native + interop assembly. + + + + + When binding parameter values with the + type, use the interop method that accepts an + value. + + + + + When binding parameter values, always bind them as though they were + plain text (i.e. no numeric, date/time, or other conversions should + be attempted). + + + + + When returning column values, always return them as though they were + plain text (i.e. no numeric, date/time, or other conversions should + be attempted). + + + + + Prevent this object instance from + loading extensions. + + + + + Prevent this object instance from + creating virtual table modules. + + + + + Skip binding any functions provided by other managed assemblies when + opening the connection. + + + + + Skip setting the logging related properties of the + object instance that was passed to + the method. + + + + + Enable logging of all virtual table module errors seen by the + method. + + + + + Enable logging of certain virtual table module exceptions that cannot + be easily discovered via other means. + + + + + Enable tracing of potentially important [non-fatal] error conditions + that cannot be easily reported through other means. + + + + + When binding and returning column values, always treat them as though + they were plain text (i.e. no numeric, date/time, or other conversions + should be attempted). + + + + + Enable all logging. + + + + + The default extra flags for new connections. + + + + + SQLite implementation of DbCommand. + + + + + The default connection string to be used when creating a temporary + connection to execute a command via the static + or + + methods. + + + + + The command text this command is based on + + + + + The connection the command is associated with + + + + + The version of the connection the command is associated with + + + + + Indicates whether or not a DataReader is active on the command. + + + + + The timeout for the command, kludged because SQLite doesn't support per-command timeout values + + + + + Designer support + + + + + Used by DbDataAdapter to determine updating behavior + + + + + The collection of parameters for the command + + + + + The SQL command text, broken into individual SQL statements as they are executed + + + + + Unprocessed SQL text that has not been executed + + + + + Transaction associated with this command + + + + + Constructs a new SQLiteCommand + + + Default constructor + + + + + Initializes the command with the given command text + + The SQL command text + + + + Initializes the command with the given SQL command text and attach the command to the specified + connection. + + The SQL command text + The connection to associate with the command + + + + Initializes the command and associates it with the specified connection. + + The connection to associate with the command + + + + Initializes a command with the given SQL, connection and transaction + + The SQL command text + The connection to associate with the command + The transaction the command should be associated with + + + + Disposes of the command and clears all member variables + + Whether or not the class is being explicitly or implicitly disposed + + + + This method attempts to query the flags associated with the database + connection in use. If the database connection is disposed, the default + flags will be returned. + + + The command containing the databse connection to query the flags from. + + + The connection flags value. + + + + + Clears and destroys all statements currently prepared + + + + + Builds an array of prepared statements for each complete SQL statement in the command text + + + + + Not implemented + + + + + Forwards to the local CreateParameter() function + + + + + + Create a new parameter + + + + + + This function ensures there are no active readers, that we have a valid connection, + that the connection is open, that all statements are prepared and all parameters are assigned + in preparation for allocating a data reader. + + + + + Creates a new SQLiteDataReader to execute/iterate the array of SQLite prepared statements + + The behavior the data reader should adopt + Returns a SQLiteDataReader object + + + + This method creates a new connection, executes the query using the given + execution type, closes the connection, and returns the results. If the + connection string is null, a temporary in-memory database connection will + be used. + + + The text of the command to be executed. + + + The execution type for the command. This is used to determine which method + of the command object to call, which then determines the type of results + returned, if any. + + + The connection string to the database to be opened, used, and closed. If + this parameter is null, a temporary in-memory databse will be used. + + + The SQL parameter values to be used when building the command object to be + executed, if any. + + + The results of the query -OR- null if no results were produced from the + given execution type. + + + + + This method creates a new connection, executes the query using the given + execution type and command behavior, closes the connection, and returns + the results. If the connection string is null, a temporary in-memory + database connection will be used. + + + The text of the command to be executed. + + + The execution type for the command. This is used to determine which method + of the command object to call, which then determines the type of results + returned, if any. + + + The command behavior flags for the command. + + + The connection string to the database to be opened, used, and closed. If + this parameter is null, a temporary in-memory databse will be used. + + + The SQL parameter values to be used when building the command object to be + executed, if any. + + + The results of the query -OR- null if no results were produced from the + given execution type. + + + + + Overrides the default behavior to return a SQLiteDataReader specialization class + + The flags to be associated with the reader. + A SQLiteDataReader + + + + Overrides the default behavior of DbDataReader to return a specialized SQLiteDataReader class + + A SQLiteDataReader + + + + Called by the SQLiteDataReader when the data reader is closed. + + + + + Execute the command and return the number of rows inserted/updated affected by it. + + The number of rows inserted/updated affected by it. + + + + Execute the command and return the number of rows inserted/updated affected by it. + + The flags to be associated with the reader. + The number of rows inserted/updated affected by it. + + + + Execute the command and return the first column of the first row of the resultset + (if present), or null if no resultset was returned. + + The first column of the first row of the first resultset from the query. + + + + Execute the command and return the first column of the first row of the resultset + (if present), or null if no resultset was returned. + + The flags to be associated with the reader. + The first column of the first row of the first resultset from the query. + + + + Does nothing. Commands are prepared as they are executed the first time, and kept in prepared state afterwards. + + + + + Clones a command, including all its parameters + + A new SQLiteCommand with the same commandtext, connection and parameters + + + + The SQL command text associated with the command + + + + + The amount of time to wait for the connection to become available before erroring out + + + + + The type of the command. SQLite only supports CommandType.Text + + + + + The connection associated with this command + + + + + Forwards to the local Connection property + + + + + Returns the SQLiteParameterCollection for the given command + + + + + Forwards to the local Parameters property + + + + + The transaction associated with this command. SQLite only supports one transaction per connection, so this property forwards to the + command's underlying connection. + + + + + Forwards to the local Transaction property + + + + + Sets the method the SQLiteCommandBuilder uses to determine how to update inserted or updated rows in a DataTable. + + + + + Determines if the command is visible at design time. Defaults to True. + + + + + SQLite implementation of DbCommandBuilder. + + + + + Default constructor + + + + + Initializes the command builder and associates it with the specified data adapter. + + + + + + Minimal amount of parameter processing. Primarily sets the DbType for the parameter equal to the provider type in the schema + + The parameter to use in applying custom behaviors to a row + The row to apply the parameter to + The type of statement + Whether the application of the parameter is part of a WHERE clause + + + + Returns a valid named parameter + + The name of the parameter + Error + + + + Returns a named parameter for the given ordinal + + The i of the parameter + Error + + + + Returns a placeholder character for the specified parameter i. + + The index of the parameter to provide a placeholder for + Returns a named parameter + + + + Sets the handler for receiving row updating events. Used by the DbCommandBuilder to autogenerate SQL + statements that may not have previously been generated. + + A data adapter to receive events on. + + + + Returns the automatically-generated SQLite command to delete rows from the database + + + + + + Returns the automatically-generated SQLite command to delete rows from the database + + + + + + + Returns the automatically-generated SQLite command to update rows in the database + + + + + + Returns the automatically-generated SQLite command to update rows in the database + + + + + + + Returns the automatically-generated SQLite command to insert rows into the database + + + + + + Returns the automatically-generated SQLite command to insert rows into the database + + + + + + + Places brackets around an identifier + + The identifier to quote + The bracketed identifier + + + + Removes brackets around an identifier + + The quoted (bracketed) identifier + The undecorated identifier + + + + Override helper, which can help the base command builder choose the right keys for the given query + + + + + + + Gets/sets the DataAdapter for this CommandBuilder + + + + + Overridden to hide its property from the designer + + + + + Overridden to hide its property from the designer + + + + + Overridden to hide its property from the designer + + + + + Overridden to hide its property from the designer + + + + + Overridden to hide its property from the designer + + + + + Event data for connection event handlers. + + + + + The type of event being raised. + + + + + The associated with this event, if any. + + + + + The transaction associated with this event, if any. + + + + + The command associated with this event, if any. + + + + + The data reader associated with this event, if any. + + + + + The critical handle associated with this event, if any. + + + + + Command or message text associated with this event, if any. + + + + + Extra data associated with this event, if any. + + + + + Constructs the object. + + The type of event being raised. + The base associated + with this event, if any. + The transaction associated with this event, if any. + The command associated with this event, if any. + The data reader associated with this event, if any. + The critical handle associated with this event, if any. + The command or message text, if any. + The extra data, if any. + + + + Raised when an event pertaining to a connection occurs. + + The connection involved. + Extra information about the event. + + + + SQLite implentation of DbConnection. + + + The property can contain the following parameter(s), delimited with a semi-colon: + + + Parameter + Values + Required + Default + + + Data Source + + This may be a file name, the string ":memory:", or any supported URI (starting with SQLite 3.7.7). + Starting with release 1.0.86.0, in order to use more than one consecutive backslash (e.g. for a + UNC path), each of the adjoining backslash characters must be doubled (e.g. "\\Network\Share\test.db" + would become "\\\\Network\Share\test.db"). + + Y + + + + Version + 3 + N + 3 + + + UseUTF16Encoding + True
False
+ N + False +
+ + DateTimeFormat + + Ticks - Use the value of DateTime.Ticks.
+ ISO8601 - Use the ISO-8601 format. Uses the "yyyy-MM-dd HH:mm:ss.FFFFFFFK" format for UTC + DateTime values and "yyyy-MM-dd HH:mm:ss.FFFFFFF" format for local DateTime values).
+ JulianDay - The interval of time in days and fractions of a day since January 1, 4713 BC.
+ UnixEpoch - The whole number of seconds since the Unix epoch (January 1, 1970).
+ InvariantCulture - Any culture-independent string value that the .NET Framework can interpret as a valid DateTime.
+ CurrentCulture - Any string value that the .NET Framework can interpret as a valid DateTime using the current culture.
+ N + ISO8601 +
+ + DateTimeKind + Unspecified - Not specified as either UTC or local time.
Utc - The time represented is UTC.
Local - The time represented is local time.
+ N + Unspecified +
+ + DateTimeFormatString + The exact DateTime format string to use for all formatting and parsing of all DateTime + values for this connection. + N + null + + + BaseSchemaName + Some base data classes in the framework (e.g. those that build SQL queries dynamically) + assume that an ADO.NET provider cannot support an alternate catalog (i.e. database) without supporting + alternate schemas as well; however, SQLite does not fit into this model. Therefore, this value is used + as a placeholder and removed prior to preparing any SQL statements that may contain it. + N + sqlite_default_schema + + + BinaryGUID + True - Store GUID columns in binary form
False - Store GUID columns as text
+ N + True +
+ + Cache Size + {size in bytes} + N + 2000 + + + Synchronous + Normal - Normal file flushing behavior
Full - Full flushing after all writes
Off - Underlying OS flushes I/O's
+ N + Full +
+ + Page Size + {size in bytes} + N + 1024 + + + Password + {password} - Using this parameter requires that the CryptoAPI based codec be enabled at compile-time for both the native interop assembly and the core managed assemblies; otherwise, using this parameter may result in an exception being thrown when attempting to open the connection. + N + + + + HexPassword + {hexPassword} - Must contain a sequence of zero or more hexadecimal encoded byte values without a leading "0x" prefix. Using this parameter requires that the CryptoAPI based codec be enabled at compile-time for both the native interop assembly and the core managed assemblies; otherwise, using this parameter may result in an exception being thrown when attempting to open the connection. + N + + + + Enlist + Y - Automatically enlist in distributed transactions
N - No automatic enlistment
+ N + Y +
+ + Pooling + + True - Use connection pooling.
+ False - Do not use connection pooling.

+ WARNING: When using the default connection pool implementation, + setting this property to True should be avoided by applications that make + use of COM (either directly or indirectly) due to possible deadlocks that + can occur during the finalization of some COM objects. +
+ N + False +
+ + FailIfMissing + True - Don't create the database if it does not exist, throw an error instead
False - Automatically create the database if it does not exist
+ N + False +
+ + Max Page Count + {size in pages} - Limits the maximum number of pages (limits the size) of the database + N + 0 + + + Legacy Format + True - Use the more compatible legacy 3.x database format
False - Use the newer 3.3x database format which compresses numbers more effectively
+ N + False +
+ + Default Timeout + {time in seconds}
The default command timeout
+ N + 30 +
+ + Journal Mode + Delete - Delete the journal file after a commit
Persist - Zero out and leave the journal file on disk after a commit
Off - Disable the rollback journal entirely
+ N + Delete +
+ + Read Only + True - Open the database for read only access
False - Open the database for normal read/write access
+ N + False +
+ + Max Pool Size + The maximum number of connections for the given connection string that can be in the connection pool + N + 100 + + + Default IsolationLevel + The default transaciton isolation level + N + Serializable + + + Foreign Keys + Enable foreign key constraints + N + False + + + Flags + Extra behavioral flags for the connection. See the enumeration for possible values. + N + Default + + + SetDefaults + + True - Apply the default connection settings to the opened database.
+ False - Skip applying the default connection settings to the opened database. +
+ N + True +
+ + ToFullPath + + True - Attempt to expand the data source file name to a fully qualified path before opening.
+ False - Skip attempting to expand the data source file name to a fully qualified path before opening. +
+ N + True +
+
+
+
+ + + The default "stub" (i.e. placeholder) base schema name to use when + returning column schema information. Used as the initial value of + the BaseSchemaName property. This should start with "sqlite_*" + because those names are reserved for use by SQLite (i.e. they cannot + be confused with the names of user objects). + + + + + The managed assembly containing this type. + + + + + Object used to synchronize access to the static instance data + for this class. + + + + + State of the current connection + + + + + The connection string + + + + + Nesting level of the transactions open on the connection + + + + + If set, then the connection is currently being disposed. + + + + + The default isolation level for new transactions + + + + + Whether or not the connection is enlisted in a distrubuted transaction + + + + + The base SQLite object to interop with + + + + + The database filename minus path and extension + + + + + Temporary password storage, emptied after the database has been opened + + + + + The "stub" (i.e. placeholder) base schema name to use when returning + column schema information. + + + + + The extra behavioral flags for this connection, if any. See the + enumeration for a list of + possible values. + + + + + Default command timeout + + + + + Non-zero if the built-in (i.e. framework provided) connection string + parser should be used when opening the connection. + + + + + Constructs a new SQLiteConnection object + + + Default constructor + + + + + Initializes the connection with the specified connection string. + + The connection string to use. + + + + Initializes the connection with a pre-existing native connection handle. + This constructor overload is intended to be used only by the private + method. + + + The native connection handle to use. + + + The file name corresponding to the native connection handle. + + + Non-zero if this instance owns the native connection handle and + should dispose of it when it is no longer needed. + + + + + Initializes the connection with the specified connection string. + + + The connection string to use. + + + Non-zero to parse the connection string using the built-in (i.e. + framework provided) parser when opening the connection. + + + + + Clones the settings and connection string from an existing connection. If the existing connection is already open, this + function will open its own connection, enumerate any attached databases of the original connection, and automatically + attach to them. + + The connection to copy the settings from. + + + + Raises the event. + + + The connection associated with this event. If this parameter is not + null and the specified connection cannot raise events, then the + registered event handlers will not be invoked. + + + A that contains the event data. + + + + + Creates and returns a new managed database connection handle. This + method is intended to be used by implementations of the + interface only. In theory, it + could be used by other classes; however, that usage is not supported. + + + This must be a native database connection handle returned by the + SQLite core library and it must remain valid and open during the + entire duration of the calling method. + + + The new managed database connection handle or null if it cannot be + created. + + + + + Backs up the database, using the specified database connection as the + destination. + + The destination database connection. + The destination database name. + The source database name. + + The number of pages to copy or negative to copy all remaining pages. + + + The method to invoke between each step of the backup process. This + parameter may be null (i.e. no callbacks will be performed). + + + The number of milliseconds to sleep after encountering a locking error + during the backup process. A value less than zero means that no sleep + should be performed. + + + + + Attempts to bind the specified object + instance to this connection. + + + The object instance containing + the metadata for the function to be bound. + + + The object instance that implements the + function to be bound. + + + + + Creates a clone of the connection. All attached databases and user-defined functions are cloned. If the existing connection is open, the cloned connection + will also be opened. + + + + + + Creates a database file. This just creates a zero-byte file which SQLite + will turn into a database when the file is opened properly. + + The file to create + + + + Raises the state change event when the state of the connection changes + + The new connection state. If this is different + from the previous state, the event is + raised. + The event data created for the raised event, if + it was actually raised. + + + + Determines and returns the fallback default isolation level when one cannot be + obtained from an existing connection instance. + + + The fallback default isolation level for this connection instance -OR- + if it cannot be determined. + + + + + Determines and returns the default isolation level for this connection instance. + + + The default isolation level for this connection instance -OR- + if it cannot be determined. + + + + + OBSOLETE. Creates a new SQLiteTransaction if one isn't already active on the connection. + + This parameter is ignored. + When TRUE, SQLite defers obtaining a write lock until a write operation is requested. + When FALSE, a writelock is obtained immediately. The default is TRUE, but in a multi-threaded multi-writer + environment, one may instead choose to lock the database immediately to avoid any possible writer deadlock. + Returns a SQLiteTransaction object. + + + + OBSOLETE. Creates a new SQLiteTransaction if one isn't already active on the connection. + + When TRUE, SQLite defers obtaining a write lock until a write operation is requested. + When FALSE, a writelock is obtained immediately. The default is false, but in a multi-threaded multi-writer + environment, one may instead choose to lock the database immediately to avoid any possible writer deadlock. + Returns a SQLiteTransaction object. + + + + Creates a new if one isn't already active on the connection. + + Supported isolation levels are Serializable, ReadCommitted and Unspecified. + + Unspecified will use the default isolation level specified in the connection string. If no isolation level is specified in the + connection string, Serializable is used. + Serializable transactions are the default. In this mode, the engine gets an immediate lock on the database, and no other threads + may begin a transaction. Other threads may read from the database, but not write. + With a ReadCommitted isolation level, locks are deferred and elevated as needed. It is possible for multiple threads to start + a transaction in ReadCommitted mode, but if a thread attempts to commit a transaction while another thread + has a ReadCommitted lock, it may timeout or cause a deadlock on both threads until both threads' CommandTimeout's are reached. + + Returns a SQLiteTransaction object. + + + + Creates a new if one isn't already + active on the connection. + + Returns the new transaction object. + + + + Forwards to the local function + + Supported isolation levels are Unspecified, Serializable, and ReadCommitted + + + + + This method is not implemented; however, the + event will still be raised. + + + + + + When the database connection is closed, all commands linked to this connection are automatically reset. + + + + + Clears the connection pool associated with the connection. Any other active connections using the same database file + will be discarded instead of returned to the pool when they are closed. + + + + + + Clears all connection pools. Any active connections will be discarded instead of sent to the pool when they are closed. + + + + + Create a new and associate it with this connection. + + Returns a new command object already assigned to this connection. + + + + Forwards to the local function. + + + + + + Parses the connection string into component parts using the custom + connection string parser. + + The connection string to parse + An array of key-value pairs representing each parameter of the connection string + + + + Parses a connection string using the built-in (i.e. framework provided) + connection string parser class and returns the key/value pairs. An + exception may be thrown if the connection string is invalid or cannot be + parsed. When compiled for the .NET Compact Framework, the custom + connection string parser is always used instead because the framework + provided one is unavailable there. + + + The connection string to parse. + + + Non-zero to throw an exception if any connection string values are not of + the type. + + The list of key/value pairs. + + + + Manual distributed transaction enlistment support + + The distributed transaction to enlist in + + + + Looks for a key in the array of key/values of the parameter string. If not found, return the specified default value + + The list to look in + The key to find + The default value to return if the key is not found + The value corresponding to the specified key, or the default value if not found. + + + + Attempts to convert the string value to an enumerated value of the specified type. + + The enumerated type to convert the string value to. + The string value to be converted. + Non-zero to make the conversion case-insensitive. + The enumerated value upon success or null upon error. + + + + Attempts to convert an input string into a byte value. + + + The string value to be converted. + + + The number styles to use for the conversion. + + + Upon sucess, this will contain the parsed byte value. + Upon failure, the value of this parameter is undefined. + + + Non-zero upon success; zero on failure. + + + + + Enables or disabled extension loading. + + + True to enable loading of extensions, false to disable. + + + + + Loads a SQLite extension library from the named dynamic link library file. + + + The name of the dynamic link library file containing the extension. + + + + + Loads a SQLite extension library from the named dynamic link library file. + + + The name of the dynamic link library file containing the extension. + + + The name of the exported function used to initialize the extension. + If null, the default "sqlite3_extension_init" will be used. + + + + + Creates a disposable module containing the implementation of a virtual + table. + + + The module object to be used when creating the disposable module. + + + + + Parses a string containing a sequence of zero or more hexadecimal + encoded byte values and returns the resulting byte array. The + "0x" prefix is not allowed on the input string. + + + The input string containing zero or more hexadecimal encoded byte + values. + + + A byte array containing the parsed byte values or null if an error + was encountered. + + + + + Creates and returns a string containing the hexadecimal encoded byte + values from the input array. + + + The input array of bytes. + + + The resulting string or null upon failure. + + + + + Parses a string containing a sequence of zero or more hexadecimal + encoded byte values and returns the resulting byte array. The + "0x" prefix is not allowed on the input string. + + + The input string containing zero or more hexadecimal encoded byte + values. + + + Upon failure, this will contain an appropriate error message. + + + A byte array containing the parsed byte values or null if an error + was encountered. + + + + + Opens the connection using the parameters found in the . + + + + + Opens the connection using the parameters found in the and then returns it. + + The current connection object. + + + + This method causes any pending database operation to abort and return at + its earliest opportunity. This routine is typically called in response + to a user action such as pressing "Cancel" or Ctrl-C where the user wants + a long query operation to halt immediately. It is safe to call this + routine from any thread. However, it is not safe to call this routine + with a database connection that is closed or might close before this method + returns. + + + + + Returns various global memory statistics for the SQLite core library via + a dictionary of key/value pairs. Currently, only the "MemoryUsed" and + "MemoryHighwater" keys are returned and they have values that correspond + to the values that could be obtained via the + and connection properties. + + + This dictionary will be populated with the global memory statistics. It + will be created if necessary. + + + + + Attempts to free as much heap memory as possible for this database connection. + + + + + Attempts to free N bytes of heap memory by deallocating non-essential memory + allocations held by the database library. Memory used to cache database pages + to improve performance is an example of non-essential memory. This is a no-op + returning zero if the SQLite core library was not compiled with the compile-time + option SQLITE_ENABLE_MEMORY_MANAGEMENT. Optionally, attempts to reset and/or + compact the Win32 native heap, if applicable. + + + The requested number of bytes to free. + + + Non-zero to attempt a heap reset. + + + Non-zero to attempt heap compaction. + + + The number of bytes actually freed. This value may be zero. + + + This value will be non-zero if the heap reset was successful. + + + The size of the largest committed free block in the heap, in bytes. + This value will be zero unless heap compaction is enabled. + + + A standard SQLite return code (i.e. zero for success and non-zero + for failure). + + + + + Sets the status of the memory usage tracking subsystem in the SQLite core library. By default, this is enabled. + If this is disabled, memory usage tracking will not be performed. This is not really a per-connection value, it is + global to the process. + + Non-zero to enable memory usage tracking, zero otherwise. + A standard SQLite return code (i.e. zero for success and non-zero for failure). + + + + Passes a shutdown request to the SQLite core library. Does not throw + an exception if the shutdown request fails. + + + A standard SQLite return code (i.e. zero for success and non-zero for + failure). + + + + + Passes a shutdown request to the SQLite core library. Throws an + exception if the shutdown request fails and the no-throw parameter + is non-zero. + + + Non-zero to reset the database and temporary directories to their + default values, which should be null for both. + + + When non-zero, throw an exception if the shutdown request fails. + + + + Enables or disabled extended result codes returned by SQLite + + + Enables or disabled extended result codes returned by SQLite + + + Enables or disabled extended result codes returned by SQLite + + + Add a log message via the SQLite sqlite3_log interface. + + + Add a log message via the SQLite sqlite3_log interface. + + + + Change the password (or assign a password) to an open database. + + + No readers or writers may be active for this process. The database must already be open + and if it already was password protected, the existing password must already have been supplied. + + The new password to assign to the database + + + + Change the password (or assign a password) to an open database. + + + No readers or writers may be active for this process. The database must already be open + and if it already was password protected, the existing password must already have been supplied. + + The new password to assign to the database + + + + Sets the password for a password-protected database. A password-protected database is + unusable for any operation until the password has been set. + + The password for the database + + + + Sets the password for a password-protected database. A password-protected database is + unusable for any operation until the password has been set. + + The password for the database + + + + Queries or modifies the number of retries or the retry interval (in milliseconds) for + certain I/O operations that may fail due to anti-virus software. + + The number of times to retry the I/O operation. A negative value + will cause the current count to be queried and replace that negative value. + The number of milliseconds to wait before retrying the I/O + operation. This number is multiplied by the number of retry attempts so far to come + up with the final number of milliseconds to wait. A negative value will cause the + current interval to be queried and replace that negative value. + Zero for success, non-zero for error. + + + + Removes one set of surrounding single -OR- double quotes from the string + value and returns the resulting string value. If the string is null, empty, + or contains quotes that are not balanced, nothing is done and the original + string value will be returned. + + The string value to process. + + The string value, modified to remove one set of surrounding single -OR- + double quotes, if applicable. + + + + + Expand the filename of the data source, resolving the |DataDirectory| + macro as appropriate. + + The database filename to expand + + Non-zero if the returned file name should be converted to a full path + (except when using the .NET Compact Framework). + + The expanded path and filename of the filename + + + + The following commands are used to extract schema information out of the database. Valid schema types are: + + + MetaDataCollections + + + DataSourceInformation + + + Catalogs + + + Columns + + + ForeignKeys + + + Indexes + + + IndexColumns + + + Tables + + + Views + + + ViewColumns + + + + + Returns the MetaDataCollections schema + + A DataTable of the MetaDataCollections schema + + + + Returns schema information of the specified collection + + The schema collection to retrieve + A DataTable of the specified collection + + + + Retrieves schema information using the specified constraint(s) for the specified collection + + The collection to retrieve + The restrictions to impose + A DataTable of the specified collection + + + + Builds a MetaDataCollections schema datatable + + DataTable + + + + Builds a DataSourceInformation datatable + + DataTable + + + + Build a Columns schema + + The catalog (attached database) to query, can be null + The table to retrieve schema information for, must not be null + The column to retrieve schema information for, can be null + DataTable + + + + Returns index information for the given database and catalog + + The catalog (attached database) to query, can be null + The name of the index to retrieve information for, can be null + The table to retrieve index information for, can be null + DataTable + + + + Retrieves table schema information for the database and catalog + + The catalog (attached database) to retrieve tables on + The table to retrieve, can be null + The table type, can be null + DataTable + + + + Retrieves view schema information for the database + + The catalog (attached database) to retrieve views on + The view name, can be null + DataTable + + + + Retrieves catalog (attached databases) schema information for the database + + The catalog to retrieve, can be null + DataTable + + + + Returns the base column information for indexes in a database + + The catalog to retrieve indexes for (can be null) + The table to restrict index information by (can be null) + The index to restrict index information by (can be null) + The source column to restrict index information by (can be null) + A DataTable containing the results + + + + Returns detailed column information for a specified view + + The catalog to retrieve columns for (can be null) + The view to restrict column information by (can be null) + The source column to restrict column information by (can be null) + A DataTable containing the results + + + + Retrieves foreign key information from the specified set of filters + + An optional catalog to restrict results on + An optional table to restrict results on + An optional foreign key name to restrict results on + A DataTable with the results of the query + + + + Static variable to store the connection event handlers to call. + + + + + This event is raised whenever the database is opened or closed. + + + + + This event is raised when events related to the lifecycle of a + SQLiteConnection object occur. + + + + + This property is used to obtain or set the custom connection pool + implementation to use, if any. Setting this property to null will + cause the default connection pool implementation to be used. + + + + + Returns the number of pool entries for the file name associated with this connection. + + + + + The connection string containing the parameters for the connection + + + + + Parameter + Values + Required + Default + + + Data Source + + This may be a file name, the string ":memory:", or any supported URI (starting with SQLite 3.7.7). + Starting with release 1.0.86.0, in order to use more than one consecutive backslash (e.g. for a + UNC path), each of the adjoining backslash characters must be doubled (e.g. "\\Network\Share\test.db" + would become "\\\\Network\Share\test.db"). + + Y + + + + Version + 3 + N + 3 + + + UseUTF16Encoding + True
False
+ N + False +
+ + DateTimeFormat + + Ticks - Use the value of DateTime.Ticks.
+ ISO8601 - Use the ISO-8601 format. Uses the "yyyy-MM-dd HH:mm:ss.FFFFFFFK" format for UTC + DateTime values and "yyyy-MM-dd HH:mm:ss.FFFFFFF" format for local DateTime values).
+ JulianDay - The interval of time in days and fractions of a day since January 1, 4713 BC.
+ UnixEpoch - The whole number of seconds since the Unix epoch (January 1, 1970).
+ InvariantCulture - Any culture-independent string value that the .NET Framework can interpret as a valid DateTime.
+ CurrentCulture - Any string value that the .NET Framework can interpret as a valid DateTime using the current culture.
+ N + ISO8601 +
+ + DateTimeKind + Unspecified - Not specified as either UTC or local time.
Utc - The time represented is UTC.
Local - The time represented is local time.
+ N + Unspecified +
+ + DateTimeFormatString + The exact DateTime format string to use for all formatting and parsing of all DateTime + values for this connection. + N + null + + + BaseSchemaName + Some base data classes in the framework (e.g. those that build SQL queries dynamically) + assume that an ADO.NET provider cannot support an alternate catalog (i.e. database) without supporting + alternate schemas as well; however, SQLite does not fit into this model. Therefore, this value is used + as a placeholder and removed prior to preparing any SQL statements that may contain it. + N + sqlite_default_schema + + + BinaryGUID + True - Store GUID columns in binary form
False - Store GUID columns as text
+ N + True +
+ + Cache Size + {size in bytes} + N + 2000 + + + Synchronous + Normal - Normal file flushing behavior
Full - Full flushing after all writes
Off - Underlying OS flushes I/O's
+ N + Full +
+ + Page Size + {size in bytes} + N + 1024 + + + Password + {password} - Using this parameter requires that the CryptoAPI based codec be enabled at compile-time for both the native interop assembly and the core managed assemblies; otherwise, using this parameter may result in an exception being thrown when attempting to open the connection. + N + + + + HexPassword + {hexPassword} - Must contain a sequence of zero or more hexadecimal encoded byte values without a leading "0x" prefix. Using this parameter requires that the CryptoAPI based codec be enabled at compile-time for both the native interop assembly and the core managed assemblies; otherwise, using this parameter may result in an exception being thrown when attempting to open the connection. + N + + + + Enlist + Y - Automatically enlist in distributed transactions
N - No automatic enlistment
+ N + Y +
+ + Pooling + + True - Use connection pooling.
+ False - Do not use connection pooling.

+ WARNING: When using the default connection pool implementation, + setting this property to True should be avoided by applications that + make use of COM (either directly or indirectly) due to possible + deadlocks that can occur during the finalization of some COM objects. +
+ N + False +
+ + FailIfMissing + True - Don't create the database if it does not exist, throw an error instead
False - Automatically create the database if it does not exist
+ N + False +
+ + Max Page Count + {size in pages} - Limits the maximum number of pages (limits the size) of the database + N + 0 + + + Legacy Format + True - Use the more compatible legacy 3.x database format
False - Use the newer 3.3x database format which compresses numbers more effectively
+ N + False +
+ + Default Timeout + {time in seconds}
The default command timeout
+ N + 30 +
+ + Journal Mode + Delete - Delete the journal file after a commit
Persist - Zero out and leave the journal file on disk after a commit
Off - Disable the rollback journal entirely
+ N + Delete +
+ + Read Only + True - Open the database for read only access
False - Open the database for normal read/write access
+ N + False +
+ + Max Pool Size + The maximum number of connections for the given connection string that can be in the connection pool + N + 100 + + + Default IsolationLevel + The default transaciton isolation level + N + Serializable + + + Foreign Keys + Enable foreign key constraints + N + False + + + Flags + Extra behavioral flags for the connection. See the enumeration for possible values. + N + Default + + + SetDefaults + + True - Apply the default connection settings to the opened database.
+ False - Skip applying the default connection settings to the opened database. +
+ N + True +
+ + ToFullPath + + True - Attempt to expand the data source file name to a fully qualified path before opening.
+ False - Skip attempting to expand the data source file name to a fully qualified path before opening. +
+ N + True +
+
+
+
+ + + Returns the data source file name without extension or path. + + + + + Returns the string "main". + + + + + Gets/sets the default command timeout for newly-created commands. This is especially useful for + commands used internally such as inside a SQLiteTransaction, where setting the timeout is not possible. + This can also be set in the ConnectionString with "Default Timeout" + + + + + Non-zero if the built-in (i.e. framework provided) connection string + parser should be used when opening the connection. + + + + + Gets/sets the extra behavioral flags for this connection. See the + enumeration for a list of + possible values. + + + + + Returns non-zero if the underlying native connection handle is + owned by this instance. + + + + + Returns the version of the underlying SQLite database engine + + + + + Returns the rowid of the most recent successful INSERT into the database from this connection. + + + + + Returns the number of rows changed by the last INSERT, UPDATE, or DELETE statement executed on + this connection. + + + + + Returns non-zero if the given database connection is in autocommit mode. + Autocommit mode is on by default. Autocommit mode is disabled by a BEGIN + statement. Autocommit mode is re-enabled by a COMMIT or ROLLBACK. + + + + + Returns the amount of memory (in bytes) currently in use by the SQLite core library. + + + + + Returns the maximum amount of memory (in bytes) used by the SQLite core library since the high-water mark was last reset. + + + + + Returns a string containing the define constants (i.e. compile-time + options) used to compile the core managed assembly, delimited with + spaces. + + + + + Returns the version of the underlying SQLite core library. + + + + + This method returns the string whose value is the same as the + SQLITE_SOURCE_ID C preprocessor macro used when compiling the + SQLite core library. + + + + + This method returns the version of the interop SQLite assembly + used. If the SQLite interop assembly is not in use or the + necessary information cannot be obtained for any reason, a null + value may be returned. + + + + + This method returns the string whose value contains the unique + identifier for the source checkout used to build the interop + assembly. If the SQLite interop assembly is not in use or the + necessary information cannot be obtained for any reason, a null + value may be returned. + + + + + This method returns the version of the managed components used + to interact with the SQLite core library. If the necessary + information cannot be obtained for any reason, a null value may + be returned. + + + + + This method returns the string whose value contains the unique + identifier for the source checkout used to build the managed + components currently executing. If the necessary information + cannot be obtained for any reason, a null value may be returned. + + + + + Returns the state of the connection. + + + + + This event is raised whenever SQLite encounters an action covered by the + authorizer during query preparation. Changing the value of the + property will determine if + the specific action will be allowed, ignored, or denied. For the entire + duration of the event, the associated connection and statement objects + must not be modified, either directly or indirectly, by the called code. + + + + + This event is raised whenever SQLite makes an update/delete/insert into the database on + this connection. It only applies to the given connection. + + + + + This event is raised whenever SQLite is committing a transaction. + Return non-zero to trigger a rollback. + + + + + This event is raised whenever SQLite statement first begins executing on + this connection. It only applies to the given connection. + + + + + This event is raised whenever SQLite is rolling back a transaction. + + + + + Returns the instance. + + + + + The I/O file cache flushing behavior for the connection + + + + + Normal file flushing at critical sections of the code + + + + + Full file flushing after every write operation + + + + + Use the default operating system's file flushing, SQLite does not explicitly flush the file buffers after writing + + + + + Raised when authorization is required to perform an action contained + within a SQL query. + + The connection performing the action. + A that contains the + event data. + + + + Raised when a transaction is about to be committed. To roll back a transaction, set the + rollbackTrans boolean value to true. + + The connection committing the transaction + Event arguments on the transaction + + + + Raised when data is inserted, updated and deleted on a given connection + + The connection committing the transaction + The event parameters which triggered the event + + + + Raised when a statement first begins executing on a given connection + + The connection executing the statement + Event arguments of the trace + + + + Raised between each backup step. + + + The source database connection. + + + The source database name. + + + The destination database connection. + + + The destination database name. + + + The number of pages copied with each step. + + + The number of pages remaining to be copied. + + + The total number of pages in the source database. + + + Set to true if the operation needs to be retried due to database + locking issues; otherwise, set to false. + + + True to continue with the backup process or false to halt the backup + process, rolling back any changes that have been made so far. + + + + + The data associated with a call into the authorizer. + + + + + The user-defined native data associated with this event. Currently, + this will always contain the value of . + + + + + The action code responsible for the current call into the authorizer. + + + + + The first string argument for the current call into the authorizer. + The exact value will vary based on the action code, see the + enumeration for possible + values. + + + + + The second string argument for the current call into the authorizer. + The exact value will vary based on the action code, see the + enumeration for possible + values. + + + + + The database name for the current call into the authorizer, if + applicable. + + + + + The name of the inner-most trigger or view that is responsible for + the access attempt or a null value if this access attempt is directly + from top-level SQL code. + + + + + The return code for the current call into the authorizer. + + + + + Constructs an instance of this class with default property values. + + + + + Constructs an instance of this class with specific property values. + + + The user-defined native data associated with this event. + + + The authorizer action code. + + + The first authorizer argument. + + + The second authorizer argument. + + + The database name, if applicable. + + + The name of the inner-most trigger or view that is responsible for + the access attempt or a null value if this access attempt is directly + from top-level SQL code. + + + The authorizer return code. + + + + + Whenever an update event is triggered on a connection, this enum will indicate + exactly what type of operation is being performed. + + + + + A row is being deleted from the given database and table + + + + + A row is being inserted into the table. + + + + + A row is being updated in the table. + + + + + Passed during an Update callback, these event arguments detail the type of update operation being performed + on the given connection. + + + + + The name of the database being updated (usually "main" but can be any attached or temporary database) + + + + + The name of the table being updated + + + + + The type of update being performed (insert/update/delete) + + + + + The RowId affected by this update. + + + + + Event arguments raised when a transaction is being committed + + + + + Set to true to abort the transaction and trigger a rollback + + + + + Passed during an Trace callback, these event arguments contain the UTF-8 rendering of the SQL statement text + + + + + SQL statement text as the statement first begins executing + + + + + This interface represents a custom connection pool implementation + usable by System.Data.SQLite. + + + + + Counts the number of pool entries matching the specified file name. + + + The file name to match or null to match all files. + + + The pool entry counts for each matching file. + + + The total number of connections successfully opened from any pool. + + + The total number of connections successfully closed from any pool. + + + The total number of pool entries for all matching files. + + + + + Disposes of all pooled connections associated with the specified + database file name. + + + The database file name. + + + + + Disposes of all pooled connections. + + + + + Adds a connection to the pool of those associated with the + specified database file name. + + + The database file name. + + + The database connection handle. + + + The connection pool version at the point the database connection + handle was received from the connection pool. This is also the + connection pool version that the database connection handle was + created under. + + + + + Removes a connection from the pool of those associated with the + specified database file name with the intent of using it to + interact with the database. + + + The database file name. + + + The new maximum size of the connection pool for the specified + database file name. + + + The connection pool version associated with the returned database + connection handle, if any. + + + The database connection handle associated with the specified + database file name or null if it cannot be obtained. + + + + + This default method implementations in this class should not be used by + applications that make use of COM (either directly or indirectly) due + to possible deadlocks that can occur during finalization of some COM + objects. + + + + + This field is used to synchronize access to the private static data + in this class. + + + + + When this field is non-null, it will be used to provide the + implementation of all the connection pool methods; otherwise, + the default method implementations will be used. + + + + + The dictionary of connection pools, based on the normalized file + name of the SQLite database. + + + + + The default version number new pools will get. + + + + + The number of connections successfully opened from any pool. + This value is incremented by the Remove method. + + + + + The number of connections successfully closed from any pool. + This value is incremented by the Add method. + + + + + Counts the number of pool entries matching the specified file name. + + + The file name to match or null to match all files. + + + The pool entry counts for each matching file. + + + The total number of connections successfully opened from any pool. + + + The total number of connections successfully closed from any pool. + + + The total number of pool entries for all matching files. + + + + + Disposes of all pooled connections associated with the specified + database file name. + + + The database file name. + + + + + Disposes of all pooled connections. + + + + + Adds a connection to the pool of those associated with the + specified database file name. + + + The database file name. + + + The database connection handle. + + + The connection pool version at the point the database connection + handle was received from the connection pool. This is also the + connection pool version that the database connection handle was + created under. + + + + + Removes a connection from the pool of those associated with the + specified database file name with the intent of using it to + interact with the database. + + + The database file name. + + + The new maximum size of the connection pool for the specified + database file name. + + + The connection pool version associated with the returned database + connection handle, if any. + + + The database connection handle associated with the specified + database file name or null if it cannot be obtained. + + + + + This method is used to obtain a reference to the custom connection + pool implementation currently in use, if any. + + + The custom connection pool implementation or null if the default + connection pool implementation should be used. + + + + + This method is used to set the reference to the custom connection + pool implementation to use, if any. + + + The custom connection pool implementation to use or null if the + default connection pool implementation should be used. + + + + + We do not have to thread-lock anything in this function, because it + is only called by other functions above which already take the lock. + + + The pool queue to resize. + + + If a function intends to add to the pool, this is true, which + forces the resize to take one more than it needs from the pool. + + + + + Keeps track of connections made on a specified file. The PoolVersion + dictates whether old objects get returned to the pool or discarded + when no longer in use. + + + + + The queue of weak references to the actual database connection + handles. + + + + + This pool version associated with the database connection + handles in this pool queue. + + + + + The maximum size of this pool queue. + + + + + Constructs a connection pool queue using the specified version + and maximum size. Normally, all the database connection + handles in this pool are associated with a single database file + name. + + + The initial pool version for this connection pool queue. + + + The initial maximum size for this connection pool queue. + + + + + SQLite implementation of DbConnectionStringBuilder. + + + + + Properties of this class + + + + + Constructs a new instance of the class + + + Default constructor + + + + + Constructs a new instance of the class using the specified connection string. + + The connection string to parse + + + + Private initializer, which assigns the connection string and resets the builder + + The connection string to assign + + + + Helper function for retrieving values from the connectionstring + + The keyword to retrieve settings for + The resulting parameter value + Returns true if the value was found and returned + + + + Fallback method for MONO, which doesn't implement DbConnectionStringBuilder.GetProperties() + + The hashtable to fill with property descriptors + + + + Gets/Sets the default version of the SQLite engine to instantiate. Currently the only valid value is 3, indicating version 3 of the sqlite library. + + + + + Gets/Sets the synchronization mode (file flushing) of the connection string. Default is "Normal". + + + + + Gets/Sets the encoding for the connection string. The default is "False" which indicates UTF-8 encoding. + + + + + Gets/Sets whether or not to use connection pooling. The default is "False" + + + + + Gets/Sets whethor not to store GUID's in binary format. The default is True + which saves space in the database. + + + + + Gets/Sets the filename to open on the connection string. + + + + + An alternate to the data source property + + + + + An alternate to the data source property that uses the SQLite URI syntax. + + + + + Gets/sets the default command timeout for newly-created commands. This is especially useful for + commands used internally such as inside a SQLiteTransaction, where setting the timeout is not possible. + + + + + Determines whether or not the connection will automatically participate + in the current distributed transaction (if one exists) + + + + + If set to true, will throw an exception if the database specified in the connection + string does not exist. If false, the database will be created automatically. + + + + + If enabled, uses the legacy 3.xx format for maximum compatibility, but results in larger + database sizes. + + + + + When enabled, the database will be opened for read-only access and writing will be disabled. + + + + + Gets/sets the database encryption password + + + + + Gets/sets the database encryption hexadecimal password + + + + + Gets/Sets the page size for the connection. + + + + + Gets/Sets the maximum number of pages the database may hold + + + + + Gets/Sets the cache size for the connection. + + + + + Gets/Sets the DateTime format for the connection. + + + + + Gets/Sets the DateTime kind for the connection. + + + + + Gets/sets the DateTime format string used for formatting + and parsing purposes. + + + + + Gets/Sets the placeholder base schema name used for + .NET Framework compatibility purposes. + + + + + Determines how SQLite handles the transaction journal file. + + + + + Sets the default isolation level for transactions on the connection. + + + + + If enabled, use foreign key constraints + + + + + Gets/Sets the extra behavioral flags. + + + + + If enabled, apply the default connection settings to opened databases. + + + + + If enabled, attempt to resolve the provided data source file name to a + full path before opening. + + + + + SQLite has very limited types, and is inherently text-based. The first 5 types below represent the sum of all types SQLite + understands. The DateTime extension to the spec is for internal use only. + + + + + Not used + + + + + All integers in SQLite default to Int64 + + + + + All floating point numbers in SQLite default to double + + + + + The default data type of SQLite is text + + + + + Typically blob types are only seen when returned from a function + + + + + Null types can be returned from functions + + + + + Used internally by this provider + + + + + Used internally by this provider + + + + + These are the event types associated with the + + delegate (and its corresponding event) and the + class. + + + + + Not used. + + + + + Not used. + + + + + The connection is being opened. + + + + + The connection string has been parsed. + + + + + The connection was opened. + + + + + The method was called on the + connection. + + + + + A transaction was created using the connection. + + + + + The connection was enlisted into a transaction. + + + + + A command was created using the connection. + + + + + A data reader was created using the connection. + + + + + An instance of a derived class has + been created to wrap a native resource. + + + + + The connection is being closed. + + + + + The connection was closed. + + + + + This implementation of SQLite for ADO.NET can process date/time fields in + databases in one of six formats. + + + ISO8601 format is more compatible, readable, fully-processable, but less + accurate as it does not provide time down to fractions of a second. + JulianDay is the numeric format the SQLite uses internally and is arguably + the most compatible with 3rd party tools. It is not readable as text + without post-processing. Ticks less compatible with 3rd party tools that + query the database, and renders the DateTime field unreadable as text + without post-processing. UnixEpoch is more compatible with Unix systems. + InvariantCulture allows the configured format for the invariant culture + format to be used and is human readable. CurrentCulture allows the + configured format for the current culture to be used and is also human + readable. + + The preferred order of choosing a DateTime format is JulianDay, ISO8601, + and then Ticks. Ticks is mainly present for legacy code support. + + + + + Use the value of DateTime.Ticks. This value is not recommended and is not well supported with LINQ. + + + + + Use the ISO-8601 format. Uses the "yyyy-MM-dd HH:mm:ss.FFFFFFFK" format for UTC DateTime values and + "yyyy-MM-dd HH:mm:ss.FFFFFFF" format for local DateTime values). + + + + + The interval of time in days and fractions of a day since January 1, 4713 BC. + + + + + The whole number of seconds since the Unix epoch (January 1, 1970). + + + + + Any culture-independent string value that the .NET Framework can interpret as a valid DateTime. + + + + + Any string value that the .NET Framework can interpret as a valid DateTime using the current culture. + + + + + The default format for this provider. + + + + + This enum determines how SQLite treats its journal file. + + + By default SQLite will create and delete the journal file when needed during a transaction. + However, for some computers running certain filesystem monitoring tools, the rapid + creation and deletion of the journal file can cause those programs to fail, or to interfere with SQLite. + + If a program or virus scanner is interfering with SQLite's journal file, you may receive errors like "unable to open database file" + when starting a transaction. If this is happening, you may want to change the default journal mode to Persist. + + + + + The default mode, this causes SQLite to use the existing journaling mode for the database. + + + + + SQLite will create and destroy the journal file as-needed. + + + + + When this is set, SQLite will keep the journal file even after a transaction has completed. It's contents will be erased, + and the journal re-used as often as needed. If it is deleted, it will be recreated the next time it is needed. + + + + + This option disables the rollback journal entirely. Interrupted transactions or a program crash can cause database + corruption in this mode! + + + + + SQLite will truncate the journal file to zero-length instead of deleting it. + + + + + SQLite will store the journal in volatile RAM. This saves disk I/O but at the expense of database safety and integrity. + If the application using SQLite crashes in the middle of a transaction when the MEMORY journaling mode is set, then the + database file will very likely go corrupt. + + + + + SQLite uses a write-ahead log instead of a rollback journal to implement transactions. The WAL journaling mode is persistent; + after being set it stays in effect across multiple database connections and after closing and reopening the database. A database + in WAL journaling mode can only be accessed by SQLite version 3.7.0 or later. + + + + + Possible values for the "synchronous" database setting. This setting determines + how often the database engine calls the xSync method of the VFS. + + + + + Use the default "synchronous" database setting. Currently, this should be + the same as using the FULL mode. + + + + + The database engine continues without syncing as soon as it has handed + data off to the operating system. If the application running SQLite + crashes, the data will be safe, but the database might become corrupted + if the operating system crashes or the computer loses power before that + data has been written to the disk surface. + + + + + The database engine will still sync at the most critical moments, but + less often than in FULL mode. There is a very small (though non-zero) + chance that a power failure at just the wrong time could corrupt the + database in NORMAL mode. + + + + + The database engine will use the xSync method of the VFS to ensure that + all content is safely written to the disk surface prior to continuing. + This ensures that an operating system crash or power failure will not + corrupt the database. FULL synchronous is very safe, but it is also + slower. + + + + + The requested command execution type. This controls which method of the + object will be called. + + + + + Do nothing. No method will be called. + + + + + The command is not expected to return a result -OR- the result is not + needed. The or + method + will be called. + + + + + The command is expected to return a scalar result -OR- the result should + be limited to a scalar result. The + or method will + be called. + + + + + The command is expected to return result. + The or + method will + be called. + + + + + Use the default command execution type. Using this value is the same + as using the value. + + + + + The action code responsible for the current call into the authorizer. + + + + + No action is being performed. This value should not be used from + external code. + + + + + No longer used. + + + + + An index will be created. The action-specific arguments are the + index name and the table name. + + + + + + A table will be created. The action-specific arguments are the + table name and a null value. + + + + + A temporary index will be created. The action-specific arguments + are the index name and the table name. + + + + + A temporary table will be created. The action-specific arguments + are the table name and a null value. + + + + + A temporary trigger will be created. The action-specific arguments + are the trigger name and the table name. + + + + + A temporary view will be created. The action-specific arguments are + the view name and a null value. + + + + + A trigger will be created. The action-specific arguments are the + trigger name and the table name. + + + + + A view will be created. The action-specific arguments are the view + name and a null value. + + + + + A DELETE statement will be executed. The action-specific arguments + are the table name and a null value. + + + + + An index will be dropped. The action-specific arguments are the + index name and the table name. + + + + + A table will be dropped. The action-specific arguments are the tables + name and a null value. + + + + + A temporary index will be dropped. The action-specific arguments are + the index name and the table name. + + + + + A temporary table will be dropped. The action-specific arguments are + the table name and a null value. + + + + + A temporary trigger will be dropped. The action-specific arguments + are the trigger name and the table name. + + + + + A temporary view will be dropped. The action-specific arguments are + the view name and a null value. + + + + + A trigger will be dropped. The action-specific arguments are the + trigger name and the table name. + + + + + A view will be dropped. The action-specific arguments are the view + name and a null value. + + + + + An INSERT statement will be executed. The action-specific arguments + are the table name and a null value. + + + + + A PRAGMA statement will be executed. The action-specific arguments + are the name of the PRAGMA and the new value or a null value. + + + + + A table column will be read. The action-specific arguments are the + table name and the column name. + + + + + A SELECT statement will be executed. The action-specific arguments + are both null values. + + + + + A transaction will be started, committed, or rolled back. The + action-specific arguments are the name of the operation (BEGIN, + COMMIT, or ROLLBACK) and a null value. + + + + + An UPDATE statement will be executed. The action-specific arguments + are the table name and the column name. + + + + + A database will be attached to the connection. The action-specific + arguments are the database file name and a null value. + + + + + A database will be detached from the connection. The action-specific + arguments are the database name and a null value. + + + + + The schema of a table will be altered. The action-specific arguments + are the database name and the table name. + + + + + An index will be deleted and then recreated. The action-specific + arguments are the index name and a null value. + + + + + A table will be analyzed to gathers statistics about it. The + action-specific arguments are the table name and a null value. + + + + + A virtual table will be created. The action-specific arguments are + the table name and the module name. + + + + + A virtual table will be dropped. The action-specific arguments are + the table name and the module name. + + + + + A SQL function will be called. The action-specific arguments are a + null value and the function name. + + + + + A savepoint will be created, released, or rolled back. The + action-specific arguments are the name of the operation (BEGIN, + RELEASE, or ROLLBACK) and the savepoint name. + + + + + The return code for the current call into the authorizer. + + + + + The action will be allowed. + + + + + The overall action will be disallowed and an error message will be + returned from the query preparation method. + + + + + The specific action will be disallowed; however, the overall action + will continue. The exact effects of this return code vary depending + on the specific action, please refer to the SQLite core library + documentation for futher details. + + + + + Class used internally to determine the datatype of a column in a resultset + + + + + The DbType of the column, or DbType.Object if it cannot be determined + + + + + The affinity of a column, used for expressions or when Type is DbType.Object + + + + + SQLite implementation of DbDataAdapter. + + + + + This class is just a shell around the DbDataAdapter. Nothing from + DbDataAdapter is overridden here, just a few constructors are defined. + + + Default constructor. + + + + + Constructs a data adapter using the specified select command. + + + The select command to associate with the adapter. + + + + + Constructs a data adapter with the supplied select command text and + associated with the specified connection. + + + The select command text to associate with the data adapter. + + + The connection to associate with the select command. + + + + + Constructs a data adapter with the specified select command text, + and using the specified database connection string. + + + The select command text to use to construct a select command. + + + A connection string suitable for passing to a new SQLiteConnection, + which is associated with the select command. + + + + + Constructs a data adapter with the specified select command text, + and using the specified database connection string. + + + The select command text to use to construct a select command. + + + A connection string suitable for passing to a new SQLiteConnection, + which is associated with the select command. + + + Non-zero to parse the connection string using the built-in (i.e. + framework provided) parser when opening the connection. + + + + + Raised by the underlying DbDataAdapter when a row is being updated + + The event's specifics + + + + Raised by DbDataAdapter after a row is updated + + The event's specifics + + + + Row updating event handler + + + + + Row updated event handler + + + + + Gets/sets the select command for this DataAdapter + + + + + Gets/sets the insert command for this DataAdapter + + + + + Gets/sets the update command for this DataAdapter + + + + + Gets/sets the delete command for this DataAdapter + + + + + SQLite implementation of DbDataReader. + + + + + Underlying command this reader is attached to + + + + + Index of the current statement in the command being processed + + + + + Current statement being Read() + + + + + State of the current statement being processed. + -1 = First Step() executed, so the first Read() will be ignored + 0 = Actively reading + 1 = Finished reading + 2 = Non-row-returning statement, no records + + + + + Number of records affected by the insert/update statements executed on the command + + + + + Count of fields (columns) in the row-returning statement currently being processed + + + + + Maps the field (column) names to their corresponding indexes within the results. + + + + + Datatypes of active fields (columns) in the current statement, used for type-restricting data + + + + + The behavior of the datareader + + + + + If set, then dispose of the command object when the reader is finished + + + + + If set, then raise an exception when the object is accessed after being disposed. + + + + + An array of rowid's for the active statement if CommandBehavior.KeyInfo is specified + + + + + Matches the version of the connection. + + + + + The "stub" (i.e. placeholder) base schema name to use when returning + column schema information. Matches the base schema name used by the + associated connection. + + + + + Internal constructor, initializes the datareader and sets up to begin executing statements + + The SQLiteCommand this data reader is for + The expected behavior of the data reader + + + + Dispose of all resources used by this datareader. + + + + + + Closes the datareader, potentially closing the connection as well if CommandBehavior.CloseConnection was specified. + + + + + Throw an error if the datareader is closed + + + + + Throw an error if a row is not loaded + + + + + Enumerator support + + Returns a DbEnumerator object. + + + + SQLite is inherently un-typed. All datatypes in SQLite are natively strings. The definition of the columns of a table + and the affinity of returned types are all we have to go on to type-restrict data in the reader. + + This function attempts to verify that the type of data being requested of a column matches the datatype of the column. In + the case of columns that are not backed into a table definition, we attempt to match up the affinity of a column (int, double, string or blob) + to a set of known types that closely match that affinity. It's not an exact science, but its the best we can do. + + + This function throws an InvalidTypeCast() exception if the requested type doesn't match the column's definition or affinity. + + The index of the column to type-check + The type we want to get out of the column + + + + Retrieves the column as a boolean value + + The index of the column to retrieve + bool + + + + Retrieves the column as a single byte value + + The index of the column to retrieve + byte + + + + Retrieves a column as an array of bytes (blob) + + The index of the column to retrieve + The zero-based index of where to begin reading the data + The buffer to write the bytes into + The zero-based index of where to begin writing into the array + The number of bytes to retrieve + The actual number of bytes written into the array + + To determine the number of bytes in the column, pass a null value for the buffer. The total length will be returned. + + + + + Returns the column as a single character + + The index of the column to retrieve + char + + + + Retrieves a column as an array of chars (blob) + + The index of the column to retrieve + The zero-based index of where to begin reading the data + The buffer to write the characters into + The zero-based index of where to begin writing into the array + The number of bytes to retrieve + The actual number of characters written into the array + + To determine the number of characters in the column, pass a null value for the buffer. The total length will be returned. + + + + + Retrieves the name of the back-end datatype of the column + + The index of the column to retrieve + string + + + + Retrieve the column as a date/time value + + The index of the column to retrieve + DateTime + + + + Retrieve the column as a decimal value + + The index of the column to retrieve + decimal + + + + Returns the column as a double + + The index of the column to retrieve + double + + + + Returns the .NET type of a given column + + The index of the column to retrieve + Type + + + + Returns a column as a float value + + The index of the column to retrieve + float + + + + Returns the column as a Guid + + The index of the column to retrieve + Guid + + + + Returns the column as a short + + The index of the column to retrieve + Int16 + + + + Retrieves the column as an int + + The index of the column to retrieve + Int32 + + + + Retrieves the column as a long + + The index of the column to retrieve + Int64 + + + + Retrieves the name of the column + + The index of the column to retrieve + string + + + + Retrieves the i of a column, given its name + + The name of the column to retrieve + The int i of the column + + + + Schema information in SQLite is difficult to map into .NET conventions, so a lot of work must be done + to gather the necessary information so it can be represented in an ADO.NET manner. + + Returns a DataTable containing the schema information for the active SELECT statement being processed. + + + + Retrieves the column as a string + + The index of the column to retrieve + string + + + + Retrieves the column as an object corresponding to the underlying datatype of the column + + The index of the column to retrieve + object + + + + Retreives the values of multiple columns, up to the size of the supplied array + + The array to fill with values from the columns in the current resultset + The number of columns retrieved + + + + Returns a collection containing all the column names and values for the + current row of data in the current resultset, if any. If there is no + current row or no current resultset, an exception may be thrown. + + + The collection containing the column name and value information for the + current row of data in the current resultset or null if this information + cannot be obtained. + + + + + Returns True if the specified column is null + + The index of the column to retrieve + True or False + + + + Moves to the next resultset in multiple row-returning SQL command. + + True if the command was successful and a new resultset is available, False otherwise. + + + + This method attempts to query the flags associated with the database + connection in use. If the database connection is disposed, the default + flags will be returned. + + + The data reader containing the databse connection to query the flags from. + + + The connection flags value. + + + + + Retrieves the SQLiteType for a given column, and caches it to avoid repetetive interop calls. + + The index of the column to retrieve + A SQLiteType structure + + + + Reads the next row from the resultset + + True if a new row was successfully loaded and is ready for processing + + + + Not implemented. Returns 0 + + + + + Returns the number of columns in the current resultset + + + + + Returns the number of visible fields in the current resultset + + + + + Returns True if the resultset has rows that can be fetched + + + + + Returns True if the data reader is closed + + + + + Retrieve the count of records affected by an update/insert command. Only valid once the data reader is closed! + + + + + Indexer to retrieve data from a column given its name + + The name of the column to retrieve data for + The value contained in the column + + + + Indexer to retrieve data from a column given its i + + The index of the column to retrieve + The value contained in the column + + + + SQLite exception class. + + + + + Private constructor for use with serialization. + + + Holds the serialized object data about the exception being thrown. + + + Contains contextual information about the source or destination. + + + + + Public constructor for generating a SQLite exception given the error + code and message. + + + The SQLite return code to report. + + + Message text to go along with the return code message text. + + + + + Public constructor that uses the base class constructor for the error + message. + + Error message text. + + + + Public constructor that uses the default base class constructor. + + + + + Public constructor that uses the base class constructor for the error + message and inner exception. + + Error message text. + The original (inner) exception. + + + + Adds extra information to the serialized object data specific to this + class type. This is only used for serialization. + + + Holds the serialized object data about the exception being thrown. + + + Contains contextual information about the source or destination. + + + + + Returns the error message for the specified SQLite return code. + + The SQLite return code. + The error message or null if it cannot be found. + + + + Returns the composite error message based on the SQLite return code + and the optional detailed error message. + + The SQLite return code. + Optional detailed error message. + Error message text for the return code. + + + + Gets the associated SQLite result code for this exception as a + . This property returns the same + underlying value as the property. + + + + + Gets the associated SQLite return code for this exception as an + . For desktop versions of the .NET Framework, + this property overrides the property of the same name within the + + class. This property returns the same underlying value as the + property. + + + + + SQLite error codes. Actually, this enumeration represents a return code, + which may also indicate success in one of several ways (e.g. SQLITE_OK, + SQLITE_ROW, and SQLITE_DONE). Therefore, the name of this enumeration is + something of a misnomer. + + + + + The error code is unknown. This error code + is only used by the managed wrapper itself. + + + + + Successful result + + + + + SQL error or missing database + + + + + Internal logic error in SQLite + + + + + Access permission denied + + + + + Callback routine requested an abort + + + + + The database file is locked + + + + + A table in the database is locked + + + + + A malloc() failed + + + + + Attempt to write a readonly database + + + + + Operation terminated by sqlite3_interrupt() + + + + + Some kind of disk I/O error occurred + + + + + The database disk image is malformed + + + + + Unknown opcode in sqlite3_file_control() + + + + + Insertion failed because database is full + + + + + Unable to open the database file + + + + + Database lock protocol error + + + + + Database is empty + + + + + The database schema changed + + + + + String or BLOB exceeds size limit + + + + + Abort due to constraint violation + + + + + Data type mismatch + + + + + Library used incorrectly + + + + + Uses OS features not supported on host + + + + + Authorization denied + + + + + Auxiliary database format error + + + + + 2nd parameter to sqlite3_bind out of range + + + + + File opened that is not a database file + + + + + Notifications from sqlite3_log() + + + + + Warnings from sqlite3_log() + + + + + sqlite3_step() has another row ready + + + + + sqlite3_step() has finished executing + + + + + Used to mask off extended result codes + + + + + SQLite implementation of . + + + SQLite implementation of . + + + + + Constructs a new instance. + + + + + Static instance member which returns an instanced class. + + + + + Creates and returns a new object. + + The new object. + + + + Creates and returns a new object. + + The new object. + + + + Creates and returns a new object. + + The new object. + + + + Creates and returns a new object. + + The new object. + + + + Creates and returns a new object. + + The new object. + + + + Creates and returns a new object. + + The new object. + + + + Will provide a object in .NET 3.5. + + The class or interface type to query for. + + + + + This event is raised whenever SQLite raises a logging event. + Note that this should be set as one of the first things in the + application. This event is provided for backward compatibility only. + New code should use the class instead. + + + + + This abstract class is designed to handle user-defined functions easily. An instance of the derived class is made for each + connection to the database. + + + Although there is one instance of a class derived from SQLiteFunction per database connection, the derived class has no access + to the underlying connection. This is necessary to deter implementers from thinking it would be a good idea to make database + calls during processing. + + It is important to distinguish between a per-connection instance, and a per-SQL statement context. One instance of this class + services all SQL statements being stepped through on that connection, and there can be many. One should never store per-statement + information in member variables of user-defined function classes. + + For aggregate functions, always create and store your per-statement data in the contextData object on the 1st step. This data will + be automatically freed for you (and Dispose() called if the item supports IDisposable) when the statement completes. + + + + + The base connection this function is attached to + + + + + Internal array used to keep track of aggregate function context data + + + + + The connection flags associated with this object (this should be the + same value as the flags associated with the parent connection object). + + + + + Holds a reference to the callback function for user functions + + + + + Holds a reference to the callbakc function for stepping in an aggregate function + + + + + Holds a reference to the callback function for finalizing an aggregate function + + + + + Holds a reference to the callback function for collation sequences + + + + + Current context of the current callback. Only valid during a callback + + + + + This static list contains all the user-defined functions declared using the proper attributes. + + + + + Internal constructor, initializes the function's internal variables. + + + + + Constructs an instance of this class using the specified data-type + conversion parameters. + + + The DateTime format to be used when converting string values to a + DateTime and binding DateTime parameters. + + + The to be used when creating DateTime + values. + + + The format string to be used when parsing and formatting DateTime + values. + + + Non-zero to create a UTF-16 data-type conversion context; otherwise, + a UTF-8 data-type conversion context will be created. + + + + + Disposes of any active contextData variables that were not automatically cleaned up. Sometimes this can happen if + someone closes the connection while a DataReader is open. + + + + + Placeholder for a user-defined disposal routine + + True if the object is being disposed explicitly + + + + Scalar functions override this method to do their magic. + + + Parameters passed to functions have only an affinity for a certain data type, there is no underlying schema available + to force them into a certain type. Therefore the only types you will ever see as parameters are + DBNull.Value, Int64, Double, String or byte[] array. + + The arguments for the command to process + You may return most simple types as a return value, null or DBNull.Value to return null, DateTime, or + you may return an Exception-derived class if you wish to return an error to SQLite. Do not actually throw the error, + just return it! + + + + Aggregate functions override this method to do their magic. + + + Typically you'll be updating whatever you've placed in the contextData field and returning as quickly as possible. + + The arguments for the command to process + The 1-based step number. This is incrememted each time the step method is called. + A placeholder for implementers to store contextual data pertaining to the current context. + + + + Aggregate functions override this method to finish their aggregate processing. + + + If you implemented your aggregate function properly, + you've been recording and keeping track of your data in the contextData object provided, and now at this stage you should have + all the information you need in there to figure out what to return. + NOTE: It is possible to arrive here without receiving a previous call to Step(), in which case the contextData will + be null. This can happen when no rows were returned. You can either return null, or 0 or some other custom return value + if that is the case. + + Your own assigned contextData, provided for you so you can return your final results. + You may return most simple types as a return value, null or DBNull.Value to return null, DateTime, or + you may return an Exception-derived class if you wish to return an error to SQLite. Do not actually throw the error, + just return it! + + + + + User-defined collation sequences override this method to provide a custom string sorting algorithm. + + The first string to compare + The second strnig to compare + 1 if param1 is greater than param2, 0 if they are equal, or -1 if param1 is less than param2 + + + + Converts an IntPtr array of context arguments to an object array containing the resolved parameters the pointers point to. + + + Parameters passed to functions have only an affinity for a certain data type, there is no underlying schema available + to force them into a certain type. Therefore the only types you will ever see as parameters are + DBNull.Value, Int64, Double, String or byte[] array. + + The number of arguments + A pointer to the array of arguments + An object array of the arguments once they've been converted to .NET values + + + + Takes the return value from Invoke() and Final() and figures out how to return it to SQLite's context. + + The context the return value applies to + The parameter to return to SQLite + + + + Internal scalar callback function, which wraps the raw context pointer and calls the virtual Invoke() method. + WARNING: Must not throw exceptions. + + A raw context pointer + Number of arguments passed in + A pointer to the array of arguments + + + + Internal collation sequence function, which wraps up the raw string pointers and executes the Compare() virtual function. + WARNING: Must not throw exceptions. + + Not used + Length of the string pv1 + Pointer to the first string to compare + Length of the string pv2 + Pointer to the second string to compare + Returns -1 if the first string is less than the second. 0 if they are equal, or 1 if the first string is greater + than the second. Returns 0 if an exception is caught. + + + + Internal collation sequence function, which wraps up the raw string pointers and executes the Compare() virtual function. + WARNING: Must not throw exceptions. + + Not used + Length of the string pv1 + Pointer to the first string to compare + Length of the string pv2 + Pointer to the second string to compare + Returns -1 if the first string is less than the second. 0 if they are equal, or 1 if the first string is greater + than the second. Returns 0 if an exception is caught. + + + + The internal aggregate Step function callback, which wraps the raw context pointer and calls the virtual Step() method. + WARNING: Must not throw exceptions. + + + This function takes care of doing the lookups and getting the important information put together to call the Step() function. + That includes pulling out the user's contextData and updating it after the call is made. We use a sorted list for this so + binary searches can be done to find the data. + + A raw context pointer + Number of arguments passed in + A pointer to the array of arguments + + + + An internal aggregate Final function callback, which wraps the context pointer and calls the virtual Final() method. + WARNING: Must not throw exceptions. + + A raw context pointer + + + + Using reflection, enumerate all assemblies in the current appdomain looking for classes that + have a SQLiteFunctionAttribute attribute, and registering them accordingly. + + + + + Manual method of registering a function. The type must still have the SQLiteFunctionAttributes in order to work + properly, but this is a workaround for the Compact Framework where enumerating assemblies is not currently supported. + + The type of the function to register + + + + Called by SQLiteBase derived classes, this function binds all user-defined functions to a connection. + It is done this way so that all user-defined functions will access the database using the same encoding scheme + as the connection (UTF-8 or UTF-16). + + + The wrapper functions that interop with SQLite will create a unique cookie value, which internally is a pointer to + all the wrapped callback functions. The interop function uses it to map CDecl callbacks to StdCall callbacks. + + The base object on which the functions are to bind + The flags associated with the parent connection object + Returns a logical list of functions which the connection should retain until it is closed. + + + + This function binds a user-defined functions to a connection. + + + The object instance associated with the + that the function should be bound to. + + + The object instance containing + the metadata for the function to be bound. + + + The object instance that implements the + function to be bound. + + + The flags associated with the parent connection object. + + + + + Returns a reference to the underlying connection's SQLiteConvert class, which can be used to convert + strings and DateTime's into the current connection's encoding schema. + + + + + Extends SQLiteFunction and allows an inherited class to obtain the collating sequence associated with a function call. + + + User-defined functions can call the GetCollationSequence() method in this class and use it to compare strings and char arrays. + + + + + Obtains the collating sequence in effect for the given function. + + + + + + The type of user-defined function to declare + + + + + Scalar functions are designed to be called and return a result immediately. Examples include ABS(), Upper(), Lower(), etc. + + + + + Aggregate functions are designed to accumulate data until the end of a call and then return a result gleaned from the accumulated data. + Examples include SUM(), COUNT(), AVG(), etc. + + + + + Collation sequences are used to sort textual data in a custom manner, and appear in an ORDER BY clause. Typically text in an ORDER BY is + sorted using a straight case-insensitive comparison function. Custom collating sequences can be used to alter the behavior of text sorting + in a user-defined manner. + + + + + An internal callback delegate declaration. + + Raw native context pointer for the user function. + Total number of arguments to the user function. + Raw native pointer to the array of raw native argument pointers. + + + + An internal final callback delegate declaration. + + Raw context pointer for the user function + + + + Internal callback delegate for implementing collation sequences + + Not used + Length of the string pv1 + Pointer to the first string to compare + Length of the string pv2 + Pointer to the second string to compare + Returns -1 if the first string is less than the second. 0 if they are equal, or 1 if the first string is greater + than the second. + + + + The type of collating sequence + + + + + The built-in BINARY collating sequence + + + + + The built-in NOCASE collating sequence + + + + + The built-in REVERSE collating sequence + + + + + A custom user-defined collating sequence + + + + + The encoding type the collation sequence uses + + + + + The collation sequence is UTF8 + + + + + The collation sequence is UTF16 little-endian + + + + + The collation sequence is UTF16 big-endian + + + + + A struct describing the collating sequence a function is executing in + + + + + The name of the collating sequence + + + + + The type of collating sequence + + + + + The text encoding of the collation sequence + + + + + Context of the function that requested the collating sequence + + + + + Calls the base collating sequence to compare two strings + + The first string to compare + The second string to compare + -1 if s1 is less than s2, 0 if s1 is equal to s2, and 1 if s1 is greater than s2 + + + + Calls the base collating sequence to compare two character arrays + + The first array to compare + The second array to compare + -1 if c1 is less than c2, 0 if c1 is equal to c2, and 1 if c1 is greater than c2 + + + + A simple custom attribute to enable us to easily find user-defined functions in + the loaded assemblies and initialize them in SQLite as connections are made. + + + + + Default constructor, initializes the internal variables for the function. + + + + + Constructs an instance of this class. + + + The name of the function, as seen by the SQLite core library. + + + The number of arguments that the function will accept. + + + The type of function being declared. This will either be Scalar, + Aggregate, or Collation. + + + + + The function's name as it will be used in SQLite command text. + + + + + The number of arguments this function expects. -1 if the number of arguments is variable. + + + + + The type of function this implementation will be. + + + + + The object instance that describes the class + containing the implementation for the associated function. + + + + + This class provides key info for a given SQLite statement. + + Providing key information for a given statement is non-trivial :( + + + + + + This function does all the nasty work at determining what keys need to be returned for + a given statement. + + + + + + + + Make sure all the subqueries are open and ready and sync'd with the current rowid + of the table they're supporting + + + + + Release any readers on any subqueries + + + + + Append all the columns we've added to the original query to the schema + + + + + + How many additional columns of keyinfo we're holding + + + + + Used to support CommandBehavior.KeyInfo + + + + + A single sub-query for a given table/database. + + + + + Event data for logging event handlers. + + + + + The error code. The type of this object value should be + or . + + + + + SQL statement text as the statement first begins executing + + + + + Extra data associated with this event, if any. + + + + + Constructs the object. + + Should be null. + + The error code. The type of this object value should be + or . + + The error message, if any. + The extra data, if any. + + + + Raised when a log event occurs. + + The current connection + Event arguments of the trace + + + + Manages the SQLite custom logging functionality and the associated + callback for the whole process. + + + + + Object used to synchronize access to the static instance data + for this class. + + + + + Member variable to store the AppDomain.DomainUnload event handler. + + + + + The default log event handler. + + + + + The log callback passed to native SQLite engine. This must live + as long as the SQLite library has a pointer to it. + + + + + The base SQLite object to interop with. + + + + + This will be non-zero if logging is currently enabled. + + + + + Initializes the SQLite logging facilities. + + + + + Handles the AppDomain being unloaded. + + Should be null. + The data associated with this event. + + + + Log a message to all the registered log event handlers without going + through the SQLite library. + + The message to be logged. + + + + Log a message to all the registered log event handlers without going + through the SQLite library. + + The SQLite error code. + The message to be logged. + + + + Log a message to all the registered log event handlers without going + through the SQLite library. + + The integer error code. + The message to be logged. + + + + Log a message to all the registered log event handlers without going + through the SQLite library. + + + The error code. The type of this object value should be + System.Int32 or SQLiteErrorCode. + + The message to be logged. + + + + Creates and initializes the default log event handler. + + + + + Adds the default log event handler to the list of handlers. + + + + + Removes the default log event handler from the list of handlers. + + + + + Internal proxy function that calls any registered application log + event handlers. + + WARNING: This method is used more-or-less directly by native code, + do not modify its type signature. + + + The extra data associated with this message, if any. + + + The error code associated with this message. + + + The message string to be logged. + + + + + Default logger. Currently, uses the Trace class (i.e. sends events + to the current trace listeners, if any). + + Should be null. + The data associated with this event. + + + + Member variable to store the application log handler to call. + + + + + This event is raised whenever SQLite raises a logging event. + Note that this should be set as one of the first things in the + application. + + + + + If this property is true, logging is enabled; otherwise, logging is + disabled. When logging is disabled, no logging events will fire. + + + + + MetaDataCollections specific to SQLite + + + + + Returns a list of databases attached to the connection + + + + + Returns column information for the specified table + + + + + Returns index information for the optionally-specified table + + + + + Returns base columns for the given index + + + + + Returns the tables in the given catalog + + + + + Returns user-defined views in the given catalog + + + + + Returns underlying column information on the given view + + + + + Returns foreign key information for the given catalog + + + + + Returns the triggers on the database + + + + + SQLite implementation of DbParameter. + + + + + The data type of the parameter + + + + + The version information for mapping the parameter + + + + + The value of the data in the parameter + + + + + The source column for the parameter + + + + + The column name + + + + + The data size, unused by SQLite + + + + + Default constructor + + + + + Constructs a named parameter given the specified parameter name + + The parameter name + + + + Constructs a named parameter given the specified parameter name and initial value + + The parameter name + The initial value of the parameter + + + + Constructs a named parameter of the specified type + + The parameter name + The datatype of the parameter + + + + Constructs a named parameter of the specified type and source column reference + + The parameter name + The data type + The source column + + + + Constructs a named parameter of the specified type, source column and row version + + The parameter name + The data type + The source column + The row version information + + + + Constructs an unnamed parameter of the specified data type + + The datatype of the parameter + + + + Constructs an unnamed parameter of the specified data type and sets the initial value + + The datatype of the parameter + The initial value of the parameter + + + + Constructs an unnamed parameter of the specified data type and source column + + The datatype of the parameter + The source column + + + + Constructs an unnamed parameter of the specified data type, source column and row version + + The data type + The source column + The row version information + + + + Constructs a named parameter of the specified type and size + + The parameter name + The data type + The size of the parameter + + + + Constructs a named parameter of the specified type, size and source column + + The name of the parameter + The data type + The size of the parameter + The source column + + + + Constructs a named parameter of the specified type, size, source column and row version + + The name of the parameter + The data type + The size of the parameter + The source column + The row version information + + + + Constructs a named parameter of the specified type, size, source column and row version + + The name of the parameter + The data type + The size of the parameter + Only input parameters are supported in SQLite + Ignored + Ignored + Ignored + The source column + The row version information + The initial value to assign the parameter + + + + Constructs a named parameter, yet another flavor + + The name of the parameter + The data type + The size of the parameter + Only input parameters are supported in SQLite + Ignored + Ignored + The source column + The row version information + Whether or not this parameter is for comparing NULL's + The intial value to assign the parameter + + + + Constructs an unnamed parameter of the specified type and size + + The data type + The size of the parameter + + + + Constructs an unnamed parameter of the specified type, size, and source column + + The data type + The size of the parameter + The source column + + + + Constructs an unnamed parameter of the specified type, size, source column and row version + + The data type + The size of the parameter + The source column + The row version information + + + + Resets the DbType of the parameter so it can be inferred from the value + + + + + Clones a parameter + + A new, unassociated SQLiteParameter + + + + Whether or not the parameter can contain a null value + + + + + Returns the datatype of the parameter + + + + + Supports only input parameters + + + + + Returns the parameter name + + + + + Returns the size of the parameter + + + + + Gets/sets the source column + + + + + Used by DbCommandBuilder to determine the mapping for nullable fields + + + + + Gets and sets the row version + + + + + Gets and sets the parameter value. If no datatype was specified, the datatype will assume the type from the value given. + + + + + SQLite implementation of DbParameterCollection. + + + + + The underlying command to which this collection belongs + + + + + The internal array of parameters in this collection + + + + + Determines whether or not all parameters have been bound to their statement(s) + + + + + Initializes the collection + + The command to which the collection belongs + + + + Retrieves an enumerator for the collection + + An enumerator for the underlying array + + + + Adds a parameter to the collection + + The parameter name + The data type + The size of the value + The source column + A SQLiteParameter object + + + + Adds a parameter to the collection + + The parameter name + The data type + The size of the value + A SQLiteParameter object + + + + Adds a parameter to the collection + + The parameter name + The data type + A SQLiteParameter object + + + + Adds a parameter to the collection + + The parameter to add + A zero-based index of where the parameter is located in the array + + + + Adds a parameter to the collection + + The parameter to add + A zero-based index of where the parameter is located in the array + + + + Adds a named/unnamed parameter and its value to the parameter collection. + + Name of the parameter, or null to indicate an unnamed parameter + The initial value of the parameter + Returns the SQLiteParameter object created during the call. + + + + Adds an array of parameters to the collection + + The array of parameters to add + + + + Adds an array of parameters to the collection + + The array of parameters to add + + + + Clears the array and resets the collection + + + + + Determines if the named parameter exists in the collection + + The name of the parameter to check + True if the parameter is in the collection + + + + Determines if the parameter exists in the collection + + The SQLiteParameter to check + True if the parameter is in the collection + + + + Not implemented + + + + + + + Retrieve a parameter by name from the collection + + The name of the parameter to fetch + A DbParameter object + + + + Retrieves a parameter by its index in the collection + + The index of the parameter to retrieve + A DbParameter object + + + + Returns the index of a parameter given its name + + The name of the parameter to find + -1 if not found, otherwise a zero-based index of the parameter + + + + Returns the index of a parameter + + The parameter to find + -1 if not found, otherwise a zero-based index of the parameter + + + + Inserts a parameter into the array at the specified location + + The zero-based index to insert the parameter at + The parameter to insert + + + + Removes a parameter from the collection + + The parameter to remove + + + + Removes a parameter from the collection given its name + + The name of the parameter to remove + + + + Removes a parameter from the collection given its index + + The zero-based parameter index to remove + + + + Re-assign the named parameter to a new parameter object + + The name of the parameter to replace + The new parameter + + + + Re-assign a parameter at the specified index + + The zero-based index of the parameter to replace + The new parameter + + + + Un-binds all parameters from their statements + + + + + This function attempts to map all parameters in the collection to all statements in a Command. + Since named parameters may span multiple statements, this function makes sure all statements are bound + to the same named parameter. Unnamed parameters are bound in sequence. + + + + + Returns false + + + + + Returns false + + + + + Returns false + + + + + Returns null + + + + + Returns a count of parameters in the collection + + + + + Overloaded to specialize the return value of the default indexer + + Name of the parameter to get/set + The specified named SQLite parameter + + + + Overloaded to specialize the return value of the default indexer + + The index of the parameter to get/set + The specified SQLite parameter + + + + Represents a single SQL statement in SQLite. + + + + + The underlying SQLite object this statement is bound to + + + + + The command text of this SQL statement + + + + + The actual statement pointer + + + + + An index from which unnamed parameters begin + + + + + Names of the parameters as SQLite understands them to be + + + + + Parameters for this statement + + + + + Command this statement belongs to (if any) + + + + + The flags associated with the parent connection object. + + + + + Initializes the statement and attempts to get all information about parameters in the statement + + The base SQLite object + The flags associated with the parent connection object + The statement + The command text for this statement + The previous command in a multi-statement command + + + + Disposes and finalizes the statement + + + + + If the underlying database connection is open, fetches the number of changed rows + resulting from the most recent query; otherwise, does nothing. + + + The number of changes when true is returned. + Undefined if false is returned. + + Non-zero if the number of changed rows was fetched. + + + + Called by SQLiteParameterCollection, this function determines if the specified parameter name belongs to + this statement, and if so, keeps a reference to the parameter so it can be bound later. + + The parameter name to map + The parameter to assign it + + + + Bind all parameters, making sure the caller didn't miss any + + + + + Attempts to convert an arbitrary object to the Boolean data type. + Null object values are converted to false. Throws a SQLiteException + upon failure. + + The object value to convert. + The format provider to use. + The converted boolean value. + + + + Perform the bind operation for an individual parameter + + The index of the parameter to bind + The parameter we're binding + + + + SQLite implementation of DbTransaction. + + + + + The connection to which this transaction is bound + + + + + Constructs the transaction object, binding it to the supplied connection + + The connection to open a transaction on + TRUE to defer the writelock, or FALSE to lock immediately + + + + Disposes the transaction. If it is currently active, any changes are rolled back. + + + + + Commits the current transaction. + + + + + Rolls back the active transaction. + + + + + Returns the underlying connection to which this transaction applies. + + + + + Forwards to the local Connection property + + + + + Gets the isolation level of the transaction. SQLite only supports Serializable transactions. + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to <?xml version="1.0" standalone="yes"?> + <DocumentElement> + <DataTypes> + <TypeName>smallint</TypeName> + <ProviderDbType>10</ProviderDbType> + <ColumnSize>5</ColumnSize> + <DataType>System.Int16</DataType> + <CreateFormat>smallint</CreateFormat> + <IsAutoIncrementable>false</IsAutoIncrementable> + <IsCaseSensitive>false</IsCaseSensitive> + <IsFixedLength>true</IsFixedLength> + <IsFixedPrecisionScale>true</IsFixedPrecisionScale> + <IsLong>false</IsLong> + <IsNullable>true</ [rest of string was truncated]";. + + + + + Looks up a localized string similar to ALL,ALTER,AND,AS,AUTOINCREMENT,BETWEEN,BY,CASE,CHECK,COLLATE,COMMIT,CONSTRAINT,CREATE,CROSS,DEFAULT,DEFERRABLE,DELETE,DISTINCT,DROP,ELSE,ESCAPE,EXCEPT,FOREIGN,FROM,FULL,GROUP,HAVING,IN,INDEX,INNER,INSERT,INTERSECT,INTO,IS,ISNULL,JOIN,LEFT,LIMIT,NATURAL,NOT,NOTNULL,NULL,ON,OR,ORDER,OUTER,PRIMARY,REFERENCES,RIGHT,ROLLBACK,SELECT,SET,TABLE,THEN,TO,TRANSACTION,UNION,UNIQUE,UPDATE,USING,VALUES,WHEN,WHERE. + + + + + Looks up a localized string similar to <?xml version="1.0" encoding="utf-8" ?> + <DocumentElement> + <MetaDataCollections> + <CollectionName>MetaDataCollections</CollectionName> + <NumberOfRestrictions>0</NumberOfRestrictions> + <NumberOfIdentifierParts>0</NumberOfIdentifierParts> + </MetaDataCollections> + <MetaDataCollections> + <CollectionName>DataSourceInformation</CollectionName> + <NumberOfRestrictions>0</NumberOfRestrictions> + <NumberOfIdentifierParts>0</NumberOfIdentifierParts> + </MetaDataCollections> + <MetaDataC [rest of string was truncated]";. + + + + + The name of the environment variable containing the processor + architecture of the current process. + + + + + This is the P/Invoke method that wraps the native Win32 LoadLibrary + function. See the MSDN documentation for full details on what it + does. + + + The name of the executable library. + + + The native module handle upon success -OR- IntPtr.Zero on failure. + + + + + This lock is used to protect the static _SQLiteModule and + processorArchitecturePlatforms fields, below. + + + + + Stores the mappings between processor architecture names and platform + names. + + + + + The native module handle for the native SQLite library or the value + IntPtr.Zero. + + + + + For now, this method simply calls the Initialize method. + + + + + Attempts to initialize this class by pre-loading the native SQLite + library for the processor architecture of the current process. + + + + + Queries and returns the base directory of the current application + domain. + + + The base directory for the current application domain -OR- null if it + cannot be determined. + + + + + Determines if the dynamic link library file name requires a suffix + and adds it if necessary. + + + The original dynamic link library file name to inspect. + + + The dynamic link library file name, possibly modified to include an + extension. + + + + + Queries and returns the processor architecture of the current + process. + + + The processor architecture of the current process -OR- null if it + cannot be determined. + + + + + Given the processor architecture, returns the name of the platform. + + + The processor architecture to be translated to a platform name. + + + The platform name for the specified processor architecture -OR- null + if it cannot be determined. + + + + + Attempts to load the native SQLite library based on the specified + directory and processor architecture. + + + The base directory to use, null for default (the base directory of + the current application domain). This directory should contain the + processor architecture specific sub-directories. + + + The requested processor architecture, null for default (the + processor architecture of the current process). This caller should + almost always specify null for this parameter. + + + The native module handle as returned by LoadLibrary -OR- IntPtr.Zero + if the loading fails for any reason. + + + + + This class represents a context from the SQLite core library that can + be passed to the sqlite3_result_*() and associated functions. + + + + + This interface represents a native handle provided by the SQLite core + library. + + + + + The native handle value. + + + + + The native context handle. + + + + + Constructs an instance of this class using the specified native + context handle. + + + The native context handle to use. + + + + + Sets the context result to NULL. + + + + + Sets the context result to the specified + value. + + + The value to use. + + + + + Sets the context result to the specified + value. + + + The value to use. + + + + + Sets the context result to the specified + value. + + + The value to use. + + + + + Sets the context result to the specified + value. + + + The value to use. This value will be + converted to the UTF-8 encoding prior to being used. + + + + + Sets the context result to the specified + value containing an error message. + + + The value containing the error message text. + This value will be converted to the UTF-8 encoding prior to being + used. + + + + + Sets the context result to the specified + value. + + + The value to use. + + + + + Sets the context result to contain the error code SQLITE_TOOBIG. + + + + + Sets the context result to contain the error code SQLITE_NOMEM. + + + + + Sets the context result to the specified array + value. + + + The array value to use. + + + + + Sets the context result to a BLOB of zeros of the specified size. + + + The number of zero bytes to use for the BLOB context result. + + + + + Sets the context result to the specified . + + + The to use. + + + + + Returns the underlying SQLite native handle associated with this + object instance. + + + + + This class represents a value from the SQLite core library that can be + passed to the sqlite3_value_*() and associated functions. + + + + + The native value handle. + + + + + Constructs an instance of this class using the specified native + value handle. + + + The native value handle to use. + + + + + Invalidates the native value handle, thereby preventing further + access to it from this object instance. + + + + + Converts a logical array of native pointers to native sqlite3_value + structures into a managed array of + object instances. + + + The number of elements in the logical array of native sqlite3_value + structures. + + + The native pointer to the logical array of native sqlite3_value + structures to convert. + + + The managed array of object instances or + null upon failure. + + + + + Gets and returns the type affinity associated with this value. + + + The type affinity associated with this value. + + + + + Gets and returns the number of bytes associated with this value, if + it refers to a UTF-8 encoded string. + + + The number of bytes associated with this value. The returned value + may be zero. + + + + + Gets and returns the associated with this + value. + + + The associated with this value. + + + + + Gets and returns the associated with + this value. + + + The associated with this value. + + + + + Gets and returns the associated with this + value. + + + The associated with this value. + + + + + Gets and returns the associated with this + value. + + + The associated with this value. The value is + converted from the UTF-8 encoding prior to being returned. + + + + + Gets and returns the array associated with this + value. + + + The array associated with this value. + + + + + Uses the native value handle to obtain and store the managed value + for this object instance, thus saving it for later use. The type + of the managed value is determined by the type affinity of the + native value. If the type affinity is not recognized by this + method, no work is done and false is returned. + + + Non-zero if the native value was persisted successfully. + + + + + Returns the underlying SQLite native handle associated with this + object instance. + + + + + Returns non-zero if the native SQLite value has been successfully + persisted as a managed value within this object instance (i.e. the + property may then be read successfully). + + + + + If the managed value for this object instance is available (i.e. it + has been previously persisted via the ) method, + that value is returned; otherwise, an exception is thrown. The + returned value may be null. + + + + + These are the allowed values for the operators that are part of a + constraint term in the WHERE clause of a query that uses a virtual + table. + + + + + This value represents the equality operator. + + + + + This value represents the greater than operator. + + + + + This value represents the less than or equal to operator. + + + + + This value represents the less than operator. + + + + + This value represents the greater than or equal to operator. + + + + + This value represents the MATCH operator. + + + + + This class represents the native sqlite3_index_constraint structure + from the SQLite core library. + + + + + Constructs an instance of this class using the specified native + sqlite3_index_constraint structure. + + + The native sqlite3_index_constraint structure to use. + + + + + Constructs an instance of this class using the specified field + values. + + + Column on left-hand side of constraint. + + + Constraint operator (). + + + True if this constraint is usable. + + + Used internally - + should ignore. + + + + + Column on left-hand side of constraint. + + + + + Constraint operator (). + + + + + True if this constraint is usable. + + + + + Used internally - + should ignore. + + + + + This class represents the native sqlite3_index_orderby structure from + the SQLite core library. + + + + + Constructs an instance of this class using the specified native + sqlite3_index_orderby structure. + + + The native sqlite3_index_orderby structure to use. + + + + + Constructs an instance of this class using the specified field + values. + + + Column number. + + + True for DESC. False for ASC. + + + + + Column number. + + + + + True for DESC. False for ASC. + + + + + This class represents the native sqlite3_index_constraint_usage + structure from the SQLite core library. + + + + + Constructs an instance of this class using the specified native + sqlite3_index_constraint_usage structure. + + + The native sqlite3_index_constraint_usage structure to use. + + + + + Constructs an instance of this class using the specified field + values. + + + If greater than 0, constraint is part of argv to xFilter. + + + Do not code a test for this constraint. + + + + + If greater than 0, constraint is part of argv to xFilter. + + + + + Do not code a test for this constraint. + + + + + This class represents the various inputs provided by the SQLite core + library to the method. + + + + + Constructs an instance of this class. + + + The number of instances to + pre-allocate space for. + + + The number of instances to + pre-allocate space for. + + + + + An array of object instances, + each containing information supplied by the SQLite core library. + + + + + An array of object instances, + each containing information supplied by the SQLite core library. + + + + + This class represents the various outputs provided to the SQLite core + library by the method. + + + + + Constructs an instance of this class. + + + The number of instances + to pre-allocate space for. + + + + + Determines if the native estimatedRows field can be used, based on + the available version of the SQLite core library. + + + Non-zero if the property is supported + by the SQLite core library. + + + + + An array of object + instances, each containing information to be supplied to the SQLite + core library. + + + + + Number used to help identify the selected index. This value will + later be provided to the + method. + + + + + String used to help identify the selected index. This value will + later be provided to the + method. + + + + + Non-zero if the index string must be freed by the SQLite core + library. + + + + + True if output is already ordered. + + + + + Estimated cost of using this index. Using a null value here + indicates that a default estimated cost value should be used. + + + + + Estimated number of rows returned. Using a null value here + indicates that a default estimated rows value should be used. + + + + + This class represents the various inputs and outputs used with the + method. + + + + + Constructs an instance of this class. + + + The number of (and + ) instances to + pre-allocate space for. + + + The number of instances to + pre-allocate space for. + + + + + Converts a native pointer to a native sqlite3_index_info structure + into a new object instance. + + + The native pointer to the native sqlite3_index_info structure to + convert. + + + Upon success, this parameter will be modified to contain the newly + created object instance. + + + + + Populates the outputs of a pre-allocated native sqlite3_index_info + structure using an existing object + instance. + + + The existing object instance containing + the output data to use. + + + The native pointer to the pre-allocated native sqlite3_index_info + structure. + + + + + The object instance containing + the inputs to the + method. + + + + + The object instance containing + the outputs from the + method. + + + + + This class represents a managed virtual table implementation. It is + not sealed and should be used as the base class for any user-defined + virtual table classes implemented in managed code. + + + + + The index within the array of strings provided to the + and + methods containing the + name of the module implementing this virtual table. + + + + + The index within the array of strings provided to the + and + methods containing the + name of the database containing this virtual table. + + + + + The index within the array of strings provided to the + and + methods containing the + name of the virtual table. + + + + + Constructs an instance of this class. + + + The original array of strings provided to the + and + methods. + + + + + This method should normally be used by the + method in order to + perform index selection based on the constraints provided by the + SQLite core library. + + + The object instance containing all the + data for the inputs and outputs relating to index selection. + + + Non-zero upon success. + + + + + Attempts to record the renaming of the virtual table associated + with this object instance. + + + The new name for the virtual table. + + + Non-zero upon success. + + + + + Disposes of this object instance. + + + + + Throws an if this object + instance has been disposed. + + + + + Disposes of this object instance. + + + Non-zero if this method is being called from the + method. Zero if this method is being called + from the finalizer. + + + + + Finalizes this object instance. + + + + + The original array of strings provided to the + and + methods. + + + + + The name of the module implementing this virtual table. + + + + + The name of the database containing this virtual table. + + + + + The name of the virtual table. + + + + + The object instance containing all the + data for the inputs and outputs relating to the most recent index + selection. + + + + + Returns the underlying SQLite native handle associated with this + object instance. + + + + + This class represents a managed virtual table cursor implementation. + It is not sealed and should be used as the base class for any + user-defined virtual table cursor classes implemented in managed code. + + + + + This value represents an invalid integer row sequence number. + + + + + The field holds the integer row sequence number for the current row + pointed to by this cursor object instance. + + + + + Constructs an instance of this class. + + + The object instance associated + with this object instance. + + + + + Constructs an instance of this class. + + + + + Attempts to persist the specified object + instances in order to make them available after the + method returns. + + + The array of object instances to be + persisted. + + + The number of object instances that were + successfully persisted. + + + + + This method should normally be used by the + method in order to + perform filtering of the result rows and/or to record the filtering + criteria provided by the SQLite core library. + + + Number used to help identify the selected index. + + + String used to help identify the selected index. + + + The values corresponding to each column in the selected index. + + + + + Determines the integer row sequence number for the current row. + + + The integer row sequence number for the current row -OR- zero if + it cannot be determined. + + + + + Adjusts the integer row sequence number so that it refers to the + next row. + + + + + Disposes of this object instance. + + + + + Throws an if this object + instance has been disposed. + + + + + Disposes of this object instance. + + + Non-zero if this method is being called from the + method. Zero if this method is being called + from the finalizer. + + + + + Finalizes this object instance. + + + + + The object instance associated + with this object instance. + + + + + Number used to help identify the selected index. This value will + be set via the method. + + + + + String used to help identify the selected index. This value will + be set via the method. + + + + + The values used to filter the rows returned via this cursor object + instance. This value will be set via the + method. + + + + + Returns the underlying SQLite native handle associated with this + object instance. + + + + + This interface represents a virtual table implementation written in + native code. + + + + + + This method is called to create a new instance of a virtual table + in response to a CREATE VIRTUAL TABLE statement. The db parameter + is a pointer to the SQLite database connection that is executing + the CREATE VIRTUAL TABLE statement. The pAux argument is the copy + of the client data pointer that was the fourth argument to the + sqlite3_create_module() or sqlite3_create_module_v2() call that + registered the virtual table module. The argv parameter is an + array of argc pointers to null terminated strings. The first + string, argv[0], is the name of the module being invoked. The + module name is the name provided as the second argument to + sqlite3_create_module() and as the argument to the USING clause of + the CREATE VIRTUAL TABLE statement that is running. The second, + argv[1], is the name of the database in which the new virtual table + is being created. The database name is "main" for the primary + database, or "temp" for TEMP database, or the name given at the + end of the ATTACH statement for attached databases. The third + element of the array, argv[2], is the name of the new virtual + table, as specified following the TABLE keyword in the CREATE + VIRTUAL TABLE statement. If present, the fourth and subsequent + strings in the argv[] array report the arguments to the module name + in the CREATE VIRTUAL TABLE statement. + + + The job of this method is to construct the new virtual table object + (an sqlite3_vtab object) and return a pointer to it in *ppVTab. + + + As part of the task of creating a new sqlite3_vtab structure, this + method must invoke sqlite3_declare_vtab() to tell the SQLite core + about the columns and datatypes in the virtual table. The + sqlite3_declare_vtab() API has the following prototype: + + + + int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable) + + + + The first argument to sqlite3_declare_vtab() must be the same + database connection pointer as the first parameter to this method. + The second argument to sqlite3_declare_vtab() must a + zero-terminated UTF-8 string that contains a well-formed CREATE + TABLE statement that defines the columns in the virtual table and + their data types. The name of the table in this CREATE TABLE + statement is ignored, as are all constraints. Only the column names + and datatypes matter. The CREATE TABLE statement string need not to + be held in persistent memory. The string can be deallocated and/or + reused as soon as the sqlite3_declare_vtab() routine returns. + + + + The native database connection handle. + + + The original native pointer value that was provided to the + sqlite3_create_module(), sqlite3_create_module_v2() or + sqlite3_create_disposable_module() functions. + + + The number of arguments from the CREATE VIRTUAL TABLE statement. + + + The array of string arguments from the CREATE VIRTUAL TABLE + statement. + + + Upon success, this parameter must be modified to point to the newly + created native sqlite3_vtab derived structure. + + + Upon failure, this parameter must be modified to point to the error + message, with the underlying memory having been obtained from the + sqlite3_malloc() function. + + + A standard SQLite return code. + + + + + + The xConnect method is very similar to xCreate. It has the same + parameters and constructs a new sqlite3_vtab structure just like + xCreate. And it must also call sqlite3_declare_vtab() like xCreate. + + + The difference is that xConnect is called to establish a new + connection to an existing virtual table whereas xCreate is called + to create a new virtual table from scratch. + + + The xCreate and xConnect methods are only different when the + virtual table has some kind of backing store that must be + initialized the first time the virtual table is created. The + xCreate method creates and initializes the backing store. The + xConnect method just connects to an existing backing store. + + + As an example, consider a virtual table implementation that + provides read-only access to existing comma-separated-value (CSV) + files on disk. There is no backing store that needs to be created + or initialized for such a virtual table (since the CSV files + already exist on disk) so the xCreate and xConnect methods will be + identical for that module. + + + Another example is a virtual table that implements a full-text + index. The xCreate method must create and initialize data + structures to hold the dictionary and posting lists for that index. + The xConnect method, on the other hand, only has to locate and use + an existing dictionary and posting lists that were created by a + prior xCreate call. + + + The xConnect method must return SQLITE_OK if it is successful in + creating the new virtual table, or SQLITE_ERROR if it is not + successful. If not successful, the sqlite3_vtab structure must not + be allocated. An error message may optionally be returned in *pzErr + if unsuccessful. Space to hold the error message string must be + allocated using an SQLite memory allocation function like + sqlite3_malloc() or sqlite3_mprintf() as the SQLite core will + attempt to free the space using sqlite3_free() after the error has + been reported up to the application. + + + The xConnect method is required for every virtual table + implementation, though the xCreate and xConnect pointers of the + sqlite3_module object may point to the same function the virtual + table does not need to initialize backing store. + + + + The native database connection handle. + + + The original native pointer value that was provided to the + sqlite3_create_module(), sqlite3_create_module_v2() or + sqlite3_create_disposable_module() functions. + + + The number of arguments from the CREATE VIRTUAL TABLE statement. + + + The array of string arguments from the CREATE VIRTUAL TABLE + statement. + + + Upon success, this parameter must be modified to point to the newly + created native sqlite3_vtab derived structure. + + + Upon failure, this parameter must be modified to point to the error + message, with the underlying memory having been obtained from the + sqlite3_malloc() function. + + + A standard SQLite return code. + + + + + + SQLite uses the xBestIndex method of a virtual table module to + determine the best way to access the virtual table. The xBestIndex + method has a prototype like this: + + + int (*xBestIndex)(sqlite3_vtab *pVTab, sqlite3_index_info*); + + + The SQLite core communicates with the xBestIndex method by filling + in certain fields of the sqlite3_index_info structure and passing a + pointer to that structure into xBestIndex as the second parameter. + The xBestIndex method fills out other fields of this structure + which forms the reply. The sqlite3_index_info structure looks like + this: + + + struct sqlite3_index_info { + /* Inputs */ + const int nConstraint; /* Number of entries in aConstraint */ + const struct sqlite3_index_constraint { + int iColumn; /* Column on left-hand side of + * constraint */ + unsigned char op; /* Constraint operator */ + unsigned char usable; /* True if this constraint is usable */ + int iTermOffset; /* Used internally - xBestIndex should + * ignore */ + } *const aConstraint; /* Table of WHERE clause constraints */ + const int nOrderBy; /* Number of terms in the ORDER BY + * clause */ + const struct sqlite3_index_orderby { + int iColumn; /* Column number */ + unsigned char desc; /* True for DESC. False for ASC. */ + } *const aOrderBy; /* The ORDER BY clause */ + /* Outputs */ + struct sqlite3_index_constraint_usage { + int argvIndex; /* if greater than zero, constraint is + * part of argv to xFilter */ + unsigned char omit; /* Do not code a test for this + * constraint */ + } *const aConstraintUsage; + int idxNum; /* Number used to identify the index */ + char *idxStr; /* String, possibly obtained from + * sqlite3_malloc() */ + int needToFreeIdxStr; /* Free idxStr using sqlite3_free() if + * true */ + int orderByConsumed; /* True if output is already ordered */ + double estimatedCost; /* Estimated cost of using this index */ + }; + + + In addition, there are some defined constants: + + + #define SQLITE_INDEX_CONSTRAINT_EQ 2 + #define SQLITE_INDEX_CONSTRAINT_GT 4 + #define SQLITE_INDEX_CONSTRAINT_LE 8 + #define SQLITE_INDEX_CONSTRAINT_LT 16 + #define SQLITE_INDEX_CONSTRAINT_GE 32 + #define SQLITE_INDEX_CONSTRAINT_MATCH 64 + + + The SQLite core calls the xBestIndex method when it is compiling a + query that involves a virtual table. In other words, SQLite calls + this method when it is running sqlite3_prepare() or the equivalent. + By calling this method, the SQLite core is saying to the virtual + table that it needs to access some subset of the rows in the + virtual table and it wants to know the most efficient way to do + that access. The xBestIndex method replies with information that + the SQLite core can then use to conduct an efficient search of the + virtual table. + + + While compiling a single SQL query, the SQLite core might call + xBestIndex multiple times with different settings in + sqlite3_index_info. The SQLite core will then select the + combination that appears to give the best performance. + + + Before calling this method, the SQLite core initializes an instance + of the sqlite3_index_info structure with information about the + query that it is currently trying to process. This information + derives mainly from the WHERE clause and ORDER BY or GROUP BY + clauses of the query, but also from any ON or USING clauses if the + query is a join. The information that the SQLite core provides to + the xBestIndex method is held in the part of the structure that is + marked as "Inputs". The "Outputs" section is initialized to zero. + + + The information in the sqlite3_index_info structure is ephemeral + and may be overwritten or deallocated as soon as the xBestIndex + method returns. If the xBestIndex method needs to remember any part + of the sqlite3_index_info structure, it should make a copy. Care + must be take to store the copy in a place where it will be + deallocated, such as in the idxStr field with needToFreeIdxStr set + to 1. + + + Note that xBestIndex will always be called before xFilter, since + the idxNum and idxStr outputs from xBestIndex are required inputs + to xFilter. However, there is no guarantee that xFilter will be + called following a successful xBestIndex. + + + The xBestIndex method is required for every virtual table + implementation. + + + 2.3.1 Inputs + + + The main thing that the SQLite core is trying to communicate to the + virtual table is the constraints that are available to limit the + number of rows that need to be searched. The aConstraint[] array + contains one entry for each constraint. There will be exactly + nConstraint entries in that array. + + + Each constraint will correspond to a term in the WHERE clause or in + a USING or ON clause that is of the form + + + column OP EXPR + + + Where "column" is a column in the virtual table, OP is an operator + like "=" or "<", and EXPR is an arbitrary expression. So, for + example, if the WHERE clause contained a term like this: + + + a = 5 + + + Then one of the constraints would be on the "a" column with + operator "=" and an expression of "5". Constraints need not have a + literal representation of the WHERE clause. The query optimizer + might make transformations to the WHERE clause in order to extract + as many constraints as it can. So, for example, if the WHERE clause + contained something like this: + + + x BETWEEN 10 AND 100 AND 999>y + + + The query optimizer might translate this into three separate + constraints: + + + x >= 10 + x <= 100 + y < 999 + + + For each constraint, the aConstraint[].iColumn field indicates + which column appears on the left-hand side of the constraint. The + first column of the virtual table is column 0. The rowid of the + virtual table is column -1. The aConstraint[].op field indicates + which operator is used. The SQLITE_INDEX_CONSTRAINT_* constants map + integer constants into operator values. Columns occur in the order + they were defined by the call to sqlite3_declare_vtab() in the + xCreate or xConnect method. Hidden columns are counted when + determining the column index. + + + The aConstraint[] array contains information about all constraints + that apply to the virtual table. But some of the constraints might + not be usable because of the way tables are ordered in a join. The + xBestIndex method must therefore only consider constraints that + have an aConstraint[].usable flag which is true. + + + In addition to WHERE clause constraints, the SQLite core also tells + the xBestIndex method about the ORDER BY clause. (In an aggregate + query, the SQLite core might put in GROUP BY clause information in + place of the ORDER BY clause information, but this fact should not + make any difference to the xBestIndex method.) If all terms of the + ORDER BY clause are columns in the virtual table, then nOrderBy + will be the number of terms in the ORDER BY clause and the + aOrderBy[] array will identify the column for each term in the + order by clause and whether or not that column is ASC or DESC. + + + 2.3.2 Outputs + + + Given all of the information above, the job of the xBestIndex + method it to figure out the best way to search the virtual table. + + + The xBestIndex method fills the idxNum and idxStr fields with + information that communicates an indexing strategy to the xFilter + method. The information in idxNum and idxStr is arbitrary as far as + the SQLite core is concerned. The SQLite core just copies the + information through to the xFilter method. Any desired meaning can + be assigned to idxNum and idxStr as long as xBestIndex and xFilter + agree on what that meaning is. + + + The idxStr value may be a string obtained from an SQLite memory + allocation function such as sqlite3_mprintf(). If this is the case, + then the needToFreeIdxStr flag must be set to true so that the + SQLite core will know to call sqlite3_free() on that string when it + has finished with it, and thus avoid a memory leak. + + + If the virtual table will output rows in the order specified by the + ORDER BY clause, then the orderByConsumed flag may be set to true. + If the output is not automatically in the correct order then + orderByConsumed must be left in its default false setting. This + will indicate to the SQLite core that it will need to do a separate + sorting pass over the data after it comes out of the virtual table. + + + The estimatedCost field should be set to the estimated number of + disk access operations required to execute this query against the + virtual table. The SQLite core will often call xBestIndex multiple + times with different constraints, obtain multiple cost estimates, + then choose the query plan that gives the lowest estimate. + + + The aConstraintUsage[] array contains one element for each of the + nConstraint constraints in the inputs section of the + sqlite3_index_info structure. The aConstraintUsage[] array is used + by xBestIndex to tell the core how it is using the constraints. + + + The xBestIndex method may set aConstraintUsage[].argvIndex entries + to values greater than one. Exactly one entry should be set to 1, + another to 2, another to 3, and so forth up to as many or as few as + the xBestIndex method wants. The EXPR of the corresponding + constraints will then be passed in as the argv[] parameters to + xFilter. + + + For example, if the aConstraint[3].argvIndex is set to 1, then when + xFilter is called, the argv[0] passed to xFilter will have the EXPR + value of the aConstraint[3] constraint. + + + By default, the SQLite core double checks all constraints on each + row of the virtual table that it receives. If such a check is + redundant, the xBestFilter method can suppress that double-check by + setting aConstraintUsage[].omit. + + + + The native pointer to the sqlite3_vtab derived structure. + + + The native pointer to the sqlite3_index_info structure. + + + A standard SQLite return code. + + + + + + This method releases a connection to a virtual table. Only the + sqlite3_vtab object is destroyed. The virtual table is not + destroyed and any backing store associated with the virtual table + persists. This method undoes the work of xConnect. + + + This method is a destructor for a connection to the virtual table. + Contrast this method with xDestroy. The xDestroy is a destructor + for the entire virtual table. + + + The xDisconnect method is required for every virtual table + implementation, though it is acceptable for the xDisconnect and + xDestroy methods to be the same function if that makes sense for + the particular virtual table. + + + + The native pointer to the sqlite3_vtab derived structure. + + + A standard SQLite return code. + + + + + + This method releases a connection to a virtual table, just like the + xDisconnect method, and it also destroys the underlying table + implementation. This method undoes the work of xCreate. + + + The xDisconnect method is called whenever a database connection + that uses a virtual table is closed. The xDestroy method is only + called when a DROP TABLE statement is executed against the virtual + table. + + + The xDestroy method is required for every virtual table + implementation, though it is acceptable for the xDisconnect and + xDestroy methods to be the same function if that makes sense for + the particular virtual table. + + + + The native pointer to the sqlite3_vtab derived structure. + + + A standard SQLite return code. + + + + + + The xOpen method creates a new cursor used for accessing (read + and/or writing) a virtual table. A successful invocation of this + method will allocate the memory for the sqlite3_vtab_cursor (or a + subclass), initialize the new object, and make *ppCursor point to + the new object. The successful call then returns SQLITE_OK. + + + For every successful call to this method, the SQLite core will + later invoke the xClose method to destroy the allocated cursor. + + + The xOpen method need not initialize the pVtab field of the + sqlite3_vtab_cursor structure. The SQLite core will take care of + that chore automatically. + + + A virtual table implementation must be able to support an arbitrary + number of simultaneously open cursors. + + + When initially opened, the cursor is in an undefined state. The + SQLite core will invoke the xFilter method on the cursor prior to + any attempt to position or read from the cursor. + + + The xOpen method is required for every virtual table + implementation. + + + + The native pointer to the sqlite3_vtab derived structure. + + + Upon success, this parameter must be modified to point to the newly + created native sqlite3_vtab_cursor derived structure. + + + A standard SQLite return code. + + + + + + The xClose method closes a cursor previously opened by xOpen. The + SQLite core will always call xClose once for each cursor opened + using xOpen. + + + This method must release all resources allocated by the + corresponding xOpen call. The routine will not be called again even + if it returns an error. The SQLite core will not use the + sqlite3_vtab_cursor again after it has been closed. + + + The xClose method is required for every virtual table + implementation. + + + + The native pointer to the sqlite3_vtab_cursor derived structure. + + + A standard SQLite return code. + + + + + + This method begins a search of a virtual table. The first argument + is a cursor opened by xOpen. The next two argument define a + particular search index previously chosen by xBestIndex. The + specific meanings of idxNum and idxStr are unimportant as long as + xFilter and xBestIndex agree on what that meaning is. + + + The xBestIndex function may have requested the values of certain + expressions using the aConstraintUsage[].argvIndex values of the + sqlite3_index_info structure. Those values are passed to xFilter + using the argc and argv parameters. + + + If the virtual table contains one or more rows that match the + search criteria, then the cursor must be left point at the first + row. Subsequent calls to xEof must return false (zero). If there + are no rows match, then the cursor must be left in a state that + will cause the xEof to return true (non-zero). The SQLite engine + will use the xColumn and xRowid methods to access that row content. + The xNext method will be used to advance to the next row. + + + This method must return SQLITE_OK if successful, or an sqlite error + code if an error occurs. + + + The xFilter method is required for every virtual table + implementation. + + + + The native pointer to the sqlite3_vtab_cursor derived structure. + + + Number used to help identify the selected index. + + + The native pointer to the UTF-8 encoded string containing the + string used to help identify the selected index. + + + The number of native pointers to sqlite3_value structures specified + in . + + + An array of native pointers to sqlite3_value structures containing + filtering criteria for the selected index. + + + A standard SQLite return code. + + + + + + The xNext method advances a virtual table cursor to the next row of + a result set initiated by xFilter. If the cursor is already + pointing at the last row when this routine is called, then the + cursor no longer points to valid data and a subsequent call to the + xEof method must return true (non-zero). If the cursor is + successfully advanced to another row of content, then subsequent + calls to xEof must return false (zero). + + + This method must return SQLITE_OK if successful, or an sqlite error + code if an error occurs. + + + The xNext method is required for every virtual table + implementation. + + + + The native pointer to the sqlite3_vtab_cursor derived structure. + + + A standard SQLite return code. + + + + + + The xEof method must return false (zero) if the specified cursor + currently points to a valid row of data, or true (non-zero) + otherwise. This method is called by the SQL engine immediately + after each xFilter and xNext invocation. + + + The xEof method is required for every virtual table implementation. + + + + The native pointer to the sqlite3_vtab_cursor derived structure. + + + Non-zero if no more rows are available; zero otherwise. + + + + + + The SQLite core invokes this method in order to find the value for + the N-th column of the current row. N is zero-based so the first + column is numbered 0. The xColumn method may return its result back + to SQLite using one of the following interface: + + + sqlite3_result_blob() + sqlite3_result_double() + sqlite3_result_int() + sqlite3_result_int64() + sqlite3_result_null() + sqlite3_result_text() + sqlite3_result_text16() + sqlite3_result_text16le() + sqlite3_result_text16be() + sqlite3_result_zeroblob() + + + If the xColumn method implementation calls none of the functions + above, then the value of the column defaults to an SQL NULL. + + + To raise an error, the xColumn method should use one of the + result_text() methods to set the error message text, then return an + appropriate error code. The xColumn method must return SQLITE_OK on + success. + + + The xColumn method is required for every virtual table + implementation. + + + + The native pointer to the sqlite3_vtab_cursor derived structure. + + + The native pointer to the sqlite3_context structure to be used + for returning the specified column value to the SQLite core + library. + + + The zero-based index corresponding to the column containing the + value to be returned. + + + A standard SQLite return code. + + + + + + A successful invocation of this method will cause *pRowid to be + filled with the rowid of row that the virtual table cursor pCur is + currently pointing at. This method returns SQLITE_OK on success. It + returns an appropriate error code on failure. + + + The xRowid method is required for every virtual table + implementation. + + + + The native pointer to the sqlite3_vtab_cursor derived structure. + + + Upon success, this parameter must be modified to contain the unique + integer row identifier for the current row for the specified cursor. + + + A standard SQLite return code. + + + + + + All changes to a virtual table are made using the xUpdate method. + This one method can be used to insert, delete, or update. + + + The argc parameter specifies the number of entries in the argv + array. The value of argc will be 1 for a pure delete operation or + N+2 for an insert or replace or update where N is the number of + columns in the table. In the previous sentence, N includes any + hidden columns. + + + Every argv entry will have a non-NULL value in C but may contain + the SQL value NULL. In other words, it is always true that + argv[i]!=0 for i between 0 and argc-1. However, it might be the + case that sqlite3_value_type(argv[i])==SQLITE_NULL. + + + The argv[0] parameter is the rowid of a row in the virtual table + to be deleted. If argv[0] is an SQL NULL, then no deletion occurs. + + + The argv[1] parameter is the rowid of a new row to be inserted into + the virtual table. If argv[1] is an SQL NULL, then the + implementation must choose a rowid for the newly inserted row. + Subsequent argv[] entries contain values of the columns of the + virtual table, in the order that the columns were declared. The + number of columns will match the table declaration that the + xConnect or xCreate method made using the sqlite3_declare_vtab() + call. All hidden columns are included. + + + When doing an insert without a rowid (argc>1, argv[1] is an SQL + NULL), the implementation must set *pRowid to the rowid of the + newly inserted row; this will become the value returned by the + sqlite3_last_insert_rowid() function. Setting this value in all the + other cases is a harmless no-op; the SQLite engine ignores the + *pRowid return value if argc==1 or argv[1] is not an SQL NULL. + + + Each call to xUpdate will fall into one of cases shown below. Note + that references to argv[i] mean the SQL value held within the + argv[i] object, not the argv[i] object itself. + + + argc = 1 + + + The single row with rowid equal to argv[0] is deleted. No + insert occurs. + + + argc > 1 + argv[0] = NULL + + + A new row is inserted with a rowid argv[1] and column + values in argv[2] and following. If argv[1] is an SQL NULL, + the a new unique rowid is generated automatically. + + + argc > 1 + argv[0] ? NULL + argv[0] = argv[1] + + + The row with rowid argv[0] is updated with new values in + argv[2] and following parameters. + + + argc > 1 + argv[0] ? NULL + argv[0] ? argv[1] + + + The row with rowid argv[0] is updated with rowid argv[1] + and new values in argv[2] and following parameters. This + will occur when an SQL statement updates a rowid, as in + the statement: + + + UPDATE table SET rowid=rowid+1 WHERE ...; + + + The xUpdate method must return SQLITE_OK if and only if it is + successful. If a failure occurs, the xUpdate must return an + appropriate error code. On a failure, the pVTab->zErrMsg element + may optionally be replaced with error message text stored in memory + allocated from SQLite using functions such as sqlite3_mprintf() or + sqlite3_malloc(). + + + If the xUpdate method violates some constraint of the virtual table + (including, but not limited to, attempting to store a value of the + wrong datatype, attempting to store a value that is too large or + too small, or attempting to change a read-only value) then the + xUpdate must fail with an appropriate error code. + + + There might be one or more sqlite3_vtab_cursor objects open and in + use on the virtual table instance and perhaps even on the row of + the virtual table when the xUpdate method is invoked. The + implementation of xUpdate must be prepared for attempts to delete + or modify rows of the table out from other existing cursors. If the + virtual table cannot accommodate such changes, the xUpdate method + must return an error code. + + + The xUpdate method is optional. If the xUpdate pointer in the + sqlite3_module for a virtual table is a NULL pointer, then the + virtual table is read-only. + + + + The native pointer to the sqlite3_vtab derived structure. + + + The number of new or modified column values contained in + . + + + The array of native pointers to sqlite3_value structures containing + the new or modified column values, if any. + + + Upon success, this parameter must be modified to contain the unique + integer row identifier for the row that was inserted, if any. + + + A standard SQLite return code. + + + + + + This method begins a transaction on a virtual table. This is method + is optional. The xBegin pointer of sqlite3_module may be NULL. + + + This method is always followed by one call to either the xCommit or + xRollback method. Virtual table transactions do not nest, so the + xBegin method will not be invoked more than once on a single + virtual table without an intervening call to either xCommit or + xRollback. Multiple calls to other methods can and likely will + occur in between the xBegin and the corresponding xCommit or + xRollback. + + + + The native pointer to the sqlite3_vtab derived structure. + + + A standard SQLite return code. + + + + + + This method signals the start of a two-phase commit on a virtual + table. This is method is optional. The xSync pointer of + sqlite3_module may be NULL. + + + This method is only invoked after call to the xBegin method and + prior to an xCommit or xRollback. In order to implement two-phase + commit, the xSync method on all virtual tables is invoked prior to + invoking the xCommit method on any virtual table. If any of the + xSync methods fail, the entire transaction is rolled back. + + + + The native pointer to the sqlite3_vtab derived structure. + + + A standard SQLite return code. + + + + + + This method causes a virtual table transaction to commit. This is + method is optional. The xCommit pointer of sqlite3_module may be + NULL. + + + A call to this method always follows a prior call to xBegin and + xSync. + + + + The native pointer to the sqlite3_vtab derived structure. + + + A standard SQLite return code. + + + + + + This method causes a virtual table transaction to rollback. This is + method is optional. The xRollback pointer of sqlite3_module may be + NULL. + + + A call to this method always follows a prior call to xBegin. + + + + The native pointer to the sqlite3_vtab derived structure. + + + A standard SQLite return code. + + + + + + This method provides notification that the virtual table + implementation that the virtual table will be given a new name. If + this method returns SQLITE_OK then SQLite renames the table. If + this method returns an error code then the renaming is prevented. + + + The xRename method is required for every virtual table + implementation. + + + + The native pointer to the sqlite3_vtab derived structure. + + + The number of arguments to the function being sought. + + + The name of the function being sought. + + + Upon success, this parameter must be modified to contain the + delegate responsible for implementing the specified function. + + + Upon success, this parameter must be modified to contain the + native user-data pointer associated with + . + + + Non-zero if the specified function was found; zero otherwise. + + + + + + This method provides notification that the virtual table + implementation that the virtual table will be given a new name. If + this method returns SQLITE_OK then SQLite renames the table. If + this method returns an error code then the renaming is prevented. + + + The xRename method is required for every virtual table + implementation. + + + + The native pointer to the sqlite3_vtab derived structure. + + + The native pointer to the UTF-8 encoded string containing the new + name for the virtual table. + + + A standard SQLite return code. + + + + + + These methods provide the virtual table implementation an + opportunity to implement nested transactions. They are always + optional and will only be called in SQLite version 3.7.7 and later. + + + When xSavepoint(X,N) is invoked, that is a signal to the virtual + table X that it should save its current state as savepoint N. A + subsequent call to xRollbackTo(X,R) means that the state of the + virtual table should return to what it was when xSavepoint(X,R) was + last called. The call to xRollbackTo(X,R) will invalidate all + savepoints with N>R; none of the invalided savepoints will be + rolled back or released without first being reinitialized by a call + to xSavepoint(). A call to xRelease(X,M) invalidates all savepoints + where N>=M. + + + None of the xSavepoint(), xRelease(), or xRollbackTo() methods will + ever be called except in between calls to xBegin() and either + xCommit() or xRollback(). + + + + The native pointer to the sqlite3_vtab derived structure. + + + This is an integer identifier under which the the current state of + the virtual table should be saved. + + + A standard SQLite return code. + + + + + + These methods provide the virtual table implementation an + opportunity to implement nested transactions. They are always + optional and will only be called in SQLite version 3.7.7 and later. + + + When xSavepoint(X,N) is invoked, that is a signal to the virtual + table X that it should save its current state as savepoint N. A + subsequent call to xRollbackTo(X,R) means that the state of the + virtual table should return to what it was when xSavepoint(X,R) was + last called. The call to xRollbackTo(X,R) will invalidate all + savepoints with N>R; none of the invalided savepoints will be + rolled back or released without first being reinitialized by a call + to xSavepoint(). A call to xRelease(X,M) invalidates all savepoints + where N>=M. + + + None of the xSavepoint(), xRelease(), or xRollbackTo() methods will + ever be called except in between calls to xBegin() and either + xCommit() or xRollback(). + + + + The native pointer to the sqlite3_vtab derived structure. + + + This is an integer used to indicate that any saved states with an + identifier greater than or equal to this should be deleted by the + virtual table. + + + A standard SQLite return code. + + + + + + These methods provide the virtual table implementation an + opportunity to implement nested transactions. They are always + optional and will only be called in SQLite version 3.7.7 and later. + + + When xSavepoint(X,N) is invoked, that is a signal to the virtual + table X that it should save its current state as savepoint N. A + subsequent call to xRollbackTo(X,R) means that the state of the + virtual table should return to what it was when xSavepoint(X,R) was + last called. The call to xRollbackTo(X,R) will invalidate all + savepoints with N>R; none of the invalided savepoints will be + rolled back or released without first being reinitialized by a call + to xSavepoint(). A call to xRelease(X,M) invalidates all savepoints + where N>=M. + + + None of the xSavepoint(), xRelease(), or xRollbackTo() methods will + ever be called except in between calls to xBegin() and either + xCommit() or xRollback(). + + + + The native pointer to the sqlite3_vtab derived structure. + + + This is an integer identifier used to specify a specific saved + state for the virtual table for it to restore itself back to, which + should also have the effect of deleting all saved states with an + integer identifier greater than this one. + + + A standard SQLite return code. + + + + + This interface represents a virtual table implementation written in + managed code. + + + + + This method is called in response to the + method. + + + The object instance associated with + the virtual table. + + + The native user-data pointer associated with this module, as it was + provided to the SQLite core library when the native module instance + was created. + + + The module name, database name, virtual table name, and all other + arguments passed to the CREATE VIRTUAL TABLE statement. + + + Upon success, this parameter must be modified to contain the + object instance associated with + the virtual table. + + + Upon failure, this parameter must be modified to contain an error + message. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance associated with + the virtual table. + + + The native user-data pointer associated with this module, as it was + provided to the SQLite core library when the native module instance + was created. + + + The module name, database name, virtual table name, and all other + arguments passed to the CREATE VIRTUAL TABLE statement. + + + Upon success, this parameter must be modified to contain the + object instance associated with + the virtual table. + + + Upon failure, this parameter must be modified to contain an error + message. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance associated + with this virtual table. + + + The object instance containing all the + data for the inputs and outputs relating to index selection. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance associated + with this virtual table. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance associated + with this virtual table. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance associated + with this virtual table. + + + Upon success, this parameter must be modified to contain the + object instance associated + with the newly opened virtual table cursor. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance + associated with the previously opened virtual table cursor to be + used. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance + associated with the previously opened virtual table cursor to be + used. + + + Number used to help identify the selected index. + + + String used to help identify the selected index. + + + The values corresponding to each column in the selected index. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance + associated with the previously opened virtual table cursor to be + used. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance + associated with the previously opened virtual table cursor to be + used. + + + Non-zero if no more rows are available; zero otherwise. + + + + + This method is called in response to the + method. + + + The object instance + associated with the previously opened virtual table cursor to be + used. + + + The object instance to be used for + returning the specified column value to the SQLite core library. + + + The zero-based index corresponding to the column containing the + value to be returned. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance + associated with the previously opened virtual table cursor to be + used. + + + Upon success, this parameter must be modified to contain the unique + integer row identifier for the current row for the specified cursor. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance associated + with this virtual table. + + + The array of object instances containing + the new or modified column values, if any. + + + Upon success, this parameter must be modified to contain the unique + integer row identifier for the row that was inserted, if any. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance associated + with this virtual table. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance associated + with this virtual table. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance associated + with this virtual table. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance associated + with this virtual table. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance associated + with this virtual table. + + + The number of arguments to the function being sought. + + + The name of the function being sought. + + + Upon success, this parameter must be modified to contain the + object instance responsible for + implementing the specified function. + + + Upon success, this parameter must be modified to contain the + native user-data pointer associated with + . + + + Non-zero if the specified function was found; zero otherwise. + + + + + This method is called in response to the + method. + + + The object instance associated + with this virtual table. + + + The new name for the virtual table. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance associated + with this virtual table. + + + This is an integer identifier under which the the current state of + the virtual table should be saved. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance associated + with this virtual table. + + + This is an integer used to indicate that any saved states with an + identifier greater than or equal to this should be deleted by the + virtual table. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance associated + with this virtual table. + + + This is an integer identifier used to specify a specific saved + state for the virtual table for it to restore itself back to, which + should also have the effect of deleting all saved states with an + integer identifier greater than this one. + + + A standard SQLite return code. + + + + + Returns non-zero if the schema for the virtual table has been + declared. + + + + + Returns the name of the module as it was registered with the SQLite + core library. + + + + + This class contains static methods that are used to allocate, + manipulate, and free native memory provided by the SQLite core library. + + + + + Allocates at least the specified number of bytes of native memory + via the SQLite core library sqlite3_malloc() function and returns + the resulting native pointer. + + + The number of bytes to allocate. + + + The native pointer that points to a block of memory of at least the + specified size -OR- if the memory could + not be allocated. + + + + + Gets and returns the actual size of the specified memory block that + was previously obtained from the method. + + + The native pointer to the memory block previously obtained from the + method. + + + The actual size, in bytes, of the memory block specified via the + native pointer. + + + + + Frees a memory block previously obtained from the + method. + + + The native pointer to the memory block previously obtained from the + method. + + + + + This class contains static methods that are used to deal with native + UTF-8 string pointers to be used with the SQLite core library. + + + + + This is the maximum possible length for the native UTF-8 encoded + strings used with the SQLite core library. + + + + + This is the object instance used to handle + conversions from/to UTF-8. + + + + + Converts the specified managed string into the UTF-8 encoding and + returns the array of bytes containing its representation in that + encoding. + + + The managed string to convert. + + + The array of bytes containing the representation of the managed + string in the UTF-8 encoding or null upon failure. + + + + + Converts the specified array of bytes representing a string in the + UTF-8 encoding and returns a managed string. + + + The array of bytes to convert. + + + The managed string or null upon failure. + + + + + Probes a native pointer to a string in the UTF-8 encoding for its + terminating NUL character, within the specified length limit. + + + The native NUL-terminated string pointer. + + + The maximum length of the native string, in bytes. + + + The length of the native string, in bytes -OR- zero if the length + could not be determined. + + + + + Converts the specified native NUL-terminated UTF-8 string pointer + into a managed string. + + + The native NUL-terminated UTF-8 string pointer. + + + The managed string or null upon failure. + + + + + Converts the specified native UTF-8 string pointer of the specified + length into a managed string. + + + The native UTF-8 string pointer. + + + The length of the native string, in bytes. + + + The managed string or null upon failure. + + + + + Converts the specified managed string into a native NUL-terminated + UTF-8 string pointer using memory obtained from the SQLite core + library. + + + The managed string to convert. + + + The native NUL-terminated UTF-8 string pointer or + upon failure. + + + + + Converts a logical array of native NUL-terminated UTF-8 string + pointers into an array of managed strings. + + + The number of elements in the logical array of native + NUL-terminated UTF-8 string pointers. + + + The native pointer to the logical array of native NUL-terminated + UTF-8 string pointers to convert. + + + The array of managed strings or null upon failure. + + + + + Converts an array of managed strings into an array of native + NUL-terminated UTF-8 string pointers. + + + The array of managed strings to convert. + + + The array of native NUL-terminated UTF-8 string pointers or null + upon failure. + + + + + This class contains static methods that are used to deal with native + pointers to memory blocks that logically contain arrays of bytes to be + used with the SQLite core library. + + + + + Converts a native pointer to a logical array of bytes of the + specified length into a managed byte array. + + + The native pointer to the logical array of bytes to convert. + + + The length, in bytes, of the logical array of bytes to convert. + + + The managed byte array or null upon failure. + + + + + Converts a managed byte array into a native pointer to a logical + array of bytes. + + + The managed byte array to convert. + + + The native pointer to a logical byte array or null upon failure. + + + + + This class contains static methods that are used to perform several + low-level data marshalling tasks between native and managed code. + + + + + Returns a new object instance based on the + specified object instance and an integer + offset. + + + The object instance representing the base + memory location. + + + The integer offset from the base memory location that the new + object instance should point to. + + + The new object instance. + + + + + Rounds up an integer size to the next multiple of the alignment. + + + The size, in bytes, to be rounded up. + + + The required alignment for the return value. + + + The size, in bytes, rounded up to the next multiple of the + alignment. This value may end up being the same as the original + size. + + + + + Determines the offset, in bytes, of the next structure member. + + + The offset, in bytes, of the current structure member. + + + The size, in bytes, of the current structure member. + + + The alignment, in bytes, of the next structure member. + + + The offset, in bytes, of the next structure member. + + + + + Reads a value from the specified memory + location. + + + The object instance representing the base + memory location. + + + The integer offset from the base memory location where the + value to be read is located. + + + The value at the specified memory location. + + + + + Reads a value from the specified memory + location. + + + The object instance representing the base + memory location. + + + The integer offset from the base memory location where the + to be read is located. + + + The value at the specified memory location. + + + + + Reads an value from the specified memory + location. + + + The object instance representing the base + memory location. + + + The integer offset from the base memory location where the + value to be read is located. + + + The value at the specified memory location. + + + + + Writes an value to the specified memory + location. + + + The object instance representing the base + memory location. + + + The integer offset from the base memory location where the + value to be written is located. + + + The value to write. + + + + + Writes an value to the specified memory + location. + + + The object instance representing the base + memory location. + + + The integer offset from the base memory location where the + value to be written is located. + + + The value to write. + + + + + Writes a value to the specified memory + location. + + + The object instance representing the base + memory location. + + + The integer offset from the base memory location where the + value to be written is located. + + + The value to write. + + + + + Writes a value to the specified memory + location. + + + The object instance representing the base + memory location. + + + The integer offset from the base memory location where the + value to be written is located. + + + The value to write. + + + + + This class represents a managed virtual table module implementation. + It is not sealed and must be used as the base class for any + user-defined virtual table module classes implemented in managed code. + + + + + The default version of the native sqlite3_module structure in use. + + + + + This field is used to store the native sqlite3_module structure + associated with this object instance. + + + + + This field is used to store the destructor delegate to be passed to + the SQLite core library via the sqlite3_create_disposable_module() + function. + + + + + This field is used to store a pointer to the native sqlite3_module + structure returned by the sqlite3_create_disposable_module + function. + + + + + This field is used to store the virtual table instances associated + with this module. The native pointer to the sqlite3_vtab derived + structure is used to key into this collection. + + + + + This field is used to store the virtual table cursor instances + associated with this module. The native pointer to the + sqlite3_vtab_cursor derived structure is used to key into this + collection. + + + + + This field is used to store the virtual table function instances + associated with this module. The case-insensitive function name + and the number of arguments (with -1 meaning "any") are used to + construct the string that is used to key into this collection. + + + + + Constructs an instance of this class. + + + The name of the module. This parameter cannot be null. + + + + + Calls the native SQLite core library in order to create a new + disposable module containing the implementation of a virtual table. + + + The native database connection pointer to use. + + + Non-zero upon success. + + + + + This method is called by the SQLite core library when the native + module associated with this object instance is being destroyed due + to its parent connection being closed. It may also be called by + the "vtshim" module if/when the sqlite3_dispose_module() function + is called. + + + The native user-data pointer associated with this module, as it was + provided to the SQLite core library when the native module instance + was created. + + + + + Creates and returns the native sqlite_module structure using the + configured (or default) + interface implementation. + + + The native sqlite_module structure using the configured (or + default) interface + implementation. + + + + + Creates and returns the native sqlite_module structure using the + specified interface + implementation. + + + The interface implementation to + use. + + + The native sqlite_module structure using the specified + interface implementation. + + + + + Creates a copy of the specified + object instance, + using default implementations for the contained delegates when + necessary. + + + The object + instance to copy. + + + The new object + instance. + + + + + Calls one of the virtual table initialization methods. + + + Non-zero to call the + method; otherwise, the + method will be called. + + + The native database connection handle. + + + The original native pointer value that was provided to the + sqlite3_create_module(), sqlite3_create_module_v2() or + sqlite3_create_disposable_module() functions. + + + The number of arguments from the CREATE VIRTUAL TABLE statement. + + + The array of string arguments from the CREATE VIRTUAL TABLE + statement. + + + Upon success, this parameter must be modified to point to the newly + created native sqlite3_vtab derived structure. + + + Upon failure, this parameter must be modified to point to the error + message, with the underlying memory having been obtained from the + sqlite3_malloc() function. + + + A standard SQLite return code. + + + + + Calls one of the virtual table finalization methods. + + + Non-zero to call the + method; otherwise, the + method will be + called. + + + The native pointer to the sqlite3_vtab derived structure. + + + A standard SQLite return code. + + + + + Arranges for the specified error message to be placed into the + zErrMsg field of a sqlite3_vtab derived structure, freeing the + existing error message, if any. + + + The object instance to be used. + + + The native pointer to the sqlite3_vtab derived structure. + + + Non-zero if this error message should also be logged using the + class. + + + The error message. + + + Non-zero upon success. + + + + + Arranges for the specified error message to be placed into the + zErrMsg field of a sqlite3_vtab derived structure, freeing the + existing error message, if any. + + + The object instance to be used. + + + The object instance used to + lookup the native pointer to the sqlite3_vtab derived structure. + + + Non-zero if this error message should also be logged using the + class. + + + The error message. + + + Non-zero upon success. + + + + + Arranges for the specified error message to be placed into the + zErrMsg field of a sqlite3_vtab derived structure, freeing the + existing error message, if any. + + + The object instance to be used. + + + The native pointer to the sqlite3_vtab_cursor derived structure + used to get the native pointer to the sqlite3_vtab derived + structure. + + + Non-zero if this error message should also be logged using the + class. + + + The error message. + + + Non-zero upon success. + + + + + Arranges for the specified error message to be placed into the + zErrMsg field of a sqlite3_vtab derived structure, freeing the + existing error message, if any. + + + The object instance to be used. + + + The object instance used to + lookup the native pointer to the sqlite3_vtab derived structure. + + + Non-zero if this error message should also be logged using the + class. + + + The error message. + + + Non-zero upon success. + + + + + Gets and returns the interface + implementation to be used when creating the native sqlite3_module + structure. Derived classes may override this method to supply an + alternate implementation for the + interface. + + + The interface implementation to + be used when populating the native sqlite3_module structure. If + the returned value is null, the private methods provided by the + class and relating to the + interface will be used to + create the necessary delegates. + + + + + Creates and returns the + interface implementation corresponding to the current + object instance. + + + The interface implementation + corresponding to the current object + instance. + + + + + Allocates a native sqlite3_vtab derived structure and returns a + native pointer to it. + + + A native pointer to a native sqlite3_vtab derived structure. + + + + + Zeros out the fields of a native sqlite3_vtab derived structure. + + + The native pointer to the native sqlite3_vtab derived structure to + zero. + + + + + Frees a native sqlite3_vtab structure using the provided native + pointer to it. + + + A native pointer to a native sqlite3_vtab derived structure. + + + + + Allocates a native sqlite3_vtab_cursor derived structure and + returns a native pointer to it. + + + A native pointer to a native sqlite3_vtab_cursor derived structure. + + + + + Frees a native sqlite3_vtab_cursor structure using the provided + native pointer to it. + + + A native pointer to a native sqlite3_vtab_cursor derived structure. + + + + + Reads and returns the native pointer to the sqlite3_vtab derived + structure based on the native pointer to the sqlite3_vtab_cursor + derived structure. + + + The object instance to be used. + + + The native pointer to the sqlite3_vtab_cursor derived structure + from which to read the native pointer to the sqlite3_vtab derived + structure. + + + The native pointer to the sqlite3_vtab derived structure -OR- + if it cannot be determined. + + + + + Reads and returns the native pointer to the sqlite3_vtab derived + structure based on the native pointer to the sqlite3_vtab_cursor + derived structure. + + + The native pointer to the sqlite3_vtab_cursor derived structure + from which to read the native pointer to the sqlite3_vtab derived + structure. + + + The native pointer to the sqlite3_vtab derived structure -OR- + if it cannot be determined. + + + + + Looks up and returns the object + instance based on the native pointer to the sqlite3_vtab derived + structure. + + + The native pointer to the sqlite3_vtab derived structure. + + + The object instance or null if + the corresponding one cannot be found. + + + + + Allocates and returns a native pointer to a sqlite3_vtab derived + structure and creates an association between it and the specified + object instance. + + + The object instance to be used + when creating the association. + + + The native pointer to a sqlite3_vtab derived structure or + if the method fails for any reason. + + + + + Looks up and returns the + object instance based on the native pointer to the + sqlite3_vtab_cursor derived structure. + + + The native pointer to the sqlite3_vtab derived structure. + + + The native pointer to the sqlite3_vtab_cursor derived structure. + + + The object instance or null + if the corresponding one cannot be found. + + + + + Allocates and returns a native pointer to a sqlite3_vtab_cursor + derived structure and creates an association between it and the + specified object instance. + + + The object instance to be + used when creating the association. + + + The native pointer to a sqlite3_vtab_cursor derived structure or + if the method fails for any reason. + + + + + Deterimines the key that should be used to identify and store the + object instance for the virtual table + (i.e. to be returned via the + method). + + + The number of arguments to the virtual table function. + + + The name of the virtual table function. + + + The object instance associated with + this virtual table function. + + + The string that should be used to identify and store the virtual + table function instance. This method cannot return null. If null + is returned from this method, the behavior is undefined. + + + + + Attempts to declare the schema for the virtual table using the + specified database connection. + + + The object instance to use when + declaring the schema of the virtual table. This parameter may not + be null. + + + The string containing the CREATE TABLE statement that completely + describes the schema for the virtual table. This parameter may not + be null. + + + Upon failure, this parameter must be modified to contain an error + message. + + + A standard SQLite return code. + + + + + Calls the native SQLite core library in order to declare a virtual + table function in response to a call into the + + or virtual table + methods. + + + The object instance to use when + declaring the schema of the virtual table. + + + The number of arguments to the function being declared. + + + The name of the function being declared. + + + Upon success, the contents of this parameter are undefined. Upon + failure, it should contain an appropriate error message. + + + A standard SQLite return code. + + + + + Arranges for the specified error message to be placed into the + zErrMsg field of a sqlite3_vtab derived structure, freeing the + existing error message, if any. + + + The native pointer to the sqlite3_vtab derived structure. + + + The error message. + + + Non-zero upon success. + + + + + Arranges for the specified error message to be placed into the + zErrMsg field of a sqlite3_vtab derived structure, freeing the + existing error message, if any. + + + The object instance used to + lookup the native pointer to the sqlite3_vtab derived structure. + + + The error message. + + + Non-zero upon success. + + + + + Arranges for the specified error message to be placed into the + zErrMsg field of a sqlite3_vtab derived structure, freeing the + existing error message, if any. + + + The object instance used to + lookup the native pointer to the sqlite3_vtab derived structure. + + + The error message. + + + Non-zero upon success. + + + + + Modifies the specified object instance + to contain the specified estimated cost. + + + The object instance to modify. + + + The estimated cost value to use. Using a null value means that the + default value provided by the SQLite core library should be used. + + + Non-zero upon success. + + + + + Modifies the specified object instance + to contain the default estimated cost. + + + The object instance to modify. + + + Non-zero upon success. + + + + + Modifies the specified object instance + to contain the specified estimated rows. + + + The object instance to modify. + + + The estimated rows value to use. Using a null value means that the + default value provided by the SQLite core library should be used. + + + Non-zero upon success. + + + + + Modifies the specified object instance + to contain the default estimated rows. + + + The object instance to modify. + + + Non-zero upon success. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + This method is called in response to the + method. + + + The object instance associated with + the virtual table. + + + The native user-data pointer associated with this module, as it was + provided to the SQLite core library when the native module instance + was created. + + + The module name, database name, virtual table name, and all other + arguments passed to the CREATE VIRTUAL TABLE statement. + + + Upon success, this parameter must be modified to contain the + object instance associated with + the virtual table. + + + Upon failure, this parameter must be modified to contain an error + message. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance associated with + the virtual table. + + + The native user-data pointer associated with this module, as it was + provided to the SQLite core library when the native module instance + was created. + + + The module name, database name, virtual table name, and all other + arguments passed to the CREATE VIRTUAL TABLE statement. + + + Upon success, this parameter must be modified to contain the + object instance associated with + the virtual table. + + + Upon failure, this parameter must be modified to contain an error + message. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance associated + with this virtual table. + + + The object instance containing all the + data for the inputs and outputs relating to index selection. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance associated + with this virtual table. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance associated + with this virtual table. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance associated + with this virtual table. + + + Upon success, this parameter must be modified to contain the + object instance associated + with the newly opened virtual table cursor. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance + associated with the previously opened virtual table cursor to be + used. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance + associated with the previously opened virtual table cursor to be + used. + + + Number used to help identify the selected index. + + + String used to help identify the selected index. + + + The values corresponding to each column in the selected index. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance + associated with the previously opened virtual table cursor to be + used. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance + associated with the previously opened virtual table cursor to be + used. + + + Non-zero if no more rows are available; zero otherwise. + + + + + This method is called in response to the + method. + + + The object instance + associated with the previously opened virtual table cursor to be + used. + + + The object instance to be used for + returning the specified column value to the SQLite core library. + + + The zero-based index corresponding to the column containing the + value to be returned. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance + associated with the previously opened virtual table cursor to be + used. + + + Upon success, this parameter must be modified to contain the unique + integer row identifier for the current row for the specified cursor. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance associated + with this virtual table. + + + The array of object instances containing + the new or modified column values, if any. + + + Upon success, this parameter must be modified to contain the unique + integer row identifier for the row that was inserted, if any. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance associated + with this virtual table. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance associated + with this virtual table. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance associated + with this virtual table. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance associated + with this virtual table. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance associated + with this virtual table. + + + The number of arguments to the function being sought. + + + The name of the function being sought. + + + Upon success, this parameter must be modified to contain the + object instance responsible for + implementing the specified function. + + + Upon success, this parameter must be modified to contain the + native user-data pointer associated with + . + + + Non-zero if the specified function was found; zero otherwise. + + + + + This method is called in response to the + method. + + + The object instance associated + with this virtual table. + + + The new name for the virtual table. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance associated + with this virtual table. + + + This is an integer identifier under which the the current state of + the virtual table should be saved. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance associated + with this virtual table. + + + This is an integer used to indicate that any saved states with an + identifier greater than or equal to this should be deleted by the + virtual table. + + + A standard SQLite return code. + + + + + This method is called in response to the + method. + + + The object instance associated + with this virtual table. + + + This is an integer identifier used to specify a specific saved + state for the virtual table for it to restore itself back to, which + should also have the effect of deleting all saved states with an + integer identifier greater than this one. + + + A standard SQLite return code. + + + + + Disposes of this object instance. + + + + + Throws an if this object + instance has been disposed. + + + + + Disposes of this object instance. + + + Non-zero if this method is being called from the + method. Zero if this method is being + called from the finalizer. + + + + + Finalizes this object instance. + + + + + Returns or sets a boolean value indicating whether virtual table + errors should be logged using the class. + + + + + Returns or sets a boolean value indicating whether exceptions + caught in the + method, + method, and the + method should be logged using the + class. + + + + + Returns or sets a boolean value indicating whether virtual table + errors should be logged using the class. + + + + + Returns or sets a boolean value indicating whether exceptions + caught in the + method, + method, and the + method should be logged using the + class. + + + + + Returns non-zero if the schema for the virtual table has been + declared. + + + + + Returns the name of the module as it was registered with the SQLite + core library. + + + + + This class implements the + interface by forwarding those method calls to the + object instance it contains. If the + contained object instance is null, all + the methods simply generate an + error. + + + + + This is the value that is always used for the "logErrors" + parameter to the various static error handling methods provided + by the class. + + + + + This is the error message text used when the contained + object instance is not available + for any reason. + + + + + The object instance used to provide + an implementation of the + interface. + + + + + Constructs an instance of this class. + + + The object instance used to provide + an implementation of the + interface. + + + + + Sets the table error message to one that indicates the native + module implementation is not available. + + + The native pointer to the sqlite3_vtab derived structure. + + + The value of . + + + + + Sets the table error message to one that indicates the native + module implementation is not available. + + + The native pointer to the sqlite3_vtab_cursor derived + structure. + + + The value of . + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + Disposes of this object instance. + + + + + Throws an if this object + instance has been disposed. + + + + + Disposes of this object instance. + + + Non-zero if this method is being called from the + method. Zero if this method is being + called from the finalizer. + + + + + Finalizes this object instance. + + + + + This class represents a virtual table cursor to be used with the + class. It is not sealed and may + be used as the base class for any user-defined virtual table cursor + class that wraps an object instance. + + + + + The instance provided when this cursor + was created. + + + + + This value will be non-zero if false has been returned from the + method. + + + + + Constructs an instance of this class. + + + The object instance associated + with this object instance. + + + The instance to expose as a virtual + table cursor. + + + + + Advances to the next row of the virtual table cursor using the + method of the + object instance. + + + Non-zero if the current row is valid; zero otherwise. If zero is + returned, no further rows are available. + + + + + Resets the virtual table cursor position, also invalidating the + current row, using the method of + the object instance. + + + + + Closes the virtual table cursor. This method must not throw any + exceptions. + + + + + Throws an if the virtual + table cursor has been closed. + + + + + Throws an if this object + instance has been disposed. + + + + + Disposes of this object instance. + + + Non-zero if this method is being called from the + method. Zero if this method is + being called from the finalizer. + + + + + Returns the value for the current row of the virtual table cursor + using the property of the + object instance. + + + + + Returns non-zero if the end of the virtual table cursor has been + seen (i.e. no more rows are available, including the current one). + + + + + Returns non-zero if the virtual table cursor is open. + + + + + This class implements a virtual table module that exposes an + object instance as a read-only virtual + table. It is not sealed and may be used as the base class for any + user-defined virtual table class that wraps an + object instance. The following short + example shows it being used to treat an array of strings as a table + data source: + + public static class Sample + { + public static void Main() + { + using (SQLiteConnection connection = new SQLiteConnection( + "Data Source=:memory:;")) + { + connection.Open(); + + connection.CreateModule(new SQLiteModuleEnumerable( + "sampleModule", new string[] { "one", "two", "three" })); + + using (SQLiteCommand command = connection.CreateCommand()) + { + command.CommandText = + "CREATE VIRTUAL TABLE t1 USING sampleModule;"; + + command.ExecuteNonQuery(); + } + + using (SQLiteCommand command = connection.CreateCommand()) + { + command.CommandText = "SELECT * FROM t1;"; + + using (SQLiteDataReader dataReader = command.ExecuteReader()) + { + while (dataReader.Read()) + Console.WriteLine(dataReader[0].ToString()); + } + } + + connection.Close(); + } + } + } + + + + + + This class implements a virtual table module that does nothing by + providing "empty" implementations for all of the + interface methods. The result + codes returned by these "empty" method implementations may be + controlled on a per-method basis by using and/or overriding the + , + , + , + , and + methods from within derived classes. + + + + + This field is used to store the + values to return, on a per-method basis, for all methods that are + part of the interface. + + + + + Constructs an instance of this class. + + + The name of the module. This parameter cannot be null. + + + + + Determines the default value to be + returned by methods of the + interface that lack an overridden implementation in all classes + derived from the class. + + + The value that should be returned + by all interface methods unless + a more specific result code has been set for that interface method. + + + + + Converts a value into a boolean + return value for use with the + method. + + + The value to convert. + + + The value. + + + + + Converts a value into a boolean + return value for use with the + method. + + + The value to convert. + + + The value. + + + + + Determines the value that should be + returned by the specified + interface method if it lack an overridden implementation. If no + specific value is available (or set) + for the specified method, the value + returned by the method will be + returned instead. + + + The name of the method. Currently, this method must be part of + the interface. + + + The value that should be returned + by the interface method. + + + + + Sets the value that should be + returned by the specified + interface method if it lack an overridden implementation. + + + The name of the method. Currently, this method must be part of + the interface. + + + The value that should be returned + by the interface method. + + + Non-zero upon success. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + Throws an if this object + instance has been disposed. + + + + + Disposes of this object instance. + + + Non-zero if this method is being called from the + method. Zero if this method is + being called from the finalizer. + + + + + The CREATE TABLE statement used to declare the schema for the + virtual table. + + + + + The instance containing the backing data + for the virtual table. + + + + + Constructs an instance of this class. + + + The name of the module. This parameter cannot be null. + + + The instance to expose as a virtual + table. This parameter cannot be null. + + + + + Determines the SQL statement used to declare the virtual table. + This method should be overridden in derived classes if they require + a custom virtual table schema. + + + The SQL statement used to declare the virtual table -OR- null if it + cannot be determined. + + + + + Sets the table error message to one that indicates the virtual + table cursor is of the wrong type. + + + The object instance. + + + The value of . + + + + + Sets the table error message to one that indicates the virtual + table cursor has no current row. + + + The object instance. + + + The value of . + + + + + Determines the string to return as the column value for the object + instance value. + + + The object instance + associated with the previously opened virtual table cursor to be + used. + + + The object instance to return a string representation for. + + + The string representation of the specified object instance or null + upon failure. + + + + + Constructs an unique row identifier from two + values. The first value + must contain the row sequence number for the current row and the + second value must contain the hash code of the enumerator value + for the current row. + + + The integer row sequence number for the current row. + + + The hash code of the enumerator value for the current row. + + + The unique row identifier or zero upon failure. + + + + + Determines the unique row identifier for the current row. + + + The object instance + associated with the previously opened virtual table cursor to be + used. + + + The object instance to return a unique row identifier for. + + + The unique row identifier or zero upon failure. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + Throws an if this object + instance has been disposed. + + + + + Disposes of this object instance. + + + Non-zero if this method is being called from the + method. Zero if this method is + being called from the finalizer. + + + + + This class represents a virtual table cursor to be used with the + class. It is not sealed and may + be used as the base class for any user-defined virtual table cursor + class that wraps an object instance. + + + + + The instance provided when this + cursor was created. + + + + + Constructs an instance of this class. + + + The object instance associated + with this object instance. + + + The instance to expose as a virtual + table cursor. + + + + + Closes the virtual table cursor. This method must not throw any + exceptions. + + + + + Throws an if this object + instance has been disposed. + + + + + Disposes of this object instance. + + + Non-zero if this method is being called from the + method. Zero if this method is + being called from the finalizer. + + + + + Returns the value for the current row of the virtual table cursor + using the property of the + object instance. + + + + + This class implements a virtual table module that exposes an + object instance as a read-only virtual + table. It is not sealed and may be used as the base class for any + user-defined virtual table class that wraps an + object instance. + + + + + The instance containing the backing + data for the virtual table. + + + + + Constructs an instance of this class. + + + The name of the module. This parameter cannot be null. + + + The instance to expose as a virtual + table. This parameter cannot be null. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + See the method. + + + + + Throws an if this object + instance has been disposed. + + + + + Disposes of this object instance. + + + Non-zero if this method is being called from the + method. Zero if this method is + being called from the finalizer. + + +
+
diff --git a/TBF_V2/Sources/TBF/packages/System.Data.SQLite.1.0.90.0/tools/install.ps1 b/TBF_V2/Sources/TBF/packages/System.Data.SQLite.1.0.90.0/tools/install.ps1 new file mode 100644 index 00000000..a4293924 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/System.Data.SQLite.1.0.90.0/tools/install.ps1 @@ -0,0 +1,36 @@ +############################################################################### +# +# install.ps1 -- +# +# Written by Joe Mistachkin. +# Released to the public domain, use at your own risk! +# +############################################################################### + +param($installPath, $toolsPath, $package, $project) + +$platformNames = "x86", "x64" +$fileName = "SQLite.Interop.dll" +$propertyName = "CopyToOutputDirectory" + +foreach($platformName in $platformNames) { + $folder = $project.ProjectItems.Item($platformName) + + if ($folder -eq $null) { + continue + } + + $item = $folder.ProjectItems.Item($fileName) + + if ($item -eq $null) { + continue + } + + $property = $item.Properties.Item($propertyName) + + if ($property -eq $null) { + continue + } + + $property.Value = 1 +} diff --git a/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Logic.ProductionToProductMapper.dll.config b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Logic.ProductionToProductMapper.dll.config new file mode 100644 index 00000000..e936cc13 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Logic.ProductionToProductMapper.dll.config @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/NLog.xml b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/NLog.xml new file mode 100644 index 00000000..b886eaa7 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/NLog.xml @@ -0,0 +1,28548 @@ + + + + NLog + + + + + Indicates that the value of the marked element could be null sometimes, + so the check for null is necessary before its usage. + + + [CanBeNull] object Test() => null; + + void UseTest() { + var p = Test(); + var s = p.ToString(); // Warning: Possible 'System.NullReferenceException' + } + + + + + Indicates that the value of the marked element could never be null. + + + [NotNull] object Foo() { + return null; // Warning: Possible 'null' assignment + } + + + + + Can be appplied to symbols of types derived from IEnumerable as well as to symbols of Task + and Lazy classes to indicate that the value of a collection item, of the Task.Result property + or of the Lazy.Value property can never be null. + + + + + Can be appplied to symbols of types derived from IEnumerable as well as to symbols of Task + and Lazy classes to indicate that the value of a collection item, of the Task.Result property + or of the Lazy.Value property can be null. + + + + + Indicates that the marked method builds string by format pattern and (optional) arguments. + Parameter, which contains format string, should be given in constructor. The format string + should be in -like form. + + + [StringFormatMethod("message")] + void ShowError(string message, params object[] args) { /* do something */ } + + void Foo() { + ShowError("Failed: {0}"); // Warning: Non-existing argument in format string + } + + + + + Specifies which parameter of an annotated method should be treated as format-string + + + + + For a parameter that is expected to be one of the limited set of values. + Specify fields of which type should be used as values for this parameter. + + + + + Indicates that the function argument should be string literal and match one + of the parameters of the caller function. For example, ReSharper annotates + the parameter of . + + + void Foo(string param) { + if (param == null) + throw new ArgumentNullException("par"); // Warning: Cannot resolve symbol + } + + + + + Indicates that the method is contained in a type that implements + System.ComponentModel.INotifyPropertyChanged interface and this method + is used to notify that some property value changed. + + + The method should be non-static and conform to one of the supported signatures: + + NotifyChanged(string) + NotifyChanged(params string[]) + NotifyChanged{T}(Expression{Func{T}}) + NotifyChanged{T,U}(Expression{Func{T,U}}) + SetProperty{T}(ref T, T, string) + + + + public class Foo : INotifyPropertyChanged { + public event PropertyChangedEventHandler PropertyChanged; + + [NotifyPropertyChangedInvocator] + protected virtual void NotifyChanged(string propertyName) { ... } + + string _name; + + public string Name { + get { return _name; } + set { _name = value; NotifyChanged("LastName"); /* Warning */ } + } + } + + Examples of generated notifications: + + NotifyChanged("Property") + NotifyChanged(() => Property) + NotifyChanged((VM x) => x.Property) + SetProperty(ref myField, value, "Property") + + + + + + Describes dependency between method input and output. + + +

Function Definition Table syntax:

+ + FDT ::= FDTRow [;FDTRow]* + FDTRow ::= Input => Output | Output <= Input + Input ::= ParameterName: Value [, Input]* + Output ::= [ParameterName: Value]* {halt|stop|void|nothing|Value} + Value ::= true | false | null | notnull | canbenull + + If method has single input parameter, it's name could be omitted.
+ Using halt (or void/nothing, which is the same) for method output + means that the methods doesn't return normally (throws or terminates the process).
+ Value canbenull is only applicable for output parameters.
+ You can use multiple [ContractAnnotation] for each FDT row, or use single attribute + with rows separated by semicolon. There is no notion of order rows, all rows are checked + for applicability and applied per each program state tracked by R# analysis.
+
+ + + [ContractAnnotation("=> halt")] + public void TerminationMethod() + + + [ContractAnnotation("halt <= condition: false")] + public void Assert(bool condition, string text) // regular assertion method + + + [ContractAnnotation("s:null => true")] + public bool IsNullOrEmpty(string s) // string.IsNullOrEmpty() + + + // A method that returns null if the parameter is null, + // and not null if the parameter is not null + [ContractAnnotation("null => null; notnull => notnull")] + public object Transform(object data) + + + [ContractAnnotation("=> true, result: notnull; => false, result: null")] + public bool TryParse(string s, out Person result) + + +
+ + + Indicates that marked element should be localized or not. + + + [LocalizationRequiredAttribute(true)] + class Foo { + string str = "my string"; // Warning: Localizable string + } + + + + + Indicates that the value of the marked type (or its derivatives) + cannot be compared using '==' or '!=' operators and Equals() + should be used instead. However, using '==' or '!=' for comparison + with null is always permitted. + + + [CannotApplyEqualityOperator] + class NoEquality { } + + class UsesNoEquality { + void Test() { + var ca1 = new NoEquality(); + var ca2 = new NoEquality(); + if (ca1 != null) { // OK + bool condition = ca1 == ca2; // Warning + } + } + } + + + + + When applied to a target attribute, specifies a requirement for any type marked + with the target attribute to implement or inherit specific type or types. + + + [BaseTypeRequired(typeof(IComponent)] // Specify requirement + class ComponentAttribute : Attribute { } + + [Component] // ComponentAttribute requires implementing IComponent interface + class MyComponent : IComponent { } + + + + + Indicates that the marked symbol is used implicitly (e.g. via reflection, in external library), + so this symbol will not be marked as unused (as well as by other usage inspections). + + + + + Should be used on attributes and causes ReSharper to not mark symbols marked with such attributes + as unused (as well as by other usage inspections) + + + + Only entity marked with attribute considered used. + + + Indicates implicit assignment to a member. + + + + Indicates implicit instantiation of a type with fixed constructor signature. + That means any unused constructor parameters won't be reported as such. + + + + Indicates implicit instantiation of a type. + + + + Specify what is considered used implicitly when marked + with or . + + + + Members of entity marked with attribute are considered used. + + + Entity marked with attribute and all its members considered used. + + + + This attribute is intended to mark publicly available API + which should not be removed and so is treated as used. + + + + + Tells code analysis engine if the parameter is completely handled when the invoked method is on stack. + If the parameter is a delegate, indicates that delegate is executed while the method is executed. + If the parameter is an enumerable, indicates that it is enumerated while the method is executed. + + + + + Indicates that a method does not make any observable state changes. + The same as System.Diagnostics.Contracts.PureAttribute. + + + [Pure] int Multiply(int x, int y) => x * y; + + void M() { + Multiply(123, 42); // Waring: Return value of pure method is not used + } + + + + + Indicates that the return value of method invocation must be used. + + + + + Indicates the type member or parameter of some type, that should be used instead of all other ways + to get the value that type. This annotation is useful when you have some "context" value evaluated + and stored somewhere, meaning that all other ways to get this value must be consolidated with existing one. + + + class Foo { + [ProvidesContext] IBarService _barService = ...; + + void ProcessNode(INode node) { + DoSomething(node, node.GetGlobalServices().Bar); + // ^ Warning: use value of '_barService' field + } + } + + + + + Indicates that a parameter is a path to a file or a folder within a web project. + Path can be relative or absolute, starting from web root (~). + + + + + An extension method marked with this attribute is processed by ReSharper code completion + as a 'Source Template'. When extension method is completed over some expression, it's source code + is automatically expanded like a template at call site. + + + Template method body can contain valid source code and/or special comments starting with '$'. + Text inside these comments is added as source code when the template is applied. Template parameters + can be used either as additional method parameters or as identifiers wrapped in two '$' signs. + Use the attribute to specify macros for parameters. + + + In this example, the 'forEach' method is a source template available over all values + of enumerable types, producing ordinary C# 'foreach' statement and placing caret inside block: + + [SourceTemplate] + public static void forEach<T>(this IEnumerable<T> xs) { + foreach (var x in xs) { + //$ $END$ + } + } + + + + + + Allows specifying a macro for a parameter of a source template. + + + You can apply the attribute on the whole method or on any of its additional parameters. The macro expression + is defined in the property. When applied on a method, the target + template parameter is defined in the property. To apply the macro silently + for the parameter, set the property value = -1. + + + Applying the attribute on a source template method: + + [SourceTemplate, Macro(Target = "item", Expression = "suggestVariableName()")] + public static void forEach<T>(this IEnumerable<T> collection) { + foreach (var item in collection) { + //$ $END$ + } + } + + Applying the attribute on a template method parameter: + + [SourceTemplate] + public static void something(this Entity x, [Macro(Expression = "guid()", Editable = -1)] string newguid) { + /*$ var $x$Id = "$newguid$" + x.ToString(); + x.DoSomething($x$Id); */ + } + + + + + + Allows specifying a macro that will be executed for a source template + parameter when the template is expanded. + + + + + Allows specifying which occurrence of the target parameter becomes editable when the template is deployed. + + + If the target parameter is used several times in the template, only one occurrence becomes editable; + other occurrences are changed synchronously. To specify the zero-based index of the editable occurrence, + use values >= 0. To make the parameter non-editable when the template is expanded, use -1. + > + + + + Identifies the target parameter of a source template if the + is applied on a template method. + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter + is an MVC action. If applied to a method, the MVC action name is calculated + implicitly from the context. Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper, String). + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC area. + Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper, String). + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter is + an MVC controller. If applied to a method, the MVC controller name is calculated + implicitly from the context. Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper, String, String). + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC Master. Use this attribute + for custom wrappers similar to System.Web.Mvc.Controller.View(String, String). + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC model type. Use this attribute + for custom wrappers similar to System.Web.Mvc.Controller.View(String, Object). + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter is an MVC + partial view. If applied to a method, the MVC partial view name is calculated implicitly + from the context. Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.RenderPartialExtensions.RenderPartial(HtmlHelper, String). + + + + + ASP.NET MVC attribute. Allows disabling inspections for MVC views within a class or a method. + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC display template. + Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.DisplayExtensions.DisplayForModel(HtmlHelper, String). + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC editor template. + Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.EditorExtensions.EditorForModel(HtmlHelper, String). + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC template. + Use this attribute for custom wrappers similar to + System.ComponentModel.DataAnnotations.UIHintAttribute(System.String). + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter + is an MVC view component. If applied to a method, the MVC view name is calculated implicitly + from the context. Use this attribute for custom wrappers similar to + System.Web.Mvc.Controller.View(Object). + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter + is an MVC view component name. + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter + is an MVC view component view. If applied to a method, the MVC view component view name is default. + + + + + ASP.NET MVC attribute. When applied to a parameter of an attribute, + indicates that this parameter is an MVC action name. + + + [ActionName("Foo")] + public ActionResult Login(string returnUrl) { + ViewBag.ReturnUrl = Url.Action("Foo"); // OK + return RedirectToAction("Bar"); // Error: Cannot resolve action + } + + + + + Razor attribute. Indicates that a parameter or a method is a Razor section. + Use this attribute for custom wrappers similar to + System.Web.WebPages.WebPageBase.RenderSection(String). + + + + + Indicates how method, constructor invocation or property access + over collection type affects content of the collection. + + + + Method does not use or modify content of the collection. + + + Method only reads content of the collection but does not modify it. + + + Method can change content of the collection but does not add new elements. + + + Method can add new elements to the collection. + + + + Indicates that the marked method is assertion method, i.e. it halts control flow if + one of the conditions is satisfied. To set the condition, mark one of the parameters with + attribute. + + + + + Indicates the condition parameter of the assertion method. The method itself should be + marked by attribute. The mandatory argument of + the attribute is the assertion type. + + + + + Specifies assertion type. If the assertion method argument satisfies the condition, + then the execution continues. Otherwise, execution is assumed to be halted. + + + + Marked parameter should be evaluated to true. + + + Marked parameter should be evaluated to false. + + + Marked parameter should be evaluated to null value. + + + Marked parameter should be evaluated to not null value. + + + + Indicates that the marked method unconditionally terminates control flow execution. + For example, it could unconditionally throw exception. + + + + + Indicates that method is pure LINQ method, with postponed enumeration (like Enumerable.Select, + .Where). This annotation allows inference of [InstantHandle] annotation for parameters + of delegate type by analyzing LINQ method chains. + + + + + Indicates that IEnumerable, passed as parameter, is not enumerated. + + + + + Indicates that parameter is regular expression pattern. + + + + + Prevents the Member Reordering feature from tossing members of the marked class. + + + The attribute must be mentioned in your member reordering patterns + + + + + XAML attribute. Indicates the type that has ItemsSource property and should be treated + as ItemsControl-derived type, to enable inner items DataContext type resolve. + + + + + XAML attribute. Indicates the property of some BindingBase-derived type, that + is used to bind some item of ItemsControl-derived type. This annotation will + enable the DataContext type resolve for XAML bindings for such properties. + + + Property should have the tree ancestor of the ItemsControl type or + marked with the attribute. + + + + + Support implementation of + + + + + + + + + + + + + + + + + Asynchronous continuation delegate - function invoked at the end of asynchronous + processing. + + Exception during asynchronous processing or null if no exception + was thrown. + + + + Helpers for asynchronous operations. + + + + + Iterates over all items in the given collection and runs the specified action + in sequence (each action executes only after the preceding one has completed without an error). + + Type of each item. + The items to iterate. + The asynchronous continuation to invoke once all items + have been iterated. + The action to invoke for each item. + + + + Repeats the specified asynchronous action multiple times and invokes asynchronous continuation at the end. + + The repeat count. + The asynchronous continuation to invoke at the end. + The action to invoke. + + + + Modifies the continuation by pre-pending given action to execute just before it. + + The async continuation. + The action to pre-pend. + Continuation which will execute the given action before forwarding to the actual continuation. + + + + Attaches a timeout to a continuation which will invoke the continuation when the specified + timeout has elapsed. + + The asynchronous continuation. + The timeout. + Wrapped continuation. + + + + Iterates over all items in the given collection and runs the specified action + in parallel (each action executes on a thread from thread pool). + + Type of each item. + The items to iterate. + The asynchronous continuation to invoke once all items + have been iterated. + The action to invoke for each item. + + + + Runs the specified asynchronous action synchronously (blocks until the continuation has + been invoked). + + The action. + + Using this method is not recommended because it will block the calling thread. + + + + + Wraps the continuation with a guard which will only make sure that the continuation function + is invoked only once. + + The asynchronous continuation. + Wrapped asynchronous continuation. + + + + Gets the combined exception from all exceptions in the list. + + The exceptions. + Combined exception or null if no exception was thrown. + + + + Disposes the Timer, and waits for it to leave the Timer-callback-method + + The Timer object to dispose + Timeout to wait (TimeSpan.Zero means dispose without wating) + Timer disposed within timeout (true/false) + + + + Asynchronous action. + + Continuation to be invoked at the end of action. + + + + Asynchronous action with one argument. + + Type of the argument. + Argument to the action. + Continuation to be invoked at the end of action. + + + + Represents the logging event with asynchronous continuation. + + + + + Initializes a new instance of the struct. + + The log event. + The continuation. + + + + Gets the log event. + + + + + Gets the continuation. + + + + + Implements the operator ==. + + The event info1. + The event info2. + The result of the operator. + + + + Implements the operator ==. + + The event info1. + The event info2. + The result of the operator. + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + A value of true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + String Conversion Helpers + + + + + Converts input string value into + + Input value + Output value + Default value + Returns failure if the input value could not be parsed + + + + Converts the string representation of the name or numeric value of one or more enumerated constants to an equivalent enumerated object. A parameter specifies whether the operation is case-sensitive. The return value indicates whether the conversion succeeded. + + The enumeration type to which to convert value. + The string representation of the enumeration name or underlying value to convert. + When this method returns, result contains an object of type TEnum whose value is represented by value if the parse operation succeeds. If the parse operation fails, result contains the default value of the underlying type of TEnum. Note that this value need not be a member of the TEnum enumeration. This parameter is passed uninitialized. + true if the value parameter was converted successfully; otherwise, false. + Wrapper because Enum.TryParse is not present in .net 3.5 + + + + Converts the string representation of the name or numeric value of one or more enumerated constants to an equivalent enumerated object. A parameter specifies whether the operation is case-sensitive. The return value indicates whether the conversion succeeded. + + The enumeration type to which to convert value. + The string representation of the enumeration name or underlying value to convert. + true to ignore case; false to consider case. + When this method returns, result contains an object of type TEnum whose value is represented by value if the parse operation succeeds. If the parse operation fails, result contains the default value of the underlying type of TEnum. Note that this value need not be a member of the TEnum enumeration. This parameter is passed uninitialized. + true if the value parameter was converted successfully; otherwise, false. + Wrapper because Enum.TryParse is not present in .net 3.5 + + + + Enum.TryParse implementation for .net 3.5 + + + + Don't uses reflection + + + + NLog internal logger. + + Writes to file, console or custom textwriter (see ) + + + Don't use as that can lead to recursive calls - stackoverflows + + + + + Gets a value indicating whether internal log includes Trace messages. + + + + + Gets a value indicating whether internal log includes Debug messages. + + + + + Gets a value indicating whether internal log includes Info messages. + + + + + Gets a value indicating whether internal log includes Warn messages. + + + + + Gets a value indicating whether internal log includes Error messages. + + + + + Gets a value indicating whether internal log includes Fatal messages. + + + + + Logs the specified message without an at the Trace level. + + Message which may include positional parameters. + Arguments to the message. + + + + Logs the specified message without an at the Trace level. + + Log message. + + + + Logs the specified message without an at the Trace level. + will be only called when logging is enabled for level Trace. + + Function that returns the log message. + + + + Logs the specified message with an at the Trace level. + + Exception to be logged. + Message which may include positional parameters. + Arguments to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + Message which may include positional parameters. + Argument {0} to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + The type of the second argument. + Message which may include positional parameters. + Argument {0} to the message. + Argument {1} to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + Message which may include positional parameters. + Argument {0} to the message. + Argument {1} to the message. + Argument {2} to the message. + + + + Logs the specified message with an at the Trace level. + + Exception to be logged. + Log message. + + + + Logs the specified message with an at the Trace level. + will be only called when logging is enabled for level Trace. + + Exception to be logged. + Function that returns the log message. + + + + Logs the specified message without an at the Debug level. + + Message which may include positional parameters. + Arguments to the message. + + + + Logs the specified message without an at the Debug level. + + Log message. + + + + Logs the specified message without an at the Debug level. + will be only called when logging is enabled for level Debug. + + Function that returns the log message. + + + + Logs the specified message with an at the Debug level. + + Exception to be logged. + Message which may include positional parameters. + Arguments to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + Message which may include positional parameters. + Argument {0} to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + The type of the second argument. + Message which may include positional parameters. + Argument {0} to the message. + Argument {1} to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + Message which may include positional parameters. + Argument {0} to the message. + Argument {1} to the message. + Argument {2} to the message. + + + + Logs the specified message with an at the Debug level. + + Exception to be logged. + Log message. + + + + Logs the specified message with an at the Debug level. + will be only called when logging is enabled for level Debug. + + Exception to be logged. + Function that returns the log message. + + + + Logs the specified message without an at the Info level. + + Message which may include positional parameters. + Arguments to the message. + + + + Logs the specified message without an at the Info level. + + Log message. + + + + Logs the specified message without an at the Info level. + will be only called when logging is enabled for level Info. + + Function that returns the log message. + + + + Logs the specified message with an at the Info level. + + Exception to be logged. + Message which may include positional parameters. + Arguments to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + Message which may include positional parameters. + Argument {0} to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + The type of the second argument. + Message which may include positional parameters. + Argument {0} to the message. + Argument {1} to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + Message which may include positional parameters. + Argument {0} to the message. + Argument {1} to the message. + Argument {2} to the message. + + + + Logs the specified message with an at the Info level. + + Exception to be logged. + Log message. + + + + Logs the specified message with an at the Info level. + will be only called when logging is enabled for level Info. + + Exception to be logged. + Function that returns the log message. + + + + Logs the specified message without an at the Warn level. + + Message which may include positional parameters. + Arguments to the message. + + + + Logs the specified message without an at the Warn level. + + Log message. + + + + Logs the specified message without an at the Warn level. + will be only called when logging is enabled for level Warn. + + Function that returns the log message. + + + + Logs the specified message with an at the Warn level. + + Exception to be logged. + Message which may include positional parameters. + Arguments to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + Message which may include positional parameters. + Argument {0} to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + The type of the second argument. + Message which may include positional parameters. + Argument {0} to the message. + Argument {1} to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + Message which may include positional parameters. + Argument {0} to the message. + Argument {1} to the message. + Argument {2} to the message. + + + + Logs the specified message with an at the Warn level. + + Exception to be logged. + Log message. + + + + Logs the specified message with an at the Warn level. + will be only called when logging is enabled for level Warn. + + Exception to be logged. + Function that returns the log message. + + + + Logs the specified message without an at the Error level. + + Message which may include positional parameters. + Arguments to the message. + + + + Logs the specified message without an at the Error level. + + Log message. + + + + Logs the specified message without an at the Error level. + will be only called when logging is enabled for level Error. + + Function that returns the log message. + + + + Logs the specified message with an at the Error level. + + Exception to be logged. + Message which may include positional parameters. + Arguments to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + Message which may include positional parameters. + Argument {0} to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + The type of the second argument. + Message which may include positional parameters. + Argument {0} to the message. + Argument {1} to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + Message which may include positional parameters. + Argument {0} to the message. + Argument {1} to the message. + Argument {2} to the message. + + + + Logs the specified message with an at the Error level. + + Exception to be logged. + Log message. + + + + Logs the specified message with an at the Error level. + will be only called when logging is enabled for level Error. + + Exception to be logged. + Function that returns the log message. + + + + Logs the specified message without an at the Fatal level. + + Message which may include positional parameters. + Arguments to the message. + + + + Logs the specified message without an at the Fatal level. + + Log message. + + + + Logs the specified message without an at the Fatal level. + will be only called when logging is enabled for level Fatal. + + Function that returns the log message. + + + + Logs the specified message with an at the Fatal level. + + Exception to be logged. + Message which may include positional parameters. + Arguments to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + Message which may include positional parameters. + Argument {0} to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + The type of the second argument. + Message which may include positional parameters. + Argument {0} to the message. + Argument {1} to the message. + + + + Logs the specified message without an at the Trace level. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + Message which may include positional parameters. + Argument {0} to the message. + Argument {1} to the message. + Argument {2} to the message. + + + + Logs the specified message with an at the Fatal level. + + Exception to be logged. + Log message. + + + + Logs the specified message with an at the Fatal level. + will be only called when logging is enabled for level Fatal. + + Exception to be logged. + Function that returns the log message. + + + + Initializes static members of the InternalLogger class. + + + + + Set the config of the InternalLogger with defaults and config. + + + + + Gets or sets the minimal internal log level. + + If set to , then messages of the levels , and will be written. + + + + Gets or sets a value indicating whether internal messages should be written to the console output stream. + + Your application must be a console application. + + + + Gets or sets a value indicating whether internal messages should be written to the console error stream. + + Your application must be a console application. + + + + Gets or sets a value indicating whether internal messages should be written to the .Trace + + + + + Gets or sets the file path of the internal log file. + + A value of value disables internal logging to a file. + + + + Gets or sets the text writer that will receive internal logs. + + + + + Gets or sets a value indicating whether timestamp should be included in internal log output. + + + + + Is there an thrown when writing the message? + + + + + Logs the specified message without an at the specified level. + + Log level. + Message which may include positional parameters. + Arguments to the message. + + + + Logs the specified message without an at the specified level. + + Log level. + Log message. + + + + Logs the specified message without an at the specified level. + will be only called when logging is enabled for level . + + Log level. + Function that returns the log message. + + + + Logs the specified message with an at the specified level. + will be only called when logging is enabled for level . + + Exception to be logged. + Log level. + Function that returns the log message. + + + + Logs the specified message with an at the specified level. + + Exception to be logged. + Log level. + Message which may include positional parameters. + Arguments to the message. + + + + Logs the specified message with an at the specified level. + + Exception to be logged. + Log level. + Log message. + + + + Write to internallogger. + + optional exception to be logged. + level + message + optional args for + + + + Determine if logging should be avoided because of exception type. + + The exception to check. + true if logging should be avoided; otherwise, false. + + + + Determine if logging is enabled for given LogLevel + + The for the log event. + true if logging is enabled; otherwise, false. + + + + Determine if logging is enabled. + + true if logging is enabled; otherwise, false. + + + + Write internal messages to the log file defined in . + + Message to write. + + Message will be logged only when the property is not null, otherwise the + method has no effect. + + + + + Write internal messages to the defined in . + + Message to write. + + Message will be logged only when the property is not null, otherwise the + method has no effect. + + + + + Write internal messages to the . + + Message to write. + + Message will be logged only when the property is true, otherwise the + method has no effect. + + + + + Write internal messages to the . + + Message to write. + + Message will be logged when the property is true, otherwise the + method has no effect. + + + + + Write internal messages to the . + + A message to write. + + Works when property set to true. + The is used in Debug and Release configuration. + The works only in Debug configuration and this is reason why is replaced by . + in DEBUG + + + + + Logs the assembly version and file version of the given Assembly. + + The assembly to log. + + + + A cyclic buffer of object. + + + + + Initializes a new instance of the class. + + Buffer size. + Whether buffer should grow as it becomes full. + The maximum number of items that the buffer can grow to. + + + + Gets the capacity of the buffer + + + + + Gets the number of items in the buffer + + + + + Adds the specified log event to the buffer. + + Log event. + The number of items in the buffer. + + + + Gets the array of events accumulated in the buffer and clears the buffer as one atomic operation. + + Events in the buffer. + + + + Condition and expression. + + + + + Initializes a new instance of the class. + + Left hand side of the AND expression. + Right hand side of the AND expression. + + + + Gets the left hand side of the AND expression. + + + + + Gets the right hand side of the AND expression. + + + + + Returns a string representation of this expression. + + A concatenated '(Left) and (Right)' string. + + + + Evaluates the expression by evaluating and recursively. + + Evaluation context. + The value of the conjunction operator. + + + + Exception during evaluation of condition expression. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + The inner exception. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + The parameter is null. + + + The class name is null or is zero (0). + + + + + Base class for representing nodes in condition expression trees. + + + + + Converts condition text to a condition expression tree. + + Condition text to be converted. + Condition expression tree. + + + + Evaluates the expression. + + Evaluation context. + Expression result. + + + + Returns a string representation of the expression. + + + A that represents the condition expression. + + + + + Evaluates the expression. + + Evaluation context. + Expression result. + + + + Condition layout expression (represented by a string literal + with embedded ${}). + + + + + Initializes a new instance of the class. + + The layout. + + + + Gets the layout. + + The layout. + + + + Returns a string representation of this expression. + + String literal in single quotes. + + + + Evaluates the expression by calculating the value + of the layout in the specified evaluation context. + + Evaluation context. + The value of the layout. + + + + Condition level expression (represented by the level keyword). + + + + + Returns a string representation of the expression. + + The 'level' string. + + + + Evaluates to the current log level. + + Evaluation context. Ignored. + The object representing current log level. + + + + Condition literal expression (numeric, LogLevel.XXX, true or false). + + + + + Initializes a new instance of the class. + + Literal value. + + + + Gets the literal value. + + The literal value. + + + + Returns a string representation of the expression. + + The literal value. + + + + Evaluates the expression. + + Evaluation context. + The literal value as passed in the constructor. + + + + Condition logger name expression (represented by the logger keyword). + + + + + Returns a string representation of this expression. + + A logger string. + + + + Evaluates to the logger name. + + Evaluation context. + The logger name. + + + + Condition message expression (represented by the message keyword). + + + + + Returns a string representation of this expression. + + The 'message' string. + + + + Evaluates to the logger message. + + Evaluation context. + The logger message. + + + + Marks class as a log event Condition and assigns a name to it. + + + + + Initializes a new instance of the class. + + Condition method name. + + + + Condition method invocation expression (represented by method(p1,p2,p3) syntax). + + + + + Initializes a new instance of the class. + + Name of the condition method. + of the condition method. + The method parameters. + + + + Gets the method info. + + + + + Gets the method parameters. + + The method parameters. + + + + Returns a string representation of the expression. + + + A that represents the condition expression. + + + + + Evaluates the expression. + + Evaluation context. + Expression result. + + + + A bunch of utility methods (mostly predicates) which can be used in + condition expressions. Partially inspired by XPath 1.0. + + + + + Compares two values for equality. + + The first value. + The second value. + true when two objects are equal, false otherwise. + + + + Compares two strings for equality. + + The first string. + The second string. + Optional. If true, case is ignored; if false (default), case is significant. + true when two strings are equal, false otherwise. + + + + Gets or sets a value indicating whether the second string is a substring of the first one. + + The first string. + The second string. + Optional. If true (default), case is ignored; if false, case is significant. + true when the second string is a substring of the first string, false otherwise. + + + + Gets or sets a value indicating whether the second string is a prefix of the first one. + + The first string. + The second string. + Optional. If true (default), case is ignored; if false, case is significant. + true when the second string is a prefix of the first string, false otherwise. + + + + Gets or sets a value indicating whether the second string is a suffix of the first one. + + The first string. + The second string. + Optional. If true (default), case is ignored; if false, case is significant. + true when the second string is a prefix of the first string, false otherwise. + + + + Returns the length of a string. + + A string whose lengths is to be evaluated. + The length of the string. + + + + Indicates whether the specified regular expression finds a match in the specified input string. + + The string to search for a match. + The regular expression pattern to match. + A string consisting of the desired options for the test. The possible values are those of the separated by commas. + true if the regular expression finds a match; otherwise, false. + + + + + + + + + + + Marks the class as containing condition methods. + + + + + Condition not expression. + + + + + Initializes a new instance of the class. + + The expression. + + + + Gets the expression to be negated. + + The expression. + + + + Returns a string representation of the expression. + + + A that represents the condition expression. + + + + + Evaluates the expression. + + Evaluation context. + Expression result. + + + + Condition or expression. + + + + + Initializes a new instance of the class. + + Left hand side of the OR expression. + Right hand side of the OR expression. + + + + Gets the left expression. + + The left expression. + + + + Gets the right expression. + + The right expression. + + + + Returns a string representation of the expression. + + + A that represents the condition expression. + + + + + Evaluates the expression by evaluating and recursively. + + Evaluation context. + The value of the alternative operator. + + + + Exception during parsing of condition expression. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + The inner exception. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + The parameter is null. + + + The class name is null or is zero (0). + + + + + Condition parser. Turns a string representation of condition expression + into an expression tree. + + + + + Initializes a new instance of the class. + + The string reader. + Instance of used to resolve references to condition methods and layout renderers. + + + + Parses the specified condition string and turns it into + tree. + + The expression to be parsed. + The root of the expression syntax tree which can be used to get the value of the condition in a specified context. + + + + Parses the specified condition string and turns it into + tree. + + The expression to be parsed. + Instance of used to resolve references to condition methods and layout renderers. + The root of the expression syntax tree which can be used to get the value of the condition in a specified context. + + + + Parses the specified condition string and turns it into + tree. + + The string reader. + Instance of used to resolve references to condition methods and layout renderers. + + The root of the expression syntax tree which can be used to get the value of the condition in a specified context. + + + + + Try stringed keyword to + + + + success? + + + + Parse number + + negative number? minus should be parsed first. + + + + + Condition relational (==, !=, <, <=, + > or >=) expression. + + + + + Initializes a new instance of the class. + + The left expression. + The right expression. + The relational operator. + + + + Gets the left expression. + + The left expression. + + + + Gets the right expression. + + The right expression. + + + + Gets the relational operator. + + The operator. + + + + Returns a string representation of the expression. + + + A that represents the condition expression. + + + + + Evaluates the expression. + + Evaluation context. + Expression result. + + + + Compares the specified values using specified relational operator. + + The first value. + The second value. + The relational operator. + Result of the given relational operator. + + + + Promote values to the type needed for the comparision, e.g. parse a string to int. + + + + + + + Promotes to type + + + + success? + + + + Try to promote both values. First try to promote to , + when failed, try to . + + + + + + Get the order for the type for comparision. + + + index, 0 to maxint. Lower is first + + + + Dictionary from type to index. Lower index should be tested first. + + + + + Build the dictionary needed for the order of the types. + + + + + + Get the string representing the current + + + + + + Relational operators used in conditions. + + + + + Equality (==). + + + + + Inequality (!=). + + + + + Less than (<). + + + + + Greater than (>). + + + + + Less than or equal (<=). + + + + + Greater than or equal (>=). + + + + + Hand-written tokenizer for conditions. + + + + + Initializes a new instance of the class. + + The string reader. + + + + Gets the type of the token. + + The type of the token. + + + + Gets the token value. + + The token value. + + + + Gets the value of a string token. + + The string token value. + + + + Asserts current token type and advances to the next token. + + Expected token type. + If token type doesn't match, an exception is thrown. + + + + Asserts that current token is a keyword and returns its value and advances to the next token. + + Keyword value. + + + + Gets or sets a value indicating whether current keyword is equal to the specified value. + + The keyword. + + A value of true if current keyword is equal to the specified value; otherwise, false. + + + + + Gets or sets a value indicating whether the tokenizer has reached the end of the token stream. + + + A value of true if the tokenizer has reached the end of the token stream; otherwise, false. + + + + + Gets or sets a value indicating whether current token is a number. + + + A value of true if current token is a number; otherwise, false. + + + + + Gets or sets a value indicating whether the specified token is of specified type. + + The token type. + + A value of true if current token is of specified type; otherwise, false. + + + + + Gets the next token and sets and properties. + + + + + Try the comparison tokens (greater, smaller, greater-equals, smaller-equals) + + current char + is match + + + + Try the logical tokens (and, or, not, equals) + + current char + is match + + + + Mapping between characters and token types for punctuations. + + + + + Initializes a new instance of the CharToTokenType struct. + + The character. + Type of the token. + + + + Token types for condition expressions. + + + + + Marks the class or a member as advanced. Advanced classes and members are hidden by + default in generated documentation. + + + + + Initializes a new instance of the class. + + + + + Identifies that the output of layout or layout render does not change for the lifetime of the current appdomain. + + + A layout(renderer) could be converted to a literal when: + - The layout and all layout properies are SimpleLayout or [AppDomainFixedOutput] + + Recommendation: Apply this attribute to a layout or layout-renderer which have the result only changes by properties of type Layout. + + + + + Used to mark configurable parameters which are arrays. + Specifies the mapping between XML elements and .NET types. + + + + + Initializes a new instance of the class. + + The type of the array item. + The XML element name that represents the item. + + + + Gets the .NET type of the array item. + + + + + Gets the XML element name. + + + + + An assembly is trying to load. + + + + + New event args + + + + + + The assembly that is trying to load. + + + + + NLog configuration section handler class for configuring NLog from App.config. + + + + + Creates a configuration section handler. + + Parent object. + Configuration context object. + Section XML node. + The created section handler object. + + + + Constructs a new instance the configuration item (target, layout, layout renderer, etc.) given its type. + + Type of the item. + Created object of the specified type. + + + + Provides registration information for named items (targets, layouts, layout renderers, etc.) managed by NLog. + + Everything of an assembly could be loaded by + + + + + Called before the assembly will be loaded. + + + + + Initializes a new instance of the class. + + The assemblies to scan for named items. + + + + Gets or sets default singleton instance of . + + + This property implements lazy instantiation so that the is not built before + the internal logger is configured. + + + + + Gets or sets the creator delegate used to instantiate configuration objects. + + + By overriding this property, one can enable dependency injection or interception for created objects. + + + + + Gets the factory. + + The target factory. + + + + Gets the factory. + + The filter factory. + + + + gets the factory + + not using due to backwardscomp. + + + + + Gets the factory. + + The layout renderer factory. + + + + Gets the factory. + + The layout factory. + + + + Gets the ambient property factory. + + The ambient property factory. + + + + Legacy interface, no longer used by the NLog engine + + + + + Gets or sets the JSON serializer to use with or + + + + + Gets or sets the string serializer to use with + + + + + Gets or sets the parameter converter to use with , or + + + + + Perform message template parsing and formatting of LogEvent messages (True = Always, False = Never, Null = Auto Detect) + + + - Null (Auto Detect) : NLog-parser checks for positional parameters, and will then fallback to string.Format-rendering. + - True: Always performs the parsing of and rendering of using the NLog-parser (Allows custom formatting with ) + - False: Always performs parsing and rendering using string.Format (Fastest if not using structured logging) + + + + + Gets the time source factory. + + The time source factory. + + + + Gets the condition method factory. + + The condition method factory. + + + + Registers named items from the assembly. + + The assembly. + + + + Registers named items from the assembly. + + The assembly. + Item name prefix. + + + + Call Preload for NLogPackageLoader + + + Every package could implement a class "NLogPackageLoader" (namespace not important) with the public static method "Preload" (no arguments) + This method will be called just before registering all items in the assembly. + + + + + + Call the Preload method for . The Preload method must be static. + + + + + + Clears the contents of all factories. + + + + + Registers the type. + + The type to register. + The item name prefix. + + + + Builds the default configuration item factory. + + Default factory. + + + + Registers items in NLog.Extended.dll using late-bound types, so that we don't need a reference to NLog.Extended.dll. + + + + + Attribute used to mark the default parameters for layout renderers. + + + + + Initializes a new instance of the class. + + + + + Dynamic filtering with a positive list of enabled levels + + + + + Dynamic filtering with a minlevel and maxlevel range + + + + + Format of the exception output to the specific target. + + + + + Appends the Message of an Exception to the specified target. + + + + + Appends the type of an Exception to the specified target. + + + + + Appends the short type of an Exception to the specified target. + + + + + Appends the result of calling ToString() on an Exception to the specified target. + + + + + Appends the method name from Exception's stack trace to the specified target. + + + + + Appends the stack trace from an Exception to the specified target. + + + + + Appends the contents of an Exception's Data property to the specified target. + + + + + Destructure the exception (usually into JSON) + + + + + Appends the from the application or the object that caused the error. + + + + + Factory for class-based items. + + The base type of each item. + The type of the attribute used to annotate items. + + + + Scans the assembly. + + The types to scan. + The prefix. + + + + Registers the type. + + The type to register. + The item name prefix. + + + + Registers the item based on a type name. + + Name of the item. + Name of the type. + + + + Clears the contents of the factory. + + + + + Registers a single type definition. + + The item name. + The type of the item. + + + + Tries to get registered item definition. + + Name of the item. + Reference to a variable which will store the item definition. + Item definition. + + + + Tries to create an item instance. + + Name of the item. + The result. + True if instance was created successfully, false otherwise. + + + + Creates an item instance. + + The name of the item. + Created item. + + + + Factory specialized for s. + + + + + Clear all func layouts + + + + + Register a layout renderer with a callback function. + + Name of the layoutrenderer, without ${}. + the renderer that renders the value. + + + + Tries to create an item instance. + + Name of the item. + The result. + True if instance was created successfully, false otherwise. + + + + Provides means to populate factories of named items (such as targets, layouts, layout renderers, etc.). + + + + + Implemented by objects which support installation and uninstallation. + + + + + Performs installation which requires administrative permissions. + + The installation context. + + + + Performs uninstallation which requires administrative permissions. + + The installation context. + + + + Determines whether the item is installed. + + The installation context. + + Value indicating whether the item is installed or null if it is not possible to determine. + + + + + Interface for accessing configuration details + + + + + Name of the config section + + + + + Configuration Key/Value Pairs + + + + + Child config sections + + + + + Interface for loading NLog + + + + + Finds and loads the NLog configuration + + LogFactory that owns the NLog configuration + NLog configuration (or null if none found) + + + + Notifies when LoggingConfiguration has been successfully applied + + LogFactory that owns the NLog configuration + NLog Config + + + + Get file paths (including filename) for the possible NLog config files. + + The filepaths to the possible config file + + + + Level enabled flags for each LogLevel ordinal + + + + + Converts the filter into a simple + + + + + Represents a factory of named items (such as targets, layouts, layout renderers, etc.). + + Base type for each item instance. + Item definition type (typically or ). + + + + Registers new item definition. + + Name of the item. + Item definition. + + + + Tries to get registered item definition. + + Name of the item. + Reference to a variable which will store the item definition. + Item definition. + + + + Creates item instance. + + Name of the item. + Newly created item instance. + + + + Tries to create an item instance. + + Name of the item. + The result. + True if instance was created successfully, false otherwise. + + + + Provides context for install/uninstall operations. + + + + + Mapping between log levels and console output colors. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The log output. + + + + Gets or sets the installation log level. + + + + + Gets or sets a value indicating whether to ignore failures during installation. + + + + + Whether installation exceptions should be rethrown. If IgnoreFailures is set to true, + this property has no effect (there are no exceptions to rethrow). + + + + + Gets the installation parameters. + + + + + Gets or sets the log output. + + + + + Logs the specified trace message. + + The message. + The arguments. + + + + Logs the specified debug message. + + The message. + The arguments. + + + + Logs the specified informational message. + + The message. + The arguments. + + + + Logs the specified warning message. + + The message. + The arguments. + + + + Logs the specified error message. + + The message. + The arguments. + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Creates the log event which can be used to render layouts during installation/uninstallations. + + Log event info object. + + + + Convert object-value into specified type + + + + + Parses the input value and converts into the wanted type + + Input Value + Wanted Type + Format to use when parsing + Culture to use when parsing + Output value with wanted type + + + + Encapsulates and the logic to match the actual logger name + All subclasses defines immutable objects. + Concrete subclasses defines various matching rules through + + + + + Creates a concrete based on . + + + Rules used to select the concrete implementation returned: + + if is null => returns (never matches) + if doesn't contains any '*' nor '?' => returns (matches only on case sensitive equals) + if == '*' => returns (always matches) + if doesn't contain '?' + + if contains exactly 2 '*' one at the beginning and one at the end (i.e. "*foobar*) => returns + if contains exactly 1 '*' at the beginning (i.e. "*foobar") => returns + if contains exactly 1 '*' at the end (i.e. "foobar*") => returns + + + returns + + + + It may include one or more '*' or '?' wildcards at any position. + + '*' means zero or more occurrecnces of any character + '?' means exactly one occurrence of any character + + + A concrete + + + + Returns the argument passed to + + + + + Checks whether given name matches the logger name pattern. + + String to be matched. + A value of when the name matches, otherwise. + + + + Defines a that never matches. + Used when pattern is null + + + + + Defines a that always matches. + Used when pattern is '*' + + + + + Defines a that matches with a case-sensitive Equals + Used when pattern is a string without wildcards '?' '*' + + + + + Defines a that matches with a case-sensitive StartsWith + Used when pattern is a string like "*foobar" + + + + + Defines a that matches with a case-sensitive EndsWith + Used when pattern is a string like "foobar*" + + + + + Defines a that matches with a case-sensitive Contains + Used when pattern is a string like "*foobar*" + + + + + Defines a that matches with a complex wildcards combinations: + + '*' means zero or more occurrences of any character + '?' means exactly one occurrence of any character + + used when pattern is a string containing any number of '?' or '*' in any position + i.e. "*Server[*].Connection[?]" + + + + + Keeps logging configuration and provides simple API to modify it. + + This class is thread-safe..ToList() is used for that purpose. + + + + Variables defined in xml or in API. name is case case insensitive. + + + + + Gets the factory that will be configured + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Use the old exception log handling of NLog 3.0? + + This method was marked as obsolete on NLog 4.1 and it may be removed in a future release. + + + + Gets the variables defined in the configuration. + + + + + Gets a collection of named targets specified in the configuration. + + + A list of named targets. + + + Unnamed targets (such as those wrapped by other targets) are not returned. + + + + + Gets the collection of file names which should be watched for changes by NLog. + + + + + Gets the collection of logging rules. + + + + + Gets or sets the default culture info to use as . + + + Specific culture info or null to use + + + + + Gets all targets. + + + + + Compare objects based on their name. + + This property is use to cache the comparer object. + + + + Defines methods to support the comparison of objects for equality based on their name. + + + + + Registers the specified target object. The name of the target is read from . + + + The target object with a non + + when is + + + + Registers the specified target object under a given name. + + Name of the target. + The target object. + when is + when is + + + + Finds the target with the specified name. + + + The name of the target to be found. + + + Found target or when the target is not found. + + + + + Finds the target with the specified name and specified type. + + + The name of the target to be found. + + Type of the target + + Found target or when the target is not found of not of type + + + + + Add a rule with min- and maxLevel. + + Minimum log level needed to trigger this rule. + Maximum log level needed to trigger this rule. + Name of the target to be written when the rule matches. + Logger name pattern. It may include the '*' wildcard at the beginning, at the end or at both ends. + + + + Add a rule with min- and maxLevel. + + Minimum log level needed to trigger this rule. + Maximum log level needed to trigger this rule. + Target to be written to when the rule matches. + Logger name pattern. It may include the '*' wildcard at the beginning, at the end or at both ends. + + + + Add a rule with min- and maxLevel. + + Minimum log level needed to trigger this rule. + Maximum log level needed to trigger this rule. + Target to be written to when the rule matches. + Logger name pattern. It may include the '*' wildcard at the beginning, at the end or at both ends. + Gets or sets a value indicating whether to quit processing any further rule when this one matches. + + + + Add a rule for one loglevel. + + log level needed to trigger this rule. + Name of the target to be written when the rule matches. + Logger name pattern. It may include the '*' wildcard at the beginning, at the end or at both ends. + + + + Add a rule for one loglevel. + + log level needed to trigger this rule. + Target to be written to when the rule matches. + Logger name pattern. It may include the '*' wildcard at the beginning, at the end or at both ends. + + + + Add a rule for one loglevel. + + log level needed to trigger this rule. + Target to be written to when the rule matches. + Logger name pattern. It may include the '*' wildcard at the beginning, at the end or at both ends. + Gets or sets a value indicating whether to quit processing any further rule when this one matches. + + + + Add a rule for all loglevels. + + Name of the target to be written when the rule matches. + Logger name pattern. It may include the '*' wildcard at the beginning, at the end or at both ends. + + + + Add a rule for all loglevels. + + Target to be written to when the rule matches. + Logger name pattern. It may include the '*' wildcard at the beginning, at the end or at both ends. + + + + Add a rule for all loglevels. + + Target to be written to when the rule matches. + Logger name pattern. It may include the '*' wildcard at the beginning, at the end or at both ends. + Gets or sets a value indicating whether to quit processing any further rule when this one matches. + + + + Finds the logging rule with the specified name. + + The name of the logging rule to be found. + Found logging rule or when not found. + + + + Removes the specified named logging rule. + + The name of the logging rule to be removed. + Found one or more logging rule to remove, or when not found. + + + + Called by LogManager when one of the log configuration files changes. + + + A new instance of that represents the updated configuration. + + + + + Removes the specified named target. + + Name of the target. + + + + Installs target-specific objects on current system. + + The installation context. + + Installation typically runs with administrative permissions. + + + + + Uninstalls target-specific objects from current system. + + The installation context. + + Uninstallation typically runs with administrative permissions. + + + + + Closes all targets and releases any unmanaged resources. + + + + + Log to the internal (NLog) logger the information about the and associated with this instance. + + + The information are only recorded in the internal logger if Debug level is enabled, otherwise nothing is + recorded. + + + + + Flushes any pending log messages on all appenders. + + The asynchronous continuation. + + + + Validates the configuration. + + + + + Copies all variables from provided dictionary into current configuration variables. + + Master variables dictionary + + + + Replace a simple variable with a value. The orginal value is removed and thus we cannot redo this in a later stage. + + + + + + + Checks whether unused targets exist. If found any, just write an internal log at Warn level. + If initializing not started or failed, then checking process will be canceled + + + + + Arguments for events. + + + + + Initializes a new instance of the class. + + The new configuration. + The old configuration. + + + + Gets the old configuration. + + The old configuration. + + + + Gets the new configuration. + + The new configuration. + + + + Gets the new configuration + + The new configuration. + + + + Gets the old configuration + + The old configuration. + + + + Enables loading of NLog configuration from a file + + + + + + + + Get default file paths (including filename) for possible NLog config files. + + + + + Get default file paths (including filename) for possible NLog config files. + + + + + Loads NLog configuration from + + + + + Constructor + + + + + + Loads NLog configuration from provided config section + + + + + + + Builds list with unique keys, using last value of duplicates. High priority keys placed first. + + + + + + + Parse loglevel, but don't throw if exception throwing is disabled + + Name of attribute for logging. + Value of parse. + Used if there is an exception + + + + + Parses a single config section within the NLog-config + + + Section was recognized + + + + Parse {Rules} xml element + + + Rules are added to this parameter. + + + + Parse {Logger} xml element + + + + + + Parse boolean + + Name of the property for logging. + value to parse + Default value to return if the parse failed + Boolean attribute value or default. + + + + Remove the namespace (before :) + + + x:a, will be a + + + + + + + Gets the optional boolean attribute value. + + + Name of the attribute. + Default value to return if the attribute is not found or if there is a parse error + Boolean attribute value or default. + + + + Arguments for . + + + + + Initializes a new instance of the class. + + Whether configuration reload has succeeded. + + + + Initializes a new instance of the class. + + Whether configuration reload has succeeded. + The exception during configuration reload. + + + + Gets a value indicating whether configuration reload has succeeded. + + A value of true if succeeded; otherwise, false. + + + + Gets the exception which occurred during configuration reload. + + The exception. + + + + Enables FileWatcher for the currently loaded NLog Configuration File, + and supports automatic reload on file modification. + + + + + Represents a logging rule. An equivalent of <logger /> configuration element. + + + + + Create an empty . + + + + + Create an empty . + + + + + Create a new with a and which writes to . + + Logger name pattern used for . It may include one or more '*' or '?' wildcards at any position. + Minimum log level needed to trigger this rule. + Maximum log level needed to trigger this rule. + Target to be written to when the rule matches. + + + + Create a new with a which writes to . + + Logger name pattern used for . It may include one or more '*' or '?' wildcards at any position. + Minimum log level needed to trigger this rule. + Target to be written to when the rule matches. + + + + Create a (disabled) . You should call or see cref="EnableLoggingForLevels"/> to enable logging. + + Logger name pattern used for . It may include one or more '*' or '?' wildcards at any position. + Target to be written to when the rule matches. + + + + Rule identifier to allow rule lookup + + + + + Gets a collection of targets that should be written to when this rule matches. + + + + + Gets a collection of child rules to be evaluated when this rule matches. + + + + + Gets a collection of filters to be checked before writing to targets. + + + + + Gets or sets a value indicating whether to quit processing any further rule when this one matches. + + + + + Gets or sets logger name pattern. + + + Logger name pattern used by to check if a logger name matches this rule. + It may include one or more '*' or '?' wildcards at any position. + + '*' means zero or more occurrecnces of any character + '?' means exactly one occurrence of any character + + + + + + Gets the collection of log levels enabled by this rule. + + + + + Default action if none of the filters match + + + + + Enables logging for a particular level. + + Level to be enabled. + + + + Enables logging for a particular levels between (included) and . + + Minimum log level needed to trigger this rule. + Maximum log level needed to trigger this rule. + + + + Disables logging for a particular level. + + Level to be disabled. + + + + Disables logging for particular levels between (included) and . + + Minimum log level to be disables. + Maximum log level to de disabled. + + + + Enables logging the levels between (included) and . All the other levels will be disabled. + + >Minimum log level needed to trigger this rule. + Maximum log level needed to trigger this rule. + + + + Returns a string representation of . Used for debugging. + + + A that represents the current . + + + + + Checks whether te particular log level is enabled for this rule. + + Level to be checked. + A value of when the log level is enabled, otherwise. + + + + Checks whether given name matches the . + + String to be matched. + A value of when the name matches, otherwise. + + + + Default filtering with static level config + + + + + Factory for locating methods. + + The type of the class marker attribute. + The type of the method marker attribute. + + + + Gets a collection of all registered items in the factory. + + + Sequence of key/value pairs where each key represents the name + of the item and value is the of + the item. + + + + + Scans the assembly for classes marked with + and methods marked with and adds them + to the factory. + + The types to scan. + The prefix to use for names. + + + + Registers the type. + + The type to register. + The item name prefix. + + + + Clears contents of the factory. + + + + + Registers the definition of a single method. + + The method name. + The method info. + + + + Tries to retrieve method by name. + + The method name. + The result. + A value of true if the method was found, false otherwise. + + + + Retrieves method by name. + + Method name. + MethodInfo object. + + + + Tries to get method definition. + + The method name. + The result. + A value of true if the method was found, false otherwise. + + + + Marks the layout or layout renderer depends on mutable objects from the LogEvent + + This can be or + + + + + Attaches a simple name to an item (such as , + , , etc.). + + + + + Initializes a new instance of the class. + + The name of the item. + + + + Gets the name of the item. + + The name of the item. + + + + Indicates NLog should not scan this property during configuration. + + + + + Initializes a new instance of the class. + + + + + Marks the object as configuration item for NLog. + + + + + Initializes a new instance of the class. + + + + + Represents simple XML element with case-insensitive attribute semantics. + + + + + Initializes a new instance of the class. + + The input URI. + + + + Initializes a new instance of the class. + + The reader to initialize element from. + + + + Prevents a default instance of the class from being created. + + + + + Gets the element name. + + + + + Gets the dictionary of attribute values. + + + + + Gets the collection of child elements. + + + + + Gets the value of the element. + + + + + Last error occured during configuration read + + + + + Returns children elements with the specified element name. + + Name of the element. + Children elements with the specified element name. + + + + Asserts that the name of the element is among specified element names. + + The allowed names. + + + + Returns all parsing errors from current and all child elements. + + + + + Special attribute we could ignore + + + + + Default implementation of + + + + + + + + Attribute used to mark the required parameters for targets, + layout targets and filters. + + + + + Provides simple programmatic configuration API used for trivial logging cases. + + Warning, these methods will overwrite the current config. + + + + + Configures NLog for console logging so that all messages above and including + the level are output to the console. + + + + + Configures NLog for console logging so that all messages above and including + the specified level are output to the console. + + The minimal logging level. + + + + Configures NLog for to log to the specified target so that all messages + above and including the level are output. + + The target to log all messages to. + + + + Configures NLog for to log to the specified target so that all messages + above and including the specified level are output. + + The target to log all messages to. + The minimal logging level. + + + + Configures NLog for file logging so that all messages above and including + the level are written to the specified file. + + Log file name. + + + + Configures NLog for file logging so that all messages above and including + the specified level are written to the specified file. + + Log file name. + The minimal logging level. + + + + Value indicating how stack trace should be captured when processing the log event. + + + + + Stack trace should not be captured. + + + + + Stack trace should be captured without source-level information. + + + + + Stack trace should be captured including source-level information such as line numbers. + + + + + Capture maximum amount of the stack trace information supported on the platform. + + + + + Marks the layout or layout renderer as thread independent - it producing correct results + regardless of the thread it's running on. + + Without this attribute everything is rendered on the main thread. + + + If this attribute is set on a layout, it could be rendered on the another thread. + This could be more efficient as it's skipped when not needed. + + If context like HttpContext.Current is needed, which is only available on the main thread, this attribute should not be applied. + + See the AsyncTargetWrapper and BufferTargetWrapper with the , using + + Apply this attribute when: + - The result can we rendered in another thread. Delaying this could be more efficient. And/Or, + - The result should not be precalculated, for example the target sends some extra context information. + + + + + Marks the layout or layout renderer as thread safe - it producing correct results + regardless of the number of threads it's running on. + + Without this attribute then the target concurrency will be reduced + + + + + A class for configuring NLog through an XML configuration file + (App.config style or App.nlog style). + + Parsing of the XML file is also implemented in this class. + + + - This class is thread-safe..ToList() is used for that purpose. + - Update TemplateXSD.xml for changes outside targets + + + + + Initializes a new instance of the class. + + Configuration file to be read. + + + + Initializes a new instance of the class. + + Configuration file to be read. + The to which to apply any applicable configuration values. + + + + Initializes a new instance of the class. + + Configuration file to be read. + Ignore any errors during configuration. + + + + Initializes a new instance of the class. + + Configuration file to be read. + Ignore any errors during configuration. + The to which to apply any applicable configuration values. + + + + Initializes a new instance of the class. + + XML reader to read from. + + + + Create XML reader for (xml config) file. + + filepath + reader or null if filename is empty. + + + + Initializes a new instance of the class. + + containing the configuration section. + Name of the file that contains the element (to be used as a base for including other files). null is allowed. + + + + Initializes a new instance of the class. + + containing the configuration section. + Name of the file that contains the element (to be used as a base for including other files). null is allowed. + The to which to apply any applicable configuration values. + + + + Initializes a new instance of the class. + + containing the configuration section. + Name of the file that contains the element (to be used as a base for including other files). null is allowed. + Ignore any errors during configuration. + + + + Initializes a new instance of the class. + + containing the configuration section. + Name of the file that contains the element (to be used as a base for including other files). null is allowed. + Ignore any errors during configuration. + The to which to apply any applicable configuration values. + + + + Initializes a new instance of the class. + + The XML contents. + Name of the XML file. + The to which to apply any applicable configuration values. + + + + Parse XML string as NLog configuration + + NLog configuration + + + + + Gets the default object by parsing + the application configuration file (app.exe.config). + + + + + Did the Succeeded? true= success, false= error, null = initialize not started yet. + + + + + Gets or sets a value indicating whether all of the configuration files + should be watched for changes and reloaded automatically when changed. + + + + + Gets the collection of file names which should be watched for changes by NLog. + This is the list of configuration files processed. + If the autoReload attribute is not set it returns empty collection. + + + + + Re-reads the original configuration file and returns the new object. + + The new object. + + + + Get file paths (including filename) for the possible NLog config files. + + The filepaths to the possible config file + + + + Overwrite the paths (including filename) for the possible NLog config files. + + The filepaths to the possible config file + + + + Clear the candidate file paths and return to the defaults. + + + + + Initializes the configuration. + + containing the configuration section. + Name of the file that contains the element (to be used as a base for including other files). null is allowed. + Ignore any errors during configuration. + + + + Checks whether any error during XML configuration parsing has occured. + If there are any and ThrowConfigExceptions or ThrowExceptions + setting is enabled - throws NLogConfigurationException, otherwise + just write an internal log at Warn level. + + Root NLog configuration xml element + + + + Add a file with configuration. Check if not already included. + + + + + + + Parse the root + + + path to config file. + The default value for the autoReload option. + + + + Parse {configuration} xml element. + + + path to config file. + The default value for the autoReload option. + + + + Parse {NLog} xml element. + + + path to config file. + The default value for the autoReload option. + + + + Parses a single config section within the NLog-config + + + Section was recognized + + + + Include (multiple) files by filemask, e.g. *.nlog + + base directory in case if is relative + relative or absolute fileMask + + + + + Matches when the specified condition is met. + + + Conditions are expressed using a simple language + described here. + + + + + Gets or sets the condition expression. + + + + + + Checks whether log event should be logged or not. + + Log event. + + - if the log event should be ignored
+ - if the filter doesn't want to decide
+ - if the log event should be logged
+ .
+
+ + + An abstract filter class. Provides a way to eliminate log messages + based on properties other than logger name and log level. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the action to be taken when filter matches. + + + + + + Gets the result of evaluating filter against given log event. + + The log event. + Filter result. + + + + Checks whether log event should be logged or not. + + Log event. + + - if the log event should be ignored
+ - if the filter doesn't want to decide
+ - if the log event should be logged
+ .
+
+ + + Marks class as a layout renderer and assigns a name to it. + + + + + Initializes a new instance of the class. + + Name of the filter. + + + + Filter result. + + + + + The filter doesn't want to decide whether to log or discard the message. + + + + + The message should be logged. + + + + + The message should not be logged. + + + + + The message should be logged and processing should be finished. + + + + + The message should not be logged and processing should be finished. + + + + + A base class for filters that are based on comparing a value to a layout. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the layout to be used to filter log messages. + + The layout. + + + + + Matches when the calculated layout contains the specified substring. + This filter is deprecated in favor of <when /> which is based on conditions. + + + + + Gets or sets a value indicating whether to ignore case when comparing strings. + + + + + + Gets or sets the substring to be matched. + + + + + + Checks whether log event should be logged or not. + + Log event. + + - if the log event should be ignored
+ - if the filter doesn't want to decide
+ - if the log event should be logged
+ .
+
+ + + Matches when the calculated layout is equal to the specified substring. + This filter is deprecated in favor of <when /> which is based on conditions. + + + + + Gets or sets a value indicating whether to ignore case when comparing strings. + + + + + + Gets or sets a string to compare the layout to. + + + + + + Checks whether log event should be logged or not. + + Log event. + + - if the log event should be ignored
+ - if the filter doesn't want to decide
+ - if the log event should be logged
+ .
+
+ + + Matches the provided filter-method + + + + + Initializes a new instance of the class. + + + + + + + + Matches when the calculated layout does NOT contain the specified substring. + This filter is deprecated in favor of <when /> which is based on conditions. + + + + + Gets or sets the substring to be matched. + + + + + + Gets or sets a value indicating whether to ignore case when comparing strings. + + + + + + Checks whether log event should be logged or not. + + Log event. + + - if the log event should be ignored
+ - if the filter doesn't want to decide
+ - if the log event should be logged
+ .
+
+ + + Matches when the calculated layout is NOT equal to the specified substring. + This filter is deprecated in favor of <when /> which is based on conditions. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a string to compare the layout to. + + + + + + Gets or sets a value indicating whether to ignore case when comparing strings. + + + + + + Checks whether log event should be logged or not. + + Log event. + + - if the log event should be ignored
+ - if the filter doesn't want to decide
+ - if the log event should be logged
+ .
+
+ + + Matches when the result of the calculated layout has been repeated a moment ago + + + + + How long before a filter expires, and logging is accepted again + + + + + + Max length of filter values, will truncate if above limit + + + + + + Applies the configured action to the initial logevent that starts the timeout period. + Used to configure that it should ignore all events until timeout. + + + + + + Max number of unique filter values to expect simultaneously + + + + + + Default number of unique filter values to expect, will automatically increase if needed + + + + + + Insert FilterCount value into when an event is no longer filtered + + + + + + Append FilterCount to the when an event is no longer filtered + + + + + + Reuse internal buffers, and doesn't have to constantly allocate new buffers + + + + + + Default buffer size for the internal buffers + + + + + + Can be used if has been enabled. + + + + + Initializes a new instance of the class. + + + + + Checks whether log event should be logged or not. In case the LogEvent has just been repeated. + + Log event. + + - if the log event should be ignored
+ - if the filter doesn't want to decide
+ - if the log event should be logged
+ .
+
+ + + Uses object pooling, and prunes stale filter items when the pool runs dry + + + + + Remove stale filter-value from the cache, and fill them into the pool for reuse + + + + + Renders the Log Event into a filter value, that is used for checking if just repeated + + + + + Repeated LogEvent detected. Checks if it should activate filter-action + + + + + Filter Value State (mutable) + + + + + Filter Lookup Key (immutable) + + + + + A fluent class to build log events for NLog. + + + + + Initializes a new instance of the class. + + The to send the log event. + + + + Initializes a new instance of the class. + + The to send the log event. + The for the log event. + + + + Gets the created by the builder. + + + + + Sets the information of the logging event. + + The exception information of the logging event. + current for chaining calls. + + + + Sets the level of the logging event. + + The level of the logging event. + current for chaining calls. + + + + Sets the logger name of the logging event. + + The logger name of the logging event. + current for chaining calls. + + + + Sets the log message on the logging event. + + The log message for the logging event. + current for chaining calls. + + + + Sets the log message and parameters for formatting on the logging event. + + A composite format string. + The object to format. + current for chaining calls. + + + + Sets the log message and parameters for formatting on the logging event. + + A composite format string. + The first object to format. + The second object to format. + current for chaining calls. + + + + Sets the log message and parameters for formatting on the logging event. + + A composite format string. + The first object to format. + The second object to format. + The third object to format. + current for chaining calls. + + + + Sets the log message and parameters for formatting on the logging event. + + A composite format string. + The first object to format. + The second object to format. + The third object to format. + The fourth object to format. + current for chaining calls. + + + + Sets the log message and parameters for formatting on the logging event. + + A composite format string. + An object array that contains zero or more objects to format. + current for chaining calls. + + + + Sets the log message and parameters for formatting on the logging event. + + An object that supplies culture-specific formatting information. + A composite format string. + An object array that contains zero or more objects to format. + current for chaining calls. + + + + Sets a per-event context property on the logging event. + + The name of the context property. + The value of the context property. + current for chaining calls. + + + + Sets multiple per-event context properties on the logging event. + + The properties to set. + current for chaining calls. + + + + Sets the timestamp of the logging event. + + The timestamp of the logging event. + current for chaining calls. + + + + Sets the stack trace for the event info. + + The stack trace. + Index of the first user stack frame within the stack trace. + current for chaining calls. + + + + Writes the log event to the underlying logger. + + + + + Writes the log event to the underlying logger. + + If condition is true, write log event; otherwise ignore event. + + + + Writes the log event to the underlying logger. + + If condition is true, write log event; otherwise ignore event. + + + + Extension methods for NLog . + + + + + Starts building a log event with the specified . + + The logger to write the log event to. + The log level. + current for chaining calls. + + + + Starts building a log event at the Trace level. + + The logger to write the log event to. + current for chaining calls. + + + + Starts building a log event at the Debug level. + + The logger to write the log event to. + current for chaining calls. + + + + Starts building a log event at the Info level. + + The logger to write the log event to. + current for chaining calls. + + + + Starts building a log event at the Warn level. + + The logger to write the log event to. + current for chaining calls. + + + + Starts building a log event at the Error level. + + The logger to write the log event to. + current for chaining calls. + + + + Starts building a log event at the Fatal level. + + The logger to write the log event to. + current for chaining calls. + + + + Global Diagnostics Context + + This class was marked as obsolete on NLog 2.0 and it may be removed in a future release. + + + + Sets the Global Diagnostics Context item to the specified value. + + Item name. + Item value. + + + + Gets the Global Diagnostics Context named item. + + Item name. + The value of , if defined; otherwise . + If the value isn't a already, this call locks the for reading the needed for converting to . + + + + Gets the Global Diagnostics Context item. + + Item name. + to use when converting the item's value to a string. + The value of as a string, if defined; otherwise . + If is null and the value isn't a already, this call locks the for reading the needed for converting to . + + + + Gets the Global Diagnostics Context named item. + + Item name. + The value of , if defined; otherwise null. + + + + Checks whether the specified item exists in the Global Diagnostics Context. + + Item name. + A boolean indicating whether the specified item exists in current thread GDC. + + + + Removes the specified item from the Global Diagnostics Context. + + Item name. + + + + Clears the content of the GDC. + + + + + Global Diagnostics Context - a dictionary structure to hold per-application-instance values. + + + + + Sets the Global Diagnostics Context item to the specified value. + + Item name. + Item value. + + + + Sets the Global Diagnostics Context item to the specified value. + + Item name. + Item value. + + + + Gets the Global Diagnostics Context named item. + + Item name. + The value of , if defined; otherwise . + If the value isn't a already, this call locks the for reading the needed for converting to . + + + + Gets the Global Diagnostics Context item. + + Item name. + to use when converting the item's value to a string. + The value of as a string, if defined; otherwise . + If is null and the value isn't a already, this call locks the for reading the needed for converting to . + + + + Gets the Global Diagnostics Context named item. + + Item name. + The item value, if defined; otherwise null. + + + + Returns all item names + + A collection of the names of all items in the Global Diagnostics Context. + + + + Checks whether the specified item exists in the Global Diagnostics Context. + + Item name. + A boolean indicating whether the specified item exists in current thread GDC. + + + + Removes the specified item from the Global Diagnostics Context. + + Item name. + + + + Clears the content of the GDC. + + + + + Include context properties + + + + + Gets or sets a value indicating whether to include contents of the dictionary. + + + + + + Gets or sets a value indicating whether to include contents of the stack. + + + + + + Gets or sets the option to include all properties from the log events + + + + + + Gets or sets a value indicating whether to include contents of the dictionary. + + + + + + Gets or sets a value indicating whether to include contents of the stack. + + + + + + Interface for serialization of object values into JSON format + + + + + Serialization of an object into JSON format. + + The object to serialize to JSON. + Output destination. + Serialize succeeded (true/false) + + + + Auto-generated Logger members for binary compatibility with NLog 1.0. + + + Provides logging interface and utility functions. + + + + + Writes the diagnostic message at the Trace level. + + A to be written. + + + + Writes the diagnostic message at the Trace level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + + + + Writes the diagnostic message at the Trace level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + + + + Writes the diagnostic message at the Trace level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + Third argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format.s + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level. + + A to be written. + + + + Writes the diagnostic message at the Debug level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + + + + Writes the diagnostic message at the Debug level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + + + + Writes the diagnostic message at the Debug level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + Third argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level. + + A to be written. + + + + Writes the diagnostic message at the Info level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + + + + Writes the diagnostic message at the Info level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + + + + Writes the diagnostic message at the Info level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + Third argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level. + + A to be written. + + + + Writes the diagnostic message at the Warn level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + + + + Writes the diagnostic message at the Warn level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + + + + Writes the diagnostic message at the Warn level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + Third argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level. + + A to be written. + + + + Writes the diagnostic message at the Error level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + + + + Writes the diagnostic message at the Error level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + + + + Writes the diagnostic message at the Error level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + Third argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level. + + A to be written. + + + + Writes the diagnostic message at the Fatal level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + + + + Writes the diagnostic message at the Fatal level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + Third argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Gets a value indicating whether logging is enabled for the Trace level. + + A value of if logging is enabled for the Trace level, otherwise it returns . + + + + Gets a value indicating whether logging is enabled for the Debug level. + + A value of if logging is enabled for the Debug level, otherwise it returns . + + + + Gets a value indicating whether logging is enabled for the Info level. + + A value of if logging is enabled for the Info level, otherwise it returns . + + + + Gets a value indicating whether logging is enabled for the Warn level. + + A value of if logging is enabled for the Warn level, otherwise it returns . + + + + Gets a value indicating whether logging is enabled for the Error level. + + A value of if logging is enabled for the Error level, otherwise it returns . + + + + Gets a value indicating whether logging is enabled for the Fatal level. + + A value of if logging is enabled for the Fatal level, otherwise it returns . + + + + Writes the diagnostic message at the Trace level using the specified format provider and format parameters. + + + Writes the diagnostic message at the Trace level. + + Type of the value. + The value to be written. + + + + Writes the diagnostic message at the Trace level. + + Type of the value. + An IFormatProvider that supplies culture-specific formatting information. + The value to be written. + + + + Writes the diagnostic message at the Trace level. + + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Trace level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message and exception at the Trace level. + + A to be written. + An exception to be logged. + + + + Writes the diagnostic message and exception at the Trace level. + + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message and exception at the Trace level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message at the Trace level using the specified parameters and formatting them with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the Trace level. + + Log message. + + + + Writes the diagnostic message at the Trace level using the specified parameters. + + A containing format items. + Arguments to format. + + + + Writes the diagnostic message and exception at the Trace level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message at the Trace level using the specified parameter and formatting it with the supplied format provider. + + The type of the argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified parameter. + + The type of the argument. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Trace level using the specified parameters. + + The type of the first argument. + The type of the second argument. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Trace level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Trace level using the specified parameters. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Debug level using the specified format provider and format parameters. + + + Writes the diagnostic message at the Debug level. + + Type of the value. + The value to be written. + + + + Writes the diagnostic message at the Debug level. + + Type of the value. + An IFormatProvider that supplies culture-specific formatting information. + The value to be written. + + + + Writes the diagnostic message at the Debug level. + + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Debug level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message and exception at the Debug level. + + A to be written. + An exception to be logged. + + + + Writes the diagnostic message and exception at the Debug level. + + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message and exception at the Debug level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message at the Debug level using the specified parameters and formatting them with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the Debug level. + + Log message. + + + + Writes the diagnostic message at the Debug level using the specified parameters. + + A containing format items. + Arguments to format. + + + + Writes the diagnostic message and exception at the Debug level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message at the Debug level using the specified parameter and formatting it with the supplied format provider. + + The type of the argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified parameter. + + The type of the argument. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Debug level using the specified parameters. + + The type of the first argument. + The type of the second argument. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Debug level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Debug level using the specified parameters. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Info level using the specified format provider and format parameters. + + + Writes the diagnostic message at the Info level. + + Type of the value. + The value to be written. + + + + Writes the diagnostic message at the Info level. + + Type of the value. + An IFormatProvider that supplies culture-specific formatting information. + The value to be written. + + + + Writes the diagnostic message at the Info level. + + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Info level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message and exception at the Info level. + + A to be written. + An exception to be logged. + + + + Writes the diagnostic message and exception at the Info level. + + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message and exception at the Info level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message at the Info level using the specified parameters and formatting them with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the Info level. + + Log message. + + + + Writes the diagnostic message at the Info level using the specified parameters. + + A containing format items. + Arguments to format. + + + + Writes the diagnostic message and exception at the Info level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message at the Info level using the specified parameter and formatting it with the supplied format provider. + + The type of the argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified parameter. + + The type of the argument. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Info level using the specified parameters. + + The type of the first argument. + The type of the second argument. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Info level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Info level using the specified parameters. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Warn level using the specified format provider and format parameters. + + + Writes the diagnostic message at the Warn level. + + Type of the value. + The value to be written. + + + + Writes the diagnostic message at the Warn level. + + Type of the value. + An IFormatProvider that supplies culture-specific formatting information. + The value to be written. + + + + Writes the diagnostic message at the Warn level. + + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Warn level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message and exception at the Warn level. + + A to be written. + An exception to be logged. + + + + Writes the diagnostic message and exception at the Warn level. + + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message and exception at the Warn level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message at the Warn level using the specified parameters and formatting them with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the Warn level. + + Log message. + + + + Writes the diagnostic message at the Warn level using the specified parameters. + + A containing format items. + Arguments to format. + + + + Writes the diagnostic message and exception at the Warn level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message at the Warn level using the specified parameter and formatting it with the supplied format provider. + + The type of the argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified parameter. + + The type of the argument. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Warn level using the specified parameters. + + The type of the first argument. + The type of the second argument. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Warn level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Warn level using the specified parameters. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Error level using the specified format provider and format parameters. + + + Writes the diagnostic message at the Error level. + + Type of the value. + The value to be written. + + + + Writes the diagnostic message at the Error level. + + Type of the value. + An IFormatProvider that supplies culture-specific formatting information. + The value to be written. + + + + Writes the diagnostic message at the Error level. + + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Error level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message and exception at the Error level. + + A to be written. + An exception to be logged. + + + + Writes the diagnostic message and exception at the Error level. + + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message and exception at the Error level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message at the Error level using the specified parameters and formatting them with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the Error level. + + Log message. + + + + Writes the diagnostic message at the Error level using the specified parameters. + + A containing format items. + Arguments to format. + + + + Writes the diagnostic message and exception at the Error level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message at the Error level using the specified parameter and formatting it with the supplied format provider. + + The type of the argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified parameter. + + The type of the argument. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Error level using the specified parameters. + + The type of the first argument. + The type of the second argument. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Error level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Error level using the specified parameters. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified format provider and format parameters. + + + Writes the diagnostic message at the Fatal level. + + Type of the value. + The value to be written. + + + + Writes the diagnostic message at the Fatal level. + + Type of the value. + An IFormatProvider that supplies culture-specific formatting information. + The value to be written. + + + + Writes the diagnostic message at the Fatal level. + + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Fatal level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message and exception at the Fatal level. + + A to be written. + An exception to be logged. + + + + Writes the diagnostic message and exception at the Fatal level. + + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message and exception at the Fatal level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message at the Fatal level using the specified parameters and formatting them with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the Fatal level. + + Log message. + + + + Writes the diagnostic message at the Fatal level using the specified parameters. + + A containing format items. + Arguments to format. + + + + Writes the diagnostic message and exception at the Fatal level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message at the Fatal level using the specified parameter and formatting it with the supplied format provider. + + The type of the argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified parameter. + + The type of the argument. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified parameters. + + The type of the first argument. + The type of the second argument. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified parameters. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Auto-generated Logger members for binary compatibility with NLog 1.0. + + + Logger with only generic methods (passing 'LogLevel' to methods) and core properties. + + + + + Writes the diagnostic message at the specified level. + + The log level. + A to be written. + + + + Writes the diagnostic message at the specified level. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + + + + Writes the diagnostic message at the specified level using the specified parameters. + + The log level. + A containing format items. + First argument to format. + Second argument to format. + + + + Writes the diagnostic message at the specified level using the specified parameters. + + The log level. + A containing format items. + First argument to format. + Second argument to format. + Third argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Occurs when logger configuration changes. + + + + + Gets the name of the logger. + + + + + Gets the factory that created this logger. + + + + + Gets a value indicating whether logging is enabled for the specified level. + + Log level to be checked. + A value of if logging is enabled for the specified level, otherwise it returns . + + + + Writes the specified diagnostic message. + + Log event. + + + + Writes the specified diagnostic message. + + The name of the type that wraps Logger. + Log event. + + + + Writes the diagnostic message at the specified level using the specified format provider and format parameters. + + + Writes the diagnostic message at the specified level. + + Type of the value. + The log level. + The value to be written. + + + + Writes the diagnostic message at the specified level. + + Type of the value. + The log level. + An IFormatProvider that supplies culture-specific formatting information. + The value to be written. + + + + Writes the diagnostic message at the specified level. + + The log level. + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the specified level. + + The log level. + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message and exception at the specified level. + + The log level. + A to be written. + Arguments to format. + An exception to be logged. + + + + Writes the diagnostic message and exception at the specified level. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + Arguments to format. + An exception to be logged. + + + + Writes the diagnostic message at the specified level using the specified parameters and formatting them with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the specified level. + + The log level. + Log message. + + + + Writes the diagnostic message at the specified level using the specified parameters. + + The log level. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message and exception at the specified level. + + The log level. + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message at the specified level using the specified parameter and formatting it with the supplied format provider. + + The type of the argument. + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified parameter. + + The type of the argument. + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the specified level using the specified parameters. + + The type of the first argument. + The type of the second argument. + The log level. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the specified level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the specified level using the specified parameters. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + The log level. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Extensions for NLog . + + + + + Writes the diagnostic message and exception at the specified level. + + A logger implementation that will handle the message. + The log level. + An exception to be logged. + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Trace level. + + A logger implementation that will handle the message. + An exception to be logged. + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Debug level. + + A logger implementation that will handle the message. + An exception to be logged. + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Info level. + + A logger implementation that will handle the message. + An exception to be logged. + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Warn level. + + A logger implementation that will handle the message. + An exception to be logged. + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Error level. + + A logger implementation that will handle the message. + An exception to be logged. + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Fatal level. + + A logger implementation that will handle the message. + An exception to be logged. + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Allocates new builder and appends to the provided target builder on dispose + + + + + Access the new builder allocated + + + + + Helpers for . + + + + + Load from url + + file or path, including .dll + basepath, optional + + + + + Load from url + + name without .dll + + + + + Forward declare of system delegate type for use by other classes + + + + + Keeps track of pending operation count, and can notify when pending operation count reaches zero + + + + + Mark operation has started + + + + + Mark operation has completed + + Exception coming from the completed operation [optional] + + + + Registers an AsyncContinuation to be called when all pending operations have completed + + Invoked on completion + AsyncContinuation operation + + + + Clear o + + + + + Sets the stack trace for the event info. + + The stack trace. + Index of the first user stack frame within the stack trace. + Index of the first user stack frame within the stack trace. + + + + Sets the details retrieved from the Caller Information Attributes + + + + + + + + + Gets the stack frame of the method that did the logging. + + + + + Gets the number index of the stack frame that represents the user + code (not the NLog code). + + + + + Legacy attempt to skip async MoveNext, but caused source file line number to be lost + + + + + Gets the entire stack trace. + + + + + Memory optimized filtering + + Passing state too avoid delegate capture and memory-allocations. + + + + Internal configuration manager used to read .NET configuration files. + Just a wrapper around the BCL ConfigurationManager, but used to enable + unit testing. + + + + + Gets the wrapper around ConfigurationManager.AppSettings. + + + + + Provides untyped IDictionary interface on top of generic IDictionary. + + The type of the key. + The type of the value. + + + + Initializes a new instance of the DictionaryAdapter class. + + The implementation. + + + + Gets an object containing the values in the object. + + + + An object containing the values in the object. + + + + + Gets the number of elements contained in the . + + + + The number of elements contained in the . + + + + + Gets a value indicating whether access to the is synchronized (thread safe). + + + true if access to the is synchronized (thread safe); otherwise, false. + + + + + Gets an object that can be used to synchronize access to the . + + + + An object that can be used to synchronize access to the . + + + + + Gets a value indicating whether the object has a fixed size. + + + true if the object has a fixed size; otherwise, false. + + + + + Gets a value indicating whether the object is read-only. + + + true if the object is read-only; otherwise, false. + + + + + Gets an object containing the keys of the object. + + + + An object containing the keys of the object. + + + + + Gets or sets the with the specified key. + + Dictionary key. + Value corresponding to key or null if not found + + + + Adds an element with the provided key and value to the object. + + The to use as the key of the element to add. + The to use as the value of the element to add. + + + + Removes all elements from the object. + + + + + Determines whether the object contains an element with the specified key. + + The key to locate in the object. + + True if the contains an element with the key; otherwise, false. + + + + + Returns an object for the object. + + + An object for the object. + + + + + Removes the element with the specified key from the object. + + The key of the element to remove. + + + + Copies the elements of the to an , starting at a particular index. + + The one-dimensional that is the destination of the elements copied from . The must have zero-based indexing. + The zero-based index in at which copying begins. + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + + + + Wrapper IDictionaryEnumerator. + + + + + Initializes a new instance of the class. + + The wrapped. + + + + Gets both the key and the value of the current dictionary entry. + + + + A containing both the key and the value of the current dictionary entry. + + + + + Gets the key of the current dictionary entry. + + + + The key of the current element of the enumeration. + + + + + Gets the value of the current dictionary entry. + + + + The value of the current element of the enumeration. + + + + + Gets the current element in the collection. + + + + The current element in the collection. + + + + + Advances the enumerator to the next element of the collection. + + + True if the enumerator was successfully advanced to the next element; false if the enumerator has passed the end of the collection. + + + + + Sets the enumerator to its initial position, which is before the first element in the collection. + + + + + Ensures that IDictionary.GetEnumerator returns DictionaryEntry values + + + + + UTF-8 BOM 239, 187, 191 + + + + + Safe way to get environment variables. + + + + + Helper class for dealing with exceptions. + + + + + Mark this exception as logged to the . + + + + + + + Is this exception logged to the ? + + + trueif the has been logged to the . + + + + Determines whether the exception must be rethrown and logs the error to the if is false. + + Advised to log first the error to the before calling this method. + + The exception to check. + trueif the must be rethrown, false otherwise. + + + + Determines whether the exception must be rethrown immediately, without logging the error to the . + + Only used this method in special cases. + + The exception to check. + trueif the must be rethrown, false otherwise. + + + + Object construction helper. + + + + + Adapter for to + + + + + Initializes a new instance of the class. + + The to wrap. + + + + Creates an AppDomainWrapper for the current + + + + + Gets or sets the base directory that the assembly resolver uses to probe for assemblies. + + + + + Gets or sets the name of the configuration file for an application domain. + + + + + Gets or sets the list of directories under the application base directory that are probed for private assemblies. + + + + + Gets or set the friendly name. + + + + + Gets an integer that uniquely identifies the application domain within the process. + + + + + Gets the assemblies that have been loaded into the execution context of this application domain. + + A list of assemblies in this application domain. + + + + Process exit event. + + + + + Domain unloaded event. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Interface for fakeable the current . Not fully implemented, please methods/properties as necessary. + + + + + Gets or sets the base directory that the assembly resolver uses to probe for assemblies. + + + + + Gets or sets the name of the configuration file for an application domain. + + + + + Gets or sets the list of directories under the application base directory that are probed for private assemblies. + + + + + Gets or set the friendly name. + + + + + Gets an integer that uniquely identifies the application domain within the process. + + + + + Gets the assemblies that have been loaded into the execution context of this application domain. + + A list of assemblies in this application domain. + + + + Process exit event. + + + + + Domain unloaded event. + + + + + Abstract calls for the application environment + + + + + Abstract calls to FileSystem + + + + Determines whether the specified file exists. + The file to check. + + + Returns the content of the specified file + The file to load. + + + + Base class for optimized file appenders. + + + + + Initializes a new instance of the class. + + Name of the file. + The create parameters. + + + + Gets the path of the file, including file extension. + + The name of the file. + + + + Gets or sets the creation time for a file associated with the appender. The time returned is in Coordinated + Universal Time [UTC] standard. + + The creation time of the file. + + + + Gets or sets the creation time for a file associated with the appender. Synchronized by + The time format is based on + + + + + Gets the last time the file associated with the appender is opened. The time returned is in Coordinated + Universal Time [UTC] standard. + + The time the file was last opened. + + + + Gets the file creation parameters. + + The file creation parameters. + + + + Writes the specified bytes. + + The bytes. + + + + Flushes this instance. + + + + + Closes this instance. + + + + + Gets the creation time for a file associated with the appender. The time returned is in Coordinated Universal + Time [UTC] standard. + + The file creation time. + + + + Gets the length in bytes of the file associated with the appender. + + A long value representing the length of the file in bytes. + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Releases unmanaged and - optionally - managed resources. + + True to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Creates the file stream. + + If set to true sets the file stream to allow shared writing. + If larger than 0 then it will be used instead of the default BufferSize for the FileStream. + A object which can be used to write to the file. + + + + Base class for optimized file appenders which require the usage of a mutex. + + It is possible to use this class as replacement of BaseFileAppender and the mutex functionality + is not enforced to the implementing subclasses. + + + + + Initializes a new instance of the class. + + Name of the file. + The create parameters. + + + + Gets the mutually-exclusive lock for archiving files. + + The mutex for archiving. + + + + Releases unmanaged and - optionally - managed resources. + + True to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Creates a mutex that is sharable by more than one process. + + The prefix to use for the name of the mutex. + A object which is sharable by multiple processes. + + + + Implementation of which caches + file information. + + + + + Initializes a new instance of the class. + + Name of the file. + The parameters. + + + + Closes this instance of the appender. + + + + + Flushes this current appender. + + + + + Gets the creation time for a file associated with the appender. The time returned is in Coordinated Universal + Time [UTC] standard. + + The file creation time. + + + + Gets the length in bytes of the file associated with the appender. + + A long value representing the length of the file in bytes. + + + + Writes the specified bytes to a file. + + The bytes array. + The bytes array offset. + The number of bytes. + + + + Factory class which creates objects. + + + + + Opens the appender for given file name and parameters. + + Name of the file. + Creation parameters. + + Instance of which can be used to write to the file. + + + + + Maintains a collection of file appenders usually associated with file targets. + + + + + An "empty" instance of the class with zero size and empty list of appenders. + + + + + Initializes a new "empty" instance of the class with zero size and empty + list of appenders. + + + + + Initializes a new instance of the class. + + + The size of the list should be positive. No validations are performed during initialisation as it is an + intenal class. + + Total number of appenders allowed in list. + Factory used to create each appender. + Parameters used for creating a file. + + + + The archive file path pattern that is used to detect when archiving occurs. + + + + + Invalidates appenders for all files that were archived. + + + + + Gets the parameters which will be used for creating a file. + + + + + Gets the file appender factory used by all the appenders in this list. + + + + + Gets the number of appenders which the list can hold. + + + + + Subscribe to background monitoring of active file appenders + + + + + It allocates the first slot in the list when the file name does not already in the list and clean up any + unused slots. + + File name associated with a single appender. + The allocated appender. + + Thrown when is called on an Empty instance. + + + + + Close all the allocated appenders. + + + + + Close the allocated appenders initialized before the supplied time. + + The time which prior the appenders considered expired + + + + Fluch all the allocated appenders. + + + + + File Archive Logic uses the File-Creation-TimeStamp to detect if time to archive, and the File-LastWrite-Timestamp to name the archive-file. + + + NLog always closes all relevant appenders during archive operation, so no need to lookup file-appender + + + + + Closes the specified appender and removes it from the list. + + File name of the appender to be closed. + File Appender that matched the filePath (null if none found) + + + + Interface that provides parameters for create file function. + + + + + Gets or sets the delay in milliseconds to wait before attempting to write to the file again. + + + + + Gets or sets the number of times the write is appended on the file before NLog + discards the log message. + + + + + Gets or sets a value indicating whether concurrent writes to the log file by multiple processes on the same host. + + + This makes multi-process logging possible. NLog uses a special technique + that lets it keep the files open for writing. + + + + + Gets or sets a value indicating whether to create directories if they do not exist. + + + Setting this to false may improve performance a bit, but you'll receive an error + when attempting to write to a directory that's not present. + + + + + Gets or sets a value indicating whether to enable log file(s) to be deleted. + + + + + Gets or sets the log file buffer size in bytes. + + + + + Gets or set a value indicating whether a managed file stream is forced, instead of using the native implementation. + + + + + Gets or sets the file attributes (Windows only). + + + + + Should archive mutex be created? + + + + + Should manual simple detection of file deletion be enabled? + + + + + Interface implemented by all factories capable of creating file appenders. + + + + + Opens the appender for given file name and parameters. + + Name of the file. + Creation parameters. + Instance of which can be used to write to the file. + + + + Provides a multiprocess-safe atomic file appends while + keeping the files open. + + + On Unix you can get all the appends to be atomic, even when multiple + processes are trying to write to the same file, because setting the file + pointer to the end of the file and appending can be made one operation. + On Win32 we need to maintain some synchronization between processes + (global named mutex is used for this) + + + + + Initializes a new instance of the class. + + Name of the file. + The parameters. + + + + Writes the specified bytes. + + The bytes array. + The bytes array offset. + The number of bytes. + + + + Closes this instance. + + + + + Flushes this instance. + + + + + Gets the creation time for a file associated with the appender. The time returned is in Coordinated Universal + Time [UTC] standard. + + The file creation time. + + + + Gets the length in bytes of the file associated with the appender. + + A long value representing the length of the file in bytes. + + + + Factory class. + + + + + Opens the appender for given file name and parameters. + + Name of the file. + Creation parameters. + + Instance of which can be used to write to the file. + + + + + Appender used to discard data for the FileTarget. + Used mostly for testing entire stack except the actual writing to disk. + Throws away all data. + + + + + Factory class. + + + + + Opens the appender for given file name and parameters. + + Name of the file. + Creation parameters. + + Instance of which can be used to write to the file. + + + + + Multi-process and multi-host file appender which attempts + to get exclusive write access and retries if it's not available. + + + + + Initializes a new instance of the class. + + Name of the file. + The parameters. + + + + Writes the specified bytes. + + The bytes array. + The bytes array offset. + The number of bytes. + + + + Flushes this instance. + + + + + Closes this instance. + + + + + Gets the creation time for a file associated with the appender. The time returned is in Coordinated Universal + Time [UTC] standard. + + The file creation time. + + + + Gets the length in bytes of the file associated with the appender. + + A long value representing the length of the file in bytes. + + + + Factory class. + + + + + Opens the appender for given file name and parameters. + + Name of the file. + Creation parameters. + + Instance of which can be used to write to the file. + + + + + Optimized single-process file appender which keeps the file open for exclusive write. + + + + + Initializes a new instance of the class. + + Name of the file. + The parameters. + + + + Writes the specified bytes. + + The bytes array. + The bytes array offset. + The number of bytes. + + + + Flushes this instance. + + + + + Closes this instance. + + + + + Gets the creation time for a file associated with the appender. The time returned is in Coordinated Universal + Time [UTC] standard. + + The file creation time. + + + + Gets the length in bytes of the file associated with the appender. + + A long value representing the length of the file in bytes. + + + + Factory class. + + + + + Opens the appender for given file name and parameters. + + Name of the file. + Creation parameters. + + Instance of which can be used to write to the file. + + + + + Provides a multiprocess-safe atomic file append while + keeping the files open. + + + + + Initializes a new instance of the class. + + Name of the file. + The parameters. + + + + Creates or opens a file in a special mode, so that writes are automatically + as atomic writes at the file end. + See also "UnixMultiProcessFileAppender" which does a similar job on *nix platforms. + + File to create or open + + + + Writes the specified bytes. + + The bytes array. + The bytes array offset. + The number of bytes. + + + + Closes this instance. + + + + + Flushes this instance. + + + + + Gets the length in bytes of the file associated with the appender. + + A long value representing the length of the file in bytes. + + + + Factory class. + + + + + Opens the appender for given file name and parameters. + + Name of the file. + Creation parameters. + + Instance of which can be used to write to the file. + + + + + An immutable object that stores basic file info. + + + + + Constructs a FileCharacteristics object. + + The time the file was created in UTC. + The time the file was last written to in UTC. + The size of the file in bytes. + + + + The time the file was created in UTC. + + + + + The time the file was last written to in UTC. + + + + + The size of the file in bytes. + + + + + Optimized routines to get the basic file characteristics of the specified file. + + + + + Initializes static members of the FileCharacteristicsHelper class. + + + + + Gets the information about a file. + + Name of the file. + The file stream. + The file characteristics, if the file information was retrieved successfully, otherwise null. + + + + A layout that represents a filePath. + + + + + Cached directory separator char array to avoid memory allocation on each method call. + + + + + Cached invalid filenames char array to avoid memory allocation everytime Path.GetInvalidFileNameChars() is called. + + + + + not null when == false + + + + + non null is fixed, + + + + + is the cache-key, and when newly rendered filename matches the cache-key, + then it reuses the cleaned cache-value . + + + + + is the cache-value that is reused, when the newly rendered filename + matches the cache-key + + + + Initializes a new instance of the class. + + + + Render the raw filename from Layout + + The log event. + StringBuilder to minimize allocations [optional]. + String representation of a layout. + + + + Convert the raw filename to a correct filename + + The filename generated by Layout. + String representation of a correct filename. + + + + Is this (templated/invalid) path an absolute, relative or unknown? + + + + + Is this (templated/invalid) path an absolute, relative or unknown? + + + + + Convert object to string + + value + format for conversion. + + + If is null and isn't a already, then the will get a locked by + + + + + Interface for the wrapper around System.Configuration.ConfigurationManager. + + + + + Gets the wrapper around ConfigurationManager.AppSettings. + + + + + Format a log message + + + + + Format the message and return + + LogEvent with message to be formatted + formatted message + + + + Has the logevent properties? + + LogEvent with message to be formatted + False when logevent has no properties to be extracted + + + + Appends the logevent message to the provided StringBuilder + + LogEvent with message to be formatted + The to append the formatted message. + + + + Get the Raw, unformatted and unstrinyfied, value + + + + + Get the raw value + + + The value + RawValue supported? + + + + Interface implemented by layouts and layout renderers. + + + + + Renders the the value of layout or layout renderer in the context of the specified log event. + + The log event. + String representation of a layout. + + + + Supports mocking of SMTP Client code. + + + + + Specifies how outgoing email messages will be handled. + + + + + Gets or sets the name or IP address of the host used for SMTP transactions. + + + + + Gets or sets the port used for SMTP transactions. + + + + + Gets or sets a value that specifies the amount of time after which a synchronous Send call times out. + + + + + Gets or sets the credentials used to authenticate the sender. + + + + + Sends an e-mail message to an SMTP server for delivery. These methods block while the message is being transmitted. + + + System.Net.Mail.MailMessage + MailMessage + A MailMessage that contains the message to send. + + + + Gets or sets the folder where applications save mail messages to be processed by the local SMTP server. + + + + + Supports rendering as string value with limited or no allocations (preferred) + + + + + Renders the value of layout renderer in the context of the specified log event + + + null if not possible or unknown + + + + Supports object initialization and termination. + + + + + Initializes this instance. + + The configuration. + + + + Closes this instance. + + + + + Allows components to request stack trace information to be provided in the . + + + + + Gets the level of stack trace information required by the implementing class. + + + + + Render the event info as parse as short + + current layout + + default value when the render + layout name for log message to internal log when logging fails + + + + + Render the event info as parse as int + + current layout + + default value when the render + layout name for log message to internal log when logging fails + + + + + Render the event info as parse as bool + + current layout + + default value when the render + layout name for log message to internal log when logging fails + + + + + Logger configuration. + + + + + Initializes a new instance of the class. + + The targets by level. + Use the old exception log handling of NLog 3.0? + + + + Use the old exception log handling of NLog 3.0? + + This method was marked as obsolete before NLog 4.3.11 and it will be removed in NLog 5. + + + + Gets targets for the specified level. + + The level. + Chain of targets with attached filters. + + + + When true: Do not fallback to StringBuilder.Format for positional templates + + + + + New formatter + + When true: Do not fallback to StringBuilder.Format for positional templates + + + + + The MessageFormatter delegate + + + + + + + + Most-Recently-Used-Cache, that discards less frequently used items on overflow + + + + + Constructor + + Maximum number of items the cache will hold before discarding. + + + + Attempt to insert item into cache. + + Key of the item to be inserted in the cache. + Value of the item to be inserted in the cache. + true when the key does not already exist in the cache, false otherwise. + + + + Lookup existing item in cache. + + Key of the item to be searched in the cache. + Output value of the item found in the cache. + True when the key is found in the cache, false otherwise. + + + + Watches multiple files at the same time and raises an event whenever + a single change is detected in any of those files. + + + + + The types of changes to watch for. + + + + + Occurs when a change is detected in one of the monitored files. + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Stops watching all files. + + + + + Stops watching the specified file. + + + + + + Watches the specified files for changes. + + The file names. + + + + Supports mocking of SMTP Client code. + + + Disabled Error CS0618 'SmtpClient' is obsolete: 'SmtpClient and its network of types are poorly designed, + we strongly recommend you use https://github.com/jstedfast/MailKit and https://github.com/jstedfast/MimeKit instead' + + + + + Network sender which uses HTTP or HTTPS POST. + + + + + Initializes a new instance of the class. + + The network URL. + + + + Creates instances of objects for given URLs. + + + + + Creates a new instance of the network sender based on a network URL. + + URL that determines the network sender to be created. + The maximum queue size. + SSL protcols for TCP + KeepAliveTime for TCP + + A newly created network sender. + + + + + Interface for mocking socket calls. + + + + + A base class for all network senders. Supports one-way sending of messages + over various protocols. + + + + + Initializes a new instance of the class. + + The network URL. + + + + Gets the address of the network endpoint. + + + + + Gets the last send time. + + + + + Initializes this network sender. + + + + + Closes the sender and releases any unmanaged resources. + + The continuation. + + + + Flushes any pending messages and invokes a continuation. + + The continuation. + + + + Send the given text over the specified protocol. + + Bytes to be sent. + Offset in buffer. + Number of bytes to send. + The asynchronous continuation. + + + + Closes the sender and releases any unmanaged resources. + + + + + Performs sender-specific initialization. + + + + + Performs sender-specific close operation. + + The continuation. + + + + Performs sender-specific flush. + + The continuation. + + + + Actually sends the given text over the specified protocol. + + The bytes to be sent. + Offset in buffer. + Number of bytes to send. + The async continuation to be invoked after the buffer has been sent. + To be overridden in inheriting classes. + + + + Parses the URI into an endpoint address. + + The URI to parse. + The address family. + Parsed endpoint. + + + + Default implementation of . + + + + + + + + A base class for network senders that can block or send out-of-order + + + + + Initializes a new instance of the class. + + URL. Must start with tcp://. + + + + Actually sends the given text over the specified protocol. + + The bytes to be sent. + Offset in buffer. + Number of bytes to send. + The async continuation to be invoked after the buffer has been sent. + To be overridden in inheriting classes. + + + + Performs sender-specific flush. + + The continuation. + + + + Socket proxy for mocking Socket code. + + + + + Initializes a new instance of the class. + + The address family. + Type of the socket. + Type of the protocol. + + + + Gets underlying socket instance. + + + + + Closes the wrapped socket. + + + + + Invokes ConnectAsync method on the wrapped socket. + + The instance containing the event data. + Result of original method. + + + + Invokes SendAsync method on the wrapped socket. + + The instance containing the event data. + Result of original method. + + + + Invokes SendToAsync method on the wrapped socket. + + The instance containing the event data. + Result of original method. + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Sends messages over a TCP network connection. + + + + + Initializes a new instance of the class. + + URL. Must start with tcp://. + The address family. + + + + Creates the socket with given parameters. + + The host address. + The address family. + Type of the socket. + Type of the protocol. + Instance of which represents the socket. + + + + Performs sender-specific initialization. + + + + + Closes the socket. + + The continuation. + + + + Facilitates mocking of class. + + + + + Raises the Completed event. + + + + + Sends messages over the network as UDP datagrams. + + + + + Initializes a new instance of the class. + + URL. Must start with udp://. + The address family. + + + + Creates the socket. + + The address family. + Type of the socket. + Type of the protocol. + Implementation of to use. + + + + Performs sender-specific initialization. + + + + + Closes the socket. + + The continuation. + + + + Sends the specified text as a UDP datagram. + + The bytes to be sent. + Offset in buffer. + Number of bytes to send. + The async continuation to be invoked after the buffer has been sent. + To be overridden in inheriting classes. + + + + Scans (breadth-first) the object graph following all the edges whose are + instances have attached and returns + all objects implementing a specified interfaces. + + + + + Finds the objects which have attached which are reachable + from any of the given root objects when traversing the object graph over public properties. + + Type of the objects to return. + Also search the properties of the wanted objects. + The root objects. + Ordered list of objects implementing T. + + + ISet is not there in .net35, so using HashSet + + + + Helper for extracting propertyPath + + + + + Object Path to check + + + + + Try get value from , using , and set into + + + + + + + + Converts object into a List of property-names and -values using reflection + + + + + Scans properties for name (Skips string-compare and value-lookup until finding match) + + + + + Scans properties for name (Skips property value lookup until finding match) + + + + + Scans properties for name + + + + + Binder for retrieving value of + + + + + + + + Combine paths + + basepath, not null + optional dir + optional file + + + + + Cached directory separator char array to avoid memory allocation on each method call. + + + + + Trims directory separators from the path + + path, could be null + never null + + + + Detects the platform the NLog is running on. + + + + + Gets the current runtime OS. + + + + + Gets a value indicating whether current OS is Win32-based (desktop or mobile). + + + + + Gets a value indicating whether current OS is Unix-based. + + + + + Gets a value indicating whether current runtime is Mono-based + + + + + Gets a value indicating whether current runtime supports use of mutex + + + + + Will creating a mutex succeed runtime? + "Cached" detection + + + + + Will creating a mutex succeed runtime? + + + + + Portable implementation of . + + + + + Gets the information about a file. + + Name of the file. + The file stream. + The file characteristics, if the file information was retrieved successfully, otherwise null. + + + + Portable implementation of . + + + + + Initializes a new instance of the class. + + + + + Gets current process ID. + + + + + + Gets current process name. + + + + + + Returns details about current process and thread in a portable manner. + + + + + Gets the singleton instance of PortableThreadIDHelper or + Win32ThreadIDHelper depending on runtime environment. + + The instance. + + + + Gets current process ID. + + + + + Gets current process absolute file path. + + + + + Gets current process name (excluding filename extension, if any). + + + + + Initializes the ThreadIDHelper class. + + + + + Dictionary that combines the standard with the + MessageTemplate-properties extracted from the . + + The are returned as the first items + in the collection, and in positional order. + + + + + Value of the property + + + + + Is this a property of the message? + + + + + + + Value of the property + Is this a property of the message? + + + + The properties of the logEvent + + + + + The properties extracted from the message + + + + + Injects the list of message-template-parameter into the IDictionary-interface + + Message-template-parameters + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Check if the message-template-parameters can be used directly without allocating a dictionary + + Message-template-parameters + Are all parameter names unique (true / false) + + + + Attempt to insert the message-template-parameters into an empty dictionary + + Message-template-parameters + The initially empty dictionary + Message-template-parameters was inserted into dictionary without trouble (true/false) + + + + Attempt to override the existing dictionary values using the message-template-parameters + + Message-template-parameters + The already filled dictionary + List of unique message-template-parameters + + + + + + + + + + + + + + + + + + + + + Will always throw, as collection is readonly + + + Will always throw, as collection is readonly + + + Will always throw, as collection is readonly + + + + + + + + + + + + + + + + + + + Reflection helpers for accessing properties. + + + + + Set value parsed from string. + + object instance to set with property + name of the property on + The value to be parsed. + + + + + Is the property of array-type? + + Type which has the property + name of the property. + + + + + Get propertyinfo + + object which could have property + propertyname on + result when success. + success. + + + + Try parse of string to (Generic) list, comma separated. + + + If there is a comma in the value, then (single) quote the value. For single quotes, use the backslash as escape + + + + + + + + + Reflection helpers. + + + + + Gets all usable exported types from the given assembly. + + Assembly to scan. + Usable types from the given assembly. + Types which cannot be loaded are skipped. + + + + Is this a static class? + + + + This is a work around, as Type doesn't have this property. + From: https://stackoverflow.com/questions/1175888/determine-if-a-type-is-static + + + + + Optimized delegate for calling MethodInfo + + Object instance, use null for static methods. + Complete list of parameters that matches the method, including optional/default parameters. + + + + + Creates an optimized delegate for calling the MethodInfo using Expression-Trees + + Method to optimize + Optimized delegate for invoking the MethodInfo + + + + Controls a single allocated AsyncLogEventInfo-List for reuse (only one active user) + + + + + Controls a single allocated char[]-buffer for reuse (only one active user) + + + + + Controls a single allocated StringBuilder for reuse (only one active user) + + + + + Controls a single allocated object for reuse (only one active user) + + + + Empty handle when is disabled + + + + Creates handle to the reusable char[]-buffer for active usage + + Handle to the reusable item, that can release it again + + + + Access the acquired reusable object + + + + + Controls a single allocated MemoryStream for reuse (only one active user) + + + + + Supported operating systems. + + + If you add anything here, make sure to add the appropriate detection + code to + + + + + Unknown operating system. + + + + + Unix/Linux operating systems. + + + + + Desktop versions of Windows (95,98,ME). + + + + + Windows NT, 2000, 2003 and future versions based on NT technology. + + + + + Macintosh Mac OSX + + + + + Simple character tokenizer. + + + + + Initializes a new instance of the class. + + The text to be tokenized. + + + + Current position in + + + + + Full text to be parsed + + + + + Check current char while not changing the position. + + + + + + Read the current char and change position + + + + + + Get the substring of the + + + + + + + + Implements a single-call guard around given continuation function. + + + + + Initializes a new instance of the class. + + The asynchronous continuation. + + + + Continuation function which implements the single-call guard. + + The exception. + + + + HashSet optimized for single item + + + + + + Insert single item on scope start, and remove on scope exit + + Item to insert in scope + Existing hashset to update + Force allocation of real hashset-container + HashSet EqualityComparer + + + + Add item to collection, if it not already exists + + Item to insert + + + + Clear hashset + + + + + Check if hashset contains item + + + Item exists in hashset (true/false) + + + + Remove item from hashset + + + Item removed from hashset (true/false) + + + + Copy items in hashset to array + + Destination array + Array offset + + + + Create hashset enumerator + + Enumerator + + + + Provides helpers to sort log events and associated continuations. + + + + + Key selector delegate. + + The type of the value. + The type of the key. + Value to extract key information from. + Key selected from log event. + + + + Performs bucket sort (group by) on an array of items and returns a dictionary for easy traversal of the result set. + + The type of the value. + The type of the key. + The inputs. + The key selector function. + + Dictionary where keys are unique input keys, and values are lists of . + + + + + Performs bucket sort (group by) on an array of items and returns a dictionary for easy traversal of the result set. + + The type of the value. + The type of the key. + The inputs. + The key selector function. + + Dictionary where keys are unique input keys, and values are lists of . + + + + + Performs bucket sort (group by) on an array of items and returns a dictionary for easy traversal of the result set. + + The type of the value. + The type of the key. + The inputs. + The key selector function. + The key comparer function. + + Dictionary where keys are unique input keys, and values are lists of . + + + + + Single-Bucket optimized readonly dictionary. Uses normal internally Dictionary if multiple buckets are needed. + + Avoids allocating a new dictionary, when all items are using the same bucket + + The type of the key. + The type of the value. + + + + + + + + + + + + + + + + Allows direct lookup of existing keys. If trying to access non-existing key exception is thrown. + Consider to use instead for better safety. + + Key value for lookup + Mapped value found + + + + Non-Allocating struct-enumerator + + + + + + + + + + + + + Will always throw, as dictionary is readonly + + + Will always throw, as dictionary is readonly + + + + + + Will always throw, as dictionary is readonly + + + Will always throw, as dictionary is readonly + + + + + + + + + Will always throw, as dictionary is readonly + + + + Utilities for dealing with values. + + + + + Gets the fully qualified name of the class invoking the calling method, including the + namespace but not the assembly. + + + + + Gets the fully qualified name of the class invoking the calling method, including the + namespace but not the assembly. + + StackFrame from the calling method + Fully qualified class name + + + + Returns the assembly from the provided StackFrame (If not internal assembly) + + Valid asssembly, or null if assembly was internal + + + + Returns the classname from the provided StackFrame (If not from internal assembly) + + + Valid class name, or empty string if assembly was internal + + + + Stream helpers + + + + + Copy to output stream and skip BOM if encoding is UTF8 + + + + + + + + Copy stream input to output. Skip the first bytes + + stream to read from + stream to write to + .net35 doesn't have a .copyto + + + + Copy stream input to output. Skip the first bytes + + stream to read from + stream to write to + first bytes to skip (optional) + + + + Helpers for , which is used in e.g. layout renderers. + + + + + Renders the specified log event context item and appends it to the specified . + + append to this + value to be appended + formatstring. If @, then serialize the value with the Default JsonConverter. + provider, for example culture + + + + Appends int without using culture, and most importantly without garbage + + + value to append + + + + Appends uint without using culture, and most importantly without garbage + + Credits Gavin Pugh - https://www.gavpugh.com/2010/04/01/xnac-avoiding-garbage-when-working-with-stringbuilder/ + + + value to append + + + + Clears the provider StringBuilder + + + + + + Copies the contents of the StringBuilder to the MemoryStream using the specified encoding (Without BOM/Preamble) + + StringBuilder source + MemoryStream destination + Encoding used for converter string into byte-stream + Helper char-buffer to minimize memory allocations + + + + Copies the contents of the StringBuilder to the destination StringBuilder + + StringBuilder source + StringBuilder destination + + + + Scans the StringBuilder for the position of needle character + + StringBuilder source + needle character to search for + + Index of the first occurrence (Else -1) + + + + Scans the StringBuilder for the position of needle character + + StringBuilder source + needle characters to search for + + Index of the first occurrence (Else -1) + + + + Compares the contents of two StringBuilders + + + Correct implementation of that also works when is not the same + + True when content is the same + + + + Compares the contents of a StringBuilder and a String + + True when content is the same + + + + Append a number and pad with 0 to 2 digits + + append to this + the number + + + + Append a number and pad with 0 to 4 digits + + append to this + the number + + + + Append a int type (byte, int) as string + + + + + Constructor + + Max number of items + Initial StringBuilder Size + Max StringBuilder Size + + + + Takes StringBuilder from pool + + Allow return to pool + + + + Releases StringBuilder back to pool at its right place + + + + + Keeps track of acquired pool item + + + + + Releases pool item back into pool + + + + + Helpers for . + + + + + IsNullOrWhiteSpace, including for .NET 3.5 + + + + + + + Split a string + + + + + Split string with escape. The escape char is the same as the splitchar + + + split char. escaped also with this char + + + + + Split string with escape + + + + + + + + + Split a string, optional quoted value + + Text to split + Character to split the + Quote character + + Escape for the , not escape for the + , use quotes for that. + + + + + + Represents target with a chain of filters which determine + whether logging should happen. + + + + + cached result as calculating is expensive. + + + + + Initializes a new instance of the class. + + The target. + The filter chain. + Default action if none of the filters match. + + + + Gets the target. + + The target. + + + + Gets the filter chain. + + The filter chain. + + + + Default action if none of the filters match. + + + + + Gets or sets the next item in the chain. + + The next item in the chain. + This is for example the 'target2' logger in writeTo='target1,target2' + + + + Gets the stack trace usage. + + A value that determines stack trace handling. + + + + Helper for dealing with thread-local storage. + + + + + Allocates the data slot for storing thread-local information. + + Allocated slot key. + + + + Gets the data for a slot in thread-local storage. + + Type of the data. + The slot to get data for. + Automatically create the object if it doesn't exist. + + Slot data (will create T if null). + + + + + Wraps with a timeout. + + + + + Initializes a new instance of the class. + + The asynchronous continuation. + The timeout. + + + + Continuation function which implements the timeout logic. + + The exception. + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + URL Encoding helper. + + + + Allow UnreservedMarks instead of ReservedMarks, as specified by chosen RFC + + + Use RFC2396 standard (instead of RFC3986) + + + Should use lowercase when doing HEX escaping of special characters + + + Replace space ' ' with '+' instead of '%20' + + + Skip UTF8 encoding, and prefix special characters with '%u' + + + + Escape unicode string data for use in http-requests + + unicode string-data to be encoded + target for the encoded result + s for how to perform the encoding + + + + Convert the wide-char into utf8-bytes, and then escape + + + + + + + + + Is allowed? + + + + + + + + Is a-z / A-Z / 0-9 + + + + + + + Win32-optimized implementation of . + + + + + Gets the information about a file. + + Name of the file. + The file stream. + The file characteristics, if the file information was retrieved successfully, otherwise null. + + + + Win32-optimized implementation of . + + + + + Initializes a new instance of the class. + + + + + Gets current process ID. + + + + + Gets current process absolute file path. + + + + + Prevents the Xamarin linker from linking the target. + + + By applying this attribute all of the members of the target will be kept as if they had been referenced by the code. + + + + + Ensures that all members of this type are preserved + + + + + Flags the method as a method to preserve during linking if the container class is pulled in. + + + + + Helper class for XML + + + + + removes any unusual unicode characters that can't be encoded into XML + + + + + Cleans string of any invalid XML chars found + + unclean string + string with only valid XML chars + + + + Pretest, small text and not escape needed + + + + + + + + Converts object value to invariant format, and strips any invalid xml-characters + + Object value + Object value converted to string + + + + Converts object value to invariant format (understood by JavaScript) + + Object value + Object value converted to string + + + + XML elements must follow these naming rules: + - Element names are case-sensitive + - Element names must start with a letter or underscore + - Element names can contain letters, digits, hyphens, underscores, and periods + - Element names cannot contain spaces + + + + + + + Converts object value to invariant format (understood by JavaScript) + + Object value + Object TypeCode + Check and remove unusual unicode characters from the result string. + Object value converted to string + + + + Safe version of WriteAttributeString + + + + + + + + + + Safe version of WriteAttributeString + + + + + + + + Safe version of WriteElementSafeString + + + + + + + + + + Safe version of WriteCData + + + + + + + Provides an interface to execute System.Actions without surfacing any exceptions raised for that action. + + + + + Runs the provided action. If the action throws, the exception is logged at Error level. The exception is not propagated outside of this method. + + Action to execute. + + + + Runs the provided function and returns its result. If an exception is thrown, it is logged at Error level. + The exception is not propagated outside of this method; a default value is returned instead. + + Return type of the provided function. + Function to run. + Result returned by the provided function or the default value of type in case of exception. + + + + Runs the provided function and returns its result. If an exception is thrown, it is logged at Error level. + The exception is not propagated outside of this method; a fallback value is returned instead. + + Return type of the provided function. + Function to run. + Fallback value to return in case of exception. + Result returned by the provided function or fallback value in case of exception. + + + + Render a message template property to a string + + + + + Serialization of an object, e.g. JSON and append to + + The object to serialize to string. + Parameter Format + Parameter CaptureType + An object that supplies culture-specific formatting information. + Output destination. + Serialize succeeded (true/false) + + + + Log event context data. + + + + + Initializes a new instance of the class. + + + + + Gets or sets string that will be used to separate key/value pairs. + + + + + + Get or set if empty values should be included. + + A value is empty when null or in case of a string, null or empty string. + + + + + Gets or sets how key/value pairs will be formatted. + + + + + + Renders all log event's properties and appends them to the specified . + + The to append the rendered data to. + Logging event. + + + + Designates a property of the class as an ambient property. + + + non-ambient: ${uppercase:${level}} + ambient : ${level:uppercase} + + + + + Initializes a new instance of the class. + + Ambient property name. + + + + Used to render the application domain name. + + + + + Create a new renderer + + + + + Create a new renderer + + + + + Format string. Possible values: "Short", "Long" or custom like {0} {1}. Default "Long" + The first parameter is the , the second the second the + This string is used in + + + + + + + + + + + + + + + Application setting. + + + Use this layout renderer to insert the value of an application setting + stored in the application's App.config or Web.config file. + + + ${appsetting:item=mysetting:default=mydefault} - produces "mydefault" if no appsetting + + + + + The AppSetting item-name + + + + + + The AppSetting item-name + + + + + The default value to render if the AppSetting value is null. + + + + + + + + + Renders the specified application setting or default value and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + Renders the assembly version information for the entry assembly or a named assembly. + + + As this layout renderer uses reflection and version information is unlikely to change during application execution, + it is recommended to use it in conjunction with the . + + + The entry assembly can't be found in some cases e.g. ASP.NET, unit tests, etc. + + + + + Initializes a new instance of the class. + + + + + The (full) name of the assembly. If null, using the entry assembly. + + + + + + Gets or sets the type of assembly version to retrieve. + + + Some version type and platform combinations are not fully supported. + - UWP earlier than .NET Standard 1.5: Value for is always returned unless the parameter is specified. + - Silverlight: Value for is always returned. + + + + + + Gets or sets the custom format of the assembly version output. + + + Supported placeholders are 'major', 'minor', 'build' and 'revision'. + The default .NET template for version numbers is 'major.minor.build.revision'. See + https://docs.microsoft.com/en-gb/dotnet/api/system.version?view=netframework-4.7.2#remarks + for details. + + + + + + Initializes the layout renderer. + + + + + Closes the layout renderer. + + + + + Renders an assembly version and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + Gets the assembly specified by , or entry assembly otherwise + + Found assembly + + + + Type of assembly version to retrieve. + + + + + Gets the assembly version. + + + + + Gets the file version. + + + + + Gets additional version information. + + + + + The current application domain's base directory. + + + + + cached + + + + + Use base dir of current process. + + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the name of the file to be Path.Combine()'d with with the base directory. + + + + + + Gets or sets the name of the directory to be Path.Combine()'d with with the base directory. + + + + + + Renders the application base directory and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + The call site source file name. Full callsite + + + + + Gets or sets a value indicating whether to include source file path. + + + + + + Gets or sets the number of frames to skip. + + + + + + Gets the level of stack trace information required by the implementing class. + + + + + + + + + + + The call site (class name, method name and source information). + + + + + Initializes a new instance of the class. + + + + + Gets or sets a value indicating whether to render the class name. + + + + + + Gets or sets a value indicating whether to render the include the namespace with . + + + + + + Gets or sets a value indicating whether to render the method name. + + + + + + Gets or sets a value indicating whether the method name will be cleaned up if it is detected as an anonymous delegate. + + + + + + Gets or sets a value indicating whether the method and class names will be cleaned up if it is detected as an async continuation + (everything after an await-statement inside of an async method). + + + + + + Gets or sets the number of frames to skip. + + + + + + Gets or sets a value indicating whether to render the source file name and line number. + + + + + + Gets or sets a value indicating whether to include source file path. + + + + + + Gets the level of stack trace information required by the implementing class. + + + + + Renders the call site and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + The call site source line number. Full callsite + + + + + Gets or sets the number of frames to skip. + + + + + + Gets the level of stack trace information required by the implementing class. + + + + + + + + + + + A counter value (increases on each layout rendering). + + + + + Gets or sets the initial value of the counter. + + + + + + Gets or sets the value to be added to the counter after each layout rendering. + + + + + + Gets or sets the name of the sequence. Different named sequences can have individual values. + + + + + + + + + The current working directory of the application. + + + + + Gets or sets the name of the file to be Path.Combine()'d with the current directory. + + + + + + Gets or sets the name of the directory to be Path.Combine()'d with the current directory. + + + + + + + + + + + + Current date and time. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the culture used for rendering. + + + + + + Gets or sets the date format. Can be any argument accepted by DateTime.ToString(format). + + + + + + Gets or sets a value indicating whether to output UTC time instead of local time. + + + + + + + + + + + + + + + DB null for a database + + + + + + + + + + + The environment variable. + + + + + Gets or sets the name of the environment variable. + + + + + + Gets or sets the default value to be used when the environment variable is not set. + + + + + + + + + + + + Thread identity information (username). + + + + + Initializes a new instance of the class. + + + + + Gets or sets a value indicating whether username should be included. + + + + + + Gets or sets a value indicating whether domain name should be included. + + + + + + Gets or sets the default value to be used when the User is not set. + + + + + + Gets or sets the default value to be used when the Domain is not set. + + + + + + + + + + + + Log event context data. + + This class was marked as obsolete on NLog 2.0 and it may be removed in a future release. + + + + Gets or sets the name of the item. + + + + + + Renders the specified log event context item and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + Log event context data. See . + + + + + Gets or sets the name of the item. + + + + + + Format string for conversion from object to string. + + + + + + Gets or sets the culture used for rendering. + + + + + + Gets or sets the object-property-navigation-path for lookup of nested property + + + + + + + + + + + + + + + Exception information provided through + a call to one of the Logger.*Exception() methods. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the format of the output. Must be a comma-separated list of exception + properties: Message, Type, ShortType, ToString, Method, StackTrace. + This parameter value is case-insensitive. + + + + + + + + Gets or sets the format of the output of inner exceptions. Must be a comma-separated list of exception + properties: Message, Type, ShortType, ToString, Method, StackTrace. + This parameter value is case-insensitive. + + + + + + Gets or sets the separator used to concatenate parts specified in the Format. + + + + + + Gets or sets the separator used to concatenate exception data specified in the Format. + + + + + + Gets or sets the maximum number of inner exceptions to include in the output. + By default inner exceptions are not enabled for compatibility with NLog 1.0. + + + + + + Gets or sets the separator between inner exceptions. + + + + + + Gets the formats of the output of inner exceptions to be rendered in target. + + + + + + + Gets the formats of the output to be rendered in target. + + + + + + + + + + + + + Appends the Message of an Exception to the specified . + + The to append the rendered data to. + The exception containing the Message to append. + + + + Appends the method name from Exception's stack trace to the specified . + + The to append the rendered data to. + The Exception whose method name should be appended. + + + + Appends the stack trace from an Exception to the specified . + + The to append the rendered data to. + The Exception whose stack trace should be appended. + + + + Appends the result of calling ToString() on an Exception to the specified . + + The to append the rendered data to. + The Exception whose call to ToString() should be appended. + + + + Appends the type of an Exception to the specified . + + The to append the rendered data to. + The Exception whose type should be appended. + + + + Appends the short type of an Exception to the specified . + + The to append the rendered data to. + The Exception whose short type should be appended. + + + + Appends the application source of an Exception to the specified . + + The to append the rendered data to. + The Exception whose source should be appended. + + + + Appends the contents of an Exception's Data property to the specified . + + The to append the rendered data to. + The Exception whose Data property elements should be appended. + + + + Appends all the serialized properties of an Exception into the specified . + + The to append the rendered data to. + The Exception whose properties should be appended. + + + + Split the string and then compile into list of Rendering formats. + + + + + + + Renders contents of the specified file. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the name of the file. + + + + + + Gets or sets the encoding used in the file. + + The encoding. + + + + + Renders the contents of the specified file and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + A layout renderer which could have different behavior per instance by using a . + + + + + Create a new. + + Name without ${}. + Method that renders the layout. + + + + Name used in config without ${}. E.g. "test" could be used as "${test}". + + + + + Method that renders the layout. + + + + + + + + The information about the garbage collector. + + + + + Gets or sets the property to retrieve. + + + + + + + + + Gets or sets the property of System.GC to retrieve. + + + + + Total memory allocated. + + + + + Total memory allocated (perform full garbage collection first). + + + + + Gets the number of Gen0 collections. + + + + + Gets the number of Gen1 collections. + + + + + Gets the number of Gen2 collections. + + + + + Maximum generation number supported by GC. + + + + + Render a Global Diagnostics Context item. See + + + + + Gets or sets the name of the item. + + + + + + Format string for conversion from object to string. + + + + + + + + + + + + + + + Globally-unique identifier (GUID). + + + + + Gets or sets the GUID format as accepted by Guid.ToString() method. + + + + + + Generate the Guid from the NLog LogEvent (Will be the same for all targets) + + + + + + + + + + + + + + + The host name that the process is running on. + + + + + + + + Gets the host name and falls back to computer name if not available + + + + + Tries the lookup value. + + The lookup function. + Type of the lookup. + + + + + + + + Thread identity information (name and authentication information). + + + + + Gets or sets the separator to be used when concatenating + parts of identity information. + + + + + + Gets or sets a value indicating whether to render Thread.CurrentPrincipal.Identity.Name. + + + + + + Gets or sets a value indicating whether to render Thread.CurrentPrincipal.Identity.AuthenticationType. + + + + + + Gets or sets a value indicating whether to render Thread.CurrentPrincipal.Identity.IsAuthenticated. + + + + + + + + + Installation parameter (passed to InstallNLogConfig). + + + + + Gets or sets the name of the parameter. + + + + + + Renders the specified installation parameter and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + Render environmental information related to logging events. + + + + + Gets the logging configuration this target is part of. + + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Renders the the value of layout renderer in the context of the specified log event. + + The log event. + String representation of a layout renderer. + + + + Initializes this instance. + + The configuration. + + + + Closes this instance. + + + + + Initializes this instance. + + The configuration. + + + + Closes this instance. + + + + + Renders the value of layout renderer in the context of the specified log event. + + The log event. + The layout render output is appended to builder + + + + Renders the value of layout renderer in the context of the specified log event into . + + The to append the rendered data to. + Logging event. + + + + Initializes the layout renderer. + + + + + Closes the layout renderer. + + + + + Releases unmanaged and - optionally - managed resources. + + True to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Get the for rendering the messages to a + + LogEvent with culture + Culture in on Layout level + + + + + Get the for rendering the messages to a , needed for date and number formats + + LogEvent with culture + Culture in on Layout level + + + is preferred + + + + + Register a custom layout renderer. + + Short-cut for registing to default + Type of the layout renderer. + Name of the layout renderer - without ${}. + + + + Register a custom layout renderer. + + Short-cut for registering to default + Type of the layout renderer. + Name of the layout renderer - without ${}. + + + + Register a custom layout renderer with a callback function . The callback receives the logEvent. + + Name of the layout renderer - without ${}. + Callback that returns the value for the layout renderer. + + + + Register a custom layout renderer with a callback function . The callback recieves the logEvent and the current configuration. + + Name of the layout renderer - without ${}. + Callback that returns the value for the layout renderer. + + + + Marks class as a layout renderer and assigns a name to it. + + This attribute is not required when registering the layout in the API. + + + + Initializes a new instance of the class. + + Name of the layout renderer, without the `${ }` + + + + Format of the ${level} layout renderer output. + + + + + Render the full level name. + + + + + Render the first character of the level. + + + + + Render the ordinal (aka number) for the level. + + + + + The log level. + + + + + Gets or sets a value indicating the output format of the level. + + + + + + + + + + + + + + + A string literal. + + + This is used to escape '${' sequence + as ;${literal:text=${}' + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The literal text value. + This is used by the layout compiler. + + + + Gets or sets the literal text. + + + + + + Renders the specified string literal and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + XML event description compatible with log4j, Chainsaw and NLogViewer. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes the layout renderer. + + + + + Gets or sets a value indicating whether to include NLog-specific extensions to log4j schema. + + + + + + Gets or sets a value indicating whether the XML should use spaces for indentation. + + + + + + Gets or sets the AppInfo field. By default it's the friendly name of the current AppDomain. + + + + + + Gets or sets a value indicating whether to include call site (class and method name) in the information sent over the network. + + + + + + Gets or sets a value indicating whether to include source info (file name and line number) in the information sent over the network. + + + + + + Gets or sets a value indicating whether to include contents of the dictionary. + + + + + + Gets or sets a value indicating whether to include contents of the dictionary. + + + + + + Gets or sets a value indicating whether to include contents of the stack. + + + + + + Gets or sets the NDLC item separator. + + + + + + Gets or sets the option to include all properties from the log events + + + + + + Gets or sets a value indicating whether to include contents of the stack. + + + + + + Gets or sets the NDC item separator. + + + + + + Gets or sets the log4j:event logger-xml-attribute (Default ${logger}) + + + + + + Gets the level of stack trace information required by the implementing class. + + + + + Renders the XML logging event and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + The logger name. + + + + + Gets or sets a value indicating whether to render short logger name (the part after the trailing dot character). + + + + + + + + + + + + The date and time in a long, sortable format yyyy-MM-dd HH:mm:ss.ffff. + + + + + Gets or sets a value indicating whether to output UTC time instead of local time. + + + + + + Renders the date in the long format (yyyy-MM-dd HH:mm:ss.ffff) and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + The machine name that the process is running on. + + + + + + + + + + + Render a Mapped Diagnostic Context item, See + + + + + Gets or sets the name of the item. + + + + + + Format string for conversion from object to string. + + + + + + + + + + + + Render a Mapped Diagnostic Logical Context item (based on CallContext). + See + + + + + Gets or sets the name of the item. + + + + + + Format string for conversion from object to string. + + + + + + + + + + + + The formatted log message. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a value indicating whether to log exception along with message. + + + + + + Gets or sets the string that separates message from the exception. + + + + + + Gets or sets whether it should render the raw message without formatting parameters + + + + + + + + + + + + Render a Nested Diagnostic Context item. + See + + + + + Initializes a new instance of the class. + + + + + Gets or sets the number of top stack frames to be rendered. + + + + + + Gets or sets the number of bottom stack frames to be rendered. + + + + + + Gets or sets the separator to be used for concatenating nested diagnostics context output. + + + + + + Renders the specified Nested Diagnostics Context item and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + Render a Nested Diagnostic Logical Context item (Async scope) + See + + + + + Initializes a new instance of the class. + + + + + Gets or sets the number of top stack frames to be rendered. + + + + + + Gets or sets the number of bottom stack frames to be rendered. + + + + + + Gets or sets the separator to be used for concatenating nested logical context output. + + + + + + Renders the specified Nested Logical Context item and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + Timing Renderer (Async scope) + + + + + Gets or sets whether to only include the duration of the last scope created + + + + + + Gets or sets whether to just display the scope creation time, and not the duration + + + + + + Gets or sets the TimeSpan format. Can be any argument accepted by TimeSpan.ToString(format). + + + + + + Renders the timing details of the Nested Logical Context item and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + A newline literal. + + + + + Renders the specified string literal and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + The directory where NLog.dll is located. + + + + + Initializes static members of the NLogDirLayoutRenderer class. + + + + + Gets or sets the name of the file to be Path.Combine()'d with the directory name. + + + + + + Gets or sets the name of the directory to be Path.Combine()'d with the directory name. + + + + + + Initializes the layout renderer. + + + + + Closes the layout renderer. + + + + + Renders the directory where NLog is located and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + The performance counter. + + + + + Gets or sets the name of the counter category. + + + + + + Gets or sets the name of the performance counter. + + + + + + Gets or sets the name of the performance counter instance (e.g. this.Global_). + + + + + + Gets or sets the name of the machine to read the performance counter from. + + + + + + Format string for conversion from float to string. + + + + + + Gets or sets the culture used for rendering. + + + + + + + + + If having multiple instances with the same process-name, then they will get different instance names + + + + + + + + + + + The identifier of the current process. + + + + + + + + + + + The information about the running process. + + + + + Gets or sets the property to retrieve. + + + + + + Gets or sets the format-string to use if the property supports it (Ex. DateTime / TimeSpan / Enum) + + + + + + + + + + + + + + + Property of System.Diagnostics.Process to retrieve. + + + + + Base Priority. + + + + + Exit Code. + + + + + Exit Time. + + + + + Process Handle. + + + + + Handle Count. + + + + + Whether process has exited. + + + + + Process ID. + + + + + Machine name. + + + + + Handle of the main window. + + + + + Title of the main window. + + + + + Maximum Working Set. + + + + + Minimum Working Set. + + + + + Non-paged System Memory Size. + + + + + Non-paged System Memory Size (64-bit). + + + + + Paged Memory Size. + + + + + Paged Memory Size (64-bit).. + + + + + Paged System Memory Size. + + + + + Paged System Memory Size (64-bit). + + + + + Peak Paged Memory Size. + + + + + Peak Paged Memory Size (64-bit). + + + + + Peak Virtual Memory Size. + + + + + Peak Virtual Memory Size (64-bit).. + + + + + Peak Working Set Size. + + + + + Peak Working Set Size (64-bit). + + + + + Whether priority boost is enabled. + + + + + Priority Class. + + + + + Private Memory Size. + + + + + Private Memory Size (64-bit). + + + + + Privileged Processor Time. + + + + + Process Name. + + + + + Whether process is responding. + + + + + Session ID. + + + + + Process Start Time. + + + + + Total Processor Time. + + + + + User Processor Time. + + + + + Virtual Memory Size. + + + + + Virtual Memory Size (64-bit). + + + + + Working Set Size. + + + + + Working Set Size (64-bit). + + + + + The name of the current process. + + + + + Gets or sets a value indicating whether to write the full path to the process executable. + + + + + + Renders the current process name (optionally with a full path). + + The to append the rendered data to. + Logging event. + + + + The process time in format HH:mm:ss.mmm. + + + + + Gets or sets a value indicating whether to output in culture invariant format + + + + + + + + + + + + Write timestamp to builder with format hh:mm:ss:fff + + + + + High precision timer, based on the value returned from QueryPerformanceCounter() optionally converted to seconds. + + + + + Gets or sets a value indicating whether to normalize the result by subtracting + it from the result of the first call (so that it's effectively zero-based). + + + + + + Gets or sets a value indicating whether to output the difference between the result + of QueryPerformanceCounter and the previous one. + + + + + + Gets or sets a value indicating whether to convert the result to seconds by dividing + by the result of QueryPerformanceFrequency(). + + + + + + Gets or sets the number of decimal digits to be included in output. + + + + + + Gets or sets a value indicating whether to align decimal point (emit non-significant zeros). + + + + + + + + + + + + A value from the Registry. + + + + + Create new renderer + + + + + Gets or sets the registry value name. + + + + + + Gets or sets the value to be output when the specified registry key or value is not found. + + + + + + Require escaping backward slashes in . Need to be backwards-compatible. + + When true: + + `\` in value should be configured as `\\` + `\\` in value should be configured as `\\\\`. + + Default value wasn't a Layout before and needed an escape of the slash + + + + + Gets or sets the registry view (see: https://msdn.microsoft.com/de-de/library/microsoft.win32.registryview.aspx). + Allowed values: Registry32, Registry64, Default + + + + + + Gets or sets the registry key. + + + HKCU\Software\NLogTest + + + Possible keys: +
    +
  • HKEY_LOCAL_MACHINE
  • +
  • HKLM
  • +
  • HKEY_CURRENT_USER
  • +
  • HKCU
  • +
  • HKEY_CLASSES_ROOT
  • +
  • HKEY_USERS
  • +
  • HKEY_CURRENT_CONFIG
  • +
  • HKEY_DYN_DATA
  • +
  • HKEY_PERFORMANCE_DATA
  • +
+
+ +
+ + + Reads the specified registry key and value and appends it to + the passed . + + The to append the rendered data to. + Logging event. Ignored. + + + + Has ? + + + + + Parse key to and subkey. + + full registry key name + Result of parsing, never null. + + + + Aliases for the hives. See https://msdn.microsoft.com/en-us/library/ctb3kd86(v=vs.110).aspx + + + + + The sequence ID + + + + + + + + + + + The short date in a sortable format yyyy-MM-dd. + + + + + Gets or sets a value indicating whether to output UTC time instead of local time. + + + + + + Renders the current short date string (yyyy-MM-dd) and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + System special folder path (includes My Documents, My Music, Program Files, Desktop, and more). + + + + + Gets or sets the system special folder to use. + + + Full list of options is available at MSDN. + The most common ones are: +
    +
  • ApplicationData - roaming application data for current user.
  • +
  • CommonApplicationData - application data for all users.
  • +
  • MyDocuments - My Documents
  • +
  • DesktopDirectory - Desktop directory
  • +
  • LocalApplicationData - non roaming application data
  • +
  • Personal - user profile directory
  • +
  • System - System directory
  • +
+
+ +
+ + + Gets or sets the name of the file to be Path.Combine()'d with the directory name. + + + + + + Gets or sets the name of the directory to be Path.Combine()'d with the directory name. + + + + + + Renders the directory where NLog is located and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + Format of the ${stacktrace} layout renderer output. + + + + + Raw format (multiline - as returned by StackFrame.ToString() method). + + + + + Flat format (class and method names displayed in a single line). + + + + + Detailed flat format (method signatures displayed in a single line). + + + + + Stack trace renderer. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the output format of the stack trace. + + + + + + Gets or sets the number of top stack frames to be rendered. + + + + + + Gets or sets the number of frames to skip. + + + + + + Gets or sets the stack frame separator string. + + + + + + Gets the level of stack trace information required by the implementing class. + + + + + + Renders the call site and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + A temporary directory. + + + + + Gets or sets the name of the file to be Path.Combine()'d with the directory name. + + + + + + Gets or sets the name of the directory to be Path.Combine()'d with the directory name. + + + + + + + + + Renders the directory where NLog is located and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + The identifier of the current thread. + + + + + + + + The name of the current thread. + + + + + + + + The Ticks value of current date and time. + + + + + + + + + + + The time in a 24-hour, sortable format HH:mm:ss.mmmm. + + + + + Gets or sets a value indicating whether to output UTC time instead of local time. + + + + + + Gets or sets a value indicating whether to output in culture invariant format + + + + + + + + + + + + A renderer that puts into log a System.Diagnostics trace correlation id. + + + + + + + + + + + Render a NLog variable (xml or config) + + + + + Gets or sets the name of the NLog variable. + + + + + + Gets or sets the default value to be used when the variable is not set. + + Not used if Name is null + + + + + Initializes the layout renderer. + + + + + Try get the + + + + + + + Renders the specified variable and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + Thread Windows identity information (username). + + + + + Initializes a new instance of the class. + + + + + Gets or sets a value indicating whether domain name should be included. + + + + + + Gets or sets a value indicating whether username should be included. + + + + + + Renders the current thread windows identity information and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + Applies caching to another layout output. + + + The value of the inner layout will be rendered only once and reused subsequently. + + + + + A value indicating when the cache is cleared. + + + + Never clear the cache. + + + Clear the cache whenever the is initialized. + + + Clear the cache whenever the is closed. + + + + Initializes a new instance of the class. + + + + + Gets or sets a value indicating whether this is enabled. + + + + + + Gets or sets a value indicating when the cache is cleared. + + + + + + Cachekey. If the cachekey changes, resets the value. For example, the cachekey would be the current day.s + + + + + + Initializes the layout renderer. + + + + + Closes the layout renderer. + + + + + Transforms the output of another layout. + + Output to be transform. + Transformed text. + + + + Renders the inner layout contents. + + The log event. + Contents of inner layout. + + + + + + + Filters characters not allowed in the file names by replacing them with safe character. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a value indicating whether to modify the output of this renderer so it can be used as a part of file path + (illegal characters are replaced with '_'). + + + + + + + + + + + + Escapes output of another layout using JSON rules. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a value indicating whether to apply JSON encoding. + + + + + + Gets or sets a value indicating whether to escape non-ascii characters + + + + + + + + + + + + Left part of a text + + + + + Gets or sets the length in characters. + + + + + + Same as -property, so it can be used as ambient property. + + + ${message:truncate=80} + + + + + + + + + + + Converts the result of another layout output to lower case. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a value indicating whether lower case conversion should be applied. + + A value of true if lower case conversion should be applied; otherwise, false. + + + + + Gets or sets the culture used for rendering. + + + + + + + + + + + + Render the non-raw value of an object. + + For performance and/or full (formatted) control of the output. + + + + Gets or sets a value indicating whether to disable the IRawValue-interface + + A value of true if IRawValue-interface should be ignored; otherwise, false. + + + + + + + + + + + Render a single property of a object + + + + + + + + Gets or sets the object-property-navigation-path for lookup of nested property + + Shortcut for + + + + + Gets or sets the object-property-navigation-path for lookup of nested property + + + + + + Format string for conversion from object to string. + + + + + + Gets or sets the culture used for rendering. + + + + + + + + + + + + + + + Only outputs the inner layout when exception has been defined for log message. + + + + + + + + Transforms the output of another layout. + + Output to be transform. + Transformed text. + + + + Horizontal alignment for padding layout renderers. + + + + + When layout text is too long, align it to the left + (remove characters from the right). + + + + + When layout text is too long, align it to the right + (remove characters from the left). + + + + + Applies padding to another layout output. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the number of characters to pad the output to. + + + Positive padding values cause left padding, negative values + cause right padding to the desired width. + + + + + + Gets or sets the padding character. + + + + + + Gets or sets a value indicating whether to trim the + rendered text to the absolute value of the padding length. + + + + + + Gets or sets a value indicating whether a value that has + been truncated (when is true) + will be left-aligned (characters removed from the right) + or right-aligned (characters removed from the left). The + default is left alignment. + + RegistryLayoutRenderer + + + + Transforms the output of another layout. + + Output to be transform. + Transformed text. + + + + Replaces a string in the output of another layout with another string. + + + ${replace:searchFor=\\n+:replaceWith=-:regex=true:inner=${message}} + + + + + Gets or sets the text to search for. + + The text search for. + + + + + Gets or sets a value indicating whether regular expressions should be used. + + A value of true if regular expressions should be used otherwise, false. + + + + + Gets or sets the replacement string. + + The replacement string. + + + + + Gets or sets the group name to replace when using regular expressions. + Leave null or empty to replace without using group name. + + The group name. + + + + + Gets or sets a value indicating whether to ignore case. + + A value of true if case should be ignored when searching; otherwise, false. + + + + + Gets or sets a value indicating whether to search for whole words. + + A value of true if whole words should be searched for; otherwise, false. + + + + + Initializes the layout renderer. + + + + + Post-processes the rendered message. + + The text to be post-processed. + Post-processed text. + + + + This class was created instead of simply using a lambda expression so that the "ThreadAgnosticAttributeTest" will pass + + + + + A match evaluator for Regular Expression based replacing + + Input string. + Group name in the regex. + Replace value. + Match from regex. + Groups replaced with . + + + + Replaces newline characters from the result of another layout renderer with spaces. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a value indicating the string that should be used for separating lines. + + + + + + + + + + + + Right part of a text + + + + + Gets or sets the length in characters. + + + + + + + + + + + + Decodes text "encrypted" with ROT-13. + + + See https://en.wikipedia.org/wiki/ROT13. + + + + + Gets or sets the layout to be wrapped. + + The layout to be wrapped. + This variable is for backwards compatibility + + + + + Encodes/Decodes ROT-13-encoded string. + + The string to be encoded/decoded. + Encoded/Decoded text. + + + + + + + + + + Encodes/Decodes ROT-13-encoded string. + + + + + Substring the result + + + ${substring:${level}:start=2:length=2} + ${substring:${level}:start=-2:length=2} + ${substring:Inner=${level}:start=2:length=2} + + + + + Initializes a new instance of the class. + + + + + Gets or sets the start index. + + Index + + + + + Gets or sets the length in characters. If null, then the whole string + + Index + + + + + + + + + + + Calculate start position + + 0 or positive number + + + + Calculate needed length + + 0 or positive number + + + + Trims the whitespace from the result of another layout renderer. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a value indicating whether lower case conversion should be applied. + + A value of true if lower case conversion should be applied; otherwise, false. + + + + + + + + + + + Converts the result of another layout output to upper case. + + + ${uppercase:${level}} //[DefaultParameter] + ${uppercase:Inner=${level}} + ${level:uppercase} // [AmbientProperty] + + + + + Initializes a new instance of the class. + + + + + Gets or sets a value indicating whether upper case conversion should be applied. + + A value of true if upper case conversion should be applied otherwise, false. + + + + + Gets or sets the culture used for rendering. + + + + + + + + + + + + Encodes the result of another layout output for use with URLs. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a value indicating whether spaces should be translated to '+' or '%20'. + + A value of true if space should be translated to '+'; otherwise, false. + + + + + Gets or sets a value whether escaping be done according to Rfc3986 (Supports Internationalized Resource Identifiers - IRIs) + + A value of true if Rfc3986; otherwise, false for legacy Rfc2396. + + + + + Gets or sets a value whether escaping be done according to the old NLog style (Very non-standard) + + A value of true if legacy encoding; otherwise, false for standard UTF8 encoding. + + + + + Transforms the output of another layout. + + Output to be transform. + Transformed text. + + + + Outputs alternative layout when the inner layout produces empty result. + + + + + Gets or sets the layout to be rendered when original layout produced empty result. + + + + + + + + + + + + + + + Only outputs the inner layout when the specified condition has been met. + + + + + Gets or sets the condition that must be met for the layout to be printed. + + + + + + If is not met, print this layout. + + + + + + + + + + + + + + + Replaces newline characters from the result of another layout renderer with spaces. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the line length for wrapping. + + + Only positive values are allowed + + + + + + Post-processes the rendered message. + + The text to be post-processed. + Post-processed text. + + + + Base class for s which wrapping other s. + + This has the property (which is default) and can be used to wrap. + + + ${uppercase:${level}} //[DefaultParameter] + ${uppercase:Inner=${level}} + + + + + Gets or sets the wrapped layout. + + [DefaultParameter] so Inner: is not required if it's the first + + + + + + Notify when has been changed + + Change to private protected in C# 7.3 + + + + + + + Renders the inner message, processes it and appends it to the specified . + + The to append the rendered data to. + Logging event. + + + + Appends the rendered output from -layout and transforms the added output (when necessary) + + Logging event. + The to append the rendered data to. + Start position for any necessary transformation of . + + + + Transforms the output of another layout. + + Logging event. + Output to be transform. + Transformed text. + + + + Transforms the output of another layout. + + Output to be transform. + Transformed text. + + + + Renders the inner layout contents. + + The log event. + Contents of inner layout. + + + + Base class for s which wrapping other s. + + This expects the transformation to work on a + + + + + + + + Transforms the output of another layout. + + + Output to be transform. + + + + Transforms the output of another layout. + + Output to be transform. + + + + Renders the inner layout contents. + + + for the result + + + + + + + + + + + + + + + + + + Converts the result of another layout output to be XML-compliant. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a value indicating whether to apply XML encoding. + + Ensures always valid XML, but gives a performance hit + + + + + Gets or sets a value indicating whether to transform newlines (\r\n) into ( ) + + + + + + + + + + + + A layout containing one or more nested layouts. + + + + + Initializes a new instance of the class. + + + + + Gets the inner layouts. + + + + + + Initializes the layout. + + + + + Formats the log event relying on inner layouts. + + The log event to be formatted. + A string representation of the log event. + + + + Formats the log event relying on inner layouts. + + The logging event. + for the result + + + + Closes the layout. + + + + + Generate description of Compound Layout + + Compound Layout String Description + + + + A column in the CSV. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The name of the column. + The layout of the column. + + + + Gets or sets the name of the column. + + + + + + Gets or sets the layout of the column. + + + + + + Gets or sets the override of Quoting mode + + + and are faster than the default + + + + + + Specifies allowed column delimiters. + + + + + Automatically detect from regional settings. + + + + + Comma (ASCII 44). + + + + + Semicolon (ASCII 59). + + + + + Tab character (ASCII 9). + + + + + Pipe character (ASCII 124). + + + + + Space character (ASCII 32). + + + + + Custom string, specified by the CustomDelimiter. + + + + + A specialized layout that renders CSV-formatted events. + + If is set, then the header generation with columnnames will be disabled. + + + + Initializes a new instance of the class. + + + + + Gets the array of parameters to be passed. + + + + + + Gets or sets a value indicating whether CVS should include header. + + A value of true if CVS should include header; otherwise, false. + + + + + Gets or sets the column delimiter. + + + + + + Gets or sets the quoting mode. + + + + + + Gets or sets the quote Character. + + + + + + Gets or sets the custom column delimiter value (valid when ColumnDelimiter is set to 'Custom'). + + + + + + Initializes the layout. + + + + + Formats the log event for write. + + The log event to be formatted. + A string representation of the log event. + + + + Formats the log event for write. + + The logging event. + for the result + + + + Get the headers with the column names. + + + + + + Header with column names for CSV layout. + + + + + Initializes a new instance of the class. + + The parent. + + + + Renders the layout for the specified logging event by invoking layout renderers. + + The logging event. + The rendered layout. + + + + Renders the layout for the specified logging event by invoking layout renderers. + + The logging event. + for the result + + + + Generate description of CSV Layout + + CSV Layout String Description + + + + Specifies CSV quoting modes. + + + + + Quote all column (Fast) + + + + + Quote nothing (Very fast) + + + + + Quote only whose values contain the quote symbol or the separator (Slow) + + + + + JSON attribute. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The name of the attribute. + The layout of the attribute's value. + + + + Initializes a new instance of the class. + + The name of the attribute. + The layout of the attribute's value. + Encode value with json-encode + + + + Gets or sets the name of the attribute. + + + + + + Gets or sets the layout that will be rendered as the attribute's value. + + + + + + Determines whether or not this attribute will be Json encoded. + + + + + + Gets or sets a value indicating whether to escape non-ascii characters + + + + + + Gets or sets whether an attribute with empty value should be included in the output + + + + + + A specialized layout that renders JSON-formatted events. + + + + + Initializes a new instance of the class. + + + + + Gets the array of attributes' configurations. + + + + + + Gets or sets the option to suppress the extra spaces in the output json + + + + + + Gets or sets the option to render the empty object value {} + + + + + + Gets or sets a value indicating whether to include contents of the dictionary. + + + + + + Gets or sets a value indicating whether to include contents of the dictionary. + + + + + + Gets or sets a value indicating whether to include contents of the dictionary. + + + + + + Gets or sets the option to include all properties from the log event (as JSON) + + + + + + List of property names to exclude when is true + + + + + + How far should the JSON serializer follow object references before backing off + + + + + + Initializes the layout. + + + + + Closes the layout. + + + + + Formats the log event as a JSON document for writing. + + The logging event. + for the result + + + + Formats the log event as a JSON document for writing. + + The log event to be formatted. + A JSON string representation of the log event. + + + + Generate description of JSON Layout + + JSON Layout String Description + + + + Abstract interface that layouts must implement. + + + + + Is this layout initialized? See + + + + + Gets a value indicating whether this layout is thread-agnostic (can be rendered on any thread). + + + Layout is thread-agnostic if it has been marked with [ThreadAgnostic] attribute and all its children are + like that as well. + + Thread-agnostic layouts only use contents of for its output. + + + + + Gets the level of stack trace information required for rendering. + + + + + Gets the logging configuration this target is part of. + + + + + Converts a given text to a . + + Text to be converted. + object represented by the text. + + + + Implicitly converts the specified string to a . + + The layout string. + Instance of . + + + + Implicitly converts the specified string to a . + + The layout string. + The NLog factories to use when resolving layout renderers. + Instance of . + + + + Precalculates the layout for the specified log event and stores the result + in per-log event cache. + + Only if the layout doesn't have [ThreadAgnostic] and doesn't contain layouts with [ThreadAgnostic]. + + The log event. + + Calling this method enables you to store the log event in a buffer + and/or potentially evaluate it in another thread even though the + layout may contain thread-dependent renderer. + + + + + Renders the event info in layout. + + The event info. + String representing log event. + + + + Optimized version of for internal Layouts. Works best + when override of is available. + + The event info. + Appends the string representing log event to target + Should rendering result be cached on LogEventInfo + + + + Valid default implementation of , when having implemented the optimized + + The logging event. + StringBuilder to help minimize allocations [optional]. + The rendered layout. + + + + Renders the layout for the specified logging event by invoking layout renderers. + + The logging event. + for the result + + + + Initializes this instance. + + The configuration. + + + + Closes this instance. + + + + + Initializes this instance. + + The configuration. + + + + Closes this instance. + + + + + Initializes the layout. + + + + + Closes the layout. + + + + + Renders the layout for the specified logging event by invoking layout renderers. + + The logging event. + The rendered layout. + + + + Register a custom Layout. + + Short-cut for registering to default + Type of the Layout. + Name of the Layout. + + + + Register a custom Layout. + + Short-cut for registering to default + Type of the Layout. + Name of the Layout. + + + + Optimized version of for internal Layouts, when + override of is available. + + + + + Try get value + + + rawValue if return result is true + false if we could not determine the rawValue + + + + Marks class as a layout renderer and assigns a format string to it. + + + + + Initializes a new instance of the class. + + Layout name. + + + + Parses layout strings. + + + + + Add to + + + + + + + A specialized layout that supports header and footer. + + + + + Gets or sets the body layout (can be repeated multiple times). + + + + + + Gets or sets the header layout. + + + + + + Gets or sets the footer layout. + + + + + + Renders the layout for the specified logging event by invoking layout renderers. + + The logging event. + The rendered layout. + + + + Renders the layout for the specified logging event by invoking layout renderers. + + The logging event. + for the result. + + + + A specialized layout that renders Log4j-compatible XML events. + + + This layout is not meant to be used explicitly. Instead you can use ${log4jxmlevent} layout renderer. + + + + + Initializes a new instance of the class. + + + + + Gets the instance that renders log events. + + + + + Gets the collection of parameters. Each parameter contains a mapping + between NLog layout and a named parameter. + + + + + + Gets or sets a value indicating whether to include contents of the dictionary. + + + + + + Gets or sets the option to include all properties from the log events + + + + + + Gets or sets a value indicating whether to include contents of the stack. + + + + + + Gets or sets a value indicating whether to include contents of the dictionary. + + + + + + Gets or sets a value indicating whether to include contents of the stack. + + + + + + Gets or sets a value indicating whether to include call site (class and method name) in the information sent over the network. + + + + + + Gets or sets a value indicating whether to include source info (file name and line number) in the information sent over the network. + + + + + + Renders the layout for the specified logging event by invoking layout renderers. + + The logging event. + The rendered layout. + + + + Renders the layout for the specified logging event by invoking layout renderers. + + The logging event. + for the result + + + + Represents a string with embedded placeholders that can render contextual information. + + + This layout is not meant to be used explicitly. Instead you can just use a string containing layout + renderers everywhere the layout is required. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The layout string to parse. + + + + Initializes a new instance of the class. + + The layout string to parse. + The NLog factories to use when creating references to layout renderers. + + + + Original text before compile to Layout renderes + + + + + Gets or sets the layout text. + + + + + + Is the message fixed? (no Layout renderers used) + + + + + Get the fixed text. Only set when is true + + + + + Is the message a simple formatted string? (Can skip StringBuilder) + + + + + Gets a collection of objects that make up this layout. + + + + + Gets the level of stack trace information required for rendering. + + + + + Converts a text to a simple layout. + + Text to be converted. + A object. + + + + Escapes the passed text so that it can + be used literally in all places where + layout is normally expected without being + treated as layout. + + The text to be escaped. + The escaped text. + + Escaping is done by replacing all occurrences of + '${' with '${literal:text=${}' + + + + + Evaluates the specified text by expanding all layout renderers. + + The text to be evaluated. + Log event to be used for evaluation. + The input text with all occurrences of ${} replaced with + values provided by the appropriate layout renderers. + + + + Evaluates the specified text by expanding all layout renderers + in new context. + + The text to be evaluated. + The input text with all occurrences of ${} replaced with + values provided by the appropriate layout renderers. + + + + Returns a that represents the current object. + + + A that represents the current object. + + + + + + + + + + + + + + + + + + + + XML attribute. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The name of the attribute. + The layout of the attribute's value. + + + + Initializes a new instance of the class. + + The name of the attribute. + The layout of the attribute's value. + Encode value with xml-encode + + + + Gets or sets the name of the attribute. + + + + + + Gets or sets the layout that will be rendered as the attribute's value. + + + + + + Determines whether or not this attribute will be Xml encoded. + + + + + + Gets or sets whether an attribute with empty value should be included in the output + + + + + + A XML Element + + + + + + + + + + + Name of the element + + + + + Value inside the element + + + + + Determines whether or not this attribute will be Xml encoded. + + + + + A specialized layout that renders XML-formatted events. + + + + + Initializes a new instance of the class. + + The name of the top XML node + The value of the top XML node + + + + Name of the XML element + + Upgrade to private protected when using C# 7.2 + + + + + Value inside the XML element + + Upgrade to private protected when using C# 7.2 + + + + + Xml Encode the value for the XML element + + Ensures always valid XML, but gives a performance hit + + + + + Auto indent and create new lines + + + + + + Gets the array of xml 'elements' configurations. + + + + + + Gets the array of 'attributes' configurations for the element + + + + + + Gets or sets whether a ElementValue with empty value should be included in the output + + + + + + Gets or sets a value indicating whether to include contents of the dictionary. + + + + + + Gets or sets a value indicating whether to include contents of the dictionary. + + + + + + Gets or sets the option to include all properties from the log event (as XML) + + + + + + List of property names to exclude when is true + + + + + + XML element name to use when rendering properties + + + Support string-format where {0} means property-key-name + + Skips closing element tag when having configured + + + + + + XML attribute name to use when rendering property-key + + When null (or empty) then key-attribute is not included + + + Will replace newlines in attribute-value with + + + + + + XML attribute name to use when rendering property-value + + When null (or empty) then value-attribute is not included and + value is formatted as XML-element-value + + + Skips closing element tag when using attribute for value + + Will replace newlines in attribute-value with + + + + + + XML element name to use for rendering IList-collections items + + + + + + How far should the XML serializer follow object references before backing off + + + + + + Initializes the layout. + + + + + Formats the log event as a XML document for writing. + + The logging event. + for the result + + + + Formats the log event as a XML document for writing. + + The log event to be formatted. + A XML string representation of the log event. + + + + write attribute, only if is not empty + + + + + rendered + + + + Generate description of XML Layout + + XML Layout String Description + + + + A specialized layout that renders XML-formatted events. + + + + + Initializes a new instance of the class. + + + + + + + + Name of the root XML element + + + + + + Value inside the root XML element + + + + + + Determines whether or not this attribute will be Xml encoded. + + + + + + Represents the logging event. + + + + + Gets the date of the first log event created. + + + + + The formatted log message. + + + + + The log message including any parameter placeholders + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Log level. + Logger name. + Log message including parameter placeholders. + + + + Initializes a new instance of the class. + + Log level. + Logger name. + Log message including parameter placeholders. + Log message including parameter placeholders. + + + + Initializes a new instance of the class. + + Log level. + Logger name. + An IFormatProvider that supplies culture-specific formatting information. + Log message including parameter placeholders. + Parameter array. + + + + Initializes a new instance of the class. + + Log level. + Logger name. + An IFormatProvider that supplies culture-specific formatting information. + Log message including parameter placeholders. + Parameter array. + Exception information. + + + + Gets the unique identifier of log event which is automatically generated + and monotonously increasing. + + + + + Gets or sets the timestamp of the logging event. + + + + + Gets or sets the level of the logging event. + + + + + Gets a value indicating whether stack trace has been set for this event. + + + + + Gets the stack frame of the method that did the logging. + + + + + Gets the number index of the stack frame that represents the user + code (not the NLog code). + + + + + Gets the entire stack trace. + + + + + Gets the callsite class name + + + + + Gets the callsite member function name + + + + + Gets the callsite source file path + + + + + Gets the callsite source file line number + + + + + Gets or sets the exception information. + + + + + Gets or sets the logger name. + + + + + Gets the logger short name. + + This property was marked as obsolete on NLog 2.0 and it may be removed in a future release. + + + + Gets or sets the log message including any parameter placeholders. + + + + + Gets or sets the parameter values or null if no parameters have been specified. + + + + + Gets or sets the format provider that was provided while logging or + when no formatProvider was specified. + + + + + Gets or sets the message formatter for generating + Uses string.Format(...) when nothing else has been configured. + + + + + Gets the formatted message. + + + + + Checks if any per-event properties (Without allocation) + + + + + Gets the dictionary of per-event context properties. + + + + + Gets the dictionary of per-event context properties. + Internal helper for the PropertiesDictionary type. + + Create the event-properties dictionary, even if no initial template parameters + Provided when having parsed the message template and capture template parameters (else null) + + + + + Gets the named parameters extracted from parsing as MessageTemplate + + + + + Gets the dictionary of per-event context properties. + + This property was marked as obsolete on NLog 2.0 and it may be removed in a future release. + + + + Creates the null event. + + Null log event. + + + + Creates the log event. + + The log level. + Name of the logger. + The message. + Instance of . + + + + Creates the log event. + + The log level. + Name of the logger. + The format provider. + The message. + The parameters. + Instance of . + + + + Creates the log event. + + The log level. + Name of the logger. + The format provider. + The message. + Instance of . + + + + Creates the log event. + + The log level. + Name of the logger. + The message. + The exception. + Instance of . + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Creates the log event. + + The log level. + Name of the logger. + The exception. + The format provider. + The message. + Instance of . + + + + Creates the log event. + + The log level. + Name of the logger. + The exception. + The format provider. + The message. + The parameters. + Instance of . + + + + Creates from this by attaching the specified asynchronous continuation. + + The asynchronous continuation. + Instance of with attached continuation. + + + + Returns a string representation of this log event. + + String representation of the log event. + + + + Sets the stack trace for the event info. + + The stack trace. + Index of the first user stack frame within the stack trace. + + + + Sets the details retrieved from the Caller Information Attributes + + + + + + + + + Set the + + true = Always, false = Never, null = Auto Detect + + + + Specialized LogFactory that can return instances of custom logger types. + + The type of the logger to be returned. Must inherit from . + + + + Gets the logger with type . + + The logger name. + An instance of . + + + + Gets a custom logger with the name of the current class and type . + + An instance of . + This is a slow-running method. + Make sure you're not doing this in a loop. + + + + Creates and manages instances of objects. + + + + + Internal for unit tests + + + + + Overwrite possible file paths (including filename) for possible NLog config files. + When this property is null, the default file paths ( are used. + + + + + Occurs when logging changes. + + + + + Occurs when logging gets reloaded. + + + + + Initializes static members of the LogManager class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The config. + + + + Initializes a new instance of the class. + + The config loader + + + + Gets the current . + + + + + Gets or sets a value indicating whether exceptions should be thrown. See also . + + A value of true if exception should be thrown; otherwise, false. + By default exceptions are not thrown under any circumstances. + + + + Gets or sets a value indicating whether should be thrown. + + If null then is used. + + A value of true if exception should be thrown; otherwise, false. + + This option is for backwards-compatiblity. + By default exceptions are not thrown under any circumstances. + + + + + Gets or sets a value indicating whether Variables should be kept on configuration reload. + Default value - false. + + + + + Gets or sets the current logging configuration. After setting this property all + existing loggers will be re-configured, so there is no need to call + manually. + + + + + Gets or sets the global log level threshold. Log events below this threshold are not logged. + + + + + Gets the default culture info to use as . + + + Specific culture info or null to use + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting + unmanaged resources. + + + + + Creates a logger that discards all log messages. + + Null logger instance. + + + + Gets the logger with the name of the current class. + + The logger. + This is a slow-running method. + Make sure you're not doing this in a loop. + + + + Gets the logger with the name of the current class. + + The logger with type . + Type of the logger + This is a slow-running method. + Make sure you're not doing this in a loop. + + + + Gets a custom logger with the name of the current class. Use to pass the type of the needed Logger. + + The type of the logger to create. The type must inherit from + The logger of type . + This is a slow-running method. Make sure you are not calling this method in a + loop. + + + + Gets the specified named logger. + + Name of the logger. + The logger reference. Multiple calls to GetLogger with the same argument + are not guaranteed to return the same logger reference. + + + + Gets the specified named logger. + + Name of the logger. + Type of the logger + The logger reference with type . Multiple calls to GetLogger with the same argument + are not guaranteed to return the same logger reference. + + + + Gets the specified named logger. Use to pass the type of the needed Logger. + + Name of the logger. + The type of the logger to create. The type must inherit from . + The logger of type . Multiple calls to GetLogger with the + same argument aren't guaranteed to return the same logger reference. + + + + Loops through all loggers previously returned by GetLogger and recalculates their + target and filter list. Useful after modifying the configuration programmatically + to ensure that all loggers have been properly configured. + + + + + Flush any pending log messages (in case of asynchronous targets) with the default timeout of 15 seconds. + + + + + Flush any pending log messages (in case of asynchronous targets). + + Maximum time to allow for the flush. Any messages after that time + will be discarded. + + + + Flush any pending log messages (in case of asynchronous targets). + + Maximum time to allow for the flush. Any messages + after that time will be discarded. + + + + Flush any pending log messages (in case of asynchronous targets). + + The asynchronous continuation. + + + + Flush any pending log messages (in case of asynchronous targets). + + The asynchronous continuation. + Maximum time to allow for the flush. Any messages + after that time will be discarded. + + + + Flush any pending log messages (in case of asynchronous targets). + + The asynchronous continuation. + Maximum time to allow for the flush. Any messages after that time will be discarded. + + + + Decreases the log enable counter and if it reaches -1 the logs are disabled. + + + Logging is enabled if the number of calls is greater than + or equal to calls. + + This method was marked as obsolete on NLog 4.0 and it may be removed in a future release. + + An object that implements IDisposable whose Dispose() method re-enables logging. + To be used with C# using () statement. + + + + Increases the log enable counter and if it reaches 0 the logs are disabled. + + + Logging is enabled if the number of calls is greater than + or equal to calls. + + This method was marked as obsolete on NLog 4.0 and it may be removed in a future release. + + + + + Decreases the log enable counter and if it reaches -1 the logs are disabled. + + + Logging is enabled if the number of calls is greater than + or equal to calls. + + An object that implements IDisposable whose Dispose() method re-enables logging. + To be used with C# using () statement. + + + + Increases the log enable counter and if it reaches 0 the logs are disabled. + + Logging is enabled if the number of calls is greater + than or equal to calls. + + + + Returns if logging is currently enabled. + + A value of if logging is currently enabled, + otherwise. + Logging is enabled if the number of calls is greater + than or equal to calls. + + + + Raises the event when the configuration is reloaded. + + Event arguments. + + + + Raises the event when the configuration is reloaded. + + Event arguments + + + + Currently this logfactory is disposing? + + + + + Releases unmanaged and - optionally - managed resources. + + True to release both managed and unmanaged resources; + false to release only unmanaged resources. + + + + Get file paths (including filename) for the possible NLog config files. + + The filepaths to the possible config file + + + + Overwrite the paths (including filename) for the possible NLog config files. + + The filepaths to the possible config file + + + + Clear the candidate file paths and return to the defaults. + + + + + Loads logging configuration from file (Currently only XML configuration files supported) + + Configuration file to be read + LogFactory instance for fluent interface + + + + Logger cache key. + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Determines if two objects are equal in value. + + Other object to compare to. + True if objects are equal, false otherwise. + + + + Determines if two objects of the same type are equal in value. + + Other object to compare to. + True if objects are equal, false otherwise. + + + + Logger cache. + + + + + Inserts or updates. + + + + + + + Internal for unit tests + + + + + Enables logging in implementation. + + + + + Initializes a new instance of the class. + + The factory. + + + + Enables logging. + + + + + Logging methods which only are executed when the DEBUG conditional compilation symbol is set. + + Remarks: + The DEBUG conditional compilation symbol is default enabled (only) in a debug build. + + If the DEBUG conditional compilation symbol isn't set in the calling library, the compiler will remove all the invocations to these methods. + This could lead to better performance. + + See: https://msdn.microsoft.com/en-us/library/4xssyw96%28v=vs.90%29.aspx + + + Provides logging interface and utility functions. + + + Auto-generated Logger members for binary compatibility with NLog 1.0. + + + Provides logging interface and utility functions. + + + + + Writes the diagnostic message at the Debug level using the specified format provider and format parameters. + + + Writes the diagnostic message at the Debug level. + Only executed when the DEBUG conditional compilation symbol is set. + Type of the value. + The value to be written. + + + + Writes the diagnostic message at the Debug level. + Only executed when the DEBUG conditional compilation symbol is set. + Type of the value. + An IFormatProvider that supplies culture-specific formatting information. + The value to be written. + + + + Writes the diagnostic message at the Debug level. + Only executed when the DEBUG conditional compilation symbol is set. + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Debug level. + Only executed when the DEBUG conditional compilation symbol is set. + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message and exception at the Debug level. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message at the Debug level using the specified parameters and formatting them with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the Debug level. + Only executed when the DEBUG conditional compilation symbol is set. + Log message. + + + + Writes the diagnostic message at the Debug level using the specified parameters. + Only executed when the DEBUG conditional compilation symbol is set. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the Debug level using the specified parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + The type of the argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified parameter. + Only executed when the DEBUG conditional compilation symbol is set. + The type of the argument. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified arguments formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + The type of the first argument. + The type of the second argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Debug level using the specified parameters. + Only executed when the DEBUG conditional compilation symbol is set. + The type of the first argument. + The type of the second argument. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Debug level using the specified arguments formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + The type of the first argument. + The type of the second argument. + The type of the third argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Debug level using the specified parameters. + Only executed when the DEBUG conditional compilation symbol is set. + The type of the first argument. + The type of the second argument. + The type of the third argument. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Debug level. + Only executed when the DEBUG conditional compilation symbol is set. + A to be written. + + + + Writes the diagnostic message at the Debug level. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + + + + Writes the diagnostic message at the Debug level using the specified parameters. + Only executed when the DEBUG conditional compilation symbol is set. + A containing format items. + First argument to format. + Second argument to format. + + + + Writes the diagnostic message at the Debug level using the specified parameters. + Only executed when the DEBUG conditional compilation symbol is set. + A containing format items. + First argument to format. + Second argument to format. + Third argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified format provider and format parameters. + + + Writes the diagnostic message at the Trace level. + Only executed when the DEBUG conditional compilation symbol is set. + Type of the value. + The value to be written. + + + + Writes the diagnostic message at the Trace level. + Only executed when the DEBUG conditional compilation symbol is set. + Type of the value. + An IFormatProvider that supplies culture-specific formatting information. + The value to be written. + + + + Writes the diagnostic message at the Trace level. + Only executed when the DEBUG conditional compilation symbol is set. + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Trace level. + Only executed when the DEBUG conditional compilation symbol is set. + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message and exception at the Trace level. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message at the Trace level using the specified parameters and formatting them with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the Trace level. + Only executed when the DEBUG conditional compilation symbol is set. + Log message. + + + + Writes the diagnostic message at the Trace level using the specified parameters. + Only executed when the DEBUG conditional compilation symbol is set. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the Trace level using the specified parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + The type of the argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified parameter. + Only executed when the DEBUG conditional compilation symbol is set. + The type of the argument. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified arguments formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + The type of the first argument. + The type of the second argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Trace level using the specified parameters. + Only executed when the DEBUG conditional compilation symbol is set. + The type of the first argument. + The type of the second argument. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Trace level using the specified arguments formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + The type of the first argument. + The type of the second argument. + The type of the third argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Trace level using the specified parameters. + Only executed when the DEBUG conditional compilation symbol is set. + The type of the first argument. + The type of the second argument. + The type of the third argument. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Trace level. + Only executed when the DEBUG conditional compilation symbol is set. + A to be written. + + + + Writes the diagnostic message at the Trace level. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + + + + Writes the diagnostic message at the Trace level using the specified parameters. + Only executed when the DEBUG conditional compilation symbol is set. + A containing format items. + First argument to format. + Second argument to format. + + + + Writes the diagnostic message at the Trace level using the specified parameters. + Only executed when the DEBUG conditional compilation symbol is set. + A containing format items. + First argument to format. + Second argument to format. + Third argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + Only executed when the DEBUG conditional compilation symbol is set. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + Only executed when the DEBUG conditional compilation symbol is set. + A containing one format item. + The argument to format. + + + + Gets a value indicating whether logging is enabled for the Trace level. + + A value of if logging is enabled for the Trace level, otherwise it returns . + + + + Gets a value indicating whether logging is enabled for the Debug level. + + A value of if logging is enabled for the Debug level, otherwise it returns . + + + + Gets a value indicating whether logging is enabled for the Info level. + + A value of if logging is enabled for the Info level, otherwise it returns . + + + + Gets a value indicating whether logging is enabled for the Warn level. + + A value of if logging is enabled for the Warn level, otherwise it returns . + + + + Gets a value indicating whether logging is enabled for the Error level. + + A value of if logging is enabled for the Error level, otherwise it returns . + + + + Gets a value indicating whether logging is enabled for the Fatal level. + + A value of if logging is enabled for the Fatal level, otherwise it returns . + + + + Writes the diagnostic message at the Trace level using the specified format provider and format parameters. + + + Writes the diagnostic message at the Trace level. + + Type of the value. + The value to be written. + + + + Writes the diagnostic message at the Trace level. + + Type of the value. + An IFormatProvider that supplies culture-specific formatting information. + The value to be written. + + + + Writes the diagnostic message at the Trace level. + + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Trace level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message at the Trace level using the specified parameters and formatting them with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the Trace level. + + Log message. + + + + Writes the diagnostic message at the Trace level using the specified parameters. + + A containing format items. + Arguments to format. + + + + Writes the diagnostic message and exception at the Trace level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message and exception at the Trace level. + + A to be written. + An exception to be logged. + + + + Writes the diagnostic message and exception at the Trace level. + + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message and exception at the Trace level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message at the Trace level using the specified parameter and formatting it with the supplied format provider. + + The type of the argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified parameter. + + The type of the argument. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Trace level using the specified parameters. + + The type of the first argument. + The type of the second argument. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Trace level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Trace level using the specified parameters. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Debug level using the specified format provider and format parameters. + + + Writes the diagnostic message at the Debug level. + + Type of the value. + The value to be written. + + + + Writes the diagnostic message at the Debug level. + + Type of the value. + An IFormatProvider that supplies culture-specific formatting information. + The value to be written. + + + + Writes the diagnostic message at the Debug level. + + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Debug level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message at the Debug level using the specified parameters and formatting them with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the Debug level. + + Log message. + + + + Writes the diagnostic message at the Debug level using the specified parameters. + + A containing format items. + Arguments to format. + + + + Writes the diagnostic message and exception at the Debug level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message and exception at the Debug level. + + A to be written. + An exception to be logged. + + + + Writes the diagnostic message and exception at the Debug level. + + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message and exception at the Debug level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message at the Debug level using the specified parameter and formatting it with the supplied format provider. + + The type of the argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified parameter. + + The type of the argument. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Debug level using the specified parameters. + + The type of the first argument. + The type of the second argument. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Debug level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Debug level using the specified parameters. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Info level using the specified format provider and format parameters. + + + Writes the diagnostic message at the Info level. + + Type of the value. + The value to be written. + + + + Writes the diagnostic message at the Info level. + + Type of the value. + An IFormatProvider that supplies culture-specific formatting information. + The value to be written. + + + + Writes the diagnostic message at the Info level. + + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Info level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message at the Info level using the specified parameters and formatting them with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the Info level. + + Log message. + + + + Writes the diagnostic message at the Info level using the specified parameters. + + A containing format items. + Arguments to format. + + + + Writes the diagnostic message and exception at the Info level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message and exception at the Info level. + + A to be written. + An exception to be logged. + + + + Writes the diagnostic message and exception at the Info level. + + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message and exception at the Info level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message at the Info level using the specified parameter and formatting it with the supplied format provider. + + The type of the argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified parameter. + + The type of the argument. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Info level using the specified parameters. + + The type of the first argument. + The type of the second argument. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Info level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Info level using the specified parameters. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Warn level using the specified format provider and format parameters. + + + Writes the diagnostic message at the Warn level. + + Type of the value. + The value to be written. + + + + Writes the diagnostic message at the Warn level. + + Type of the value. + An IFormatProvider that supplies culture-specific formatting information. + The value to be written. + + + + Writes the diagnostic message at the Warn level. + + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Warn level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message at the Warn level using the specified parameters and formatting them with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the Warn level. + + Log message. + + + + Writes the diagnostic message at the Warn level using the specified parameters. + + A containing format items. + Arguments to format. + + + + Writes the diagnostic message and exception at the Warn level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message and exception at the Warn level. + + A to be written. + An exception to be logged. + + + + Writes the diagnostic message and exception at the Warn level. + + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message and exception at the Warn level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message at the Warn level using the specified parameter and formatting it with the supplied format provider. + + The type of the argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified parameter. + + The type of the argument. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Warn level using the specified parameters. + + The type of the first argument. + The type of the second argument. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Warn level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Warn level using the specified parameters. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Error level using the specified format provider and format parameters. + + + Writes the diagnostic message at the Error level. + + Type of the value. + The value to be written. + + + + Writes the diagnostic message at the Error level. + + Type of the value. + An IFormatProvider that supplies culture-specific formatting information. + The value to be written. + + + + Writes the diagnostic message at the Error level. + + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Error level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message at the Error level using the specified parameters and formatting them with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the Error level. + + Log message. + + + + Writes the diagnostic message at the Error level using the specified parameters. + + A containing format items. + Arguments to format. + + + + Writes the diagnostic message and exception at the Error level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message and exception at the Error level. + + A to be written. + An exception to be logged. + + + + Writes the diagnostic message and exception at the Error level. + + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message and exception at the Error level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message at the Error level using the specified parameter and formatting it with the supplied format provider. + + The type of the argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified parameter. + + The type of the argument. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Error level using the specified parameters. + + The type of the first argument. + The type of the second argument. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Error level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Error level using the specified parameters. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified format provider and format parameters. + + + Writes the diagnostic message at the Fatal level. + + Type of the value. + The value to be written. + + + + Writes the diagnostic message at the Fatal level. + + Type of the value. + An IFormatProvider that supplies culture-specific formatting information. + The value to be written. + + + + Writes the diagnostic message at the Fatal level. + + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the Fatal level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message at the Fatal level using the specified parameters and formatting them with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the Fatal level. + + Log message. + + + + Writes the diagnostic message at the Fatal level using the specified parameters. + + A containing format items. + Arguments to format. + + + + Writes the diagnostic message and exception at the Fatal level. + + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message and exception at the Fatal level. + + A to be written. + An exception to be logged. + + + + Writes the diagnostic message and exception at the Fatal level. + + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message and exception at the Fatal level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + An exception to be logged. + Arguments to format. + + + + Writes the diagnostic message at the Fatal level using the specified parameter and formatting it with the supplied format provider. + + The type of the argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified parameter. + + The type of the argument. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified parameters. + + The type of the first argument. + The type of the second argument. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified parameters. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the specified level. + + The log level. + A to be written. + + + + Writes the diagnostic message at the specified level. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + + + + Writes the diagnostic message at the specified level using the specified parameters. + + The log level. + A containing format items. + First argument to format. + Second argument to format. + + + + Writes the diagnostic message at the specified level using the specified parameters. + + The log level. + A containing format items. + First argument to format. + Second argument to format. + Third argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter and formatting it with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified value as a parameter. + + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level. + + A to be written. + + + + Writes the diagnostic message at the Trace level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + + + + Writes the diagnostic message at the Trace level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + + + + Writes the diagnostic message at the Trace level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + Third argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Trace level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level. + + A to be written. + + + + Writes the diagnostic message at the Debug level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + + + + Writes the diagnostic message at the Debug level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + + + + Writes the diagnostic message at the Debug level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + Third argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Debug level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level. + + A to be written. + + + + Writes the diagnostic message at the Info level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + + + + Writes the diagnostic message at the Info level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + + + + Writes the diagnostic message at the Info level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + Third argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Info level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level. + + A to be written. + + + + Writes the diagnostic message at the Warn level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + + + + Writes the diagnostic message at the Warn level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + + + + Writes the diagnostic message at the Warn level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + Third argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Warn level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level. + + A to be written. + + + + Writes the diagnostic message at the Error level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + + + + Writes the diagnostic message at the Error level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + + + + Writes the diagnostic message at the Error level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + Third argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Error level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level. + + A to be written. + + + + Writes the diagnostic message at the Fatal level. + + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + + + + Writes the diagnostic message at the Fatal level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified parameters. + + A containing format items. + First argument to format. + Second argument to format. + Third argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter and formatting it with the supplied format provider. + + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the Fatal level using the specified value as a parameter. + + A containing one format item. + The argument to format. + + + + Initializes a new instance of the class. + + + + + Occurs when logger configuration changes. + + + + + Gets the name of the logger. + + + + + Gets the factory that created this logger. + + + + + Collection of context properties for the Logger. The logger will append it for all log events + + + It is recommended to use for modifying context properties + when same named logger is used at multiple locations or shared by different thread contexts. + + + + + Gets a value indicating whether logging is enabled for the specified level. + + Log level to be checked. + A value of if logging is enabled for the specified level, otherwise it returns . + + + + Creates new logger that automatically appends the specified property to all log events (without changing current logger) + + Property Name + Property Value + New Logger object that automatically appends specified property + + + + Updates the specified context property for the current logger. The logger will append it for all log events. + + It could be rendered with ${event-properties:YOURNAME} + + With property, all properties could be changed. + + + Will affect all locations/contexts that makes use of the same named logger object. + + Property Name + Property Value + + It is recommended to use for modifying context properties + when same named logger is used at multiple locations or shared by different thread contexts. + + + + + Writes the specified diagnostic message. + + Log event. + + + + Writes the specified diagnostic message. + + The name of the type that wraps Logger. + Log event. + + + + Writes the diagnostic message at the specified level using the specified format provider and format parameters. + + + Writes the diagnostic message at the specified level. + + Type of the value. + The log level. + The value to be written. + + + + Writes the diagnostic message at the specified level. + + Type of the value. + The log level. + An IFormatProvider that supplies culture-specific formatting information. + The value to be written. + + + + Writes the diagnostic message at the specified level. + + The log level. + A function returning message to be written. Function is not evaluated if logging is not enabled. + + + + Writes the diagnostic message and exception at the specified level. + + The log level. + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message at the specified level using the specified parameters and formatting them with the supplied format provider. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message at the specified level. + + The log level. + Log message. + + + + Writes the diagnostic message at the specified level using the specified parameters. + + The log level. + A containing format items. + Arguments to format. + + + + Writes the diagnostic message and exception at the specified level. + + The log level. + A to be written. + An exception to be logged. + This method was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Writes the diagnostic message and exception at the specified level. + + The log level. + A to be written. + Arguments to format. + An exception to be logged. + + + + Writes the diagnostic message and exception at the specified level. + + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A to be written. + Arguments to format. + An exception to be logged. + + + + Writes the diagnostic message at the specified level using the specified parameter and formatting it with the supplied format provider. + + The type of the argument. + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified parameter. + + The type of the argument. + The log level. + A containing one format item. + The argument to format. + + + + Writes the diagnostic message at the specified level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the specified level using the specified parameters. + + The type of the first argument. + The type of the second argument. + The log level. + A containing one format item. + The first argument to format. + The second argument to format. + + + + Writes the diagnostic message at the specified level using the specified arguments formatting it with the supplied format provider. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + The log level. + An IFormatProvider that supplies culture-specific formatting information. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Writes the diagnostic message at the specified level using the specified parameters. + + The type of the first argument. + The type of the second argument. + The type of the third argument. + The log level. + A containing one format item. + The first argument to format. + The second argument to format. + The third argument to format. + + + + Runs the provided action. If the action throws, the exception is logged at Error level. The exception is not propagated outside of this method. + + Action to execute. + + + + Runs the provided function and returns its result. If an exception is thrown, it is logged at Error level. + The exception is not propagated outside of this method; a default value is returned instead. + + Return type of the provided function. + Function to run. + Result returned by the provided function or the default value of type in case of exception. + + + + Runs the provided function and returns its result. If an exception is thrown, it is logged at Error level. + The exception is not propagated outside of this method; a fallback value is returned instead. + + Return type of the provided function. + Function to run. + Fallback value to return in case of exception. + Result returned by the provided function or fallback value in case of exception. + + + + Raises the event when the logger is reconfigured. + + Event arguments + + + + Implementation of logging engine. + + + + + Finds first user stack frame in a stack trace + + The stack trace of the logging method invocation + Type of the logger or logger wrapper. This is still Logger if it's a subclass of Logger. + Index of the first user stack frame or 0 if all stack frames are non-user + + + + This is only done for legacy reason, as the correct method-name and line-number should be extracted from the MoveNext-StackFrame + + The stack trace of the logging method invocation + Starting point for skipping async MoveNext-frames + + + + Assembly to skip? + + Find assembly via this frame. + true, we should skip. + + + + Is this the type of the logger? + + get type of this logger in this frame. + Type of the logger. + + + + + Gets the filter result. + + The filter chain. + The log event. + default result if there are no filters, or none of the filters decides. + The result of the filter. + + + + Defines available log levels. + + + + + Trace log level. + + + + + Debug log level. + + + + + Info log level. + + + + + Warn log level. + + + + + Error log level. + + + + + Fatal log level. + + + + + Off log level. + + + + + Gets all the available log levels (Trace, Debug, Info, Warn, Error, Fatal, Off). + + + + + Gets all the log levels that can be used to log events (Trace, Debug, Info, Warn, Error, Fatal) + i.e LogLevel.Off is excluded. + + + + + Initializes a new instance of . + + The log level name. + The log level ordinal number. + + + + Gets the name of the log level. + + + + + Gets the ordinal of the log level. + + + + + Compares two objects + and returns a value indicating whether + the first one is equal to the second one. + + The first level. + The second level. + The value of level1.Ordinal == level2.Ordinal. + + + + Compares two objects + and returns a value indicating whether + the first one is not equal to the second one. + + The first level. + The second level. + The value of level1.Ordinal != level2.Ordinal. + + + + Compares two objects + and returns a value indicating whether + the first one is greater than the second one. + + The first level. + The second level. + The value of level1.Ordinal > level2.Ordinal. + + + + Compares two objects + and returns a value indicating whether + the first one is greater than or equal to the second one. + + The first level. + The second level. + The value of level1.Ordinal >= level2.Ordinal. + + + + Compares two objects + and returns a value indicating whether + the first one is less than the second one. + + The first level. + The second level. + The value of level1.Ordinal < level2.Ordinal. + + + + Compares two objects + and returns a value indicating whether + the first one is less than or equal to the second one. + + The first level. + The second level. + The value of level1.Ordinal <= level2.Ordinal. + + + + Gets the that corresponds to the specified ordinal. + + The ordinal. + The instance. For 0 it returns , 1 gives and so on. + + + + Returns the that corresponds to the supplied . + + The textual representation of the log level. + The enumeration value. + + + + Returns a string representation of the log level. + + Log level name. + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + Value of true if the specified is equal to + this instance; otherwise, false. + + + + Determines whether the specified instance is equal to this instance. + + The to compare with this instance. + Value of true if the specified is equal to + this instance; otherwise, false. + + + + Compares the level to the other object. + + + The object object. + + + A value less than zero when this logger's is + less than the other logger's ordinal, 0 when they are equal and + greater than zero when this ordinal is greater than the + other ordinal. + + + + + Creates and manages instances of objects. + + + + + Internal for unit tests + + + + + Delegate used to set/get the culture in use. + + This delegate marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Gets the instance used in the . + + Could be used to pass the to other methods + + + + Occurs when logging changes. + + + + + Occurs when logging gets reloaded. + + + + + Gets or sets a value indicating whether NLog should throw exceptions. + By default exceptions are not thrown under any circumstances. + + + + + Gets or sets a value indicating whether should be thrown. + + A value of true if exception should be thrown; otherwise, false. + + This option is for backwards-compatibility. + By default exceptions are not thrown under any circumstances. + + + + + + Gets or sets a value indicating whether Variables should be kept on configuration reload. + Default value - false. + + + + + Gets or sets the current logging configuration. + + + + + + Loads logging configuration from file (Currently only XML configuration files supported) + + Configuration file to be read + LogFactory instance for fluent interface + + + + Gets or sets the global log threshold. Log events below this threshold are not logged. + + + + + Gets or sets the default culture to use. + + This property was marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Gets the logger with the name of the current class. + + The logger. + This is a slow-running method. + Make sure you're not doing this in a loop. + + + + Adds the given assembly which will be skipped + when NLog is trying to find the calling method on stack trace. + + The assembly to skip. + + + + Gets a custom logger with the name of the current class. Use to pass the type of the needed Logger. + + The logger class. The class must inherit from . + The logger of type . + This is a slow-running method. + Make sure you're not doing this in a loop. + + + + Creates a logger that discards all log messages. + + Null logger which discards all log messages. + + + + Gets the specified named logger. + + Name of the logger. + The logger reference. Multiple calls to GetLogger with the same argument aren't guaranteed to return the same logger reference. + + + + Gets the specified named custom logger. Use to pass the type of the needed Logger. + + Name of the logger. + The logger class. The class must inherit from . + The logger of type . Multiple calls to GetLogger with the same argument aren't guaranteed to return the same logger reference. + The generic way for this method is + + + + Loops through all loggers previously returned by GetLogger. + and recalculates their target and filter list. Useful after modifying the configuration programmatically + to ensure that all loggers have been properly configured. + + + + + Flush any pending log messages (in case of asynchronous targets) with the default timeout of 15 seconds. + + + + + Flush any pending log messages (in case of asynchronous targets). + + Maximum time to allow for the flush. Any messages after that time will be discarded. + + + + Flush any pending log messages (in case of asynchronous targets). + + Maximum time to allow for the flush. Any messages after that time will be discarded. + + + + Flush any pending log messages (in case of asynchronous targets). + + The asynchronous continuation. + + + + Flush any pending log messages (in case of asynchronous targets). + + The asynchronous continuation. + Maximum time to allow for the flush. Any messages after that time will be discarded. + + + + Flush any pending log messages (in case of asynchronous targets). + + The asynchronous continuation. + Maximum time to allow for the flush. Any messages after that time will be discarded. + + + + Decreases the log enable counter and if it reaches -1 the logs are disabled. + + Logging is enabled if the number of calls is greater + than or equal to calls. + An object that implements IDisposable whose Dispose() method reenables logging. + To be used with C# using () statement. + + + + Increases the log enable counter and if it reaches 0 the logs are disabled. + + Logging is enabled if the number of calls is greater + than or equal to calls. + + + + Checks if logging is currently enabled. + + if logging is currently enabled, + otherwise. + Logging is enabled if the number of calls is greater + than or equal to calls. + + + + Dispose all targets, and shutdown logging. + + + + + Generates a formatted message from the log event + + Log event. + Formatted message + + + + Returns a log message. Used to defer calculation of + the log message until it's actually needed. + + Log message. + + + + Base implementation of a log receiver server which forwards received logs through or a given . + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The log factory. + + + + Processes the log messages. + + The events to process. + + + + Processes the log messages. + + The log events. + + + + Service contract for Log Receiver client. + + This class marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Begins processing of log messages. + + The events. + The callback. + Asynchronous state. + + IAsyncResult value which can be passed to . + + + + + Ends asynchronous processing of log messages. + + The result. + + + + Service contract for Log Receiver client. + + + + + Begins processing of log messages. + + The events. + The callback. + Asynchronous state. + + IAsyncResult value which can be passed to . + + + + + Ends asynchronous processing of log messages. + + The result. + + + + Service contract for Log Receiver server. + + + + + Processes the log messages. + + The events. + + + + Service contract for Log Receiver server. + + + + + Processes the log messages. + + The events. + + + + Service contract for Log Receiver client. + + + + + Begins processing of log messages. + + The events. + The callback. + Asynchronous state. + + IAsyncResult value which can be passed to . + + + + + Ends asynchronous processing of log messages. + + The result. + + + + Client of + + + + + Occurs when the log message processing has completed. + + + + + Occurs when Open operation has completed. + + + + + Occurs when Close operation has completed. + + + + + Enables the user to configure client and service credentials as well as service credential authentication settings for use on the client side of communication. + + + + + Gets the underlying implementation. + + + + + Gets the target endpoint for the service to which the WCF client can connect. + + + + + Opens the client asynchronously. + + + + + Opens the client asynchronously. + + User-specific state. + + + + Closes the client asynchronously. + + + + + Closes the client asynchronously. + + User-specific state. + + + + Processes the log messages asynchronously. + + The events to send. + + + + Processes the log messages asynchronously. + + The events to send. + User-specific state. + + + + Begins processing of log messages. + + The events to send. + The callback. + Asynchronous state. + + IAsyncResult value which can be passed to . + + + + + Ends asynchronous processing of log messages. + + The result. + + + + Instructs the inner channel to display a user interface if one is required to initialize the channel prior to using it. + + + + + Implementation of which forwards received logs through or a given . + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The log factory. + + + + Implementation of which forwards received logs through or a given . + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The log factory. + + + + Internal configuration of Log Receiver Service contracts. + + + + + Wire format for NLog Event. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the client-generated identifier of the event. + + + + + Gets or sets the ordinal of the log level. + + + + + Gets or sets the logger ordinal (index into . + + The logger ordinal. + + + + Gets or sets the time delta (in ticks) between the time of the event and base time. + + + + + Gets or sets the message string index. + + + + + Gets or sets the collection of layout values. + + + + + Gets the collection of indexes into array for each layout value. + + + + + Converts the to . + + The object this is part of.. + The logger name prefix to prepend in front of the logger name. + Converted . + + + + Wire format for NLog event package. + + + + + Gets or sets the name of the client. + + The name of the client. + + + + Gets or sets the base time (UTC ticks) for all events in the package. + + The base time UTC. + + + + Gets or sets the collection of layout names which are shared among all events. + + The layout names. + + + + Gets or sets the collection of logger names. + + The logger names. + + + + Gets or sets the list of events. + + The events. + + + + Converts the events to sequence of objects suitable for routing through NLog. + + The logger name prefix to prepend in front of each logger name. + + Sequence of objects. + + + + + Converts the events to sequence of objects suitable for routing through NLog. + + + Sequence of objects. + + + + + List of strings annotated for more terse serialization. + + + + + Initializes a new instance of the class. + + + + + Log Receiver Client using WCF. + + + This class marked as obsolete before NLog 4.3.11 and it will be removed in a future release. + + It provides an implementation of the legacy interface and it will be completely obsolete when the + ILogReceiverClient is removed. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the endpoint configuration. + + + + Initializes a new instance of the class. + + Name of the endpoint configuration. + The remote address. + + + + Initializes a new instance of the class. + + Name of the endpoint configuration. + The remote address. + + + + Initializes a new instance of the class. + + The binding. + The remote address. + + + + Begins processing of log messages. + + The events to send. + The callback. + Asynchronous state. + + IAsyncResult value which can be passed to . + + + + + Ends asynchronous processing of log messages. + + The result. + + + + Log Receiver Client facade. It allows the use either of the one way or two way + service contract using WCF through its unified interface. + + + Delegating methods are generated with Resharper. + 1. change ProxiedClient to private field (instead of public property) + 2. delegate members + 3. change ProxiedClient back to public property. + + + + + + The client getting proxied + + + + + Do we use one-way or two-way messaging? + + + + + Initializes a new instance of the class. + + Whether to use the one way or two way WCF client. + + + + Initializes a new instance of the class. + + Whether to use the one way or two way WCF client. + Name of the endpoint configuration. + + + + Initializes a new instance of the class. + + Whether to use the one way or two way WCF client. + Name of the endpoint configuration. + The remote address. + + + + Initializes a new instance of the class. + + Whether to use the one way or two way WCF client. + Name of the endpoint configuration. + The remote address. + + + + Initializes a new instance of the class. + + Whether to use the one way or two way WCF client. + The binding. + The remote address. + + + + Causes a communication object to transition immediately from its current state into the closed state. + + + + + Begins an asynchronous operation to close a communication object. + + + The that references the asynchronous close operation. + + The delegate that receives notification of the completion of the asynchronous close operation.An object, specified by the application, that contains state information associated with the asynchronous close operation. was called on an object in the state.The default timeout elapsed before the was able to close gracefully. + + + + Begins an asynchronous operation to close a communication object with a specified timeout. + + + The that references the asynchronous close operation. + + The that specifies how long the send operation has to complete before timing out.The delegate that receives notification of the completion of the asynchronous close operation.An object, specified by the application, that contains state information associated with the asynchronous close operation. was called on an object in the state.The specified timeout elapsed before the was able to close gracefully. + + + + Begins an asynchronous operation to open a communication object. + + + The that references the asynchronous open operation. + + The delegate that receives notification of the completion of the asynchronous open operation.An object, specified by the application, that contains state information associated with the asynchronous open operation.The was unable to be opened and has entered the state.The default open timeout elapsed before the was able to enter the state and has entered the state. + + + + Begins an asynchronous operation to open a communication object within a specified interval of time. + + + The that references the asynchronous open operation. + + The that specifies how long the send operation has to complete before timing out.The delegate that receives notification of the completion of the asynchronous open operation.An object, specified by the application, that contains state information associated with the asynchronous open operation.The was unable to be opened and has entered the state.The specified timeout elapsed before the was able to enter the state and has entered the state. + + + + Begins processing of log messages. + + The events to send. + The callback. + Asynchronous state. + + IAsyncResult value which can be passed to . + + + + + Enables the user to configure client and service credentials as well as service credential authentication settings for use on the client side of communication. + + + + + Causes a communication object to transition from its current state into the closed state. + + The that specifies how long the send operation has to complete before timing out. was called on an object in the state.The timeout elapsed before the was able to close gracefully. + + + + Causes a communication object to transition from its current state into the closed state. + + was called on an object in the state.The default close timeout elapsed before the was able to close gracefully. + + + + Closes the client asynchronously. + + User-specific state. + + + + Closes the client asynchronously. + + + + + Occurs when Close operation has completed. + + + + + Occurs when the communication object completes its transition from the closing state into the closed state. + + + + + Occurs when the communication object first enters the closing state. + + + + + Instructs the inner channel to display a user interface if one is required to initialize the channel prior to using it. + + + + + Completes an asynchronous operation to close a communication object. + + The that is returned by a call to the method. was called on an object in the state.The timeout elapsed before the was able to close gracefully. + + + + Completes an asynchronous operation to open a communication object. + + The that is returned by a call to the method.The was unable to be opened and has entered the state.The timeout elapsed before the was able to enter the state and has entered the state. + + + + Gets the target endpoint for the service to which the WCF client can connect. + + + + + Ends asynchronous processing of log messages. + + The result. + + + + Occurs when the communication object first enters the faulted state. + + + + + Gets the underlying implementation. + + + + + Causes a communication object to transition from the created state into the opened state. + + The was unable to be opened and has entered the state.The default open timeout elapsed before the was able to enter the state and has entered the state. + + + + Causes a communication object to transition from the created state into the opened state within a specified interval of time. + + The that specifies how long the send operation has to complete before timing out.The was unable to be opened and has entered the state.The specified timeout elapsed before the was able to enter the state and has entered the state. + + + + Opens the client asynchronously. + + + + + Opens the client asynchronously. + + User-specific state. + + + + Occurs when Open operation has completed. + + + + + Occurs when the communication object completes its transition from the opening state into the opened state. + + + + + Occurs when the communication object first enters the opening state. + + + + + Processes the log messages asynchronously. + + The events to send. + + + + Processes the log messages asynchronously. + + The events to send. + User-specific state. + + + + Occurs when the log message processing has completed. + + + + + Gets the current state of the communication-oriented object. + + + The value of the of the object. + + + + + Causes a communication object to transition from its current state into the closed state. + + + + + Abstract base class for the WcfLogReceiverXXXWay classes. It can only be + used internally (see internal constructor). It passes off any Channel usage + to the inheriting class. + + Type of the WCF service. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the endpoint configuration. + + + + Initializes a new instance of the class. + + Name of the endpoint configuration. + The remote address. + + + + Initializes a new instance of the class. + + Name of the endpoint configuration. + The remote address. + + + + Initializes a new instance of the class. + + The binding. + The remote address. + + + + Occurs when the log message processing has completed. + + + + + Occurs when Open operation has completed. + + + + + Occurs when Close operation has completed. + + + + + Opens the client asynchronously. + + + + + Opens the client asynchronously. + + User-specific state. + + + + Closes the client asynchronously. + + + + + Closes the client asynchronously. + + User-specific state. + + + + Processes the log messages asynchronously. + + The events to send. + + + + Processes the log messages asynchronously. + + The events to send. + User-specific state. + + + + Begins processing of log messages. + + The events to send. + The callback. + Asynchronous state. + + IAsyncResult value which can be passed to . + + + + + Ends asynchronous processing of log messages. + + The result. + + + + Log Receiver Client using WCF. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the endpoint configuration. + + + + Initializes a new instance of the class. + + Name of the endpoint configuration. + The remote address. + + + + Initializes a new instance of the class. + + Name of the endpoint configuration. + The remote address. + + + + Initializes a new instance of the class. + + The binding. + The remote address. + + + + Begins processing of log messages. + + The events to send. + The callback. + Asynchronous state. + + IAsyncResult value which can be passed to . + + + + + Ends asynchronous processing of log messages. + + The result. + + + + Log Receiver Client using WCF. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the endpoint configuration. + + + + Initializes a new instance of the class. + + Name of the endpoint configuration. + The remote address. + + + + Initializes a new instance of the class. + + Name of the endpoint configuration. + The remote address. + + + + Initializes a new instance of the class. + + The binding. + The remote address. + + + + Begins processing of log messages. + + The events to send. + The callback. + Asynchronous state. + + IAsyncResult value which can be passed to . + + + + + Ends asynchronous processing of log messages. + + The result. + + + + Mapped Diagnostics Context - a thread-local structure that keeps a dictionary + of strings and provides methods to output them in layouts. + + + + + Gets the thread-local dictionary + + Must be true for any subsequent dictionary modification operation + + + + + Sets the current thread MDC item to the specified value. + + Item name. + Item value. + An that can be used to remove the item from the current thread MDC. + + + + Sets the current thread MDC item to the specified value. + + Item name. + Item value. + >An that can be used to remove the item from the current thread MDC. + + + + Sets the current thread MDC item to the specified value. + + Item name. + Item value. + + + + Sets the current thread MDC item to the specified value. + + Item name. + Item value. + + + + Gets the current thread MDC named item, as . + + Item name. + The value of , if defined; otherwise . + If the value isn't a already, this call locks the for reading the needed for converting to . + + + + Gets the current thread MDC named item, as . + + Item name. + The to use when converting a value to a . + The value of , if defined; otherwise . + If is null and the value isn't a already, this call locks the for reading the needed for converting to . + + + + Gets the current thread MDC named item, as . + + Item name. + The value of , if defined; otherwise null. + + + + Returns all item names + + A set of the names of all items in current thread-MDC. + + + + Checks whether the specified item exists in current thread MDC. + + Item name. + A boolean indicating whether the specified exists in current thread MDC. + + + + Removes the specified from current thread MDC. + + Item name. + + + + Clears the content of current thread MDC. + + + + + Async version of Mapped Diagnostics Context - a logical context structure that keeps a dictionary + of strings and provides methods to output them in layouts. Allows for maintaining state across + asynchronous tasks and call contexts. + + + Ideally, these changes should be incorporated as a new version of the MappedDiagnosticsContext class in the original + NLog library so that state can be maintained for multiple threads in asynchronous situations. + + + + + Simulate ImmutableDictionary behavior (which is not yet part of all .NET frameworks). + In future the real ImmutableDictionary could be used here to minimize memory usage and copying time. + + Must be true for any subsequent dictionary modification operation + Prepare dictionary for additional inserts + + + + + Gets the current logical context named item, as . + + Item name. + The value of , if defined; otherwise . + If the value isn't a already, this call locks the for reading the needed for converting to . + + + + Gets the current logical context named item, as . + + Item name. + The to use when converting a value to a string. + The value of , if defined; otherwise . + If is null and the value isn't a already, this call locks the for reading the needed for converting to . + + + + Gets the current logical context named item, as . + + Item name. + The value of , if defined; otherwise null. + + + + Sets the current logical context item to the specified value. + + Item name. + Item value. + >An that can be used to remove the item from the current logical context. + + + + Sets the current logical context item to the specified value. + + Item name. + Item value. + >An that can be used to remove the item from the current logical context. + + + + Sets the current logical context item to the specified value. + + Item name. + Item value. + >An that can be used to remove the item from the current logical context. + + + + Sets the current logical context item to the specified value. + + Item name. + Item value. + + + + Sets the current logical context item to the specified value. + + Item name. + Item value. + + + + Sets the current logical context item to the specified value. + + Item name. + Item value. + + + + Returns all item names + + A collection of the names of all items in current logical context. + + + + Checks whether the specified exists in current logical context. + + Item name. + A boolean indicating whether the specified exists in current logical context. + + + + Removes the specified from current logical context. + + Item name. + + + + Clears the content of current logical context. + + + + + Clears the content of current logical context. + + Free the full slot. + + + + Mapped Diagnostics Context + + This class marked as obsolete before NLog 2.0 and it may be removed in a future release. + + + + Sets the current thread MDC item to the specified value. + + Item name. + Item value. + + + + Gets the current thread MDC named item. + + Item name. + The value of , if defined; otherwise . + If the value isn't a already, this call locks the for reading the needed for converting to . + + + + Gets the current thread MDC named item. + + Item name. + The value of , if defined; otherwise null. + + + + Checks whether the specified item exists in current thread MDC. + + Item name. + A boolean indicating whether the specified item exists in current thread MDC. + + + + Removes the specified item from current thread MDC. + + Item name. + + + + Clears the content of current thread MDC. + + + + + Mark a parameter of a method for message templating + + + + + Specifies which parameter of an annotated method should be treated as message-template-string + + + + + The name of the parameter that should be as treated as message-template-string + + + + + The type of the captured hole + + + + + Not decided + + + + + normal {x} + + + + + Serialize operator {@x} (aka destructure) + + + + + stringification operator {$x} + + + + + A hole that will be replaced with a value + + + + + Constructor + + + + Parameter name sent to structured loggers. + This is everything between "{" and the first of ",:}". + Including surrounding spaces and names that are numbers. + + + Format to render the parameter. + This is everything between ":" and the first unescaped "}" + + + + Type + + + + When the template is positional, this is the parsed name of this parameter. + For named templates, the value of Index is undefined. + + + Alignment to render the parameter, by default 0. + This is the parsed value between "," and the first of ":}" + + + + A fixed value + + + + Number of characters from the original template to copy at the current position. + This can be 0 when the template starts with a hole or when there are multiple consecutive holes. + + + Number of characters to skip in the original template at the current position. + 0 is a special value that mean: 1 escaped char, no hole. It can also happen last when the template ends with a literal. + + + + Combines Literal and Hole + + + + Literal + + + Hole + Uninitialized when = 0. + + + + Description of a single parameter extracted from a MessageTemplate + + + + + Parameter Name extracted from + This is everything between "{" and the first of ",:}". + + + + + Parameter Value extracted from the -array + + + + + Format to render the parameter. + This is everything between ":" and the first unescaped "}" + + + + + Parameter method that should be used to render the parameter + See also + + + + + Returns index for , when + + + + + Constructs a single message template parameter + + Parameter Name + Parameter Value + Parameter Format + + + + Constructs a single message template parameter + + Parameter Name + Parameter Value + Parameter Format + Parameter CaptureType + + + + Parameters extracted from parsing as MessageTemplate + + + + + + + + + + + Gets the parameters at the given index + + + + + Number of parameters + + + + Indicates whether the template should be interpreted as positional + (all holes are numbers) or named. + + + + Indicates whether the template was parsed successful, and there are no unmatched parameters + + + + + Constructor for parsing the message template with parameters + + including any parameter placeholders + All + + + + Constructor for named parameters that already has been parsed + + + + + Create MessageTemplateParameter from + + + + + + + + + + A message template + + + + The original template string. + This is the key passed to structured targets. + + + The list of literal parts, useful for string rendering. + It indicates the number of characters from the original string to print, + then there's a hole with how many chars to skip. + + "Hello {firstName} {lastName}!" + ------------------------------------- + ║P |S ║P|S ║P|S║ + ║6 |11 ║1|10 ║1|0║ + ║Hello |{firstName}║ |{lastName}║!║ + + "{x} * 2 = {2x}" + -------------------- + ║P|S ║P |S ║ + ║0|3 ║7 |4 ║ + ║{x}║ * 2 = |{2x}║ + + The tricky part is escaped braces. They are represented by a skip = 0, + which is interpreted as "move one char forward, no hole". + + "Escaped }} is fun." + ---------------------- + ║P |S║P |S║ + ║9 |0║8 |0║ + ║Escaped }|}║ is fun.|║ + + + + This list of holes. It's used both to fill the string rendering + and to send values along the template to structured targets. + + + Indicates whether the template should be interpreted as positional + (all holes are numbers) or named. + + + + Create a template, which is already parsed + + + + + + + + + Create a template, which is already parsed + + + + + + + + This is for testing only: recreates from the parsed data. + + + + This is for testing only: rebuilds the hole + + Add to this string builder + ref for performance + + + + Parse templates. + + + + + Parse a template. + + Template to be parsed. + When is null. + Template, never null + + + + Gets the current literal/hole in the template + + + + + Clears the enumerator + + + + + Restarts the enumerator of the template + + + + + Moves to the next literal/hole in the template + + Found new element [true/false] + + + + Parse format after hole name/index. Handle the escaped { and } in the format. Don't read the last } + + + + + + Parse templates. + + + + + Parse a template. + + Template to be parsed. + When is null. + Template, never null + + + + Error when parsing a template. + + + + + Current index when the error occurred. + + + + + The template we were parsing + + + + + New exception + + The message to be shown. + Current index when the error occurred. + + + + + Render templates + + + + + Render a template to a string. + + The template. + Culture. + Parameters for the holes. + Do not fallback to StringBuilder.Format for positional templates. + The String Builder destination. + Parameters for the holes. + + + + Render a template to a string. + + The template. + The String Builder destination. + Culture. + Parameters for the holes. + Rendered template, never null. + + + + Convert Render or serialize a value, with optionally backwards-compatible with + + + + Singleton + + + + Serialization of an object, e.g. JSON and append to + + The object to serialize to string. + Parameter Format + Parameter CaptureType + An object that supplies culture-specific formatting information. + Output destination. + Serialize succeeded (true/false) + + + + Format an object to a readable string, or if it's an object, serialize + + The value to convert + + + + + + + + Try serialising a scalar (string, int, NULL) or simple type (IFormattable) + + + + + Serialize Dictionary as JSON like structure, without { and } + + + "FirstOrder"=true, "Previous login"=20-12-2017 14:55:32, "number of tries"=1 + + + formatstring of an item + + + + + + + + + Convert a value to a string with format and append to . + + The value to convert. + Format sting for the value. + Format provider for the value. + Append to this + + + + Nested Diagnostics Context + + This class marked as obsolete on NLog 2.0 and it may be removed in a future release. + + + + Gets the top NDC message but doesn't remove it. + + The top message. . + + + + Gets the top NDC object but doesn't remove it. + + The object from the top of the NDC stack, if defined; otherwise null. + + + + Pushes the specified text on current thread NDC. + + The text to be pushed. + An instance of the object that implements IDisposable that returns the stack to the previous level when IDisposable.Dispose() is called. To be used with C# using() statement. + + + + Pops the top message off the NDC stack. + + The top message which is no longer on the stack. + + + + Pops the top object off the NDC stack. The object is removed from the stack. + + The top object from the NDC stack, if defined; otherwise null. + + + + Clears current thread NDC stack. + + + + + Gets all messages on the stack. + + Array of strings on the stack. + + + + Gets all objects on the NDC stack. The objects are not removed from the stack. + + Array of objects on the stack. + + + + Nested Diagnostics Context - a thread-local structure that keeps a stack + of strings and provides methods to output them in layouts + + + + + Gets the top NDC message but doesn't remove it. + + The top message. . + + + + Gets the top NDC object but doesn't remove it. + + The object at the top of the NDC stack if defined; otherwise null. + + + + Pushes the specified text on current thread NDC. + + The text to be pushed. + An instance of the object that implements IDisposable that returns the stack to the previous level when IDisposable.Dispose() is called. To be used with C# using() statement. + + + + Pushes the specified object on current thread NDC. + + The object to be pushed. + An instance of the object that implements IDisposable that returns the stack to the previous level when IDisposable.Dispose() is called. To be used with C# using() statement. + + + + Pops the top message off the NDC stack. + + The top message which is no longer on the stack. + + + + Pops the top message from the NDC stack. + + The to use when converting the value to a string. + The top message, which is removed from the stack, as a string value. + + + + Pops the top object off the NDC stack. + + The object from the top of the NDC stack, if defined; otherwise null. + + + + Peeks the first object on the NDC stack + + The object from the top of the NDC stack, if defined; otherwise null. + + + + Clears current thread NDC stack. + + + + + Gets all messages on the stack. + + Array of strings on the stack. + + + + Gets all messages from the stack, without removing them. + + The to use when converting a value to a string. + Array of strings. + + + + Gets all objects on the stack. + + Array of objects on the stack. + + + + Resets the stack to the original count during . + + + + + Initializes a new instance of the class. + + The stack. + The previous count. + + + + Reverts the stack to original item count. + + + + + Async version of - a logical context structure that keeps a stack + Allows for maintaining scope across asynchronous tasks and call contexts. + + + + + Pushes the specified value on current stack + + The value to be pushed. + An instance of the object that implements IDisposable that returns the stack to the previous level when IDisposable.Dispose() is called. To be used with C# using() statement. + + + + Pushes the specified value on current stack + + The value to be pushed. + An instance of the object that implements IDisposable that returns the stack to the previous level when IDisposable.Dispose() is called. To be used with C# using() statement. + + + + Pops the top message off the NDLC stack. + + The top message which is no longer on the stack. + this methods returns a object instead of string, this because of backwardscompatibility + + + + Pops the top message from the NDLC stack. + + The to use when converting the value to a string. + The top message, which is removed from the stack, as a string value. + + + + Pops the top message off the current NDLC stack + + The object from the top of the NDLC stack, if defined; otherwise null. + + + + Peeks the top object on the current NDLC stack + + The object from the top of the NDLC stack, if defined; otherwise null. + + + + Peeks the current scope, and returns its start time + + Scope Creation Time + + + + Peeks the first scope, and returns its start time + + Scope Creation Time + + + + Clears current stack. + + + + + Gets all messages on the stack. + + Array of strings on the stack. + + + + Gets all messages from the stack, without removing them. + + The to use when converting a value to a string. + Array of strings. + + + + Gets all objects on the stack. The objects are not removed from the stack. + + Array of objects on the stack. + + + + Exception thrown during NLog configuration. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + Parameters for the message + + + + Initializes a new instance of the class. + + The inner exception. + The message. + Parameters for the message + + + + Initializes a new instance of the class. + + The message. + The inner exception. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + The parameter is null. + + + The class name is null or is zero (0). + + + + + Exception thrown during log event processing. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + Parameters for the message + + + + Initializes a new instance of the class. + + The message. + The inner exception. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + The parameter is null. + + + The class name is null or is zero (0). + + + + + TraceListener which routes all messages through NLog. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the log factory to use when outputting messages (null - use LogManager). + + + + + Gets or sets the default log level. + + + + + Gets or sets the log which should be always used regardless of source level. + + + + + Gets or sets a value indicating whether flush calls from trace sources should be ignored. + + + + + Gets a value indicating whether the trace listener is thread safe. + + + true if the trace listener is thread safe; otherwise, false. The default is false. + + + + Gets or sets a value indicating whether to use auto logger name detected from the stack trace. + + + + + When overridden in a derived class, writes the specified message to the listener you create in the derived class. + + A message to write. + + + + When overridden in a derived class, writes a message to the listener you create in the derived class, followed by a line terminator. + + A message to write. + + + + When overridden in a derived class, closes the output stream so it no longer receives tracing or debugging output. + + + + + Emits an error message. + + A message to emit. + + + + Emits an error message and a detailed error message. + + A message to emit. + A detailed message to emit. + + + + Flushes the output (if is not true) buffer with the default timeout of 15 seconds. + + + + + Writes trace information, a data object and event information to the listener specific output. + + A object that contains the current process ID, thread ID, and stack trace information. + A name used to identify the output, typically the name of the application that generated the trace event. + One of the values specifying the type of event that has caused the trace. + A numeric identifier for the event. + The trace data to emit. + + + + Writes trace information, an array of data objects and event information to the listener specific output. + + A object that contains the current process ID, thread ID, and stack trace information. + A name used to identify the output, typically the name of the application that generated the trace event. + One of the values specifying the type of event that has caused the trace. + A numeric identifier for the event. + An array of objects to emit as data. + + + + Writes trace and event information to the listener specific output. + + A object that contains the current process ID, thread ID, and stack trace information. + A name used to identify the output, typically the name of the application that generated the trace event. + One of the values specifying the type of event that has caused the trace. + A numeric identifier for the event. + + + + Writes trace information, a formatted array of objects and event information to the listener specific output. + + A object that contains the current process ID, thread ID, and stack trace information. + A name used to identify the output, typically the name of the application that generated the trace event. + One of the values specifying the type of event that has caused the trace. + A numeric identifier for the event. + A format string that contains zero or more format items, which correspond to objects in the array. + An object array containing zero or more objects to format. + + + + Writes trace information, a message, and event information to the listener specific output. + + A object that contains the current process ID, thread ID, and stack trace information. + A name used to identify the output, typically the name of the application that generated the trace event. + One of the values specifying the type of event that has caused the trace. + A numeric identifier for the event. + A message to write. + + + + Writes trace information, a message, a related activity identity and event information to the listener specific output. + + A object that contains the current process ID, thread ID, and stack trace information. + A name used to identify the output, typically the name of the application that generated the trace event. + A numeric identifier for the event. + A message to write. + A object identifying a related activity. + + + + Gets the custom attributes supported by the trace listener. + + + A string array naming the custom attributes supported by the trace listener, or null if there are no custom attributes. + + + + + Translates the event type to level from . + + Type of the event. + Translated log level. + + + + Process the log event + The log level. + The name of the logger. + The log message. + The log parameters. + The event id. + The event type. + The related activity id. + + + + + It works as a normal but it discards all messages which an application requests + to be logged. + + It effectively implements the "Null Object" pattern for objects. + + + + + Initializes a new instance of . + + The factory class to be used for the creation of this logger. + + + + Specifies the way archive numbering is performed. + + + + + Sequence style numbering. The most recent archive has the highest number. + + + + + Rolling style numbering (the most recent is always #0 then #1, ..., #N. + + + + + Date style numbering. Archives will be stamped with the prior period + (Year, Month, Day, Hour, Minute) datetime. + + + + + Date and sequence style numbering. + Archives will be stamped with the prior period (Year, Month, Day) datetime. + The most recent archive has the highest number (in combination with the date). + + + + + Abstract Target with async Task support + + + + + How many milliseconds to delay the actual write operation to optimize for batching + + + + + How many seconds a Task is allowed to run before it is cancelled. + + + + + How many attempts to retry the same Task, before it is aborted + + + + + How many milliseconds to wait before next retry (will double with each retry) + + + + + Gets or sets whether to use the locking queue, instead of a lock-free concurrent queue + The locking queue is less concurrent when many logger threads, but reduces memory allocation + + + + + Gets or sets the action to be taken when the lazy writer thread request queue count + exceeds the set limit. + + + + + + Gets or sets the limit on the number of requests in the lazy writer thread request queue. + + + + + + Gets or sets the number of log events that should be processed in a batch + by the lazy writer thread. + + + + + + Task Scheduler used for processing async Tasks + + + + + Constructor + + + + + Initializes the internal queue for pending logevents + + + + + Override this to create the actual logging task + + Example of how to override this method, and call custom async method + + protected override Task WriteAsyncTask(LogEventInfo logEvent, CancellationToken token) + { + return CustomWriteAsync(logEvent, token); + } + + private async Task CustomWriteAsync(LogEventInfo logEvent, CancellationToken token) + { + await MyLogMethodAsync(logEvent, token).ConfigureAwait(false); + } + + + The log event. + The cancellation token + + + + + Override this to create the actual logging task for handling batch of logevents + + A batch of logevents. + The cancellation token + + + + + Handle cleanup after failed write operation + + Exception from previous failed Task + The cancellation token + Number of retries remaining + Time to sleep before retrying + Should attempt retry + + + + Schedules the LogEventInfo for async writing + + The log event. + + + + Write to queue without locking + + + + + + Schedules notification of when all messages has been written + + + + + + Closes Target by updating CancellationToken + + + + + Releases any managed resources + + + + + + Checks the internal queue for the next to create a new task for + + Used for race-condition validation between task-completion and timeout + Signals whether previousTask completed an almost full BatchSize + + + + Generates recursive task-chain to perform retry of writing logevents with increasing retry-delay + + + + + Creates new task to handle the writing of the input + + LogEvents to write + New Task created [true / false] + + + + Handles that scheduled task has completed (successfully or failed), and starts the next pending task + + Task just completed + AsyncContinuation to notify of success or failure + + + + Timer method, that is fired when pending task fails to complete within timeout + + + + + + Sends log messages to the remote instance of Chainsaw application from log4j. + + Documentation on NLog Wiki + +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ This assumes just one target and a single rule. More configuration + options are described here. +

+

+ To set up the log target programmatically use code like this: +

+ +

+ NOTE: If your receiver application is ever likely to be off-line, don't use TCP protocol + or you'll get TCP timeouts and your application will crawl. + Either switch to UDP transport or use AsyncWrapper target + so that your application threads will not be blocked by the timing-out connection attempts. +

+
+
+ + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a name. + + Name of the target. + + + + Color formatting for using ANSI Color Codes + + + + + Not using bold to get light colors, as it has to be cleared + + + + + Not using bold to get light colors, as it has to be cleared (And because it only works for text, and not background) + + + + + Resets both foreground and background color. + + + + + ANSI have 8 color-codes (30-37) by default. The "bright" (or "intense") color-codes (90-97) are extended values not supported by all terminals + + + + + Color formatting for using + and + + + + + Writes log messages to the console with customizable coloring. + + Documentation on NLog Wiki + + + + Should logging being paused/stopped because of the race condition bug in Console.Writeline? + + + Console.Out.Writeline / Console.Error.Writeline could throw 'IndexOutOfRangeException', which is a bug. + See https://stackoverflow.com/questions/33915790/console-out-and-console-error-race-condition-error-in-a-windows-service-written + and https://connect.microsoft.com/VisualStudio/feedback/details/2057284/console-out-probable-i-o-race-condition-issue-in-multi-threaded-windows-service + + Full error: + Error during session close: System.IndexOutOfRangeException: Probable I/ O race condition detected while copying memory. + The I/ O package is not thread safe by default.In multithreaded applications, + a stream must be accessed in a thread-safe way, such as a thread - safe wrapper returned by TextReader's or + TextWriter's Synchronized methods.This also applies to classes like StreamWriter and StreamReader. + + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + Name of the target. + + + + Gets or sets a value indicating whether the error stream (stderr) should be used instead of the output stream (stdout). + + + + + + Gets or sets a value indicating whether to use default row highlighting rules. + + + The default rules are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ConditionForeground ColorBackground Color
level == LogLevel.FatalRedNoChange
level == LogLevel.ErrorYellowNoChange
level == LogLevel.WarnMagentaNoChange
level == LogLevel.InfoWhiteNoChange
level == LogLevel.DebugGrayNoChange
level == LogLevel.TraceDarkGrayNoChange
+
+ +
+ + + The encoding for writing messages to the . + + Has side effect + + + + + Gets or sets a value indicating whether to auto-check if the console is available. + - Disables console writing if Environment.UserInteractive = False (Windows Service) + - Disables console writing if Console Standard Input is not available (Non-Console-App) + + + + + + Gets or sets a value indicating whether to auto-check if the console has been redirected to file + - Disables coloring logic when System.Console.IsOutputRedirected = true + + + + + + Gets or sets a value indicating whether to auto-flush after + + + Normally not required as standard Console.Out will have = true, but not when pipe to file + + + + + Enables output using ANSI Color Codes + + + + + + Gets the row highlighting rules. + + + + + + Gets the word highlighting rules. + + + + + + Initializes the target. + + + + + Closes the target and releases any unmanaged resources. + + + + + + + + Writes the specified log event to the console highlighting entries + and words based on a set of defined rules. + + Log event. + + + + Colored console output color. + + + Note that this enumeration is defined to be binary compatible with + .NET 2.0 System.ConsoleColor + some additions + + + + + Black Color (#000000). + + + + + Dark blue Color (#000080). + + + + + Dark green Color (#008000). + + + + + Dark Cyan Color (#008080). + + + + + Dark Red Color (#800000). + + + + + Dark Magenta Color (#800080). + + + + + Dark Yellow Color (#808000). + + + + + Gray Color (#C0C0C0). + + + + + Dark Gray Color (#808080). + + + + + Blue Color (#0000FF). + + + + + Green Color (#00FF00). + + + + + Cyan Color (#00FFFF). + + + + + Red Color (#FF0000). + + + + + Magenta Color (#FF00FF). + + + + + Yellow Color (#FFFF00). + + + + + White Color (#FFFFFF). + + + + + Don't change the color. + + + + + The row-highlighting condition. + + + + + Initializes static members of the ConsoleRowHighlightingRule class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The condition. + Color of the foreground. + Color of the background. + + + + Gets the default highlighting rule. Doesn't change the color. + + + + + Gets or sets the condition that must be met in order to set the specified foreground and background color. + + + + + + Gets or sets the foreground color. + + + + + + Gets or sets the background color. + + + + + + Checks whether the specified log event matches the condition (if any). + + + Log event. + + + A value of if the condition is not defined or + if it matches, otherwise. + + + + + Writes log messages to the console. + + Documentation on NLog Wiki + +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ This assumes just one target and a single rule. More configuration + options are described here. +

+

+ To set up the log target programmatically use code like this: +

+ +
+
+ + + Should logging being paused/stopped because of the race condition bug in Console.Writeline? + + + Console.Out.Writeline / Console.Error.Writeline could throw 'IndexOutOfRangeException', which is a bug. + See https://stackoverflow.com/questions/33915790/console-out-and-console-error-race-condition-error-in-a-windows-service-written + and https://connect.microsoft.com/VisualStudio/feedback/details/2057284/console-out-probable-i-o-race-condition-issue-in-multi-threaded-windows-service + + Full error: + Error during session close: System.IndexOutOfRangeException: Probable I/ O race condition detected while copying memory. + The I/ O package is not thread safe by default.In multithreaded applications, + a stream must be accessed in a thread-safe way, such as a thread - safe wrapper returned by TextReader's or + TextWriter's Synchronized methods.This also applies to classes like StreamWriter and StreamReader. + + + + + + Gets or sets a value indicating whether to send the log messages to the standard error instead of the standard output. + + + + + + The encoding for writing messages to the . + + Has side effect + + + + + Gets or sets a value indicating whether to auto-check if the console is available + - Disables console writing if Environment.UserInteractive = False (Windows Service) + - Disables console writing if Console Standard Input is not available (Non-Console-App) + + + + + + Gets or sets a value indicating whether to auto-flush after + + + Normally not required as standard Console.Out will have = true, but not when pipe to file + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + Name of the target. + + + + Initializes the target. + + + + + Closes the target and releases any unmanaged resources. + + + + + + + + Writes the specified logging event to the Console.Out or + Console.Error depending on the value of the Error flag. + + The logging event. + + Note that the Error option is not supported on .NET Compact Framework. + + + + + Write to output + + text to be written. + + + + Highlighting rule for Win32 colorful console. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The text to be matched.. + Color of the foreground. + Color of the background. + + + + Gets or sets the regular expression to be matched. You must specify either text or regex. + + + + + + Compile the ? This can improve the performance, but at the costs of more memory usage. If false, the Regex Cache is used. + + + + + + Gets or sets the text to be matched. You must specify either text or regex. + + + + + + Gets or sets a value indicating whether to match whole words only. + + + + + + Gets or sets a value indicating whether to ignore case when comparing texts. + + + + + + Gets or sets the foreground color. + + + + + + Gets or sets the background color. + + + + + + Gets the compiled regular expression that matches either Text or Regex property. Only used when is true. + + Access this property will compile the Regex. + + + + Get regex options. + + Default option to start with. + + + + + Get Expression for a . + + + + + + Information about database command + parameters. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the type of the command. + + The type of the command. + + + + + Gets or sets the connection string to run the command against. If not provided, connection string from the target is used. + + + + + + Gets or sets the command text. + + + + + + Gets or sets a value indicating whether to ignore failures. + + + + + + Gets the collection of parameters. Each parameter contains a mapping + between NLog layout and a database named or positional parameter. + + + + + + Represents a parameter to a Database target. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the parameter. + The parameter layout. + + + + Gets or sets the database parameter name. + + + + + + Gets or sets the layout that should be use to calculate the value for the parameter. + + + + + + Gets or sets the database parameter DbType. + + + + + + Gets or sets the database parameter size. + + + + + + Gets or sets the database parameter precision. + + + + + + Gets or sets the database parameter scale. + + + + + + Gets or sets the type of the parameter. + + + + + + Gets or sets convert format of the database parameter value . + + + + + + Gets or sets the culture used for parsing parameter string-value for type-conversion + + + + + + Writes log messages to the database using an ADO.NET provider. + + + - NETSTANDARD cannot load connectionstrings from .config + + Documentation on NLog Wiki + + + The configuration is dependent on the database type, because + there are differnet methods of specifying connection string, SQL + command and command parameters. + + MS SQL Server using System.Data.SqlClient: + + Oracle using System.Data.OracleClient: + + Oracle using System.Data.OleDBClient: + + To set up the log target programmatically use code like this (an equivalent of MSSQL configuration): + + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target. + + + + Gets or sets the name of the database provider. + + + + The parameter name should be a provider invariant name as registered in machine.config or app.config. Common values are: + +
    +
  • System.Data.SqlClient - SQL Sever Client
  • +
  • System.Data.SqlServerCe.3.5 - SQL Sever Compact 3.5
  • +
  • System.Data.OracleClient - Oracle Client from Microsoft (deprecated in .NET Framework 4)
  • +
  • Oracle.DataAccess.Client - ODP.NET provider from Oracle
  • +
  • System.Data.SQLite - System.Data.SQLite driver for SQLite
  • +
  • Npgsql - Npgsql driver for PostgreSQL
  • +
  • MySql.Data.MySqlClient - MySQL Connector/Net
  • +
+ (Note that provider invariant names are not supported on .NET Compact Framework). + + Alternatively the parameter value can be be a fully qualified name of the provider + connection type (class implementing ) or one of the following tokens: + +
    +
  • sqlserver, mssql, microsoft or msde - SQL Server Data Provider
  • +
  • oledb - OLEDB Data Provider
  • +
  • odbc - ODBC Data Provider
  • +
+
+ +
+ + + Gets or sets the name of the connection string (as specified in <connectionStrings> configuration section. + + + + + + Gets or sets the connection string. When provided, it overrides the values + specified in DBHost, DBUserName, DBPassword, DBDatabase. + + + + + + Gets or sets the connection string using for installation and uninstallation. If not provided, regular ConnectionString is being used. + + + + + + Gets the installation DDL commands. + + + + + + Gets the uninstallation DDL commands. + + + + + + Gets or sets a value indicating whether to keep the + database connection open between the log events. + + + + + + Obsolete - value will be ignored! The logging code always runs outside of transaction. + + Gets or sets a value indicating whether to use database transactions. + Some data providers require this. + + + + This option was removed in NLog 4.0 because the logging code always runs outside of transaction. + This ensures that the log gets written to the database if you rollback the main transaction because of an error and want to log the error. + + + + + Gets or sets the database host name. If the ConnectionString is not provided + this value will be used to construct the "Server=" part of the + connection string. + + + + + + Gets or sets the database user name. If the ConnectionString is not provided + this value will be used to construct the "User ID=" part of the + connection string. + + + + + + Gets or sets the database password. If the ConnectionString is not provided + this value will be used to construct the "Password=" part of the + connection string. + + + + + + Gets or sets the database name. If the ConnectionString is not provided + this value will be used to construct the "Database=" part of the + connection string. + + + + + + Gets or sets the text of the SQL command to be run on each log level. + + + Typically this is a SQL INSERT statement or a stored procedure call. + It should use the database-specific parameters (marked as @parameter + for SQL server or :parameter for Oracle, other data providers + have their own notation) and not the layout renderers, + because the latter is prone to SQL injection attacks. + The layout renderers should be specified as <parameter /> elements instead. + + + + + + Gets or sets the type of the SQL command to be run on each log level. + + + This specifies how the command text is interpreted, as "Text" (default) or as "StoredProcedure". + When using the value StoredProcedure, the commandText-property would + normally be the name of the stored procedure. TableDirect method is not supported in this context. + + + + + + Gets the collection of parameters. Each parameter contains a mapping + between NLog layout and a database named or positional parameter. + + + + + + Performs installation which requires administrative permissions. + + The installation context. + + + + Performs uninstallation which requires administrative permissions. + + The installation context. + + + + Determines whether the item is installed. + + The installation context. + + Value indicating whether the item is installed or null if it is not possible to determine. + + + + + Initializes the target. Can be used by inheriting classes + to initialize logging. + + + + + Set the to use it for opening connections to the database. + + + + + Closes the target and releases any unmanaged resources. + + + + + Writes the specified logging event to the database. It creates + a new database command, prepares parameters for it by calculating + layouts and executes the command. + + The logging event. + + + + NOTE! Obsolete, instead override Write(IList{AsyncLogEventInfo} logEvents) + + Writes an array of logging events to the log target. By default it iterates on all + events and passes them to "Write" method. Inheriting classes can use this method to + optimize batch writes. + + Logging events to be written out. + + + + Writes an array of logging events to the log target. By default it iterates on all + events and passes them to "Write" method. Inheriting classes can use this method to + optimize batch writes. + + Logging events to be written out. + + + + Write logEvent to database + + + + + Build the connectionstring from the properties. + + + Using at first, and falls back to the properties , + , and + + Event to render the layout inside the properties. + + + + + Create database parameter + + Current command. + Parameter configuration info. + + + + Extract parameter value from the logevent + + Current logevent. + Parameter configuration info. + + + + Create Default Value of Type + + + + + + + A descriptor for an archive created with the DateAndSequence numbering mode. + + + + + The full name of the archive file. + + + + + The parsed date contained in the file name. + + + + + The parsed sequence number contained in the file name. + + + + + Determines whether produces the same string as the current instance's date once formatted with the current instance's date format. + + The date to compare the current object's date to. + True if the formatted dates are equal, otherwise False. + + + + Initializes a new instance of the class. + + + + + Writes log messages to the attached managed debugger. + + +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ This assumes just one target and a single rule. More configuration + options are described here. +

+

+ To set up the log target programmatically use code like this: +

+ +
+
+ + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + Name of the target. + + + + Initializes the target. + + + + + Closes the target and releases any unmanaged resources. + + + + + Writes the specified logging event to the attached debugger. + + The logging event. + + + + Mock target - useful for testing. + + Documentation on NLog Wiki + +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ This assumes just one target and a single rule. More configuration + options are described here. +

+

+ To set up the log target programmatically use code like this: +

+ +
+
+ + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + Name of the target. + + + + Gets the number of times this target has been called. + + + + + + Gets the last message rendered by this target. + + + + + + Increases the number of messages. + + The logging event. + + + + Default class for serialization of values to JSON format. + + + + + Singleton instance of the serializer. + + + + + Private. Use + + + + + Returns a serialization of an object into JSON format. + + The object to serialize to JSON. + Serialized value. + + + + Returns a serialization of an object into JSON format. + + The object to serialize to JSON. + serialisation options + Serialized value. + + + + Serialization of the object in JSON format to the destination StringBuilder + + The object to serialize to JSON. + Write the resulting JSON to this destination. + Object serialized successfully (true/false). + + + + Serialization of the object in JSON format to the destination StringBuilder + + The object to serialize to JSON. + Write the resulting JSON to this destination. + serialisation options + Object serialized successfully (true/false). + + + + Serialization of the object in JSON format to the destination StringBuilder + + The object to serialize to JSON. + Write the resulting JSON to this destination. + serialisation options + The objects in path (Avoid cyclic reference loop). + The current depth (level) of recursion. + Object serialized successfully (true/false). + + + + No quotes needed for this type? + + + + + Checks the object if it is numeric + + TypeCode for the object + Accept fractional types as numeric type. + + + + + Checks input string if it needs JSON escaping, and makes necessary conversion + + Destination Builder + Input string + Should non-ascii characters be encoded + JSON escaped string + + + + Writes log message to the Event Log. + + Documentation on NLog Wiki + +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ This assumes just one target and a single rule. More configuration + options are described here. +

+

+ To set up the log target programmatically use code like this: +

+ +
+
+ + + Max size in characters (limitation of the EventLog API). + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target. + + + + Initializes a new instance of the class. + + . to be used as Source. + + + + Initializes a new instance of the class. + + + + + Gets or sets the name of the machine on which Event Log service is running. + + + + + + Gets or sets the layout that renders event ID. + + + + + + Gets or sets the layout that renders event Category. + + + + + + Optional entrytype. When not set, or when not convertible to then determined by + + + + + + Gets or sets the value to be used as the event Source. + + + By default this is the friendly name of the current AppDomain. + + + + + + Gets or sets the name of the Event Log to write to. This can be System, Application or any user-defined name. + + + + + + Gets or sets the message length limit to write to the Event Log. + + MaxMessageLength cannot be zero or negative + + + + + Gets or sets the maximum Event log size in kilobytes. + + + MaxKilobytes cannot be less than 64 or greater than 4194240 or not a multiple of 64. + If null, the value will not be specified while creating the Event log. + + + + + + Gets or sets the action to take if the message is larger than the option. + + + + + + Performs installation which requires administrative permissions. + + The installation context. + + + + Performs uninstallation which requires administrative permissions. + + The installation context. + + + + Determines whether the item is installed. + + The installation context. + + Value indicating whether the item is installed or null if it is not possible to determine. + + + + + Initializes the target. + + + + + Writes the specified logging event to the event log. + + The logging event. + + + + Get the entry type for logging the message. + + The logging event - for rendering the + + + + Get the source, if and only if the source is fixed. + + null when not + Internal for unit tests + + + + Gets the to write to. + + Event if the source needs to be rendered. + + + + (re-)create an event source, if it isn't there. Works only with fixed source names. + + The source name. If source is not fixed (see , then pass null or . + always throw an Exception when there is an error + + + + A wrapper for Windows event log. + + + + + A wrapper for the property . + + + + + A wrapper for the property . + + + + + A wrapper for the property . + + + + + A wrapper for the property . + + + + + Indicates whether an event log instance is associated. + + + + + A wrapper for the method . + + + + + Creates a new association with an instance of the event log. + + + + + A wrapper for the static method . + + + + + A wrapper for the static method . + + + + + A wrapper for the static method . + + + + + A wrapper for the static method . + + + + + The implementation of , that uses Windows . + + + + + + + + + + + + + + + + + + + + + + + + Creates a new association with an instance of Windows . + + + + + + + + + + + + + + + + + Action that should be taken if the message is greater than + the max message size allowed by the Event Log. + + + + + Truncate the message before writing to the Event Log. + + + + + Split the message and write multiple entries to the Event Log. + + + + + Discard of the message. It will not be written to the Event Log. + + + + + Check if cleanup should be performed on initialize new file + + Skip cleanup when initializing new file, just after having performed archive operation + + Base archive file pattern + Maximum number of archive files that should be kept + True, when archive cleanup is needed + + + + Characters determining the start of the . + + + + + Characters determining the end of the . + + + + + File name which is used as template for matching and replacements. + It is expected to contain a pattern to match. + + + + + The begging position of the + within the . -1 is returned + when no pattern can be found. + + + + + The ending position of the + within the . -1 is returned + when no pattern can be found. + + + + + Replace the pattern with the specified String. + + + + + + + Archives the log-files using a date style numbering. Archives will be stamped with the + prior period (Year, Month, Day, Hour, Minute) datetime. When the number of archive files exceed the obsolete archives are deleted. + + + + + + Archives the log-files using a date and sequence style numbering. Archives will be stamped + with the prior period (Year, Month, Day) datetime. The most recent archive has the highest number (in + combination with the date). + + + When the number of archive files exceed the obsolete archives are deleted. + + + + + + Parse filename with date and sequence pattern + + + dateformat for archive + + the found pattern. When failed, then default + the found pattern. When failed, then default + + + + + Archives the log-files using the provided base-archive-filename. If the base-archive-filename causes + duplicate archive filenames, then sequence-style is automatically enforced. + + Example: + Base Filename trace.log + Next Filename trace.0.log + + The most recent archive has the highest number. When the number of archive files + exceed the obsolete archives are deleted. + + + + + Dynamically converts a non-template archiveFilePath into a correct archiveFilePattern. + Before called the original IFileArchiveMode, that has been wrapped by this + + + + + Determines if the file name as contains a numeric pattern i.e. {#} in it. + + Example: + trace{#}.log Contains the numeric pattern. + trace{###}.log Contains the numeric pattern. + trace{#X#}.log Contains the numeric pattern (See remarks). + trace.log Does not contain the pattern. + + Occasionally, this method can identify the existence of the {#} pattern incorrectly. + File name to be checked. + when the pattern is found; otherwise. + + + + Determine if old archive files should be deleted. + + Maximum number of archive files that should be kept + when old archives should be deleted; otherwise. + + + + Archives the log-files using a rolling style numbering (the most recent is always #0 then + #1, ..., #N. When the number of archive files exceed the obsolete archives + are deleted. + + + + + Replaces the numeric pattern i.e. {#} in a file name with the parameter value. + + File name which contains the numeric pattern. + Value which will replace the numeric pattern. + File name with the value of in the position of the numeric pattern. + + + + Archives the log-files using a sequence style numbering. The most recent archive has the + highest number. When the number of archive files exceed the obsolete + archives are deleted. + + + + + Modes of archiving files based on time. + + + + + Don't archive based on time. + + + + + AddToArchive every year. + + + + + AddToArchive every month. + + + + + AddToArchive daily. + + + + + AddToArchive every hour. + + + + + AddToArchive every minute. + + + + + AddToArchive every Sunday. + + + + + AddToArchive every Monday. + + + + + AddToArchive every Tuesday. + + + + + AddToArchive every Wednesday. + + + + + AddToArchive every Thursday. + + + + + AddToArchive every Friday. + + + + + AddToArchive every Saturday. + + + + + Type of filepath + + + + + Detect of relative or absolute + + + + + Relative path + + + + + Absolute path + + Best for performance + + + + Writes log messages to one or more files. + + Documentation on NLog Wiki + + + + Default clean up period of the initialized files. When a file exceeds the clean up period is removed from the list. + + Clean up period is defined in days. + + + + The maximum number of initialized files before clean up procedures are initiated, + to keep the number of initialized files to a minimum. Chose 25 to cater for monthly rolling of log-files. + + + + + This value disables file archiving based on the size. + + + + + Holds the initialised files each given time by the instance. Against each file, the last write time is stored. + + Last write time is store in local time (no UTC). + + + + List of the associated file appenders with the instance. + + + + + The number of initialized files at any one time. + + + + + The maximum number of archive files that should be kept. + + + + + The filename as target + + + + + The archive file name as target + + + + + The date of the previous log event. + + + + + The file name of the previous log event. + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + Name of the target. + + + + Gets or sets the name of the file to write to. + + + This FileName string is a layout which may include instances of layout renderers. + This lets you use a single target to write to multiple files. + + + The following value makes NLog write logging events to files based on the log level in the directory where + the application runs. + ${basedir}/${level}.log + All Debug messages will go to Debug.log, all Info messages will go to Info.log and so on. + You can combine as many of the layout renderers as you want to produce an arbitrary log file name. + + + + + + Cleanup invalid values in a filename, e.g. slashes in a filename. If set to true, this can impact the performance of massive writes. + If set to false, nothing gets written when the filename is wrong. + + + + + + Is the an absolute or relative path? + + + + + + Gets or sets a value indicating whether to create directories if they do not exist. + + + Setting this to false may improve performance a bit, but you'll receive an error + when attempting to write to a directory that's not present. + + + + + + Gets or sets a value indicating whether to delete old log file on startup. + + + This option works only when the "FileName" parameter denotes a single file. + + + + + + Gets or sets a value indicating whether to replace file contents on each write instead of appending log message at the end. + + + + + + Gets or sets a value indicating whether to keep log file open instead of opening and closing it on each logging event. + + + Setting this property to True helps improve performance. + + + + + + Gets or sets the maximum number of log filenames that should be stored as existing. + + + The bigger this number is the longer it will take to write each log record. The smaller the number is + the higher the chance that the clean function will be run when no new files have been opened. + + + + + Gets or sets a value indicating whether to enable log file(s) to be deleted. + + + + + + Gets or sets the file attributes (Windows only). + + + + + + Gets or sets the line ending mode. + + + + + + Gets or sets a value indicating whether to automatically flush the file buffers after each log message. + + + + + + Gets or sets the number of files to be kept open. Setting this to a higher value may improve performance + in a situation where a single File target is writing to many files + (such as splitting by level or by logger). + + + The files are managed on a LRU (least recently used) basis, which flushes + the files that have not been used for the longest period of time should the + cache become full. As a rule of thumb, you shouldn't set this parameter to + a very high value. A number like 10-15 shouldn't be exceeded, because you'd + be keeping a large number of files open which consumes system resources. + + + + + + Gets or sets the maximum number of seconds that files are kept open. If this number is negative the files are + not automatically closed after a period of inactivity. + + + + + + Gets or sets the maximum number of seconds before open files are flushed. If this number is negative or zero + the files are not flushed by timer. + + + + + + Gets or sets the log file buffer size in bytes. + + + + + + Gets or sets the file encoding. + + + + + + Gets or sets whether or not this target should just discard all data that its asked to write. + Mostly used for when testing NLog Stack except final write + + + + + + Gets or sets a value indicating whether concurrent writes to the log file by multiple processes on the same host. + + + This makes multi-process logging possible. NLog uses a special technique + that lets it keep the files open for writing. + + + + + + Gets or sets a value indicating whether concurrent writes to the log file by multiple processes on different network hosts. + + + This effectively prevents files from being kept open. + + + + + + Gets or sets a value indicating whether to write BOM (byte order mark) in created files + + + + + + Gets or sets the number of times the write is appended on the file before NLog + discards the log message. + + + + + + Gets or sets the delay in milliseconds to wait before attempting to write to the file again. + + + The actual delay is a random value between 0 and the value specified + in this parameter. On each failed attempt the delay base is doubled + up to times. + + + Assuming that ConcurrentWriteAttemptDelay is 10 the time to wait will be:

+ a random value between 0 and 10 milliseconds - 1st attempt
+ a random value between 0 and 20 milliseconds - 2nd attempt
+ a random value between 0 and 40 milliseconds - 3rd attempt
+ a random value between 0 and 80 milliseconds - 4th attempt
+ ...

+ and so on. + + + + +

+ Gets or sets a value indicating whether to archive old log file on startup. + + + This option works only when the "FileName" parameter denotes a single file. + After archiving the old file, the current log file will be empty. + + +
+ + + Gets or sets a value specifying the date format to use when archiving files. + + + This option works only when the "ArchiveNumbering" parameter is set either to Date or DateAndSequence. + + + + + + Gets or sets the size in bytes above which log files will be automatically archived. + + Warning: combining this with isn't supported. We cannot create multiple archive files, if they should have the same name. + Choose: + + + Caution: Enabling this option can considerably slow down your file + logging in multi-process scenarios. If only one process is going to + be writing to the file, consider setting ConcurrentWrites + to false for maximum performance. + + + + + + Gets or sets a value indicating whether to automatically archive log files every time the specified time passes. + + + Files are moved to the archive as part of the write operation if the current period of time changes. For example + if the current hour changes from 10 to 11, the first write that will occur + on or after 11:00 will trigger the archiving. +

+ Caution: Enabling this option can considerably slow down your file + logging in multi-process scenarios. If only one process is going to + be writing to the file, consider setting ConcurrentWrites + to false for maximum performance. +

+
+ +
+ + + Is the an absolute or relative path? + + + + + + Gets or sets the name of the file to be used for an archive. + + + It may contain a special placeholder {#####} + that will be replaced with a sequence of numbers depending on + the archiving strategy. The number of hash characters used determines + the number of numerical digits to be used for numbering files. + + + + + + Gets or sets the maximum number of archive files that should be kept. + + + + + + Gets or sets the way file archives are numbered. + + + + + + Used to compress log files during archiving. + This may be used to provide your own implementation of a zip file compressor, + on platforms other than .Net4.5. + Defaults to ZipArchiveFileCompressor on .Net4.5 and to null otherwise. + + + + + + Gets or sets a value indicating whether to compress archive files into the zip archive format. + + + + + + Gets or set a value indicating whether a managed file stream is forced, instead of using the native implementation. + + + + + + Gets or sets a value indicating whether file creation calls should be synchronized by a system global mutex. + + + + + + Gets or sets a value indicating whether the footer should be written only when the file is archived. + + + + + + Gets the characters that are appended after each line. + + + + + Refresh the ArchiveFilePatternToWatch option of the . + The log file must be watched for archiving when multiple processes are writing to the same + open file. + + + + + Removes records of initialized files that have not been + accessed in the last two days. + + + Files are marked 'initialized' for the purpose of writing footers when the logging finishes. + + + + + Removes records of initialized files that have not been + accessed after the specified date. + + The cleanup threshold. + + Files are marked 'initialized' for the purpose of writing footers when the logging finishes. + + + + + Flushes all pending file operations. + + The asynchronous continuation. + + The timeout parameter is ignored, because file APIs don't provide + the needed functionality. + + + + + Returns the suitable appender factory ( ) to be used to generate the file + appenders associated with the instance. + + The type of the file appender factory returned depends on the values of various properties. + + suitable for this instance. + + + + Initializes file logging by creating data structures that + enable efficient multi-file logging. + + + + + Closes the file(s) opened for writing. + + + + + Can be used if has been enabled. + + + + + Can be used if has been enabled. + + + + + Can be used if has been enabled. + + + + + Writes the specified logging event to a file specified in the FileName + parameter. + + The logging event. + + + + Get full filename (=absolute) and cleaned if needed. + + + + + + + NOTE! Obsolete, instead override Write(IList{AsyncLogEventInfo} logEvents) + + Writes an array of logging events to the log target. By default it iterates on all + events and passes them to "Write" method. Inheriting classes can use this method to + optimize batch writes. + + Logging events to be written out. + + + + Writes the specified array of logging events to a file specified in the FileName + parameter. + + An array of objects. + + This function makes use of the fact that the events are batched by sorting + the requests by filename. This optimizes the number of open/close calls + and can help improve performance. + + + + + Returns estimated size for memory stream, based on events count and first event size in bytes. + + Count of events + Bytes count of first event + + + + Formats the log event for write. + + The log event to be formatted. + A string representation of the log event. + + + + Gets the bytes to be written to the file. + + Log event. + Array of bytes that are ready to be written. + + + + Modifies the specified byte array before it gets sent to a file. + + The byte array. + The modified byte array. The function can do the modification in-place. + + + + Gets the bytes to be written to the file. + + The log event to be formatted. + to help format log event. + Optional temporary char-array to help format log event. + Destination for the encoded result. + + + + Formats the log event for write. + + The log event to be formatted. + for the result. + + + + Modifies the specified byte array before it gets sent to a file. + + The LogEvent being written + The byte array. + + + + Archives fileName to archiveFileName. + + File name to be archived. + Name of the archive file. + + + + Gets the correct formatting to be used based on the value of for converting values which will be inserting into file + names during archiving. + + This value will be computed only when a empty value or is passed into + + Date format to used irrespectively of value. + Formatting for dates. + + + + Calculate the DateTime of the requested day of the week. + + The DateTime of the previous log event. + The next occuring day of the week to return a DateTime for. + The DateTime of the next occuring dayOfWeek. + For example: if previousLogEventTimestamp is Thursday 2017-03-02 and dayOfWeek is Sunday, this will return + Sunday 2017-03-05. If dayOfWeek is Thursday, this will return *next* Thursday 2017-03-09. + + + + Invokes the archiving process after determining when and which type of archiving is required. + + File name to be checked and archived. + Log event that the instance is currently processing. + The DateTime of the previous log event for this file. + File has just been opened. + + + + Gets the pattern that archive files will match + + Filename of the log file + Log event that the instance is currently processing. + A string with a pattern that will match the archive filenames + + + + Archives the file if it should be archived. + + The file name to check for. + Log event that the instance is currently processing. + The size in bytes of the next chunk of data to be written in the file. + The DateTime of the previous log event for this file. + File has just been opened. + True when archive operation of the file was completed (by this target or a concurrent target) + + + + Indicates if the automatic archiving process should be executed. + + File name to be written. + Log event that the instance is currently processing. + The size in bytes of the next chunk of data to be written in the file. + The DateTime of the previous log event for this file. + Filename to archive. If null, then nothing to archive. + + + + Returns the correct filename to archive + + + + + + Gets the file name for archiving, or null if archiving should not occur based on file size. + + File name to be written. + The size in bytes of the next chunk of data to be written in the file. + Filename to archive. If null, then nothing to archive. + + + + Returns the file name for archiving, or null if archiving should not occur based on date/time. + + File name to be written. + Log event that the instance is currently processing. + The DateTime of the previous log event for this file. + Filename to archive. If null, then nothing to archive. + + + + Truncates the input-time, so comparison of low resolution times (like dates) are not affected by ticks + + High resolution Time + Time Resolution Level + Truncated Low Resolution Time + + + + Evaluates which parts of a file should be written (header, content, footer) based on various properties of + instance and writes them. + + File name to be written. + Raw sequence of to be written into the content part of the file. + File has just been opened. + + + + Initialise a file to be used by the instance. Based on the number of initialized + files and the values of various instance properties clean up and/or archiving processes can be invoked. + + File name to be written. + Log event that the instance is currently processing. + The DateTime of the previous log event for this file (DateTime.MinValue if just initialized). + + + + Writes the file footer and finalizes the file in instance internal structures. + + File name to close. + Indicates if the file is being finalized for archiving. + + + + Writes the footer information to a file. + + The file path to write to. + + + + Invokes the archiving and clean up of older archive file based on the values of + and + properties respectively. + + File name to be written. + Log event that the instance is currently processing. + + + + Creates the file specified in and writes the file content in each entirety i.e. + Header, Content and Footer. + + The name of the file to be written. + Sequence of to be written in the content section of the file. + First attempt to write? + This method is used when the content of the log file is re-written on every write. + + + + Writes the header information and byte order mark to a file. + + File appender associated with the file. + + + + The sequence of to be written in a file after applying any formating and any + transformations required from the . + + The layout used to render output message. + Sequence of to be written. + Usually it is used to render the header and hooter of the files. + + + + Controls the text and color formatting for + + + + + Creates a TextWriter for the console to start building a colored text message + + Active console stream + Optional StringBuilder to optimize performance + TextWriter for the console + + + + Releases the TextWriter for the console after having built a colored text message (Restores console colors) + + Colored TextWriter + Active console stream + Original foreground color for console (If changed) + Original background color for console (If changed) + + + + Changes foreground color for the Colored TextWriter + + Colored TextWriter + New foreground color for the console + Old foreground color for the console + + + + Changes backgroundColor color for the Colored TextWriter + + Colored TextWriter + New backgroundColor color for the console + Old backgroundColor color for the console + + + + Restores console colors back to their original state + + Colored TextWriter + Original foregroundColor color for the console + Original backgroundColor color for the console + + + + Writes multiple characters to console in one operation (faster) + + Colored TextWriter + Output Text + Start Index + End Index + + + + Writes single character to console + + Colored TextWriter + Output Text + + + + Writes whole string and completes with newline + + Colored TextWriter + Output Text + + + + Default row highlight rules for the console printer + + + + + Check if cleanup should be performed on initialize new file + + Base archive file pattern + Maximum number of archive files that should be kept + True, when archive cleanup is needed + + + + Create a wildcard file-mask that allows one to find all files belonging to the same archive. + + Base archive file pattern + Wildcard file-mask + + + + Search directory for all existing files that are part of the same archive. + + Base archive file pattern + + + + + Generate the next archive filename for the archive. + + Base archive file pattern + File date of archive + Existing files in the same archive + + + + + Return all files that should be removed from the provided archive. + + Base archive file pattern + Existing files in the same archive + Maximum number of archive files that should be kept + + + + + may be configured to compress archived files in a custom way + by setting before logging your first event. + + + + + Create archiveFileName by compressing fileName. + + Absolute path to the log file to compress. + Absolute path to the compressed archive file to create. + + + + Interface for serialization of values, maybe even objects to JSON format. + Useful for wrappers for existing serializers. + + + + + Returns a serialization of an object + into JSON format. + + The object to serialize to JSON. + Serialized value (null = Serialize failed). + + + + Options for JSON serialisation + + + + + Add quotes around object keys? + + + + + Formatprovider for value + + + + + Format string for value + + + + + Should non-ascii characters be encoded + + + + + Serialize enum as string value + + + + + Should dictionary keys be sanitized. All characters must either be letters, numbers or underscore character (_). + + Any other characters will be converted to underscore character (_) + + + + + How far down the rabbit hole should the Json Serializer go with object-reflection before stopping + + + + Initializes a new instance of the class. + + + + Line ending mode. + + + + + Insert platform-dependent end-of-line sequence after each line. + + + + + Insert CR LF sequence (ASCII 13, ASCII 10) after each line. + + + + + Insert CR character (ASCII 13) after each line. + + + + + Insert LF character (ASCII 10) after each line. + + + + + Insert null terminator (ASCII 0) after each line. + + + + + Do not insert any line ending. + + + + + Gets the name of the LineEndingMode instance. + + + + + Gets the new line characters (value) of the LineEndingMode instance. + + + + + Initializes a new instance of . + + The mode name. + The new line characters to be used. + + + + Returns the that corresponds to the supplied . + + + The textual representation of the line ending mode, such as CRLF, LF, Default etc. + Name is not case sensitive. + + The value, that corresponds to the . + There is no line ending mode with the specified name. + + + + Compares two objects and returns a + value indicating whether the first one is equal to the second one. + + The first level. + The second level. + The value of mode1.NewLineCharacters == mode2.NewLineCharacters. + + + + Compares two objects and returns a + value indicating whether the first one is not equal to the second one. + + The first mode + The second mode + The value of mode1.NewLineCharacters != mode2.NewLineCharacters. + + + + Returns a string representation of the log level. + + Log level name. + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms + and data structures like a hash table. + + + + + Determines whether the specified is + equal to this instance. + + The to compare with + this instance. + + Value of true if the specified + is equal to this instance; otherwise, false. + + + The parameter is null. + + + + Indicates whether the current object is equal to another object of the same type. + true if the current object is equal to the parameter; otherwise, false. + An object to compare with this object. + + + + Provides a type converter to convert objects to and from other representations. + + + + + Returns whether this converter can convert an object of the given type to the type of this converter, using the specified context. + + + true if this converter can perform the conversion; otherwise, false. + + An that provides a format context. A that represents the type you want to convert from. + + + + Converts the given object to the type of this converter, using the specified context and culture information. + + + An that represents the converted value. + + An that provides a format context. The to use as the current culture. The to convert. The conversion cannot be performed. + + + + Sends log messages to a NLog Receiver Service (using WCF or Web Services). + + Documentation on NLog Wiki + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target. + + + + Gets or sets the endpoint address. + + The endpoint address. + + + + + Gets or sets the name of the endpoint configuration in WCF configuration file. + + The name of the endpoint configuration. + + + + + Gets or sets a value indicating whether to use binary message encoding. + + + + + + Gets or sets a value indicating whether to use a WCF service contract that is one way (fire and forget) or two way (request-reply) + + + + + + Gets or sets the client ID. + + The client ID. + + + + + Gets the list of parameters. + + The parameters. + + + + + Gets or sets a value indicating whether to include per-event properties in the payload sent to the server. + + + + + + Called when log events are being sent (test hook). + + The events. + The async continuations. + True if events should be sent, false to stop processing them. + + + + Writes logging event to the log target. Must be overridden in inheriting + classes. + + Logging event to be written out. + + + + NOTE! Obsolete, instead override Write(IList{AsyncLogEventInfo} logEvents) + + Writes an array of logging events to the log target. By default it iterates on all + events and passes them to "Write" method. Inheriting classes can use this method to + optimize batch writes. + + Logging events to be written out. + + + + Writes an array of logging events to the log target. By default it iterates on all + events and passes them to "Append" method. Inheriting classes can use this method to + optimize batch writes. + + Logging events to be written out. + + + + Flush any pending log messages asynchronously (in case of asynchronous targets). + + The asynchronous continuation. + + + + Add value to the , returns ordinal in + + + lookup so only unique items will be added to + value to add + + + + + Creating a new instance of WcfLogReceiverClient + + Inheritors can override this method and provide their own + service configuration - binding and endpoint address + + This method marked as obsolete before NLog 4.3.11 and it may be removed in a future release. + + + + Creating a new instance of IWcfLogReceiverClient + + Inheritors can override this method and provide their own + service configuration - binding and endpoint address + + + virtual is used by endusers + + + + Sends log messages by email using SMTP protocol. + + Documentation on NLog Wiki + +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ This assumes just one target and a single rule. More configuration + options are described here. +

+

+ To set up the log target programmatically use code like this: +

+ +

+ Mail target works best when used with BufferingWrapper target + which lets you send multiple log messages in single mail +

+

+ To set up the buffered mail target in the configuration file, + use the following syntax: +

+ +

+ To set up the buffered mail target programmatically use code like this: +

+ +
+
+ + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + + + + Gets the mailSettings/smtp configuration from app.config in cases when we need those configuration. + E.g when UseSystemNetMailSettings is enabled and we need to read the From attribute from system.net/mailSettings/smtp + + Internal for mocking + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + Name of the target. + + + + Gets or sets sender's email address (e.g. joe@domain.com). + + + + + + Gets or sets recipients' email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com). + + + + + + Gets or sets CC email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com). + + + + + + Gets or sets BCC email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com). + + + + + + Gets or sets a value indicating whether to add new lines between log entries. + + A value of true if new lines should be added; otherwise, false. + + + + + Gets or sets the mail subject. + + + + + + Gets or sets mail message body (repeated for each log message send in one mail). + + Alias for the Layout property. + + + + + Gets or sets encoding to be used for sending e-mail. + + + + + + Gets or sets a value indicating whether to send message as HTML instead of plain text. + + + + + + Gets or sets SMTP Server to be used for sending. + + + + + + Gets or sets SMTP Authentication mode. + + + + + + Gets or sets the username used to connect to SMTP server (used when SmtpAuthentication is set to "basic"). + + + + + + Gets or sets the password used to authenticate against SMTP server (used when SmtpAuthentication is set to "basic"). + + + + + + Gets or sets a value indicating whether SSL (secure sockets layer) should be used when communicating with SMTP server. + + . + + + + Gets or sets the port number that SMTP Server is listening on. + + + + + + Gets or sets a value indicating whether the default Settings from System.Net.MailSettings should be used. + + + + + + Specifies how outgoing email messages will be handled. + + + + + + Gets or sets the folder where applications save mail messages to be processed by the local SMTP server. + + + + + + Gets or sets the priority used for sending mails. + + + + + + Gets or sets a value indicating whether NewLine characters in the body should be replaced with
tags. +
+ Only happens when is set to true. + +
+ + + Gets or sets a value indicating the SMTP client timeout. + + Warning: zero is not infinite waiting + + + + + Renders the logging event message and adds it to the internal ArrayList of log messages. + + The logging event. + + + + NOTE! Obsolete, instead override Write(IList{AsyncLogEventInfo} logEvents) + + Writes an array of logging events to the log target. By default it iterates on all + events and passes them to "Write" method. Inheriting classes can use this method to + optimize batch writes. + + Logging events to be written out. + + + + Renders an array logging events. + + Array of logging events. + + + + Initializes the target. Can be used by inheriting classes + to initialize logging. + + + + + Create mail and send with SMTP + + event printed in the body of the event + + + + Create buffer for body + + all events + first event for header + last event for footer + + + + + Set properties of + + last event for username/password + client to set properties on + Configure not at , as the properties could have layout renderers. + + + + Handle if it is a virtual directory. + + + + + + + Create key for grouping. Needed for multiple events in one mailmessage + + event for rendering layouts + string to group on + + + + Append rendered layout to the stringbuilder + + append to this + event for rendering + append if not null + + + + Create the mailmessage with the addresses, properties and body. + + + + + Render and add the addresses to + + Addresses appended to this list + layout with addresses, ; separated + event for rendering the + added a address? + + + + Writes log messages to an ArrayList in memory for programmatic retrieval. + + Documentation on NLog Wiki + +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ This assumes just one target and a single rule. More configuration + options are described here. +

+

+ To set up the log target programmatically use code like this: +

+ +
+
+ + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + Name of the target. + + + + Gets the list of logs gathered in the . + + + + + Gets or sets the max number of items to have in memory + + + + + + Renders the logging event message and adds it to the internal ArrayList of log messages. + + The logging event. + + + + A parameter to MethodCall. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The layout to use for parameter value. + + + + Initializes a new instance of the class. + + Name of the parameter. + The layout. + + + + Initializes a new instance of the class. + + The name of the parameter. + The layout. + The type of the parameter. + + + + Gets or sets the name of the parameter. + + + + + + Gets or sets the type of the parameter. Obsolete alias for + + + + + + Gets or sets the type of the parameter. + + + + + + Gets or sets the layout that should be use to calculate the value for the parameter. + + + + + + Calls the specified static method on each log message and passes contextual parameters to it. + + Documentation on NLog Wiki + +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ This assumes just one target and a single rule. More configuration + options are described here. +

+

+ To set up the log target programmatically use code like this: +

+ +
+
+ + + Gets or sets the class name. + + + + + + Gets or sets the method name. The method must be public and static. + + Use the AssemblyQualifiedName , https://msdn.microsoft.com/en-us/library/system.type.assemblyqualifiedname(v=vs.110).aspx + e.g. + + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target. + + + + Initializes a new instance of the class. + + Name of the target. + Method to call on logevent. + + + + Initializes the target. + + + + + Calls the specified Method. + + Method parameters. + The logging event. + + + + Calls the specified Method. + + Method parameters. + + + + The base class for all targets which call methods (local or remote). + Manages parameters and type coercion. + + + + + Initializes a new instance of the class. + + + + + Gets the array of parameters to be passed. + + + + + + + + + Prepares an array of parameters to be passed based on the logging event and calls DoInvoke(). + + The logging event. + + + + Calls the target DoInvoke method, and handles AsyncContinuation callback + + Method call parameters. + The logging event. + + + + Calls the target DoInvoke method, and handles AsyncContinuation callback + + Method call parameters. + The continuation. + + + + Calls the target method. Must be implemented in concrete classes. + + Method call parameters. + + + + Sends log messages over the network. + + Documentation on NLog Wiki + +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ This assumes just one target and a single rule. More configuration + options are described here. +

+

+ To set up the log target programmatically use code like this: +

+ +

+ To print the results, use any application that's able to receive messages over + TCP or UDP. NetCat is + a simple but very powerful command-line tool that can be used for that. This image + demonstrates the NetCat tool receiving log messages from Network target. +

+ +

+ NOTE: If your receiver application is ever likely to be off-line, don't use TCP protocol + or you'll get TCP timeouts and your application will be very slow. + Either switch to UDP transport or use AsyncWrapper target + so that your application threads will not be blocked by the timing-out connection attempts. +

+

+ There are two specialized versions of the Network target: Chainsaw + and NLogViewer which write to instances of Chainsaw log4j viewer + or NLogViewer application respectively. +

+
+
+ + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + Name of the target. + + + + Gets or sets the network address. + + + The network address can be: +
    +
  • tcp://host:port - TCP (auto select IPv4/IPv6) (not supported on Windows Phone 7.0)
  • +
  • tcp4://host:port - force TCP/IPv4 (not supported on Windows Phone 7.0)
  • +
  • tcp6://host:port - force TCP/IPv6 (not supported on Windows Phone 7.0)
  • +
  • udp://host:port - UDP (auto select IPv4/IPv6, not supported on Silverlight and on Windows Phone 7.0)
  • +
  • udp4://host:port - force UDP/IPv4 (not supported on Silverlight and on Windows Phone 7.0)
  • +
  • udp6://host:port - force UDP/IPv6 (not supported on Silverlight and on Windows Phone 7.0)
  • +
  • http://host:port/pageName - HTTP using POST verb
  • +
  • https://host:port/pageName - HTTPS using POST verb
  • +
+ For SOAP-based webservice support over HTTP use WebService target. +
+ +
+ + + Gets or sets a value indicating whether to keep connection open whenever possible. + + + + + + Gets or sets a value indicating whether to append newline at the end of log message. + + + + + + Gets or sets the end of line value if a newline is appended at the end of log message . + + + + + + Gets or sets the maximum message size in bytes. + + + + + + Gets or sets the size of the connection cache (number of connections which are kept alive). + + + + + + Gets or sets the maximum current connections. 0 = no maximum. + + + + + + Gets or sets the action that should be taken if the will be more connections than . + + + + + + Gets or sets the maximum queue size. + + + + + + Gets or sets the action that should be taken if the message is larger than + maxMessageSize. + + + + + + Gets or sets the encoding to be used. + + + + + + Get or set the SSL/TLS protocols. Default no SSL/TLS is used. Currently only implemented for TCP. + + + + + + The number of seconds a connection will remain idle before the first keep-alive probe is sent + + + + + Flush any pending log messages asynchronously (in case of asynchronous targets). + + The asynchronous continuation. + + + + Closes the target. + + + + + Sends the + rendered logging event over the network optionally concatenating it with a newline character. + + The logging event. + + + + Try to remove. + + + + + removed something? + + + + Gets the bytes to be written. + + Log event. + Byte array. + + + + The action to be taken when there are more connections then the max. + + + + + Just allow it. + + + + + Discard the connection item. + + + + + Block until there's more room in the queue. + + + + + Action that should be taken if the message overflows. + + + + + Report an error. + + + + + Split the message into smaller pieces. + + + + + Discard the entire message. + + + + + Represents a parameter to a NLogViewer target. + + + + + Initializes a new instance of the class. + + + + + Gets or sets viewer parameter name. + + + + + + Gets or sets the layout that should be use to calculate the value for the parameter. + + + + + + Gets or sets whether an attribute with empty value should be included in the output + + + + + + Sends log messages to the remote instance of NLog Viewer. + + Documentation on NLog Wiki + +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ This assumes just one target and a single rule. More configuration + options are described here. +

+

+ To set up the log target programmatically use code like this: +

+ +

+ NOTE: If your receiver application is ever likely to be off-line, don't use TCP protocol + or you'll get TCP timeouts and your application will crawl. + Either switch to UDP transport or use AsyncWrapper target + so that your application threads will not be blocked by the timing-out connection attempts. +

+
+
+ + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + Name of the target. + + + + Gets or sets a value indicating whether to include NLog-specific extensions to log4j schema. + + + + + + Gets or sets the AppInfo field. By default it's the friendly name of the current AppDomain. + + + + + + Gets or sets a value indicating whether to include call site (class and method name) in the information sent over the network. + + + + + + Gets or sets a value indicating whether to include source info (file name and line number) in the information sent over the network. + + + + + + Gets or sets a value indicating whether to include dictionary contents. + + + + + + Gets or sets a value indicating whether to include stack contents. + + + + + + Gets or sets a value indicating whether to include dictionary contents. + + + + + + Gets or sets a value indicating whether to include contents of the stack. + + + + + + Gets or sets the NDLC item separator. + + + + + + Gets or sets the option to include all properties from the log events + + + + + + Gets or sets the NDC item separator. + + + + + + Gets or sets the renderer for log4j:event logger-xml-attribute (Default ${logger}) + + + + + + Gets the collection of parameters. Each parameter contains a mapping + between NLog layout and a named parameter. + + + + + + Gets the layout renderer which produces Log4j-compatible XML events. + + + + + Gets or sets the instance of that is used to format log messages. + + + + + + Discards log messages. Used mainly for debugging and benchmarking. + + Documentation on NLog Wiki + +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ This assumes just one target and a single rule. More configuration + options are described here. +

+

+ To set up the log target programmatically use code like this: +

+ +
+
+ + + Gets or sets a value indicating whether to perform layout calculation. + + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + + + + + Does nothing. Optionally it calculates the layout text but + discards the results. + + The logging event. + + + + Outputs log messages through the OutputDebugString() Win32 API. + + Documentation on NLog Wiki + +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ This assumes just one target and a single rule. More configuration + options are described here. +

+

+ To set up the log target programmatically use code like this: +

+ +
+
+ + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + Name of the target. + + + + Outputs the rendered logging event through the OutputDebugString() Win32 API. + + The logging event. + + + + Increments specified performance counter on each write. + + Documentation on NLog Wiki + +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ This assumes just one target and a single rule. More configuration + options are described here. +

+

+ To set up the log target programmatically use code like this: +

+ +
+ + TODO: + 1. Unable to create a category allowing multiple counter instances (.Net 2.0 API only, probably) + 2. Is there any way of adding new counters without deleting the whole category? + 3. There should be some mechanism of resetting the counter (e.g every day starts from 0), or auto-switching to + another counter instance (with dynamic creation of new instance). This could be done with layouts. + +
+ + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target. + + + + Gets or sets a value indicating whether performance counter should be automatically created. + + + + + + Gets or sets the name of the performance counter category. + + + + + + Gets or sets the name of the performance counter. + + + + + + Gets or sets the performance counter instance name. + + + + + + Gets or sets the counter help text. + + + + + + Gets or sets the performance counter type. + + + + + + The value by which to increment the counter. + + + + + + Performs installation which requires administrative permissions. + + The installation context. + + + + Performs uninstallation which requires administrative permissions. + + The installation context. + + + + Determines whether the item is installed. + + The installation context. + + Value indicating whether the item is installed or null if it is not possible to determine. + + + + + Increments the configured performance counter. + + Log event. + + + + Closes the target and releases any unmanaged resources. + + + + + Ensures that the performance counter has been initialized. + + True if the performance counter is operational, false otherwise. + + + + SMTP authentication modes. + + + + + No authentication. + + + + + Basic - username and password. + + + + + NTLM Authentication. + + + + + Represents logging target. + + + + Are all layouts in this target thread-agnostic, if so we don't precalculate the layouts + + + + The Max StackTraceUsage of all the in this Target + + + + + Gets or sets the name of the target. + + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers + Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + Gets the object which can be used to synchronize asynchronous operations that must rely on the . + + + + + Gets the logging configuration this target is part of. + + + + + Gets a value indicating whether the target has been initialized. + + + + + Can be used if has been enabled. + + + + + Initializes this instance. + + The configuration. + + + + Closes this instance. + + + + + Closes the target. + + + + + Flush any pending log messages (in case of asynchronous targets). + + The asynchronous continuation. + + + + Calls the on each volatile layout + used by this target. + This method won't prerender if all layouts in this target are thread-agnostic. + + + The log event. + + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Writes the log to the target. + + Log event to write. + + + + Writes the array of log events. + + The log events. + + + + Writes the array of log events. + + The log events. + + + + Initializes this instance. + + The configuration. + + + + Closes this instance. + + + + + Releases unmanaged and - optionally - managed resources. + + True to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Initializes the target. Can be used by inheriting classes + to initialize logging. + + + + + Closes the target and releases any unmanaged resources. + + + + + Flush any pending log messages asynchronously (in case of asynchronous targets). + + The asynchronous continuation. + + + + Writes logging event to the log target. Must be overridden in inheriting + classes. + + Logging event to be written out. + + + + Writes async log event to the log target. + + Async Log event to be written out. + + + + Writes a log event to the log target, in a thread safe manner. + Any override of this method has to provide their own synchronization mechanism. + + !WARNING! Custom targets should only override this method if able to provide their + own synchronization mechanism. -objects are not guaranteed to be + threadsafe, so using them without a SyncRoot-object can be dangerous. + + Log event to be written out. + + + + NOTE! Obsolete, instead override Write(IList{AsyncLogEventInfo} logEvents) + + Writes an array of logging events to the log target. By default it iterates on all + events and passes them to "Write" method. Inheriting classes can use this method to + optimize batch writes. + + Logging events to be written out. + + + + Writes an array of logging events to the log target. By default it iterates on all + events and passes them to "Write" method. Inheriting classes can use this method to + optimize batch writes. + + Logging events to be written out. + + + + NOTE! Obsolete, instead override WriteAsyncThreadSafe(IList{AsyncLogEventInfo} logEvents) + + Writes an array of logging events to the log target, in a thread safe manner. + + !WARNING! Custom targets should only override this method if able to provide their + own synchronization mechanism. -objects are not guaranteed to be + threadsafe, so using them without a SyncRoot-object can be dangerous. + + Logging events to be written out. + + + + Writes an array of logging events to the log target, in a thread safe manner. + Any override of this method has to provide their own synchronization mechanism. + + !WARNING! Custom targets should only override this method if able to provide their + own synchronization mechanism. -objects are not guaranteed to be + threadsafe, so using them without a SyncRoot-object can be dangerous. + + Logging events to be written out. + + + + Merges (copies) the event context properties from any event info object stored in + parameters of the given event info object. + + The event info object to perform the merge to. + + + + Renders the event info in layout. + + The layout. + The event info. + String representing log event. + + + + Register a custom Target. + + Short-cut for registering to default + Type of the Target. + Name of the Target. + + + + Register a custom Target. + + Short-cut for registering to default + Type of the Target. + Name of the Target. + + + + Marks class as a logging target and assigns a name to it. + + This attribute is not required when registering the target in the API. + + + + Initializes a new instance of the class. + + Name of the target. + + + + Gets or sets a value indicating whether to the target is a wrapper target (used to generate the target summary documentation page). + + + + + Gets or sets a value indicating whether to the target is a compound target (used to generate the target summary documentation page). + + + + + Attribute details for + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The name of the attribute. + The layout of the attribute's value. + + + + Gets or sets the name of the attribute. + + + + + + Gets or sets the layout that will be rendered as the attribute's value. + + + + + + Gets or sets when an empty value should cause the property to be included + + + + + Gets or sets the type of the property. + + + + + Represents target that supports context capture using MDLC, MDC, NDLC and NDC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gets or sets a value indicating whether to include contents of the dictionary + + + + + + Gets or sets a value indicating whether to include call site (class and method name) in the + + + + + + Gets or sets a value indicating whether to include source info (file name and line number) in the + + + + + + Gets the array of custom attributes to be passed into the logevent context + + + + + + Constructor + + + + + + + + Check if logevent has properties (or context properties) + + + True if properties should be included + + + + Checks if any context properties, and if any returns them as a single dictionary + + + Dictionary with any context properties for the logEvent (Null if none found) + + + + Checks if any context properties, and if any returns them as a single dictionary + + + Optional prefilled dictionary + Dictionary with any context properties for the logEvent (Null if none found) + + + + Creates combined dictionary of all configured properties for logEvent + + + Dictionary with all collected properties for logEvent + + + + Creates combined dictionary of all configured properties for logEvent + + + Optional prefilled dictionary + Dictionary with all collected properties for logEvent + + + + Generates a new unique name, when duplicate names are detected + + LogEvent that triggered the duplicate name + Duplicate item name + Item Value + Dictionary of context values + New (unique) value (or null to skip value). If the same value is used then the item will be overwritten + + + + Returns the captured snapshot of for the + + + Dictionary with MDC context if any, else null + + + + Returns the captured snapshot of for the + + + Dictionary with MDLC context if any, else null + + + + Returns the captured snapshot of for the + + + Dictionary with NDC context if any, else null + + + + Returns the captured snapshot of for the + + + Dictionary with NDLC context if any, else null + + + + Takes snapshot of for the + + + Optional pre-allocated dictionary for the snapshot + Dictionary with GDC context if any, else null + + + + Takes snapshot of for the + + + Optional pre-allocated dictionary for the snapshot + Dictionary with MDC context if any, else null + + + + Take snapshot of a single object value from + + Log event + MDC key + MDC value + Snapshot of MDC value + Include object value in snapshot + + + + Takes snapshot of for the + + + Optional pre-allocated dictionary for the snapshot + Dictionary with MDLC context if any, else null + + + + Take snapshot of a single object value from + + Log event + MDLC key + MDLC value + Snapshot of MDLC value + Include object value in snapshot + + + + Takes snapshot of for the + + + Dictionary with NDC context if any, else null + + + + Take snapshot of a single object value from + + Log event + NDC value + Snapshot of NDC value + Include object value in snapshot + + + + Takes snapshot of for the + + + Dictionary with NDLC context if any, else null + + + + Take snapshot of a single object value from + + Log event + NDLC value + Snapshot of NDLC value + Include object value in snapshot + + + + Take snapshot of a single object value + + Log event + Key Name (null when NDC / NDLC) + Object Value + Snapshot of value + Include object value in snapshot + + + Internal Layout that allows capture of MDC context + + + Internal Layout that allows capture of NDC context + + + Internal Layout that allows capture of MDLC context + + + Internal Layout that allows capture of NDLC context + + + + Represents target that supports string formatting using layouts. + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + + + + Gets or sets the layout used to format log messages. + + + + + + Represents target that supports string formatting using layouts. + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + + + + Gets or sets the text to be rendered. + + + + + + Gets or sets the footer. + + + + + + Gets or sets the header. + + + + + + Gets or sets the layout with header and footer. + + The layout with header and footer. + + + + Sends log messages through System.Diagnostics.Trace. + + Documentation on NLog Wiki + +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ This assumes just one target and a single rule. More configuration + options are described here. +

+

+ To set up the log target programmatically use code like this: +

+ +
+
+ + + Always use independent of + + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + Name of the target. + + + + Writes the specified logging event to the facility. + + Redirects the log message depending on and . + When is false: + - writes to + - writes to + - writes to + - writes to + - writes to + - writes to + + The logging event. + + + + Web service protocol. + + + + + Use SOAP 1.1 Protocol. + + + + + Use SOAP 1.2 Protocol. + + + + + Use HTTP POST Protocol. + + + + + Use HTTP GET Protocol. + + + + + Do an HTTP POST of a JSON document. + + + + + Do an HTTP POST of an XML document. + + + + + Web Service Proxy Configuration Type + + + + + Default proxy configuration from app.config (System.Net.WebRequest.DefaultWebProxy) + + + Example of how to configure default proxy using app.config + + <system.net> + <defaultProxy enabled = "true" useDefaultCredentials = "true" > + <proxy usesystemdefault = "True" /> + </defaultProxy> + </system.net> + + + + + + Automatic use of proxy with authentication (cached) + + + + + Disables use of proxy (fast) + + + + + Custom proxy address (cached) + + + + + Calls the specified web service on each log message. + + Documentation on NLog Wiki + + The web service must implement a method that accepts a number of string parameters. + + +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ This assumes just one target and a single rule. More configuration + options are described here. +

+

+ To set up the log target programmatically use code like this: +

+ +

The example web service that works with this example is shown below

+ +
+
+ + + dictionary that maps a concrete implementation + to a specific -value. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target + + + + Gets or sets the web service URL. + + + + + + Gets or sets the Web service method name. Only used with Soap. + + + + + + Gets or sets the Web service namespace. Only used with Soap. + + + + + + Gets or sets the protocol to be used when calling web service. + + + + + + Gets or sets the proxy configuration when calling web service + + + + + + Gets or sets the custom proxy address, include port separated by a colon + + + + + + Should we include the BOM (Byte-order-mark) for UTF? Influences the property. + + This will only work for UTF-8. + + + + + + Gets or sets the encoding. + + + + + + Gets or sets a value whether escaping be done according to Rfc3986 (Supports Internationalized Resource Identifiers - IRIs) + + A value of true if Rfc3986; otherwise, false for legacy Rfc2396. + + + + + Gets or sets a value whether escaping be done according to the old NLog style (Very non-standard) + + A value of true if legacy encoding; otherwise, false for standard UTF8 encoding. + + + + + Gets or sets the name of the root XML element, + if POST of XML document chosen. + If so, this property must not be null. + (see and ). + + + + + + Gets or sets the (optional) root namespace of the XML document, + if POST of XML document chosen. + (see and ). + + + + + + Gets the array of parameters to be passed. + + + + + + Indicates whether to pre-authenticate the HttpWebRequest (Requires 'Authorization' in parameters) + + + + + + Calls the target method. Must be implemented in concrete classes. + + Method call parameters. + + + + Calls the target DoInvoke method, and handles AsyncContinuation callback + + Method call parameters. + The continuation. + + + + Invokes the web service method. + + Parameters to be passed. + The logging event. + + + + Flush any pending log messages asynchronously (in case of asynchronous targets). + + The asynchronous continuation. + + + + Closes the target. + + + + + Builds the URL to use when calling the web service for a message, depending on the WebServiceProtocol. + + + + + + + Write from input to output. Fix the UTF-8 bom + + + + + + + + + base class for POST formatters, that + implement former PrepareRequest() method, + that creates the content for + the requested kind of HTTP request + + + + + Win32 file attributes. + + + For more information see https://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/createfile.asp. + + + + + Read-only file. + + + + + Hidden file. + + + + + System file. + + + + + File should be archived. + + + + + Device file. + + + + + Normal file. + + + + + File is temporary (should be kept in cache and not + written to disk if possible). + + + + + Sparse file. + + + + + Reparse point. + + + + + Compress file contents. + + + + + File should not be indexed by the content indexing service. + + + + + Encrypted file. + + + + + The system writes through any intermediate cache and goes directly to disk. + + + + + The system opens a file with no system caching. + + + + + Delete file after it is closed. + + + + + A file is accessed according to POSIX rules. + + + + + Asynchronous request queue. + + + + + Initializes a new instance of the AsyncRequestQueue class. + + Request limit. + The overflow action. + + + + Gets the number of requests currently in the queue. + + + + + Enqueues another item. If the queue is overflown the appropriate + action is taken as specified by . + + The log event info. + Queue was empty before enqueue + + + + Dequeues a maximum of count items from the queue + and adds returns the list containing them. + + Maximum number of items to be dequeued (-1 means everything). + The array of log events. + + + + Dequeues into a preallocated array, instead of allocating a new one + + Maximum number of items to be dequeued + Preallocated list + + + + Clears the queue. + + + + + Gets or sets the request limit. + + + + + Gets or sets the action to be taken when there's no more room in + the queue and another request is enqueued. + + + + + Notifies about log event that was dropped when setted to + + + + + Notifies when queue size is growing over + + + + + Raise event when queued element was dropped because of queue overflow + + Dropped queue item + + + + Raise event when RequestCount overflow + + current requests count + + + + Provides asynchronous, buffered execution of target writes. + + Documentation on NLog Wiki + +

+ Asynchronous target wrapper allows the logger code to execute more quickly, by queueing + messages and processing them in a separate thread. You should wrap targets + that spend a non-trivial amount of time in their Write() method with asynchronous + target to speed up logging. +

+

+ Because asynchronous logging is quite a common scenario, NLog supports a + shorthand notation for wrapping all targets with AsyncWrapper. Just add async="true" to + the <targets/> element in the configuration file. +

+ + + ... your targets go here ... + + ]]> +
+ +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ The above examples assume just one target and a single rule. See below for + a programmatic configuration that's equivalent to the above config file: +

+ +
+
+ + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target. + The wrapped target. + + + + Initializes a new instance of the class. + + The wrapped target. + + + + Initializes a new instance of the class. + + The wrapped target. + Maximum number of requests in the queue. + The action to be taken when the queue overflows. + + + + Gets or sets the number of log events that should be processed in a batch + by the lazy writer thread. + + + + + + Gets or sets the time in milliseconds to sleep between batches. (1 or less means trigger on new activity) + + + + + + Raise event when Target cannot store LogEvent. + Event arg contains lost LogEvents + + + + + Raises when event queue grow. + Queue can grow when was setted to + + + + + Gets or sets the action to be taken when the lazy writer thread request queue count + exceeds the set limit. + + + + + + Gets or sets the limit on the number of requests in the lazy writer thread request queue. + + + + + + Gets or sets the limit of full s to write before yielding into + Performance is better when writing many small batches, than writing a single large batch + + + + + + Gets or sets whether to use the locking queue, instead of a lock-free concurrent queue + The locking queue is less concurrent when many logger threads, but reduces memory allocation + + + + + + Gets the queue of lazy writer thread requests. + + + + + Schedules a flush of pending events in the queue (if any), followed by flushing the WrappedTarget. + + The asynchronous continuation. + + + + Initializes the target by starting the lazy writer timer. + + + + + Shuts down the lazy writer timer. + + + + + Starts the lazy writer thread which periodically writes + queued log messages. + + + + + Attempts to start an instant timer-worker-thread which can write + queued log messages. + + Returns true when scheduled a timer-worker-thread + + + + Stops the lazy writer thread. + + + + + Adds the log event to asynchronous queue to be processed by + the lazy writer thread. + + The log event. + + The is called + to ensure that the log event can be processed in another thread. + + + + + Write to queue without locking + + + + + + The action to be taken when the queue overflows. + + + + + Grow the queue. + + + + + Discard the overflowing item. + + + + + Block until there's more room in the queue. + + + + + Causes a flush on a wrapped target if LogEvent satisfies the . + If condition isn't set, flushes on each write. + + Documentation on NLog Wiki + +

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ The above examples assume just one target and a single rule. See below for + a programmatic configuration that's equivalent to the above config file: +

+ +
+
+ + + Gets or sets the condition expression. Log events who meet this condition will cause + a flush on the wrapped target. + + + + + + Delay the flush until the LogEvent has been confirmed as written + + + + + + Only flush when LogEvent matches condition. Ignore explicit-flush, config-reload-flush and shutdown-flush + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + + + + Initializes a new instance of the class. + + + The default value of the layout is: ${longdate}|${level:uppercase=true}|${logger}|${message} + + The wrapped target. + Name of the target + + + + Initializes a new instance of the class. + + The wrapped target. + + + + Initializes the target. + + + + + Forwards the call to the .Write() + and calls on it if LogEvent satisfies + the flush condition or condition is null. + + Logging event to be written out. + + + + Schedules a flush operation, that triggers when all pending flush operations are completed (in case of asynchronous targets). + + The asynchronous continuation. + + + + Closes the target. + + + + + A target that buffers log events and sends them in batches to the wrapped target. + + Documentation on NLog Wiki + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target. + The wrapped target. + + + + Initializes a new instance of the class. + + The wrapped target. + + + + Initializes a new instance of the class. + + The wrapped target. + Size of the buffer. + + + + Initializes a new instance of the class. + + The wrapped target. + Size of the buffer. + The flush timeout. + + + + Initializes a new instance of the class. + + The wrapped target. + Size of the buffer. + The flush timeout. + The aciton to take when the buffer overflows. + + + + Gets or sets the number of log events to be buffered. + + + + + + Gets or sets the timeout (in milliseconds) after which the contents of buffer will be flushed + if there's no write in the specified period of time. Use -1 to disable timed flushes. + + + + + + Gets or sets a value indicating whether to use sliding timeout. + + + This value determines how the inactivity period is determined. If sliding timeout is enabled, + the inactivity timer is reset after each write, if it is disabled - inactivity timer will + count from the first event written to the buffer. + + + + + + Gets or sets the action to take if the buffer overflows. + + + Setting to will replace the + oldest event with new events without sending events down to the wrapped target, and + setting to will flush the + entire buffer to the wrapped target. + + + + + + Flushes pending events in the buffer (if any), followed by flushing the WrappedTarget. + + The asynchronous continuation. + + + + Initializes the target. + + + + + Closes the target by flushing pending events in the buffer (if any). + + + + + Adds the specified log event to the buffer and flushes + the buffer in case the buffer gets full. + + The log event. + + + + The action to be taken when the buffer overflows. + + + + + Flush the content of the buffer. + + + + + Discard the oldest item. + + + + + A base class for targets which wrap other (multiple) targets + and provide various forms of target routing. + + + + + Initializes a new instance of the class. + + The targets. + + + + Gets the collection of targets managed by this compound target. + + + + + Returns the text representation of the object. Used for diagnostics. + + A string that describes the target. + + + + Writes logging event to the log target. + + Logging event to be written out. + + + + Flush any pending log messages for all wrapped targets. + + The asynchronous continuation. + + + + Concurrent Asynchronous request queue based on + + + + + Initializes a new instance of the AsyncRequestQueue class. + + Request limit. + The overflow action. + + + + Gets the number of requests currently in the queue. + + + Only for debugging purposes + + + + + Enqueues another item. If the queue is overflown the appropriate + action is taken as specified by . + + The log event info. + Queue was empty before enqueue + + + + Dequeues a maximum of count items from the queue + and adds returns the list containing them. + + Maximum number of items to be dequeued (-1 means everything). + The array of log events. + + + + Dequeues into a preallocated array, instead of allocating a new one + + Maximum number of items to be dequeued + Preallocated list + + + + Clears the queue. + + + + + Provides fallback-on-error. + + Documentation on NLog Wiki + +

This example causes the messages to be written to server1, + and if it fails, messages go to server2.

+

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ The above examples assume just one target and a single rule. See below for + a programmatic configuration that's equivalent to the above config file: +

+ +
+
+ + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target. + The targets. + + + + Initializes a new instance of the class. + + The targets. + + + + Gets or sets a value indicating whether to return to the first target after any successful write. + + + + + + + + + + + + Forwards the log event to the sub-targets until one of them succeeds. + + The log event. + + The method remembers the last-known-successful target + and starts the iteration from it. + If is set, the method + resets the target to the first target + stored in . + + + + + Filtering rule for . + + + + + Initializes a new instance of the FilteringRule class. + + + + + Initializes a new instance of the FilteringRule class. + + Condition to be tested against all events. + Filter to apply to all log events when the first condition matches any of them. + + + + Gets or sets the condition to be tested. + + + + + + Gets or sets the resulting filter to be applied when the condition matches. + + + + + + Filters log entries based on a condition. + + Documentation on NLog Wiki + +

This example causes the messages not contains the string '1' to be ignored.

+

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ The above examples assume just one target and a single rule. See below for + a programmatic configuration that's equivalent to the above config file: +

+ +
+
+ + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target. + The wrapped target. + The condition. + + + + Initializes a new instance of the class. + + The wrapped target. + The condition. + + + + Gets or sets the condition expression. Log events who meet this condition will be forwarded + to the wrapped target. + + + + + + Gets or sets the filter. Log events who evaluates to will be discarded + + + + + + + + + Checks the condition against the passed log event. + If the condition is met, the log event is forwarded to + the wrapped target. + + Log event. + + + + + + + Impersonates another user for the duration of the write. + + Documentation on NLog Wiki + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target. + The wrapped target. + + + + Initializes a new instance of the class. + + The wrapped target. + + + + Gets or sets username to change context to. + + + + + + Gets or sets the user account password. + + + + + + Gets or sets Windows domain name to change context to. + + + + + + Gets or sets the Logon Type. + + + + + + Gets or sets the type of the logon provider. + + + + + + Gets or sets the required impersonation level. + + + + + + Gets or sets a value indicating whether to revert to the credentials of the process instead of impersonating another user. + + + + + + Initializes the impersonation context. + + + + + Closes the impersonation context. + + + + + Changes the security context, forwards the call to the .Write() + and switches the context back to original. + + The log event. + + + + NOTE! Obsolete, instead override Write(IList{AsyncLogEventInfo} logEvents) + + Writes an array of logging events to the log target. By default it iterates on all + events and passes them to "Write" method. Inheriting classes can use this method to + optimize batch writes. + + Logging events to be written out. + + + + Changes the security context, forwards the call to the .Write() + and switches the context back to original. + + Log events. + + + + Flush any pending log messages (in case of asynchronous targets). + + The asynchronous continuation. + + + + Helper class which reverts the given + to its original value as part of . + + + + + Initializes a new instance of the class. + + The windows impersonation context. + + + + Reverts the impersonation context. + + + + + Limits the number of messages written per timespan to the wrapped target. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The name of the target. + The wrapped target. + + + + Initializes a new instance of the class. + + The wrapped target. + + + + Initializes a new instance of the class. + + The wrapped target. + Maximum number of messages written per interval. + Interval in which the maximum number of messages can be written. + + + + Gets or sets the maximum allowed number of messages written per . + + + Messages received after has been reached in the current will be discarded. + + + + + + Gets or sets the interval in which messages will be written up to the number of messages. + + + Messages received after has been reached in the current will be discarded. + + + + + + Gets the DateTime when the current will be reset. + + + + + + Gets the number of written in the current . + + + + + + Initializes the target and resets the current Interval and . + + + + + Writes log event to the wrapped target if the current is lower than . + If the is already reached, no log event will be written to the wrapped target. + resets when the current is expired. + + Log event to be written out. + + + + Arguments for events. + + + + + + + + Instance of that was dropped by + + + + + Raises by when + queue is full + and setted to + By default queue doubles it size. + + + + + Contains items count and new queue size. + + Required queue size + Current queue size + + + + New queue size + + + + + Current requests count + + + + + Logon provider. + + + + + Use the standard logon provider for the system. + + + The default security provider is negotiate, unless you pass NULL for the domain name and the user name + is not in UPN format. In this case, the default provider is NTLM. + NOTE: Windows 2000/NT: The default security provider is NTLM. + + + + + Filters buffered log entries based on a set of conditions that are evaluated on a group of events. + + Documentation on NLog Wiki + + PostFilteringWrapper must be used with some type of buffering target or wrapper, such as + AsyncTargetWrapper, BufferingWrapper or ASPNetBufferingWrapper. + + +

+ This example works like this. If there are no Warn,Error or Fatal messages in the buffer + only Info messages are written to the file, but if there are any warnings or errors, + the output includes detailed trace (levels >= Debug). You can plug in a different type + of buffering wrapper (such as ASPNetBufferingWrapper) to achieve different + functionality. +

+

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ The above examples assume just one target and a single rule. See below for + a programmatic configuration that's equivalent to the above config file: +

+ +
+
+ + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target. + The wrapped target. + + + + Gets or sets the default filter to be applied when no specific rule matches. + + + + + + Gets the collection of filtering rules. The rules are processed top-down + and the first rule that matches determines the filtering condition to + be applied to log events. + + + + + + + + + + + + NOTE! Obsolete, instead override Write(IList{AsyncLogEventInfo} logEvents) + + Writes an array of logging events to the log target. By default it iterates on all + events and passes them to "Write" method. Inheriting classes can use this method to + optimize batch writes. + + Logging events to be written out. + + + + Evaluates all filtering rules to find the first one that matches. + The matching rule determines the filtering condition to be applied + to all items in a buffer. If no condition matches, default filter + is applied to the array of log events. + + Array of log events to be post-filtered. + + + + Evaluate all the rules to get the filtering condition + + + + + + + Sends log messages to a randomly selected target. + + Documentation on NLog Wiki + +

This example causes the messages to be written to either file1.txt or file2.txt + chosen randomly on a per-message basis. +

+

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ The above examples assume just one target and a single rule. See below for + a programmatic configuration that's equivalent to the above config file: +

+ +
+
+ + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target. + The targets. + + + + Initializes a new instance of the class. + + The targets. + + + + Forwards the log event to one of the sub-targets. + The sub-target is randomly chosen. + + The log event. + + + + Repeats each log event the specified number of times. + + Documentation on NLog Wiki + +

This example causes each log message to be repeated 3 times.

+

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ The above examples assume just one target and a single rule. See below for + a programmatic configuration that's equivalent to the above config file: +

+ +
+
+ + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target. + The wrapped target. + The repeat count. + + + + Initializes a new instance of the class. + + The wrapped target. + The repeat count. + + + + Gets or sets the number of times to repeat each log message. + + + + + + Forwards the log message to the by calling the method times. + + The log event. + + + + Retries in case of write error. + + Documentation on NLog Wiki + +

This example causes each write attempt to be repeated 3 times, + sleeping 1 second between attempts if first one fails.

+

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ The above examples assume just one target and a single rule. See below for + a programmatic configuration that's equivalent to the above config file: +

+ +
+
+ + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target. + The wrapped target. + The retry count. + The retry delay milliseconds. + + + + Initializes a new instance of the class. + + The wrapped target. + The retry count. + The retry delay milliseconds. + + + + Gets or sets the number of retries that should be attempted on the wrapped target in case of a failure. + + + + + + Gets or sets the time to wait between retries in milliseconds. + + + + + + Special SyncObject to allow closing down Target while busy retrying + + + + + Writes the specified log event to the wrapped target, retrying and pausing in case of an error. + + The log event. + + + + Writes the specified log event to the wrapped target in a thread-safe manner. + + The log event. + + + + Writes the specified log event to the wrapped target, retrying and pausing in case of an error. + + The log event. + + + + Distributes log events to targets in a round-robin fashion. + + Documentation on NLog Wiki + +

This example causes the messages to be written to either file1.txt or file2.txt. + Each odd message is written to file2.txt, each even message goes to file1.txt. +

+

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ The above examples assume just one target and a single rule. See below for + a programmatic configuration that's equivalent to the above config file: +

+ +
+
+ + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target. + The targets. + + + + Initializes a new instance of the class. + + The targets. + + + + Ensures forwarding happens without holding lock + + + + + + Forwards the write to one of the targets from + the collection. + + The log event. + + The writes are routed in a round-robin fashion. + The first log event goes to the first target, the second + one goes to the second target and so on looping to the + first target when there are no more targets available. + In general request N goes to Targets[N % Targets.Count]. + + + + + Impersonation level. + + + + + Anonymous Level. + + + + + Identification Level. + + + + + Impersonation Level. + + + + + Delegation Level. + + + + + Logon type. + + + + + Interactive Logon. + + + This logon type is intended for users who will be interactively using the computer, such as a user being logged on + by a terminal server, remote shell, or similar process. + This logon type has the additional expense of caching logon information for disconnected operations; + therefore, it is inappropriate for some client/server applications, + such as a mail server. + + + + + Network Logon. + + + This logon type is intended for high performance servers to authenticate plaintext passwords. + The LogonUser function does not cache credentials for this logon type. + + + + + Batch Logon. + + + This logon type is intended for batch servers, where processes may be executing on behalf of a user without + their direct intervention. This type is also for higher performance servers that process many plaintext + authentication attempts at a time, such as mail or Web servers. + The LogonUser function does not cache credentials for this logon type. + + + + + Logon as a Service. + + + Indicates a service-type logon. The account provided must have the service privilege enabled. + + + + + Network Clear Text Logon. + + + This logon type preserves the name and password in the authentication package, which allows the server to make + connections to other network servers while impersonating the client. A server can accept plaintext credentials + from a client, call LogonUser, verify that the user can access the system across the network, and still + communicate with other servers. + NOTE: Windows NT: This value is not supported. + + + + + New Network Credentials. + + + This logon type allows the caller to clone its current token and specify new credentials for outbound connections. + The new logon session has the same local identifier but uses different credentials for other network connections. + NOTE: This logon type is supported only by the LOGON32_PROVIDER_WINNT50 logon provider. + NOTE: Windows NT: This value is not supported. + + + + + Writes log events to all targets. + + Documentation on NLog Wiki + +

This example causes the messages to be written to both file1.txt or file2.txt +

+

+ To set up the target in the configuration file, + use the following syntax: +

+ +

+ The above examples assume just one target and a single rule. See below for + a programmatic configuration that's equivalent to the above config file: +

+ +
+
+ + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the target. + The targets. + + + + Initializes a new instance of the class. + + The targets. + + + + Forwards the specified log event to all sub-targets. + + The log event. + + + + NOTE! Obsolete, instead override Write(IList{AsyncLogEventInfo} logEvents) + + Writes an array of logging events to the log target. By default it iterates on all + events and passes them to "Write" method. Inheriting classes can use this method to + optimize batch writes. + + Logging events to be written out. + + + + Writes an array of logging events to the log target. By default it iterates on all + events and passes them to "Write" method. Inheriting classes can use this method to + optimize batch writes. + + Logging events to be written out. + + + + Base class for targets wrap other (single) targets. + + + + + Gets or sets the target that is wrapped by this target. + + + + + + Returns the text representation of the object. Used for diagnostics. + + A string that describes the target. + + + + Flush any pending log messages (in case of asynchronous targets). + + The asynchronous continuation. + + + + Writes logging event to the log target. Must be overridden in inheriting + classes. + + Logging event to be written out. + + + + Current local time retrieved directly from DateTime.Now. + + + + + Gets current local time directly from DateTime.Now. + + + + + Converts the specified system time to the same form as the time value originated from this time source. + + The system originated time value to convert. + + The value of converted to local time. + + + + + Current UTC time retrieved directly from DateTime.UtcNow. + + + + + Gets current UTC time directly from DateTime.UtcNow. + + + + + Converts the specified system time to the same form as the time value originated from this time source. + + The system originated time value to convert. + + The value of converted to UTC time. + + + + + Fast time source that updates current time only once per tick (15.6 milliseconds). + + + + + Gets raw uncached time from derived time source. + + + + + Gets current time cached for one system tick (15.6 milliseconds). + + + + + Fast local time source that is updated once per tick (15.6 milliseconds). + + + + + Gets uncached local time directly from DateTime.Now. + + + + + Converts the specified system time to the same form as the time value originated from this time source. + + The system originated time value to convert. + + The value of converted to local time. + + + + + Fast UTC time source that is updated once per tick (15.6 milliseconds). + + + + + Gets uncached UTC time directly from DateTime.UtcNow. + + + + + Converts the specified system time to the same form as the time value originated from this time source. + + The system originated time value to convert. + + The value of converted to UTC time. + + + + + Defines source of current time. + + + + + Gets current time. + + + + + Gets or sets current global time source used in all log events. + + + Default time source is . + + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Converts the specified system time to the same form as the time value originated from this time source. + + The system originated time value to convert. + + The value of converted to the same form + as time values originated from this source. + + + + There are situations when NLog have to compare the time originated from TimeSource + to the time originated externally in the system. + To be able to provide meaningful result of such comparisons the system time must be expressed in + the same form as TimeSource time. + + + Examples: + - If the TimeSource provides time values of local time, it should also convert the provided + to the local time. + - If the TimeSource shifts or skews its time values, it should also apply + the same transform to the given . + + + + + + Marks class as a time source and assigns a name to it. + + + + + Initializes a new instance of the class. + + Name of the time source. + +
+
diff --git a/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Newtonsoft.Json.xml b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Newtonsoft.Json.xml new file mode 100644 index 00000000..cd4ec4a5 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Newtonsoft.Json.xml @@ -0,0 +1,9556 @@ + + + + Newtonsoft.Json + + + + + Represents a BSON Oid (object id). + + + + + Gets or sets the value of the Oid. + + The value of the Oid. + + + + Initializes a new instance of the class. + + The Oid value. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized BSON data. + + + + + Gets or sets a value indicating whether binary data reading should be compatible with incorrect Json.NET 3.5 written binary. + + + true if binary data reading will be compatible with incorrect Json.NET 3.5 written binary; otherwise, false. + + + + + Gets or sets a value indicating whether the root object will be read as a JSON array. + + + true if the root object will be read as a JSON array; otherwise, false. + + + + + Gets or sets the used when reading values from BSON. + + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating BSON data. + + + + + Gets or sets the used when writing values to BSON. + When set to no conversion will occur. + + The used when writing values to BSON. + + + + Initializes a new instance of the class. + + The to write to. + + + + Initializes a new instance of the class. + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying stream. + + + + + Writes the end. + + The token. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes the beginning of a JSON array. + + + + + Writes the beginning of a JSON object. + + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value that represents a BSON object id. + + The Object ID value to write. + + + + Writes a BSON regex. + + The regex pattern. + The regex options. + + + + Specifies how constructors are used when initializing objects during deserialization by the . + + + + + First attempt to use the public default constructor, then fall back to a single parameterized constructor, then to the non-public default constructor. + + + + + Json.NET will use a non-public default constructor before falling back to a parameterized constructor. + + + + + Converts a binary value to and from a base 64 string value. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Creates a custom object. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Creates an object which will then be populated by the serializer. + + Type of the object. + The created object. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Provides a base class for converting a to and from JSON. + + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a F# discriminated union type to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an Entity Framework to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Converts a to and from the ISO 8601 date format (e.g. "2008-04-12T12:53Z"). + + + + + Gets or sets the date time styles used when converting a date to and from JSON. + + The date time styles used when converting a date to and from JSON. + + + + Gets or sets the date time format used when converting a date to and from JSON. + + The date time format used when converting a date to and from JSON. + + + + Gets or sets the culture used when converting a date to and from JSON. + + The culture used when converting a date to and from JSON. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Converts a to and from a JavaScript Date constructor (e.g. new Date(52231943)). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from its name string value. + + + + + Gets or sets a value indicating whether the written enum text should be camel case. + The default value is false. + + true if the written enum text will be camel case; otherwise, false. + + + + Gets or sets the naming strategy used to resolve how enum text is written. + + The naming strategy used to resolve how enum text is written. + + + + Gets or sets a value indicating whether integer values are allowed when serializing and deserializing. + The default value is true. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + true if the written enum text will be camel case; otherwise, false. + + + + Initializes a new instance of the class. + + The naming strategy used to resolve how enum text is written. + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from Unix epoch time + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from a string (e.g. "1.2.3.4"). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts XML to and from JSON. + + + + + Gets or sets the name of the root element to insert when deserializing to XML if the JSON structure has produced multiple root elements. + + The name of the deserialized root element. + + + + Gets or sets a value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + true if the array attribute is written to the XML; otherwise, false. + + + + Gets or sets a value indicating whether to write the root JSON object. + + true if the JSON root object is omitted; otherwise, false. + + + + Gets or sets a value indicating whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + true if special characters are encoded; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The calling serializer. + The value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Checks if the is a namespace attribute. + + Attribute name to test. + The attribute name prefix if it has one, otherwise an empty string. + true if attribute name is for a namespace attribute, otherwise false. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Specifies how dates are formatted when writing JSON text. + + + + + Dates are written in the ISO 8601 format, e.g. "2012-03-21T05:40Z". + + + + + Dates are written in the Microsoft JSON format, e.g. "\/Date(1198908717056)\/". + + + + + Specifies how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON text. + + + + + Date formatted strings are not parsed to a date type and are read as strings. + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Specifies how to treat the time value when converting between string and . + + + + + Treat as local time. If the object represents a Coordinated Universal Time (UTC), it is converted to the local time. + + + + + Treat as a UTC. If the object represents a local time, it is converted to a UTC. + + + + + Treat as a local time if a is being converted to a string. + If a string is being converted to , convert to a local time if a time zone is specified. + + + + + Time zone information should be preserved when converting. + + + + + The default JSON name table implementation. + + + + + Initializes a new instance of the class. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Adds the specified string into name table. + + The string to add. + This method is not thread-safe. + The resolved string. + + + + Specifies default value handling options for the . + + + + + + + + + Include members where the member value is the same as the member's default value when serializing objects. + Included members are written to JSON. Has no effect when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + so that it is not written to JSON. + This option will ignore all default values (e.g. null for objects and nullable types; 0 for integers, + decimals and floating point numbers; and false for booleans). The default value ignored can be changed by + placing the on the property. + + + + + Members with a default value but no JSON will be set to their default value when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + and set members to their default value when deserializing. + + + + + Specifies float format handling options when writing special floating point numbers, e.g. , + and with . + + + + + Write special floating point values as strings in JSON, e.g. "NaN", "Infinity", "-Infinity". + + + + + Write special floating point values as symbols in JSON, e.g. NaN, Infinity, -Infinity. + Note that this will produce non-valid JSON. + + + + + Write special floating point values as the property's default value in JSON, e.g. 0.0 for a property, null for a of property. + + + + + Specifies how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Floating point numbers are parsed to . + + + + + Floating point numbers are parsed to . + + + + + Specifies formatting options for the . + + + + + No special formatting is applied. This is the default. + + + + + Causes child objects to be indented according to the and settings. + + + + + Provides an interface for using pooled arrays. + + The array type content. + + + + Rent an array from the pool. This array must be returned when it is no longer needed. + + The minimum required length of the array. The returned array may be longer. + The rented array from the pool. This array must be returned when it is no longer needed. + + + + Return an array to the pool. + + The array that is being returned. + + + + Provides an interface to enable a class to return line and position information. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + The current line number or 0 if no line information is available (for example, when returns false). + + + + Gets the current line position. + + The current line position or 0 if no line information is available (for example, when returns false). + + + + Instructs the how to serialize the collection. + + + + + Gets or sets a value indicating whether null items are allowed in the collection. + + true if null items are allowed in the collection; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a flag indicating whether the array can contain null items. + + A flag indicating whether the array can contain null items. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to use the specified constructor when deserializing that object. + + + + + Instructs the how to serialize the object. + + + + + Gets or sets the id. + + The id. + + + + Gets or sets the title. + + The title. + + + + Gets or sets the description. + + The description. + + + + Gets or sets the collection's items converter. + + The collection's items converter. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets a value that indicates whether to preserve object references. + + + true to keep object reference; otherwise, false. The default is false. + + + + + Gets or sets a value that indicates whether to preserve collection's items references. + + + true to keep collection's items object references; otherwise, false. The default is false. + + + + + Gets or sets the reference loop handling used when serializing the collection's items. + + The reference loop handling. + + + + Gets or sets the type name handling used when serializing the collection's items. + + The type name handling. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Provides methods for converting between .NET types and JSON types. + + + + + + + + Gets or sets a function that creates default . + Default settings are automatically used by serialization methods on , + and and on . + To serialize without using any default settings create a with + . + + + + + Represents JavaScript's boolean value true as a string. This field is read-only. + + + + + Represents JavaScript's boolean value false as a string. This field is read-only. + + + + + Represents JavaScript's null as a string. This field is read-only. + + + + + Represents JavaScript's undefined as a string. This field is read-only. + + + + + Represents JavaScript's positive infinity as a string. This field is read-only. + + + + + Represents JavaScript's negative infinity as a string. This field is read-only. + + + + + Represents JavaScript's NaN as a string. This field is read-only. + + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + The time zone handling when the date is converted to a string. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + The string escape handling. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Serializes the specified object to a JSON string. + + The object to serialize. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting. + + The object to serialize. + Indicates how the output should be formatted. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a collection of . + + The object to serialize. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting and a collection of . + + The object to serialize. + Indicates how the output should be formatted. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Deserializes the JSON to a .NET object. + + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to a .NET object using . + + The JSON to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The JSON to deserialize. + The of object being deserialized. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The type of the object to deserialize to. + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the given anonymous type. + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the given anonymous type using . + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The type of the object to deserialize to. + The JSON to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The type of the object to deserialize to. + The object to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The JSON to deserialize. + The type of the object to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The JSON to deserialize. + The type of the object to deserialize to. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Populates the object with values from the JSON string. + + The JSON to populate values from. + The target object to populate values onto. + + + + Populates the object with values from the JSON string using . + + The JSON to populate values from. + The target object to populate values onto. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + + + + Serializes the to a JSON string. + + The node to serialize. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to serialize. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Serializes the to a JSON string. + + The node to convert to JSON. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to convert to JSON. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Converts an object to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can read JSON. + + true if this can read JSON; otherwise, false. + + + + Gets a value indicating whether this can write JSON. + + true if this can write JSON; otherwise, false. + + + + Converts an object to and from JSON. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. If there is no existing value then null will be used. + The existing value has a value. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Instructs the to use the specified when serializing the member or class. + + + + + Gets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + + + + + Initializes a new instance of the class. + + Type of the . + + + + Initializes a new instance of the class. + + Type of the . + Parameter list to use when constructing the . Can be null. + + + + Represents a collection of . + + + + + Instructs the how to serialize the collection. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Instructs the to deserialize properties with no matching class member into the specified collection + and write values during serialization. + + + + + Gets or sets a value that indicates whether to write extension data when serializing the object. + + + true to write extension data when serializing the object; otherwise, false. The default is true. + + + + + Gets or sets a value that indicates whether to read extension data when deserializing the object. + + + true to read extension data when deserializing the object; otherwise, false. The default is true. + + + + + Initializes a new instance of the class. + + + + + Instructs the not to serialize the public field or public read/write property value. + + + + + Base class for a table of atomized string objects. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Instructs the how to serialize the object. + + + + + Gets or sets the member serialization. + + The member serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified member serialization. + + The member serialization. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to always serialize the member with the specified name. + + + + + Gets or sets the type used when serializing the property's collection items. + + The collection's items type. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the null value handling used when serializing this property. + + The null value handling. + + + + Gets or sets the default value handling used when serializing this property. + + The default value handling. + + + + Gets or sets the reference loop handling used when serializing this property. + + The reference loop handling. + + + + Gets or sets the object creation handling used when deserializing this property. + + The object creation handling. + + + + Gets or sets the type name handling used when serializing this property. + + The type name handling. + + + + Gets or sets whether this property's value is serialized as a reference. + + Whether this property's value is serialized as a reference. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets a value indicating whether this property is required. + + + A value indicating whether this property is required. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified name. + + Name of the property. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Specifies the state of the reader. + + + + + A read method has not been called. + + + + + The end of the file has been reached successfully. + + + + + Reader is at a property. + + + + + Reader is at the start of an object. + + + + + Reader is in an object. + + + + + Reader is at the start of an array. + + + + + Reader is in an array. + + + + + The method has been called. + + + + + Reader has just read a value. + + + + + Reader is at the start of a constructor. + + + + + Reader is in a constructor. + + + + + An error occurred that prevents the read operation from continuing. + + + + + The end of the file has been reached successfully. + + + + + Gets the current reader state. + + The current reader state. + + + + Gets or sets a value indicating whether the source should be closed when this reader is closed. + + + true to close the source when this reader is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether multiple pieces of JSON content can + be read from a continuous stream without erroring. + + + true to support reading multiple pieces of JSON content; otherwise false. + The default is false. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + Gets or sets how time zones are handled when reading JSON. + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Gets or sets how custom date formatted strings are parsed when reading JSON. + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + + + + + Gets the type of the current JSON token. + + + + + Gets the text value of the current JSON token. + + + + + Gets the .NET type for the current JSON token. + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets or sets the culture used when reading JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Reads the next JSON token from the source. + + true if the next token was read successfully; false if there are no more tokens to read. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Skips the children of the current token. + + + + + Sets the current token. + + The new token. + + + + Sets the current token and value. + + The new token. + The value. + + + + Sets the current token and value. + + The new token. + The value. + A flag indicating whether the position index inside an array should be updated. + + + + Sets the state based on current token type. + + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Changes the reader's state to . + If is set to true, the source is also closed. + + + + + The exception thrown when an error occurs while reading JSON text. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Instructs the to always serialize the member, and to require that the member has a value. + + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Serializes and deserializes objects into and from the JSON format. + The enables you to control how objects are encoded into JSON. + + + + + Occurs when the errors during serialization and deserialization. + + + + + Gets or sets the used by the serializer when resolving references. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + + + + Gets or sets how reference loops (e.g. a class referencing itself) is handled. + The default value is . + + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets a collection that will be used during serialization. + + Collection that will be used during serialization. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is null. + + + + + Gets a value indicating whether there will be a check for additional JSON content after deserializing an object. + The default value is false. + + + true if there will be a check for additional JSON content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Creates a new instance. + The will not use default settings + from . + + + A new instance. + The will not use default settings + from . + + + + + Creates a new instance using the specified . + The will not use default settings + from . + + The settings to be applied to the . + + A new instance using the specified . + The will not use default settings + from . + + + + + Creates a new instance. + The will use default settings + from . + + + A new instance. + The will use default settings + from . + + + + + Creates a new instance using the specified . + The will use default settings + from as well as the specified . + + The settings to be applied to the . + + A new instance using the specified . + The will use default settings + from as well as the specified . + + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Deserializes the JSON structure contained by the specified . + + The that contains the JSON structure to deserialize. + The being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The type of the object to deserialize. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Specifies the settings on a object. + + + + + Gets or sets how reference loops (e.g. a class referencing itself) are handled. + The default value is . + + Reference loop handling. + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + Missing member handling. + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + Null value handling. + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + The default value handling. + + + + Gets or sets a collection that will be used during serialization. + + The converters. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + The preserve references handling. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + The type name handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + The contract resolver. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets the used by the serializer when resolving references. + + The reference resolver. + + + + Gets or sets a function that creates the used by the serializer when resolving references. + + A function that creates the used by the serializer when resolving references. + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the error handler called during serialization and deserialization. + + The error handler called during serialization and deserialization. + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is null. + + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets a value indicating whether there will be a check for additional content after deserializing an object. + The default value is false. + + + true if there will be a check for additional content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Represents a reader that provides fast, non-cached, forward-only access to JSON text data. + + + + + Initializes a new instance of the class with the specified . + + The containing the JSON data to read. + + + + Gets or sets the reader's property name table. + + + + + Gets or sets the reader's character buffer pool. + + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + + The current line number or 0 if no line information is available (for example, returns false). + + + + + Gets the current line position. + + + The current line position or 0 if no line information is available (for example, returns false). + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets or sets the writer's character array pool. + + + + + Gets or sets how many s to write for each level in the hierarchy when is set to . + + + + + Gets or sets which character to use to quote attribute values. + + + + + Gets or sets which character to use for indenting when is set to . + + + + + Gets or sets a value indicating whether object names will be surrounded with quotes. + + + + + Initializes a new instance of the class using the specified . + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying . + + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the specified end token. + + The end token to write. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Specifies the type of JSON token. + + + + + This is returned by the if a read method has not been called. + + + + + An object start token. + + + + + An array start token. + + + + + A constructor start token. + + + + + An object property name. + + + + + A comment. + + + + + Raw JSON. + + + + + An integer. + + + + + A float. + + + + + A string. + + + + + A boolean. + + + + + A null token. + + + + + An undefined token. + + + + + An object end token. + + + + + An array end token. + + + + + A constructor end token. + + + + + A Date. + + + + + Byte data. + + + + + + Represents a reader that provides validation. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Sets an event handler for receiving schema validation errors. + + + + + Gets the text value of the current JSON token. + + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + + Gets the type of the current JSON token. + + + + + + Gets the .NET type for the current JSON token. + + + + + + Initializes a new instance of the class that + validates the content returned from the given . + + The to read from while validating. + + + + Gets or sets the schema. + + The schema. + + + + Gets the used to construct this . + + The specified in the constructor. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a []. + + + A [] or null if the next JSON token is null. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets or sets a value indicating whether the destination should be closed when this writer is closed. + + + true to close the destination when this writer is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether the JSON should be auto-completed when this writer is closed. + + + true to auto-complete the JSON when this writer is closed; otherwise false. The default is true. + + + + + Gets the top. + + The top. + + + + Gets the state of the writer. + + + + + Gets the path of the writer. + + + + + Gets or sets a value indicating how JSON text output should be formatted. + + + + + Gets or sets how dates are written to JSON text. + + + + + Gets or sets how time zones are handled when writing JSON text. + + + + + Gets or sets how strings are escaped when writing JSON text. + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written to JSON text. + + + + + Gets or sets how and values are formatted when writing JSON text. + + + + + Gets or sets the culture used when writing JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the destination and also flushes the destination. + + + + + Closes this writer. + If is set to true, the destination is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the end of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the end of an array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end constructor. + + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes the end of the current JSON object or array. + + + + + Writes the current token and its children. + + The to read the token from. + + + + Writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + + + + Writes the token and its value. + + The to write. + + The value to write. + A value is only required for tokens that have an associated value, e.g. the property name for . + null can be passed to the method for tokens that don't have a value, e.g. . + + + + + Writes the token. + + The to write. + + + + Writes the specified end token. + + The end token to write. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON without changing the writer's state. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Sets the state of the . + + The being written. + The value being written. + + + + The exception thrown when an error occurs while writing JSON text. + + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Specifies how JSON comments are handled when loading JSON. + + + + + Ignore comments. + + + + + Load comments as a with type . + + + + + Specifies how duplicate property names are handled when loading JSON. + + + + + Replace the existing value when there is a duplicate property. The value of the last property in the JSON object will be used. + + + + + Ignore the new value when there is a duplicate property. The value of the first property in the JSON object will be used. + + + + + Throw a when a duplicate property is encountered. + + + + + Contains the LINQ to JSON extension methods. + + + + + Returns a collection of tokens that contains the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the descendants of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, and the descendants of every token in the source collection. + + + + Returns a collection of child properties of every object in the source collection. + + An of that contains the source collection. + An of that contains the properties of every object in the source collection. + + + + Returns a collection of child values of every object in the source collection with the given key. + + An of that contains the source collection. + The token key. + An of that contains the values of every token in the source collection with the given key. + + + + Returns a collection of child values of every object in the source collection. + + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child values of every object in the source collection with the given key. + + The type to convert the values to. + An of that contains the source collection. + The token key. + An that contains the converted values of every token in the source collection with the given key. + + + + Returns a collection of converted child values of every object in the source collection. + + The type to convert the values to. + An of that contains the source collection. + An that contains the converted values of every token in the source collection. + + + + Converts the value. + + The type to convert the value to. + A cast as a of . + A converted value. + + + + Converts the value. + + The source collection type. + The type to convert the value to. + A cast as a of . + A converted value. + + + + Returns a collection of child tokens of every array in the source collection. + + The source collection type. + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child tokens of every array in the source collection. + + An of that contains the source collection. + The type to convert the values to. + The source collection type. + An that contains the converted values of every token in the source collection. + + + + Returns the input typed as . + + An of that contains the source collection. + The input typed as . + + + + Returns the input typed as . + + The source collection type. + An of that contains the source collection. + The input typed as . + + + + Represents a collection of objects. + + The type of token. + + + + Gets the of with the specified key. + + + + + + Represents a JSON array. + + + + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads an from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the at the specified index. + + + + + + Determines the index of a specific item in the . + + The object to locate in the . + + The index of if found in the list; otherwise, -1. + + + + + Inserts an item to the at the specified index. + + The zero-based index at which should be inserted. + The object to insert into the . + + is not a valid index in the . + + + + + Removes the item at the specified index. + + The zero-based index of the item to remove. + + is not a valid index in the . + + + + + Returns an enumerator that iterates through the collection. + + + A of that can be used to iterate through the collection. + + + + + Adds an item to the . + + The object to add to the . + + + + Removes all items from the . + + + + + Determines whether the contains a specific value. + + The object to locate in the . + + true if is found in the ; otherwise, false. + + + + + Copies the elements of the to an array, starting at a particular array index. + + The array. + Index of the array. + + + + Gets a value indicating whether the is read-only. + + true if the is read-only; otherwise, false. + + + + Removes the first occurrence of a specific object from the . + + The object to remove from the . + + true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . + + + + + Represents a JSON constructor. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets or sets the name of this constructor. + + The constructor name. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name. + + The constructor name. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a token that can contain other tokens. + + + + + Occurs when the list changes or an item in the list changes. + + + + + Occurs before an item is added to the collection. + + + + + Occurs when the items list of the collection has changed, or the collection is reset. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Raises the event. + + The instance containing the event data. + + + + Raises the event. + + The instance containing the event data. + + + + Raises the event. + + The instance containing the event data. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Get the first child token of this token. + + + A containing the first child token of the . + + + + + Get the last child token of this token. + + + A containing the last child token of the . + + + + + Returns a collection of the child tokens of this token, in document order. + + + An of containing the child tokens of this , in document order. + + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + + A containing the child values of this , in document order. + + + + + Returns a collection of the descendant tokens for this token in document order. + + An of containing the descendant tokens of the . + + + + Returns a collection of the tokens that contain this token, and all descendant tokens of this token, in document order. + + An of containing this token, and all the descendant tokens of the . + + + + Adds the specified content as children of this . + + The content to be added. + + + + Adds the specified content as the first children of this . + + The content to be added. + + + + Creates a that can be used to add tokens to the . + + A that is ready to have content written to it. + + + + Replaces the child nodes of this token with the specified content. + + The content. + + + + Removes the child nodes from this token. + + + + + Merge the specified content into this . + + The content to be merged. + + + + Merge the specified content into this using . + + The content to be merged. + The used to merge the content. + + + + Gets the count of child JSON tokens. + + The count of child JSON tokens. + + + + Represents a collection of objects. + + The type of token. + + + + An empty collection of objects. + + + + + Initializes a new instance of the struct. + + The enumerable. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Gets the of with the specified key. + + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Represents a JSON object. + + + + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Occurs when a property value changes. + + + + + Occurs when a property value is changing. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Gets the node type for this . + + The type. + + + + Gets an of of this object's properties. + + An of of this object's properties. + + + + Gets a with the specified name. + + The property name. + A with the specified name or null. + + + + Gets the with the specified name. + The exact name will be searched for first and if no matching property is found then + the will be used to match a property. + + The property name. + One of the enumeration values that specifies how the strings will be compared. + A matched with the specified name or null. + + + + Gets a of of this object's property values. + + A of of this object's property values. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the with the specified property name. + + + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified property name. + + Name of the property. + The with the specified property name. + + + + Gets the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + One of the enumeration values that specifies how the strings will be compared. + The with the specified property name. + + + + Tries to get the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + The value. + One of the enumeration values that specifies how the strings will be compared. + true if a value was successfully retrieved; otherwise, false. + + + + Adds the specified property name. + + Name of the property. + The value. + + + + Determines whether the JSON object has the specified property name. + + Name of the property. + true if the JSON object has the specified property name; otherwise, false. + + + + Removes the property with the specified name. + + Name of the property. + true if item was successfully removed; otherwise, false. + + + + Tries to get the with the specified property name. + + Name of the property. + The value. + true if a value was successfully retrieved; otherwise, false. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Represents a JSON property. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the property name. + + The property name. + + + + Gets or sets the property value. + + The property value. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a view of a . + + + + + Initializes a new instance of the class. + + The name. + + + + When overridden in a derived class, returns whether resetting an object changes its value. + + + true if resetting the component changes its value; otherwise, false. + + The component to test for reset capability. + + + + When overridden in a derived class, gets the current value of the property on a component. + + + The value of a property for a given component. + + The component with the property for which to retrieve the value. + + + + When overridden in a derived class, resets the value for this property of the component to the default value. + + The component with the property value that is to be reset to the default value. + + + + When overridden in a derived class, sets the value of the component to a different value. + + The component with the property value that is to be set. + The new value. + + + + When overridden in a derived class, determines a value indicating whether the value of this property needs to be persisted. + + + true if the property should be persisted; otherwise, false. + + The component with the property to be examined for persistence. + + + + When overridden in a derived class, gets the type of the component this property is bound to. + + + A that represents the type of component this property is bound to. + When the or + + methods are invoked, the object specified might be an instance of this type. + + + + + When overridden in a derived class, gets a value indicating whether this property is read-only. + + + true if the property is read-only; otherwise, false. + + + + + When overridden in a derived class, gets the type of the property. + + + A that represents the type of the property. + + + + + Gets the hash code for the name of the member. + + + + The hash code for the name of the member. + + + + + Represents a raw JSON string. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class. + + The raw json. + + + + Creates an instance of with the content of the reader's current token. + + The reader. + An instance of with the content of the reader's current token. + + + + Specifies the settings used when loading JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets how JSON comments are handled when loading JSON. + The default value is . + + The JSON comment handling. + + + + Gets or sets how JSON line info is handled when loading JSON. + The default value is . + + The JSON line info handling. + + + + Gets or sets how duplicate property names in JSON objects are handled when loading JSON. + The default value is . + + The JSON duplicate property name handling. + + + + Specifies the settings used when merging JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the method used when merging JSON arrays. + + The method used when merging JSON arrays. + + + + Gets or sets how null value properties are merged. + + How null value properties are merged. + + + + Gets or sets the comparison used to match property names while merging. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + The comparison used to match property names while merging. + + + + Represents an abstract JSON token. + + + + + Gets a comparer that can compare two tokens for value equality. + + A that can compare two nodes for value equality. + + + + Gets or sets the parent. + + The parent. + + + + Gets the root of this . + + The root of this . + + + + Gets the node type for this . + + The type. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Compares the values of two tokens, including the values of all descendant tokens. + + The first to compare. + The second to compare. + true if the tokens are equal; otherwise false. + + + + Gets the next sibling token of this node. + + The that contains the next sibling token. + + + + Gets the previous sibling token of this node. + + The that contains the previous sibling token. + + + + Gets the path of the JSON token. + + + + + Adds the specified content immediately after this token. + + A content object that contains simple content or a collection of content objects to be added after this token. + + + + Adds the specified content immediately before this token. + + A content object that contains simple content or a collection of content objects to be added before this token. + + + + Returns a collection of the ancestor tokens of this token. + + A collection of the ancestor tokens of this token. + + + + Returns a collection of tokens that contain this token, and the ancestors of this token. + + A collection of tokens that contain this token, and the ancestors of this token. + + + + Returns a collection of the sibling tokens after this token, in document order. + + A collection of the sibling tokens after this tokens, in document order. + + + + Returns a collection of the sibling tokens before this token, in document order. + + A collection of the sibling tokens before this token, in document order. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets the with the specified key converted to the specified type. + + The type to convert the token to. + The token key. + The converted token value. + + + + Get the first child token of this token. + + A containing the first child token of the . + + + + Get the last child token of this token. + + A containing the last child token of the . + + + + Returns a collection of the child tokens of this token, in document order. + + An of containing the child tokens of this , in document order. + + + + Returns a collection of the child tokens of this token, in document order, filtered by the specified type. + + The type to filter the child tokens on. + A containing the child tokens of this , in document order. + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + A containing the child values of this , in document order. + + + + Removes this token from its parent. + + + + + Replaces this token with the specified token. + + The value. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Returns the indented JSON for this token. + + + The indented JSON for this token. + + + + + Returns the JSON for this token using the given formatting and converters. + + Indicates how the output should be formatted. + A collection of s which will be used when writing the token. + The JSON for this token using the given formatting and converters. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to []. + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from [] to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Creates a for this token. + + A that can be used to read this token and its descendants. + + + + Creates a from an object. + + The object that will be used to create . + A with the value of the specified object. + + + + Creates a from an object using the specified . + + The object that will be used to create . + The that will be used when reading the object. + A with the value of the specified object. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + Creates a from a . + + A positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Selects a using a JPath expression. Selects the token that matches the object path. + + + A that contains a JPath expression. + + A , or null. + + + + Selects a using a JPath expression. Selects the token that matches the object path. + + + A that contains a JPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + A . + + + + Selects a collection of elements using a JPath expression. + + + A that contains a JPath expression. + + An of that contains the selected elements. + + + + Selects a collection of elements using a JPath expression. + + + A that contains a JPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + An of that contains the selected elements. + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A new instance of the . + + + + Adds an object to the annotation list of this . + + The annotation to add. + + + + Get the first annotation object of the specified type from this . + + The type of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets the first annotation object of the specified type from this . + + The of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets a collection of annotations of the specified type for this . + + The type of the annotations to retrieve. + An that contains the annotations for this . + + + + Gets a collection of annotations of the specified type for this . + + The of the annotations to retrieve. + An of that contains the annotations that match the specified type for this . + + + + Removes the annotations of the specified type from this . + + The type of annotations to remove. + + + + Removes the annotations of the specified type from this . + + The of annotations to remove. + + + + Compares tokens to determine whether they are equal. + + + + + Determines whether the specified objects are equal. + + The first object of type to compare. + The second object of type to compare. + + true if the specified objects are equal; otherwise, false. + + + + + Returns a hash code for the specified object. + + The for which a hash code is to be returned. + A hash code for the specified object. + The type of is a reference type and is null. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Gets the at the reader's current position. + + + + + Initializes a new instance of the class. + + The token to read from. + + + + Initializes a new instance of the class. + + The token to read from. + The initial path of the token. It is prepended to the returned . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Gets the path of the current JSON token. + + + + + Specifies the type of token. + + + + + No token type has been set. + + + + + A JSON object. + + + + + A JSON array. + + + + + A JSON constructor. + + + + + A JSON object property. + + + + + A comment. + + + + + An integer value. + + + + + A float value. + + + + + A string value. + + + + + A boolean value. + + + + + A null value. + + + + + An undefined value. + + + + + A date value. + + + + + A raw JSON value. + + + + + A collection of bytes value. + + + + + A Guid value. + + + + + A Uri value. + + + + + A TimeSpan value. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets the at the writer's current position. + + + + + Gets the token being written. + + The token being written. + + + + Initializes a new instance of the class writing to the given . + + The container being written to. + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the underlying . + + + + + Closes this writer. + If is set to true, the JSON is auto-completed. + + + Setting to true has no additional effect, since the underlying is a type that cannot be closed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end. + + The token. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes a value. + An error will be raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Represents a value in JSON (string, integer, date, etc). + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Creates a comment with the given value. + + The value. + A comment with the given value. + + + + Creates a string with the given value. + + The value. + A string with the given value. + + + + Creates a null value. + + A null value. + + + + Creates a undefined value. + + A undefined value. + + + + Gets the node type for this . + + The type. + + + + Gets or sets the underlying token value. + + The underlying token value. + + + + Writes this token to a . + + A into which this method will write. + A collection of s which will be used when writing the token. + + + + Indicates whether the current object is equal to another object of the same type. + + + true if the current object is equal to the parameter; otherwise, false. + + An object to compare with this object. + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format provider. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + The format provider. + + A that represents this instance. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object. + + An object to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the objects being compared. The return value has these meanings: + Value + Meaning + Less than zero + This instance is less than . + Zero + This instance is equal to . + Greater than zero + This instance is greater than . + + + is not of the same type as this instance. + + + + + Specifies how line information is handled when loading JSON. + + + + + Ignore line information. + + + + + Load line information. + + + + + Specifies how JSON arrays are merged together. + + + + Concatenate arrays. + + + Union arrays, skipping items that already exist. + + + Replace all array items. + + + Merge array items together, matched by index. + + + + Specifies how null value properties are merged. + + + + + The content's null value properties will be ignored during merging. + + + + + The content's null value properties will be merged. + + + + + Specifies the member serialization options for the . + + + + + All public members are serialized by default. Members can be excluded using or . + This is the default member serialization mode. + + + + + Only members marked with or are serialized. + This member serialization mode can also be set by marking the class with . + + + + + All public and private fields are serialized. Members can be excluded using or . + This member serialization mode can also be set by marking the class with + and setting IgnoreSerializableAttribute on to false. + + + + + Specifies metadata property handling options for the . + + + + + Read metadata properties located at the start of a JSON object. + + + + + Read metadata properties located anywhere in a JSON object. Note that this setting will impact performance. + + + + + Do not try to read metadata properties. + + + + + Specifies missing member handling options for the . + + + + + Ignore a missing member and do not attempt to deserialize it. + + + + + Throw a when a missing member is encountered during deserialization. + + + + + Specifies null value handling options for the . + + + + + + + + + Include null values when serializing and deserializing objects. + + + + + Ignore null values when serializing and deserializing objects. + + + + + Specifies how object creation is handled by the . + + + + + Reuse existing objects, create new objects when needed. + + + + + Only reuse existing objects. + + + + + Always create new objects. + + + + + Specifies reference handling options for the . + Note that references cannot be preserved when a value is set via a non-default constructor such as types that implement . + + + + + + + + Do not preserve references when serializing types. + + + + + Preserve references when serializing into a JSON object structure. + + + + + Preserve references when serializing into a JSON array structure. + + + + + Preserve references when serializing. + + + + + Specifies reference loop handling options for the . + + + + + Throw a when a loop is encountered. + + + + + Ignore loop references and do not serialize. + + + + + Serialize loop references. + + + + + Indicating whether a property is required. + + + + + The property is not required. The default state. + + + + + The property must be defined in JSON but can be a null value. + + + + + The property must be defined in JSON and cannot be a null value. + + + + + The property is not required but it cannot be a null value. + + + + + + Contains the JSON schema extension methods. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + true if the specified is valid; otherwise, false. + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + When this method returns, contains any error messages generated while validating. + + true if the specified is valid; otherwise, false. + + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + The validation event handler. + + + + + An in-memory representation of a JSON Schema. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the id. + + + + + Gets or sets the title. + + + + + Gets or sets whether the object is required. + + + + + Gets or sets whether the object is read-only. + + + + + Gets or sets whether the object is visible to users. + + + + + Gets or sets whether the object is transient. + + + + + Gets or sets the description of the object. + + + + + Gets or sets the types of values allowed by the object. + + The type. + + + + Gets or sets the pattern. + + The pattern. + + + + Gets or sets the minimum length. + + The minimum length. + + + + Gets or sets the maximum length. + + The maximum length. + + + + Gets or sets a number that the value should be divisible by. + + A number that the value should be divisible by. + + + + Gets or sets the minimum. + + The minimum. + + + + Gets or sets the maximum. + + The maximum. + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the minimum attribute (). + + A flag indicating whether the value can not equal the number defined by the minimum attribute (). + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the maximum attribute (). + + A flag indicating whether the value can not equal the number defined by the maximum attribute (). + + + + Gets or sets the minimum number of items. + + The minimum number of items. + + + + Gets or sets the maximum number of items. + + The maximum number of items. + + + + Gets or sets the of items. + + The of items. + + + + Gets or sets a value indicating whether items in an array are validated using the instance at their array position from . + + + true if items are validated using their array position; otherwise, false. + + + + + Gets or sets the of additional items. + + The of additional items. + + + + Gets or sets a value indicating whether additional items are allowed. + + + true if additional items are allowed; otherwise, false. + + + + + Gets or sets whether the array items must be unique. + + + + + Gets or sets the of properties. + + The of properties. + + + + Gets or sets the of additional properties. + + The of additional properties. + + + + Gets or sets the pattern properties. + + The pattern properties. + + + + Gets or sets a value indicating whether additional properties are allowed. + + + true if additional properties are allowed; otherwise, false. + + + + + Gets or sets the required property if this property is present. + + The required property if this property is present. + + + + Gets or sets the a collection of valid enum values allowed. + + A collection of valid enum values allowed. + + + + Gets or sets disallowed types. + + The disallowed types. + + + + Gets or sets the default value. + + The default value. + + + + Gets or sets the collection of that this schema extends. + + The collection of that this schema extends. + + + + Gets or sets the format. + + The format. + + + + Initializes a new instance of the class. + + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The object representing the JSON Schema. + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The to use when resolving schema references. + The object representing the JSON Schema. + + + + Load a from a string that contains JSON Schema. + + A that contains JSON Schema. + A populated from the string that contains JSON Schema. + + + + Load a from a string that contains JSON Schema using the specified . + + A that contains JSON Schema. + The resolver. + A populated from the string that contains JSON Schema. + + + + Writes this schema to a . + + A into which this method will write. + + + + Writes this schema to a using the specified . + + A into which this method will write. + The resolver used. + + + + Returns a that represents the current . + + + A that represents the current . + + + + + + Returns detailed information about the schema exception. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + + Generates a from a specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets how undefined schemas are handled by the serializer. + + + + + Gets or sets the contract resolver. + + The contract resolver. + + + + Generate a from the specified type. + + The type to generate a from. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + + Resolves from an id. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the loaded schemas. + + The loaded schemas. + + + + Initializes a new instance of the class. + + + + + Gets a for the specified reference. + + The id. + A for the specified reference. + + + + + The value types allowed by the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + No type specified. + + + + + String type. + + + + + Float type. + + + + + Integer type. + + + + + Boolean type. + + + + + Object type. + + + + + Array type. + + + + + Null type. + + + + + Any type. + + + + + + Specifies undefined schema Id handling options for the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Do not infer a schema Id. + + + + + Use the .NET type name as the schema Id. + + + + + Use the assembly qualified .NET type name as the schema Id. + + + + + + Returns detailed information related to the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the associated with the validation error. + + The JsonSchemaException associated with the validation error. + + + + Gets the path of the JSON location where the validation error occurred. + + The path of the JSON location where the validation error occurred. + + + + Gets the text description corresponding to the validation error. + + The text description. + + + + + Represents the callback method that will handle JSON schema validation events and the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + A camel case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Resolves member mappings for a type, camel casing property names. + + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used by to resolve a for a given . + + + + + Gets a value indicating whether members are being get and set using dynamic code generation. + This value is determined by the runtime permissions available. + + + true if using dynamic code generation; otherwise, false. + + + + + Gets or sets the default members search flags. + + The default members search flags. + + + + Gets or sets a value indicating whether compiler generated members should be serialized. + + + true if serialized compiler generated members; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the interface when serializing and deserializing types. + + + true if the interface will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the attribute when serializing and deserializing types. + + + true if the attribute will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore IsSpecified members when serializing and deserializing types. + + + true if the IsSpecified members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore ShouldSerialize members when serializing and deserializing types. + + + true if the ShouldSerialize members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets the naming strategy used to resolve how property names and dictionary keys are serialized. + + The naming strategy used to resolve how property names and dictionary keys are serialized. + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Gets the serializable members for the type. + + The type to get serializable members for. + The serializable members for the type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates the constructor parameters. + + The constructor to create properties for. + The type's member properties. + Properties for the given . + + + + Creates a for the given . + + The matching member property. + The constructor parameter. + A created for the given . + + + + Resolves the default for the contract. + + Type of the object. + The contract's default . + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Determines which contract type is created for the given type. + + Type of the object. + A for the given type. + + + + Creates properties for the given . + + The type to create properties for. + /// The member serialization mode for the type. + Properties for the given . + + + + Creates the used by the serializer to get and set values from a member. + + The member. + The used by the serializer to get and set values from a member. + + + + Creates a for the given . + + The member's parent . + The member to create a for. + A created for the given . + + + + Resolves the name of the property. + + Name of the property. + Resolved name of the property. + + + + Resolves the name of the extension data. By default no changes are made to extension data names. + + Name of the extension data. + Resolved name of the extension data. + + + + Resolves the key of the dictionary. By default is used to resolve dictionary keys. + + Key of the dictionary. + Resolved key of the dictionary. + + + + Gets the resolved name of the property. + + Name of the property. + Name of the property. + + + + The default naming strategy. Property names and dictionary keys are unchanged. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + The default serialization binder used when resolving and loading classes from type names. + + + + + Initializes a new instance of the class. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + The type of the object the formatter creates a new instance of. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer that writes to the application's instances. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Get and set values for a using dynamic methods. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Provides information surrounding an error. + + + + + Gets the error. + + The error. + + + + Gets the original object that caused the error. + + The original object that caused the error. + + + + Gets the member that caused the error. + + The member that caused the error. + + + + Gets the path of the JSON location where the error occurred. + + The path of the JSON location where the error occurred. + + + + Gets or sets a value indicating whether this is handled. + + true if handled; otherwise, false. + + + + Provides data for the Error event. + + + + + Gets the current object the error event is being raised against. + + The current object the error event is being raised against. + + + + Gets the error context. + + The error context. + + + + Initializes a new instance of the class. + + The current object. + The error context. + + + + Get and set values for a using dynamic methods. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Provides methods to get attributes. + + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Used by to resolve a for a given . + + + + + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used to resolve references when serializing and deserializing JSON by the . + + + + + Resolves a reference to its object. + + The serialization context. + The reference to resolve. + The object that was resolved from the reference. + + + + Gets the reference for the specified object. + + The serialization context. + The object to get a reference for. + The reference to the object. + + + + Determines whether the specified object is referenced. + + The serialization context. + The object to test for a reference. + + true if the specified object is referenced; otherwise, false. + + + + + Adds a reference to the specified object. + + The serialization context. + The reference. + The object to reference. + + + + Allows users to control class loading and mandate what class to load. + + + + + When implemented, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object + The type of the object the formatter creates a new instance of. + + + + When implemented, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + The that will be used to filter the trace messages passed to the writer. + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Provides methods to get and set values. + + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Contract details for a used by the . + + + + + Gets the of the collection items. + + The of the collection items. + + + + Gets a value indicating whether the collection type is a multidimensional array. + + true if the collection type is a multidimensional array; otherwise, false. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the collection values. + + true if the creator has a parameter with the collection values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the default collection items . + + The converter. + + + + Gets or sets a value indicating whether the collection items preserve object references. + + true if collection items preserve object references; otherwise, false. + + + + Gets or sets the collection item reference loop handling. + + The reference loop handling. + + + + Gets or sets the collection item type name handling. + + The type name handling. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Handles serialization callback events. + + The object that raised the callback event. + The streaming context. + + + + Handles serialization error callback events. + + The object that raised the callback event. + The streaming context. + The error context. + + + + Sets extension data for an object during deserialization. + + The object to set extension data on. + The extension data key. + The extension data value. + + + + Gets extension data for an object during serialization. + + The object to set extension data on. + + + + Contract details for a used by the . + + + + + Gets the underlying type for the contract. + + The underlying type for the contract. + + + + Gets or sets the type created during deserialization. + + The type created during deserialization. + + + + Gets or sets whether this type contract is serialized as a reference. + + Whether this type contract is serialized as a reference. + + + + Gets or sets the default for this contract. + + The converter. + + + + Gets the internally resolved for the contract's type. + This converter is used as a fallback converter when no other converter is resolved. + Setting will always override this converter. + + + + + Gets or sets all methods called immediately after deserialization of the object. + + The methods called immediately after deserialization of the object. + + + + Gets or sets all methods called during deserialization of the object. + + The methods called during deserialization of the object. + + + + Gets or sets all methods called after serialization of the object graph. + + The methods called after serialization of the object graph. + + + + Gets or sets all methods called before serialization of the object. + + The methods called before serialization of the object. + + + + Gets or sets all method called when an error is thrown during the serialization of the object. + + The methods called when an error is thrown during the serialization of the object. + + + + Gets or sets the default creator method used to create the object. + + The default creator method used to create the object. + + + + Gets or sets a value indicating whether the default creator is non-public. + + true if the default object creator is non-public; otherwise, false. + + + + Contract details for a used by the . + + + + + Gets or sets the dictionary key resolver. + + The dictionary key resolver. + + + + Gets the of the dictionary keys. + + The of the dictionary keys. + + + + Gets the of the dictionary values. + + The of the dictionary values. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the dictionary values. + + true if the creator has a parameter with the dictionary values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets the object's properties. + + The object's properties. + + + + Gets or sets the property name resolver. + + The property name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object constructor. + + The object constructor. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object member serialization. + + The member object serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets the object's properties. + + The object's properties. + + + + Gets a collection of instances that define the parameters used with . + + + + + Gets or sets the function used to create the object. When set this function will override . + This function is called with a collection of arguments which are defined by the collection. + + The function used to create the object. + + + + Gets or sets the extension data setter. + + + + + Gets or sets the extension data getter. + + + + + Gets or sets the extension data value type. + + + + + Gets or sets the extension data name resolver. + + The extension data name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Maps a JSON property to a .NET member or constructor parameter. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the type that declared this property. + + The type that declared this property. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets the name of the underlying member or parameter. + + The name of the underlying member or parameter. + + + + Gets the that will get and set the during serialization. + + The that will get and set the during serialization. + + + + Gets or sets the for this property. + + The for this property. + + + + Gets or sets the type of the property. + + The type of the property. + + + + Gets or sets the for the property. + If set this converter takes precedence over the contract converter for the property type. + + The converter. + + + + Gets or sets the member converter. + + The member converter. + + + + Gets or sets a value indicating whether this is ignored. + + true if ignored; otherwise, false. + + + + Gets or sets a value indicating whether this is readable. + + true if readable; otherwise, false. + + + + Gets or sets a value indicating whether this is writable. + + true if writable; otherwise, false. + + + + Gets or sets a value indicating whether this has a member attribute. + + true if has a member attribute; otherwise, false. + + + + Gets the default value. + + The default value. + + + + Gets or sets a value indicating whether this is required. + + A value indicating whether this is required. + + + + Gets a value indicating whether has a value specified. + + + + + Gets or sets a value indicating whether this property preserves object references. + + + true if this instance is reference; otherwise, false. + + + + + Gets or sets the property null value handling. + + The null value handling. + + + + Gets or sets the property default value handling. + + The default value handling. + + + + Gets or sets the property reference loop handling. + + The reference loop handling. + + + + Gets or sets the property object creation handling. + + The object creation handling. + + + + Gets or sets or sets the type name handling. + + The type name handling. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets a predicate used to determine whether the property should be deserialized. + + A predicate used to determine whether the property should be deserialized. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets an action used to set whether the property has been deserialized. + + An action used to set whether the property has been deserialized. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Gets or sets the converter used when serializing the property's collection items. + + The collection's items converter. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + A collection of objects. + + + + + Initializes a new instance of the class. + + The type. + + + + When implemented in a derived class, extracts the key from the specified element. + + The element from which to extract the key. + The key for the specified element. + + + + Adds a object. + + The property to add to the collection. + + + + Gets the closest matching object. + First attempts to get an exact case match of and then + a case insensitive match. + + Name of the property. + A matching property if found. + + + + Gets a property by property name. + + The name of the property to get. + Type property name string comparison. + A matching property if found. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Lookup and create an instance of the type described by the argument. + + The type to create. + Optional arguments to pass to an initializing constructor of the JsonConverter. + If null, the default constructor is used. + + + + Represents a trace writer that writes to memory. When the trace message limit is + reached then old trace messages will be removed as new messages are added. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Initializes a new instance of the class. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Returns an enumeration of the most recent trace messages. + + An enumeration of the most recent trace messages. + + + + Returns a of the most recent trace messages. + + + A of the most recent trace messages. + + + + + A base class for resolving how property names and dictionary keys are serialized. + + + + + A flag indicating whether dictionary keys should be processed. + Defaults to false. + + + + + A flag indicating whether extension data names should be processed. + Defaults to false. + + + + + A flag indicating whether explicitly specified property names, + e.g. a property name customized with a , should be processed. + Defaults to false. + + + + + Gets the serialized name for a given property name. + + The initial property name. + A flag indicating whether the property has had a name explicitly specified. + The serialized property name. + + + + Gets the serialized name for a given extension data name. + + The initial extension data name. + The serialized extension data name. + + + + Gets the serialized key for a given dictionary key. + + The initial dictionary key. + The serialized dictionary key. + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Hash code calculation + + + + + + Object equality implementation + + + + + + + Compare to another NamingStrategy + + + + + + + Represents a method that constructs an object. + + The object type to create. + + + + When applied to a method, specifies that the method is called when an error occurs serializing an object. + + + + + Provides methods to get attributes from a , , or . + + + + + Initializes a new instance of the class. + + The instance to get attributes for. This parameter should be a , , or . + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Get and set values for a using reflection. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + A snake case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Specifies how strings are escaped when writing JSON text. + + + + + Only control characters (e.g. newline) are escaped. + + + + + All non-ASCII and control characters (e.g. newline) are escaped. + + + + + HTML (<, >, &, ', ") and control characters (e.g. newline) are escaped. + + + + + Indicates the method that will be used during deserialization for locating and loading assemblies. + + + + + In simple mode, the assembly used during deserialization need not match exactly the assembly used during serialization. Specifically, the version numbers need not match as the LoadWithPartialName method of the class is used to load the assembly. + + + + + In full mode, the assembly used during deserialization must match exactly the assembly used during serialization. The Load method of the class is used to load the assembly. + + + + + Specifies type name handling options for the . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Do not include the .NET type name when serializing types. + + + + + Include the .NET type name when serializing into a JSON object structure. + + + + + Include the .NET type name when serializing into a JSON array structure. + + + + + Always include the .NET type name when serializing. + + + + + Include the .NET type name when the type of the object being serialized is not the same as its declared type. + Note that this doesn't include the root serialized object by default. To include the root object's type name in JSON + you must specify a root type object with + or . + + + + + Determines whether the collection is null or empty. + + The collection. + + true if the collection is null or empty; otherwise, false. + + + + + Adds the elements of the specified collection to the specified generic . + + The list to add to. + The collection of elements to add. + + + + Converts the value to the specified type. If the value is unable to be converted, the + value is checked whether it assignable to the specified type. + + The value to convert. + The culture to use when converting. + The type to convert or cast the value to. + + The converted type. If conversion was unsuccessful, the initial value + is returned if assignable to the target type. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic that returns a result + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Returns a Restrictions object which includes our current restrictions merged + with a restriction limiting our type + + + + + Helper class for serializing immutable collections. + Note that this is used by all builds, even those that don't support immutable collections, in case the DLL is GACed + https://github.com/JamesNK/Newtonsoft.Json/issues/652 + + + + + Gets the type of the typed collection's items. + + The type. + The type of the typed collection's items. + + + + Gets the member's underlying type. + + The member. + The underlying type of the member. + + + + Determines whether the property is an indexed property. + + The property. + + true if the property is an indexed property; otherwise, false. + + + + + Gets the member's value on the object. + + The member. + The target object. + The member's value on the object. + + + + Sets the member's value on the target object. + + The member. + The target. + The value. + + + + Determines whether the specified MemberInfo can be read. + + The MemberInfo to determine whether can be read. + /// if set to true then allow the member to be gotten non-publicly. + + true if the specified MemberInfo can be read; otherwise, false. + + + + + Determines whether the specified MemberInfo can be set. + + The MemberInfo to determine whether can be set. + if set to true then allow the member to be set non-publicly. + if set to true then allow the member to be set if read-only. + + true if the specified MemberInfo can be set; otherwise, false. + + + + + Builds a string. Unlike this class lets you reuse its internal buffer. + + + + + Determines whether the string is all white space. Empty string will return false. + + The string to test whether it is all white space. + + true if the string is all white space; otherwise, false. + + + + + Specifies the state of the . + + + + + An exception has been thrown, which has left the in an invalid state. + You may call the method to put the in the Closed state. + Any other method calls result in an being thrown. + + + + + The method has been called. + + + + + An object is being written. + + + + + An array is being written. + + + + + A constructor is being written. + + + + + A property is being written. + + + + + A write method has not been called. + + + + diff --git a/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/NlogConfig.xml b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/NlogConfig.xml new file mode 100644 index 00000000..1e52a56c --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/NlogConfig.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/PdfSharp.xml b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/PdfSharp.xml new file mode 100644 index 00000000..8ac853e9 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/PdfSharp.xml @@ -0,0 +1,23546 @@ + + + + PdfSharp + + + + + Floating point formatting. + + + + + Factor to convert from degree to radian measure. + + + + + Sinus of the angle to turn a regular font to look oblique. Used for italic simulation. + + + + + Factor of the em size of a regular font to look bold. Used for bold simulation. + Value of 2% found in original XPS 1.0 documentation. + + + + + Static locking functions to make PDFsharp thread save. + + + + + A bunch of internal helper functions. + + + + + A bunch of internal helper functions. + + + + + Indirectly throws NotImplementedException. + Required because PDFsharp Release builds tread warnings as errors and + throwing NotImplementedException may lead to unreachable code which + crashes the build. + + + + + Helper class around the Debugger class. + + + + + Call Debugger.Break() if a debugger is attached. + + + + + Call Debugger.Break() if a debugger is attached or when always is set to true. + + + + + Internal stuff for development of PDFsharp. + + + + + Creates font and enforces bold/italic simulation. + + + + + Dumps the font caches to a string. + + + + + Some static helper functions for calculations. + + + + + Degree to radiant factor. + + + + + Get page size in point from specified PageSize. + + + + + Some floating point utilities. Partially reflected from WPF, later equalized with original source code. + + + + + Indicates whether the values are so close that they can be considered as equal. + + + + + Indicates whether the values are so close that they can be considered as equal. + + + + + Indicates whether the values are so close that they can be considered as equal. + + + + + Indicates whether the values are so close that they can be considered as equal. + + + + + Indicates whether the values are so close that they can be considered as equal. + + + + + Indicates whether the values are so close that they can be considered as equal. + + + + + Indicates whether value1 is greater than value2 and the values are not close to each other. + + + + + Indicates whether value1 is greater than value2 or the values are close to each other. + + + + + Indicates whether value1 is less than value2 and the values are not close to each other. + + + + + Indicates whether value1 is less than value2 or the values are close to each other. + + + + + Indicates whether the value is between 0 and 1 or close to 0 or 1. + + + + + Indicates whether the value is not a number. + + + + + Indicates whether at least one of the four rectangle values is not a number. + + + + + Indicates whether the value is 1 or close to 1. + + + + + Indicates whether the value is 0 or close to 0. + + + + + Converts a double to integer. + + + + + Required native Win32 calls. + + + + + Reflected from System.Drawing.SafeNativeMethods+LOGFONT + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Move to next token. + + + + + Move to next token. + + + + + Represents the base class of all bar codes. + + + + + Initializes a new instance of the class. + + + + + + + + Creates a bar code from the specified code type. + + + + + Creates a bar code from the specified code type. + + + + + Creates a bar code from the specified code type. + + + + + Creates a bar code from the specified code type. + + + + + When overridden in a derived class gets or sets the wide narrow ratio. + + + + + Gets or sets the location of the text next to the bar code. + + + + + Gets or sets the length of the data that defines the bar code. + + + + + Gets or sets the optional start character. + + + + + Gets or sets the optional end character. + + + + + Gets or sets a value indicating whether the turbo bit is to be drawn. + (A turbo bit is something special to Kern (computer output processing) company (as far as I know)) + + + + + When defined in a derived class renders the code. + + + + + Holds all temporary information needed during rendering. + + + + + String resources for the empira barcode renderer. + + + + + Implementation of the Code 2 of 5 bar code. + + + + + Initializes a new instance of Interleaved2of5. + + + + + Initializes a new instance of Interleaved2of5. + + + + + Initializes a new instance of Interleaved2of5. + + + + + Initializes a new instance of Interleaved2of5. + + + + + Returns an array of size 5 that represents the thick (true) and thin (false) lines or spaces + representing the specified digit. + + The digit to represent. + + + + Renders the bar code. + + + + + Calculates the thick and thin line widths, + taking into account the required rendering size. + + + + + Renders the next digit pair as bar code element. + + + + + Checks the code to be convertible into an interleaved 2 of 5 bar code. + + The code to be checked. + + + + Imlpementation of the Code 3 of 9 bar code. + + + + + Initializes a new instance of Standard3of9. + + + + + Initializes a new instance of Standard3of9. + + + + + Initializes a new instance of Standard3of9. + + + + + Initializes a new instance of Standard3of9. + + + + + Returns an array of size 9 that represents the thick (true) and thin (false) lines and spaces + representing the specified digit. + + The character to represent. + + + + Calculates the thick and thin line widths, + taking into account the required rendering size. + + + + + Checks the code to be convertible into an standard 3 of 9 bar code. + + The code to be checked. + + + + Renders the bar code. + + + + + Represents the base class of all codes. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the size. + + + + + Gets or sets the text the bar code shall represent. + + + + + Always MiddleCenter. + + + + + Gets or sets the drawing direction. + + + + + When implemented in a derived class, determines whether the specified string can be used as Text + for this bar code type. + + The code string to check. + True if the text can be used for the actual barcode. + + + + Calculates the distance between an old anchor point and a new anchor point. + + + + + + + + Defines the DataMatrix 2D barcode. THIS IS AN EMPIRA INTERNAL IMPLEMENTATION. THE CODE IN + THE OPEN SOURCE VERSION IS A FAKE. + + + + + Initializes a new instance of CodeDataMatrix. + + + + + Initializes a new instance of CodeDataMatrix. + + + + + Initializes a new instance of CodeDataMatrix. + + + + + Initializes a new instance of CodeDataMatrix. + + + + + Initializes a new instance of CodeDataMatrix. + + + + + Initializes a new instance of CodeDataMatrix. + + + + + Initializes a new instance of CodeDataMatrix. + + + + + Initializes a new instance of CodeDataMatrix. + + + + + Initializes a new instance of CodeDataMatrix. + + + + + Sets the encoding of the DataMatrix. + + + + + Gets or sets the size of the Matrix' Quiet Zone. + + + + + Renders the matrix code. + + + + + Determines whether the specified string can be used as data in the DataMatrix. + + The code to be checked. + + + + Represents an OMR code. + + + + + initializes a new OmrCode with the given data. + + + + + Renders the OMR code. + + + + + Gets or sets a value indicating whether a synchronize mark is rendered. + + + + + Gets or sets the distance of the markers. + + + + + Gets or sets the thickness of the makers. + + + + + Determines whether the specified string can be used as Text for the OMR code. + + + + + Creates the XImage object for a DataMatrix. + + + + + Possible ECC200 Matrices. + + + + + Creates the DataMatrix code. + + + + + Encodes the DataMatrix. + + + + + Encodes the barcode with the DataMatrix ECC200 Encoding. + + + + + Places the data in the right positions according to Annex M of the ECC200 specification. + + + + + Places the ECC200 bits in the right positions. + + + + + Calculate and append the Reed Solomon Code. + + + + + Initialize the Galois Field. + + + + + + Initializes the Reed-Solomon Encoder. + + + + + Encodes the Reed-Solomon encoding + + + + + Creates a DataMatrix image object. + + A hex string like "AB 08 C3...". + I.e. 26 for a 26x26 matrix + + + + Creates a DataMatrix image object. + + + + + Creates a DataMatrix image object. + + + + + Specifies whether and how the text is displayed at the code area. + + + + + The anchor is located top left. + + + + + The anchor is located top center. + + + + + The anchor is located top right. + + + + + The anchor is located middle left. + + + + + The anchor is located middle center. + + + + + The anchor is located middle right. + + + + + The anchor is located bottom left. + + + + + The anchor is located bottom center. + + + + + The anchor is located bottom right. + + + + + Specifies the drawing direction of the code. + + + + + Does not rotate the code. + + + + + Rotates the code 180° at the anchor position. + + + + + Rotates the code 180° at the anchor position. + + + + + Rotates the code 180° at the anchor position. + + + + + Specifies the type of the bar code. + + + + + The standard 2 of 5 interleaved bar code. + + + + + The standard 3 of 9 bar code. + + + + + The OMR code. + + + + + The data matrix code. + + + + + docDaSt + + + + + docDaSt + + + + + docDaSt + + + + + docDaSt + + + + + docDaSt + + + + + docDaSt + + + + + docDaSt + + + + + Specifies whether and how the text is displayed at the code. + + + + + No text is drawn. + + + + + The text is located above the code. + + + + + The text is located below the code. + + + + + The text is located above within the code. + + + + + The text is located below within the code. + + + + + Represents the base class of all 2D codes. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the encoding. docDaSt + + + + + docDaSt + + + + + docDaSt + + + + + docDaSt + + + + + When implemented in a derived class renders the 2D code. + + + + + Determines whether the specified string can be used as Text for this matrix code type. + + + + + Internal base class for several bar code types. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the ration between thick an thin lines. Must be between 2 and 3. + Optimal and also default value is 2.6. + + + + + Renders a thick or thin line for the bar code. + + + Determines whether a thick or a thin line is about to be rendered. + + + + Renders a thick or thin gap for the bar code. + + + Determines whether a thick or a thin gap is about to be rendered. + + + + Renders a thick bar before or behind the code. + + + + + Gets the width of a thick or a thin line (or gap). CalcLineWidth must have been called before. + + + Determines whether a thick line's with shall be returned. + + + + Specifies the alignment of a paragraph. + + + + + Default alignment, typically left alignment. + + + + + The paragraph is rendered left aligned. + + + + + The paragraph is rendered centered. + + + + + The paragraph is rendered right aligned. + + + + + The paragraph is rendered justified. + + + + + Represents a very simple text formatter. + If this class does not satisfy your needs on formatting paragraphs I recommend to take a look + at MigraDoc Foundation. Alternatively you should copy this class in your own source code and modify it. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the text. + + The text. + + + + Gets or sets the font. + + + + + Gets or sets the bounding box of the layout. + + + + + Gets or sets the alignment of the text. + + + + + Draws the text. + + The text to be drawn. + The font. + The text brush. + The layout rectangle. + + + + Draws the text. + + The text to be drawn. + The font. + The text brush. + The layout rectangle. + The format. Must be XStringFormat.TopLeft + + + + Align center, right, or justify. + + + + + Represents a single word. + + + + + Initializes a new instance of the class. + + The text of the block. + The type of the block. + The width of the text. + + + + Initializes a new instance of the class. + + The type. + + + + The text represented by this block. + + + + + The type of the block. + + + + + The width of the text. + + + + + The location relative to the upper left corner of the layout rectangle. + + + + + The alignment of this line. + + + + + A flag indicating that this is the last block that fits in the layout rectangle. + + + + + Indicates whether we are within a BT/ET block. + + + + + Graphic mode. This is default. + + + + + Text mode. + + + + + Represents the current PDF graphics state. + + + Completely revised for PDFsharp 1.4. + + + + + Indicates that the text transformation matrix currently skews 20° to the right. + + + + + The already realized part of the current transformation matrix. + + + + + The not yet realized part of the current transformation matrix. + + + + + Product of RealizedCtm and UnrealizedCtm. + + + + + Inverse of EffectiveCtm used for transformation. + + + + + Realizes the CTM. + + + + + Represents a drawing surface for PdfPages. + + + + + Gets the content created by this renderer. + + + + + Strokes a single connection of two points. + + + + + Strokes a series of connected points. + + + + + Clones the current graphics state and push it on a stack. + + + + + Sets the clip path empty. Only possible if graphic state level has the same value as it has when + the first time SetClip was invoked. + + + + + The nesting level of the PDF graphics state stack when the clip region was set to non empty. + Because of the way PDF is made the clip region can only be reset at this level. + + + + + Writes a comment to the PDF content stream. May be useful for debugging purposes. + + + + + Appends one or up to five Bézier curves that interpolate the arc. + + + + + Gets the quadrant (0 through 3) of the specified angle. If the angle lies on an edge + (0, 90, 180, etc.) the result depends on the details how the angle is used. + + + + + Appends a Bézier curve for an arc within a quadrant. + + + + + Appends a Bézier curve for a cardinal spline through pt1 and pt2. + + + + + Appends the content of a GraphicsPath object. + + + + + Initializes the default view transformation, i.e. the transformation from the user page + space to the PDF page space. + + + + + Ends the content stream, i.e. ends the text mode and balances the graphic state stack. + + + + + Begins the graphic mode (i.e. ends the text mode). + + + + + Begins the graphic mode (i.e. ends the text mode). + + + + + Makes the specified pen and brush to the current graphics objects. + + + + + Makes the specified pen to the current graphics object. + + + + + Makes the specified brush to the current graphics object. + + + + + Makes the specified font and brush to the current graphics objects. + + + + + PDFsharp uses the Td operator to set the text position. Td just sets the offset of the text matrix + and produces lesser code as Tm. + + The absolute text position. + The dy. + true if skewing for italic simulation is currently on. + + + + Makes the specified image to the current graphics object. + + + + + Realizes the current transformation matrix, if necessary. + + + + + Convert a point from Windows world space to PDF world space. + + + + + Gets the owning PdfDocument of this page or form. + + + + + Gets the PdfResources of this page or form. + + + + + Gets the size of this page or form. + + + + + Gets the resource name of the specified font within this page or form. + + + + + Gets the resource name of the specified image within this page or form. + + + + + Gets the resource name of the specified form within this page or form. + + + + + The q/Q nesting level is 0. + + + + + The q/Q nesting level is 1. + + + + + The q/Q nesting level is 2. + + + + + Saves the current graphical state. + + + + + Restores the previous graphical state. + + + + + The current graphical state. + + + + + The graphical state stack. + + + + + The height of the PDF page in point including the trim box. + + + + + The final transformation from the world space to the default page space. + + + + + Represents a graphics path that uses the same notation as GDI+. + + + + + Adds an arc that fills exactly one quadrant (quarter) of an ellipse. + Just a quick hack to draw rounded rectangles before AddArc is fully implemented. + + + + + Closes the current subpath. + + + + + Gets or sets the current fill mode (alternate or winding). + + + + + Gets the path points in GDI+ style. + + + + + Gets the path types in GDI+ style. + + + + + Defines the direction an elliptical arc is drawn. + + + + + Specifies that arcs are drawn in a counter clockwise (negative-angle) direction. + + + + + Specifies that arcs are drawn in a clockwise (positive-angle) direction. + + + + + Describes the simulation style of a font. + + + + + No font style simulation. + + + + + Bold style simulation. + + + + + Italic style simulation. + + + + + Bold and Italic style simulation. + + + + + Indicates how to handle the first point of a path. + + + + + Set the current position to the first point. + + + + + Draws a line to the first point. + + + + + Ignores the first point. + + + + + Currently not used. Only DeviceRGB is rendered in PDF. + + + + + Identifies the RGB color space. + + + + + Identifies the CMYK color space. + + + + + Identifies the gray scale color space. + + + + + Specifies how different clipping regions can be combined. + + + + + One clipping region is replaced by another. + + + + + Two clipping regions are combined by taking their intersection. + + + + + Not yet implemented in PDFsharp. + + + + + Not yet implemented in PDFsharp. + + + + + Not yet implemented in PDFsharp. + + + + + Not yet implemented in PDFsharp. + + + + + Specifies the style of dashed lines drawn with an XPen object. + + + + + Specifies a solid line. + + + + + Specifies a line consisting of dashes. + + + + + Specifies a line consisting of dots. + + + + + Specifies a line consisting of a repeating pattern of dash-dot. + + + + + Specifies a line consisting of a repeating pattern of dash-dot-dot. + + + + + Specifies a user-defined custom dash style. + + + + + Specifies how the interior of a closed path is filled. + + + + + Specifies the alternate fill mode. Called the 'odd-even rule' in PDF terminology. + + + + + Specifies the winding fill mode. Called the 'nonzero winding number rule' in PDF terminology. + + + + + Specifies style information applied to text. + + + + + Normal text. + + + + + Bold text. + + + + + Italic text. + + + + + Bold and italic text. + + + + + Underlined text. + + + + + Text with a line through the middle. + + + + + Backward compatibility. + + + + + Normal text. + + + + + Bold text. + + + + + Italic text. + + + + + Bold and italic text. + + + + + Underlined text. + + + + + Text with a line through the middle. + + + + + Determines whether rendering based on GDI+ or WPF. + For internal use in hybrid build only only. + + + + + Rendering does not depent on a particular technology. + + + + + Renders using GDI+. + + + + + Renders using WPF (including Silverlight). + + + + + Universal Windows Platform. + + + + + Type of the path data. + + + + + Specifies how the content of an existing PDF page and new content is combined. + + + + + The new content is inserted behind the old content and any subsequent drawing in done above the existing graphic. + + + + + The new content is inserted before the old content and any subsequent drawing in done beneath the existing graphic. + + + + + The new content entirely replaces the old content and any subsequent drawing in done on a blank page. + + + + + Specifies the unit of measure. + + + + + Specifies a printer's point (1/72 inch) as the unit of measure. + + + + + Specifies the inch (2.54 cm) as the unit of measure. + + + + + Specifies the millimeter as the unit of measure. + + + + + Specifies the centimeter as the unit of measure. + + + + + Specifies a presentation point (1/96 inch) as the unit of measure. + + + + + Specifies all pre-defined colors. Used to identify the pre-defined colors and to + localize their names. + + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + A pre-defined color. + + + + Specifies the alignment of a text string relative to its layout rectangle + + + + + Specifies the text be aligned near the layout. + In a left-to-right layout, the near position is left. In a right-to-left layout, the near + position is right. + + + + + Specifies that text is aligned in the center of the layout rectangle. + + + + + Specifies that text is aligned far from the origin position of the layout rectangle. + In a left-to-right layout, the far position is right. In a right-to-left layout, the far + position is left. + + + + + Specifies that text is aligned relative to its base line. + With this option the layout rectangle must have a height of 0. + + + + + Specifies the direction of a linear gradient. + + + + + Specifies a gradient from left to right. + + + + + Specifies a gradient from top to bottom. + + + + + Specifies a gradient from upper left to lower right. + + + + + Specifies a gradient from upper right to lower left. + + + + + Specifies the available cap styles with which an XPen object can start and end a line. + + + + + Specifies a flat line cap. + + + + + Specifies a round line cap. + + + + + Specifies a square line cap. + + + + + Specifies how to join consecutive line or curve segments in a figure or subpath. + + + + + Specifies a mitered join. This produces a sharp corner or a clipped corner, + depending on whether the length of the miter exceeds the miter limit + + + + + Specifies a circular join. This produces a smooth, circular arc between the lines. + + + + + Specifies a beveled join. This produces a diagonal corner. + + + + + Specifies the order for matrix transform operations. + + + + + The new operation is applied before the old operation. + + + + + The new operation is applied after the old operation. + + + + + Specifies the direction of the y-axis. + + + + + Increasing Y values go downwards. This is the default. + + + + + Increasing Y values go upwards. This is only possible when drawing on a PDF page. + It is not implemented when drawing on a System.Drawing.Graphics object. + + + + + Specifies whether smoothing (or antialiasing) is applied to lines and curves + and the edges of filled areas. + + + + + Specifies an invalid mode. + + + + + Specifies the default mode. + + + + + Specifies high speed, low quality rendering. + + + + + Specifies high quality, low speed rendering. + + + + + Specifies no antialiasing. + + + + + Specifies antialiased rendering. + + + + + Specifies the alignment of a text string relative to its layout rectangle. + + + + + Specifies the text be aligned near the layout. + In a left-to-right layout, the near position is left. In a right-to-left layout, the near + position is right. + + + + + Specifies that text is aligned in the center of the layout rectangle. + + + + + Specifies that text is aligned far from the origin position of the layout rectangle. + In a left-to-right layout, the far position is right. In a right-to-left layout, the far + position is left. + + + + + Internal implementation class of XFontFamily. + + + + + Gets the family name this family was originally created with. + + + + + Gets the name that uniquely identifies this font family. + + + + + Gets the underlying GDI+ font family object. + Is null if the font was created by a font resolver. + + + + + Gets the DebuggerDisplayAttribute text. + + + + + A bunch of functions that do not have a better place. + + + + + Measure string directly from font data. + + + + + Calculates an Adler32 checksum combined with the buffer length + in a 64 bit unsigned integer. + + + + + Helper class for Geometry paths. + + + + + Creates between 1 and 5 Béziers curves from parameters specified like in GDI+. + + + + + Calculates the quadrant (0 through 3) of the specified angle. If the angle lies on an edge + (0, 90, 180, etc.) the result depends on the details how the angle is used. + + + + + Appends a Bézier curve for an arc within a full quadrant. + + + + + Creates between 1 and 5 Béziers curves from parameters specified like in WPF. + + + + + Represents a stack of XGraphicsState and XGraphicsContainer objects. + + + + + Helper class for processing image files. + + + + + Represents the internal state of an XGraphics object. + Used when the state is saved and restored. + + + + + Gets or sets the current transformation matrix. + + + + + Called after this instanced was pushed on the internal graphics stack. + + + + + Called after this instanced was popped from the internal graphics stack. + + + + + This interface will be implemented by specialized classes, one for JPEG, one for BMP, one for PNG, one for GIF. Maybe more. + + + + + Imports the image. Returns null if the image importer does not support the format. + + + + + Prepares the image data needed for the PDF file. + + + + + Helper for dealing with Stream data. + + + + + Resets this instance. + + + + + Gets the original stream. + + + + + Gets the data as byte[]. + + + + + Gets the length of Data. + + + + + The imported image. + + + + + Initializes a new instance of the class. + + + + + Gets information about the image. + + + + + Gets a value indicating whether image data for the PDF file was already prepared. + + + + + Gets the image data needed for the PDF file. + + + + + Public information about the image, filled immediately. + Note: The stream will be read and decoded on the first call to PrepareImageData(). + ImageInformation can be filled for corrupted images that will throw an expection on PrepareImageData(). + + + + + Standard JPEG format (RGB). + + + + + Grayscale JPEG format. + + + + + JPEG file with inverted CMYK, thus RGBW. + + + + + JPEG file with CMYK. + + + + + The horizontal DPI (dots per inch). Can be 0 if not supported by the image format. + Note: JFIF (JPEG) files may contain either DPI or DPM or just the aspect ratio. Windows BMP files will contain DPM. Other formats may support any combination, including none at all. + + + + + The vertical DPI (dots per inch). Can be 0 if not supported by the image format. + + + + + The horizontal DPM (dots per meter). Can be 0 if not supported by the image format. + + + + + The vertical DPM (dots per meter). Can be 0 if not supported by the image format. + + + + + The horizontal component of the aspect ratio. Can be 0 if not supported by the image format. + Note: Aspect ratio will be set if either DPI or DPM was set, but may also be available in the absence of both DPI and DPM. + + + + + The vertical component of the aspect ratio. Can be 0 if not supported by the image format. + + + + + The colors used. Only valid for images with palettes, will be 0 otherwise. + + + + + Contains internal data. This includes a reference to the Stream if data for PDF was not yet prepared. + + + + + Gets the image. + + + + + Contains data needed for PDF. Will be prepared when needed. + + + + + Bitmap refers to the format used in PDF. Will be used for BMP, PNG, TIFF, GIF and others. + + + + + Initializes a new instance of the class. + + + + + Contains data needed for PDF. Will be prepared when needed. + Bitmap refers to the format used in PDF. Will be used for BMP, PNG, TIFF, GIF and others. + + + + + Gets the data. + + + + + Gets the length. + + + + + Gets the data. + + + + + Gets the length. + + + + + Image data needed for PDF bitmap images. + + + + + Initializes a new instance of the class. + + + + + Gets the data. + + + + + Gets the length. + + + + + True if first line is the top line, false if first line is the bottom line of the image. When needed, lines will be reversed while converting data into PDF format. + + + + + The offset of the image data in Data. + + + + + The offset of the color palette in Data. + + + + + Copies images without color palette. + + 4 (32bpp RGB), 3 (24bpp RGB, 32bpp ARGB) + 8 + true (ARGB), false (RGB) + Destination + + + + Imported JPEG image. + + + + + Initializes a new instance of the class. + + + + + Contains data needed for PDF. Will be prepared when needed. + + + + + Gets the data. + + + + + Gets the length. + + + + + Private data for JPEG images. + + + + + Initializes a new instance of the class. + + + + + Gets the data. + + + + + Gets the length. + + + + + The class that imports images of various formats. + + + + + Gets the image importer. + + + + + Imports the image. + + + + + Imports the image. + + + + + Represents an abstract drawing surface for PdfPages. + + + + + Draws a straight line. + + + + + Draws a series of straight lines. + + + + + Draws a Bézier spline. + + + + + Draws a series of Bézier splines. + + + + + Draws a cardinal spline. + + + + + Draws an arc. + + + + + Draws a rectangle. + + + + + Draws a series of rectangles. + + + + + Draws a rectangle with rounded corners. + + + + + Draws an ellipse. + + + + + Draws a polygon. + + + + + Draws a pie. + + + + + Draws a cardinal spline. + + + + + Draws a graphical path. + + + + + Draws a series of glyphs identified by the specified text and font. + + + + + Draws an image. + + + + + Saves the current graphics state without changing it. + + + + + Restores the specified graphics state. + + + + + + + + + + + + + + + Gets or sets the transformation matrix. + + + + + Writes a comment to the output stream. Comments have no effect on the rendering of the output. + + + + + Specifies details about how the font is used in PDF creation. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Gets a value indicating the font embedding. + + + + + Gets a value indicating how the font is encoded. + + + + + Gets the default options with WinAnsi encoding and always font embedding. + + + + + Gets the default options with Unicode encoding and always font embedding. + + + + + Provides functionality to load a bitmap image encoded in a specific format. + + + + + Gets a new instance of the PNG image decoder. + + + + + Provides functionality to save a bitmap image in a specific format. + + + + + Gets a new instance of the PNG image encoder. + + + + + Gets or sets the bitmap source to be encoded. + + + + + When overridden in a derived class saves the image on the specified stream + in the respective format. + + + + + Saves the image on the specified stream in PNG format. + + + + + Defines a pixel based bitmap image. + + + + + Initializes a new instance of the class. + + + + + Creates a default 24 bit ARGB bitmap with the specified pixel size. + + + + + Classes derived from this abstract base class define objects used to fill the + interiors of paths. + + + + + Brushes for all the pre-defined colors. + + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + Gets a pre-defined XBrush object. + + + + Represents a RGB, CMYK, or gray scale color. + + + + + Creates an XColor structure from a 32-bit ARGB value. + + + + + Creates an XColor structure from a 32-bit ARGB value. + + + + + Creates an XColor structure from the specified 8-bit color values (red, green, and blue). + The alpha value is implicitly 255 (fully opaque). + + + + + Creates an XColor structure from the four ARGB component (alpha, red, green, and blue) values. + + + + + Creates an XColor structure from the specified alpha value and color. + + + + + Creates an XColor structure from the specified CMYK values. + + + + + Creates an XColor structure from the specified CMYK values. + + + + + Creates an XColor structure from the specified gray value. + + + + + Creates an XColor from the specified pre-defined color. + + + + + Creates an XColor from the specified name of a pre-defined color. + + + + + Gets or sets the color space to be used for PDF generation. + + + + + Indicates whether this XColor structure is uninitialized. + + + + + Determines whether the specified object is a Color structure and is equivalent to this + Color structure. + + + + + Returns the hash code for this instance. + + + + + Determines whether two colors are equal. + + + + + Determines whether two colors are not equal. + + + + + Gets a value indicating whether this color is a known color. + + + + + Gets the hue-saturation-brightness (HSB) hue value, in degrees, for this color. + + The hue, in degrees, of this color. The hue is measured in degrees, ranging from 0 through 360, in HSB color space. + + + + Gets the hue-saturation-brightness (HSB) saturation value for this color. + + The saturation of this color. The saturation ranges from 0 through 1, where 0 is grayscale and 1 is the most saturated. + + + + Gets the hue-saturation-brightness (HSB) brightness value for this color. + + The brightness of this color. The brightness ranges from 0 through 1, where 0 represents black and 1 represents white. + + + + One of the RGB values changed; recalculate other color representations. + + + + + One of the CMYK values changed; recalculate other color representations. + + + + + The gray scale value changed; recalculate other color representations. + + + + + Gets or sets the alpha value the specifies the transparency. + The value is in the range from 1 (opaque) to 0 (completely transparent). + + + + + Gets or sets the red value. + + + + + Gets or sets the green value. + + + + + Gets or sets the blue value. + + + + + Gets the RGB part value of the color. Internal helper function. + + + + + Gets the ARGB part value of the color. Internal helper function. + + + + + Gets or sets the cyan value. + + + + + Gets or sets the magenta value. + + + + + Gets or sets the yellow value. + + + + + Gets or sets the black (or key) value. + + + + + Gets or sets the gray scale value. + + + + + Represents the null color. + + + + + Special property for XmlSerializer only. + + + + + Manages the localization of the color class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The culture info. + + + + Gets a known color from an ARGB value. Throws an ArgumentException if the value is not a known color. + + + + + Gets all known colors. + + Indicates whether to include the color Transparent. + + + + Converts a known color to a localized color name. + + + + + Converts a color to a localized color name or an ARGB value. + + + + + Represents a set of 141 pre-defined RGB colors. Incidentally the values are the same + as in System.Drawing.Color. + + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + Gets a predefined color. + + + + Converts XGraphics enums to GDI+ enums. + + + + + Defines an object used to draw text. + + + + + Initializes a new instance of the class. + + Name of the font family. + The em size. + + + + Initializes a new instance of the class. + + Name of the font family. + The em size. + The font style. + + + + Initializes a new instance of the class. + + Name of the font family. + The em size. + The font style. + Additional PDF options. + + + + Initializes a new instance of the class with enforced style simulation. + Only for testing PDFsharp. + + + + + Initializes a new instance of the class from a System.Drawing.FontFamily. + + The System.Drawing.FontFamily. + The em size. + The font style. + + + + Initializes a new instance of the class from a System.Drawing.FontFamily. + + The System.Drawing.FontFamily. + The em size. + The font style. + Additional PDF options. + + + + Initializes a new instance of the class from a System.Drawing.Font. + + The System.Drawing.Font. + + + + Initializes a new instance of the class from a System.Drawing.Font. + + The System.Drawing.Font. + Additional PDF options. + + + + Initializes this instance by computing the glyph typeface, font family, font source and TrueType fontface. + (PDFsharp currently only deals with TrueType fonts.) + + + + + A GDI+ font object is used to setup the internal font objects. + + + + + Code separated from Metric getter to make code easier to debug. + (Setup properties in their getters caused side effects during debugging because Visual Studio calls a getter + to early to show its value in a debugger window.) + + + + + Gets the XFontFamily object associated with this XFont object. + + + + + WRONG: Gets the face name of this Font object. + Indeed it returns the font family name. + + + + + Gets the em-size of this font measured in the unit of this font object. + + + + + Gets style information for this Font object. + + + + + Indicates whether this XFont object is bold. + + + + + Indicates whether this XFont object is italic. + + + + + Indicates whether this XFont object is stroke out. + + + + + Indicates whether this XFont object is underlined. + + + + + Temporary HACK for XPS to PDF converter. + + + + + Gets the PDF options of the font. + + + + + Indicates whether this XFont is encoded as Unicode. + + + + + Gets the cell space for the font. The CellSpace is the line spacing, the sum of CellAscent and CellDescent and optionally some extra space. + + + + + Gets the cell ascent, the area above the base line that is used by the font. + + + + + Gets the cell descent, the area below the base line that is used by the font. + + + + + Gets the font metrics. + + The metrics. + + + + Returns the line spacing, in pixels, of this font. The line spacing is the vertical distance + between the base lines of two consecutive lines of text. Thus, the line spacing includes the + blank space between lines along with the height of the character itself. + + + + + Returns the line spacing, in the current unit of a specified Graphics object, of this font. + The line spacing is the vertical distance between the base lines of two consecutive lines of + text. Thus, the line spacing includes the blank space between lines along with the height of + + + + + Gets the line spacing of this font. + + + + + Override style simulations by using the value of StyleSimulations. + + + + + Used to enforce style simulations by renderer. For development purposes only. + + + + + Gets the GDI family. + + The GDI family. + + + + Implicit conversion form Font to XFont + + + + + Cache PdfFontTable.FontSelector to speed up finding the right PdfFont + if this font is used more than once. + + + + + Gets the DebuggerDisplayAttribute text. + + + + + Global cache of all internal font family objects. + + + + + Caches the font family or returns a previously cached one. + + + + + Gets the singleton. + + + + + Maps family name to internal font family. + + + + + Defines a group of typefaces having a similar basic design and certain variations in styles. + + + + + Initializes a new instance of the class. + + The family name of a font. + + + + Initializes a new instance of the class from FontFamilyInternal. + + + + + An XGlyphTypeface for a font source that comes from a custom font resolver + creates a solitary font family exclusively for it. + + + + + Gets the name of the font family. + + + + + Returns the cell ascent, in design units, of the XFontFamily object of the specified style. + + + + + Returns the cell descent, in design units, of the XFontFamily object of the specified style. + + + + + Gets the height, in font design units, of the em square for the specified style. + + + + + Returns the line spacing, in design units, of the FontFamily object of the specified style. + The line spacing is the vertical distance between the base lines of two consecutive lines of text. + + + + + Indicates whether the specified FontStyle enumeration is available. + + + + + Returns an array that contains all the FontFamily objects associated with the current graphics context. + + + + + Returns an array that contains all the FontFamily objects available for the specified + graphics context. + + + + + The implementation sigleton of font family; + + + + + Collects information of a font. + + + + + Gets the font name. + + + + + Gets the ascent value. + + + + + Gets the ascent value. + + + + + Gets the descent value. + + + + + Gets the average width. + + + + + Gets the height of capital letters. + + + + + Gets the leading value. + + + + + Gets the line spacing value. + + + + + Gets the maximum width of a character. + + + + + Gets an internal value. + + + + + Gets an internal value. + + + + + Gets the height of a lower-case character. + + + + + Gets the underline position. + + + + + Gets the underline thicksness. + + + + + Gets the strikethrough position. + + + + + Gets the strikethrough thicksness. + + + + + Represents a graphical object that can be used to render retained graphics on it. + In GDI+ it is represented by a Metafile, in WPF by a DrawingVisual, and in PDF by a Form XObjects. + + + + + The form is an imported PDF page. + + + + + The template is just created. + + + + + XGraphics.FromForm() was called. + + + + + The form was drawn at least once and is 'frozen' now. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class that represents a page of a PDF document. + + The PDF document. + The view box of the page. + + + + Initializes a new instance of the class that represents a page of a PDF document. + + The PDF document. + The size of the page. + + + + Initializes a new instance of the class that represents a page of a PDF document. + + The PDF document. + The width of the page. + The height of the page + + + + This function should be called when drawing the content of this form is finished. + The XGraphics object used for drawing the content is disposed by this function and + cannot be used for any further drawing operations. + PDFsharp automatically calls this function when this form was used the first time + in a DrawImage function. + + + + + Called from XGraphics constructor that creates an instance that work on this form. + + + + + Disposes this instance. + + + + + Sets the form in the state FormState.Finished. + + + + + Gets the owning document. + + + + + Gets the color model used in the underlying PDF document. + + + + + Gets a value indicating whether this instance is a template. + + + + + Get the width of the page identified by the property PageNumber. + + + + + Get the width of the page identified by the property PageNumber. + + + + + Get the width in point of this image. + + + + + Get the height in point of this image. + + + + + Get the width of the page identified by the property PageNumber. + + + + + Get the height of the page identified by the property PageNumber. + + + + + Get the size of the page identified by the property PageNumber. + + + + + Gets the view box of the form. + + + + + Gets 72, the horizontal resolution by design of a form object. + + + + + Gets 72 always, the vertical resolution by design of a form object. + + + + + Gets or sets the bounding box. + + + + + Gets or sets the transformation matrix. + + + + + Implements the interface because the primary function is internal. + + + + + Gets the resource name of the specified font within this form. + + + + + Tries to get the resource name of the specified font data within this form. + Returns null if no such font exists. + + + + + Gets the resource name of the specified font data within this form. + + + + + Gets the resource name of the specified image within this form. + + + + + Implements the interface because the primary function is internal. + + + + + Gets the resource name of the specified form within this form. + + + + + Implements the interface because the primary function is internal. + + + + + The PdfFormXObject gets invalid when PageNumber or transform changed. This is because a modification + of an XPdfForm must not change objects that are already been drawn. + + + + + The bytes of a font file. + + + + + Gets an existing font source or creates a new one. + A new font source is cached in font factory. + + + + + Gets or sets the fontface. + + + + + Gets the key that uniquely identifies this font source. + + + + + Gets the name of the font's name table. + + + + + Gets the bytes of the font. + + + + + Gets the DebuggerDisplayAttribute text. + + + + + Specifies a physical font face that corresponds to a font file on the disk or in memory. + + + + + Gets the name of the font face. This can be a file name, an uri, or a GUID. + + + + + Gets the English family name of the font, for example "Arial". + + + + + Gets the English subfamily name of the font, + for example "Bold". + + + + + Gets the English display name of the font, + for example "Arial italic". + + + + + Gets a value indicating whether the font weight is bold. + + + + + Gets a value indicating whether the font style is italic. + + + + + Gets the suffix of the face name in a PDF font and font descriptor. + The name based on the effective value of bold and italic from the OS/2 table. + + + + + Computes the bijective key for a typeface. + + + + + Computes the bijective key for a typeface. + + + + + Gets the DebuggerDisplayAttribute text. + + + + + Holds information about the current state of the XGraphics object. + + + + + Represents a drawing surface for a fixed size page. + + + + + Initializes a new instance of the XGraphics class for drawing on a PDF page. + + + + + Initializes a new instance of the XGraphics class used for drawing on a form. + + + + + Creates the measure context. This is a graphics context created only for querying measures of text. + Drawing on a measure context has no effect. + + + + + Creates a new instance of the XGraphics class from a PdfSharp.Pdf.PdfPage object. + + + + + Creates a new instance of the XGraphics class from a PdfSharp.Pdf.PdfPage object. + + + + + Creates a new instance of the XGraphics class from a PdfSharp.Pdf.PdfPage object. + + + + + Creates a new instance of the XGraphics class from a PdfSharp.Pdf.PdfPage object. + + + + + Creates a new instance of the XGraphics class from a PdfSharp.Pdf.PdfPage object. + + + + + Creates a new instance of the XGraphics class from a PdfSharp.Pdf.PdfPage object. + + + + + Creates a new instance of the XGraphics class from a PdfSharp.Pdf.PdfPage object. + + + + + Creates a new instance of the XGraphics class from a PdfSharp.Drawing.XPdfForm object. + + + + + Creates a new instance of the XGraphics class from a PdfSharp.Drawing.XForm object. + + + + + Creates a new instance of the XGraphics class from a PdfSharp.Drawing.XForm object. + + + + + Creates a new instance of the XGraphics class from a PdfSharp.Drawing.XImage object. + + + + + Internal setup. + + + + + Releases all resources used by this object. + + + + + Internal hack for MigraDoc. Will be removed in further releases. + Unicode support requires a global refactoring of MigraDoc and will be done in further releases. + + + + + A value indicating whether GDI+ or WPF is used as context. + + + + + Gets or sets the unit of measure used for page coordinates. + CURRENTLY ONLY POINT IS IMPLEMENTED. + + + + + Gets or sets the a value indicating in which direction y-value grow. + + + + + Gets the current page origin. Setting the origin is not yet implemented. + + + + + Gets the current size of the page. + + + + + Draws a line connecting two XPoint structures. + + + + + Draws a line connecting the two points specified by coordinate pairs. + + + + + Draws a series of line segments that connect an array of points. + + + + + Draws a series of line segments that connect an array of x and y pairs. + + + + + Draws a Bézier spline defined by four points. + + + + + Draws a Bézier spline defined by four points. + + + + + Draws a series of Bézier splines from an array of points. + + + + + Draws a cardinal spline through a specified array of points. + + + + + Draws a cardinal spline through a specified array of point using a specified tension. + The drawing begins offset from the beginning of the array. + + + + + Draws a cardinal spline through a specified array of points using a specified tension. + + + + + Draws an arc representing a portion of an ellipse. + + + + + Draws an arc representing a portion of an ellipse. + + + + + Draws a rectangle. + + + + + Draws a rectangle. + + + + + Draws a rectangle. + + + + + Draws a rectangle. + + + + + Draws a rectangle. + + + + + Draws a rectangle. + + + + + Draws a series of rectangles. + + + + + Draws a series of rectangles. + + + + + Draws a series of rectangles. + + + + + Draws a rectangles with round corners. + + + + + Draws a rectangles with round corners. + + + + + Draws a rectangles with round corners. + + + + + Draws a rectangles with round corners. + + + + + Draws a rectangles with round corners. + + + + + Draws a rectangles with round corners. + + + + + Draws an ellipse defined by a bounding rectangle. + + + + + Draws an ellipse defined by a bounding rectangle. + + + + + Draws an ellipse defined by a bounding rectangle. + + + + + Draws an ellipse defined by a bounding rectangle. + + + + + Draws an ellipse defined by a bounding rectangle. + + + + + Draws an ellipse defined by a bounding rectangle. + + + + + Draws a polygon defined by an array of points. + + + + + Draws a polygon defined by an array of points. + + + + + Draws a polygon defined by an array of points. + + + + + Draws a pie defined by an ellipse. + + + + + Draws a pie defined by an ellipse. + + + + + Draws a pie defined by an ellipse. + + + + + Draws a pie defined by an ellipse. + + + + + Draws a pie defined by an ellipse. + + + + + Draws a pie defined by an ellipse. + + + + + Draws a closed cardinal spline defined by an array of points. + + + + + Draws a closed cardinal spline defined by an array of points. + + + + + Draws a closed cardinal spline defined by an array of points. + + + + + Draws a closed cardinal spline defined by an array of points. + + + + + Draws a closed cardinal spline defined by an array of points. + + + + + Draws a closed cardinal spline defined by an array of points. + + + + + Draws a closed cardinal spline defined by an array of points. + + + + + Draws a closed cardinal spline defined by an array of points. + + + + + Draws a graphical path. + + + + + Draws a graphical path. + + + + + Draws a graphical path. + + + + + Draws the specified text string. + + + + + Draws the specified text string. + + + + + Draws the specified text string. + + + + + Draws the specified text string. + + + + + Draws the specified text string. + + + + + Draws the specified text string. + + + + + Measures the specified string when drawn with the specified font. + + + + + Measures the specified string when drawn with the specified font. + + + + + Draws the specified image. + + + + + Draws the specified image. + + + + + Draws the specified image. + + + + + Draws the specified image. + + + + + Draws the specified image. + + + + + Checks whether drawing is allowed and disposes the XGraphics object, if necessary. + + + + + Draws the specified bar code. + + + + + Draws the specified bar code. + + + + + Draws the specified bar code. + + + + + Draws the specified data matrix code. + + + + + Draws the specified data matrix code. + + + + + Saves the current state of this XGraphics object and identifies the saved state with the + returned XGraphicsState object. + + + + + Restores the state of this XGraphics object to the state represented by the specified + XGraphicsState object. + + + + + Restores the state of this XGraphics object to the state before the most recently call of Save. + + + + + Saves a graphics container with the current state of this XGraphics and + opens and uses a new graphics container. + + + + + Saves a graphics container with the current state of this XGraphics and + opens and uses a new graphics container. + + + + + Closes the current graphics container and restores the state of this XGraphics + to the state saved by a call to the BeginContainer method. + + + + + Gets the current graphics state level. The default value is 0. Each call of Save or BeginContainer + increased and each call of Restore or EndContainer decreased the value by 1. + + + + + Gets or sets the smoothing mode. + + The smoothing mode. + + + + Applies the specified translation operation to the transformation matrix of this object by + prepending it to the object's transformation matrix. + + + + + Applies the specified translation operation to the transformation matrix of this object + in the specified order. + + + + + Applies the specified scaling operation to the transformation matrix of this object by + prepending it to the object's transformation matrix. + + + + + Applies the specified scaling operation to the transformation matrix of this object + in the specified order. + + + + + Applies the specified scaling operation to the transformation matrix of this object by + prepending it to the object's transformation matrix. + + + + + Applies the specified scaling operation to the transformation matrix of this object + in the specified order. + + + + + Applies the specified scaling operation to the transformation matrix of this object by + prepending it to the object's transformation matrix. + + + + + Applies the specified scaling operation to the transformation matrix of this object by + prepending it to the object's transformation matrix. + + + + + Applies the specified rotation operation to the transformation matrix of this object by + prepending it to the object's transformation matrix. + + + + + Applies the specified rotation operation to the transformation matrix of this object + in the specified order. The angle unit of measure is degree. + + + + + Applies the specified rotation operation to the transformation matrix of this object by + prepending it to the object's transformation matrix. + + + + + Applies the specified rotation operation to the transformation matrix of this object by + prepending it to the object's transformation matrix. + + + + + Applies the specified shearing operation to the transformation matrix of this object by + prepending it to the object's transformation matrix. + ShearTransform is a synonym for SkewAtTransform. + Parameter shearX specifies the horizontal skew which is measured in degrees counterclockwise from the y-axis. + Parameter shearY specifies the vertical skew which is measured in degrees counterclockwise from the x-axis. + + + + + Applies the specified shearing operation to the transformation matrix of this object + in the specified order. + ShearTransform is a synonym for SkewAtTransform. + Parameter shearX specifies the horizontal skew which is measured in degrees counterclockwise from the y-axis. + Parameter shearY specifies the vertical skew which is measured in degrees counterclockwise from the x-axis. + + + + + Applies the specified shearing operation to the transformation matrix of this object by + prepending it to the object's transformation matrix. + ShearTransform is a synonym for SkewAtTransform. + Parameter shearX specifies the horizontal skew which is measured in degrees counterclockwise from the y-axis. + Parameter shearY specifies the vertical skew which is measured in degrees counterclockwise from the x-axis. + + + + + Applies the specified shearing operation to the transformation matrix of this object by + prepending it to the object's transformation matrix. + ShearTransform is a synonym for SkewAtTransform. + Parameter shearX specifies the horizontal skew which is measured in degrees counterclockwise from the y-axis. + Parameter shearY specifies the vertical skew which is measured in degrees counterclockwise from the x-axis. + + + + + Multiplies the transformation matrix of this object and specified matrix. + + + + + Multiplies the transformation matrix of this object and specified matrix in the specified order. + + + + + Gets the current transformation matrix. + The transformation matrix cannot be set. Instead use Save/Restore or BeginContainer/EndContainer to + save the state before Transform is called and later restore to the previous transform. + + + + + Applies a new transformation to the current transformation matrix. + + + + + Updates the clip region of this XGraphics to the intersection of the + current clip region and the specified rectangle. + + + + + Updates the clip region of this XGraphics to the intersection of the + current clip region and the specified graphical path. + + + + + Writes a comment to the output stream. Comments have no effect on the rendering of the output. + They may be useful to mark a position in a content stream of a PDF document. + + + + + Permits access to internal data. + + + + + (Under construction. May change in future versions.) + + + + + The transformation matrix from the XGraphics page space to the Graphics world space. + (The name 'default view matrix' comes from Microsoft OS/2 Presentation Manager. I choose + this name because I have no better one.) + + + + + Indicates whether to send drawing operations to _gfx or _dc. + + + + + Interface to an (optional) renderer. Currently it is the XGraphicsPdfRenderer, if defined. + + + + + The transformation matrix from XGraphics world space to page unit space. + + + + + The graphics state stack. + + + + + Gets the PDF page that serves as drawing surface if PDF is rendered, + or null, if no such object exists. + + + + + Provides access to internal data structures of the XGraphics class. + + + + + (This class is under construction.) + Currently used in MigraDoc + + + + + Gets the smallest rectangle in default page space units that completely encloses the specified rect + in world space units. + + + + + Represents the internal state of an XGraphics object. + + + + + Represents a series of connected lines and curves. + + + + + Initializes a new instance of the class. + + + + + Clones this instance. + + + + + Adds a line segment to current figure. + + + + + Adds a line segment to current figure. + + + + + Adds a series of connected line segments to current figure. + + + + + Adds a cubic Bézier curve to the current figure. + + + + + Adds a cubic Bézier curve to the current figure. + + + + + Adds a sequence of connected cubic Bézier curves to the current figure. + + + + + Adds a spline curve to the current figure. + + + + + Adds a spline curve to the current figure. + + + + + Adds a spline curve to the current figure. + + + + + Adds an elliptical arc to the current figure. + + + + + Adds an elliptical arc to the current figure. + + + + + Adds an elliptical arc to the current figure. The arc is specified WPF like. + + + + + Adds a rectangle to this path. + + + + + Adds a rectangle to this path. + + + + + Adds a series of rectangles to this path. + + + + + Adds a rectangle with rounded corners to this path. + + + + + Adds an ellipse to the current path. + + + + + Adds an ellipse to the current path. + + + + + Adds a polygon to this path. + + + + + Adds the outline of a pie shape to this path. + + + + + Adds the outline of a pie shape to this path. + + + + + Adds a closed curve to this path. + + + + + Adds a closed curve to this path. + + + + + Adds the specified path to this path. + + + + + Adds a text string to this path. + + + + + Adds a text string to this path. + + + + + Closes the current figure and starts a new figure. + + + + + Starts a new figure without closing the current figure. + + + + + Gets or sets an XFillMode that determines how the interiors of shapes are filled. + + + + + Converts each curve in this XGraphicsPath into a sequence of connected line segments. + + + + + Converts each curve in this XGraphicsPath into a sequence of connected line segments. + + + + + Converts each curve in this XGraphicsPath into a sequence of connected line segments. + + + + + Replaces this path with curves that enclose the area that is filled when this path is drawn + by the specified pen. + + + + + Replaces this path with curves that enclose the area that is filled when this path is drawn + by the specified pen. + + + + + Replaces this path with curves that enclose the area that is filled when this path is drawn + by the specified pen. + + + + + Grants access to internal objects of this class. + + + + + Gets access to underlying Core graphics path. + + + + + Provides access to the internal data structures of XGraphicsPath. + This class prevents the public interface from pollution with internal functions. + + + + + Represents the internal state of an XGraphics object. + This class is used as a handle for restoring the context. + + + + + Defines an abstract base class for pixel based images. + + + + + Gets the width of the image in pixels. + + + + + Gets the height of the image in pixels. + + + + + Defines an object used to draw image files (bmp, png, jpeg, gif) and PDF forms. + An abstract base class that provides functionality for the Bitmap and Metafile descended classes. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from an image read by ImageImporter. + + The image. + image + + + + Creates an image from the specified file. + + The path to a BMP, PNG, GIF, JPEG, TIFF, or PDF file. + + + + Creates an image from the specified stream.
+ Silverlight supports PNG and JPEG only. +
+ The stream containing a BMP, PNG, GIF, JPEG, TIFF, or PDF file. +
+ + + Tests if a file exist. Supports PDF files with page number suffix. + + The path to a BMP, PNG, GIF, JPEG, TIFF, or PDF file. + + + + Under construction + + + + + Disposes underlying GDI+ object. + + + + + Gets the width of the image. + + + + + Gets the height of the image. + + + + + The factor for conversion from DPM to PointWidth or PointHeight. + 72 points per inch, 1000 mm per meter, 25.4 mm per inch => 72 * 1000 / 25.4. + + + + + The factor for conversion from DPM to PointWidth or PointHeight. + 1000 mm per meter, 25.4 mm per inch => 1000 / 25.4. + + + + + Gets the width of the image in point. + + + + + Gets the height of the image in point. + + + + + Gets the width of the image in pixels. + + + + + Gets the height of the image in pixels. + + + + + Gets the size in point of the image. + + + + + Gets the horizontal resolution of the image. + + + + + Gets the vertical resolution of the image. + + + + + Gets or sets a flag indicating whether image interpolation is to be performed. + + + + + Gets the format of the image. + + + + + If path starts with '*' the image is created from a stream and the path is a GUID. + + + + + Contains a reference to the original stream if image was created from a stream. + + + + + Cache PdfImageTable.ImageSelector to speed up finding the right PdfImage + if this image is used more than once. + + + + + Specifies the format of the image. + + + + + Determines whether the specified object is equal to the current object. + + + + + Returns the hash code for this instance. + + + + + Gets the Portable Network Graphics (PNG) image format. + + + + + Gets the Graphics Interchange Format (GIF) image format. + + + + + Gets the Joint Photographic Experts Group (JPEG) image format. + + + + + Gets the Tag Image File Format (TIFF) image format. + + + + + Gets the Portable Document Format (PDF) image format + + + + + Gets the Windows icon image format. + + + + + Defines a Brush with a linear gradient. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Gets or sets an XMatrix that defines a local geometric transform for this LinearGradientBrush. + + + + + Translates the brush with the specified offset. + + + + + Translates the brush with the specified offset. + + + + + Scales the brush with the specified scalars. + + + + + Scales the brush with the specified scalars. + + + + + Rotates the brush with the specified angle. + + + + + Rotates the brush with the specified angle. + + + + + Multiply the brush transformation matrix with the specified matrix. + + + + + Multiply the brush transformation matrix with the specified matrix. + + + + + Resets the brush transformation matrix with identity matrix. + + + + + Represents a 3-by-3 matrix that represents an affine 2D transformation. + + + + + Initializes a new instance of the XMatrix struct. + + + + + Gets the identity matrix. + + + + + Sets this matrix into an identity matrix. + + + + + Gets a value indicating whether this matrix instance is the identity matrix. + + + + + Gets an array of double values that represents the elements of this matrix. + + + + + Multiplies two matrices. + + + + + Multiplies two matrices. + + + + + Appends the specified matrix to this matrix. + + + + + Prepends the specified matrix to this matrix. + + + + + Appends the specified matrix to this matrix. + + + + + Prepends the specified matrix to this matrix. + + + + + Multiplies this matrix with the specified matrix. + + + + + Appends a translation of the specified offsets to this matrix. + + + + + Appends a translation of the specified offsets to this matrix. + + + + + Prepends a translation of the specified offsets to this matrix. + + + + + Translates the matrix with the specified offsets. + + + + + Appends the specified scale vector to this matrix. + + + + + Appends the specified scale vector to this matrix. + + + + + Prepends the specified scale vector to this matrix. + + + + + Scales the matrix with the specified scalars. + + + + + Scales the matrix with the specified scalar. + + + + + Appends the specified scale vector to this matrix. + + + + + Prepends the specified scale vector to this matrix. + + + + + Scales the matrix with the specified scalar. + + + + + Function is obsolete. + + + + + Apppends the specified scale about the specified point of this matrix. + + + + + Prepends the specified scale about the specified point of this matrix. + + + + + Function is obsolete. + + + + + Appends a rotation of the specified angle to this matrix. + + + + + Prepends a rotation of the specified angle to this matrix. + + + + + Rotates the matrix with the specified angle. + + + + + Function is obsolete. + + + + + Appends a rotation of the specified angle at the specified point to this matrix. + + + + + Prepends a rotation of the specified angle at the specified point to this matrix. + + + + + Rotates the matrix with the specified angle at the specified point. + + + + + Appends a rotation of the specified angle at the specified point to this matrix. + + + + + Prepends a rotation of the specified angle at the specified point to this matrix. + + + + + Rotates the matrix with the specified angle at the specified point. + + + + + Function is obsolete. + + + + + Appends a skew of the specified degrees in the x and y dimensions to this matrix. + + + + + Prepends a skew of the specified degrees in the x and y dimensions to this matrix. + + + + + Shears the matrix with the specified scalars. + + + + + Function is obsolete. + + + + + Appends a skew of the specified degrees in the x and y dimensions to this matrix. + + + + + Prepends a skew of the specified degrees in the x and y dimensions to this matrix. + + + + + Transforms the specified point by this matrix and returns the result. + + + + + Transforms the specified points by this matrix. + + + + + Multiplies all points of the specified array with the this matrix. + + + + + Transforms the specified vector by this Matrix and returns the result. + + + + + Transforms the specified vectors by this matrix. + + + + + Gets the determinant of this matrix. + + + + + Gets a value that indicates whether this matrix is invertible. + + + + + Inverts the matrix. + + + + + Gets or sets the value of the first row and first column of this matrix. + + + + + Gets or sets the value of the first row and second column of this matrix. + + + + + Gets or sets the value of the second row and first column of this matrix. + + + + + Gets or sets the value of the second row and second column of this matrix. + + + + + Gets or sets the value of the third row and first column of this matrix. + + + + + Gets or sets the value of the third row and second column of this matrix. + + + + + Determines whether the two matrices are equal. + + + + + Determines whether the two matrices are not equal. + + + + + Determines whether the two matrices are equal. + + + + + Determines whether this matrix is equal to the specified object. + + + + + Determines whether this matrix is equal to the specified matrix. + + + + + Returns the hash code for this instance. + + + + + Parses a matrix from a string. + + + + + Converts this XMatrix to a human readable string. + + + + + Converts this XMatrix to a human readable string. + + + + + Converts this XMatrix to a human readable string. + + + + + Sets the matrix. + + + + + Internal matrix helper. + + + + + Gets the DebuggerDisplayAttribute text. + + The debugger display. + + + + Represents a so called 'PDF form external object', which is typically an imported page of an external + PDF document. XPdfForm objects are used like images to draw an existing PDF page of an external + document in the current document. XPdfForm objects can only be placed in PDF documents. If you try + to draw them using a XGraphics based on an GDI+ context no action is taken if no placeholder image + is specified. Otherwise the place holder is drawn. + + + + + Initializes a new instance of the XPdfForm class from the specified path to an external PDF document. + Although PDFsharp internally caches XPdfForm objects it is recommended to reuse XPdfForm objects + in your code and change the PageNumber property if more than one page is needed form the external + document. Furthermore, because XPdfForm can occupy very much memory, it is recommended to + dispose XPdfForm objects if not needed anymore. + + + + + Initializes a new instance of the class from a stream. + + The stream. + + + + Creates an XPdfForm from a file. + + + + + Creates an XPdfForm from a stream. + + + + + Sets the form in the state FormState.Finished. + + + + + Frees the memory occupied by the underlying imported PDF document, even if other XPdfForm objects + refer to this document. A reuse of this object doesn't fail, because the underlying PDF document + is re-imported if necessary. + + + + + Gets or sets an image that is used for drawing if the current XGraphics object cannot handle + PDF forms. A place holder is useful for showing a preview of a page on the display, because + PDFsharp cannot render native PDF objects. + + + + + Gets the underlying PdfPage (if one exists). + + + + + Gets the number of pages in the PDF form. + + + + + Gets the width in point of the page identified by the property PageNumber. + + + + + Gets the height in point of the page identified by the property PageNumber. + + + + + Gets the width in point of the page identified by the property PageNumber. + + + + + Gets the height in point of the page identified by the property PageNumber. + + + + + Gets the width in point of the page identified by the property PageNumber. + + + + + Gets the height in point of the page identified by the property PageNumber. + + + + + Get the size of the page identified by the property PageNumber. + + + + + Gets or sets the transformation matrix. + + + + + Gets or sets the page number in the external PDF document this object refers to. The page number + is one-based, i.e. it is in the range from 1 to PageCount. The default value is 1. + + + + + Gets or sets the page index in the external PDF document this object refers to. The page index + is zero-based, i.e. it is in the range from 0 to PageCount - 1. The default value is 0. + + + + + Gets the underlying document from which pages are imported. + + + + + Extracts the page number if the path has the form 'MyFile.pdf#123' and returns + the actual path without the number sign and the following digits. + + + + + Defines an object used to draw lines and curves. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Clones this instance. + + + + + Gets or sets the color. + + + + + Gets or sets the width. + + + + + Gets or sets the line join. + + + + + Gets or sets the line cap. + + + + + Gets or sets the miter limit. + + + + + Gets or sets the dash style. + + + + + Gets or sets the dash offset. + + + + + Gets or sets the dash pattern. + + + + + Gets or sets a value indicating whether the pen enables overprint when used in a PDF document. + Experimental, takes effect only on CMYK color mode. + + + + + Pens for all the pre-defined colors. + + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + Gets a pre-defined XPen object. + + + + Represents a pair of floating point x- and y-coordinates that defines a point + in a two-dimensional plane. + + + + + Initializes a new instance of the XPoint class with the specified coordinates. + + + + + Determines whether two points are equal. + + + + + Determines whether two points are not equal. + + + + + Indicates whether the specified points are equal. + + + + + Indicates whether this instance and a specified object are equal. + + + + + Indicates whether this instance and a specified point are equal. + + + + + Returns the hash code for this instance. + + + + + Parses the point from a string. + + + + + Parses an array of points from a string. + + + + + Gets the x-coordinate of this XPoint. + + + + + Gets the x-coordinate of this XPoint. + + + + + Converts this XPoint to a human readable string. + + + + + Converts this XPoint to a human readable string. + + + + + Converts this XPoint to a human readable string. + + + + + Implements ToString. + + + + + Offsets the x and y value of this point. + + + + + Adds a point and a vector. + + + + + Adds a point and a size. + + + + + Adds a point and a vector. + + + + + Subtracts a vector from a point. + + + + + Subtracts a vector from a point. + + + + + Subtracts a point from a point. + + + + + Subtracts a size from a point. + + + + + Subtracts a point from a point. + + + + + Multiplies a point with a matrix. + + + + + Multiplies a point with a matrix. + + + + + Multiplies a point with a scalar value. + + + + + Multiplies a point with a scalar value. + + + + + Performs an explicit conversion from XPoint to XSize. + + + + + Performs an explicit conversion from XPoint to XVector. + + + + + Gets the DebuggerDisplayAttribute text. + + + + + Makes fonts that are not installed on the system available within the current application domain.
+ In Silverlight required for all fonts used in PDF documents. +
+
+ + + Initializes a new instance of the class. + + + + + Gets the global font collection. + + + + + Adds the specified font data to the global PrivateFontCollection. + Family name and style are automatically retrieved from the font. + + + + + Adds the specified font data to the global PrivateFontCollection. + Family name and style are automatically retrieved from the font. + + + + + Stores a set of four floating-point numbers that represent the location and size of a rectangle. + + + + + Initializes a new instance of the XRect class. + + + + + Initializes a new instance of the XRect class. + + + + + Initializes a new instance of the XRect class. + + + + + Initializes a new instance of the XRect class. + + + + + Initializes a new instance of the XRect class. + + + + + Creates a rectangle from for straight lines. + + + + + Determines whether the two rectangles are equal. + + + + + Determines whether the two rectangles are not equal. + + + + + Determines whether the two rectangles are equal. + + + + + Determines whether this instance and the specified object are equal. + + + + + Determines whether this instance and the specified rect are equal. + + + + + Returns the hash code for this instance. + + + + + Parses the rectangle from a string. + + + + + Converts this XRect to a human readable string. + + + + + Converts this XRect to a human readable string. + + + + + Converts this XRect to a human readable string. + + + + + Gets the empty rectangle. + + + + + Gets a value indicating whether this instance is empty. + + + + + Gets or sets the location of the rectangle. + + + + + Gets or sets the size of the rectangle. + + + + + Gets or sets the X value of the rectangle. + + + + + Gets or sets the Y value of the rectangle. + + + + + Gets or sets the width of the rectangle. + + + + + Gets or sets the height of the rectangle. + + + + + Gets the x-axis value of the left side of the rectangle. + + + + + Gets the y-axis value of the top side of the rectangle. + + + + + Gets the x-axis value of the right side of the rectangle. + + + + + Gets the y-axis value of the bottom side of the rectangle. + + + + + Gets the position of the top-left corner of the rectangle. + + + + + Gets the position of the top-right corner of the rectangle. + + + + + Gets the position of the bottom-left corner of the rectangle. + + + + + Gets the position of the bottom-right corner of the rectangle. + + + + + Gets the center of the rectangle. + + + + + Indicates whether the rectangle contains the specified point. + + + + + Indicates whether the rectangle contains the specified point. + + + + + Indicates whether the rectangle contains the specified rectangle. + + + + + Indicates whether the specified rectangle intersects with the current rectangle. + + + + + Sets current rectangle to the intersection of the current rectangle and the specified rectangle. + + + + + Returns the intersection of two rectangles. + + + + + Sets current rectangle to the union of the current rectangle and the specified rectangle. + + + + + Returns the union of two rectangles. + + + + + Sets current rectangle to the union of the current rectangle and the specified point. + + + + + Returns the intersection of a rectangle and a point. + + + + + Moves a rectangle by the specified amount. + + + + + Moves a rectangle by the specified amount. + + + + + Returns a rectangle that is offset from the specified rectangle by using the specified vector. + + + + + Returns a rectangle that is offset from the specified rectangle by using specified horizontal and vertical amounts. + + + + + Translates the rectangle by adding the specified point. + + + + + Translates the rectangle by subtracting the specified point. + + + + + Expands the rectangle by using the specified Size, in all directions. + + + + + Expands or shrinks the rectangle by using the specified width and height amounts, in all directions. + + + + + Returns the rectangle that results from expanding the specified rectangle by the specified Size, in all directions. + + + + + Creates a rectangle that results from expanding or shrinking the specified rectangle by the specified width and height amounts, in all directions. + + + + + Returns the rectangle that results from applying the specified matrix to the specified rectangle. + + + + + Transforms the rectangle by applying the specified matrix. + + + + + Multiplies the size of the current rectangle by the specified x and y values. + + + + + Gets the DebuggerDisplayAttribute text. + + The debugger display. + + + + Represents a pair of floating-point numbers, typically the width and height of a + graphical object. + + + + + Initializes a new instance of the XPoint class with the specified values. + + + + + Determines whether two size objects are equal. + + + + + Determines whether two size objects are not equal. + + + + + Indicates whether this two instance are equal. + + + + + Indicates whether this instance and a specified object are equal. + + + + + Indicates whether this instance and a specified size are equal. + + + + + Returns the hash code for this instance. + + + + + Parses the size from a string. + + + + + Converts this XSize to an XPoint. + + + + + Converts this XSize to an XVector. + + + + + Converts this XSize to a human readable string. + + + + + Converts this XSize to a human readable string. + + + + + Converts this XSize to a human readable string. + + + + + Returns an empty size, i.e. a size with a width or height less than 0. + + + + + Gets a value indicating whether this instance is empty. + + + + + Gets or sets the width. + + + + + Gets or sets the height. + + + + + Performs an explicit conversion from XSize to XVector. + + + + + Performs an explicit conversion from XSize to XPoint. + + + + + Gets the DebuggerDisplayAttribute text. + + The debugger display. + + + + Defines a single color object used to fill shapes and draw text. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the color of this brush. + + + + + Gets or sets a value indicating whether the brush enables overprint when used in a PDF document. + Experimental, takes effect only on CMYK color mode. + + + + + Represents the text layout information. + + + + + Initializes a new instance of the class. + + + + + Gets or sets horizontal text alignment information. + + + + + Gets or sets the line alignment. + + + + + Gets a new XStringFormat object that aligns the text left on the base line. + + + + + Gets a new XStringFormat object that aligns the text top left of the layout rectangle. + + + + + Gets a new XStringFormat object that centers the text in the middle of the layout rectangle. + + + + + Gets a new XStringFormat object that centers the text at the top of the layout rectangle. + + + + + Gets a new XStringFormat object that centers the text at the bottom of the layout rectangle. + + + + + Represents predefined text layouts. + + + + + Gets a new XStringFormat object that aligns the text left on the base line. + This is the same as BaseLineLeft. + + + + + Gets a new XStringFormat object that aligns the text left on the base line. + This is the same as Default. + + + + + Gets a new XStringFormat object that aligns the text top left of the layout rectangle. + + + + + Gets a new XStringFormat object that aligns the text center left of the layout rectangle. + + + + + Gets a new XStringFormat object that aligns the text bottom left of the layout rectangle. + + + + + Gets a new XStringFormat object that centers the text in the middle of the base line. + + + + + Gets a new XStringFormat object that centers the text at the top of the layout rectangle. + + + + + Gets a new XStringFormat object that centers the text in the middle of the layout rectangle. + + + + + Gets a new XStringFormat object that centers the text at the bottom of the layout rectangle. + + + + + Gets a new XStringFormat object that aligns the text in right on the base line. + + + + + Gets a new XStringFormat object that aligns the text top right of the layout rectangle. + + + + + Gets a new XStringFormat object that aligns the text center right of the layout rectangle. + + + + + Gets a new XStringFormat object that aligns the text at the bottom right of the layout rectangle. + + + + + Represents a value and its unit of measure. The structure converts implicitly from and to + double with a value measured in point. + + + + + Initializes a new instance of the XUnit class with type set to point. + + + + + Initializes a new instance of the XUnit class. + + + + + Gets the raw value of the object without any conversion. + To determine the XGraphicsUnit use property Type. + To get the value in point use the implicit conversion to double. + + + + + Gets the unit of measure. + + + + + Gets or sets the value in point. + + + + + Gets or sets the value in inch. + + + + + Gets or sets the value in millimeter. + + + + + Gets or sets the value in centimeter. + + + + + Gets or sets the value in presentation units (1/96 inch). + + + + + Returns the object as string using the format information. + The unit of measure is appended to the end of the string. + + + + + Returns the object as string using the specified format and format information. + The unit of measure is appended to the end of the string. + + + + + Returns the object as string. The unit of measure is appended to the end of the string. + + + + + Returns the unit of measure of the object as a string like 'pt', 'cm', or 'in'. + + + + + Returns an XUnit object. Sets type to point. + + + + + Returns an XUnit object. Sets type to inch. + + + + + Returns an XUnit object. Sets type to millimeters. + + + + + Returns an XUnit object. Sets type to centimeters. + + + + + Returns an XUnit object. Sets type to Presentation. + + + + + Converts a string to an XUnit object. + If the string contains a suffix like 'cm' or 'in' the object will be converted + to the appropriate type, otherwise point is assumed. + + + + + Converts an int to an XUnit object with type set to point. + + + + + Converts a double to an XUnit object with type set to point. + + + + + Returns a double value as point. + + + + + Memberwise comparison. To compare by value, + use code like Math.Abs(a.Pt - b.Pt) < 1e-5. + + + + + Memberwise comparison. To compare by value, + use code like Math.Abs(a.Pt - b.Pt) < 1e-5. + + + + + Calls base class Equals. + + + + + Returns the hash code for this instance. + + + + + This member is intended to be used by XmlDomainObjectReader only. + + + + + Converts an existing object from one unit into another unit type. + + + + + Represents a unit with all values zero. + + + + + Gets the DebuggerDisplayAttribute text. + + The debugger display. + + + + Represents a two-dimensional vector specified by x- and y-coordinates. + + + + + Gets the DebuggerDisplayAttribute text. + + The debugger display. + + + + Identifies the technology of an OpenType font file. + + + + + Font is Adobe Postscript font in CFF. + + + + + Font is a TrueType font. + + + + + Font is a TrueType font collection. + + + + + TrueType font table names. + + + + + Character to glyph mapping. + + + + + Font header . + + + + + Horizontal header. + + + + + Horizontal Metrics. + + + + + Maximum profile. + + + + + Naming table. + + + + + OS/2 and Windows specific Metrics. + + + + + PostScript information. + + + + + Control Value Table. + + + + + Font program. + + + + + Glyph data. + + + + + Index to location. + + + + + CVT Program. + + + + + PostScript font program (compact font format). + + + + + Vertical Origin. + + + + + Embedded bitmap data. + + + + + Embedded bitmap location data. + + + + + Embedded bitmap scaling data. + + + + + Baseline data. + + + + + Glyph definition data. + + + + + Glyph positioning data. + + + + + Glyph substitution data. + + + + + Justification data. + + + + + Digital signature. + + + + + Grid-fitting/Scan-conversion. + + + + + Horizontal device Metrics. + + + + + Kerning. + + + + + Linear threshold data. + + + + + PCL 5 data. + + + + + Vertical device Metrics. + + + + + Vertical Header. + + + + + Vertical Metrics. + + + + + Base class for all font descriptors. + Currently only OpenTypeDescriptor is derived from this base class. + + + + + + + + + + + + + + + Gets a value indicating whether this instance belongs to a bold font. + + + + + + + + + + Gets a value indicating whether this instance belongs to an italic font. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This table contains information that describes the glyphs in the font in the TrueType outline format. + Information regarding the rasterizer (scaler) refers to the TrueType rasterizer. + http://www.microsoft.com/typography/otspec/glyf.htm + + + + + Converts the bytes in a handy representation + + + + + Gets the data of the specified glyph. + + + + + Gets the size of the byte array that defines the glyph. + + + + + Gets the offset of the specified glyph relative to the first byte of the font image. + + + + + Adds for all composite glyphs the glyphs the composite one is made of. + + + + + If the specified glyph is a composite glyph add the glyphs it is made of to the glyph table. + + + + + Prepares the font table to be compiled into its binary representation. + + + + + Converts the font into its binary representation. + + + + + Global table of all OpenType fontfaces cached by their face name and check sum. + + + + + Tries to get fontface by its key. + + + + + Tries to get fontface by its check sum. + + + + + Gets the singleton. + + + + + Maps face name to OpenType fontface. + + + + + Maps font source key to OpenType fontface. + + + + + Gets the DebuggerDisplayAttribute text. + + + + + Global table of all glyph typefaces. + + + + + Gets the singleton. + + + + + Maps typeface key to glyph typeface. + + + + + The indexToLoc table stores the offsets to the locations of the glyphs in the font, + relative to the beginning of the glyphData table. In order to compute the length of + the last glyph element, there is an extra entry after the last valid index. + + + + + Converts the bytes in a handy representation + + + + + Prepares the font table to be compiled into its binary representation. + + + + + Converts the font into its binary representation. + + + + + Represents an indirect reference to an existing font table in a font image. + Used to create binary copies of an existing font table that is not modified. + + + + + Prepares the font table to be compiled into its binary representation. + + + + + Converts the font into its binary representation. + + + + + The OpenType font descriptor. + Currently the only font type PDFsharp supports. + + + + + New... + + + + + Gets a value indicating whether this instance belongs to a bold font. + + + + + Gets a value indicating whether this instance belongs to an italic font. + + + + + Maps a unicode to the index of the corresponding glyph. + See OpenType spec "cmap - Character To Glyph Index Mapping Table / Format 4: Segment mapping to delta values" + for details about this a little bit strange looking algorithm. + + + + + Converts the width of a glyph identified by its index to PDF design units. + + + + + //Converts the width of a glyph identified by its index to PDF design units. + + + + + //Converts the width of a glyph identified by its index to PDF design units. + + + + + Represents an OpenType fontface in memory. + + + + + Shallow copy for font subset. + + + + + Initializes a new instance of the class. + + + + + Gets the full face name from the name table. + Name is also used as the key. + + + + + Gets the bytes that represents the font data. + + + + + The dictionary of all font tables. + + + + + Adds the specified table to this font image. + + + + + Reads all required tables from the font data. + + + + + Creates a new font image that is a subset of this font image containing only the specified glyphs. + + + + + Compiles the font to its binary representation. + + + + + Reads a System.Byte. + + + + + Reads a System.Int16. + + + + + Reads a System.UInt16. + + + + + Reads a System.Int32. + + + + + Reads a System.UInt32. + + + + + Reads a System.Int32. + + + + + Reads a System.Int16. + + + + + Reads a System.UInt16. + + + + + Reads a System.Int64. + + + + + Reads a System.String with the specified size. + + + + + Reads a System.Byte[] with the specified size. + + + + + Reads the specified buffer. + + + + + Reads the specified buffer. + + + + + Reads a System.Char[4] as System.String. + + + + + Gets the DebuggerDisplayAttribute text. + + + + + Represents the font offset table. + + + + + 0x00010000 for Version 1.0. + + + + + Number of tables. + + + + + (Maximum power of 2 ≤ numTables) x 16. + + + + + Log2(maximum power of 2 ≤ numTables). + + + + + NumTables x 16-searchRange. + + + + + Writes the offset table. + + + + + Base class for all OpenType tables used in PDFsharp. + + + + + Creates a deep copy of the current instance. + + + + + Gets the font image the table belongs to. + + + + + When overridden in a derived class, prepares the font table to be compiled into its binary representation. + + + + + When overridden in a derived class, converts the font into its binary representation. + + + + + Calculates the checksum of a table represented by its bytes. + + + + + Only Symbol and Unicode is used by PDFsharp. + + + + + CMap format 4: Segment mapping to delta values. + The Windows standard format. + + + + + This table defines the mapping of character codes to the glyph index values used in the font. + It may contain more than one subtable, in order to support more than one character encoding scheme. + + + + + Is true for symbol font encoding. + + + + + Initializes a new instance of the class. + + + + + This table gives global information about the font. The bounding box values should be computed using + only glyphs that have contours. Glyphs with no contours should be ignored for the purposes of these calculations. + + + + + This table contains information for horizontal layout. The values in the minRightSidebearing, + MinLeftSideBearing and xMaxExtent should be computed using only glyphs that have contours. + Glyphs with no contours should be ignored for the purposes of these calculations. + All reserved areas must be set to 0. + + + + + The type longHorMetric is defined as an array where each element has two parts: + the advance width, which is of type USHORT, and the left side bearing, which is of type SHORT. + These fields are in font design units. + + + + + The vertical Metrics table allows you to specify the vertical spacing for each glyph in a + vertical font. This table consists of either one or two arrays that contain metric + information (the advance heights and top sidebearings) for the vertical layout of each + of the glyphs in the font. + + + + + This table establishes the memory requirements for this font. + Fonts with CFF data must use Version 0.5 of this table, specifying only the numGlyphs field. + Fonts with TrueType outlines must use Version 1.0 of this table, where all data is required. + Both formats of OpenType require a 'maxp' table because a number of applications call the + Windows GetFontData() API on the 'maxp' table to determine the number of glyphs in the font. + + + + + The naming table allows multilingual strings to be associated with the OpenTypeTM font file. + These strings can represent copyright notices, font names, family names, style names, and so on. + To keep this table short, the font manufacturer may wish to make a limited set of entries in some + small set of languages; later, the font can be "localized" and the strings translated or added. + Other parts of the OpenType font file that require these strings can then refer to them simply by + their index number. Clients that need a particular string can look it up by its platform ID, character + encoding ID, language ID and name ID. Note that some platforms may require single byte character + strings, while others may require double byte strings. + + For historical reasons, some applications which install fonts perform Version control using Macintosh + platform (platform ID 1) strings from the 'name' table. Because of this, we strongly recommend that + the 'name' table of all fonts include Macintosh platform strings and that the syntax of the Version + number (name id 5) follows the guidelines given in this document. + + + + + Get the font family name. + + + + + Get the font subfamily name. + + + + + Get the full font name. + + + + + The OS/2 table consists of a set of Metrics that are required in OpenType fonts. + + + + + This table contains additional information needed to use TrueType or OpenTypeTM fonts + on PostScript printers. + + + + + This table contains a list of values that can be referenced by instructions. + They can be used, among other things, to control characteristics for different glyphs. + The length of the table must be an integral number of FWORD units. + + + + + This table is similar to the CVT Program, except that it is only run once, when the font is first used. + It is used only for FDEFs and IDEFs. Thus the CVT Program need not contain function definitions. + However, the CVT Program may redefine existing FDEFs or IDEFs. + + + + + The Control Value Program consists of a set of TrueType instructions that will be executed whenever the font or + point size or transformation matrix change and before each glyph is interpreted. Any instruction is legal in the + CVT Program but since no glyph is associated with it, instructions intended to move points within a particular + glyph outline cannot be used in the CVT Program. The name 'prep' is anachronistic. + + + + + This table contains information that describes the glyphs in the font in the TrueType outline format. + Information regarding the rasterizer (scaler) refers to the TrueType rasterizer. + + + + + Represents a writer for True Type font files. + + + + + Initializes a new instance of the class. + + + + + Writes a table name. + + + + + Represents an entry in the fonts table dictionary. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + 4 -byte identifier. + + + + + CheckSum for this table. + + + + + Offset from beginning of TrueType font file. + + + + + Actual length of this table in bytes. + + + + + Gets the length rounded up to a multiple of four bytes. + + + + + Associated font table. + + + + + Creates and reads a TableDirectoryEntry from the font image. + + + + + Helper class that determines the characters used in a particular font. + + + + + Adds the characters of the specified string to the hashtable. + + + + + Adds the glyphIndices to the hashtable. + + + + + Adds a ANSI characters. + + + + + Parameters that affect font selection. + + + + + Represents a font resolver info created by the platform font resolver. + + + + + Default platform specific font resolving. + + + + + Resolves the typeface by generating a font resolver info. + + Name of the font family. + Indicates whether a bold font is requested. + Indicates whether an italic font is requested. + + + + Internal implementation. + + + + + Create a GDI+ font and use its handle to retrieve font data using native calls. + + + + + Describes the physical font that must be used to render a particular XFont. + + + + + Initializes a new instance of the struct. + + The name that uniquely identifies the fontface. + + + + Initializes a new instance of the struct. + + The name that uniquely identifies the fontface. + Set to true to simulate bold when rendered. Not implemented and must be false. + Set to true to simulate italic when rendered. + Index of the font in a true type font collection. + Not yet implemented and must be zero. + + + + + Initializes a new instance of the struct. + + The name that uniquely identifies the fontface. + Set to true to simulate bold when rendered. Not implemented and must be false. + Set to true to simulate italic when rendered. + + + + Initializes a new instance of the struct. + + The name that uniquely identifies the fontface. + The style simulation flags. + + + + Gets the key for this object. + + + + + A name that uniquely identifies the font (not the family), e.g. the file name of the font. PDFsharp does not use this + name internally, but passes it to the GetFont function of the IFontResolver interface to retrieve the font data. + + + + + Indicates whether bold must be simulated. Bold simulation is not implemented in PDFsharp. + + + + + Indicates whether italic must be simulated. + + + + + Gets the style simulation flags. + + + + + The number of the font in a Truetype font collection file. The number of the first font is 0. + NOT YET IMPLEMENTED. Must be zero. + + + + + Gets the DebuggerDisplayAttribute text. + + + + + Provides functionality that converts a requested typeface into a physical font. + + + + + Converts specified information about a required typeface into a specific font. + + Name of the font family. + Set to true when a bold fontface is required. + Set to true when an italic fontface is required. + Information about the physical font, or null if the request cannot be satisfied. + + + + Gets the bytes of a physical font with specified face name. + + A face name previously retrieved by ResolveTypeface. + + + + Provides functionality to specify information about the handling of fonts in the current application domain. + + + + + The name of the default font. + + + + + Gets or sets the global font resolver for the current application domain. + This static function must be called only once and before any font operation was executed by PDFsharp. + If this is not easily to obtain, e.g. because your code is running on a web server, you must provide the + same instance of your font resolver in every subsequent setting of this property. + In a web application set the font resolver in Global.asax. + + + + + Gets or sets the default font encoding used for XFont objects where encoding is not explicitly specified. + If it is not set, the default value is PdfFontEncoding.Unicode. + If you are sure your document contains only Windows-1252 characters (see https://en.wikipedia.org/wiki/Windows-1252) + set default encoding to PdfFontEncodingj.Windows1252. + Must be set only once per app domain. + + + + + Global table of OpenType font descriptor objects. + + + + + Gets the FontDescriptor identified by the specified XFont. If no such object + exists, a new FontDescriptor is created and added to the cache. + + + + + Gets the FontDescriptor identified by the specified FontSelector. If no such object + exists, a new FontDescriptor is created and added to the stock. + + + + + Gets the singleton. + + + + + Maps font font descriptor key to font descriptor. + + + + + Provides functionality to map a fontface request to a physical font. + + + + + Converts specified information about a required typeface into a specific font. + + Name of the font family. + The font resolving options. + Typeface key if already known by caller, null otherwise. + + Information about the typeface, or null if no typeface can be found. + + + + + Gets the bytes of a physical font with specified face name. + + + + + Gets the bytes of a physical font with specified face name. + + + + + Gets a value indicating whether at least one font source was created. + + + + + Caches a font source under its face name and its key. + + + + + Caches a font source under its face name and its key. + + + + + Maps font typeface key to font resolver info. + + + + + Maps typeface key or font name to font source. + + + + + Maps font source key to font source. + + + + + Represents a writer for generation of font file streams. + + + + + Initializes a new instance of the class. + Data is written in Motorola format (big-endian). + + + + + Closes the writer and, if specified, the underlying stream. + + + + + Closes the writer and the underlying stream. + + + + + Gets or sets the position within the stream. + + + + + Writes the specified value to the font stream. + + + + + Writes the specified value to the font stream. + + + + + Writes the specified value to the font stream using big-endian. + + + + + Writes the specified value to the font stream using big-endian. + + + + + Writes the specified value to the font stream using big-endian. + + + + + Writes the specified value to the font stream using big-endian. + + + + + Writes the specified value to the font stream using big-endian. + + + + + Writes the specified value to the font stream using big-endian. + + + + + Gets the underlying stream. + + + + + Specifies the flags of AcroForm fields. + + + + + If set, the user may not change the value of the field. Any associated widget + annotations will not interact with the user; that is, they will not respond to + mouse clicks or change their appearance in response to mouse motions. This + flag is useful for fields whose values are computed or imported from a database. + + + + + If set, the field must have a value at the time it is exported by a submit-form action. + + + + + If set, the field must not be exported by a submit-form action. + + + + + If set, the field is a pushbutton that does not retain a permanent value. + + + + + If set, the field is a set of radio buttons; if clear, the field is a checkbox. + This flag is meaningful only if the Pushbutton flag is clear. + + + + + (Radio buttons only) If set, exactly one radio button must be selected at all times; + clicking the currently selected button has no effect. If clear, clicking + the selected button deselects it, leaving no button selected. + + + + + If set, the field may contain multiple lines of text; if clear, the field’s text + is restricted to a single line. + + + + + If set, the field is intended for entering a secure password that should + not be echoed visibly to the screen. Characters typed from the keyboard + should instead be echoed in some unreadable form, such as + asterisks or bullet characters. + To protect password confidentiality, viewer applications should never + store the value of the text field in the PDF file if this flag is set. + + + + + (PDF 1.4) If set, the text entered in the field represents the pathname of + a file whose contents are to be submitted as the value of the field. + + + + + (PDF 1.4) If set, the text entered in the field will not be spell-checked. + + + + + (PDF 1.4) If set, the field will not scroll (horizontally for single-line + fields, vertically for multiple-line fields) to accommodate more text + than will fit within its annotation rectangle. Once the field is full, no + further text will be accepted. + + + + + If set, the field is a combo box; if clear, the field is a list box. + + + + + If set, the combo box includes an editable text box as well as a drop list; + if clear, it includes only a drop list. This flag is meaningful only if the + Combo flag is set. + + + + + If set, the field’s option items should be sorted alphabetically. This flag is + intended for use by form authoring tools, not by PDF viewer applications; + viewers should simply display the options in the order in which they occur + in the Opt array. + + + + + (PDF 1.4) If set, more than one of the field’s option items may be selected + simultaneously; if clear, no more than one item at a time may be selected. + + + + + (PDF 1.4) If set, the text entered in the field will not be spell-checked. + This flag is meaningful only if the Combo and Edit flags are both set. + + + + + Represents the base class for all interactive field dictionaries. + + + + + Initializes a new instance of PdfAcroField. + + + + + Initializes a new instance of the class. Used for type transformation. + + + + + Gets the name of this field. + + + + + Gets the field flags of this instance. + + + + + Gets or sets the value of the field. + + + + + Gets or sets a value indicating whether the field is read only. + + + + + Gets the field with the specified name. + + + + + Gets a child field by name. + + + + + Indicates whether the field has child fields. + + + + + Gets the names of all descendants of this field. + + + + + Gets the names of all descendants of this field. + + + + + Gets the names of all appearance dictionaries of this AcroField. + + + + + Gets the collection of fields within this field. + + + + + Holds a collection of interactive fields. + + + + + Gets the number of elements in the array. + + + + + Gets the names of all fields in the collection. + + + + + Gets an array of all descendant names. + + + + + Gets a field from the collection. For your convenience an instance of a derived class like + PdfTextField or PdfCheckBox is returned if PDFsharp can guess the actual type of the dictionary. + If the actual type cannot be guessed by PDFsharp the function returns an instance + of PdfGenericField. + + + + + Gets the field with the specified name. + + + + + Create a derived type like PdfTextField or PdfCheckBox if possible. + If the actual cannot be guessed by PDFsharp the function returns an instance + of PdfGenericField. + + + + + Predefined keys of this dictionary. + The description comes from PDF 1.4 Reference. + + + + + (Required for terminal fields; inheritable) The type of field that this dictionary + describes: + Btn Button + Tx Text + Ch Choice + Sig (PDF 1.3) Signature + Note: This entry may be present in a nonterminal field (one whose descendants + are themselves fields) in order to provide an inheritable FT value. However, a + nonterminal field does not logically have a type of its own; it is merely a container + for inheritable attributes that are intended for descendant terminal fields of + any type. + + + + + (Required if this field is the child of another in the field hierarchy; absent otherwise) + The field that is the immediate parent of this one (the field, if any, whose Kids array + includes this field). A field can have at most one parent; that is, it can be included + in the Kids array of at most one other field. + + + + + (Optional) An array of indirect references to the immediate children of this field. + + + + + (Optional) The partial field name. + + + + + (Optional; PDF 1.3) An alternate field name, to be used in place of the actual + field name wherever the field must be identified in the user interface (such as + in error or status messages referring to the field). This text is also useful + when extracting the document’s contents in support of accessibility to disabled + users or for other purposes. + + + + + (Optional; PDF 1.3) The mapping name to be used when exporting interactive form field + data from the document. + + + + + (Optional; inheritable) A set of flags specifying various characteristics of the field. + Default value: 0. + + + + + (Optional; inheritable) The field’s value, whose format varies depending on + the field type; see the descriptions of individual field types for further information. + + + + + (Optional; inheritable) The default value to which the field reverts when a + reset-form action is executed. The format of this value is the same as that of V. + + + + + (Optional; PDF 1.2) An additional-actions dictionary defining the field’s behavior + in response to various trigger events. This entry has exactly the same meaning as + the AA entry in an annotation dictionary. + + + + + (Required; inheritable) A resource dictionary containing default resources + (such as fonts, patterns, or color spaces) to be used by the appearance stream. + At a minimum, this dictionary must contain a Font entry specifying the resource + name and font dictionary of the default font for displaying the field’s text. + + + + + (Required; inheritable) The default appearance string, containing a sequence of + valid page-content graphics or text state operators defining such properties as + the field’s text size and color. + + + + + (Optional; inheritable) A code specifying the form of quadding (justification) + to be used in displaying the text: + 0 Left-justified + 1 Centered + 2 Right-justified + Default value: 0 (left-justified). + + + + + Represents an interactive form (or AcroForm), a collection of fields for + gathering information interactively from the user. + + + + + Initializes a new instance of AcroForm. + + + + + Gets the fields collection of this form. + + + + + Predefined keys of this dictionary. + The description comes from PDF 1.4 Reference. + + + + + (Required) An array of references to the document’s root fields (those with + no ancestors in the field hierarchy). + + + + + (Optional) A flag specifying whether to construct appearance streams and + appearance dictionaries for all widget annotations in the document. + Default value: false. + + + + + (Optional; PDF 1.3) A set of flags specifying various document-level characteristics + related to signature fields. + Default value: 0. + + + + + (Required if any fields in the document have additional-actions dictionaries + containing a C entry; PDF 1.3) An array of indirect references to field dictionaries + with calculation actions, defining the calculation order in which their values will + be recalculated when the value of any field changes. + + + + + (Optional) A document-wide default value for the DR attribute of variable text fields. + + + + + (Optional) A document-wide default value for the DA attribute of variable text fields. + + + + + (Optional) A document-wide default value for the Q attribute of variable text fields. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents the base class for all button fields. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Gets the name which represents the opposite of /Off. + + + + + Predefined keys of this dictionary. + The description comes from PDF 1.4 Reference. + + + + + Represents the check box field. + + + + + Initializes a new instance of PdfCheckBoxField. + + + + + Indicates whether the field is checked. + + + + + Gets or sets the name of the dictionary that represents the Checked state. + + The default value is "/Yes". + + + + Gets or sets the name of the dictionary that represents the Unchecked state. + The default value is "/Off". + + + + + Predefined keys of this dictionary. + The description comes from PDF 1.4 Reference. + + + + + (Optional; inheritable; PDF 1.4) A text string to be used in place of the V entry for the + value of the field. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents the base class for all choice field dictionaries. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Gets the index of the specified string in the /Opt array or -1, if no such string exists. + + + + + Gets the value from the index in the /Opt array. + + + + + Predefined keys of this dictionary. + The description comes from PDF 1.4 Reference. + + + + + (Required; inheritable) An array of options to be presented to the user. Each element of + the array is either a text string representing one of the available options or a two-element + array consisting of a text string together with a default appearance string for constructing + the item’s appearance dynamically at viewing time. + + + + + (Optional; inheritable) For scrollable list boxes, the top index (the index in the Opt array + of the first option visible in the list). + + + + + (Sometimes required, otherwise optional; inheritable; PDF 1.4) For choice fields that allow + multiple selection (MultiSelect flag set), an array of integers, sorted in ascending order, + representing the zero-based indices in the Opt array of the currently selected option + items. This entry is required when two or more elements in the Opt array have different + names but the same export value, or when the value of the choice field is an array; in + other cases, it is permitted but not required. If the items identified by this entry differ + from those in the V entry of the field dictionary (see below), the V entry takes precedence. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents the combo box field. + + + + + Initializes a new instance of PdfComboBoxField. + + + + + Gets or sets the index of the selected item. + + + + + Gets or sets the value of the field. + + + + + Predefined keys of this dictionary. + The description comes from PDF 1.4 Reference. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents a generic field. Used for AcroForm dictionaries unknown to PDFsharp. + + + + + Initializes a new instance of PdfGenericField. + + + + + Predefined keys of this dictionary. + The description comes from PDF 1.4 Reference. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents the list box field. + + + + + Initializes a new instance of PdfListBoxField. + + + + + Gets or sets the index of the selected item + + + + + Predefined keys of this dictionary. + The description comes from PDF 1.4 Reference. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents the push button field. + + + + + Initializes a new instance of PdfPushButtonField. + + + + + Predefined keys of this dictionary. + The description comes from PDF 1.4 Reference. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents the radio button field. + + + + + Initializes a new instance of PdfRadioButtonField. + + + + + Gets or sets the index of the selected radio button in a radio button group. + + + + + Predefined keys of this dictionary. + The description comes from PDF 1.4 Reference. + + + + + (Optional; inheritable; PDF 1.4) An array of text strings to be used in + place of the V entries for the values of the widget annotations representing + the individual radio buttons. Each element in the array represents + the export value of the corresponding widget annotation in the + Kids array of the radio button field. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents the signature field. + + + + + Initializes a new instance of PdfSignatureField. + + + + + Predefined keys of this dictionary. + The description comes from PDF 1.4 Reference. + + + + + (Optional) The type of PDF object that this dictionary describes; if present, + must be Sig for a signature dictionary. + + + + + (Required; inheritable) The name of the signature handler to be used for + authenticating the field’s contents, such as Adobe.PPKLite, Entrust.PPKEF, + CICI.SignIt, or VeriSign.PPKVS. + + + + + (Optional) The name of a specific submethod of the specified handler. + + + + + (Required) An array of pairs of integers (starting byte offset, length in bytes) + describing the exact byte range for the digest calculation. Multiple discontinuous + byte ranges may be used to describe a digest that does not include the + signature token itself. + + + + + (Required) The encrypted signature token. + + + + + (Optional) The name of the person or authority signing the document. + + + + + (Optional) The time of signing. Depending on the signature handler, this + may be a normal unverified computer time or a time generated in a verifiable + way from a secure time server. + + + + + (Optional) The CPU host name or physical location of the signing. + + + + + (Optional) The reason for the signing, such as (I agree…). + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents the text field. + + + + + Initializes a new instance of PdfTextField. + + + + + Gets or sets the text value of the text field. + + + + + Gets or sets the font used to draw the text of the field. + + + + + Gets or sets the foreground color of the field. + + + + + Gets or sets the background color of the field. + + + + + Gets or sets the maximum length of the field. + + The length of the max. + + + + Gets or sets a value indicating whether the field has multiple lines. + + + + + Gets or sets a value indicating whether this field is used for passwords. + + + + + Creates the normal appearance form X object for the annotation that represents + this acro form text field. + + + + + Predefined keys of this dictionary. + The description comes from PDF 1.4 Reference. + + + + + (Optional; inheritable) The maximum length of the field’s text, in characters. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Specifies the predefined PDF actions. + + + + + Go to next page. + + + + + Go to previous page. + + + + + Go to first page. + + + + + Go to last page. + + + + + Represents a PDF Goto actions. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The document that owns this object. + + + + Predefined keys of this dictionary. + + + + + (Required) The destination to jump to (see Section 8.2.1, “Destinations”). + + + + + Represents the base class for all PDF actions. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The document that owns this object. + + + + Predefined keys of this dictionary. + + + + + (Optional) The type of PDF object that this dictionary describes; + if present, must be Action for an action dictionary. + + + + + (Required) The type of action that this dictionary describes. + + + + + (Optional; PDF 1.2) The next action or sequence of actions to be performed + after the action represented by this dictionary. The value is either a + single action dictionary or an array of action dictionaries to be performed + in order; see below for further discussion. + + + + + Represents the catalog dictionary. + + + + + Initializes a new instance of the class. + + + + + Get or sets the version of the PDF specification to which the document conforms. + + + + + Gets the pages collection of this document. + + + + + Implementation of PdfDocument.PageLayout. + + + + + Implementation of PdfDocument.PageMode. + + + + + Implementation of PdfDocument.ViewerPreferences. + + + + + Implementation of PdfDocument.Outlines. + + + + + Gets the AcroForm dictionary of this document. + + + + + Gets or sets the language identifier specifying the natural language for all text in the document. + Sample values are 'en-US' for 'English United States' or 'de-DE' for 'deutsch Deutschland' (i.e. 'German Germany'). + + + + + Dispatches PrepareForSave to the objects that need it. + + + + + Predefined keys of this dictionary. + + + + + (Required) The type of PDF object that this dictionary describes; + must be Catalog for the catalog dictionary. + + + + + (Optional; PDF 1.4) The version of the PDF specification to which the document + conforms (for example, 1.4) if later than the version specified in the file’s header. + If the header specifies a later version, or if this entry is absent, the document + conforms to the version specified in the header. This entry enables a PDF producer + application to update the version using an incremental update. + + + + + (Required; must be an indirect reference) The page tree node that is the root of + the document’s page tree. + + + + + (Optional; PDF 1.3) A number tree defining the page labeling for the document. + The keys in this tree are page indices; the corresponding values are page label dictionaries. + Each page index denotes the first page in a labeling range to which the specified page + label dictionary applies. The tree must include a value for pageindex 0. + + + + + (Optional; PDF 1.2) The document’s name dictionary. + + + + + (Optional; PDF 1.1; must be an indirect reference) A dictionary of names and + corresponding destinations. + + + + + (Optional; PDF 1.2) A viewer preferences dictionary specifying the way the document + is to be displayed on the screen. If this entry is absent, applications should use + their own current user preference settings. + + + + + (Optional) A name object specifying the page layout to be used when the document is + opened: + SinglePage - Display one page at a time. + OneColumn - Display the pages in one column. + TwoColumnLeft - Display the pages in two columns, with oddnumbered pages on the left. + TwoColumnRight - Display the pages in two columns, with oddnumbered pages on the right. + TwoPageLeft - (PDF 1.5) Display the pages two at a time, with odd-numbered pages on the left + TwoPageRight - (PDF 1.5) Display the pages two at a time, with odd-numbered pages on the right. + + + + + (Optional) A name object specifying how the document should be displayed when opened: + UseNone - Neither document outline nor thumbnail images visible. + UseOutlines - Document outline visible. + UseThumbs - Thumbnail images visible. + FullScreen - Full-screen mode, with no menu bar, windowcontrols, or any other window visible. + UseOC - (PDF 1.5) Optional content group panel visible. + UseAttachments (PDF 1.6) Attachments panel visible. + Default value: UseNone. + + + + + (Optional; must be an indirect reference) The outline dictionary that is the root + of the document’s outline hierarchy. + + + + + (Optional; PDF 1.1; must be an indirect reference) An array of thread dictionaries + representing the document’s article threads. + + + + + (Optional; PDF 1.1) A value specifying a destination to be displayed or an action to be + performed when the document is opened. The value is either an array defining a destination + or an action dictionary representing an action. If this entry is absent, the document + should be opened to the top of the first page at the default magnification factor. + + + + + (Optional; PDF 1.4) An additional-actions dictionary defining the actions to be taken + in response to various trigger events affecting the document as a whole. + + + + + (Optional; PDF 1.1) A URI dictionary containing document-level information for URI + (uniform resource identifier) actions. + + + + + (Optional; PDF 1.2) The document’s interactive form (AcroForm) dictionary. + + + + + (Optional; PDF 1.4; must be an indirect reference) A metadata stream + containing metadata for the document. + + + + + (Optional; PDF 1.3) The document’s structure tree root dictionary. + + + + + (Optional; PDF 1.4) A mark information dictionary containing information + about the document’s usage of Tagged PDF conventions. + + + + + (Optional; PDF 1.4) A language identifier specifying the natural language for all + text in the document except where overridden by language specifications for structure + elements or marked content. If this entry is absent, the language is considered unknown. + + + + + (Optional; PDF 1.3) A Web Capture information dictionary containing state information + used by the Acrobat Web Capture (AcroSpider) plugin extension. + + + + + (Optional; PDF 1.4) An array of output intent dictionaries describing the color + characteristics of output devices on which the document might be rendered. + + + + + (Optional; PDF 1.4) A page-piece dictionary associated with the document. + + + + + (Optional; PDF 1.5; required if a document contains optional content) The document’s + optional content properties dictionary. + + + + + (Optional; PDF 1.5) A permissions dictionary that specifies user access permissions + for the document. + + + + + (Optional; PDF 1.5) A dictionary containing attestations regarding the content of a + PDF document, as it relates to the legality of digital signatures. + + + + + (Optional; PDF 1.7) An array of requirement dictionaries representing + requirements for the document. + + + + + (Optional; PDF 1.7) A collection dictionary that a PDF consumer uses to enhance + the presentation of file attachments stored in the PDF document. + + + + + (Optional; PDF 1.7) A flag used to expedite the display of PDF documents containing XFA forms. + It specifies whether the document must be regenerated when the document is first opened. + If true, the viewer application treats the document as a shell and regenerates the content + when the document is opened, regardless of any dynamic forms settings that appear in the XFA + stream itself. This setting is used to expedite the display of documents whose layout varies + depending on the content of the XFA streams. + If false, the viewer application does not regenerate the content when the document is opened. + See the XML Forms Architecture (XFA) Specification (Bibliography). + Default value: false. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents a CIDFont dictionary. + + + + + Prepares the object to get saved. + + + + + Predefined keys of this dictionary. + + + + + (Required) The type of PDF object that this dictionary describes; + must be Font for a CIDFont dictionary. + + + + + (Required) The type of CIDFont; CIDFontType0 or CIDFontType2. + + + + + (Required) The PostScript name of the CIDFont. For Type 0 CIDFonts, this + is usually the value of the CIDFontName entry in the CIDFont program. For + Type 2 CIDFonts, it is derived the same way as for a simple TrueType font; + In either case, the name can have a subset prefix if appropriate. + + + + + (Required) A dictionary containing entries that define the character collection + of the CIDFont. + + + + + (Required; must be an indirect reference) A font descriptor describing the + CIDFont’s default metrics other than its glyph widths. + + + + + (Optional) The default width for glyphs in the CIDFont. + Default value: 1000. + + + + + (Optional) A description of the widths for the glyphs in the CIDFont. The + array’s elements have a variable format that can specify individual widths + for consecutive CIDs or one width for a range of CIDs. + Default value: none (the DW value is used for all glyphs). + + + + + (Optional; applies only to CIDFonts used for vertical writing) An array of two + numbers specifying the default metrics for vertical writing. + Default value: [880 −1000]. + + + + + (Optional; applies only to CIDFonts used for vertical writing) A description + of the metrics for vertical writing for the glyphs in the CIDFont. + Default value: none (the DW2 value is used for all glyphs). + + + + + (Optional; Type 2 CIDFonts only) A specification of the mapping from CIDs + to glyph indices. If the value is a stream, the bytes in the stream contain the + mapping from CIDs to glyph indices: the glyph index for a particular CID + value c is a 2-byte value stored in bytes 2 × c and 2 × c + 1, where the first + byte is the high-order byte. If the value of CIDToGIDMap is a name, it must + be Identity, indicating that the mapping between CIDs and glyph indices is + the identity mapping. + Default value: Identity. + This entry may appear only in a Type 2 CIDFont whose associated True-Type font + program is embedded in the PDF file. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents the content of a page. PDFsharp supports only one content stream per page. + If an imported page has an array of content streams, the streams are concatenated to + one single stream. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The dict. + + + + Sets a value indicating whether the content is compressed with the ZIP algorithm. + + + + + Unfilters the stream. + + + + + Surround content with q/Q operations if necessary. + + + + + Predefined keys of this dictionary. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents an array of PDF content streams of a page. + + + + + Initializes a new instance of the class. + + The document. + + + + Appends a new content stream and returns it. + + + + + Prepends a new content stream and returns it. + + + + + Creates a single content stream with the bytes from the array of the content streams. + This operation does not modify any of the content streams in this array. + + + + + Replaces the current content of the page with the specified content sequence. + + + + + Replaces the current content of the page with the specified bytes. + + + + + Gets the enumerator. + + + + + Represents a PDF cross-reference stream. + + + + + Initializes a new instance of the class. + + + + + Predefined keys for cross-reference dictionaries. + + + + + (Required) The type of PDF object that this dictionary describes; + must be XRef for a cross-reference stream. + + + + + (Required) The number one greater than the highest object number + used in this section or in any section for which this is an update. + It is equivalent to the Size entry in a trailer dictionary. + + + + + (Optional) An array containing a pair of integers for each subsection in this section. + The first integer is the first object number in the subsection; the second integer + is the number of entries in the subsection. + The array is sorted in ascending order by object number. Subsections cannot overlap; + an object number may have at most one entry in a section. + Default value: [0 Size]. + + + + + (Present only if the file has more than one cross-reference stream; not meaningful in + hybrid-reference files) The byte offset from the beginning of the file to the beginning + of the previous cross-reference stream. This entry has the same function as the Prev + entry in the trailer dictionary. + + + + + (Required) An array of integers representing the size of the fields in a single + cross-reference entry. The table describes the types of entries and their fields. + For PDF 1.5, W always contains three integers; the value of each integer is the + number of bytes (in the decoded stream) of the corresponding field. For example, + [1 2 1] means that the fields are one byte, two bytes, and one byte, respectively. + + A value of zero for an element in the W array indicates that the corresponding field + is not present in the stream, and the default value is used, if there is one. If the + first element is zero, the type field is not present, and it defaults to type 1. + + The sum of the items is the total length of each entry; it can be used with the + Indexarray to determine the starting position of each subsection. + + Note: Different cross-reference streams in a PDF file may use different values for W. + + Entries in a cross-reference stream. + + TYPE FIELD DESCRIPTION + 0 1 The type of this entry, which must be 0. Type 0 entries define the linked list of free objects (corresponding to f entries in a cross-reference table). + 2 The object number of the next free object. + 3 The generation number to use if this object number is used again. + 1 1 The type of this entry, which must be 1. Type 1 entries define objects that are in use but are not compressed (corresponding to n entries in a cross-reference table). + 2 The byte offset of the object, starting from the beginning of the file. + 3 The generation number of the object. Default value: 0. + 2 1 The type of this entry, which must be 2. Type 2 entries define compressed objects. + 2 The object number of the object stream in which this object is stored. (The generation number of the object stream is implicitly 0.) + 3 The index of this object within the object stream. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents the cross-reference table of a PDF document. + It contains all indirect objects of a document. + + + + + Represents the relation between PdfObjectID and PdfReference for a PdfDocument. + + + + + Adds a cross reference entry to the table. Used when parsing the trailer. + + + + + Adds a PdfObject to the table. + + + + + Gets a cross reference entry from an object identifier. + Returns null if no object with the specified ID exists in the object table. + + + + + Indicates whether the specified object identifier is in the table. + + + + + Returns the next free object number. + + + + + Writes the xref section in pdf stream. + + + + + Gets an array of all object identifiers. For debugging purposes only. + + + + + Gets an array of all cross references in ascending order by their object identifier. + + + + + Removes all objects that cannot be reached from the trailer. + Returns the number of removed objects. + + + + + Renumbers the objects starting at 1. + + + + + Checks the logical consistence for debugging purposes (useful after reconstruction work). + + + + + Calculates the transitive closure of the specified PdfObject, i.e. all indirect objects + recursively reachable from the specified object. + + + + + Calculates the transitive closure of the specified PdfObject with the specified depth, i.e. all indirect objects + recursively reachable from the specified object in up to maximally depth steps. + + + + + Gets the cross reference to an objects used for undefined indirect references. + + + + + Represents a base class for dictionaries with a content stream. + Implement IContentStream for use with a content writer. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The document. + + + + Initializes a new instance from an existing dictionary. Used for object type transformation. + + + + + Gets the resources dictionary of this dictionary. If no such dictionary exists, it is created. + + + + + Implements the interface because the primary function is internal. + + + + + Gets the resource name of the specified image within this dictionary. + + + + + Implements the interface because the primary function is internal. + + + + + Gets the resource name of the specified form within this dictionary. + + + + + Implements the interface because the primary function is internal. + + + + + Predefined keys of this dictionary. + + + + + (Optional but strongly recommended; PDF 1.2) A dictionary specifying any + resources (such as fonts and images) required by the form XObject. + + + + + Represents an extended graphics state object. + + + + + Initializes a new instance of the class. + + The document. + + + + Used in Edf.Xps. + + + + + Used in Edf.Xps. + ...for shading patterns + + + + + Sets the alpha value for stroking operations. + + + + + Sets the alpha value for nonstroking operations. + + + + + Sets the overprint value for stroking operations. + + + + + Sets the overprint value for nonstroking operations. + + + + + Sets a soft mask object. + + + + + Common keys for all streams. + + + + + (Optional) The type of PDF object that this dictionary describes; + must be ExtGState for a graphics state parameter dictionary. + + + + + (Optional; PDF 1.3) The line width (see “Line Width” on page 185). + + + + + (Optional; PDF 1.3) The line cap style. + + + + + (Optional; PDF 1.3) The line join style. + + + + + (Optional; PDF 1.3) The miter limit. + + + + + (Optional; PDF 1.3) The line dash pattern, expressed as an array of the form + [dashArray dashPhase], where dashArray is itself an array and dashPhase is an integer. + + + + + (Optional; PDF 1.3) The name of the rendering intent. + + + + + (Optional) A flag specifying whether to apply overprint. In PDF 1.2 and earlier, + there is a single overprint parameter that applies to all painting operations. + Beginning with PDF 1.3, there are two separate overprint parameters: one for stroking + and one for all other painting operations. Specifying an OP entry sets both parameters + unless there is also an op entry in the same graphics state parameter dictionary, in + which case the OP entry sets only the overprint parameter for stroking. + + + + + (Optional; PDF 1.3) A flag specifying whether to apply overprint for painting operations + other than stroking. If this entry is absent, the OP entry, if any, sets this parameter. + + + + + (Optional; PDF 1.3) The overprint mode. + + + + + (Optional; PDF 1.3) An array of the form [font size], where font is an indirect + reference to a font dictionary and size is a number expressed in text space units. + These two objects correspond to the operands of the Tf operator; however, + the first operand is an indirect object reference instead of a resource name. + + + + + (Optional) The black-generation function, which maps the interval [0.0 1.0] + to the interval [0.0 1.0]. + + + + + (Optional; PDF 1.3) Same as BG except that the value may also be the name Default, + denoting the black-generation function that was in effect at the start of the page. + If both BG and BG2 are present in the same graphics state parameter dictionary, + BG2 takes precedence. + + + + + (Optional) The undercolor-removal function, which maps the interval + [0.0 1.0] to the interval [-1.0 1.0]. + + + + + (Optional; PDF 1.3) Same as UCR except that the value may also be the name Default, + denoting the undercolor-removal function that was in effect at the start of the page. + If both UCR and UCR2 are present in the same graphics state parameter dictionary, + UCR2 takes precedence. + + + + + (Optional) A flag specifying whether to apply automatic stroke adjustment. + + + + + (Optional; PDF 1.4) The current blend mode to be used in the transparent imaging model. + + + + + (Optional; PDF 1.4) The current soft mask, specifying the mask shape or + mask opacity values to be used in the transparent imaging model. + + + + + (Optional; PDF 1.4) The current stroking alpha constant, specifying the constant + shape or constant opacity value to be used for stroking operations in the transparent + imaging model. + + + + + (Optional; PDF 1.4) Same as CA, but for nonstroking operations. + + + + + (Optional; PDF 1.4) The alpha source flag (“alpha is shape”), specifying whether + the current soft mask and alpha constant are to be interpreted as shape values (true) + or opacity values (false). + + + + + (Optional; PDF 1.4) The text knockout flag, which determines the behavior of + overlapping glyphs within a text object in the transparent imaging model. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Contains all used ExtGState objects of a document. + + + + + Initializes a new instance of this class, which is a singleton for each document. + + + + + Gets a PdfExtGState with the key 'CA' set to the specified alpha value. + + + + + Gets a PdfExtGState with the key 'ca' set to the specified alpha value. + + + + + Represents a PDF font. + + + + + Initializes a new instance of the class. + + + + + Gets a value indicating whether this instance is symbol font. + + + + + Gets or sets the CMapInfo. + + + + + Gets or sets ToUnicodeMap. + + + + + Adds a tag of exactly six uppercase letters to the font name + according to PDF Reference Section 5.5.3 'Font Subsets' + + + + + Predefined keys common to all font dictionaries. + + + + + (Required) The type of PDF object that this dictionary describes; + must be Font for a font dictionary. + + + + + (Required) The type of font. + + + + + (Required) The PostScript name of the font. + + + + + (Required except for the standard 14 fonts; must be an indirect reference) + A font descriptor describing the font’s metrics other than its glyph widths. + Note: For the standard 14 fonts, the entries FirstChar, LastChar, Widths, and + FontDescriptor must either all be present or all be absent. Ordinarily, they are + absent; specifying them enables a standard font to be overridden. + + + + + The PDF font descriptor flags. + + + + + All glyphs have the same width (as opposed to proportional or variable-pitch + fonts, which have different widths). + + + + + Glyphs have serifs, which are short strokes drawn at an angle on the top and + bottom of glyph stems. (Sans serif fonts do not have serifs.) + + + + + Font contains glyphs outside the Adobe standard Latin character set. This + flag and the Nonsymbolic flag cannot both be set or both be clear. + + + + + Glyphs resemble cursive handwriting. + + + + + Font uses the Adobe standard Latin character set or a subset of it. + + + + + Glyphs have dominant vertical strokes that are slanted. + + + + + Font contains no lowercase letters; typically used for display purposes, + such as for titles or headlines. + + + + + Font contains both uppercase and lowercase letters. The uppercase letters are + similar to those in the regular version of the same typeface family. The glyphs + for the lowercase letters have the same shapes as the corresponding uppercase + letters, but they are sized and their proportions adjusted so that they have the + same size and stroke weight as lowercase glyphs in the same typeface family. + + + + + Determines whether bold glyphs are painted with extra pixels even at very small + text sizes. + + + + + A PDF font descriptor specifies metrics and other attributes of a simple font, + as distinct from the metrics of individual glyphs. + + + + + Gets or sets the name of the font. + + + + + Gets a value indicating whether this instance is symbol font. + + + + + Predefined keys of this dictionary. + + + + + (Required) The type of PDF object that this dictionary describes; must be + FontDescriptor for a font descriptor. + + + + + (Required) The PostScript name of the font. This name should be the same as the + value of BaseFont in the font or CIDFont dictionary that refers to this font descriptor. + + + + + (Optional; PDF 1.5; strongly recommended for Type 3 fonts in Tagged PDF documents) + A string specifying the preferred font family name. For example, for the font + Times Bold Italic, the FontFamily is Times. + + + + + (Optional; PDF 1.5; strongly recommended for Type 3 fonts in Tagged PDF documents) + The font stretch value. It must be one of the following names (ordered from + narrowest to widest): UltraCondensed, ExtraCondensed, Condensed, SemiCondensed, + Normal, SemiExpanded, Expanded, ExtraExpanded or UltraExpanded. + Note: The specific interpretation of these values varies from font to font. + For example, Condensed in one font may appear most similar to Normal in another. + + + + + (Optional; PDF 1.5; strongly recommended for Type 3 fonts in Tagged PDF documents) + The weight (thickness) component of the fully-qualified font name or font specifier. + The possible values are 100, 200, 300, 400, 500, 600, 700, 800, or 900, where each + number indicates a weight that is at least as dark as its predecessor. A value of + 400 indicates a normal weight; 700 indicates bold. + Note: The specific interpretation of these values varies from font to font. + For example, 300 in one font may appear most similar to 500 in another. + + + + + (Required) A collection of flags defining various characteristics of the font. + + + + + (Required, except for Type 3 fonts) A rectangle (see Section 3.8.4, “Rectangles”), + expressed in the glyph coordinate system, specifying the font bounding box. This + is the smallest rectangle enclosing the shape that would result if all of the + glyphs of the font were placed with their origins coincident and then filled. + + + + + (Required) The angle, expressed in degrees counterclockwise from the vertical, of + the dominant vertical strokes of the font. (For example, the 9-o’clock position is 90 + degrees, and the 3-o’clock position is –90 degrees.) The value is negative for fonts + that slope to the right, as almost all italic fonts do. + + + + + (Required, except for Type 3 fonts) The maximum height above the baseline reached + by glyphs in this font, excluding the height of glyphs for accented characters. + + + + + (Required, except for Type 3 fonts) The maximum depth below the baseline reached + by glyphs in this font. The value is a negative number. + + + + + (Optional) The spacing between baselines of consecutive lines of text. + Default value: 0. + + + + + (Required for fonts that have Latin characters, except for Type 3 fonts) The vertical + coordinate of the top of flat capital letters, measured from the baseline. + + + + + (Optional) The font’s x height: the vertical coordinate of the top of flat nonascending + lowercase letters (like the letter x), measured from the baseline, in fonts that have + Latin characters. Default value: 0. + + + + + (Required, except for Type 3 fonts) The thickness, measured horizontally, of the dominant + vertical stems of glyphs in the font. + + + + + (Optional) The thickness, measured vertically, of the dominant horizontal stems + of glyphs in the font. Default value: 0. + + + + + (Optional) The average width of glyphs in the font. Default value: 0. + + + + + (Optional) The maximum width of glyphs in the font. Default value: 0. + + + + + (Optional) The width to use for character codes whose widths are not specified in a + font dictionary’s Widths array. This has a predictable effect only if all such codes + map to glyphs whose actual widths are the same as the value of the MissingWidth entry. + Default value: 0. + + + + + (Optional) A stream containing a Type 1 font program. + + + + + (Optional; PDF 1.1) A stream containing a TrueType font program. + + + + + (Optional; PDF 1.2) A stream containing a font program whose format is specified + by the Subtype entry in the stream dictionary. + + + + + (Optional; meaningful only in Type 1 fonts; PDF 1.1) A string listing the character + names defined in a font subset. The names in this string must be in PDF syntax—that is, + each name preceded by a slash (/). The names can appear in any order. The name .notdef + should be omitted; it is assumed to exist in the font subset. If this entry is absent, + the only indication of a font subset is the subset tag in the FontName entry. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + TrueType with WinAnsi encoding. + + + + + TrueType with Identity-H or Identity-V encoding (unicode). + + + + + Contains all used fonts of a document. + + + + + Initializes a new instance of this class, which is a singleton for each document. + + + + + Gets a PdfFont from an XFont. If no PdfFont already exists, a new one is created. + + + + + Gets a PdfFont from a font program. If no PdfFont already exists, a new one is created. + + + + + Tries to gets a PdfFont from the font dictionary. + Returns null if no such PdfFont exists. + + + + + Map from PdfFontSelector to PdfFont. + + + + + Represents an external form object (e.g. an imported page). + + + + + Gets the PdfResources object of this form. + + + + + Gets the resource name of the specified font data within this form XObject. + + + + + Predefined keys of this dictionary. + + + + + (Optional) The type of PDF object that this dictionary describes; if present, + must be XObject for a form XObject. + + + + + (Required) The type of XObject that this dictionary describes; must be Form + for a form XObject. + + + + + (Optional) A code identifying the type of form XObject that this dictionary + describes. The only valid value defined at the time of publication is 1. + Default value: 1. + + + + + (Required) An array of four numbers in the form coordinate system, giving the + coordinates of the left, bottom, right, and top edges, respectively, of the + form XObject’s bounding box. These boundaries are used to clip the form XObject + and to determine its size for caching. + + + + + (Optional) An array of six numbers specifying the form matrix, which maps + form space into user space. + Default value: the identity matrix [1 0 0 1 0 0]. + + + + + (Optional but strongly recommended; PDF 1.2) A dictionary specifying any + resources (such as fonts and images) required by the form XObject. + + + + + (Optional; PDF 1.4) A group attributes dictionary indicating that the contents + of the form XObject are to be treated as a group and specifying the attributes + of that group (see Section 4.9.2, “Group XObjects”). + Note: If a Ref entry (see below) is present, the group attributes also apply to the + external page imported by that entry, which allows such an imported page to be + treated as a group without further modification. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Contains all external PDF files from which PdfFormXObjects are imported into the current document. + + + + + Initializes a new instance of this class, which is a singleton for each document. + + + + + Gets a PdfFormXObject from an XPdfForm. Because the returned objects must be unique, always + a new instance of PdfFormXObject is created if none exists for the specified form. + + + + + Gets the imported object table. + + + + + Gets the imported object table. + + + + + Map from Selector to PdfImportedObjectTable. + + + + + A collection of information that uniquely identifies a particular ImportedObjectTable. + + + + + Initializes a new instance of FormSelector from an XPdfForm. + + + + + Initializes a new instance of FormSelector from a PdfPage. + + + + + Represents a PDF group XObject. + + + + + Predefined keys of this dictionary. + + + + + (Optional) The type of PDF object that this dictionary describes; + if present, must be Group for a group attributes dictionary. + + + + + (Required) The group subtype, which identifies the type of group whose + attributes this dictionary describes and determines the format and meaning + of the dictionary’s remaining entries. The only group subtype defined in + PDF 1.4 is Transparency. Other group subtypes may be added in the future. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents an image. + + + + + Initializes a new instance of PdfImage from an XImage. + + + + + Gets the underlying XImage object. + + + + + Returns 'Image'. + + + + + Creates the keys for a JPEG image. + + + + + Creates the keys for a FLATE image. + + + + + Reads images that are returned from GDI+ without color palette. + + 4 (32bpp RGB), 3 (24bpp RGB, 32bpp ARGB) + 8 + true (ARGB), false (RGB) + + + + Common keys for all streams. + + + + + (Optional) The type of PDF object that this dictionary describes; + if present, must be XObject for an image XObject. + + + + + (Required) The type of XObject that this dictionary describes; + must be Image for an image XObject. + + + + + (Required) The width of the image, in samples. + + + + + (Required) The height of the image, in samples. + + + + + (Required for images, except those that use the JPXDecode filter; not allowed for image masks) + The color space in which image samples are specified; it can be any type of color space except + Pattern. If the image uses the JPXDecode filter, this entry is optional: + • If ColorSpace is present, any color space specifications in the JPEG2000 data are ignored. + • If ColorSpace is absent, the color space specifications in the JPEG2000 data are used. + The Decode array is also ignored unless ImageMask is true. + + + + + (Required except for image masks and images that use the JPXDecode filter) + The number of bits used to represent each color component. Only a single value may be specified; + the number of bits is the same for all color components. Valid values are 1, 2, 4, 8, and + (in PDF 1.5) 16. If ImageMask is true, this entry is optional, and if specified, its value + must be 1. + If the image stream uses a filter, the value of BitsPerComponent must be consistent with the + size of the data samples that the filter delivers. In particular, a CCITTFaxDecode or JBIG2Decode + filter always delivers 1-bit samples, a RunLengthDecode or DCTDecode filter delivers 8-bit samples, + and an LZWDecode or FlateDecode filter delivers samples of a specified size if a predictor function + is used. + If the image stream uses the JPXDecode filter, this entry is optional and ignored if present. + The bit depth is determined in the process of decoding the JPEG2000 image. + + + + + (Optional; PDF 1.1) The name of a color rendering intent to be used in rendering the image. + Default value: the current rendering intent in the graphics state. + + + + + (Optional) A flag indicating whether the image is to be treated as an image mask. + If this flag is true, the value of BitsPerComponent must be 1 and Mask and ColorSpace should + not be specified; unmasked areas are painted using the current nonstroking color. + Default value: false. + + + + + (Optional except for image masks; not allowed for image masks; PDF 1.3) + An image XObject defining an image mask to be applied to this image, or an array specifying + a range of colors to be applied to it as a color key mask. If ImageMask is true, this entry + must not be present. + + + + + (Optional) An array of numbers describing how to map image samples into the range of values + appropriate for the image’s color space. If ImageMask is true, the array must be either + [0 1] or [1 0]; otherwise, its length must be twice the number of color components required + by ColorSpace. If the image uses the JPXDecode filter and ImageMask is false, Decode is ignored. + Default value: see “Decode Arrays”. + + + + + (Optional) A flag indicating whether image interpolation is to be performed. + Default value: false. + + + + + (Optional; PDF 1.3) An array of alternate image dictionaries for this image. The order of + elements within the array has no significance. This entry may not be present in an image + XObject that is itself an alternate image. + + + + + (Optional; PDF 1.4) A subsidiary image XObject defining a soft-mask image to be used as a + source of mask shape or mask opacity values in the transparent imaging model. The alpha + source parameter in the graphics state determines whether the mask values are interpreted as + shape or opacity. If present, this entry overrides the current soft mask in the graphics state, + as well as the image’s Mask entry, if any. (However, the other transparency related graphics + state parameters — blend mode and alpha constant — remain in effect.) If SMask is absent, the + image has no associated soft mask (although the current soft mask in the graphics state may + still apply). + + + + + (Optional for images that use the JPXDecode filter, meaningless otherwise; PDF 1.5) + A code specifying how soft-mask information encoded with image samples should be used: + 0 If present, encoded soft-mask image information should be ignored. + 1 The image’s data stream includes encoded soft-mask values. An application can create + a soft-mask image from the information to be used as a source of mask shape or mask + opacity in the transparency imaging model. + 2 The image’s data stream includes color channels that have been preblended with a + background; the image data also includes an opacity channel. An application can create + a soft-mask image with a Matte entry from the opacity channel information to be used as + a source of mask shape or mask opacity in the transparency model. If this entry has a + nonzero value, SMask should not be specified. + Default value: 0. + + + + + (Required in PDF 1.0; optional otherwise) The name by which this image XObject is + referenced in the XObject subdictionary of the current resource dictionary. + + + + + (Required if the image is a structural content item; PDF 1.3) The integer key of the + image’s entry in the structural parent tree. + + + + + (Optional; PDF 1.3; indirect reference preferred) The digital identifier of the image’s + parent Web Capture content set. + + + + + (Optional; PDF 1.2) An OPI version dictionary for the image. If ImageMask is true, + this entry is ignored. + + + + + (Optional; PDF 1.4) A metadata stream containing metadata for the image. + + + + + (Optional; PDF 1.5) An optional content group or optional content membership dictionary, + specifying the optional content properties for this image XObject. Before the image is + processed, its visibility is determined based on this entry. If it is determined to be + invisible, the entire image is skipped, as if there were no Do operator to invoke it. + + + + + Counts the consecutive one bits in an image line. + + The reader. + The bits left. + + + + Counts the consecutive zero bits in an image line. + + The reader. + The bits left. + + + + Returns the offset of the next bit in the range + [bitStart..bitEnd] that is different from the + specified color. The end, bitEnd, is returned + if no such bit exists. + + The reader. + The offset of the start bit. + The offset of the end bit. + If set to true searches "one" (i. e. white), otherwise searches black. + The offset of the first non-matching bit. + + + + Returns the offset of the next bit in the range + [bitStart..bitEnd] that is different from the + specified color. The end, bitEnd, is returned + if no such bit exists. + Like FindDifference, but also check the + starting bit against the end in case start > end. + + The reader. + The offset of the start bit. + The offset of the end bit. + If set to true searches "one" (i. e. white), otherwise searches black. + The offset of the first non-matching bit. + + + + 2d-encode a row of pixels. Consult the CCITT documentation for the algorithm. + + The writer. + Offset of image data in bitmap file. + The bitmap file. + Index of the current row. + Index of the reference row (0xffffffff if there is none). + The width of the image. + The height of the image. + The bytes per line in the bitmap file. + + + + Encodes a bitonal bitmap using 1D CCITT fax encoding. + + Space reserved for the fax encoded bitmap. An exception will be thrown if this buffer is too small. + The bitmap to be encoded. + Offset of image data in bitmap file. + The width of the image. + The height of the image. + The size of the fax encoded image (0 on failure). + + + + Encodes a bitonal bitmap using 2D group 4 CCITT fax encoding. + + Space reserved for the fax encoded bitmap. An exception will be thrown if this buffer is too small. + The bitmap to be encoded. + Offset of image data in bitmap file. + The width of the image. + The height of the image. + The size of the fax encoded image (0 on failure). + + + + Writes the image data. + + The writer. + The count of bits (pels) to encode. + The color of the pels. + + + + Helper class for creating bitmap masks (8 pels per byte). + + + + + Returns the bitmap mask that will be written to PDF. + + + + + Creates a bitmap mask. + + + + + Starts a new line. + + + + + Adds a pel to the current line. + + + + + + Adds a pel from an alpha mask value. + + + + + The BitReader class is a helper to read bits from an in-memory bitmap file. + + + + + Initializes a new instance of the class. + + The in-memory bitmap file. + The offset of the line to read. + The count of bits that may be read (i. e. the width of the image for normal usage). + + + + Sets the position within the line (needed for 2D encoding). + + The new position. + + + + Gets a single bit at the specified position. + + The position. + True if bit is set. + + + + Returns the bits that are in the buffer (without changing the position). + Data is MSB aligned. + + The count of bits that were returned (1 through 8). + The MSB aligned bits from the buffer. + + + + Moves the buffer to the next byte. + + + + + "Removes" (eats) bits from the buffer. + + The count of bits that were processed. + + + + A helper class for writing groups of bits into an array of bytes. + + + + + Initializes a new instance of the class. + + The byte array to be written to. + + + + Writes the buffered bits into the byte array. + + + + + Masks for n bits in a byte (with n = 0 through 8). + + + + + Writes bits to the byte array. + + The bits to be written (LSB aligned). + The count of bits. + + + + Writes a line from a look-up table. + A "line" in the table are two integers, one containing the values, one containing the bit count. + + + + + Flushes the buffer and returns the count of bytes written to the array. + + + + + Contains all used images of a document. + + + + + Initializes a new instance of this class, which is a singleton for each document. + + + + + Gets a PdfImage from an XImage. If no PdfImage already exists, a new one is created. + + + + + Map from ImageSelector to PdfImage. + + + + + A collection of information that uniquely identifies a particular PdfImage. + + + + + Initializes a new instance of ImageSelector from an XImage. + + + + + Represents the imported objects of an external document. Used to cache objects that are + already imported when a PdfFormXObject is added to a page. + + + + + Initializes a new instance of this class with the document the objects are imported from. + + + + + Gets the document this table belongs to. + + + + + Gets the external document, or null, if the external document is garbage collected. + + + + + Indicates whether the specified object is already imported. + + + + + Adds a cloned object to this table. + + The object identifier in the foreign object. + The cross reference to the clone of the foreign object, which belongs to + this document. In general the clone has a different object identifier. + + + + Gets the cloned object that corresponds to the specified external identifier. + + + + + Maps external object identifiers to cross reference entries of the importing document + {PdfObjectID -> PdfReference}. + + + + + Provides access to the internal document data structures. This class prevents the public + interfaces from pollution with to much internal functions. + + + + + Gets or sets the first document identifier. + + + + + Gets the first document identifier as GUID. + + + + + Gets or sets the second document identifier. + + + + + Gets the first document identifier as GUID. + + + + + Gets the catalog dictionary. + + + + + Gets the ExtGStateTable object. + + + + + Returns the object with the specified Identifier, or null, if no such object exists. + + + + + Maps the specified external object to the substitute object in this document. + Returns null if no such object exists. + + + + + Returns the PdfReference of the specified object, or null, if the object is not in the + document's object table. + + + + + Gets the object identifier of the specified object. + + + + + Gets the object number of the specified object. + + + + + Gets the generation number of the specified object. + + + + + Gets all indirect objects ordered by their object identifier. + + + + + Gets all indirect objects ordered by their object identifier. + + + + + Creates the indirect object of the specified type, adds it to the document, + and returns the object. + + + + + Adds an object to the PDF document. This operation and only this operation makes the object + an indirect object owned by this document. + + + + + Removes an object from the PDF document. + + + + + Returns an array containing the specified object as first element follows by its transitive + closure. The closure of an object are all objects that can be reached by indirect references. + The transitive closure is the result of applying the calculation of the closure to a closure + as long as no new objects came along. This is e.g. useful for getting all objects belonging + to the resources of a page. + + + + + Returns an array containing the specified object as first element follows by its transitive + closure limited by the specified number of iterations. + + + + + Writes a PdfItem into the specified stream. + + + + + The name of the custom value key. + + + + + Provides access to the internal PDF object data structures. This class prevents the public + interfaces from pollution with to much internal functions. + + + + + Gets the object identifier. Returns PdfObjectID.Empty for direct objects. + + + + + Gets the object number. + + + + + Gets the generation number. + + + + + Gets the name of the current type. + Not a very useful property, but can be used for data binding. + + + + + Represents an object stream that contains compressed objects. + PDF 1.5. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance from an existing dictionary. Used for object type transformation. + + + + + Reads the compressed object with the specified index. + + + + + Reads the compressed object with the specified index. + + + + + N pairs of integers. + The first integer represents the object number of the compressed object. + The second integer represents the absolute offset of that object in the decoded stream, + i.e. the byte offset plus First entry. + + + + + Predefined keys common to all font dictionaries. + + + + + (Required) The type of PDF object that this dictionary describes; + must be ObjStmfor an object stream. + + + + + (Required) The number of compressed objects in the stream. + + + + + (Required) The byte offset (in the decoded stream) of the first + compressed object. + + + + + (Optional) A reference to an object stream, of which the current object + stream is considered an extension. Both streams are considered part of + a collection of object streams (see below). A given collection consists + of a set of streams whose Extendslinks form a directed acyclic graph. + + + + + Represents a PDF page object. + + + + + + + + + + Represents an indirect reference to a PdfObject. + + + + + Initializes a new PdfReference instance for the specified indirect object. + + + + + Initializes a new PdfReference instance from the specified object identifier and file position. + + + + + Writes the object in PDF iref table format. + + + + + Writes an indirect reference. + + + + + Gets or sets the object identifier. + + + + + Gets the object number of the object identifier. + + + + + Gets the generation number of the object identifier. + + + + + Gets or sets the file position of the related PdfObject. + + + + + Gets or sets the referenced PdfObject. + + + + + Hack for dead objects. + + + + + Gets or sets the document this object belongs to. + + + + + Gets a string representing the object identifier. + + + + + Implements a comparer that compares PdfReference objects by their PdfObjectID. + + + + + Base class for all dictionaries that map resource names to objects. + + + + + Adds all imported resource names to the specified hashtable. + + + + + Represents a PDF resource object. + + + + + Initializes a new instance of the class. + + The document. + + + + Adds the specified font to this resource dictionary and returns its local resource name. + + + + + Adds the specified image to this resource dictionary + and returns its local resource name. + + + + + Adds the specified form object to this resource dictionary + and returns its local resource name. + + + + + Adds the specified graphics state to this resource dictionary + and returns its local resource name. + + + + + Adds the specified pattern to this resource dictionary + and returns its local resource name. + + + + + Adds the specified pattern to this resource dictionary + and returns its local resource name. + + + + + Adds the specified shading to this resource dictionary + and returns its local resource name. + + + + + Gets the fonts map. + + + + + Gets the external objects map. + + + + + Gets a new local name for this resource. + + + + + Gets a new local name for this resource. + + + + + Gets a new local name for this resource. + + + + + Gets a new local name for this resource. + + + + + Gets a new local name for this resource. + + + + + Gets a new local name for this resource. + + + + + Check whether a resource name is already used in the context of this resource dictionary. + PDF4NET uses GUIDs as resource names, but I think this weapon is to heavy. + + + + + All the names of imported resources. + + + + + Maps all PDFsharp resources to their local resource names. + + + + + Predefined keys of this dictionary. + + + + + (Optional) A dictionary that maps resource names to graphics state + parameter dictionaries. + + + + + (Optional) A dictionary that maps each resource name to either the name of a + device-dependent color space or an array describing a color space. + + + + + (Optional) A dictionary that maps each resource name to either the name of a + device-dependent color space or an array describing a color space. + + + + + (Optional; PDF 1.3) A dictionary that maps resource names to shading dictionaries. + + + + + (Optional) A dictionary that maps resource names to external objects. + + + + + (Optional) A dictionary that maps resource names to font dictionaries. + + + + + (Optional) An array of predefined procedure set names. + + + + + (Optional; PDF 1.2) A dictionary that maps resource names to property list + dictionaries for marked content. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Base class for FontTable, ImageTable, FormXObjectTable etc. + + + + + Base class for document wide resource tables. + + + + + Gets the owning document of this resource table. + + + + + Represents a shading dictionary. + + + + + Initializes a new instance of the class. + + + + + Setups the shading from the specified brush. + + + + + Common keys for all streams. + + + + + (Required) The shading type: + 1 Function-based shading + 2 Axial shading + 3 Radial shading + 4 Free-form Gouraud-shaded triangle mesh + 5 Lattice-form Gouraud-shaded triangle mesh + 6 Coons patch mesh + 7 Tensor-product patch mesh + + + + + (Required) The color space in which color values are expressed. This may be any device, + CIE-based, or special color space except a Pattern space. + + + + + (Optional) An array of color components appropriate to the color space, specifying + a single background color value. If present, this color is used, before any painting + operation involving the shading, to fill those portions of the area to be painted + that lie outside the bounds of the shading object. In the opaque imaging model, + the effect is as if the painting operation were performed twice: first with the + background color and then with the shading. + + + + + (Optional) An array of four numbers giving the left, bottom, right, and top coordinates, + respectively, of the shading’s bounding box. The coordinates are interpreted in the + shading’s target coordinate space. If present, this bounding box is applied as a temporary + clipping boundary when the shading is painted, in addition to the current clipping path + and any other clipping boundaries in effect at that time. + + + + + (Optional) A flag indicating whether to filter the shading function to prevent aliasing + artifacts. The shading operators sample shading functions at a rate determined by the + resolution of the output device. Aliasing can occur if the function is not smooth—that + is, if it has a high spatial frequency relative to the sampling rate. Anti-aliasing can + be computationally expensive and is usually unnecessary, since most shading functions + are smooth enough or are sampled at a high enough frequency to avoid aliasing effects. + Anti-aliasing may not be implemented on some output devices, in which case this flag + is ignored. + Default value: false. + + + + + (Required) An array of four numbers [x0 y0 x1 y1] specifying the starting and + ending coordinates of the axis, expressed in the shading’s target coordinate space. + + + + + (Optional) An array of two numbers [t0 t1] specifying the limiting values of a + parametric variable t. The variable is considered to vary linearly between these + two values as the color gradient varies between the starting and ending points of + the axis. The variable t becomes the input argument to the color function(s). + Default value: [0.0 1.0]. + + + + + (Required) A 1-in, n-out function or an array of n 1-in, 1-out functions (where n + is the number of color components in the shading dictionary’s color space). The + function(s) are called with values of the parametric variable t in the domain defined + by the Domain entry. Each function’s domain must be a superset of that of the shading + dictionary. If the value returned by the function for a given color component is out + of range, it is adjusted to the nearest valid value. + + + + + (Optional) An array of two boolean values specifying whether to extend the shading + beyond the starting and ending points of the axis, respectively. + Default value: [false false]. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents a shading pattern dictionary. + + + + + Initializes a new instance of the class. + + + + + Setups the shading pattern from the specified brush. + + + + + Common keys for all streams. + + + + + (Optional) The type of PDF object that this dictionary describes; if present, + must be Pattern for a pattern dictionary. + + + + + (Required) A code identifying the type of pattern that this dictionary describes; + must be 2 for a shading pattern. + + + + + (Required) A shading object (see below) defining the shading pattern’s gradient fill. + + + + + (Optional) An array of six numbers specifying the pattern matrix. + Default value: the identity matrix [1 0 0 1 0 0]. + + + + + (Optional) A graphics state parameter dictionary containing graphics state parameters + to be put into effect temporarily while the shading pattern is painted. Any parameters + that are not so specified are inherited from the graphics state that was in effect + at the beginning of the content stream in which the pattern is defined as a resource. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents a PDF soft mask. + + + + + Initializes a new instance of the class. + + The document that owns the object. + + + + Predefined keys of this dictionary. + + + + + (Optional) The type of PDF object that this dictionary describes; + if present, must be Mask for a soft-mask dictionary. + + + + + (Required) A subtype specifying the method to be used in deriving the mask values + from the transparency group specified by the G entry: + Alpha: Use the group’s computed alpha, disregarding its color. + Luminosity: Convert the group’s computed color to a single-component luminosity value. + + + + + (Required) A transparency group XObject to be used as the source of alpha + or color values for deriving the mask. If the subtype S is Luminosity, the + group attributes dictionary must contain a CS entry defining the color space + in which the compositing computation is to be performed. + + + + + (Optional) An array of component values specifying the color to be used + as the backdrop against which to composite the transparency group XObject G. + This entry is consulted only if the subtype S is Luminosity. The array consists of + n numbers, where n is the number of components in the color space specified + by the CS entry in the group attributes dictionary. + Default value: the color space’s initial value, representing black. + + + + + (Optional) A function object specifying the transfer function to be used in + deriving the mask values. The function accepts one input, the computed + group alpha or luminosity (depending on the value of the subtype S), and + returns one output, the resulting mask value. Both the input and output + must be in the range 0.0 to 1.0; if the computed output falls outside this + range, it is forced to the nearest valid value. The name Identity may be + specified in place of a function object to designate the identity function. + Default value: Identity. + + + + + Represents a tiling pattern dictionary. + + + + + Initializes a new instance of the class. + + + + + Common keys for all streams. + + + + + (Optional) The type of PDF object that this dictionary describes; if present, + must be Pattern for a pattern dictionary. + + + + + (Required) A code identifying the type of pattern that this dictionary describes; + must be 1 for a tiling pattern. + + + + + (Required) A code that determines how the color of the pattern cell is to be specified: + 1: Colored tiling pattern. The pattern’s content stream specifies the colors used to + paint the pattern cell. When the content stream begins execution, the current color + is the one that was initially in effect in the pattern’s parent content stream. + 2: Uncolored tiling pattern. The pattern’s content stream does not specify any color + information. Instead, the entire pattern cell is painted with a separately specified color + each time the pattern is used. Essentially, the content stream describes a stencil + through which the current color is to be poured. The content stream must not invoke + operators that specify colors or other color-related parameters in the graphics state; + otherwise, an error occurs. The content stream may paint an image mask, however, + since it does not specify any color information. + + + + + (Required) A code that controls adjustments to the spacing of tiles relative to the device + pixel grid: + 1: Constant spacing. Pattern cells are spaced consistently—that is, by a multiple of a + device pixel. To achieve this, the application may need to distort the pattern cell slightly + by making small adjustments to XStep, YStep, and the transformation matrix. The amount + of distortion does not exceed 1 device pixel. + 2: No distortion. The pattern cell is not distorted, but the spacing between pattern cells + may vary by as much as 1 device pixel, both horizontally and vertically, when the pattern + is painted. This achieves the spacing requested by XStep and YStep on average but not + necessarily for each individual pattern cell. + 3: Constant spacing and faster tiling. Pattern cells are spaced consistently as in tiling + type 1 but with additional distortion permitted to enable a more efficient implementation. + + + + + (Required) An array of four numbers in the pattern coordinate system giving the + coordinates of the left, bottom, right, and top edges, respectively, of the pattern + cell’s bounding box. These boundaries are used to clip the pattern cell. + + + + + (Required) The desired horizontal spacing between pattern cells, measured in the + pattern coordinate system. + + + + + (Required) The desired vertical spacing between pattern cells, measured in the pattern + coordinate system. Note that XStep and YStep may differ from the dimensions of the + pattern cell implied by the BBox entry. This allows tiling with irregularly shaped figures. + XStep and YStep may be either positive or negative but not zero. + + + + + (Required) A resource dictionary containing all of the named resources required by + the pattern’s content stream (see Section 3.7.2, “Resource Dictionaries”). + + + + + (Optional) An array of six numbers specifying the pattern matrix. + Default value: the identity matrix [1 0 0 1 0 0]. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents a ToUnicode map for composite font. + + + + + Gets or sets the CMap info. + + + + + Creates the ToUnicode map from the CMapInfo. + + + + + Represents a PDF trailer dictionary. Even though trailers are dictionaries they never have a cross + reference entry in PdfReferenceTable. + + + + + Initializes a new instance of PdfTrailer. + + + + + Initializes a new instance of the class from a . + + + + + (Required; must be an indirect reference) + The catalog dictionary for the PDF document contained in the file. + + + + + Gets the first or second document identifier. + + + + + Sets the first or second document identifier. + + + + + Creates and sets two identical new document IDs. + + + + + Gets the standard security handler. + + + + + Replace temporary irefs by their correct counterparts from the iref table. + + + + + Predefined keys of this dictionary. + + + + + (Required; must not be an indirect reference) The total number of entries in the file’s + cross-reference table, as defined by the combination of the original section and all + update sections. Equivalently, this value is 1 greater than the highest object number + used in the file. + Note: Any object in a cross-reference section whose number is greater than this value is + ignored and considered missing. + + + + + (Present only if the file has more than one cross-reference section; must not be an indirect + reference) The byte offset from the beginning of the file to the beginning of the previous + cross-reference section. + + + + + (Required; must be an indirect reference) The catalog dictionary for the PDF document + contained in the file. + + + + + (Required if document is encrypted; PDF 1.1) The document’s encryption dictionary. + + + + + (Optional; must be an indirect reference) The document’s information dictionary. + + + + + (Optional, but strongly recommended; PDF 1.1) An array of two strings constituting + a file identifier for the file. Although this entry is optional, + its absence might prevent the file from functioning in some workflows + that depend on files being uniquely identified. + + + + + (Optional) The byte offset from the beginning of the file of a cross-reference stream. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents a PDF transparency group XObject. + + + + + Predefined keys of this dictionary. + + + + + (Sometimes required, as discussed below) + The group color space, which is used for the following purposes: + • As the color space into which colors are converted when painted into the group + • As the blending color space in which objects are composited within the group + • As the color space of the group as a whole when it in turn is painted as an object onto its backdrop + The group color space may be any device or CIE-based color space that + treats its components as independent additive or subtractive values in the + range 0.0 to 1.0, subject to the restrictions described in Section 7.2.3, “Blending Color Space.” + These restrictions exclude Lab and lightness-chromaticity ICCBased color spaces, + as well as the special color spaces Pattern, Indexed, Separation, and DeviceN. + Device color spaces are subject to remapping according to the DefaultGray, + DefaultRGB, and DefaultCMYK entries in the ColorSpace subdictionary of the + current resource dictionary. + Ordinarily, the CS entry is allowed only for isolated transparency groups + (those for which I, below, is true), and even then it is optional. However, + this entry is required in the group attributes dictionary for any transparency + group XObject that has no parent group or page from which to inherit — in + particular, one that is the value of the G entry in a soft-mask dictionary of + subtype Luminosity. + In addition, it is always permissible to specify CS in the group attributes + dictionary associated with a page object, even if I is false or absent. In the + normal case in which the page is imposed directly on the output medium, + the page group is effectively isolated regardless of the I value, and the + specified CS value is therefore honored. But if the page is in turn used as an + element of some other page and if the group is non-isolated, CS is ignored + and the color space is inherited from the actual backdrop with which the + page is composited. + Default value: the color space of the parent group or page into which this + transparency group is painted. (The parent’s color space in turn can be + either explicitly specified or inherited.) + + + + + (Optional) A flag specifying whether the transparency group is isolated. + If this flag is true, objects within the group are composited against a fully + transparent initial backdrop; if false, they are composited against the + group’s backdrop. + Default value: false. + In the group attributes dictionary for a page, the interpretation of this + entry is slightly altered. In the normal case in which the page is imposed + directly on the output medium, the page group is effectively isolated and + the specified I value is ignored. But if the page is in turn used as an + element of some other page, it is treated as if it were a transparency + group XObject; the I value is interpreted in the normal way to determine + whether the page group is isolated. + + + + + (Optional) A flag specifying whether the transparency group is a knockout + group. If this flag is false, later objects within the group are composited + with earlier ones with which they overlap; if true, they are composited with + the group’s initial backdrop and overwrite (“knock out”) any earlier + overlapping objects. + Default value: false. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents a TrueType font. + + + + + Initializes a new instance of PdfTrueTypeFont from an XFont. + + + + + Prepares the object to get saved. + + + + + Predefined keys of this dictionary. + + + + + (Required) The type of PDF object that this dictionary describes; + must be Font for a font dictionary. + + + + + (Required) The type of font; must be TrueType for a TrueType font. + + + + + (Required in PDF 1.0; optional otherwise) The name by which this font is + referenced in the Font subdictionary of the current resource dictionary. + + + + + (Required) The PostScript name of the font. For Type 1 fonts, this is usually + the value of the FontName entry in the font program; for more information. + The Post-Script name of the font can be used to find the font’s definition in + the consumer application or its environment. It is also the name that is used when + printing to a PostScript output device. + + + + + (Required except for the standard 14 fonts) The first character code defined + in the font’s Widths array. + + + + + (Required except for the standard 14 fonts) The last character code defined + in the font’s Widths array. + + + + + (Required except for the standard 14 fonts; indirect reference preferred) + An array of (LastChar - FirstChar + 1) widths, each element being the glyph width + for the character code that equals FirstChar plus the array index. For character + codes outside the range FirstChar to LastChar, the value of MissingWidth from the + FontDescriptor entry for this font is used. The glyph widths are measured in units + in which 1000 units corresponds to 1 unit in text space. These widths must be + consistent with the actual widths given in the font program. + + + + + (Required except for the standard 14 fonts; must be an indirect reference) + A font descriptor describing the font’s metrics other than its glyph widths. + Note: For the standard 14 fonts, the entries FirstChar, LastChar, Widths, and + FontDescriptor must either all be present or all be absent. Ordinarily, they are + absent; specifying them enables a standard font to be overridden. + + + + + (Optional) A specification of the font’s character encoding if different from its + built-in encoding. The value of Encoding is either the name of a predefined + encoding (MacRomanEncoding, MacExpertEncoding, or WinAnsiEncoding, as described in + Appendix D) or an encoding dictionary that specifies differences from the font’s + built-in encoding or from a specified predefined encoding. + + + + + (Optional; PDF 1.2) A stream containing a CMap file that maps character + codes to Unicode values. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents a composite font. Used for Unicode encoding. + + + + + Predefined keys of this dictionary. + + + + + (Required) The type of PDF object that this dictionary describes; + must be Font for a font dictionary. + + + + + (Required) The type of font; must be Type0 for a Type 0 font. + + + + + (Required) The PostScript name of the font. In principle, this is an arbitrary + name, since there is no font program associated directly with a Type 0 font + dictionary. The conventions described here ensure maximum compatibility + with existing Acrobat products. + If the descendant is a Type 0 CIDFont, this name should be the concatenation + of the CIDFont’s BaseFont name, a hyphen, and the CMap name given in the + Encoding entry (or the CMapName entry in the CMap). If the descendant is a + Type 2 CIDFont, this name should be the same as the CIDFont’s BaseFont name. + + + + + (Required) The name of a predefined CMap, or a stream containing a CMap + that maps character codes to font numbers and CIDs. If the descendant is a + Type 2 CIDFont whose associated TrueType font program is not embedded + in the PDF file, the Encoding entry must be a predefined CMap name. + + + + + (Required) A one-element array specifying the CIDFont dictionary that is the + descendant of this Type 0 font. + + + + + ((Optional) A stream containing a CMap file that maps character codes to + Unicode values. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Base class for all PDF external objects. + + + + + Initializes a new instance of the class. + + The document that owns the object. + + + + Predefined keys of this dictionary. + + + + + Specifies the annotation flags. + + + + + If set, do not display the annotation if it does not belong to one of the standard + annotation types and no annotation handler is available. If clear, display such an + unknown annotation using an appearance stream specified by its appearancedictionary, + if any. + + + + + (PDF 1.2) If set, do not display or print the annotation or allow it to interact + with the user, regardless of its annotation type or whether an annotation + handler is available. In cases where screen space is limited, the ability to hide + and show annotations selectively can be used in combination with appearance + streams to display auxiliary pop-up information similar in function to online + help systems. + + + + + (PDF 1.2) If set, print the annotation when the page is printed. If clear, never + print the annotation, regardless of whether it is displayed on the screen. This + can be useful, for example, for annotations representing interactive pushbuttons, + which would serve no meaningful purpose on the printed page. + + + + + (PDF 1.3) If set, do not scale the annotation’s appearance to match the magnification + of the page. The location of the annotation on the page (defined by the + upper-left corner of its annotation rectangle) remains fixed, regardless of the + page magnification. See below for further discussion. + + + + + (PDF 1.3) If set, do not rotate the annotation’s appearance to match the rotation + of the page. The upper-left corner of the annotation rectangle remains in a fixed + location on the page, regardless of the page rotation. See below for further discussion. + + + + + (PDF 1.3) If set, do not display the annotation on the screen or allow it to + interact with the user. The annotation may be printed (depending on the setting + of the Print flag) but should be considered hidden for purposes of on-screen + display and user interaction. + + + + + (PDF 1.3) If set, do not allow the annotation to interact with the user. The + annotation may be displayed or printed (depending on the settings of the + NoView and Print flags) but should not respond to mouse clicks or change its + appearance in response to mouse motions. + Note: This flag is ignored for widget annotations; its function is subsumed by + the ReadOnly flag of the associated form field. + + + + + (PDF 1.4) If set, do not allow the annotation to be deleted or its properties + (including position and size) to be modified by the user. However, this flag does + not restrict changes to the annotation’s contents, such as the value of a form + field. + + + + + (PDF 1.5) If set, invert the interpretation of the NoView flag for certain events. + A typical use is to have an annotation that appears only when a mouse cursor is + held over it. + + + + + Specifies the predefined icon names of rubber stamp annotations. + + + + + A pre-defined rubber stamp annotation icon. + + + + + A pre-defined rubber stamp annotation icon. + + + + + A pre-defined rubber stamp annotation icon. + + + + + A pre-defined rubber stamp annotation icon. + + + + + A pre-defined rubber stamp annotation icon. + + + + + A pre-defined rubber stamp annotation icon. + + + + + A pre-defined rubber stamp annotation icon. + + + + + A pre-defined rubber stamp annotation icon. + + + + + A pre-defined rubber stamp annotation icon. + + + + + A pre-defined rubber stamp annotation icon. + + + + + A pre-defined rubber stamp annotation icon. + + + + + A pre-defined rubber stamp annotation icon. + + + + + A pre-defined rubber stamp annotation icon. + + + + + A pre-defined rubber stamp annotation icon. + + + + + A pre-defined rubber stamp annotation icon. + + + + + Specifies the pre-defined icon names of text annotations. + + + + + A pre-defined annotation icon. + + + + + A pre-defined annotation icon. + + + + + A pre-defined annotation icon. + + + + + A pre-defined annotation icon. + + + + + A pre-defined annotation icon. + + + + + A pre-defined annotation icon. + + + + + A pre-defined annotation icon. + + + + + A pre-defined annotation icon. + + + + + Represents the base class of all annotations. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Removes an annotation from the document + + + + + + Gets or sets the annotation flags of this instance. + + + + + Gets or sets the PdfAnnotations object that this annotation belongs to. + + + + + Gets or sets the annotation rectangle, defining the location of the annotation + on the page in default user space units. + + + + + Gets or sets the text label to be displayed in the title bar of the annotation’s + pop-up window when open and active. By convention, this entry identifies + the user who added the annotation. + + + + + Gets or sets text representing a short description of the subject being + addressed by the annotation. + + + + + Gets or sets the text to be displayed for the annotation or, if this type of + annotation does not display text, an alternate description of the annotation’s + contents in human-readable form. + + + + + Gets or sets the color representing the components of the annotation. If the color + has an alpha value other than 1, it is ignored. Use property Opacity to get or set the + opacity of an annotation. + + + + + Gets or sets the constant opacity value to be used in painting the annotation. + This value applies to all visible elements of the annotation in its closed state + (including its background and border) but not to the popup window that appears when + the annotation is opened. + + + + + Predefined keys of this dictionary. + + + + + (Optional) The type of PDF object that this dictionary describes; if present, + must be Annot for an annotation dictionary. + + + + + (Required) The type of annotation that this dictionary describes. + + + + + (Required) The annotation rectangle, defining the location of the annotation + on the page in default user space units. + + + + + (Optional) Text to be displayed for the annotation or, if this type of annotation + does not display text, an alternate description of the annotation’s contents + in human-readable form. In either case, this text is useful when + extracting the document’s contents in support of accessibility to users with + disabilities or for other purposes. + + + + + (Optional; PDF 1.4) The annotation name, a text string uniquely identifying it + among all the annotations on its page. + + + + + (Optional; PDF 1.1) The date and time when the annotation was most recently + modified. The preferred format is a date string, but viewer applications should be + prepared to accept and display a string in any format. + + + + + (Optional; PDF 1.1) A set of flags specifying various characteristics of the annotation. + Default value: 0. + + + + + (Optional; PDF 1.2) A border style dictionary specifying the characteristics of + the annotation’s border. + + + + + (Optional; PDF 1.2) An appearance dictionary specifying how the annotation + is presented visually on the page. Individual annotation handlers may ignore + this entry and provide their own appearances. + + + + + (Required if the appearance dictionary AP contains one or more subdictionaries; PDF 1.2) + The annotation’s appearance state, which selects the applicable appearance stream from + an appearance subdictionary. + + + + + (Optional) An array specifying the characteristics of the annotation’s border. + The border is specified as a rounded rectangle. + In PDF 1.0, the array consists of three numbers defining the horizontal corner + radius, vertical corner radius, and border width, all in default user space units. + If the corner radii are 0, the border has square (not rounded) corners; if the border + width is 0, no border is drawn. + In PDF 1.1, the array may have a fourth element, an optional dash array defining a + pattern of dashes and gaps to be used in drawing the border. The dash array is + specified in the same format as in the line dash pattern parameter of the graphics state. + For example, a Border value of [0 0 1 [3 2]] specifies a border 1 unit wide, with + square corners, drawn with 3-unit dashes alternating with 2-unit gaps. Note that no + dash phase is specified; the phase is assumed to be 0. + Note: In PDF 1.2 or later, this entry may be ignored in favor of the BS entry. + + + + + (Optional; PDF 1.1) An array of three numbers in the range 0.0 to 1.0, representing + the components of a color in the DeviceRGB color space. This color is used for the + following purposes: + • The background of the annotation’s icon when closed + • The title bar of the annotation’s pop-up window + • The border of a link annotation + + + + + (Required if the annotation is a structural content item; PDF 1.3) + The integer key of the annotation’s entry in the structural parent tree. + + + + + (Optional; PDF 1.1) An action to be performed when the annotation is activated. + Note: This entry is not permitted in link annotations if a Dest entry is present. + Also note that the A entry in movie annotations has a different meaning. + + + + + (Optional; PDF 1.1) The text label to be displayed in the title bar of the annotation’s + pop-up window when open and active. By convention, this entry identifies + the user who added the annotation. + + + + + (Optional; PDF 1.3) An indirect reference to a pop-up annotation for entering or + editing the text associated with this annotation. + + + + + (Optional; PDF 1.4) The constant opacity value to be used in painting the annotation. + This value applies to all visible elements of the annotation in its closed state + (including its background and border) but not to the popup window that appears when + the annotation is opened. + The specified value is not used if the annotation has an appearance stream; in that + case, the appearance stream must specify any transparency. (However, if the viewer + regenerates the annotation’s appearance stream, it may incorporate the CA value + into the stream’s content.) + The implicit blend mode is Normal. + Default value: 1.0. + + + + + (Optional; PDF 1.5) Text representing a short description of the subject being + addressed by the annotation. + + + + + Represents the annotations array of a page. + + + + + Adds the specified annotation. + + The annotation. + + + + Removes an annotation from the document. + + + + + Removes all the annotations from the current page. + + + + + Gets the number of annotations in this collection. + + + + + Gets the at the specified index. + + + + + Gets the page the annotations belongs to. + + + + + Fixes the /P element in imported annotation. + + + + + Returns an enumerator that iterates through a collection. + + + + + Represents a generic annotation. Used for annotation dictionaries unknown to PDFsharp. + + + + + Predefined keys of this dictionary. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents a link annotation. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Creates a link within the current document. + + The link area in default page coordinates. + The one-based destination page number. + + + + Creates a link to the web. + + + + + Creates a link to a file. + + + + + Predefined keys of this dictionary. + + + + + (Optional; not permitted if an A entry is present) A destination to be displayed + when the annotation is activated. + + + + + (Optional; PDF 1.2) The annotation’s highlighting mode, the visual effect to be + used when the mouse button is pressed or held down inside its active area: + N (None) No highlighting. + I (Invert) Invert the contents of the annotation rectangle. + O (Outline) Invert the annotation’s border. + P (Push) Display the annotation as if it were being pushed below the surface of the page. + Default value: I. + Note: In PDF 1.1, highlighting is always done by inverting colors inside the annotation rectangle. + + + + + (Optional; PDF 1.3) A URI action formerly associated with this annotation. When Web + Capture changes and annotation from a URI to a go-to action, it uses this entry to save + the data from the original URI action so that it can be changed back in case the target page for + the go-to action is subsequently deleted. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents a rubber stamp annotation. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The document. + + + + Gets or sets an icon to be used in displaying the annotation. + + + + + Predefined keys of this dictionary. + + + + + (Optional) The name of an icon to be used in displaying the annotation. Viewer + applications should provide predefined icon appearances for at least the following + standard names: + Approved + AsIs + Confidential + Departmental + Draft + Experimental + Expired + Final + ForComment + ForPublicRelease + NotApproved + NotForPublicRelease + Sold + TopSecret + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents a text annotation. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a flag indicating whether the annotation should initially be displayed open. + + + + + Gets or sets an icon to be used in displaying the annotation. + + + + + Predefined keys of this dictionary. + + + + + (Optional) A flag specifying whether the annotation should initially be displayed open. + Default value: false (closed). + + + + + (Optional) The name of an icon to be used in displaying the annotation. Viewer + applications should provide predefined icon appearances for at least the following + standard names: + Comment + Help + Insert + Key + NewParagraph + Note + Paragraph + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents a text annotation. + + + + + Predefined keys of this dictionary. + + + + + (Optional) The annotation’s highlighting mode, the visual effect to be used when + the mouse button is pressed or held down inside its active area: + N (None) No highlighting. + I (Invert) Invert the contents of the annotation rectangle. + O (Outline) Invert the annotation’s border. + P (Push) Display the annotation’s down appearance, if any. If no down appearance is defined, + offset the contents of the annotation rectangle to appear as if it were being pushed below + the surface of the page. + T (Toggle) Same as P (which is preferred). + A highlighting mode other than P overrides any down appearance defined for the annotation. + Default value: I. + + + + + (Optional) An appearance characteristics dictionary to be used in constructing a dynamic + appearance stream specifying the annotation’s visual presentation on the page. + The name MK for this entry is of historical significance only and has no direct meaning. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Base class for all PDF content stream objects. + + + + + Initializes a new instance of the class. + + + + + Creates a new object that is a copy of the current instance. + + + + + Creates a new object that is a copy of the current instance. + + + + + Implements the copy mechanism. Must be overridden in derived classes. + + + + + + + + + + Represents a comment in a PDF content stream. + + + + + Creates a new object that is a copy of the current instance. + + + + + Implements the copy mechanism of this class. + + + + + Gets or sets the comment text. + + + + + Returns a string that represents the current comment. + + + + + Represents a sequence of objects in a PDF content stream. + + + + + Creates a new object that is a copy of the current instance. + + + + + Implements the copy mechanism of this class. + + + + + Adds the specified sequence. + + The sequence. + + + + Adds the specified value add the end of the sequence. + + + + + Removes all elements from the sequence. + + + + + Determines whether the specified value is in the sequence. + + + + + Returns the index of the specified value in the sequence or -1, if no such value is in the sequence. + + + + + Inserts the specified value in the sequence. + + + + + Removes the specified value from the sequence. + + + + + Removes the value at the specified index from the sequence. + + + + + Gets or sets a CObject at the specified index. + + + + + + Copies the elements of the sequence to the specified array. + + + + + Gets the number of elements contained in the sequence. + + + + + Returns an enumerator that iterates through the sequence. + + + + + Converts the sequence to a PDF content stream. + + + + + Returns a string containing all elements of the sequence. + + + + + Represents the base class for numerical objects in a PDF content stream. + + + + + Creates a new object that is a copy of the current instance. + + + + + Implements the copy mechanism of this class. + + + + + Represents an integer value in a PDF content stream. + + + + + Creates a new object that is a copy of the current instance. + + + + + Implements the copy mechanism of this class. + + + + + Gets or sets the value. + + + + + Returns a string that represents the current value. + + + + + Represents a real value in a PDF content stream. + + + + + Creates a new object that is a copy of the current instance. + + + + + Implements the copy mechanism of this class. + + + + + Gets or sets the value. + + + + + Returns a string that represents the current value. + + + + + Type of the parsed string. + + + + + The string has the format "(...)". + + + + + The string has the format "<...>". + + + + + The string... TODO. + + + + + The string... TODO. + + + + + HACK: The string is the content of a dictionary. + Currently there is no parser for dictionaries in Content Streams. + + + + + Represents a string value in a PDF content stream. + + + + + Creates a new object that is a copy of the current instance. + + + + + Implements the copy mechanism of this class. + + + + + Gets or sets the value. + + + + + Gets or sets the type of the content string. + + + + + Returns a string that represents the current value. + + + + + Represents a name in a PDF content stream. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The name. + + + + Creates a new object that is a copy of the current instance. + + + + + Implements the copy mechanism of this class. + + + + + Gets or sets the name. Names must start with a slash. + + + + + Returns a string that represents the current value. + + + + + Represents an array of objects in a PDF content stream. + + + + + Creates a new object that is a copy of the current instance. + + + + + Implements the copy mechanism of this class. + + + + + Returns a string that represents the current value. + + + + + Represents an operator a PDF content stream. + + + + + Initializes a new instance of the class. + + + + + Creates a new object that is a copy of the current instance. + + + + + Implements the copy mechanism of this class. + + + + + Gets or sets the name of the operator + + The name. + + + + Gets or sets the operands. + + The operands. + + + + Gets the operator description for this instance. + + + + + Returns a string that represents the current operator. + + + + + Specifies the group of operations the op-code belongs to. + + + + + + + + + + + + + + + The names of the op-codes. + + + + + Close, fill, and stroke path using nonzero winding number rule. + + + + + Fill and stroke path using nonzero winding number rule. + + + + + Close, fill, and stroke path using even-odd rule. + + + + + Fill and stroke path using even-odd rule. + + + + + (PDF 1.2) Begin marked-content sequence with property list. + + + + + Begin inline image object. + + + + + (PDF 1.2) Begin marked-content sequence. + + + + + Begin text object. + + + + + (PDF 1.1) Begin compatibility section. + + + + + (PDF 1.2) Define marked-content point with property list. + + + + + (PDF 1.2) End marked-content sequence. + + + + + (PDF 1.1) End compatibility section. + + + + + (PDF 1.2) Define marked-content point + + + + + Move to next line and show text. + + + + + Set word and character spacing, move to next line, and show text. + + + + + Represents a PDF content stream operator description. + + + + + Initializes a new instance of the class. + + The name. + The enum value of the operator. + The number of operands. + The postscript equivalent, or null, if no such operation exists. + The flags. + The description from Adobe PDF Reference. + + + + The name of the operator. + + + + + The enum value of the operator. + + + + + The number of operands. -1 indicates a variable number of operands. + + + + + The flags. + + + + + The postscript equivalent, or null, if no such operation exists. + + + + + The description from Adobe PDF Reference. + + + + + Static class with all PDF op-codes. + + + + + Operators from name. + + The name. + + + + Initializes the class. + + + + + Array of all OpCodes. + + + + + Character table by name. Same as PdfSharp.Pdf.IO.Chars. Not yet clear if necessary. + + + + + Lexical analyzer for PDF content files. Adobe specifies no grammar, but it seems that it + is a simple post-fix notation. + + + + + Initializes a new instance of the Lexer class. + + + + + Initializes a new instance of the Lexer class. + + + + + Reads the next token and returns its type. + + + + + Scans a comment line. (Not yet used, comments are skipped by lexer.) + + + + + Scans the bytes of an inline image. + NYI: Just scans over it. + + + + + Scans a name. + + + + + Scans an integer or real number. + + + + + Scans an operator. + + + + + Move current position one character further in content stream. + + + + + Resets the current token to the empty string. + + + + + Appends current character to the token and reads next one. + + + + + If the current character is not a white space, the function immediately returns it. + Otherwise the PDF cursor is moved forward to the first non-white space or EOF. + White spaces are NUL, HT, LF, FF, CR, and SP. + + + + + Gets or sets the current symbol. + + + + + Gets the current token. + + + + + Interprets current token as integer literal. + + + + + Interpret current token as real or integer literal. + + + + + Indicates whether the specified character is a content stream white-space character. + + + + + Indicates whether the specified character is an content operator character. + + + + + Indicates whether the specified character is a PDF delimiter character. + + + + + Gets the length of the content. + + + + + Represents the functionality for reading PDF content streams. + + + + + Reads the content stream(s) of the specified page. + + The page. + + + + Reads the specified content. + + The content. + + + + Reads the specified content. + + The content. + + + + Exception thrown by ContentReader. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + The inner exception. + + + + Represents a writer for generation of PDF streams. + + + + + Writes the specified value to the PDF stream. + + + + + Gets or sets the indentation for a new indentation level. + + + + + Increases indent level. + + + + + Decreases indent level. + + + + + Gets an indent string of current indent. + + + + + Gets the underlying stream. + + + + + Provides the functionality to parse PDF content streams. + + + + + Parses whatever comes until the specified stop symbol is reached. + + + + + Reads the next symbol that must be the specified one. + + + + + Terminal symbols recognized by PDF content stream lexer. + + + + + Implements the ASCII85Decode filter. + + + + + Encodes the specified data. + + + + + Decodes the specified data. + + + + + Implements the ASCIIHexDecode filter. + + + + + Encodes the specified data. + + + + + Decodes the specified data. + + + + + Reserved for future extension. + + + + + Base class for all stream filters + + + + + When implemented in a derived class encodes the specified data. + + + + + Encodes a raw string. + + + + + When implemented in a derived class decodes the specified data. + + + + + Decodes the specified data. + + + + + Decodes to a raw string. + + + + + Decodes to a raw string. + + + + + Removes all white spaces from the data. The function assumes that the bytes are characters. + + + + + Applies standard filters to streams. + + + + + Gets the filter specified by the case sensitive name. + + + + + Gets the filter singleton. + + + + + Gets the filter singleton. + + + + + Gets the filter singleton. + + + + + Gets the filter singleton. + + + + + Encodes the data with the specified filter. + + + + + Encodes a raw string with the specified filter. + + + + + Decodes the data with the specified filter. + + + + + Decodes the data with the specified filter. + + + + + Decodes the data with the specified filter. + + + + + Decodes to a raw string with the specified filter. + + + + + Decodes to a raw string with the specified filter. + + + + + Implements the FlateDecode filter by wrapping SharpZipLib. + + + + + Encodes the specified data. + + + + + Encodes the specified data. + + + + + Decodes the specified data. + + + + + Implements the LzwDecode filter. + + + + + Throws a NotImplementedException because the obsolete LZW encoding is not supported by PDFsharp. + + + + + Decodes the specified data. + + + + + Initialize the dictionary. + + + + + Add a new entry to the Dictionary. + + + + + Returns the next set of bits. + + + + + An encoder for PDF AnsiEncoding. + + + + + Gets the byte count. + + + + + Gets the bytes. + + + + + Gets the character count. + + + + + Gets the chars. + + + + + When overridden in a derived class, calculates the maximum number of bytes produced by encoding the specified number of characters. + + The number of characters to encode. + + The maximum number of bytes produced by encoding the specified number of characters. + + + + + When overridden in a derived class, calculates the maximum number of characters produced by decoding the specified number of bytes. + + The number of bytes to decode. + + The maximum number of characters produced by decoding the specified number of bytes. + + + + + Indicates whether the specified Unicode character is available in the ANSI code page 1252. + + + + + Maps Unicode to ANSI code page 1252. + + + + + Maps WinAnsi to Unicode characters. + + + + + Helper functions for RGB and CMYK colors. + + + + + Checks whether a color mode and a color match. + + + + + Checks whether the color mode of a document and a color match. + + + + + Determines whether two colors are equal referring to their CMYK color values. + + + + + An encoder for PDF DocEncoding. + + + + + Converts WinAnsi to DocEncode characters. Based upon PDF Reference 1.6. + + + + + Groups a set of static encoding helper functions. + + + + + Gets the raw encoding. + + + + + Gets the raw Unicode encoding. + + + + + Gets the Windows 1252 (ANSI) encoding. + + + + + Gets the PDF DocEncoding encoding. + + + + + Gets the UNICODE little-endian encoding. + + + + + Converts a raw string into a raw string literal, possibly encrypted. + + + + + Converts a raw string into a raw string literal, possibly encrypted. + + + + + Converts a raw string into a raw hexadecimal string literal, possibly encrypted. + + + + + Converts a raw string into a raw hexadecimal string literal, possibly encrypted. + + + + + Converts the specified byte array into a byte array representing a string literal. + + The bytes of the string. + Indicates whether one or two bytes are one character. + Indicates whether to use Unicode prefix. + Indicates whether to create a hexadecimal string literal. + Encrypts the bytes if specified. + The PDF bytes. + + + + Converts WinAnsi to DocEncode characters. Incomplete, just maps € and some other characters. + + + + + ...because I always forget CultureInfo.InvariantCulture and wonder why Acrobat + cannot understand my German decimal separator... + + + + + Converts a float into a string with up to 3 decimal digits and a decimal point. + + + + + Converts an XColor into a string with up to 3 decimal digits and a decimal point. + + + + + Converts an XMatrix into a string with up to 4 decimal digits and a decimal point. + + + + + An encoder for raw strings. The raw encoding is simply the identity relation between + characters and bytes. PDFsharp internally works with raw encoded strings instead of + byte arrays because strings are much more handy than byte arrays. + + + Raw encoded strings represent an array of bytes. Therefore a character greater than + 255 is not valid in a raw encoded string. + + + + + Initializes a new instance of the class. + + + + + When overridden in a derived class, calculates the number of bytes produced by encoding a set of characters from the specified character array. + + The character array containing the set of characters to encode. + The index of the first character to encode. + The number of characters to encode. + + The number of bytes produced by encoding the specified characters. + + + + + When overridden in a derived class, encodes a set of characters from the specified character array into the specified byte array. + + The character array containing the set of characters to encode. + The index of the first character to encode. + The number of characters to encode. + The byte array to contain the resulting sequence of bytes. + The index at which to start writing the resulting sequence of bytes. + + The actual number of bytes written into . + + + + + When overridden in a derived class, calculates the number of characters produced by decoding a sequence of bytes from the specified byte array. + + The byte array containing the sequence of bytes to decode. + The index of the first byte to decode. + The number of bytes to decode. + + The number of characters produced by decoding the specified sequence of bytes. + + + + + When overridden in a derived class, decodes a sequence of bytes from the specified byte array into the specified character array. + + The byte array containing the sequence of bytes to decode. + The index of the first byte to decode. + The number of bytes to decode. + The character array to contain the resulting set of characters. + The index at which to start writing the resulting set of characters. + + The actual number of characters written into . + + + + + When overridden in a derived class, calculates the maximum number of bytes produced by encoding the specified number of characters. + + The number of characters to encode. + + The maximum number of bytes produced by encoding the specified number of characters. + + + + + When overridden in a derived class, calculates the maximum number of characters produced by decoding the specified number of bytes. + + The number of bytes to decode. + + The maximum number of characters produced by decoding the specified number of bytes. + + + + + An encoder for Unicode strings. + (That means, a character represents a glyph index.) + + + + + Provides a thread-local cache for large objects. + + + + + Maps path to document handle. + + + + + Character table by name. + + + + + The EOF marker. + + + + + The null byte. + + + + + The carriage return character (ignored by lexer). + + + + + The line feed character. + + + + + The bell character. + + + + + The backspace character. + + + + + The form feed character. + + + + + The horizontal tab character. + + + + + The vertical tab character. + + + + + The non-breakable space character (aka no-break space or non-breaking space). + + + + + The space character. + + + + + The double quote character. + + + + + The single quote character. + + + + + The left parenthesis. + + + + + The right parenthesis. + + + + + The left brace. + + + + + The right brace. + + + + + The left bracket. + + + + + The right bracket. + + + + + The less-than sign. + + + + + The greater-than sign. + + + + + The equal sign. + + + + + The period. + + + + + The semicolon. + + + + + The colon. + + + + + The slash. + + + + + The bar character. + + + + + The back slash. + + + + + The percent sign. + + + + + The dollar sign. + + + + + The at sign. + + + + + The number sign. + + + + + The question mark. + + + + + The hyphen. + + + + + The soft hyphen. + + + + + The currency sign. + + + + + Determines the type of the password. + + + + + Password is neither user nor owner password. + + + + + Password is user password. + + + + + Password is owner password. + + + + + Determines how a PDF document is opened. + + + + + The PDF stream is completely read into memory and can be modified. Pages can be deleted or + inserted, but it is not possible to extract pages. This mode is useful for modifying an + existing PDF document. + + + + + The PDF stream is opened for importing pages from it. A document opened in this mode cannot + be modified. + + + + + The PDF stream is completely read into memory, but cannot be modified. This mode preserves the + original internal structure of the document and is useful for analyzing existing PDF files. + + + + + The PDF stream is partially read for information purposes only. The only valid operation is to + call the Info property at the imported document. This option is very fast and needs less memory + and is e.g. useful for browsing information about a collection of PDF documents in a user interface. + + + + + Determines how the PDF output stream is formatted. Even all formats create valid PDF files, + only Compact or Standard should be used for production purposes. + + + + + The PDF stream contains no unnecessary characters. This is default in release build. + + + + + The PDF stream contains some superfluous line feeds, but is more readable. + + + + + The PDF stream is indented to reflect the nesting levels of the objects. This is useful + for analyzing PDF files, but increases the size of the file significantly. + + + + + The PDF stream is indented to reflect the nesting levels of the objects and contains additional + information about the PDFsharp objects. Furthermore content streams are not deflated. This + is useful for debugging purposes only and increases the size of the file significantly. + + + + + INTERNAL USE ONLY. + + + + + If only this flag is specified the result is a regular valid PDF stream. + + + + + Omit writing stream data. For debugging purposes only. + With this option the result is not valid PDF. + + + + + Omit inflate filter. For debugging purposes only. + + + + + Terminal symbols recognized by lexer. + + + + + Lexical analyzer for PDF files. Technically a PDF file is a stream of bytes. Some chunks + of bytes represent strings in several encodings. The actual encoding depends on the + context where the string is used. Therefore the bytes are 'raw encoded' into characters, + i.e. a character or token read by the lexer has always character values in the range from + 0 to 255. + + + + + Initializes a new instance of the Lexer class. + + + + + Gets or sets the position within the PDF stream. + + + + + Reads the next token and returns its type. If the token starts with a digit, the parameter + testReference specifies how to treat it. If it is false, the lexer scans for a single integer. + If it is true, the lexer checks if the digit is the prefix of a reference. If it is a reference, + the token is set to the object ID followed by the generation number separated by a blank + (the 'R' is omitted from the token). + + + + + Reads the raw content of a stream. + + + + + Reads a string in raw encoding. + + + + + Scans a comment line. + + + + + Scans a name. + + + + + Scans a number. + + + + + Scans a keyword. + + + + + Scans a literal string, contained between "(" and ")". + + + + + Move current position one character further in PDF stream. + + + + + Appends current character to the token and reads next one. + + + + + If the current character is not a white space, the function immediately returns it. + Otherwise the PDF cursor is moved forward to the first non-white space or EOF. + White spaces are NUL, HT, LF, FF, CR, and SP. + + + + + Gets the current symbol. + + + + + Gets the current token. + + + + + Interprets current token as boolean literal. + + + + + Interprets current token as integer literal. + + + + + Interprets current token as unsigned integer literal. + + + + + Interprets current token as real or integer literal. + + + + + Interprets current token as object ID. + + + + + Indicates whether the specified character is a PDF white-space character. + + + + + Indicates whether the specified character is a PDF delimiter character. + + + + + Gets the length of the PDF output. + + + + + Provides the functionality to parse PDF documents. + + + + + Sets PDF input stream position to the specified object. + + + + + Reads PDF object from input stream. + + Either the instance of a derived type or null. If it is null + an appropriate object is created. + The address of the object. + If true, specifies that all indirect objects + are included recursively. + If true, the objects is parsed from an object stream. + + + + Reads the stream of a dictionary. + + + + + Parses whatever comes until the specified stop symbol is reached. + + + + + Reads the object ID and the generation and sets it into the specified object. + + + + + Reads the next symbol that must be the specified one. + + + + + Reads the next token that must be the specified one. + + + + + Reads a name from the PDF data stream. The preceding slash is part of the result string. + + + + + Reads an integer value directly from the PDF data stream. + + + + + Reads an object from the PDF input stream using the default parser. + + + + + Reads the irefs from the compressed object with the specified index in the object stream + of the object with the specified object id. + + + + + Reads the compressed object with the specified index in the object stream + of the object with the specified object id. + + + + + Reads the compressed object with the specified number at the given offset. + The parser must be initialized with the stream an object stream object. + + + + + Reads the object stream header as pairs of integers from the beginning of the + stream of an object stream. Parameter first is the value of the First entry of + the object stream object. + + + + + Reads the cross-reference table(s) and their trailer dictionary or + cross-reference streams. + + + + + Reads cross reference table(s) and trailer(s). + + + + + Checks the x reference table entry. Returns true if everything is correct. + Return false if the keyword "obj" was found, but ID or Generation are incorrect. + Throws an exception otherwise. + + The position where the object is supposed to be. + The ID from the XRef table. + The generation from the XRef table. + The identifier found in the PDF file. + The generation found in the PDF file. + + + + + Reads cross reference stream(s). + + + + + Parses a PDF date string. + + + + + Encapsulates the arguments of the PdfPasswordProvider delegate. + + + + + Sets the password to open the document with. + + + + + When set to true the PdfReader.Open function returns null indicating that no PdfDocument was created. + + + + + A delegated used by the PdfReader.Open function to retrieve a password if the document is protected. + + + + + Represents the functionality for reading PDF documents. + + + + + Determines whether the file specified by its path is a PDF file by inspecting the first eight + bytes of the data. If the file header has the form «%PDF-x.y» the function returns the version + number as integer (e.g. 14 for PDF 1.4). If the file header is invalid or inaccessible + for any reason, 0 is returned. The function never throws an exception. + + + + + Determines whether the specified stream is a PDF file by inspecting the first eight + bytes of the data. If the data begins with «%PDF-x.y» the function returns the version + number as integer (e.g. 14 for PDF 1.4). If the data is invalid or inaccessible + for any reason, 0 is returned. The function never throws an exception. + + + + + Determines whether the specified data is a PDF file by inspecting the first eight + bytes of the data. If the data begins with «%PDF-x.y» the function returns the version + number as integer (e.g. 14 for PDF 1.4). If the data is invalid or inaccessible + for any reason, 0 is returned. The function never throws an exception. + + + + + Implements scanning the PDF file version. + + + + + Opens an existing PDF document. + + + + + Opens an existing PDF document. + + + + + Opens an existing PDF document. + + + + + Opens an existing PDF document. + + + + + Opens an existing PDF document. + + + + + Opens an existing PDF document. + + + + + Opens an existing PDF document. + + + + + Opens an existing PDF document. + + + + + Opens an existing PDF document. + + + + + Opens an existing PDF document. + + + + + Opens an existing PDF document. + + + + + Exception thrown by PdfReader. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + The inner exception. + + + + Represents a writer for generation of PDF streams. + + + + + Gets or sets the kind of layout. + + + + + Writes the specified value to the PDF stream. + + + + + Writes the specified value to the PDF stream. + + + + + Writes the specified value to the PDF stream. + + + + + Writes the specified value to the PDF stream. + + + + + Writes the specified value to the PDF stream. + + + + + Writes the specified value to the PDF stream. + + + + + Writes the specified value to the PDF stream. + + + + + Writes the specified value to the PDF stream. + + + + + Writes the specified value to the PDF stream. + + + + + Writes the specified value to the PDF stream. + + + + + Begins a direct or indirect dictionary or array. + + + + + Ends a direct or indirect dictionary or array. + + + + + Writes the stream of the specified dictionary. + + + + + Gets or sets the indentation for a new indentation level. + + + + + Increases indent level. + + + + + Decreases indent level. + + + + + Gets an indent string of current indent. + + + + + Gets the underlying stream. + + + + + Represents the stack for the shift-reduce parser. It seems that it is only needed for + reduction of indirect references. + + + + + Gets the stack pointer index. + + + + + Gets the value at the specified index. Valid index is in range 0 up to sp-1. + + + + + Gets an item relative to the current stack pointer. The index must be a negative value (-1, -2, etc.). + + + + + Gets an item relative to the current stack pointer. The index must be a negative value (-1, -2, etc.). + + + + + Pushes the specified item onto the stack. + + + + + Replaces the last 'count' items with the specified item. + + + + + Replaces the last 'count' items with the specified item. + + + + + The stack pointer index. Points to the next free item. + + + + + An array representing the stack. + + + + + Specifies the security level of the PDF document. + + + + + Document is not protected. + + + + + Document is protected with 40-bit security. This option is for compatibility with + Acrobat 3 and 4 only. Use Encrypted128Bit whenever possible. + + + + + Document is protected with 128-bit security. + + + + + Specifies which operations are permitted when the document is opened with user access. + + + + + Permits everything. This is the default value. + + + + + Represents the base of all security handlers. + + + + + Predefined keys of this dictionary. + + + + + (Required) The name of the preferred security handler for this document. Typically, + it is the name of the security handler that was used to encrypt the document. If + SubFilter is not present, only this security handler should be used when opening + the document. If it is present, consumer applications can use any security handler + that implements the format specified by SubFilter. + Standard is the name of the built-in password-based security handler. Names for other + security handlers can be registered by using the procedure described in Appendix E. + + + + + (Optional; PDF 1.3) A name that completely specifies the format and interpretation of + the contents of the encryption dictionary. It is needed to allow security handlers other + than the one specified by Filter to decrypt the document. If this entry is absent, other + security handlers should not be allowed to decrypt the document. + + + + + (Optional but strongly recommended) A code specifying the algorithm to be used in encrypting + and decrypting the document: + 0 An algorithm that is undocumented and no longer supported, and whose use is strongly discouraged. + 1 Algorithm 3.1, with an encryption key length of 40 bits. + 2 (PDF 1.4) Algorithm 3.1, but permitting encryption key lengths greater than 40 bits. + 3 (PDF 1.4) An unpublished algorithm that permits encryption key lengths ranging from 40 to 128 bits. + 4 (PDF 1.5) The security handler defines the use of encryption and decryption in the document, using + the rules specified by the CF, StmF, and StrF entries. + The default value if this entry is omitted is 0, but a value of 1 or greater is strongly recommended. + + + + + (Optional; PDF 1.4; only if V is 2 or 3) The length of the encryption key, in bits. + The value must be a multiple of 8, in the range 40 to 128. Default value: 40. + + + + + (Optional; meaningful only when the value of V is 4; PDF 1.5) + A dictionary whose keys are crypt filter names and whose values are the corresponding + crypt filter dictionaries. Every crypt filter used in the document must have an entry + in this dictionary, except for the standard crypt filter names. + + + + + (Optional; meaningful only when the value of V is 4; PDF 1.5) + The name of the crypt filter that is used by default when decrypting streams. + The name must be a key in the CF dictionary or a standard crypt filter name. All streams + in the document, except for cross-reference streams or streams that have a Crypt entry in + their Filter array, are decrypted by the security handler, using this crypt filter. + Default value: Identity. + + + + + (Optional; meaningful only when the value of V is 4; PDF 1.) + The name of the crypt filter that is used when decrypting all strings in the document. + The name must be a key in the CF dictionary or a standard crypt filter name. + Default value: Identity. + + + + + (Optional; meaningful only when the value of V is 4; PDF 1.6) + The name of the crypt filter that should be used by default when encrypting embedded + file streams; it must correspond to a key in the CF dictionary or a standard crypt + filter name. This entry is provided by the security handler. Applications should respect + this value when encrypting embedded files, except for embedded file streams that have + their own crypt filter specifier. If this entry is not present, and the embedded file + stream does not contain a crypt filter specifier, the stream should be encrypted using + the default stream crypt filter specified by StmF. + + + + + Encapsulates access to the security settings of a PDF document. + + + + + Indicates whether the granted access to the document is 'owner permission'. Returns true if the document + is unprotected or was opened with the owner password. Returns false if the document was opened with the + user password. + + + + + Gets or sets the document security level. If you set the security level to anything but PdfDocumentSecurityLevel.None + you must also set a user and/or an owner password. Otherwise saving the document will fail. + + + + + Sets the user password of the document. Setting a password automatically sets the + PdfDocumentSecurityLevel to PdfDocumentSecurityLevel.Encrypted128Bit if its current + value is PdfDocumentSecurityLevel.None. + + + + + Sets the owner password of the document. Setting a password automatically sets the + PdfDocumentSecurityLevel to PdfDocumentSecurityLevel.Encrypted128Bit if its current + value is PdfDocumentSecurityLevel.None. + + + + + Determines whether the document can be saved. + + + + + Permits printing the document. Should be used in conjunction with PermitFullQualityPrint. + + + + + Permits modifying the document. + + + + + Permits content copying or extraction. + + + + + Permits commenting the document. + + + + + Permits filling of form fields. + + + + + Permits content extraction for accessibility. + + + + + Permits to insert, rotate, or delete pages and create bookmarks or thumbnail images even if + PermitModifyDocument is not set. + + + + + Permits to print in high quality. insert, rotate, or delete pages and create bookmarks or thumbnail images + even if PermitModifyDocument is not set. + + + + + PdfStandardSecurityHandler is the only implemented handler. + + + + + Represents the standard PDF security handler. + + + + + Sets the user password of the document. Setting a password automatically sets the + PdfDocumentSecurityLevel to PdfDocumentSecurityLevel.Encrypted128Bit if its current + value is PdfDocumentSecurityLevel.None. + + + + + Sets the owner password of the document. Setting a password automatically sets the + PdfDocumentSecurityLevel to PdfDocumentSecurityLevel.Encrypted128Bit if its current + value is PdfDocumentSecurityLevel.None. + + + + + Gets or sets the user access permission represented as an integer in the P key. + + + + + Encrypts the whole document. + + + + + Encrypts an indirect object. + + + + + Encrypts a dictionary. + + + + + Encrypts an array. + + + + + Encrypts a string. + + + + + Encrypts an array. + + + + + Checks the password. + + Password or null if no password is provided. + + + + Pads a password to a 32 byte array. + + + + + Generates the user key based on the padded user password. + + + + + Generates the user key based on the padded owner password. + + + + + Computes the padded user password from the padded owner password. + + + + + Computes the encryption key. + + + + + Computes the user key. + + + + + Prepare the encryption key. + + + + + Prepare the encryption key. + + + + + Prepare the encryption key. + + + + + Encrypts the data. + + + + + Encrypts the data. + + + + + Encrypts the data. + + + + + Encrypts the data. + + + + + Checks whether the calculated key correct. + + + + + Set the hash key for the specified object. + + + + + Prepares the security handler for encrypting the document. + + + + + The global encryption key. + + + + + The message digest algorithm MD5. + + + + + Bytes used for RC4 encryption. + + + + + The encryption key for the owner. + + + + + The encryption key for the user. + + + + + The encryption key for a particular object/generation. + + + + + The encryption key length for a particular object/generation. + + + + + Predefined keys of this dictionary. + + + + + (Required) A number specifying which revision of the standard security handler + should be used to interpret this dictionary: + • 2 if the document is encrypted with a V value less than 2 and does not have any of + the access permissions set (by means of the P entry, below) that are designated + "Revision 3 or greater". + • 3 if the document is encrypted with a V value of 2 or 3, or has any "Revision 3 or + greater" access permissions set. + • 4 if the document is encrypted with a V value of 4 + + + + + (Required) A 32-byte string, based on both the owner and user passwords, that is + used in computing the encryption key and in determining whether a valid owner + password was entered. + + + + + (Required) A 32-byte string, based on the user password, that is used in determining + whether to prompt the user for a password and, if so, whether a valid user or owner + password was entered. + + + + + (Required) A set of flags specifying which operations are permitted when the document + is opened with user access. + + + + + (Optional; meaningful only when the value of V is 4; PDF 1.5) Indicates whether + the document-level metadata stream is to be encrypted. Applications should respect this value. + Default value: true. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Specifies the type of a key's value in a dictionary. + + + + + Summary description for KeyInfo. + + + + + Identifies the state of the document + + + + + The document was created from scratch. + + + + + The document was created by opening an existing PDF file. + + + + + The document is disposed. + + + + + Sets the mode for the Deflater (FlateEncoder). + + + + + The default mode. + + + + + Fast encoding, but larger PDF files. + + + + + Best compression, but takes more time. + + + + + Specifies whether to compress JPEG images with the FlateDecode filter. + + + + + PDFsharp will try FlateDecode and use it if it leads to a reduction in PDF file size. + When FlateEncodeMode is set to BestCompression, this is more likely to reduce the file size, + but it takes considerably more time to create the PDF file. + + + + + PDFsharp will never use FlateDecode - files may be a few bytes larger, but file creation is faster. + + + + + PDFsharp will always use FlateDecode, even if this leads to larger files; + this option is meant for testing purposes only and should not be used for production code. + + + + + Specifies what color model is used in a PDF document. + + + + + All color values are written as specified in the XColor objects they come from. + + + + + All colors are converted to RGB. + + + + + All colors are converted to CMYK. + + + + + This class is undocumented and may change or drop in future releases. + + + + + Use document default to determine compression. + + + + + Leave custom values uncompressed. + + + + + Compress custom values using FlateDecode. + + + + + Specifies the embedding options of an XFont when converted into PDF. + Font embedding is not optional anymore. So Always is the only option. + + + + + All fonts are embedded. + + + + + Fonts are not embedded. This is not an option anymore. + + + + + Unicode fonts are embedded, WinAnsi fonts are not embedded. + + + + + Not yet implemented. + + + + + Specifies the encoding schema used for an XFont when converted into PDF. + + + + + Cause a font to use Windows-1252 encoding to encode text rendered with this font. + Same as Windows1252 encoding. + + + + + Cause a font to use Unicode encoding to encode text rendered with this font. + + + + + Unicode encoding. + + + + + Specifies the type of a page destination in outline items, annotations, or actions.. + + + + + Display the page with the coordinates (left, top) positioned at the upper-left corner of + the window and the contents of the page magnified by the factor zoom. + + + + + Display the page with its contents magnified just enough to fit the + entire page within the window both horizontally and vertically. + + + + + Display the page with the vertical coordinate top positioned at the top edge of + the window and the contents of the page magnified just enough to fit the entire + width of the page within the window. + + + + + Display the page with the horizontal coordinate left positioned at the left edge of + the window and the contents of the page magnified just enough to fit the entire + height of the page within the window. + + + + + Display the page designated by page, with its contents magnified just enough to + fit the rectangle specified by the coordinates left, bottom, right, and topentirely + within the window both horizontally and vertically. If the required horizontal and + vertical magnification factors are different, use the smaller of the two, centering + the rectangle within the window in the other dimension. A null value for any of + the parameters may result in unpredictable behavior. + + + + + Display the page with its contents magnified just enough to fit the rectangle specified + by the coordinates left, bottom, right, and topentirely within the window both + horizontally and vertically. + + + + + Display the page with the vertical coordinate top positioned at the top edge of + the window and the contents of the page magnified just enough to fit the entire + width of its bounding box within the window. + + + + + Display the page with the horizontal coordinate left positioned at the left edge of + the window and the contents of the page magnified just enough to fit the entire + height of its bounding box within the window. + + + + + Specifies the font style for the outline (bookmark) text. + + + + + Outline text is displayed using a regular font. + + + + + Outline text is displayed using an italic font. + + + + + Outline text is displayed using a bold font. + + + + + Outline text is displayed using a bold and italic font. + + + + + Specifies the page layout to be used by a viewer when the document is opened. + + + + + Display one page at a time. + + + + + Display the pages in one column. + + + + + Display the pages in two columns, with oddnumbered pages on the left. + + + + + Display the pages in two columns, with oddnumbered pages on the right. + + + + + (PDF 1.5) Display the pages two at a time, with odd-numbered pages on the left. + + + + + (PDF 1.5) Display the pages two at a time, with odd-numbered pages on the right. + + + + + Specifies how the document should be displayed by a viewer when opened. + + + + + Neither document outline nor thumbnail images visible. + + + + + Document outline visible. + + + + + Thumbnail images visible. + + + + + Full-screen mode, with no menu bar, windowcontrols, or any other window visible. + + + + + (PDF 1.5) Optional content group panel visible. + + + + + (PDF 1.6) Attachments panel visible. + + + + + Specifies how the document should be displayed by a viewer when opened. + + + + + Left to right. + + + + + Right to left (including vertical writing systems, such as Chinese, Japanese, and Korean) + + + + + Specifies how text strings are encoded. A text string is any text used outside of a page content + stream, e.g. document information, outline text, annotation text etc. + + + + + Specifies that hypertext uses PDF DocEncoding. + + + + + Specifies that hypertext uses unicode encoding. + + + + + Base class for all dictionary Keys classes. + + + + + Holds information about the value of a key in a dictionary. This information is used to create + and interpret this value. + + + + + Initializes a new instance of KeyDescriptor from the specified attribute during a KeysMeta + initializes itself using reflection. + + + + + Gets or sets the PDF version starting with the availability of the described key. + + + + + Returns the type of the object to be created as value for the described key. + + + + + Contains meta information about all keys of a PDF dictionary. + + + + + Gets the KeyDescriptor of the specified key, or null if no such descriptor exits. + + + + + Represents a PDF array object. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The document. + + + + Initializes a new instance of the class. + + The document. + The items. + + + + Initializes a new instance from an existing dictionary. Used for object type transformation. + + The array. + + + + Creates a copy of this array. Direct elements are deep copied. + Indirect references are not modified. + + + + + Implements the copy mechanism. + + + + + Gets the collection containing the elements of this object. + + + + + Returns an enumerator that iterates through a collection. + + + + + Returns a string with the content of this object in a readable form. Useful for debugging purposes only. + + + + + Represents the elements of an PdfArray. + + + + + Creates a shallow copy of this object. + + + + + Moves this instance to another array during object type transformation. + + + + + Converts the specified value to boolean. + If the value does not exist, the function returns false. + If the value is not convertible, the function throws an InvalidCastException. + If the index is out of range, the function throws an ArgumentOutOfRangeException. + + + + + Converts the specified value to integer. + If the value does not exist, the function returns 0. + If the value is not convertible, the function throws an InvalidCastException. + If the index is out of range, the function throws an ArgumentOutOfRangeException. + + + + + Converts the specified value to double. + If the value does not exist, the function returns 0. + If the value is not convertible, the function throws an InvalidCastException. + If the index is out of range, the function throws an ArgumentOutOfRangeException. + + + + + Converts the specified value to double?. + If the value does not exist, the function returns null. + If the value is not convertible, the function throws an InvalidCastException. + If the index is out of range, the function throws an ArgumentOutOfRangeException. + + + + + Converts the specified value to string. + If the value does not exist, the function returns the empty string. + If the value is not convertible, the function throws an InvalidCastException. + If the index is out of range, the function throws an ArgumentOutOfRangeException. + + + + + Converts the specified value to a name. + If the value does not exist, the function returns the empty string. + If the value is not convertible, the function throws an InvalidCastException. + If the index is out of range, the function throws an ArgumentOutOfRangeException. + + + + + Returns the indirect object if the value at the specified index is a PdfReference. + + + + + Gets the PdfObject with the specified index, or null, if no such object exists. If the index refers to + a reference, the referenced PdfObject is returned. + + + + + Gets the PdfArray with the specified index, or null, if no such object exists. If the index refers to + a reference, the referenced PdfArray is returned. + + + + + Gets the PdfArray with the specified index, or null, if no such object exists. If the index refers to + a reference, the referenced PdfArray is returned. + + + + + Gets the PdfReference with the specified index, or null, if no such object exists. + + + + + Gets all items of this array. + + + + + Returns false. + + + + + Gets or sets an item at the specified index. + + + + + + Removes the item at the specified index. + + + + + Removes the first occurrence of a specific object from the array/>. + + + + + Inserts the item the specified index. + + + + + Determines whether the specified value is in the array. + + + + + Removes all items from the array. + + + + + Gets the index of the specified item. + + + + + Appends the specified object to the array. + + + + + Returns false. + + + + + Returns false. + + + + + Gets the number of elements in the array. + + + + + Copies the elements of the array to the specified array. + + + + + The current implementation return null. + + + + + Returns an enumerator that iterates through the array. + + + + + The elements of the array. + + + + + The array this objects belongs to. + + + + + Gets the DebuggerDisplayAttribute text. + + + + + Represents a direct boolean value. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Gets the value of this instance as boolean value. + + + + + A pre-defined value that represents true. + + + + + A pre-defined value that represents false. + + + + + Returns 'false' or 'true'. + + + + + Writes 'true' or 'false'. + + + + + Represents an indirect boolean value. This type is not used by PDFsharp. If it is imported from + an external PDF file, the value is converted into a direct object. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Gets the value of this instance as boolean value. + + + + + Returns "false" or "true". + + + + + Writes the keyword «false» or «true». + + + + + This class is intended for empira internal use only and may change or drop in future releases. + + + + + This function is intended for empira internal use only. + + + + + This function is intended for empira internal use only. + + + + + This property is intended for empira internal use only. + + + + + This property is intended for empira internal use only. + + + + + This class is intended for empira internal use only and may change or drop in future releases. + + + + + This function is intended for empira internal use only. + + + + + This function is intended for empira internal use only. + + + + + This function is intended for empira internal use only. + + + + + This function is intended for empira internal use only. + + + + + Represents a direct date value. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Gets the value as DateTime. + + + + + Returns the value in the PDF date format. + + + + + Writes the value in the PDF date format. + + + + + Value creation flags. Specifies whether and how a value that does not exist is created. + + + + + Don't create the value. + + + + + Create the value as direct object. + + + + + Create the value as indirect object. + + + + + Represents a PDF dictionary object. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The document. + + + + Initializes a new instance from an existing dictionary. Used for object type transformation. + + + + + Creates a copy of this dictionary. Direct values are deep copied. Indirect references are not + modified. + + + + + This function is useful for importing objects from external documents. The returned object is not + yet complete. irefs refer to external objects and directed objects are cloned but their document + property is null. A cloned dictionary or array needs a 'fix-up' to be a valid object. + + + + + Gets the dictionary containing the elements of this dictionary. + + + + + The elements of the dictionary. + + + + + Returns an enumerator that iterates through the dictionary elements. + + + + + Returns a string with the content of this object in a readable form. Useful for debugging purposes only. + + + + + Writes a key/value pair of this dictionary. This function is intended to be overridden + in derived classes. + + + + + Writes the stream of this dictionary. This function is intended to be overridden + in a derived class. + + + + + Gets or sets the PDF stream belonging to this dictionary. Returns null if the dictionary has + no stream. To create the stream, call the CreateStream function. + + + + + Creates the stream of this dictionary and initializes it with the specified byte array. + The function must not be called if the dictionary already has a stream. + + + + + When overridden in a derived class, gets the KeysMeta of this dictionary type. + + + + + Represents the interface to the elements of a PDF dictionary. + + + + + Creates a shallow copy of this object. The clone is not owned by a dictionary anymore. + + + + + Moves this instance to another dictionary during object type transformation. + + + + + Gets the dictionary to which this elements object belongs to. + + + + + Converts the specified value to boolean. + If the value does not exist, the function returns false. + If the value is not convertible, the function throws an InvalidCastException. + + + + + Converts the specified value to boolean. + If the value does not exist, the function returns false. + If the value is not convertible, the function throws an InvalidCastException. + + + + + Sets the entry to a direct boolean value. + + + + + Converts the specified value to integer. + If the value does not exist, the function returns 0. + If the value is not convertible, the function throws an InvalidCastException. + + + + + Converts the specified value to integer. + If the value does not exist, the function returns 0. + If the value is not convertible, the function throws an InvalidCastException. + + + + + Sets the entry to a direct integer value. + + + + + Converts the specified value to double. + If the value does not exist, the function returns 0. + If the value is not convertible, the function throws an InvalidCastException. + + + + + Converts the specified value to double. + If the value does not exist, the function returns 0. + If the value is not convertible, the function throws an InvalidCastException. + + + + + Sets the entry to a direct double value. + + + + + Converts the specified value to String. + If the value does not exist, the function returns the empty string. + + + + + Converts the specified value to String. + If the value does not exist, the function returns the empty string. + + + + + Tries to get the string. TODO: more TryGet... + + + + + Sets the entry to a direct string value. + + + + + Converts the specified value to a name. + If the value does not exist, the function returns the empty string. + + + + + Sets the specified name value. + If the value doesn't start with a slash, it is added automatically. + + + + + Converts the specified value to PdfRectangle. + If the value does not exist, the function returns an empty rectangle. + If the value is not convertible, the function throws an InvalidCastException. + + + + + Converts the specified value to PdfRectangle. + If the value does not exist, the function returns an empty rectangle. + If the value is not convertible, the function throws an InvalidCastException. + + + + + Sets the entry to a direct rectangle value, represented by an array with four values. + + + + Converts the specified value to XMatrix. + If the value does not exist, the function returns an identity matrix. + If the value is not convertible, the function throws an InvalidCastException. + + + Converts the specified value to XMatrix. + If the value does not exist, the function returns an identity matrix. + If the value is not convertible, the function throws an InvalidCastException. + + + + Sets the entry to a direct matrix value, represented by an array with six values. + + + + + Converts the specified value to DateTime. + If the value does not exist, the function returns the specified default value. + If the value is not convertible, the function throws an InvalidCastException. + + + + + Sets the entry to a direct datetime value. + + + + + Gets the value for the specified key. If the value does not exist, it is optionally created. + + + + + Short cut for GetValue(key, VCF.None). + + + + + Returns the type of the object to be created as value of the specified key. + + + + + Sets the entry with the specified value. DON'T USE THIS FUNCTION - IT MAY BE REMOVED. + + + + + Gets the PdfObject with the specified key, or null, if no such object exists. If the key refers to + a reference, the referenced PdfObject is returned. + + + + + Gets the PdfDictionary with the specified key, or null, if no such object exists. If the key refers to + a reference, the referenced PdfDictionary is returned. + + + + + Gets the PdfArray with the specified key, or null, if no such object exists. If the key refers to + a reference, the referenced PdfArray is returned. + + + + + Gets the PdfReference with the specified key, or null, if no such object exists. + + + + + Sets the entry to the specified object. The object must not be an indirect object, + otherwise an exception is raised. + + + + + Sets the entry as a reference to the specified object. The object must be an indirect object, + otherwise an exception is raised. + + + + + Sets the entry as a reference to the specified iref. + + + + + Gets a value indicating whether the object is read-only. + + + + + Returns an object for the object. + + + + + Gets or sets an entry in the dictionary. The specified key must be a valid PDF name + starting with a slash '/'. This property provides full access to the elements of the + PDF dictionary. Wrong use can lead to errors or corrupt PDF files. + + + + + Gets or sets an entry in the dictionary identified by a PdfName object. + + + + + Removes the value with the specified key. + + + + + Removes the value with the specified key. + + + + + Determines whether the dictionary contains the specified name. + + + + + Determines whether the dictionary contains a specific value. + + + + + Removes all elements from the dictionary. + + + + + Adds the specified value to the dictionary. + + + + + Adds an item to the dictionary. + + + + + Gets all keys currently in use in this dictionary as an array of PdfName objects. + + + + + Get all keys currently in use in this dictionary as an array of string objects. + + + + + Gets the value associated with the specified key. + + + + + Gets all values currently in use in this dictionary as an array of PdfItem objects. + + + + + Return false. + + + + + Return false. + + + + + Gets the number of elements contained in the dictionary. + + + + + Copies the elements of the dictionary to an array, starting at a particular index. + + + + + The current implementation returns null. + + + + + Gets the DebuggerDisplayAttribute text. + + + + + The elements of the dictionary with a string as key. + Because the string is a name it starts always with a '/'. + + + + + The dictionary this objects belongs to. + + + + + The PDF stream objects. + + + + + A .NET string can contain char(0) as a valid character. + + + + + Clones this stream by creating a deep copy. + + + + + Moves this instance to another dictionary during object type transformation. + + + + + The dictionary the stream belongs to. + + + + + Gets the length of the stream, i.e. the actual number of bytes in the stream. + + + + + Gets a value indicating whether this stream has decode parameters. + + + + + Gets the decode predictor for LZW- or FlateDecode. + Returns 0 if no such value exists. + + + + + Gets the decode Columns for LZW- or FlateDecode. + Returns 0 if no such value exists. + + + + + Get or sets the bytes of the stream as they are, i.e. if one or more filters exist the bytes are + not unfiltered. + + + + + Gets the value of the stream unfiltered. The stream content is not modified by this operation. + + + + + Tries to unfilter the bytes of the stream. If the stream is filtered and PDFsharp knows the filter + algorithm, the stream content is replaced by its unfiltered value and the function returns true. + Otherwise the content remains untouched and the function returns false. + The function is useful for analyzing existing PDF files. + + + + + Compresses the stream with the FlateDecode filter. + If a filter is already defined, the function has no effect. + + + + + Returns the stream content as a raw string. + + + + + Common keys for all streams. + + + + + (Required) The number of bytes from the beginning of the line following the keyword + stream to the last byte just before the keyword endstream. (There may be an additional + EOL marker, preceding endstream, that is not included in the count and is not logically + part of the stream data.) + + + + + (Optional) The name of a filter to be applied in processing the stream data found between + the keywords stream and endstream, or an array of such names. Multiple filters should be + specified in the order in which they are to be applied. + + + + + (Optional) A parameter dictionary or an array of such dictionaries, used by the filters + specified by Filter. If there is only one filter and that filter has parameters, DecodeParms + must be set to the filter’s parameter dictionary unless all the filter’s parameters have + their default values, in which case the DecodeParms entry may be omitted. If there are + multiple filters and any of the filters has parameters set to nondefault values, DecodeParms + must be an array with one entry for each filter: either the parameter dictionary for that + filter, or the null object if that filter has no parameters (or if all of its parameters have + their default values). If none of the filters have parameters, or if all their parameters + have default values, the DecodeParms entry may be omitted. + + + + + (Optional; PDF 1.2) The file containing the stream data. If this entry is present, the bytes + between stream and endstream are ignored, the filters are specified by FFilter rather than + Filter, and the filter parameters are specified by FDecodeParms rather than DecodeParms. + However, the Length entry should still specify the number of those bytes. (Usually, there are + no bytes and Length is 0.) + + + + + (Optional; PDF 1.2) The name of a filter to be applied in processing the data found in the + stream’s external file, or an array of such names. The same rules apply as for Filter. + + + + + (Optional; PDF 1.2) A parameter dictionary, or an array of such dictionaries, used by the + filters specified by FFilter. The same rules apply as for DecodeParms. + + + + + Optional; PDF 1.5) A non-negative integer representing the number of bytes in the decoded + (defiltered) stream. It can be used to determine, for example, whether enough disk space is + available to write a stream to a file. + This value should be considered a hint only; for some stream filters, it may not be possible + to determine this value precisely. + + + + + Gets the DebuggerDisplayAttribute text. + + + + + Represents a PDF document. + + + + + Creates a new PDF document in memory. + To open an existing PDF file, use the PdfReader class. + + + + + Creates a new PDF document with the specified file name. The file is immediately created and keeps + locked until the document is closed, at that time the document is saved automatically. + Do not call Save() for documents created with this constructor, just call Close(). + To open an existing PDF file and import it, use the PdfReader class. + + + + + Creates a new PDF document using the specified stream. + The stream won't be used until the document is closed, at that time the document is saved automatically. + Do not call Save() for documents created with this constructor, just call Close(). + To open an existing PDF file, use the PdfReader class. + + + + + Disposes all references to this document stored in other documents. This function should be called + for documents you finished importing pages from. Calling Dispose is technically not necessary but + useful for earlier reclaiming memory of documents you do not need anymore. + + + + + Gets or sets a user defined object that contains arbitrary information associated with this document. + The tag is not used by PDFsharp. + + + + + Gets or sets a value used to distinguish PdfDocument objects. + The name is not used by PDFsharp. + + + + + Get a new default name for a new document. + + + + + Closes this instance. + + + + + Saves the document to the specified path. If a file already exists, it will be overwritten. + + + + + Saves the document to the specified stream. + + + + + Saves the document to the specified stream. + The stream is not closed by this function. + (Older versions of PDFsharp closes the stream. That was not very useful.) + + + + + Implements saving a PDF file. + + + + + Dispatches PrepareForSave to the objects that need it. + + + + + Determines whether the document can be saved. + + + + + Gets the document options used for saving the document. + + + + + Gets PDF specific document settings. + + + + + NYI Indicates whether large objects are written immediately to the output stream to relieve + memory consumption. + + + + + Gets or sets the PDF version number. Return value 14 e.g. means PDF 1.4 / Acrobat 5 etc. + + + + + Gets the number of pages in the document. + + + + + Gets the file size of the document. + + + + + Gets the full qualified file name if the document was read form a file, or an empty string otherwise. + + + + + Gets a Guid that uniquely identifies this instance of PdfDocument. + + + + + Returns a value indicating whether the document was newly created or opened from an existing document. + Returns true if the document was opened with the PdfReader.Open function, false otherwise. + + + + + Returns a value indicating whether the document is read only or can be modified. + + + + + Gets information about the document. + + + + + This function is intended to be undocumented. + + + + + Get the pages dictionary. + + + + + Gets or sets a value specifying the page layout to be used when the document is opened. + + + + + Gets or sets a value specifying how the document should be displayed when opened. + + + + + Gets the viewer preferences of this document. + + + + + Gets the root of the outline (or bookmark) tree. + + + + + Get the AcroForm dictionary. + + + + + Gets or sets the default language of the document. + + + + + Gets the security settings of this document. + + + + + Gets the document font table that holds all fonts used in the current document. + + + + + Gets the document image table that holds all images used in the current document. + + + + + Gets the document form table that holds all form external objects used in the current document. + + + + + Gets the document ExtGState table that holds all form state objects used in the current document. + + + + + Gets the PdfCatalog of the current document. + + + + + Gets the PdfInternals object of this document, that grants access to some internal structures + which are not part of the public interface of PdfDocument. + + + + + Creates a new page and adds it to this document. + Depending of the IsMetric property of the current region the page size is set to + A4 or Letter respectively. If this size is not appropriate it should be changed before + any drawing operations are performed on the page. + + + + + Adds the specified page to this document. If the page is from an external document, + it is imported to this document. In this case the returned page is not the same + object as the specified one. + + + + + Creates a new page and inserts it in this document at the specified position. + + + + + Inserts the specified page in this document. If the page is from an external document, + it is imported to this document. In this case the returned page is not the same + object as the specified one. + + + + + Flattens a document (make the fields non-editable). + + + + + Gets the security handler. + + + + + Occurs when the specified document is not used anymore for importing content. + + + + + Gets the ThreadLocalStorage object. It is used for caching objects that should created + only once. + + + + + Represents the PDF document information dictionary. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the document's title. + + + + + Gets or sets the name of the person who created the document. + + + + + Gets or sets the name of the subject of the document. + + + + + Gets or sets keywords associated with the document. + + + + + Gets or sets the name of the application (for example, MigraDoc) that created the document. + + + + + Gets the producer application (for example, PDFsharp). + + + + + Gets or sets the creation date of the document. + Breaking Change: If the date is not set in a PDF file DateTime.MinValue is returned. + + + + + Gets or sets the modification date of the document. + Breaking Change: If the date is not set in a PDF file DateTime.MinValue is returned. + + + + + Predefined keys of this dictionary. + + + + + (Optional; PDF 1.1) The document’s title. + + + + + (Optional) The name of the person who created the document. + + + + + (Optional; PDF 1.1) The subject of the document. + + + + + (Optional; PDF 1.1) Keywords associated with the document. + + + + + (Optional) If the document was converted to PDF from another format, + the name of the application (for example, empira MigraDoc) that created the + original document from which it was converted. + + + + + (Optional) If the document was converted to PDF from another format, + the name of the application (for example, this library) that converted it to PDF. + + + + + (Optional) The date and time the document was created, in human-readable form. + + + + + (Required if PieceInfo is present in the document catalog; otherwise optional; PDF 1.1) + The date and time the document was most recently modified, in human-readable form. + + + + + (Optional; PDF 1.3) A name object indicating whether the document has been modified + to include trapping information. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Holds information how to handle the document when it is saved as PDF stream. + + + + + Gets or sets the color mode. + + + + + Gets or sets a value indicating whether to compress content streams of PDF pages. + + + + + Gets or sets a value indicating that all objects are not compressed. + + + + + Gets or sets the flate encode mode. Besides the balanced default mode you can set modes for best compression (slower) or best speed (larger files). + + + + + Gets or sets a value indicating whether to compress bilevel images using CCITT compression. + With true, PDFsharp will try FlateDecode CCITT and will use the smallest one or a combination of both. + With false, PDFsharp will always use FlateDecode only - files may be a few bytes larger, but file creation is faster. + + + + + Gets or sets a value indicating whether to compress JPEG images with the FlateDecode filter. + + + + + Holds PDF specific information of the document. + + + + + Gets or sets the default trim margins. + + + + + Represents a direct integer value. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The value. + + + + Gets the value as integer. + + + + + Returns the integer as string. + + + + + Writes the integer as string. + + + + + Returns TypeCode for 32-bit integers. + + + + + Represents an indirect integer value. This type is not used by PDFsharp. If it is imported from + an external PDF file, the value is converted into a direct object. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Gets the value as integer. + + + + + Returns the integer as string. + + + + + Writes the integer literal. + + + + + The base class of all PDF objects and simple PDF types. + + + + + Creates a copy of this object. + + + + + Implements the copy mechanism. Must be overridden in derived classes. + + + + + When overridden in a derived class, appends a raw string representation of this object + to the specified PdfWriter. + + + + + Represents text that is written 'as it is' into the PDF stream. This class can lead to invalid PDF files. + E.g. strings in a literal are not encrypted when the document is saved with a password. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance with the specified string. + + + + + Initializes a new instance with the culture invariant formatted specified arguments. + + + + + Creates a literal from an XMatrix + + + + + Gets the value as litaral string. + + + + + Returns a string that represents the current value. + + + + + Represents a PDF name value. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + Parameter value always must start with a '/'. + + + + + Determines whether the specified object is equal to this name. + + + + + Returns the hash code for this instance. + + + + + Gets the name as a string. + + + + + Returns the name. The string always begins with a slash. + + + + + Determines whether the specified name and string are equal. + + + + + Determines whether the specified name and string are not equal. + + + + + Represents the empty name. + + + + + Writes the name including the leading slash. + + + + + Gets the comparer for this type. + + + + + Implements a comparer that compares PdfName objects. + + + + + Compares two objects and returns a value indicating whether one is less than, equal to, or greater than the other. + + The first object to compare. + The second object to compare. + + + + Represents an indirect name value. This type is not used by PDFsharp. If it is imported from + an external PDF file, the value is converted into a direct object. Acrobat sometime uses indirect + names to save space, because an indirect reference to a name may be shorter than a long name. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The document. + The value. + + + + Determines whether the specified object is equal to the current object. + + + + + Serves as a hash function for this type. + + + + + Gets or sets the name value. + + + + + Returns the name. The string always begins with a slash. + + + + + Determines whether a name is equal to a string. + + + + + Determines whether a name is not equal to a string. + + + + + Writes the name including the leading slash. + + + + + Represents a indirect reference that is not in the cross reference table. + + + + + Returns a that represents the current . + + + A that represents the current . + + + + + The only instance of this class. + + + + + Represents an indirect null value. This type is not used by PDFsharp, but at least + one tool from Adobe creates PDF files with a null object. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The document. + + + + Returns the string "null". + + + + + Writes the keyword «null». + + + + + Base class for direct number values (not yet used, maybe superfluous). + + + + + Base class for indirect number values (not yet used, maybe superfluous). + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The document. + + + + Base class of all composite PDF objects. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance from an existing object. Used for object type transformation. + + + + + Creates a copy of this object. The clone does not belong to a document, i.e. its owner and its iref are null. + + + + + Implements the copy mechanism. Must be overridden in derived classes. + + + + + Sets the object and generation number. + Setting the object identifier makes this object an indirect object, i.e. the object gets + a PdfReference entry in the PdfReferenceTable. + + + + + Gets the PdfDocument this object belongs to. + + + + + Sets the PdfDocument this object belongs to. + + + + + Indicates whether the object is an indirect object. + + + + + Gets the PdfInternals object of this document, that grants access to some internal structures + which are not part of the public interface of PdfDocument. + + + + + When overridden in a derived class, prepares the object to get saved. + + + + + Saves the stream position. 2nd Edition. + + + + + Gets the object identifier. Returns PdfObjectID.Empty for direct objects, + i.e. never returns null. + + + + + Gets the object number. + + + + + Gets the generation number. + + + + The document that owns the cloned objects. + The root object to be cloned. + The clone of the root object + + + The imported object table of the owner for the external document. + The document that owns the cloned objects. + The root object to be cloned. + The clone of the root object + + + + Replace all indirect references to external objects by their cloned counterparts + owned by the importer document. + + + + + Ensure for future versions of PDFsharp not to forget code for a new kind of PdfItem. + + The item. + + + + Gets the indirect reference of this object. If the value is null, this object is a direct object. + + + + + Represents a PDF object identifier, a pair of object and generation number. + + + + + Initializes a new instance of the class. + + The object number. + + + + Initializes a new instance of the class. + + The object number. + The generation number. + + + + Gets or sets the object number. + + + + + Gets or sets the generation number. + + + + + Indicates whether this object is an empty object identifier. + + + + + Indicates whether this instance and a specified object are equal. + + + + + Returns the hash code for this instance. + + + + + Determines whether the two objects are equal. + + + + + Determines whether the tow objects not are equal. + + + + + Returns the object and generation numbers as a string. + + + + + Creates an empty object identifier. + + + + + Compares the current object id with another object. + + + + + Gets the DebuggerDisplayAttribute text. + + + + + Represents an outline item in the outlines tree. An 'outline' is also known as a 'bookmark'. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The document. + + + + Initializes a new instance from an existing dictionary. Used for object type transformation. + + + + + Initializes a new instance of the class. + + The outline text. + The destination page. + Specifies whether the node is displayed expanded (opened) or collapsed. + The font style used to draw the outline text. + The color used to draw the outline text. + + + + Initializes a new instance of the class. + + The outline text. + The destination page. + Specifies whether the node is displayed expanded (opened) or collapsed. + The font style used to draw the outline text. + + + + Initializes a new instance of the class. + + The outline text. + The destination page. + Specifies whether the node is displayed expanded (opened) or collapsed. + + + + Initializes a new instance of the class. + + The outline text. + The destination page. + + + + The total number of open descendants at all lower levels. + + + + + Counts the open outline items. Not yet used. + + + + + Gets the parent of this outline item. The root item has no parent and returns null. + + + + + Gets or sets the title. + + + + + Gets or sets the destination page. + + + + + Gets or sets the left position of the page positioned at the left side of the window. + Applies only if PageDestinationType is Xyz, FitV, FitR, or FitBV. + + + + + Gets or sets the top position of the page positioned at the top side of the window. + Applies only if PageDestinationType is Xyz, FitH, FitR, ob FitBH. + + + + + Gets or sets the right position of the page positioned at the right side of the window. + Applies only if PageDestinationType is FitR. + + + + + Gets or sets the bottom position of the page positioned at the bottom side of the window. + Applies only if PageDestinationType is FitR. + + + + + Gets or sets the zoom faction of the page. + Applies only if PageDestinationType is Xyz. + + + + + Gets or sets whether the outline item is opened (or expanded). + + + + + Gets or sets the style of the outline text. + + + + + Gets or sets the type of the page destination. + + + + + Gets or sets the color of the text. + + The color of the text. + + + + Gets a value indicating whether this outline object has child items. + + + + + Gets the outline collection of this node. + + + + + Initializes this instance from an existing PDF document. + + + + + Creates key/values pairs according to the object structure. + + + + + Format double. + + + + + Format nullable double. + + + + + Predefined keys of this dictionary. + + + + + (Optional) The type of PDF object that this dictionary describes; if present, + must be Outlines for an outline dictionary. + + + + + (Required) The text to be displayed on the screen for this item. + + + + + (Required; must be an indirect reference) The parent of this item in the outline hierarchy. + The parent of a top-level item is the outline dictionary itself. + + + + + (Required for all but the first item at each level; must be an indirect reference) + The previous item at this outline level. + + + + + (Required for all but the last item at each level; must be an indirect reference) + The next item at this outline level. + + + + + (Required if the item has any descendants; must be an indirect reference) + The first of this item’s immediate children in the outline hierarchy. + + + + + (Required if the item has any descendants; must be an indirect reference) + The last of this item’s immediate children in the outline hierarchy. + + + + + (Required if the item has any descendants) If the item is open, the total number of its + open descendants at all lower levels of the outline hierarchy. If the item is closed, a + negative integer whose absolute value specifies how many descendants would appear if the + item were reopened. + + + + + (Optional; not permitted if an A entry is present) The destination to be displayed when this + item is activated. + + + + + (Optional; not permitted if a Dest entry is present) The action to be performed when + this item is activated. + + + + + (Optional; PDF 1.3; must be an indirect reference) The structure element to which the item + refers. + Note: The ability to associate an outline item with a structure element (such as the beginning + of a chapter) is a PDF 1.3 feature. For backward compatibility with earlier PDF versions, such + an item should also specify a destination (Dest) corresponding to an area of a page where the + contents of the designated structure element are displayed. + + + + + (Optional; PDF 1.4) An array of three numbers in the range 0.0 to 1.0, representing the + components in the DeviceRGB color space of the color to be used for the outline entry’s text. + Default value: [0.0 0.0 0.0]. + + + + + (Optional; PDF 1.4) A set of flags specifying style characteristics for displaying the outline + item’s text. Default value: 0. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents a collection of outlines. + + + + + Can only be created as part of PdfOutline. + + + + + Indicates whether the outline collection has at least one entry. + + + + + Removes the first occurrence of a specific item from the collection. + + + + + Gets the number of entries in this collection. + + + + + Returns false. + + + + + Adds the specified outline. + + + + + Removes all elements form the collection. + + + + + Determines whether the specified element is in the collection. + + + + + Copies the collection to an array, starting at the specified index of the target array. + + + + + Adds the specified outline entry. + + The outline text. + The destination page. + Specifies whether the node is displayed expanded (opened) or collapsed. + The font style used to draw the outline text. + The color used to draw the outline text. + + + + Adds the specified outline entry. + + The outline text. + The destination page. + Specifies whether the node is displayed expanded (opened) or collapsed. + The font style used to draw the outline text. + + + + Adds the specified outline entry. + + The outline text. + The destination page. + Specifies whether the node is displayed expanded (opened) or collapsed. + + + + Creates a PdfOutline and adds it into the outline collection. + + + + + Gets the index of the specified item. + + + + + Inserts the item at the specified index. + + + + + Removes the outline item at the specified index. + + + + + Gets the at the specified index. + + + + + Returns an enumerator that iterates through the outline collection. + + + + + The parent outine of this collection. + + + + + Represents a page in a PDF document. + + + + + Initializes a new page. The page must be added to a document before it can be used. + Depending of the IsMetric property of the current region the page size is set to + A4 or Letter respectively. If this size is not appropriate it should be changed before + any drawing operations are performed on the page. + + + + + Initializes a new instance of the class. + + The document. + + + + Gets or sets a user defined object that contains arbitrary information associated with this PDF page. + The tag is not used by PDFsharp. + + + + + Closes the page. A closed page cannot be modified anymore and it is not possible to + get an XGraphics object for a closed page. Closing a page is not required, but may save + resources if the document has many pages. + + + + + Gets a value indicating whether the page is closed. + + + + + Gets or sets the PdfDocument this page belongs to. + + + + + Gets or sets the orientation of the page. The default value PageOrientation.Portrait. + If an imported page has a /Rotate value that matches the formula 90 + n * 180 the + orientation is set to PageOrientation.Landscape. + + + + + Gets or sets one of the predefined standard sizes like. + + + + + Gets or sets the trim margins. + + + + + Gets or sets the media box directly. XGrahics is not prepared to work with a media box + with an origin other than (0,0). + + + + + Gets or sets the crop box. + + + + + Gets or sets the bleed box. + + + + + Gets or sets the art box. + + + + + Gets or sets the trim box. + + + + + Gets or sets the height of the page. If orientation is Landscape, this function applies to + the width. + + + + + Gets or sets the width of the page. If orientation is Landscape, this function applies to + the height. + + + + + Gets or sets the /Rotate entry of the PDF page. The value is the number of degrees by which the page + should be rotated clockwise when displayed or printed. The value must be a multiple of 90. + PDFsharp does not set this value, but for imported pages this value can be set and must be taken + into account when adding graphic to such a page. + + + + + The content stream currently used by an XGraphics object for rendering. + + + + + Gets the array of content streams of the page. + + + + + Gets the annotations array of this page. + + + + + Gets the annotations array of this page. + + + + + Adds an intra document link. + + The rect. + The destination page. + + + + Adds a link to the Web. + + The rect. + The URL. + + + + Adds a link to a file. + + The rect. + Name of the file. + + + + Gets or sets the custom values. + + + + + Gets the PdfResources object of this page. + + + + + Implements the interface because the primary function is internal. + + + + + Gets the resource name of the specified font within this page. + + + + + Tries to get the resource name of the specified font data within this page. + Returns null if no such font exists. + + + + + Gets the resource name of the specified font data within this page. + + + + + Gets the resource name of the specified image within this page. + + + + + Implements the interface because the primary function is internal. + + + + + Gets the resource name of the specified form within this page. + + + + + Implements the interface because the primary function is internal. + + + + + Hack to indicate that a page-level transparency group must be created. + + + + + Inherit values from parent node. + + + + + Add all inheritable values from the specified page to the specified values structure. + + + + + Predefined keys of this dictionary. + + + + + (Required) The type of PDF object that this dictionary describes; + must be Page for a page object. + + + + + (Required; must be an indirect reference) + The page tree node that is the immediate parent of this page object. + + + + + (Required if PieceInfo is present; optional otherwise; PDF 1.3) The date and time + when the page’s contents were most recently modified. If a page-piece dictionary + (PieceInfo) is present, the modification date is used to ascertain which of the + application data dictionaries that it contains correspond to the current content + of the page. + + + + + (Optional; PDF 1.3) A rectangle, expressed in default user space units, defining the + region to which the contents of the page should be clipped when output in a production + environment. Default value: the value of CropBox. + + + + + (Optional; PDF 1.3) A rectangle, expressed in default user space units, defining the + intended dimensions of the finished page after trimming. Default value: the value of + CropBox. + + + + + (Optional; PDF 1.3) A rectangle, expressed in default user space units, defining the + extent of the page’s meaningful content (including potential white space) as intended + by the page’s creator. Default value: the value of CropBox. + + + + + (Optional; PDF 1.4) A box color information dictionary specifying the colors and other + visual characteristics to be used in displaying guidelines on the screen for the various + page boundaries. If this entry is absent, the application should use its own current + default settings. + + + + + (Optional) A content stream describing the contents of this page. If this entry is absent, + the page is empty. The value may be either a single stream or an array of streams. If the + value is an array, the effect is as if all of the streams in the array were concatenated, + in order, to form a single stream. This allows PDF producers to create image objects and + other resources as they occur, even though they interrupt the content stream. The division + between streams may occur only at the boundaries between lexical tokens but is unrelated + to the page’s logical content or organization. Applications that consume or produce PDF + files are not required to preserve the existing structure of the Contents array. + + + + + (Optional; PDF 1.4) A group attributes dictionary specifying the attributes of the page’s + page group for use in the transparent imaging model. + + + + + (Optional) A stream object defining the page’s thumbnail image. + + + + + (Optional; PDF 1.1; recommended if the page contains article beads) An array of indirect + references to article beads appearing on the page. The beads are listed in the array in + natural reading order. + + + + + (Optional; PDF 1.1) The page’s display duration (also called its advance timing): the + maximum length of time, in seconds, that the page is displayed during presentations before + the viewer application automatically advances to the next page. By default, the viewer does + not advance automatically. + + + + + (Optional; PDF 1.1) A transition dictionary describing the transition effect to be used + when displaying the page during presentations. + + + + + (Optional) An array of annotation dictionaries representing annotations associated with + the page. + + + + + (Optional; PDF 1.2) An additional-actions dictionary defining actions to be performed + when the page is opened or closed. + + + + + (Optional; PDF 1.4) A metadata stream containing metadata for the page. + + + + + (Optional; PDF 1.3) A page-piece dictionary associated with the page. + + + + + (Required if the page contains structural content items; PDF 1.3) + The integer key of the page’s entry in the structural parent tree. + + + + + (Optional; PDF 1.3; indirect reference preferred) The digital identifier of + the page’s parent Web Capture content set. + + + + + (Optional; PDF 1.3) The page’s preferred zoom (magnification) factor: the factor + by which it should be scaled to achieve the natural display magnification. + + + + + (Optional; PDF 1.3) A separation dictionary containing information needed + to generate color separations for the page. + + + + + (Optional; PDF 1.5) A name specifying the tab order to be used for annotations + on the page. The possible values are R (row order), C (column order), + and S (structure order). + + + + + (Required if this page was created from a named page object; PDF 1.5) + The name of the originating page object. + + + + + (Optional; PDF 1.5) A navigation node dictionary representing the first node + on the page. + + + + + (Optional; PDF 1.6) A positive number giving the size of default user space units, + in multiples of 1/72 inch. The range of supported values is implementation-dependent. + + + + + (Optional; PDF 1.6) An array of viewport dictionaries specifying rectangular regions + of the page. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Predefined keys common to PdfPage and PdfPages. + + + + + (Required; inheritable) A dictionary containing any resources required by the page. + If the page requires no resources, the value of this entry should be an empty dictionary. + Omitting the entry entirely indicates that the resources are to be inherited from an + ancestor node in the page tree. + + + + + (Required; inheritable) A rectangle, expressed in default user space units, defining the + boundaries of the physical medium on which the page is intended to be displayed or printed. + + + + + (Optional; inheritable) A rectangle, expressed in default user space units, defining the + visible region of default user space. When the page is displayed or printed, its contents + are to be clipped (cropped) to this rectangle and then imposed on the output medium in some + implementation defined manner. Default value: the value of MediaBox. + + + + + (Optional; inheritable) The number of degrees by which the page should be rotated clockwise + when displayed or printed. The value must be a multiple of 90. Default value: 0. + + + + + Values inherited from a parent in the parent chain of a page tree. + + + + + Represents the pages of the document. + + + + + Gets the number of pages. + + + + + Gets the page with the specified index. + + + + + Finds a page by its id. Transforms it to PdfPage if necessary. + + + + + Creates a new PdfPage, adds it to the end of this document, and returns it. + + + + + Adds the specified PdfPage to the end of this document and maybe returns a new PdfPage object. + The value returned is a new object if the added page comes from a foreign document. + + + + + Creates a new PdfPage, inserts it at the specified position into this document, and returns it. + + + + + Inserts the specified PdfPage at the specified position to this document and maybe returns a new PdfPage object. + The value returned is a new object if the inserted page comes from a foreign document. + + + + + Inserts pages of the specified document into this document. + + The index in this document where to insert the page . + The document to be inserted. + The index of the first page to be inserted. + The number of pages to be inserted. + + + + Inserts all pages of the specified document into this document. + + The index in this document where to insert the page . + The document to be inserted. + + + + Inserts all pages of the specified document into this document. + + The index in this document where to insert the page . + The document to be inserted. + The index of the first page to be inserted. + + + + Removes the specified page from the document. + + + + + Removes the specified page from the document. + + + + + Moves a page within the page sequence. + + The page index before this operation. + The page index after this operation. + + + + Imports an external page. The elements of the imported page are cloned and added to this document. + Important: In contrast to PdfFormXObject adding an external page always make a deep copy + of their transitive closure. Any reuse of already imported objects is not intended because + any modification of an imported page must not change another page. + + + + + Helper function for ImportExternalPage. + + + + + Gets a PdfArray containing all pages of this document. The array must not be modified. + + + + + Replaces the page tree by a flat array of indirect references to the pages objects. + + + + + Recursively converts the page tree into a flat array. + + + + + Prepares the document for saving. + + + + + Gets the enumerator. + + + + + Predefined keys of this dictionary. + + + + + (Required) The type of PDF object that this dictionary describes; + must be Pages for a page tree node. + + + + + (Required except in root node; must be an indirect reference) + The page tree node that is the immediate parent of this one. + + + + + (Required) An array of indirect references to the immediate children of this node. + The children may be page objects or other page tree nodes. + + + + + (Required) The number of leaf nodes (page objects) that are descendants of this node + within the page tree. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents a direct real value. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The value. + + + + Gets the value as double. + + + + + Returns the real number as string. + + + + + Writes the real value with up to three digits. + + + + + Represents an indirect real value. This type is not used by PDFsharp. If it is imported from + an external PDF file, the value is converted into a direct object. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The value. + + + + Initializes a new instance of the class. + + The document. + The value. + + + + Gets or sets the value. + + + + + Returns the real as a culture invariant string. + + + + + Writes the real literal. + + + + + Represents a PDF rectangle value, that is internally an array with 4 real values. + + + + + Initializes a new instance of the PdfRectangle class. + + + + + Initializes a new instance of the PdfRectangle class with two points specifying + two diagonally opposite corners. Notice that in contrast to GDI+ convention the + 3rd and the 4th parameter specify a point and not a width. This is so much confusing + that this function is for internal use only. + + + + + Initializes a new instance of the PdfRectangle class with two points specifying + two diagonally opposite corners. + + + + + Initializes a new instance of the PdfRectangle class with the specified location and size. + + + + + Initializes a new instance of the PdfRectangle class with the specified XRect. + + + + + Initializes a new instance of the PdfRectangle class with the specified PdfArray. + + + + + Clones this instance. + + + + + Implements cloning this instance. + + + + + Tests whether all coordinate are zero. + + + + + Tests whether the specified object is a PdfRectangle and has equal coordinates. + + + + + Serves as a hash function for a particular type. + + + + + Tests whether two structures have equal coordinates. + + + + + Tests whether two structures differ in one or more coordinates. + + + + + Gets or sets the x-coordinate of the first corner of this PdfRectangle. + + + + + Gets or sets the y-coordinate of the first corner of this PdfRectangle. + + + + + Gets or sets the x-coordinate of the second corner of this PdfRectangle. + + + + + Gets or sets the y-coordinate of the second corner of this PdfRectangle. + + + + + Gets X2 - X1. + + + + + Gets Y2 - Y1. + + + + + Gets or sets the coordinates of the first point of this PdfRectangle. + + + + + Gets or sets the size of this PdfRectangle. + + + + + Determines if the specified point is contained within this PdfRectangle. + + + + + Determines if the specified point is contained within this PdfRectangle. + + + + + Determines if the rectangular region represented by rect is entirely contained within this PdfRectangle. + + + + + Determines if the rectangular region represented by rect is entirely contained within this PdfRectangle. + + + + + Returns the rectangle as an XRect object. + + + + + Returns the rectangle as a string in the form «[x1 y1 x2 y2]». + + + + + Writes the rectangle. + + + + + Gets the DebuggerDisplayAttribute text. + + + + + Represents an empty PdfRectangle. + + + + + Represents the cross-reference table of a PDF document. + It contains all indirect objects of a document. + + + + + Represents the relation between PdfObjectID and PdfReference for a PdfDocument. + + + + + Adds a cross reference entry to the table. Used when parsing the trailer. + + + + + Adds a PdfObject to the table. + + + + + Gets a cross reference entry from an object identifier. + Returns null if no object with the specified ID exists in the object table. + + + + + Indicates whether the specified object identifier is in the table. + + + + + Returns the next free object number. + + + + + Writes the xref section in pdf stream. + + + + + Gets an array of all object identifier. For debugging purposes only. + + + + + Gets an array of all cross references in ascending order by their object identifier. + + + + + Removes all objects that cannot be reached from the trailer. + Returns the number of removed objects. + + + + + Renumbers the objects starting at 1. + + + + + Checks the logical consistence for debugging purposes (useful after reconstruction work). + + + + + Calculates the transitive closure of the specified PdfObject, i.e. all indirect objects + recursively reachable from the specified object. + + + + + Calculates the transitive closure of the specified PdfObject with the specified depth, i.e. all indirect objects + recursively reachable from the specified object in up to maximally depth steps. + + + + + Gets the cross reference to an objects used for undefined indirect references. + + + + + Determines the encoding of a PdfString or PdfStringObject. + + + + + The characters of the string are actually bytes with an unknown or context specific meaning or encoding. + With this encoding the 8 high bits of each character is zero. + + + + + Not yet used by PDFsharp. + + + + + The characters of the string are actually bytes with PDF document encoding. + With this encoding the 8 high bits of each character is zero. + + + + + The characters of the string are actually bytes with Windows ANSI encoding. + With this encoding the 8 high bits of each character is zero. + + + + + Not yet used by PDFsharp. + + + + + Not yet used by PDFsharp. + + + + + The characters of the string are Unicode characters. + + + + + Internal wrapper for PdfStringEncoding. + + + + + Represents a direct text string value. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The value. + + + + Initializes a new instance of the class. + + The value. + The encoding. + + + + Gets the number of characters in this string. + + + + + Gets the encoding. + + + + + Gets a value indicating whether the string is a hexadecimal literal. + + + + + Gets the string value. + + + + + Gets or sets the string value for encryption purposes. + + + + + Returns the string. + + + + + Hack for document encoded bookmarks. + + + + + Writes the string DocEncoded. + + + + + Represents an indirect text string value. This type is not used by PDFsharp. If it is imported from + an external PDF file, the value is converted into a direct object. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The document. + The value. + + + + Initializes a new instance of the class. + + The value. + The encoding. + + + + Gets the number of characters in this string. + + + + + Gets or sets the encoding. + + + + + Gets a value indicating whether the string is a hexadecimal literal. + + + + + Gets or sets the value as string + + + + + Gets or sets the string value for encryption purposes. + + + + + Returns the string. + + + + + Writes the string literal with encoding DOCEncoded. + + + + + Represents a direct unsigned integer value. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Gets the value as integer. + + + + + Returns the unsigned integer as string. + + + + + Writes the integer as string. + + + + + Converts the value of this instance to an equivalent 64-bit unsigned integer. + + + + + Converts the value of this instance to an equivalent 8-bit signed integer. + + + + + Converts the value of this instance to an equivalent double-precision floating-point number. + + + + + Returns an undefined DateTime structure. + + + + + Converts the value of this instance to an equivalent single-precision floating-point number. + + + + + Converts the value of this instance to an equivalent Boolean value. + + + + + Converts the value of this instance to an equivalent 32-bit signed integer. + + + + + Converts the value of this instance to an equivalent 16-bit unsigned integer. + + + + + Converts the value of this instance to an equivalent 16-bit signed integer. + + + + + Converts the value of this instance to an equivalent . + + + + + Converts the value of this instance to an equivalent 8-bit unsigned integer. + + + + + Converts the value of this instance to an equivalent Unicode character. + + + + + Converts the value of this instance to an equivalent 64-bit signed integer. + + + + + Returns type code for 32-bit integers. + + + + + Converts the value of this instance to an equivalent number. + + + + + Returns null. + + + + + Converts the value of this instance to an equivalent 32-bit unsigned integer. + + + + + Represents an indirect integer value. This type is not used by PDFsharp. If it is imported from + an external PDF file, the value is converted into a direct object. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The value. + + + + Initializes a new instance of the class. + + The document. + The value. + + + + Gets the value as unsigned integer. + + + + + Returns the integer as string. + + + + + Writes the integer literal. + + + + + Represents the PDF document viewer preferences dictionary. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a value indicating whether to hide the viewer application’s tool + bars when the document is active. + + + + + Gets or sets a value indicating whether to hide the viewer application’s + menu bar when the document is active. + + + + + Gets or sets a value indicating whether to hide user interface elements in + the document’s window (such as scroll bars and navigation controls), + leaving only the document’s contents displayed. + + + + + Gets or sets a value indicating whether to resize the document’s window to + fit the size of the first displayed page. + + + + + Gets or sets a value indicating whether to position the document’s window + in the center of the screen. + + + + + Gets or sets a value indicating whether the window’s title bar + should display the document title taken from the Title entry of the document + information dictionary. If false, the title bar should instead display the name + of the PDF file containing the document. + + + + + The predominant reading order for text: LeftToRight or RightToLeft + (including vertical writing systems, such as Chinese, Japanese, and Korean). + This entry has no direct effect on the document’s contents or page numbering + but can be used to determine the relative positioning of pages when displayed + side by side or printed n-up. Default value: LeftToRight. + + + + + Predefined keys of this dictionary. + + + + + (Optional) A flag specifying whether to hide the viewer application’s tool + bars when the document is active. Default value: false. + + + + + (Optional) A flag specifying whether to hide the viewer application’s + menu bar when the document is active. Default value: false. + + + + + (Optional) A flag specifying whether to hide user interface elements in + the document’s window (such as scroll bars and navigation controls), + leaving only the document’s contents displayed. Default value: false. + + + + + (Optional) A flag specifying whether to resize the document’s window to + fit the size of the first displayed page. Default value: false. + + + + + (Optional) A flag specifying whether to position the document’s window + in the center of the screen. Default value: false. + + + + + (Optional; PDF 1.4) A flag specifying whether the window’s title bar + should display the document title taken from the Title entry of the document + information dictionary. If false, the title bar should instead display the name + of the PDF file containing the document. Default value: false. + + + + + (Optional) The document’s page mode, specifying how to display the document on + exiting full-screen mode: + UseNone Neither document outline nor thumbnail images visible + UseOutlines Document outline visible + UseThumbs Thumbnail images visible + UseOC Optional content group panel visible + This entry is meaningful only if the value of the PageMode entry in the catalog + dictionary is FullScreen; it is ignored otherwise. Default value: UseNone. + + + + + (Optional; PDF 1.3) The predominant reading order for text: + L2R Left to right + R2L Right to left (including vertical writing systems, such as Chinese, Japanese, and Korean) + This entry has no direct effect on the document’s contents or page numbering + but can be used to determine the relative positioning of pages when displayed + side by side or printed n-up. Default value: L2R. + + + + + (Optional; PDF 1.4) The name of the page boundary representing the area of a page + to be displayed when viewing the document on the screen. The value is the key + designating the relevant page boundary in the page object. If the specified page + boundary is not defined in the page object, its default value is used. + Default value: CropBox. + Note: This entry is intended primarily for use by prepress applications that + interpret or manipulate the page boundaries as described in Section 10.10.1, “Page Boundaries.” + Most PDF consumer applications disregard it. + + + + + (Optional; PDF 1.4) The name of the page boundary to which the contents of a page + are to be clipped when viewing the document on the screen. The value is the key + designating the relevant page boundary in the page object. If the specified page + boundary is not defined in the page object, its default value is used. + Default value: CropBox. + Note: This entry is intended primarily for use by prepress applications that + interpret or manipulate the page boundaries as described in Section 10.10.1, “Page Boundaries.” + Most PDF consumer applications disregard it. + + + + + (Optional; PDF 1.4) The name of the page boundary representing the area of a page + to be rendered when printing the document. The value is the key designating the + relevant page boundary in the page object. If the specified page boundary is not + defined in the page object, its default value is used. + Default value: CropBox. + Note: This entry is intended primarily for use by prepress applications that + interpret or manipulate the page boundaries as described in Section 10.10.1, “Page Boundaries.” + Most PDF consumer applications disregard it. + + + + + (Optional; PDF 1.4) The name of the page boundary to which the contents of a page + are to be clipped when printing the document. The value is the key designating the + relevant page boundary in the page object. If the specified page boundary is not + defined in the page object, its default value is used. + Default value: CropBox. + Note: This entry is intended primarily for use by prepress applications that interpret + or manipulate the page boundaries. Most PDF consumer applications disregard it. + + + + + (Optional; PDF 1.6) The page scaling option to be selected when a print dialog is + displayed for this document. Valid values are None, which indicates that the print + dialog should reflect no page scaling, and AppDefault, which indicates that + applications should use the current print scaling. If this entry has an unrecognized + value, applications should use the current print scaling. + Default value: AppDefault. + Note: If the print dialog is suppressed and its parameters are provided directly + by the application, the value of this entry should still be used. + + + + + Gets the KeysMeta for these keys. + + + + + Gets the KeysMeta of this dictionary type. + + + + + Represents trim margins added to the page. + + + + + Sets all four crop margins simultaneously. + + + + + Gets or sets the left crop margin. + + + + + Gets or sets the right crop margin. + + + + + Gets or sets the top crop margin. + + + + + Gets or sets the bottom crop margin. + + + + + Gets a value indicating whether this instance has at least one margin with a value other than zero. + + + + + Base namespace of PDFsharp. Most classes are implemented in nested namespaces like e. g. PdfSharp.Pdf. + + + + + + Specifies the orientation of a page. + + + + + The default page orientation. + + + + + The width and height of the page are reversed. + + + + + Identifies the most popular predefined page sizes. + + + + + The width or height of the page are set manually and override the PageSize property. + + + + + Identifies a paper sheet size of 841 mm times 1189 mm or 33.11 inch times 46.81 inch. + + + + + Identifies a paper sheet size of 594 mm times 841 mm or 23.39 inch times 33.1 inch. + + + + + Identifies a paper sheet size of 420 mm times 594 mm or 16.54 inch times 23.29 inch. + + + + + Identifies a paper sheet size of 297 mm times 420 mm or 11.69 inch times 16.54 inch. + + + + + Identifies a paper sheet size of 210 mm times 297 mm or 8.27 inch times 11.69 inch. + + + + + Identifies a paper sheet size of 148 mm times 210 mm or 5.83 inch times 8.27 inch. + + + + + Identifies a paper sheet size of 860 mm times 1220 mm. + + + + + Identifies a paper sheet size of 610 mm times 860 mm. + + + + + Identifies a paper sheet size of 430 mm times 610 mm. + + + + + Identifies a paper sheet size of 305 mm times 430 mm. + + + + + Identifies a paper sheet size of 215 mm times 305 mm. + + + + + Identifies a paper sheet size of 153 mm times 215 mm. + + + + + Identifies a paper sheet size of 1000 mm times 1414 mm or 39.37 inch times 55.67 inch. + + + + + Identifies a paper sheet size of 707 mm times 1000 mm or 27.83 inch times 39.37 inch. + + + + + Identifies a paper sheet size of 500 mm times 707 mm or 19.68 inch times 27.83 inch. + + + + + Identifies a paper sheet size of 353 mm times 500 mm or 13.90 inch times 19.68 inch. + + + + + Identifies a paper sheet size of 250 mm times 353 mm or 9.84 inch times 13.90 inch. + + + + + Identifies a paper sheet size of 176 mm times 250 mm or 6.93 inch times 9.84 inch. + + + + + Identifies a paper sheet size of 10 inch times 8 inch or 254 mm times 203 mm. + + + + + Identifies a paper sheet size of 13 inch times 8 inch or 330 mm times 203 mm. + + + + + Identifies a paper sheet size of 10.5 inch times 7.25 inch or 267 mm times 184 mm. + + + + + Identifies a paper sheet size of 10.5 inch times 8 inch 267 mm times 203 mm. + + + + + Identifies a paper sheet size of 11 inch times 8.5 inch 279 mm times 216 mm. + + + + + Identifies a paper sheet size of 14 inch times 8.5 inch 356 mm times 216 mm. + + + + + Identifies a paper sheet size of 17 inch times 11 inch or 432 mm times 279 mm. + + + + + Identifies a paper sheet size of 17 inch times 11 inch or 432 mm times 279 mm. + + + + + Identifies a paper sheet size of 19.25 inch times 15.5 inch 489 mm times 394 mm. + + + + + 20 ×Identifies a paper sheet size of 20 inch times 15 inch or 508 mm times 381 mm. + + + + + Identifies a paper sheet size of 21 inch times 16.5 inch 533 mm times 419 mm. + + + + + Identifies a paper sheet size of 22.5 inch times 17.5 inch 572 mm times 445 mm. + + + + + Identifies a paper sheet size of 23 inch times 18 inch or 584 mm times 457 mm. + + + + + Identifies a paper sheet size of 25 inch times 20 inch or 635 mm times 508 mm. + + + + + Identifies a paper sheet size of 28 inch times 23 inch or 711 mm times 584 mm. + + + + + Identifies a paper sheet size of 35 inch times 23.5 inch or 889 mm times 597 mm. + + + + + Identifies a paper sheet size of 45 inch times 35 inch 1143 times 889 mm. + + + + + Identifies a paper sheet size of 8.5 inch times 5.5 inch or 216 mm times 396 mm. + + + + + Identifies a paper sheet size of 8.5 inch times 13 inch or 216 mm times 330 mm. + + + + + Identifies a paper sheet size of 5.5 inch times 8.5 inch or 396 mm times 216 mm. + + + + + Identifies a paper sheet size of 10 inch times 14 inch. + + + + + Represents IDs for error and diagnostic messages generated by PDFsharp. + + + + + PSMsgID. + + + + + PSMsgID. + + + + + PSMsgID. + + + + + PSMsgID. + + + + + PSMsgID. + + + + + PSMsgID. + + + + + Converter from to . + + + + + Converts the specified page size enumeration to a pair of values in point. + + + + + Base class of all exceptions in the PDFsharp frame work. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The exception message. + + + + Initializes a new instance of the class. + + The exception message. + The inner exception. + + + + Version info base for all PDFsharp related assemblies. + + + + + The title of the product. + + + + + A characteristic description of the product. + + + + + The PDF producer information string. + TODO: Called Creator in MigraDoc??? + + + + + The PDF producer information string including VersionPatch. + + + + + The full version number. + + + + + The full version string. + + + + + The home page of this product. + + + + + Unused. + + + + + The company that created/owned the product. + + + + + The name the product. + + + + + The copyright information. + + + + + The trademark the product. + + + + + Unused. + + + + + The major version number of the product. + + + + + The minor version number of the product. + + + + + The build number of the product. + + + + + The patch number of the product. + + + + + The Version Prerelease String for NuGet. + + + + + E.g. "2005-01-01", for use in NuGet Script. + + + + + Use _ instead of blanks and special characters. Can be complemented with a suffix in the NuGet Script. + Nuspec Doc: The unique identifier for the package. This is the package name that is shown when packages + are listed using the Package Manager Console. These are also used when installing a package using the + Install-Package command within the Package Manager Console. Package IDs may not contain any spaces + or characters that are invalid in an URL. In general, they follow the same rules as .NET namespaces do. + So Foo.Bar is a valid ID, Foo! and Foo Bar are not. + + + + + Nuspec Doc: The human-friendly title of the package displayed in the Manage NuGet Packages dialog. + If none is specified, the ID is used instead. + + + + + Nuspec Doc: A comma-separated list of authors of the package code. + + + + + Nuspec Doc: A comma-separated list of the package creators. This is often the same list as in authors. + This is ignored when uploading the package to the NuGet.org Gallery. + + + + + Nuspec Doc: A long description of the package. This shows up in the right pane of the Add Package Dialog + as well as in the Package Manager Console when listing packages using the Get-Package command. + + + + + Nuspec Doc: A description of the changes made in each release of the package. This field only shows up + when the _Updates_ tab is selected and the package is an update to a previously installed package. + It is displayed where the Description would normally be displayed. + + + + + Nuspec Doc: A short description of the package. If specified, this shows up in the middle pane of the + Add Package Dialog. If not specified, a truncated version of the description is used instead. + + + + + Nuspec Doc: The locale ID for the package, such as en-us. + + + + + Nuspec Doc: A URL for the home page of the package. + + + http://www.pdfsharp.net/NuGetPackage_PDFsharp-GDI.ashx + http://www.pdfsharp.net/NuGetPackage_PDFsharp-WPF.ashx + + + + + Nuspec Doc: A URL for the image to use as the icon for the package in the Manage NuGet Packages + dialog box. This should be a 32x32-pixel .png file that has a transparent background. + + + + + Nuspec Doc: A link to the license that the package is under. + + + + + Nuspec Doc: A Boolean value that specifies whether the client needs to ensure that the package license (described by licenseUrl) is accepted before the package is installed. + + + + + Nuspec Doc: A space-delimited list of tags and keywords that describe the package. This information is used to help make sure users can find the package using + searches in the Add Package Reference dialog box or filtering in the Package Manager Console window. + + + + + The technology tag of the product: + (none) Pure .NET + -gdi : GDI+, + -wpf : WPF, + -hybrid : Both GDI+ and WPF (hybrid). + -sl : Silverlight + -wp : Windows Phone + -wrt : Windows RunTime + + + + + The Pdf-Sharp-String-Resources. + + + + + Loads the message from the resource associated with the enum type and formats it + using 'String.Format'. Because this function is intended to be used during error + handling it never raises an exception. + + The type of the parameter identifies the resource + and the name of the enum identifies the message in the resource. + Parameters passed through 'String.Format'. + The formatted message. + + + + Gets the localized message identified by the specified DomMsgID. + + + + + Gets the resource manager for this module. + + + + + Writes all messages defined by PSMsgID. + + + + + Version info of this assembly. + + + + + Computes Adler32 checksum for a stream of data. An Adler32 + checksum is not as reliable as a CRC32 checksum, but a lot faster to + compute. + + The specification for Adler32 may be found in RFC 1950. + ZLIB Compressed Data Format Specification version 3.3) + + + From that document: + + "ADLER32 (Adler-32 checksum) + This contains a checksum value of the uncompressed data + (excluding any dictionary data) computed according to Adler-32 + algorithm. This algorithm is a 32-bit extension and improvement + of the Fletcher algorithm, used in the ITU-T X.224 / ISO 8073 + standard. + + Adler-32 is composed of two sums accumulated per byte: s1 is + the sum of all bytes, s2 is the sum of all s1 values. Both sums + are done modulo 65521. s1 is initialized to 1, s2 to zero. The + Adler-32 checksum is stored as s2*65536 + s1 in most- + significant-byte first (network) order." + + "8.2. The Adler-32 algorithm + + The Adler-32 algorithm is much faster than the CRC32 algorithm yet + still provides an extremely low probability of undetected errors. + + The modulo on unsigned long accumulators can be delayed for 5552 + bytes, so the modulo operation time is negligible. If the bytes + are a, b, c, the second sum is 3a + 2b + c + 3, and so is position + and order sensitive, unlike the first sum, which is just a + checksum. That 65521 is prime is important to avoid a possible + large class of two-byte errors that leave the check unchanged. + (The Fletcher checksum uses 255, which is not prime and which also + makes the Fletcher check insensitive to single byte changes 0 - + 255.) + + The sum s1 is initialized to 1 instead of zero to make the length + of the sequence part of s2, so that the length does not have to be + checked separately. (Any sequence of zeroes has a Fletcher + checksum of zero.)" + + + + + + + largest prime smaller than 65536 + + + + + Returns the Adler32 data checksum computed so far. + + + + + Creates a new instance of the Adler32 class. + The checksum starts off with a value of 1. + + + + + Resets the Adler32 checksum to the initial value. + + + + + Updates the checksum with a byte value. + + + The data value to add. The high byte of the int is ignored. + + + + + Updates the checksum with an array of bytes. + + + The source of the data to update with. + + + + + Updates the checksum with the bytes taken from the array. + + + an array of bytes + + + the start of the data used for this update + + + the number of bytes to use for this update + + + + + Generate a table for a byte-wise 32-bit CRC calculation on the polynomial: + x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. + + Polynomials over GF(2) are represented in binary, one bit per coefficient, + with the lowest powers in the most significant bit. Then adding polynomials + is just exclusive-or, and multiplying a polynomial by x is a right shift by + one. If we call the above polynomial p, and represent a byte as the + polynomial q, also with the lowest power in the most significant bit (so the + byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, + where a mod b means the remainder after dividing a by b. + + This calculation is done using the shift-register method of multiplying and + taking the remainder. The register is initialized to zero, and for each + incoming bit, x^32 is added mod p to the register if the bit is a one (where + x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by + x (which is shifting right by one and adding x^32 mod p if the bit shifted + out is a one). We start with the highest power (least significant bit) of + q and repeat for all eight bits of q. + + The table is simply the CRC of all possible eight bit values. This is all + the information needed to generate CRC's on data a byte at a time for all + combinations of CRC register values and incoming bytes. + + + + + The crc data checksum so far. + + + + + Returns the CRC32 data checksum computed so far. + + + + + Resets the CRC32 data checksum as if no update was ever called. + + + + + Updates the checksum with the int bval. + + + the byte is taken as the lower 8 bits of value + + + + + Updates the checksum with the bytes taken from the array. + + + buffer an array of bytes + + + + + Adds the byte array to the data checksum. + + + The buffer which contains the data + + + The offset in the buffer where the data starts + + + The number of data bytes to update the CRC with. + + + + + Interface to compute a data checksum used by checked input/output streams. + A data checksum can be updated by one byte or with a byte array. After each + update the value of the current checksum can be returned by calling + getValue. The complete checksum object can also be reset + so it can be used again with new data. + + + + + Returns the data checksum computed so far. + + + + + Resets the data checksum as if no update was ever called. + + + + + Adds one byte to the data checksum. + + + the data value to add. The high byte of the int is ignored. + + + + + Updates the data checksum with the bytes taken from the array. + + + buffer an array of bytes + + + + + Adds the byte array to the data checksum. + + + The buffer which contains the data + + + The offset in the buffer where the data starts + + + the number of data bytes to add. + + + + + SharpZipBaseException is the base exception class for the SharpZipLibrary. + All library exceptions are derived from this. + + NOTE: Not all exceptions thrown will be derived from this class. + A variety of other exceptions are possible for example + + + + Initializes a new instance of the SharpZipBaseException class. + + + + + Initializes a new instance of the SharpZipBaseException class with a specified error message. + + A message describing the exception. + + + + Initializes a new instance of the SharpZipBaseException class with a specified + error message and a reference to the inner exception that is the cause of this exception. + + A message describing the exception. + The inner exception + + + + This is the Deflater class. The deflater class compresses input + with the deflate algorithm described in RFC 1951. It has several + compression levels and three different strategies described below. + + This class is not thread safe. This is inherent in the API, due + to the split of deflate and setInput. + + Author of the original java version: Jochen Hoenicke + + + + + The best and slowest compression level. This tries to find very + long and distant string repetitions. + + + + + The worst but fastest compression level. + + + + + The default compression level. + + + + + This level won't compress at all but output uncompressed blocks. + + + + + The compression method. This is the only method supported so far. + There is no need to use this constant at all. + + + + + Creates a new deflater with default compression level. + + + + + Creates a new deflater with given compression level. + + + the compression level, a value between NO_COMPRESSION + and BEST_COMPRESSION, or DEFAULT_COMPRESSION. + + if lvl is out of range. + + + + Creates a new deflater with given compression level. + + + the compression level, a value between NO_COMPRESSION + and BEST_COMPRESSION. + + + true, if we should suppress the Zlib/RFC1950 header at the + beginning and the adler checksum at the end of the output. This is + useful for the GZIP/PKZIP formats. + + if lvl is out of range. + + + + Resets the deflater. The deflater acts afterwards as if it was + just created with the same compression level and strategy as it + had before. + + + + + Gets the current adler checksum of the data that was processed so far. + + + + + Gets the number of input bytes processed so far. + + + + + Gets the number of output bytes so far. + + + + + Flushes the current input block. Further calls to deflate() will + produce enough output to inflate everything in the current input + block. This is not part of Sun's JDK so I have made it package + private. It is used by DeflaterOutputStream to implement + flush(). + + + + + Finishes the deflater with the current input block. It is an error + to give more input after this method was called. This method must + be called to force all bytes to be flushed. + + + + + Returns true if the stream was finished and no more output bytes + are available. + + + + + Returns true, if the input buffer is empty. + You should then call setInput(). + NOTE: This method can also return true when the stream + was finished. + + + + + Sets the data which should be compressed next. This should be only + called when needsInput indicates that more input is needed. + If you call setInput when needsInput() returns false, the + previous input that is still pending will be thrown away. + The given byte array should not be changed, before needsInput() returns + true again. + This call is equivalent to setInput(input, 0, input.length). + + + the buffer containing the input data. + + + if the buffer was finished() or ended(). + + + + + Sets the data which should be compressed next. This should be + only called when needsInput indicates that more input is needed. + The given byte array should not be changed, before needsInput() returns + true again. + + + the buffer containing the input data. + + + the start of the data. + + + the number of data bytes of input. + + + if the buffer was Finish()ed or if previous input is still pending. + + + + + Sets the compression level. There is no guarantee of the exact + position of the change, but if you call this when needsInput is + true the change of compression level will occur somewhere near + before the end of the so far given input. + + + the new compression level. + + + + + Get current compression level + + Returns the current compression level + + + + Sets the compression strategy. Strategy is one of + DEFAULT_STRATEGY, HUFFMAN_ONLY and FILTERED. For the exact + position where the strategy is changed, the same as for + SetLevel() applies. + + + The new compression strategy. + + + + + Deflates the current input block with to the given array. + + + The buffer where compressed data is stored + + + The number of compressed bytes added to the output, or 0 if either + IsNeedingInput() or IsFinished returns true or length is zero. + + + + + Deflates the current input block to the given array. + + + Buffer to store the compressed data. + + + Offset into the output array. + + + The maximum number of bytes that may be stored. + + + The number of compressed bytes added to the output, or 0 if either + needsInput() or finished() returns true or length is zero. + + + If Finish() was previously called. + + + If offset or length don't match the array length. + + + + + Sets the dictionary which should be used in the deflate process. + This call is equivalent to setDictionary(dict, 0, dict.Length). + + + the dictionary. + + + if SetInput () or Deflate () were already called or another dictionary was already set. + + + + + Sets the dictionary which should be used in the deflate process. + The dictionary is a byte array containing strings that are + likely to occur in the data which should be compressed. The + dictionary is not stored in the compressed output, only a + checksum. To decompress the output you need to supply the same + dictionary again. + + + The dictionary data + + + The index where dictionary information commences. + + + The number of bytes in the dictionary. + + + If SetInput () or Deflate() were already called or another dictionary was already set. + + + + + Compression level. + + + + + If true no Zlib/RFC1950 headers or footers are generated + + + + + The current state. + + + + + The total bytes of output written. + + + + + The pending output. + + + + + The deflater engine. + + + + + This class contains constants used for deflation. + + + + + Set to true to enable debugging + + + + + Written to Zip file to identify a stored block + + + + + Identifies static tree in Zip file + + + + + Identifies dynamic tree in Zip file + + + + + Header flag indicating a preset dictionary for deflation + + + + + Sets internal buffer sizes for Huffman encoding + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Internal compression engine constant + + + + + Strategies for deflater + + + + + The default strategy + + + + + This strategy will only allow longer string repetitions. It is + useful for random data with a small character set. + + + + + This strategy will not look for string repetitions at all. It + only encodes with Huffman trees (which means, that more common + characters get a smaller encoding. + + + + + Low level compression engine for deflate algorithm which uses a 32K sliding window + with secondary compression from Huffman/Shannon-Fano codes. + + + + + Construct instance with pending buffer + + + Pending buffer to use + > + + + + Deflate drives actual compression of data + + True to flush input buffers + Finish deflation with the current input. + Returns true if progress has been made. + + + + Sets input data to be deflated. Should only be called when NeedsInput() + returns true + + The buffer containing input data. + The offset of the first byte of data. + The number of bytes of data to use as input. + + + + Determines if more input is needed. + + Return true if input is needed via SetInput + + + + Set compression dictionary + + The buffer containing the dictionary data + The offset in the buffer for the first byte of data + The length of the dictionary data. + + + + Reset internal state + + + + + Reset Adler checksum + + + + + Get current value of Adler checksum + + + + + Total data processed + + + + + Get/set the deflate strategy + + + + + Set the deflate level (0-9) + + The value to set the level to. + + + + Fill the window + + + + + Inserts the current string in the head hash and returns the previous + value for this hash. + + The previous hash value + + + + Find the best (longest) string in the window matching the + string starting at strstart. + + Preconditions: + + strstart + MAX_MATCH <= window.length. + + + True if a match greater than the minimum length is found + + + + Hashtable, hashing three characters to an index for window, so + that window[index]..window[index+2] have this hash code. + Note that the array should really be unsigned short, so you need + to and the values with 0xffff. + + + + + prev[index & WMASK] points to the previous index that has the + same hash code as the string starting at index. This way + entries with the same hash code are in a linked list. + Note that the array should really be unsigned short, so you need + to and the values with 0xffff. + + + + + Points to the current character in the window. + + + + + lookahead is the number of characters starting at strstart in + window that are valid. + So window[strstart] until window[strstart+lookahead-1] are valid + characters. + + + + + This array contains the part of the uncompressed stream that + is of relevance. The current character is indexed by strstart. + + + + + The current compression function. + + + + + The input data for compression. + + + + + The total bytes of input read. + + + + + The offset into inputBuf, where input data starts. + + + + + The end offset of the input data. + + + + + The adler checksum + + + + + This is the DeflaterHuffman class. + + This class is not thread safe. This is inherent in the API, due + to the split of Deflate and SetInput. + + author of the original java version : Jochen Hoenicke + + + + + Resets the internal state of the tree + + + + + Check that all frequencies are zero + + + At least one frequency is non-zero + + + + + Set static codes and length + + new codes + length for new codes + + + + Build dynamic codes and lengths + + + + + Get encoded length + + Encoded length, the sum of frequencies * lengths + + + + Scan a literal or distance tree to determine the frequencies of the codes + in the bit length tree. + + + + + Write tree values + + Tree to write + + + + Pending buffer to use + + + + + Construct instance with pending buffer + + Pending buffer to use + + + + Reset internal state + + + + + Write all trees to pending buffer + + The number/rank of treecodes to send. + + + + Compress current buffer writing data to pending buffer + + + + + Flush block to output with no compression + + Data to write + Index of first byte to write + Count of bytes to write + True if this is the last block + + + + Flush block to output with compression + + Data to flush + Index of first byte to flush + Count of bytes to flush + True if this is the last block + + + + Get value indicating if internal buffer is full + + true if buffer is full + + + + Add literal to buffer + + Literal value to add to buffer. + Value indicating internal buffer is full + + + + Add distance code and length to literal and distance trees + + Distance code + Length + Value indicating if internal buffer is full + + + + Reverse the bits of a 16 bit value. + + Value to reverse bits + Value with bits reversed + + + + This class stores the pending output of the Deflater. + + Author of the original java version: Jochen Hoenicke + + + + + Construct instance with default buffer size + + + + + Inflater is used to decompress data that has been compressed according + to the "deflate" standard described in rfc1951. + + By default Zlib (rfc1950) headers and footers are expected in the input. + You can use constructor public Inflater(bool noHeader) passing true + if there is no Zlib header information + + The usage is as following. First you have to set some input with + SetInput(), then Inflate() it. If inflate doesn't + inflate any bytes there may be three reasons: +
    +
  • IsNeedingInput() returns true because the input buffer is empty. + You have to provide more input with SetInput(). + NOTE: IsNeedingInput() also returns true when, the stream is finished. +
  • +
  • IsNeedingDictionary() returns true, you have to provide a preset + dictionary with SetDictionary().
  • +
  • IsFinished returns true, the inflater has finished.
  • +
+ Once the first output byte is produced, a dictionary will not be + needed at a later stage. + + Author of the original java version: John Leuner, Jochen Hoenicke +
+
+ + + Copy lengths for literal codes 257..285 + + + + + Extra bits for literal codes 257..285 + + + + + Copy offsets for distance codes 0..29 + + + + + Extra bits for distance codes + + + + + These are the possible states for an inflater + + + + + This variable contains the current state. + + + + + The adler checksum of the dictionary or of the decompressed + stream, as it is written in the header resp. footer of the + compressed stream. + Only valid if mode is DECODE_DICT or DECODE_CHKSUM. + + + + + The number of bits needed to complete the current state. This + is valid, if mode is DECODE_DICT, DECODE_CHKSUM, + DECODE_HUFFMAN_LENBITS or DECODE_HUFFMAN_DISTBITS. + + + + + True, if the last block flag was set in the last block of the + inflated stream. This means that the stream ends after the + current block. + + + + + The total number of inflated bytes. + + + + + The total number of bytes set with setInput(). This is not the + value returned by the TotalIn property, since this also includes the + unprocessed input. + + + + + This variable stores the noHeader flag that was given to the constructor. + True means, that the inflated stream doesn't contain a Zlib header or + footer. + + + + + Creates a new inflater or RFC1951 decompressor + RFC1950/Zlib headers and footers will be expected in the input data + + + + + Creates a new inflater. + + + True if no RFC1950/Zlib header and footer fields are expected in the input data + + This is used for GZIPed/Zipped input. + + For compatibility with + Sun JDK you should provide one byte of input more than needed in + this case. + + + + + Resets the inflater so that a new stream can be decompressed. All + pending input and output will be discarded. + + + + + Decodes a zlib/RFC1950 header. + + + False if more input is needed. + + + The header is invalid. + + + + + Decodes the dictionary checksum after the deflate header. + + + False if more input is needed. + + + + + Decodes the huffman encoded symbols in the input stream. + + + false if more input is needed, true if output window is + full or the current block ends. + + + if deflated stream is invalid. + + + + + Decodes the adler checksum after the deflate stream. + + + false if more input is needed. + + + If checksum doesn't match. + + + + + Decodes the deflated stream. + + + false if more input is needed, or if finished. + + + if deflated stream is invalid. + + + + + Sets the preset dictionary. This should only be called, if + needsDictionary() returns true and it should set the same + dictionary, that was used for deflating. The getAdler() + function returns the checksum of the dictionary needed. + + + The dictionary. + + + + + Sets the preset dictionary. This should only be called, if + needsDictionary() returns true and it should set the same + dictionary, that was used for deflating. The getAdler() + function returns the checksum of the dictionary needed. + + + The dictionary. + + + The index into buffer where the dictionary starts. + + + The number of bytes in the dictionary. + + + No dictionary is needed. + + + The adler checksum for the buffer is invalid + + + + + Sets the input. This should only be called, if needsInput() + returns true. + + + the input. + + + + + Sets the input. This should only be called, if needsInput() + returns true. + + + The source of input data + + + The index into buffer where the input starts. + + + The number of bytes of input to use. + + + No input is needed. + + + The index and/or count are wrong. + + + + + Inflates the compressed stream to the output buffer. If this + returns 0, you should check, whether IsNeedingDictionary(), + IsNeedingInput() or IsFinished() returns true, to determine why no + further output is produced. + + + the output buffer. + + + The number of bytes written to the buffer, 0 if no further + output can be produced. + + + if buffer has length 0. + + + if deflated stream is invalid. + + + + + Inflates the compressed stream to the output buffer. If this + returns 0, you should check, whether needsDictionary(), + needsInput() or finished() returns true, to determine why no + further output is produced. + + + the output buffer. + + + the offset in buffer where storing starts. + + + the maximum number of bytes to output. + + + the number of bytes written to the buffer, 0 if no further output can be produced. + + + if count is less than 0. + + + if the index and / or count are wrong. + + + if deflated stream is invalid. + + + + + Returns true, if the input buffer is empty. + You should then call setInput(). + NOTE: This method also returns true when the stream is finished. + + + + + Returns true, if a preset dictionary is needed to inflate the input. + + + + + Returns true, if the inflater has finished. This means, that no + input is needed and no output can be produced. + + + + + Gets the adler checksum. This is either the checksum of all + uncompressed bytes returned by inflate(), or if needsDictionary() + returns true (and thus no output was yet produced) this is the + adler checksum of the expected dictionary. + + + the adler checksum. + + + + + Gets the total number of output bytes returned by Inflate(). + + + the total number of output bytes. + + + + + Gets the total number of processed compressed input bytes. + + + The total number of bytes of processed input bytes. + + + + + Gets the number of unprocessed input bytes. Useful, if the end of the + stream is reached and you want to further process the bytes after + the deflate stream. + + + The number of bytes of the input which have not been processed. + + + + + Huffman tree used for inflation + + + + + Literal length tree + + + + + Distance tree + + + + + Constructs a Huffman tree from the array of code lengths. + + + the array of code lengths + + + + + Reads the next symbol from input. The symbol is encoded using the + huffman tree. + + + input the input source. + + + the next symbol, or -1 if not enough input is available. + + + + + This class is general purpose class for writing data to a buffer. + + It allows you to write bits as well as bytes + Based on DeflaterPending.java + + Author of the original java version: Jochen Hoenicke + + + + + Internal work buffer + + + + + construct instance using default buffer size of 4096 + + + + + construct instance using specified buffer size + + + size to use for internal buffer + + + + + Clear internal state/buffers + + + + + Write a byte to buffer + + + The value to write + + + + + Write a short value to buffer LSB first + + + The value to write. + + + + + write an integer LSB first + + The value to write. + + + + Write a block of data to buffer + + data to write + offset of first byte to write + number of bytes to write + + + + The number of bits written to the buffer + + + + + Align internal buffer on a byte boundary + + + + + Write bits to internal buffer + + source of bits + number of bits to write + + + + Write a short value to internal buffer most significant byte first + + value to write + + + + Indicates if buffer has been flushed + + + + + Flushes the pending buffer into the given output array. If the + output array is to small, only a partial flush is done. + + The output array. + The offset into output array. + The maximum number of bytes to store. + The number of bytes flushed. + + + + Convert internal buffer to byte array. + Buffer is empty on completion + + + The internal buffer contents converted to a byte array. + + + + + A special stream deflating or compressing the bytes that are + written to it. It uses a Deflater to perform actual deflating.
+ Authors of the original java version: Tom Tromey, Jochen Hoenicke +
+
+ + + Creates a new DeflaterOutputStream with a default Deflater and default buffer size. + + + the output stream where deflated output should be written. + + + + + Creates a new DeflaterOutputStream with the given Deflater and + default buffer size. + + + the output stream where deflated output should be written. + + + the underlying deflater. + + + + + Creates a new DeflaterOutputStream with the given Deflater and + buffer size. + + + The output stream where deflated output is written. + + + The underlying deflater to use + + + The buffer size in bytes to use when deflating (minimum value 512) + + + bufsize is less than or equal to zero. + + + baseOutputStream does not support writing + + + deflater instance is null + + + + + Finishes the stream by calling finish() on the deflater. + + + Not all input is deflated + + + + + Get/set flag indicating ownership of the underlying stream. + When the flag is true will close the underlying stream also. + + + + + Allows client to determine if an entry can be patched after its added + + + + + Get/set the password used for encryption. + + When set to null or if the password is empty no encryption is performed + + + + Encrypt a block of data + + + Data to encrypt. NOTE the original contents of the buffer are lost + + + Offset of first byte in buffer to encrypt + + + Number of bytes in buffer to encrypt + + + + + Initializes encryption keys based on given . + + The password. + + + + Encrypt a single byte + + + The encrypted value + + + + + Update encryption keys + + + + + Deflates everything in the input buffers. This will call + def.deflate() until all bytes from the input buffers + are processed. + + + + + Gets value indicating stream can be read from + + + + + Gets a value indicating if seeking is supported for this stream + This property always returns false + + + + + Get value indicating if this stream supports writing + + + + + Get current length of stream + + + + + Gets the current position within the stream. + + Any attempt to set position + + + + Sets the current position of this stream to the given value. Not supported by this class! + + The offset relative to the to seek. + The to seek from. + The new position in the stream. + Any access + + + + Sets the length of this stream to the given value. Not supported by this class! + + The new stream length. + Any access + + + + Read a byte from stream advancing position by one + + The byte read cast to an int. THe value is -1 if at the end of the stream. + Any access + + + + Read a block of bytes from stream + + The buffer to store read data in. + The offset to start storing at. + The maximum number of bytes to read. + The actual number of bytes read. Zero if end of stream is detected. + Any access + + + + Asynchronous reads are not supported a NotSupportedException is always thrown + + The buffer to read into. + The offset to start storing data at. + The number of bytes to read + The async callback to use. + The state to use. + Returns an + Any access + + + + Asynchronous writes arent supported, a NotSupportedException is always thrown + + The buffer to write. + The offset to begin writing at. + The number of bytes to write. + The to use. + The state object. + Returns an IAsyncResult. + Any access + + + + Flushes the stream by calling Flush on the deflater and then + on the underlying stream. This ensures that all bytes are flushed. + + + + + Calls and closes the underlying + stream when is true. + + + + + Writes a single byte to the compressed output stream. + + + The byte value. + + + + + Writes bytes from an array to the compressed stream. + + + The byte array + + + The offset into the byte array where to start. + + + The number of bytes to write. + + + + + This buffer is used temporarily to retrieve the bytes from the + deflater and write them to the underlying output stream. + + + + + The deflater which is used to deflate the stream. + + + + + Base stream the deflater depends on. + + + + + An input buffer customised for use by + + + The buffer supports decryption of incoming data. + + + + + Initialise a new instance of with a default buffer size + + The stream to buffer. + + + + Initialise a new instance of + + The stream to buffer. + The size to use for the buffer + A minimum buffer size of 1KB is permitted. Lower sizes are treated as 1KB. + + + + Get the length of bytes bytes in the + + + + + Get the contents of the raw data buffer. + + This may contain encrypted data. + + + + Get the number of useable bytes in + + + + + Get the contents of the clear text buffer. + + + + + Get/set the number of bytes available + + + + + Call passing the current clear text buffer contents. + + The inflater to set input for. + + + + Fill the buffer from the underlying input stream. + + + + + Read a buffer directly from the input stream + + The buffer to fill + Returns the number of bytes read. + + + + Read a buffer directly from the input stream + + The buffer to read into + The offset to start reading data into. + The number of bytes to read. + Returns the number of bytes read. + + + + Read clear text data from the input stream. + + The buffer to add data to. + The offset to start adding data at. + The number of bytes to read. + Returns the number of bytes actually read. + + + + Read a from the input stream. + + Returns the byte read. + + + + Read an in little endian byte order. + + The short value read case to an int. + + + + Read an in little endian byte order. + + The int value read. + + + + Read a in little endian byte order. + + The long value read. + + + + This filter stream is used to decompress data compressed using the "deflate" + format. The "deflate" format is described in RFC 1951. + + This stream may form the basis for other decompression filters, such + as the GZipInputStream. + + Author of the original java version: John Leuner. + + + + + Create an InflaterInputStream with the default decompressor + and a default buffer size of 4KB. + + + The InputStream to read bytes from + + + + + Create an InflaterInputStream with the specified decompressor + and a default buffer size of 4KB. + + + The source of input data + + + The decompressor used to decompress data read from baseInputStream + + + + + Create an InflaterInputStream with the specified decompressor + and the specified buffer size. + + + The InputStream to read bytes from + + + The decompressor to use + + + Size of the buffer to use + + + + + Get/set flag indicating ownership of underlying stream. + When the flag is true will close the underlying stream also. + + + The default value is true. + + + + + Skip specified number of bytes of uncompressed data + + + Number of bytes to skip + + + The number of bytes skipped, zero if the end of + stream has been reached + + + The number of bytes to skip is less than or equal to zero. + + + + + Clear any cryptographic state. + + + + + Returns 0 once the end of the stream (EOF) has been reached. + Otherwise returns 1. + + + + + Fills the buffer with more data to decompress. + + + Stream ends early + + + + + Gets a value indicating whether the current stream supports reading + + + + + Gets a value of false indicating seeking is not supported for this stream. + + + + + Gets a value of false indicating that this stream is not writeable. + + + + + A value representing the length of the stream in bytes. + + + + + The current position within the stream. + Throws a NotSupportedException when attempting to set the position + + Attempting to set the position + + + + Flushes the baseInputStream + + + + + Sets the position within the current stream + Always throws a NotSupportedException + + The relative offset to seek to. + The defining where to seek from. + The new position in the stream. + Any access + + + + Set the length of the current stream + Always throws a NotSupportedException + + The new length value for the stream. + Any access + + + + Writes a sequence of bytes to stream and advances the current position + This method always throws a NotSupportedException + + Thew buffer containing data to write. + The offset of the first byte to write. + The number of bytes to write. + Any access + + + + Writes one byte to the current stream and advances the current position + Always throws a NotSupportedException + + The byte to write. + Any access + + + + Entry point to begin an asynchronous write. Always throws a NotSupportedException. + + The buffer to write data from + Offset of first byte to write + The maximum number of bytes to write + The method to be called when the asynchronous write operation is completed + A user-provided object that distinguishes this particular asynchronous write request from other requests + An IAsyncResult that references the asynchronous write + Any access + + + + Closes the input stream. When + is true the underlying stream is also closed. + + + + + Reads decompressed data into the provided buffer byte array + + + The array to read and decompress data into + + + The offset indicating where the data should be placed + + + The number of bytes to decompress + + The number of bytes read. Zero signals the end of stream + + Inflater needs a dictionary + + + + + Decompressor for this stream + + + + + Input buffer for this stream. + + + + + Base stream the inflater reads from. + + + + + Flag indicating wether this instance has been closed or not. + + + + + Flag indicating wether this instance is designated the stream owner. + When closing if this flag is true the underlying stream is closed. + + + + + Contains the output from the Inflation process. + We need to have a window so that we can refer backwards into the output stream + to repeat stuff.
+ Author of the original java version: John Leuner +
+
+ + + Write a byte to this output window + + value to write + + if window is full + + + + + Append a byte pattern already in the window itself + + length of pattern to copy + distance from end of window pattern occurs + + If the repeated data overflows the window + + + + + Copy from input manipulator to internal window + + source of data + length of data to copy + the number of bytes copied + + + + Copy dictionary to window + + source dictionary + offset of start in source dictionary + length of dictionary + + If window isnt empty + + + + + Get remaining unfilled space in window + + Number of bytes left in window + + + + Get bytes available for output in window + + Number of bytes filled + + + + Copy contents of window to output + + buffer to copy to + offset to start at + number of bytes to count + The number of bytes copied + + If a window underflow occurs + + + + + Reset by clearing window so GetAvailable returns 0 + + + + + This class allows us to retrieve a specified number of bits from + the input buffer, as well as copy big byte blocks. + + It uses an int buffer to store up to 31 bits for direct + manipulation. This guarantees that we can get at least 16 bits, + but we only need at most 15, so this is all safe. + + There are some optimizations in this class, for example, you must + never peek more than 8 bits more than needed, and you must first + peek bits before you may drop them. This is not a general purpose + class but optimized for the behaviour of the Inflater. + + Authors of the original java version: John Leuner, Jochen Hoenicke + + + + + Constructs a default StreamManipulator with all buffers empty + + + + + Get the next sequence of bits but don't increase input pointer. bitCount must be + less or equal 16 and if this call succeeds, you must drop + at least n - 8 bits in the next call. + + The number of bits to peek. + + the value of the bits, or -1 if not enough bits available. */ + + + + + Drops the next n bits from the input. You should have called PeekBits + with a bigger or equal n before, to make sure that enough bits are in + the bit buffer. + + The number of bits to drop. + + + + Gets the next n bits and increases input pointer. This is equivalent + to followed by , except for correct error handling. + + The number of bits to retrieve. + + the value of the bits, or -1 if not enough bits available. + + + + + Gets the number of bits available in the bit buffer. This must be + only called when a previous PeekBits() returned -1. + + + the number of bits available. + + + + + Gets the number of bytes available. + + + The number of bytes available. + + + + + Skips to the next byte boundary. + + + + + Returns true when SetInput can be called + + + + + Copies bytes from input buffer to output buffer starting + at output[offset]. You have to make sure, that the buffer is + byte aligned. If not enough bytes are available, copies fewer + bytes. + + + The buffer to copy bytes to. + + + The offset in the buffer at which copying starts + + + The length to copy, 0 is allowed. + + + The number of bytes copied, 0 if no bytes were available. + + + Length is less than zero + + + Bit buffer isnt byte aligned + + + + + Resets state and empties internal buffers + + + + + Add more input for consumption. + Only call when IsNeedingInput returns true + + data to be input + offset of first byte of input + number of bytes of input to add. + + + + Determines how entries are tested to see if they should use Zip64 extensions or not. + + + + + Zip64 will not be forced on entries during processing. + + An entry can have this overridden if required ZipEntry.ForceZip64" + + + + Zip64 should always be used. + + + + + #ZipLib will determine use based on entry values when added to archive. + + + + + The kind of compression used for an entry in an archive + + + + + A direct copy of the file contents is held in the archive + + + + + Common Zip compression method using a sliding dictionary + of up to 32KB and secondary compression from Huffman/Shannon-Fano trees + + + + + An extension to deflate with a 64KB window. Not supported by #Zip currently + + + + + BZip2 compression. Not supported by #Zip. + + + + + WinZip special for AES encryption, Now supported by #Zip. + + + + + Identifies the encryption algorithm used for an entry + + + + + No encryption has been used. + + + + + Encrypted using PKZIP 2.0 or 'classic' encryption. + + + + + DES encryption has been used. + + + + + RC2 encryption has been used for encryption. + + + + + Triple DES encryption with 168 bit keys has been used for this entry. + + + + + Triple DES with 112 bit keys has been used for this entry. + + + + + AES 128 has been used for encryption. + + + + + AES 192 has been used for encryption. + + + + + AES 256 has been used for encryption. + + + + + RC2 corrected has been used for encryption. + + + + + Blowfish has been used for encryption. + + + + + Twofish has been used for encryption. + + + + + RC4 has been used for encryption. + + + + + An unknown algorithm has been used for encryption. + + + + + Defines the contents of the general bit flags field for an archive entry. + + + + + Bit 0 if set indicates that the file is encrypted + + + + + Bits 1 and 2 - Two bits defining the compression method (only for Method 6 Imploding and 8,9 Deflating) + + + + + Bit 3 if set indicates a trailing data desciptor is appended to the entry data + + + + + Bit 4 is reserved for use with method 8 for enhanced deflation + + + + + Bit 5 if set indicates the file contains Pkzip compressed patched data. + Requires version 2.7 or greater. + + + + + Bit 6 if set indicates strong encryption has been used for this entry. + + + + + Bit 7 is currently unused + + + + + Bit 8 is currently unused + + + + + Bit 9 is currently unused + + + + + Bit 10 is currently unused + + + + + Bit 11 if set indicates the filename and + comment fields for this file must be encoded using UTF-8. + + + + + Bit 12 is documented as being reserved by PKware for enhanced compression. + + + + + Bit 13 if set indicates that values in the local header are masked to hide + their actual values, and the central directory is encrypted. + + + Used when encrypting the central directory contents. + + + + + Bit 14 is documented as being reserved for use by PKware + + + + + Bit 15 is documented as being reserved for use by PKware + + + + + This class contains constants used for Zip format files + + + + + The version made by field for entries in the central header when created by this library + + + This is also the Zip version for the library when comparing against the version required to extract + for an entry. See ZipEntry.CanDecompress. + + + + + The version made by field for entries in the central header when created by this library + + + This is also the Zip version for the library when comparing against the version required to extract + for an entry. See ZipInputStream.CanDecompressEntry. + + + + + The minimum version required to support strong encryption + + + + + The minimum version required to support strong encryption + + + + + Version indicating AES encryption + + + + + The version required for Zip64 extensions (4.5 or higher) + + + + + Size of local entry header (excluding variable length fields at end) + + + + + Size of local entry header (excluding variable length fields at end) + + + + + Size of Zip64 data descriptor + + + + + Size of data descriptor + + + + + Size of data descriptor + + + + + Size of central header entry (excluding variable fields) + + + + + Size of central header entry + + + + + Size of end of central record (excluding variable fields) + + + + + Size of end of central record (excluding variable fields) + + + + + Size of 'classic' cryptographic header stored before any entry data + + + + + Size of cryptographic header stored before entry data + + + + + Signature for local entry header + + + + + Signature for local entry header + + + + + Signature for spanning entry + + + + + Signature for spanning entry + + + + + Signature for temporary spanning entry + + + + + Signature for temporary spanning entry + + + + + Signature for data descriptor + + + This is only used where the length, Crc, or compressed size isnt known when the + entry is created and the output stream doesnt support seeking. + The local entry cannot be 'patched' with the correct values in this case + so the values are recorded after the data prefixed by this header, as well as in the central directory. + + + + + Signature for data descriptor + + + This is only used where the length, Crc, or compressed size isnt known when the + entry is created and the output stream doesnt support seeking. + The local entry cannot be 'patched' with the correct values in this case + so the values are recorded after the data prefixed by this header, as well as in the central directory. + + + + + Signature for central header + + + + + Signature for central header + + + + + Signature for Zip64 central file header + + + + + Signature for Zip64 central file header + + + + + Signature for Zip64 central directory locator + + + + + Signature for archive extra data signature (were headers are encrypted). + + + + + Central header digitial signature + + + + + Central header digitial signature + + + + + End of central directory record signature + + + + + End of central directory record signature + + + + + Default encoding used for string conversion. 0 gives the default system OEM code page. + Dont use unicode encodings if you want to be Zip compatible! + Using the default code page isnt the full solution necessarily + there are many variable factors, codepage 850 is often a good choice for + European users, however be careful about compatibility. + + + + + Convert a portion of a byte array to a string. + + + Data to convert to string + + + Number of bytes to convert starting from index 0 + + + data[0]..data[count - 1] converted to a string + + + + + Convert a byte array to string + + + Byte array to convert + + + dataconverted to a string + + + + + Convert a byte array to string + + The applicable general purpose bits flags + + Byte array to convert + + The number of bytes to convert. + + dataconverted to a string + + + + + Convert a byte array to string + + + Byte array to convert + + The applicable general purpose bits flags + + dataconverted to a string + + + + + Convert a string to a byte array + + + String to convert to an array + + Converted array + + + + Convert a string to a byte array + + The applicable general purpose bits flags + + String to convert to an array + + Converted array + + + + Initialise default instance of ZipConstants + + + Private to prevent instances being created. + + + + + Represents exception conditions specific to Zip archive handling + + + + + Initializes a new instance of the ZipException class. + + + + + Initializes a new instance of the ZipException class with a specified error message. + + The error message that explains the reason for the exception. + + + + Initialise a new instance of ZipException. + + A message describing the error. + The exception that is the cause of the current exception. + +
+
diff --git a/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/RestSharp.xml b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/RestSharp.xml new file mode 100644 index 00000000..5069712d --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/RestSharp.xml @@ -0,0 +1,3024 @@ + + + + RestSharp + + + + + Tries to Authenticate with the credentials of the currently logged in user, or impersonate a user + + + + + Authenticate with the credentials of the currently logged in user + + + + + Authenticate by impersonation + + + + + + + Authenticate by impersonation, using an existing ICredentials instance + + + + + + + + + Base class for OAuth 2 Authenticators. + + + Since there are many ways to authenticate in OAuth2, + this is used as a base class to differentiate between + other authenticators. + + Any other OAuth2 authenticators must derive from this + abstract class. + + + + + Access token to be used when authenticating. + + + + + Initializes a new instance of the class. + + + The access token. + + + + + Gets the access token. + + + + + The OAuth 2 authenticator using URI query parameter. + + + Based on http://tools.ietf.org/html/draft-ietf-oauth-v2-10#section-5.1.2 + + + + + Initializes a new instance of the class. + + + The access token. + + + + + The OAuth 2 authenticator using the authorization request header field. + + + Based on http://tools.ietf.org/html/draft-ietf-oauth-v2-10#section-5.1.1 + + + + + Stores the Authorization header value as "[tokenType] accessToken". used for performance. + + + + + Initializes a new instance of the class. + + + The access token. + + + + + Initializes a new instance of the class. + + + The access token. + + + The token type. + + + + + All text parameters are UTF-8 encoded (per section 5.1). + + + + + + Generates a random 16-byte lowercase alphanumeric string. + + + + + + + Generates a timestamp based on the current elapsed seconds since '01/01/1970 0000 GMT" + + + + + + + Generates a timestamp based on the elapsed seconds of a given time since '01/01/1970 0000 GMT" + + + A specified point in time. + + + + + The set of characters that are unreserved in RFC 2396 but are NOT unreserved in RFC 3986. + + + + + + URL encodes a string based on section 5.1 of the OAuth spec. + Namely, percent encoding with [RFC3986], avoiding unreserved characters, + upper-casing hexadecimal characters, and UTF-8 encoding for text value pairs. + + The value to escape. + The escaped value. + + The method is supposed to take on + RFC 3986 behavior if certain elements are present in a .config file. Even if this + actually worked (which in my experiments it doesn't), we can't rely on every + host actually having this configuration element present. + + + + + + + URL encodes a string based on section 5.1 of the OAuth spec. + Namely, percent encoding with [RFC3986], avoiding unreserved characters, + upper-casing hexadecimal characters, and UTF-8 encoding for text value pairs. + + + + + + + Sorts a collection of key-value pairs by name, and then value if equal, + concatenating them into a single string. This string should be encoded + prior to, or after normalization is run. + + + + + + + + Sorts a by name, and then value if equal. + + A collection of parameters to sort + A sorted parameter collection + + + + Creates a request URL suitable for making OAuth requests. + Resulting URLs must exclude port 80 or port 443 when accompanied by HTTP and HTTPS, respectively. + Resulting URLs must be lower case. + + + The original request URL + + + + + Creates a request elements concatentation value to send with a request. + This is also known as the signature base. + + + + The request's HTTP method type + The request URL + The request's parameters + A signature base string + + + + Creates a signature value given a signature base and the consumer secret. + This method is used when the token secret is currently unknown. + + + The hashing method + The signature base + The consumer key + + + + + Creates a signature value given a signature base and the consumer secret. + This method is used when the token secret is currently unknown. + + + The hashing method + The treatment to use on a signature value + The signature base + The consumer key + + + + + Creates a signature value given a signature base and the consumer secret and a known token secret. + + + The hashing method + The signature base + The consumer secret + The token secret + + + + + Creates a signature value given a signature base and the consumer secret and a known token secret. + + + The hashing method + The treatment to use on a signature value + The signature base + The consumer secret + The token secret + + + + + A class to encapsulate OAuth authentication flow. + + + + + + Generates a instance to pass to an + for the purpose of requesting an + unauthorized request token. + + The HTTP method for the intended request + + + + + + Generates a instance to pass to an + for the purpose of requesting an + unauthorized request token. + + The HTTP method for the intended request + Any existing, non-OAuth query parameters desired in the request + + + + + + Generates a instance to pass to an + for the purpose of exchanging a request token + for an access token authorized by the user at the Service Provider site. + + The HTTP method for the intended request + + + + + Generates a instance to pass to an + for the purpose of exchanging a request token + for an access token authorized by the user at the Service Provider site. + + The HTTP method for the intended request + + Any existing, non-OAuth query parameters desired in the request + + + + Generates a instance to pass to an + for the purpose of exchanging user credentials + for an access token authorized by the user at the Service Provider site. + + The HTTP method for the intended request + + Any existing, non-OAuth query parameters desired in the request + + + + + + + + + + + + + Allows control how class and property names and values are deserialized by XmlAttributeDeserializer + + + + + The name to use for the serialized element + + + + + Sets if the property to Deserialize is an Attribute or Element (Default: false) + + + + + Wrapper for System.Xml.Serialization.XmlSerializer. + + + + + Types of parameters that can be added to requests + + + + + Data formats + + + + + HTTP method to use when making requests + + + + + Format strings for commonly-used date formats + + + + + .NET format string for ISO 8601 date format + + + + + .NET format string for roundtrip date format + + + + + Status for responses (surprised?) + + + + + Extension method overload! + + + + + Save a byte array to a file + + Bytes to save + Full path to save file to + + + + Read a stream into a byte array + + Stream to read + byte[] + + + + Copies bytes from one stream to another + + The input stream. + The output stream. + + + + Converts a byte array to a string, using its byte order mark to convert it to the right encoding. + http://www.shrinkrays.net/code-snippets/csharp/an-extension-method-for-converting-a-byte-array-to-a-string.aspx + + An array of bytes to convert + The byte as a string. + + + + Decodes an HTML-encoded string and returns the decoded string. + + The HTML string to decode. + The decoded text. + + + + Decodes an HTML-encoded string and sends the resulting output to a TextWriter output stream. + + The HTML string to decode + The TextWriter output stream containing the decoded string. + + + + HTML-encodes a string and sends the resulting output to a TextWriter output stream. + + The string to encode. + The TextWriter output stream containing the encoded string. + + + + Reflection extensions + + + + + Retrieve an attribute from a member (property) + + Type of attribute to retrieve + Member to retrieve attribute from + + + + + Retrieve an attribute from a type + + Type of attribute to retrieve + Type to retrieve attribute from + + + + + Checks a type to see if it derives from a raw generic (e.g. List[[]]) + + + + + + + + Find a value from a System.Enum by trying several possible variants + of the string value of the enum. + + Type of enum + Value for which to search + The culture used to calculate the name variants + + + + + Convert a to a instance. + + The response status. + + responseStatus + + + + Uses Uri.EscapeDataString() based on recommendations on MSDN + http://blogs.msdn.com/b/yangxind/archive/2006/11/09/don-t-use-net-system-uri-unescapedatastring-in-url-decoding.aspx + + + + + Check that a string is not null or empty + + String to check + bool + + + + Remove underscores from a string + + String to process + string + + + + Parses most common JSON date formats + + JSON value to parse + + DateTime + + + + Remove leading and trailing " from a string + + String to parse + String + + + + Checks a string to see if it matches a regex + + String to check + Pattern to match + bool + + + + Converts a string to pascal case + + String to convert + + string + + + + Converts a string to pascal case with the option to remove underscores + + String to convert + Option to remove underscores + + + + + + Converts a string to camel case + + String to convert + + String + + + + Convert the first letter of a string to lower case + + String to convert + string + + + + Checks to see if a string is all uppper case + + String to check + bool + + + + Add underscores to a pascal-cased string + + String to convert + string + + + + Add dashes to a pascal-cased string + + String to convert + string + + + + Add an undescore prefix to a pascasl-cased string + + + + + + + Add spaces to a pascal-cased string + + String to convert + string + + + + Return possible variants of a name for name matching. + + String to convert + The culture to use for conversion + IEnumerable<string> + + + + XML Extension Methods + + + + + Returns the name of an element with the namespace if specified + + Element name + XML Namespace + + + + + Container for files to be uploaded with requests + + + + + Creates a file parameter from an array of bytes. + + The parameter name to use in the request. + The data to use as the file's contents. + The filename to use in the request. + The content type to use in the request. + The + + + + Creates a file parameter from an array of bytes. + + The parameter name to use in the request. + The data to use as the file's contents. + The filename to use in the request. + The using the default content type. + + + + The length of data to be sent + + + + + Provides raw data for file + + + + + Name of the file to use when uploading + + + + + MIME content type of file + + + + + Name of the parameter + + + + + HttpWebRequest wrapper (async methods) + + + HttpWebRequest wrapper + + + HttpWebRequest wrapper (sync methods) + + + + + Always send a multipart/form-data request - even when no Files are present. + + + + + An alternative to RequestBody, for when the caller already has the byte array. + + + + + Execute an async POST-style request with the specified HTTP Method. + + + The HTTP method to execute. + + + + + Execute an async GET-style request with the specified HTTP Method. + + + The HTTP method to execute. + + + + + Creates an IHttp + + + + + + Default constructor + + + + + Execute a POST request + + + + + Execute a PUT request + + + + + Execute a GET request + + + + + Execute a HEAD request + + + + + Execute an OPTIONS request + + + + + Execute a DELETE request + + + + + Execute a PATCH request + + + + + Execute a MERGE request + + + + + Execute a GET-style request with the specified HTTP Method. + + The HTTP method to execute. + + + + + Execute a POST-style request with the specified HTTP Method. + + The HTTP method to execute. + + + + + True if this HTTP request has any HTTP parameters + + + + + True if this HTTP request has any HTTP cookies + + + + + True if a request body has been specified + + + + + True if files have been set to be uploaded + + + + + Always send a multipart/form-data request - even when no Files are present. + + + + + UserAgent to be sent with request + + + + + Timeout in milliseconds to be used for the request + + + + + The number of milliseconds before the writing or reading times out. + + + + + System.Net.ICredentials to be sent with request + + + + + The System.Net.CookieContainer to be used for the request + + + + + The method to use to write the response instead of reading into RawBytes + + + + + Collection of files to be sent with request + + + + + Whether or not HTTP 3xx response redirects should be automatically followed + + + + + X509CertificateCollection to be sent with request + + + + + Maximum number of automatic redirects to follow if FollowRedirects is true + + + + + Determine whether or not the "default credentials" (e.g. the user account under which the current process is running) + will be sent along to the server. + + + + + HTTP headers to be sent with request + + + + + HTTP parameters (QueryString or Form values) to be sent with request + + + + + HTTP cookies to be sent with request + + + + + Request body to be sent with request + + + + + Content type of the request body. + + + + + An alternative to RequestBody, for when the caller already has the byte array. + + + + + URL to call for this request + + + + + Flag to send authorisation header with the HttpWebRequest + + + + + Proxy info to be sent with request + + + + + Representation of an HTTP cookie + + + + + Comment of the cookie + + + + + Comment of the cookie + + + + + Indicates whether the cookie should be discarded at the end of the session + + + + + Domain of the cookie + + + + + Indicates whether the cookie is expired + + + + + Date and time that the cookie expires + + + + + Indicates that this cookie should only be accessed by the server + + + + + Name of the cookie + + + + + Path of the cookie + + + + + Port of the cookie + + + + + Indicates that the cookie should only be sent over secure channels + + + + + Date and time the cookie was created + + + + + Value of the cookie + + + + + Version of the cookie + + + + + Container for HTTP file + + + + + The length of data to be sent + + + + + Provides raw data for file + + + + + Name of the file to use when uploading + + + + + MIME content type of file + + + + + Name of the parameter + + + + + Representation of an HTTP header + + + + + Name of the header + + + + + Value of the header + + + + + Representation of an HTTP parameter (QueryString or Form value) + + + + + Name of the parameter + + + + + Value of the parameter + + + + + HTTP response data + + + + + HTTP response data + + + + + MIME content type of response + + + + + Length in bytes of the response content + + + + + Encoding of the response content + + + + + String representation of response content + + + + + HTTP response status code + + + + + Description of HTTP status returned + + + + + Response content + + + + + The URL that actually responded to the content (different from request if redirected) + + + + + HttpWebResponse.Server + + + + + Headers returned by server with the response + + + + + Cookies returned by server with the response + + + + + Status of the request. Will return Error for transport errors. + HTTP errors will still return ResponseStatus.Completed, check StatusCode instead + + + + + Transport or other non-HTTP error generated while attempting request + + + + + Exception thrown when error is encountered. + + + + + Default constructor + + + + + MIME content type of response + + + + + Length in bytes of the response content + + + + + Encoding of the response content + + + + + Lazy-loaded string representation of response content + + + + + HTTP response status code + + + + + Description of HTTP status returned + + + + + Response content + + + + + The URL that actually responded to the content (different from request if redirected) + + + + + HttpWebResponse.Server + + + + + Headers returned by server with the response + + + + + Cookies returned by server with the response + + + + + Status of the request. Will return Error for transport errors. + HTTP errors will still return ResponseStatus.Completed, check StatusCode instead + + + + + Transport or other non-HTTP error generated while attempting request + + + + + Exception thrown when error is encountered. + + + + + + + + + + + + + + + + + + + + + + + + Executes a GET-style request and callback asynchronously, authenticating if needed + + Request to be executed + Callback function to be executed upon completion providing access to the async handle. + The HTTP method to execute + + + + Executes a POST-style request and callback asynchronously, authenticating if needed + + Request to be executed + Callback function to be executed upon completion providing access to the async handle. + The HTTP method to execute + + + + Executes a GET-style request and callback asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + Callback function to be executed upon completion + The HTTP method to execute + + + + Executes a GET-style request and callback asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + Callback function to be executed upon completion + The HTTP method to execute + + + + Executes the request and callback asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + The cancellation token + + + + Executes the request asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + + + + Executes a GET-style request asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + + + + Executes a GET-style request asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + The cancellation token + + + + Executes a POST-style request asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + + + + Executes a POST-style request asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + The cancellation token + + + + Executes the request and callback asynchronously, authenticating if needed + + Request to be executed + The cancellation token + + + + Executes the request asynchronously, authenticating if needed + + Request to be executed + + + + Executes a GET-style asynchronously, authenticating if needed + + Request to be executed + + + + Executes a GET-style asynchronously, authenticating if needed + + Request to be executed + The cancellation token + + + + Executes a POST-style asynchronously, authenticating if needed + + Request to be executed + + + + Executes a POST-style asynchronously, authenticating if needed + + Request to be executed + The cancellation token + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + X509CertificateCollection to be sent with request + + + + + Adds a file to the Files collection to be included with a POST or PUT request + (other methods do not support file uploads). + + The parameter name to use in the request + Full path to file to upload + This request + + + + Adds the bytes to the Files collection with the specified file name + + The parameter name to use in the request + The file data + The file name to use for the uploaded file + This request + + + + Adds the bytes to the Files collection with the specified file name and content type + + The parameter name to use in the request + The file data + The file name to use for the uploaded file + The MIME type of the file to upload + This request + + + + Serializes obj to format specified by RequestFormat, but passes xmlNamespace if using the default XmlSerializer + The default format is XML. Change RequestFormat if you wish to use a different serialization format. + + The object to serialize + The XML namespace to use when serializing + This request + + + + Serializes obj to data format specified by RequestFormat and adds it to the request body. + The default format is XML. Change RequestFormat if you wish to use a different serialization format. + + The object to serialize + This request + + + + Serializes obj to JSON format and adds it to the request body. + + The object to serialize + This request + + + + Serializes obj to XML format and adds it to the request body. + + The object to serialize + This request + + + + Serializes obj to format specified by RequestFormat, but passes xmlNamespace if using the default XmlSerializer + Serializes obj to XML format and passes xmlNamespace then adds it to the request body. + + The object to serialize + The XML namespace to use when serializing + This request + + + + Calls AddParameter() for all public, readable properties specified in the includedProperties list + + + request.AddObject(product, "ProductId", "Price", ...); + + The object with properties to add as parameters + The names of the properties to include + This request + + + + Calls AddParameter() for all public, readable properties of obj + + The object with properties to add as parameters + This request + + + + Add the parameter to the request + + Parameter to add + + + + + Adds a HTTP parameter to the request (QueryString for GET, DELETE, OPTIONS and HEAD; Encoded form for POST and PUT) + + Name of the parameter + Value of the parameter + This request + + + + Adds a parameter to the request. There are five types of parameters: + - GetOrPost: Either a QueryString value or encoded form value based on method + - HttpHeader: Adds the name/value pair to the HTTP request's Headers collection + - UrlSegment: Inserted into URL if there is a matching url token e.g. {AccountId} + - Cookie: Adds the name/value pair to the HTTP request's Cookies collection + - RequestBody: Used by AddBody() (not recommended to use directly) + + Name of the parameter + Value of the parameter + The type of parameter to add + This request + + + + Shortcut to AddParameter(name, value, HttpHeader) overload + + Name of the header to add + Value of the header to add + + + + + Shortcut to AddParameter(name, value, Cookie) overload + + Name of the cookie to add + Value of the cookie to add + + + + + Shortcut to AddParameter(name, value, UrlSegment) overload + + Name of the segment to add + Value of the segment to add + + + + + Shortcut to AddParameter(name, value, QueryString) overload + + Name of the parameter to add + Value of the parameter to add + + + + + Always send a multipart/form-data request - even when no Files are present. + + + + + Serializer to use when writing JSON request bodies. Used if RequestFormat is Json. + By default the included JsonSerializer is used (currently using JSON.NET default serialization). + + + + + Serializer to use when writing XML request bodies. Used if RequestFormat is Xml. + By default the included XmlSerializer is used. + + + + + Set this to write response to Stream rather than reading into memory. + + + + + Container of all HTTP parameters to be passed with the request. + See AddParameter() for explanation of the types of parameters that can be passed + + + + + Container of all the files to be uploaded with the request. + + + + + Determines what HTTP method to use for this request. Supported methods: GET, POST, PUT, DELETE, HEAD, OPTIONS + Default is GET + + + + + The Resource URL to make the request against. + Tokens are substituted with UrlSegment parameters and match by name. + Should not include the scheme or domain. Do not include leading slash. + Combined with RestClient.BaseUrl to assemble final URL: + {BaseUrl}/{Resource} (BaseUrl is scheme + domain, e.g. http://example.com) + + + // example for url token replacement + request.Resource = "Products/{ProductId}"; + request.AddParameter("ProductId", 123, ParameterType.UrlSegment); + + + + + Serializer to use when writing XML request bodies. Used if RequestFormat is Xml. + By default XmlSerializer is used. + + + + + Used by the default deserializers to determine where to start deserializing from. + Can be used to skip container or root elements that do not have corresponding deserialzation targets. + + + + + Used by the default deserializers to explicitly set which date format string to use when parsing dates. + + + + + Used by XmlDeserializer. If not specified, XmlDeserializer will flatten response by removing namespaces from element names. + + + + + In general you would not need to set this directly. Used by the NtlmAuthenticator. + + + + + Timeout in milliseconds to be used for the request. This timeout value overrides a timeout set on the RestClient. + + + + + The number of milliseconds before the writing or reading times out. This timeout value overrides a timeout set on the RestClient. + + + + + How many attempts were made to send this Request? + + + This Number is incremented each time the RestClient sends the request. + Useful when using Asynchronous Execution with Callbacks + + + + + Determine whether or not the "default credentials" (e.g. the user account under which the current process is running) + will be sent along to the server. The default is false. + + + + + Container for data sent back from API + + + + + The RestRequest that was made to get this RestResponse + + + Mainly for debugging if ResponseStatus is not OK + + + + + MIME content type of response + + + + + Length in bytes of the response content + + + + + Encoding of the response content + + + + + String representation of response content + + + + + HTTP response status code + + + + + Description of HTTP status returned + + + + + Response content + + + + + The URL that actually responded to the content (different from request if redirected) + + + + + HttpWebResponse.Server + + + + + Cookies returned by server with the response + + + + + Headers returned by server with the response + + + + + Status of the request. Will return Error for transport errors. + HTTP errors will still return ResponseStatus.Completed, check StatusCode instead + + + + + Transport or other non-HTTP error generated while attempting request + + + + + Exceptions thrown during the request, if any. + + Will contain only network transport or framework exceptions thrown during the request. + HTTP protocol errors are handled by RestSharp and will not appear here. + + + + Container for data sent back from API including deserialized data + + Type of data to deserialize to + + + + Deserialized entity data + + + + + Parameter container for REST requests + + + + + Return a human-readable representation of this parameter + + String + + + + Name of the parameter + + + + + Value of the parameter + + + + + Type of the parameter + + + + + Client to translate RestRequests into Http requests and process response result + + + + + Executes the request and callback asynchronously, authenticating if needed + + Request to be executed + Callback function to be executed upon completion providing access to the async handle. + + + + Executes a GET-style request and callback asynchronously, authenticating if needed + + Request to be executed + Callback function to be executed upon completion providing access to the async handle. + The HTTP method to execute + + + + Executes a POST-style request and callback asynchronously, authenticating if needed + + Request to be executed + Callback function to be executed upon completion providing access to the async handle. + The HTTP method to execute + + + + Executes the request and callback asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + Callback function to be executed upon completion + + + + Executes a GET-style request and callback asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + Callback function to be executed upon completion + The HTTP method to execute + + + + Executes a POST-style request and callback asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + Callback function to be executed upon completion + The HTTP method to execute + + + + Executes a GET-style request asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + + + + Executes a GET-style request asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + The cancellation token + + + + Executes a POST-style request asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + + + + Executes a POST-style request asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + The cancellation token + + + + Executes the request asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + + + + Executes the request asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + The cancellation token + + + + Executes the request asynchronously, authenticating if needed + + Request to be executed + + + + Executes a GET-style asynchronously, authenticating if needed + + Request to be executed + + + + Executes a GET-style asynchronously, authenticating if needed + + Request to be executed + The cancellation token + + + + Executes a POST-style asynchronously, authenticating if needed + + Request to be executed + + + + Executes a POST-style asynchronously, authenticating if needed + + Request to be executed + The cancellation token + + + + Executes the request asynchronously, authenticating if needed + + Request to be executed + The cancellation token + + + + Default constructor that registers default content handlers + + + + + Sets the BaseUrl property for requests made by this client instance + + + + + + Sets the BaseUrl property for requests made by this client instance + + + + + + Registers a content handler to process response content + + MIME content type of the response content + Deserializer to use to process content + + + + Remove a content handler for the specified MIME content type + + MIME content type to remove + + + + Remove all content handlers + + + + + Retrieve the handler for the specified MIME content type + + MIME content type to retrieve + IDeserializer instance + + + + Assembles URL to call based on parameters, method and resource + + RestRequest to execute + Assembled System.Uri + + + + Executes the specified request and downloads the response data + + Request to execute + Response data + + + + Executes the request and returns a response, authenticating if needed + + Request to be executed + RestResponse + + + + Executes the specified request and deserializes the response content using the appropriate content handler + + Target deserialization type + Request to execute + RestResponse[[T]] with deserialized data in Data property + + + + Parameters included with every request made with this instance of RestClient + If specified in both client and request, the request wins + + + + + Maximum number of redirects to follow if FollowRedirects is true + + + + + X509CertificateCollection to be sent with request + + + + + Proxy to use for requests made by this client instance. + Passed on to underlying WebRequest if set. + + + + + Default is true. Determine whether or not requests that result in + HTTP status codes of 3xx should follow returned redirect + + + + + The CookieContainer used for requests made by this client instance + + + + + UserAgent to use for requests made by this client instance + + + + + Timeout in milliseconds to use for requests made by this client instance + + + + + The number of milliseconds before the writing or reading times out. + + + + + Whether to invoke async callbacks using the SynchronizationContext.Current captured when invoked + + + + + Authenticator to use for requests made by this client instance + + + + + Combined with Request.Resource to construct URL for request + Should include scheme and domain without trailing slash. + + + client.BaseUrl = new Uri("http://example.com"); + + + + + Executes the request and callback asynchronously, authenticating if needed + + The IRestClient this method extends + Request to be executed + Callback function to be executed upon completion + + + + Executes the request and callback asynchronously, authenticating if needed + + The IRestClient this method extends + Target deserialization type + Request to be executed + Callback function to be executed upon completion providing access to the async handle + + + + Add a parameter to use on every request made with this client instance + + The IRestClient instance + Parameter to add + + + + + Removes a parameter from the default parameters that are used on every request made with this client instance + + The IRestClient instance + The name of the parameter that needs to be removed + + + + + Adds a HTTP parameter (QueryString for GET, DELETE, OPTIONS and HEAD; Encoded form for POST and PUT) + Used on every request made by this client instance + + The IRestClient instance + Name of the parameter + Value of the parameter + This request + + + + Adds a parameter to the request. There are four types of parameters: + - GetOrPost: Either a QueryString value or encoded form value based on method + - HttpHeader: Adds the name/value pair to the HTTP request's Headers collection + - UrlSegment: Inserted into URL if there is a matching url token e.g. {AccountId} + - RequestBody: Used by AddBody() (not recommended to use directly) + + The IRestClient instance + Name of the parameter + Value of the parameter + The type of parameter to add + This request + + + + Shortcut to AddDefaultParameter(name, value, HttpHeader) overload + + The IRestClient instance + Name of the header to add + Value of the header to add + + + + + Shortcut to AddDefaultParameter(name, value, UrlSegment) overload + + The IRestClient instance + Name of the segment to add + Value of the segment to add + + + + + Container for data used to make requests + + + + + Default constructor + + + + + Sets Method property to value of method + + Method to use for this request + + + + Sets Resource property + + Resource to use for this request + + + + Sets Resource and Method properties + + Resource to use for this request + Method to use for this request + + + + Sets Resource property + + Resource to use for this request + + + + Sets Resource and Method properties + + Resource to use for this request + Method to use for this request + + + + Adds a file to the Files collection to be included with a POST or PUT request + (other methods do not support file uploads). + + The parameter name to use in the request + Full path to file to upload + This request + + + + Adds the bytes to the Files collection with the specified file name + + The parameter name to use in the request + The file data + The file name to use for the uploaded file + This request + + + + Adds the bytes to the Files collection with the specified file name and content type + + The parameter name to use in the request + The file data + The file name to use for the uploaded file + The MIME type of the file to upload + This request + + + + Adds the bytes to the Files collection with the specified file name and content type + + The parameter name to use in the request + A function that writes directly to the stream. Should NOT close the stream. + The file name to use for the uploaded file + This request + + + + Adds the bytes to the Files collection with the specified file name and content type + + The parameter name to use in the request + A function that writes directly to the stream. Should NOT close the stream. + The file name to use for the uploaded file + The MIME type of the file to upload + This request + + + + Serializes obj to format specified by RequestFormat, but passes xmlNamespace if using the default XmlSerializer + The default format is XML. Change RequestFormat if you wish to use a different serialization format. + + The object to serialize + The XML namespace to use when serializing + This request + + + + Serializes obj to data format specified by RequestFormat and adds it to the request body. + The default format is XML. Change RequestFormat if you wish to use a different serialization format. + + The object to serialize + This request + + + + Serializes obj to JSON format and adds it to the request body. + + The object to serialize + This request + + + + Serializes obj to XML format and adds it to the request body. + + The object to serialize + This request + + + + Serializes obj to format specified by RequestFormat, but passes xmlNamespace if using the default XmlSerializer + Serializes obj to XML format and passes xmlNamespace then adds it to the request body. + + The object to serialize + The XML namespace to use when serializing + This request + + + + Calls AddParameter() for all public, readable properties specified in the includedProperties list + + + request.AddObject(product, "ProductId", "Price", ...); + + The object with properties to add as parameters + The names of the properties to include + This request + + + + Calls AddParameter() for all public, readable properties of obj + + The object with properties to add as parameters + This request + + + + Add the parameter to the request + + Parameter to add + + + + + Adds a HTTP parameter to the request (QueryString for GET, DELETE, OPTIONS and HEAD; Encoded form for POST and PUT) + + Name of the parameter + Value of the parameter + This request + + + + Adds a parameter to the request. There are four types of parameters: + - GetOrPost: Either a QueryString value or encoded form value based on method + - HttpHeader: Adds the name/value pair to the HTTP request's Headers collection + - UrlSegment: Inserted into URL if there is a matching url token e.g. {AccountId} + - RequestBody: Used by AddBody() (not recommended to use directly) + + Name of the parameter + Value of the parameter + The type of parameter to add + This request + + + + Shortcut to AddParameter(name, value, HttpHeader) overload + + Name of the header to add + Value of the header to add + + + + + Shortcut to AddParameter(name, value, Cookie) overload + + Name of the cookie to add + Value of the cookie to add + + + + + Shortcut to AddParameter(name, value, UrlSegment) overload + + Name of the segment to add + Value of the segment to add + + + + + Shortcut to AddParameter(name, value, QueryString) overload + + Name of the parameter to add + Value of the parameter to add + + + + + Internal Method so that RestClient can increase the number of attempts + + + + + Always send a multipart/form-data request - even when no Files are present. + + + + + Serializer to use when writing JSON request bodies. Used if RequestFormat is Json. + By default the included JsonSerializer is used (currently using JSON.NET default serialization). + + + + + Serializer to use when writing XML request bodies. Used if RequestFormat is Xml. + By default the included XmlSerializer is used. + + + + + Set this to write response to Stream rather than reading into memory. + + + + + Determine whether or not the "default credentials" (e.g. the user account under which the current process is running) + will be sent along to the server. The default is false. + + + + + Container of all HTTP parameters to be passed with the request. + See AddParameter() for explanation of the types of parameters that can be passed + + + + + Container of all the files to be uploaded with the request. + + + + + Determines what HTTP method to use for this request. Supported methods: GET, POST, PUT, DELETE, HEAD, OPTIONS + Default is GET + + + + + The Resource URL to make the request against. + Tokens are substituted with UrlSegment parameters and match by name. + Should not include the scheme or domain. Do not include leading slash. + Combined with RestClient.BaseUrl to assemble final URL: + {BaseUrl}/{Resource} (BaseUrl is scheme + domain, e.g. http://example.com) + + + // example for url token replacement + request.Resource = "Products/{ProductId}"; + request.AddParameter("ProductId", 123, ParameterType.UrlSegment); + + + + + Serializer to use when writing XML request bodies. Used if RequestFormat is Xml. + By default XmlSerializer is used. + + + + + Used by the default deserializers to determine where to start deserializing from. + Can be used to skip container or root elements that do not have corresponding deserialzation targets. + + + + + A function to run prior to deserializing starting (e.g. change settings if error encountered) + + + + + Used by the default deserializers to explicitly set which date format string to use when parsing dates. + + + + + Used by XmlDeserializer. If not specified, XmlDeserializer will flatten response by removing namespaces from element names. + + + + + In general you would not need to set this directly. Used by the NtlmAuthenticator. + + + + + Gets or sets a user-defined state object that contains information about a request and which can be later + retrieved when the request completes. + + + + + Timeout in milliseconds to be used for the request. This timeout value overrides a timeout set on the RestClient. + + + + + The number of milliseconds before the writing or reading times out. This timeout value overrides a timeout set on the RestClient. + + + + + How many attempts were made to send this Request? + + + This Number is incremented each time the RestClient sends the request. + Useful when using Asynchronous Execution with Callbacks + + + + + Base class for common properties shared by RestResponse and RestResponse[[T]] + + + + + Default constructor + + + + + The RestRequest that was made to get this RestResponse + + + Mainly for debugging if ResponseStatus is not OK + + + + + MIME content type of response + + + + + Length in bytes of the response content + + + + + Encoding of the response content + + + + + String representation of response content + + + + + HTTP response status code + + + + + Description of HTTP status returned + + + + + Response content + + + + + The URL that actually responded to the content (different from request if redirected) + + + + + HttpWebResponse.Server + + + + + Cookies returned by server with the response + + + + + Headers returned by server with the response + + + + + Status of the request. Will return Error for transport errors. + HTTP errors will still return ResponseStatus.Completed, check StatusCode instead + + + + + Transport or other non-HTTP error generated while attempting request + + + + + The exception thrown during the request, if any + + + + + Container for data sent back from API including deserialized data + + Type of data to deserialize to + + + + Deserialized entity data + + + + + Container for data sent back from API + + + + + Comment of the cookie + + + + + Comment of the cookie + + + + + Indicates whether the cookie should be discarded at the end of the session + + + + + Domain of the cookie + + + + + Indicates whether the cookie is expired + + + + + Date and time that the cookie expires + + + + + Indicates that this cookie should only be accessed by the server + + + + + Name of the cookie + + + + + Path of the cookie + + + + + Port of the cookie + + + + + Indicates that the cookie should only be sent over secure channels + + + + + Date and time the cookie was created + + + + + Value of the cookie + + + + + Version of the cookie + + + + + Wrapper for System.Xml.Serialization.XmlSerializer. + + + + + Default constructor, does not specify namespace + + + + + Specify the namespaced to be used when serializing + + XML namespace + + + + Serialize the object as XML + + Object to serialize + XML as string + + + + Name of the root element to use when serializing + + + + + XML namespace to use when serializing + + + + + Format string to use when serializing dates + + + + + Content type for serialized content + + + + + Encoding for serialized content + + + + + Need to subclass StringWriter in order to override Encoding + + + + + Default JSON serializer for request bodies + Doesn't currently use the SerializeAs attribute, defers to Newtonsoft's attributes + + + + + Default serializer + + + + + Serialize the object as JSON + + Object to serialize + JSON as String + + + + Unused for JSON Serialization + + + + + Unused for JSON Serialization + + + + + Unused for JSON Serialization + + + + + Content type for serialized content + + + + + Allows control how class and property names and values are serialized by XmlSerializer + Currently not supported with the JsonSerializer + When specified at the property level the class-level specification is overridden + + + + + Called by the attribute when NameStyle is speficied + + The string to transform + String + + + + The name to use for the serialized element + + + + + Sets the value to be serialized as an Attribute instead of an Element + + + + + The culture to use when serializing + + + + + Transforms the casing of the name based on the selected value. + + + + + The order to serialize the element. Default is int.MaxValue. + + + + + Options for transforming casing of element names + + + + + Default XML Serializer + + + + + Default constructor, does not specify namespace + + + + + Specify the namespaced to be used when serializing + + XML namespace + + + + Serialize the object as XML + + Object to serialize + XML as string + + + + Determines if a given object is numeric in any way + (can be integer, double, null, etc). + + + + + Name of the root element to use when serializing + + + + + XML namespace to use when serializing + + + + + Format string to use when serializing dates + + + + + Content type for serialized content + + + + + Helper methods for validating required values + + + + + Require a parameter to not be null + + Name of the parameter + Value of the parameter + + + + Represents the json array. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The capacity of the json array. + + + + The json representation of the array. + + The json representation of the array. + + + + Represents the json object. + + + + + The internal member dictionary. + + + + + Initializes a new instance of . + + + + + Initializes a new instance of . + + The implementation to use when comparing keys, or null to use the default for the type of the key. + + + + Adds the specified key. + + The key. + The value. + + + + Determines whether the specified key contains key. + + The key. + + true if the specified key contains key; otherwise, false. + + + + + Removes the specified key. + + The key. + + + + + Tries the get value. + + The key. + The value. + + + + + Adds the specified item. + + The item. + + + + Clears this instance. + + + + + Determines whether [contains] [the specified item]. + + The item. + + true if [contains] [the specified item]; otherwise, false. + + + + + Copies to. + + The array. + Index of the array. + + + + Removes the specified item. + + The item. + + + + + Gets the enumerator. + + + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + + + + Returns a json that represents the current . + + + A json that represents the current . + + + + + Gets the at the specified index. + + + + + + Gets the keys. + + The keys. + + + + Gets the values. + + The values. + + + + Gets or sets the with the specified key. + + + + + + Gets the count. + + The count. + + + + Gets a value indicating whether this instance is read only. + + + true if this instance is read only; otherwise, false. + + + + + This class encodes and decodes JSON strings. + Spec. details, see http://www.json.org/ + + JSON uses Arrays and Objects. These correspond here to the datatypes JsonArray(IList<object>) and JsonObject(IDictionary<string,object>). + All numbers are parsed to doubles. + + + + + Parses the string json into a value + + A JSON string. + An IList<object>, a IDictionary<string,object>, a double, a string, null, true, or false + + + + Try parsing the json string into a value. + + + A JSON string. + + + The object. + + + Returns true if successfull otherwise false. + + + + + Converts a IDictionary<string,object> / IList<object> object into a JSON string + + A IDictionary<string,object> / IList<object> + Serializer strategy to use + A JSON encoded string, or null if object 'json' is not serializable + + + + Determines if a given object is numeric in any way + (can be integer, double, null, etc). + + + + + Helper methods for validating values + + + + + Validate an integer value is between the specified values (exclusive of min/max) + + Value to validate + Exclusive minimum value + Exclusive maximum value + + + + Validate a string length + + String to be validated + Maximum length of the string + + + diff --git a/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Hardware.Interfaces.Ports.PortCore.xml b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Hardware.Interfaces.Ports.PortCore.xml new file mode 100644 index 00000000..5905f2b0 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Hardware.Interfaces.Ports.PortCore.xml @@ -0,0 +1,223 @@ + + + + Xylem.Common.Hardware.Interfaces.Ports.PortCore + + + + + + + + Marker for incoming record at time of the PC + + + + + + + + + + + + + + + + + + + + + + + Interface for port data event arguments + + + + + Read data + + + + + + Write data + + + + + + Reading received time + + + + + + Writing received time + + + + + + Setting the data marker + + + + + + Getting the data marker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Interface for Ports + + + + + event for record received, either bytes or string + + + + + event for record received, either bytes or string + + + + + set specific mark + and flush or delete all incoming byte from buffer when SyncMarkRecord is or + + + + + + + if the port needs stuff to open, always open for better logical handling + + + + + close and dispose all connections + + + + + indicates if the Port is open (also on Ports that did not have an open state) + + + + + + Write byte[] to the Stream/Port on Child Class + wrapped with base class error handling + + Array of bytes to write + + + + discard all buffers + + + + + Return the port name + + name of the port as string + + + + Store Port settings set most likely from transmit protocol + + + + + The transmission protocol needs to inform the communication port how to setup, + this is the data container. + + + + + + + + + + + + start of receiving synchronization byte at byte receive routine + syncByte == null: use the readLine routine (ASCII) and NOT the BYTE routine, + lengthPosition and additionalLength are not used + + + + + position of length information field in received BYTE record + lengthIndex == null: take the constant receive length of additionalLength + because the record doesn't contain length information + + + + + additional record length NOT covert by the record length information field + lengthIndex == null: constant length for received record + Being used for the BYTE records indicated by a valid syncByte, + not being used for ASCII records. + + + + + Receive time out in milliseconds + + + + + BaudRate for Port + + + + + lower threshold for buffer flushing if dataMarker != SkipDecoding + receiveBufferFlushThreshold == null: never flush the communication buffer + receiveBufferFlushThreshold == 0: flush always the communication buffer + receiveBufferFlushThreshold == x: flush communication buffer if it exceeds x Byte + waste old records if an up-to-date record is being needed for start/stop synchronization + of a measurement. This is the level at which the old data have to be flushed because the + data have been dammed up in the communication port input buffer which means they are to + old for synchronization purposes. + /// + + + + a special implementation may require the doubling of the sync byte to re-synchronize + + + + diff --git a/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Hardware.WaterMeter.Genesis.Applications.dll.config b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Hardware.WaterMeter.Genesis.Applications.dll.config new file mode 100644 index 00000000..e936cc13 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Hardware.WaterMeter.Genesis.Applications.dll.config @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.xml b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.xml new file mode 100644 index 00000000..76a62c82 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.xml @@ -0,0 +1,205 @@ + + + + Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages + + + + + + abstract for set structure for BaseDataEventArgs + + + + + 'Base' get event record form real child. + + + + + + get real Event record + + + + + + Holds the record before decoding, for logging + + + + + + + + Stream record for calibration on channel + + + + + + + + + + + new record from Stream + + + + + + + + + + + + Ctor with base record + + base record + base record + + + + Register witch has updated + + + + + New Value in Register + + + + + + EventArgs for Request Responses + + + + + Request response from meter + + + + + + + + + hold streaming record for protocol H (contains calibration record) + + + + + record validation + + + + + total time of flight in seconds + + + + + delta time of flight in seconds + + + + + total time of flight in cordonel units + + + + + delta time of flight in cordonel units + + + + + volume scale (default: 1024) means + 1024digits = 1ml + + + + + volume factor to convert raw to m³ + uses 1E-6 (ml to m³) / VolumeScaleRawPerMl + + + + + raw volume between two samples + + + + + calculated out of dRawVolume * VolumeFactorRawToQm . + in cubic meters + + + + + accumulated raw volume + + + + + sample interval between two samples in seconds + + + + + high threshold amplitude in V + + + + + low threshold amplitude in V + + + + + high ratio for pulse width + + + + + low ratio for pulse width + + + + + raw temperature + + + + + temperature scale + + + + + calculated temperature in degree C + + + + + Get result as string + + + + + + + struct to hold Led record for protocol F (contains measurement record) + + + + + Get result as string + + + + + diff --git a/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.dll.config b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.dll.config new file mode 100644 index 00000000..e936cc13 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.dll.config @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.xml b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.xml new file mode 100644 index 00000000..070cbfd8 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.xml @@ -0,0 +1,691 @@ + + + + Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore + + + + + Streaming modes that supported by genesis meter. + Set meter to this Streaming mode means that , the meter pushes mode-specific record to port without any responses + + + + + Test mode with raw record to log. Should give one + 3 times and repeat this till led mode is switch + + + + + Test mode should give out + + + + + Calibration mode should give out + + + + + Deactivate streaming + + + + + not set or an new not supported Streaming mode + + + + + + Genesis meter, main class for all action that occurs on production life of meter + one meter always have a linked port for UART communication and one for LED (even if you don't need them) + it´s has to be open for vb6 COM so don't use any record types or objects that vb6 didn't understand or + interprets differently than dotNet + + + + Default constructor. + + R.Drabesch, 2018-Feb-16. + + + + + Slot number for test-bench + for request Port + for streaming Port + don´t send CRC error or telegrams with error flag to caller + + If you have a password for highest access level you need, if you don't want to access the meter + (just read led record) than you can leave it null + + + + + Keep up the highest access level for all function in where used + + + + + Logout with level 0 + + + + + + Property is redundant because is also stored in + but never less is + is the identification of the meter it has a separate Property + + + + + + Save Slot Number (position at test-bench) for logging purposes + + + + + Represent + proposed for login + + + + + + + + Add on ctor a password and it will be used for login in if no other password is set + + + + + default false only enabled by + when it is true, the meter will enforce the login when session is gone or access is denied + + + + + Enable raw record logging, if set every incoming package will be logged + + + + + All parameter store in this Genesis is up in here + if you want to read them from meter use + if you want to set them to meter use + + + + + All applications defined by configuration.json + + + + + request port assignment/info + + + + + request protocol assignment/info + + + + + streaming port assignment/info + + + + + streaming protocol assignment/info + + + + + Response received after request for record + + + + + + + + Returns meter registers + + + + + + + + + do not use it to set ProcessStatus + if you want to change ProcessStatus of this genesis use + is just store for some routines + + + + + if state is change + + will be invoked. + on some states other events will be invoke as well + + + + do not use it to set ErrorStatus + if you want to change ErrorStatus of this genesis use + is just store for some routines + + + + + fires up + + + + + Logged in to device + + + + + + + + Setup water meter from configuration file: + -slot, + -streaming protocol, + -streaming port + -request port + + + + + + + + + + just internal setup. called on ctor or from vb6 setup function + + Slot Number for test-bench + for RFID/UART/IrDA Port + for LED Port + don´t send CRC error or telegrams with error flag to caller + + If you have a password for highest access level you need, if you don't want to access the meter + (just read led record) than you can leave it nullS + + + + + + Start Event listening, has to be called after + + + + + Add a port to working queue + + On should one once added in runtime + + + + + Synchronization of the record for the streaming interface + + + + + + + + + + + + + + + + + + + + + + + + + + + + call this if session is expired and you need an re-authorization + + + + + A helper to invoke events only if someone is listening, otherwise nothing will happen + + Event handler to call + Sender (can be null) + Event arguments (can be null) + + + + Track all incoming led record packages (Calibration and Flow) + + + + I should be or + otherwise this method does nothing + + + + + tracking request record processing + + + + + + + QueryCaps can send before login + arrange record for communication (e.g. Baud rate) + + + Running outgoing command + + + + + The backup login level is needed for re-authorization + + + + + SetRegister to loginLvl and wait for response + + + true = process command; false = add command to list. call to process login command + if is completed and no error occurred it is true + + + + Set + + if null , use password from initialization + true = process command; false = add command to list. call to process login command + + + + + + Login with identical password as last time + + + + - Initial + + + + + + Get password from server + + + + + + Starting a timer to keep session active, + starting the . + + password string to login + + + + + Starting a timer to keep session active, + starting the . + + password string to login + true = process command; false = add command to list. call to process login command + + + pass runImmediately for auto login + + + + + Building the FW Version string out of 2 bytes of data. + REASON: FLEXNETVERSION is one application which does not follow the same rule of + decimal numbers. Instead it uses hexadecimal digits. After the conversion of this + number to a pure Uint32, needed for comparison of file versions in configuration.json, + the hexadecimal outline will be lost and the comparison with the rowproduct.txt fails. + FW-update needs this information to validate a tested package! + + most significant byte + last significant byte + converted "msb.lsb" as string e.g. "12.34" or "2.0C" + + + + List of all present meter applications + + + + + Reading all applications which can be found in the configuration.json and have been stored + to the meter register dictionary in advance. + The read process covers the FW version and the CRC. + After reading the version, all valid registers are going to be selected. + + + + + Automatic login to meter enabled if logged out by lost authentication + + + + + If the timeout timer elapsed to keep the session active, this routine will be called + awaking the . + + + + + + + Thread to keep the connection to the meter open and the session alive, + because on missing communication the meter is going to logout automatically. + This thread will be started at and aborted on + + + + + + + + + Check if EMPTY_PIPE or REBOOT is set + + + + + + Check if alarmToCheck is set on register + + is Flags so you can use more than one alarms (like Alarm.EMPTY_PIPE | Alarm.REBOOT) + + + + + Read out all AlarmStatus register and combine them to one + + + + + + Reset the empty pipe alarm + + + + + Reads the PCB Identification, can be accessed at all login levels, + Read Privilege is always needed to BUGFIX read access to PCB ID + + PCB ID + + + + Get the actual register dictionary + + + + + + Serial number of meter married with PcbId + + + + + + + + + Event to Sync Register on MeterSide and + Fired on Write or read register + + + Register to update with value to update + + + + Write Register, optional: wait for result and validate, + write register will ALWAYS log the data DON'T use for password write + + Data type of Register + Register to change + Value to save + wait until result is ready + check the content of the register by read back + skip retries on this error code return + true on successful operation + + + + Read Register and return byte array + + + expected length for response + skip retries on this error code return + + + + + Clear Ports + + + + + + + + + + + + + + + + + + + + + + + Logging of register write processes to meter + ATTENTION: DON'T USE FOR PASSWORDS! + + + + + + + Storage of calibration values + + + + + + + + Calibration factors for all channels + + + + + Registers needed to store the calibration for the individual channel + + + + + + + + + + + + Just stop recording without calculation + + + + + + + + + + + + + + List of ongoing measurements, base- and calibration-measurements + + + + + All channels required to process + + + + + + Perpetration of Measurement + SampleRate 10 and Led mode Test + + + + + + + + + + + Testing the flow direction + + + + + + + the first measurement is ALWAYS a FlowTestRecord due to the underlying routine logic. + + + + + The first measurement is ALWAYS a FlowTestRecord. + + + + + + + + Calibration content + + + + + has been calibrated + + + + + Channel for calibration + + + + + Register to store the calibration + + + + + Ctor for calibration factor + + + + + + + set the user readable relative (around 1.0) calibration factor + and convert it to the raw calibration factor for the meter + + + + + + + Read the relative (around 1.0) calibration factor calculated from the actual + meter calibration factor divided by the default calibration factor + + + + + + Genesis internal raw default value (around 15625) + + + + + + Set the meter raw calibration factor (around 15625) + + + + + + Get the meter raw calibration factor (around 15625) + + + + + + JSON filer reader for generation of register lists + + + + + Registers defined in configuration.json file + + + + + Applications defined in configuration.json file + + + + + Ctor + + the file path for configuration.json as interface description to the meter + + + + Convert file content to register list + + + + + + + diff --git a/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile.dll.config b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile.dll.config new file mode 100644 index 00000000..e936cc13 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile.dll.config @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.xml b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.xml new file mode 100644 index 00000000..b9b851d6 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.xml @@ -0,0 +1,585 @@ + + + + Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol + + + + + Commands that the genesis meter support over the request protocol. + Functional Specification Breeze Core and Applications Revision:3.03(12748DOC11 - functional spec ICOE472.pdf) + + + + + 9.2.5 + Command 0x00 (NOP) + This command will do nothing, and will have no response. + + + + + 9.2.6 + Command 0x01 (Query capabilities) + This command will be used by the external computer to discover the protocol parameters that may be varied. + These can then be compared with the external computer’s capabilities and the best match selected. + + + + + response on + + + + + 9.2.7 + Command 0x03 (Set capabilities) + Used to finalize the baud rate and packet settings after negotiation. + The reply will be sent at the currently selected baud rate and packet length, + after which the settings will take effect + + + + + response on + + + + + 9.2.8 + Command 0x05 (Train) + This command will perform target driven data training, that is, where the target is in control of the data flow. + See also command 0x11. + + + + + response on + + + + + 9.2.9 + Command 0x07 (Repeat last) + Used by the external computer to request the last response to be resent, for example if it was found to be corrupted. + Note that the response 0x08 will never be sent, the reply to command 0x07 will be a verbatim resend of the last response. + + + + + response on + + + + + 9.2.10 + Command 0x09 (Read data) + This command makes reads of any random selection of configuration registers, up to the maximum packet size negotiated. + + + + + response on + + + + + 9.2.11 + Command 0x0B (Write data) + This command makes writes to any random selection of configuration registers, up to the maximum packet size negotiated. + + + + + response on + + + + + 9.2.12 + Command 0x0D (Multiple read data) + This command makes reads of one register multiple times, which will be more efficient than performing successive reads using command 0x09. + This command will be available from protocol version 0.40, for earlier protocol versions command 0x09 should be used. + + + + + response on + + + + + 9.2.13 + Command 0x0F (Multiple write data) + This command makes writes to one register multiple times, which will be more efficient than performing successive reads using command 0x0B. + This command will be available from protocol version 0.40, for earlier protocol versions command 0x0B should be used. + + + + + response on + + + + + 9.2.14 + Command 0x11 (Set level) + This command will perform external driven data training, that is, where the external computer is in control of the data flow. + This command will be available from protocol version 0.42, for earlier protocol versions command 0x05 should be used. + + + + + response on + + + + + Config Exchange error codes. + + + + + Transport errors for request protocol + + + + + List of constance for error codes from genesis meter + + + + + everything is fine + + + + + Port is not open + + + + + fails to write to serial port + + + + + fails to read from serial port + + + + + Command is to long + + + + + deeper exception, check out log if this happen + + + + + wrong CRC + + + + + something strange + + + + + Timeout occur + + + + + Acknowledge feedback from meter after communication + + + + + Response missing + + + + + Response command not match the required command + + + + + Lost connection (logged out from meter), a re-authorization is required + to access this command and/or register + + + + + Meter error received, a retry may be useful + + + + + The response record couldn't be decoded + + + + + Valid meter response record + + + + + Holds all errors can occur on the request protocol + + + + + Exception occurred on this command + + + + + Exception occurred while receiving this data + + + + + Error is interpreted and has a define error code + if its not null is Genesis.Protocols.Request.Const.ConfigExErrors + + + + + Error is interpreted and has a define error code + if its not null is Genesis.Protocols.Request.Const.HighLevelError + + + + + Ctor with only message + + error message + + + + Ctor with message and + + error message + + + + + Ctor with message, and + + error message + + + + + + Holds request commands with detail parameters to see processing state + + + + + Indicates the base command + + + + + Indicates the base command + + + + + the register the command refers to. + needed to set Register dictionary to link response with dictionary key + + + + + Command acknowledged + + + + + Retry counter + + + + + indicates error base on + + + + + indicates error reason on + + + + + Combined error code of base and reason + + + + + Chunk position of error on multiple read/write access + + + + + Data containing the request protocol + + + + + Encoded with transmit protocol, ready to stream to port as is + + + + + Extracted payload of response + + + + + Extracted payload of response + + + + + avoid logging for e.g. password + + + + + error mask to skip retries for functional errors + + + + + Ctor for an base command + + as an byte + Request protocol data for logging + Ready to send data encoded with transmit protocol retries + Timeout for response + to do command with + hiding data in log file to avoid spying of passwords + error mask to skip retries + + + + + if session is gone and a re authorization is necessary + + + + + + Ctor + + this command will be resend after authorization + + + + Command to resend + + + + + a bidirectional protocol support read and write genesis meter registers + needed for + + + + + FIFO of records to be send next + + + + + This is the actual record in the send loop + + + + + Last communication time for session refresh + + + + + + + + + + + Occurs when a meter Response for write password is good + + + + + Event after a register entries changed + + + + + User adjustable additional retry timeout. This is 0 ms for standard operation. + + + + + + + + Process all records needed to be sent, this routine has to be called + to kick-off the communication of all RequestRecords saved to the send + FIFO + + + - Initial + + + - Logging of raw RequestProtocol at time of sending, + - Logging of retries. + + + - Added timeout from transmit protocol. + + + - Added reorder FIFO to bring login at first position + + + - Hide data in logging for e.g. passwords + + + - Retry counter reset if authorization required and this record will be put back into FIFO, + - Retry delay corrected for all errors. + + + - Dynamic retry delay: ResponseTimeoutMs * Retry counter. + + + - Skip retries on specific error mask to speed up communication on functional errors + or informational feed backs (e.g FW not installed 0x0004) + + + + - User adjustable additional retry timeout. + + + + + Assemble record with transmit protocol and put it to record-send-FIFO, + backup the ready-to-send, which is the dataEncodedWithTransmitProtocol, + to the RequestRecord object for sending including the retry capability. + + Data package with all details like CRC, etc + Command identifier + which is intend + hiding data in log file to avoid spying of passwords + error mask to skip retries + the assembled record for the send FIFO + + - Initial + + + - Logging of raw data (RequestProtocol) moved to ProcessRecordList. + + + - Added timeout from transmit protocol. + + + - Hide data in logging for e.g. passwords + + + - Skip retries on specific error mask to speed up communication on functional errors + or informational feed backs (e.g FW not installed 0x0004) + + + + + + Called after successful response. + Decode and check record, handle Errors and dispatch result. + Invokes if somebody is listening + + + - Initial + + + - First part reworked to extract the response protocol information + + + - Hide data in logging for e.g. passwords + + + - Error code extraction changed for + + + + + Method to send basic Commands to Meter. Creates an integer of 4 bytes for the payload. + Supported Commands are: ,, + , and . + Calculate CRCs and Command length and check if command is valid. + Use to push data to Port/Meter. + + + Supported ,, + , and . + + Register to Read or Write, null for + + Data to push into the . + must be null on Read Commands ( ,) + and not null on WriteData ( and ) + + + hiding data in log file to avoid spying of passwords + mask to skip reties on error + an new command just send to port/meter + + - Initial + + + - Reworked to zero pad payload with chunks of 4 bytes, the caller needn't take care of the size + + + - Corrected payload content in request protocol + + + - Hide data in logging for e.g. passwords + + + - Skip retries on specific error mask to speed up communication on functional errors + or informational feed backs (e.g FW not installed 0x0004) + + + + - Multiple read for string split to simple reads. + + + + + Analyzes the error code + + + + + Reorders the record list so that first entry is the defined topRegister + + + + + + Checks the active register to access + + + + + + diff --git a/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.xml b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.xml new file mode 100644 index 00000000..7a12e5d5 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.xml @@ -0,0 +1,98 @@ + + + + Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol + + + + + Layer between CRC16CCITT handler and Events + block trashy telegrams + + + + + Decode data and hold results + + + + + + + + + + + + + + Data fields and definitions for GENESIS streaming protocol + + + + + Default data for + + + + + Calibration data + + + + + Constructor initializes all decoded members with default values + + + + + Flow test data + + + + + Decoding the raw message + + message received as one line delimited with LF + true if decoding was successful and data has been validated + + + + Extracting message from string fields for protocol 'f' + + Separated fields containing the measurement as string + + + + + Extracting message from string fields to individual raw channel for protocol 'g' + + Reference to result structure for raw data for one channel + Separated fields containing the measurement as string + true if protocol is valid + + - Usage of VolumeFactorRawToQm and calculation of AccuDutOverflowVolumeCm + + + + + Extracting message from string fields to individual raw channel for protocol 'g' + + Reference to result structure for raw data for one channel + Separated fields containing the measurement as string + true if protocol is valid + + - Usage of VolumeFactorRawToQm and calculation of AccuDutOverflowVolumeCm + + + + field position in protocol 'f' + + + field position in protocol 'g' + + + field position in protocol 'h' + + + diff --git a/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Hardware.WaterMeter.WaterMeterCore.xml b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Hardware.WaterMeter.WaterMeterCore.xml new file mode 100644 index 00000000..fbf9602c --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Hardware.WaterMeter.WaterMeterCore.xml @@ -0,0 +1,562 @@ + + + + Xylem.Common.Hardware.WaterMeter.WaterMeterCore + + + + + Applies an action to a list of meters in a separate thread + + + + + Starts a new task for a list of meters + + + + + + Apply a single action to a specific meter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Common definition for Meter handling in production and on test benches + + + represents any error state a meter can have + if hash code is 0 everything is running + is Flags, so watch out to check with hasFlag! + + + + + everything is good + + + + + problems on initialization + + + + + problems on Measurement + + + + + Problem on communication with meter + + + + + Problem on optical output on meter + + + + + if pulse can not readout + + + + + no (or no good) reference flow available + + + + + Calibration went wrong + + + + + calibration is out of range. Check documentation from meter to find limitation + + + + + blue screen like error + + + + + Can hold various s and hold connection record to relieve the meter. + Every contact with meter has to go over even if you have just only one. + + + + + holds all + Add and delete with + + + + + Remove Meter from batch and clear communication + + meter to be removed + + + + Get meter from slot number. + + + null if slot has no genesis + + + + Remove all Meters and comports + + + + + + + + + + + Detect all meters + + + + + + login to all meters + + + + + Initialize all meters + + + + + Initialize calibration for all meters + + + + + Initialize measurement for all meters + + + + + Store new calculated calibration to all meters + + + + + Start calibration for all meters + + + + + Start measurement for all meters + + + + + Stop calibration of all meters + + + + + Stop measurements of all meters + + + + + Can hold various s and hold connection record to relieve the meter. + Every contact with meter has to go over even if you have only one. + + + + + ctor + + + + + Registered list of meters + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IMeter is the highest level interface between a meter with direct communication to a test bench. + has general things like calibration, measurement and set up routines. + no specific meter stuff in here! + it is always disposable + + + + + occurs when ProcessState has changed + + + + + occurs when ErrorState has changed + + + + + occurs when Init is completed + + + + + occurs when the initialization for Measurement is completed + + + + + occurs when the Measurement is completed + + + + + occurs when the initialization for calibration is completed + + + + + occurs when the calibration is completed + + + + + occurs when meter gets disposed + + + + + unique meter identification + + + + + read-only to see current Process state + + + + + read-only to see current Error state + + + + + the current slot in test-bench + + + + + Setup of intermediate update time for measurement updates and overflow detections, + has to be calculated depending on flow-rate and nominal diameter (DN) + + + + + Open Com ports, try some communication, login + + + + + Setup up meter from config file. just a workaround for vb6 calls. please do not use if your working with .net + + Slot Number for Test bench + don´t send CRC error or telegrams with error flag to caller + + + + Logout from device + + + + + Start Login with password service + + + + + Start Login with out password service and a fixed password + + password for login + + + + set up measurement parameter and set meter into test-mode + + + + + Starting a Measurement + Meter must be initialized + Start to receive record from meter and decode this record into MeasurementRecord + + + + + + Meter must have a active measurement + Stop receive record from meter and decode record + + + + + - simplify the measurement results handling + - getting the main measurement of the entire device (combination of all paths) + - add MeasurementResult + - remove all other methods + + + After a completed measurement , you can grab + + Calculated results + + + + The first measurement is ALWAYS a FlowTestRecord. + + + + + get current state of the running measurement + + leave empty for an aggregate state for all measurements or pass the channel number to check + + + + + set up calibration parameter (calibration factor to default) and set meter into calibration mode + + + + + Starting a Calibration + Meter must be initialized + Start to receive record from meter, decode and store this record + no available + To finish calibration process run + + + + + Meter must have a active for calibration + Stop receive record from meter, decode and store record + record will not calculate or store + + + + + Get current state of the running calibration + + + + + + Calculate calibration factor for static and flying start / stop + Results kept internal and not being saved to meter. + if you want to store them on meter use + + the reference volume is essential for calculation of calibration factor + the reference time is needed for flying start/stop + the required deviation to set the scale apart from 0 + override the default max calibration factor tolerance + + + + Save calculated calibration on meter if no calibration results available an exception occurred + + + + + To control the LCD from meter for status information etc. + + if set to true the meter will show his normal screen, if set to false the next parameter will shown in display + test shown in LCD in byte array as hex value (0x33,0xFF shows 33FF on screen) + + + + Sets Display text and update production database + + New ProductionState + + + + Get last Process State + + + + + Add external text to internal log file handling + + text to log + + + + Enable/Disable Raw record Logging + + True = Write Raw record into log/ false = Stop write raw record into log + + + + Check if the meter has any errors that can occur on a measurement + the error reason has find out in the log files + + false = everything is good, detect at least one error + + + + Clear all object set up on runtime + + + + + Interface for Events + you can use without events (so with out ) + + + + + occurs when ProcessState has changed + + + + + occurs when ErrorState has changed + + + + + occurs when Init is completed + + + + + occurs when the initializations for Measurement is completed + + + + + occurs when the Measurement is completed + + + + + occurs when the initializations for calibration is completed + + + + + occurs when the calibration is completed + + + + diff --git a/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Metrology.Measurements.xml b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Metrology.Measurements.xml new file mode 100644 index 00000000..5a1f8e5c --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Metrology.Measurements.xml @@ -0,0 +1,675 @@ + + + + Xylem.Common.Metrology.Measurements + + + + + + Holds all stuff for calibration of a Genesis Meter + + + + + Record at the start of the measurement + + + + + Record at the end of the measurement + + + + + Backup of intermediate record + + + + + Backup of intermediate record for short term result + This can be used to observe a result (e.g. flow rate) + between two intermediate records. The update time is + set in the ctor by intermediateUpdateTimeS. + + + + + Intermediate record for ongoing measurement + + + + + + + + Holds the accumulated overflow volume, will work only if + is being called cyclically. + The overflow will take place due to the fixed point number format or the + display resolution setting. + + + + + Holds the accumulated overflow time, will work only if + is being called cyclically. + The overflow takes place due to the fixed point number format. + + + + + Logger for debug output of measurement + + + + + Physical slot of the device + + + + + Identification of the channel + + + + + + State machine for one measurement (on one meter and one channel) + + + - add State-machine for better handling + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Set flag for starting Calibration. + The next record is going to set the start values. + + + + + + + + + Holds all stuff for calibration of a Genesis Meter + + + + + Calibration default value used to reset meter calibration + + + + + relative value (e.g. 0.05) + + + + + Setup the required tolerance in percent for check (e.g. 5 = +/-5%) + + + + + Check the tolerance of the calibration factor (e.g. 0.95 to 1.05 at 0.05 tolerance) + + + true if the calibration factor is inside the tolerance + + + + + Remind the calibration factor for the register write access + + + FlowTestRecord or CalibrationRecord + Update time needed for overflow detection in seconds + + + + + Calculate calibration factor from reference volume and reference time if set. + The deviation can adjust the factor to a required offset, it may be useful not to calibrate to 0.0). + The Result is NOT being stored to the meter. + CAN BE USED FOR STATIC START/STOP AND FLYING START/STOP PROCEDURE + + reference volume in m³ + reference time in seconds + the deviation to set the calibration in % + calibration factor as relative value or null if calibration factor cannot be calculated + + - The scale factor for calibration is going to adjusted here to keep the measurement result accurate. + + + + + information about measurement results to identify on input depending results + + + + + everything is good + + + + + inconsistent channel assignment + + + + + DUT time zero + + + + + DUT time is invalid + + + + + over flow time is invalid + + + + + REF time zero + + + + + REF time is invalid + + + + + DUT volume zero + + + + + REF volume is unknown + + + + + holds the current state for genesis actions (e.g. calibration,measurement) + + + + + If Measurement/Calibration/Action is not started + + + + + Measurement/Calibration/Action waits for next record package and sore this as start record, + After this Measurement/Calibration/Action IsRunning + + + + + Measurement/Calibration/Action collecting record and wait for end call + + + + + Measurement/Calibration/Action collecting next record record + + + + + Measurement/Calibration/Action waits for next record package and sore this as end record, + After this Measurement/Calibration/Action IsCompleted + + + + + Measurement/Calibration/Action has start and end record and can calculate a result + + + + + ProcessState nearly linear + + + + + meter not initialized + + + + + meter currently in initialization + + + + + initialization done + + + + + meter is on measurement + + + + + Measurement is done (not equal to succeed) + + + + + Meter is prepared for calibration + + + + + meter is on calibration + + + + + need Q from reference meter for calculation + + + + + Calibration is calculated + + + + + Calibration is stored on meter + + + + + + Collection of measurement interfaces + + + + + Event for new action of measurement state + + + + + Get the Type of the measurement record + + + + + + Get the channel no. the measurement collecting record for + + returns 0 when all channels should be collected + + + + Actual state of the measurement + + + + + Clear start, intermediate and end record and set action state to idle + + + + + Adding measurement record to processing FIFO + + + + + + Returns the actual state of the ongoing measurement + + + + + + Fist clear all record from earlier calibrations. + Set flag for starting measurement. + The next record is going to set the start values. + + + + + Stop grabbing record from streaming. + Last Data package is count as end volume (and time) + + + + + Returning the results of the ongoing measurement between two updates. + This can be used to update the screen during measurements like actual flow rate. + The timing will be set by the IntermediateUpdateTimeS. + + + + + + + + Returning the intermediate results of the ongoing measurement from the start of measurement until now! + + + + + + + + Returning the results of the measurements from start until stop. + + Measurement duration is needed explicit for flying start/stop procedure + reference volume is ALWAYS needed for scale and deviation + + + + + + interface for all incoming streaming protocol + to simplify measurements + + + + + Get volume of the record + + + + + Get time stamp of the record from meter + + + + + Get Data + + + + + + Get the channel the record comes from + + returns 0 if the channel is unavailable for this type of record (e.g. protocol f) + + + + Get overflow volume + + + + + + get overflow time + + + + + + + struct to hold a measurement record + + + + + physical channel 1, 2 and 3 + + + + + actual volume in cubic meters + + + + + Overflow volume + + + + + time converted to seconds + + + + + Overflow time + + + + + CRC16 CCITT + + + + + record is valid + + + + + Mark package as start, end, intermediate or not sync + + + + + time when package was decoded + + + + + time when package was received + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Channel being needed for later analysis of channel number + as feedback to the caller + + + + + Accumulated overflow volume in cubic-meters, + the DUT internal range can overflow due to + the limitation of the number or the display resolution. + + + + + Accumulated overflow time in seconds, + the number-range can cause an timer overflow. + + + + + DUT start record + + + + + DUT end record + + + + + Volume = (End Volume + overflow) - Start Volume in cubic meters, + real DUT measurement uncorrected + + + + + DUT measurement corrected if REF time is given + + + + + REF volume in cubic meters + + + + + Time = (End time + overflow) - Start time in seconds, + real DUT measurement uncorrected + + + + + REF time in seconds + + + + + Flow rate in cubic meters per hour based on DUT + + + + + Flow rate in cubic meters per hour based on REF + + + + + Scale factor between REF volume and DUT volume + this will use the + /// + + + + Deviation between DUT volume and REF volume relative, + this will use the + + + + + Deviation between DUT volume and REF volume in percent, + this will use the + + + + + Calculation of measurement results, overflow will be taken into account: + - DutVolumeCm in cubic meters: + DUT volume measurement uncorrected, direct measurement from the DUT, + - CorrectedDutVolumeCm in cubic meters: + equals the uncorrected DutVolumeCm if REF time is unknown, + else it is the volume calculated from the DUT flow-rate with the REF time, + - DutTimeS in seconds: + DUT time measurement, + - DutFlowRateCmPh in cubic meters per hour: + based on DUT volume and DUT time uncorrected, + - RefFlowRateCmPh in cubic meters per hour: + REF volume and REF time being used, + - ScaleFactorRefToDut unit less: + calculated with absolute and corrected DUT volume and REF volume + needed for calibration, is higher than one if DUT volume is less than the REF volume, + can be directly used to calculate the new scale by multiplication with the current scale, + - DeviationDutToRefRel unit less: + calculated with absolute and corrected DUT volume and REF volume + deviation needed for verification relative of DUT to REF, + - DeviationDutToRefPer in percent: + calculated with absolute and corrected DUT volume and REF volume + deviation needed for verification of DUT to REF in percent. + + + - Scale factor calculation added, + - Deviation calculation added. + + + - Flow rate calculation added, + - Slot added. + + + - RefVolumeCm, RefTimeSS and absVolumeQm added, + - Slot removed. + + + - FlowRateQmPh split to DutFlowRateCmPh and RefFlowRateCmPh, + - CorrectedDutVolumeCm added, + - input channel compared with start and end record channels. + + + - State implemented. + + + - Check and states for DUT time zero, DUT volume zero, over flow volume below zero, + start and end record time below zero. + + + - Supported static start/stop with DUT- and REF-volume, this is time independent but the + DUT- and over-flow-times shouldn't be negative or zero. + - Meter renamed to DUT (Device under Test). + + Start of measurement record set + End of measurement record set + accumulated overflow volume, will add to result volume + accumulated overflow time, will add to result time + measured REF time + REF volume + physical channel of measurement path (0 for main measurement) + + + diff --git a/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Ui.CordonelPreadjustmentUi.dll.config b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Ui.CordonelPreadjustmentUi.dll.config new file mode 100644 index 00000000..e936cc13 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Ui.CordonelPreadjustmentUi.dll.config @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Ui.GenesisToolBox.application b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Ui.GenesisToolBox.application new file mode 100644 index 00000000..5b30599e --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Ui.GenesisToolBox.application @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + pxMg5JLKpC6vKTBSHooHyPtzBD4= + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Ui.GenesisToolBox.exe.config b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Ui.GenesisToolBox.exe.config new file mode 100644 index 00000000..3c167187 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Ui.GenesisToolBox.exe.config @@ -0,0 +1,58 @@ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Ui.GenesisToolBox.exe.manifest b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Ui.GenesisToolBox.exe.manifest new file mode 100644 index 00000000..58130ca4 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Ui.GenesisToolBox.exe.manifest @@ -0,0 +1,446 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + WN150W7cUnyLY9nQcbXxz/65FsY= + + + + + + + + + + + + 1gCydwMWGp/f6yMtmJb+l5BoJig= + + + + + + + + + + + + nHm2+/hbi4fdeBsg/Di6KsBmQUM= + + + + + + + + + + + + N8bfu5NE4Mqj/usnD7lzG+uC/XI= + + + + + + + + + + + + o5lptA+hf3Vw/hMU6eiyHaabOf4= + + + + + + + + + + + + Kc8r1l/csUf3l37w+jqpUh79JoE= + + + + + + + + + + + + 8rcd5Qxo0sVyAgbWlsuf57PmM1Q= + + + + + + + + + + + + iHSn9SWlN6qS+m3TBCnVOQ8wVFw= + + + + + + + + + + + + tDsYokTGOpQ3PmC1CCBdMauzQLM= + + + + + + + + + + + + OAx+pIgSUZazGAU2uXIMMHRLo2g= + + + + + + + + + + + + 6nWAwkJdTnsSrvO++8wWrm3+DQA= + + + + + + + + + + + + rFZTPXlV4EEvpXmcpQxNu/XK+wA= + + + + + + + + + + + + 2HtU1eox8khcnhIQusYmxBXyNOE= + + + + + + + + + + + + 4KbJFP1ps4HmONTfNbdliZI2N+M= + + + + + + + + + + + + LYB9QvTufNTQirrn5YlUsb2kWD8= + + + + + + + + + + + + NDpyqnkIcezHdM4XmqaIn4cGA7Q= + + + + + + + + + + + + kAxPdIHJCeT6maS1n96EgO0FcBI= + + + + + + + + + + + + Cd3H4yvOSvvK1uyXmal6YJsCrF8= + + + + + + + + + + + + vddqP8GeBm/BJTXf21xDv3uva8E= + + + + + + + + + + + + PVnLM6lj5YiiHZyWXGfjm/uH4Qs= + + + + + + + + + + + + HZ3csPJ+T9fC/JI5J7elrAfw/o0= + + + + + + + + + + + + Hz/Lc8yF/bocRaUsye0hpCXle4w= + + + + + + + + + + + + F4vwDoq8Eh6f5TqlCJammiJ0Xow= + + + + + + + + + + + + gGPDGWKu5Rpa/9VNqeK2Kp1NnkI= + + + + + + + + + + + + HhzgW7PRUasodMJiWPwPEV9OgCs= + + + + + + + + + + + + 87EW8tYVvClsP7XppTjzMI8axlc= + + + + + + + + + + + + PFGVHiQSyeB2JwGse/8A4/Pz7h8= + + + + + + + + + + + + X8g3GpdOAFf0xS2IjUAanPSzJzM= + + + + + + + + + + + + blrA58f9U17hLOf1mMLwC4IpUdU= + + + + + + + + + + + + z1Sj9CPya2LxdyTjZVqVm6WWI8U= + + + + + + + + + + + + FMmwLA3/bvSsX03WN1q2FYa9wiE= + + + + + + + + + + + + ps3X24QR2wJ4QtbV/xrDCpdCxdY= + + + + + + + + + + HgEdHMG2fcWM1GxiwtpmxVbVrt4= + + + + + + + + + 3VeG3lIS6AgdTMbRy1FZ4tczcqk= + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Ui.GenesisToolBox.vshost.exe.config b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Ui.GenesisToolBox.vshost.exe.config new file mode 100644 index 00000000..74ade9db --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Ui.GenesisToolBox.vshost.exe.config @@ -0,0 +1,6 @@ + + + + + + diff --git a/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Ui.GenesisToolBox.vshost.exe.manifest b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Ui.GenesisToolBox.vshost.exe.manifest new file mode 100644 index 00000000..061c9ca9 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/Xylem.Common.Ui.GenesisToolBox.vshost.exe.manifest @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/XylemCommonUiLegacyGenCtl.dll.config b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/XylemCommonUiLegacyGenCtl.dll.config new file mode 100644 index 00000000..e936cc13 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/XylemCommonUiLegacyGenCtl.dll.config @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/configuration.json b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/configuration.json new file mode 100644 index 00000000..5814f125 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/configuration.json @@ -0,0 +1,10740 @@ +{ + "CUSTOMER": { + "id": 9, + "version": { + "first": 1, + "last": 137 + }, + "registers": { + "AlarmStatus0": { + "id": 0, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "8 bit counts corresponding to alarms 0-3.", + "version": { + "first": 1, + "last": 137 + } + } + ] + }, + "AlarmStatus1": { + "id": 1, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "8 bit counts corresponding to alarms 4-7.", + "version": { + "first": 1, + "last": 137 + } + } + ] + }, + "TriggerAlarmCancel": { + "id": 2, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Any set bits manually clear the corresponding alarm.", + "version": { + "first": 1, + "last": 110 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Any set bits manually clear the corresponding alarm.", + "version": { + "first": 111, + "last": 137 + } + } + ] + }, + "AlarmStatus2": { + "id": 3, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "8 bit counts corresponding to alarms 8-11.", + "version": { + "first": 26, + "last": 137 + } + } + ] + }, + "AlarmStatus3": { + "id": 4, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "8 bit counts corresponding to alarms 12-15.", + "version": { + "first": 26, + "last": 137 + } + } + ] + }, + "AlarmStatus4": { + "id": 5, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "8 bit counts corresponding to alarms 16-19.", + "version": { + "first": 26, + "last": 137 + } + } + ] + }, + "AlarmStatus5": { + "id": 6, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "8 bit counts corresponding to alarms 20-23.", + "version": { + "first": 26, + "last": 137 + } + } + ] + }, + "AlarmStatus6": { + "id": 7, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "8 bit counts corresponding to alarms 24-27.", + "version": { + "first": 26, + "last": 137 + } + } + ] + }, + "AlarmStatus7": { + "id": 8, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "8 bit counts corresponding to alarms 28-31.", + "version": { + "first": 26, + "last": 137 + } + } + ] + }, + "AlarmEnableMask": { + "id": 9, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit set of those alarms which are being monitored.", + "version": { + "first": 26, + "last": 110 + }, + "values": { + "default": 4294967295, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit set of those alarms which are being monitored.", + "version": { + "first": 111, + "last": 137 + }, + "values": { + "default": 4294967295, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "AlarmBroadcastMask": { + "id": 10, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit set of those alarms which will generate events.", + "version": { + "first": 26, + "last": 110 + }, + "values": { + "default": 4294967295, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit set of those alarms which will generate events.", + "version": { + "first": 111, + "last": 137 + }, + "values": { + "default": 4294967295, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "AlarmVisualMask": { + "id": 11, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit set of those alarms which are displayed with IDs and the alarm icon.", + "version": { + "first": 110, + "last": 110 + }, + "values": { + "default": 4294967295, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit set of those alarms which are displayed with IDs and the alarm icon.", + "version": { + "first": 111, + "last": 137 + }, + "values": { + "default": 4294967295, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "AlarmVisualAutoClearMask": { + "id": 12, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Alarms that have their display automatically cleared", + "version": { + "first": 110, + "last": 110 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Alarms that have their display automatically cleared", + "version": { + "first": 111, + "last": 137 + } + } + ] + }, + "ExcessFlowVolumeThreshold": { + "id": 13, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Flow rate above which broken pipe alarm is set in 1/256 l/h", + "version": { + "first": 61, + "last": 110 + }, + "values": { + "default": 639590, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Flow rate above which broken pipe alarm is set in 1/256 l/h", + "version": { + "first": 111, + "last": 118 + }, + "values": { + "default": 639590, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Flow rate above which broken pipe alarm is set in 1/256 l/h", + "version": { + "first": 119, + "last": 132 + }, + "values": { + "default": 639590, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Flow rate above which broken pipe alarm is set in 1/256 l/h", + "version": { + "first": 133, + "last": 137 + }, + "values": { + "default": 639999, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "LeakTimeThreshold": { + "id": 14, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for leak alarm in minutes", + "version": { + "first": 61, + "last": 110 + }, + "values": { + "default": 10080, + "minimum": 0, + "maximum": 69632 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for leak alarm in minutes", + "version": { + "first": 111, + "last": 118 + }, + "values": { + "default": 10080, + "minimum": 0, + "maximum": 69632 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for leak alarm in minutes", + "version": { + "first": 119, + "last": 137 + }, + "values": { + "default": 360, + "minimum": 0, + "maximum": 69632 + } + } + ] + }, + "ReverseFlowTimeThreshold": { + "id": 15, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Number of measurements in reverse flow required to set reverse flow alarm", + "version": { + "first": 61, + "last": 110 + }, + "values": { + "default": 15, + "minimum": 0, + "maximum": 255 + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Number of measurements in reverse flow required to set reverse flow alarm", + "version": { + "first": 111, + "last": 137 + }, + "values": { + "default": 15, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "Locale": { + "id": 18, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Timezone in which this application is set to run.", + "version": { + "first": 24, + "last": 137 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "AppArrangement": { + "id": 19, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "A name for the arrangement of applications on the meter", + "version": { + "first": 130, + "last": 137 + } + } + ] + }, + "RebootCount": { + "id": 20, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of times the meter has rebooted", + "version": { + "first": 73, + "last": 110 + }, + "values": { + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of times the meter has rebooted", + "version": { + "first": 111, + "last": 137 + }, + "values": { + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "ExcessFlowTimeThreshold": { + "id": 21, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for broken pipe alarm in minutes", + "version": { + "first": 80, + "last": 110 + }, + "values": { + "default": 15, + "minimum": 0, + "maximum": 69632 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for broken pipe alarm in minutes", + "version": { + "first": 111, + "last": 118 + }, + "values": { + "default": 15, + "minimum": 0, + "maximum": 69632 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for broken pipe alarm in minutes", + "version": { + "first": 119, + "last": 137 + }, + "values": { + "default": 180, + "minimum": 0, + "maximum": 69632 + } + } + ] + }, + "LeakFlowThreshold": { + "id": 22, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Flow rate above which leak alarm can be set in 1/256 l/h", + "version": { + "first": 80, + "last": 110 + }, + "values": { + "default": 12800, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Flow rate above which leak alarm can be set in 1/256 l/h", + "version": { + "first": 111, + "last": 118 + }, + "values": { + "default": 12800, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Flow rate above which leak alarm can be set in 1/256 l/h", + "version": { + "first": 119, + "last": 132 + }, + "values": { + "default": 5529, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Flow rate above which leak alarm can be set in 1/256 l/h", + "version": { + "first": 133, + "last": 137 + }, + "values": { + "default": 6399, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "MfgCharge": { + "id": 23, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Charge in uAs available in manufacturing (read only)", + "version": { + "first": 84, + "last": 137 + }, + "values": { + "default": 181440000 + } + } + ] + }, + "TemperatureHighThreshold": { + "id": 24, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "High temperature alarm threshold in 0.1°C", + "version": { + "first": 88, + "last": 100 + }, + "values": { + "default": 500, + "minimum": 0, + "maximum": 800 + } + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "High temperature alarm threshold in 0.1°C", + "version": { + "first": 101, + "last": 110 + }, + "values": { + "default": 500, + "minimum": 0, + "maximum": 800 + } + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "High temperature alarm threshold in 0.1°C", + "version": { + "first": 111, + "last": 137 + }, + "values": { + "default": 500, + "minimum": 0, + "maximum": 800 + } + } + ] + }, + "TemperatureHighDelay": { + "id": 25, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for high temperature alarm in seconds", + "version": { + "first": 88, + "last": 110 + }, + "values": { + "default": 600, + "minimum": 0, + "maximum": 10800 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for high temperature alarm in seconds", + "version": { + "first": 111, + "last": 137 + }, + "values": { + "default": 600, + "minimum": 0, + "maximum": 10800 + } + } + ] + }, + "TemperatureLowThreshold": { + "id": 26, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Low temperature alarm threshold in 0.1°C", + "version": { + "first": 88, + "last": 100 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Low temperature alarm threshold in 0.1°C", + "version": { + "first": 101, + "last": 110 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Low temperature alarm threshold in 0.1°C", + "version": { + "first": 111, + "last": 137 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "TemperatureLowDelay": { + "id": 27, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for low temperature alarm in seconds", + "version": { + "first": 88, + "last": 110 + }, + "values": { + "default": 600, + "minimum": 0, + "maximum": 10800 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for low temperature alarm in seconds", + "version": { + "first": 111, + "last": 137 + }, + "values": { + "default": 600, + "minimum": 0, + "maximum": 10800 + } + } + ] + }, + "PressureHighThreshold": { + "id": 28, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "High pressure alarm threshold in Pa", + "version": { + "first": 88, + "last": 110 + }, + "values": { + "default": 1600000, + "minimum": 0, + "maximum": 2550000 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "High pressure alarm threshold in Pa", + "version": { + "first": 111, + "last": 121 + }, + "values": { + "default": 1600000, + "minimum": 0, + "maximum": 2550000 + } + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "High pressure alarm threshold in Pa", + "version": { + "first": 122, + "last": 137 + }, + "values": { + "default": 1600000, + "minimum": 0, + "maximum": 2550000 + } + } + ] + }, + "PressureHighDelay": { + "id": 29, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for high pressure alarm in seconds", + "version": { + "first": 88, + "last": 110 + }, + "values": { + "default": 300, + "minimum": 0, + "maximum": 10800 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for high pressure alarm in seconds", + "version": { + "first": 111, + "last": 118 + }, + "values": { + "default": 300, + "minimum": 0, + "maximum": 10800 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for high pressure alarm in seconds", + "version": { + "first": 119, + "last": 137 + }, + "values": { + "default": 600, + "minimum": 0, + "maximum": 10800 + } + } + ] + }, + "PressureLowThreshold": { + "id": 30, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Low pressure alarm threshold in Pa", + "version": { + "first": 88, + "last": 110 + }, + "values": { + "default": 30000, + "minimum": 0, + "maximum": 2550000 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Low pressure alarm threshold in Pa", + "version": { + "first": 111, + "last": 121 + }, + "values": { + "default": 30000, + "minimum": 0, + "maximum": 2550000 + } + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Low pressure alarm threshold in Pa", + "version": { + "first": 122, + "last": 137 + }, + "values": { + "default": 30000, + "minimum": 0, + "maximum": 2550000 + } + } + ] + }, + "PressureLowDelay": { + "id": 31, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for low pressure alarm in seconds", + "version": { + "first": 88, + "last": 110 + }, + "values": { + "default": 300, + "minimum": 0, + "maximum": 10800 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for low pressure alarm in seconds", + "version": { + "first": 111, + "last": 118 + }, + "values": { + "default": 300, + "minimum": 0, + "maximum": 10800 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for low pressure alarm in seconds", + "version": { + "first": 119, + "last": 137 + }, + "values": { + "default": 600, + "minimum": 0, + "maximum": 10800 + } + } + ] + }, + "StoreConfiguration": { + "id": 32, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Store all configuration items in non-volatile memory.", + "version": { + "first": 88, + "last": 130 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Store all configuration items in non-volatile memory.", + "version": { + "first": 131, + "last": 137 + } + } + ] + } + }, + "status": { + "REBOOT": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 0 + }, + "REBOOT_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 1 + }, + "LOW_BATTERY": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 2 + }, + "LOW_BATTERY_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 3 + }, + "VERY_LOW_BATTERY": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 4 + }, + "VERY_LOW_BATTERY_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 5 + }, + "CONFIG_ERROR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 6 + }, + "CONFIG_ERROR_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 7 + }, + "EMPTY_PIPE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 8 + }, + "EMPTY_PIPE_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 9 + }, + "MAGNETIC_TAMPER": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 10 + }, + "MAGNETIC_TAMPER_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 11 + }, + "REVERSE_FLOW": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 12 + }, + "REVERSE_FLOW_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 13 + }, + "SUSPECT_LEAK": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 14 + }, + "SUSPECT_LEAK_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 15 + }, + "BROKEN_PIPE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 16 + }, + "BROKEN_PIPE_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 17 + }, + "LOW_PRESSURE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 18 + }, + "LOW_PRESSURE_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 19 + }, + "HIGH_PRESSURE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 20 + }, + "HIGH_PRESSURE_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 21 + }, + "LOW_TEMPERATURE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 22 + }, + "LOW_TEMPERATURE_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 23 + }, + "HIGH_TEMPERATURE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 24 + }, + "HIGH_TEMPERATURE_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 25 + }, + "RADIO_ERROR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 26 + }, + "RADIO_ERROR_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 27 + }, + "METROLOGY_PARAMS": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 28 + }, + "METROLOGY_PARAMS_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 29 + }, + "METROLOGY_MEASURE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 30 + }, + "METROLOGY_MEASURE_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 31 + }, + "UNALLOCATED_6": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 32 + }, + "UNALLOCATED_6_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 33 + }, + "UNALLOCATED_7": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 34 + }, + "UNALLOCATED_7_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 35 + }, + "UNALLOCATED_8": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 36 + }, + "UNALLOCATED_8_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 37 + }, + "UNALLOCATED_9": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 38 + }, + "UNALLOCATED_9_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 39 + }, + "UNALLOCATED_10": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 40 + }, + "UNALLOCATED_10_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 41 + }, + "UNALLOCATED_11": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 42 + }, + "UNALLOCATED_11_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 43 + }, + "UNALLOCATED_12": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 44 + }, + "UNALLOCATED_12_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 45 + }, + "UNALLOCATED_13": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 46 + }, + "UNALLOCATED_13_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 47 + }, + "UNALLOCATED_14": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 48 + }, + "UNALLOCATED_14_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 49 + }, + "UNALLOCATED_15": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 50 + }, + "UNALLOCATED_15_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 51 + }, + "UNALLOCATED_16": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 52 + }, + "UNALLOCATED_16_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 53 + }, + "UNALLOCATED_17": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 54 + }, + "UNALLOCATED_17_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 55 + }, + "UNALLOCATED_18": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 56 + }, + "UNALLOCATED_18_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 57 + }, + "UNALLOCATED_19": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 58 + }, + "UNALLOCATED_19_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 59 + }, + "UNALLOCATED_20": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 60 + }, + "UNALLOCATED_20_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 61 + }, + "UNALLOCATED_21": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 62 + }, + "UNALLOCATED_21_STOP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 63 + }, + "UNKNOWN_PARAMETER": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 64 + }, + "LOCALE_UNDEFINED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 65 + }, + "NO_SUCH_ALARM": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 66 + }, + "OUT_OF_RANGE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 67 + }, + "NOT_IMPLEMENTED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 68 + }, + "BAD_CONFIG": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 69 + }, + "DID_NOT_STORE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 70 + }, + "STORE_PENDING": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 71 + } + } + }, + "FUNCTEST": { + "id": 10, + "version": { + "first": null, + "last": null + }, + "registers": { + "GP30Test": { + "id": 0, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "LCDTest": { + "id": 1, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "Iloop": { + "id": 2, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "Pulse": { + "id": 3, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "Pressure": { + "id": 4, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "BatteryVoltage": { + "id": 5, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "SupplyVoltage": { + "id": 6, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "Temperature": { + "id": 7, + "details": [ + { + "type": "int16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "RFID": { + "id": 8, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "OpticalOutput": { + "id": 9, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "Radio": { + "id": 10, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "MultiTest": { + "id": 11, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "NFCUID": { + "id": 12, + "details": [ + { + "type": "uint64_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "CPUTest": { + "id": 13, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + } + }, + "status": { + "BAD_CONFIG": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 0 + }, + "BAD_TEST": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 1 + }, + "NO_RESULT": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 2 + } + } + }, + "OPTICALPORT": { + "id": 5, + "version": { + "first": 1, + "last": 55 + }, + "registers": { + "BaudRateCapabilities": { + "id": 0, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Bitmask of supported rates on the given hardware.", + "version": { + "first": 2, + "last": 55 + } + } + ] + }, + "PacketSizeCapabilities": { + "id": 1, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Bitmask of supported packet sizes.", + "version": { + "first": 2, + "last": 55 + }, + "values": { + "default": 64 + } + } + ] + }, + "ProtocolVersion": { + "id": 2, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Version number as fixed point 16.16 format BCD.", + "version": { + "first": 2, + "last": 55 + } + } + ] + }, + "BaudRateSelected": { + "id": 3, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Baud rate in bits per second.", + "version": { + "first": 2, + "last": 55 + } + } + ] + }, + "PacketSizeSelected": { + "id": 4, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Packet size in bytes.", + "version": { + "first": 2, + "last": 55 + } + } + ] + }, + "ExternalUartControl": { + "id": 5, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "WO", + "lvl2": "WO", + "lvl3": "WO", + "lvl4": "WO", + "lvl5": "WO", + "lvl6": "WO", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Surrenders the UART to another application", + "version": { + "first": 49, + "last": 55 + } + } + ] + } + }, + "status": { + "PAYLOAD_COUNT": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 0 + }, + "INVALID_SUBREASON": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 1 + }, + "INVALID_BAUDRATE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 2 + }, + "INVALID_BUFFERSIZE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 3 + }, + "CRCFAILURE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 4 + }, + "UNRECOGNISEDCMD": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 5 + }, + "FRAMING": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 6 + }, + "OVERFLOW": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 7 + }, + "PACKETTIMEOUT": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 8 + }, + "INVALIDESCAPE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 9 + }, + "UNKNOWN_PARAMETER": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 10 + }, + "TRAINING_FAILED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 11 + }, + "NOBREAK": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 12 + } + } + }, + "SENSUSRADIO": { + "id": 16, + "version": { + "first": null, + "last": null + }, + "registers": { + "TxInterval": { + "id": 0, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "OmTxInterval": { + "id": 1, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "LatInterval": { + "id": 2, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "WakeupInterval": { + "id": 3, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "MbusState": { + "id": 4, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "FrequencyIndicator": { + "id": 5, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "FrequencyOffset": { + "id": 6, + "details": [ + { + "type": "int16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "PowerLevel": { + "id": 7, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "SystemState": { + "id": 9, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "RadioAddress": { + "id": 10, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "UtcTimeOffset": { + "id": 11, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "SentBytesCounter": { + "id": 12, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "ReceivedBytesCounter": { + "id": 13, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "ResetCounter": { + "id": 14, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "BootLoaderState": { + "id": 15, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "LeakFlowThreshold": { + "id": 16, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "LeakFlowTimeThreshold": { + "id": 17, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "BrokenPipeFlowThreshold": { + "id": 18, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "BrokenPipeFlowTimeThreshold": { + "id": 19, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "PressureMaxThreshold": { + "id": 20, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "PressureMinThreshold": { + "id": 21, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "PressureLimitTimeMaxThreshold": { + "id": 22, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "PressureLimitTimeMinThreshold": { + "id": 23, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "PressureMeasurePeriod": { + "id": 24, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "PressureUnit": { + "id": 25, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "PressureGaugeOffset": { + "id": 26, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "TemperatureMaxThreshold": { + "id": 27, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "TemperatureMinThreshold": { + "id": 28, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "TemperatureTimeMaxThreshold": { + "id": 29, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "TemperatureTimeMinThreshold": { + "id": 30, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "TemperatureMeasurePeriod": { + "id": 31, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "TemperatureUnit": { + "id": 32, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "PulseOutWidth": { + "id": 33, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "PulseOutDivisor": { + "id": 34, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "PulseOutMode": { + "id": 35, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "CurrentLoopMax": { + "id": 36, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "CurrentLoopSource": { + "id": 37, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "MainAlarmMask": { + "id": 38, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "ExtendedAlarmMask": { + "id": 39, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "HistoricalAlarmsDays": { + "id": 40, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "TestModeTime": { + "id": 43, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "EncryptionKey": { + "id": 44, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "Authentification": { + "id": 45, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "UpgFWVersion": { + "id": 46, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "CustomerText": { + "id": 47, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "RadioLastReadTime": { + "id": 48, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "LowBatDateTime": { + "id": 49, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "VeryLowBatDateTime": { + "id": 50, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "Unit": { + "id": 51, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "ExtendedUnitFlags": { + "id": 52, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "OTAControlFlags": { + "id": 53, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "DataLogContents": { + "id": 56, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "DataLogPeriod": { + "id": 57, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "AverageFlowPeriod": { + "id": 58, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "FixedDateReadingContents": { + "id": 59, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "FixedDateDayOfMonth": { + "id": 60, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "MetroRadioLifeTimeCounter": { + "id": 61, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "PowerLevelOption": { + "id": 62, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "ImpedanceCodeNew": { + "id": 63, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "ImpedanceCodeOption": { + "id": 64, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "IrDAModulePresent": { + "id": 65, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "StoreConfiguration": { + "id": 66, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "LifeTimeSeconds": { + "id": 67, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + } + }, + "status": { + "UNKNOWN_PARAMETER": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 0 + }, + "BAD_CONFIG": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 1 + }, + "NO_CHANGE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 2 + } + } + }, + "CONFIGEXCHANGE": { + "id": 4, + "version": { + "first": 3, + "last": 205 + }, + "registers": { + "Privilege": { + "id": 0, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Written to set the login level, followed by the password. Note, this can be read at any login level including 0.", + "version": { + "first": 3, + "last": 205 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 8 + } + } + ] + }, + "Password": { + "id": 1, + "details": [ + { + "type": "uint96_t", + "privilege": { + "lvl1": "WO", + "lvl2": "WO", + "lvl3": "WO", + "lvl4": "WO", + "lvl5": "WO", + "lvl6": "WO", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Password for logging in, requires 3 consecutive writes", + "version": { + "first": 3, + "last": 205 + } + } + ] + }, + "FOpen": { + "id": 2, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this to open a file on the meter, handle returned", + "version": { + "first": 20, + "last": 205 + } + } + ] + }, + "FClose": { + "id": 3, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this to close a file on the meter", + "version": { + "first": 20, + "last": 205 + } + } + ] + }, + "FRead": { + "id": 4, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this to read bytes from an open file", + "version": { + "first": 20, + "last": 205 + } + } + ] + }, + "FWrite": { + "id": 5, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this to write bytes to an open file", + "version": { + "first": 20, + "last": 205 + } + } + ] + }, + "FSeek": { + "id": 6, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this to seek within an open file", + "version": { + "first": 20, + "last": 205 + } + } + ] + }, + "FTell": { + "id": 7, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this to determine position within an open file", + "version": { + "first": 20, + "last": 205 + } + } + ] + }, + "Remove": { + "id": 8, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this to delete a file", + "version": { + "first": 20, + "last": 205 + } + } + ] + }, + "FEOF": { + "id": 9, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this determine whether the current position in an open file is the end of the file", + "version": { + "first": 20, + "last": 205 + } + } + ] + }, + "Catalogue": { + "id": 10, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Returns a list of files in the filesystem that matches a string containing wildcards passed in", + "version": { + "first": 49, + "last": 205 + } + } + ] + }, + "PCBSerialNumber": { + "id": 12, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "String containing the PCB serial number. Note, this can be read at any login level including 0", + "version": { + "first": 59, + "last": 205 + } + } + ] + }, + "ConfigAccessRights": { + "id": 13, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bitmask of login levels permitted to manipulate dangerous files", + "version": { + "first": 59, + "last": 205 + } + } + ] + }, + "FFlush": { + "id": 14, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this to flush write buffers to an open file", + "version": { + "first": 66, + "last": 205 + } + } + ] + } + }, + "status": { + "LOCKED_OUT": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 0 + }, + "AUTHENTICATION_FAILURE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 1 + }, + "ACCESS_DENIED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 2 + }, + "UNKNOWN_PARAMETER": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 3 + }, + "IN_USE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 4 + }, + "SIZES_DONT_MATCH": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 5 + }, + "CANT_READ_CONFIG_FILE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 6 + }, + "USER_NOT_KNOWN": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 7 + }, + "CANT_CREATE_CONFIG_FILE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 8 + }, + "STORE_DIDNT_STORE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 9 + }, + "STORE_CORRUPT": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 10 + }, + "EXPECTED_WRITE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 11 + }, + "EXPECTED_READ": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 12 + }, + "STOP_CYCLING": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 13 + }, + "TOO_MANY_OPEN": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 14 + }, + "NEVER_OPENED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 15 + }, + "FILE_PROTECTED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 16 + }, + "PARTIAL_RECALL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 17 + }, + "DEFAULT_PASSWORD_USED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 18 + } + } + }, + "NFC": { + "id": 21, + "version": { + "first": 1, + "last": 47 + }, + "registers": { + "EraseRMA": { + "id": 0, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RW" + }, + "description": "Writing TRUE to this register erases the RMA area", + "version": { + "first": 7, + "last": 47 + } + } + ] + } + }, + "status": { + "BAD_CONFIG": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 0 + }, + "NDEF_WRITE_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id" : 1 + }, + "NDEF_VERIFY_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id" : 2 + }, + "NDEF_UPDATE_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id" : 3 + }, + "RMA_WRITE_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id" : 4 + }, + "RMA_VERIFY_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id" : 5 + }, + "RMA_BAD_ENTRY": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id" : 6 + }, + "INIT_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id" : 7 + }, + "NDEF_CONFIG_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id" : 8 + }, + "RMA_CONFIG_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id" : 9 + }, + "NDEF_START_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id" : 10 + }, + "RMA_START_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id" : 11 + } + } + }, + "SYSTEM": { + "id": 0, + "version": { + "first": 141, + "last": 474 + }, + "registers": { + "TriggerUpgrade": { + "id": 0, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Writing TRUE to this register internally calls SysTriggerUpgrade() then returns the result.", + "version": { + "first": 141, + "last": 474 + } + } + ] + }, + "CheckPresence": { + "id": 1, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Writing an application id number allows the version number of that application to be read back.", + "version": { + "first": 150, + "last": 474 + } + } + ] + }, + "PCBSerialNumber": { + "id": 2, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "A string reporting the PCB serial number, this string must be set using production equipment.", + "version": { + "first": 169, + "last": 474 + }, + "values": { + "default": "" + } + } + ] + }, + "CustomerSerialNumber0": { + "id": 3, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A string reported relating to the customer, this string can be written only once after manufacture. If subsequent changes are needed CUSTOMERSERIALNUMBER1 must be used.", + "version": { + "first": 170, + "last": 474 + }, + "values": { + "default": "" + } + } + ] + }, + "CustomerSerialNumber1": { + "id": 4, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A string reported relating to the customer, this string can be written only once after manufacture. If subsequent changes are needed CUSTOMERSERIALNUMBER2 must be used.", + "version": { + "first": 170, + "last": 474 + }, + "values": { + "default": "" + } + } + ] + }, + "CustomerSerialNumber2": { + "id": 5, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A string reported relating to the customer, this string can be written only once after manufacture. If subsequent changes are needed CUSTOMERSERIALNUMBER3 must be used.", + "version": { + "first": 170, + "last": 474 + }, + "values": { + "default": "" + } + } + ] + }, + "CustomerSerialNumber3": { + "id": 6, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A string reported relating to the customer, this string can be written only once after manufacture. This is the last customer serial number change slot.", + "version": { + "first": 170, + "last": 474 + }, + "values": { + "default": "" + } + } + ] + }, + "MonotonicSeconds": { + "id": 7, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "The number of seconds since reboot.", + "version": { + "first": 176, + "last": 474 + } + } + ] + }, + "CalendarSeconds": { + "id": 8, + "details": [ + { + "type": "time_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of seconds since 01-Jan-2000.", + "version": { + "first": 176, + "last": 474 + } + } + ] + }, + "CoreRevision": { + "id": 9, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "A string reporting the product version string held in the system core binary.", + "version": { + "first": 196, + "last": 474 + } + } + ] + }, + "DriveCapacity": { + "id": 10, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Writing a drive number returns the drive capacity in bytes, or 0 if the drive is not ready, or an error if the driver is not configured to be present.", + "version": { + "first": 233, + "last": 474 + } + } + ] + }, + "ExitReason": { + "id": 11, + "details": [ + { + "type": "status_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Writing an application id number allows the exit error number of that application to be read back.", + "version": { + "first": 258, + "last": 474 + } + } + ] + }, + "CorePlatform": { + "id": 12, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Reports the instruction set of the hosting microprocessor in b8-15 and allocated platform number in b0-7.", + "version": { + "first": 265, + "last": 474 + } + } + ] + }, + "CRC": { + "id": 13, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Writing an application id number allows the CRC of that application to be read back.", + "version": { + "first": 279, + "last": 474 + } + } + ] + }, + "UpgradePermissions": { + "id": 14, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bitfield of permissions releated to firmware upgrade", + "version": { + "first": 470, + "last": 474 + } + } + ] + } + }, + "status": { + "OK": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 0 + }, + "ZERO_APPS": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 1 + }, + "NO_MEMORY": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 2 + }, + "NOT_IMPLEMENTED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 3 + }, + "BLOCK_NOT_FOUND": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 4 + }, + "NO_SUCH_VAR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 5 + }, + "NO_CLIB": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 6 + }, + "KEY_FAILURE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 7 + }, + "NO_SLOTS_FREE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 8 + }, + "VECTOR_OUT_OF_RANGE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 9 + }, + "BAD_VECTOR_RELEASE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 10 + }, + "DRIVER_BUSY": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 11 + }, + "OUT_OF_RANGE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 12 + }, + "CANT_CANCEL_TICK": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 13 + }, + "ID_OUT_OF_RANGE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 14 + }, + "HANDLE_OUT_OF_RANGE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 15 + }, + "INCAPABLE_HARDWARE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 16 + }, + "ALREADY_OPEN": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 17 + }, + "STRING_TOO_LONG": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 18 + }, + "CORRUPT_CONFIGURATION": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 19 + }, + "TIMEOUT": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 20 + }, + "NO_PRIVILEGE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 21 + }, + "DEVICE_DORMANT": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 22 + }, + "MEDIA_FAILURE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 23 + }, + "BUFFER_OVERFLOW": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 24 + }, + "UPGRADE_SYNTAX_ERROR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 25 + }, + "UPGRADE_DEPENDENCY_NOT_MET": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 26 + }, + "UPGRADE_MISSING": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 27 + }, + "UPGRADE_FRAGMENTED_BY_CLIB": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 28 + }, + "TRUNCATED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 29 + }, + "INVALID_HEADER": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 30 + }, + "WONT_DELETE_CLIB": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 31 + }, + "BAD_REGISTER_VALUE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 32 + }, + "NO_CHANGE_MADE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 33 + }, + "NOT_ATOMIC": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 34 + }, + "CALENDAR_CHANGED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 35 + }, + "WORM_FIELD": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 36 + }, + "CONVERSION_UNSUPPORTED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 37 + }, + "CPU_PERMISSION_FAULT": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 38 + }, + "CPU_SOFTWARE_FAULT": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 39 + }, + "CPU_DECODE_FAULT": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 40 + }, + "CPU_ADDRESS_ACCESS_FAULT": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 41 + }, + "CPU_UNCAUGHT_FAULT": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 42 + }, + "ACCURACY_LOST": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 43 + }, + "EXIT_FAILURE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 44 + }, + "CANT_CANCEL_CALLBACK": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 45 + }, + "RECOVERED_SPACE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 46 + }, + "DRIVE_FULL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 47 + }, + "NO_FILE_HANDLES_AVAILABLE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 48 + }, + "EXCESSIVE_RESTARTS": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 49 + }, + "MPU_SETUP_FAILED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 50 + }, + "DEVICE_NOT_OPEN": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 51 + }, + "NO_RESPONSE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 52 + } + } + }, + "METROLOGYASST": { + "id": 18, + "version": { + "first": 4, + "last": 87 + }, + "registers": { + "ILoopMaxFlowRate": { + "id": 0, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The flow rate that gives max output on the current loop", + "version": { + "first": 5, + "last": 36 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The flow rate that gives max output on the current loop", + "version": { + "first": 82, + "last": 87 + } + } + ] + }, + "StoreConfiguration": { + "id": 1, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Writing TRUE to this register stores the values of the other registers to the non-volatile memory", + "version": { + "first": 7, + "last": 81 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Writing TRUE to this register stores the values of the other registers to the non-volatile memory", + "version": { + "first": 82, + "last": 87 + } + } + ] + }, + "PulseWeight": { + "id": 2, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Volume represented by one pulse in ml. If this is zero pulse output will not be enabled", + "version": { + "first": 7, + "last": 81 + }, + "values": { + "default": 1000, + "minimum": 1, + "maximum": 4294967295 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Volume represented by one pulse in ml. If this is zero pulse output will not be enabled", + "version": { + "first": 82, + "last": 87 + }, + "values": { + "default": 1000, + "minimum": 1, + "maximum": 4294967295 + } + } + ] + }, + "PulseMode": { + "id": 3, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The way pulses are output on the two available channels. This is an enum of type pulse_mode_t.", + "version": { + "first": 7, + "last": 81 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 6 + } + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The way pulses are output on the two available channels. This is an enum of type pulse_mode_t.", + "version": { + "first": 82, + "last": 87 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 6 + } + } + ] + }, + "PulseLength": { + "id": 4, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The length of a pulse. This is an enum of type pulse_length_t.", + "version": { + "first": 7, + "last": 72 + }, + "values": { + "default": 5, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The length of a pulse. This is an enum of type pulse_length_t.", + "version": { + "first": 73, + "last": 81 + }, + "values": { + "default": 4, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The length of a pulse. This is an enum of type pulse_length_t.", + "version": { + "first": 82, + "last": 87 + }, + "values": { + "default": 4, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "FlowUnits": { + "id": 5, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The units of flow rate to display on the LCD. An enum of type displayflowunits_t", + "version": { + "first": 8, + "last": 81 + }, + "values": { + "default": 4, + "minimum": 0, + "maximum": 8 + } + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The units of flow rate to display on the LCD. An enum of type displayflowunits_t", + "version": { + "first": 82, + "last": 87 + }, + "values": { + "default": 4, + "minimum": 0, + "maximum": 8 + } + } + ] + }, + "FlowPoint": { + "id": 6, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Position of the decimal point on the LCD for flow rate. An enum of type displayflowpoint_t", + "version": { + "first": 8, + "last": 81 + }, + "values": { + "default": 2, + "minimum": 0, + "maximum": 4 + } + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Position of the decimal point on the LCD for flow rate. An enum of type displayflowpoint_t", + "version": { + "first": 82, + "last": 87 + }, + "values": { + "default": 2, + "minimum": 0, + "maximum": 4 + } + } + ] + }, + "ILoopRate": { + "id": 7, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The update rate for the current loop", + "version": { + "first": 9, + "last": 36 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The update rate for the current loop", + "version": { + "first": 82, + "last": 87 + } + } + ] + }, + "TemperatureUnits": { + "id": 8, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Units for displaying temperature on the LCD. 0 – Celcius, 1 – Fahrenheit.", + "version": { + "first": 13, + "last": 81 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + } + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Units for displaying temperature on the LCD. 0 – Celcius, 1 – Fahrenheit.", + "version": { + "first": 82, + "last": 87 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + } + } + ] + }, + "PressureUnits": { + "id": 9, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Units for displaying pressure on the LCD. 0 – Mpa, 1 – PSI.", + "version": { + "first": 13, + "last": 81 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + } + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Units for displaying pressure on the LCD. 0 – Mpa, 1 – PSI.", + "version": { + "first": 82, + "last": 87 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + } + } + ] + }, + "PressureRate": { + "id": 10, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time between pressure measurements in milliseconds", + "version": { + "first": 13, + "last": 71 + }, + "values": { + "default": 300000, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time between pressure measurements in milliseconds", + "version": { + "first": 72, + "last": 81 + }, + "values": { + "default": 60000, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time between pressure measurements in milliseconds", + "version": { + "first": 82, + "last": 87 + }, + "values": { + "default": 60000, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "PressureOffset": { + "id": 11, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Value in Pa to subtract from measured value to correct for atmospheric pressure", + "version": { + "first": 13, + "last": 58 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Value in Pa to subtract from measured value to correct for atmospheric pressure", + "version": { + "first": 59, + "last": 79 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + } + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Value in Pa to subtract from measured value to correct for atmospheric pressure", + "version": { + "first": 80, + "last": 81 + }, + "values": { + "default": 0, + "minimum": -2000000, + "maximum": 2000000 + } + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Value in Pa to subtract from measured value to correct for atmospheric pressure", + "version": { + "first": 82, + "last": 87 + }, + "values": { + "default": 0, + "minimum": -2000000, + "maximum": 2000000 + } + } + ] + }, + "PressurePresent": { + "id": 12, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Whether there is a pressure sensor present", + "version": { + "first": 63, + "last": 70 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 1 + } + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Whether there is a pressure sensor present", + "version": { + "first": 71, + "last": 87 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + } + } + ] + }, + "PressureMeasure": { + "id": 13, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write TRUE to trigger a pressure measurement, Read to get the latest measured value in Pa", + "version": { + "first": 65, + "last": 87 + } + } + ] + } + }, + "status": { + "BAD_CONFIG": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 0 + }, + "DID_NOT_STORE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 1 + }, + "PENDING_STORE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 2 + } + } + }, + "LOGGER": { + "id": 8, + "version": { + "first": 1, + "last": 16 + }, + "registers": { + "Quota": { + "id": 0, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A quota in bytes for the log. The Logger does not apply any policy to how the quota is allocated, this is left as a restriction to be applied on a product by product basis.", + "version": { + "first": 1, + "last": 16 + }, + "values": { + "default": 4096, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "Drive": { + "id": 1, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The drive to write to.", + "version": { + "first": 1, + "last": 16 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "TriggerLogFlush": { + "id": 2, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Writing TRUE will force a log flush", + "version": { + "first": 7, + "last": 16 + } + } + ] + }, + "StoreConfiguration": { + "id": 3, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store configuration values to non-volatile storage. Read back for status", + "version": { + "first": 16, + "last": 16 + } + } + ] + } + }, + "status": { + "UNKNOWN_PARAMETER": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 0 + }, + "RESTARTED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 1 + }, + "BLOCK_LISTING": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 2 + }, + "PENDING_STORE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 3 + }, + "DID_NOT_STORE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 4 + } + } + }, + "TESTMANAGER": { + "id": 98, + "version": { + "first": null, + "last": null + }, + "registers": { + "OutputFile": { + "id": 0, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "TestNumber": { + "id": 1, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "TestStatus": { + "id": 2, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "TrapError": { + "id": 3, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "TestParameter": { + "id": 4, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + } + }, + "status": { + "FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 0 + }, + "UNKNOWN_PARAMETER": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 1 + }, + "READ_ONLY_PARAMETER": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 2 + }, + "BUSY": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 3 + }, + "STRING_TOO_LONG": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 4 + }, + "FOPEN_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 5 + }, + "FSEEK_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 6 + }, + "FWRITE_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 7 + }, + "FCLOSE_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 8 + }, + "MALFORMED_FILENAME": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 9 + }, + "UNKNOWN_ACTION": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 10 + }, + "FILEREMOVE_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 11 + }, + "FREAD_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 12 + } + } + }, + "PERIODICLOG": { + "id": 17, + "version": { + "first": 1, + "last": 53 + }, + "registers": { + "DataLogContents": { + "id": 0, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit Mask of the items to store in LOG memory", + "version": { + "first": 10, + "last": 53 + } + } + ] + }, + "DataLogPeriod": { + "id": 1, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Storage Period of the LOG memory in minutes", + "version": { + "first": 10, + "last": 53 + } + } + ] + }, + "AverageFlowPeriod": { + "id": 2, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Averiging period for the Min/Max calculation of LOG&FDR memory", + "version": { + "first": 10, + "last": 53 + } + } + ] + }, + "FixedDateReadingContents": { + "id": 3, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit Mask of the items to store in FDR memory", + "version": { + "first": 10, + "last": 53 + } + } + ] + }, + "FixedDateDayOfMonth": { + "id": 4, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The day of month the FDR storage will take place at 00:00", + "version": { + "first": 10, + "last": 53 + } + } + ] + }, + "PeriodicLogLifeTimeCounter": { + "id": 5, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A counter used for internal purposes", + "version": { + "first": 15, + "last": 53 + } + } + ] + }, + "ResetCounter": { + "id": 6, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A counter to monitor the application resets", + "version": { + "first": 20, + "last": 53 + } + } + ] + } + }, + "status": { + "FOPEN": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 0 + }, + "BAD_CONFIG": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 1 + }, + "STRING_TOO_LONG": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 2 + }, + "FILES_IN_USE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 3 + } + } + }, + "POWERMON": { + "id": 1, + "version": { + "first": 17, + "last": 65 + }, + "registers": { + "BatteryVoltage": { + "id": 0, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Measured battery terminal voltage in 1mV units.", + "version": { + "first": 17, + "last": 65 + } + } + ] + }, + "BatteryManufacturer": { + "id": 1, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "String describing the battery brand.", + "version": { + "first": 17, + "last": 65 + }, + "values": { + "default": "Tadiran" + } + } + ] + }, + "BatterySize": { + "id": 2, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "One of: 0 = battery absent; 1 = built in; 2 = other; 3 = AA; 4 = AAA; 5 = C; 6 = D; 255 = unknown", + "version": { + "first": 17, + "last": 65 + }, + "values": { + "default": 6, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "BatteryQuantity": { + "id": 4, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "The number of installed batteries.", + "version": { + "first": 17, + "last": 59 + }, + "values": { + "default": 1 + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of installed batteries.", + "version": { + "first": 60, + "last": 65 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "BatteryRatedVoltage": { + "id": 5, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Datasheet terminal voltage in 100mV units as manufactured.", + "version": { + "first": 17, + "last": 65 + }, + "values": { + "default": 36, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "BatteryVoltageMinThreshold": { + "id": 7, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Datasheet terminal voltage in 100mV units below which the cell is considered empty.", + "version": { + "first": 17, + "last": 65 + }, + "values": { + "default": 28, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "BatterySelection": { + "id": 8, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Chosen manufacturer from the internal lookup table of known batteries.", + "version": { + "first": 20, + "last": 65 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + } + } + ] + }, + "TotalUsedCharge": { + "id": 9, + "details": [ + { + "type": "uint64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Accumulated charge used in uAs.", + "version": { + "first": 24, + "last": 65 + } + } + ] + }, + "TotalUsedSeconds": { + "id": 10, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Elapsed time since manufacture in seconds.", + "version": { + "first": 39, + "last": 65 + } + } + ] + }, + "WarnFromClamp": { + "id": 11, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time in seconds for which the projected end time cannot exceed.", + "version": { + "first": 39, + "last": 65 + }, + "values": { + "default": 474040000, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "BatteryMilliAHrRating": { + "id": 12, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Datasheet capacity in mAh units as manufactured.", + "version": { + "first": 45, + "last": 65 + }, + "values": { + "default": 19000, + "minimum": 0, + "maximum": 65535 + } + } + ] + }, + "StoreConfiguration": { + "id": 13, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store configuration values to non-volatile storage. Read back for status", + "version": { + "first": 61, + "last": 65 + } + } + ] + } + }, + "status": { + "TABLE_FULL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 0 + }, + "UNKNOWN_PARAMETER": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 1 + }, + "OUT_OF_RANGE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 2 + }, + "STOP_CYCLING": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 3 + }, + "TEMPERATURE_LIMIT": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 4 + }, + "BATTERY_STATUS_CHANGED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 5 + }, + "BATTERY_CRITICAL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 6 + }, + "PENDING_STORE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 7 + }, + "DID_NOT_STORE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 8 + } + } + }, + "GENESISFLOW": { + "id": 15, + "version": { + "first": 7, + "last": 271 + }, + "registers": { + "SampleRate": { + "id": 0, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The rate in Hz that each GP30 takes measurements", + "version": { + "first": 7, + "last": 203 + }, + "values": { + "default": 6, + "minimum": 0, + "maximum": 255 + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The rate in Hz that each GP30 takes measurements", + "version": { + "first": 205, + "last": 267 + }, + "values": { + "default": 2, + "minimum": 0, + "maximum": 255 + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The rate in Hz that each GP30 takes measurements", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 2, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "FirstHitLvlUp1": { + "id": 1, + "details": [ + { + "type": "int8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 1, units of 0.88mV", + "version": { + "first": 7, + "last": 267 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + } + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 1, units of 0.88mV", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + } + } + ] + }, + "FirstHitLvlUp2": { + "id": 2, + "details": [ + { + "type": "int8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 2, units of 0.88mV", + "version": { + "first": 7, + "last": 267 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + } + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 2, units of 0.88mV", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + } + } + ] + }, + "FirstHitLvlUp3": { + "id": 3, + "details": [ + { + "type": "int8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 3, units of 0.88mV", + "version": { + "first": 7, + "last": 267 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + } + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 3, units of 0.88mV", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + } + } + ] + }, + "FirstHitLvlDown1": { + "id": 4, + "details": [ + { + "type": "int8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 1, units of 0.88mV", + "version": { + "first": 7, + "last": 267 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + } + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 1, units of 0.88mV", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + } + } + ] + }, + "FirstHitLvlDown2": { + "id": 5, + "details": [ + { + "type": "int8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 2, units of 0.88mV", + "version": { + "first": 7, + "last": 267 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + } + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 2, units of 0.88mV", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + } + } + ] + }, + "FirstHitLvlDown3": { + "id": 6, + "details": [ + { + "type": "int8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 3, units of 0.88mV", + "version": { + "first": 7, + "last": 267 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + } + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 3, units of 0.88mV", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + } + } + ] + }, + "StartHit": { + "id": 7, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The hit number to consider as the first hit", + "version": { + "first": 7, + "last": 267 + }, + "values": { + "default": 6, + "minimum": 0, + "maximum": 255 + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The hit number to consider as the first hit", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 6, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "AmplitudePeakDetectEnd": { + "id": 8, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Where to stop running the amplitude peak detection", + "version": { + "first": 7, + "last": 267 + }, + "values": { + "default": 19, + "minimum": 0, + "maximum": 255 + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Where to stop running the amplitude peak detection", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 19, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "NumFirePulses": { + "id": 9, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of pulses to fire for a measurement", + "version": { + "first": 7, + "last": 267 + }, + "values": { + "default": 17, + "minimum": 0, + "maximum": 255 + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of pulses to fire for a measurement", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 17, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "DisplayPow10": { + "id": 10, + "details": [ + { + "type": "int8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The weight of the lowest display digit as a power of 10. The accepted range of values depends on the LCD present and the DisplayUnits chosen", + "version": { + "first": 36, + "last": 267 + }, + "values": { + "default": -6, + "minimum": -128, + "maximum": 127 + } + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The weight of the lowest display digit as a power of 10. The accepted range of values depends on the LCD present and the DisplayUnits chosen", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": -6, + "minimum": -128, + "maximum": 127 + } + } + ] + }, + "DisplayUnits": { + "id": 11, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The units of volume to display. The accepted range of values depends on the LCD present and the DisplayPow10 chosen", + "version": { + "first": 36, + "last": 267 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 6 + } + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The units of volume to display. The accepted range of values depends on the LCD present and the DisplayPow10 chosen", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 6 + } + } + ] + }, + "MeterSize": { + "id": 12, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The meter pipe size", + "version": { + "first": 45, + "last": 267 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 9 + } + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The meter pipe size", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 9 + } + } + ] + }, + "CalFactor1": { + "id": 13, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 1", + "version": { + "first": 45, + "last": 205 + }, + "values": { + "default": 62500, + "minimum": 0, + "maximum": 65535 + } + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 1", + "version": { + "first": 201, + "last": 267 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + } + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 1", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + } + } + ] + }, + "CalFactor2": { + "id": 14, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 2", + "version": { + "first": 45, + "last": 205 + }, + "values": { + "default": 62500, + "minimum": 0, + "maximum": 65535 + } + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 2", + "version": { + "first": 201, + "last": 267 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + } + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 2", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + } + } + ] + }, + "CalFactor3": { + "id": 15, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 3", + "version": { + "first": 45, + "last": 205 + }, + "values": { + "default": 62500, + "minimum": 0, + "maximum": 65535 + } + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 3", + "version": { + "first": 201, + "last": 267 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + } + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 3", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + } + } + ] + }, + "ZeroOffset1": { + "id": 16, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 1 at zero flow. Value is in usual time of flight scaling (ie LS bit is 2^-38 seconds)", + "version": { + "first": 45, + "last": 132 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + } + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 1 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 133, + "last": 267 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + } + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 1 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + } + } + ] + }, + "ZeroOffset2": { + "id": 17, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 2 at zero flow. Value is in usual time of flight scaling (ie LS bit is 2^-38 seconds)", + "version": { + "first": 45, + "last": 132 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + } + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 2 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 133, + "last": 267 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + } + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 2 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + } + } + ] + }, + "ZeroOffset3": { + "id": 18, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 3 at zero flow. Value is in usual time of flight scaling (ie LS bit is 2^-38 seconds)", + "version": { + "first": 45, + "last": 132 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + } + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 3 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 133, + "last": 267 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + } + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 3 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + } + } + ] + }, + "ScaledBilling": { + "id": 19, + "details": [ + { + "type": "int64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "The scaled volume value shown on the display. In the units and precision set by DisplayUnits and DisplayPow10 respectively. Decimal point is not represented in this value", + "version": { + "first": 47, + "last": 271 + } + } + ] + }, + "ResetAccumulators": { + "id": 20, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "WO", + "lvl2": "WO", + "lvl3": "WO", + "lvl4": "WO", + "lvl5": "WO", + "lvl6": "WO", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write 1 to reset all accumulated volume to zero", + "version": { + "first": 47, + "last": 267 + } + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write 1 to reset all accumulated volume to zero", + "version": { + "first": 268, + "last": 271 + } + } + ] + }, + "ForwardArrow": { + "id": 21, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The forward flow direction. 0 - undecided, 1 - right, 2 - left", + "version": { + "first": 47, + "last": 267 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 2 + } + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The forward flow direction. 0 - undecided, 1 - right, 2 - left", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 2 + } + } + ] + }, + "LedMode": { + "id": 22, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The type of data output by the green LED", + "version": { + "first": 47, + "last": 203 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 6 + } + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The type of data output by the green LED", + "version": { + "first": 205, + "last": 267 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 6 + } + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The type of data output by the green LED", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 6 + } + } + ] + }, + "StoreCalibration": { + "id": 23, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store calibration values to non-volatile storage. Read back for status", + "version": { + "first": 54, + "last": 271 + } + } + ] + }, + "UnscaledFwd": { + "id": 24, + "details": [ + { + "type": "uint64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The forward flow accumulator volume. The scale depends on the meter size", + "version": { + "first": 54, + "last": 271 + } + } + ] + }, + "UnscaledRev": { + "id": 25, + "details": [ + { + "type": "uint64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The reverse flow accumulator volume. The scale depends on the meter size", + "version": { + "first": 54, + "last": 271 + } + } + ] + }, + "LowFlowThreshold": { + "id": 26, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The volume that must pass in LowFlowMaxPeriod for it to be registered as real flow. Units of ml", + "version": { + "first": 55, + "last": 267 + }, + "values": { + "default": 200, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The volume that must pass in LowFlowMaxPeriod for it to be registered as real flow. Units of ml", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 200, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "LowFlowMaxPeriod": { + "id": 27, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The time during which LowFlowThreshold volume must pass for it to be registered as real flow. Units of seconds << 16", + "version": { + "first": 55, + "last": 267 + }, + "values": { + "default": 3932160, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The time during which LowFlowThreshold volume must pass for it to be registered as real flow. Units of seconds << 16", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 3932160, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "UpdateThreshold": { + "id": 28, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The amount of flow in ml to accumulate before updating the main scaled accumulators.", + "version": { + "first": 55, + "last": 267 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The amount of flow in ml to accumulate before updating the main scaled accumulators.", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "ArrowThreshold": { + "id": 29, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The net volume in ml that must flow in one direction for the forward arrow to be set", + "version": { + "first": 55, + "last": 267 + }, + "values": { + "default": 5000000, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The net volume in ml that must flow in one direction for the forward arrow to be set", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 5000000, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "FireBuffer1": { + "id": 30, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 1 to be used", + "version": { + "first": 64, + "last": 267 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 1 to be used", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "FireBuffer2": { + "id": 31, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 2 to be used", + "version": { + "first": 64, + "last": 267 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 2 to be used", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "FireBuffer3": { + "id": 32, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 3 to be used", + "version": { + "first": 64, + "last": 267 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 3 to be used", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "TriggerActive": { + "id": 33, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "WO", + "lvl2": "WO", + "lvl3": "WO", + "lvl4": "WO", + "lvl5": "WO", + "lvl6": "WO", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write 1 to put GenesisFlow in Active mode. This is the normal measurement mode", + "version": { + "first": 75, + "last": 267 + } + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "WO", + "lvl4": "NA", + "lvl5": "WO", + "lvl6": "WO", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write 1 to put GenesisFlow in Active mode. This is the normal measurement mode", + "version": { + "first": 268, + "last": 271 + } + } + ] + }, + "TriggerIdle": { + "id": 34, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 0 to put GenesisFlow in Active mode, otherwise put GenesisFlow in Idle mode. Idle mode displays just the number written to TriggerIdle. No measurements are performed. Read returns the number written", + "version": { + "first": 75, + "last": 271 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 65535 + } + } + ] + }, + "MaxValidDeltaToF": { + "id": 35, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum delta time of flight, above this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 87, + "last": 267 + }, + "values": { + "default": 247490, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum delta time of flight, above this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 309237, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "MaxValidToF": { + "id": 36, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum absolute time of flight, above this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 87, + "last": 267 + }, + "values": { + "default": 24749011, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum absolute time of flight, above this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 24749011, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "MinValidToF": { + "id": 37, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The minimum absolute time of flight, below this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 87, + "last": 267 + }, + "values": { + "default": 13743895, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The minimum absolute time of flight, below this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 13743895, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "FirstHitPercent1": { + "id": 38, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 1", + "version": { + "first": 93, + "last": 267 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 1", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "FirstHitPercent2": { + "id": 39, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 2", + "version": { + "first": 93, + "last": 267 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 2", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "FirstHitPercent3": { + "id": 40, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 3", + "version": { + "first": 93, + "last": 267 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 3", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "FirstHitShift": { + "id": 41, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A value describing how long the amplitude is averaged over for calculating the first hit level. This is the amount each amplitude value is shifted down before being added to the moving average", + "version": { + "first": 93, + "last": 267 + }, + "values": { + "default": 4, + "minimum": 3, + "maximum": 8 + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A value describing how long the amplitude is averaged over for calculating the first hit level. This is the amount each amplitude value is shifted down before being added to the moving average", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 4, + "minimum": 3, + "maximum": 8 + } + } + ] + }, + "FirstHitMinimum": { + "id": 42, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Minimum absolute first hit level value", + "version": { + "first": 93, + "last": 267 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Minimum absolute first hit level value", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "ToFErrorLimit": { + "id": 43, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of ToF errors to allow before resetting the first hit levels to FirstHitMinimum", + "version": { + "first": 93, + "last": 267 + }, + "values": { + "default": 16, + "minimum": 1, + "maximum": 4294967295 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of ToF errors to allow before resetting the first hit levels to FirstHitMinimum", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 16, + "minimum": 1, + "maximum": 4294967295 + } + } + ] + }, + "FirstHitUpdatePeriod": { + "id": 44, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The period (in seconds) between first hit level updates", + "version": { + "first": 99, + "last": 267 + }, + "values": { + "default": 10, + "minimum": 0, + "maximum": 255 + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The period (in seconds) between first hit level updates", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 10, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "PipeFillingDelay": { + "id": 45, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The time (in seconds) to maintain zero flow after leaving empty pipe", + "version": { + "first": 119, + "last": 267 + }, + "values": { + "default": 30, + "minimum": 0, + "maximum": 255 + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The time (in seconds) to maintain zero flow after leaving empty pipe", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 30, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "ToFTempOffset1": { + "id": 46, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 1. In units of 2^-38 seconds", + "version": { + "first": 124, + "last": 267 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + } + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 1. In units of 2^-38 seconds", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + } + } + ] + }, + "ToFTempOffset2": { + "id": 47, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 2. In units of 2^-38 seconds", + "version": { + "first": 124, + "last": 267 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + } + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 2. In units of 2^-38 seconds", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + } + } + ] + }, + "ToFTempOffset3": { + "id": 48, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 3. In units of 2^-38 seconds", + "version": { + "first": 124, + "last": 267 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + } + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 3. In units of 2^-38 seconds", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + } + } + ] + }, + "ToFTempCalibrate": { + "id": 49, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "WO", + "lvl2": "WO", + "lvl3": "WO", + "lvl4": "WO", + "lvl5": "WO", + "lvl6": "WO", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write the current temperature to this register to trigger a calibration step. In units of 2^-12 degrees celcius", + "version": { + "first": 124, + "last": 205 + }, + "values": { + "minimum": 0, + "maximum": 270336 + } + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write the current temperature to this register to trigger a calibration step. In units of 2^-12 degrees celcius", + "version": { + "first": 205, + "last": 271 + }, + "values": { + "minimum": 0, + "maximum": 286720 + } + } + ] + }, + "StoreConfiguration": { + "id": 50, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store configuration values to non-volatile storage. Read back for status", + "version": { + "first": 141, + "last": 267 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store configuration values to non-volatile storage. Read back for status", + "version": { + "first": 268, + "last": 271 + } + } + ] + }, + "SealDisplay": { + "id": 51, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to stop various display related registers being changed. Read back 1 for 'sealed' 0 for 'unsealed'", + "version": { + "first": 161, + "last": 267 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + } + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to stop various display related registers being changed. Read back 1 for 'sealed' 0 for 'unsealed'", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + } + } + ] + }, + "TriggerTest": { + "id": 52, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to put GenesisFlow in Test mode. This differs from normal measurement mode in that the volume is presented to 3 extra decimal places if possible. Read back 1 for Test mode, 0 otherwise", + "version": { + "first": 162, + "last": 267 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + } + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to put GenesisFlow in Test mode. This differs from normal measurement mode in that the volume is presented to 3 extra decimal places if possible. Read back 1 for Test mode, 0 otherwise", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + } + } + ] + }, + "MaxValidAmplitude": { + "id": 53, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Maximum amplitude for a valid signal in 2^-22mV units", + "version": { + "first": 168, + "last": 267 + }, + "values": { + "default": 2936012800, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Maximum amplitude for a valid signal in 2^-22mV units", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 2936012800, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "MinValidAmplitude": { + "id": 54, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Minimum amplitude for a valid signal in 2^-22mV units", + "version": { + "first": 168, + "last": 267 + }, + "values": { + "default": 209715200, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Minimum amplitude for a valid signal in 2^-22mV units", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 209715200, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "HardErrorLimit": { + "id": 55, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Number of hard errors to allow before declaring a fatal error", + "version": { + "first": 176, + "last": 267 + }, + "values": { + "default": 4, + "minimum": 0, + "maximum": 65535 + } + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Number of hard errors to allow before declaring a fatal error", + "version": { + "first": 268, + "last": 271 + }, + "values": { + "default": 4, + "minimum": 0, + "maximum": 65535 + } + } + ] + }, + "Timeout": { + "id": 56, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The timeout for an ultrasonic measurement (0 - 128us, 1 - 256us, 2 - 1024us, 3 - 4096us)", + "version": { + "first": 269, + "last": 269 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + } + } + ] + } + }, + "status": { + "BAD_TEST": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 0 + }, + "BAD_CONFIG": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 1 + }, + "DID_NOT_STORE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 2 + }, + "STORE_PENDING": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 3 + }, + "STORE_BUFFER_SIZE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 4 + }, + "STRING_TOO_LONG": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 5 + }, + "BAD_DISPLAY_MODE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 6 + }, + "GLASS_TOO_LONG": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 7 + }, + "SLOT_NOT_YOURS": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 8 + }, + "SUBLIST_TOO_LONG": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 9 + }, + "NO_TEMP_SENSOR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 10 + }, + "UNDER_TEMP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 11 + }, + "LOW_TEMP_WARNING": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 12 + }, + "HIGH_TEMP_WARNING": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 13 + }, + "OVER_TEMP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 14 + }, + "MISMATCHING_LSB": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 15 + }, + "OUT_OF_RANGE_PWDIFF": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 16 + }, + "OUT_OF_RANGE_AMPLITUDE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 17 + }, + "OUT_OF_RANGE_TOF": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 18 + }, + "OUT_OF_RANGE_DTOF": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 19 + }, + "TOF_TIMEOUT": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 20 + }, + "CAL_CHANGE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 21 + }, + "OUT_OF_RANGE_INTERVAL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 22 + }, + "VALIDATE_FAIL": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 23 + }, + "OUT_OF_RANGE_TEMP": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 24 + }, + "NOT_READY": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 25 + }, + "METROLOGY_ERROR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 26 + }, + "GP30_ID_ERROR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 27 + }, + "GP30_FLAG_ERROR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 28 + }, + "GP30_TIMEOUT_ERROR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 29 + }, + "GP30_REQUEST_ERROR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 30 + }, + "GP30_SEQ_ERROR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 31 + }, + "VALUE_SEALED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 32 + }, + "IN_TEST_MODE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 33 + }, + "UNKNOWN_STATE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 34 + }, + "DISPLAY_INIT_SUCCEEDED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 35 + }, + "DISPLAY_INIT_FAILED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 36 + }, + "GP30_INIT_FAILED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 37 + }, + "START_TIMER_SUCCEEDED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 38 + }, + "START_TIMER_FAILED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 39 + }, + "VOLUME_STORE_FAILED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 40 + }, + "EMPTY_PIPE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 41 + }, + "PARAMETER_ERROR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 42 + }, + "GP30_INTERNAL_ERROR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 43 + }, + "GLASS_TOO_SHORT": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 44 + }, + "STORE_CAL_FAILED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 45 + }, + "STORE_CONF_FAILED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 46 + }, + "MODE_CHANGE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 47 + }, + "BAD_POW10": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 48 + }, + "BAD_DECIMAL_SEPARATOR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 49 + }, + "BAD_UNITS": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 50 + }, + "BAD_ICONS": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 51 + }, + "BAD_THOUSAND_SEPARATOR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 52 + }, + "NEW_LOCALE_REJECTED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 53 + }, + "SET_ACCUMULATORS": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 54 + }, + "SEAL_OPENED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 55 + }, + "CALIBRATION_RECALL_INCOMPLETE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 56 + } + } + }, + "IRDA": { + "id": 20, + "version": { + "first": 10, + "last": 121 + }, + "registers": { + "PulseReportRate": { + "id": 0, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The rate at which pulse reports are sent to the IrDA pulse adapter", + "version": { + "first": 10, + "last": 97 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 255 + } + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The rate at which pulse reports are sent to the IrDA pulse adapter", + "version": { + "first": 98, + "last": 121 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "AdapterPresenceLimit": { + "id": 1, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of 15 minute periods we have to have received no valid IrDA messages to assume there is no adapter present", + "version": { + "first": 18, + "last": 28 + }, + "values": { + "default": 1, + "minimum": 1, + "maximum": 255 + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of 15 minute periods we have to have received no valid IrDA messages to assume there is no adapter present", + "version": { + "first": 29, + "last": 97 + }, + "values": { + "default": 3, + "minimum": 1, + "maximum": 255 + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of 15 minute periods we have to have received no valid IrDA messages to assume there is no adapter present", + "version": { + "first": 98, + "last": 121 + }, + "values": { + "default": 3, + "minimum": 1, + "maximum": 255 + } + } + ] + }, + "PulseSequence": { + "id": 2, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The present sequence number used in pulse reports", + "version": { + "first": 26, + "last": 97 + }, + "values": { + "minimum": 0, + "maximum": 255 + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The present sequence number used in pulse reports", + "version": { + "first": 98, + "last": 114 + }, + "values": { + "minimum": 0, + "maximum": 255 + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The present sequence number used in pulse reports", + "version": { + "first": 115, + "last": 121 + }, + "values": { + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "StoreConfiguration": { + "id": 3, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store configuration values to non-volatile storage. Read back for status", + "version": { + "first": 26, + "last": 97 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store configuration values to non-volatile storage. Read back for status", + "version": { + "first": 98, + "last": 121 + } + } + ] + }, + "AMRDigits": { + "id": 4, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of digits to use for AMR", + "version": { + "first": 40, + "last": 52 + }, + "values": { + "default": 9, + "minimum": 0, + "maximum": 9 + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of digits to use for AMR", + "version": { + "first": 53, + "last": 97 + }, + "values": { + "default": 9, + "minimum": 0, + "maximum": 9 + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of digits to use for AMR", + "version": { + "first": 98, + "last": 121 + }, + "values": { + "default": 8, + "minimum": 0, + "maximum": 9 + } + } + ] + }, + "AMROffset": { + "id": 5, + "details": [ + { + "type": "int8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The offset of the AMR smallest digit from the right (always negative)", + "version": { + "first": 40, + "last": 97 + }, + "values": { + "default": 0, + "minimum": -9, + "maximum": 0 + } + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The offset of the AMR smallest digit from the right (always negative)", + "version": { + "first": 98, + "last": 121 + }, + "values": { + "default": 0, + "minimum": -9, + "maximum": 0 + } + } + ] + }, + "UI1203Fields": { + "id": 6, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A bitfield of the optional fields being used for UI-1203", + "version": { + "first": 40, + "last": 97 + }, + "values": { + "default": 268, + "minimum": 0, + "maximum": 268 + } + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A bitfield of the optional fields being used for UI-1203", + "version": { + "first": 98, + "last": 121 + }, + "values": { + "default": 268, + "minimum": 0, + "maximum": 268 + } + } + ] + }, + "MfgDate": { + "id": 7, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A timestamp of meter manufacture in seconds since 1/1/2000 00:00:00 UTC", + "version": { + "first": 43, + "last": 121 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "DisplayAMRDigits": { + "id": 8, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Whether or not to display AMR digits on the screen", + "version": { + "first": 92, + "last": 97 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + } + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Whether or not to display AMR digits on the screen", + "version": { + "first": 98, + "last": 121 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + } + } + ] + } + }, + "status": { + "BAD_CONFIG": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 0 + }, + "BAD_LENGTH": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 1 + }, + "OUT_OF_RANGE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 2 + }, + "PENDING_STORE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 3 + }, + "DID_NOT_STORE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 4 + } + } + }, + "NA2WALARMS": { + "id": 23, + "version": { + "first": 41, + "last": 48 + }, + "registers": { + "StoreConfiguration": { + "id": 0, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store configuration values to non-volatile storage. Read back for status", + "version": { + "first": 41, + "last": 48 + } + } + ] + }, + "PredefEnable": { + "id": 1, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bitmask of enabled predefined alarms", + "version": { + "first": 41, + "last": 48 + }, + "values": { + "default": 561047, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + } + }, + "status": { + "SENSOR_INVALID": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 0 + }, + "UNKNOWN_PARAMETER": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 1 + }, + "ALARM_INVALID": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 2 + }, + "UNIMPLEMENTED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 3 + }, + "UNCONFIGURED": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 4 + }, + "CONFIG_INVALID": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 5 + }, + "NO_LATEST": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 6 + }, + "FIXED_TYPE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 7 + }, + "PREDEF_SET": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 8 + }, + "USERDEF_VOLUME_SET": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 9 + }, + "USERDEF_TEMPERATURE_SET": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 10 + }, + "USERDEF_PRESSURE_SET": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 11 + }, + "PREDEF_CLEAR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 12 + }, + "USERDEF_VOLUME_CLEAR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 13 + }, + "USERDEF_TEMPERATURE_CLEAR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 14 + }, + "USERDEF_PRESSURE_CLEAR": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 15 + }, + "DID_NOT_STORE": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 16 + }, + "STORE_PENDING": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 17 + } + } + }, + "NA2WLOGGER": { + "id": 22, + "version": { + "first": 1, + "last": 146 + } + }, + "FLEXNETVERSION": { + "id": 24, + "version": { + "first": 1, + "last": 9999 + } + }, + "FLEXNETSERIAL": { + "id": 26, + "version": { + "first": 1, + "last": 7 + }, + "registers": { + "UpgState": { + "id": 0, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem Ipsum", + "version": { + "first": 2, + "last": 7 + } + } + ] + }, + "FwdlState": { + "id": 1, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem Ipsum", + "version": { + "first": 2, + "last": 7 + } + } + ] + } + }, + "status": { + "UNKNOWN_PARAMETER": { + "action": "Lorem Ipsum", + "description": "Lorem Ipsum", + "id": 0 + } + } + } +} diff --git a/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/meterconfig.json b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/meterconfig.json new file mode 100644 index 00000000..a2f33e6a --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/Xylem.Common.Ui.Legacy.GenCtl.1.1.4.0/meterconfig.json @@ -0,0 +1,9 @@ +{ + "UseRegisterWatchService": true, + "RegisterWatchServiceUrl": "http://sla12iis01/MeterProcessState/api/RegisterWatch/", + "UseMinMaxCheck": true, + "UseErrorLogger": false, + "ErrorLoggerServiceUrl": "http://sla12iis01/MeterProcessState/api/GenesisMeter/", + "UseCalibrationLogger": false, + "CalibrationLoggerServiceUrl": "http://sla12iis01/MeterProcessState/api/GenesisMeter/" +} \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/log4net.2.0.2/lib/net40-full/log4net.dll b/TBF_V2/Sources/TBF/packages/log4net.2.0.2/lib/net40-full/log4net.dll new file mode 100644 index 00000000..ad3e8956 Binary files /dev/null and b/TBF_V2/Sources/TBF/packages/log4net.2.0.2/lib/net40-full/log4net.dll differ diff --git a/TBF_V2/Sources/TBF/packages/log4net.2.0.2/lib/net40-full/log4net.xml b/TBF_V2/Sources/TBF/packages/log4net.2.0.2/lib/net40-full/log4net.xml new file mode 100644 index 00000000..e71d34d4 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/log4net.2.0.2/lib/net40-full/log4net.xml @@ -0,0 +1,31809 @@ + + + + log4net + + + + + Appender that logs to a database. + + + + appends logging events to a table within a + database. The appender can be configured to specify the connection + string by setting the property. + The connection type (provider) can be specified by setting the + property. For more information on database connection strings for + your specific database see http://www.connectionstrings.com/. + + + Records are written into the database either using a prepared + statement or a stored procedure. The property + is set to (System.Data.CommandType.Text) to specify a prepared statement + or to (System.Data.CommandType.StoredProcedure) to specify a stored + procedure. + + + The prepared statement text or the name of the stored procedure + must be set in the property. + + + The prepared statement or stored procedure can take a number + of parameters. Parameters are added using the + method. This adds a single to the + ordered list of parameters. The + type may be subclassed if required to provide database specific + functionality. The specifies + the parameter name, database type, size, and how the value should + be generated using a . + + + + An example of a SQL Server table that could be logged to: + + CREATE TABLE [dbo].[Log] ( + [ID] [int] IDENTITY (1, 1) NOT NULL , + [Date] [datetime] NOT NULL , + [Thread] [varchar] (255) NOT NULL , + [Level] [varchar] (20) NOT NULL , + [Logger] [varchar] (255) NOT NULL , + [Message] [varchar] (4000) NOT NULL + ) ON [PRIMARY] + + + + An example configuration to log to the above table: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Julian Biddle + Nicko Cadell + Gert Driesen + Lance Nehring + + + + Abstract base class implementation of that + buffers events in a fixed size buffer. + + + + This base class should be used by appenders that need to buffer a + number of events before logging them. For example the + buffers events and then submits the entire contents of the buffer to + the underlying database in one go. + + + Subclasses should override the + method to deliver the buffered events. + + The BufferingAppenderSkeleton maintains a fixed size cyclic + buffer of events. The size of the buffer is set using + the property. + + A is used to inspect + each event as it arrives in the appender. If the + triggers, then the current buffer is sent immediately + (see ). Otherwise the event + is stored in the buffer. For example, an evaluator can be used to + deliver the events immediately when an ERROR event arrives. + + + The buffering appender can be configured in a mode. + By default the appender is NOT lossy. When the buffer is full all + the buffered events are sent with . + If the property is set to true then the + buffer will not be sent when it is full, and new events arriving + in the appender will overwrite the oldest event in the buffer. + In lossy mode the buffer will only be sent when the + triggers. This can be useful behavior when you need to know about + ERROR events but not about events with a lower level, configure an + evaluator that will trigger when an ERROR event arrives, the whole + buffer will be sent which gives a history of events leading up to + the ERROR event. + + + Nicko Cadell + Gert Driesen + + + + Abstract base class implementation of . + + + + This class provides the code for common functionality, such + as support for threshold filtering and support for general filters. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Implement this interface for your own strategies for printing log statements. + + + + Implementors should consider extending the + class which provides a default implementation of this interface. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Log the logging event in Appender specific way. + + The event to log + + + This method is called to log a message into this appender. + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + The name uniquely identifies the appender. + + + + + Interface for appenders that support bulk logging. + + + + This interface extends the interface to + support bulk logging of objects. Appenders + should only implement this interface if they can bulk log efficiently. + + + Nicko Cadell + + + + Log the array of logging events in Appender specific way. + + The events to log + + + This method is called to log an array of events into this appender. + + + + + + Interface used to delay activate a configured object. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then the method + must be called by the container after its all the configured properties have been set + and before the component can be used. + + + Nicko Cadell + + + + Activate the options that were previously set with calls to properties. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then this method must be called + after its properties have been set before the component can be used. + + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + Default constructor + + + Empty default constructor + + + + + Finalizes this appender by calling the implementation's + method. + + + + If this appender has not been closed then the Finalize method + will call . + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Closes the appender and release resources. + + + + Release any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + This method cannot be overridden by subclasses. This method + delegates the closing of the appender to the + method which must be overridden in the subclass. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The event to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the abstract method. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The array of events to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the method. + + + + + + Test if the logging event should we output by this appender + + the event to test + true if the event should be output, false if the event should be ignored + + + This method checks the logging event against the threshold level set + on this appender and also against the filters specified on this + appender. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + + + + + Adds a filter to the end of the filter chain. + + the filter to add to this appender + + + The Filters are organized in a linked list. + + + Setting this property causes the new filter to be pushed onto the + back of the filter chain. + + + + + + Clears the filter list for this appender. + + + + Clears the filter list for this appender. + + + + + + Checks if the message level is below this appender's threshold. + + to test against. + + + If there is no threshold set, then the return value is always true. + + + + true if the meets the + requirements of this appender. + + + + + Is called when the appender is closed. Derived classes should override + this method if resources need to be released. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Subclasses of should implement this method + to perform actual logging. + + The event to append. + + + A subclass must implement this method to perform + logging of the . + + This method will be called by + if all the conditions listed for that method are met. + + + To restrict the logging of events in the appender + override the method. + + + + + + Append a bulk array of logging events. + + the array of logging events + + + This base class implementation calls the + method for each element in the bulk array. + + + A sub class that can better process a bulk array of events should + override this method in addition to . + + + + + + Called before as a precondition. + + + + This method is called by + before the call to the abstract method. + + + This method can be overridden in a subclass to extend the checks + made before the event is passed to the method. + + + A subclass should ensure that they delegate this call to + this base class if it is overridden. + + + true if the call to should proceed. + + + + Renders the to a string. + + The event to render. + The event rendered as a string. + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Where possible use the alternative version of this method + . + That method streams the rendering onto an existing Writer + which can give better performance if the caller already has + a open and ready for writing. + + + + + + Renders the to a string. + + The event to render. + The TextWriter to write the formatted event to + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Use this method in preference to + where possible. If, however, the caller needs to render the event + to a string then does + provide an efficient mechanism for doing so. + + + + + + The layout of this appender. + + + See for more information. + + + + + The name of this appender. + + + See for more information. + + + + + The level threshold of this appender. + + + + There is no level threshold filtering by default. + + + See for more information. + + + + + + It is assumed and enforced that errorHandler is never null. + + + + It is assumed and enforced that errorHandler is never null. + + + See for more information. + + + + + + The first filter in the filter chain. + + + + Set to null initially. + + + See for more information. + + + + + + The last filter in the filter chain. + + + See for more information. + + + + + Flag indicating if this appender is closed. + + + See for more information. + + + + + The guard prevents an appender from repeatedly calling its own DoAppend method + + + + + StringWriter used to render events + + + + + The fully qualified type of the AppenderSkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the threshold of this appender. + + + The threshold of the appender. + + + + All log events with lower level than the threshold level are ignored + by the appender. + + + In configuration files this option is specified by setting the + value of the option to a level + string, such as "DEBUG", "INFO" and so on. + + + + + + Gets or sets the for this appender. + + The of the appender + + + The provides a default + implementation for the property. + + + + + + The filter chain. + + The head of the filter chain filter chain. + + + Returns the head Filter. The Filters are organized in a linked list + and so all Filters on this Appender are available through the result. + + + + + + Gets or sets the for this appender. + + The layout of the appender. + + + See for more information. + + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + + The name uniquely identifies the appender. + + + + + + Tests if this appender requires a to be set. + + + + In the rather exceptional case, where the appender + implementation admits a layout but can also work without it, + then the appender should return true. + + + This default implementation always returns false. + + + + true if the appender requires a layout object, otherwise false. + + + + + The default buffer size. + + + The default size of the cyclic buffer used to store events. + This is set to 512 by default. + + + + + Initializes a new instance of the class. + + + + Protected default constructor to allow subclassing. + + + + + + Initializes a new instance of the class. + + the events passed through this appender must be + fixed by the time that they arrive in the derived class' SendBuffer method. + + + Protected constructor to allow subclassing. + + + The should be set if the subclass + expects the events delivered to be fixed even if the + is set to zero, i.e. when no buffering occurs. + + + + + + Flush the currently buffered events + + + + Flushes any events that have been buffered. + + + If the appender is buffering in mode then the contents + of the buffer will NOT be flushed to the appender. + + + + + + Flush the currently buffered events + + set to true to flush the buffer of lossy events + + + Flushes events that have been buffered. If is + false then events will only be flushed if this buffer is non-lossy mode. + + + If the appender is buffering in mode then the contents + of the buffer will only be flushed if is true. + In this case the contents of the buffer will be tested against the + and if triggering will be output. All other buffered + events will be discarded. + + + If is true then the buffer will always + be emptied by calling this method. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Close this appender instance. + + + + Close this appender instance. If this appender is marked + as not then the remaining events in + the buffer must be sent when the appender is closed. + + + + + + This method is called by the method. + + the event to log + + + Stores the in the cyclic buffer. + + + The buffer will be sent (i.e. passed to the + method) if one of the following conditions is met: + + + + The cyclic buffer is full and this appender is + marked as not lossy (see ) + + + An is set and + it is triggered for the + specified. + + + + Before the event is stored in the buffer it is fixed + (see ) to ensure that + any data referenced by the event will be valid when the buffer + is processed. + + + + + + Sends the contents of the buffer. + + The first logging event. + The buffer containing the events that need to be send. + + + The subclass must override . + + + + + + Sends the events. + + The events that need to be send. + + + The subclass must override this method to process the buffered events. + + + + + + The size of the cyclic buffer used to hold the logging events. + + + Set to by default. + + + + + The cyclic buffer used to store the logging events. + + + + + The triggering event evaluator that causes the buffer to be sent immediately. + + + The object that is used to determine if an event causes the entire + buffer to be sent immediately. This field can be null, which + indicates that event triggering is not to be done. The evaluator + can be set using the property. If this appender + has the ( property) set to + true then an must be set. + + + + + Indicates if the appender should overwrite events in the cyclic buffer + when it becomes full, or if the buffer should be flushed when the + buffer is full. + + + If this field is set to true then an must + be set. + + + + + The triggering event evaluator filters discarded events. + + + The object that is used to determine if an event that is discarded should + really be discarded or if it should be sent to the appenders. + This field can be null, which indicates that all discarded events will + be discarded. + + + + + Value indicating which fields in the event should be fixed + + + By default all fields are fixed + + + + + The events delivered to the subclass must be fixed. + + + + + Gets or sets a value that indicates whether the appender is lossy. + + + true if the appender is lossy, otherwise false. The default is false. + + + + This appender uses a buffer to store logging events before + delivering them. A triggering event causes the whole buffer + to be send to the remote sink. If the buffer overruns before + a triggering event then logging events could be lost. Set + to false to prevent logging events + from being lost. + + If is set to true then an + must be specified. + + + + + Gets or sets the size of the cyclic buffer used to hold the + logging events. + + + The size of the cyclic buffer used to hold the logging events. + + + + The option takes a positive integer + representing the maximum number of logging events to collect in + a cyclic buffer. When the is reached, + oldest events are deleted as new events are added to the + buffer. By default the size of the cyclic buffer is 512 events. + + + If the is set to a value less than + or equal to 1 then no buffering will occur. The logging event + will be delivered synchronously (depending on the + and properties). Otherwise the event will + be buffered. + + + + + + Gets or sets the that causes the + buffer to be sent immediately. + + + The that causes the buffer to be + sent immediately. + + + + The evaluator will be called for each event that is appended to this + appender. If the evaluator triggers then the current buffer will + immediately be sent (see ). + + If is set to true then an + must be specified. + + + + + Gets or sets the value of the to use. + + + The value of the to use. + + + + The evaluator will be called for each event that is discarded from this + appender. If the evaluator triggers then the current buffer will immediately + be sent (see ). + + + + + + Gets or sets a value indicating if only part of the logging event data + should be fixed. + + + true if the appender should only fix part of the logging event + data, otherwise false. The default is false. + + + + Setting this property to true will cause only part of the + event data to be fixed and serialized. This will improve performance. + + + See for more information. + + + + + + Gets or sets a the fields that will be fixed in the event + + + The event fields that will be fixed before the event is buffered + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + + Initializes a new instance of the class. + + + Public default constructor to initialize a new instance of this class. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Override the parent method to close the database + + + + Closes the database command and database connection. + + + + + + Inserts the events into the database. + + The events to insert into the database. + + + Insert all the events specified in the + array into the database. + + + + + + Adds a parameter to the command. + + The parameter to add to the command. + + + Adds a parameter to the ordered list of command parameters. + + + + + + Writes the events to the database using the transaction specified. + + The transaction that the events will be executed under. + The array of events to insert into the database. + + + The transaction argument can be null if the appender has been + configured not to use transactions. See + property for more information. + + + + + + Formats the log message into database statement text. + + The event being logged. + + This method can be overridden by subclasses to provide + more control over the format of the database statement. + + + Text that can be passed to a . + + + + + Creates an instance used to connect to the database. + + + This method is called whenever a new IDbConnection is needed (i.e. when a reconnect is necessary). + + The of the object. + The connectionString output from the ResolveConnectionString method. + An instance with a valid connection string. + + + + Resolves the connection string from the ConnectionString, ConnectionStringName, or AppSettingsKey + property. + + + ConnectiongStringName is only supported on .NET 2.0 and higher. + + Additional information describing the connection string. + A connection string used to connect to the database. + + + + Retrieves the class type of the ADO.NET provider. + + + + Gets the Type of the ADO.NET provider to use to connect to the + database. This method resolves the type specified in the + property. + + + Subclasses can override this method to return a different type + if necessary. + + + The of the ADO.NET provider + + + + Prepares the database command and initialize the parameters. + + + + + Connects to the database. + + + + + Cleanup the existing command. + + + If true, a message will be written using LogLog.Warn if an exception is encountered when calling Dispose. + + + + + Cleanup the existing connection. + + + Calls the IDbConnection's method. + + + + + Flag to indicate if we are using a command object + + + + Set to true when the appender is to use a prepared + statement or stored procedure to insert into the database. + + + + + + The list of objects. + + + + The list of objects. + + + + + + The security context to use for privileged calls + + + + + The that will be used + to insert logging events into a database. + + + + + The database command. + + + + + Database connection string. + + + + + The appSettings key from App.Config that contains the connection string. + + + + + The connectionStrings key from App.Config that contains the connection string. + + + + + String type name of the type name. + + + + + The text of the command. + + + + + The command type. + + + + + Indicates whether to use transactions when writing to the database. + + + + + Indicates whether to use transactions when writing to the database. + + + + + The fully qualified type of the AdoNetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the database connection string that is used to connect to + the database. + + + The database connection string used to connect to the database. + + + + The connections string is specific to the connection type. + See for more information. + + + Connection string for MS Access via ODBC: + "DSN=MS Access Database;UID=admin;PWD=;SystemDB=C:\data\System.mdw;SafeTransactions = 0;FIL=MS Access;DriverID = 25;DBQ=C:\data\train33.mdb" + + Another connection string for MS Access via ODBC: + "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\Work\cvs_root\log4net-1.2\access.mdb;UID=;PWD=;" + + Connection string for MS Access via OLE DB: + "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Work\cvs_root\log4net-1.2\access.mdb;User Id=;Password=;" + + + + + The appSettings key from App.Config that contains the connection string. + + + + + The connectionStrings key from App.Config that contains the connection string. + + + This property requires at least .NET 2.0. + + + + + Gets or sets the type name of the connection + that should be created. + + + The type name of the connection. + + + + The type name of the ADO.NET provider to use. + + + The default is to use the OLE DB provider. + + + Use the OLE DB Provider. This is the default value. + System.Data.OleDb.OleDbConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the MS SQL Server Provider. + System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the ODBC Provider. + Microsoft.Data.Odbc.OdbcConnection,Microsoft.Data.Odbc,version=1.0.3300.0,publicKeyToken=b77a5c561934e089,culture=neutral + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for ODBC .NET Data Provider. + + Use the Oracle Provider. + System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for .NET Managed Provider for Oracle. + + + + + Gets or sets the command text that is used to insert logging events + into the database. + + + The command text used to insert logging events into the database. + + + + Either the text of the prepared statement or the + name of the stored procedure to execute to write into + the database. + + + The property determines if + this text is a prepared statement or a stored procedure. + + + + + + Gets or sets the command type to execute. + + + The command type to execute. + + + + This value may be either (System.Data.CommandType.Text) to specify + that the is a prepared statement to execute, + or (System.Data.CommandType.StoredProcedure) to specify that the + property is the name of a stored procedure + to execute. + + + The default value is (System.Data.CommandType.Text). + + + + + + Should transactions be used to insert logging events in the database. + + + true if transactions should be used to insert logging events in + the database, otherwise false. The default value is true. + + + + Gets or sets a value that indicates whether transactions should be used + to insert logging events in the database. + + + When set a single transaction will be used to insert the buffered events + into the database. Otherwise each event will be inserted without using + an explicit transaction. + + + + + + Gets or sets the used to call the NetSend method. + + + The used to call the NetSend method. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Should this appender try to reconnect to the database on error. + + + true if the appender should try to reconnect to the database after an + error has occurred, otherwise false. The default value is false, + i.e. not to try to reconnect. + + + + The default behaviour is for the appender not to try to reconnect to the + database if an error occurs. Subsequent logging events are discarded. + + + To force the appender to attempt to reconnect to the database set this + property to true. + + + When the appender attempts to connect to the database there may be a + delay of up to the connection timeout specified in the connection string. + This delay will block the calling application's thread. + Until the connection can be reestablished this potential delay may occur multiple times. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to insert + logging events into a database. Classes deriving from + can use this property to get or set this . Use the + underlying returned from if + you require access beyond that which provides. + + + + + Parameter type used by the . + + + + This class provides the basic database parameter properties + as defined by the interface. + + This type can be subclassed to provide database specific + functionality. The two methods that are called externally are + and . + + + + + + Initializes a new instance of the class. + + + Default constructor for the AdoNetAppenderParameter class. + + + + + Prepare the specified database command object. + + The command to prepare. + + + Prepares the database command object by adding + this parameter to its collection of parameters. + + + + + + Renders the logging event and set the parameter value in the command. + + The command containing the parameter. + The event to be rendered. + + + Renders the logging event using this parameters layout + object. Sets the value of the parameter on the command object. + + + + + + The name of this parameter. + + + + + The database type for this parameter. + + + + + Flag to infer type rather than use the DbType + + + + + The precision for this parameter. + + + + + The scale for this parameter. + + + + + The size for this parameter. + + + + + The to use to render the + logging event into an object for this parameter. + + + + + Gets or sets the name of this parameter. + + + The name of this parameter. + + + + The name of this parameter. The parameter name + must match up to a named parameter to the SQL stored procedure + or prepared statement. + + + + + + Gets or sets the database type for this parameter. + + + The database type for this parameter. + + + + The database type for this parameter. This property should + be set to the database type from the + enumeration. See . + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the type from the value. + + + + + + + Gets or sets the precision for this parameter. + + + The precision for this parameter. + + + + The maximum number of digits used to represent the Value. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the precision from the value. + + + + + + + Gets or sets the scale for this parameter. + + + The scale for this parameter. + + + + The number of decimal places to which Value is resolved. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the scale from the value. + + + + + + + Gets or sets the size for this parameter. + + + The size for this parameter. + + + + The maximum size, in bytes, of the data within the column. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the size from the value. + + + For BLOB data types like VARCHAR(max) it may be impossible to infer the value automatically, use -1 as the size in this case. + + + + + + + Gets or sets the to use to + render the logging event into an object for this + parameter. + + + The used to render the + logging event into an object for this parameter. + + + + The that renders the value for this + parameter. + + + The can be used to adapt + any into a + for use in the property. + + + + + + Appends logging events to the terminal using ANSI color escape sequences. + + + + AnsiColorTerminalAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific level of message to be set. + + + This appender expects the terminal to understand the VT100 control set + in order to interpret the color codes. If the terminal or console does not + understand the control codes the behavior is not defined. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + When configuring the ANSI colored terminal appender, a mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + + These color values cannot be combined together to make new colors. + + + The attributes can be any combination of the following: + + Brightforeground is brighter + Dimforeground is dimmer + Underscoremessage is underlined + Blinkforeground is blinking (does not work on all terminals) + Reverseforeground and background are reversed + Hiddenoutput is hidden + Strikethroughmessage has a line through it + + While any of these attributes may be combined together not all combinations + work well together, for example setting both Bright and Dim attributes makes + no sense. + + + Patrick Wagstrom + Nicko Cadell + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Ansi code to reset terminal + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Add a mapping of level to color + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colours + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + Target is the value of the console output stream. + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + The enum of possible display attributes + + + + The following flags can be combined together to + form the ANSI color attributes. + + + + + + + text is bright + + + + + text is dim + + + + + text is underlined + + + + + text is blinking + + + Not all terminals support this attribute + + + + + text and background colors are reversed + + + + + text is hidden + + + + + text is displayed with a strikethrough + + + + + text color is light + + + + + The enum of possible foreground or background color values for + use with the color mapping method + + + + The output can be in one for the following ANSI colors. + + + + + + + color is black + + + + + color is red + + + + + color is green + + + + + color is yellow + + + + + color is blue + + + + + color is magenta + + + + + color is cyan + + + + + color is white + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + An entry in the + + + + This is an abstract base class for types that are stored in the + object. + + + Nicko Cadell + + + + Default protected constructor + + + + Default protected constructor + + + + + + Initialize any options defined on this entry + + + + Should be overridden by any classes that need to initialise based on their options + + + + + + The level that is the key for this mapping + + + The that is the key for this mapping + + + + Get or set the that is the key for this + mapping subclass. + + + + + + Initialize the options for the object + + + + Combine the and together + and append the attributes. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level + + + + + + The color attributes for the specified level + + + + Required property. + The color attributes for the specified level + + + + + + The combined , and + suitable for setting the ansi terminal color. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Creates a read-only wrapper for a AppenderCollection instance. + + list to create a readonly wrapper arround + + An AppenderCollection wrapper that is read-only. + + + + + An empty readonly static AppenderCollection + + + + + Initializes a new instance of the AppenderCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the AppenderCollection class + that has the specified initial capacity. + + + The number of elements that the new AppenderCollection is initially capable of storing. + + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified AppenderCollection. + + The AppenderCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Allow subclasses to avoid our default constructors + + + + + + + Copies the entire AppenderCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire AppenderCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Adds a to the end of the AppenderCollection. + + The to be added to the end of the AppenderCollection. + The index at which the value has been added. + + + + Removes all elements from the AppenderCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the AppenderCollection. + + The to check for. + true if is found in the AppenderCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the AppenderCollection. + + The to locate in the AppenderCollection. + + The zero-based index of the first occurrence of + in the entire AppenderCollection, if found; otherwise, -1. + + + + + Inserts an element into the AppenderCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the AppenderCollection. + + The to remove from the AppenderCollection. + + The specified was not found in the AppenderCollection. + + + + + Removes the element at the specified index of the AppenderCollection. + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Returns an enumerator that can iterate through the AppenderCollection. + + An for the entire AppenderCollection. + + + + Adds the elements of another AppenderCollection to the current AppenderCollection. + + The AppenderCollection whose elements should be added to the end of the current AppenderCollection. + The new of the AppenderCollection. + + + + Adds the elements of a array to the current AppenderCollection. + + The array whose elements should be added to the end of the AppenderCollection. + The new of the AppenderCollection. + + + + Adds the elements of a collection to the current AppenderCollection. + + The collection whose elements should be added to the end of the AppenderCollection. + The new of the AppenderCollection. + + + + Sets the capacity to the actual number of elements. + + + + + Return the collection elements as an array + + the array + + + + is less than zero + -or- + is equal to or greater than . + + + + + is less than zero + -or- + is equal to or greater than . + + + + + Gets the number of elements actually contained in the AppenderCollection. + + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + true if access to the ICollection is synchronized (thread-safe); otherwise, false. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Gets or sets the number of elements the AppenderCollection can contain. + + + + + Supports type-safe iteration over a . + + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Gets the current element in the collection. + + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Gets the current element in the collection. + + + + + + + + + Appends log events to the ASP.NET system. + + + + + Diagnostic information and tracing messages that you specify are appended to the output + of the page that is sent to the requesting browser. Optionally, you can view this information + from a separate trace viewer (Trace.axd) that displays trace information for every page in a + given application. + + + Trace statements are processed and displayed only when tracing is enabled. You can control + whether tracing is displayed to a page, to the trace viewer, or both. + + + The logging event is passed to the or + method depending on the level of the logging event. + The event's logger name is the default value for the category parameter of the Write/Warn method. + + + Nicko Cadell + Gert Driesen + Ron Grabowski + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Write the logging event to the ASP.NET trace + + the event to log + + + Write the logging event to the ASP.NET trace + HttpContext.Current.Trace + (). + + + + + + Defaults to %logger + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + The category parameter sent to the Trace method. + + + + Defaults to %logger which will use the logger name of the current + as the category parameter. + + + + + + + + Buffers events and then forwards them to attached appenders. + + + + The events are buffered in this appender until conditions are + met to allow the appender to deliver the events to the attached + appenders. See for the + conditions that cause the buffer to be sent. + + The forwarding appender can be used to specify different + thresholds and filters for the same appender at different locations + within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Interface for attaching appenders to objects. + + + + Interface for attaching, removing and retrieving appenders. + + + Nicko Cadell + Gert Driesen + + + + Attaches an appender. + + The appender to add. + + + Add the specified appender. The implementation may + choose to allow or deny duplicate appenders. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Returns an attached appender with the specified. + If no appender with the specified name is found null will be + returned. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Gets all attached appenders. + + + A collection of attached appenders. + + + + Gets a collection of attached appenders. + If there are no attached appenders the + implementation should return an empty + collection rather than null. + + + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Send the events. + + The events that need to be send. + + + Forwards the events to the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + Get the named appender attached to this buffering appender. + + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Appends logging events to the console. + + + + ColoredConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific type of message to be set. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes directly to the application's attached console + not to the System.Console.Out or System.Console.Error TextWriter. + The System.Console.Out and System.Console.Error streams can be + programmatically redirected (for example NUnit does this to capture program output). + This appender will ignore these redirections because it needs to use Win32 + API calls to colorize the output. To respect these redirections the + must be used. + + + When configuring the colored console appender, mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + combination of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + HighIntensity + + + + Rick Hobbs + Nicko Cadell + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + flag set to true to write to the console error stream + + When is set to true, output is written to + the standard error output stream. Otherwise, output is written to the standard + output stream. + + + + + Add a mapping of level to color - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colors + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + The console output stream writer to write to + + + + This writer is not thread safe. + + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + The enum of possible color values for use with the color mapping method + + + + The following flags can be combined together to + form the colors. + + + + + + + color is blue + + + + + color is green + + + + + color is red + + + + + color is white + + + + + color is yellow + + + + + color is purple + + + + + color is cyan + + + + + color is intensified + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + Initialize the options for the object + + + + Combine the and together. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level. + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level. + + + + + + The combined and suitable for + setting the console color. + + + + + Appends logging events to the console. + + + + ConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + Nicko Cadell + Gert Driesen + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + flag set to true to write to the console error stream + + When is set to true, output is written to + the standard error output stream. Otherwise, output is written to the standard + output stream. + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + debug system. + + + Events are written using the + method. The event's logger name is passed as the value for the category name to the Write method. + + + Nicko Cadell + + + + Initializes a new instance of the . + + + + Default constructor. + + + + + + Initializes a new instance of the + with a specified layout. + + The layout to use with this appender. + + + Obsolete constructor. + + + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + If is true then the + is called. + + + + + + Immediate flush means that the underlying writer or output stream + will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logs events are not actually written to persistent media if and + when the application crashes. + + + The default value is true. + + + + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Writes events to the system event log. + + + + The appender will fail if you try to write using an event source that doesn't exist unless it is running with local administrator privileges. + See also http://logging.apache.org/log4net/release/faq.html#trouble-EventLog + + + The EventID of the event log entry can be + set using the EventID property () + on the . + + + The Category of the event log entry can be + set using the Category property () + on the . + + + There is a limit of 32K characters for an event log message + + + When configuring the EventLogAppender a mapping can be + specified to map a logging level to an event log entry type. For example: + + + <mapping> + <level value="ERROR" /> + <eventLogEntryType value="Error" /> + </mapping> + <mapping> + <level value="DEBUG" /> + <eventLogEntryType value="Information" /> + </mapping> + + + The Level is the standard log4net logging level and eventLogEntryType can be any value + from the enum, i.e.: + + Erroran error event + Warninga warning event + Informationan informational event + + + + Aspi Havewala + Douglas de la Torre + Nicko Cadell + Gert Driesen + Thomas Voss + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initializes a new instance of the class + with the specified . + + The to use with this appender. + + + Obsolete constructor. + + + + + + Add a mapping of level to - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the event log entry type for a level. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Create an event log source + + + Uses different API calls under NET_2_0 + + + + + This method is called by the + method. + + the event to log + + Writes the event to the system event log using the + . + + If the event has an EventID property (see ) + set then this integer will be used as the event log event id. + + + There is a limit of 32K characters for an event log message + + + + + + Get the equivalent for a + + the Level to convert to an EventLogEntryType + The equivalent for a + + Because there are fewer applicable + values to use in logging levels than there are in the + this is a one way mapping. There is + a loss of information during the conversion. + + + + + The log name is the section in the event logs where the messages + are stored. + + + + + Name of the application to use when logging. This appears in the + application column of the event log named by . + + + + + The name of the machine which holds the event log. This is + currently only allowed to be '.' i.e. the current machine. + + + + + Mapping from level object to EventLogEntryType + + + + + The security context to use for privileged calls + + + + + The event ID to use unless one is explicitly specified via the LoggingEvent's properties. + + + + + The event category to use unless one is explicitly specified via the LoggingEvent's properties. + + + + + The fully qualified type of the EventLogAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + The maximum size supported by default. + + + http://msdn.microsoft.com/en-us/library/xzwc042w(v=vs.100).aspx + The 32766 documented max size is two bytes shy of 32K (I'm assuming 32766 + may leave space for a two byte null terminator of #0#0). The 32766 max + length is what the .NET 4.0 source code checks for, but this is WRONG! + Strings with a length > 31839 on Windows Vista or higher can CORRUPT + the event log! See: System.Diagnostics.EventLogInternal.InternalWriteEvent() + for the use of the 32766 max size. + + + + + The maximum size supported by a windows operating system that is vista + or newer. + + + See ReportEvent API: + http://msdn.microsoft.com/en-us/library/aa363679(VS.85).aspx + ReportEvent's lpStrings parameter: + "A pointer to a buffer containing an array of + null-terminated strings that are merged into the message before Event Viewer + displays the string to the user. This parameter must be a valid pointer + (or NULL), even if wNumStrings is zero. Each string is limited to 31,839 characters." + + Going beyond the size of 31839 will (at some point) corrupt the event log on Windows + Vista or higher! It may succeed for a while...but you will eventually run into the + error: "System.ComponentModel.Win32Exception : A device attached to the system is + not functioning", and the event log will then be corrupt (I was able to corrupt + an event log using a length of 31877 on Windows 7). + + The max size for Windows Vista or higher is documented here: + http://msdn.microsoft.com/en-us/library/xzwc042w(v=vs.100).aspx. + Going over this size may succeed a few times but the buffer will overrun and + eventually corrupt the log (based on testing). + + The maxEventMsgSize size is based on the max buffer size of the lpStrings parameter of the ReportEvent API. + The documented max size for EventLog.WriteEntry for Windows Vista and higher is 31839, but I'm leaving room for a + terminator of #0#0, as we cannot see the source of ReportEvent (though we could use an API monitor to examine the + buffer, given enough time). + + + + + The maximum size that the operating system supports for + a event log message. + + + Used to determine the maximum string length that can be written + to the operating system event log and eventually truncate a string + that exceeds the limits. + + + + + This method determines the maximum event log message size allowed for + the current environment. + + + + + + The name of the log where messages will be stored. + + + The string name of the log where messages will be stored. + + + This is the name of the log as it appears in the Event Viewer + tree. The default value is to log into the Application + log, this is where most applications write their events. However + if you need a separate log for your application (or applications) + then you should set the appropriately. + This should not be used to distinguish your event log messages + from those of other applications, the + property should be used to distinguish events. This property should be + used to group together events into a single log. + + + + + + Property used to set the Application name. This appears in the + event logs when logging. + + + The string used to distinguish events from different sources. + + + Sets the event log source property. + + + + + This property is used to return the name of the computer to use + when accessing the event logs. Currently, this is the current + computer, denoted by a dot "." + + + The string name of the machine holding the event log that + will be logged into. + + + This property cannot be changed. It is currently set to '.' + i.e. the local machine. This may be changed in future. + + + + + Gets or sets the used to write to the EventLog. + + + The used to write to the EventLog. + + + + The system security context used to write to the EventLog. + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Gets or sets the EventId to use unless one is explicitly specified via the LoggingEvent's properties. + + + + The EventID of the event log entry will normally be + set using the EventID property () + on the . + This property provides the fallback value which defaults to 0. + + + + + + Gets or sets the Category to use unless one is explicitly specified via the LoggingEvent's properties. + + + + The Category of the event log entry will normally be + set using the Category property () + on the . + This property provides the fallback value which defaults to 0. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and its event log entry type. + + + + + + The for this entry + + + + Required property. + The for this entry + + + + + + Appends logging events to a file. + + + + Logging events are sent to the file specified by + the property. + + + The file can be opened in either append or overwrite mode + by specifying the property. + If the file path is relative it is taken as relative from + the application base directory. The file encoding can be + specified by setting the property. + + + The layout's and + values will be written each time the file is opened and closed + respectively. If the property is + then the file may contain multiple copies of the header and footer. + + + This appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + The supports pluggable file locking models via + the property. + The default behavior, implemented by + is to obtain an exclusive write lock on the file until this appender is closed. + The alternative models only hold a + write lock while the appender is writing a logging event () + or synchronize by using a named system wide Mutex (). + + + All locking strategies have issues and you should seriously consider using a different strategy that + avoids having multiple processes logging to the same file. + + + Nicko Cadell + Gert Driesen + Rodrigo B. de Oliveira + Douglas de la Torre + Niall Daley + + + + Sends logging events to a . + + + + An Appender that writes to a . + + + This appender may be used stand alone if initialized with an appropriate + writer, however it is typically used as a base class for an appender that + can open a to write to. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initializes a new instance of the class and + sets the output destination to a new initialized + with the specified . + + The layout to use with this appender. + The to output to. + + + Obsolete constructor. + + + + + + Initializes a new instance of the class and sets + the output destination to the specified . + + The layout to use with this appender + The to output to + + The must have been previously opened. + + + + Obsolete constructor. + + + + + + This method determines if there is a sense in attempting to append. + + + + This method checks if an output target has been set and if a + layout has been set. + + + false if any of the preconditions fail. + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + This method writes all the bulk logged events to the output writer + before flushing the stream. + + + + + + Close this appender instance. The underlying stream or writer is also closed. + + + Closed appenders cannot be reused. + + + + + Writes the footer and closes the underlying . + + + + Writes the footer and closes the underlying . + + + + + + Closes the underlying . + + + + Closes the underlying . + + + + + + Clears internal references to the underlying + and other variables. + + + + Subclasses can override this method for an alternate closing behavior. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Called to allow a subclass to lazily initialize the writer + + + + This method is called when an event is logged and the or + have not been set. This allows a subclass to + attempt to initialize the writer multiple times. + + + + + + This is the where logging events + will be written to. + + + + + Immediate flush means that the underlying + or output stream will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logging events are not actually persisted if and when the application + crashes. + + + The default value is true. + + + + + + The fully qualified type of the TextWriterAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or set whether the appender will flush at the end + of each append operation. + + + + The default behavior is to flush at the end of each + append operation. + + + If this option is set to false, then the underlying + stream can defer persisting the logging event to a later + time. + + + + Avoiding the flush operation at the end of each append results in + a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + Sets the where the log output will go. + + + + The specified must be open and writable. + + + The will be closed when the appender + instance is closed. + + + Note: Logging to an unopened will fail. + + + + + + Gets or set the and the underlying + , if any, for this appender. + + + The for this appender. + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Gets or sets the where logging events + will be written to. + + + The where logging events are written. + + + + This is the where logging events + will be written to. + + + + + + Default constructor + + + + Default constructor + + + + + + Construct a new appender using the layout, file and append mode. + + the layout to use with this appender + the full path to the file to write to + flag to indicate if the file should be appended to + + + Obsolete constructor. + + + + + + Construct a new appender using the layout and file specified. + The file will be appended to. + + the layout to use with this appender + the full path to the file to write to + + + Obsolete constructor. + + + + + + Activate the options on the file appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This will cause the file to be opened. + + + + + + Closes any previously opened file and calls the parent's . + + + + Resets the filename and the file stream. + + + + + + Called to initialize the file writer + + + + Will be called for each logged message until the file is + successfully opened. + + + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + Acquires the output file locks once before writing all the events to + the stream. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Closes the underlying . + + + + Closes the underlying . + + + + + + Closes the previously opened file. + + + + Writes the to the file and then + closes the file. + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + Calls but guarantees not to throw an exception. + Errors are passed to the . + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + If there was already an opened file, then the previous file + is closed first. + + + This method will ensure that the directory structure + for the specified exists. + + + + + + Sets the quiet writer used for file output + + the file stream that has been opened for writing + + + This implementation of creates a + over the and passes it to the + method. + + + This method can be overridden by sub classes that want to wrap the + in some way, for example to encrypt the output + data using a System.Security.Cryptography.CryptoStream. + + + + + + Sets the quiet writer being used. + + the writer over the file stream that has been opened for writing + + + This method can be overridden by sub classes that want to + wrap the in some way. + + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + Flag to indicate if we should append to the file + or overwrite the file. The default is to append. + + + + + The name of the log file. + + + + + The encoding to use for the file stream. + + + + + The security context to use for privileged calls + + + + + The stream to log to. Has added locking semantics + + + + + The locking model to use + + + + + The fully qualified type of the FileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the path to the file that logging will be written to. + + + The path to the file that logging will be written to. + + + + If the path is relative it is taken as relative from + the application base directory. + + + + + + Gets or sets a flag that indicates whether the file should be + appended to or overwritten. + + + Indicates whether the file should be appended to or overwritten. + + + + If the value is set to false then the file will be overwritten, if + it is set to true then the file will be appended to. + + The default value is true. + + + + + Gets or sets used to write to the file. + + + The used to write to the file. + + + + The default encoding set is + which is the encoding for the system's current ANSI code page. + + + + + + Gets or sets the used to write to the file. + + + The used to write to the file. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Gets or sets the used to handle locking of the file. + + + The used to lock the file. + + + + Gets or sets the used to handle locking of the file. + + + There are three built in locking models, , and . + The first locks the file from the start of logging to the end, the + second locks only for the minimal amount of time when logging each message + and the last synchronizes processes using a named system wide Mutex. + + + The default locking model is the . + + + + + + Write only that uses the + to manage access to an underlying resource. + + + + + True asynchronous writes are not supported, the implementation forces a synchronous write. + + + + + Exception base type for log4net. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class with + the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Locking model base class + + + + Base class for the locking models available to the derived loggers. + + + + + + Open the output file + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Acquire the lock on the file in preparation for writing to it. + Return a stream pointing to the file. + must be called to release the lock on the output file. + + + + + + Release the lock on the file + + + + Release the lock on the file. No further writes will be made to the + stream until is called again. + + + + + + Helper method that creates a FileStream under CurrentAppender's SecurityContext. + + + + Typically called during OpenFile or AcquireLock. + + + If the directory portion of the does not exist, it is created + via Directory.CreateDirecctory. + + + + + + + + + + Helper method to close under CurrentAppender's SecurityContext. + + + Does not set to null. + + + + + + Gets or sets the for this LockingModel + + + The for this LockingModel + + + + The file appender this locking model is attached to and working on + behalf of. + + + The file appender is used to locate the security context and the error handler to use. + + + The value of this property will be set before is + called. + + + + + + Hold an exclusive lock on the output file + + + + Open the file once for writing and hold it open until is called. + Maintains an exclusive lock on the file during this time. + + + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Release the lock on the file + + + + Does nothing. The lock will be released when the file is closed. + + + + + + Acquires the file lock for each write + + + + Opens the file once for each / cycle, + thus holding the lock for the minimal amount of time. This method of locking + is considerably slower than but allows + other processes to move/delete the log file whilst logging continues. + + + + + + Prepares to open the file when the first message is logged. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Acquire the lock on the file in preparation for writing to it. + Return a stream pointing to the file. + must be called to release the lock on the output file. + + + + + + Release the lock on the file + + + + Release the lock on the file. No further writes will be made to the + stream until is called again. + + + + + + Provides cross-process file locking. + + Ron Grabowski + Steve Wranovsky + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + - and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + + + + + + This appender forwards logging events to attached appenders. + + + + The forwarding appender can be used to specify different thresholds + and filters for the same appender at different locations within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Forward the logging event to the attached appenders + + The event to log. + + + Delivers the logging event to all the attached appenders. + + + + + + Forward the logging events to the attached appenders + + The array of events to log. + + + Delivers the logging events to all the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + Get the named appender attached to this appender. + + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Logs events to a local syslog service. + + + + This appender uses the POSIX libc library functions openlog, syslog, and closelog. + If these functions are not available on the local system then this appender will not work! + + + The functions openlog, syslog, and closelog are specified in SUSv2 and + POSIX 1003.1-2001 standards. These are used to log messages to the local syslog service. + + + This appender talks to a local syslog service. If you need to log to a remote syslog + daemon and you cannot configure your local syslog service to do this you may be + able to use the to log via UDP. + + + Syslog messages must have a facility and and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a local syslog service. + + + + + Add a mapping of level to severity + + The mapping to add + + + Adds a to this appender. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to a remote syslog daemon. + + + The format of the output will depend on the appender's layout. + + + + + + Close the syslog when the appender is closed + + + + Close the syslog when the appender is closed + + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + Translates a log4net level to a syslog severity. + + + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + + The facility. The default facility is . + + + + + The message identity + + + + + Marshaled handle to the identity string. We have to hold on to the + string as the openlog and syslog APIs just hold the + pointer to the ident and dereference it for each log message. + + + + + Mapping from level object to syslog severity + + + + + Open connection to system logger. + + + + + Generate a log message. + + + + The libc syslog method takes a format string and a variable argument list similar + to the classic printf function. As this type of vararg list is not supported + by C# we need to specify the arguments explicitly. Here we have specified the + format string with a single message argument. The caller must set the format + string to "%s". + + + + + + Close descriptor used to write to system logger. + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + syslog severities + + + + The log4net Level maps to a syslog severity using the + method and the + class. The severity is set on . + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facility defines which subsystem the logging comes from. + This is set on the property. + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + + + The mapped syslog severity for the specified level + + + + Required property. + The mapped syslog severity for the specified level + + + + + + Appends colorful logging events to the console, using the .NET 2 + built-in capabilities. + + + + ManagedColoredConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific type of message to be set. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + When configuring the colored console appender, mappings should be + specified to map logging levels to colors. For example: + + + + + + + + + + + + + + + + + + + + + + The Level is the standard log4net logging level while + ForeColor and BackColor are the values of + enumeration. + + + Based on the ColoredConsoleAppender + + + Rick Hobbs + Nicko Cadell + Pavlos Touboulidis + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Add a mapping of level to color - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colors + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level. + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level. + + + + + + Stores logging events in an array. + + + + The memory appender stores all the logging events + that are appended in an in-memory array. + + + Use the method to get + the current list of events that have been appended. + + + Use the method to clear the + current list of events. + + + Julian Biddle + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Gets the events that have been logged. + + The events that have been logged + + + Gets the events that have been logged. + + + + + + This method is called by the method. + + the event to log + + Stores the in the events list. + + + + + Clear the list of events + + + Clear the list of events + + + + + The list of events that have been appended. + + + + + Value indicating which fields in the event should be fixed + + + By default all fields are fixed + + + + + Gets or sets a value indicating whether only part of the logging event + data should be fixed. + + + true if the appender should only fix part of the logging event + data, otherwise false. The default is false. + + + + Setting this property to true will cause only part of the event + data to be fixed and stored in the appender, hereby improving performance. + + + See for more information. + + + + + + Gets or sets the fields that will be fixed in the event + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + Logs entries by sending network messages using the + native function. + + + + You can send messages only to names that are active + on the network. If you send the message to a user name, + that user must be logged on and running the Messenger + service to receive the message. + + + The receiver will get a top most window displaying the + messages one at a time, therefore this appender should + not be used to deliver a high volume of messages. + + + The following table lists some possible uses for this appender : + + + + + Action + Property Value(s) + + + Send a message to a user account on the local machine + + + = <name of the local machine> + + + = <user name> + + + + + Send a message to a user account on a remote machine + + + = <name of the remote machine> + + + = <user name> + + + + + Send a message to a domain user account + + + = <name of a domain controller | uninitialized> + + + = <user name> + + + + + Send a message to all the names in a workgroup or domain + + + = <workgroup name | domain name>* + + + + + Send a message from the local machine to a remote machine + + + = <name of the local machine | uninitialized> + + + = <name of the remote machine> + + + + + + + Note : security restrictions apply for sending + network messages, see + for more information. + + + + + An example configuration section to log information + using this appender from the local machine, named + LOCAL_PC, to machine OPERATOR_PC : + + + + + + + + + + Nicko Cadell + Gert Driesen + + + + The DNS or NetBIOS name of the server on which the function is to execute. + + + + + The sender of the network message. + + + + + The message alias to which the message should be sent. + + + + + The security context to use for privileged calls + + + + + Initializes the appender. + + + The default constructor initializes all fields to their default values. + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The appender will be ignored if no was specified. + + + The required property was not specified. + + + + This method is called by the method. + + The event to log. + + + Sends the event using a network message. + + + + + + Sends a buffer of information to a registered message alias. + + The DNS or NetBIOS name of the server on which the function is to execute. + The message alias to which the message buffer should be sent + The originator of the message. + The message text. + The length, in bytes, of the message text. + + + The following restrictions apply for sending network messages: + + + + + Platform + Requirements + + + Windows NT + + + No special group membership is required to send a network message. + + + Admin, Accounts, Print, or Server Operator group membership is required to + successfully send a network message on a remote server. + + + + + Windows 2000 or later + + + If you send a message on a domain controller that is running Active Directory, + access is allowed or denied based on the access control list (ACL) for the securable + object. The default ACL permits only Domain Admins and Account Operators to send a network message. + + + On a member server or workstation, only Administrators and Server Operators can send a network message. + + + + + + + For more information see Security Requirements for the Network Management Functions. + + + + + If the function succeeds, the return value is zero. + + + + + + Gets or sets the sender of the message. + + + The sender of the message. + + + If this property is not specified, the message is sent from the local computer. + + + + + Gets or sets the message alias to which the message should be sent. + + + The recipient of the message. + + + This property should always be specified in order to send a message. + + + + + Gets or sets the DNS or NetBIOS name of the remote server on which the function is to execute. + + + DNS or NetBIOS name of the remote server on which the function is to execute. + + + + For Windows NT 4.0 and earlier, the string should begin with \\. + + + If this property is not specified, the local computer is used. + + + + + + Gets or sets the used to call the NetSend method. + + + The used to call the NetSend method. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Appends log events to the OutputDebugString system. + + + + OutputDebugStringAppender appends log events to the + OutputDebugString system. + + + The string is passed to the native OutputDebugString + function. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Write the logging event to the output debug string API + + the event to log + + + Write the logging event to the output debug string API + + + + + + Stub for OutputDebugString native method + + the string to output + + + Stub for OutputDebugString native method + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Logs events to a remote syslog daemon. + + + + The BSD syslog protocol is used to remotely log to + a syslog daemon. The syslogd listens for for messages + on UDP port 514. + + + The syslog UDP protocol is not authenticated. Most syslog daemons + do not accept remote log messages because of the security implications. + You may be able to use the LocalSyslogAppender to talk to a local + syslog service. + + + There is an RFC 3164 that claims to document the BSD Syslog Protocol. + This RFC can be seen here: http://www.faqs.org/rfcs/rfc3164.html. + This appender generates what the RFC calls an "Original Device Message", + i.e. does not include the TIMESTAMP or HOSTNAME fields. By observation + this format of message will be accepted by all current syslog daemon + implementations. The daemon will attach the current time and the source + hostname or IP address to any messages received. + + + Syslog messages must have a facility and and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + Sends logging events as connectionless UDP datagrams to a remote host or a + multicast group using an . + + + + UDP guarantees neither that messages arrive, nor that they arrive in the correct order. + + + To view the logging results, a custom application can be developed that listens for logging + events. + + + When decoding events send via this appender remember to use the same encoding + to decode the events as was used to send the events. See the + property to specify the encoding to use. + + + + This example shows how to log receive logging events that are sent + on IP address 244.0.0.1 and port 8080 to the console. The event is + encoded in the packet as a unicode string and it is decoded as such. + + IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); + UdpClient udpClient; + byte[] buffer; + string loggingEvent; + + try + { + udpClient = new UdpClient(8080); + + while(true) + { + buffer = udpClient.Receive(ref remoteEndPoint); + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer); + Console.WriteLine(loggingEvent); + } + } + catch(Exception e) + { + Console.WriteLine(e.ToString()); + } + + + Dim remoteEndPoint as IPEndPoint + Dim udpClient as UdpClient + Dim buffer as Byte() + Dim loggingEvent as String + + Try + remoteEndPoint = new IPEndPoint(IPAddress.Any, 0) + udpClient = new UdpClient(8080) + + While True + buffer = udpClient.Receive(ByRef remoteEndPoint) + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer) + Console.WriteLine(loggingEvent) + Wend + Catch e As Exception + Console.WriteLine(e.ToString()) + End Try + + + An example configuration section to log information using this appender to the + IP 224.0.0.1 on port 8080: + + + + + + + + + + Gert Driesen + Nicko Cadell + + + + Initializes a new instance of the class. + + + The default constructor initializes all fields to their default values. + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The appender will be ignored if no was specified or + an invalid remote or local TCP port number was specified. + + + The required property was not specified. + The TCP port number assigned to or is less than or greater than . + + + + This method is called by the method. + + The event to log. + + + Sends the event using an UDP datagram. + + + Exceptions are passed to the . + + + + + + Closes the UDP connection and releases all resources associated with + this instance. + + + + Disables the underlying and releases all managed + and unmanaged resources associated with the . + + + + + + Initializes the underlying connection. + + + + The underlying is initialized and binds to the + port number from which you intend to communicate. + + + Exceptions are passed to the . + + + + + + The IP address of the remote host or multicast group to which + the logging event will be sent. + + + + + The TCP port number of the remote host or multicast group to + which the logging event will be sent. + + + + + The cached remote endpoint to which the logging events will be sent. + + + + + The TCP port number from which the will communicate. + + + + + The instance that will be used for sending the + logging events. + + + + + The encoding to use for the packet. + + + + + Gets or sets the IP address of the remote host or multicast group to which + the underlying should sent the logging event. + + + The IP address of the remote host or multicast group to which the logging event + will be sent. + + + + Multicast addresses are identified by IP class D addresses (in the range 224.0.0.0 to + 239.255.255.255). Multicast packets can pass across different networks through routers, so + it is possible to use multicasts in an Internet scenario as long as your network provider + supports multicasting. + + + Hosts that want to receive particular multicast messages must register their interest by joining + the multicast group. Multicast messages are not sent to networks where no host has joined + the multicast group. Class D IP addresses are used for multicast groups, to differentiate + them from normal host addresses, allowing nodes to easily detect if a message is of interest. + + + Static multicast addresses that are needed globally are assigned by IANA. A few examples are listed in the table below: + + + + + IP Address + Description + + + 224.0.0.1 + + + Sends a message to all system on the subnet. + + + + + 224.0.0.2 + + + Sends a message to all routers on the subnet. + + + + + 224.0.0.12 + + + The DHCP server answers messages on the IP address 224.0.0.12, but only on a subnet. + + + + + + + A complete list of actually reserved multicast addresses and their owners in the ranges + defined by RFC 3171 can be found at the IANA web site. + + + The address range 239.0.0.0 to 239.255.255.255 is reserved for administrative scope-relative + addresses. These addresses can be reused with other local groups. Routers are typically + configured with filters to prevent multicast traffic in this range from flowing outside + of the local network. + + + + + + Gets or sets the TCP port number of the remote host or multicast group to which + the underlying should sent the logging event. + + + An integer value in the range to + indicating the TCP port number of the remote host or multicast group to which the logging event + will be sent. + + + The underlying will send messages to this TCP port number + on the remote host or multicast group. + + The value specified is less than or greater than . + + + + Gets or sets the TCP port number from which the underlying will communicate. + + + An integer value in the range to + indicating the TCP port number from which the underlying will communicate. + + + + The underlying will bind to this port for sending messages. + + + Setting the value to 0 (the default) will cause the udp client not to bind to + a local port. + + + The value specified is less than or greater than . + + + + Gets or sets used to write the packets. + + + The used to write the packets. + + + + The used to write the packets. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to send logging events + over a network. Classes deriving from can use this + property to get or set this . Use the underlying + returned from if you require access beyond that which + provides. + + + + + Gets or sets the cached remote endpoint to which the logging events should be sent. + + + The cached remote endpoint to which the logging events will be sent. + + + The method will initialize the remote endpoint + with the values of the and + properties. + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Syslog port 514 + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a remote syslog daemon. + + + + + Add a mapping of level to severity + + The mapping to add + + + Add a mapping to this appender. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to a remote syslog daemon. + + + The format of the output will depend on the appender's layout. + + + + + + Initialize the options for this appender + + + + Initialize the level to syslog severity mappings set on this appender. + + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + Translates a log4net level to a syslog severity. + + + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + Generate a syslog priority. + + + + + + The facility. The default facility is . + + + + + The message identity + + + + + Mapping from level object to syslog severity + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + syslog severities + + + + The syslog severities. + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facilities + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + + + The mapped syslog severity for the specified level + + + + Required property. + The mapped syslog severity for the specified level + + + + + + Delivers logging events to a remote logging sink. + + + + This Appender is designed to deliver events to a remote sink. + That is any object that implements the + interface. It delivers the events using .NET remoting. The + object to deliver events to is specified by setting the + appenders property. + + The RemotingAppender buffers events before sending them. This allows it to + make more efficient use of the remoting infrastructure. + + Once the buffer is full the events are still not sent immediately. + They are scheduled to be sent using a pool thread. The effect is that + the send occurs asynchronously. This is very important for a + number of non obvious reasons. The remoting infrastructure will + flow thread local variables (stored in the ), + if they are marked as , across the + remoting boundary. If the server is not contactable then + the remoting infrastructure will clear the + objects from the . To prevent a logging failure from + having side effects on the calling application the remoting call must be made + from a separate thread to the one used by the application. A + thread is used for this. If no thread is available then + the events will block in the thread pool manager until a thread is available. + + Because the events are sent asynchronously using pool threads it is possible to close + this appender before all the queued events have been sent. + When closing the appender attempts to wait until all the queued events have been sent, but + this will timeout after 30 seconds regardless. + + If this appender is being closed because the + event has fired it may not be possible to send all the queued events. During process + exit the runtime limits the time that a + event handler is allowed to run for. If the runtime terminates the threads before + the queued events have been sent then they will be lost. To ensure that all events + are sent the appender must be closed before the application exits. See + for details on how to shutdown + log4net programmatically. + + + Nicko Cadell + Gert Driesen + Daniel Cazzulino + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Send the contents of the buffer to the remote sink. + + + The events are not sent immediately. They are scheduled to be sent + using a pool thread. The effect is that the send occurs asynchronously. + This is very important for a number of non obvious reasons. The remoting + infrastructure will flow thread local variables (stored in the ), + if they are marked as , across the + remoting boundary. If the server is not contactable then + the remoting infrastructure will clear the + objects from the . To prevent a logging failure from + having side effects on the calling application the remoting call must be made + from a separate thread to the one used by the application. A + thread is used for this. If no thread is available then + the events will block in the thread pool manager until a thread is available. + + The events to send. + + + + Override base class close. + + + + This method waits while there are queued work items. The events are + sent asynchronously using work items. These items + will be sent once a thread pool thread is available to send them, therefore + it is possible to close the appender before all the queued events have been + sent. + + This method attempts to wait until all the queued events have been sent, but this + method will timeout after 30 seconds regardless. + + If the appender is being closed because the + event has fired it may not be possible to send all the queued events. During process + exit the runtime limits the time that a + event handler is allowed to run for. + + + + + A work item is being queued into the thread pool + + + + + A work item from the thread pool has completed + + + + + Send the contents of the buffer to the remote sink. + + + This method is designed to be used with the . + This method expects to be passed an array of + objects in the state param. + + the logging events to send + + + + The URL of the remote sink. + + + + + The local proxy (.NET remoting) for the remote logging sink. + + + + + The number of queued callbacks currently waiting or executing + + + + + Event used to signal when there are no queued work items + + + This event is set when there are no queued work items. In this + state it is safe to close the appender. + + + + + Gets or sets the URL of the well-known object that will accept + the logging events. + + + The well-known URL of the remote sink. + + + + The URL of the remoting sink that will accept logging events. + The sink must implement the + interface. + + + + + + Interface used to deliver objects to a remote sink. + + + This interface must be implemented by a remoting sink + if the is to be used + to deliver logging events to the sink. + + + + + Delivers logging events to the remote sink + + Array of events to log. + + + Delivers logging events to the remote sink + + + + + + Appender that rolls log files based on size or date or both. + + + + RollingFileAppender can roll log files based on size or date or both + depending on the setting of the property. + When set to the log file will be rolled + once its size exceeds the . + When set to the log file will be rolled + once the date boundary specified in the property + is crossed. + When set to the log file will be + rolled once the date boundary specified in the property + is crossed, but within a date boundary the file will also be rolled + once its size exceeds the . + When set to the log file will be rolled when + the appender is configured. This effectively means that the log file can be + rolled once per program execution. + + + A of few additional optional features have been added: + + Attach date pattern for current log file + Backup number increments for newer files + Infinite number of backups by file size + + + + + + For large or infinite numbers of backup files a + greater than zero is highly recommended, otherwise all the backup files need + to be renamed each time a new backup is created. + + + When Date/Time based rolling is used setting + to will reduce the number of file renamings to few or none. + + + + + + Changing or without clearing + the log file directory of backup files will cause unexpected and unwanted side effects. + + + + + If Date/Time based rolling is enabled this appender will attempt to roll existing files + in the directory without a Date/Time tag based on the last write date of the base log file. + The appender only rolls the log file when a message is logged. If Date/Time based rolling + is enabled then the appender will not roll the log file at the Date/Time boundary but + at the point when the next message is logged after the boundary has been crossed. + + + + The extends the and + has the same behavior when opening the log file. + The appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + When rolling a backup file necessitates deleting an older backup file the + file to be deleted is moved to a temporary name before being deleted. + + + + + A maximum number of backup files when rolling on date/time boundaries is not supported. + + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + Edward Smit + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + The fully qualified type of the RollingFileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Sets the quiet writer being used. + + + This method can be overridden by sub classes. + + the writer to set + + + + Write out a logging event. + + the event to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Write out an array of logging events. + + the events to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Performs any required rolling before outputting the next event + + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Creates and opens the file for logging. If + is false then the fully qualified name is determined and used. + + the name of the file to open + true to append to existing file + + This method will ensure that the directory structure + for the specified exists. + + + + + Get the current output file name + + the base file name + the output file name + + The output file name is based on the base fileName specified. + If is set then the output + file name is the same as the base file passed in. Otherwise + the output file depends on the date pattern, on the count + direction or both. + + + + + Determines curSizeRollBackups (only within the current roll point) + + + + + Generates a wildcard pattern that can be used to find all files + that are similar to the base file name. + + + + + + + Builds a list of filenames for all files matching the base filename plus a file + pattern. + + + + + + + Initiates a roll over if needed for crossing a date boundary since the last run. + + + + + Initializes based on existing conditions at time of . + + + + Initializes based on existing conditions at time of . + The following is done + + determine curSizeRollBackups (only within the current roll point) + initiates a roll over if needed for crossing a date boundary since the last run. + + + + + + + Does the work of bumping the 'current' file counter higher + to the highest count when an incremental file name is seen. + The highest count is either the first file (when count direction + is greater than 0) or the last file (when count direction less than 0). + In either case, we want to know the highest count that is present. + + + + + + + Attempts to extract a number from the end of the file name that indicates + the number of the times the file has been rolled over. + + + Certain date pattern extensions like yyyyMMdd will be parsed as valid backup indexes. + + + + + + + Takes a list of files and a base file name, and looks for + 'incremented' versions of the base file. Bumps the max + count up to the highest count seen. + + + + + + + Calculates the RollPoint for the datePattern supplied. + + the date pattern to calculate the check period for + The RollPoint that is most accurate for the date pattern supplied + + Essentially the date pattern is examined to determine what the + most suitable roll point is. The roll point chosen is the roll point + with the smallest period that can be detected using the date pattern + supplied. i.e. if the date pattern only outputs the year, month, day + and hour then the smallest roll point that can be detected would be + and hourly roll point as minutes could not be detected. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Sets initial conditions including date/time roll over information, first check, + scheduledFilename, and calls to initialize + the current number of backups. + + + + + + + + + .1, .2, .3, etc. + + + + + Rollover the file(s) to date/time tagged file(s). + + set to true if the file to be rolled is currently open + + + Rollover the file(s) to date/time tagged file(s). + Resets curSizeRollBackups. + If fileIsOpen is set then the new file is opened (through SafeOpenFile). + + + + + + Renames file to file . + + Name of existing file to roll. + New name for file. + + + Renames file to file . It + also checks for existence of target file and deletes if it does. + + + + + + Test if a file exists at a specified path + + the path to the file + true if the file exists + + + Test if a file exists at a specified path + + + + + + Deletes the specified file if it exists. + + The file to delete. + + + Delete a file if is exists. + The file is first moved to a new filename then deleted. + This allows the file to be removed even when it cannot + be deleted, but it still can be moved. + + + + + + Implements file roll base on file size. + + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. Moreover, File is + renamed File.1 and closed. + + + A new file is created to receive further log output. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + + + + Implements file roll. + + the base name to rename + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + This is called by to rename the files. + + + + + + Get the start time of the next window for the current rollpoint + + the current date + the type of roll point we are working with + the start time for the next roll point an interval after the currentDateTime date + + + Returns the date of the next roll point after the currentDateTime date passed to the method. + + + The basic strategy is to subtract the time parts that are less significant + than the rollpoint from the current time. This should roll the time back to + the start of the time window for the current rollpoint. Then we add 1 window + worth of time and get the start time of the next window for the rollpoint. + + + + + + This object supplies the current date/time. Allows test code to plug in + a method to control this class when testing date/time based rolling. The default + implementation uses the underlying value of DateTime.Now. + + + + + The date pattern. By default, the pattern is set to ".yyyy-MM-dd" + meaning daily rollover. + + + + + The actual formatted filename that is currently being written to + or will be the file transferred to on roll over + (based on staticLogFileName). + + + + + The timestamp when we shall next recompute the filename. + + + + + Holds date of last roll over + + + + + The type of rolling done + + + + + The default maximum file size is 10MB + + + + + There is zero backup files by default + + + + + How many sized based backups have been made so far + + + + + The rolling file count direction. + + + + + The rolling mode used in this appender. + + + + + Cache flag set if we are rolling by date. + + + + + Cache flag set if we are rolling by size. + + + + + Value indicating whether to always log to the same file. + + + + + Value indicating whether to preserve the file name extension when rolling. + + + + + FileName provided in configuration. Used for rolling properly + + + + + The 1st of January 1970 in UTC + + + + + Gets or sets the strategy for determining the current date and time. The default + implementation is to use LocalDateTime which internally calls through to DateTime.Now. + DateTime.UtcNow may be used on frameworks newer than .NET 1.0 by specifying + . + + + An implementation of the interface which returns the current date and time. + + + + Gets or sets the used to return the current date and time. + + + There are two built strategies for determining the current date and time, + + and . + + + The default strategy is . + + + + + + Gets or sets the date pattern to be used for generating file names + when rolling over on date. + + + The date pattern to be used for generating file names when rolling + over on date. + + + + Takes a string in the same format as expected by + . + + + This property determines the rollover schedule when rolling over + on date. + + + + + + Gets or sets the maximum number of backup files that are kept before + the oldest is erased. + + + The maximum number of backup files that are kept before the oldest is + erased. + + + + If set to zero, then there will be no backup files and the log file + will be truncated when it reaches . + + + If a negative number is supplied then no deletions will be made. Note + that this could result in very slow performance as a large number of + files are rolled over unless is used. + + + The maximum applies to each time based group of files and + not the total. + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size in bytes that the output file is allowed to reach before being + rolled over to backup files. + + + + This property is equivalent to except + that it is required for differentiating the setter taking a + argument from the setter taking a + argument. + + + The default maximum file size is 10MB (10*1024*1024). + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size that the output file is allowed to reach before being + rolled over to backup files. + + + + This property allows you to specify the maximum size with the + suffixes "KB", "MB" or "GB" so that the size is interpreted being + expressed respectively in kilobytes, megabytes or gigabytes. + + + For example, the value "10KB" will be interpreted as 10240 bytes. + + + The default maximum file size is 10MB. + + + If you have the option to set the maximum file size programmatically + consider using the property instead as this + allows you to set the size in bytes as a . + + + + + + Gets or sets the rolling file count direction. + + + The rolling file count direction. + + + + Indicates if the current file is the lowest numbered file or the + highest numbered file. + + + By default newer files have lower numbers ( < 0), + i.e. log.1 is most recent, log.5 is the 5th backup, etc... + + + >= 0 does the opposite i.e. + log.1 is the first backup made, log.5 is the 5th backup made, etc. + For infinite backups use >= 0 to reduce + rollover costs. + + The default file count direction is -1. + + + + + Gets or sets the rolling style. + + The rolling style. + + + The default rolling style is . + + + When set to this appender's + property is set to false, otherwise + the appender would append to a single file rather than rolling + the file each time it is opened. + + + + + + Gets or sets a value indicating whether to preserve the file name extension when rolling. + + + true if the file name extension should be preserved. + + + + By default file.log is rolled to file.log.yyyy-MM-dd or file.log.curSizeRollBackup. + However, under Windows the new file name will loose any program associations as the + extension is changed. Optionally file.log can be renamed to file.yyyy-MM-dd.log or + file.curSizeRollBackup.log to maintain any program associations. + + + + + + Gets or sets a value indicating whether to always log to + the same file. + + + true if always should be logged to the same file, otherwise false. + + + + By default file.log is always the current file. Optionally + file.log.yyyy-mm-dd for current formatted datePattern can by the currently + logging file (or file.log.curSizeRollBackup or even + file.log.yyyy-mm-dd.curSizeRollBackup). + + + This will make time based rollovers with a large number of backups + much faster as the appender it won't have to rename all the backups! + + + + + + Style of rolling to use + + + + Style of rolling to use + + + + + + Roll files once per program execution + + + + Roll files once per program execution. + Well really once each time this appender is + configured. + + + Setting this option also sets AppendToFile to + false on the RollingFileAppender, otherwise + this appender would just be a normal file appender. + + + + + + Roll files based only on the size of the file + + + + + Roll files based only on the date + + + + + Roll files based on both the size and date of the file + + + + + The code assumes that the following 'time' constants are in a increasing sequence. + + + + The code assumes that the following 'time' constants are in a increasing sequence. + + + + + + Roll the log not based on the date + + + + + Roll the log for each minute + + + + + Roll the log for each hour + + + + + Roll the log twice a day (midday and midnight) + + + + + Roll the log each day (midnight) + + + + + Roll the log each week + + + + + Roll the log each month + + + + + This interface is used to supply Date/Time information to the . + + + This interface is used to supply Date/Time information to the . + Used primarily to allow test classes to plug themselves in so they can + supply test date/times. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Default implementation of that returns the current time. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Implementation of that returns the current time as the coordinated universal time (UTC). + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Send an e-mail when a specific logging event occurs, typically on errors + or fatal errors. + + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Authentication and setting the server Port are only available on the MS .NET 1.1 runtime. + For these features to be enabled you need to ensure that you are using a version of + the log4net assembly that is built against the MS .NET 1.1 framework and that you are + running the your application on the MS .NET 1.1 runtime. On all other platforms only sending + unauthenticated messages to a server listening on port 25 (the default) is supported. + + + Authentication is supported by setting the property to + either or . + If using authentication then the + and properties must also be set. + + + To set the SMTP server port use the property. The default port is 25. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + + Send the email message + + the body text to include in the mail + + + + Gets or sets a comma- or semicolon-delimited list of recipient e-mail addresses (use semicolon on .NET 1.1 and comma for later versions). + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + + Gets or sets a comma- or semicolon-delimited list of recipient e-mail addresses + that will be carbon copied (use semicolon on .NET 1.1 and comma for later versions). + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses + that will be blind carbon copied. + + + A semicolon-delimited list of e-mail addresses. + + + + A semicolon-delimited list of recipient e-mail addresses. + + + + + + Gets or sets the e-mail address of the sender. + + + The e-mail address of the sender. + + + + The e-mail address of the sender. + + + + + + Gets or sets the subject line of the e-mail message. + + + The subject line of the e-mail message. + + + + The subject line of the e-mail message. + + + + + + Gets or sets the name of the SMTP relay mail server to use to send + the e-mail messages. + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + + + Obsolete + + + Use the BufferingAppenderSkeleton Fix methods instead + + + + Obsolete property. + + + + + + The mode to use to authentication with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + Valid Authentication mode values are: , + , and . + The default value is . When using + you must specify the + and to use to authenticate. + When using the Windows credentials for the current + thread, if impersonating, or the process will be used to authenticate. + + + + + + The username to use to authenticate with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + A and must be specified when + is set to , + otherwise the username will be ignored. + + + + + + The password to use to authenticate with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + A and must be specified when + is set to , + otherwise the password will be ignored. + + + + + + The port on which the SMTP server is listening + + + Server Port is only available on the MS .NET 1.1 runtime. + + The port on which the SMTP server is listening. The default + port is 25. The Port can only be changed when running on + the MS .NET 1.1 runtime. + + + + + + Gets or sets the priority of the e-mail message + + + One of the values. + + + + Sets the priority of the e-mails generated by this + appender. The default priority is . + + + If you are using this appender to report errors then + you may want to set the priority to . + + + + + + Enable or disable use of SSL when sending e-mail message + + + This is available on MS .NET 2.0 runtime and higher + + + + + Gets or sets the reply-to e-mail address. + + + This is available on MS .NET 2.0 runtime and higher + + + + + Gets or sets the subject encoding to be used. + + + The default encoding is the operating system's current ANSI codepage. + + + + + Gets or sets the body encoding to be used. + + + The default encoding is the operating system's current ANSI codepage. + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Values for the property. + + + + SMTP authentication modes. + + + + + + No authentication + + + + + Basic authentication. + + + Requires a username and password to be supplied + + + + + Integrated authentication + + + Uses the Windows credentials from the current thread or process to authenticate. + + + + + Send an email when a specific logging event occurs, typically on errors + or fatal errors. Rather than sending via smtp it writes a file into the + directory specified by . This allows services such + as the IIS SMTP agent to manage sending the messages. + + + + The configuration for this appender is identical to that of the SMTPAppender, + except that instead of specifying the SMTPAppender.SMTPHost you specify + . + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Niall Daley + Nicko Cadell + + + + Default constructor + + + + Default constructor + + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + Sends the contents of the cyclic buffer as an e-mail message. + + + + + + Activate the options on this appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + The security context to use for privileged calls + + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses. + + + A semicolon-delimited list of e-mail addresses. + + + + A semicolon-delimited list of e-mail addresses. + + + + + + Gets or sets the e-mail address of the sender. + + + The e-mail address of the sender. + + + + The e-mail address of the sender. + + + + + + Gets or sets the subject line of the e-mail message. + + + The subject line of the e-mail message. + + + + The subject line of the e-mail message. + + + + + + Gets or sets the path to write the messages to. + + + + Gets or sets the path to write the messages to. This should be the same + as that used by the agent sending the messages. + + + + + + Gets or sets the used to write to the pickup directory. + + + The used to write to the pickup directory. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Appender that allows clients to connect via Telnet to receive log messages + + + + The TelnetAppender accepts socket connections and streams logging messages + back to the client. + The output is provided in a telnet-friendly way so that a log can be monitored + over a TCP/IP socket. + This allows simple remote monitoring of application logging. + + + The default is 23 (the telnet port). + + + Keith Long + Nicko Cadell + + + + Default constructor + + + + Default constructor + + + + + + The fully qualified type of the TelnetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Overrides the parent method to close the socket handler + + + + Closes all the outstanding connections. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Create the socket handler and wait for connections + + + + + + Writes the logging event to each connected client. + + The event to log. + + + Writes the logging event to each connected client. + + + + + + Gets or sets the TCP port number on which this will listen for connections. + + + An integer value in the range to + indicating the TCP port number on which this will listen for connections. + + + + The default value is 23 (the telnet port). + + + The value specified is less than + or greater than . + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Helper class to manage connected clients + + + + The SocketHandler class is used to accept connections from + clients. It is threaded so that clients can connect/disconnect + asynchronously. + + + + + + Opens a new server port on + + the local port to listen on for connections + + + Creates a socket handler on the specified local server port. + + + + + + Sends a string message to each of the connected clients + + the text to send + + + Sends a string message to each of the connected clients + + + + + + Add a client to the internal clients list + + client to add + + + + Remove a client from the internal clients list + + client to remove + + + + Callback used to accept a connection on the server socket + + The result of the asynchronous operation + + + On connection adds to the list of connections + if there are two many open connections you will be disconnected + + + + + + Close all network connections + + + + Make sure we close all network connections + + + + + + Test if this handler has active connections + + + true if this handler has active connections + + + + This property will be true while this handler has + active connections, that is at least one connection that + the handler will attempt to send a message to. + + + + + + Class that represents a client connected to this handler + + + + Class that represents a client connected to this handler + + + + + + Create this for the specified + + the client's socket + + + Opens a stream writer on the socket. + + + + + + Write a string to the client + + string to send + + + Write a string to the client + + + + + + Cleanup the clients connection + + + + Close the socket connection. + + + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + trace system. + + + Events are written using the System.Diagnostics.Trace.Write(string,string) + method. The event's logger name is the default value for the category parameter + of the Write method. + + + Compact Framework
+ The Compact Framework does not support the + class for any operation except Assert. When using the Compact Framework this + appender will write to the system rather than + the Trace system. This appender will therefore behave like the . +
+
+ Douglas de la Torre + Nicko Cadell + Gert Driesen + Ron Grabowski +
+ + + Initializes a new instance of the . + + + + Default constructor. + + + + + + Initializes a new instance of the + with a specified layout. + + The layout to use with this appender. + + + Obsolete constructor. + + + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + + + + + + Immediate flush means that the underlying writer or output stream + will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logs events are not actually written to persistent media if and + when the application crashes. + + + The default value is true. + + + + + Defaults to %logger + + + + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + The category parameter sent to the Trace method. + + + + Defaults to %logger which will use the logger name of the current + as the category parameter. + + + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Assembly level attribute that specifies a domain to alias to this assembly's repository. + + + + AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. + + + An assembly's logger repository is defined by its , + however this can be overridden by an assembly loaded before the target assembly. + + + An assembly can alias another assembly's domain to its repository by + specifying this attribute with the name of the target domain. + + + This attribute can only be specified on the assembly and may be used + as many times as necessary to alias all the required domains. + + + Nicko Cadell + Gert Driesen + + + + Assembly level attribute that specifies a repository to alias to this assembly's repository. + + + + An assembly's logger repository is defined by its , + however this can be overridden by an assembly loaded before the target assembly. + + + An assembly can alias another assembly's repository to its repository by + specifying this attribute with the name of the target repository. + + + This attribute can only be specified on the assembly and may be used + as many times as necessary to alias all the required repositories. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class with + the specified repository to alias to this assembly's repository. + + The repository to alias to this assemby's repository. + + + Initializes a new instance of the class with + the specified repository to alias to this assembly's repository. + + + + + + Gets or sets the repository to alias to this assemby's repository. + + + The repository to alias to this assemby's repository. + + + + The name of the repository to alias to this assemby's repository. + + + + + + Initializes a new instance of the class with + the specified domain to alias to this assembly's repository. + + The domain to alias to this assemby's repository. + + + Obsolete. Use instead of . + + + + + + Use this class to quickly configure a . + + + + Allows very simple programmatic configuration of log4net. + + + Only one appender can be configured using this configurator. + The appender is set at the root of the hierarchy and all logging + events will be delivered to that appender. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + The fully qualified type of the BasicConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Initializes the log4net system with a default configuration. + + + + Initializes the log4net logging system using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the log4net system using the specified appender. + + The appender to use to log all logging events. + + + Initializes the log4net system using the specified appender. + + + + + + Initializes the log4net system using the specified appenders. + + The appenders to use to log all logging events. + + + Initializes the log4net system using the specified appenders. + + + + + + Initializes the with a default configuration. + + The repository to configure. + + + Initializes the specified repository using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the using the specified appender. + + The repository to configure. + The appender to use to log all logging events. + + + Initializes the using the specified appender. + + + + + + Initializes the using the specified appenders. + + The repository to configure. + The appenders to use to log all logging events. + + + Initializes the using the specified appender. + + + + + + Base class for all log4net configuration attributes. + + + This is an abstract class that must be extended by + specific configurators. This attribute allows the + configurator to be parameterized by an assembly level + attribute. + + Nicko Cadell + Gert Driesen + + + + Constructor used by subclasses. + + the ordering priority for this configurator + + + The is used to order the configurator + attributes before they are invoked. Higher priority configurators are executed + before lower priority ones. + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Abstract method implemented by a subclass. When this method is called + the subclass should configure the . + + + + + + Compare this instance to another ConfiguratorAttribute + + the object to compare to + see + + + Compares the priorities of the two instances. + Sorts by priority in descending order. Objects with the same priority are + randomly ordered. + + + + + + Assembly level attribute that specifies the logging domain for the assembly. + + + + DomainAttribute is obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + Assemblies are mapped to logging domains. Each domain has its own + logging repository. This attribute specified on the assembly controls + the configuration of the domain. The property specifies the name + of the domain that this assembly is a part of. The + specifies the type of the repository objects to create for the domain. If + this attribute is not specified and a is not specified + then the assembly will be part of the default shared logging domain. + + + This attribute can only be specified on the assembly and may only be used + once per assembly. + + + Nicko Cadell + Gert Driesen + + + + Assembly level attribute that specifies the logging repository for the assembly. + + + + Assemblies are mapped to logging repository. This attribute specified + on the assembly controls + the configuration of the repository. The property specifies the name + of the repository that this assembly is a part of. The + specifies the type of the object + to create for the assembly. If this attribute is not specified or a + is not specified then the assembly will be part of the default shared logging repository. + + + This attribute can only be specified on the assembly and may only be used + once per assembly. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initialize a new instance of the class + with the name of the repository. + + The name of the repository. + + + Initialize the attribute with the name for the assembly's repository. + + + + + + Gets or sets the name of the logging repository. + + + The string name to use as the name of the repository associated with this + assembly. + + + + This value does not have to be unique. Several assemblies can share the + same repository. They will share the logging configuration of the repository. + + + + + + Gets or sets the type of repository to create for this assembly. + + + The type of repository to create for this assembly. + + + + The type of the repository to create for the assembly. + The type must implement the + interface. + + + This will be the type of repository created when + the repository is created. If multiple assemblies reference the + same repository then the repository is only created once using the + of the first assembly to call into the + repository. + + + + + + Initializes a new instance of the class. + + + + Obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + + + + Initialize a new instance of the class + with the name of the domain. + + The name of the domain. + + + Obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + + + + Use this class to initialize the log4net environment using an Xml tree. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + Configures a using an Xml tree. + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + + + Automatically configures the log4net system based on the + application's configuration settings. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + + + Automatically configures the using settings + stored in the application's configuration file. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + The repository to configure. + + + + Configures log4net using a log4net element + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Loads the log4net configuration from the XML element + supplied as . + + The element to parse. + + + + Configures the using the specified XML + element. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Loads the log4net configuration from the XML element + supplied as . + + The repository to configure. + The element to parse. + + + + Configures log4net using the specified configuration file. + + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures log4net using the specified configuration file. + + A stream to load the XML configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The stream to load the XML configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures log4net using the file specified, monitors the file for changes + and reloads the configuration if a change is detected. + + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the using the file specified, + monitors the file for changes and reloads the configuration if a change + is detected. + + The repository to configure. + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Assembly level attribute to configure the . + + + + AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + Gert Driesen + + + + Assembly level attribute to configure the . + + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + If neither of the or + properties are set the configuration is loaded from the application's .config file. + If set the property takes priority over the + property. The property + specifies a path to a file to load the config from. The path is relative to the + application's base directory; . + The property is used as a postfix to the assembly file name. + The config file must be located in the application's base directory; . + For example in a console application setting the to + config has the same effect as not specifying the or + properties. + + + The property can be set to cause the + to watch the configuration file for changes. + + + + Log4net will only look for assembly level configuration attributes once. + When using the log4net assembly level attributes to control the configuration + of log4net you must ensure that the first call to any of the + methods is made from the assembly with the configuration + attributes. + + + If you cannot guarantee the order in which log4net calls will be made from + different assemblies you must use programmatic configuration instead, i.e. + call the method directly. + + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Configure the repository using the . + The specified must extend the + class otherwise the will not be able to + configure it. + + + The does not extend . + + + + Attempt to load configuration from the local file system + + The assembly that this attribute was defined on. + The repository to configure. + + + + Configure the specified repository using a + + The repository to configure. + the FileInfo pointing to the config file + + + + Attempt to load configuration from a URI + + The assembly that this attribute was defined on. + The repository to configure. + + + + The fully qualified type of the XmlConfiguratorAttribute class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the filename of the configuration file. + + + The filename of the configuration file. + + + + If specified, this is the name of the configuration file to use with + the . This file path is relative to the + application base directory (). + + + The takes priority over the . + + + + + + Gets or sets the extension of the configuration file. + + + The extension of the configuration file. + + + + If specified this is the extension for the configuration file. + The path to the config file is built by using the application + base directory (), + the assembly file name and the config file extension. + + + If the is set to MyExt then + possible config file names would be: MyConsoleApp.exe.MyExt or + MyClassLibrary.dll.MyExt. + + + The takes priority over the . + + + + + + Gets or sets a value indicating whether to watch the configuration file. + + + true if the configuration should be watched, false otherwise. + + + + If this flag is specified and set to true then the framework + will watch the configuration file and will reload the config each time + the file is modified. + + + The config file can only be watched if it is loaded from local disk. + In a No-Touch (Smart Client) deployment where the application is downloaded + from a web server the config file may not reside on the local disk + and therefore it may not be able to watch it. + + + Watching configuration is not supported on the SSCLI. + + + + + + Class to register for the log4net section of the configuration file + + + The log4net section of the configuration file needs to have a section + handler registered. This is the section handler used. It simply returns + the XML element that is the root of the section. + + + Example of registering the log4net section handler : + + + +
+ + + log4net configuration XML goes here + + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Parses the configuration section. + + The configuration settings in a corresponding parent configuration section. + The configuration context when called from the ASP.NET configuration system. Otherwise, this parameter is reserved and is a null reference. + The for the log4net section. + The for the log4net section. + + + Returns the containing the configuration data, + + + + + + Assembly level attribute that specifies a plugin to attach to + the repository. + + + + Specifies the type of a plugin to create and attach to the + assembly's repository. The plugin type must implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Interface used to create plugins. + + + + Interface used to create a plugin. + + + Nicko Cadell + Gert Driesen + + + + Creates the plugin object. + + the new plugin instance + + + Create and return a new plugin instance. + + + + + + Initializes a new instance of the class + with the specified type. + + The type name of plugin to create. + + + Create the attribute with the plugin type specified. + + + Where possible use the constructor that takes a . + + + + + + Initializes a new instance of the class + with the specified type. + + The type of plugin to create. + + + Create the attribute with the plugin type specified. + + + + + + Creates the plugin object defined by this attribute. + + + + Creates the instance of the object as + specified by this attribute. + + + The plugin object. + + + + Returns a representation of the properties of this object. + + + + Overrides base class method to + return a representation of the properties of this object. + + + A representation of the properties of this object + + + + Gets or sets the type for the plugin. + + + The type for the plugin. + + + + The type for the plugin. + + + + + + Gets or sets the type name for the plugin. + + + The type name for the plugin. + + + + The type name for the plugin. + + + Where possible use the property instead. + + + + + + Assembly level attribute to configure the . + + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + + + + Construct provider attribute with type specified + + the type of the provider to use + + + The provider specified must subclass the + class. + + + + + + Configures the SecurityContextProvider + + The assembly that this attribute was defined on. + The repository to configure. + + + Creates a provider instance from the specified. + Sets this as the default security context provider . + + + + + + The fully qualified type of the SecurityContextProviderAttribute class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the type of the provider to use. + + + the type of the provider to use. + + + + The provider specified must subclass the + class. + + + + + + Use this class to initialize the log4net environment using an Xml tree. + + + + Configures a using an Xml tree. + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + + + Automatically configures the log4net system based on the + application's configuration settings. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + + + + + Automatically configures the using settings + stored in the application's configuration file. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + The repository to configure. + + + + Configures log4net using a log4net element + + + + Loads the log4net configuration from the XML element + supplied as . + + + The element to parse. + + + + Configures the using the specified XML + element. + + + Loads the log4net configuration from the XML element + supplied as . + + The repository to configure. + The element to parse. + + + + Configures log4net using the specified configuration file. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
+ + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures log4net using the specified configuration URI. + + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The must support the URI scheme specified. + + + + + + Configures log4net using the specified configuration data stream. + + A stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
+ + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures the using the specified configuration + URI. + + The repository to configure. + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The must support the URI scheme specified. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures log4net using the file specified, monitors the file for changes + and reloads the configuration if a change is detected. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the using the file specified, + monitors the file for changes and reloads the configuration if a change + is detected. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the specified repository using a log4net element. + + The hierarchy to configure. + The element to parse. + + + Loads the log4net configuration from the XML element + supplied as . + + + This method is ultimately called by one of the Configure methods + to load the configuration from an . + + + + + + Maps repository names to ConfigAndWatchHandler instances to allow a particular + ConfigAndWatchHandler to dispose of its FileSystemWatcher when a repository is + reconfigured. + + + + + The fully qualified type of the XmlConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Class used to watch config files. + + + + Uses the to monitor + changes to a specified file. Because multiple change notifications + may be raised when the file is modified, a timer is used to + compress the notifications into a single event. The timer + waits for time before delivering + the event notification. If any further + change notifications arrive while the timer is waiting it + is reset and waits again for to + elapse. + + + + + + The default amount of time to wait after receiving notification + before reloading the config file. + + + + + Holds the FileInfo used to configure the XmlConfigurator + + + + + Holds the repository being configured. + + + + + The timer used to compress the notification events. + + + + + Watches file for changes. This object should be disposed when no longer + needed to free system handles on the watched resources. + + + + + Initializes a new instance of the class to + watch a specified config file used to configure a repository. + + The repository to configure. + The configuration file to watch. + + + Initializes a new instance of the class. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Called by the timer when the configuration has been updated. + + null + + + + Release the handles held by the watcher and timer. + + + + + The implementation of the interface suitable + for use with the compact framework + + + + This implementation is a simple + mapping between repository name and + object. + + + The .NET Compact Framework 1.0 does not support retrieving assembly + level attributes therefore unlike the DefaultRepositorySelector + this selector does not examine the calling assembly for attributes. + + + Nicko Cadell + + + + Interface used by the to select the . + + + + The uses a + to specify the policy for selecting the correct + to return to the caller. + + + Nicko Cadell + Gert Driesen + + + + Gets the for the specified assembly. + + The assembly to use to lookup to the + The for the assembly. + + + Gets the for the specified assembly. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. The results of this method must be repeatable, i.e. + when called again with the same arguments the result must be the + save value. + + + + + + Gets the named . + + The name to use to lookup to the . + The named + + Lookup a named . This is the repository created by + calling . + + + + + Creates a new repository for the assembly specified. + + The assembly to use to create the domain to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the domain + specified such that a call to with the + same assembly specified will return the same repository instance. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. + + + + + + Creates a new repository with the name specified. + + The name to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the name + specified such that a call to with the + same name will return the same repository instance. + + + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets an array of all currently defined repositories. + + + An array of the instances created by + this . + + + Gets an array of all of the repositories created by this selector. + + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Create a new repository selector + + the type of the repositories to create, must implement + + + Create an new compact repository selector. + The default type for repositories must be specified, + an appropriate value would be . + + + throw if is null + throw if does not implement + + + + Get the for the specified assembly + + not used + The default + + + The argument is not used. This selector does not create a + separate repository for each assembly. + + + As a named repository is not specified the default repository is + returned. The default repository is named log4net-default-repository. + + + + + + Get the named + + the name of the repository to lookup + The named + + + Get the named . The default + repository is log4net-default-repository. Other repositories + must be created using the . + If the named repository does not exist an exception is thrown. + + + throw if is null + throw if the does not exist + + + + Create a new repository for the assembly specified + + not used + the type of repository to create, must implement + the repository created + + + The argument is not used. This selector does not create a + separate repository for each assembly. + + + If the is null then the + default repository type specified to the constructor is used. + + + As a named repository is not specified the default repository is + returned. The default repository is named log4net-default-repository. + + + + + + Create a new repository for the repository specified + + the repository to associate with the + the type of repository to create, must implement . + If this param is null then the default repository type is used. + the repository created + + + The created will be associated with the repository + specified such that a call to with the + same repository specified will return the same repository instance. + + + If the named repository already exists an exception will be thrown. + + + If is null then the default + repository type specified to the constructor is used. + + + throw if is null + throw if the already exists + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets a list of objects + + an array of all known objects + + + Gets an array of all of the repositories created by this selector. + + + + + + The fully qualified type of the CompactRepositorySelector class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Notify the registered listeners that the repository has been created + + The repository that has been created + + + Raises the LoggerRepositoryCreatedEvent + event. + + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + The default implementation of the interface. + + + + Uses attributes defined on the calling assembly to determine how to + configure the hierarchy for the repository. + + + Nicko Cadell + Gert Driesen + + + + Creates a new repository selector. + + The type of the repositories to create, must implement + + + Create an new repository selector. + The default type for repositories must be specified, + an appropriate value would be . + + + is . + does not implement . + + + + Gets the for the specified assembly. + + The assembly use to lookup the . + + + The type of the created and the repository + to create can be overridden by specifying the + attribute on the . + + + The default values are to use the + implementation of the interface and to use the + as the name of the repository. + + + The created will be automatically configured using + any attributes defined on + the . + + + The for the assembly + is . + + + + Gets the for the specified repository. + + The repository to use to lookup the . + The for the specified repository. + + + Returns the named repository. If is null + a is thrown. If the repository + does not exist a is thrown. + + + Use to create a repository. + + + is . + does not exist. + + + + Create a new repository for the assembly specified + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the assembly specified. + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The name to assign to the created repository + Set to true to read and apply the assembly attributes + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the specified repository. + + The repository to associate with the . + The type of repository to create, must implement . + If this param is then the default repository type is used. + The new repository. + + + The created will be associated with the repository + specified such that a call to with the + same repository specified will return the same repository instance. + + + is . + already exists. + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets a list of objects + + an array of all known objects + + + Gets an array of all of the repositories created by this selector. + + + + + + Aliases a repository to an existing repository. + + The repository to alias. + The repository that the repository is aliased to. + + + The repository specified will be aliased to the repository when created. + The repository must not already exist. + + + When the repository is created it must utilize the same repository type as + the repository it is aliased to, otherwise the aliasing will fail. + + + + is . + -or- + is . + + + + + Notifies the registered listeners that the repository has been created. + + The repository that has been created. + + + Raises the event. + + + + + + Gets the repository name and repository type for the specified assembly. + + The assembly that has a . + in/out param to hold the repository name to use for the assembly, caller should set this to the default value before calling. + in/out param to hold the type of the repository to create for the assembly, caller should set this to the default value before calling. + is . + + + + Configures the repository using information from the assembly. + + The assembly containing + attributes which define the configuration for the repository. + The repository to configure. + + is . + -or- + is . + + + + + Loads the attribute defined plugins on the assembly. + + The assembly that contains the attributes. + The repository to add the plugins to. + + is . + -or- + is . + + + + + Loads the attribute defined aliases on the assembly. + + The assembly that contains the attributes. + The repository to alias to. + + is . + -or- + is . + + + + + The fully qualified type of the DefaultRepositorySelector class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Defined error codes that can be passed to the method. + + + + Values passed to the method. + + + Nicko Cadell + + + + A general error + + + + + Error while writing output + + + + + Failed to flush file + + + + + Failed to close file + + + + + Unable to open output file + + + + + No layout specified + + + + + Failed to parse address + + + + + An evaluator that triggers on an Exception type + + + + This evaluator will trigger if the type of the Exception + passed to + is equal to a Type in . /// + + + Drew Schaeffer + + + + Test if an triggers an action + + + + Implementations of this interface allow certain appenders to decide + when to perform an appender specific action. + + + The action or behavior triggered is defined by the implementation. + + + Nicko Cadell + + + + Test if this event triggers the action + + The event to check + true if this event triggers the action, otherwise false + + + Return true if this event triggers the action + + + + + + The type that causes the trigger to fire. + + + + + Causes subclasses of to cause the trigger to fire. + + + + + Default ctor to allow dynamic creation through a configurator. + + + + + Constructs an evaluator and initializes to trigger on + + the type that triggers this evaluator. + If true, this evaluator will trigger on subclasses of . + + + + Is this the triggering event? + + The event to check + This method returns true, if the logging event Exception + Type is . + Otherwise it returns false + + + This evaluator will trigger if the Exception Type of the event + passed to + is . + + + + + + The type that triggers this evaluator. + + + + + If true, this evaluator will trigger on subclasses of . + + + + + Appenders may delegate their error handling to an . + + + + Error handling is a particularly tedious to get right because by + definition errors are hard to predict and to reproduce. + + + Nicko Cadell + Gert Driesen + + + + Handles the error and information about the error condition is passed as + a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + The error code associated with the error. + + + Handles the error and information about the error condition is passed as + a parameter. + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + + + See . + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + + + See . + + + + + + Interface for objects that require fixing. + + + + Interface that indicates that the object requires fixing before it + can be taken outside the context of the appender's + method. + + + When objects that implement this interface are stored + in the context properties maps + and + are fixed + (see ) the + method will be called. + + + Nicko Cadell + + + + Get a portable version of this object + + the portable instance of this object + + + Get a portable instance object that represents the current + state of this object. The portable object can be stored + and logged from any thread with identical results. + + + + + + Interface that all loggers implement + + + + This interface supports logging events and testing if a level + is enabled for logging. + + + These methods will not throw exceptions. Note to implementor, ensure + that the implementation of these methods cannot allow an exception + to be thrown to the caller. + + + Nicko Cadell + Gert Driesen + + + + This generic form is intended to be used by wrappers. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + the exception to log, including its stack trace. Pass null to not log an exception. + + + Generates a logging event for the specified using + the and . + + + + + + This is the most generic printing method that is intended to be used + by wrappers. + + The event being logged. + + + Logs the specified logging event through this logger. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + true if this logger is enabled for level, otherwise false. + + + + Test if this logger is going to log events of the specified . + + + + + + Gets the name of the logger. + + + The name of the logger. + + + + The name of this logger + + + + + + Gets the where this + Logger instance is attached to. + + + The that this logger belongs to. + + + + Gets the where this + Logger instance is attached to. + + + + + + Base interface for all wrappers + + + + Base interface for all wrappers. + + + All wrappers must implement this interface. + + + Nicko Cadell + + + + Get the implementation behind this wrapper object. + + + The object that in implementing this object. + + + + The object that in implementing this + object. The Logger object may not + be the same object as this object because of logger decorators. + This gets the actual underlying objects that is used to process + the log events. + + + + + + Delegate used to handle logger repository creation event notifications + + The which created the repository. + The event args + that holds the instance that has been created. + + + Delegate used to handle logger repository creation event notifications. + + + + + + Provides data for the event. + + + + A + event is raised every time a is created. + + + + + + The created + + + + + Construct instance using specified + + the that has been created + + + Construct instance using specified + + + + + + The that has been created + + + The that has been created + + + + The that has been created + + + + + + Defines the default set of levels recognized by the system. + + + + Each has an associated . + + + Levels have a numeric that defines the relative + ordering between levels. Two Levels with the same + are deemed to be equivalent. + + + The levels that are recognized by log4net are set for each + and each repository can have different levels defined. The levels are stored + in the on the repository. Levels are + looked up by name from the . + + + When logging at level INFO the actual level used is not but + the value of LoggerRepository.LevelMap["INFO"]. The default value for this is + , but this can be changed by reconfiguring the level map. + + + Each level has a in addition to its . The + is the string that is written into the output log. By default + the display name is the same as the level name, but this can be used to alias levels + or to localize the log output. + + + Some of the predefined levels recognized by the system are: + + + + . + + + . + + + . + + + . + + + . + + + . + + + . + + + + Nicko Cadell + Gert Driesen + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + The display name for this level. This may be localized or otherwise different from the name + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Returns the representation of the current + . + + + A representation of the current . + + + + Returns the level . + + + + + + Compares levels. + + The object to compare against. + true if the objects are equal. + + + Compares the levels of instances, and + defers to base class if the target object is not a + instance. + + + + + + Returns a hash code + + A hash code for the current . + + + Returns a hash code suitable for use in hashing algorithms and data + structures like a hash table. + + + Returns the hash code of the level . + + + + + + Compares this instance to a specified object and returns an + indication of their relative values. + + A instance or to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the + values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + This instance is less than . + + + Zero + This instance is equal to . + + + Greater than zero + + This instance is greater than . + -or- + is . + + + + + + + must be an instance of + or ; otherwise, an exception is thrown. + + + is not a . + + + + Returns a value indicating whether a specified + is greater than another specified . + + A + A + + true if is greater than + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is less than another specified . + + A + A + + true if is less than + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is greater than or equal to another specified . + + A + A + + true if is greater than or equal to + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is less than or equal to another specified . + + A + A + + true if is less than or equal to + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether two specified + objects have the same value. + + A or . + A or . + + true if the value of is the same as the + value of ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether two specified + objects have different values. + + A or . + A or . + + true if the value of is different from + the value of ; otherwise, false. + + + + Compares two levels. + + + + + + Compares two specified instances. + + The first to compare. + The second to compare. + + A 32-bit signed integer that indicates the relative order of the + two values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + is less than . + + + Zero + is equal to . + + + Greater than zero + is greater than . + + + + + + Compares two levels. + + + + + + The level designates a higher level than all the rest. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events + that will presumably lead the application to abort. + + + + + The level designates very severe error events. + Take immediate action, alerts. + + + + + The level designates very severe error events. + Critical condition, critical. + + + + + The level designates very severe error events. + + + + + The level designates error events that might + still allow the application to continue running. + + + + + The level designates potentially harmful + situations. + + + + + The level designates informational messages + that highlight the progress of the application at the highest level. + + + + + The level designates informational messages that + highlight the progress of the application at coarse-grained level. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates the lowest level possible. + + + + + Gets the name of this level. + + + The name of this level. + + + + Gets the name of this level. + + + + + + Gets the value of this level. + + + The value of this level. + + + + Gets the value of this level. + + + + + + Gets the display name of this level. + + + The display name of this level. + + + + Gets the display name of this level. + + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Creates a read-only wrapper for a LevelCollection instance. + + list to create a readonly wrapper arround + + A LevelCollection wrapper that is read-only. + + + + + Initializes a new instance of the LevelCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the LevelCollection class + that has the specified initial capacity. + + + The number of elements that the new LevelCollection is initially capable of storing. + + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified LevelCollection. + + The LevelCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Allow subclasses to avoid our default constructors + + + + + + Copies the entire LevelCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire LevelCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Adds a to the end of the LevelCollection. + + The to be added to the end of the LevelCollection. + The index at which the value has been added. + + + + Removes all elements from the LevelCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the LevelCollection. + + The to check for. + true if is found in the LevelCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the LevelCollection. + + The to locate in the LevelCollection. + + The zero-based index of the first occurrence of + in the entire LevelCollection, if found; otherwise, -1. + + + + + Inserts an element into the LevelCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the LevelCollection. + + The to remove from the LevelCollection. + + The specified was not found in the LevelCollection. + + + + + Removes the element at the specified index of the LevelCollection. + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Returns an enumerator that can iterate through the LevelCollection. + + An for the entire LevelCollection. + + + + Adds the elements of another LevelCollection to the current LevelCollection. + + The LevelCollection whose elements should be added to the end of the current LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a array to the current LevelCollection. + + The array whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a collection to the current LevelCollection. + + The collection whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero + -or- + is equal to or greater than . + + + + + is less than zero + -or- + is equal to or greater than . + + + + + Gets the number of elements actually contained in the LevelCollection. + + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + true if access to the ICollection is synchronized (thread-safe); otherwise, false. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Gets or sets the number of elements the LevelCollection can contain. + + + + + Supports type-safe iteration over a . + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Gets the current element in the collection. + + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + A value + + + + + Supports simple iteration over a . + + + + + Initializes a new instance of the Enumerator class. + + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Gets the current element in the collection. + + + + + An evaluator that triggers at a threshold level + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + Nicko Cadell + + + + The threshold for triggering + + + + + Create a new evaluator using the threshold. + + + + Create a new evaluator using the threshold. + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Create a new evaluator using the specified threshold. + + the threshold to trigger at + + + Create a new evaluator using the specified threshold. + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the event level + is equal or higher than the . + Otherwise it returns false + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + the threshold to trigger at + + + The that will cause this evaluator to trigger + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Mapping between string name and Level object + + + + Mapping between string name and object. + This mapping is held separately for each . + The level name is case insensitive. + + + Nicko Cadell + + + + Mapping from level name to Level object. The + level name is case insensitive + + + + + Construct the level map + + + + Construct the level map. + + + + + + Clear the internal maps of all levels + + + + Clear the internal maps of all levels + + + + + + Create a new Level and add it to the map + + the string to display for the Level + the level value to give to the Level + + + Create a new Level and add it to the map + + + + + + + Create a new Level and add it to the map + + the string to display for the Level + the level value to give to the Level + the display name to give to the Level + + + Create a new Level and add it to the map + + + + + + Add a Level to the map + + the Level to add + + + Add a Level to the map + + + + + + Lookup a named level from the map + + the name of the level to lookup is taken from this level. + If the level is not set on the map then this level is added + the level in the map with the name specified + + + Lookup a named level from the map. The name of the level to lookup is taken + from the property of the + argument. + + + If no level with the specified name is found then the + argument is added to the level map + and returned. + + + + + + Lookup a by name + + The name of the Level to lookup + a Level from the map with the name specified + + + Returns the from the + map with the name specified. If the no level is + found then null is returned. + + + + + + Return all possible levels as a list of Level objects. + + all possible levels as a list of Level objects + + + Return all possible levels as a list of Level objects. + + + + + + The internal representation of caller location information. + + + + This class uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. + + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + Nicko Cadell + Gert Driesen + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + Constructor + + The declaring type of the method that is + the stack boundary into the logging system for this call. + + + Initializes a new instance of the + class based on the current thread. + + + + + + Constructor + + The fully qualified class name. + The method name. + The file name. + The line number of the method within the file. + + + Initializes a new instance of the + class with the specified data. + + + + + + The fully qualified type of the LocationInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + The fully qualified class name of the caller making the logging + request. + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + + Gets the file name of the caller. + + + The file name of the caller. + + + + Gets the file name of the caller. + + + + + + Gets the line number of the caller. + + + The line number of the caller. + + + + Gets the line number of the caller. + + + + + + Gets the method name of the caller. + + + The method name of the caller. + + + + Gets the method name of the caller. + + + + + + Gets all available caller information + + + All available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + Gets all available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + + Gets the stack frames from the stack trace of the caller making the log request + + + + + Static manager that controls the creation of repositories + + + + Static manager that controls the creation of repositories + + + This class is used by the wrapper managers (e.g. ) + to provide access to the objects. + + + This manager also holds the that is used to + lookup and create repositories. The selector can be set either programmatically using + the property, or by setting the log4net.RepositorySelector + AppSetting in the applications config file to the fully qualified type name of the + selector to use. + + + Nicko Cadell + Gert Driesen + + + + Private constructor to prevent instances. Only static methods should be used. + + + + Private constructor to prevent instances. Only static methods should be used. + + + + + + Hook the shutdown event + + + + On the full .NET runtime, the static constructor hooks up the + AppDomain.ProcessExit and AppDomain.DomainUnload> events. + These are used to shutdown the log4net system as the application exits. + + + + + + Register for ProcessExit and DomainUnload events on the AppDomain + + + + This needs to be in a separate method because the events make + a LinkDemand for the ControlAppDomain SecurityPermission. Because + this is a LinkDemand it is demanded at JIT time. Therefore we cannot + catch the exception in the method itself, we have to catch it in the + caller. + + + + + + Return the default instance. + + the repository to lookup in + Return the default instance + + + Gets the for the repository specified + by the argument. + + + + + + Returns the default instance. + + The assembly to use to lookup the repository. + The default instance. + + + + Return the default instance. + + the repository to lookup in + Return the default instance + + + Gets the for the repository specified + by the argument. + + + + + + Returns the default instance. + + The assembly to use to lookup the repository. + The default instance. + + + Returns the default instance. + + + + + + Returns the named logger if it exists. + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified repository. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns the named logger if it exists. + + The assembly to use to lookup the repository. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified assembly's repository. + + + + If the named logger exists (in the specified assembly's repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to lookup the repository. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Retrieves or creates a named logger. + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Retrieves or creates a named logger. + + The assembly to use to lookup the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Shorthand for . + + The repository to lookup in. + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shorthand for . + + the assembly to use to lookup the repository + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The repository to shutdown. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The assembly to use to lookup the repository. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Resets all values contained in this repository instance to their defaults. + + The repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + The assembly to use to lookup the repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Creates a repository with the specified name. + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name. + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The name must be unique. Repositories cannot be redefined. + An Exception will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The name must be unique. Repositories cannot be redefined. + An Exception will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + + + + Creates a repository for the specified assembly and repository type. + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + + + + Gets an array of all currently defined repositories. + + An array of all the known objects. + + + Gets an array of all currently defined repositories. + + + + + + Internal method to get pertinent version info. + + A string of version info. + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + The fully qualified type of the LoggerManager class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initialize the default repository selector + + + + + Gets or sets the repository selector used by the . + + + The repository selector used by the . + + + + The repository selector () is used by + the to create and select repositories + (). + + + The caller to supplies either a string name + or an assembly (if not supplied the assembly is inferred using + ). + + + This context is used by the selector to lookup a specific repository. + + + For the full .NET Framework, the default repository is DefaultRepositorySelector; + for the .NET Compact Framework CompactRepositorySelector is the default + repository. + + + + + + Implementation of the interface. + + + + This class should be used as the base for all wrapper implementations. + + + Nicko Cadell + Gert Driesen + + + + Constructs a new wrapper for the specified logger. + + The logger to wrap. + + + Constructs a new wrapper for the specified logger. + + + + + + The logger that this object is wrapping + + + + + Gets the implementation behind this wrapper object. + + + The object that this object is implementing. + + + + The Logger object may not be the same object as this object + because of logger decorators. + + + This gets the actual underlying objects that is used to process + the log events. + + + + + + Portable data structure used by + + + + Portable data structure used by + + + Nicko Cadell + + + + The logger name. + + + + The logger name. + + + + + + Level of logging event. + + + + Level of logging event. Level cannot be Serializable + because it is a flyweight. Due to its special serialization it + cannot be declared final either. + + + + + + The application supplied message. + + + + The application supplied message of logging event. + + + + + + The name of thread + + + + The name of thread in which this logging event was generated + + + + + + The time the event was logged + + + + The TimeStamp is stored in the local time zone for this computer. + + + + + + Location information for the caller. + + + + Location information for the caller. + + + + + + String representation of the user + + + + String representation of the user's windows name, + like DOMAIN\username + + + + + + String representation of the identity. + + + + String representation of the current thread's principal identity. + + + + + + The string representation of the exception + + + + The string representation of the exception + + + + + + String representation of the AppDomain. + + + + String representation of the AppDomain. + + + + + + Additional event specific properties + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + + + + Flags passed to the property + + + + Flags passed to the property + + + Nicko Cadell + + + + Fix the MDC + + + + + Fix the NDC + + + + + Fix the rendered message + + + + + Fix the thread name + + + + + Fix the callers location information + + + CAUTION: Very slow to generate + + + + + Fix the callers windows user name + + + CAUTION: Slow to generate + + + + + Fix the domain friendly name + + + + + Fix the callers principal name + + + CAUTION: May be slow to generate + + + + + Fix the exception text + + + + + Fix the event properties. Active properties must implement in order to be eligible for fixing. + + + + + No fields fixed + + + + + All fields fixed + + + + + Partial fields fixed + + + + This set of partial fields gives good performance. The following fields are fixed: + + + + + + + + + + + + + The internal representation of logging events. + + + + When an affirmative decision is made to log then a + instance is created. This instance + is passed around to the different log4net components. + + + This class is of concern to those wishing to extend log4net. + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + for incurred by calling but it + is essential to maintaining data consistency. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino + + + + The key into the Properties map for the host name value. + + + + + The key into the Properties map for the thread identity value. + + + + + The key into the Properties map for the user name value. + + + + + Initializes a new instance of the class + from the supplied parameters. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + The name of the logger of this event. + The level of this event. + The message of this event. + The exception for this event. + + + Except , and , + all fields of LoggingEvent are filled when actually needed. Call + to cache all data locally + to prevent inconsistencies. + + This method is called by the log4net framework + to create a logging event. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + The fields in the struct that have already been fixed. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + The parameter should be used to specify which fields in the + struct have been preset. Fields not specified in the + will be captured from the environment if requested or fixed. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Initializes a new instance of the class + using specific data. + + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Serialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Ensure that the repository is set. + + the value for the repository + + + + Write the rendered message to a TextWriter + + the writer to write the message to + + + Unlike the property this method + does store the message data in the internal cache. Therefore + if called only once this method should be faster than the + property, however if the message is + to be accessed multiple times then the property will be more efficient. + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + The data in this event must be fixed before it can be serialized. + + + The method must be called during the + method call if this event + is to be used outside that method. + + + + + + Gets the portable data for this . + + The for this event. + + + A new can be constructed using a + instance. + + + Does a fix of the data + in the logging event before returning the event data. + + + + + + Gets the portable data for this . + + The set of data to ensure is fixed in the LoggingEventData + The for this event. + + + A new can be constructed using a + instance. + + + + + + Returns this event's exception's rendered using the + . + + + This event's exception's rendered using the . + + + + Obsolete. Use instead. + + + + + + Returns this event's exception's rendered using the + . + + + This event's exception's rendered using the . + + + + Returns this event's exception's rendered using the + . + + + + + + Fix instance fields that hold volatile data. + + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + incurred by calling but it + is essential to maintaining data consistency. + + + Calling is equivalent to + calling passing the parameter + false. + + + See for more + information. + + + + + + Fixes instance fields that hold volatile data. + + Set to true to not fix data that takes a long time to fix. + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + for incurred by calling but it + is essential to maintaining data consistency. + + + The param controls the data that + is fixed. Some of the data that can be fixed takes a long time to + generate, therefore if you do not require those settings to be fixed + they can be ignored by setting the param + to true. This setting will ignore the + and settings. + + + Set to false to ensure that all + settings are fixed. + + + + + + Fix the fields specified by the parameter + + the fields to fix + + + Only fields specified in the will be fixed. + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Lookup a composite property in this event + + the key for the property to lookup + the value for the property + + + This event has composite properties that combine together properties from + several different contexts in the following order: + + + this events properties + + This event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + + Get all the composite properties in this event + + the containing all the properties + + + See for details of the composite properties + stored by the event. + + + This method returns a single containing all the + properties defined for this event. + + + + + + The internal logging event data. + + + + + The internal logging event data. + + + + + The internal logging event data. + + + + + The fully qualified Type of the calling + logger class in the stack frame (i.e. the declaring type of the method). + + + + + The application supplied message of logging event. + + + + + The exception that was thrown. + + + This is not serialized. The string representation + is serialized instead. + + + + + The repository that generated the logging event + + + This is not serialized. + + + + + The fix state for this event + + + These flags indicate which fields have been fixed. + Not serialized. + + + + + Indicated that the internal cache is updateable (ie not fixed) + + + This is a seperate flag to m_fixFlags as it allows incrementel fixing and simpler + changes in the caching strategy. + + + + + Gets the time when the current process started. + + + This is the time when this process started. + + + + The TimeStamp is stored in the local time zone for this computer. + + + Tries to get the start time for the current process. + Failing that it returns the time of the first call to + this property. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating and therefore + without the process start time being reset. + + + + + + Gets the of the logging event. + + + The of the logging event. + + + + Gets the of the logging event. + + + + + + Gets the time of the logging event. + + + The time of the logging event. + + + + The TimeStamp is stored in the local time zone for this computer. + + + + + + Gets the name of the logger that logged the event. + + + The name of the logger that logged the event. + + + + Gets the name of the logger that logged the event. + + + + + + Gets the location information for this logging event. + + + The location information for this logging event. + + + + The collected information is cached for future use. + + + See the class for more information on + supported frameworks and the different behavior in Debug and + Release builds. + + + + + + Gets the message object used to initialize this event. + + + The message object used to initialize this event. + + + + Gets the message object used to initialize this event. + Note that this event may not have a valid message object. + If the event is serialized the message object will not + be transferred. To get the text of the message the + property must be used + not this property. + + + If there is no defined message object for this event then + null will be returned. + + + + + + Gets the exception object used to initialize this event. + + + The exception object used to initialize this event. + + + + Gets the exception object used to initialize this event. + Note that this event may not have a valid exception object. + If the event is serialized the exception object will not + be transferred. To get the text of the exception the + method must be used + not this property. + + + If there is no defined exception object for this event then + null will be returned. + + + + + + The that this event was created in. + + + + The that this event was created in. + + + + + + Gets the message, rendered through the . + + + The message rendered through the . + + + + The collected information is cached for future use. + + + + + + Gets the name of the current thread. + + + The name of the current thread, or the thread ID when + the name is not available. + + + + The collected information is cached for future use. + + + + + + Gets the name of the current user. + + + The name of the current user, or NOT AVAILABLE when the + underlying runtime has no support for retrieving the name of the + current user. + + + + Calls WindowsIdentity.GetCurrent().Name to get the name of + the current windows user. + + + To improve performance, we could cache the string representation of + the name, and reuse that as long as the identity stayed constant. + Once the identity changed, we would need to re-assign and re-render + the string. + + + However, the WindowsIdentity.GetCurrent() call seems to + return different objects every time, so the current implementation + doesn't do this type of caching. + + + Timing for these operations: + + + + Method + Results + + + WindowsIdentity.GetCurrent() + 10000 loops, 00:00:00.2031250 seconds + + + WindowsIdentity.GetCurrent().Name + 10000 loops, 00:00:08.0468750 seconds + + + + This means we could speed things up almost 40 times by caching the + value of the WindowsIdentity.GetCurrent().Name property, since + this takes (8.04-0.20) = 7.84375 seconds. + + + + + + Gets the identity of the current thread principal. + + + The string name of the identity of the current thread principal. + + + + Calls System.Threading.Thread.CurrentPrincipal.Identity.Name to get + the name of the current thread principal. + + + + + + Gets the AppDomain friendly name. + + + The AppDomain friendly name. + + + + Gets the AppDomain friendly name. + + + + + + Additional event specific properties. + + + Additional event specific properties. + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + This property is for events that have been added directly to + this event. The aggregate properties (which include these + event properties) can be retrieved using + and . + + + Once the properties have been fixed this property + returns the combined cached properties. This ensures that updates to + this property are always reflected in the underlying storage. When + returning the combined properties there may be more keys in the + Dictionary than expected. + + + + + + The fixed fields in this event + + + The set of fields that are fixed in this event + + + + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Implementation of wrapper interface. + + + + This implementation of the interface + forwards to the held by the base class. + + + This logger has methods to allow the caller to log at the following + levels: + + + + DEBUG + + The and methods log messages + at the DEBUG level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + INFO + + The and methods log messages + at the INFO level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + WARN + + The and methods log messages + at the WARN level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + ERROR + + The and methods log messages + at the ERROR level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + FATAL + + The and methods log messages + at the FATAL level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + + The values for these levels and their semantic meanings can be changed by + configuring the for the repository. + + + Nicko Cadell + Gert Driesen + + + + The ILog interface is use by application to log messages into + the log4net framework. + + + + Use the to obtain logger instances + that implement this interface. The + static method is used to get logger instances. + + + This class contains methods for logging at different levels and also + has properties for determining if those logging levels are + enabled in the current configuration. + + + This interface can be implemented in different ways. This documentation + specifies reasonable behavior that a caller can expect from the actual + implementation, however different implementations reserve the right to + do things differently. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + Log a message object with the level. + + Log a message object with the level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Logs a message object with the INFO level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + For some ILog interface log, when you write: + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, string construction and concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed (who isn't), then you should write: + + + if (log.IsDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in and once in + the . This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. This is the preferred style of logging. + + Alternatively if your logger is available statically then the is debug + enabled state can be stored in a static variable like this: + + + private static readonly bool isDebugEnabled = log.IsDebugEnabled; + + + Then when you come to log you can write: + + + if (isDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way the debug enabled state is only queried once + when the class is loaded. Using a private static readonly + variable is the most efficient because it is a run time constant + and can be heavily optimized by the JIT compiler. + + + Of course if you use a static readonly variable to + hold the enabled state of the logger then you cannot + change the enabled state at runtime to vary the logging + that is produced. You have to decide if you need absolute + speed or runtime flexibility. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Construct a new wrapper for the specified logger. + + The logger to wrap. + + + Construct a new wrapper for the specified logger. + + + + + + Virtual method called when the configuration of the repository changes + + the repository holding the levels + + + Virtual method called when the configuration of the repository changes + + + + + + Logs a message object with the DEBUG level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + DEBUG level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the DEBUG level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the DEBUG level including + the stack trace of the passed + as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + INFO level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the INFO level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the WARN level. + + the message object to log + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + WARN level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the WARN level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the WARN level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the ERROR level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + ERROR level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the ERROR level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the ERROR level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the FATAL level. + + The message object to log. + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + FATAL level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the FATAL level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the FATAL level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Event handler for the event + + the repository + Empty + + + + The fully qualified name of this declaring type not the type of any subclass. + + + + + Checks if this logger is enabled for the DEBUG + level. + + + true if this logger is enabled for DEBUG events, + false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + + For some log Logger object, when you write: + + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed, then you should write: + + + if (log.IsDebugEnabled()) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in IsDebugEnabled and once in + the Debug. This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. + + + + + + Checks if this logger is enabled for the INFO level. + + + true if this logger is enabled for INFO events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the WARN level. + + + true if this logger is enabled for WARN events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the ERROR level. + + + true if this logger is enabled for ERROR events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + Checks if this logger is enabled for the FATAL level. + + + true if this logger is enabled for FATAL events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + provides method information without actually referencing a System.Reflection.MethodBase + as that would require that the containing assembly is loaded. + + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + constructs a method item for an unknown method. + + + + + constructs a method item from the name of the method. + + + + + + constructs a method item from the name of the method and its parameters. + + + + + + + constructs a method item from a method base by determining the method name and its parameters. + + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets the method name of the caller making the logging + request. + + + The method name of the caller making the logging + request. + + + + Gets the method name of the caller making the logging + request. + + + + + + Gets the method parameters of the caller making + the logging request. + + + The method parameters of the caller making + the logging request + + + + Gets the method parameters of the caller making + the logging request. + + + + + + A SecurityContext used by log4net when interacting with protected resources + + + + A SecurityContext used by log4net when interacting with protected resources + for example with operating system services. This can be used to impersonate + a principal that has been granted privileges on the system resources. + + + Nicko Cadell + + + + Impersonate this SecurityContext + + State supplied by the caller + An instance that will + revoke the impersonation of this SecurityContext, or null + + + Impersonate this security context. Further calls on the current + thread should now be made in the security context provided + by this object. When the result + method is called the security + context of the thread should be reverted to the state it was in + before was called. + + + + + + The providers default instances. + + + + A configured component that interacts with potentially protected system + resources uses a to provide the elevated + privileges required. If the object has + been not been explicitly provided to the component then the component + will request one from this . + + + By default the is + an instance of which returns only + objects. This is a reasonable default + where the privileges required are not know by the system. + + + This default behavior can be overridden by subclassing the + and overriding the method to return + the desired objects. The default provider + can be replaced by programmatically setting the value of the + property. + + + An alternative is to use the log4net.Config.SecurityContextProviderAttribute + This attribute can be applied to an assembly in the same way as the + log4net.Config.XmlConfiguratorAttribute". The attribute takes + the type to use as the as an argument. + + + Nicko Cadell + + + + The default provider + + + + + Protected default constructor to allow subclassing + + + + Protected default constructor to allow subclassing + + + + + + Create a SecurityContext for a consumer + + The consumer requesting the SecurityContext + An impersonation context + + + The default implementation is to return a . + + + Subclasses should override this method to provide their own + behavior. + + + + + + Gets or sets the default SecurityContextProvider + + + The default SecurityContextProvider + + + + The default provider is used by configured components that + require a and have not had one + given to them. + + + By default this is an instance of + that returns objects. + + + The default provider can be set programmatically by setting + the value of this property to a sub class of + that has the desired behavior. + + + + + + provides stack frame information without actually referencing a System.Diagnostics.StackFrame + as that would require that the containing assembly is loaded. + + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + returns a stack frame item from a stack frame. This + + + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + The fully qualified class name of the caller making the logging + request. + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + + Gets the file name of the caller. + + + The file name of the caller. + + + + Gets the file name of the caller. + + + + + + Gets the line number of the caller. + + + The line number of the caller. + + + + Gets the line number of the caller. + + + + + + Gets the method name of the caller. + + + The method name of the caller. + + + + Gets the method name of the caller. + + + + + + Gets all available caller information + + + All available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + Gets all available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + + An evaluator that triggers after specified number of seconds. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + Robert Sevcik + + + + The default time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + The time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + The time of last check. This gets updated when the object is created and when the evaluator triggers. + + + + + Create a new evaluator using the time threshold in seconds. + + + + Create a new evaluator using the time threshold in seconds. + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Create a new evaluator using the specified time threshold in seconds. + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + Create a new evaluator using the specified time threshold in seconds. + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the specified time period + has passed since last check.. + Otherwise it returns false + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + The time threshold in seconds to trigger after + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Delegate used to handle creation of new wrappers. + + The logger to wrap in a wrapper. + + + Delegate used to handle creation of new wrappers. This delegate + is called from the + method to construct the wrapper for the specified logger. + + + The delegate to use is supplied to the + constructor. + + + + + + Maps between logger objects and wrapper objects. + + + + This class maintains a mapping between objects and + objects. Use the method to + lookup the for the specified . + + + New wrapper instances are created by the + method. The default behavior is for this method to delegate construction + of the wrapper to the delegate supplied + to the constructor. This allows specialization of the behavior without + requiring subclassing of this type. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the + + The handler to use to create the wrapper objects. + + + Initializes a new instance of the class with + the specified handler to create the wrapper objects. + + + + + + Gets the wrapper object for the specified logger. + + The wrapper object for the specified logger + + + If the logger is null then the corresponding wrapper is null. + + + Looks up the wrapper it it has previously been requested and + returns it. If the wrapper has never been requested before then + the virtual method is + called. + + + + + + Creates the wrapper object for the specified logger. + + The logger to wrap in a wrapper. + The wrapper object for the logger. + + + This implementation uses the + passed to the constructor to create the wrapper. This method + can be overridden in a subclass. + + + + + + Called when a monitored repository shutdown event is received. + + The that is shutting down + + + This method is called when a that this + is holding loggers for has signaled its shutdown + event . The default + behavior of this method is to release the references to the loggers + and their wrappers generated for this repository. + + + + + + Event handler for repository shutdown event. + + The sender of the event. + The event args. + + + + Map of logger repositories to hashtables of ILogger to ILoggerWrapper mappings + + + + + The handler to use to create the extension wrapper objects. + + + + + Internal reference to the delegate used to register for repository shutdown events. + + + + + Gets the map of logger repositories. + + + Map of logger repositories. + + + + Gets the hashtable that is keyed on . The + values are hashtables keyed on with the + value being the corresponding . + + + + + + Formats a as "HH:mm:ss,fff". + + + + Formats a in the format "HH:mm:ss,fff" for example, "15:49:37,459". + + + Nicko Cadell + Gert Driesen + + + + Render a as a string. + + + + Interface to abstract the rendering of a + instance into a string. + + + The method is used to render the + date to a text writer. + + + Nicko Cadell + Gert Driesen + + + + Formats the specified date as a string. + + The date to format. + The writer to write to. + + + Format the as a string and write it + to the provided. + + + + + + String constant used to specify AbsoluteTimeDateFormat in layouts. Current value is ABSOLUTE. + + + + + String constant used to specify DateTimeDateFormat in layouts. Current value is DATE. + + + + + String constant used to specify ISO8601DateFormat in layouts. Current value is ISO8601. + + + + + Renders the date into a string. Format is "HH:mm:ss". + + The date to render into a string. + The string builder to write to. + + + Subclasses should override this method to render the date + into a string using a precision up to the second. This method + will be called at most once per second and the result will be + reused if it is needed again during the same second. + + + + + + Renders the date into a string. Format is "HH:mm:ss,fff". + + The date to render into a string. + The writer to write to. + + + Uses the method to generate the + time string up to the seconds and then appends the current + milliseconds. The results from are + cached and is called at most once + per second. + + + Sub classes should override + rather than . + + + + + + Last stored time with precision up to the second. + + + + + Last stored time with precision up to the second, formatted + as a string. + + + + + Last stored time with precision up to the second, formatted + as a string. + + + + + Formats a as "dd MMM yyyy HH:mm:ss,fff" + + + + Formats a in the format + "dd MMM yyyy HH:mm:ss,fff" for example, + "06 Nov 1994 15:49:37,459". + + + Nicko Cadell + Gert Driesen + Angelika Schnagl + + + + Default constructor. + + + + Initializes a new instance of the class. + + + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats a DateTime in the format "dd MMM yyyy HH:mm:ss" + for example, "06 Nov 1994 15:49:37". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + The format info for the invariant culture. + + + + + Formats the as "yyyy-MM-dd HH:mm:ss,fff". + + + + Formats the specified as a string: "yyyy-MM-dd HH:mm:ss,fff". + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats the date specified as a string: "yyyy-MM-dd HH:mm:ss". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + Formats the using the method. + + + + Formats the using the method. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The format string. + + + Initializes a new instance of the class + with the specified format string. + + + The format string must be compatible with the options + that can be supplied to . + + + + + + Formats the date using . + + The date to convert to a string. + The writer to write to. + + + Uses the date format string supplied to the constructor to call + the method to format the date. + + + + + + The format string used to format the . + + + + The format string must be compatible with the options + that can be supplied to . + + + + + + This filter drops all . + + + + You can add this filter to the end of a filter chain to + switch from the default "accept all unless instructed otherwise" + filtering behavior to a "deny all unless instructed otherwise" + behavior. + + + Nicko Cadell + Gert Driesen + + + + Subclass this type to implement customized logging event filtering + + + + Users should extend this class to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Implement this interface to provide customized logging event filtering + + + + Users should implement this interface to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Decide if the logging event should be logged through an appender. + + The LoggingEvent to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + + + + Property to get and set the next filter + + + The next filter in the chain + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + Points to the next filter in the filter chain. + + + + See for more information. + + + + + + Initialize the filter with the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Typically filter's options become active immediately on set, + however this method must still be called. + + + + + + Decide if the should be logged through an appender. + + The to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + This method is marked abstract and must be implemented + in a subclass. + + + + + + Property to get and set the next filter + + + The next filter in the chain + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + Default constructor + + + + + Always returns the integer constant + + the LoggingEvent to filter + Always returns + + + Ignores the event being logged and just returns + . This can be used to change the default filter + chain behavior from to . This filter + should only be used as the last filter in the chain + as any further filters will be ignored! + + + + + + The return result from + + + + The return result from + + + + + + The log event must be dropped immediately without + consulting with the remaining filters, if any, in the chain. + + + + + This filter is neutral with respect to the log event. + The remaining filters, if any, should be consulted for a final decision. + + + + + The log event must be logged immediately without + consulting with the remaining filters, if any, in the chain. + + + + + This is a very simple filter based on matching. + + + + The filter admits two options and + . If there is an exact match between the value + of the option and the of the + , then the method returns in + case the option value is set + to true, if it is false then + is returned. If the does not match then + the result will be . + + + Nicko Cadell + Gert Driesen + + + + flag to indicate if the filter should on a match + + + + + the to match against + + + + + Default constructor + + + + + Tests if the of the logging event matches that of the filter + + the event to filter + see remarks + + + If the of the event matches the level of the + filter then the result of the function depends on the + value of . If it is true then + the function will return , it it is false then it + will return . If the does not match then + the result will be . + + + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + The level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + This is a simple filter based on matching. + + + + The filter admits three options and + that determine the range of priorities that are matched, and + . If there is a match between the range + of priorities and the of the , then the + method returns in case the + option value is set to true, if it is false + then is returned. If there is no match, is returned. + + + Nicko Cadell + Gert Driesen + + + + Flag to indicate the behavior when matching a + + + + + the minimum value to match + + + + + the maximum value to match + + + + + Default constructor + + + + + Check if the event should be logged. + + the logging event to check + see remarks + + + If the of the logging event is outside the range + matched by this filter then + is returned. If the is matched then the value of + is checked. If it is true then + is returned, otherwise + is returned. + + + + + + when matching and + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Set the minimum matched + + + + The minimum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Sets the maximum matched + + + + The maximum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Simple filter to match a string in the event's logger name. + + + + The works very similar to the . It admits two + options and . If the + of the starts + with the value of the option, then the + method returns in + case the option value is set to true, + if it is false then is returned. + + + Daniel Cazzulino + + + + Flag to indicate the behavior when we have a match + + + + + The logger name string to substring match against the event + + + + + Default constructor + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the equals the beginning of + the incoming () + then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + This filter will attempt to match this value against logger name in + the following way. The match will be done against the beginning of the + logger name (using ). The match is + case sensitive. If a match is found then + the result depends on the value of . + + + + + + Simple filter to match a keyed string in the + + + + Simple filter to match a keyed string in the + + + As the MDC has been replaced with layered properties the + should be used instead. + + + Nicko Cadell + Gert Driesen + + + + Simple filter to match a string an event property + + + + Simple filter to match a string in the value for a + specific event property + + + Nicko Cadell + + + + Simple filter to match a string in the rendered message + + + + Simple filter to match a string in the rendered message + + + Nicko Cadell + Gert Driesen + + + + Flag to indicate the behavior when we have a match + + + + + The string to substring match against the message + + + + + A string regex to match + + + + + A regex object to match (generated from m_stringRegexToMatch) + + + + + Default constructor + + + + + Initialize and precompile the Regex if required + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the occurs as a substring within + the message then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + when matching or + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Sets the static string to match + + + + The string that will be substring matched against + the rendered message. If the message contains this + string then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + Sets the regular expression to match + + + + The regular expression pattern that will be matched against + the rendered message. If the message matches this + pattern then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + The key to use to lookup the string from the event properties + + + + + Default constructor + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The event property for the is matched against + the . + If the occurs as a substring within + the property value then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + The key to lookup in the event properties and then match against. + + + + The key name to use to lookup in the properties map of the + . The match will be performed against + the value of this property if it exists. + + + + + + Simple filter to match a string in the + + + + Simple filter to match a string in the + + + As the MDC has been replaced with named stacks stored in the + properties collections the should + be used instead. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Sets the to "NDC". + + + + + + Write the event appdomain name to the output + + + + Writes the to the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + Nicko Cadell + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + + Nicko Cadell + Gert Driesen + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + Protected constructor + + + + Initializes a new instance of the class. + + + + + + Evaluate this pattern converter and write the output to a writer. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the appropriate way. + + + + + + Set the next pattern converter in the chains + + the pattern converter that should follow this converter in the chain + the next converter + + + The PatternConverter can merge with its neighbor during this method (or a sub class). + Therefore the return value may or may not be the value of the argument passed in. + + + + + + Write the pattern converter to the writer with appropriate formatting + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + This method calls to allow the subclass to perform + appropriate conversion of the pattern converter. If formatting options have + been specified via the then this method will + apply those formattings before writing the output. + + + + + + Fast space padding method. + + to which the spaces will be appended. + The number of spaces to be padded. + + + Fast space padding method. + + + + + + The option string to the converter + + + + + Write an dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Write an dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Write an object to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the Object to a writer. If the specified + is not null then it is used to render the object to text, otherwise + the object's ToString method is called. + + + + + + Get the next pattern converter in the chain + + + the next pattern converter in the chain + + + + Get the next pattern converter in the chain + + + + + + Gets or sets the formatting info for this converter + + + The formatting info for this converter + + + + Gets or sets the formatting info for this converter + + + + + + Gets or sets the option value for this converter + + + The option for this converter + + + + Gets or sets the option value for this converter + + + + + + + + + + + Initializes a new instance of the class. + + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The on which the pattern converter should be executed. + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + + Flag indicating if this converter handles exceptions + + + false if this converter handles exceptions + + + + + Flag indicating if this converter handles the logging event exception + + false if this converter handles the logging event exception + + + If this converter handles the exception object contained within + , then this property should be set to + false. Otherwise, if the layout ignores the exception + object, then the property should be set to true. + + + Set this value to override a this default setting. The default + value is true, this converter does not handle the exception. + + + + + + Write the event appdomain name to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output . + + + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Abstract class that provides access to the current HttpContext () that + derived classes need. + + + This class handles the case when HttpContext.Current is null by writing + to the writer. + + Ron Grabowski + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. If no property has been set, all key value pairs from the Cache will + be written to the output. + + + + + + Converter for items in the . + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net HttpContext item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. + + + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. + + + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. If no property has been set, all key value pairs from the Session will + be written to the output. + + + + + + Date pattern converter, uses a to format + the date of a . + + + + Render the to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,yyyy" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + The used to render the date to a string + + + + + + Initialize the converter pattern based on the property. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Convert the pattern into the rendered message + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone. + + + + + + The fully qualified type of the DatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the exception text to the output + + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Nicko Cadell + + + + Default constructor + + + + + Write the exception text to the output + + that will receive the formatted result. + the event being logged + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception or the exception property specified + by the Option value does not exist then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Recognized values for the Option parameter are: + + + + Message + + + Source + + + StackTrace + + + TargetSite + + + HelpLink + + + + + + + Writes the caller location file name to the output + + + + Writes the value of the for + the event to the output writer. + + + Nicko Cadell + + + + Write the caller location file name to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the for + the to the output . + + + + + + Write the caller location info to the output + + + + Writes the to the output writer. + + + Nicko Cadell + + + + Write the caller location info to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Writes the event identity to the output + + + + Writes the value of the to + the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Writes the event identity to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the + to + the output . + + + + + + Write the event level to the output + + + + Writes the display name of the event + to the writer. + + + Nicko Cadell + + + + Write the event level to the output + + that will receive the formatted result. + the event being logged + + + Writes the of the + to the . + + + + + + Write the caller location line number to the output + + + + Writes the value of the for + the event to the output writer. + + + Nicko Cadell + + + + Write the caller location line number to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the for + the to the output . + + + + + + Converter for logger name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Converter to output and truncate '.' separated strings + + + + This abstract class supports truncating a '.' separated string + to show a specified number of elements from the right hand side. + This is used to truncate class names that are fully qualified. + + + Subclasses should override the method to + return the fully qualified string. + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Get the fully qualified string data + + the event being logged + the fully qualified name + + + Overridden by subclasses to get the fully qualified name before the + precision is applied to it. + + + Return the fully qualified '.' (dot/period) separated string. + + + + + + Convert the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + Render the to the precision + specified by the property. + + + + + The fully qualified type of the NamedPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets the fully qualified name of the logger + + the event being logged + The fully qualified logger name + + + Returns the of the . + + + + + + Writes the event message to the output + + + + Uses the method + to write out the event message. + + + Nicko Cadell + + + + Writes the event message to the output + + that will receive the formatted result. + the event being logged + + + Uses the method + to write out the event message. + + + + + + Write the method name to the output + + + + Writes the caller location to + the output. + + + Nicko Cadell + + + + Write the method name to the output + + that will receive the formatted result. + the event being logged + + + Writes the caller location to + the output. + + + + + + Converter to include event NDC + + + + Outputs the value of the event property named NDC. + + + The should be used instead. + + + Nicko Cadell + + + + Write the event NDC to the output + + that will receive the formatted result. + the event being logged + + + As the thread context stacks are now stored in named event properties + this converter simply looks up the value of the NDC property. + + + The should be used instead. + + + + + + Property pattern converter + + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + the event being logged + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + Converter to output the relative time of the event + + + + Converter to output the time of the event relative to the start of the program. + + + Nicko Cadell + + + + Write the relative time to the output + + that will receive the formatted result. + the event being logged + + + Writes out the relative time of the event in milliseconds. + That is the number of milliseconds between the event + and the . + + + + + + Helper method to get the time difference between two DateTime objects + + start time (in the current local time zone) + end time (in the current local time zone) + the time difference in milliseconds + + + + Write the caller stack frames to the output + + + + Writes the to the output writer, using format: + type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) + + + Adam Davies + + + + Write the caller stack frames to the output + + + + Writes the to the output writer, using format: + type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 + + + Michael Cromwell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the strack frames to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Returns the Name of the method + + + This method was created, so this class could be used as a base class for StackTraceDetailPatternConverter + string + + + + The fully qualified type of the StackTracePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + The fully qualified type of the StackTraceDetailPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Converter to include event thread name + + + + Writes the to the output. + + + Nicko Cadell + + + + Write the ThreadName to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the . + + + + + + Pattern converter for the class name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Gets the fully qualified name of the class + + the event being logged + The fully qualified type name for the caller location + + + Returns the of the . + + + + + + Converter to include event user name + + Douglas de la Torre + Nicko Cadell + + + + Convert the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + + + Write the TimeStamp to the output + + + + Date pattern converter, uses a to format + the date of a . + + + Uses a to format the + in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Write the TimeStamp to the output + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone, this is converted + to Universal time before it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + A flexible layout configurable with pattern string that re-evaluates on each call. + + + This class is built on and provides all the + features and capabilities of PatternLayout. PatternLayout is a 'static' class + in that its layout is done once at configuration time. This class will recreate + the layout on each reference. + One important difference between PatternLayout and DynamicPatternLayout is the + treatment of the Header and Footer parameters in the configuration. The Header and Footer + parameters for DynamicPatternLayout must be syntactically in the form of a PatternString, + but should not be marked as type log4net.Util.PatternString. Doing so causes the + pattern to be statically converted at configuration time and causes DynamicPatternLayout + to perform the same as PatternLayout. + Please see for complete documentation. + + <layout type="log4net.Layout.DynamicPatternLayout"> + <param name="Header" value="%newline**** Trace Opened Local: %date{yyyy-MM-dd HH:mm:ss.fff} UTC: %utcdate{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> + <param name="Footer" value="**** Trace Closed %date{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> + </layout> + + + + + + A flexible layout configurable with pattern string. + + + + The goal of this class is to a + as a string. The results + depend on the conversion pattern. + + + The conversion pattern is closely related to the conversion + pattern of the printf function in C. A conversion pattern is + composed of literal text and format control expressions called + conversion specifiers. + + + You are free to insert any literal text within the conversion + pattern. + + + Each conversion specifier starts with a percent sign (%) and is + followed by optional format modifiers and a conversion + pattern name. The conversion pattern name specifies the type of + data, e.g. logger, level, date, thread name. The format + modifiers control such things as field width, padding, left and + right justification. The following is a simple example. + + + Let the conversion pattern be "%-5level [%thread]: %message%newline" and assume + that the log4net environment was set to use a PatternLayout. Then the + statements + + + ILog log = LogManager.GetLogger(typeof(TestApp)); + log.Debug("Message 1"); + log.Warn("Message 2"); + + would yield the output + + DEBUG [main]: Message 1 + WARN [main]: Message 2 + + + Note that there is no explicit separator between text and + conversion specifiers. The pattern parser knows when it has reached + the end of a conversion specifier when it reads a conversion + character. In the example above the conversion specifier + %-5level means the level of the logging event should be left + justified to a width of five characters. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + a + Equivalent to appdomain + + + appdomain + + Used to output the friendly name of the AppDomain where the + logging event was generated. + + + + aspnet-cache + + + Used to output all cache items in the case of %aspnet-cache or just one named item if used as %aspnet-cache{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-context + + + Used to output all context items in the case of %aspnet-context or just one named item if used as %aspnet-context{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-request + + + Used to output all request parameters in the case of %aspnet-request or just one named param if used as %aspnet-request{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-session + + + Used to output all session items in the case of %aspnet-session or just one named item if used as %aspnet-session{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + c + Equivalent to logger + + + C + Equivalent to type + + + class + Equivalent to type + + + d + Equivalent to date + + + date + + + Used to output the date of the logging event in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + exception + + + Used to output the exception passed in with the log message. + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + + + F + Equivalent to file + + + file + + + Used to output the file name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + WARNING Generating caller information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + l + Equivalent to location + + + L + Equivalent to line + + + location + + + Used to output location information of the caller which generated + the logging event. + + + The location information depends on the CLI implementation but + usually consists of the fully qualified name of the calling + method followed by the callers source the file name and line + number between parentheses. + + + The location information can be very useful. However, its + generation is extremely slow. Its use should be avoided + unless execution speed is not an issue. + + + See the note below on the availability of caller location information. + + + + + level + + + Used to output the level of the logging event. + + + + + line + + + Used to output the line number from where the logging request + was issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + logger + + + Used to output the logger of the logging event. The + logger conversion specifier can be optionally followed by + precision specifier, that is a decimal constant in + brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the logger name will be + printed. By default the logger name is printed in full. + + + For example, for the logger name "a.b.c" the pattern + %logger{2} will output "b.c". + + + + + m + Equivalent to message + + + M + Equivalent to method + + + message + + + Used to output the application supplied message associated with + the logging event. + + + + + mdc + + + The MDC (old name for the ThreadContext.Properties) is now part of the + combined event properties. This pattern is supported for compatibility + but is equivalent to property. + + + + + method + + + Used to output the method name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + n + Equivalent to newline + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + ndc + + + Used to output the NDC (nested diagnostic context) associated + with the thread that generated the logging event. + + + + + p + Equivalent to level + + + P + Equivalent to property + + + properties + Equivalent to property + + + property + + + Used to output the an event specific property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are added to events by loggers or appenders. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the event properties + + The event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + r + Equivalent to timestamp + + + stacktrace + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktrace{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 + + + This pattern is not available for Compact Framework assemblies. + + + + + stacktracedetail + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktracedetail{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) + + + This pattern is not available for Compact Framework assemblies. + + + + + t + Equivalent to thread + + + timestamp + + + Used to output the number of milliseconds elapsed since the start + of the application until the creation of the logging event. + + + + + thread + + + Used to output the name of the thread that generated the + logging event. Uses the thread number if no name is available. + + + + + type + + + Used to output the fully qualified type name of the caller + issuing the logging request. This conversion specifier + can be optionally followed by precision specifier, that + is a decimal constant in brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the class name will be + printed. By default the class name is output in fully qualified form. + + + For example, for the class name "log4net.Layout.PatternLayout", the + pattern %type{1} will output "PatternLayout". + + + WARNING Generating the caller class information is + slow. Thus, its use should be avoided unless execution speed is + not an issue. + + + See the note below on the availability of caller location information. + + + + + u + Equivalent to identity + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + WARNING Generating caller WindowsIdentity information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + w + Equivalent to username + + + x + Equivalent to ndc + + + X + Equivalent to mdc + + + % + + + The sequence %% outputs a single percent sign. + + + + + + The single letter patterns are deprecated in favor of the + longer more descriptive pattern names. + + + By default the relevant information is output as is. However, + with the aid of format modifiers it is possible to change the + minimum field width, the maximum field width and justification. + + + The optional format modifier is placed between the percent sign + and the conversion pattern name. + + + The first optional format modifier is the left justification + flag which is just the minus (-) character. Then comes the + optional minimum field width modifier. This is a decimal + constant that represents the minimum number of characters to + output. If the data item requires fewer characters, it is padded on + either the left or the right until the minimum width is + reached. The default is to pad on the left (right justify) but you + can specify right padding with the left justification flag. The + padding character is space. If the data item is larger than the + minimum field width, the field is expanded to accommodate the + data. The value is never truncated. + + + This behavior can be changed using the maximum field + width modifier which is designated by a period followed by a + decimal constant. If the data item is longer than the maximum + field, then the extra characters are removed from the + beginning of the data item and not from the end. For + example, it the maximum field width is eight and the data item is + ten characters long, then the first two characters of the data item + are dropped. This behavior deviates from the printf function in C + where truncation is done from the end. + + + Below are various format modifier examples for the logger + conversion specifier. + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Format modifierleft justifyminimum widthmaximum widthcomment
%20loggerfalse20none + + Left pad with spaces if the logger name is less than 20 + characters long. + +
%-20loggertrue20none + + Right pad with spaces if the logger + name is less than 20 characters long. + +
%.30loggerNAnone30 + + Truncate from the beginning if the logger + name is longer than 30 characters. + +
%20.30loggerfalse2030 + + Left pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
%-20.30loggertrue2030 + + Right pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
+
+ + Note about caller location information.
+ The following patterns %type %file %line %method %location %class %C %F %L %l %M + all generate caller location information. + Location information uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. +
+ + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + + Additional pattern converters may be registered with a specific + instance using the method. + +
+ + This is a more detailed pattern. + %timestamp [%thread] %level %logger %ndc - %message%newline + + + A similar pattern except that the relative time is + right padded if less than 6 digits, thread name is right padded if + less than 15 characters and truncated if longer and the logger + name is left padded if shorter than 30 characters and truncated if + longer. + %-6timestamp [%15.15thread] %-5level %30.30logger %ndc - %message%newline + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino +
+ + + Extend this abstract class to create your own log layout format. + + + + This is the base implementation of the + interface. Most layout objects should extend this class. + + + + + + Subclasses must implement the + method. + + + Subclasses should set the in their default + constructor. + + + + Nicko Cadell + Gert Driesen + + + + Interface implemented by layout objects + + + + An object is used to format a + as text. The method is called by an + appender to transform the into a string. + + + The layout can also supply and + text that is appender before any events and after all the events respectively. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text and output to a writer. + + + If the caller does not have a and prefers the + event to be formatted as a then the following + code can be used to format the event into a . + + + StringWriter writer = new StringWriter(); + Layout.Format(writer, loggingEvent); + string formattedEvent = writer.ToString(); + + + + + + The content type output by this layout. + + The content type + + + The content type output by this layout. + + + This is a MIME type e.g. "text/plain". + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handle exceptions + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + + + + The header text + + + + See for more information. + + + + + + The footer text + + + + See for more information. + + + + + + Flag indicating if this layout handles exceptions + + + + false if this layout handles exceptions + + + + + + Empty default constructor + + + + Empty default constructor + + + + + + Activate component options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This method must be implemented by the subclass. + + + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text. + + + + + + Convenience method for easily formatting the logging event into a string variable. + + + + Creates a new StringWriter instance to store the formatted logging event. + + + + + The content type output by this layout. + + The content type is "text/plain" + + + The content type output by this layout. + + + This base class uses the value "text/plain". + To change this value a subclass must override this + property. + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handles exceptions + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + Set this value to override a this default setting. The default + value is true, this layout does not handle the exception. + + + + + + Default pattern string for log output. + + + + Default pattern string for log output. + Currently set to the string "%message%newline" + which just prints the application supplied message. + + + + + + A detailed conversion pattern + + + + A conversion pattern which includes Time, Thread, Logger, and Nested Context. + Current value is %timestamp [%thread] %level %logger %ndc - %message%newline. + + + + + + Internal map of converter identifiers to converter types. + + + + This static map is overridden by the m_converterRegistry instance map + + + + + + the pattern + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternLayout only + + + + + Initialize the global registry + + + + Defines the builtin global rules. + + + + + + Constructs a PatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + As per the contract the + method must be called after the properties on this object have been + configured. + + + + + + Constructs a PatternLayout using the supplied conversion pattern + + the pattern to use + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + When using this constructor the method + need not be called. This may not be the case when using a subclass. + + + + + + Create the pattern parser instance + + the pattern to parse + The that will format the event + + + Creates the used to parse the conversion string. Sets the + global and instance rules on the . + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a formatted string as specified by the conversion pattern. + + the event being logged + The TextWriter to write the formatted event to + + + Parse the using the patter format + specified in the property. + + + + + + Add a converter to this PatternLayout + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + + + + + + Add a converter to this PatternLayout + + the name of the conversion pattern for this converter + the type of the converter + + + Add a named pattern converter to this instance. This + converter will be used in the formatting of the event. + This method must be called before . + + + The specified must extend the + type. + + + + + + The pattern formatting string + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + The header PatternString + + + + + The footer PatternString + + + + + Constructs a DynamicPatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + + + + Constructs a DynamicPatternLayout using the supplied conversion pattern + + the pattern to use + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + The pattern will be formatted on each get operation. + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + The pattern will be formatted on each get operation. + + + + + A Layout that renders only the Exception text from the logging event + + + + A Layout that renders only the Exception text from the logging event. + + + This Layout should only be used with appenders that utilize multiple + layouts (e.g. ). + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Constructs a ExceptionLayout + + + + + + Activate component options + + + + Part of the component activation + framework. + + + This method does nothing as options become effective immediately. + + + + + + Gets the exception text from the logging event + + The TextWriter to write the formatted event to + the event being logged + + + Write the exception string to the . + The exception string is retrieved from . + + + + + + Interface for raw layout objects + + + + Interface used to format a + to an object. + + + This interface should not be confused with the + interface. This interface is used in + only certain specialized situations where a raw object is + required rather than a formatted string. The + is not generally useful than this interface. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The event to format + returns the formatted event + + + Implement this method to create your own layout format. + + + + + + Adapts any to a + + + + Where an is required this adapter + allows a to be specified. + + + Nicko Cadell + Gert Driesen + + + + The layout to adapt + + + + + Construct a new adapter + + the layout to adapt + + + Create the adapter for the specified . + + + + + + Format the logging event as an object. + + The event to format + returns the formatted event + + + Format the logging event as an object. + + + Uses the object supplied to + the constructor to perform the formatting. + + + + + + Type converter for the interface + + + + Used to convert objects to the interface. + Supports converting from the interface to + the interface using the . + + + Nicko Cadell + Gert Driesen + + + + Interface supported by type converters + + + + This interface supports conversion from arbitrary types + to a single target type. See . + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Test if the can be converted to the + type supported by this converter. + + + + + + Convert the source object to the type supported by this object + + the object to convert + the converted object + + + Converts the to the type supported + by this converter. + + + + + + Can the sourceType be converted to an + + the source to be to be converted + true if the source type can be converted to + + + Test if the can be converted to a + . Only is supported + as the . + + + + + + Convert the value to a object + + the value to convert + the object + + + Convert the object to a + object. If the object + is a then the + is used to adapt between the two interfaces, otherwise an + exception is thrown. + + + + + + Extract the value of a property from the + + + + Extract the value of a property from the + + + Nicko Cadell + + + + Constructs a RawPropertyLayout + + + + + Lookup the property for + + The event to format + returns property value + + + Looks up and returns the object value of the property + named . If there is no property defined + with than name then null will be returned. + + + + + + The name of the value to lookup in the LoggingEvent Properties collection. + + + Value to lookup in the LoggingEvent Properties collection + + + + String name of the property to lookup in the . + + + + + + Extract the date from the + + + + Extract the date from the + + + Nicko Cadell + Gert Driesen + + + + Constructs a RawTimeStampLayout + + + + + Gets the as a . + + The event to format + returns the time stamp + + + Gets the as a . + + + The time stamp is in local time. To format the time stamp + in universal time use . + + + + + + Extract the date from the + + + + Extract the date from the + + + Nicko Cadell + Gert Driesen + + + + Constructs a RawUtcTimeStampLayout + + + + + Gets the as a . + + The event to format + returns the time stamp + + + Gets the as a . + + + The time stamp is in universal time. To format the time stamp + in local time use . + + + + + + A very simple layout + + + + SimpleLayout consists of the level of the log statement, + followed by " - " and then the log message itself. For example, + + DEBUG - Hello world + + + + Nicko Cadell + Gert Driesen + + + + Constructs a SimpleLayout + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a simple formatted output. + + the event being logged + The TextWriter to write the formatted event to + + + Formats the event as the level of the even, + followed by " - " and then the log message itself. The + output is terminated by a newline. + + + + + + Layout that formats the log events as XML elements. + + + + The output of the consists of a series of + log4net:event elements. It does not output a complete well-formed XML + file. The output is designed to be included as an external entity + in a separate file to form a correct XML file. + + + For example, if abc is the name of the file where + the output goes, then a well-formed XML file would + be: + + + <?xml version="1.0" ?> + + <!DOCTYPE log4net:events SYSTEM "log4net-events.dtd" [<!ENTITY data SYSTEM "abc">]> + + <log4net:events version="1.2" xmlns:log4net="http://logging.apache.org/log4net/schemas/log4net-events-1.2> + &data; + </log4net:events> + + + This approach enforces the independence of the + and the appender where it is embedded. + + + The version attribute helps components to correctly + interpret output generated by . The value of + this attribute should be "1.2" for release 1.2 and later. + + + Alternatively the Header and Footer properties can be + configured to output the correct XML header, open tag and close tag. + When setting the Header and Footer properties it is essential + that the underlying data store not be appendable otherwise the data + will become invalid XML. + + + Nicko Cadell + Gert Driesen + + + + Layout that formats the log events as XML elements. + + + + This is an abstract class that must be subclassed by an implementation + to conform to a specific schema. + + + Deriving classes must implement the method. + + + Nicko Cadell + Gert Driesen + + + + Protected constructor to support subclasses + + + + Initializes a new instance of the class + with no location info. + + + + + + Protected constructor to support subclasses + + + + The parameter determines whether + location information will be output by the layout. If + is set to true, then the + file name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a formatted string. + + The event being logged. + The TextWriter to write the formatted event to + + + Format the and write it to the . + + + This method creates an that writes to the + . The is passed + to the method. Subclasses should override the + method rather than this method. + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Subclasses should override this method to format + the as XML. + + + + + + Flag to indicate if location information should be included in + the XML events. + + + + + The string to replace invalid chars with + + + + + Gets a value indicating whether to include location information in + the XML events. + + + true if location information should be included in the XML + events; otherwise, false. + + + + If is set to true, then the file + name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The string to replace characters that can not be expressed in XML with. + + + Not all characters may be expressed in XML. This property contains the + string to replace those that can not with. This defaults to a ?. Set it + to the empty string to simply remove offending characters. For more + details on the allowed character ranges see http://www.w3.org/TR/REC-xml/#charsets + Character replacement will occur in the log message, the property names + and the property values. + + + + + + + Gets the content type output by this layout. + + + As this is the XML layout, the value is always "text/xml". + + + + As this is the XML layout, the value is always "text/xml". + + + + + + Constructs an XmlLayout + + + + + Constructs an XmlLayout. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SmtpAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Builds a cache of the element names + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Override the base class method + to write the to the . + + + + + + The prefix to use for all generated element names + + + + + The prefix to use for all element names + + + + The default prefix is log4net. Set this property + to change the prefix. If the prefix is set to an empty string + then no prefix will be written. + + + + + + Set whether or not to base64 encode the message. + + + + By default the log message will be written as text to the xml + output. This can cause problems when the message contains binary + data. By setting this to true the contents of the message will be + base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the log message. + + + + + + Set whether or not to base64 encode the property values. + + + + By default the properties will be written as text to the xml + output. This can cause problems when one or more properties contain + binary data. By setting this to true the values of the properties + will be base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the property values. + + + + + + Layout that formats the log events as XML elements compatible with the log4j schema + + + + Formats the log events according to the http://logging.apache.org/log4j schema. + + + Nicko Cadell + + + + The 1st of January 1970 in UTC + + + + + Constructs an XMLLayoutSchemaLog4j + + + + + Constructs an XMLLayoutSchemaLog4j. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + Actually do the writing of the xml + + the writer to use + the event to write + + + Generate XML that is compatible with the log4j schema. + + + + + + The version of the log4j schema to use. + + + + Only version 1.2 of the log4j schema is supported. + + + + + + The default object Renderer. + + + + The default renderer supports rendering objects and collections to strings. + + + See the method for details of the output. + + + Nicko Cadell + Gert Driesen + + + + Implement this interface in order to render objects as strings + + + + Certain types require special case conversion to + string form. This conversion is done by an object renderer. + Object renderers implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Render the object to a string + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a + string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + + + + Default constructor + + + + Default constructor + + + + + + Render the object to a string + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + The default renderer supports rendering objects to strings as follows: + + + + Value + Rendered String + + + null + + "(null)" + + + + + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + , & + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: {a, b, c}. + + + All collection classes that implement its subclasses, + or generic equivalents all implement the interface. + + + + + + + + Rendered as the key, an equals sign ('='), and the value (using the appropriate + renderer). + + + For example: key=value. + + + + + other + + Object.ToString() + + + + + + + + Render the array argument into a string + + The map used to lookup renderers + the array to render + The writer to render to + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + + Render the enumerator argument into a string + + The map used to lookup renderers + the enumerator to render + The writer to render to + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + {a, b, c}. + + + + + + Render the DictionaryEntry argument into a string + + The map used to lookup renderers + the DictionaryEntry to render + The writer to render to + + + Render the key, an equals sign ('='), and the value (using the appropriate + renderer). For example: key=value. + + + + + + Map class objects to an . + + + + Maintains a mapping between types that require special + rendering and the that + is used to render them. + + + The method is used to render an + object using the appropriate renderers defined in this map. + + + Nicko Cadell + Gert Driesen + + + + Default Constructor + + + + Default constructor. + + + + + + Render using the appropriate renderer. + + the object to render to a string + the object rendered as a string + + + This is a convenience method used to render an object to a string. + The alternative method + should be used when streaming output to a . + + + + + + Render using the appropriate renderer. + + the object to render to a string + The writer to render to + + + Find the appropriate renderer for the type of the + parameter. This is accomplished by calling the + method. Once a renderer is found, it is + applied on the object and the result is returned + as a . + + + + + + Gets the renderer for the specified object type + + the object to lookup the renderer for + the renderer for + + + Gets the renderer for the specified object type. + + + Syntactic sugar method that calls + with the type of the object parameter. + + + + + + Gets the renderer for the specified type + + the type to lookup the renderer for + the renderer for the specified type + + + Returns the renderer for the specified type. + If no specific renderer has been defined the + will be returned. + + + + + + Internal function to recursively search interfaces + + the type to lookup the renderer for + the renderer for the specified type + + + + Clear the map of renderers + + + + Clear the custom renderers defined by using + . The + cannot be removed. + + + + + + Register an for . + + the type that will be rendered by + the renderer for + + + Register an object renderer for a specific source type. + This renderer will be returned from a call to + specifying the same as an argument. + + + + + + Get the default renderer instance + + the default renderer + + + Get the default renderer + + + + + + Interface implemented by logger repository plugins. + + + + Plugins define additional behavior that can be associated + with a . + The held by the + property is used to store the plugins for a repository. + + + The log4net.Config.PluginAttribute can be used to + attach plugins to repositories created using configuration + attributes. + + + Nicko Cadell + Gert Driesen + + + + Attaches the plugin to the specified . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + Gets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Creates a read-only wrapper for a PluginCollection instance. + + list to create a readonly wrapper arround + + A PluginCollection wrapper that is read-only. + + + + + Initializes a new instance of the PluginCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the PluginCollection class + that has the specified initial capacity. + + + The number of elements that the new PluginCollection is initially capable of storing. + + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified PluginCollection. + + The PluginCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Allow subclasses to avoid our default constructors + + + + + + + Copies the entire PluginCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire PluginCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Adds a to the end of the PluginCollection. + + The to be added to the end of the PluginCollection. + The index at which the value has been added. + + + + Removes all elements from the PluginCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the PluginCollection. + + The to check for. + true if is found in the PluginCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the PluginCollection. + + The to locate in the PluginCollection. + + The zero-based index of the first occurrence of + in the entire PluginCollection, if found; otherwise, -1. + + + + + Inserts an element into the PluginCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the PluginCollection. + + The to remove from the PluginCollection. + + The specified was not found in the PluginCollection. + + + + + Removes the element at the specified index of the PluginCollection. + + The zero-based index of the element to remove. + + is less than zero. + -or- + is equal to or greater than . + + + + + Returns an enumerator that can iterate through the PluginCollection. + + An for the entire PluginCollection. + + + + Adds the elements of another PluginCollection to the current PluginCollection. + + The PluginCollection whose elements should be added to the end of the current PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a array to the current PluginCollection. + + The array whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a collection to the current PluginCollection. + + The collection whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + Gets the number of elements actually contained in the PluginCollection. + + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + true if access to the ICollection is synchronized (thread-safe); otherwise, false. + + + + Gets an object that can be used to synchronize access to the collection. + + + An object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + + The at the specified index. + + The zero-based index of the element to get or set. + + is less than zero. + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false. + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false. + + + + Gets or sets the number of elements the PluginCollection can contain. + + + The number of elements the PluginCollection can contain. + + + + + Supports type-safe iteration over a . + + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Gets the current element in the collection. + + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Gets the current element in the collection. + + + The current element in the collection. + + + + + + + + Map of repository plugins. + + + + This class is a name keyed map of the plugins that are + attached to a repository. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The repository that the plugins should be attached to. + + + Initialize a new instance of the class with a + repository that the plugins should be attached to. + + + + + + Adds a to the map. + + The to add to the map. + + + The will be attached to the repository when added. + + + If there already exists a plugin with the same name + attached to the repository then the old plugin will + be and replaced with + the new plugin. + + + + + + Removes a from the map. + + The to remove from the map. + + + Remove a specific plugin from this map. + + + + + + Gets a by name. + + The name of the to lookup. + + The from the map with the name specified, or + null if no plugin is found. + + + + Lookup a plugin by name. If the plugin is not found null + will be returned. + + + + + + Gets all possible plugins as a list of objects. + + All possible plugins as a list of objects. + + + Get a collection of all the plugins defined in this map. + + + + + + Base implementation of + + + + Default abstract implementation of the + interface. This base class can be used by implementors + of the interface. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + the name of the plugin + + Initializes a new Plugin with the specified name. + + + + + Attaches this plugin to a . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + The name of this plugin. + + + + + The repository this plugin is attached to. + + + + + Gets or sets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + The name of the plugin must not change one the + plugin has been attached to a repository. + + + + + + The repository for this plugin + + + The that this plugin is attached to. + + + + Gets or sets the that this plugin is + attached to. + + + + + + Plugin that listens for events from the + + + + This plugin publishes an instance of + on a specified . This listens for logging events delivered from + a remote . + + + When an event is received it is relogged within the attached repository + as if it had been raised locally. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + The property must be set. + + + + + + Construct with sink Uri. + + The name to publish the sink under in the remoting infrastructure. + See for more details. + + + Initializes a new instance of the class + with specified name. + + + + + + Attaches this plugin to a . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + When the plugin is shutdown the remote logging + sink is disconnected. + + + + + + The fully qualified type of the RemoteLoggingServerPlugin class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the URI of this sink. + + + The URI of this sink. + + + + This is the name under which the object is marshaled. + + + + + + + Delivers objects to a remote sink. + + + + Internal class used to listen for logging events + and deliver them to the local repository. + + + + + + Constructor + + The repository to log to. + + + Initializes a new instance of the for the + specified . + + + + + + Logs the events to the repository. + + The events to log. + + + The events passed are logged to the + + + + + + Obtains a lifetime service object to control the lifetime + policy for this instance. + + null to indicate that this instance should live forever. + + + Obtains a lifetime service object to control the lifetime + policy for this instance. This object should live forever + therefore this implementation returns null. + + + + + + The underlying that events should + be logged to. + + + + + Default implementation of + + + + This default implementation of the + interface is used to create the default subclass + of the object. + + + Nicko Cadell + Gert Driesen + + + + Interface abstracts creation of instances + + + + This interface is used by the to + create new objects. + + + The method is called + to create a named . + + + Implement this interface to create new subclasses of . + + + Nicko Cadell + Gert Driesen + + + + Create a new instance + + The that will own the . + The name of the . + The instance for the specified name. + + + Create a new instance with the + specified name. + + + Called by the to create + new named instances. + + + If the is null then the root logger + must be returned. + + + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Create a new instance + + The that will own the . + The name of the . + The instance for the specified name. + + + Create a new instance with the + specified name. + + + Called by the to create + new named instances. + + + If the is null then the root logger + must be returned. + + + + + + Default internal subclass of + + + + This subclass has no additional behavior over the + class but does allow instances + to be created. + + + + + + Implementation of used by + + + + Internal class used to provide implementation of + interface. Applications should use to get + logger instances. + + + This is one of the central classes in the log4net implementation. One of the + distinctive features of log4net are hierarchical loggers and their + evaluation. The organizes the + instances into a rooted tree hierarchy. + + + The class is abstract. Only concrete subclasses of + can be created. The + is used to create instances of this type for the . + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + + + + This constructor created a new instance and + sets its name. + + The name of the . + + + This constructor is protected and designed to be used by + a subclass that is not abstract. + + + Loggers are constructed by + objects. See for the default + logger creator. + + + + + + Add to the list of appenders of this + Logger instance. + + An appender to add to this logger + + + Add to the list of appenders of this + Logger instance. + + + If is already in the list of + appenders, then it won't be added again. + + + + + + Look for the appender named as name + + The name of the appender to lookup + The appender with the name specified, or null. + + + Returns the named appender, or null if the appender is not found. + + + + + + Remove all previously added appenders from this Logger instance. + + + + Remove all previously added appenders from this Logger instance. + + + This is useful when re-reading configuration information. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The appender to remove + The appender removed from the list + + + Remove the appender passed as parameter form the list of appenders. + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The name of the appender to remove + The appender removed from the list + + + Remove the named appender passed as parameter form the list of appenders. + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + This generic form is intended to be used by wrappers. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generate a logging event for the specified using + the and . + + + This method must not throw any exception to the caller. + + + + + + This is the most generic printing method that is intended to be used + by wrappers. + + The event being logged. + + + Logs the specified logging event through this logger. + + + This method must not throw any exception to the caller. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + true if this logger is enabled for level, otherwise false. + + + + Test if this logger is going to log events of the specified . + + + This method must not throw any exception to the caller. + + + + + + Deliver the to the attached appenders. + + The event to log. + + + Call the appenders in the hierarchy starting at + this. If no appenders could be found, emit a + warning. + + + This method calls all the appenders inherited from the + hierarchy circumventing any evaluation of whether to log or not + to log the particular log request. + + + + + + Closes all attached appenders implementing the interface. + + + + Used to ensure that the appenders are correctly shutdown. + + + + + + This is the most generic printing method. This generic form is intended to be used by wrappers + + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generate a logging event for the specified using + the . + + + + + + Creates a new logging event and logs the event without further checks. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generates a logging event and delivers it to the attached + appenders. + + + + + + Creates a new logging event and logs the event without further checks. + + The event being logged. + + + Delivers the logging event to the attached appenders. + + + + + + The fully qualified type of the Logger class. + + + + + The name of this logger. + + + + + The assigned level of this logger. + + + + The level variable need not be + assigned a value in which case it is inherited + form the hierarchy. + + + + + + The parent of this logger. + + + + The parent of this logger. + All loggers have at least one ancestor which is the root logger. + + + + + + Loggers need to know what Hierarchy they are in. + + + + Loggers need to know what Hierarchy they are in. + The hierarchy that this logger is a member of is stored + here. + + + + + + Helper implementation of the interface + + + + + Flag indicating if child loggers inherit their parents appenders + + + + Additivity is set to true by default, that is children inherit + the appenders of their ancestors by default. If this variable is + set to false then the appenders found in the + ancestors of this logger are not used. However, the children + of this logger will inherit its appenders, unless the children + have their additivity flag set to false too. See + the user manual for more details. + + + + + + Lock to protect AppenderAttachedImpl variable m_appenderAttachedImpl + + + + + Gets or sets the parent logger in the hierarchy. + + + The parent logger in the hierarchy. + + + + Part of the Composite pattern that makes the hierarchy. + The hierarchy is parent linked rather than child linked. + + + + + + Gets or sets a value indicating if child loggers inherit their parent's appenders. + + + true if child loggers inherit their parent's appenders. + + + + Additivity is set to true by default, that is children inherit + the appenders of their ancestors by default. If this variable is + set to false then the appenders found in the + ancestors of this logger are not used. However, the children + of this logger will inherit its appenders, unless the children + have their additivity flag set to false too. See + the user manual for more details. + + + + + + Gets the effective level for this logger. + + The nearest level in the logger hierarchy. + + + Starting from this logger, searches the logger hierarchy for a + non-null level and returns it. Otherwise, returns the level of the + root logger. + + The Logger class is designed so that this method executes as + quickly as possible. + + + + + Gets or sets the where this + Logger instance is attached to. + + The hierarchy that this logger belongs to. + + + This logger must be attached to a single . + + + + + + Gets or sets the assigned , if any, for this Logger. + + + The of this logger. + + + + The assigned can be null. + + + + + + Get the appenders contained in this logger as an + . + + A collection of the appenders in this logger + + + Get the appenders contained in this logger as an + . If no appenders + can be found, then a is returned. + + + + + + Gets the logger name. + + + The name of the logger. + + + + The name of this logger + + + + + + Gets the where this + Logger instance is attached to. + + + The that this logger belongs to. + + + + Gets the where this + Logger instance is attached to. + + + + + + Construct a new Logger + + the name of the logger + + + Initializes a new instance of the class + with the specified name. + + + + + + Delegate used to handle logger creation event notifications. + + The in which the has been created. + The event args that hold the instance that has been created. + + + Delegate used to handle logger creation event notifications. + + + + + + Provides data for the event. + + + + A event is raised every time a + is created. + + + + + + The created + + + + + Constructor + + The that has been created. + + + Initializes a new instance of the event argument + class,with the specified . + + + + + + Gets the that has been created. + + + The that has been created. + + + + The that has been created. + + + + + + Hierarchical organization of loggers + + + + The casual user should not have to deal with this class + directly. + + + This class is specialized in retrieving loggers by name and + also maintaining the logger hierarchy. Implements the + interface. + + + The structure of the logger hierarchy is maintained by the + method. The hierarchy is such that children + link to their parent but parents do not have any references to their + children. Moreover, loggers can be instantiated in any order, in + particular descendant before ancestor. + + + In case a descendant is created before a particular ancestor, + then it creates a provision node for the ancestor and adds itself + to the provision node. Other descendants of the same ancestor add + themselves to the previously created provision node. + + + Nicko Cadell + Gert Driesen + + + + Base implementation of + + + + Default abstract implementation of the interface. + + + Skeleton implementation of the interface. + All types can extend this type. + + + Nicko Cadell + Gert Driesen + + + + Interface implemented by logger repositories. + + + + This interface is implemented by logger repositories. e.g. + . + + + This interface is used by the + to obtain interfaces. + + + Nicko Cadell + Gert Driesen + + + + Check if the named logger exists in the repository. If so return + its reference, otherwise returns null. + + The name of the logger to lookup + The Logger object with the name specified + + + If the names logger exists it is returned, otherwise + null is returned. + + + + + + Returns all the currently defined loggers as an Array. + + All the defined loggers + + + Returns all the currently defined loggers as an Array. + + + + + + Returns a named logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Returns a named logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + Shutdown the repository + + + Shutting down a repository will safely close and remove + all appenders in all loggers including the root logger. + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Reset the repositories configuration to a default state + + + + Reset all values contained in this instance to their + default state. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the through this repository. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + The name of the repository + + + The name of the repository + + + + The name of the repository. + + + + + + RendererMap accesses the object renderer map for this repository. + + + RendererMap accesses the object renderer map for this repository. + + + + RendererMap accesses the object renderer map for this repository. + + + The RendererMap holds a mapping between types and + objects. + + + + + + The plugin map for this repository. + + + The plugin map for this repository. + + + + The plugin map holds the instances + that have been attached to this repository. + + + + + + Get the level map for the Repository. + + + + Get the level map for the Repository. + + + The level map defines the mappings between + level names and objects in + this repository. + + + + + + The threshold for all events in this repository + + + The threshold for all events in this repository + + + + The threshold for all events in this repository. + + + + + + Flag indicates if this repository has been configured. + + + Flag indicates if this repository has been configured. + + + + Flag indicates if this repository has been configured. + + + + + + Collection of internal messages captured during the most + recent configuration process. + + + + + Event to notify that the repository has been shutdown. + + + Event to notify that the repository has been shutdown. + + + + Event raised when the repository has been shutdown. + + + + + + Event to notify that the repository has had its configuration reset. + + + Event to notify that the repository has had its configuration reset. + + + + Event raised when the repository's configuration has been + reset to default. + + + + + + Event to notify that the repository has had its configuration changed. + + + Event to notify that the repository has had its configuration changed. + + + + Event raised when the repository's configuration has been changed. + + + + + + Repository specific properties + + + Repository specific properties + + + + These properties can be specified on a repository specific basis. + + + + + + Default Constructor + + + + Initializes the repository with default (empty) properties. + + + + + + Construct the repository using specific properties + + the properties to set for this repository + + + Initializes the repository with specified properties. + + + + + + Test if logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the repository. If so return + its reference, otherwise returns null. + + + + + + Returns all the currently defined loggers in the repository + + All the defined loggers + + + Returns all the currently defined loggers in the repository as an Array. + + + + + + Return a new logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Return a new logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + + Shutdown the repository + + + + Shutdown the repository. Can be overridden in a subclass. + This base class implementation notifies the + listeners and all attached plugins of the shutdown event. + + + + + + Reset the repositories configuration to a default state + + + + Reset all values contained in this instance to their + default state. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this repository. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + The fully qualified type of the LoggerRepositorySkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Adds an object renderer for a specific class. + + The type that will be rendered by the renderer supplied. + The object renderer used to render the object. + + + Adds an object renderer for a specific class. + + + + + + Notify the registered listeners that the repository is shutting down + + Empty EventArgs + + + Notify any listeners that this repository is shutting down. + + + + + + Notify the registered listeners that the repository has had its configuration reset + + Empty EventArgs + + + Notify any listeners that this repository's configuration has been reset. + + + + + + Notify the registered listeners that the repository has had its configuration changed + + Empty EventArgs + + + Notify any listeners that this repository's configuration has changed. + + + + + + Raise a configuration changed event on this repository + + EventArgs.Empty + + + Applications that programmatically change the configuration of the repository should + raise this event notification to notify listeners. + + + + + + The name of the repository + + + The string name of the repository + + + + The name of this repository. The name is + used to store and lookup the repositories + stored by the . + + + + + + The threshold for all events in this repository + + + The threshold for all events in this repository + + + + The threshold for all events in this repository + + + + + + RendererMap accesses the object renderer map for this repository. + + + RendererMap accesses the object renderer map for this repository. + + + + RendererMap accesses the object renderer map for this repository. + + + The RendererMap holds a mapping between types and + objects. + + + + + + The plugin map for this repository. + + + The plugin map for this repository. + + + + The plugin map holds the instances + that have been attached to this repository. + + + + + + Get the level map for the Repository. + + + + Get the level map for the Repository. + + + The level map defines the mappings between + level names and objects in + this repository. + + + + + + Flag indicates if this repository has been configured. + + + Flag indicates if this repository has been configured. + + + + Flag indicates if this repository has been configured. + + + + + + Contains a list of internal messages captures during the + last configuration. + + + + + Event to notify that the repository has been shutdown. + + + Event to notify that the repository has been shutdown. + + + + Event raised when the repository has been shutdown. + + + + + + Event to notify that the repository has had its configuration reset. + + + Event to notify that the repository has had its configuration reset. + + + + Event raised when the repository's configuration has been + reset to default. + + + + + + Event to notify that the repository has had its configuration changed. + + + Event to notify that the repository has had its configuration changed. + + + + Event raised when the repository's configuration has been changed. + + + + + + Repository specific properties + + + Repository specific properties + + + These properties can be specified on a repository specific basis + + + + + Basic Configurator interface for repositories + + + + Interface used by basic configurator to configure a + with a default . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified appender + + the appender to use to log all logging events + + + Configure the repository to route all logging events to the + specified appender. + + + + + + Initialize the repository using the specified appenders + + the appenders to use to log all logging events + + + Configure the repository to route all logging events to the + specified appenders. + + + + + + Configure repository using XML + + + + Interface used by Xml configurator to configure a . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified config + + the element containing the root of the config + + + The schema for the XML configuration data is defined by + the implementation. + + + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Construct with properties + + The properties to pass to this repository. + + + Initializes a new instance of the class. + + + + + + Construct with a logger factory + + The factory to use to create new logger instances. + + + Initializes a new instance of the class with + the specified . + + + + + + Construct with properties and a logger factory + + The properties to pass to this repository. + The factory to use to create new logger instances. + + + Initializes a new instance of the class with + the specified . + + + + + + Test if a logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the hierarchy. If so return + its reference, otherwise returns null. + + + + + + Returns all the currently defined loggers in the hierarchy as an Array + + All the defined loggers + + + Returns all the currently defined loggers in the hierarchy as an Array. + The root logger is not included in the returned + enumeration. + + + + + + Return a new logger instance named as the first parameter using + the default factory. + + + + Return a new logger instance named as the first parameter using + the default factory. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + The name of the logger to retrieve + The logger object with the name specified + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The Shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Reset all values contained in this hierarchy instance to their default. + + + + Reset all values contained in this hierarchy instance to their + default. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this hierarchy. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Returns all the Appenders that are currently configured + + An array containing all the currently configured appenders + + + Returns all the instances that are currently configured. + All the loggers are searched for appenders. The appenders may also be containers + for appenders and these are also searched for additional loggers. + + + The list returned is unordered but does not contain duplicates. + + + + + + Collect the appenders from an . + The appender may also be a container. + + + + + + + Collect the appenders from an container + + + + + + + Initialize the log4net system using the specified appender + + the appender to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Test if this hierarchy is disabled for the specified . + + The level to check against. + + true if the repository is disabled for the level argument, false otherwise. + + + + If this hierarchy has not been configured then this method will + always return true. + + + This method will return true if this repository is + disabled for level object passed as parameter and + false otherwise. + + + See also the property. + + + + + + Clear all logger definitions from the internal hashtable + + + + This call will clear all logger definitions from the internal + hashtable. Invoking this method will irrevocably mess up the + logger hierarchy. + + + You should really know what you are doing before + invoking this method. + + + + + + Return a new logger instance named as the first parameter using + . + + The name of the logger to retrieve + The factory that will make the new logger instance + The logger object with the name specified + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated by the + parameter and linked with its existing + ancestors as well as children. + + + + + + Sends a logger creation event to all registered listeners + + The newly created logger + + Raises the logger creation event. + + + + + Updates all the parents of the specified logger + + The logger to update the parents for + + + This method loops through all the potential parents of + . There 3 possible cases: + + + + No entry for the potential parent of exists + + We create a ProvisionNode for this potential + parent and insert in that provision node. + + + + The entry is of type Logger for the potential parent. + + The entry is 's nearest existing parent. We + update 's parent field with this entry. We also break from + he loop because updating our parent's parent is our parent's + responsibility. + + + + The entry is of type ProvisionNode for this potential parent. + + We add to the list of children for this + potential parent. + + + + + + + + Replace a with a in the hierarchy. + + + + + + We update the links for all the children that placed themselves + in the provision node 'pn'. The second argument 'log' is a + reference for the newly created Logger, parent of all the + children in 'pn'. + + + We loop on all the children 'c' in 'pn'. + + + If the child 'c' has been already linked to a child of + 'log' then there is no need to update 'c'. + + + Otherwise, we set log's parent field to c's parent and set + c's parent field to log. + + + + + + Define or redefine a Level using the values in the argument + + the level values + + + Define or redefine a Level using the values in the argument + + + Supports setting levels via the configuration file. + + + + + + Set a Property using the values in the argument + + the property value + + + Set a Property using the values in the argument. + + + Supports setting property values via the configuration file. + + + + + + The fully qualified type of the Hierarchy class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Event used to notify that a logger has been created. + + + + Event raised when a logger is created. + + + + + + Has no appender warning been emitted + + + + Flag to indicate if we have already issued a warning + about not having an appender warning. + + + + + + Get the root of this hierarchy + + + + Get the root of this hierarchy. + + + + + + Gets or sets the default instance. + + The default + + + The logger factory is used to create logger instances. + + + + + + A class to hold the value, name and display name for a level + + + + A class to hold the value, name and display name for a level + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + Value of the level + + + + If the value is not set (defaults to -1) the value will be looked + up for the current level with the same name. + + + + + + Name of the level + + + The name of the level + + + + The name of the level. + + + + + + Display name for the level + + + The display name of the level + + + + The display name of the level. + + + + + + Used internally to accelerate hash table searches. + + + + Internal class used to improve performance of + string keyed hashtables. + + + The hashcode of the string is cached for reuse. + The string is stored as an interned value. + When comparing two objects for equality + the reference equality of the interned strings is compared. + + + Nicko Cadell + Gert Driesen + + + + Construct key with string name + + + + Initializes a new instance of the class + with the specified name. + + + Stores the hashcode of the string and interns + the string key to optimize comparisons. + + + The Compact Framework 1.0 the + method does not work. On the Compact Framework + the string keys are not interned nor are they + compared by reference. + + + The name of the logger. + + + + Returns a hash code for the current instance. + + A hash code for the current instance. + + + Returns the cached hashcode. + + + + + + Determines whether two instances + are equal. + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + Compares the references of the interned strings. + + + + + + Provision nodes are used where no logger instance has been specified + + + + instances are used in the + when there is no specified + for that node. + + + A provision node holds a list of child loggers on behalf of + a logger that does not exist. + + + Nicko Cadell + Gert Driesen + + + + Create a new provision node with child node + + A child logger to add to this node. + + + Initializes a new instance of the class + with the specified child logger. + + + + + + The sits at the root of the logger hierarchy tree. + + + + The is a regular except + that it provides several guarantees. + + + First, it cannot be assigned a null + level. Second, since the root logger cannot have a parent, the + property always returns the value of the + level field without walking the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Construct a + + The level to assign to the root logger. + + + Initializes a new instance of the class with + the specified logging level. + + + The root logger names itself as "root". However, the root + logger cannot be retrieved by name. + + + + + + The fully qualified type of the RootLogger class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets the assigned level value without walking the logger hierarchy. + + The assigned level value without walking the logger hierarchy. + + + Because the root logger cannot have a parent and its level + must not be null this property just returns the + value of . + + + + + + Gets or sets the assigned for the root logger. + + + The of the root logger. + + + + Setting the level of the root logger to a null reference + may have catastrophic results. We prevent this here. + + + + + + Initializes the log4net environment using an XML DOM. + + + + Configures a using an XML DOM. + + + Nicko Cadell + Gert Driesen + + + + Construct the configurator for a hierarchy + + The hierarchy to build. + + + Initializes a new instance of the class + with the specified . + + + + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + The root element to parse. + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + + + + + Parse appenders by IDREF. + + The appender ref element. + The instance of the appender that the ref refers to. + + + Parse an XML element that represents an appender and return + the appender. + + + + + + Parses an appender element. + + The appender element. + The appender instance or null when parsing failed. + + + Parse an XML element that represents an appender and return + the appender instance. + + + + + + Parses a logger element. + + The logger element. + + + Parse an XML element that represents a logger. + + + + + + Parses the root logger element. + + The root element. + + + Parse an XML element that represents the root logger. + + + + + + Parses the children of a logger element. + + The category element. + The logger instance. + Flag to indicate if the logger is the root logger. + + + Parse the child elements of a <logger> element. + + + + + + Parses an object renderer. + + The renderer element. + + + Parse an XML element that represents a renderer. + + + + + + Parses a level element. + + The level element. + The logger object to set the level on. + Flag to indicate if the logger is the root logger. + + + Parse an XML element that represents a level. + + + + + + Sets a parameter on an object. + + The parameter element. + The object to set the parameter on. + + The parameter name must correspond to a writable property + on the object. The value of the parameter is a string, + therefore this function will attempt to set a string + property first. If unable to set a string property it + will inspect the property and its argument type. It will + attempt to call a static method called Parse on the + type of the property. This method will take a single + string argument and return a value that can be used to + set the property. + + + + + Test if an element has no attributes or child elements + + the element to inspect + true if the element has any attributes or child elements, false otherwise + + + + Test if a is constructible with Activator.CreateInstance. + + the type to inspect + true if the type is creatable using a default constructor, false otherwise + + + + Look for a method on the that matches the supplied + + the type that has the method + the name of the method + the method info found + + + The method must be a public instance method on the . + The method must be named or "Add" followed by . + The method must take a single parameter. + + + + + + Converts a string value to a target type. + + The type of object to convert the string to. + The string value to use as the value of the object. + + + An object of type with value or + null when the conversion could not be performed. + + + + + + Creates an object as specified in XML. + + The XML element that contains the definition of the object. + The object type to use if not explicitly specified. + The type that the returned object must be or must inherit from. + The object or null + + + Parse an XML element and create an object instance based on the configuration + data. + + + The type of the instance may be specified in the XML. If not + specified then the is used + as the type. However the type is specified it must support the + type. + + + + + + key: appenderName, value: appender. + + + + + The Hierarchy being configured. + + + + + The fully qualified type of the XmlHierarchyConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + + + + + + + + + + + + + + + + + Delegate used to handle logger repository shutdown event notifications + + The that is shutting down. + Empty event args + + + Delegate used to handle logger repository shutdown event notifications. + + + + + + Delegate used to handle logger repository configuration reset event notifications + + The that has had its configuration reset. + Empty event args + + + Delegate used to handle logger repository configuration reset event notifications. + + + + + + Delegate used to handle event notifications for logger repository configuration changes. + + The that has had its configuration changed. + Empty event arguments. + + + Delegate used to handle event notifications for logger repository configuration changes. + + + + + + Write the name of the current AppDomain to the output + + + + Write the name of the current AppDomain to the output writer + + + Nicko Cadell + + + + Write the name of the current AppDomain to the output + + the writer to write to + null, state is not set + + + Writes name of the current AppDomain to the output . + + + + + + Write the current date to the output + + + + Date pattern converter, uses a to format + the current date and time to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,fff" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The date and time is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + The used to render the date to a string + + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current date to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date and time passed is in the local time zone. + + + + + + The fully qualified type of the DatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write an folder path to the output + + + + Write an special path environment folder path to the output writer. + The value of the determines + the name of the variable to output. + should be a value in the enumeration. + + + Ron Grabowski + + + + Write an special path environment folder path to the output + + the writer to write to + null, state is not set + + + Writes the special path environment folder path to the output . + The name of the special path environment folder path to output must be set + using the + property. + + + + + + The fully qualified type of the EnvironmentFolderPathPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write an environment variable to the output + + + + Write an environment variable to the output writer. + The value of the determines + the name of the variable to output. + + + Nicko Cadell + + + + Write an environment variable to the output + + the writer to write to + null, state is not set + + + Writes the environment variable to the output . + The name of the environment variable to output must be set + using the + property. + + + + + + The fully qualified type of the EnvironmentPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current thread identity to the output + + + + Write the current thread identity to the output writer + + + Nicko Cadell + + + + Write the current thread identity to the output + + the writer to write to + null, state is not set + + + Writes the current thread identity to the output . + + + + + + The fully qualified type of the IdentityPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Pattern converter for literal string instances in the pattern + + + + Writes the literal string value specified in the + property to + the output. + + + Nicko Cadell + + + + Set the next converter in the chain + + The next pattern converter in the chain + The next pattern converter + + + Special case the building of the pattern converter chain + for instances. Two adjacent + literals in the pattern can be represented by a single combined + pattern converter. This implementation detects when a + is added to the chain + after this converter and combines its value with this converter's + literal value. + + + + + + Write the literal to the output + + the writer to write to + null, not set + + + Override the formatting behavior to ignore the FormattingInfo + because we have a literal instead. + + + Writes the value of + to the output . + + + + + + Convert this pattern into the rendered message + + that will receive the formatted result. + null, not set + + + This method is not used. + + + + + + Writes a newline to the output + + + + Writes the system dependent line terminator to the output. + This behavior can be overridden by setting the : + + + + Option Value + Output + + + DOS + DOS or Windows line terminator "\r\n" + + + UNIX + UNIX line terminator "\n" + + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current process ID to the output + + + + Write the current process ID to the output writer + + + Nicko Cadell + + + + Write the current process ID to the output + + the writer to write to + null, state is not set + + + Write the current process ID to the output . + + + + + + The fully qualified type of the ProcessIdPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Property pattern converter + + + + This pattern converter reads the thread and global properties. + The thread properties take priority over global properties. + See for details of the + thread properties. See for + details of the global properties. + + + If the is specified then that will be used to + lookup a single property. If no is specified + then all properties will be dumped as a list of key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + null, state is not set + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + A Pattern converter that generates a string of random characters + + + + The converter generates a string of random characters. By default + the string is length 4. This can be changed by setting the + to the string value of the length required. + + + The random characters in the string are limited to uppercase letters + and numbers only. + + + The random number generator used by this class is not cryptographically secure. + + + Nicko Cadell + + + + Shared random number generator + + + + + Length of random string to generate. Default length 4. + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write a randoim string to the output + + the writer to write to + null, state is not set + + + Write a randoim string to the output . + + + + + + The fully qualified type of the RandomStringPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current threads username to the output + + + + Write the current threads username to the output writer + + + Nicko Cadell + + + + Write the current threads username to the output + + the writer to write to + null, state is not set + + + Write the current threads username to the output . + + + + + + The fully qualified type of the UserNamePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the UTC date time to the output + + + + Date pattern converter, uses a to format + the current date and time in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Write the current date and time to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date is in Universal time when it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Type converter for Boolean. + + + + Supports conversion from string to bool type. + + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Convert the source object to the type supported by this object + + the object to convert + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Exception base type for conversion errors. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class + with the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + An instance of the . + + + Creates a new instance of the class. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + A nested exception to include. + An instance of the . + + + Creates a new instance of the class. + + + + + + Register of type converters for specific types. + + + + Maintains a registry of type converters used to convert between + types. + + + Use the and + methods to register new converters. + The and methods + lookup appropriate converters to use. + + + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + Initializes a new instance of the class. + + + + + Static constructor. + + + + This constructor defines the intrinsic type converters. + + + + + + Adds a converter for a specific type. + + The type being converted to. + The type converter to use to convert to the destination type. + + + Adds a converter instance for a specific type. + + + + + + Adds a converter for a specific type. + + The type being converted to. + The type of the type converter to use to convert to the destination type. + + + Adds a converter for a specific type. + + + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted from. + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + Gets the type converter to use to convert values to the destination type. + + + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + Gets the type converter to use to convert values to the destination type. + + + + + + Lookups the type converter to use as specified by the attributes on the + destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + + Creates the instance of the type converter. + + The type of the type converter. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + The type specified for the type converter must implement + the or interfaces + and must have a public default (no argument) constructor. + + + + + + The fully qualified type of the ConverterRegistry class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Mapping from to type converter. + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an encoding + the encoding + + + Uses the method to + convert the argument to an . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Interface supported by type converters + + + + This interface supports conversion from a single type to arbitrary types. + See . + + + Nicko Cadell + + + + Returns whether this converter can convert the object to the specified type + + A Type that represents the type you want to convert to + true if the conversion is possible + + + Test if the type supported by this converter can be converted to the + . + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Converts the (which must be of the type supported + by this converter) to the specified.. + + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an IPAddress + the IPAddress + + + Uses the method to convert the + argument to an . + If that fails then the string is resolved as a DNS hostname. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Valid characters in an IPv4 or IPv6 address string. (Does not support subnets) + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternLayout + the PatternLayout + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Convert between string and + + + + Supports conversion from string to type, + and from a type to a string. + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the target type be converted to the type supported by this object + + A that represents the type you want to convert to + true if the conversion is possible + + + Returns true if the is + assignable from a type. + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + . To check for this condition use the + method. + + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternString + the PatternString + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a Type + the Type + + + Uses the method to convert the + argument to a . + Additional effort is made to locate partially specified types + by searching the loaded assemblies. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Attribute used to associate a type converter + + + + Class and Interface level attribute that specifies a type converter + to use with the associated type. + + + To associate a type converter with a target type apply a + TypeConverterAttribute to the target type. Specify the + type of the type converter on the attribute. + + + Nicko Cadell + Gert Driesen + + + + The string type name of the type converter + + + + + Default constructor + + + + Default constructor + + + + + + Create a new type converter attribute for the specified type name + + The string type name of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + Create a new type converter attribute for the specified type + + The type of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + The string type name of the type converter + + + The string type name of the type converter + + + + The type specified must implement the + or the interfaces. + + + + + + A straightforward implementation of the interface. + + + + This is the default implementation of the + interface. Implementors of the interface + should aggregate an instance of this type. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Append on on all attached appenders. + + The event being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Append on on all attached appenders. + + The array of events being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Calls the DoAppende method on the with + the objects supplied. + + The appender + The events + + + If the supports the + interface then the will be passed + through using that interface. Otherwise the + objects in the array will be passed one at a time. + + + + + + Attaches an appender. + + The appender to add. + + + If the appender is already in the list it won't be added again. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Lookup an attached appender by name. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + List of appenders + + + + + Array of appenders, used to cache the m_appenderList + + + + + The fully qualified type of the AppenderAttachedImpl class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets all attached appenders. + + + A collection of attached appenders, or null if there + are no attached appenders. + + + + The read only collection of all currently attached appenders. + + + + + + This class aggregates several PropertiesDictionary collections together. + + + + Provides a dictionary style lookup over an ordered list of + collections. + + + Nicko Cadell + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Add a Properties Dictionary to this composite collection + + the properties to add + + + Properties dictionaries added first take precedence over dictionaries added + later. + + + + + + Flatten this composite collection into a single properties dictionary + + the flattened dictionary + + + Reduces the collection of ordered dictionaries to a single dictionary + containing the resultant values for the keys. + + + + + + Gets the value of a property + + + The value for the property with the specified key + + + + Looks up the value for the specified. + The collections are searched + in the order in which they were added to this collection. The value + returned is the value held by the first collection that contains + the specified key. + + + If none of the collections contain the specified key then + null is returned. + + + + + + Base class for Context Properties implementations + + + + This class defines a basic property get set accessor + + + Nicko Cadell + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Gets or sets the value of a property + + + + + + Wrapper class used to map converter names to converter types + + + + Pattern converter info class used during configuration by custom + PatternString and PatternLayer converters. + + + + + + default constructor + + + + + + + + + + + Gets or sets the name of the conversion pattern + + + + The name of the pattern in the format string + + + + + + Gets or sets the type of the converter + + + + The value specified must extend the + type. + + + + + + + + + + + Subclass of that maintains a count of + the number of bytes written. + + + + This writer counts the number of bytes written. + + + Nicko Cadell + Gert Driesen + + + + that does not leak exceptions + + + + does not throw exceptions when things go wrong. + Instead, it delegates error handling to its . + + + Nicko Cadell + Gert Driesen + + + + Adapter that extends and forwards all + messages to an instance of . + + + + Adapter that extends and forwards all + messages to an instance of . + + + Nicko Cadell + + + + The writer to forward messages to + + + + + Create an instance of that forwards all + messages to a . + + The to forward to + + + Create an instance of that forwards all + messages to a . + + + + + + Closes the writer and releases any system resources associated with the writer + + + + + + + + + Dispose this writer + + flag indicating if we are being disposed + + + Dispose this writer + + + + + + Flushes any buffered output + + + + Clears all buffers for the writer and causes any buffered data to be written + to the underlying device + + + + + + Writes a character to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a character to the wrapped TextWriter + + + + + + Writes a character buffer to the wrapped TextWriter + + the data buffer + the start index + the number of characters to write + + + Writes a character buffer to the wrapped TextWriter + + + + + + Writes a string to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a string to the wrapped TextWriter + + + + + + Gets or sets the underlying . + + + The underlying . + + + + Gets or sets the underlying . + + + + + + The Encoding in which the output is written + + + The + + + + The Encoding in which the output is written + + + + + + Gets an object that controls formatting + + + The format provider + + + + Gets an object that controls formatting + + + + + + Gets or sets the line terminator string used by the TextWriter + + + The line terminator to use + + + + Gets or sets the line terminator string used by the TextWriter + + + + + + Constructor + + the writer to actually write to + the error handler to report error to + + + Create a new QuietTextWriter using a writer and error handler + + + + + + Writes a character to the underlying writer + + the char to write + + + Writes a character to the underlying writer + + + + + + Writes a buffer to the underlying writer + + the buffer to write + the start index to write from + the number of characters to write + + + Writes a buffer to the underlying writer + + + + + + Writes a string to the output. + + The string data to write to the output. + + + Writes a string to the output. + + + + + + Closes the underlying output writer. + + + + Closes the underlying output writer. + + + + + + The error handler instance to pass all errors to + + + + + Flag to indicate if this writer is closed + + + + + Gets or sets the error handler that all errors are passed to. + + + The error handler that all errors are passed to. + + + + Gets or sets the error handler that all errors are passed to. + + + + + + Gets a value indicating whether this writer is closed. + + + true if this writer is closed, otherwise false. + + + + Gets a value indicating whether this writer is closed. + + + + + + Constructor + + The to actually write to. + The to report errors to. + + + Creates a new instance of the class + with the specified and . + + + + + + Writes a character to the underlying writer and counts the number of bytes written. + + the char to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a buffer to the underlying writer and counts the number of bytes written. + + the buffer to write + the start index to write from + the number of characters to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a string to the output and counts the number of bytes written. + + The string data to write to the output. + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Total number of bytes written. + + + + + Gets or sets the total number of bytes written. + + + The total number of bytes written. + + + + Gets or sets the total number of bytes written. + + + + + + A fixed size rolling buffer of logging events. + + + + An array backed fixed size leaky bucket. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The maximum number of logging events in the buffer. + + + Initializes a new instance of the class with + the specified maximum number of buffered logging events. + + + The argument is not a positive integer. + + + + Appends a to the buffer. + + The event to append to the buffer. + The event discarded from the buffer, if the buffer is full, otherwise null. + + + Append an event to the buffer. If the buffer still contains free space then + null is returned. If the buffer is full then an event will be dropped + to make space for the new event, the event dropped is returned. + + + + + + Get and remove the oldest event in the buffer. + + The oldest logging event in the buffer + + + Gets the oldest (first) logging event in the buffer and removes it + from the buffer. + + + + + + Pops all the logging events from the buffer into an array. + + An array of all the logging events in the buffer. + + + Get all the events in the buffer and clear the buffer. + + + + + + Clear the buffer + + + + Clear the buffer of all events. The events in the buffer are lost. + + + + + + Gets the th oldest event currently in the buffer. + + The th oldest event currently in the buffer. + + + If is outside the range 0 to the number of events + currently in the buffer, then null is returned. + + + + + + Gets the maximum size of the buffer. + + The maximum size of the buffer. + + + Gets the maximum size of the buffer + + + + + + Gets the number of logging events in the buffer. + + The number of logging events in the buffer. + + + This number is guaranteed to be in the range 0 to + (inclusive). + + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + The singleton instance of the empty collection. + + + + + Gets the singleton instance of the empty collection. + + The singleton instance of the empty collection. + + + Gets the singleton instance of the empty collection. + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the . + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Adds an element with the provided key and value to the + . + + The to use as the key of the element to add. + The to use as the value of the element to add. + + + As the collection is empty no new values can be added. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Removes all elements from the . + + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Determines whether the contains an element + with the specified key. + + The key to locate in the . + false + + + As the collection is empty the method always returns false. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Removes the element with the specified key from the . + + The key of the element to remove. + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + The singleton instance of the empty dictionary. + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + Gets a value indicating whether the has a fixed size. + + true + + + As the collection is empty always returns true. + + + + + + Gets a value indicating whether the is read-only. + + true + + + As the collection is empty always returns true. + + + + + + Gets an containing the keys of the . + + An containing the keys of the . + + + As the collection is empty a is returned. + + + + + + Gets an containing the values of the . + + An containing the values of the . + + + As the collection is empty a is returned. + + + + + + Gets or sets the element with the specified key. + + The key of the element to get or set. + null + + + As the collection is empty no values can be looked up or stored. + If the index getter is called then null is returned. + A is thrown if the setter is called. + + + This dictionary is always empty and cannot be modified. + + + + Contain the information obtained when parsing formatting modifiers + in conversion modifiers. + + + + Holds the formatting information extracted from the format string by + the . This is used by the + objects when rendering the output. + + + Nicko Cadell + Gert Driesen + + + + Defaut Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + + + Initializes a new instance of the class + with the specified parameters. + + + + + + Gets or sets the minimum value. + + + The minimum value. + + + + Gets or sets the minimum value. + + + + + + Gets or sets the maximum value. + + + The maximum value. + + + + Gets or sets the maximum value. + + + + + + Gets or sets a flag indicating whether left align is enabled + or not. + + + A flag indicating whether left align is enabled or not. + + + + Gets or sets a flag indicating whether left align is enabled or not. + + + + + + Implementation of Properties collection for the + + + + This class implements a properties collection that is thread safe and supports both + storing properties and capturing a read only copy of the current propertied. + + + This class is optimized to the scenario where the properties are read frequently + and are modified infrequently. + + + Nicko Cadell + + + + The read only copy of the properties. + + + + This variable is declared volatile to prevent the compiler and JIT from + reordering reads and writes of this thread performed on different threads. + + + + + + Lock object used to synchronize updates within this instance + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Remove a property from the global context + + the key for the entry to remove + + + Removing an entry from the global context properties is relatively expensive compared + with reading a value. + + + + + + Clear the global context properties + + + + + Get a readonly immutable copy of the properties + + the current global context properties + + + This implementation is fast because the GlobalContextProperties class + stores a readonly copy of the properties. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Reading the value for a key is faster than setting the value. + When the value is written a new read only copy of + the properties is created. + + + + + + The static class ILogExtensions contains a set of widely used + methods that ease the interaction with the ILog interface implementations. + + + + This class contains methods for logging at different levels and checks the + properties for determining if those logging levels are enabled in the current + configuration. + + + Simple example of logging messages + + using log4net.Util; + + ILog log = LogManager.GetLogger("application-log"); + + log.InfoExt("Application Start"); + log.DebugExt("This is a debug message"); + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is WARN + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is WARN enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is WARN + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is WARN enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is ERROR + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is ERROR enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is ERROR + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is ERROR enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is FATAL + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is FATAL enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is FATAL + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is FATAL enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Manages a mapping from levels to + + + + Manages an ordered mapping from instances + to subclasses. + + + Nicko Cadell + + + + Default constructor + + + + Initialise a new instance of . + + + + + + Add a to this mapping + + the entry to add + + + If a has previously been added + for the same then that entry will be + overwritten. + + + + + + Lookup the mapping for the specified level + + the level to lookup + the for the level or null if no mapping found + + + Lookup the value for the specified level. Finds the nearest + mapping value for the level that is equal to or less than the + specified. + + + If no mapping could be found then null is returned. + + + + + + Initialize options + + + + Caches the sorted list of in an array + + + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + This class stores its properties in a slot on the named + log4net.Util.LogicalThreadContextProperties. + + + The requires a link time + for the + . + If the calling code does not have this permission then this context will be disabled. + It will not store any property values set on it. + + + Nicko Cadell + + + + Flag used to disable this context if we don't have permission to access the CallContext. + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Remove a property + + the key for the entry to remove + + + Remove the value for the specified from the context. + + + + + + Clear all the context properties + + + + Clear all the context properties + + + + + + Get the PropertiesDictionary stored in the LocalDataStoreSlot for this thread. + + create the dictionary if it does not exist, otherwise return null if is does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doings so. + + + + + + Gets the call context get data. + + The peroperties dictionary stored in the call context + + The method has a + security link demand, therfore we must put the method call in a seperate method + that we can wrap in an exception handler. + + + + + Sets the call context data. + + The properties. + + The method has a + security link demand, therfore we must put the method call in a seperate method + that we can wrap in an exception handler. + + + + + The fully qualified type of the LogicalThreadContextProperties class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Get or set the property value for the specified. + + + + + + + + + + + + + Outputs log statements from within the log4net assembly. + + + + Log4net components cannot make log4net logging calls. However, it is + sometimes useful for the user to learn about what log4net is + doing. + + + All log4net internal debug calls go to the standard output stream + whereas internal error messages are sent to the standard error output + stream. + + + Nicko Cadell + Gert Driesen + + + + Formats Prefix, Source, and Message in the same format as the value + sent to Console.Out and Trace.Write. + + + + + + Initializes a new instance of the class. + + + + + + + + + Static constructor that initializes logging by reading + settings from the application configuration file. + + + + The log4net.Internal.Debug application setting + controls internal debugging. This setting should be set + to true to enable debugging. + + + The log4net.Internal.Quiet application setting + suppresses all internal logging including error messages. + This setting should be set to true to enable message + suppression. + + + + + + Raises the LogReceived event when an internal messages is received. + + + + + + + + + Writes log4net internal debug messages to the + standard output stream. + + + The message to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Writes log4net internal debug messages to the + standard output stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal error messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes output to the standard output stream. + + The message to log. + + + Writes to both Console.Out and System.Diagnostics.Trace. + Note that the System.Diagnostics.Trace is not supported + on the Compact Framework. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Writes output to the standard error stream. + + The message to log. + + + Writes to both Console.Error and System.Diagnostics.Trace. + Note that the System.Diagnostics.Trace is not supported + on the Compact Framework. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Default debug level + + + + + In quietMode not even errors generate any output. + + + + + The event raised when an internal message has been received. + + + + + The Type that generated the internal message. + + + + + The DateTime stamp of when the internal message was received. + + + + + A string indicating the severity of the internal message. + + + "log4net: ", + "log4net:ERROR ", + "log4net:WARN " + + + + + The internal log message. + + + + + The Exception related to the message. + + + Optional. Will be null if no Exception was passed. + + + + + Gets or sets a value indicating whether log4net internal logging + is enabled or disabled. + + + true if log4net internal logging is enabled, otherwise + false. + + + + When set to true, internal debug level logging will be + displayed. + + + This value can be set by setting the application setting + log4net.Internal.Debug in the application configuration + file. + + + The default value is false, i.e. debugging is + disabled. + + + + + The following example enables internal debugging using the + application configuration file : + + + + + + + + + + + + + Gets or sets a value indicating whether log4net should generate no output + from internal logging, not even for errors. + + + true if log4net should generate no output at all from internal + logging, otherwise false. + + + + When set to true will cause internal logging at all levels to be + suppressed. This means that no warning or error reports will be logged. + This option overrides the setting and + disables all debug also. + + This value can be set by setting the application setting + log4net.Internal.Quiet in the application configuration file. + + + The default value is false, i.e. internal logging is not + disabled. + + + + The following example disables internal logging using the + application configuration file : + + + + + + + + + + + + + + + + + Test if LogLog.Debug is enabled for output. + + + true if Debug is enabled + + + + Test if LogLog.Debug is enabled for output. + + + + + + Test if LogLog.Warn is enabled for output. + + + true if Warn is enabled + + + + Test if LogLog.Warn is enabled for output. + + + + + + Test if LogLog.Error is enabled for output. + + + true if Error is enabled + + + + Test if LogLog.Error is enabled for output. + + + + + + Subscribes to the LogLog.LogReceived event and stores messages + to the supplied IList instance. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a native error code and message. + + + + Represents a Win32 platform native error. + + + Nicko Cadell + Gert Driesen + + + + Create an instance of the class with the specified + error number and message. + + The number of the native error. + The message of the native error. + + + Create an instance of the class with the specified + error number and message. + + + + + + Create a new instance of the class for the last Windows error. + + + An instance of the class for the last windows error. + + + + The message for the error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Create a new instance of the class. + + the error number for the native error + + An instance of the class for the specified + error number. + + + + The message for the specified error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Retrieves the message corresponding with a Win32 message identifier. + + Message identifier for the requested message. + + The message corresponding with the specified message identifier. + + + + The message will be searched for in system message-table resource(s) + using the native FormatMessage function. + + + + + + Return error information string + + error information string + + + Return error information string + + + + + + Formats a message string. + + Formatting options, and how to interpret the parameter. + Location of the message definition. + Message identifier for the requested message. + Language identifier for the requested message. + If includes FORMAT_MESSAGE_ALLOCATE_BUFFER, the function allocates a buffer using the LocalAlloc function, and places the pointer to the buffer at the address specified in . + If the FORMAT_MESSAGE_ALLOCATE_BUFFER flag is not set, this parameter specifies the maximum number of TCHARs that can be stored in the output buffer. If FORMAT_MESSAGE_ALLOCATE_BUFFER is set, this parameter specifies the minimum number of TCHARs to allocate for an output buffer. + Pointer to an array of values that are used as insert values in the formatted message. + + + The function requires a message definition as input. The message definition can come from a + buffer passed into the function. It can come from a message table resource in an + already-loaded module. Or the caller can ask the function to search the system's message + table resource(s) for the message definition. The function finds the message definition + in a message table resource based on a message identifier and a language identifier. + The function copies the formatted message text to an output buffer, processing any embedded + insert sequences if requested. + + + To prevent the usage of unsafe code, this stub does not support inserting values in the formatted message. + + + + + If the function succeeds, the return value is the number of TCHARs stored in the output + buffer, excluding the terminating null character. + + + If the function fails, the return value is zero. To get extended error information, + call . + + + + + + Gets the number of the native error. + + + The number of the native error. + + + + Gets the number of the native error. + + + + + + Gets the message of the native error. + + + The message of the native error. + + + + + Gets the message of the native error. + + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Test if the enumerator can advance, if so advance. + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + The singleton instance of the . + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current key from the enumerator. + + + Throws an exception because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current value from the enumerator. + + The current value from the enumerator. + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current entry from the enumerator. + + + Throws an because the + never has a current entry. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Test if the enumerator can advance, if so advance + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + The singleton instance of the . + + + + + Get the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + A SecurityContext used when a SecurityContext is not required + + + + The is a no-op implementation of the + base class. It is used where a + is required but one has not been provided. + + + Nicko Cadell + + + + Singleton instance of + + + + Singleton instance of + + + + + + Private constructor + + + + Private constructor for singleton pattern. + + + + + + Impersonate this SecurityContext + + State supplied by the caller + null + + + No impersonation is done and null is always returned. + + + + + + Implements log4net's default error handling policy which consists + of emitting a message for the first error in an appender and + ignoring all subsequent errors. + + + + The error message is processed using the LogLog sub-system by default. + + + This policy aims at protecting an otherwise working application + from being flooded with error messages when logging fails. + + + Nicko Cadell + Gert Driesen + Ron Grabowski + + + + Default Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + The prefix to use for each message. + + + Initializes a new instance of the class + with the specified prefix. + + + + + + Reset the error handler back to its initial disabled state. + + + + + Log an Error + + The error message. + The exception. + The internal error code. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Log the very first error + + The error message. + The exception. + The internal error code. + + + Sends the error information to 's Error method. + + + + + + Log an Error + + The error message. + The exception. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Log an error + + The error message. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + The date the error was recorded. + + + + + Flag to indicate if it is the first error + + + + + The message recorded during the first error. + + + + + The exception recorded during the first error. + + + + + The error code recorded during the first error. + + + + + String to prefix each message with + + + + + The fully qualified type of the OnlyOnceErrorHandler class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Is error logging enabled + + + + Is error logging enabled. Logging is only enabled for the + first error delivered to the . + + + + + + The date the first error that trigged this error handler occured. + + + + + The message from the first error that trigged this error handler. + + + + + The exception from the first error that trigged this error handler. + + + May be . + + + + + The error code from the first error that trigged this error handler. + + + Defaults to + + + + + A convenience class to convert property values to specific types. + + + + Utility functions for converting types and parsing values. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Converts a string to a value. + + String to convert. + The default value. + The value of . + + + If is "true", then true is returned. + If is "false", then false is returned. + Otherwise, is returned. + + + + + + Parses a file size into a number. + + String to parse. + The default value. + The value of . + + + Parses a file size of the form: number[KB|MB|GB] into a + long value. It is scaled with the appropriate multiplier. + + + is returned when + cannot be converted to a value. + + + + + + Converts a string to an object. + + The target type to convert to. + The string to convert to an object. + + The object converted from a string or null when the + conversion failed. + + + + Converts a string to an object. Uses the converter registry to try + to convert the string value into the specified target type. + + + + + + Checks if there is an appropriate type conversion from the source type to the target type. + + The type to convert from. + The type to convert to. + true if there is a conversion from the source type to the target type. + + Checks if there is an appropriate type conversion from the source type to the target type. + + + + + + + Converts an object to the target type. + + The object to convert to the target type. + The type to convert to. + The converted object. + + + Converts an object to the target type. + + + + + + Instantiates an object given a class name. + + The fully qualified class name of the object to instantiate. + The class to which the new object should belong. + The object to return in case of non-fulfillment. + + An instance of the or + if the object could not be instantiated. + + + + Checks that the is a subclass of + . If that test fails or the object could + not be instantiated, then is returned. + + + + + + Performs variable substitution in string from the + values of keys found in . + + The string on which variable substitution is performed. + The dictionary to use to lookup variables. + The result of the substitutions. + + + The variable substitution delimiters are ${ and }. + + + For example, if props contains key=value, then the call + + + + string s = OptionConverter.SubstituteVariables("Value of key is ${key}."); + + + + will set the variable s to "Value of key is value.". + + + If no value could be found for the specified key, then substitution + defaults to an empty string. + + + For example, if system properties contains no value for the key + "nonExistentKey", then the call + + + + string s = OptionConverter.SubstituteVariables("Value of nonExistentKey is [${nonExistentKey}]"); + + + + will set s to "Value of nonExistentKey is []". + + + An Exception is thrown if contains a start + delimiter "${" which is not balanced by a stop delimiter "}". + + + + + + Converts the string representation of the name or numeric value of one or + more enumerated constants to an equivalent enumerated object. + + The type to convert to. + The enum string value. + If true, ignore case; otherwise, regard case. + An object of type whose value is represented by . + + + + The fully qualified type of the OptionConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Most of the work of the class + is delegated to the PatternParser class. + + + + The PatternParser processes a pattern string and + returns a chain of objects. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The pattern to parse. + + + Initializes a new instance of the class + with the specified pattern string. + + + + + + Parses the pattern into a chain of pattern converters. + + The head of a chain of pattern converters. + + + Parses the pattern into a chain of pattern converters. + + + + + + Build the unified cache of converters from the static and instance maps + + the list of all the converter names + + + Build the unified cache of converters from the static and instance maps + + + + + + Internal method to parse the specified pattern to find specified matches + + the pattern to parse + the converter names to match in the pattern + + + The matches param must be sorted such that longer strings come before shorter ones. + + + + + + Process a parsed literal + + the literal text + + + + Process a parsed converter pattern + + the name of the converter + the optional option for the converter + the formatting info for the converter + + + + Resets the internal state of the parser and adds the specified pattern converter + to the chain. + + The pattern converter to add. + + + + The first pattern converter in the chain + + + + + the last pattern converter in the chain + + + + + The pattern + + + + + Internal map of converter identifiers to converter types + + + + This map overrides the static s_globalRulesRegistry map. + + + + + + The fully qualified type of the PatternParser class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Get the converter registry used by this parser + + + The converter registry used by this parser + + + + Get the converter registry used by this parser + + + + + + Sort strings by length + + + + that orders strings by string length. + The longest strings are placed first + + + + + + This class implements a patterned string. + + + + This string has embedded patterns that are resolved and expanded + when the string is formatted. + + + This class functions similarly to the + in that it accepts a pattern and renders it to a string. Unlike the + however the PatternString + does not render the properties of a specific but + of the process in general. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + appdomain + + + Used to output the friendly name of the current AppDomain. + + + + + date + + + Used to output the current date and time in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + env + + + Used to output the a specific environment variable. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %env{COMPUTERNAME} would include the value + of the COMPUTERNAME environment variable. + + + The env pattern is not supported on the .NET Compact Framework. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern name offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + processid + + + Used to output the system process ID for the current process. + + + + + property + + + Used to output a specific context property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are stored in logging contexts. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + random + + + Used to output a random string of characters. The string is made up of + uppercase letters and numbers. By default the string is 4 characters long. + The length of the string can be specified within braces directly following the + pattern specifier, e.g. %random{8} would output an 8 character string. + + + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + % + + + The sequence %% outputs a single percent sign. + + + + + + Additional pattern converters may be registered with a specific + instance using or + . + + + See the for details on the + format modifiers supported by the patterns. + + + Nicko Cadell + + + + Internal map of converter identifiers to converter types. + + + + + the pattern + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternString only + + + + + Initialize the global registry + + + + + Default constructor + + + + Initialize a new instance of + + + + + + Constructs a PatternString + + The pattern to use with this PatternString + + + Initialize a new instance of with the pattern specified. + + + + + + Initialize object options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Create the used to parse the pattern + + the pattern to parse + The + + + Returns PatternParser used to parse the conversion string. Subclasses + may override this to return a subclass of PatternParser which recognize + custom conversion pattern name. + + + + + + Produces a formatted string as specified by the conversion pattern. + + The TextWriter to write the formatted event to + + + Format the pattern to the . + + + + + + Format the pattern as a string + + the pattern formatted as a string + + + Format the pattern to a string. + + + + + + Add a converter to this PatternString + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + + + + + + Add a converter to this PatternString + + the name of the conversion pattern for this converter + the type of the converter + + + Add a converter to this PatternString + + + + + + Gets or sets the pattern formatting string + + + The pattern formatting string + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + String keyed object map. + + + + While this collection is serializable only member + objects that are serializable will + be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + String keyed object map that is read only. + + + + This collection is readonly and cannot be modified. + + + While this collection is serializable only member + objects that are serializable will + be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + The Hashtable used to store the properties data + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Copy Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Deserialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the key names. + + An array of all the keys. + + + Gets the key names. + + + + + + Test if the dictionary contains a specified key + + the key to look for + true if the dictionary contains the specified key + + + Test if the dictionary contains a specified key + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + Serializes this object into the provided. + + + + + + See + + + + + See + + + + + + See + + + + + + + Remove all properties from the properties collection + + + + + See + + + + + + + See + + + + + + + See + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key. + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + The hashtable used to store the properties + + + The internal collection used to store the properties + + + + The hashtable used to store the properties + + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + The number of properties in this collection + + + + + See + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Initializes a new instance of the class + with serialized data. + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Because this class is sealed the serialization constructor is private. + + + + + + Remove the entry with the specified key from this dictionary + + the key for the entry to remove + + + Remove the entry with the specified key from this dictionary + + + + + + See + + an enumerator + + + Returns a over the contest of this collection. + + + + + + See + + the key to remove + + + Remove the entry with the specified key from this dictionary + + + + + + See + + the key to lookup in the collection + true if the collection contains the specified key + + + Test if this collection contains a specified key. + + + + + + Remove all properties from the properties collection + + + + Remove all properties from the properties collection + + + + + + See + + the key + the value to store for the key + + + Store a value for the specified . + + + Thrown if the is not a string + + + + See + + + + + + + See + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key. + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + See + + + false + + + + This collection is modifiable. This property always + returns false. + + + + + + See + + + The value for the key specified. + + + + Get or set a value for the specified . + + + Thrown if the is not a string + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + A class to hold the key and data for a property set in the config file + + + + A class to hold the key and data for a property set in the config file + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + Property Key + + + Property Key + + + + Property Key. + + + + + + Property Value + + + Property Value + + + + Property Value. + + + + + + A that ignores the message + + + + This writer is used in special cases where it is necessary + to protect a writer from being closed by a client. + + + Nicko Cadell + + + + Constructor + + the writer to actually write to + + + Create a new ProtectCloseTextWriter using a writer + + + + + + Attach this instance to a different underlying + + the writer to attach to + + + Attach this instance to a different underlying + + + + + + Does not close the underlying output writer. + + + + Does not close the underlying output writer. + This method does nothing. + + + + + + Defines a lock that supports single writers and multiple readers + + + + ReaderWriterLock is used to synchronize access to a resource. + At any given time, it allows either concurrent read access for + multiple threads, or write access for a single thread. In a + situation where a resource is changed infrequently, a + ReaderWriterLock provides better throughput than a simple + one-at-a-time lock, such as . + + + If a platform does not support a System.Threading.ReaderWriterLock + implementation then all readers and writers are serialized. Therefore + the caller must not rely on multiple simultaneous readers. + + + Nicko Cadell + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Acquires a reader lock + + + + blocks if a different thread has the writer + lock, or if at least one thread is waiting for the writer lock. + + + + + + Decrements the lock count + + + + decrements the lock count. When the count + reaches zero, the lock is released. + + + + + + Acquires the writer lock + + + + This method blocks if another thread has a reader lock or writer lock. + + + + + + Decrements the lock count on the writer lock + + + + ReleaseWriterLock decrements the writer lock count. + When the count reaches zero, the writer lock is released. + + + + + + A that can be and reused + + + + A that can be and reused. + This uses a single buffer for string operations. + + + Nicko Cadell + + + + Create an instance of + + the format provider to use + + + Create an instance of + + + + + + Override Dispose to prevent closing of writer + + flag + + + Override Dispose to prevent closing of writer + + + + + + Reset this string writer so that it can be reused. + + the maximum buffer capacity before it is trimmed + the default size to make the buffer + + + Reset this string writer so that it can be reused. + The internal buffers are cleared and reset. + + + + + + Utility class for system specific information. + + + + Utility class of static methods for system specific information. + + + Nicko Cadell + Gert Driesen + Alexey Solofnenko + + + + Private constructor to prevent instances. + + + + Only static methods are exposed from this type. + + + + + + Initialize default values for private static fields. + + + + Only static methods are exposed from this type. + + + + + + Gets the assembly location path for the specified assembly. + + The assembly to get the location for. + The location of the assembly. + + + This method does not guarantee to return the correct path + to the assembly. If only tries to give an indication as to + where the assembly was loaded from. + + + + + + Gets the fully qualified name of the , including + the name of the assembly from which the was + loaded. + + The to get the fully qualified name for. + The fully qualified name for the . + + + This is equivalent to the Type.AssemblyQualifiedName property, + but this method works on the .NET Compact Framework 1.0 as well as + the full .NET runtime. + + + + + + Gets the short name of the . + + The to get the name for. + The short name of the . + + + The short name of the assembly is the + without the version, culture, or public key. i.e. it is just the + assembly's file name without the extension. + + + Use this rather than Assembly.GetName().Name because that + is not available on the Compact Framework. + + + Because of a FileIOPermission security demand we cannot do + the obvious Assembly.GetName().Name. We are allowed to get + the of the assembly so we + start from there and strip out just the assembly name. + + + + + + Gets the file name portion of the , including the extension. + + The to get the file name for. + The file name of the assembly. + + + Gets the file name portion of the , including the extension. + + + + + + Loads the type specified in the type string. + + A sibling type to use to load the type. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified, it will be loaded from the assembly + containing the specified relative type. If the type is not found in the assembly + then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the + assembly that is directly calling this method. If the type is not found + in the assembly then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + An assembly to load the type from. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the specified + assembly. If the type is not found in the assembly then all the loaded assemblies + will be searched for the type. + + + + + + Generate a new guid + + A new Guid + + + Generate a new guid + + + + + + Create an + + The name of the parameter that caused the exception + The value of the argument that causes this exception + The message that describes the error + the ArgumentOutOfRangeException object + + + Create a new instance of the class + with a specified error message, the parameter name, and the value + of the argument. + + + The Compact Framework does not support the 3 parameter constructor for the + type. This method provides an + implementation that works for all platforms. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Lookup an application setting + + the application settings key to lookup + the value for the key, or null + + + Configuration APIs are not supported under the Compact Framework + + + + + + Convert a path into a fully qualified local file path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + The path specified must be a local file path, a URI is not supported. + + + + + + Creates a new case-insensitive instance of the class with the default initial capacity. + + A new case-insensitive instance of the class with the default initial capacity + + + The new Hashtable instance uses the default load factor, the CaseInsensitiveHashCodeProvider, and the CaseInsensitiveComparer. + + + + + + Gets an empty array of types. + + + + The Type.EmptyTypes field is not available on + the .NET Compact Framework 1.0. + + + + + + The fully qualified type of the SystemInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Cache the host name for the current machine + + + + + Cache the application friendly name + + + + + Text to output when a null is encountered. + + + + + Text to output when an unsupported feature is requested. + + + + + Start time for the current process. + + + + + Gets the system dependent line terminator. + + + The system dependent line terminator. + + + + Gets the system dependent line terminator. + + + + + + Gets the base directory for this . + + The base directory path for the current . + + + Gets the base directory for this . + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the configuration file for the current . + + The path to the configuration file for the current . + + + The .NET Compact Framework 1.0 does not have a concept of a configuration + file. For this runtime, we use the entry assembly location as the root for + the configuration file name. + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the file that first executed in the current . + + The path to the entry assembly. + + + Gets the path to the file that first executed in the current . + + + + + + Gets the ID of the current thread. + + The ID of the current thread. + + + On the .NET framework, the AppDomain.GetCurrentThreadId method + is used to obtain the thread ID for the current thread. This is the + operating system ID for the thread. + + + On the .NET Compact Framework 1.0 it is not possible to get the + operating system thread ID for the current thread. The native method + GetCurrentThreadId is implemented inline in a header file + and cannot be called. + + + On the .NET Framework 2.0 the Thread.ManagedThreadId is used as this + gives a stable id unrelated to the operating system thread ID which may + change if the runtime is using fibers. + + + + + + Get the host name or machine name for the current machine + + + The hostname or machine name + + + + Get the host name or machine name for the current machine + + + The host name () or + the machine name (Environment.MachineName) for + the current machine, or if neither of these are available + then NOT AVAILABLE is returned. + + + + + + Get this application's friendly name + + + The friendly name of this application as a string + + + + If available the name of the application is retrieved from + the AppDomain using AppDomain.CurrentDomain.FriendlyName. + + + Otherwise the file name of the entry assembly is used. + + + + + + Get the start time for the current process. + + + + This is the time at which the log4net library was loaded into the + AppDomain. Due to reports of a hang in the call to System.Diagnostics.Process.StartTime + this is not the start time for the current process. + + + The log4net library should be loaded by an application early during its + startup, therefore this start time should be a good approximation for + the actual start time. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating, however this start time + will be set per AppDomain. + + + + + + Text to output when a null is encountered. + + + + Use this value to indicate a null has been encountered while + outputting a string representation of an item. + + + The default value is (null). This value can be overridden by specifying + a value for the log4net.NullText appSetting in the application's + .config file. + + + + + + Text to output when an unsupported feature is requested. + + + + Use this value when an unsupported feature is requested. + + + The default value is NOT AVAILABLE. This value can be overridden by specifying + a value for the log4net.NotAvailableText appSetting in the application's + .config file. + + + + + + Utility class that represents a format string. + + + + Utility class that represents a format string. + + + Nicko Cadell + + + + Initialise the + + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + + + Format the string and arguments + + the formatted string + + + + Replaces the format item in a specified with the text equivalent + of the value of a corresponding instance in a specified array. + A specified parameter supplies culture-specific formatting information. + + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + A copy of format in which the format items have been replaced by the + equivalent of the corresponding instances of in args. + + + + This method does not throw exceptions. If an exception thrown while formatting the result the + exception and arguments are returned in the result string. + + + + + + Process an error during StringFormat + + + + + Dump the contents of an array into a string builder + + + + + Dump an object to a string + + + + + The fully qualified type of the SystemStringFormat class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + Nicko Cadell + + + + Each thread will automatically have its instance. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Remove a property + + the key for the entry to remove + + + Remove a property + + + + + + Get the keys stored in the properties. + + + Gets the keys stored in the properties. + + a set of the defined keys + + + + Clear all properties + + + + Clear all properties + + + + + + Get the PropertiesDictionary for this thread. + + create the dictionary if it does not exist, otherwise return null if does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doing so. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Gets or sets the value of a property + + + + + + Implementation of Stack for the + + + + Implementation of Stack for the + + + Nicko Cadell + + + + The stack store. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Clears all the contextual information held in this stack. + + + + Clears all the contextual information held in this stack. + Only call this if you think that this tread is being reused after + a previous call execution which may not have completed correctly. + You do not need to use this method if you always guarantee to call + the method of the + returned from even in exceptional circumstances, + for example by using the using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + syntax. + + + + + + Removes the top context from this stack. + + The message in the context that was removed from the top of this stack. + + + Remove the top context from this stack, and return + it to the caller. If this stack is empty then an + empty string (not ) is returned. + + + + + + Pushes a new context message into this stack. + + The new context message. + + An that can be used to clean up the context stack. + + + + Pushes a new context onto this stack. An + is returned that can be used to clean up this stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + { + log.Warn("This should have an ThreadContext Stack message"); + } + + + + + + Gets the current context information for this stack. + + The current context information. + + + + Gets the current context information for this stack. + + Gets the current context information + + + Gets the current context information for this stack. + + + + + + Get a portable version of this object + + the portable instance of this object + + + Get a cross thread portable version of this object + + + + + + The number of messages in the stack + + + The current number of messages in the stack + + + + The current number of messages in the stack. That is + the number of times has been called + minus the number of times has been called. + + + + + + Gets and sets the internal stack used by this + + The internal storage stack + + + This property is provided only to support backward compatability + of the . Tytpically the internal stack should not + be modified. + + + + + + Inner class used to represent a single context frame in the stack. + + + + Inner class used to represent a single context frame in the stack. + + + + + + Constructor + + The message for this context. + The parent context in the chain. + + + Initializes a new instance of the class + with the specified message and parent context. + + + + + + Get the message. + + The message. + + + Get the message. + + + + + + Gets the full text of the context down to the root level. + + + The full text of the context down to the root level. + + + + Gets the full text of the context down to the root level. + + + + + + Struct returned from the method. + + + + This struct implements the and is designed to be used + with the pattern to remove the stack frame at the end of the scope. + + + + + + The ThreadContextStack internal stack + + + + + The depth to trim the stack to when this instance is disposed + + + + + Constructor + + The internal stack used by the ThreadContextStack. + The depth to return the stack to when this object is disposed. + + + Initializes a new instance of the class with + the specified stack and return depth. + + + + + + Returns the stack to the correct depth. + + + + Returns the stack to the correct depth. + + + + + + Implementation of Stacks collection for the + + + + Implementation of Stacks collection for the + + + Nicko Cadell + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets the named thread context stack + + + The named stack + + + + Gets the named thread context stack + + + + + + Utility class for transforming strings. + + + + Utility class for transforming strings. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Write a string to an + + the writer to write to + the string to write + The string to replace non XML compliant chars with + + + The test is escaped either using XML escape entities + or using CDATA sections. + + + + + + Replace invalid XML characters in text string + + the XML text input string + the string to use in place of invalid characters + A string that does not contain invalid XML characters. + + + Certain Unicode code points are not allowed in the XML InfoSet, for + details see: http://www.w3.org/TR/REC-xml/#charsets. + + + This method replaces any illegal characters in the input string + with the mask string specified. + + + + + + Count the number of times that the substring occurs in the text + + the text to search + the substring to find + the number of times the substring occurs in the text + + + The substring is assumed to be non repeating within itself. + + + + + + Characters illegal in XML 1.0 + + + + + Impersonate a Windows Account + + + + This impersonates a Windows account. + + + How the impersonation is done depends on the value of . + This allows the context to either impersonate a set of user credentials specified + using username, domain name and password or to revert to the process credentials. + + + + + + Default constructor + + + + Default constructor + + + + + + Initialize the SecurityContext based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The security context will try to Logon the specified user account and + capture a primary token for impersonation. + + + The required , + or properties were not specified. + + + + Impersonate the Windows account specified by the and properties. + + caller provided state + + An instance that will revoke the impersonation of this SecurityContext + + + + Depending on the property either + impersonate a user using credentials supplied or revert + to the process credentials. + + + + + + Create a given the userName, domainName and password. + + the user name + the domain name + the password + the for the account specified + + + Uses the Windows API call LogonUser to get a principal token for the account. This + token is used to initialize the WindowsIdentity. + + + + + + Gets or sets the impersonation mode for this security context + + + The impersonation mode for this security context + + + + Impersonate either a user with user credentials or + revert this thread to the credentials of the process. + The value is one of the + enum. + + + The default value is + + + When the mode is set to + the user's credentials are established using the + , and + values. + + + When the mode is set to + no other properties need to be set. If the calling thread is + impersonating then it will be reverted back to the process credentials. + + + + + + Gets or sets the Windows username for this security context + + + The Windows username for this security context + + + + This property must be set if + is set to (the default setting). + + + + + + Gets or sets the Windows domain name for this security context + + + The Windows domain name for this security context + + + + The default value for is the local machine name + taken from the property. + + + This property must be set if + is set to (the default setting). + + + + + + Sets the password for the Windows account specified by the and properties. + + + The password for the Windows account specified by the and properties. + + + + This property must be set if + is set to (the default setting). + + + + + + The impersonation modes for the + + + + See the property for + details. + + + + + + Impersonate a user using the credentials supplied + + + + + Revert this the thread to the credentials of the process + + + + + Adds to + + + + Helper class to expose the + through the interface. + + + + + + Constructor + + the impersonation context being wrapped + + + Constructor + + + + + + Revert the impersonation + + + + Revert the impersonation + + + + + + The log4net Global Context. + + + + The GlobalContext provides a location for global debugging + information to be stored. + + + The global context has a properties map and these properties can + be included in the output of log messages. The + supports selecting and outputing these properties. + + + By default the log4net:HostName property is set to the name of + the current machine. + + + + + GlobalContext.Properties["hostname"] = Environment.MachineName; + + + + Nicko Cadell + + + + Private Constructor. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + The global context properties instance + + + + + The global properties map. + + + The global properties map. + + + + The global properties map. + + + + + + Provides information about the environment the assembly has + been built for. + + + + Version of the assembly + + + Version of the framework targeted + + + Type of framework targeted + + + Does it target a client profile? + + + + Identifies the version and target for this assembly. + + + + + The log4net Logical Thread Context. + + + + The LogicalThreadContext provides a location for specific debugging + information to be stored. + The LogicalThreadContext properties override any or + properties with the same name. + + + The Logical Thread Context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Logical Thread Context provides a diagnostic context for the current call context. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Logical Thread Context is managed on a per basis. + + + The requires a link time + for the + . + If the calling code does not have this permission then this context will be disabled. + It will not store any property values set on it. + + + Example of using the thread context properties to store a username. + + LogicalThreadContext.Properties["user"] = userName; + log.Info("This log message has a LogicalThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(LogicalThreadContext.Stacks["LDC"].Push("my context message")) + { + log.Info("This log message has a LogicalThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + Private Constructor. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + The thread context properties instance + + + + + The thread context stacks instance + + + + + The thread properties map + + + The thread properties map + + + + The LogicalThreadContext properties override any + or properties with the same name. + + + + + + The thread stacks + + + stack map + + + + The logical thread stacks. + + + + + + This class is used by client applications to request logger instances. + + + + This class has static methods that are used by a client to request + a logger instance. The method is + used to retrieve a logger. + + + See the interface for more details. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + Returns the named logger if it exists. + + Returns the named logger if it exists. + + + + If the named logger exists (in the default repository) then it + returns a reference to the logger, otherwise it returns null. + + + The fully qualified logger name to look for. + The logger found, or null if no logger could be found. + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the logger doesn't exist in the specified + repository. + + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the repository for the specified assembly) then it + returns a reference to the logger, otherwise it returns + null. + + + The assembly to use to lookup the repository. + The fully qualified logger name to look for. + + The logger, or null if the logger doesn't exist in the specified + assembly's repository. + + + + Get the currently defined loggers. + + Returns all the currently defined loggers in the default repository. + + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to lookup the repository. + + The root logger is not included in the returned array. + + All the defined loggers. + + + Get or create a logger. + + Retrieves or creates a named logger. + + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The name of the logger to retrieve. + The logger with the name specified. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The assembly to use to lookup the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Get the logger for the fully qualified name of the type specified. + + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The repository to lookup in. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The assembly to use to lookup the repository. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + Shutdown a logger repository. + + Shuts down the default repository. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + default repository. + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The repository to shutdown. + + + + Shuts down the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The assembly to use to lookup the repository. + + + Reset the configuration of a repository + + Resets all values contained in this repository instance to their defaults. + + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The repository to reset. + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The assembly to use to lookup the repository to reset. + + + Get the logger repository. + + Returns the default instance. + + + + Gets the for the repository specified + by the callers assembly (). + + + The instance for the default repository. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The repository to lookup in. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The assembly to use to lookup the repository. + + + Get a logger repository. + + Returns the default instance. + + + + Gets the for the repository specified + by the callers assembly (). + + + The instance for the default repository. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The repository to lookup in. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The assembly to use to lookup the repository. + + + Create a domain + + Creates a repository with the specified repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to will return + the same repository instance. + + + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + Create a logger repository. + + Creates a repository with the specified repository type. + + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to will return + the same repository instance. + + + + + + Creates a repository with the specified name. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name. + + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + + Creates a repository for the specified assembly and repository type. + + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + + Gets the list of currently defined repositories. + + + + Get an array of all the objects that have been created. + + + An array of all the known objects. + + + + Looks up the wrapper object for the logger specified. + + The logger to get the wrapper for. + The wrapper for the logger specified. + + + + Looks up the wrapper objects for the loggers specified. + + The loggers to get the wrappers for. + The wrapper objects for the loggers specified. + + + + Create the objects used by + this manager. + + The logger to wrap. + The wrapper for the logger specified. + + + + The wrapper map to use to hold the objects. + + + + + Implementation of Mapped Diagnostic Contexts. + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + The MDC class is similar to the class except that it is + based on a map instead of a stack. It provides mapped + diagnostic contexts. A Mapped Diagnostic Context, or + MDC in short, is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The MDC is managed on a per thread basis. + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + Gets the context value identified by the parameter. + + The key to lookup in the MDC. + The string value held for the key, or a null reference if no corresponding value is found. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + If the parameter does not look up to a + previously defined context then null will be returned. + + + + + + Add an entry to the MDC + + The key to store the value under. + The value to store. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Puts a context value (the parameter) as identified + with the parameter into the current thread's + context map. + + + If a value is already defined for the + specified then the value will be replaced. If the + is specified as null then the key value mapping will be removed. + + + + + + Removes the key value mapping for the key specified. + + The key to remove. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove the specified entry from this thread's MDC + + + + + + Clear all entries in the MDC + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove all the entries from this thread's MDC + + + + + + Implementation of Nested Diagnostic Contexts. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + A Nested Diagnostic Context, or NDC in short, is an instrument + to distinguish interleaved log output from different sources. Log + output is typically interleaved when a server handles multiple + clients near-simultaneously. + + + Interleaved log output can still be meaningful if each log entry + from different contexts had a distinctive stamp. This is where NDCs + come into play. + + + Note that NDCs are managed on a per thread basis. The NDC class + is made up of static methods that operate on the context of the + calling thread. + + + How to push a message into the context + + using(NDC.Push("my context message")) + { + ... all log calls will have 'my context message' included ... + + } // at the end of the using block the message is automatically removed + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + Clears all the contextual information held on the current thread. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Clears the stack of NDC data held on the current thread. + + + + + + Creates a clone of the stack of context information. + + A clone of the context info for this thread. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The results of this method can be passed to the + method to allow child threads to inherit the context of their + parent thread. + + + + + + Inherits the contextual information from another thread. + + The context stack to inherit. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This thread will use the context information from the stack + supplied. This can be used to initialize child threads with + the same contextual information as their parent threads. These + contexts will NOT be shared. Any further contexts that + are pushed onto the stack will not be visible to the other. + Call to obtain a stack to pass to + this method. + + + + + + Removes the top context from the stack. + + + The message in the context that was removed from the top + of the stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Remove the top context from the stack, and return + it to the caller. If the stack is empty then an + empty string (not null) is returned. + + + + + + Pushes a new context message. + + The new context message. + + An that can be used to clean up + the context stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Pushes a new context onto the context stack. An + is returned that can be used to clean up the context stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.NDC.Push("NDC_Message")) + { + log.Warn("This should have an NDC message"); + } + + + + + + Removes the context information for this thread. It is + not required to call this method. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This method is not implemented. + + + + + + Forces the stack depth to be at most . + + The maximum depth of the stack + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Forces the stack depth to be at most . + This may truncate the head of the stack. This only affects the + stack in the current thread. Also it does not prevent it from + growing, it only sets the maximum depth at the time of the + call. This can be used to return to a known context depth. + + + + + + Gets the current context depth. + + The current context depth. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The number of context values pushed onto the context stack. + + + Used to record the current depth of the context. This can then + be restored using the method. + + + + + + + The log4net Thread Context. + + + + The ThreadContext provides a location for thread specific debugging + information to be stored. + The ThreadContext properties override any + properties with the same name. + + + The thread context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Thread Context provides a diagnostic context for the current thread. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Thread Context is managed on a per thread basis. + + + Example of using the thread context properties to store a username. + + ThreadContext.Properties["user"] = userName; + log.Info("This log message has a ThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(ThreadContext.Stacks["NDC"].Push("my context message")) + { + log.Info("This log message has a ThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + Private Constructor. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + The thread context properties instance + + + + + The thread context stacks instance + + + + + The thread properties map + + + The thread properties map + + + + The ThreadContext properties override any + properties with the same name. + + + + + + The thread stacks + + + stack map + + + + The thread local stacks. + + + + + diff --git a/TBF_V2/Sources/TBF/packages/log4net.2.0.2/log4net.2.0.2.nupkg b/TBF_V2/Sources/TBF/packages/log4net.2.0.2/log4net.2.0.2.nupkg new file mode 100644 index 00000000..c195484f Binary files /dev/null and b/TBF_V2/Sources/TBF/packages/log4net.2.0.2/log4net.2.0.2.nupkg differ diff --git a/TBF_V2/Sources/TBF/packages/log4net.2.0.2/log4net.2.0.2.nuspec b/TBF_V2/Sources/TBF/packages/log4net.2.0.2/log4net.2.0.2.nuspec new file mode 100644 index 00000000..e70006f0 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/log4net.2.0.2/log4net.2.0.2.nuspec @@ -0,0 +1,23 @@ + + + + log4net + 2.0.2 + log4net [1.2.12] + Apache Software Foundation + Apache Software Foundation + http://logging.apache.org/log4net/license.html + http://logging.apache.org/log4net/ + false + log4net is a tool to help the programmer output log statements to a variety of output targets. In case of problems with an application, it is helpful to enable logging so that the problem can be located. With log4net it is possible to enable logging at runtime without modifying the application binary. The log4net package is designed so that log statements can remain in shipped code without incurring a high performance cost. It follows that the speed of logging (or rather not logging) is crucial. + +At the same time, log output can be so voluminous that it quickly becomes overwhelming. One of the distinctive features of log4net is the notion of hierarchical loggers. Using these loggers it is possible to selectively control which log statements are output at arbitrary granularity. + +log4net is designed with two distinct goals in mind: speed and flexibility + The Apache log4net library is a tool to help the programmer output log statements to a variety of output targets. + + + + logging log tracing logfiles + + \ No newline at end of file diff --git a/TBF_V2/Sources/TBF/packages/repositories.config b/TBF_V2/Sources/TBF/packages/repositories.config new file mode 100644 index 00000000..5aaead09 --- /dev/null +++ b/TBF_V2/Sources/TBF/packages/repositories.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/UserGuides/TFS User Guide.docx b/UserGuides/TFS User Guide.docx new file mode 100644 index 00000000..ad3fa152 Binary files /dev/null and b/UserGuides/TFS User Guide.docx differ diff --git a/ZeroFlowTool/Amplitude.cs b/ZeroFlowTool/Amplitude.cs new file mode 100644 index 00000000..fee3dd98 --- /dev/null +++ b/ZeroFlowTool/Amplitude.cs @@ -0,0 +1,1098 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Globalization; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using GenesisDisplayTool; +using Xylem.Common.Hardware.WaterMeter.WaterMeterCore; +using Xylem.Common.Hardware.WaterMeter.Genesis.Registers; + +namespace GenesisZeroFlow +{ + public static class AmplitudeSequences + { + public static Boolean[] Total(MeterBatch globalMeterBatch, MeterBatch thermoMeterBatch, Boolean[] allEnable, Int32 firstHitLevelPropMin, Int32 firstHitLevelPropMax, Int32 ampTestLowerLimit, Int32 ampTestUpperLimit, Int32 ampTestDistance, Double upperTempLimit, Double lowerTempLimit, Double tempDeviationLimit, out Boolean aborted, CultureInfo culture) + { + #region Definitions and initializations + Int32 FirstHitLevelPropMin = firstHitLevelPropMin; + Int32 FirstHitLevelPropMax = firstHitLevelPropMax; + Boolean[] MeterEnable = Misc.Subarray(allEnable, 0, Constants.NumberOfMeters); + Boolean[] ThermoEnable = Misc.Subarray(allEnable, Constants.NumberOfMeters, Constants.NumberOfThermometers); + Boolean GenerateMeanFiles = GenesisZeroFlow._GenesisZeroFlow.GetCBMeanAmplitudeFiles(); + Boolean GenerateLogFiles = GenesisZeroFlow._GenesisZeroFlow.GetCBAmpLogFiles(); + const Int32 TofRecordingTime = 2; + const Double TriggerValue = 0.5; + Int32 NextDelayTime = 0; + + Boolean[] MeterTaskStarted = new Boolean[Constants.NumberOfMeters]; + Boolean[] MeterTaskCompleted = new Boolean[Constants.NumberOfMeters]; + Boolean[] MeterSequenceOk = new Boolean[Constants.NumberOfMeters]; + Boolean[] MeterSequenceFailed = new Boolean[Constants.NumberOfMeters]; + + Boolean[] ThermoTaskStarted = new Boolean[Constants.NumberOfThermometers]; + Boolean[] ThermoTaskCompleted = new Boolean[Constants.NumberOfThermometers]; + Boolean[] ThermoSequenceOk = new Boolean[Constants.NumberOfThermometers]; + Boolean[] ThermoSequenceFailed = new Boolean[Constants.NumberOfThermometers]; + + List listAmpTest = new List(); + List thermoAmpTest = new List(); + GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed = false; + + MeterTaskStarted = ArrayInit.Meter(false); + MeterTaskCompleted = ArrayInit.Meter(false); + MeterSequenceOk = ArrayInit.Meter(false); + MeterSequenceFailed = ArrayInit.Meter(false); + + ThermoTaskStarted = ArrayInit.Thermo(false); + ThermoTaskCompleted = ArrayInit.Thermo(false); + ThermoSequenceOk = ArrayInit.Thermo(false); + ThermoSequenceFailed = ArrayInit.Thermo(false); + + aborted = false; + + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + { + var currentMeter = globalMeterBatch.ListOfMeters.FirstOrDefault(m => m.Slot.Equals(Meter + 1)); + + if (currentMeter != null) + listAmpTest.Add(new Amplitude(Meter, currentMeter, culture)); + else + listAmpTest.Add(new Amplitude(Meter, culture)); + } + for (UInt16 Thermo = Constants.Thermo1; Thermo < Constants.NumberOfThermometers; Thermo++) + { + var currentMeter = thermoMeterBatch.ListOfMeters.FirstOrDefault(m => m.Slot.Equals(Thermo + 11)); + + if (currentMeter != null) + thermoAmpTest.Add(new Amplitude(Thermo, currentMeter, culture)); + else + thermoAmpTest.Add(new Amplitude(Thermo, culture)); + } + #region Initialize + foreach (var meteramp in listAmpTest) + { + meteramp.Initialize(GenesisZeroFlow._GenesisZeroFlow.PcbID[meteramp.MeterNumber], Constants.Meter, ampTestLowerLimit, ampTestUpperLimit, ampTestDistance, FirstHitLevelPropMin, FirstHitLevelPropMax, TofRecordingTime, TriggerValue, upperTempLimit, lowerTempLimit, tempDeviationLimit, GenerateMeanFiles, GenerateLogFiles); + meteramp.MyTask = new Task(() => { return true; }); + } + foreach (var thermoamp in thermoAmpTest) + { + thermoamp.Initialize(GenesisZeroFlow._GenesisZeroFlow.ThermoID[thermoamp.MeterNumber], Constants.Thermo, 0, 0, 0, 0, 0, TofRecordingTime, TriggerValue, upperTempLimit, lowerTempLimit, tempDeviationLimit, GenerateMeanFiles, GenerateLogFiles); + thermoamp.MyTask = new Task(() => { return true; }); + } + #endregion + #endregion + #region Perform tests + CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); + CancellationToken token = cancellationTokenSource.Token; + // Amplitude test + foreach (var meteramp in listAmpTest) + meteramp.Meter(MeterEnable[meteramp.MeterNumber], ref MeterTaskStarted[meteramp.MeterNumber], ref MeterSequenceFailed[meteramp.MeterNumber], ref NextDelayTime, token); + // Temperature Monitoring + foreach (var thermoamp in thermoAmpTest) + { + if (ThermoEnable[thermoamp.MeterNumber]) + { + GenesisZeroFlow._GenesisZeroFlow.SetIndicatorTemperatureActivityCheck(thermoamp.MeterNumber, true); + GenesisZeroFlow.Display.DebugMessage($"{Constants.TwentySpaces}\tAPPLICATION:\t\tTEMPERATURE MONITORING started at {thermoamp.MeterType}{thermoamp.MeterIndex}\n", thermoamp.Culture); + GenesisZeroFlow._GenesisZeroFlow.SetLoggingIndicatorThermoMonitoring(thermoamp.MeterNumber, true); + } + Misc.WaitNMilliseconds(300); + thermoamp.Thermometer(ThermoEnable[thermoamp.MeterNumber], ref ThermoTaskStarted[thermoamp.MeterNumber], ref ThermoSequenceFailed[thermoamp.MeterNumber], ref NextDelayTime, token); + } + #endregion + #region Wait for tasks + while (!CheckArray(MeterTaskCompleted.Concat(ThermoTaskCompleted).ToArray())) + { + #region Temperature check + foreach (var thermoamp in thermoAmpTest) + { + if (CheckArray(MeterTaskCompleted) && (ThermoEnable[thermoamp.MeterNumber])) // If all METERs finished, not THERMOMETERs + { + GenesisZeroFlow._GenesisZeroFlow.SetLoggingIndicatorThermoMonitoring(thermoamp.MeterNumber, false); + GenesisZeroFlow.Display.DebugMessage($"{Constants.TwentySpaces}\tAPPLICATION:\t\t TEMPERATURE MONITORING stopped at {thermoamp.MeterType}{thermoamp.MeterIndex}\n", thermoamp.Culture); + } + } + #endregion + #region Abort check + if (GenesisZeroFlow._GenesisZeroFlow.AbortIndicator) + { + cancellationTokenSource.Cancel(); + aborted = true; + } + #endregion + #region Check result + Misc.WaitNSeconds(1); + #region Meter + foreach (var amp in listAmpTest) + { + MeterTaskCompleted[amp.MeterNumber] = TaskOperations.WaitFor(MeterTaskStarted[amp.MeterNumber], amp.MyTask); + // Stop temperature check + GenesisZeroFlow._GenesisZeroFlow.SetIndicatorTemperatureActivityCheck(amp.MeterNumber, !MeterTaskCompleted[amp.MeterNumber]); + } + foreach (var amp in listAmpTest) + MeterSequenceFailed[amp.MeterNumber] = TaskOperations.GetResult(MeterTaskStarted[amp.MeterNumber], amp.MyTask); + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + MeterSequenceOk[Meter] = !MeterSequenceFailed[Meter]; + #endregion + #region Thermometer + foreach (var amp in thermoAmpTest) + { + ThermoTaskCompleted[amp.MeterNumber] = TaskOperations.WaitFor(ThermoTaskStarted[amp.MeterNumber], amp.MyTask); + // Stop temperature check + GenesisZeroFlow._GenesisZeroFlow.SetIndicatorTemperatureActivityCheck(amp.MeterNumber, !MeterTaskCompleted[amp.MeterNumber]); + } + foreach (var amp in thermoAmpTest) + ThermoSequenceFailed[amp.MeterNumber] = TaskOperations.GetResult(ThermoTaskStarted[amp.MeterNumber], amp.MyTask); + for (UInt16 Thermometer = Constants.Thermo1; Thermometer < Constants.NumberOfThermometers; Thermometer++) + ThermoSequenceOk[Thermometer] = !ThermoSequenceFailed[Thermometer]; + #endregion + GenesisZeroFlow.Display.MeterStatusGreenRed(MeterSequenceOk, MeterTaskStarted); + GenesisZeroFlow.Display.ThermoStatusGreenRed(ThermoSequenceOk, ThermoTaskStarted); + #endregion + } + #region Sequence failed + foreach (var meteramp in listAmpTest) + MeterSequenceFailed[meteramp.MeterNumber] = TaskOperations.GetResult(MeterTaskStarted[meteramp.MeterNumber], meteramp.MyTask); + foreach (var thermoamp in thermoAmpTest) + ThermoSequenceFailed[thermoamp.MeterNumber] = TaskOperations.GetResult(ThermoTaskStarted[thermoamp.MeterNumber], thermoamp.MyTask); + #endregion + #region Sequence Ok + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + MeterSequenceOk[Meter] = !MeterSequenceFailed[Meter]; + for (UInt16 Thermo = Constants.Thermo1; Thermo < Constants.NumberOfThermometers; Thermo++) + ThermoSequenceOk[Thermo] = !ThermoSequenceFailed[Thermo]; + GenesisZeroFlow.Display.MeterStatusGreenRed(MeterSequenceOk, MeterTaskStarted); + GenesisZeroFlow.Display.ThermoStatusGreenRed(ThermoSequenceOk, ThermoTaskStarted); + #endregion + #endregion + #region Destroy tasks + foreach (var meteramp in listAmpTest) + TaskOperations.CheckAndDispose(meteramp.MyTask); + foreach (var thermoamp in thermoAmpTest) + TaskOperations.CheckAndDispose(thermoamp.MyTask); + #endregion + + return MeterSequenceFailed.Concat(ThermoSequenceFailed).ToArray(); + } + private static Boolean CheckArray(Boolean[] array) + { + Boolean Completed = true; + + for (Int32 i = 0; i < array.Count(); i++) + { + if (Boolean.Equals(array[i], false)) + return false; + } + + return Completed; + } + } + public class Amplitude + { + private readonly ZeroFlowGenesisMeter GenesisMeter; + public Task MyTask { get; set; } + public Amplitude(UInt16 meterNumber, CultureInfo culture) + { + MeterNumber = meterNumber; + Culture = culture; + MeterIndex = (meterNumber + 1).ToString(culture); + } + public Amplitude(UInt16 meterNumber, IMeter meter, CultureInfo culture) + { + if (meter is ZeroFlowGenesisMeter) + { + GenesisMeter = meter as ZeroFlowGenesisMeter; + } + MeterNumber = meterNumber; + Culture = culture; + MeterIndex = (meterNumber + 1).ToString(culture); + } + internal void Meter(Boolean enable, ref Boolean taskStarted, ref Boolean sequenceFailed, ref Int32 nextDelayTime, CancellationToken token) + { + #region Avoid CA1062 + if ((MyTask == null)) + return; + #endregion + #region Definitions and initializations + Int32 DelayTime = 0; + const Int32 DeltaDelay = 1; + DialogResult AskForActions = DialogResult.None; + Boolean _sequenceFailed = sequenceFailed; + Boolean Ok = false; + #endregion + #region Everything else + if ((enable) && (!TaskStatus.Equals(MyTask.Status, TaskStatus.Running)) && (!MyTask.IsCompleted)) + { + #region Start delay + DelayTime = nextDelayTime; + nextDelayTime = nextDelayTime + DeltaDelay; + + taskStarted = true; + Misc.WaitNSeconds(DelayTime); + #endregion + + MyTask = Task.Run(() => + { + while ((DialogResult.Equals(AskForActions, DialogResult.Retry)) || (DialogResult.Equals(AskForActions, DialogResult.None)) && (!token.IsCancellationRequested) && !GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + { + #region Abort + if (token.IsCancellationRequested) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t AMPLITUDE TEST stopped at {this.MeterType}{this.MeterIndex}\n", this.Culture); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + GenesisZeroFlow._GenesisZeroFlow.GenerateReturnNote(this.MeterIndex, this.PcbID, GenesisZeroFlow.PredefinedMessages.AmplitudeStopped(this.Culture), GenesisZeroFlow._GenesisZeroFlow.GetLoggingFromTextBox(), this.Culture); + return true; // sequence failed + } + else + GenesisZeroFlow.Display.AbortButtonEnabled(true); + #endregion + #region Testprocedure + if (DialogResult.Equals(AskForActions, DialogResult.None)) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t AMPLITUDE TEST started at {this.MeterType}{this.MeterIndex}\n", this.Culture); + + Ok = this.PerformTest(token); + + if (token.IsCancellationRequested) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t AMPLITUDE TEST stopped at {this.MeterType}{this.MeterIndex}\n", this.Culture); + GenesisZeroFlow._GenesisZeroFlow.GenerateReturnNote(this.MeterIndex, this.PcbID, GenesisZeroFlow.PredefinedMessages.AmplitudeStopped(this.Culture), GenesisZeroFlow._GenesisZeroFlow.GetLoggingFromTextBox(), this.Culture); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + return true; // sequence failed + } + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t AMPLITUDE TEST successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + GenesisZeroFlow.Display.DebugMessage($"{Constants.TwentySpaces}\t{Debugmessages.Line}", this.Culture); + _sequenceFailed = false; + AskForActions = DialogResult.OK; + } + else + { + _sequenceFailed = true; + AskForActions = DialogResult.Cancel; + GenesisZeroFlow._GenesisZeroFlow.GenerateReturnNote(this.MeterIndex, this.PcbID, GenesisZeroFlow.PredefinedMessages.AmplitudeFailed(this.Culture), GenesisZeroFlow._GenesisZeroFlow.GetLoggingFromTextBox(), this.Culture); + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t AMPLITUDE TEST failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + } + #endregion + } + return _sequenceFailed; + + }, token); + } + #endregion + } + internal void Thermometer(Boolean enable, ref Boolean taskStarted, ref Boolean sequenceFailed, ref Int32 nextDelayTime, CancellationToken token) + { + #region avoid CA1062 + if ((MyTask == null)) + return; + #endregion + #region Definitions and initializations + Int32 DelayTime = 0; + const Int32 DeltaDelay = 30; + const Int32 Checkinterval = 4; + Boolean _sequenceFailed = sequenceFailed; + Boolean Ok = true; + #endregion + #region Everything else + if ((enable) && (!TaskStatus.Equals(MyTask.Status, TaskStatus.Running)) && (!MyTask.IsCompleted)) + { + DelayTime = nextDelayTime; + nextDelayTime = nextDelayTime + DeltaDelay; + + taskStarted = true; + Misc.WaitNSeconds(DeltaDelay); + + MyTask = Task.Run(() => + { + Boolean LoggingIndicator = GenesisZeroFlow._GenesisZeroFlow.GetLoggingIndicatorThermoMonitoring()[this.MeterNumber]; + while (LoggingIndicator && (Boolean.Equals(Ok, true))) + { + #region Abort + if (!token.IsCancellationRequested) + GenesisZeroFlow.Display.AbortButtonEnabled(true); + #endregion + #region Testprocedure + Ok = PerformTempMonitoring(token); + Misc.WaitNSeconds(Checkinterval); + + if (token.IsCancellationRequested) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t TEMPERATURE MONITORING stopped at {this.MeterType}{this.MeterIndex}\n", this.Culture); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + return true; // sequence failed + } + if (Ok) + { + // GenesisZeroFlow.Display.DebugMessage($"APPLICATION:\t\t AMPLITUDE TEST successful at METER{MeterIndex}\t{AppendID}\n", this.Culture); + // GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line, this.Culture); + _sequenceFailed = false; + } + else + _sequenceFailed = true; + #endregion + LoggingIndicator = GenesisZeroFlow._GenesisZeroFlow.GetLoggingIndicatorThermoMonitoring()[this.MeterNumber]; + } + + return _sequenceFailed; + + }, token); + } + #endregion + + } + private Boolean PerformTest(CancellationToken token) + { + this.ClearData(); + + #region Definitions and initializations + String TempPcbID = this.PcbID.Replace(" ", String.Empty); + const Int32 FirstHitShiftValue = 4; + const Int32 FirstHitShiftValueEnd = 4; + const Int32 FirstHitUpdatePeriodeValue = 1; + const Int32 FirstHitUpdatePeriodeValueEnd = 10; + const Int32 WaitBeforeLogging = 1; + String DebugMessage = String.Empty; + Double[] TofAvgMean = new Double[Constants.NumberOfPaths]; + TofAvgMean = ArrayInit.Path((Double)0); + Int32[] OptimalPoint = new Int32[Constants.NumberOfPaths]; + OptimalPoint = ArrayInit.Path((Int32)0); + List[] TofAvgMeanTotal = new List[Constants.NumberOfPaths]; + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + TofAvgMeanTotal[Path] = new List(); + Boolean Ok = false; + #endregion + #region Test sequence + #region StartLogging + if (this.GenerateLogFiles) + { + String time = System.DateTime.Now.ToString(Formats.LogFileDateTimeString, this.Culture); + String Header = $"Genesis ZeroFlowOffsetCalibration {this.MeterType}{this.MeterIndex}; PCB ID = {TempPcbID}; Date = {time}; Operator = {Environment.UserName}\n"; + GenesisZeroFlow._GenesisZeroFlow.SetDataToLog(this.MeterNumber, Header); + GenesisZeroFlow._GenesisZeroFlow.SetLoggingPathAmplitudeTest(this.MeterNumber, $"{DataLogging.DefaultPath}AmplitudeTest_RawData_{TempPcbID}_{time}.txt"); + GenesisZeroFlow._GenesisZeroFlow.SetLoggingIndicatorAmpTest(this.MeterNumber, true); + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t Start logging at {this.MeterType}{this.MeterIndex}\n", this.Culture); + } + #endregion + #region Set first hit update period + if (GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + { + this.LeaveSequence(); + return false; + } + GenesisZeroFlow.Display.StatusLabel(GenesisZeroFlow.PredefinedMessages.WaitUntilRegisterWriteFinished(this.Culture)); + Ok = false; + if (token.IsCancellationRequested || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + { + this.LeaveSequence(); + return false; + } + Ok = WriteRegister(GenesisMeter, "First hit update period", Register.Genesisflow.FirstHitUpdatePeriod, FirstHitUpdatePeriodeValue, FirstHitUpdatePeriodeValue.ToString(this.Culture)); + if (Boolean.Equals(Ok, false) || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + { + this.LeaveSequence(); + return false; + } + #endregion + #region Set first hit shift to 4 + GenesisZeroFlow.Display.StatusLabel(GenesisZeroFlow.PredefinedMessages.WaitUntilRegisterWriteFinished(this.Culture)); + Ok = false; + if (token.IsCancellationRequested || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + { + this.LeaveSequence(); + return false; + } + Ok = WriteRegister(GenesisMeter, "First hit shift", Register.Genesisflow.FirstHitShift, FirstHitShiftValue, FirstHitShiftValue.ToString(this.Culture)); + if (Boolean.Equals(Ok, false) || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + { + this.LeaveSequence(); + return false; + } + #endregion + #region Set first hit level percentage from 5 to 40 + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t Start first hit level percentage sweep at {this.MeterType}{this.MeterIndex}\n", this.Culture); + + for (Int32 FirstHitLevelPercentage = (Int32)(this.FirstHitLevelPercMin); FirstHitLevelPercentage <= (this.FirstHitLevelPercMax); FirstHitLevelPercentage++) + { + if (token.IsCancellationRequested || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + { + this.LeaveSequence(); + return false; + } + GenesisZeroFlow.Display.StatusLabel($"{GenesisZeroFlow.PredefinedMessages.WaitUntilPercentageSweepFinished(this.Culture)} {FirstHitLevelPercentage.ToString(this.Culture)}/{FirstHitLevelPercMax.ToString(this.Culture)}"); + #region Write to percentage register PATH0 + GenesisZeroFlow.Display.StatusLabel(GenesisZeroFlow.PredefinedMessages.WaitUntilRegisterWriteFinished(this.Culture)); + Ok = false; + if (token.IsCancellationRequested || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + { + this.LeaveSequence(); + return false; + } + Ok = WriteRegister(GenesisMeter, "Percentage", Register.Genesisflow.FirstHitPercent1, FirstHitLevelPercentage, FirstHitLevelPercentage.ToString(this.Culture)); + if (Boolean.Equals(Ok, false) || (GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed)) + { + this.LeaveSequence(); + return false; + } + #endregion + #region Write to percentage register PATH1 + if (Constants.NumberOfPaths > 1) + { + GenesisZeroFlow.Display.StatusLabel(GenesisZeroFlow.PredefinedMessages.WaitUntilRegisterWriteFinished(this.Culture)); + Ok = false; + if (token.IsCancellationRequested || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + { + this.LeaveSequence(); + return false; + } + Ok = WriteRegister(GenesisMeter, "Percentage", Register.Genesisflow.FirstHitPercent2, FirstHitLevelPercentage, FirstHitLevelPercentage.ToString(this.Culture)); + if (Boolean.Equals(Ok, false) || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + { + this.LeaveSequence(); + return false; + } + } + #endregion + #region Write to percentage register PATH2 + if (Constants.NumberOfPaths > 2) + { + GenesisZeroFlow.Display.StatusLabel(GenesisZeroFlow.PredefinedMessages.WaitUntilRegisterWriteFinished(this.Culture)); + Ok = false; + if (token.IsCancellationRequested || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + { + this.LeaveSequence(); + return false; + } + Ok = WriteRegister(GenesisMeter, "Percentage", Register.Genesisflow.FirstHitPercent3, FirstHitLevelPercentage, FirstHitLevelPercentage.ToString(this.Culture)); + if (Boolean.Equals(Ok, false) || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + { + this.LeaveSequence(); + return false; + } + } + #endregion + #region Wait for 1 second + for (Int32 i = 0; i < WaitBeforeLogging; i++) + { + if ((token.IsCancellationRequested) || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + { + this.LeaveSequence(); + return false; + } + GenesisZeroFlow.Display.StatusLabel($"{GenesisZeroFlow.PredefinedMessages.WaitUntilPercentageSweepFinished(this.Culture)} {FirstHitLevelPercentage.ToString(this.Culture)}/{FirstHitLevelPercMax.ToString(this.Culture)}; {(this.TofRecordingTime + WaitBeforeLogging - i).ToString(this.Culture)}s"); + Misc.WaitNSeconds(1); + } + #endregion + #region Record TOF + GenesisZeroFlow._GenesisZeroFlow.SetTofIndicatorAmplitudeTest(this.MeterNumber, true); + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t Start collecting data at {this.MeterType}{this.MeterIndex}\n", this.Culture); + Int32[] LinecounterFollowing = new Int32[Constants.NumberOfPaths]; + LinecounterFollowing = ArrayInit.Path(0); + + for (Int32 Seconds = 0; Seconds < this.TofRecordingTime; Seconds++) // eight seconds remove /2 + { + if (token.IsCancellationRequested || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + { + this.LeaveSequence(); + return false; + } + + // if (Seconds % 60 == 0) + Int32 ActivityCheckInterval = GenesisZeroFlow._GenesisZeroFlow.GetAmplitudeActivityCheckInterval(); + if (Int32.Equals((Seconds % ActivityCheckInterval), 0)) + Ok = this.ActivityCheck(ref LinecounterFollowing, Seconds); + // else + // Ok = true; + if (Ok && !GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + { + GenesisZeroFlow.Display.StatusLabel($"{GenesisZeroFlow.PredefinedMessages.WaitUntilPercentageSweepFinished(this.Culture)} {FirstHitLevelPercentage.ToString(this.Culture)}/{ FirstHitLevelPercMax.ToString(this.Culture)}; {(this.TofRecordingTime - Seconds).ToString(this.Culture)}s"); + Misc.WaitNSeconds(1); // replace 2 with 1 + } + else + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t Activity check failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + this.LeaveSequence(); + return false; + } + } + GenesisZeroFlow.Display.StatusLabel($"{ GenesisZeroFlow.PredefinedMessages.WaitUntilPercentageSweepFinished(this.Culture)} { FirstHitLevelPercentage.ToString(this.Culture)}/{FirstHitLevelPercMax.ToString(this.Culture)}; 0s"); + + Ok = true; + #endregion + #region Calculate mean value + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t Calculate mean value at {this.MeterType}{this.MeterIndex}; PATH{(Path + 1).ToString(this.Culture)}\n", this.Culture); + TofAvgMean[Path] = GenesisZeroFlow._GenesisZeroFlow.GetTotalTimeOfFlightAverage()[this.MeterNumber][Path].Mean(); + if(TofAvgMean[Path] == 0) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t Mean value is zero at {this.MeterType}{this.MeterIndex}; PATH{(Path + 1).ToString(this.Culture)}; Value = {Math.Round(TofAvgMean[Path], 4).ToString("000.0000", this.Culture)}\n", this.Culture); + this.LeaveSequence(); + return false; + } + GenesisZeroFlow._GenesisZeroFlow.SetTofIndicatorAmplitudeTest(this.MeterNumber, true); + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t Mean value at {this.MeterType}{this.MeterIndex}; PATH{(Path + 1).ToString(this.Culture)}; Value = {Math.Round(TofAvgMean[Path], 4).ToString("000.0000", this.Culture)}\n", this.Culture); + TofAvgMeanTotal[Path].Add(TofAvgMean[Path]); + GenesisZeroFlow._GenesisZeroFlow.SetAmpValuesToLog(this.MeterNumber, Path, $"{ GenesisZeroFlow._GenesisZeroFlow.GetAmpValuesToLog()[this.MeterNumber][Path]} {Math.Round(TofAvgMean[Path], 4).ToString("000.0000", this.Culture)}\n"); + GenesisZeroFlow._GenesisZeroFlow.ClearTotalTimeOfFlightAverage(this.MeterNumber, Path); + } + #endregion + } + #endregion + #region Write raw data to files + if (this.GenerateLogFiles) + { + GenesisZeroFlow._GenesisZeroFlow.SetLoggingIndicatorAmpTest(this.MeterNumber, false); + String temp = GenesisZeroFlow._GenesisZeroFlow.GetDataToLog()[this.MeterNumber]; + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t Write data to files at {this.MeterType}{this.MeterIndex}\n", this.Culture); + Logging.WriteToFile(temp, GenesisZeroFlow._GenesisZeroFlow.GetLoggingPathAmplitudeTest()[this.MeterNumber]); + } + #endregion + #region Write mean values to file + String DateTime = System.DateTime.Now.ToString(Formats.LogFileDateTimeString, this.Culture); + if (this.GenerateMeanFiles) + { + for(UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + Logging.WriteToFile(GenesisZeroFlow._GenesisZeroFlow.GetAmpValuesToLog()[this.MeterNumber][Constants.PATH0], $@"..\ZeroflowCalibrationTool_MeanAmplitude_{this.MeterType}{this.MeterIndex}_PATH{Path + 1}_{TempPcbID}_{DateTime}.csv"); + } + + + this.ClearData(); + #endregion + #region Calculate optimal point + Double[] DistanceLeft = new Double[Constants.NumberOfPaths]; + DistanceLeft = ArrayInit.Path((Double)0); + Double[] DistanceRight = new Double[Constants.NumberOfPaths]; + DistanceRight = ArrayInit.Path((Double)0); + Boolean[] CalculationFailed = new Boolean[Constants.NumberOfPaths]; + CalculationFailed = ArrayInit.Path(false); + + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t Start calculating optimal points at {this.MeterType}{this.MeterIndex}\n", this.Culture); + Boolean OptPointFailed = false; + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + CalculationFailed[Path] = CalculateOptimalPoint(Path, TofAvgMeanTotal[Path], out DistanceLeft[Path], out DistanceRight[Path], out OptimalPoint[Path]); + if (Boolean.Equals(CalculationFailed[Path], false)) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t Optimal point calculation successful at {this.MeterType}{this.MeterIndex}, PATH{Path + 1}; Value = {OptimalPoint[Path].ToString(this.Culture)}\n", this.Culture); + else + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t Optimal point calculation failed at {this.MeterType}{this.MeterIndex}, PATH{Path + 1}\n", this.Culture); + OptPointFailed = true; + } + if (OptPointFailed || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + return false; + } + #endregion + #region Check value + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t Start optimal point values check at {this.MeterType}{this.MeterIndex}\n", this.Culture); + Boolean OptimalPointOK = true; + for(UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + if(!this.CheckOptimalPoint(OptimalPoint[Path], out DebugMessage)) + OptimalPointOK = false; + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t {DebugMessage}, PATH{Path + 1}\n", this.Culture); + } + if ((!OptimalPointOK) || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + return false; + #endregion + #region Check distance + Boolean CheckDistOK = true; + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + if (!this.CheckDistance(DistanceLeft[Path], DistanceRight[Path], out DebugMessage)) + CheckDistOK = false; + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t {DebugMessage}, PATH{Path +1}\n", this.Culture); + } + if (!CheckDistOK || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + return false; + #endregion + #region Set first hit level percentage registers + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t Start writing to percentage registers at {this.MeterType}{this.MeterIndex}\n", this.Culture); + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + GenesisZeroFlow.Display.StatusLabel($"{GenesisZeroFlow.PredefinedMessages.WaitUntilRegisterWriteFinished(this.Culture)}"); + Ok = false; + if (token.IsCancellationRequested || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + return false; + + String RegValue = String.Empty; + switch (Path) + { + case Constants.PATH0: RegValue = Register.Genesisflow.FirstHitPercent1; + break; + case Constants.PATH1: RegValue = Register.Genesisflow.FirstHitPercent2; + break; + case Constants.PATH2: RegValue = Register.Genesisflow.FirstHitPercent3; + break; + default: RegValue = Register.Genesisflow.FirstHitPercent1; + break; + }; + Ok = WriteRegister(GenesisMeter, "Percentage", RegValue, OptimalPoint[Path], OptimalPoint[Path].ToString(this.Culture)); + if (Boolean.Equals(Ok, false) || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + return false; + } + #endregion + + //here + + #region Set first hit update period to 10 + GenesisZeroFlow.Display.StatusLabel(GenesisZeroFlow.PredefinedMessages.WaitUntilRegisterWriteFinished(this.Culture)); + Ok = false; + if (token.IsCancellationRequested || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + return false; + Ok = WriteRegister(GenesisMeter, "first hit update period", Register.Genesisflow.FirstHitUpdatePeriod, FirstHitUpdatePeriodeValueEnd, FirstHitUpdatePeriodeValueEnd.ToString(this.Culture)); + if (Boolean.Equals(Ok, false) || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + return false; + #endregion + #region Set first hit shift to 4 + GenesisZeroFlow.Display.StatusLabel(GenesisZeroFlow.PredefinedMessages.WaitUntilRegisterWriteFinished(this.Culture)); + Ok = false; + if (token.IsCancellationRequested || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + return false; + Ok = WriteRegister(GenesisMeter, "First hit shift", Register.Genesisflow.FirstHitShift, FirstHitShiftValueEnd, FirstHitShiftValueEnd.ToString(this.Culture)); + if (Boolean.Equals(Ok, false) || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + return false; + #endregion + #endregion + return Ok; + } + private Boolean PerformTempMonitoring(CancellationToken token) + { + #region Definitions and initializations + Int32[] LinecounterFollowing = new Int32[Constants.NumberOfPaths]; + LinecounterFollowing = ArrayInit.Path((Int32)0); + Boolean Ok = true; + Int32 ActivityCheckInterval = GenesisZeroFlow._GenesisZeroFlow.GetAmplitudeActivityCheckInterval(); + Ok = this.ThermoActivityCheck(ref LinecounterFollowing, 0); + #endregion + #region Test sequence + #region Check upper value + + for (UInt16 Path = 0; Path < Constants.NumberOfPaths; Path++) + { + Double temp = 0; + + try + { + temp = GenesisZeroFlow._GenesisZeroFlow.GetTemperatures(this.MeterNumber, Path); + String Temperature = $"{Math.Round(temp, 2).ToString("00.00", this.Culture) }°C"; + + switch (this.MeterNumber) + { + case Constants.Meter1: + GenesisZeroFlow.Display.SetThermoLabel1($"{Temperature}"); + break; + case Constants.Meter2: + GenesisZeroFlow.Display.SetThermoLabel2($"{Temperature}"); + break; + default: + GenesisZeroFlow.Display.SetThermoLabel1($"n/a"); + + break; + } + + #region Upper value + + if (temp > this.UpperTempLimit) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t TEMPERATURE MONITORING upper value check failed at {this.MeterType}{this.MeterIndex}; PATH{Path.ToString(this.Culture)}\t\n", this.Culture); + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t TEMPERATURE MONITORING upper value check values (actual/ limit) = {Temperature}/ {Math.Round(this.UpperTempLimit, 2).ToString("00.00", this.Culture)}°C\n", this.Culture); + GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed = true; + return false; + } + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t TEMPERATURE MONITORING upper value successful at {this.MeterType}{this.MeterIndex}; PATH{Path.ToString(this.Culture)}; Value = {Temperature}\t\n", this.Culture); + #endregion + #region Lower value + if (temp < this.LowerTempLimit) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t TEMPERATURE MONITORING lower value check failed at {this.MeterType}{this.MeterIndex}; PATH{Path.ToString(this.Culture)}\t\n", this.Culture); + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t TEMPERATURE MONITORING lower value check values (actual/ limit) = {Temperature}/ {Math.Round(this.LowerTempLimit, 2).ToString("00.00", this.Culture)}°C\n", this.Culture); + GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed = true; + return false; + } + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t TEMPERATURE MONITORING lower value successful at {this.MeterType}{this.MeterIndex}; PATH{Path.ToString(this.Culture)}; Value = {Temperature}\n", this.Culture); + #endregion + #region Deviation check + // Lower value check + if (this.GetTempDeviationMin()[Path] == 0) + this.TempDeviationMin[Path] = temp; + else + { + if (temp < this.GetTempDeviationMin()[Path]) + this.TempDeviationMin[Path] = temp; + } + // Upper value check + if (this.GetTempDeviationMax()[Path] == 0) + this.TempDeviationMax[Path] = temp; + else + { + if (temp > this.GetTempDeviationMax()[Path]) + this.TempDeviationMax[Path] = temp; + } + // Deviation check + + Double DeviationValue = this.GetTempDeviationMax()[Path] - this.GetTempDeviationMin()[Path]; + String Deviation = $"{Math.Round(DeviationValue, 3).ToString("00.000", this.Culture)}°C"; + + if (DeviationValue > this.TempDeviationLimit) + { + GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed = true; + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t TEMPERATURE MONITORING deviation check failed at {this.MeterType}{this.MeterIndex}; PATH{Path.ToString(this.Culture)}; Value = {Deviation}\n", this.Culture); + return false; + } + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t TEMPERATURE MONITORING deviation check successful at {this.MeterType}{this.MeterIndex}; PATH{Path.ToString(this.Culture)}; Value = {Deviation}\n", this.Culture); + #endregion + } + #endregion + + catch (Exception ex) + { + GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed = true; + ErrorLog.Log(LogErrReason.Exeption, "Amplitude.PerformTemperatureMonitoring() failed", $"0x{ex.HResult.ToString("X", this.Culture)}", String.Empty, this.Culture); + return false; + } + #endregion + } + return Ok; + } + private Boolean ActivityCheck(ref Int32[] lineCounterFollowing, Int32 seconds) + { + #region Definitions and initializations + Boolean Ok = true; + Boolean Error = false; + #endregion + #region Check activity + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + if (!Int32.Equals(GenesisZeroFlow._GenesisZeroFlow.GetLineCounterAmplitudeTest()[this.MeterNumber][Path], 0)) + { + if (Int32.Equals(GenesisZeroFlow._GenesisZeroFlow.GetLineCounterAmplitudeTest()[this.MeterNumber][Path], lineCounterFollowing[Path])) + return false; + else + lineCounterFollowing[Path] = GenesisZeroFlow._GenesisZeroFlow.GetLineCounterAmplitudeTest()[this.MeterNumber][Path]; + + } + if ((seconds > 0) && (Boolean.Equals(GenesisZeroFlow._GenesisZeroFlow.GetLineCounterAmplitudeTest()[this.MeterNumber][Path], 0))) + return false; + } + #endregion + #region Result + Ok = !Error; + #endregion + + return Ok; + } + private Boolean ThermoActivityCheck(ref Int32[] lineCounterFollowing, Int32 seconds) + { + #region Definitions and initializations + Boolean Ok = true; + Boolean Error = false; + #endregion + #region Check activity + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + if (!Int32.Equals(GenesisZeroFlow._GenesisZeroFlow.GetLineCounterTemperatureTest()[this.MeterNumber][Path], 0)) + { + if (Int32.Equals(GenesisZeroFlow._GenesisZeroFlow.GetLineCounterTemperatureTest()[this.MeterNumber][Path], lineCounterFollowing[Path])) + return false; + else + lineCounterFollowing[Path] = GenesisZeroFlow._GenesisZeroFlow.GetLineCounterTemperatureTest()[this.MeterNumber][Path]; + } + if ((seconds > 0) && (Boolean.Equals(GenesisZeroFlow._GenesisZeroFlow.GetLineCounterTemperatureTest()[this.MeterNumber][Path], 0))) + return false; + } + #endregion + #region Result + Ok = !Error; + #endregion + + return Ok; + } + + private Boolean WriteRegister(ZeroFlowGenesisMeter genesisMeter, String RegisterText, string reg, Int32 value, + String ValueText) + { + return WriteRegister(genesisMeter, RegisterText, reg, value, ValueText, 4); + } + + private Boolean WriteRegister(ZeroFlowGenesisMeter genesisMeter, String RegisterText, string reg, Int32 value, String ValueText, int RetrysLeft ) + { + var Ok = false; + + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing {ValueText.ToString(this.Culture)} to '{RegisterText}'-register at {this.MeterType}{this.MeterIndex}\n", this.Culture); + Ok = genesisMeter.WriteRegisterSafe(reg, value); + if (Ok) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing {ValueText.ToString(this.Culture)} to '{RegisterText}'-register successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + else + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing {ValueText.ToString(this.Culture)} to '{RegisterText}'-register failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + + + if (Ok == false && RetrysLeft > 0) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing {ValueText.ToString(this.Culture)} to '{RegisterText}'-register retry at {this.MeterType}{this.MeterIndex}\n", this.Culture); + return WriteRegister(genesisMeter, RegisterText, reg, value, ValueText, RetrysLeft - 1); + } + return Ok; + } + private Boolean CalculateOptimalPoint(UInt16 path, List TofAvg, out Double left, out Double right, out Int32 xAtOptimalPoint) + { + List ValuesLeft = new List(); + List ValuesRight = new List(); + List MinDistance = new List(); + xAtOptimalPoint = 0; + Boolean Error = true; + left = 0; + right = 0; + + ValuesLeft = this.CalculateNearestDistanceLeft(TofAvg, out left); + ValuesRight = this.CalculateNearestDistanceRight(TofAvg, out right); + + for (UInt16 i = 0; i < ValuesLeft.Count(); i++) + { + Double temp1 = ValuesLeft.ElementAt(i); + Double temp2 = ValuesRight.ElementAt(i); + Misc.WaitNMilliseconds(10); + MinDistance.Add(Math.Min(temp1, temp2)); + } + + //String mindistance = $"mindistance: PATH{path.ToString(GlobalCulture)}\n"; + //for (Int16 i = 0; i < MinDistance.Count(); i++) + //{ + // Double temp = MinDistance.ElementAt(i); + // Misc.WaitNMilliseconds(10); + // mindistance = $"{mindistance}{temp.ToString(GlobalCulture)}\n"; + //} + //Logging.WriteToFile(mindistance, @"..\mindistance_PATH"+ path.ToString() + ".txt"); + + Double Maximum = 0; + + for (Int16 i = 0; i < MinDistance.Count(); i++) + { + if ((!Int16.Equals(i, 0)) && (!Int16.Equals(i, (Int16)(TofAvg.Count() - 1)))) + { + if (MinDistance.ElementAt(i) > Maximum) + { + Maximum = MinDistance.ElementAt(i); + xAtOptimalPoint = (Int32)i + this.FirstHitLevelPercMin; + Error = false; + } + /* + if ((ValuesLeft.ElementAt(i - 1) > ValuesRight.ElementAt(i - 1)) && (ValuesRight.ElementAt(i + 1) > ValuesLeft.ElementAt(i + 1))) + { + xAtOptimalPoint = i + this.FirstHitLevelPercMin; + Error = false; + } + */ + } + } + + return Error; + } + private List CalculateNearestDistanceLeft(List TofAvg, out Double left) + { + List Distance = new List(); + Double NearestDistance = 0; + Boolean Detected = false; + left = 0; + + for (Int32 Percentage = this.FirstHitLevelPercMin; Percentage <= (this.FirstHitLevelPercMax); Percentage++) + { + Detected = false; + for (Int32 PercentageFollowing = Percentage; PercentageFollowing <= this.FirstHitLevelPercMax; PercentageFollowing++) + { + if ((TofAvg.ElementAt(PercentageFollowing - this.FirstHitLevelPercMin) - TofAvg.ElementAt(Percentage - FirstHitLevelPercMin)) > this.TriggerValue) + { + NearestDistance = PercentageFollowing - Percentage; + Detected = true; + break; + } + } + if (!Detected) + NearestDistance = this.FirstHitLevelPercMax - Percentage; + + Distance.Add(NearestDistance); + } + + for (Int16 i = 0; i < (Int16)Distance.Count(); i++) + { + if (Distance.ElementAt(i) >= left) + { + left = Distance.ElementAt(i); + } + } + return Distance; + } + private List CalculateNearestDistanceRight(List TofAvg, out Double right) + { + List Distance = new List(); + Double NearestDistance = 0; + Boolean Detected = false; + right = 0; + + for (Int32 Percentage = this.FirstHitLevelPercMax; Percentage >= (this.FirstHitLevelPercMin); Percentage--) + { + Detected = false; + + for (Int32 ProportionFollowing = Percentage; ProportionFollowing >= this.FirstHitLevelPercMin; ProportionFollowing--) + { + if ((TofAvg.ElementAt(ProportionFollowing - FirstHitLevelPercMin)) - (TofAvg.ElementAt(Percentage - FirstHitLevelPercMin)) < -this.TriggerValue) + { + NearestDistance = Percentage - ProportionFollowing; + Detected = true; + break; + } + } + + if (!Detected) + NearestDistance = Percentage - this.FirstHitLevelPercMin; + + Distance.Add(NearestDistance); + } + + + Distance.Reverse(); + + for (Int16 i = 0; i < Distance.Count(); i++) + { + if (Distance.ElementAt(i) >= right) + { + right = Distance.ElementAt(i); + } + } + return Distance; + } + private Boolean CheckOptimalPoint(Int32 optimalPoint, out String debugMessage) + { + Boolean Ok = true; + debugMessage = $"Optimal point check successful at {this.MeterType}{this.MeterIndex}"; + + //if (optimalPoint == this.ErrorValue) + //{ + // debugMessage = $"Optimal point check failed at METER{MeterIndex}"; + // Ok = false; + // return Ok; + //} + + if (optimalPoint > this.OptimumMaxValue) + { + debugMessage = $"Optimal point maximum check failed at {this.MeterType}{this.MeterIndex}"; + Ok = false; + return Ok; + } + + if (optimalPoint < this.OptimumMinValue) + { + debugMessage = $"Optimal point minimum check failed at {this.MeterType}{this.MeterIndex}"; + Ok = false; + return Ok; + } + + return Ok; + } + private Boolean CheckDistance(Double left, Double right, out String debugMessage) + { + Boolean Ok = true; + debugMessage = $"Distance check successful at {this.MeterType}{this.MeterIndex}"; + + if (left < this.OptimumMinDistance) + { + Ok = false; + debugMessage = $"Distance check failed at {this.MeterType}{this.MeterIndex}"; + return Ok; + } + + if (right < this.OptimumMinDistance) + { + Ok = false; + debugMessage = $"Distance check failed at {this.MeterType}{this.MeterIndex}"; + return Ok; + } + + return Ok; + } + private void LeaveSequence() + { + GenesisZeroFlow._GenesisZeroFlow.SetTofIndicatorAmplitudeTest(this.MeterNumber, false); + + #region Write raw data to files + if (this.GenerateLogFiles) + { + GenesisZeroFlow._GenesisZeroFlow.SetLoggingIndicatorAmpTest(this.MeterNumber, false); + String temp = GenesisZeroFlow._GenesisZeroFlow.GetDataToLog()[this.MeterNumber]; + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t Write data to files at {this.MeterType}{this.MeterIndex}\n", this.Culture); + Logging.WriteToFile(temp, GenesisZeroFlow._GenesisZeroFlow.GetLoggingPathAmplitudeTest()[this.MeterNumber]); + } + #endregion + + this.ClearData(); + } + private void ClearData() + { + try + { + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + GenesisZeroFlow.Display.EraseAmplitudeData(this.MeterNumber, Path); + GenesisZeroFlow._GenesisZeroFlow.ClearTotalTimeOfFlightAverage(this.MeterNumber, Path); + GenesisZeroFlow._GenesisZeroFlow.SetDataToLog(this.MeterNumber, String.Empty); + } + } + catch(Exception ex) + { + ErrorLog.Log(LogErrReason.Exeption, "Amplitude.ClearData() failed", $"0x{ex.HResult.ToString("X", this.Culture)}", String.Empty, this.Culture); + } + } + + public void Initialize(String pcbID, String meterType, Int32 optimumMinValue, Int32 optimumMaxValue, Int32 optimumMinDistance, Int32 firstHitLevelPropMin, Int32 firstHitLevelPropMax, Int32 tofRecordingTime, Double triggerValue, Double upperTempLimit, Double lowerTempLimit, Double tempDeviationLimit, Boolean generateMeanFiles, Boolean generateLogFiles) + { + this.TofRecordingTime = tofRecordingTime; + this.FirstHitLevelPercMin = firstHitLevelPropMin; + this.FirstHitLevelPercMax = firstHitLevelPropMax; + this.TriggerValue = triggerValue; + this.OptimumMinValue = optimumMinValue; + this.OptimumMaxValue = optimumMaxValue; + this.OptimumMinDistance = optimumMinDistance; + this.UpperTempLimit = upperTempLimit; + this.LowerTempLimit = lowerTempLimit; + this.TempDeviationLimit = tempDeviationLimit; + this.TempDeviationMin = new Double[Constants.NumberOfPaths]; + this.TempDeviationMax = new Double[Constants.NumberOfPaths]; + this.TempDeviationMin = ArrayInit.Path((Double)0); + this.TempDeviationMax = ArrayInit.Path((Double)0); + this.MeterType = meterType; + this.PcbID = pcbID; + this.GenerateMeanFiles = generateMeanFiles; + this.GenerateLogFiles = generateLogFiles; + } + public UInt16 MeterNumber { get; private set; } + public String MeterIndex { get; private set; } + public String MeterType { get; private set; } + public String PcbID { get; private set; } + public CultureInfo Culture { get; private set; } + private Int32 FirstHitLevelPercMin { get; set; } + private Int32 FirstHitLevelPercMax { get; set; } + private Int32 TofRecordingTime { get; set; } + private Double TriggerValue { get; set; } + private Int32 OptimumMinValue { get; set; } + private Int32 OptimumMaxValue { get; set; } + private Double OptimumMinDistance { get; set; } + private Double[] TempDeviationMin { get; set; } + private Double[] GetTempDeviationMin() + { + return (Double[])TempDeviationMin.Clone(); + } + private Double[] TempDeviationMax { get; set; } + private Double[] GetTempDeviationMax() + { + return (Double[])TempDeviationMax.Clone(); + } + private Double UpperTempLimit { get; set; } + private Double LowerTempLimit { get; set; } + private Double TempDeviationLimit { get; set; } + private Boolean GenerateMeanFiles { get; set; } + private Boolean GenerateLogFiles { get; set; } + + } +} \ No newline at end of file diff --git a/ZeroFlowTool/App.config b/ZeroFlowTool/App.config new file mode 100644 index 00000000..9a17deea --- /dev/null +++ b/ZeroFlowTool/App.config @@ -0,0 +1,35 @@ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ZeroFlowTool/Bars.ico b/ZeroFlowTool/Bars.ico new file mode 100644 index 00000000..48e99abb Binary files /dev/null and b/ZeroFlowTool/Bars.ico differ diff --git a/ZeroFlowTool/BaseProcess.cs b/ZeroFlowTool/BaseProcess.cs new file mode 100644 index 00000000..03f9791f --- /dev/null +++ b/ZeroFlowTool/BaseProcess.cs @@ -0,0 +1,36 @@ +using GenesisZeroFlow; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace GenesisDisplayTool +{ + public abstract class BaseProcess + { + private DialogResult AskHowToProceedSequence(String sequenceName, string MeterType, string MeterIndex, CultureInfo Culture) + { + DialogResult AskForActions; + + GenesisZeroFlow.GenesisZeroFlow.Display.AbortButtonEnabled(false); + AskForActions = MessageBox.Show($"{sequenceName} failed at {MeterType}{MeterIndex}", "Retry?", MessageBoxButtons.RetryCancel, MessageBoxIcon.Question); + switch (AskForActions) + { + case DialogResult.Retry: + GenesisZeroFlow.GenesisZeroFlow.Display.DebugMessage($"APPLICATION:\t\t {sequenceName} restarted at {MeterType}{MeterIndex}\n", Culture); + break; + case DialogResult.Cancel: + GenesisZeroFlow.GenesisZeroFlow.Display.DebugMessage($"APPLICATION:\t\t {sequenceName} canceled at {MeterType}{MeterIndex}\n", Culture); + GenesisZeroFlow.GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line, Culture); + break; + default: break; + } + GenesisZeroFlow.GenesisZeroFlow.Display.AbortButtonEnabled(true); + + return AskForActions; + } + } +} diff --git a/ZeroFlowTool/Completion.cs b/ZeroFlowTool/Completion.cs new file mode 100644 index 00000000..3e85fdf3 --- /dev/null +++ b/ZeroFlowTool/Completion.cs @@ -0,0 +1,893 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Globalization; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using GenesisDisplayTool; +using Xylem.Common.Hardware.WaterMeter.Genesis.Registers; +using Xylem.Common.Hardware.WaterMeter.WaterMeterCore; + +namespace GenesisZeroFlow +{ + public static class CompletionSequences + { + public static Boolean[] Total(MeterBatch globalMeterBatch, MeterBatch thermoMeterBatch, Boolean[] allEnable, out Boolean aborted, CultureInfo culture) + { + #region Definitions and initializations + Boolean[] MeterEnable = Misc.Subarray(allEnable, 0, Constants.NumberOfMeters); + Boolean[] ThermoEnable = Misc.Subarray(allEnable, Constants.NumberOfMeters, Constants.NumberOfThermometers); + + Boolean[] MeterTaskStarted = new Boolean[Constants.NumberOfMeters]; + MeterTaskStarted = ArrayInit.Meter(false); + Boolean[] MeterSequenceOk = new Boolean[Constants.NumberOfMeters]; + MeterSequenceOk = ArrayInit.Meter(false); + Boolean[] MeterSequenceFailed = new Boolean[Constants.NumberOfMeters]; + MeterSequenceFailed = ArrayInit.Meter(false); + Boolean[] MeterTaskCompleted = new Boolean[Constants.NumberOfMeters]; + MeterTaskCompleted = ArrayInit.Meter(false); + + Boolean[] ThermoTaskStarted = new Boolean[Constants.NumberOfThermometers]; + ThermoTaskStarted = ArrayInit.Thermo(false); + Boolean[] ThermoSequenceOk = new Boolean[Constants.NumberOfThermometers]; + ThermoSequenceOk = ArrayInit.Thermo(false); + Boolean[] ThermoSequenceFailed = new Boolean[Constants.NumberOfThermometers]; + ThermoSequenceFailed = ArrayInit.Thermo(false); + Boolean[] ThermoTaskCompleted = new Boolean[Constants.NumberOfThermometers]; + ThermoTaskCompleted = ArrayInit.Thermo(false); + + Int32 NextDelayTime = 0; + aborted = false; + const Int16 LedMode = 6; + const Int16 StoreCalibration = 1; + var listCompl = new List(); + var listMeterNumber = new List(); + var thermolistCompl = new List(); + var thermolistMeterNumber = new List(); + + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + { + var currentMeter = globalMeterBatch.ListOfMeters.FirstOrDefault(m => m.Slot.Equals(Meter + 1)); + + if (currentMeter != null) + listCompl.Add(new Completion(Meter, currentMeter, culture)); + else + listCompl.Add(new Completion(Meter, culture)); + } + for (UInt16 Thermo = Constants.Thermo1; Thermo < Constants.NumberOfThermometers; Thermo++) + { + var currentMeter = thermoMeterBatch.ListOfMeters.FirstOrDefault(m => m.Slot.Equals(Thermo + 11)); + + if (currentMeter != null) + thermolistCompl.Add(new Completion(Thermo, currentMeter, culture)); + else + thermolistCompl.Add(new Completion(Thermo, culture)); + } + #region Initialize + foreach (var compl in listCompl) + { + compl.Initialize(GenesisZeroFlow._GenesisZeroFlow.PcbID[compl.MeterNumber], Constants.Meter, LedMode, StoreCalibration); + compl.MyTask = new Task(() => { return true; }); + } + foreach (var thermocompl in thermolistCompl) + { + thermocompl.Initialize(GenesisZeroFlow._GenesisZeroFlow.ThermoID[thermocompl.MeterNumber], Constants.Thermo, LedMode, StoreCalibration); + thermocompl.MyTask = new Task(() => { return true; }); + } + #endregion + #endregion + #region Perform tests + CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); + CancellationToken token = cancellationTokenSource.Token; + // Completion + + // todo move action into tasks + foreach (var compl in listCompl) + compl.Meter(MeterEnable[compl.MeterNumber], ref MeterTaskStarted[compl.MeterNumber], ref MeterSequenceFailed[compl.MeterNumber], ref NextDelayTime, token); + foreach (var thermocompl in thermolistCompl) + thermocompl.Thermometer(ThermoEnable[thermocompl.MeterNumber], ref ThermoTaskStarted[thermocompl.MeterNumber], ref ThermoSequenceFailed[thermocompl.MeterNumber], ref NextDelayTime, token); + #endregion + #region Wait for tasks + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + MeterSequenceOk[Meter] = false; + + while (!CheckArray(MeterTaskCompleted.Concat(ThermoTaskCompleted).ToArray())) + { + if (GenesisZeroFlow._GenesisZeroFlow.AbortIndicator) + { + aborted = true; + cancellationTokenSource.Cancel(); + } + Misc.WaitNSeconds(1); + + foreach (var compl in listCompl) + MeterTaskCompleted[compl.MeterNumber] = TaskOperations.WaitFor(MeterTaskStarted[compl.MeterNumber], compl.MyTask); + foreach (var compl in listCompl) + MeterSequenceFailed[compl.MeterNumber] = TaskOperations.GetResult(MeterTaskStarted[compl.MeterNumber], compl.MyTask); + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + MeterSequenceOk[Meter] = !MeterSequenceFailed[Meter]; + + foreach (var thermocompl in thermolistCompl) + ThermoTaskCompleted[thermocompl.MeterNumber] = TaskOperations.WaitFor(ThermoTaskStarted[thermocompl.MeterNumber], thermocompl.MyTask); + foreach (var thermocompl in thermolistCompl) + ThermoSequenceFailed[thermocompl.MeterNumber] = TaskOperations.GetResult(ThermoTaskStarted[thermocompl.MeterNumber], thermocompl.MyTask); + for (UInt16 Thermo = Constants.Thermo1; Thermo < Constants.NumberOfThermometers; Thermo++) + ThermoSequenceOk[Thermo] = !ThermoSequenceFailed[Thermo]; + + GenesisZeroFlow.Display.MeterStatusGreenRed(MeterSequenceOk, MeterTaskStarted); + GenesisZeroFlow.Display.ThermoStatusGreenRed(ThermoSequenceOk, ThermoTaskStarted); + } + #endregion + + foreach (var compl in listCompl) + MeterSequenceFailed[compl.MeterNumber] = TaskOperations.GetResult(MeterTaskStarted[compl.MeterNumber], compl.MyTask); + foreach (var thermocompl in thermolistCompl) + ThermoSequenceFailed[thermocompl.MeterNumber] = TaskOperations.GetResult(MeterTaskStarted[thermocompl.MeterNumber], thermocompl.MyTask); + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + MeterSequenceOk[Meter] = !MeterSequenceFailed[Meter]; + for (UInt16 Thermo = Constants.Thermo1; Thermo < Constants.NumberOfThermometers; Thermo++) + ThermoSequenceOk[Thermo] = !ThermoSequenceFailed[Thermo]; + GenesisZeroFlow.Display.MeterStatusGreenRed(MeterSequenceOk, MeterTaskStarted); + GenesisZeroFlow.Display.ThermoStatusGreenRed(ThermoSequenceOk, ThermoTaskStarted); + + #region Destroy tasks + foreach (var metercompl in listCompl) + TaskOperations.CheckAndDispose(metercompl.MyTask); + foreach (var thermocompl in thermolistCompl) + TaskOperations.CheckAndDispose(thermocompl.MyTask); + #endregion + + return MeterSequenceFailed.Concat(ThermoSequenceFailed).ToArray(); + } + public static Boolean TotalTempCal(MeterBatch globalMeterBatch, Boolean enable, CultureInfo culture) + { + #region Definitions and initializations + Boolean SequenceFailed = false; + Boolean TaskStarted = false; + Boolean TaskCompleted = false; + const Int16 LedMode = 0; + const Int16 StoreCalibration = 1; + var listCompl = new List(); + + var currentMeter = globalMeterBatch.ListOfMeters.FirstOrDefault(m => m.Slot.Equals(Constants.Meter1 + 1)); + if (currentMeter != null) + listCompl.Add(new Completion(Constants.Meter1, currentMeter, culture)); + else + listCompl.Add(new Completion(Constants.Meter1, culture)); + + foreach (var compl in listCompl) + { + UInt16 MeterNumber = 0; + if (((Int32)currentMeter.Slot - 1) >= -1) + MeterNumber = (UInt16)(currentMeter.Slot - 1); + + compl.Initialize(String.Empty, Constants.Thermo, LedMode, StoreCalibration); + compl.MyTask = new Task(() => { return true; }); + } + #endregion + #region Perform test + foreach (var compl in listCompl) + compl.MeterTempCal(enable, ref TaskStarted, ref SequenceFailed); + #endregion + #region Wait for tasks + Boolean SequenceOk = false; + + while (!TaskCompleted) + { + foreach (var compl in listCompl) + TaskCompleted = TaskOperations.WaitFor(TaskStarted, compl.MyTask); + + Misc.WaitNSeconds(1); + + foreach (var compl in listCompl) + SequenceFailed = TaskOperations.GetResult(TaskStarted, compl.MyTask); + SequenceOk = !SequenceFailed; + frmTempCalibration.DisplayTempCal.MeterStatusGreenRed(SequenceOk, TaskStarted); + } + #endregion + + foreach (var compl in listCompl) + SequenceFailed = TaskOperations.GetResult(TaskStarted, compl.MyTask); + + SequenceOk = !SequenceFailed; + + #region Destroy tasks + frmTempCalibration.DisplayTempCal.MeterStatusGreenRed(SequenceOk, TaskStarted); + + foreach (var compl in listCompl) + TaskOperations.CheckAndDispose(compl.MyTask); + #endregion + + return SequenceFailed; + } + private static Boolean CheckArray(Boolean[] array) + { + Boolean Completed = true; + + for (Int16 i = 0; i < array.Count(); i++) + { + if (Boolean.Equals(array[i], false)) + return false; + } + + return Completed; + } + } + + public class Completion + { + private readonly ZeroFlowGenesisMeter GenesisMeter; + public Task MyTask { get; internal set; } + /// + /// For ZeroFlowCalibration tool + /// Provides task control for Completion Sequence of 'METER' + /// + /// + /// + /// + /// + /// + public void Meter(Boolean enable, ref Boolean taskStarted, ref Boolean sequenceFailed, ref Int32 nextDelayTime, CancellationToken token) + { + #region Avoid CA1062 + if (MyTask == null) + return; + #endregion + #region Definitions and initializations + DialogResult AskForActions = DialogResult.None; + var _sequenceFailed = sequenceFailed; + Boolean Ok = true; + #endregion + #region Everything else + if ((enable) && (!TaskStatus.Equals(MyTask.Status, TaskStatus.Running)) && (!MyTask.IsCompleted)) + { + taskStarted = true; + + #region Testprocedure + MyTask = Task.Run(() => + { + while ((DialogResult.Equals(AskForActions, DialogResult.Retry)) || (DialogResult.Equals(AskForActions, DialogResult.None))) + { + #region Cancellation token + if (DialogResult.Equals(AskForActions, DialogResult.None)) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t COMPLETION started at {this.MeterType}{this.MeterIndex}\n", this.Culture); + #endregion + #region Sequence + Ok = this.PerformCompletion(token); + if (token.IsCancellationRequested) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t COMPLETION stopped at {this.MeterType}{this.MeterIndex}\n", this.Culture); + GenesisZeroFlow._GenesisZeroFlow.GenerateReturnNote(this.MeterIndex, this.PcbID, GenesisZeroFlow.PredefinedMessages.CompletionStopped(this.Culture), GenesisZeroFlow._GenesisZeroFlow.GetLoggingFromTextBox(), this.Culture); + return false; + } + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t COMPLETION successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + GenesisZeroFlow.Display.DebugMessage($"{Constants.TwentySpaces}\t{Debugmessages.Line}", this.Culture); + _sequenceFailed = false; + + AskForActions = DialogResult.OK; + } + else + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t COMPLETION failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + GenesisZeroFlow._GenesisZeroFlow.GenerateReturnNote(this.MeterIndex, this.PcbID, GenesisZeroFlow.PredefinedMessages.CompletionFailed(this.Culture), GenesisZeroFlow._GenesisZeroFlow.GetLoggingFromTextBox(), this.Culture); + AskForActions = DialogResult.Cancel; + _sequenceFailed = true; + } + #endregion + } + return _sequenceFailed; + }); + #endregion + + } + #endregion + } + /// + /// For ZeroFlowCalibration tool + /// Provides task control for Completion Sequence of 'THERMOMETER' + /// + /// + /// + /// + /// + /// + public void Thermometer(Boolean enable, ref Boolean taskStarted, ref Boolean sequenceFailed, ref Int32 nextDelayTime, CancellationToken token) + { + #region Avoid CA1062 + if (MyTask == null) + return; + #endregion + #region Definitions and initializations + Int32 DelayTime = 0; + const Int32 DeltaDelay = 5; + DialogResult AskForActions = DialogResult.None; + var _sequenceFailed = sequenceFailed; + Int32 temp = DelayTime; + Boolean Ok = true; + #endregion + #region Everything else + if ((enable) && (!TaskStatus.Equals(MyTask.Status, TaskStatus.Running)) && (!MyTask.IsCompleted)) + { + DelayTime = nextDelayTime; + nextDelayTime = nextDelayTime + DeltaDelay; + + taskStarted = true; + Misc.WaitNSeconds((Int32)temp); + + #region Testprocedure + DelayTime = nextDelayTime; + nextDelayTime = nextDelayTime + DeltaDelay; + taskStarted = true; + Misc.WaitNSeconds(temp); + + MyTask = Task.Run(() => + { + while ((Byte.Equals(AskForActions, DialogResult.Retry)) || (Byte.Equals(AskForActions, DialogResult.None))) + { + #region Cancellation token + if (DialogResult.Equals(AskForActions, DialogResult.None)) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t COMPLETION started at {this.MeterType}{this.MeterIndex}\n", this.Culture); + #endregion + #region Sequence + Ok = this.PerformCompletion(token); + if (token.IsCancellationRequested) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t COMPLETION stopped at {this.MeterType}{this.MeterIndex}\n", this.Culture); + return false; + } + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t COMPLETION successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + GenesisZeroFlow.Display.DebugMessage($"{Constants.TwentySpaces}\t{Debugmessages.Line}", this.Culture); + _sequenceFailed = false; + AskForActions = DialogResult.OK; + } + else + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t COMPLETION failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + AskForActions = DialogResult.Cancel; + _sequenceFailed = true; + } + #endregion + } + return _sequenceFailed; + }); + #endregion + + } + #endregion + } + /// + /// For temperature calibration tool + /// + /// + /// + /// + /// + public void MeterTempCal(Boolean enable, ref Boolean taskStarted, ref Boolean sequenceFailed) + { + #region Avoid CA1062 + if (MyTask == null) + return; + #endregion + #region Definitions and initializations + DialogResult AskForActions = DialogResult.None; + var _sequenceFailed = sequenceFailed; + Boolean Ok = false; + #endregion + #region Everything else + if ((enable) && (!TaskStatus.Equals(MyTask.Status, TaskStatus.Running)) && (!MyTask.IsCompleted)) + { + taskStarted = true; + + #region Testprocedure + taskStarted = true; + + MyTask = Task.Run(() => + { + while ((DialogResult.Equals(AskForActions, DialogResult.Retry)) || (DialogResult.Equals(AskForActions, DialogResult.None))) + { + #region Sequence + frmTempCalibration.DisplayTempCal.DebugMessage($"APPLICATION:\t\t COMPLETION sequence started\n", this.Culture); + Ok = PerformCompletionTempCal(); + if (Ok) + { + frmTempCalibration.DisplayTempCal.DebugMessage($"APPLICATION:\t\t COMPLETION sequence successful\n", this.Culture); + frmTempCalibration.DisplayTempCal.DebugMessage(Debugmessages.Line, this.Culture); + _sequenceFailed = false; + + AskForActions = DialogResult.OK; + } + else + { + frmTempCalibration.DisplayTempCal.DebugMessage($"APPLICATION:\t\t COMPLETION sequence failed\n", this.Culture); + frmTempCalibration.DisplayTempCal.DebugMessage(Debugmessages.Line, this.Culture); + + _sequenceFailed = true; + } + #endregion + } + return _sequenceFailed; + }); + #endregion + + } + #endregion + } + /// + /// For ZeroFlowCalibration tool + /// Completion sequence for Meter and Thermometer, both identical + /// + /// + /// + private Boolean PerformCompletion(CancellationToken token) + { + #region Definitions and initializations + Boolean Ok = false; // Ok == true when register write successful + List[] DeltaTimeOfFlight = new List[Constants.NumberOfPaths]; + for (UInt16 i = 0; i < Constants.NumberOfPaths; i++) + DeltaTimeOfFlight[i] = new List(); + #endregion + #region Completion sequence + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t Start COMPLETION at {this.MeterType}{this.MeterIndex}\n", this.Culture); + #region Write '0' to samplerate register + Ok = false; + if (token.IsCancellationRequested) + return false; + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'Samplerate'-register at {this.MeterType}{this.MeterIndex}\n", this.Culture); + + Ok = GenesisMeter.WriteRegisterSafe(Register.Genesisflow.SampleRate, 10); + if (Ok) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'Samplerate'-register successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + else + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'Samplerate'-register failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + + if (Boolean.Equals(Ok, false)) + return Ok; + #endregion + #region Write to led mode register + Ok = false; + + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to '{LedMode.ToString(this.Culture)}' to 'LED mode'-register at {this.MeterType}{this.MeterIndex}\n", this.Culture); + + Ok = GenesisMeter.WriteRegisterSafe(Register.Genesisflow.LedMode, (Byte)LedMode); + if (Ok) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'LED mode'-register successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + else + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'LED mode'-register failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + + if (Boolean.Equals(Ok, false)) + return Ok; + #endregion + #region Write '1' to store completion register + Misc.WaitNSeconds(1); + Ok = false; + if (token.IsCancellationRequested) + return false; + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'Store calibration'-register at {this.MeterType}{this.MeterIndex}\n", this.Culture); + Ok = GenesisMeter.WriteRegisterUnsafe(Register.Genesisflow.StoreCalibration, 1); + if (Ok) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'Store calibration'-register successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + else + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'Store calibration'-register failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + #endregion + #endregion + #region Get registers + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t Read registers at {this.MeterType}{this.MeterIndex}\n", this.Culture); + //todo reimplement + //#region Read zero offset register PATH0 + //Trials = 0; + //Ok = false; + //while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + //{ + // if (token.IsCancellationRequested) + // return false; + + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading 'ZeroFlowOffset1'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials + "\n"); + + // Ok = this.GetRegister(GP30Registers.ZeroOffset1(), out DebugMessage); + // if (Ok) + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'ZeroFlowOffset1'-register successful at METER" + MeterIndex + "\n"); + // else + // { + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'ZeroFlowOffset1'-register failed at METER" + MeterIndex + "\n"); + // if (CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + // reAuthentication = true; + // } + + // Trials++; + //} + //if (Ok == false) + // return Ok; + //#endregion + //#region Read zero offset register PATH1 + //Trials = 0; + //Ok = false; + //while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + //{ + // if (token.IsCancellationRequested) + // return false; + + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading 'ZeroFlowOffset2'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials + "\n"); + + // Ok = this.GetRegister(GP30Registers.ZeroOffset2(), out DebugMessage); + // if (Ok) + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'ZeroFlowOffset2'-register successful at METER" + MeterIndex + "\n"); + // else + // { + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'ZeroFlowOffset2'-register failed at METER" + MeterIndex + "\n"); + // if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + // reAuthentication = true; + // } + + // Trials++; + //} + //if (Ok == false) + // return Ok; + //#endregion + //#region Read zero offset register PATH2 + //Trials = 0; + //Ok = false; + //while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + //{ + // if (token.IsCancellationRequested) + // return false; + + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading 'ZeroFlowOffset3'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + + // Ok = this.GetRegister(GP30Registers.ZeroOffset3(), out DebugMessage); + // if (Ok) + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'ZeroFlowOffset3'-register successful at METER" + MeterIndex + "\n"); + // else + // { + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'ZeroFlowOffset3'-register failed at METER" + MeterIndex + "\n"); + // if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + // reAuthentication = true; + // } + + // Trials++; + //} + //if (Ok == false) + // return Ok; + //#endregion + //#region Read first hit percentage register PATH0 + //Trials = 0; + //Ok = false; + //while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + //{ + // if (token.IsCancellationRequested) + // return false; + + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading 'FirstHitPercentage1'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + + // Ok = this.GetRegister(GP30Registers.FirstHitLevelPercentagePath0(), out DebugMessage); + // if (Ok) + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'FirstHitPercentage1'-register successful at METER" + MeterIndex + "\n"); + // else + // { + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'FirstHitPercentage1'-register failed at METER" + MeterIndex + "\n"); + // if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + // reAuthentication = true; + // } + // Trials++; + //} + //if (Ok == false) + // return Ok; + //#endregion + //#region Read first hit percentage register PATH1 + //Trials = 0; + //Ok = false; + //while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + //{ + // if (token.IsCancellationRequested) + // return false; + + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading 'FirstHitPercentage2'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + + // Ok = this.GetRegister(GP30Registers.FirstHitLevelPercentagePath1(), out DebugMessage); + // if (Ok) + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'FirstHitPercentage2'-register successful at METER" + MeterIndex + "\n"); + // else + // { + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'FirstHitPercentage2'-register failed at METER" + MeterIndex + "\n"); + // if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + // reAuthentication = true; + // } + // Trials++; + //} + //if (Ok == false) + // return Ok; + //#endregion + //#region Read first hit percentage register PATH2 + //Trials = 0; + //Ok = false; + //while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + //{ + // if (token.IsCancellationRequested) + // return false; + + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading 'FirstHitPercentage3'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + + // Ok = this.GetRegister(GP30Registers.FirstHitLevelPercentagePath2(), out DebugMessage); + // if (Ok) + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'FirstHitPercentage3'-register successful at METER" + MeterIndex + "\n"); + // else + // { + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'FirstHitPercentage3'-register failed at METER" + MeterIndex + "\n"); + // if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + // reAuthentication = true; + // } + // Trials++; + //} + //if (Ok == false) + // return Ok; + //#endregion + //#region Read tof temp offset register PATH0 + //Trials = 0; + //Ok = false; + //while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + //{ + // if (token.IsCancellationRequested) + // return false; + + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading 'ToFTempOffset1'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + + // Ok = this.GetRegister(GP30Registers.ToFTempOffset1(), out DebugMessage); + // if (Ok) + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'ToFTempOffset1'-register successful at METER" + MeterIndex + "\n"); + // else + // { + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'ToFTempOffset1'-register failed at METER" + MeterIndex + "\n"); + // if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + // reAuthentication = true; + // } + // Trials++; + //} + //if (Ok == false) + // return Ok; + //#endregion + //#region Read tof temp offset register PATH1 + //Trials = 0; + //Ok = false; + //while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + //{ + // if (token.IsCancellationRequested) + // return false; + + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading 'ToFTempOffset2'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + + // Ok = this.GetRegister(GP30Registers.ToFTempOffset2(), out DebugMessage); + // if (Ok) + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'ToFTempOffset2'-register successful at METER" + MeterIndex + "\n"); + // else + // { + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'ToFTempOffset2'-register failed at METER" + MeterIndex + "\n"); + // if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + // reAuthentication = true; + // } + // Trials++; + //} + //if (Ok == false) + // return Ok; + //#endregion + //#region Read tof temp offset register PATH2 + //Trials = 0; + //Ok = false; + //while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + //{ + // if (token.IsCancellationRequested) + // return false; + + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading 'ToFTempOffset3'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + + // Ok = this.GetRegister(GP30Registers.ToFTempOffset3(), out DebugMessage); + // if (Ok) + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'ToFTempOffset3'-register successful at METER" + MeterIndex + "\n"); + // else + // { + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'ToFTempOffset3'-register failed at METER" + MeterIndex + "\n"); + // if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + // reAuthentication = true; + // } + // Trials++; + //} + + //if (Ok == false) + // return Ok; + //#endregion + //#region Read calfactor register PATH0 + //Trials = 0; + //Ok = false; + //while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + //{ + // if (token.IsCancellationRequested) + // return false; + + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading 'Calfactor1'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + + // Ok = this.GetRegister(GP30Registers.CalFactor1(), out DebugMessage); + // if (Ok) + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'Calfactor1'-register successful at METER" + MeterIndex + "\n"); + // else + // { + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'Calfactor1'-register failed at METER" + MeterIndex + "\n"); + // if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + // reAuthentication = true; + // } + // Trials++; + //} + //if (Ok == false) + // return Ok; + //#endregion + //#region Read calfactor register PATH1 + //Trials = 0; + //Ok = false; + //while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + //{ + // if (token.IsCancellationRequested) + // return false; + + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading 'Calfactor2'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + + // Ok = this.GetRegister(GP30Registers.CalFactor2(), out DebugMessage); + // if (Ok) + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'Calfactor2'-register successful at METER" + MeterIndex + "\n"); + // else + // { + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'Calfactor2'-register failed at METER" + MeterIndex + "\n"); + // if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + // reAuthentication = true; + // } + // Trials++; + //} + //if (Ok == false) + // return Ok; + //#endregion + //#region Read calfactor register PATH2 + //Trials = 0; + //Ok = false; + //while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + //{ + // if (token.IsCancellationRequested) + // return false; + + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading 'Calfactor3'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + + // Ok = this.GetRegister(GP30Registers.CalFactor3(), out DebugMessage); + // if (Ok) + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'Calfactor3'-register successful at METER" + MeterIndex + "\n"); + // else + // { + // GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'Calfactor3'-register failed at METER" + MeterIndex + "\n"); + // if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + // reAuthentication = true; + // } + // Trials++; + //} + //System.Diagnostics.Debug.WriteLine(Ok.ToString()); + //if (Ok == false) + //{ + // System.Diagnostics.Debug.WriteLine("Returning"); + // return Ok; + //} + //System.Diagnostics.Debug.WriteLine("Write data to file"); + //#endregion + //#region Write to file + //DateTime Timestamp = new DateTime(); + //Timestamp = DateTime.Now; + //String TimestampFileName = Timestamp.ToString(Formats.LogFileDateTimeString, this.GlobalCulture); + //String LoggingText = + //"GENESISFLOW_ZeroOffset;0x" + + //GenesisZeroFlow._GenesisZeroFlow.GetZeroFlowOffset()[MeterNumber][Constants.PATH0].ToString("X4", this.GlobalCulture) + ";0x" + + //GenesisZeroFlow._GenesisZeroFlow.GetZeroFlowOffset()[MeterNumber][Constants.PATH1].ToString("X4", this.GlobalCulture) + ";0x" + + //GenesisZeroFlow._GenesisZeroFlow.GetZeroFlowOffset()[MeterNumber][Constants.PATH2].ToString("X4", this.GlobalCulture) + ";\n" + + //"GENESISFLOW_FirstHitPercent;0x" + + //GenesisZeroFlow._GenesisZeroFlow.GetFirstHitPercentage()[MeterNumber][Constants.PATH0].ToString("X4", this.GlobalCulture) + ";0x" + + //GenesisZeroFlow._GenesisZeroFlow.GetFirstHitPercentage()[MeterNumber][Constants.PATH1].ToString("X4", this.GlobalCulture) + ";0x" + + //GenesisZeroFlow._GenesisZeroFlow.GetFirstHitPercentage()[MeterNumber][Constants.PATH2].ToString("X4", this.GlobalCulture) + ";\n" + + //"GENESISFLOW_ToFTempOffset;0x" + + //GenesisZeroFlow._GenesisZeroFlow.GetToFTempOffset()[MeterNumber][Constants.PATH0].ToString("X4", this.GlobalCulture) + ";0x" + + //GenesisZeroFlow._GenesisZeroFlow.GetToFTempOffset()[MeterNumber][Constants.PATH1].ToString("X4", this.GlobalCulture) + ";0x" + + //GenesisZeroFlow._GenesisZeroFlow.GetToFTempOffset()[MeterNumber][Constants.PATH2].ToString("X4", this.GlobalCulture) + ";\n" + + //"GENESISFLOW_Calfactor;0x" + + //GenesisZeroFlow._GenesisZeroFlow.GetCalFactor()[MeterNumber][Constants.PATH0].ToString("X4", this.GlobalCulture) + ";0x" + + //GenesisZeroFlow._GenesisZeroFlow.GetCalFactor()[MeterNumber][Constants.PATH1].ToString("X4", this.GlobalCulture) + ";0x" + + //GenesisZeroFlow._GenesisZeroFlow.GetCalFactor()[MeterNumber][Constants.PATH2].ToString("X4", this.GlobalCulture) + ";\n"; + //Logging.WriteToFile(LoggingText, @"..\GenesisZeroflowTest_Registers_METER" + MeterIndex + "_" + TimestampFileName + ".csv"); + //ClearData(); + //#endregion + #endregion + + return Ok; + } + /// + /// For temperature calibration tool + /// + /// + private Boolean PerformCompletionTempCal() + { + #region Definitions and initializations + List[] DeltaTimeOfFlight = new List[Constants.NumberOfPaths]; + for (UInt16 i = 0; i < Constants.NumberOfPaths; i++) + DeltaTimeOfFlight[i] = new List(); + + Boolean Ok = false; + #endregion + #region Completion sequence + #region Write '0' to samplerate register + Ok = false; + frmTempCalibration.DisplayTempCal.DebugMessage("COMMAND CHANNEL:\t Writing to 'Samplerate'-register\n", this.Culture); + + Ok = GenesisMeter.WriteRegisterSafe(Register.Genesisflow.SampleRate, 0); + if (Ok) + frmTempCalibration.DisplayTempCal.DebugMessage("COMMAND CHANNEL:\t Writing to 'Samplerate'-register successful\n", this.Culture); + else + frmTempCalibration.DisplayTempCal.DebugMessage("COMMAND CHANNEL:\t Writing to 'Samplerate'-register failed\n", this.Culture); + + if (Boolean.Equals(Ok, false)) + return Ok; + #endregion + #region Write to led mode register + Ok = false; + frmTempCalibration.DisplayTempCal.DebugMessage("COMMAND CHANNEL:\t Writing to 'LED mode'-register\n", this.Culture); + Ok = GenesisMeter.WriteRegisterSafe(Register.Genesisflow.LedMode, (Byte)LedMode); + if (Ok) + frmTempCalibration.DisplayTempCal.DebugMessage("COMMAND CHANNEL:\t Writing to 'LED mode'-register successful\n", this.Culture); + else + frmTempCalibration.DisplayTempCal.DebugMessage("COMMAND CHANNEL:\t Writing to 'LED mode'-register failed\n", this.Culture); + + if (Boolean.Equals(Ok, false)) + return Ok; + #endregion + #region Write to store completion register + Misc.WaitNSeconds(1); + Ok = false; + frmTempCalibration.DisplayTempCal.DebugMessage($"COMMAND CHANNEL:\t Writing to 'Store calibration'-register\n", this.Culture); + Ok = GenesisMeter.WriteRegisterUnsafe(Register.Genesisflow.StoreCalibration, 1); + if (Ok) + frmTempCalibration.DisplayTempCal.DebugMessage($"COMMAND CHANNEL:\t Writing to 'Store calibration'-register successful\n", this.Culture); + else + frmTempCalibration.DisplayTempCal.DebugMessage($"COMMAND CHANNEL:\t Writing to 'Store calibration'-register failed\n", this.Culture); + #endregion + #endregion + + return Ok; + } + public Completion(UInt16 meterNumber, CultureInfo culture) + { + this.Culture = culture; + this.MeterNumber = meterNumber; + this.MeterIndex = (meterNumber + 1).ToString(culture); + } + public Completion(UInt16 meterNumber, IMeter meter, CultureInfo culture) + { + if (meter is ZeroFlowGenesisMeter) + { + GenesisMeter = meter as ZeroFlowGenesisMeter; + } + this.Culture = culture; + this.MeterNumber = meterNumber; + this.MeterIndex = (meterNumber + 1).ToString(culture); + } + public void Initialize(String pcbID, String meterType, Int16 ledMode, Int16 storeCalibration) + { + this.LedMode = ledMode; + this.StoreCalibration = storeCalibration; + this.MeterType = meterType; + this.PcbID = pcbID; + } + public UInt16 MeterNumber { get; private set; } + public String MeterIndex { get; set; } + public String PcbID { get; private set; } + private String MeterType { get; set; } + private CultureInfo Culture { get; set; } + private Int16 LedMode { get; set; } + private Int16 StoreCalibration { get; set; } + } +} \ No newline at end of file diff --git a/ZeroFlowTool/Constants.cs b/ZeroFlowTool/Constants.cs new file mode 100644 index 00000000..7544bb0d --- /dev/null +++ b/ZeroFlowTool/Constants.cs @@ -0,0 +1,649 @@ +using PdfSharp.Drawing; +using System; +namespace GenesisZeroFlow +{ + + #region Labels and logging + + static class DataLogging + { + public const String DefaultPath = @"..\"; + } + + public static class ZeroOffsetTestConstants + { + public const Int32 StabilizationTime = 10; + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Tof")] + public static readonly Double DeltaTofAverageFactor =((Math.Pow(10, 12)) / (Math.Pow(2, 38)));// /3.6379788; + public const Int32 BadDataLimit = 3; + } + + static class Debugmessages + { + public const Boolean MessagesEnabled = false; + public const String Line = "----------------------------------------------------------------------------------------------------------------------------------------------------------\n"; + } + + + static class DataError + { + public const Int32 NoError = 0; + public const Int32 Pulsewidth = 0x0F0D; + public const Int32 Amplitude = 0x0F0E; + public const Int32 TofOutOfRange = 0x0F0F; + public const Int32 DeltaTimeOfFlight = 0x0F10; + public const Int32 TofTimeout = 0x0F11; + public const Int32 Unknown = 0xFFFF; + } + + static class SerialSettings + { + public const String Path = @"..\SerialSettings.txt"; + } + static class PreparationValues + { + public const Int32 CalFactor1 = 15625; + public const Int32 CalFactor2 = 15625; + public const Int32 CalFactor3 = 15625; + public const Int32 ZeroOffset1 = 0; + public const Int32 ZeroOffset2 = 0; + public const Int32 ZeroOffset3 = 0; + public const Int32 Samplerate = 10; + public const Int32 MeterSize = 1; + public const Int32 LedMode = 3; + + } + static class StatusPanelItems + { + public const Int32 None = 0; + public const Int32 Detect = 1; + public const Int32 Prepare = 2; + public const Int32 Amplitude = 3; + public const Int32 Offset = 4; + public const Int32 Completion = 5; + public const Int32 TempCal = 6; + } + static class Settingsfile + { + // for position of items in file + public const Int32 CmdMeter1Baudrate = 0; + public const Int32 CmdMeter1Databits = 1; + public const Int32 CmdMeter1Comselect = 2; + public const Int32 CmdMeter1Stopbits = 3; + public const Int32 CmdMeter1Parity = 4; + public const Int32 CmdMeter1Handshake = 5; + public const Int32 DataMeter1Baudrate = 6; + public const Int32 DataMeter1Databits = 7; + public const Int32 DataMeter1Comselect = 8; + public const Int32 DataMeter1Stopbits = 9; + public const Int32 DataMeter1Parity = 10; + public const Int32 DataMeter1Handshake = 11; + public const Int32 RawLogEnable = 12; + public const Int32 CsvLogEnable = 13; + public const Int32 CsvLogPath0 = 14; + public const Int32 CsvLogPath1 = 15; + public const Int32 CsvLogPath2 = 16; + public const Int32 ListBoxOption = 17; + public const Int32 MaingraphXval = 18; + public const Int32 MaingraphPath0 = 19; + public const Int32 MaingraphPath1 = 20; + public const Int32 MaingraphPath2 = 21; + public const Int32 MaingraphFlowVal = 22; + public const Int32 Password1 = 23; + public const Int32 JsonPath = 24; + public const Int32 StdDeviationXval = 25; + public const Int32 StdDeviationValues = 26; + public const Int32 StdDeviationEnHit0Path0 = 27; + public const Int32 StdDeviationEnHit1Path0 = 28; + public const Int32 StdDeviationEnHit2Path0 = 29; + public const Int32 StdDeviationEnHit3Path0 = 30; + public const Int32 StdDeviationEnHit4Path0 = 31; + public const Int32 StdDeviationEnHit5Path0 = 32; + public const Int32 StdDeviationEnHit6Path0 = 33; + public const Int32 StdDeviationEnHit7Path0 = 34; + public const Int32 StdDeviationEn3HitsPath0 = 35; + public const Int32 StdDeviationEn8HitsPath0 = 36; + public const Int32 StdDeviationEnHit0Path1 = 37; + public const Int32 StdDeviationEnHit1Path1 = 38; + public const Int32 StdDeviationEnHit2Path1 = 39; + public const Int32 StdDeviationEnHit3Path1 = 40; + public const Int32 StdDeviationEnHit4Path1 = 41; + public const Int32 StdDeviationEnHit5Path1 = 42; + public const Int32 StdDeviationEnHit6Path1 = 43; + public const Int32 StdDeviationEnHit7Path1 = 44; + public const Int32 StdDeviationEn3HitsPath1 = 45; + public const Int32 StdDeviationEn8HitsPath1 = 46; + public const Int32 StdDeviationEnHit0Path2 = 47; + public const Int32 StdDeviationEnHit1Path2 = 48; + public const Int32 StdDeviationEnHit2Path2 = 49; + public const Int32 StdDeviationEnHit3Path2 = 50; + public const Int32 StdDeviationEnHit4Path2 = 51; + public const Int32 StdDeviationEnHit5Path2 = 52; + public const Int32 StdDeviationEnHit6Path2 = 53; + public const Int32 StdDeviationEnHit7Path2 = 54; + public const Int32 StdDeviationEn3HitsPath2 = 55; + public const Int32 StdDeviationEn8HitsPath2 = 56; + public const Int32 LogDirectory = 57; + public const Int32 ReportDirectory = 58; + public const Int32 ImagesDirectory = 59; + public const Int32 CsvDirectory = 60; + public const Int32 MassLogging = 61; + public const Int32 CmdMeter2Baudrate = 62; + public const Int32 CmdMeter2Databits = 63; + public const Int32 CmdMeter2Comselect = 64; + public const Int32 CmdMeter2Stopbits = 65; + public const Int32 CmdMeter2Parity = 66; + public const Int32 CmdMeter2Handshake = 67; + public const Int32 DataMeter2Baudrate = 68; + public const Int32 DataMeter2Databits = 69; + public const Int32 DataMeter2Comselect = 70; + public const Int32 DataMeter2Stopbits = 71; + public const Int32 DataMeter2Parity = 72; + public const Int32 DataMeter2Handshake = 73; + public const Int32 CmdMeter3Baudrate = 74; + public const Int32 CmdMeter3Databits = 75; + public const Int32 CmdMeter3Comselect = 76; + public const Int32 CmdMeter3Stopbits = 77; + public const Int32 CmdMeter3Parity = 78; + public const Int32 CmdMeter3Handshake = 79; + public const Int32 DataMeter3Baudrate = 80; + public const Int32 DataMeter3Databits = 81; + public const Int32 DataMeter3Comselect = 82; + public const Int32 DataMeter3Stopbits = 83; + public const Int32 DataMeter3Parity = 84; + public const Int32 DataMeter3Handshake = 85; + public const Int32 Password2 = 86; + public const Int32 Password3 = 87; + + } + static class ReportParams + { + public const Int32 LogoXPos = 500; + public const Int32 LogoYPos = 10; + public const Int32 LogoXSize = 50; + public const Int32 LogoYSize = 25; + public const Int32 HeadlineXPos = 0; + public const Int32 HeadlineYPos = 50; + public const Int32 Headline2XPos = 128; + public const Int32 Headline2YPos = 113; + public const Int32 PageNumberXPosition = 220; + public const Int32 PageNumberYPosition = -20; + public const Int32 StandardTextXPos = 128; + public const Int32 StandardTextYPos = 150; + public const Int32 ImageXSize = 400; + public const Int32 ImageYSize = 240; + public const Int32 ImageXPos = 125; + public const Int32 ImageYPos = 135; + public const Int32 IntroductionXPos = 100; + public const Int32 IntroductionYPos = 600; + public static readonly XFont font20 = new XFont("Eras Bold ITC ", 20, XFontStyle.Bold); + public static readonly XFont font14 = new XFont("Calibri", 14, XFontStyle.Bold); + public static readonly XFont font12 = new XFont("Calibri", 12, XFontStyle.BoldItalic); + public static readonly XFont fontStandard = new XFont("Calibri", 10, XFontStyle.Regular); + public static readonly XFont fontSmall = new XFont("Calibri", 9, XFontStyle.Regular); + public static readonly XFont fontVerySmall = new XFont("Calibri", 8, XFontStyle.Regular); + public const Int32 Column1 = 0; + public const Int32 Column2 = 1; + public const Int32 Column3 = 2; + public const Int32 Column4 = 3; + public const Int32 Column5 = 4; + } + + static class TempCalMode + { + public const Int32 Adjustment = 0; + public const Int32 Measurement = 1; + } + + static class ScrRes + { + public const UInt16 Low = 0; + public const UInt16 High = 1; + public const Double Scale = 0.53; + } + + static class Constants + { + public const String Meter = "METER"; + public const String Thermo = "THERMOMETER"; + public const String TwentySpaces = " "; + + public const Double Vcal = 350; // For amplitude measurement. See TDC-GP30, vol.3, 2-6 + public const UInt16 NumberOfMeters = 10; + public const UInt16 NumberOfThermometers = 2; + public const UInt16 Meter1 = 0; + public const UInt16 Meter2 = 1; + public const UInt16 Meter3 = 2; + public const UInt16 Meter4 = 3; + public const UInt16 Meter5 = 4; + public const UInt16 Meter6 = 5; + public const UInt16 Meter7 = 6; + public const UInt16 Meter8 = 7; + public const UInt16 Meter9 = 8; + public const UInt16 Meter10 = 9; + public const UInt16 Thermo1 = 0; + public const UInt16 Thermo2 = 1; + public const UInt16 Thermo3 = 2; + + public const UInt16 Slot1 = 1; + public const UInt16 Slot2 = 2; + public const UInt16 Slot3 = 3; + public const UInt16 Slot4 = 4; + public const UInt16 Slot5 = 5; + public const UInt16 Slot6 = 6; + public const UInt16 Slot7 = 7; + public const UInt16 Slot8 = 8; + public const UInt16 Slot9 = 9; + public const UInt16 Slot10 = 10; + public const UInt16 Slot11 = 11; + public const UInt16 Slot12 = 12; + + public const UInt16 CmdMeter1 = 0; + public const UInt16 CmdMeter2 = 1; + public const UInt16 CmdMeter3 = 2; + public const UInt16 CmdMeter4 = 3; + public const UInt16 CmdMeter5 = 4; + public const UInt16 CmdMeter6 = 5; + public const UInt16 CmdMeter7 = 6; + public const UInt16 CmdMeter8 = 7; + public const UInt16 CmdMeter9 = 8; + public const UInt16 CmdMeter10 = 9; + public const UInt16 CmdThermo1 = 0; // tbc + public const UInt16 CmdThermo2 = 1; // tbc + public const UInt16 DataMeter1 = 10; + public const UInt16 DataMeter2 = 11; + public const UInt16 DataMeter3 = 12; + public const UInt16 DataMeter4 = 13; + public const UInt16 DataMeter5 = 14; + public const UInt16 DataMeter6 = 15; + public const UInt16 DataMeter7 = 16; + public const UInt16 DataMeter8 = 17; + public const UInt16 DataMeter9 = 18; + public const UInt16 DataMeter10 = 19; + public const UInt16 DataThermo1 = CmdThermo1 + Constants.NumberOfThermometers; // tbc + public const UInt16 DataThermo2 = CmdThermo2 + Constants.NumberOfThermometers; // tbc + + public const UInt16 MainGraphDefaultXValues = 200; + public const UInt16 MainGraphDefaultFlowValue = 10; + public const UInt16 MainGraphListMaxElements = 20000; + public const UInt16 StdDevGraphDefaultXValues = 200; + public const UInt16 StdDevGraphDefaultElements = 20; + public const UInt16 StdDevGraphListMaxElements = 20000; + public static UInt16 NumberOfPaths = 3; + public const UInt16 PATH0 = 0; + public const UInt16 PATH1 = 1; + public const UInt16 PATH2 = 2; + public const UInt16 NOPATH = 4; + public const UInt16 HIT0 = 0; + public const UInt16 HIT1 = 1; + public const UInt16 HIT2 = 2; + public const UInt16 HIT3 = 3; + public const UInt16 HIT4 = 4; + public const UInt16 HIT5 = 5; + public const UInt16 HIT6 = 6; + public const UInt16 HIT7 = 7; + public const UInt16 ListItem0 = 0; + public const UInt16 ListItem1 = 1; + public const UInt16 ListItem2 = 2; + public const UInt16 ListItem3 = 3; + public const UInt16 ListItem4 = 4; + public const UInt16 ListItem5 = 5; + public const UInt16 ListItem6 = 6; + public const String CsvDefaultModeString = "0x1C"; + public const Double DefaultScrollGrace = (Double)0.05; + public const Double FirstHitLevelFactor = (Double)0.88; + public const Double DefaultHccCorrectionFactor = 1.0; + public const UInt16 Gp30WriteMultipleMaxLength = 20; // tbc + public const Double NominalFrequency = 4.0; + public const Double FlowFactor = 0.0036379788; + + + + } + static class Formats + { + #region Format strings for display + #region Format strings for "Decoded Data"-display + public const String TofDispString = "000000.00000000"; + public const String HccCorrectionValue = "0.00000"; + public const String PwDispString = "0.00"; + public const String AmpDispUpString = "000.0"; + public const String AmpDispDownString = "-000.0"; + public const String TempDispString = "0.00"; + public const String Flow = "0.00"; + #endregion + #region Format strings for "Mean"-Display + public const String MeanDispString = "0.00"; + #endregion + #region Format strings for "Std-Deviation"-Display + public const String StdDevDispString = "0.00"; + #endregion + #endregion + #region Format strings for CSV-Logging + public const String TofLogString = "000000.00000000"; + public const String PwLogString = "0.00"; + public const String AmpLogString = "000.0"; + public const String TempLogString = "0.00"; + public const String CsvDateTimeLogString = "HH:mm:ss:fff;yyyy.MM.dd;"; + public const String ErrorLogString = "HH:mm:ss:fff;yyyy.MM.dd;"; + public const String RawDataDateTimeLogString = "yyyy-MM-dd HH:mm:ss:ff "; + public const String CsvIndexLogString = "{0:D8}"; + public const String CsvFileDateTimeString = "yyyyMMdd_HHmmss_"; + public const String TxtFileDateTimeString = "yyyyMMdd_HHmmss_"; + public const String LogFileDateTimeString = "yyyyMMdd_HHmmss"; + public const String HeaderFileDateTimeString = "yyyy-MM-dd HH:mm:ss"; + public const String StatusDateTimeString = "HH:mm:ss"; + #endregion + #region Date/ Time for raw file naming + public const String RawFileDateTimeString = "yyyyMMdd_HHmmss_"; + #endregion + #region Date/ Time for image files naming + public const String ImageFileDateTimeString = "yyyyMMdd_HHmmss_"; + #endregion + #region Date/ Time for reports + public const String ReportDateTimeTitleString = "yyyy-MM-dd"; + public const String PdfDateTimeString = "yyyyMMdd_HHmmss_"; + #endregion + #region Format for GP30 first hit level adjustments + public const String FirstHitLevelVoltage = "000.00"; + #endregion + + + + } + static class Units + { + #region Unit strings for Display + public const String TofDispString = " ns"; + public const String DifTofDispString = " ps"; + public const String StdDevDispString = " ps"; + public const String AmpDispString = " mV"; + public const String TempDispString = " °C"; + public const String Flow = " m³/h"; + #endregion + #region Unit Strings for CSV-Logging + public const String TofCsvLogString = "E-9;"; + #endregion + #region First hit level voltage + public const String FirstHitLevelVoltage = " mV"; + #endregion + } + #endregion + #region Serial stuff + /* + public static class SettingsFileError + { + public const Int32 OK = 0x00; + public const Int32 Length = 0x01; + public const Int32 Format = 0x02; + public const Int32 Unknown = 0x03; + } + */ + public static class Message + { + public const String Data = "V"; + public const String Temperature = "T"; + public const String Comment = "C"; + public const String Hcc = "H"; + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Ident")] + public const Int32 ProtocolIdentPosition = 24; + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Messagetype")] + public const Int32 MessagetypePosition = 26; + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Ident")] + public const Int32 PathIdentPosition = 28; + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Ident")] + public const Int32 ValidIdentPosition = 30; + } + #endregion + #region GP30 stuff + + + public static class GP30Registers + { + + public static Byte[] TriggerUpgrade() { return new Byte[] { 0x00, 0x00 }; } + public static Byte[] CheckPresence() { return new Byte[] { 0x00, 0x01 }; } + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Pcb")] + public static Byte[] PcbSerialNumber() { return new Byte[] { 0x00, 0x02 }; } + public static Byte[] CustomerSerialNumber0() { return new Byte[] { 0x00, 0x03 }; } + public static Byte[] CustomerSerialNumber1() { return new Byte[] { 0x00, 0x04 }; } + public static Byte[] CustomerSerialNumber2() { return new Byte[] { 0x00, 0x05 }; } + public static Byte[] CustomerSerialNumber3() { return new Byte[] { 0x00, 0x06 }; } + public static Byte[] MonotonicSeconds() { return new Byte[] { 0x00, 0x07 }; } + public static Byte[] CalendarSeconds() { return new Byte[] { 0x00, 0x08 }; } + public static Byte[] CoreRevision() { return new Byte[] { 0x00, 0x09 }; } + public static Byte[] DriveCapacity() { return new Byte[] { 0x00, 0x0A }; } + public static Byte[] ExitReason() { return new Byte[] { 0x00, 0x0B }; } + public static Byte[] CorePlatform() { return new Byte[] { 0x00, 0x0C }; } + public static Byte[] Quota() { return new Byte[] { 0x08, 0x00 }; } + public static Byte[] Drive() { return new Byte[] { 0x08, 0x01 }; } + public static Byte[] TriggerLogFlush() { return new Byte[] { 0x08, 0x02 }; } + public static Byte[] AlarmStatus0() { return new Byte[] { 0x09, 0x00 }; } + public static Byte[] AlarmStatus1() { return new Byte[] { 0x09, 0x01 }; } + public static Byte[] TriggerAlarmCancel() { return new Byte[] { 0x09, 0x02 }; } + public static Byte[] AlarmStatus2() { return new Byte[] { 0x09, 0x03 }; } + public static Byte[] AlarmStatus3() { return new Byte[] { 0x09, 0x04 }; } + public static Byte[] AlarmStatus4() { return new Byte[] { 0x09, 0x05 }; } + public static Byte[] AlarmStatus5() { return new Byte[] { 0x09, 0x06 }; } + public static Byte[] AlarmStatus6() { return new Byte[] { 0x09, 0x07 }; } + public static Byte[] AlarmStatus7() { return new Byte[] { 0x09, 0x08 }; } + public static Byte[] AlarmEnableMask() { return new Byte[] { 0x09, 0x09 }; } + public static Byte[] AlarmVisualAutoClearMask() { return new Byte[] { 0x09, 0x0A }; } + public static Byte[] BatteryVoltage() { return new Byte[] { 0x01, 0x00 }; } + public static Byte[] BatteryManufacturer() { return new Byte[] { 0x01, 0x01 }; } + public static Byte[] Privilege() { return new Byte[] { 0x04, 0x00 }; } + public static Byte[] Password() { return new Byte[] { 0x04, 0x01 }; } + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Samplerate")] + public static Byte[] Samplerate() { return new Byte[] { 0x0F, 0x00 }; } + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Lvl")] + public static Byte[] FirstHitLvlUp1() { return new Byte[] { 0x0F, 0x01 }; } + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Lvl")] + public static Byte[] FirstHitLvlUp2 () { return new Byte[] { 0x0F, 0x02 }; } + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Lvl")] + public static Byte[] FirstHitLvlUp3() { return new Byte[] { 0x0F, 0x03 }; } + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Lvl")] + public static Byte[] FirstHitLvlDown1() { return new Byte[] { 0x0F, 0x04 }; } + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Lvl")] + public static Byte[] FirstHitLvlDown2() { return new Byte[] { 0x0F, 0x05 }; } + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Lvl")] + public static Byte[] FirstHitLvlDown3() { return new Byte[] { 0x0F, 0x06 }; } + public static Byte[] StartHit() { return new Byte[] { 0x0F, 0x07 }; } + public static Byte[] AmplitudePeakDetectEnd() { return new Byte[] { 0x0F, 0x08 }; } + public static Byte[] NumberOfTXBursts() { return new Byte[] { 0x0F, 0x09 }; } + public static Byte[] MeterSize() { return new Byte[] { 0x0F, 0x0C }; } + public static Byte[] CalFactor1() { return new Byte[] { 0x0F, 0x0D }; } + public static Byte[] CalFactor2() { return new Byte[] { 0x0F, 0x0E }; } + public static Byte[] CalFactor3() { return new Byte[] { 0x0F, 0x0F }; } + public static Byte[] ZeroOffset1() { return new Byte[] { 0x0F, 0x10 }; } + public static Byte[] ZeroOffset2() { return new Byte[] { 0x0F, 0x11 }; } + public static Byte[] ZeroOffset3() { return new Byte[] { 0x0F, 0x12 }; } + public static Byte[] ResetAccu() { return new Byte[] { 0x0F, 0x14 }; } + public static Byte[] Arrow() { return new Byte[] { 0x0F, 0x15 }; } + public static Byte[] LedMode() { return new Byte[] { 0x0F, 0x16 }; } + public static Byte[] StoreCalibration() { return new Byte[] { 0x0F, 0x17 }; } + public static Byte[] FirstHitLevelPercentagePath0() { return new Byte[] { 0x0F, 0x26 }; } + public static Byte[] FirstHitLevelPercentagePath1() { return new Byte[] { 0x0F, 0x27 }; } + public static Byte[] FirstHitLevelPercentagePath2() { return new Byte[] { 0x0F, 0x28 }; } + public static Byte[] FirstHitShift() { return new Byte[] { 0x0F, 0x29 }; } + public static Byte[] FirstHitMinimum() { return new Byte[] { 0x0F, 0x2A }; } + public static Byte[] TofErrorLimit() { return new Byte[] { 0x0F, 0x2B }; } + public static Byte[] FirstHitUpdatePeriod() { return new Byte[] { 0x0F, 0x2C }; } + public static Byte[] ToFTempOffset1() { return new Byte[] { 0x0F, 0x2E }; } + public static Byte[] ToFTempOffset2() { return new Byte[] { 0x0F, 0x2F }; } + public static Byte[] ToFTempOffset3() { return new Byte[] { 0x0F, 0x30 }; } + public static Byte[] ToFTempCalibrate() { return new Byte[] { 0x0F, 0x31 }; } + + + } + + public static class GP30RequestType + { + public const Byte ReadRegister = 0x00; + public const Byte WriteRegister = 0x01; + public const Byte QueryCaps = 0x02; + public const Byte MultipleWrite = 0x03; + } + + public static class GP30Commands + { + public const Byte Startbyte = 0x5B; + public const Byte Nop = 0x00; + public const Byte QueryCaps = 0x01; + public const Byte QueryCapsReply = 0x02; + public const Byte SetCaps = 0x03; + public const Byte SetCapsReply = 0x04; + public const Byte Train = 0x05; + public const Byte TrainReply = 0x06; + public const Byte RepeatLast = 0x07; + public const Byte RepeatLastReply = 0x08; + public const Byte ReadData = 0x09; + public const Byte ReadDataReply = 0x0A; + public const Byte WriteData = 0x0B; + public const Byte WriteDataReply = 0x0C; + public const Byte MultipleReaddata = 0x0D; + public const Byte MultipleReaddataReply = 0x0E; + public const Byte MultipleWritedata = 0x0F; + public const Byte MultipleWritedataReply = 0x10; + public const Byte SetLevel = 0x11; + public const Byte SetLevelreply = 0x12; + public const Byte SetBitrateLsb = 0x03; + public const Byte SetBitrateMsb = 0x05; + public const Byte SetPacketSizesLsb = 0x04; + public const Byte SetPacketSizesMsb = 0x05; + public const Byte SetProtocolLsb = 0x02; + public const Byte SetProtocolMsb = 0x05; + + } + + public static class GP30Payload + { + public const Byte GetBitrateLsb = 0x00; + public const Byte GetBitrateMsb = 0x05; + public const Byte GetPacketSizesLsb = 0x01; + public const Byte GetPacketSizesMsb = 0x05; + public const Byte GetProtocolLsb = 0x02; + public const Byte GetProtocolMsb = 0x05; + } + + public static class GP30BytePosition + { + public const Byte ErrCodeBase = 7; + public const Byte ErrCodeSubreason = 6; + public const Byte CrcLsb = 5; + public const Byte CrcMsb = 6; + public const Byte Cmd = 2; + public const Byte Reply = 8; + public const Byte ReplyMsb = 9; + public const Byte CmdBitrateLsb = 12; + public const Byte CmdBitrateMsb = 13; + public const Byte BitrateLsb = 14; + public const Byte BitrateMsb = 15; + public const Byte CmdPacketSizeLsb = 18; + public const Byte CmdPacketSizeMsb = 19; + public const Byte PacketSizeLsb = 20; + public const Byte PacketSizeMsb = 21; + public const Byte CmdProtocolLsb = 24; + public const Byte CmdProtocolMsb = 25; + public const Byte ProtocolLsb = 26; + public const Byte ProtocolMsb = 27; + + } + + public static class GP30ConfigExErrors + { + public const Byte BaseOk = 0x00; + public const Byte Base = 0x04; + public const Byte LockedOut = 0x00; + public const Byte AuthenticationFail = 0x01; + public const Byte AccessDenied = 0x02; + public const Byte UnknownParameter = 0x03; + public const Byte InUse = 0x04; + public const Byte SizesDoNotMatch = 0x05; + public const Byte CannotReadConfigfile = 0x06; + public const Byte UserNotKnown = 0x07; + public const Byte CannotCreateConfigfile = 0x08; + public const Byte StoreDidNotStore = 0x09; + public const Byte StoreCorrupt = 0x0A; + public const Byte ExpectedWrite = 0x0B; + public const Byte ExpectedRead = 0x0C; + public const Byte StopCycling = 0x0D; + public const Byte TooManyOpen = 0x0E; + public const Byte NeverOpened = 0x0F; + public const Byte FileProtected = 0x1F; + public const Byte PartialRecall = 0x2F; + public const Byte DefaultPasswordUsed = 0x3F; + + } + + public static class GP30HighLevelErrors + { + public const Byte BaseOk = 0x00; + public const Byte Base = 0x05; + public const Byte PayloadCount = 0x00; + public const Byte InvalidSubreason = 0x01; + public const Byte InvalidBaudrate = 0x02; + public const Byte InvalidBuffersize = 0x03; + public const Byte CrcFailure = 0x04; + public const Byte UnrecognizedCmd = 0x05; + public const Byte Framing = 0x06; + public const Byte Overflow = 0x07; + public const Byte PacketTimeout = 0x08; + public const Byte InvalidEscape = 0x09; + public const Byte UnknownParameter = 0x0A; + public const Byte TrainingFailed = 0x0B; + public const Byte NoBreak = 0x0C; + public const Byte NoSubreason = 0xFF; + + } + + public static class GP30LowLevelErrors + { + public const Int32 NoError = 0; + public const Int32 SerialPortClosed = -2; + public const Int32 SerialPortWriteFailure = -3; + public const Int32 SerialPortReadFailure = -4; + public const Int32 MaxDataLength = -5; + public const Int32 Exception = -6; + public const Int32 CrcCalcError = -7; + public const Int32 Unknown = -8; + public const Int32 Timeout = -9; + } + + public static class GP30PrivilegeLevel + { + public const Byte Level1 = 0x01; + public const Byte Level2 = 0x02; + public const Byte Level3 = 0x03; + public const Byte Level4 = 0x04; + public const Byte Level5 = 0x05; + public const Byte Level6 = 0x06; + public const Byte Level7 = 0x07; + public const Byte Level8 = 0x08; + public const Byte LevelDefault = 0xFF; + + } + + + + public static class GP30Parameters + { + public const Double FirstHitVoltageMin = 200; // [TBC] + public const Double FirstHitVoltageMax = 1000; // [TBC] + public const UInt16 Timeout = 5; + public const UInt16 PasswordMaxLength = 12; + public const UInt16 TXDataMaxLength = 8; + } + + #endregion + #region Error logging + public static class LogErrReason + { + public const String Exeption = "exception"; + public const String Function = "function"; + public const String Unknown = "unknown"; + } + #endregion + +} + + diff --git a/ZeroFlowTool/CsvLogging.cs b/ZeroFlowTool/CsvLogging.cs new file mode 100644 index 00000000..6adab74b --- /dev/null +++ b/ZeroFlowTool/CsvLogging.cs @@ -0,0 +1,15 @@ +using System; +using System.IO; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using System.Text.RegularExpressions; + + + +namespace GenesisDisplayTool +{ + +} + + diff --git a/ZeroFlowTool/DecodeTelegram.cs b/ZeroFlowTool/DecodeTelegram.cs new file mode 100644 index 00000000..308e6c26 --- /dev/null +++ b/ZeroFlowTool/DecodeTelegram.cs @@ -0,0 +1,223 @@ +using System; +using System.Linq; +using System.Globalization; + +namespace GenesisZeroFlow +{ + public static partial class DecodeTelegram + { + public static DecodedData[] DecodedDataDecodeTelegram(String rxData, DecodedData[] decodedData) + { + #region Definitions and initializations + DecodedData[] DecodingResult = DecodedDataHelper.GetDefaultDecodedDataArray(Constants.NumberOfPaths); + #region CA1062 + if ((decodedData == null)||(rxData == null)) + return DecodingResult; + #endregion + DecodingResult[Constants.PATH0] = ((DecodedData)(decodedData[Constants.PATH0].Clone())); + DecodingResult[Constants.PATH1] = ((DecodedData)(decodedData[Constants.PATH1].Clone())); + DecodingResult[Constants.PATH2] = ((DecodedData)(decodedData[Constants.PATH2].Clone())); + #endregion + #region Prepare RX data + String[] HexValues = rxData.Split(' '); + #endregion + #region Call decoder + #region Decode protocol H + DecodingResult = DecodeTelegram.DecodeProtocolH(HexValues, DecodingResult); + #endregion + #endregion + #region Return data + return DecodingResult; + #endregion + } + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1305:SpecifyIFormatProvider", MessageId = "System.UInt16.ToString(System.String)")] + public static DecodedData[] DecodeProtocolH(String[] hexValues, DecodedData[] inputDecodedData) + { + #region Definitions and initializations + const UInt16 TelegramLength = 15; + DecodedData[] ReturnData = DecodedDataHelper.GetDefaultDecodedDataArray(Constants.NumberOfPaths); + if ((inputDecodedData == null) || (hexValues == null)) + return ReturnData; + + ReturnData[Constants.PATH0] = ((DecodedData)(inputDecodedData[Constants.PATH0].Clone())); + ReturnData[Constants.PATH1] = ((DecodedData)(inputDecodedData[Constants.PATH1].Clone())); + ReturnData[Constants.PATH2] = ((DecodedData)(inputDecodedData[Constants.PATH2].Clone())); + + Int32 temp = 0; + UInt16 DatIndex = 0; + UInt16 DecodedPath = Constants.PATH0; + String ProtocolVersion = String.Empty; + #endregion + + try + { + #region Decode comment ("DATA CHANNEL") + if ((hexValues[0] == "@h") && (hexValues.Count() == TelegramLength)) + { + #region Reset data + ReturnData[Constants.PATH0].DecodingSucceeded = false; + ReturnData[Constants.PATH1].DecodingSucceeded = false; + ReturnData[Constants.PATH2].DecodingSucceeded = false; + ReturnData[Constants.PATH0].MessageType = String.Empty; + ReturnData[Constants.PATH1].MessageType = String.Empty; + ReturnData[Constants.PATH2].MessageType = String.Empty; + #endregion + #region Decode + foreach (String HexValue in hexValues) + { + switch (DatIndex) + { + #region Decode telegram ("DATA CHANNEL") + #region Protocol version + case 0: + ProtocolVersion = HexValue; + break; + #endregion + #region Decode PATH + case 1: + if (UInt16.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out DecodedPath)) + { + DecodedPath--; + ReturnData[Constants.PATH0].Path = DecodedPath; + ReturnData[Constants.PATH1].Path = DecodedPath; + ReturnData[Constants.PATH2].Path = DecodedPath; + } + ReturnData[DecodedPath].ProtocolVersion = ProtocolVersion; + break; + #endregion + #region ERROR + case 2: + + if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp)) + ReturnData[DecodedPath].Error = temp; + else + ReturnData[DecodedPath].Error = DataError.Unknown; + break; + #endregion + #region Total time of flight + case 3: + if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp)) + ReturnData[DecodedPath].TotalTimeOfFlightAverage = temp * ZeroOffsetTestConstants.DeltaTofAverageFactor / 1000000; // value in µs + break; + #endregion + #region Delta time of flight + case 4: + if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp)) + ReturnData[DecodedPath].DeltaTimeOfFlightAverage = temp * ZeroOffsetTestConstants.DeltaTofAverageFactor; // value in ps + break; + #endregion + #region Raw delta volume + case 5: + if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp)) + ReturnData[DecodedPath].RawDeltaVolume = (Double)temp; + break; + #endregion + #region Raw accumulated volume + case 6: + if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp)) + ReturnData[DecodedPath].RawDeltaVolumeAccu = (Double)temp; + break; + #endregion + #region Raw delta volume scaling + case 7: + if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp)) + ReturnData[DecodedPath].RawDeltaVolumeScaling = (Double)temp; + break; + #endregion + #region Sample interval + case 8: + if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp)) + ReturnData[DecodedPath].SampleInterval = (Double)temp; + break; + #endregion + #region Amplitude up + case 9: + if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp)) + ReturnData[DecodedPath].AmplitudeUp = (Double)(temp / Math.Pow(2, 22)); + break; + #endregion + #region Amplitude down + case 10: + if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp)) + ReturnData[DecodedPath].AmplitudeDown = (Double)(temp / Math.Pow(2, 22)); + break; + #endregion + #region Temperature + case 11: + if (Int32.TryParse(HexValue,NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp)) + ReturnData[DecodedPath].Temperature = temp; + break; + #endregion + #region Temperature scale + case 12: + if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp)) + { + ReturnData[DecodedPath].TemperatureScale = temp; + ReturnData[DecodedPath].CalculatedTemperature = ((Double)ReturnData[DecodedPath].Temperature) / Math.Pow(2, (Double)temp); + } + break; + #endregion + #region Time + case 13: + if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp)) + ReturnData[DecodedPath].Time = temp; + break; + #endregion + #region CRC + case 14: + if (Int32.TryParse(HexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out temp)) + { + ReturnData[DecodedPath].Crc = temp; + } + break; + #endregion + #region Default + default: break; + #endregion + #endregion + } + #region Decoding finished + if (DatIndex == 14) + { + #region Reset index + DatIndex = 0; + #endregion + #region Set data + ReturnData[DecodedPath].MessageType = Message.Data; + ReturnData[DecodedPath].Flow = ((ReturnData[DecodedPath].RawDeltaVolume / ReturnData[DecodedPath].RawDeltaVolumeScaling) / (ReturnData[DecodedPath].SampleInterval / 65536)) * Constants.FlowFactor; + ReturnData[Constants.PATH0].DecodingSucceeded = true; + ReturnData[Constants.PATH1].DecodingSucceeded = true; + ReturnData[Constants.PATH2].DecodingSucceeded = true; + #endregion + #region Return data + return ReturnData; + #endregion + } + else + DatIndex++; // switch to next position of data + #endregion + } + #endregion + return ReturnData; + } + #endregion + } + catch (Exception) + { + //ErrorLog.Log(LogErrReason.Exeption, "DecodeTelegram.DecodeProtocolH() failed", $"0x{ex.HResult.ToString("X", getGlobalCulture())}index = {DatIndex.ToString(getGlobalCulture())}; path = {DecodedPath.ToString(getGlobalCulture())}", getGlobalCulture); + } + + return ReturnData; + } + public static DecodedData[] Reset() + { + DecodedData[] data = new DecodedData[Constants.NumberOfPaths]; + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + data [Path] = new DecodedData(); + return data; + } + } + +} + diff --git a/ZeroFlowTool/DecodedData.cs b/ZeroFlowTool/DecodedData.cs new file mode 100644 index 00000000..8bcd03d7 --- /dev/null +++ b/ZeroFlowTool/DecodedData.cs @@ -0,0 +1,1222 @@ +using System; +using System.Linq; +using System.Text; +using System.Windows.Forms; + + +namespace GenesisZeroFlow +{ + public static class DecodedDataHelper + { + public static DecodedData[] GetDefaultDecodedDataArray(Int32 count) + { + var ret = new DecodedData[count]; + for (Int32 i = 0; i < count; i++) + { + ret[i] = GetDefaultDecodedData(); + } + return ret; + + } + public static DecodedData GetDefaultDecodedData() + { + return new DecodedData() + { + DataValid = "0", + MessageType = String.Empty, + ProtocolVersion = String.Empty, + Path = Constants.PATH0, + DeltaTimeOfFlight = 0.0, // protocol version 'e' + RawDeltaVolume = 0.0, // protocol version 'e' + RawDeltaVolumeScaling = 0.0, // protocol version 'e' + SampleInterval = 0, + Flow = 0, + Mode = String.Empty, + DecodingSucceeded = false, + DisplayVol = String.Empty, + Time = 0, + Crc = 0, + #region G-Protocol + AmplitudeUp = 0, + AmplitudeDown = 0, + PulsewidthRatioUp = 0, + PulsewidthRatioDown = 0, + Temperature = 0, + TemperatureScale = 0, + #endregion + #region H-Protocol + Error = DataError.NoError, + TotalTimeOfFlightAverage = 0, + TimeOfFlightUp = 0, + TimeOfFlightDown = 0, + #endregion + + }; + } + } + + public static class Counters + { + /* + public static void SetCounters(Boolean[] loggingIndicator, UInt16 meterNumber, UInt16 path, ref Int32[][] linecounter) + { + if ((loggingIndicator == null)||(linecounter == null)) + return; + + #region Activity check for empty pipe test + if (loggingIndicator[meterNumber]) + { + if (linecounter[meterNumber][path] < Int32.MaxValue) + linecounter[meterNumber][path]++; + else + linecounter[meterNumber][path] = 0; + } + else + linecounter[meterNumber][path] = 0; + #endregion + + } + */ + + public static Int32 SetCounters(Boolean[] loggingIndicator, UInt16 meterNumber, UInt16 path, ref Int32[][] linecounter) + { + if ((loggingIndicator == null) || (linecounter == null)) + return linecounter[meterNumber][path]; + + #region Activity check for empty pipe test + if (loggingIndicator[meterNumber]) + { + if (linecounter[meterNumber][path] < Int32.MaxValue) + linecounter[meterNumber][path]++; + else + linecounter[meterNumber][path] = 0; + } + else + linecounter[meterNumber][path] = 0; + #endregion + + return linecounter[meterNumber][path]; + + } + public static Int32 SetCountersTempCal(Boolean loggingIndicator, UInt16 path, Int32[] linecounter) + { + if (linecounter == null) + return linecounter[path]; + + #region Activity check for empty pipe test + if (loggingIndicator) + { + if (linecounter[path] < Int32.MaxValue) + linecounter[path]++; + else + linecounter[path] = 0; + } + else + linecounter[path] = 0; + #endregion + + return linecounter[path]; + + } + + public static Boolean CrcCheck(Int32 crcObtained, String input) + { + if (input == null) + return false; + + Boolean crcOk = false; + Int32 crcCalculated = 0; + + #region CRC check + String[] crcTemp = input.Split(' '); + String crcInputString = String.Empty;// = "@"; + for (UInt16 length = 0; length < crcTemp.Count() - 1; length++) + crcInputString = crcInputString + crcTemp[length] + " "; + Crc16Ccitt crc = new Crc16Ccitt(InitialCrcValue.Nonzero1); + Byte[] data = Encoding.UTF8.GetBytes(crcInputString); + crcCalculated = crc.ComputeChecksum(data); + + if (crcObtained == crcCalculated) + { + //GenesisZeroFlow.Display.DebugCrcIndicatorText(true); + crcOk = true; + } + else + { + //GenesisZeroFlow.Display.DebugCrcIndicatorText(false); + crcOk = false; + } + #endregion + + return crcOk; + + } + } + + public class DecodedData : ICloneable + { + #region For all protocols + public String DataValid { get; set; } + public String MessageType { get; set; } + public String ProtocolVersion { get; set; } + public UInt16 Path { get; set; } + #endregion + #region E-protocol/ G-protocol + public Double DeltaTimeOfFlight { get; set; } // protocol version 'e' and 'g' + public Double RawDeltaVolume { get; set; } // protocol version 'e' + public Double RawDeltaVolumeScaling { get; set; }// protocol version 'e' + public Double RawDeltaVolumeAccu { get; set; } // protocol version 'e' + public Double SampleInterval { get; set; } + public Double Flow { get; set; } + #endregion + #region F-protocol + public String DisplayVol { get; set; } + public Int32 Time { get; set; } + public Int32 Crc { get; set; } + #endregion + #region G-protocol + public Double AmplitudeUp { get; set; } + public Double AmplitudeDown { get; set; } + public Double PulsewidthRatioUp { get; set; } + public Double PulsewidthRatioDown { get; set; } + public Int32 Temperature { get; set; } + public Int32 TemperatureScale { get; set; } + #endregion + #region H-protocol + public Double Error { get; set; } + public Double TotalTimeOfFlightAverage { get; set; } + public Double DeltaTimeOfFlightAverage { get; set; } + public Double TimeOfFlightUp { get; set; } + public Double TimeOfFlightDown { get; set; } + #endregion + #region Miscellaneous + public String Mode { get; set; } + public Boolean DecodingSucceeded { get; set; } + public Double CalculatedTemperature { get; set; } + #endregion + + + + //object Clone() + //{ + // return this.MemberwiseClone(); + //} + + public object Clone() + { + var toClone = (DecodedData)MemberwiseClone(); + //toClone.TofUp = (Double[])TofUp.Clone(); + //toClone.TofDown = (Double[])TofDown.Clone(); + //toClone.DifTof = (Double[])DifTof.Clone(); + + return toClone; + } + } + + public partial class GenesisZeroFlow : Form + { + private String[] Output = new String[Constants.NumberOfMeters] { String.Empty, String.Empty, String.Empty, String.Empty, String.Empty, String.Empty, String.Empty, String.Empty, String.Empty, String.Empty }; + private Boolean[] ValidData = new Boolean[Constants.NumberOfMeters] { false, false, false, false, false, false, false, false, false, false}; + + + //private void MainLoopDataMeter1(object sender, EventArgs e) + ////private void MainLoopDataMeter1() + //{ + // #region Definitions and initializations + // const UInt16 MeterNumber = Constants.Meter1; + // DecodedData[] decodingResult = DecodedDataHelper.GetDefaultDecodedDataArray(Constants.NumberOfPaths); + // Int32 numberOfLines = (Int32)nUD_Settings_ZeroflowOffsetTestNumberOfLines.Value; + // decodingResult[Constants.PATH0].DecodingSucceeded = false; + // String Temp = String.Empty; + // #endregion + // #region Prepare data + // for (UInt16 i = 0; i < RxDataBuffer[MeterNumber].Count(); i++) + // { + // if (RxDataBuffer[MeterNumber].ElementAt(0).ToString().Equals("@")) + // { + // if (!String.IsNullOrEmpty(Output[MeterNumber])) + // { + // Temp = "@" + Output[MeterNumber]; + // ValidData[MeterNumber] = true; + // } + // Output[MeterNumber] = String.Empty; + // } + // else + // Output[MeterNumber] = Output[MeterNumber] + RxDataBuffer[MeterNumber].ElementAt(0); + + // RxDataBuffer[MeterNumber] = RxDataBuffer[MeterNumber].Remove(0, 1); + // } + // #endregion + + // if (ValidData[MeterNumber]) + // { + // #region Definitions and initializations + // Temp = Temp.Replace("\n", String.Empty); + // UInt16 Path = Constants.PATH0; + // ValidData[MeterNumber] = false; + // #endregion + // #region Logging (Zero flow test) + // if (GetLoggingIndicatorZeroFlowTest()[MeterNumber] && (!String.IsNullOrEmpty(LoggingPathZeroFlowTest[MeterNumber]))) + // { + // String time = DateTime.Now.ToString(Formats.RawDataDateTimeLogString, globalCulture); + // SetDataToLog(MeterNumber, GetDataToLog()[MeterNumber] + time + Temp + "\n"); + // } + // #endregion + // #region Decode dat + // decodingResult = DecodeTelegram.DecodedDataDecodeTelegram(Temp, DecodedAllMeters[MeterNumber]); + // Path = decodingResult[Constants.PATH0].Path; // Equal for Paths + // Boolean CrcOk = Counters.CrcCheck(decodingResult[Path].Crc, Temp); + // #endregion + // #region Add to list h-protocol + // if (CrcOk) + // { + // #region Activity check for empty pipe test + // LineCounterEmptyPipeTest[MeterNumber][Path] = Counters.SetCounters(LoggingIndicatorEmptyPipeTest, MeterNumber, Path, LineCounterEmptyPipeTest); + // #endregion + // #region Data for amplitude test + // if (LoggingIndicatorAmplitudeTest[MeterNumber]) + // { + // totalTimeOfFlightAverage[MeterNumber][Path].Add(decodingResult[Path].TotalTimeOfFlightAverage); + // NewDataIndicatorAmplitudeTest[MeterNumber][Path] = true; + // } + // LineCounterAmplitudeTest[MeterNumber][Path] = Counters.SetCounters(LoggingIndicatorAmplitudeTest, MeterNumber, Path, LineCounterAmplitudeTest); + // #endregion + // #region Data for zero flow test + // if (LineCounterZeroFlowTest[MeterNumber][Path] >= numberOfLines) + // { + // SetCalculationIndicatorZeroFlowTest(false, MeterNumber); + // SetLoggingIndicatorZeroFlowTest(false, MeterNumber); + // } + + // if (GetCalculationIndicatorZeroFlowTest()[MeterNumber]) + // { + // if (decodingResult[Path].Error == DataError.NoError) + // { + // NewDataIndicatorZeroFlowTest[MeterNumber][Path] = true; + // AmplitudeValuesUp[MeterNumber][Path].Add(decodingResult[Path].AmplitudeUp); + // AmplitudeValuesDown[MeterNumber][Path].Add(decodingResult[Path].AmplitudeDown); + // DeltaTimeOfFlightAverage[MeterNumber][Path].Add(decodingResult[Path].DeltaTimeOfFlightAverage); + // LineCounterZeroFlowTest[MeterNumber][Path] = Counters.SetCounters(GetCalculationIndicatorZeroFlowTest(), MeterNumber, Path, LineCounterZeroFlowTest); + // } + // else + // { + // BadDataCounterZeroFlowTest[MeterNumber][Path] = Counters.SetCounters(GetCalculationIndicatorZeroFlowTest(), MeterNumber, Path, BadDataCounterZeroFlowTest); + // NewDataIndicatorZeroFlowTest[MeterNumber][Path] = false; + // } + // } + // #endregion + // #region Activity check for temperature pipe test + // LineCounterTemperatureTest[MeterNumber][Path] = Counters.SetCounters(LoggingIndicatorTemperatureTest, MeterNumber, Path, LineCounterTemperatureTest); + // #endregion + // } + // #endregion + // #region Copy to global object + // //remove roland + // //DecodedAllMeters[MeterNumber][Constants.PATH0] = ((DecodedData)(decodingResult[Constants.PATH0].Clone())); + // //DecodedAllMeters[MeterNumber][Constants.PATH1] = ((DecodedData)(decodingResult[Constants.PATH1].Clone())); + // //DecodedAllMeters[MeterNumber][Constants.PATH2] = ((DecodedData)(decodingResult[Constants.PATH2].Clone())); + // #endregion + // } + //} + // private void MainLoopDataMeter2(object sender, EventArgs e) + ////private void MainLoopDataMeter2() + //{ + // #region Definitions and initializations + // const UInt16 MeterNumber = Constants.Meter2; + // DecodedData[] decodingResult = DecodedDataHelper.GetDefaultDecodedDataArray(Constants.NumberOfPaths); + // Int32 numberOfLines = (Int32)nUD_Settings_ZeroflowOffsetTestNumberOfLines.Value; + // decodingResult[Constants.PATH0].DecodingSucceeded = false; + // String Temp = String.Empty; + // #endregion + // #region Prepare data + // for (UInt16 i = 0; i < RxDataBuffer[MeterNumber].Count(); i++) + // { + // if(RxDataBuffer[MeterNumber].ElementAt(0).ToString().Equals("@")) + // { + // if (!String.IsNullOrEmpty(Output[MeterNumber])) + // { + // Temp = "@" + Output[MeterNumber]; + // ValidData[MeterNumber] = true; + // } + // Output[MeterNumber] = String.Empty; + // } + // else + // Output[MeterNumber] = Output[MeterNumber] + RxDataBuffer[MeterNumber].ElementAt(0); + + // RxDataBuffer[MeterNumber] = RxDataBuffer[MeterNumber].Remove(0, 1); + // } + // #endregion + + // if (ValidData[MeterNumber]) + // { + // #region Definitions and initializations + // Temp = Temp.Replace("\n", String.Empty); + // UInt16 Path = Constants.PATH0; + // ValidData[MeterNumber] = false; + // #endregion + // #region Logging (Zero flow test) + // if (GetLoggingIndicatorZeroFlowTest()[MeterNumber] && (!String.IsNullOrEmpty(LoggingPathZeroFlowTest[MeterNumber]))) + // { + // String time = DateTime.Now.ToString(Formats.RawDataDateTimeLogString, globalCulture); + // SetDataToLog(MeterNumber, GetDataToLog()[MeterNumber] + time + Temp + "\n"); + // } + // #endregion + // #region Decode data + // decodingResult = DecodeTelegram.DecodedDataDecodeTelegram(Temp, DecodedAllMeters[MeterNumber]); + // Path = decodingResult[Constants.PATH0].Path; // Equal for Paths + // Boolean CrcOk = Counters.CrcCheck(decodingResult[Path].Crc, Temp); + // #endregion + // #region Add to list h-protocol + // if (CrcOk) + // { + // #region Activity check for empty pipe test + // LineCounterEmptyPipeTest[MeterNumber][Path] = Counters.SetCounters(LoggingIndicatorEmptyPipeTest, MeterNumber, Path, LineCounterEmptyPipeTest); + // #endregion + // #region Data for amplitude test + // if (LoggingIndicatorAmplitudeTest[MeterNumber]) + // { + // totalTimeOfFlightAverage[MeterNumber][Path].Add(decodingResult[Path].TotalTimeOfFlightAverage); + // NewDataIndicatorAmplitudeTest[MeterNumber][Path] = true; + // } + // LineCounterAmplitudeTest[MeterNumber][Path] = Counters.SetCounters(LoggingIndicatorAmplitudeTest, MeterNumber, Path, LineCounterAmplitudeTest); + // #endregion + // #region Data for zero flow test + // if (LineCounterZeroFlowTest[MeterNumber][Path] >= numberOfLines) + // { + // SetCalculationIndicatorZeroFlowTest(false, MeterNumber); + // SetLoggingIndicatorZeroFlowTest(false, MeterNumber); + // } + + // if (GetCalculationIndicatorZeroFlowTest()[MeterNumber]) + // { + // #region Bad data + // if (decodingResult[Path].Error == DataError.NoError) + // { + // NewDataIndicatorZeroFlowTest[MeterNumber][Path] = true; + // AmplitudeValuesUp[MeterNumber][Path].Add(decodingResult[Path].AmplitudeUp); + // AmplitudeValuesDown[MeterNumber][Path].Add(decodingResult[Path].AmplitudeDown); + // DeltaTimeOfFlightAverage[MeterNumber][Path].Add(decodingResult[Path].DeltaTimeOfFlightAverage); + // LineCounterZeroFlowTest[MeterNumber][Path] = Counters.SetCounters(GetCalculationIndicatorZeroFlowTest(), MeterNumber, Path, LineCounterZeroFlowTest); + // } + // else + // { + // BadDataCounterZeroFlowTest[MeterNumber][Path] = Counters.SetCounters(GetCalculationIndicatorZeroFlowTest(), MeterNumber, Path, BadDataCounterZeroFlowTest); + // NewDataIndicatorZeroFlowTest[MeterNumber][Path] = false; + // } + // #endregion + // } + // #endregion + // #region Activity check for temperature pipe test + // LineCounterTemperatureTest[MeterNumber][Path] = Counters.SetCounters(LoggingIndicatorTemperatureTest, MeterNumber, Path, LineCounterTemperatureTest); + // #endregion + // } + // #endregion + // #region Copy to global object + // DecodedAllMeters[MeterNumber][Constants.PATH0] = ((DecodedData)(decodingResult[Constants.PATH0].Clone())); + // DecodedAllMeters[MeterNumber][Constants.PATH1] = ((DecodedData)(decodingResult[Constants.PATH1].Clone())); + // DecodedAllMeters[MeterNumber][Constants.PATH2] = ((DecodedData)(decodingResult[Constants.PATH2].Clone())); + // #endregion + // } + //} + //private void MainLoopDataMeter3(object sender, EventArgs e) + ////private void MainLoopDataMeter3() + //{ + // #region Definitions and initializations + // const UInt16 MeterNumber = Constants.Meter3; + // DecodedData[] decodingResult = DecodedDataHelper.GetDefaultDecodedDataArray(Constants.NumberOfPaths); + // Int32 numberOfLines = (Int32)nUD_Settings_ZeroflowOffsetTestNumberOfLines.Value; + // decodingResult[Constants.PATH0].DecodingSucceeded = false; + // String Temp = String.Empty; + // #endregion + // #region Prepare data + // for (UInt16 i = 0; i < RxDataBuffer[MeterNumber].Count(); i++) + // { + // if (RxDataBuffer[MeterNumber].ElementAt(0).ToString().Equals("@")) + // { + // if (!String.IsNullOrEmpty(Output[MeterNumber])) + // { + // Temp = "@" + Output[MeterNumber]; + // ValidData[MeterNumber] = true; + // } + // Output[MeterNumber] = String.Empty; + // } + // else + // Output[MeterNumber] = Output[MeterNumber] + RxDataBuffer[MeterNumber].ElementAt(0); + + // RxDataBuffer[MeterNumber] = RxDataBuffer[MeterNumber].Remove(0, 1); + // } + // #endregion + + // if (ValidData[MeterNumber]) + // { + // #region Definitions and initializations + // Temp = Temp.Replace("\n", String.Empty); + // UInt16 Path = Constants.PATH0; + // ValidData[MeterNumber] = false; + // #endregion + // #region Logging (Zero flow test) + // if (GetLoggingIndicatorZeroFlowTest()[MeterNumber] && (!String.IsNullOrEmpty(LoggingPathZeroFlowTest[MeterNumber]))) + // { + // String time = DateTime.Now.ToString(Formats.RawDataDateTimeLogString, globalCulture); + // SetDataToLog(MeterNumber, GetDataToLog()[MeterNumber] + time + Temp + "\n"); + // } + // #endregion + // #region Decode data + // decodingResult = DecodeTelegram.DecodedDataDecodeTelegram(Temp, DecodedAllMeters[MeterNumber]); + // Path = decodingResult[Constants.PATH0].Path; // Equal for Paths + // Boolean CrcOk = Counters.CrcCheck(decodingResult[Path].Crc, Temp); + // #endregion + // #region Add to list h-protocol + // if (CrcOk) + // { + // #region Activity check for empty pipe test + // LineCounterEmptyPipeTest[MeterNumber][Path] = Counters.SetCounters(LoggingIndicatorEmptyPipeTest, MeterNumber, Path, LineCounterEmptyPipeTest); + // #endregion + // #region Data for amplitude test + // if (LoggingIndicatorAmplitudeTest[MeterNumber]) + // { + // totalTimeOfFlightAverage[MeterNumber][Path].Add(decodingResult[Path].TotalTimeOfFlightAverage); + // NewDataIndicatorAmplitudeTest[MeterNumber][Path] = true; + // } + // LineCounterAmplitudeTest[MeterNumber][Path] = Counters.SetCounters(LoggingIndicatorAmplitudeTest, MeterNumber, Path, LineCounterAmplitudeTest); + // #endregion + // #region Data for zero flow test + // if (LineCounterZeroFlowTest[MeterNumber][Path] >= numberOfLines) + // { + // SetCalculationIndicatorZeroFlowTest(false, MeterNumber); + // SetLoggingIndicatorZeroFlowTest(false, MeterNumber); + // } + + // if (GetCalculationIndicatorZeroFlowTest()[MeterNumber]) + // { + // if (decodingResult[Path].Error == DataError.NoError) + // { + // NewDataIndicatorZeroFlowTest[MeterNumber][Path] = true; + // AmplitudeValuesUp[MeterNumber][Path].Add(decodingResult[Path].AmplitudeUp); + // AmplitudeValuesDown[MeterNumber][Path].Add(decodingResult[Path].AmplitudeDown); + // DeltaTimeOfFlightAverage[MeterNumber][Path].Add(decodingResult[Path].DeltaTimeOfFlightAverage); + // LineCounterZeroFlowTest[MeterNumber][Path] = Counters.SetCounters(GetCalculationIndicatorZeroFlowTest(), MeterNumber, Path, LineCounterZeroFlowTest); + // } + // else + // { + // BadDataCounterZeroFlowTest[MeterNumber][Path] = Counters.SetCounters(GetCalculationIndicatorZeroFlowTest(), MeterNumber, Path, BadDataCounterZeroFlowTest); + // NewDataIndicatorZeroFlowTest[MeterNumber][Path] = false; + // } + // } + // #endregion + // #region Activity check for temperature pipe test + // LineCounterTemperatureTest[MeterNumber][Path] = Counters.SetCounters(LoggingIndicatorTemperatureTest, MeterNumber, Path, LineCounterTemperatureTest); + // #endregion + // } + // #endregion + // #region Copy to global object + // DecodedAllMeters[MeterNumber][Constants.PATH0] = ((DecodedData)(decodingResult[Constants.PATH0].Clone())); + // DecodedAllMeters[MeterNumber][Constants.PATH1] = ((DecodedData)(decodingResult[Constants.PATH1].Clone())); + // DecodedAllMeters[MeterNumber][Constants.PATH2] = ((DecodedData)(decodingResult[Constants.PATH2].Clone())); + // #endregion + // } + //} + //private void MainLoopDataMeter4(object sender, EventArgs e) + ////private void MainLoopDataMeter4() + //{ + // #region Definitions and initializations + // const UInt16 MeterNumber = Constants.Meter4; + // DecodedData[] decodingResult = DecodedDataHelper.GetDefaultDecodedDataArray(Constants.NumberOfPaths); + // Int32 numberOfLines = (Int32)nUD_Settings_ZeroflowOffsetTestNumberOfLines.Value; + // decodingResult[Constants.PATH0].DecodingSucceeded = false; + // String Temp = String.Empty; + // #endregion + // #region Prepare data + // for (UInt16 i = 0; i < RxDataBuffer[MeterNumber].Count(); i++) + // { + // if (RxDataBuffer[MeterNumber].ElementAt(0).ToString().Equals("@")) + // { + // if (!String.IsNullOrEmpty(Output[MeterNumber])) + // { + // Temp = "@" + Output[MeterNumber]; + // ValidData[MeterNumber] = true; + // } + // Output[MeterNumber] = String.Empty; + // } + // else + // Output[MeterNumber] = Output[MeterNumber] + RxDataBuffer[MeterNumber].ElementAt(0); + + // RxDataBuffer[MeterNumber] = RxDataBuffer[MeterNumber].Remove(0, 1); + // } + // #endregion + + // if (ValidData[MeterNumber]) + // { + // #region Definitions and initializations + // Temp = Temp.Replace("\n", String.Empty); + // UInt16 Path = Constants.PATH0; + // ValidData[MeterNumber] = false; + // #endregion + // #region Logging (Zero flow test) + // if (GetLoggingIndicatorZeroFlowTest()[MeterNumber] && (!String.IsNullOrEmpty(LoggingPathZeroFlowTest[MeterNumber]))) + // { + // String time = DateTime.Now.ToString(Formats.RawDataDateTimeLogString, globalCulture); + // SetDataToLog(MeterNumber, GetDataToLog()[MeterNumber] + time + Temp + "\n"); + // } + // #endregion + // #region Decode data + // decodingResult = DecodeTelegram.DecodedDataDecodeTelegram(Temp, DecodedAllMeters[MeterNumber]); + // Path = decodingResult[Constants.PATH0].Path; // Equal for Paths + // Boolean CrcOk = Counters.CrcCheck(decodingResult[Path].Crc, Temp); + // #endregion + // #region Add to list h-protocol + // if (CrcOk) + // { + // #region Activity check for empty pipe test + // LineCounterEmptyPipeTest[MeterNumber][Path] = Counters.SetCounters(LoggingIndicatorEmptyPipeTest, MeterNumber, Path, LineCounterEmptyPipeTest); + // #endregion + // #region Data for amplitude test + // if (LoggingIndicatorAmplitudeTest[MeterNumber]) + // { + // totalTimeOfFlightAverage[MeterNumber][Path].Add(decodingResult[Path].TotalTimeOfFlightAverage); + // NewDataIndicatorAmplitudeTest[MeterNumber][Path] = true; + // } + // LineCounterAmplitudeTest[MeterNumber][Path] = Counters.SetCounters(LoggingIndicatorAmplitudeTest, MeterNumber, Path, LineCounterAmplitudeTest); + // #endregion + // #region Data for zero flow test + // if (LineCounterZeroFlowTest[MeterNumber][Path] >= numberOfLines) + // { + // SetCalculationIndicatorZeroFlowTest(false, MeterNumber); + // SetLoggingIndicatorZeroFlowTest(false, MeterNumber); + // } + + // if (GetCalculationIndicatorZeroFlowTest()[MeterNumber]) + // { + // #region Bad data check + // if (decodingResult[Path].Error == DataError.NoError) + // { + // NewDataIndicatorZeroFlowTest[MeterNumber][Path] = true; + // AmplitudeValuesUp[MeterNumber][Path].Add(decodingResult[Path].AmplitudeUp); + // AmplitudeValuesDown[MeterNumber][Path].Add(decodingResult[Path].AmplitudeDown); + // DeltaTimeOfFlightAverage[MeterNumber][Path].Add(decodingResult[Path].DeltaTimeOfFlightAverage); + // LineCounterZeroFlowTest[MeterNumber][Path] = Counters.SetCounters(GetCalculationIndicatorZeroFlowTest(), MeterNumber, Path, LineCounterZeroFlowTest); + // } + // else + // { + // BadDataCounterZeroFlowTest[MeterNumber][Path] = Counters.SetCounters(GetCalculationIndicatorZeroFlowTest(), MeterNumber, Path, BadDataCounterZeroFlowTest); + // NewDataIndicatorZeroFlowTest[MeterNumber][Path] = false; + // } + // #endregion + // } + // #endregion + // #region Activity check for temperature pipe test + // LineCounterTemperatureTest[MeterNumber][Path] = LineCounterTemperatureTest[MeterNumber][Path] = Counters.SetCounters(LoggingIndicatorTemperatureTest, MeterNumber, Path, LineCounterTemperatureTest); + // #endregion + // } + // #endregion + // #region Copy to global object + // DecodedAllMeters[MeterNumber][Constants.PATH0] = ((DecodedData)(decodingResult[Constants.PATH0].Clone())); + // DecodedAllMeters[MeterNumber][Constants.PATH1] = ((DecodedData)(decodingResult[Constants.PATH1].Clone())); + // DecodedAllMeters[MeterNumber][Constants.PATH2] = ((DecodedData)(decodingResult[Constants.PATH2].Clone())); + // #endregion + // } + //} + //private void MainLoopDataMeter5(object sender, EventArgs e) + ////private void MainLoopDataMeter5() + //{ + // #region Definitions and initializations + // const UInt16 MeterNumber = Constants.Meter5; + // DecodedData[] decodingResult = DecodedDataHelper.GetDefaultDecodedDataArray(Constants.NumberOfPaths); + // Int32 numberOfLines = (Int32)nUD_Settings_ZeroflowOffsetTestNumberOfLines.Value; + // decodingResult[Constants.PATH0].DecodingSucceeded = false; + // String Temp = String.Empty; + // #endregion + // #region Prepare data + // for (UInt16 i = 0; i < RxDataBuffer[MeterNumber].Count(); i++) + // { + // if (RxDataBuffer[MeterNumber].ElementAt(0).ToString().Equals("@")) + // { + // if (!String.IsNullOrEmpty(Output[MeterNumber])) + // { + // Temp = "@" + Output[MeterNumber]; + // ValidData[MeterNumber] = true; + // } + // Output[MeterNumber] = String.Empty; + // } + // else + // Output[MeterNumber] = Output[MeterNumber] + RxDataBuffer[MeterNumber].ElementAt(0); + + // RxDataBuffer[MeterNumber] = RxDataBuffer[MeterNumber].Remove(0, 1); + // } + // #endregion + + // if (ValidData[MeterNumber]) + // { + // #region Definitions and initializations + // Temp = Temp.Replace("\n", String.Empty); + // UInt16 Path = Constants.PATH0; + // ValidData[MeterNumber] = false; + // #endregion + // #region Logging (Zero flow test) + // if (GetLoggingIndicatorZeroFlowTest()[MeterNumber] && (!String.IsNullOrEmpty(LoggingPathZeroFlowTest[MeterNumber]))) + // { + // String time = DateTime.Now.ToString(Formats.RawDataDateTimeLogString, globalCulture); + // SetDataToLog(MeterNumber, GetDataToLog()[MeterNumber] + time + Temp + "\n"); + // } + // #endregion + // #region Decode data + // decodingResult = DecodeTelegram.DecodedDataDecodeTelegram(Temp, DecodedAllMeters[MeterNumber]); + // Path = decodingResult[Constants.PATH0].Path; // Equal for Paths + // Boolean CrcOk = Counters.CrcCheck(decodingResult[Path].Crc, Temp); + // #endregion + // #region Add to list h-protocol + // if (CrcOk) + // { + // #region Activity check for empty pipe test + // LineCounterEmptyPipeTest[MeterNumber][Path] = Counters.SetCounters(LoggingIndicatorEmptyPipeTest, MeterNumber, Path, LineCounterEmptyPipeTest); + // #endregion + // #region Data for amplitude test + // if (LoggingIndicatorAmplitudeTest[MeterNumber]) + // { + // totalTimeOfFlightAverage[MeterNumber][Path].Add(decodingResult[Path].TotalTimeOfFlightAverage); + // NewDataIndicatorAmplitudeTest[MeterNumber][Path] = true; + // } + // LineCounterAmplitudeTest[MeterNumber][Path] = Counters.SetCounters(LoggingIndicatorAmplitudeTest, MeterNumber, Path, LineCounterAmplitudeTest); + // #endregion + // #region Data for zero flow test + // if (LineCounterZeroFlowTest[MeterNumber][Path] >= numberOfLines) + // { + // SetCalculationIndicatorZeroFlowTest(false, MeterNumber); + // SetLoggingIndicatorZeroFlowTest(false, MeterNumber); + // } + + // if (GetCalculationIndicatorZeroFlowTest()[MeterNumber]) + // { + // #region Bad data check + // if (decodingResult[Path].Error == DataError.NoError) + // { + // NewDataIndicatorZeroFlowTest[MeterNumber][Path] = true; + // AmplitudeValuesUp[MeterNumber][Path].Add(decodingResult[Path].AmplitudeUp); + // AmplitudeValuesDown[MeterNumber][Path].Add(decodingResult[Path].AmplitudeDown); + // DeltaTimeOfFlightAverage[MeterNumber][Path].Add(decodingResult[Path].DeltaTimeOfFlightAverage); + // LineCounterZeroFlowTest[MeterNumber][Path] = Counters.SetCounters(GetCalculationIndicatorZeroFlowTest(), MeterNumber, Path, LineCounterZeroFlowTest); + // } + // else + // { + // BadDataCounterZeroFlowTest[MeterNumber][Path] = Counters.SetCounters(GetCalculationIndicatorZeroFlowTest(), MeterNumber, Path, BadDataCounterZeroFlowTest); + // NewDataIndicatorZeroFlowTest[MeterNumber][Path] = false; + // } + // #endregion + // } + // #endregion + // #region Activity check for temperature pipe test + // LineCounterTemperatureTest[MeterNumber][Path] = Counters.SetCounters(LoggingIndicatorTemperatureTest, MeterNumber, Path, LineCounterTemperatureTest); + // #endregion + // } + // #endregion + // #region Copy to global object + // DecodedAllMeters[MeterNumber][Constants.PATH0] = ((DecodedData)(decodingResult[Constants.PATH0].Clone())); + // DecodedAllMeters[MeterNumber][Constants.PATH1] = ((DecodedData)(decodingResult[Constants.PATH1].Clone())); + // DecodedAllMeters[MeterNumber][Constants.PATH2] = ((DecodedData)(decodingResult[Constants.PATH2].Clone())); + // #endregion + // } + //} + // private void MainLoopDataMeter6(object sender, EventArgs e) + ////private void MainLoopDataMeter6() + //{ + // #region Definitions and initializations + // const UInt16 MeterNumber = Constants.Meter6; + // DecodedData[] decodingResult = DecodedDataHelper.GetDefaultDecodedDataArray(Constants.NumberOfPaths); + // Int32 numberOfLines = (Int32)nUD_Settings_ZeroflowOffsetTestNumberOfLines.Value; + // decodingResult[Constants.PATH0].DecodingSucceeded = false; + // String Temp = String.Empty; + // #endregion + // #region Prepare data + // for (UInt16 i = 0; i < RxDataBuffer[MeterNumber].Count(); i++) + // { + // if (RxDataBuffer[MeterNumber].ElementAt(0).ToString().Equals("@")) + // { + // if (!String.IsNullOrEmpty(Output[MeterNumber])) + // { + // Temp = "@" + Output[MeterNumber]; + // ValidData[MeterNumber] = true; + // } + // Output[MeterNumber] = String.Empty; + // } + // else + // Output[MeterNumber] = Output[MeterNumber] + RxDataBuffer[MeterNumber].ElementAt(0); + + // RxDataBuffer[MeterNumber] = RxDataBuffer[MeterNumber].Remove(0, 1); + // } + // #endregion + + // if (ValidData[MeterNumber]) + // { + // #region Definitions and initializations + // Temp = Temp.Replace("\n", String.Empty); + // UInt16 Path = Constants.PATH0; + // ValidData[MeterNumber] = false; + // #endregion + // #region Logging (Zero flow test) + // if (GetLoggingIndicatorZeroFlowTest()[MeterNumber] && (!String.IsNullOrEmpty(LoggingPathZeroFlowTest[MeterNumber]))) + // { + // String time = DateTime.Now.ToString(Formats.RawDataDateTimeLogString, globalCulture); + // SetDataToLog(MeterNumber, GetDataToLog()[MeterNumber] + time + Temp + "\n"); + // } + // #endregion + // #region Decode data + // decodingResult = DecodeTelegram.DecodedDataDecodeTelegram(Temp, DecodedAllMeters[MeterNumber]); + // Path = decodingResult[Constants.PATH0].Path; // Equal for Paths + // Boolean CrcOk = Counters.CrcCheck(decodingResult[Path].Crc, Temp); + // #endregion + // #region Add to list h-protocol + // if (CrcOk) + // { + // #region Activity check for empty pipe test + // LineCounterEmptyPipeTest[MeterNumber][Path] = Counters.SetCounters(LoggingIndicatorEmptyPipeTest, MeterNumber, Path, LineCounterEmptyPipeTest); + // #endregion + // #region Data for amplitude test + // if (LoggingIndicatorAmplitudeTest[MeterNumber]) + // { + // totalTimeOfFlightAverage[MeterNumber][Path].Add(decodingResult[Path].TotalTimeOfFlightAverage); + // NewDataIndicatorAmplitudeTest[MeterNumber][Path] = true; + // } + // LineCounterAmplitudeTest[MeterNumber][Path] = Counters.SetCounters(LoggingIndicatorAmplitudeTest, MeterNumber, Path, LineCounterAmplitudeTest); + // #endregion + // #region Data for zero flow test + // if (LineCounterZeroFlowTest[MeterNumber][Path] >= numberOfLines) + // { + // SetCalculationIndicatorZeroFlowTest(false, MeterNumber); + // SetLoggingIndicatorZeroFlowTest(false, MeterNumber); + // } + + // if (GetCalculationIndicatorZeroFlowTest()[MeterNumber]) + // { + // #region Bad data check + // if (decodingResult[Path].Error == DataError.NoError) + // { + // NewDataIndicatorZeroFlowTest[MeterNumber][Path] = true; + // AmplitudeValuesUp[MeterNumber][Path].Add(decodingResult[Path].AmplitudeUp); + // AmplitudeValuesDown[MeterNumber][Path].Add(decodingResult[Path].AmplitudeDown); + // DeltaTimeOfFlightAverage[MeterNumber][Path].Add(decodingResult[Path].DeltaTimeOfFlightAverage); + // LineCounterZeroFlowTest[MeterNumber][Path] = Counters.SetCounters(GetCalculationIndicatorZeroFlowTest(), MeterNumber, Path, LineCounterZeroFlowTest); + // } + // else + // { + // BadDataCounterZeroFlowTest[MeterNumber][Path] = Counters.SetCounters(GetCalculationIndicatorZeroFlowTest(), MeterNumber, Path, BadDataCounterZeroFlowTest); + // NewDataIndicatorZeroFlowTest[MeterNumber][Path] = false; + // } + // #endregion + // } + // #endregion + // #region Activity check for temperature pipe test + // LineCounterTemperatureTest[MeterNumber][Path] = Counters.SetCounters(LoggingIndicatorTemperatureTest, MeterNumber, Path, LineCounterTemperatureTest); + // #endregion + // } + // #endregion + // #region Copy to global object + // DecodedAllMeters[MeterNumber][Constants.PATH0] = ((DecodedData)(decodingResult[Constants.PATH0].Clone())); + // DecodedAllMeters[MeterNumber][Constants.PATH1] = ((DecodedData)(decodingResult[Constants.PATH1].Clone())); + // DecodedAllMeters[MeterNumber][Constants.PATH2] = ((DecodedData)(decodingResult[Constants.PATH2].Clone())); + // #endregion + // } + //} + //private void MainLoopDataMeter7(object sender, EventArgs e) + ////private void MainLoopDataMeter7() + //{ + // #region Definitions and initializations + // const UInt16 MeterNumber = Constants.Meter7; + // DecodedData[] decodingResult = DecodedDataHelper.GetDefaultDecodedDataArray(Constants.NumberOfPaths); + // Int32 numberOfLines = (Int32)nUD_Settings_ZeroflowOffsetTestNumberOfLines.Value; + // decodingResult[Constants.PATH0].DecodingSucceeded = false; + // String Temp = String.Empty; + // #endregion + // #region Prepare data + // for (UInt16 i = 0; i < RxDataBuffer[MeterNumber].Count(); i++) + // { + // if (RxDataBuffer[MeterNumber].ElementAt(0).ToString().Equals("@")) + // { + // if (!String.IsNullOrEmpty(Output[MeterNumber])) + // { + // Temp = "@" + Output[MeterNumber]; + // ValidData[MeterNumber] = true; + // } + // Output[MeterNumber] = String.Empty; + // } + // else + // Output[MeterNumber] = Output[MeterNumber] + RxDataBuffer[MeterNumber].ElementAt(0); + + // RxDataBuffer[MeterNumber] = RxDataBuffer[MeterNumber].Remove(0, 1); + // } + // #endregion + + // if (ValidData[MeterNumber]) + // { + // #region Definitions and initializations + // Temp = Temp.Replace("\n", String.Empty); + // UInt16 Path = Constants.PATH0; + // ValidData[MeterNumber] = false; + // #endregion + // #region Logging (Zero flow test) + // if (GetLoggingIndicatorZeroFlowTest()[MeterNumber] && (!String.IsNullOrEmpty(LoggingPathZeroFlowTest[MeterNumber]))) + // { + // String time = DateTime.Now.ToString(Formats.RawDataDateTimeLogString, globalCulture); + // SetDataToLog(MeterNumber, GetDataToLog()[MeterNumber] + time + Temp + "\n"); + // } + // #endregion + // #region Decode data + // decodingResult = DecodeTelegram.DecodedDataDecodeTelegram(Temp, DecodedAllMeters[MeterNumber]); + // Path = decodingResult[Constants.PATH0].Path; // Equal for Paths + // Boolean CrcOk = Counters.CrcCheck(decodingResult[Path].Crc, Temp); + // #endregion + // #region Add to list h-protocol + // if (CrcOk) + // { + // #region Activity check for empty pipe test + // LineCounterEmptyPipeTest[MeterNumber][Path] = Counters.SetCounters(LoggingIndicatorEmptyPipeTest, MeterNumber, Path, LineCounterEmptyPipeTest); + // #endregion + // #region Data for amplitude test + // if (LoggingIndicatorAmplitudeTest[MeterNumber]) + // { + // totalTimeOfFlightAverage[MeterNumber][Path].Add(decodingResult[Path].TotalTimeOfFlightAverage); + // NewDataIndicatorAmplitudeTest[MeterNumber][Path] = true; + // } + // LineCounterAmplitudeTest[MeterNumber][Path] = Counters.SetCounters(LoggingIndicatorAmplitudeTest, MeterNumber, Path, LineCounterAmplitudeTest); + // #endregion + // #region Data for zero flow test + // if (LineCounterZeroFlowTest[MeterNumber][Path] >= numberOfLines) + // { + // SetCalculationIndicatorZeroFlowTest(false, MeterNumber); + // SetLoggingIndicatorZeroFlowTest(false, MeterNumber); + // } + + // if (GetCalculationIndicatorZeroFlowTest()[MeterNumber]) + // { + // #region Bad data check + // if (decodingResult[Path].Error == DataError.NoError) + // { + // NewDataIndicatorZeroFlowTest[MeterNumber][Path] = true; + // AmplitudeValuesUp[MeterNumber][Path].Add(decodingResult[Path].AmplitudeUp); + // AmplitudeValuesDown[MeterNumber][Path].Add(decodingResult[Path].AmplitudeDown); + // DeltaTimeOfFlightAverage[MeterNumber][Path].Add(decodingResult[Path].DeltaTimeOfFlightAverage); + // LineCounterZeroFlowTest[MeterNumber][Path] = Counters.SetCounters(GetCalculationIndicatorZeroFlowTest(), MeterNumber, Path, LineCounterZeroFlowTest); + // } + // else + // { + // BadDataCounterZeroFlowTest[MeterNumber][Path] = Counters.SetCounters(GetCalculationIndicatorZeroFlowTest(), MeterNumber, Path, BadDataCounterZeroFlowTest); + // NewDataIndicatorZeroFlowTest[MeterNumber][Path] = false; + // } + // #endregion + // } + // #endregion + // #region Activity check for temperature pipe test + // LineCounterTemperatureTest[MeterNumber][Path] = Counters.SetCounters(LoggingIndicatorTemperatureTest, MeterNumber, Path, LineCounterTemperatureTest); + // #endregion + // } + // #endregion + // #region Copy to global object + // DecodedAllMeters[MeterNumber][Constants.PATH0] = ((DecodedData)(decodingResult[Constants.PATH0].Clone())); + // DecodedAllMeters[MeterNumber][Constants.PATH1] = ((DecodedData)(decodingResult[Constants.PATH1].Clone())); + // DecodedAllMeters[MeterNumber][Constants.PATH2] = ((DecodedData)(decodingResult[Constants.PATH2].Clone())); + // #endregion + // } + //} + //private void MainLoopDataMeter8(object sender, EventArgs e) + ////private void MainLoopDataMeter8() + //{ + // #region Definitions and initializations + // const UInt16 MeterNumber = Constants.Meter8; + // DecodedData[] decodingResult = DecodedDataHelper.GetDefaultDecodedDataArray(Constants.NumberOfPaths); + // Int32 numberOfLines = (Int32)nUD_Settings_ZeroflowOffsetTestNumberOfLines.Value; + // decodingResult[Constants.PATH0].DecodingSucceeded = false; + // String Temp = String.Empty; + // #endregion + // #region Prepare data + // for (UInt16 i = 0; i < RxDataBuffer[MeterNumber].Count(); i++) + // { + // if (RxDataBuffer[MeterNumber].ElementAt(0).ToString().Equals("@")) + // { + // if (!String.IsNullOrEmpty(Output[MeterNumber])) + // { + // Temp = "@" + Output[MeterNumber]; + // ValidData[MeterNumber] = true; + // } + // Output[MeterNumber] = String.Empty; + // } + // else + // Output[MeterNumber] = Output[MeterNumber] + RxDataBuffer[MeterNumber].ElementAt(0); + + // RxDataBuffer[MeterNumber] = RxDataBuffer[MeterNumber].Remove(0, 1); + // } + // #endregion + + // if (ValidData[MeterNumber]) + // { + // #region Definitions and initializations + // Temp = Temp.Replace("\n", String.Empty); + // UInt16 Path = Constants.PATH0; + // ValidData[MeterNumber] = false; + // #endregion + // #region Logging (Zero flow test) + // if (GetLoggingIndicatorZeroFlowTest()[MeterNumber] && (!String.IsNullOrEmpty(LoggingPathZeroFlowTest[MeterNumber]))) + // { + // String time = DateTime.Now.ToString(Formats.RawDataDateTimeLogString, globalCulture); + // SetDataToLog(MeterNumber, GetDataToLog()[MeterNumber] + time + Temp + "\n"); + // } + // #endregion + // #region Decode data + // decodingResult = DecodeTelegram.DecodedDataDecodeTelegram(Temp, DecodedAllMeters[MeterNumber]); + // Path = decodingResult[Constants.PATH0].Path; // Equal for Paths + // Boolean CrcOk = Counters.CrcCheck(decodingResult[Path].Crc, Temp); + // #endregion + // #region Add to list h-protocol + // if (CrcOk) + // { + // #region Activity check for empty pipe test + // LineCounterEmptyPipeTest[MeterNumber][Path] = Counters.SetCounters(LoggingIndicatorEmptyPipeTest, MeterNumber, Path, LineCounterEmptyPipeTest); + // #endregion + // #region Data for amplitude test + // if (LoggingIndicatorAmplitudeTest[MeterNumber]) + // { + // totalTimeOfFlightAverage[MeterNumber][Path].Add(decodingResult[Path].TotalTimeOfFlightAverage); + // NewDataIndicatorAmplitudeTest[MeterNumber][Path] = true; + // } + // LineCounterAmplitudeTest[MeterNumber][Path] = Counters.SetCounters(LoggingIndicatorAmplitudeTest, MeterNumber, Path, LineCounterAmplitudeTest); + // #endregion + // #region Data for zero flow test + // if (LineCounterZeroFlowTest[MeterNumber][Path] >= numberOfLines) + // { + // SetCalculationIndicatorZeroFlowTest(false, MeterNumber); + // SetLoggingIndicatorZeroFlowTest(false, MeterNumber); + // } + + // if (GetCalculationIndicatorZeroFlowTest()[MeterNumber]) + // { + // #region Bad data check + // if (decodingResult[Path].Error == DataError.NoError) + // { + // NewDataIndicatorZeroFlowTest[MeterNumber][Path] = true; + // AmplitudeValuesUp[MeterNumber][Path].Add(decodingResult[Path].AmplitudeUp); + // AmplitudeValuesDown[MeterNumber][Path].Add(decodingResult[Path].AmplitudeDown); + // DeltaTimeOfFlightAverage[MeterNumber][Path].Add(decodingResult[Path].DeltaTimeOfFlightAverage); + // LineCounterZeroFlowTest[MeterNumber][Path] = Counters.SetCounters(GetCalculationIndicatorZeroFlowTest(), MeterNumber, Path, LineCounterZeroFlowTest); + // } + // else + // { + // BadDataCounterZeroFlowTest[MeterNumber][Path] = Counters.SetCounters(GetCalculationIndicatorZeroFlowTest(), MeterNumber, Path, BadDataCounterZeroFlowTest); + // NewDataIndicatorZeroFlowTest[MeterNumber][Path] = false; + // } + // #endregion + // } + // #endregion + // #region Activity check for temperature pipe test + // LineCounterTemperatureTest[MeterNumber][Path] = Counters.SetCounters(LoggingIndicatorTemperatureTest, MeterNumber, Path, LineCounterTemperatureTest); + // #endregion + // } + // #endregion + // #region Copy to global object + // DecodedAllMeters[MeterNumber][Constants.PATH0] = ((DecodedData)(decodingResult[Constants.PATH0].Clone())); + // DecodedAllMeters[MeterNumber][Constants.PATH1] = ((DecodedData)(decodingResult[Constants.PATH1].Clone())); + // DecodedAllMeters[MeterNumber][Constants.PATH2] = ((DecodedData)(decodingResult[Constants.PATH2].Clone())); + // #endregion + // } + //} + //private void MainLoopDataMeter9(object sender, EventArgs e) + ////private void MainLoopDataMeter9() + //{ + // #region Definitions and initializations + // const UInt16 MeterNumber = Constants.Meter9; + // DecodedData[] decodingResult = DecodedDataHelper.GetDefaultDecodedDataArray(Constants.NumberOfPaths); + // Int32 numberOfLines = (Int32)nUD_Settings_ZeroflowOffsetTestNumberOfLines.Value; + // decodingResult[Constants.PATH0].DecodingSucceeded = false; + // String Temp = String.Empty; + // #endregion + // #region Prepare data + // for (UInt16 i = 0; i < RxDataBuffer[MeterNumber].Count(); i++) + // { + // if (RxDataBuffer[MeterNumber].ElementAt(0).ToString().Equals("@")) + // { + // if (!String.IsNullOrEmpty(Output[MeterNumber])) + // { + // Temp = "@" + Output[MeterNumber]; + // ValidData[MeterNumber] = true; + // } + // Output[MeterNumber] = String.Empty; + // } + // else + // Output[MeterNumber] = Output[MeterNumber] + RxDataBuffer[MeterNumber].ElementAt(0); + + // RxDataBuffer[MeterNumber] = RxDataBuffer[MeterNumber].Remove(0, 1); + // } + // #endregion + + // if (ValidData[MeterNumber]) + // { + // #region Definitions and initializations + // Temp = Temp.Replace("\n", String.Empty); + // UInt16 Path = Constants.PATH0; + // ValidData[MeterNumber] = false; + // #endregion + // #region Logging (Zero flow test) + // if (GetLoggingIndicatorZeroFlowTest()[MeterNumber] && (!String.IsNullOrEmpty(LoggingPathZeroFlowTest[MeterNumber]))) + // { + // String time = DateTime.Now.ToString(Formats.RawDataDateTimeLogString, globalCulture); + // SetDataToLog(MeterNumber, GetDataToLog()[MeterNumber] + time + Temp + "\n"); + // } + // #endregion + // #region Decode data + // decodingResult = DecodeTelegram.DecodedDataDecodeTelegram(Temp, DecodedAllMeters[MeterNumber]); + // Path = decodingResult[Constants.PATH0].Path; // Equal for Paths + // Boolean CrcOk = Counters.CrcCheck(decodingResult[Path].Crc, Temp); + // #endregion + // #region Add to list h-protocol + // if (CrcOk) + // { + // #region Activity check for empty pipe test + // LineCounterEmptyPipeTest[MeterNumber][Path] = Counters.SetCounters(LoggingIndicatorEmptyPipeTest, MeterNumber, Path, LineCounterEmptyPipeTest); + // #endregion + // #region Data for amplitude test + // if (LoggingIndicatorAmplitudeTest[MeterNumber]) + // { + // totalTimeOfFlightAverage[MeterNumber][Path].Add(decodingResult[Path].TotalTimeOfFlightAverage); + // NewDataIndicatorAmplitudeTest[MeterNumber][Path] = true; + // } + // LineCounterAmplitudeTest[MeterNumber][Path] = Counters.SetCounters(LoggingIndicatorAmplitudeTest, MeterNumber, Path, LineCounterAmplitudeTest); + // #endregion + // #region Data for zero flow test + // if (LineCounterZeroFlowTest[MeterNumber][Path] >= numberOfLines) + // { + // SetCalculationIndicatorZeroFlowTest(false, MeterNumber); + // SetLoggingIndicatorZeroFlowTest(false, MeterNumber); + // } + + // if (GetCalculationIndicatorZeroFlowTest()[MeterNumber]) + // { + // #region Bad data check + // if (decodingResult[Path].Error == DataError.NoError) + // { + // NewDataIndicatorZeroFlowTest[MeterNumber][Path] = true; + // AmplitudeValuesUp[MeterNumber][Path].Add(decodingResult[Path].AmplitudeUp); + // AmplitudeValuesDown[MeterNumber][Path].Add(decodingResult[Path].AmplitudeDown); + // DeltaTimeOfFlightAverage[MeterNumber][Path].Add(decodingResult[Path].DeltaTimeOfFlightAverage); + // LineCounterZeroFlowTest[MeterNumber][Path] = Counters.SetCounters(GetCalculationIndicatorZeroFlowTest(), MeterNumber, Path, LineCounterZeroFlowTest); + // } + // else + // { + // BadDataCounterZeroFlowTest[MeterNumber][Path] = Counters.SetCounters(GetCalculationIndicatorZeroFlowTest(), MeterNumber, Path, BadDataCounterZeroFlowTest); + // NewDataIndicatorZeroFlowTest[MeterNumber][Path] = false; + // } + // #endregion + // } + // #endregion + // #region Activity check for temperature pipe test + // LineCounterTemperatureTest[MeterNumber][Path] = Counters.SetCounters(LoggingIndicatorTemperatureTest, MeterNumber, Path, LineCounterTemperatureTest); + // #endregion + // } + // #endregion + // #region Copy to global object + // DecodedAllMeters[MeterNumber][Constants.PATH0] = ((DecodedData)(decodingResult[Constants.PATH0].Clone())); + // DecodedAllMeters[MeterNumber][Constants.PATH1] = ((DecodedData)(decodingResult[Constants.PATH1].Clone())); + // DecodedAllMeters[MeterNumber][Constants.PATH2] = ((DecodedData)(decodingResult[Constants.PATH2].Clone())); + // #endregion + // } + //} + //private void MainLoopDataMeter10(object sender, EventArgs e) + ////private void MainLoopDataMeter10() + //{ + // #region Definitions and initializations + // const UInt16 MeterNumber = Constants.Meter10; + // DecodedData[] decodingResult = DecodedDataHelper.GetDefaultDecodedDataArray(Constants.NumberOfPaths); + // Int32 numberOfLines = (Int32)nUD_Settings_ZeroflowOffsetTestNumberOfLines.Value; + // decodingResult[Constants.PATH0].DecodingSucceeded = false; + // String Temp = String.Empty; + // #endregion + // #region Prepare data + // for (UInt16 i = 0; i < RxDataBuffer[MeterNumber].Count(); i++) + // { + // if (RxDataBuffer[MeterNumber].ElementAt(0).ToString().Equals("@")) + // { + // if (!String.IsNullOrEmpty(Output[MeterNumber])) + // { + // Temp = "@" + Output[MeterNumber]; + // ValidData[MeterNumber] = true; + // } + // Output[MeterNumber] = String.Empty; + // } + // else + // Output[MeterNumber] = Output[MeterNumber] + RxDataBuffer[MeterNumber].ElementAt(0); + + // RxDataBuffer[MeterNumber] = RxDataBuffer[MeterNumber].Remove(0, 1); + // } + // #endregion + + // if (ValidData[MeterNumber]) + // { + // #region Definitions and initializations + // Temp = Temp.Replace("\n", String.Empty); + // UInt16 Path = Constants.PATH0; + // ValidData[MeterNumber] = false; + // #endregion + // #region Logging (Zero flow test) + // if (GetLoggingIndicatorZeroFlowTest()[MeterNumber] && (!String.IsNullOrEmpty(LoggingPathZeroFlowTest[MeterNumber]))) + // { + // String time = DateTime.Now.ToString(Formats.RawDataDateTimeLogString, globalCulture); + // SetDataToLog(MeterNumber, GetDataToLog()[MeterNumber] + time + Temp + "\n"); + // } + // #endregion + // #region Decode data + // decodingResult = DecodeTelegram.DecodedDataDecodeTelegram(Temp, DecodedAllMeters[MeterNumber]); + // Path = decodingResult[Constants.PATH0].Path; // Equal for Paths + // Boolean CrcOk = Counters.CrcCheck(decodingResult[Path].Crc, Temp); + // #endregion + // #region Add to list h-protocol + // if (CrcOk) + // { + // #region Activity check for empty pipe test + // BadDataCounterZeroFlowTest[MeterNumber][Path] = Counters.SetCounters(LoggingIndicatorEmptyPipeTest, MeterNumber, Path, LineCounterEmptyPipeTest); + // #endregion + // #region Data for amplitude test + // if (LoggingIndicatorAmplitudeTest[MeterNumber]) + // { + // totalTimeOfFlightAverage[MeterNumber][Path].Add(decodingResult[Path].TotalTimeOfFlightAverage); + // NewDataIndicatorAmplitudeTest[MeterNumber][Path] = true; + // } + // LineCounterAmplitudeTest[MeterNumber][Path] = Counters.SetCounters(LoggingIndicatorAmplitudeTest, MeterNumber, Path, LineCounterAmplitudeTest); + // #endregion + // #region Data for zero flow test + // if (LineCounterZeroFlowTest[MeterNumber][Path] >= numberOfLines) + // { + // SetCalculationIndicatorZeroFlowTest(false, MeterNumber); + // SetLoggingIndicatorZeroFlowTest(false, MeterNumber); + // } + + // if (GetCalculationIndicatorZeroFlowTest()[MeterNumber]) + // { + // #region Bad data check + // if (decodingResult[Path].Error == DataError.NoError) + // { + // NewDataIndicatorZeroFlowTest[MeterNumber][Path] = true; + // AmplitudeValuesUp[MeterNumber][Path].Add(decodingResult[Path].AmplitudeUp); + // AmplitudeValuesDown[MeterNumber][Path].Add(decodingResult[Path].AmplitudeDown); + // DeltaTimeOfFlightAverage[MeterNumber][Path].Add(decodingResult[Path].DeltaTimeOfFlightAverage); + // LineCounterZeroFlowTest[MeterNumber][Path] = Counters.SetCounters(GetCalculationIndicatorZeroFlowTest(), MeterNumber, Path, LineCounterZeroFlowTest); + // } + // else + // { + // BadDataCounterZeroFlowTest[MeterNumber][Path] = Counters.SetCounters(GetCalculationIndicatorZeroFlowTest(), MeterNumber, Path, BadDataCounterZeroFlowTest); + // NewDataIndicatorZeroFlowTest[MeterNumber][Path] = false; + // } + // #endregion + // } + // #endregion + // #region Activity check for temperature pipe test + // LineCounterTemperatureTest[MeterNumber][Path] = Counters.SetCounters(LoggingIndicatorTemperatureTest, MeterNumber, Path, LineCounterTemperatureTest); + // #endregion + // } + // #endregion + // #region Copy to global object + // DecodedAllMeters[MeterNumber][Constants.PATH0] = ((DecodedData)(decodingResult[Constants.PATH0].Clone())); + // DecodedAllMeters[MeterNumber][Constants.PATH1] = ((DecodedData)(decodingResult[Constants.PATH1].Clone())); + // DecodedAllMeters[MeterNumber][Constants.PATH2] = ((DecodedData)(decodingResult[Constants.PATH2].Clone())); + // #endregion + // } + //} + + } +} + \ No newline at end of file diff --git a/ZeroFlowTool/Display.cs b/ZeroFlowTool/Display.cs new file mode 100644 index 00000000..40f0c9e9 --- /dev/null +++ b/ZeroFlowTool/Display.cs @@ -0,0 +1,2152 @@ +using System; +using System.Drawing; +using System.Linq; +using System.Globalization; +using System.Windows.Forms; + + +namespace GenesisZeroFlow +{ + public partial class GenesisZeroFlow : Form + { + public void StopMainSequence(String message, MessageBoxIcon icon, CultureInfo culture) + { + Display.SetProgressPanel(StatusPanelItems.None); + Display.AbortButtonEnabled(false); + Display.SetControlElements(true); + Display.StatusLabel(PredefinedMessages.PressDetect(culture)); + MessageBox.Show(message, "Form closing", MessageBoxButtons.OK, icon); // "'ZEROFLOW CALIBRATION' sequence stopped" + Display.SetThermoLabel1("THERMO1"); + Display.SetThermoLabel2("THERMO2"); + } + + public void ZeroFlowCalDetectSetBackColor(Color color) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Detect.BackColor = color; + } + public void ZeroFlowCalAmplitudeSetBackColor(Color color) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Amplitude.BackColor = color; + } + public void ZeroFlowCalPrepareSetBackColor(Color color) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Prepare.BackColor = color; + } + public void ZeroFlowCalOffsetSetBackColor(Color color) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Offset.BackColor = color; + } + public void ZeroFlowCalCompletionSetBackColor(Color color) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Completion.BackColor = color; + } + public void ZeroFlowCalTempCalSetBackColor(Color color) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_TempCal.BackColor = color; + } + public void ZeroFlowCalDetectSetLabelColor(Color color) + { + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Detect.ForeColor = color; + } + public void ZeroFlowCalAmplitudeSetLabelColor(Color color) + { + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Amplitude.ForeColor = color; + } + public void ZeroFlowCalPrepareSetLabelColor(Color color) + { + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Prepare.ForeColor = color; + } + public void ZeroFlowCalOffsetSetLabelColor(Color color) + { + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Offset.ForeColor = color; + } + public void ZeroFlowCalCompletionSetLabelColor(Color color) + { + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Completion.ForeColor = color; + } + public void ZeroFlowCalTempCalSetLabelColor(Color color) + { + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_TempCal.ForeColor = color; + } + + + public static class PredefinedMessages + { + #region Miscellaneous + public static String StorageFailed(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "Speichern fehlgeschlagen"; + else + Message = "Storage failed"; + + return Message; + } + public static String MeterSequenceFailed(String sequenceName, String MeterIndex, CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = $"{sequenceName} fehlgeschlagen bei ZÄHLER{MeterIndex}"; + else + Message = $"{sequenceName} failed at METER{MeterIndex}"; + + return Message; + } + public static String AreYouSure(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "Sind Sie sicher?"; + else + Message = "Are you sure?"; + + return Message; + } + public static String PressDetect(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "'DETEKT'-Taste drücken"; + else + Message = "Press 'DETECT'"; + + return Message; + } + public static String WaitDetect(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "Warten bis 'DETEKT' beendet"; + else + Message = "Wait until 'DETECTION' has finished"; + + return Message; + } + public static String WaitSeconds(Int32 seconds, CultureInfo culture) + { + String Message = String.Empty; + String Time = seconds.ToString(culture); + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = $"Wartezeit {Time} Sekunden"; + else + Message = $"Wait {Time} seconds"; + + return Message; + } + public static String DetectFailed(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "'DETEKT' fehlgeschlagen"; + else + Message = "'DETECT' failed"; + + return Message; + } + public static String PressStartOrDetect(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "'START'-Taste drücken oder 'DETEKT' wiederholen"; + else + Message = "Press 'START' or repeat 'DETECT'"; + + return Message; + } + public static String NoMeterSelected(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "Keinen ZÄHLER ausgewählt"; + else + Message = "No METER selected"; + + return Message; + } + public static String NoMeterPresent(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "Kein ZÄHLER bereit"; + else + Message = "No METER present"; + + return Message; + } + public static String NoThermometerPresent(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "Kein THERMOMETER bereit"; + else + Message = "No THERMOMETER present"; + + return Message; + } + public static String WaitUntilTemperatureAcquisitionFinished(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "Warten bis Temperaturakquirierung beendet"; + else + Message = "Wait until temperature acquisition finished"; + + return Message; + } + public static String WaitUntilTemperatureCalibrationFinished(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "Warten bis Temperaturkalibrierung beendet"; + else + Message = "Wait until temperature calibration finished"; + + return Message; + } + public static String NoThermometerSelected(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "Kein Thermometer ausgewählt"; + else + Message = "No THERMOMETER selected"; + + return Message; + } + public static String WaitForStabilization(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "Warten bis Werte stabil: "; + else + Message = "Wait for stabilization: "; + + return Message; + } + #endregion + #region Empty pipe mode + public static String WaitForEmptyPipe(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "Warten bis 'EMPTY PIPE'-Modus beendet: "; + else + Message = "Wait for leaving 'EMPTY PIPE' mode: "; + + return Message; + } + public static String EmptyPipeFailed(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "'EMPTY PIPE'-check fehlgeschlagen"; + else + Message = "'EMPTY PIPE'-check failed"; + + return Message; + } + #endregion + #region LOGIN + public static String WaitUntilLoginFinished(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "Warten bis 'LOGIN' beendet"; + else + Message = "Wait until 'LOGIN' has finished"; + + return Message; + } + public static String LoginFailed(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "'LOGIN'-fehlgeschlagen"; + else + Message = "'LOGIN'-failed"; + + return Message; + } + #endregion + #region PREPARATION + public static String WaitUntilPreparationFinished(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "Warten bis 'RÜSTEN' beendet"; + else + Message = "Wait until 'PREPARE' has finished"; + + return Message; + } + public static String PreparationFailed(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "'RÜSTEN' fehlgeschlagen"; + else + Message = "'PREPARE' failed"; + + return Message; + } + public static String PreparationStopped(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "'RÜSTEN' gestoppt"; + else + Message = "'PREPARE' stopped"; + + return Message; + } + #endregion + #region AMPLITUDE TEST + public static String WaitUntilAmplitudeTestFinished(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "Warten bis AMPLITUDENTEST beendet"; + else + Message = "Wait until AMPLITUDE TEST has finished"; + + return Message; + } + public static String WaitUntilRegisterWriteFinished(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "Warten bis Schreiben auf Register beendet"; + else + Message = "Wait until register write has finished"; + + return Message; + } + public static String WaitUntilRegisterReadFinished(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "Warten bis Lesen vom Register beendet"; + else + Message = "Wait until register read has finished"; + + return Message; + } + public static String WaitUntilPercentageSweepFinished(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "Warten bis Messung beendet"; + else + Message = "Wait for percentage sweep to end:"; + + return Message; + } + public static String WaitUntilAmplitudeFinished(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "Warten bis 'AMPLITUDENTEST' beendet"; + else + Message = "Wait until 'AMPLITUDE TEST' has finished"; + + return Message; + } + public static String AmplitudeFailed(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "'AMPLITUDENTEST' fehlgeschlagen"; + else + Message = "'AMPLITUDE TEST' failed"; + + return Message; + } + public static String AmplitudeStopped(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "'AMPLITUDENTEST' gestoppt"; + else + Message = "'AMPLITUDE TEST' stopped"; + + return Message; + } + #endregion + #region ZEROFLOW OFFSET TEST + public static String WaitUntilZeroflowOffsetTestFinished(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "Warten bis 'OFFSET TEST' beendet"; + else + Message = "Wait until 'OFFSET TEST' has finished"; + + return Message; + } + public static String ZeroflowOffsetAqqFinished(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "Warten bis Datenaufnahme beendet:"; + else + Message = "Wait until data aquisition has finished:"; + + return Message; + } + public static String ZeroflowOffsetTestFailed(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "'ZEROFLOW OFFSET TEST' fehlgeschlagen"; + else + Message = "'ZEROFLOW OFFSET TEST' failed"; + + return Message; + } + public static String ZeroflowOffsetTestStopped(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "'ZEROFLOW OFFSET TEST' gestoppt"; + else + Message = "'ZEROFLOW OFFSET TEST' stopped"; + + return Message; + } + public static String ZeroflowOffsetWaitForSettling(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "Beruhigungszeit abwarten: "; + else + Message = "Wait for settling time: "; + + return Message; + } + #endregion + #region TEMPERATURE CALIBRATION + public static String TempCalFailed(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "TEMPERATUR KALIBRIERUNG fehlgeschlagen bei ZÄHLER"; + else + Message = "TEMPERATURE CALIBRATION failed at METER"; + + return Message; + } + #endregion + #region COMPLETION + public static String WaitUntilCompletionFinished(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "Warten bis 'ABSCHLUSS' beendet"; + else + Message = "Wait until 'COMPLETION' has finished"; + + return Message; + } + public static String CompletionStopped(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "'ABSCHLUSS' gestoppt"; + else + Message = "'COMPLETION' stopped"; + + return Message; + } + public static String CompletionFailed(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "'ABSCHLUSS' fehlgeschlagen"; + else + Message = "'COMPLETION' failed"; + + return Message; + } + #endregion + #region ZEROFLOW CALIBRATION SEQUENCE + public static String ZeroflowCalibrationSequenceStopped(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "'ZEROFLOW KALIBRIERUNGS'-Sequenz gestoppt"; + else + Message = "'ZEROFLOW CALIBRATION' sequence stopped"; + + return Message; + } + public static String ZeroflowCalibrationSequenceFailed(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "'ZEROFLOW KALIBRIERUNGS'-Sequenz fehlgeschlagen"; + else + Message = "'ZEROFLOW CALIBRATION' sequence failed"; + + return Message; + } + public static String ZeroflowCalibrationSequenceSuccessful(CultureInfo culture) + { + String Message = String.Empty; + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + Message = "'ZEROFLOW KALIBRIERUNGS'-Sequenz erfolgreich"; + else + Message = "'ZEROFLOW CALIBRATION' sequence successful"; + + return Message; + } + #endregion + } + + public static class Display + { + public static void TemperatureField(Boolean[] enable) + { + if (enable == null) + return; + + if (GenesisZeroFlow._GenesisZeroFlow.InvokeRequired) + { + GenesisZeroFlow._GenesisZeroFlow.Invoke((Action)TemperatureField, enable); + return; + } + else + { + TemperatureField secondForm; + using (secondForm = new TemperatureField()) + { + GenesisZeroFlow._GenesisZeroFlow.tab_Maintab.Enabled = false; + secondForm.SetMeter1(enable[Constants.Meter1]); + secondForm.SetMeter2(enable[Constants.Meter2]); + secondForm.SetMeter3(enable[Constants.Meter3]); + secondForm.SetMeter4(enable[Constants.Meter4]); + secondForm.SetMeter5(enable[Constants.Meter5]); + secondForm.SetMeter6(enable[Constants.Meter6]); + secondForm.SetMeter7(enable[Constants.Meter7]); + secondForm.SetMeter8(enable[Constants.Meter8]); + secondForm.SetMeter9(enable[Constants.Meter9]); + secondForm.SetMeter10(enable[Constants.Meter10]); + GenesisZeroFlow._GenesisZeroFlow.SetWaitForTemperatureField(true); + secondForm.Show(); + while (GenesisZeroFlow._GenesisZeroFlow.WaitForTemperatureField) { Misc.WaitNSeconds(1, true); } + } + } + + + } + public static void SetControlText(CultureInfo culture) + { + if (GenesisZeroFlow._GenesisZeroFlow.InvokeRequired) + { + GenesisZeroFlow._GenesisZeroFlow.Invoke((Action)SetControlText, culture); + return; + } + + if (CultureInfo.Equals(culture, GenesisZeroFlow._GenesisZeroFlow.CultureDe)) + { + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Meter1.Text = "ZÄHLER1"; + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Meter2.Text = "ZÄHLER2"; + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Meter3.Text = "ZÄHLER3"; + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Meter4.Text = "ZÄHLER4"; + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Meter5.Text = "ZÄHLER5"; + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Meter6.Text = "ZÄHLER6"; + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Meter7.Text = "ZÄHLER7"; + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Meter8.Text = "ZÄHLER8"; + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Meter9.Text = "ZÄHLER9"; + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Meter10.Text = "ZÄHLER10"; + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Detect.Text = "DETEKT"; + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Prepare.Text = "RÜSTEN"; + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Amplitude.Text = "AMPLITUDEN\nTEST"; + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_TempCal.Text = "TEMPERATUR\nKALIBRIERUNG"; + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Completion.Text = "ABSCHLUSS"; + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Resttime.Text = "Geschätzte Restzeit "; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter1.Text = "aktiv"; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter2.Text = "aktiv"; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter3.Text = "aktiv"; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter4.Text = "aktiv"; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter5.Text = "aktiv"; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter6.Text = "aktiv"; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter7.Text = "aktiv"; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter8.Text = "aktiv"; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter9.Text = "aktiv"; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter10.Text = "aktiv"; + GenesisZeroFlow._GenesisZeroFlow.btn_ZeroFlowCal_Save.Text = "speichern"; + GenesisZeroFlow._GenesisZeroFlow.btn_ZeroFlowCal_Clear.Text = "löschen"; + GenesisZeroFlow._GenesisZeroFlow.btn_ZeroFlowCal_Detect.Text = "DETEKT"; + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Status.Text = "'DETEKT'-Taste drücken"; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Meter1.Text = "METER1"; + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Meter2.Text = "METER2"; + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Meter3.Text = "METER3"; + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Meter4.Text = "METER4"; + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Meter5.Text = "METER5"; + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Meter6.Text = "METER6"; + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Meter7.Text = "METER7"; + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Meter8.Text = "METER8"; + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Meter9.Text = "METER9"; + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Meter10.Text = "METER10"; + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Detect.Text = "DETECT"; + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Prepare.Text = "PREPARE"; + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Amplitude.Text = "AMPLITUDE\nTEST"; + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_TempCal.Text = "TEMPERATURE\nCALIBRATION"; + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Completion.Text = "COMPLETION"; + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Resttime.Text = "Estimated time to finish: "; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter1.Text = "enable"; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter2.Text = "enable"; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter3.Text = "enable"; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter4.Text = "enable"; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter5.Text = "enable"; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter6.Text = "enable"; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter7.Text = "enable"; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter8.Text = "enable"; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter9.Text = "enable"; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter10.Text = "enable"; + GenesisZeroFlow._GenesisZeroFlow.btn_ZeroFlowCal_Save.Text = "Save"; + GenesisZeroFlow._GenesisZeroFlow.btn_ZeroFlowCal_Clear.Text = "Clear"; + GenesisZeroFlow._GenesisZeroFlow.btn_ZeroFlowCal_Detect.Text = "DETECT"; + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Status.Text = "Press 'DETECT'"; + + } + + } + public static void SetControlElements(Boolean enabled) + { + if (GenesisZeroFlow._GenesisZeroFlow.InvokeRequired) + { + GenesisZeroFlow._GenesisZeroFlow.Invoke((Action)SetControlElements, enabled); + return; + } + if (enabled) + { + GenesisZeroFlow._GenesisZeroFlow.lbLanguage.Enabled = true; + GenesisZeroFlow._GenesisZeroFlow.pB_Bubbles1.Visible = false; + GenesisZeroFlow._GenesisZeroFlow.btn_ZeroFlowCal_Detect.Enabled = true; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter1.Enabled = true; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter2.Enabled = true; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter3.Enabled = true; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter4.Enabled = true; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter5.Enabled = true; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter6.Enabled = true; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter7.Enabled = true; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter8.Enabled = true; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter9.Enabled = true; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter10.Enabled = true; + GenesisZeroFlow._GenesisZeroFlow.gB_Settings_AmplitudeTest.Enabled = true; + GenesisZeroFlow._GenesisZeroFlow.gB_Settings_ZeroflowOffsetTest.Enabled = true; + GenesisZeroFlow._GenesisZeroFlow.gB_Passwords.Enabled = true; + GenesisZeroFlow._GenesisZeroFlow.gB_Settings_Preparation.Enabled = true; + GenesisZeroFlow._GenesisZeroFlow.gB_Settings_TemperatureCalibration.Enabled = true; + GenesisZeroFlow._GenesisZeroFlow.gB_SettingsTempMonitor.Enabled = true; + GenesisZeroFlow._GenesisZeroFlow.btn_ZeroFlowCal_Pdf.Enabled = true; + GenesisZeroFlow._GenesisZeroFlow.btn_ZeroFlowCal_Save.Enabled = true; + GenesisZeroFlow._GenesisZeroFlow.btn_ZeroFlowCal_Clear.Enabled = true; + Display.AbortButtonEnabled(false); + GenesisZeroFlow._GenesisZeroFlow.cB_AmplitudeTestEnable.Enabled = true; + GenesisZeroFlow._GenesisZeroFlow.cB_TempCalEnable.Enabled = true; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowOffsetTestEnable.Enabled = true; + GenesisZeroFlow._GenesisZeroFlow.cB_Thermo1.Enabled = true; + GenesisZeroFlow._GenesisZeroFlow.cB_Thermo2.Enabled = true; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.lbLanguage.Enabled = false; + GenesisZeroFlow._GenesisZeroFlow.btn_ZeroFlowCal_Detect.Enabled = false; + GenesisZeroFlow._GenesisZeroFlow.btn_ZeroFlowCal_Start.Enabled = false; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter1.Enabled = false; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter2.Enabled = false; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter3.Enabled = false; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter4.Enabled = false; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter5.Enabled = false; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter6.Enabled = false; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter7.Enabled = false; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter8.Enabled = false; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter9.Enabled = false; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowCal_EnableMeter10.Enabled = false; + GenesisZeroFlow._GenesisZeroFlow.gB_Settings_AmplitudeTest.Enabled = false; + GenesisZeroFlow._GenesisZeroFlow.gB_Settings_ZeroflowOffsetTest.Enabled = false; + GenesisZeroFlow._GenesisZeroFlow.gB_Passwords.Enabled = false; + GenesisZeroFlow._GenesisZeroFlow.gB_Settings_Preparation.Enabled = false; + GenesisZeroFlow._GenesisZeroFlow.gB_Settings_TemperatureCalibration.Enabled = false; + GenesisZeroFlow._GenesisZeroFlow.btn_ZeroFlowCal_Pdf.Enabled = false; + GenesisZeroFlow._GenesisZeroFlow.btn_ZeroFlowCal_Save.Enabled = false; + GenesisZeroFlow._GenesisZeroFlow.btn_ZeroFlowCal_Clear.Enabled = false; + Display.AbortButtonEnabled(true); + GenesisZeroFlow._GenesisZeroFlow.cB_AmplitudeTestEnable.Enabled = false; + GenesisZeroFlow._GenesisZeroFlow.cB_TempCalEnable.Enabled = false; + GenesisZeroFlow._GenesisZeroFlow.cB_ZeroFlowOffsetTestEnable.Enabled = false; + GenesisZeroFlow._GenesisZeroFlow.gB_SettingsTempMonitor.Enabled = false; + GenesisZeroFlow._GenesisZeroFlow.cB_Thermo1.Enabled = false; + GenesisZeroFlow._GenesisZeroFlow.cB_Thermo2.Enabled = false; + } + } + public static void MeterStatusGreenRed(Boolean[] ok, Boolean[] enable) + { + if ((ok == null)||(enable == null)) + return; + + #region Invoke + if (GenesisZeroFlow._GenesisZeroFlow.InvokeRequired) + { + GenesisZeroFlow._GenesisZeroFlow.Invoke((Action)MeterStatusGreenRed, ok, enable); + return; + } + #endregion + #region METER1 + if (enable[Constants.Meter1]) + { + if (ok[Constants.CmdMeter1]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter1.BackColor = Color.LightGreen; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter1.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter1.BackColor = Color.LightPink; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter1.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + } + #endregion + #region METER2 + if (enable[Constants.Meter2]) + { + if (ok[Constants.CmdMeter2]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter2.BackColor = Color.LightGreen; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter2.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter2.BackColor = Color.LightPink; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter2.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + } + #endregion + #region METER3 + if (enable[Constants.Meter3]) + { + if (ok[Constants.CmdMeter3]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter3.BackColor = Color.LightGreen; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter3.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter3.BackColor = Color.LightPink; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter3.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + } + #endregion + #region METER4 + if (enable[Constants.Meter4]) + { + if (ok[Constants.CmdMeter4]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter4.BackColor = Color.LightGreen; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter4.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter4.BackColor = Color.LightPink; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter4.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + } + #endregion + #region METER5 + if (enable[Constants.Meter5]) + { + if (ok[Constants.CmdMeter5]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter5.BackColor = Color.LightGreen; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter5.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter5.BackColor = Color.LightPink; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter5.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + } + #endregion + #region METER6 + if (enable[Constants.Meter6]) + { + if (ok[Constants.CmdMeter6]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter6.BackColor = Color.LightGreen; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter6.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter6.BackColor = Color.LightPink; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter6.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + } + #endregion + #region METER7 + if (enable[Constants.Meter7]) + { + if (ok[Constants.CmdMeter7]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter7.BackColor = Color.LightGreen; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter7.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter7.BackColor = Color.LightPink; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter7.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + } + #endregion + #region METER8 + if (enable[Constants.Meter8]) + { + if (ok[Constants.CmdMeter8]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter8.BackColor = Color.LightGreen; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter8.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter8.BackColor = Color.LightPink; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter8.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + } + #endregion + #region METER9 + if (enable[Constants.Meter9]) + { + if (ok[Constants.CmdMeter9]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter9.BackColor = Color.LightGreen; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter9.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter9.BackColor = Color.LightPink; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter9.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + } + #endregion + #region METER10 + if (enable[Constants.Meter10]) + { + if (ok[Constants.CmdMeter10]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter10.BackColor = Color.LightGreen; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter10.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter10.BackColor = Color.LightPink; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter10.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + } + #endregion + } + public static void ThermoStatusGreenRed(Boolean[] ok, Boolean[] enable) + { + if ((ok == null) || (enable == null)) + return; + + #region Invoke + if (GenesisZeroFlow._GenesisZeroFlow.InvokeRequired) + { + GenesisZeroFlow._GenesisZeroFlow.Invoke((Action)ThermoStatusGreenRed, ok, enable); + return; + } + #endregion + #region THERMO1 + if (enable[Constants.Thermo1]) + { + if (ok[Constants.CmdThermo1]) + { + GenesisZeroFlow._GenesisZeroFlow.pThermo1.BackColor = Color.LightGreen; + //GenesisZeroFlow._GenesisZeroFlow.pB_Thermo1.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.pThermo1.BackColor = Color.LightPink; + //GenesisZeroFlow._GenesisZeroFlow.pB_Thermo1.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + } + #endregion + #region THERMO2 + if (enable[Constants.Thermo2]) + { + if (ok[Constants.CmdThermo2]) + { + GenesisZeroFlow._GenesisZeroFlow.pThermo2.BackColor = Color.LightGreen; + //GenesisZeroFlow._GenesisZeroFlow.pB_Thermo2.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.pThermo2.BackColor = Color.LightPink; + //GenesisZeroFlow._GenesisZeroFlow.pB_Thermo2.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + } + #endregion + } + public static void MeterStatusRedYellow(Boolean[] ok, Boolean[] enable) + { + if ((ok == null) || (enable == null)) + return; + + if (GenesisZeroFlow._GenesisZeroFlow.InvokeRequired) + { + GenesisZeroFlow._GenesisZeroFlow.Invoke((Action)MeterStatusRedYellow, ok, enable); + return; + } + + #region METER1 + if (enable[Constants.Meter1]) + { + if (ok[Constants.CmdMeter1]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter1.BackColor = Color.LightPink; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter1.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter1.BackColor = Color.Cornsilk; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter1.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + } + #endregion + #region METER2 + if (enable[Constants.Meter2]) + { + if (ok[Constants.CmdMeter2]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter2.BackColor = Color.LightPink; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter2.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter2.BackColor = Color.Cornsilk; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter2.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + } + #endregion + #region METER3 + if (enable[Constants.Meter3]) + { + if (ok[Constants.CmdMeter3]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter3.BackColor = Color.LightPink; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter3.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter3.BackColor = Color.Cornsilk; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter3.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + } + #endregion + #region METER4 + if (enable[Constants.Meter4]) + { + if (ok[Constants.CmdMeter4]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter4.BackColor = Color.LightPink; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter4.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter4.BackColor = Color.Cornsilk; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter4.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + } + #endregion + #region METER5 + if (enable[Constants.Meter5]) + { + if (ok[Constants.CmdMeter5]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter5.BackColor = Color.LightPink; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter5.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter5.BackColor = Color.Cornsilk; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter5.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + } + #endregion + #region METER6 + if (enable[Constants.Meter6]) + { + if (ok[Constants.CmdMeter6]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter6.BackColor = Color.LightPink; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter6.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter6.BackColor = Color.Cornsilk; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter6.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + } + #endregion + #region METER7 + if (enable[Constants.Meter7]) + { + if (ok[Constants.CmdMeter7]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter7.BackColor = Color.LightPink; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter7.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter7.BackColor = Color.Cornsilk; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter7.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + } + #endregion + #region METER8 + if (enable[Constants.Meter8]) + { + if (ok[Constants.CmdMeter8]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter8.BackColor = Color.LightPink; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter8.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter8.BackColor = Color.Cornsilk; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter8.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + } + #endregion + #region METER9 + if (enable[Constants.Meter9]) + { + if (ok[Constants.CmdMeter9]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter9.BackColor = Color.LightPink; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter9.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter9.BackColor = Color.Cornsilk; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter9.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + } + #endregion + #region METER10 + if (enable[Constants.Meter10]) + { + if (ok[Constants.CmdMeter10]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter10.BackColor = Color.LightPink; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter10.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter10.BackColor = Color.Cornsilk; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter10.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + } + #endregion + #region THERMO1 + if (enable[Constants.Thermo1]) + { + if (ok[Constants.CmdThermo1]) + { + GenesisZeroFlow._GenesisZeroFlow.pThermo1.BackColor = Color.LightPink; + //GenesisZeroFlow._GenesisZeroFlow.pB_Thermo1.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.pThermo1.BackColor = Color.Cornsilk; + //GenesisZeroFlow._GenesisZeroFlow.pB_Thermo1.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + } + #endregion + #region THERMO2 + if (enable[Constants.Thermo2]) + { + if (ok[Constants.CmdThermo2]) + { + GenesisZeroFlow._GenesisZeroFlow.pThermo2.BackColor = Color.LightPink; + //GenesisZeroFlow._GenesisZeroFlow.pB_Thermo2.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.pThermo2.BackColor = Color.Cornsilk; + //GenesisZeroFlow._GenesisZeroFlow.pB_Thermo2.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + } + #endregion + } + public static void MeterStatusGreenYellow(Boolean[] ok, Boolean[] enable) + { + if ((ok == null) || (enable == null)) + return; + + if (GenesisZeroFlow._GenesisZeroFlow.InvokeRequired) + { + GenesisZeroFlow._GenesisZeroFlow.Invoke((Action)MeterStatusGreenYellow, ok, enable); + return; + } + + #region METER1 + if (enable[Constants.Meter1]) + { + if (ok[Constants.CmdMeter1]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter1.BackColor = Color.LightGreen; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter1.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter1.BackColor = Color.Cornsilk; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter1.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + } + #endregion + #region METER2 + if (enable[Constants.Meter2]) + { + if (ok[Constants.CmdMeter2]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter2.BackColor = Color.LightGreen; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter2.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter2.BackColor = Color.Cornsilk; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter2.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + } + #endregion + #region METER3 + if (enable[Constants.Meter3]) + { + if (ok[Constants.CmdMeter3]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter3.BackColor = Color.LightGreen; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter3.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter3.BackColor = Color.Cornsilk; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter3.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + } + #endregion + #region METER4 + if (enable[Constants.Meter4]) + { + if (ok[Constants.CmdMeter4]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter4.BackColor = Color.LightGreen; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter4.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter4.BackColor = Color.Cornsilk; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter4.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + } + #endregion + #region METER5 + if (enable[Constants.Meter5]) + { + if (ok[Constants.CmdMeter5]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter5.BackColor = Color.LightGreen; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter5.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter5.BackColor = Color.Cornsilk; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter5.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + } + #endregion + #region METER6 + if (enable[Constants.Meter6]) + { + if (ok[Constants.CmdMeter6]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter6.BackColor = Color.LightGreen; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter6.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter6.BackColor = Color.Cornsilk; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter6.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + } + #endregion + #region METER7 + if (enable[Constants.Meter7]) + { + if (ok[Constants.CmdMeter7]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter7.BackColor = Color.LightGreen; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter7.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter7.BackColor = Color.Cornsilk; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter7.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + } + #endregion + #region METER8 + if (enable[Constants.Meter8]) + { + if (ok[Constants.CmdMeter8]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter8.BackColor = Color.LightGreen; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter8.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter8.BackColor = Color.Cornsilk; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter8.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + } + #endregion + #region METER9 + if (enable[Constants.Meter9]) + { + if (ok[Constants.CmdMeter9]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter9.BackColor = Color.LightGreen; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter9.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter9.BackColor = Color.Cornsilk; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter9.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + } + #endregion + #region METER10 + if (enable[Constants.Meter10]) + { + if (ok[Constants.CmdMeter10]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter10.BackColor = Color.LightGreen; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter10.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter10.BackColor = Color.Cornsilk; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter10.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + } + #endregion + #region THERMO1 + if (enable[Constants.Thermo1]) + { + if (ok[Constants.CmdThermo1]) + { + GenesisZeroFlow._GenesisZeroFlow.pThermo1.BackColor = Color.LightGreen; + //GenesisZeroFlow._GenesisZeroFlow.pB_Thermo1.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.pThermo1.BackColor = Color.Cornsilk; + //GenesisZeroFlow._GenesisZeroFlow.pB_Thermo1.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + } + #endregion + #region THERMO2 + if (enable[Constants.Thermo2]) + { + if (ok[Constants.CmdThermo2]) + { + GenesisZeroFlow._GenesisZeroFlow.pThermo2.BackColor = Color.LightGreen; + //GenesisZeroFlow._GenesisZeroFlow.pB_Thermo2.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.pThermo2.BackColor = Color.Cornsilk; + //GenesisZeroFlow._GenesisZeroFlow.pB_Thermo2.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + } + #endregion + } + public static void SetProgressPanel(Int32 item) + { + if (GenesisZeroFlow._GenesisZeroFlow.InvokeRequired) + { + GenesisZeroFlow._GenesisZeroFlow.Invoke((Action)SetProgressPanel, item); + return; + } + + switch (item) + { + case StatusPanelItems.None: + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalDetectSetBackColor(Color.Gainsboro); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalPrepareSetBackColor(Color.Gainsboro); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalAmplitudeSetBackColor(Color.Gainsboro); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalOffsetSetBackColor(Color.Gainsboro); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalCompletionSetBackColor(Color.Gainsboro); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalTempCalSetBackColor(Color.Gainsboro); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalDetectSetLabelColor(Color.Gray); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalPrepareSetLabelColor(Color.Gray); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalAmplitudeSetLabelColor(Color.Gray); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalOffsetSetLabelColor(Color.Gray); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalCompletionSetLabelColor(Color.Gray); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalTempCalSetLabelColor(Color.Gray); + break; + + case StatusPanelItems.Detect: + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalDetectSetBackColor(Color.LightGreen); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalPrepareSetBackColor(Color.Gainsboro); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalAmplitudeSetBackColor(Color.Gainsboro); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalOffsetSetBackColor(Color.Gainsboro); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalCompletionSetBackColor(Color.Gainsboro); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalTempCalSetBackColor(Color.Gainsboro); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalDetectSetLabelColor(Color.Black); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalPrepareSetLabelColor(Color.Gray); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalAmplitudeSetLabelColor(Color.Gray); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalOffsetSetLabelColor(Color.Gray); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalCompletionSetLabelColor(Color.Gray); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalTempCalSetLabelColor(Color.Gray); + break; + + case StatusPanelItems.Prepare: + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalDetectSetBackColor(Color.LightGreen); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalPrepareSetBackColor(Color.LightGreen); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalAmplitudeSetBackColor(Color.Gainsboro); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalOffsetSetBackColor(Color.Gainsboro); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalCompletionSetBackColor(Color.Gainsboro); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalTempCalSetBackColor(Color.Gainsboro); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalDetectSetLabelColor(Color.Gray); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalPrepareSetLabelColor(Color.Black); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalAmplitudeSetLabelColor(Color.Gray); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalOffsetSetLabelColor(Color.Gray); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalCompletionSetLabelColor(Color.Gray); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalTempCalSetLabelColor(Color.Gray); + break; + + case StatusPanelItems.Amplitude: + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalDetectSetBackColor(Color.LightGreen); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalPrepareSetBackColor(Color.LightGreen); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalAmplitudeSetBackColor(Color.LightGreen); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalOffsetSetBackColor(Color.Gainsboro); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalTempCalSetBackColor(Color.Gainsboro); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalCompletionSetBackColor(Color.Gainsboro); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalDetectSetLabelColor(Color.Gray); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalPrepareSetLabelColor(Color.Gray); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalAmplitudeSetLabelColor(Color.Black); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalOffsetSetLabelColor(Color.Gray); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalTempCalSetLabelColor(Color.Gray); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalCompletionSetLabelColor(Color.Gray); + break; + + case StatusPanelItems.Offset: + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalDetectSetBackColor(Color.LightGreen); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalPrepareSetBackColor(Color.LightGreen); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalAmplitudeSetBackColor(Color.LightGreen); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalTempCalSetBackColor(Color.LightGreen); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalOffsetSetBackColor(Color.LightGreen); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalCompletionSetBackColor(Color.Gainsboro); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalDetectSetLabelColor(Color.Gray); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalPrepareSetLabelColor(Color.Gray); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalAmplitudeSetLabelColor(Color.Gray); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalOffsetSetLabelColor(Color.Black); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalTempCalSetLabelColor(Color.Gray); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalCompletionSetLabelColor(Color.Gray); + break; + + case StatusPanelItems.Completion: + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalDetectSetBackColor(Color.LightGreen); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalPrepareSetBackColor(Color.LightGreen); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalAmplitudeSetBackColor(Color.LightGreen); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalOffsetSetBackColor(Color.LightGreen); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalTempCalSetBackColor(Color.LightGreen); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalCompletionSetBackColor(Color.LightGreen); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalDetectSetLabelColor(Color.Gray); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalPrepareSetLabelColor(Color.Gray); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalAmplitudeSetLabelColor(Color.Gray); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalOffsetSetLabelColor(Color.Gray); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalTempCalSetLabelColor(Color.Gray); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalCompletionSetLabelColor(Color.Black); + break; + + case StatusPanelItems.TempCal: + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalDetectSetBackColor(Color.LightGreen); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalPrepareSetBackColor(Color.LightGreen); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalAmplitudeSetBackColor(Color.LightGreen); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalTempCalSetBackColor(Color.LightGreen); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalOffsetSetBackColor(Color.Gainsboro); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalCompletionSetBackColor(Color.Gainsboro); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalDetectSetLabelColor(Color.Gray); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalPrepareSetLabelColor(Color.Gray); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalAmplitudeSetLabelColor(Color.Gray); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalTempCalSetLabelColor(Color.Black); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalOffsetSetLabelColor(Color.Gray); + GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalCompletionSetLabelColor(Color.Gray); + break; + + default: + //GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalDetectSetBackColor(Color.Gainsboro); + //GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalPrepareSetBackColor(Color.Gainsboro); + //GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalAmplitudeSetBackColor(Color.Gainsboro); + //GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalOffsetSetBackColor(Color.Gainsboro); + //GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalCompletionSetBackColor(Color.Gainsboro); + //GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalTempCalSetBackColor(Color.Gainsboro); + //GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalDetectSetLabelColor(Color.Gray); + //GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalPrepareSetLabelColor(Color.Gray); + //GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalAmplitudeSetLabelColor(Color.Gray); + //GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalOffsetSetLabelColor(Color.Gray); + //GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalCompletionSetLabelColor(Color.Gray); + //GenesisZeroFlow._GenesisZeroFlow.ZeroFlowCalTempCalSetLabelColor(Color.Gray); + break; + + } + + Misc.WaitNSeconds(2); + return; + } + public static void ConnectionStatus(Boolean[] ok) + { + if (ok == null) + return; + + if (GenesisZeroFlow._GenesisZeroFlow.InvokeRequired) + { + GenesisZeroFlow._GenesisZeroFlow.Invoke((Action)ConnectionStatus, ok); + return; + } + + #region METER1 + if (ok[Constants.CmdMeter1] && ok[Constants.DataMeter1]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter1.BackColor = Color.LightGreen; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter1.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter1.BackColor = Color.LightPink; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter1.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + #endregion + #region METER2 + if (ok[Constants.CmdMeter2] && ok[Constants.DataMeter2]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter2.BackColor = Color.LightGreen; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter2.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter2.BackColor = Color.LightPink; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter2.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + #endregion + #region METER3 + if (ok[Constants.CmdMeter3] && ok[Constants.DataMeter3]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter3.BackColor = Color.LightGreen; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter3.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter3.BackColor = Color.LightPink; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter3.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + #endregion + #region METER4 + if (ok[Constants.CmdMeter4] && ok[Constants.DataMeter4]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter4.BackColor = Color.LightGreen; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter4.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter4.BackColor = Color.LightPink; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter4.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + #endregion + #region METER5 + if (ok[Constants.CmdMeter5] && ok[Constants.DataMeter5]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter5.BackColor = Color.LightGreen; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter5.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter5.BackColor = Color.LightPink; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter5.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + #endregion + #region METER6 + if (ok[Constants.CmdMeter6] && ok[Constants.DataMeter6]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter6.BackColor = Color.LightGreen; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter6.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter6.BackColor = Color.LightPink; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter6.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + #endregion + #region METER7 + if (ok[Constants.CmdMeter7] && ok[Constants.DataMeter7]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter7.BackColor = Color.LightGreen; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter7.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter7.BackColor = Color.LightPink; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter7.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + #endregion + #region METER8 + if (ok[Constants.CmdMeter8] && ok[Constants.DataMeter8]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter8.BackColor = Color.LightGreen; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter8.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter8.BackColor = Color.LightPink; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter8.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + #endregion + #region METER9 + if (ok[Constants.CmdMeter9] && ok[Constants.DataMeter9]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter9.BackColor = Color.LightGreen; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter9.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter9.BackColor = Color.LightPink; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter9.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + #endregion + #region METER10 + if (ok[Constants.CmdMeter10] && ok[Constants.DataMeter10]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter10.BackColor = Color.LightGreen; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter10.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter10.BackColor = Color.LightPink; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter10.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + #endregion + } + public static void ThermoConnectionStatus(Boolean[] ok) + { + if (ok == null) + return; + + if (GenesisZeroFlow._GenesisZeroFlow.InvokeRequired) + { + GenesisZeroFlow._GenesisZeroFlow.Invoke((Action)ThermoConnectionStatus, ok); + return; + } + #region THERMO1 + if (ok[Constants.CmdThermo1] && ok[Constants.DataThermo1]) + { + GenesisZeroFlow._GenesisZeroFlow.pThermo1.BackColor = Color.LightGreen; + //GenesisZeroFlow._GenesisZeroFlow.pB_Thermo1.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.pThermo1.BackColor = Color.LightPink; + //GenesisZeroFlow._GenesisZeroFlow.pB_Thermo1.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + #endregion + #region THERMO2 + if (ok[Constants.CmdThermo2] && ok[Constants.DataThermo2]) + { + GenesisZeroFlow._GenesisZeroFlow.pThermo2.BackColor = Color.LightGreen; + //GenesisZeroFlow._GenesisZeroFlow.pB_Thermo2.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.Image; + } + else + { + GenesisZeroFlow._GenesisZeroFlow.pThermo2.BackColor = Color.LightPink; + //GenesisZeroFlow._GenesisZeroFlow.pB_Thermo2.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.ErrorImage; + } + #endregion + } + public static void SetThermoLabel1(String text) + { + if (GenesisZeroFlow._GenesisZeroFlow.InvokeRequired) + { + GenesisZeroFlow._GenesisZeroFlow.Invoke((Action)SetThermoLabel1, text); + return; + } + + GenesisZeroFlow._GenesisZeroFlow.l_Thermo1.Text = text; + } + public static void SetThermoLabel2(String text) + { + if (GenesisZeroFlow._GenesisZeroFlow.InvokeRequired) + { + GenesisZeroFlow._GenesisZeroFlow.Invoke((Action)SetThermoLabel2, text); + return; + } + + GenesisZeroFlow._GenesisZeroFlow.l_Thermo2.Text = text; + } + public static void ConnectionStatusReset(Boolean[] reset) + { + if (reset == null) + return; + + if (GenesisZeroFlow._GenesisZeroFlow.InvokeRequired) + { + GenesisZeroFlow._GenesisZeroFlow.Invoke((Action)ConnectionStatusReset, reset); + return; + } + #region METER1 + if (reset[Constants.Meter1]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter1.BackColor = Color.Cornsilk; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter1.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + #endregion + #region METER2 + if (reset[Constants.Meter2]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter2.BackColor = Color.Cornsilk; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter2.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + #endregion + #region METER3 + if (reset[Constants.Meter3]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter3.BackColor = Color.Cornsilk; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter3.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + #endregion + #region METER4 + if (reset[Constants.Meter4]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter4.BackColor = Color.Cornsilk; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter4.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + #endregion + #region METER5 + if (reset[Constants.Meter5]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter5.BackColor = Color.Cornsilk; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter5.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + #endregion + #region METER6 + if (reset[Constants.Meter6]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter6.BackColor = Color.Cornsilk; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter6.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + #endregion + #region METER7 + if (reset[Constants.Meter7]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter7.BackColor = Color.Cornsilk; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter7.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + #endregion + #region METER8 + if (reset[Constants.Meter8]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter8.BackColor = Color.Cornsilk; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter8.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + #endregion + #region METER9 + if (reset[Constants.Meter9]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter9.BackColor = Color.Cornsilk; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter9.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + #endregion + #region METER10 + if (reset[Constants.Meter10]) + { + GenesisZeroFlow._GenesisZeroFlow.p_ZeroFlowCal_Meter10.BackColor = Color.Cornsilk; + GenesisZeroFlow._GenesisZeroFlow.pB_Meter10.Image = GenesisZeroFlow._GenesisZeroFlow.pB_AvailableImages.InitialImage; + } + #endregion + + } + public static void ThermoConnectionStatusReset(Boolean[] reset) + { + if (reset == null) + return; + + if (GenesisZeroFlow._GenesisZeroFlow.InvokeRequired) + { + GenesisZeroFlow._GenesisZeroFlow.Invoke((Action)ThermoConnectionStatusReset, reset); + return; + } + + #region THERMO1 + if (reset[Constants.Thermo1]) + GenesisZeroFlow._GenesisZeroFlow.pThermo1.BackColor = Color.Cornsilk; + #endregion + #region THERMO2 + if (reset[Constants.Thermo2]) + GenesisZeroFlow._GenesisZeroFlow.pThermo2.BackColor = Color.Cornsilk; + #endregion + } + public static void DebugMessage(String text, CultureInfo culture) + { + // Add line and scroll to caret + if (!String.IsNullOrEmpty(text)) + { + if (GenesisZeroFlow._GenesisZeroFlow.InvokeRequired) + { + GenesisZeroFlow._GenesisZeroFlow.Invoke((Action)DebugMessage, text, culture); + return; + } + + String Timestamp = DateTime.Now.ToString(Formats.RawDataDateTimeLogString, culture); + GenesisZeroFlow._GenesisZeroFlow.rTB_ZeroFlowCal.AppendText($"{Timestamp}\t{text}"); + GenesisZeroFlow._GenesisZeroFlow.rTB_ZeroFlowCal.ScrollToCaret(); + } + } + public static void AbortButtonEnabled(Boolean enabled) + { + if (GenesisZeroFlow._GenesisZeroFlow.InvokeRequired) + { + GenesisZeroFlow._GenesisZeroFlow.Invoke((Action)AbortButtonEnabled, enabled); + return; + } + + if (enabled) + GenesisZeroFlow._GenesisZeroFlow.btn_ZeroFlowCal_Abort.Enabled = true; + else + GenesisZeroFlow._GenesisZeroFlow.btn_ZeroFlowCal_Abort.Enabled = false; + + } + public static void EraseLogData(UInt16 meter) + { + if (GenesisZeroFlow._GenesisZeroFlow.InvokeRequired) + { + GenesisZeroFlow._GenesisZeroFlow.Invoke((Action)EraseLogData, meter); + return; + } + GenesisZeroFlow._GenesisZeroFlow.SetDataToLog(meter, String.Empty); + } + public static void EraseAmplitudeData(UInt16 meterNumber, UInt16 path) + { + if (GenesisZeroFlow._GenesisZeroFlow.InvokeRequired) + { + GenesisZeroFlow._GenesisZeroFlow.Invoke((Action)EraseAmplitudeData, meterNumber, path); + return; + } + + GenesisZeroFlow._GenesisZeroFlow.AmpValuesToLog[meterNumber][path] = String.Empty; + } + + + public static void StatusLabel(String debugMessage) + { + // Add line and scroll to caret + if (!String.IsNullOrEmpty(debugMessage)) + { + if (GenesisZeroFlow._GenesisZeroFlow.InvokeRequired) + { + GenesisZeroFlow._GenesisZeroFlow.Invoke((Action)StatusLabel, debugMessage); + return; + } + GenesisZeroFlow._GenesisZeroFlow.l_ZeroFlowCal_Status.Text = debugMessage; + } + } + public static Boolean[] WaitForEmptyPipeModeToLeave(Boolean[] enabled, CultureInfo culture) + { + #region Definitions and initializations + const Int32 WaitingTime = 60; + Int32 LocalNumberOfPaths = Constants.NumberOfPaths; + Boolean[] Ok = new Boolean[Constants.NumberOfMeters]; + Double[][] Error = new Double[Constants.NumberOfMeters][]; + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + { + Ok[Meter] = true; + Error[Meter] = new Double[LocalNumberOfPaths]; + for (UInt16 Path = 0; Path < LocalNumberOfPaths; Path++) + Error[Meter][Path] = DataError.NoError; + } + Boolean PerformWait = false; + #endregion + #region CA1062 + if (enabled == null) + { + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + Ok[Meter] = false; + return Ok; + } + #endregion + + for (Int32 i = WaitingTime; i >= 0; i--) + { + PerformWait = false; + + Display.StatusLabel($"{PredefinedMessages.WaitForEmptyPipe(culture)}{i.ToString(culture)}s"); + Misc.WaitNSeconds(1); + + #region Get error status + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + { + for(UInt16 Path = Constants.PATH0; Path < LocalNumberOfPaths; Path++) + Error[Meter][Path] = GenesisZeroFlow._GenesisZeroFlow.DecodedAllMeters[Meter][Path].Validation; + } + #endregion + #region Check if wait + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + { + if (enabled[Meter]) + { + for (UInt16 Path = Constants.PATH0; Path < LocalNumberOfPaths; Path++) + { + if (Error[Meter][Path] != DataError.NoError) + PerformWait = true; + } + } + } + #endregion + #region All OK + if (Boolean.Equals(PerformWait, false)) + { + Display.DebugMessage($"{Constants.TwentySpaces}\tDATA CHANNEL:\t\tLeave empty pipe mode\n", culture); + return Ok; + } + #endregion + } + #region Set OK + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + { + if (enabled[Meter]) + { + for (UInt16 Path = Constants.PATH0; Path < LocalNumberOfPaths; Path++) + { + if (Error[Meter][Path] != DataError.NoError) + Ok[Meter] = false; + } + if (Boolean.Equals(Ok[Meter], false)) + Display.DebugMessage($"{Constants.TwentySpaces}\tDATA CHANNEL:\t\tLeave empty pipe mode failed at METER{(Meter + 1).ToString(culture)}\n", culture); + } + } + + #endregion + return Ok; + } + public static void WaitForStabilization(Boolean[] ok, Int32 waitingTime, out Boolean aborted, CultureInfo culture) + { + + aborted = false; + #region CA1062 + if (ok == null) + return; + #endregion + + Boolean PerformWait = false; + + for (Int32 i = 0; i < ok.Count(); i++) + { + if (ok[i]) + PerformWait = true; + } + + if (PerformWait) + { + for (Int32 i = waitingTime; i >= 0; i--) + { + if (GenesisZeroFlow._GenesisZeroFlow.AbortIndicator) + { + aborted = true; + return; + } + Display.StatusLabel($"{PredefinedMessages.WaitForStabilization(culture)}{i.ToString(culture)}s"); + Misc.WaitNSeconds(1); + } + } + + } + public static Boolean[] GetSequenceResult(Boolean[] enabled, Boolean[] failed, String name, out Boolean stop, CultureInfo culture) + { + #region Definitions and initializations + stop = false; + Boolean[] AllOk = new Boolean[enabled.Count()]; + Boolean NoDeviceEnabled = true; + Boolean AtLeastOneMeterEnabled = false; + Boolean AtLeastOneThermometerEnabled = false; + Boolean AllDevicesFailed = true; + Boolean AllMetersOk = true; + Boolean AllThermometersFailed = true; + Boolean AllThermometersOk = true; + Boolean AllMetersFailed = true; + + String MeterSeqSucceeded = String.Empty; + String MeterSeqFailed = String.Empty; + String ThermoSeqSucceeded = String.Empty; + String ThermoSeqFailed = String.Empty; + + for (UInt16 i = 0; i < enabled.Count(); i++) + AllOk[i] = false; + #endregion + #region No device enabled + for (UInt16 i = 0; i < enabled.Count(); i++) + if (enabled[i]) + NoDeviceEnabled = false; + if(NoDeviceEnabled) + { + Display.DebugMessage($"{Constants.TwentySpaces}\tAPPLICATION:\t\t No device enabled\n", culture); + Display.DebugMessage($"{Constants.TwentySpaces}\tAPPLICATION:\t\t ZEROFLOW CALIBRATION sequence failed\n", culture); + Display.DebugMessage($"{Constants.TwentySpaces}\t{Debugmessages.Line}", culture); + + stop = true; + return AllOk; + } + + #endregion + #region At least one METER/ THERMOMETER enabled + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + if (enabled[Meter]) + AtLeastOneMeterEnabled = true; + for (UInt16 Thermometer = 0; Thermometer < Constants.NumberOfThermometers; Thermometer++) + if (enabled[Constants.NumberOfMeters + Thermometer]) + AtLeastOneThermometerEnabled = true; + #endregion + #region All Devices failed + if (AtLeastOneMeterEnabled | AtLeastOneThermometerEnabled) + { + //AllDevicesFailed = true; + for (UInt16 i = 0; i < enabled.Count(); i++) + if (enabled[i] & !failed[i]) + AllDevicesFailed = false; + + if (AllDevicesFailed) + { + #region All devices failed + stop = true; + Display.DebugMessage($"{Constants.TwentySpaces}\tAPPLICATION:\t\t {name} failed!\n", culture); + Display.DebugMessage($"{Constants.TwentySpaces}\tAPPLICATION:\t\t ZEROFLOW CALIBRATION sequence failed\n", culture); + Display.DebugMessage($"{Constants.TwentySpaces}\t{Debugmessages.Line}", culture); + MessageBox.Show(PredefinedMessages.ZeroflowOffsetTestFailed(culture), "Form closing", MessageBoxButtons.OK, MessageBoxIcon.Error); + + return AllOk; + #endregion + } + } + #endregion + #region Meter string + if (AtLeastOneMeterEnabled) + { + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + { + String MeterIndex = (Meter + 1).ToString(culture); + if(enabled[Meter] & !failed[Meter]) + { + if (Meter < enabled.Count() - Constants.NumberOfThermometers - 1) + MeterSeqSucceeded = $"{MeterSeqSucceeded}{Constants.Meter}{MeterIndex}; "; + else + MeterSeqSucceeded = $"{MeterSeqSucceeded}{Constants.Meter}{MeterIndex}"; + AllOk[Meter] = true; + } + if (enabled[Meter] & failed[Meter]) + { + if (Meter < enabled.Count() - Constants.NumberOfThermometers - 1) + MeterSeqFailed = $"{MeterSeqFailed}{Constants.Meter}{MeterIndex}; "; + else + MeterSeqFailed = $"{MeterSeqFailed}{Constants.Meter}{MeterIndex}"; + } + } + } + else + { + stop = true; + Display.DebugMessage($"{Constants.TwentySpaces}\tAPPLICATION:\t\t No METER enabled\n", culture); + Display.DebugMessage($"{Constants.TwentySpaces}\tAPPLICATION:\t\t ZEROFLOW CALIBRATION sequence failed\n", culture); + Display.DebugMessage($"{Constants.TwentySpaces}\t{Debugmessages.Line}", culture); + + return AllOk; + } + #endregion + #region Thermometer string + if (AtLeastOneThermometerEnabled) + { + for (UInt16 Thermometer = Constants.Thermo1; Thermometer < Constants.NumberOfThermometers; Thermometer++) + { + String ThermoIndex = (Thermometer + 1).ToString(culture); + if (enabled[Constants.NumberOfMeters + Thermometer] & !failed[Constants.NumberOfMeters + Thermometer]) + { + if (Thermometer < enabled.Count() - Constants.NumberOfMeters - Constants.NumberOfThermometers - 1) + ThermoSeqSucceeded = $"{ThermoSeqSucceeded}{Constants.Meter}{ThermoIndex}; "; + else + MeterSeqSucceeded = $"{ThermoSeqSucceeded}{Constants.Meter}{ThermoIndex}"; + AllOk[Constants.NumberOfMeters + Thermometer] = true; + } + if (enabled[Constants.NumberOfMeters + Thermometer] & failed[Constants.NumberOfMeters + Thermometer]) + { + if (Thermometer < enabled.Count() - Constants.NumberOfMeters - Constants.NumberOfThermometers - 1) + ThermoSeqFailed = $"{ThermoSeqFailed}{Constants.Thermo}{ThermoIndex}; "; + else + ThermoSeqFailed = $"{ThermoSeqFailed}{Constants.Thermo}{ThermoIndex}"; + } + } + } + #endregion + #region AllMetersOk/ Failed + for (UInt16 i = 0; i < Constants.NumberOfMeters; i++) + { + if (enabled[i] && failed[i]) + AllMetersOk = false; + if (enabled[i] && !failed[i]) + AllMetersFailed = false; + } + #endregion + #region AllThermometersMetersOk / failed + for (UInt16 i = 0; i < Constants.NumberOfThermometers; i++) + { + if (enabled[Constants.NumberOfMeters + i] && failed[Constants.NumberOfMeters + i]) + AllThermometersOk = false; + if (enabled[Constants.NumberOfMeters + i] && !failed[Constants.NumberOfMeters + i]) + AllThermometersFailed = false; + } + #endregion + #region Summary METER + if (AtLeastOneMeterEnabled) + { + #region All METERS FAILED + if (AllMetersFailed) + { + stop = true; + Display.DebugMessage($"{Constants.TwentySpaces}\tAPPLICATION:\t\t SUMMARY: \n", culture); + Display.DebugMessage($"{Constants.TwentySpaces}\tAPPLICATION:\t\t {name} failed at all METERS\n", culture); + Display.DebugMessage($"{Constants.TwentySpaces}\t{Debugmessages.Line}", culture); + } + #endregion + #region All METERS ok + if (AllMetersOk) + { + Display.DebugMessage($"{Constants.TwentySpaces}\tAPPLICATION:\t\t SUMMARY: \n", culture); + Display.DebugMessage($"{Constants.TwentySpaces}\tAPPLICATION:\t\t {name} successful at all {Constants.Meter}s\n", culture); + Display.DebugMessage($"{Constants.TwentySpaces}\t{Debugmessages.Line}", culture); + } + #endregion + if (!AllMetersOk && !AllMetersFailed) + { + if (AtLeastOneMeterEnabled) + { + Display.DebugMessage($"{Constants.TwentySpaces}\tAPPLICATION:\t\t SUMMARY: \n", culture); + if (String.IsNullOrEmpty(MeterSeqFailed)) + MeterSeqFailed = "None"; + Display.DebugMessage($"{Constants.TwentySpaces}\tAPPLICATION:\t\t {name} failed at {MeterSeqFailed}\n", culture); + if (String.IsNullOrEmpty(MeterSeqSucceeded)) + MeterSeqSucceeded = "None"; + Display.DebugMessage($"{Constants.TwentySpaces}\tAPPLICATION:\t\t {name} successful at {MeterSeqSucceeded}\n", culture); + Display.DebugMessage($"{Constants.TwentySpaces}\t{Debugmessages.Line}", culture); + } + } + } + + #endregion + #region Summary THERMOMETER + if (AtLeastOneThermometerEnabled) + { + if (AllThermometersFailed) + { + stop = true; + Display.DebugMessage($"{Constants.TwentySpaces}\tAPPLICATION:\t\t SUMMARY: \n", culture); + Display.DebugMessage($"{Constants.TwentySpaces}\tAPPLICATION:\t\t {name} failed at all THERMOMETERS\n", culture); + Display.DebugMessage($"{Constants.TwentySpaces}\t{Debugmessages.Line}", culture); + } + if (AllThermometersOk) + { + Display.DebugMessage($"{Constants.TwentySpaces}\tAPPLICATION:\t\t SUMMARY: \n", culture); + Display.DebugMessage($"{Constants.TwentySpaces}\tAPPLICATION:\t\t {name} successful at all THERMOMETERS\n", culture); + Display.DebugMessage($"{Constants.TwentySpaces}\t{Debugmessages.Line}", culture); + } + if (!AllThermometersOk && !AllThermometersFailed) + { + if (AtLeastOneThermometerEnabled) + { + Display.DebugMessage($"{Constants.TwentySpaces}\tAPPLICATION:\t\t SUMMARY: \n", culture); + if (String.IsNullOrEmpty(ThermoSeqFailed)) + ThermoSeqFailed = "None"; + Display.DebugMessage($"{Constants.TwentySpaces}\tAPPLICATION:\t\t {name} failed at {ThermoSeqFailed}\n", culture); + if (String.IsNullOrEmpty(ThermoSeqSucceeded)) + ThermoSeqSucceeded = "None"; + Display.DebugMessage($"{Constants.TwentySpaces}\tAPPLICATION:\t\t {name} successful at {ThermoSeqSucceeded}\n", culture); + Display.DebugMessage($"{Constants.TwentySpaces}\t{Debugmessages.Line}", culture); + } + } + } + + #endregion + if (stop) + { + Display.DebugMessage($"{Constants.TwentySpaces}\tAPPLICATION:\t\t {name} finished\n", culture); + Display.DebugMessage($"{Constants.TwentySpaces}\t{Debugmessages.Line}", culture); + Display.DebugMessage($"{Constants.TwentySpaces}\tAPPLICATION:\t\t ZEROFLOW CALIBRATION sequence failed\n", culture); + Display.DebugMessage($"{Constants.TwentySpaces}\t{Debugmessages.Line}", culture); + } + + return AllOk; + } + + public static void PictureBoxVisble(PictureBox pBBubbles1, Boolean b) + { + if (GenesisZeroFlow._GenesisZeroFlow.InvokeRequired) + { + GenesisZeroFlow._GenesisZeroFlow.Invoke((Action)PictureBoxVisble, pBBubbles1, b); + return; + } + + pBBubbles1.Enabled = b; + } + } + } +} \ No newline at end of file diff --git a/ZeroFlowTool/EmptyPipeCheck.cs b/ZeroFlowTool/EmptyPipeCheck.cs new file mode 100644 index 00000000..8b3b0dcf --- /dev/null +++ b/ZeroFlowTool/EmptyPipeCheck.cs @@ -0,0 +1,782 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Globalization; +using System.Threading; +using System.Threading.Tasks; +using GenesisDisplayTool; +using Xylem.Common.Hardware.WaterMeter.WaterMeterCore; + +namespace GenesisZeroFlow +{ + public static class EmptyPipeCheckSequences + { + //public static Boolean[] Total(Boolean[] enable, out Boolean aborted) + //{ + // #region Definitions and initializations + // const UInt16 WaitingTime = 60; + // CultureInfo Culture = GenesisZeroFlow._GenesisZeroFlow.GetGlobalCulture(); + // Boolean[] Aborted = new Boolean[Constants.NumberOfMeters]; + // Boolean[] TaskCompleted = new Boolean[Constants.NumberOfMeters]; + // Boolean[] SequenceFailed = new Boolean[Constants.NumberOfMeters]; + // aborted = false; + + // #region avoid CA1062 + // if (enable == null) + // { + // for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + // SequenceFailed[Meter] = true; + // return SequenceFailed; + // } + // #endregion + + // for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + // SequenceFailed[Meter] = false; + + // EmptyPipeCheck EmptyPipeCheck1 = new EmptyPipeCheck(); + // EmptyPipeCheck EmptyPipeCheck2 = new EmptyPipeCheck(); + // EmptyPipeCheck EmptyPipeCheck3 = new EmptyPipeCheck(); + // EmptyPipeCheck EmptyPipeCheck4 = new EmptyPipeCheck(); + // EmptyPipeCheck EmptyPipeCheck5 = new EmptyPipeCheck(); + // EmptyPipeCheck EmptyPipeCheck6 = new EmptyPipeCheck(); + // EmptyPipeCheck EmptyPipeCheck7 = new EmptyPipeCheck(); + // EmptyPipeCheck EmptyPipeCheck8 = new EmptyPipeCheck(); + // EmptyPipeCheck EmptyPipeCheck9 = new EmptyPipeCheck(); + // EmptyPipeCheck EmptyPipeCheck10 = new EmptyPipeCheck(); + + // EmptyPipeCheck1.Initialize(WaitingTime, Constants.Meter1, Culture); + // EmptyPipeCheck2.Initialize(WaitingTime, Constants.Meter2, Culture); + // EmptyPipeCheck3.Initialize(WaitingTime, Constants.Meter3, Culture); + // EmptyPipeCheck4.Initialize(WaitingTime, Constants.Meter4, Culture); + // EmptyPipeCheck5.Initialize(WaitingTime, Constants.Meter5, Culture); + // EmptyPipeCheck6.Initialize(WaitingTime, Constants.Meter6, Culture); + // EmptyPipeCheck7.Initialize(WaitingTime, Constants.Meter7, Culture); + // EmptyPipeCheck8.Initialize(WaitingTime, Constants.Meter8, Culture); + // EmptyPipeCheck9.Initialize(WaitingTime, Constants.Meter9, Culture); + // EmptyPipeCheck10.Initialize(WaitingTime, Constants.Meter10, Culture); + + // Task Task1 = new Task(() => { return true; }); + // Task Task2 = new Task(() => { return true; }); + // Task Task3 = new Task(() => { return true; }); + // Task Task4 = new Task(() => { return true; }); + // Task Task5 = new Task(() => { return true; }); + // Task Task6 = new Task(() => { return true; }); + // Task Task7 = new Task(() => { return true; }); + // Task Task8 = new Task(() => { return true; }); + // Task Task9 = new Task(() => { return true; }); + // Task Task10 = new Task(() => { return true; }); + // #endregion + + // using (CancellationTokenSource cancellationTokenSource = new CancellationTokenSource()) + // { + // CancellationToken token = cancellationTokenSource.Token; + // #region METER1 + // if (enable[Constants.Meter1]) + // { + // Task1 = Task.Run(() => + // { + // SequenceFailed[Constants.Meter1] = EmptyPipeCheck1.PerformTest(out Aborted[Constants.Meter1], token); + // return SequenceFailed[Constants.Meter1]; + // }); + // } + // #endregion + // #region METER2 + // if (enable[Constants.Meter2]) + // { + // Task2 = Task.Run(() => + // { + // SequenceFailed[Constants.Meter2] = EmptyPipeCheck2.PerformTest(out Aborted[Constants.Meter2], token); + // return SequenceFailed[Constants.Meter2]; + // }); + // } + // #endregion + // #region METER3 + // if (enable[Constants.Meter3]) + // { + // Task3 = Task.Run(() => + // { + // SequenceFailed[Constants.Meter3] = EmptyPipeCheck3.PerformTest(out Aborted[Constants.Meter3], token); + // return SequenceFailed[Constants.Meter3]; + // }); + // } + // #endregion + // #region METER4 + // if (enable[Constants.Meter4]) + // { + // Task4 = Task.Run(() => + // { + // SequenceFailed[Constants.Meter4] = EmptyPipeCheck4.PerformTest(out Aborted[Constants.Meter4], token); + // return SequenceFailed[Constants.Meter4]; + // }); + // } + // #endregion + // #region METER5 + // if (enable[Constants.Meter5]) + // { + // Task5 = Task.Run(() => + // { + // SequenceFailed[Constants.Meter5] = EmptyPipeCheck5.PerformTest(out Aborted[Constants.Meter5], token); + // return SequenceFailed[Constants.Meter5]; + // }); + // } + // #endregion + // #region METER6 + // if (enable[Constants.Meter6]) + // { + // Task6 = Task.Run(() => + // { + // SequenceFailed[Constants.Meter6] = EmptyPipeCheck6.PerformTest(out Aborted[Constants.Meter6], token); + // return SequenceFailed[Constants.Meter6]; + // }); + // } + // #endregion + // #region METER7 + // if (enable[Constants.Meter7]) + // { + // Task7 = Task.Run(() => + // { + // SequenceFailed[Constants.Meter7] = EmptyPipeCheck7.PerformTest(out Aborted[Constants.Meter7], token); + // return SequenceFailed[Constants.Meter7]; + // }); + // } + // #endregion + // #region METER8 + // if (enable[Constants.Meter8]) + // { + // Task8 = Task.Run(() => + // { + // SequenceFailed[Constants.Meter8] = EmptyPipeCheck8.PerformTest(out Aborted[Constants.Meter8], token); + // return SequenceFailed[Constants.Meter8]; + // }); + // } + // #endregion + // #region METER9 + // if (enable[Constants.Meter9]) + // { + // Task9 = Task.Run(() => + // { + // SequenceFailed[Constants.Meter9] = EmptyPipeCheck9.PerformTest(out Aborted[Constants.Meter9], token); + // return SequenceFailed[Constants.Meter9]; + // }); + // } + // #endregion + // #region METER10 + // if (enable[Constants.Meter10]) + // { + // Task10 = Task.Run(() => + // { + // SequenceFailed[Constants.Meter10] = EmptyPipeCheck10.PerformTest(out Aborted[Constants.Meter10], token); + // return SequenceFailed[Constants.Meter10]; + // }); + // } + // #endregion + // #region Wait for tasks + // GenesisZeroFlow.Display.ShowResultStatus("Task started = ", enable); + // Boolean[] SequenceOk = new Boolean[Constants.NumberOfMeters]; + + // for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + // SequenceOk[Meter] = false; + + // while (!CheckArray(enable, TaskCompleted)) + // { + // if (GenesisZeroFlow._GenesisZeroFlow.AbortIndicator) + // { + // cancellationTokenSource.Cancel(); + // aborted = true; + // GenesisZeroFlow.Display.DebugCrcIndicatorVisible(false); + // } + + // TaskCompleted[Constants.Meter1] = TaskOperations.WaitFor(enable[Constants.Meter1], Task1); + // TaskCompleted[Constants.Meter2] = TaskOperations.WaitFor(enable[Constants.Meter2], Task2); + // TaskCompleted[Constants.Meter3] = TaskOperations.WaitFor(enable[Constants.Meter3], Task3); + // TaskCompleted[Constants.Meter4] = TaskOperations.WaitFor(enable[Constants.Meter4], Task4); + // TaskCompleted[Constants.Meter5] = TaskOperations.WaitFor(enable[Constants.Meter5], Task5); + // TaskCompleted[Constants.Meter6] = TaskOperations.WaitFor(enable[Constants.Meter6], Task6); + // TaskCompleted[Constants.Meter7] = TaskOperations.WaitFor(enable[Constants.Meter7], Task7); + // TaskCompleted[Constants.Meter8] = TaskOperations.WaitFor(enable[Constants.Meter8], Task8); + // TaskCompleted[Constants.Meter9] = TaskOperations.WaitFor(enable[Constants.Meter9], Task9); + // TaskCompleted[Constants.Meter10] = TaskOperations.WaitFor(enable[Constants.Meter10], Task10); + // Misc.WaitNSeconds(1); + + // SequenceFailed = TaskOperations.GetResultTotal(enable, Task1, Task2, Task3, Task4, Task5, Task6, Task7, Task8, Task8, Task10); + // for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + // SequenceOk[Meter] = !SequenceFailed[Meter]; + // GenesisZeroFlow.Display.MeterStatusGreenRed(SequenceOk, enable); + // } + // GenesisZeroFlow.Display.ShowResultStatus("Sequence OK (while loop) = ", SequenceOk); + // SequenceFailed = TaskOperations.GetResultTotal(enable, Task1, Task2, Task3, Task4, Task5, Task6, Task7, Task8, Task8, Task10); + // for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + // SequenceOk[Meter] = !SequenceFailed[Meter]; + // GenesisZeroFlow.Display.MeterStatusGreenRed(SequenceOk, enable); + // // GenesisZeroFlow.Display.ShowResultStatus("Sequence failed (not while loop) = ", TaskFailed); + // // GenesisZeroFlow.Display.ShowResultStatus("Task Completed = ", TaskCompleted); + // // GenesisZeroFlow.Display.ShowResultStatus("Amplitude total failed: ", TaskFailed); + // #endregion + // #region Destroy tasks + // TaskOperations.CheckAndDispose(ref Task1); + // TaskOperations.CheckAndDispose(ref Task2); + // TaskOperations.CheckAndDispose(ref Task3); + // TaskOperations.CheckAndDispose(ref Task4); + // TaskOperations.CheckAndDispose(ref Task5); + // TaskOperations.CheckAndDispose(ref Task6); + // TaskOperations.CheckAndDispose(ref Task7); + // TaskOperations.CheckAndDispose(ref Task8); + // TaskOperations.CheckAndDispose(ref Task9); + // TaskOperations.CheckAndDispose(ref Task10); + // #endregion + // #region Clear data + // for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + // GenesisZeroFlow._GenesisZeroFlow.SetDataToLog(Meter, String.Empty); + // #endregion + // } + // return SequenceFailed; + //} + public static Boolean[] Total(Boolean[] allEnable, out Boolean aborted, MeterBatch globalMeterBatch, MeterBatch thermoMeterBatch, CultureInfo culture) + { + #region Definitions and initializations + const UInt16 WaitingTime = 60; + Boolean[] Aborted = new Boolean[Constants.NumberOfMeters]; + Boolean[] MeterTaskCompleted = new Boolean[Constants.NumberOfMeters]; + Boolean[] MeterSequenceFailed = new Boolean[Constants.NumberOfMeters]; + MeterSequenceFailed = ArrayInit.Meter(false); + Boolean[] ThermoAborted = new Boolean[Constants.NumberOfThermometers]; + Boolean[] ThermoTaskCompleted = new Boolean[Constants.NumberOfThermometers]; + Boolean[] ThermoSequenceFailed = new Boolean[Constants.NumberOfThermometers]; + ThermoSequenceFailed = ArrayInit.Thermo(false); + Boolean[] MeterEnable = Misc.Subarray(allEnable, 0, Constants.NumberOfMeters); + Boolean[] ThermoEnable = Misc.Subarray(allEnable, Constants.NumberOfMeters, Constants.NumberOfThermometers); + aborted = false; + + #region avoid CA1062 + if (allEnable == null) + { + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + MeterSequenceFailed[Meter] = true; + for (UInt16 Thermo = Constants.Thermo1; Thermo < Constants.NumberOfThermometers; Thermo++) + ThermoSequenceFailed[Thermo] = true; + return MeterSequenceFailed.Concat(ThermoSequenceFailed).ToArray(); + } + #endregion + + List EmptyPipeChecks = new List(); + List ThermoEmptyPipeChecks = new List(); + + #region METER + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + { + var currentMeter = globalMeterBatch.ListOfMeters.FirstOrDefault(m => m.Slot.Equals(Meter + 1)); + + if (currentMeter != null) + EmptyPipeChecks.Add(new EmptyPipeCheck(currentMeter, Meter, culture)); + else + EmptyPipeChecks.Add(new EmptyPipeCheck(Meter, culture)); + } + #endregion + #region THERMOMETER + for (UInt16 Thermo = Constants.Thermo1; Thermo < Constants.NumberOfThermometers; Thermo++) + { + var currentMeter = thermoMeterBatch.ListOfMeters.FirstOrDefault(m => m.Slot.Equals(Thermo + 11)); + + if (currentMeter != null) + ThermoEmptyPipeChecks.Add(new EmptyPipeCheck(currentMeter, Thermo, culture)); + else + ThermoEmptyPipeChecks.Add(new EmptyPipeCheck(Thermo, culture)); + } + #endregion + + foreach (var check in EmptyPipeChecks) + { + check.AddTask(new Task(() => { return true; })); + check.Initialize(GenesisZeroFlow._GenesisZeroFlow.PcbID[check.MeterNumber], Constants.Meter, WaitingTime); + } + + foreach (var tempcheck in ThermoEmptyPipeChecks) + { + tempcheck.AddTask(new Task(() => { return true; })); + tempcheck.Initialize(GenesisZeroFlow._GenesisZeroFlow.ThermoID[tempcheck.MeterNumber], Constants.Thermo, WaitingTime); + } + #endregion + + using (CancellationTokenSource cancellationTokenSource = new CancellationTokenSource()) + { + CancellationToken token = cancellationTokenSource.Token; + + foreach (var metercheck in EmptyPipeChecks) + { + if (metercheck.CurrentMeter != null && MeterEnable[metercheck.CurrentMeter.Slot - 1]) + { + metercheck.MyTask = Task.Run(() => + { + MeterSequenceFailed[metercheck.CurrentMeter.Slot - 1] = metercheck.PerformTest(out Aborted[metercheck.CurrentMeter.Slot - 1], token); + return MeterSequenceFailed[metercheck.CurrentMeter.Slot - 1]; + }); + } + } + foreach (var tempcheck in ThermoEmptyPipeChecks) + { + if (tempcheck.CurrentMeter != null && ThermoEnable[tempcheck.CurrentMeter.Slot - 11]) + { + tempcheck.MyTask = Task.Run(() => + { + ThermoSequenceFailed[tempcheck.CurrentMeter.Slot - 11] = tempcheck.PerformTest(out ThermoAborted[tempcheck.CurrentMeter.Slot - 11], token); + return ThermoSequenceFailed[tempcheck.CurrentMeter.Slot - 11]; + }); + } + } + + #region Wait for tasks + Boolean[] MeterSequenceOk = new Boolean[Constants.NumberOfMeters]; + MeterSequenceOk = ArrayInit.Meter(false); + Boolean[] ThermoSequenceOk = new Boolean[Constants.NumberOfThermometers]; + ThermoSequenceOk = ArrayInit.Thermo(false); + + while (!CheckArray(allEnable, MeterTaskCompleted.Concat(ThermoTaskCompleted).ToArray())) + { + if (GenesisZeroFlow._GenesisZeroFlow.AbortIndicator) + { + cancellationTokenSource.Cancel(); + aborted = true; + } + foreach (var waitTask in EmptyPipeChecks) + MeterTaskCompleted[waitTask.MeterNumber] = TaskOperations.WaitFor(MeterEnable[waitTask.MeterNumber], waitTask.MyTask); + foreach (var waitTask in ThermoEmptyPipeChecks) + ThermoTaskCompleted[waitTask.MeterNumber] = TaskOperations.WaitFor(ThermoEnable[waitTask.MeterNumber], waitTask.MyTask); + + Misc.WaitNSeconds(1); + + foreach (var waitTask in EmptyPipeChecks) + MeterTaskCompleted[waitTask.MeterNumber] = TaskOperations.WaitFor(MeterEnable[waitTask.MeterNumber], waitTask.MyTask); + foreach (var waitTask in ThermoEmptyPipeChecks) + ThermoTaskCompleted[waitTask.MeterNumber] = TaskOperations.WaitFor(ThermoEnable[waitTask.MeterNumber], waitTask.MyTask); + + foreach (var ResultTask in EmptyPipeChecks) + MeterSequenceFailed[ResultTask.MeterNumber] = TaskOperations.GetResult(MeterEnable[ResultTask.MeterNumber], ResultTask.MyTask); + foreach (var ResultTask in ThermoEmptyPipeChecks) + ThermoSequenceFailed[ResultTask.MeterNumber] = TaskOperations.GetResult(ThermoEnable[ResultTask.MeterNumber], ResultTask.MyTask); + + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + MeterSequenceOk[Meter] = !MeterSequenceFailed[Meter]; + for (UInt16 Thermo = Constants.Thermo1; Thermo < Constants.NumberOfThermometers; Thermo++) + ThermoSequenceOk[Thermo] = !ThermoSequenceFailed[Thermo]; + + GenesisZeroFlow.Display.MeterStatusGreenRed(MeterSequenceOk, MeterEnable); + GenesisZeroFlow.Display.ThermoStatusGreenRed(ThermoSequenceOk, ThermoEnable); + } + + foreach (var ResultTask in EmptyPipeChecks) + MeterSequenceFailed[ResultTask.MeterNumber] = TaskOperations.GetResult(MeterEnable[ResultTask.MeterNumber], ResultTask.MyTask); + foreach (var ResultTask in ThermoEmptyPipeChecks) + ThermoSequenceFailed[ResultTask.MeterNumber] = TaskOperations.GetResult(ThermoEnable[ResultTask.MeterNumber], ResultTask.MyTask); + + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + MeterSequenceOk[Meter] = !MeterSequenceFailed[Meter]; + for (UInt16 Thermo = Constants.Thermo1; Thermo < Constants.NumberOfThermometers; Thermo++) + ThermoSequenceOk[Thermo] = !ThermoSequenceFailed[Thermo]; + GenesisZeroFlow.Display.MeterStatusGreenRed(MeterSequenceOk, MeterEnable); + GenesisZeroFlow.Display.ThermoStatusGreenRed(ThermoSequenceOk, ThermoEnable); + #endregion + #region Destroy tasks + foreach (var TaskToDispose in EmptyPipeChecks) + TaskOperations.CheckAndDispose(ref TaskToDispose.MyTask); + foreach (var TaskToDispose in ThermoEmptyPipeChecks) + TaskOperations.CheckAndDispose(ref TaskToDispose.MyTask); + #endregion + #region Clear data + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + GenesisZeroFlow._GenesisZeroFlow.SetDataToLog(Meter, String.Empty); + #endregion + } + return MeterSequenceFailed.Concat(ThermoSequenceFailed).ToArray(); + } + public static Boolean TotalTempCal(Boolean enable, MeterBatch globalMeterBatch, CultureInfo culture) + { + #region Definitions and initializations + const UInt16 WaitingTime = 60; + Boolean TaskCompleted = false; + Boolean SequenceFailed = false; + List EmptyPipeChecks = new List(); + + var currentMeter = globalMeterBatch.ListOfMeters.FirstOrDefault(m => m.Slot.Equals(Constants.Meter1 + 1)); + if (currentMeter != null) + EmptyPipeChecks.Add(new EmptyPipeCheck(currentMeter, Constants.Meter1, culture)); + else + EmptyPipeChecks.Add(new EmptyPipeCheck(Constants.Meter1, culture)); + + foreach (var check in EmptyPipeChecks) + { + check.AddTask(new Task(() => { return true; })); + check.Initialize(String.Empty, Constants.Meter, WaitingTime); + } + #endregion + + using (CancellationTokenSource cancellationTokenSource = new CancellationTokenSource()) + { + CancellationToken token = cancellationTokenSource.Token; + foreach (var check in EmptyPipeChecks) + { + if (check.CurrentMeter != null && enable) + { + check.MyTask = Task.Run(() => + { + SequenceFailed = check.PerformTestTempCal(); + return SequenceFailed; + }); + } + } + #region Wait for tasks + Boolean SequenceOk = false; + + while (!Check(enable, TaskCompleted)) + { + + foreach (var waitTask in EmptyPipeChecks) + TaskCompleted = TaskOperations.WaitFor(enable, waitTask.MyTask); + + Misc.WaitNSeconds(1); + + foreach (var waitTask in EmptyPipeChecks) + { + if (waitTask.CurrentMeter != null) + { + //waitTask.CurrentMeter.StartRecordData(); + } + TaskCompleted = TaskOperations.WaitFor(enable, waitTask.MyTask); + } + + + foreach (var ResultTask in EmptyPipeChecks) + SequenceFailed = TaskOperations.GetResult(enable, ResultTask.MyTask); + + SequenceOk = !SequenceFailed; + frmTempCalibration.DisplayTempCal.MeterStatusGreenRed(SequenceOk, enable); + } + + foreach (var ResultTask in EmptyPipeChecks) + SequenceFailed = TaskOperations.GetResult(enable, ResultTask.MyTask); + + SequenceOk = !SequenceFailed; + frmTempCalibration.DisplayTempCal.MeterStatusGreenRed(SequenceOk, enable); + #endregion + #region Destroy tasks + foreach (var TaskToDispose in EmptyPipeChecks) + TaskOperations.CheckAndDispose(ref TaskToDispose.MyTask); + #endregion + #region Clear data + //for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + // GenesisZeroFlow._GenesisZeroFlow.SetDataToLog(Meter, String.Empty); + #endregion + } + return SequenceFailed; + } + private static Boolean CheckArray(Boolean[] enable, Boolean[] array) + { + Boolean Completed = true; + + for (Int32 i = 0; i < enable.Count(); i++) + { + if ((Boolean.Equals(array[i], false)) && (Boolean.Equals(enable[i], true))) + return false; + } + + return Completed; + } + + private static Boolean Check(Boolean enable, Boolean array) + { + Boolean Completed = true; + + if ((Boolean.Equals(array, false)) && (Boolean.Equals(enable, true))) + return false; + + return Completed; + } + } + public class EmptyPipeCheck + { + public ZeroFlowGenesisMeter CurrentMeter; + public UInt16 MeterNumber { get; set; } + public String MeterIndex { get; set; } + public EmptyPipeCheck(UInt16 meterNumber, CultureInfo culture) + { + this.MeterNumber = meterNumber; + this.Culture = culture; + this.MeterIndex = (meterNumber + 1).ToString(culture); + } + public EmptyPipeCheck(IMeter currentMeter, UInt16 meterNumber, CultureInfo culture) + { + if (currentMeter is ZeroFlowGenesisMeter) + { + this.CurrentMeter = (ZeroFlowGenesisMeter)currentMeter; + } + this.MeterNumber = meterNumber; + this.Culture = culture; + this.MeterIndex = (meterNumber + 1).ToString(culture); + } + + String PcbID { get; set; } + private String Metertype { get; set; } + private UInt16 WaitingTime { get; set; } + private CultureInfo Culture { get; set; } + public void Initialize(String pcbID, String meterType, UInt16 waitingTime) + { + this.WaitingTime = waitingTime; + this.Metertype = meterType; + this.PcbID = pcbID; + } + public Boolean PerformTest(out Boolean aborted, CancellationToken token) + { + #region Definitions and initialization + Boolean SequenceFailed = false; + Boolean PerformWait = false; + Double[] Error = new Double[Constants.NumberOfPaths]; + Error = ArrayInit.Path((Double)0.00); + Int32 Countup = 0; + Int32[] LinecounterFollowing = new Int32[Constants.NumberOfPaths]; + LinecounterFollowing = ArrayInit.Path(0); + aborted = false; + Boolean ActivityOk = false; + #endregion + #region Reset counter for activity check/ switch on counting + if (String.Equals(this.Metertype, Constants.Meter)) + { + for(UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + GenesisZeroFlow._GenesisZeroFlow.SetLineCounterEmptyPipeTest(0, this.MeterNumber, Path); + GenesisZeroFlow._GenesisZeroFlow.SetLoggingIndicatorEmptyPipeTest(this.MeterNumber, true); + } + else + { + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + GenesisZeroFlow._GenesisZeroFlow.SetLineCounterThermoEmptyPipeTest(0, this.MeterNumber, Path); + GenesisZeroFlow._GenesisZeroFlow.SetLoggingIndicatorThermoEmptyPipeTest(this.MeterNumber, true); + } + #endregion + #region Cancel + if (token.IsCancellationRequested) + return true; + #endregion + #region Testsequence + for (Int32 Countdown = WaitingTime; Countdown >= 0; Countdown--) + { + if (Int32.Equals(Countup, 0)) + PerformWait = true; + else + PerformWait = false; + #region Abort + if (GenesisZeroFlow._GenesisZeroFlow.AbortIndicator) + { + aborted = true; + return true; // all enabled meters get sequence failed + } + #endregion + #region Activity check + String Resttime = Countdown.ToString(this.Culture); + GenesisZeroFlow.Display.StatusLabel($"{GenesisZeroFlow.PredefinedMessages.WaitForEmptyPipe(this.Culture)} {Resttime}s"); + if (String.Equals(this.Metertype, Constants.Meter)) + ActivityOk = this.ActivityCheck(ref LinecounterFollowing, Countup); + else + ActivityOk = this.ThermoActivityCheck(ref LinecounterFollowing, Countup); + if (token.IsCancellationRequested) + return true; + #endregion + #region Time control + Misc.WaitNSeconds(1); + Countup++; + #endregion + #region Get error status + if (String.Equals(this.Metertype, Constants.Meter)) + { + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + Error[Constants.PATH0] = GenesisZeroFlow._GenesisZeroFlow.GetDecodedAllMeters()[this.MeterNumber][Path].Validation; + } + else + { + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + Error[Constants.PATH0] = GenesisZeroFlow._GenesisZeroFlow.GetDecodedAllThermometers()[this.MeterNumber][Path].Validation; + } + #endregion + #region Check if wait + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + if ((!(Double.Equals(Error[Path], (Double)DataError.NoError))) || (!ActivityOk)) + PerformWait = true; + } + #endregion + #region All OK + if (Boolean.Equals(PerformWait, false)) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t Leave EMPTY PIPE mode at {this.Metertype}{this.MeterIndex}\n", this.Culture); + return false; + } + #endregion + } + #endregion + #region Failed + SequenceFailed = true; + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t Leave EMPTY PIPE mode failed at {this.Metertype}{this.MeterIndex}\n", this.Culture); + if (this.Metertype == Constants.Meter) + GenesisZeroFlow._GenesisZeroFlow.GenerateReturnNote($"{this.MeterIndex}", this.PcbID, GenesisZeroFlow.PredefinedMessages.EmptyPipeFailed(this.Culture), GenesisZeroFlow._GenesisZeroFlow.GetLoggingFromTextBox(), this.Culture); + #endregion + #region Switch off counting + if (String.Equals(this.Metertype, Constants.Meter)) + GenesisZeroFlow._GenesisZeroFlow.SetLoggingIndicatorEmptyPipeTest(this.MeterNumber, false); + else + GenesisZeroFlow._GenesisZeroFlow.SetLoggingIndicatorThermoEmptyPipeTest(this.MeterNumber, false); + #endregion + + return SequenceFailed; + } + + public Boolean PerformTestTempCal() + { + #region Definitions and initialization + Boolean SequenceFailed = false; + Boolean PerformWait = false; + Double[] Error = new Double[Constants.NumberOfPaths]; + Error = ArrayInit.Path(0.00); + Int32 Countup = 0; + Int32[] LinecounterFollowing = new Int32[Constants.NumberOfPaths]; + LinecounterFollowing = ArrayInit.Path((Int32)0); + Boolean ActivityOk = false; + String MeterIndex = (this.MeterNumber + 1).ToString(this.Culture); + #endregion + #region Reset counter for activity check/ switch on counting + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + frmTempCalibration._frmTempCalibration.SetLineCounterEmptyPipeTest(0, Path); + frmTempCalibration._frmTempCalibration.SetEnableIndicatorEmptyPipeTest(true); + #endregion + #region Testsequence + for (Int32 Countdown = WaitingTime; Countdown >= 0; Countdown--) + { + if (Int32.Equals(Countup, 0)) + PerformWait = true; + else + PerformWait = false; + #region Abort + #endregion + #region Activity check + frmTempCalibration.DisplayTempCal.StatusLabel($"Wait for leaving EMPTY PIPE mode: {Countdown.ToString(this.Culture)}s"); + ActivityOk = this.ActivityCheckTempCal(ref LinecounterFollowing, Countup); + #endregion + #region Time control + Misc.WaitNSeconds(1); + Countup++; + #endregion + #region Get error status + for(UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + if (frmTempCalibration._frmTempCalibration.GetDecodedAllMeters()[Path] != null) + Error[Path] = frmTempCalibration._frmTempCalibration.GetDecodedAllMeters()[Path].Validation; + #endregion + #region Check if wait + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + if ((!Double.Equals(Error[Path], (Double)DataError.NoError)) || (!ActivityOk)) + PerformWait = true; + } + #endregion + #region All OK + if (Boolean.Equals(PerformWait, false)) + { + frmTempCalibration.DisplayTempCal.DebugMessage($"DATA CHANNEL:\t\t Leave EMPTY PIPE mode\n", this.Culture); + frmTempCalibration.DisplayTempCal.DebugMessage(Debugmessages.Line, this.Culture); + return false; + } + #endregion + } + #endregion + #region Failed + SequenceFailed = true; + frmTempCalibration.DisplayTempCal.DebugMessage($"DATA CHANNEL:\t\t Leave EMPTY PIPE mode failed\n", this.Culture); + frmTempCalibration.DisplayTempCal.DebugMessage($"{Debugmessages.Line}", this.Culture); + #endregion + #region Switch off counting + frmTempCalibration._frmTempCalibration.SetEnableIndicatorEmptyPipeTest(false); + #endregion + + return SequenceFailed; + } + private Boolean ActivityCheck(ref Int32[] lineCounterFollowing, Int32 seconds) + { + #region Definitions and initializations + Boolean Ok = true; + Boolean Error = false; + #endregion + #region Check activity + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + if (GenesisZeroFlow._GenesisZeroFlow.GetLineCounterEmptyPipeTest()[this.MeterNumber][Path] != 0) + { + if (Int32.Equals(GenesisZeroFlow._GenesisZeroFlow.GetLineCounterEmptyPipeTest()[this.MeterNumber][Path], lineCounterFollowing[Path])) + return false; + else + lineCounterFollowing[Path] = GenesisZeroFlow._GenesisZeroFlow.GetLineCounterEmptyPipeTest()[this.MeterNumber][Path]; + } + if ((seconds > 0) && (Int32.Equals(GenesisZeroFlow._GenesisZeroFlow.GetLineCounterEmptyPipeTest()[this.MeterNumber][Path], 0))) + return false; + + } + #endregion + #region Result + Ok = !Error; + #endregion + + return Ok; + } + private Boolean ThermoActivityCheck(ref Int32[] lineCounterFollowing, Int32 seconds) + { + #region Definitions and initializations + Boolean Ok = true; + Boolean Error = false; + #endregion + #region Check activity + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + if (GenesisZeroFlow._GenesisZeroFlow.GetLineCounterThermoEmptyPipeTest()[this.MeterNumber][Path] != 0) + { + if (Int32.Equals(GenesisZeroFlow._GenesisZeroFlow.GetLineCounterThermoEmptyPipeTest()[this.MeterNumber][Path], lineCounterFollowing[Path])) + return false; + else + lineCounterFollowing[Path] = GenesisZeroFlow._GenesisZeroFlow.GetLineCounterThermoEmptyPipeTest()[this.MeterNumber][Path]; + } + if ((seconds > 0) && (Int32.Equals(GenesisZeroFlow._GenesisZeroFlow.GetLineCounterThermoEmptyPipeTest()[this.MeterNumber][Path], 0))) + return false; + } + #endregion + #region Result + Ok = !Error; + #endregion + + return Ok; + } + private Boolean ActivityCheckTempCal(ref Int32[] lineCounterFollowing, Int32 seconds) + { + #region Definitions and initializations + Boolean Ok = true; + Boolean Error = false; + #endregion + #region Check activity + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + if (frmTempCalibration._frmTempCalibration.GetLineCounterEmptyPipeTest()[Path] != 0) + { + if (frmTempCalibration._frmTempCalibration.GetLineCounterEmptyPipeTest()[Path] == lineCounterFollowing[Path]) + return false; + else + lineCounterFollowing[Path] = frmTempCalibration._frmTempCalibration.GetLineCounterEmptyPipeTest()[Path]; + } + if ((seconds > 0) && (frmTempCalibration._frmTempCalibration.GetLineCounterEmptyPipeTest()[Path] == 0)) + return false; + } + #endregion + #region Result + Ok = !Error; + #endregion + + return Ok; + } + public Task MyTask; + internal void AddTask(Task task) + { + MyTask = task; + } + } +} \ No newline at end of file diff --git a/ZeroFlowTool/ErrorImage.gif b/ZeroFlowTool/ErrorImage.gif new file mode 100644 index 00000000..ffcce0f8 Binary files /dev/null and b/ZeroFlowTool/ErrorImage.gif differ diff --git a/ZeroFlowTool/ErrorImage.pdf b/ZeroFlowTool/ErrorImage.pdf new file mode 100644 index 00000000..08f1f777 Binary files /dev/null and b/ZeroFlowTool/ErrorImage.pdf differ diff --git a/ZeroFlowTool/ErrorLog.cs b/ZeroFlowTool/ErrorLog.cs new file mode 100644 index 00000000..5d56b4c3 --- /dev/null +++ b/ZeroFlowTool/ErrorLog.cs @@ -0,0 +1,52 @@ +using System; +using System.IO; +using System.Globalization; + + + +namespace GenesisZeroFlow +{ + public static partial class ErrorLog + { + + public static void Log(String reason, String description, String parameter1, String parameter2, CultureInfo culture) + { + #region Definitions and initializations + String userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name; + String WriteToErrFile = $"{DateTime.Now.ToString(Formats.ErrorLogString, culture)}{userName};{reason};{description};{parameter1};{parameter2}"; + #endregion + + #region Write settings to file + try + { + using (StreamWriter sw0 = File.AppendText(@"..\ErrorLog.txt")) + sw0.WriteLine(WriteToErrFile); + } + catch + { + // MessageBox.Show("Error parameters could not be written to file", "Form closing", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + #endregion + } + + public static void Write(String reason, CultureInfo culture) + { + #region Definitions and initializations + String WriteToErrFile = $"{DateTime.Now.ToString("mm:ss:fff", culture)}{reason}"; + #endregion + #region Write settings to file + try + { + using (StreamWriter sw0 = File.AppendText(@"..\Write.txt")) + sw0.WriteLine(WriteToErrFile); + } + catch + { + // MessageBox.Show("Error parameters could not be written to file", "Form closing", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + #endregion + } + + + } +} \ No newline at end of file diff --git a/ZeroFlowTool/ErrorLog.txt b/ZeroFlowTool/ErrorLog.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/ZeroFlowTool/ErrorLog.txt @@ -0,0 +1 @@ + diff --git a/ZeroFlowTool/Files.cs b/ZeroFlowTool/Files.cs new file mode 100644 index 00000000..9162c654 --- /dev/null +++ b/ZeroFlowTool/Files.cs @@ -0,0 +1,170 @@ + +using System; +using System.Globalization; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.IO; +using PdfSharp.Pdf; + +namespace GenesisZeroFlow +{ + public static class Files + { + + + #region Open files/ save to file + public static Boolean SavePdf(PdfDocument document, String fullpath, CultureInfo culture) + { + Boolean SavingOK = false; + try + { + Task.Run(() => + { + document.Save(@fullpath); + System.Diagnostics.Process.Start(@fullpath); + }); + SavingOK = true; + } + catch (Exception ex) + { + ErrorLog.Log(LogErrReason.Exeption, "Files.SavePdf() failed", $"0x{ex.HResult.ToString("X", culture)}", String.Empty, culture); + } + + return SavingOK; + } + #endregion + #region File dialogs + public static Boolean SaveFiledialogPdf(out String fullpath, String initialDirectory, out String timeForHeader, CultureInfo culture) + { + #region Definitions and initializations + String FullFilename = String.Empty; + Boolean DialogOk = false; + var time = DateTime.Now; + String TimeForFilename = time.ToString(Formats.LogFileDateTimeString, culture); + timeForHeader = time.ToString(Formats.HeaderFileDateTimeString, culture); + fullpath = String.Empty; + #endregion + #region Everything else + try + { + #region Set Filename + FullFilename = $"GenesisZeroFlow_EventLogging_{TimeForFilename}.pdf"; + #endregion + #region SaveFileDialog + using (SaveFileDialog saveFileDialog1 = new SaveFileDialog()) + { + saveFileDialog1.Filter = "document (*.pdf)|*.pdf"; + saveFileDialog1.FilterIndex = 2; + saveFileDialog1.RestoreDirectory = true; + saveFileDialog1.FileName = FullFilename; + if (Directory.Exists(initialDirectory)) + saveFileDialog1.InitialDirectory = initialDirectory; + #region Save to file + if (DialogResult.Equals(saveFileDialog1.ShowDialog(), DialogResult.OK)) + { + DialogOk = true; + fullpath = Path.GetFullPath(saveFileDialog1.FileName); + } + #endregion + } + #endregion + } + catch (Exception ex) + { + ErrorLog.Log(LogErrReason.Exeption, "Files.SaveFiledialogPdf() failed", $"0x{ex.HResult.ToString("X", culture)}", String.Empty, culture); + } + #endregion + + return DialogOk; + } + + public static Boolean SaveFiledialogTxt(out String fullPath, String initialDirectory, out String timeForHeader, CultureInfo culture) + { + #region Definitions and initializations + fullPath = String.Empty; + Boolean DialogOk = false; + DateTime time = new DateTime(); + time = DateTime.Now; + String TimeForFilename = time.ToString(Formats.LogFileDateTimeString, culture); + timeForHeader = time.ToString(Formats.RawDataDateTimeLogString, culture); + #endregion + #region Everything else + try + { + #region Set Filename + String FullFilename = $"GenesisZeroFlow_EventLog_{TimeForFilename}.txt"; + #endregion + #region SaveFileDialog + using (SaveFileDialog saveFileDialog1 = new SaveFileDialog()) + { + saveFileDialog1.Filter = "text files (*.txt)|*.txt"; + saveFileDialog1.FilterIndex = 2; + saveFileDialog1.RestoreDirectory = true; + saveFileDialog1.FileName = FullFilename; + if (Directory.Exists(initialDirectory)) + saveFileDialog1.InitialDirectory = initialDirectory; + #region Save to file + if (saveFileDialog1.ShowDialog() == DialogResult.OK) + { + DialogOk = true; + fullPath = Path.GetFullPath(saveFileDialog1.FileName); + } + #endregion + } + #endregion + } + catch (Exception ex) + { + ErrorLog.Log(LogErrReason.Exeption, "Files.SaveFiledialogTxt() failed", $"0x{ex.HResult.ToString("X", culture)}", String.Empty, culture); + } + #endregion + + return DialogOk; + } + + public static Boolean SaveFiledialogTempCalTxt(out String fullPath, String initialDirectory, String pcbID, out String timeForHeader, CultureInfo culture) + { + #region Definitions and initializations + fullPath = String.Empty; + Boolean DialogOk = false; + DateTime time = new DateTime(); + time = DateTime.Now; + String TimeForFilename = time.ToString(Formats.LogFileDateTimeString, culture); + timeForHeader = time.ToString(Formats.RawDataDateTimeLogString, culture); + #endregion + #region Everything else + try + { + #region Set Filename + String FullFilename = $"GenesisTempCalib {pcbID}{TimeForFilename}.txt"; + #endregion + #region SaveFileDialog + using (SaveFileDialog saveFileDialog1 = new SaveFileDialog()) + { + saveFileDialog1.Filter = "text files (*.txt)|*.txt"; + saveFileDialog1.FilterIndex = 2; + saveFileDialog1.RestoreDirectory = true; + saveFileDialog1.FileName = FullFilename; + if (Directory.Exists(initialDirectory)) + saveFileDialog1.InitialDirectory = initialDirectory; + #region Save to file + if (saveFileDialog1.ShowDialog() == DialogResult.OK) + { + DialogOk = true; + fullPath = Path.GetFullPath(saveFileDialog1.FileName); + } + #endregion + } + #endregion + } + catch (Exception ex) + { + ErrorLog.Log(LogErrReason.Exeption, "Files.SaveFiledialogTempCalTxt() failed", $"0x{ex.HResult.ToString("X", culture)}", String.Empty, culture); + } + #endregion + + return DialogOk; + } + #endregion + } +} \ No newline at end of file diff --git a/ZeroFlowTool/Form1.Designer.cs b/ZeroFlowTool/Form1.Designer.cs new file mode 100644 index 00000000..bd9e7c93 --- /dev/null +++ b/ZeroFlowTool/Form1.Designer.cs @@ -0,0 +1,2972 @@ +using Xylem.Common.Ui.GenesisToolBox; + +namespace GenesisZeroFlow +{ + partial class GenesisZeroFlow + { + /// + /// Erforderliche Designervariable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Verwendete Ressourcen bereinigen. + /// + /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Vom Windows Form-Designer generierter Code + + /// + /// Erforderliche Methode für die Designerunterstützung. + /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(GenesisZeroFlow)); + this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); + this.label2 = new System.Windows.Forms.Label(); + this.tab_ZeroFlowCal = new System.Windows.Forms.TabPage(); + this.tab_About = new System.Windows.Forms.TabPage(); + this.l_About_Version = new System.Windows.Forms.Label(); + this.l_About_Author = new System.Windows.Forms.Label(); + this.l_About_Info = new System.Windows.Forms.Label(); + this.l_Version = new System.Windows.Forms.Label(); + this.pB_Logo2 = new System.Windows.Forms.PictureBox(); + this.pB_DocumentVersion = new System.Windows.Forms.PictureBox(); + this.l_Author = new System.Windows.Forms.Label(); + this.l_BasedOn = new System.Windows.Forms.Label(); + this.pictureBox2 = new System.Windows.Forms.PictureBox(); + this.pictureBox3 = new System.Windows.Forms.PictureBox(); + this.tab_Settings = new System.Windows.Forms.TabPage(); + this.pB_AvailableImages = new System.Windows.Forms.PictureBox(); + this.pB_Logo3 = new System.Windows.Forms.PictureBox(); + this.gB_Settings_AmplitudeTest = new System.Windows.Forms.GroupBox(); + this.nUD_Settings_AmplitudeTestUpperLimit = new System.Windows.Forms.NumericUpDown(); + this.nUD_Settings_AmplitudeTestLowerLimit = new System.Windows.Forms.NumericUpDown(); + this.l_Settings_AmplitudeTestUpperLimit = new System.Windows.Forms.Label(); + this.l_Settings_AmplitudeTestLowerLimit = new System.Windows.Forms.Label(); + this.nUD_Settings_AmplitudeTestMinDistance = new System.Windows.Forms.NumericUpDown(); + this.l__Settings_AmplitudeTestMinDistance = new System.Windows.Forms.Label(); + this.nUD_PercentageStart = new System.Windows.Forms.NumericUpDown(); + this.l_PercentageStart = new System.Windows.Forms.Label(); + this.l_PercentageStop = new System.Windows.Forms.Label(); + this.nUD_PercentageStop = new System.Windows.Forms.NumericUpDown(); + this.cB_MeanAmplitudeFiles = new System.Windows.Forms.CheckBox(); + this.l_Settings_AmplitudeActivityCheckInterval = new System.Windows.Forms.Label(); + this.nUD_Settings_AmplitudeActivityCheckInterval = new System.Windows.Forms.NumericUpDown(); + this.cB_AmpLogFiles = new System.Windows.Forms.CheckBox(); + this.gB_Settings_ZeroflowOffsetTest = new System.Windows.Forms.GroupBox(); + this.nUD_Settings_ZeroflowOffsetTestUpperLimit = new System.Windows.Forms.NumericUpDown(); + this.nUD_Settings_ZeroflowOffsetTestLowerLimit = new System.Windows.Forms.NumericUpDown(); + this.l_Settings_ZeroflowOffsetTestUpperLimit = new System.Windows.Forms.Label(); + this.l_Settings_ZeroflowOffsetTestLowerLimit = new System.Windows.Forms.Label(); + this.nUD_Settings_ZeroflowOffsetTestOffsetLimit = new System.Windows.Forms.NumericUpDown(); + this.l_Settings_ZeroFlowTestOffsetLimit = new System.Windows.Forms.Label(); + this.nUD_Settings_ZeroflowOffsetTestSettlingTime = new System.Windows.Forms.NumericUpDown(); + this.l_Settings_ZeroFlowTestSettlingTime = new System.Windows.Forms.Label(); + this.nUD_Settings_ZeroflowOffsetTestNumberOfLines = new System.Windows.Forms.NumericUpDown(); + this.l_Settings_ZeroflowOffsetTestNumberOfLines = new System.Windows.Forms.Label(); + this.l_Settings_ZeroflowOffsetTestActivityCheckInterval = new System.Windows.Forms.Label(); + this.nUD_Settings_ZeroflowOffsetTestActivityCheckInterval = new System.Windows.Forms.NumericUpDown(); + this.cB_OffsetTestLogFiles = new System.Windows.Forms.CheckBox(); + this.gB_Settings_Preparation = new System.Windows.Forms.GroupBox(); + this.l_Settings_Preparation_StabiTime = new System.Windows.Forms.Label(); + this.nUD_Settings_Preparation_StabiTime = new System.Windows.Forms.NumericUpDown(); + this.l_SettingsPreparationMetersize = new System.Windows.Forms.Label(); + this.nUD_SettingsPreparationMetersize = new System.Windows.Forms.NumericUpDown(); + this.gB_Passwords = new System.Windows.Forms.GroupBox(); + this.l_PasswordMeter1 = new System.Windows.Forms.Label(); + this.l_PasswordMeter2 = new System.Windows.Forms.Label(); + this.l_PasswordMeter3 = new System.Windows.Forms.Label(); + this.l_PasswordMeter4 = new System.Windows.Forms.Label(); + this.l_PasswordMeter5 = new System.Windows.Forms.Label(); + this.l_PasswordMeter6 = new System.Windows.Forms.Label(); + this.l_PasswordMeter7 = new System.Windows.Forms.Label(); + this.l_PasswordMeter8 = new System.Windows.Forms.Label(); + this.l_PasswordMeter9 = new System.Windows.Forms.Label(); + this.l_PasswordMeter10 = new System.Windows.Forms.Label(); + this.tB_PasswordMeter1 = new System.Windows.Forms.TextBox(); + this.tB_PasswordMeter2 = new System.Windows.Forms.TextBox(); + this.tB_PasswordMeter3 = new System.Windows.Forms.TextBox(); + this.tB_PasswordMeter4 = new System.Windows.Forms.TextBox(); + this.tB_PasswordMeter6 = new System.Windows.Forms.TextBox(); + this.tB_PasswordMeter7 = new System.Windows.Forms.TextBox(); + this.tB_PasswordMeter8 = new System.Windows.Forms.TextBox(); + this.tB_PasswordMeter9 = new System.Windows.Forms.TextBox(); + this.tB_PasswordMeter10 = new System.Windows.Forms.TextBox(); + this.tB_PasswordMeter5 = new System.Windows.Forms.TextBox(); + this.gB_Settings_TemperatureCalibration = new System.Windows.Forms.GroupBox(); + this.tB_PasswordThermo1 = new System.Windows.Forms.TextBox(); + this.tB_PasswordThermo2 = new System.Windows.Forms.TextBox(); + this.lPasswordThermo1 = new System.Windows.Forms.Label(); + this.lThermo2 = new System.Windows.Forms.Label(); + this.cB_TempManualAcquisition = new System.Windows.Forms.CheckBox(); + this.gB_SettingsTempMonitor = new System.Windows.Forms.GroupBox(); + this.l_SettingsTempMonitorUpperValue = new System.Windows.Forms.Label(); + this.l_SettingsTempMonitorLowerValue = new System.Windows.Forms.Label(); + this.l_SettingsTempMonitorDeviation = new System.Windows.Forms.Label(); + this.nUD_SettingsTempMonitorUpperValue = new System.Windows.Forms.NumericUpDown(); + this.nUD_SettingsTempMonitorLowerValue = new System.Windows.Forms.NumericUpDown(); + this.nUD_SettingsTempMonitorDeviation = new System.Windows.Forms.NumericUpDown(); + this.gB_ComportSetup = new System.Windows.Forms.GroupBox(); + this.BtnOpenSetup = new System.Windows.Forms.Button(); + this.tab_Report = new System.Windows.Forms.TabPage(); + this.groupBox_report = new System.Windows.Forms.GroupBox(); + this.btn_Report_Generate = new System.Windows.Forms.Button(); + this.gB_ReportTitlepage = new System.Windows.Forms.GroupBox(); + this.label_Report_EnterDate = new System.Windows.Forms.Label(); + this.rTB_ReportEnterOperator = new System.Windows.Forms.RichTextBox(); + this.rTB_ReportEnterDate = new System.Windows.Forms.RichTextBox(); + this.label_Report_EnterOperator = new System.Windows.Forms.Label(); + this.label_Report_EnterTitle = new System.Windows.Forms.Label(); + this.rTB_ReportEnterTitle = new System.Windows.Forms.RichTextBox(); + this.rtB_ReportTitlepageIntro = new System.Windows.Forms.RichTextBox(); + this.l_ReportIntro = new System.Windows.Forms.Label(); + this.label_Report_EnterSerialNumber = new System.Windows.Forms.Label(); + this.rTB_ReportEnterSerialNumber = new System.Windows.Forms.RichTextBox(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.tab_Maintab = new System.Windows.Forms.TabControl(); + this.cB_SinglePath = new System.Windows.Forms.CheckBox(); + this.lbLanguage = new System.Windows.Forms.ListBox(); + this.p_ZeroFlowCal_Amplitude = new System.Windows.Forms.Panel(); + this.l_ZeroFlowCal_Amplitude = new System.Windows.Forms.Label(); + this.p_ZeroFlowCal_Prepare = new System.Windows.Forms.Panel(); + this.l_ZeroFlowCal_Prepare = new System.Windows.Forms.Label(); + this.p_ZeroFlowCal_TempCal = new System.Windows.Forms.Panel(); + this.l_ZeroFlowCal_TempCal = new System.Windows.Forms.Label(); + this.p_ZeroFlowCal_Detect = new System.Windows.Forms.Panel(); + this.l_ZeroFlowCal_Detect = new System.Windows.Forms.Label(); + this.l_ZeroFlowCal_Resttime = new System.Windows.Forms.Label(); + this.p_ZeroFlowCal_Offset = new System.Windows.Forms.Panel(); + this.l_ZeroFlowCal_Offset = new System.Windows.Forms.Label(); + this.l_ZeroFlowCal_ResttimeDisplayValue = new System.Windows.Forms.Label(); + this.pB_ZeroFlowCal_Progress = new System.Windows.Forms.ProgressBar(); + this.p_ZeroFlowCal_Completion = new System.Windows.Forms.Panel(); + this.l_ZeroFlowCal_Completion = new System.Windows.Forms.Label(); + this.cB_AmplitudeTestEnable = new System.Windows.Forms.CheckBox(); + this.cB_TempCalEnable = new System.Windows.Forms.CheckBox(); + this.cB_ZeroFlowOffsetTestEnable = new System.Windows.Forms.CheckBox(); + this.pThermo2 = new System.Windows.Forms.Panel(); + this.pB_Thermo2 = new System.Windows.Forms.PictureBox(); + this.l_Thermo2 = new System.Windows.Forms.Label(); + this.pThermo1 = new System.Windows.Forms.Panel(); + this.pB_Thermo1 = new System.Windows.Forms.PictureBox(); + this.l_Thermo1 = new System.Windows.Forms.Label(); + this.cB_Thermo2 = new System.Windows.Forms.CheckBox(); + this.cB_Thermo1 = new System.Windows.Forms.CheckBox(); + this.gB_Progress = new System.Windows.Forms.GroupBox(); + this.rTB_ZeroFlowCal = new System.Windows.Forms.RichTextBox(); + this.btn_ZeroFlowCal_Detect = new System.Windows.Forms.Button(); + this.btn_ZeroFlowCal_Start = new System.Windows.Forms.Button(); + this.btn_ZeroFlowCal_Abort = new System.Windows.Forms.Button(); + this.btn_ZeroFlowCal_Clear = new System.Windows.Forms.Button(); + this.btn_ZeroFlowCal_Save = new System.Windows.Forms.Button(); + this.btn_ZeroFlowCal_Pdf = new System.Windows.Forms.Button(); + this.l_ZeroFlowCal_Status = new System.Windows.Forms.Label(); + this.pB_Bubbles1 = new System.Windows.Forms.PictureBox(); + this.cB_ZeroFlowCal_EnableMeter10 = new System.Windows.Forms.CheckBox(); + this.cB_ZeroFlowCal_EnableMeter9 = new System.Windows.Forms.CheckBox(); + this.cB_ZeroFlowCal_EnableMeter1 = new System.Windows.Forms.CheckBox(); + this.gB_Meters = new System.Windows.Forms.GroupBox(); + this.pB_Logo1 = new System.Windows.Forms.PictureBox(); + this.cB_ZeroFlowCal_EnableMeter8 = new System.Windows.Forms.CheckBox(); + this.cB_ZeroFlowCal_EnableMeter7 = new System.Windows.Forms.CheckBox(); + this.cB_ZeroFlowCal_EnableMeter6 = new System.Windows.Forms.CheckBox(); + this.cB_ZeroFlowCal_EnableMeter5 = new System.Windows.Forms.CheckBox(); + this.cB_ZeroFlowCal_EnableMeter4 = new System.Windows.Forms.CheckBox(); + this.cB_ZeroFlowCal_EnableMeter3 = new System.Windows.Forms.CheckBox(); + this.cB_ZeroFlowCal_EnableMeter2 = new System.Windows.Forms.CheckBox(); + this.l_ZeroFlowCal_Meter7 = new System.Windows.Forms.Label(); + this.pB_Meter7 = new System.Windows.Forms.PictureBox(); + this.p_ZeroFlowCal_Meter7 = new System.Windows.Forms.Panel(); + this.l_ZeroFlowCal_Meter8 = new System.Windows.Forms.Label(); + this.pB_Meter8 = new System.Windows.Forms.PictureBox(); + this.p_ZeroFlowCal_Meter8 = new System.Windows.Forms.Panel(); + this.l_ZeroFlowCal_Meter10 = new System.Windows.Forms.Label(); + this.pB_Meter10 = new System.Windows.Forms.PictureBox(); + this.p_ZeroFlowCal_Meter10 = new System.Windows.Forms.Panel(); + this.l_ZeroFlowCal_Meter4 = new System.Windows.Forms.Label(); + this.pB_Meter4 = new System.Windows.Forms.PictureBox(); + this.p_ZeroFlowCal_Meter4 = new System.Windows.Forms.Panel(); + this.l_ZeroFlowCal_Meter5 = new System.Windows.Forms.Label(); + this.pB_Meter5 = new System.Windows.Forms.PictureBox(); + this.p_ZeroFlowCal_Meter5 = new System.Windows.Forms.Panel(); + this.l_ZeroFlowCal_Meter3 = new System.Windows.Forms.Label(); + this.pB_Meter3 = new System.Windows.Forms.PictureBox(); + this.p_ZeroFlowCal_Meter3 = new System.Windows.Forms.Panel(); + this.l_ZeroFlowCal_Meter6 = new System.Windows.Forms.Label(); + this.pB_Meter6 = new System.Windows.Forms.PictureBox(); + this.p_ZeroFlowCal_Meter6 = new System.Windows.Forms.Panel(); + this.l_ZeroFlowCal_Meter2 = new System.Windows.Forms.Label(); + this.pB_Meter2 = new System.Windows.Forms.PictureBox(); + this.p_ZeroFlowCal_Meter2 = new System.Windows.Forms.Panel(); + this.l_ZeroFlowCal_Meter9 = new System.Windows.Forms.Label(); + this.pB_Meter9 = new System.Windows.Forms.PictureBox(); + this.p_ZeroFlowCal_Meter9 = new System.Windows.Forms.Panel(); + this.l_ZeroFlowCal_Meter1 = new System.Windows.Forms.Label(); + this.pB_Meter1 = new System.Windows.Forms.PictureBox(); + this.p_ZeroFlowCal_Meter1 = new System.Windows.Forms.Panel(); + this.bindingSource1 = new System.Windows.Forms.BindingSource(this.components); + this.tab_ZeroFlowCal.SuspendLayout(); + this.tab_About.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Logo2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pB_DocumentVersion)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit(); + this.tab_Settings.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_AvailableImages)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Logo3)).BeginInit(); + this.gB_Settings_AmplitudeTest.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_AmplitudeTestUpperLimit)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_AmplitudeTestLowerLimit)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_AmplitudeTestMinDistance)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_PercentageStart)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_PercentageStop)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_AmplitudeActivityCheckInterval)).BeginInit(); + this.gB_Settings_ZeroflowOffsetTest.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_ZeroflowOffsetTestUpperLimit)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_ZeroflowOffsetTestLowerLimit)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_ZeroflowOffsetTestOffsetLimit)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_ZeroflowOffsetTestSettlingTime)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_ZeroflowOffsetTestNumberOfLines)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_ZeroflowOffsetTestActivityCheckInterval)).BeginInit(); + this.gB_Settings_Preparation.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_Preparation_StabiTime)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_SettingsPreparationMetersize)).BeginInit(); + this.gB_Passwords.SuspendLayout(); + this.gB_Settings_TemperatureCalibration.SuspendLayout(); + this.gB_SettingsTempMonitor.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_SettingsTempMonitorUpperValue)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_SettingsTempMonitorLowerValue)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_SettingsTempMonitorDeviation)).BeginInit(); + this.gB_ComportSetup.SuspendLayout(); + this.tab_Report.SuspendLayout(); + this.groupBox_report.SuspendLayout(); + this.gB_ReportTitlepage.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.tab_Maintab.SuspendLayout(); + this.p_ZeroFlowCal_Amplitude.SuspendLayout(); + this.p_ZeroFlowCal_Prepare.SuspendLayout(); + this.p_ZeroFlowCal_TempCal.SuspendLayout(); + this.p_ZeroFlowCal_Detect.SuspendLayout(); + this.p_ZeroFlowCal_Offset.SuspendLayout(); + this.p_ZeroFlowCal_Completion.SuspendLayout(); + this.pThermo2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Thermo2)).BeginInit(); + this.pThermo1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Thermo1)).BeginInit(); + this.gB_Progress.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Bubbles1)).BeginInit(); + this.gB_Meters.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Logo1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Meter7)).BeginInit(); + this.p_ZeroFlowCal_Meter7.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Meter8)).BeginInit(); + this.p_ZeroFlowCal_Meter8.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Meter10)).BeginInit(); + this.p_ZeroFlowCal_Meter10.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Meter4)).BeginInit(); + this.p_ZeroFlowCal_Meter4.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Meter5)).BeginInit(); + this.p_ZeroFlowCal_Meter5.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Meter3)).BeginInit(); + this.p_ZeroFlowCal_Meter3.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Meter6)).BeginInit(); + this.p_ZeroFlowCal_Meter6.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Meter2)).BeginInit(); + this.p_ZeroFlowCal_Meter2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Meter9)).BeginInit(); + this.p_ZeroFlowCal_Meter9.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Meter1)).BeginInit(); + this.p_ZeroFlowCal_Meter1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.bindingSource1)).BeginInit(); + this.SuspendLayout(); + // + // contextMenuStrip1 + // + this.contextMenuStrip1.ImageScalingSize = new System.Drawing.Size(20, 20); + this.contextMenuStrip1.Name = "contextMenuStrip1"; + this.contextMenuStrip1.Size = new System.Drawing.Size(61, 4); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(30, 84); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(117, 17); + this.label2.TabIndex = 1; + this.label2.Text = "Lower Value [°C]:"; + // + // tab_ZeroFlowCal + // + this.tab_ZeroFlowCal.AutoScroll = true; + this.tab_ZeroFlowCal.BackColor = System.Drawing.Color.Honeydew; + this.tab_ZeroFlowCal.Controls.Add(this.l_ZeroFlowCal_Status); + this.tab_ZeroFlowCal.Controls.Add(this.btn_ZeroFlowCal_Pdf); + this.tab_ZeroFlowCal.Controls.Add(this.btn_ZeroFlowCal_Save); + this.tab_ZeroFlowCal.Controls.Add(this.btn_ZeroFlowCal_Clear); + this.tab_ZeroFlowCal.Controls.Add(this.btn_ZeroFlowCal_Abort); + this.tab_ZeroFlowCal.Controls.Add(this.btn_ZeroFlowCal_Start); + this.tab_ZeroFlowCal.Controls.Add(this.btn_ZeroFlowCal_Detect); + this.tab_ZeroFlowCal.Controls.Add(this.rTB_ZeroFlowCal); + this.tab_ZeroFlowCal.Controls.Add(this.pB_Logo1); + this.tab_ZeroFlowCal.Controls.Add(this.pB_Bubbles1); + this.tab_ZeroFlowCal.Controls.Add(this.gB_Meters); + this.tab_ZeroFlowCal.Controls.Add(this.gB_Progress); + this.tab_ZeroFlowCal.Location = new System.Drawing.Point(4, 22); + this.tab_ZeroFlowCal.Margin = new System.Windows.Forms.Padding(10); + this.tab_ZeroFlowCal.Name = "tab_ZeroFlowCal"; + this.tab_ZeroFlowCal.Padding = new System.Windows.Forms.Padding(2); + this.tab_ZeroFlowCal.Size = new System.Drawing.Size(943, 674); + this.tab_ZeroFlowCal.TabIndex = 15; + this.tab_ZeroFlowCal.Text = "Zero flow calibration"; + // + // tab_About + // + this.tab_About.BackColor = System.Drawing.Color.Honeydew; + this.tab_About.Controls.Add(this.pictureBox3); + this.tab_About.Controls.Add(this.pictureBox2); + this.tab_About.Controls.Add(this.l_BasedOn); + this.tab_About.Controls.Add(this.l_Author); + this.tab_About.Controls.Add(this.pB_DocumentVersion); + this.tab_About.Controls.Add(this.pB_Logo2); + this.tab_About.Controls.Add(this.l_Version); + this.tab_About.Controls.Add(this.l_About_Info); + this.tab_About.Controls.Add(this.l_About_Author); + this.tab_About.Controls.Add(this.l_About_Version); + this.tab_About.Location = new System.Drawing.Point(4, 22); + this.tab_About.Margin = new System.Windows.Forms.Padding(2); + this.tab_About.Name = "tab_About"; + this.tab_About.Padding = new System.Windows.Forms.Padding(2); + this.tab_About.Size = new System.Drawing.Size(943, 674); + this.tab_About.TabIndex = 7; + this.tab_About.Text = "About"; + // + // l_About_Version + // + this.l_About_Version.AutoSize = true; + this.l_About_Version.Font = new System.Drawing.Font("Microsoft Sans Serif", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_About_Version.Location = new System.Drawing.Point(162, 54); + this.l_About_Version.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_About_Version.Name = "l_About_Version"; + this.l_About_Version.Size = new System.Drawing.Size(540, 37); + this.l_About_Version.TabIndex = 1; + this.l_About_Version.Text = "GENESIS Zeroflow calibration tool"; + // + // l_About_Author + // + this.l_About_Author.AutoSize = true; + this.l_About_Author.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_About_Author.Location = new System.Drawing.Point(370, 246); + this.l_About_Author.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_About_Author.Name = "l_About_Author"; + this.l_About_Author.Size = new System.Drawing.Size(13, 20); + this.l_About_Author.TabIndex = 2; + this.l_About_Author.Text = " "; + // + // l_About_Info + // + this.l_About_Info.AutoSize = true; + this.l_About_Info.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_About_Info.Location = new System.Drawing.Point(150, 516); + this.l_About_Info.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_About_Info.Name = "l_About_Info"; + this.l_About_Info.Size = new System.Drawing.Size(295, 20); + this.l_About_Info.TabIndex = 3; + this.l_About_Info.Text = "Supports GENESIS protocol version \"h\""; + // + // l_Version + // + this.l_Version.AutoSize = true; + this.l_Version.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_Version.Location = new System.Drawing.Point(168, 108); + this.l_Version.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_Version.Name = "l_Version"; + this.l_Version.Size = new System.Drawing.Size(188, 20); + this.l_Version.TabIndex = 4; + this.l_Version.Text = "Version 0.22/ 2019-02-08"; + // + // pB_Logo2 + // + this.pB_Logo2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.pB_Logo2.Image = ((System.Drawing.Image)(resources.GetObject("pB_Logo2.Image"))); + this.pB_Logo2.InitialImage = null; + this.pB_Logo2.Location = new System.Drawing.Point(802, 21); + this.pB_Logo2.Margin = new System.Windows.Forms.Padding(2); + this.pB_Logo2.Name = "pB_Logo2"; + this.pB_Logo2.Size = new System.Drawing.Size(91, 38); + this.pB_Logo2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pB_Logo2.TabIndex = 5; + this.pB_Logo2.TabStop = false; + // + // pB_DocumentVersion + // + this.pB_DocumentVersion.Image = ((System.Drawing.Image)(resources.GetObject("pB_DocumentVersion.Image"))); + this.pB_DocumentVersion.Location = new System.Drawing.Point(84, 222); + this.pB_DocumentVersion.Margin = new System.Windows.Forms.Padding(2); + this.pB_DocumentVersion.Name = "pB_DocumentVersion"; + this.pB_DocumentVersion.Size = new System.Drawing.Size(449, 277); + this.pB_DocumentVersion.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pB_DocumentVersion.TabIndex = 6; + this.pB_DocumentVersion.TabStop = false; + // + // l_Author + // + this.l_Author.AutoSize = true; + this.l_Author.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_Author.Location = new System.Drawing.Point(231, 133); + this.l_Author.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_Author.Name = "l_Author"; + this.l_Author.Size = new System.Drawing.Size(0, 20); + this.l_Author.TabIndex = 7; + // + // l_BasedOn + // + this.l_BasedOn.AutoSize = true; + this.l_BasedOn.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_BasedOn.Location = new System.Drawing.Point(150, 192); + this.l_BasedOn.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_BasedOn.Name = "l_BasedOn"; + this.l_BasedOn.Size = new System.Drawing.Size(81, 20); + this.l_BasedOn.TabIndex = 9; + this.l_BasedOn.Text = "Based on:"; + // + // pictureBox2 + // + this.pictureBox2.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox2.Image"))); + this.pictureBox2.Location = new System.Drawing.Point(564, 222); + this.pictureBox2.Margin = new System.Windows.Forms.Padding(2); + this.pictureBox2.Name = "pictureBox2"; + this.pictureBox2.Size = new System.Drawing.Size(340, 362); + this.pictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBox2.TabIndex = 54; + this.pictureBox2.TabStop = false; + // + // pictureBox3 + // + this.pictureBox3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.pictureBox3.BackColor = System.Drawing.Color.Transparent; + this.pictureBox3.ErrorImage = ((System.Drawing.Image)(resources.GetObject("pictureBox3.ErrorImage"))); + this.pictureBox3.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox3.Image"))); + this.pictureBox3.InitialImage = ((System.Drawing.Image)(resources.GetObject("pictureBox3.InitialImage"))); + this.pictureBox3.Location = new System.Drawing.Point(822, 83); + this.pictureBox3.Margin = new System.Windows.Forms.Padding(2); + this.pictureBox3.Name = "pictureBox3"; + this.pictureBox3.Size = new System.Drawing.Size(53, 40); + this.pictureBox3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBox3.TabIndex = 55; + this.pictureBox3.TabStop = false; + // + // tab_Settings + // + this.tab_Settings.BackColor = System.Drawing.Color.Honeydew; + this.tab_Settings.Controls.Add(this.cB_SinglePath); + this.tab_Settings.Controls.Add(this.lbLanguage); + this.tab_Settings.Controls.Add(this.gB_ComportSetup); + this.tab_Settings.Controls.Add(this.gB_SettingsTempMonitor); + this.tab_Settings.Controls.Add(this.gB_Settings_TemperatureCalibration); + this.tab_Settings.Controls.Add(this.gB_Passwords); + this.tab_Settings.Controls.Add(this.gB_Settings_Preparation); + this.tab_Settings.Controls.Add(this.gB_Settings_ZeroflowOffsetTest); + this.tab_Settings.Controls.Add(this.gB_Settings_AmplitudeTest); + this.tab_Settings.Controls.Add(this.pB_Logo3); + this.tab_Settings.Controls.Add(this.pB_AvailableImages); + this.tab_Settings.Location = new System.Drawing.Point(4, 22); + this.tab_Settings.Margin = new System.Windows.Forms.Padding(2); + this.tab_Settings.Name = "tab_Settings"; + this.tab_Settings.Padding = new System.Windows.Forms.Padding(2); + this.tab_Settings.Size = new System.Drawing.Size(943, 674); + this.tab_Settings.TabIndex = 8; + this.tab_Settings.Text = "Settings"; + // + // pB_AvailableImages + // + this.pB_AvailableImages.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.pB_AvailableImages.BackColor = System.Drawing.Color.Transparent; + this.pB_AvailableImages.ErrorImage = global::GenesisDisplayTool.Properties.Resources.NormalImage; + this.pB_AvailableImages.Image = ((System.Drawing.Image)(resources.GetObject("pB_AvailableImages.Image"))); + this.pB_AvailableImages.InitialImage = global::GenesisDisplayTool.Properties.Resources.NormalImage; + this.pB_AvailableImages.Location = new System.Drawing.Point(825, 82); + this.pB_AvailableImages.Margin = new System.Windows.Forms.Padding(2); + this.pB_AvailableImages.Name = "pB_AvailableImages"; + this.pB_AvailableImages.Size = new System.Drawing.Size(53, 40); + this.pB_AvailableImages.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pB_AvailableImages.TabIndex = 26; + this.pB_AvailableImages.TabStop = false; + // + // pB_Logo3 + // + this.pB_Logo3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.pB_Logo3.Image = ((System.Drawing.Image)(resources.GetObject("pB_Logo3.Image"))); + this.pB_Logo3.InitialImage = null; + this.pB_Logo3.Location = new System.Drawing.Point(802, 21); + this.pB_Logo3.Margin = new System.Windows.Forms.Padding(2); + this.pB_Logo3.Name = "pB_Logo3"; + this.pB_Logo3.Size = new System.Drawing.Size(91, 38); + this.pB_Logo3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pB_Logo3.TabIndex = 31; + this.pB_Logo3.TabStop = false; + // + // gB_Settings_AmplitudeTest + // + this.gB_Settings_AmplitudeTest.Controls.Add(this.cB_AmpLogFiles); + this.gB_Settings_AmplitudeTest.Controls.Add(this.nUD_Settings_AmplitudeActivityCheckInterval); + this.gB_Settings_AmplitudeTest.Controls.Add(this.l_Settings_AmplitudeActivityCheckInterval); + this.gB_Settings_AmplitudeTest.Controls.Add(this.cB_MeanAmplitudeFiles); + this.gB_Settings_AmplitudeTest.Controls.Add(this.nUD_PercentageStop); + this.gB_Settings_AmplitudeTest.Controls.Add(this.l_PercentageStop); + this.gB_Settings_AmplitudeTest.Controls.Add(this.l_PercentageStart); + this.gB_Settings_AmplitudeTest.Controls.Add(this.nUD_PercentageStart); + this.gB_Settings_AmplitudeTest.Controls.Add(this.l__Settings_AmplitudeTestMinDistance); + this.gB_Settings_AmplitudeTest.Controls.Add(this.nUD_Settings_AmplitudeTestMinDistance); + this.gB_Settings_AmplitudeTest.Controls.Add(this.l_Settings_AmplitudeTestLowerLimit); + this.gB_Settings_AmplitudeTest.Controls.Add(this.l_Settings_AmplitudeTestUpperLimit); + this.gB_Settings_AmplitudeTest.Controls.Add(this.nUD_Settings_AmplitudeTestLowerLimit); + this.gB_Settings_AmplitudeTest.Controls.Add(this.nUD_Settings_AmplitudeTestUpperLimit); + this.gB_Settings_AmplitudeTest.Location = new System.Drawing.Point(40, 28); + this.gB_Settings_AmplitudeTest.Margin = new System.Windows.Forms.Padding(2); + this.gB_Settings_AmplitudeTest.Name = "gB_Settings_AmplitudeTest"; + this.gB_Settings_AmplitudeTest.Padding = new System.Windows.Forms.Padding(2); + this.gB_Settings_AmplitudeTest.Size = new System.Drawing.Size(272, 320); + this.gB_Settings_AmplitudeTest.TabIndex = 27; + this.gB_Settings_AmplitudeTest.TabStop = false; + this.gB_Settings_AmplitudeTest.Text = "Amplitude Test"; + // + // nUD_Settings_AmplitudeTestUpperLimit + // + this.nUD_Settings_AmplitudeTestUpperLimit.Location = new System.Drawing.Point(168, 115); + this.nUD_Settings_AmplitudeTestUpperLimit.Margin = new System.Windows.Forms.Padding(2); + this.nUD_Settings_AmplitudeTestUpperLimit.Maximum = new decimal(new int[] { + 40, + 0, + 0, + 0}); + this.nUD_Settings_AmplitudeTestUpperLimit.Name = "nUD_Settings_AmplitudeTestUpperLimit"; + this.nUD_Settings_AmplitudeTestUpperLimit.Size = new System.Drawing.Size(62, 20); + this.nUD_Settings_AmplitudeTestUpperLimit.TabIndex = 0; + this.nUD_Settings_AmplitudeTestUpperLimit.Value = new decimal(new int[] { + 32, + 0, + 0, + 0}); + // + // nUD_Settings_AmplitudeTestLowerLimit + // + this.nUD_Settings_AmplitudeTestLowerLimit.Location = new System.Drawing.Point(168, 149); + this.nUD_Settings_AmplitudeTestLowerLimit.Margin = new System.Windows.Forms.Padding(2); + this.nUD_Settings_AmplitudeTestLowerLimit.Maximum = new decimal(new int[] { + 30, + 0, + 0, + 0}); + this.nUD_Settings_AmplitudeTestLowerLimit.Name = "nUD_Settings_AmplitudeTestLowerLimit"; + this.nUD_Settings_AmplitudeTestLowerLimit.Size = new System.Drawing.Size(62, 20); + this.nUD_Settings_AmplitudeTestLowerLimit.TabIndex = 1; + this.nUD_Settings_AmplitudeTestLowerLimit.Value = new decimal(new int[] { + 12, + 0, + 0, + 0}); + // + // l_Settings_AmplitudeTestUpperLimit + // + this.l_Settings_AmplitudeTestUpperLimit.AutoSize = true; + this.l_Settings_AmplitudeTestUpperLimit.Location = new System.Drawing.Point(19, 115); + this.l_Settings_AmplitudeTestUpperLimit.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_Settings_AmplitudeTestUpperLimit.Name = "l_Settings_AmplitudeTestUpperLimit"; + this.l_Settings_AmplitudeTestUpperLimit.Size = new System.Drawing.Size(128, 13); + this.l_Settings_AmplitudeTestUpperLimit.TabIndex = 2; + this.l_Settings_AmplitudeTestUpperLimit.Text = "Optimal Point Upper Limit:"; + // + // l_Settings_AmplitudeTestLowerLimit + // + this.l_Settings_AmplitudeTestLowerLimit.AutoSize = true; + this.l_Settings_AmplitudeTestLowerLimit.Location = new System.Drawing.Point(19, 149); + this.l_Settings_AmplitudeTestLowerLimit.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_Settings_AmplitudeTestLowerLimit.Name = "l_Settings_AmplitudeTestLowerLimit"; + this.l_Settings_AmplitudeTestLowerLimit.Size = new System.Drawing.Size(128, 13); + this.l_Settings_AmplitudeTestLowerLimit.TabIndex = 3; + this.l_Settings_AmplitudeTestLowerLimit.Text = "Optimal Point Lower Limit:"; + // + // nUD_Settings_AmplitudeTestMinDistance + // + this.nUD_Settings_AmplitudeTestMinDistance.Location = new System.Drawing.Point(168, 182); + this.nUD_Settings_AmplitudeTestMinDistance.Margin = new System.Windows.Forms.Padding(2); + this.nUD_Settings_AmplitudeTestMinDistance.Maximum = new decimal(new int[] { + 10, + 0, + 0, + 0}); + this.nUD_Settings_AmplitudeTestMinDistance.Name = "nUD_Settings_AmplitudeTestMinDistance"; + this.nUD_Settings_AmplitudeTestMinDistance.Size = new System.Drawing.Size(62, 20); + this.nUD_Settings_AmplitudeTestMinDistance.TabIndex = 4; + this.nUD_Settings_AmplitudeTestMinDistance.Value = new decimal(new int[] { + 7, + 0, + 0, + 0}); + // + // l__Settings_AmplitudeTestMinDistance + // + this.l__Settings_AmplitudeTestMinDistance.AutoSize = true; + this.l__Settings_AmplitudeTestMinDistance.Location = new System.Drawing.Point(19, 182); + this.l__Settings_AmplitudeTestMinDistance.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l__Settings_AmplitudeTestMinDistance.Name = "l__Settings_AmplitudeTestMinDistance"; + this.l__Settings_AmplitudeTestMinDistance.Size = new System.Drawing.Size(74, 13); + this.l__Settings_AmplitudeTestMinDistance.TabIndex = 5; + this.l__Settings_AmplitudeTestMinDistance.Text = "min. Distance:"; + // + // nUD_PercentageStart + // + this.nUD_PercentageStart.Location = new System.Drawing.Point(168, 216); + this.nUD_PercentageStart.Margin = new System.Windows.Forms.Padding(2); + this.nUD_PercentageStart.Maximum = new decimal(new int[] { + 20, + 0, + 0, + 0}); + this.nUD_PercentageStart.Name = "nUD_PercentageStart"; + this.nUD_PercentageStart.Size = new System.Drawing.Size(62, 20); + this.nUD_PercentageStart.TabIndex = 6; + this.nUD_PercentageStart.Value = new decimal(new int[] { + 5, + 0, + 0, + 0}); + // + // l_PercentageStart + // + this.l_PercentageStart.AutoSize = true; + this.l_PercentageStart.Location = new System.Drawing.Point(19, 216); + this.l_PercentageStart.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_PercentageStart.Name = "l_PercentageStart"; + this.l_PercentageStart.Size = new System.Drawing.Size(120, 13); + this.l_PercentageStart.TabIndex = 7; + this.l_PercentageStart.Text = "Percentage Start Value:"; + // + // l_PercentageStop + // + this.l_PercentageStop.AutoSize = true; + this.l_PercentageStop.Location = new System.Drawing.Point(19, 250); + this.l_PercentageStop.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_PercentageStop.Name = "l_PercentageStop"; + this.l_PercentageStop.Size = new System.Drawing.Size(120, 13); + this.l_PercentageStop.TabIndex = 8; + this.l_PercentageStop.Text = "Percentage Stop Value:"; + // + // nUD_PercentageStop + // + this.nUD_PercentageStop.Location = new System.Drawing.Point(168, 250); + this.nUD_PercentageStop.Margin = new System.Windows.Forms.Padding(2); + this.nUD_PercentageStop.Maximum = new decimal(new int[] { + 50, + 0, + 0, + 0}); + this.nUD_PercentageStop.Minimum = new decimal(new int[] { + 30, + 0, + 0, + 0}); + this.nUD_PercentageStop.Name = "nUD_PercentageStop"; + this.nUD_PercentageStop.Size = new System.Drawing.Size(62, 20); + this.nUD_PercentageStop.TabIndex = 9; + this.nUD_PercentageStop.Value = new decimal(new int[] { + 40, + 0, + 0, + 0}); + // + // cB_MeanAmplitudeFiles + // + this.cB_MeanAmplitudeFiles.AutoSize = true; + this.cB_MeanAmplitudeFiles.Checked = true; + this.cB_MeanAmplitudeFiles.CheckState = System.Windows.Forms.CheckState.Checked; + this.cB_MeanAmplitudeFiles.Location = new System.Drawing.Point(43, 67); + this.cB_MeanAmplitudeFiles.Margin = new System.Windows.Forms.Padding(2); + this.cB_MeanAmplitudeFiles.Name = "cB_MeanAmplitudeFiles"; + this.cB_MeanAmplitudeFiles.Size = new System.Drawing.Size(154, 17); + this.cB_MeanAmplitudeFiles.TabIndex = 10; + this.cB_MeanAmplitudeFiles.Text = "Generate Mean Value Files"; + this.cB_MeanAmplitudeFiles.UseVisualStyleBackColor = true; + // + // l_Settings_AmplitudeActivityCheckInterval + // + this.l_Settings_AmplitudeActivityCheckInterval.AutoSize = true; + this.l_Settings_AmplitudeActivityCheckInterval.Location = new System.Drawing.Point(19, 283); + this.l_Settings_AmplitudeActivityCheckInterval.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_Settings_AmplitudeActivityCheckInterval.Name = "l_Settings_AmplitudeActivityCheckInterval"; + this.l_Settings_AmplitudeActivityCheckInterval.Size = new System.Drawing.Size(130, 13); + this.l_Settings_AmplitudeActivityCheckInterval.TabIndex = 20; + this.l_Settings_AmplitudeActivityCheckInterval.Text = "Activity Check Interval (s):"; + // + // nUD_Settings_AmplitudeActivityCheckInterval + // + this.nUD_Settings_AmplitudeActivityCheckInterval.Location = new System.Drawing.Point(168, 283); + this.nUD_Settings_AmplitudeActivityCheckInterval.Margin = new System.Windows.Forms.Padding(2); + this.nUD_Settings_AmplitudeActivityCheckInterval.Maximum = new decimal(new int[] { + 15, + 0, + 0, + 0}); + this.nUD_Settings_AmplitudeActivityCheckInterval.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.nUD_Settings_AmplitudeActivityCheckInterval.Name = "nUD_Settings_AmplitudeActivityCheckInterval"; + this.nUD_Settings_AmplitudeActivityCheckInterval.Size = new System.Drawing.Size(62, 20); + this.nUD_Settings_AmplitudeActivityCheckInterval.TabIndex = 20; + this.nUD_Settings_AmplitudeActivityCheckInterval.Value = new decimal(new int[] { + 2, + 0, + 0, + 0}); + // + // cB_AmpLogFiles + // + this.cB_AmpLogFiles.AutoSize = true; + this.cB_AmpLogFiles.Checked = true; + this.cB_AmpLogFiles.CheckState = System.Windows.Forms.CheckState.Checked; + this.cB_AmpLogFiles.Location = new System.Drawing.Point(42, 38); + this.cB_AmpLogFiles.Margin = new System.Windows.Forms.Padding(2); + this.cB_AmpLogFiles.Name = "cB_AmpLogFiles"; + this.cB_AmpLogFiles.Size = new System.Drawing.Size(115, 17); + this.cB_AmpLogFiles.TabIndex = 20; + this.cB_AmpLogFiles.Text = "Generate Log Files"; + this.cB_AmpLogFiles.UseVisualStyleBackColor = true; + // + // gB_Settings_ZeroflowOffsetTest + // + this.gB_Settings_ZeroflowOffsetTest.Controls.Add(this.cB_OffsetTestLogFiles); + this.gB_Settings_ZeroflowOffsetTest.Controls.Add(this.nUD_Settings_ZeroflowOffsetTestActivityCheckInterval); + this.gB_Settings_ZeroflowOffsetTest.Controls.Add(this.l_Settings_ZeroflowOffsetTestActivityCheckInterval); + this.gB_Settings_ZeroflowOffsetTest.Controls.Add(this.l_Settings_ZeroflowOffsetTestNumberOfLines); + this.gB_Settings_ZeroflowOffsetTest.Controls.Add(this.nUD_Settings_ZeroflowOffsetTestNumberOfLines); + this.gB_Settings_ZeroflowOffsetTest.Controls.Add(this.l_Settings_ZeroFlowTestSettlingTime); + this.gB_Settings_ZeroflowOffsetTest.Controls.Add(this.nUD_Settings_ZeroflowOffsetTestSettlingTime); + this.gB_Settings_ZeroflowOffsetTest.Controls.Add(this.l_Settings_ZeroFlowTestOffsetLimit); + this.gB_Settings_ZeroflowOffsetTest.Controls.Add(this.nUD_Settings_ZeroflowOffsetTestOffsetLimit); + this.gB_Settings_ZeroflowOffsetTest.Controls.Add(this.l_Settings_ZeroflowOffsetTestLowerLimit); + this.gB_Settings_ZeroflowOffsetTest.Controls.Add(this.l_Settings_ZeroflowOffsetTestUpperLimit); + this.gB_Settings_ZeroflowOffsetTest.Controls.Add(this.nUD_Settings_ZeroflowOffsetTestLowerLimit); + this.gB_Settings_ZeroflowOffsetTest.Controls.Add(this.nUD_Settings_ZeroflowOffsetTestUpperLimit); + this.gB_Settings_ZeroflowOffsetTest.Location = new System.Drawing.Point(332, 28); + this.gB_Settings_ZeroflowOffsetTest.Margin = new System.Windows.Forms.Padding(2); + this.gB_Settings_ZeroflowOffsetTest.Name = "gB_Settings_ZeroflowOffsetTest"; + this.gB_Settings_ZeroflowOffsetTest.Padding = new System.Windows.Forms.Padding(2); + this.gB_Settings_ZeroflowOffsetTest.Size = new System.Drawing.Size(272, 229); + this.gB_Settings_ZeroflowOffsetTest.TabIndex = 28; + this.gB_Settings_ZeroflowOffsetTest.TabStop = false; + this.gB_Settings_ZeroflowOffsetTest.Text = "Zeroflow Offset Test"; + // + // nUD_Settings_ZeroflowOffsetTestUpperLimit + // + this.nUD_Settings_ZeroflowOffsetTestUpperLimit.Location = new System.Drawing.Point(168, 67); + this.nUD_Settings_ZeroflowOffsetTestUpperLimit.Margin = new System.Windows.Forms.Padding(2); + this.nUD_Settings_ZeroflowOffsetTestUpperLimit.Maximum = new decimal(new int[] { + 3000, + 0, + 0, + 0}); + this.nUD_Settings_ZeroflowOffsetTestUpperLimit.Name = "nUD_Settings_ZeroflowOffsetTestUpperLimit"; + this.nUD_Settings_ZeroflowOffsetTestUpperLimit.Size = new System.Drawing.Size(62, 20); + this.nUD_Settings_ZeroflowOffsetTestUpperLimit.TabIndex = 0; + this.nUD_Settings_ZeroflowOffsetTestUpperLimit.Value = new decimal(new int[] { + 650, + 0, + 0, + 0}); + // + // nUD_Settings_ZeroflowOffsetTestLowerLimit + // + this.nUD_Settings_ZeroflowOffsetTestLowerLimit.Location = new System.Drawing.Point(168, 91); + this.nUD_Settings_ZeroflowOffsetTestLowerLimit.Margin = new System.Windows.Forms.Padding(2); + this.nUD_Settings_ZeroflowOffsetTestLowerLimit.Maximum = new decimal(new int[] { + 600, + 0, + 0, + 0}); + this.nUD_Settings_ZeroflowOffsetTestLowerLimit.Name = "nUD_Settings_ZeroflowOffsetTestLowerLimit"; + this.nUD_Settings_ZeroflowOffsetTestLowerLimit.Size = new System.Drawing.Size(62, 20); + this.nUD_Settings_ZeroflowOffsetTestLowerLimit.TabIndex = 1; + this.nUD_Settings_ZeroflowOffsetTestLowerLimit.Value = new decimal(new int[] { + 200, + 0, + 0, + 0}); + // + // l_Settings_ZeroflowOffsetTestUpperLimit + // + this.l_Settings_ZeroflowOffsetTestUpperLimit.AutoSize = true; + this.l_Settings_ZeroflowOffsetTestUpperLimit.Location = new System.Drawing.Point(24, 67); + this.l_Settings_ZeroflowOffsetTestUpperLimit.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_Settings_ZeroflowOffsetTestUpperLimit.Name = "l_Settings_ZeroflowOffsetTestUpperLimit"; + this.l_Settings_ZeroflowOffsetTestUpperLimit.Size = new System.Drawing.Size(126, 13); + this.l_Settings_ZeroflowOffsetTestUpperLimit.TabIndex = 2; + this.l_Settings_ZeroflowOffsetTestUpperLimit.Text = "Upper Voltage Limit (mV):"; + // + // l_Settings_ZeroflowOffsetTestLowerLimit + // + this.l_Settings_ZeroflowOffsetTestLowerLimit.AutoSize = true; + this.l_Settings_ZeroflowOffsetTestLowerLimit.Location = new System.Drawing.Point(24, 95); + this.l_Settings_ZeroflowOffsetTestLowerLimit.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_Settings_ZeroflowOffsetTestLowerLimit.Name = "l_Settings_ZeroflowOffsetTestLowerLimit"; + this.l_Settings_ZeroflowOffsetTestLowerLimit.Size = new System.Drawing.Size(126, 13); + this.l_Settings_ZeroflowOffsetTestLowerLimit.TabIndex = 3; + this.l_Settings_ZeroflowOffsetTestLowerLimit.Text = "Lower Voltage Limit (mV):"; + // + // nUD_Settings_ZeroflowOffsetTestOffsetLimit + // + this.nUD_Settings_ZeroflowOffsetTestOffsetLimit.Location = new System.Drawing.Point(168, 117); + this.nUD_Settings_ZeroflowOffsetTestOffsetLimit.Margin = new System.Windows.Forms.Padding(2); + this.nUD_Settings_ZeroflowOffsetTestOffsetLimit.Maximum = new decimal(new int[] { + 600, + 0, + 0, + 0}); + this.nUD_Settings_ZeroflowOffsetTestOffsetLimit.Minimum = new decimal(new int[] { + 50, + 0, + 0, + 0}); + this.nUD_Settings_ZeroflowOffsetTestOffsetLimit.Name = "nUD_Settings_ZeroflowOffsetTestOffsetLimit"; + this.nUD_Settings_ZeroflowOffsetTestOffsetLimit.Size = new System.Drawing.Size(62, 20); + this.nUD_Settings_ZeroflowOffsetTestOffsetLimit.TabIndex = 12; + this.nUD_Settings_ZeroflowOffsetTestOffsetLimit.Value = new decimal(new int[] { + 300, + 0, + 0, + 0}); + // + // l_Settings_ZeroFlowTestOffsetLimit + // + this.l_Settings_ZeroFlowTestOffsetLimit.AutoSize = true; + this.l_Settings_ZeroFlowTestOffsetLimit.Location = new System.Drawing.Point(25, 119); + this.l_Settings_ZeroFlowTestOffsetLimit.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_Settings_ZeroFlowTestOffsetLimit.Name = "l_Settings_ZeroFlowTestOffsetLimit"; + this.l_Settings_ZeroFlowTestOffsetLimit.Size = new System.Drawing.Size(82, 13); + this.l_Settings_ZeroFlowTestOffsetLimit.TabIndex = 13; + this.l_Settings_ZeroFlowTestOffsetLimit.Text = "Offset Limit (ps):"; + // + // nUD_Settings_ZeroflowOffsetTestSettlingTime + // + this.nUD_Settings_ZeroflowOffsetTestSettlingTime.Location = new System.Drawing.Point(168, 142); + this.nUD_Settings_ZeroflowOffsetTestSettlingTime.Margin = new System.Windows.Forms.Padding(2); + this.nUD_Settings_ZeroflowOffsetTestSettlingTime.Maximum = new decimal(new int[] { + 2000, + 0, + 0, + 0}); + this.nUD_Settings_ZeroflowOffsetTestSettlingTime.Name = "nUD_Settings_ZeroflowOffsetTestSettlingTime"; + this.nUD_Settings_ZeroflowOffsetTestSettlingTime.Size = new System.Drawing.Size(62, 20); + this.nUD_Settings_ZeroflowOffsetTestSettlingTime.TabIndex = 14; + this.nUD_Settings_ZeroflowOffsetTestSettlingTime.Value = new decimal(new int[] { + 60, + 0, + 0, + 0}); + // + // l_Settings_ZeroFlowTestSettlingTime + // + this.l_Settings_ZeroFlowTestSettlingTime.AutoSize = true; + this.l_Settings_ZeroFlowTestSettlingTime.Location = new System.Drawing.Point(25, 144); + this.l_Settings_ZeroFlowTestSettlingTime.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_Settings_ZeroFlowTestSettlingTime.Name = "l_Settings_ZeroFlowTestSettlingTime"; + this.l_Settings_ZeroFlowTestSettlingTime.Size = new System.Drawing.Size(81, 13); + this.l_Settings_ZeroFlowTestSettlingTime.TabIndex = 15; + this.l_Settings_ZeroFlowTestSettlingTime.Text = "Settling time (s):"; + // + // nUD_Settings_ZeroflowOffsetTestNumberOfLines + // + this.nUD_Settings_ZeroflowOffsetTestNumberOfLines.Location = new System.Drawing.Point(168, 168); + this.nUD_Settings_ZeroflowOffsetTestNumberOfLines.Margin = new System.Windows.Forms.Padding(2); + this.nUD_Settings_ZeroflowOffsetTestNumberOfLines.Maximum = new decimal(new int[] { + 50000, + 0, + 0, + 0}); + this.nUD_Settings_ZeroflowOffsetTestNumberOfLines.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.nUD_Settings_ZeroflowOffsetTestNumberOfLines.Name = "nUD_Settings_ZeroflowOffsetTestNumberOfLines"; + this.nUD_Settings_ZeroflowOffsetTestNumberOfLines.Size = new System.Drawing.Size(62, 20); + this.nUD_Settings_ZeroflowOffsetTestNumberOfLines.TabIndex = 16; + this.nUD_Settings_ZeroflowOffsetTestNumberOfLines.Value = new decimal(new int[] { + 9000, + 0, + 0, + 0}); + // + // l_Settings_ZeroflowOffsetTestNumberOfLines + // + this.l_Settings_ZeroflowOffsetTestNumberOfLines.AutoSize = true; + this.l_Settings_ZeroflowOffsetTestNumberOfLines.Location = new System.Drawing.Point(25, 170); + this.l_Settings_ZeroflowOffsetTestNumberOfLines.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_Settings_ZeroflowOffsetTestNumberOfLines.Name = "l_Settings_ZeroflowOffsetTestNumberOfLines"; + this.l_Settings_ZeroflowOffsetTestNumberOfLines.Size = new System.Drawing.Size(83, 13); + this.l_Settings_ZeroflowOffsetTestNumberOfLines.TabIndex = 17; + this.l_Settings_ZeroflowOffsetTestNumberOfLines.Text = "Number of lines:"; + // + // l_Settings_ZeroflowOffsetTestActivityCheckInterval + // + this.l_Settings_ZeroflowOffsetTestActivityCheckInterval.AutoSize = true; + this.l_Settings_ZeroflowOffsetTestActivityCheckInterval.Location = new System.Drawing.Point(25, 194); + this.l_Settings_ZeroflowOffsetTestActivityCheckInterval.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_Settings_ZeroflowOffsetTestActivityCheckInterval.Name = "l_Settings_ZeroflowOffsetTestActivityCheckInterval"; + this.l_Settings_ZeroflowOffsetTestActivityCheckInterval.Size = new System.Drawing.Size(130, 13); + this.l_Settings_ZeroflowOffsetTestActivityCheckInterval.TabIndex = 18; + this.l_Settings_ZeroflowOffsetTestActivityCheckInterval.Text = "Activity Check Interval (s):"; + // + // nUD_Settings_ZeroflowOffsetTestActivityCheckInterval + // + this.nUD_Settings_ZeroflowOffsetTestActivityCheckInterval.Location = new System.Drawing.Point(168, 192); + this.nUD_Settings_ZeroflowOffsetTestActivityCheckInterval.Margin = new System.Windows.Forms.Padding(2); + this.nUD_Settings_ZeroflowOffsetTestActivityCheckInterval.Maximum = new decimal(new int[] { + 15, + 0, + 0, + 0}); + this.nUD_Settings_ZeroflowOffsetTestActivityCheckInterval.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.nUD_Settings_ZeroflowOffsetTestActivityCheckInterval.Name = "nUD_Settings_ZeroflowOffsetTestActivityCheckInterval"; + this.nUD_Settings_ZeroflowOffsetTestActivityCheckInterval.Size = new System.Drawing.Size(62, 20); + this.nUD_Settings_ZeroflowOffsetTestActivityCheckInterval.TabIndex = 19; + this.nUD_Settings_ZeroflowOffsetTestActivityCheckInterval.Value = new decimal(new int[] { + 2, + 0, + 0, + 0}); + // + // cB_OffsetTestLogFiles + // + this.cB_OffsetTestLogFiles.AutoSize = true; + this.cB_OffsetTestLogFiles.Checked = true; + this.cB_OffsetTestLogFiles.CheckState = System.Windows.Forms.CheckState.Checked; + this.cB_OffsetTestLogFiles.Location = new System.Drawing.Point(58, 31); + this.cB_OffsetTestLogFiles.Margin = new System.Windows.Forms.Padding(2); + this.cB_OffsetTestLogFiles.Name = "cB_OffsetTestLogFiles"; + this.cB_OffsetTestLogFiles.Size = new System.Drawing.Size(115, 17); + this.cB_OffsetTestLogFiles.TabIndex = 18; + this.cB_OffsetTestLogFiles.Text = "Generate Log Files"; + this.cB_OffsetTestLogFiles.UseVisualStyleBackColor = true; + // + // gB_Settings_Preparation + // + this.gB_Settings_Preparation.Controls.Add(this.nUD_SettingsPreparationMetersize); + this.gB_Settings_Preparation.Controls.Add(this.l_SettingsPreparationMetersize); + this.gB_Settings_Preparation.Controls.Add(this.nUD_Settings_Preparation_StabiTime); + this.gB_Settings_Preparation.Controls.Add(this.l_Settings_Preparation_StabiTime); + this.gB_Settings_Preparation.Location = new System.Drawing.Point(336, 270); + this.gB_Settings_Preparation.Margin = new System.Windows.Forms.Padding(2); + this.gB_Settings_Preparation.Name = "gB_Settings_Preparation"; + this.gB_Settings_Preparation.Padding = new System.Windows.Forms.Padding(2); + this.gB_Settings_Preparation.Size = new System.Drawing.Size(272, 87); + this.gB_Settings_Preparation.TabIndex = 29; + this.gB_Settings_Preparation.TabStop = false; + this.gB_Settings_Preparation.Text = "Preparation"; + // + // l_Settings_Preparation_StabiTime + // + this.l_Settings_Preparation_StabiTime.AutoSize = true; + this.l_Settings_Preparation_StabiTime.Location = new System.Drawing.Point(24, 24); + this.l_Settings_Preparation_StabiTime.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_Settings_Preparation_StabiTime.Name = "l_Settings_Preparation_StabiTime"; + this.l_Settings_Preparation_StabiTime.Size = new System.Drawing.Size(106, 13); + this.l_Settings_Preparation_StabiTime.TabIndex = 18; + this.l_Settings_Preparation_StabiTime.Text = "Stabilization Time (s):"; + // + // nUD_Settings_Preparation_StabiTime + // + this.nUD_Settings_Preparation_StabiTime.Location = new System.Drawing.Point(168, 22); + this.nUD_Settings_Preparation_StabiTime.Margin = new System.Windows.Forms.Padding(2); + this.nUD_Settings_Preparation_StabiTime.Maximum = new decimal(new int[] { + 2000, + 0, + 0, + 0}); + this.nUD_Settings_Preparation_StabiTime.Minimum = new decimal(new int[] { + 5, + 0, + 0, + 0}); + this.nUD_Settings_Preparation_StabiTime.Name = "nUD_Settings_Preparation_StabiTime"; + this.nUD_Settings_Preparation_StabiTime.Size = new System.Drawing.Size(62, 20); + this.nUD_Settings_Preparation_StabiTime.TabIndex = 18; + this.nUD_Settings_Preparation_StabiTime.Value = new decimal(new int[] { + 6, + 0, + 0, + 0}); + // + // l_SettingsPreparationMetersize + // + this.l_SettingsPreparationMetersize.AutoSize = true; + this.l_SettingsPreparationMetersize.Location = new System.Drawing.Point(25, 50); + this.l_SettingsPreparationMetersize.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_SettingsPreparationMetersize.Name = "l_SettingsPreparationMetersize"; + this.l_SettingsPreparationMetersize.Size = new System.Drawing.Size(55, 13); + this.l_SettingsPreparationMetersize.TabIndex = 19; + this.l_SettingsPreparationMetersize.Text = "Metersize:"; + // + // nUD_SettingsPreparationMetersize + // + this.nUD_SettingsPreparationMetersize.Location = new System.Drawing.Point(168, 50); + this.nUD_SettingsPreparationMetersize.Margin = new System.Windows.Forms.Padding(2); + this.nUD_SettingsPreparationMetersize.Maximum = new decimal(new int[] { + 5, + 0, + 0, + 0}); + this.nUD_SettingsPreparationMetersize.Name = "nUD_SettingsPreparationMetersize"; + this.nUD_SettingsPreparationMetersize.Size = new System.Drawing.Size(62, 20); + this.nUD_SettingsPreparationMetersize.TabIndex = 20; + this.nUD_SettingsPreparationMetersize.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // + // gB_Passwords + // + this.gB_Passwords.Controls.Add(this.tB_PasswordMeter5); + this.gB_Passwords.Controls.Add(this.tB_PasswordMeter10); + this.gB_Passwords.Controls.Add(this.tB_PasswordMeter9); + this.gB_Passwords.Controls.Add(this.tB_PasswordMeter8); + this.gB_Passwords.Controls.Add(this.tB_PasswordMeter7); + this.gB_Passwords.Controls.Add(this.tB_PasswordMeter6); + this.gB_Passwords.Controls.Add(this.tB_PasswordMeter4); + this.gB_Passwords.Controls.Add(this.tB_PasswordMeter3); + this.gB_Passwords.Controls.Add(this.tB_PasswordMeter2); + this.gB_Passwords.Controls.Add(this.tB_PasswordMeter1); + this.gB_Passwords.Controls.Add(this.l_PasswordMeter10); + this.gB_Passwords.Controls.Add(this.l_PasswordMeter9); + this.gB_Passwords.Controls.Add(this.l_PasswordMeter8); + this.gB_Passwords.Controls.Add(this.l_PasswordMeter7); + this.gB_Passwords.Controls.Add(this.l_PasswordMeter6); + this.gB_Passwords.Controls.Add(this.l_PasswordMeter5); + this.gB_Passwords.Controls.Add(this.l_PasswordMeter4); + this.gB_Passwords.Controls.Add(this.l_PasswordMeter3); + this.gB_Passwords.Controls.Add(this.l_PasswordMeter2); + this.gB_Passwords.Controls.Add(this.l_PasswordMeter1); + this.gB_Passwords.Location = new System.Drawing.Point(40, 352); + this.gB_Passwords.Margin = new System.Windows.Forms.Padding(2); + this.gB_Passwords.Name = "gB_Passwords"; + this.gB_Passwords.Padding = new System.Windows.Forms.Padding(2); + this.gB_Passwords.Size = new System.Drawing.Size(272, 288); + this.gB_Passwords.TabIndex = 30; + this.gB_Passwords.TabStop = false; + this.gB_Passwords.Text = "Passwords"; + // + // l_PasswordMeter1 + // + this.l_PasswordMeter1.AutoSize = true; + this.l_PasswordMeter1.Location = new System.Drawing.Point(28, 31); + this.l_PasswordMeter1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_PasswordMeter1.Name = "l_PasswordMeter1"; + this.l_PasswordMeter1.Size = new System.Drawing.Size(54, 13); + this.l_PasswordMeter1.TabIndex = 24; + this.l_PasswordMeter1.Text = "METER1:"; + // + // l_PasswordMeter2 + // + this.l_PasswordMeter2.AutoSize = true; + this.l_PasswordMeter2.Location = new System.Drawing.Point(28, 56); + this.l_PasswordMeter2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_PasswordMeter2.Name = "l_PasswordMeter2"; + this.l_PasswordMeter2.Size = new System.Drawing.Size(54, 13); + this.l_PasswordMeter2.TabIndex = 25; + this.l_PasswordMeter2.Text = "METER2:"; + // + // l_PasswordMeter3 + // + this.l_PasswordMeter3.AutoSize = true; + this.l_PasswordMeter3.Location = new System.Drawing.Point(28, 81); + this.l_PasswordMeter3.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_PasswordMeter3.Name = "l_PasswordMeter3"; + this.l_PasswordMeter3.Size = new System.Drawing.Size(54, 13); + this.l_PasswordMeter3.TabIndex = 26; + this.l_PasswordMeter3.Text = "METER3:"; + // + // l_PasswordMeter4 + // + this.l_PasswordMeter4.AutoSize = true; + this.l_PasswordMeter4.Location = new System.Drawing.Point(28, 106); + this.l_PasswordMeter4.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_PasswordMeter4.Name = "l_PasswordMeter4"; + this.l_PasswordMeter4.Size = new System.Drawing.Size(54, 13); + this.l_PasswordMeter4.TabIndex = 27; + this.l_PasswordMeter4.Text = "METER4:"; + // + // l_PasswordMeter5 + // + this.l_PasswordMeter5.AutoSize = true; + this.l_PasswordMeter5.Location = new System.Drawing.Point(28, 130); + this.l_PasswordMeter5.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_PasswordMeter5.Name = "l_PasswordMeter5"; + this.l_PasswordMeter5.Size = new System.Drawing.Size(54, 13); + this.l_PasswordMeter5.TabIndex = 28; + this.l_PasswordMeter5.Text = "METER5:"; + // + // l_PasswordMeter6 + // + this.l_PasswordMeter6.AutoSize = true; + this.l_PasswordMeter6.Location = new System.Drawing.Point(28, 155); + this.l_PasswordMeter6.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_PasswordMeter6.Name = "l_PasswordMeter6"; + this.l_PasswordMeter6.Size = new System.Drawing.Size(54, 13); + this.l_PasswordMeter6.TabIndex = 29; + this.l_PasswordMeter6.Text = "METER6:"; + // + // l_PasswordMeter7 + // + this.l_PasswordMeter7.AutoSize = true; + this.l_PasswordMeter7.Location = new System.Drawing.Point(28, 180); + this.l_PasswordMeter7.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_PasswordMeter7.Name = "l_PasswordMeter7"; + this.l_PasswordMeter7.Size = new System.Drawing.Size(54, 13); + this.l_PasswordMeter7.TabIndex = 30; + this.l_PasswordMeter7.Text = "METER7:"; + // + // l_PasswordMeter8 + // + this.l_PasswordMeter8.AutoSize = true; + this.l_PasswordMeter8.Location = new System.Drawing.Point(28, 205); + this.l_PasswordMeter8.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_PasswordMeter8.Name = "l_PasswordMeter8"; + this.l_PasswordMeter8.Size = new System.Drawing.Size(54, 13); + this.l_PasswordMeter8.TabIndex = 31; + this.l_PasswordMeter8.Text = "METER8:"; + // + // l_PasswordMeter9 + // + this.l_PasswordMeter9.AutoSize = true; + this.l_PasswordMeter9.Location = new System.Drawing.Point(28, 230); + this.l_PasswordMeter9.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_PasswordMeter9.Name = "l_PasswordMeter9"; + this.l_PasswordMeter9.Size = new System.Drawing.Size(54, 13); + this.l_PasswordMeter9.TabIndex = 32; + this.l_PasswordMeter9.Text = "METER9:"; + // + // l_PasswordMeter10 + // + this.l_PasswordMeter10.AutoSize = true; + this.l_PasswordMeter10.Location = new System.Drawing.Point(28, 254); + this.l_PasswordMeter10.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_PasswordMeter10.Name = "l_PasswordMeter10"; + this.l_PasswordMeter10.Size = new System.Drawing.Size(60, 13); + this.l_PasswordMeter10.TabIndex = 33; + this.l_PasswordMeter10.Text = "METER10:"; + // + // tB_PasswordMeter1 + // + this.tB_PasswordMeter1.Location = new System.Drawing.Point(106, 29); + this.tB_PasswordMeter1.Margin = new System.Windows.Forms.Padding(2); + this.tB_PasswordMeter1.Name = "tB_PasswordMeter1"; + this.tB_PasswordMeter1.Size = new System.Drawing.Size(130, 20); + this.tB_PasswordMeter1.TabIndex = 34; + // + // tB_PasswordMeter2 + // + this.tB_PasswordMeter2.Location = new System.Drawing.Point(106, 53); + this.tB_PasswordMeter2.Margin = new System.Windows.Forms.Padding(2); + this.tB_PasswordMeter2.Name = "tB_PasswordMeter2"; + this.tB_PasswordMeter2.Size = new System.Drawing.Size(130, 20); + this.tB_PasswordMeter2.TabIndex = 35; + // + // tB_PasswordMeter3 + // + this.tB_PasswordMeter3.Location = new System.Drawing.Point(106, 77); + this.tB_PasswordMeter3.Margin = new System.Windows.Forms.Padding(2); + this.tB_PasswordMeter3.Name = "tB_PasswordMeter3"; + this.tB_PasswordMeter3.Size = new System.Drawing.Size(130, 20); + this.tB_PasswordMeter3.TabIndex = 36; + // + // tB_PasswordMeter4 + // + this.tB_PasswordMeter4.Location = new System.Drawing.Point(106, 106); + this.tB_PasswordMeter4.Margin = new System.Windows.Forms.Padding(2); + this.tB_PasswordMeter4.Name = "tB_PasswordMeter4"; + this.tB_PasswordMeter4.Size = new System.Drawing.Size(130, 20); + this.tB_PasswordMeter4.TabIndex = 37; + // + // tB_PasswordMeter6 + // + this.tB_PasswordMeter6.Location = new System.Drawing.Point(106, 154); + this.tB_PasswordMeter6.Margin = new System.Windows.Forms.Padding(2); + this.tB_PasswordMeter6.Name = "tB_PasswordMeter6"; + this.tB_PasswordMeter6.Size = new System.Drawing.Size(130, 20); + this.tB_PasswordMeter6.TabIndex = 39; + // + // tB_PasswordMeter7 + // + this.tB_PasswordMeter7.Location = new System.Drawing.Point(106, 178); + this.tB_PasswordMeter7.Margin = new System.Windows.Forms.Padding(2); + this.tB_PasswordMeter7.Name = "tB_PasswordMeter7"; + this.tB_PasswordMeter7.Size = new System.Drawing.Size(130, 20); + this.tB_PasswordMeter7.TabIndex = 40; + // + // tB_PasswordMeter8 + // + this.tB_PasswordMeter8.Location = new System.Drawing.Point(106, 206); + this.tB_PasswordMeter8.Margin = new System.Windows.Forms.Padding(2); + this.tB_PasswordMeter8.Name = "tB_PasswordMeter8"; + this.tB_PasswordMeter8.Size = new System.Drawing.Size(130, 20); + this.tB_PasswordMeter8.TabIndex = 41; + // + // tB_PasswordMeter9 + // + this.tB_PasswordMeter9.Location = new System.Drawing.Point(106, 230); + this.tB_PasswordMeter9.Margin = new System.Windows.Forms.Padding(2); + this.tB_PasswordMeter9.Name = "tB_PasswordMeter9"; + this.tB_PasswordMeter9.Size = new System.Drawing.Size(130, 20); + this.tB_PasswordMeter9.TabIndex = 42; + // + // tB_PasswordMeter10 + // + this.tB_PasswordMeter10.Location = new System.Drawing.Point(106, 254); + this.tB_PasswordMeter10.Margin = new System.Windows.Forms.Padding(2); + this.tB_PasswordMeter10.Name = "tB_PasswordMeter10"; + this.tB_PasswordMeter10.Size = new System.Drawing.Size(130, 20); + this.tB_PasswordMeter10.TabIndex = 43; + // + // tB_PasswordMeter5 + // + this.tB_PasswordMeter5.Location = new System.Drawing.Point(106, 130); + this.tB_PasswordMeter5.Margin = new System.Windows.Forms.Padding(2); + this.tB_PasswordMeter5.Name = "tB_PasswordMeter5"; + this.tB_PasswordMeter5.Size = new System.Drawing.Size(130, 20); + this.tB_PasswordMeter5.TabIndex = 44; + // + // gB_Settings_TemperatureCalibration + // + this.gB_Settings_TemperatureCalibration.Controls.Add(this.cB_TempManualAcquisition); + this.gB_Settings_TemperatureCalibration.Controls.Add(this.lThermo2); + this.gB_Settings_TemperatureCalibration.Controls.Add(this.lPasswordThermo1); + this.gB_Settings_TemperatureCalibration.Controls.Add(this.tB_PasswordThermo2); + this.gB_Settings_TemperatureCalibration.Controls.Add(this.tB_PasswordThermo1); + this.gB_Settings_TemperatureCalibration.Location = new System.Drawing.Point(624, 72); + this.gB_Settings_TemperatureCalibration.Margin = new System.Windows.Forms.Padding(2); + this.gB_Settings_TemperatureCalibration.Name = "gB_Settings_TemperatureCalibration"; + this.gB_Settings_TemperatureCalibration.Padding = new System.Windows.Forms.Padding(2); + this.gB_Settings_TemperatureCalibration.Size = new System.Drawing.Size(272, 144); + this.gB_Settings_TemperatureCalibration.TabIndex = 28; + this.gB_Settings_TemperatureCalibration.TabStop = false; + this.gB_Settings_TemperatureCalibration.Text = "Temperature Calibration"; + // + // tB_PasswordThermo1 + // + this.tB_PasswordThermo1.Location = new System.Drawing.Point(90, 35); + this.tB_PasswordThermo1.Margin = new System.Windows.Forms.Padding(2); + this.tB_PasswordThermo1.Name = "tB_PasswordThermo1"; + this.tB_PasswordThermo1.Size = new System.Drawing.Size(121, 20); + this.tB_PasswordThermo1.TabIndex = 13; + // + // tB_PasswordThermo2 + // + this.tB_PasswordThermo2.Location = new System.Drawing.Point(90, 64); + this.tB_PasswordThermo2.Margin = new System.Windows.Forms.Padding(2); + this.tB_PasswordThermo2.Name = "tB_PasswordThermo2"; + this.tB_PasswordThermo2.Size = new System.Drawing.Size(121, 20); + this.tB_PasswordThermo2.TabIndex = 14; + // + // lPasswordThermo1 + // + this.lPasswordThermo1.AutoSize = true; + this.lPasswordThermo1.Location = new System.Drawing.Point(18, 35); + this.lPasswordThermo1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.lPasswordThermo1.Name = "lPasswordThermo1"; + this.lPasswordThermo1.Size = new System.Drawing.Size(52, 13); + this.lPasswordThermo1.TabIndex = 15; + this.lPasswordThermo1.Text = "Thermo1:"; + // + // lThermo2 + // + this.lThermo2.AutoSize = true; + this.lThermo2.Location = new System.Drawing.Point(18, 69); + this.lThermo2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.lThermo2.Name = "lThermo2"; + this.lThermo2.Size = new System.Drawing.Size(52, 13); + this.lThermo2.TabIndex = 16; + this.lThermo2.Text = "Thermo2:"; + // + // cB_TempManualAcquisition + // + this.cB_TempManualAcquisition.AutoSize = true; + this.cB_TempManualAcquisition.Location = new System.Drawing.Point(42, 117); + this.cB_TempManualAcquisition.Margin = new System.Windows.Forms.Padding(2); + this.cB_TempManualAcquisition.Name = "cB_TempManualAcquisition"; + this.cB_TempManualAcquisition.Size = new System.Drawing.Size(178, 17); + this.cB_TempManualAcquisition.TabIndex = 17; + this.cB_TempManualAcquisition.Text = "Manual Temperature Acquisition"; + this.cB_TempManualAcquisition.UseVisualStyleBackColor = true; + // + // gB_SettingsTempMonitor + // + this.gB_SettingsTempMonitor.Controls.Add(this.nUD_SettingsTempMonitorDeviation); + this.gB_SettingsTempMonitor.Controls.Add(this.nUD_SettingsTempMonitorLowerValue); + this.gB_SettingsTempMonitor.Controls.Add(this.nUD_SettingsTempMonitorUpperValue); + this.gB_SettingsTempMonitor.Controls.Add(this.l_SettingsTempMonitorDeviation); + this.gB_SettingsTempMonitor.Controls.Add(this.l_SettingsTempMonitorLowerValue); + this.gB_SettingsTempMonitor.Controls.Add(this.l_SettingsTempMonitorUpperValue); + this.gB_SettingsTempMonitor.Location = new System.Drawing.Point(336, 456); + this.gB_SettingsTempMonitor.Margin = new System.Windows.Forms.Padding(2); + this.gB_SettingsTempMonitor.Name = "gB_SettingsTempMonitor"; + this.gB_SettingsTempMonitor.Padding = new System.Windows.Forms.Padding(2); + this.gB_SettingsTempMonitor.Size = new System.Drawing.Size(274, 171); + this.gB_SettingsTempMonitor.TabIndex = 32; + this.gB_SettingsTempMonitor.TabStop = false; + this.gB_SettingsTempMonitor.Text = "Temperature Monitoring"; + // + // l_SettingsTempMonitorUpperValue + // + this.l_SettingsTempMonitorUpperValue.AutoSize = true; + this.l_SettingsTempMonitorUpperValue.Location = new System.Drawing.Point(24, 34); + this.l_SettingsTempMonitorUpperValue.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_SettingsTempMonitorUpperValue.Name = "l_SettingsTempMonitorUpperValue"; + this.l_SettingsTempMonitorUpperValue.Size = new System.Drawing.Size(89, 13); + this.l_SettingsTempMonitorUpperValue.TabIndex = 0; + this.l_SettingsTempMonitorUpperValue.Text = "Upper Value [°C]:"; + // + // l_SettingsTempMonitorLowerValue + // + this.l_SettingsTempMonitorLowerValue.AutoSize = true; + this.l_SettingsTempMonitorLowerValue.Location = new System.Drawing.Point(24, 67); + this.l_SettingsTempMonitorLowerValue.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_SettingsTempMonitorLowerValue.Name = "l_SettingsTempMonitorLowerValue"; + this.l_SettingsTempMonitorLowerValue.Size = new System.Drawing.Size(89, 13); + this.l_SettingsTempMonitorLowerValue.TabIndex = 1; + this.l_SettingsTempMonitorLowerValue.Text = "Lower Value [°C]:"; + // + // l_SettingsTempMonitorDeviation + // + this.l_SettingsTempMonitorDeviation.AutoSize = true; + this.l_SettingsTempMonitorDeviation.Location = new System.Drawing.Point(24, 106); + this.l_SettingsTempMonitorDeviation.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_SettingsTempMonitorDeviation.Name = "l_SettingsTempMonitorDeviation"; + this.l_SettingsTempMonitorDeviation.Size = new System.Drawing.Size(75, 13); + this.l_SettingsTempMonitorDeviation.TabIndex = 2; + this.l_SettingsTempMonitorDeviation.Text = "Deviation [°C]:"; + // + // nUD_SettingsTempMonitorUpperValue + // + this.nUD_SettingsTempMonitorUpperValue.DecimalPlaces = 1; + this.nUD_SettingsTempMonitorUpperValue.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.nUD_SettingsTempMonitorUpperValue.Location = new System.Drawing.Point(130, 34); + this.nUD_SettingsTempMonitorUpperValue.Margin = new System.Windows.Forms.Padding(2); + this.nUD_SettingsTempMonitorUpperValue.Maximum = new decimal(new int[] { + 50, + 0, + 0, + 0}); + this.nUD_SettingsTempMonitorUpperValue.Name = "nUD_SettingsTempMonitorUpperValue"; + this.nUD_SettingsTempMonitorUpperValue.Size = new System.Drawing.Size(96, 20); + this.nUD_SettingsTempMonitorUpperValue.TabIndex = 3; + this.nUD_SettingsTempMonitorUpperValue.Value = new decimal(new int[] { + 35, + 0, + 0, + 0}); + // + // nUD_SettingsTempMonitorLowerValue + // + this.nUD_SettingsTempMonitorLowerValue.DecimalPlaces = 1; + this.nUD_SettingsTempMonitorLowerValue.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.nUD_SettingsTempMonitorLowerValue.Location = new System.Drawing.Point(130, 67); + this.nUD_SettingsTempMonitorLowerValue.Margin = new System.Windows.Forms.Padding(2); + this.nUD_SettingsTempMonitorLowerValue.Maximum = new decimal(new int[] { + 30, + 0, + 0, + 0}); + this.nUD_SettingsTempMonitorLowerValue.Name = "nUD_SettingsTempMonitorLowerValue"; + this.nUD_SettingsTempMonitorLowerValue.Size = new System.Drawing.Size(96, 20); + this.nUD_SettingsTempMonitorLowerValue.TabIndex = 4; + this.nUD_SettingsTempMonitorLowerValue.Value = new decimal(new int[] { + 10, + 0, + 0, + 0}); + // + // nUD_SettingsTempMonitorDeviation + // + this.nUD_SettingsTempMonitorDeviation.DecimalPlaces = 1; + this.nUD_SettingsTempMonitorDeviation.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.nUD_SettingsTempMonitorDeviation.Location = new System.Drawing.Point(130, 106); + this.nUD_SettingsTempMonitorDeviation.Margin = new System.Windows.Forms.Padding(2); + this.nUD_SettingsTempMonitorDeviation.Maximum = new decimal(new int[] { + 5, + 0, + 0, + 0}); + this.nUD_SettingsTempMonitorDeviation.Name = "nUD_SettingsTempMonitorDeviation"; + this.nUD_SettingsTempMonitorDeviation.Size = new System.Drawing.Size(96, 20); + this.nUD_SettingsTempMonitorDeviation.TabIndex = 5; + this.nUD_SettingsTempMonitorDeviation.Value = new decimal(new int[] { + 5, + 0, + 0, + 65536}); + // + // gB_ComportSetup + // + this.gB_ComportSetup.Controls.Add(this.BtnOpenSetup); + this.gB_ComportSetup.Location = new System.Drawing.Point(336, 366); + this.gB_ComportSetup.Margin = new System.Windows.Forms.Padding(2); + this.gB_ComportSetup.Name = "gB_ComportSetup"; + this.gB_ComportSetup.Padding = new System.Windows.Forms.Padding(2); + this.gB_ComportSetup.Size = new System.Drawing.Size(272, 87); + this.gB_ComportSetup.TabIndex = 30; + this.gB_ComportSetup.TabStop = false; + this.gB_ComportSetup.Text = "COM Port Setup"; + // + // BtnOpenSetup + // + this.BtnOpenSetup.Location = new System.Drawing.Point(5, 29); + this.BtnOpenSetup.Name = "BtnOpenSetup"; + this.BtnOpenSetup.Size = new System.Drawing.Size(262, 37); + this.BtnOpenSetup.TabIndex = 0; + this.BtnOpenSetup.Text = "Open Setup"; + this.BtnOpenSetup.UseVisualStyleBackColor = true; + this.BtnOpenSetup.Click += new System.EventHandler(this.BtnOpenSetup_Click); + // + // tab_Report + // + this.tab_Report.BackColor = System.Drawing.Color.Honeydew; + this.tab_Report.Controls.Add(this.pictureBox1); + this.tab_Report.Controls.Add(this.groupBox_report); + this.tab_Report.Location = new System.Drawing.Point(4, 22); + this.tab_Report.Margin = new System.Windows.Forms.Padding(2); + this.tab_Report.Name = "tab_Report"; + this.tab_Report.Padding = new System.Windows.Forms.Padding(2); + this.tab_Report.Size = new System.Drawing.Size(943, 674); + this.tab_Report.TabIndex = 1; + this.tab_Report.Text = "Report"; + // + // groupBox_report + // + this.groupBox_report.Anchor = System.Windows.Forms.AnchorStyles.None; + this.groupBox_report.Controls.Add(this.gB_ReportTitlepage); + this.groupBox_report.Controls.Add(this.btn_Report_Generate); + this.groupBox_report.Location = new System.Drawing.Point(231, 12); + this.groupBox_report.Margin = new System.Windows.Forms.Padding(2); + this.groupBox_report.Name = "groupBox_report"; + this.groupBox_report.Padding = new System.Windows.Forms.Padding(2); + this.groupBox_report.Size = new System.Drawing.Size(444, 654); + this.groupBox_report.TabIndex = 2; + this.groupBox_report.TabStop = false; + this.groupBox_report.Text = "Select Options"; + // + // btn_Report_Generate + // + this.btn_Report_Generate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btn_Report_Generate.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btn_Report_Generate.Location = new System.Drawing.Point(144, 477); + this.btn_Report_Generate.Margin = new System.Windows.Forms.Padding(2); + this.btn_Report_Generate.Name = "btn_Report_Generate"; + this.btn_Report_Generate.Size = new System.Drawing.Size(168, 112); + this.btn_Report_Generate.TabIndex = 0; + this.btn_Report_Generate.Text = "Generate Report"; + this.btn_Report_Generate.UseVisualStyleBackColor = true; + // + // gB_ReportTitlepage + // + this.gB_ReportTitlepage.Controls.Add(this.rTB_ReportEnterSerialNumber); + this.gB_ReportTitlepage.Controls.Add(this.label_Report_EnterSerialNumber); + this.gB_ReportTitlepage.Controls.Add(this.l_ReportIntro); + this.gB_ReportTitlepage.Controls.Add(this.rtB_ReportTitlepageIntro); + this.gB_ReportTitlepage.Controls.Add(this.rTB_ReportEnterTitle); + this.gB_ReportTitlepage.Controls.Add(this.label_Report_EnterTitle); + this.gB_ReportTitlepage.Controls.Add(this.label_Report_EnterOperator); + this.gB_ReportTitlepage.Controls.Add(this.rTB_ReportEnterDate); + this.gB_ReportTitlepage.Controls.Add(this.rTB_ReportEnterOperator); + this.gB_ReportTitlepage.Controls.Add(this.label_Report_EnterDate); + this.gB_ReportTitlepage.Location = new System.Drawing.Point(18, 16); + this.gB_ReportTitlepage.Margin = new System.Windows.Forms.Padding(2); + this.gB_ReportTitlepage.Name = "gB_ReportTitlepage"; + this.gB_ReportTitlepage.Padding = new System.Windows.Forms.Padding(2); + this.gB_ReportTitlepage.Size = new System.Drawing.Size(400, 378); + this.gB_ReportTitlepage.TabIndex = 16; + this.gB_ReportTitlepage.TabStop = false; + this.gB_ReportTitlepage.Text = "Titelpage"; + // + // label_Report_EnterDate + // + this.label_Report_EnterDate.AutoSize = true; + this.label_Report_EnterDate.Location = new System.Drawing.Point(27, 48); + this.label_Report_EnterDate.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.label_Report_EnterDate.Name = "label_Report_EnterDate"; + this.label_Report_EnterDate.Size = new System.Drawing.Size(93, 13); + this.label_Report_EnterDate.TabIndex = 11; + this.label_Report_EnterDate.Text = "Please enter date:"; + // + // rTB_ReportEnterOperator + // + this.rTB_ReportEnterOperator.Location = new System.Drawing.Point(181, 69); + this.rTB_ReportEnterOperator.Margin = new System.Windows.Forms.Padding(2); + this.rTB_ReportEnterOperator.Name = "rTB_ReportEnterOperator"; + this.rTB_ReportEnterOperator.Size = new System.Drawing.Size(177, 21); + this.rTB_ReportEnterOperator.TabIndex = 13; + this.rTB_ReportEnterOperator.Text = "[John Doe]"; + // + // rTB_ReportEnterDate + // + this.rTB_ReportEnterDate.Location = new System.Drawing.Point(181, 46); + this.rTB_ReportEnterDate.Margin = new System.Windows.Forms.Padding(2); + this.rTB_ReportEnterDate.Name = "rTB_ReportEnterDate"; + this.rTB_ReportEnterDate.Size = new System.Drawing.Size(177, 21); + this.rTB_ReportEnterDate.TabIndex = 12; + this.rTB_ReportEnterDate.Text = ""; + // + // label_Report_EnterOperator + // + this.label_Report_EnterOperator.AutoSize = true; + this.label_Report_EnterOperator.Location = new System.Drawing.Point(27, 70); + this.label_Report_EnterOperator.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.label_Report_EnterOperator.Name = "label_Report_EnterOperator"; + this.label_Report_EnterOperator.Size = new System.Drawing.Size(111, 13); + this.label_Report_EnterOperator.TabIndex = 14; + this.label_Report_EnterOperator.Text = "Please enter operator:"; + // + // label_Report_EnterTitle + // + this.label_Report_EnterTitle.AutoSize = true; + this.label_Report_EnterTitle.Location = new System.Drawing.Point(27, 26); + this.label_Report_EnterTitle.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.label_Report_EnterTitle.Name = "label_Report_EnterTitle"; + this.label_Report_EnterTitle.Size = new System.Drawing.Size(88, 13); + this.label_Report_EnterTitle.TabIndex = 9; + this.label_Report_EnterTitle.Text = "Please enter title:"; + // + // rTB_ReportEnterTitle + // + this.rTB_ReportEnterTitle.Location = new System.Drawing.Point(181, 23); + this.rTB_ReportEnterTitle.Margin = new System.Windows.Forms.Padding(2); + this.rTB_ReportEnterTitle.Name = "rTB_ReportEnterTitle"; + this.rTB_ReportEnterTitle.Size = new System.Drawing.Size(177, 21); + this.rTB_ReportEnterTitle.TabIndex = 10; + this.rTB_ReportEnterTitle.Text = "Zeroflow Calibration Report"; + // + // rtB_ReportTitlepageIntro + // + this.rtB_ReportTitlepageIntro.Location = new System.Drawing.Point(30, 132); + this.rtB_ReportTitlepageIntro.Margin = new System.Windows.Forms.Padding(2); + this.rtB_ReportTitlepageIntro.Name = "rtB_ReportTitlepageIntro"; + this.rtB_ReportTitlepageIntro.Size = new System.Drawing.Size(345, 224); + this.rtB_ReportTitlepageIntro.TabIndex = 15; + this.rtB_ReportTitlepageIntro.Text = resources.GetString("rtB_ReportTitlepageIntro.Text"); + // + // l_ReportIntro + // + this.l_ReportIntro.AutoSize = true; + this.l_ReportIntro.Location = new System.Drawing.Point(27, 116); + this.l_ReportIntro.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_ReportIntro.Name = "l_ReportIntro"; + this.l_ReportIntro.Size = new System.Drawing.Size(82, 13); + this.l_ReportIntro.TabIndex = 16; + this.l_ReportIntro.Text = "Enter Comment:"; + // + // label_Report_EnterSerialNumber + // + this.label_Report_EnterSerialNumber.AutoSize = true; + this.label_Report_EnterSerialNumber.Location = new System.Drawing.Point(27, 91); + this.label_Report_EnterSerialNumber.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.label_Report_EnterSerialNumber.Name = "label_Report_EnterSerialNumber"; + this.label_Report_EnterSerialNumber.Size = new System.Drawing.Size(138, 13); + this.label_Report_EnterSerialNumber.TabIndex = 17; + this.label_Report_EnterSerialNumber.Text = "Please enter Serial Number:"; + // + // rTB_ReportEnterSerialNumber + // + this.rTB_ReportEnterSerialNumber.Location = new System.Drawing.Point(181, 91); + this.rTB_ReportEnterSerialNumber.Margin = new System.Windows.Forms.Padding(2); + this.rTB_ReportEnterSerialNumber.Name = "rTB_ReportEnterSerialNumber"; + this.rTB_ReportEnterSerialNumber.Size = new System.Drawing.Size(177, 21); + this.rTB_ReportEnterSerialNumber.TabIndex = 18; + this.rTB_ReportEnterSerialNumber.Text = ""; + // + // pictureBox1 + // + this.pictureBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.pictureBox1.BackColor = System.Drawing.Color.Transparent; + this.pictureBox1.ErrorImage = ((System.Drawing.Image)(resources.GetObject("pictureBox1.ErrorImage"))); + this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image"))); + this.pictureBox1.InitialImage = ((System.Drawing.Image)(resources.GetObject("pictureBox1.InitialImage"))); + this.pictureBox1.Location = new System.Drawing.Point(857, 35); + this.pictureBox1.Margin = new System.Windows.Forms.Padding(2); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(53, 40); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBox1.TabIndex = 27; + this.pictureBox1.TabStop = false; + // + // tab_Maintab + // + this.tab_Maintab.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tab_Maintab.Controls.Add(this.tab_Report); + this.tab_Maintab.Controls.Add(this.tab_Settings); + this.tab_Maintab.Controls.Add(this.tab_About); + this.tab_Maintab.Controls.Add(this.tab_ZeroFlowCal); + this.tab_Maintab.Location = new System.Drawing.Point(34, 24); + this.tab_Maintab.Margin = new System.Windows.Forms.Padding(2); + this.tab_Maintab.Name = "tab_Maintab"; + this.tab_Maintab.SelectedIndex = 0; + this.tab_Maintab.Size = new System.Drawing.Size(951, 700); + this.tab_Maintab.SizeMode = System.Windows.Forms.TabSizeMode.FillToRight; + this.tab_Maintab.TabIndex = 1; + // + // cB_SinglePath + // + this.cB_SinglePath.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cB_SinglePath.AutoSize = true; + this.cB_SinglePath.Location = new System.Drawing.Point(736, 268); + this.cB_SinglePath.Margin = new System.Windows.Forms.Padding(2); + this.cB_SinglePath.Name = "cB_SinglePath"; + this.cB_SinglePath.Size = new System.Drawing.Size(87, 17); + this.cB_SinglePath.TabIndex = 66; + this.cB_SinglePath.Text = "Single PATH"; + this.cB_SinglePath.UseVisualStyleBackColor = true; + // + // lbLanguage + // + this.lbLanguage.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.lbLanguage.FormattingEnabled = true; + this.lbLanguage.Items.AddRange(new object[] { + "Deutsch", + "English"}); + this.lbLanguage.Location = new System.Drawing.Point(624, 220); + this.lbLanguage.Margin = new System.Windows.Forms.Padding(2); + this.lbLanguage.Name = "lbLanguage"; + this.lbLanguage.Size = new System.Drawing.Size(97, 30); + this.lbLanguage.TabIndex = 65; + // + // p_ZeroFlowCal_Amplitude + // + this.p_ZeroFlowCal_Amplitude.BackColor = System.Drawing.Color.Gainsboro; + this.p_ZeroFlowCal_Amplitude.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.p_ZeroFlowCal_Amplitude.Controls.Add(this.l_ZeroFlowCal_Amplitude); + this.p_ZeroFlowCal_Amplitude.Location = new System.Drawing.Point(252, 138); + this.p_ZeroFlowCal_Amplitude.Margin = new System.Windows.Forms.Padding(2); + this.p_ZeroFlowCal_Amplitude.Name = "p_ZeroFlowCal_Amplitude"; + this.p_ZeroFlowCal_Amplitude.Size = new System.Drawing.Size(121, 65); + this.p_ZeroFlowCal_Amplitude.TabIndex = 32; + // + // l_ZeroFlowCal_Amplitude + // + this.l_ZeroFlowCal_Amplitude.AutoSize = true; + this.l_ZeroFlowCal_Amplitude.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_ZeroFlowCal_Amplitude.ForeColor = System.Drawing.Color.Gray; + this.l_ZeroFlowCal_Amplitude.Location = new System.Drawing.Point(12, 15); + this.l_ZeroFlowCal_Amplitude.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_ZeroFlowCal_Amplitude.Name = "l_ZeroFlowCal_Amplitude"; + this.l_ZeroFlowCal_Amplitude.Size = new System.Drawing.Size(95, 34); + this.l_ZeroFlowCal_Amplitude.TabIndex = 39; + this.l_ZeroFlowCal_Amplitude.Text = "AMPLITUDE\r\nTEST"; + this.l_ZeroFlowCal_Amplitude.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // p_ZeroFlowCal_Prepare + // + this.p_ZeroFlowCal_Prepare.BackColor = System.Drawing.Color.Gainsboro; + this.p_ZeroFlowCal_Prepare.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.p_ZeroFlowCal_Prepare.Controls.Add(this.l_ZeroFlowCal_Prepare); + this.p_ZeroFlowCal_Prepare.Location = new System.Drawing.Point(132, 138); + this.p_ZeroFlowCal_Prepare.Margin = new System.Windows.Forms.Padding(2); + this.p_ZeroFlowCal_Prepare.Name = "p_ZeroFlowCal_Prepare"; + this.p_ZeroFlowCal_Prepare.Size = new System.Drawing.Size(121, 65); + this.p_ZeroFlowCal_Prepare.TabIndex = 31; + // + // l_ZeroFlowCal_Prepare + // + this.l_ZeroFlowCal_Prepare.AutoSize = true; + this.l_ZeroFlowCal_Prepare.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_ZeroFlowCal_Prepare.ForeColor = System.Drawing.Color.Gray; + this.l_ZeroFlowCal_Prepare.Location = new System.Drawing.Point(18, 22); + this.l_ZeroFlowCal_Prepare.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_ZeroFlowCal_Prepare.Name = "l_ZeroFlowCal_Prepare"; + this.l_ZeroFlowCal_Prepare.Size = new System.Drawing.Size(80, 17); + this.l_ZeroFlowCal_Prepare.TabIndex = 39; + this.l_ZeroFlowCal_Prepare.Text = "PREPARE"; + // + // p_ZeroFlowCal_TempCal + // + this.p_ZeroFlowCal_TempCal.BackColor = System.Drawing.Color.Gainsboro; + this.p_ZeroFlowCal_TempCal.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.p_ZeroFlowCal_TempCal.Controls.Add(this.l_ZeroFlowCal_TempCal); + this.p_ZeroFlowCal_TempCal.Location = new System.Drawing.Point(373, 138); + this.p_ZeroFlowCal_TempCal.Margin = new System.Windows.Forms.Padding(2); + this.p_ZeroFlowCal_TempCal.Name = "p_ZeroFlowCal_TempCal"; + this.p_ZeroFlowCal_TempCal.Size = new System.Drawing.Size(121, 65); + this.p_ZeroFlowCal_TempCal.TabIndex = 41; + // + // l_ZeroFlowCal_TempCal + // + this.l_ZeroFlowCal_TempCal.AutoSize = true; + this.l_ZeroFlowCal_TempCal.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_ZeroFlowCal_TempCal.ForeColor = System.Drawing.Color.Gray; + this.l_ZeroFlowCal_TempCal.Location = new System.Drawing.Point(0, 12); + this.l_ZeroFlowCal_TempCal.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_ZeroFlowCal_TempCal.Name = "l_ZeroFlowCal_TempCal"; + this.l_ZeroFlowCal_TempCal.Size = new System.Drawing.Size(123, 34); + this.l_ZeroFlowCal_TempCal.TabIndex = 40; + this.l_ZeroFlowCal_TempCal.Text = "TEMPERATURE\r\nCALIBRATION"; + this.l_ZeroFlowCal_TempCal.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // p_ZeroFlowCal_Detect + // + this.p_ZeroFlowCal_Detect.BackColor = System.Drawing.Color.Gainsboro; + this.p_ZeroFlowCal_Detect.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.p_ZeroFlowCal_Detect.Controls.Add(this.l_ZeroFlowCal_Detect); + this.p_ZeroFlowCal_Detect.Location = new System.Drawing.Point(12, 138); + this.p_ZeroFlowCal_Detect.Margin = new System.Windows.Forms.Padding(2); + this.p_ZeroFlowCal_Detect.Name = "p_ZeroFlowCal_Detect"; + this.p_ZeroFlowCal_Detect.Size = new System.Drawing.Size(121, 65); + this.p_ZeroFlowCal_Detect.TabIndex = 40; + // + // l_ZeroFlowCal_Detect + // + this.l_ZeroFlowCal_Detect.AutoSize = true; + this.l_ZeroFlowCal_Detect.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_ZeroFlowCal_Detect.ForeColor = System.Drawing.Color.Gray; + this.l_ZeroFlowCal_Detect.Location = new System.Drawing.Point(24, 22); + this.l_ZeroFlowCal_Detect.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_ZeroFlowCal_Detect.Name = "l_ZeroFlowCal_Detect"; + this.l_ZeroFlowCal_Detect.Size = new System.Drawing.Size(69, 17); + this.l_ZeroFlowCal_Detect.TabIndex = 39; + this.l_ZeroFlowCal_Detect.Text = "DETECT"; + // + // l_ZeroFlowCal_Resttime + // + this.l_ZeroFlowCal_Resttime.AutoSize = true; + this.l_ZeroFlowCal_Resttime.Location = new System.Drawing.Point(534, 24); + this.l_ZeroFlowCal_Resttime.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_ZeroFlowCal_Resttime.Name = "l_ZeroFlowCal_Resttime"; + this.l_ZeroFlowCal_Resttime.Size = new System.Drawing.Size(120, 13); + this.l_ZeroFlowCal_Resttime.TabIndex = 36; + this.l_ZeroFlowCal_Resttime.Text = "Estimated time to finish: "; + this.l_ZeroFlowCal_Resttime.Visible = false; + // + // p_ZeroFlowCal_Offset + // + this.p_ZeroFlowCal_Offset.BackColor = System.Drawing.Color.Gainsboro; + this.p_ZeroFlowCal_Offset.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.p_ZeroFlowCal_Offset.Controls.Add(this.l_ZeroFlowCal_Offset); + this.p_ZeroFlowCal_Offset.Location = new System.Drawing.Point(494, 138); + this.p_ZeroFlowCal_Offset.Margin = new System.Windows.Forms.Padding(2); + this.p_ZeroFlowCal_Offset.Name = "p_ZeroFlowCal_Offset"; + this.p_ZeroFlowCal_Offset.Size = new System.Drawing.Size(121, 65); + this.p_ZeroFlowCal_Offset.TabIndex = 32; + // + // l_ZeroFlowCal_Offset + // + this.l_ZeroFlowCal_Offset.AutoSize = true; + this.l_ZeroFlowCal_Offset.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_ZeroFlowCal_Offset.ForeColor = System.Drawing.Color.Gray; + this.l_ZeroFlowCal_Offset.Location = new System.Drawing.Point(24, 12); + this.l_ZeroFlowCal_Offset.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_ZeroFlowCal_Offset.Name = "l_ZeroFlowCal_Offset"; + this.l_ZeroFlowCal_Offset.Size = new System.Drawing.Size(68, 34); + this.l_ZeroFlowCal_Offset.TabIndex = 40; + this.l_ZeroFlowCal_Offset.Text = "OFFSET\r\nTEST"; + this.l_ZeroFlowCal_Offset.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // l_ZeroFlowCal_ResttimeDisplayValue + // + this.l_ZeroFlowCal_ResttimeDisplayValue.AutoSize = true; + this.l_ZeroFlowCal_ResttimeDisplayValue.Location = new System.Drawing.Point(654, 24); + this.l_ZeroFlowCal_ResttimeDisplayValue.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_ZeroFlowCal_ResttimeDisplayValue.Name = "l_ZeroFlowCal_ResttimeDisplayValue"; + this.l_ZeroFlowCal_ResttimeDisplayValue.Size = new System.Drawing.Size(49, 13); + this.l_ZeroFlowCal_ResttimeDisplayValue.TabIndex = 37; + this.l_ZeroFlowCal_ResttimeDisplayValue.Text = "00:00:00"; + this.l_ZeroFlowCal_ResttimeDisplayValue.Visible = false; + // + // pB_ZeroFlowCal_Progress + // + this.pB_ZeroFlowCal_Progress.Location = new System.Drawing.Point(558, 48); + this.pB_ZeroFlowCal_Progress.Margin = new System.Windows.Forms.Padding(2); + this.pB_ZeroFlowCal_Progress.Name = "pB_ZeroFlowCal_Progress"; + this.pB_ZeroFlowCal_Progress.Size = new System.Drawing.Size(140, 18); + this.pB_ZeroFlowCal_Progress.TabIndex = 35; + this.pB_ZeroFlowCal_Progress.Visible = false; + // + // p_ZeroFlowCal_Completion + // + this.p_ZeroFlowCal_Completion.BackColor = System.Drawing.Color.Gainsboro; + this.p_ZeroFlowCal_Completion.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.p_ZeroFlowCal_Completion.Controls.Add(this.l_ZeroFlowCal_Completion); + this.p_ZeroFlowCal_Completion.Location = new System.Drawing.Point(615, 138); + this.p_ZeroFlowCal_Completion.Margin = new System.Windows.Forms.Padding(2); + this.p_ZeroFlowCal_Completion.Name = "p_ZeroFlowCal_Completion"; + this.p_ZeroFlowCal_Completion.Size = new System.Drawing.Size(117, 65); + this.p_ZeroFlowCal_Completion.TabIndex = 32; + // + // l_ZeroFlowCal_Completion + // + this.l_ZeroFlowCal_Completion.AutoSize = true; + this.l_ZeroFlowCal_Completion.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_ZeroFlowCal_Completion.ForeColor = System.Drawing.Color.Gray; + this.l_ZeroFlowCal_Completion.Location = new System.Drawing.Point(0, 22); + this.l_ZeroFlowCal_Completion.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_ZeroFlowCal_Completion.Name = "l_ZeroFlowCal_Completion"; + this.l_ZeroFlowCal_Completion.Size = new System.Drawing.Size(108, 17); + this.l_ZeroFlowCal_Completion.TabIndex = 40; + this.l_ZeroFlowCal_Completion.Text = "COMPLETION"; + this.l_ZeroFlowCal_Completion.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // cB_AmplitudeTestEnable + // + this.cB_AmplitudeTestEnable.AutoSize = true; + this.cB_AmplitudeTestEnable.Checked = true; + this.cB_AmplitudeTestEnable.CheckState = System.Windows.Forms.CheckState.Checked; + this.cB_AmplitudeTestEnable.Enabled = false; + this.cB_AmplitudeTestEnable.Location = new System.Drawing.Point(258, 114); + this.cB_AmplitudeTestEnable.Margin = new System.Windows.Forms.Padding(2); + this.cB_AmplitudeTestEnable.Name = "cB_AmplitudeTestEnable"; + this.cB_AmplitudeTestEnable.Size = new System.Drawing.Size(58, 17); + this.cB_AmplitudeTestEnable.TabIndex = 50; + this.cB_AmplitudeTestEnable.Text = "enable"; + this.cB_AmplitudeTestEnable.UseVisualStyleBackColor = true; + // + // cB_TempCalEnable + // + this.cB_TempCalEnable.AutoSize = true; + this.cB_TempCalEnable.Checked = true; + this.cB_TempCalEnable.CheckState = System.Windows.Forms.CheckState.Checked; + this.cB_TempCalEnable.Enabled = false; + this.cB_TempCalEnable.Location = new System.Drawing.Point(378, 114); + this.cB_TempCalEnable.Margin = new System.Windows.Forms.Padding(2); + this.cB_TempCalEnable.Name = "cB_TempCalEnable"; + this.cB_TempCalEnable.Size = new System.Drawing.Size(58, 17); + this.cB_TempCalEnable.TabIndex = 52; + this.cB_TempCalEnable.Text = "enable"; + this.cB_TempCalEnable.UseVisualStyleBackColor = true; + // + // cB_ZeroFlowOffsetTestEnable + // + this.cB_ZeroFlowOffsetTestEnable.AutoSize = true; + this.cB_ZeroFlowOffsetTestEnable.Checked = true; + this.cB_ZeroFlowOffsetTestEnable.CheckState = System.Windows.Forms.CheckState.Checked; + this.cB_ZeroFlowOffsetTestEnable.Enabled = false; + this.cB_ZeroFlowOffsetTestEnable.Location = new System.Drawing.Point(498, 114); + this.cB_ZeroFlowOffsetTestEnable.Margin = new System.Windows.Forms.Padding(2); + this.cB_ZeroFlowOffsetTestEnable.Name = "cB_ZeroFlowOffsetTestEnable"; + this.cB_ZeroFlowOffsetTestEnable.Size = new System.Drawing.Size(58, 17); + this.cB_ZeroFlowOffsetTestEnable.TabIndex = 51; + this.cB_ZeroFlowOffsetTestEnable.Text = "enable"; + this.cB_ZeroFlowOffsetTestEnable.UseVisualStyleBackColor = true; + // + // pThermo2 + // + this.pThermo2.BackColor = System.Drawing.Color.Cornsilk; + this.pThermo2.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.pThermo2.Controls.Add(this.l_Thermo2); + this.pThermo2.Controls.Add(this.pB_Thermo2); + this.pThermo2.Location = new System.Drawing.Point(138, 48); + this.pThermo2.Margin = new System.Windows.Forms.Padding(2); + this.pThermo2.Name = "pThermo2"; + this.pThermo2.Size = new System.Drawing.Size(82, 80); + this.pThermo2.TabIndex = 63; + // + // pB_Thermo2 + // + this.pB_Thermo2.ErrorImage = global::GenesisDisplayTool.Properties.Resources.thermometer; + this.pB_Thermo2.Image = global::GenesisDisplayTool.Properties.Resources.thermometer; + this.pB_Thermo2.InitialImage = global::GenesisDisplayTool.Properties.Resources.thermometer; + this.pB_Thermo2.Location = new System.Drawing.Point(19, 18); + this.pB_Thermo2.Margin = new System.Windows.Forms.Padding(2); + this.pB_Thermo2.Name = "pB_Thermo2"; + this.pB_Thermo2.Size = new System.Drawing.Size(42, 32); + this.pB_Thermo2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pB_Thermo2.TabIndex = 57; + this.pB_Thermo2.TabStop = false; + // + // l_Thermo2 + // + this.l_Thermo2.AutoSize = true; + this.l_Thermo2.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_Thermo2.Location = new System.Drawing.Point(6, 58); + this.l_Thermo2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_Thermo2.Name = "l_Thermo2"; + this.l_Thermo2.Size = new System.Drawing.Size(67, 13); + this.l_Thermo2.TabIndex = 62; + this.l_Thermo2.Text = "THERMO2"; + // + // pThermo1 + // + this.pThermo1.BackColor = System.Drawing.Color.Cornsilk; + this.pThermo1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.pThermo1.Controls.Add(this.l_Thermo1); + this.pThermo1.Controls.Add(this.pB_Thermo1); + this.pThermo1.Location = new System.Drawing.Point(30, 48); + this.pThermo1.Margin = new System.Windows.Forms.Padding(2); + this.pThermo1.Name = "pThermo1"; + this.pThermo1.Size = new System.Drawing.Size(82, 80); + this.pThermo1.TabIndex = 59; + // + // pB_Thermo1 + // + this.pB_Thermo1.ErrorImage = global::GenesisDisplayTool.Properties.Resources.thermometer; + this.pB_Thermo1.Image = global::GenesisDisplayTool.Properties.Resources.thermometer; + this.pB_Thermo1.InitialImage = global::GenesisDisplayTool.Properties.Resources.thermometer; + this.pB_Thermo1.Location = new System.Drawing.Point(19, 18); + this.pB_Thermo1.Margin = new System.Windows.Forms.Padding(2); + this.pB_Thermo1.Name = "pB_Thermo1"; + this.pB_Thermo1.Size = new System.Drawing.Size(42, 32); + this.pB_Thermo1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pB_Thermo1.TabIndex = 57; + this.pB_Thermo1.TabStop = false; + // + // l_Thermo1 + // + this.l_Thermo1.AutoSize = true; + this.l_Thermo1.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_Thermo1.Location = new System.Drawing.Point(6, 58); + this.l_Thermo1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_Thermo1.Name = "l_Thermo1"; + this.l_Thermo1.Size = new System.Drawing.Size(67, 13); + this.l_Thermo1.TabIndex = 62; + this.l_Thermo1.Text = "THERMO1"; + // + // cB_Thermo2 + // + this.cB_Thermo2.AutoSize = true; + this.cB_Thermo2.Location = new System.Drawing.Point(144, 24); + this.cB_Thermo2.Margin = new System.Windows.Forms.Padding(2); + this.cB_Thermo2.Name = "cB_Thermo2"; + this.cB_Thermo2.Size = new System.Drawing.Size(79, 17); + this.cB_Thermo2.TabIndex = 12; + this.cB_Thermo2.Text = "THERMO2"; + this.cB_Thermo2.UseVisualStyleBackColor = true; + // + // cB_Thermo1 + // + this.cB_Thermo1.AutoSize = true; + this.cB_Thermo1.Location = new System.Drawing.Point(36, 24); + this.cB_Thermo1.Margin = new System.Windows.Forms.Padding(2); + this.cB_Thermo1.Name = "cB_Thermo1"; + this.cB_Thermo1.Size = new System.Drawing.Size(79, 17); + this.cB_Thermo1.TabIndex = 11; + this.cB_Thermo1.Text = "THERMO1"; + this.cB_Thermo1.UseVisualStyleBackColor = true; + // + // gB_Progress + // + this.gB_Progress.Controls.Add(this.cB_Thermo1); + this.gB_Progress.Controls.Add(this.cB_Thermo2); + this.gB_Progress.Controls.Add(this.pThermo1); + this.gB_Progress.Controls.Add(this.pThermo2); + this.gB_Progress.Controls.Add(this.cB_ZeroFlowOffsetTestEnable); + this.gB_Progress.Controls.Add(this.cB_TempCalEnable); + this.gB_Progress.Controls.Add(this.cB_AmplitudeTestEnable); + this.gB_Progress.Controls.Add(this.p_ZeroFlowCal_Completion); + this.gB_Progress.Controls.Add(this.pB_ZeroFlowCal_Progress); + this.gB_Progress.Controls.Add(this.l_ZeroFlowCal_ResttimeDisplayValue); + this.gB_Progress.Controls.Add(this.p_ZeroFlowCal_Offset); + this.gB_Progress.Controls.Add(this.l_ZeroFlowCal_Resttime); + this.gB_Progress.Controls.Add(this.p_ZeroFlowCal_Detect); + this.gB_Progress.Controls.Add(this.p_ZeroFlowCal_TempCal); + this.gB_Progress.Controls.Add(this.p_ZeroFlowCal_Prepare); + this.gB_Progress.Controls.Add(this.p_ZeroFlowCal_Amplitude); + this.gB_Progress.Location = new System.Drawing.Point(18, 342); + this.gB_Progress.Margin = new System.Windows.Forms.Padding(10); + this.gB_Progress.Name = "gB_Progress"; + this.gB_Progress.Padding = new System.Windows.Forms.Padding(2); + this.gB_Progress.Size = new System.Drawing.Size(744, 216); + this.gB_Progress.TabIndex = 69; + this.gB_Progress.TabStop = false; + // + // rTB_ZeroFlowCal + // + this.rTB_ZeroFlowCal.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.rTB_ZeroFlowCal.Location = new System.Drawing.Point(14, 570); + this.rTB_ZeroFlowCal.Margin = new System.Windows.Forms.Padding(2); + this.rTB_ZeroFlowCal.Name = "rTB_ZeroFlowCal"; + this.rTB_ZeroFlowCal.ReadOnly = true; + this.rTB_ZeroFlowCal.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical; + this.rTB_ZeroFlowCal.Size = new System.Drawing.Size(772, 90); + this.rTB_ZeroFlowCal.TabIndex = 22; + this.rTB_ZeroFlowCal.Text = ""; + // + // btn_ZeroFlowCal_Detect + // + this.btn_ZeroFlowCal_Detect.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.btn_ZeroFlowCal_Detect.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btn_ZeroFlowCal_Detect.Location = new System.Drawing.Point(798, 342); + this.btn_ZeroFlowCal_Detect.Margin = new System.Windows.Forms.Padding(2); + this.btn_ZeroFlowCal_Detect.Name = "btn_ZeroFlowCal_Detect"; + this.btn_ZeroFlowCal_Detect.Size = new System.Drawing.Size(102, 65); + this.btn_ZeroFlowCal_Detect.TabIndex = 23; + this.btn_ZeroFlowCal_Detect.Text = "DETECT"; + this.btn_ZeroFlowCal_Detect.UseVisualStyleBackColor = true; + this.btn_ZeroFlowCal_Detect.Click += new System.EventHandler(this.btn_ZeroFlowCal_Detect_Click); + // + // btn_ZeroFlowCal_Start + // + this.btn_ZeroFlowCal_Start.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.btn_ZeroFlowCal_Start.Enabled = false; + this.btn_ZeroFlowCal_Start.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btn_ZeroFlowCal_Start.Location = new System.Drawing.Point(798, 414); + this.btn_ZeroFlowCal_Start.Margin = new System.Windows.Forms.Padding(2); + this.btn_ZeroFlowCal_Start.Name = "btn_ZeroFlowCal_Start"; + this.btn_ZeroFlowCal_Start.Size = new System.Drawing.Size(102, 57); + this.btn_ZeroFlowCal_Start.TabIndex = 24; + this.btn_ZeroFlowCal_Start.Text = "START"; + this.btn_ZeroFlowCal_Start.UseVisualStyleBackColor = true; + this.btn_ZeroFlowCal_Start.Click += new System.EventHandler(this.btn_ZeroFlowCal_Start_Click); + // + // btn_ZeroFlowCal_Abort + // + this.btn_ZeroFlowCal_Abort.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.btn_ZeroFlowCal_Abort.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btn_ZeroFlowCal_Abort.Location = new System.Drawing.Point(798, 480); + this.btn_ZeroFlowCal_Abort.Margin = new System.Windows.Forms.Padding(2); + this.btn_ZeroFlowCal_Abort.Name = "btn_ZeroFlowCal_Abort"; + this.btn_ZeroFlowCal_Abort.Size = new System.Drawing.Size(102, 30); + this.btn_ZeroFlowCal_Abort.TabIndex = 38; + this.btn_ZeroFlowCal_Abort.Text = "STOP"; + this.btn_ZeroFlowCal_Abort.UseVisualStyleBackColor = true; + this.btn_ZeroFlowCal_Abort.Click += new System.EventHandler(this.btn_ZeroFlowCal_Abort_Click); + // + // btn_ZeroFlowCal_Clear + // + this.btn_ZeroFlowCal_Clear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btn_ZeroFlowCal_Clear.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btn_ZeroFlowCal_Clear.Location = new System.Drawing.Point(822, 624); + this.btn_ZeroFlowCal_Clear.Margin = new System.Windows.Forms.Padding(2); + this.btn_ZeroFlowCal_Clear.Name = "btn_ZeroFlowCal_Clear"; + this.btn_ZeroFlowCal_Clear.Size = new System.Drawing.Size(63, 38); + this.btn_ZeroFlowCal_Clear.TabIndex = 41; + this.btn_ZeroFlowCal_Clear.Text = "Clear"; + this.btn_ZeroFlowCal_Clear.UseVisualStyleBackColor = true; + this.btn_ZeroFlowCal_Clear.Click += new System.EventHandler(this.btn_ZeroFlowCal_Clear_Click); + // + // btn_ZeroFlowCal_Save + // + this.btn_ZeroFlowCal_Save.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btn_ZeroFlowCal_Save.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btn_ZeroFlowCal_Save.Location = new System.Drawing.Point(822, 576); + this.btn_ZeroFlowCal_Save.Margin = new System.Windows.Forms.Padding(2); + this.btn_ZeroFlowCal_Save.Name = "btn_ZeroFlowCal_Save"; + this.btn_ZeroFlowCal_Save.Size = new System.Drawing.Size(63, 38); + this.btn_ZeroFlowCal_Save.TabIndex = 47; + this.btn_ZeroFlowCal_Save.Text = "Save"; + this.btn_ZeroFlowCal_Save.UseVisualStyleBackColor = true; + this.btn_ZeroFlowCal_Save.Click += new System.EventHandler(this.btn_ZeroFlowCal_Save_Click); + // + // btn_ZeroFlowCal_Pdf + // + this.btn_ZeroFlowCal_Pdf.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btn_ZeroFlowCal_Pdf.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btn_ZeroFlowCal_Pdf.Location = new System.Drawing.Point(822, 528); + this.btn_ZeroFlowCal_Pdf.Margin = new System.Windows.Forms.Padding(2); + this.btn_ZeroFlowCal_Pdf.Name = "btn_ZeroFlowCal_Pdf"; + this.btn_ZeroFlowCal_Pdf.Size = new System.Drawing.Size(63, 38); + this.btn_ZeroFlowCal_Pdf.TabIndex = 48; + this.btn_ZeroFlowCal_Pdf.Text = "PDF"; + this.btn_ZeroFlowCal_Pdf.UseVisualStyleBackColor = true; + this.btn_ZeroFlowCal_Pdf.Click += new System.EventHandler(this.btn_ZeroFlowCal_Pdf_Click); + // + // l_ZeroFlowCal_Status + // + this.l_ZeroFlowCal_Status.AutoSize = true; + this.l_ZeroFlowCal_Status.Font = new System.Drawing.Font("Microsoft Sans Serif", 22.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_ZeroFlowCal_Status.Location = new System.Drawing.Point(24, 294); + this.l_ZeroFlowCal_Status.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_ZeroFlowCal_Status.Name = "l_ZeroFlowCal_Status"; + this.l_ZeroFlowCal_Status.Size = new System.Drawing.Size(243, 36); + this.l_ZeroFlowCal_Status.TabIndex = 21; + this.l_ZeroFlowCal_Status.Text = "Press \'DETECT\'"; + // + // pB_Bubbles1 + // + this.pB_Bubbles1.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.pB_Bubbles1.Image = ((System.Drawing.Image)(resources.GetObject("pB_Bubbles1.Image"))); + this.pB_Bubbles1.Location = new System.Drawing.Point(19, 6); + this.pB_Bubbles1.Margin = new System.Windows.Forms.Padding(2); + this.pB_Bubbles1.Name = "pB_Bubbles1"; + this.pB_Bubbles1.Size = new System.Drawing.Size(267, 96); + this.pB_Bubbles1.TabIndex = 53; + this.pB_Bubbles1.TabStop = false; + this.pB_Bubbles1.Visible = false; + // + // cB_ZeroFlowCal_EnableMeter10 + // + this.cB_ZeroFlowCal_EnableMeter10.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.cB_ZeroFlowCal_EnableMeter10.AutoSize = true; + this.cB_ZeroFlowCal_EnableMeter10.Location = new System.Drawing.Point(828, 150); + this.cB_ZeroFlowCal_EnableMeter10.Margin = new System.Windows.Forms.Padding(2); + this.cB_ZeroFlowCal_EnableMeter10.Name = "cB_ZeroFlowCal_EnableMeter10"; + this.cB_ZeroFlowCal_EnableMeter10.Size = new System.Drawing.Size(58, 17); + this.cB_ZeroFlowCal_EnableMeter10.TabIndex = 34; + this.cB_ZeroFlowCal_EnableMeter10.Text = "enable"; + this.cB_ZeroFlowCal_EnableMeter10.UseVisualStyleBackColor = true; + // + // cB_ZeroFlowCal_EnableMeter9 + // + this.cB_ZeroFlowCal_EnableMeter9.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.cB_ZeroFlowCal_EnableMeter9.AutoSize = true; + this.cB_ZeroFlowCal_EnableMeter9.Location = new System.Drawing.Point(744, 150); + this.cB_ZeroFlowCal_EnableMeter9.Margin = new System.Windows.Forms.Padding(2); + this.cB_ZeroFlowCal_EnableMeter9.Name = "cB_ZeroFlowCal_EnableMeter9"; + this.cB_ZeroFlowCal_EnableMeter9.Size = new System.Drawing.Size(58, 17); + this.cB_ZeroFlowCal_EnableMeter9.TabIndex = 33; + this.cB_ZeroFlowCal_EnableMeter9.Text = "enable"; + this.cB_ZeroFlowCal_EnableMeter9.UseVisualStyleBackColor = true; + // + // cB_ZeroFlowCal_EnableMeter1 + // + this.cB_ZeroFlowCal_EnableMeter1.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.cB_ZeroFlowCal_EnableMeter1.AutoSize = true; + this.cB_ZeroFlowCal_EnableMeter1.Checked = true; + this.cB_ZeroFlowCal_EnableMeter1.CheckState = System.Windows.Forms.CheckState.Checked; + this.cB_ZeroFlowCal_EnableMeter1.Location = new System.Drawing.Point(12, 150); + this.cB_ZeroFlowCal_EnableMeter1.Margin = new System.Windows.Forms.Padding(2); + this.cB_ZeroFlowCal_EnableMeter1.Name = "cB_ZeroFlowCal_EnableMeter1"; + this.cB_ZeroFlowCal_EnableMeter1.Size = new System.Drawing.Size(58, 17); + this.cB_ZeroFlowCal_EnableMeter1.TabIndex = 25; + this.cB_ZeroFlowCal_EnableMeter1.Text = "enable"; + this.cB_ZeroFlowCal_EnableMeter1.UseVisualStyleBackColor = true; + // + // gB_Meters + // + this.gB_Meters.Controls.Add(this.p_ZeroFlowCal_Meter1); + this.gB_Meters.Controls.Add(this.p_ZeroFlowCal_Meter9); + this.gB_Meters.Controls.Add(this.p_ZeroFlowCal_Meter2); + this.gB_Meters.Controls.Add(this.p_ZeroFlowCal_Meter6); + this.gB_Meters.Controls.Add(this.p_ZeroFlowCal_Meter3); + this.gB_Meters.Controls.Add(this.p_ZeroFlowCal_Meter5); + this.gB_Meters.Controls.Add(this.p_ZeroFlowCal_Meter4); + this.gB_Meters.Controls.Add(this.p_ZeroFlowCal_Meter10); + this.gB_Meters.Controls.Add(this.p_ZeroFlowCal_Meter8); + this.gB_Meters.Controls.Add(this.p_ZeroFlowCal_Meter7); + this.gB_Meters.Controls.Add(this.cB_ZeroFlowCal_EnableMeter2); + this.gB_Meters.Controls.Add(this.cB_ZeroFlowCal_EnableMeter3); + this.gB_Meters.Controls.Add(this.cB_ZeroFlowCal_EnableMeter4); + this.gB_Meters.Controls.Add(this.cB_ZeroFlowCal_EnableMeter5); + this.gB_Meters.Controls.Add(this.cB_ZeroFlowCal_EnableMeter1); + this.gB_Meters.Controls.Add(this.cB_ZeroFlowCal_EnableMeter6); + this.gB_Meters.Controls.Add(this.cB_ZeroFlowCal_EnableMeter7); + this.gB_Meters.Controls.Add(this.cB_ZeroFlowCal_EnableMeter8); + this.gB_Meters.Controls.Add(this.cB_ZeroFlowCal_EnableMeter9); + this.gB_Meters.Controls.Add(this.cB_ZeroFlowCal_EnableMeter10); + this.gB_Meters.Location = new System.Drawing.Point(18, 102); + this.gB_Meters.Margin = new System.Windows.Forms.Padding(10); + this.gB_Meters.Name = "gB_Meters"; + this.gB_Meters.Padding = new System.Windows.Forms.Padding(2); + this.gB_Meters.Size = new System.Drawing.Size(906, 174); + this.gB_Meters.TabIndex = 68; + this.gB_Meters.TabStop = false; + // + // pB_Logo1 + // + this.pB_Logo1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.pB_Logo1.Image = ((System.Drawing.Image)(resources.GetObject("pB_Logo1.Image"))); + this.pB_Logo1.InitialImage = null; + this.pB_Logo1.Location = new System.Drawing.Point(819, 18); + this.pB_Logo1.Margin = new System.Windows.Forms.Padding(2); + this.pB_Logo1.Name = "pB_Logo1"; + this.pB_Logo1.Size = new System.Drawing.Size(91, 38); + this.pB_Logo1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pB_Logo1.TabIndex = 2; + this.pB_Logo1.TabStop = false; + // + // cB_ZeroFlowCal_EnableMeter8 + // + this.cB_ZeroFlowCal_EnableMeter8.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.cB_ZeroFlowCal_EnableMeter8.AutoSize = true; + this.cB_ZeroFlowCal_EnableMeter8.Location = new System.Drawing.Point(654, 150); + this.cB_ZeroFlowCal_EnableMeter8.Margin = new System.Windows.Forms.Padding(2); + this.cB_ZeroFlowCal_EnableMeter8.Name = "cB_ZeroFlowCal_EnableMeter8"; + this.cB_ZeroFlowCal_EnableMeter8.Size = new System.Drawing.Size(58, 17); + this.cB_ZeroFlowCal_EnableMeter8.TabIndex = 32; + this.cB_ZeroFlowCal_EnableMeter8.Text = "enable"; + this.cB_ZeroFlowCal_EnableMeter8.UseVisualStyleBackColor = true; + // + // cB_ZeroFlowCal_EnableMeter7 + // + this.cB_ZeroFlowCal_EnableMeter7.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.cB_ZeroFlowCal_EnableMeter7.AutoSize = true; + this.cB_ZeroFlowCal_EnableMeter7.Location = new System.Drawing.Point(564, 150); + this.cB_ZeroFlowCal_EnableMeter7.Margin = new System.Windows.Forms.Padding(2); + this.cB_ZeroFlowCal_EnableMeter7.Name = "cB_ZeroFlowCal_EnableMeter7"; + this.cB_ZeroFlowCal_EnableMeter7.Size = new System.Drawing.Size(58, 17); + this.cB_ZeroFlowCal_EnableMeter7.TabIndex = 31; + this.cB_ZeroFlowCal_EnableMeter7.Text = "enable"; + this.cB_ZeroFlowCal_EnableMeter7.UseVisualStyleBackColor = true; + // + // cB_ZeroFlowCal_EnableMeter6 + // + this.cB_ZeroFlowCal_EnableMeter6.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.cB_ZeroFlowCal_EnableMeter6.AutoSize = true; + this.cB_ZeroFlowCal_EnableMeter6.Location = new System.Drawing.Point(468, 150); + this.cB_ZeroFlowCal_EnableMeter6.Margin = new System.Windows.Forms.Padding(2); + this.cB_ZeroFlowCal_EnableMeter6.Name = "cB_ZeroFlowCal_EnableMeter6"; + this.cB_ZeroFlowCal_EnableMeter6.Size = new System.Drawing.Size(58, 17); + this.cB_ZeroFlowCal_EnableMeter6.TabIndex = 30; + this.cB_ZeroFlowCal_EnableMeter6.Text = "enable"; + this.cB_ZeroFlowCal_EnableMeter6.UseVisualStyleBackColor = true; + // + // cB_ZeroFlowCal_EnableMeter5 + // + this.cB_ZeroFlowCal_EnableMeter5.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.cB_ZeroFlowCal_EnableMeter5.AutoSize = true; + this.cB_ZeroFlowCal_EnableMeter5.Location = new System.Drawing.Point(378, 150); + this.cB_ZeroFlowCal_EnableMeter5.Margin = new System.Windows.Forms.Padding(2); + this.cB_ZeroFlowCal_EnableMeter5.Name = "cB_ZeroFlowCal_EnableMeter5"; + this.cB_ZeroFlowCal_EnableMeter5.Size = new System.Drawing.Size(58, 17); + this.cB_ZeroFlowCal_EnableMeter5.TabIndex = 29; + this.cB_ZeroFlowCal_EnableMeter5.Text = "enable"; + this.cB_ZeroFlowCal_EnableMeter5.UseVisualStyleBackColor = true; + // + // cB_ZeroFlowCal_EnableMeter4 + // + this.cB_ZeroFlowCal_EnableMeter4.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.cB_ZeroFlowCal_EnableMeter4.AutoSize = true; + this.cB_ZeroFlowCal_EnableMeter4.Location = new System.Drawing.Point(282, 150); + this.cB_ZeroFlowCal_EnableMeter4.Margin = new System.Windows.Forms.Padding(2); + this.cB_ZeroFlowCal_EnableMeter4.Name = "cB_ZeroFlowCal_EnableMeter4"; + this.cB_ZeroFlowCal_EnableMeter4.Size = new System.Drawing.Size(58, 17); + this.cB_ZeroFlowCal_EnableMeter4.TabIndex = 28; + this.cB_ZeroFlowCal_EnableMeter4.Text = "enable"; + this.cB_ZeroFlowCal_EnableMeter4.UseVisualStyleBackColor = true; + // + // cB_ZeroFlowCal_EnableMeter3 + // + this.cB_ZeroFlowCal_EnableMeter3.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.cB_ZeroFlowCal_EnableMeter3.AutoSize = true; + this.cB_ZeroFlowCal_EnableMeter3.Location = new System.Drawing.Point(192, 150); + this.cB_ZeroFlowCal_EnableMeter3.Margin = new System.Windows.Forms.Padding(2); + this.cB_ZeroFlowCal_EnableMeter3.Name = "cB_ZeroFlowCal_EnableMeter3"; + this.cB_ZeroFlowCal_EnableMeter3.Size = new System.Drawing.Size(58, 17); + this.cB_ZeroFlowCal_EnableMeter3.TabIndex = 27; + this.cB_ZeroFlowCal_EnableMeter3.Text = "enable"; + this.cB_ZeroFlowCal_EnableMeter3.UseVisualStyleBackColor = true; + // + // cB_ZeroFlowCal_EnableMeter2 + // + this.cB_ZeroFlowCal_EnableMeter2.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.cB_ZeroFlowCal_EnableMeter2.AutoSize = true; + this.cB_ZeroFlowCal_EnableMeter2.Location = new System.Drawing.Point(102, 150); + this.cB_ZeroFlowCal_EnableMeter2.Margin = new System.Windows.Forms.Padding(2); + this.cB_ZeroFlowCal_EnableMeter2.Name = "cB_ZeroFlowCal_EnableMeter2"; + this.cB_ZeroFlowCal_EnableMeter2.Size = new System.Drawing.Size(58, 17); + this.cB_ZeroFlowCal_EnableMeter2.TabIndex = 26; + this.cB_ZeroFlowCal_EnableMeter2.Text = "enable"; + this.cB_ZeroFlowCal_EnableMeter2.UseVisualStyleBackColor = true; + // + // l_ZeroFlowCal_Meter7 + // + this.l_ZeroFlowCal_Meter7.AutoSize = true; + this.l_ZeroFlowCal_Meter7.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_ZeroFlowCal_Meter7.Location = new System.Drawing.Point(12, 78); + this.l_ZeroFlowCal_Meter7.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_ZeroFlowCal_Meter7.Name = "l_ZeroFlowCal_Meter7"; + this.l_ZeroFlowCal_Meter7.Size = new System.Drawing.Size(57, 13); + this.l_ZeroFlowCal_Meter7.TabIndex = 30; + this.l_ZeroFlowCal_Meter7.Text = "METER7"; + // + // pB_Meter7 + // + this.pB_Meter7.ErrorImage = global::GenesisDisplayTool.Properties.Resources.NormalImage; + this.pB_Meter7.Image = global::GenesisDisplayTool.Properties.Resources.NormalImage; + this.pB_Meter7.InitialImage = global::GenesisDisplayTool.Properties.Resources.NormalImage; + this.pB_Meter7.Location = new System.Drawing.Point(18, 18); + this.pB_Meter7.Margin = new System.Windows.Forms.Padding(2); + this.pB_Meter7.Name = "pB_Meter7"; + this.pB_Meter7.Size = new System.Drawing.Size(45, 40); + this.pB_Meter7.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pB_Meter7.TabIndex = 61; + this.pB_Meter7.TabStop = false; + // + // p_ZeroFlowCal_Meter7 + // + this.p_ZeroFlowCal_Meter7.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.p_ZeroFlowCal_Meter7.BackColor = System.Drawing.Color.Cornsilk; + this.p_ZeroFlowCal_Meter7.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.p_ZeroFlowCal_Meter7.Controls.Add(this.pB_Meter7); + this.p_ZeroFlowCal_Meter7.Controls.Add(this.l_ZeroFlowCal_Meter7); + this.p_ZeroFlowCal_Meter7.Location = new System.Drawing.Point(546, 12); + this.p_ZeroFlowCal_Meter7.Margin = new System.Windows.Forms.Padding(2); + this.p_ZeroFlowCal_Meter7.Name = "p_ZeroFlowCal_Meter7"; + this.p_ZeroFlowCal_Meter7.Size = new System.Drawing.Size(85, 127); + this.p_ZeroFlowCal_Meter7.TabIndex = 17; + // + // l_ZeroFlowCal_Meter8 + // + this.l_ZeroFlowCal_Meter8.AutoSize = true; + this.l_ZeroFlowCal_Meter8.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_ZeroFlowCal_Meter8.Location = new System.Drawing.Point(12, 78); + this.l_ZeroFlowCal_Meter8.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_ZeroFlowCal_Meter8.Name = "l_ZeroFlowCal_Meter8"; + this.l_ZeroFlowCal_Meter8.Size = new System.Drawing.Size(57, 13); + this.l_ZeroFlowCal_Meter8.TabIndex = 31; + this.l_ZeroFlowCal_Meter8.Text = "METER8"; + // + // pB_Meter8 + // + this.pB_Meter8.ErrorImage = global::GenesisDisplayTool.Properties.Resources.NormalImage; + this.pB_Meter8.Image = global::GenesisDisplayTool.Properties.Resources.NormalImage; + this.pB_Meter8.InitialImage = global::GenesisDisplayTool.Properties.Resources.NormalImage; + this.pB_Meter8.Location = new System.Drawing.Point(18, 18); + this.pB_Meter8.Margin = new System.Windows.Forms.Padding(2); + this.pB_Meter8.Name = "pB_Meter8"; + this.pB_Meter8.Size = new System.Drawing.Size(45, 40); + this.pB_Meter8.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pB_Meter8.TabIndex = 62; + this.pB_Meter8.TabStop = false; + // + // p_ZeroFlowCal_Meter8 + // + this.p_ZeroFlowCal_Meter8.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.p_ZeroFlowCal_Meter8.BackColor = System.Drawing.Color.Cornsilk; + this.p_ZeroFlowCal_Meter8.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.p_ZeroFlowCal_Meter8.Controls.Add(this.pB_Meter8); + this.p_ZeroFlowCal_Meter8.Controls.Add(this.l_ZeroFlowCal_Meter8); + this.p_ZeroFlowCal_Meter8.Location = new System.Drawing.Point(636, 12); + this.p_ZeroFlowCal_Meter8.Margin = new System.Windows.Forms.Padding(2); + this.p_ZeroFlowCal_Meter8.Name = "p_ZeroFlowCal_Meter8"; + this.p_ZeroFlowCal_Meter8.Size = new System.Drawing.Size(85, 127); + this.p_ZeroFlowCal_Meter8.TabIndex = 18; + // + // l_ZeroFlowCal_Meter10 + // + this.l_ZeroFlowCal_Meter10.AutoSize = true; + this.l_ZeroFlowCal_Meter10.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_ZeroFlowCal_Meter10.Location = new System.Drawing.Point(6, 78); + this.l_ZeroFlowCal_Meter10.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_ZeroFlowCal_Meter10.Name = "l_ZeroFlowCal_Meter10"; + this.l_ZeroFlowCal_Meter10.Size = new System.Drawing.Size(64, 13); + this.l_ZeroFlowCal_Meter10.TabIndex = 26; + this.l_ZeroFlowCal_Meter10.Text = "METER10"; + // + // pB_Meter10 + // + this.pB_Meter10.ErrorImage = global::GenesisDisplayTool.Properties.Resources.NormalImage; + this.pB_Meter10.Image = global::GenesisDisplayTool.Properties.Resources.NormalImage; + this.pB_Meter10.InitialImage = global::GenesisDisplayTool.Properties.Resources.NormalImage; + this.pB_Meter10.Location = new System.Drawing.Point(18, 18); + this.pB_Meter10.Margin = new System.Windows.Forms.Padding(2); + this.pB_Meter10.Name = "pB_Meter10"; + this.pB_Meter10.Size = new System.Drawing.Size(45, 40); + this.pB_Meter10.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pB_Meter10.TabIndex = 63; + this.pB_Meter10.TabStop = false; + // + // p_ZeroFlowCal_Meter10 + // + this.p_ZeroFlowCal_Meter10.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.p_ZeroFlowCal_Meter10.BackColor = System.Drawing.Color.Cornsilk; + this.p_ZeroFlowCal_Meter10.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.p_ZeroFlowCal_Meter10.Controls.Add(this.pB_Meter10); + this.p_ZeroFlowCal_Meter10.Controls.Add(this.l_ZeroFlowCal_Meter10); + this.p_ZeroFlowCal_Meter10.Location = new System.Drawing.Point(816, 12); + this.p_ZeroFlowCal_Meter10.Margin = new System.Windows.Forms.Padding(20); + this.p_ZeroFlowCal_Meter10.Name = "p_ZeroFlowCal_Meter10"; + this.p_ZeroFlowCal_Meter10.Padding = new System.Windows.Forms.Padding(10); + this.p_ZeroFlowCal_Meter10.Size = new System.Drawing.Size(85, 128); + this.p_ZeroFlowCal_Meter10.TabIndex = 20; + // + // l_ZeroFlowCal_Meter4 + // + this.l_ZeroFlowCal_Meter4.AutoSize = true; + this.l_ZeroFlowCal_Meter4.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_ZeroFlowCal_Meter4.Location = new System.Drawing.Point(12, 78); + this.l_ZeroFlowCal_Meter4.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_ZeroFlowCal_Meter4.Name = "l_ZeroFlowCal_Meter4"; + this.l_ZeroFlowCal_Meter4.Size = new System.Drawing.Size(57, 13); + this.l_ZeroFlowCal_Meter4.TabIndex = 27; + this.l_ZeroFlowCal_Meter4.Text = "METER4"; + // + // pB_Meter4 + // + this.pB_Meter4.ErrorImage = global::GenesisDisplayTool.Properties.Resources.NormalImage; + this.pB_Meter4.Image = global::GenesisDisplayTool.Properties.Resources.NormalImage; + this.pB_Meter4.InitialImage = global::GenesisDisplayTool.Properties.Resources.NormalImage; + this.pB_Meter4.Location = new System.Drawing.Point(18, 18); + this.pB_Meter4.Margin = new System.Windows.Forms.Padding(2); + this.pB_Meter4.Name = "pB_Meter4"; + this.pB_Meter4.Size = new System.Drawing.Size(45, 40); + this.pB_Meter4.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pB_Meter4.TabIndex = 60; + this.pB_Meter4.TabStop = false; + // + // p_ZeroFlowCal_Meter4 + // + this.p_ZeroFlowCal_Meter4.BackColor = System.Drawing.Color.Cornsilk; + this.p_ZeroFlowCal_Meter4.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.p_ZeroFlowCal_Meter4.Controls.Add(this.pB_Meter4); + this.p_ZeroFlowCal_Meter4.Controls.Add(this.l_ZeroFlowCal_Meter4); + this.p_ZeroFlowCal_Meter4.Location = new System.Drawing.Point(276, 12); + this.p_ZeroFlowCal_Meter4.Margin = new System.Windows.Forms.Padding(2); + this.p_ZeroFlowCal_Meter4.Name = "p_ZeroFlowCal_Meter4"; + this.p_ZeroFlowCal_Meter4.Size = new System.Drawing.Size(85, 127); + this.p_ZeroFlowCal_Meter4.TabIndex = 14; + // + // l_ZeroFlowCal_Meter5 + // + this.l_ZeroFlowCal_Meter5.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.l_ZeroFlowCal_Meter5.AutoSize = true; + this.l_ZeroFlowCal_Meter5.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_ZeroFlowCal_Meter5.Location = new System.Drawing.Point(12, 78); + this.l_ZeroFlowCal_Meter5.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_ZeroFlowCal_Meter5.Name = "l_ZeroFlowCal_Meter5"; + this.l_ZeroFlowCal_Meter5.Size = new System.Drawing.Size(57, 13); + this.l_ZeroFlowCal_Meter5.TabIndex = 28; + this.l_ZeroFlowCal_Meter5.Text = "METER5"; + // + // pB_Meter5 + // + this.pB_Meter5.ErrorImage = global::GenesisDisplayTool.Properties.Resources.NormalImage; + this.pB_Meter5.Image = global::GenesisDisplayTool.Properties.Resources.NormalImage; + this.pB_Meter5.InitialImage = global::GenesisDisplayTool.Properties.Resources.NormalImage; + this.pB_Meter5.Location = new System.Drawing.Point(18, 18); + this.pB_Meter5.Margin = new System.Windows.Forms.Padding(2); + this.pB_Meter5.Name = "pB_Meter5"; + this.pB_Meter5.Size = new System.Drawing.Size(45, 40); + this.pB_Meter5.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pB_Meter5.TabIndex = 60; + this.pB_Meter5.TabStop = false; + // + // p_ZeroFlowCal_Meter5 + // + this.p_ZeroFlowCal_Meter5.BackColor = System.Drawing.Color.Cornsilk; + this.p_ZeroFlowCal_Meter5.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.p_ZeroFlowCal_Meter5.Controls.Add(this.pB_Meter5); + this.p_ZeroFlowCal_Meter5.Controls.Add(this.l_ZeroFlowCal_Meter5); + this.p_ZeroFlowCal_Meter5.Location = new System.Drawing.Point(366, 12); + this.p_ZeroFlowCal_Meter5.Margin = new System.Windows.Forms.Padding(2); + this.p_ZeroFlowCal_Meter5.Name = "p_ZeroFlowCal_Meter5"; + this.p_ZeroFlowCal_Meter5.Size = new System.Drawing.Size(85, 127); + this.p_ZeroFlowCal_Meter5.TabIndex = 15; + // + // l_ZeroFlowCal_Meter3 + // + this.l_ZeroFlowCal_Meter3.AutoSize = true; + this.l_ZeroFlowCal_Meter3.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_ZeroFlowCal_Meter3.Location = new System.Drawing.Point(12, 78); + this.l_ZeroFlowCal_Meter3.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_ZeroFlowCal_Meter3.Name = "l_ZeroFlowCal_Meter3"; + this.l_ZeroFlowCal_Meter3.Size = new System.Drawing.Size(57, 13); + this.l_ZeroFlowCal_Meter3.TabIndex = 26; + this.l_ZeroFlowCal_Meter3.Text = "METER3"; + // + // pB_Meter3 + // + this.pB_Meter3.ErrorImage = global::GenesisDisplayTool.Properties.Resources.NormalImage; + this.pB_Meter3.Image = global::GenesisDisplayTool.Properties.Resources.NormalImage; + this.pB_Meter3.InitialImage = global::GenesisDisplayTool.Properties.Resources.NormalImage; + this.pB_Meter3.Location = new System.Drawing.Point(18, 19); + this.pB_Meter3.Margin = new System.Windows.Forms.Padding(2); + this.pB_Meter3.Name = "pB_Meter3"; + this.pB_Meter3.Size = new System.Drawing.Size(45, 40); + this.pB_Meter3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pB_Meter3.TabIndex = 59; + this.pB_Meter3.TabStop = false; + // + // p_ZeroFlowCal_Meter3 + // + this.p_ZeroFlowCal_Meter3.BackColor = System.Drawing.Color.Cornsilk; + this.p_ZeroFlowCal_Meter3.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.p_ZeroFlowCal_Meter3.Controls.Add(this.pB_Meter3); + this.p_ZeroFlowCal_Meter3.Controls.Add(this.l_ZeroFlowCal_Meter3); + this.p_ZeroFlowCal_Meter3.Location = new System.Drawing.Point(186, 12); + this.p_ZeroFlowCal_Meter3.Margin = new System.Windows.Forms.Padding(2); + this.p_ZeroFlowCal_Meter3.Name = "p_ZeroFlowCal_Meter3"; + this.p_ZeroFlowCal_Meter3.Size = new System.Drawing.Size(85, 127); + this.p_ZeroFlowCal_Meter3.TabIndex = 13; + // + // l_ZeroFlowCal_Meter6 + // + this.l_ZeroFlowCal_Meter6.AutoSize = true; + this.l_ZeroFlowCal_Meter6.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_ZeroFlowCal_Meter6.Location = new System.Drawing.Point(12, 78); + this.l_ZeroFlowCal_Meter6.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_ZeroFlowCal_Meter6.Name = "l_ZeroFlowCal_Meter6"; + this.l_ZeroFlowCal_Meter6.Size = new System.Drawing.Size(57, 13); + this.l_ZeroFlowCal_Meter6.TabIndex = 29; + this.l_ZeroFlowCal_Meter6.Text = "METER6"; + // + // pB_Meter6 + // + this.pB_Meter6.ErrorImage = global::GenesisDisplayTool.Properties.Resources.NormalImage; + this.pB_Meter6.Image = global::GenesisDisplayTool.Properties.Resources.NormalImage; + this.pB_Meter6.InitialImage = global::GenesisDisplayTool.Properties.Resources.NormalImage; + this.pB_Meter6.Location = new System.Drawing.Point(18, 18); + this.pB_Meter6.Margin = new System.Windows.Forms.Padding(2); + this.pB_Meter6.Name = "pB_Meter6"; + this.pB_Meter6.Size = new System.Drawing.Size(45, 40); + this.pB_Meter6.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pB_Meter6.TabIndex = 60; + this.pB_Meter6.TabStop = false; + // + // p_ZeroFlowCal_Meter6 + // + this.p_ZeroFlowCal_Meter6.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.p_ZeroFlowCal_Meter6.BackColor = System.Drawing.Color.Cornsilk; + this.p_ZeroFlowCal_Meter6.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.p_ZeroFlowCal_Meter6.Controls.Add(this.pB_Meter6); + this.p_ZeroFlowCal_Meter6.Controls.Add(this.l_ZeroFlowCal_Meter6); + this.p_ZeroFlowCal_Meter6.Location = new System.Drawing.Point(456, 12); + this.p_ZeroFlowCal_Meter6.Margin = new System.Windows.Forms.Padding(2); + this.p_ZeroFlowCal_Meter6.Name = "p_ZeroFlowCal_Meter6"; + this.p_ZeroFlowCal_Meter6.Size = new System.Drawing.Size(85, 127); + this.p_ZeroFlowCal_Meter6.TabIndex = 16; + // + // l_ZeroFlowCal_Meter2 + // + this.l_ZeroFlowCal_Meter2.AutoSize = true; + this.l_ZeroFlowCal_Meter2.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_ZeroFlowCal_Meter2.Location = new System.Drawing.Point(12, 78); + this.l_ZeroFlowCal_Meter2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_ZeroFlowCal_Meter2.Name = "l_ZeroFlowCal_Meter2"; + this.l_ZeroFlowCal_Meter2.Size = new System.Drawing.Size(57, 13); + this.l_ZeroFlowCal_Meter2.TabIndex = 26; + this.l_ZeroFlowCal_Meter2.Text = "METER2"; + // + // pB_Meter2 + // + this.pB_Meter2.ErrorImage = global::GenesisDisplayTool.Properties.Resources.NormalImage; + this.pB_Meter2.Image = global::GenesisDisplayTool.Properties.Resources.NormalImage; + this.pB_Meter2.InitialImage = global::GenesisDisplayTool.Properties.Resources.NormalImage; + this.pB_Meter2.Location = new System.Drawing.Point(18, 18); + this.pB_Meter2.Margin = new System.Windows.Forms.Padding(2); + this.pB_Meter2.Name = "pB_Meter2"; + this.pB_Meter2.Size = new System.Drawing.Size(45, 40); + this.pB_Meter2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pB_Meter2.TabIndex = 58; + this.pB_Meter2.TabStop = false; + // + // p_ZeroFlowCal_Meter2 + // + this.p_ZeroFlowCal_Meter2.BackColor = System.Drawing.Color.Cornsilk; + this.p_ZeroFlowCal_Meter2.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.p_ZeroFlowCal_Meter2.Controls.Add(this.pB_Meter2); + this.p_ZeroFlowCal_Meter2.Controls.Add(this.l_ZeroFlowCal_Meter2); + this.p_ZeroFlowCal_Meter2.Location = new System.Drawing.Point(96, 12); + this.p_ZeroFlowCal_Meter2.Margin = new System.Windows.Forms.Padding(2); + this.p_ZeroFlowCal_Meter2.Name = "p_ZeroFlowCal_Meter2"; + this.p_ZeroFlowCal_Meter2.Padding = new System.Windows.Forms.Padding(10); + this.p_ZeroFlowCal_Meter2.Size = new System.Drawing.Size(85, 127); + this.p_ZeroFlowCal_Meter2.TabIndex = 12; + // + // l_ZeroFlowCal_Meter9 + // + this.l_ZeroFlowCal_Meter9.AutoSize = true; + this.l_ZeroFlowCal_Meter9.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_ZeroFlowCal_Meter9.Location = new System.Drawing.Point(12, 78); + this.l_ZeroFlowCal_Meter9.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_ZeroFlowCal_Meter9.Name = "l_ZeroFlowCal_Meter9"; + this.l_ZeroFlowCal_Meter9.Size = new System.Drawing.Size(57, 13); + this.l_ZeroFlowCal_Meter9.TabIndex = 32; + this.l_ZeroFlowCal_Meter9.Text = "METER9"; + // + // pB_Meter9 + // + this.pB_Meter9.ErrorImage = global::GenesisDisplayTool.Properties.Resources.NormalImage; + this.pB_Meter9.Image = global::GenesisDisplayTool.Properties.Resources.NormalImage; + this.pB_Meter9.InitialImage = global::GenesisDisplayTool.Properties.Resources.NormalImage; + this.pB_Meter9.Location = new System.Drawing.Point(18, 18); + this.pB_Meter9.Margin = new System.Windows.Forms.Padding(2); + this.pB_Meter9.Name = "pB_Meter9"; + this.pB_Meter9.Size = new System.Drawing.Size(45, 40); + this.pB_Meter9.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pB_Meter9.TabIndex = 62; + this.pB_Meter9.TabStop = false; + // + // p_ZeroFlowCal_Meter9 + // + this.p_ZeroFlowCal_Meter9.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.p_ZeroFlowCal_Meter9.BackColor = System.Drawing.Color.Cornsilk; + this.p_ZeroFlowCal_Meter9.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.p_ZeroFlowCal_Meter9.Controls.Add(this.pB_Meter9); + this.p_ZeroFlowCal_Meter9.Controls.Add(this.l_ZeroFlowCal_Meter9); + this.p_ZeroFlowCal_Meter9.Location = new System.Drawing.Point(726, 12); + this.p_ZeroFlowCal_Meter9.Margin = new System.Windows.Forms.Padding(20); + this.p_ZeroFlowCal_Meter9.Name = "p_ZeroFlowCal_Meter9"; + this.p_ZeroFlowCal_Meter9.Padding = new System.Windows.Forms.Padding(10); + this.p_ZeroFlowCal_Meter9.Size = new System.Drawing.Size(85, 127); + this.p_ZeroFlowCal_Meter9.TabIndex = 19; + // + // l_ZeroFlowCal_Meter1 + // + this.l_ZeroFlowCal_Meter1.AutoSize = true; + this.l_ZeroFlowCal_Meter1.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_ZeroFlowCal_Meter1.Location = new System.Drawing.Point(12, 78); + this.l_ZeroFlowCal_Meter1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_ZeroFlowCal_Meter1.Name = "l_ZeroFlowCal_Meter1"; + this.l_ZeroFlowCal_Meter1.Size = new System.Drawing.Size(57, 13); + this.l_ZeroFlowCal_Meter1.TabIndex = 25; + this.l_ZeroFlowCal_Meter1.Text = "METER1"; + // + // pB_Meter1 + // + this.pB_Meter1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pB_Meter1.ErrorImage = global::GenesisDisplayTool.Properties.Resources.NormalImage; + this.pB_Meter1.Image = global::GenesisDisplayTool.Properties.Resources.NormalImage; + this.pB_Meter1.InitialImage = global::GenesisDisplayTool.Properties.Resources.NormalImage; + this.pB_Meter1.Location = new System.Drawing.Point(18, 18); + this.pB_Meter1.Margin = new System.Windows.Forms.Padding(2); + this.pB_Meter1.Name = "pB_Meter1"; + this.pB_Meter1.Size = new System.Drawing.Size(45, 40); + this.pB_Meter1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pB_Meter1.TabIndex = 57; + this.pB_Meter1.TabStop = false; + // + // p_ZeroFlowCal_Meter1 + // + this.p_ZeroFlowCal_Meter1.BackColor = System.Drawing.Color.Cornsilk; + this.p_ZeroFlowCal_Meter1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.p_ZeroFlowCal_Meter1.Controls.Add(this.pB_Meter1); + this.p_ZeroFlowCal_Meter1.Controls.Add(this.l_ZeroFlowCal_Meter1); + this.p_ZeroFlowCal_Meter1.Location = new System.Drawing.Point(6, 12); + this.p_ZeroFlowCal_Meter1.Margin = new System.Windows.Forms.Padding(2); + this.p_ZeroFlowCal_Meter1.Name = "p_ZeroFlowCal_Meter1"; + this.p_ZeroFlowCal_Meter1.Size = new System.Drawing.Size(85, 127); + this.p_ZeroFlowCal_Meter1.TabIndex = 1; + // + // GenesisZeroFlow + // + this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.AutoScroll = true; + this.AutoSize = true; + this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.BackColor = System.Drawing.Color.AliceBlue; + this.ClientSize = new System.Drawing.Size(1008, 730); + this.Controls.Add(this.tab_Maintab); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(2); + this.Name = "GenesisZeroFlow"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "SENSUS Hannover - GENESIS zeroflow calibration tool"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing); + this.Load += new System.EventHandler(this.Form1_FormOpening); + this.Resize += new System.EventHandler(this.GenesisZeroFlow_Resize); + this.tab_ZeroFlowCal.ResumeLayout(false); + this.tab_ZeroFlowCal.PerformLayout(); + this.tab_About.ResumeLayout(false); + this.tab_About.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Logo2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pB_DocumentVersion)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit(); + this.tab_Settings.ResumeLayout(false); + this.tab_Settings.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_AvailableImages)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Logo3)).EndInit(); + this.gB_Settings_AmplitudeTest.ResumeLayout(false); + this.gB_Settings_AmplitudeTest.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_AmplitudeTestUpperLimit)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_AmplitudeTestLowerLimit)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_AmplitudeTestMinDistance)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_PercentageStart)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_PercentageStop)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_AmplitudeActivityCheckInterval)).EndInit(); + this.gB_Settings_ZeroflowOffsetTest.ResumeLayout(false); + this.gB_Settings_ZeroflowOffsetTest.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_ZeroflowOffsetTestUpperLimit)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_ZeroflowOffsetTestLowerLimit)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_ZeroflowOffsetTestOffsetLimit)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_ZeroflowOffsetTestSettlingTime)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_ZeroflowOffsetTestNumberOfLines)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_ZeroflowOffsetTestActivityCheckInterval)).EndInit(); + this.gB_Settings_Preparation.ResumeLayout(false); + this.gB_Settings_Preparation.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_Preparation_StabiTime)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_SettingsPreparationMetersize)).EndInit(); + this.gB_Passwords.ResumeLayout(false); + this.gB_Passwords.PerformLayout(); + this.gB_Settings_TemperatureCalibration.ResumeLayout(false); + this.gB_Settings_TemperatureCalibration.PerformLayout(); + this.gB_SettingsTempMonitor.ResumeLayout(false); + this.gB_SettingsTempMonitor.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_SettingsTempMonitorUpperValue)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_SettingsTempMonitorLowerValue)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_SettingsTempMonitorDeviation)).EndInit(); + this.gB_ComportSetup.ResumeLayout(false); + this.tab_Report.ResumeLayout(false); + this.groupBox_report.ResumeLayout(false); + this.gB_ReportTitlepage.ResumeLayout(false); + this.gB_ReportTitlepage.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.tab_Maintab.ResumeLayout(false); + this.p_ZeroFlowCal_Amplitude.ResumeLayout(false); + this.p_ZeroFlowCal_Amplitude.PerformLayout(); + this.p_ZeroFlowCal_Prepare.ResumeLayout(false); + this.p_ZeroFlowCal_Prepare.PerformLayout(); + this.p_ZeroFlowCal_TempCal.ResumeLayout(false); + this.p_ZeroFlowCal_TempCal.PerformLayout(); + this.p_ZeroFlowCal_Detect.ResumeLayout(false); + this.p_ZeroFlowCal_Detect.PerformLayout(); + this.p_ZeroFlowCal_Offset.ResumeLayout(false); + this.p_ZeroFlowCal_Offset.PerformLayout(); + this.p_ZeroFlowCal_Completion.ResumeLayout(false); + this.p_ZeroFlowCal_Completion.PerformLayout(); + this.pThermo2.ResumeLayout(false); + this.pThermo2.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Thermo2)).EndInit(); + this.pThermo1.ResumeLayout(false); + this.pThermo1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Thermo1)).EndInit(); + this.gB_Progress.ResumeLayout(false); + this.gB_Progress.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Bubbles1)).EndInit(); + this.gB_Meters.ResumeLayout(false); + this.gB_Meters.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Logo1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Meter7)).EndInit(); + this.p_ZeroFlowCal_Meter7.ResumeLayout(false); + this.p_ZeroFlowCal_Meter7.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Meter8)).EndInit(); + this.p_ZeroFlowCal_Meter8.ResumeLayout(false); + this.p_ZeroFlowCal_Meter8.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Meter10)).EndInit(); + this.p_ZeroFlowCal_Meter10.ResumeLayout(false); + this.p_ZeroFlowCal_Meter10.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Meter4)).EndInit(); + this.p_ZeroFlowCal_Meter4.ResumeLayout(false); + this.p_ZeroFlowCal_Meter4.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Meter5)).EndInit(); + this.p_ZeroFlowCal_Meter5.ResumeLayout(false); + this.p_ZeroFlowCal_Meter5.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Meter3)).EndInit(); + this.p_ZeroFlowCal_Meter3.ResumeLayout(false); + this.p_ZeroFlowCal_Meter3.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Meter6)).EndInit(); + this.p_ZeroFlowCal_Meter6.ResumeLayout(false); + this.p_ZeroFlowCal_Meter6.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Meter2)).EndInit(); + this.p_ZeroFlowCal_Meter2.ResumeLayout(false); + this.p_ZeroFlowCal_Meter2.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Meter9)).EndInit(); + this.p_ZeroFlowCal_Meter9.ResumeLayout(false); + this.p_ZeroFlowCal_Meter9.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Meter1)).EndInit(); + this.p_ZeroFlowCal_Meter1.ResumeLayout(false); + this.p_ZeroFlowCal_Meter1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.bindingSource1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; + private System.Windows.Forms.Label label2; + // private GenesisZeroFlow.UserControl1 userControl11; + private System.Windows.Forms.BindingSource bindingSource1; + private System.Windows.Forms.TabPage tab_ZeroFlowCal; + private System.Windows.Forms.TabPage tab_About; + private System.Windows.Forms.PictureBox pictureBox3; + private System.Windows.Forms.PictureBox pictureBox2; + private System.Windows.Forms.Label l_BasedOn; + private System.Windows.Forms.Label l_Author; + private System.Windows.Forms.PictureBox pB_DocumentVersion; + private System.Windows.Forms.PictureBox pB_Logo2; + private System.Windows.Forms.Label l_Version; + private System.Windows.Forms.Label l_About_Info; + private System.Windows.Forms.Label l_About_Author; + private System.Windows.Forms.Label l_About_Version; + private System.Windows.Forms.TabPage tab_Settings; + private System.Windows.Forms.GroupBox gB_ComportSetup; + private System.Windows.Forms.Button BtnOpenSetup; + private System.Windows.Forms.GroupBox gB_SettingsTempMonitor; + private System.Windows.Forms.NumericUpDown nUD_SettingsTempMonitorDeviation; + private System.Windows.Forms.NumericUpDown nUD_SettingsTempMonitorLowerValue; + private System.Windows.Forms.NumericUpDown nUD_SettingsTempMonitorUpperValue; + private System.Windows.Forms.Label l_SettingsTempMonitorDeviation; + private System.Windows.Forms.Label l_SettingsTempMonitorLowerValue; + private System.Windows.Forms.Label l_SettingsTempMonitorUpperValue; + private System.Windows.Forms.GroupBox gB_Settings_TemperatureCalibration; + private System.Windows.Forms.CheckBox cB_TempManualAcquisition; + private System.Windows.Forms.Label lThermo2; + private System.Windows.Forms.Label lPasswordThermo1; + private System.Windows.Forms.TextBox tB_PasswordThermo2; + private System.Windows.Forms.TextBox tB_PasswordThermo1; + private System.Windows.Forms.GroupBox gB_Passwords; + private System.Windows.Forms.TextBox tB_PasswordMeter5; + private System.Windows.Forms.TextBox tB_PasswordMeter10; + private System.Windows.Forms.TextBox tB_PasswordMeter9; + private System.Windows.Forms.TextBox tB_PasswordMeter8; + private System.Windows.Forms.TextBox tB_PasswordMeter7; + private System.Windows.Forms.TextBox tB_PasswordMeter6; + private System.Windows.Forms.TextBox tB_PasswordMeter4; + private System.Windows.Forms.TextBox tB_PasswordMeter3; + private System.Windows.Forms.TextBox tB_PasswordMeter2; + private System.Windows.Forms.TextBox tB_PasswordMeter1; + private System.Windows.Forms.Label l_PasswordMeter10; + private System.Windows.Forms.Label l_PasswordMeter9; + private System.Windows.Forms.Label l_PasswordMeter8; + private System.Windows.Forms.Label l_PasswordMeter7; + private System.Windows.Forms.Label l_PasswordMeter6; + private System.Windows.Forms.Label l_PasswordMeter5; + private System.Windows.Forms.Label l_PasswordMeter4; + private System.Windows.Forms.Label l_PasswordMeter3; + private System.Windows.Forms.Label l_PasswordMeter2; + private System.Windows.Forms.Label l_PasswordMeter1; + private System.Windows.Forms.GroupBox gB_Settings_Preparation; + private System.Windows.Forms.NumericUpDown nUD_SettingsPreparationMetersize; + private System.Windows.Forms.Label l_SettingsPreparationMetersize; + private System.Windows.Forms.NumericUpDown nUD_Settings_Preparation_StabiTime; + private System.Windows.Forms.Label l_Settings_Preparation_StabiTime; + private System.Windows.Forms.GroupBox gB_Settings_ZeroflowOffsetTest; + private System.Windows.Forms.CheckBox cB_OffsetTestLogFiles; + private System.Windows.Forms.NumericUpDown nUD_Settings_ZeroflowOffsetTestActivityCheckInterval; + private System.Windows.Forms.Label l_Settings_ZeroflowOffsetTestActivityCheckInterval; + private System.Windows.Forms.Label l_Settings_ZeroflowOffsetTestNumberOfLines; + private System.Windows.Forms.NumericUpDown nUD_Settings_ZeroflowOffsetTestNumberOfLines; + private System.Windows.Forms.Label l_Settings_ZeroFlowTestSettlingTime; + private System.Windows.Forms.NumericUpDown nUD_Settings_ZeroflowOffsetTestSettlingTime; + private System.Windows.Forms.Label l_Settings_ZeroFlowTestOffsetLimit; + private System.Windows.Forms.NumericUpDown nUD_Settings_ZeroflowOffsetTestOffsetLimit; + private System.Windows.Forms.Label l_Settings_ZeroflowOffsetTestLowerLimit; + private System.Windows.Forms.Label l_Settings_ZeroflowOffsetTestUpperLimit; + private System.Windows.Forms.NumericUpDown nUD_Settings_ZeroflowOffsetTestLowerLimit; + private System.Windows.Forms.NumericUpDown nUD_Settings_ZeroflowOffsetTestUpperLimit; + private System.Windows.Forms.GroupBox gB_Settings_AmplitudeTest; + private System.Windows.Forms.CheckBox cB_AmpLogFiles; + private System.Windows.Forms.NumericUpDown nUD_Settings_AmplitudeActivityCheckInterval; + private System.Windows.Forms.Label l_Settings_AmplitudeActivityCheckInterval; + private System.Windows.Forms.CheckBox cB_MeanAmplitudeFiles; + private System.Windows.Forms.NumericUpDown nUD_PercentageStop; + private System.Windows.Forms.Label l_PercentageStop; + private System.Windows.Forms.Label l_PercentageStart; + private System.Windows.Forms.NumericUpDown nUD_PercentageStart; + private System.Windows.Forms.Label l__Settings_AmplitudeTestMinDistance; + private System.Windows.Forms.NumericUpDown nUD_Settings_AmplitudeTestMinDistance; + private System.Windows.Forms.Label l_Settings_AmplitudeTestLowerLimit; + private System.Windows.Forms.Label l_Settings_AmplitudeTestUpperLimit; + private System.Windows.Forms.NumericUpDown nUD_Settings_AmplitudeTestLowerLimit; + private System.Windows.Forms.NumericUpDown nUD_Settings_AmplitudeTestUpperLimit; + private System.Windows.Forms.PictureBox pB_Logo3; + private System.Windows.Forms.PictureBox pB_AvailableImages; + private System.Windows.Forms.TabPage tab_Report; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.GroupBox groupBox_report; + private System.Windows.Forms.GroupBox gB_ReportTitlepage; + private System.Windows.Forms.RichTextBox rTB_ReportEnterSerialNumber; + private System.Windows.Forms.Label label_Report_EnterSerialNumber; + private System.Windows.Forms.Label l_ReportIntro; + private System.Windows.Forms.RichTextBox rtB_ReportTitlepageIntro; + private System.Windows.Forms.RichTextBox rTB_ReportEnterTitle; + private System.Windows.Forms.Label label_Report_EnterTitle; + private System.Windows.Forms.Label label_Report_EnterOperator; + private System.Windows.Forms.RichTextBox rTB_ReportEnterDate; + private System.Windows.Forms.RichTextBox rTB_ReportEnterOperator; + private System.Windows.Forms.Label label_Report_EnterDate; + private System.Windows.Forms.Button btn_Report_Generate; + private System.Windows.Forms.TabControl tab_Maintab; + private System.Windows.Forms.CheckBox cB_SinglePath; + private System.Windows.Forms.ListBox lbLanguage; + private System.Windows.Forms.Label l_ZeroFlowCal_Status; + private System.Windows.Forms.Button btn_ZeroFlowCal_Pdf; + private System.Windows.Forms.Button btn_ZeroFlowCal_Save; + private System.Windows.Forms.Button btn_ZeroFlowCal_Clear; + private System.Windows.Forms.Button btn_ZeroFlowCal_Abort; + private System.Windows.Forms.Button btn_ZeroFlowCal_Start; + private System.Windows.Forms.Button btn_ZeroFlowCal_Detect; + private System.Windows.Forms.RichTextBox rTB_ZeroFlowCal; + private System.Windows.Forms.PictureBox pB_Logo1; + private System.Windows.Forms.PictureBox pB_Bubbles1; + private System.Windows.Forms.GroupBox gB_Meters; + private System.Windows.Forms.Panel p_ZeroFlowCal_Meter1; + private System.Windows.Forms.PictureBox pB_Meter1; + private System.Windows.Forms.Label l_ZeroFlowCal_Meter1; + private System.Windows.Forms.Panel p_ZeroFlowCal_Meter9; + private System.Windows.Forms.PictureBox pB_Meter9; + private System.Windows.Forms.Label l_ZeroFlowCal_Meter9; + private System.Windows.Forms.Panel p_ZeroFlowCal_Meter2; + private System.Windows.Forms.PictureBox pB_Meter2; + private System.Windows.Forms.Label l_ZeroFlowCal_Meter2; + private System.Windows.Forms.Panel p_ZeroFlowCal_Meter6; + private System.Windows.Forms.PictureBox pB_Meter6; + private System.Windows.Forms.Label l_ZeroFlowCal_Meter6; + private System.Windows.Forms.Panel p_ZeroFlowCal_Meter3; + private System.Windows.Forms.PictureBox pB_Meter3; + private System.Windows.Forms.Label l_ZeroFlowCal_Meter3; + private System.Windows.Forms.Panel p_ZeroFlowCal_Meter5; + private System.Windows.Forms.PictureBox pB_Meter5; + private System.Windows.Forms.Label l_ZeroFlowCal_Meter5; + private System.Windows.Forms.Panel p_ZeroFlowCal_Meter4; + private System.Windows.Forms.PictureBox pB_Meter4; + private System.Windows.Forms.Label l_ZeroFlowCal_Meter4; + private System.Windows.Forms.Panel p_ZeroFlowCal_Meter10; + private System.Windows.Forms.PictureBox pB_Meter10; + private System.Windows.Forms.Label l_ZeroFlowCal_Meter10; + private System.Windows.Forms.Panel p_ZeroFlowCal_Meter8; + private System.Windows.Forms.PictureBox pB_Meter8; + private System.Windows.Forms.Label l_ZeroFlowCal_Meter8; + private System.Windows.Forms.Panel p_ZeroFlowCal_Meter7; + private System.Windows.Forms.PictureBox pB_Meter7; + private System.Windows.Forms.Label l_ZeroFlowCal_Meter7; + private System.Windows.Forms.CheckBox cB_ZeroFlowCal_EnableMeter2; + private System.Windows.Forms.CheckBox cB_ZeroFlowCal_EnableMeter3; + private System.Windows.Forms.CheckBox cB_ZeroFlowCal_EnableMeter4; + private System.Windows.Forms.CheckBox cB_ZeroFlowCal_EnableMeter5; + private System.Windows.Forms.CheckBox cB_ZeroFlowCal_EnableMeter1; + private System.Windows.Forms.CheckBox cB_ZeroFlowCal_EnableMeter6; + private System.Windows.Forms.CheckBox cB_ZeroFlowCal_EnableMeter7; + private System.Windows.Forms.CheckBox cB_ZeroFlowCal_EnableMeter8; + private System.Windows.Forms.CheckBox cB_ZeroFlowCal_EnableMeter9; + private System.Windows.Forms.CheckBox cB_ZeroFlowCal_EnableMeter10; + private System.Windows.Forms.GroupBox gB_Progress; + private System.Windows.Forms.CheckBox cB_Thermo1; + private System.Windows.Forms.CheckBox cB_Thermo2; + private System.Windows.Forms.Panel pThermo1; + private System.Windows.Forms.Label l_Thermo1; + private System.Windows.Forms.PictureBox pB_Thermo1; + private System.Windows.Forms.Panel pThermo2; + private System.Windows.Forms.Label l_Thermo2; + private System.Windows.Forms.PictureBox pB_Thermo2; + private System.Windows.Forms.CheckBox cB_ZeroFlowOffsetTestEnable; + private System.Windows.Forms.CheckBox cB_TempCalEnable; + private System.Windows.Forms.CheckBox cB_AmplitudeTestEnable; + private System.Windows.Forms.Panel p_ZeroFlowCal_Completion; + private System.Windows.Forms.Label l_ZeroFlowCal_Completion; + private System.Windows.Forms.ProgressBar pB_ZeroFlowCal_Progress; + private System.Windows.Forms.Label l_ZeroFlowCal_ResttimeDisplayValue; + private System.Windows.Forms.Panel p_ZeroFlowCal_Offset; + private System.Windows.Forms.Label l_ZeroFlowCal_Offset; + private System.Windows.Forms.Label l_ZeroFlowCal_Resttime; + private System.Windows.Forms.Panel p_ZeroFlowCal_Detect; + private System.Windows.Forms.Label l_ZeroFlowCal_Detect; + private System.Windows.Forms.Panel p_ZeroFlowCal_TempCal; + private System.Windows.Forms.Label l_ZeroFlowCal_TempCal; + private System.Windows.Forms.Panel p_ZeroFlowCal_Prepare; + private System.Windows.Forms.Label l_ZeroFlowCal_Prepare; + private System.Windows.Forms.Panel p_ZeroFlowCal_Amplitude; + private System.Windows.Forms.Label l_ZeroFlowCal_Amplitude; + } +} + diff --git a/ZeroFlowTool/Form1.cs b/ZeroFlowTool/Form1.cs new file mode 100644 index 00000000..9904e8f7 --- /dev/null +++ b/ZeroFlowTool/Form1.cs @@ -0,0 +1,2123 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Globalization; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Diagnostics; +using System.IO; +using GenesisDisplayTool; +using System.Collections.Concurrent; +using GenesisDisplayTool.Itinerary; +using Xylem.Common.Hardware.WaterMeter.WaterMeterCore; +using Xylem.Common.Ui.GenesisToolBox; +using Xylem.Common.CommonCore.Consts; +using Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords; +using System.Drawing; +using System.Threading; + +namespace GenesisZeroFlow +{ + + public partial class GenesisZeroFlow : Form + { + //UInt16 ScrRes = + CultureInfo CultureDe = CultureInfo.CreateSpecificCulture("de-DE"); + CultureInfo CultureEn = CultureInfo.CreateSpecificCulture("en-US"); + + public CultureInfo GetGlobalCulture() + { + Int32 Index = GetSelectedLanguageIndex(); + + if (Int32.Equals(Index, 0)) + return CultureDe; + else + return CultureEn; + } + + public Int32 GetSelectedLanguageIndex() + { + Int32 temp = 0; + if (InvokeRequired) + { + lbLanguage.Invoke(new Action(() => + { + temp = lbLanguage.SelectedIndex; + })); + + return temp; + } + return lbLanguage.SelectedIndex; + } + + public Double GetUpperTempLimit() + { + Double temp = 0; + if (InvokeRequired) + { + nUD_SettingsTempMonitorUpperValue.Invoke(new Action(() => + { + temp = (Double)nUD_SettingsTempMonitorUpperValue.Value; + })); + + return temp; + } + return (Double)nUD_SettingsTempMonitorUpperValue.Value; + } + + public Double GetLowerTempLimit() + { + Double temp = 0; + if (InvokeRequired) + { + nUD_SettingsTempMonitorLowerValue.Invoke(new Action(() => + { + temp = (Double)nUD_SettingsTempMonitorLowerValue.Value; + })); + + return temp; + } + return (Double)nUD_SettingsTempMonitorLowerValue.Value; + } + + public Double GetTempDeviationLimit() + { + Double temp = 0; + if (InvokeRequired) + { + nUD_SettingsTempMonitorDeviation.Invoke(new Action(() => + { + temp = (Double)nUD_SettingsTempMonitorDeviation.Value; + })); + + return temp; + } + return (Double)nUD_SettingsTempMonitorDeviation.Value; + } + public String GetLoggingFromTextBox() + { + String temp = String.Empty; + + if (InvokeRequired) + { + rTB_ZeroFlowCal.Invoke(new Action(() => + { + temp = rTB_ZeroFlowCal.Text; + })); + + return temp; + } + return rTB_ZeroFlowCal.Text; + } + + + #region Object declarations + CmdInterface CommandInterface1 = new CmdInterface(); + CmdInterface CommandInterface2 = new CmdInterface(); + CmdInterface CommandInterface3 = new CmdInterface(); + CmdInterface CommandInterface4 = new CmdInterface(); + CmdInterface CommandInterface5 = new CmdInterface(); + CmdInterface CommandInterface6 = new CmdInterface(); + CmdInterface CommandInterface7 = new CmdInterface(); + CmdInterface CommandInterface8 = new CmdInterface(); + CmdInterface CommandInterface9 = new CmdInterface(); + CmdInterface CommandInterface10 = new CmdInterface(); + #endregion + #region Global parameters + public String[] PcbID = new String[Constants.NumberOfMeters] { String.Empty, String.Empty, String.Empty, String.Empty, String.Empty, String.Empty, String.Empty, String.Empty, String.Empty, String.Empty }; + public String[] ThermoID = new String[Constants.NumberOfThermometers] { String.Empty, String.Empty }; + private List[][] AmplitudeValuesUp = new List[Constants.NumberOfMeters][]; + private List[][] AmplitudeValuesDown = new List[Constants.NumberOfMeters][]; + private List[][] totalTimeOfFlightAverage = new List[Constants.NumberOfMeters][]; + + + + //private List[][] Temperatures = new List[Constants.NumberOfThermometers][]; + + + class tempHelper + { + public int meter; + public int channel; + + ConcurrentStack values = new ConcurrentStack(); + + public Double getAvg() + { + var list = values.ToList(); + if (!list.Any()) return 0; + + var a = list.Average(); + values = new ConcurrentStack(); + return a; + } + + public void add(Double v) + { + values.Push(v); + } + + } + + private ConcurrentBag TemperaturesThreadSafe = new ConcurrentBag(); + + private void BagDemo() + { + //init + TemperaturesThreadSafe.Add(new tempHelper() { channel = 1, meter = 2 }); + //add + TemperaturesThreadSafe.Where(t => t.meter.Equals(2) && t.channel.Equals(1)).First().add(1); + // get avg + TemperaturesThreadSafe.Where(t => t.meter.Equals(2) && t.channel.Equals(1)).First().getAvg(); + + + } + + public List[][] GetTotalTimeOfFlightAverage() + { + return (List[][])totalTimeOfFlightAverage.Clone(); + } + + public void InitTemperatures() + { + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + TemperaturesThreadSafe.Add(new tempHelper() { channel = Path, meter = Constants.Thermo1 }); + TemperaturesThreadSafe.Add(new tempHelper() { channel = Path, meter = Constants.Thermo2 }); + } + } + + public Double GetTemperatures(UInt16 Thermo, UInt16 Path) + { + return TemperaturesThreadSafe.Where(t => t.meter.Equals(Thermo) && t.channel.Equals(Path)).First().getAvg(); + } + + public void SetTemperatures(UInt16 Thermo, UInt16 Path, Double value) + { + TemperaturesThreadSafe.Where(t => t.meter.Equals(Thermo) && t.channel.Equals(Path)).First().add(value); + } + public void ClearTotalTimeOfFlightAverage(UInt16 meterNumber, UInt16 path) + { + totalTimeOfFlightAverage[meterNumber][path].Clear(); + } + private List[][] DeltaTimeOfFlightAverageRAW = new List[Constants.NumberOfMeters][]; + private List[][] DeltaTimeOfFlightAverage = new List[Constants.NumberOfMeters][]; + private String[] dataToLog = new String[Constants.NumberOfMeters]; + public void SetDataToLog(UInt16 meterNumber, String data) + { + dataToLog[meterNumber] = data; + } + public String[] GetDataToLog() + { + return (String[])dataToLog.Clone(); + } + private String[][] AmpValuesToLog = new String[Constants.NumberOfMeters][]; + public String[][] GetAmpValuesToLog() + { + return (String[][])AmpValuesToLog.Clone(); + } + public void SetAmpValuesToLog(UInt16 meterNumber, UInt16 path, String data) + { + AmpValuesToLog[meterNumber][path] = data; + } + + + + private Boolean[] loggingIndicatorZeroFlowTest = new Boolean[Constants.NumberOfMeters]; + + public void SetLoggingIndicatorZeroFlowTest(Boolean value, UInt16 meterNumber) + { + loggingIndicatorZeroFlowTest[meterNumber] = value; + } + public Boolean[] GetLoggingIndicatorZeroFlowTest() + { + return (Boolean[])loggingIndicatorZeroFlowTest.Clone(); + } + private Boolean[] calculationIndicatorZeroFlowTest = new Boolean[Constants.NumberOfMeters]; + public void SetCalculationIndicatorZeroFlowTest(Boolean value, UInt16 meterNumber) + { + calculationIndicatorZeroFlowTest[meterNumber] = value; + } + public Boolean[] GetCalculationIndicatorZeroFlowTest() + { + return (Boolean[])calculationIndicatorZeroFlowTest.Clone(); + } + + + private String[] LoggingPathZeroFlowTest = new String[Constants.NumberOfMeters]; + public String[] GetLoggingPathZeroFlowTest() + { + return (String[])LoggingPathZeroFlowTest.Clone(); + } + public void SetLoggingPathZeroFlowTest(UInt16 meterNumber, String data) + { + LoggingPathZeroFlowTest[meterNumber] = data; + } + private Int32[][] BadDataCounterZeroFlowTest = new Int32[Constants.NumberOfMeters][]; + private Int32[][] LineCounterZeroFlowTest = new Int32[Constants.NumberOfMeters][]; + public void SetLineCounterZeroFlowTest(UInt16 meterNumber, UInt16 path, Int32 data) + { + LineCounterZeroFlowTest[meterNumber][path] = data; + } + + private Boolean[][] NewDataIndicatorTemperatureTest = new Boolean[Constants.NumberOfThermometers][]; + private Boolean[] StartLoggingIndicatorAmplitudeTest = new Boolean[Constants.NumberOfMeters]; + private Boolean[] LoggingIndicatorAmpTest = new Boolean[Constants.NumberOfMeters]; + private Boolean[] TofIndicatorAmplitudeTest = new Boolean[Constants.NumberOfMeters]; + private Boolean[] LoggingIndicatorThermoMonitoring = new Boolean[Constants.NumberOfThermometers]; + public Boolean GetNewDataIndicatorTemperatureTest(UInt16 thermo, UInt16 path) + { + return NewDataIndicatorTemperatureTest[thermo][path]; + } + public void SetLoggingIndicatorThermoMonitoring(UInt16 thermoNumber, Boolean value) + { + if (thermoNumber < Constants.NumberOfThermometers) + LoggingIndicatorThermoMonitoring[thermoNumber] = value; + } + public Boolean[] GetLoggingIndicatorThermoMonitoring() + { + return LoggingIndicatorThermoMonitoring; + } + public void SetLoggingIndicatorAmpTest(UInt16 meterNumber, Boolean value) + { + if (meterNumber < Constants.NumberOfMeters) + LoggingIndicatorAmpTest[meterNumber] = value; + } + + public Boolean[] GetTofIndicatorAmplitudeTest() + { + return TofIndicatorAmplitudeTest; + } + public void SetTofIndicatorAmplitudeTest(UInt16 meterNumber, Boolean value) + { + if (meterNumber < Constants.NumberOfMeters) + TofIndicatorAmplitudeTest[meterNumber] = value; + } + + public Boolean[] GetLoggingIndicatorAmpTest() + { + return LoggingIndicatorAmpTest; + } + private Boolean[] IndicatorTemperatureActivityCheck = new Boolean[Constants.NumberOfThermometers]; + public void SetIndicatorTemperatureActivityCheck(UInt16 thermoNumber, Boolean value) + { + if (thermoNumber < Constants.NumberOfThermometers) + IndicatorTemperatureActivityCheck[thermoNumber] = value; + } + private Boolean[] LoggingIndicatorEmptyPipeTest = new Boolean[Constants.NumberOfMeters]; + public void SetLoggingIndicatorEmptyPipeTest(UInt16 meterNumber, Boolean value) + { + if (meterNumber < Constants.NumberOfMeters) + LoggingIndicatorEmptyPipeTest[meterNumber] = value; + } + private Boolean[] LoggingIndicatorThermoEmptyPipeTest = new Boolean[Constants.NumberOfThermometers]; + public void SetLoggingIndicatorThermoEmptyPipeTest(UInt16 thermoNumber, Boolean value) + { + if (thermoNumber < Constants.NumberOfThermometers) + LoggingIndicatorThermoEmptyPipeTest[thermoNumber] = value; + } + private String[] LoggingPathAmplitudeTest = new String[Constants.NumberOfMeters]; + public String[] GetLoggingPathAmplitudeTest() + { + return (String[])LoggingPathAmplitudeTest.Clone(); + } + public void SetLoggingPathAmplitudeTest(UInt16 meterNumber, String data) + { + LoggingPathAmplitudeTest[meterNumber] = data; + } + private Int32[][] LineCounterAmplitudeTest = new Int32[Constants.NumberOfMeters][]; + public Int32[][] GetLineCounterAmplitudeTest() + { + return (Int32[][])LineCounterAmplitudeTest; + } + private Int32[][] LineCounterEmptyPipeTest = new Int32[Constants.NumberOfMeters][]; + public Int32[][] GetLineCounterEmptyPipeTest() + { + return (Int32[][])LineCounterEmptyPipeTest; + } + + public void SetLineCounterEmptyPipeTest(Int32 value, UInt16 meterNumber, UInt16 path) + { + if (meterNumber < Constants.NumberOfMeters) + LineCounterEmptyPipeTest[meterNumber][path] = value; + } + + private Int32[][] LineCounterThermoEmptyPipeTest = new Int32[Constants.NumberOfMeters][]; + public Int32[][] GetLineCounterThermoEmptyPipeTest() + { + return (Int32[][])LineCounterThermoEmptyPipeTest; + } + + public void SetLineCounterThermoEmptyPipeTest(Int32 value, UInt16 meterNumber, UInt16 path) + { + if (meterNumber < Constants.NumberOfMeters) + LineCounterThermoEmptyPipeTest[meterNumber][path] = value; + } + private Int32[][] LineCounterTemperatureTest = new Int32[Constants.NumberOfThermometers][]; + public Int32[][] GetLineCounterTemperatureTest() + { + return (Int32[][])LineCounterTemperatureTest; + } + public void SetLineCounterTemperatureTest(Int32 value, UInt16 meterNumber, UInt16 path) + { + if (meterNumber < Constants.NumberOfMeters) + LineCounterTemperatureTest[meterNumber][path] = value; + } + + MeterBatch GlobalMeterBatch = new MeterBatch(); + MeterBatch ThermoMeterBatch = new MeterBatch(); + + private Boolean abortIndicator = false; + public Boolean AbortIndicator { get { return abortIndicator; } set { abortIndicator = value; } } + public Boolean[] PreparationFailed { get; private set; } + private Boolean[] EmptyPipeCheckEnable; + public Boolean[] EmptyPipeCheckFailed { get; private set; } + + private Boolean[] StabilizationEnable; + public Boolean[] StabilizationFailed + { + get; private set; + } + public Boolean[] LoginFailed { get; private set; } + public Boolean[] ThermoLoginFailed { get; private set; } + public Boolean[] AmplitudeEnable { get; private set; } + public Boolean[] AmplitudeFailed { get; private set; } + public Boolean[] CompletionEnable { get; private set; } + public Boolean[] ZeroFlowOffsetEnable { get; private set; } + public Boolean[] ZeroFlowOffsetFailed { get; private set; } + public Boolean[] TempCalEnable { get; private set; } + public Boolean[] TempCalFailed { get; private set; } + public Boolean[] CompletionFailed { get; private set; } + + private Boolean WaitForTemperatureField = false; + public void SetWaitForTemperatureField(Boolean value) + { + WaitForTemperatureField = value; + } + public Boolean[] SerialPortOpenFlag = new Boolean[2 * Constants.NumberOfMeters]; + public Boolean[] ThermoSerialPortOpenFlag = new Boolean[2 * Constants.NumberOfThermometers]; + #endregion + #region Register read back + private Int32[][] ToFTempOffset = new Int32[Constants.NumberOfMeters][]; + public Int32[][] GetToFTempOffset() + { + return (Int32[][])ToFTempOffset.Clone(); + } + public void SetToFTempOffset(UInt16 meterNumber, UInt16 path, Int32 data) + { + ToFTempOffset[meterNumber][path] = data; + } + private Int32[][] ZeroFlowOffset = new Int32[Constants.NumberOfMeters][]; + public Int32[][] GetZeroFlowOffset() + { + return (Int32[][])ZeroFlowOffset.Clone(); + } + public void SetZeroFlowOffset(UInt16 meterNumber, UInt16 path, Int32 data) + { + ZeroFlowOffset[meterNumber][path] = data; + } + private Byte[][] FirstHitPercentage = new Byte[Constants.NumberOfMeters][]; + public Byte[][] GetFirstHitPercentage() + { + return (Byte[][])FirstHitPercentage.Clone(); + } + public void SetFirstHitPercentage(UInt16 meterNumber, UInt16 path, Byte data) + { + FirstHitPercentage[meterNumber][path] = data; + } + private UInt16[][] CalFactor = new UInt16[Constants.NumberOfMeters][]; + public void SetCalFactor(UInt16 meterNumber, UInt16 path, UInt16 data) + { + CalFactor[meterNumber][path] = data; + } + public UInt16[][] GetCalFactor() + { + return (UInt16[][])CalFactor.Clone(); + } + #endregion + #region Decoded data parameters + #region >>>> Central exchange object <<<< + // ****** The most important object ****** + // *************************************** + private CalibrationRecord[][] DecodedAllMeters = new CalibrationRecord[Constants.NumberOfMeters][]; + private CalibrationRecord[][] DecodedAllThermometers = new CalibrationRecord[Constants.NumberOfThermometers][]; + public CalibrationRecord[][] GetDecodedAllMeters() + { + return (CalibrationRecord[][])DecodedAllMeters.Clone(); + } + public CalibrationRecord[][] GetDecodedAllThermometers() + { + return (CalibrationRecord[][])DecodedAllThermometers.Clone(); + } + // *************************************** + // *************************************** + #endregion + #endregion + #region Serial port parameters + private List[] RxStringCmd = new List[Constants.NumberOfMeters]; + private String[] RxDataBuffer = new String[Constants.NumberOfMeters]; + #endregion + #region Initializations + public GenesisZeroFlow() + { + #region Initialize component + InitializeComponent(); + _GenesisZeroFlow = this; + #endregion + #region Initialize serial data list + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + RxStringCmd[Meter] = new List(); + #endregion + } + #endregion + // #region Control elements + public static GenesisZeroFlow _GenesisZeroFlow; + + //public static PreAdjustmentControl PreAdjustmentControl = new PreAdjustmentControl(); + private void Form1_FormOpening(Object sender, EventArgs e) + { + // tab_ZeroFlowCal.Controls.Add(PreAdjustmentControl); + + + Display.AbortButtonEnabled(false); + InitTemperatures(); + CultureInfo Culture = GetGlobalCulture(); + CommandInterface1.Initialize(Constants.Meter, Constants.Meter1, Culture); + CommandInterface2.Initialize(Constants.Meter, Constants.Meter2, Culture); + CommandInterface3.Initialize(Constants.Meter, Constants.Meter3, Culture); + CommandInterface4.Initialize(Constants.Meter, Constants.Meter4, Culture); + CommandInterface5.Initialize(Constants.Meter, Constants.Meter5, Culture); + CommandInterface6.Initialize(Constants.Meter, Constants.Meter6, Culture); + CommandInterface7.Initialize(Constants.Meter, Constants.Meter7, Culture); + CommandInterface8.Initialize(Constants.Meter, Constants.Meter8, Culture); + CommandInterface9.Initialize(Constants.Meter, Constants.Meter9, Culture); + CommandInterface10.Initialize(Constants.Meter, Constants.Meter10, Culture); + + for (UInt16 Flag = 0; Flag < (SerialPortOpenFlag.Count()); Flag++) + SerialPortOpenFlag[Flag] = false; + + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + { + DecodedAllMeters[Meter] = new CalibrationRecord[Constants.NumberOfPaths]; + totalTimeOfFlightAverage[Meter] = new List[Constants.NumberOfPaths]; + DeltaTimeOfFlightAverageRAW[Meter] = new List[Constants.NumberOfPaths]; + DeltaTimeOfFlightAverage[Meter] = new List[Constants.NumberOfPaths]; + AmplitudeValuesUp[Meter] = new List[Constants.NumberOfPaths]; + AmplitudeValuesDown[Meter] = new List[Constants.NumberOfPaths]; + BadDataCounterZeroFlowTest[Meter] = new Int32[Constants.NumberOfPaths]; + LineCounterZeroFlowTest[Meter] = new Int32[Constants.NumberOfPaths]; + LineCounterAmplitudeTest[Meter] = new Int32[Constants.NumberOfPaths]; + LineCounterEmptyPipeTest[Meter] = new Int32[Constants.NumberOfPaths]; + ToFTempOffset[Meter] = new Int32[Constants.NumberOfPaths]; + ZeroFlowOffset[Meter] = new Int32[Constants.NumberOfPaths]; + FirstHitPercentage[Meter] = new Byte[Constants.NumberOfPaths]; + CalFactor[Meter] = new UInt16[Constants.NumberOfPaths]; + LoggingPathZeroFlowTest[Meter] = String.Empty; + StartLoggingIndicatorAmplitudeTest[Meter] = false; + LoggingIndicatorAmpTest[Meter] = false; + AmpValuesToLog[Meter] = new String[Constants.NumberOfPaths]; + } + + for (UInt16 Thermo = 0; Thermo < Constants.NumberOfThermometers; Thermo++) + { + MeasuredTemps[Thermo] = new Double[Constants.NumberOfPaths]; + MeasuredTempsIndicator[Thermo] = new Boolean[Constants.NumberOfPaths]; + DecodedAllThermometers[Thermo] = new CalibrationRecord[Constants.NumberOfPaths]; + NewDataIndicatorTemperatureTest[Thermo] = new Boolean[Constants.NumberOfPaths]; + LineCounterTemperatureTest[Thermo] = new Int32[Constants.NumberOfPaths]; + LineCounterThermoEmptyPipeTest[Thermo] = new Int32[Constants.NumberOfPaths]; + } + for (UInt16 Thermo = 0; Thermo < Constants.NumberOfThermometers; Thermo++) + { + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + MeasuredTemps[Thermo][Path] = new Double(); + MeasuredTempsIndicator[Thermo][Path] = new Boolean(); + DecodedAllThermometers[Thermo][Path] = new CalibrationRecord(); + NewDataIndicatorTemperatureTest[Thermo][Path] = new Boolean(); + LineCounterTemperatureTest[Thermo][Path] = new Int32(); + LineCounterThermoEmptyPipeTest[Thermo][Path] = new Int32(); + } + } + + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + { + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + totalTimeOfFlightAverage[Meter][Path] = new List(); + DeltaTimeOfFlightAverage[Meter][Path] = new List(); + DeltaTimeOfFlightAverageRAW[Meter][Path] = new List(); + AmplitudeValuesUp[Meter][Path] = new List(); + AmplitudeValuesDown[Meter][Path] = new List(); + BadDataCounterZeroFlowTest[Meter][Path] = new Int32(); + LineCounterZeroFlowTest[Meter][Path] = new Int32(); + LineCounterAmplitudeTest[Meter][Path] = new Int32(); + LineCounterEmptyPipeTest[Meter][Path] = new Int32(); + ToFTempOffset[Meter][Path] = new Int32(); + ZeroFlowOffset[Meter][Path] = new Int32(); + FirstHitPercentage[Meter][Path] = new Byte(); + DecodedAllMeters[Meter][Path] = new CalibrationRecord(); + CalFactor[Meter][Path] = new UInt16(); + } + } + #region Set initial images + pB_Meter1.Image = pB_Meter1.InitialImage; + pB_Meter2.Image = pB_Meter2.InitialImage; + pB_Meter3.Image = pB_Meter3.InitialImage; + pB_Meter4.Image = pB_Meter4.InitialImage; + pB_Meter5.Image = pB_Meter5.InitialImage; + pB_Meter6.Image = pB_Meter6.InitialImage; + pB_Meter7.Image = pB_Meter7.InitialImage; + pB_Meter8.Image = pB_Meter8.InitialImage; + pB_Meter9.Image = pB_Meter9.InitialImage; + pB_Meter10.Image = pB_Meter10.InitialImage; + #endregion + #region Set default culture + CultureInfo.DefaultThreadCurrentCulture = GetGlobalCulture(); + CultureInfo.DefaultThreadCurrentUICulture = GetGlobalCulture(); + #endregion + #region Get date + rTB_ReportEnterDate.Text = DateTime.Now.ToString(Formats.ReportDateTimeTitleString, GetGlobalCulture()); + #endregion + #region Set default tab + //tab_Maintab.TabPages.Remove(tab_Report); + tab_Maintab.SelectedTab = tab_ZeroFlowCal; + #endregion + #region Tooltips + #region Definitions and initializations + ToolTip ToolTip1 = new ToolTip(); + #endregion + #region Tool tip settings + ToolTip1.AutoPopDelay = 5000; + ToolTip1.InitialDelay = 100; + ToolTip1.ReshowDelay = 500; + ToolTip1.ShowAlways = true; + #endregion + #region Tool tip implementation + #region Form1 Tool tips + ToolTip1.SetToolTip(this.pB_Logo1, "www.sensus.com"); + #endregion + #region Settings tool tips + ToolTip1.SetToolTip(this.btn_ZeroFlowCal_Start, "Start sequence"); + ToolTip1.SetToolTip(this.tB_PasswordMeter1, "Enter hexadecimal password string!\nSkeleton key is send out on DATA\nCHANNEL after reboot."); + ToolTip1.SetToolTip(this.tB_PasswordMeter2, "Enter hexadecimal password string!\nSkeleton key is send out on DATA\nCHANNEL after reboot."); + ToolTip1.SetToolTip(this.tB_PasswordMeter3, "Enter hexadecimal password string!\nSkeleton key is send out on DATA\nCHANNEL after reboot."); + ToolTip1.SetToolTip(this.tB_PasswordMeter4, "Enter hexadecimal password string!\nSkeleton key is send out on DATA\nCHANNEL after reboot."); + ToolTip1.SetToolTip(this.tB_PasswordMeter5, "Enter hexadecimal password string!\nSkeleton key is send out on DATA\nCHANNEL after reboot."); + ToolTip1.SetToolTip(this.tB_PasswordMeter6, "Enter hexadecimal password string!\nSkeleton key is send out on DATA\nCHANNEL after reboot."); + ToolTip1.SetToolTip(this.tB_PasswordMeter7, "Enter hexadecimal password string!\nSkeleton key is send out on DATA\nCHANNEL after reboot."); + ToolTip1.SetToolTip(this.tB_PasswordMeter8, "Enter hexadecimal password string!\nSkeleton key is send out on DATA\nCHANNEL after reboot."); + ToolTip1.SetToolTip(this.tB_PasswordMeter9, "Enter hexadecimal password string!\nSkeleton key is send out on DATA\nCHANNEL after reboot."); + ToolTip1.SetToolTip(this.tB_PasswordMeter10, "Enter hexadecimal password string!\nSkeleton key is send out on DATA\nCHANNEL after reboot."); + ToolTip1.SetToolTip(this.nUD_Settings_AmplitudeTestLowerLimit, "Lower limit for calculated optimal point"); + ToolTip1.SetToolTip(this.nUD_Settings_AmplitudeTestUpperLimit, "Upper limit for calculated optimal point"); + ToolTip1.SetToolTip(this.nUD_PercentageStart, "Start value for percentage register sweep"); + ToolTip1.SetToolTip(this.nUD_PercentageStop, "Stop value for percentage register sweep"); + #endregion + #endregion + #endregion + #region Application settings + Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.RealTime; + System.Runtime.GCSettings.LatencyMode = System.Runtime.GCLatencyMode.SustainedLowLatency; + //System.Runtime.GCSettings.LatencyMode = System.Runtime.GCLatencyMode.LowLatency; + //StartUpDisable = false; // to suppress checked change event of check boxes for switching between single and mass logging during start up + #endregion + + if (CultureInfo.InstalledUICulture.Equals(CultureDe)) + { + lbLanguage.SelectedIndex = 0; + Display.SetControlText(CultureDe); + + } + else if (CultureInfo.InstalledUICulture.Equals(CultureEn)) + { + lbLanguage.SelectedIndex = 1; + Display.SetControlText(CultureEn); + } + + var nlogFile = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Genesis", ProgramConfig.NlogConfig); + var dir = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Genesis"); + + + if (!Directory.Exists(dir)) + { + Directory.CreateDirectory(dir); + } + + if (!File.Exists(nlogFile)) + { + var fileCop = ProgramConfig.NlogConfig; + try + { + System.IO.File.Copy(fileCop, nlogFile); + } + catch (Exception) + { + MessageBox.Show("Logfiles not created, call developer"); + } + + } + + var configfile = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Genesis", ProgramConfig.SerialConfigFileName); + + if (!File.Exists(configfile)) + { + MessageBox.Show("No Configuration, please do setup"); + var setupWindow = new FrmSetup(); + setupWindow.ShowDialog(); + } + } + private void Form1_FormClosing(Object sender, FormClosingEventArgs e) + { + #region Definitions and initializations + CultureInfo Culture = GetGlobalCulture(); + DateTime time = new DateTime(); + time = DateTime.Now; + String TimeForHeader = time.ToString(Formats.RawDataDateTimeLogString, Culture); + String TimeForFilename = time.ToString(Formats.LogFileDateTimeString, Culture); + String Username = System.Security.Principal.WindowsIdentity.GetCurrent().Name; + String ClosingPath = $"{DataLogging.DefaultPath}ZeroflowCalibrationTool_EventLogging_{TimeForFilename}.txt"; + String Header = $"Filename = {Path.GetFileName(ClosingPath)}; User = {Username}; Date/Time = {TimeForHeader}\n"; + String Data = rTB_ZeroFlowCal.Text; + #endregion + #region Logfile + Logging.WriteToFile($"{Header}{Data}", ClosingPath); + #endregion + + Environment.Exit(0); + } + + private void btn_ZeroFlowCal_Detect_Click(object sender, EventArgs e) + { + CultureInfo Culture = GetGlobalCulture(); + + if (cB_SinglePath.Checked) + Constants.NumberOfPaths = 1; + else + Constants.NumberOfPaths = 3; + + try + { + btn_ZeroFlowCal_Detect.Enabled = false; + if (GlobalMeterBatch.ListOfMeters.Any()) + GlobalMeterBatch.RemoveAllMeters(); + + if (ThermoMeterBatch.ListOfMeters.Any()) + ThermoMeterBatch.RemoveAllMeters(); + + GlobalMeterBatch = new MeterBatch(); + ThermoMeterBatch = new MeterBatch(); + + #region Definitions and initializations + if (cB_ZeroFlowCal_EnableMeter1.Checked) + GlobalMeterBatch.AddMeter(new ZeroFlowGenesisMeter(Constants.Slot1)); + + if (cB_ZeroFlowCal_EnableMeter2.Checked) + GlobalMeterBatch.AddMeter(new ZeroFlowGenesisMeter(Constants.Slot2)); + + if (cB_ZeroFlowCal_EnableMeter3.Checked) + GlobalMeterBatch.AddMeter(new ZeroFlowGenesisMeter(Constants.Slot3)); + + if (cB_ZeroFlowCal_EnableMeter4.Checked) + GlobalMeterBatch.AddMeter(new ZeroFlowGenesisMeter(Constants.Slot4)); + + if (cB_ZeroFlowCal_EnableMeter5.Checked) + GlobalMeterBatch.AddMeter(new ZeroFlowGenesisMeter(Constants.Slot5)); + + if (cB_ZeroFlowCal_EnableMeter6.Checked) + GlobalMeterBatch.AddMeter(new ZeroFlowGenesisMeter(Constants.Slot6)); + + if (cB_ZeroFlowCal_EnableMeter7.Checked) + GlobalMeterBatch.AddMeter(new ZeroFlowGenesisMeter(Constants.Slot7)); + + if (cB_ZeroFlowCal_EnableMeter8.Checked) + GlobalMeterBatch.AddMeter(new ZeroFlowGenesisMeter(Constants.Slot8)); + + if (cB_ZeroFlowCal_EnableMeter9.Checked) + GlobalMeterBatch.AddMeter(new ZeroFlowGenesisMeter(Constants.Slot9)); + + if (cB_ZeroFlowCal_EnableMeter10.Checked) + GlobalMeterBatch.AddMeter(new ZeroFlowGenesisMeter(Constants.Slot10)); + + #region Thermometer + if (cB_Thermo1.Checked) + ThermoMeterBatch.AddMeter(new ZeroFlowGenesisMeter(Constants.Slot11)); // Thermometer + + if (cB_Thermo2.Checked) + ThermoMeterBatch.AddMeter(new ZeroFlowGenesisMeter(Constants.Slot12)); // Thermometer + #endregion + + foreach (var generalMeter in GlobalMeterBatch.ListOfMeters) + { + if (generalMeter is ZeroFlowGenesisMeter) + { + var Meter = generalMeter as ZeroFlowGenesisMeter; + Meter.LogOnEnable = SerialPortOpenFlag[Meter.Slot - 1] & SerialPortOpenFlag[(Meter.Slot - 1) + Constants.NumberOfMeters]; + Meter.LoginFailed = false; + Meter.PreparationFailed = false; + Meter.AmplitudeFailed = false; + Meter.ZeroFlowOffsetFailed = false; + Meter.AmplitudeFailed = false; + Meter.CompletionFailed = false; + Meter.Ok = false; + Meter.EmptyPipeCheckEnable = false; + Meter.EmptyPipeCheckFailed = false; + } + } + + foreach (var generalMeter in ThermoMeterBatch.ListOfMeters) + { + if (generalMeter is ZeroFlowGenesisMeter) + { + var Meter = generalMeter as ZeroFlowGenesisMeter; + Meter.LogOnEnable = ThermoSerialPortOpenFlag[Meter.Slot - 11] & ThermoSerialPortOpenFlag[(Meter.Slot - 11) + Constants.NumberOfThermometers]; + Meter.LoginFailed = false; + Meter.PreparationFailed = false; + Meter.AmplitudeFailed = false; + Meter.ZeroFlowOffsetFailed = false; + Meter.AmplitudeFailed = false; + Meter.CompletionFailed = false; + Meter.Ok = false; + Meter.EmptyPipeCheckEnable = false; + Meter.EmptyPipeCheckFailed = false; + } + } + #endregion + Misc.WaitNSeconds(2, true); + btn_ZeroFlowCal_Detect.Enabled = true; + } + catch (Exception ex) + { + MessageBox.Show(PredefinedMessages.DetectFailed(Culture)); + btn_ZeroFlowCal_Detect.Enabled = true; + return; + } + + #region Definitions and initializations + Boolean[] EnableOpening = new Boolean[Constants.NumberOfMeters]; + Boolean[] ThermoEnableOpening = new Boolean[Constants.NumberOfThermometers]; + Boolean[] Ok = new Boolean[2 * Constants.NumberOfMeters]; + Boolean[] ThermoOk = new Boolean[2 * Constants.NumberOfThermometers]; + Boolean[] SetToUnknownStatus = new Boolean[Constants.NumberOfMeters]; + Boolean[] ThermoSetToUnknownStatus = new Boolean[Constants.NumberOfThermometers]; + + EnableOpening[Constants.Meter1] = cB_ZeroFlowCal_EnableMeter1.Checked; + EnableOpening[Constants.Meter2] = cB_ZeroFlowCal_EnableMeter2.Checked; + EnableOpening[Constants.Meter3] = cB_ZeroFlowCal_EnableMeter3.Checked; + EnableOpening[Constants.Meter4] = cB_ZeroFlowCal_EnableMeter4.Checked; + EnableOpening[Constants.Meter5] = cB_ZeroFlowCal_EnableMeter5.Checked; + EnableOpening[Constants.Meter6] = cB_ZeroFlowCal_EnableMeter6.Checked; + EnableOpening[Constants.Meter7] = cB_ZeroFlowCal_EnableMeter7.Checked; + EnableOpening[Constants.Meter8] = cB_ZeroFlowCal_EnableMeter8.Checked; + EnableOpening[Constants.Meter9] = cB_ZeroFlowCal_EnableMeter9.Checked; + EnableOpening[Constants.Meter10] = cB_ZeroFlowCal_EnableMeter10.Checked; + ThermoEnableOpening[Constants.Thermo1] = cB_Thermo1.Checked; + ThermoEnableOpening[Constants.Thermo2] = cB_Thermo2.Checked; + + btn_ZeroFlowCal_Start.Enabled = false; + AbortIndicator = false; + #endregion + #region Bubbles + pB_Bubbles1.Visible = true; + #endregion + + if (LogOnSequences.CheckIfNoMeterSelected(EnableOpening)) + { + MessageBox.Show(PredefinedMessages.NoMeterSelected(Culture), "Form closing", MessageBoxButtons.OK, MessageBoxIcon.Error); + Display.StatusLabel(PredefinedMessages.PressDetect(Culture)); + Display.SetControlElements(true); + return; + } + + SetToUnknownStatus[Constants.Meter1] = !cB_ZeroFlowCal_EnableMeter1.Checked; + SetToUnknownStatus[Constants.Meter2] = !cB_ZeroFlowCal_EnableMeter2.Checked; + SetToUnknownStatus[Constants.Meter3] = !cB_ZeroFlowCal_EnableMeter3.Checked; + SetToUnknownStatus[Constants.Meter4] = !cB_ZeroFlowCal_EnableMeter4.Checked; + SetToUnknownStatus[Constants.Meter5] = !cB_ZeroFlowCal_EnableMeter5.Checked; + SetToUnknownStatus[Constants.Meter6] = !cB_ZeroFlowCal_EnableMeter6.Checked; + SetToUnknownStatus[Constants.Meter7] = !cB_ZeroFlowCal_EnableMeter7.Checked; + SetToUnknownStatus[Constants.Meter8] = !cB_ZeroFlowCal_EnableMeter8.Checked; + SetToUnknownStatus[Constants.Meter9] = !cB_ZeroFlowCal_EnableMeter9.Checked; + SetToUnknownStatus[Constants.Meter10] = !cB_ZeroFlowCal_EnableMeter10.Checked; + ThermoSetToUnknownStatus[Constants.Thermo1] = !cB_Thermo1.Checked; + ThermoSetToUnknownStatus[Constants.Thermo2] = !cB_Thermo2.Checked; + + #region Visual indication 'PREPARE' + Display.SetProgressPanel(StatusPanelItems.Detect); + Display.StatusLabel(PredefinedMessages.WaitDetect(Culture)); + + foreach (var generalMeter in GlobalMeterBatch.ListOfMeters) + { + if (generalMeter is ZeroFlowGenesisMeter) + { + var Meter = generalMeter as ZeroFlowGenesisMeter; + Ok[(Meter.Slot - 1)] = Meter.CheckRequestPort(); + Ok[(Meter.Slot - 1) + Constants.NumberOfMeters] = Meter.CheckStreamingPort(); + } + } + foreach (var generalMeter in ThermoMeterBatch.ListOfMeters) + { + if (generalMeter is ZeroFlowGenesisMeter) + { + var Thermometer = generalMeter as ZeroFlowGenesisMeter; + ThermoOk[(Thermometer.Slot - 11)] = Thermometer.CheckRequestPort(); + ThermoOk[(Thermometer.Slot - 11) + Constants.NumberOfThermometers] = Thermometer.CheckStreamingPort(); + } + } + + Display.ConnectionStatus(Ok); + Display.ThermoConnectionStatus(ThermoOk); + + SerialPortOpenFlag = Ok; + ThermoSerialPortOpenFlag = ThermoOk; + + Display.ConnectionStatusReset(SetToUnknownStatus); + Display.ThermoConnectionStatusReset(ThermoSetToUnknownStatus); + #endregion + #region Status message + Display.StatusLabel(PredefinedMessages.PressStartOrDetect(Culture)); + btn_ZeroFlowCal_Start.Enabled = true; + pB_Bubbles1.Visible = false; + #endregion + } + + + + + + + + private ProcessProgress Login(ProcessProgress pp) + { + + Display.PictureBoxVisble(pB_Bubbles1, true); + Display.StatusLabel( + PredefinedMessages.WaitUntilLoginFinished(pp.Culture)); // "Wait until 'LOGIN' has finished" + Display.DebugMessage($"{Constants.TwentySpaces}\tCOMMAND CHANNEL: \t LOGIN procedure started\n", + pp.Culture); + + + pp.MeterOk = new Boolean[Constants.NumberOfMeters]; + pp.ThermoOk = new Boolean[Constants.NumberOfThermometers]; + pp.AllOk = new Boolean[Constants.NumberOfMeters + Constants.NumberOfThermometers]; + + + LoginFailed = new Boolean[Constants.NumberOfMeters]; + for (UInt16 i = 0; i < LoginFailed.Count(); i++) + LoginFailed[i] = false; + ThermoLoginFailed = new Boolean[Constants.NumberOfThermometers]; + for (UInt16 i = 0; i < ThermoLoginFailed.Count(); i++) + ThermoLoginFailed[i] = false; + var listOfLoginTask = new List(); + + var listOfMeterFromSource = new Dictionary(); + foreach (var meter in GlobalMeterBatch.ListOfMeters) + { + listOfMeterFromSource.Add(meter, false); + } + + foreach (var meter in ThermoMeterBatch.ListOfMeters) + { + listOfMeterFromSource.Add(meter, true); + } + + + + foreach (var meterAndBatch in listOfMeterFromSource) + { + var meter = meterAndBatch.Key; + var isThermo = meterAndBatch.Value; + listOfLoginTask.Add(Task.Run(() => + { + var Result = false; + for (int i = 0; i < 3; i++) + { + Display.DebugMessage($"{Constants.TwentySpaces}\tCOMMAND CHANNEL: \t Performing LOGIN procedure\n", pp.Culture); + + try + { + Result = string.IsNullOrEmpty(pp.Passwords[meter.Slot - 1]) + ? meter.Login() + : meter.Login(pp.Passwords[meter.Slot - 1]); + + if (Result) + { + return Result; + } + Thread.Sleep(100); + } + catch (Exception e) + { + Display.DebugMessage($"{Constants.TwentySpaces}\tCOMMAND CHANNEL: \t Error on LOGIN procedure\n", pp.Culture); + } + + } + return Result; + + }, pp.CancellationSource.Token).ContinueWith(delegate (Task loginTask) + { + + var taskResultSlot = loginTask.Result; + var meterIndex = (meter.Slot).ToString(pp.Culture); + if (taskResultSlot) + { + Display.DebugMessage( + $"{Constants.TwentySpaces}\tCOMMAND CHANNEL: \t LOGIN procedure successful at METER{meterIndex}\n", + pp.Culture); + if (isThermo) + { + ThermoLoginFailed[meter.Slot - 1] = false; + pp.AtLeastOneThermometerPresent = true; + } + else + { + LoginFailed[meter.Slot - 1] = false; + pp.AtLeastOneMeterPresent = true; + } + + } + else + { + Display.DebugMessage( + $"{Constants.TwentySpaces}\tCOMMAND CHANNEL: \t LOGIN procedure failed at METER{meterIndex}\n", + pp.Culture); + if (isThermo) + { + ThermoLoginFailed[meter.Slot - 1] = true; + } + else + { + LoginFailed[meter.Slot - 1] = true; + } + GenerateReturnNote($"{meterIndex}", PcbID[meter.Slot - 1], + PredefinedMessages.LoginFailed(pp.Culture), + _GenesisZeroFlow.GetLoggingFromTextBox(), pp.Culture); + } + + }, pp.CancellationSource.Token)); + } + + return Task.WhenAll(listOfLoginTask).ContinueWith(delegate + { + var loginFailed = LoginFailed; + var thermoLoginFailed = ThermoLoginFailed; + var meterEnable = pp.MeterEnable; + var thermoEnable = pp.ThermoEnable; + + pp.AllOk = Display.GetSequenceResult(meterEnable.Concat(thermoEnable).ToArray(), + loginFailed.Concat(thermoLoginFailed).ToArray(), "LOGIN sequence", + out pp.StopSequence, pp.Culture); + pp.MeterOk = Misc.Subarray(pp.AllOk, 0, Constants.NumberOfMeters); + pp.ThermoOk = Misc.Subarray(pp.AllOk, Constants.NumberOfMeters, Constants.NumberOfThermometers); + Display.MeterStatusGreenRed(pp.MeterOk, meterEnable); + Display.ThermoStatusGreenRed(pp.ThermoOk, thermoEnable); + + if (pp.StopSequence) + { + StopMainSequence(PredefinedMessages.LoginFailed(pp.Culture), MessageBoxIcon.Error, + pp.Culture); + } + + AbortIndicator = false; + Display.SetControlElements(false); + Display.SetProgressPanel(StatusPanelItems.Prepare); + + if ((!GlobalMeterBatch.ListOfMeters.Any())) + { + StopMainSequence(PredefinedMessages.NoMeterSelected(pp.Culture), MessageBoxIcon.Error, + pp.Culture); + } + + if ((pp.AtLeastOneThermometerPresent) || (pp.AtLeastOneMeterPresent)) return pp; + StopMainSequence( + !pp.AtLeastOneThermometerPresent + ? PredefinedMessages.NoThermometerPresent(pp.Culture) + : PredefinedMessages.NoMeterPresent(pp.Culture), + MessageBoxIcon.Error, pp.Culture); + + return pp; + + }, pp.CancellationSource.Token).Result; + } + + private ProcessProgress PrepareTest(ProcessProgress pp) + { + #region Definitions and initializations + #region Temperature monitoring limits + pp.UpperTempLimit = GetUpperTempLimit(); + pp.LowerTempLimit = GetLowerTempLimit(); + pp.TempDeviationLimit = GetTempDeviationLimit(); + pp.StopSequence = false; + pp.Aborted = false; + pp.AtLeastOneThermometerPresent = false; + pp.AtLeastOneMeterPresent = false; + pp.MeterEnable = new Boolean[Constants.NumberOfMeters]; + pp.ThermoEnable = new Boolean[Constants.NumberOfThermometers]; + + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + { + pp.MeterEnable[Meter] = false; + PcbID[Meter] = String.Empty; + } + for (UInt16 Thermo = Constants.Thermo1; Thermo < Constants.NumberOfThermometers; Thermo++) + { + pp.ThermoEnable[Thermo] = false; + ThermoID[Thermo] = String.Empty; + } + #endregion + #region Passwords + pp.Passwords = new String[Constants.NumberOfMeters]; + pp.Passwords[Constants.Meter1] = tB_PasswordMeter1.Text; + pp.Passwords[Constants.Meter2] = tB_PasswordMeter2.Text; + pp.Passwords[Constants.Meter3] = tB_PasswordMeter3.Text; + pp.Passwords[Constants.Meter4] = tB_PasswordMeter4.Text; + pp.Passwords[Constants.Meter5] = tB_PasswordMeter5.Text; + pp.Passwords[Constants.Meter6] = tB_PasswordMeter6.Text; + pp.Passwords[Constants.Meter7] = tB_PasswordMeter7.Text; + pp.Passwords[Constants.Meter8] = tB_PasswordMeter8.Text; + pp.Passwords[Constants.Meter9] = tB_PasswordMeter9.Text; + pp.Passwords[Constants.Meter10] = tB_PasswordMeter10.Text; + pp.ThermoPasswords = new String[Constants.NumberOfThermometers]; + pp.ThermoPasswords[Constants.Thermo1] = tB_PasswordThermo1.Text; + pp.ThermoPasswords[Constants.Thermo2] = tB_PasswordThermo2.Text; + CultureInfo Culture = GetGlobalCulture(); + #endregion + #endregion + #region Get enable status + foreach (var meter in GlobalMeterBatch.ListOfMeters) + pp.MeterEnable[meter.Slot - 1] = true; + foreach (var meter in ThermoMeterBatch.ListOfMeters) + pp.ThermoEnable[meter.Slot - 11] = true; + #endregion + + + return pp; + } + + private ProcessProgress Preparation(ProcessProgress pp) + { + + if (Equals(_GenesisZeroFlow.AbortIndicator, false)) + { + var listOfPcdIdTask = new List(); + var listOfMeterFromSource = new List(); + foreach (var meter in GlobalMeterBatch.ListOfMeters) + { + listOfMeterFromSource.Add(meter); + } + + foreach (var meter in ThermoMeterBatch.ListOfMeters) + { + listOfMeterFromSource.Add(meter); + } + + foreach (var item in listOfMeterFromSource) + { + if (!(item is ZeroFlowGenesisMeter)) continue; + var meter = (ZeroFlowGenesisMeter)item; + if (!pp.MeterEnable[meter.Slot - 1]) continue; + listOfPcdIdTask.Add(Task.Run(() => + { + var tmp = meter.PcbId; + if (string.IsNullOrEmpty(tmp)) + PcbID[meter.Slot - 1] = "ID is not available "; + else + { + + var numberOfSpaces = 20 - tmp.Length; + if (numberOfSpaces > 0) + { + for (var i = 0; i < numberOfSpaces; i++) + tmp = $"{tmp} "; + } + + PcbID[meter.Slot - 1] = tmp; + } + + Display.DebugMessage($"{Constants.TwentySpaces}\tCOMMAND CHANNEL:\t PCB ID = {tmp}\n", + pp.Culture); + })); + } + + Task.WhenAll(listOfPcdIdTask); + + + + Display.StatusLabel(PredefinedMessages.WaitUntilPreparationFinished(pp.Culture)); // "Wait until 'PREPARATION' finished + + #region add com port listener + foreach (var item in GlobalMeterBatch.ListOfMeters) + { + if (!(item is ZeroFlowGenesisMeter)) continue; + ((ZeroFlowGenesisMeter)item).OnZeroFlowRecordIsDecoded += GenesisZeroFlow_OnZeroFlowRecordIsDecoded; + ((ZeroFlowGenesisMeter)item).StartRecordData(); + } + foreach (var item in ThermoMeterBatch.ListOfMeters) + { + if (!(item is ZeroFlowGenesisMeter)) continue; + ((ZeroFlowGenesisMeter)item).OnZeroFlowRecordIsDecoded += GenesisZeroFlow_OnThermoRecordIsDecoded; + ((ZeroFlowGenesisMeter)item).StartRecordData(); + } + #endregion + PreparationFailed = PreparationSequences.Total(GlobalMeterBatch, ThermoMeterBatch, (UInt16)nUD_SettingsPreparationMetersize.Value, cB_ZeroFlowOffsetTestEnable.Checked, pp.UpperTempLimit, pp.LowerTempLimit, pp.TempDeviationLimit, out pp.Aborted, pp.Culture); + pp.AllOk = Display.GetSequenceResult(pp.MeterEnable.Concat(pp.ThermoEnable).ToArray(), PreparationFailed, "PREPARATION sequence", out pp.StopSequence, pp.Culture); + pp.MeterOk = Misc.Subarray(pp.AllOk, 0, Constants.NumberOfMeters); + pp.ThermoOk = Misc.Subarray(pp.AllOk, Constants.NumberOfMeters, Constants.NumberOfThermometers); + Display.MeterStatusGreenRed(pp.MeterOk, pp.MeterEnable); + Display.ThermoStatusGreenRed(pp.ThermoOk, pp.ThermoEnable); + if (pp.StopSequence) + { + StopMainSequence(PredefinedMessages.ZeroflowCalibrationSequenceFailed(pp.Culture), MessageBoxIcon.Error, pp.Culture); + return pp; + } + #region Empty pipe mode check + Display.DebugMessage($"{Constants.TwentySpaces}\tAPPLICATION:\t\t EMPTY PIPE CHECK sequence started\n", pp.Culture); + EmptyPipeCheckEnable = pp.AllOk; + EmptyPipeCheckFailed = EmptyPipeCheckSequences.Total(EmptyPipeCheckEnable, out pp.Aborted, GlobalMeterBatch, ThermoMeterBatch, pp.Culture); + pp.MeterEnable = Misc.Subarray(EmptyPipeCheckEnable, 0, Constants.NumberOfMeters); + pp.ThermoEnable = Misc.Subarray(EmptyPipeCheckEnable, Constants.NumberOfMeters, Constants.NumberOfThermometers); + pp.AllOk = Display.GetSequenceResult(EmptyPipeCheckEnable, EmptyPipeCheckFailed, "EMPTY PIPE CHECK sequence", out pp.StopSequence, pp.Culture); + Display.MeterStatusGreenRed(Misc.Subarray(pp.AllOk, 0, Constants.NumberOfMeters), pp.MeterEnable); + Display.ThermoStatusGreenRed(Misc.Subarray(pp.AllOk, Constants.NumberOfMeters, Constants.NumberOfThermometers), pp.ThermoEnable); + if (pp.StopSequence) + { + StopMainSequence(PredefinedMessages.ZeroflowCalibrationSequenceFailed(pp.Culture), MessageBoxIcon.Error, pp.Culture); + return pp; + } + #endregion + #region Wait for two minutes + StabilizationEnable = pp.AllOk; + Display.WaitForStabilization(StabilizationEnable, (Int32)nUD_Settings_Preparation_StabiTime.Value, out pp.Aborted, pp.Culture); + StabilizationFailed = EmptyPipeCheckFailed; // WaitForStabilization does not have return value; + pp.MeterEnable = Misc.Subarray(StabilizationEnable, 0, Constants.NumberOfMeters); + pp.ThermoEnable = Misc.Subarray(StabilizationEnable, Constants.NumberOfMeters, Constants.NumberOfThermometers); + pp.AllOk = Display.GetSequenceResult(StabilizationEnable, StabilizationFailed, "WAIT FOR STABILIZATION sequence", out pp.StopSequence, pp.Culture); + Display.MeterStatusGreenRed(Misc.Subarray(pp.AllOk, 0, Constants.NumberOfMeters), pp.MeterEnable); + Display.ThermoStatusGreenRed(Misc.Subarray(pp.AllOk, Constants.NumberOfMeters, Constants.NumberOfThermometers), pp.ThermoEnable); + if (pp.StopSequence) + { + StopMainSequence(PredefinedMessages.ZeroflowCalibrationSequenceFailed(pp.Culture), MessageBoxIcon.Error, pp.Culture); + return pp; + } + #endregion + + } + else + { + Display.DebugMessage($"{Constants.TwentySpaces}\tAPPLICATION:\t\t PREPARATION sequence stopped\n", pp.Culture); + Display.DebugMessage($"{Constants.TwentySpaces}\t{Debugmessages.Line}", pp.Culture); + StopMainSequence(PredefinedMessages.ZeroflowCalibrationSequenceStopped(pp.Culture), MessageBoxIcon.Error, pp.Culture); + } + return pp; + + } + + private ProcessProgress AmplitudeTest(ProcessProgress pp) + { + if (!cB_AmplitudeTestEnable.Checked) + return pp; + + Display.StatusLabel(PredefinedMessages.WaitUntilAmplitudeTestFinished(pp.Culture)); + if (_GenesisZeroFlow.AbortIndicator) + { + StopMainSequence(PredefinedMessages.ZeroflowCalibrationSequenceStopped(pp.Culture), + MessageBoxIcon.Error, pp.Culture); + return pp; + } + + AmplitudeEnable = pp.AllOk; + Display.SetProgressPanel(StatusPanelItems.Amplitude); + + Display.DebugMessage($"{Constants.TwentySpaces}\tAPPLICATION:\t\t AMPLITUDE TEST sequence started\n", + pp.Culture); + Display.StatusLabel( + PredefinedMessages + .WaitUntilAmplitudeFinished(pp.Culture)); // "Wait until AMPLITUDE TEST has finished" + + AmplitudeFailed = AmplitudeSequences.Total(GlobalMeterBatch, ThermoMeterBatch, AmplitudeEnable, + (Int32)nUD_PercentageStart.Value, (Int32)nUD_PercentageStop.Value, + (Int32)nUD_Settings_AmplitudeTestLowerLimit.Value, + (Int32)nUD_Settings_AmplitudeTestUpperLimit.Value, + (Int32)nUD_Settings_AmplitudeTestMinDistance.Value, pp.UpperTempLimit, pp.LowerTempLimit, + pp.TempDeviationLimit, out pp.Aborted, pp.Culture); + pp.MeterEnable = Misc.Subarray(AmplitudeEnable, 0, Constants.NumberOfMeters); + pp.ThermoEnable = Misc.Subarray(AmplitudeEnable, Constants.NumberOfMeters, + Constants.NumberOfThermometers); + pp.AllOk = Display.GetSequenceResult(AmplitudeEnable, AmplitudeFailed, "AMPLITUDE sequence", + out pp.StopSequence, pp.Culture); + Display.MeterStatusGreenRed(Misc.Subarray(pp.AllOk, 0, Constants.NumberOfMeters), pp.MeterEnable); + Display.ThermoStatusGreenRed( + Misc.Subarray(pp.AllOk, Constants.NumberOfMeters, Constants.NumberOfThermometers), pp.ThermoEnable); + + if (!pp.StopSequence) return pp; + StopMainSequence(PredefinedMessages.ZeroflowCalibrationSequenceFailed(pp.Culture), + MessageBoxIcon.Error, pp.Culture); + return pp; + + } + + private ProcessProgress OffsetTest(ProcessProgress pp) + { + + if (!cB_ZeroFlowOffsetTestEnable.Checked) + return pp; + if (_GenesisZeroFlow.AbortIndicator) + { + StopMainSequence(PredefinedMessages.ZeroflowCalibrationSequenceStopped(pp.Culture), + MessageBoxIcon.Error, pp.Culture); + return pp; + } + + ZeroFlowOffsetEnable = pp.AllOk; + Display.SetProgressPanel(StatusPanelItems.Offset); + Display.DebugMessage( + $"{Constants.TwentySpaces}\tAPPLICATION:\t\t ZEROFLOW OFFSET TEST sequence started\n", pp.Culture); + Display.StatusLabel( + PredefinedMessages + .WaitUntilZeroflowOffsetTestFinished( + pp.Culture)); + + ZeroFlowOffsetFailed = ZeroOffsetSequences.Total(GlobalMeterBatch, ThermoMeterBatch, + ZeroFlowOffsetEnable, (Int16)nUD_Settings_ZeroflowOffsetTestSettlingTime.Value, + (Int16)nUD_Settings_ZeroflowOffsetTestLowerLimit.Value, + (Int16)nUD_Settings_ZeroflowOffsetTestUpperLimit.Value, + (Double)nUD_Settings_ZeroflowOffsetTestOffsetLimit.Value, + (Int32)nUD_Settings_ZeroflowOffsetTestNumberOfLines.Value, pp.UpperTempLimit, pp.LowerTempLimit, + pp.TempDeviationLimit, out pp.Aborted, pp.Culture); + pp.MeterEnable = Misc.Subarray(ZeroFlowOffsetEnable, 0, Constants.NumberOfMeters); + pp.ThermoEnable = Misc.Subarray(ZeroFlowOffsetEnable, Constants.NumberOfMeters, + Constants.NumberOfThermometers); + pp.AllOk = Display.GetSequenceResult(ZeroFlowOffsetEnable, ZeroFlowOffsetFailed, + "ZEROFLOW OFFSET TEST sequence", out pp.StopSequence, pp.Culture); + Display.MeterStatusGreenRed(Misc.Subarray(pp.AllOk, 0, Constants.NumberOfMeters), pp.MeterEnable); + Display.ThermoStatusGreenRed( + Misc.Subarray(pp.AllOk, Constants.NumberOfMeters, Constants.NumberOfThermometers), pp.ThermoEnable); + if (pp.StopSequence) + { + StopMainSequence(PredefinedMessages.ZeroflowCalibrationSequenceFailed(pp.Culture), + MessageBoxIcon.Error, pp.Culture); + return pp; + } + return pp; + } + + private ProcessProgress TemperatureCalibration(ProcessProgress pp) + { + + if (!cB_TempCalEnable.Checked) + return pp; + + Display.SetProgressPanel(StatusPanelItems.TempCal); + Display.StatusLabel(PredefinedMessages.WaitUntilTemperatureAcquisitionFinished(pp.Culture)); + TempCalEnable = pp.AllOk; + var manAcquisition = cB_TempManualAcquisition.Checked || (!cB_Thermo1.Checked) && (!cB_Thermo2.Checked); + + TempCalFailed = TempCalibrationSequences.Total(GlobalMeterBatch, ThermoMeterBatch, TempCalEnable, + manAcquisition, pp.UpperTempLimit, pp.LowerTempLimit, pp.TempDeviationLimit, out pp.Aborted, pp.Culture); + pp.MeterEnable = + Misc.Subarray(TempCalEnable, 0, + Constants.NumberOfMeters); // width of TempCalEnable = 8bit, Temperature Monitoring not needed + pp.ThermoEnable = Misc.Subarray(TempCalEnable, Constants.NumberOfMeters, Constants.NumberOfThermometers); + pp.AllOk = Display.GetSequenceResult(TempCalEnable, TempCalFailed, "TEMPERATURE CALIBRATION sequence", + out pp.StopSequence, pp.Culture); + Display.MeterStatusGreenRed(Misc.Subarray(pp.AllOk, 0, Constants.NumberOfMeters), pp.MeterEnable); + Display.ThermoStatusGreenRed( + Misc.Subarray(pp.AllOk, Constants.NumberOfMeters, Constants.NumberOfThermometers), pp.ThermoEnable); + if (pp.StopSequence) + { + StopMainSequence(PredefinedMessages.ZeroflowCalibrationSequenceFailed(pp.Culture), + MessageBoxIcon.Error, pp.Culture); + return pp; + } + + + return pp; + } + + private ProcessProgress Completion(ProcessProgress pp) + { + Display.SetThermoLabel1("THERMO1"); + Display.SetThermoLabel2("THERMO2"); + if (_GenesisZeroFlow.AbortIndicator) + { + StopMainSequence(PredefinedMessages.ZeroflowCalibrationSequenceStopped(pp.Culture), + MessageBoxIcon.Error, pp.Culture); + return pp; + } + + CompletionEnable = pp.AllOk; + Display.SetProgressPanel(StatusPanelItems.Completion); + Display.DebugMessage($"{Constants.TwentySpaces}\tAPPLICATION:\t\t COMPLETION sequence started\n", + pp.Culture); + Display.StatusLabel( + PredefinedMessages.WaitUntilCompletionFinished(pp.Culture)); // "Wait until 'COMPLETION' has finished" + + pp.MeterEnable = + Misc.Subarray(CompletionEnable, 0, + Constants.NumberOfMeters); // width of TempCalEnable = 8bit, Temperature Monitoring not needed + pp.ThermoEnable = Misc.Subarray(CompletionEnable, Constants.NumberOfMeters, + Constants.NumberOfThermometers); + CompletionFailed = CompletionSequences.Total(GlobalMeterBatch, ThermoMeterBatch, CompletionEnable, + out pp.Aborted, pp.Culture); + pp.AllOk = Display.GetSequenceResult(CompletionEnable, CompletionFailed, "COMPLETION sequence", + out pp.StopSequence, pp.Culture); + Display.MeterStatusGreenRed(Misc.Subarray(pp.AllOk, 0, Constants.NumberOfMeters), pp.MeterEnable); + Display.ThermoStatusGreenRed( + Misc.Subarray(pp.AllOk, Constants.NumberOfMeters, Constants.NumberOfThermometers), pp.ThermoEnable); + if (pp.Aborted) + { + StopMainSequence(PredefinedMessages.ZeroflowCalibrationSequenceStopped(pp.Culture), + MessageBoxIcon.Error, pp.Culture); + return pp; + } + + if (pp.StopSequence) + { + StopMainSequence(PredefinedMessages.ZeroflowCalibrationSequenceFailed(pp.Culture), + MessageBoxIcon.Error, pp.Culture); + return pp; + } + + Display.DebugMessage( + $"{Constants.TwentySpaces}\tAPPLICATION:\t\t ZEROFLOW CALIBRATION sequence successful\n", pp.Culture); + Display.DebugMessage($"{Constants.TwentySpaces}\t{Debugmessages.Line}", pp.Culture); + StopMainSequence(PredefinedMessages.ZeroflowCalibrationSequenceSuccessful(pp.Culture), + MessageBoxIcon.Information, pp.Culture); + + + GlobalMeterBatch.RemoveAllMeters(); + ThermoMeterBatch.RemoveAllMeters(); + return pp; + } + + private void btn_ZeroFlowCal_Start_Click(object sender, EventArgs e) + { + try + { + ZeroflowOffsetTestNumberOfLines = (Int32)nUD_Settings_ZeroflowOffsetTestNumberOfLines.Value; + rTB_ZeroFlowCal.Clear(); // Clear log (textbox) + var currentProgress = new ProcessProgress(); + OnAbort += (o, args) => currentProgress.CancellationSource.Cancel(); + + + List> listOfProgrammParts = new List>(); + listOfProgrammParts.Add(new Task(() => { return PrepareTest(currentProgress); })); + listOfProgrammParts.Add(new Task(() => { return Login(currentProgress); })); + + + listOfProgrammParts.Add(new Task(() => { return Preparation(currentProgress); })); + listOfProgrammParts.Add(new Task(() => { return AmplitudeTest(currentProgress); })); + listOfProgrammParts.Add(new Task(() => { return TemperatureCalibration(currentProgress); })); + listOfProgrammParts.Add(new Task(() => { return OffsetTest(currentProgress); })); + listOfProgrammParts.Add(new Task(() => { return Completion(currentProgress); })); + Task.Run(() => + { + foreach (var cTask in listOfProgrammParts) + { + cTask.Start(); + currentProgress = cTask.Result; + AfterStep(currentProgress); + } + } + ); + + + + + + } + catch (Exception exception) + { + Display.DebugMessage($"Exception at full process: { exception.Message}\t{Debugmessages.Line}", CultureDe); + Display.DebugMessage(exception.StackTrace, CultureDe); + } + + + } + + + private void AfterStep(ProcessProgress pp) + { + checkMetersToRemove(pp); + } + + private void checkMetersToRemove(ProcessProgress pp) + { + //todo remove meter that are failed + //foreach (var meter in GlobalMeterBatch.ListOfMeters) + //{ + // if (pp.MeterEnable.Length >= meter.Slot) + // { + // if (!pp.MeterEnable[meter.Slot - 1]) + // { + // GlobalMeterBatch.RemoveMeter(meter); + // } + // } + // if (pp.MeterOk.Length >= meter.Slot) + // { + // if (!pp.MeterOk[meter.Slot - 1]) + // { + // GlobalMeterBatch.RemoveMeter(meter); + // } + // } + //} + } + + public event EventHandler OnAbort; + private void btn_ZeroFlowCal_Abort_Click(object sender, EventArgs e) + { + CultureInfo Culture = GetGlobalCulture(); + DialogResult AskForActions = DialogResult.None; + Display.AbortButtonEnabled(false); + + AskForActions = MessageBox.Show(PredefinedMessages.AreYouSure(Culture), "Form closing", MessageBoxButtons.OKCancel, MessageBoxIcon.Error); + + if (DialogResult.Equals(AskForActions, DialogResult.OK)) + { + AbortIndicator = true; + OnAbort?.Invoke(this, EventArgs.Empty); + } + else + { + AbortIndicator = false; + Display.AbortButtonEnabled(true); + } + } + private void btn_ZeroFlowCal_Clear_Click(object sender, EventArgs e) + { + #region Bubbles + pB_Bubbles1.Visible = true; + Misc.WaitNSeconds(1, true); + pB_Bubbles1.Visible = false; + #endregion + rTB_ZeroFlowCal.Clear(); + } + + private void btn_ZeroFlowCal_Save_Click(object sender, EventArgs e) + { + #region Definitions and initializations + CultureInfo Culture = GetGlobalCulture(); + String SaveDataPathRaw = String.Empty; + Boolean RawDialogOk = false; + String Username = System.Security.Principal.WindowsIdentity.GetCurrent().Name; + String ClosingPath = DataLogging.DefaultPath;// + "GenesisZeroFlow_EventLogging_" + TimeForFilename + ".txt"; + String TimeForHeader = String.Empty; + #endregion + #region Bubbles + pB_Bubbles1.Visible = true; + Misc.WaitNSeconds(1, true); + pB_Bubbles1.Visible = false; + #endregion + #region Logfile + try + { + RawDialogOk = Files.SaveFiledialogTxt(out SaveDataPathRaw, ClosingPath, out TimeForHeader, Culture); + if (RawDialogOk) + { + String Data = rTB_ZeroFlowCal.Text; + String Header = $"Filename = {Path.GetFileName(SaveDataPathRaw)}; User = {Username}; Date/Time = {TimeForHeader}; SW-version: {l_Version.Text}\n"; + Logging.WriteToFile($"{Header}{Data}", SaveDataPathRaw); + } + } + catch (Exception ex) + { + ErrorLog.Log(LogErrReason.Exeption, "btn_ZeroFlowCal_Save_Click() failed", $"0x{ex.HResult.ToString("X", Culture)}", String.Empty, Culture); + MessageBox.Show(PredefinedMessages.StorageFailed(Culture), "Form closing", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + #endregion + } + + private void btn_ZeroFlowCal_Pdf_Click(object sender, EventArgs e) + { + #region Definitions and initializations + String SaveDataPathPdf = String.Empty; + Boolean RawDialogOk = false; + String Username = System.Security.Principal.WindowsIdentity.GetCurrent().Name; + String ClosingPath = DataLogging.DefaultPath; + String TimeForHeader = String.Empty; + CultureInfo Culture = GetGlobalCulture(); + #endregion + #region Bubbles + pB_Bubbles1.Visible = true; + Misc.WaitNSeconds(1, true); + pB_Bubbles1.Visible = false; + #endregion + #region Logfile + try + { + RawDialogOk = Files.SaveFiledialogPdf(out SaveDataPathPdf, ClosingPath, out TimeForHeader, Culture); + if (RawDialogOk) + { + //using (PdfDocument LogReport = new PdfDocument()) + //{ + // LogReport.Info.Title = "GENESIS Zeroflow calibration tool logfile"; + // LogReport.Info.Author = Username; + // String Data = rTB_ZeroFlowCal.Text; + // String Header = $"Filename = {Path.GetFileName(SaveDataPathPdf)};\nUser = {Username};\nDate/Time = {TimeForHeader}\nSW-version: {l_Version.Text}\n\n"; + // ReportPages.Logfile($"{ Header}{ Data}", LogReport, Logo); + // //Files.SavePdf(LogReport, SaveDataPathPdf, Culture); + //} + } + } + catch (Exception ex) + { + ErrorLog.Log(LogErrReason.Exeption, "btn_ZeroFlowCal_Pdf_Click() failed", $"0x{ex.HResult.ToString("X", Culture)}", String.Empty, Culture); + MessageBox.Show(PredefinedMessages.StorageFailed(Culture), "Form closing", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + #endregion + + public void EnableMaintab() + { + tab_Maintab.Enabled = true; + } + + public List[] GetAmplitudeValuesUp(UInt16 meterNumber) + { + return AmplitudeValuesUp[meterNumber]; + } + public void ClearAmplitudeValuesUp(UInt16 meterNumber) + { + if (GenesisZeroFlow._GenesisZeroFlow.InvokeRequired) + { + GenesisZeroFlow._GenesisZeroFlow.Invoke((Action)ClearAmplitudeValuesUp, meterNumber); + return; + } + + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + AmplitudeValuesUp[meterNumber][Path].Clear(); + + } + + public void ClearAmplitudeValuesDown(UInt16 meterNumber) + { + if (GenesisZeroFlow._GenesisZeroFlow.InvokeRequired) + { + GenesisZeroFlow._GenesisZeroFlow.Invoke((Action)ClearAmplitudeValuesDown, meterNumber); + return; + } + + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + AmplitudeValuesDown[meterNumber][Path].Clear(); + } + + public List[] GetAmplitudeValuesDown(UInt16 meterNumber) + { + return AmplitudeValuesDown[meterNumber]; + } + + public void ClearBadDataCounter(UInt16 meterNumber) + { + + if (GenesisZeroFlow._GenesisZeroFlow.InvokeRequired) + { + GenesisZeroFlow._GenesisZeroFlow.Invoke((Action)ClearBadDataCounter, meterNumber); + return; + } + + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + BadDataCounterZeroFlowTest[meterNumber][Path] = 0; + } + + public Int32[] GetBadDataCounter(UInt16 meterNumber) + { + return BadDataCounterZeroFlowTest[meterNumber]; + } + public void ClearLineCounterZeroFlow(UInt16 meterNumber) + { + if (GenesisZeroFlow._GenesisZeroFlow.InvokeRequired) + { + GenesisZeroFlow._GenesisZeroFlow.Invoke((Action)ClearLineCounterZeroFlow, meterNumber); + return; + } + + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + SetLineCounterZeroFlowTest(meterNumber, Path, 0); + } + + public Int32[] GetLineCounterZeroFlow(UInt16 meterNumber) + { + return LineCounterZeroFlowTest[meterNumber]; + } + + public void ClearDeltaTimeOfFlightAverage(UInt16 meterNumber) + { + + if (GenesisZeroFlow._GenesisZeroFlow.InvokeRequired) + { + GenesisZeroFlow._GenesisZeroFlow.Invoke((Action)ClearDeltaTimeOfFlightAverage, meterNumber); + return; + } + + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + DeltaTimeOfFlightAverage[meterNumber][Path].Clear(); + DeltaTimeOfFlightAverageRAW[meterNumber][Path].Clear(); + } + + + } + + public List[] GetDeltaTimeOfFlightAverageRaw(UInt16 meterNumber) + { + return DeltaTimeOfFlightAverageRAW[meterNumber]; + } + + public List[] GetDeltaTimeOfFlightAverage(UInt16 meterNumber) + { + return DeltaTimeOfFlightAverage[meterNumber]; + } + + public Boolean GetCBMeanAmplitudeFiles() + { + return (Boolean)cB_MeanAmplitudeFiles.Checked; + } + + public Boolean GetCBAmpLogFiles() + { + return (Boolean)cB_AmpLogFiles.Checked; + } + + public Boolean GetCBOffsetTestLogFiles() + { + return (Boolean)cB_OffsetTestLogFiles.Checked; + } + + public Int32 GetAmplitudeActivityCheckInterval() + { + return (Int32)(nUD_Settings_AmplitudeActivityCheckInterval.Value); + } + + public Int32 GetZeroFlowActivityCheckInterval() + { + return (Int32)(nUD_Settings_ZeroflowOffsetTestActivityCheckInterval.Value); + } + + private Int32 ZeroflowOffsetTestNumberOfLines = 9000; + private void GenesisZeroFlow_OnZeroFlowRecordIsDecoded(object sender, CalibrationRecordWithMeterNumber decodedDataAndMeterNr) + { + + //CultureInfo Culture = GetGlobalCulture(); + + var decodedDate = decodedDataAndMeterNr; + var MeterNumber = decodedDataAndMeterNr.MeterNumber; + + var data = ((CalibrationRecord)decodedDate.CalibChl); + //todo make new imesturementrecord according to units need by zeroflow app + var TotalTimeOfFlightS = data.TotalTimeOfFlightS * 1000000; + Double temp = data.DeltaTimeOfFlightS; + //data.DeltaTimeOfFlightS = data.DeltaTimeOfFlightS * (1.0 / 0x4000000000); // 2^38; + data.AmplitudeUpV = data.AmplitudeUpV * 1000.0; + data.AmplitudeDownV = data.AmplitudeDownV * 1000.0; + + #region Logging (Zero flow test) + if (GetLoggingIndicatorZeroFlowTest()[MeterNumber] && (!String.IsNullOrEmpty(LoggingPathZeroFlowTest[MeterNumber]))) + { + try + { + String time = DateTime.Now.ToString(Formats.RawDataDateTimeLogString); + SetDataToLog(MeterNumber, $"{GetDataToLog()[MeterNumber]} {time} {decodedDate.RawData}\n"); + } + catch (Exception ex) + { + + } + } + if (GetLoggingIndicatorAmpTest()[MeterNumber] && (!String.IsNullOrEmpty(LoggingPathAmplitudeTest[MeterNumber]))) + { + try + { + String time = DateTime.Now.ToString(Formats.RawDataDateTimeLogString); + var tmp = GetDataToLog()[MeterNumber]; + String StringToLog = $"{tmp} {time} {decodedDate.RawData}\n"; + SetDataToLog(MeterNumber, StringToLog); + } + catch (Exception ex) + { + + } + } + #endregion + #region Add to list h-protocol + UInt16 Path = (UInt16)(decodedDate.CalibChl.Channel - 1); + //todo check if isValid == crc Ok + if (decodedDate.CalibChl.IsValid) + { + #region Activity check for empty pipe test + LineCounterEmptyPipeTest[MeterNumber][Path] = Counters.SetCounters(LoggingIndicatorEmptyPipeTest, MeterNumber, Path, ref LineCounterEmptyPipeTest); + #endregion + #region Data for amplitude test + if (GetTofIndicatorAmplitudeTest()[MeterNumber]) + { + totalTimeOfFlightAverage[MeterNumber][Path].Add(TotalTimeOfFlightS); + } + LineCounterAmplitudeTest[MeterNumber][Path] = Counters.SetCounters(LoggingIndicatorAmpTest, MeterNumber, Path, ref LineCounterAmplitudeTest); + #endregion + #region Data for zero flow test + + var meterDone = true; + foreach (var checkCompleted in LineCounterZeroFlowTest[MeterNumber]) + { + if (checkCompleted < ZeroflowOffsetTestNumberOfLines) + { + meterDone = false; + } + } + + if (meterDone) + { + SetCalculationIndicatorZeroFlowTest(false, MeterNumber); + SetLoggingIndicatorZeroFlowTest(false, MeterNumber); + } + var CalcIndicator = GetCalculationIndicatorZeroFlowTest()[MeterNumber]; + if (CalcIndicator) + { + #region Bad data check + if (decodedDate.CalibChl.Validation == DataError.NoError) + { + AmplitudeValuesUp[MeterNumber][Path].Add(decodedDate.CalibChl.AmplitudeUpV); + AmplitudeValuesDown[MeterNumber][Path].Add(decodedDate.CalibChl.AmplitudeDownV); + DeltaTimeOfFlightAverageRAW[MeterNumber][Path].Add(decodedDate.CalibChl.RAWDeltaTimeOfFlight); + DeltaTimeOfFlightAverage[MeterNumber][Path].Add(decodedDate.CalibChl.DeltaTimeOfFlightS); + LineCounterZeroFlowTest[MeterNumber][Path] = Counters.SetCounters(GetCalculationIndicatorZeroFlowTest(), MeterNumber, Path, ref LineCounterZeroFlowTest); + } + else + { + BadDataCounterZeroFlowTest[MeterNumber][Path] = Counters.SetCounters(GetCalculationIndicatorZeroFlowTest(), MeterNumber, Path, ref BadDataCounterZeroFlowTest); + } + #endregion + } + #endregion + //#region Activity check for temperature test + //try + //{ + // LineCounterTemperatureTest[MeterNumber][Path] = Counters.SetCounters(IndicatorTemperatureActivityCheck, MeterNumber, Path, ref LineCounterTemperatureTest); + //} + //catch (Exception ex) + //{ + + //} + + //#endregion + } + #endregion + #region Copy to global object + DecodedAllMeters[MeterNumber][Path] = ((CalibrationRecord)decodedDate.CalibChl.Clone()); + #endregion + + + } + + private void GenesisZeroFlow_OnThermoRecordIsDecoded(object sender, CalibrationRecordWithMeterNumber decodedDataAndMeterNr) + { + CultureInfo Culture = GetGlobalCulture(); + var decodedDate = decodedDataAndMeterNr; + var ThermoNumber = (UInt16)(decodedDataAndMeterNr.MeterNumber - 10); + var data = ((CalibrationRecord)decodedDate.CalibChl); + //todo make new imesturementrecord according to units need by zeroflow app + var TotalTimeOfFlightS = data.TotalTimeOfFlightS * 1000000; + var CalcTemperature = data.TemperatureDegC; + Double temp = data.DeltaTimeOfFlightS; + //data.DeltaTimeOfFlightS = data.DeltaTimeOfFlightS * (1.0 / 0x4000000000); // 2^38; + //todo check performance -> into ram + Int32 numberOfLines = (Int32)nUD_Settings_ZeroflowOffsetTestNumberOfLines.Value; + + #region Logging (Zero flow test) + //if (GetLoggingIndicatorTemperatureTest()[ThermoNumber] && (!String.IsNullOrEmpty(LoggingPathTemperatureTest[ThermoNumber]))) + //{ + // String time = DateTime.Now.ToString(Formats.RawDataDateTimeLogString, Culture); + // SetTemperatureToLog(ThermoNumber, $"{GetDataToLog()[ThermoNumber]} {time} {decodedDate}\n"); + //} + #endregion + #region Add to list h-protocol + UInt16 Path = (UInt16)(decodedDate.CalibChl.Channel - 1); + //todo check if isValid == crc Ok + if (decodedDate.CalibChl.IsValid) + { + #region Activity check for empty pipe test + LineCounterThermoEmptyPipeTest[ThermoNumber][Path] = Counters.SetCounters(LoggingIndicatorThermoEmptyPipeTest, ThermoNumber, Path, ref LineCounterThermoEmptyPipeTest); + #endregion + if (IndicatorTemperatureActivityCheck[ThermoNumber]) + { + GenesisZeroFlow._GenesisZeroFlow.SetTemperatures(ThermoNumber, Path, CalcTemperature); + NewDataIndicatorTemperatureTest[ThermoNumber][Path] = true; + + #region Activity check for temperature test + LineCounterTemperatureTest[ThermoNumber][Path] = Counters.SetCounters(IndicatorTemperatureActivityCheck, ThermoNumber, Path, ref LineCounterTemperatureTest); + #endregion + } + } + #endregion + #region Copy to global object + DecodedAllThermometers[ThermoNumber][Path] = ((CalibrationRecord)decodedDate.CalibChl.Clone()); + #endregion + } + + private void button1_Click(object sender, EventArgs e) + { + MessageBox.Show(CultureInfo.InstalledUICulture.ToString() + "Index = " + lbLanguage.SelectedIndex.ToString()); + //GenesisZeroFlow.ActiveForm.PerformAutoScale(); + } + + private void lbLanguage_Click(object sender, EventArgs e) + { + lbLanguage.Enabled = false; + CultureInfo Culture = GetGlobalCulture(); + Misc.WaitNSeconds(1, true); + + Display.SetControlText(Culture); + lbLanguage.Enabled = true; + } + + private void BtnOpenSetup_Click(object sender, EventArgs e) + { + var setupWindow = new FrmSetup(); + setupWindow.ShowDialog(); + } + + + + + //todo check for reimplementation + private void GenesisZeroFlow_Resize(object sender, EventArgs e) + { + // int Width_small = 85; + // int Width_big = 150; + // Screen screen = Screen.FromControl(this); + // int ScreenWidth = screen.Bounds.Width; + // int ScreenHeight = screen.Bounds.Height; + // const int gap = 6; + // const int width = 90; + // const int bigwidth = 130; + // Point Marking1 = new Point(12,78); + // Point Marking2 = new Point(30, 78); + // Point ImagePos1 = new Point(18, 18); + // Point ImagePos2 = new Point(40, 18); + // Point MeterPos1 = new Point(18, 102); + // Point MeterPos2 = new Point(170, 150); + // Point GB_ProgressPos1 = new Point (6, 342); + // Point GB_ProgressPos2 = new Point(170, 480); + // Point GB_StatusPos1 = new Point(24, 294); + // Point GB_StatusPos2 = new Point(180, 400); + // Point TextBoxPosition1 = new Point(14, 570); + // Point TextBoxPosition2 = new Point(14, 700); + // const int CheckBoxY = 150; + // const int CheckBoxGap = 12; + // const int TextBoxHeight1 = 90; + // const int TextBoxHeight2 = 280; + + + + + // if (this.WindowState == FormWindowState.Normal) + // { + + // p_ZeroFlowCal_Meter1.Width = Width_small; + // rTB_ZeroFlowCal.Height = TextBoxHeight1; + + // //this.Hide(); + // l_ZeroFlowCal_Status.Location = GB_StatusPos1; + // gB_Meters.Width = 906; + // p_ZeroFlowCal_Meter1.Width = 85; + // p_ZeroFlowCal_Meter2.Width = 85; + // p_ZeroFlowCal_Meter3.Width = 85; + // p_ZeroFlowCal_Meter4.Width = 85; + // p_ZeroFlowCal_Meter5.Width = 85; + // p_ZeroFlowCal_Meter6.Width = 85; + // p_ZeroFlowCal_Meter7.Width = 85; + // p_ZeroFlowCal_Meter8.Width = 85; + // p_ZeroFlowCal_Meter9.Width = 85; + // p_ZeroFlowCal_Meter10.Width = 85; + + // p_ZeroFlowCal_Meter1.Location = new Point(gap, 12); + // p_ZeroFlowCal_Meter2.Location = new Point(width + gap, 12); + // p_ZeroFlowCal_Meter3.Location = new Point(2*width+gap, 12); + // p_ZeroFlowCal_Meter4.Location = new Point(3*width+gap, 12); + // p_ZeroFlowCal_Meter5.Location = new Point(4*width+gap, 12); + // p_ZeroFlowCal_Meter6.Location = new Point(5*width+gap, 12); + // p_ZeroFlowCal_Meter7.Location = new Point(6*width+gap, 12); + // p_ZeroFlowCal_Meter8.Location = new Point(7*width+gap, 12); + // p_ZeroFlowCal_Meter9.Location = new Point(8*width+gap, 12); + // p_ZeroFlowCal_Meter10.Location = new Point(9*width+gap, 12); + + // l_ZeroFlowCal_Meter1.Location = Marking1; + // l_ZeroFlowCal_Meter2.Location = Marking1; + // l_ZeroFlowCal_Meter3.Location = Marking1; + // l_ZeroFlowCal_Meter4.Location = Marking1; + // l_ZeroFlowCal_Meter5.Location = Marking1; + // l_ZeroFlowCal_Meter6.Location = Marking1; + // l_ZeroFlowCal_Meter7.Location = Marking1; + // l_ZeroFlowCal_Meter8.Location = Marking1; + // l_ZeroFlowCal_Meter9.Location = Marking1; + // l_ZeroFlowCal_Meter10.Location = Marking1; + + // pB_Meter1.Location = ImagePos1; + // pB_Meter2.Location = ImagePos1; + // pB_Meter3.Location = ImagePos1; + // pB_Meter4.Location = ImagePos1; + // pB_Meter5.Location = ImagePos1; + // pB_Meter6.Location = ImagePos1; + // pB_Meter7.Location = ImagePos1; + // pB_Meter8.Location = ImagePos1; + // pB_Meter9.Location = ImagePos1; + // pB_Meter10.Location = ImagePos1; + + // cB_ZeroFlowCal_EnableMeter1.Location = new Point(CheckBoxGap, CheckBoxY); + // cB_ZeroFlowCal_EnableMeter2.Location = new Point(width + CheckBoxGap, CheckBoxY); + // cB_ZeroFlowCal_EnableMeter3.Location = new Point(2*width + CheckBoxGap, CheckBoxY); + // cB_ZeroFlowCal_EnableMeter4.Location = new Point(3*width + CheckBoxGap, CheckBoxY); + // cB_ZeroFlowCal_EnableMeter5.Location = new Point(4*width + CheckBoxGap, CheckBoxY); + // cB_ZeroFlowCal_EnableMeter6.Location = new Point(5*width + CheckBoxGap, CheckBoxY); + // cB_ZeroFlowCal_EnableMeter7.Location = new Point(6*width + CheckBoxGap, CheckBoxY); + // cB_ZeroFlowCal_EnableMeter8.Location = new Point(7*width + CheckBoxGap, CheckBoxY); + // cB_ZeroFlowCal_EnableMeter9.Location = new Point(8*width + CheckBoxGap, CheckBoxY); + // cB_ZeroFlowCal_EnableMeter10.Location = new Point(9*width + CheckBoxGap, CheckBoxY); + + // gB_Meters.Location = MeterPos1; + // gB_Progress.Location = GB_ProgressPos1; + // rTB_ZeroFlowCal.Location = TextBoxPosition1; + // } + + // if (this.WindowState == FormWindowState.Maximized) + // { + + // if (ScreenWidth > 1200) + // { + // l_ZeroFlowCal_Status.Location = GB_StatusPos2; + // p_ZeroFlowCal_Meter1.Width = Width_big; + // gB_Meters.Width = 1306; + // p_ZeroFlowCal_Meter1.Width = 127; + // p_ZeroFlowCal_Meter2.Width = 127; + // p_ZeroFlowCal_Meter3.Width = 127; + // p_ZeroFlowCal_Meter4.Width = 127; + // p_ZeroFlowCal_Meter5.Width = 127; + // p_ZeroFlowCal_Meter6.Width = 127; + // p_ZeroFlowCal_Meter7.Width = 127; + // p_ZeroFlowCal_Meter8.Width = 127; + // p_ZeroFlowCal_Meter9.Width = 127; + // p_ZeroFlowCal_Meter10.Width = 127; + + // p_ZeroFlowCal_Meter1.Location = new Point(gap, 12); + // p_ZeroFlowCal_Meter2.Location = new Point(bigwidth + gap, 12); + // p_ZeroFlowCal_Meter3.Location = new Point(2 * bigwidth + gap, 12); + // p_ZeroFlowCal_Meter4.Location = new Point(3 * bigwidth + gap, 12); + // p_ZeroFlowCal_Meter5.Location = new Point(4 * bigwidth + gap, 12); + // p_ZeroFlowCal_Meter6.Location = new Point(5 * bigwidth + gap, 12); + // p_ZeroFlowCal_Meter7.Location = new Point(6 * bigwidth + gap, 12); + // p_ZeroFlowCal_Meter8.Location = new Point(7 * bigwidth + gap, 12); + // p_ZeroFlowCal_Meter9.Location = new Point(8 * bigwidth + gap, 12); + // p_ZeroFlowCal_Meter10.Location = new Point(9 * bigwidth + gap, 12); + + // l_ZeroFlowCal_Meter1.Location = Marking2; + // l_ZeroFlowCal_Meter2.Location = Marking2; + // l_ZeroFlowCal_Meter3.Location = Marking2; + // l_ZeroFlowCal_Meter4.Location = Marking2; + // l_ZeroFlowCal_Meter5.Location = Marking2; + // l_ZeroFlowCal_Meter6.Location = Marking2; + // l_ZeroFlowCal_Meter7.Location = Marking2; + // l_ZeroFlowCal_Meter8.Location = Marking2; + // l_ZeroFlowCal_Meter9.Location = Marking2; + // l_ZeroFlowCal_Meter10.Location = Marking2; + + + + // cB_ZeroFlowCal_EnableMeter1.Location = new Point(CheckBoxGap, CheckBoxY); + // cB_ZeroFlowCal_EnableMeter2.Location = new Point(bigwidth + CheckBoxGap, CheckBoxY); + // cB_ZeroFlowCal_EnableMeter3.Location = new Point(2 * bigwidth + CheckBoxGap, CheckBoxY); + // cB_ZeroFlowCal_EnableMeter4.Location = new Point(3 * bigwidth + CheckBoxGap, CheckBoxY); + // cB_ZeroFlowCal_EnableMeter5.Location = new Point(4 * bigwidth + CheckBoxGap, CheckBoxY); + // cB_ZeroFlowCal_EnableMeter6.Location = new Point(5 * bigwidth + CheckBoxGap, CheckBoxY); + // cB_ZeroFlowCal_EnableMeter7.Location = new Point(6 * bigwidth + CheckBoxGap, CheckBoxY); + // cB_ZeroFlowCal_EnableMeter8.Location = new Point(7 * bigwidth + CheckBoxGap, CheckBoxY); + // cB_ZeroFlowCal_EnableMeter9.Location = new Point(8 * bigwidth + CheckBoxGap, CheckBoxY); + // cB_ZeroFlowCal_EnableMeter10.Location = new Point(9 * bigwidth + CheckBoxGap, CheckBoxY); + + // gB_Meters.Location = MeterPos2; + // gB_Progress.Location = GB_ProgressPos2; + // rTB_ZeroFlowCal.Height = TextBoxHeight2; + // rTB_ZeroFlowCal.Location = TextBoxPosition2; + + // //pB_Meter1.Location = ImagePos2; + // pB_Meter2.Location = ImagePos2; + // pB_Meter3.Location = ImagePos2; + // pB_Meter4.Location = ImagePos2; + // pB_Meter5.Location = ImagePos2; + // pB_Meter6.Location = ImagePos2; + // pB_Meter7.Location = ImagePos2; + // pB_Meter8.Location = ImagePos2; + // pB_Meter9.Location = ImagePos2; + // pB_Meter10.Location = ImagePos2; + // } + // else + // { + // l_ZeroFlowCal_Status.Location = GB_StatusPos1; + // p_ZeroFlowCal_Meter1.Width = Width_small; + // gB_Meters.Width = 906; + + // p_ZeroFlowCal_Meter1.Width = 85; + // p_ZeroFlowCal_Meter2.Width = 85; + // p_ZeroFlowCal_Meter3.Width = 85; + // p_ZeroFlowCal_Meter4.Width = 85; + // p_ZeroFlowCal_Meter5.Width = 85; + // p_ZeroFlowCal_Meter6.Width = 85; + // p_ZeroFlowCal_Meter7.Width = 85; + // p_ZeroFlowCal_Meter8.Width = 85; + // p_ZeroFlowCal_Meter9.Width = 85; + // p_ZeroFlowCal_Meter10.Width = 85; + + // p_ZeroFlowCal_Meter1.Location = new Point(gap, 12); + // p_ZeroFlowCal_Meter2.Location = new Point(width + gap, 12); + // p_ZeroFlowCal_Meter3.Location = new Point(2 * width + gap, 12); + // p_ZeroFlowCal_Meter4.Location = new Point(3 * width + gap, 12); + // p_ZeroFlowCal_Meter5.Location = new Point(4 * width + gap, 12); + // p_ZeroFlowCal_Meter6.Location = new Point(5 * width + gap, 12); + // p_ZeroFlowCal_Meter7.Location = new Point(6 * width + gap, 12); + // p_ZeroFlowCal_Meter8.Location = new Point(7 * width + gap, 12); + // p_ZeroFlowCal_Meter9.Location = new Point(8 * width + gap, 12); + // p_ZeroFlowCal_Meter10.Location = new Point(9 * width + gap, 12); + + // l_ZeroFlowCal_Meter1.Location = Marking1; + // l_ZeroFlowCal_Meter2.Location = Marking1; + // l_ZeroFlowCal_Meter3.Location = Marking1; + // l_ZeroFlowCal_Meter4.Location = Marking1; + // l_ZeroFlowCal_Meter5.Location = Marking1; + // l_ZeroFlowCal_Meter6.Location = Marking1; + // l_ZeroFlowCal_Meter7.Location = Marking1; + // l_ZeroFlowCal_Meter8.Location = Marking1; + // l_ZeroFlowCal_Meter9.Location = Marking1; + // l_ZeroFlowCal_Meter10.Location = Marking1; + + // pB_Meter1.Location = ImagePos1; + // pB_Meter2.Location = ImagePos1; + // pB_Meter3.Location = ImagePos1; + // pB_Meter4.Location = ImagePos1; + // pB_Meter5.Location = ImagePos1; + // pB_Meter6.Location = ImagePos1; + // pB_Meter7.Location = ImagePos1; + // pB_Meter8.Location = ImagePos1; + // pB_Meter9.Location = ImagePos1; + // pB_Meter10.Location = ImagePos1; + + // cB_ZeroFlowCal_EnableMeter1.Location = new Point(CheckBoxGap, CheckBoxY); + // cB_ZeroFlowCal_EnableMeter2.Location = new Point(width + CheckBoxGap, CheckBoxY); + // cB_ZeroFlowCal_EnableMeter3.Location = new Point(2 * width + CheckBoxGap, CheckBoxY); + // cB_ZeroFlowCal_EnableMeter4.Location = new Point(3 * width + CheckBoxGap, CheckBoxY); + // cB_ZeroFlowCal_EnableMeter5.Location = new Point(4 * width + CheckBoxGap, CheckBoxY); + // cB_ZeroFlowCal_EnableMeter6.Location = new Point(5 * width + CheckBoxGap, CheckBoxY); + // cB_ZeroFlowCal_EnableMeter7.Location = new Point(6 * width + CheckBoxGap, CheckBoxY); + // cB_ZeroFlowCal_EnableMeter8.Location = new Point(7 * width + CheckBoxGap, CheckBoxY); + // cB_ZeroFlowCal_EnableMeter9.Location = new Point(8 * width + CheckBoxGap, CheckBoxY); + // cB_ZeroFlowCal_EnableMeter10.Location = new Point(9 * width + CheckBoxGap, CheckBoxY); + + // gB_Meters.Location = MeterPos1; + // gB_Progress.Location = GB_ProgressPos1; + // rTB_ZeroFlowCal.Height = TextBoxHeight1; + // rTB_ZeroFlowCal.Location = TextBoxPosition1; + // } + //this.Hide(); + + // } + } + + } +} diff --git a/ZeroFlowTool/Form1.resx b/ZeroFlowTool/Form1.resx new file mode 100644 index 00000000..9a529891 --- /dev/null +++ b/ZeroFlowTool/Form1.resx @@ -0,0 +1,70122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 44, 402 + + + True + + + True + + + + + /9j/4AAQSkZJRgABAgEAAAAAAAD/7gAOQWRvYmUAZAAAAAAB/9sAQwACAgICAgICAgICAwICAgMEAwIC + AwQFBAQEBAQFBgUFBQUFBQYGBwcIBwcGCQkKCgkJDAwMDAwMDAwMDAwMDAwM/9sAQwEDAwMFBAUJBgYJ + DQsJCw0PDg4ODg8PDAwMDAwPDwwMDAwMDA8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AAEQgB + IwJYAwERAAIRAQMRAf/EAB8AAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKC//EALUQAAIBAwMCBAIG + BwMEAgYCcwECAxEEAAUhEjFBUQYTYSJxgRQykaEHFbFCI8FS0eEzFmLwJHKC8SVDNFOSorJjc8I1RCeT + o7M2F1RkdMPS4ggmgwkKGBmElEVGpLRW01UoGvLj88TU5PRldYWVpbXF1eX1ZnaGlqa2xtbm9jdHV2d3 + h5ent8fX5/c4SFhoeIiYqLjI2Oj4KTlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/EAB8BAAICAwEB + AQEBAAAAAAAAAAEAAgMEBQYHCAkKC//EALURAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZx + gZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp + 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+DlJ + WWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A+/mKuxV2KuxV2KuxV2KuxV2KuxV2 + KuxV5r+cX/ksfOf/AGz2/wCJLmq7c/xLL/VcTXf3Evc/L3PI3kXYq7FXYq7FXYq7FXYq7FXYq/UL8nf/ + ACWPkz/tnr/xJs9c7D/xLF/Veu0P9xH3PSs2rluxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux + V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux + V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvN/zfR5Pyz85JGjSO2nsFRQST8S9AM1fbYJ0WWv5ri67+4l + 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 + 7FXYq7FXYq/kt/MP/lP/ADz/AOBBqf8A1FSZ7Npv7qH9Ufc+fZvrl7yw/L2t+nP/AD62/wDJvfmF/wCA + e3/dQtc5P2v/AMXh/W/QXedg/wB7L+r+kP3Jzz56l+S3/P1b/jgfkv8A9tDW/wDk1Z52fsf9eX3R/S89 + 2/8ATD4/ofjNndPNuxV2KuxV2KuxV2KuxV2KvRvyo/K/zT+cXnvQfIPlGze41LWbhVuLviWhsrYEGa7u + GH2Y4lqx7nZVqxAOLrNXDS4jkmdh9p7h727T4JZ5iEeZf1OeU/LWm+TPK3lvyho6FNJ8r6XaaTpqtTl6 + FnCsMfIilSVQVPjnkObLLLOU5c5Ek/F7zHAQiIjkBTIMqZvyD/5+Y/kbrOoXPl/88vLmmyX1jp+nrovn + oW6cjbRxStJZ3jhRUqfVaJ2Oy0jHfO29lO0IxEtPI0Sbj594/T83ne3NKTWWI8j+gvx5zt3nHYq7FXYq + 7FXYq7FXYq7FUw0rStT13U7DRdFsLjVdW1W4jtdN021jaWeeeVgqRxooJZmJoAMjOcYRMpGgOZTGJkaG + 5L+nr/nGf8pZfyT/ACW8l+Qb0xvrllbveeZZYm5IdRvZGnnVWBoyxFxErDqqA988l7W1v5vUyyDlyHuG + w/W9zodP4GGMDz6+97xmuct/Pd/z8c/9aY1T/wAB/Sf+TbZ6X7L/AOJD+sXj+2v8YPuD4OzonVOxV2Ku + xV2KuxV2KuxV2KvtL/nBv8i9Z/Nj85fL3mObTn/wN+XV/BrPmHVJFPovc2zCazs0Owd5JVUsvaMMT2Da + H2g7QjptNKN+uYoDyPM/L7XZ9laU5sol/DHc/oD7f/6JX+QP/Lq+YP8ApCtf65oP9GGX/U4/Mu0/kGH8 + 8u/6JX+QP/Lq+YP+kK1/rj/owy/6nH5lf5Bh/PLv+iV/kD/y6vmD/pCtf64/6MMv+px+ZX+QYfzy7/ol + f5A/8ur5g/6QrX+uP+jDL/qcfmV/kGH88u/6JX+QP/Lq+YP+kK1/rj/owy/6nH5lf5Bh/PLv+iV/kD/y + 6vmD/pCtf64/6MMv+px+ZX+QYfzy7/olf5A/8ur5g/6QrX+uP+jDL/qcfmV/kGH88u/6JX+QP/Lq+YP+ + kK1/rj/owy/6nH5lf5Bh/PKJtP8An1l+WiS1vvzO8zXEFN44ILOF6/67JKP+FyMva/N0xx+1R2Dj6yP2 + Pof8s/8AnBf/AJx2/LG/tdXtfK9x5w1qxdZLPVPNE4v/AE3XcOtskcNryBFQxhqDuCM1mr9odZqBwmXC + D0jt9u5+1zcHZWDEbqz57/sfYOaR2LsVdirw383f+ccPyd/PBIpPzB8ow3+rW0fpWfmO0kez1GJBuF+s + QlS6ipokgZRWoWubDRdqajR/3UqHdzHy/U4uo0WLUfWN+/q+N9W/59b/AJSXEzPov5hebNMhZq+hdfUb + ygPYMtvAdj0rX+Ob2HtfqAPVCJ+Y/SXWy7BxHlI/YlH/AESv8gf+XV8wf9IVr/XJ/wCjDL/qcfmWP8gw + /nl3/RK/yB/5dXzB/wBIVr/XH/Rhl/1OPzK/yDD+eXf9Er/IH/l1fMH/AEhWv9cf9GGX/U4/Mr/IMP55 + d/0Sv8gf+XV8wf8ASFa/1x/0YZf9Tj8yv8gw/nl3/RK/yB/5dXzB/wBIVr/XH/Rhl/1OPzK/yDD+eXf9 + Er/IH/l1fMH/AEhWv9cf9GGX/U4/Mr/IMP55d/0Sv8gf+XV8wf8ASFa/1x/0YZf9Tj8yv8gw/nl3/RK/ + yB/5dXzB/wBIVr/XH/Rhl/1OPzK/yDD+eX6JflZ5As/ys/L3yn+Xun6hNqtn5TsVsbfUbhVSWVVZm5Mq + bA/F2zmNZqTqc0spFGRt3GnwjDjEBvTP8xm58b/85If84ceWv+cj/NOheadb85an5buNC0oaVFa2NvDK + kiCeSfmxkNQayEZvOy+3J6DGYRiDZvd1ut7NjqpCRkRQp87f9Er/ACB/5dXzB/0hWv8AXNp/owy/6nH5 + lw/5Bh/PKa6F/wA+xPImha3o2txfmfr08ujX1vfRQPZ2oV2t5VlCkg1AJWmQye1uWcTHwxuK5lMOw4RI + PEdn6eZyTvXYq7FXYq7FXYq/MPXf+fYnkTXdb1nW5fzP16CXWb64vpYEs7UqjXErSlQSakAtTOtx+1uW + ERHwxsK5l0U+w4SJPEd0q/6JX+QP/Lq+YP8ApCtf65P/AEYZf9Tj8yj+QYfzy+if+cb/APnDjy1/zjh5 + p13zTonnLU/MlxrulHSpbW+t4YkjQzxz81MZqTWMDNX2p25PX4xCUQKN7OZouzY6WRkJE2KfZGaN2T5h + /wCclv8AnGLQv+clbHylY655ov8AyynlKe8nt3sYYpjMbxYlYP6vTj6QpTxzbdldrS7PMjGIPFXPycHX + aGOqABNU+TP+iV/kD/y6vmD/AKQrX+ubr/Rhl/1OPzLr/wCQYfzy7/olf5A/8ur5g/6QrX+uP+jDL/qc + fmV/kGH88u/6JX+QP/Lq+YP+kK1/rj/owy/6nH5lf5Bh/PLv+iV/kD/y6vmD/pCtf64/6MMv+px+ZX+Q + Yfzy7/olf5A/8ur5g/6QrX+uP+jDL/qcfmV/kGH88u/6JX+QP/Lq+YP+kK1/rj/owy/6nH5lf5Bh/PLv + +iV/kD/y6vmD/pCtf64/6MMv+px+ZX+QYfzy7/olf5A/8ur5g/6QrX+uP+jDL/qcfmV/kGH88sq8v/8A + PsH8ktPlin1/zb5t8xGMgtarPaWdvJ1qHEds8tOn2ZB+O1OX2t1MvpjEfM/p/Qzh2FhHMk/J9t/ln+Tn + 5Z/k7pUukflx5QsfLNtclTfXEIeW6uSv2TPdTNJNLSpoGcgVNKZoNXrs2qlxZZE/cPcOTtMGmx4BUBT0 + zMRvdiqjcW9veW89pdwR3VrdRtDc20yh45I3BVkdWBDKwNCD1wgkGwgi9i+JvP8A/wA+9/8AnHHzxdXF + /Y6HqXkC+uSXlbyzdiC3Lkk1Frcx3MCL/kxIgp0pm/03tLrMIokSH9IfpFH5uszdj6fIbAMfc8TuP+fW + P5cNM7Wv5oeZIYDT045bazlcbCtXVYwd/wDJGZ49r83XHH5lxT2Dj/nH7FH/AKJX+QP/AC6vmD/pCtf6 + 4f8ARhl/1OPzK/yDD+eXf9Er/IH/AJdXzB/0hWv9cf8ARhl/1OPzK/yDD+eXf9Er/IH/AJdXzB/0hWv9 + cf8ARhl/1OPzK/yDD+eXf9Er/IH/AJdXzB/0hWv9cf8ARhl/1OPzK/yDD+eXf9Er/IH/AJdXzB/0hWv9 + cf8ARhl/1OPzK/yDD+eXf9Er/IH/AJdXzB/0hWv9cf8ARhl/1OPzK/yDD+eU30n/AJ9b/lHbyq+tfmD5 + t1ONWqYbX6jaclp9klrec9etKbeHXK5+12oP0wiPmf0hlHsHEOcj9j69/KL/AJxj/Jb8kJDe+Q/J8MGv + Mhjl80ag7XupFWHFlSeYn0lYbMsQRT3BzS63tbU6zbJLbuGw/b8XY6fQ4cG8Bv39Xvua1y3Yq+F/z8/5 + wY8qfn5+YVz+YWr+etW0C8ubG1sW06ztoJYgtqpUMGkNamu+dD2b7Q5NFh8KMARZO99XVavsqOoycZkQ + 8W/6JX+QP/Lq+YP+kK1/rmf/AKMMv+px+Zcb+QYfzy7/AKJX+QP/AC6vmD/pCtf64/6MMv8AqcfmV/kG + H88u/wCiV/kD/wAur5g/6QrX+uP+jDL/AKnH5lf5Bh/PLv8Aolf5A/8ALq+YP+kK1/rj/owy/wCpx+ZX + +QYfzy7/AKJX+QP/AC6vmD/pCtf64/6MMv8AqcfmV/kGH88u/wCiV/kD/wAur5g/6QrX+uP+jDL/AKnH + 5lf5Bh/PLv8Aolf5A/8ALq+YP+kK1/rj/owy/wCpx+ZX+QYfzy2P+fWH5f1FfzU8wkdwLO0H8cf9GGX/ + AFOPzK/yDD+eXpPlP/n2r/zj1oF3Hea5c+ZvO3A1bT9Sv47e1NCSPhsILaX51lzEze1WrmKjwx9w3+0k + fY3Y+xMETZs/H9T7m8reU/LPkjQ7Ly15Q0Ky8uaDp68bPS7CFYYUr1aigVZurMakncknOfzZp5pGcyST + 1LtceOOMcMRQZDlTN2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku + xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku + xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku + xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku + xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku + xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku + xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku + xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku + xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku + xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku + xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku + xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku + xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku + xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku + xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku + xV2KuxV2KuxV2KuxV2KvDf8AnIf8zNe/KX8t7nzh5ctLC91OG/tLVYNSjlkg4TsQxKwywtUU2+LNp2Po + oazUDHMkCidue3vBdB7S9q5ezNGc+IAysD1XW/uI+98q/kx/zl/+ZX5i/md5T8l63oflm10vXriaK8uL + G2vEuFEdvLKPTaS9lUGqDqp2zfdpezun02nnljKVjvIrmPJ5DsP211mu1uPBkhjEZE3QlfInrI93c/Rz + ONfTnYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX5I6n+ZP5iR/85Xx+XI/P3mNPLx/Mq0sDoS6 + rdiy+qtqccbQfVxL6fplCVKcaU2pnoMNFgPZnH4ceLwiboXfDzuub41l7U1Y7d8Lxp8HjgcPFLhrjAqr + qvJ+t2efPsrsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVfkj/zlh+ZP5ieXPzt + 8x6T5e8/eY9B0uC005oNN07Vbu1t0L2kTOViilVQWJJNBuc9B7A0WDLo4ynjiTZ3IBPP3PjXth2pq8Ha + U4Ys04xAjsJSA+kdAX63Z58+yuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K + uxV2KuxV2KuxV2KuxV2KuxV8k/8AOa//AJIy/wD+2xp3/E2zoPZn/HB7i8b7d/8AGYf60X53f84tf+T9 + /Lj/AJjLn/qCuM7Ht3/EsnuH3h809kv+NXD7z/uS/cfPLn312KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K + uxV2KuxV+Lmq/wDrZEX/AJtWy/7q0WelY/8AjK/5JH/cl8Mzf85D/wBbA/3YftHnmr7m7FXYq7FXYq7F + XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX4uf85k/+T980f8AMHpn/UFFnpXs3/iUfefvL4Z7 + b/8AGrk90f8Ach+0eeavubsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVWu6Ro8kjrHHGpaSRjQKBu + SSegGIFoJAFlLINc0S6uGtLXWLG5u0ID2sVxG8gJ3AKKxIr8ssOKYFkGvc1R1GOR4RIE91hNcrbnYq7F + XYq7FXYq7FXYqxvVPOXlDQ7j6rrXmrR9Huuv1a9vre3k6A/ZkdT3GXY9NlyC4xJHkCXFza7T4TWTJGJ8 + 5AfeU6s72y1G3S70+7hvrWX+7ubeRZY2+TISDlcomJoii3wyRmOKJBHeN0VkWbsVdirsVfJP/Oa//kjL + /wD7bGnf8TbOg9mf8cHuLxvt3/xmH+tF+d3/ADi1/wCT9/Lj/mMuf+oK4zse3f8AEsnuH3h809kv+NXD + 7z/uS/cfPLn312KqNxcQWsMlzdTx21vCvKaeVgiKB3ZmIAHzwgEmgxlIRFk0GLxfmB5DmuPqkPnbQJbv + kU+qpqVq0nIdRwElaj5ZedJmAswlXuLiDtLSk8Iywvu4h+tlisrqrowdHAZHU1BB3BBGY7mg2uxV2Kux + VjN9518m6Zc/UtS826Np94W4C0ub+3il5bbcHcGu47ZfHTZZi4wkR7i4uTX6fHLhlkiD3GQB+9P7a6tb + 2CO6s7mK7tpRyiuIXWRGHirKSDlMomJoii5EJxmLibHkqu6Ro8kjrHHGpaSRjQKBuSSegGAC0kgCyxdP + PXkiS7+oJ5x0N76oH1JdRtjLU0oOAk5d/DL/AMrmq+CVe4uIO0NMZcPiwvu4hf3spBBAINQdwRlDmN4q + 7FXYq7FX4uar/wCtkRf+bVsv+6tFnpWP/jK/5JH/AHJfDM3/ADkP/WwP92H7R55q+5pbd6zpFhLHb32q + 2dlPMQsUM88cbsT0CqzAnJxxykLAJap58cDUpAHzIR8ckcqJLE6yRyAMkiEMpB6EEbHIkU2AgiwvwJdi + rsVWu6Ro8kjrHHGpaSRjQKBuSSegGIFoJAFlAWer6TqDyRWGp2l9JCzJLHbzRysrLTkGCMSCKiuTljlH + mCGuGbHM1GQPuNpjkG1CXmoWGnR+tqF7b2MVCfVuJFiWi9TVyBtkowlLkLYTyRgLkQPfs6z1Cw1GP1tP + vbe+ioD6tvIsq0boaoSN8ZQlHmKWGSMxcSD7t0XkWbsVdirsVSyHW9GuLl7K31eynvIyBJaR3EbSqWFQ + CgYkVHtkzimBZBr3NUc+OUuESBPdYtM8g2uxV2KuxVKo9d0Oa5FnDrNjLeGhFqlxE0nxGg+ANXcnbbLD + imBdGvc0jUYieESF91hNcrbn4uf85k/+T980f8wemf8AUFFnpXs3/iUfefvL4Z7b/wDGrk90f9yH7R55 + q+5uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kvmz/nJz82vOX5R+S7TV/KHl5NQk1K4a0u/MU9JLfTC + QPSZ4QQXaUkhCfgBHxVqFO67D7PxazMY5JVW9dZfHy+by3tX2zqOzNMJ4YXZoyPKHdt1vp07+58G6J+T + P/OSn/OQixeY/Mmq3UOjX59a11LzLdyQW7oTXla2MSuyqeq8YlQ7UNN86vL2l2f2b6IAcQ6RFn4y/bb5 + 7g7D7Y7b/e5ZHhPIzJA/zYjp3ekBlmo/84E/mLbWhn0vzhoGo3qDl9Uk+s24YjeiSenIK+FQB7jMeHtZ + gJqUJAfAuZl/4HerjG4ZIE924+2ixP8AL788vzb/AOcePOn+DfzE/SOoaBZypDrPlnUpTPLbQt9mewmY + vQAHkArem48CeQyNZ2Xpe0sXiYaEjyI2vykPwQ4fZvb+v7D1PganiMAd4yNkDvgft29J+1+vOnahZavp + 9hqum3C3enanbxXdhdpXjLDMgkjda0NGVgRnnk4GEjGWxBovtGLLHLATibiQCD3g8kZkWbsVfnZ/zmV+ + QIvYLr83/KFl/ptsgPnjTYV/vYkFBfqo/aQACXxWj9mJ7H2b7W4SNPkO38J/3v6vk+Z+3Hs5xg63CNx9 + YHUfz/h/F5b9745/Ib85NT/Jnztb6zGZLry7qXC181aQp/vrau0iA7epESWQ/NejHOj7W7NjrsPD/EN4 + nz/UXifZ7tyfZWpExvA7SHeO/wB46fLq/cbRtY0zzDpOna5ot5HqGk6tbx3Wn3sRqkkUihlYfQdwdx0O + eXZMcscjCQojYvvuDPDPjjkxm4yFg+T85/8AnKX/AJyl1GLUb/8ALb8sdVaxisWa380+a7N6TPMNntLW + Rd0CHZ5FPIt8KkAHl2XYXYUTEZ84u/pifvP6B+B5l7Xe10xM6XSSqtpTHO/5sT0rqRvew8/n5aaP5g10 + X99YaVqGsra1n1S8t4JbgR8qkvM6q3Gu5qxzrpZIY6BIHd0+T5vDBlzXKMZSrckAn5sr/Lb80vOP5Va/ + b695T1SS2Kup1DSnZjZ3sYO8VxECAwI2B+0vVSDmPrdBi1cODIPceo9zmdl9rajs3KMmGVd4/hl5Efgj + o/cv8t/PmkfmZ5L0Lzpop42msQcprVjV7a4QlJ4H6bxuCK03FGGxGeXa3SS0uaWKXMfaOhffuy+0cfaG + mhnx8pDl3HqPgf1s4zFdg8x/Obzwn5dflh5x82+qIbzT9Pkj0g9zfXNILWg70ldSfYE5ndm6X8zqIY+h + O/uG5+x1Pbmv/I6LLmvcR2/rHaP2l+DOk6Zfa/rGmaNYIbjU9avIbKyjJNXnuZBHGCdzuzDPVsk444GR + 5AX8A/PWHFLNkjCO8pEAe8mn6sf85S+WLHyX/wA4waZ5T04AWfl640exicChcxVVpD7u1WPuc4LsLOc/ + aJyS5y4i+v8AtbpI6TsWOGPKJgPl1+PN8Kf84tf+T9/Lj/mMuf8AqCuM6rt3/EsnuH3h8+9kv+NXD7z/ + ALkv3Hzy599fNv8AzkT/AM5CaZ+SmjW9rY28Wr+dtbjdtG0qRv3UEY+E3VzxIbgG2VRQuQQCACRuux+y + Ja6dnaA5n9A/Gzy/tN7SQ7JxgRHFll9I6D+lLy7h1fkR5x/MTz/+Z+qi581eYNQ8xXdxL/oencmMEbNs + Et7WOkaeFEXf3OehabR4NLGscREd/wCsvi+t7T1XaGS805TJOw6fCI2HwCpc/lJ+adlp/wClrv8ALfzP + baaFLveyaTdrGqbfGxMXwqaihOx7Yx7Q00pcIyRv+sGU+xtdCHHLBkEe/hl+pPfyx/PP8xvyovYJfLWu + zS6Qrhrvyzes02nzr+0PSY/uyf5oyre9Nsp13ZeDWD1x37xz/Hvcjsn2g1nZsgcUzw9YneJ+HT3ii/Zr + 8pPzT0D83/Jtl5s0Ktu7MbfWNIkYNLZXaAF4XIpUUIZWp8SkGgNQPN+0NBPRZTjn8D3h9x7G7XxdqacZ + se3QjrGXd+o9Q9LlligikmmkWGGFS8srkKqqoqWYnYADqcwgL2DtCQBZ5Pxx/wCcgf8AnKDzT+Y+t6jo + flLVrnQfy/s5WgtIbR2gm1JUJHr3Lrxcq/VY/sgU5Atvno3ZHYePTQE8gByHv/h8h+t8S9o/azPr8kse + GRjhGwrYy85daPSPLv3fM2l+V/M2uW893ovl3U9XtbWoubmytJriOOgqebRowWg33zd5M+PGalIA+ZAe + VxaTNmBOOEpAdwJ+5kXkL8zPPP5YaumqeUNdudJlSUNeacWLWlyFO6XFuTwcECm45D9kg75Tq9Fh1ceH + JEHz6j3Fyezu1dT2fk48EzHvHQ+8dfv7mT/mx+e3n/8AN7UZZvMGqSWWhhq2HlWyd47GFR9kslf3r+Lv + U+FBtlHZ/ZWDRxqAuXWR5/s9wcrtj2g1Xacyckqh0iPpH6z5l5vceVvM9ppketXXlzVLbRpQDFq0tnMl + swY0BWZkCGp98zRnxmXCJC+6xfydZLSZow8QwkI99Gvnye1/kb/zkT5w/KLWbG3mv7nWfI0sqpq/lmaQ + yJHESA0tpzJ9KRBuAtFbo3YrrO1Ox8WsgTQE+h/X3j7ne9ge02o7MyAEmWLrE93fHuP2Hr5fbHTdRstX + 06w1bTp1utP1S2iu7C6T7MkM6CSNxXsysDnmU4GEjGXMGi+74sscsBOJuJAIPkdwjci2OxV2KvxP80al + Y6N/zltd6vqlyllpmlfmZBeajeSbJDBBqccksjU7KqknPTcEJT7MEYiycRA9/C+EavLHF28ZzNRjnBJ7 + gJgkvY/N351fnd/zkb5n1Dyh+S1lqGjeUrVikk9lJ9VmlhJIE1/fEp6KyAHjErCoqp9Q5rdP2Zo+zMYy + akgz89/hGPX3/c7vW9u9pdu5jh0AlHGO7Ykd85dL/m35bqFv/wA4F/mPdwPdap530GHUpau8K/W7gFzv + 8czRIak9TxP04T7V4AajCVfAfYxj/wADzWSFzyw4viftoPNfMf5X/wDOQ3/ONUn+ItN1K6s9GikX1vMH + l+5eewrUcRd27qtFJoP30XAnapzNw67Q9qeiQBPdIUfgf1G3V6rsntbsA+LCREf50Dcf84f8VGn3F/zj + b/zk7afm2P8ACfmqKDSvP1rEZIBACtvqcMa1eSEEnhIoBLpXp8S7cgvL9tdhnR/vMe+P7Y/s7j8/PvvZ + f2rj2n+5zVHMO7lMd47j3j4jrXrG/t2u7G9tUYK9zBJEjN0BdSoJp880EDUgXsckeKJHeH4rfkH+d15+ + XPnHU/M/mjV9R1uwt9BvYrbSZ7qaT6xdOYzBGnNmClnABYg8V5Gmel9rdmDU4hDGADxDehsOr4V7O9vS + 0GollyylICB2JO52ofPr0Fszj8tf85I/85XXE/mCaU23lKSZhYfXLh7HRYeLU4W8Ch3lKlaFwjmo+Jq5 + jHPoOyBwD6+tC5fE9PdYc4aXtj2kJyHbHe1nhxj3Dcn30fMvof8A5xz/AOcXPPX5TfmZ/irzZe6Lf6dB + o91BZTaXcTTMLqZ4kCss0EBA9P1NwD4d80/bPbuHWafw8YkDY5gct+4nrT0vsx7Jars3W+NmMTERIHCS + dzXeB0tiX/ORn53fnjL+Ytz+UXkbR9R8rF3VNMl01TLqmrROpK3EM8dfSiNCR6ZDLxPNgQyrkdjdl6MY + BqMpEu+/pj5EdT7/AIBw/aft7tM6s6LTxlDu4d5zHeCOQ924rc8wIBo//OFH5zebKax5x8xabo15dKGl + j1C6m1C+B60kMSvH90pzLye02kw+nHEkeQAH4+DrcHsJ2jqfXnnGJPeTKXxqx/sko81f84l/nZ+VkE3m + 7ynrEWtfoqNppbny9cXFtqUMabs6xFY2YACtI3Ztvs5bp/aDSas+HkFX/OAMfx72nWexvaXZwObDIS4d + 7gSJj4bfYSfJ9Df84pf85Nax561Ffy4/MK7S88wtC8vlrzCVVJL0QqXktpwoCmRUBZXAHJVPL4hVtP2/ + 2JDTx8bCKj1Hd5jyel9j/arJrJ/ldSbnXpl/OrmD51uD1A335+985N9Efih+UH5tXf5efnA2uebNX1W7 + 0PR11pJ9MkuZnrItrcCCERyMRyaUKgqNia9s9M7R7PGp0vDjAEjw715i/s3fCOxe2ZaHtDxM0pGEePaz + 3GhR86D0uO2/5yO/5y5u73Ure7Hln8vxK0Nvbyzy2mkKoNDGqxq0l5IBXkxVgDtVBRRhGWg7GAiRxZPn + L/jo/G7tRDtj2mkZA8GH3mMPdtvM953+HJbr/wDzgj+Z2mWEt5oXmHRPMV1Ahf8ARitNaTSEAnjE0qGM + sT05uo98cPtVp5yqcZRHfz/b96NT/wAD7W448WOcJkdNwfhe3zIY/wDkt/zkd5+/KDzdF5Q/MK81DUPK + cN4dP17SNVMkl3pTBuDSQNIS6+k27R7qRXiAxDZd2n2Ng1uLxMIAnVgjlL3+/vcfsL2n1XZeo8HUknHd + SEr4oeY67dRy+O79g4pYp4o5oZFmhmUPFKhDKysKhlI2II6HPOyK2L7UCCLHJ4T+fP57aH+SXl6G6mgX + V/NGsc08vaAHCcyo+KecjdYkJFaCrH4R3Zdp2T2VPXZKG0RzP6B5vP8AtD7Q4uycIJHFkl9Mf0nyH28v + MfNS1m/5yK/5yn1i9S3vb3U9Jiel5EJTYaFZA7qhQERswB2FHlI3NdznbSGg7JgLAB+cz+PgHyyEu1/a + LIaJMeu/Djj+j75PUI/+cBfzANpzl87eXkv+P+8yLdtDy8PVMStT34ZgH2swX9Eq+H6/0u2H/A61fDvl + hfxr51+hK7fXf+clP+cUdSsm8ypceY/IryLAYJbmS+0mRa/Yt5z8dpJQHiCq168HAyw4uz+14ng9M/dU + viP4h8/eGqOo7Y9m5jxbni5czKHwPOB7uXuLxL/nInz1oX5k/mfqHnLy7JI2maxp2mskUy8ZYZI7SOOW + KRdxyR1KmhIPUEihzZ9j6Wel04xz5gn73Q+03aGLX6058X0yjH3jYWD7i/dXPLH6BdirsVdirsVdirsV + dirsVdirsVdirsVdirsVQt7Y2WpWstjqNnBqFlOAJ7O5jWWJwCGAZHBU0IB3GSjIxNxNFhkxxyR4ZAEH + odwiQAAABQDYAZFmk135k8vafJ6V/r2nWUtWX057qGNqqaMKMwOx65bHDklyiT8GieqwwNSnEe8h+df/ + ADnevlXVrXyB5k0jU7C/1iGW7028eznimdrYqs0Qk4MSAj8+O37ZzsPZXxIHJCQIGx37+X49z5n/AMEI + YMscOWEgZbxNEHbmPkb+b6p/5xTv7nUv+cf/AMuri7f1JY7e9tUb/iq01C5t4hv4JGozRdvQEddkA7wf + mAXrvZDIcnZWEnuI+UpAfYH0LmneldiqySOOWN4pUWWKVSkkbgMrKwoQQdiCMINIIBFF+NH/ADlL+Qsv + 5T+Z/wDEGgWx/wAA+Z7hzpnEErYXTAu9kx7LQFoieqgjcoSfSOwu1vzmPgmf3kefmO/9f7Xw/wBrfZ09 + m5vExj9zM7f0T/N/4ny9zGfy+/5yR89fl3+XHmb8vNIl5Q6tU+X9WZyJtJMxpdGDY19Rd13HB6uNzl2r + 7Fw6nPHNLpzH87uv8bjZxezfajVaHR5NNDlL6T1hf1V7+ncd2EflF+Vuu/m/510/ypo/KCGQ/WNc1dlL + pZWaMPVmYbVO4VFqOTECoFSMrtDXQ0WE5JfAd57nX9i9k5e1NSMMOXOR/mx6n9XeX7m+S/Jfl38v/Lmm + +VvK+npp2k6bGERVA9SV6APNMwA5yORVmPU55bqdTk1GQ5Mhsn8UPJ+gNDocOiwxw4RUR9vme8nqX5R/ + 85k/lTbeQvzCg8zaLaLaeXfPaSXS28S8Y4NQhKi6RQNgH5rIPdmAFBnfezevOowcEjcobfDp+p8f9t+x + xotWMuMVDJv7pD6vnsfiXp3/ADgX+YDW2reavy0vbilvqUQ1vQomNALiHjFdIo7l4yjU8IycwfavSXGO + cdPSfd0/T83a/wDA87S4cmTSyOxHFH3jaXzFH4P04ziH1Z+df/OfHnf0NO8mfl3azUe+lk17V4waH0oe + Vvag9yGZpTTxUfR2PsnpblPMenpH3n9HzfM/+CJr6hi0wPP1n3DaP+++Twr/AJws8hnzV+baeYbmHnpn + kO0fUZGIqhvJwYLVD4EVeQe8ebX2l1fg6XgHOZr4cz+r4vP+wvZ/5nX+KR6cYv8AzjtH9J+D7T/5zX/8 + kZf/APbY07/ibZzPsz/jg9xe69u/+Mw/1ovzu/5xa/8AJ+/lx/zGXP8A1BXGdj27/iWT3D7w+aeyX/Gr + h95/3JfuPnlz76/AT84fPd1+ZH5kebPNk8xltr6+kj0hKkiOxgYx2yL/AM81BNOrEnvnrXZ2lGl08MY5 + gb+/q/OfbfaEtfrMmYnYnb+qNo/Z9r9MP+cQvyU0fyd5H0n8wNW0+K585ebrcXtpeTJyay0+YVgjgLD4 + TLGQ7sKE8gvRd+J9ou055sxwxPojt7z1v3cn1T2L7Bx6XTR1MxeWYsH+bE8gPeNyfOuj7Lzm3uH5n/8A + Obn5NaNpFvp35q+WtPi05728XT/NlpbIqRSSyq7w3nFQAHYqUkP7RKnryJ7b2Y7SnMnTzN0Lj+kfqfK/ + b3sPHiEdZiFWamBys8pe/oe/bzeWf84U+e7ny1+bKeVpJyNI892slpPAT8Au7WN7i2k+dFeMf6+Z/tNp + Bl03idYG/gdj+g/B1HsJ2hLT6/wb9OQV/nAExP3j4v0b/wCcidYudC/JH8ydQs3aK4OjyWiSIaMovXW1 + Yg9iFlO+cZ2PjGTWYwe+/lv+h9O9ps8sPZueUefDX+m9P6X4ieTtC/xR5u8reWebR/4i1ix0z1FpyX63 + cJDUVoKjn3z0/U5fCxSn/NBPyFvgui0/5jUY8X8+UY/6YgP6DdC0LSPLOj6foGg6fDpekaVCtvYWMC8U + REFB7knqSdydzvnkWXLLLMzmbJ5v0jp9Pj0+OOPGAIxFAB+ZP/Od/kTR9F8x+UfO2l2kVndea47u214R + KEE09n6LRzsB1dklKsf8kZ2/srqp5Mc8UjYjVe43t9j5V/wQuz8eLNjzwFGdiXmY1R99H7Hkf/OInkfS + fPP5yafDrdlHqOm+W9PuNblsZgGikeB4oYfUU7MFlmVqdDTfaubD2h1UtPpCYmjIiN+/c/YHS+xnZ+PW + dogZBcYRMq6bUBfxIL9n7uztL+0udPvrWK8sbyJ4LuzmRXilidSro6MCGVgaEEZ5tGRiQQaIfcpwjOJj + IAgiiDyIfgN+bflez8l/mb558r6cCunaNrF1DpqE8iluXLwoSepVGAJz1ns/Oc+nhkPMgX7+r86ds6SO + k1uXDH6YyIHu6fY/XX/nE3V59X/IPyJJcszzWCXtgXPeO2vJo4gPZYwq/RnnvtBjENbOutH5gfpfZ/Y7 + McvZeInmLHyka+yn0bmmendirsVfhN+cOk32v/8AOQPnvQtMi9fUta843Nhp8HTnPc3XpRr9LMBnqnZ2 + QY9DCcuQgCfgH597bwyzdq5ccN5SykD3k0H7Lfld+W2gflV5O0vyloFuii1jV9U1AKFlvbsqBLcSncks + RsCfhWijYDPN9drZ6vKck/gO4dz7h2T2Xi7N08cOMcuZ6yl1J/Gw2eh5huyQ95Z2moWlzYX9tFe2V7E8 + F5ZzoJIpYpAVdHRgQysDQg4YyMSCDRDGcIziYyFg7EHkQ/Ef84/KV/8A84//AJ3zDytPJZQ6bc2+v+Tb + gkkpbyMXSNt6sqSI8RqfiVd+pz07s3UR7R0f7zewYy9/43fBu29HLsTtI+CaAInD3d3wNx8wH7ReVdft + fNflny95nsRSz8xaba6lbITUql1EsoU+45UOea58Jw5JQPOJI+T7npNTHU4YZY8pxEvmLfgx+VHko/mJ + +Y/k/wAmEssGuajHHfuho62kQM1yynxEKOR756vr9T+W088vcNvfyH2vzz2Pofz2sx4Okpb+4by+wF+/ + Gm6bYaPp9lpWl2kVhpunQpbWNlAoSOKKNQqIqjoABTPJZzlORlI2TzforFijigIQFRAoAdAjci2IRtPs + Gvo9Uayt21OKBrWLUTGpnWB2V3iWWnIIzKCVrQkA9slxy4eG9uddGHhx4uOhxVV9a7r7leWaKCNpZ5Uh + iTd5XYKo7bk7YACeTIyAFlIX83+Uo3eOTzRpEckbFXRr2AFSNiCC+xGWjT5T/CfkXHOtwDY5I/Mfrfj3 + qyaf5P8A+ctrZvKs8LaZB560+4sjZuph9G+uIZZYY2SqhKTNHQdBtnouPizdmfvOfhnn5A7/AGW+KZhD + S9vDwSOHxokVyqRBIHluQ/abPNH3R+BNt5Wn87/nG3lG3cxSeYvNktg04FfSSa8ZZJKb/YSrfRnrJzjB + pPEP8ML+x+dY6Q6vtDwR/HkI91y3PwfvBoOh6V5Z0XTPL+iWaWGk6PbR2un2kYoqRxig+ZPUk7k7nfPK + suWWWZnI2SbL9CafTw0+OOPGKjEUAm2Vtz8of+c8PKdnpP5g+WPNVpCIX826W8WolRQS3GnOqeoT3b0p + Y1PsozvvZTUGeCWM/wAJ29x/aC+P/wDBC0ccerx5gPrjv5mPX5ED4Pvb/nHbWLnXfyR/LbULx2luBo8d + o8jmrMLJ2tVJPclYhvnJ9sYxj1mQDvv57/pfQ/ZnPLN2bglLnw1/pfT+h+VH5m61rH5+fn/d2Njcck1n + W4/L3ljnUx29jFN6EUhUE0BHKZ6HqWzvdDih2foQT0jxHzNX+wPkPaufJ212qYxP1T4I+UQaB/3x+L9l + fJPkzQfy/wDLGk+U/LVmtlpWkwiOMADnK9P3k0pFOTyNVmPjnm+q1M9RkOSZsn8U+36DQ4tFhjhxCoxH + z8z5nqyrKHMSrXND0nzLpGoaDrthDqekarC1vf2E6hkkjbqCOxHUEbg7jfLMWWWKQnA0RyLTqNPj1GOW + PIAYyFEF+DX5w/l7N+V35jeZvJbyNPa6ZcCTSrp92ls7hRNbsxAALcGAan7QOerdnawavBHL1I3945vz + 1232aeztZkwcwDse+J3H2c/N+/WeSv0W7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq+Of8AnJr/AJya + k/KSS38oeULe3vvOt9b/AFi7u7j44dNhfaNmjH25X3KqTRRRmBBAPR9idifnP3mSxAH/AE37HiPav2rP + ZhGDAAcpFknlEdNupP7S+N/Ln5d/85Nf85FRNrN/rmoyeXr4kpqmvXstppsgY0P1e1iUhl67xQ8O1c6T + NrOz+zTwiI4h0iLl8T+s28RpezO2e3RxynLgPWZMYfCI6e6NPVtO/wCffuuSoh1b8zLGycj94tppkt0A + aDYGS4t67+wzXz9roD6cZPvNfoLuMX/A4yn684HuiT95i8U/P/8A5xr/AOVGaP5f1b/Gn+KP07eS2n1f + 9HfUvS9OP1OXL61ccq9KUGbPsntr8/OUeDhoXzv9AdF7R+y38j44T8Xj4iR9PDW39aT9Ef8AnET/ANZ4 + /L3/ALe3/dWvM4/2h/x7J/m/7kPpfsZ/xk4f87/dyfSWaV6h2KuxV8+f85OeafJHlv8AKPzJD52s49Wi + 12FrHQ9D5BZbi+YcoXjahKegwEhenw07khTt+w8GbLqonEarcnuHX58qeb9q9XptPoJjOOLiFRj1Muld + 3Dzvp9j8O89QfA36af8AOCPnPyXHpfmDyOLOLTPPFzcHUJL1mq+qWka0VUJ6G2q3wDsxcft04n2q02Yy + jlu4cv6p/b3/AA7n1T/ge67TCE9PVZSbv+eP+O93nfe/RPOOfTHzn/zlR+X3/KwPyd8xR20Hrax5XH6e + 0fiKuWtFYzovc84C4AHVuPXNz2Dq/wAvqo3yl6T8eX208x7Xdm/nez5gD1Q9Y/zefzjfxp+QX5W+dZ/y + 7/MLyl5zhL8ND1COW+RPtSWklYrqMe7wu6j556Hr9MNTgnjPUfb0+18X7I150Orx5x/DLf8Aq8pD4i39 + AdvcQXcEF1bSrPbXMay286GqujgMrKR1BBqM8kIINHm/RsZCQBG4L8L/APnI3zv/AI+/OPznrEM3rabY + 3Z0nRyDVfq1h+4DJ7SOrSf7LPUuxtL+X0kInmRZ953+zk/P/ALT6/wDO9oZZg+kHhHujt9ps/F+j3/OG + HkMeU/yit9euYQmqee7p9TlYj4xaR1htEPtxVpB/xkzjfaXV+NquAcoCvjzP6vg+n+w3Z/5bQDIR6sh4 + v83lH9J+K7/nNf8A8kZf/wDbY07/AIm2D2Z/xwe4p9u/+Mw/1ovzu/5xa/8AJ+/lx/zGXP8A1BXGdj27 + /iWT3D7w+aeyX/Grh95/3JftxqqyPpepJErPK9rMsaICWLFCAABvWueY4/qHvfecwJhKu4v5x89kfmN6 + DZ+VPzUurS1ubDy15ruLC4hSWyuLezvnhkhdQ0bRsiFSpUggjamYktRpgSDKF+8Oxho9dKIMYZCCNqEq + ryRH+Dfzf/6lTzj/ANIOof8ANGR/M6X+dD5hn+R7Q/1PL/pZfqUpvI35sXMZiuPJ3m2eJqFopNPv2U03 + FQYyMI1WmHKcPmGMuz9fIUceQ/5sv1PSPyN8h+f9L/OH8t9Qu/JfmDT7S21+za7vZtNuoo44jIA5d2jA + VeJNST0zC7U1eCelyATiTwnqHaez/Z+qx9oYJSxTAExZMSNr9z9PP+cpf/JBfmP/AMwdt/1G2+cR2F/j + uP3n7i+r+1v/ABlZvcP90H5Afk1/5N/8qf8AwMdC/wC6hBnofaX+K5f6kvuL4t2H/wAaGn/4bD/dB+/2 + eSv0Y/O7/n4H/wAcf8sf+YzVP+TdtnYeyP15fcP0vmn/AAR/7vB75fcHkn/OBf8A5N/zH/4B15/3UNPz + Y+1f+Kx/rj7pOm/4Hn/GhP8A4Uf91B+tmefPsj8Jv+ckP/J5/mZ/22H/AOIJnqnYv+J4/c/PvtR/xp5/ + 6z9Nf+cNv/JBeV/+YzU/+o2XOI9pP8dl7h9wfVfYj/jKx++X+6L6kzRPWuxV2Kvx4tGtk/5zXc3RURH8 + wp1Ut09Rp3EX08ytPfPRZX/JG3+p/ofE4ED2k3/1Y/ft9r9h886fbHYq7FX5U/8AOfRtP+Vh+S1T/e4e + XSbjp/dG7m9L3+0HzvfZO/An3cX6B+x8h/4IvD+bxd/B9nEa/S+7f+cdBKPyO/LL1g4f9CQkc614Etw6 + 9uNKe2cr2zX5zLX859B9mb/kzBf8wPzD/wCcOERvz+8qMyKzR2mqNGSKlT9RmWo8DQkZ3HtGf8Cn7x94 + fKPYgA9q4/dL/cl+0ueaPuiyWWKCKSaaRYYYVLyyuQqqqipZidgAOpwgXsEEgCzyflN+bn/OXX5ged/M + U/lH8oGuNH0SW5+o6Ze6fE0mrao5bgrxHiXiEhpwWNQ/i2/Ed72f7PYMGPxNRRlVm/pj+vzvZ8g7Z9s9 + Vq8xw6K4wugQPXP3dRfQDfz6ILSP+cP/AM+fP/p6z568xW+kSzrzprt/PqGofFuCyx+qor3DShh3Fclk + 9otFp/Tijf8AVAA/R9zDD7Fdqa316iYjf8+RlL7L++3oEH/Pvmdo63P5sRxS1NUi0MyLTt8Rv0P4ZiH2 + vHTF/sv+Ouxj/wADc1vqP9h/x4PlifyL/wAq0/5yG0LyP+lP01/h/wA1aLD+lPQ+ret6kttNX0vUl405 + 0+2emb0ar81oZZarihLbn3jyeRl2f+Q7Whp+Li4ckN6q9weVnv737oZ5a/QD8W/yOVW/5ys0MMAw/wAS + 6uaHfcR3ZB+g56V2p/xmy/qx/Q+F9gf8bkP+GS+6T9pM81fdHYq/Nz/n4R/5SL/t/wD/AHbc7T2Q/wAr + /m/758v/AOCT/wAhv8//AHj6g/5xf9X/AKF+/Lz0Som+o3fpFwSob65cU5AEGleuaLtz/Hsl94+4PWey + d/yVhrnR/wB0X5h/84qm2j/5yC/Lz9IfCn1m+Wj1B9c6fciIHvX1OOdx29f5HJXcPvH6Hyj2QodrYeLv + l8+GVfa/b/PMH3t2KuxV+Qv/ADnSbQ/nPp4tqesvlixGoU/399ZuyK/88+Geh+y1/lDf8418h+l8X/4I + HD/KMa5+HG/fcv0U/XrPPH2h2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV+If8AzkUwn/5yO86jzEZB + Z/pmzjvDWjCyEMCrxNdv3NKZ6f2PtoIcHPhPzs/pfBfaY32vl8XlxC/6tD/ev2x0+Gxt7Cyt9Mjhi02C + 3jj06K3CiFYFUCMRhfh4hQKU2pnmUyTImXPq+744xjECFcIG1cq6V5IvIs35Sf8AOc35j2HmPzfoHkPS + blbmHyVHPLrcsZqv1+74D0T7wxxitOhcg7jO99ltFLFilll/HVe4dfj+h8f9v+1IZ9RDTwNjHfF/WlW3 + wA+19k/84if+s8fl7/29v+6teZzntD/j2T/N/wByHuPYz/jJw/53+7k+ks0r1DsVYX5v/MTyT5E0u71f + zV5lsdJtbNW5RyTKZ5HUbxxQqTJI/wDkqCcydPo82okI44kk/jm4Ot7T02jgZ5piIHnv7gOZPkH4pfnj + +cWr/nP50n8wXayWWiWKta+WNEZqi1ta1q1NjLKRykPyWvFVz0zsvs6Ohw8A3kdye8/qHR8I7f7bydq6 + k5JbRG0Y9w/Wevy5APpr8r/+cOn82fk3qvmDX3fTfPPmWFL3yNDIzJHaQxqWh+sqP+WuvxVB4LxYfFVc + 0mu9o/B1YhDeEdpefu/q/aber7J9ifzPZ8smTbLMXDyHTi/r/YKPPZ8T2d35n/LrzdHcwG48v+bPKWoE + FWHGW3urdyro46EVBVh0IqNwc6aUcepxUfVCQ+YLwcJ5tDqLFxyQl8QQ/b38kPze0j85PJVp5hszHbaz + aBbbzPoytVrW7A3oDv6clC0Z7jb7StnmHanZ0tFmMDyPI94/X3vvfYHbWPtXTDLHaQ2kO6X6jzH6wXsL + KrKVYBlYUZTuCD2Oa53b8FPzy/L9/wAs/wA0fNflZYvS02K6N3oR7Gwuv3sAB78Fbgf8pTnq/Zer/Naa + GTrVH3jn+t+d/aDs09n63Jh/hu4/1TuPly94fb/5Yf8AOSul2H/OMuux3urxQ+ffIGlNpGmWLyBbi4Ep + FvptxChPJ1i9RFk49OBJoGGcxruxZS7QjQ/dzNk9B1kD7+nve+7J9qYQ7GmJS/fYo8IHU3tAjvqxfu83 + 53+SfK975484eW/KVjy+teYtRgshKByMayuBJKfZEqx9hnYarOMGKWQ8ogl800GklrNRDDHnOQHz5n4c + 39B2l6bZ6NpmnaPp0It9P0m1hs7GAdEhgQRxqPkqgZ5FkmZyMpcybPxfpHDijihGERQiAB7hsHy//wA5 + pW8s35E6xJGtUtNU02Wc+CGcRg/8E4Gbz2aIGtHmD9zyft1EnsuRHSUfvr9L8xvyD8zaT5P/ADh8heYd + cuFs9JsdR4X145okKXEUlv6rnsqGQMx8Ac7ftbBLNpckIbkj7t3yn2d1WPS9oYcuQ1ES3PdYIv4W/dLS + 9f0LXFZ9F1qw1hFRZGeyuYrgBH3ViY2bZux755bkxTx/VEj3in6Aw6jFm/u5CXuIP3Pww/Pn8u7v8svz + R80eXZYDHps9y+o+XZeNEk0+6dnh4+Pp7xt/lKc9S7K1g1WmjPrVH3jn+v4vz/7Q9mS7P1uTER6Sbj/V + PL5cveH3P/zib/zkd5Xk8paV+WnnfWIdC1vy+pttA1K+kEVteWdaxRes5CpJEDwCsRyULxqajOW9oOxs + gynPiFxlzA5g+7uPN9A9jvafAcEdLqJCMo7RJ2Eo9BfQjlXUVT73FzbNb/W1uImtSvMXIcGPj/NyrSnv + nJ8Juur6JxirvZ8vfnF/zlf+X35b2NxZ+X7+187eb3VltdLsJlltbd+nK7uIyVUD+RSXPT4a8hvezuwM + +qNzBhDvPM+4fp5PJ9t+2Gk0ETHGRkydADYH9Yj7hv7ub1H8oPzf8r/nH5Xi1/QJfq99b8Yte0GVgbix + uCK8WpTkjUJRwKMPBgyjA7R7OyaLJwT5dD0I/HMO27F7awdq4PEx7EfVHrE/q7j199hi/wDzlL/5IL8x + /wDmDtv+o23zI7C/x3H7z9xcT2t/4ys3uH+6D8gPya/8m/8AlT/4GOhf91CDPQ+0v8Vy/wBSX3F8W7D/ + AONDT/8ADYf7oP3+zyV+jH53f8/A/wDjj/lj/wAxmqf8m7bOw9kfry+4fpfNP+CP/d4PfL7g8k/5wL/8 + m/5j/wDAOvP+6hp+bH2r/wAVj/XH3SdN/wADz/jQn/wo/wC6g/WzPPn2R+FX/OSsMsH56/mUkqFHbVfU + Cn+WSGN0P0qwOep9iG9Hj936X5+9qYkdp57/AJ36A/Q3/nDDzh5Zm/JrTvL/AOm7OLWtCvr8alpks0cc + 6LNO00cnpswYoyyABqUqCOoOch7S6fINWZ8J4SBR+FPpXsNrcJ7Ojj4xxRMrF77mwa7t+b7Izm3t3Yq7 + FX4RfnPqV7o35+fmBq+nTG21DSvN11eWFwvWOaC5Mkbj5MoOeq9mwE9FjjLkYAH4h+fO3MssXamacTUo + 5CR7wbD9jfyi/NLQvzb8l6b5o0iaJbto1i17SVYGSyvAP3kTrWoBO6E/aWhzzjtHQT0eY45cuh7x+Ob7 + b2L2vi7T00c0Dv8AxD+bLqP1d4eoZgu2QOp6np+i6fe6tq17Dp2madC9xfX1w4SOKNBVmZjsABk4QlOQ + jEWS15csMUDOZAiBZJ6PxK/NDzNqn/ORX54u3lm3kmj128t9F8o20goUs4jwSWQdVBJeZ6/ZBPYZ6boc + EezdH6+gMpe/8bDvfB+1tXPt3tP90PqIjAf0R1P2yPc/ajy1oVp5X8u6D5bsN7Ly/p9tp1oSKEx2sSxK + SB3IWpzzTPlOXJKZ5yJPzfddLp46fDDFHlGIiPgKfjv/AM4bf+T98r/8wep/9QUuei+0n+JS94+8Pifs + R/xq4/dL/cl+0eeavubzH86nvYvyg/M6TTy63a+V9VMbR7OB9Vk5lT4hakU38N8zuzADqsV8uIfe6rt0 + yHZ+cx5+HL7i/Nb/AJwXt9Em/N/UZNSWJ9TtvL91J5fEtKiYzQrK0df2xCzj/VLZ2ntSZjSjh5cQv7f0 + vlv/AAP44j2hIy+oQPD77F151fwt+u+eevs6V63releW9I1HXtcvotN0jSbd7nUL6Y0SOKMVJPcnsANy + dhvlmLFLLIQiLJ2DTqM8MGOWTIajEWS/DeHzdJ58/wCcgtL84SIYh5g872N3bwNTlHA19GIYzTaqRhVP + yz1A6f8AL6E4/wCbAj7N/tfAhrTrO1o5z/FlifhxCh8A/dzPK36Dfi5+Rn/rVmh/+BJrH/Jq7z0rtT/j + Nl/Vj+h8M7A/43If15/dJ+0eeavubsVfm5/z8I/8pF/2/wD/ALtudp7If5X/ADf98+X/APBJ/wCQ3+f/ + ALx9Sf8AOLX/AJIL8uP+YO5/6jbjNF27/juT3j7g9b7Jf8ZWH3H/AHRfmH+bvl/WfyJ/P271HToTCljr + MfmbynIQViltZZzPHH7qjBoW8eJzt+z80O0NEAeseGXvqv2vlHbWmydj9qmURylxw7iCbr4bxPufsT5A + 89eX/wAyPKmlebvLV0txp2pxAvFUGW3mAHqW8yj7LxnYj6RUEHPOtXpZ6XKccxuPt8w+2dndoYtfgjmx + G4n5g9QfMMyzGc5IfM/mfQvJuhal5l8yajFpejaTC015eSnYAdFVRuzMdlVQSx2ArluDBPPMQgLJcfV6 + vFpcUsuWXDGIsn8de4dX4N/mx5/uvzP/ADB8y+drmJrZNYuf9As3NTBaQqsVvGabVEaDlTYtU989W7P0 + g0mCOIdBv7+r889sdoy7Q1c8524jsO4DYD5c/N/QFnkj9HOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 + Kvhb/nK7/nGnVvzEu4/zC8hQJdeaILdLbXdBLLG19FCCI5oXchfVRaIVJ+JQKfEtG6nsDtqOmHg5fpvY + 93l7nz/2w9lsmul+Z04vIBUo/wA4DkR5jlXUeY38p+Uf+cj/AM+PyRtLbyfrGmevp+mqIbLRfNNjcRzW + 0Sn7EUgaCXiBsoYsqjZRSmb/AFHY2i15OSJ3PWJG/wB4eQ0XtP2p2REYJxsDlHJE2B5HY+67A6M1m/5y + P/5yb/OVG8v+QfLg0yO+rDLeeXbKYSKrDi3qX9zJIkAr+2DGR/NmKOxuz9F68srr+cR/uRz927nS9p+2 + u1f3emhV7XAH7ZyJEff6fe15+/5xN8xeTfyctNVi02886/mjqnmG0m1mDSYbi+a0sGt7rnDEsSM0hMrR + tLIRSoAGwq7pPaDHn1RjYhiETV0LNjfy2uh+A9o+x2bS9niYicmeUwTwgyqNS2Fc964j+D7P/wCcTdN1 + 7RPyT0DRPMmi6loGpaVe6jEdO1S1ltJgkt09wrCOZUbifV2NOtc5v2gnDJq5ShISBA3BvpXT3Pc+x2LL + h7NhjyxlGUTLaQMTuSeR976SzSvUOxV+KX51flT+aOrfm7+Y2o6X+W/mnUtOv/MF9NY6ha6PeywTRvMx + V45UiKspG4INM9M7M1+mhpccZZIgiI2Mh+t8J7d7H1uXX5pQwZDEzNEQkQd+hp7D/wA49/8AOIfmPUNd + sfNn5r6Q2i+X9LkS5svLFzxNzfyoaoLiIE+nECKsr/E32ePE1zXdr+0OOMDj05uR69B7u8u69m/YvNPK + M2sjwwG4iecj5joO+9zyqn6lgAAACgGwAzhH1x8Ff85f/wDOPV35uhT8y/IukS3/AJntRHb+ZNFsYWln + v4BRIp4oowWeWLZWAFWT/U36z2d7YGE+BlNR6E8h5e4/f73zv219mpakfmtPEnINpRAsyHQgDmR9o9z5 + V/JO2/Pf8nPO1n5lsPyp86XWlXFLXzLow0TUAt3ZswLAAw0Eifajbsdvslgd92nLRa3CYHLC+YPENj8+ + Xe8h2DDtTsrUjLHT5TE7SHBL1R+XMcx+q37K2F5HqNjZ38UU8EV7DHPHDdQyW86LIoYLLDKqvGwrQqwB + B2Irnm848JI7u7f7X3DHMTiJCxYvcEH4g7g+RfKX/OVn5BXf5taFY+YvKsUbed/LETxwWrEJ+kLJiXNt + zagDo1WjqabsD9qo3/YHaw0czDJ9EvsPf+t4/wBr/Z2XaeIZcP8Aew6fzo/zfeOY+Pe/I3zD5Y8x+UtR + Ok+aNCv/AC9qYQSix1G3ktpWjLMokVZFUshKkBhsabHPQcOfHmjxY5CQ8jb4zqdJm00+DNAxl3EEfHfp + 5vs//nBPyH+mPPWvefLuANZ+T7L6rprsP+P7UAyFkJH7ECyA/wCuuc37VavgwxxDnI2fcP218nuf+B92 + f4uqnqJDbGKH9aX6o38w/VvOBfYGI+ffJum/mD5O8xeTNXZo7DzBZvbSToAXheoaKZQdi0ciq4B7jMjS + amWmyxyx5xP4HxcLtHQw1unngnykK93cfgd34yedv+cZfzm8l6rcWH+CdS8zWayMLLWNCtpNQhnjBor8 + YFeSOo/ZkUHPSdL23pM8b4xE90jX38/g+Ha/2V7R0kzHwpTHQwBkD8tx8X11/wA4OeSfOflLVfzFk81e + Uta8sx31ppq2UmrWFxZCYxvcFxGZ405FeQrTpXOe9qNVizRx+HOMqJ5EHu7ns/YHQajTZMxzY5QsRrii + Y3z5WH1N+dn5IeWPzq8vJpurN+jNc07k+geZIow81s7faRlJX1InoOSVHYggiuaLsztTJocnFHeJ5jv/ + AGvXdvdgYe1sXBPaY+mXUfrB6h+UXnz/AJxi/OTyHdTJP5SuvMemoxEGtaEj38Lr/M0camaP/Zov053u + k7c0moG0xE90tv2H4F8f7Q9lO0dHI3jM4/zoeofIbj4gPGv8MeZBcC0Pl7UxdncW31Sb1OnL7HCvTfNl + 4+Or4hXvDo/yma+HglfdRew+Rv8AnGb85PPd1BHa+ULvQNPlIMuta6j2FuifzBZV9WQf8Y0bNdqu29Jp + xvMSPdHc/q+Zd32f7K9o6yQAxmI/nT9I+3c/AF+oX5Ef847eWfyTtJ7yG7k13zfqkAg1bXpAY4xHyDmC + 3hDEKnJQamrE9wPhHDdq9sZNcaIqA5D9JL6z7PezOHsmJkDxZCKMv0Ad32/cnP8AzkjpOq67+SXn7SdE + 0y71jVLy0t1s9NsYXuLiUrdwMRHFGGZiACdh0yvsXJHHrMcpEAAnc7DkW72owzzdm5oY4mUiBQAsn1Do + H5YflP8AlP8Amnpv5p/lpqGoflp5qsNPsPNWjXF9fXGjX0UMMMV9C8kkkjwhVVVBJJNANznd9odoaaWm + yAZIEmEv4h3HzfI+x+x9dj12CUsGQAZIEkwkAAJCyTXJ+32eYPvb4Q/5zj8oebfNulfl1H5V8r6v5mks + bvUmvY9Jsp70wiRLcIZBAj8Q3E0r1pnVey+oxYZZPEkI2BzIHf3vnvt9os+px4RhxynRlfCDKuXOg8v/ + AOcKvIHnvyr+aev6h5o8k695b0+byrdW8N9qmm3VnC8zX1i6xrJPGiliqMQAa0BPbM72m1eHNpojHOMj + xjkQeku51PsJ2dqtNrpyy4pwHhkXKJiL4o7WRzfp/nDvrD8+v+csv+cavM/nbXx+ZP5f2a6tqM9rHB5k + 0BWVLiVrdeEVxBzIDn0wEZK8vhXjyqQOu9n+2seCHg5jQvY9N+h+L5v7Y+y2bV5fzWmHFIipR6muRHft + sRz2FW+CG/Jj84EZkP5VebyVJBK6JfsNvAiEg/RnWfylpf8AVYf6YfrfOz2H2gP+Q+X/AEkv1P38zyV+ + jHYq7FX5C+Y/yn88az/zlBc399+XGv6h5O1H8w4JdQ1F9Ju30+XTpNRQzSPN6XpmIxElmrx471pnoeHt + DDDs4AZIiYx7DiF3W213dvi+q7H1OXtoylhmcRzCzwy4THiFm6qq68qZl56/5x1/N/8AI/zPdedfyI1D + UtQ0OQllstPb1dQt4ql/q9xakMLuIEfD8LE/tLUcjjaXtjS6/GMWrAEvPkfMH+E/L3ud2h7M9odkZjn7 + PMjDuG8h5GP8Y+B8x1Y2f+c3Pzz0MfozWPL3l06hAKTPqOm3kFzXpV40u4VB+SDL/wDQxo8nqjKVeRFf + cXF/0e9p4fROELHfGQPy4h9zDNX13/nJf/nJae3006dqmqaHJKrxWFnamw0aMg1V5Zm4xsVrVTLIzfy5 + k48XZ/ZY4rAl3k3L5c/kHBzajtnt8iHDKUO4Dhx/E8vmSe595/8AOOv/ADjNpf5OQt5i124h1zz9fQmK + S8iB+rWETj44bXkAWLftSEAkfCAory5PtjtuWtPBDbGPmfM/qfQ/Zn2Vh2WPFyESzEc+kR3R/Sfht19W + ZoXr35I/84n/AJbfmJ5c/O3y5q3mHyD5j0HS4LTUVn1LUdKu7W3QvaSqgaWWJVBYkAVO5z0Ht/W4Mujl + GGSJNjYEE8/e+Nex/ZerwdpQnlwzjECW5jID6T1Ifrdnnz7KoXVrb31rc2V5ClzaXkTwXVvIKpJHIpV1 + YdwQSDhjIxII5hjOAnExkLB2L8hPzS/5xx/ND8l/N/8Ai38tIdU1by/ZXBu9B13SQ0t9p4Nf3VzFHV6K + pKl+JR1+1SpXPQ9B2zp9di8PPQkRRB5H3fq5h8X7X9mNb2TqPG0olKANxlHeUfKQG/x5Ec+5NdK/5zl/ + OLTrYabqeh+X9a1GICJby4tLiG4aTp+9jgnjQkmmyouQyey2lkeKMpAe8V9o/W24fb/tCA4ZwhKXeQQf + iAQPkAmEOj/85K/85W39la+aPW8q+QEnWeaZ7R7LTYwP24YHIlu3AJ4cnYA/tpucgcnZ/ZEScfqye+5f + E8o/jYtscHbPtJMDNcMN3y4YfAc5nu3PvCQ/mR+RfmTyB+d2iH8v/IXmTVvKOhzaDd22qWWnXV9Ez2yQ + fWHeWKIoXaSNncV6k9Btlui7Vx6jRy8bJETPEKJA53XVx+1PZ/Nou0o/lsM5Y4mBsRMhtV7gVdiy/XvP + PH2h+SP5N/lt+Yml/wDOS+j69qfkHzHp2hxeYNVml1m60q7htFjkjugjmd4ggViwoa0NRnoPaWtwT7PM + I5ImXCNgRfTpb412H2Xq8fbMck8MxDjkbMZAcpdap+t2efPsrsVfAH/Oc/kzzh5u/wCVXf4U8qax5n/R + /wCm/r/6Jsbi99D1fqHp+r6CPw58G4160NOmdb7LanFh8XxJiN8NWQP53e+c/wDBA0Oo1PgeDjlOuO+G + JlV8FXQNXT6Q/wCcbtJ1XQvyS8g6TremXej6pZ2lwt5pt9C9vcRFrudgJIpArKSCDuOmabtrJHJrMkok + EEjcbjkHp/ZfDPD2bhhkiYyANgiiPUehVvzu/JLy5+dXlpdL1Nv0drum85PLnmJE5yWsrgclZajnFJxH + Na9gQQQDg7M7TyaHJxR3ieY7/wBrLt7sHD2th4J7TH0y7j+kHqH5mP5K/wCckv8AnGjWru/0K21K2sJC + BcavpMR1HSbuNSQpnjKOq9SB6qK4qeNOudsNT2f2pACZF9x9Mh7v2bPlR0PbHYGQyxiQHfEcUJe8V/ug + D3Mth/5zn/Olo1sV0HyvcXZBjE31C9M5bx4Lehajw4fRmOfZbSc+KVe8fqc2P/BA7Rrh4MZP9WV/7r9C + L0/8uP8AnJP/AJyc1WyvPzBu77y95PglEguNRg+pWsS9K2enARtK5UkByKeMmRnrOz+yokYQJT8tz8Zd + Pd9jPH2Z2x7QZBLUkxxj+cOED+rDaz5/7JhH57fkD5m8vfmHeaL+XP5c+ZdV8qadp+nxWep2WmXd4k8o + tozPI88MRR3aQsWp0OwAAoMrsrtbHkwCWbJETJOxIFb7bX3OB7Q+zmbBqzj0uHJLGIxoiMpWaFmwKJvm + /ZvPNn3F2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KqU88N + rBNc3MqQW9ujSzzyEKiIg5MzE7AACpOEAk0ESkIgk7APwK/OPz7L+Zf5lebPOBZjaajetHpEbbFLG3Ah + tlp2PpoC3+UTnrPZukGl08MfUDf3nn9r869t9onX6zJn6E7f1RtH7Ptfrj/zix5D/wABfkz5ZguIfR1X + zKp1/VgdjzvVUwqR1BW3WNSD3Bzz3t7V/mNXIjlH0j4c/tt9l9kezvyXZ2MEeqfrP+dy/wBjT6JzTvTO + xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku + xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku + xV2KuxV2KuxV2KsM/MXzRP5K8iebfN1rax3tz5c0u51CCzlJVJGgQuFYruAadsydHgGfNDGTQkQHB7T1 + Z0mlyZgLMIk17n5O/ml/zl/+Yf5leXbrypDp9h5U0bU4zFrP1EySXF1EftQmWQ/DGw2YKoJ6FuJIzv8A + QezuDS5BkJMiOV8h+18d7X9tdXr8JwgCETzq7I7rPT8XTD/+cdPyY1L83vPNhFPZyf4N0KeO6816iRSP + 0lPJbVW6F5yONBuFq3bMjtntKOjwmj6ztEfp+DhezPYc+09SAR+6ibmfL+b75fdu/cNESNEjjRY441Cx + xqKBQNgAB0Azy8m33wAAUF2KXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX + Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX + Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXkn59f+SW/NH/AMBvUP8Aky2bDsn/ABvF/WH3um9o + v+M7P/Ul9z8L/Lv1D9K236S/Rv1So9X9LfXvqlKj+8/Rv+kUp/J296Z6lm4uE8N35Vf+y2fn/TcPiDj4 + a/pcVf7D1fJ+3n/OPP1X/lWWmfUv8G/VPrE31f8AwN9a/RvH4aep9d/0j1/9+ep8XSueY9sX+YN8d/06 + 4vs2rup969muH8lHh8KrP91fD8eL1cXfe72/NW792KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV + 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV//2Q== + + + + + R0lGODlhIgHIAPMPAP///5n//5nM/2bM/2aZ/2ZmzDOZ/zNm/zNmzAAAAAAAAAAAAAAAAAAAAAAAAAAA + ACH/C05FVFNDQVBFMi4wAwEAAAAh/h1HaWZCdWlsZGVyIDAuNSBieSBZdmVzIFBpZ3VldAAh+QQJBQAA + ACwAAAAAIgHIAAAE/hDISau9OOvNu/9g2AVkKZ5oqq5s675wHAjCYNsCGe987//AYGg2IBiNhiQhJ2w6 + n9Bok7jMkWpJwyAg7Xq/4PCMsLWMk+Wwei3UsX0CMhcTR8/fTzeeFycPBHswAUV3dFmAgUF9OIkvA1ol + NI0scYgaAQR2kz2PW1eWmycCBqAAkqEiY6UXg0qFqJSkFaewHwEGBGYDtSCDBK+sAggHsrwrt7kVg8Ye + AQfJFWnMl4QdwsSr07bPF9LarNzKv98ZvsBm18Xkvbhm4+tmBgilcfCsj9nKAwhJ+fas8uhB+zfh0bw5 + o/yRa7Vrg4AD/NQR3GCQiSmJEzEZOPAsU8OJ/RNGYRQX8R3IS5k4Ivl4EkCrQy0naFyCAVPEkTH1ZcF5 + ssS5jCKX6IiEYJirnBx8Il1a7pGSPwQKFL1Jk6nVq0Oc7tyKyyLWr2BrauXa9WfYs1ipbBWKtq1blzNo + 0DD7tq7du3gJxqWbt++/GS69+R1M0FINwogLzyGTuPG6QXX4Op7caJDgunspaz5hmVabMl43i0bpaW6T + PyFHq85QhILnH61dKlytGdmsKV0v0x5tWyZLIJYl75484IAl1MNb6LG6HAqmZ0VMJkexCDnSGtFn+3ip + e/oHfJG0k5tLopMX4d41JJwlftrr9emN9aawrOXlTOjjr5lPofvC3xL+EHBAfjz41Jx+8QwkASYEwsKg + BQI26MIVN+AQGoL0BTSLggRVFRI/ErJwhhJHkHEhhgBUhBBP8MA3Az8ABvGSieHRiCJ9KXWkBVKPGMER + LiGqMOOJvpyI4Ev9MCWSJnk45aEuT94I14ExKRXFkkbKJIeUXIp1lENRdtmlRpBwUEmQYqo2CkTiYeJf + mvqteVAHW8LZpZxZ4vimnd7JuedFf/I5nEhFadcJmoJORiYC0lkgUnuJ0rYkoz/V0Wik+pEJ0UFcRJIJ + KYhi6lgdSWxawBJFZBHoapkJOiJZqoaKChGmTQGarKq9StaqC8kRlxPWQXpkHzvZyFRsErzmQ2z9gIka + l1xUtsSfKbihiquoC7XjmxPBYVtTrTwaV5Cw3m5361K3QGfEtXhFO0mwTHHHrl3YGUEuGEYseK82895F + 3gw7Ophbv+U28R6Le3RbMDP3GUDwkQayGiN+C5tBRIXg1nYpxRXLRCouJf7xMFJRCuNwxws6KfInxlLm + oskxejskMEWOHFOPAhJzqcxO+lOkaEuWmbDNqGC5gZtES2vCHtXtC8+MklWCcgrgled0r0yqx9bUIcAX + 0tXa4DlCnVw3oy19MeckdlJkl51UONEkjQeekiHtttkcPogVoX+OwmvZt8yzIViEikuR0HdzoGKyCEv7 + KaXqJZn42BvpmP72dVlAfoGlcsOJZOM5aVqoCVd8mufkrCyN1sdTnVrDp4ijXtvHsMbOasYF68rV39/E + JbIMgAzSOW+04/K7VeRV84Jhl2P7LHl7g8LY8os1L/tJpXCsHFQny94qj4Vovz3vzp973UcPWX891Yah + a0QRxAx/N7NgO+gU+evbMnBa+QNng/z9C6AAb2QgAA4QKNi5gRUOSBkqlCgLW2MgYqjwr9dlTYJ9GcNl + RoS/AbprInHwD6k6+BcDeqFpSDGHQ2ByFhTyCBKfUFuY3HHBqxwqhjHxWrLqlwhVJMVJJgSDDk3Bw0BM + KzDSUp5DjFLEWhyxPiBxBodSFET/7cxRTP38ihS7UcUfbFEcXTTXFemTjiYKLG9j7J2GXDPFp+HjhxEx + 46zWGJI2wmNxF5EjGxhiJohIDit4HKJecrQStf2RFQQoSRiloBGVeCSFY9EjHmaSD5uwECyfk6QRVVel + oCyQKEYBUlushMGUQRAqUikKBDVZyseMBVYRbGW7XrmW08lylBYsli1v+ZZPQIuXwAymc3AnTL8ARnjF + RAzzkkkYi0yPmRnk3iKh2cP/ZZCY1MSM+V7QGVZmEzbt46avsPnNRNAPBsgiYjnPWAN2Tcub65SBNbl5 + NiTGsy3FOQ48CzTNPPQzIwIiw7pq4cLzZSc+8qpF1X6lNivwEaHG/Riisv5xsH267Ynqm0bD/umqehaE + o9yc2IAgRspJetQlaeTXxkbqHQphbJdRCJxAYlIyELX0YyVq2RoCCbqwFeNFAUvOjFYWF52KgZCPzAnO + fpTSBvaMZkWAKbciqaSdkDAvQ2rKDMFQ0hRyclCHoIvd7pnEL2nNomRl5Kf6Fsu02mNtR2ubW1u0kTlx + QK5zHU9ddznWvNIVIn2znV99Kg/BHe6qg93P49L4qMS+NXNX5Jxjn/apTX2ydP0A6WSpAztToQp2iJ0Q + OTd7tOLtqp/IlKotajBaXupuK6F1AbzEWRq0dmwMsDOeaoNwTkcMZKLJfN4C34CMdtJTQbb9JS01YiuT + ekIxrd9TquFSlNyLbrNKGxFoU7ejWXyGE5I1dEK9tmqnfMnmKmGsYFAjVVzmJqai5XNvYjaqXC9GzH8X + EF99J3QxBe42FRvr3n5FC7ucHo8HNRXwgI+hMofSwKjL+ynMFrw9JRApqiNbqs66C8ysioW8sYiV5zgs + 3kvWBK/c/KqUCqpFIJoJxOtbqHXSstaotTWAEq2uGuBKGhJvBqOE2+vY5MteuPXHx3zYa91QvL4nbrcw + SUBAYImcKJkO7iuFM5Rg+8dTHR81yow9pAeRut69QbZSmXjy5DKJFtFxqlMj+m/iuko42LXusyKmMC9e + uzsARlfPqVowrVX9HDwql4MGB6am7iAMhGUazApKzKZwPwiH6j2aAs8E9ISkabAK6Deef5bRPIXgjU+X + M7VIbsFhknWAjBZztqF7n4AUfM/egnfL62xvqgWRWIVp+tfriAAAIfkECQUAAAAsAAAAACIByAAABP4Q + yEmrvTjrfUPgYCiOojAMmkAYxvCRcCzH3mzfskqcAu7/nQHhlRGwDD2gcnnR8ZhQ26DlCQyS0WxIhc0E + VlSteDZ1ea7jNMbYBQja6nGAy7GyhvF8Cll569UBLBZWf2lWeBtzCAd8hY6BBoMojlqBBBculFmHRCmL + jZp5lpidoUCjFV+lpj6cdQKfcKybB5epiLM/gQhtKrlKdrKpAwgswr/ABrx9tsg+U7wvbM6tZRywxQTH + 1M/KAtKg3DNfBgcIBCuT4jZG4YMExQa468Ar5ugt9Dd2R9v6dSu0YfgSz92/akcMHiRRZdXCEHPufKvh + ARsjeQ4f2miosWMhfv3yrhAogOCTRI8oU6YEmbCltowqY8pExrKlvG8zc+p0NkdIQnQ4dwodaqrimzcw + iSpdyrSp05hzgj6dSrVVDytJq2rd2mSCCa5gw655sUOsWbNWVBjIerbtUiuZ3EqIylau3SVw/cTB6qbu + 3b8bd3xAqgaNBH+AE8sQQkHvGHRzESueDFFeH0A341LeLAPVXHVyTvjlTNrCgANYDJeOUoNq648EagmZ + txqIE9VLTcyWDIWf5tpApkxMyxTpmXyPgEOZ1ph3R8eHFSr3CEmS0t8SWIyeLi5ALVJDCVlYsZ1Jw9fc + R3hvNkFVeNoAyH/seYKH1PQgdvViv1Ng42Ll/lkFhjzooHNFgMpBExRzQzGnCHKiTMHCgUYBhWBt5BxQ + SzpMTYHOJ/CJwY9/w7yEX34SGuNUOxNeOI6EJEoS44kacPSUjXqweN872NHo44t3sEXHj0SOA0aPFnDh + YpE+GmGOZF8gyeSUa5SzDEBSUqmlV1bu2IFgW4bZhJVZclmmmEy2UxJiZSyJJoZgnJNUO869SSOLcq4R + kJt2rkaOldF8UIVaSPDZZ2mEAlqANj61qCVdh0Y2oE1HnDlTT4QBkomXaM4xqU2WyhSlUYaCoFqdRXrq + 0oFPMeYVqmTYMkekqRxlHFWWNYYZo6XSKmqun+0lmq+JZNohahPgRmxR/XhwuhMkO6DTq1voHXSqU3aA + +aNuQD3k6qw3pmlGRKDRY4kJ0y77B3RuSEcNXOmqq0eP2slbx3nTiVdBbPH+WFF99vXblHv7HiDwiare + UeAOzio2Iyxr2StJpcO9wfDBRDkIcbkSj+jlIQ0D5mFsjISorscaCAGrWSyGwRPG+uiYiLal4fjLbSuL + CqOQM0q8WKFn5KzSn5Yq6TM77rC7YpdsjXp0Z4IMo5WTV84c6tODfGcazMhQHfJcNGMtwnrvcH0zCwgU + 7bLYY3vDzNQrrMlBm2yToCA4QqP0Z55FqFi3evZsCGFVeJqslsl/e5GiuwODYU6gAAwKxteJd1D+hViJ + Pr6oCQNeXflfCVNaqdkDG+tz6JR6PvQbrAJzlep2ejrpxTcaJ8S0WHzFdlRHVVtcF2XZRhbHnz/VxgrA + iBRx8ZGbfl0n8p0yLPN8UR6T7m4cQDzzweXeeLT1ch/Ft3kfdMja4puXGemssF88vOnHL//8g+BLv3JR + AUzh/aT1tPCAJuLfZPxnnJ6MToCJ8VSPEgY7/vkuY8HTk6PC8kAI7kBZQnHFHvy2FZw1pU1GyU3P3jHB + qoAwKrlJWvm44SnEjMh9rGDQYVb4rqhRQF/Put0rYlEVz7Rne1ABFgUaqA8NbgAWjKDhQnyYLBgaQohg + c2JoENceJDIuPFD9jBwV9ea2xvAnJ8GoAzE4eKMueuWLOblbdJRIE2scsSQ30Yoa28VGmtjjHBxSCp1q + BI8gaSVDeBxceBZXR54ERBgE6QdXWFJIFl6OKRG5yeUqUpKLbBGSj0TgZ47AsJFUkpON1KTORPcT64ny + j4uzSQBPeRf//WSVrASMUXoXy1raUg+QuuUAXydFXR4kd0D0JcuGJ0xZKq+XxTTX9OSSy2TapXrpykso + nSmGa50CTM6j5jog0zwluGqG2jTf+k4BxWmG0zzLbIUQcXjOrZwmNeZkDTLnk6rYROuSufBgU7g1Qu74 + Zp52AxpxcjMcN/pLIzJ0Qzw1wa6EOrM6Uv0jCr2Wp02ybW2QF4gekc4DUC9o7Yb41AjBKKBRhNGnPtks + ihkPg8aZPAxAPgrd/1qXizk6NCcaK0Yw/ZQiCkXFQr/IkOB2GpORgaijl4KRLECG1B8mZKExTAgRQadU + xfVTEzbDZAWVo6OkOK2dRHnhNa4K1qEdiWemLOtCvJafsKlVJmzFUlPf6gOvNc2tdE0J1dQ21bx2DW1V + ywDd/AqVOFFxj4SF6xH4lqQ9JVZUjlsTRSoyubk+dgaZK8nmGoU+SjTzsupJFCn7mrzBRNMEKbUl6kDV + VGvqQjCfFeZqaTcL8nmTPUqTra0mQpNxAqGcoC1KOnHgQ3a2M7YS/UWWBDAYTveklYshkZZnLSsW177F + Q6Rlxwm6pS7bhosS6KqIICN1ruxypqFXFBP8xDRR6iaTo6HJqMGC25uTBqwS8OEXffGSqJk+lwQvpeh+ + idvTiqmApkvI6XgH3BmlroKp4yOQhjDCYAKfRLBkvUHLzFsz9+ZBZnzk8EAyKSZ9otKPR8ww94RTBeY2 + roRFgOX8Eprb4jBNrg604Q+n1qW2inhZFq3Aj/9hVxzfL8jtCSlO0cZXD2NopW5oqQiVEVgMDPZ+Nk1v + Bg07JzLST6j4IGrGFms4xyKQkWD50+N4KzljONmfJO7ggDTHqM69ucIDEa3ohvyK/+K5Vp97agmfixW5 + QXuBdX52oA5+guA0ABMQtlOyKHl3q3UR09HAE/Of1XNMNRwvEm9FroiGq4XflPSc0NynOgSgvbdaN6wG + AsOd7eRdSPrE0PEr76yBQdj1bvrXwG6F/YJNHdYBjLfENh/nFgbKXSebgBXrqbOBrcAHEwrXSokAACH5 + BAkFAAAALAAAAAAiAcgAAAT+EMhJq7046y2DIdcQcGRpnlgwECMnIIchoHRtlx5oiXfvc4GDjqJq/Y5I + gIoFfBlkyaiUKLQUp1iUBzGjCIbZ8EYFHQ9gZbFaa+BWvut4qC1oCdJyOXngQiCeXXmCGAN0dniDagEE + BgdCjHyJcneIFYt/H0aSkouNjwaRm2tkT5WiWJ0EgZYEmKaneoWlq7BiAbeataiUqrhKAS9ombqbuLnE + yMknpB8DXwV+MU+qytXW19bMpdvTddjf4OGC2twf3uLo6epHwCvbBL3r8vP0OMAC+Of1+/z9/v8A0907 + FrCgwVrAlPA4yLChpEACQjmcSDHLOXgVM2pEouKLAYL9G0OKNLNwZAp8IE2qhNUOZZ4r+lbKPLVIxL08 + zibQmslT0AovO7P8VBK0p9EwOd7oMVfyqFOkH4hIVDSg6dOrUwYcCJQT67iUB2+J8iBkBROvcb4QqFo0 + YESzbak+sYpWKChc+BxGxAtqbN1JiPIeFKzz1V9/SS1NBUiXEdjD9YKAmUC3n4oLBA48VmRsM2QcUVl5 + XrfomGNO7aqyjfm5xhZacA5S8/JndBRgjKbBg+fMdusdhiTcibtveAcni0fJWlvnFj7mvn9P6OQIXt+G + heA5GjZuOWuF8aRrkQWIIqW50X+Qmn1hCXHxKXxVNPZw1pi16eHrp7F+85f3+/4FaEMnd7kQnoAIHnHH + AW4AgV+CEPqwYIP3VRbhhS40wsVmNeWHIYSUIGChFwV+aGKGbWzFQSEjnugigQichQElALr44XkxguSR + jDb2SERuDG4olnO5fedjjx494QcCBajiDnonDnSkJUmWs02L/6jgTI0c8WBkj7hZWQqWiOEnZRxdAcAl + hmG+01tFQwm3Zg9DJTRle/mg5KE8iem0lJN73slQnwq9VFWgUbo0kVZczSmooSN8CdAiZcGD6FNirZOm + o3zKQmZrb8HDqSh1jsonhnruIRBTlz5KDGHCGVaNlq26qktjH9m6TGfwXWZBZrV+6JxqqwWrUWm/5qqr + Bv1tfrAbdL+xJ1xty2awXm/OffHmZ8YR9Udy1SrUzTHuGUtRdpnFwGO4HXhn7QqmmnReicpkKu8sYHX4 + G33VqMXWSP0ZGC+7FLCI18DzEEjmf+ba2q1OCK8zIYD6EnwDoe2GNLFnD1o8YBU7NPzNxg5+6nF7IP8o + MjYTLkzvycvQ8cZk5ilJYQYGw1xDIRvGGrE6MK77Rnk688dIdZCMhKPQwjHCdNFAkCerQwQG2dwvbUoK + 9RjyyZubhkw6+bXJW2PVrJgv96qox2eXQzY/+BwqRUJXwIzb181oPameKxgLEbjs3pOPveatslYUFwFe + tnkVnNalRyubeKZDTTne/uXb4cIU+auhCHCA4osnselEi6yV2dOhR4ERURSRgnnqrrF6LOyxvE777bjD + 3tnmuc8XN7FX995aO89+faDwdRGfakS52Y78RrjR1abzwhPekLYpJUk9Yrwj42+aYfXN7Hk/y/N9+dcU + 0lxH10ubQvPdV6P+wdcHhj4yuL0X8EYPyxlWaFIJH+poE4P7gQNjhTKIZEIQv0EsgQTAQIMBv4FAAGzv + GghEVkGWwKEXFBB6AJzOAOnxmpmFb2oKkSAIb6Ymmv2DZ+fo36RY1AdMTPAbMDzEDRFytE+ArjhEex8m + RqjAHlrnh/vQxg51kYqiXMI+IlHifLo2KF6s7xfB/ZAGERvCr+cpphTMIQA0hGEOL3qFHFY6nhmdgsZ3 + 6G2NMiHeO9QIR7MJbm11zKMeWYLHPaKFbhf0Y0X+Jsi6XMSFhTRKRyyXyKvQio19bORRNDe3iERSkugY + XRI6dBNMyqNUUYiTmpboSVTIjiMhVFMpSSO3TYbQV6uUCaMoQ8opWI90DTxWI0y3xVfxBnwMCZX7AuS6 + XP7AYNnSi02AcR0IGVNB9gsmbFAoyAwicR64eqbFFhgyBSYHWGziVTZSqYReAk1ojCRmalRzSZbIzAuI + 7If7nKDNKhrvWdtCRg59FswyRLCZxFwOtu4BLfwZMWnYcdZ2zPlH75ALXvX9fNc2almLeQWSJ+tpi3tm + RUWqdXQ/5KtQRGNpqGn4Z5gkDYjCTvrGlNJjYhDsmEsLAtOSjXSmYSCZSHFKUyW57KI89Z6SVLSBnAU1 + S7nJkQZodFS3lEKpF9jRTZs6NyD54YpEAsRUqYq4ry2pScwb01aJ0lKuWqtKaAOqDyh5m9Wssm3cUKsP + NMkRM7WzmmjN21glAErRgQFWnrxj8PB3SnakkqJmxUErUQkGWOJ0ctghqgURWza2cvF0ZhnpLW1FVy56 + KqLCpKxX+tq6U6SKhsvKwV6QNE3ROnKxLspmYuOwO+VgRjOzRco6i2ULdCort5W8527yOYV5Ugu4bf2d + xkCfQ1zE+RM5yE2uOR5KRySga6F7bWRG34VSJFg0u60DbyLIly+Z2vKjJzofwJbDUjgis5PQg5/AxAsf + GQK2ZgyimHl7Z02Naail+80dNysg13DolFkBxt2ARUhfMbTMP2kT8Dt1Es9+toGFcygwZ4OjJmqqNKkD + ZKoZqeNDpT31aVKFoxQBZlUhYS1JZdUdejVSpSCB9UkRji464Oo2Y0JWxxfLa1x9PIO6TeItDbbR3dwU + Y+/q5Jrq4RtDVZynwQoicUemwOGAjApnpDOnjfvtTH+sHA3jTBNfjqVlg9m5zwW1s2HhzemSLKjV2Ylq + nz2qas2MQa4+ksuAZw40Z7oo6Mj8jp2bLfQBmfcsMDZZ0XyE1/rCmmNI1wt7VtAenSW36SRgekbyVUmi + DaJezw6QmUHU2C9dm4j53QKYbunuj6AUElfDl9TRVOB/omZS/8KG1bQlp2NnuEUPejhLwgZdBAAAIfkE + CQUAAAAsAAAAACIByAAABP4QyEmrvTjrTcMwoCFwZGmeXEAYxHipSOiidG2bXijefF8HwIBvSMQEBKAW + UAIUIBCHpLBIrRqD1qx2yy3lkgMBofCMJmfdtHrNbrs7H538PH3b7/i8vvKd0/eAgYKDREcDKzpKhIuM + jY58RwKSAnWPlpeYmZqbnJ1GkpWeoqOkLyMqoaWqq5ozAgOssbKWlBIEsLO5uoAeYgapu8HCaR4DwMMb + kcfIzJqGoGweQrXN1ZsqxsprYRNo1t+OhxSS2wRM3uDpgywV6FoBLK/L6vR28OYTHtEDxvX+gQMOzOD2 + b8+SagftgSFAYF7BNGJuERT26lCLOzluOXzI5UO2SP0UPyLBZY9jHiTeyOlS2W2HSWv3LOjT1a8CiI0v + Y8W0UFPWzAoEDuDcEgRLTqLs+DTMhcpC0KFVmvCbCu2oFXgIUuLLdXFcDKhFjiBiwZBhGLBWSXzIOgXl + LrcAjsQguS/E2SZizqYNu+IAAoYG6Ob6wPBAlKVtvijic4jaXh99XFLU0XONYncTGj8OaxRZUTtIQGDO + p3Gz6UGKN4oZfbp1NESVMaxG67o2ESR+HWfARtu27xu4s5Lg/bt4l+C6jZQ2ztxKaASxL4zs3by67BVP + WEvwSN26d9Ig/s4Lrf27eQ2hDYi/zqL7ee8qQPhlKySILxHu31u/b2B+gRaH/tiV317a6KeBWH7IER1T + /LCkhjQAJGcgH/z5seAsxFWVxkTlGSjWWCzohYw43XQ4BEPnTDjcJKAMmMlO3VgWz4UqPgRjXIJxUYyL + 5xUoTEADmVijHhBKiGFQtzDEI0cJacKhZ3HQ6FtFDAkJCIlHNLMkRy3mkKMj98gz5EopSXbJjmPSlMoK + W+pXVJOu/UQBm2nSINVUYRj5WFNA/VLnCQgmUdYteqbVVTdf/elFHIFRgleVbQ4Dl1yBKTpcHIfCsdhp + hBEARXuWJoPpaB5kalp6gUU6BJzfpFdoXMu19tkiETWYTmocrBZqFtzhBU58qea66a5DwFViq/0Jl0Ks + /cT2AI8BMn05WW7DMdvsDTdmpqojyG1E3LXOJtUBYs0EJ6UE04EbrrLdbFVueOxmwJ26PaxFjbFaIrJe + BuTR62xff60graQh7GuBL+T6a0NkVvqEyHyOxtUEIq8q7EVn6fDnH4BjnWuxrBUm6PFmPtIbqMjb0lpR + m1lCaPHJYFTMCkilbunKwNdGMgmrwTh4CxXUoPjxP97QWUgYRg8tk4bBVJb0qvyk/F5TMpfySjcH4Ky0 + FU8Ko0KSByS8dRdYNuzJFyOPXciMUhPSttrRpg333HTXncKbdlcXCZ535e2bIYOONazfJEfU5SsCEm6a + WAveJ7fikDCT1zKOv/3+CM8rmTWRLjUf6Ko6tW5OE35AiC6LrsnAZjkhHzjaS89mRmg2JmKVh6s1+MrO + OQjRcn4ITk5EMfsoz/bOVNgXPP7i7yQEH/swASDP0+qJST8u9fuIbcqnw4sSvbtMaK8KVlr5/ny03MOk + Xvmjs4Xu+eN7lOsTon1jb1vwj99X2ALDnj+sMQAVTPYHGK2VgmFeW4GpSBPA/wUDgZ7BGOdCo4QlNKEM + UqDHrCAXrRAQagwYPAMHCcSoBMUDeyPsRGTmMLgU5gRwcmihC62Cl53N8IY4dBvTcrinU4iPhzm5GRA3 + EzQDDtEfvXjaEY+CJpOUbIkv7EfVAPWKHUJxE139K4RGnnjFTJSNCiRCV/e6iIcwKW8D4kIXGVUYNSrc + SE5rrAeQMjNGe6CQSHeE3kJ+yIjQ1RETVFqgcTJyRjz0CiQ9E0mlvpNHHuTOQacr0x8Vly0c7SI6N4lj + PtKoLQZd4Ck9whsjKsknh61JKPAxBJ6saJD1tQN8sTCVE/ykN/4ETkSCuN/7JtlHl1DKiItj1F0iQahG + KidZBfwRWQwjQOZcJhWlmqJlSsjLR6CqkFEUobwEiUfMMUWCxvncgaylSQZlcAOoK+cugOWx2ajzLcmS + 2bfeOQvkVAub9LRmPL1FznxaLTztDJY/Y+GL7HBgXgOdmb74GKH6JZSgBf37IcKM+dCrPCw7FpyYaCha + 0Spo7An/eUXHOHoOaXbUFCBCGS+kyLIGVXNuMJsDPquQxVWVhpVH/FAicLkHoWWpCGHUnSZ11iK3sS0s + nHzpSZ3VRqS6C47v5OJgBELHgRaJpF1QQdgsYkxv/qmm64xSIwOpVN98kRkU7ZL8iGVGrEpKks1qooqi + o8SlvkOUOvpSXe3KmYpQxaR20t5e+QoZWw6Kp1WQZaII60Zhuk4SkNLCpGYJTMYuSpuMkeEQOvUphloW + UKPajWYkSxm3otW0oJHBPOZ5FXAayI+3wpRquOm3Q0ISraoTFmCH9siy0iKe90Ttb4rHGGRRa1kz/VVX + JQGQXE50C7nC/RsnYRVdLphLNQKFHPleiSz1xAsDCOWgLhvq28stdDwOHWF8/JJMcKTHYK9spnqpqQ5g + QSyjgdrt2DaYsbFsTKSJ+6wKQ2Yh7ElVwCiIqYIMfIrmnkASTV1jTIvpBiE+iBydGyqLIvaGoMFSsmj4 + GYKvgjRaQqRP1VXUgYkS4Q1VYrASXop+N3E1dGVtoGBlilmQlOKv4uOnXhNrQtuKkI7KdcRITnJr+avk + s0F4lV5t8ihFOigPzljKb/jQ4YTZYyyfo5+Vi2OUWTE5fuVWg10GmubKG4gMf0IGoFvzMFoXBNMRlLbg + yW416Fw6Nu+htxNkxDMTZIuslPi5jLwrLoM8i670ISTRcOCc9SjgYLcxb37Cg8mkO4mhTVN30d5y3qHd + 5ulS6sSV4/hw/ByII0drCdXtuuT68Ddqe6wVPfRj9SzGmzudELB/8PwfDM6JkF8vUgMRAAAh+QQJBQAA + ACwAAAAAIgHIAAAE/hDISau9OOvNu/9gqAXCQBgoSgiB6L5wLM90bd92QAo8i//AoHBILBqPyKRyycTt + Ws2odEqtVkiAwABq7Xq/4JhgUgqbz2i0D0AYpN/w+FIrOHHl+Lx+pt3uh09/goNCfTxJWi1rhIyNLwFt + Ojx3QwNjEpeOmpsbJhSHRp5ZmZylpgEGBBWkgKkllKaxjaiqE1pIfbCyu4MDB5mWvHE6whTETZAHbQQE + usVddW3BvCUmK8gDKH7PZtkskqyckzrZbsjcagasoKXsmOro8Ry0Frem2xR28vsX9Bb4muxVIHDA2REd + CA3yI+LPWLNSkGARVFiIxICLFyctVIIKwbpa/aWufUJggCIQEidUMGNmyeRGG9k8QhEAzxTNSyRImkOU + LVVLcG0WvQR04oCyEzvvpSJ4IJXLG1pUCJWgZcXToTGipgjXLoUBgEa0iuxngivWHwmfpV1CE8XUK5HO + ymUk1mQds3PzvoGkza5VvYDl0DzgsQMksIETgxkss0NcxZAXGyD8tt7jyJirMEZsgSbnzKCTtEVQuNPX + q6FTQ02J4GGGtnhVyw7S1kBrZ3Wczt4dNiVhmS0Q5laHmrdxEcMnky6wwkSKz8dHVY6+AaXX68+L77Go + 8aCf6dQzWMeeXdhhcEimAYgdHgPKlCpaFhOFiT3MWljai9jR45j5VKv+HOQKdPoB1lAWSTF0kXYF9tPd + Lr4AY1+DYCSyHoN4oKKMNRgm5p8c6k1IiFYEqlYNMyJawQxVKY5Y4DgkfCUHLa9QKIw769UERy42CoOY + Pj3SkNCHoQmUT0lBZmURRpaA56FrR3YY5HhLrSRfaGNhQpKUNor10w5BcRnPTSzqlKQLYr1VlZN6ZcOM + UbqdCUKa4pWVWm2nhUHkmFtVd1lma30RTUb71MXBXXKGQhw5LTrCV54b3CVmohqQ+UmjjDA24XmUBnEg + VQneqNymf3aagzIXlCjOqCZxaqoTAMI1qWAoIKCqZ7O+aottH/Fp2y8clJOrrhLEtIal3Dx6W6X9bhHr + RFFHyShPbctekBuUztagVbOF+kbaN8GNx2a2aCK0UXKkIcBcCfCpSu5sVJLX13GBvGtMcuS5SxcPV+Yw + hoX23gtffOM6Mo4Jw2ZSRsBX9DAON+60ccMaEjMsFytACmlJxha796AsAHHMx4Idj/DdsGEsvN4BoZZc + RIi8QLJMUyi7HCx+mOpBYs02Vzcgz2YA3XN1JA9t9NFIVxRo0vTyy+Q3TO9m0UrMpPBX1KlNDSO782IN + aB2Ijaev1+4J7QXYBg039ilmn82SeqcgHGmf+wwKt1JboBcLon52jY6wetukY32n8G2yCm1Ltk7Oe8Vq + TMt0yX0oAk0x/v7Hpwieguo/ic8heaSUD27e5hWsPQzptmDr6OfiCRC65ds5nnrnHPG6CkibRGWfFiSJ + HrPtn+C+ibEz+T5LOYcSxi03xL8DOxp8GVU15I3ANgIBvatuHrTT77Kt8QGdkKVDvYMfc0/Le2+u921Z + FW5OocdZ6Ppku4d+UAQUkK7Vz9dfzPfyupr/FAPA6whwgATkmlcOiMDIgKM/DYygBNNQrwmCBgsAsyBm + FEY9DeaFYh30oFzoIDIRBoZHc6mgCT10MidkpH8rpALMchAJFcYwD6LITw3osx4Y3pAJNDLdCGS3nh9e + rmjakp2RjDiUCE3gbnuhnRX2ZJxkLEN7Z/2wmw/VcBEUtWdnIFrUDnYBI+R9MQ/IIpxN1mG+G2JuiZr4 + EZKYaAwiFkuKuGjZRAo0JDzOyY4RgYj29kgdSTCpSX40DPDIIDxNjM91c2wafKgWpi80L0dbFFRNciIt + evUkTEDpVxWiF60QEsJNTJEfb9IEizUl8nB0I6NXhGigT+JlTRWiX8x0aZzaOMlVdDwf4g41vmCeIiW3 + YqAxV0UZw5RqmZvQlEueCU2DsWoe1KxmppRzK0hpM5q1Ko0GhPVNTigLi2RIXzmtWSt0XuuV6yQKCn4D + NeGkpGDxxENyfrMu5/hNCjbMJ5rwJS9aoqWFUCnBx9xI0OsY9Acz/dRWDXH0w/csUJRTyGEmeUjRijoM + al4IYq4+lUmBauyh/VCiKY0Y0FI4sVglJZuF8CkIDV0RnlnAaV4iKgswMuFExTTVikahFilsrZO6EmmS + cJTGV6EwSHLUqTb7WAQ4siGSJq1INTCy0GdJBKtZRUtyKInRGzxyS2H11Ce/xINKAsFSnFxpWvdjy1aW + BWiohBM65woDOtkvqDXAE0qzJtUp+NJPgx0BL3ukxUJ90i8xJZY3EALF7f0TA5JqYFM7KstmYjOx5Hqj + XDWhKWeCNlsBQN0TCyuaayKWtVUE5F4FZ5tuntZZHekVOkYDLNPc1lmXbKplbTNb6zWQlN39m1YKqtUZ + 8cE2Ot+L7I68BZxwDYemSFvatOCTrn6267l8HejACorHlob3EQ2dZXn/9dvq8Au7EYyXT+A7Aw4i4WCz + NSF/HsYWKFSsCBEb7XnRtDGwCgFjBl6meQuBxJfdoYTGnCl437oTAbBsnTw95swSbEyNmqcn7a2fUosq + 0KcO+MQoxsWQUuwop3GViizeEbuoxr8Jx3ge7NqaP0N8Y0+hrR5qs/GUhPyDH2MWmUQ+SJJx0Niess5a + sRzT26TbBcCNcW+Adchl53OawHVlcYXLsi0eyycwQwSQAp7RkzH7OnSIVnONBACPp1AVl7iucm5W7R0h + oudAmnPNQG9uc7Jku+RHLBITcY5cG0HVOyrr6dDrSTQjgrvoIyIVs8qrNCco7WiAcg8psjCue7A3TDd/ + +tJ/9kqn6Sw+s0CifKvWE/o0TZfFmrN99ZQEaZqiynho97j325j+SMO/Hu9o1gGkr7GBiGwDKnsjEQAA + IfkECQUAAAAsAAAAACIByAAABP4QyEmrvTjrzbv/YIgJkzCIaKqubOu+cCxLQiAR56zvfO//wE9gICAY + bMGkcslsLocDpHOqCQhq1Kx2y4VelUMblksum3UBnHj8I5bO8LgcNCBQvkCCHWCd+/9/AQZ7b0CCBCZS + gIuMWocUQ0lQio2VlkoDByQSbpeeGQGUnx6hU2kHOHqio5dFOJ2sGyZ1iE5DBgZRsawDBjWhsLsWV6G3 + OU2rwo0CvhV4yiWbJc3Q1T6CBhaR1gC6FbjJ3OIqAagX3tDbFUbhhsWl42flhBNp7Z72FuzIVgP+/sTi + lRGEQBoNetBq3UFwhIkVI7j0SCRyT2CSXgWRMDMIbaMEK/0Mj0nqhYtiqCt62Fg0ZeQAKiMirfXSg+DA + oIoybg3i+LGOypXISOLiaY0Zrlw4Y+hUeGEIU6CmigF918Sor3Zp0EHdyrVnxIpFiHYdOy5NSbCIkpJd + +4nZgYIdsqplS3eZgbdiK8ity1eZ24wc9vYdPOqv1hFICStuhQsB3A29Di+ePMesAQQE2hnNS7lzGauY + kxW56bm0HMtvM9ooNvqq6ddnWt91XABRnaOSYccNqBvGw6PAg+eu1o+3IV0/e6/4HRz48HRqrCTfAYuz + chHMj+KYLpPeMx91Plq/jv2KeXgrBzkLcigR+ffa1NeL2WMS/PrGx2WSFuw+q3zc/imDTSqZ+afNXFxU + Z9Etahh4hz8pNRIeH+MJg+BriZyUCyPtPedgPN8B4NEi9n3YlWTgmMjDO+gppw4FBBxwoYobnPQPQAF2 + ls86MtLom2wS6UGRck+JyNCMPmojlEnSbYckWSOCtGGSLCyVnFM5LjZTjDYVSCU5JBVZgU/KWZWYPE/u + YpV1gulGVWxC9jdVmGhV+KUMvfwyhJ3QncVBWGneGcKI0XD1V5Z8NCjoD9goaehsFba56IrmWOBhUZBW + JOmkaFQKiZdAGYXApSKeyekOBHFUhKFGODZeZIGeCtllYxA6FUShabCZrPW19NKUjzYGqjNGDMvrDDoN + RRZq/a6WwhpEiB5bpVRryZZabSZAZKq0d2bXHG6x1iVduDR62xypu0g3pFIkhMFtja4A5+RK4zpFLg0l + 0PeuNuYRc+8f3+EQwxgC79sZR0YoRcQ+BoMwrkVaMfxCiQ2Tgty/cJhQwgH6VryEgvGkkUqKHlMxYR8C + ObVtycjshK6FLG9Bccw012wzHCxifDNh6t74y84m9hOktmkBbaDQ/vYDrtHwPSQZcy8zTYrOGRc8AkRR + c9MiiHHyeYm9shzldUddCwTrSWMvI6Y2WFPtx9nSjWOriGkD8tB4S7ktx9whWoiLo9aADW9N1EwlHyQd + /3c4BVmTWAdOAhBe9yePWKr+tymLf2Rsuo8HFrlNk+OTeaKX20IrsVrnGdgADBVO7+l3IKQMRrW6LmBk + fzq2E1e0a2S7gC1hBpPcyoJCQOubpxy8HsCmDlzodhcrVhqt/06vUNYHTm1ZRqXlLEiEk7bs9lLHJdR2 + BBTgmE0RQV/+sth/u1Pp7zsv//z1kye0vEXn37R05/GfAAdInPwQUH/tatwBCSMNjS2QPARL3AM9syeJ + TbA3M+PLwy7ooovlBEcclEkDldIgA4ZwFHoQTwwmRAP3nZAMHbpX5QrxwlhksEqLe1ENtaSJCcjJD1tL + Gf24cgoCDfEFrgCIRWYRoaCRRIFTyFMxfugXPeFORUf9hAHfXBiHEM1th035m14kOAoUNQSMoPAU47I4 + kgtY8EM5i8M82MZG9mzujfexkc+i9QTYlUB2wihS5M54NCAFaV1k6B0NsheLKA2SjG5akp5Q0r8u+Ip5 + kCzjII7XpTqKw0pN8Yknq4A9LvrBTFBcDCgxgCU0BfGT5PPPmrCiKDRuJW9/WpstQ9a2XPJxl2qCVFxq + CUyBHGqYqSxmJQ6lKWIqUxyGAcvKnompyzxGA7CiJi+FpZniaZN43Lya+L75SYik5mfPGsooyZkEa9HG + NtpKJrt+yU5SyOZ+8vSNB9lFBHou0FzCWaelRuib6JgQjeaaV4L2gLIXsJBu2v0EoL/MEMMYZM6U9USV + P/41Qz5kcpcbjMd+fIhRAgJIoOyJCC0E+kppgSxkM8mnCpioS1mdrKSVoUKGrNA8aVVUUF5kJKdumCQz + opSdcbyGvmJ0VGrq8R8HLagomJpRMBhyIv4EgSCPVFX2SJI1RUCkDBwZkq4ep32iwJLbtuSScZpVo+3D + Zk1bgMqmQqWloRJbjZyplFjeKYlUTBmdfHlBKQIDp9HzkywqScAtPgovzZRpwxo1xsdeswp8zd8cLbcV + ZgYms/Xb7Kfs2s7GkIoZkjVYqlDX2VZdFgPZXKAiS4VYIOIqedMQ6vvM4hJMjgU0uB0Nbv2XLN2WxZzN + /VrNSaBF2qD5tbVHuRY8l/ZWAd1Tfqm1Z1arK4TrBtSqHs2iurZ7wIdoaxBiBUIDP9qCenXOqf36GRMi + GISAsZe7LqggIX2AsGxUNaRezS4HIrbfb7qLvIxwoIg4VtWXlnNkBf7mTRd0GwGb1GXNZVR1iYrfDnuY + oiz68CevcCOTiNhC2QqSdhB84i5kK2kmoG6LLeG0tLbGwkbDK9kkeOMMO8THPABsbWH43gysCUplEylS + 0Ca3uWpOsVuBW9/8Yrsp2zAsq/vKo1Q15CxQFnGpG249PmfcdIxOh34DJI4dUWRdSe6Wo+sGkNt7ZjHj + o82sJHOXcVbnOePwtat3CpzqasQ6b74O0IDcxWy/yLmeXiByDHGyTGjluz1TgbfCczSVhUo9Ld9yecMr + Sym3qctOG/quo17Qc9PRPT3xAXzss3PIVm3S8y1MfeHb3YxpHL9vMXbXHOq1vFgM7Etni3/ELrYjJJps + ZTsbi1F9diX64K4PRQAAIfkECQUAAAAsAAAAACIByAAABP4QyEmrvTjrzbv/YCiOpBYQQxAIQikOrRS7 + dG3feK7v0kBQLN7FJ1kJj8ikcrkLGH5AppMgSDGv2Kx2OaUEBtevdUsum8+dwWEGQ7vRqrc0UHYeUAQC + Xc6/CvIDbX07VT5UZF8GBmODjUIDiyorM440VZICi3WVnIQGlABBnSSiE5mgo6mqAF0VX6shjBMEBnuw + t5UBd0O2uBmvFgQHvVqSkr7IrE8WJ8TJXnrBtVsqhYEwAs7PnE4IoH/bGYdACNNZK7SKeesw2uGDkN57 + p+8X9KwC5WDnkE/t1X/a1eNG68AdWvsGVoCUx+ATd0cSPcnGzAdFhY0kKkKFMZQiRf2yuPQbd+ELyY59 + jKEseUxLpo0bToRcSbNmCYnRNvzhaLOnTxPpZlrYCfGn0Z+ZDnjrILPo0ac0ky7l0BSqVaNSLwIVerWr + wpcIuAKJ5LUsSrBrOEASa7YtrhOKEOTE8JKn27u3XhqQ6+7PQ7yAk8E1oFRenGrptAZevMpvXAQIClDx + 8ZEt4w+TnF6mge6j58+W34kpJZKO4s06On/2HDpc08xMBIVCjUT1RxSnVxIxZVfHbiO0a7MYHsdnK1NS + JrYOztzVsgnARC5vfgO2TTVselPf9sW0Zu7C8Mzd/ut7H9naRfebHrxQnvR8fsMXTZ4DC0lrV025VL8t + aY/z/rkhhnn9XecMLQQWWIMxxZEXHQXCJKjgCNVcE8h9Do4nAYITRuTYE+vgJqFZJ4VSzogdMjXSP5OI + SN09K+iTYhMj5WZSbpsxJMwBf82IA0523bidXmQN0qBVeuEIHQooeqXSIH+gINtROGm2k49orIVJgAMN + FhpRWJZxD29PZcUUk2FS85wXCSFFmDwdoJnmObtYwF44WWlW1ZxY6AIFNE0iI9WXRfKZ3FSm/OnmXohm + oKWhWMRz0Zg/DcaXBnVB2mdBB2kClV6X2kOLhpomodEnVw1WWDZ0YJJYoKWS8ORVHxYmWRXpFBrrrkV8 + uFplsLplHa9M+brancmwEEiw/cy00B2xmEXpmYs9ZWYSs1HI0Ca0VA13H7aqkIZCDheNy217FXBYHQzq + nkshhgZCaM66yLpbhBVKDlSFKQdsa+8Z6Nl0Ah53gPuvDXn0Wu16Bh+8oHINdxKxwwsuS/HFGGdcD4MT + a7zYJBb+4/GcKxiyzm35jlxfyVSwyjJIHasMFTozqVavzEzF3EdAEDl288Y67wzIlB1da0KStA7NpS+Q + uEz0VyWWFFTQjjS9ZVSoArG0KuikV2WZWZNZ9JrQ+aseqfYgwOPWzxxXNkp+8lL0bjHlszaVZE/wcy55 + s4I2dz7oaXfYxvXdzNiNhqJol01TNYDahFe71zeLDyT+6TyRb5yfTpDBdNTlMmS+Mad5eHqW5xicUE6P + RsFlUOlmM+4Z2/qNypPqH9EO+OzGtUTTCuq4zEqMkLM+s+84h6ARbgQUABmPwSev4Km/TkS19AL3Uz0V + 12MvMK7Tcu/9jAARN/756D81bPodGvEs+x3OsC/8E5ZbOf3bfeFX9/jXNCBg6+ufg/AVsZLBS4AoCdiP + mDQJBOoGCsC5Ad1CoTsH8m0yBnPbbCyIkf/9iGwP4mCO0tKDClKDf284UorsIB4U1iBKF+qJe6I2PYat + QksAqcklqmE68uUlcv/R1zdEJ8JfGC524ZhJu4oYkzotxIVSMFuE0sQxR2jQb1D95AKpljihClnogHLo + BuVWUqJ8zKuLHwoRteQAOgCtBEZmRGL+VuQyFqxRQKRDSE105JC/zTF4zrhRFk2gPSJ+hTWDnFv0UmcR + IyHPf49UENK2kkgmpnAkVqKhJSs1NfuIb5OfehN89gTKo5iJKnIqJVZEqadUqtInYCHU3l75w72QUAOP + oqVx0hEquqBOlzL8SC8r4Bc/ArOD6VjVMRCzkUoeMwsfgkxkJpOrWVYHjM9MjbF+ZU0bPCtlFLqQCdNn + G246kwIKrA4DsanKcvoDnJGC4DjRqaggvnISxDknMyD2wcXNM5vSaZjbQghQfMAzibd8Wja/qU9ThccQ + lf1Uob3S+TsbbmGG/1SQfCplhm8lQo6x2k83UfMfSp3Lg5pS4hkLesJZRUSKw2DpCa0hzqAdLl0rlakS + bKNGgQihjCfSaRjouKU7kitrMeqhUGtTo0BaJGZ85JExl7quRZakkUIg0kiDI1FT5q4opGxCJA0FQ4Uu + TB2ZzKjDcNhA9XVSJ5/sn0ntqUNRnmmr9roiQW2Spzjh1V1xs1ND/cBKVP71pE5c0mCZMCgr6Qp+YiTm + /erKqPTksn9tNGm1eGnMTCHQdZ0C6RuF+bdiLrZ9hVQrLFQFGVYNTzUHPZ9LP5UrW1ETWFTt4DaP5cIA + 5labuTJnn5x1WEwV4rS7/UJHcI2qBPmJ9pqsCtxCveVal+zBXM2lBHZ/G8X9MRanyAUsO01lsdj0gosL + JSBfEyKAfgmVonADRHjCe66E4eOsjy2oSOkrBP7mtbzcDbCAU1HFAa8EZF/sqoGRwbIQocy/C46WRepI + mfxGWD88a9ZbdalgjGSYLhu2Soc9rDT/SfcXk6StlFQLj0/gh8VyuFJMQvwTq+VwtN+AMRxkTEi0gi3H + cDsi3E7Mubu1TshFS6zeICyrCaIYcjq2Yt8AUNwz6HWqvjBa3aCMt8rdVCGRBcJkd+e1xxm5UpOTrG4m + h7kom+Gj9umcIdcMJzfGlzChxdqccWe8XeIZdiZp5t3vbJc6AqxuzhUVtMDGCuaXcO8wxIMeln/HaPwt + j13OK95ELszgQm4vtpw2kqc/E9dQvwV8tym1qRmMz/Gu+tUH8y2sGUxcJs+6A8699Tbsp+u2sSunvV4t + gIXl6mCDwICgrph3RBABACH5BAkFAAAALAAAAAAiAcgAAAT+EMhJq704681rCF0ojmT3lSgWGAcxEASY + znRt35cAD4OA/8CJgAfzBUOBgcEwkB2f0KhI2fz0pNjO8BMQMLMZJ3hMBnqNQnQZLFADzuu4fI5aGSxJ + OrZpWYr1gIFyKwQXfIJAeRYEB39rXFyIklgBLXgxkzgBmBWMjmAfQzw8bZ+ZpykrCG46qDcErAgGplJd + BEsGMLo9tK6+G0qrMnC/M8RdsgNxSbi8oTq8xdImtwcIMF/TKUowBwe5vU/MuQKOSbDh2sXjS27qI17N + 6UHjsBov7u/vkPoz/HHxDOSjsOlQv4MI+9VLp2NgwocQJW1aYjBDw3kRM2rM4sVaOQ79BTFuHEkSR8dV + 1CqWXMnyx8mPG0K2nEmTRjwEKnMwEVmzZ00dBhCgBLbTp9GjFyYG5YQhnkOkUGcGvGYKKNOoWGsqtSYM + BBegAnlmHYsQLAuhBWC9kEe2Vqm2g8zimktR7MEkPZ4eSQICJtwytujSzVlS5lswVyTo/QvF1i1cLvzO + fEGhzRgYErowntOlTSm7CAlVWKyJHOHNqOnlIqhsDF7QqfcennwATeLYR/m+ga1uU4sXV3GTOKHvNmmI + 404L3yCqyDvKADT35C38M7PW0whtWb7ccmWBvXlQ514z563x5G9AIp7eA3YK59sP6jKKlOT2mxzFlw/Y + rK4d9/6RZ09lsqDHnwjsONNZEQYadYwAyRzomhLkJIVPgz5xQwAC3wQnoTgUDmihiO0FVNQp7EUVUIAE + uYChT/9kooMLt+UWIkMkfjgJFV8dN5JSygmBjo4ygleZjxq9lNKLRNZgBx7v9aQkSC42iYhoFgRZ0kvp + yGRlIFi2yGQxJ2n5xolf6qEKK4UcddNQ96CZJh3BwESMUUpRpYFTc4JZzTW3ROnTVB4qdkuhfT5CYTtY + bSVUOV6F8hiLiS4TSVZmcZXWEI/JWemnw8klWF1fdjZmqaIOdioqbYhHjw+6geqkqJGtmkln0b3wIhpD + yKqeZ585qIYLZsiAma9NurGfev09LIvsD6aWJ4azNrz2LD2YULpRr4odIOi1qBhH0yYuMIIouDu2Kd1M + ydmKLrSmuXvru9pYS++9+Oab3nry6stdZ/U54y+99P3X6ZADX+uYdUOwlbCvthAGlpkP09OvINDQMvHF + vqQo1Q41FqarBl3gguRIM5JCkxKQJnHyOw1RSSpSLHMRMspGprGSLYsthNSdir2c3RJQ7jwyBxB+I3RC + T7q3syVZcgzY0cxxmPN0UFdAsT6VtCmmyOdOgIzSuWUtdtihBcWm0VerMIDVS6cNp6Es1TlM2xpdh7RQ + jB5lt2J4511NC4G2xGcYGy6BdmGDY/PtRuwEDvmhA20i/kvfSEUe9z6XtlQyOZGEItQ34GQVY8WaLBoZ + AQWMDtnmqAsX+aigxw7q7HQhbPunBeeu7e5zPuOZ1MAXbzxJ0R7/rGb5KY8sr487nyZMxEp/e7OzWC+r + vYwlr32luv1exxCzfW+UuNC66L35PUG37g3QBc0+nvECsVpl8+PpKrxe55q/lQOozQRutg7igcmAWlEc + cBBoDJDBbhrNyZGVmFElbfDoGVKpQsmipyMG2qRt3tkSKyT3v+HcjzV1c4QfSuikE1Jga/v4lid4tx5X + hOlsHqyFh2YYPPrUp3xXUtto+jeSHEEoe2kKjOL+E40dqe1uD3TFgyKUxEUpqA21/ZrERKzhuMnkghEd + yuGPQhSgc4hPUXOJIpnmAsPl1OMp+EBR58Y1RyutKCYVZCFqfMYcCeqxLUDC0Rn/6KaznNFLhITLlPDY + xkRKxZBdyqMjx3ITM3mhkZNcCVAexQEeZZIseQrb4T5JSVzoKQeHEiMpBeGorkRHUu1Q5SoDkSm0qKVT + mBQHEGcJilQJJpd74cMgR4CXEPKSIL50WCDQp4kq7fKYjplLFhFxrPfZIH5vUCP7OjM8WXqgfqUhojaP + OYj9hROF5DTBM0kSQNuMs4Th86YOfwODHHrMX8z0HIWAaYMIvvND7vunDfVgHSokTDv8lI8xzyRQ/nAP + Web9QWI6b1VDSshQohM9oChGsc5m6gejGaWDEr+4i2GiwIgFCikgEtQyLOouCFPMhko5Q8YRmZQEGrLa + 4mbamJq6zY8mYaM8pzNUOayoF4jcSx2f58Co8HFPQM3fBXGVucdY8qUlBFo2f2bIJf2xaeh0UFeplFDU + 3XCAReUIJMma1g+dNTo73dZZLOmp/K1piFwNytww4Mk//o2hVV3CKZuCOT1uEVAyLaRgEWWVthJJc416 + DFcg9Uol3tR6p4NKLRGwqbXMjKfjSqZQ+3NZ0P6qU6Mqa6hyRbxWqXZ+I1VgaWsAPddY5hyOVRiwKAsQ + YxExCsasnmlXij2OKQukoP1dHyjMmYWKUIunzZstzLAjAG8Nd4C8GtcOzJXbewVUK/vs7r0QKl56XBdK + rz2vetdrw4qydzqu5eg93ws5Tv3ndeWl7/iK0FIr5le/CMoYKj870fluSZJDJDBUDHxgGjX0SlRLyh1V + 1FQvtoyASYrq2RTcvrBY4cG0BCGIRRqzmNyIq6wYMWeI5jSwzSNpJNwZi8P6I7Oh1cVagFvZfguA9GrR + xnD973AirAIYq/jHv20e8oRYGR5HhBk9exvZ6LfXVqzkr1rNm0GrdrkjO1EYgPPyMhpXOJaMMimJK11u + yJxYkaWRXZRTQZpjrM83a2WpyIsHOk4gOqup2al4czas6prVOj9XCMAZwZ1gsIpopi1qVIxuNNM45Tsh + S5qY3OzopTd9POVyur5B/vSWhMBBUR+EeqU2NdeKq+ox+jhvmm51Ksgn3ToI09KkDImnoZBPWdcAmwuN + wnd9fQMXvsE14CQ2DW6oiOW+WtbtxK42IgAAIfkECQUAAAAsAAAAACIByAAABP4QyEmrvTjrzYMh1xBw + ZGmeWDBchDGisBbMc2zfeK6nB1ipr51wFyAEJ4TDcdgJCAZQqECwZFqv2I0HIagIfNkwidClCBAucepr + aBPe7wFVTa/vBgbuS2Ao2/8AfH5nBiuAACpucjRTBIuHkJEWRQYHPS2GknR4b5YfVWqJH3M/A2Sgmqli + om1+qmJ8bYWoYaJkGSq3r7t0NLS8Q76RsX2/RSLAycrLzBS2vxJfrs3U1dahLbMc0tDX3t/gG3wHXCTH + 3eHp6t7jemPI6/Hy4O2kMo7o8/r7kO3wGnz+8RtIcFgbBOU24BFYsKHDWtkQGAHY6qHFi1eISUTFZiLG + j/0gbVCqhJDKCEbZ7IVcyRJgNpIICpAxJYthy15T8t3E+VKWzzY2HTqRozIUsqI7JTnp+VPbx3NOpomR + M0FqUqVfejpC+tCUGatYvCICezVS1CkmV3oAE83O2ic6y8oN9cFZpl5Q4s4FFFXvugEH/FDduxdIIL/p + PPQw5ZGwkBrpBgcCKSqo4xhPGJNl9kaCE7WXh+ScERDcW8uhU1edJsh0XtWwMdhsgTh2LV+1C99Fksa2 + KtJRpHD1jagx79zEdSyVBSfOcNu6qqJBnvyGrUWkvzyqHq2PZ0K7ueN1gzTXc9ickhz4JP6PLbLm2wfy + iToV5KvENhevD1vYsqxS/iT1zDbRyccMHiapoN9DI/EXyCkGMtPaVzfVYw4+ESqz1iThfWRhBxhmCEwA + PYRAXTr1dHOOiCPW9YNxIMWCgIMBncjiY3mwxlZIMgbGwUI23nhHjnt419JIG1FkpJCvUGLJG4UkpRGM + VbVAJZNK4SHLghaNRI4eNZCWUpBYEkGDXGwchJBMT7zkYJlwmpNmU/SRWVZfcRIxJ51v7hPVdsF0YVie + yu35AaAemmSKnYN0SGgMZ43G0hQUOMIEKZY+euM0tAUjR6eaXoHnRwKB+throVph2Hn8PFHVAY6muoxk + XM5ThCNJ9CarNWJ99pSWfe762yjB+imsa8Ueq+yy/cw6hpudzUb4Z3BpRavsUM29BKG1u2I7GrZAQcut + akvZtJxT4/IlroQhXpBmsg3d52EckjG4qDhb4kdvrfIAmd1F0oAY7k7+RgXwktHwG85SCw7Y0oSrMeii + XfZeacEZ6yns58QTqMBgiRbAe00u6GCMMGUgVyCyNSTuWNy6v92rhcka67PhizDbl6MXLvOTSMMDoHHy + Uzub0TM/eLgzX83eJBLrq0IzPU/SpEAcbwtPYnLw0M4QILTFFzl5SZRha1lR2FaCVYTQXFNmdtvxnomR + E+SFSRpC67F3lX/pMsHKVgQUgBDbBfYNJyt01m34o4g3te3ihILr0+OQa5r+HVo5V6755mrlxHm3gq78 + uXiNjh4qpk+bfqOCpqqepwqid+m565EfBS3slNKeFK1+4zOq7iz1KrVsbOUOvFrEknlzVccfiSqObHnc + /I2ACTa8UpkvIy+TRSz2RvaX7hsjFG9cTy6w4A+BICPmW/PtQnGmf+nJxjdU/9LTQ8+hRbPpmr91HJtA + 7JohvQokQX5Hwg0BA/gyoVDpgGUCDrVYZZaiVckihSMEAp8yp2whahdUK1L7mjEhJ6AhdeK5ToIa8cHf + YG1sKJzaB9Sjt9VpiXKeMQUF+fK2EbqvTty7IXx0qD25UcaIQsqPMdr1v9Q4zCU+bOLVBiYOHEpxLx/9 + 0gITr4hFkuxwi1xEkxdVBMYw4ockNEKXGcWYh4RoAEhrLExEwDYfuMXxYbJIkrustME7EjAbX0oLSlrR + Rz+ySxZfYhNNqPib2RnyEOdKHCPtYztVPcGRj3SGoX4yQPUNonciMFgmL7AUrbRQE8JjglgSNso1oKVa + LZqJ8gIYxVZCAnZ2Wh4iYmjL312kegKs5f9WVUhIVgJXdAxFMdHzyV9NEhCZKV+6OjMW0GjiW6Xh1mmW + +TDW2LFbzwtV/7hpSxko0Cgs8F85fzOUCWauCFVo3To1EUkP7tAGGZzOPGOmiBVq554wKCF49klJxZXC + ikJIjyeSSdBaCBEXRP3MAjHUmKrtVShf9+gkLpCYKgDViyVPzEDAwri+GXw0JA3qBje4aLVACPMaWcwo + ObGkyxxelBxcWpEUW2YiPOKUjBodV00bOKmDpDGo2rRgNI62NQT4SCEUzV8Iu/NSls3xF7GoarPEBiVe + 2i+PFuvITA/Xw70BsiRnEhMh48g3Kb1kcIp001gbWodIShKpcgIoXQPFFE5u8DODqusUTjlKux5Krzso + nR1GI7N9RgqW0HxBpuhQv8nulZJskB+n1ElXX9Y1nGooFWcJSkwPZUIAsLpsMJk3tzjkaq7pSqUzo9rZ + 5IFUtRzCK253y1sNnbO3KB0stSwKXIJgqznM/UFscZvWJmwuUrfLtY92qnAu6JqOuA6ZrkizYV3TwJay + 4itbMvOjL0ectCEFu19BRnqPZ4YkvVrdRUvV6zP2QtQN310s/eKrM5cVsCAkIwHNjsTA/xo3ZRToLiUZ + GginfjNeCBZgfh8TYaICuLG4GDBIC8zgxCj1QfZ6sAqiRmA3LpV/RKJqiFGIWhK3ZKr4Y9ALu7q1zawN + vzfhqtbK5hP+NiltKfAaRnNc1iNi17ixOMVJ7ubgGu6krWH826cEh5DkRncgjaMTQq+8jixPTrlcpobk + kjvhMJvplWA2s5qFisk1Azh0ZXazDhQrZ4Kgrs4XziyeL6zgeHh2z0ReEA4PR5BmQJPSd20OA+8MfYfi + +ViAPvAVo3FQ00d7xraTpjTHDLwK0GY6BsCUwHmZdWQGcbN7yIzzw8KLkWgWzj3oG1dJRWmR95HNLH2b + r6WH4c1db26onB7IOLkTAQAh+QQJBQAAACwAAAAAIgHIAAAE/hDISau9OOvNZRhGaAhdaZ5oJojGEKQw + 9YUEiX2DHe987/OB4OtHLF6EQ2NnFRIkjwSXckqtWq/YbGZmIDwxgpp2TC6bz9UAISTdhJ3ouHxOR68O + CJ1G3a77/4CBJ3d5HXxfgomKi3KEcBuHjJKTlFeEfSotiJWcnZ4cTAiFGyCYn6eop2ohCF4aTHqpsrOT + TAatmwBhXbm0vr9zqwZ4eUEAQrsjvcDMzVrJw6IFNQNrbMvOZwECj9mT29Ys4preFds53VkfL+nliuDj + LKbeh9vtVjkTse7v0DQ52IBVo8BtzMBj+/j148bNmMIJXSokpBKgi4B5DzNyqkhAxgAy/TgCahRkTySt + AQd05BvJEoUadiZlVexSzVVLLA49rdT1cEaUmDdhXKw5cdHBbRqBBhXqIsiKjxstYlxKNUZBgiM6hazK + 1ce8EEq7okGSU+yJDxcIHAhrVovTAXDhNmxr4qUFtWzpWoFHg4DfKPf03o0lAIGBvIKVcGnhxGkYgIkz + 2dhmGGpkOVxqIPqg+fIFEH4PHODlOU7mogCqoU5si1yisjdtrY5U2pwQRWGi7GSZOeCb2p1ANP6wmp61 + qQQ7A6+VlWBxZ44C0l6+aKYFtCwdGfpJnVGAAx0tIPcWncP07iTBX7epMdR4CU8Ro79ScZS+8CN3iSpe + Sv58fLf+PLLCc80Ig8srTfz3zhqi+dVCULYceMEu7CkYyGLN3SQMMY0d45Q1gVnoBxJVQUPMNBeF856I + LPrAVzwirFhbSS1O8WI8MvpiD2RGILVOjTbmxgJg/m3UEGdFEqSPZUD2yNCR+ekRhRGPTNnklbGs0WMO + ayR5JSRzKYRJl1vm+OUOP4bIzEX6HMDkmcHpQKBMflUDFpynHDWnTHaaiScgHF3kZSWD/mnGVoYmquii + i5JVKKMt7hgXQI9Cit45fzlIg5qWGorpkefEWGmnnoEzD19+kkrRqIk89spxrG4UqyC5ycUPkm6IsGcz + te7mTX+OufMbJLDeBKw9wmYI3679RooBCQikZaesLswSGsJ1bwKDK5gIjFatTBGZk+0vHH02q2nViFSY + t7yFW0Gq1uI3gV3ObLvHutMqVK45FWoboETyMjNDcR8Ylu+t/yZXDgjFwHewjqWAIopFLTEs4MM6MtjK + GuMCA8seBBjcb08aO9ixttAm6M4qzq5nMMa3pgyzwLfdyoRmxjglymjRBkWiqvSlDBgBBewsQstAeyoz + jMolnSiG4zTt9NMpDin11I3aw9C5WHftdVs0ft2pj/CKLaKcJ5t9ZpVpq30lcWS63ShcXH8SttxPS8Ep + DDhchTdXO317A3dh/r2UXx4I/pm8fhuuoVSD7quP41QhSv6E5Me0Tfl8KKmk+Fh1Axr6SGqAV9PoPvT6 + eSVD+bU6XVyUHYdwQvgK3XARv/3JgBK9jhthM28eg3XiLozIncL3qJ54qI+BXQVxv01WdcvLMHLGiEQf + 6TmTFg5owveVg7QuhjW/MjSZEimIxUPwTl5zlD1Y42KU2uO6+SAPAx7H/IAW8mjXm89pjqAa/G1BZr6T + RGtkp5cB3kA1r6lZTyTYItks4zzJu0xvQDG+DCZGGCt6gwE9yAntmIc7JIyMCYnFwBQqpDwsHKELFRiN + ELpmhnQJhX0y0B8cNtAaEgKDynyYQxEEEWA9I6JZNrSfnH2oCTJUIm7CcSJqqCiKif3bmxTd4g8YtbAI + aXrUOby3xRt0URxfLELgevSTu5VxC11U3x/0ZISDLOuNhnhShy4EOSO4Cz54RFkaZfDH5wWyLmT8VUom + YLtDggwm+vqHX0YIm6StUV+gGSRTiII1OmZEhoJyivySFihNeqZxughe3kzpma8cxpGScJQ6xoUXWEZw + KHFJJBuztxZbXgh9meIRFcZXmFf6ckQpqx835DgF98VPc8d0C7SuljlqEsF/okliNMcyTdRAsAoLxCLp + xNkIXcVwLxRMlOp8Nk3fdNCFtAtCI/VVLDdY04Pu00cCSxgNLWKQhMTzSEtWCDJWAu07AZOAQZmDB3+i + cIYI/V0POcfgHt/c0IX1IUxCX7iG/XCghz5kn8P2SSggBtBhqqTcKhrEv9gYMYAUmmikELgUJhbjBcgA + kUznl86BUlEaVhTVNnlzxnEs9F5aHOpeiipUkJDgR87jhjCjCY5w0CSpVFpSVBuTLqUi5EmVfMYQrJSF + xpHVq3WAmzHLCj0DoPU6ugzaUTEwprW+NYwvtIwA3PRWClxyZXWyxk6B5smYcWywB+1jUvpKwLky9rGQ + vdD0Iks6qXYvrJQVWIoydTSsZtZuKQLVRZr6WW09ZjPJcKzcMAuds1ogtYgFSWybWad5ouykKE1pNtbZ + P00EqxzDyt9FNXIsVPJqWsb9JVdwD0iD2YITuST9Q0DnBU1VdJVb7CLdHz1QXbttV6HOHd513dAt3ZLr + u6kJL9++S68CjReO5Y1uLNmL21RkFGD0EI55BmAw+XoHfPDZ6C9Emkr/0mEGmiuMYd7Z24YVuBwr3dgo + dztEKIhMvYopWUshTFPAUszC5tRQh/XV03rdbDgeUjDP6nurEuNwMUMrWnk3VVqBLS0e96wxKqAmjhzr + eMdVO5qPfywTrcWVyEh2nBuTbOLMYZjJKUAblHc71u5OeSNcsuuVyUW3Bh55y0CQi4EJCEkwg5Fwnu3B + X83sFcaNmQKIQwibf4A5nrhFsXMGQiGt3APL5ZkHnX5j5JuXw1p6UFItUZjk1HjLj9YxeJbXmFo8idNo + 3E34UF3L5x3JA7xB42263DWeBZCn1IgyLxuGnID2tDFZRpnaek8+y8hW7Tzu5TLNIrqvwrxBzPJpA5h/ + meqfCKzp406mmHymczKHs8whz49B+7u0M/xXXhYrppsEdHYZIgAAIfkECQUAAAAsAAAAACIByAAABP4Q + yEmrvTjrzbv/YCiOJCYYByJ0ATEEZSzPdG3feN6dqQBvrZduSCwaj8jcyYAQbk7OpHRKrVplS4SKMzBE + r+CweGxsGZiEn+m8Irvf8LhniVZTAgKCIS3v+/9jZihaPjABh3lsdoCMjY44iWdaCAUEAgN6Z1+PnHg+ + nKAceJlnpaZei6EeAQMDAm1JrDCfqrUVo6enm7ZALoi0R64TsLy8uKYuwMVcBBSvSZgSeMvUnq+F1Kt7 + FcRFAXuXqdnj5BnfzROsUqy75cav4u4DB7DC7vdIsgDK+C0HLgT44ANzSJW9fQPvdEGV0MolTJZARQMw + rWE6iw4LsfLSCVw7jP0gjzxzZqAbIHbxQqocsktPypWMDsl8CTOEOgsEDtCsCQdRq5/weMpokcql0EbH + 9gQM6GrnUQwRnSEw4PTplY17mv5KVtXqsJLSBEwd4LUPVkupWKEt+6FLwAMH9nRlm29h1AtqTdJdU+qj + mIJH6fC75WsvC5l98rg4uPLszjx6DXPq8uJXTUF+h62VrOpEt5EqeWwRVZgzqHMWboYeNPhCadOPAvy7 + kPme6NaEa8PuOZvwXGqidUP5vZsgk8/oVjMZrYEy8eJXuqj44RmmIAQC+UaGLscM3IAca9LBHi9Rdu4x + F7IRKijFdEOIMuFGbxZxYFLuK10ipZu+/3yR/uRiSn/FefLcfyIkJSCBwD10oDkr6IPgEaOQktV85Rio + 1oMXwHLJhLFcAw+HoYAGgAs30IIiiCzOUYFRNbCSCIktjmAgRl/AGGMrNNZokxAYZvOhBAIcQJaP1By0 + 3TgtAPRPj0iKEVBYGGHFYJR/nBOOSlBiGQiPXoYp5phk5jATYGWmWYInP7WCjZpwsrDfUqRsFuedqe03 + Ih6YaNIlnvSNsssxVwJKBJoN5eFXJIW6g2iiTDF2z4Ya4FHKkpAuhmmSJckkaTmQkeZnTV1oZKI71Tmz + aS2jbOoYTKkOs6oqqN1ypKOYOCVWXLMyuY2t/fRWQaNITQTErmBx+euw/X+6Uesd5zGZqyjI9prNs+lE + e+1x3CSXYamiDIAAr41x64y35UhHS6zfhqeBWFMlq5K61MnrqB7f6XGrbeuZQ0C82lrk3T/6NoRVvwOZ + cRdh8drLpXoOJ2xfQpaCgxgiWsQl11EzGVpXKckQUEDGIFvrcY0HC3iGnSfDmXIuLLfs8n7IxCzznb9c + 0+zNPPccaFA+nzyNhEED6uG+RcepIrpJqymjjk3HiZJhN0aNM5DN8gm01V4peUMQlnHdNToV1WDsPiaL + PalHXWKLkNpPTW0DtqrB7eU89aT9184n8R03CgAF7IdibmL0UEB6w2al3zo4F/ZA4SDibpSMD8H+LtqQ + fxax3XMvmw7S5LREFec6yMY0AMSm55pOYp5ZeQxuUyR4MUThNDrlfLa59RvfMEfk6dksvM9Ur3MZIJ1c + xUEvkZsLmSweY1Ful1aeJM87vgRPfo9bOcU1u39nDZZX8SCknDgodDDkY/jmYHL+oRMLHH+NgvWSOuk8 + vfqE8PgrnolwNuufZG7DgtcI0DQEJM39DgiS2+wEbAyETRaEo74IDlAS9OBCBS24l+t8bwnv42CiSkEe + E+jheyLkWCbcoxGKHCNIKRRKgCahnz6NKhC7i2EYFKSyBc4Nazhgx6l0WKkALYh8HfDa3HxRNSJSy0IX + QmISyRbCYXlriE79hJCIHhUItnUOXVXMYk/A9EWFiJEETUwI3ibwqTOGaxZSvEpOAhfHW9QRNko02EJ8 + WILD8c9jEymbwMKwJ8rwTEt8hM6pLucxualJdHd0Y4LORCHQnYh1kqzPQ4ACQ9hpC2qZdNbx6NQUIghP + LLcLpbOmZypFdXIEqYKe9lS5Q7uIz31+4x5cNkbLL61sO3khQvoSiR4urkQwL4HgEDp2J8K1sUp2ecwf + I+g4T1zmf9J8Jdwuh8UR9qCAxLxZ7OrWQNY4xYARNB1tIgkGByqQnV5Sp2+OOQgKhlNmvUMOrCThOww4 + J4bL20fzKJaJEmYAhDocGHgsaTgSCs488P1sHcTCyKoVEqIgMomENknHTBniRws15E9Ee3kVI/Ywjmkk + qRV4qAuURuieHHgFGVVaIWSUcgpHC1EhpqXSsGwxkipiqBKIsaKe8s4VoBTmi1Jp1DvksJIwbY4dkmpU + fWy0FkPah5GaaoE8Jowpcxxp0KZEEYqeZI9iDRoi0xoLrrYvqm6Nq1yRQsm5WkemujOmXR01p6WUjK17 + LZ2eTGVDuAb2L4pKC6MAizPGChOd57ohexz7WE3p8XsVG6hFnGlWP5TKU52NQ6h6Idl5depx/PpMaEU5 + TYWsjLJG4OZqyTBOodKOp08Yl2bXxjRyMklYFDBsLYF3i2qV63TC/TVOb1HIKtxCSLezzZLnpMFcWplL + M/0AFxDERS5l9TMPAwkoI69lyNzGK7p/EO9ujYG9hSYEof4CGGy90d6CUWyiBjthZFrQMPSe1RT+5d38 + JrUEtGAUerrlZf4GnMKDhWxkCQbHYXGlMmRcdcLFqrDFMExgG64sgBxmkjWeGuISHzClJiYwRZKbYjHk + tMX4WBqMszujGWeXxbQisY1jdAkdlw6IOw4iE7vZOA8FGQdnIzKSqXjkMjojFl5sMg3oZtsgzlTKM1ij + BJ5pKL1KzDj/gMh8QxOpAJPBj2bGwOJ4Vk0lA6cylqqyN3wm28xxY72SrG14i8JUmgKXjWNvXpMlcxJR + 1wFqnNUNRe2WGkmf6O7CIMpntwZySuJVISnIu+kjj1OvNDvkeaiUs5lYmVFXBppJ9Z1lupSyy0T/8Jdp + waXL8LvZAdWRfWp2X2O97CgGi+RS9jv1kfX3rtZi+S/YjCmIj01I1oCTrREAACH5BAkFAAAALAAAAAAi + AcgAAAT+EMhJq7046827/2AojmQmGChCBJhAGGspz3Rt33iuf8FrHAiEIMACEF2o4W7JbDqfUCYSBUQU + CIKBzzAoRr9gTUCgDJvPnPEWxW530eDAYECOv8vwfF7d7nO9ek09d3hOdBMCgYpoamsEdICLO1oUdVAE + BBJjkpxxZJ9EnUwBMBWJUKRYb6Ksra4eqRRyX3Krr7dLY4W4JAMHpwCHvMPEFnIsu8WwBAePmJHKrKHK + wgDA0TwDKLbYollaWMWURtfdsOauZERyXMSpWdDo8sqWiAblr7Xx8/y83BIv9vXrt27dwDCzLAQ8yPDI + nIfqGKKKUWGhRH58UGDaCOlik3D9lRAYEOhxGLttQ464wEKyZIkTp8aIHODS3EmQFeSwrJlDGyYEB2C0 + 5ClNGwx8E3QiJfrSzdAz05haOJGE5KCnUjsUZLVyztKaN4e6+Jq1n7YuKssa8fHvwlisaundM0X24gkg + dTU9ghvXJApjNLPeFaJ1b9+DsSy0dTk4mTHDhwmWykmR6eDFpv5Elky4UibBKTprOMt38yttQorALNsj + RWW3SUwTfAEEUzu1VA2o2IfktWx0J2PHbf0jSEojR3w4/t1t6+Epxa2o2oKZuXVlGf04vT5CV2nuO7Jr + r86QzJzvGzYdAx9IPIyOPHUZ0YLeBKLA7PXoAlUfWz0Aj/7gUAYm+RUIRTkW1SAHEv0ZmEtENXGToILn + OchJD8g0yEsWiByAn4UlVZOXPD0404yGIOIyziZgGUVeihgd9SJiMBKlT4045qjjjjYWhCKPQJagy0Ne + RRXkkaNksZFtGi2H5JMyNKKOQ2zMCOWVabiw2BRWYrnHj7hoKRCXYDZX5i1dVXORTlblNqJdmHgV4T3r + qFkeThkQ1+VB2qS0YEmrVfImdmOlYZRvPAWKyKDFkGIAYGvS14EAQM0llaOQShRAMxfs6Y6kHFAaFKPz + bPpZBZ6axCllZy7CZpaVkkriqrIgWqpu5bgQqaViDBBrVqSIJoGuF6FWhqKInRVqEP3CSWWsarw2RFsz + L3xYXrMX9CCSUKxNa5u1DRmFraYv4FnrttFeKm66HjlX0hhNGnREEEFx25e7XjIi7iMuFEAvG+bmK3B6 + 62p3VKsD5xicdjsl7HCWWvTR8MMUp7cfhBVnrPHGQmLM8cdJJYIhyCRbc1/JIA8ILsoULzghyxnfaJ13 + MHO8npMkjEEHzjX3JSIOV9HcM3MryjraqdYYPXS7Mp45GSJLMyezDYlpsnLUUPoCjJ24GBkfwps56oyt + raSpdDHfYHI2eOxA5s8faQGKFrxX7wh2E8gm7dF/1rCLdXhPJ1W3PG2hcPffSQU+Qaq8JFTRAYcf5mPk + USq+/hblUCHKDOaX6kykx67iagrSB5lL6UhIZrckv5yD8OywfvMTqEy3BRkcJCqxfiFtKlTrkk/MBEV2 + jTclo1TrsKy79jC5aWb7oWRpsXx4BvXoNY9upuc24jCGFWrA3Duop1gTh29hY0NdZX6KjRXG+Pp9oZ/G + 9vDnRxUCM57wfv1lIWEcB6Thn4GIsxsNUGV6AkwUGwrolnIhL4HN8UEVjrOOKfAMgqaBThWuoKQqPTBP + oMOgItwzng9i4GatqgXfRAgL6JRwET+7gfpCyMIsMUkj8FEEgciBg3EMC4ECvNhxLtQ0GSoOiDUsyv5O + GDjHJTFKNGSI1haHRBGiECzM/RibCZOyRfDE0CUnWeIM0gY+jRWNKV38YZ1q97F3iBFEfMvbxqY2sLa8 + 7ImN89ETnDiBO+KxFQ753AWjpDnU/fEWqltSDnVgOpGk8ZBaERfudKG2u83udIODpH6gly3p3Q14lRqe + JvfAyRNKTwrbadkjA+Emq9APaNV7mNmGcyjyVbFkpIkbsNhiy1UiKW8rrEn75vdGlmEqJ5mUyDC1V0yU + VY0CzSSG/JjpS9tZbmRSuYxYnGdF0Xmmf6HJSwBr+Lq+3bJrPmBgC8aFwdbUxne4WSDZelPN1CnvXhI0 + TigqqJx6PglfuNnCBqfjwVGahoR+iGYLB2lQT6whoQ/9VI9CJ/UNf1bMPboDAzA4hIo6vKqhJ/zElM4w + INJJ4RoBAmk+6ODHHSDIkCpNTxRHUaEoSAimMT1hDBhqDo5aw0M53cAX2xWnLFoUZGds0TaOCjI3MnUU + QU3eRKNK1ao2RI9WjcyQPne9rIJFSUsCGE+9SqKVTElnBSUrGMXUwKVStavKfCUieKnVp7o0TlxLlijh + xU7L4PWcnehTnQC7iEJpz61lESwR8toPYBJWP4btlUbsispcPXYPf0FmpESJiF9dKrOySCY2TNUpygoJ + VBsQVezaRStomjZnrdXLa7uDWhB6Fo2xvZymvDnXXeVFDre1EW+HZVKz4Apal/2FAzuSSaltJVcU5ZTj + bH5ALTZea7Vr2RZnyUXdb4Hxnu8q11K0xYbnFqUN5m1PLNtFFZbsUyaVstdw1vvE4PCLAP6K71HU+l2D + taF8/NVUwSQ21gCPtoP/LbCBbSLE2S74wTwSGoTRKLLtTrixJ7twooqQUg1/l0Eejk9NpTbTEOdAZyU+ + 8R0cbNCgpfgGQzXxJJAWzBlrIr0aPmIUnCrjUTRRtFQbcY8n8QsqGpPFVEuj2MCB5L39NVFzUJu+3tPk + YsFNPnKroHXjwDLH7i1X2AXpM63mkcLhNKpjlsBUR7iyzX0JoAlLMzYRoznIQcVzEFGwjoKVq+Lyo5Fn + eu7oFla3SIFFN8w9tRTtgAw0SfqJDBkdmDt7t2U+wSB48t0x9KBxPIctDMdwaN6aCdako4G6rnDVFH2j + kD0xyHXIgKzl904NayHRNbUArjVXinNB9en6Fct09ah/fYNpCrvKJr5f/rhJbG+84H9CZXazd+cakhxQ + EhEAACH5BAkFAAAALAAAAAAiAcgAAAT+EMhJq70ykBGCEFgojsAASieprmzrvjDrEUZdb0IQ7zw/EJRP + j/XLpIbIpHIp8nw+HaZUGTAAg9NLlSDgZL/gsHgs3VICAzIA7VW732UoHD44pEzzvH4v8+b4YlUHGwQE + OoCIVIeJK3gojF9oNW2QlS5dP1yWIoVGm1OLn6IiUB0CBmmjZ1ZdoaqvsEtCQQZHqmyusbq7MJQTNLm8 + wjAdxcHDcGgXwMjNLaYD0dFyznMauczV2hgzNoXfJsfbWZpBCAbi48iSVuGmAjjp6kqnJx7nqfPb7Fy5 + aP36wgywQuDAASvyAsLiZ+vMj4YKZdlAldBaxYgATtWAeGbDRYz9L4xtgrfBEUgtAxGSgMfxZMSBOTqY + dDlBw6SELD/SbFavwqydGQ0cQNCyoy+g+sxUUIb01NCiNT0ijRhg0IWjJ50STagB69R9Vixca1oDgVef + FL8GrELU5xWgGhHYITHwrFpnA7eiqDXVpgEEhkhtvLuWhsFCqNRq/Bv4AjyVhJOmHKzW79CtUUzRqKUz + si6RhB+XRYCgAJcfNux6Xq2t28TXN1n3cNJZdhjXsGO7dBKOiYc1qm0nE+2tN81SP2qTmtBFeCUnT6Ls + /Algg6xD1p1rz2MrGxI0j5VvJ0PbpS/v36OJHx/Iz/pYzVEcyMeepkmorQv9OPi+Pq8ia/7g11pKwfk3 + zxatANWfgcLgwuCDEEYoIXvGSDfhhYzwJo07GHaYhweZfOPNHx6WOAaIXMSEom4mthiHVEuJVqCLGS4I + Czx2yWhjMxZmpd9MayU3wmICKkTSNCfVVQx1+rBEgl8z6qPkOxj1FESRvMyAHz876mIlc1juopRDCv1T + kQBy8aVgWEvRp05Vb1EQpZhCrpRmmK1ZZcGcn+nZUZcZ1tkEmgfhWc2YUQGaCFu2wFMmTE8OcI6aOzHq + 1kt/kfjlgXWtNBRlQOWlKaVJGTYIDW7Oo1FRGkzamIKmIpYqpxMZKiYN5YhFwKSkKjhZr1QVc5IHN8S0 + himkHQRZZf3C0rjoZDgQUABpvObq7LU7sJPbiIpiW6K2uQHk7bgxrDiRuOSmSwx01Kjr7rvwnthuvPSO + 8Bsa3dbbYQrx6euvT9jN+m+94KE38L8OClfewQfjm5GibDDJsHb3LdHVO/lOvA2AvykBIAq2arwbK3za + yyZzIm+XcBKIMpXyu3XcEbIePe6WMWEaDJLJzVIcCaSR0RQys8oE8swETEsO/UopkgjcodE99yrxOExu + +vKJJ9fkdDVYGXw1GIhOUPJCsxYE9VcVnk1M1hm8+qbbEphNIzQbzrtoppcqZG1G56i9G3Hf6EciI6Ie + YrU6Vt6TWIv8uONEPJDYdBiqIA1U/ohBy3rIkD8P+a0CuErfONHYRBcbwj+hl9GszTV7SGQ6F3/9bUpw + O7a37BJCiRO6uEuolYCx9z7h7xXBKHyExD9p/PEPalXgKaQzH9po+CkpPYR+AZbOqtcjb4P2GDxWe/cU + bnaZsUtuNjj5BhJ3mWldbJYWIAuz/wlu287Ph8Prf9eF3fZzAf5gEz0pVIwKHnFCAGdDknMZBxEcS53Y + 4jS1BT7jCaV4Dsm6FDYJWnAUK/tO1lz2Qf/1TyExE5sHP8g/z1lDKIQYH3lcyJ4DgoQdBewBJoQ2sU4E + qFJ7YBr0GIagHDavUcAimHpghg10lJBHFWrPMpz4RDGBqG4n/bRY7bxWRVHgJnCQI0ej+tZFst3AcR8I + Y9TsgabFlRGEtDsh6jJmuYIcRIZvfJbpuPGQLyxGf+5qHVlAxY3l+WZ17vLZCj9Du90t8mBIk8kjX6G7 + lfDOglarYJWE0hblGVFjYQPOVH73OUMGEE5XoWEQOZnFpZjSfqEcC1zK8jxALtBSQYjTccoylxFY74mF + 28skQbgZ8IWAe1WU3KncOEjGHEN8qhwX6O5iGdKo6FiiaaUFQXMX4lALfqhhUR5XM8DcfPKC2hzn/ohj + Ts/d65wr4E061Rkg+Z1xnj1jztaYgBw80tMIGBSkGEiUnYEeoaD/hGN4yNAdKib0cwD9vM0SyXAehz60 + Ce7JSj4EMJ+LqsCGVNFPQSzqUQxEcDdFK+mTNqgglcZzoi6NqUxVFsWZRkZD0jCWTZGCosBxa6eVip8Q + wwlPoHoRR/7QUUwF2qRXomAzRR0GU5takmE+y59BIWRTfmTVRExJgRFxkr2gGs09fFWT2shkV2kmVoze + oKzckdpaP8Q2UQYJqyi4E0/rSsI3+UlOcM2CmVRAqCRiBJV7Ciwo/to2xZZBUKcr7Fwjx1e8NghvuXyU + YR0yqclmCLPM0aU6ghkUz76haZ7q7FRIe7hxKFNWm9zsGnb11r7EinKH/ZVprYErjrTKBrsNVK1owk2q + aKQfOv1YUrJqS01EdlFb0ZoWaUZk1Bv+aluXrK5k8scKx2oXbPF7TXa/GywM4pO86GVhRNN7WBA4jL3H + 0Sd8jxOw+aJ0ofYdFkxlU7/8StQEu22hf2+TwPUakF8DBsPHMuLZkyYYFGzzbBG9O9OW7dNi+33w0XpZ + guCOZ6prKWvOYkjhbnLVJTu8HXlSCknOUKlKKurUhzSm1rAi0cMpi+WFkdE1kqo0lCUoMcvKdgC4po1e + sbRslrZYZItgIqfnZRxonxqRvbWRhl8M3APTxVrZOiNxbdyxb2iHRhxFWXO3ZWZA6og5JVMhjpwb77Wm + mZXRuZAhp+vju4p7Q+cyFLiwbHOqhi3BJUvieNAhIauhhYxoC5DSk4xuNC2eUryoSpqfrOSKoC/NB+fh + xJacTkRcOimCX4Y6csX0JzJPXYnFGNPRuIr0qauJmWO55sysdoP7SANO+VlaYQZOVzkJKGuL/Q/Xs8mo + voadGkZHAAAh+QQJBQAAACwAAAAAIgHIAAAE/hDISau9MphDBiEBJo5kaZ5oqgah6r7kIEwzbN9wMBjG + 0OLAoBAoGHgItaHy4skkl1DgL0qtDousgKBnXWqQvq54TC5fn4At2uzShdnwuBz+phAM07l+f8pm+YAv + OhcEB3mBiHssRUZGAgKHiZITASAWhZGTmmJadzwfoDKZm4BIFQIIeKSrnDs8oosCHZCskmpOqQO1u1A6 + n7QVOkijvGw7HwcHBpbFzTe+y2sUHtLObFs8PcRzLNZK2AbVlB3b3l1+mrIdMuY40MwjsuLt9Dg7kCzs + 9W2edSLy5fYJLHGLwqOBKLYcQABsRCV/CCOa0GDAwiCJJBQynEgOo0cS/QE4MAmIUGNDEQ9JfhwYkoBF + eCsN8kAA8cKWmjE/atho0GXOU3cQ8ByxA+dPjDsYtih4NIMnBDAtYJvXlOWdZB+4VKWRDWomWctUbjUH + jQfVlZV4LFQaIgvYcGLHkv0jl4anDUILgLlrtK5ftG+zCc7W92+bR3ENl+k0eHBhhFqKnAyiBYCOxIrJ + dLq7TNTRyPmi4khSJDOpyI/wVT04ocO3Fq5Ny06E5o4SHWAxz4YD+qe/O7oxuAm+e3GYyRhLSxBwQFfx + uvrS5KzUwRPx5+2aWD67T5g27HW/YKl6HTy94ebTq1/Pvj0KP93cy18VuZGj+PPz89FyBFS2Yfr+BSgH + f0jgwx9h5QmoYB+y1MTYdws6g19MDcbTT4LtTEjhB47EJMw24HDnkTodxlSUWyJ6I08JaUG41YmxrMTU + cik208lZ72BYzIxp1FgMRRY5J9GHLKKijI/1fBGkR0pa8Jg3RBKEwJFbNVnBk9ZYOY6OiETpkJHhVLnM + S1wGshMasjB5D4sDpBImeQYMtZxPSMUJDI8sFSVlKqa8aOdSb2KU1kJZCZmcWQ4R4KZo010F1R2GCuoK + omjd0edLbgZa5aSaokUXYL/8sYhQyoT1FzoRSlLWLAQUQOp/SKYqK5uNNQbgrLgKUVatt+bqqztFcPYB + cr8WKwhqiBmr7LL9zCqSbLPQrjDDZdFWawJpkVqrrUGwZbvttrgB9+24FKC3W2/kkkstsc84Emu6L5J2 + W0fPwvvcB04ooR2N9mInHpZ9jGlQv/4awaWWFxHc7AAHJBEdLxpOV2ZmlXBwxMRVkPjwR4wMiys0AANy + TxYbS4RYPlrNirEVPLKWHJqdKswJD0t6VBMPK8t8QUsjSUqIKrnCl7M7IgXDaJKiiSvrIvbJwK4eZwL1 + 0aXLpTJ0lYGBwuHTciR1Z8wDFaRFLktPCktkw169wlUcQGriMooqc/R870gjDNe8cfpuM+C4qGDdKFEz + Cao/ER5hiMSkpPOCORJE9eL5tfgkQJAHaP4SRyFXvtvlLHak+XwmlaP45/JpNLnfpK+HjVBnnZi6ey16 + FQ+lr7cHjuw2Wap27ZB5spZqbnmCN++b37WWXsEiCAi6xG/yYK3K73dcmfzV27wggdWauRXR7b0zOcxf + jz1nnQ1fhnaVDbFvj+IDm5pqifzLpcA0tF+4wbfRb5m39tsQ/kcMc5j3+lcuS5jvPJ+4GDd2x57u3a8z + DJSKETyWLvQN8Ed6wMIiUvYt+THLZcsBW7XMtaybAY2AWYJPKwhhCBTaiD/2sV4vktZCF+7ieVqbRc4e + h4oT2vA0ZjPQI3RIBbH1kH8/7JIrekUJaqzsGIWQWwST2IYlzkNwRf0UzPb+NsVJhAgknouC4ZalsQtC + aYnlWJELR5YPM0roQo474Oda5sYd4WV4o7MfkIKBRI7dEXNd/BXPnBTIDN5RdGFs3yALWMg5rO50W9RZ + 1HoyFrCwrgSuI6DXAFVHiD1lbmmgXf8G1TYOrqYrRwMLKIm3q07ayHes60bwzNJIY42xksbLy16iR0WK + ZQ96kfSfDHtppl86ZoqVoZZmHuEZYqJEHYIhohmwtUx8eKCW6nof/K7RLTKAMDbOZEW4fMiyCtgmnO8Z + 5jnwR4bfkBOdwpleTpSThubA0wQO9BCHrHNPTPokfR7yAOr6ubNoBBNKBO0DOxPK0Ib6S4UO/TVMfWIY + sYhOJ1hagxU2LWoGAp3sQK/YKEc50aBDPOig4qtocsCZu5BKVKTe5FDJIuIlDHyxLmXMCYwiI6PHfc+l + Y9kpCE3WqaGyRI0OQWMli+pKM9GMj2pa5XamJEKd6C8DfczQVSWAUudd81pUbSp9tgqArmpCS06BqRe+ + ChIwifU0W62EWvMnpzTQiaZrAkmbRFk4O0nNZn8K4VsVoaeMCCUaQQ1sKAerCEcVSkZ8Ndqi5qoZx7oN + LXrTJ2K/lynGAlEwnjXTp3SCjWHIcmxUNZVfbknAVcmgVa/6xUgDCr1oynG2Z6xtNCiLWzEm7z9M7K2H + kHVb4Rq3ef/9O+5F98db5WaMBll1bti6Kd3pvPad1ZWUWYekzuyK0V0dlad3raC47kIhn+OlwvqMSgV8 + bSe9VEBraDNg0OYSFGHRHQIJ4Xvehk1gptpSqU5qWbHqSJWMMp3vHjrmU824YrsKYiNuKGSgwsbBvnKh + I8dgpuDF7bFc+fWGCTHMrEVOg8T+85bSBgRRaJk4rYJKGnY5AcNGmDdofqWkR3hoNd5kTWvNLKFi8RS2 + N43NlGMoy9mGGFxBsu2xK4EiVQ98GyvuzIklzuw8tdhFwMWzwYIc7XAFzLJscC2P/BWnUjMC5jSrCo5s + Lq6b4cA5MEJ4zllcCHfQjGdbHLJzd3ju8xJMl8aBChoQq6srEwx96MbOBJRTaXQ6UPkV3Ul6cLBki2UW + ITwUCzowx9slUAV5Y1saszGBdp5k5JziELA6Qs/TnqcpA75Sq09eHfylNHV6V/ZGwYLpIi6ZJXJVBXvw + 0oLQX8Jakeql2XofAfxvhzUn1zTwNgIAIfkECQUAAAAsAAAAACIByAAABP4QyEmrvThojbv/YCiOZBcM + F2EEZeu+cCyHmjDctyCwc+//nwCBRyEciMCkcrkMCFQGA2E6HeyY2KyIIKgIECuteEyunKIE60aXvpbf + TIGhK/kaUPC8fnaWuiknXEh7hC4DUkYHUoOFjY6Ah34mA1yPliJyUXeMjxyXeZlznBNCA6OfqBunhU9p + VqhkfUMgT3Swt7gUh6Y1trlKQlGmtIK/xp9yvgA6x0lyBwjKGWmrzdZaAVIWJ9c+z9HVEtTd5GUBBwQX + w+Uw338m4+zyTOfpZrPzLd/rHnL8+QD5GIjmxV7AEZkQEPywK9zBhx4OgaszB6KIYAPxYcgkzaLHIP0q + DqBTgefjh1AINBZcZLIliD5ROroEBAUaOBZroLybyRPQhp79oBiwWYALJU3/gCpd6sGJUE1QhTlk6sLJ + Tqq4nEaNmtSljhtTRzgBcCIs1kJOn7YxO8+qBkpsT06wcdaaVR074s5jNiENEDd+6wq2pkyF3gxWDA8u + 57bnP8U/TnRdbKzsssPX6NY5UJLy4Fd1eApJY0Sl57pTJIwVHWnyaarZjGJm/Pq05Nm1c+vezbu3DFWe + fAtnZxVHjuDDk+dyQomK0GLKo6eywSUvcyiupWt/47Sr1k3bASL3Gu/CE6mDx5N3JfNhoFVONLXn2SoH + z0PWQZus9RI7bnb4/q0xH0DJeDGgPE4dKMt/5BRIAV8exbZNZxC9F8IXihxokYRmUOgeOuowmAolNGBY + 0VIcVpBdW9rcI+InFgZhooYVtkjTi5dks9BcBm2I30sDIJAhUzoq80RLErnhYIS70KJQTFQlycOSEYY0 + 0h1eQQkPGCwRaeUUWLoE04ktBVPJBUJwSSaRkWgp2k8zxefHTzUopEiXZ6kSXmVttkFAAXZqcuaehMbS + 5laCXlXook0cuhV0jEaKxXVQTaGopJgC0QteOGbq6aegmqNDp6GGOpZlpaY6gy2aqeqqC4D1+OqsNCQW + Bq241rpinqPm6mtTw1wKA3O9/pqcfjReRI1V/cYea89qPpA4V7LN1hWbDS+mGFq1vt2mqY1kecjtqwMc + YIt+dpH6i3qLZoNOc+rGUQW6LdnQHLXD9bHrJw31MhO2NYSJabxYULkMvpkZuea4cGirmrgHdQUZww2D + aMG+jIlrBMGCAcdxDA6TZdpBQjAyMaM1GGeFsIQUWVBLg9YBxsconoeGc2qgIiVFCBN2ohNgQLydLGr0 + shaMX5I00yFTiIRnobJcFQjLeYzZc4NQYZxvJDF32HUncPakp6ShDFgKzRSjyHU4/KUdKUb71oK22/QN + tWNT5dG9pzs05K33du6Ec/bfhCYUN3iEh5eQuSA0lHh4GKW0CkeP763+ieQbqTBy5clhZJN1ZH1HNee8 + 2TyQQkVRh9TcMo5OuiXfIbp6J8F2KhmEr/NhOqJai4GspssWm7vuT0mRsyXSQtuDtHVcPTyaeI3K+kV+ + 9P4SuMs8z6b11/fIjfZNCO9Suec6D/4kLLiejxDvTjG9Ge/39jtr6Olhr6XjJm9+N/E/mJ/AxroW9xSn + sP2hDCzkMtmtzrc+4IjhexXYGAMRxBzjiA8YIzvZBO1iOuccjQlds0P/NjgsrhXNKh9UgoOABkAS8gkN + UqOE+lrAtEQ8zYXL4Vp7plawrI0wTz98RNng4zdNhc1V9aGXUhZEDAOmrV/Mgo1/mhhETBkMd0D94Vt/ + Bqi3kEFQKYELQRG1V48QMSWMIOEi3croojPa7XBqdJvLHiSrniTkbhhwHAl3toyFiQ0KmOsA5VwYDJGA + SWj/utzmlqG5KmbKataqiULyEjrROdJTY6uL6YhiFKHEEYdi2p3sPtmCxoByXaLkyvRORcoSfKWVZGxF + pY5XBlYhUlPSg8spxRI9SoKCB4ERA+6CuUu72GpuhVlgMUlgSnMgkAyPUeYya5W+S2ahVQLgzDRLMD8x + VaE01uRWasjixBcibptiqV44H4jOqjyznfCMJ9QcKM/XFMeC7KpnzZpDhUStU5+ikqF1VHdOgAKlO4z4 + DiyHl0+PPCE7Nv1bKAXBOK9yZkWXJiibJit6H1G8xaKwaBve6seUAPmrXgvDontEOgk0/FOYKQVpjrAX + LpPE6CRC8mOcaPrFCllMRS/lA/OaMiMi0RQAEp1pHUv2kZtmNKcyrQxPF7m+gRipjiT7URCCNCQUWfVl + JuGjwdzTJJxyKarGEKtOSZa0FlpkkNPgElXL1NZbiudQaM2R5mSSJvnkCa8HPaJNMyEIDtQppzckkmAJ + 2afEAAqxkjDoEh2FKEhJVmyUrdQML0sygt5ss5yt0F0uGNrS1rOZpsUKK4OaWmHOxa6t/UisYgubY9K2 + tkntLGhv6wNi7baE1eQtd4KXV3WwSrhl/RiqSpmgP+SOwWHFNYM6nftAcPU0C96iru8YJwEl/qqhNv2h + u0gz11clMbqWuN/XDEVSY0FxuRABWHxgSw+GXRG9hMDiWE/LU/qWQ2LSPO1PdcFakGnsCGih56y8WF7i + ZDDAz60gDkhrqq/SEWZGmlnVOoiz325Hrfjdwwrt4N/ImHCgD/WwdAp5pRL/FxFOa3ASopZQGRa4QoCt + 2+y4o8NJrBdUmXwTeHvopmnkVrvPXVsTkUwOuLHNskw2hhbTeOMoP8huGhqclY+BRrwdecsqjAIC4Fhl + MC/uQHoE83IAOVe4qjkXKFnkeWT8ZrRI8iY4sWSdpSwUhSAgdUdzaS8mKeyq2MmuoGXKQYhJUbvvptKH + f+QFoZXQTV8Z2ngq7oZyF93cao3Wl2LD3qIFWOZtauu6k3qnHCcNEfJNwLsGtUymm8E+8paaf7fWxXHp + h+hFqXfR0XoWsBuR64RtoKy0nu6b9bvWW2T3zQAuNi4iAAAh+QQJBQAAACwAAAAAIgHIAAAE/hDISau9 + IAxjiMDZMHxgaZ5oqq6nwHFDwM50Jtd4rl8uJ9yYACG2KxqPpoASiNwJCMNRc0oNcQhMzJNU7Xq/301M + KQWbV0JYludZn9/weMXFlQjq8rzrgMAHh255goNNARwWGoR6Bnx+F0JEipKTOoYEF5GUYHt9gRSQnpqi + oxOWiFikXpyZIC6sqbCjhn1zl7FUPQi0JmKht79yG512Bo7AOWkGCKitPsfPiml8UAYD0Eg9yswWTx2+ + 1+BUGi/F4UbJfJ0yS93F3+bw50vxRe2MugUeAwQvr/T/AEkFsEeuoL+AcQb+QMgwA8GC1d4FvCNCooqB + ISw2BDaQH7kh/Qs3ProTYlu9CQKsiUSo8M4Pjf9IThiC7QaUlThzaqnAD2YJDd186uR4Ryg4Vj2RaDg4 + lJ4QGSFzpkR5QGXTqznKADDGUMgQAgdMYh27Yp8EjEPHRSTLloWllEbNxW2Ldelcunjz6t3Ld+OSeX0D + 16UoQsRLwYhFDtwHhdqVqIkjx+vo4eXifncla87T8WA7ppsBKrn6BPTnzE5RH3sShWtADWIrDHzhWidr + w0M3WNYqcsuJZKBz6l7CeyOdObXhdUyuNvbQ4xRk+j0k22pD2O8EIDhQbqwhA4isdw2LSbUo7Ci0c09+ + nbyF4Mrdf3L+D30S9d3ryi9F36kyPE/+rDQOcwNsl99VswBoi0jChASdX2K0oIszZDV4w4N+8XNAWPyI + 11APrgmBwBXmPSMNh9XopBaFOKXhwR8jskjWigfm9FdaPbQxmhLaGehNXjeGJtcGV4xAQAG6cPeYkEze + QiNEj5XY5JRHPFlQG1RmKUtKHr2ApZZgntdSUWGWaeaZkikkJZpsuvXBU23GGQcXU8lp5yY2eXjnnlUa + acCafAZqV2JqBmqoUkRAVsRiZB56plbsXQRIoY6WaZZDSFxqR6SVRvYWfCx0MEenZQ5apail6Enqqu8d + wEVxHAEay2h2fvdVf6TcBmtvIkDBaZPjAAJNLzz+Gg5cPKZYKzj9GG5lLDTSEfMsq1+YUh1O/nAgK7U0 + WFsBqOEkYgFY2wL5V7nIoDofupzFRq6cPBZmmKKTJFgLTi9GNyK7g3XZGBQj8FvWfxfWyBB0A42oKpgr + BlwsSAKnIM0yHeq0ARQb/shmc/TCRi8hNE7LLDngMslxCfuI7EWQTbHMZja1gcKto81949vMhgJn85c4 + 78nJx7IJ27PP97An89B3/vzN0UjLmQuorkTcNGn86JJcL1PD69EyoYCYtZ3ZcK0FP7h+rSU6Vu/Io0dA + mx2mPenkwyVm9TbqtnIPQVlytYlKuVS0d4uTN8lSo0ynUsLaHbjgjhXZthw3YXqEps4uXv6tS0UV/lsH + cJ26oB2W82XqOeqGEDoclFrs6gS7ni5O32mBdavmpdAuGaQtE7l3EykxprKcl6LVMiGZj7MwqZ/aThbg + zXI7+qH+JOW6gOeCIS5Pf05/3WLyKj4FnNgrr30h9vwLcRf5orTv+KIRWY1ld/gqK8LaKcv+ZESm/0nK + sl5MgIFlu5+T8scVj3UhG2tBnvgkAbNQMO17gOmUrn6HPxK1QH8C/FZEitUWnV3wceNrFuCa8jMUPDCD + GaDO/thSwt8IDYVnKR3rFjinoi3thTD0Fn9oCIdV2CyBMEzhLlDyOdJwwGonwFoQJWAhabElGWJrhsFQ + ODFqHE8qL/2IIjfIxsM4hQwvaFOHDTrigy7CK4J0gRs+9NGl3S3xiYMziNRS98ZfkBFKakDdm9yoA8KY + cVV39FLA5oSSK1aJJPapIxowdxg5hCRym6gDTRQ5pKCcAQ/So2QN6GiG54WBCZnUpFtQAUKA1GkrVRFl + DXCnIoDJ7o89Cx4Fj6EWPqoyhvqA5cpuiYyK8PKXwMxZ9YLpKcIUppHE3MtizOelUiZTRawpXkro9swO + lsYNp6nmWXSJCxzWIo/mwsoEVbQPB8IML+O0mDvIMMtY3OwnHrHlP4bDTiwCqJ0CeScIasbCGo3wNSpM + lYDKmR4D4dNEAT2LIeWynxkqhqAS/VrPjBrKRG5WgqLguw5Ef4Kfg9ISowEM13/u9dApVsegMxppdIrI + kCZuxaT1iZAJeiSjq7i0eSzREIoWCg+v7fN/FpyRTq1ITnJ4VCBkM4aIaEOXL7YMjQLKkWVs0CMlhbRF + UK3jikBypCQ1U5tPdB8eOWdRsHbBSh9xpln9Mre0lnWt1huTWuFKV2Bysq7WzMBV8boSOvGUr73JE2Cb + 6qe3DvasvkTMXQ/7BkbNdQcagIphgwmKxVKBlYyFA+X+eVlbCC+zZ5DhUffJOXmCtlulu571EnvaMwxg + dUwcbZhoVRfl2Yoxk30OwFr3oV5hsLEXM22ciKUQ24xhNn/9/d7URCjbSTAPpsTUoUKxtQZtwVW6FX3o + Bd41iHPltisy1Ot30eCuA9AuXt177JnstVJ8AWh9CSnfvwZZqZtClx70U5gcGga/0qh3thqimP1W4r+M + 7fUcBFyDx8ZbQaY+h3AJISDKfiuorGKVtj108E+F29po5G9nze2w9eIJYgaLmBiNuCGHT+zIopnQmyz+ + hdJcuOIYv+FpP6yxjc3QDSTyAog7dtLWcOXTIAMjbPTpxoGN3F2PpOMw7GCbiW2sRgTIbR/U5JNlaRZH + CKdlXqiDnfO6DOQWJe6/qzwczijzEfrm5nOcnULkPjszuWJYRaI9Q/KY7LkV6pm1ZmvbckthCwDeajOy + W5nyKMOC2zvd+RiYtZHuFO1O34a4s2e59Hl8tpsB27G0lG7aczWNKB2vNXrZO513S6WnULoNvcdEszLd + leq7BdJ8bp4SBusX6qLCoL/yy1J+PZ21k4WHZ03yHwB7rYkIAAAh+QQJBQAAACwAAAAAIgHIAAAE/hDI + Sau9whwkrg3EEHhkaZ5oqq5s634GcYlvbd9StgmjCdK4oHBILHoCB1klADQ6gxkDoknKUJ/YrNYYkHYo + AuV2nIoiOKeB4Upuu98WNaeX+cLvEpBBSuh5onZ4goNPegdJBGuEeFF8fhQBYTGPi5WWL0x7e4GXY3oa + ZzwjAaSSBjydqaoppKSrbaZSZwUEAgOJe2yvu7y9W5G4msKaur6pkajGykLAw8PFy6wCtslDkQBMlNHb + LM3CIdXcLNOkt9o2drbi6y3I06LsLdMUIUTJ9fH5+lmcieeYAyT920dwCbmCJKj4I8IEGsKC2QCEe5hj + wAQBByxS3Kgl4EWO/RNAhCBwwMBAkChr3MrDaWOmNSdTyuwWw1ZMhDdn6mQ1wOHOn0CDCh1KFFMrV0WT + DkXWsyk8pVBTRrpFoGqwWjmjat02tZaorrmybh3LCxgbbz7J6kOaMgw0U2lRsm1btWdLnOZMNLo7M0wI + jyjViCjFd1+YwiFxxX0ouNU8jnUqPH4IDHEeNZOARgZjeV0XMSE1Us57QgCCkp1xxvggGmeSGWKXMemD + wjTqn0hAT1gcLfcH2qOBl4h0+hTu1UuEQ/QiWTfBTJ2ZINh0HA0Y5wTlJNs8WpHeDdR/aqdj3GWiQ1W9 + bwQ0nMD0zLjPI1LvEnN4jnpqHXGvKTXFl/f+ydWKVFFgNUopZ5QEn1BHqZUPgOAQUMAZ79Xk4IW92eeM + Jlhh6KExAG7Y4YcklmVLMHuMWOKKuxD2TmwsxijjjFohAyONOGpxTUQ59jhIOq35KCQsPeAz5JGeBLQQ + kkzq2NONBE7U5JTW0CDlDQ1NRmWPgEnEUAiEQbnlVith418KZeZw5phqfWaTNch9xCaODYl5RJzYBDnn + nmkcYEeXyswlk6A+gpAEVXbC4ZddMtlC1ZofvsTbImp8pSVF5JRDn5CJ3sGdmpBx8imfl3zGGkdsLElq + qXju1ukqTFxA0qtkHUWoJaYmR+sxykkw65GlNGXXlYR0Yd1F2O2jHxj90+2qlDcxWAWOs0KMl0N5mJZH + 3KZ0YjYtYdN2Ysh8eiKkRlWHLJjjSyqG1u4iIUIqTiMwceptYbPJ+8uAMzU45F4n/UDtqheye9NhBM/5 + SVqHDZzwWDoc296kD8cYMbEVgFkxlRffJPDGU0bMcL0gM2mGxB40VjKTnyDQq2QBrvyvJi7/I8nLMvf4 + yQZzHOgNxjnTGAvPtJxIjMMu2Bj0WrFsGFYlEQGdNDVSLx0EtBtSjEWX+pIgMDJWe+LXNwEh/UKZ1wyR + pkRdh93NO5keU5PWXrfattuj0V03aLHi/YbSKQ3g5253+92OlWazemhViZ9w68NcD4qZ3jg4Wv5V4UJW + xZJOjZdmKbcEu0n5ipeOmnCde6ZqkuEC+ptF3xmvzjplUwl7EBYgaKPq7PtAK224Tyx7UbO8P+dt2eCW + /cRm25ZbPDfsSpmv2eeSVBLOz2eYIr63YF6FMKPH+LhOe/mgcSH87rkooDsZXJrw2ad8Sivs96vYwe/G + fxG2oP50MQof098SWpUnzYAiNQEUYEheE4fOpaJjjjufAvNAwNz5bw9TOBjJJogN5lzHgFIYnAlUxkEJ + WEsi/LMfBrF3rRROcFzpcV5baIa9mzmQVPFaCi549hVs/OyGq3KdUGJBoaLd4mglLFjTnBa+t1Utibha + 4jOAuDkeiY0aVP0MGtZioDw3AAkWoiANFFfgjrgpqkgyLIKWjDRGrihJdlvoBxzbOLUnMuRJbVDIHOlI + RsS1RTQYSSMfSxA5udSFJHscJJqUkDa5TC6LhhMdJAcxSdahTpGYzCSbbFVJTYJoGsJCniej0hVpcciO + owRJVzIFlg2mEihm0QZaOrmx8SHELQOBCy2htksv1qV+eGFhC11Ivl96jxeNIQxIEGa+pwElmWCDTAov + 9RxmDsdbvVTUNI8pN+fALpg5sQ0xVVlBQXqGgRVooipmE87icBNE6KSAOo8RzzwI0zNi9Jo43+mLXEHi + nuIwlqiS9aBKOW4A7+FnLwTaHFR5gTwK/YWaYEoDnnGC5ISme458YrjMmCXnPQClzEYTYc545FCViYDf + PysU0X5qqKXHSB9+CgQPxyQoRdkUhBDHCCElTegMp3wlgzTktPwJtV9EHYZRj9ovo30DlUzFTxmhGtWq + jhJwVk3KjuaZVXZ8satEuUdJwYqfN+aUrHi4ZI1uh1adDssNUTurVb/G1o6ko614WBs1n4A2mOJ1b5Ih + gyT/+jc8fdNJXCWsCgT3J7+uyJb/oaWhRhLSMa3PsZWwnErbICm5DqVSjsHsj74y0bTKbFR7NYyoLHrV + cqJKd4l8pT/l6VlmlOtXOrVVECtY2d68DLd/q51TqEonDyKLIyr9NU1sdRSL33WRTRhlbTyYp9yx3jFF + yEMG8MYEQ5IGJlrp6q1ttyfL7tW2PsIQLSHolVgA3str3ePTTlUpU1j0J2ASVCw+cfo+9eq3EPfr73n/ + W4YDAjC/BF4GBE+A4AQbY8ETG7CDSyAyDbZ3wlo4WWdIiGEQ4aJmFPZoh3nRCBBjIKUSHvEFdhYKVzgG + F8RVsSCGNotaHNGZU8JqEKXojAuvk2pUjOvDtjjFQYEpmmMo5JDHxqHnBgY0qTVCX0s2VcguRzfqHayM + 4cQ36+JArUvTMapECABgRlXIctEAZVPsGTan7K5SeSSSNOvfIGjOTJxrEiutIJu5udlvpXKTrrjwuGUT + wvbPz9LtjA7rq+XKLFi2i7FWf+toKjdXWk4mUXKJFzZ2ZXca2yURdafjZRzeq7xLdVD1wotoWL73CPFl + EXsHbGWUlC/C4quvJS47VP7qZbMTBG056oyrAP9a0lZDLbEX8b8I+jh0rvVFBAAAIfkECQUAAAAsAAAA + ACIByAAABP4QyEmrvUCYjUjAAmF4WGmeaKqubOu+ZTBsmwDfeG4FonEgCEHgAxiGakSdcslsOlHD4XNK + zfR8wAJBMLgOktWweEwum1uBI229/p7f5rQQTq/f0lf2xm2PC7hzTWlFfH2Ghxh4eQQDgYhhckNdYDo2 + ElyPmZpyf0KUmk9/FIxNgaSgqKmqTpYTIoKNIp+rtH6OtTiFALKwuri/YjIft8AtmJcHA8XLzACNE63N + KjyMPbPS2JldEoPZ010Gvt7jhwEjXNfkF+nq7W8y4u7y8/T19vf4S1FR+f3+T3IGCBTo6Z/BgyzSdCHA + 8MoWdggj/lO4xZNCGvEkasyHRxyePf0QN96T0i+EshJqMk4M2S4Eo2cjJ53QUEOjS4L5ZnwxEm1eiJ7r + eqi8pzOKKHsaeh6dhwfojhkjWMpLWmGpPHMGntaTQeJEGgQHDDgdOUIrPXMELgzFxpWlALBiD6JVK3XZ + 3Ao86hZrC+Vt2LH27lLIe9ZAkKppz84APEEGgpoGzR2mEMLejCBEqCoOh+Lt4y0ILwfSfFbED4ackUJO + ROBxVIQ8sKA+GRjq6q0iQAd1HTeijDWM3e3jSPOhFCNAwr7WOFzkVtuMQhRITkO38+u19eh5iL37c+3V + iXkfT47iGobiyasfx7OT3vXw48ufL+jPe/r4Mw0Slr9/sVbH/vgn4Cqm0DbggZvEYsB9CDYIiUAM4hOJ + gxSW40Z6OMBjVYUcVgBTBoIwMgyGHTrIEDfBtbANNCmWKCBa6DAh2CUu1ghPhImU1ZiBNfbIxAAHtPIh + MCStZCMBB1TT1S83DYmUQOi5+Fs4OMKxWBRO+mSRTjYyQ9olLUqz4Zc+0oKVWfSIs0GVZZYRQJJ0KXYB + Lzbuw2YVbyY22JLC8SkBnRwaMRBBJNohmVJ6zmPdJY/d2d1HGzTEUCOONiFaZr3Ro9lXqVU4ZTgW/YFe + pfqYlqQIPM4zA0Nw+YnglIvuyJ1+tmV6D00gBQpVrIN1EeYZzfUTbIW4FsrDWm22CWtI/T8l6yxruc40 + 67PUZoBFi8eSWu18GvyArYjbUtstZlCAG66z4yKrAbLnUkgTECkW1W6ysRnmKmW3zesjrh1cc8S9+pZY + 7w+YfWBUD4UGTOwVBGvBhRfa3mGfwkypAV60hvCXsAsKTUwxsBZrxy4ZH/6aQrYTfgxyHiNQqk1i3Syx + Ipgqw8GJfRHrAOPIKugITc3r3SiIz4QAnbHH+AAppMlGO0HYxuxFulDOKxRJccnCrsozK1Dy2u6KMXPU + BzpGdKrvzlSTN6at8wr9rJoLNh2ZnWPIMOcBacutn0KDIj0FYRUgmbfe5VgsaXR5x/pW3IRvtkeoJkH9 + wqaLp9r+eHm7iseV5C6simRYAF/OVuYm+FoFrlRua3VExXpl7t/8VNsk0+0s25nXopdwpSS0lycUs9Pm + bgKZG5Z0bUjZCu/VBmj+M+63WxOeZ5wGPY/868qvAydeodfzrrqpZ5/jZNAk6s8R8KIgr/gYXHoJ28L2 + 0O/w+bK/pw+nml09DfNf8O/g5/oU/CbSA4IV5GBIsJ9XYmcThmVhC+DAmALlA6mLhc9NfpsgkUKmh+jl + YD8elBggAKg3RZzHZWcAkOX+hjOZaFCE7iGh/4hwijFYpYYvzIYMjiBDEI0iKznURwbrBiEz6AJQQbzD + hXpohwAJIBlJ1AHWJDQpa0QxB2D96x0zuHLBK8IAbZHxohLcJsYymjFcdmLiGaURkL6tbo3OoYikwqNG + OK6CIji7iATt6BuTfAJSIXzhG72HQwukpI6gGCQhX6JFIrkQJTRo5DhmlxMq8eRWuLtfF/9RlEuqRimS + vGOzvLIrRBqCeKFUxZnwskL2PDIGfhkgWcxXtMLQ0hmmDMYrUQKXVNqFaBMIpJmAWYTujc6YRYilL/dC + TMBdxTCI+k6KHFM/CUETMZaBJqaWmUguzQQI5wiNNt/HzUSapgOoulU1G9OaSOXSUOecjYRqVU5UxAZ3 + POBNPR0JHH8MayvFsUgRvgKX5Ujkn0n8VHQIMJ2ChpOPzP2pFXiCB1HYSJQNFK0obB52noxq9KA349xH + RzrSlJEUOyB850k1ocKVXqdALo2jglQaU0SQ8VFDrCkdNLRPE2iMpjVNXk6nMEWd1mFmGejpnGCmVKNC + AZhNxcs5hOnUDBHNbm4qYlXpoLRgRrU/igzMO3mQpKlRjJL54MJCvhoDqFCVQ7vbIT7y6M2dqgyVSFGK + LCG6yl5Z5hNrWun0LPDWVGA1cIyrQxrRuL09ARUgrkJiHPg2kKH26FDYrIfiGmUzw0kKhc5yn7XYWgfK + PaaVeLINpXgyqmfF5gD5Qy05PNeqOsLKKZt7LEfoaTyM2JZ0iTAdtRAq1rCGoVjs/UjeVjHnztuRdrnB + +J1zdQtdGDzvZNirrpeuhd3Care0xyuXd78Lh3Qxa5PkZRIHyKc79Ka3FvXqHwjW+V5a8Atg/6vvFgsI + r+MYAWHU1a8KLNYwCEJMWZalFwdFFmAqdEykH1xi2xbchgb/TUQmFUNR21VBqUEYG0gtHhWySLGQGnce + UHXTVC2s0RkdlojjtVGC29FVCWTppE9j8dBaxhAd69DHugNQ1loG5GaoNUrFILE/e0S2NOhvmBAscuPW + 9twxalXAFICblK+z2AO92BV4a5yg+vZhLkc2zCX0bENAm5/NJtZon1qtHBDnH9M+WWW3/aOvtqyNEXzO + oEBsu23pMgkf1MVYEHymQut8ml36EPcQaLVoc6VV5beJBUuVfkS91OVR++H1INYTb6Lj09cdIeS6og7i + YD006kqE13WHPltj2dnqHHzvvLFu2zUpc8u5iiB9J1hfDkVLpvhxoHs0ybSyTCXPX0QAACH5BAkFAAAA + LAAAAAAiAcgAAAT+EMhJq701CGJ6J4MQYGRpnmhKCmIwEKN6CpMwyHiu73y/ayxWIOYrGlEsCugoEUmW + zKh0Sq1ar7UKh1h0bQxcrHhMLgHD5fSAu4261um4fOwaOedlW+1ww/v/gCUhWYFXAQQgBAcwhY2Oc4gS + Go9VLh1wlJmaVAEGBDZom0ahoqWmMm+kp6usra6vsLGysxdDtqq0ubqnQAO+vi27wsOaGi+IiB6fuMTN + zoY2ny3GHAaYz9jZnBvXExrV3driqMzC3Kpf1uXaQ+NNiMDsL7gaHjTuFhsgg9oDBtP8nm24Zwbcumb+ + piXBJuBfhYXNvhEkYcnTwWENJwKASKwTAQv9Lp65YDQDwQGH+AB4BNkn4qIL4XaNRKHBJEp8Ky3E1JWT + wqGLrUaWq3lSo7ie3kh2NIBA4waRCU+4sGmUHVOnH5/5axojI1RrJRF0qNrvatebETkcWMShpbOGaEES + EGsxpSS1bMFmqziWHYdPGA7RjYvTnz13t47CXdZuiAAENuva9WlrMmLDnkIQKAD55AeylkOP4+uh9Geg + olPLxGz6tOrXKamVRnQHtm3EQIKgvs27t+/fj84AH+5sUh3iyHcR1JO8uaw7kZxLd+WlzfTrq1L5Fo69 + u6jjtY8YE+K9fI6AoHUcWgPEvPsULySlP5+1yfz37j2CYoJ0I/7/gf75spsZnvjkFoAIWjHAAQQFxEo7 + sQ2IXCeLHCPhHPrEI44Nx9x3XUU7beIPe+1lA4pjeiF4IR5eUcARMS+2mGBQBWZw4DAxWTdjdi/ptOIm + IVmgyI/A3QJhJv2ppNQwPwkJhorG/BJCeI100tRD9TUDmItiEXnbN8ogAwKVgWx1h4zNtFhTiu9VNKYt + LLwZHF7J3EiMP4isJVmbhi3Dkp+OkOZhLnBd4iVsboI20qBpJIbbkfgVOt96h+5onpvlDGTppikcYugM + gHIq6gUNHXClVCBUOqp0pZ5qAqWrxlqDAaaSKVeIsu4IFwK4ztprrgjuyuAJI6oK7HCeMrVkPv19Hbtq + oQgsW8NfxjpbZDWmctUYmP9Ua+1v6TAFWQGfvODBr2Rw921E4bZ2rrc5gGfsGy+uWwa37qrTCHpupKqu + vY22m5mteMSnEqMoGGwfwHjkJgS8POiHrgr9IczwZNrxV6Mkdl4sx7/YLNigxR5PIe9RiiQi7b0QY8fv + UYZNTAWHtDFs8CSI/fGwJR3nKnHLt8VI2LEZj5rjkyXbZSTQKtk5ZNK4cfgLeVY0qQXSUO8VrphyVrFl + DV1mvVefIcDJDcFFqPkYm2J31CeZi8KLpyInrdx2LolS9ALJKhSqr6yQWiYpPalWXZmsGToYW5+Zfn23 + CsU6xjfeBoGK/vbjzDo1+Syteggr5lJt7E3PDNHKFQqFg/5qjxXIbI7pl9/l+t0BsJ4U04+0im5Ds7dt + JVaT7eoqCcWqTqxZTQztVwfR4gLX5lB7uladoUFr9xd2G29jadDTkmy2wcBZTezae3O4aOFmS24075b/ + ocDu9u4DyO5TB39p8vdgXP48sCBg/V3Qx2zKFoflkM4ND5sHAAMYhGDIAToHZAJHoLBAnmgGa1jQiI4q + OAqq3et/ZOjGBjmoPziQj1AtEQAfSHiEl+0FHinDHeiigzN5fIqFo/DEfnCCQzeAsIdADOLFliZE5/RC + Sg4s4naiISZlnFCJsYnGztj3Nyi+5hsx/eEW/yoYOIakjlSVS00XvbiP7plCKGaQFPrgoThnJMQWbcSI + 4wITRru8UXImiku9ZKKpVzEueHo0YzFExzGoZI9LRVEaIZsmEttNYIvfUVgaqaLILD1Sho1apNXcdkj5 + UDI2muxkLH6Hpa/cZyqJBOXwNmJJHCFvI8rD24jC0qyUmOksgiwGndqSx1gqiS6iTAut8hJB77Eml0D6 + C1kEcxjLCOpRmGzYYqahkppEJpjYcFQQ+TKmzXTGiVZEFGvyFapwinGcpimnOcVIxQ+oc51XdNgT4UnP + elLEg/b8Eg2Ok8+g1aCY/XQHdFoZ0NBUB4MFPSckRYLPhAJiPPP97IIJo+lQOrJnj1VwYUULliWMTuFm + yNxovAgZUgKVi6Ii9YbogkSHH6ZUDiJ7ZEnLM8a9oFSlFULETXuTuJlmgmZz/OAN1xW5EjGERLzzw059 + g6aN+LQQQnuq6pLEUoSgYYT1rB1BF1oMpx1gqdXUZqyoik3qSAurdIjS1CKan6uU8hlzXBtK8cU1Aq7q + lsmTKiDUJhaA+vADZZNc10QlPWKWJU91o2ii0BC3VT1zQ/hT7Nv0FtRNiZUd50uDGgvC1ZdW6Y8m6KNn + KTfUFbxztK/oHE2+iNpYqBZVnW0ti2A3FNbK1hW72l0Vb4tb5g3LBMXj7SuS1bwSPE+4rv31QHHBuCfk + BgVbkKGmY8YHVufuIFyQQcD6zFXaGdFvrPczTWxLQS+9ssQO1RUNvuKXXjFQ6rtU0CjRBDbYfnTUvI/M + Sg2/Jc+aFoek6dLheK3rk5X6VaIDVlFDtfJbAMSxnyfzS07LKh3/ikK+X9ltpHxRs1aAlIcz2tksHyTg + 9gIwqkFxKYElcDQTT8hINPWqi3/jGClNacYPOitCS0ZXMdl1OnENW9bcFFgg1Lc5fGWbxxb7J7a+Zm56 + ojDgJhugyiLHbwkWD44LaA/CZfkomXVETw0KWuNaGYBF9egLuwtGJ4utqWoWCOxW+2WiafLAyqEt6uoM + LK3CZMtXXuhcbfnsM0cqCdBW0F2mNAxAUrqIoNoQ3n2CS0K8whK/lCDuIY+Lw8JST3DKvR61gPhYZ0JX + W2FNh5sfd9ngVcN02i3Xqwm9YpOFN7L4ga+91tsaWouZQ/Pap6+1EQEAIfkECQUAAAAsAAAAACIByAAA + BP4QyEmrvbgOMXn+YCiOYkAQA3EQAem+cCzPdE2nUuDZfH8FA4Nh0PIZj8ik0hUwEATEpVRWnFqv2OwH + GNV6v+CweEwum8/otBoTaLvX8Lh8nhNAB/hNm87v+6c6KScnQk4CVX+JiosjOid2blCFXYyVloyOlBQC + BEKal6Bae6EhnJ+bnUOIpC+jrB+cKBuvPymrFTqFO7QisXi7vBJBh22zwRKcwD+pp8caBsRAyq8C0BV2 + x47TuEFOt84d1pvboE0GFkDZtr0IB+LguELoA9krF83l66Xt7/ATAfYs4LsEkAA6FsGAIAShgx+5egZx + LaTVBAEwTur6sRng0F88i/3XIgYLYrFItYeWgAzZh0AIypEGSiLT+MqEgQMrOtFzVo0mBRMtvXmUeDPn + SnAqdcGz+YQNgaA+PSZ1OdTNN4o9n7xpIwABP6FDf7wJS3YqCk4FvLoT0pSs27cbC8mdqxWu3bsAps5l + ewiv37eBUhWq+7ewW652IBlezLixY1Y6+j6enI2DiauUMzPaAUWzZ1CSUXwejWlDJ8ykU8Phgtpu5Naq + Y5sB0kKyj0CKZeuOYQzASyYoEMPeTXwCjry/SRxHlrz47iZPBsZwcs259S14hpOA/nPn9e9XBhzY0duP + q6raU5tDcSJ9GV/leeJ5BD5vkOB/ghBBDA9KpKPg/rlnxknXNKcINptEVZ8c3HHjzClCCLjgGA1qICEf + 6VigwoWeWXVeGhX+M1FNI0qwYYCB5LGBbWhUdJFIvLTVQUscPubIYIOcVaMSJElG4DE/NgSgc1PpgZiO + IHZyAAKEeHfMfSq4U+Jz3RDWnZWzdUOVPz15siNjScl4j5hnWBWWmd91iZIJ0k3o5jxswZbMm3SGYJMq + pWBZ557hLMmiU23yuWA1fpaAn6CIEioTQ4ciymdPCARaTaCOXsdJTCCBoN+XlY52J5Oo9WRgp8R1CSoG + l05J6oR3LllSC5Gk8ueqbl4qhKsFRCcYpVa8Rmtlgu01Cac80OYbsd2t+GsY/TcK6+UZvY3KaBS5LeuF + I8EiecYJdRixnG/SWttDZIl9WAZ0/t1G3SbiZsaaESFm2C4ZvvojHnnhzgsvtcgyqAJ7qmJhLq3RStUN + r0jcQZ+1x+lw5hiQFDPkqugiXOpFCiL6Lp+nnKYvYB726uQEHn8sVYp5VJvEZRoa0K/JcTTrRI56LEFm + Vy7DjJSWRkb2yMsJeiDkyDrXVOU0Cs3aA5T8BFw0QUdnkPQSXeKpMdAH6oIam1j/M5ag8OWbT5x5ig3z + pvwBxoycej4Nwo8dmL3ZTZlO23Wn5szzlqK/ce12I+ta6BbfsPn9t52Bi3h3HIpKavXhW8T04t5CePX+ + 0qaQh9CjSRlnk8qpGYiauZ1KMqmTXaYGnOripOold0qpuEpMXlzJyjrFX6MuGK66Djt6bDI7+/gV9f5e + SfB7WWyDw8ZmYUd2xhdr62A1a8EZ0UpEZp/T0TORWMRghAajFAiaiH33x5uW8xXAlIz+bSoTDz0Wmrj/ + /vIIKU1LZ8gccP79vOGMP0zAnhXcLnMNex2GDnbAzFWsgWUCIBI2JsEKWlBnHoLgBUkRGRUZaYPugkKO + BNM2EBYGWxELhO9MuJhMfMNWypPgwIJhCszAUIOrwSHETvCLpeiDDWq6S9jsBQ03xGd/ZFrGs94yDCMq + kHEaKR9WkggnsJAFbsz9yYY8HJSQH8KiI2XZYncgcg8dyo97M3LHE80TEMHxoiAHMaPI0IgcMJ6pjYpL + iORCkpGXAMGOVdkjKh4kOc6tEUT6YcmWyLK5mRwySUVpEjhEJ7WnkO0wSjLK/ziopc6VoxNUzIslF3mY + Tj4yZrmrDF+20pCv0BEpqaygWUyTlq8YgoUt7KSzSohL1+iSLvrrpWtECEw5CpMOiCnXMZfJzCMUr5mN + Yd4roTm4DmySmnAJzTWxWcpLGZObq5kfmOIHznNBgZxLMFYwy3mt4DxTCgVjZxm+JUV4RsRh8iRD4nwj + MEPEMJ/wSpy8RPZPgHprPMY5pW5m6AyG9ootgv345mKGyKX5hFJkTigoeNCmvUnuJxfbTGe7sAgunmBM + oQ7cp30edIsIlTNExpFo9rB3IjFksFIwFaVMVzalml4LZb9YZ31cxMdj3IxGX5DZCKu3p0b6xpOVCBLO + QupMnkXDDtqqk02WJElwQAknVhTY0W6RtJ0aTC4oTUPVNEqFqGUgBWl1DJpO5lCqKWULjTIoJy8Ji4vq + dRF3khQv/5o1PxUur4SNKt36htjELoJwpGOrY99TOcdJdrI7xNTlhofZRHyKe5Ts7NwqpzpQmlW0MWiV + 5fYQK5ecFrUwmB7viLlEN71TY9MT3mUXqKwsqPO1h8lt8oCbPfygMwnx/aRYLOSSVXjQM64U4BZyrEUu + 8AVyfND9hz+JS814UbVY4vzYbUeCUGFkF3K/HeC/IrqgusIhuTurraUsel4fJPBhg4pGIs2zXdii6qR/ + oKB/3Rjd9bntpgulqYFhxhUPHlczLKuA/cQ7vaUK9TFHXbC+inTVWFy4MVJtyXdx6lZuDHYyTJMSd09Y + 4nn4dTJrXbF7+6M1vO72MLEcEA+PWJUqsa2+guJoPauytrKtWDYkHTKXFmuoGy8rb1y8IpMje2TV5BQA + Tu4DZO0mQ5VGOCyNkxNnu0fUQQ6ucnV765i751SSSuVzoCXl/bZquomBuRCgs8DqLui6u6j2VbRZa9aH + fzdX3RVitilY4YA9K1xhZdnPD/4V8ubyaDk879HMq/R1kNdcpGBDIS+73tOqOzsw70I0PhDfor3QPg3T + QBoT/tt4eVE/V786vIdj2aAtwT/f+K9oEQAAIfkECQUAAAAsAAAAACIByAAABP4QyEmrvTjrzbv/ViCO + YGmeaKqubOu+bCAIQ10LIqzvfO//wJZsQCgWDUgCLshsOp/QqGSoxIloSMMgIO16v+CwjLANCQjIcnjN + ZubavrP6ck5z4dA3nncmDwR7MAFEdxkCWYCBQX03ii8DWiMzjixniRoBaJGUPZBbV5ecJ4ehAJOiJmOl + F4NJhagtpBWnsB8BBgQhA7UggwSvGDIIBwarvKm4usceAQe5FnPLGb7AGALDxdIpzc8V0dohziG/4NOE + HMLExuUbt90TmdXsALcIpWfzrJDrFIMISPzyhTBgb9Y7gRIg2bsjCyE8TxwEHPiXzSEHhUtMVbRID80B + Z/1odnGUcGgjKwIUyY2c5hGklpVTICGC2RHXukwUTdKs0GrmTnokaMpIYgWoMGy45P2cEnSpU3oycf0h + UACB1SxKnmrdai6L169KlHIdu7TnV6wZyardSgVs2rVwtYKa8Tau3bt48yKUUVevX4syoIr9S1jbJRqF + E+fLSEaxY3CD6gx+TFnRoG9x+U6uzLnNIC59V1ym1bk0ij8TAqYiA2qz6dfengV+9I407NvTbGLeloyC + aty4L7u21Tsm8ONQBhy4hJqXnrLDK2dyRkQlKkbNadKo/ptzz92K9knqDm7GCIjIpxxrmJr8Mtvs09dy + p2wkZjTR5a+hDy0/rEEX/hBwgH+PjdAUHvz1Y91eC0ogIIGFXWHDDaGBUc89ByGUlW//QPjXGFgZQUaF + XmDEkE4INSTMS8f1NOJ4L8KRiQEfHSHSSpAU8VFSLcoUli4/ehYVihyVZEePRJmzoYwHCtXkbUaS2BF4 + +lWJiY+bWWLllsxoQmVqQXIpJh00FoQOa2OmOUuZUk6ApppwHjJRm1N6CGdpciLwJUmb3JlmSVb95omd + fkqnCQINrklkoVUaiahSdSTKaJUzlrkQF5JoQuekwNWBxEQIFKAEEVns2YRmnI4E4llfmepGGZv2QoN5 + qUqxKqt9hpGdex1k8olttToxhiZJ/EGoDkRMwetF/bUtG+wLfNH13H66HdtPcSQ9G2EN1l77DoDaikHr + Tsox52y4OnxmSreU3EJdEeyeMG2qu/70XbwlbFfEufoVoaxT+Jpg3hUspuoODQH/Bd+idwqn5n0GJIwu + JwbOuwO4FeA3MXTb2TBuD/FYoPHGQnmKi4jG+rAkSR2SDJOLxoISIx8VrXijy4D52JcvsZqQo4DESIoz + Oy7yw3McXrmKnMVPRdnOmzwYeCd2/BKNZUQrD+2BeCJk91SlploiMaPxmVK1YWz2CrXW7WBrnFZ5dufr + 2H5yc4HSAsW92dxs9+p2R3QHAmjYufadm5lgbgXochcVbjgGJvJ5tjSVPqr+QUmToztjjSGN5ajQkQZe + qFkM71QpqFZgumrPj0utlslWhToqsXg/jtetuDoOBKq2l4P7WbXHAIi6p86Qcu9CmFws67GkdjMQA5+D + fPJ0FRUFY8/HEUpj0+81VcRNlDJy94J8fCq3TkQzPvlCwCp6GIiRdED27KtQr1BFEEHM+4YnS0/morhX + /QRRra8N8GLoO6ACF4izivGPgQLhy4RiBsEI0UBExApTBW93wYG1RXcbVMsYMLOq4B2QaRaRg1g8ZUKH + oDCF+fMaR6ixAad5LoYApMSgQAETLT3tSFvZIV96qBNg5UMV6Lga3IqYQwT9DWMulF4NsdFEVCToIar9 + Ekd/ZijFy1FRLlr0xgOfYDeeCM13XQzGNdQhlyeeETIEwZCq9pFEilQxgHE0CI7ieKI7sqEV9JvFRAAS + RD5KbiWbc0kgF0NIlqRkjH9siY2EMiQ/yggNWYMHSnzClkpC54VHLElYVHcUYvCILK6DoFlGRJXYoSWE + dyEdrjQIy7XI0i2QrCXFLohLXfplLubzpTCHSb1cEvM/w2vhMbXjvGXmBXvOvN33jBlNRzgsL7yrppD+ + YElzgIaa2jzJr5iXgvuFEwz+I0k3oSGbdZ6TGW5zp7cQ9s4vXBGKu0tgPUvEuITIkzKgBAw4O/KuN6qJ + aj/RVybPB0R6FWM82v1JHXpspa2yGXEx9yidL6/4No5AbKDB4mhCQAoy+j3InhWrmxtJGrVEnTQKEppQ + MLl0IT2OJGvXAF8eTIbB440pchr5ZxdUlNNF+gBmqZvBzMSUyEnC5Gc7MigCiVINnrHUXp7ciZFA+IOi + KUmodkml6Z7EhCgNhm/79J4rsAbWtLrBS1mipVvRNie1KXOucNBbB9aGV2no9Wl37esa8kS4wAoWDIBC + XAYGdVhtVO6NmGtsebJgOTpg8qqSlZcmUJeDTAEEs5kVGLFAJSpeNpRSM1XT71hlWCvOipzbcN+kVps0 + 0B6VNUNsgjkZNSyvLJUm6TSbbtsZ0upZz17x/TxVAUMLMmzhs6v6nFg2n9pPAMhQm+qCrXNoRAZ46Seg + e9gtImXS2mfWYF+88Nf/ANaopBYMj6Oybe8W1tYYRJe5FPho3xz4mucCYH0bi6nHtGtLl+qUZLfqKYHJ + gtOWIdhHMePLbx1D1H8Y1WA6qyoRFswVqAZNvmHV2Vc7s9XyXgzET7AhS0z8NbLCD4djcVFc6/vTh3aN + xvuBK1tRjCcmKi5tZ2KxwZ544SIBGbA89k4Y85tkms1pb3ztnkhD1jQk6ClLXO1dTX2TIa1aubqLzXLv + gFo2ex0Kso08oSQ7x5XPQeqyDCQdjiP5qUCR4AqaarJpxNpmYsWutKRoOi1+kUms3AkZlaktbqGBp2cX + SJDDZhCMy3434R5aIY0rOEyRDWZc8OZte5v+ADQHneKMHdi+ktFyoh2ivlPb99Bjym6jM30jiYTal+Kd + Yf4E5Gpt+m82lBR0OA8Ga2vi9ZqkTrZpIgAAIfkECQUAAAAsAAAAACIByAAABP4QyEmrvTUEzLv/YIgJ + w9AJhGEMm+i+cIxpcm3fKFEKd+93gQGhxRGoDLyfcnki6AZJptQ2WGmC0alWhMrOUtat+FZlaaDj9AlZ + EXjV6kD3E1QN4fiP0evO4wMqFkF+cEF3HnIIB2yEjRKABoImjmKABBcslFuGRCeKjJp5lpidoUqjGYem + S5x0Ap9vq5sHl6mlsjeACHy1uD91sRkDCCrBvqwGu229xz1Vuy17zT51k57EBMbTPs8C0aDbNQEpBwhO + K+E9RuCCBMQGqums5OYp1vIydUfa+HQp2V/esetHrco+grmuIMy3LptCDa8+wbu1MCGNihgJ6YMHhUAB + BP0S4fHLSLJkuo1HUtrxZrKly34oVYqk+LKmzVByhKR0wvKmz5+mILpxQxOo0aNIkyp1Kafn0qdQqfEI + UjSq1asjJpDAyrXriBY6vIoViyVF1bFokQbJlPYR0bZwn1IF4PTXjpFx845BIwGviHGZ3uodnMeJ2yVC + KPQhzDiNJRJnXaDS2rhypRKRJcOjMMiyZ4IDDkThi/Ci3MyfAYyjJSSevBw7lJJo7dezPrb9qng7Uzsj + 0TPoUtOpKE1x74WLtQ4UbhKSJKO4J6hAzRxfAFqkfnauYLY6oiumj11n9sj1y3G3unsXlLPEXep/kvEy + ClAxMfiM5YCB58QJFPxp/nTzzXEIFZdIcOtNsNF/QvEEYCXk0GIPUlU48Yl51elTnzAO+YISgRito0J0 + 62lojCEgjgHeaeElSNc+VQH2oIs0ImIQhsukWOOO7YwYWRcz8ijki+XgJeOQSL5gRJEgHJnkk3oYUGRk + TkJp5QVLIkAilmFc6aViKoA0UhlBfsncOGHi2FcxZrb5Ypo0oTCRm2aiKaWYNFwhJxJl0pnannciUEA2 + Ovm4SlN9+nkSoDIdsWUjc9UlFRSSKioKozI92ghpOl4gI6KWUqKfSjpUSkliqnVqAap9qRpqLkP9Jp5I + msqwmWKvNrZWopzd+sg9ueIkGIWiTUBasJqgRxev/SfZ0RqzMbQYKqdK1aEDtEqWwFOwqMohlyaQQYSg + pY/VymNya7rq4q5fbjkdsliBJ60U21FAwAHYwisPRO69B2F6+Oq71Kh29FdqvvbycZ/ASS24W1MHa2Hg + K+MyrN2NlaKIsAQV3ruImha3ZGIHQqg7QkrmDjkvVCLyUyW9CpkJ27FQafjjhiG/oNsVNA8MRsp0dZiz + C8VpZXKBd5qaCtBDKxiIMFZlaeS1TYcwXnYsJ00l1VXTgZ0tUa2j5Y9ddg2EfMtEnYKYH5BpdtvyDWiV + neZUtc7RuaJ5gIQVPyVi3SP8szG5BrEZLxjlQLOBnmAo/banMXMFaOKDkrD+H9OPw0Vwo44OPsOwmWe0 + eaOY/zJV6T009V/oUp1zRMR5RLFVHL8J4XnTTQ218hg9haUGur6zXlNZBtyOq72RCE8v6HFghkd06ilv + 1waO1zQ7XQcAKz0ZsjfsHxjGv90t3tsYUvb21NAaPi7rZ84u+vDHX7W87cs/vBv9Mmh/fpYb/Hr1++tK + TrLxMBJ0LoCaQ8GWCIa6+O3uJgpsgqEEWL9QzIx84rGdB1omOf/0zCdkEspR5oCIn1VQFiFsygjZgS6b + 6GckNosaCzF4qKdxRnvn0SAiXrEIGoZjMgrCIVN8RYEGwkSHG4RFVIBorBPGgYjlcaJjkMiBRPRwiVD9 + VA3ISKKL+VxsOcJ4hw/LhzbFkMcmAkoXUKqhB5CIxCppfNEYcUKPcwjxJXcDgjvsIMVk1XFCR/mQWv4R + jHEIZI4/LBwYfbIitTTkYapJhES2qJbI2W8jpfIISBaxEgS2JSaNEpon0QLKnQBwlHOz3E5EiUrN5Y55 + rYylLE8By1mmxVtzsWVcZHdHXUoOLL305VWI10dhls95CTylMTVyF1EEppjLbEdglMmN7kVzFayiCyIn + YJhUXTMoUNzmI9T3TZwQsV4qQmY5NRGa0YizMg/UTjFXowMnQBMtF5SNtnDmzAlOi0+8Qcpv2OiIe6al + aK0ySgsRKkznQA0o7v0qXjSvtiqD0guH0YOUvNxEUc5QEiPK4o5ENdIe99QySV1MG1D4STEnbs5gsLtS + HBlqk4kRI5hTcJieckDNBOmNbzg1SccudMKRSYKVTxJkUkR0vuZ1cgYlq5MlKxlPicFIj0Zc575udLN3 + arUQJtQDUr9aEqk1iWtkbYlZ/ZHVtB5Daltrq1txkSWgGUGuc12F2JThAbfllYtgAFwRDPdXkvwNR3L6 + aGHLhzg8LQ4ijbPoYmUwOZBUrlBNFRKo/DQ6zuGVIDk5aU6fqajOquSzMLnWZgNkzdJiKqYUYkYLtzC+ + vMVqN1AJZyHIOdlNnDOodkEtSkWLxmJxzKu4/btDT7noLHuqTLIuoFbDKiTctsxmWwip7cCQFC459O2H + vO2tBRa6yGa8T7wVtcC75rfRDGE0YDnjV7+IO5iQ2gu+FnupwVaXGpYuLL+FYxDE+OsZm343WCa6hcZS + 07G9zYlhRsVAVP+EMuhyxsKE4CBWMWydqcoin8PkqliRK1OAYmGYYd3gWIXH0NkuVWts5fCZbBhEGTIp + xvDraBFlvAW44hh9Oo5i2MJk18yyLqVmVFsy+EoyI7NupuVdY2BBlkcHRsiOWDlsnAR3SUWSmH2NVVwk + CbZcszWyg0egHKEux2P0AgFTpGtzaejr2v3EeWD4K7MrVFNdleVgJwRwduRuqKgOrQDXtbGqak2zEDwf + 9O7Qbv6BF1LAio6M9G2rPQr0Ll2QPn8pUnJ2tDUEkD2tSjeQ31tvObWrFp14envlCjUr3HreSNv61jA7 + M665iL/5KnrXHupff/4na2C7pWQFDHCxd62fBe7p1TyKAAAh+QQJBQAAACwAAAAAIgHIAAAE/hDISau9 + wZA7wv1gKI7kFwyENwrIYQhlLM+0qXFqre9ycGyVU45HLFpOqVGAZXgZn9CQD0gRRq+7DAJGEVCx4NjJ + KTq1yOF01rCteNVw0YAtUAnQ8fxkPFghEE1ceoMhc1t2eIRxAQQGBz+NfYqDd4lBBIAaQ5OcjI6QBpKc + eWNNlqNhngSCl5mnqIOlgbCxAba0i5Wrth62LGeauKi8m8LGxzWyBANeBX8uTavI09TV1ntzptrau9fe + 3+CEstvRdeHn6OlPSyjc3erw8fIkvgL25vP5+vv8/f7pS/D9G0gQ2RIAVgoqXMhJkABRDCNKDIOPwJeJ + GDPyOOHFQDGN/SBDKhnQQaQUex9NqlRpReC6hyhXygTHbAKrIow6BJzJ0xoKCQeh/LR5s6dRWBlWlVx3 + o8vRp7hOLGX65QTUqwMHHBBUE2BKhbew6sjwA0WSc16WdWX40GxRsfSyTaUZipc9tjqXhIKbTN2dm3cL + Brb5im+/pEcg/psrodFXw/qm4CBo1QKBA48hYyCWeVjTKmf/MSrmWDM9diRJxpymBfBFf9K6AOqseUmj + aBYtMqNNyBC+vwqBI2Si2HTiaLvrLXMZtdEji3sXzrH4KJhxE9neVUHBnNa4twMrNWF8HVs5EEjAI+WF + kVh5EOLVA13G+719nNk7e5F/vz/O2+T+WbBfff4VWMIdB7ShBH0GNmgEggqWwaCDFOoAYXdHTFjhhjFU + gkCAbtTF4YgkeLjVCHOASOKKCN2GQGgXVMIfiyOK92JKHcFI444tNpHgIbf4chuGPK7YURN/IFCAUreJ + GNVqRTJkGznkqChOSURmodqMUZJyJJVO4rIWl2LQFxCBXabyJXJZTjJUUE8MJcFgaSJ1D0poLqLBQ3mi + 99mcddZGUp9+VlVcoE+22Y9WXJGJqB4tEYoOI2VZJClOl1I4pkSlWKlGWxY5SuKbouaTKRF48vEoQnt6 + aiCdAAiHqFSnQkZeaauaxFmtZRx6Ga+5TopaalCCMZplHgWb0ZT9uOW2Wxqx2TSbshOVspxdXjwLhnBL + AHIotQNZ2116wFYw3WUu6AhuuNmpl14a4oVJY1gmxfdYTuUGwR6PaakmkrX6RbtuDSliG5In8n4w4MA1 + yDpnqftcSI+GDJeAWBDfLnQhbRRXrMQPk2W08YKuerwHyJfk+w2Ert5RssmsRjjnaxF5KPMHBcNcgm+I + QByZi+p2MYvOE38CXcZsmXKjwo0ETTQG2Qx98G0/1tGLkIGovKp7Kn3545IPNfny00cxC+Z4WqNXLNnx + mE3l2EYclJAe9gzK9kvQmXKtIg4hHcWZSKQNc0D30EtIRX5DQecyd7PbkeBuVIBr41ecqf4IrYPMNTnl + 62AJuTAP2XRA4pzPsKmUul3mdOk6WASUz+p0+jnZSfG5LOvG2o377rwPzlnvxgWUmmqGAw8VO7nlvefs + xrcddqpho9182dkWwyzcvBcfXMddAMj8Ndpvrxbs5wR+kink69PvWgrNYTVHGgtsgvchuW9wcInAeth+ + I0Xz/TEOi1X6wPcnoJAOHubzgwsGGLsCIuSAsUOZuf4XCzmd5AwMBIgDAYC9cFwMNBSEFAo6060FauSD + e1jdPFrjBprtYwwzMoMJl0WHFraPDj0riKpE8AupYYRncyrMz4wWCY35MEOZUKEOnQMKCLYtakJ8YdPA + wwhXZBCBUP284je4thC9LC9I3QKGEqW0L+MpgxkEcAYw9jQ9o4wDTNpp40zeuI04ynGO0dObHe/Yk3oU + jo+ADKSaFCVIlsBgboU0St8S+ZSKuJCRukJjsiDpRt25cW2UFAY7MJmGSGXyGPjaiR5O90kxfUF/YSBV + KaNSQC2WoVUhXOUR/lQZUlhSlqhg1ATYN6tYrsczlRoji9bnSmuASn4VlN6jClYPvNglOp0IVgBRyQ9Y + BZCRKDRg+0gzSUpKxgIdBEctKfCr9XBxR9lskS/hcCzJdVMcw9rSOg9Ww+4pRH5MiKXZkrc3GgExVlGc + B7eIMwlrJScg/VyRJ55TROloAF3W/Unm8hKzxw19RyLxCudG2oUe7vDonGQMXxziIyGN4hJ8+VkBMk9q + KvrxsKIsjYfESDbPmEZhpiWtqU2fMLKc7lR9SGpZwn7qFySdSA5DJeqkgPYYGSk1HzZyWo50+tSNUO0P + 70MIswhZ1Wt8KUlga4cyOWS5NLkNTCad1Jau5AGuWnRNVaLqIszESTCQ0qxwTShDLEhNLKjyUYTDU3ta + CSlYdlUNKBwnO29JrbLu9agcLCbnPIm6YMpVNJeVwV3BIpfMVpMkoUrHXzm1oVSlaFKGPWyMABNQUDJW + tbvkpmexsiv7KLYxmPGYL4bHDLeWTV2bA9c+k6ct0+BzWgP9M+j77KFXwwzUWwwTl/W4M9tvnKs6wuyS + uDq6UrhktLpaXYm9pMA9voDUGMT8V0pfKllEMVOUJ3RpCBa2u2m21xs4JW9alZXO29bMEYcgQXnv9s0J + aqSn+gXvdQqcQgVTBMBC3W+wWGjPAyPpZhxIauP+ec2IIGxp8Dli6RbaRJFEFUdNc3B5LvqvqwJJq1tV + 8XvOe+AmfY1JppAwbAsK17fJ2IN1BWyPtaHjcNStyHs4JJIpZJsmaaC4UsLTCG9qEydq905WExkrGKc4 + FXB5x5RwJ7A4EtzBBdkfmnsnfpY8L8/VTBQCGN1JN0uZ1P3gxzty3XA41VmW1o7N3m/Ac5QwB+ZCGzoV + vzu0qY5MLJEqGnxhS57efPto7zxvuWIFdKUrV70jHEnTJnP0PzrNtLH+S9BFSG8Xp6w29NVLN7wkiP1s + EWt/8E9Cpv7hC+4nmPzd19Ld3Y7/QGJfHTrQvy9kNQ8xeMJjW1kNEQAAIfkECQUAAAAsAAAAACIByAAA + BP4QyEmrvTIMw43AYCiOZFkFhEF8F4p0rCnPdE1pnWfvPB/8gZ5wKAoIOKtfxohAHJBBonRaBFKv2Ky2 + hkMOBIRC84mMbc/otHrNLm5y8HK0Ta/b73h3PJfM+/+AgVhGAyl8AnOCiouMjS1GApGIjpSVlpeYmZqb + NpCJnKChokUfKJ+jqKmcMQIDqq+wmJMABK6xt7iCGmAGp7m/wGsaA77BI57GycpaGkGzUoSRxcvUoV8T + ZkIoxMjV3qOFGdk94djj3+iXASqt0zUqFefp847D7jTrBDe29P3oAwdiXNOkhFpBf9C8ECBwTxCYWgOD + tSq0AiG0DbUaBtrADZLEjv1H+FnUtulItki/UFIwOfJbPgsafhGzwEFjS1gvLcy8FdMCgQM2b1YBErRN + zhsMcZnyCVTojh8TB0iVtmgdgpP6clVc+aKo0wlGDKlYuPCLVzQbrkZhmYstEwMiv5boAhcRVDBmdaU4 + gGAh3GAYfz5JKtdElz4nCj37Q1eHsSMddhYmcVieBMVVrSgjOlkGZMcgtp3tTHrL4YZgLJdeLcyQZBCp + R7OeLeQI38UYRNPevcb2VcoZeQs/4xt3i+DDk1+BjOA1hpCylUu/wKuJ6stwo0/fnsFQX3eQr3MfH+Lz + 9+cpCJNfb9gQX7VBgPDyoJ299PkG3hdYUShyfSLd/thXTVh7wOGcHc0AYFwPw6gkoCIEFpgdIBGJJ4Nu + VD0I4UN85AXIQuJMUY4EDmqoiyTS/EdFPu0klBU2JvJmzxRHAdBTjJQECAxAAlmI4x0JLhgLCgfUspCK + nSCpXIXJdHGgGhMt5KOA5RixjJI1pIhDXD9mwM6T45WoIGhdgiUVlnIdmAKaZYpC1EHMcElLL23SA5VU + eGaYxVIVrFlnOhGORZaHWGyFTVd/uvRGXfI9JGRtjr0lZ6LBVNaCYmxit5ATKmRKaSOW5oZZFp9NGCOc + 33z2qI3IDaKZiQ9Nhc5pI6T2qRQcNeqSa6ghdisPbJnjTXHAgfnrXBzANCkw/cQe0+qx+MCjk6eNFNeQ + btByIS1S1DLim7HYmJrtDFZhNSwH1o2Q67g1pDVLsFd6px51HEzJLlL59ZXCshJ1cB516XXbZWP2Dume + dUrIZ8iq9w4lcCX46cefWOA2TFqgEla8op4Wq4JxHBrTWErIUkRyZseD4OcFw8thw6/II8+LMjQo2lXH + LCCmUWItMwOzi58690lnz6ZxnMaMarwGNNGDJMUyKq1gc8DLTPPAZKVl/SRz1bhmZaUxTj7cM4ske8z1 + GUifrfbabL8pNtu5QILnVKjCLRchZPklh92ThbWCXYT4x/dXYT05X9mD193Ws/HwaufbfsQaUdyFuGP+ + BAzpSF4wJxsAPvktthbhuDedA/F5LPAquLk6oYdAazWpi/nKOgYoS/nW1HG6upvJJhZ3kRcgjokGuFsg + gO4DAj+tUspzq1Tlxxz/xO6hBNA8WMWPUm7jlJMpKvIGGfDbSi/e4u5a3s/OUa1N1Eu6+O+mP/teRe7L + rPuhEfBCp96gkF/9f/HZouSHk/TIwwWYU1QOqEeQV/3icuywAlTGAIV5cGZwZupALcAgBk6VAYNCaUyB + fAXCkYgQDiQsoQlbIZa9qfBukJAE5F5IwxqK42k2tFMpspdDf7CCaj3MXBR4FsQQfmFpRWxJ2iyioyRu + 6As4HEKQZujEuWSkiVr9uFoVN1I+2WWhSgzc4hW2RSI1kI2KYgwNGW+EhiWmMQ88msDp2qQ4n6ERLArh + IazKMkfQSUVKCMKI8MiTq7t8RD4BrMMdhRK7MDpCTKlzYo0yAERQHKgmaZzkZRZpGjn9hJM2etOPNMkn + g53ik4okxNyMZp/tke8XhiIRooyCn7xtEJTUOB+JCJgKtxwvkcJYlFnucksN+Y8vfqmkNcZygMFQsTKn + IF4UhUOwZJRqkAx6Qyx1ss1WOrBS34RSAvOHzTeqQ5u9cqQ5GeE/ccEmhevsZb5Yhq14vqJZoiunPb01 + z2sxbp+iYI7GoANQVVRnfCFYV0FR0c5/PQd/C/2Fmr+Kxws9RlQdB4NPKCM0zYtWSywSY6Hg2INFE31s + D/rMRIPUaZiZdHQ6J81BSocXHFZ+kRV/8luHXmrJLrJ0BDn7Wk5rVkelkFFBZvwSLs1ZIzai7WTjKqn5 + AiLHn7bNpUtFm9YoktUhdVUGWhQgB2Z6kyh1kxJgvBJ5tLS+4SnVo7U6CS+rAlW4JvSUQ7OY22TkybxG + VZV54mk/SjkBJEIrULYkVGm2+cuvKlGYgIuElBxrCV++QJmj1OY5pEnZSgSGUxYtU6guddbCXLOzoaSH + qiz3z76F8w+amxU6a1XasxXSI/0bXXngebZGnus2xULtbGhnO9jNM7h2/dMkAMiqCWs5i7mUImVoYfEt + 1LhTba7ERvmUwRyEgkChcNPlmKyKUXTxMDyJ24u+gEkN81A0YBis5qwyajOF1Uu41Hxte0HahP2IdKz4 + tStlVFYg6OpQsAKK6UitORE0WSlBUSVwMZuEEuJh6YcNi2GK2msGIhIBZ9sVMBuyYVgfHNGvKJNqLJSG + 4mwa2KROC/AQokaiqdkzrHHLWpFkHKO0gu0NL27bW9VaUDeK+MhIZsNekzw7k62yqEy2BN7ypkEERxlI + joqsMHl8ZbDgxReH4zJ3oEzd1pJIt7MSc234SF4IQS80qsocm41Ruh/00aC1xR6Av1HnXdzvJG1pZkzr + QjNb4wI6br3bx+00Ir25GrV2vmNeiJer5paGttGBrsf15FjpuWyaVZ2mzJtdh+nkhZiws4Mf957naBsN + AHxXUvUrcyHeSHqsreVpX6vNBz/0ZdoPxwQgZksC0ePsb7oF/F8yBREBACH5BAkFAAAALAAAAAAiAcgA + AAT+EMhJq7046827/1MgDIRhmoQQgGzrvnAsz3Rtx4Eo7Ort/8CgcEgsGo/IpHLJBOhWzah0Sq1WRM4B + 1Mrter8xwWQELpvP5x6AMEC73/BlYCAobeP4vH421+6HT3+Cg4QXcytqNn07hY2OQHRjNwFsOTt3j5ma + ICQSWDadY2KbpKUaAQYpfjWoBBWjprGyWausqRRzs7q7oAewkXg5vE6Yw0GUB2wEBMVmdWzAsSMkKcZE + cya1bgMGKpawpJc53G3WgHkC3a/gmYwU6ezm8k63V+Wb2hJ28/z0rhb5GuWyQOBAs358cigs08oCpYOD + HhI0iFCRiAEYMV76ggoBuzr9paq9Q2AAYkUQIkqgWLaMjkkm3DxCgVeKphMBJO+dhIEtlctvbBJVoWTg + QLISOvGlKngg1cudG3qmKDZnapeeJuJtSnciINQPUrV6IiFWisKnjs5+DXNCqMNKa+MG4+aUQ52ycvNy + IWrA6yuregN/SXfAYwdKfgUrZkJYZge4iyNLaezWEGTJmJU0TjymL9rMoGtwRWB4A7nPoVPzVImAmQau + eFXLlsHVQOuDderO3j1JZWGZKxTm7oaat/ENw4uSLqBKpeehG4/zS3miunXOSA4BqCzjYnTpZqhbr44d + SbTYLBB/A+8mpXOf3JuE+lQjlAR37M/o4CHsaqoRxf5FVY8k+c3WR4AC/jNWgXkEIssAvkwQDYPt+RHf + I6gkQw2CFlH4wXmz9FReENMsg56Hy3hyokCTeSNCXx4mCKCH+N2nTowZHBhjQPvg+NVZ/QGSlD4l+XiS + JRlpdCENElXQo5HTJcdSS0vKINIYJHEIJYZ0BSVcHS6ReKMIOW05T1hUkaUlB9wsY5RuZhoTVo5kCVHb + czgGaU5tsaknhFo4PqOROVI9dVeckBA3zoqZ8FXeXWsieoFNohhD2WGXSdrdgCEMKculHPipKR/JXDDi + I5Q9JeqoOHDqiWu8jPYonqzyZNtHCu4yWoSm0VrrCzGpQekufN32Wla/dleCUf3LwGhNbcZOWgKsyfJE + F7KE+kaai8QMV2W1hy00T3KkIcDcCM6dCq5g4o1HXqQtOLiuJu26qy6TYmh3hA5hzvtncij0iwQsZBwh + Dgnw+hsVD+IwBgUbBoMDscKyzJFbwh6w8yTF13y3L0YYe6DNxhwfY2HIztwjwAGeluwDiLFQokxTKLuM + wXyMCiJizTYb8t+9hPDcMwY6Dm300UjnCGTSqfGbpDdMR3bRlM4BFrVeU4szdTZCX40hmFQNB/TVepoC + dgZidx1H2Wa3NOEmVb3EpzyCvq2UFuvVdGWOKo1dyGl5h3NjpXAfGlWXajsz+H05r+1qFqTE3QFOTTUe + /vTjA9FbKkCJRyG5XQhUPkwAm1fgNxqk5/pq5018fgrli4eIObUY3vpX5NygNwdJsVds+zuqPxLsTL0L + RI5dhWHLy/A2Wg4HUcwiZbbylvFOuy7QH+VsKVgVj+G0YlHCu/cVX0t+o+Ka8uJ/wghHWlNwWgOo152e + EBQBBZRrv/P0h2i+u+zrX1y6Nx6rCfBH6LKOAQ84wP14jIEQjGAS5CXBvGBBXxWUC8FalsGKqGFiHVyL + xUgWwp0UzYQPLKEXFsG/F2jnWypkgnooOASYxbAL9tlOC1mAsxv6R3U7RMnPWOdDIeYqc0U4YRGrAKFf + BJE3bIsZEfmmoWVMUS91/XuiG0q0twnS5XTGyd2XpOGi47WOVcPSYU0+cr4MNsQepeBRkYr4RtNd0YsX + KMgdDbE0H9UxBNcTSCD1KMOLPA2Gu+kIrkLykSzJQUpTEhiDmLedNgrCJmTaXna69BMdeMlD2WsWBxvR + JqbEzwhocoiaQGk+LaLhTmB0YZfKUhVXsit9FcPlwNpiklUtEW6Is0sXf/k9rgkTkcTEA6iikqlkNiJV + j4mlMwejnG/5cpqE2IyhfIXNQYymNBo4TTcFaYJoYQA243QEtAJ5n2ntMZ1/0hZwiCEeZMIzDc75zblI + 0JV3ji6FMaoXAKX5Bu/YszsnM5NAr+NPOVRCB+b9IRii3FOdT84ihzWq4T/oEycHQg17rrKljAh6Tw/8 + EYnXANm6aEiKJkpIpEl7YUMnWBRlsFM1UUSDDdX3xZnWBCMmwkOKbkIs8GgtHaNc4RBLahc2wlRIJF2i + HH0qtT5mBqVEompgkHRIre6hSRQgYa3aRTVJKqaLOJljtaTSyR1YdDGYTGtSOzrLNC0wMKV8000lNSei + 1UkysPQqH/kxt1M085Y5nUIWCRVM5AwzaWJclPz6Zqi7Hi2NGZ3FMg0bVb5ibq6a2CzfOjvR0lGAtFus + pqoOa7Q/rm4YstomahX6uzEE71Pl5FU4uYk0SqYxRKzZayUt6bJQSu9ZJ/0w519OybTuPfV58uSWJVRy + UI7Nb0/OKdc+0yVYpuIAYAPtbkQAqqmFvgt7OzArH/I120SC962f8gbCbrBBf3k0sVuRGGg/8MH9epdE + TlIrH+ggVvuSNxMjE/CA21sgmX5KZSyb5k4j15KCKFiqG33uCnuKzVbMqKjjVOJ/R0zi1lm1xAJJ79Pw + i+L2oGtK+xNvi1GCrqPyk7cz1s/ZrpC2G7JYnaxtpzHPJOMhLJanwh0uccPhNg1zAXAQ1ZvuKGsNKGcW + VbG7ciFSorvGxirLTjbLZ3GX5PuEbslpGTPcTCuhIjNpvqATHS9SZyo3kyp4YOVSmckkZ2LNzs6bZAJn + O3Fnyd1RT3aC3s5tSXkr4oXZc2Z8TfLQ7AjfUjoYy9Kef/WATr5ZD9DxLIqmY9bKmIGPaAQY36MZUuoQ + 6bJwKICa+87M3Dm/mmzXul/+SLO/HK/tf+6yrK9ZDcBYgxohEQAAIfkECQUAAAAsAAAAACIByAAABP4Q + yEmrvTjrzbv/gDAJA2ieaKqubOu+8CsEElHGeK7vfO/rgYGAYKD9jsikcsncBAfGppQTEMym2Kx2yw3S + rrGnlUsum6XCUdj2BZ/f8HiLQJBUY4P6SCTv+/8ZAQYEJFEtgnpqgIuMfU+Gh4MUQY2VlpcgAwd8AGmM + AZCYHqCibwEEBzZ0oXFDNp6lGyR5hLFlQQYGUIsDBjOgsLYWVqC4N8JbrHICvhVjyBTPI83Q1T6CBhaU + 1p2hucrc4SoBqRe71dsVRODiP8XFcOSJE6fsl/UW6+1LoLMD/8TOCELAScKQcLWiISiyL0kVIrnoSBRi + j0kvgkaYFYSm0Y6Ahf3HGl7rlYtiP1dukhE5kIpISGu96CA4MKiiyEMkE1YIQsimQ5K5NnJjlkuXz5vj + cgqll2dplnc3oSL1QdQXu1PnpmrdiqsmhyFOt4oNd6pkRbBHx6q9xOwAwQ5Y066du6jtWyps6OpFZjcl + hrh7A5eymzUDs8KCE9fNheCuhl6IFUuWU9YAAgLsiIadzLlM1cvKhnjtTDoeRLcYaRQTbbW06zOsDaAu + QChP0chNqvh9Pflh0d/AcTPxEkIuFRIBecfyDfy3cIucNp+Iq9u4clOxI1Ikk8cjnnnSrpfSbeWXGUSF + YkiKJr59ikdh1tt56d5W9YaaOAWrvxxz8X3Y/qjinxSk8AcDLNLZF9NzVP1DR4IGdtAdAHeIZB0MhfSj + S4QsoMcghyFs1BGI7/1z4XWRfUPide8U2EM6FKBy4opT9fPPjcntgI86B8xIo4WxSUTHdjvoZNBCPv7Y + Tle6/KKbDbvJQE0VICnZm1Kh8BSlCzGhQtOAVgrWlZEWNMVDVUaFqU2SolQlHWA6wqNmNEPuF1VOZ5E5 + pw+9OGlnQ5V9GEJPex4x4h5a9VURnIXygI029O3TF1x5NepoOWWyuZhbW05SqaVAYOqppoAQhYCgh5EK + 6k6WiTiPSKI1liBkqq5KwUVgHBoVRKBpoJmtOq7U0oZbfQamM0QcC2wY/UBRw9VpspKyGkSdLnuInGPF + NlttEKVprZrMNedcrU7k+C2Q3YoraBgiEIeEbkSey48rv0FJriwjRAoEMTzdK+9x5ZnHBBg2IBFewf+O + FYRo/g6jTjYJP2XuEfAhUZg+ERO4S7W2kDDCAfpmfASCAA4JUcMibzBhhUvatm7KQAySXlQwY1FxzTjn + rDOBLe78I7w3muRzhFXQIlFRhA7tXtGEOEnCbSgrTdYQkTH3stRORM0F1b5CdDU3LkpaJ4SY9CtLUWRb + 4wpA+9B6kjhg4WXWVm7rBrezBqX9SdxO4Jko3iGCnQukYOex6Ec06b2cfEwJ/qoEXwNi9lczAQ7+IOMT + RP4HItooq6Dn2iBu+ZKYUwj6eK0iW/joOw2wEOtkpU5nOLhmBLsoxlC+kJ5tt2q74ouU5RYdxA4VlAan + vH66OMJf5lLLvwH/SbJOJY+2WEzejoxUzBPVk7RUVj4a9thijTxQUBJQQGM0RSS9+Qo3K67MWsO/vfzA + JW3/a0zXq//+yjlJeeoHwAIacF8cOyBn7uAuBSonOiFz4GQIFkEJKmZhGLMg/0yUmPtosBFieF+JvkDA + D7oAMBPjAclM+IcJ5Q0JdPAOCx2BORGawEMlnOF7GAejkWhOhxbZROZsSKKwASqHO0GFgJComLX9qRqz + eJDG5vatPhXjicL94FfuCPQvXQVuKCLS3gwf1TraeYMhQLyAPMzBRHdEKoO56Zml1pjENl7Dc3B0SNGC + lkIrDcRVCBERkoYTJCHFS021M4gY2TKljxTvJ7dxGkrsWCNhEa+CpehS5ZanI6WosSmUREr2iPgHNP1w + BWMKi5YaxT0AlS8JbrrKp9JoIb/Jgne0JIvX8pTAXHZMNo5B3ix9GY5J4eWUxNwURo4ZymT+gDBn8ZYz + jWeZYGKAVtPUJWM4+atsFrMovbqAaDjpTdxBKzUU6ge1mlnOM3VrWyToFjJL48FVhWt+0uyeEHr5AuLw + k0b3bM48JceGevIpOtYKqL1E4sIv/mBlpP00EHn4hZQavktmA20nKnmISRjcLGMGpZ0QIRdRA+Ljn/fQ + zioAys4TrBB6wzRQFHEJB4jSjEYZqsIjaViblsIvPCFYZBc4qFEUpAiNOWuRTyvRwxr0CGc24iNK97Kj + GD0VZuES0kKVQyZHLlVMQDHJkw5ZmhFRaacJS2WWQKmcLrFkfBFL5WNoOsFxmeKrA7ueMDOqlVaSwYkl + BaEtuxZYeVkRGIUlKBUJi1f3eBGoDVEUM006uDJOxZhOiKn56FgBviozgYzaH2fpQU4oMgZV+bTfH1V3 + WSLIigPYNGAig5pYP1QmnBjopkkt+bxigfN042xsfUapsHOaZ1pB/REuf/yaqHc2hjbxhFpRrRFQdSl3 + b1MtVHXtCigrkPUQ7fIsQOmFtO+CjV+GiwEEoRowgcGqIAiTgRHiO92tPYxZDJNaSLlxMaSekKhD8+d1 + ZXAMAYBMoy/VpSpU1E6bAshlAwYVDkVZXwoBuMIYznDw5KjhqfkDIEbs8HjiKSSkZVfE2GmK08IaYRSX + K6ZWazFLYUXfYexyLSEu5thaRk43ZWvH7agbZPlCVzvcWCtCru1fATfk5fDtfBGRsXqZrGQtkHESHWVq + estVuSrHo3RNtU/pukHdLcuiyzUas3jJwLk6lrm0VEpcmh9X1e3JbgSPU5AYg/A6L5vizgZvybMtZutF + YWzRV42RGZJ9p0g/22wlzkMrX44XCAIoT8oehfQloadXbeLSepTua7Mc3YVXUtd7TkrnR8RXWuaZ2qTo + E4L62GdiF5cNf835n60Fi0/67Rp30UWarn99j4memNjI1m4fk32P8GJaMBEAACH5BAkFAAAALAAAAAAi + AcgAAAT+EMhJq7046827/2AojiQ4CBNaWgExBIGgrnRt33iu791ASLGcjyLjGY/IpHKpCRgIghfO+SMy + r9isdssaSKdPSmDALZvP6PRkcJid1B8YfCmf20fOg4tACNwzAnxeM383UT5QhYobYwYGX4trjzAxhJEj + UZQCj5edYp4pBpZFoCCkoZalqn9UXasekBMEBn6vtnMBehextxVjFwQHtb13lJSFrb59xBctw7K0zHAw + h14nAs9qTgijVdIViUQI0d9nMbOOfOon2WgDBty1m6nf80AC42TlZo1P7NSB2OGadUDPLH37KLzjU/BJ + u4RM+kFpN2YirneOREG0sCkjr439dDCGa+aDnrljIH2hTImlo8YmLh6ynEmzg0SZREbW3MkTQwtHHzla + 7Em06KYD3GzGLMqU59GkHFoEbUp131NsUZdW3QqxI4KpRCZxHVvOaxsO78CSXevpJ7xlgByZZEu3k0sE + cIU6rMtXlVuk8eRQQ4e1r2G76OAhQFAAig+POLFUinyY77mMmDOrvTLGT+Epg+ZWvnU5M+bNV95IEC1C + KkDKo1eVzujis7sqQXAMScE69qtKMrDBzkIlExhvq30rzzEGNYhkQBAu3ziZJhs3vafb6gzANvVge/Jq + qaN9h+ruNPs553GIT/byJnC/Zzb8iAxKaeEfN67fw6nVL/71R0Nz9Qn40SwFCliXMeQd8YsFwSSo4FjU + WBOahCE4AyE5E8Y2mzqCeJeDTt2Ng2GHTEn0TyW1ndiBPQDEkA+Ko0kkYkUi3rBQMAfsRaNhNmaAo32n + uVheg0ZllOMErjm40o8XBOLCeT3dxEEg80Fp3iQAFeUWalgaqWUJMPJG1FVKrTfmDdAxKV1NVw2n1Zp0 + 6GKBmtLEmRWedK6QC3JAiEfTU2CK1acS23RzpiOL9ZaWmId+8E48AGYpjVt4RdaRpZGS8FNBfHCSJKOC + pjBLqZ3y0I9cTf3VqGCDyQVpqnE8aVRigDUWRWJ80irgbKZBJtl9vlIFrGm9+okCd/1XyODFrMXWcE5i + /ixpXwpvOnhfRdBGO2Bw225RmAtM/EeutxSegGC54HCIbhrVSfZsas+s+y68UlhbD0ICHJDtvVycx6lf + goDXLcA08HFPehgli/AOxTn828PTzEvxxRhn7BeDGvdZiYX/dPxjDIioQ5u+Ii9HMhTCrQzUwSm3GhBF + gbwcM8QwKzIzIOhIfGnOOgtCJUTcNuHSwHkKjTQo77Q8tFUkNtMz0Jc0rcnSl5S5GtaKnNOblT1p3R3X + yIThy7/0+TAcPj2SXUqb0VFnZwU+I7MbI2wHWBPcEtTNitlioEpM0Xgj0HaVgDMpeC+JVhAIdU1HNYDh + eqcH/o+iG01amNjfNIK2OONUbt3l8ojeOUEGibrRpjCFvjhIn6b++aUYsZrST1EHGrrpDGPm9iXGzBRD + Oi3HKCPlPqZo68021V4bAQUs1iPxzMO3arDEU1393rUHO9T2R+6KmXvag18lcMSar/76LMXL/q/L+v3+ + VjNEMX9/4wJ6v8rqurv/dASii/v+t50opC8knikfAZPgmkqkpn4LfMXdxsaE3eQmgqCA2++i8gT+YLAt + iXtQSOT3QSxcZw0b7A+ShKdARhhAD4ho4WikNIhBecE9XFCPDCvzqC6lJBPUUN14ECa2/1hlFLwrIQsS + F7fMtcNeSmzC3BSyQ+L8K0L8/eBYqvimoYR0kQJQlAzJLHRAj13Ocfr7Bonw4T861CwdIBLIoTRXuhTO + AUYyEmJERLIiGbToULEL1eyYsaOGvE5VIrlRSapYlevZ8Q8uMRRnEimkknQqeHtb3hKOxog5RZEoYNMA + lj6Zoqld6Xuk3Ama9sTIVKZhlZ0koSvt8kJKxbKVszSDVwoly1wuwiyOkqQvb4eOTInSdsOcyV0EV7ND + JvNS6ABM8WIlClw+U1yJWQxjHMMra/JkgFt8I/ZsJrzQyCuB0TqWZrxJnJiA8wgCQ9ex/mgd5BgRnvK5 + F/qEsxMNRqSDvbxmCdokQkRZDGPvhMgJ+/bI9XEHZfT9AU8MR8bOFcSznOTsUHtypwgLNpQVUNqW5zII + 0Irez4ic69pBBVqCA7UxYwwyKeOuKAyRVYiMEF1QqcJ4sQ/FMadsWaOJNKailvlRjr7BIxsH6S0bUWSR + yylkj5xZrCD5xJLLiWRA2STTMxwtMk1SmSbRQMOncS8dsBklAXvoQFCacgNh+l8RP6qzWmYnrPPjIlMT + oicOeJJ9f9pFV1tiV9jg9X2BVcZgm1VLXi5WhWfMyaIUE8ytRouOlXIrqTSFzPsF8iBMWaZMmvlYBTmy + VdF8lR80QZjSTgiTTRFnrrgpLJbeTpzjtCwoy/gwdRZJlYfIWRCYhVApjQ+p7f3bltpyUL+9NhVc/AQu + GJ3rn1qcy7aQbNfBxlAz11YmoQmJBU8HtNKbPdS7OrDfavyFXQBclJh70AN6i6WwGNG1Yhm1bcTmq6r2 + iqG8/g2wgBmnxQELz1lkXKGBL7UrEJ2MvwvGw65EKj5hRpg0O/PFG3VrUwjjIMNRemurPPxhpbVvuULi + ZGhNzBKrwcCs9eBo4PK7Exe3dXWVuyeDZewmtC5qFPctg14hR9W8BdkOQybaFNdA4tZMMMWUOzIumNi3 + JmeIyl8sB+GMFmXE6S/LnYusqSCXRDd1+ZtiXk0apYHZ7pSZNPmB62I6W5M2pxSaL5TdD+msDNdZeQqo + bBPkiX3XvlOZpAW7k3Ixuqfokyh4H8Pr4DGoIT0fj/jReXWeuqKHvA5eOG3jfPCnQT1OVI4aw4+hjalP + Pbh9/pnVsN4KeGPNuPi9mtZXwhauy2LdNe9aNv279a8ryeECAnXYkTivDkjGWxFEAAAh+QQJBQAAACwA + AAAAIgHIAAAE/hDISau9+IaQu/9gKFLbaJ5oqoaBcRADQXBrbQryMAh272cCnYz3KxqPmcDAYBjQkMel + c7ODWm/TgKB57XpTz29vS5wIyuL0uUJOu9/wX8tgUca/TgszfO/7/xItBBd5gEZ2FgQHfIaNKxuQjI0B + L3UzjnKXFYqSmJ4eG0E6Omedfi0IaAA4nz4EqgIIBqattYE4TAYyuzu0cUupNG22K8NasgPEyhVKub2h + OL2YAQQuCDJcyypLMgcHur7ahs26AoxKr+Fu5Eyq4je5TervfeSvHTHugJH0j5D9xLa0AwVjHsCDCD/Z + C4dDX8KHEKdVk/ehocGIGDNe2XIg2Adq/YU0ihwphmMqECAvklzJUoRJcx8LtpxJsxgTBCGBUKzJs2fF + aghOepCi0qdRkdRuasIg0OHRpzQFGrjWCddSqFhrJrUWjAMkXAZgZh0bdSLXAq9iOCuKRItYsnB9aDEb + r27OenneyiXlNO7KuXXtskVSRULfEylX6fVLcy5dGIv9yLhVJAaFNYx9uj1jbrAVQUE819HFJrPpfTpE + jx40AdHpp25VaxtwoEzh10aVcIg8ktqLGFfflMD95vZhjOTuqhFyj7gYywC09JRdrHOzZM69gFaeHQVm + M2G7d1HCXbwJ5dWomzcdafgV1xTSr5/fIdQovuoxUGMkn75/EmD+6bILZPklAossBf6X2xJMPOPWEAmC + R8Qx2ShInz36oMNbD9wQgMA3wVnYHYZJ5GOFVDuJKIJ7UEm1YSAyQcGPii7lcNuCTIRoQUM0OkIUNLBN + VN5l6fQIyDBmHDfSSyjFaOQdc9SBnU9MxjTkk9qRZsGVJL0UTmJYxiGIJREGZA2Xq6QY5jpTwcIalTcJ + hY+aa6YBjFhITjcRVR00VaeY1XSEzZRGScXnBVaV+edHDA4E1VYddRVdKBO9uOh4/2QVYKRoBWEWmpde + Clhggq1TSqiMjUoqnePxoJsbZ6SGqkIB5igNrGYQ+t4a6Cg66yOcleJrnzRM9sV3AMDwK279SuAy7GWb + zLIsMbEJJ+tzYfQ3rUKXWIpREGYcoOu2Ppah5EPUwKCIjuQCAp10jTEIartwbPfsNPTaQt69+fbr778K + tQfwtm7d98zAoWoB3C65FIlwnY4Jq/BaD4c5F3dgzVuxPzxFY0rG/Oob8pE2notQr/W5iBUOMNy40hLW + uSwSjwQ1OLKPYUEis0Z5KvYXzfUxyG5LPSOrUZTMjItcDOrE8o3JyDEh5V+VbHmzGChX9GF4mlVdgcbv + UPJma0MnlHXKW0MdkdhkkoSKm3/BzGjaubXJxtgi3SkM171JobUsfPekt2GBIxXoC9UonZGfSXiY49X7 + HD7oTOwU3v5bNc1ZArjlPFWu9smZtqRFjtZNGsvW4GQ148aPNAoZAQUE9Q3prBtZ+aoO107j7XXlrvvu + nvbu7e//QcMZ5MQnr7wy1S6/pnT7OR+muYpLr6BYylpv+w7aar/7tame6j1SQYj/xavDjy9OSs17YZz6 + GEFn2OcpvEs//J5oaQbW5YCNv0L6i071jrCv/0GENra5n8WQVw8GRsdWMnCgX1hGipqIYghQ4ob/1vQj + t8wkNKGoUL0AVjQFKsNoPTPgigIYiAE+RDl7UCFiWCiBDS4DPhPgxCkEtqwxMaNsJwuRDuulsPuYL2F2 + IxJLMmcYBNUrQAMi0KwGlyYTmmlCsf0QIdYa5aAzSDFhgbpG4mbSIW+kbh1Ci4yGJDidRnFuSfGwYeto + lwETzWp1jQkdrHJxGDDJEC4L+YkV/5iRraDJIoQki5esxMZE/qFKBJGjI79ljeH5cZJHEQhOGMIqTHYM + KHKqYyc92Zg9lY1xpMxkLg61I8w1MpX1mkikOjOpUaUPlksyC6fS8qlXsqR901LVqkaJFL6gcTe+PIow + AyPJsMnkiFd4H70cE48v0kR+PvuCseCVr80IazosHCQL+pdMXJIggDh8D/geBkyWIHACOzNna/JSzras + Czj1XFs+PyBNyslrnwm5IBOXYb/prEliflsfOeVZBBS+sRUF/WToD9AjLeK1B6A3VFr3KmYfI94yM9GL + FkbJoqoo3mo9A83iSFXHRet40XfdMUYWXTjNNGogHyv1RIe2BsR2kUg/dlwPipr5mZxuhI+0uKR48OgI + CsYzXo8TpAw7aLTOCYkhMB1fCVXZESUp1XtIIwFN4djVJhEVYD78mlF/sMhIrtU5aSXbW8dwJk6e9V9v + u5sqpxJKDBDFgFRMYSmVQgtU4i8pghrjUwzFrkTJ0HNYgVRQaPmVSs11qXpcrC6D0im12Eyi06nVqu5K + UmiiVbSl6pgoEgQ90lpMtNakHK+Y1tBc6c6btOwJsrLnA+zhDbS1UMVGW+cs6bXzZdn9quheXHvHbl32 + BOAyjLiA+zVzlVJdL3hunQoKVWIy1F6aoS5QmSve8pqXeTw8r2ZiZUQWqfdnC8MG6bT7XpSwTGJBoFh9 + yeckIn1Wnu5liceAcNWxBFjAJfNn2UbnKM22TJzEgJnOINwKoDXuv0aRMBUo/Imtus3CQI1qoQpX1ajR + IWlx6+kq6KYZqaHYbV6jAHnHQVutPS03MYYnfeuT4+iouB9nS4LTHkq134YUKUk0w2+XRuQWshicfWXF + y9q0Nw474jp/a7DgqEw4K19ZcopdiWE1J2LNgFmLfYuHlyVSDv04TsuaceOaA3Zg8s23BKGQXZlhk1kD + suN1sXBDXZv3ezQ34u6jhNYG76qJ6EQrOniM3rGjQYFbSU/60oA0LabJ52NLbxoItv10l4o1VlEDmXvK + NXWhZwyR46q61fQ8RPka/eoa9LMH7NN0rQnDGm5yaGwl3jUBF/qDcAr7fOu0QVzTeex3vLOGJowAACH5 + BAkFAAAALAAAAAAiAcgAAAT+EMhJq71YBkPuCFkojmSZBcNFGKDpvnAsy0Fdz3gZHF2FtrmgkBIgACeE + w3HIbDpPAcFgOhUIls/YBiGoCHrZsInQpQgQLLF6Tfsa3oR4fHBlvwYGbktgKNv/E3x+ZwYpgIeIAChw + dDZWBI2JIUUGBzwrhpJ2eHGWHFiaoUOLHHU+A2SgoaRvfqJrfG+Fqq+1MKRkJ6iutoo2vWw2tMDEIrF9 + w0UfxczNzsC4wxJfvM/W19hPlLMj1NLZ4OHiF3wHXCTK3+Pr7NbleiSQ6u309bXvppPy9vz9xO/LjHHz + R7BgolgIzonAE9Cgw4dhtiEwEiJWNYgYM844NlGVG4r9GkOKfLHNnB4QjlYgG8myZUWVlRIWIINKVkNR + UfK53GknCkxZQN/cXLVMp5AodIzybOkzaNChoegEapIu59Krir78hKQ0ao8oTVCZuYh1ZE4rV+YB2kBT + 7Qi2XsrKtYYCKg64E1DMnZvTbbsBB/xI3Yv1B4CuBTfwQAVS0g3CogYfDknKrh0pjMlCZhNHg2aDfp1Y + cVRocyK2UkKb7sZL0OpDdVW/DgF1hezZuH0Iu21CrwXbuYPfQkolKe+3jZGkEc78rRs4crgeD5HLDJrp + zeXialTjUaQsrrOiyZS9fF48pbCgSBWGU5IDn8zLV4S++oX1n3McGzifJHZ6x/7kl44YwvQHg1ZV8BRN + N/YZ2AseaaGQ30PbWGYGew7aEl4gExqEDzr7ZPgKXkSQJ9KHyFko4h87gEGBig7h882AK67CgQVF/AcO + QjAexl+Np+XRmosnvoFAYCMwpCOQMOABj48dJqZSRxW1wuQqK1gSR2k7cZTchfFdqQkrfSxVUkIR+vIc + YmKy+MtVz+UhE00w9djmnXnF6ZRNSzrHJp4K6umUnUyAZRiLVnwHaDFNASUdIoOYqMZo6/W56ChoUSqJ + KZD8YQUFnV76moTAXVZBqaI+0xcisQFyE6qpMmPYn/1IEcgBksYKjGRR0lMEJEkspyszYmVFGXqEDhtk + W/0sWaosVVM4++y01FYbzm7SWotbTsVxp+2iSEUHE4bfihkupeEKlW25V/kEVaPJsnvXusB8YeFz8Tr0 + WEgISkYhKtIEuFS/vf41S3cFj0MNcurupCTCGG04TcLg+DThgi1JfBjF2ZB43r9fYnAGfBz7euMpFPLg + Ab2OAUzCyGU2q7IF+XY8MxEh81Opc0fGbNbJOLMcpEKBEOnPIhcPgIbPIm0xJEROmqLx0Qx1Y46VLUW9 + B9NSVnIJlw9ZpM/SOWdEiZaYmI0e1hBR0iDOS3Nt1tpyU/gmRlHAkZYvUSQEX5gK3i3vXWtzRUABCcX9 + 9uAGkrlneozX6HhQ5EYu/mK6jtJq+XwIoyX05qCHzs6qopvbxaGlAxlp6kxymivr/ZEqLOyXR7sZ6bQn + VkXJNBT1ee49yYP7GrwC70+xE/9RLFjG2+PxZD2VUnPzjAJN31q2U28PYILxDuS+Tf+OYxLAlp0qwfxO + EYf3hDdMLYSOsH8NulWPqa3Gn4bdWt3a62C9Bq/jR21m17/e/E8C07uGb06lBJzsJlbPU4T5fBWyJIgv + L8ShwmhE5TQvGM0fbyPEBbMyrugoCk9amwb/+BGevoENe4yIkHc0l6GzfS2A/XCPJyaYBVwoBT8j3AmZ + 5IeN/SRwBj7UxeLaVKDwgQ8QAUpGiArIl/p8Y2FU/eSLSnrkjSzKBUUioJEX4RQTGk5xjDyRUYqCiMZe + AOSKP2pjxoxEtAwoSY4KmtIExYbHNMqCSuRYAQ/72DaVmGRvKWkFGwn5ijiZZCZSqNMiKbPBYTXqce4z + mxQq2RPfKeuSezritYSXv00MYlo+2coJMYK8jSnvK0RsXKb21rT/xfIt0pskIydhvQUGI3vyGh7UkITA + WzZvVroMRiXKl0zQNPMOp9RIZZ7pD8ysTxydMVbTroQuPuCweszapWj2Z8w1tEqcThggNWeDLc7lClbB + zODu1lmxChKwXJcU1yqDE8LrMG47MrQXDQnTQkJ881k+VM8u6HkNHcJnkJb9rI9m8FMeIzLUF1gRmD5E + GbgnunEO/mqWFRlUzvchowYhbdoWr1g54+GvpPMrI4g4qq0I+rJI5uiQGI3XopXNMaczOiPwbApRgvAI + jjS1Vgcv5BKEEJM2cQReCqHkEonskW3Us+GWDhq2P5btIxd1J1Bg2jFDoukX3VHJQFPXxIHBJHGQrEkm + 0dk0QYUyrOIQZk3tCpSkYoNba9XB6fzKJFByYJ8QoZTLmLC6yJ1FUyMpJQBCNQTX0TUcvIAn4dyA19Xo + 1SGvuifhCHspZGrEVtPA1WU9EE28zSFYnU3V8shKjGmu9j65bNZtdUHa3fr2txV7IHCrmqji0HK4mv1k + jBxk0VLkJiaS3ZRrb51rC3epB1+xvZJHwyZUMEWVKdmtLEhpW93FZkCjXRqvRh5mlcQu0QcrddjB2tvV + 1pB3FVicxEjnaF8KHfCmVIMozO4LThxxdR09pVl4SWLeivSMwLW92YsW7IIEB01fDcZA30jGlP8WNa9C + 8uC/VniepUEYGiFm6kOmOrV+LOKgArgaiVcspK2d+DRZumHEsDo+slF4FDneqtrGajZBkqUIcbtxbemm + 5FUIjkKxSAVKuuM3OPzYCW2lIisMh7iEMLfJ1P0lJr985TC/hW5Oaa6ZdRZJygV2zePoHCfhTGeezrnO + UKZPmfFsgsbyOUYtaKDsn3XH2UH/a7rOu7OhXexJaCVl0YkoXqFI+WZI42C2YXGRZC2tBtQQ9nlgNvQ5 + R9HLA3P6GdybQEoVuGcktlpV5GMMhdF3WvW9V6zfdQb8IBaxCNVPcgrj2qaNSs7d2tTU41Dn4CIAACH5 + BAkFAAAALAAAAAAiAcgAAAT+EMhJq72YhmG6EVkojmRpCp4xBGbrvnDcbh0BYttwy3wW/KyecEgCBonI + pFKE6giOlwBhtaxar9isdgugGQhQjMDGLZvP6DRR2qEybWG1fE6vX1EHxC4kddv/gIGCTAZ5ez5TcYOL + jI1meHqKFX2SjpaXmDyQfhkonJmgoaIhTQh6Ixyfo6usmWwGCGCkTq21tpdNsLIXY1+Vt8DBaK95kSxA + vR+/wszNdwQexQU2A9Bty1wBAk/O3a7JKeEq2FsbLNxJ2jro3u0y2tbi1386E4c9lNrs7vwu8OFT9tGp + JkFbEoL27vVbOELftifkzAT4IkAVjy8VFDLc2CpHxBL9EwloGMCxpL9tH1sNOLCjnsmXIqScS7lq4pdq + u9L8gDnIJQCNzGgkUlMRJ1CeaBAaXEhTSUVkKpDaCflU6pZtGT9YpeNxqxZVHZp6HfvOiFh/JC0QOHCW + rNuG6gbIXde2SM4Ja+u+3TsJHIG/f3XoDUGGggAEBgbz3etFBUR9ARXz0trlcNTFmGF4gWNhA+cqHP4e + OOArs2kTm49WO9oj17jTaySzysWa0hUjsIeMmeKT42ZsY1jntsPhcW+Gryxm/Dx8EYpDWDlCEhhlaPNB + Njun3TjdrvLrcwIcEGnhe7fp2GyDDySevIa7/UqZl+BJ9vohE08Zds+wlynhqf7Yd58QHERCH2UbvRLL + L00IN6BE0Iz212Ul5bKgGNDA9yBXHHjgYDfE/LcTMtZQtyFXQCAFjjTUxDPfiTC+8I88KbyYDkoxZjYj + jTYiYZA5ZegjWI7fTOhBZGfsUFE2KHkmIJG3PdRkGuhMwUV0ElgJZW4b9PKkGBVAs2VNOEok15cYcAIN + mmNaAaSJzCxJ3wHbtYmJTx92FJg1bNq5hFJ5dlTNa366QlGPwPRZaBVdLeroo5CeaJaikcIm5FyCUVop + YxUBZiRFmm46ljo2PFaRB4iKOiA8qsyYqqrphErHGHVakMyrzey00G5yBTqKk4TQ8hKvxzkT4A9YOhNc + Q/3W4HrLsfq081xGvhYp3G8VIkhftZhkN0mtwQAb02GkcdsRRt+CiG4FzloiLhMIlOvbuhS060hInWl4 + y7s+kKttP/hOoq8t+UHHnzA0XDsAYv/yU/By3hSIzrTO0ACuraZQVJLEQVBccYSxQHNxMA3yQQDDA7fD + Rh4Tjhxuh8J6w0Zh+TLcMFMw31xxiu5oU8NjXWhjCmmlwYQbrIzCHBABBQx9pLlIW5ozjcxFvWVj8lRt + 9dWdpvAXnFtDiayUsoZt9tnIlYn2oj/au/ZwSrr8doxVyj23pDqsebefjY6q9t499wq1ZlSADXiiQ/2N + BZ6Ht4PQtlz8VdDgjTcS/rA92RxaduWZ87dBkGdy3s1KLVEOo67Ibf7eeDip7haxpuMi19dqeOH2icUB + UWycxlE4jNUeQ34edDqLHoO3I0UcR1jGrzHeBbcv8rlaiYVnFqTt5et6FjJR7zqymNLl6MP7eUMzfYip + vqOnSBbK8YGxO0eZ0L5nA3OmkGl9dYTjiexOaCcjTcrc1KHzTcAzhjtdzuLnCNdEDy0/88FqxsczgFXw + ER76hXqaxxdsvYGBHPzYPD64vRBaojvMeqAJm4HCmFhnhWNBTwpLCEP55eFF9alhDDvwH1QQSodWUdAA + SwZEr1hoYL0YYBF9Y41iQCRoM0rgErkTDxZ1bYRc/ZMi1+JBox+qrCKKw8KbaMiTHclDhfdKhD5CxThR + mfEmWnwWf5K1OPIsRVUOmRJD6PWTzlVliobynN3SETq0rbEfpJvA7gDpwpk4rAatIxLqQNHGwN2EjCyc + nQEtASjkQOkpyKrfvTTHSC3QMXjuKmQpF7e86u1tUuuZXpjYMjfwYSqMpuneLDHZQb94akjDMaBlePmW + xuBvG+2DDcXoN8hNpSYOCCRmJgA4mqKZLTUhmCDcaiRNDXQTDbRxIRpTN0lAwO4lHiTFJkOYux8ssmfN + Ao7+modKOsanEAYS5zfBg7wDNjNO+HTQBkOYvfLsEwsy1CcMC/qeg96Bhzj99CIHyWePg8UHGj0UQYBq + +L6fFE9m1rhQJ2K2wpX1T5S78oBIbZUhh/JzgUZrooiOgawSuTSWFzTJikwxjStKdJUleeMZb/qNOGIP + HENlyjaA6SMQAMmQu/EaU3vWpGrYJ261lNIT+7MHLRGhbkBtxSHE5KO8ubJxh+SHms6KH1Ueboz8kNNP + 6BRWElQSpFPgU11RYUcQMsIzP91rZ0jpScEWwa2GTaxi3QLLxSLlUnPZqmMT1ClPPY2ok23qakx1P8xm + Fh+0guatPJujcnqDVurEIjpJK4RzqsyqwfqoO1zruHGMTVrrFJhqGQItewqjnn79AzwUVgPWfvVfvv3d + Vwe0AyLYjitess0VH7vwT1Fcrl7GBYlz4SWvBE0XAOMU7nR1GZTt9gu6wR2lRcmLMFgYrLnR3QDD0ms5 + 90JsdO7tWHRrkooRHAYxua1tPlGJMJC1TFokrVlxg2pg/702BfQVboY0IgWbRfheMLWgaXPVBDiMSGjQ + taZJjlbExiytaSHW2Gcf3MWfZXfFEOziPGEcFJ9+YcY03plWX5zjHg8nrT5OG3V5HGQYYLXI8QmCV5H8 + Wi8xGWCIDSIun1xeRxJyHVQeiJLSkTijZlkJkqvMQeZ44S/7gLD44WOZzYyDKPPgurJk87NYosg1K2HD + KiOy5daSVyUGgrbSbNKknRPUofAuThnuHDRRelddS4kCuKclnqINudx0ja6Ven4QQ7FbsYvpTZLXk97z + BJZpHGjo05KKS2S9nDn9VNR80Enf6XwJmKkSJ7/wO+38LNNozBjTVLthNff4d+Da/gW6fj4NNrWD4wlE + AAAh+QQJBQAAACwAAAAAIgHIAAAE/hDISau9OOvNu/9gKI5kaVaCcSBCFxBDcM50bd94rtPpKsibV2xH + LBqPyOQpZUAMN6mnckqtWq8hJoLFGRik2LB4TM69DE0CEMNsld/wuDzDTK8pAQHBoJ77/4BXZypbPzIB + iHpoP4GNjo84imhbCAUEAgN7aGBYeYyQoKE1eZpopqdfd51DnzYBAwMCbqK0ZaSoqJxYsROzNEKJrbXD + nZKmMMJimRJ5N8u9vsTSVZ6yhnEBfJiqJtkEKNPh4maw3N18eAPj61ae5uwDB7O87PVIrzLJ9S8HMAR9 + gt7ZC0QPQDR7rzYJNIIp06WBoJ41g4gnjCxECdVRbORt20Yy/bJQGDj4EVu5kmN07VmIsiU2jIiOvLpA + 4ABLlzg75YHF82KRF9xW5hz65haaf0hj3SzxkIIABAaWEp1KJCEfpcGQSRWRwk0eqBqpip1i9RK3V2Z3 + ePl34ACfrWPjdvOiLQNakjXqpJJ7D269OvrwwPALAibfI3pgFHRZ9qYevIcheYkRLOcgXRYeE45cpisK + yAN7cOEAjLMobxZmuhQd2MJg06EC9LuAGSLrm6VhQ5L9rQLQ1YRqO92r+1G20b16t9SCPMPkzcWveGEB + xDNjTQgAslkUffeetv++DK2T/Z0i7d050uU+dNAK6ocSaWqd3o/hqcbeW8JUSnj9/9T+GIOLKf6Z4ROA + COIhIC4F4tAMPlPIclKC0pBSylX07TALJkm4gxZ0FMJRzUUgmvAJDEmENAGKIbaYjiIlghCNUC6K4w4V + rzRoAxg01lghKzE2wqEEAhwQlo/EFARaOC/400+QSI7xDzNLMkmXjlEG0hGWTGZp44RehinmmGTeAFNM + ZabZjYQ8YaXmmx7shFR4R2UI55tykiinQnf2qeBrvknCpZ8/QSkkoBcIamgtaH6UGCxVEvOhBnmYEqk9 + jy5mjxeGvHIpLY+Rpsmg4nCKkYqYjvQZQqEGQRd6JVkHDULo+HbkOJNy8JRbnzJZazoIzWYBqY6g5cKu + qraE2rD9ixb16wS/sZMrpcj2Os2ygjVrSxPR6IEQp6QNgACvjHGLgnLwcFtdstJOpusW7LU03SeySvtd + P3vcuk4blBIA1Vs4nQFevhRZFS9CezSVmr+WtrceuwVjtFGl2kicyBZuAUzUfYQaYTAyBBSA8THWduyi + wQPWqa3JxaGMS1os97nnMTDHTGgw1qxs884813djzyY/SCzQPm6oL9Fqnogu0njG0iPTcOaos6QHQs0Y + JlXLBKTVyg7miRJKco3SM0SWTIJEZosd27MGdajN0GqDgi0Aqt0DZtwQxTNP2mE2WpLfOKrgD6wdZ8o3 + JA39c/hcfNr8XGW2UVbp0R32XP6vQYv/gSqREOPtINt0Uz6NSlF5rgNvtE0dRt0U1KS6C2f6OTczhF9L + +NNKJNJmLHZmeVy3S4+jMJFQvY6BUXzMqRSc866buR/WfSUejq9i5YlWeN4bnujhrFWTW7X/9Ko+dxkf + F8rPB6IX3CWUBdldd3I8scRVABYEoqZ315iuw+ff8qiOqZn/dMMaF+BvgKYpoKjYh8BYEaJ3uWlgAifR + oCiYT4K10II8ukAcDEZmEOXRAL88OMFJhO88FyThaTTxnk7RzSi9U+F4SkGJ/WSCQClsT9ZktqABMdA4 + kEpfnLbWMeT5MIed8NoOiRA2lhkRQ0jcBbo2VwS07WxE1/34G9uEGIS3RVGGrngW6zx2N6L9jCJ6m4Cm + wCgCCMVQUjUZ3BfnJ4omFuxKc4ycQ7h4BCv+TUx6cpdxvMhGKlDxcoCQWiGpQLo8AuhMjvwRTWwiNt21 + aYn6u13prIa8OWEPQP17yiaZVhbryeKT9YmeKLkXM/edJRNvlIv32qIxpLnPLrBE0PoiaRdeigEwC4mg + z+gXB8M57CgB5KPjUgG56zROhALE4OWo6KgHGvCHPZtd6HBymw4csIGoYxZwfICbbyIwnNkapxMc00EM + /u5c3JxEczDwHBk2j3PK1BJ2wse5zrlTewTLCXlOmDBf+u5h+SwWCwsRk1PNx6Be/ZKfQEuhn0vc8JmL + HMsTj+ijM5qxh6fA5iPYpC2hQfSDiTkFKgtGokw0y2iVtAaJluMLFuUFCDbNqDRmNMoZeAp3cfPoQHjU + U5+WMahEjFwvjKRTEdhxIE3KxJOaGoIp0S2hIsIjVUOwpZPKZKsjUCRYx0rWGkGyrIfxxO6yiNaN8WdO + JPNqW3PHHz3xB6Nz/QgpdGEUkfoPcKExJ5EASBXABlYxWCXDtC5AMX+ixJhoHAlG1jiOVvULryUxVTP/ + 0jlqMsmyuERmPLuV2E6Aboxf4qdTxuVYiGgTtUwSVgX8mtXgMbZa5bItbZ0VvGitY7HHw62yTqtaRpnL + Kbb9vRa4XMXa0mLjuMkZqrrw+a3piRBerc3bdA2S3QoB1Lqc7e4L/lXcfXyXlT86hXNXlzC8jLdhlkHo + 34gJVSaYpaFfYW0tLUNfMH7MaSLTb13yihKXDSiaBL5jylSW4Ktd9CgIbvB8ZRpLCVt4kUK98NVCJ1cN + p6gX6PXwX3CaXBG71mlFNbFejyqWDKv4jvkoKdYq/GIjPNWnSlxvjTvgxxqQDXM7HkNXw7g0HQeZUixu + nxhDfGRapFEClE1khwvVN8E5ZMps+AekHAULxUVUq4943NcidyrwIgnLdOiskQ3Zre6C9bVMrmNQUlxW + dFJgt7Y4muvEdNY5vLa8K2CcM5pPs5NL0vge0B3sQEJZvCh1UnmHtvF2ESkOVYLF0dXr1CmXV5TzRpYt + 4Bv0bsb3ygivQr3VxOGZx4fL/im2v66FdYvs1y88N9luooWCq2+tT8xmxtS8noMC7+efCAAAIfkECQUA + AAAsAAAAACIByAAABP4QyEmrvTjrzbv/YCiOZGlagqEiRIAJhNGedG3feK7vdxAbBwRCEHABijAVkcds + Op/QqC2pCiIKBMHgZxgYpZiAYAkum8/oMFXFbne/6aMXQO4NBuO4fo8Wc90qc3x4EwI4PnNjcHyMjTt+ + fwR4i3EEBBJiOFsUeY6enz1jokWeATJalCWml5ygrq+wJwF3qaoyFLOxurseYnW8IwMHhhKEwMfIsy6/ + yL0EB5KWtVCkzdYcxnTXILOB005aW1nb5BWbR8TlHd9PikUDXerlq6jysZ2FBun2zbOC/K7+TYjBDqBB + dUUSFqSRywLBgxABIrlDUVETH5QeRtxIzg8bS/0gJzEZxwmBgYUcU5aCF4gIEhhZUIpIQUyMyQEqc/Lq + durCrJg84FlCcECGTJ1IzfAk6XPLvhwp2AhMeqYa1XxKviE6GkLh1TQw7zzVubQgjLFf7cHz8vKqD28c + znJNq4tmBXw6UwRBa2ErXX6mDPTFmVTvkHWS5v51terC1JSGmflMvFhe4woYCwNB8BjFm8oIDRzmxApp + VCF8KaxVDNoTvCFG7CZ9K3pGhqipWwN7G8RSvKtRa9dKYlt3R5ZK0tK24vIIkh+SjVvzSneNFSxauHSW + zn3nGkBSWZPwJb67eUzfAW3nkUkZmDG0zm/02EZS9CbptETxJae4/IO+/oxSXglkWBIFXpL8p6AseGjU + TgUOLjifRWD4MyAIAkUoIYAz3MePfhIIcABhG0aUTW6WWbIFNBeW+Mo5maTE03ouhpYFjQa1WCMsFu7o + 449ABgmYQjoKaeQHvlAkllVHNpmDGOKA9JGHTlbZFUzuQBmelVyOB0NnVODYZRxMbvTlNGEWOZ2asISV + DUQ/aRUcimaq+CZE8Lg0C53bnMUBbWIelGdCdwIkWyF89uPnBmVRdWiIiSajwmBwbrGQAETpM9ukmJEo + ETSOsclHnB1gWlSkloFqQaDJqIqLf/aQyqipmiIVgKsTZJajaE/BUGmtGsySKaqhjVZIaQa9Rsaj/YCt + FZcQySWlbGzA5hjDAdDE4KlBuAVLgElGUcVbtr9FxFO05sbAFGbfskFsrMhVO19CMkYVEylICFFUuMrR + O2YfyNlHQAH6TvnvwX/GC94poiJc4rngAeXwxGps4YbEFGfsU4AUauzxxyCv03HIIbcHK8ka57ctyhkX + uDLLE++pIcwU92gceTT/BeXITrhHZc7zJYYzFCcCfdU5kEYB47tGl3NLK9ScwmrTlj2NycvsxUc1UsKk + U+jHZcrYcC8qRHNyynYyjUw4lqjNkFBTd7laW2ayJUa5SsHMLF6G9irv1uxZnSvW6jymwtiA5yr4BHHv + 9PIziK9DZMaXvRr+eR8nQ14VlEryPKYpxoaILEDr0mHS5T6tAZKKPx85bYh/2yObTXjvh9wkL9mHemW8 + saAtR0I9U9TZF7GE8eDHdwmx28AE91mFxufmVMz+qkRdGXMySlniNTa6waLcP/yDmHKFX2JkBfllvoSR + Idb4+tVt1rr68P93GvnP1y9fEqhhk7/+5qENC77RLQDajw0DfIG6dmfAjvyAOfh6TlYaaD8uXOdG2mHg + V4amMfosDC4yEgvzROAzDd4sPW54Xz8o47mg5KdkMKmPSFSCNDqM8AMGQgfKONacnFQuRPuRmgkpGDhk + NYQaWjMaBzfSNcbdkIiDW8YQlfIMs01RbM39KFoIQXgktpUuFksji5Wy5KydCBGKYPHbE22nQjTa4DEz + axqRrmiZx50EcBPpXOu4oysKxBFmHlyd7lxUOkzdUY6309MY2kbHa8zOkIQj2VLQ8pM96iZ4mSKeJKOX + gUq6yHlt7Fkj+TAnrWxvQ9dzhJvWmAzjmeWLFJwbf8Q1vldaknt7YyUv2venU1IwMJTSzF7cN8oj/ZBx + xcSe/NLnywYe8wiahIhh8BfKnIGuV6NTyWlCh4HVuPF1dIgdRwQYzQKisXe+iaSZEEg84iSzSctTzgNR + E0H63HJ9qQSOBYWAHYtx0Y0n/MPCqtmaJdLMg+AhaPPCwab2KJRLCP2VwQzrZQhZTaEQ6pSkKNxhmn0k + 6AYFyiZA1fGUP45AZofEZwuTBQeTnjSJ5svMPa0BIjqMaKQm0GLQosEinJYgjFv8n0+7ckYxDtUENjuq + Upf6rzkyNYDw6VzYnqqc7KxuSu+kKpmwpMjbZVWrSjnTBdIE1lx9FT/NJM0/3XJWtEria82K5t3Q5ai0 + pWRQ79ClJ8DXyVoeTR+E0qsq5cW3WPE1DK50FGEFOypO4SKj07FUqYa1KcF0Ck64QiaAJPusU80ms8Vo + aw1ulc0+xjV9tGLsK0jbl2he45p3ESlC8pQwytqKV7E1Ea+opVo9dCOjmAJXbwOyW9gNl0zX/SIXZB1J + 19aCy7UcAoJyxxmv4/pWXXzxAbjEGdTmmqt65rKXnpwT3H1Bd15TheK5BEawTJXNumX9BMQWlrz4+lBh + F5upfQ3rT6zuV2c8FO1/BwwygxJ4gxU974HNhNEFV8cIH3WwWxqUUgmLC6agMbCF7yvFJ2lhpRuOg05H + KzQQh/gMQH0jsgp74jTQ46ETWBx8W9wLDMtCcEeksYmG4cRkCJgJ6f1RYKzYPLtC5g5tc1I30vqiN9At + IqhAQu2E9OPbLBbKaiTwM3MMEMNVOL7PBACMHcFlCWiuSk4FxZYVfAzTmvkAVe4H5yqi3yfAljQRKeTp + jKm61U2UEeBwZNaHakW75SroXLjzxSAbgc7fMVEGwuNXkCZJiUqeNZ6QacOYdcbJDEyvFOAdZ6iBlD1v + bVrHZfCeBg6L6t349Xv1bXVdltnLU8u6HfIj5q2Pgb5ax3nXd1kBNX8N7GOJhpuOEWqxGfODBFqZuxKI + AAAh+QQJBQAAACwAAAAAIgHIAAAE/hDISau9eIi5sf8BMQSB0H1oqq5s675wDJeEYduiEMh8RkilXmXw + 45yEyKRyyUSWTCZSsxcwEAQjZbXImXq/4LB4jAoMslorxUxuu9/i5w7+HhxOGrp+z2eZdzp9cQYHIgQE + c3RSgoyCeRJHjU1mNmhwWERXkptvh0CRnEuJdFEkAgYDoapgW1ijq7AsJhWnoLG3MWaWuLweuxI1r73D + xHAkx8KTqRbBxc7PYaZn01GsiMwGydDb3C80N4fhGtpImhQCCNnd6+x+AzjjpgI55D21n+nL7fv8a+9W + gSqYuVKPx7tDBw5YKdivITFKAD0MtJXk1I1fDiUtypjCogGK/RNCYNRyjGOoeSIembwA8RqKeSBXOnyn + g4RKmSFroGIIkyHOdffOxXR46gCCoUBE+Py5bYsFNkwBFD2qQuTSqM4CFLowkuPUgCCUYnXoVKDLnxYR + dD23c2zDKlTPcUFrA8GdFO/Wut327uicoExD1D17wSLSvVlrJDyEyq1HBITlLkT89p+Nw2R1GvUrxZRO + sJT5IaM87waC0wWuELl4NbTrrKVvyJatd1K117hZxZ7N2k2QP22ejMsdeDc80GNOYGlTikhr4t2eQNno + JqAIMrMmXIfOnZWGZskrgO8eVc4bXc8NjhpPHidw5A2XQzqgrz1OlZibHiKiML19vkX+BLESRLX9JxpA + Be7jn4HcoMfggxBGKGF7yFA34YWMCDdNPBh2qEcJmYQDDnwelugFiFfUhGIlC5roYgo0YPRNWy/2YmFG + 86wVW4Ic3YjjfjdVFpkFHuXXD0pnGPlMXsdkR5Q5YbE4FpPyePURLUraCBOM/wy5EmCQZMlLWf6Q5ZwK + 6CgkZlNqCFSfgltZwONDZ3Zk15WBxTlEi7BoNVdSfK4yEEMl3LkmNGTmFKgqcEUyj5l4gjBAOpG6Z0Bc + HPy5T18BgalgXh0ZdRlWnP5VqWiKFVLDm/wYFhalXpok2GKrymrZqf0IBqVZlOLq3q2HPlSSrBYRtEOT + pyk02V79o9XYCERWfFfAab3u6uy1udzKGw4kYuvtCtBuS9C35M6AhU4jLloutvJMt+678MYb3G3y1gvj + BsDZqy8GyrG6777W+fuvvWaUpu7AJTpInHkIv6aLk2O8d3DD+o3AsBj4UUwZEUKRwTEAAmo8VqJSkdHK + nCIfOBdUEZ8xccrF2IFHsDX62OPLLoRQSCY4T4hkkESdcQjNMhDYs4Q0NUl0LKVQInDEGnsKcauO+goz + K22WOZMw7F0dTdYUoGyjvwQccLQfFdZLMsixNjhk2WeXAeKG9K7bKC2atmMtOuqct1s4+3V7bamQWA0U + noU2dl6X8TxBz7uzqqp4RgeVrf5Q2yd2Cd9EcecW7tK3eERjcJpLRAToBjYrk+rV3SA422J7zV1LPFkr + u4SCje5BT7dj+FVVYvXuMyF+qRC88BF+RejxyD84VYGnxN48aXVh6ovu0/+XO2T1uJo9hI/FWhrm30OX + +2Y1gezZZZ2XfyS6m6V2bm/fXqy2cdtiTxYWdUeTxevkmlH+pFcMqzyhDRn7Fw3QFS0AtuNjYfJYgFCH + IemU4ickoyAIENQ+950HbCyLg8tkZz/K3UUCQPOgE/7XwT5UYWeHaGF5ZLiEBNpKSjXCxNCI4QmQabBP + 2Gpa9IZxMhqq8ANT81QsFHbEPmCkayRM24VCqJ2+RRET1P1w4OzeZsWrCRBwj4vQ3tJhRAi1pHEmCKPz + EMe3pyGsJZs7XRm7UbmELAtmcDSd7f4jOgJGY46bKFIZmMcg1kniZz8cU5dql8h/Jc0mjVyiTqA3riZy + 4FRTk8nvYERIFa6Nipok3mGsYkkg6ClsgNyD8jjpx5R9knxHqgv09OfBu8kFK2k54QeYVEoUXqpThsvI + 9jDnvV5GjjFutNJgtDG+VHrrc8zSzGlUpL7YaLF8hsQluqglv9XgsJezw9+2WombEmpMgON0pm9MMBxR + 4Iuc9cOfGr9UkzpVhAPJfCMULoiWI2ynInP4JzhbJZ4uUuE7BkWeORuyCyjygInT/ZPYl/QhAPoMtAc2 + FOZ+ypbQi7bgYyHr0T/gOdAiBsajKyQpSlfKUtxJsaXk0RA1bAZTZp0LcOmqqcPOJURvqlSniMqRMGb0 + 0+zRtFWdzNQ33XJUpKYkkhmyJ79ctxdEroRKB/wRUnJX1F5gNZP7kBpU90CDrS4Sl5gc64fABoR8PmNQ + aDJUedgKMrdm5ZQT6GpUYSkVueYpb3oVhJ+ewtcCShUDhVLTXDUVAnWe6Jd4g5RZKaXWTdgyU5T7pakq + awxQvURUwZyJZgvHWWOkCpnKjEkIYOVY0xJCcnZFFLBkVYM9sq1XpbXsbFc3rB4VK33IutMdR9bbi0Ir + BwT9mNZpRgRUxIQrf5VsLlO1NZvoSpep85ONda/rXAtek7vgDe9Cw2vTuraWvIzoF3pdE7D1hqZgDnVv + eUa4sP7JFysSFUWScnvfF2RUCAa0b38ZAVIKQlAq/B1wVTiYhj8lWMFcKmqiQAlhE86sgOcNToYVVDZD + FDa9QHrwG3Ro2wqOdMN4+YjSTNI0z9asGGLFUdVEfE66UpgdT+xoc9cGgMC6kGxmY9dLOfFKFCehscwI + 8oukQbfvBgeyt3TIGHU8oS8Crp2SIJxUQruNoCQuttpjnIrSiOUMnbZWHKnj5YwsW24NVY66lQ2NmUMb + Nr+1dIg9XSiyKczilqhI9W0gZYWjc9aXlHjQNpokI+2M6BVscpA+brQYVpmCpEoaF5QOS6Qv/YXn8YSW + nGZa9ZDCy1ATUSfcQ+KoTE2M8DGztoxmNWKlyRn1zcjJshbEbuKnGnRt2g8CzvUaxMmbX4OLhUwAUbBb + is5iLyUCACH5BAkFAAAALAAAAAAiAcgAAAT+EMhJq704602DOcRAEAFnnlZQomzrvnD8DsJUy3h+BoNh + DCtdSzAQEW7CpHLJlIgkAWRzCgtSNURV9Hfter8AzxEILptRAilAYFCf33AOjxyvw+kUgsFq7/v/b1pa + XjwXBAd8gIqLjDIqREVFaYlKASQWh5SNm5ydE1F6PiOjNJo6RxUCCHuera6NPD4/AlppIbRTbDdRqwOv + v8B1sQZHiTzFUz0jBwfEpsHQ0ULDqBkibklssnjS0CrdQtptG5bcS4Lg0QIjkukx1M8S69ju9TE9tCo0 + 9i2WPuYX5sXjRzCDrlT0Cqb6gAAXuRADFUoM4yOFr4kGGSbsABGjxwv9AUBcAPiRzYGGA8tF/GgvJIEU + l1hS0IaA5EKbMgt6aJjqZU4behDw3NAD509+PVDKG3c0TCgEMTFo29i0nj9mI7hUXSMLqqZ1zrZ6HOaD + 6thQJ1GWqBXKoViM6N6uCcUQQYExdI3K3UsQlKy/gPWem8S3cBm/gP8KrlSDx0odUYi4NfwTFF1ipc4g + IQImsr6olCunGf3tjcMQYNLkuRi69RceYB/jUKPHtVzPZ+bIxsFNz27bLclMnshZ3gHWwI/uk8fSUohQ + v5O7exLGrFURP6JLTycmy1Ht293pDk++vPnz6D8JAp++/ZXIkSSVdk8/ThQjo2Qhq8//MJEj+f7ctw17 + /RUoxzoAIbaYgYrMVxJqBoWyIFwEArNOCMvBJUI84lhHHDsZYlRULR5KM48cElYYzYiPlKgOUza4CAwo + ZsFT1UEzyfiLBwZYNNExKanSjI7cEeOjRGKMpCIjQJogJIw5JWnBhDMaWYElSy7SJDlPEgmOlBxl2aAB + QwH1Iz5yDLAKlDLtpMY6IpLpEI4KxYKcVEIR4yU4Sc3JZl96nJTVnQVNpYEla4IWZaBQ6UGoTj3Isucr + /lQD05p/RhlpWVEO8tEWeg7yiFDNhPVWXAwCQtYtBBRAqn6TpiprB5smBquYsxpIlq375errO//9NcJw + vxbrQoukGavssv3MwoFbs9CiEEUYVEa77GaPWqutPCtAuO23n9DgG7jkQlEErlYRVm5hc6h2mHDorhuM + SmsQm8xm8spFnTyxojACFP3mKw2YzL2mZ7UCt2Slue8inLA9AxyARIjgOthmvDsc8pyi2l7YDkuQDGtf + pA7Lio8WFCs0iT5aOSsvnfxi5K4NmT5MBY9HSgSQDxjbnIJIU/YszKPjCrNetC7BJLR9HBed233xqbus + mz1hZKk8qywNEliijHKL1ob1uQLMhTLFS8vvbhOgLb0WexUIjn6kDAEINMNxF9Rgc4y9s+4acCviZJdb + pFdfeU2zqDbnqWaSPkOvz/XZuMGJkNPn/o/gk7dd+XkmlXloR5un17l1j4fOuUYpgW66eZ0LxkbJq4tF + k+cYjBi7eZd7hQWnt7Pe1d1zmdo7eZenlU8Yj7QF9vD2cF3XXcH+s7xYz1qLmK0DtikZ3004tsb0rV1v + K+wzQlR9Fxn+7Z74mHFf0L71gkHdtORGRhr4fSxcMCEH48/8e/orRGfO5bPziUhiE0jZ/3KApe81RxRG + 8J/iVoSv5iiDfLYJWeFaMT/1tUKCIAPCI9D2wf4t0A8zW4oH8UbAE/ZhZ6wI3XpAeB1DIKJyj4gPDdyX + nAZWIBOQu57Xvpaewqkihg8jSylaRMTT7eKI2SpX3oxxDRpKY27M/RCewPKmgcOhJ3AYnILFbiSph4Sx + KolThMcU2CbCDYRyLkxgG1C2QkqliAMCiaMKEULGk/DQKWeUYkUM10faYaB0J0xa0JoyutQFsn5ACxMj + fVCTN2LOhVSbiU+OAhahmMV2ehTbHpuSO+AtpWbMe9ugZPe7r+jBlKmsVR13hBZPfoMtZbGir9J4I7qk + BXrYkZ4ee+g87F0yclLbYjET80hPwOeP/WhMM1NlGWFlRnv52JASsIXD0ayMk1Lwlg5OE8VhpoM2PUoC + bJy2OgNOpDdIhEwLY+c9aJ6TNQI4jjl5U8GzPIdn+5RBB9voKF1u0YSVCag8p6nQhjq0PDP9fOh24BO1 + MUp0L/cZ4q0uapiMrkxAwuTobRBkDK4xVIYG/QKCsHDH26RUpSCaZYO0uTvebWWNMlUEiyLjEThm4HIn + 5WB2WtRTNqWwLz49pBvJ+Kac2gFnhEQSTQ/VJVLqj2FIuqoTXlqJqWKhbqj8kVYBENSnatWHkIIlwMDq + VFicVa0Dk1PVpBpWc62prUySqybjpBSu4NVZRcFjnjbIElH6FS6MWqXMbAoSuomCq51JbNzGIstPvZIe + iCrjVvzWKYvqRBvFuCUvwKpFNC5un6sSl6tIqyeR3qZW2NOca0kJW8DIdrakjF7X7IlbxXmTt70NbnDd + KdyRUguyxf2tAzeTyxdyMpcv64znc6k3T8oQd7rfgdc5JPFX7N6jn5DpSDK9q4h/VUcJ8Dsqef/QnUcS + bA3rhUV1GRjAcsb3fQh0QnfViVy89Vc8GoughWIqEw3uV1MhfcXJ9HFg0wQosLL67+6aKrM31fWiUKWV + iBIB0OIqsgJlHZohpKuro23iw5+AazTQOgF29ieHUQNuZ/RqpokYMWsMEqLXrqlTOY3twt3A0dnsex4l + ru1CMsZboOBGQoXMDawqJh7h9FZFLVUWZIqRsDem/FMvaum0nwIzfzrkONXd90tLzVyDz8wEoL7xtmz+ + xehMgMg4B2POKAqxnanQyDxrec8ZcDmJ644J6FfM7pOELvQHnwJLQyn6zq2Uyiv//GiY+MB4okVMkitt + B+f9Ei/Z88N1Of2JZY4vpfXE1X3Gy1H2Beal6auE+Vjd6mU28Q8DTUJ61ywv+31TSwgVwlV5/ejxqLO+ + 5B01QSI2MWIn8RLQjAAAIfkECQUAAAAsAAAAACIByAAABP4QyEmrvTjrrYP3XMgFw0UYgaiubOu+cCzP + sycMOC4IKY0FhB6FcBD6jsikcsn0BQQng4FApQ54TYKgIkCgmuCweExukaSE62eXxi4Fhq2kayiV7/i8 + nnaeuikkWkZIA1NEB1ODe4uMjXp9WhmBcm9SUgOKjppMIJt6cFJ/F0CYTR+Znqk0UGlXqmSQqBRQlK+2 + txOFmDa1uElAl7ITtMK+xnlwvTvHSXAHCL0/acXM1WABUxYk1j7O0NQA09zjZQEHBBel5DDeotLq6/FL + 5ugVQODyFt7wGXD8+QBlYIPGpV5AFaAQENygC9/BhxgKfZsTB6IIYAYQBNEAKprFj/0bgB04d8IOyA2g + Mm68ACXRyZcjClnyCBNQlGffUqyJ4q6mzwmnfnKMYgBnAS0DiP4TyrSppJaWokZdem2HQ6dYYUGVaomq + qS0krs7YgUNs1pNPqERtY1YGpRtaeQRqe/bjkx1W6brtkYbMsgl96wpORaKlXha9ThwebNcqHhJel/BT + zLgygLAAen6EO+eAScuCXc3xCSQNkZWgBVOR8ORnn8ipmWJDuphb7dgHId/Gzbu379/AL57aHbz4Y7I5 + 1BA3znzejSpq0WhuTn3Rk6R5r0eBXb27mLRL0wbznq+TTyiRoXInvdwXKx0153ZISfPne9EwC8ktDJPW + iO3t/jGj3xr1BZQMFwXKk1aCl8mEGlMHzsLgOrNp8xlE8nHQBSITYpiNPRc+RE86AToSSAhPIMChUxVa + sB45LdpUYiMZzqdiRU3FCNSDImakjEEWncEgCTd22ONCwwBpkURuRGiXLhoqFApWTPbgpF0njKRWiBB1 + 1AEBXrjEYpYk1RGfTFPCBEwko4A501l9pMmeeS89Id0Hl6V4o5hw4kkeLnG2QUABCiEi3Z+IwoImV5YI + kuijYcTJqKOQVsrJc2tRaumm89yF14ychirqqM5NR+qpZoD1IqqsYvAWl63GyhFfSspq6w9XUHbrrpKU + hdtdoPIaz3WOKZqCqcJiRQov/WXgZ2SyNSUlIRnSXvYstGh9OAwsfqyKbZ3aNliOr98ONsABlOAHLZ2u + BRtSUabxuOt9165zQ1Js5vGau8U1xGx/u9gJ6xj8GndlZvVW89cwOJarb7isDQzQUro6fMeILhb8GJdE + aPzDcLbqyJq8Ad1jQcUXX5dcsawO9ONL+c7hhcdAbQUdW61WSVHCzESYopkbo6HcXTijKlKZEgdUCBUj + 8anonRZqSqqkPHOTUh00N3gorjGfGpRQX+NBX0jiWAxpLBp2bTZ5GK1HzNqJtoNi2XCTJ/d/3tbNWzvU + LKu33VIg4DbWf3uXELocNFR4dxhpJIyXi3eXkuOunkD+cuTBYYTTfnlChSzmvm2lEAJHYTreqMDyKh6j + U2X9iA5Vu4DZ56hvxWjew06T+hjOJrt6o2oIVe0csa9QbWvr4pWXbBAXr8JsN7gOOsHhbqMo7rHuHi3i + Eqg7vRKzS3/xafiKr6b5MPROmkzYA3cvFc7fcXz8zKD/UnZQVgN9+983sfDO1tBN/1JBsS8sbjj2UxDH + ivA3GyTnCrTjjckqgDKz/e5mwaNO1+iQwN5AYmhsyCBzfEaHpAkLEj2ZRAetsbRDOM1hKOyV2oJzNf5F + aoV7oI8w/EadsKWCXnByEDX8M8CIYO1fYzrdUCIYuYP9Tyh3I5sNLSYycTmFbyH9oFsRWXMOEl2xKBOR + Ig7/hDEZffEZg5siDH1UEKwkBEkZUNwWKaCzzDRMNlGgXD/kNMeRFQVpZ5nc5VpyuSJSrS6aU4hc8rQ6 + Jk7Ph1nZilGQopQx9vEVv2Md4RKlPSrajitqtAZy2tMazMAtLUSZggjjk5ekLOdVDVTeIiFUi8B0gy8m + vKQ8EmNAPuSql5jr5EsmA8wakAt04TuPSQTgGV3SQH1qssJpLCms1VjLNeyj5gm7pU1OOBMJAvymOMcJ + Q5CRszh3eeAsz/mr50CnUY5kJ9iekx3ThVKeuUGPIlZ3z++x635aLIgS+wQhK3jvSYW01psCaVD64WJA + Hv04aJdmaA8AZQWid+nPHRGGFiJ2QIhu3OgTe1Qr6yEUHBvaKGkgZkW7dDFjIDnRCFLq0PqxFAD9JAxL + JxgkV860SCzaaUKHxcZZ1Co3+okJUHNU1CQN00dWUilSgcYRKUk1WlAFIFrItCWNXnVkYRpqTLlakjNF + paaYtBxNgBCmr5p1oXPq5hHs5Ac82aBQaJDrd/w0zkDlilB78gM+KyMp1kltsIhcFFcOi1hEmg4NjG3s + YHjxKcla9rICYRlmQVPKnG7WQMPI5WehSKvRWqYwFTRtYj2bz3iqtk6lcO1MIajX1+L0LeDU3UhtS8B6 + IM8Hw+Mob22xP+KIDK3D/Z3rMflQPdEm9yHnShdyb8ii2sIIXuUTZUPtgwP4bWpfLDxiRgG2BqpWyrpc + EOl0NfHEg2G2iib9SAHRK6oy0pG+K4gvYBjIKQTeAr5ihZG8UktGleVAs5twWRtPssGZnddm0FmlJuro + 3oeQ0AvOzZyDQIge2V6DrOYFSQubFmB0OiiF2BnjIc/TurOdWIbrjQEkz/fPP43tS6x9rnVAihKK6ngc + bRtiZH9sNTBOiIdEjkcUcYzfJOvDyH0LqJNFGbg0NnnKDMsI9zQgRyzbJo8JhZyXxyFIVBDyymO+zE0U + addGojnNolNI6ZLSlQ4KM81PSSXrciy72JISdptXzSQoVwhNPujWw30UdNEm7NuaBne3jfXU8nRKm7k2 + D8+v86yO9KvaO4t4yxL9bDLjQz4qmK/GvCo0bAd6h/f5WFbzkw0j8BfiXRWXVe11a6vCiar5fi8CACH5 + BAkFAAAALAAAAAAiAcgAAAT+EMhJq7046z3DMAYhZN4wcuglgOAQpHAsz3QdB6+t7/y0goIcJkBw9YY4 + 4XHJbOoEhKLJSXV6QAQlBnqqer9g8MeFm4bPN0JLqxKx0fC4vLLqSgT2uX51QOSHRW96g4RNASAWHoV7 + Bn1/F0RGi5OUO4cEF5KVYXx+ghSRn5ujpB0hiVmlX52aGSutqrGkh350mLJUPwi1G2OiuMBzH553Bo/B + OkQgCKmuQMjQi8p9UQYD0Uw/BsyCUCG/2OFUVyzH4jPKjbtBL0nexuDn8kdJ8fMc7+oIBSIDamv3AgoE + FiAfi4MA4RQMMrChwyEGEVqzR2+EB4o98AyA9bAjk4L9/1gUYRini4BrZxYC8NDMo8uPeGLi2JMjCho8 + FIq83NnRgzeMTyqoAcqz6IaFRC1tTFqj1VCjUC2lIrnzpI8DKKNqnWEGgLmGRIoQONByq1kU/iQUNEqO + 49m3kEKcZHqOLly2S+/q3cu3r1+t9Wb+Hcxz4cbD7AgrBnsyimORVBdLDgdSBLuCHxJO3hwMpNt3bjkH + FFwUSmiv/05DJV06ysavAlmKKlgOLhQpsAV+uNzVIxcO6VS/3J2kd8c6dHLX/X00c1moyCng9HjIQKKs + D2WjEIDggLGt1a+7DEA2k91Y2vF1/w64vAXhdd2Dej4wvYaC65U7JH9r/nlVtP7kAcV4uwE3QH7gbSNg + fx0NQ1J0PY2hHgLPbOVgDhD2pMYBZKmB3XEVAkLhN2ZN06E1hWUW4nhqiCBibWeRs+JO9RRFm1xJrITf + eiTCVaNolKk4EgEF7OIdFvoBqWQcMkoE2X9LRrlEkxK5IeWVlGAWEpJQYuklDzjEhEeXX5Zp5pnzIIXm + mnOsRQSZbMapgUkfymlnNjXVeeeeSv3E55/05DWYmoCKhtmYChkRWaGKhUJoGF0lyehZafkgqQ6VrjXp + YqdIh8Ylc23aaKdq6VlFCXCK6tAAB3RhnKodpEqQrDBUJxZ9qt72mlEn+eOiHlcEAmsFvoR5aThzhYni + IP20XpmhV8dCM50P7A07ySXiucQRCM1aewOpFMAnjiIWjNUtCoGdOyqDauE6Gn3mAovZYSYsymeAtrz0 + qw8UqgtJPo65Zu+dFxYTLTLR4bcskyqa4I5pA8s5DTMe8vRBFBz2mCiX11kJaJMHY6PNRHKQs28mJ//5 + I1s5zqENbKF4u6fJ4DAns8Sp1ezxzWx2EvF84vK8pM/oCiv0mj6DE/PRaOoC3yv+Mg2dGutw4IvUZ6bD + zZwzYu2lNlu3obHXX6bThyfthPnPz2QPHdLZ/DTGQtBYPioqSE4iRHear4VMw0VeRd1oRHoLXkjMiJ4R + qbeVHTSS4YVUeoffMdi0/hLlWYuZ2GrgevWpXHu3nSa45KYkKNZ2D9fqBK+K/gXgbNc31q2Qr1Z7D4vb + mFnonPUaBeZxZAo8MrfzytvCnYFevOswTGtwNKgyjwtHTzGfrpel52TA8kCGSW+93KcJ7/Zt441FwA5L + mTJ35Hsto8PG/h6+OAmzb+rNJj/CUuyEXUzAeu6SWf5I4I/haWVkvEvJ/BbxstkYbUkrG4WuWocXLOjM + gDwrlkpKlDN87Ex6XBMQBhGmDuUsDYQkQEQFsgedEhYtgajrnARgKI+kAeeBKIwLu1YSQJewomYky+EQ + FJSvreiCFxq4mhAxUDCvVCsqWuvhD0bIuA1RDHkH/WRB2CzgjR4uEWQ++sfZEuOOtS1QYi2zzdt2ETd/ + zO2MS4SG+fKmmbIlTmpzdBINkdWrVLlpj/eKyONWgxP7ZMQH9+PZQmQCxzM4TydLIInl4sgrobSvBz6p + HgpTpy0laBKTpwPhmwJXmqwIACuUdELuaOSa2TVSZsKrYBBT+RHlAYaWpwolLnfJS+sFppdSMgy9NgfM + yWgpYE8qpmQqMybvvVGZhPHMG0DzSkaxpio4tEUdY1RNL0yQiqMwZCJepkbcFIU4ZQBnJWxGgg6aBZ0+ + qcoToTUedg7BOd0Ew7Octx8VgiKRfPPiHRAEGH92AKDy4I95qOOPeHDHO+r9RI98wpVPS0y0XRVNRkOB + 89B52uiiPMyoDfAlnR3Wp0DNISgUiVjS4SgIQx49KRZVsIuunfOlz2NRI06E0HlM8T7/syAHd1qNnvLt + IBHNUouOQYQRxVSWNqVOGl9yIzfMJExGEqqPpgpMGQ2pSDySCzQHpSI6fnCsfKESQs6K1rTKzXH8a+tW + NSdSudpVepy866AsIlC92gaRfl2MJI0aWPCY4JOF9Uv09hrXxBr2BY2t1Unu6FhkrBKTgchrZVURyyVI + jp6bTV4/4NS5pIZ2Srq0BOkIe1qPsMpVprVCXQ0xW8pgwVe1vYNrKPgQ36XMTMECZPAmYiyeJIs2rP3t + HrLmyU+H8PNZicXWCpMbjW1d0rHSJVZub6CneKExguGU4Sg1xAbvosl7w4ysQljqA5MOZH39WtMcAzbI + UTQRug2pH4Wou8yGXQYP9a3ExIpqsRCMxTt9NZRz7LW/V4KxNAcRbl8GmIEClgK8NOJqmcgJVAm39sL4 + 9GBsP9wmd86JrSS+hw2Pks0Uq9iFN/Swiyex4g5vd8Zc28bTZoljn1INiRXmcY/r8o8tqiCqQxaZFt3V + xRsnGRJiXMdV1QYEJz+Zi2vcRz9CIuNkUPbKKchj3ro8UkX5sW/YJVyE4XhZMAnry3ptnEjSVwnLaeoI + n22uXxfZzFnYkh6ldAWzNFKbjNW6WLMPeS3rRoxXM9todrglxDW91WYCbRMOvmX0ZjrLlkI08wr8jROo + yCxYAT11U4sFFPWuK2jaYtgK3WV1q8E0L8SoFx3jszIu54u+W1dOQPGdNSjn9t/b+DoF+p2psP+2YEgU + sFn+A6Cu9RIBACH5BAkFAAAALAAAAAAiAcgAAAT+EMhJq7046y2FOYjAAQExBGOqrmzrvrAaGMR1xnju + eqCAbqWbbkgsGo+SwKFWCQiRUJzHgHhmPNaodssdzkIVAbNL5kwR4M3AkC2733DJOvTziOJ4EsFAJfww + U3d5g4RHJR9LewOFcVN9fxQBYjSQjJaXLE58fIKYXYcfaD4oAaWTBj6eqqtApZWsUadUaAUEAgN7fG2w + vL2+UJK5m8Obu1GSqb/Ky3HBxMTGwCJOr8cCt8nM2qvOwybZZIK3ZdeluNXb6YTI16ONPybhnfHq9faG + A5PoR50Ae/v3Ar5BBhCJk2hHrPwTyDAPNQDgGlIY1+HAIokYy+Sb0C9jCRP9BA4YKJixpA5cSTp6XMOG + pMmXMGbYQojRJcybLg7axMmzp8+fQIN+clVKqNGjFpANWLrUHdKnPiXhIkBVmK2dULOmk2prFFddWLWK + 9RWsTTeaYxkWxSkm2im0MNeypdo07rkNjlTyFGNiI8w1J0zpFShm8ARQcDECdnXtpZ0whusFi0yCpR+g + jydS3koj6cWad80gELm5oUzPJZWMoZCYmZPLokn/VG0j7C/aTWBLfE1S0mhUszvntk2WSj8xqddQdoKA + U/A0HFdLnJMsM2g2ZkA4/0m9DvDUew4kwm4ykIYSzSkBPSSeKnmTmjaVVnfIFgb08oXG336TaP8pV/6R + YgoaIqlnlH9pBbTfNwQUgEZ6NMyX4ISe7PfMJldRqKE2Fj6T4YYgKvOVNxGFaCIvgrVD3IkstugihQS9 + KCMrklS24ow4IiHOZzn2iEcy9Pgo5ED5LDTkkWXolFaMSMp4UGNJ3lBikyAGIdiNLPgFEZUtosSRhDF4 + WSOXJp42ERky3YIlmVEJlwSPWyjJpokDHCCIlnNyIBdPew4UEki65XkFXXiWtxRVYBIRX2tkKsdYosyU + Y857cKw5pHUdQPoLlBx9Jyg3bh4GZ0NtGPlphaFOwKiIo/pzgKUxENVnnmZGEqhat7oKawumMNXUlFx+ + cZx0Ddk3UXO7rtANDf1VfZPsht114ClGmflGKZqW5fOos4KyN16rpDIrnoFR8vFhJLgAi6SFmkY6zKo5 + xGfsBa+16yKCOOHrRl4AWXnqv/KSVNi/pyIm8LkEs8kDdOeZ8GzCEy6sLgUOQzynxL1VbDGZC6OFxcMb + i3UGwxgsFnKwuSCQ60T8ndykIyqjM8nKLvsICgh0CNjNxDXjKAvOtdwiDLwsMpnwsheClS82PBfxUNPB + ynIh0Rw6jIxG4oQcjDA0aMuTl5mSIaa9QrIjaU+1doBmhFT3rGCoTkTZ9pxGv1TnnWS7Ha+UIKO6xFR9 + IzWrL1rmTRZLcyd4y1SGl0FVSmhTKakk16LI/nbgesdy3LS9yJn5MqWO9Dm9ss4YtwWmjt6rr+W8WMIr + qWe+bLPctjhvB8iOXpm52gpW+4nVCtAcuC7LW2K9mJe0BlXj0nyy8RnU66IjLXGTvC95AaFx0a6swldd + QQVsxu26r+CoOY27lovHCJc/AqYQpa+MxCP4634Kab+JWSib2X+/nkuozU8wpqft/e88qdLD9TxxBo9V + 74BAME4YiHWTM9iJAyaDoBqM4x353SZlzoNIyzR4n/B8Sygwo9nMFggwlowwKrnAmVdIsDMWEkxfQZHF + g4KGi2LYkISmkVrSEpeVurkNac8g4m2u4TWnTUOJVELi7yo4itAMYUfu/TObU/YyD+LtAB5eBGJG+hG7 + WBVJdCQ0ovIgUUYzQrFgfKvgZwRgETFCoXD9oUtI0GhHI4wtX4j74f/S9Eay9FELnjukIhdpR1kJkpFB + XBxTtgjJDXGlWRiCWiWPwpXJCU1pm0xQWV5xlkfWbHBjNOAEQXkgU/6IUB6skBUBkR8UwvImixGMY8hH + r/W5khC5vFp5OMep3QwMCJb5ZR7gV0zTJPB0oAkhR34TS8sRC5q7CaAFCmkJ3ryPmrPRZgW4yQjc2EqZ + x5jlfYQnmzZdU5qcIRlyVsI5eg0gPdWEhbAmaJJoiTCf6wBMdvAJFH/CzzQmdE8Y7WGe6BEgPfD9rElC + FWGXYQC0nHvgZRIeWsv1uLCeqeleXADkDsYQyFzoXIdIQ7k73onBQWjIJEuX9NGktW+mUOkQMW6K05x+ + kkQp7SmKtBhUoRoVkmo86pKeWFSlsgKLTo0YGKM6ISfog6pVXUpTL5FUrD7laQ970kW9esesKcpqrSOr + Mv5IBLDFT60iupyiUjVWuCpKq06D20Lt+pcLyqGuRkAlfLaKq79RhbB4uaUcGbeuQIIOFY+CyeQEui5t + MBOwjdgcZnWXv8r0E3Z8JGtnAUDOQmBzAiFBrEAcSaNnRrRqsHvVkVY3SU26YZ8ToaBAyCe80OZods1q + 4iUMClLCfMdae/0tU7a8co0pmnailZuOuETy2ipZ5njpIiy72PIu1W7lutFLlypw+BLy+kw+/VIlX02T + zPFtdr239aV7vQvfGNCvgKWt7zL55xL16rceBNRefv8Lh44J7IEEvsfIKJPBBNsDFDHTQEMdrOBNRPgC + K6SwgmIoiqIwJhe21TAsfkaLmQytqF0VMRCEODUUx9GJ+QgxUlncXUvg8ayBaWZUt+YN4RaCrUNwq453 + 3I6zYYKQycrfe1V8H7zOdTWn5WuKSeVX0i65fGDtzwcApUzBJuzGFUXwGxaHqJo9jgRXxgM6PRndG8o1 + T8086NGcnKfQ0deprI1Tq9rI5HhJhXUyWc5Ervjc55jIgnY+NgJvc1doLyx3W4kmQvCG12hHmwu7PD3J + dMlV6ZiAt8kavWKNC3bnLmSvYQM2L8cU61GUujeU57Nq+OSb2EDr7rL760H9/CvGzkZZBREAACH5BAkF + AAAALAAAAAAiAcgAAAT+EMhJq7046z2F+QgRYAJhiFyqrmzrvnBsBcP3CXKu54FpHAiEIDACEEu34m7J + bDqfM6ISSm0iP0BEgSAY+AyDaXVMLpvPaFbgamvbwun1ME2v2++w9df9gaPXRn5mcgNzeIeIiHp7BIVi + ZTgSXWdyRF6PiZmaY3ICnkR2ho1nnhSjm6ipqkw0SJhQkRMmq7S1S5V0NIJluyavtsDBFzQjhsIwk5IH + A8fNzhSFHc8uPY0+v9PZm14SgNorNCa73+SbASdd2OUz6+2ouuru8vP09fb3+E5SUvn9/lWEBgh0FO+f + wYPDuhBYuNAGl4III/5b4+XTkRp9IErcWE/POCP9Vz5yPAjKXwlmGUJqtFfS5EKBsVhe2uDhBscSjaLl + qxHmSEx6JX4O8yGyH08ppe55+JmUnh6hMzCiQLi0QtN55wxElTlVwxoEBwxAxXeOwNaOJy4UJReuoACw + YhGWVbvy2NwKPeoKa8vha9ix9+5SyItWiFWzHWsAnkADgU2SBgxTKHGvhpAiVROD4fDWMZeIlg1l7mgC + SEOU9mou7uH4hN5yPX6EEJePRpvF62J/Hto6rkTbNnC729dvzYeHoI4ECet6JPGRgTGeKESgwHKHwqFr + zy2dD/bX28Pb7c7nofjzLBW2WWgMvXusnT69n0+/vv1MuO7r/waI2P7/z/7EkgyABAIjCmoFJqhKK74o + 6OCCAoFHlnwPVjgYTNmxAkd7FirYw4YcVqETABl2SB83HZSYw0LdqGgieoJJQgk6a71oX4w0/BGhjQ4O + cEAsI/JIjYTZtFRHDwdY05WQK+AEk0kCsXcHcDUyqZZYUgRZj0W2IZiLlS6MJomLzVxFom9gApPVWfV8 + 9AGRaQ6SJF2JXdAgHvsYGWc3c+K15HB/AnBnLhQNVEiIYJ4jWQeI1bNbB47B+YIeDjHUCKJMhoYZmkD5 + 9tVmuUhHkBzsSapfbAckSRs+NSwEV6BkAPfohebtCdxj+dSUUajHARYOmQ4+54+waeiKaTeNmLpngf2y + xhPUstAORpSztUa7rAdAZPehstbeh+2iXiXb7bWyHcuYuOPG+W2VZ7KbboU1BSHcUe+mGVtksHaAa71W + 6hrCK0jky6+J92YxxAhI+WDuwBaykcUW6u2aKIXjUupdG+7C1gXFZfi38MR78JExW8nmx4uA/FrskCP/ + oDjmGSh6k7InNOuZT1qTzcjFyAyzhHM3XnKyY88zcFzZjxNoSbQdhH0M23FeCBwst2iMCOwztqH7YhdR + X31HzF5jzWQ6R4C6F41UL00KU5yqObTazrhpQNpW5km3QTlaQMABd794kaFG70dYBXv33aHKll5q+D2z + khgp3IyJejCpLAOY/tmnQRMta4i/Lt7mCXuHJXW9m2tQUYG6guF5HqvbYuwG2zLLjypOKj2RVNSGDbli + Wepe5LScVQt5C2KS6HuA5cYT+/AtrIlX5rmWm8LyzIPTZwU8r/Ptx9RXP/3157a+SbzsepA984oy1ahB + SMjLAb3er6CpJG0P68O/GqgWvxqlqWo2VTbA3wUCJj5o3ap+ePOBwZJzBIUVMFrEkojDggAxL7zhgftz + ChsuprrDBa5nKvPO+YrkicqxAgf+Gd4i1mPC2lhkJkwQEPQ0RzOLHOQqp1jCgTJ4E8JpRUOu4CFjPkiP + XsytCfAQItCKgcE6DEgAy1DiGKxWnJdcQ4oi/UKMzMhiwRFiUQVlSQdJvhirt5HxjGhEo93SGKwSAs5m + bKQPRRL3nTjeZ45c6sIF7SjHkzzCYl5UYxNDkcMBAs85gyRkTo5XC77kLzg3eYnt5nEUn+DjWbA7JEIq + KYdLts1Mw8GkV3AXkeKBsh3OuxBXlPeWv8jlZ5Hz2fqSlkihjU4ScGGkXWBJS7TM0gi3nIYjvdJKBJKF + l8CsJUAioz6ZGPNCrdHl2cBFol+6Y35nkqY5eMKZIKADNMzclDbNUZrZ/K9TzwRma4KJlXKepjbdGec7 + TNC4c/VGnsE4ID5TEcGO1AQ5CPsKXJrDkX7G8VaXqs51esXH+RzwYsL9a+h5HuqGiEp0ohE7jkUv6h6f + 1IyjIA3plIgoUhihMJAl/YcMU1qfHbLUodQ54kthitL0OG2mv9lQ2nRxSpwGg4qsEBdJfboKFoGkCS4z + HlGbEcaaDoaX+1zqE5LICljmTaoj8RGQogoFOJJFmSzZm5LAyoLacTUTXJOSjahEVvlhyRJnPQSXuMmj + tpb1k3ENBdvyir4PsKmIj3gTVgMAvl46JXODWmueaEHYXw6unY9IrIX+NpChTomZh2EcUx5HMDYkroWZ + wGbx5HG5t5zzQbcalSdKNc8f+G+G7WgVAV5lV9hIBSqde0c8TYKx2rLlthn41YJmNyzidshY2P3oHlYP + e5zcLTcwmkzJRp9bju1NT2vUdYd1+4Ld7Govedx1qnfHJ5vydXC87YgXNa8kXvQm4l4CJMG+3EsOf+WL + gPRFpQLlxUCL3TS/BvrCw3b2hfbywLIADu4GL2ZgGXhspxv7rx1DKDK7AvUWJUPwRSmsuG1oUZpJ7WlK + 43MwfqKtCVBNMH7MqAMcwdanJmMV0iQwSaI2zbddhdpCaunVdF2Yi9NJZFrr6eMP402uPTHOi5fVVByn + Zq8Mo+qe5Obkma6xjHbim4qpQFkMLe6xstDylvXhWUuBtgmNM22VQ5raya32zDr0lGmXPGY13PaPFemb + bFNF0Dq3GLgZaDgdFVLX4DuumRSQDFehB2PcPZl1I80KHl+XxTu4/ia6JJguFk05abSCN5OLTlcqYwnA + bF031BUrLI0PDYtPK5rV/2nsDNipXRCYF9XdSl9mqWIC920AfmwUbTrDCgKp6W/C/XtnDCIAACH5BAkF + AAAALAAAAAAiAcgAAAT+EMhJq704632DIEYYEoMQcGgqCZMwqDAmmMFAnHGu73zv/z3PbBbAAWEmCenI + mVGWzKh0Sq1ambWPwXgFsJ7brnhMLmOE3HFtkL6ywW2zfE7f1U7JOtnVOrz0gIGCFiUtg1cBBCQEBzeH + j5BmihIekVQ1IW+Wm5xRAQYELnGdPqOkp6gca6apra6vsLGys7SxRbestbq7p0IDv780vMPEmx42iooi + obnFzs9Wx6E00pnN0NjZPB4kbdzW2uF217sfmhdaBufiHeTlisHaNY4ZHiJf7BUfJIXaAwbU+kH7gK8e + CHXuiP2j5gSbAID6ChLjJrHDP1AJeT2U2NDZJwL9FmpAm3dNAIIDEPMB+Bjyj8dGF9YNm4fCw8mU+VgS + yphKJ4VEPFGRVGUSZUV5oELSK/YJAUeQzzAdrVDj5lRsTZ9i++cUx8aR/1xmMIkgxNWtBrquwOkRxIFG + IMQ6e8hWaVmMKim5hatO3kWz8kCEOkPgbt2cfw+PvBXOHihqK23exJv3J+PK4jCNKEGgAILJjzGLHq1Z + hOlleUarVln69IjUq2NndnFwBDPZuFkLGRI0t+/fwIMfQiO8eFQWd4wr19hC7vLnr/JMgk79VRYQvatr + n7MKOPHt4ImWgN0lOfnw6PWyEVJG4Nn01W1Q6NhF/sr38J/7XEHmo6j88P7tJ1J/v2QHYG4DHICPQAdu + Y6AtDwZhQCPIRJjfPvGE4wIy+FWhmUwNwhDWLfQ9I0oRDzlXhoUAfjVfh7KU6GKI1iVFlYq8gIgdjdbB + tFNUKjLC4ji48LjBfnoN+QhQFuzI3THAjKekclnpA9Uzg81X1pQ1pQNKMiScZyQAXOUx41wp2dSXHJqF + SaI5YvKYyIR84TjMP4q8RdmKF912o59jTtAajLXQBY4ZbV41D6H5FcmOo3IY+l4iIAZqaUsjNEPQpZwS + dqgGBHHZqXIPHeBUTd2MqqoXE56qSqqrdlqqWkfCGuuldCFQqT4I3cpprgpyMKKvl86Z1lLoAEYsrv0i + IIDsfIKJuqxvxpraVRGRpRPntA16+RkCBYRigwi7Hvjdrd+4dlq5EwXD6A/mSbtcuur22lg359aHz7s0 + 0rvZtsXYtwK/O9hXCbe7ESFvJEgSrIN/7HL7qI2U2DlFdxJ3QIQ4CS7ocMZSxHsvhYosLBq2sLiX2UUR + b7ehIh/TYXDM1hmpMCYWM/xYyyBvIqNinGDcc8ptODl0O5BuN2AFQh5NFZTAbKz0swAY7TS9YLq5XZYt + bOl0xf++qXV1LqqZ87KJemMDwMHhyQhKVGecaD1ru2waz0+uJikrlJoc1WWRYMgga31qyvXXOYyIIs2y + GNtyqIjncKYXjMMy/muHfUcOA5IrnY2mqWwrgbfmK/lYwegatRp65qTXZLqgcWcz6+P2tn5kWlrllaur + Ggxru7C4ewV0NsY6ywpdlYM851vKeG5is7FrEfvvmN5D2kHWCkPiQaFTLyjgonlpbbi0keu39x55WW/t + 6eXbs7+uoV7ohlNWktzX3NQGSgnnC4LGUEzYl/OIlTBh5IM+UDiCdAaIPubAAQucCYP33AeNdVgNXgVC + n8i0wYcV+KGBVVBZYBbRiP61bjoH88unQBiynZnQfyxERAZjSMMaxhAXKLOh0mYQJf69UIe0kAaYUPND + IMJCGjcrH/uMSC1zeCMd8tNhDjloKwtAsYiQ/ZgiFfmRvKDZgG+SGo3gusiJhdxicMXYVK1WmA8zLk52 + dSnRTNSogTZhERCTkyMvOLc0pnwRBUUZ3kgoJigGuiIAr5tAFIUisDoGkoxCIaQi74gISa5kekH845Ee + mRc+YnIWVYIWWARZMat0EndWQgutJjeTsDThM8pSSZmEB8kl7aV5cBRkIu7yyajcMi4qtB7xBDOVXQqz + MoN6FPhGQhdmYAtFn0HJnjCTNCOWJkydiSZqmBic1tQLUNykVmJcA85wNnFcyyinOb1TQEqu853hpCA8 + u4mcRc5TJQK8p3GkcyV9eieC7vQnKYSWG3kKVDYbxIILpHbQV4jwCH39Y09DHQqVFAKhkXqcaNBciAVJ + 1lKj0ZghRAnZR5CKpmOK/CgiAsomlnpkQovo5SPGKI6XHQ5AH3JpChQnUYesxx6G1I/l4qhSQfysqLbj + Y1BboSMJahSR/ZwkkC7QNDnhcKNRvaROPUG1CwYIau7aqqBQKUpo3NQkTm2Ul7LGv0jMci1IxWOa0LpU + 4bTJh0IY23B+uSa05AluYs3ka9SmTkAkU0N3Cywo+6SoujFsmcSDbHrCWMcqmtQjhWvCTS87kYM8rrCc + 1cXlUGXP0HZitK8qrWl9prpmsG61qUsL7VQLW0gACz++q60uiodJ5Ol2GIYyngyi9ds9Yu8zkP1BEfcU + W1wdeOsz5EPnEutg0OYSRX/1oi1E39C9zblrovBbl04fCoSIMlSg8NOrIGYWBYzGNXLtDCzEhtQw6w6C + oPAiaV3NWV2FBEsCaARpQrHCiJhSUovTIi9WWHZHm773Oex9FB4D0le0cfRXHCFlp/AbqKYy15849FtJ + lXCAD8MTRT0878W6mlb7KrQ2bO2uDs7qNRd7ok94nYF6o1A2utr4xoNtCWh/4DY9yfTHNWEs3TYbwMSu + CsG6uwffLOsJyQaKptTM7AboqEOeZjQwbETHkNGXxwfbVnWkNXF1lFqZy12DyiCEakzUPAU3p5bO0JEz + VY4M3FbNFs/6USFrC7KK2LTwLgO5reFbWWVmW4ZAuGOJpQ2XV6fwQW8U0gM0dQ5LzeNeKzLpkjH1qtnm + 2oxPXLXRLpLpEN74vbC/q05Bq82HqHq+kIeqzksEAAAh+QQJBQAAACwAAAAAIgHIAAAE/hDISau9OOvN + 5xAT2I1kaV4BQQzEQQRnLM90bd8zKwUi7v+AwMBgGMCAyKRyyaQEDASBsUktHavYrHYrnG6/4LB4TC6b + z+i0uhxou9fwuHy+E0gH+E+bzu/7mzwsKipEUAJXf4mKiyM8KnZuUoVejJWWjI6UFAIERJqXoFp7oRyc + n5udRYikJqOsGpwrH68oLKsVPIU9tB2xeLu8EkOHbbPBEpzAKKmnxxXDbsbHAgbAdseOyhZCRC/OGdTW + 2qFPBtsD2La9CAfV3yhE59guF82gQt6l7O7vuPQW9i4F+OckHy18t7YJ2DfO2UAC2wy+eoLAGsRg3BpO + EMKwHy4D/RUrcHI2pOKRcOmK6ENAROOxkoeQ8cPY6YCLTuicUZu5jCWUhO9SGLBJKKfDIbqCdoqCIYVP + nh43Im0Z1Q3QiTujvGmzcN/PqE3fgB3LrdsHAgUQeDU0tq3bDGULyS2k9a3du0Gmzu0WE6/ftoFS0e37 + tzBZHnYgGV7MuLFjVoivPp58D0QKyZQzK+ohRbNnUH1XfB6N6awBzKRTq+mC2m1k1bBJBFKMRQgMwrFz + RzTyuoo0l7pT6wgBHMdwHsGTT4AisrahgMpHP7m4wygV1tGVDzjQQ1r2Ga6qtlZSboWK8d8v+PKuE8+j + MNxWoE//TBXX4pakRFIJn/4MlJv+4LfINZtA5R8d08nz0i1EzHfgGAkC5GAfQlzQwoQ/WBXegx9Rt5FE + kIEIwIVgcJXHL7hxuANIFjnD1CYsYViDI3QNskKKHMJ0koGsAMgDS9bVNpUe990oo2pCHYBAUe8MoYJN + X4mCVF24sIDjgXHxyMtOnhwpQ1kvYmCliriI5ZFVYHDpUgrQkakimKgl4+acEXVZCpV00kmNklfiIl+e + ee4ZEgdsegloaoL2WVCbh2a3EwKMUsNoo8pxAtKgGgwxKaXBCQWSiAVqyWl6XC4JlKWgjpqep0qaBEMk + qSiqqqOCtVpAFCxMYqhmvTVK415zbSoQilLetmtuvwKrypn9f9JGxW+qOiIYFHpENRwyAtagQh2zBpEY + JMdSyNwmzuEabreVRFhdFtihq5CsrGzXXbbukjcFvOS0YF6qnZ6bBbT9lCXsaHe898dx9Fri72LgchPk + HNPpV++A1oi6RrsTJ3JKJws/qGHHYFVoAccZl3lHHs6mdtnIp5W8kaXd2FitamEiE6PLeU1CDGKPgPyN + jwvxVzKY2uCDb2NOErAPv9FO2ZDRsHG57MU++6GmZIXChuYa6yVMCpx3eo0zAJpGIrZAzMSJ59gjAEic + W4l2kDXbjcRTJdxDYarB3HQTOu4zVcORKGp897333x8GznXekU5t+OF6AzBSW49GXv6P449noKNMZ6eb + iqmwUJX5BkkuiZNdpaaKquKHZtk52kS0SkwQXMXKuq9mol6rWrdKIdjAoxuWrLKY69brxMPvBXx+dyyM + nG04J29kVdcg9ANnDyP/7exgESiBaD6E5mHwHgFDMg5CWHr7qimThMj56OOx/ncrH31JZ8gckD35NwD8 + TQrmccH86IawMyFlefyrm7nIkkAmYKyBEIwg/z4mQWTZ4UREqqB0fGejwQxQg4uQVsMkYScQPiYTCYEZ + AiO4IZ38CQMq/OBqZBiGrgVFHXBR011s2KRqRON1c5AT6dL2FmgUA4hycBu2sCHEvU2JhmNQouSQeDG7 + OWF/9/3A4QYW0g4q+qEcCuLFQ+oBRQdqERYdIQtBKLBCiK1xB0xL1xmbwkWLYeSNQYgjJlgkkvFBZhiE + GkAaQ8ZHVJCERTvyYhocthLRjWVzkrOjwmpyE6EFYycacUo3yggfSjLpf3pR5MWWMg5NOhIwoRRPC8WY + lZ3RrivtiJJdtmbCnJmFE2lZS81qKTy9KGttvOwl8QzByWDGITBzAaYxG3OfxBRzmdDU4PGiOZnn6ZGa + eMEeNikTGixu0y/pg983mSk/x0xznL00FhBmYz90osF/NyjUOd0phwL64FpTpOcXn+MvxElOn18spw/U + lReA+kVeHhDldZ4pCoYexCzn/fkDD99RsF0qJz5t/ELZ7kNR3uTCm8jaDFS8t6WKKXR0BF3XgizQIICm + VBgOzVD2SOQfCsLhpSsTo4homh0Tnah9ZqBIi46xy6DFtDKCsdH00gBJKb4CaECi35B2ZoelnqF0nzzk + k9pxzc8Q7RZGO6rryieXjDKGaJmyKBtyFxS2JkeHe3uhQTHyxLDNFRtE3KIy7wqavOGrcHwNRdwIJdfA + CtavhCusYe9HBEjFqXiLrYSl1AKcskU2X41lGiYvS4rUnWopR+Xsl1Ihuz3AqiWhFW0MYJY3BPQuVyUk + wzxVSyjWEs+s8VOnTD9wUrolL1gOhacNsgZUakpLLlb9LcO2vPUDfJJ0nIhxZmgjhtuN+LO3tLWCQNGH + OJHxdba0QKgwsBs86LXTcy4QRBlXySnhpgSyWKgoeUljzzNFcWea6hZ1U3tJk+p3u2TaWMuyuwSbmtFC + AyZwhgLx0/OeIKcUEKeCh8tapc4sCUW92YTjOVWz9UwJULXkhsHjtFrstX9QUBpX+WtMtDZlTCAuK4ux + MeMqXC2u1Q0Lex80UVRu0q4g3Chi3uKpSJ2YfFJ8Lln5JDfFJhCMd6OcX5uc41m9lGw1RsLgCFvlaPkz + j1kGgqAa1+VRCbWPeLtUZeHLv6ZKUqeZlcxmpVkT04m4e4UAnXpAa8KxzpK0lF01be1Qy0ta6q4QtsLV + 78I8YlzYVlllJl1xGy2bRwNXFJaJNCyaR0/pXTi+IQDpQKs3x29GF1xpOsJyqUBS8FF6oKZZn/kSPFfw + 2kvTYnofrV3qDQcPyCgC0J9qIgAAOw== + + + + True + + + True + + + + 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 + xCU28YlRnGIVr5jFLXbxi2EcYxnPOIQBAQA7 + + + + + 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 + Q5EdAntJDkV2COwlOZTiIbCX5FCEN4ImwiWXBdbGgFI7BhTkGlqtJsSLoIlwFOQaWBsDSvEQmghH6a2B + tRpaLYruECJgs9BqUXSHEBGehVY7ndKchTmf65y/53qW6MdeeYGStqb0dSMf3b17z6709CQ7d+9I5TBL + YZbPLJJZOIuQ5teYLJ1ZZvMtnxtcpDPn5DQnfMs5fn3K37N45qPJWTizCObTjPAtn++bhTm/5uWLX/Jr + QX6cuJcIeRTkGibNTZp/XEN8U640T5NEf/KDH6bS/AdvvpuePpaF+f/tvvmfbuNzb7mN2tc+SZ++/9co + 6dtDycqnKFn+JM3dUnNPzRuOU7LumfRAwbkr7qSk50pqWfEwHGnueRWjINtrZ4rgsx30u8cRpTl7KU+a + z5cjzUWa3/I4JTfcS8nnx+ncga3UduOttPDmzZRcfA21XXxFOsY/+Ml76fzgePutn9F777xLP/nRj0/N + Cws9TJpXFiLNWY/WrkrLc1EWsVSaf+gm6Q9Zj5+kt959L12w0tOyuIKLlm+mT09sp3mjbkHqf46SJXy0 + +UGas+mIW7QepbaRZ9PzSSWDfKT5flq256+mp2f51Mgj1Lrsbmpd/RjxebmTtbyTGVH0Pu1wt2v2pueT + aul9tHYhULdwta1+mjp7758qzZeyNH9wUppfvoXaV7nbK8apdfFGSj63nM67vp/aL7mc/uitD+mH73xA + b7//Ib1/svaChl/YvP/++/Tmm3aVcwteJ0yaszAVscs9TZqfOeRxxccSx2+mwd9Vcii1qwbndxWgAI9B + 64XSuyy+BG8UFOAxoLQuiy+vcX3LIrR9COwlORTZIbCX5FBkh8BekkORHQJ7SQ6leAjsJTlfhhdFE+GS + ywJrY0CpHQMKcg2tVhPiRdBEOApyDayNwRfjeWgiHKW3BtZqaLUoukOgINfQalF0hxARnoVWO53SnOFz + nXMvvlgob/Mv/tW/pG//6i/R3/x7fyuVyyKsWdKy0GYBzLd8vm4WxiyHWRizzBbhzIKZL9zJMpnhOj4H + OItm/p63ZRnP5/tmEbxz9470liUyn5+b/z1+3dre2ZZ+z48FnyKGb3kseD7xz74k9zmbpTli0tyi0RDX + xDL81EjzN8CHJ92X2v/TOjZV/78fv0s/cD/8ufv+wlsm6NNjT1HH4H5Krn2YOja8RAvv+AY19++lZOXT + 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 + YII= + + + + + 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 + Rmv0RnN0R3v0R4N0SIv0SJN0SZv0SaP0MQcEADs= + + + + True + + + + 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 + 2kvTYnofrV3qDQcPyCgC0J9qIgAAOw== + + + + True + + + True + + + + Qk2+qxAAAAAAADYAAAAoAAAAkQIAACoCAAABABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////kNv/AAA6AAAA/7Zm////////////////////////Zrb/AAAAAAAAkDoA///b//// + ////tv//AABmAAAAAAAAAAAAAAAAkDoA///b////////kNv/AAA6ZgAA//+2////////////////tv// + AABmAAAAAAAAAAAAAAAAkDoA///b////////Zrb/AAAAZgAA//+2//////////////////////////// + ////tv//AABmAAAAAAAAAAAAAAAAkDoA///b////////OpDbAAAAkDoA///b////////////Zrb/AAAA + ZgAA//+2////////////////tv//AABmAAAAAAAAAAAAAAAA25A6////////////////tv//AABmAAAA + AAAAAAAAAAAAkDoA///b////////OpDbAAAAtmYA//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AGa225A6//////////////////////////////////////////// + AGa225A6////////////////////////////////////////////AGa225A6//////////////////// + ////////////////////////AGa225A6////////////////////////////////////////////AGa2 + 25A6////////////////////////2///ADqQAAAAtmYA//////////////////////////////////// + ////tv//AABmAAAA25A6////kNv/AAA6AAAAAAAAAAAAAAAAAAAAAAAAAAAA25A6//////////////// + ////////////////////kNv/AAA6AAAAAAAAAAAAAAAAAAAAtmYA//////////////////////////// + ////AGa225A6////////////////////////////////////////////AGa225A6//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////5Db/wAAOgAAAP+2Zv///////////////////7b//wAAZgAAAJA6AP//2////////zqQ2wAAAAAA + AAAAAAAAAAAAAAAAAAAAAGYAAP//tv///5Db/wAAOmYAAP//tv///////////zqQ2wAAAAAAAAAAAAAA + AAAAAAAAAAAAAGYAAP//tv///2a2/wAAAGYAAP//tv///////////////////////////zqQ2wAAAAAA + AAAAAAAAAAAAAAAAAAAAAGYAAP//tv///zqQ2wAAAJA6AP//2////////////2a2/wAAAGYAAP//tv// + /////////zqQ2wAAAAAAAAAAAAAAAAAAAAAAAGYAAP//tv///////zqQ2wAAAAAAAAAAAAAAAAAAAAAA + AAAAAGYAAP//ttv//wA6kAAAADoAAP/bkP////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////wBmtgAAAAAAAJA6AP//2////////////////////////////////wBmtgAAAAAAAJA6 + AP//2////////////////////////////////wBmtgAAAAAAAJA6AP//2/////////////////////// + /////////wBmtgAAAAAAAJA6AP//2////////////////////////////////wBmtgAAAAAAAJA6AP// + 2////////////////////2a2/wAAADoAAP/bkP///////////////////////////////////zqQ2wAA + AGYAAP//tv///5Db/wAAOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGYAAP//tv////////////////// + /5Db/wAAOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJA6AP//2////////////////wBmtgAAAAAA + AJA6AP//2////////////////////////////////wBmtgAAAAAAAJA6AP//2/////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////+Q2/8A + ADoAAAD/tmb///////////////////8AZrYAAAA6AAD/25D///////+Q2/8AADoAAABmAAD//7b///// + //////+2//9mAGb//7b///+Q2/8AADpmAAD//7b///////+Q2/8AADoAAABmAAD//7b///////////+2 + //9mAGb//7b///9mtv8AAABmAAD//7b///////////////////////+Q2/8AADoAAABmAAD//7b///// + //////+2//9mAGb//7b///86kNsAAACQOgD//9v///////////9mtv8AAABmAAD//7b///////9mtv8A + AAAAAACQOgD//9v///////+2//9mAGb//7b///+Q2/8AADoAAABmAAD//7b///////////+2//9mAGb/ + /7b///86kNsAAAC2ZgD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //+2//8AAGYAAAAAAACQOgD//9v///////////////////////////+2//8AAGYAAAAAAACQOgD//9v/ + //////////////////////////+2//8AAGYAAAAAAACQOgD//9v///////////////////////////+2 + //8AAGYAAAAAAACQOgD//9v///////////////////////////+2//8AAGYAAAAAAACQOgD//9v///// + //////////+2//8AAGYAAADbkDr///////////////////////////////+2//8AAGYAAADbkDr///// + //+Q2/8AADoAAAD/tmb///////////////9mtv8AAAAAAACQOgD//9v///////////9mtv8AAAAAAAAA + AADbkDr///////////////////86kNsAAAAAAADbkDr///////////////+2//8AAGYAAAAAAACQOgD/ + /9v///////////////////////////+2//8AAGYAAAAAAACQOgD//9v///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////kNv/AAA6AAAA/7Zm + ////////////////Zrb/AAAAAAAA25A6////////////AGa2AAAAZgAA//+2//////////////////// + ////////////kNv/AAA6ZgAA//+2////////AGa2AAAAZgAA//+2//////////////////////////// + ////Zrb/AAAAZgAA//+2////////////////////////AGa2AAAAZgAA//+2//////////////////// + ////////////OpDbAAAAkDoA///b////////////Zrb/AAAAZgAA//+2////2///ADqQAAAAkDoA///b + ////////////////////////////AGa2AAAAZgAA//+2//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + OpDbAAAAAAAAtmYA////////////////////////////////////OpDbAAAAAAAAtmYA//////////// + ////////////////////////OpDbAAAAAAAAtmYA////////////////////////////////////OpDb + AAAAAAAAtmYA////////////////////////////////////OpDbAAAAAAAAtmYA//////////////// + ////OpDbAAAAZgAA//+2////////////////////////////Zrb/AAAAOgAA/9uQ////////kNv/AAA6 + AAAA/7Zm////////////////////Zrb/AAAAAAAA/7Zm////////kNv/AAA6AAAAkDoA///b//////// + ////////////////////////Zrb/25A6////////////////////////OpDbAAAAAAAAtmYA//////// + ////////////////////////////OpDbAAAAAAAAtmYA//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////5Db/wAAOgAAAP+2Zv////////// + /7b//wAAZgAAAJA6AP//2////////7b//wAAZgAAANuQOv////////////////////////////////// + /5Db/wAAOmYAAP//tv///7b//wAAZgAAANuQOv///////////////////////////////////2a2/wAA + AGYAAP//tv///////////////////7b//wAAZgAAANuQOv////////////////////////////////// + /zqQ2wAAAJA6AP//2////////////2a2/wAAAGYAAP//tv///7b//wAAZgAAAP+2Zv////////////// + /////////////7b//wAAZgAAANuQOv////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////2a2/wAA + AAAAAP+2Zv///////////////////////////////////2a2/wAAAAAAAP+2Zv////////////////// + /////////////////2a2/wAAAAAAAP+2Zv///////////////////////////////////2a2/wAAAAAA + AP+2Zv///////////////////////////////////2a2/wAAAAAAAP+2Zv///////////////7b//wAA + ZgAAANuQOv///////////////////////9v//wA6kAAAALZmAP///////////5Db/wAAOgAAAP+2Zv// + /////////////////7b//wAAZgAAANuQOv///9v//wA6kAAAAJA6AP//2/////////////////////// + /////////////////////////////////////////////////2a2/wAAAAAAAP+2Zv////////////// + /////////////////////2a2/wAAAAAAAP+2Zv////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////+Q2/8AADoAAAD/tmb////////b//8AOpAAAAA6 + AAD/25D///////////+2//8AAGY6AAD/25D///////////////////////////////////+Q2/8AADpm + AAD//7b///+2//8AAGY6AAD/25D///////////////////////////////////9mtv8AAABmAAD//7b/ + //////////////////+2//8AAGY6AAD/25D///////////////////////////////////86kNsAAACQ + OgD//9v///////////9mtv8AAABmAAD//7b///+2//8AAGY6AAD/25D///////////////////////// + //+2//8AAGY6AAD/25D///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////86kNsAAABmAAD/ + /7b///////////////////////////////////86kNsAAABmAAD//7b///////////////////////// + //////////86kNsAAABmAAD//7b///////////////////////////////////86kNsAAABmAAD//7b/ + //////////////////////////////////86kNsAAABmAAD//7b///////////////8AZrYAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6AAD/25D///////////+Q2/8AADoAAAD/tmb///////////// + //////+2//8AAGYAAADbkDr///9mtv8AAAA6AAD/25D///////////////////////////////////// + //////////////////////////////////////////86kNsAAABmAAD//7b///////////////////// + //////////////86kNsAAABmAAD//7b///////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////kNv/AAA6AAAA/7Zm////tv//AABmAAAAAAAA/7Zm//////// + ////////tv//AABmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOgAA/9uQ////kNv/AAA6ZgAA//+2//// + tv//AABmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOgAA/9uQ////Zrb/AAAAZgAA//+2//////////// + ////////tv//AABmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOgAA/9uQ////OpDbAAAAkDoA///b//// + ////////Zrb/AAAAZgAA//+2////tv//AABmAAAA/7Zm////////////////////////////tv//AABm + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOgAA/9uQ//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////2///ADqQAAAA25A6//////// + ////////////////////////////2///ADqQAAAA25A6//////////////////////////////////// + 2///ADqQAAAA25A6////////////////////////////////////2///ADqQAAAA25A6//////////// + ////////////////////////2///ADqQAAAA25A6////////////////kNv/AAA6AAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAkDoA///b////////////kNv/AAA6AAAA/7Zm////////////////////Zrb/ + AAAAOgAA/9uQ////AGa2AAAAkDoA///b//////////////////////////////////////////////// + ////////////////////////////////2///ADqQAAAA25A6//////////////////////////////// + ////2///ADqQAAAA25A6//////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////5Db/wAAOgAAAAAAAAAAAAAAAAAAADoAAP/bkP///////////////////9v/ + /wA6kAAAAP+2Zv///////////////7b//wAAZjoAAP/bkP///5Db/wAAOmYAAP//tv///9v//wA6kAAA + AP+2Zv///////////////7b//wAAZjoAAP/bkP///2a2/wAAAAAAANuQOv///////////////////9v/ + /wA6kAAAAP+2Zv///////////////7b//wAAZjoAAP/bkP///zqQ2wAAADoAAP/bkP///////////zqQ + 2wAAAJA6AP//2////////wBmtgAAALZmAP///////////////////////////9v//wA6kAAAAP+2Zv// + /////////////7b//wAAZjoAAP/bkP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////2a2/wAAAAAAAAAAAAAAAAAAAAAAAGYAAP//tv////////////// + /2a2/wAAAAAAAAAAAAAAAAAAAAAAAGYAAP//tv///////////////2a2/wAAAAAAAAAAAAAAAAAAAAAA + AGYAAP//tv///////////////2a2/wAAAAAAAAAAAAAAAAAAAAAAAGYAAP//tv///////////////2a2 + /wAAAAAAAAAAAAAAAAAAAAAAAGYAAP//tv///////////9v//wA6kAAAALZmAP///////////////2a2 + /wAAAAAAAP+2Zv///////////////5Db/wAAOgAAAP+2Zv///////////////2a2/wAAAAAAALZmAP// + /9v//wA6kAAAALZmAP////////////////////////////////////////////////////////////// + /////2a2/wAAAAAAAAAAAAAAAAAAAAAAAGYAAP//tv///////////////2a2/wAAAAAAAAAAAAAAAAAA + AAAAAGYAAP//tv////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////+Q2/8AADoAAAAAAAAAAAAAAAAAAAAAAAAAAAD/tmb///////////////////9mtv8AAAA6 + AAD/25D////////b//8AOpAAAACQOgD//9v///+Q2/8AADpmAAD//7b///////9mtv8AAAA6AAD/25D/ + ///////b//8AOpAAAACQOgD//9v///9mtv8AAAA6AAAAOjr/tmb////b//86OpD/25D///9mtv8AAAA6 + AAD/25D////////b//8AOpAAAACQOgD//9v///86kNsAAAAAAABmAAD//7b///+2//8AAGYAAAC2ZgD/ + //////////9mtv8AAAAAAACQOgD//9v///////+Q2/+QOjr//9v///9mtv8AAAA6AAD/25D////////b + //8AOpAAAACQOgD//9v///9mtv8AAABmAAD//7b///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////8AZrYAAAAAAAAAAAAAAAAAAAAAAAAAAAA6AAD/25D///////////8AZrYAAAAAAAAA + AAAAAAAAAAAAAAAAAAA6AAD/25D///////////8AZrYAAAAAAAAAAAAAAAAAAAAAAAAAAAA6AAD/25D/ + //////////8AZrYAAAAAAAAAAAAAAAAAAAAAAAAAAAA6AAD/25D///////////8AZrYAAAAAAAAAAAAA + AAAAAAAAAAAAAAA6AAD/25D///////////////9mtv8AAAA6AAD/25D////////b//8AOpAAAACQOgD/ + /9v///////////////+Q2/8AADoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbkDr////////b//8AOpAA + AADbkDr///////////////////////////////////////////////////////////////8AZrYAAAAA + AAAAAAAAAAAAAAAAAAAAAAA6AAD/25D///////////8AZrYAAAAAAAAAAAAAAAAAAAAAAAAAAAA6AAD/ + 25D///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + kNv/AAA6AAAA/7Zm////////2///ADqQAAAAOgAA/9uQ////////////////////OpDbAAAAAAAAAAAA + AAAAAAAAAAAAOgAA/9uQ2///ADqQAAAAAAAAAAAAAAAAZgAA//+2////OpDbAAAAAAAAAAAAAAAAAAAA + AAAAOgAA/9uQ////////Zrb/AAAAZgAAkNu2AAA6AAAAAAAAAAAAkDoA///b////OpDbAAAAAAAAAAAA + AAAAAAAAAAAAOgAA/9uQ////////OpDbAAAAZjoAADpmAAAAAAAAAAAAAAAAOgAA/9uQ//////////// + ////OpDbAAAAAAAAAAAAAAAAAAAAAAAAkDoA///b////////OpDbAAAAAAAAAAAAAAAAAAAAAAAAOgAA + /9uQ////////AGa2AAAAAAAA/7Zm//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + OpDbAAAAAAAAtmYA////////////AGa2AAAAAAAA25A6////////OpDbAAAAAAAAtmYA//////////// + AGa2AAAAAAAA25A6////////OpDbAAAAAAAAtmYA////////////AGa2AAAAAAAA25A6////////OpDb + AAAAAAAAtmYA////////////AGa2AAAAAAAA25A6////////OpDbAAAAAAAAtmYA////////////AGa2 + AAAAAAAA25A6////////////////2///ADqQAAAA25A6////////kNv/AAA6AAAA/7Zm//////////// + ////////kNv/AAA6AAAAAAAAAAAAAAAAAAAAAAAAkDoA///b////////////2///ADqQAAAAtmYA//// + ////////////////////////////////////////////////////////OpDbAAAAAAAAtmYA//////// + ////AGa2AAAAAAAA25A6////////OpDbAAAAAAAAtmYA////////////AGa2AAAAAAAA25A6//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////5Db/wAAOgAA + AP+2Zv///////////7b//wAAZgAAALZmAP///////////////////////5Db/wAAOgAAAAAAAAAAALZm + AP///////9v//wA6kAAAAAAAAAAAAAAAAGYAAP//tv///////5Db/wAAOgAAAAAAAAAAALZmAP////// + /////////2a2/wAAAGYAAP//tpDb/wAAOgAAAGYAAP//tv///////////5Db/wAAOgAAAAAAAAAAALZm + AP///////////////zqQ2wAAAJA6AP//2wBmtgAAAAAAAGYAAP//tv///////////////////////7b/ + /wAAZgAAAAAAAAAAADoAAP/bkP///////////////5Db/wAAOgAAAAAAAAAAALZmAP////////////// + /2a2/wAAAGYAAP//tv////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////9v//wA6kAAAAJA6 + AP//2////////////7b//wAAZgAAANuQOv///9v//wA6kAAAAJA6AP//2////////////7b//wAAZgAA + ANuQOv///9v//wA6kAAAAJA6AP//2////////////7b//wAAZgAAANuQOv///9v//wA6kAAAAJA6AP// + 2////////////7b//wAAZgAAANuQOv///9v//wA6kAAAAJA6AP//2////////////7b//wAAZgAAANuQ + Ov///////////////////zqQ2wAAAGYAAP//tv///wBmtgAAAGYAAP//tv///////////////////5Db + /wAAOgAAAP+2Zv///////////zqQ2wAAADoAAP/bkP///////////wBmtgAAAJA6AP//2/////////// + /////////////////////////////////////////9v//wA6kAAAAJA6AP//2////////////7b//wAA + ZgAAANuQOv///9v//wA6kAAAAJA6AP//2////////////7b//wAAZgAAANuQOv////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////+Q2/8AADoAAAD/tmb///// + //////////8AZrYAAACQOgD//9v///////////////////////////////////////////////////// + //////+Q2/8AADpmAAD//7b///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////+2//8AAGYAAAD/tmb///////// + ///////b//8AOpAAAADbkDr///+2//8AAGYAAAD/tmb////////////////b//8AOpAAAADbkDr///+2 + //8AAGYAAAD/tmb////////////////b//8AOpAAAADbkDr///+2//8AAGYAAAD/tmb///////////// + ///b//8AOpAAAADbkDr///+2//8AAGYAAAD/tmb////////////////b//8AOpAAAADbkDr///////// + //////////+2//8AAGYAAAD/tma2//8AAGYAAADbkDr///////////////////////+Q2/8AADoAAAD/ + tmb///////////////8AZrYAAACQOgD//9v///////9mtv8AAAAAAAD/tmb///////////////////// + //////////////////////////////+2//8AAGYAAAD/tmb////////////////b//8AOpAAAADbkDr/ + //+2//8AAGYAAAD/tmb////////////////b//8AOpAAAADbkDr///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////kNv/AAA6AAAA/7Zm//////////////// + AGa2AAAAkDoA///b////////////////////////////////////////////////////////////kNv/ + AAA6OgAA/9uQ//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////tv//AABmAAAA/7Zm////////////////tv// + AABmAAAA/7Zm////tv//AABmAAAA/7Zm////////////////tv//AABmAAAA/7Zm////tv//AABmAAAA + /7Zm////////////////tv//AABmAAAA/7Zm////tv//AABmAAAA/7Zm////////////////tv//AABm + AAAA/7Zm////tv//AABmAAAA/7Zm////////////////tv//AABmAAAA/7Zm//////////////////// + ////AGa2AAAAkDoAOpC2AAAAZgAA//+2////////////////////////kNv/AAA6AAAA/7Zm//////// + ////////Zrb/AAAAZgAA//+2////////2///ADqQAAAAZgAA//+2//////////////////////////// + ////////////////////tv//AABmAAAA/7Zm////////////////tv//AABmAAAA/7Zm////tv//AABm + AAAA/7Zm////////////////tv//AABmAAAA/7Zm//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////5Db/wAAOgAAAP+2Zv///////////7b//wAAZgAAALZm + AP///////////////////////////////////////////////////////////////7b//wAAZjoAAP/b + kP////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////9v//wA6kAAAALZmAP///////////////2a2/wAAADoAAP/b + kP///9v//wA6kAAAALZmAP///////////////2a2/wAAADoAAP/bkP///9v//wA6kAAAALZmAP////// + /////////2a2/wAAADoAAP/bkP///9v//wA6kAAAALZmAP///////////////2a2/wAAADoAAP/bkP// + /9v//wA6kAAAALZmAP///////////////2a2/wAAADoAAP/bkP///////////////////////5Db/wAA + OgAAAAAAAAAAALZmAP///////////////////////////5Db/wAAOgAAAP+2Zv///////////////zqQ + 2wAAAGYAAP//tv///////////5Db/wAAOgAAAGYAAP//tv///////////////////////////////zqQ + 2/+2Zv///9v//wA6kAAAALZmAP///////////////2a2/wAAADoAAP/bkP///9v//wA6kAAAALZmAP// + /////////////2a2/wAAADoAAP/bkP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////+Q2/8AADoAAAD/tmb////////b//8AOpAAAAA6AAD/25D///////// + //////////////////////////////////////////////////////////8AZrYAAACQOgD//9v///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////9mtv8AAAAAAADbkDr///////9mtv8AAAAAAAC2ZgD///////////9m + tv8AAAAAAADbkDr///////9mtv8AAAAAAAC2ZgD///////////9mtv8AAAAAAADbkDr///////9mtv8A + AAAAAAC2ZgD///////////9mtv8AAAAAAADbkDr///////9mtv8AAAAAAAC2ZgD///////////9mtv8A + AAAAAADbkDr///////9mtv8AAAAAAAC2ZgD///////////////////////////////8AZrYAAAAAAAA6 + AAD/25D///////////////////////////+Q2/8AADoAAAD/tmb///////////9mtv8AAAAAAAC2ZgD/ + //////////////////9mtv8AAAAAAAAAAAC2ZgD///////////////////8AZrYAAAAAAAD/tmb///// + //9mtv8AAAAAAADbkDr///////9mtv8AAAAAAAC2ZgD///////////9mtv8AAAAAAADbkDr///////9m + tv8AAAAAAAC2ZgD///////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////kNv/AAA6AAAAAAAAAAAAAAAAAAAAAAAAAAAA25A6//////////////////////// + ////////////////////////////////////////////////kNv/AAA6AAAAAAAAAAAA/7Zm//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////AGa2AAAAAAAAAAAAAAAAAAAAAAAAkDoA///b////////////////AGa2AAAA + AAAAAAAAAAAAAAAAAAAAkDoA///b////////////////AGa2AAAAAAAAAAAAAAAAAAAAAAAAkDoA///b + ////////////////AGa2AAAAAAAAAAAAAAAAAAAAAAAAkDoA///b////////////////AGa2AAAAAAAA + AAAAAAAAAAAAAAAAkDoA///b////////////////////////////////Zrb/AAAAAAAAtmYA//////// + ////////////////////////kNv/AAA6AAAAAAAAAAAAAAAAAAAAAAAAAAAAZgAA//+2//////////// + ////////////tv//AABmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA25A6////////////////AGa2 + AAAAAAAAAAAAAAAAAAAAAAAAkDoA///b////////////////AGa2AAAAAAAAAAAAAAAAAAAAAAAAkDoA + ///b//////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////5Db/wAAOgAAAAAAAAAAAAAAAAAAAGYAAP//tv////////////////////////////////////// + /////////////////////////////////////////7b//wAAZgAAAAAAAP+2Zv////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////5Db/wAAOgAAAAAAAAAAANuQOv///////////////////////////5Db/wAAOgAAAAAA + AAAAANuQOv///////////////////////////5Db/wAAOgAAAAAAAAAAANuQOv////////////////// + /////////5Db/wAAOgAAAAAAAAAAANuQOv///////////////////////////5Db/wAAOgAAAAAAAAAA + ANuQOv///////////////////////////////////////9v//wA6kDoAAP/bkP////////////////// + /////////////5Db/wAAOgAAAAAAAAAAAAAAAAAAAAAAANuQOv////////////////////////////// + /////////7b//wAAZgAAAAAAAAAAAAAAADoAAP/bkP///////////////////////////5Db/wAAOgAA + AAAAAAAAANuQOv///////////////////////////5Db/wAAOgAAAAAAAAAAANuQOv////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////kNv/AAA6AAAA/7Zm////////////////////////Zrb/AAAAAAAAkDoA///b//// + ////tv//AABmAAAAAAAAAAAAAAAAkDoA///b////////////////////kNv/OgA6/9uQ//////////// + ////////Zrb/AAAAkDoA///b////////tv//AABmAAAAAAAAAAAAZgAA//+2////////////Zrb/AAAA + kDoA///b////////////////////AGa2AAAAAAAAAAAAAAAA25A6////////////////////OpDbAAAA + kDoA///b////////////Zrb/AAAAZgAA//+2////////OpDbAAAAtmYA//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////tv//AABmAAAA25A6////////////////////////Zrb/AAAAkDoA + ///b////////////////2///ADqQAAAAAAAAAAAA/7Zm////////////////////////////2///ADqQ + AAAAAAAAAAAA/7Zm//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////5Db/wAAOgAAAP+2Zv///////////////////7b//wAAZgAAAJA6AP//2////////zqQ2wAAAAAA + AAAAAAAAAAAAAAAAAAAAAGYAAP//tv///////////////zqQ2wAAALZmAP///////////////////2a2 + /wAAAJA6AP//2////7b//wAAZgAAAAAAAAAAAAAAAAAAADoAAP/bkP///////2a2/wAAAJA6AP//2/// + /////////2a2/wAAAAAAAAAAAAAAAAAAAAAAAAAAADoAAP/bkP///////////zqQ2wAAAJA6AP//2/// + /////////2a2/wAAAGYAAP//tv///9v//wA6kAAAADoAAP/bkP////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////7b//wAAZgAAANuQOv///////////////////////wBmtgAAADoAAP/bkP////// + /////5Db/wAAOgAAAAAAAAAAAAAAAAAAANuQOv///////////////////5Db/wAAOgAAAAAAAAAAAAAA + AAAAANuQOv////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////+Q2/8A + ADoAAAD/tmb///////////////////8AZrYAAAA6AAD/25D///////+Q2/8AADoAAABmAAD//7b///// + //////+2//9mAGb//7b///////////+2//8AAGYAAAA6AAD/25D///////////////9mtv8AAACQOgD/ + /9v///+2//8AAGb/tmb///////+2//8AAGYAAAC2ZgD///////9mtv8AAACQOgD//9v///////+Q2/8A + ADoAAACQOgD//9v///////+2//8AAGYAAABmAAD//7b///////86kNsAAACQOgD//9v///////////9m + tv8AAABmAAD//7b///////86kNsAAAC2ZgD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////+2//8AAGYAAADbkDr///////////////////////9mtv8AAACQOgD//9v////////b//8AOpAA + AACQOgD//9v///9mtv8AAAAAAAD/tmb////////////b//8AOpAAAACQOgD//9v///9mtv8AAAAAAAD/ + tmb///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////kNv/AAA6AAAA/7Zm + ////////////////Zrb/AAAAAAAA25A6////////////AGa2AAAAZgAA//+2//////////////////// + ////////////////////OpDbAAAAAAAAAAAA25A6////////////////Zrb/AAAAkDoA///b//////// + ////////////////2///ADqQAAAAtmYA////////Zrb/AAAAkDoA///b////////AGa2AAAAkDoA///b + ////////////////tv//AABmAAAA25A6////////OpDbAAAAkDoA///b////////////Zrb/AAAAZgAA + //+2//////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////tv// + AABmAAAA25A6////////////////////////////////////////////////Zrb/AAAAOgAA/9uQ//// + ////////AGa2AAAAkDoA///b////////Zrb/AAAAOgAA/9uQ////////////AGa2AAAAkDoA///b//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////5Db/wAAOgAAAP+2Zv////////// + /7b//wAAZgAAAJA6AP//2////////7b//wAAZgAAANuQOv////////////////////////////////// + /////7b//wAAZgAAADo6OgAAAGYAAP//tv///////////2a2/wAAAJA6AP//2/////////////////// + /2a2/wAAAAAAADoAAP/bkP///////2a2/wAAAJA6AP//2////7b//wAAZgAAAP+2Zv////////////// + /////////zqQ2wAAAJA6AP//2////zqQ2wAAAJA6AP//2////////////2a2/wAAAGYAAP//tv////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////7b//wAAZgAAANuQ + Ov///////////////////////////////////////////////wBmtgAAALZmAP///////////////5Db + /wAAOjoAAP/bkP///////wBmtgAAALZmAP///////////////5Db/wAAOjoAAP/bkP////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////+Q2/8AADoAAAD/tmb////////b//8AOpAAAAA6 + AAD/25D///////////+2//8AAGY6AAD/25D///////////////////////////////////////9mtv8A + AABmAAC2/7YAAGYAAADbkDr///////////9mtv8AAACQOgD//9v///////////+2//8AAGYAAAAAAAA6 + AAD/25D///////////9mtv8AAACQOgD//9v///+2//8AAGY6AAD/25D///////////////////////9m + tv8AAACQOgD//9v///86kNsAAACQOgD//9v///////////9mtv8AAABmAAD//7b///////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////+2//8AAGYAAADbkDr///////// + //////////////////////////////////+2//8AAGYAAADbkDr///////////////+2//8AAGYAAADb + kDr///+2//8AAGYAAADbkDr///////////////+2//8AAGYAAADbkDr///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////kNv/AAA6AAAA/7Zm////tv//AABmAAAAAAAA/7Zm//////// + ////////tv//AABmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOgAA/9uQ////2///ADqQAAAA25A6//// + OpDbAAAAkDoA///b////////Zrb/AAAAkDoA///b////////kNv/AAA6AAAAAAAAtmYA//////////// + ////////Zrb/AAAAkDoA///b////tv//AABmAAAA/7Zm////////////////////////OpDbAAAAkDoA + ///b////OpDbAAAAkDoA///b////////////Zrb/AAAAZgAA//+2//////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////tv//AABmAAAA25A6//////////////////// + ////////////////////////kNv/AAA6AAAA/7Zm////////////////2///ADqQAAAAtmYA////kNv/ + AAA6AAAA/7Zm////////////////2///ADqQAAAAtmYA//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////5Db/wAAOgAAAAAAAAAAAAAAAAAAADoAAP/bkP///////////////////9v/ + /wA6kAAAAP+2Zv///////////////7b//wAAZjoAAP/bkP///2a2/wAAADoAAP/bkP///7b//wAAZgAA + AP+2Zv///////2a2/wAAAJA6AP//2////9v//wA6kAAAAGYAAP//tv///////////////////////2a2 + /wAAAJA6AP//2////////wBmtgAAAJA6AP//2////////////////7b//wAAZgAAANuQOv///////zqQ + 2wAAADoAAP/bkP///////////zqQ2wAAAJA6AP//2/////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////7b//wAAZgAAANuQOv////////////////////////////// + /////////////5Db/wAAOjoAAP/bkP///////////////////wBmtgAAALZmAP///5Db/wAAOjoAAP/b + kP///////////////////wBmtgAAALZmAP////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////+Q2/8AADoAAAAAAAAAAAAAAAAAAAAAAAAAAAD/tmb///////////////////9mtv8AAAA6 + AAD/25D////////b//8AOpAAAACQOgD//9vb//8AOpAAAAC2ZgD///////////8AZrYAAACQOgD//9v/ + //9mtv8AAACQOgD//9v////b//8AOpAAAAC2ZgD///////+2//86AGb/25D///////9mtv8AAACQOgD/ + /9v///////+Q2/8AADoAAACQOgD//9v///////+Q2/8AADoAAABmAAD//7b///////86kNsAAAAAAABm + AAD//7b///+2//8AAGYAAAC2ZgD///////////9mtv8AAABmAAD//7b///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////+2//8AAGYAAADbkDr///////////////////////////////////////// + //+Q2/8AADo6AAD/25D///////////////////8AZrYAAAC2ZgD///+Q2/8AADo6AAD/25D///////// + //////////8AZrYAAAC2ZgD///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + kNv/AAA6AAAA/7Zm////////2///ADqQAAAAOgAA/9uQ////////////////////OpDbAAAAAAAAAAAA + AAAAAAAAAAAAOgAA/9uQ////kNv/AAA6OgAA/9uQ////////////kNv/AAA6OgAA/9uQ////Zrb/AAAA + kDoA///b////////OpDbAAAAAAAAAAAAAAAAAAAAOgAA/9uQ////////Zrb/AAAAkDoA///b//////// + ////Zrb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAOgAA/9uQ////////////OpDbAAAAZjoAADpmAAAAAAAA + AAAAAAAAOgAA/9uQ////////////AGa2AAAAAAAA/7Zm//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////tv//AABmAAAA25A6////////////////////////////////////////////kNv/AAA6 + OgAA/9uQ////////////////////AGa2AAAAtmYA////kNv/AAA6OgAA/9uQ//////////////////// + AGa2AAAAtmYA//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////5Db/wAAOgAA + AP+2Zv///////////7b//wAAZgAAALZmAP///////////////////////5Db/wAAOgAAAAAAAAAAALZm + AP///////9v//wA6kAAAALZmAP///////////////9v//wA6kAAAALZmAP///2a2/wAAAJA6AP//2/// + /////////zqQ2wAAAAAAAAAAAAAAAP+2Zv///////////2a2/wAAAJA6AP//2/////////////////// + /wBmtgAAAAAAAAAAAAAAANuQOv///////////////////zqQ2wAAAJA6AP//2wBmtgAAAAAAAGYAAP// + tv///////////////2a2/wAAAGYAAP//tv////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /7b//wAAZgAAANuQOv///////////////////////////////////////////5Db/wAAOgAAAP+2Zv// + /////////////9v//wA6kAAAALZmAP///5Db/wAAOgAAAP+2Zv///////////////9v//wA6kAAAALZm + AP////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////+Q2/8AADoAAAD/tmb///// + //////////8AZrYAAACQOgD//9v///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////+2//8AAGYA + AADbkDr///////////////////////////////////////////+2//8AAGYAAADbkDr///////////// + //+2//8AAGYAAADbkDr///+2//8AAGYAAADbkDr///////////////+2//8AAGYAAADbkDr///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////kNv/AAA6AAAA/7Zm//////////////// + AGa2AAAAkDoA///b//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////tv//AABmAAAA25A6//// + ////////////////////////////////////////////AGa2AAAAtmYA////////////////kNv/AAA6 + OgAA/9uQ////////AGa2AAAAtmYA////////////////kNv/AAA6OgAA/9uQ//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////5Db/wAAOgAAAP+2Zv///////////7b//wAAZgAAALZm + AP////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////7b//wAAZgAAANuQOv////////////// + /////////////////////////////////2a2/wAAADoAAP/bkP///////////wBmtgAAAJA6AP//2/// + /////2a2/wAAADoAAP/bkP///////////wBmtgAAAJA6AP//2/////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////+Q2/8AADoAAAD/tmb////////b//8AOpAAAAA6AAD/25D///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////9mtv8AAACQOgD//9v///////////////////////////////////////////// + //9mtv8AAACQOgD//9v///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////+2//8AAGYAAADbkDr///////////////////////// + ///////////////////////b//8AOpAAAACQOgD//9v///9mtv8AAAAAAAD/tmb////////////b//8A + OpAAAACQOgD//9v///9mtv8AAAAAAAD/tmb///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////kNv/AAA6AAAAAAAAAAAAAAAAAAAAAAAAAAAA25A6//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////Zrb/AAAAkDoA///b////////////////////////////////////////////////Zrb/AAAA + kDoA///b//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////tv//AABmAAAA25A6//////////////////////////////////// + ////////////////tv//AABmAAAAAAAAAAAAAAAAAAAA25A6////////////////////tv//AABmAAAA + AAAAAAAAAAAAAAAA25A6//////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////5Db/wAAOgAAAAAAAAAAAAAAAAAAAGYAAP//tv////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////7b//wAAZgAAANuQOv////////////////////////////////////////////// + /////////////wBmtgAAAAAAAAAAAP+2Zv///////////////////////////////wBmtgAAAAAAAAAA + AP+2Zv////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////kNv/AAA6AAAAZgAA//+2//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////2a2/wAAAAAAAAAAAAAAAP+2Zv////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////b//8AOpAAAACQOgD//9v///////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////Zrb/AAAAOgAA/9uQ//////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////5Db/wAAOgAAAP+2Zv////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////+2 + //8AAGYAAAD/tmb///////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////kNv/AAA6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkDoA///b//////////////// + ////////////kNv/AAA6AAAAAAAAAAAAOjo6AAAAAAAAAAAA/7Zm////////////OpDbAAAAAAAAAAAA + AAAA/7Zm////////tv//AABmAAAAAAAAAAAAAAAAkDoA///b////////OpDbAAAAtmYA//////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////tv//AABmAAAA25A6////////////////////////2///ADqQAAAA + AAAAAAAAAAAAkDoA///b////////////////////////////////////////////////tv//AABmAAAA + /7Zm////////////////AGa2AAAAAAAAOgAA/9uQZrb/AAAAZgAA//+2////////OpDbAAAAkDoA///b + ////////////Zrb/AAAAZgAA//+2////////////////tv//AABmAAAAAAAAAAAAAAAAkDoA///b//// + ////////////////////////////tv//AABmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtmYA//// + ////////////2///ADqQAAAAAAAAAAAA/7Zm////////////////////////////////tv//AABmAAAA + 25A6////////////////////////////////kNv/AAA6AAAAAAAAAAAAtmYA//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////5Db/wAAOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJA6AP//2////////////////7b/ + /wAAZgAAAP+2Zv///7b//wAAZgAAALZmAP///////////////wBmtgAAAAAAAAAAAAAAAAAAAP+2Zv// + /zqQ2wAAAAAAAAAAAAAAAAAAAAAAAAAAAGYAAP//ttv//wA6kAAAADoAAP/bkP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////7b//wAAZgAAANuQOv///////////////////9v//wA6kAAAAAAAAAAAAAAAAAAA + AAAAAAAAAP+2Zv///////////////////////////////////////////7b//wAAZgAAAP+2Zv////// + /////wBmtgAAAAAAAAAAAAAAAAAAADo6OgAAAGYAAP//tv///////zqQ2wAAAJA6AP//2/////////// + /2a2/wAAAGYAAP//tv///////////zqQ2wAAAAAAAAAAAAAAAAAAAAAAAAAAAGYAAP//tv////////// + /////////////////////9v//wA6kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALZmAP///////////5Db + /wAAOgAAAAAAAAAAAAAAAAAAANuQOv///////////////////////////7b//wAAZgAAANuQOv////// + /////////////////////wBmtgAAAAAAAAAAAAAAAAAAAAAAADoAAP/bkP////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////+Q2/8A + ADoAAAD/tmb////////////////////b//8AOpAAAAAAAAA6AAD/25D///////////9mtv8AAACQOgD/ + /9v///////86kNsAAAC2ZgD///////////+2//8AAGYAAADbkDr///////////////+Q2/8AADoAAABm + AAD//7b///////////+2//9mAGb//7b///86kNsAAAC2ZgD///////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////+2//8AAGYAAADbkDr////////////////////b//8AOpD/tmb///////////+Q2/8AADoAAAA6 + AAD/25D///////////////////////////////////////+2//8AAGYAAAD/tmb///////+Q2/8AADoA + AADbkDr///////9mtv8AAAAAAABmAAD//7b///////86kNsAAACQOgD//9v///////////9mtv8AAABm + AAD//7b///////+Q2/8AADoAAABmAAD//7b///////////+2//9mAGb//7b///////////////////// + //////////////+2//8AAGYAAADbkDr////////////////////////////////b//8AOpAAAACQOgD/ + /9v///9mtv8AAAAAAAD/tmb///////////////////////+2//8AAGYAAADbkDr///////////////// + //////86kNsAAAAAAADbkDr////////b//8AOpAAAABmAAD//7b///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////kNv/AAA6AAAA/7Zm + ////////////////////////////tv//AABmAAAAZgAA//+2////////kNv/AAA6ZgAA//+2//////// + OpDbAAAAtmYA////////////tv//AABmOgAA/9uQ////////////////AGa2AAAAZgAA//+2//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////tv// + AABmAAAA25A6////////////////////////////////////////////////kNv/AAA6AAAAtmYA//// + ////////////////////////////////////tv//AABmAAAA/7Zm////////Zrb/AAAAZgAA//+2//// + ////////Zrb/AAAAZgAA//+2////////OpDbAAAAkDoA///b////////////Zrb/AAAAZgAA//+2//// + ////AGa2AAAAZgAA//+2//////////////////////////////////////////////////////////// + ////////kNv/AAA6AAAA/7Zm////////////////////////////Zrb/AAAAOgAA/9uQ//////////// + AGa2AAAAkDoA///b////////////////////tv//AABmAAAA25A6////////////////////2///ADqQ + AAAAtmYA////////////////tv//AABmAAAA25A6//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////5Db/wAAOgAAAP+2Zv////////// + /////////////////////5Db/wAAOgAAALZmAP///////////wBmtgAAALZmAP///////zqQ2wAAALZm + AP///////////7b//wAAZjoAAP/bkP///////////7b//wAAZgAAANuQOv////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////7b//wAAZgAAANuQ + Ov///////////////////////////////////////////////////wBmtgAAAJA6AP//2/////////// + /////////////////////////7b//wAAZgAAAP+2Zv///////zqQ2wAAAJA6AP//2////////////2a2 + /wAAAGYAAP//tv///////zqQ2wAAAJA6AP//2////////////2a2/wAAAGYAAP//tv///7b//wAAZgAA + ANuQOv////////////////////////////////////////////////////////////////////////// + /zqQ2wAAADoAAP/bkP///////////////////////wBmtgAAALZmAP///////////////5Db/wAAOjoA + AP/bkP///////////////////7b//wAAZgAAANuQOv///////////////////5Db/wAAOgAAAP+2Zv// + /////////////9v//wA6kAAAALZmAP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////+Q2/8AADoAAAD/tmb///////////////////// + //////////////86kNsAAABmAAD//7b///////////86kNsAAAAAAAD/tmY6kNsAAAC2ZgD///////// + //+2//8AAGY6AAD/25D///////////+2//8AAGY6AAD/25D///////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////+2//8AAGYAAADbkDr///////// + //////////////////////////////////////////86kNsAAABmAAD//7b///////////////////// + //////////////+2//8AAGYAAAD/tmb///////86kNsAAACQOgD//9v///////////9mtv8AAABmAAD/ + /7b///////86kNsAAACQOgD//9v///////////9mtv8AAABmAAD//7b///+2//8AAGY6AAD/25D///// + //////////////////////////////////////////////////////////////////////////8AZrYA + AABmAAD//7b///////////////+2//8AAGYAAADbkDr///////////////+2//8AAGYAAADbkDr///// + //////////////+2//8AAGYAAADbkDr///////////////////+Q2/8AADoAAAD/tmb///////////// + ///b//8AOpAAAAC2ZgD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////kNv/AAA6AAAA/7Zm//////////////////////////////// + ////kNv/AAA6AAAA/7Zm////////////////////tv//AABmAAAAAAAAtmYA////////////tv//AABm + OgAA/9uQ////////////tv//AABmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOgAA/9uQ//////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////tv//AABmAAAA25A6//////////////////// + ////////////////////////////////AGa2AAAAkDoA///b//////////////////////////////// + ////tv//AABmAAAA/7Zm////////OpDbAAAAkDoA///b////////////Zrb/AAAAZgAA//+2//////// + OpDbAAAAkDoA///b////////////Zrb/AAAAZgAA//+2////tv//AABmAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAOgAA/9uQ////////////////////////////////////////////////tv//AABmAAAAtmYA + ////////////////kNv/AAA6AAAA/7Zm////////////////2///ADqQAAAAtmYA//////////////// + ////tv//AABmAAAA25A6////////////////////tv//AABmAAAAtmYA////////////////kNv/AAA6 + AAAA25A6//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////5Db/wAAOgAAAP+2Zv///////////////////////////////////9v//wA6 + kAAAANuQOv///////////////////////////zqQ2wAAALZmAP///////////7b//wAAZjoAAP/bkP// + /////////9v//wA6kAAAAP+2Zv///////////////7b//wAAZjoAAP/bkP////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////7b//wAAZgAAANuQOv////////////////////////////// + /////////////////5Db/wAAOgAAALZmAP///////////////////////////////////////7b//wAA + ZgAAAP+2Zv///////zqQ2wAAAJA6AP//2////////////2a2/wAAAGYAAP//tv///////zqQ2wAAADoA + AP/bkP///////////zqQ2wAAAJA6AP//2////9v//wA6kAAAAP+2Zv///////////////7b//wAAZjoA + AP/bkP///////////////////////////////////////////////////zqQ2wAAADoAAP/bkP////// + /////5Db/wAAOjoAAP/bkP///////////////////wBmtgAAALZmAP///////////////////7b//wAA + ZgAAANuQOv///////////////////////wBmtgAAAAAAANuQOv///////7b//wAAZgAAADoAAP/bkP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////+Q2/8AADoAAAD/tmb////////////////////////////////////b//8AOpAAAAC2ZgD/ + //+Q2/+QOjr//9v///////+2//8AAGYAAADbkDr///////////+2//8AAGY6AAD/25D///////////// + //9mtv8AAAA6AAD/25D////////b//8AOpAAAACQOgD//9v///9mtv8AAABmAAD//7b///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////+2//8AAGYAAADbkDr///////////////////////////////////////// + //9mtv8AAAAAAAA6AAD/25D///////////////////////////////////////+2//8AAGYAAAD/tmb/ + //////86kNsAAACQOgD//9v///////////9mtv8AAABmAAD//7b///////86kNsAAAAAAABmAAD//7b/ + //+2//8AAGYAAAC2ZgD///////////9mtv8AAAA6AAD/25D////////b//8AOpAAAACQOgD//9v///// + ///////////////////////////////////////////////b//8AOpAAAAC2ZgD///////////+Q2/8A + ADo6AAD/25D///////////////////8AZrYAAAC2ZgD///////////////////+2//8AAGYAAADbkDr/ + //////////////////////+2//8AAGYAAAAAAAAAAAAAAAAAAAAAAAAAAADbkDr///////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + kNv/AAA6AAAA/7Zm////////////////////////////////////2///ADqQAAAA25A6////kNv/AAA6 + AAAAAAAAAAAAAAAAAAAAZgAA//+2////2///ADqQAAAAAAAAAAAAAAAAAAAAAAAAkDoA///b////OpDb + AAAAAAAAAAAAAAAAAAAAAAAAOgAA/9uQ////////AGa2AAAAAAAA/7Zm//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////tv//AABmAAAA25A6////////////////////////////OpDbAAAAAAAAAAAAAAAAAAAA + AAAA/7Zm////////////////////////////////////////////tv//AABmAAAA/7Zm////////OpDb + AAAAkDoA///b////////////Zrb/AAAAZgAA//+2////////OpDbAAAAZjoAADpmAAAAAAAAAAAAAAAA + OgAA/9uQ////////////////OpDbAAAAAAAAAAAAAAAAAAAAAAAAOgAA/9uQ//////////////////// + ////////////////////////////////////////OpDbAAAAZgAA//+2////////kNv/AAA6OgAA/9uQ + ////////////////////AGa2AAAAtmYA////////////////////tv//AABmAAAA25A6//////////// + ////////////////2///ADqQAAAAAAAAAAAAAAAAAAAA/7Zm//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////5Db/wAAOgAA + AP+2Zv///////////////////////////////////7b//wAAZgAAAP+2Zv///////5Db/wAAOgAAAAAA + AAAAAJA6AP//2////////////9v//wA6kAAAAAAAAAAAAAAAAAAAAJA6AP//2////////5Db/wAAOgAA + AAAAAAAAALZmAP///////////////2a2/wAAAGYAAP//tv////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /7b//wAAZgAAANuQOv///////////////////////////zqQ2wAAAAAAAAAAAAAAAJA6AP//2/////// + /////////////////////////////////////////7b//wAAZgAAAP+2Zv///////zqQ2wAAAJA6AP// + 2////////////2a2/wAAAGYAAP//tv///////zqQ2wAAAJA6AP//2wBmtgAAAAAAAGYAAP//tv////// + /////////////////5Db/wAAOgAAAAAAAAAAALZmAP////////////////////////////////////// + /////////////////////////////5Db/wAAOgAAAP+2Zv///////5Db/wAAOgAAAP+2Zv////////// + /////9v//wA6kAAAALZmAP///////////////////7b//wAAZgAAANuQOv////////////////////// + /7b//wAAZgAAALZmAP///////7b//wAAZgAAANuQOv////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////+Q2/8AADoAAAD/tmb///// + //////////////////////////////86kNsAAAA6AAD/25D///////////////////////////////// + //////////////////+2//8AAGY6AAD/25D///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////+2//8AAGYA + AADbkDr///////////////////////////86kNsAAACQOgD//9v///////////////////////////// + //////////////////////////////+2//8AAGYAAAD/tmb///////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////+2//8AAGYAAADbkDr///////+2//8AAGYAAADbkDr///////////////+2//8A + AGYAAADbkDr///////////////////+2//8AAGYAAADbkDr///////////////////////86kNsAAACQ + OgD//9v///////////+Q2/8AADo6AAD/25D///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////kNv/AAA6AAAA/7Zm//////////////// + ////////////////tv//AABmAAAAtmYA//////////////////////////////////////////////// + ////////////kNv/OgA6/9uQ//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////tv//AABmAAAA25A6//// + ////////////////////////OpDbAAAAkDoA///b//////////////////////////////////////// + ////////////////////tv//AABmAAAA/7Zm//////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////tv//AABmAAAA/7Zm////////////AGa2AAAAtmYA////////////////kNv/AAA6OgAA/9uQ + ////////////////////tv//AABmAAAA25A6////////////////////2///ADqQAAAAtmYA//////// + ////////tv//AABmAAAA25A6//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////5Db/wAAOgAAAP+2Zv////////////////////////// + /7b//wAAZgAAAGYAAP//tv////////////////////////////////////////////////////////// + /////5C2///bkP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////7b//wAAZgAAANuQOv////////////// + /////////////zqQ2wAAAJA6AP//2/////////////////////////////////////////////////// + /////////7b//wAAZgAAAP+2Zv////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////9v//7aQkP///////////////////2a2 + /wAAADoAAP/bkP///////////2a2/wAAADoAAP/bkP///////////wBmtgAAAJA6AP//2/////////// + /////////7b//wAAZgAAANuQOv///////////////////////wBmtgAAAJA6AP//2////////////5Db + /wAAOgAAAP+2Zv////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////+Q2/8AADoAAAD/tmb////////////////////b//8AOpAAAAAAAAA6 + AAD/25D///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////+2//8AAGYAAADbkDr///////////////////////// + //86kNsAAACQOgD//9v///////////////////////////////////////////////////////////+2 + //8AAGYAAAD/tmb///////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////b//8AOpBmAAD//7b///////9mtv8AAAAAAAC2ZgD/ + ///////////////b//8AOpAAAACQOgD//9v///9mtv8AAAAAAAD/tmb///////////////////////+2 + //8AAGYAAADbkDr///////////////////////9mtv8AAAAAAAC2ZgD///////+2//8AAGYAAABmAAD/ + /7b///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////kNv/AAA6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZgAA//+2//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////tv//AABmAAAA25A6////////////////////////////OpDbAAAA + AAAAAAAAAAAAAAAAAAAAZgAA//+2////////////////////////////////////////tv//AABmAAAA + /7Zm//////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////2///ADqQAAAAAAAAAAAAAAAAAAAAAAAAZgAA//+2//////////// + ////////tv//AABmAAAAAAAAAAAAAAAAAAAA25A6////////////////////////////tv//AABmAAAA + 25A6////////////////////////////AGa2AAAAAAAAAAAAAAAAAAAAAAAAAAAA/7Zm//////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////5Db/wAAOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJA6AP//2/////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////7b//wAAZgAAANuQOv///////////////////////////zqQ2wAAAAAAAAAAAAAA + AAAAAAAAAGYAAP//tv///////////////////////////////////////7b//wAAZgAAAP+2Zv////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////5Db/wAAOgAAAAAAAAAAALZmAP////////////////////////////// + /////wBmtgAAAAAAAAAAAP+2Zv///////////////////////////////7b//wAAZgAAANuQOv////// + /////////////////////////5Db/wAAOgAAAAAAAAAAAJA6AP//2/////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////Zrb/AAAAAAAA/7Zm//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////wBmtgAAALZmAP////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////9mtv8AAAA6AAD/25D///////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////2///ADqQAAAAtmYA////////////////////////2///ADqQ/7Zm//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////2a2/wAAADoAAP/bkP///////////////////////7b//wAAZv+2Zv////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///b//8AOpAAAAC2ZgD////////////////////////b//8AOpBmAAD//7b///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////2///ADqQAAAAtmYA////////////////////////////////////////tv//AABmAAAA25A6 + ////////////AGa2AAAAAAAAOgAA/9uQZrb/AAAAZgAA//+2////////////////OpDbAAAAAAAAAAAA + AAAA/7ZmOpDbAAAAkDoA///b////////////Zrb/AAAAZgAA//+2////////////////////AGa2AAAA + AAAAAAAAAAAA25A6////////////////////Zrb/AAAAZgAA//+2////////////////////////tv// + AABmAAAAAAAAAAAAZgAA//+2////////////OpDbAAAAtmYA//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////kNv/AAA6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkDoA///b//////////////// + ////////////kNv/AAA6AAAAAAAAAAAAOjo6AAAAAAAAAAAA/7Zm////////////////kNv/OgA6/9uQ + ////////////////////////////tv//AABmAAAAAAAAAAAAAAAAkDoA///b////////////////Zrb/ + AAAAZgAA//+2////////////////////AGa2AAAAOgAA/9uQ//////////////////////////////// + ////kNv/AAA6AAAAAAAAAAAAAAAAAAAAAAAAAAAA25A6////////////////////////tv//AABmAAAA + AAAAAAAAAAAAkDoA///b////////OpDbAAAAkDoA///b////////////Zrb/AAAAZgAA//+2//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /2a2/wAAADoAAP/bkP///////////////////////////////////zqQ2wAAAGYAAP//tv///////wBm + tgAAAAAAAAAAAAAAAAAAADo6OgAAAGYAAP//tv///////////wBmtgAAAAAAAAAAAAAAAAAAAP+2ZjqQ + 2wAAAJA6AP//2////////////2a2/wAAAGYAAP//tv///////////2a2/wAAAAAAAAAAAAAAAAAAAAAA + AAAAADoAAP/bkP///////////2a2/wAAAGYAAP//tv///////////////////7b//wAAZgAAAAAAAAAA + AAAAAAAAADoAAP/bkP///9v//wA6kAAAADoAAP/bkP////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////5Db/wAAOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJA6AP//2////////////////7b/ + /wAAZgAAAP+2Zv///7b//wAAZgAAALZmAP///////////////////////zqQ2wAAALZmAP////////// + /////////////zqQ2wAAAAAAAAAAAAAAAAAAAAAAAAAAAGYAAP//tv///////////7b//wAAZgAAANuQ + Ov///////////////7b//wAAZgAAAGYAAP//tv///////////////////////////////////5Db/wAA + OgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGYAAP//tv///////////zqQ2wAAAAAAAAAAAAAAAAAAAAAA + AAAAAGYAAP//tv///zqQ2wAAAJA6AP//2////////////2a2/wAAAGYAAP//tv////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////+2//8AAGYA + AADbkDr///////////////////////////////+2//8AAGYAAADbkDr///////+Q2/8AADoAAADbkDr/ + //////9mtv8AAAAAAABmAAD//7b///////+2//8AAGYAAADbkDr///////////////86kNsAAACQOgD/ + /9v///////////9mtv8AAABmAAD//7b///////+Q2/8AADoAAACQOgD//9v///////+2//8AAGYAAABm + AAD//7b///////9mtv8AAABmAAD//7b///////////////////+2//8AAGb/tmb///////+2//8AAGYA + AAC2ZgD///////86kNsAAAC2ZgD///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////+Q2/8A + ADoAAAD/tmb////////////////////b//8AOpAAAAAAAAA6AAD/25D///////////9mtv8AAACQOgD/ + /9v///////86kNsAAAC2ZgD///////////////////+2//8AAGYAAAA6AAD/25D///////////////+Q + 2/8AADoAAABmAAD//7b///////////+2//9mAGb//7b////////////b//8AOpAAAABmAAD//7b///// + //////////8AZrYAAADbkDr///////////////////////////////////////+Q2/8AADoAAAD/tmb/ + //////////////9mtv8AAAAAAACQOgD//9v///+Q2/8AADoAAABmAAD//7b///////////+2//9mAGb/ + /7b///86kNsAAACQOgD//9v///////////9mtv8AAABmAAD//7b///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////OpDbAAAAZgAA//+2 + ////////////////////////////Zrb/AAAAOgAA/9uQ////////Zrb/AAAAZgAA//+2//////////// + Zrb/AAAAZgAA//+2////////tv//AABmOgAA/9uQ////////////////OpDbAAAAkDoA///b//////// + ////Zrb/AAAAZgAA//+2////////AGa2AAAAkDoA///b////////////////tv//AABmAAAA25A6//// + ////Zrb/AAAAZgAA//+2////////////////////////////////////////2///ADqQAAAAtmYA//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////kNv/AAA6AAAA/7Zm + ////////////////////////////tv//AABmAAAAZgAA//+2////////kNv/AAA6ZgAA//+2//////// + OpDbAAAAtmYA////////////////////OpDbAAAAAAAAAAAA25A6////////////////AGa2AAAAZgAA + //+2////////////////////////////////////////Zrb/AAAAAAAAAAAA25A6//////////////// + ////////////////////////////////////////////////////kNv/AAA6AAAA/7Zm//////////// + ////////Zrb/AAAAAAAA/7Zm////AGa2AAAAZgAA//+2////////////////////////////////OpDb + AAAAkDoA///b////////////Zrb/AAAAZgAA//+2//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////7b//wAAZgAAANuQOv////////// + /////////////9v//wA6kAAAALZmAP///////////zqQ2wAAAJA6AP//2////////////2a2/wAAAGYA + AP//tv///////7b//wAAZjoAAP/bkP///////////////zqQ2wAAAJA6AP//2////////////2a2/wAA + AGYAAP//tv///7b//wAAZgAAAP+2Zv///////////////////////zqQ2wAAAJA6AP//2////2a2/wAA + AGYAAP//tv///////////////////////////////////2a2/wAAAAAAADoAAP/bkP////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////5Db/wAAOgAAAP+2Zv////////// + /////////////////////5Db/wAAOgAAALZmAP///////////wBmtgAAALZmAP///////zqQ2wAAALZm + AP///////////////7b//wAAZgAAADo6OgAAAGYAAP//tv///////7b//wAAZgAAANuQOv////////// + /////////////////////////////9v//wA6kAAAAAAAAAAAAJA6AP//2/////////////////////// + /////////////////////////////////////////5Db/wAAOgAAAP+2Zv///////////////////7b/ + /wAAZgAAANuQOrb//wAAZgAAANuQOv///////////////////////////////////zqQ2wAAAJA6AP// + 2////////////2a2/wAAAGYAAP//tv////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////8AZrYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAA6AAD/25D///////////86kNsAAACQOgD//9v///////////9mtv8AAABmAAD//7b///// + //+2//8AAGY6AAD/25D///////////////86kNsAAACQOgD//9v///////////9mtv8AAABmAAD//7b/ + //+2//8AAGY6AAD/25D///////////////////////9mtv8AAACQOgD//9v///9mtv8AAABmAAD//7b/ + //////////////////////////+2//8AAGYAAAAAAAA6AAD/25D///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////+Q2/8AADoAAAD/tmb///////////////////// + //////////////86kNsAAABmAAD//7b///////////86kNsAAAAAAAD/tmY6kNsAAAC2ZgD///////// + //////9mtv8AAABmAAC2/7YAAGYAAADbkDr///////+2//8AAGY6AAD/25D///////////////////// + //////////////////9mtv8AAAA6AAC225AAAGYAAAD/tmb///////////////////////////////// + //////////////////////////////+Q2/8AADoAAAD/tmb///////////////////+2//8AAGYAAADb + kDq2//8AAGY6AAD/25D///////////////////////////////////86kNsAAACQOgD//9v///////// + //9mtv8AAABmAAD//7b///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////kNv/AAA6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + kDoA///b////////////OpDbAAAAkDoA///b////////////Zrb/AAAAZgAA//+2////////tv//AABm + OgAA/9uQ////////////////OpDbAAAAkDoA///b////////////Zrb/AAAAZgAA//+2////tv//AABm + AAAA/7Zm////////////////////////OpDbAAAAkDoA///b////Zrb/AAAAZgAA//+2//////////// + ////////////kNv/AAA6AAAAAAAAtmYA//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////kNv/AAA6AAAA/7Zm//////////////////////////////// + ////kNv/AAA6AAAA/7Zm////////////////////tv//AABmAAAAAAAAtmYA////////////2///ADqQ + AAAA25A6////OpDbAAAAkDoA///b////tv//AABmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOgAA/9uQ + ////2///ADqQAAAAtmYA////OpDbAAAAkDoA///b//////////////////////////////////////// + ////////////////////kNv/AAA6AAAA/7Zm////////////////////Zrb/AAAAOgAA/9uQtv//AABm + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOgAA/9uQ////OpDbAAAAkDoA///b////////////Zrb/AAAA + ZgAA//+2//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////9v//wA6kAAAALZmAP///////////////2a2/wAAAAAAAP+2Zv////// + /////////zqQ2wAAAJA6AP//2////////////2a2/wAAAGYAAP//tv///////7b//wAAZjoAAP/bkP// + /////////////zqQ2wAAAGYAAP//tv///////////zqQ2wAAAJA6AP//2////////wBmtgAAAJA6AP// + 2////////////////7b//wAAZgAAANuQOv///////2a2/wAAAAAAANuQOv///////////////////9v/ + /wA6kAAAAGYAAP//tv////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////5Db/wAAOgAAAP+2Zv///////////////////////////////////9v//wA6 + kAAAANuQOv///////////////////////////zqQ2wAAALZmAP///////////2a2/wAAADoAAP/bkP// + /7b//wAAZgAAAP+2Zv///9v//wA6kAAAAP+2Zv///////////////7b//wAAZjoAAP/bkP///2a2/wAA + ADoAAP/bkP///5Db/wAAOgAAAP+2Zv////////////////////////////////////////////////// + /////////5Db/wAAOgAAAP+2Zv///////////////2a2/wAAAAAAALZmAP///9v//wA6kAAAAP+2Zv// + /////////////7b//wAAZjoAAP/bkP///zqQ2wAAADoAAP/bkP///////////zqQ2wAAAJA6AP//2/// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////9mtv8AAAA6AAD/25D////////b//8AOpAAAACQOgD//9v///////////////86 + kNsAAACQOgD//9v///////////9mtv8AAABmAAD//7b///////+2//8AAGY6AAD/25D///////////// + //86kNsAAAAAAABmAAD//7b///+2//8AAGYAAAC2ZgD///////////+Q2/8AADoAAACQOgD//9v///// + //+Q2/8AADoAAABmAAD//7b///////9mtv8AAAA6AAAAOjr/tmb////b//86OpD/25Db//8AOpAAAAC2 + ZgD///////+2//86AGb/25D///////9mtv8AAABmAAD//7b///////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////+Q2/8AADoAAAD/tmb////////////////////////////////////b//8AOpAAAAC2ZgD/ + //+Q2/+QOjr//9v///////+2//8AAGYAAADbkDr////////b//8AOpAAAAC2ZgD///////////8AZrYA + AACQOgD//9v///9mtv8AAAA6AAD/25D////////b//8AOpAAAACQOgD//9vb//8AOpAAAAC2ZgD///// + //////8AZrYAAACQOgD//9v///////////////////////////////////////////////////////+Q + 2/8AADoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbkDr///////////9mtv8AAAA6AAD/25D////////b + //8AOpAAAACQOgD//9v///86kNsAAAAAAABmAAD//7b///+2//8AAGYAAAC2ZgD///////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////2///ADqQAAAA25A6////////kNv/AAA6AAAA/7Zm////////////////////OpDbAAAAkDoA + ///b////////////Zrb/AAAAZgAA//+22///ADqQAAAAAAAAAAAAAAAAAAAAAAAAkDoA///bOpDbAAAA + ZjoAADpmAAAAAAAAAAAAAAAAOgAA/9uQ////////////////Zrb/AAAAAAAAAAAAAAAAAAAAAAAAAAAA + OgAA/9uQ////////////Zrb/AAAAZgAAkNu2AAA6AAAAAAAAAAAAkDoA///bOpDbAAAAAAAAAAAAAAAA + AAAAOgAA/9uQ////////AGa2AAAAAAAA/7Zm//////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + kNv/AAA6AAAA/7Zm////////////////////////////////////2///ADqQAAAA25A6////kNv/AAA6 + AAAAAAAAAAAAAAAAAAAAZgAA//+2////////kNv/AAA6OgAA/9uQ////////////kNv/AAA6OgAA/9uQ + ////////OpDbAAAAAAAAAAAAAAAAAAAAAAAAOgAA/9uQ////Zrb/AAAAOgAA/9uQ////////////kNv/ + AAA6OgAA/9uQ////////////////////////////////////////////////////////kNv/AAA6AAAA + AAAAAAAAAAAAAAAAAAAAkDoA///b////////////////////OpDbAAAAAAAAAAAAAAAAAAAAAAAAOgAA + /9uQ////////OpDbAAAAZjoAADpmAAAAAAAAAAAAAAAAOgAA/9uQ//////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /zqQ2wAAAGYAAP//tv///wBmtgAAAGYAAP//tv///////////////////zqQ2wAAAJA6AP//2/////// + /////2a2/wAAAGYAAP//tv///9v//wA6kAAAAAAAAAAAAAAAAAAAAJA6AP//2zqQ2wAAAJA6AP//2wBm + tgAAAAAAADoAAP/bkP///////////////////////////wBmtgAAAAAAAAAAAAAAANuQOv////////// + /////////2a2/wAAAGYAAP//tpDb/wAAOgAAAGYAAP//tv///////zqQ2wAAAAAAAAAAAAAAAP+2Zv// + /////////2a2/wAAAGYAAP//tv////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////5Db/wAAOgAA + AP+2Zv///////////////////////////////////7b//wAAZgAAAP+2Zv///////5Db/wAAOgAAAAAA + AAAAAJA6AP//2////////9v//wA6kAAAALZmAP///////////////9v//wA6kAAAALZmAP////////// + /5Db/wAAOgAAAAAAAAAAALZmAP///////9v//wA6kAAAAJA6AP//2////////////9v//wA6kAAAAJA6 + AP//2////////////////////////////////////////////////////5Db/wAAOgAAAP+2Zv////// + /////zqQ2wAAADoAAP/bkP///////////////////5Db/wAAOgAAAAAAAAAAALZmAP////////////// + /zqQ2wAAAJA6AP//2wBmtgAAAAAAAGYAAP//tv////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////+2//8AAGYA + AAD/tma2//8AAGYAAADbkDr///////////////////////////////////////////////////////// + //////////////////+2//8AAGY6AAD/25D///////////////86kNsAAACQOgD//9v///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////+Q2/8AADoAAAD/tmb///// + //////////////////////////////86kNsAAAA6AAD/25D///////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////+Q2/8AADoAAAD/tmb///////////////8A + ZrYAAACQOgD//9v///////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////AGa2AAAAkDoAOpC2 + AAAAZgAA//+2//////////////////////////////////////////////////////////////////// + ////////////kNv/OgA6/9uQ////////////////OpDbAAAAkDoA///b//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////kNv/AAA6AAAA/7Zm//////////////// + ////////////////tv//AABmAAAAtmYA//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////kNv/AAA6AAAA/7Zm////////////////Zrb/AAAAZgAA + //+2//////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////5Db/wAAOgAAAAAAAAAAALZmAP// + //////////////////////////////////////////////////////////////////////////////// + /////5C2///bkP///////////////zqQ2wAAAJA6AP//2/////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////5Db/wAAOgAAAP+2Zv////////////////////////// + /7b//wAAZgAAAGYAAP//tv////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////5Db/wAAOgAAAP+2Zv///////////////zqQ2wAAAGYAAP//tv////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////8AZrYAAAAAAAA6AAD/25D///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////86kNsAAACQOgD//9v///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////+Q2/8AADoAAAD/tmb////////////////////b//8AOpAAAAAAAAA6 + AAD/25D///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////+Q2/8AADoAAAD/tmb///////////9mtv8AAAAAAAC2ZgD///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////Zrb/AAAAAAAAtmYA//////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////OpDbAAAAkDoA///b//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////kNv/AAA6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZgAA//+2//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////kNv/AAA6AAAAAAAAAAAAAAAAAAAAAAAAAAAAZgAA//+2//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////9v//wA6kDoAAP/bkP////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////zqQ + 2wAAAJA6AP//2/////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////5Db/wAAOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJA6AP//2/////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////5Db/wAA + OgAAAAAAAAAAAAAAAAAAAAAAANuQOv////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////w8PDQ0NCysrKMjIx8 + fHwAAAAAAAAAAAAAAAAAAAB8fHyMjIyysrLQ0NDp6en///////////////////////////////////// + ///////////////////////w8PCnp6doaGgAAAAAAABNTU2MjIy9vb3p6en////////////////w8PCn + p6doaGgAAAAAAABoaGiMjIzHx8fw8PD///////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////h4eGnp6doaGgAAAAAAAAAAACM + jIyysrLp6en///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////w8PCnp6doaGgAAAAAAABNTU2MjIy9vb3p6en////////////////w8PCnp6doaGgAAAAAAABo + aGiMjIzHx8fw8PD////////////////////////////////////////////Q0NCnp6d8fHwAAAAAAAAA + AABoaGiamprHx8fw8PD///////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////Z2dmysrKMjIxNTU0AAAAAAAAA + AABNTU2MjIyysrLZ2dn///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////Z2dmysrKMjIxNTU0A + AAAAAAAAAABNTU2MjIyysrLZ2dn///////////////////////////////////////////////////// + ///////////////////////////////////h4eG9vb2MjIx8fHwAAAAAAAAAAAAAAABoaGiMjIyysrLQ + 0NDw8PD////////////////////////////////////////////////////////////Z2dmysrKMjIxN + TU0AAAAAAAAAAAAAAAB8fHyampq9vb3p6en///////////////////////////////////////////// + ///////////////////w8PC9vb2MjIxNTU0AAAAAAABoaGinp6fZ2dn///////////////////////// + ///////////////////////////////////////////////////////////////h4eGnp6d8fHwAAAAA + AAAAAACMjIyysrLw8PD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////Z2dmysrKMjIxNTU0A + AAAAAAAAAAAAAAB8fHyampq9vb3p6en///////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////8PDwvb29aGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGhop6en2dnZ//////////////////////////////////// + ////////vb29AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjIyM4eHh////////TU1NAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAjIyM0NDQ////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// + ////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////4eHhfHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + jIyM6enp////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ////////////////////////////////////////////////////////////////////////vb29AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjIyM4eHh////////TU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAjIyM0NDQ////////////////////////////2dnZaGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAjIyM4eHh////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////// + ////////////////////////////////////vb29TU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAATU1Nvb29////////////////////////////////////////////////AAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA//////////////////////////////////////////////////////////////////////// + ////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////////// + ////////////////////////////////////////////vb29TU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAATU1Nvb29//////////////////////////////////////////////////////// + ////////////////vb29TU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGho + srKy////////////////////////////////////////8PDwp6enAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAaGhovb29//////////////////////////////////////////////// + ////p6enAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGho4eHh////AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA////////////////////////////////////6enpjIyMAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAsrKy////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////////// + ////////////////////////////////////////8PDwp6enAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAaGhovb29//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////Dw8KenpwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhoaL29vf///////////////////////////////7KysgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIyMjKenpwAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAOHh4f///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////// + /////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAL29vQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1NTdDQ + 0P///////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////// + /////////////////////////////////////////////////////////7KysgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIyMjKenpwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AOHh4f///////////////////9DQ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAP///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////// + /////////////////9DQ0E1NTQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAE1NTcfHx////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAP///////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + //////////////////////////////////////////////////////////////////////////////// + /////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////// + /////////////////////////////////////////////////////////////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////////////////////// + /////////////////////////9DQ0E1NTQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAE1NTcfHx////////////////////////////////////////////////////////8fH + x01NTQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////// + /////////////////////////////729vQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAE1NTb29vf///////////////////////////////////+Hh4U1NTQAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANDQ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /////////////////////////////9DQ0E1NTQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AHx8fOnp6f///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////////////////////// + /////////////////////////729vQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAE1NTb29vf////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////Hx8dNTU0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNTU29vb3////////////////////h4eEAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAADh4eH///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////8A + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQ0ND///// + //////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////// + ///////////////////////////////////////////h4eEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADh4eH///// + ///////////Z2dkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///// + //////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////// + //+np6cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACnp6f///////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///// + //////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// + //////////////////////////////////////////////////////////////////////////////8A + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////// + //////////////////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAD///////////////////////////////////////////////////////////////////// + //////////+np6cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAACnp6f///////////////////////////////////////////////+np6cAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////// + //////////////+MjIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACMjIz////////////////////////////Z2dkAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// + ///////////////p6elNTU0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNTU3p + 6ekAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAD///////////////////////////////////////////////////////////////////// + //////////+MjIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAACMjIz///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////jIyMAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////mpqaAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4eHh + ////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////AAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAA////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4eHh//////////// + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////// + ////////////////////////////////mpqaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4eHh//////////////// + aGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////p6enAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfHx8 + ////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////// + ////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////// + ////////////////////////////////////////////////////////////////////AAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////////////////// + ////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ////////////////////////////////////////////////////////////////////////////p6en + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAfHx8////////////////////////////////////////p6enAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////// + fHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAA////////////////////////6enpTU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////// + ////fHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfHx8AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ////////////////////////////////////////////////////////////////////////////fHx8 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////3x8fAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAP///////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHx8fPDw + 8P///+np6aenpwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMfHx////+np6aenp+Hh4f///////wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////wAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAP///////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1NTb29 + vfDw8P////Dw8L29vU1NTQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhoaP////////////////////// + /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////// + /////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHx8fPDw8P///+np6aenpwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMfHx////+np6aenp+Hh4f///////////9DQ0AAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAIyMjOnp6f////////Dw8OHh4bKysnx8fP///////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP///////////////////////////////729vQAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAGhoaNDQ0P///////////9DQ0GhoaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKenp/////// + /////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////// + /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////// + /////////////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP////////////////////////////////////////////////////////////////// + /////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////// + /////////////////////////////////////////////////////////////729vQAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAGhoaNDQ0P///////////9DQ0GhoaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKen + p////////////////////////////////7KysgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKen + p9nZ2f///////////+np6cfHx5qamgAAAAAAAAAAAP///////////////////////6enpwAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAE1NTbKysuHh4f////////////Dw8NnZ2aenpwAAAAAAAAAAAAAAAAAA + AP///////////////////////3x8fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1NTb29vfDw8P////// + /9DQ0GhoaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////9nZ2QAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAHx8fNnZ2f////////Dw8L29vU1NTQAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP///////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////// + /////////////////////////////////////////////////////////////6enpwAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAE1NTbKysuHh4f////////////Dw8NnZ2aenpwAAAAAAAAAAAAAAAAAAAP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////98fHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAD///////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw8PD///////////// + ///h4eEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ + //////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHz///////////////// + ///////p6elNTU0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC9vb3///////////////////////8AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////////////// + //////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw8PD////////////////h4eEAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////+np6cAAAAAAAAAAAAAAAAAAAAA + AAAAAACMjIz///////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAD////////////////////////////p6ekAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHz/ + //////////////////////////98fHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADh4eH///////////// + //////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////// + //8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////// + //////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///////////////////////////////////////////////////////////////////////////// + //////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////// + ///////////////////////////////////////////////p6ekAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAB8fHz///////////////////////////98fHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADh4eH///// + ///////////////////h4eEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoaGjp6en///////////// + ///////////////////////Q0NB8fHz////////////////////h4eEAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAACampr///////////////////////////////////////+9vb0AAAAAAAAAAAD///////// + ///////////Q0NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNTU3p6en///////////////////////98 + fHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////+np6cAAAAAAAAAAAAAAAAA + AAAAAAAAAABoaGj////////////////////////w8PB8fHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////// + ///////////////////////////////////////////////h4eEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACampr///////////////////////////////////////+9vb0AAAAAAAAAAAD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////fHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//// + ////////////////TU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////// + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////// + x8fHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATU1N////////////////////////AAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA//////////////////////////////////////////////////////////////// + TU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAA////////////////////////////////fHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAA2dnZ + ////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ////////////////////////////jIyMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6enp//////////// + ////////////////6enpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfHx8//////////////////////// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////////////////// + ////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////// + ////////////////////////////////////jIyMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6enp//// + ////////////////////////6enpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfHx8//////////////// + ////////jIyMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATU1N8PDw//////////////////////////// + ////////////////////////////////////////fHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAp6en + ////////////////////////////////////////////////6enpfHx8AAAA//////////////////// + aGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAx8fH////////////////////////////////AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA////////////////////////fHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAA + 0NDQ////////////////////////////6enpTU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////// + ////////////////////////////////////fHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAp6en//// + ////////////////////////////////////////////6enpfHx8AAAA//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////729vQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1NTaenp9nZ + 2enp6f///////////////+np6dnZ2bKysnx8fAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////// + /////4yMjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOHh4f///////////////////wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAP///////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////// + /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////////////2hoaAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAANnZ2f///////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAP///////////////////////////////////////////////////////////////4yMjAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAOHh4f///////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AP///////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////// + /////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////// + //////////////Dw8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJqamv////////////////////////// + /////////5qamgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOnp6f///////////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP///////////////////////////////////////wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP////////////////////////////////////////////////////////////////// + /////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////// + //////////////////////Dw8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJqamv////////////////// + /////////////////5qamgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOnp6f///////////////+np6QAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOHh4f////////////////////////////////////////// + /////////////////////////+np6QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1NTf////////////// + /////////////////////////////////////////////6enp////////////////+np6QAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAGhoaP///////////////////////////////////wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP///////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPDw8P////// + /////////////////////////9DQ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////// + /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////// + /////////////////////+np6QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1NTf////////////////// + /////////////////////////////////////////6enp/////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////p + 6ekAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoaGjQ0ND///////////////////// + ///////////////////////////w8PC9vb1oaGgAAAAAAAAAAAAAAAD////////////////////Q0NAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHz///////////////////8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAD///////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// + //////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////8AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////+ysrIAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACysrL///////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///// + ///////////////////////////////////////////////////////////Q0NAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAB8fHz///////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////// + //////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////// + //////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////// + ///Hx8cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADHx8f////////////////////////////////////H + x8cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC9vb3///////////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAD///////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///////////////////////////////////////////////////////////////////////////// + //////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////// + //////////////////////////////////////////////////////////////////////////8AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////////////// + ///////////Hx8cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADHx8f///////////////////////////// + ///////Hx8cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC9vb3///////////////+9vb0AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACMjIz///////////////////////////////////////////////////////// + //////////////+9vb0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACysrL///////////////////////// + //////////////////////////////////////////////////////+9vb0AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAACysrL///////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////// + //////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////8AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////////////// + //////////+9vb0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACysrL///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////jIyMAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAp6en//////////////////////////////////////// + ////////////////////////////0NDQfHx8AAAAAAAA////////////////////////fHx8AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAATU1Nvb29////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//// + ////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////// + ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////AAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA////////////////////////////////////4eHhAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAjIyM////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////// + ////////////////////////////////////////////////////fHx8AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAATU1Nvb29////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////// + ////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////// + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////jIyMAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAA4eHh////////////////////////////////////4eHhAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAjIyM////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// + //////////////////////////////////////////////////////////////////////////////// + ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////// + ////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA//////////////////////////////////////////////////////////////// + jIyMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4eHh////////////////////////////////////4eHh + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjIyM////////////////jIyMAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA0NDQ//////////////////////////////////////////////////////////////////// + ////jIyMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4eHh//////////////////////////////////// + ////////////////////////////////////////////jIyMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 4eHh////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////// + ////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////AAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA//////////////////////////////////////////////////////////////// + jIyMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4eHh//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////+Hh4QAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAKenp/////////////////////////////////////////////////////// + /////////////////////////+Hh4YyMjP///////////////////////+np6U1NTQAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAE1NTbKysunp6QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////// + /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////wAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAP////////////////////////////////////Dw8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1N + Tf///////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////// + /////////////////////////////////////////+np6U1NTQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAE1NTbKysunp6QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////////// + /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////2hoaAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAP///////////////////////////////////////////wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAE1NTf///////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////// + /////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////// + /////////////////////////////////////////////////////////////////////////wAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////////////// + /////////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAP///////////////////////////////////////////////////////////////2hoaAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////////////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAE1NTf///////////////01NTQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOnp + 6f///////////////////////////////////////////////////////////////////////01NTQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////////////// + /////////////////////////////////01NTQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////// + /////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////// + /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////////////////wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAP///////////////////////////////////////////////////////////////01NTQAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////+ampoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACnp6f///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////+ampoAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////// + //8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////8AAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAD///////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///// + //////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////// + //////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADh4eH///////////////////////////////// + //////////////////////////////////////+ampoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////////////8AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAD///////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAD///////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////// + //////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////// + //////////////////////////////////////////////////////////////8AAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///////////////////////////////////////////////////////////// + //////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADh4eH/ + //////////////////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAD///////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAD///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// + //////////////////////////////////////////////////////////////8AAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAD///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////// + //////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////8AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADh4eH/ + //////////////////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfHx8//// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////4eHhp6enAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAA////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////// + ////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjIyM//////////////////////////////////////////// + ////////////////////////////////4eHhp6enAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAA////////////////////////////////////////////////////AAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//// + ////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//// + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////// + ////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////// + ////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA//////////////////////////////////////////////////////////////////////// + ////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjIyM//////////// + ////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAA////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////// + ////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//// + ////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////// + ////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////AAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjIyM//////////// + ////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////9nZ2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOHh4f////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////Dw8L29vWhoaAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP///////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////// + /////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////// + /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAOHh4f////////////////////////////////////////////////// + //////////////////////////////Dw8L29vWhoaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAP///////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AP///////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAP///////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////// + /////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////// + /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////////////////wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////////////// + /////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOHh4f////////////////// + /////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////// + /////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////// + /////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////// + /////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////////////////wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAP///////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOHh4f////////////////// + /////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////+ysrIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHz///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////p6emysrJoaGgAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAD///////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////// + //////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////// + //8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNTU3///////////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAB8fHz///////////////////////////////////////////////////////////// + ///////////////////////////////p6emysrJoaGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAD///////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////// + //////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///// + //////////////////9oaGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////// + //////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoaGj///////////////////8AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///////////////////////////////////////////////////////////// + //////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHz///////////////////////////// + //////////////////////////9oaGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////// + //////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoaGj///////////////9o + aGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADp6en///////////////////////////////////////// + //////////////////////////////9oaGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHz///////////////9NTU0AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAADw8PD///////////////////////////////////8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///// + //////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// + //////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHz///////////////////////////// + //////////////////////////9oaGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHz///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////jIyM + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvb29//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////6enpsrKyaGhoAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAA////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// + ////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////4eHhAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAjIyM////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAx8fH//////////////////////////////////////////////////////////////////// + ////////////////////////////////6enpsrKyaGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//// + ////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////// + ////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////// + ////////jIyMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4eHh//////////////////////////////// + ////4eHhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjIyM////////////////////AAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA//////////////////////////////////////////////////////////////////////// + ////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAATU1NjIyMvb296enp//////////////////////////////////////////////////// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAx8fH//////////////////////////////////// + ////////////////jIyMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4eHh//////////////////////// + ////////////4eHhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjIyM////////////////mpqaAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA0NDQ//////////////////////////////////////////////////// + ////////////////////jIyMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////// + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAmpqa////////////////jIyMAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA4eHh////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////// + ////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAx8fH//////////////////////////////////// + ////////////////jIyMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////// + ////////////AAAAAAAAAAAAAAAAAAAAAAAAmpqa//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////2hoaAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAOHh4f////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////8fHx/// + /////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AP///////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////// + /////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP///////////////////////////////////8fHxwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAALKysv///////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AOHh4f///////////////////////729vcfHx////////////////////8fHx/////////////////// + /////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////// + /////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////// + /////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////729 + vQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMfHx////////////////////////////////////9DQ0AAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAL29vf///////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAP///////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + //////////////////////////////////////////////////////////////////////////////// + /////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAIyMjOHh4f///////////////////////////////////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOHh4f///////////////////////729vcfHx/////////// + /////729vQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMfHx/////////////////////////////////// + /9DQ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL29vf///////////////8fHxwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAIyMjP////////////////////////////////////////////////////////////// + /////////729vQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOHh4f////////////////////////////// + /+Hh4QAAAAAAAAAAAAAAAAAAAAAAAMfHx////////////////7KysgAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAALKysv///////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////// + /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOHh4f///////////////////////729vcfHx/////////// + /////729vQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOHh4f///////////////////////////////+Hh + 4QAAAAAAAAAAAAAAAAAAAAAAAMfHx/////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAD///////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////8AAADQ0ND///////// + //////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////// + //////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////8A + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAD///////////////////////////////////9oaGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADZ2dn///////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNTU0AAAAAAAAAAAC9vb3w + 8PD////w8PDHx8doaGgAAACampr///////////////////8AAADQ0ND///////////////////////// + //////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////// + //////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////// + //////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////////////////////w8PAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAB8fHz///////////////////////////////////+ampoAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADp6en///////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC9vb3/ + ///////////////////////////////w8PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// + //////////////////////////////////////////////////////////////////////////////8A + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAACysrL///////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAABNTU0AAAAAAAAAAAC9vb3w8PD////w8PDHx8doaGgAAACampr////////////////w8PAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHz///////////////////////////////////+ampoAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAADp6en///////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAADh4eH////////////////////////////////////////////////////////////////////p + 6ekAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADHx8f///////////////////////////////+9vb0AAAAA + AAAAAAAAAAAAAAAAAADw8PD////////////////Z2dkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoaGj/ + //////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// + //////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////// + //8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAABNTU0AAAAAAAAAAAC9vb3w8PD////w8PDHx8doaGgAAACampr////////////////p6ekA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAADHx8f///////////////////////////////+9vb0AAAAAAAAA + AAAAAAAAAAAAAADw8PD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAA//////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////AAAAAAAAp6en//////////////// + ////////////////////////2dnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////// + ////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////AAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAA////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ////////////////////////////////0NDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATU1N//////// + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsrKyAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA////////////////////AAAAAAAAp6en//////////////////////////////// + ////////2dnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////////////// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////jIyMAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA4eHh////////////////////////////8PDwAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAjIyM////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0NDQ//////// + ////////////////////0NDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAjIyM//////////////////////// + ////////////////////////////////////////////////////////////////////AAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAp6en////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + srKyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////jIyMAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA4eHh////////////////////////////8PDwAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAjIyM////////////////////////p6enAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATU1N + 6enp////////////////////////////////////////////////////////////////////jIyMAAAA + AAAAAAAAAAAAAAAAAAAAAAAAaGho////////////////////////////////aGhoAAAAAAAAAAAAAAAA + AAAAjIyM////////////////////////aGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAx8fH//////// + ////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + srKyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////jIyMAAAAAAAA + AAAAAAAAAAAAAAAAAAAAaGho////////////////////////////////aGhoAAAAAAAAAAAAAAAAAAAA + jIyM//////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////wAAAAAAAAAAAGhoaOHh4f////////////////// + /////////////3x8fAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhoaP///////////////////////////wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////wAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAP///////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL29vf////// + /////////////////+np6U1NTQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL29vf////////////////// + /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPDw8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAANnZ2f///////////////wAAAAAAAAAAAGhoaOHh4f///////////////////////////////3x8 + fAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhoaP///////////////////////////////wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAP///////////////////////////////////////////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP///////////////////////////+Hh4QAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAE1NTenp6f///////////////////////3x8fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOHh4f// + /////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANDQ0P////////////// + /////////2hoaAAAAAAAAAAAAAAAAAAAAAAAAAAAAKenp/////////////////////////////////// + /////////////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AKenp////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPDw8AAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANnZ2f///////////////+Hh4QAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAE1NTenp6f///////////////////////3x8fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AOHh4f///////////////////////////01NTQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1NTeHh4f// + /////////////////////////////////+Hh4YyMjP///////////////////+Hh4QAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAL29vf///////////////////////6enpwAAAAAAAAAAAAAAAAAAAAAAAOHh4f// + /////////////////////729vQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1NTenp6f////////////// + /////////+Hh4QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP///////////////////////////////////////wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP///////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPDw8AAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANnZ2f///////////////+Hh4QAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAL29vf///////////////////////6enpwAAAAAAAAAAAAAAAAAAAAAAAOHh4f////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////8AAAAAAAAAAAAAAAAAAAB8fHzHx8fh4eH////////////Z2dl8 + fHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACampr///////////////////////////8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ + //////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoaGjQ0ND////////w + 8PC9vb1NTU0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoaGj///////////////////////////8AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAD///+ysrIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACysrL/ + //////////////8AAAAAAAAAAAAAAAAAAAB8fHzHx8fh4eH////////////Z2dl8fHwAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACampr///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAD///////////////////////////////+9vb0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABN + TU3Q0ND////////////Q0NB8fHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACysrL///////////////// + //////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACamprp6en////////Z2dl8fHwA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAADh4eH///////////////////////////////////////////// + //////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADZ2dn/ + //////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///+ysrIAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAACysrL///////////////////+9vb0AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABNTU3Q0ND////////////Q0NB8fHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACysrL///////// + ///////////////////////Z2dkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMjIzQ0NDw8PD/ + ///////////h4eG9vb18fHwAAAAAAAD///////////////////////+ampoAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAACamprp6en////////p6emampoAAAAAAAAAAAAAAAAAAAAAAACampr///////////////// + //////////////98fHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC9vb3p6en////////h4eGnp6cA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAD///////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///+ysrIAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAACysrL///////////////////+ampoAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACamprp6en////////p6emampoAAAAAAAAAAAAAAAAAAAAAAACampr///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////fHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4eHh//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA4eHh////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////// + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6enp////////////////////////////AAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA////////TU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGho//////////// + ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA4eHh////////////////TU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ////////////////////////////////////p6enAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjIyM//////////////////////////////// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAjIyM//////////////////////////////////////////////////////////// + ////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGho//////////// + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////TU1NAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAaGho////////////////////////p6enAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjIyM//////////////////////// + ////////////////0NDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAA////////////////////////////fHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfHx8//////////////////////////////// + ////6enpTU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////TU1NAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAaGho////////////////////////fHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfHx8//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /5qamgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMfHx/////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////01NTQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAIyMjP///////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////// + /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAANDQ0P///////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAP///////9nZ2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOnp6f///////////01NTQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIyMjP// + /////////////////+np6U1NTQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////// + /////////////////////////////6enpwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAKenp////////////////////////////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAKenpwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AE1NTenp6f////////////////////////////////////////////////////////////////////// + /////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////// + /////+Hh4bKysk1NTQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANnZ2f////////////////// + /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////9nZ2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAOnp6f///////////////////////6enpwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKenp/////////////////////////////////////// + /////////9DQ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAP///////////////////////////////3x8fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhoaOnp6f///////////////////////////////////////9DQ + 0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP///////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////// + /////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////// + /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////9nZ2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAOnp6f///////////////////////3x8fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAGhoaOnp6f////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////+9vb0AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHz///////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////w + 8PCnp6cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHz/ + //////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// + //////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////8AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABN + TU3h4eH///////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///// + //////+ysrIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADh4eH////////////w8PCnp6cAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHz///////////////// + ///////////p6elNTU0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAD///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////// + ///////////////////////Z2dlNTU0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAABNTU3Hx8f///////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAD///+ysrIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNTU3p6en///// + //////////////////////////////////////////////////////////////////////////////// + //////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////// + ///p6elNTU0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACnp6f///////////////////////8AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAD///////////+ysrIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADh + 4eH////////////////////////////Z2dlNTU0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABNTU3Hx8f///////////////////////////////////////////////////// + ///p6el8fHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ + //////////////////////////////////+MjIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAACMjIz////////////////////////////////////////////////////p6elNTU0A + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////// + //////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////8AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAD///////////+ysrIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADh + 4eH///////////////////////////+MjIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAACMjIz///////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////6enpAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA4eHh//////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////8PDw + srKyTU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATU1Nvb29//////////////// + ////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////// + ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////AAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA0NDQaGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAp6en//////////// + ////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////// + srKyAAAAAAAAAAAAAAAAAAAAAAAAaGho4eHh////////////////////////8PDwsrKyTU1NAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATU1Nvb29//////////////////////////////// + ////6enpTU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////// + ////////////////////vb29TU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATU1Nvb29 + ////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ////////4eHhaGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjIyM6enp//////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////0NDQ + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfHx8////////////////////////AAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA////////////////srKyAAAAAAAAAAAAAAAAAAAAAAAAaGho4eHh//////////// + ////////////////////////////vb29TU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + TU1Nvb29//////////////////////////////////////////////////////////////////////// + 0NDQaGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATU1Np6en//////////// + ////////////////////////////0NDQaGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGho + 0NDQ////////////////////////////////////////////////////////////////p6enAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAp6enAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////// + ////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////AAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA////////////////srKyAAAAAAAAAAAAAAAAAAAAAAAAaGho4eHh//////////// + ////////////////////////0NDQaGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGho0NDQ + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////2hoaAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAHx8fP////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+Hh + 4b29vYyMjHx8fAAAAAAAAAAAAAAAAE1NTYyMjLKystnZ2f////////////////////////////////// + /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////// + /////////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAP///////9nZ2aenp3x8fAAAAAAAAAAAAGhoaJqamsfHx/Dw8P////////////////////////// + /////////////////////////////////////////////////////////////////////////+Hh4Zqa + mgAAAAAAAHx8fMfHx////////////////////////////////////////////+Hh4b29vYyMjHx8fAAA + AAAAAAAAAAAAAE1NTYyMjLKystnZ2f///////////////////////////////////////////////+np + 6U1NTQAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////9nZ2bKysoyMjE1NTQAAAAAAAAAAAE1NTYyMjLKystnZ2f////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////9nZ2aenp3x8fAAAAAAAAAAAAHx8fKenp+Hh4f////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////wAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////////////// + /////////////////////////+Hh4ZqamgAAAAAAAHx8fMfHx/////////////////////////////// + /////////////////////////9nZ2bKysoyMjE1NTQAAAAAAAAAAAE1NTYyMjLKystnZ2f////////// + /////////////////////////////////////////////////////////////////////////////+np + 6cfHx5qamnx8fAAAAAAAAAAAAAAAAGhoaIyMjLKyssfHx+np6f////////////////////////////// + /////////////////////////9nZ2bKysoyMjAAAAAAAAAAAAAAAAIyMjKenp9nZ2f////////////// + //////////////////////////////////////////////////////////////Dw8MfHx5qammhoaAAA + AAAAAAAAAHx8fKenp9DQ0P///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////+Hh4ZqamgAAAAAAAHx8fMfHx/////////////////////////////// + /////////////////////9nZ2bKysoyMjAAAAAAAAAAAAAAAAIyMjKenp9nZ2f////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////+9vb0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACnp6f///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////// + //////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////p6ekAAAAA + AAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////8AAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////TU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + p6en//////////////////////////////////////////////////////////////////////////// + ////8PDwjIyM//////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////////////////// + ////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////0NDQAAAAAAAAAAAA + AAAAAAAAAAAA//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////729vQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIyMjP// + //////////////////////////////////////////////////////////////////Dw8KenpwAAAAAA + AP////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP////////////////////////////////////////////////////////////////// + /////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////9DQ0AAAAAAAAAAAAAAAAAAA + AP////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /////////////////////////////////9nZ2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHx8fP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////9oaGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNTU29vb3///// + ///////////////////////////////////////////////Q0NCMjIwAAAAAAAAAAAAAAAD///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///////////////////////////////////////////////////////////////////////////// + //////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////Q0NAAAAAAAAAAAAAAAAD///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// + //////////////////////9oaGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACnp6f///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////6enpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmpqax8fH4eHh + ////////////////8PDw4eHhvb29mpqaAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// + ////////////////////////////mpqaAAAAAAAAp6en//////////////////////////////////// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////0NDQAAAAAAAAAAAA//////////////////// + ////////////////////////////////////////mpqaAAAAAAAAp6en//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////8PDw + 4eHhsrKyTU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0NDQ//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /9DQ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////// + /////////////2hoaAAAAAAAAAAAAAAAAGhoaP///////////////////////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////9DQ0AAAAAAAAP////////////////////////////// + /////////////////////////2hoaAAAAAAAAAAAAAAAAGhoaP////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhoaP////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////Q0NAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////+n + p6cAAAAAAAAAAAAAAAAAAAAAAACnp6f///////////////////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAD///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////+ysrIAAAD///////////////////////////////////////// + //////////+np6cAAAAAAAAAAAAAAAAAAAAAAACnp6f///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////8A + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAADZ2dn///////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////0NDQAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////TU1NAAAAAAAA + AAAAAAAAAAAAAAAATU1N////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + TU1NAAAAAAAAAAAAAAAAAAAAAAAATU1N//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////AAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAp6en//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+Hh4U1NTQAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAP////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////wAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAP///////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHx8 + fP////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////+ampoAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABoaGj///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///////////////////////////9NTU0AAAAAAAAAAAAAAAAAAAAAAABNTU3/ + //////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////9NTU0AAAAAAAAAAAAAAAAA + AAAAAABNTU3///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACnp6f///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////4eHhjIyMAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGho0NDQ//////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA////////////////////////////p6enAAAAAAAAAAAAAAAAAAAAAAAAp6en//////////// + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////p6enAAAAAAAAAAAAAAAAAAAAAAAAp6en + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGho2dnZ//////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////+np6bKysmhoaAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1NTZqamtnZ2f////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /////////////////////////////01NTQAAAAAAAAAAAAAAAE1NTf////////////////////////// + /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////01NTQAAAAAAAAAAAAAAAE1NTf////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAE1NTYyMjLKysunp6f////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////p6enHx8eysrKMjIxoaGgAAAAAAAAA + AAAAAAAAAABoaGiMjIynp6fHx8fh4eH///////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////w8PCampoAAAAAAACnp6fw8PD///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////w8PCampoAAAAAAACnp6fw8PD///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////Dw8NnZ2b29vYyMjIyMjAAAAAAAAAAAAAAAAAAAAE1NTYyMjJqamr29veHh4f// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////+np6b29vZqamnx8fAAAAAAAAAAAAAAAAAAAAIyMjJqamr29veHh4f// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////+np6b29vZqamnx8fAAAAAAA + AAAAAAAAAAAAAIyMjJqamr29veHh4f////////////////////////////////////////////////// + //Dw8NnZ2b29vYyMjIyMjAAAAAAAAAAAAAAAAAAAAIyMjJqamtDQ0P////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////Dw8NnZ2b29vYyMjIyMjAAAAAAAAAAAAAAAAAAAAIyMjJqamtDQ0P////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////w8PC9 + vb18fHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHzHx8fw + 8PD///////////////////////////////////////////////////////////////////////////// + //////+9vb1oaGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNTU2np6fw8PD/ + //////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////// + //////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////// + //////////////////////////////////////+9vb1oaGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABNTU2np6fw8PD////////////////////////////////Hx8d8fHwAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACnp6f///////////////////////////// + //////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////////////////////Hx8d8fHwA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACnp6f///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////4eHhmpqaAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjIyM0NDQ + ////////////////////////////////////////////////////////////////////vb29TU1NAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAp6en8PDw//// + ////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////// + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////// + ////////////////////vb29TU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAp6en8PDw////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATU1N6enp//////////////////////////////// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATU1N6enp//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////Dw8JqamgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhoaOHh4f// + /////////////////////////////////////////////////////4yMjAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1NTdDQ0P////////// + /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////// + /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////// + /////4yMjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAE1NTdDQ0P///////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1NTenp6f///////////////////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1NTenp6f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////Q0NBNTU0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACysrL///////// + //////////////////////////////////////98fHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////// + //8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////8AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////98fHwAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAD///////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAB8fHz///////////////////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAD///////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHz///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////p6enAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfHx8//////////////// + ////////////////////////fHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////AAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAA////////////////////////////////////fHx8AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ////////////////////AAAAAAAAAAAAfHx8srKy0NDQ4eHh////////////8PDw0NDQTU1NAAAAAAAA + AAAAAAAAAAAAAAAAAAAA2dnZ////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAA////////////////////////AAAAAAAAAAAAfHx8srKy0NDQ4eHh////////////8PDw0NDQTU1N + AAAAAAAAAAAAAAAAAAAAAAAAAAAA2dnZ//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////6enpwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////// + /////////6enpwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhoaL29veHh4f////////////// + /+np6dDQ0Kenp01NTQAAAAAAAAAAAAAAAAAAAP///////////////////////wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAP///////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAP///////////////////////////////6enpwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAGhoaL29veHh4f///////////////+np6dDQ0Kenp01NTQAAAAAAAAAAAAAAAAAAAP////////// + /////////3x8fMfHx/Dw8P///////////////////////////////////+np6QAAAAAAAAAAAAAAAAAA + AAAAAAAAAKenp////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////// + /////////////////3x8fMfHx/Dw8P///////////////////////////////////+np6QAAAAAAAAAA + AAAAAAAAAAAAAAAAAKenp/////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////+np6cAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////////////////////////////h4eEA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNTU3Q0ND///////////////////////////////////// + ///////Q0NBoaGgAAAAAAAAAAAD///////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAD///////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ + ///////////////////////////h4eEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNTU3Q0ND///// + ///////////////////////////////////////Q0NBoaGgAAAAAAAAAAAD///////////////////// + //////////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAABo + aGj///////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////// + //////////////////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAABoaGj///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////p6enAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////jIyMAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAfHx8//////////////////////////////////////////////////////// + ////0NDQTU1NAAAA////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//// + ////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////// + ////////////////jIyMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfHx8//////////////////////// + ////////////////////////////////////0NDQTU1NAAAA//////////////////////////////// + ////////////////////////////////////x8fHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////// + ////////////////////////////////////////////x8fHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////9DQ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAJqamsfHx+Hh4f////////////////Dw8NnZ2bKysnx8fAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP////////////////////////////Dw8AAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAOnp6f////////////////////////////////////////////////////////////////// + /5qamv///////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////// + /////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////// + //Dw8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOnp6f////////////////////////////////// + /////////////////////////////////5qamv////////////////////////////////////////// + /////////////////////729vQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////// + /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////// + /////////////////////////////729vQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////9NTU0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNTU29vb3/ + ///////////////////////////////////////////////p6ekAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAD////////////////////////////Hx8cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACnp6f/ + //////////////////////////////////////////////////////////////////////////////// + //////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////// + //////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////////////////////Hx8cAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAACnp6f///////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///Q0NBNTU0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNTU3///////////////////////8AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////////// + ///////////Q0NBNTU0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNTU3///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////p6enAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmpqa//////////////////// + ////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ////////////////////////////mpqaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4eHh//////////// + //////////////////////////////////////////////////////////////////////////////// + ////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////mpqaAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA4eHh//////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////0NDQaGhoAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmpqa////////////////////////AAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////0NDQaGho + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmpqa//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////Dw8AAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKenp/////////////////////////////////// + /////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////// + /////////////////3x8fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////// + /////////////////////////////////////////////////////////////////////////////wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////3x8fAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAP////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////9DQ0GhoaAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAANDQ0P///////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAP///////////////////////////////////////////9DQ0GhoaAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANDQ0P////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////+ysrIAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAACnp6f///////////////////////////////////////////////// + //////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////// + //////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAD///////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///// + ///////////////////////////h4eFoaGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAABoaGj///////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ + ///////////////////////////////////h4eFoaGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABoaGj///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////TU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAfHx8//////////////////////////////////////////////////////////////// + ////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAA////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAA////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////// + ////////////vb29AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 4eHh////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////// + ////////////////////vb29AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA4eHh//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////+np6QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AOHh4f///////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP///////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AP///////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////// + /////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////6en + pwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANDQ0P////////// + /////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////// + /////6enpwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANDQ0P// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////+9vb0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHz///////// + //////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABoaGj///////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////// + //////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////// + //////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoaGj///////////////////+9vb0AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNTU3Z2dn///////////////////////// + //////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////+9vb0AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNTU3Z2dn///////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////mpqaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAx8fH//////////////////// + ////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA////////////////////////////jIyMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjIyM + ////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////// + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////jIyM + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAjIyM////////////////8PDwAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjIyM8PDw//////////////////////////////////////// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////8PDwAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjIyM8PDw//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /4yMjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOHh4f////////////////////////////// + /////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAP///////////////////////////5qamgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////// + /////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAALKysv////////// + /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////// + /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////5qamgAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP///////////////////////////////////////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAAALKysv///////////////7KysgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAGhoaOHh4f///////////////////////////////////////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////7KysgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAGhoaOHh4f////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////// + //////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///// + ///////////////////////Hx8cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADh4eH///////////////// + ///////////////////////h4eEAAAAAAAAAAAAAAAAAAAAAAAAAAADZ2dn///////////////////// + //8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////8AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////////////////////Hx8cAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAADh4eH////////////////////////////////////////h4eEAAAAAAAAAAAAAAAAAAAAA + AAAAAADZ2dn///////////////98fHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMjIzZ + 2dn///////////////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAD///////////////////98fHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACMjIzZ2dn///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////////////////// + ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////// + ////////////8PDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsrKy//////////////////////////// + ////////////p6enAAAAAAAAAAAAAAAAAAAAAAAATU1N////////////////////////////AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAmpqa////////////////////////////6enpAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAA////////////////////////8PDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + srKy////////////////////////////////////////p6enAAAAAAAAAAAAAAAAAAAAAAAATU1N//// + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjIyM4eHh//////////////// + ////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAA////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjIyM4eHh//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP///////////////////////////////////////////////////////////wAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////// + /////4yMjAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1NTf////////////////////////////////////Dw + 8E1NTQAAAAAAAAAAAAAAAAAAAAAAAKenp////////////////////////////wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAANDQ0P///////////////////////8fHxwAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAHx8fP///////////////////////////4yMjAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1NTf////// + //////////////////////////////Dw8E1NTQAAAAAAAAAAAAAAAAAAAAAAAKenp/////////////// + /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhoaNnZ2f////////////////////////////////// + /////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////// + /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhoaNnZ2f////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///////////////////////////////////////////////////////////8AAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////////////////////////////h4eEA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHz///////////////////////////////98fHwAAAAAAAAA + AAAAAAAAAAAAAAAAAADw8PD///////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAADh4eH///////////////////9oaGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACampr/ + ///////////////////////////h4eEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHz///////////// + //////////////////98fHwAAAAAAAAAAAAAAAAAAAAAAAAAAADw8PD///////////////////9oaGgA + AAAAAAAAAAAAAAAAAAAAAAAAAADw8PD////////////////////////////////////////h4eGMjIz/ + //////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////// + //9oaGgAAAAAAAAAAAAAAAAAAAAAAAAAAADw8PD////////////////////////////////////////h + 4eGMjIz///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4eHh//// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////mpqaAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAaGho0NDQ8PDw////////8PDwx8fHaGhoAAAAAAAAAAAAAAAAAAAAAAAA + AAAAsrKy////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAvb298PDw////6enpfHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0NDQ//////////// + ////////////////////mpqaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGho0NDQ8PDw////////8PDw + x8fHaGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAsrKy////////////////////////p6enAAAAAAAAAAAA + AAAAAAAAAAAAAAAA8PDw////////////////////////////////2dnZjIyMAAAAAAAA//////////// + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////p6enAAAA + AAAAAAAAAAAAAAAAAAAAAAAA8PDw////////////////////////////////2dnZjIyMAAAAAAAA//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////4yMjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANDQ0P////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////2hoaAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHx8fP////// + /////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1NTf////////////////////////// + /////////////2hoaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAHx8fP///////////////////////////+Hh4QAAAAAAAAAAAAAAAAAAAAAA + AAAAAHx8fNnZ2f///////////+np6dDQ0Kenp01NTQAAAAAAAAAAAAAAAP////////////////////// + /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////+Hh4QAAAAAAAAAAAAAA + AAAAAAAAAAAAAHx8fNnZ2f///////////+np6dDQ0Kenp01NTQAAAAAAAAAAAAAAAP////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////+ampoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACampr///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////p6elNTU0AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNTU3p6en///////////////// + //////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHwAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC9vb3///////////////////////////////////// + ///p6elNTU0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABNTU3p6en///////////////////////////////+ampoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////8AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////+ampoAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////vb29 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////6enpTU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGho6enp//////////////////////////////// + ////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////aGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAfHx8////////////////////////////////////////////////6enp + TU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGho6enp + ////////////////////////////////////////fHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////AAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAA////////////////////////////fHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////+np6QAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL29vf////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////4yMjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAIyMjP///////////////////////////////////////////////wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////3x8fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAHx8fP///////////////////////////////////////////////////////////4yMjAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIyMjP////////////////// + /////////////////////////////////5qamgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAP///////////////////////////////5qamgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////9NTU0AAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAADp6en///////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////Z2dl8fHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABoaGjZ2dn///////////////////////////////////////////////////8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAD///////////+ysrIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACnp6f/ + ///////////////////////////////////////////////////////////////////Z2dl8fHwAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoaGjZ2dn///////////////////////////////// + ///////////////////////////Q0NBoaGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACnp6fh4eH///////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ + ///////////////////////////////////Q0NBoaGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAACnp6fh4eH///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////srKyAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAfHx8//////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////6enpvb29jIyMaGhoAAAAAAAAAAAATU1NjIyMvb296enp//// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////8PDwsrKyjIyMAAAAAAAAAAAAfHx8srKy8PDw//////////////// + ////////////////////////////////////////////////////////////////6enpvb29jIyMaGho + AAAAAAAAAAAATU1NjIyMvb296enp//////////////////////////////////////////////////// + ////////////////////////6enpvb29jIyMaGhoAAAAAAAAAAAAAAAAfHx8jIyMvb292dnZ//////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////6enpvb29jIyMaGhoAAAAAAAAAAAAAAAAfHx8jIyMvb292dnZ + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////Dw8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAHx8fP////////////////////////////////////////////////////////////////// + /////////////////////////+Hh4YyMjP////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////+np6cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABoaGjh4eH///////////////////////////////////////////////////////////////////// + ///////Q0NCMjIwAAAAAAAD///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////8PDwTU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + p6en6enp////////////////////////////////////////////////////////2dnZp6enTU1NAAAA + AAAAAAAAAAAA//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////9DQ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHx8 + fLKystnZ2eHh4f///////////////////+Hh4dnZ2b29vYyMjE1NTQAAAAAAAAAAAAAAAAAAAAAAAAAA + AP////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////+np6cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+9vb1oaGgAAABo + aGi9vb3///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + fHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////fHx8AAAAAAAAAAAAAAAAAAAAfHx8 + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////3x8fAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////729vQAAAAAAAAAAAAAAAAAAAAAAAAAAAL29vf////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+np6cAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////9oaGgAAAAAAAAAAAAAAAAAAAAAAAAAAABoaGj///////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////x8fHTU1NAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////Dw8IyMjAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAIyMjOHh4f////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////2hoaAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhoaP////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////h4eGMjIwAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACnp6fh4eH/ + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////+9vb0A + AAAAAAAAAAAAAAAAAAAAAAAAAAC9vb3///////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////8PDwsrKyfHx8AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmpqa0NDQ//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////fHx8AAAAAAAA + AAAAAAAAAAAAfHx8//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////Dw8NnZ2b29vYyMjIyMjE1NTQAAAAAA + AAAAAAAAAAAAAHx8fIyMjKenp8fHx+Hh4f////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////729vWhoaAAAAGhoaL29 + vf////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////9DQ0LKysoyMjGhoaAAAAAAAAAAA + AAAAAGhoaIyMjLKystnZ2f////////////////////////////////////////////////////////// + /////////////////////////////////////+np6b29vZqamnx8fAAAAAAAAAAAAAAAAAAAAIyMjJqa + mr29veHh4f////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////Dw8NnZ2b29vYyMjIyMjAAAAAAAAAAAAAAAAAAA + AIyMjJqamtDQ0P////////////////////////////////////////////////////////////////// + /+np6bKysnx8fAAAAAAAAAAAAIyMjMfHx/Dw8P////////////////////////////////////////// + //////////////////////////////////////////////Dw8NnZ2b29vYyMjIyMjAAAAAAAAAAAAAAA + AAAAAIyMjJqamtDQ0P////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////Hx8d8fHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAACnp6fw8PD///////////////////////////////////////////////////////// + //////////////////+9vb1oaGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABN + TU2np6fw8PD///////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///// + ///////////////////////Hx8d8fHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACnp6f///////////////////////////////////////////////////////+ampoAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAC9vb3///////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ + ///////////////////////////Hx8d8fHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAACnp6f///////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////8PDwp6enAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAsrKy//////////////////////////////////////////////////////////////// + vb29TU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + p6en8PDw////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// + ////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////// + ////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + TU1N6enp////////////////////////////////////////////fHx8AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAjIyM////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////// + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAATU1N6enp//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////7KysgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAHx8fP///////////////////////////////////////////////////////4yMjAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1NTdDQ + 0P///////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////// + /////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1NTenp + 6f///////////////////////////////////3x8fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAHx8fP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////// + /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1N + Tenp6f////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////9NTU0AAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABo + aGj///////////////////////////////////////////////98fHwAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////// + //////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////// + //////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHz///////// + //////////////////////+9vb0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACnp6cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////8AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHz///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfHx8//// + ////////////////////////////////////fHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////// + ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////AAAAAAAAAAAAfHx8srKy + 0NDQ4eHh////////////8PDw0NDQTU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAA2dnZ//////////////// + ////////////TU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////AAAAAAAAAAAAfHx8 + srKy0NDQ4eHh////////////8PDw0NDQTU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAA2dnZ//////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL29vf////////// + /////////////////////6enpwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhoaL29veHh4f// + /////////////+np6dDQ0Kenp01NTQAAAAAAAAAAAAAAAAAAAP///////////////////////wAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////////////wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP///////////////////////////3x8fMfHx/Dw8P////////////////// + /////////////////+np6QAAAAAAAAAAAAAAAAAAAAAAAAAAAKenp////////////////////////9DQ + 0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIyMjOnp6f///////9DQ0GhoaAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////3x8fMfHx/Dw8P////////////// + /////////////////////+np6QAAAAAAAAAAAAAAAAAAAAAAAAAAAKenp/////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNTU3///////////////////// + ///////h4eEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNTU3Q0ND///////////////////////// + ///////////////////Q0NBoaGgAAAAAAAAAAAD///////////////////////8AAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAD///////////////////////////////////////////////////////////////////// + //////////8AAAAAAAAAAAAAAAAAAAAAAAAAAABoaGj///////////////////////+ampoAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAABoaGj///////////////////////98fHwAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAD///////////////////////////////////////////////////////////////// + //////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAABoaGj///////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0NDQ////////////////////////jIyM + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfHx8//////////////////////////////////////////// + ////////////////0NDQTU1NAAAA////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ////////////////////////////////////////////////////////////////////////////x8fH + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////fHx8AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAA0NDQ////////////////////////6enpTU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAA//////////////////////////////////////////////////////////////////////////// + x8fHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAHx8fLKysuHh4fDw8P////////////Dw8NDQ0IyMjAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKenp/////////////////////Dw8AAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAOnp6f////////////////////////////////////////////////////// + /////////////5qamv///////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////// + /////////////////////////////////////////////////////////////729vQAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP///////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AOnp6f///////////////////////////729vQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////// + /////////////////////////////////////////////////////////////////729vQAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////8AAAAA + AAAAAAAAAAAAAACnp6fp6en///////////////////////////////////////+np6cAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAB8fHz////////////////////Hx8cAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACnp6f///////////////////////////////////////////////////////////////////// + //////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// + //////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////// + ///////////////////////////////////////////Q0NBNTU0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABNTU3///////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////// + //////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////// + ///////////////////////////////////////////////Q0NBNTU0AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAABNTU3///////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////AAAAAAAAAAAAjIyM + 6enp////////////////////////////////////////////////8PDwAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAA////////////////////mpqaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4eHh + //////////////////////////////////////////////////////////////////////////////// + ////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////// + ////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////// + ////////////////////////0NDQaGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmpqa + ////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////// + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////// + ////////////////////////////0NDQaGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + mpqa//////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////wAAAE1NTdnZ2f////////////// + /////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAP///////////////////3x8fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////// + /////9DQ0GhoaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANDQ0P////////// + /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////// + /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////// + /////////9DQ0GhoaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANDQ0P////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////+ampr///////////////////////////////// + ///////////////////////////////w8PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ + //////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////8A + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAD////////////////////////////////////////h4eFoaGgAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoaGj///////////////////////// + //8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////8AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////////////////////////////////////h4eFoaGgA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoaGj///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////vb29AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATU1N//////////// + ////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////AAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA////////////////////////////////////vb29AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4eHh////////////////////////////AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////AAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAA////////////////////////////////////vb29AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4eHh//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////7KysgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIyMjP///////////////////wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////wAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP///////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAP///////////////////////////////6enpwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAANDQ0P///////////////////////////////wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAP///////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAP///////////////////////////////6enpwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAANDQ0P////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+9vb1NTU0AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC9vb3///////////////////8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABoaGj///////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///// + //////////////////////+9vb0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABNTU3Z2dn///////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAD///////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ + //////////////////////////+9vb0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAABNTU3Z2dn///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////4eHhp6enAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8PDw////////////////////jIyMAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAjIyM////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// + ////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////// + ////////8PDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjIyM8PDw + ////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//// + ////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////// + ////////////8PDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjIyM + 8PDw//////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////9DQ0GhoaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAIyMjP///////////////////////5qamgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AP///////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAALKy + sv///////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////// + /////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////7Ky + sgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhoaOHh4f////////////////// + /////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////// + /////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////// + /7KysgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhoaOHh4f////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////+9vb1NTU0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABNTU3w8PD////////////////////////Hx8cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADh4eH///// + ///////////////////////////////////h4eEAAAAAAAAAAAAAAAAAAAAAAAAAAADZ2dn///////// + //////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////// + //////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////98fHwAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMjIzZ2dn///////////////////////////////////// + //////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////// + //////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////98fHwAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMjIzZ2dn///////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////vb29TU1NAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2dnZ//// + ////////////////////////8PDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsrKy//////////////// + ////////////////////////p6enAAAAAAAAAAAAAAAAAAAAAAAATU1N//////////////////////// + ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmpqa////////////////////////////6enpAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAjIyM4eHh//////////////////////////////////////////////////////// + ////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAjIyM4eHh//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////+np6WhoaAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANDQ0P////////////////// + /////////////////4yMjAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1NTf////////////////////////// + //////////Dw8E1NTQAAAAAAAAAAAAAAAAAAAAAAAKenp////////////////////////////wAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANDQ0P///////////////////////8fHxwAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAHx8fP///////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGho + aNnZ2f///////////////////////////////////////////////////////////////////////wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AGhoaNnZ2f////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////Q0NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNTU3Z2dn///////////////////////////////// + ///////h4eEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHz///////////////////////////////98 + fHwAAAAAAAAAAAAAAAAAAAAAAAAAAADw8PD///////////////////////////8AAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAADh4eH///////////////////9oaGgAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACampr///////////////////////9oaGgAAAAAAAAAAAAAAAAAAAAAAAAAAADw8PD///////// + ///////////////////////////////h4eGMjIz///////////////////////////8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAD///////////////////////9oaGgAAAAAAAAAAAAAAAAAAAAAAAAAAADw8PD///// + ///////////////////////////////////h4eGMjIz///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////2dnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAp6en8PDw//////////////////////////////////////////////// + mpqaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGho0NDQ8PDw////////8PDwx8fHaGhoAAAAAAAAAAAA + AAAAAAAAAAAAAAAAsrKy////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAvb298PDw////6enpfHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0NDQ + ////////////////////////p6enAAAAAAAAAAAAAAAAAAAAAAAAAAAA8PDw//////////////////// + ////////////2dnZjIyMAAAAAAAA////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAA////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAA////////////////////////p6enAAAAAAAAAAAAAAAAAAAAAAAAAAAA8PDw//////////////// + ////////////////2dnZjIyMAAAAAAAA//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////Dw8E1NTQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAJqamuHh4f///////////////////////////////////////////////////////////2hoaAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AHx8fP///////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1NTf////////////// + /////////////+Hh4QAAAAAAAAAAAAAAAAAAAAAAAAAAAHx8fNnZ2f///////////+np6dDQ0Kenp01N + TQAAAAAAAAAAAAAAAP///////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AP///////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////// + /////////////////+Hh4QAAAAAAAAAAAAAAAAAAAAAAAAAAAHx8fNnZ2f///////////+np6dDQ0Ken + p01NTQAAAAAAAAAAAAAAAP////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////+MjIwA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACnp6fw8PD///// + ///////////////////////////////////////////////////////////////p6elNTU0AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNTU3p6en///// + //////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHwAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC9vb3///////////////////////// + //////+ampoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAD///////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////// + //////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////// + //////////+ampoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAD///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////6enpAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGhox8fH//////////////////////////// + ////////////////////////////////////////////////////////6enpTU1NAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGho6enp//////////////////// + ////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////aGhoAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfHx8//////////////////////////////////////// + fHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//// + ////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////// + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////// + ////fHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////729vQAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAJqamuHh4f////////////////////////////////////////////// + /////////////////////////////////////////////////////4yMjAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIyMjP////////////////////////////////////// + /////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////3x8fAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAHx8fP///////////////////////////////////////////////5qamgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////// + /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////// + /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////////////5qa + mgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////+MjIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACamprw8PD///////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////Z2dl8fHwAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABoaGjZ2dn///////////////////////////////////////////////////8A + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////+ysrIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACnp6f////////////////////////////////////////////////////////Q0NBoaGgAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACnp6fh4eH///////////////////////// + //8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////8AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////////////////////////////////////Q0NBoaGgA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACnp6fh4eH///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////TU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAp6en//// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////6enpvb29jIyMaGhoAAAAAAAAAAAATU1NjIyM + vb296enp//////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////8PDwsrKyjIyMAAAAAAAAAAAAfHx8srKy8PDw//// + ////////////////////////////////////////////////////////////////6enpvb29jIyMaGho + AAAAAAAAAAAAAAAAfHx8jIyMvb292dnZ//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////6enpvb29jIyM + aGhoAAAAAAAAAAAAAAAAfHx8jIyMvb292dnZ//////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPDw8P////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////// + ///////////////////////////////Q0NB8fHz///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsrKy//////////////////////////////////// + ////////0NDQmpqaAAAAAAAAAAAA//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////4yMjAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIyMjNDQ0PDw8P///////////+np6dnZ2b29vYyMjAAAAAAA + AAAAAAAAAAAAAAAAAP////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////+ysrIAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAD///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////6enpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////4yMjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////w8PBNTU0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////0NDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////9DQ0E1NTQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhoaP////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////w8PCMjIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAACamprZ2dn///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////4eHhjIyMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfHx8x8fH8PDw + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //Dw8NDQ0Kenp4yMjE1NTQAAAAAAAAAAAAAAAHx8fIyMjL29vdnZ2f////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////p6em9vb2ampp8fHwAAAAAAAAAAAAAAAAAAACMjIya + mpq9vb3h4eH///////////////////////////////////////////////////////////////////// + ///////////p6em9vb2ampqMjIwAAAAAAAAAAAAAAABNTU2MjIynp6fHx8fp6en///////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////p6em9 + vb2ampqMjIwAAAAAAAAAAAAAAABNTU2MjIynp6fHx8fp6en///////////////////////////////// + ///////////Q0NCMjIwAAAAAAAAAAAB8fHyamprQ0ND////////////////////////Hx8eMjIwAAAAA + AAAAAAB8fHyamprQ0ND///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////h4eG9vb2MjIx8fHwAAAAAAAAAAAAAAAB8fHyMjIy9vb3p6en///////////// + ///////////////////////////////////////////////////////////////////////////w8PC9 + vb2MjIxNTU0AAAAAAAAAAAB8fHynp6fQ0ND///////////////////////////////////////////// + ///////////////////p6em9vb2ampp8fHwAAAAAAAAAAAAAAAAAAACMjIyampq9vb3h4eH///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////vb29aGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + TU1Np6en8PDw////////////////////////////////////////////////////////////vb29aGho + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATU1Nmpqa0NDQ//////////////// + ////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////AAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAA////////////////////////////////////////////////////vb29aGhoAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATU1Nmpqa0NDQ////////////////////////6enpaGho + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAp6en8PDw////////fHx8AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAmpqa4eHh////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//// + //////////////////////////////////////////////////////////////////////////////// + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////// + ////////////////////////////////////////////////////////////////2dnZAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////////////////////// + vb29aGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGhovb29//////////////// + ////////////////////////////////////////////////////////////p6enAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAmpqa4eHh//////////////////////////////////////////// + vb29aGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATU1Np6en8PDw//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////// + //////////////////////////////////////////////////////////////////////////////// + /729vU1NTQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AKenp/Dw8P///////////////////////////////////////////729vU1NTQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////////wAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP///////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAP///////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////// + /////////////////////////////////////729vU1NTQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////+np6U1NTQAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL29vdDQ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAKenp////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////// + //////////////////////////////////////////////////////////////////////////////// + /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////// + /////////////////////////////////////////////////+np6U1NTQAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAP///////////////////////////////////////////////////8fHx01NTQAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1NTdDQ0P////////////////// + /////////////////////////////////////////+np6U1NTQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////////////729vU1NTQAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKenp/Dw8P////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////// + //////////////////////////////////////////////////////////////////+MjIwAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNTU3Q + 0ND///////////////////////////////////+MjIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAD///////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///// + //////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////// + //////////////////////+MjIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////9oaGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM + jIz///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////// + //////////////////////////////////////////////////////////////////////////8AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////// + ///////////////////////////////////w8PBNTU0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ + //////////////////////////////////////////////+ampoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACampr///////////////////////// + //////////////////////////////9NTU0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAD///////////////////////////////+MjIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNTU3Q0ND///////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////// + ////////////////////////////////////////////////////fHx8AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// + ////////////////////////fHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAA////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAA////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// + ////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////// + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////// + ////////fHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA////////////////vb29AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjIyM//////// + ////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////// + ////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////////////////// + ////////////////////////fHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////// + ////////////////////////////////fHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfHx8//////////////////////////////// + ////////////////p6enAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAA////////////////////////////fHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////////////// + /////////////////////////////////////3x8fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////// + /////////3x8fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP///////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AP///////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////// + /////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////// + /////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////// + /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////////3x8fAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAP///////////////3x8fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1NTeHh4f///////9DQ0Gho + aAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMfHx////9DQ0E1NTYyMjP///////////////wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////////// + /////////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP////////////////////////////////////////////////////////////////// + /////////3x8fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////// + /////////////////4yMjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhoaNDQ0PDw8P////////Dw8NDQ + 0GhoaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHx8fP////////////////////////////////////// + //Dw8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////// + /////////////////3x8fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///////////////////////////////////////////////////////////// + //////////////////////+np6cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoaGi9vb3h4eH/ + ///////////////p6enQ0NCnp6dNTU0AAAAAAAAAAAAAAAAAAAD///////////////////////+ysrIA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNTU2ysrLh4eH////////////p6enZ2dmysrJ8fHwA + AAAAAAAAAAD///////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////// + //////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////// + //////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////// + //////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////8AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////+ysrIAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAABNTU2ysrLh4eH////////////p6enZ2dmysrJ8fHwAAAAAAAAAAAD///// + //////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQ0ND///////////////////+np6cAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////+ysrL///////////////8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////////////////// + //////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///////////////////////////////////////////////////////////////////////+np6cA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////// + //+9vb0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACnp6f///////////////////////////////+np6cA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACampr////////////////////////////////////Hx8cAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHzp6en////////h4eGnp6dNTU0AAAD///////////////// + //+np6cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoaGi9vb3h4eH////////////////p6enQ + 0NCnp6dNTU0AAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA//////////////////////////////////////////////////////////////////////// + ////////4eHhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATU1N0NDQ//////////////////////// + ////////////////////0NDQaGhoAAAAAAAAAAAA////////////////////4eHhAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAsrKy////////////////////////////////////////8PDwx8fHfHx8 + ////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////// + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////// + ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////AAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAA////////////////////////4eHhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAsrKy////////////////////////////////////////8PDwx8fHfHx8//////////////// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////AAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAA////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAA//////////////////////////////////////////////////////////////////// + ////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// + ////////////////////////////////////////////////////////////p6enAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////8PDwAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAjIyM////////////////////////////////////////jIyMAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA4eHh////////////////////////////////mpqaAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAfHx8////////////////////////////mpqa////////////////4eHhAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAATU1N0NDQ//////////////////////////////////////////// + 0NDQaGhoAAAAAAAAAAAA//////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /////////////////////////////////////////////////////////////////////////////4yM + jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHx8fP////////////////////////////////////////// + /////////////////9DQ0E1NTQAAAP///////////////////4yMjAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAANDQ0P////////////////////////////////////////////////////////////////// + /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////// + /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////////wAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////////////wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP///////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAP///////////////////////4yMjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANDQ0P// + /////////////////////////////////////////////////////////////////////01NTQAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAP///////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AP////////////////////////////////////////////////////////////////////////////// + /////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////// + /////////////////////////////////////////////9DQ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////////6enpwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAOnp6f///////////////////////////////////////+Hh4QAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAIyMjP///////////////////////////////2hoaAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAANDQ0P///////////////////////////////////////////////4yMjAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAHx8fP///////////////////////////////////////////////////////////9DQ + 0E1NTQAAAP////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// + ///////////////////////////////////////////////////////////////w8PAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAADp6en///////////////////////////////////////////////////// + //////////////+ampr////////////////w8PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACysrL/ + //////////////////////////////////////////////////////////////////////////////// + //8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////8AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////8AAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAD///////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ + ///////////////////w8PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACysrL///////////////// + //////////////////////////////////////////////////////////+ampoAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAADZ2dn///////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ + //////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////// + //////////////////////////////////////////////////////////////////////////////// + //////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////// + ///////////////////////////////Q0NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAD////////////////////////////w8PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8 + fHz///////////////////////////////////////////////98fHwAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAADw8PD///////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///// + ///////////////////////////////////////////w8PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADp6en///////////////////////////////////////////////////////////////////+ampr/ + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////// + ////////////////////////////////////////////////////x8fHAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAp6en//////////////////////////////////////////////////////////////////// + ////////////////////////x8fHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATU1N//////////////// + ////////////////////////////////////////////////////////////////////////AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////AAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAA////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////// + ////////x8fHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATU1N//////////////////////////////// + ////////////////////////////////////////////////0NDQAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAfHx8////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////// + ////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////// + //////////////////////////////////////////////////////////////////////////////// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////// + ////////////////6enpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAA////////////////////////////0NDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvb29//////// + ////////////////////////////////////////vb29AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAx8fH + ////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////// + ////////////////////////////////x8fHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAp6en//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////// + /////////////////////////////////////////5qamgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOHh + 4f////////////////////////////////////////////////////////////////////////////// + /////////////5qamgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALKysv////////////////////////// + /////////////////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAP///////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAP///////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////// + /////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////5qa + mgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALKysv////////////////////////////////////////// + /////////////////////////////////////////2hoaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHx8 + fPDw8P///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////// + /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////// + /////////////////////////////////////////////////////////////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////////////// + /+np6U1NTQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////// + /////////////////////5qamgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOHh4f////////////////// + /////////////////////////////+Hh4QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJqamv////////// + /////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////// + /////////////////////5qamgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOHh4f////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////8AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////// + //////////////////////////////98fHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// + //////////////////////////////////////////////////////////////////////////////// + //98fHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADh4eH///////////////////////////////////// + //////////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAD///////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ + //////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// + //////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////// + //////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////98fHwAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAADh4eH///////////////////////////////////////////////////// + ///////////////////////////////h4eEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC9vb3/ + //////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////// + //8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////// + //////////////////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///////////////////////////////////////////////////9oaGgAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////// + //////////98fHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw8PD///////////////////////////// + ///////////////////p6ekAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHz///////////////////// + //////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////// + //////////98fHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////////////////// + ////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////////////// + ////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//// + ////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////// + ////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////// + ////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAA//////////////////////////////////////////////////////////////////// + ////////////////////////2dnZTU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAp6en6enp + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////////////// + ////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA////////////////////////////////////////////////fHx8AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////// + ////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////////// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP////////////////////////////////////////////////////////////////// + /////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAP////////////////////////////////////////////////////////////// + /////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////// + /////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////// + /////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AP////////////////////////////////////////////////////////////////////////////// + /////////////////////6enpwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////////////wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAP////////////////////////////////////////////////////////////// + /////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /////////////////////////////////////////4yMjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////////////////// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP///////////////////////////////////////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///////////////////////////////////////////////////////////////////////////8A + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAD///////////////////////////////////////////////////////////////////////// + //////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////// + //////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////8A + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAD///////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////w8PCysrJNTU0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAD///////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAD///////////////////////////////////////////////////////////////////////// + //////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// + //////////////////////////+np6cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAD///////////////////////////////////////////////////////8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAD///////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAD///////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// + ////////////////////////////////////////////////////////////////////AAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAaGho////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//// + //////////////////////////////////////////////////////////////////////////////// + ////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////AAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAA////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////0NDQfHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAA////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//// + //////////////////////////////////////////////////////////////////////////////// + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////// + ////////////vb29AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAA////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAA////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + aGho//////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////// + /////////////////////////////////////////////////////////4yMjAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAIyMjP///////////////4yMjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOHh4f////////// + /////////////////////////////////////////////////////////////////////////////wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////////wAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP///////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAP///////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////// + /////////////4yMjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOHh4f////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////Dw8L29vWhoaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////// + /////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////// + //////////////////////////////////////////////////////////////////////////////// + /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////////9DQ + 0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL29vQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAP///////////////////////////3x8fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOnp6f// + /////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AHx8fP///////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////// + /////////////////////////////////////4yMjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIyMjP////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////// + //////////////////////////////////////////////+ampoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAACy + srL///////////////+np6cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACysrL///////////////////// + //////////////////////////////////////////////////////////////////8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAD///////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///// + //////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////// + //+np6cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACysrL///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////p6emysrJoaGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////// + //////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////// + //////////////////////////////////////////////////////////////////////////8AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////////////////////////Z2dkAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACnp6f///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ + //////////////////////////+ampoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADh4eH///////////// + ///////////////////////////////////h4eEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACampr///// + //////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////// + //////////////////////////+ampoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////// + //////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAACysrL///////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////// + ////////////////////////////////////x8fHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4eHh//// + ////////////////////////////////////4eHhAAAAAAAAAAAAAAAAAAAAAAAAAAAA2dnZ//////// + ////////0NDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATU1N//////////////////////////////// + ////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAA////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAA////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// + ////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////// + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////0NDQAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAATU1N//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////// + ////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////// + ////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA////////////////////////6enpTU1NAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAjIyM////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////// + ////////////////x8fHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsrKy//////////////////////// + ////////////////////////x8fHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAx8fH//////////////// + ////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////// + ////////////////x8fHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4eHh//////////////////////// + ////////////////4eHhAAAAAAAAAAAAAAAAAAAAAAAAAAAA2dnZ//////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////////////// + //////////////////////////Dw8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALKysv////////////// + /////////////////////////6enpwAAAAAAAAAAAAAAAAAAAAAAAE1NTf////////////////////// + /01NTQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKenp/////////////////////////////////////// + /////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ALKysv///////////////////////////+Hh4QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////// + /////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJqamv////////////// + /////////////+np6QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////// + /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////01NTQAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAKenp/////////////////////////////////////////////////////// + /////////////////////////6enp/////////////////////////////////////////////////// + /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////////////wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////////// + /////////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP////////////////////Dw8E1NTQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AHx8fP///////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////// + //////Dw8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhoaP////////////////////////////////// + /////////////5qamgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPDw8P////////////////////////// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////// + //////Dw8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALKysv////////////////////////////////// + /////6enpwAAAAAAAAAAAAAAAAAAAAAAAE1NTf////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///////////////////////////////////////////////////////////// + //////////////////+MjIwAAAAAAAAAAAAAAAAAAAAAAAAAAABNTU3///////////////////////// + ///////////w8PBNTU0AAAAAAAAAAAAAAAAAAAAAAACnp6f///////////////////////+np6cAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQ0ND///////////////////////////////////////////// + //////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADh4eH/ + //////////////////////+ysrIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHz///////////////// + //////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQ0ND///////////////////// + ///Hx8cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHz///////////////////////////////8AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////+np6cAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAADQ0ND///////////////////////////////////////////////////////////// + //////////////8AAAB8fHzp6en////////////////////////////////////////////Z2dkAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////////////////// + //////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///////////////////98fHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoaGj///////// + //////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////+a + mpoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADh4eH////////////////////////////////////////w + 8PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMjIz///////////////////////////////8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////////////+M + jIwAAAAAAAAAAAAAAAAAAAAAAAAAAABNTU3////////////////////////////////////w8PBNTU0A + AAAAAAAAAAAAAAAAAAAAAACnp6f///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA//////////////////////////////////////////////////////////////////////// + ////////4eHhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfHx8//////////////////////////////// + fHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAA8PDw////////////////////////////TU1NAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAmpqa////////////////////////////////////////////2dnZjIyM + ////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATU1N6enp//////// + ////////////TU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmpqa//////////////////////////// + ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4eHh////////////////////aGhoAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAmpqa////////////////////////////////AAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAA////////////////////////////TU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAmpqa////////////////////////////////////////////2dnZjIyM//////////////// + ////AAAAAAAAAAAAp6en8PDw////////////////////////////////////fHx8AAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAATU1N////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAA//////////////////////////////////////////////////////////////////// + ////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// + ////////fHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATU1N6enp////////////////AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////6enpAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAaGho////////////////////////////////////////mpqaAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA4eHh////////////////////////////////AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA////////////////////////////////////////////////////4eHhAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAfHx8////////////////////////////////fHx8AAAAAAAAAAAAAAAA + AAAAAAAAAAAA8PDw//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + //////////////////////////////////////////////////////////////////////////////// + /5qamgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhoaNDQ0PDw8P////////Dw8MfHx2hoaAAAAAAAAAAA + AAAAAAAAAAAAAAAAALKysv///////////////////////////////9DQ0AAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAE1NTaenp9nZ2fDw8P///////////+np6dDQ0Kenp01NTQAAAAAAAP////////// + /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1NTcfHx////////9nZ2Xx8 + fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANDQ0P///////////////////////////////wAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL29vfDw8P///+np6Xx8fAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAANDQ0P///////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAP///////////////////////////9DQ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AE1NTaenp9nZ2fDw8P///////////+np6dDQ0Kenp01NTQAAAAAAAP///////////////////wAAAAAA + AAAAAAAAAAAAAHx8fL29veHh4f///////////////9DQ0Hx8fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAJqamv///////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AP////////////////////////////////////////////////////////////////////////////// + /////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////6enpwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOnp6f///////////////////wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////////////7KysgAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAHx8fP///////////////////////////////6enpwAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAKenp////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////5qamgAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAGhoaNDQ0PDw8P////////Dw8MfHx2hoaAAAAAAAAAAAAAAAAAAAAAAAAAAAALKy + sv////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// + //////////////////////////////////////////////////////////////////////////9oaGgA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAB8fHz///////////////////////////////////////+np6cAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////// + //8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAABNTU3///////////////////////////////////8AAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABNTU3///////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ + //////////////////////////////+np6cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////8AAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQ0ND/ + //////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////// + //////////////////////////////////////////////////////////////////////////////// + //////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////+np6cAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAADQ0ND///////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAD///////////////////////////////////////98fHwAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAABNTU29vb3p6en////////w8PDQ0NB8fHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHz/ + //////////////////////9NTU0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////9oaGgAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHz///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////// + ////////////////////////////////////////////////////////////////6enpTU1NAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATU1N6enp//// + ////////////////////////////////////////p6enAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAfHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAvb29////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAfHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvb29//// + ////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////// + ////////////////////////p6enAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGho//////////////// + ////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////// + //////////////////////////////////////////////////////////////////////////////// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////0NDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAA0NDQ////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAA////////////////////////////////////////////fHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfHx8//////////////// + ////////////0NDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAA////////////////////////6enpTU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATU1N6enp//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////// + /////////////////////////////////////////////////////////+np6U1NTQAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhoaOnp6f////////////////// + /////////////////////////////////729vQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAP///3x8fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHx8 + fP///////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /2hoaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHx8fP////////////////// + /////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////// + /////////////////729vQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP///////////////////01NTQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOHh4f////////////////////////// + /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////// + /////////////////////////////////////////////////////////////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAANDQ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKen + p////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////// + /////////////////////////////////////////6enpwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJqamv////////////////////////////// + /////9DQ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAP///////////////////////////+np6U1NTQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhoaOnp6f////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////8AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////// + //////////////////////////////////////////////////////+MjIwAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMjIz///////////////////////////////////// + ///////////////////////////h4eFoaGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAD///////98fHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHz///////////// + //////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////98fHwA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHz///////////////////////////////// + //////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////// + ///////////h4eFoaGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAD////////////////////w8PCnp6cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNTU3Q0ND///////////////////////////////////////// + //8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////// + //////////////////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACnp6f///////////// + //////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////// + ///////////////////////////////////Z2dlNTU0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAABNTU3Hx8f///////////////////////////////////////////+y + srIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ + //////////////////////////////////+MjIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACMjIz///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////////////////// + ////////////////////////////////////////////////2dnZfHx8AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAaGho2dnZ//////////////////////////////////////////////////// + ////////////////////////0NDQfHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAmpqax8fH////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//// + ////////srKyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsrKy//////////////////////////// + ////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////srKyAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAp6en//////////////////////////////////////////////// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////// + ////////0NDQfHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmpqax8fH + ////////////////////////////////x8fHfHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAp6en8PDw////////////////////////////////////////////////AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////////////// + ////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfHx8//////////////////////////// + ////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////// + ////////////////////////////////vb29aGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAaGhovb29////////////////////////////////////////////////////////p6enAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////// + ////////////////////////////2dnZfHx8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + aGho2dnZ//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+np6b29vYyMjGhoaAAAAAAAAAAAAE1NTYyM + jL29venp6f////////////////////////////////////////////////////////////////////// + /////////////////////+np6cfHx5qamoyMjAAAAAAAAAAAAAAAAE1NTYyMjJqamr29veHh4f////// + /////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////// + //Dw8LKysnx8fAAAAAAAAAAAAIyMjLKysvDw8P////////////////////////////////////////// + //////////////////////////////////////////////////////////////Dw8LKysoyMjAAAAAAA + AAAAAHx8fLKysvDw8P////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////+np6cfHx5qamoyMjAAAAAAAAAAAAAAAAE1NTYyMjJqamr29veHh4f////////////////////// + //////////////////////////////Dw8NDQ0LKysoyMjGhoaAAAAAAAAAAAAAAAAE1NTYyMjKenp9DQ + 0P///////////////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAP////////////////////////////////////////////////////////////// + /////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHx8fP////////////////////////////////////////// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////// + /////////////////////////////+np6b29vYyMjHx8fAAAAAAAAAAAAAAAAHx8fIyMjL29venp6f// + /////////////////////////////////////////////////////////////////5qamgAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////////////////////// + /////////////////////////+np6b29vYyMjGhoaAAAAAAAAAAAAE1NTYyMjL29venp6f////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAD///////////////////////////////////////////////////////////////////////// + //////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABNTU3w8PD///////////////////////////////////////////8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////98fHwAAAAAAAAAAAAAAAAA + AAAAAAAAAAD///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//// + //////////////////////////////////////////////////////////////////////////////// + ////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAATU1N6enp////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////fHx8AAAAAAAAAAAAAAAAAAAAAAAA + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////// + //////////////////////////////////////////////////////////////////////////////// + /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANnZ2f// + /////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAP////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////+np6U1NTQAAAAAAAAAAAAAAAAAAAP////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////// + //////////////////////////////////////////////////////////////////////////8AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQ0ND///////////////// + //////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////p6elNTU0AAAAAAAAAAAAAAAD///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAA//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////vb29aGhoAAAAaGhovb29//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////// + ////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsrKy//////////////////////////////// + ////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////4eHhAAAAAAAAAAAAAAAA//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAP////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AP////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////3x8fAAAAAAAAAAAAAAAAAAAAHx8fP////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////////// + /////////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAKenp/////////////////////////////////////////////// + /////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////9DQ0AAAAAAAAAAAAP////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////8A + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////+9vb0A + AAAAAAAAAAAAAAAAAAAAAAAAAAC9vb3///////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////////////////// + //////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAACMjIz///////////////////////////////////////////////////////////// + //////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////Q0NAAAAAAAAD///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////AAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////aGhoAAAAAAAAAAAA + AAAAAAAAAAAAAAAAaGho//////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAA//////////////////////////////////////////////////////////////////// + ////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + fHx8////////////////////////////////////////////////////////////////////////AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////p6enAAAA//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAP////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AP////////////////////////////////////////////////////////////////////////////// + /////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1NTf////////// + /////////////////////////////////////////////////////////////////wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////9oaGgAAAAAAAAAAAAAAAAAAAAAAAAAAABoaGj/ + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////// + //////////////////////////////////////////////////////////////////////////////// + //////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNTU3p6en///////////////////// + //////////////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAD///////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////vb29AAAAAAAAAAAAAAAAAAAAAAAAAAAAvb29//////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////// + //////////////////////////////////////////////////////////////////////////////// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6enp//////////////////////////////////// + ////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAA//////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAP////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////3x8fAAAAAAAAAAAAAAAAAAAAHx8fP////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////// + /////////////////////////////////////////////////////////////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAANDQ0P////////////////////////////////////////////////// + /////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////+9vb1oaGgAAABoaGi9vb3///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////8A//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////wD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////8A//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////AP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////wD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////8A//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////AP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////wD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////8A//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////wD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////8A//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////AP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /wA= + + + + True + + + + /9j/4AAQSkZJRgABAgEAAAAAAAD/7gAOQWRvYmUAZAAAAAAB/9sAQwACAgICAgICAgICAwICAgMEAwIC + AwQFBAQEBAQFBgUFBQUFBQYGBwcIBwcGCQkKCgkJDAwMDAwMDAwMDAwMDAwM/9sAQwEDAwMFBAUJBgYJ + DQsJCw0PDg4ODg8PDAwMDAwPDwwMDAwMDA8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AAEQgB + IwJYAwERAAIRAQMRAf/EAB8AAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKC//EALUQAAIBAwMCBAIG + BwMEAgYCcwECAxEEAAUhEjFBUQYTYSJxgRQykaEHFbFCI8FS0eEzFmLwJHKC8SVDNFOSorJjc8I1RCeT + o7M2F1RkdMPS4ggmgwkKGBmElEVGpLRW01UoGvLj88TU5PRldYWVpbXF1eX1ZnaGlqa2xtbm9jdHV2d3 + h5ent8fX5/c4SFhoeIiYqLjI2Oj4KTlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/EAB8BAAICAwEB + AQEBAAAAAAAAAAEAAgMEBQYHCAkKC//EALURAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZx + gZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp + 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+DlJ + WWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A+/mKuxV2KuxV2KuxV2KuxV2KuxV2 + KuxV5r+cX/ksfOf/AGz2/wCJLmq7c/xLL/VcTXf3Evc/L3PI3kXYq7FXYq7FXYq7FXYq7FXYq/UL8nf/ + ACWPkz/tnr/xJs9c7D/xLF/Veu0P9xH3PSs2rluxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux + V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux + V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvN/zfR5Pyz85JGjSO2nsFRQST8S9AM1fbYJ0WWv5ri67+4l + 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 + 7FXYq7FXYq/kt/MP/lP/ADz/AOBBqf8A1FSZ7Npv7qH9Ufc+fZvrl7yw/L2t+nP/AD62/wDJvfmF/wCA + e3/dQtc5P2v/AMXh/W/QXedg/wB7L+r+kP3Jzz56l+S3/P1b/jgfkv8A9tDW/wDk1Z52fsf9eX3R/S89 + 2/8ATD4/ofjNndPNuxV2KuxV2KuxV2KuxV2KvRvyo/K/zT+cXnvQfIPlGze41LWbhVuLviWhsrYEGa7u + GH2Y4lqx7nZVqxAOLrNXDS4jkmdh9p7h727T4JZ5iEeZf1OeU/LWm+TPK3lvyho6FNJ8r6XaaTpqtTl6 + FnCsMfIilSVQVPjnkObLLLOU5c5Ek/F7zHAQiIjkBTIMqZvyD/5+Y/kbrOoXPl/88vLmmyX1jp+nrovn + oW6cjbRxStJZ3jhRUqfVaJ2Oy0jHfO29lO0IxEtPI0Sbj594/T83ne3NKTWWI8j+gvx5zt3nHYq7FXYq + 7FXYq7FXYq7FUw0rStT13U7DRdFsLjVdW1W4jtdN021jaWeeeVgqRxooJZmJoAMjOcYRMpGgOZTGJkaG + 5L+nr/nGf8pZfyT/ACW8l+Qb0xvrllbveeZZYm5IdRvZGnnVWBoyxFxErDqqA988l7W1v5vUyyDlyHuG + w/W9zodP4GGMDz6+97xmuct/Pd/z8c/9aY1T/wAB/Sf+TbZ6X7L/AOJD+sXj+2v8YPuD4OzonVOxV2Ku + xV2KuxV2KuxV2KvtL/nBv8i9Z/Nj85fL3mObTn/wN+XV/BrPmHVJFPovc2zCazs0Owd5JVUsvaMMT2Da + H2g7QjptNKN+uYoDyPM/L7XZ9laU5sol/DHc/oD7f/6JX+QP/Lq+YP8ApCtf65oP9GGX/U4/Mu0/kGH8 + 8u/6JX+QP/Lq+YP+kK1/rj/owy/6nH5lf5Bh/PLv+iV/kD/y6vmD/pCtf64/6MMv+px+ZX+QYfzy7/ol + f5A/8ur5g/6QrX+uP+jDL/qcfmV/kGH88u/6JX+QP/Lq+YP+kK1/rj/owy/6nH5lf5Bh/PLv+iV/kD/y + 6vmD/pCtf64/6MMv+px+ZX+QYfzy7/olf5A/8ur5g/6QrX+uP+jDL/qcfmV/kGH88u/6JX+QP/Lq+YP+ + kK1/rj/owy/6nH5lf5Bh/PKJtP8An1l+WiS1vvzO8zXEFN44ILOF6/67JKP+FyMva/N0xx+1R2Dj6yP2 + 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 + + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + + /9j/4AAQSkZJRgABAgEAAAAAAAD/7gAOQWRvYmUAZAAAAAAB/9sAQwACAgICAgICAgICAwICAgMEAwIC + AwQFBAQEBAQFBgUFBQUFBQYGBwcIBwcGCQkKCgkJDAwMDAwMDAwMDAwMDAwM/9sAQwEDAwMFBAUJBgYJ + DQsJCw0PDg4ODg8PDAwMDAwPDwwMDAwMDA8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AAEQgB + IwJYAwERAAIRAQMRAf/EAB8AAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKC//EALUQAAIBAwMCBAIG + BwMEAgYCcwECAxEEAAUhEjFBUQYTYSJxgRQykaEHFbFCI8FS0eEzFmLwJHKC8SVDNFOSorJjc8I1RCeT + o7M2F1RkdMPS4ggmgwkKGBmElEVGpLRW01UoGvLj88TU5PRldYWVpbXF1eX1ZnaGlqa2xtbm9jdHV2d3 + h5ent8fX5/c4SFhoeIiYqLjI2Oj4KTlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/EAB8BAAICAwEB + AQEBAAAAAAAAAAEAAgMEBQYHCAkKC//EALURAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZx + gZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp + 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+DlJ + WWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A+/mKuxV2KuxV2KuxV2KuxV2KuxV2 + KuxV5r+cX/ksfOf/AGz2/wCJLmq7c/xLL/VcTXf3Evc/L3PI3kXYq7FXYq7FXYq7FXYq7FXYq/UL8nf/ + ACWPkz/tnr/xJs9c7D/xLF/Veu0P9xH3PSs2rluxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux + V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux + V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvN/zfR5Pyz85JGjSO2nsFRQST8S9AM1fbYJ0WWv5ri67+4l + 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 + 7FXYq7FXYq/kt/MP/lP/ADz/AOBBqf8A1FSZ7Npv7qH9Ufc+fZvrl7yw/L2t+nP/AD62/wDJvfmF/wCA + e3/dQtc5P2v/AMXh/W/QXedg/wB7L+r+kP3Jzz56l+S3/P1b/jgfkv8A9tDW/wDk1Z52fsf9eX3R/S89 + 2/8ATD4/ofjNndPNuxV2KuxV2KuxV2KuxV2KvRvyo/K/zT+cXnvQfIPlGze41LWbhVuLviWhsrYEGa7u + GH2Y4lqx7nZVqxAOLrNXDS4jkmdh9p7h727T4JZ5iEeZf1OeU/LWm+TPK3lvyho6FNJ8r6XaaTpqtTl6 + FnCsMfIilSVQVPjnkObLLLOU5c5Ek/F7zHAQiIjkBTIMqZvyD/5+Y/kbrOoXPl/88vLmmyX1jp+nrovn + oW6cjbRxStJZ3jhRUqfVaJ2Oy0jHfO29lO0IxEtPI0Sbj594/T83ne3NKTWWI8j+gvx5zt3nHYq7FXYq + 7FXYq7FXYq7FUw0rStT13U7DRdFsLjVdW1W4jtdN021jaWeeeVgqRxooJZmJoAMjOcYRMpGgOZTGJkaG + 5L+nr/nGf8pZfyT/ACW8l+Qb0xvrllbveeZZYm5IdRvZGnnVWBoyxFxErDqqA988l7W1v5vUyyDlyHuG + w/W9zodP4GGMDz6+97xmuct/Pd/z8c/9aY1T/wAB/Sf+TbZ6X7L/AOJD+sXj+2v8YPuD4OzonVOxV2Ku + xV2KuxV2KuxV2KvtL/nBv8i9Z/Nj85fL3mObTn/wN+XV/BrPmHVJFPovc2zCazs0Owd5JVUsvaMMT2Da + H2g7QjptNKN+uYoDyPM/L7XZ9laU5sol/DHc/oD7f/6JX+QP/Lq+YP8ApCtf65oP9GGX/U4/Mu0/kGH8 + 8u/6JX+QP/Lq+YP+kK1/rj/owy/6nH5lf5Bh/PLv+iV/kD/y6vmD/pCtf64/6MMv+px+ZX+QYfzy7/ol + f5A/8ur5g/6QrX+uP+jDL/qcfmV/kGH88u/6JX+QP/Lq+YP+kK1/rj/owy/6nH5lf5Bh/PLv+iV/kD/y + 6vmD/pCtf64/6MMv+px+ZX+QYfzy7/olf5A/8ur5g/6QrX+uP+jDL/qcfmV/kGH88u/6JX+QP/Lq+YP+ + kK1/rj/owy/6nH5lf5Bh/PKJtP8An1l+WiS1vvzO8zXEFN44ILOF6/67JKP+FyMva/N0xx+1R2Dj6yP2 + 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 + + + + True + + + + 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 + Q5EdAntJDkV2COwlOZTiIbCX5FCEN4ImwiWXBdbGgFI7BhTkGlqtJsSLoIlwFOQaWBsDSvEQmghH6a2B + tRpaLYruECJgs9BqUXSHEBGehVY7ndKchTmf65y/53qW6MdeeYGStqb0dSMf3b17z6709CQ7d+9I5TBL + YZbPLJJZOIuQ5teYLJ1ZZvMtnxtcpDPn5DQnfMs5fn3K37N45qPJWTizCObTjPAtn++bhTm/5uWLX/Jr + QX6cuJcIeRTkGibNTZp/XEN8U640T5NEf/KDH6bS/AdvvpuePpaF+f/tvvmfbuNzb7mN2tc+SZ++/9co + 6dtDycqnKFn+JM3dUnNPzRuOU7LumfRAwbkr7qSk50pqWfEwHGnueRWjINtrZ4rgsx30u8cRpTl7KU+a + z5cjzUWa3/I4JTfcS8nnx+ncga3UduOttPDmzZRcfA21XXxFOsY/+Ml76fzgePutn9F777xLP/nRj0/N + Cws9TJpXFiLNWY/WrkrLc1EWsVSaf+gm6Q9Zj5+kt959L12w0tOyuIKLlm+mT09sp3mjbkHqf46SJXy0 + +UGas+mIW7QepbaRZ9PzSSWDfKT5flq256+mp2f51Mgj1Lrsbmpd/RjxebmTtbyTGVH0Pu1wt2v2pueT + aul9tHYhULdwta1+mjp7758qzZeyNH9wUppfvoXaV7nbK8apdfFGSj63nM67vp/aL7mc/uitD+mH73xA + b7//Ib1/svaChl/YvP/++/Tmm3aVcwteJ0yaszAVscs9TZqfOeRxxccSx2+mwd9Vcii1qwbndxWgAI9B + 64XSuyy+BG8UFOAxoLQuiy+vcX3LIrR9COwlORTZIbCX5FBkh8BekkORHQJ7SQ6leAjsJTlfhhdFE+GS + ywJrY0CpHQMKcg2tVhPiRdBEOApyDayNwRfjeWgiHKW3BtZqaLUoukOgINfQalF0hxARnoVWO53SnOFz + nXMvvlgob/Mv/tW/pG//6i/R3/x7fyuVyyKsWdKy0GYBzLd8vm4WxiyHWRizzBbhzIKZL9zJMpnhOj4H + OItm/p63ZRnP5/tmEbxz9470liUyn5+b/z1+3dre2ZZ+z48FnyKGb3kseD7xz74k9zmbpTli0tyi0RDX + xDL81EjzN8CHJ92X2v/TOjZV/78fv0s/cD/8ufv+wlsm6NNjT1HH4H5Krn2YOja8RAvv+AY19++lZOXT + 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 + YII= + + + + True + + + True + + + + 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 + xCU28YlRnGIVr5jFLXbxi2EcYxnPOIQBAQA7 + + + + + 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 + Q5EdAntJDkV2COwlOZTiIbCX5FCEN4ImwiWXBdbGgFI7BhTkGlqtJsSLoIlwFOQaWBsDSvEQmghH6a2B + tRpaLYruECJgs9BqUXSHEBGehVY7ndKchTmf65y/53qW6MdeeYGStqb0dSMf3b17z6709CQ7d+9I5TBL + YZbPLJJZOIuQ5teYLJ1ZZvMtnxtcpDPn5DQnfMs5fn3K37N45qPJWTizCObTjPAtn++bhTm/5uWLX/Jr + QX6cuJcIeRTkGibNTZp/XEN8U640T5NEf/KDH6bS/AdvvpuePpaF+f/tvvmfbuNzb7mN2tc+SZ++/9co + 6dtDycqnKFn+JM3dUnNPzRuOU7LumfRAwbkr7qSk50pqWfEwHGnueRWjINtrZ4rgsx30u8cRpTl7KU+a + z5cjzUWa3/I4JTfcS8nnx+ncga3UduOttPDmzZRcfA21XXxFOsY/+Ml76fzgePutn9F777xLP/nRj0/N + Cws9TJpXFiLNWY/WrkrLc1EWsVSaf+gm6Q9Zj5+kt959L12w0tOyuIKLlm+mT09sp3mjbkHqf46SJXy0 + +UGas+mIW7QepbaRZ9PzSSWDfKT5flq256+mp2f51Mgj1Lrsbmpd/RjxebmTtbyTGVH0Pu1wt2v2pueT + aul9tHYhULdwta1+mjp7758qzZeyNH9wUppfvoXaV7nbK8apdfFGSj63nM67vp/aL7mc/uitD+mH73xA + b7//Ib1/svaChl/YvP/++/Tmm3aVcwteJ0yaszAVscs9TZqfOeRxxccSx2+mwd9Vcii1qwbndxWgAI9B + 64XSuyy+BG8UFOAxoLQuiy+vcX3LIrR9COwlORTZIbCX5FBkh8BekkORHQJ7SQ6leAjsJTlfhhdFE+GS + ywJrY0CpHQMKcg2tVhPiRdBEOApyDayNwRfjeWgiHKW3BtZqaLUoukOgINfQalF0hxARnoVWO53SnOFz + nXMvvlgob/Mv/tW/pG//6i/R3/x7fyuVyyKsWdKy0GYBzLd8vm4WxiyHWRizzBbhzIKZL9zJMpnhOj4H + OItm/p63ZRnP5/tmEbxz9470liUyn5+b/z1+3dre2ZZ+z48FnyKGb3kseD7xz74k9zmbpTli0tyi0RDX + xDL81EjzN8CHJ92X2v/TOjZV/78fv0s/cD/8ufv+wlsm6NNjT1HH4H5Krn2YOja8RAvv+AY19++lZOXT + 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 + YII= + + + + + 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 + Rmv0RnN0R3v0R4N0SIv0SJN0SZv0SaP0MQcEADs= + + + + True + + + True + + + True + + + True + + + True + + + True + + + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + 211, 405 + + + True + + + 59 + + + + AAABAAEA3OIAAAEAGACIXwIAFgAAACgAAADcAAAAxAEAAAEAGAAAAAAAAAAAAHgAAAB4AAAAAAAAAAAA + AAD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////+/vn4+/P6/vf7/vn4/vn5//v4/vv4/f35/f79/P79/P//+/// + +v//+f//+v//+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+//9/P77/f78/P78 + /P/+/P/+/P/+/P/+/P///f/8/f75+/z5/fz6//33/fn5/vv///////////////////////////////// + ///////////////////////////////+/vX4/O75/vT4/vXy/vT1//nz/vn0/vz2/v78+/7++///+f// + +P//9///+P//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v/8/P76/f77/P78 + /P/++//++//++//9+v79+/36+vzz9vj1+/r3//zw+/T1/vn///////////////////////////////// + ///////////////////////////////+/vb9/vP8//b5/vXz/vT0//jy/vnx/vrx//v2/vv2/vv6/fz7 + /fz9/fz7/fz4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv1/vny/vj0/vj0 + /vn2/vr3/vr4/vv3/fv3/fv4/fv0+/j2/fr4//zx+/X2/vr///////////////////////////////// + ///////////////////////////////+/fT7+/H9//f5/vXz/fP0//fx//jt/fbr/fXu/fXv/fX0+/f0 + +/f4+vf1+/bx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXt/fLr//Hs/vHt + /vLu/fPv/fTx/PXy/ff2//v3//v3/vr3/vr5//zy/Pf2/vv///////////////////////////////// + ///////////////////////////////+/Pf++vX+//j5/fXw/PHx//Xi9+ng+unj/u7j/uzj/uvj/unj + /unk/ujk/unj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urf/ufc/+Xd/uXd + /ubg/ujh/unk/uvh+ufc8uDf8uPf7uTw+fP4//v2+vr6/f7///////////////////////////////// + /////////////////////////////////vr//vr///n5/fbv/PDn++zH4c+hwqyXuqKVvJ+VvJ6VvpuV + vpuWvpqWvpuVvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2Rv5qOwZePwJiP + wJiTvpuTvpyWvJ6dv6SuyLKxxra6yb7c5t/0+/f1+fr5/P7///////////////////////////////// + /////////////////////////////////Pz++/r+/vv6/vny//Tl++q428GbyKaWyaKSzZ6RzZ2Pz5mP + 0JmP0ZaQ0JiRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuN0JiJ0paL0peL + 0ZeNz5mOz5qSzJ2UyZ6Wwp+Yu5+mvqrU49nz+/j7+/38+v7///////////////////////////////// + ////////////////////////////////+vz+9vb9+vf7/vnz//Xp/u673sSZyKSUyaCPzZyOzZuM0JaM + 0JWL0pOM0JWOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiK0JaH0pSI0ZWI + 0ZWK0JaKz5ePzZqTzJ2byqSbwaKmwavZ6d71/fn9/P78+v7///////////////////////////////// + ////////////////////////////////+v//+v7/+/j5//jw//Ls//K73cWUyKCQy52Jz5eH0JWF1I+E + 1I6D1oyE1I6H0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOE05GD1JGD1JGD + 1JGD1JGD05GI0ZOKz5WSzJ2Yx6GdwaXX6dz2//r9+/7/+/////////////////////////////////// + ////////////////////////////////+v//+f7/+vj5/vjw//Ls//K83cWUyKCQy52Jz5eH0JWE1I+D + 1I6D1oyE1I6H0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOF0pKF0pKE05GD + 05GC1JCC1JCF0pKI0JSQzZuWyKCcwqTW6dv1//n9+/7/+/////////////////////////////////// + ////////////////////////////////+v//+f7/+vn5/vnw//Lt//K93MaUyKCQy52Jz5eH0JWD1I+D + 1I6D1oyE1I6H0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0ZSI0ZWF0pKF + 05KB1I+B1I+D1JGF0pONz5mUyp6aw6LU6tr0//n9+/7/+/////////////////////////////////// + ////////////////////////////////+v//+f7/+vn6/vnx/vLu//O93MaWx6GRyZ6LzZiKzpeG0pGG + 0pCG1I+H0pGKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aMzpeNzZmKz5WJ + 0JSD05GD05CD1JGF0pOM0JiSy5yXxKDT6tny//f7/P39/P////////////////////////////////// + ////////////////////////////////+v//+f7/+vn6/vny/vPu//O+3MeXxqKTyaCNzZqLzpiI0ZOI + 0ZKI05GJ0ZOMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiOzJqRy5yNzpeM + z5aF0pKE05GD1JGF05KL0ZeRzJuWxZ/S6tjy//f6/P38/P////////////////////////////////// + ////////////////////////////////+///+v7/+vn6/vny/vPv//S/28iZxaSWx6KQy5yPzJuMzpaM + z5aM0JSNzpaPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uTyZ2Wx5+RypuP + y5qH0ZSG0ZOD1JGE05KJ0paQzZuVxp7Q69fw//b4/f37/f////////////////////////////////// + ////////////////////////////////+///+v7/+vn6/vny/vPv//TA28maxKWXx6ORy52PzJuOzpiO + zpeO0JWPzpeRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yVyJ6Yx6GSyp2R + y5yI0JWH0ZSD1JGE05KJ0paPzZqVxp7Q69fw//b4/f36/f////////////////////////////////// + ///////////////////////////////7/vz7/fz9+Pz9+v37+fv2/ffE28eUypuMz5WD1I6B1YyK0JOM + z5WWypySzJqKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aGz5eDzpmKz5aM + z5WQ0JGP0ZGJ0pGI0ZOG0ZmKzJ2MxqHN69nw//b8+v3++/////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////8/P38/Pz++Pv8+/v4+/jz/vXC3MaWyZ2QzZiJ0JOH0ZKMzpaO + zZeUyp2QzJmJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSE0JaB0JeF0ZWG + 0ZSH05CG05CD05GD0pOE0ZmJzJ2NxqHM69nt//f5+/37/P////////////////////////////////// + ////////////////////////////////+f//+f7/+vn6/vny//Lv//LA3MWbxqGYyJ+TyZ2Syp2Ry52R + y52Ry52NzZiI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GD0pOA0pZ805N8 + 1JN31o931o941pF61JOC0pmJzJ6PxaLJ6trp//nz/f72/f////////////////////////////////// + ////////////////////////////////+f//+P7/+fr6/fny//Hv//G/3cOZx5+WyZ2Ry5uQy5qOzJqO + zJqNzZqNzpiMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WJ0JWG0JWD0pOB + 0pJ91Y591Y591I+A05KI0ZiPy5yVxKDP6tnu//f4/P36/f////////////////////////////////// + ////////////////////////////////+f//+P7/+fv6/fry//Hu//C+3sKYyJ6Vy5yPzJmNzZiMzpiL + zpiKz5iMzpiRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmOzpaM0JWI0ZKH + 0pKD1I6D1I6D1I+F0pGN0JeUy5uaxJ/U6tj0//f9/P3//P////////////////////////////////// + ////////////////////////////////+P//9/7/+fv6/frw//Ht/++73sCVypyRzZmK0JWI0JSF0pKF + 0pKD0pKJz5aSyp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2TzJiTzpWP0JKO + 0JKJ046J046J046M0pCS0JWYy5mexZ3Z6tb5//T+/fr//vz///////////////////////////////// + ////////////////////////////////9///9/7/+fv5/frw//Hs/++73sCUy5uQzpiI0ZOG0pKD1JGC + 1JGB1JGH0JaTyp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+VzJmXzpWSz5KR + 0JKM0o6M046M046O0o+U0JSay5mfxZ3b6tX7//P+/vn//vv///////////////////////////////// + ////////////////////////////////9///9/7/+fv5/fnw/+/r/+2537+SzJmOzpaF0pKD05GA1Y5/ + 1Y1+1oyD0pGKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqPzJiTzZePz5SO + 0JKI0o+I046H1I6J04+P0pOUzZeZx5vT69Ty//L5/vf7/vn///////////////////////////////// + ////////////////////////////////9///9/7/+fz5/fnw/+/r/+2537+SzJmNzpaE0pGD05CA1Y5/ + 1Y1+1oyC05GJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmOzJiSzJiOzpSN + z5OH0o+H046G1I6I1I+O0pOTzZiYyJzS69Tw//H3//f5//j///////////////////////////////// + ////////////////////////////////9f/++P7++v36/fry//Hp/+q5376TyZqNypaGzpGEz5CA0I+A + 0I+A0Y5/0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y+EzZaJyZqFzJeE + zJZ+0JF90ZB50o5905GC05aGzpmRzqLF7tTh/+/s//jr//b///////////////////////////////// + ////////////////////////////////9f/++P79+Pn7/frz//Pp/+u53r6Wyp2SzJuL0JaJ0JWG0ZSG + 0ZSG0pSE05OB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKIzpqNy5+JzZyI + zpuB0pWA0pV91JN90pN7y5B/xZKKx5zC7NLi//Hs//ns/vj///////////////////////////////// + ////////////////////////////////+P/++f359/X7//rz//Tp/+y63b+Yxp+Vx52QyZqPyZqOypqO + ypqOypqKzJaD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGJyZyOxaSJyJ+I + yZ6BzZiAzZh+z5aC0pqI1J+Iy56PyaTF7Njj//Xr//vl+/X///////////////////////////////// + ////////////////////////////////+//++v35+PX7//rz//Pp/+u+3sKdxaOZxqCWx5+Vx5+Vx5+V + x6CWxqGTyJ2NzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiTxqGYwqiTxaOS + xqKLypyKy5uGzZqIzZuJy5uLxJyUxaTL6tnp/vby/vzv+/n///////////////////////////////// + /////////////////////////////////P/++/37+/f8//ny/vHq/uvK5M2py62jyKiiyKmiyKqjx6uj + xqulxa6jx6qgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWlxqypw7Gkxa2j + xqybyqWay6SVzqOWzaOXyqKdyKemya/X7N7x/vf7/f39/f////////////////////////////////// + ////////////////////////////////+vz+/P78/fj7//jw/fDs/e3b8d3R6tXT7NjT7NnT7NnW7NzW + 7NzY69/Y7N3a7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dvd7N7g6uDc69zb + 7NvT7dXS7tTN79HN79HM7s/T7tXU6NXr9O35+vn99/3+9/////////////////////////////////// + ///////////////////////////////79Pb++/z8/vf7//fv/e/t/O7o/Orp/e3t//Lu//Lv//Py//fy + //f0//r2//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n9//n///r7//b7 + //Xy/+/x/+7t/+vs/+rs/+ny/+7w+uz3+vb/9vr/9P7/9v////////////////////////////////// + ///////////////////////////////9/Pz+/v7+/v3+//37/vv7/vv6//v6//v6//z7//z7//z8//38 + //38//39//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3///3+//z+ + //z8//v7//v6//r7//r7//r8//v8/vv9/v3//f3//P7//f////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////9//79/v79/v39/v7+/v7+/f7+/f/+/f///f///f///f///f// + /f///f///f///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v7///7///7/ + //7//v7//v///v///f7//f7//f7//f7//v7//v///v///v////////////////////////////////// + ///////////////////////////////3//z1/vr1/Pn3/Pv6+/37+P399//++P//+P//9v//9v//9P// + 9P//8///9f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f/+/Pz+/vv+/vv/ + /vz/+/7/+/7/+v7/+f7/9v3/9vz/9/3/+v7/+/7++/3++/3///////////////////////////////// + ///////////////////////////////3/vv2/vv2/fr2/Pr4+vz7+v39+//++f/++P/+9///9///9f// + 9f//9P/+9v7++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f38/Pr7/ff8/fj8 + /fj++/v++/v/+vz++vz9+vz++/z++/39+/z9+fr8+Pj9+Pj///////////////////////////////// + ///////////////////////////////1+/n4//z4/vz2/Pr4+/z6/f77/v/7/P77+/78+/79+/79+v/9 + +v/9+v/8+/37/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr4/vb3//T3//X3 + //X6/vf7/vf9/fj8/Pf7+/f9/fn+/vr9/fn8/Pj8/Pn9/fr///////////////////////////////// + ///////////////////////////////1+Pj6/v75/f32+/r2/fv3/vzz/Pjz+/j0/Pnz/Pfz/Pfz+/jy + +/fy+/fx/Pbx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/vLx//Dx//Dx + //Dz/vLz/vL1/fL1/fP2/fT4/vb5//j6//j6//j7//j6//f///////////////////////////////// + ///////////////////////////////3+Pr8/v/6/f72+vv2/vvy/ffj8uji9Ojm+uzk++rj++nh++jh + /Ojf/Obg/Ofh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jk++fl++Xl++Xl + ++Xl++bl++bm++bm+ubk9uTi8+Ll9Obv++/2/vX4//b0/fL///////////////////////////////// + ///////////////////////////////8+v39/P74+/31+vr2//rs+/DP5NO21L2x0ris1bOr1rKl2a+l + 2a6i2q2k2a+o1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOs1rKv1bKu1rGu + 1rGs1rGs1rGt1bGv1rOx1LSuz7K6177X79nu/e/0//Xx/vL///////////////////////////////// + ///////////////////////////////++//++/72+fv0+fn2//ro+OzB2cWiw6mcwqSWxp6Vx52OypiN + ypeKzJaMypmRx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Wxp6axZ6YxZ2Y + xp2Wxp2Wxp2Wxp2Zx5+bxaCWvJumyKvN6dDr/O3z//Xt/e////////////////////////////////// + /////////////////////////////////P/9+/72+fv2/frx/vTt/vLA28abxaOXx6COzJmMzZiG0ZKF + 0pKC1I6F0pKKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiRy5qVypySy5qR + zJmPzZeOzZaOzZaQzZiTzJuVyJ2ZxaDP6tPs/u/y//Tz/vX///////////////////////////////// + /////////////////////////////////P/9+/72+vv3/vrw/vPu//PA3MeaxaKWyJ+NzZmLzpeE05GE + 05GA1o2E05GJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eQzJqUy5uRzJmQ + zZiNz5aNz5WNz5WOzpeSzZuVyp2YxZ/P6tTt//Dy//T0//b///////////////////////////////// + /////////////////////////////////f/9/P71+/n1/vnu/vPs//O+3MaYxqGVyZ+LzpeJ0JWD1JGC + 1JB+14yB1I6I0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZONzpeRzJqNzZiM + zpiH0ZOG0pKF05KH0pON0JeRzJuVxp7O69Xt//Pz//j2//n///////////////////////////////// + ///////////////////////////////+/f/8/P70/Pj0/vnt/vPs//O+3MaYxqGVyJ+MzpiKz5aD05GC + 1JB/1o2C1I+I0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKNzZeRy5qNzZiM + zpiG0ZOG0pKE05GG0pOM0JeRzJuVxp7P69bt//P0/vn3/vv///////////////////////////////// + ///////////////////////////////7/v/5/f7z/Pjz//js//Lr//K+3MaZxqKXyKCPzJqNzZiH0pOG + 0pKD1JGG0pGM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKOzZeRy5yNzZiM + zpiF0pKE05GB1JGD05KJ0ZePzJuVxZ/Q6tfw//b4/f36/f////////////////////////////////// + ///////////////////////////////7/v/5/v7z/Pjz//js//Ls//K+3MaaxaKXx6CQy5qOzJmI0ZSH + 0ZOE05GH0pGN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKPzZiRy5yNzZmM + zpiE0pKD05GB1JGD05KJ0ZePzJyVxaDR6tnw//f6/P38/f////////////////////////////////// + ///////////////////////////////7///5/v7z/Pjz//js//Ls//PA3MebxaOYx6GRy5uPzJmK0JaJ + 0JWH0pOK0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQzZiRy52NzZmM + zpmD0pKC05GB1JGD05KJ0ZeQy5yWxKHS6try//n8+/7/+/////////////////////////////////// + ///////////////////////////////7//36/vz5+fr5/Pv1+/fy/vXC3MeXyJ6RzJqI0JOH0ZGK0JSL + z5WQzZiOzpeM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSKzpiIzZqLzpeM + z5aL0ZGK0ZGG0pGG0pOH0ZiMzJ2QxaHP69nw//f8+/3/+/////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//r7/vr++fv++/z9+/n2/vbE3MaVy5mN0JOE1YyD1ouK0ZKM + 0JOXypyUypuPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmTyZ2WyJ+SypyQ + y5uMzZiLzpeK0JSMz5aRzZuWyZ+aw6LT6tnx//f6/P38/P////////////////////////////////// + ///////////////////////////////6//r7/vr++fv9+/z8+/n2//bD3MaVy5mN0JOE1YyC1ouJ0pKM + 0JOXypyUypuPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmTyZ2WyJ+SypyQ + y5uLzpeLzpeJ0JSLz5aQzZuVyZ6Zw6HT6tnx//b5/P38/f7///////////////////////////////// + ///////////////////////////////5//r5/vr7+fv8+/35+/v0//fC3MaSy5mK0ZOB1oyA1ouI0pKK + 0JSVyp2Ry5uMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiRy5yVyZ+Ry5uQ + zJqI0JWH0ZSH0pOI0ZSNz5mSy5yWxZ/Q6tfw//b2//v5//z///////////////////////////////// + ///////////////////////////////4//r4/vr6+fz7/P33+/vz//fA3MaRy5qI0ZOA1ox+1ouG0pKJ + 0JSTyp2Qy5uKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aPzJqTyp2PzJmN + zZiH0ZSG0ZOF0pKH0ZSM0JiRzJyVxp7P69bu//T1//n4//v///////////////////////////////// + ///////////////////////////////2//z2/vz3+vz4/P31+/vw//e+3MePy5uH0ZV91o181oyF0pOH + 0JWRyp+NzJuI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWMzpeQzJqLz5aK + 0JaF0pKE05GD1JGE05KJ0paOzZqTx53N69Tt//Lz//f2//n///////////////////////////////// + ///////////////////////////////1//z0/vz2+f33+/30+vzv/vi93MiOy5yF0ZV81o571o2D0pSG + 0JaQyZ+NzJuH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOLzpeOzJmKz5aI + 0JWE05GD05GB1I+D05GI0pWOzpmSx5zM69Pr//Dy//f1//n///////////////////////////////// + ///////////////////////////////0//30/v31+f72+/3z+vzu/vi93MmNy5yF0ZZ71o961o6D0pWF + 0JeQyaCMzJuH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOLz5aOzZmJ0JWI + 0ZWD05GC1JCB1Y+D1JCI05SNzpiRyJvL69Lr//Dx//b0//n///////////////////////////////// + ///////////////////////////////w+vn1/v75+/73+v70+f3s/fa52cWMyJuFzpZ704561I2Dz5SF + zpaPxp+LypqGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OKzZaOypiKzZWJ + zpSD0ZCC0pCB0o+C0pCGz5KOzpmXzKHM7dPo/+3z//f1//n///////////////////////////////// + ///////////////////////////////x+vr2/v/5+v/2+P71+f3u/fe828iPy5+I0Zl+1pF915CG0peI + 0JmSyaKOzJ2J0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paNz5iRzZuOz5iN + 0JeG05OF1JKE1ZKF1JOH0JSOzZqbz6XP7tXq/+/0//j2//r///////////////////////////////// + ///////////////////////////////5/P76/P/69P/79f78+P71/fnF3M2Sx56HypR+z4580IyFy5OH + yZWSw56OxZqJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSOx5eSxZqNx5eM + x5eFzJGFzJGDzZCHzpONzpmRyJubyKTQ7Nfu//P4/vz0+Pn///////////////////////////////// + ///////////////////////////////6/P/6/P758fz+9//++v/0/PfB2smTx56Ky5eB0JB/0Y+IzJaK + y5iVxKGRx52MypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeRyJqVxp2QyJqP + yJqIzZSIzZSGzpOK0JaRz5ySyJybx6TS69jw//X5/v309vj///////////////////////////////// + ///////////////////////////////9+P7/+v7/8f7/+P//+P/0+PXD1MWbx6GVzpyM05aL1JWSz5uV + zp2gx6WdyaSXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GbyaSex6abyqOZ + yqKUzZ+Tzp6Sz5uTzp2SxpyXwqCjxKra6+D2/vv9+v7/+v////////////////////////////////// + ///////////////////////////////89fz/+v//8v//9///9v/19/bM3M2eyKOTy5qK0JOI0ZGQzJiT + ypqexKKbxaGVyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+ZxaKcxKSYxqGX + x6CRypyRypuQzJmRypqSxZycxqSox67Y6N3x+fb8+P3/+P////////////////////////////////// + ////////////////////////////////9v3/+f//8///9v//8//6+Prg69/A4sO45b2v6bWt6rO257q5 + 5rzE4cXA4sS548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K+4cbC4Mm+4ca9 + 4sW25MC25cC05b625cC75cTF5czK4dDn8Oz19fn99P3/9f////////////////////////////////// + ////////////////////////////////+v//+///9///+f//9//8+vzx+PDr+uzr/+7l/+nk/+jq/+zr + /+3y//Pw//Lr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hv//Px//Xv//Pu + //Pq//Dp//Do/+/p/+/r//Dw//Tv+/L3/Pn8/P7++v7/+v////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////+/P/+/P///P///P//+///+///+////P///P//+///+///+/// + +///+//7/f32//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r0//zz//31//72 + ///3///3/v/4/f/5/f/6/f/5/f/4/f/3/f/2/f/1/v70/v7///////////////////////////////// + ///////////////////////////////+/P/+/P///P//+///+///+///+//9+f/8+P/99//+9//+9//+ + 9//+9//5+vvw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xu/vfs/vnv/Pvw + /Pzy+/3y+/3z+f/1+v/5/f/4/f/2/f/2/v/1/v/0/v7z/v7///////////////////////////////// + ///////////////////////////////+/P/+/P/+/P/9+//8+//8+//8+//8/P/8/P/9/f/9/f/9/f/8 + /f/7/f/8/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f78/vv6/vn8/vv8 + /vz+/vz+/v3+/P/+/P/++v/++//++//+/P/+/f/+/f/+/f////////////////////////////////// + /////////////////////////////////P/++//9/P/9/P/7/P/7/P77/P77/P77/f77/f77/v77/v37 + /v35/v37/f7//P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P/9/fv7//n8//r9 + //r+//v//vv//f3//P3/+v7/+v7/+v7/+/7//P7/+/7/+/7///////////////////////////////// + ////////////////////////////////+//++//8/P/7/P/6/f/5/f34//z2//r1//r0//j0//jy//fy + //fy//X3/Pn/+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f///Pj///T///T/ + //T///T///T///X///b///n//vr//vz//fz//Pz/+f3/+f7///////////////////////////////// + ////////////////////////////////+//++//8/P/7/P75/f74/vz3//v1//r0//nz//fy//fw//Xw + //Xv//Tz/ff6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/ff7//P7//P7 + //P6//P6//P6//T6//T6//X7/vf8/vn+/fv//fz/+/7/+/////////////////////////////////// + ////////////////////////////////+//++//8/P/6/P74//z2//r1//ns/PHo+u7l++vl++vh/Ojg + /Off/Ofj++rq+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/r+uvs++js++fs + ++fq++fq++fq++fq++fr+ufv++v0++/6/PT+/fj//f3//f////////////////////////////////// + ////////////////////////////////+//++/76+v36/P31/fr1//ne7OPE3Mq/2sW73MK63cG23761 + 376z4Ly137243cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC63cC83cC63r66 + 3r634Ly34Ly34Ly5372838HB3sXG3Mjl8eX2/fb5/fz6/f3///////////////////////////////// + /////////////////////////////////P/++/75+fz5/Pzz/Pjz//nH2s2iv6ifwKaaw6GZxKCVxp6U + xp2RyJuQyJqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqSxp6VxaGRxp6R + x56OyJuOyZuOyZuPyZ2UyaKYxaScwKbS6dvv//f0//v2//z///////////////////////////////// + ////////////////////////////////+//++/75+fz5/fvy/Pby//fF2sufwaacw6OVxp6Ux52OypmN + y5iKzZaIzpWGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OKy5mNyJ2JypuI + ypqEzpeDzpaCzpaFzpiLzp2PyqCTxKPL6tjp//Xv//rx//z///////////////////////////////// + ////////////////////////////////+//++v75+vv5/fvy/fbx//bE28qew6WbxaKTyJyRyZuLzZeK + zZaH0JSF0ZKC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CGzpaJy5yFzJmE + zZl/0JV+0ZR90pR/0ZWG0JqKzJ6OxqHH69fm//Xs//rv//z///////////////////////////////// + ////////////////////////////////+//++v75+vv4/fvw/fXv//XA3MebxaOXx6COzJmMzZiE0pGD + 05GB1Y6D05CG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKLzpaOzJmKzpaJ + z5WC05CC049/1Y6B1JCI0pWNzZqSx57O69Xt//P0//n3//z///////////////////////////////// + ////////////////////////////////+//++v75+vv4/fvw/fXu//TA3MeaxqOXyKCOzZqMz5iD1JGD + 1ZGA1o6D1ZCI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSNz5eRzZmM0JaL + 0JWE1JCD1Y+B1o6D1ZCI05SOzpmTx53P69Xv//L2/vn5/vv///////////////////////////////// + ////////////////////////////////+//9+v73+vv3/vrw/vPt//O+3MaXyKGUy56K0JeI0pWB149/ + 14572ouD1JGSzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2XzJqbzZmV0JSU + 0ZON1I2M1YyJ14uL1YyR05CXzpWdx5rZ69P5//L+/fn//fv///////////////////////////////// + ///////////////////////////////++/79+/74+fv4/fvy/fTv/vS/3MaXyaCTzJ2K0paI05SD1pCD + 1pCB14+H05SRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyUzZqXzpmU0JWT + 0ZSO1I6O1Y6K1oyL1Y6P0pKVzpeax5vW69T3//L9/Pr//fz///////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/ZeroFlowTool/FutureReports.cs b/ZeroFlowTool/FutureReports.cs new file mode 100644 index 00000000..cb4b9b9b --- /dev/null +++ b/ZeroFlowTool/FutureReports.cs @@ -0,0 +1,712 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Drawing.Printing; +using System.Diagnostics; +using Microsoft.Office; + + + + +namespace GenesisZeroFlow +{ + + + public partial class GenesisZeroFlow : Form + { + //static void DefineContentSection(Document document) + //{ + // Section section = document.AddSection(); + // section.PageSetup.OddAndEvenPagesHeaderFooter = true; + // section.PageSetup.StartingNumber = 1; + // HeaderFooter header = section.Headers.Primary; + // header.AddParagraph("\tOdd Page Header"); + // header = section.Headers.EvenPage; + // header.AddParagraph("Even Page Header"); + // // Create a paragraph with centered page number. See definition of style "Footer". + // Paragraph paragraph = new Paragraph(); + // paragraph.AddTab(); + // paragraph.AddPageField(); + // // Add paragraph to footer for odd pages. + // section.Footers.Primary.Add(paragraph); + // // Add clone of paragraph to footer for odd pages. Cloning is necessary because an object must + // // not belong to more than one other object. If you forget cloning an exception is thrown. + // section.Footers.EvenPage.Add(paragraph.Clone()); + //} + //private void MigraDocTitlepage(Document document) + //{ + // Section section = document.AddSection(); + + // Paragraph paragraph = section.AddParagraph(); + // paragraph.Format.SpaceAfter = "3cm"; + + + // paragraph = section.AddParagraph(rTB_ReportEnterTitle.Text); + // paragraph.Format.Font.Size = 18; + // paragraph.Format.Font.Bold = true; + // paragraph.Format.Alignment = ParagraphAlignment.Center; + // paragraph.Format.Font.Color = Colors.Black; + // paragraph.Format.SpaceBefore = "6cm"; + // paragraph.Format.SpaceAfter = "3cm"; + + // paragraph = section.AddParagraph("by"); + // paragraph.Format.Font.Size = 12; + // paragraph.Format.Font.Italic = true; + // paragraph.Format.Alignment = ParagraphAlignment.Center; + // paragraph.Format.SpaceAfter = "3cm"; + + // paragraph = section.AddParagraph(rTB_ReportEnterOperator.Text); + // paragraph.Format.Font.Size = 14; + // paragraph.Format.Alignment = ParagraphAlignment.Center; + // paragraph.Format.SpaceAfter = "3cm"; + + + // paragraph = section.AddParagraph(rtB_ReportTitlepageIntro.Text); + // paragraph.Format.Font.Size = 12; + // // paragraph.Format.Alignment = ParagraphAlignment.Center; + // paragraph.Format.Alignment = ParagraphAlignment.Justify; + // paragraph.Format.SpaceAfter = "3cm"; + + //} + //public static void DefineTableOfContents(Document document) + //{ + // #region CA1062 + // if (document == null) + // return; + // #endregion + // #region Definitions and initializations + // Section section = document.LastSection; + // #endregion + // section.AddPageBreak(); + // Paragraph paragraph = section.AddParagraph("Table of Contents"); + // paragraph.Format.Font.Size = 14; + // paragraph.Format.Font.Bold = true; + // paragraph.Format.SpaceAfter = 24; + // paragraph.Format.OutlineLevel = OutlineLevel.Level1; + + // paragraph = section.AddParagraph(); + // paragraph.Style = "TOC"; + // Hyperlink hyperlink = paragraph.AddHyperlink("GP30 Settings"); + // hyperlink.AddText("GP30 Settings\t"); + // hyperlink.AddPageRefField("GP30 Settings"); + // hyperlink = paragraph.AddHyperlink("Decoded Data"); + // hyperlink.AddText("Decoded Data\t"); + // hyperlink.AddPageRefField("Decoded Data"); + + // paragraph = section.AddParagraph(); + // paragraph.Style = "TOC"; + // hyperlink = paragraph.AddHyperlink("Tables"); + // hyperlink.AddText("Tables\t"); + // hyperlink.AddPageRefField("Tables"); + + // paragraph = section.AddParagraph(); + // paragraph.Style = "TOC"; + // hyperlink = paragraph.AddHyperlink("Charts"); + // hyperlink.AddText("Charts\t"); + // hyperlink.AddPageRefField("Charts"); + //} + //public static void DefineStyles(Document document) + //{ + // #region CA1062 + // if (document == null) + // return; + // #endregion + // // Get the predefined style Normal. + // Style style = document.Styles["Normal"]; + // // Because all styles are derived from Normal, the next line changes the + // // font of the whole document. Or, more exactly, it changes the font of + // // all styles and paragraphs that do not redefine the font. + // style.Font.Name = "Times New Roman"; + + // // Heading1 to Heading9 are predefined styles with an outline level. An outline level + // // other than OutlineLevel.BodyText automatically creates the outline (or bookmarks) + // // in PDF. + + // style = document.Styles["Heading1"]; + // style.Font.Name = "Arial"; + // style.Font.Size = 14; + // style.ParagraphFormat.Alignment = ParagraphAlignment.Center; + // style.Font.Bold = true; + // style.Font.Color = Colors.Black; + // style.ParagraphFormat.PageBreakBefore = true; + // style.ParagraphFormat.SpaceAfter = 10; + + // style = document.Styles["Heading2"]; + // style.Font.Name = "Arial"; + // style.Font.Size = 12; + // style.Font.Bold = true; + // style.ParagraphFormat.PageBreakBefore = false; + // style.ParagraphFormat.SpaceBefore = 6; + // style.ParagraphFormat.SpaceAfter = 6; + + // style = document.Styles["Heading3"]; + // style.Font.Size = 10; + // style.Font.Bold = true; + // style.Font.Italic = true; + // style.ParagraphFormat.SpaceBefore = 6; + // style.ParagraphFormat.SpaceAfter = 3; + + // style = document.Styles[StyleNames.Header]; + // style.ParagraphFormat.AddTabStop("16cm", MigraDoc.DocumentObjectModel.TabAlignment.Right); + + // style = document.Styles[StyleNames.Footer]; + // style.ParagraphFormat.AddTabStop("8cm", MigraDoc.DocumentObjectModel.TabAlignment.Center); + + // // Create a new style called TextBox based on style Normal + // style = document.Styles.AddStyle("TextBox", "Normal"); + // style.ParagraphFormat.Alignment = ParagraphAlignment.Justify; + // style.ParagraphFormat.Borders.Width = 2.5; + // style.ParagraphFormat.Borders.Distance = "3pt"; + // style.ParagraphFormat.Shading.Color = Colors.SkyBlue; + + // // Create a new style called TOC based on style Normal + // style = document.Styles.AddStyle("TOC", "Normal"); + // style.ParagraphFormat.AddTabStop("16cm", MigraDoc.DocumentObjectModel.TabAlignment.Right, TabLeader.Dots); + // style.ParagraphFormat.Font.Color = Colors.Blue; + //} + /* + private void MigraDocDecodedDataPath0(Document report) + { + + + if (l_GetFirstLevelUpPath0.Text != "---") + FirstHitLevelUpPath0 = l_GetFirstLevelUpPath0.Text + " (" + (Convert.ToDouble(l_GetFirstLevelUpPath0.Text) * Constants.FirstHitLevelFactor).ToString(Formats.FirstHitLevelVoltage) + "mV)"; + else + FirstHitLevelUpPath0 = "---"; + + if (l_GetFirstLevelUpPath1.Text != "---") + FirstHitLevelUpPath1 = l_GetFirstLevelUpPath1.Text + " (" + (Convert.ToDouble(l_GetFirstLevelUpPath1.Text) * Constants.FirstHitLevelFactor).ToString(Formats.FirstHitLevelVoltage) + "mV)"; + else + FirstHitLevelUpPath1 = "---"; + + if (l_GetFirstLevelUpPath2.Text != "---") + FirstHitLevelUpPath2 = l_GetFirstLevelUpPath2.Text + " (" + (Convert.ToDouble(l_GetFirstLevelUpPath2.Text) * Constants.FirstHitLevelFactor).ToString(Formats.FirstHitLevelVoltage) + "mV)"; + else + FirstHitLevelUpPath2 = "---"; + + if (l_GetFirstLevelDownPath0.Text != "---") + FirstHitLevelDownPath0 = l_GetFirstLevelDownPath0.Text + " (" + (Convert.ToDouble(l_GetFirstLevelUpPath0.Text) * Constants.FirstHitLevelFactor).ToString(Formats.FirstHitLevelVoltage) + "mV)"; + else + FirstHitLevelDownPath0 = "---"; + + if (l_GetFirstLevelDownPath1.Text != "---") + FirstHitLevelDownPath1 = l_GetFirstLevelDownPath1.Text + " (" + (Convert.ToDouble(l_GetFirstLevelUpPath1.Text) * Constants.FirstHitLevelFactor).ToString(Formats.FirstHitLevelVoltage) + "mV)"; + else + FirstHitLevelDownPath1 = "---"; + + if (l_GetFirstLevelDownPath2.Text != "---") + FirstHitLevelDownPath2 = l_GetFirstLevelDownPath2.Text + " (" + (Convert.ToDouble(l_GetFirstLevelUpPath2.Text) * Constants.FirstHitLevelFactor).ToString(Formats.FirstHitLevelVoltage) + "mV)"; + else + FirstHitLevelDownPath2 = "---"; + + if (l_Gp30GetNumberOfPulses.Text != "---") + NumberOfBursts = l_Gp30GetNumberOfPulses.Text; + else + NumberOfBursts = "---"; + + if (l_Gp30GetStartHit.Text != "---") + StartHit = l_Gp30GetStartHit.Text; + else + StartHit = "---"; + + if (l_Gp30GetAmplitude.Text != "---") + AmplitudePeak = l_Gp30GetAmplitude.Text; + else + AmplitudePeak = "---"; + + if (l_Gp30GetSamplerate.Text != "---") + Samplerate = l_Gp30GetSamplerate.Text; + else + Samplerate = "---"; + + + + Section Gp30Settings = Report.AddSection(); + + Paragraph paragraph = Gp30Settings.AddParagraph("GP30 Settings"); + paragraph.Style = "Heading1"; + paragraph.Format.SpaceAfter = 50; + paragraph.AddBookmark("GP30 Settings"); + + Table TableGp30Settings = new Table(); + + TableGp30Settings.Borders.Width = 0.75; + TableGp30Settings.Format.Alignment = ParagraphAlignment.Center; + Column Parameter = TableGp30Settings.AddColumn(Unit.FromCentimeter(6)); + Column Value = TableGp30Settings.AddColumn(Unit.FromCentimeter(6)); + + Row row = TableGp30Settings.AddRow(); + row.Format.Font.Bold = true; + Cell cell = row.Cells[0]; + cell.AddParagraph("Parameter"); + cell = row.Cells[1]; + cell.AddParagraph("Value"); + + + row = TableGp30Settings.AddRow(); + cell = row.Cells[0]; + cell.AddParagraph("First Hit level up PATH0"); + cell = row.Cells[1]; + cell.AddParagraph(FirstHitLevelUpPath0); + + row = TableGp30Settings.AddRow(); + cell = row.Cells[0]; + cell.AddParagraph("First Hit level up PATH1"); + cell = row.Cells[1]; + cell.AddParagraph(FirstHitLevelUpPath1); + + row = TableGp30Settings.AddRow(); + cell = row.Cells[0]; + cell.AddParagraph("First Hit level up PATH2"); + cell = row.Cells[1]; + cell.AddParagraph(FirstHitLevelUpPath2); + + row = TableGp30Settings.AddRow(); + cell = row.Cells[0]; + cell.AddParagraph("First Hit level down PATH0"); + cell = row.Cells[1]; + cell.AddParagraph(FirstHitLevelDownPath0); + + row = TableGp30Settings.AddRow(); + cell = row.Cells[0]; + cell.AddParagraph("First Hit level down PATH1"); + cell = row.Cells[1]; + cell.AddParagraph(FirstHitLevelDownPath1); + + row = TableGp30Settings.AddRow(); + cell = row.Cells[0]; + cell.AddParagraph("First Hit level down PATH2"); + cell = row.Cells[1]; + cell.AddParagraph(FirstHitLevelDownPath2); + + row = TableGp30Settings.AddRow(); + cell = row.Cells[0]; + cell.AddParagraph("Number of bursts"); + cell = row.Cells[1]; + cell.AddParagraph(NumberOfBursts); + + row = TableGp30Settings.AddRow(); + cell = row.Cells[0]; + cell.AddParagraph("Starthit"); + cell = row.Cells[1]; + cell.AddParagraph(StartHit); + + row = TableGp30Settings.AddRow(); + cell = row.Cells[0]; + cell.AddParagraph("Amplitude Peak Detect"); + cell = row.Cells[1]; + cell.AddParagraph(AmplitudePeak); + + row = TableGp30Settings.AddRow(); + cell = row.Cells[0]; + cell.AddParagraph("Samplerate"); + cell = row.Cells[1]; + cell.AddParagraph(Samplerate); + Report.LastSection.Add(TableGp30Settings); + }*/ + + /* + private void MigraDocGp30Settings(Document Report) + { + + string FirstHitLevelUpPath0 = string.Empty; + string FirstHitLevelUpPath1 = string.Empty; + string FirstHitLevelUpPath2 = string.Empty; + string FirstHitLevelDownPath0 = string.Empty; + string FirstHitLevelDownPath1 = string.Empty; + string FirstHitLevelDownPath2 = string.Empty; + string NumberOfBursts = string.Empty; + string StartHit = string.Empty; + string AmplitudePeak = string.Empty; + string Samplerate = string.Empty; + + + if (l_GetFirstLevelUpPath0Meter1.Text != "---") + FirstHitLevelUpPath0 = l_GetFirstLevelUpPath0Meter1.Text + " (" + (Convert.ToDouble(l_GetFirstLevelUpPath0Meter1.Text) * Constants.FirstHitLevelFactor).ToString(Formats.FirstHitLevelVoltage) + "mV)"; + else + FirstHitLevelUpPath0 = "---"; + + if (l_GetFirstLevelUpPath1Meter1.Text != "---") + FirstHitLevelUpPath1 = l_GetFirstLevelUpPath1Meter1.Text + " (" + (Convert.ToDouble(l_GetFirstLevelUpPath1Meter1.Text) * Constants.FirstHitLevelFactor).ToString(Formats.FirstHitLevelVoltage) + "mV)"; + else + FirstHitLevelUpPath1 = "---"; + + if (l_GetFirstLevelUpPath2Meter1.Text != "---") + FirstHitLevelUpPath2 = l_GetFirstLevelUpPath2Meter1.Text + " (" + (Convert.ToDouble(l_GetFirstLevelUpPath2Meter1.Text) * Constants.FirstHitLevelFactor).ToString(Formats.FirstHitLevelVoltage) + "mV)"; + else + FirstHitLevelUpPath2 = "---"; + + if (l_GetFirstLevelDownPath0Meter1.Text != "---") + FirstHitLevelDownPath0 = l_GetFirstLevelDownPath0Meter1.Text + " (" + (Convert.ToDouble(l_GetFirstLevelUpPath0Meter1.Text) * Constants.FirstHitLevelFactor).ToString(Formats.FirstHitLevelVoltage) + "mV)"; + else + FirstHitLevelDownPath0 = "---"; + + if (l_GetFirstLevelDownPath1Meter1.Text != "---") + FirstHitLevelDownPath1 = l_GetFirstLevelDownPath1Meter1.Text + " (" + (Convert.ToDouble(l_GetFirstLevelUpPath1Meter1.Text) * Constants.FirstHitLevelFactor).ToString(Formats.FirstHitLevelVoltage) + "mV)"; + else + FirstHitLevelDownPath1 = "---"; + + if (l_GetFirstLevelDownPath2Meter1.Text != "---") + FirstHitLevelDownPath2 = l_GetFirstLevelDownPath2Meter1.Text + " (" + (Convert.ToDouble(l_GetFirstLevelUpPath2Meter1.Text) * Constants.FirstHitLevelFactor).ToString(Formats.FirstHitLevelVoltage) + "mV)"; + else + FirstHitLevelDownPath2 = "---"; + + if (l_Gp30GetNumberOfPulsesMeter1.Text != "---") + NumberOfBursts = l_Gp30GetNumberOfPulsesMeter1.Text; + else + NumberOfBursts = "---"; + + if (l_Gp30GetStartHitMeter1.Text != "---") + StartHit = l_Gp30GetStartHitMeter1.Text; + else + StartHit = "---"; + + if (l_Gp30GetAmplitudeMeter1.Text != "---") + AmplitudePeak = l_Gp30GetAmplitudeMeter1.Text; + else + AmplitudePeak = "---"; + + if (l_Gp30GetSamplerateMeter1.Text != "---") + Samplerate = l_Gp30GetSamplerateMeter1.Text; + else + Samplerate = "---"; + + + + Section Settings = Report.AddSection(); + + Paragraph paragraph = Settings.AddParagraph("Settings"); + paragraph.Style = "Heading1"; + paragraph.Format.SpaceAfter = 50; + paragraph.AddBookmark("Settings"); + + Table TableSettings = new Table(); + + TableSettings.Borders.Width = 0.75; + TableSettings.Format.Alignment = ParagraphAlignment.Center; + Column Parameter = TableSettings.AddColumn(Unit.FromCentimeter(6)); + Column Value = TableSettings.AddColumn(Unit.FromCentimeter(6)); + + Row row = TableSettings.AddRow(); + row.Format.Font.Bold = true; + Cell cell = row.Cells[0]; + cell.AddParagraph("Parameter"); + cell = row.Cells[1]; + cell.AddParagraph("Value"); + + + row = TableSettings.AddRow(); + cell = row.Cells[0]; + cell.AddParagraph("First Hit level up PATH1"); + cell = row.Cells[1]; + cell.AddParagraph(FirstHitLevelUpPath0); + + row = TableSettings.AddRow(); + cell = row.Cells[0]; + cell.AddParagraph("First Hit level up PATH2"); + cell = row.Cells[1]; + cell.AddParagraph(FirstHitLevelUpPath1); + + row = TableSettings.AddRow(); + cell = row.Cells[0]; + cell.AddParagraph("First Hit level up PATH3"); + cell = row.Cells[1]; + cell.AddParagraph(FirstHitLevelUpPath2); + + row = TableSettings.AddRow(); + cell = row.Cells[0]; + cell.AddParagraph("First Hit level down PATH1"); + cell = row.Cells[1]; + cell.AddParagraph(FirstHitLevelDownPath0); + + row = TableSettings.AddRow(); + cell = row.Cells[0]; + cell.AddParagraph("First Hit level down PATH2"); + cell = row.Cells[1]; + cell.AddParagraph(FirstHitLevelDownPath1); + + row = TableSettings.AddRow(); + cell = row.Cells[0]; + cell.AddParagraph("First Hit level down PATH3"); + cell = row.Cells[1]; + cell.AddParagraph(FirstHitLevelDownPath2); + + row = TableSettings.AddRow(); + cell = row.Cells[0]; + cell.AddParagraph("Number of bursts"); + cell = row.Cells[1]; + cell.AddParagraph(NumberOfBursts); + + row = TableSettings.AddRow(); + cell = row.Cells[0]; + cell.AddParagraph("Starthit"); + cell = row.Cells[1]; + cell.AddParagraph(StartHit); + + row = TableSettings.AddRow(); + cell = row.Cells[0]; + cell.AddParagraph("Amplitude Peak Detect"); + cell = row.Cells[1]; + cell.AddParagraph(AmplitudePeak); + + row = TableSettings.AddRow(); + cell = row.Cells[0]; + cell.AddParagraph("Samplerate"); + cell = row.Cells[1]; + cell.AddParagraph(Samplerate); + Report.LastSection.Add(TableSettings); + + } + */ + /* + private void GenerateMigraDoc() + { + Document Report = new Document(); + DefineStyles(Report); + MigraDocTitlepage(Report); + DefineTableOfContents(Report); + //DefineContentSection(Report); + MigraDocGp30Settings(Report); + + + PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer(false, PdfFontEmbedding.Always); + pdfRenderer.Document = Report; + pdfRenderer.RenderDocument(); + + string filename = "Hello World.pdf"; + pdfRenderer.PdfDocument.Save(filename); + Process.Start(filename); + }*/ + /* + public static Document CreateDocument() + { + // Create a new MigraDoc document + Document document = new Document(); + document.Info.Title = "Hello, MigraDoc"; + document.Info.Subject = "Demonstrates an excerpt of the capabilities of MigraDoc."; + document.Info.Author = "Stefan Lange"; + + Styles.DefineStyles(document); + + Cover.DefineCover(document); + TableOfContents.DefineTableOfContents(document); + + DefineContentSection(document); + + Paragraphs.DefineParagraphs(document); + Tables.DefineTables(document); + Charts.DefineCharts(document); + + return document; + }*/ + private void GenerateWordReport() + { + /* + #region Parameter query check + if (cB_ReportGP30Settings.Checked) + { + if ((l_GetFirstLevelUpPath0Meter1.Text.Contains("-")) || (l_GetFirstLevelUpPath1Meter1.Text.Contains("-")) || (l_GetFirstLevelUpPath2Meter1.Text.Contains("-")) || + (l_GetFirstLevelDownPath0Meter1.Text.Contains("-")) || (l_GetFirstLevelDownPath1Meter1.Text.Contains("-")) || (l_GetFirstLevelDownPath2Meter1.Text.Contains("-")) || + (l_Gp30GetAmplitudeMeter1.Text.Contains("-")) || (l_Gp30GetNumberOfPulsesMeter1.Text.Contains("-")) || (l_Gp30GetStartHitMeter1.Text.Contains("-"))) + { + MessageBox.Show("Perform parameter readout or deselect\n 'Include GP30 settings'-option", "Form closing", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } + #endregion + #region Declarations + string FilenameWord = rTB_ReportEnterDate.Text.Replace("-", string.Empty); + string Fullpath = string.Empty; + #region GP30-settings + #region PATH0 up + string TextGp30Settings = string.Empty; + if (l_GetFirstLevelUpPath0Meter1.Text != "---") + TextGp30Settings = TextGp30Settings + "First Hit level up PATH0: " + l_GetFirstLevelUpPath0Meter1.Text + " (" + (Convert.ToDouble(l_GetFirstLevelUpPath0Meter1.Text) * Constants.FirstHitLevelFactor).ToString(Formats.FirstHitLevelVoltage, CultureInfo.InvariantCulture) + "mV)\n"; + else + TextGp30Settings = TextGp30Settings + "First Hit level up PATH0: ---\n"; + #endregion + #region PATH1 up + if (l_GetFirstLevelUpPath1Meter1.Text != "---") + TextGp30Settings = TextGp30Settings + "First Hit level up PATH1: " + l_GetFirstLevelUpPath1Meter1.Text + " (" + (Convert.ToDouble(l_GetFirstLevelUpPath1Meter1.Text) * Constants.FirstHitLevelFactor).ToString(Formats.FirstHitLevelVoltage, CultureInfo.InvariantCulture) + "mV)\n"; + else + TextGp30Settings = TextGp30Settings + "First Hit level up PATH1: ---\n"; + #endregion + #region PATH2 up + if (l_GetFirstLevelUpPath2Meter1.Text != "---") + TextGp30Settings = TextGp30Settings + "First Hit level up PATH2: " + l_GetFirstLevelUpPath2Meter1.Text + " (" + (Convert.ToDouble(l_GetFirstLevelUpPath2Meter1.Text) * Constants.FirstHitLevelFactor).ToString(Formats.FirstHitLevelVoltage, CultureInfo.InvariantCulture) + "mV)\n"; + else + TextGp30Settings = TextGp30Settings + "First Hit level up PATH2: ---\n"; + #endregion + #region PATH0 down + if (l_GetFirstLevelDownPath0Meter1.Text != "---") + TextGp30Settings = TextGp30Settings + "First Hit level down PATH0: " + l_GetFirstLevelDownPath0Meter1.Text + " (" + (Convert.ToDouble(l_GetFirstLevelDownPath0Meter1.Text) * Constants.FirstHitLevelFactor).ToString(Formats.FirstHitLevelVoltage, CultureInfo.InvariantCulture) + "mV)\n"; + else + TextGp30Settings = TextGp30Settings + "First Hit level down PATH0: ---\n"; + #endregion + #region PATH1 down + if (l_GetFirstLevelDownPath1Meter1.Text != "---") + TextGp30Settings = TextGp30Settings + "First Hit level down PATH1: " + l_GetFirstLevelDownPath1Meter1.Text + " (" + (Convert.ToDouble(l_GetFirstLevelDownPath1Meter1.Text) * Constants.FirstHitLevelFactor).ToString(Formats.FirstHitLevelVoltage, CultureInfo.InvariantCulture) + "mV)\n"; + else + TextGp30Settings = TextGp30Settings + "First Hit level down PATH1: ---\n"; + #endregion + #region PATH2 down + if (l_GetFirstLevelDownPath2Meter1.Text != "---") + TextGp30Settings = TextGp30Settings + "First Hit level down PATH2: " + l_GetFirstLevelDownPath2Meter1.Text + " (" + (Convert.ToDouble(l_GetFirstLevelDownPath2Meter1.Text) * Constants.FirstHitLevelFactor).ToString(Formats.FirstHitLevelVoltage, CultureInfo.InvariantCulture) + "mV)\n"; + else + TextGp30Settings = TextGp30Settings + "First Hit level down PATH2: ---\n"; + #endregion + #region Number of bursts + if (l_Gp30GetNumberOfPulsesMeter1.Text != "---") + TextGp30Settings = TextGp30Settings + "Number of bursts: " + l_Gp30GetNumberOfPulsesMeter1.Text + "\n"; + else + TextGp30Settings = TextGp30Settings + "Number of bursts: ---\n"; + #endregion + #region Start hit + if (l_Gp30GetStartHitMeter1.Text != "---") + TextGp30Settings = TextGp30Settings + "Starthit: " + l_Gp30GetStartHitMeter1.Text + "\n"; + else + TextGp30Settings = TextGp30Settings + "Starthit: ---\n"; + #endregion + #region Amplitude peak detect + if (l_Gp30GetAmplitudeMeter1.Text != "---") + TextGp30Settings = TextGp30Settings + "Amplitude peak detect: " + l_Gp30GetAmplitudeMeter1.Text + "\n"; + else + TextGp30Settings = TextGp30Settings + "Amplitude peak detect: ---\n"; + #endregion + #region Samplerate + if (l_Gp30GetSamplerateMeter1.Text != "---") + TextGp30Settings = TextGp30Settings + "Samplerate: " + l_Gp30GetSamplerateMeter1.Text + "\n"; + else + TextGp30Settings = TextGp30Settings + "Samplerate: ---\n"; + #endregion + #endregion + FilenameWord = FilenameWord + "_" + rTB_ReportEnterOperator.Text + "_" + rTB_ReportEnterTitle.Text + ".docx"; + #endregion + #region Initialisation + Microsoft.Office.Interop.Word.Application winword = new Microsoft.Office.Interop.Word.Application(); + //Set status for word application is to be visible or not. + winword.Visible = false; + //Create a missing variable for missing value + object missing = System.Reflection.Missing.Value; + //Create a new document + Microsoft.Office.Interop.Word.Document document = winword.Documents.Add(ref missing, ref missing, ref missing, ref missing); + #endregion + #region Header + foreach (Microsoft.Office.Interop.Word.Section section in document.Sections) + { + //Get the header range and add the header details. + Microsoft.Office.Interop.Word.Range headerRange = section.Headers[Microsoft.Office.Interop.Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range; + headerRange.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphRight; + string path = System.IO.Directory.GetCurrentDirectory() + "\\XylemLogoSmall.png"; + headerRange.InlineShapes.AddPicture(@path); + } + #endregion + #region Titlepage + Microsoft.Office.Interop.Word.Paragraph Titlepage = document.Paragraphs.Add(ref missing); + Titlepage.Range.Font.ColorIndex = Microsoft.Office.Interop.Word.WdColorIndex.wdBlack; + Titlepage.Range.Font.Name = "Arial"; + Titlepage.Range.Text = string.Empty; + Titlepage.Range.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphCenter; + Titlepage.Range.Font.Size = 20; + Titlepage.Range.Font.Bold = 1; + Titlepage.Range.Italic = 0; + Titlepage.Range.Text = "\n\n\n" + rTB_ReportEnterTitle.Text + "\n\n"; + Titlepage.Range.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphCenter; + Titlepage.Range.Font.Size = 14; + Titlepage.Range.Font.Bold = 1; + Titlepage.Range.Italic = 0; + Titlepage.Range.Text = rTB_ReportEnterDate.Text + "\n"; + Titlepage.Range.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphCenter; + Titlepage.Range.Font.Size = 12; + Titlepage.Range.Font.Bold = 1; + Titlepage.Range.Italic = 1; + Titlepage.Range.Text = "by\n"; + Titlepage.Range.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphCenter; + Titlepage.Range.Font.Size = 14; + Titlepage.Range.Font.Bold = 1; + Titlepage.Range.Italic = 0; + Titlepage.Range.Text = rTB_ReportEnterOperator.Text + "\n\n\n\n\n\n"; + Titlepage.Range.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphLeft; + Titlepage.Range.Font.Size = 10; + Titlepage.Range.Font.Bold = 0; + Titlepage.Range.Italic = 0; + Titlepage.Range.Text = rtB_ReportTitlepageIntro.Text; + Titlepage.Range.InsertParagraphAfter(); + Titlepage.Range.InsertBreak(); + #endregion + #region Page GP30 settings + if (cB_ReportGP30Settings.Checked) + { + Microsoft.Office.Interop.Word.Paragraph GP30Settings = document.Paragraphs.Add(ref missing); + GP30Settings.Range.PageSetup.LeftMargin = (double)45; + GP30Settings.Range.Font.ColorIndex = Microsoft.Office.Interop.Word.WdColorIndex.wdBlack; + GP30Settings.Range.Font.Name = "Arial"; + GP30Settings.Range.PageSetup.LeftMargin = (double)60; + GP30Settings.Range.Text = string.Empty; + #region Headline1 + GP30Settings.Range.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphCenter; + GP30Settings.Range.Font.Size = 20; + GP30Settings.Range.Font.Bold = 1; + GP30Settings.Range.Italic = 0; + GP30Settings.Range.Text = "GP30-Settings\n"; + #endregion + #region Headline2 + GP30Settings.Range.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphLeft; + GP30Settings.Range.PageSetup.LeftMargin = (double)60; + GP30Settings.Range.Font.Size = 12; + GP30Settings.Range.Font.Bold = 1; + GP30Settings.Range.Italic = 1; + GP30Settings.Range.Text = "Values obtained from register readout\n\n"; + #endregion + #region Data + GP30Settings.Range.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphLeft; + GP30Settings.Range.ParagraphFormat.LineSpacing = 8; + GP30Settings.Range.Font.Size = 10; + GP30Settings.Range.Font.Bold = 0; + GP30Settings.Range.Italic = 0; + GP30Settings.Range.Text = TextGp30Settings; + #endregion + GP30Settings.Range.InsertBreak(); + } + #endregion + + + #region Save files + #region Save file dialog + SaveFileDialog saveFileDialog1 = new SaveFileDialog(); + // saveFileDialog1.Filter = "DOCX (*.docx)|*.docx"; + saveFileDialog1.Filter = "DOCX (*.docx)|*.docx"; + saveFileDialog1.FilterIndex = 2; + saveFileDialog1.RestoreDirectory = true; + saveFileDialog1.FileName = FilenameWord; + #endregion + #region Save to file + if (saveFileDialog1.ShowDialog() == DialogResult.OK) + { + SaveDataPathWord = System.IO.Path.GetFullPath(saveFileDialog1.FileName); + Fullpath = SaveDataPathWord; + + object filename = Fullpath; + document.SaveAs2(ref filename); + document.Close(ref missing, ref missing, ref missing); + document = null; + winword.Quit(ref missing, ref missing, ref missing); + winword = null; + MessageBox.Show("Document created successfully !"); + + } + #endregion + #endregion + + */ + + } + } +} \ No newline at end of file diff --git a/ZeroFlowTool/GP30.cs b/ZeroFlowTool/GP30.cs new file mode 100644 index 00000000..0647e24e --- /dev/null +++ b/ZeroFlowTool/GP30.cs @@ -0,0 +1,1730 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Globalization; +using System.Windows.Forms; +using System.IO.Ports; +using static GenesisZeroFlow.GenesisZeroFlow; + +namespace GenesisZeroFlow +{ + public class CmdInterface + { + CultureInfo Culture { get; set; } + public Byte Gp30LastByte { get; set; } + private Byte[] GP30LastRegister { get; set; } + public void SetGP30LastRegister(Byte[] data) + { + GP30LastRegister = data; + } + private Byte GP30LastPayloadLsb { get; set; } + public Byte GP30LastCommand { get; set; } + private Byte GP30RXPayload { get; set; } + private Boolean GP30RequestStarted { get; set; } + private Boolean GP30RequestFailed { get; set; } + private Boolean GP30RequestGotAnswer { get; set; } + private Byte Privilege { get; set; } + private Byte FirstHitLevelUpPath0 { get; set; } + private Byte FirstHitLevelUpPath1 { get; set; } + private Byte FirstHitLevelUpPath2 { get; set; } + private Byte FirstHitLevelDownPath0 { get; set; } + private Byte FirstHitLevelDownPath1 { get; set; } + private Byte FirstHitLevelDownPath2 { get; set; } + private Byte PercentPath0 { get; set; } + private Byte PercentPath1 { get; set; } + private Byte PercentPath2 { get; set; } + private SerialPort Port { get; set; } + public Byte Subreason { get; set; } + private Byte Starthit { get; set; } + private Byte StoreCalibration { get; set; } + private Byte Amplitude { get; set; } + private Byte Samplerate { get; set; } + private UInt16 CalibrationFactorPath0 { get; set; } + private UInt16 CalibrationFactorPath1 { get; set; } + private UInt16 CalibrationFactorPath2 { get; set; } + private Int32 ZeroOffsetPath0 { get; set; } + private Int32 ZeroOffsetPath1 { get; set; } + private Int32 ZeroOffsetPath2 { get; set; } + private Byte LedMode { get; set; } + private Byte UpdatePeriode { get; set; } + private Byte FirstHitShift { get; set; } + private UInt32 ToFTempCalibrate { get; set; } + private Int32 ToFTempOffsetPath0 { get; set; } + private Int32 ToFTempOffsetPath1 { get; set; } + private Int32 ToFTempOffsetPath2 { get; set; } + public UInt16 MeterNumber { get; set; } + public String MeterIndex { get; set; } + public String MeterType { get; private set; } + private Byte MeterSize { get; set; } + public void Initialize(String meterType, UInt16 meterNumber, CultureInfo culture) + { + this.GP30LastRegister = new Byte[2] { 0, 0 }; + this.GP30LastPayloadLsb = 0; + this.GP30LastCommand = 0; + this.GP30RXPayload = 0; + this.GP30RequestStarted = false; + this.GP30RequestFailed = false; + this.GP30RequestGotAnswer = false; + this.FirstHitLevelUpPath0 = 0; + this.FirstHitLevelUpPath1 = 0; + this.FirstHitLevelUpPath2 = 0; + this.FirstHitLevelDownPath0 = 0; + this.FirstHitLevelDownPath1 = 0; + this.FirstHitLevelDownPath2 = 0; + this.Starthit = 0; + this.Amplitude = 0; + this.Samplerate = 0; + this.CalibrationFactorPath0 = 0; + this.CalibrationFactorPath1 = 0; + this.CalibrationFactorPath2 = 0; + this.ZeroOffsetPath0 = 0; + this.ZeroOffsetPath1 = 0; + this.ZeroOffsetPath2 = 0; + this.LedMode = 0; + this.MeterNumber = meterNumber; + this.MeterIndex = (meterNumber + 1).ToString(culture); + this.Culture = culture; + this.Gp30LastByte = 0; + this.MeterType = meterType; + + + } + public void IndicatorsFailed() + { + Boolean temp = this.GP30RequestStarted; + + if (temp) + { + this.GP30RequestGotAnswer = true; + this.GP30RequestFailed = true; + this.GP30RequestStarted = false; + } + } + public void IndicatorsReset() + { + Boolean temp = this.GP30RequestStarted; + + if (temp) + { + this.GP30RequestGotAnswer = false; + this.GP30RequestFailed = false; + this.GP30RequestStarted = false; + } + } + public void IndicatorsOk() + { + Boolean temp = this.GP30RequestStarted; + + if (temp) + { + this.GP30RequestGotAnswer = true; + this.GP30RequestFailed = false; + this.GP30RequestStarted = false; + } + } + public Int32 RXProcessor(UInt16 requestType) + { + + #region Definitions and initializations + UInt16 Timeoutcounter = 0; + Int32 ErrCode = GP30LowLevelErrors.NoError; + #endregion + #region Set flags + this.GP30RequestStarted = true; + this.GP30RequestFailed = false; + this.GP30RequestGotAnswer = false; + #endregion + + try + { + #region Timeout + while (!this.GP30RequestGotAnswer) + { + Misc.WaitNSeconds(1); + Timeoutcounter++; + if (Timeoutcounter >= GP30Parameters.Timeout) + { + // Reset flags + this.IndicatorsReset(); + return GP30LowLevelErrors.Timeout; // timeout occured + } + } + #endregion + #region Failure message + ErrCode = GP30LowLevelErrors.NoError; // default + if (this.GP30RequestFailed) + { + + switch (requestType) + { + case GP30RequestType.WriteRegister: + ErrCode = GP30LowLevelErrors.SerialPortWriteFailure; + break; + case GP30RequestType.ReadRegister: + ErrCode = GP30LowLevelErrors.SerialPortReadFailure; + break; + case GP30RequestType.MultipleWrite: + ErrCode = GP30LowLevelErrors.SerialPortWriteFailure; + break; + case GP30RequestType.QueryCaps: + ErrCode = GP30LowLevelErrors.SerialPortReadFailure; + break; + default: + ErrCode = GP30LowLevelErrors.Unknown; + break; + + } + } + #endregion + #region Reset flags + this.IndicatorsReset(); + #endregion + } + catch (Exception ex) + { + ErrorLog.Log(LogErrReason.Exeption, "CmdInterface.RxProcessor() failed", $"0x{ex.HResult.ToString("X", this.Culture)}", String.Empty, this.Culture); + } + #region Return error code + return ErrCode; + #endregion + } + public Int32 MultipleWriteRegister(Byte[] gp30Register, Byte[] gp30Data, Boolean double0x5B) + { + #region To avoid warning + if ((gp30Register == null)||(gp30Data == null)) + return GP30LowLevelErrors.Unknown; + #endregion + #region Definitions and initializations + Int16 ErrCode = GP30LowLevelErrors.NoError; + Byte FirstLevelLengthMsb = 0x00; + Byte FirstLevelCrcLsb = 0x00; + Byte FirstLevelCrcMsb = 0x00; + Byte PasswordNumberOfWritesLsb = 0x00; + Byte PasswordNumberOfWritesMsb = 0x00; + Byte ZeroPadding = 0; + UInt16 FirstLevelCrcResult = 0; + #endregion + #region Lengthcheck + if (gp30Data.Length > Constants.Gp30WriteMultipleMaxLength) + { + ErrCode = GP30LowLevelErrors.MaxDataLength; + return ErrCode; + } + #endregion + #region Prepare and send data + try + { + #region Prepare data + #region Number of writes + PasswordNumberOfWritesLsb = (Byte)((Int32)gp30Data.Length / 4); + if ((gp30Data.Length % 4) != 0) + PasswordNumberOfWritesLsb++; + #endregion + #region Zero padding (Get number of required zeros) + if (((Int32)gp30Data.Length % 4) != 0) + ZeroPadding = (Byte)(4 - ((Int32)gp30Data.Length % 4)); + else + ZeroPadding = 0; + #endregion + #region Prepare CRC input sequences + Byte[] FirstLevelByteCrcInput = new Byte[10 + gp30Data.Length + ZeroPadding]; + Byte[] FirstLevelByteTx = new Byte[FirstLevelByteCrcInput.Length + 1]; + Byte FirstLevelLengthLsb = (Byte)(FirstLevelByteTx.Length - 1); + Byte[] Header = new Byte[10] { FirstLevelLengthLsb, FirstLevelLengthMsb, GP30Commands.MultipleWritedata, GP30Commands.Nop, FirstLevelCrcLsb, FirstLevelCrcMsb, gp30Register[1], gp30Register[0], PasswordNumberOfWritesLsb, PasswordNumberOfWritesMsb }; + Buffer.BlockCopy(Header, 0, FirstLevelByteCrcInput, 0, Header.Length); + Buffer.BlockCopy(gp30Data, 0, FirstLevelByteCrcInput, Header.Length, gp30Data.Length); + if (ZeroPadding > 0) + { + for (Int32 i = 0; i < ZeroPadding; i++) + FirstLevelByteCrcInput[10 + gp30Data.Length + i] = 0; + } + FirstLevelByteTx[0] = GP30Commands.Startbyte; + Buffer.BlockCopy(FirstLevelByteCrcInput, 0, FirstLevelByteTx, 1, FirstLevelByteCrcInput.Length); + #endregion + #endregion + #region Calculate CRCs + Crc16Ccitt crc = new Crc16Ccitt(InitialCrcValue.Nonzero1); + FirstLevelCrcResult = crc.ComputeChecksum(FirstLevelByteCrcInput); + FirstLevelCrcMsb = (Byte)(FirstLevelCrcResult >> 8); + FirstLevelCrcLsb = (Byte)(FirstLevelCrcResult & 0xFF); + FirstLevelByteTx[GP30BytePosition.CrcLsb] = FirstLevelCrcLsb; + FirstLevelByteTx[GP30BytePosition.CrcMsb] = FirstLevelCrcMsb; + #endregion + #region Send data + if (Port.IsOpen) + { + Int32 TotalLength = 0; + #region Double 0x5B + if (double0x5B) + TotalLength = this.Double0x5BGetLength(FirstLevelByteTx); + else + TotalLength = FirstLevelByteTx.Count(); + + Byte[] FinalByteTx = new Byte[TotalLength]; + + if (double0x5B) + FinalByteTx = Double0x5B(FirstLevelByteTx); + else + FinalByteTx = FirstLevelByteTx; + #endregion + #region Send data + Port.Write(FinalByteTx, 0, FinalByteTx.Length); + #endregion + #region Command memory + this.GP30LastCommand = GP30Commands.MultipleWritedata; + #endregion + } + else + { + #region Error: serial port not open + ErrCode = GP30LowLevelErrors.SerialPortClosed; + #endregion + } + #endregion + } + catch (Exception ex) + { + #region Error: write to serial port failed + ErrorLog.Log(LogErrReason.Exeption, "CmdInterface.MultipleWriteRegister() failed", "0x" + ex.HResult.ToString("X", this.Culture), String.Empty, this.Culture); + ErrCode = GP30LowLevelErrors.SerialPortWriteFailure; + #endregion + } + #endregion + #region Return error code + return ErrCode; + #endregion + } + public Int32 WriteRegister(Byte[] gp30Register, Byte[] gp30Data, Boolean double0x5B) + { + #region Definitions and initializations + Int32 ErrCode = GP30LowLevelErrors.NoError; + #endregion + #region To avoid warning CA1061 + if ((Port == null) || (gp30Register == null)||(gp30Data == null)) + return GP30LowLevelErrors.Unknown; + #endregion + if (gp30Data.Length == 4) + { + #region Definitions and initializations + Byte[] FirstLevelByteTx = new Byte[9 + gp30Data.Length]; + Byte FirstLevelLengthLsb = (Byte)(FirstLevelByteTx.Length - 1); + Byte FirstLevelLengthMsb = 0x00; + Byte FirstLevelCrcLsb = 0x00; + Byte FirstLevelCrcMsb = 0x00; + UInt16 FirstLevelCrcResult = 0; + #endregion + #region Prepare data + try + { + #region Fill buffer + Byte[] FirstLevelByteCrcInput = new Byte[8 + gp30Data.Length]; + Byte[] Header = new Byte[8] { FirstLevelLengthLsb, FirstLevelLengthMsb, GP30Commands.WriteData, GP30Commands.Nop, FirstLevelCrcLsb, FirstLevelCrcMsb, gp30Register[1], gp30Register[0] }; + Buffer.BlockCopy(Header, 0, FirstLevelByteCrcInput, 0, Header.Length); + Buffer.BlockCopy(gp30Data, 0, FirstLevelByteCrcInput, Header.Length, gp30Data.Length); + FirstLevelByteTx[0] = GP30Commands.Startbyte; + Buffer.BlockCopy(FirstLevelByteCrcInput, 0, FirstLevelByteTx, 1, FirstLevelByteCrcInput.Length); + #endregion + #region Calculate CRCs (CCITT) + Crc16Ccitt crc = new Crc16Ccitt(InitialCrcValue.Nonzero1); + + FirstLevelCrcResult = (UInt16)crc.ComputeChecksum(FirstLevelByteCrcInput); + FirstLevelCrcMsb = (Byte)(FirstLevelCrcResult >> 8); + FirstLevelCrcLsb = (Byte)(FirstLevelCrcResult & 0xFF); + FirstLevelByteTx[GP30BytePosition.CrcLsb] = FirstLevelCrcLsb; + FirstLevelByteTx[GP30BytePosition.CrcMsb] = FirstLevelCrcMsb; + #endregion + } + catch (Exception ex) + { + #region Error: CRC calculation + ErrorLog.Log(LogErrReason.Exeption, "CmdInterface.WriteRegister()/'Prepare data' failed", $"0x{ex.HResult.ToString("X", this.Culture)}", $"{String.Empty}\n", this.Culture); + ErrCode = GP30LowLevelErrors.CrcCalcError; + return ErrCode; + #endregion + } + #endregion + #region Send data + try + { + if (Port.IsOpen) + { + Int32 TotalLength = 0; + #region Double 0x5B + if (double0x5B) + TotalLength = Double0x5BGetLength(FirstLevelByteTx); + else + TotalLength = FirstLevelByteTx.Count(); + + Byte[] FinalByteTx = new Byte[TotalLength]; + + if (double0x5B) + FinalByteTx = Double0x5B(FirstLevelByteTx); + else + FinalByteTx = FirstLevelByteTx; + + + #endregion + #region Command memory + this.GP30LastCommand = GP30Commands.WriteData; + this.GP30LastPayloadLsb = gp30Data[0]; + this.GP30LastRegister = gp30Register; + #endregion + #region Send data + Port.Write(FinalByteTx, 0, FinalByteTx.Length); + #endregion + } + else + { + #region Error: serial port closed + ErrCode = GP30LowLevelErrors.SerialPortClosed; + #endregion + } + } + catch (Exception ex) + { + #region Error: write to serial port failed + ErrorLog.Log(LogErrReason.Exeption, "CmdInterface.WriteRegister()/'Send data' failed", $"0x{ex.HResult.ToString("X", this.Culture)}", String.Empty, this.Culture); + ErrCode = GP30LowLevelErrors.SerialPortWriteFailure; + #endregion + } + #endregion + } + else + { + #region Error: max. length + ErrCode = GP30LowLevelErrors.MaxDataLength; + #endregion + } + + return ErrCode; + + } + public Int32 ReadRegister(Byte[] register) + { + #region Definitions and initializations + Int16 ErrCode = GP30LowLevelErrors.NoError; + Byte[] FirstLevelByteTx = new Byte[13] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + Byte FirstLevelLengthLsb = (Byte)(FirstLevelByteTx.Length - 1); + Byte FirstLevelLengthMsb = 0x00; + Byte FirstLevelCrcLsb = 0x00; + Byte FirstLevelCrcMsb = 0x00; + UInt16 FirstLevelCrcResult = 0; + #endregion + #region CA1062 + if (register == null) + return GP30LowLevelErrors.Unknown; + #endregion + #region Prepare data + try + { + #region Fill buffer + Byte[] FirstLevelByteCrcInput = new Byte[12] { FirstLevelLengthLsb, FirstLevelLengthMsb, GP30Commands.ReadData, GP30Commands.Nop, FirstLevelCrcLsb, FirstLevelCrcMsb, register[1], register[0], 0, 0, 0, 0 }; + FirstLevelByteTx[0] = GP30Commands.Startbyte; + Buffer.BlockCopy(FirstLevelByteCrcInput, 0, FirstLevelByteTx, 1, FirstLevelByteCrcInput.Length); + #endregion + #region Calculate CRCs (CCITT) + Crc16Ccitt crc = new Crc16Ccitt(InitialCrcValue.Nonzero1); + + FirstLevelCrcResult = (UInt16)crc.ComputeChecksum(FirstLevelByteCrcInput); + FirstLevelCrcMsb = (Byte)(FirstLevelCrcResult >> 8); + FirstLevelCrcLsb = (Byte)(FirstLevelCrcResult & 0xFF); + FirstLevelByteTx[GP30BytePosition.CrcLsb] = FirstLevelCrcLsb; + FirstLevelByteTx[GP30BytePosition.CrcMsb] = FirstLevelCrcMsb; + #endregion + } + catch (Exception ex) + { + #region Error: CRC calculation + ErrorLog.Log(LogErrReason.Exeption, "CmdInterface.ReadRegister()/ 'CRC calc' failed", $"0x{ex.HResult.ToString("X", this.Culture)}", String.Empty, this.Culture); + ErrCode = GP30LowLevelErrors.CrcCalcError; + return ErrCode; + #endregion + } + #endregion + #region Send data + try + { + if (Port.IsOpen) + { + #region Command memory + this.GP30LastCommand = GP30Commands.ReadData; + this.GP30LastRegister = register; + #endregion + #region Send data + Port.Write(FirstLevelByteTx, 0, FirstLevelByteTx.Length); + #endregion + } + else + { + #region Error + ErrCode = GP30LowLevelErrors.SerialPortClosed; + #endregion + } + } + catch (Exception ex) + { + #region Error + ErrorLog.Log(LogErrReason.Exeption, "Gp30ReadRegister()/ 'Send data' failed", $"0x{ex.HResult.ToString("X", this.Culture)}", String.Empty, this.Culture); + ErrCode = GP30LowLevelErrors.SerialPortWriteFailure; + #endregion + } + #endregion + #region Return error code + return ErrCode; + #endregion + } + public String LowLevelMessages(Int32 failureCode, out Boolean ok) + { + String Message = String.Empty; + ok = false; + switch (failureCode) + { + case GP30LowLevelErrors.NoError: + Message = "Action successful"; + ok = true; + break; + case GP30LowLevelErrors.SerialPortClosed: + Message = "Serial Port is not open"; + break; + case GP30LowLevelErrors.SerialPortWriteFailure: + Message = "Write to serial port failed"; + break; + case GP30LowLevelErrors.SerialPortReadFailure: + Message = "Read from serial port failed"; + break; + case GP30LowLevelErrors.MaxDataLength: + Message = "Datalength error"; + break; + case GP30LowLevelErrors.Exception: + Message = "Internal exception"; + break; + case GP30LowLevelErrors.CrcCalcError: + Message = "CRC error"; + break; + case GP30LowLevelErrors.Unknown: + Message = "Unknown"; + break; + case GP30LowLevelErrors.Timeout: + Message = "Timeout"; + break; + default: + Message = "Unknown error code"; + break; + + } + + return Message; + } + public String ReplyCommand(List rxStringCommandChannel) + { + String Data = String.Empty; + + try + { + switch (rxStringCommandChannel.ElementAt(GP30BytePosition.Cmd)) + { + + case GP30Commands.ReadDataReply: + + Data = $"{Data}COMMAND CHANNEL:\t RX-Command 'READ_DATA_REPLY' at METER{this.MeterIndex}\n"; + break; + case GP30Commands.WriteDataReply: + Data = $"{Data}COMMAND CHANNEL:\t RX-Command 'WRITE_DATA_REPLY' at METER{this.MeterIndex}\n"; + break; + case GP30Commands.MultipleReaddataReply: + Data = $"{Data}COMMAND CHANNEL:\t RX-Command 'MULTIPLE_READ_DATA_REPLY' at METER{this.MeterIndex}\n"; + break; + case GP30Commands.MultipleWritedataReply: + Data = $"{Data}COMMAND CHANNEL:\t RX-Command 'MULTIPLE_WRITE_DATA_REPLY at METER{this.MeterIndex}\n"; + break; + case GP30Commands.SetLevelreply: + Data = $"{Data}COMMAND CHANNEL:\t RX-Command 'SET_LEVEL_REPLY' at METER{this.MeterIndex}\n"; + break; + case GP30Commands.QueryCapsReply: + #region Command + Data = $"COMMAND CHANNEL:\t RX-Command 'QUERY_CAPS_REPLY' at METER{this.MeterIndex}\n"; + #endregion + #region CRC + Data = $"{Data}CRC = 0x{rxStringCommandChannel.ElementAt(4).ToString("X", this.Culture)}{rxStringCommandChannel.ElementAt(5).ToString("X", this.Culture)}\n"; + #endregion + #region Bitrate + if ((Byte.Equals(rxStringCommandChannel.ElementAt(GP30BytePosition.CmdBitrateMsb), GP30Payload.GetBitrateMsb)) + && (Byte.Equals(rxStringCommandChannel.ElementAt(GP30BytePosition.CmdBitrateLsb), GP30Payload.GetBitrateLsb))) + { + Data = $"{Data}\nSupported Bitrates: \n"; + if ((rxStringCommandChannel.ElementAt(GP30BytePosition.BitrateLsb) & 0x01) != 0) + Data = $"{Data}300kbps "; + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.BitrateLsb) >> 1) & 0x01) != 0) + Data = $"{Data}1200kbps "; + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.BitrateLsb) >> 2) & 0x01) != 0) + Data = $"{Data}2400kbps "; + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.BitrateLsb) >> 3) & 0x01) != 0) + Data = $"{Data}4800kbps "; + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.BitrateLsb) >> 4) & 0x01) != 0) + Data = $"{Data}9600kbps "; + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.BitrateLsb) >> 5) & 0x01) != 0) + Data = $"{Data}19200kbps "; + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.BitrateLsb) >> 6) & 0x01) != 0) + Data = $"{Data}38400kbps "; + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.BitrateLsb) >> 7) & 0x01) != 0) + Data = $"{Data}57600kbps "; + if ((rxStringCommandChannel.ElementAt(GP30BytePosition.BitrateMsb) & 0x01) != 0) + Data = $"{Data}115200kbps "; + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.BitrateMsb) >> 1) & 0x01) != 0) + Data = $"{Data}230400kbps "; + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.BitrateMsb) >> 2) & 0x01) != 0) + Data = $"{Data}460800kbps "; + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.BitrateMsb) >> 3) & 0x01) != 0) + Data = $"{Data}921600kbps "; + } + #endregion + #region Packet size + if ((rxStringCommandChannel.ElementAt(GP30BytePosition.CmdPacketSizeMsb) == GP30Payload.GetPacketSizesMsb) + && (rxStringCommandChannel.ElementAt(GP30BytePosition.CmdPacketSizeLsb) == GP30Payload.GetPacketSizesLsb)) + { + Data = Data + "\nSupported Packet Sizes: \n"; + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.PacketSizeLsb) >> 5) & 0x01) != 0) + Data = $"{Data}16 "; + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.PacketSizeLsb) >> 6) & 0x01) != 0) + Data = $"{Data}64 "; + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.PacketSizeLsb) >> 7) & 0x01) != 0) + Data = $"{Data}[TBD] "; // Documentation scrappy + if ((rxStringCommandChannel.ElementAt(GP30BytePosition.PacketSizeMsb) & 0x01) != 0) + Data = $"{Data}[TBD] "; // Documentation scrappy + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.PacketSizeMsb) >> 1) & 0x01) != 0) + Data = $"{Data}[TBD] "; // Documentation scrappy + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.PacketSizeMsb) >> 2) & 0x01) != 0) + Data = $"{Data}[TBD] "; // Documentation scrappy + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.PacketSizeMsb) >> 3) & 0x01) != 0) + Data = $"{Data}[TBD] "; // Documentation scrappy + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.PacketSizeMsb) >> 4) & 0x01) != 0) + Data = $"{Data}[TBD] "; // Documentation scrappy + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.PacketSizeMsb) >> 5) & 0x01) != 0) + Data = $"{Data}[TBD] "; // Documentation scrappy + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.PacketSizeMsb) >> 6) & 0x01) != 0) + Data = $"{Data}[TBD] "; // Documentation scrappy + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.PacketSizeMsb) >> 7) & 0x01) != 0) + Data = $"{Data}32768 "; + } + #endregion + #region Protocol version + if ((rxStringCommandChannel.ElementAt(GP30BytePosition.CmdProtocolMsb) == GP30Payload.GetProtocolMsb) + && (rxStringCommandChannel.ElementAt(GP30BytePosition.CmdProtocolLsb) == GP30Payload.GetProtocolLsb)) + { + UInt16 ProtocolBeforeDecimal = (UInt16)((rxStringCommandChannel.ElementAt(GP30BytePosition.CmdProtocolMsb + 1) << 8) + (rxStringCommandChannel.ElementAt(GP30BytePosition.CmdProtocolMsb + 2))); + Double ProtocolAfterDecimal = ((Double)((rxStringCommandChannel.ElementAt(GP30BytePosition.CmdProtocolMsb + 3) << 8) + (rxStringCommandChannel.ElementAt(GP30BytePosition.CmdProtocolMsb + 4)))) / 65536; + Data = $"{Data}\nProtocol version: \n"; + Data = $"{Data}{ProtocolBeforeDecimal.ToString(this.Culture)}.{ProtocolAfterDecimal}"; + + } + #endregion + break; + case GP30Commands.SetCapsReply: + #region Command + Data = $"{Data}COMMAND CHANNEL:\t RX-Command 'SET_CAPS_REPLY' at {this.MeterType}{this.MeterIndex}\n"; + #endregion + #region CRC + Data = $"{Data}CRC = 0x{rxStringCommandChannel.ElementAt(4).ToString("X2", this.Culture)}{rxStringCommandChannel.ElementAt(5).ToString("X2", this.Culture)}\n"; + #endregion + #region Bitrate + if ((rxStringCommandChannel.ElementAt(GP30BytePosition.CmdBitrateMsb) == GP30Payload.GetBitrateMsb) + && (rxStringCommandChannel.ElementAt(GP30BytePosition.CmdBitrateLsb) == GP30Payload.GetBitrateLsb)) + { + Data = Data + "\nSupported Bitrates: \n"; + if ((rxStringCommandChannel.ElementAt(GP30BytePosition.BitrateLsb) & 0x01) != 0) + Data = Data + "300kbps "; + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.BitrateLsb) >> 1) & 0x01) != 0) + Data = Data + "1200kbps "; + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.BitrateLsb) >> 2) & 0x01) != 0) + Data = Data + "2400kbps "; + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.BitrateLsb) >> 3) & 0x01) != 0) + Data = Data + "4800kbps "; + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.BitrateLsb) >> 4) & 0x01) != 0) + Data = Data + "9600kbps "; + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.BitrateLsb) >> 5) & 0x01) != 0) + Data = Data + "19200kbps "; + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.BitrateLsb) >> 6) & 0x01) != 0) + Data = Data + "38400kbps "; + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.BitrateLsb) >> 7) & 0x01) != 0) + Data = Data + "57600kbps "; + if ((rxStringCommandChannel.ElementAt(GP30BytePosition.BitrateMsb) & 0x01) != 0) + Data = Data + "115200kbps "; + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.BitrateMsb) >> 1) & 0x01) != 0) + Data = Data + "230400kbps "; + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.BitrateMsb) >> 2) & 0x01) != 0) + Data = Data + "460800kbps "; + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.BitrateMsb) >> 3) & 0x01) != 0) + Data = Data + "921600kbps "; + } + #endregion + #region Packet size + if ((rxStringCommandChannel.ElementAt(GP30BytePosition.CmdPacketSizeMsb) == GP30Payload.GetPacketSizesMsb) + && (rxStringCommandChannel.ElementAt(GP30BytePosition.CmdPacketSizeLsb) == GP30Payload.GetPacketSizesLsb)) + { + Data = Data + "\nSupported Packet Sizes: \n"; + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.PacketSizeLsb) >> 5) & 0x01) != 0) + Data = Data + "16 "; + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.PacketSizeLsb) >> 6) & 0x01) != 0) + Data = Data + "64 "; + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.PacketSizeLsb) >> 7) & 0x01) != 0) + Data = Data + "[TBD] "; + if ((rxStringCommandChannel.ElementAt(GP30BytePosition.PacketSizeMsb) & 0x01) != 0) + Data = Data + "[TBD] "; + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.PacketSizeMsb) >> 1) & 0x01) != 0) + Data = Data + "[TBD] "; + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.PacketSizeMsb) >> 2) & 0x01) != 0) + Data = Data + "[TBD] "; + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.PacketSizeMsb) >> 3) & 0x01) != 0) + Data = Data + "[TBD] "; + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.PacketSizeMsb) >> 4) & 0x01) != 0) + Data = Data + "[TBD] "; + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.PacketSizeMsb) >> 5) & 0x01) != 0) + Data = Data + "[TBD] "; + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.PacketSizeMsb) >> 6) & 0x01) != 0) + Data = Data + "[TBD] "; + if (((rxStringCommandChannel.ElementAt(GP30BytePosition.PacketSizeMsb) >> 7) & 0x01) != 0) + Data = Data + "32768 "; + } + #endregion + #region Protocol version + if ((Byte.Equals(rxStringCommandChannel.ElementAt(GP30BytePosition.CmdProtocolMsb), GP30Payload.GetProtocolMsb)) + && (rxStringCommandChannel.ElementAt(GP30BytePosition.CmdProtocolLsb) == GP30Payload.GetProtocolLsb)) + { + UInt16 ProtocolBeforeDecimal = (UInt16)((rxStringCommandChannel.ElementAt(GP30BytePosition.CmdProtocolMsb + 1) << 8) + (rxStringCommandChannel.ElementAt(GP30BytePosition.CmdProtocolMsb + 2))); + Double ProtocolAfterDecimal = ((Double)((rxStringCommandChannel.ElementAt(GP30BytePosition.CmdProtocolMsb + 3) << 8) + (rxStringCommandChannel.ElementAt(GP30BytePosition.CmdProtocolMsb + 4)))) / 65536; + Data = $"{Data}\nProtocol version: \n"; + Data = $"{Data}{ProtocolBeforeDecimal.ToString(this.Culture)}.{ProtocolAfterDecimal}"; + } + #endregion + break; + case GP30Commands.TrainReply: + Data = $"{Data}COMMAND CHANNEL:\t RX-Command 'TRAIN_REPLY' at METER{this.MeterIndex}\n"; + break; + case GP30Commands.RepeatLastReply: + Data = $"{Data}COMMAND CHANNEL:\t RX-Command 'REPEAT_LAST_REPLY' at METER{this.MeterIndex}\n"; + break; + default: + Data = $"{Data}COMMAND CHANNEL:\t RX-Command unexpected command: 0x{rxStringCommandChannel.ElementAt(2).ToString("X2", this.Culture)} at METER{this.MeterIndex}\n"; + break; + } + } + catch (Exception ex) + { + ErrorLog.Log(LogErrReason.Exeption, $"CmdInterface{this.MeterIndex}.ReplyCommand() failed", $"0x{ex.HResult.ToString("X", this.Culture)}", String.Empty, this.Culture); + } + + return Data; + } + private String WriteDataResponse(List rxStringCommandChannel) + { + #region Definitions and initializations + String Message = String.Empty; + String Where = "Beginning"; + #endregion + + try + { + #region Percentage PATH0 + if (Enumerable.SequenceEqual(this.GP30LastRegister, GP30Registers.FirstHitLevelPercentagePath0())) + { + Where = "Percentage PATH0"; + this.PercentPath0 = rxStringCommandChannel.ElementAt(GP30BytePosition.Reply); + Message = $"COMMAND CHANNEL:\t Received response on write to 'Percentage'-register, PATH1 = {this.PercentPath0.ToString(this.Culture)} at METER{this.MeterIndex}\n"; + return Message; + } + #endregion + #region Percentage PATH1 + if (Enumerable.SequenceEqual(this.GP30LastRegister, GP30Registers.FirstHitLevelPercentagePath1())) + { + Where = "Percentage PATH1"; + this.PercentPath1 = rxStringCommandChannel.ElementAt(GP30BytePosition.Reply); + Message = $"COMMAND CHANNEL:\t Received response on write to 'Percentage'-register, PATH2 = {this.PercentPath1.ToString(this.Culture)} at METER{this.MeterIndex}\n"; + return Message; + } + #endregion + #region Percentage PATH2 + if (Enumerable.SequenceEqual(this.GP30LastRegister, GP30Registers.FirstHitLevelPercentagePath2())) + { + Where = "Percentage PATH2"; + this.PercentPath2 = rxStringCommandChannel.ElementAt(GP30BytePosition.Reply); + Message = $"COMMAND CHANNEL:\t Received response on write to 'Percentage'-register, PATH3 = {this.PercentPath2.ToString(this.Culture)} at METER{this.MeterIndex}\n"; + return Message; + } + #endregion + #region Privilege register + if (Enumerable.SequenceEqual(this.GP30LastRegister, GP30Registers.Privilege())) + { + Where = "Privilege"; + this.Privilege = rxStringCommandChannel.ElementAt(GP30BytePosition.Reply); + Message = $"COMMAND CHANNEL:\t Received response on write to 'Privilege'-register = {this.Privilege.ToString(this.Culture)} at METER{this.MeterIndex}\n"; + return Message; + } + #endregion + #region Starthit + if (Enumerable.SequenceEqual(this.GP30LastRegister, GP30Registers.StartHit())) + { + Where = "Starthit"; + this.Starthit = rxStringCommandChannel.ElementAt(GP30BytePosition.Reply); + Message = $"COMMAND CHANNEL:\t Received response on write to 'Starthit'-register = 0x{this.Starthit.ToString("X2", this.Culture)} at METER{this.MeterIndex}\n"; + return Message; + } + #endregion + #region Amplitude end detect + if (Enumerable.SequenceEqual(this.GP30LastRegister, GP30Registers.AmplitudePeakDetectEnd())) + { + Where = "Amplitude"; + this.Amplitude = rxStringCommandChannel.ElementAt(GP30BytePosition.Reply); + Message = $"COMMAND CHANNEL:\t Received response on write to 'Amplitude peak detect end'-register = 0x{this.Amplitude.ToString("X2", this.Culture)} at METER{this.MeterIndex}\n"; + return Message; + } + #endregion + #region Store calibration + if (Enumerable.SequenceEqual(this.GP30LastRegister, GP30Registers.StoreCalibration())) + { + Where = "Store calibration"; + this.StoreCalibration = rxStringCommandChannel.ElementAt(GP30BytePosition.Reply); + Message = $"COMMAND CHANNEL:\t Received response on write to 'Store calibration'-register = {this.StoreCalibration.ToString(this.Culture)} at METER{this.MeterIndex}\n"; + return Message; + } + #endregion + #region First hit update periode + if (Enumerable.SequenceEqual(this.GP30LastRegister, GP30Registers.FirstHitUpdatePeriod())) + { + Where = "First hit update periode"; + this.UpdatePeriode= rxStringCommandChannel.ElementAt(GP30BytePosition.Reply); + Message = $"COMMAND CHANNEL:\t Received response on write to 'Firsthit update period'-register = {UpdatePeriode.ToString(this.Culture)} at METER{this.MeterIndex}\n"; + return Message; + } + #endregion + #region First hit shift + if (Enumerable.SequenceEqual(this.GP30LastRegister, GP30Registers.FirstHitShift())) + { + Where = "First hit shift"; + this.FirstHitShift = rxStringCommandChannel.ElementAt(GP30BytePosition.Reply); + Message = $"COMMAND CHANNEL:\t Received response on write to 'Firsthit shift'-register = {this.FirstHitShift.ToString(this.Culture)} at METER{this.MeterIndex}\n"; + return Message; + } + #endregion + #region Calibration factor PATH0 + if (Enumerable.SequenceEqual(this.GP30LastRegister, GP30Registers.CalFactor1())) + { + Where = "Calibration factor PATH0"; + Byte[] TempArray = new Byte[2]; + TempArray = rxStringCommandChannel.GetRange(GP30BytePosition.Reply, 2).ToArray(); + TempArray.Reverse(); + this.CalibrationFactorPath0 = BitConverter.ToUInt16(TempArray, 0); + Message = $"COMMAND CHANNEL:\t Received response on write to 'Calibration factor1'-register = 0x{CalibrationFactorPath0.ToString("X4", this.Culture)} at METER{this.MeterIndex}\n"; + return Message; + } + #endregion + #region Calibration factor PATH1 + if (Enumerable.SequenceEqual(this.GP30LastRegister, GP30Registers.CalFactor2())) + { + Where = "Calibration factor PATH1"; + Byte[] TempArray = new Byte[2]; + TempArray = rxStringCommandChannel.GetRange(GP30BytePosition.Reply, 2).ToArray(); + TempArray.Reverse(); + this.CalibrationFactorPath1 = BitConverter.ToUInt16(TempArray, 0); + Message = $"COMMAND CHANNEL:\t Received response on write to 'Calibration factor2'-register = 0x{CalibrationFactorPath1.ToString("X4", this.Culture)} at METER{this.MeterIndex}\n"; + return Message; + } + #endregion + #region Calibration factor PATH2 + if (Enumerable.SequenceEqual(this.GP30LastRegister, GP30Registers.CalFactor3())) + { + Where = "Calibration factor PATH2"; + Byte[] TempArray = new Byte[2]; + TempArray = rxStringCommandChannel.GetRange(GP30BytePosition.Reply, 2).ToArray(); + TempArray.Reverse(); + this.CalibrationFactorPath2 = BitConverter.ToUInt16(TempArray, 0); + Message = $"COMMAND CHANNEL:\t Received response on write to 'Calibration factor3'-register = 0x{CalibrationFactorPath2.ToString("X4", this.Culture)} at METER{this.MeterIndex}\n"; + return Message; + } + #endregion + #region Zero offset PATH0 + if (Enumerable.SequenceEqual(this.GP30LastRegister, GP30Registers.ZeroOffset1())) + { + Where = "Zero offset PATH0"; + Byte[] TempArray = new Byte[4]; + TempArray = rxStringCommandChannel.GetRange(GP30BytePosition.Reply, 4).ToArray(); + TempArray.Reverse(); + this.ZeroOffsetPath0 = BitConverter.ToInt32(TempArray, 0); + Message = $"COMMAND CHANNEL:\t Received response on write to 'Zero offset1'-register = 0x{ZeroOffsetPath0.ToString("X8", this.Culture)} at METER{this.MeterIndex}\n"; + return Message; + } + #endregion + #region Zero offset PATH1 + if (Enumerable.SequenceEqual(this.GP30LastRegister, GP30Registers.ZeroOffset2())) + { + Where = "Zero offset PATH"; + Byte[] TempArray = new Byte[4]; + TempArray = rxStringCommandChannel.GetRange(GP30BytePosition.Reply, 4).ToArray(); + TempArray.Reverse(); + this.ZeroOffsetPath1 = BitConverter.ToInt32(TempArray, 0); + Message = $"COMMAND CHANNEL:\t Received response on write to 'Zero offset2'-register = 0x{ZeroOffsetPath1.ToString("X8", this.Culture)} at METER{this.MeterIndex}\n"; + return Message; + } + #endregion + #region Zero offset PATH2 + if (Enumerable.SequenceEqual(this.GP30LastRegister, GP30Registers.ZeroOffset3())) + { + Where = "Zero offset PATH2"; + Byte[] TempArray = new Byte[4]; + TempArray = rxStringCommandChannel.GetRange(GP30BytePosition.Reply, 4).ToArray(); + TempArray.Reverse(); + this.ZeroOffsetPath2 = BitConverter.ToInt32(TempArray, 0); + Message = $"COMMAND CHANNEL:\t Received response on write to 'Zero offset3'-register = 0x{this.ZeroOffsetPath2.ToString("X8", this.Culture)} at METER{this.MeterIndex}\n"; + return Message; + } + #endregion + #region Samplerate + if (Enumerable.SequenceEqual(this.GP30LastRegister, GP30Registers.Samplerate())) + { + Where = "Samplerate"; + this.Samplerate = rxStringCommandChannel.ElementAt(GP30BytePosition.Reply); + Message = $"COMMAND CHANNEL:\t Received response on write to 'Samplerate'-register = {this.Samplerate.ToString(this.Culture)} at METER{this.MeterIndex}\n"; + return Message; + } + #endregion + #region Metersize + if (Enumerable.SequenceEqual(this.GP30LastRegister, GP30Registers.MeterSize())) + { + Where = "Metersize"; + this.MeterSize = rxStringCommandChannel.ElementAt(GP30BytePosition.Reply); + Message = $"COMMAND CHANNEL:\t Received response on write to 'Metersize'-register = {this.MeterSize.ToString(this.Culture)} at METER{this.MeterIndex}\n"; + return Message; + } + #endregion + #region LED Mode + if (Enumerable.SequenceEqual(this.GP30LastRegister, GP30Registers.LedMode())) + { + Where = "LED Mode"; + this.LedMode = rxStringCommandChannel.ElementAt(GP30BytePosition.Reply); + Message = $"COMMAND CHANNEL:\t Received response on write to 'LED-Mode'-register = {LedMode.ToString(this.Culture)} at METER{this.MeterIndex}\n"; + return Message; + } + #endregion + #region ToFTempCalibrate + if (Enumerable.SequenceEqual(this.GP30LastRegister, GP30Registers.ToFTempCalibrate())) + { + Where = "ToFTempCalibrate"; + Byte[] TempArray = new Byte[4]; + TempArray = rxStringCommandChannel.GetRange(GP30BytePosition.Reply, 4).ToArray(); + TempArray.Reverse(); + this.ToFTempCalibrate = BitConverter.ToUInt32(TempArray, 0); + Message = $"COMMAND CHANNEL:\t Received response on write to 'ToFTempCalibrate'-register = 0x{ToFTempCalibrate.ToString("X8", this.Culture)} at METER{this.MeterIndex}\n"; + return Message; + } + #endregion + } + catch (Exception ex) + { + ErrorLog.Log(LogErrReason.Exeption, $"CmdInterface{this.MeterIndex}.WriteDataResponse() failed", $"0x{ex.HResult.ToString("X", this.Culture)}", Where, this.Culture); + } + + return Message; + } + private String ReadDataResponse(List rxStringCommandChannel) + { + #region Declarations and initializations + String Message = String.Empty; + String Where = "Beginning"; + #endregion + + try + { + #region Percentage PATH0 + if (Enumerable.SequenceEqual(GP30LastRegister, GP30Registers.FirstHitLevelPercentagePath0())) + { + Where = "Percentage PATH0"; + this.PercentPath0 = rxStringCommandChannel.ElementAt(GP30BytePosition.Reply); + Message = $"COMMAND CHANNEL:\t Received response on read 'Percentage1'-register = {this.PercentPath0.ToString(this.Culture)} at METER{this.MeterIndex}\n"; + GenesisZeroFlow._GenesisZeroFlow.SetFirstHitPercentage(this.MeterNumber, Constants.PATH0, this.PercentPath0); + return Message; + } + #endregion + #region Percentage PATH1 + if (Enumerable.SequenceEqual(GP30LastRegister, GP30Registers.FirstHitLevelPercentagePath1())) + { + Where = "Percentage PATH1"; + this.PercentPath1 = rxStringCommandChannel.ElementAt(GP30BytePosition.Reply); + Message = $"COMMAND CHANNEL:\t Received response on read 'Percentage2'-register = {this.PercentPath1.ToString(this.Culture)} at METER{this.MeterIndex}\n"; + GenesisZeroFlow._GenesisZeroFlow.SetFirstHitPercentage(this.MeterNumber, Constants.PATH1, this.PercentPath1); + return Message; + } + #endregion + #region Percentage PATH2 + if (Enumerable.SequenceEqual(GP30LastRegister, GP30Registers.FirstHitLevelPercentagePath2())) + { + Where = "Percentage PATH2"; + this.PercentPath2 = rxStringCommandChannel.ElementAt(GP30BytePosition.Reply); + Message = $"COMMAND CHANNEL:\t Received response on read 'Percentage3'-register = {this.PercentPath2.ToString(this.Culture)} at METER{this.MeterIndex}\n"; + GenesisZeroFlow._GenesisZeroFlow.SetFirstHitPercentage(this.MeterNumber, Constants.PATH2, this.PercentPath2); + return Message; + } + #endregion + #region Calibration factor PATH0 + if (Enumerable.SequenceEqual(GP30LastRegister, GP30Registers.CalFactor1())) + { + Where = "Calibration PATH0"; + Byte[] TempArray = new Byte[2]; + TempArray = rxStringCommandChannel.GetRange(GP30BytePosition.Reply, 2).ToArray(); + TempArray.Reverse(); + this.CalibrationFactorPath0 = BitConverter.ToUInt16(TempArray, 0); + Message = $"COMMAND CHANNEL:\t Received response on read 'Calibration factor1'-register = 0x{this.CalibrationFactorPath0.ToString("X4", this.Culture)} at METER{this.MeterIndex}\n"; + GenesisZeroFlow._GenesisZeroFlow.SetCalFactor(this.MeterNumber, Constants.PATH0, this.CalibrationFactorPath0); + return Message; + } + #endregion + #region Calibration factor PATH1 + if (Enumerable.SequenceEqual(GP30LastRegister, GP30Registers.CalFactor2())) + { + Where = "Calibration PATH1"; + Byte[] TempArray = new Byte[2]; + TempArray = rxStringCommandChannel.GetRange(GP30BytePosition.Reply, 2).ToArray(); + TempArray.Reverse(); + this.CalibrationFactorPath1 = BitConverter.ToUInt16(TempArray, 0); + Message = $"COMMAND CHANNEL:\t Received response on read 'Calibration factor2'-register = 0x{this.CalibrationFactorPath1.ToString("X4", this.Culture)} at METER{this.MeterIndex}\n"; + GenesisZeroFlow._GenesisZeroFlow.SetCalFactor(this.MeterNumber, Constants.PATH1, CalibrationFactorPath1); + return Message; + } + #endregion + #region Calibration factor PATH2 + if (Enumerable.SequenceEqual(GP30LastRegister, GP30Registers.CalFactor3())) + { + Where = "Calibration PATH2"; + Byte[] TempArray = new Byte[2]; + TempArray = rxStringCommandChannel.GetRange(GP30BytePosition.Reply, 2).ToArray(); + TempArray.Reverse(); + this.CalibrationFactorPath2 = BitConverter.ToUInt16(TempArray, 0); + Message = $"COMMAND CHANNEL:\t Received response on read 'Calibration factor3'-register = 0x{this.CalibrationFactorPath2.ToString("X4", this.Culture)} at METER{this.MeterIndex}\n"; + GenesisZeroFlow._GenesisZeroFlow.SetCalFactor(this.MeterNumber, Constants.PATH2, this.CalibrationFactorPath2); + return Message; + } + #endregion + #region Zeroflow offset PATH0 + if (Enumerable.SequenceEqual(GP30LastRegister, GP30Registers.ZeroOffset1())) + { + Where = "Zerooffset PATH0"; + Byte[] TempArray = new Byte[4]; + TempArray = rxStringCommandChannel.GetRange(GP30BytePosition.Reply, 4).ToArray(); + TempArray.Reverse(); + this.ZeroOffsetPath0 = BitConverter.ToInt32(TempArray, 0); + Message = $"COMMAND CHANNEL:\t Received response on read 'Zeroflow offset1'-register = 0x{this.ZeroOffsetPath0.ToString("X8", this.Culture)} at METER{this.MeterIndex}\n"; + GenesisZeroFlow._GenesisZeroFlow.SetZeroFlowOffset(this.MeterNumber, Constants.PATH0, this.ZeroOffsetPath0); + return Message; + } + #endregion + #region Zeroflow offset PATH1 + if (Enumerable.SequenceEqual(GP30LastRegister, GP30Registers.ZeroOffset2())) + { + Where = "Zerooffset PATH1"; + Byte[] TempArray = new Byte[4]; + TempArray = rxStringCommandChannel.GetRange(GP30BytePosition.Reply, 4).ToArray(); + TempArray.Reverse(); + this.ZeroOffsetPath1 = BitConverter.ToInt32(TempArray, 0); + Message = $"COMMAND CHANNEL:\t Received response on read 'Zeroflow offset2'-register = 0x{this.ZeroOffsetPath1.ToString("X8", this.Culture)} at METER{this.MeterIndex}\n"; + GenesisZeroFlow._GenesisZeroFlow.SetZeroFlowOffset(this.MeterNumber, Constants.PATH1, this.ZeroOffsetPath1); + return Message; + } + #endregion + #region Zeroflow offset PATH2 + if (Enumerable.SequenceEqual(GP30LastRegister, GP30Registers.ZeroOffset3())) + { + Where = "Zerooffset PATH2"; + Byte[] TempArray = new Byte[4]; + TempArray = rxStringCommandChannel.GetRange(GP30BytePosition.Reply, 4).ToArray(); + TempArray.Reverse(); + this.ZeroOffsetPath2 = BitConverter.ToInt32(TempArray, 0); + Message = $"COMMAND CHANNEL:\t Received response on read 'Zeroflow offset3'-register = 0x{this.ZeroOffsetPath2.ToString("X8", this.Culture)} at METER{this.MeterIndex}\n"; + GenesisZeroFlow._GenesisZeroFlow.SetZeroFlowOffset(this.MeterNumber, Constants.PATH2, this.ZeroOffsetPath2); + return Message; + } + #endregion + #region Starthit + if (Enumerable.SequenceEqual(GP30LastRegister, GP30Registers.StartHit())) + { + Where = "Starthit"; + this.Starthit = rxStringCommandChannel.ElementAt(GP30BytePosition.Reply); + Message = $"COMMAND CHANNEL:\t Received response on read 'Starthit'-register = {rxStringCommandChannel.ElementAt(GP30BytePosition.Reply).ToString(this.Culture)} at METER{this.MeterIndex}\n"; + rxStringCommandChannel.Clear(); + return Message; + } + #endregion + #region Amplitude end detect + if (Enumerable.SequenceEqual(GP30LastRegister, GP30Registers.AmplitudePeakDetectEnd())) + { + Where = "Amplitude"; + this.Amplitude = rxStringCommandChannel.ElementAt(GP30BytePosition.Reply); + Message = $"COMMAND CHANNEL:\t Received response on read 'Amplitude peak detect end'-register = {rxStringCommandChannel.ElementAt(GP30BytePosition.Reply).ToString(this.Culture)} at METER{this.MeterIndex}\n"; + return Message; + } + #endregion + #region Samplerate + if (Enumerable.SequenceEqual(GP30LastRegister, GP30Registers.Samplerate())) + { + Where = "Samplerate"; + this.Samplerate = rxStringCommandChannel.ElementAt(GP30BytePosition.Reply); + Message = $"COMMAND CHANNEL:\t Received response on read 'Samplerate'-register = {rxStringCommandChannel.ElementAt(GP30BytePosition.Reply).ToString(this.Culture)} at METER{this.MeterIndex}\n"; + return Message; + } + #endregion + #region Metersize + if (Enumerable.SequenceEqual(GP30LastRegister, GP30Registers.MeterSize())) + { + Where = "Metersize"; + this.MeterSize = rxStringCommandChannel.ElementAt(GP30BytePosition.Reply); + Message = $"COMMAND CHANNEL:\t Received response on read 'Metersize'-register = {this.MeterSize.ToString(this.Culture)} at METER{this.MeterIndex}\n"; + return Message; + } + #endregion + #region TofTempOffset PATH0 + if (Enumerable.SequenceEqual(GP30LastRegister, GP30Registers.ToFTempOffset1())) + { + Where = "TofTempOffset PATH0"; + Byte[] TempArray = new Byte[4]; + TempArray = rxStringCommandChannel.GetRange(GP30BytePosition.Reply, 4).ToArray(); + TempArray.Reverse(); + this.ToFTempOffsetPath0 = BitConverter.ToInt32(TempArray, 0); + Message = $"COMMAND CHANNEL:\t Received response on read 'ToFTempOffset1'-register = 0x{this.ToFTempOffsetPath0.ToString("X8", this.Culture)} at METER{this.MeterIndex}\n"; + GenesisZeroFlow._GenesisZeroFlow.SetToFTempOffset(this.MeterNumber, Constants.PATH0, this.ToFTempOffsetPath0); + return Message; + } + #endregion + #region TofTempOffset PATH1 + if (Enumerable.SequenceEqual(GP30LastRegister, GP30Registers.ToFTempOffset2())) + { + Where = "TofTempOffset PATH1"; + Byte[] TempArray = new Byte[4]; + TempArray = rxStringCommandChannel.GetRange(GP30BytePosition.Reply, 4).ToArray(); + TempArray.Reverse(); + this.ToFTempOffsetPath1 = BitConverter.ToInt32(TempArray, 0); + Message = $"COMMAND CHANNEL:\t Received response on read 'ToFTempOffset2'-register = 0x{this.ToFTempOffsetPath1.ToString("X8", this.Culture)} at METER{this.MeterIndex}\n"; + GenesisZeroFlow._GenesisZeroFlow.SetToFTempOffset(this.MeterNumber, Constants.PATH1, this.ToFTempOffsetPath1); + return Message; + } + #endregion + #region TofTempOffset PATH2 + if (Enumerable.SequenceEqual(GP30LastRegister, GP30Registers.ToFTempOffset3())) + { + Where = "TofTempOffset PATH2"; + Byte[] TempArray = new Byte[4]; + TempArray = rxStringCommandChannel.GetRange(GP30BytePosition.Reply, 4).ToArray(); + TempArray.Reverse(); + this.ToFTempOffsetPath2 = BitConverter.ToInt32(TempArray, 0); + Message = $"COMMAND CHANNEL:\t Received response on read 'ToFTempOffset3'-register = 0x{this.ToFTempOffsetPath2.ToString("X8", this.Culture)} at METER{this.MeterIndex}\n"; + GenesisZeroFlow._GenesisZeroFlow.SetToFTempOffset(this.MeterNumber, Constants.PATH2, this.ToFTempOffsetPath2); + return Message; + } + #endregion + #region LED Mode / Keep authentified + if (Enumerable.SequenceEqual(GP30LastRegister, GP30Registers.LedMode())) + { + Where = "LED-Mode"; + this.LedMode = rxStringCommandChannel.ElementAt(GP30BytePosition.Reply); + Message = $"COMMAND CHANNEL:\t Received response on read 'Keep authentified'/'LED Mode'-register = {this.LedMode.ToString(this.Culture)} at METER{this.MeterIndex}\n"; + return Message; + } + #endregion + } + catch (Exception ex) + { + ErrorLog.Log(LogErrReason.Exeption, $"CmdInterface.ReadDataResponse() failed", $"0x{ex.HResult.ToString("X", this.Culture)}", Where, this.Culture); + } + #region Return + return Message; + #endregion + } + private String MultipleWriteDataResponse(List rxStringCommandChannel) + { + String Message = String.Empty; + + try + { + if (Enumerable.SequenceEqual(this.GP30LastRegister, GP30Registers.Password())) + { + Message = $"COMMAND CHANNEL:\t Received response on 'Multiple write to password register'. Address = 0x{this.GP30LastRegister[0].ToString("X2", this.Culture)}{this.GP30LastRegister[1].ToString("X2", this.Culture)}; Data= 0x{rxStringCommandChannel.ElementAt(GP30BytePosition.Reply).ToString("X2", this.Culture)} at METER{this.MeterIndex}\n"; + return Message; + } + + #region All others + else + { + Message = $"COMMAND CHANNEL:\t Received response on 'Multiple write to register'. Address = 0x{this.GP30LastRegister[0].ToString("X2", this.Culture)}{this.GP30LastRegister[1].ToString("X2", this.Culture)}; Data= 0x{rxStringCommandChannel.ElementAt(GP30BytePosition.Reply).ToString("X2", this.Culture)} at METER{this.MeterIndex}\n"; + return Message; + } + #endregion + } + catch (Exception ex) + { + ErrorLog.Log(LogErrReason.Exeption, $"CmdInterface{this.MeterIndex}.MulipleWriteDataResponse() failed", $"0x{ex.HResult.ToString("X", this.Culture)}", String.Empty, this.Culture); + } + + return Message; + } + private Int32 Double0x5BGetLength(Byte[] inputData) + { + Int32 InputLength = inputData.Count(); + Int32 NumberOf0x5B = 0; + Int32 TotalLength = 0; + + try + { + for (Int32 InputIndex = 1; InputIndex < InputLength; InputIndex++) + { + if (Byte.Equals(inputData[InputIndex], GP30Commands.Startbyte)) + NumberOf0x5B++; + } + TotalLength = InputLength + NumberOf0x5B; + } + catch (Exception ex) + { + ErrorLog.Log(LogErrReason.Exeption, $"CmdInterface{this.MeterIndex}.Double0x5BGetLength() failed", $"0x{ex.HResult.ToString("X", this.Culture)}", String.Empty, this.Culture); + } + + return TotalLength; + } + private Byte[] Double0x5B(Byte[] inputData) + { + #region Definitions and initializations + Int32 InputLength = (Int32)inputData.Count(); + Int32 NumberOf0x5B = 0; + Int32 OutputLength = 0; + Int32 InputIndex = 1; + Int32 OutputIndex = 1; + #endregion + + try + { + #region Determine length + for (InputIndex = 1; InputIndex < InputLength; InputIndex++) + { + if (Byte.Equals(inputData[InputIndex], GP30Commands.Startbyte)) + NumberOf0x5B++; + } + OutputLength = InputLength + NumberOf0x5B; + #endregion + #region Generate output data + Byte[] OutputData = new Byte[OutputLength]; + OutputData[0] = GP30Commands.Startbyte; + for (InputIndex = 1; InputIndex < InputLength; InputIndex++) + { + if (inputData[InputIndex] == GP30Commands.Startbyte) + { + OutputData[OutputIndex] = GP30Commands.Startbyte; + OutputData[OutputIndex + 1] = GP30Commands.Startbyte; + OutputIndex = OutputIndex + 2; + } + else + { + OutputData[OutputIndex] = inputData[InputIndex]; + OutputIndex++; + } + } + #endregion + return OutputData; + } + catch (Exception ex) + { + ErrorLog.Log(LogErrReason.Exeption, $"CmdInterface{this.MeterIndex}.Double0x5BGetLength() failed", $"0x{ex.HResult.ToString("X", this.Culture)}", String.Empty, this.Culture); + } + + return null; + } + public void DecodeHighLevelErrors(List rxStringCmd) + { + #region Definitions and initializations + Byte GotSubreason = GP30HighLevelErrors.NoSubreason; + String Where = "Beginning"; + #endregion + #region CA1062 + if (rxStringCmd == null) + return; + #endregion + try + { + #region Decode optical port errors (chapter 9.5.3) + Where = "Decode 953"; + if (Byte.Equals(rxStringCmd.ElementAt(GP30BytePosition.ErrCodeBase), GP30HighLevelErrors.Base)) + { + Display.DebugMessage(this.ErrorMessages953(rxStringCmd, out GotSubreason), this.Culture); + this.IndicatorsFailed(); + return; + } + #endregion + #region Decode config exchange errors (chapter 8.5.3) + Where = "Decode 853"; + if (Byte.Equals(rxStringCmd.ElementAt(GP30BytePosition.ErrCodeBase), GP30ConfigExErrors.Base)) + { + Display.DebugMessage(this.ErrorMessages853(rxStringCmd, out GotSubreason), this.Culture); + this.IndicatorsFailed(); + this.Subreason = GotSubreason; + return; + } + #endregion + #region Decode response without errors + Where = "Decode w/o errors"; + if ((Byte.Equals(rxStringCmd.ElementAt(GP30BytePosition.ErrCodeBase), GP30HighLevelErrors.BaseOk)) && + (Byte.Equals(rxStringCmd.ElementAt(GP30BytePosition.ErrCodeBase), GP30ConfigExErrors.BaseOk))) + { + #region Response on 'Read data' + Where = "Read data"; + if (Byte.Equals(this.GP30LastCommand, GP30Commands.ReadData)) + { + #region Save payload + this.GP30RXPayload = rxStringCmd.ElementAt(GP30BytePosition.Reply); + #endregion + #region Display message !!!!! + Display.DebugMessage(this.ReadDataResponse(rxStringCmd), this.Culture); // <===== Decoding of individual data + this.IndicatorsOk(); + this.Subreason = GP30HighLevelErrors.NoSubreason; + Display.DebugMessage(String.Empty, this.Culture); + rxStringCmd.Clear(); + return; + #endregion + } + #endregion + #region Response on 'Write data' + Where = "Write data"; + if (Byte.Equals(this.GP30LastCommand, GP30Commands.WriteData)) + { + Display.DebugMessage(this.WriteDataResponse(rxStringCmd), this.Culture); // <===== + this.IndicatorsOk(); + this.Subreason = GP30HighLevelErrors.NoSubreason; + rxStringCmd.Clear(); + return; + } + #endregion + #region Response to 'Multiple write data' + Where = "Multiple write data"; + if (Byte.Equals(this.GP30LastCommand, GP30Commands.MultipleWritedata)) + { + Display.DebugMessage(this.MultipleWriteDataResponse(rxStringCmd), this.Culture); // <==== + this.IndicatorsOk(); + this.Subreason = GP30HighLevelErrors.NoSubreason; + rxStringCmd.Clear(); + return; + } + #endregion + this.IndicatorsOk(); + this.Subreason = GP30HighLevelErrors.NoSubreason; + } + #endregion + #region Unknown error code + Where = "Unknown error code"; + if ((rxStringCmd.ElementAt(GP30BytePosition.ErrCodeBase) != GP30HighLevelErrors.BaseOk) && + (rxStringCmd.ElementAt(GP30BytePosition.ErrCodeBase) != GP30ConfigExErrors.BaseOk) && + (rxStringCmd.ElementAt(GP30BytePosition.ErrCodeBase) != GP30HighLevelErrors.Base) && + (rxStringCmd.ElementAt(GP30BytePosition.ErrCodeBase) != GP30ConfigExErrors.Base)) + { + Display.DebugMessage($"Error Code = 0x{rxStringCmd.ElementAt(GP30BytePosition.ErrCodeBase).ToString("X", this.Culture)}{rxStringCmd.ElementAt(GP30BytePosition.ErrCodeSubreason).ToString("X2", this.Culture)}\n", this.Culture); + this.IndicatorsFailed(); + GotSubreason = rxStringCmd.ElementAt(GP30BytePosition.ErrCodeSubreason); + } + #endregion + // for all + this.Subreason = GotSubreason; + } + catch(Exception ex) + { + ErrorLog.Log(LogErrReason.Exeption, $"CmdInterface{this.MeterIndex}.DecodeHighLevelErrors() failed", $"0x{ex.HResult.ToString("X", this.Culture)}", Where, this.Culture); + } + + + } + public List Remove0x5B(List inputData) + { + #region Definitions and initializations + UInt16 InputLength = (UInt16)inputData.Count(); + UInt16 InputIndex = 0; + Byte LastData = 0; + Byte CurrentData = 0; + List OutputData = new List(); + #endregion + + try + { + #region Prepare output data + for (InputIndex = 0; InputIndex < InputLength; InputIndex++) + { + CurrentData = inputData.ElementAt(InputIndex); + if (!((LastData == GP30Commands.Startbyte) && (CurrentData == GP30Commands.Startbyte))) + { + OutputData.Add(CurrentData); + LastData = CurrentData; + } + else + LastData = 0; + } + #endregion + } + catch (Exception ex) + { + ErrorLog.Log(LogErrReason.Exeption, $"CommandInterface{this.MeterIndex}.Remove0x5B() failed", $"0x{ex.HResult.ToString("X", this.Culture)}", $"Index = { InputIndex.ToString(this.Culture)}", this.Culture); + } + + + return OutputData; + } + private String ErrorMessages953(List rxStringCommandChannel, out Byte subreason) + { + #region Definitions and initializations + String Data = String.Empty; + subreason = 0; + #endregion + + try + { + #region Decode optical port errors (chapter 9.5.3 of breeze specification document) + subreason = rxStringCommandChannel.ElementAt(GP30BytePosition.ErrCodeSubreason); + switch (rxStringCommandChannel.ElementAt(GP30BytePosition.ErrCodeSubreason)) + { + case GP30HighLevelErrors.CrcFailure: + Data = "ERROR: CRC Failure\n"; + break; + case GP30HighLevelErrors.InvalidEscape: + Data = "ERROR: INVALIDESCAPE\n"; + break; + case GP30HighLevelErrors.InvalidBaudrate: + Data = "ERROR: INVALID_BAUDRATE\n"; + break; + case GP30HighLevelErrors.InvalidBuffersize: + Data = "ERROR: INVALID_BUFFERSIZE\n"; + break; + case GP30HighLevelErrors.InvalidSubreason: + Data = "ERROR: INVALID_SUBREASON\n"; + break; + case GP30HighLevelErrors.NoBreak: + Data = "ERROR: NOBREAK\n"; + break; + case GP30HighLevelErrors.Overflow: + Data = "ERROR: OVERFLOW\n"; + break; + case GP30HighLevelErrors.PacketTimeout: + Data = "ERROR: PACKETTIMEOUT\n"; + break; + case GP30HighLevelErrors.PayloadCount: + Data = "ERROR: PAYLOAD_COUNT\n"; + break; + case GP30HighLevelErrors.TrainingFailed: + Data = "ERROR: TRAINING_FAILED\n"; + break; + case GP30HighLevelErrors.UnknownParameter: + Data = "ERROR: UNKNOWN_PARAMETER\n"; + break; + case GP30HighLevelErrors.UnrecognizedCmd: + Data = "ERROR: UNRECOGNISEDCMD\n"; + break; + default: + Data = "ERROR: Unkwown failure code\n"; + break; + } + #endregion + } + catch (Exception ex) + { + ErrorLog.Log(LogErrReason.Exeption, $"CommandInterface{this.MeterIndex}.ErrorMessages953() failed", $"0x{ex.HResult.ToString("X", this.Culture)}", String.Empty, this.Culture); + } + #region Return + return Data; + #endregion + } + private String ErrorMessages853(List rxStringCommandChannel, out Byte subreason) + { + String data = String.Empty; + subreason = 0; + + try + { + #region Decode optical port errors (chapter 8.5.3 of breeze specification document) + subreason = rxStringCommandChannel.ElementAt(GP30BytePosition.ErrCodeSubreason); + switch (rxStringCommandChannel.ElementAt(GP30BytePosition.ErrCodeSubreason)) + { + case (GP30ConfigExErrors.LockedOut): + data = "ERROR: Locked out\n"; + break; + case (GP30ConfigExErrors.AuthenticationFail): + data = "ERROR: Authenfication failure\n"; + break; + case (GP30ConfigExErrors.AccessDenied): + data = "ERROR: Access denied!\n"; + break; + case (GP30ConfigExErrors.UnknownParameter): + data = "ERROR: Unknown parameter\n"; + break; + case (GP30ConfigExErrors.InUse): + data = "ERROR: In use\n"; + break; + case (GP30ConfigExErrors.SizesDoNotMatch): + data = "ERROR: Sizes don't match\n"; + break; + case (GP30ConfigExErrors.CannotReadConfigfile): + data = "ERROR: Can't read config file\n"; + break; + case (GP30ConfigExErrors.UserNotKnown): + data = "ERROR: User not known\n"; + break; + case (GP30ConfigExErrors.CannotCreateConfigfile): + data = "ERROR: Can't create config file\n"; + break; + case (GP30ConfigExErrors.StoreDidNotStore): + data = "ERROR: Store didn't store\n"; + break; + case (GP30ConfigExErrors.StoreCorrupt): + data = "ERROR: Store corrupt\n"; + break; + case (GP30ConfigExErrors.ExpectedWrite): + data = "ERROR: Expected write\n"; + break; + case (GP30ConfigExErrors.ExpectedRead): + data = "ERROR: Expected read\n"; + break; + case (GP30ConfigExErrors.StopCycling): + data = "ERROR: Stop cycling\n"; + break; + case (GP30ConfigExErrors.TooManyOpen): + data = "ERROR: Too many open\n"; + break; + case (GP30ConfigExErrors.NeverOpened): + data = "ERROR: Never opened\n"; + break; + case (GP30ConfigExErrors.FileProtected): + data = "ERROR: File protected\n"; + break; + case (GP30ConfigExErrors.PartialRecall): + data = "ERROR: Partial recall\n"; + break; + case (GP30ConfigExErrors.DefaultPasswordUsed): + data = "ERROR: Default password used\n"; + break; + default: + data = $"ERROR: Unknown error code: 0x{rxStringCommandChannel.ElementAt(GP30BytePosition.ErrCodeSubreason).ToString("X2", this.Culture)}\n"; + break; + } + #endregion + } + catch (Exception ex) + { + ErrorLog.Log(LogErrReason.Exeption, $"CommandInterface{this.MeterIndex}.ErrorMessages853() failed ", $"0x{ex.HResult.ToString("X", this.Culture)}", String.Empty, this.Culture); + } + + return data; + } + + } + + public partial class GenesisZeroFlow : Form + { + const Boolean DisplayUndecodedRxData = false; + + private void GetReplyCmdMeter1(object sender, EventArgs e) + { + CultureInfo Culture = GetGlobalCulture(); + + try + { + #region Decode reply command + Display.DebugMessage(CommandInterface1.ReplyCommand(RxStringCmd[Constants.Meter1]), Culture); + #endregion + + CommandInterface1.DecodeHighLevelErrors(RxStringCmd[Constants.Meter1]); + RxStringCmd[Constants.Meter1].Clear(); + } + catch (Exception ex) + { + #region Error: exception + ErrorLog.Log(LogErrReason.Exeption, "GetReplyCmdMeter1() failed", $"0x{ex.HResult.ToString("X", Culture)}", String.Empty, Culture); + #endregion + } + } + private void GetReplyCmdMeter2(object sender, EventArgs e) + { + CultureInfo Culture = GetGlobalCulture(); + + try + { + #region Decode reply command + Display.DebugMessage(CommandInterface2.ReplyCommand(RxStringCmd[Constants.Meter2]), Culture); + #endregion + #region Obtain error status + CommandInterface2.DecodeHighLevelErrors(RxStringCmd[Constants.Meter2]); + RxStringCmd[Constants.Meter2].Clear(); + #endregion + } + catch (Exception ex) + { + #region Error: exception + ErrorLog.Log(LogErrReason.Exeption, "GetReplyCmdMeter2() failed", $"0x{ex.HResult.ToString("X", Culture)}", String.Empty, Culture); + #endregion + } + } + private void GetReplyCmdMeter3(object sender, EventArgs e) + { + CultureInfo Culture = GetGlobalCulture(); + + try + { + #region Decode reply command + Display.DebugMessage(CommandInterface3.ReplyCommand(RxStringCmd[Constants.Meter3]), Culture); + #endregion + #region Obtain error status + CommandInterface3.DecodeHighLevelErrors(RxStringCmd[Constants.Meter3]); + RxStringCmd[Constants.Meter3].Clear(); + #endregion + } + catch (Exception ex) + { + #region Error: exception + ErrorLog.Log(LogErrReason.Exeption, "GetReplyCmdMeter3() failed", $"0x{ex.HResult.ToString("X", Culture)}", String.Empty, Culture); + #endregion + } + } + private void GetReplyCmdMeter4(object sender, EventArgs e) + { + CultureInfo Culture = GetGlobalCulture(); + + try + { + #region Decode reply command + Display.DebugMessage(CommandInterface4.ReplyCommand(RxStringCmd[Constants.Meter4]), Culture); + #endregion + #region Obtain error status + CommandInterface4.DecodeHighLevelErrors(RxStringCmd[Constants.Meter4]); + RxStringCmd[Constants.Meter4].Clear(); + #endregion + } + catch (Exception ex) + { + #region Error: exception + ErrorLog.Log(LogErrReason.Exeption, "GetReplyCmdMeter4() failed", $"0x{ex.HResult.ToString("X", Culture)}", String.Empty, Culture); + #endregion + } + } + private void GetReplyCmdMeter5(object sender, EventArgs e) + { + CultureInfo Culture = GetGlobalCulture(); + + try + { + #region Decode reply command + Display.DebugMessage(CommandInterface5.ReplyCommand(RxStringCmd[Constants.Meter5]), Culture); + #endregion + #region Obtain error status + CommandInterface5.DecodeHighLevelErrors(RxStringCmd[Constants.Meter5]); + RxStringCmd[Constants.Meter5].Clear(); + #endregion + } + catch (Exception ex) + { + #region Error: exception + ErrorLog.Log(LogErrReason.Exeption, "GetReplyCmdMeter5() failed", $"0x{ex.HResult.ToString("X", Culture)}", String.Empty, Culture); + #endregion + } + } + private void GetReplyCmdMeter6(object sender, EventArgs e) + { + CultureInfo Culture = GetGlobalCulture(); + + try + { + #region Decode reply command + Display.DebugMessage(CommandInterface6.ReplyCommand(RxStringCmd[Constants.Meter6]), Culture); + #endregion + #region Obtain error status + CommandInterface6.DecodeHighLevelErrors(RxStringCmd[Constants.Meter6]); + RxStringCmd[Constants.Meter6].Clear(); + #endregion + } + catch (Exception ex) + { + #region Error: exception + ErrorLog.Log(LogErrReason.Exeption, "GetReplyCmdMeter6() failed", $"0x{ex.HResult.ToString("X", Culture)}", String.Empty, Culture); + #endregion + } + } + private void GetReplyCmdMeter7(object sender, EventArgs e) + { + CultureInfo Culture = GetGlobalCulture(); + + try + { + #region Decode reply command + Display.DebugMessage(CommandInterface7.ReplyCommand(RxStringCmd[Constants.Meter7]), Culture); + #endregion + #region Obtain error status + CommandInterface7.DecodeHighLevelErrors(RxStringCmd[Constants.Meter7]); + RxStringCmd[Constants.Meter7].Clear(); + #endregion + } + catch (Exception ex) + { + #region Error: exception + ErrorLog.Log(LogErrReason.Exeption, "GetReplyCmdMeter7() failed", $"0x{ex.HResult.ToString("X", Culture)}", String.Empty, Culture); + #endregion + } + } + private void GetReplyCmdMeter8(object sender, EventArgs e) + { + CultureInfo Culture = GetGlobalCulture(); + + try + { + #region Decode reply command + Display.DebugMessage(CommandInterface8.ReplyCommand(RxStringCmd[Constants.Meter8]), Culture); + #endregion + #region Obtain error status + CommandInterface8.DecodeHighLevelErrors(RxStringCmd[Constants.Meter8]); + RxStringCmd[Constants.Meter8].Clear(); + #endregion + } + catch (Exception ex) + { + #region Error: exception + ErrorLog.Log(LogErrReason.Exeption, "GetReplyCmdMeter8() failed", $"0x{ex.HResult.ToString("X", Culture)}", String.Empty, Culture); + #endregion + } + } + private void GetReplyCmdMeter9(object sender, EventArgs e) + { + CultureInfo Culture = GetGlobalCulture(); + + try + { + #region Decode reply command + Display.DebugMessage(CommandInterface9.ReplyCommand(RxStringCmd[Constants.Meter9]), Culture); + #endregion + #region Obtain error status + CommandInterface9.DecodeHighLevelErrors(RxStringCmd[Constants.Meter9]); + RxStringCmd[Constants.Meter9].Clear(); + #endregion + } + catch (Exception ex) + { + #region Error: exception + ErrorLog.Log(LogErrReason.Exeption, "GetReplyCmdMeter9() failed", $"0x{ex.HResult.ToString("X", Culture)}", String.Empty, Culture); + #endregion + } + } + private void GetReplyCmdMeter10(object sender, EventArgs e) + { + CultureInfo Culture = GetGlobalCulture(); + + try + { + #region Decode reply command + Display.DebugMessage(CommandInterface10.ReplyCommand(RxStringCmd[Constants.Meter10]), Culture); + #endregion + #region Obtain error status + CommandInterface10.DecodeHighLevelErrors(RxStringCmd[Constants.Meter10]); + RxStringCmd[Constants.Meter10].Clear(); + #endregion + } + catch (Exception ex) + { + #region Error: exception + ErrorLog.Log(LogErrReason.Exeption, "GetReplyCmdMeter10() failed", $"0x{ex.HResult.ToString("X", Culture)}", String.Empty, Culture); + #endregion + } + } + } +} \ No newline at end of file diff --git a/ZeroFlowTool/GenesisZeroFlow.csproj b/ZeroFlowTool/GenesisZeroFlow.csproj new file mode 100644 index 00000000..f9fc9164 --- /dev/null +++ b/ZeroFlowTool/GenesisZeroFlow.csproj @@ -0,0 +1,401 @@ + + + + + + + + Debug + AnyCPU + {38BE240B-8153-47DA-9F0D-81CBB5CE649F} + WinExe + Properties + GenesisDisplayTool + GenesisDisplayTool + v4.5.2 + 512 + true + false + + + SAK + SAK + SAK + SAK + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + + + AnyCPU + true + full + false + bin\Debug\ + TRACE + prompt + 4 + false + false + false + GenesisZeroFlow.ruleset + false + 1591;1587 + false + + + x86 + pdbonly + true + bin\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS + prompt + 4 + false + GenesisZeroFlow.ruleset + + + true + bin\GenesisDisplayTool_V01\ + DEBUG;TRACE + full + AnyCPU + prompt + GenesisZeroFlow.ruleset + true + + + true + bin\PerformTest\ + CODE_ANALYSIS;TRACE + 1591;1587 + full + AnyCPU + true + prompt + GenesisZeroFlow.ruleset + + + + ..\Common\packages\PDFsharp-MigraDoc-GDI.1.32.3879.0\lib\net20\MigraDoc.DocumentObjectModel.dll + True + + + ..\Common\packages\PDFsharp-MigraDoc-GDI.1.32.3879.0\lib\net20\MigraDoc.Rendering.dll + True + + + ..\Common\packages\PDFsharp-MigraDoc-GDI.1.32.3879.0\lib\net20\MigraDoc.RtfRendering.dll + True + + + ..\Common\packages\Newtonsoft.Json.11.0.1\lib\net45\Newtonsoft.Json.dll + True + + + ..\Common\packages\NLog.4.5.5\lib\net45\NLog.dll + True + + + packages\PDFsharp.1.50.5147\lib\net20\PdfSharp.dll + + + packages\PDFsharp.1.50.5147\lib\net20\PdfSharp.Charting.dll + + + + + + + + + + + + + + + + + + + + + + ..\Common\Metrology\Measurements\bin\Debug\Xylem.Common.Metrology.Measurements.dll + + + ..\Common\Utils\Logging\bin\Debug\Xylem.Common.Utils.Logging.dll + + + + + Properties\SharedAssemblyInfo.cs + + + + Form + + + frmTempCalibration.cs + + + + + + Form + + + + + + + + Form + + + Form1.cs + + + Form + + + frmStartup.cs + + + Form + + + + + + + + + + + + + + + Form + + + + + Form + + + Form + + + Form + + + TemperatureField.cs + + + Form + + + TemperatureFieldTempCal.cs + + + + TestComon.cs + + + + + Form1.cs + Designer + + + frmStartup.cs + + + frmTempCalibration.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + TemperatureField.cs + + + TemperatureFieldTempCal.cs + + + TestComon.cs + + + + NlogConfig.xml + Always + Designer + + + PreserveNewest + + + Designer + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + Designer + + + + + {2DF8D04C-5BFA-101B-BDE5-00AA0044DE52} + 2 + 5 + 0 + primary + False + True + + + {0002E157-0000-0000-C000-000000000046} + 5 + 3 + 0 + primary + False + True + + + + + False + Microsoft .NET Framework 4.5.2 %28x86 and x64%29 + true + + + False + .NET Framework 3.5 SP1 + false + + + + + + + + + + + {1B02C79E-0B19-43E2-8F6B-71EF0C786C97} + CommonCore + + + {2e139f63-b6fe-4ea9-a098-85364fe9b26c} + PortCore + + + {72037e89-4f63-4b3f-beff-4138e578ce99} + SerialPorts + + + {0E524D43-7B66-45CD-AA74-41D51AFC3D99} + DataPackages + + + {f013a56b-7be6-4852-9cd8-b971cd1add0c} + GenesisConfig + + + {04201e95-90a0-4b73-a72f-379739b2a3ae} + GenesisCore + + + {8bdd2789-96d4-43ea-aad7-0f49d0347998} + ProtocolCore + + + {d32ed790-7e1e-435b-8619-9f906c992066} + RequestProtocol + + + {29617814-313e-409e-aa5d-59c78a9d4df1} + StreamingProtocol + + + {f4aaf7e6-7333-4284-b735-e32deb076c64} + Registers + + + {8203abb8-38e5-472e-a742-33f38b7a74a6} + WaterMeterCore + + + {26afcf1e-1287-48b8-a506-32b1e8a0dd0e} + WaterMeterRegisters + + + {95A50087-99EE-4349-9A17-C547290DB42F} + GenesisToolBox + + + {4b88b0d3-e791-4774-9521-eabeacdc420e} + Logging + + + + + + + + + + + Dieses Projekt verweist auf mindestens ein NuGet-Paket, das auf diesem Computer fehlt. Verwenden Sie die Wiederherstellung von NuGet-Paketen, um die fehlenden Dateien herunterzuladen. Weitere Informationen finden Sie unter "http://go.microsoft.com/fwlink/?LinkID=322105". Die fehlende Datei ist "{0}". + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ZeroFlowTool/GenesisZeroFlow.csproj.user b/ZeroFlowTool/GenesisZeroFlow.csproj.user new file mode 100644 index 00000000..702a880c --- /dev/null +++ b/ZeroFlowTool/GenesisZeroFlow.csproj.user @@ -0,0 +1,21 @@ + + + + publish\ + + + + + + de-DE + false + ProjectFiles + + + + + + + flow + + \ No newline at end of file diff --git a/ZeroFlowTool/GenesisZeroFlow.csproj.vspscc b/ZeroFlowTool/GenesisZeroFlow.csproj.vspscc new file mode 100644 index 00000000..b6d32892 --- /dev/null +++ b/ZeroFlowTool/GenesisZeroFlow.csproj.vspscc @@ -0,0 +1,10 @@ +"" +{ +"FILE_VERSION" = "9237" +"ENLISTMENT_CHOICE" = "NEVER" +"PROJECT_FILE_RELATIVE_PATH" = "" +"NUMBER_OF_EXCLUDED_FILES" = "0" +"ORIGINAL_PROJECT_FILE_PATH" = "" +"NUMBER_OF_NESTED_PROJECTS" = "0" +"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" +} diff --git a/ZeroFlowTool/GenesisZeroFlow.ruleset b/ZeroFlowTool/GenesisZeroFlow.ruleset new file mode 100644 index 00000000..954dbca3 --- /dev/null +++ b/ZeroFlowTool/GenesisZeroFlow.ruleset @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ZeroFlowTool/GenesisZeroFlow.sln b/ZeroFlowTool/GenesisZeroFlow.sln new file mode 100644 index 00000000..c818a9ea --- /dev/null +++ b/ZeroFlowTool/GenesisZeroFlow.sln @@ -0,0 +1,38 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GenesisZeroFlow", "GenesisZeroFlow.csproj", "{38BE240B-8153-47DA-9F0D-81CBB5CE649F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + GenesisDisplayTool_V01|Any CPU = GenesisDisplayTool_V01|Any CPU + PerformTest|Any CPU = PerformTest|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {38BE240B-8153-47DA-9F0D-81CBB5CE649F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {38BE240B-8153-47DA-9F0D-81CBB5CE649F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {38BE240B-8153-47DA-9F0D-81CBB5CE649F}.GenesisDisplayTool_V01|Any CPU.ActiveCfg = GenesisDisplayTool_V01|Any CPU + {38BE240B-8153-47DA-9F0D-81CBB5CE649F}.GenesisDisplayTool_V01|Any CPU.Build.0 = GenesisDisplayTool_V01|Any CPU + {38BE240B-8153-47DA-9F0D-81CBB5CE649F}.PerformTest|Any CPU.ActiveCfg = PerformTest|Any CPU + {38BE240B-8153-47DA-9F0D-81CBB5CE649F}.PerformTest|Any CPU.Build.0 = PerformTest|Any CPU + {38BE240B-8153-47DA-9F0D-81CBB5CE649F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {38BE240B-8153-47DA-9F0D-81CBB5CE649F}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(TeamFoundationVersionControl) = preSolution + SccNumberOfProjects = 1 + SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C} + SccTeamFoundationServer = http://slutfs:8080/tfs/sensusprojectcollection + SccProjectUniqueName0 = GenesisZeroFlow.csproj + SccProjectName0 = . + SccAuxPath0 = http://slutfs:8080/tfs/sensusprojectcollection + SccLocalPath0 = . + SccProvider0 = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C} + EndGlobalSection +EndGlobal diff --git a/ZeroFlowTool/GlobalSuppressions.cs b/ZeroFlowTool/GlobalSuppressions.cs new file mode 100644 index 00000000..c15f49c4 Binary files /dev/null and b/ZeroFlowTool/GlobalSuppressions.cs differ diff --git a/ZeroFlowTool/Itinerary/PrepareTest.cs b/ZeroFlowTool/Itinerary/PrepareTest.cs new file mode 100644 index 00000000..3685496e --- /dev/null +++ b/ZeroFlowTool/Itinerary/PrepareTest.cs @@ -0,0 +1,6 @@ +namespace GenesisDisplayTool.Action +{ + class PrepareTest + { + } +} diff --git a/ZeroFlowTool/Itinerary/ProcessProgress.cs b/ZeroFlowTool/Itinerary/ProcessProgress.cs new file mode 100644 index 00000000..562b6bfa --- /dev/null +++ b/ZeroFlowTool/Itinerary/ProcessProgress.cs @@ -0,0 +1,31 @@ +using GenesisZeroFlow; +using System; +using System.Globalization; +using System.Threading; + +namespace GenesisDisplayTool.Itinerary +{ + public class ProcessProgress + { + public CultureInfo Culture; + public String[] Passwords; + public String[] ThermoPasswords; + public Boolean[] MeterEnable; + public Boolean[] ThermoEnable; + public bool AtLeastOneMeterPresent; + public bool AtLeastOneThermometerPresent; + + public Boolean StopSequence; + public Boolean Aborted; + + public Boolean[] AllOk; + public Boolean[] MeterOk; + public Boolean[] ThermoOk; + + public Double UpperTempLimit; + public Double LowerTempLimit; + public Double TempDeviationLimit; + public CancellationTokenSource CancellationSource = new CancellationTokenSource(); + + } +} diff --git a/ZeroFlowTool/LastUsage.cs b/ZeroFlowTool/LastUsage.cs new file mode 100644 index 00000000..8a2f593f --- /dev/null +++ b/ZeroFlowTool/LastUsage.cs @@ -0,0 +1,12 @@ +namespace GenesisDisplayTool +{ + + public class LastUsage + { + public string StreamingPortName = null; + public string RequestPortName = null; + public string RequestPortType = null; + public string Password = null; + } + +} diff --git a/ZeroFlowTool/LogOn.cs b/ZeroFlowTool/LogOn.cs new file mode 100644 index 00000000..0371082f --- /dev/null +++ b/ZeroFlowTool/LogOn.cs @@ -0,0 +1,476 @@ +using System; +using System.Linq; +using System.Globalization; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.IO.Ports; + + +namespace GenesisZeroFlow +{ + public static class LogOnSequences + { + public static Boolean[] Total(Boolean[] enable, CmdInterface[] commandInterface, String[] password, UInt16 numberOfTrials, out Boolean aborted, CultureInfo culture) + { + #region Definitions and initializations + Boolean[] SequenceFailed = new Boolean[Constants.NumberOfMeters]; + Boolean[] TaskStarted = new Boolean[Constants.NumberOfMeters]; + Boolean[] TaskCompleted = new Boolean[Constants.NumberOfMeters]; + Int32 NextDelayTime = 0; + aborted = false; + + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + { + SequenceFailed[Meter] = false; + TaskStarted[Meter] = false; + TaskCompleted[Meter] = false; + } + #region CA1062 + if ((enable == null) || (password == null) || (commandInterface == null)) + return SequenceFailed; + #endregion + LogOn LogOn1 = new LogOn(); + LogOn LogOn2 = new LogOn(); + LogOn LogOn3 = new LogOn(); + LogOn LogOn4 = new LogOn(); + LogOn LogOn5 = new LogOn(); + LogOn LogOn6 = new LogOn(); + LogOn LogOn7 = new LogOn(); + LogOn LogOn8 = new LogOn(); + LogOn LogOn9 = new LogOn(); + LogOn LogOn10 = new LogOn(); + + LogOn1.Initialize(commandInterface[Constants.Meter1], Constants.Meter, password[Constants.Meter1], Constants.Meter1, numberOfTrials, culture); + LogOn2.Initialize(commandInterface[Constants.Meter2], Constants.Meter, password[Constants.Meter2], Constants.Meter2, numberOfTrials, culture); + LogOn3.Initialize(commandInterface[Constants.Meter3], Constants.Meter, password[Constants.Meter3], Constants.Meter3, numberOfTrials, culture); + LogOn4.Initialize(commandInterface[Constants.Meter4], Constants.Meter, password[Constants.Meter4], Constants.Meter4, numberOfTrials, culture); + LogOn5.Initialize(commandInterface[Constants.Meter5], Constants.Meter, password[Constants.Meter5], Constants.Meter5, numberOfTrials, culture); + LogOn6.Initialize(commandInterface[Constants.Meter6], Constants.Meter, password[Constants.Meter6], Constants.Meter6, numberOfTrials, culture); + LogOn7.Initialize(commandInterface[Constants.Meter7], Constants.Meter, password[Constants.Meter7], Constants.Meter7, numberOfTrials, culture); + LogOn8.Initialize(commandInterface[Constants.Meter8], Constants.Meter, password[Constants.Meter8], Constants.Meter8, numberOfTrials, culture); + LogOn9.Initialize(commandInterface[Constants.Meter9], Constants.Meter, password[Constants.Meter9], Constants.Meter9, numberOfTrials, culture); + LogOn10.Initialize(commandInterface[Constants.Meter10], Constants.Meter, password[Constants.Meter10], Constants.Meter10, numberOfTrials, culture); + #endregion + #region Perform test + CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); + CancellationToken token = cancellationTokenSource.Token; + #region METER1 + Task Task1 = new Task(() => { return true; }); + LogOn1.Meter(enable[Constants.Meter1], ref Task1, ref TaskStarted[Constants.Meter1], ref SequenceFailed[Constants.Meter1], LogOn1, ref NextDelayTime, token); + #endregion + #region METER2 + Task Task2 = new Task(() => { return true; }); + LogOn2.Meter(enable[Constants.Meter2], ref Task2, ref TaskStarted[Constants.Meter2], ref SequenceFailed[Constants.Meter2], LogOn2, ref NextDelayTime, token); + #endregion + #region METER3 + Task Task3 = new Task(() => { return true; }); + LogOn3.Meter(enable[Constants.Meter3], ref Task3, ref TaskStarted[Constants.Meter3], ref SequenceFailed[Constants.Meter3], LogOn3, ref NextDelayTime, token); + #endregion + #region METER4 + Task Task4 = new Task(() => { return true; }); + LogOn4.Meter(enable[Constants.Meter4], ref Task4, ref TaskStarted[Constants.Meter4], ref SequenceFailed[Constants.Meter4], LogOn4, ref NextDelayTime, token); + #endregion + #region METER5 + Task Task5 = new Task(() => { return true; }); + LogOn5.Meter(enable[Constants.Meter5], ref Task5, ref TaskStarted[Constants.Meter5], ref SequenceFailed[Constants.Meter5], LogOn5, ref NextDelayTime, token); + #endregion + #region METER6 + Task Task6 = new Task(() => { return true; }); + LogOn6.Meter(enable[Constants.Meter6], ref Task6, ref TaskStarted[Constants.Meter6], ref SequenceFailed[Constants.Meter6], LogOn6, ref NextDelayTime, token); + #endregion + #region METER7 + Task Task7 = new Task(() => { return true; }); + LogOn7.Meter(enable[Constants.Meter7], ref Task7, ref TaskStarted[Constants.Meter7], ref SequenceFailed[Constants.Meter7], LogOn7, ref NextDelayTime, token); + #endregion + #region METER8 + Task Task8 = new Task(() => { return true; }); + LogOn8.Meter(enable[Constants.Meter8], ref Task8, ref TaskStarted[Constants.Meter8], ref SequenceFailed[Constants.Meter8], LogOn8, ref NextDelayTime, token); + #endregion + #region METER9 + Task Task9 = new Task(() => { return true; }); + LogOn9.Meter(enable[Constants.Meter9], ref Task9, ref TaskStarted[Constants.Meter9], ref SequenceFailed[Constants.Meter9], LogOn9, ref NextDelayTime, token); + #endregion + #region METER10 + Task Task10 = new Task(() => { return true; }); + LogOn10.Meter(enable[Constants.Meter10], ref Task10, ref TaskStarted[Constants.Meter10], ref SequenceFailed[Constants.Meter10], LogOn10, ref NextDelayTime, token); + #endregion + #endregion + #region Wait for tasks + Int32[] KeepAuthentifiedCounter = new Int32[Constants.NumberOfMeters]; + Boolean[] SequenceOk = new Boolean[Constants.NumberOfMeters]; + + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + { + KeepAuthentifiedCounter[Meter] = 0; + SequenceOk[Meter] = false; + } + + while (!CheckArray(TaskCompleted)) + { + if (GenesisZeroFlow._GenesisZeroFlow.AbortIndicator) + { + aborted = true; + cancellationTokenSource.Cancel(); + } + TaskCompleted[Constants.Meter1] = TaskOperations.WaitFor(TaskStarted[Constants.Meter1], Task1); + TaskCompleted[Constants.Meter2] = TaskOperations.WaitFor(TaskStarted[Constants.Meter2], Task2); + TaskCompleted[Constants.Meter3] = TaskOperations.WaitFor(TaskStarted[Constants.Meter3], Task3); + TaskCompleted[Constants.Meter4] = TaskOperations.WaitFor(TaskStarted[Constants.Meter4], Task4); + TaskCompleted[Constants.Meter5] = TaskOperations.WaitFor(TaskStarted[Constants.Meter5], Task5); + TaskCompleted[Constants.Meter6] = TaskOperations.WaitFor(TaskStarted[Constants.Meter6], Task6); + TaskCompleted[Constants.Meter7] = TaskOperations.WaitFor(TaskStarted[Constants.Meter7], Task7); + TaskCompleted[Constants.Meter8] = TaskOperations.WaitFor(TaskStarted[Constants.Meter8], Task8); + TaskCompleted[Constants.Meter9] = TaskOperations.WaitFor(TaskStarted[Constants.Meter9], Task9); + TaskCompleted[Constants.Meter10] = TaskOperations.WaitFor(TaskStarted[Constants.Meter10], Task10); + LogOn1.KeepAuthentified(enable[Constants.Meter1], SequenceOk[Constants.Meter1], TaskCompleted[Constants.Meter1], ref KeepAuthentifiedCounter[Constants.Meter1]); + LogOn2.KeepAuthentified(enable[Constants.Meter2], SequenceOk[Constants.Meter2], TaskCompleted[Constants.Meter2], ref KeepAuthentifiedCounter[Constants.Meter2]); + LogOn3.KeepAuthentified(enable[Constants.Meter3], SequenceOk[Constants.Meter3], TaskCompleted[Constants.Meter3], ref KeepAuthentifiedCounter[Constants.Meter3]); + LogOn4.KeepAuthentified(enable[Constants.Meter4], SequenceOk[Constants.Meter4], TaskCompleted[Constants.Meter4], ref KeepAuthentifiedCounter[Constants.Meter4]); + LogOn5.KeepAuthentified(enable[Constants.Meter5], SequenceOk[Constants.Meter5], TaskCompleted[Constants.Meter5], ref KeepAuthentifiedCounter[Constants.Meter5]); + LogOn6.KeepAuthentified(enable[Constants.Meter6], SequenceOk[Constants.Meter6], TaskCompleted[Constants.Meter6], ref KeepAuthentifiedCounter[Constants.Meter6]); + LogOn7.KeepAuthentified(enable[Constants.Meter7], SequenceOk[Constants.Meter7], TaskCompleted[Constants.Meter7], ref KeepAuthentifiedCounter[Constants.Meter7]); + LogOn8.KeepAuthentified(enable[Constants.Meter8], SequenceOk[Constants.Meter8], TaskCompleted[Constants.Meter8], ref KeepAuthentifiedCounter[Constants.Meter8]); + LogOn9.KeepAuthentified(enable[Constants.Meter9], SequenceOk[Constants.Meter9], TaskCompleted[Constants.Meter9], ref KeepAuthentifiedCounter[Constants.Meter9]); + LogOn10.KeepAuthentified(enable[Constants.Meter10], SequenceOk[Constants.Meter10], TaskCompleted[Constants.Meter10], ref KeepAuthentifiedCounter[Constants.Meter10]); + Misc.WaitNSeconds(1); + + SequenceFailed = TaskOperations.GetResultTotal(TaskStarted, Task1, Task2, Task3, Task4, Task5, Task6, Task7, Task8, Task9, Task10); + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + SequenceOk[Meter] = !SequenceFailed[Meter]; + GenesisZeroFlow.Display.MeterStatusGreenRed(SequenceOk, TaskStarted); + // GenesisZeroFlow.Display.ShowResultStatus("Login sequence OK (while loop) = ", SequenceOk); + } + #endregion + #region Destroy tasks + SequenceFailed = TaskOperations.GetResultTotal(TaskStarted, Task1, Task2, Task3, Task4, Task5, Task6, Task7, Task8, Task9, Task10); + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + SequenceOk[Meter] = !SequenceFailed[Meter]; + GenesisZeroFlow.Display.MeterStatusGreenRed(SequenceOk, TaskStarted); + // GenesisZeroFlow.Display.ShowResultStatus("Login sequence failed = ", SequenceFailed); + // GenesisZeroFlow.Display.ShowResultStatus("Task Completed = ", TaskCompleted); + + TaskOperations.CheckAndDispose(ref Task1); + TaskOperations.CheckAndDispose(ref Task2); + TaskOperations.CheckAndDispose(ref Task3); + TaskOperations.CheckAndDispose(ref Task4); + TaskOperations.CheckAndDispose(ref Task5); + TaskOperations.CheckAndDispose(ref Task6); + TaskOperations.CheckAndDispose(ref Task7); + TaskOperations.CheckAndDispose(ref Task8); + TaskOperations.CheckAndDispose(ref Task9); + TaskOperations.CheckAndDispose(ref Task10); + #endregion + + return SequenceFailed; + } + private static Boolean CheckArray(Boolean[] array) + { + Boolean Completed = true; + + for (Int16 i = 0; i < array.Count(); i++) + { + if (Boolean.Equals(array[i], false)) + return false; + } + + return Completed; + } + public static Boolean CheckIfNoMeterSelected(Boolean[] meterSelected) + { + Boolean noMeterSelected = true; + + #region CA1062 + if (meterSelected == null) + return noMeterSelected; + #endregion + + for (Int16 i = 0; i < meterSelected.Count(); i++) + { + if (meterSelected[i]) + noMeterSelected = false; + } + + return noMeterSelected; + } + public static Boolean CheckIfPortIndicatorsValid(Boolean[] meterSelected, Boolean[] serialPortOpenIndicator) + { + Boolean portIndicatorsValid = true; + + #region CA1062 + if ((meterSelected == null) || (serialPortOpenIndicator == null)) + return portIndicatorsValid = false; ; + #endregion + + + for (Int16 i = 0; i < meterSelected.Count(); i++) + { + if (meterSelected[i] != (serialPortOpenIndicator[i] & serialPortOpenIndicator[Constants.NumberOfMeters + i])) + portIndicatorsValid = false; + } + + return portIndicatorsValid; + } + } + + public class LogOn + { + private String Password { get; set; } + private UInt16 MeterNumber { get; set; } + private String MeterIndex { get; set; } + private String MeterType { get; set; } + private UInt16 NumberOfTrials { get; set; } + private CultureInfo Culture { get; set; } + private SerialPort SerialPort { get; set; } + private CmdInterface CommandInterface { get; set; } + public void Initialize(CmdInterface commandInterface, String meterType, String password, UInt16 meterNumber, UInt16 numberOfTrials, CultureInfo culture) + { + this.Password = password; + this.MeterNumber = meterNumber; + this.NumberOfTrials = numberOfTrials; + this.CommandInterface = commandInterface; + this.Culture = culture; + this.MeterIndex = (meterNumber + 1).ToString(culture); + this.MeterType = meterType; + + } + public Boolean PerformLogOn(CancellationToken token, out String debugMessage) + { + #region Definitions and initializations + Boolean reAuthentication = false; + Boolean Ok = false; + UInt16 Trials = 0; + Byte[] Password = new Byte[12] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + String DebugMessage = String.Empty; + #endregion + #region Get password + debugMessage = String.Empty; + if (this.Password.Count() != 12) + { + debugMessage = $"COMMAND CHANNEL:\t Password length wrong at {this.MeterType}{this.MeterIndex}\n"; + return Ok; + } + Boolean OnlyHex = Misc.OnlyHexInString(this.Password); + if (!OnlyHex) + { + if (String.IsNullOrEmpty(this.Password)) + debugMessage = $"COMMAND CHANNEL:\t Missing password at {this.MeterType}{this.MeterIndex}\n"; + else + debugMessage = $"COMMAND CHANNEL:\t Password contains invalid characters at {this.MeterType}{MeterIndex}\n"; + return Ok; + } + Password = Encoding.ASCII.GetBytes(this.Password); + #endregion + #region Send data to privilege register + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Boolean.Equals(Ok, false)) && (Boolean.Equals(reAuthentication, false))) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage($"COMMAND CHANNEL:\t Writing '8' to 'Privilege'-register at {this.MeterType}{this.MeterIndex}; Trial: {(Trials + 1).ToString(this.Culture)} of {this.NumberOfTrials}\n", this.Culture); + Ok = this.SetPrivilegeRegister(8, out DebugMessage); + + if (Ok) + GenesisZeroFlow.Display.DebugMessage($"COMMAND CHANNEL:\t Writing '8' to 'Privilege'-register successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + else + { + GenesisZeroFlow.Display.DebugMessage($"COMMAND CHANNEL:\t Writing '8' to 'Privilege'-register failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + if ((Byte.Equals(this.CommandInterface.Subreason, GP30ConfigExErrors.AccessDenied)) || (Byte.Equals(this.CommandInterface.Subreason, GP30ConfigExErrors.LockedOut))) + reAuthentication = true; + } + Trials++; + } + if (Boolean.Equals(Ok, false)) + return Ok; + + #endregion + #region Send data to password register + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Boolean.Equals(Ok, false)) && (Boolean.Equals(reAuthentication, false))) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage($"COMMAND CHANNEL:\t Writing to 'Password'-register at {this.MeterType}{this.MeterIndex}; Trial: {(Trials + 1).ToString(this.Culture)} of {this.NumberOfTrials}\n", this.Culture); + Ok = this.SetPasswordRegister(Password, out DebugMessage); + + if (Ok) + GenesisZeroFlow.Display.DebugMessage($"COMMAND CHANNEL:\t Writing to 'Password'-register successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + else + { + GenesisZeroFlow.Display.DebugMessage($"COMMAND CHANNEL:\t Writing to 'Password'-register failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + if ((Byte.Equals(this.CommandInterface.Subreason, GP30ConfigExErrors.AccessDenied)) || (Byte.Equals(this.CommandInterface.Subreason, GP30ConfigExErrors.LockedOut))) + reAuthentication = true; + } + Trials++; + } + if (Boolean.Equals(Ok, false)) + return Ok; + #endregion + #region Command memory + this.CommandInterface.GP30LastCommand = GP30Commands.MultipleWritedata; + this.CommandInterface.SetGP30LastRegister(GP30Registers.Password()); + #endregion + + return Ok; + } + public void Meter(Boolean enable, ref Task task, ref Boolean taskStarted, ref Boolean sequenceFailed, LogOn logOn, ref Int32 nextDelayTime, CancellationToken token) + { + #region Definitions and initializations + Int32 DelayTime = 0; + const Int32 DeltaDelay = 5; + DialogResult AskForActions = DialogResult.None; + var _sequenceFailed = sequenceFailed; + var _logOn = logOn; + String DebugMessage = String.Empty; + Int32 temp = DelayTime; + Boolean Ok = false; + #endregion + #region Avoid CA1062 + if (task == null) + return; + #endregion + #region Everything else + if ((enable) && (task.Status != TaskStatus.Running) && (!task.IsCompleted)) + { + DelayTime = nextDelayTime; + nextDelayTime = nextDelayTime + DeltaDelay; + + taskStarted = true; + Misc.WaitNSeconds(temp); + + task = Task.Run(() => + { + while ((DialogResult.Equals(AskForActions, DialogResult.Retry)) || (DialogResult.Equals(AskForActions, DialogResult.None))) + { + #region Login procedure + if (DialogResult.Equals(AskForActions, DialogResult.None)) + GenesisZeroFlow.Display.DebugMessage($"APPLICATION:\t\t LOGIN started at {this.MeterType}{this.MeterIndex}\n", this.Culture); + + Ok = _logOn.PerformLogOn(token, out DebugMessage); + + if (token.IsCancellationRequested) + { + GenesisZeroFlow.Display.DebugMessage($"APPLICATION:\t\t LOGIN aborted at {this.MeterType}{this.MeterIndex}\n", this.Culture); + return true; + } + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage($"APPLICATION:\t\t LOGIN successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + _sequenceFailed = false; + AskForActions = DialogResult.OK; + } + else + { + GenesisZeroFlow.Display.DebugMessage($"APPLICATION:\t\t LOGIN failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + _sequenceFailed = true; + AskForActions = AskHowToProceedSequence("LOGIN"); + } + #endregion + } + return _sequenceFailed; + }); + } + #endregion + } + private DialogResult AskHowToProceedSequence(String sequenceName) + { + DialogResult AskForActions; + + GenesisZeroFlow.Display.AbortButtonEnabled(false); + AskForActions = MessageBox.Show($"{sequenceName} failed at {this.MeterType}{this.MeterIndex}", "Retry?", MessageBoxButtons.RetryCancel, MessageBoxIcon.Question); + switch (AskForActions) + { + case DialogResult.Retry: + GenesisZeroFlow.Display.DebugMessage($"APPLICATION:\t\t {sequenceName} restarted at {this.MeterType}{this.MeterIndex}\n", this.Culture); + break; + case DialogResult.Cancel: + GenesisZeroFlow.Display.DebugMessage($"APPLICATION:\t\t {sequenceName} canceled at {this.MeterType}{this.MeterIndex}\n", this.Culture); + GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line, this.Culture); + break; + default: break; + } + GenesisZeroFlow.Display.AbortButtonEnabled(true); + + return AskForActions; + } + public void KeepAuthentified(Boolean enable, Boolean sequenceOk, Boolean taskCompleted, ref Int32 counter) + { + const Int32 CounterValue = 30; + + if (enable && taskCompleted && sequenceOk && (counter >= CounterValue)) + { + GenesisZeroFlow.Display.DebugMessage($"COMMAND CHANNEL:\t Keep authentified at {this.MeterType}{this.MeterIndex}\n", this.Culture); + String DebugMessage = String.Empty; + this.GetLedModeRegister(out DebugMessage); + counter = 0; + } + else + counter++; + } + private Boolean SetPrivilegeRegister(Int32 value, out String debugMessage) + { + #region Definitions and initializations + Byte[] Payload = new Byte[4] { 0, 0, 0, 0 }; + Boolean Ok = false; + Int32 ErrCode = GP30LowLevelErrors.NoError; + #endregion + #region Write register + Payload = BitConverter.GetBytes((Int32)value); + ErrCode = this.CommandInterface.WriteRegister(GP30Registers.Privilege(), Payload, true); + #endregion + #region Wait for answer + if (Int32.Equals(ErrCode, GP30LowLevelErrors.NoError)) + ErrCode = this.CommandInterface.RXProcessor(GP30RequestType.WriteRegister); + #endregion + #region Debug message + debugMessage = this.CommandInterface.LowLevelMessages(ErrCode, out Ok); + #endregion + + return Ok; + } + private Boolean SetPasswordRegister(Byte[] password, out String debugMessage) + { + #region Definitions and initializations + Boolean Ok = false; + Int32 ErrCode = GP30LowLevelErrors.NoError; + #endregion + #region Write register + ErrCode = this.CommandInterface.MultipleWriteRegister(GP30Registers.Password(), password, true); + #endregion + #region Wait for answer + if (Int32.Equals(ErrCode, GP30LowLevelErrors.NoError)) + ErrCode = this.CommandInterface.RXProcessor(GP30RequestType.MultipleWrite); + #endregion + #region Debug message + debugMessage = this.CommandInterface.LowLevelMessages(ErrCode, out Ok); + #endregion + + return Ok; + } + private Boolean GetLedModeRegister(out String debugMessage) + { + #region Definitions and initialisations + Boolean Ok = false; + Int32 ErrCode = GP30LowLevelErrors.NoError; + #endregion + #region Read register + ErrCode = this.CommandInterface.ReadRegister(GP30Registers.LedMode()); + #endregion + #region Wait for answer + if (Int32.Equals(ErrCode, GP30LowLevelErrors.NoError)) + ErrCode = this.CommandInterface.RXProcessor(GP30RequestType.ReadRegister); + #endregion + #region Debug message + debugMessage = this.CommandInterface.LowLevelMessages(ErrCode, out Ok); + #endregion + + return Ok; + } + + } +} \ No newline at end of file diff --git a/ZeroFlowTool/Logging.cs b/ZeroFlowTool/Logging.cs new file mode 100644 index 00000000..25b7e952 --- /dev/null +++ b/ZeroFlowTool/Logging.cs @@ -0,0 +1,144 @@ +using System; +using System.Threading.Tasks; +using System.IO; + + +namespace GenesisZeroFlow +{ + #region Static classes + //public partial class GenesisZeroFlow + //{ + + // public void CloseComportsSequence() + // { + // #region Definitions and initializations + // Boolean[] Ok = new Boolean[Constants.NumberOfMeters * 2]; + // String DebugMessage = String.Empty; + // Boolean SerialPortClosed = false; + // for (UInt16 ComportIndex = 0; ComportIndex < (Constants.NumberOfMeters * 2); ComportIndex++) + // Ok[ComportIndex] = false; + // #endregion + // #region Get serial ports + // SerialConfigCmdMeter1.Init(Constants.CmdMeter1); + // SerialConfigCmdMeter2.Init(Constants.CmdMeter2); + // SerialConfigCmdMeter3.Init(Constants.CmdMeter3); + // SerialConfigCmdMeter4.Init(Constants.CmdMeter4); + // SerialConfigCmdMeter5.Init(Constants.CmdMeter5); + // SerialConfigCmdMeter6.Init(Constants.CmdMeter6); + // SerialConfigCmdMeter7.Init(Constants.CmdMeter7); + // SerialConfigCmdMeter8.Init(Constants.CmdMeter8); + // SerialConfigCmdMeter9.Init(Constants.CmdMeter9); + // SerialConfigCmdMeter10.Init(Constants.CmdMeter10); + // SerialConfigDataMeter1.Init(Constants.DataMeter1); + // SerialConfigDataMeter2.Init(Constants.DataMeter2); + // SerialConfigDataMeter3.Init(Constants.DataMeter3); + // SerialConfigDataMeter4.Init(Constants.DataMeter4); + // SerialConfigDataMeter5.Init(Constants.DataMeter5); + // SerialConfigDataMeter6.Init(Constants.DataMeter6); + // SerialConfigDataMeter7.Init(Constants.DataMeter7); + // SerialConfigDataMeter8.Init(Constants.DataMeter8); + // SerialConfigDataMeter9.Init(Constants.DataMeter9); + // SerialConfigDataMeter10.Init(Constants.DataMeter10); + // #endregion + // #region Open comports + // SerialPortClosed = SerialConfigCmdMeter1.ClosePort(serialPortCmdMeter1, out DebugMessage); + // if (SerialPortClosed) + // Display.DebugMessage(DebugMessage); + // SerialPortClosed = SerialConfigCmdMeter2.ClosePort(serialPortCmdMeter2, out DebugMessage); + // if (SerialPortClosed) + // Display.DebugMessage(DebugMessage); + // SerialPortClosed = SerialConfigCmdMeter3.ClosePort(serialPortCmdMeter3, out DebugMessage); + // if (SerialPortClosed) + // Display.DebugMessage(DebugMessage); + // SerialPortClosed = SerialConfigCmdMeter4.ClosePort(serialPortCmdMeter4, out DebugMessage); + // if (SerialPortClosed) + // Display.DebugMessage(DebugMessage); + // SerialPortClosed = SerialConfigCmdMeter5.ClosePort(serialPortCmdMeter5, out DebugMessage); + // if (SerialPortClosed) + // Display.DebugMessage(DebugMessage); + // SerialPortClosed = SerialConfigCmdMeter6.ClosePort(serialPortCmdMeter6, out DebugMessage); + // if (SerialPortClosed) + // Display.DebugMessage(DebugMessage); + // SerialPortClosed = SerialConfigCmdMeter7.ClosePort(serialPortCmdMeter7, out DebugMessage); + // if (SerialPortClosed) + // Display.DebugMessage(DebugMessage); + // SerialPortClosed = SerialConfigCmdMeter8.ClosePort(serialPortCmdMeter8, out DebugMessage); + // if (SerialPortClosed) + // Display.DebugMessage(DebugMessage); + // SerialPortClosed = SerialConfigCmdMeter9.ClosePort(serialPortCmdMeter9, out DebugMessage); + // if (SerialPortClosed) + // Display.DebugMessage(DebugMessage); + // SerialPortClosed = SerialConfigCmdMeter10.ClosePort(serialPortCmdMeter10, out DebugMessage); + // if (SerialPortClosed) + // Display.DebugMessage(DebugMessage); + // SerialPortClosed = SerialConfigDataMeter1.ClosePort(serialPortDataMeter1, out DebugMessage); + // if (SerialPortClosed) + // Display.DebugMessage(DebugMessage); + // SerialPortClosed = SerialConfigDataMeter2.ClosePort(serialPortDataMeter2, out DebugMessage); + // if (SerialPortClosed) + // Display.DebugMessage(DebugMessage); + // SerialPortClosed = SerialConfigDataMeter3.ClosePort(serialPortDataMeter3, out DebugMessage); + // if (SerialPortClosed) + // Display.DebugMessage(DebugMessage); + // SerialPortClosed = SerialConfigDataMeter4.ClosePort(serialPortDataMeter4, out DebugMessage); + // if (SerialPortClosed) + // Display.DebugMessage(DebugMessage); + // SerialPortClosed = SerialConfigDataMeter5.ClosePort(serialPortDataMeter5, out DebugMessage); + // if (SerialPortClosed) + // Display.DebugMessage(DebugMessage); + // SerialPortClosed = SerialConfigDataMeter6.ClosePort(serialPortDataMeter6, out DebugMessage); + // if (SerialPortClosed) + // Display.DebugMessage(DebugMessage); + // SerialPortClosed = SerialConfigDataMeter7.ClosePort(serialPortDataMeter7, out DebugMessage); + // if (SerialPortClosed) + // Display.DebugMessage(DebugMessage); + // SerialPortClosed = SerialConfigDataMeter8.ClosePort(serialPortDataMeter8, out DebugMessage); + // if (SerialPortClosed) + // Display.DebugMessage(DebugMessage); + // SerialPortClosed = SerialConfigDataMeter9.ClosePort(serialPortDataMeter9, out DebugMessage); + // if (SerialPortClosed) + // Display.DebugMessage(DebugMessage); + // SerialPortClosed = SerialConfigDataMeter10.ClosePort(serialPortDataMeter10, out DebugMessage); + // if (SerialPortClosed) + // Display.DebugMessage(DebugMessage); + // #endregion + // } + //} + public static partial class Logging + { + public static void AppendToFile(String data, String path) + { + Task.Run(() => + { + using (StreamWriter sw = File.AppendText(path)) + { + sw.Write(data); + } + }); + } + + public static void WriteToFile(String data, String path) + { + String temp = data; + + Task.Run(() => + { + try + { + using (StreamWriter sw = File.CreateText(path)) + { + sw.Write(temp); + } + } + catch (Exception) + { + //todo ex handling + } + + }); + } + } + + #endregion + +} \ No newline at end of file diff --git a/ZeroFlowTool/MathFuncsDll.dll b/ZeroFlowTool/MathFuncsDll.dll new file mode 100644 index 00000000..637333d3 Binary files /dev/null and b/ZeroFlowTool/MathFuncsDll.dll differ diff --git a/ZeroFlowTool/Maths.cs b/ZeroFlowTool/Maths.cs new file mode 100644 index 00000000..28e08f93 --- /dev/null +++ b/ZeroFlowTool/Maths.cs @@ -0,0 +1,181 @@ +using System; +using System.Collections.Generic; + +namespace GenesisZeroFlow +{ + + public enum InitialCrcValue { Zeros, Nonzero1 = 0xffff, Nonzero2 = 0x1D0F } + + public class Crc16Ccitt + { + const ushort poly = 4129; + ushort[] table = new ushort[256]; + ushort initialValue = 0; + + public ushort ComputeChecksum(byte[] data) + { + #region CA1062 + if (data == null) + return 0; + #endregion + + ushort crc = this.initialValue; + for (int i = 0; i < data.Length; ++i) + { + crc = (ushort)((crc << 8) ^ table[((crc >> 8) ^ (0xff & data[i]))]); + } + return crc; + } + + public byte[] ComputeChecksumBytes(byte[] data) + { + ushort crc = ComputeChecksum(data); + return BitConverter.GetBytes(crc); + } + + public Crc16Ccitt(InitialCrcValue initialValue) + { + this.initialValue = (ushort)initialValue; + ushort temp, a; + for (int i = 0; i < table.Length; ++i) + { + temp = 0; + a = (ushort)(i << 8); + for (int j = 0; j < 8; ++j) + { + if (((temp ^ a) & 0x8000) != 0) + { + temp = (ushort)((temp << 1) ^ poly); + } + else + { + temp <<= 1; + } + a <<= 1; + } + table[i] = temp; + } + } + } + + public static class MyListExtensions + { + public static double Mean(this List values) + { + #region CA1062 + if (values == null) + return 0; + #endregion + + return values.Count == 0 ? 0 : values.Mean(0, values.Count); + } + + public static double Mean(this List values, int start, int end) + { + #region CA1062 + if (values == null) + return 0; + #endregion + double s = 0; + + for (int i = start; i < end; i++) + { + s += values[i]; + } + + return s / (end - start); + } + + public static double Variance(this List values) + { + #region CA1062 + if (values == null) + return 0; + #endregion + + return values.Variance(values.Mean(), 0, values.Count); + } + + public static double Variance(this List values, double mean) + { + #region CA1062 + if (values == null) + return 0; + #endregion + + return values.Variance(mean, 0, values.Count); + } + + public static double Variance(this List values, double mean, int start, int end) + { + #region CA1062 + if (values == null) + return 0; + #endregion + + double variance = 0; + + + for (int i = start; i < end; i++) + { + variance += (double)Math.Pow((values[i] - mean), 2); + } + + int n = end - start; + if (start > 0) n -= 1; + + return variance / (n); + } + + public static double StandardDeviation(this List values) + { + #region CA1062 + if (values == null) + return 0; + #endregion + + return values.Count == 0 ? 0 : values.StandardDeviation(0, values.Count); + } + + public static double StandardDeviation(this List values, int start, int end) + { + double mean = values.Mean(start, end); + double variance = values.Variance(mean, start, end); + + return (double)Math.Sqrt(variance); + } + + } + + /* + public class HexadecimalEncoding + { + public static string ToHexString(string str) + { + var sb = new StringBuilder(); + + var bytes = Encoding.Unicode.GetBytes(str); + foreach (var t in bytes) + { + sb.Append(t.ToString("X2")); + } + + return sb.ToString(); // returns: "48656C6C6F20776F726C64" for "Hello world" + } + + + public static string FromHexString(string hexString) + { + var bytes = new byte[hexString.Length / 2]; + for (var i = 0; i < bytes.Length; i++) + { + bytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16); + } + + return Encoding.Unicode.GetString(bytes); // returns: "Hello world" for "48656C6C6F20776F726C64" + } + + + } + */ +} \ No newline at end of file diff --git a/ZeroFlowTool/Mean.cs b/ZeroFlowTool/Mean.cs new file mode 100644 index 00000000..bc89d76e --- /dev/null +++ b/ZeroFlowTool/Mean.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Globalization; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Drawing.Printing; +using ZedGraph; +using System.IO; + diff --git a/ZeroFlowTool/Meter.png b/ZeroFlowTool/Meter.png new file mode 100644 index 00000000..bbf2d35f Binary files /dev/null and b/ZeroFlowTool/Meter.png differ diff --git a/ZeroFlowTool/Miscellanous.cs b/ZeroFlowTool/Miscellanous.cs new file mode 100644 index 00000000..cf0c75fd --- /dev/null +++ b/ZeroFlowTool/Miscellanous.cs @@ -0,0 +1,436 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Threading; +using System.Globalization; + +namespace GenesisZeroFlow +{ + + public static class TaskOperations + { + + public static Boolean[] GetResultTotal(Boolean[] enable, Task Task1, Task Task2, Task Task3, Task Task4, Task Task5, Task Task6, Task Task7, Task Task8, Task Task9, Task Task10) + { + #region Definitions and initializations + Boolean[] failed = new Boolean[Constants.NumberOfMeters]; + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + failed[Meter] = false; + #endregion + #region Individual tasks + failed[Constants.Meter1] = GetResult(enable[Constants.Meter1], Task1); + failed[Constants.Meter2] = GetResult(enable[Constants.Meter2], Task2); + failed[Constants.Meter3] = GetResult(enable[Constants.Meter3], Task3); + failed[Constants.Meter4] = GetResult(enable[Constants.Meter4], Task4); + failed[Constants.Meter5] = GetResult(enable[Constants.Meter5], Task5); + failed[Constants.Meter6] = GetResult(enable[Constants.Meter6], Task6); + failed[Constants.Meter7] = GetResult(enable[Constants.Meter7], Task7); + failed[Constants.Meter8] = GetResult(enable[Constants.Meter8], Task8); + failed[Constants.Meter9] = GetResult(enable[Constants.Meter9], Task9); + failed[Constants.Meter10] = GetResult(enable[Constants.Meter10], Task10); + #endregion + + return failed; + } + public static Boolean GetResult(Boolean enable, Task CurrentTask) + { + Boolean failed = false; + + if (enable) + { + if (!TaskStatus.Equals(CurrentTask.Status, TaskStatus.Running)) + { + if (TaskStatus.Equals(CurrentTask.Status, TaskStatus.RanToCompletion)) + return CurrentTask.Result; + if (TaskStatus.Equals(CurrentTask.Status, TaskStatus.Faulted)) + return true; + if (TaskStatus.Equals(CurrentTask.Status, TaskStatus.Canceled)) + return true; + } + /* + else + { + if (CurrentTask.Status == TaskStatus.Created) + { + CurrentTask = Task.Run(() => + { + return true; + }); + while (CurrentTask.Status != TaskStatus.RanToCompletion) { }; + CurrentTask.Dispose(); + } + } + */ + } + return failed; + } + public static void CheckAndDispose(ref Task CurrentTask) + { + if ((TaskStatus.Equals(CurrentTask.Status, TaskStatus.RanToCompletion)) || (TaskStatus.Equals(CurrentTask.Status, TaskStatus.Canceled)) || (TaskStatus.Equals(CurrentTask.Status, TaskStatus.Faulted))) + CurrentTask.Dispose(); + } + public static void CheckAndDispose(Task CurrentTask) + { + if ((TaskStatus.Equals(CurrentTask.Status, TaskStatus.RanToCompletion)) || (TaskStatus.Equals(CurrentTask.Status, TaskStatus.Canceled)) || (TaskStatus.Equals(CurrentTask.Status, TaskStatus.Faulted))) + CurrentTask.Dispose(); + } + public static Boolean WaitFor(Task task) + { + return WaitFor(true, task); + } + public static Boolean WaitFor(Boolean taskStarted, Task task) + { + #region CA1062 + if (task == null) + return false; + #endregion + Boolean Completed = true; + + if (taskStarted) + { + if ((TaskStatus.Equals(task.Status, TaskStatus.RanToCompletion)) || (TaskStatus.Equals(task.Status, TaskStatus.Faulted)) || (TaskStatus.Equals(task.Status, TaskStatus.Canceled))) + Completed = true; + else + Completed = false; + + } + /* + else + { + task = Task.Run(() => + { + return true; + }); + + while( task.Status != TaskStatus.RanToCompletion){ }; + return true; + } */ + + return Completed; + } + } + + public static partial class ArrayInit + { + public static UInt16[] Path(UInt16 value) + { + UInt16[] array = new UInt16[Constants.NumberOfPaths]; + + try + { + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + array[Path] = value; + } + catch + { + + } + + return array; + } + + public static Int32[] Path(Int32 value) + { + Int32[] array = new Int32[Constants.NumberOfPaths]; + + try + { + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + array[Path] = value; + } + catch + { + + } + + return array; + } + + public static Double[] Path(Double value) + { + Double[] array = new Double[Constants.NumberOfPaths]; + + try + { + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + array[Path] = value; + } + catch + { + + } + + return array; + } + + public static Boolean[] Path(Boolean value) + { + Boolean[] array = new Boolean[Constants.NumberOfPaths]; + + try + { + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + array[Path] = value; + } + catch + { + + } + + return array; + } + + public static UInt16[] Thermo(UInt16 value) + { + UInt16[] array = new UInt16[Constants.NumberOfThermometers]; + + try + { + for (UInt16 Thermo = Constants.Thermo1; Thermo < Constants.NumberOfThermometers; Thermo++) + array[Thermo] = value; + } + catch + { + + } + + return array; + } + + public static Int32[] Thermo(Int32 value) + { + Int32[] array = new Int32[Constants.NumberOfThermometers]; + + try + { + for (UInt16 Thermo = Constants.Thermo1; Thermo < Constants.NumberOfThermometers; Thermo++) + array[Thermo] = value; + } + catch + { + + } + + return array; + } + + public static Double[] Thermo(Double value) + { + Double[] array = new Double[Constants.NumberOfThermometers]; + + try + { + for (UInt16 Thermo = Constants.Thermo1; Thermo < Constants.NumberOfThermometers; Thermo++) + array[Thermo] = value; + } + catch + { + + } + + return array; + } + + public static Boolean[] Thermo(Boolean value) + { + Boolean[] array = new Boolean[Constants.NumberOfThermometers]; + + try + { + for (UInt16 Thermo = Constants.PATH0; Thermo < Constants.NumberOfThermometers; Thermo++) + array[Thermo] = value; + } + catch + { + + } + + return array; + } + + public static UInt16[] Meter(UInt16 value) + { + UInt16[] array = new UInt16[Constants.NumberOfMeters]; + + try + { + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + array[Meter] = value; + } + catch + { + + } + + return array; + } + + public static Int32[] Meter(Int32 value) + { + Int32[] array = new Int32[Constants.NumberOfMeters]; + + try + { + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + array[Meter] = value; + } + catch + { + + } + + return array; + } + + public static Double[] Meter(Double value) + { + Double[] array = new Double[Constants.NumberOfMeters]; + + try + { + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + array[Meter] = value; + } + catch + { + + } + + return array; + } + + public static Boolean[] Meter(Boolean value) + { + Boolean[] array = new Boolean[Constants.NumberOfMeters]; + + try + { + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + array[Meter] = value; + } + catch + { + + } + + return array; + } + } + + public static partial class Misc + { + + + + public static Double Minimum(Double valueA, Double valueB) + { + if (valueA < valueB) + return valueA; + else + return valueB; + } + + public static Boolean[] Subarray(Boolean[] data, Int32 offset, Int32 width) + { + if (data.Count() < width + offset) + return null; + + Boolean[] subdata = new Boolean[width]; + + for (UInt16 i = 0; i < width; i++) + subdata[i] = data[offset + i]; + return subdata; + } + + public static Byte[] Subarray(Byte[] data, Int32 offset, Int32 width) + { + if (data.Count() < width + offset) + return null; + + Byte[] subdata = new Byte[width]; + + for (UInt16 i = 0; i < width; i++) + subdata[i] = data[offset + i]; + return subdata; + } + + public static void WaitForDebuging(Int32 value, CultureInfo culture) + { + for (Int32 i = value; i > 0; i--) + { + GenesisZeroFlow.Display.StatusLabel(i.ToString(culture)); + WaitNSeconds(1); + } + } + + public static Boolean OnlyDecimalInString(String data) + { + return (System.Text.RegularExpressions.Regex.IsMatch(data, @"^[0-9]+(\.[0-9]+)?$")); + } + + public static Boolean OnlyHexInString(String data) + { + // For C-style hex notation (0xFF) you can use @"\A\b(0[xX])?[0-9a-fA-F]+\b\Z" + return System.Text.RegularExpressions.Regex.IsMatch(data, @"\A\b[0-9a-fA-F]+\b\Z"); + } + + + public static void WaitCondition(Boolean condition) + { + if (condition) + Application.DoEvents(); + } + + + public static void WaitNSeconds(Int32 seconds, bool fromGui = false) + { + fromGui = true; + if (fromGui) + { + if (seconds < 1) return; + TimeSpan ts = new TimeSpan(); + DateTime _desired = DateTime.Now.AddSeconds(seconds); + while (DateTime.Now < _desired) + { + Application.DoEvents(); + Thread.Sleep(100); + + } + } + else + { + Thread.Sleep(seconds * 1000); + } + } + + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1011:ConsiderPassingBaseTypesAsParameters")] + + + public static void WaitNMilliseconds(Int32 milliseconds, bool fromGui = false) + { + //if (fromGui) + //{ + // if (milliseconds < 1) return; + // TimeSpan ts = new TimeSpan(); + // DateTime _desired = DateTime.Now.AddMilliseconds(milliseconds); + // while (DateTime.Now < _desired) + // { + // Application.DoEvents(); + // Thread.Sleep(1); + + // } + //} + //else + //{ + Thread.Sleep(milliseconds); + // } + } + + + + + + } +} \ No newline at end of file diff --git a/ZeroFlowTool/NLog.config b/ZeroFlowTool/NLog.config new file mode 100644 index 00000000..7a0f3aa1 --- /dev/null +++ b/ZeroFlowTool/NLog.config @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/ZeroFlowTool/NLog.xsd b/ZeroFlowTool/NLog.xsd new file mode 100644 index 00000000..1bd61d8b --- /dev/null +++ b/ZeroFlowTool/NLog.xsd @@ -0,0 +1,3162 @@ + + + + + + + + + + + + + + + Watch config file for changes and reload automatically. + + + + + Print internal NLog messages to the console. Default value is: false + + + + + Print internal NLog messages to the console error output. Default value is: false + + + + + Write internal NLog messages to the specified file. + + + + + Log level threshold for internal log messages. Default value is: Info. + + + + + Global log level threshold for application log messages. Messages below this level won't be logged.. + + + + + Throw an exception when there is an internal error. Default value is: false. + + + + + Throw an exception when there is a configuration error. If not set, determined by throwExceptions. + + + + + Gets or sets a value indicating whether Variables should be kept on configuration reload. Default value is: false. + + + + + Write internal NLog messages to the System.Diagnostics.Trace. Default value is: false. + + + + + Write timestamps for internal NLog messages. Default value is: true. + + + + + Use InvariantCulture as default culture instead of CurrentCulture. Default value is: false. + + + + + Perform mesage template parsing and formatting of LogEvent messages (true = Always, false = Never, empty = Auto Detect). Default value is: empty. + + + + + + + + + + + + + + Make all targets within this section asynchronous (creates additional threads but the calling thread isn't blocked by any target writes). + + + + + + + + + + + + + + + + + Prefix for targets/layout renderers/filters/conditions loaded from this assembly. + + + + + Load NLog extensions from the specified file (*.dll) + + + + + Load NLog extensions from the specified assembly. Assembly name should be fully qualified. + + + + + + + + + + Name of the logger. May include '*' character which acts like a wildcard. Allowed forms are: *, Name, *Name, Name* and *Name* + + + + + Comma separated list of levels that this rule matches. + + + + + Minimum level that this rule matches. + + + + + Maximum level that this rule matches. + + + + + Level that this rule matches. + + + + + Comma separated list of target names. + + + + + Ignore further rules if this one matches. + + + + + Enable or disable logging rule. Disabled rules are ignored. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the file to be included. You could use * wildcard. The name is relative to the name of the current config file. + + + + + Ignore any errors in the include file. + + + + + + + Variable name. + + + + + Variable value. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Number of log events that should be processed in a batch by the lazy writer thread. + + + + + Limit of full s to write before yielding into Performance is better when writing many small batches, than writing a single large batch + + + + + Action to be taken when the lazy writer thread request queue count exceeds the set limit. + + + + + Limit on the number of requests in the lazy writer thread request queue. + + + + + Time in milliseconds to sleep between batches. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + Delay the flush until the LogEvent has been confirmed as written + + + + + Condition expression. Log events who meet this condition will cause a flush on the wrapped target. + + + + + Name of the target. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Number of log events to be buffered. + + + + + Timeout (in milliseconds) after which the contents of buffer will be flushed if there's no write in the specified period of time. Use -1 to disable timed flushes. + + + + + Action to take if the buffer overflows. + + + + + Indicates whether to use sliding timeout. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Encoding to be used. + + + + + Instance of that is used to format log messages. + + + + + End of line value if a newline is appended at the end of log message . + + + + + Maximum message size in bytes. + + + + + Indicates whether to append newline at the end of log message. + + + + + Action that should be taken if the will be more connections than . + + + + + Maximum queue size. + + + + + Maximum current connections. 0 = no maximum. + + + + + Indicates whether to keep connection open whenever possible. + + + + + Size of the connection cache (number of connections which are kept alive). + + + + + Network address. + + + + + Action that should be taken if the message is larger than maxMessageSize. + + + + + NDLC item separator. + + + + + NDC item separator. + + + + + Indicates whether to include NLog-specific extensions to log4j schema. + + + + + Indicates whether to include source info (file name and line number) in the information sent over the network. + + + + + Indicates whether to include contents of the stack. + + + + + Indicates whether to include stack contents. + + + + + Indicates whether to include dictionary contents. + + + + + Indicates whether to include dictionary contents. + + + + + Indicates whether to include call site (class and method name) in the information sent over the network. + + + + + Option to include all properties from the log events + + + + + AppInfo field. By default it's the friendly name of the current AppDomain. + + + + + Renderer for log4j:event logger-xml-attribute (Default ${logger}) + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + Layout that should be use to calcuate the value for the parameter. + + + + + Viewer parameter name. + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + Indicates whether to auto-check if the console is available. - Disables console writing if Environment.UserInteractive = False (Windows Service) - Disables console writing if Console Standard Input is not available (Non-Console-App) + + + + + The encoding for writing messages to the . + + + + + Indicates whether the error stream (stderr) should be used instead of the output stream (stdout). + + + + + Indicates whether to use default row highlighting rules. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Condition that must be met in order to set the specified foreground and background color. + + + + + Background color. + + + + + Foreground color. + + + + + + + + + + + + + + + + Compile the ? This can improve the performance, but at the costs of more memory usage. If false, the Regex Cache is used. + + + + + Indicates whether to ignore case when comparing texts. + + + + + Regular expression to be matched. You must specify either text or regex. + + + + + Text to be matched. You must specify either text or regex. + + + + + Indicates whether to match whole words only. + + + + + Background color. + + + + + Foreground color. + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + Indicates whether to auto-check if the console is available - Disables console writing if Environment.UserInteractive = False (Windows Service) - Disables console writing if Console Standard Input is not available (Non-Console-App) + + + + + The encoding for writing messages to the . + + + + + Indicates whether to send the log messages to the standard error instead of the standard output. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Obsolete - value will be ignored! The logging code always runs outside of transaction. Gets or sets a value indicating whether to use database transactions. Some data providers require this. + + + + + Database user name. If the ConnectionString is not provided this value will be used to construct the "User ID=" part of the connection string. + + + + + Name of the database provider. + + + + + Database password. If the ConnectionString is not provided this value will be used to construct the "Password=" part of the connection string. + + + + + Indicates whether to keep the database connection open between the log events. + + + + + Database name. If the ConnectionString is not provided this value will be used to construct the "Database=" part of the connection string. + + + + + Name of the connection string (as specified in <connectionStrings> configuration section. + + + + + Connection string. When provided, it overrides the values specified in DBHost, DBUserName, DBPassword, DBDatabase. + + + + + Database host name. If the ConnectionString is not provided this value will be used to construct the "Server=" part of the connection string. + + + + + Connection string using for installation and uninstallation. If not provided, regular ConnectionString is being used. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + Text of the SQL command to be run on each log level. + + + + + Type of the SQL command to be run on each log level. + + + + + + + + + + + + + + + + + + + + + + + Type of the command. + + + + + Connection string to run the command against. If not provided, connection string from the target is used. + + + + + Indicates whether to ignore failures. + + + + + Command text. + + + + + + + + + + + + + + Layout that should be use to calcuate the value for the parameter. + + + + + Database parameter name. + + + + + Database parameter precision. + + + + + Database parameter scale. + + + + + Database parameter size. + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Layout that renders event Category. + + + + + Optional entrytype. When not set, or when not convertable to then determined by + + + + + Layout that renders event ID. + + + + + Name of the Event Log to write to. This can be System, Application or any user-defined name. + + + + + Name of the machine on which Event Log service is running. + + + + + Maximum Event log size in kilobytes. If null, the value won't be set. Default is 512 Kilobytes as specified by Eventlog API + + + + + Message length limit to write to the Event Log. + + + + + Value to be used as the event Source. + + + + + Action to take if the message is larger than the option. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Indicates whether to return to the first target after any successful write. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + File encoding. + + + + + Line ending mode. + + + + + Indicates whether to compress archive files into the zip archive format. + + + + + Way file archives are numbered. + + + + + Name of the file to be used for an archive. + + + + + Is the an absolute or relative path? + + + + + Indicates whether to automatically archive log files every time the specified time passes. + + + + + Size in bytes above which log files will be automatically archived. Warning: combining this with isn't supported. We cannot create multiple archive files, if they should have the same name. Choose: + + + + + Maximum number of archive files that should be kept. + + + + + Indicates whether the footer should be written only when the file is archived. + + + + + Maximum number of log filenames that should be stored as existing. + + + + + Name of the file to write to. + + + + + Value specifying the date format to use when archiving files. + + + + + Indicates whether to archive old log file on startup. + + + + + Cleanup invalid values in a filename, e.g. slashes in a filename. If set to true, this can impact the performance of massive writes. If set to false, nothing gets written when the filename is wrong. + + + + + Indicates whether to create directories if they do not exist. + + + + + Indicates whether to delete old log file on startup. + + + + + File attributes (Windows only). + + + + + Indicates whether to write BOM (byte order mark) in created files + + + + + Indicates whether to enable log file(s) to be deleted. + + + + + Indicates whether to replace file contents on each write instead of appending log message at the end. + + + + + Value indicationg whether file creation calls should be synchronized by a system global mutex. + + + + + Gets or set a value indicating whether a managed file stream is forced, instead of using the native implementation. + + + + + Is the an absolute or relative path? + + + + + Indicates whether concurrent writes to the log file by multiple processes on the same host. + + + + + Whether or not this target should just discard all data that its asked to write. Mostly used for when testing NLog Stack except final write + + + + + Delay in milliseconds to wait before attempting to write to the file again. + + + + + Indicates whether concurrent writes to the log file by multiple processes on different network hosts. + + + + + Number of files to be kept open. Setting this to a higher value may improve performance in a situation where a single File target is writing to many files (such as splitting by level or by logger). + + + + + Maximum number of seconds that files are kept open. If this number is negative the files are not automatically closed after a period of inactivity. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + Log file buffer size in bytes. + + + + + Indicates whether to automatically flush the file buffers after each log message. + + + + + Number of times the write is appended on the file before NLog discards the log message. + + + + + Indicates whether to keep log file open instead of opening and closing it on each logging event. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Condition expression. Log events who meet this condition will be forwarded to the wrapped target. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Windows domain name to change context to. + + + + + Required impersonation level. + + + + + Type of the logon provider. + + + + + Logon Type. + + + + + User account password. + + + + + Indicates whether to revert to the credentials of the process instead of impersonating another user. + + + + + Username to change context to. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Interval in which messages will be written up to the number of messages. + + + + + Maximum allowed number of messages written per . + + + + + Name of the target. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Endpoint address. + + + + + Name of the endpoint configuration in WCF configuration file. + + + + + Indicates whether to use a WCF service contract that is one way (fire and forget) or two way (request-reply) + + + + + Client ID. + + + + + Indicates whether to include per-event properties in the payload sent to the server. + + + + + Indicates whether to use binary message encoding. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + Layout that should be use to calculate the value for the parameter. + + + + + Name of the parameter. + + + + + Type of the parameter. + + + + + Type of the parameter. Obsolete alias for + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + Indicates whether NewLine characters in the body should be replaced with tags. + + + + + Priority used for sending mails. + + + + + Encoding to be used for sending e-mail. + + + + + BCC email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com). + + + + + CC email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com). + + + + + Indicates whether to add new lines between log entries. + + + + + Indicates whether to send message as HTML instead of plain text. + + + + + Sender's email address (e.g. joe@domain.com). + + + + + Mail message body (repeated for each log message send in one mail). + + + + + Mail subject. + + + + + Recipients' email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com). + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + Indicates the SMTP client timeout. + + + + + SMTP Server to be used for sending. + + + + + SMTP Authentication mode. + + + + + Username used to connect to SMTP server (used when SmtpAuthentication is set to "basic"). + + + + + Password used to authenticate against SMTP server (used when SmtpAuthentication is set to "basic"). + + + + + Indicates whether SSL (secure sockets layer) should be used when communicating with SMTP server. + + + + + Port number that SMTP Server is listening on. + + + + + Indicates whether the default Settings from System.Net.MailSettings should be used. + + + + + Folder where applications save mail messages to be processed by the local SMTP server. + + + + + Specifies how outgoing email messages will be handled. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Class name. + + + + + Method name. The method must be public and static. Use the AssemblyQualifiedName , https://msdn.microsoft.com/en-us/library/system.type.assemblyqualifiedname(v=vs.110).aspx e.g. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Encoding to be used. + + + + + End of line value if a newline is appended at the end of log message . + + + + + Maximum message size in bytes. + + + + + Indicates whether to append newline at the end of log message. + + + + + Network address. + + + + + Size of the connection cache (number of connections which are kept alive). + + + + + Indicates whether to keep connection open whenever possible. + + + + + Maximum current connections. 0 = no maximum. + + + + + Maximum queue size. + + + + + Action that should be taken if the will be more connections than . + + + + + Action that should be taken if the message is larger than maxMessageSize. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Encoding to be used. + + + + + Instance of that is used to format log messages. + + + + + End of line value if a newline is appended at the end of log message . + + + + + Maximum message size in bytes. + + + + + Indicates whether to append newline at the end of log message. + + + + + Action that should be taken if the will be more connections than . + + + + + Maximum queue size. + + + + + Maximum current connections. 0 = no maximum. + + + + + Indicates whether to keep connection open whenever possible. + + + + + Size of the connection cache (number of connections which are kept alive). + + + + + Network address. + + + + + Action that should be taken if the message is larger than maxMessageSize. + + + + + NDLC item separator. + + + + + NDC item separator. + + + + + Indicates whether to include NLog-specific extensions to log4j schema. + + + + + Indicates whether to include source info (file name and line number) in the information sent over the network. + + + + + Indicates whether to include contents of the stack. + + + + + Indicates whether to include stack contents. + + + + + Indicates whether to include dictionary contents. + + + + + Indicates whether to include dictionary contents. + + + + + Indicates whether to include call site (class and method name) in the information sent over the network. + + + + + Option to include all properties from the log events + + + + + AppInfo field. By default it's the friendly name of the current AppDomain. + + + + + Renderer for log4j:event logger-xml-attribute (Default ${logger}) + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Indicates whether to perform layout calculation. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Indicates whether performance counter should be automatically created. + + + + + Name of the performance counter category. + + + + + Counter help text. + + + + + Name of the performance counter. + + + + + Performance counter type. + + + + + The value by which to increment the counter. + + + + + Performance counter instance name. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Default filter to be applied when no specific rule matches. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + Condition to be tested. + + + + + Resulting filter to be applied when the condition matches. + + + + + + + + + + + + + Name of the target. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + Name of the target. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + Number of times to repeat each log message. + + + + + + + + + + + + + + + + + Name of the target. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + Number of retries that should be attempted on the wrapped target in case of a failure. + + + + + Time to wait between retries in milliseconds. + + + + + + + + + + + + + + + Name of the target. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + Name of the target. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Always use independent of + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + Should we include the BOM (Byte-order-mark) for UTF? Influences the property. This will only work for UTF-8. + + + + + Web service method name. Only used with Soap. + + + + + Web service namespace. Only used with Soap. + + + + + Protocol to be used when calling web service. + + + + + Custom proxy address, include port separated by a colon + + + + + Encoding. + + + + + Web service URL. + + + + + Value whether escaping be done according to the old NLog style (Very non-standard) + + + + + Value whether escaping be done according to Rfc3986 (Supports Internationalized Resource Identifiers - IRIs) + + + + + Indicates whether to pre-authenticate the HttpWebRequest (Requires 'Authorization' in parameters) + + + + + Name of the root XML element, if POST of XML document chosen. If so, this property must not be null. (see and ). + + + + + (optional) root namespace of the XML document, if POST of XML document chosen. (see and ). + + + + + Proxy configuration when calling web service + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Footer layout. + + + + + Header layout. + + + + + Body layout (can be repeated multiple times). + + + + + Custom column delimiter value (valid when ColumnDelimiter is set to 'Custom'). + + + + + Column delimiter. + + + + + Quote Character. + + + + + Quoting mode. + + + + + Indicates whether CVS should include header. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Layout of the column. + + + + + Name of the column. + + + + + + + + + + + + + + + + + + + List of property names to exclude when is true + + + + + Option to include all properties from the log event (as JSON) + + + + + Indicates whether to include contents of the dictionary. + + + + + Indicates whether to include contents of the dictionary. + + + + + Option to render the empty object value {} + + + + + Option to suppress the extra spaces in the output json + + + + + How far should the JSON serializer follow object references before backing off + + + + + + + + + + + + + + + + Layout that will be rendered as the attribute's value. + + + + + Name of the attribute. + + + + + Determines wether or not this attribute will be Json encoded. + + + + + Indicates whether to escape non-ascii characters + + + + + Whether an attribute with empty value should be included in the output + + + + + + + + + + + + + + Footer layout. + + + + + Header layout. + + + + + Body layout (can be repeated multiple times). + + + + + + + + + + + + + + + + + + Option to include all properties from the log events + + + + + Indicates whether to include contents of the dictionary. + + + + + Indicates whether to include contents of the dictionary. + + + + + Indicates whether to include contents of the stack. + + + + + Indicates whether to include contents of the stack. + + + + + + + + + + + + + + Layout text. + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + Condition expression. + + + + + + + + + + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + Indicates whether to ignore case when comparing strings. + + + + + Layout to be used to filter log messages. + + + + + Substring to be matched. + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + String to compare the layout to. + + + + + Indicates whether to ignore case when comparing strings. + + + + + Layout to be used to filter log messages. + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + Indicates whether to ignore case when comparing strings. + + + + + Layout to be used to filter log messages. + + + + + Substring to be matched. + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + String to compare the layout to. + + + + + Indicates whether to ignore case when comparing strings. + + + + + Layout to be used to filter log messages. + + + + + + + + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + Default number of unique filter values to expect, will automatically increase if needed + + + + + Applies the configured action to the initial logevent that starts the timeout period. Used to configure that it should ignore all events until timeout. + + + + + Layout to be used to filter log messages. + + + + + Max number of unique filter values to expect simultaneously + + + + + Max length of filter values, will truncate if above limit + + + + + How long before a filter expires, and logging is accepted again + + + + + Default buffer size for the internal buffers + + + + + Reuse internal buffers, and doesn't have to constantly allocate new buffers + + + + + Append FilterCount to the when an event is no longer filtered + + + + + Insert FilterCount value into when an event is no longer filtered + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ZeroFlowTool/NormalImage.gif b/ZeroFlowTool/NormalImage.gif new file mode 100644 index 00000000..c42bf9d0 Binary files /dev/null and b/ZeroFlowTool/NormalImage.gif differ diff --git a/ZeroFlowTool/OBS_settings.txt b/ZeroFlowTool/OBS_settings.txt new file mode 100644 index 00000000..34db6df3 --- /dev/null +++ b/ZeroFlowTool/OBS_settings.txt @@ -0,0 +1 @@ +;;;;;;115200;8;COM15;None;None;None;0;0;0;0;0;65535;0;0;0;0;; \ No newline at end of file diff --git a/ZeroFlowTool/Preparation.cs b/ZeroFlowTool/Preparation.cs new file mode 100644 index 00000000..dcac5060 --- /dev/null +++ b/ZeroFlowTool/Preparation.cs @@ -0,0 +1,737 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Globalization; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using GenesisDisplayTool; +using Xylem.Common.Hardware.WaterMeter.Genesis.Registers; +using Xylem.Common.Hardware.WaterMeter.WaterMeterCore; + +namespace GenesisZeroFlow +{ + public static class PreparationSequences + { + public static Boolean[] Total(MeterBatch globalMeterBatch, MeterBatch thermoMeterBatch, UInt16 meterSize, Boolean setOffsetToZero, Double upperTempLimit, Double lowerTempLimit, Double tempDeviationLimit, out Boolean aborted, CultureInfo culture) + { + #region Definitions and initializations + aborted = false; + Int32 NextDelayTime = 0; + Boolean[] MeterTaskStarted = new Boolean[Constants.NumberOfMeters]; + Boolean[] MeterSequenceFailed = new Boolean[Constants.NumberOfMeters]; + Boolean[] MeterTaskCompleted = new Boolean[Constants.NumberOfMeters]; + Boolean[] ThermoTaskStarted = new Boolean[Constants.NumberOfThermometers]; + Boolean[] ThermoSequenceFailed = new Boolean[Constants.NumberOfThermometers]; + Boolean[] ThermoTaskCompleted = new Boolean[Constants.NumberOfThermometers]; + MeterTaskStarted = ArrayInit.Meter(false); + MeterSequenceFailed = ArrayInit.Meter(false); + MeterTaskCompleted = ArrayInit.Meter(false); + ThermoTaskStarted = ArrayInit.Thermo(false); + ThermoSequenceFailed = ArrayInit.Thermo(false); + ThermoTaskCompleted = ArrayInit.Thermo(false); + + var listPrep = new List(); + var listThermoPrep = new List(); + + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + { + var currentMeter = globalMeterBatch.ListOfMeters.FirstOrDefault(m => m.Slot.Equals(Meter + 1)); + + if (currentMeter != null) + listPrep.Add(new Preparation(currentMeter, Meter, culture)); + else + listPrep.Add(new Preparation(Meter, culture)); + } + for (UInt16 Thermo = Constants.Thermo1; Thermo < Constants.NumberOfThermometers; Thermo++) + { + var currentMeter = thermoMeterBatch.ListOfMeters.FirstOrDefault(m => m.Slot.Equals(Thermo + 11)); + + if (currentMeter != null) + listThermoPrep.Add(new Preparation(currentMeter, Thermo, culture)); + else + listThermoPrep.Add(new Preparation(Thermo, culture)); + } + + foreach (var meterprep in listPrep) + meterprep.Initialize(GenesisZeroFlow._GenesisZeroFlow.PcbID[meterprep.MeterNumber], Constants.Meter, meterSize, setOffsetToZero, PreparationValues.Samplerate, 0, 0, 0); + foreach (var thermoprep in listThermoPrep) + thermoprep.Initialize(GenesisZeroFlow._GenesisZeroFlow.ThermoID[thermoprep.MeterNumber], Constants.Thermo, meterSize, setOffsetToZero, 2, upperTempLimit, lowerTempLimit, tempDeviationLimit); + #endregion + + using (CancellationTokenSource cancellationTokenSource = new CancellationTokenSource()) + { + #region Everything else + CancellationToken token = cancellationTokenSource.Token; + + foreach (var item in listPrep) + item.AddTask(new Task(() => { return true; })); + foreach (var item in listThermoPrep) + item.AddTask(new Task(() => { return true; })); + foreach (var meterprep in listPrep) + meterprep.Meter(ref MeterTaskStarted[meterprep.GetMeterNumber()], ref MeterSequenceFailed[meterprep.GetMeterNumber()], ref NextDelayTime, token); + foreach (var thermoprep in listThermoPrep) + thermoprep.Thermometer(ref ThermoTaskStarted[thermoprep.GetMeterNumber()], ref ThermoSequenceFailed[thermoprep.GetMeterNumber()], ref NextDelayTime, token); + #endregion + #region Wait for tasks (METER) + Boolean[] MeterSequenceOk = new Boolean[Constants.NumberOfMeters]; + MeterSequenceOk = ArrayInit.Meter(false); + + while (!CheckArray(MeterTaskCompleted)) + { + if (GenesisZeroFlow._GenesisZeroFlow.AbortIndicator) + { + cancellationTokenSource.Cancel(); + aborted = true; + } + listPrep.All(p => TaskOperations.WaitFor(p.MyTask)); + + Misc.WaitNSeconds(1); + + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + { + var prepToCheck = listPrep.First(p => p.GetMeterNumber().Equals(Meter)); + + if (prepToCheck != null && prepToCheck.CurrentMeter != null) + MeterTaskCompleted[Meter] = TaskOperations.WaitFor(true, prepToCheck.MyTask); + else + MeterTaskCompleted[Meter] = true; + } + } + + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + { + var prepToCheck = listPrep.First(p => p.GetMeterNumber().Equals(Meter)); + + if (prepToCheck != null) + MeterSequenceOk[Meter] = !TaskOperations.GetResult(true, prepToCheck.MyTask); + else + MeterSequenceOk[Meter] = true; + } + + GenesisZeroFlow.Display.MeterStatusGreenRed(MeterSequenceOk, MeterTaskStarted); + + foreach (var item in listPrep) + TaskOperations.CheckAndDispose(ref item.MyTask); + #endregion + #region Wait for tasks (Thermometer) + Boolean[] ThermoSequenceOk = new Boolean[Constants.NumberOfThermometers]; + ThermoSequenceOk = ArrayInit.Thermo(false); + + while (!CheckArray(MeterTaskCompleted)) + { + if (GenesisZeroFlow._GenesisZeroFlow.AbortIndicator) + { + cancellationTokenSource.Cancel(); + aborted = true; + } + listThermoPrep.All(p => TaskOperations.WaitFor(p.MyTask)); + + Misc.WaitNSeconds(1); + + for (UInt16 Thermo = Constants.Thermo1; Thermo < Constants.NumberOfThermometers; Thermo++) + { + var prepToCheck = listThermoPrep.First(p => p.GetMeterNumber().Equals(Thermo)); + if (prepToCheck != null && prepToCheck.CurrentMeter != null) + MeterTaskCompleted[Thermo] = TaskOperations.WaitFor(true, prepToCheck.MyTask); + else + MeterTaskCompleted[Thermo] = true; + } + } + + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + { + var prepToCheck = listPrep.First(p => p.GetMeterNumber().Equals(Meter)); + + if (prepToCheck != null) + MeterSequenceOk[Meter] = !TaskOperations.GetResult(true, prepToCheck.MyTask); + else + MeterSequenceOk[Meter] = true; + } + for (UInt16 Thermo = Constants.Thermo1; Thermo < Constants.NumberOfThermometers; Thermo++) + { + var prepToCheck = listThermoPrep.First(p => p.GetMeterNumber().Equals(Thermo)); + + if (prepToCheck != null) + ThermoSequenceOk[Thermo] = !TaskOperations.GetResult(true, prepToCheck.MyTask); + else + ThermoSequenceOk[Thermo] = true; + } + GenesisZeroFlow.Display.MeterStatusGreenRed(MeterSequenceOk, MeterTaskStarted); + GenesisZeroFlow.Display.ThermoStatusGreenRed(ThermoSequenceOk, ThermoTaskStarted); + + foreach (var item in listPrep) + TaskOperations.CheckAndDispose(ref item.MyTask); + foreach (var item in listThermoPrep) + TaskOperations.CheckAndDispose(ref item.MyTask); + #endregion + } + + return MeterSequenceFailed.Concat(ThermoSequenceFailed).ToArray(); + } + public static Boolean TotalTempCal(MeterBatch globalMeterBatch, UInt16 meterSize, Double upperTempLimit, Double lowerTempLimit, Double tempDeviationLimit, CultureInfo culture) + { + #region Definitions and initializations + Boolean SequenceFailed = false; + Boolean TaskStarted = false; + Boolean TaskCompleted = false; + + const Int32 Samplerate = PreparationValues.Samplerate; // 10; + var listPrep = new List(); + var currentMeter = globalMeterBatch.ListOfMeters.FirstOrDefault(m => m.Slot.Equals(Constants.Meter1 + 1)); + if (currentMeter != null) + listPrep.Add(new Preparation(currentMeter, Constants.Meter1, culture)); + else + listPrep.Add(new Preparation(Constants.Meter1, culture)); + + foreach (var prep in listPrep) + prep.Initialize(String.Empty, Constants.Thermo, meterSize, false, Samplerate, upperTempLimit, lowerTempLimit, tempDeviationLimit); + #endregion + + //using (CancellationTokenSource cancellationTokenSource = new CancellationTokenSource()) + //{ + #region Everything else + //CancellationToken token = cancellationTokenSource.Token; + var PrepTaskList = new List>(); + + foreach (var item in listPrep) + item.AddTask(new Task(() => { return true; })); + foreach (var prep in listPrep) + prep.MeterTempCal(ref TaskStarted, ref SequenceFailed); + #endregion + #region Wait for tasks + Boolean SequenceOk = false; + + while (!TaskCompleted) + { + listPrep.All(p => TaskOperations.WaitFor(p.MyTask)); + + Misc.WaitNSeconds(1); + var prepToCheckTempCal = listPrep.First(p => p.GetMeterNumber().Equals(Constants.Meter1)); + if (prepToCheckTempCal != null && prepToCheckTempCal.CurrentMeter != null) + TaskCompleted = TaskOperations.WaitFor(true, prepToCheckTempCal.MyTask); + else + TaskCompleted = true; + } + + var prepToCheck = listPrep.First(p => p.GetMeterNumber().Equals(Constants.Meter1)); + if (prepToCheck != null) + SequenceOk = !TaskOperations.GetResult(true, prepToCheck.MyTask); + else + SequenceOk = true; + + foreach (var item in listPrep) + TaskOperations.CheckAndDispose(ref item.MyTask); + #endregion + //} + + return SequenceFailed; + } + private static Boolean CheckArray(Boolean[] array) + { + Boolean Completed = true; + for (Int16 i = 0; i < array.Count(); i++) + { + if (Boolean.Equals(array[i], false)) + return false; + } + return Completed; + } + } + + public class Preparation + { + + public ZeroFlowGenesisMeter CurrentMeter; + public Task MyTask; + internal void AddTask(Task task) + { + MyTask = task; + } + public Preparation(UInt16 meterNumber, CultureInfo culture) + { + this.MeterNumber = meterNumber; + this.MeterIndex = (meterNumber + 1).ToString(culture); + this.Culture = culture; + } + public Preparation(IMeter currentMeter, UInt16 meterNumber, CultureInfo culture) + { + if (currentMeter is ZeroFlowGenesisMeter) + this.CurrentMeter = (ZeroFlowGenesisMeter)currentMeter; + + this.MeterNumber = meterNumber; + this.MeterIndex = (meterNumber + 1).ToString(culture); + this.Culture = culture; + } + internal void Meter(ref Boolean taskStarted, ref Boolean sequenceFailed, ref Int32 nextDelayTime, CancellationToken token) + { + #region Definitions and initializations + Boolean Ok = false; + Boolean enable = CurrentMeter != null; + DialogResult AskForActions = DialogResult.None; + Int32 DelayTime = 0; + const Int32 DeltaDelay = 5; + #endregion + + if (enable) + { + DelayTime = nextDelayTime; + nextDelayTime = nextDelayTime + DeltaDelay; + Int32 temp = DelayTime; + taskStarted = true; + + var _sequenceFailed = sequenceFailed; + + MyTask = Task.Run(() => + { + Misc.WaitNSeconds(temp); + while ((DialogResult.Equals(AskForActions, DialogResult.Retry)) || (DialogResult.Equals(AskForActions, DialogResult.None))) + { + #region Cancelation token + if (!token.IsCancellationRequested) + GenesisZeroFlow.Display.AbortButtonEnabled(true); + #endregion + #region Testprocedure + if (DialogResult.Equals(AskForActions, DialogResult.None)) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t PREPARATION started at {this.MeterType}{this.MeterIndex}\n", this.Culture); + + Ok = PerformPreparationMeter(token); + + if (token.IsCancellationRequested) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t PREPARATION stopped at {this.MeterType}{this.MeterIndex}\n", this.Culture); + GenesisZeroFlow.Display.DebugMessage($"{Constants.TwentySpaces}\t{Debugmessages.Line}", this.Culture); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + GenesisZeroFlow._GenesisZeroFlow.GenerateReturnNote(this.MeterIndex, this.PcbID, GenesisZeroFlow.PredefinedMessages.PreparationStopped(this.Culture), GenesisZeroFlow._GenesisZeroFlow.GetLoggingFromTextBox(), this.Culture); + return true; + } + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t PREPARATION successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + GenesisZeroFlow.Display.DebugMessage($"{Constants.TwentySpaces}\t{Debugmessages.Line}", this.Culture); + _sequenceFailed = false; + + AskForActions = DialogResult.OK; + } + else + { + _sequenceFailed = true; + AskForActions = DialogResult.Cancel; + GenesisZeroFlow._GenesisZeroFlow.GenerateReturnNote(this.MeterIndex, this.PcbID, GenesisZeroFlow.PredefinedMessages.PreparationFailed(this.Culture), GenesisZeroFlow._GenesisZeroFlow.GetLoggingFromTextBox(), this.Culture); + } + #endregion + } + + return _sequenceFailed; + }); + } + } + internal void Thermometer(ref Boolean taskStarted, ref Boolean sequenceFailed, ref Int32 nextDelayTime, CancellationToken token) + { + Boolean enable = CurrentMeter != null; + #region Definitions and initializations + Boolean Ok = false; + DialogResult AskForActions = DialogResult.None; + Int32 DelayTime = 0; + const Int32 DeltaDelay = 5; + #endregion + + if (enable) + { + + DelayTime = nextDelayTime; + nextDelayTime = nextDelayTime + DeltaDelay; + Int32 temp = DelayTime; + taskStarted = true; + + var _sequenceFailed = sequenceFailed; + + MyTask = Task.Run(() => + { + Misc.WaitNSeconds(temp); + while ((DialogResult.Equals(AskForActions, DialogResult.Retry)) || (DialogResult.Equals(AskForActions, DialogResult.None))) + { + #region Cancelation token + if (!token.IsCancellationRequested) + GenesisZeroFlow.Display.AbortButtonEnabled(true); + #endregion + #region Testprocedure + if (DialogResult.Equals(AskForActions, DialogResult.None)) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t PREPARATION started at {this.MeterType}{this.MeterIndex}\n", this.Culture); + + Ok = PerformPreparationThermometer(token); + + if (token.IsCancellationRequested) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t PREPARATION stopped at {this.MeterType}{this.MeterIndex}\n", this.Culture); + GenesisZeroFlow.Display.DebugMessage($"{Constants.TwentySpaces}\t{Debugmessages.Line}", this.Culture); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + return true; + } + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t PREPARATION successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + GenesisZeroFlow.Display.DebugMessage($"{Constants.TwentySpaces}\t{Debugmessages.Line}", this.Culture); + _sequenceFailed = false; + + AskForActions = DialogResult.OK; + } + else + { + _sequenceFailed = true; + AskForActions = DialogResult.Cancel; + } + #endregion + } + + return _sequenceFailed; + }); + } + } + internal void MeterTempCal(ref Boolean taskStarted, ref Boolean sequenceFailed) + { + Boolean enable = CurrentMeter != null; + #region Definitions and initializations + Boolean Ok = false; + String DebugMessage = String.Empty; + DialogResult AskForActions = DialogResult.None; + #endregion + + if (enable) + { + taskStarted = true; + var _sequenceFailed = sequenceFailed; + //var _logOn = logOn; + //Boolean ReAuthentication = false; + + MyTask = Task.Run(() => + { + while ((DialogResult.Equals(AskForActions, DialogResult.Retry)) || (DialogResult.Equals(AskForActions, DialogResult.None))) + { + #region Testprocedure + if (DialogResult.Equals(AskForActions, DialogResult.None)) + frmTempCalibration.DisplayTempCal.DebugMessage($"APPLICATION:\t\t PREPARATION sequence started\n", this.Culture); + + Ok = PerformPreparationTempCal(); + if (Ok) + { + frmTempCalibration.DisplayTempCal.DebugMessage("APPLICATION:\t\t PREPARATION sequence successful\n", this.Culture); + frmTempCalibration.DisplayTempCal.DebugMessage(Debugmessages.Line, this.Culture); + _sequenceFailed = false; + + AskForActions = DialogResult.OK; + } + else + { + frmTempCalibration.DisplayTempCal.DebugMessage("APPLICATION:\t\t PREPARATION sequence failed\n", this.Culture); + frmTempCalibration.DisplayTempCal.DebugMessage(Debugmessages.Line, this.Culture); + _sequenceFailed = true; + } + #endregion + } + AskForActions = DialogResult.None; + + return _sequenceFailed; + }); + } + } + private Boolean PerformPreparationMeter(CancellationToken token) + { + #region Definitions and initialisations + Boolean Ok = false; + #endregion + #region Calibration factor1 + if (Constants.NumberOfPaths > 0) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'Calibration factor1'-register at {this.MeterType}{this.MeterIndex}\n", this.Culture); + Ok = CurrentMeter.WriteRegisterSafe(Register.Genesisflow.CalFactor1, this.CalibrationFactor1); + if (Ok) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'Calibration factor1'-register successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + else + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'Calibration factor1'-register failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + + if (Boolean.Equals(Ok, false)) + return false; + } + #endregion + #region Calibration factor2 + if (Constants.NumberOfPaths > 1) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'Calibration factor2'-register at {this.MeterType}{this.MeterIndex}\n", this.Culture); + Ok = CurrentMeter.WriteRegisterSafe(Register.Genesisflow.CalFactor2, this.CalibrationFactor2); + if (Ok) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'Calibration factor2'-register successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + else + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'Calibration factor2'-register failed at {this.MeterType}{MeterIndex}\n", this.Culture); + + if (Boolean.Equals(Ok, false)) + return false; + } + #endregion + #region Calibration factor3 + if (Constants.NumberOfPaths > 2) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'Calibration factor3'-register at {this.MeterType}{this.MeterIndex}\n", this.Culture); + Ok = CurrentMeter.WriteRegisterSafe(Register.Genesisflow.CalFactor3, this.CalibrationFactor3); + if (Ok) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'Calibration factor3'-register successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + else + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'Calibration factor3'-register failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + + if (Boolean.Equals(Ok, false)) + return false; + } + #endregion + + if (SetOffsetToZero) + { + if (Constants.NumberOfPaths > 0) + { + #region Zeroflow Offset1 + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'Zeroflow offset1'-register at {this.MeterType}{this.MeterIndex}\n", this.Culture); + Ok = CurrentMeter.WriteRegisterSafe(Register.Genesisflow.ZeroOffset1, this.ZeroOffset1); + if (Ok) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'Zeroflow offset1'-register successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + else + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'Zeroflow offset1'-register failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + + if (Boolean.Equals(Ok, false)) + return false; + } + #endregion + #region Zeroflow Offset2 + if (Constants.NumberOfPaths > 1) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'Zeroflow offset2'-register at {this.MeterType}{this.MeterIndex}\n", this.Culture); + Ok = CurrentMeter.WriteRegisterSafe(Register.Genesisflow.ZeroOffset2, this.ZeroOffset2); + if (Ok) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'Zeroflow offset2'-register successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + else + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'Zeroflow offset2'-register failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + + if (Boolean.Equals(Ok, false)) + return false; + } + #endregion + #region Zeroflow Offset3 + if (Constants.NumberOfPaths > 2) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'Zeroflow offset3'-register at {this.MeterType}{this.MeterIndex}\n", this.Culture); + Ok = CurrentMeter.WriteRegisterSafe(Register.Genesisflow.ZeroOffset3, this.ZeroOffset3); + if (Ok) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'Zeroflow offset3'-register successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + else + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'Zeroflow offset3'-register failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + + if (Boolean.Equals(Ok, false)) + return false; + } + #endregion + } + #region Sample rate + Ok = false; + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'Samplerate'-register at {this.MeterType}{this.MeterIndex}\n", this.Culture); + Ok = CurrentMeter.WriteRegisterSafe(Register.Genesisflow.SampleRate, this.SampleRate); + + if (Ok) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'Samplerate'-register successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + else + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'Samplerate'-register failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + + if (Boolean.Equals(Ok, false)) + return false; + #endregion + #region MeterSize + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'Metersize'-register at {this.MeterType}{this.MeterIndex}\n", this.Culture); + Ok = CurrentMeter.WriteRegisterSafe(Register.Genesisflow.MeterSize, this.MeterSize); + if (Ok) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'Metersize'-register successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + else + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'Metersize'-register failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + + if (Boolean.Equals(Ok, false)) + return false; + #endregion + #region LedMode + if (token.IsCancellationRequested) + return false; + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'LED mode'-register at {this.MeterType}{this.MeterIndex}\n", this.Culture); + Ok = CurrentMeter.WriteRegisterSafe(Register.Genesisflow.LedMode, this.LedMode); + if (Ok) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'LED mode'-register successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + else + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'LED mode'-register failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + + if (Boolean.Equals(Ok, false)) + return false; + #endregion + #region TriggerActiv + if (token.IsCancellationRequested) + return false; + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'LED mode'-register at {this.MeterType}{this.MeterIndex}\n", this.Culture); + Ok = CurrentMeter.WriteRegisterUnsafe(Register.Genesisflow.TriggerActive, 1); + if (Ok) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'LED mode'-register successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + else + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'LED mode'-register failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + + if (Boolean.Equals(Ok, false)) + return false; + #endregion + + return Ok; + } + private Boolean PerformPreparationThermometer(CancellationToken token) + { + #region Definitions and initialisations + Boolean Ok = false; + #endregion + #region Sample rate + Ok = false; + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'Samplerate'-register at {this.MeterType}{this.MeterIndex}\n", this.Culture); + Ok = CurrentMeter.WriteRegisterSafe(Register.Genesisflow.SampleRate, this.SampleRate); + + if (Ok) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'Samplerate'-register successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + else + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'Samplerate'-register failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + + if (Boolean.Equals(Ok, false)) + return false; + #endregion + #region LedMode + if (token.IsCancellationRequested) + return false; + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'LED mode'-register at {this.MeterType}{this.MeterIndex}\n", this.Culture); + Ok = CurrentMeter.WriteRegisterSafe(Register.Genesisflow.LedMode, this.LedMode); + if (Ok) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'LED mode'-register successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + else + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing to 'LED mode'-register failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + + if (Boolean.Equals(Ok, false)) + return false; + #endregion + return Ok; + } + private Boolean PerformPreparationTempCal() + { + #region Definitions and initialisations + Boolean Ok = false; + #endregion + + try + { + String PcbID = CurrentMeter.GetPcbId(); + if (!String.IsNullOrEmpty(PcbID)) + frmTempCalibration.DisplayTempCal.DebugMessage($"COMMAND CHANNEL:\t PcbID = {PcbID}\n", this.Culture); + else + { + frmTempCalibration.DisplayTempCal.DebugMessage($"COMMAND CHANNEL:\t PcbID not available\n", this.Culture); + PcbID = "n/a"; + //return false; + } + } + catch (Exception ex) + { + ErrorLog.Log(LogErrReason.Exeption, "Preparation.PerformPreparationTempCal() failed", $"0x{ex.HResult.ToString("X", Culture)}", String.Empty, Culture); + } + #region Sample rate + Ok = false; + frmTempCalibration.DisplayTempCal.DebugMessage($"COMMAND CHANNEL:\t Writing to 'Samplerate'-register\n", this.Culture); + Ok = CurrentMeter.WriteRegisterSafe(Register.Genesisflow.SampleRate, this.SampleRate); + + if (Ok) + frmTempCalibration.DisplayTempCal.DebugMessage($"COMMAND CHANNEL:\t Writing to 'Samplerate'-register successful\n", this.Culture); + else + { + frmTempCalibration.DisplayTempCal.DebugMessage($"COMMAND CHANNEL:\t Writing to 'Samplerate'-register failed\n", this.Culture); + return false; + } + #endregion + #region MeterSize + frmTempCalibration.DisplayTempCal.DebugMessage($"COMMAND CHANNEL:\t Writing to 'Metersize'-register\n", this.Culture); + Ok = CurrentMeter.WriteRegisterSafe(Register.Genesisflow.MeterSize, this.MeterSize); + if (Ok) + frmTempCalibration.DisplayTempCal.DebugMessage($"COMMAND CHANNEL:\t Writing to 'Metersize'-register successful\n", this.Culture); + else + { + frmTempCalibration.DisplayTempCal.DebugMessage($"COMMAND CHANNEL:\t Writing to 'Metersize'-register failed\n", this.Culture); + return false; + } + #endregion + #region LedMode + frmTempCalibration.DisplayTempCal.DebugMessage($"COMMAND CHANNEL:\t Writing to 'LED mode'-register\n", this.Culture); + Ok = CurrentMeter.WriteRegisterSafe(Register.Genesisflow.LedMode, this.LedMode); + if (Ok) + frmTempCalibration.DisplayTempCal.DebugMessage($"COMMAND CHANNEL:\t Writing to 'LED mode'-register successful\n", this.Culture); + else + { + frmTempCalibration.DisplayTempCal.DebugMessage($"COMMAND CHANNEL:\t Writing to 'LED mode'-register failed\n", this.Culture); + return false; + } + #endregion + return Ok; + } + public Int32 GetMeterNumber() + { + return MeterNumber; + } + private Boolean SetOffsetToZero { get; set; } + + public void Initialize(String pcbID, String meterType, UInt16 meterSize, Boolean setOffsetToZero, Int32 sampleRate, Double upperTempLimit, Double lowerTempLimit, Double tempDeviationLimit) + { + this.CalibrationFactor1 = PreparationValues.CalFactor1; + this.CalibrationFactor2 = PreparationValues.CalFactor2; + this.CalibrationFactor3 = PreparationValues.CalFactor3; + this.ZeroOffset1 = PreparationValues.ZeroOffset1; + this.ZeroOffset2 = PreparationValues.ZeroOffset2; + this.ZeroOffset3 = PreparationValues.ZeroOffset3; + this.SampleRate = sampleRate; + this.MeterSize = meterSize; + this.LedMode = PreparationValues.LedMode; + this.SetOffsetToZero = setOffsetToZero; + this.TempUpperLimit = upperTempLimit; + this.TempLowerLimit = lowerTempLimit; + this.TempDeviationLimit = tempDeviationLimit; + this.MeterType = meterType; + this.PcbID = pcbID; + } + public Int32 MeterNumber { get; private set; } + public String MeterIndex { get; private set; } + public String MeterType { get; private set; } + private String PcbID { get; set; } + private CultureInfo Culture { get; set; } + private Int32 CalibrationFactor1 { get; set; } + private Int32 CalibrationFactor2 { get; set; } + private Int32 CalibrationFactor3 { get; set; } + private Int32 ZeroOffset1 { get; set; } + private Int32 ZeroOffset2 { get; set; } + private Int32 ZeroOffset3 { get; set; } + private Int32 SampleRate { get; set; } + private UInt16 MeterSize { get; set; } + private Int32 LedMode { get; set; } + private Double TempUpperLimit { get; set; } + private Double TempLowerLimit { get; set; } + private Double TempDeviationLimit { get; set; } + } + +} \ No newline at end of file diff --git a/ZeroFlowTool/Program.cs b/ZeroFlowTool/Program.cs new file mode 100644 index 00000000..9920b501 --- /dev/null +++ b/ZeroFlowTool/Program.cs @@ -0,0 +1,53 @@ +using System; +using System.Windows.Forms; +// sr +// sr + + +namespace GenesisZeroFlow +{ + static class Program + { + + + /// + /// Der Haupteinstiegspunkt für die Anwendung. + /// + [STAThread] + + static void Main(string[] args) + { + + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + var filename = System.AppDomain.CurrentDomain.FriendlyName; + + + + + + if (filename.ToLower().Contains("temp")) + { + Application.Run(new frmTempCalibration()); + } + else if (filename.ToLower().Contains("zero")) + { + Application.Run(new GenesisZeroFlow()); + } + else + { + Application.Run(new frmStartup()); + } + + // Application.Run(new TestComon()); + + } + } +} + + + + + + + diff --git a/ZeroFlowTool/Properties/AssemblyInfo.cs b/ZeroFlowTool/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..f2c68d0f --- /dev/null +++ b/ZeroFlowTool/Properties/AssemblyInfo.cs @@ -0,0 +1,4 @@ +using System.Reflection; + +[assembly: AssemblyTitle("GenesisZeroFlow")] +[assembly: AssemblyDescription("")] \ No newline at end of file diff --git a/ZeroFlowTool/Properties/Resources.Designer.cs b/ZeroFlowTool/Properties/Resources.Designer.cs new file mode 100644 index 00000000..4ba1a42c --- /dev/null +++ b/ZeroFlowTool/Properties/Resources.Designer.cs @@ -0,0 +1,83 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace GenesisDisplayTool.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("GenesisDisplayTool.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap NormalImage { + get { + object obj = ResourceManager.GetObject("NormalImage", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap thermometer { + get { + object obj = ResourceManager.GetObject("thermometer", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/ZeroFlowTool/Properties/Resources.resx b/ZeroFlowTool/Properties/Resources.resx new file mode 100644 index 00000000..17209a92 --- /dev/null +++ b/ZeroFlowTool/Properties/Resources.resx @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + ..\NormalImage.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\thermometer.GIF;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/ZeroFlowTool/Properties/Settings.Designer.cs b/ZeroFlowTool/Properties/Settings.Designer.cs new file mode 100644 index 00000000..8212a632 --- /dev/null +++ b/ZeroFlowTool/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace GenesisDisplayTool.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/ZeroFlowTool/Properties/Settings.settings b/ZeroFlowTool/Properties/Settings.settings new file mode 100644 index 00000000..39645652 --- /dev/null +++ b/ZeroFlowTool/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ZeroFlowTool/QuestionImage.gif b/ZeroFlowTool/QuestionImage.gif new file mode 100644 index 00000000..bb56b38a Binary files /dev/null and b/ZeroFlowTool/QuestionImage.gif differ diff --git a/ZeroFlowTool/Report.cs b/ZeroFlowTool/Report.cs new file mode 100644 index 00000000..e44a8f8c --- /dev/null +++ b/ZeroFlowTool/Report.cs @@ -0,0 +1,339 @@ +using PdfSharp.Pdf; +using System; +using System.Globalization; +using System.Windows.Forms; + + +namespace GenesisZeroFlow +{ + public partial class GenesisZeroFlow : Form + { + public void GenerateReturnNote(String meterIndex, String pcbID, String reason, String logData, CultureInfo culture) + { + String UserName = Environment.UserName; + DateTime Date = DateTime.Now; + String Content = String.Empty; + String Header = String.Empty; + String Filename = String.Empty; + String Headline = String.Empty; + + if (GenesisZeroFlow._GenesisZeroFlow.InvokeRequired) + { + GenesisZeroFlow._GenesisZeroFlow.Invoke((Action)GenerateReturnNote, meterIndex, pcbID, reason, logData, culture); + return; + } + + try + { + if (culture == CultureDe) + { + Headline = "Rückläuferschein"; + Header = $"ZÄHLER{meterIndex} fehlgeschlagen.\nLeiterplattennummer:\t{pcbID}\nGrund:\t{reason}\nDatum:\t{Date.ToString(Formats.HeaderFileDateTimeString)}\nBenutzername:\t{UserName}\n"; + Filename = $"Rückläuferschein_ZÄHLER{meterIndex}_{Date.ToString(Formats.LogFileDateTimeString, culture)}.pdf"; + } + else + { + Headline = "Return note"; + Header = $"METER{meterIndex} failed.\nPCB-ID\t{pcbID}\nReason:\t{reason}\nDate:\t{Date.ToString(Formats.HeaderFileDateTimeString)}\nUser name:\t{UserName}\n"; + Filename = $"Return note_METER{meterIndex}_{Date.ToString(Formats.LogFileDateTimeString, culture)}.pdf"; + } + + using (PdfDocument Report = new PdfDocument()) + { + ReportPages.ReturnNote(Headline, $"{Header}\n\n{logData}", Report); + Files.SavePdf(Report, $@"..\{Filename}", culture); + } + } + catch (Exception ex) + { + #region Error + ErrorLog.Log(LogErrReason.Exeption, "GenerateReturnNote() failed", $"0x{ex.HResult.ToString("X", culture)}", String.Empty, culture); + MessageBox.Show("Return note generation failed", "Form closing", MessageBoxButtons.OK, MessageBoxIcon.Error); + #endregion + } + + + } + + + private void GeneratePdfReport(CultureInfo culture) + { + System.Runtime.GCSettings.LatencyMode = System.Runtime.GCLatencyMode.LowLatency; + + #region Prepare data + #region Definitions and initializations + Boolean FileDialogOk = false; + Boolean SavingOk = false; + UInt16 LocalNumberOfPaths = Constants.NumberOfPaths; + #endregion + #region Parameter definitions + #region Image parameters + //XImage Logo = pB_Logo1.Image; + #endregion + #region Text parameters + UInt16 Pagecounter = 0; + #endregion + #endregion + #region Titlepage, path, filenames + String Introduction = rtB_ReportTitlepageIntro.Text; + String Fullpath = String.Empty; + // string Itemname = "_" + rTB_ReportEnterOperator.Text + "_" + rTB_ReportEnterTitle.Text; + #endregion + #region Text definitions + #region Additional information + // string TextSoftwareVersion = l_About_Version.Text + "\n" + l_About_Author.Text + "\n" + l_About_Info.Text; + #endregion + #region Text GP30 settings + #region Declaration + String[] SettingsFromGP30Columns = new String[LocalNumberOfPaths]; + for (UInt16 Path = Constants.PATH0; Path < LocalNumberOfPaths; Path++) + SettingsFromGP30Columns[Path] = String.Empty; + #endregion + #region First column + SettingsFromGP30Columns[ReportParams.Column1] = + "First Hit level up PATH1:\nFirst Hit level up PATH2:\nFirst Hit level up PATH3:\n" + + "First Hit level down PATH1:\nFirst Hit level down PATH2:\nFirst Hit level up PATH3:\n" + + "Number of bursts:\nStarthit:\nAmplitude peak detect:\nSamplerate:"; + #endregion + #region Second column + // SettingsFromGP30Columns[ReportParams.Column2] = + // l_GetFirstLevelUpPath0Meter1.Text + "\n"+ l_GetFirstLevelUpPath1Meter1.Text + "\n" + l_GetFirstLevelUpPath2Meter1.Text + "\n" + + // l_GetFirstLevelDownPath0Meter1.Text + "\n"+ l_GetFirstLevelDownPath1Meter1.Text + "\n" + l_GetFirstLevelDownPath2Meter1.Text + "\n" + + // l_Gp30GetNumberOfPulsesMeter1.Text + "\n"+ l_Gp30GetStartHitMeter1.Text + "\n" + l_Gp30GetAmplitudeMeter1.Text + "\n" + l_Gp30GetSamplerateMeter1.Text; + #endregion + #region Third column + // SettingsFromGP30Columns[ReportParams.Column3] = + // "(" + l_GetFirstVoltageUpPath0Meter1.Text + ")\n" + "(" + l_GetFirstVoltageUpPath1Meter1.Text + ")\n" + "(" + l_GetFirstVoltageUpPath2Meter1.Text + ")\n" + + // "(" + l_GetFirstVoltageDownPath0Meter1.Text + ")\n" + "(" + l_GetFirstVoltageDownPath1Meter1.Text + ")\n" + "(" + l_GetFirstVoltageDownPath2Meter1.Text + ")"; + #endregion + #endregion + #region Decoded data text + #region Definitions and initializations + // string[] DecodedDataColumns = new string[4] { String.Empty, String.Empty, String.Empty, String.Empty }; + #endregion + #region Set data + #region First Column + #region Set data + /* + DecodedDataColumns[ReportParams.Column1] = + l_HccValPath0.Text + "\n" + + l_HccCorrectionFactorPath0.Text + "\n" + + l_PwUpPath0.Text + "\n" + + l_PwDownPath0.Text + "\n" + + l_AmpUpPath0.Text + "\n" + + l_AmpDownPath0.Text + "\n" + + l_AmpCalHighPath0.Text + "\n" + + l_AmpCalLowPath0.Text + "\n" + + l_TofSumOfAllUpPath0.Text + "\n" + + l_TofSumOfAllDownPath0.Text + "\n" + + l_Tof0UpPath0.Text + "\n" + + l_Tof1UpPath0.Text + "\n" + + l_Tof2UpPath0.Text + "\n" + + l_Tof3UpPath0.Text + "\n" + + l_Tof4UpPath0.Text + "\n" + + l_Tof5UpPath0.Text + "\n" + + l_Tof6UpPath0.Text + "\n" + + l_Tof7UpPath0.Text + "\n" + + l_Tof0DownPath0.Text + "\n" + + l_Tof1DownPath0.Text + "\n" + + l_Tof2DownPath0.Text + "\n" + + l_Tof3DownPath0.Text + "\n" + + l_Tof4DownPath0.Text + "\n" + + l_Tof5DownPath0.Text + "\n" + + l_Tof6DownPath0.Text + "\n" + + l_Tof7DownPath0.Text + "\n" + + l_TemperaturePath0.Text + "\n" + + l_ProtocolVersion.Text + "\n\n\nComment:";*/ + + #endregion + #endregion + #region PATH0 + #region Set data + /* + DecodedDataColumns[ReportParams.Column2] = + l_HccValDispPath0.Text + "\n" + + l_HccCorrectionFactorDispPath0.Text + "\n" + + l_PwUpDispPath0.Text + "\n" + + l_PwDownDispPath0.Text + "\n" + + l_AmpUpDispPath0.Text + "\n" + + l_AmpUpDispPath0.Text + "\n" + + l_AmpCalHighDispPath0.Text + "\n" + + l_AmpCalLowDispPath0.Text + "\n" + + l_TofSumOfAllUpDispPath0.Text + "\n" + + l_TofSumOfAllDownDispPath0.Text + "\n" + + l_Tof0UpDispPath0.Text + "\n" + + l_Tof1UpDispPath0.Text + "\n" + + l_Tof2UpDispPath0.Text + "\n" + + l_Tof3UpDispPath0.Text + "\n" + + l_Tof4UpDispPath0.Text + "\n" + + l_Tof5UpDispPath0.Text + "\n" + + l_Tof6UpDispPath0.Text + "\n" + + l_Tof7UpDispPath0.Text + "\n" + + l_Tof0UpDispPath0.Text + "\n" + + l_Tof1UpDispPath0.Text + "\n" + + l_Tof2UpDispPath0.Text + "\n" + + l_Tof3UpDispPath0.Text + "\n" + + l_Tof4UpDispPath0.Text + "\n" + + l_Tof5UpDispPath0.Text + "\n" + + l_Tof6UpDispPath0.Text + "\n" + + l_Tof7UpDispPath0.Text + "\n" + + l_TemperatureDispPath0.Text + "\n" + + l_DispProtocolVersion.Text+"\n\n\n";*/ + #endregion + #region Comment field + /* + if (Decoded[Constants.PATH0].Comment == string.Empty) + DecodedDataColumns[ReportParams.Column2] = DecodedDataColumns[ReportParams.Column2] + "---"; + else + DecodedDataColumns[ReportParams.Column2] = DecodedDataColumns[ReportParams.Column2] + Decoded[Constants.PATH0].Comment; + */ + #endregion + #endregion + #region PATH1 + #region Set data + /* + DecodedDataColumns[ReportParams.Column3] = + l_HccValDispPath1.Text + "\n" + + l_HccCorrectionFactorDispPath1.Text +"\n" + + l_PwUpDispPath1.Text + "\n" + + l_PwDownDispPath1.Text + "\n" + + l_AmpUpDispPath1.Text + "\n" + + l_AmpUpDispPath1.Text + "\n" + + l_AmpCalHighDispPath1.Text + "\n" + + l_AmpCalLowDispPath1.Text + "\n" + + l_TofSumOfAllUpDispPath1.Text + "\n" + + l_TofSumOfAllDownDispPath1.Text + "\n" + + l_Tof0UpDispPath1.Text + "\n" + + l_Tof1UpDispPath1.Text + "\n" + + l_Tof2UpDispPath1.Text + "\n" + + l_Tof3UpDispPath1.Text + "\n" + + l_Tof4UpDispPath1.Text + "\n" + + l_Tof5UpDispPath1.Text + "\n" + + l_Tof6UpDispPath1.Text + "\n" + + l_Tof7UpDispPath1.Text + "\n" + + l_Tof0UpDispPath1.Text + "\n" + + l_Tof1DownDispPath1.Text + "\n" + + l_Tof2DownDispPath1.Text + "\n" + + l_Tof3DownDispPath1.Text + "\n" + + l_Tof4DownDispPath1.Text + "\n" + + l_Tof5DownDispPath1.Text + "\n" + + l_Tof6DownDispPath1.Text + "\n" + + l_Tof7DownDispPath1.Text + "\n" + + l_TemperatureDispPath1.Text + "\n" + + l_DispProtocolVersion.Text + "\n\n\n";*/ + #endregion + #region Comment field + /* + if (Decoded[Constants.PATH1].Comment == string.Empty) + DecodedDataColumns[ReportParams.Column3] = DecodedDataColumns[ReportParams.Column3] + "---"; + else + DecodedDataColumns[ReportParams.Column3] = DecodedDataColumns[ReportParams.Column3] + Decoded[Constants.PATH1].Comment; + */ + #endregion + #endregion + #region PATH2 + #region Set data + /* + DecodedDataColumns[ReportParams.Column4] = + l_HccValDispPath2.Text + "\n" + + l_HccCorrectionFactorDispPath2.Text + "\n" + + l_PwUpDispPath2.Text + "\n" + + l_PwDownDispPath2.Text + "\n" + + l_AmpUpDispPath2.Text + "\n" + + l_AmpUpDispPath2.Text + "\n" + + l_AmpCalHighDispPath2.Text + "\n" + + l_AmpCalLowDispPath2.Text + "\n" + + l_TofSumOfAllUpDispPath2.Text + "\n" + + l_TofSumOfAllDownDispPath2.Text + "\n" + + l_Tof0UpDispPath2.Text + "\n" + + l_Tof1UpDispPath2.Text + "\n" + + l_Tof2UpDispPath2.Text + "\n" + + l_Tof3UpDispPath2.Text + "\n" + + l_Tof4UpDispPath2.Text + "\n" + + l_Tof5UpDispPath2.Text + "\n" + + l_Tof6UpDispPath2.Text + "\n" + + l_Tof7UpDispPath2.Text + "\n" + + l_Tof0UpDispPath2.Text + "\n" + + l_Tof1DownDispPath2.Text + "\n" + + l_Tof2DownDispPath2.Text + "\n" + + l_Tof3DownDispPath2.Text + "\n" + + l_Tof4DownDispPath2.Text + "\n" + + l_Tof5DownDispPath2.Text + "\n" + + l_Tof6DownDispPath2.Text + "\n" + + l_Tof7DownDispPath2.Text + "\n" + + l_TemperatureDispPath2.Text + "\n" + + l_DispProtocolVersion.Text + "\n\n\n";*/ + #endregion + #region Comment field + /* + if (Decoded[Constants.PATH2].Comment == string.Empty) + DecodedDataColumns[ReportParams.Column4] = DecodedDataColumns[ReportParams.Column4] + "---"; + else + DecodedDataColumns[ReportParams.Column4] = DecodedDataColumns[ReportParams.Column4] + Decoded[Constants.PATH2].Comment; + */ + #endregion + #endregion + #endregion + #endregion + #endregion + #region Check for serial number + if (String.IsNullOrEmpty(rTB_ReportEnterSerialNumber.Text)) + { + MessageBox.Show("Enter serial number!", "Form closing", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + #endregion + #endregion + #region Create pages and generate report + try + { + //using (PdfDocument Report = new PdfDocument()) + //{ + // #region Create new report + // Report.Info.Title = rTB_ReportEnterTitle.Text; + // Report.Info.Author = rTB_ReportEnterOperator.Text; + // #endregion + // #region Page "Titlepage + // Pagecounter = ReportPages.TitlePage(Pagecounter, Introduction, rTB_ReportEnterTitle.Text, rTB_ReportEnterDate.Text, rTB_ReportEnterOperator.Text, rTB_ReportEnterSerialNumber.Text, Report, Logo, culture); + // #endregion + // #region Page "SETTINGS" + // //Pagecounter = ReportPages.Settings(Pagecounter, TextSoftwareVersion, SettingsFromGP30Columns, cB_ReportGP30Settings.Checked, Report, Logo); + // #endregion + // #region Page "DECODED DATA" + // //Pagecounter = ReportPages.DecodedData(Pagecounter, DecodedDataColumns, Report, Logo); + // #endregion + // #region Page "MAINGRAPH" + // // Pagecounter = ReportPages.Maingraph(Pagecounter, MainGraphTitle, zGC_MainGraph, cB_ReportMainGraph.Checked, Report, Logo); + // #endregion + // #region Page "MEAN VALUES" + // //ReportPages.MeanValues(Pagecounter, MeanColumns, cB_ReportMean.Checked, cB_ReportMeanPath0.Checked, cB_ReportMeanPath1.Checked, cB_ReportMeanPath2.Checked, Report, Logo); + // #endregion + // #region Save file + + // //FileDialogOK = Files.SaveFiledialogPdf(Itemname, ref Fullpath, DefaultReportDirectory); + // if (FileDialogOk) + // { + // //DefaultReportDirectory = System.IO.Path.GetDirectoryName(Fullpath); + // SavingOk = Files.SavePdf(Report, Fullpath, culture); + // } + // #endregion + // #region Result + // if((!SavingOk)&&(FileDialogOk)) + // MessageBox.Show("Report generation failed", "Form closing", MessageBoxButtons.OK, MessageBoxIcon.Error); + + // #endregion + //} + } + catch (Exception ex) + { + #region Error + ErrorLog.Log(LogErrReason.Exeption, "GeneratePdfReport() failed", $"0x{ex.HResult.ToString("X", culture)}", String.Empty, culture); + MessageBox.Show("Report generation failed", "Form closing", MessageBoxButtons.OK, MessageBoxIcon.Error); + #endregion + } + #endregion + + System.Runtime.GCSettings.LatencyMode = System.Runtime.GCLatencyMode.SustainedLowLatency; + } + } +} \ No newline at end of file diff --git a/ZeroFlowTool/ReportPages.cs b/ZeroFlowTool/ReportPages.cs new file mode 100644 index 00000000..5648f0cb --- /dev/null +++ b/ZeroFlowTool/ReportPages.cs @@ -0,0 +1,286 @@ +using System; +using System.Globalization; +using System.Linq; +using PdfSharp.Drawing; +using PdfSharp.Pdf; +using PdfSharp.Drawing.Layout; + + + +namespace GenesisZeroFlow +{ + + public static class ReportPages + { + public static void Logfile(String text, PdfDocument report, XImage logo) + { + #region CA1062 + if ((text == null) || (report == null)) + return; + #endregion + + const Int32 LinesPerPage = 60; + String[] Lines = text.Split('\n'); + Double NumberOfNewlines = (double)Lines.Count(); + Double aux = (NumberOfNewlines / LinesPerPage); + Int32 NumberOfPages = (Int32)Math.Ceiling(aux); + String[] StringArray = new String[NumberOfPages]; + + for (Int32 i = 0; i < (NumberOfNewlines); i++) + { + Int32 Pageindex = (Int32)Math.Floor(((Double)i / LinesPerPage)); + StringArray[Pageindex] = StringArray[Pageindex] + Lines[i] + "\n"; + } + + //formatter.DrawString(text, ReportParams.fontStandard, XBrushes.Black, new XRect(50, 100, 0, 0), XStringFormats.TopLeft); + //Logfile.DrawString(text, ReportParams.fontStandard, XBrushes.Black, new XRect(10, 20, pdfPage.Width.Point, pdfPage.Height.Point), XStringFormats.TopLeft); + + for (Int32 i = 0; i < NumberOfPages; i++) + { + PdfPage pdfPage = report.AddPage(); + XGraphics Logfile = XGraphics.FromPdfPage(pdfPage); + var formatter = new XTextFormatter(Logfile); + var layoutRectangle = new XRect(1, 1, 1, 1); + Logfile.DrawImage(logo, new XRect(ReportParams.LogoXPos, ReportParams.LogoYPos, ReportParams.LogoXSize, ReportParams.LogoYSize)); + formatter.DrawString(StringArray[i], ReportParams.fontSmall, XBrushes.Black, new XRect(50, 70, 600, 20), XStringFormats.TopLeft); + } + + } + public static UInt16 TitlePage(UInt16 pagecounter, String introduction, String title, String date, String operatorName, String serialNo, PdfDocument report, XImage logo, CultureInfo culture) + { + #region CA1062 + if (report == null) + return 0; + #endregion + try + { + #region Page "TITLEPAGE" + #region Prepare data + if (pagecounter < UInt16.MaxValue) + pagecounter++; // Pagenumber not on titlepage + report.Info.Title = title; + PdfPage pdfPage = report.AddPage(); + XGraphics Titlepage = XGraphics.FromPdfPage(pdfPage); + var formatter = new XTextFormatter(Titlepage); + var layoutRectangle = new XRect(1, 1, 1, 1); + Titlepage.DrawImage(logo, new XRect(ReportParams.LogoXPos, ReportParams.LogoYPos, ReportParams.LogoXSize, ReportParams.LogoYSize)); + Titlepage.DrawString($"{title}\n\n\n", ReportParams.font20, XBrushes.Black, new XRect(0, -200, pdfPage.Width.Point, pdfPage.Height.Point), XStringFormats.Center); + Titlepage.DrawString(date, ReportParams.font14, XBrushes.Black, new XRect(0, -100, pdfPage.Width.Point, pdfPage.Height.Point), XStringFormats.Center); + Titlepage.DrawString("by", ReportParams.font12, XBrushes.Black, new XRect(0, -50, pdfPage.Width.Point, pdfPage.Height.Point), XStringFormats.Center); + Titlepage.DrawString(operatorName, ReportParams.font14, XBrushes.Black, new XRect(0, 0, pdfPage.Width.Point, pdfPage.Height.Point), XStringFormats.Center); + Titlepage.DrawString($"Serial number: {serialNo}", ReportParams.font14, XBrushes.Black, new XRect(0, 100, pdfPage.Width.Point, pdfPage.Height.Point), XStringFormats.Center); + formatter.DrawString(introduction, ReportParams.fontStandard, XBrushes.Black, new XRect(ReportParams.IntroductionXPos, ReportParams.IntroductionYPos, 400, 200), XStringFormats.TopLeft); + #endregion + #endregion + } + catch (Exception ex) + { + #region Error + ErrorLog.Log(LogErrReason.Exeption, "ReportPages.TitlePage() failed", $"0x{ex.HResult.ToString("X", culture)}", String.Empty, culture); + #endregion + } + + #region Return value + return pagecounter; + #endregion + } + + public static void ReturnNote(String headline, String text, PdfDocument report) + { + #region CA1062 + if ((text == null) || (report == null)) + return; + #endregion + const Int32 LinesPerPage = 70; + String[] Lines = text.Split('\n'); + Double NumberOfNewlines = (Double)Lines.Count(); + Double aux = (NumberOfNewlines / LinesPerPage); + Int32 NumberOfPages = (Int32)Math.Ceiling(aux); + String[] StringArray = new String[NumberOfPages]; + + for (Int32 i = 0; i < (NumberOfNewlines); i++) + { + Int32 Pageindex = (Int32)Math.Floor(((Double)i / LinesPerPage)); + StringArray[Pageindex] = $"{StringArray[Pageindex]}{Lines[i]}\n"; + } + + //formatter.DrawString(text, ReportParams.fontStandard, XBrushes.Black, new XRect(50, 100, 0, 0), XStringFormats.TopLeft); + //Logfile.DrawString(text, ReportParams.fontStandard, XBrushes.Black, new XRect(10, 20, pdfPage.Width.Point, pdfPage.Height.Point), XStringFormats.TopLeft); + + for (Int32 i = 0; i < NumberOfPages; i++) + { + PdfPage pdfPage = report.AddPage(); + XGraphics Logfile = XGraphics.FromPdfPage(pdfPage); + var formatter = new XTextFormatter(Logfile); + var layoutRectangle = new XRect(1, 1, 1, 1); + //Logfile.DrawImage(logo, new XRect(ReportParams.LogoXPos, ReportParams.LogoYPos, ReportParams.LogoXSize, ReportParams.LogoYSize)); + if (i == 0) + { + formatter.DrawString(headline, ReportParams.font20, XBrushes.Black, new XRect(250, 20, 600, 20), XStringFormats.TopLeft); + formatter.DrawString(StringArray[i], ReportParams.fontVerySmall, XBrushes.Black, new XRect(60, 50, 600, 20), XStringFormats.TopLeft); + } + else + formatter.DrawString(StringArray[i], ReportParams.fontVerySmall, XBrushes.Black, new XRect(50, 70, 600, 20), XStringFormats.TopLeft); + } + + } + + public static Int32 Settings(Int32 pagecounter, String textSoftwareVersion, String[] columns, Boolean enable, PdfDocument report, XImage logo, CultureInfo culture) + { + #region CA1062 + if ((report == null) || (columns == null)) + return 0; + #endregion + try + { + #region Page "SETTINGS" + #region Generate page + if (pagecounter < Int32.MaxValue) + pagecounter++; + PdfPage pdfPage = report.AddPage(); + XGraphics Gp30Settings = XGraphics.FromPdfPage(pdfPage); + var formatterGp30Settings = new XTextFormatter(Gp30Settings); + var layoutRectangleGp30Settings = new XRect(1, 1, 1, 1); + #endregion + #region Set Image/ Logo + Gp30Settings.DrawImage(logo, new XRect(ReportParams.LogoXPos, ReportParams.LogoYPos, ReportParams.LogoXSize, ReportParams.LogoYSize)); + #endregion + #region Headline1 + Gp30Settings.DrawString("Settings", ReportParams.font20, XBrushes.Black, new XRect(ReportParams.HeadlineXPos, ReportParams.HeadlineYPos, pdfPage.Width.Point, pdfPage.Height.Point), XStringFormats.TopCenter); + #endregion + #region Headline2 (first) + Gp30Settings.DrawString("Software Version", ReportParams.font12, XBrushes.Black, new XRect(ReportParams.Headline2XPos, ReportParams.Headline2YPos, pdfPage.Width.Point, pdfPage.Height.Point), XStringFormats.TopLeft); + #endregion + #region Data + formatterGp30Settings.DrawString(textSoftwareVersion, ReportParams.fontStandard, XBrushes.Black, new XRect(ReportParams.StandardTextXPos, ReportParams.StandardTextYPos, 400, 200), XStringFormats.TopLeft); + #endregion + #region GP30 settings + if (enable) + { + #region Headline2 + Gp30Settings.DrawString("Values obtained from register readout", ReportParams.font12, XBrushes.Black, new XRect(ReportParams.Headline2XPos, ReportParams.Headline2YPos + 150, pdfPage.Width.Point, pdfPage.Height.Point), XStringFormats.TopLeft); + #endregion + #region Data/ text + formatterGp30Settings.DrawString(columns[ReportParams.Column1], ReportParams.fontStandard, XBrushes.Black, new XRect(ReportParams.StandardTextXPos, ReportParams.StandardTextYPos + 150, 400, 200), XStringFormats.TopLeft); + formatterGp30Settings.DrawString(columns[ReportParams.Column2], ReportParams.fontStandard, XBrushes.Black, new XRect(ReportParams.StandardTextXPos + 140, ReportParams.StandardTextYPos + 150, 400, 200), XStringFormats.TopLeft); + formatterGp30Settings.DrawString(columns[ReportParams.Column3], ReportParams.fontStandard, XBrushes.Black, new XRect(ReportParams.StandardTextXPos + 190, ReportParams.StandardTextYPos + 150, 400, 200), XStringFormats.TopLeft); + #endregion + } + #endregion + #region Set page number + Gp30Settings.DrawString($"Page {pagecounter.ToString(culture)}", ReportParams.font12, XBrushes.Black, new XRect(ReportParams.PageNumberXPosition, ReportParams.PageNumberYPosition, pdfPage.Width.Point, pdfPage.Height.Point), XStringFormats.BottomCenter); + #endregion + #endregion + } + catch (Exception ex) + { + #region Error + ErrorLog.Log(LogErrReason.Exeption, "ReportPages.Settings() failed", $"0x{ex.HResult.ToString("X", culture)}", String.Empty, culture); + #endregion + } + + #region Return values + return pagecounter; + #endregion + } + + public static UInt16 DecodedData(UInt16 pagecounter, String[] columns, Boolean enable, Boolean enableColumn2, Boolean enableColumn3, Boolean enableColumn4, PdfDocument report, XImage logo, CultureInfo culture) + { + const Int32 WaitingTime = 100; + + #region CA1062 + if ((report == null) || (columns == null)) + return 0; + #endregion + + try + { + #region Page "MEAN VALUES" + if ((enable) && ((enableColumn2) || (enableColumn3) || (enableColumn4))) + { + #region All PATHs + #region Prepare Data + if (pagecounter < UInt16.MaxValue) + pagecounter++; + PdfPage pdfPage = report.AddPage(); + XGraphics XMean = XGraphics.FromPdfPage(pdfPage); + var formatterData = new XTextFormatter(XMean); + var layoutRectangleData = new XRect(1, 1, 1, 1); + int Xoffset = -20; + #endregion + #region Headline1 + XMean.DrawString("Decoded Data", ReportParams.font20, XBrushes.Black, new XRect(ReportParams.HeadlineXPos, ReportParams.HeadlineYPos, pdfPage.Width.Point, pdfPage.Height.Point), XStringFormats.TopCenter); + #endregion + #region Set text (First column) + if (!enableColumn2) + Xoffset = Xoffset + 40; + if (!enableColumn3) + Xoffset = Xoffset + 40; + if (!enableColumn4) + Xoffset = Xoffset + 40; + formatterData.DrawString(columns[ReportParams.Column1], ReportParams.fontStandard, XBrushes.Black, new XRect(ReportParams.StandardTextXPos + Xoffset, ReportParams.StandardTextYPos, 400, 200), XStringFormats.TopLeft); + Xoffset = Xoffset + 120; + #endregion + #region Set Image/Logo + XMean.DrawImage(logo, new XRect(ReportParams.LogoXPos, ReportParams.LogoYPos, ReportParams.LogoXSize, ReportParams.LogoYSize)); + #endregion + #region Add pagenumber + XMean.DrawString("Page " + pagecounter.ToString(culture), ReportParams.font12, XBrushes.Black, new XRect(ReportParams.PageNumberXPosition, ReportParams.PageNumberYPosition, pdfPage.Width.Point, pdfPage.Height.Point), XStringFormats.BottomCenter); + #endregion + #endregion + #region PATH0 + if (enableColumn2) + { + Misc.WaitNMilliseconds(WaitingTime); + #region Headline2 + XMean.DrawString("PATH1", ReportParams.font12, XBrushes.Black, new XRect(ReportParams.Headline2XPos + Xoffset, ReportParams.Headline2YPos + 20, pdfPage.Width.Point, pdfPage.Height.Point), XStringFormats.TopLeft); + #endregion + #region Set text + formatterData.DrawString(columns[ReportParams.Column2], ReportParams.fontStandard, XBrushes.Black, new XRect(ReportParams.StandardTextXPos + Xoffset, ReportParams.StandardTextYPos, 400, 200), XStringFormats.TopLeft); + Xoffset = Xoffset + 110; + #endregion + } + #endregion + #region PATH1 + if (enableColumn3) + { + Misc.WaitNMilliseconds(WaitingTime); + #region Headline2 + XMean.DrawString("PATH2", ReportParams.font12, XBrushes.Black, new XRect(ReportParams.Headline2XPos + Xoffset, ReportParams.Headline2YPos + 20, pdfPage.Width.Point, pdfPage.Height.Point), XStringFormats.TopLeft); + #endregion + #region Set text + formatterData.DrawString(columns[ReportParams.Column3], ReportParams.fontStandard, XBrushes.Black, new XRect(ReportParams.StandardTextXPos + Xoffset, ReportParams.StandardTextYPos, 400, 200), XStringFormats.TopLeft); + Xoffset = Xoffset + 110; + #endregion + } + #endregion + #region PATH2 + if (enableColumn4) + { + Misc.WaitNMilliseconds(WaitingTime); + #region Headline2 + XMean.DrawString("PATH3", ReportParams.font12, XBrushes.Black, new XRect(ReportParams.Headline2XPos + Xoffset, ReportParams.Headline2YPos + 20, pdfPage.Width.Point, pdfPage.Height.Point), XStringFormats.TopLeft); + #endregion + #region Set text + formatterData.DrawString(columns[ReportParams.Column4], ReportParams.fontStandard, XBrushes.Black, new XRect(ReportParams.StandardTextXPos + Xoffset, ReportParams.StandardTextYPos, 400, 200), XStringFormats.TopLeft); + #endregion + } + #endregion + } + #endregion + } + catch (Exception ex) + { + #region Error + ErrorLog.Log(LogErrReason.Exeption, "ReportPages.DecodedData() failed", $"0x{ex.HResult.ToString("X", culture)}", String.Empty, culture); + #endregion + } + + #region Return values + return pagecounter; + #endregion + } + + + } +} \ No newline at end of file diff --git a/ZeroFlowTool/Sensus-Xylem-lockup.jpg b/ZeroFlowTool/Sensus-Xylem-lockup.jpg new file mode 100644 index 00000000..86a0aa4b Binary files /dev/null and b/ZeroFlowTool/Sensus-Xylem-lockup.jpg differ diff --git a/ZeroFlowTool/Sequences.cs b/ZeroFlowTool/Sequences.cs new file mode 100644 index 00000000..94884453 --- /dev/null +++ b/ZeroFlowTool/Sequences.cs @@ -0,0 +1,6783 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Globalization; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Drawing.Printing; +using System.IO; +using System.IO.Ports; + + +namespace GenesisZeroFlow +{ + #region Static classes + public partial class GenesisZeroFlow + { + private Boolean[] DetectionSequence(Boolean[] enable) + { + #region Definitions and initializations + Boolean[] Ok = new Boolean[Constants.NumberOfMeters * 2]; + String DebugMessage = String.Empty; + Boolean SerialPortClosed = false; + + for (UInt16 i = 0; i < (Constants.NumberOfMeters * 2); i++) + Ok[i] = false; + #endregion + #region Get serial ports + SerialConfigCmdMeter1.Init(Constants.CmdMeter1); + SerialConfigCmdMeter2.Init(Constants.CmdMeter2); + SerialConfigCmdMeter3.Init(Constants.CmdMeter3); + SerialConfigCmdMeter4.Init(Constants.CmdMeter4); + SerialConfigCmdMeter5.Init(Constants.CmdMeter5); + SerialConfigCmdMeter6.Init(Constants.CmdMeter6); + SerialConfigCmdMeter7.Init(Constants.CmdMeter7); + SerialConfigCmdMeter8.Init(Constants.CmdMeter8); + SerialConfigCmdMeter9.Init(Constants.CmdMeter9); + SerialConfigCmdMeter10.Init(Constants.CmdMeter10); + SerialConfigDataMeter1.Init(Constants.DataMeter1); + SerialConfigDataMeter2.Init(Constants.DataMeter2); + SerialConfigDataMeter3.Init(Constants.DataMeter3); + SerialConfigDataMeter4.Init(Constants.DataMeter4); + SerialConfigDataMeter5.Init(Constants.DataMeter5); + SerialConfigDataMeter6.Init(Constants.DataMeter6); + SerialConfigDataMeter7.Init(Constants.DataMeter7); + SerialConfigDataMeter8.Init(Constants.DataMeter8); + SerialConfigDataMeter9.Init(Constants.DataMeter9); + SerialConfigDataMeter10.Init(Constants.DataMeter10); + #endregion + #region Close ports + SerialPortClosed = SerialConfigCmdMeter1.ClosePort(serialPortCmdMeter1, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigCmdMeter2.ClosePort(serialPortCmdMeter2, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigCmdMeter3.ClosePort(serialPortCmdMeter3, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigCmdMeter4.ClosePort(serialPortCmdMeter4, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigCmdMeter5.ClosePort(serialPortCmdMeter5, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigCmdMeter6.ClosePort(serialPortCmdMeter6, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigCmdMeter7.ClosePort(serialPortCmdMeter7, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigCmdMeter8.ClosePort(serialPortCmdMeter8, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigCmdMeter9.ClosePort(serialPortCmdMeter9, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigCmdMeter10.ClosePort(serialPortCmdMeter10, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigDataMeter1.ClosePort(serialPortDataMeter1, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigDataMeter2.ClosePort(serialPortDataMeter2, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigDataMeter3.ClosePort(serialPortDataMeter3, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigDataMeter4.ClosePort(serialPortDataMeter4, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigDataMeter5.ClosePort(serialPortDataMeter5, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigDataMeter6.ClosePort(serialPortDataMeter6, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigDataMeter7.ClosePort(serialPortDataMeter7, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigDataMeter8.ClosePort(serialPortDataMeter8, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigDataMeter9.ClosePort(serialPortDataMeter9, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigDataMeter10.ClosePort(serialPortDataMeter10, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + #endregion + #region Get settings from file + serialPortCmdMeter1 = SerialConfigCmdMeter1.GetParamsFromFile(SerialSettings.Path); + serialPortCmdMeter2 = SerialConfigCmdMeter2.GetParamsFromFile(SerialSettings.Path); + serialPortCmdMeter3 = SerialConfigCmdMeter3.GetParamsFromFile(SerialSettings.Path); + serialPortCmdMeter4 = SerialConfigCmdMeter4.GetParamsFromFile(SerialSettings.Path); + serialPortCmdMeter5 = SerialConfigCmdMeter5.GetParamsFromFile(SerialSettings.Path); + serialPortCmdMeter6 = SerialConfigCmdMeter6.GetParamsFromFile(SerialSettings.Path); + serialPortCmdMeter7 = SerialConfigCmdMeter7.GetParamsFromFile(SerialSettings.Path); + serialPortCmdMeter8 = SerialConfigCmdMeter8.GetParamsFromFile(SerialSettings.Path); + serialPortCmdMeter9 = SerialConfigCmdMeter9.GetParamsFromFile(SerialSettings.Path); + serialPortCmdMeter10 = SerialConfigCmdMeter10.GetParamsFromFile(SerialSettings.Path); + serialPortDataMeter1 = SerialConfigDataMeter1.GetParamsFromFile(SerialSettings.Path); + serialPortDataMeter2 = SerialConfigDataMeter2.GetParamsFromFile(SerialSettings.Path); + serialPortDataMeter3 = SerialConfigDataMeter3.GetParamsFromFile(SerialSettings.Path); + serialPortDataMeter4 = SerialConfigDataMeter4.GetParamsFromFile(SerialSettings.Path); + serialPortDataMeter5 = SerialConfigDataMeter5.GetParamsFromFile(SerialSettings.Path); + serialPortDataMeter6 = SerialConfigDataMeter6.GetParamsFromFile(SerialSettings.Path); + serialPortDataMeter7 = SerialConfigDataMeter7.GetParamsFromFile(SerialSettings.Path); + serialPortDataMeter8 = SerialConfigDataMeter8.GetParamsFromFile(SerialSettings.Path); + serialPortDataMeter9 = SerialConfigDataMeter9.GetParamsFromFile(SerialSettings.Path); + serialPortDataMeter10 = SerialConfigDataMeter10.GetParamsFromFile(SerialSettings.Path); + #endregion + #region Open serial port + String[] ListOfComports = SerialConfigGetReadSettings.PortNames(); + + Ok[Constants.CmdMeter1] = SerialConfigCmdMeter1.OpenPort(serialPortCmdMeter1, out DebugMessage, enable[Constants.Meter1], ListOfComports); + if (enable[Constants.Meter1]) + Display.DebugMessage(DebugMessage); + Ok[Constants.CmdMeter2] = SerialConfigCmdMeter2.OpenPort(serialPortCmdMeter2, out DebugMessage, enable[Constants.Meter2], ListOfComports); + if (enable[Constants.Meter2]) + Display.DebugMessage(DebugMessage); + Ok[Constants.CmdMeter3] = SerialConfigCmdMeter3.OpenPort(serialPortCmdMeter3, out DebugMessage, enable[Constants.Meter3], ListOfComports); + if (enable[Constants.Meter3]) + Display.DebugMessage(DebugMessage); + Ok[Constants.CmdMeter4] = SerialConfigCmdMeter4.OpenPort(serialPortCmdMeter4, out DebugMessage, enable[Constants.Meter4], ListOfComports); + if (enable[Constants.Meter4]) + Display.DebugMessage(DebugMessage); + Ok[Constants.CmdMeter5] = SerialConfigCmdMeter5.OpenPort(serialPortCmdMeter5, out DebugMessage, enable[Constants.Meter5], ListOfComports); + if (enable[Constants.Meter5]) + Display.DebugMessage(DebugMessage); + Ok[Constants.CmdMeter6] = SerialConfigCmdMeter6.OpenPort(serialPortCmdMeter6, out DebugMessage, enable[Constants.Meter6], ListOfComports); + if (enable[Constants.Meter6]) + Display.DebugMessage(DebugMessage); + Ok[Constants.CmdMeter7] = SerialConfigCmdMeter7.OpenPort(serialPortCmdMeter7, out DebugMessage, enable[Constants.Meter7], ListOfComports); + if (enable[Constants.Meter7]) + Display.DebugMessage(DebugMessage); + Ok[Constants.CmdMeter8] = SerialConfigCmdMeter8.OpenPort(serialPortCmdMeter8, out DebugMessage, enable[Constants.Meter8], ListOfComports); + if (enable[Constants.Meter8]) + Display.DebugMessage(DebugMessage); + Ok[Constants.CmdMeter9] = SerialConfigCmdMeter9.OpenPort(serialPortCmdMeter9, out DebugMessage, enable[Constants.Meter9], ListOfComports); + if (enable[Constants.Meter9]) + Display.DebugMessage(DebugMessage); + Ok[Constants.CmdMeter10] = SerialConfigCmdMeter10.OpenPort(serialPortCmdMeter10, out DebugMessage, enable[Constants.Meter10], ListOfComports); + if (enable[Constants.Meter10]) + Display.DebugMessage(DebugMessage); + Ok[Constants.DataMeter1] = SerialConfigDataMeter1.OpenPort(serialPortDataMeter1, out DebugMessage, enable[Constants.Meter1], ListOfComports); + if (enable[Constants.Meter1]) + Display.DebugMessage(DebugMessage); + Ok[Constants.DataMeter2] = SerialConfigDataMeter2.OpenPort(serialPortDataMeter2, out DebugMessage, enable[Constants.Meter2], ListOfComports); + if (enable[Constants.Meter2]) + Display.DebugMessage(DebugMessage); + Ok[Constants.DataMeter3] = SerialConfigDataMeter3.OpenPort(serialPortDataMeter3, out DebugMessage, enable[Constants.Meter3], ListOfComports); + if (enable[Constants.Meter3]) + Display.DebugMessage(DebugMessage); + Ok[Constants.DataMeter4] = SerialConfigDataMeter4.OpenPort(serialPortDataMeter4, out DebugMessage, enable[Constants.Meter4], ListOfComports); + if (enable[Constants.Meter4]) + Display.DebugMessage(DebugMessage); + Ok[Constants.DataMeter5] = SerialConfigDataMeter5.OpenPort(serialPortDataMeter5, out DebugMessage, enable[Constants.Meter5], ListOfComports); + if (enable[Constants.Meter5]) + Display.DebugMessage(DebugMessage); + Ok[Constants.DataMeter6] = SerialConfigDataMeter6.OpenPort(serialPortDataMeter6, out DebugMessage, enable[Constants.Meter6], ListOfComports); + if (enable[Constants.Meter6]) + Display.DebugMessage(DebugMessage); + Ok[Constants.DataMeter7] = SerialConfigDataMeter7.OpenPort(serialPortDataMeter7, out DebugMessage, enable[Constants.Meter7], ListOfComports); + if (enable[Constants.Meter7]) + Display.DebugMessage(DebugMessage); + Ok[Constants.DataMeter8] = SerialConfigDataMeter8.OpenPort(serialPortDataMeter8, out DebugMessage, enable[Constants.Meter8], ListOfComports); + if (enable[Constants.Meter8]) + Display.DebugMessage(DebugMessage); + Ok[Constants.DataMeter9] = SerialConfigDataMeter9.OpenPort(serialPortDataMeter9, out DebugMessage, enable[Constants.Meter9], ListOfComports); + if (enable[Constants.Meter9]) + Display.DebugMessage(DebugMessage); + Ok[Constants.DataMeter10] = SerialConfigDataMeter10.OpenPort(serialPortDataMeter10, out DebugMessage, enable[Constants.Meter10], ListOfComports); + if (enable[Constants.Meter10]) + Display.DebugMessage(DebugMessage); + #endregion + + return Ok; + } + private void CloseComportsSequence() + { + #region Definitions and initializations + Boolean[] Ok = new Boolean[Constants.NumberOfMeters * 2]; + String DebugMessage = String.Empty; + Boolean SerialPortClosed = false; + for (UInt16 ComportIndex = 0; ComportIndex < (Constants.NumberOfMeters * 2); ComportIndex++) + Ok[ComportIndex] = false; + #endregion + #region Get serial ports + SerialConfigCmdMeter1.Init(Constants.CmdMeter1); + SerialConfigCmdMeter2.Init(Constants.CmdMeter2); + SerialConfigCmdMeter3.Init(Constants.CmdMeter3); + SerialConfigCmdMeter4.Init(Constants.CmdMeter4); + SerialConfigCmdMeter5.Init(Constants.CmdMeter5); + SerialConfigCmdMeter6.Init(Constants.CmdMeter6); + SerialConfigCmdMeter7.Init(Constants.CmdMeter7); + SerialConfigCmdMeter8.Init(Constants.CmdMeter8); + SerialConfigCmdMeter9.Init(Constants.CmdMeter9); + SerialConfigCmdMeter10.Init(Constants.CmdMeter10); + SerialConfigDataMeter1.Init(Constants.DataMeter1); + SerialConfigDataMeter2.Init(Constants.DataMeter2); + SerialConfigDataMeter3.Init(Constants.DataMeter3); + SerialConfigDataMeter4.Init(Constants.DataMeter4); + SerialConfigDataMeter5.Init(Constants.DataMeter5); + SerialConfigDataMeter6.Init(Constants.DataMeter6); + SerialConfigDataMeter7.Init(Constants.DataMeter7); + SerialConfigDataMeter8.Init(Constants.DataMeter8); + SerialConfigDataMeter9.Init(Constants.DataMeter9); + SerialConfigDataMeter10.Init(Constants.DataMeter10); + #endregion + #region Open comports + SerialPortClosed = SerialConfigCmdMeter1.ClosePort(serialPortCmdMeter1, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigCmdMeter2.ClosePort(serialPortCmdMeter2, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigCmdMeter3.ClosePort(serialPortCmdMeter3, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigCmdMeter4.ClosePort(serialPortCmdMeter4, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigCmdMeter5.ClosePort(serialPortCmdMeter5, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigCmdMeter6.ClosePort(serialPortCmdMeter6, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigCmdMeter7.ClosePort(serialPortCmdMeter7, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigCmdMeter8.ClosePort(serialPortCmdMeter8, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigCmdMeter9.ClosePort(serialPortCmdMeter9, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigCmdMeter10.ClosePort(serialPortCmdMeter10, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigDataMeter1.ClosePort(serialPortDataMeter1, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigDataMeter2.ClosePort(serialPortDataMeter2, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigDataMeter3.ClosePort(serialPortDataMeter3, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigDataMeter4.ClosePort(serialPortDataMeter4, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigDataMeter5.ClosePort(serialPortDataMeter5, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigDataMeter6.ClosePort(serialPortDataMeter6, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigDataMeter7.ClosePort(serialPortDataMeter7, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigDataMeter8.ClosePort(serialPortDataMeter8, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigDataMeter9.ClosePort(serialPortDataMeter9, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + SerialPortClosed = SerialConfigDataMeter10.ClosePort(serialPortDataMeter10, out DebugMessage); + if (SerialPortClosed) + Display.DebugMessage(DebugMessage); + #endregion + } + } + public static partial class Logging + { + public static void AppendToFile(String data, String path) + { + Task.Run(() => + { + using (StreamWriter sw = File.AppendText(path)) + { + sw.Write(data); + } + }); + + } + public static void WriteToFile(String data, String path) + { + String temp = data; + + Task.Run(() => + { + using (StreamWriter sw = File.CreateText(path)) + { + sw.Write(temp); + } + }); + } + } + public static class PreparationSequences + { + public static Boolean[] Total(Boolean[] enable, CmdInterface[] commandInterface, String[] password, UInt16 numberOfTrials, UInt16 meterSize, out Boolean aborted) + { + #region Definitions and initializations + Int32 NextDelayTime = 0; + Boolean[] SequenceFailed = new Boolean[Constants.NumberOfMeters]; + Boolean[] Ok = new Boolean[Constants.NumberOfMeters]; + Boolean[] TaskStarted = new Boolean[Constants.NumberOfMeters]; + Boolean[] TaskCompleted = new Boolean[Constants.NumberOfMeters]; + + aborted = false; + + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + { + SequenceFailed[Meter] = false; + Ok[Meter] = false; + TaskStarted[Meter] = false; + TaskCompleted[Meter] = false; + } + + #region CA1062 + if ((enable == null) || (password == null) || (commandInterface == null)) + return Ok; + #endregion + + Preparation PreparationMeter1 = new Preparation(); + Preparation PreparationMeter2 = new Preparation(); + Preparation PreparationMeter3 = new Preparation(); + Preparation PreparationMeter4 = new Preparation(); + Preparation PreparationMeter5 = new Preparation(); + Preparation PreparationMeter6 = new Preparation(); + Preparation PreparationMeter7 = new Preparation(); + Preparation PreparationMeter8 = new Preparation(); + Preparation PreparationMeter9 = new Preparation(); + Preparation PreparationMeter10 = new Preparation(); + + PreparationMeter1.Initialize(commandInterface[Constants.Meter1], Constants.Meter1, numberOfTrials, meterSize); + PreparationMeter2.Initialize(commandInterface[Constants.Meter2], Constants.Meter2, numberOfTrials, meterSize); + PreparationMeter3.Initialize(commandInterface[Constants.Meter3], Constants.Meter3, numberOfTrials, meterSize); + PreparationMeter4.Initialize(commandInterface[Constants.Meter4], Constants.Meter4, numberOfTrials, meterSize); + PreparationMeter5.Initialize(commandInterface[Constants.Meter5], Constants.Meter5, numberOfTrials, meterSize); + PreparationMeter6.Initialize(commandInterface[Constants.Meter6], Constants.Meter6, numberOfTrials, meterSize); + PreparationMeter7.Initialize(commandInterface[Constants.Meter7], Constants.Meter7, numberOfTrials, meterSize); + PreparationMeter8.Initialize(commandInterface[Constants.Meter8], Constants.Meter8, numberOfTrials, meterSize); + PreparationMeter9.Initialize(commandInterface[Constants.Meter9], Constants.Meter9, numberOfTrials, meterSize); + PreparationMeter10.Initialize(commandInterface[Constants.Meter10], Constants.Meter10, numberOfTrials, meterSize); + + LogOn LogOn1 = new LogOn(); + LogOn LogOn2 = new LogOn(); + LogOn LogOn3 = new LogOn(); + LogOn LogOn4 = new LogOn(); + LogOn LogOn5 = new LogOn(); + LogOn LogOn6 = new LogOn(); + LogOn LogOn7 = new LogOn(); + LogOn LogOn8 = new LogOn(); + LogOn LogOn9 = new LogOn(); + LogOn LogOn10 = new LogOn(); + + LogOn1.Initialize(commandInterface[Constants.Meter1], password[Constants.Meter1], Constants.Meter1, numberOfTrials); + LogOn2.Initialize(commandInterface[Constants.Meter2], password[Constants.Meter2], Constants.Meter2, numberOfTrials); + LogOn3.Initialize(commandInterface[Constants.Meter3], password[Constants.Meter3], Constants.Meter3, numberOfTrials); + LogOn4.Initialize(commandInterface[Constants.Meter4], password[Constants.Meter4], Constants.Meter4, numberOfTrials); + LogOn5.Initialize(commandInterface[Constants.Meter5], password[Constants.Meter5], Constants.Meter5, numberOfTrials); + LogOn6.Initialize(commandInterface[Constants.Meter6], password[Constants.Meter6], Constants.Meter6, numberOfTrials); + LogOn7.Initialize(commandInterface[Constants.Meter7], password[Constants.Meter7], Constants.Meter7, numberOfTrials); + LogOn8.Initialize(commandInterface[Constants.Meter8], password[Constants.Meter8], Constants.Meter8, numberOfTrials); + LogOn9.Initialize(commandInterface[Constants.Meter9], password[Constants.Meter9], Constants.Meter9, numberOfTrials); + LogOn10.Initialize(commandInterface[Constants.Meter10], password[Constants.Meter10], Constants.Meter10, numberOfTrials); + #endregion + + using (CancellationTokenSource cancellationTokenSource = new CancellationTokenSource()) + { + #region Everything else + CancellationToken token = cancellationTokenSource.Token; + Task Task1 = new Task(() => { return true; }); + Task Task2 = new Task(() => { return true; }); + Task Task3 = new Task(() => { return true; }); + Task Task4 = new Task(() => { return true; }); + Task Task5 = new Task(() => { return true; }); + Task Task6 = new Task(() => { return true; }); + Task Task7 = new Task(() => { return true; }); + Task Task8 = new Task(() => { return true; }); + Task Task9 = new Task(() => { return true; }); + Task Task10 = new Task(() => { return true; }); + + PreparationMeter1.Meter(enable[Constants.Meter1], ref Task1, ref TaskStarted[Constants.Meter1], ref SequenceFailed[Constants.Meter1], LogOn1, PreparationMeter1, ref NextDelayTime, token); + PreparationMeter2.Meter(enable[Constants.Meter2], ref Task2, ref TaskStarted[Constants.Meter2], ref SequenceFailed[Constants.Meter2], LogOn2, PreparationMeter2, ref NextDelayTime, token); + PreparationMeter3.Meter(enable[Constants.Meter3], ref Task3, ref TaskStarted[Constants.Meter3], ref SequenceFailed[Constants.Meter3], LogOn3, PreparationMeter3, ref NextDelayTime, token); + PreparationMeter4.Meter(enable[Constants.Meter4], ref Task4, ref TaskStarted[Constants.Meter4], ref SequenceFailed[Constants.Meter4], LogOn4, PreparationMeter4, ref NextDelayTime, token); + PreparationMeter5.Meter(enable[Constants.Meter5], ref Task5, ref TaskStarted[Constants.Meter5], ref SequenceFailed[Constants.Meter5], LogOn5, PreparationMeter5, ref NextDelayTime, token); + PreparationMeter6.Meter(enable[Constants.Meter6], ref Task6, ref TaskStarted[Constants.Meter6], ref SequenceFailed[Constants.Meter6], LogOn6, PreparationMeter6, ref NextDelayTime, token); + PreparationMeter7.Meter(enable[Constants.Meter7], ref Task7, ref TaskStarted[Constants.Meter7], ref SequenceFailed[Constants.Meter7], LogOn7, PreparationMeter7, ref NextDelayTime, token); + PreparationMeter8.Meter(enable[Constants.Meter8], ref Task8, ref TaskStarted[Constants.Meter8], ref SequenceFailed[Constants.Meter8], LogOn8, PreparationMeter8, ref NextDelayTime, token); + PreparationMeter9.Meter(enable[Constants.Meter9], ref Task9, ref TaskStarted[Constants.Meter9], ref SequenceFailed[Constants.Meter9], LogOn9, PreparationMeter9, ref NextDelayTime, token); + PreparationMeter10.Meter(enable[Constants.Meter10], ref Task10, ref TaskStarted[Constants.Meter10], ref SequenceFailed[Constants.Meter10], LogOn10, PreparationMeter10, ref NextDelayTime, token); + #endregion + #region Wait for tasks + Int32[] KeepAuthentifiedCounter = new Int32[Constants.NumberOfMeters]; + Boolean[] SequenceOk = new Boolean[Constants.NumberOfMeters]; + + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + { + SequenceOk[Meter] = false; + KeepAuthentifiedCounter[Meter] = 0; + } + + while (!CheckArray(TaskCompleted)) + { + if (GenesisZeroFlow._GenesisZeroFlow.AbortIndicator) + { + cancellationTokenSource.Cancel(); + aborted = true; + GenesisZeroFlow.Display.DebugCrcIndicatorVisible(false); + } + + TaskCompleted[Constants.Meter1] = Misc.WaitForTask(TaskStarted[Constants.Meter1], Task1); + TaskCompleted[Constants.Meter2] = Misc.WaitForTask(TaskStarted[Constants.Meter2], Task2); + TaskCompleted[Constants.Meter3] = Misc.WaitForTask(TaskStarted[Constants.Meter3], Task3); + TaskCompleted[Constants.Meter4] = Misc.WaitForTask(TaskStarted[Constants.Meter4], Task4); + TaskCompleted[Constants.Meter5] = Misc.WaitForTask(TaskStarted[Constants.Meter5], Task5); + TaskCompleted[Constants.Meter6] = Misc.WaitForTask(TaskStarted[Constants.Meter6], Task6); + TaskCompleted[Constants.Meter7] = Misc.WaitForTask(TaskStarted[Constants.Meter7], Task7); + TaskCompleted[Constants.Meter8] = Misc.WaitForTask(TaskStarted[Constants.Meter8], Task8); + TaskCompleted[Constants.Meter9] = Misc.WaitForTask(TaskStarted[Constants.Meter9], Task9); + TaskCompleted[Constants.Meter10] = Misc.WaitForTask(TaskStarted[Constants.Meter10], Task10); + PreparationMeter1.KeepAuthentified(enable[Constants.Meter1], SequenceOk[Constants.Meter1], TaskCompleted[Constants.Meter1], ref KeepAuthentifiedCounter[Constants.Meter1], LogOn1); + PreparationMeter2.KeepAuthentified(enable[Constants.Meter2], SequenceOk[Constants.Meter2], TaskCompleted[Constants.Meter2], ref KeepAuthentifiedCounter[Constants.Meter2], LogOn2); + PreparationMeter3.KeepAuthentified(enable[Constants.Meter3], SequenceOk[Constants.Meter3], TaskCompleted[Constants.Meter3], ref KeepAuthentifiedCounter[Constants.Meter3], LogOn3); + PreparationMeter4.KeepAuthentified(enable[Constants.Meter4], SequenceOk[Constants.Meter4], TaskCompleted[Constants.Meter4], ref KeepAuthentifiedCounter[Constants.Meter4], LogOn4); + PreparationMeter5.KeepAuthentified(enable[Constants.Meter5], SequenceOk[Constants.Meter5], TaskCompleted[Constants.Meter5], ref KeepAuthentifiedCounter[Constants.Meter5], LogOn5); + PreparationMeter6.KeepAuthentified(enable[Constants.Meter6], SequenceOk[Constants.Meter6], TaskCompleted[Constants.Meter6], ref KeepAuthentifiedCounter[Constants.Meter6], LogOn6); + PreparationMeter7.KeepAuthentified(enable[Constants.Meter7], SequenceOk[Constants.Meter7], TaskCompleted[Constants.Meter7], ref KeepAuthentifiedCounter[Constants.Meter7], LogOn7); + PreparationMeter8.KeepAuthentified(enable[Constants.Meter8], SequenceOk[Constants.Meter8], TaskCompleted[Constants.Meter8], ref KeepAuthentifiedCounter[Constants.Meter8], LogOn8); + PreparationMeter9.KeepAuthentified(enable[Constants.Meter9], SequenceOk[Constants.Meter9], TaskCompleted[Constants.Meter9], ref KeepAuthentifiedCounter[Constants.Meter9], LogOn9); + PreparationMeter10.KeepAuthentified(enable[Constants.Meter10], SequenceOk[Constants.Meter10], TaskCompleted[Constants.Meter10], ref KeepAuthentifiedCounter[Constants.Meter10], LogOn10); + Misc.WaitNSeconds(1); + + SequenceFailed = GetTaskResult(TaskStarted, Task1, Task2, Task3, Task4, Task5, Task6, Task7, Task8, Task8, Task10); + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + SequenceOk[Meter] = !SequenceFailed[Meter]; + + GenesisZeroFlow.Display.MeterStatusGreenRed(SequenceOk, TaskStarted); + } + + SequenceFailed = GetTaskResult(TaskStarted, Task1, Task2, Task3, Task4, Task5, Task6, Task7, Task8, Task8, Task10); + + if ((Task1.Status == TaskStatus.RanToCompletion) || (Task1.Status == TaskStatus.Canceled) || (Task1.Status == TaskStatus.Faulted)) + Task1.Dispose(); + if ((Task2.Status == TaskStatus.RanToCompletion) || (Task2.Status == TaskStatus.Canceled) || (Task2.Status == TaskStatus.Faulted)) + Task2.Dispose(); + if ((Task3.Status == TaskStatus.RanToCompletion) || (Task3.Status == TaskStatus.Canceled) || (Task3.Status == TaskStatus.Faulted)) + Task3.Dispose(); + if ((Task4.Status == TaskStatus.RanToCompletion) || (Task4.Status == TaskStatus.Canceled) || (Task4.Status == TaskStatus.Faulted)) + Task4.Dispose(); + if ((Task5.Status == TaskStatus.RanToCompletion) || (Task5.Status == TaskStatus.Canceled) || (Task5.Status == TaskStatus.Faulted)) + Task5.Dispose(); + if ((Task6.Status == TaskStatus.RanToCompletion) || (Task6.Status == TaskStatus.Canceled) || (Task6.Status == TaskStatus.Faulted)) + Task6.Dispose(); + if ((Task7.Status == TaskStatus.RanToCompletion) || (Task7.Status == TaskStatus.Canceled) || (Task7.Status == TaskStatus.Faulted)) + Task7.Dispose(); + if ((Task8.Status == TaskStatus.RanToCompletion) || (Task8.Status == TaskStatus.Canceled) || (Task8.Status == TaskStatus.Faulted)) + Task8.Dispose(); + if ((Task9.Status == TaskStatus.RanToCompletion) || (Task9.Status == TaskStatus.Canceled) || (Task9.Status == TaskStatus.Faulted)) + Task9.Dispose(); + if ((Task10.Status == TaskStatus.RanToCompletion) || (Task10.Status == TaskStatus.Canceled) || (Task10.Status == TaskStatus.Faulted)) + Task10.Dispose(); + #endregion + } + + return SequenceFailed; + } + private static Boolean[] GetTaskResult(Boolean[] enable, Task Task1, Task Task2, Task Task3, Task Task4, Task Task5, Task Task6, Task Task7, Task Task8, Task Task9, Task Task10) + { + #region Definitions and initializations + Boolean[] failed = new Boolean[Constants.NumberOfMeters]; + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + failed[Meter] = false; + #endregion + #region METER1 + if (enable[Constants.Meter1]) + { + if (Task1.Status != TaskStatus.Running) + { + if (Task1.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter1] = Task1.Result; + if (Task1.Status == TaskStatus.Faulted) + failed[Constants.Meter1] = true; + if (Task1.Status == TaskStatus.Canceled) + failed[Constants.Meter1] = true; + } + } + #endregion + #region METER2 + if (enable[Constants.Meter2] && Task2.Status != TaskStatus.Running) + { + if (Task2.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter2] = Task2.Result; + if (Task2.Status == TaskStatus.Faulted) + failed[Constants.Meter2] = true; + if (Task2.Status == TaskStatus.Canceled) + failed[Constants.Meter2] = true; + } + #endregion + #region METER3 + if (enable[Constants.Meter3] && Task3.Status != TaskStatus.Running) + { + if (Task3.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter3] = Task3.Result; + if (Task3.Status == TaskStatus.Faulted) + failed[Constants.Meter3] = true; + if (Task3.Status == TaskStatus.Canceled) + failed[Constants.Meter3] = true; + } + #endregion + #region METER4 + if (enable[Constants.Meter4] && Task4.Status != TaskStatus.Running) + { + if (Task4.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter4] = Task4.Result; + if (Task4.Status == TaskStatus.Faulted) + failed[Constants.Meter4] = true; + if (Task4.Status == TaskStatus.Canceled) + failed[Constants.Meter4] = true; + } + #endregion + #region METER5 + if (enable[Constants.Meter5] && Task5.Status != TaskStatus.Running) + { + if (Task5.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter5] = Task5.Result; + if (Task5.Status == TaskStatus.Faulted) + failed[Constants.Meter5] = true; + if (Task5.Status == TaskStatus.Canceled) + failed[Constants.Meter5] = true; + } + #endregion + #region METER6 + if (enable[Constants.Meter6] && Task6.Status != TaskStatus.Running) + { + if (Task6.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter6] = Task6.Result; + if (Task6.Status == TaskStatus.Faulted) + failed[Constants.Meter6] = true; + if (Task6.Status == TaskStatus.Canceled) + failed[Constants.Meter6] = true; + } + #endregion + #region METER7 + if (enable[Constants.Meter7] && Task7.Status != TaskStatus.Running) + { + if (Task7.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter7] = Task7.Result; + if (Task7.Status == TaskStatus.Faulted) + failed[Constants.Meter7] = true; + if (Task7.Status == TaskStatus.Canceled) + failed[Constants.Meter7] = true; + } + #endregion + #region METER8 + if (enable[Constants.Meter8] && Task8.Status != TaskStatus.Running) + { + if (Task8.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter8] = Task8.Result; + if (Task8.Status == TaskStatus.Faulted) + failed[Constants.Meter8] = true; + if (Task8.Status == TaskStatus.Canceled) + failed[Constants.Meter8] = true; + } + #endregion + #region METER9 + if (enable[Constants.Meter9] && Task9.Status != TaskStatus.Running) + { + if (Task9.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter9] = Task9.Result; + if (Task9.Status == TaskStatus.Faulted) + failed[Constants.Meter9] = true; + if (Task9.Status == TaskStatus.Canceled) + failed[Constants.Meter9] = true; + } + #endregion + #region METER10 + if (enable[Constants.Meter10] && Task10.Status != TaskStatus.Running) + { + if (Task10.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter10] = Task10.Result; + if (Task10.Status == TaskStatus.Faulted) + failed[Constants.Meter10] = true; + if (Task10.Status == TaskStatus.Canceled) + failed[Constants.Meter10] = true; + } + #endregion + return failed; + } + private static Boolean CheckArray(Boolean[] array) + { + Boolean Completed = true; + for (Int32 i = 0; i < array.Count(); i++) + { + if (array[i] == false) + return false; + } + return Completed; + } + + } + public static class EmptyPipeCheckSequences + { + public static Boolean[] Total(Boolean[] enable, out Boolean aborted) + { + #region Definitions and initializations + const Int32 WaitingTime = 60; + CultureInfo Culture = GenesisZeroFlow._GenesisZeroFlow.GetGlobalCulture(); + Boolean[] Aborted = new Boolean[Constants.NumberOfMeters]; + Boolean[] TaskCompleted = new Boolean[Constants.NumberOfMeters]; + Boolean[] SequenceFailed = new Boolean[Constants.NumberOfMeters]; + aborted = false; + + #region avoid CA1062 + if (enable == null) + { + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + SequenceFailed[Meter] = true; + return SequenceFailed; + } + #endregion + + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + SequenceFailed[Meter] = false; + + EmptyPipeCheck EmptyPipeCheck1 = new EmptyPipeCheck(); + EmptyPipeCheck EmptyPipeCheck2 = new EmptyPipeCheck(); + EmptyPipeCheck EmptyPipeCheck3 = new EmptyPipeCheck(); + EmptyPipeCheck EmptyPipeCheck4 = new EmptyPipeCheck(); + EmptyPipeCheck EmptyPipeCheck5 = new EmptyPipeCheck(); + EmptyPipeCheck EmptyPipeCheck6 = new EmptyPipeCheck(); + EmptyPipeCheck EmptyPipeCheck7 = new EmptyPipeCheck(); + EmptyPipeCheck EmptyPipeCheck8 = new EmptyPipeCheck(); + EmptyPipeCheck EmptyPipeCheck9 = new EmptyPipeCheck(); + EmptyPipeCheck EmptyPipeCheck10 = new EmptyPipeCheck(); + + EmptyPipeCheck1.Initialize(WaitingTime, Constants.Meter1, Culture); + EmptyPipeCheck2.Initialize(WaitingTime, Constants.Meter2, Culture); + EmptyPipeCheck3.Initialize(WaitingTime, Constants.Meter3, Culture); + EmptyPipeCheck4.Initialize(WaitingTime, Constants.Meter4, Culture); + EmptyPipeCheck5.Initialize(WaitingTime, Constants.Meter5, Culture); + EmptyPipeCheck6.Initialize(WaitingTime, Constants.Meter6, Culture); + EmptyPipeCheck7.Initialize(WaitingTime, Constants.Meter7, Culture); + EmptyPipeCheck8.Initialize(WaitingTime, Constants.Meter8, Culture); + EmptyPipeCheck9.Initialize(WaitingTime, Constants.Meter9, Culture); + EmptyPipeCheck10.Initialize(WaitingTime, Constants.Meter10, Culture); + + Task Task1 = new Task(() => { return true; }); + Task Task2 = new Task(() => { return true; }); + Task Task3 = new Task(() => { return true; }); + Task Task4 = new Task(() => { return true; }); + Task Task5 = new Task(() => { return true; }); + Task Task6 = new Task(() => { return true; }); + Task Task7 = new Task(() => { return true; }); + Task Task8 = new Task(() => { return true; }); + Task Task9 = new Task(() => { return true; }); + Task Task10 = new Task(() => { return true; }); + #endregion + using (CancellationTokenSource cancellationTokenSource = new CancellationTokenSource()) + { + CancellationToken token = cancellationTokenSource.Token; + #region METER1 + if (enable[Constants.Meter1]) + { + Task1 = Task.Run(() => + { + SequenceFailed[Constants.Meter1] = EmptyPipeCheck1.PerformTest(out Aborted[Constants.Meter1], token); + return SequenceFailed[Constants.Meter1]; + }); + } + #endregion + #region METER2 + if (enable[Constants.Meter2]) + { + Task2 = Task.Run(() => + { + SequenceFailed[Constants.Meter2] = EmptyPipeCheck2.PerformTest(out Aborted[Constants.Meter2], token); + return SequenceFailed[Constants.Meter2]; + }); + } + #endregion + #region METER3 + if (enable[Constants.Meter3]) + { + Task3 = Task.Run(() => + { + SequenceFailed[Constants.Meter3] = EmptyPipeCheck3.PerformTest(out Aborted[Constants.Meter3], token); + return SequenceFailed[Constants.Meter3]; + }); + } + #endregion + #region METER4 + if (enable[Constants.Meter4]) + { + Task4 = Task.Run(() => + { + SequenceFailed[Constants.Meter4] = EmptyPipeCheck4.PerformTest(out Aborted[Constants.Meter4], token); + return SequenceFailed[Constants.Meter4]; + }); + } + #endregion + #region METER5 + if (enable[Constants.Meter5]) + { + Task5 = Task.Run(() => + { + SequenceFailed[Constants.Meter5] = EmptyPipeCheck5.PerformTest(out Aborted[Constants.Meter5], token); + return SequenceFailed[Constants.Meter5]; + }); + } + #endregion + #region METER6 + if (enable[Constants.Meter6]) + { + Task6 = Task.Run(() => + { + SequenceFailed[Constants.Meter6] = EmptyPipeCheck6.PerformTest(out Aborted[Constants.Meter6], token); + return SequenceFailed[Constants.Meter6]; + }); + } + #endregion + #region METER7 + if (enable[Constants.Meter7]) + { + Task7 = Task.Run(() => + { + SequenceFailed[Constants.Meter7] = EmptyPipeCheck7.PerformTest(out Aborted[Constants.Meter7], token); + return SequenceFailed[Constants.Meter7]; + }); + } + #endregion + #region METER8 + if (enable[Constants.Meter8]) + { + Task8 = Task.Run(() => + { + SequenceFailed[Constants.Meter8] = EmptyPipeCheck8.PerformTest(out Aborted[Constants.Meter8], token); + return SequenceFailed[Constants.Meter8]; + }); + } + #endregion + #region METER9 + if (enable[Constants.Meter9]) + { + Task9 = Task.Run(() => + { + SequenceFailed[Constants.Meter9] = EmptyPipeCheck9.PerformTest(out Aborted[Constants.Meter9], token); + return SequenceFailed[Constants.Meter9]; + }); + } + #endregion + #region METER10 + if (enable[Constants.Meter10]) + { + Task10 = Task.Run(() => + { + SequenceFailed[Constants.Meter10] = EmptyPipeCheck10.PerformTest(out Aborted[Constants.Meter10], token); + return SequenceFailed[Constants.Meter10]; + }); + } + #endregion + #region Wait for tasks + GenesisZeroFlow.Display.ShowResultStatus("Task started = ", enable); + Boolean[] SequenceOk = new Boolean[Constants.NumberOfMeters]; + + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + SequenceOk[Meter] = false; + + while (!CheckArray(enable, TaskCompleted)) + { + if (GenesisZeroFlow._GenesisZeroFlow.AbortIndicator) + { + cancellationTokenSource.Cancel(); + aborted = true; + GenesisZeroFlow.Display.DebugCrcIndicatorVisible(false); + } + TaskCompleted[Constants.Meter1] = Misc.WaitForTask(enable[Constants.Meter1], Task1); + TaskCompleted[Constants.Meter2] = Misc.WaitForTask(enable[Constants.Meter2], Task2); + TaskCompleted[Constants.Meter3] = Misc.WaitForTask(enable[Constants.Meter3], Task3); + TaskCompleted[Constants.Meter4] = Misc.WaitForTask(enable[Constants.Meter4], Task4); + TaskCompleted[Constants.Meter5] = Misc.WaitForTask(enable[Constants.Meter5], Task5); + TaskCompleted[Constants.Meter6] = Misc.WaitForTask(enable[Constants.Meter6], Task6); + TaskCompleted[Constants.Meter7] = Misc.WaitForTask(enable[Constants.Meter7], Task7); + TaskCompleted[Constants.Meter8] = Misc.WaitForTask(enable[Constants.Meter8], Task8); + TaskCompleted[Constants.Meter9] = Misc.WaitForTask(enable[Constants.Meter9], Task9); + TaskCompleted[Constants.Meter10] = Misc.WaitForTask(enable[Constants.Meter10], Task10); + Misc.WaitNSeconds(1); + + //TaskFailed = GetTaskResult(enable, Task1, Task2, Task3, Task4, Task5, Task6, Task7, Task8, Task8, Task10); + } + + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + SequenceOk[Meter] = !SequenceFailed[Meter]; + + GenesisZeroFlow.Display.ShowResultStatus("Sequence OK (while loop) = ", SequenceOk); + GenesisZeroFlow.Display.MeterStatusGreenRed(SequenceOk, enable); + + //TaskFailed = GetTaskResult(enable, Task1, Task2, Task3, Task4, Task5, Task6, Task7, Task8, Task8, Task10); + // GenesisZeroFlow.Display.ShowResultStatus("Sequence failed (not while loop) = ", TaskFailed); + // GenesisZeroFlow.Display.ShowResultStatus("Task Completed = ", TaskCompleted); + // GenesisZeroFlow.Display.ShowResultStatus("Amplitude total failed: ", TaskFailed); + #endregion + #region Destroy tasks + if ((Task1.Status == TaskStatus.RanToCompletion) || (Task1.Status == TaskStatus.Canceled) || (Task1.Status == TaskStatus.Faulted)) + Task1.Dispose(); + if ((Task2.Status == TaskStatus.RanToCompletion) || (Task2.Status == TaskStatus.Canceled) || (Task2.Status == TaskStatus.Faulted)) + Task2.Dispose(); + if ((Task3.Status == TaskStatus.RanToCompletion) || (Task3.Status == TaskStatus.Canceled) || (Task3.Status == TaskStatus.Faulted)) + Task3.Dispose(); + if ((Task4.Status == TaskStatus.RanToCompletion) || (Task4.Status == TaskStatus.Canceled) || (Task4.Status == TaskStatus.Faulted)) + Task4.Dispose(); + if ((Task5.Status == TaskStatus.RanToCompletion) || (Task5.Status == TaskStatus.Canceled) || (Task5.Status == TaskStatus.Faulted)) + Task5.Dispose(); + if ((Task6.Status == TaskStatus.RanToCompletion) || (Task6.Status == TaskStatus.Canceled) || (Task6.Status == TaskStatus.Faulted)) + Task6.Dispose(); + if ((Task7.Status == TaskStatus.RanToCompletion) || (Task7.Status == TaskStatus.Canceled) || (Task7.Status == TaskStatus.Faulted)) + Task7.Dispose(); + if ((Task8.Status == TaskStatus.RanToCompletion) || (Task8.Status == TaskStatus.Canceled) || (Task8.Status == TaskStatus.Faulted)) + Task8.Dispose(); + if ((Task9.Status == TaskStatus.RanToCompletion) || (Task9.Status == TaskStatus.Canceled) || (Task9.Status == TaskStatus.Faulted)) + Task9.Dispose(); + if ((Task10.Status == TaskStatus.RanToCompletion) || (Task10.Status == TaskStatus.Canceled) || (Task10.Status == TaskStatus.Faulted)) + Task10.Dispose(); + #endregion + #region Clear data + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + GenesisZeroFlow._GenesisZeroFlow.SetDataToLog(Meter, String.Empty); + #endregion + } + + return SequenceFailed; + } + + private static Boolean[] GetTaskResult(Boolean[] enable, Task Task1, Task Task2, Task Task3, Task Task4, Task Task5, Task Task6, Task Task7, Task Task8, Task Task9, Task Task10) + { + #region Definitions and initializations + Boolean[] failed = new Boolean[Constants.NumberOfMeters]; + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + failed[Meter] = false; + + #region avoid CA1062 + if (enable == null) + { + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + failed[Meter] = true; + return failed; + } + #endregion + #endregion + #region METER1 + if (enable[Constants.Meter1]) + { + if (Task1.Status != TaskStatus.Running) + { + if (Task1.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter1] = Task1.Result; + if (Task1.Status == TaskStatus.Faulted) + failed[Constants.Meter1] = true; + if (Task1.Status == TaskStatus.Canceled) + failed[Constants.Meter1] = true; + } + } + #endregion + #region METER2 + if (enable[Constants.Meter2]) + { + if (Task2.Status != TaskStatus.Running) + { + if (Task2.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter2] = Task2.Result; + if (Task2.Status == TaskStatus.Faulted) + failed[Constants.Meter2] = true; + if (Task2.Status == TaskStatus.Canceled) + failed[Constants.Meter2] = true; + } + } + #endregion + #region METER3 + if (enable[Constants.Meter3]) + { + if (Task3.Status != TaskStatus.Running) + { + if (Task3.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter3] = Task3.Result; + if (Task3.Status == TaskStatus.Faulted) + failed[Constants.Meter3] = true; + if (Task3.Status == TaskStatus.Canceled) + failed[Constants.Meter3] = true; + } + } + #endregion + #region METER4 + if (enable[Constants.Meter4]) + { + if (Task4.Status != TaskStatus.Running) + { + if (Task4.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter4] = Task4.Result; + if (Task4.Status == TaskStatus.Faulted) + failed[Constants.Meter4] = true; + if (Task4.Status == TaskStatus.Canceled) + failed[Constants.Meter4] = true; + } + } + #endregion + #region METER5 + if (enable[Constants.Meter5]) + { + if (Task5.Status != TaskStatus.Running) + { + if (Task5.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter5] = Task5.Result; + if (Task5.Status == TaskStatus.Faulted) + failed[Constants.Meter5] = true; + if (Task5.Status == TaskStatus.Canceled) + failed[Constants.Meter5] = true; + } + } + #endregion + #region METER6 + if (enable[Constants.Meter6]) + { + if (Task6.Status != TaskStatus.Running) + { + if (Task6.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter6] = Task6.Result; + if (Task6.Status == TaskStatus.Faulted) + failed[Constants.Meter6] = true; + if (Task6.Status == TaskStatus.Canceled) + failed[Constants.Meter6] = true; + } + } + #endregion + #region METER7 + if (enable[Constants.Meter7]) + { + if (Task7.Status != TaskStatus.Running) + { + if (Task7.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter7] = Task7.Result; + if (Task7.Status == TaskStatus.Faulted) + failed[Constants.Meter7] = true; + if (Task7.Status == TaskStatus.Canceled) + failed[Constants.Meter7] = true; + } + } + #endregion + #region METER8 + if (enable[Constants.Meter8]) + { + if (Task8.Status != TaskStatus.Running) + { + if (Task8.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter8] = Task8.Result; + if (Task8.Status == TaskStatus.Faulted) + failed[Constants.Meter8] = true; + if (Task8.Status == TaskStatus.Canceled) + failed[Constants.Meter8] = true; + } + } + #endregion + #region METER9 + if (enable[Constants.Meter9]) + { + if (Task9.Status != TaskStatus.Running) + { + if (Task9.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter9] = Task9.Result; + if (Task9.Status == TaskStatus.Faulted) + failed[Constants.Meter9] = true; + if (Task9.Status == TaskStatus.Canceled) + failed[Constants.Meter9] = true; + } + } + #endregion + #region METER10 + if (enable[Constants.Meter10]) + { + if (Task10.Status != TaskStatus.Running) + { + if (Task10.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter10] = Task10.Result; + if (Task10.Status == TaskStatus.Faulted) + failed[Constants.Meter10] = true; + if (Task10.Status == TaskStatus.Canceled) + failed[Constants.Meter10] = true; + } + } + #endregion + + return failed; + } + private static Boolean CheckArray(Boolean[] enable, Boolean[] array) + { + Boolean Completed = true; + + for (Int32 i = 0; i < array.Count(); i++) + { + if ((array[i] == false) && (enable[i] == true)) + return false; + } + + return Completed; + } + } + public static class AmplitudeSequences + { + public static Boolean[] Total(Boolean[] enable, CmdInterface[] commandInterface, String[] password, UInt16 numberOfTrials, Int32 firstHitLevelPropMin, Int32 firstHitLevelPropMax, Int32 ampTestLowerLimit, Int32 ampTestUpperLimit, Int32 ampTestDistance, out Boolean aborted) + { + #region Definitions and initializations + Int32 FirstHitLevelPropMin = firstHitLevelPropMin; + Int32 FirstHitLevelPropMax = firstHitLevelPropMax; + const Int32 TofRecordingTime = 2; + const Double TriggerValue = 0.5; + const Int32 ErrorValue = -123; + Int32 NextDelayTime = 0; + + Boolean[] SequenceFailed = new Boolean[Constants.NumberOfMeters]; + Boolean[] Ok = new Boolean[Constants.NumberOfMeters]; + Boolean[] TaskStarted = new Boolean[Constants.NumberOfMeters]; + Boolean[] TaskCompleted = new Boolean[Constants.NumberOfMeters]; + aborted = false; + + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + { + SequenceFailed[Meter] = false; + Ok[Meter] = false; + TaskStarted[Meter] = false; + TaskCompleted[Meter] = false; + } + #region CA1062 + if ((enable == null) || (password == null) || (commandInterface == null)) + return Ok; + #endregion + Amplitude AmplitudeMeter1 = new Amplitude(); + Amplitude AmplitudeMeter2 = new Amplitude(); + Amplitude AmplitudeMeter3 = new Amplitude(); + Amplitude AmplitudeMeter4 = new Amplitude(); + Amplitude AmplitudeMeter5 = new Amplitude(); + Amplitude AmplitudeMeter6 = new Amplitude(); + Amplitude AmplitudeMeter7 = new Amplitude(); + Amplitude AmplitudeMeter8 = new Amplitude(); + Amplitude AmplitudeMeter9 = new Amplitude(); + Amplitude AmplitudeMeter10 = new Amplitude(); + + AmplitudeMeter1.Initialize(commandInterface[Constants.Meter1], ampTestLowerLimit, ampTestUpperLimit, ampTestDistance, numberOfTrials, FirstHitLevelPropMin, FirstHitLevelPropMax, TofRecordingTime, TriggerValue, ErrorValue, Constants.Meter1); + AmplitudeMeter2.Initialize(commandInterface[Constants.Meter2], ampTestLowerLimit, ampTestUpperLimit, ampTestDistance, numberOfTrials, FirstHitLevelPropMin, FirstHitLevelPropMax, TofRecordingTime, TriggerValue, ErrorValue, Constants.Meter2); + AmplitudeMeter3.Initialize(commandInterface[Constants.Meter3], ampTestLowerLimit, ampTestUpperLimit, ampTestDistance, numberOfTrials, FirstHitLevelPropMin, FirstHitLevelPropMax, TofRecordingTime, TriggerValue, ErrorValue, Constants.Meter3); + AmplitudeMeter4.Initialize(commandInterface[Constants.Meter4], ampTestLowerLimit, ampTestUpperLimit, ampTestDistance, numberOfTrials, FirstHitLevelPropMin, FirstHitLevelPropMax, TofRecordingTime, TriggerValue, ErrorValue, Constants.Meter4); + AmplitudeMeter5.Initialize(commandInterface[Constants.Meter5], ampTestLowerLimit, ampTestUpperLimit, ampTestDistance, numberOfTrials, FirstHitLevelPropMin, FirstHitLevelPropMax, TofRecordingTime, TriggerValue, ErrorValue, Constants.Meter5); + AmplitudeMeter6.Initialize(commandInterface[Constants.Meter6], ampTestLowerLimit, ampTestUpperLimit, ampTestDistance, numberOfTrials, FirstHitLevelPropMin, FirstHitLevelPropMax, TofRecordingTime, TriggerValue, ErrorValue, Constants.Meter6); + AmplitudeMeter7.Initialize(commandInterface[Constants.Meter7], ampTestLowerLimit, ampTestUpperLimit, ampTestDistance, numberOfTrials, FirstHitLevelPropMin, FirstHitLevelPropMax, TofRecordingTime, TriggerValue, ErrorValue, Constants.Meter7); + AmplitudeMeter8.Initialize(commandInterface[Constants.Meter8], ampTestLowerLimit, ampTestUpperLimit, ampTestDistance, numberOfTrials, FirstHitLevelPropMin, FirstHitLevelPropMax, TofRecordingTime, TriggerValue, ErrorValue, Constants.Meter8); + AmplitudeMeter9.Initialize(commandInterface[Constants.Meter9], ampTestLowerLimit, ampTestUpperLimit, ampTestDistance, numberOfTrials, FirstHitLevelPropMin, FirstHitLevelPropMax, TofRecordingTime, TriggerValue, ErrorValue, Constants.Meter9); + AmplitudeMeter10.Initialize(commandInterface[Constants.Meter10], ampTestLowerLimit, ampTestUpperLimit, ampTestDistance, numberOfTrials, FirstHitLevelPropMin, FirstHitLevelPropMax, TofRecordingTime, TriggerValue, ErrorValue, Constants.Meter10); + + LogOn LogOn1 = new LogOn(); + LogOn LogOn2 = new LogOn(); + LogOn LogOn3 = new LogOn(); + LogOn LogOn4 = new LogOn(); + LogOn LogOn5 = new LogOn(); + LogOn LogOn6 = new LogOn(); + LogOn LogOn7 = new LogOn(); + LogOn LogOn8 = new LogOn(); + LogOn LogOn9 = new LogOn(); + LogOn LogOn10 = new LogOn(); + + LogOn1.Initialize(commandInterface[Constants.Meter1], password[Constants.Meter1], Constants.Meter1, numberOfTrials); + LogOn2.Initialize(commandInterface[Constants.Meter2], password[Constants.Meter2], Constants.Meter2, numberOfTrials); + LogOn3.Initialize(commandInterface[Constants.Meter3], password[Constants.Meter3], Constants.Meter3, numberOfTrials); + LogOn4.Initialize(commandInterface[Constants.Meter4], password[Constants.Meter4], Constants.Meter4, numberOfTrials); + LogOn5.Initialize(commandInterface[Constants.Meter5], password[Constants.Meter5], Constants.Meter5, numberOfTrials); + LogOn6.Initialize(commandInterface[Constants.Meter6], password[Constants.Meter6], Constants.Meter6, numberOfTrials); + LogOn7.Initialize(commandInterface[Constants.Meter7], password[Constants.Meter7], Constants.Meter7, numberOfTrials); + LogOn8.Initialize(commandInterface[Constants.Meter8], password[Constants.Meter8], Constants.Meter8, numberOfTrials); + LogOn9.Initialize(commandInterface[Constants.Meter9], password[Constants.Meter9], Constants.Meter9, numberOfTrials); + LogOn10.Initialize(commandInterface[Constants.Meter10], password[Constants.Meter10], Constants.Meter10, numberOfTrials); + #endregion + #region Perform tests + CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); + CancellationToken token = cancellationTokenSource.Token; + #region METER1 + Task Task1 = new Task(() => { return true; }); + AmplitudeMeter1.Meter(enable[Constants.Meter1], ref Task1, ref TaskStarted[Constants.Meter1], ref SequenceFailed[Constants.Meter1], LogOn1, AmplitudeMeter1, ref NextDelayTime, token); + #endregion + #region METER2 + Task Task2 = new Task(() => { return true; }); + AmplitudeMeter2.Meter(enable[Constants.Meter2], ref Task2, ref TaskStarted[Constants.Meter2], ref SequenceFailed[Constants.Meter2], LogOn2, AmplitudeMeter2, ref NextDelayTime, token); + #endregion + #region METER3 + Task Task3 = new Task(() => { return true; }); + AmplitudeMeter3.Meter(enable[Constants.Meter3], ref Task3, ref TaskStarted[Constants.Meter3], ref SequenceFailed[Constants.Meter3], LogOn3, AmplitudeMeter3, ref NextDelayTime, token); + #endregion + #region METER4 + Task Task4 = new Task(() => { return true; }); + AmplitudeMeter4.Meter(enable[Constants.Meter4], ref Task4, ref TaskStarted[Constants.Meter4], ref SequenceFailed[Constants.Meter4], LogOn4, AmplitudeMeter4, ref NextDelayTime, token); + #endregion + #region METER5 + Task Task5 = new Task(() => { return true; }); + AmplitudeMeter5.Meter(enable[Constants.Meter5], ref Task5, ref TaskStarted[Constants.Meter5], ref SequenceFailed[Constants.Meter5], LogOn5, AmplitudeMeter5, ref NextDelayTime, token); + #endregion + #region METER6 + Task Task6 = new Task(() => { return true; }); + AmplitudeMeter6.Meter(enable[Constants.Meter6], ref Task6, ref TaskStarted[Constants.Meter6], ref SequenceFailed[Constants.Meter6], LogOn6, AmplitudeMeter6, ref NextDelayTime, token); + #endregion + #region METER7 + Task Task7 = new Task(() => { return true; }); + AmplitudeMeter7.Meter(enable[Constants.Meter7], ref Task7, ref TaskStarted[Constants.Meter7], ref SequenceFailed[Constants.Meter7], LogOn7, AmplitudeMeter7, ref NextDelayTime, token); + #endregion + #region METER8 + Task Task8 = new Task(() => { return true; }); + AmplitudeMeter8.Meter(enable[Constants.Meter8], ref Task8, ref TaskStarted[Constants.Meter8], ref SequenceFailed[Constants.Meter8], LogOn8, AmplitudeMeter8, ref NextDelayTime, token); + #endregion + #region METER9 + Task Task9 = new Task(() => { return true; }); + AmplitudeMeter9.Meter(enable[Constants.Meter9], ref Task9, ref TaskStarted[Constants.Meter9], ref SequenceFailed[Constants.Meter9], LogOn9, AmplitudeMeter9, ref NextDelayTime, token); + #endregion + #region METER10 + Task Task10 = new Task(() => { return true; }); + AmplitudeMeter10.Meter(enable[Constants.Meter10], ref Task10, ref TaskStarted[Constants.Meter10], ref SequenceFailed[Constants.Meter10], LogOn10, AmplitudeMeter10, ref NextDelayTime, token); + #endregion + #endregion + #region Wait for tasks + GenesisZeroFlow.Display.ShowResultStatus("Task started = ", TaskStarted); + Int32[] KeepAuthentifiedCounter = new Int32[Constants.NumberOfMeters]; + Boolean[] SequenceOk = new Boolean[Constants.NumberOfMeters]; + + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + { + KeepAuthentifiedCounter[Meter] = 0; + SequenceOk[Meter] = false; + } + + while (!CheckArray(TaskCompleted)) + { + if (GenesisZeroFlow._GenesisZeroFlow.AbortIndicator) + { + cancellationTokenSource.Cancel(); + aborted = true; + GenesisZeroFlow.Display.DebugCrcIndicatorVisible(false); + } + TaskCompleted[Constants.Meter1] = Misc.WaitForTask(TaskStarted[Constants.Meter1], Task1); + TaskCompleted[Constants.Meter2] = Misc.WaitForTask(TaskStarted[Constants.Meter2], Task2); + TaskCompleted[Constants.Meter3] = Misc.WaitForTask(TaskStarted[Constants.Meter3], Task3); + TaskCompleted[Constants.Meter4] = Misc.WaitForTask(TaskStarted[Constants.Meter4], Task4); + TaskCompleted[Constants.Meter5] = Misc.WaitForTask(TaskStarted[Constants.Meter5], Task5); + TaskCompleted[Constants.Meter6] = Misc.WaitForTask(TaskStarted[Constants.Meter6], Task6); + TaskCompleted[Constants.Meter7] = Misc.WaitForTask(TaskStarted[Constants.Meter7], Task7); + TaskCompleted[Constants.Meter8] = Misc.WaitForTask(TaskStarted[Constants.Meter8], Task8); + TaskCompleted[Constants.Meter9] = Misc.WaitForTask(TaskStarted[Constants.Meter9], Task9); + TaskCompleted[Constants.Meter10] = Misc.WaitForTask(TaskStarted[Constants.Meter10], Task10); + AmplitudeMeter1.KeepAuthentified(enable[Constants.Meter1], SequenceOk[Constants.Meter1], TaskCompleted[Constants.Meter1], ref KeepAuthentifiedCounter[Constants.Meter1], LogOn1); + AmplitudeMeter2.KeepAuthentified(enable[Constants.Meter2], SequenceOk[Constants.Meter2], TaskCompleted[Constants.Meter2], ref KeepAuthentifiedCounter[Constants.Meter2], LogOn2); + AmplitudeMeter3.KeepAuthentified(enable[Constants.Meter3], SequenceOk[Constants.Meter3], TaskCompleted[Constants.Meter3], ref KeepAuthentifiedCounter[Constants.Meter3], LogOn3); + AmplitudeMeter4.KeepAuthentified(enable[Constants.Meter4], SequenceOk[Constants.Meter4], TaskCompleted[Constants.Meter4], ref KeepAuthentifiedCounter[Constants.Meter4], LogOn4); + AmplitudeMeter5.KeepAuthentified(enable[Constants.Meter5], SequenceOk[Constants.Meter5], TaskCompleted[Constants.Meter5], ref KeepAuthentifiedCounter[Constants.Meter5], LogOn5); + AmplitudeMeter6.KeepAuthentified(enable[Constants.Meter6], SequenceOk[Constants.Meter6], TaskCompleted[Constants.Meter6], ref KeepAuthentifiedCounter[Constants.Meter6], LogOn6); + AmplitudeMeter7.KeepAuthentified(enable[Constants.Meter7], SequenceOk[Constants.Meter7], TaskCompleted[Constants.Meter7], ref KeepAuthentifiedCounter[Constants.Meter7], LogOn7); + AmplitudeMeter8.KeepAuthentified(enable[Constants.Meter8], SequenceOk[Constants.Meter8], TaskCompleted[Constants.Meter8], ref KeepAuthentifiedCounter[Constants.Meter8], LogOn8); + AmplitudeMeter9.KeepAuthentified(enable[Constants.Meter9], SequenceOk[Constants.Meter9], TaskCompleted[Constants.Meter9], ref KeepAuthentifiedCounter[Constants.Meter9], LogOn9); + AmplitudeMeter10.KeepAuthentified(enable[Constants.Meter10], SequenceOk[Constants.Meter10], TaskCompleted[Constants.Meter10], ref KeepAuthentifiedCounter[Constants.Meter10], LogOn10); + Misc.WaitNSeconds(1); + + SequenceFailed = GetTaskResult(TaskStarted, Task1, Task2, Task3, Task4, Task5, Task6, Task7, Task8, Task8, Task10); + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + SequenceOk[Meter] = !SequenceFailed[Meter]; + + GenesisZeroFlow.Display.ShowResultStatus("Sequence OK (while loop) = ", SequenceOk); + GenesisZeroFlow.Display.MeterStatusGreenRed(SequenceOk, TaskStarted); + } + + SequenceFailed = GetTaskResult(TaskStarted, Task1, Task2, Task3, Task4, Task5, Task6, Task7, Task8, Task8, Task10); + GenesisZeroFlow.Display.ShowResultStatus("Sequence failed (not while loop) = ", SequenceFailed); + GenesisZeroFlow.Display.ShowResultStatus("Task Completed = ", TaskCompleted); + #endregion + #region Destroy tasks + GenesisZeroFlow.Display.ShowResultStatus("Amplitude total failed: ", SequenceFailed); + + if ((Task1.Status == TaskStatus.RanToCompletion) || (Task1.Status == TaskStatus.Canceled) || (Task1.Status == TaskStatus.Faulted)) + Task1.Dispose(); + if ((Task2.Status == TaskStatus.RanToCompletion) || (Task2.Status == TaskStatus.Canceled) || (Task2.Status == TaskStatus.Faulted)) + Task2.Dispose(); + if ((Task3.Status == TaskStatus.RanToCompletion) || (Task3.Status == TaskStatus.Canceled) || (Task3.Status == TaskStatus.Faulted)) + Task3.Dispose(); + if ((Task4.Status == TaskStatus.RanToCompletion) || (Task4.Status == TaskStatus.Canceled) || (Task4.Status == TaskStatus.Faulted)) + Task4.Dispose(); + if ((Task5.Status == TaskStatus.RanToCompletion) || (Task5.Status == TaskStatus.Canceled) || (Task5.Status == TaskStatus.Faulted)) + Task5.Dispose(); + if ((Task6.Status == TaskStatus.RanToCompletion) || (Task6.Status == TaskStatus.Canceled) || (Task6.Status == TaskStatus.Faulted)) + Task6.Dispose(); + if ((Task7.Status == TaskStatus.RanToCompletion) || (Task7.Status == TaskStatus.Canceled) || (Task7.Status == TaskStatus.Faulted)) + Task7.Dispose(); + if ((Task8.Status == TaskStatus.RanToCompletion) || (Task8.Status == TaskStatus.Canceled) || (Task8.Status == TaskStatus.Faulted)) + Task8.Dispose(); + if ((Task9.Status == TaskStatus.RanToCompletion) || (Task9.Status == TaskStatus.Canceled) || (Task9.Status == TaskStatus.Faulted)) + Task9.Dispose(); + if ((Task10.Status == TaskStatus.RanToCompletion) || (Task10.Status == TaskStatus.Canceled) || (Task10.Status == TaskStatus.Faulted)) + Task10.Dispose(); + #endregion + #region Clear data + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + GenesisZeroFlow._GenesisZeroFlow.SetDataToLog(Meter, String.Empty); + #endregion + + return SequenceFailed; + } + private static Boolean[] GetTaskResult(Boolean[] enable, Task Task1, Task Task2, Task Task3, Task Task4, Task Task5, Task Task6, Task Task7, Task Task8, Task Task9, Task Task10) + { + #region Definitions and initializations + Boolean[] failed = new Boolean[Constants.NumberOfMeters]; + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + failed[Meter] = false; + #endregion + #region METER1 + if (enable[Constants.Meter1] && Task1.Status != TaskStatus.Running) + { + if (Task1.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter1] = Task1.Result; + if (Task1.Status == TaskStatus.Faulted) + failed[Constants.Meter1] = true; + if (Task1.Status == TaskStatus.Canceled) + failed[Constants.Meter1] = true; + } + #endregion + #region METER2 + if (enable[Constants.Meter2] && Task2.Status != TaskStatus.Running) + { + if (Task2.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter2] = Task2.Result; + if (Task2.Status == TaskStatus.Faulted) + failed[Constants.Meter2] = true; + if (Task2.Status == TaskStatus.Canceled) + failed[Constants.Meter2] = true; + } + #endregion + #region METER3 + if (enable[Constants.Meter3] && Task3.Status != TaskStatus.Running) + { + if (Task3.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter3] = Task3.Result; + if (Task3.Status == TaskStatus.Faulted) + failed[Constants.Meter3] = true; + if (Task3.Status == TaskStatus.Canceled) + failed[Constants.Meter3] = true; + } + #endregion + #region METER4 + if (enable[Constants.Meter4] && Task4.Status != TaskStatus.Running) + { + if (Task4.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter4] = Task4.Result; + if (Task4.Status == TaskStatus.Faulted) + failed[Constants.Meter4] = true; + if (Task4.Status == TaskStatus.Canceled) + failed[Constants.Meter4] = true; + } + #endregion + #region METER5 + if (enable[Constants.Meter5] && Task5.Status != TaskStatus.Running) + { + if (Task5.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter5] = Task5.Result; + if (Task5.Status == TaskStatus.Faulted) + failed[Constants.Meter5] = true; + if (Task5.Status == TaskStatus.Canceled) + failed[Constants.Meter5] = true; + } + #endregion + #region METER6 + if (enable[Constants.Meter6] && Task6.Status != TaskStatus.Running) + { + if (Task6.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter6] = Task6.Result; + if (Task6.Status == TaskStatus.Faulted) + failed[Constants.Meter6] = true; + if (Task6.Status == TaskStatus.Canceled) + failed[Constants.Meter6] = true; + } + #endregion + #region METER7 + if (enable[Constants.Meter7] && Task7.Status != TaskStatus.Running) + { + if (Task7.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter7] = Task7.Result; + if (Task7.Status == TaskStatus.Faulted) + failed[Constants.Meter7] = true; + if (Task7.Status == TaskStatus.Canceled) + failed[Constants.Meter7] = true; + } + #endregion + #region METER8 + if (enable[Constants.Meter8] && Task8.Status != TaskStatus.Running) + { + if (Task8.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter8] = Task8.Result; + if (Task8.Status == TaskStatus.Faulted) + failed[Constants.Meter8] = true; + if (Task8.Status == TaskStatus.Canceled) + failed[Constants.Meter8] = true; + } + #endregion + #region METER9 + if (enable[Constants.Meter9] && Task9.Status != TaskStatus.Running) + { + if (Task9.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter9] = Task9.Result; + if (Task9.Status == TaskStatus.Faulted) + failed[Constants.Meter9] = true; + if (Task9.Status == TaskStatus.Canceled) + failed[Constants.Meter9] = true; + } + #endregion + #region METER10 + if (enable[Constants.Meter10] && Task10.Status != TaskStatus.Running) + { + if (Task10.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter10] = Task10.Result; + if (Task10.Status == TaskStatus.Faulted) + failed[Constants.Meter10] = true; + if (Task10.Status == TaskStatus.Canceled) + failed[Constants.Meter10] = true; + } + #endregion + + return failed; + } + private static Boolean CheckArray(Boolean[] array) + { + Boolean Completed = true; + + for (Int32 i = 0; i < array.Count(); i++) + { + if (array[i] == false) + return false; + } + + return Completed; + } + } + public static class ZeroOffsetSequences + { + public static Boolean[] Total(Boolean[] enable, CmdInterface[] commandInterface, String[] password, UInt16 numberOfTrials, Int32 settlingTime, Int16 lowerLimit, Int16 upperLimit, Int32 offsetLimit, Int32 numberOfLines, out Boolean aborted) + { + #region Definitions and initializations + Boolean[] SequenceFailed = new Boolean[Constants.NumberOfMeters]; + Boolean[] TaskStarted = new Boolean[Constants.NumberOfMeters]; + Boolean[] TaskCompleted = new Boolean[Constants.NumberOfMeters]; + Int32 NextDelayTime = 0; + aborted = false; + + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + { + SequenceFailed[Meter] = false; + TaskStarted[Meter] = false; + TaskCompleted[Meter] = false; + } + + #region Avoid warning CA1062 + if ((enable == null) || (password == null) || (commandInterface == null)) + return SequenceFailed; + #endregion + + ZeroFlowOffsetTest ZeroFlowOffsetMeter1 = new ZeroFlowOffsetTest(); + ZeroFlowOffsetTest ZeroFlowOffsetMeter2 = new ZeroFlowOffsetTest(); + ZeroFlowOffsetTest ZeroFlowOffsetMeter3 = new ZeroFlowOffsetTest(); + ZeroFlowOffsetTest ZeroFlowOffsetMeter4 = new ZeroFlowOffsetTest(); + ZeroFlowOffsetTest ZeroFlowOffsetMeter5 = new ZeroFlowOffsetTest(); + ZeroFlowOffsetTest ZeroFlowOffsetMeter6 = new ZeroFlowOffsetTest(); + ZeroFlowOffsetTest ZeroFlowOffsetMeter7 = new ZeroFlowOffsetTest(); + ZeroFlowOffsetTest ZeroFlowOffsetMeter8 = new ZeroFlowOffsetTest(); + ZeroFlowOffsetTest ZeroFlowOffsetMeter9 = new ZeroFlowOffsetTest(); + ZeroFlowOffsetTest ZeroFlowOffsetMeter10 = new ZeroFlowOffsetTest(); + + ZeroFlowOffsetMeter1.Initialize(commandInterface[Constants.Meter1], Constants.Meter1, lowerLimit, upperLimit, offsetLimit, numberOfLines, numberOfTrials); + ZeroFlowOffsetMeter2.Initialize(commandInterface[Constants.Meter2], Constants.Meter2, lowerLimit, upperLimit, offsetLimit, numberOfLines, numberOfTrials); + ZeroFlowOffsetMeter3.Initialize(commandInterface[Constants.Meter3], Constants.Meter3, lowerLimit, upperLimit, offsetLimit, numberOfLines, numberOfTrials); + ZeroFlowOffsetMeter4.Initialize(commandInterface[Constants.Meter4], Constants.Meter4, lowerLimit, upperLimit, offsetLimit, numberOfLines, numberOfTrials); + ZeroFlowOffsetMeter5.Initialize(commandInterface[Constants.Meter5], Constants.Meter5, lowerLimit, upperLimit, offsetLimit, numberOfLines, numberOfTrials); + ZeroFlowOffsetMeter6.Initialize(commandInterface[Constants.Meter6], Constants.Meter6, lowerLimit, upperLimit, offsetLimit, numberOfLines, numberOfTrials); + ZeroFlowOffsetMeter7.Initialize(commandInterface[Constants.Meter7], Constants.Meter7, lowerLimit, upperLimit, offsetLimit, numberOfLines, numberOfTrials); + ZeroFlowOffsetMeter8.Initialize(commandInterface[Constants.Meter8], Constants.Meter8, lowerLimit, upperLimit, offsetLimit, numberOfLines, numberOfTrials); + ZeroFlowOffsetMeter9.Initialize(commandInterface[Constants.Meter9], Constants.Meter9, lowerLimit, upperLimit, offsetLimit, numberOfLines, numberOfTrials); + ZeroFlowOffsetMeter10.Initialize(commandInterface[Constants.Meter10], Constants.Meter10, lowerLimit, upperLimit, offsetLimit, numberOfLines, numberOfTrials); + + LogOn LogOn1 = new LogOn(); + LogOn LogOn2 = new LogOn(); + LogOn LogOn3 = new LogOn(); + LogOn LogOn4 = new LogOn(); + LogOn LogOn5 = new LogOn(); + LogOn LogOn6 = new LogOn(); + LogOn LogOn7 = new LogOn(); + LogOn LogOn8 = new LogOn(); + LogOn LogOn9 = new LogOn(); + LogOn LogOn10 = new LogOn(); + + LogOn1.Initialize(commandInterface[Constants.Meter1], password[Constants.Meter1], Constants.Meter1, numberOfTrials); + LogOn2.Initialize(commandInterface[Constants.Meter2], password[Constants.Meter2], Constants.Meter2, numberOfTrials); + LogOn3.Initialize(commandInterface[Constants.Meter3], password[Constants.Meter3], Constants.Meter3, numberOfTrials); + LogOn4.Initialize(commandInterface[Constants.Meter4], password[Constants.Meter4], Constants.Meter4, numberOfTrials); + LogOn5.Initialize(commandInterface[Constants.Meter5], password[Constants.Meter5], Constants.Meter5, numberOfTrials); + LogOn6.Initialize(commandInterface[Constants.Meter6], password[Constants.Meter6], Constants.Meter6, numberOfTrials); + LogOn7.Initialize(commandInterface[Constants.Meter7], password[Constants.Meter7], Constants.Meter7, numberOfTrials); + LogOn8.Initialize(commandInterface[Constants.Meter8], password[Constants.Meter8], Constants.Meter8, numberOfTrials); + LogOn9.Initialize(commandInterface[Constants.Meter9], password[Constants.Meter9], Constants.Meter9, numberOfTrials); + LogOn10.Initialize(commandInterface[Constants.Meter10], password[Constants.Meter10], Constants.Meter10, numberOfTrials); + #endregion + #region Perform test + CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); + CancellationToken token = cancellationTokenSource.Token; + #region METER1 + Task Task1 = new Task(() => { return true; }); + ZeroFlowOffsetMeter1.Meter(enable[Constants.Meter1], ref Task1, ref TaskStarted[Constants.Meter1], ref SequenceFailed[Constants.Meter1], LogOn1, ZeroFlowOffsetMeter1, ref NextDelayTime, settlingTime, token); + #endregion + #region METER2 + Task Task2 = new Task(() => { return true; }); + ZeroFlowOffsetMeter2.Meter(enable[Constants.Meter2], ref Task2, ref TaskStarted[Constants.Meter2], ref SequenceFailed[Constants.Meter2], LogOn2, ZeroFlowOffsetMeter2, ref NextDelayTime, settlingTime, token); + #endregion + #region METER3 + Task Task3 = new Task(() => { return true; }); + ZeroFlowOffsetMeter3.Meter(enable[Constants.Meter3], ref Task3, ref TaskStarted[Constants.Meter3], ref SequenceFailed[Constants.Meter3], LogOn3, ZeroFlowOffsetMeter3, ref NextDelayTime, settlingTime, token); + #endregion + #region METER4 + Task Task4 = new Task(() => { return true; }); + ZeroFlowOffsetMeter4.Meter(enable[Constants.Meter4], ref Task4, ref TaskStarted[Constants.Meter4], ref SequenceFailed[Constants.Meter4], LogOn4, ZeroFlowOffsetMeter4, ref NextDelayTime, settlingTime, token); + #endregion + #region METER5 + Task Task5 = new Task(() => { return true; }); + ZeroFlowOffsetMeter5.Meter(enable[Constants.Meter5], ref Task5, ref TaskStarted[Constants.Meter5], ref SequenceFailed[Constants.Meter5], LogOn5, ZeroFlowOffsetMeter5, ref NextDelayTime, settlingTime, token); + #endregion + #region METER6 + Task Task6 = new Task(() => { return true; }); + ZeroFlowOffsetMeter6.Meter(enable[Constants.Meter6], ref Task6, ref TaskStarted[Constants.Meter6], ref SequenceFailed[Constants.Meter6], LogOn6, ZeroFlowOffsetMeter6, ref NextDelayTime, settlingTime, token); + #endregion + #region METER7 + Task Task7 = new Task(() => { return true; }); + ZeroFlowOffsetMeter7.Meter(enable[Constants.Meter7], ref Task7, ref TaskStarted[Constants.Meter7], ref SequenceFailed[Constants.Meter7], LogOn7, ZeroFlowOffsetMeter7, ref NextDelayTime, settlingTime, token); + #endregion + #region METER8 + Task Task8 = new Task(() => { return true; }); + ZeroFlowOffsetMeter8.Meter(enable[Constants.Meter8], ref Task8, ref TaskStarted[Constants.Meter8], ref SequenceFailed[Constants.Meter8], LogOn8, ZeroFlowOffsetMeter8, ref NextDelayTime, settlingTime, token); + #endregion + #region METER9 + Task Task9 = new Task(() => { return true; }); + ZeroFlowOffsetMeter9.Meter(enable[Constants.Meter9], ref Task9, ref TaskStarted[Constants.Meter9], ref SequenceFailed[Constants.Meter9], LogOn9, ZeroFlowOffsetMeter9, ref NextDelayTime, settlingTime, token); + #endregion + #region METER10 + Task Task10 = new Task(() => { return true; }); + ZeroFlowOffsetMeter10.Meter(enable[Constants.Meter10], ref Task10, ref TaskStarted[Constants.Meter10], ref SequenceFailed[Constants.Meter10], LogOn10, ZeroFlowOffsetMeter10, ref NextDelayTime, settlingTime, token); + #endregion + #endregion + #region Wait for tasks + Int32[] KeepAuthentifiedCounter = new Int32[Constants.NumberOfMeters]; + Boolean[] SequenceOK = new Boolean[Constants.NumberOfMeters]; + for (Int32 i = 0; i < Constants.NumberOfMeters; i++) + { + KeepAuthentifiedCounter[i] = 0; + SequenceOK[i] = false; + } + + while (!CheckArray(TaskCompleted)) + { + if (GenesisZeroFlow._GenesisZeroFlow.AbortIndicator) + { + aborted = true; + cancellationTokenSource.Cancel(); + GenesisZeroFlow.Display.DebugCrcIndicatorVisible(false); + } + TaskCompleted[Constants.Meter1] = Misc.WaitForTask(TaskStarted[Constants.Meter1], Task1); + TaskCompleted[Constants.Meter2] = Misc.WaitForTask(TaskStarted[Constants.Meter2], Task2); + TaskCompleted[Constants.Meter3] = Misc.WaitForTask(TaskStarted[Constants.Meter3], Task3); + TaskCompleted[Constants.Meter4] = Misc.WaitForTask(TaskStarted[Constants.Meter4], Task4); + TaskCompleted[Constants.Meter5] = Misc.WaitForTask(TaskStarted[Constants.Meter5], Task5); + TaskCompleted[Constants.Meter6] = Misc.WaitForTask(TaskStarted[Constants.Meter6], Task6); + TaskCompleted[Constants.Meter7] = Misc.WaitForTask(TaskStarted[Constants.Meter7], Task7); + TaskCompleted[Constants.Meter8] = Misc.WaitForTask(TaskStarted[Constants.Meter8], Task8); + TaskCompleted[Constants.Meter9] = Misc.WaitForTask(TaskStarted[Constants.Meter9], Task9); + TaskCompleted[Constants.Meter10] = Misc.WaitForTask(TaskStarted[Constants.Meter10], Task10); + ZeroFlowOffsetMeter1.KeepAuthentified(enable[Constants.Meter1], SequenceOK[Constants.Meter1], TaskCompleted[Constants.Meter1], ref KeepAuthentifiedCounter[Constants.Meter1], LogOn1); + ZeroFlowOffsetMeter2.KeepAuthentified(enable[Constants.Meter2], SequenceOK[Constants.Meter2], TaskCompleted[Constants.Meter2], ref KeepAuthentifiedCounter[Constants.Meter2], LogOn2); + ZeroFlowOffsetMeter3.KeepAuthentified(enable[Constants.Meter3], SequenceOK[Constants.Meter3], TaskCompleted[Constants.Meter3], ref KeepAuthentifiedCounter[Constants.Meter3], LogOn3); + ZeroFlowOffsetMeter4.KeepAuthentified(enable[Constants.Meter4], SequenceOK[Constants.Meter4], TaskCompleted[Constants.Meter4], ref KeepAuthentifiedCounter[Constants.Meter4], LogOn4); + ZeroFlowOffsetMeter5.KeepAuthentified(enable[Constants.Meter5], SequenceOK[Constants.Meter5], TaskCompleted[Constants.Meter5], ref KeepAuthentifiedCounter[Constants.Meter5], LogOn5); + ZeroFlowOffsetMeter6.KeepAuthentified(enable[Constants.Meter6], SequenceOK[Constants.Meter6], TaskCompleted[Constants.Meter6], ref KeepAuthentifiedCounter[Constants.Meter6], LogOn6); + ZeroFlowOffsetMeter7.KeepAuthentified(enable[Constants.Meter7], SequenceOK[Constants.Meter7], TaskCompleted[Constants.Meter7], ref KeepAuthentifiedCounter[Constants.Meter7], LogOn7); + ZeroFlowOffsetMeter8.KeepAuthentified(enable[Constants.Meter8], SequenceOK[Constants.Meter8], TaskCompleted[Constants.Meter8], ref KeepAuthentifiedCounter[Constants.Meter8], LogOn8); + ZeroFlowOffsetMeter9.KeepAuthentified(enable[Constants.Meter9], SequenceOK[Constants.Meter9], TaskCompleted[Constants.Meter9], ref KeepAuthentifiedCounter[Constants.Meter9], LogOn9); + ZeroFlowOffsetMeter10.KeepAuthentified(enable[Constants.Meter10], SequenceOK[Constants.Meter10], TaskCompleted[Constants.Meter10], ref KeepAuthentifiedCounter[Constants.Meter10], LogOn10); + Misc.WaitNSeconds(1); + + SequenceFailed = GetTaskResult(TaskStarted, Task1, Task2, Task3, Task4, Task5, Task6, Task7, Task8, Task9, Task10); + for (Int32 i = 0; i < Constants.NumberOfMeters; i++) + SequenceOK[i] = !SequenceFailed[i]; + GenesisZeroFlow.Display.ShowResultStatus("Zero offset test sequence OK (while loop) = ", SequenceOK); + GenesisZeroFlow.Display.MeterStatusGreenRed(SequenceOK, TaskStarted); + } + #endregion + #region Destroy tasks + SequenceFailed = GetTaskResult(TaskStarted, Task1, Task2, Task3, Task4, Task5, Task6, Task7, Task8, Task9, Task10); + GenesisZeroFlow.Display.ShowResultStatus("Zero offset test sequence failed = ", SequenceFailed); + GenesisZeroFlow.Display.ShowResultStatus("Task Completed = ", TaskCompleted); + + if ((Task1.Status == TaskStatus.RanToCompletion) || (Task1.Status == TaskStatus.Canceled) || (Task1.Status == TaskStatus.Faulted)) + Task1.Dispose(); + if ((Task2.Status == TaskStatus.RanToCompletion) || (Task2.Status == TaskStatus.Canceled) || (Task2.Status == TaskStatus.Faulted)) + Task2.Dispose(); + if ((Task3.Status == TaskStatus.RanToCompletion) || (Task3.Status == TaskStatus.Canceled) || (Task3.Status == TaskStatus.Faulted)) + Task3.Dispose(); + if ((Task4.Status == TaskStatus.RanToCompletion) || (Task4.Status == TaskStatus.Canceled) || (Task4.Status == TaskStatus.Faulted)) + Task4.Dispose(); + if ((Task5.Status == TaskStatus.RanToCompletion) || (Task5.Status == TaskStatus.Canceled) || (Task5.Status == TaskStatus.Faulted)) + Task5.Dispose(); + if ((Task6.Status == TaskStatus.RanToCompletion) || (Task6.Status == TaskStatus.Canceled) || (Task6.Status == TaskStatus.Faulted)) + Task6.Dispose(); + if ((Task7.Status == TaskStatus.RanToCompletion) || (Task7.Status == TaskStatus.Canceled) || (Task7.Status == TaskStatus.Faulted)) + Task7.Dispose(); + if ((Task8.Status == TaskStatus.RanToCompletion) || (Task8.Status == TaskStatus.Canceled) || (Task8.Status == TaskStatus.Faulted)) + Task8.Dispose(); + if ((Task9.Status == TaskStatus.RanToCompletion) || (Task9.Status == TaskStatus.Canceled) || (Task9.Status == TaskStatus.Faulted)) + Task9.Dispose(); + if ((Task10.Status == TaskStatus.RanToCompletion) || (Task10.Status == TaskStatus.Canceled) || (Task10.Status == TaskStatus.Faulted)) + Task10.Dispose(); + + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + GenesisZeroFlow._GenesisZeroFlow.SetDataToLog(Meter, String.Empty); + #endregion + + + return SequenceFailed; + } + private static Boolean[] GetTaskResult(Boolean[] enable, Task Task1, Task Task2, Task Task3, Task Task4, Task Task5, Task Task6, Task Task7, Task Task8, Task Task9, Task Task10) + { + #region Definitions and initializations + Boolean[] failed = new Boolean[Constants.NumberOfMeters]; + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + failed[Meter] = false; + #endregion + #region METER1 + if (enable[Constants.Meter1]) + { + if (Task1.Status != TaskStatus.Running) + { + if (Task1.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter1] = Task1.Result; + if (Task1.Status == TaskStatus.Faulted) + failed[Constants.Meter1] = true; + if (Task1.Status == TaskStatus.Canceled) + failed[Constants.Meter1] = true; + } + } + #endregion + #region METER2 + if (enable[Constants.Meter2]) + { + if (Task2.Status != TaskStatus.Running) + { + if (Task2.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter2] = Task2.Result; + if (Task2.Status == TaskStatus.Faulted) + failed[Constants.Meter2] = true; + if (Task2.Status == TaskStatus.Canceled) + failed[Constants.Meter2] = true; + + } + } + #endregion + #region METER3 + if (enable[Constants.Meter3]) + { + if (Task3.Status != TaskStatus.Running) + { + if (Task3.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter3] = Task3.Result; + if (Task3.Status == TaskStatus.Faulted) + failed[Constants.Meter3] = true; + if (Task3.Status == TaskStatus.Canceled) + failed[Constants.Meter3] = true; + + } + } + #endregion + #region METER4 + if (enable[Constants.Meter4]) + { + if (Task4.Status != TaskStatus.Running) + { + if (Task4.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter4] = Task4.Result; + if (Task4.Status == TaskStatus.Faulted) + failed[Constants.Meter4] = true; + if (Task4.Status == TaskStatus.Canceled) + failed[Constants.Meter4] = true; + + } + } + #endregion + #region METER5 + if (enable[Constants.Meter5]) + { + if (Task5.Status != TaskStatus.Running) + { + if (Task5.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter5] = Task5.Result; + if (Task5.Status == TaskStatus.Faulted) + failed[Constants.Meter5] = true; + if (Task5.Status == TaskStatus.Canceled) + failed[Constants.Meter5] = true; + + } + } + #endregion + #region METER6 + if (enable[Constants.Meter6]) + { + if (Task6.Status != TaskStatus.Running) + { + if (Task6.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter6] = Task6.Result; + if (Task6.Status == TaskStatus.Faulted) + failed[Constants.Meter6] = true; + if (Task6.Status == TaskStatus.Canceled) + failed[Constants.Meter6] = true; + + } + } + #endregion + #region METER7 + if (enable[Constants.Meter7]) + { + if (Task7.Status != TaskStatus.Running) + { + if (Task7.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter7] = Task7.Result; + if (Task7.Status == TaskStatus.Faulted) + failed[Constants.Meter7] = true; + if (Task7.Status == TaskStatus.Canceled) + failed[Constants.Meter7] = true; + + } + } + #endregion + #region METER8 + if (enable[Constants.Meter8]) + { + if (Task8.Status != TaskStatus.Running) + { + if (Task8.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter8] = Task8.Result; + if (Task8.Status == TaskStatus.Faulted) + failed[Constants.Meter8] = true; + if (Task8.Status == TaskStatus.Canceled) + failed[Constants.Meter8] = true; + + } + } + #endregion + #region METER9 + if (enable[Constants.Meter9]) + { + if (Task9.Status != TaskStatus.Running) + { + if (Task9.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter9] = Task9.Result; + if (Task9.Status == TaskStatus.Faulted) + failed[Constants.Meter9] = true; + if (Task9.Status == TaskStatus.Canceled) + failed[Constants.Meter9] = true; + + } + } + #endregion + #region METER10 + if (enable[Constants.Meter10]) + { + if (Task10.Status != TaskStatus.Running) + { + if (Task10.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter10] = Task10.Result; + if (Task10.Status == TaskStatus.Faulted) + failed[Constants.Meter10] = true; + if (Task10.Status == TaskStatus.Canceled) + failed[Constants.Meter10] = true; + + } + } + #endregion + + return failed; + } + private static Boolean CheckArray(Boolean[] array) + { + Boolean Completed = true; + for (Int32 i = 0; i < array.Count(); i++) + { + if (array[i] == false) + return false; + } + return Completed; + } + + } + public static class TempCalibrationSequences + { + public static Boolean[] Total(Boolean[] enable, CmdInterface[] commandInterface, String[] password, UInt16 numberOfTrials, out Boolean aborted) + { + #region Definitions and initializations + Int32 NextDelayTime = 0; + Boolean[] SequenceFailed = new Boolean[Constants.NumberOfMeters]; + Boolean[] Ok = new Boolean[Constants.NumberOfMeters]; + Boolean[] TaskStarted = new Boolean[Constants.NumberOfMeters]; + Boolean[] TaskCompleted = new Boolean[Constants.NumberOfMeters]; + Double[] RefTemperature = new Double[Constants.NumberOfMeters]; + aborted = false; + + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + { + SequenceFailed[Meter] = false; + Ok[Meter] = false; + TaskStarted[Meter] = false; + TaskCompleted[Meter] = false; + } + #region Avoid warning CA1062 + if ((enable == null) || (password == null) || (commandInterface == null)) + return Ok; + #endregion + TempCalibration TempCal1 = new TempCalibration(); + TempCalibration TempCal2 = new TempCalibration(); + TempCalibration TempCal3 = new TempCalibration(); + TempCalibration TempCal4 = new TempCalibration(); + TempCalibration TempCal5 = new TempCalibration(); + TempCalibration TempCal6 = new TempCalibration(); + TempCalibration TempCal7 = new TempCalibration(); + TempCalibration TempCal8 = new TempCalibration(); + TempCalibration TempCal9 = new TempCalibration(); + TempCalibration TempCal10 = new TempCalibration(); + + TempCal1.Initialize(commandInterface[Constants.CmdMeter1], Constants.Meter1, numberOfTrials, RefTemperature[Constants.Meter1]); + TempCal2.Initialize(commandInterface[Constants.CmdMeter2], Constants.Meter2, numberOfTrials, RefTemperature[Constants.Meter2]); + TempCal3.Initialize(commandInterface[Constants.CmdMeter3], Constants.Meter3, numberOfTrials, RefTemperature[Constants.Meter3]); + TempCal4.Initialize(commandInterface[Constants.CmdMeter4], Constants.Meter4, numberOfTrials, RefTemperature[Constants.Meter4]); + TempCal5.Initialize(commandInterface[Constants.CmdMeter5], Constants.Meter5, numberOfTrials, RefTemperature[Constants.Meter5]); + TempCal6.Initialize(commandInterface[Constants.CmdMeter6], Constants.Meter6, numberOfTrials, RefTemperature[Constants.Meter6]); + TempCal7.Initialize(commandInterface[Constants.CmdMeter7], Constants.Meter7, numberOfTrials, RefTemperature[Constants.Meter7]); + TempCal8.Initialize(commandInterface[Constants.CmdMeter8], Constants.Meter8, numberOfTrials, RefTemperature[Constants.Meter8]); + TempCal9.Initialize(commandInterface[Constants.CmdMeter9], Constants.Meter9, numberOfTrials, RefTemperature[Constants.Meter9]); + TempCal10.Initialize(commandInterface[Constants.CmdMeter10], Constants.Meter10, numberOfTrials, RefTemperature[Constants.Meter10]); + + LogOn LogOn1 = new LogOn(); + LogOn LogOn2 = new LogOn(); + LogOn LogOn3 = new LogOn(); + LogOn LogOn4 = new LogOn(); + LogOn LogOn5 = new LogOn(); + LogOn LogOn6 = new LogOn(); + LogOn LogOn7 = new LogOn(); + LogOn LogOn8 = new LogOn(); + LogOn LogOn9 = new LogOn(); + LogOn LogOn10 = new LogOn(); + + LogOn1.Initialize(commandInterface[Constants.Meter1], password[Constants.Meter1], Constants.Meter1, numberOfTrials); + LogOn2.Initialize(commandInterface[Constants.Meter2], password[Constants.Meter2], Constants.Meter2, numberOfTrials); + LogOn3.Initialize(commandInterface[Constants.Meter3], password[Constants.Meter3], Constants.Meter3, numberOfTrials); + LogOn4.Initialize(commandInterface[Constants.Meter4], password[Constants.Meter4], Constants.Meter4, numberOfTrials); + LogOn5.Initialize(commandInterface[Constants.Meter5], password[Constants.Meter5], Constants.Meter5, numberOfTrials); + LogOn6.Initialize(commandInterface[Constants.Meter6], password[Constants.Meter6], Constants.Meter6, numberOfTrials); + LogOn7.Initialize(commandInterface[Constants.Meter7], password[Constants.Meter7], Constants.Meter7, numberOfTrials); + LogOn8.Initialize(commandInterface[Constants.Meter8], password[Constants.Meter8], Constants.Meter8, numberOfTrials); + LogOn9.Initialize(commandInterface[Constants.Meter9], password[Constants.Meter9], Constants.Meter9, numberOfTrials); + LogOn10.Initialize(commandInterface[Constants.Meter10], password[Constants.Meter10], Constants.Meter10, numberOfTrials); + #endregion + #region Perform tests + CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); + CancellationToken token = cancellationTokenSource.Token; + #region Get manually measured temperatures + Int32 NumberOfTextboxes = 0; + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + { + if (enable[Meter]) + NumberOfTextboxes++; + } + if (NumberOfTextboxes == 0) + return SequenceFailed; + #endregion + #region METER1 + Task Task1 = new Task(() => { return true; }); + TempCal1.SetTemperature(TemperatureField._TemperatureField.GetValueMeter1()); + TempCal1.Meter(enable[Constants.Meter1], ref Task1, ref TaskStarted[Constants.Meter1], ref SequenceFailed[Constants.Meter1], LogOn1, TempCal1, ref NextDelayTime, token); + #endregion + #region METER2 + Task Task2 = new Task(() => { return true; }); + TempCal2.SetTemperature(TemperatureField._TemperatureField.GetValueMeter2()); + TempCal2.Meter(enable[Constants.Meter2], ref Task2, ref TaskStarted[Constants.Meter2], ref SequenceFailed[Constants.Meter2], LogOn2, TempCal2, ref NextDelayTime, token); + #endregion + #region METER3 + Task Task3 = new Task(() => { return true; }); + TempCal3.SetTemperature(TemperatureField._TemperatureField.GetValueMeter3()); + TempCal3.Meter(enable[Constants.Meter3], ref Task3, ref TaskStarted[Constants.Meter3], ref SequenceFailed[Constants.Meter3], LogOn3, TempCal3, ref NextDelayTime, token); + #endregion + #region METER4 + Task Task4 = new Task(() => { return true; }); + TempCal4.SetTemperature(TemperatureField._TemperatureField.GetValueMeter4()); + TempCal4.Meter(enable[Constants.Meter4], ref Task4, ref TaskStarted[Constants.Meter4], ref SequenceFailed[Constants.Meter4], LogOn4, TempCal4, ref NextDelayTime, token); + #endregion + #region METER5 + Task Task5 = new Task(() => { return true; }); + TempCal5.SetTemperature(TemperatureField._TemperatureField.GetValueMeter5()); + TempCal5.Meter(enable[Constants.Meter5], ref Task5, ref TaskStarted[Constants.Meter5], ref SequenceFailed[Constants.Meter5], LogOn5, TempCal5, ref NextDelayTime, token); + #endregion + #region METER6 + Task Task6 = new Task(() => { return true; }); + TempCal6.SetTemperature(TemperatureField._TemperatureField.GetValueMeter6()); + TempCal6.Meter(enable[Constants.Meter6], ref Task6, ref TaskStarted[Constants.Meter6], ref SequenceFailed[Constants.Meter6], LogOn6, TempCal6, ref NextDelayTime, token); + Task6.ContinueWith((s) => { s.Dispose(); }); + #endregion + #region METER7 + Task Task7 = new Task(() => { return true; }); + TempCal7.SetTemperature(TemperatureField._TemperatureField.GetValueMeter7()); + TempCal7.Meter(enable[Constants.Meter7], ref Task7, ref TaskStarted[Constants.Meter7], ref SequenceFailed[Constants.Meter7], LogOn7, TempCal7, ref NextDelayTime, token); + #endregion + #region METER8 + Task Task8 = new Task(() => { return true; }); + TempCal8.SetTemperature(TemperatureField._TemperatureField.GetValueMeter8()); + TempCal8.Meter(enable[Constants.Meter8], ref Task8, ref TaskStarted[Constants.Meter8], ref SequenceFailed[Constants.Meter8], LogOn8, TempCal8, ref NextDelayTime, token); + #endregion + #region METER9 + Task Task9 = new Task(() => { return true; }); + TempCal9.SetTemperature(TemperatureField._TemperatureField.GetValueMeter9()); + TempCal9.Meter(enable[Constants.Meter9], ref Task9, ref TaskStarted[Constants.Meter9], ref SequenceFailed[Constants.Meter9], LogOn9, TempCal9, ref NextDelayTime, token); + #endregion + #region METER10 + Task Task10 = new Task(() => { return true; }); + TempCal10.SetTemperature(TemperatureField._TemperatureField.GetValueMeter10()); + TempCal10.Meter(enable[Constants.Meter10], ref Task10, ref TaskStarted[Constants.Meter10], ref SequenceFailed[Constants.Meter10], LogOn10, TempCal10, ref NextDelayTime, token); + #endregion + #endregion + #region Wait for tasks + GenesisZeroFlow.Display.ShowResultStatus("Task started = ", TaskStarted); + Int32[] KeepAuthentifiedCounter = new Int32[Constants.NumberOfMeters]; + Boolean[] SequenceOk = new Boolean[Constants.NumberOfMeters]; + + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + { + KeepAuthentifiedCounter[Meter] = 0; + SequenceOk[Meter] = false; + } + + while (!CheckArray(TaskCompleted)) + { + if (GenesisZeroFlow._GenesisZeroFlow.AbortIndicator) + { + cancellationTokenSource.Cancel(); + aborted = true; + GenesisZeroFlow.Display.DebugCrcIndicatorVisible(false); + } + TaskCompleted[Constants.Meter1] = Misc.WaitForTask(TaskStarted[Constants.Meter1], Task1); + TaskCompleted[Constants.Meter2] = Misc.WaitForTask(TaskStarted[Constants.Meter2], Task2); + TaskCompleted[Constants.Meter3] = Misc.WaitForTask(TaskStarted[Constants.Meter3], Task3); + TaskCompleted[Constants.Meter4] = Misc.WaitForTask(TaskStarted[Constants.Meter4], Task4); + TaskCompleted[Constants.Meter5] = Misc.WaitForTask(TaskStarted[Constants.Meter5], Task5); + TaskCompleted[Constants.Meter6] = Misc.WaitForTask(TaskStarted[Constants.Meter6], Task6); + TaskCompleted[Constants.Meter7] = Misc.WaitForTask(TaskStarted[Constants.Meter7], Task7); + TaskCompleted[Constants.Meter8] = Misc.WaitForTask(TaskStarted[Constants.Meter8], Task8); + TaskCompleted[Constants.Meter9] = Misc.WaitForTask(TaskStarted[Constants.Meter9], Task9); + TaskCompleted[Constants.Meter10] = Misc.WaitForTask(TaskStarted[Constants.Meter10], Task10); + TempCal1.KeepAuthentified(enable[Constants.Meter1], SequenceOk[Constants.Meter1], TaskCompleted[Constants.Meter1], ref KeepAuthentifiedCounter[Constants.Meter1], LogOn1); + TempCal2.KeepAuthentified(enable[Constants.Meter2], SequenceOk[Constants.Meter2], TaskCompleted[Constants.Meter2], ref KeepAuthentifiedCounter[Constants.Meter2], LogOn2); + TempCal3.KeepAuthentified(enable[Constants.Meter3], SequenceOk[Constants.Meter3], TaskCompleted[Constants.Meter3], ref KeepAuthentifiedCounter[Constants.Meter3], LogOn3); + TempCal4.KeepAuthentified(enable[Constants.Meter4], SequenceOk[Constants.Meter4], TaskCompleted[Constants.Meter4], ref KeepAuthentifiedCounter[Constants.Meter4], LogOn4); + TempCal5.KeepAuthentified(enable[Constants.Meter5], SequenceOk[Constants.Meter5], TaskCompleted[Constants.Meter5], ref KeepAuthentifiedCounter[Constants.Meter5], LogOn5); + TempCal6.KeepAuthentified(enable[Constants.Meter6], SequenceOk[Constants.Meter6], TaskCompleted[Constants.Meter6], ref KeepAuthentifiedCounter[Constants.Meter6], LogOn6); + TempCal7.KeepAuthentified(enable[Constants.Meter7], SequenceOk[Constants.Meter7], TaskCompleted[Constants.Meter7], ref KeepAuthentifiedCounter[Constants.Meter7], LogOn7); + TempCal8.KeepAuthentified(enable[Constants.Meter8], SequenceOk[Constants.Meter8], TaskCompleted[Constants.Meter8], ref KeepAuthentifiedCounter[Constants.Meter8], LogOn8); + TempCal9.KeepAuthentified(enable[Constants.Meter9], SequenceOk[Constants.Meter9], TaskCompleted[Constants.Meter9], ref KeepAuthentifiedCounter[Constants.Meter9], LogOn9); + TempCal10.KeepAuthentified(enable[Constants.Meter10], SequenceOk[Constants.Meter10], TaskCompleted[Constants.Meter10], ref KeepAuthentifiedCounter[Constants.Meter10], LogOn10); + Misc.WaitNSeconds(1); + + SequenceFailed = GetTaskResult(TaskStarted, Task1, Task2, Task3, Task4, Task5, Task6, Task7, Task8, Task8, Task10); + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + SequenceOk[Meter] = !SequenceFailed[Meter]; + GenesisZeroFlow.Display.ShowResultStatus("Sequence OK (while loop) = ", SequenceOk); + GenesisZeroFlow.Display.MeterStatusGreenRed(SequenceOk, TaskStarted); + } + + SequenceFailed = GetTaskResult(TaskStarted, Task1, Task2, Task3, Task4, Task5, Task6, Task7, Task8, Task8, Task10); + GenesisZeroFlow.Display.ShowResultStatus("Sequence failed (not while loop) = ", SequenceFailed); + GenesisZeroFlow.Display.ShowResultStatus("Task Completed = ", TaskCompleted); + #endregion + #region Destroj tasks + GenesisZeroFlow.Display.ShowResultStatus("Temperature calibration failed: ", SequenceFailed); + + if ((Task1.Status == TaskStatus.RanToCompletion) || (Task1.Status == TaskStatus.Canceled) || (Task1.Status == TaskStatus.Faulted)) + Task1.Dispose(); + if ((Task2.Status == TaskStatus.RanToCompletion) || (Task2.Status == TaskStatus.Canceled) || (Task2.Status == TaskStatus.Faulted)) + Task2.Dispose(); + if ((Task3.Status == TaskStatus.RanToCompletion) || (Task3.Status == TaskStatus.Canceled) || (Task3.Status == TaskStatus.Faulted)) + Task3.Dispose(); + if ((Task4.Status == TaskStatus.RanToCompletion) || (Task4.Status == TaskStatus.Canceled) || (Task4.Status == TaskStatus.Faulted)) + Task4.Dispose(); + if ((Task5.Status == TaskStatus.RanToCompletion) || (Task5.Status == TaskStatus.Canceled) || (Task5.Status == TaskStatus.Faulted)) + Task5.Dispose(); + if ((Task6.Status == TaskStatus.RanToCompletion) || (Task6.Status == TaskStatus.Canceled) || (Task6.Status == TaskStatus.Faulted)) + Task6.Dispose(); + if ((Task7.Status == TaskStatus.RanToCompletion) || (Task7.Status == TaskStatus.Canceled) || (Task7.Status == TaskStatus.Faulted)) + Task7.Dispose(); + if ((Task8.Status == TaskStatus.RanToCompletion) || (Task8.Status == TaskStatus.Canceled) || (Task8.Status == TaskStatus.Faulted)) + Task8.Dispose(); + if ((Task9.Status == TaskStatus.RanToCompletion) || (Task9.Status == TaskStatus.Canceled) || (Task9.Status == TaskStatus.Faulted)) + Task9.Dispose(); + if ((Task10.Status == TaskStatus.RanToCompletion) || (Task10.Status == TaskStatus.Canceled) || (Task10.Status == TaskStatus.Faulted)) + Task10.Dispose(); + if (Task1.Status == TaskStatus.Created) + { + + Task1 = Task.Run(() => + { + return true; + }); + while (Task1.Status != TaskStatus.RanToCompletion) { }; + Task1.Dispose(); + } + if (Task2.Status == TaskStatus.Created) + { + Task2 = Task.Run(() => + { + return true; + }); + while (Task2.Status != TaskStatus.RanToCompletion) { }; + Task2.Dispose(); + } + if (Task3.Status == TaskStatus.Created) + { + Task3 = Task.Run(() => + { + return true; + }); + while (Task3.Status != TaskStatus.RanToCompletion) { }; + Task3.Dispose(); + } + if (Task4.Status == TaskStatus.Created) + { + Task4 = Task.Run(() => + { + return true; + }); + while (Task4.Status != TaskStatus.RanToCompletion) { }; + Task4.Dispose(); + } + if (Task5.Status == TaskStatus.Created) + { + Task5 = Task.Run(() => + { + return true; + }); + while (Task5.Status != TaskStatus.RanToCompletion) { }; + Task5.Dispose(); + } + if (Task6.Status == TaskStatus.Created) + { + Task6 = Task.Run(() => + { + return true; + }); + while (Task6.Status != TaskStatus.RanToCompletion) { }; + Task6.Dispose(); + } + if (Task7.Status == TaskStatus.Created) + { + Task7 = Task.Run(() => + { + return true; + }); + while (Task7.Status != TaskStatus.RanToCompletion) { }; + Task7.Dispose(); + } + if (Task8.Status == TaskStatus.Created) + { + Task8 = Task.Run(() => + { + return true; + }); + while (Task8.Status != TaskStatus.RanToCompletion) { }; + Task8.Dispose(); + } + if (Task9.Status == TaskStatus.Created) + { + Task9 = Task.Run(() => + { + return true; + }); + while (Task9.Status != TaskStatus.RanToCompletion) { }; + Task3.Dispose(); + } + if (Task10.Status == TaskStatus.Created) + { + Task10 = Task.Run(() => + { + return true; + }); + while (Task10.Status != TaskStatus.RanToCompletion) { }; + Task10.Dispose(); + } + #endregion + #region Clear data + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + GenesisZeroFlow._GenesisZeroFlow.SetDataToLog(Meter, String.Empty); + #endregion + + return SequenceFailed; + } + private static Boolean[] GetTaskResult(Boolean[] enable, Task Task1, Task Task2, Task Task3, Task Task4, Task Task5, Task Task6, Task Task7, Task Task8, Task Task9, Task Task10) + { + #region Definitions and initializations + Boolean[] failed = new Boolean[Constants.NumberOfMeters]; + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + failed[Meter] = false; + #endregion + #region METER1 + if (enable[Constants.Meter1]) + { + if (Task1.Status != TaskStatus.Running) + { + if (Task1.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter1] = Task1.Result; + if (Task1.Status == TaskStatus.Faulted) + failed[Constants.Meter1] = true; + if (Task1.Status == TaskStatus.Canceled) + failed[Constants.Meter1] = true; + } + } + #endregion + #region METER2 + if (enable[Constants.Meter2]) + { + if (Task2.Status != TaskStatus.Running) + { + if (Task2.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter2] = Task2.Result; + if (Task2.Status == TaskStatus.Faulted) + failed[Constants.Meter2] = true; + if (Task2.Status == TaskStatus.Canceled) + failed[Constants.Meter2] = true; + + } + } + #endregion + #region METER3 + if (enable[Constants.Meter3]) + { + if (Task3.Status != TaskStatus.Running) + { + if (Task3.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter3] = Task3.Result; + if (Task3.Status == TaskStatus.Faulted) + failed[Constants.Meter3] = true; + if (Task3.Status == TaskStatus.Canceled) + failed[Constants.Meter3] = true; + + } + } + #endregion + #region METER4 + if (enable[Constants.Meter4]) + { + if (Task4.Status != TaskStatus.Running) + { + if (Task4.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter4] = Task4.Result; + if (Task4.Status == TaskStatus.Faulted) + failed[Constants.Meter4] = true; + if (Task4.Status == TaskStatus.Canceled) + failed[Constants.Meter4] = true; + + } + } + #endregion + #region METER5 + if (enable[Constants.Meter5]) + { + if (Task5.Status != TaskStatus.Running) + { + if (Task5.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter5] = Task5.Result; + if (Task5.Status == TaskStatus.Faulted) + failed[Constants.Meter5] = true; + if (Task5.Status == TaskStatus.Canceled) + failed[Constants.Meter5] = true; + + } + } + #endregion + #region METER6 + if (enable[Constants.Meter6]) + { + if (Task6.Status != TaskStatus.Running) + { + if (Task6.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter6] = Task6.Result; + if (Task6.Status == TaskStatus.Faulted) + failed[Constants.Meter6] = true; + if (Task6.Status == TaskStatus.Canceled) + failed[Constants.Meter6] = true; + + } + } + #endregion + #region METER7 + if (enable[Constants.Meter7]) + { + if (Task7.Status != TaskStatus.Running) + { + if (Task7.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter7] = Task7.Result; + if (Task7.Status == TaskStatus.Faulted) + failed[Constants.Meter7] = true; + if (Task7.Status == TaskStatus.Canceled) + failed[Constants.Meter7] = true; + + } + } + #endregion + #region METER8 + if (enable[Constants.Meter8]) + { + if (Task8.Status != TaskStatus.Running) + { + if (Task8.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter8] = Task8.Result; + if (Task8.Status == TaskStatus.Faulted) + failed[Constants.Meter8] = true; + if (Task8.Status == TaskStatus.Canceled) + failed[Constants.Meter8] = true; + + } + } + #endregion + #region METER9 + if (enable[Constants.Meter9]) + { + if (Task9.Status != TaskStatus.Running) + { + if (Task9.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter9] = Task9.Result; + if (Task9.Status == TaskStatus.Faulted) + failed[Constants.Meter9] = true; + if (Task9.Status == TaskStatus.Canceled) + failed[Constants.Meter9] = true; + + } + } + #endregion + #region METER10 + if (enable[Constants.Meter10]) + { + if (Task10.Status != TaskStatus.Running) + { + if (Task10.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter10] = Task10.Result; + if (Task10.Status == TaskStatus.Faulted) + failed[Constants.Meter10] = true; + if (Task10.Status == TaskStatus.Canceled) + failed[Constants.Meter10] = true; + + } + } + #endregion + + return failed; + } + private static Boolean CheckArray(Boolean[] array) + { + Boolean Completed = true; + + for (Int32 i = 0; i < array.Count(); i++) + { + if (array[i] == false) + return false; + } + + return Completed; + } + } + public static class LogOnSequences + { + public static Boolean[] Total(Boolean[] enable, CmdInterface[] commandInterface, String[] password, UInt16 numberOfTrials, out Boolean aborted) + { + #region Definitions and initializations + Boolean[] SequenceFailed = new Boolean[Constants.NumberOfMeters]; + Boolean[] TaskStarted = new Boolean[Constants.NumberOfMeters]; + Boolean[] TaskCompleted = new Boolean[Constants.NumberOfMeters]; + Int32 NextDelayTime = 0; + aborted = false; + + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + { + SequenceFailed[Meter] = false; + TaskStarted[Meter] = false; + TaskCompleted[Meter] = false; + } + #region CA1062 + if ((enable == null) || (password == null) || (commandInterface == null)) + return SequenceFailed; + #endregion + LogOn LogOn1 = new LogOn(); + LogOn LogOn2 = new LogOn(); + LogOn LogOn3 = new LogOn(); + LogOn LogOn4 = new LogOn(); + LogOn LogOn5 = new LogOn(); + LogOn LogOn6 = new LogOn(); + LogOn LogOn7 = new LogOn(); + LogOn LogOn8 = new LogOn(); + LogOn LogOn9 = new LogOn(); + LogOn LogOn10 = new LogOn(); + + LogOn1.Initialize(commandInterface[Constants.Meter1], password[Constants.Meter1], Constants.Meter1, numberOfTrials); + LogOn2.Initialize(commandInterface[Constants.Meter2], password[Constants.Meter2], Constants.Meter2, numberOfTrials); + LogOn3.Initialize(commandInterface[Constants.Meter3], password[Constants.Meter3], Constants.Meter3, numberOfTrials); + LogOn4.Initialize(commandInterface[Constants.Meter4], password[Constants.Meter4], Constants.Meter4, numberOfTrials); + LogOn5.Initialize(commandInterface[Constants.Meter5], password[Constants.Meter5], Constants.Meter5, numberOfTrials); + LogOn6.Initialize(commandInterface[Constants.Meter6], password[Constants.Meter6], Constants.Meter6, numberOfTrials); + LogOn7.Initialize(commandInterface[Constants.Meter7], password[Constants.Meter7], Constants.Meter7, numberOfTrials); + LogOn8.Initialize(commandInterface[Constants.Meter8], password[Constants.Meter8], Constants.Meter8, numberOfTrials); + LogOn9.Initialize(commandInterface[Constants.Meter9], password[Constants.Meter9], Constants.Meter9, numberOfTrials); + LogOn10.Initialize(commandInterface[Constants.Meter10], password[Constants.Meter10], Constants.Meter10, numberOfTrials); + #endregion + #region Perform test + CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); + CancellationToken token = cancellationTokenSource.Token; + #region METER1 + Task Task1 = new Task(() => { return true; }); + LogOn1.Meter(enable[Constants.Meter1], ref Task1, ref TaskStarted[Constants.Meter1], ref SequenceFailed[Constants.Meter1], LogOn1, ref NextDelayTime, token); + #endregion + #region METER2 + Task Task2 = new Task(() => { return true; }); + LogOn2.Meter(enable[Constants.Meter2], ref Task2, ref TaskStarted[Constants.Meter2], ref SequenceFailed[Constants.Meter2], LogOn2, ref NextDelayTime, token); + #endregion + #region METER3 + Task Task3 = new Task(() => { return true; }); + LogOn3.Meter(enable[Constants.Meter3], ref Task3, ref TaskStarted[Constants.Meter3], ref SequenceFailed[Constants.Meter3], LogOn3, ref NextDelayTime, token); + #endregion + #region METER4 + Task Task4 = new Task(() => { return true; }); + LogOn4.Meter(enable[Constants.Meter4], ref Task4, ref TaskStarted[Constants.Meter4], ref SequenceFailed[Constants.Meter4], LogOn4, ref NextDelayTime, token); + #endregion + #region METER5 + Task Task5 = new Task(() => { return true; }); + LogOn5.Meter(enable[Constants.Meter5], ref Task5, ref TaskStarted[Constants.Meter5], ref SequenceFailed[Constants.Meter5], LogOn5, ref NextDelayTime, token); + #endregion + #region METER6 + Task Task6 = new Task(() => { return true; }); + LogOn6.Meter(enable[Constants.Meter6], ref Task6, ref TaskStarted[Constants.Meter6], ref SequenceFailed[Constants.Meter6], LogOn6, ref NextDelayTime, token); + #endregion + #region METER7 + Task Task7 = new Task(() => { return true; }); + LogOn7.Meter(enable[Constants.Meter7], ref Task7, ref TaskStarted[Constants.Meter7], ref SequenceFailed[Constants.Meter7], LogOn7, ref NextDelayTime, token); + #endregion + #region METER8 + Task Task8 = new Task(() => { return true; }); + LogOn8.Meter(enable[Constants.Meter8], ref Task8, ref TaskStarted[Constants.Meter8], ref SequenceFailed[Constants.Meter8], LogOn8, ref NextDelayTime, token); + #endregion + #region METER9 + Task Task9 = new Task(() => { return true; }); + LogOn9.Meter(enable[Constants.Meter9], ref Task9, ref TaskStarted[Constants.Meter9], ref SequenceFailed[Constants.Meter9], LogOn9, ref NextDelayTime, token); + #endregion + #region METER10 + Task Task10 = new Task(() => { return true; }); + LogOn10.Meter(enable[Constants.Meter10], ref Task10, ref TaskStarted[Constants.Meter10], ref SequenceFailed[Constants.Meter10], LogOn10, ref NextDelayTime, token); + #endregion + #endregion + #region Wait for tasks + GenesisZeroFlow.Display.ShowResultStatus("Login, task started = ", TaskStarted); + Int32[] KeepAuthentifiedCounter = new Int32[Constants.NumberOfMeters]; + Boolean[] SequenceOk = new Boolean[Constants.NumberOfMeters]; + + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + { + KeepAuthentifiedCounter[Meter] = 0; + SequenceOk[Meter] = false; + } + + while (!CheckArray(TaskCompleted)) + { + if (GenesisZeroFlow._GenesisZeroFlow.AbortIndicator) + { + aborted = true; + cancellationTokenSource.Cancel(); + GenesisZeroFlow.Display.DebugCrcIndicatorVisible(false); + } + TaskCompleted[Constants.Meter1] = Misc.WaitForTask(TaskStarted[Constants.Meter1], Task1); + TaskCompleted[Constants.Meter2] = Misc.WaitForTask(TaskStarted[Constants.Meter2], Task2); + TaskCompleted[Constants.Meter3] = Misc.WaitForTask(TaskStarted[Constants.Meter3], Task3); + TaskCompleted[Constants.Meter4] = Misc.WaitForTask(TaskStarted[Constants.Meter4], Task4); + TaskCompleted[Constants.Meter5] = Misc.WaitForTask(TaskStarted[Constants.Meter5], Task5); + TaskCompleted[Constants.Meter6] = Misc.WaitForTask(TaskStarted[Constants.Meter6], Task6); + TaskCompleted[Constants.Meter7] = Misc.WaitForTask(TaskStarted[Constants.Meter7], Task7); + TaskCompleted[Constants.Meter8] = Misc.WaitForTask(TaskStarted[Constants.Meter8], Task8); + TaskCompleted[Constants.Meter9] = Misc.WaitForTask(TaskStarted[Constants.Meter9], Task9); + TaskCompleted[Constants.Meter10] = Misc.WaitForTask(TaskStarted[Constants.Meter10], Task10); + LogOn1.KeepAuthentified(enable[Constants.Meter1], SequenceOk[Constants.Meter1], TaskCompleted[Constants.Meter1], ref KeepAuthentifiedCounter[Constants.Meter1]); + LogOn2.KeepAuthentified(enable[Constants.Meter2], SequenceOk[Constants.Meter2], TaskCompleted[Constants.Meter2], ref KeepAuthentifiedCounter[Constants.Meter2]); + LogOn3.KeepAuthentified(enable[Constants.Meter3], SequenceOk[Constants.Meter3], TaskCompleted[Constants.Meter3], ref KeepAuthentifiedCounter[Constants.Meter3]); + LogOn4.KeepAuthentified(enable[Constants.Meter4], SequenceOk[Constants.Meter4], TaskCompleted[Constants.Meter4], ref KeepAuthentifiedCounter[Constants.Meter4]); + LogOn5.KeepAuthentified(enable[Constants.Meter5], SequenceOk[Constants.Meter5], TaskCompleted[Constants.Meter5], ref KeepAuthentifiedCounter[Constants.Meter5]); + LogOn6.KeepAuthentified(enable[Constants.Meter6], SequenceOk[Constants.Meter6], TaskCompleted[Constants.Meter6], ref KeepAuthentifiedCounter[Constants.Meter6]); + LogOn7.KeepAuthentified(enable[Constants.Meter7], SequenceOk[Constants.Meter7], TaskCompleted[Constants.Meter7], ref KeepAuthentifiedCounter[Constants.Meter7]); + LogOn8.KeepAuthentified(enable[Constants.Meter8], SequenceOk[Constants.Meter8], TaskCompleted[Constants.Meter8], ref KeepAuthentifiedCounter[Constants.Meter8]); + LogOn9.KeepAuthentified(enable[Constants.Meter9], SequenceOk[Constants.Meter9], TaskCompleted[Constants.Meter9], ref KeepAuthentifiedCounter[Constants.Meter9]); + LogOn10.KeepAuthentified(enable[Constants.Meter10], SequenceOk[Constants.Meter10], TaskCompleted[Constants.Meter10], ref KeepAuthentifiedCounter[Constants.Meter10]); + Misc.WaitNSeconds(1); + + SequenceFailed = GetTaskResult(TaskStarted, Task1, Task2, Task3, Task4, Task5, Task6, Task7, Task8, Task9, Task10); + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + SequenceOk[Meter] = !SequenceFailed[Meter]; + GenesisZeroFlow.Display.ShowResultStatus("Login sequence OK (while loop) = ", SequenceOk); + GenesisZeroFlow.Display.MeterStatusGreenRed(SequenceOk, TaskStarted); + } + #endregion + #region Destroy tasks + SequenceFailed = GetTaskResult(TaskStarted, Task1, Task2, Task3, Task4, Task5, Task6, Task7, Task8, Task9, Task10); + GenesisZeroFlow.Display.ShowResultStatus("Login sequence failed = ", SequenceFailed); + GenesisZeroFlow.Display.ShowResultStatus("Task Completed = ", TaskCompleted); + + if ((Task1.Status == TaskStatus.RanToCompletion) || (Task1.Status == TaskStatus.Canceled) || (Task1.Status == TaskStatus.Faulted)) + Task1.Dispose(); + if ((Task2.Status == TaskStatus.RanToCompletion) || (Task2.Status == TaskStatus.Canceled) || (Task2.Status == TaskStatus.Faulted)) + Task2.Dispose(); + if ((Task3.Status == TaskStatus.RanToCompletion) || (Task3.Status == TaskStatus.Canceled) || (Task3.Status == TaskStatus.Faulted)) + Task3.Dispose(); + if ((Task4.Status == TaskStatus.RanToCompletion) || (Task4.Status == TaskStatus.Canceled) || (Task4.Status == TaskStatus.Faulted)) + Task4.Dispose(); + if ((Task5.Status == TaskStatus.RanToCompletion) || (Task5.Status == TaskStatus.Canceled) || (Task5.Status == TaskStatus.Faulted)) + Task5.Dispose(); + if ((Task6.Status == TaskStatus.RanToCompletion) || (Task6.Status == TaskStatus.Canceled) || (Task6.Status == TaskStatus.Faulted)) + Task6.Dispose(); + if ((Task7.Status == TaskStatus.RanToCompletion) || (Task7.Status == TaskStatus.Canceled) || (Task7.Status == TaskStatus.Faulted)) + Task7.Dispose(); + if ((Task8.Status == TaskStatus.RanToCompletion) || (Task8.Status == TaskStatus.Canceled) || (Task8.Status == TaskStatus.Faulted)) + Task8.Dispose(); + if ((Task9.Status == TaskStatus.RanToCompletion) || (Task9.Status == TaskStatus.Canceled) || (Task9.Status == TaskStatus.Faulted)) + Task9.Dispose(); + if ((Task10.Status == TaskStatus.RanToCompletion) || (Task10.Status == TaskStatus.Canceled) || (Task10.Status == TaskStatus.Faulted)) + Task10.Dispose(); + #endregion + + return SequenceFailed; + } + private static Boolean[] GetTaskResult(Boolean[] enable, Task Task1, Task Task2, Task Task3, Task Task4, Task Task5, Task Task6, Task Task7, Task Task8, Task Task9, Task Task10) + { + #region Definitions and initializations + Boolean[] failed = new Boolean[Constants.NumberOfMeters]; + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + failed[Meter] = false; + #endregion + #region METER1 + if (enable[Constants.Meter1]) + { + if (Task1.Status != TaskStatus.Running) + { + if (Task1.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter1] = Task1.Result; + if (Task1.Status == TaskStatus.Faulted) + failed[Constants.Meter1] = true; + if (Task1.Status == TaskStatus.Canceled) + failed[Constants.Meter1] = true; + } + } + #endregion + #region METER2 + if (enable[Constants.Meter2]) + { + if (Task2.Status != TaskStatus.Running) + { + if (Task2.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter2] = Task2.Result; + if (Task2.Status == TaskStatus.Faulted) + failed[Constants.Meter2] = true; + if (Task2.Status == TaskStatus.Canceled) + failed[Constants.Meter2] = true; + + } + } + #endregion + #region METER3 + if (enable[Constants.Meter3]) + { + if (Task3.Status != TaskStatus.Running) + { + if (Task3.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter3] = Task3.Result; + if (Task3.Status == TaskStatus.Faulted) + failed[Constants.Meter3] = true; + if (Task3.Status == TaskStatus.Canceled) + failed[Constants.Meter3] = true; + + } + } + #endregion + #region METER4 + if (enable[Constants.Meter4]) + { + if (Task4.Status != TaskStatus.Running) + { + if (Task4.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter4] = Task4.Result; + if (Task4.Status == TaskStatus.Faulted) + failed[Constants.Meter4] = true; + if (Task4.Status == TaskStatus.Canceled) + failed[Constants.Meter4] = true; + + } + } + #endregion + #region METER5 + if (enable[Constants.Meter5]) + { + if (Task5.Status != TaskStatus.Running) + { + if (Task5.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter5] = Task5.Result; + if (Task5.Status == TaskStatus.Faulted) + failed[Constants.Meter5] = true; + if (Task5.Status == TaskStatus.Canceled) + failed[Constants.Meter5] = true; + + } + } + #endregion + #region METER6 + if (enable[Constants.Meter6]) + { + if (Task6.Status != TaskStatus.Running) + { + if (Task6.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter6] = Task6.Result; + if (Task6.Status == TaskStatus.Faulted) + failed[Constants.Meter6] = true; + if (Task6.Status == TaskStatus.Canceled) + failed[Constants.Meter6] = true; + + } + } + #endregion + #region METER7 + if (enable[Constants.Meter7]) + { + if (Task7.Status != TaskStatus.Running) + { + if (Task7.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter7] = Task7.Result; + if (Task7.Status == TaskStatus.Faulted) + failed[Constants.Meter7] = true; + if (Task7.Status == TaskStatus.Canceled) + failed[Constants.Meter7] = true; + + } + } + #endregion + #region METER8 + if (enable[Constants.Meter8]) + { + if (Task8.Status != TaskStatus.Running) + { + if (Task8.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter8] = Task8.Result; + if (Task8.Status == TaskStatus.Faulted) + failed[Constants.Meter8] = true; + if (Task8.Status == TaskStatus.Canceled) + failed[Constants.Meter8] = true; + + } + } + #endregion + #region METER9 + if (enable[Constants.Meter9]) + { + if (Task9.Status != TaskStatus.Running) + { + if (Task9.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter9] = Task9.Result; + if (Task9.Status == TaskStatus.Faulted) + failed[Constants.Meter9] = true; + if (Task9.Status == TaskStatus.Canceled) + failed[Constants.Meter9] = true; + + } + } + #endregion + #region METER10 + if (enable[Constants.Meter10]) + { + if (Task10.Status != TaskStatus.Running) + { + if (Task10.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter10] = Task10.Result; + if (Task10.Status == TaskStatus.Faulted) + failed[Constants.Meter10] = true; + if (Task10.Status == TaskStatus.Canceled) + failed[Constants.Meter10] = true; + } + } + #endregion + + return failed; + } + private static Boolean CheckArray(Boolean[] array) + { + Boolean Completed = true; + + for (Int32 i = 0; i < array.Count(); i++) + { + if (array[i] == false) + return false; + } + + return Completed; + } + public static Boolean CheckIfNoMeterSelected(Boolean[] meterSelected) + { + Boolean noMeterSelected = true; + + #region CA1062 + if (meterSelected == null) + return noMeterSelected; + #endregion + + for (Int32 i = 0; i < meterSelected.Count(); i++) + { + if (meterSelected[i]) + noMeterSelected = false; + } + + return noMeterSelected; + } + public static Boolean CheckIfPortIndicatorsValid(Boolean[] meterSelected, Boolean[] serialPortOpenIndicator) + { + Boolean portIndicatorsValid = true; + + #region CA1062 + if ((meterSelected == null) || (serialPortOpenIndicator == null)) + return portIndicatorsValid = false; ; + #endregion + GenesisZeroFlow.Display.ShowResultStatus("METER selected", meterSelected); + GenesisZeroFlow.Display.ShowResultStatus("serialPortOpenFlag", serialPortOpenIndicator); + + for (Int32 i = 0; i < meterSelected.Count(); i++) + { + if (meterSelected[i] != (serialPortOpenIndicator[i] & serialPortOpenIndicator[Constants.NumberOfMeters + i])) + portIndicatorsValid = false; + } + + return portIndicatorsValid; + } + + } + public static class CompletionSequences + { + public static Boolean[] Total(Boolean[] enable, CmdInterface[] commandInterface, String[] password, UInt16 numberOfTrials, out Boolean aborted) + { + #region Definitions and initializations + Boolean[] SequenceFailed = new Boolean[Constants.NumberOfMeters]; + Boolean[] TaskStarted = new Boolean[Constants.NumberOfMeters]; + Boolean[] TaskCompleted = new Boolean[Constants.NumberOfMeters]; + Int32 NextDelayTime = 0; + aborted = false; + const Int16 LedMode = 0; + const Int16 StoreCalibration = 1; + + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + { + SequenceFailed[Meter] = false; + TaskStarted[Meter] = false; + TaskCompleted[Meter] = false; + } + #region CA1062 + if ((enable == null) || (password == null) || (commandInterface == null)) + { + SequenceFailed = enable; + return SequenceFailed; + } + #endregion + + Completion Completion1 = new Completion(); + Completion Completion2 = new Completion(); + Completion Completion3 = new Completion(); + Completion Completion4 = new Completion(); + Completion Completion5 = new Completion(); + Completion Completion6 = new Completion(); + Completion Completion7 = new Completion(); + Completion Completion8 = new Completion(); + Completion Completion9 = new Completion(); + Completion Completion10 = new Completion(); + + Completion1.Initialize(commandInterface[Constants.Meter1], Constants.Meter1, numberOfTrials, LedMode, StoreCalibration); + Completion2.Initialize(commandInterface[Constants.Meter2], Constants.Meter2, numberOfTrials, LedMode, StoreCalibration); + Completion3.Initialize(commandInterface[Constants.Meter3], Constants.Meter3, numberOfTrials, LedMode, StoreCalibration); + Completion4.Initialize(commandInterface[Constants.Meter4], Constants.Meter4, numberOfTrials, LedMode, StoreCalibration); + Completion5.Initialize(commandInterface[Constants.Meter5], Constants.Meter5, numberOfTrials, LedMode, StoreCalibration); + Completion6.Initialize(commandInterface[Constants.Meter6], Constants.Meter6, numberOfTrials, LedMode, StoreCalibration); + Completion7.Initialize(commandInterface[Constants.Meter7], Constants.Meter7, numberOfTrials, LedMode, StoreCalibration); + Completion8.Initialize(commandInterface[Constants.Meter8], Constants.Meter8, numberOfTrials, LedMode, StoreCalibration); + Completion9.Initialize(commandInterface[Constants.Meter9], Constants.Meter9, numberOfTrials, LedMode, StoreCalibration); + Completion10.Initialize(commandInterface[Constants.Meter10], Constants.Meter10, numberOfTrials, LedMode, StoreCalibration); + + LogOn LogOn1 = new LogOn(); + LogOn LogOn2 = new LogOn(); + LogOn LogOn3 = new LogOn(); + LogOn LogOn4 = new LogOn(); + LogOn LogOn5 = new LogOn(); + LogOn LogOn6 = new LogOn(); + LogOn LogOn7 = new LogOn(); + LogOn LogOn8 = new LogOn(); + LogOn LogOn9 = new LogOn(); + LogOn LogOn10 = new LogOn(); + + LogOn1.Initialize(commandInterface[Constants.Meter1], password[Constants.Meter1], Constants.Meter1, numberOfTrials); + LogOn2.Initialize(commandInterface[Constants.Meter1], password[Constants.Meter2], Constants.Meter2, numberOfTrials); + LogOn3.Initialize(commandInterface[Constants.Meter1], password[Constants.Meter3], Constants.Meter3, numberOfTrials); + LogOn4.Initialize(commandInterface[Constants.Meter1], password[Constants.Meter4], Constants.Meter4, numberOfTrials); + LogOn5.Initialize(commandInterface[Constants.Meter1], password[Constants.Meter5], Constants.Meter5, numberOfTrials); + LogOn6.Initialize(commandInterface[Constants.Meter1], password[Constants.Meter6], Constants.Meter6, numberOfTrials); + LogOn7.Initialize(commandInterface[Constants.Meter1], password[Constants.Meter7], Constants.Meter7, numberOfTrials); + LogOn8.Initialize(commandInterface[Constants.Meter1], password[Constants.Meter8], Constants.Meter8, numberOfTrials); + LogOn9.Initialize(commandInterface[Constants.Meter1], password[Constants.Meter9], Constants.Meter9, numberOfTrials); + LogOn10.Initialize(commandInterface[Constants.Meter1], password[Constants.Meter10], Constants.Meter10, numberOfTrials); + #endregion + #region Perform test + CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); + CancellationToken token = cancellationTokenSource.Token; + #region METER1 + Task Task1 = new Task(() => { return true; }); + Completion1.Meter(enable[Constants.Meter1], ref Task1, ref TaskStarted[Constants.Meter1], ref SequenceFailed[Constants.Meter1], LogOn1, Completion1, ref NextDelayTime, token); + #endregion + #region METER2 + Task Task2 = new Task(() => { return true; }); + Completion2.Meter(enable[Constants.Meter2], ref Task2, ref TaskStarted[Constants.Meter2], ref SequenceFailed[Constants.Meter2], LogOn2, Completion2, ref NextDelayTime, token); + #endregion + #region METER3 + Task Task3 = new Task(() => { return true; }); + Completion3.Meter(enable[Constants.Meter3], ref Task3, ref TaskStarted[Constants.Meter3], ref SequenceFailed[Constants.Meter3], LogOn3, Completion3, ref NextDelayTime, token); + #endregion + #region METER4 + Task Task4 = new Task(() => { return true; }); + Completion4.Meter(enable[Constants.Meter4], ref Task4, ref TaskStarted[Constants.Meter4], ref SequenceFailed[Constants.Meter4], LogOn4, Completion4, ref NextDelayTime, token); + #endregion + #region METER5 + Task Task5 = new Task(() => { return true; }); + Completion5.Meter(enable[Constants.Meter5], ref Task5, ref TaskStarted[Constants.Meter5], ref SequenceFailed[Constants.Meter5], LogOn5, Completion5, ref NextDelayTime, token); + #endregion + #region METER6 + Task Task6 = new Task(() => { return true; }); + Completion6.Meter(enable[Constants.Meter6], ref Task6, ref TaskStarted[Constants.Meter6], ref SequenceFailed[Constants.Meter6], LogOn6, Completion6, ref NextDelayTime, token); + #endregion + #region METER7 + Task Task7 = new Task(() => { return true; }); + Completion7.Meter(enable[Constants.Meter7], ref Task7, ref TaskStarted[Constants.Meter7], ref SequenceFailed[Constants.Meter7], LogOn7, Completion7, ref NextDelayTime, token); + #endregion + #region METER8 + Task Task8 = new Task(() => { return true; }); + Completion8.Meter(enable[Constants.Meter8], ref Task8, ref TaskStarted[Constants.Meter8], ref SequenceFailed[Constants.Meter8], LogOn8, Completion8, ref NextDelayTime, token); + #endregion + #region METER9 + Task Task9 = new Task(() => { return true; }); + Completion9.Meter(enable[Constants.Meter9], ref Task9, ref TaskStarted[Constants.Meter9], ref SequenceFailed[Constants.Meter9], LogOn9, Completion9, ref NextDelayTime, token); + #endregion + #region METER10 + Task Task10 = new Task(() => { return true; }); + Completion10.Meter(enable[Constants.Meter10], ref Task10, ref TaskStarted[Constants.Meter10], ref SequenceFailed[Constants.Meter10], LogOn10, Completion10, ref NextDelayTime, token); + #endregion + #endregion + #region Wait for tasks + Int32[] KeepAuthentifiedCounter = new Int32[Constants.NumberOfMeters]; + Boolean[] SequenceOk = new Boolean[Constants.NumberOfMeters]; + + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + { + KeepAuthentifiedCounter[Meter] = 0; + SequenceOk[Meter] = false; + } + + while (!CheckArray(TaskCompleted)) + { + if (GenesisZeroFlow._GenesisZeroFlow.AbortIndicator) + { + aborted = true; + cancellationTokenSource.Cancel(); + GenesisZeroFlow.Display.DebugCrcIndicatorVisible(false); + } + TaskCompleted[Constants.Meter1] = Misc.WaitForTask(TaskStarted[Constants.Meter1], Task1); + TaskCompleted[Constants.Meter2] = Misc.WaitForTask(TaskStarted[Constants.Meter2], Task2); + TaskCompleted[Constants.Meter3] = Misc.WaitForTask(TaskStarted[Constants.Meter3], Task3); + TaskCompleted[Constants.Meter4] = Misc.WaitForTask(TaskStarted[Constants.Meter4], Task4); + TaskCompleted[Constants.Meter5] = Misc.WaitForTask(TaskStarted[Constants.Meter5], Task5); + TaskCompleted[Constants.Meter6] = Misc.WaitForTask(TaskStarted[Constants.Meter6], Task6); + TaskCompleted[Constants.Meter7] = Misc.WaitForTask(TaskStarted[Constants.Meter7], Task7); + TaskCompleted[Constants.Meter8] = Misc.WaitForTask(TaskStarted[Constants.Meter8], Task8); + TaskCompleted[Constants.Meter9] = Misc.WaitForTask(TaskStarted[Constants.Meter9], Task9); + TaskCompleted[Constants.Meter10] = Misc.WaitForTask(TaskStarted[Constants.Meter10], Task10); + Completion1.KeepAuthentified(enable[Constants.Meter1], SequenceOk[Constants.Meter1], TaskCompleted[Constants.Meter1], ref KeepAuthentifiedCounter[Constants.Meter1], LogOn1); + Completion2.KeepAuthentified(enable[Constants.Meter2], SequenceOk[Constants.Meter2], TaskCompleted[Constants.Meter2], ref KeepAuthentifiedCounter[Constants.Meter2], LogOn2); + Completion3.KeepAuthentified(enable[Constants.Meter3], SequenceOk[Constants.Meter3], TaskCompleted[Constants.Meter3], ref KeepAuthentifiedCounter[Constants.Meter3], LogOn3); + Completion4.KeepAuthentified(enable[Constants.Meter4], SequenceOk[Constants.Meter4], TaskCompleted[Constants.Meter4], ref KeepAuthentifiedCounter[Constants.Meter4], LogOn4); + Completion5.KeepAuthentified(enable[Constants.Meter5], SequenceOk[Constants.Meter5], TaskCompleted[Constants.Meter5], ref KeepAuthentifiedCounter[Constants.Meter5], LogOn5); + Completion6.KeepAuthentified(enable[Constants.Meter6], SequenceOk[Constants.Meter6], TaskCompleted[Constants.Meter6], ref KeepAuthentifiedCounter[Constants.Meter6], LogOn6); + Completion7.KeepAuthentified(enable[Constants.Meter7], SequenceOk[Constants.Meter7], TaskCompleted[Constants.Meter7], ref KeepAuthentifiedCounter[Constants.Meter7], LogOn7); + Completion8.KeepAuthentified(enable[Constants.Meter8], SequenceOk[Constants.Meter8], TaskCompleted[Constants.Meter8], ref KeepAuthentifiedCounter[Constants.Meter8], LogOn8); + Completion9.KeepAuthentified(enable[Constants.Meter9], SequenceOk[Constants.Meter9], TaskCompleted[Constants.Meter9], ref KeepAuthentifiedCounter[Constants.Meter9], LogOn9); + Completion10.KeepAuthentified(enable[Constants.Meter10], SequenceOk[Constants.Meter10], TaskCompleted[Constants.Meter10], ref KeepAuthentifiedCounter[Constants.Meter10], LogOn10); + Misc.WaitNSeconds(1); + + //SequenceFailed = GetTaskResult(TaskStarted, Task1, Task2, Task3, Task4, Task5, Task6, Task7, Task8, Task8, Task10); + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + SequenceOk[Meter] = !SequenceFailed[Meter]; + GenesisZeroFlow.Display.ShowResultStatus("Completion sequence OK (while loop) = ", SequenceOk); + GenesisZeroFlow.Display.MeterStatusGreenRed(SequenceOk, TaskStarted); + } + #endregion + #region Destroy tasks + SequenceFailed = GetTaskResult(TaskStarted, Task1, Task2, Task3, Task4, Task5, Task6, Task7, Task8, Task8, Task10); + GenesisZeroFlow.Display.ShowResultStatus("Completion sequence failed = ", SequenceFailed); + GenesisZeroFlow.Display.ShowResultStatus("Task Completed = ", TaskCompleted); + + if ((Task1.Status == TaskStatus.RanToCompletion) || (Task1.Status == TaskStatus.Canceled) || (Task1.Status == TaskStatus.Faulted)) + Task1.Dispose(); + if ((Task2.Status == TaskStatus.RanToCompletion) || (Task2.Status == TaskStatus.Canceled) || (Task2.Status == TaskStatus.Faulted)) + Task2.Dispose(); + if ((Task3.Status == TaskStatus.RanToCompletion) || (Task3.Status == TaskStatus.Canceled) || (Task3.Status == TaskStatus.Faulted)) + Task3.Dispose(); + if ((Task4.Status == TaskStatus.RanToCompletion) || (Task4.Status == TaskStatus.Canceled) || (Task4.Status == TaskStatus.Faulted)) + Task4.Dispose(); + if ((Task5.Status == TaskStatus.RanToCompletion) || (Task5.Status == TaskStatus.Canceled) || (Task5.Status == TaskStatus.Faulted)) + Task5.Dispose(); + if ((Task6.Status == TaskStatus.RanToCompletion) || (Task6.Status == TaskStatus.Canceled) || (Task6.Status == TaskStatus.Faulted)) + Task6.Dispose(); + if ((Task7.Status == TaskStatus.RanToCompletion) || (Task7.Status == TaskStatus.Canceled) || (Task7.Status == TaskStatus.Faulted)) + Task7.Dispose(); + if ((Task8.Status == TaskStatus.RanToCompletion) || (Task8.Status == TaskStatus.Canceled) || (Task8.Status == TaskStatus.Faulted)) + Task8.Dispose(); + if ((Task9.Status == TaskStatus.RanToCompletion) || (Task9.Status == TaskStatus.Canceled) || (Task9.Status == TaskStatus.Faulted)) + Task9.Dispose(); + if ((Task10.Status == TaskStatus.RanToCompletion) || (Task10.Status == TaskStatus.Canceled) || (Task10.Status == TaskStatus.Faulted)) + Task10.Dispose(); + #endregion + + return SequenceFailed; + } + private static Boolean[] GetTaskResult(Boolean[] enable, Task Task1, Task Task2, Task Task3, Task Task4, Task Task5, Task Task6, Task Task7, Task Task8, Task Task9, Task Task10) + { + #region Definitions and initializations + Boolean[] failed = new Boolean[Constants.NumberOfMeters]; + for (UInt16 Meter = 0; Meter < Constants.NumberOfMeters; Meter++) + failed[Meter] = false; + #endregion + #region METER1 + if (enable[Constants.Meter1]) + { + if (Task1.Status != TaskStatus.Running) + { + if (Task1.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter1] = Task1.Result; + if (Task1.Status == TaskStatus.Faulted) + failed[Constants.Meter1] = true; + if (Task1.Status == TaskStatus.Canceled) + failed[Constants.Meter1] = true; + } + } + #endregion + #region METER2 + if (enable[Constants.Meter2]) + { + if (Task2.Status != TaskStatus.Running) + { + if (Task2.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter2] = Task2.Result; + if (Task2.Status == TaskStatus.Faulted) + failed[Constants.Meter2] = true; + if (Task2.Status == TaskStatus.Canceled) + failed[Constants.Meter2] = true; + } + } + #endregion + #region METER3 + if (enable[Constants.Meter3]) + { + if (Task3.Status != TaskStatus.Running) + { + if (Task3.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter3] = Task3.Result; + if (Task3.Status == TaskStatus.Faulted) + failed[Constants.Meter3] = true; + if (Task3.Status == TaskStatus.Canceled) + failed[Constants.Meter3] = true; + } + } + #endregion + #region METER4 + if (enable[Constants.Meter4]) + { + if (Task4.Status != TaskStatus.Running) + { + if (Task4.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter4] = Task4.Result; + if (Task4.Status == TaskStatus.Faulted) + failed[Constants.Meter4] = true; + if (Task4.Status == TaskStatus.Canceled) + failed[Constants.Meter4] = true; + } + } + #endregion + #region METER5 + if (enable[Constants.Meter5]) + { + if (Task5.Status != TaskStatus.Running) + { + if (Task5.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter5] = Task5.Result; + if (Task5.Status == TaskStatus.Faulted) + failed[Constants.Meter5] = true; + if (Task5.Status == TaskStatus.Canceled) + failed[Constants.Meter5] = true; + } + } + #endregion + #region METER6 + if (enable[Constants.Meter6]) + { + if (Task6.Status != TaskStatus.Running) + { + if (Task6.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter6] = Task6.Result; + if (Task6.Status == TaskStatus.Faulted) + failed[Constants.Meter6] = true; + if (Task6.Status == TaskStatus.Canceled) + failed[Constants.Meter6] = true; + } + } + #endregion + #region METER7 + if (enable[Constants.Meter7]) + { + if (Task7.Status != TaskStatus.Running) + { + if (Task7.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter7] = Task7.Result; + if (Task7.Status == TaskStatus.Faulted) + failed[Constants.Meter7] = true; + if (Task7.Status == TaskStatus.Canceled) + failed[Constants.Meter7] = true; + } + } + #endregion + #region METER8 + if (enable[Constants.Meter8]) + { + if (Task8.Status != TaskStatus.Running) + { + if (Task8.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter8] = Task8.Result; + if (Task8.Status == TaskStatus.Faulted) + failed[Constants.Meter8] = true; + if (Task8.Status == TaskStatus.Canceled) + failed[Constants.Meter8] = true; + } + } + #endregion + #region METER9 + if (enable[Constants.Meter9]) + { + if (Task9.Status != TaskStatus.Running) + { + if (Task9.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter9] = Task9.Result; + if (Task9.Status == TaskStatus.Faulted) + failed[Constants.Meter9] = true; + if (Task9.Status == TaskStatus.Canceled) + failed[Constants.Meter9] = true; + } + } + #endregion + #region METER10 + if (enable[Constants.Meter10]) + { + if (Task10.Status != TaskStatus.Running) + { + if (Task10.Status == TaskStatus.RanToCompletion) + failed[Constants.Meter10] = Task10.Result; + if (Task10.Status == TaskStatus.Faulted) + failed[Constants.Meter10] = true; + if (Task10.Status == TaskStatus.Canceled) + failed[Constants.Meter10] = true; + } + } + #endregion + + return failed; + } + private static Boolean CheckArray(Boolean[] array) + { + Boolean Completed = true; + for (Int32 i = 0; i < (Int32)array.Count(); i++) + { + if (array[i] == false) + return false; + } + return Completed; + } + + } + #endregion + #region Non static classes + public class LogOn + { + private String Password { get; set; } + private UInt16 MeterNumber { get; set; } + private UInt16 NumberOfTrials { get; set; } + private CultureInfo GlobalCulture { get; set; } + private SerialPort SerialPort { get; set; } + private CmdInterface CommandInterface { get; set; } + public void Initialize(CmdInterface commandInterface, String password, UInt16 meterNumber, UInt16 numberOfTrials) + { + this.Password = password; + this.MeterNumber = meterNumber; + this.NumberOfTrials = numberOfTrials; + this.GlobalCulture = GenesisZeroFlow._GenesisZeroFlow.GetGlobalCulture(); + this.CommandInterface = commandInterface; + } + public Boolean PerformLogOn(CancellationToken token, out String debugMessage) + { + #region Definitions and initializations + Boolean reAuthentication = false; + Boolean Ok = false; + UInt16 Trials = 0; + Byte[] Password = new Byte[12] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + String MeterIndex = (this.MeterNumber + 1).ToString(this.GlobalCulture); + String DebugMessage = String.Empty; + #endregion + #region Get password + debugMessage = String.Empty; + if (this.Password.Count() != 12) + { + debugMessage = "COMMAND CHANNEL:\t Password length wrong at METER" + MeterIndex + "\n"; + return Ok; + } + Boolean OnlyHex = Misc.OnlyHexInString(this.Password); + if (!OnlyHex) + { + if (String.IsNullOrEmpty(this.Password)) + debugMessage = "COMMAND CHANNEL:\t Missing password at METER" + MeterIndex + "\n"; + else + debugMessage = "COMMAND CHANNEL:\t Password contains invalid characters at METER" + MeterIndex + "\n"; + return Ok; + } + Password = Encoding.ASCII.GetBytes(this.Password); + #endregion + #region Send data to privilege register + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing '8' to 'Privilege'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials + "\n"); + Ok = this.SetPrivilegeRegister(8, out DebugMessage); + + if (Ok) + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing '8' to 'Privilege'-register successful at METER" + MeterIndex + "\n"); + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing '8' to 'Privilege'-register failed at METER" + MeterIndex + "\n"); + if ((this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied)|| (this.CommandInterface.Subreason == GP30ConfigExErrors.LockedOut)) + reAuthentication = true; + } + Trials++; + } + if (Ok == false) + return Ok; + + #endregion + #region Send data to password register + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Password'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials + "\n"); + Ok = this.SetPasswordRegister(Password, out DebugMessage); + + if (Ok) + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Password'-register successful at METER" + MeterIndex + "\n"); + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Password'-register failed at METER" + MeterIndex + "\n"); + if ((this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied)||(this.CommandInterface.Subreason == GP30ConfigExErrors.LockedOut)) + reAuthentication = true; + } + Trials++; + } + if (Ok == false) + return Ok; + #endregion + #region Command memory + this.CommandInterface.GP30LastCommand = GP30Commands.MultipleWritedata; + this.CommandInterface.SetGP30LastRegister(GP30Registers.Password()); + #endregion + + return Ok; + } + public void Meter(Boolean enable, ref Task task, ref Boolean taskStarted, ref Boolean sequenceFailed, LogOn logOn, ref Int32 nextDelayTime, CancellationToken token) + { + #region Definitions and initializations + Int32 DelayTime = 0; + String MeterIndex = (this.MeterNumber + 1).ToString(this.GlobalCulture); + const Int32 DeltaDelay = 5; + DialogResult AskForActions = DialogResult.None; + var _sequenceFailed = sequenceFailed; + var _logOn = logOn; + String DebugMessage = String.Empty; + Int32 temp = DelayTime; + Boolean Ok = false; + #endregion + #region Avoid CA1062 + if (task == null) + return; + #endregion + #region Everything else + if ((enable) && (task.Status != TaskStatus.Running) && (!task.IsCompleted)) + { + + DelayTime = nextDelayTime; + nextDelayTime = nextDelayTime + DeltaDelay; + + taskStarted = true; + Misc.WaitNSeconds(temp); + + task = Task.Run(() => + { + + while ((AskForActions == DialogResult.Retry) || (AskForActions == DialogResult.None)) + { + #region Login procedure + if (AskForActions == DialogResult.None) + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t LOGIN started at METER" + MeterIndex + "\n"); + + Ok = _logOn.PerformLogOn(token, out DebugMessage); + + if (token.IsCancellationRequested) + { + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t LOGIN aborted at METER" + MeterIndex + "\n"); + + return true; + } + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t LOGIN successful at METER" + MeterIndex + "\n"); + + _sequenceFailed = false; + AskForActions = DialogResult.OK; + } + else + { + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t LOGIN failed at METER" + MeterIndex + "\n"); + + _sequenceFailed = true; + AskForActions = AskHowToProceedSequence("LOGIN"); + } + #endregion + } + + + return _sequenceFailed; + }); + } + #endregion + } + private DialogResult AskHowToProceedSequence(String sequenceName) + { + DialogResult AskForActions; + String MeterIndex = (this.MeterNumber + 1).ToString(this.GlobalCulture); + + GenesisZeroFlow.Display.AbortButtonEnabled(false); + AskForActions = MessageBox.Show(sequenceName + " failed at METER" + MeterIndex, "Retry?", MessageBoxButtons.RetryCancel, MessageBoxIcon.Question); + switch (AskForActions) + { + case DialogResult.Retry: + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t " + sequenceName + " restarted at METER" + MeterIndex + "\n"); + break; + case DialogResult.Cancel: + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t " + sequenceName + " canceled at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line); + break; + default: break; + } + GenesisZeroFlow.Display.AbortButtonEnabled(true); + + return AskForActions; + } + public void KeepAuthentified(Boolean enable, Boolean sequenceOk, Boolean taskCompleted, ref Int32 counter) + { + const Int32 CounterValue = 30; + + if (enable && taskCompleted && sequenceOk && (counter >= CounterValue)) + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Keep authentified at METER" + (this.MeterNumber + 1).ToString(this.GlobalCulture) + "\n"); + String DebugMessage = String.Empty; + this.GetLedModeRegister(out DebugMessage); + counter = 0; + } + else + counter++; + } + private Boolean SetPrivilegeRegister(Int32 value, out String debugMessage) + { + #region Definitions and initializations + Byte[] Payload = new Byte[4] { 0, 0, 0, 0 }; + Boolean Ok = false; + Int32 ErrCode = GP30LowLevelErrors.NoError; + #endregion + #region Write register + Payload = BitConverter.GetBytes((Int32)value); + ErrCode = this.CommandInterface.WriteRegister(GP30Registers.Privilege(), Payload, true); + #endregion + #region Wait for answer + if (ErrCode == GP30LowLevelErrors.NoError) + ErrCode = this.CommandInterface.RXProcessor(GP30RequestType.WriteRegister); + #endregion + #region Debug message + debugMessage = this.CommandInterface.LowLevelMessages(ErrCode, out Ok); + #endregion + + return Ok; + } + private Boolean SetPasswordRegister(Byte[] password, out String debugMessage) + { + #region Definitions and initializations + Boolean Ok = false; + Int32 ErrCode = GP30LowLevelErrors.NoError; + #endregion + #region Write register + ErrCode = this.CommandInterface.MultipleWriteRegister(GP30Registers.Password(), password, true); + #endregion + #region Wait for answer + if (ErrCode == GP30LowLevelErrors.NoError) + ErrCode = this.CommandInterface.RXProcessor(GP30RequestType.MultipleWrite); + #endregion + #region Debug message + debugMessage = this.CommandInterface.LowLevelMessages(ErrCode, out Ok); + #endregion + + return Ok; + } + private Boolean GetLedModeRegister(out String debugMessage) + { + #region Definitions and initialisations + Boolean Ok = false; + Int32 ErrCode = GP30LowLevelErrors.NoError; + #endregion + #region Read register + ErrCode = this.CommandInterface.ReadRegister(GP30Registers.LedMode()); + #endregion + #region Wait for answer + if (ErrCode == GP30LowLevelErrors.NoError) + ErrCode = this.CommandInterface.RXProcessor(GP30RequestType.ReadRegister); + #endregion + #region Debug message + debugMessage = this.CommandInterface.LowLevelMessages(ErrCode, out Ok); + #endregion + + return Ok; + } + + } + public class Preparation + { + private CultureInfo GlobalCulture { get; set; } + private Int32 CalibrationFactor1 { get; set; } + private Int32 CalibrationFactor2 { get; set; } + private Int32 CalibrationFactor3 { get; set; } + private UInt16 NumberOfTrials { get; set; } + private Int32 ZeroOffset1 { get; set; } + private Int32 ZeroOffset2 { get; set; } + private Int32 ZeroOffset3 { get; set; } + private Int32 SampleRate { get; set; } + private UInt16 MeterSize { get; set; } + private Int32 LedMode { get; set; } + private UInt16 MeterNumber { get; set; } + private CmdInterface CommandInterface { get; set; } + public void Initialize(CmdInterface commandInterface, UInt16 meterNumber, UInt16 trials, UInt16 meterSize) + { + this.CalibrationFactor1 = PreparationValues.CalFactor1; + this.CalibrationFactor2 = PreparationValues.CalFactor2; + this.CalibrationFactor3 = PreparationValues.CalFactor3; + this.ZeroOffset1 = PreparationValues.ZeroOffset1; + this.ZeroOffset2 = PreparationValues.ZeroOffset2; + this.ZeroOffset3 = PreparationValues.ZeroOffset3; + this.SampleRate = PreparationValues.Samplerate; + this.MeterSize = meterSize; + this.LedMode = PreparationValues.LedMode; + this.NumberOfTrials = trials; + this.MeterNumber = meterNumber; + this.GlobalCulture = GenesisZeroFlow._GenesisZeroFlow.GetGlobalCulture(); + this.CommandInterface = commandInterface; + } + private Boolean PerformPreparation(out Boolean reAuthentication, CancellationToken token) + { + #region Definitions and initialisations + const Int32 WaitingTime = 100; + Boolean Ok = false; + Int32 Trials = 0; + String DebugMessage = String.Empty; + String MeterIndex = (this.MeterNumber + 1).ToString(GlobalCulture); + reAuthentication = false; + #endregion + #region Calibration factor1 + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Calibration factor1'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(GlobalCulture) + " of " + this.NumberOfTrials + "\n"); + Ok = this.SetCalFactor1Register(this.CalibrationFactor1, out DebugMessage); + + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Calibration factor1'-register successful at METER" + MeterIndex + "\n"); + reAuthentication = false; + } + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Calibration factor1'-register failed at METER" + MeterIndex + "\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + Trials++; + } + if (Ok == false) + return false; + #endregion + #region Calibration factor2 + Misc.WaitNMilliseconds(WaitingTime); + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Calibration factor2'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(GlobalCulture) + " of " + this.NumberOfTrials + "\n"); + Ok = this.SetCalFactor2Register(this.CalibrationFactor2, out DebugMessage); + + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Calibration factor2'-register successful at METER" + MeterIndex + "\n"); + reAuthentication = false; + } + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Calibration factor2'-register failed at METER" + MeterIndex + "\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + Trials++; + } + #endregion + #region Calibration factor3 + Misc.WaitNMilliseconds(WaitingTime); + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Calibration factor3'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(GlobalCulture) + " of " + this.NumberOfTrials + "\n"); + Ok = this.SetCalFactor3Register(this.CalibrationFactor3, out DebugMessage); + + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Calibration factor3'-register successful at METER" + MeterIndex + "\n"); + reAuthentication = false; + } + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Calibration factor3'-register failed at METER" + MeterIndex + "\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + + Trials++; + } + if (Ok == false) + return false; + #endregion + #region Zeroflow Offset1 + Misc.WaitNMilliseconds(WaitingTime); + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Zeroflow offset1'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(GlobalCulture) + " of " + this.NumberOfTrials + "\n"); + Ok = this.SetZeroFlowOffset1Register(this.ZeroOffset1, out DebugMessage); + + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Zeroflow offset1'-register successful at METER" + MeterIndex + "\n"); + reAuthentication = false; + } + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Zeroflow offset1'-register failed at METER" + MeterIndex + "\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + + Trials++; + } + if (Ok == false) + return false; + #endregion + #region Zeroflow Offset2 + Misc.WaitNMilliseconds(WaitingTime); + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Zeroflow offset2'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(GlobalCulture) + " of " + this.NumberOfTrials + "\n"); + + Ok = this.SetZeroFlowOffset2Register(this.ZeroOffset2, out DebugMessage); + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Zeroflow offset2'-register successful at METER" + MeterIndex + "\n"); + reAuthentication = false; + } + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Zeroflow offset2'-register failed at METER" + MeterIndex + "\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + + Trials++; + } + if (Ok == false) + return false; + #endregion + #region Zeroflow Offset3 + Misc.WaitNMilliseconds(WaitingTime); + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Zeroflow offset3'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(GlobalCulture) + " of " + this.NumberOfTrials + "\n"); + Ok = this.SetZeroFlowOffset3Register(this.ZeroOffset3, out DebugMessage); + + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Zeroflow offset3'-register successful at METER" + MeterIndex + "\n"); + reAuthentication = false; + } + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Zeroflow offset3'-register failed at METER" + MeterIndex + "\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + + Trials++; + } + if (Ok == false) + return false; + #endregion + #region Sample rate + Misc.WaitNMilliseconds(WaitingTime); + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Samplerate'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(GlobalCulture) + " of " + this.NumberOfTrials + "\n"); + Ok = this.SetSamplerateRegister(this.SampleRate, out DebugMessage); + + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Samplerate'-register successful at METER" + MeterIndex + "\n"); + reAuthentication = false; + } + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Samplerate'-register failed at METER" + MeterIndex + "\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + + Trials++; + } + if (Ok == false) + return false; + #endregion + #region MeterSize + Misc.WaitNMilliseconds(WaitingTime); + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Metersize'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials + "\n"); + Ok = this.SetMetersizeRegister(this.MeterSize, out DebugMessage); + + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Metersize'-register successful at METER" + MeterIndex + "\n"); + reAuthentication = false; + } + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Metersize'-register failed at METER" + MeterIndex + "\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + + Trials++; + } + if (Ok == false) + return false; + #endregion + #region LedMode + Misc.WaitNMilliseconds(WaitingTime); + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'LED mode'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials + "\n"); + Ok = this.SetLedModeRegister(this.LedMode, out DebugMessage); + + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'LED mode'-register successful at METER" + MeterIndex + "\n"); + reAuthentication = false; + } + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'LED mode'-register failed at METER" + MeterIndex + "\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + + Trials++; + } + if (Ok == false) + return false; + #endregion + + return Ok; + } + public void Meter(Boolean enable, ref Task task, ref Boolean taskStarted, ref Boolean sequenceFailed, LogOn logOn, Preparation preparation, ref Int32 nextDelayTime, CancellationToken token) + { + #region Definitions and initializations + Boolean Ok = false; + String DebugMessage = String.Empty; + String MeterIndex = (this.MeterNumber + 1).ToString(this.GlobalCulture); + DialogResult AskForActions = DialogResult.None; + Int32 DelayTime = 0; + const Int32 DeltaDelay = 5; + #endregion + + if (enable) + { + DelayTime = nextDelayTime; + nextDelayTime = nextDelayTime + DeltaDelay; + Int32 temp = DelayTime; + taskStarted = true; + var _sequenceFailed = sequenceFailed; + var _logOn = logOn; + Boolean ReAuthentication = false; + + task = Task.Run(() => + { + + Misc.WaitNSeconds(temp); + while ((AskForActions == DialogResult.Retry) || (AskForActions == DialogResult.None)) + { + #region Cancelation token + if (!token.IsCancellationRequested) + GenesisZeroFlow.Display.AbortButtonEnabled(true); + #endregion + #region Optional reauthentication + _sequenceFailed = ReauthenticationProcedure(_logOn, token, ref ReAuthentication); + #endregion + #region Testprocedure + if (AskForActions == DialogResult.None) + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t PREPARATION started at METER" + MeterIndex + "\n"); + + Ok = preparation.PerformPreparation(out ReAuthentication, token); + if (token.IsCancellationRequested) + { + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t PREPARATION aborted at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + return true; + } + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t PREPARATION successful at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line); + _sequenceFailed = false; + + AskForActions = DialogResult.OK; + } + else + { + if (ReAuthentication == false) + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t " + DebugMessage + "\n"); + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t PREPARATION failed at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + AskForActions = AskHowToProceedSequence("PREPARATION"); + } + _sequenceFailed = true; + + } + #endregion + } + AskForActions = DialogResult.None; + + return _sequenceFailed; + }); + } + } + + private DialogResult AskHowToProceedSequence(String sequenceName) + { + DialogResult AskForActions; + String MeterIndex = (this.MeterNumber + 1).ToString(this.GlobalCulture); + + GenesisZeroFlow.Display.AbortButtonEnabled(false); + AskForActions = MessageBox.Show(sequenceName + " failed at METER" + MeterIndex, "Retry?", MessageBoxButtons.RetryCancel, MessageBoxIcon.Question); + switch (AskForActions) + { + case DialogResult.Retry: + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t " + sequenceName + " restarted at METER" + MeterIndex + "\n"); + break; + case DialogResult.Cancel: + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t " + sequenceName + " canceled at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line); + break; + default: break; + } + + return AskForActions; + } + private Boolean ReauthenticationProcedure(LogOn logOn, CancellationToken token, ref Boolean reAuthentication) + { + #region Definitions and initialization + Boolean Ok = false; + String MeterIndex = (this.MeterNumber + 1).ToString(this.GlobalCulture); + String DebugMessage = String.Empty; + Boolean SequenceFailed = false; + DialogResult askForActionsAuth = DialogResult.None; + #endregion + #region Optional reauthentification + if (reAuthentication) + { + + while ((askForActionsAuth == DialogResult.Retry) || (askForActionsAuth == DialogResult.None)) + { + + if (askForActionsAuth == DialogResult.None) + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Reauthentication started at METER" + MeterIndex + "\n"); + + Ok = logOn.PerformLogOn(token, out DebugMessage); + if (token.IsCancellationRequested) + { + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Reauthentication aborted at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + return true; + } + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Reauthentication successful at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line); + SequenceFailed = false; + reAuthentication = false; + askForActionsAuth = DialogResult.OK; + } + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t " + DebugMessage + "\n"); + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Reauthentication failed at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + SequenceFailed = true; + + askForActionsAuth = MessageBox.Show("Reauthentication failed at METER" + MeterIndex, "Retry?", MessageBoxButtons.RetryCancel, MessageBoxIcon.Question); + switch (askForActionsAuth) + { + case DialogResult.Retry: + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Reauthentication restarted at METER" + MeterIndex + "\n"); + break; + case DialogResult.Cancel: + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Reauthentication canceled at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line); + SequenceFailed = true; + return SequenceFailed; + //break; + default: break; + } + + } + } + } + #endregion + + return SequenceFailed; + + } + public void KeepAuthentified(Boolean enable, Boolean sequenceOk, Boolean taskCompleted, ref Int32 counter, LogOn logOn) + { + logOn.KeepAuthentified(enable, sequenceOk, taskCompleted, ref counter); + } + private Boolean SetCalFactor1Register(Int32 value, out String debugMessage) + { + #region Definitions and initializations + Byte[] Payload = new Byte[4] { 0, 0, 0, 0 }; + Boolean Ok = false; + Int32 ErrCode = GP30LowLevelErrors.NoError; + #endregion + #region Write register + Payload = BitConverter.GetBytes((Int32)value); + ErrCode = this.CommandInterface.WriteRegister(GP30Registers.CalFactor1(), Payload, true); + #region Wait for answer + if (ErrCode == GP30LowLevelErrors.NoError) + ErrCode = this.CommandInterface.RXProcessor(GP30RequestType.WriteRegister); + #endregion + #region Debug message + debugMessage = this.CommandInterface.LowLevelMessages(ErrCode, out Ok); + #endregion + #endregion + + return Ok; + } + private Boolean SetCalFactor2Register(Int32 value, out String debugMessage) + { + #region Definitions and initialisations + Byte[] Payload = new Byte[4] { 0, 0, 0, 0 }; + Boolean Ok = false; + Int32 ErrCode = GP30LowLevelErrors.NoError; + #endregion + #region Write register + Payload = BitConverter.GetBytes((Int32)value); + ErrCode = this.CommandInterface.WriteRegister(GP30Registers.CalFactor2(), Payload, true); + #endregion + #region Wait for answer + if (ErrCode == GP30LowLevelErrors.NoError) + ErrCode = this.CommandInterface.RXProcessor(GP30RequestType.WriteRegister); + #endregion + #region Debug message + debugMessage = this.CommandInterface.LowLevelMessages(ErrCode, out Ok); + #endregion + + return Ok; + } + private Boolean SetCalFactor3Register(Int32 value, out String debugMessage) + { + #region Definitions and initialisations + Byte[] Payload = new Byte[4] { 0, 0, 0, 0 }; + Boolean Ok = false; + Int32 ErrCode = GP30LowLevelErrors.NoError; + #endregion + #region Write register + Payload = BitConverter.GetBytes((Int32)value); + ErrCode = this.CommandInterface.WriteRegister(GP30Registers.CalFactor3(), Payload, true); + #endregion + #region Wait for answer + if (ErrCode == GP30LowLevelErrors.NoError) + ErrCode = this.CommandInterface.RXProcessor(GP30RequestType.WriteRegister); + #endregion + #region Debug message + debugMessage = this.CommandInterface.LowLevelMessages(ErrCode, out Ok); + #endregion + + return Ok; + } + private Boolean SetZeroFlowOffset1Register(Int32 value, out String debugMessage) + { + #region Definitions and initialisations + Byte[] Payload = new Byte[4] { 0, 0, 0, 0 }; + Boolean Ok = false; + Int32 ErrCode = GP30LowLevelErrors.NoError; + #endregion + #region Write register + Payload = BitConverter.GetBytes((Int32)value); + ErrCode = this.CommandInterface.WriteRegister(GP30Registers.ZeroOffset1(), Payload, true); + #endregion + #region Wait for answer + if (ErrCode == GP30LowLevelErrors.NoError) + ErrCode = this.CommandInterface.RXProcessor(GP30RequestType.WriteRegister); + #endregion + #region Debug message + debugMessage = this.CommandInterface.LowLevelMessages(ErrCode, out Ok); + #endregion + + return Ok; + } + private Boolean SetZeroFlowOffset2Register(Int32 value, out String debugMessage) + { + #region Definitions and initialisations + Byte[] Payload = new Byte[4] { 0, 0, 0, 0 }; + Boolean Ok = false; + Int32 ErrCode = GP30LowLevelErrors.NoError; + #endregion + #region Write register + Payload = BitConverter.GetBytes((Int32)value); + ErrCode = this.CommandInterface.WriteRegister(GP30Registers.ZeroOffset2(), Payload, true); + #endregion + #region Wait for answer + if (ErrCode == GP30LowLevelErrors.NoError) + ErrCode = this.CommandInterface.RXProcessor(GP30RequestType.WriteRegister); + #endregion + #region Debug message + debugMessage = this.CommandInterface.LowLevelMessages(ErrCode, out Ok); + #endregion + + return Ok; + } + private Boolean SetZeroFlowOffset3Register(Int32 value, out String debugMessage) + { + #region Definitions and initialisations + Byte[] Payload = new Byte[4] { 0, 0, 0, 0 }; + Boolean Ok = false; + Int32 ErrCode = GP30LowLevelErrors.NoError; + #endregion + #region Write register + Payload = BitConverter.GetBytes((Int32)value); + ErrCode = this.CommandInterface.WriteRegister(GP30Registers.ZeroOffset3(), Payload, true); + #endregion + #region Wait for answer + if (ErrCode == GP30LowLevelErrors.NoError) + ErrCode = this.CommandInterface.RXProcessor(GP30RequestType.WriteRegister); + #endregion + #region Debug message + debugMessage = this.CommandInterface.LowLevelMessages(ErrCode, out Ok); + #endregion + + return Ok; + } + private Boolean SetSamplerateRegister(Int32 value, out String debugMessage) + { + #region Definitions and initialisations + Byte[] Payload = new Byte[4] { 0, 0, 0, 0 }; + Boolean Ok = false; + Int32 ErrCode = GP30LowLevelErrors.NoError; + #endregion + #region Write register + Payload = BitConverter.GetBytes((Int32)value); + ErrCode = this.CommandInterface.WriteRegister(GP30Registers.Samplerate(), Payload, true); + #endregion + #region Wait for answer + if (ErrCode == GP30LowLevelErrors.NoError) + ErrCode = this.CommandInterface.RXProcessor(GP30RequestType.WriteRegister); + #endregion + #region Debug message + debugMessage = this.CommandInterface.LowLevelMessages(ErrCode, out Ok); + #endregion + + return Ok; + } + private Boolean SetMetersizeRegister(Int32 value, out String debugMessage) + { + #region Definitions and initialisations + Byte[] Payload = new Byte[4] { 0, 0, 0, 0 }; + Boolean Ok = false; + Int32 ErrCode = GP30LowLevelErrors.NoError; + #endregion + #region Write register + Payload = BitConverter.GetBytes((Int32)value); + ErrCode = this.CommandInterface.WriteRegister(GP30Registers.MeterSize(), Payload, true); + #endregion + #region Wait for answer + if (ErrCode == GP30LowLevelErrors.NoError) + ErrCode = this.CommandInterface.RXProcessor(GP30RequestType.WriteRegister); + #endregion + #region Debug message + debugMessage = this.CommandInterface.LowLevelMessages(ErrCode, out Ok); + #endregion + + return Ok; + } + private Boolean SetLedModeRegister(Int32 value, out String debugMessage) + { + #region Definitions and initialisations + Byte[] Payload = new Byte[4] { 0, 0, 0, 0 }; + Boolean Ok = false; + Int32 ErrCode = GP30LowLevelErrors.NoError; + #endregion + #region Write register + Payload = BitConverter.GetBytes((Int32)value); + ErrCode = this.CommandInterface.WriteRegister(GP30Registers.LedMode(), Payload, true); + #endregion + #region Wait for answer + if (ErrCode == GP30LowLevelErrors.NoError) + ErrCode = this.CommandInterface.RXProcessor(GP30RequestType.WriteRegister); + #endregion + #region Debug message + debugMessage = this.CommandInterface.LowLevelMessages(ErrCode, out Ok); + #endregion + + return Ok; + } + } + + public class EmptyPipeCheck + { + private Int32 WaitingTime { get; set; } + private UInt16 MeterNumber { get; set; } + private CultureInfo Culture { get; set; } + public void Initialize(Int32 waitingTime, UInt16 meterNumber, CultureInfo culture) + { + this.WaitingTime = waitingTime; + this.MeterNumber = meterNumber; + this.Culture = culture; + } + public Boolean PerformTest(out Boolean aborted, CancellationToken token) + { + #region Definitions and initialization + Boolean SequenceFailed = false; + Boolean PerformWait = false; + Double[] Error = new Double[Constants.NumberOfPaths]; + Int32 Countup = 0; + Int32[] LinecounterFollowing = new Int32[Constants.NumberOfPaths] { 0, 0, 0 }; + aborted = false; + Boolean ActivityOk = false; + String MeterIndex = (this.MeterNumber + 1).ToString(this.Culture); + #endregion + #region Reset counter for activity check/ switch on counting + GenesisZeroFlow._GenesisZeroFlow.SetLineCounterEmptyPipeTest(0, this.MeterNumber, Constants.PATH0); + GenesisZeroFlow._GenesisZeroFlow.SetLineCounterEmptyPipeTest(0, this.MeterNumber, Constants.PATH1); + GenesisZeroFlow._GenesisZeroFlow.SetLineCounterEmptyPipeTest(0, this.MeterNumber, Constants.PATH2); + GenesisZeroFlow._GenesisZeroFlow.SetLoggingIndicatorEmptyPipeTest(this.MeterNumber, true); + #endregion + #region Cancel + if (token.IsCancellationRequested) + return true; + #endregion + #region Testsequence + for (Int32 Countdown = WaitingTime; Countdown >= 0; Countdown--) + { + if (Countup == 0) + PerformWait = true; + else + PerformWait = false; + #region Abort + if (GenesisZeroFlow._GenesisZeroFlow.AbortIndicator) + { + aborted = true; + return true; // all enabled meters get sequence failed + } + #endregion + #region Activity check + GenesisZeroFlow.Display.StatusLabel("Wait for leaving EMPTY PIPE mode: " + Countdown.ToString(this.Culture) + "s"); + ActivityOk = this.PollNumberOfLines(ref LinecounterFollowing, Countup); + + if (token.IsCancellationRequested) + return true; + #endregion + #region Time control + Misc.WaitNSeconds(1); + Countup++; + #endregion + #region Get error status + Error[Constants.PATH0] = GenesisZeroFlow._GenesisZeroFlow.GetDecodedAllMeters()[MeterNumber][Constants.PATH0].Error; + Error[Constants.PATH1] = GenesisZeroFlow._GenesisZeroFlow.GetDecodedAllMeters()[MeterNumber][Constants.PATH1].Error; + Error[Constants.PATH2] = GenesisZeroFlow._GenesisZeroFlow.GetDecodedAllMeters()[MeterNumber][Constants.PATH2].Error; + #endregion + #region Check if wait + for (UInt16 Path = 0; Path < Constants.NumberOfPaths; Path++) + { + if ((Error[Path] != DataError.NoError)||(!ActivityOk)) + PerformWait = true; + } + #endregion + #region All OK + if (PerformWait == false) + { + GenesisZeroFlow.Display.DebugMessage("DATA CHANNEL:\t\t Leave EMPTY PIPE mode at METER" + MeterIndex + "\n"); + return false; + } + #endregion + } + #endregion + #region Failed + SequenceFailed = true; + GenesisZeroFlow.Display.DebugMessage("DATA CHANNEL:\t\t Leave EMPTY PIPE mode failed at METER" + MeterIndex + "\n"); + #endregion + #region Switch off counting + GenesisZeroFlow._GenesisZeroFlow.SetLoggingIndicatorEmptyPipeTest(this.MeterNumber, false); + #endregion + + return SequenceFailed; + } + private Boolean PollNumberOfLines(ref Int32[] lineCounterFollowing, Int32 seconds) + { + #region Definitions and initializations + Boolean Ok = true; + Boolean Error = false; + #endregion + #region Check activity + for (UInt16 Path = 0; Path < Constants.NumberOfPaths; Path++) + { + if (GenesisZeroFlow._GenesisZeroFlow.GetLineCounterEmptyPipeTest()[this.MeterNumber][Path] != 0) + { + if (GenesisZeroFlow._GenesisZeroFlow.GetLineCounterEmptyPipeTest()[this.MeterNumber][Path] == lineCounterFollowing[Path]) + return false; + else + lineCounterFollowing[Path] = GenesisZeroFlow._GenesisZeroFlow.GetLineCounterEmptyPipeTest()[this.MeterNumber][Path]; + + } + if ((seconds > 0) && (GenesisZeroFlow._GenesisZeroFlow.GetLineCounterEmptyPipeTest()[this.MeterNumber][Path] == 0)) + return false; + + } + #endregion + #region Result + Ok = !Error; + #endregion + + return Ok; + } + + } + public class Amplitude + { + private CmdInterface CommandInterface { get; set; } + private UInt16 MeterNumber { get; set; } + private UInt16 NumberOfTrials { get; set; } + private Int32 FirstHitLevelPercMin { get; set; } + private Int32 FirstHitLevelPercMax { get; set; } + private Int32 TofRecordingTime { get; set; } + private Double TriggerValue { get; set; } + private Int32 ErrorValue { get; set; } + private Int32 OptimumMinValue { get; set; } + private Int32 OptimumMaxValue { get; set; } + private Double OptimumMinDistance { get; set; } + private CultureInfo GlobalCulture { get; set; } + public void Initialize(CmdInterface commandInterface, Int32 optimumMinValue, Int32 optimumMaxValue, Int32 optimumMinDistance, UInt16 numberOfTrials, Int32 firstHitLevelPropMin, Int32 firstHitLevelPropMax, Int32 tofRecordingTime, Double triggerValue, Int32 errorValue, UInt16 meterNumber) + { + this.NumberOfTrials = numberOfTrials; + this.TofRecordingTime = tofRecordingTime; + this.FirstHitLevelPercMin = firstHitLevelPropMin; + this.FirstHitLevelPercMax = firstHitLevelPropMax; + this.TriggerValue = triggerValue; + this.ErrorValue = errorValue; + this.OptimumMinValue = optimumMinValue; + this.OptimumMaxValue = optimumMaxValue; + this.OptimumMinDistance = optimumMinDistance; + this.MeterNumber = meterNumber; + this.GlobalCulture = GenesisZeroFlow._GenesisZeroFlow.GetGlobalCulture(); + this.CommandInterface = commandInterface; + } + public void Meter(Boolean enable, ref Task task, ref Boolean taskStarted, ref Boolean sequenceFailed, LogOn logOn, Amplitude amplitude, ref Int32 nextDelayTime, CancellationToken token) + { + #region avoid CA1062 + if ((task == null) || (amplitude == null)) + return; + #endregion + #region Definitions and initializations + Int32 DelayTime = 0; + String MeterIndex = (amplitude.CommandInterface.MeterNumber + 1).ToString(this.GlobalCulture); + const Int32 DeltaDelay = 30; + + DialogResult AskForActions = DialogResult.None; + Boolean ReAuthentication = false; + var _sequenceFailed = sequenceFailed; + var _logOn = logOn; + var _amplitude = amplitude; + Int32 temp = DelayTime; + Boolean Ok = false; + #endregion + #region Everything else + if ((enable) && (task.Status != TaskStatus.Running) && (!task.IsCompleted)) + { + DelayTime = nextDelayTime; + nextDelayTime = nextDelayTime + DeltaDelay; + + taskStarted = true; + Misc.WaitNSeconds(temp); + + task = Task.Run(() => + { + while ((AskForActions == DialogResult.Retry) || (AskForActions == DialogResult.None) && (!token.IsCancellationRequested)) + { + #region Abort + if (!token.IsCancellationRequested) + GenesisZeroFlow.Display.AbortButtonEnabled(true); + #endregion + #region Optional reauthentication + _sequenceFailed = ReauthenticationProcedure(_logOn, token, ref ReAuthentication); + #endregion + #region Testprocedure + if (AskForActions == DialogResult.None) + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t AMPLITUDE TEST started at METER" + MeterIndex + "\n"); + + Ok = _amplitude.PerformTest(token, out ReAuthentication); + + if (token.IsCancellationRequested) + { + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t AMPLITUDE TEST aborted at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + return true; // sequence failed + } + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t AMPLITUDE TEST successful at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line); + _sequenceFailed = false; + AskForActions = DialogResult.OK; + } + else + { + if (!ReAuthentication) + { + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t AMPLITUDE TEST failed at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + AskForActions = this.AskHowToProceedSequence("AMPLITUDE TEST"); + } + _sequenceFailed = true; + } + #endregion + } + return _sequenceFailed; + + }, token); + + } + #endregion + } + private Boolean PerformTest(CancellationToken token, out Boolean reAuthentication) + { + this.ClearData(); + + #region Definitions and initializations + UInt16 Trials = 0; + const Int32 FirstHitShiftValue = 4; + const Int32 FirstHitShiftValueEnd = 4; + const Int32 FirstHitUpdatePeriodeValue = 1; + const Int32 FirstHitUpdatePeriodeValueEnd = 10; + const Int32 WaitBeforeLogging = 1; + UInt16 MeterNumber = this.CommandInterface.MeterNumber; + String DebugMessage = String.Empty; + String MeterIndex = (this.CommandInterface.MeterNumber + 1).ToString(this.GlobalCulture); + Boolean[] dummy = new Boolean[Constants.NumberOfMeters]; + reAuthentication = false; + + + List[] TofAvgMeanTotal = new List[Constants.NumberOfPaths]; + Boolean Ok = false; + + List[] AmplitudeValuesPos1 = new List[Constants.NumberOfPaths]; + List[] AmplitudeValuesPos2 = new List[Constants.NumberOfPaths]; + List[] AmplitudeValuesPos3 = new List[Constants.NumberOfPaths]; + List[] AmplitudeValuesPos4 = new List[Constants.NumberOfPaths]; + List[] AmplitudeValuesNeg1 = new List[Constants.NumberOfPaths]; + List[] AmplitudeValuesNeg2 = new List[Constants.NumberOfPaths]; + List[] AmplitudeValuesNeg3 = new List[Constants.NumberOfPaths]; + List[] AmplitudeValuesNeg4 = new List[Constants.NumberOfPaths]; + + for (UInt16 Path = 0; Path < Constants.NumberOfPaths; Path++) + { + AmplitudeValuesPos1[Path] = new List(); + AmplitudeValuesPos2[Path] = new List(); + AmplitudeValuesPos3[Path] = new List(); + AmplitudeValuesPos4[Path] = new List(); + AmplitudeValuesNeg1[Path] = new List(); + AmplitudeValuesNeg2[Path] = new List(); + AmplitudeValuesNeg3[Path] = new List(); + AmplitudeValuesNeg4[Path] = new List(); + TofAvgMeanTotal[Path] = new List(); + } + + Double[] TofAvgMean = new Double[Constants.NumberOfPaths] { 0, 0, 0 }; + Int32[] OptimalPoint = new Int32[Constants.NumberOfPaths] { 0, 0, 0 }; + #endregion + #region Test sequence + #region Set first hit update period + GenesisZeroFlow.Display.StatusLabel("Wait until register write has finished"); + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing " + FirstHitUpdatePeriodeValue.ToString(this.GlobalCulture) + " to 'First hit update period'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + Ok = this.SetFirstHitUpdatePeriod(FirstHitUpdatePeriodeValue, out DebugMessage); + + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing " + FirstHitUpdatePeriodeValue.ToString(this.GlobalCulture) + " to 'First hit update period'-register successful at METER" + MeterIndex + "\n"); + reAuthentication = false; + } + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing " + FirstHitUpdatePeriodeValue.ToString(this.GlobalCulture) + " to 'First hit update period'-register failed at METER" + MeterIndex + "\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + Trials++; + } + if (Ok == false) + return false; + #endregion + #region Set first hit shift to 4 + GenesisZeroFlow.Display.StatusLabel("Wait until register write has finished"); + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing " + FirstHitShiftValue.ToString(this.GlobalCulture) + " to 'First hit shift'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + Ok = this.SetFirstHitShift(FirstHitShiftValue, out DebugMessage); + + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing " + FirstHitShiftValue.ToString(this.GlobalCulture) + " to 'First hit shift'-register successful at METER" + MeterIndex + "\n"); + reAuthentication = false; + } + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing " + FirstHitShiftValue.ToString(this.GlobalCulture) + " to 'First hit shift'-register failed at METER" + MeterIndex + "\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + Trials++; + } + if (Ok == false) + return false; + + #endregion + #region Set first hit level percentage from 5 to 40 + ClearData(); + GenesisZeroFlow.Display.DebugMessage("DATA CHANNEL:\t\t Start first hit level percentage sweep at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + + for (Int32 FirstHitLevelPercentage = (Int32)(this.FirstHitLevelPercMin); FirstHitLevelPercentage <= (this.FirstHitLevelPercMax); FirstHitLevelPercentage++) + { + + if (token.IsCancellationRequested) + { + this.ClearData(); + return false; + } + + GenesisZeroFlow.Display.StatusLabel("Wait for percentage sweep to end: " + FirstHitLevelPercentage.ToString(this.GlobalCulture) + "/" + FirstHitLevelPercMax.ToString(this.GlobalCulture)); + #region Write to percentage register PATH0 + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + { + this.ClearData(); + return false; + } + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing " + FirstHitLevelPercentage.ToString(this.GlobalCulture) + " to 'Percentage'-register at METER" + MeterIndex + "; PATH1; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + + Ok = this.SetPercentageRegisterPath0(FirstHitLevelPercentage, out DebugMessage); + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing " + FirstHitLevelPercentage.ToString(this.GlobalCulture) + " to 'Percentage'-register successful at METER" + MeterIndex + "; PATH1\n"); + reAuthentication = false; + } + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing " + FirstHitLevelPercentage.ToString(this.GlobalCulture) + " to 'Percentage'-register failed at METER" + MeterIndex + "; PATH1\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + Trials++; + } + if (Ok == false) + { + this.ClearData(); + return false; + } + #endregion + #region Write to percentage register PATH1 + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + { + this.ClearData(); + return false; + } + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing " + FirstHitLevelPercentage.ToString(this.GlobalCulture) + " to 'Percentage'-register at METER" + MeterIndex + "; PATH2; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + + Ok = this.SetPercentageRegisterPath1(FirstHitLevelPercentage, out DebugMessage); + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing " + FirstHitLevelPercentage.ToString(this.GlobalCulture) + " to 'Percentage'-register successful at METER" + MeterIndex + "; PATH2\n"); + reAuthentication = false; + } + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing " + FirstHitLevelPercentage.ToString(this.GlobalCulture) + " to 'Percentage'-register failed at METER" + MeterIndex + "; PATH2\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + + Trials++; + } + if (Ok == false) + { + this.ClearData(); + return false; + } + #endregion + #region Write to percentage register PATH2 + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + { + this.ClearData(); + return false; + } + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing " + FirstHitLevelPercentage.ToString(this.GlobalCulture) + " to 'Percentage'-register at METER" + MeterIndex + "; PATH3; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + + Ok = this.SetPercentageRegisterPath2(FirstHitLevelPercentage, out DebugMessage); + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing " + FirstHitLevelPercentage.ToString(this.GlobalCulture) + " to 'Percentage'-register successful at METER" + MeterIndex + "; PATH3\n"); + reAuthentication = false; + } + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing " + FirstHitLevelPercentage.ToString(this.GlobalCulture) + " to 'Percentage'-register failed at METER" + MeterIndex + "; PATH3\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + + Trials++; + } + if (Ok == false) + { + this.ClearData(); + return false; + } + #endregion + #region Wait for 1 second + for (Int32 i = 0; i < WaitBeforeLogging; i++) + { + if (token.IsCancellationRequested) + { + this.ClearData(); + return false; + } + GenesisZeroFlow.Display.StatusLabel("Wait for percentage sweep to end: " + FirstHitLevelPercentage.ToString(this.GlobalCulture) + "/" + FirstHitLevelPercMax.ToString(this.GlobalCulture) + "; " + (this.TofRecordingTime + WaitBeforeLogging - i).ToString(this.GlobalCulture) + "s"); + Misc.WaitNSeconds(1); + } + #endregion + #region Record TOF + GenesisZeroFlow._GenesisZeroFlow.SetLoggingIndicatorAmplitudeTest(MeterNumber, true); + GenesisZeroFlow.Display.DebugMessage("DATA CHANNEL:\t\t Start collecting data at METER" + MeterIndex + "\n"); + Int32[] LinecounterFollowing = new Int32[Constants.NumberOfPaths] { 0, 0, 0 }; + for (Int32 Seconds = 0; Seconds < this.TofRecordingTime; Seconds++) // eight seconds + { + if (token.IsCancellationRequested) + { + this.ClearData(); + return false; + } + + Ok = this.PollNumberOfLines(ref LinecounterFollowing, Seconds); + if (Ok) + { + GenesisZeroFlow.Display.StatusLabel("Wait for percentage sweep to end: " + FirstHitLevelPercentage.ToString(this.GlobalCulture) + "/" + FirstHitLevelPercMax.ToString(this.GlobalCulture) + "; " + (this.TofRecordingTime - Seconds).ToString(this.GlobalCulture) + "s"); + Misc.WaitNSeconds(1); + } + else + { + GenesisZeroFlow.Display.DebugMessage("DATA CHANNEL:\t\t Activity check failed at METER" + MeterIndex + "\n"); + GenesisZeroFlow._GenesisZeroFlow.SetLoggingIndicatorAmplitudeTest(MeterNumber, false); + this.ClearData(); + return false; + } + + } + GenesisZeroFlow.Display.StatusLabel("Wait for percentage sweep to end: " + FirstHitLevelPercentage.ToString(this.GlobalCulture) + "/" + FirstHitLevelPercMax.ToString(this.GlobalCulture) + "; 0s"); + GenesisZeroFlow._GenesisZeroFlow.SetLoggingIndicatorAmplitudeTest(MeterNumber, false); + Ok = true; + #endregion + #region Write raw data to files + String temp = GenesisZeroFlow._GenesisZeroFlow.GetDataToLog()[MeterNumber]; + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Write data to files at METER" + MeterIndex + "\n"); + Logging.WriteToFile(temp, GenesisZeroFlow._GenesisZeroFlow.GetLoggingPathAmplitudeTest()[MeterNumber]); + GenesisZeroFlow._GenesisZeroFlow.SetDataToLog(MeterNumber, String.Empty); + #endregion + #region Calculate mean value + for (UInt16 Path = 0; Path < Constants.NumberOfPaths; Path++) + { + GenesisZeroFlow.Display.DebugMessage("DATA CHANNEL:\t\t Calculate mean value at METER" + MeterIndex + "; PATH" + (Path + 1).ToString(this.GlobalCulture) + "\n"); + TofAvgMean[Path] = GenesisZeroFlow._GenesisZeroFlow.GetTotalTimeOfFlightAverage()[MeterNumber][Path].Mean(); + GenesisZeroFlow.Display.DebugMessage("DATA CHANNEL:\t\t Mean value at METER" + MeterIndex + "; PATH" + (Path + 1).ToString(this.GlobalCulture) + "; Value = " + Math.Round(TofAvgMean[Path], 4).ToString(this.GlobalCulture) + "\n"); + TofAvgMeanTotal[Path].Add(TofAvgMean[Path]); + GenesisZeroFlow._GenesisZeroFlow.SetNumbersToLog(MeterNumber, Path, GenesisZeroFlow._GenesisZeroFlow.GetNumbersToLog()[MeterNumber][Path] + Math.Round(TofAvgMean[Path], 4).ToString(this.GlobalCulture) + "\n"); + GenesisZeroFlow._GenesisZeroFlow.ClearTotalTimeOfFlightAverage(MeterNumber, Path); + } + #endregion + + } + #endregion + #region Write log data to file + String DateTime = System.DateTime.Now.ToString(Formats.LogFileDateTimeString, this.GlobalCulture); + if (GenesisZeroFlow._GenesisZeroFlow.GetCBMeanAmplitudeFiles()) + { + Logging.WriteToFile(GenesisZeroFlow._GenesisZeroFlow.GetNumbersToLog()[MeterNumber][Constants.PATH0], @"..\GenesisZeroFlowTest_MeanAmplitude_METER" + MeterIndex + "_PATH0_" + DateTime + ".csv"); + Logging.WriteToFile(GenesisZeroFlow._GenesisZeroFlow.GetNumbersToLog()[MeterNumber][Constants.PATH1], @"..\GenesisZeroFlowTest_MeanAmplitude_METER" + MeterIndex + "_PATH1_" + DateTime + ".csv"); + Logging.WriteToFile(GenesisZeroFlow._GenesisZeroFlow.GetNumbersToLog()[MeterNumber][Constants.PATH2], @"..\GenesisZeroFlowTest_MeanAmplitude_METER" + MeterIndex + "_PATH2_" + DateTime + ".csv"); + } + GenesisZeroFlow.Display.ShowResultStatus("NumbersToLog.Count() = " + GenesisZeroFlow._GenesisZeroFlow.GetNumbersToLog()[Constants.PATH0].Count().ToString(this.GlobalCulture), dummy); + GenesisZeroFlow.Display.ShowResultStatus("NumbersToLog.Count() = " + GenesisZeroFlow._GenesisZeroFlow.GetNumbersToLog()[Constants.PATH1].Count().ToString(this.GlobalCulture), dummy); + GenesisZeroFlow.Display.ShowResultStatus("NumbersToLog.Count() = " + GenesisZeroFlow._GenesisZeroFlow.GetNumbersToLog()[Constants.PATH2].Count().ToString(this.GlobalCulture), dummy); + GenesisZeroFlow.Display.ShowResultStatus("TotalTimeOfFlightAvg.Count() = " + GenesisZeroFlow._GenesisZeroFlow.GetTotalTimeOfFlightAverage()[MeterNumber][Constants.PATH0].Count().ToString(this.GlobalCulture), dummy); + GenesisZeroFlow.Display.ShowResultStatus("TotalTimeOfFlightAvg.Count() = " + GenesisZeroFlow._GenesisZeroFlow.GetTotalTimeOfFlightAverage()[MeterNumber][Constants.PATH1].Count().ToString(this.GlobalCulture), dummy); + GenesisZeroFlow.Display.ShowResultStatus("TotalTimeOfFlightAvg.Count() = " + GenesisZeroFlow._GenesisZeroFlow.GetTotalTimeOfFlightAverage()[MeterNumber][Constants.PATH2].Count().ToString(this.GlobalCulture), dummy); + this.ClearData(); + #endregion + #region Calculate optimal point + Double[] DistanceLeft = new Double[Constants.NumberOfPaths]; + Double[] DistanceRight = new Double[Constants.NumberOfPaths]; + + GenesisZeroFlow.Display.DebugMessage("DATA CHANNEL:\t\t Start calculating optimal points at METER" + MeterIndex + "\n"); + OptimalPoint[Constants.PATH0] = CalculateOptimalPoint(TofAvgMeanTotal[Constants.PATH0], out DistanceLeft[Constants.PATH0], out DistanceRight[Constants.PATH0]); + OptimalPoint[Constants.PATH1] = CalculateOptimalPoint(TofAvgMeanTotal[Constants.PATH1], out DistanceLeft[Constants.PATH1], out DistanceRight[Constants.PATH1]); + OptimalPoint[Constants.PATH2] = CalculateOptimalPoint(TofAvgMeanTotal[Constants.PATH2], out DistanceLeft[Constants.PATH2], out DistanceRight[Constants.PATH2]); + + if (OptimalPoint[Constants.PATH0] != this.ErrorValue) + GenesisZeroFlow.Display.DebugMessage("DATA CHANNEL:\t\t Optimal point calculation successful at METER" + MeterIndex + ", PATH1; Value = " + OptimalPoint[Constants.PATH0].ToString(this.GlobalCulture) + "\n"); + else + GenesisZeroFlow.Display.DebugMessage("DATA CHANNEL:\t\t Optimal point calculation failed at METER" + MeterIndex + ", PATH1\n"); + if (OptimalPoint[Constants.PATH1] != this.ErrorValue) + GenesisZeroFlow.Display.DebugMessage("DATA CHANNEL:\t\t Optimal point calculation successful at METER" + MeterIndex + ", PATH2; Value = " + OptimalPoint[Constants.PATH1].ToString(this.GlobalCulture) + "\n"); + else + GenesisZeroFlow.Display.DebugMessage("DATA CHANNEL:\t\t Optimal point calculation failed at METER" + MeterIndex + ", PATH2\n"); + if (OptimalPoint[Constants.PATH2] != this.ErrorValue) + GenesisZeroFlow.Display.DebugMessage("DATA CHANNEL:\t\t Optimal point calculation successful at METER" + MeterIndex + ", PATH3; Value = " + OptimalPoint[Constants.PATH2].ToString(this.GlobalCulture) + "\n"); + else + GenesisZeroFlow.Display.DebugMessage("DATA CHANNEL:\t\t Optimal point calculation failed at METER" + MeterIndex + ", PATH3\n"); + + if ((OptimalPoint[Constants.PATH0] == this.ErrorValue) || (OptimalPoint[Constants.PATH1] == this.ErrorValue) || (OptimalPoint[Constants.PATH2] == this.ErrorValue)) + return false; + + #endregion + #region Check value + GenesisZeroFlow.Display.DebugMessage("DATA CHANNEL:\t\t Start optimal point values check at METER" + MeterIndex + "\n"); + Boolean OptimalPointOkPath0 = this.CheckOptimalPoint(OptimalPoint[Constants.PATH0], out DebugMessage); + GenesisZeroFlow.Display.DebugMessage("DATA CHANNEL:\t\t " + DebugMessage + ", PATH1\n"); + Boolean OptimalPointOkPath1 = this.CheckOptimalPoint(OptimalPoint[Constants.PATH1], out DebugMessage); + GenesisZeroFlow.Display.DebugMessage("DATA CHANNEL:\t\t " + DebugMessage + ", PATH2\n"); + Boolean OptimalPointOkPath2 = this.CheckOptimalPoint(OptimalPoint[Constants.PATH2], out DebugMessage); + GenesisZeroFlow.Display.DebugMessage("DATA CHANNEL:\t\t " + DebugMessage + ", PATH3\n"); + if ((OptimalPointOkPath0 == false) || (OptimalPointOkPath1 == false) || (OptimalPointOkPath2 == false)) + return false; + #endregion + #region Check distance + Boolean CheckDistanceOkPath0 = this.CheckDistance(DistanceLeft[Constants.PATH0], DistanceRight[Constants.PATH0], out DebugMessage); + GenesisZeroFlow.Display.DebugMessage("DATA CHANNEL:\t\t " + DebugMessage + ", PATH1\n"); + Boolean CheckDistanceOkPath1 = this.CheckDistance(DistanceLeft[Constants.PATH1], DistanceRight[Constants.PATH1], out DebugMessage); + GenesisZeroFlow.Display.DebugMessage("DATA CHANNEL:\t\t " + DebugMessage + ", PATH2\n"); + Boolean CheckDistanceOkPath2 = this.CheckDistance(DistanceLeft[Constants.PATH2], DistanceRight[Constants.PATH2], out DebugMessage); + GenesisZeroFlow.Display.DebugMessage("DATA CHANNEL:\t\t " + DebugMessage + ", PATH3\n"); + if ((CheckDistanceOkPath0 == false) || (CheckDistanceOkPath1 == false) || (CheckDistanceOkPath2 == false)) + return false; + #endregion + #region Set first hit level percentage registers + GenesisZeroFlow.Display.DebugMessage("DATA CHANNEL:\t\t Start writing to percentage registers at METER" + MeterIndex + "\n"); + #region Write to percentage register PATH0 + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + String OptimalPointPath0 = OptimalPoint[Constants.PATH0].ToString(this.GlobalCulture); + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing " + OptimalPointPath0 + " to 'Percentage'-register at METER" + MeterIndex + "; PATH1; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + + Ok = this.SetPercentageRegisterPath0(OptimalPoint[Constants.PATH0], out DebugMessage); + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing " + OptimalPointPath0 + " to 'Percentage'-register successful at METER" + MeterIndex + "; PATH1\n"); + reAuthentication = false; + } + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing " + OptimalPointPath0 + " to 'Percentage'-register failed at METER" + MeterIndex + "; PATH1\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + Trials++; + } + if (Ok == false) + return false; + #endregion + #region Write to percentage register PATH1 + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + String OptimalPointPath1 = OptimalPoint[Constants.PATH1].ToString(this.GlobalCulture); + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing " + OptimalPointPath1 + " to 'Percentage'-register at METER" + MeterIndex + "; PATH2; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + + Ok = this.SetPercentageRegisterPath1(OptimalPoint[Constants.PATH1], out DebugMessage); + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing " + OptimalPointPath1 + " to 'Percentage'-register successful at METER" + MeterIndex + "; PATH2\n"); + reAuthentication = false; + } + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing " + OptimalPointPath1 + " to 'Percentage'-register failed at METER" + MeterIndex + "; PATH2\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + + Trials++; + } + if (Ok == false) + return false; + #endregion + #region Write to percentage register PATH2 + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + String OptimalPointPath2 = OptimalPoint[Constants.PATH2].ToString(this.GlobalCulture); + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing " + OptimalPointPath2 + " to 'Percentage'-register at METER" + MeterIndex + "; PATH3; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + + Ok = this.SetPercentageRegisterPath2(OptimalPoint[Constants.PATH2], out DebugMessage); + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing " + OptimalPointPath2 + " to 'Percentage'-register successful at METER" + MeterIndex + "; PATH3\n"); + reAuthentication = false; + } + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing " + OptimalPointPath2 + " to 'Percentage'-register failed at METER" + MeterIndex + "; PATH3\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + + Trials++; + } + if (Ok == false) + return false; + #endregion + #endregion + #region Set first hit update period to 10 + GenesisZeroFlow.Display.StatusLabel("Wait until register write has finished"); + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing " + FirstHitUpdatePeriodeValueEnd.ToString(this.GlobalCulture) + " to first hit update period register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + + Ok = this.SetFirstHitUpdatePeriod(FirstHitUpdatePeriodeValueEnd, out DebugMessage); + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing " + FirstHitUpdatePeriodeValueEnd.ToString(this.GlobalCulture) + " to first hit update period register successful at METER" + MeterIndex + "\n"); + reAuthentication = false; + } + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing " + FirstHitUpdatePeriodeValueEnd.ToString(this.GlobalCulture) + " to first hit update period register failed at METER" + MeterIndex + "\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + Trials++; + } + if (Ok == false) + { + //MessageBox.Show(cmdInterface.Subreason.ToString("X")); + return false; + } + // JumpOverFirstHitUpdatePeriodEnd: + #endregion + #region Set first hit shift to 4 + GenesisZeroFlow.Display.StatusLabel("Wait until register write has finished"); + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing " + FirstHitShiftValueEnd.ToString(this.GlobalCulture) + " to 'First hit shift'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + + Ok = this.SetFirstHitShift(FirstHitShiftValueEnd, out DebugMessage); + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing " + FirstHitShiftValueEnd.ToString(this.GlobalCulture) + " to 'First hit shift'-register successful at METER" + MeterIndex + "\n"); + reAuthentication = false; + } + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing " + FirstHitShiftValueEnd.ToString(this.GlobalCulture) + " to 'First hit shift'-register failed at METER" + MeterIndex + "\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + Trials++; + } + if (Ok == false) + return false; + #endregion + #endregion + return Ok; + } + public void KeepAuthentified(Boolean enable, Boolean sequenceOk, Boolean taskCompleted, ref Int32 counter, LogOn logOn) + { + logOn.KeepAuthentified(enable, sequenceOk, taskCompleted, ref counter); + } + private Boolean ReauthenticationProcedure(LogOn logOn, CancellationToken token, ref Boolean reAuthentication) + { + #region Definitions and initialization + Boolean Ok = false; + String MeterIndex = (this.MeterNumber + 1).ToString(this.GlobalCulture); + String DebugMessage = String.Empty; + Boolean SequenceFailed = false; + DialogResult askForActionsAuth = DialogResult.None; + #endregion + #region Optional reauthentification + if (reAuthentication) + { + + while ((askForActionsAuth == DialogResult.Retry) || (askForActionsAuth == DialogResult.None)) + { + + if (askForActionsAuth == DialogResult.None) + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Reauthentication started at METER" + MeterIndex + "\n"); + + Ok = logOn.PerformLogOn(token, out DebugMessage); + if (token.IsCancellationRequested) + { + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Reauthentication aborted at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + return true; + } + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Reauthentication successful at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line); + SequenceFailed = false; + reAuthentication = false; + askForActionsAuth = DialogResult.OK; + } + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t " + DebugMessage + "\n"); + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Reauthentication failed at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + SequenceFailed = true; + + askForActionsAuth = MessageBox.Show("Reauthentication failed at METER" + MeterIndex, "Retry?", MessageBoxButtons.RetryCancel, MessageBoxIcon.Question); + switch (askForActionsAuth) + { + case DialogResult.Retry: + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Reauthentication restarted at METER" + MeterIndex + "\n"); + break; + case DialogResult.Cancel: + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Reauthentication canceled at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line); + SequenceFailed = true; + return SequenceFailed; + //break; + default: break; + } + + } + } + } + #endregion + + return SequenceFailed; + } + private DialogResult AskHowToProceedSequence(String sequenceName) + { + DialogResult AskForActions; + String MeterIndex = (this.MeterNumber + 1).ToString(this.GlobalCulture); + + GenesisZeroFlow.Display.AbortButtonEnabled(false); + AskForActions = MessageBox.Show(sequenceName + " failed at METER" + MeterIndex, "Retry?", MessageBoxButtons.RetryCancel, MessageBoxIcon.Question); + switch (AskForActions) + { + case DialogResult.Retry: + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t " + sequenceName + " restarted at METER" + MeterIndex + "\n"); + break; + case DialogResult.Cancel: + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t " + sequenceName + " canceled at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line); + break; + default: break; + } + + return AskForActions; + } + private Int32 CalculateOptimalPoint(List TofAvg, out Double left, out Double right) + { + List ValuesLeft = new List(); + List ValuesRight = new List(); + + Int32 XatOptimalPoint = this.ErrorValue; + left = 0; + right = 0; + + + ValuesLeft = this.CalculateNearestDistanceLeft(TofAvg, out left); + ValuesRight = this.CalculateNearestDistanceRight(TofAvg, out right); + + for (Int32 i = 0; i < TofAvg.Count(); i++) + { + if ((i != 0) && (i != TofAvg.Count() - 1)) + { + if ((ValuesLeft.ElementAt(i - 1) > ValuesRight.ElementAt(i - 1)) && (ValuesRight.ElementAt(i + 1) > ValuesLeft.ElementAt(i + 1))) + { + XatOptimalPoint = i + this.FirstHitLevelPercMin; + } + } + } + + return XatOptimalPoint; + } + private List CalculateNearestDistanceLeft(List TofAvg, out Double left) + { + List Distance = new List(); + Double NearestDistance = 0; + Boolean Detected = false; + left = 0; + + for (Int32 Percentage = this.FirstHitLevelPercMin; Percentage <= (this.FirstHitLevelPercMax); Percentage++) + { + for (Int32 PercentageFollowing = Percentage; PercentageFollowing <= this.FirstHitLevelPercMax; PercentageFollowing++) + { + if ((TofAvg.ElementAt(PercentageFollowing - this.FirstHitLevelPercMin) - TofAvg.ElementAt(Percentage - FirstHitLevelPercMin)) > this.TriggerValue) + { + NearestDistance = PercentageFollowing - Percentage; + + Detected = true; + break; + } + } + + if (Detected) + { + Distance.Add(NearestDistance); + } + else + { + Distance.Add(this.ErrorValue); + } + } + + for (Int32 i = 0; i < Distance.Count(); i++) + { + if (Distance.ElementAt(i) >= left) + { + left = Distance.ElementAt(i); + } + } + + return Distance; + } + private List CalculateNearestDistanceRight(List TofAvg, out Double right) + { + List Distance = new List(); + Double NearestDistance = 0; + Boolean Detected = false; + right = 0; + + for (Int32 Proportion = this.FirstHitLevelPercMax; Proportion >= (this.FirstHitLevelPercMin); Proportion--) + { + for (Int32 ProportionFollowing = Proportion; ProportionFollowing >= this.FirstHitLevelPercMin; ProportionFollowing--) + { + if ((TofAvg.ElementAt(ProportionFollowing - FirstHitLevelPercMin)) - (TofAvg.ElementAt(Proportion - FirstHitLevelPercMin)) < -this.TriggerValue) + { + NearestDistance = Proportion - ProportionFollowing; + Detected = true; + break; + } + } + if (Detected) + { + Distance.Add(NearestDistance); + + } + else + { + Distance.Add(this.ErrorValue); + } + } + + + Distance.Reverse(); + + for (Int32 i = 0; i < Distance.Count(); i++) + { + if (Distance.ElementAt(i) >= right) + { + right = Distance.ElementAt(i); + } + } + return Distance; + } + private Boolean SetFirstHitUpdatePeriod(Int32 value, out String debugMessage) + { + #region Definitions and initialisations + Byte[] Payload = new Byte[4] { 0, 0, 0, 0 }; + Boolean Ok = false; + + Int32 ErrCode = GP30LowLevelErrors.NoError; + #endregion + #region Write register + Payload = BitConverter.GetBytes(value); + ErrCode = this.CommandInterface.WriteRegister(GP30Registers.FirstHitUpdatePeriod(), Payload, true); + #endregion + #region Wait for answer + if (ErrCode == GP30LowLevelErrors.NoError) + ErrCode = this.CommandInterface.RXProcessor(GP30RequestType.WriteRegister); + #endregion + #region Debug message + debugMessage = this.CommandInterface.LowLevelMessages(ErrCode, out Ok); + #endregion + + return Ok; + } + private Boolean SetFirstHitShift(Int32 value, out String debugMessage) + { + #region Definitions and initialisations + Byte[] Payload = new Byte[4] { 0, 0, 0, 0 }; + Boolean OK = false; + Int32 ErrCode = GP30LowLevelErrors.NoError; + #endregion + #region Write register + Payload = BitConverter.GetBytes(value); + ErrCode = this.CommandInterface.WriteRegister(GP30Registers.FirstHitShift(), Payload, true); + #endregion + #region Wait for answer + if (ErrCode == GP30LowLevelErrors.NoError) + ErrCode = this.CommandInterface.RXProcessor(GP30RequestType.WriteRegister); + #endregion + #region Debug message + debugMessage = this.CommandInterface.LowLevelMessages(ErrCode, out OK); + #endregion + + return OK; + } + private Boolean SetPercentageRegisterPath0(Int32 value, out String debugMessage) + { + #region Definitions and initialisations + Byte[] Payload = new Byte[4] { 0, 0, 0, 0 }; + Boolean Ok = false; + Int32 ErrCode = GP30LowLevelErrors.NoError; + #endregion + #region Write register PATH0 + Payload = BitConverter.GetBytes(value); + ErrCode = this.CommandInterface.WriteRegister(GP30Registers.FirstHitLevelPercentagePath0(), Payload, true); + #endregion + #region Wait for answer + if (ErrCode == GP30LowLevelErrors.NoError) + ErrCode = this.CommandInterface.RXProcessor(GP30RequestType.WriteRegister); + #endregion + #region Debug message + debugMessage = this.CommandInterface.LowLevelMessages(ErrCode, out Ok); + #endregion + + return Ok; + } + private Boolean SetPercentageRegisterPath1(Int32 value, out String debugMessage) + { + #region Definitions and initialisations + Byte[] Payload = new Byte[4] { 0, 0, 0, 0 }; + Boolean Ok = false; + Int32 ErrCode = GP30LowLevelErrors.NoError; + #endregion + #region Write register PATH1 + Payload = BitConverter.GetBytes(value); + ErrCode = this.CommandInterface.WriteRegister(GP30Registers.FirstHitLevelPercentagePath1(), Payload, true); + #endregion + #region Wait for answer + if (ErrCode == GP30LowLevelErrors.NoError) + ErrCode = this.CommandInterface.RXProcessor(GP30RequestType.WriteRegister); + #endregion + #region Debug message + debugMessage = this.CommandInterface.LowLevelMessages(ErrCode, out Ok); + #endregion + + return Ok; + } + private Boolean SetPercentageRegisterPath2(Int32 value, out String debugMessage) + { + #region Definitions and initialisations + Byte[] Payload = new Byte[4] { 0, 0, 0, 0 }; + Boolean Ok = false; + Int32 ErrCode = GP30LowLevelErrors.NoError; + #endregion + #region Write register PATH2 + Payload = BitConverter.GetBytes(value); + ErrCode = this.CommandInterface.WriteRegister(GP30Registers.FirstHitLevelPercentagePath2(), Payload, true); + #endregion + #region Wait for answer + if (ErrCode == GP30LowLevelErrors.NoError) + ErrCode = this.CommandInterface.RXProcessor(GP30RequestType.WriteRegister); + #endregion + #region Debug message + debugMessage = this.CommandInterface.LowLevelMessages(ErrCode, out Ok); + #endregion + + return Ok; + } + private Boolean CheckOptimalPoint(Int32 optimalPoint, out String debugMessage) + { + + Boolean Ok = true; + String MeterIndex = (this.MeterNumber + 1).ToString(this.GlobalCulture); + debugMessage = "Optimal point check successful at METER" + MeterIndex; + + if (optimalPoint == this.ErrorValue) + { + debugMessage = "Optimal point check failed at METER" + MeterIndex; + Ok = false; + return Ok; + } + + if (optimalPoint > this.OptimumMaxValue) + { + debugMessage = "Optimal point maximum check failed at METER" + MeterIndex; + Ok = false; + return Ok; + } + + if (optimalPoint < this.OptimumMinValue) + { + debugMessage = "Optimal point minimum check failed at METER" + MeterIndex; + Ok = false; + return Ok; + } + + return Ok; + } + private Boolean CheckDistance(Double left, Double right, out String debugMessage) + { + Boolean OK = true; + String MeterIndex = (this.MeterNumber + 1).ToString(this.GlobalCulture); + debugMessage = "Distance check successful at METER" + MeterIndex; + + if (left < this.OptimumMinDistance) + { + OK = false; + debugMessage = "Distance check failed at METER" + MeterIndex; + return OK; + } + + if (right < this.OptimumMinDistance) + { + OK = false; + debugMessage = "Distance check failed at METER" + MeterIndex; + return OK; + } + + + return OK; + } + private Boolean PollNumberOfLines(ref Int32[] lineCounterFollowing, Int32 seconds) + { + #region Definitions and initializations + Boolean Ok = true; + Boolean Error = false; + #endregion + #region Check activity + for (UInt16 Path = 0; Path < Constants.NumberOfPaths; Path++) + { + if (GenesisZeroFlow._GenesisZeroFlow.GetLineCounterAmplitudeTest()[this.MeterNumber][Path] != 0) + { + if (GenesisZeroFlow._GenesisZeroFlow.GetLineCounterAmplitudeTest()[this.MeterNumber][Path] == lineCounterFollowing[Path]) + return false; + else + lineCounterFollowing[Path] = GenesisZeroFlow._GenesisZeroFlow.GetLineCounterAmplitudeTest()[this.MeterNumber][Path]; + + } + if ((seconds > 0) && (GenesisZeroFlow._GenesisZeroFlow.GetLineCounterAmplitudeTest()[this.MeterNumber][Path] == 0)) + return false; + + } + #endregion + #region Result + Ok = !Error; + #endregion + + return Ok; + } + private void ClearData() + { + GenesisZeroFlow.Display.EraseAmplitudeData(this.MeterNumber, Constants.PATH0); + GenesisZeroFlow.Display.EraseAmplitudeData(this.MeterNumber, Constants.PATH1); + GenesisZeroFlow.Display.EraseAmplitudeData(MeterNumber, Constants.PATH2); + GenesisZeroFlow._GenesisZeroFlow.ClearTotalTimeOfFlightAverage(this.MeterNumber, Constants.PATH0); + GenesisZeroFlow._GenesisZeroFlow.ClearTotalTimeOfFlightAverage(this.MeterNumber, Constants.PATH1); + GenesisZeroFlow._GenesisZeroFlow.ClearTotalTimeOfFlightAverage(this.MeterNumber, Constants.PATH2); + } + + } + public class ZeroFlowOffsetTest + { + private CultureInfo GlobalCulture { get; set; } + private Double RangeLow { get; set; } + private Double RangeHigh { get; set; } + private UInt16 NumberOfCheckingTrials { get; set; } + private UInt16 MeterNumber { get; set; } + private Int32 OffsetValuePath0 { get; set; } + private Int32 OffsetValuePath1 { get; set; } + private Int32 OffsetValuePath2 { get; set; } + private Int32 OffsetLimit { get; set; } + private Int32 NumberOfLines { get; set; } + private CmdInterface CommandInterface { get; set; } + public void Initialize(CmdInterface commandInterface, UInt16 meterNumber, Int16 rangeLow, Int16 rangeHigh, Int32 offsetLimit, Int32 numberOfLines, UInt16 numberOfCheckingTrials) + { + this.MeterNumber = meterNumber; + this.NumberOfCheckingTrials = numberOfCheckingTrials; + this.OffsetValuePath0 = 0; + this.OffsetValuePath1 = 0; + this.OffsetValuePath2 = 0; + this.RangeHigh = rangeHigh; + this.RangeLow = rangeLow; + this.OffsetLimit = offsetLimit; + this.NumberOfLines = numberOfLines; + this.GlobalCulture = GenesisZeroFlow._GenesisZeroFlow.GetGlobalCulture(); + this.CommandInterface = commandInterface; + } + public void Meter(Boolean enable, ref Task task, ref Boolean taskStarted, ref Boolean sequenceFailed, LogOn logOn, ZeroFlowOffsetTest zeroFlowOffsetTest, ref Int32 nextDelayTime, Int32 settlingTime, CancellationToken token) + { + #region Definitions and initializations + Int32 DelayTime = 0; + String MeterIndex = (this.MeterNumber + 1).ToString(GlobalCulture); + const Int32 DeltaDelay = 5; + DialogResult AskForActions = DialogResult.None; + DialogResult AskForActionsFinalization = DialogResult.None; + Boolean ReAuthentication = false; + var _sequenceFailed = sequenceFailed; + var _logOn = logOn; + var _zeroFlowOffsetTest = zeroFlowOffsetTest; + Int32 temp = DelayTime; + Boolean Ok = false; + UInt16 MeterNumber = this.MeterNumber; + #endregion + #region Avoid CA1062 + if (task == null) + { + sequenceFailed = true; + taskStarted = false; + return; + } + + #endregion + #region Everything else + if ((enable) && (task.Status != TaskStatus.Running)) + { + #region Start delay + DelayTime = nextDelayTime; + nextDelayTime = nextDelayTime + DeltaDelay; + + taskStarted = true; + Misc.WaitNSeconds(temp); + #endregion + #region Testprocedure + DelayTime = nextDelayTime; + nextDelayTime = nextDelayTime + DeltaDelay; + taskStarted = true; + Misc.WaitNSeconds(temp); + + task = Task.Run(() => + { + while ((AskForActions == DialogResult.Retry) || (AskForActions == DialogResult.None)) + { + + #region Abort + if (token.IsCancellationRequested) + { + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t ZEROFLOW OFFSET TEST aborted at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + return true; // sequence failed + } + else + GenesisZeroFlow.Display.AbortButtonEnabled(true); + + #endregion + #region Start logging + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t ZEROFLOW OFFSET TEST started at METER" + MeterIndex + "\n"); + _zeroFlowOffsetTest.StartTest(); + GenesisZeroFlow._GenesisZeroFlow.SetLoggingIndicatorZeroFlowTest(true, this.MeterNumber); + #endregion + #region Wait for settling time (60s) + for (Int32 i = settlingTime; i >= 0; i--) + { + if (token.IsCancellationRequested) + { + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t ZEROFLOW OFFSET TEST aborted at METER" + MeterIndex + "\n"); + return true; // sequence failed + } + + GenesisZeroFlow.Display.StatusLabel("Wait for settling time: " + i.ToString(this.GlobalCulture)); + Misc.WaitNSeconds(1); + } + #endregion + #region Start collecting data for calculation + GenesisZeroFlow._GenesisZeroFlow.SetCalculationIndicatorZeroFlowTest(true, MeterNumber); + #endregion + #region Polling for number of data lines/ activity check + Boolean PollOk = true; + for (UInt16 Path = 0; Path < Constants.NumberOfPaths; Path++) + { + if (enable && PollOk && ((AskForActions == DialogResult.None) || (AskForActions == DialogResult.Retry))) + PollOk = _zeroFlowOffsetTest.PollNumberOfLines(Path, token); + } + #endregion + #region Stop logging ==> is done by the 'MainloopMeterX'-Functions + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Stop logging at METER" + MeterIndex + "\n"); + #endregion + #region Write raw data to files + String LogData = GenesisZeroFlow._GenesisZeroFlow.GetDataToLog()[MeterNumber]; + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Write data to files at METER" + MeterIndex + "\n"); + Logging.WriteToFile(LogData, GenesisZeroFlow._GenesisZeroFlow.GetLoggingPathZeroFlowTest()[MeterNumber]); + GenesisZeroFlow._GenesisZeroFlow.SetDataToLog(MeterNumber, String.Empty); + if (token.IsCancellationRequested) + { + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t ZEROFLOW OFFSET TEST aborted at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + return true; // sequence failed + } + #endregion + #region Summary + if (token.IsCancellationRequested) + { + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t ZEROFLOW OFFSET TEST aborted at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + return true; // sequence failed + } + + if (PollOk) + { + while ((AskForActionsFinalization == DialogResult.Retry) || (AskForActionsFinalization == DialogResult.None)) + { + #region Abort + if (token.IsCancellationRequested) + { + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t ZEROFLOW OFFSET TEST aborted at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + return true; // sequence failed + } + else + GenesisZeroFlow.Display.AbortButtonEnabled(true); + + #endregion + #region Optional re-authentication + _sequenceFailed = ReauthenticationProcedure(_logOn, token, ref ReAuthentication); + #endregion + #region Finalize test + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Finalize ZEROFLOW OFFSET TEST at METER" + MeterIndex + "\n"); + Ok = _zeroFlowOffsetTest.FinalizeTest(GenesisZeroFlow._GenesisZeroFlow.GetAmplitudeValuesPositive(MeterNumber), GenesisZeroFlow._GenesisZeroFlow.GetAmplitudeValuesNegative(MeterNumber), GenesisZeroFlow._GenesisZeroFlow.GetDeltaTimeOfFlightAverage(MeterNumber), GenesisZeroFlow._GenesisZeroFlow.GetBadDataCounter(MeterNumber), out ReAuthentication, token); + + if (Ok == true) + { + AskForActionsFinalization = DialogResult.OK; + _sequenceFailed = false;//? + } + else + { + if (!ReAuthentication) + AskForActionsFinalization = this.AskHowToProceedSequence("ZEROFLOW OFFSET TEST"); + + _sequenceFailed = true; //? + } + #endregion + } + } + else + Ok = false; + + + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t ZEROFLOW OFFSET TEST successful at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line); + _sequenceFailed = false; + AskForActions = DialogResult.OK; + ReAuthentication = false; + } + else + { + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t ZEROFLOW OFFSET TEST failed at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line); + _sequenceFailed = true; + + AskForActions = AskHowToProceedSequence("ZEROFLOW OFFSET TEST"); + } + + #endregion + + } + return _sequenceFailed; + }); + #endregion + } + #endregion + } + private Boolean StartTest() + { + #region Definitions and initializations + Boolean Ok = false; + String time = DateTime.Now.ToString(Formats.LogFileDateTimeString, this.GlobalCulture); + String MeterIndex = (this.MeterNumber + 1).ToString(this.GlobalCulture); + #endregion + #region Start logging + GenesisZeroFlow._GenesisZeroFlow.SetDataToLog(this.MeterNumber, String.Empty); + GenesisZeroFlow._GenesisZeroFlow.ClearAmplitudeValuesPositive(this.MeterNumber); + GenesisZeroFlow._GenesisZeroFlow.ClearAmplitudeValuesNegative(this.MeterNumber); + GenesisZeroFlow._GenesisZeroFlow.ClearDeltaTimeOfFlightAverage(this.MeterNumber); + GenesisZeroFlow._GenesisZeroFlow.ClearBadDataCounter(this.MeterNumber); + GenesisZeroFlow._GenesisZeroFlow.ClearLineCounterZeroFlow(this.MeterNumber); + GenesisZeroFlow._GenesisZeroFlow.SetLoggingPathZeroFlowTest(this.MeterNumber, DataLogging.DefaultPath + "GenesisZeroflowTest_RawData_METER" + MeterIndex + "_" + time + ".txt"); + GenesisZeroFlow.Display.DebugMessage("DATA CHANNEL:\t\t Start logging at METER" + MeterIndex + "\n"); + #endregion + + return Ok; + } + public void KeepAuthentified(Boolean enable, Boolean sequenceOk, Boolean taskCompleted, ref Int32 counter, LogOn logOn) + { + logOn.KeepAuthentified(enable, sequenceOk, taskCompleted, ref counter); + } + private Boolean ReauthenticationProcedure(LogOn logOn, CancellationToken token, ref Boolean reAuthentication) + { + #region Definitions and initialization + Boolean Ok = false; + String MeterIndex = (this.MeterNumber + 1).ToString(this.GlobalCulture); + String DebugMessage = String.Empty; + Boolean SequenceFailed = false; + DialogResult askForActionsAuth = DialogResult.None; + #endregion + #region Optional reauthentification + if (reAuthentication) + { + while ((askForActionsAuth == DialogResult.Retry) || (askForActionsAuth == DialogResult.None)) + { + + if (askForActionsAuth == DialogResult.None) + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Reauthentication started at METER" + MeterIndex + "\n"); + + Ok = logOn.PerformLogOn(token, out DebugMessage); + if (token.IsCancellationRequested) + { + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Reauthentication aborted at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + return true; + } + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Reauthentication successful at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line); + SequenceFailed = false; + reAuthentication = false; + askForActionsAuth = DialogResult.OK; + } + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t " + DebugMessage + "\n"); + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Reauthentication failed at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + SequenceFailed = true; + + askForActionsAuth = MessageBox.Show("Reauthentication failed at METER" + MeterIndex, "Retry?", MessageBoxButtons.RetryCancel, MessageBoxIcon.Question); + switch (askForActionsAuth) + { + case DialogResult.Retry: + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Reauthentication restarted at METER" + MeterIndex + "\n"); + break; + case DialogResult.Cancel: + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Reauthentication canceled at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line); + SequenceFailed = true; + return SequenceFailed; + //break; + default: break; + } + + } + } + } + #endregion + + return SequenceFailed; + + } + private DialogResult AskHowToProceedSequence(String sequenceName) + { + DialogResult AskForActions; + String MeterIndex = (this.MeterNumber + 1).ToString(this.GlobalCulture); + + GenesisZeroFlow.Display.AbortButtonEnabled(false); + AskForActions = MessageBox.Show(sequenceName + " failed at METER" + MeterIndex, "Retry?", MessageBoxButtons.RetryCancel, MessageBoxIcon.Question); + switch (AskForActions) + { + case DialogResult.Retry: + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t " + sequenceName + " restarted at METER" + MeterIndex + "\n"); + break; + case DialogResult.Cancel: + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t " + sequenceName + " canceled at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line); + break; + default: break; + } + + return AskForActions; + } + private Boolean PollNumberOfLines(Int32 path, CancellationToken token) + { + #region Definitions and initializations + Boolean Ok = true; + Boolean Error = false; + Int32 LineCounterFollowing = 0; + String MeterIndex = (this.MeterNumber + 1).ToString(this.GlobalCulture); + #endregion + #region Check activity + while (GenesisZeroFlow._GenesisZeroFlow.GetLineCounterZeroFlow(this.MeterNumber)[path] < this.NumberOfLines - 1) + { + if (token.IsCancellationRequested) + return false; + LineCounterFollowing = GenesisZeroFlow._GenesisZeroFlow.GetLineCounterZeroFlow(this.MeterNumber)[path]; + GenesisZeroFlow.Display.StatusLabel("Wait until data aquisition has finished: " + LineCounterFollowing.ToString(this.GlobalCulture) + "/" + this.NumberOfLines.ToString(this.GlobalCulture)); + Misc.WaitNSeconds(10); + if ((LineCounterFollowing == GenesisZeroFlow._GenesisZeroFlow.GetLineCounterZeroFlow(this.MeterNumber)[path])) + { + + Error = false; + GenesisZeroFlow.Display.DebugMessage("DATA CHANNEL:\t\t Data activity check failed at METER" + MeterIndex + "\n"); + MessageBox.Show("DATA CHANNEL:\t\t Data activity check failed at METER" + MeterIndex + "\n keep going"); + break; + } + + } + #endregion + #region Result + Ok = !Error; + #endregion + + return Ok; + } + private Boolean CheckForBadData(Int32[] badData) + { + #region Definitions and initializations + const Int32 BadDataLimit = ZeroOffsetTestConstants.BadDataLimit; + Boolean Ok = true; + #endregion + #region Result + for (UInt16 Path = 0; Path < Constants.NumberOfPaths; Path++) + { + if (badData[Path] >= BadDataLimit) + Ok = false; + } + #endregion + + return Ok; + } + private Boolean CheckOffset(Double[] deltaTimeOfFlightAvg) + { + + #region Definitions and initializations + Boolean Ok = true; + #endregion + #region Result + for (UInt16 Path = 0; Path < Constants.NumberOfPaths; Path++) + { + if (deltaTimeOfFlightAvg[Path] > this.OffsetLimit) + Ok = false; + if (deltaTimeOfFlightAvg[Path] < -this.OffsetLimit) + Ok = false; + + } + #endregion + + return Ok; + } + private Boolean CheckAmplitudes(Double[] AmplitudeValuesPos, Double[] AmplitudeValuesNeg) + { + #region Definitions and initializations + Boolean Ok = true; + Double AmplitudeLimitHigh = this.RangeHigh; + Double AmplitudeLimitLow = this.RangeLow; + #endregion + #region Result + for (UInt16 Path = 0; Path < Constants.NumberOfPaths; Path++) + { + if (AmplitudeValuesPos[Path] > AmplitudeLimitHigh) + Ok = false; + if (AmplitudeValuesNeg[Path] < AmplitudeLimitLow) + Ok = false; + + } + #endregion + + return Ok; + } + private Boolean FinalizeTest(List[] amplitudeValuesPositive, List[] amplitudeValuesNegative, List[] deltaTimeOfFlightAverage, Int32[] badData, out Boolean reAuthentication, CancellationToken token) + { + #region Definitions and initializations + Boolean Ok = false; + String debugMessage = String.Empty; + String meterIndex = (this.MeterNumber + 1).ToString(this.GlobalCulture); + UInt16 Trials = 0; + Double[] amplitudeValuesMeanPositive = new Double[Constants.NumberOfPaths]; + Double[] amplitudeValuesMeanNegative = new Double[Constants.NumberOfPaths]; + Double[] DeltaTimeOfFlightAverage = new Double[Constants.NumberOfPaths]; + Boolean[] dummy = new Boolean[Constants.NumberOfMeters]; + + for (UInt16 Path = 0; Path < Constants.NumberOfPaths; Path++) + { + amplitudeValuesMeanPositive[Path] = 0; + amplitudeValuesMeanNegative[Path] = 0; + DeltaTimeOfFlightAverage[Path] = 0; + } + reAuthentication = false; + #endregion + #region Avoid CA1062 + if ((amplitudeValuesPositive == null) || (amplitudeValuesNegative == null) || (badData == null) || (deltaTimeOfFlightAverage == null)) + return false; + #endregion + #region Calculating mean values + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Calculating mean values at METER" + meterIndex + "\n"); + GenesisZeroFlow.Display.ShowResultStatus("AmplitudeValuesMeanPos[PATH0] = " + amplitudeValuesPositive[Constants.PATH0].Count().ToString(this.GlobalCulture), dummy); + GenesisZeroFlow.Display.ShowResultStatus("AmplitudeValuesMeanPos[PATH1] = " + amplitudeValuesPositive[Constants.PATH1].Count().ToString(this.GlobalCulture), dummy); + GenesisZeroFlow.Display.ShowResultStatus("AmplitudeValuesMeanPos[PATH2] = " + amplitudeValuesPositive[Constants.PATH2].Count().ToString(this.GlobalCulture), dummy); + GenesisZeroFlow.Display.ShowResultStatus("AmplitudeValuesMeanNeg[PATH0] = " + amplitudeValuesNegative[Constants.PATH0].Count().ToString(this.GlobalCulture), dummy); + GenesisZeroFlow.Display.ShowResultStatus("AmplitudeValuesMeanNeg[PATH1] = " + amplitudeValuesNegative[Constants.PATH1].Count().ToString(this.GlobalCulture), dummy); + GenesisZeroFlow.Display.ShowResultStatus("AmplitudeValuesMeanneg[PATH2] = " + amplitudeValuesNegative[Constants.PATH2].Count().ToString(this.GlobalCulture), dummy); + GenesisZeroFlow.Display.ShowResultStatus("DeltaTimeOfFlightAvg[PATH0] = " + deltaTimeOfFlightAverage[Constants.PATH0].Count().ToString(this.GlobalCulture), dummy); + GenesisZeroFlow.Display.ShowResultStatus("DeltaTimeOfFlightAvg[PATH1] = " + deltaTimeOfFlightAverage[Constants.PATH1].Count().ToString(this.GlobalCulture), dummy); + GenesisZeroFlow.Display.ShowResultStatus("DeltaTimeOfFlightAvg[PATH2] = " + deltaTimeOfFlightAverage[Constants.PATH2].Count().ToString(this.GlobalCulture), dummy); + + for (UInt16 Path = 0; Path < Constants.NumberOfPaths; Path++) + { + amplitudeValuesMeanPositive[Path] = amplitudeValuesPositive[Path].Mean(); + amplitudeValuesMeanNegative[Path] = amplitudeValuesNegative[Path].Mean(); + DeltaTimeOfFlightAverage[Path] = deltaTimeOfFlightAverage[Path].Mean(); + } + #endregion + #region Display values + for (UInt16 Path = 0; Path < Constants.NumberOfPaths; Path++) + GenesisZeroFlow.Display.DebugMessage("DATA CHANNEL:\t\t Bad data at METER" + meterIndex + ", PATH" + (Path + 1).ToString(this.GlobalCulture) + ": " + badData[Path].ToString(this.GlobalCulture) + "\n"); + + for (UInt16 Path = 0; Path < Constants.NumberOfPaths; Path++) + GenesisZeroFlow.Display.DebugMessage("DATA CHANNEL:\t\t Average positive amplitude value at METER" + meterIndex + ", PATH" + (Path + 1).ToString(this.GlobalCulture) + ": " + Math.Round(amplitudeValuesMeanPositive[Path], 2).ToString(this.GlobalCulture) + "mV\n"); + + for (UInt16 Path = 0; Path < Constants.NumberOfPaths; Path++) + GenesisZeroFlow.Display.DebugMessage("DATA CHANNEL:\t\t Average negative amplitude value at METER" + meterIndex + ", PATH" + (Path + 1).ToString(this.GlobalCulture) + ": " + Math.Round(amplitudeValuesMeanNegative[Path], 2).ToString(this.GlobalCulture) + "mV\n"); + + for (UInt16 Path = 0; Path < Constants.NumberOfPaths; Path++) + GenesisZeroFlow.Display.DebugMessage("DATA CHANNEL:\t\t Average time of flight value at METER" + meterIndex + ", PATH" + (Path + 1).ToString(this.GlobalCulture) + ": " + Math.Round(DeltaTimeOfFlightAverage[Path], 2).ToString(this.GlobalCulture) + "ps\n"); + #endregion + #region Check for bad data + Boolean BadDataCheckOK = false; + BadDataCheckOK = CheckForBadData(badData); + if (BadDataCheckOK == true) + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Bad data check successful at METER" + meterIndex + "\n"); + else + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Bad data check failed at METER" + meterIndex + "\n"); + #endregion + #region Check amplitudes + Boolean AmplitudeCheckOK = false; + AmplitudeCheckOK = CheckAmplitudes(amplitudeValuesMeanPositive, amplitudeValuesMeanNegative); + if (AmplitudeCheckOK == true) + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Amplitude check successful at METER" + meterIndex + "\n"); + else + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Amplitude check failed at METER" + meterIndex + "\n"); + #endregion + #region Check offsets + Boolean OffsetCheckOK = false; + OffsetCheckOK = CheckOffset(DeltaTimeOfFlightAverage); + if (OffsetCheckOK == true) + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Delta time of flight check successful at METER" + meterIndex + "\n"); + else + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Delta time of flight check failed at METER" + meterIndex + "\n"); + #endregion + #region Abort if checks failed + if ((BadDataCheckOK == false) || (AmplitudeCheckOK == false) || (OffsetCheckOK == false)) + return false; + #endregion + #region Write new values to register + #region Write to register PATH0 + Trials = 0; + this.OffsetValuePath0 = (Int32)Math.Round(4 * ((DeltaTimeOfFlightAverage[Constants.PATH0] / ZeroOffsetTestConstants.DeltaTofAverageFactor))); + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Zero flow offset'-register PATH1 started at METER" + meterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfCheckingTrials.ToString(this.GlobalCulture) + "; Value = " + this.OffsetValuePath0.ToString(this.GlobalCulture) + "\n"); + while ((Trials < this.NumberOfCheckingTrials) && (Ok == false) && (reAuthentication == false)) + { + #region Check if abort + if (token.IsCancellationRequested) + return false; + #endregion + #region Write to register + Ok = SetZeroFlowOffsetRegister(this.OffsetValuePath0, Constants.PATH0, out debugMessage); + if (Ok) + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Zero flow offset'-register successful at METER" + meterIndex + "; PATH1\n"); + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Zero flow offset'-register failed at METER" + meterIndex + "; PATH1\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + + } + Trials++; + #endregion + } + if (Ok == false) + return false; + #endregion + #region Write to register PATH1 + Trials = 0; + Ok = false; + this.OffsetValuePath1 = (Int32)Math.Round(4 * ((DeltaTimeOfFlightAverage[Constants.PATH1] / ZeroOffsetTestConstants.DeltaTofAverageFactor))); + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Zero flow offset'-register PATH2 started at METER" + meterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfCheckingTrials.ToString(this.GlobalCulture) + "; Value = " + this.OffsetValuePath1.ToString(this.GlobalCulture) + "\n"); + while ((Trials < this.NumberOfCheckingTrials) && (Ok == false) && (reAuthentication == false)) + { + #region Check if abort + if (token.IsCancellationRequested) + return false; + #endregion + #region Write to register + Ok = SetZeroFlowOffsetRegister(this.OffsetValuePath1, Constants.PATH1, out debugMessage); + if (Ok) + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Zero flow offset'-register successful at METER" + meterIndex + "; PATH2\n"); + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Zero flow offset'-register failed at METER" + meterIndex + "; PATH2\n"); + if (CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + + } + Trials++; + #endregion + } + if (Ok == false) + return false; + + #endregion + #region Write to register PATH2 + Trials = 0; + Ok = false; + this.OffsetValuePath2 = (Int32)Math.Round(4 * ((DeltaTimeOfFlightAverage[Constants.PATH2] / ZeroOffsetTestConstants.DeltaTofAverageFactor))); + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Zeroflow offset'-register PATH3 started at METER" + meterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfCheckingTrials.ToString(this.GlobalCulture) + "; Value = " + this.OffsetValuePath2.ToString(this.GlobalCulture) + "\n"); + while ((Trials < this.NumberOfCheckingTrials) && (Ok == false) && (reAuthentication == false)) + { + #region Check if abort + if (token.IsCancellationRequested) + return false; + #endregion + #region Write to register + Ok = SetZeroFlowOffsetRegister(this.OffsetValuePath2, Constants.PATH2, out debugMessage); + if (Ok) + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Zeroflow offset'-register successful at METER" + meterIndex + "; PATH3\n"); + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Zeroflow offset'-register failed at METER" + meterIndex + "; PATH3\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + + } + Trials++; + #endregion + } + #endregion + #endregion + + return Ok; + } + private Boolean SetZeroFlowOffsetRegister(Int32 value, Int32 path, out String debugMessage) + { + #region Definitions and initialisations + Byte[] Payload = new Byte[4] { 0, 0, 0, 0 }; // tbd + Boolean Ok = false; + Int32 ErrCode = GP30LowLevelErrors.NoError; + #endregion + #region Peak detection register + #region Write register + Payload = BitConverter.GetBytes(value); + switch (path) + { + case Constants.PATH0: + ErrCode = this.CommandInterface.WriteRegister(GP30Registers.ZeroOffset1(), Payload, true); + break; + case Constants.PATH1: + ErrCode = this.CommandInterface.WriteRegister(GP30Registers.ZeroOffset2(), Payload, true); + break; + case Constants.PATH2: + ErrCode = this.CommandInterface.WriteRegister(GP30Registers.ZeroOffset3(), Payload, true); + break; + } + #endregion + #region Wait for answer + if (ErrCode == GP30LowLevelErrors.NoError) + ErrCode = this.CommandInterface.RXProcessor(GP30RequestType.WriteRegister); + #endregion + #region Debug message + debugMessage = this.CommandInterface.LowLevelMessages(ErrCode, out Ok); + #endregion + #endregion + + return Ok; + } + } + public class TempCalibration + { + private CultureInfo GlobalCulture { get; set; } + private UInt16 NumberOfTrials { get; set; } + private UInt16 MeterNumber { get; set; } + private Double RefTemperature { get; set; } + private CmdInterface CommandInterface { get; set; } + public void Initialize(CmdInterface commandInterface, UInt16 meterNumber, UInt16 numberOfTrials, Double refTemperature) + { + this.MeterNumber = meterNumber; + this.NumberOfTrials = numberOfTrials; + this.RefTemperature = refTemperature; + this.GlobalCulture = GenesisZeroFlow._GenesisZeroFlow.GetGlobalCulture(); + this.CommandInterface = commandInterface; + } + public void SetTemperature(Double temperature) + { + this.RefTemperature = temperature; + } + public void Meter(Boolean enable, ref Task task, ref Boolean taskStarted, ref Boolean sequenceFailed, LogOn logOn, TempCalibration tempCal, ref Int32 nextDelayTime, CancellationToken token) + { + #region Definitions and initializations + Int32 DelayTime = 0; + String MeterIndex = (this.MeterNumber + 1).ToString(this.GlobalCulture); + const Int32 DeltaDelay = 30; + DialogResult AskForActions = DialogResult.None; + Boolean ReAuthentication = false; + var _sequenceFailed = sequenceFailed; + var _logOn = logOn; + var _tempCal = tempCal; + Int32 temp = DelayTime; + Boolean Ok = false; + #endregion + #region Avoid CA1062 + if (task == null) + return; + #endregion + #region Everything else + if ((enable) && (task.Status != TaskStatus.Running) && (!task.IsCompleted)) + { + DelayTime = nextDelayTime; + nextDelayTime = nextDelayTime + DeltaDelay; + + taskStarted = true; + Misc.WaitNSeconds(temp); + + task = Task.Run(() => + { + while ((AskForActions == DialogResult.Retry) || (AskForActions == DialogResult.None) && (!token.IsCancellationRequested)) + { + #region Abort + if (!token.IsCancellationRequested) + GenesisZeroFlow.Display.AbortButtonEnabled(true); + #endregion + #region Optional reauthentication + _sequenceFailed = ReauthenticationProcedure(_logOn, token, ref ReAuthentication); + #endregion + #region Testprocedure + if (AskForActions == DialogResult.None) + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t TEMPERATURE CALIBRATION started at METER" + MeterIndex + "\n"); + + Ok = _tempCal.PerformTest(_tempCal, out ReAuthentication, token); + + if (token.IsCancellationRequested) + { + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t TEMPERATURE CALIBRATION aborted at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + return true; // sequence failed + } + + if (Ok == true) + { + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t TEMPERATURE CALIBRATION successful at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line); + _sequenceFailed = false; + AskForActions = DialogResult.OK; + } + else + { + if (ReAuthentication == false) + { + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t TEMPERATURE CALIBRATION failed at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + AskForActions = this.AskHowToProceedSequence("TEMPERATURE CALIBRATION"); + } + _sequenceFailed = true; + + } + #endregion + + } + return _sequenceFailed; + + }, token); + + } + /* + else + { + DelayTime = nextDelayTime; + nextDelayTime = nextDelayTime + DeltaDelay; + + taskStarted = true; + Misc.WaitNSeconds(temp); + + task = Task.Run(() => + { + + }, token); + }*/ + #endregion + } + private Boolean PerformTest(TempCalibration tempCal, out Boolean reAuthentication, CancellationToken token) + { + ClearData(); + + #region Definitions and initializations + UInt16 Trials = 0; + Boolean Ok = false; + String DebugMessage = String.Empty; + String MeterIndex = (this.MeterNumber + 1).ToString(this.GlobalCulture); + reAuthentication = false; + #endregion + #region Avoid warning CA1062 + if (tempCal == null) + return Ok; + Int32 TemperatureToRegister = (Int32)(tempCal.RefTemperature * 4096); + #endregion + #region Set temperature calibration register + GenesisZeroFlow.Display.StatusLabel("Wait until register write has finished"); + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing 0x" + TemperatureToRegister.ToString("X", this.GlobalCulture) + " to Temperature calibration'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + Ok = this.SetTofTempCalibrate(TemperatureToRegister, out DebugMessage); + + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing 0x" + TemperatureToRegister.ToString("X", this.GlobalCulture) + " to 'Temperature calibration'-register successful at METER" + MeterIndex + "\n"); + reAuthentication = false; + } + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing 0x" + TemperatureToRegister.ToString("X", this.GlobalCulture) + " to 'Temperature calibration'-register failed at METER" + MeterIndex + "\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + Trials++; + } + if (!Ok) + return false; + #endregion + #region Wait for some seconds + const UInt16 WaitingTime = 5; + for (UInt16 i = 0; i < WaitingTime; i++) + { + GenesisZeroFlow.Display.StatusLabel("Wait " + (WaitingTime - i).ToString(this.GlobalCulture) + " seconds"); + if (token.IsCancellationRequested) + return false; + Misc.WaitNSeconds(1); + } + #endregion + #region Check temperature + Ok = CheckTemperature(tempCal.RefTemperature, out DebugMessage); + if (Ok == true) + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Temperature check OK at METER" + MeterIndex + "\n"); + else + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Temperature check failed at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Temperatures at METER" + MeterIndex + ": " + DebugMessage); + #endregion + #region Get 'TOF offset1' register + GenesisZeroFlow.Display.StatusLabel("Wait until register read has finished"); + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading 'TOF offset1'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + Ok = this.GetTofOffset1(out DebugMessage); + if (Ok == true) + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading 'TOF offset1'-register successful at METER" + MeterIndex + "\n"); + reAuthentication = false; + } + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading 'TOF offset1'-register failed at METER" + MeterIndex + "\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + Trials++; + } + if (Ok == false) + return false; + #endregion + #region Get 'TOF offset2' register + GenesisZeroFlow.Display.StatusLabel("Wait until register read has finished"); + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading 'TOF offset2'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + Ok = this.GetTofOffset2(out DebugMessage); + + if (Ok == true) + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading 'TOF offset2'-register successful at METER" + MeterIndex + "\n"); + reAuthentication = false; + } + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading 'TOF offset2'-register failed at METER" + MeterIndex + "\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + Trials++; + } + if (Ok == false) + return false; + #endregion + #region Get 'TOF offset3' register + GenesisZeroFlow.Display.StatusLabel("Wait until register read has finished"); + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading 'TOF offset3'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + Ok = this.GetTofOffset3(out DebugMessage); + + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading 'TOF offset3'-register successful at METER" + MeterIndex + "\n"); + reAuthentication = false; + } + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading 'TOF offset3'-register failed at METER" + MeterIndex + "\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + Trials++; + } + if (!Ok) + return false; + #endregion + #region Write logdata to file + /* + System.DateTime Timestamp= new System.DateTime(); + Timestamp = System.DateTime.Now; + + if (GenesisZeroFlow._GenesisZeroFlow.cB_TempCalFiles.Checked) + { + String LoggingText = + "GENESISFLOW_ZeroOffset\t0x"+ + + "GENESISFLOW_ToFTempOffset\t0x" + + GenesisZeroFlow._GenesisZeroFlow.ToFTempOffset[MeterNumber][Constants.PATH0].ToString("X4") + "\t0x" + + GenesisZeroFlow._GenesisZeroFlow.ToFTempOffset[MeterNumber][Constants.PATH1].ToString("X4") + "\t0x" + + GenesisZeroFlow._GenesisZeroFlow.ToFTempOffset[MeterNumber][Constants.PATH2].ToString("X4") + "\n" + + "GENESISFLOW_CalFactor\t0x"; + + + Logging.WriteToFile(LoggingText, @"..\GenesisZeroFlowTest_ToFTempOffset_METER" + MeterIndex + ".txt"); + + } + */ + ClearData(); + #endregion + + + return Ok; + } + private DialogResult AskHowToProceedSequence(String sequenceName) + { + DialogResult AskForActions; + String MeterIndex = (this.MeterNumber + 1).ToString(this.GlobalCulture); + + GenesisZeroFlow.Display.AbortButtonEnabled(false); + AskForActions = MessageBox.Show(sequenceName + " failed at METER" + MeterIndex, "Retry?", MessageBoxButtons.RetryCancel, MessageBoxIcon.Question); + switch (AskForActions) + { + case DialogResult.Retry: + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t " + sequenceName + " restarted at METER" + MeterIndex + "\n"); + break; + case DialogResult.Cancel: + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t " + sequenceName + " canceled at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line); + break; + default: break; + } + + return AskForActions; + } + public void KeepAuthentified(Boolean enable, Boolean sequenceOk, Boolean taskCompleted, ref Int32 counter, LogOn logOn) + { + logOn.KeepAuthentified(enable, sequenceOk, taskCompleted, ref counter); + } + private Boolean ReauthenticationProcedure(LogOn logOn, CancellationToken token, ref Boolean reAuthentication) + { + #region Definitions and initialization + Boolean Ok = false; + String MeterIndex = (this.MeterNumber + 1).ToString(this.GlobalCulture); + String DebugMessage = String.Empty; + Boolean SequenceFailed = false; + DialogResult askForActionsAuth = DialogResult.None; + #endregion + #region Optional reauthentification + if (reAuthentication) + { + + while ((askForActionsAuth == DialogResult.Retry) || (askForActionsAuth == DialogResult.None)) + { + + + if (askForActionsAuth == DialogResult.None) + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Reauthentication started at METER" + MeterIndex + "\n"); + + Ok = logOn.PerformLogOn(token, out DebugMessage); + if (token.IsCancellationRequested) + { + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Reauthentication aborted at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + return true; + } + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Reauthentication successful at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line); + SequenceFailed = false; + reAuthentication = false; + askForActionsAuth = DialogResult.OK; + } + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t " + DebugMessage + "\n"); + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Reauthentication failed at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + SequenceFailed = true; + + askForActionsAuth = MessageBox.Show("Reauthentication failed at METER" + MeterIndex, "Retry?", MessageBoxButtons.RetryCancel, MessageBoxIcon.Question); + switch (askForActionsAuth) + { + case DialogResult.Retry: + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Reauthentication restarted at METER" + MeterIndex + "\n"); + break; + case DialogResult.Cancel: + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Reauthentication canceled at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line); + SequenceFailed = true; + return SequenceFailed; + //break; + default: break; + } + + } + } + } + #endregion + + return SequenceFailed; + + } + private Boolean SetTofTempCalibrate(Int32 value, out String debugMessage) + { + #region Definitions and initialisations + Byte[] Payload = new Byte[4] { 0, 0, 0, 0 }; + Boolean Ok = false; + Int32 ErrCode = GP30LowLevelErrors.NoError; + #endregion + #region Write register PATH0 + Payload = BitConverter.GetBytes(value); + ErrCode = this.CommandInterface.WriteRegister(GP30Registers.ToFTempCalibrate(), Payload, true); + #endregion + #region Wait for answer + if (ErrCode == GP30LowLevelErrors.NoError) + ErrCode = this.CommandInterface.RXProcessor(GP30RequestType.WriteRegister); + #endregion + #region Debug message + debugMessage = this.CommandInterface.LowLevelMessages(ErrCode, out Ok); + #endregion + + return Ok; + } + private Boolean GetTofOffset1(out String debugMessage) + { + #region Definitions and initialisations + Boolean Ok = false; + Int32 ErrCode = GP30LowLevelErrors.NoError; + #endregion + #region Read register + ErrCode = this.CommandInterface.ReadRegister(GP30Registers.ToFTempOffset1()); + #endregion + #region Wait for answer + if (ErrCode == GP30LowLevelErrors.NoError) + ErrCode = this.CommandInterface.RXProcessor(GP30RequestType.ReadRegister); + #endregion + #region Debug message + debugMessage = this.CommandInterface.LowLevelMessages(ErrCode, out Ok); + #endregion + + return Ok; + } + private Boolean GetTofOffset2(out String debugMessage) + { + #region Definitions and initialisations + Boolean Ok = false; + Int32 ErrCode = GP30LowLevelErrors.NoError; + #endregion + #region Read register + ErrCode = this.CommandInterface.ReadRegister(GP30Registers.ToFTempOffset2()); + #endregion + #region Wait for answer + if (ErrCode == GP30LowLevelErrors.NoError) + ErrCode = this.CommandInterface.RXProcessor(GP30RequestType.ReadRegister); + #endregion + #region Debug message + debugMessage = this.CommandInterface.LowLevelMessages(ErrCode, out Ok); + #endregion + + return Ok; + } + private Boolean GetTofOffset3(out String debugMessage) + { + #region Definitions and initialisations + Boolean Ok = false; + Int32 ErrCode = GP30LowLevelErrors.NoError; + #endregion + #region Read register + ErrCode = this.CommandInterface.ReadRegister(GP30Registers.ToFTempOffset3()); + #endregion + #region Wait for answer + if (ErrCode == GP30LowLevelErrors.NoError) + ErrCode = this.CommandInterface.RXProcessor(GP30RequestType.ReadRegister); + #endregion + #region Debug message + debugMessage = this.CommandInterface.LowLevelMessages(ErrCode, out Ok); + #endregion + + return Ok; + } + private Boolean CheckTemperature(Double refTemperature, out String debugMessage) + { + #region Definitions and initializations + const Double AllowedDeviation = 0.5; + Double[] MeasTemperature = new Double[Constants.NumberOfPaths]; + debugMessage = String.Empty; + String Meterindex = (MeterNumber + 1).ToString(this.GlobalCulture); + Boolean TemperatureOk = true; + #endregion + + MeasTemperature[Constants.PATH0] = ((Double)GenesisZeroFlow._GenesisZeroFlow.GetDecodedAllMeters()[Constants.PATH0][MeterNumber].Temperature / (Math.Pow(2, GenesisZeroFlow._GenesisZeroFlow.GetDecodedAllMeters()[Constants.PATH0][MeterNumber].TemperatureScale))); + MeasTemperature[Constants.PATH1] = ((Double)GenesisZeroFlow._GenesisZeroFlow.GetDecodedAllMeters()[Constants.PATH1][MeterNumber].Temperature / (Math.Pow(2, GenesisZeroFlow._GenesisZeroFlow.GetDecodedAllMeters()[Constants.PATH1][MeterNumber].TemperatureScale))); + MeasTemperature[Constants.PATH2] = ((Double)GenesisZeroFlow._GenesisZeroFlow.GetDecodedAllMeters()[Constants.PATH2][MeterNumber].Temperature / (Math.Pow(2, GenesisZeroFlow._GenesisZeroFlow.GetDecodedAllMeters()[Constants.PATH2][MeterNumber].TemperatureScale))); + if (Math.Abs(refTemperature - MeasTemperature[Constants.PATH0]) > AllowedDeviation) + TemperatureOk = false; + if (Math.Abs(refTemperature - MeasTemperature[Constants.PATH1]) > AllowedDeviation) + TemperatureOk = false; + if (Math.Abs(refTemperature - MeasTemperature[Constants.PATH2]) > AllowedDeviation) + TemperatureOk = false; + debugMessage = "ref. temperature = " + refTemperature.ToString(this.GlobalCulture) + "°C ; meas. temperature PATH" + Meterindex + " = " + Math.Round(MeasTemperature[Constants.PATH0], 2).ToString(this.GlobalCulture) + "°C; PATH2 = " + Math.Round(MeasTemperature[Constants.PATH1], 2).ToString(this.GlobalCulture) + "°C; PATH3 = " + Math.Round(MeasTemperature[Constants.PATH2], 2).ToString(this.GlobalCulture) + "°C\n"; + + + return TemperatureOk; + } + private void ClearData() + { + GenesisZeroFlow.Display.EraseAmplitudeData(this.MeterNumber, Constants.PATH0); + GenesisZeroFlow.Display.EraseAmplitudeData(this.MeterNumber, Constants.PATH1); + GenesisZeroFlow.Display.EraseAmplitudeData(this.MeterNumber, Constants.PATH2); + GenesisZeroFlow._GenesisZeroFlow.ClearTotalTimeOfFlightAverage(this.MeterNumber, Constants.PATH0); + GenesisZeroFlow._GenesisZeroFlow.ClearTotalTimeOfFlightAverage(this.MeterNumber, Constants.PATH1); + GenesisZeroFlow._GenesisZeroFlow.ClearTotalTimeOfFlightAverage(this.MeterNumber, Constants.PATH2); + GenesisZeroFlow._GenesisZeroFlow.SetToFTempOffset(this.MeterNumber, Constants.PATH0, 0); + GenesisZeroFlow._GenesisZeroFlow.SetToFTempOffset(this.MeterNumber, Constants.PATH1, 0); + GenesisZeroFlow._GenesisZeroFlow.SetToFTempOffset(this.MeterNumber, Constants.PATH2, 0); + } + } + + public class Completion + { + + private CultureInfo GlobalCulture { get; set; } + private UInt16 MeterNumber { get; set; } + private UInt16 NumberOfTrials { get; set; } + private Int16 LedMode { get; set; } + private Int16 StoreCalibration { get; set; } + private SerialPort SerialPort { get; set; } + private CmdInterface CommandInterface { get; set; } + public void Initialize(CmdInterface commandInterface, UInt16 meterNumber, UInt16 numberOfTrials, Int16 ledMode, Int16 storeCalibration) + { + this.MeterNumber = meterNumber; + this.NumberOfTrials = numberOfTrials; + this.LedMode = ledMode; + this.StoreCalibration = storeCalibration; + this.GlobalCulture = GenesisZeroFlow._GenesisZeroFlow.GetGlobalCulture(); + this.CommandInterface = commandInterface; + } + private Boolean PerformCompletion(CancellationToken token, out Boolean reAuthentication) + { + #region Definitions and initializations + List[] DeltaTimeOfFlight = new List[Constants.NumberOfPaths]; + for (Int32 i = 0; i < Constants.NumberOfPaths; i++) + DeltaTimeOfFlight[i] = new List(); + + Int32 Trials = 0; + Boolean Ok = false; + String DebugMessage = String.Empty; + String MeterIndex = (this.MeterNumber + 1).ToString(this.GlobalCulture); + reAuthentication = false; + #endregion + #region Completion sequence + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Start COMPLETION at METER" + MeterIndex + "\n"); + #region Write samplerate register + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Samplerate'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + + Ok = this.SetSampleRateRegister(0, out DebugMessage); + if (Ok) + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Samplerate'-register successful at METER" + MeterIndex + "\n"); + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Samplerate'-register failed at METER" + MeterIndex + "\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + Trials++; + } + if (Ok == false) + return Ok; + #endregion + #region Write led mode register + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'LED mode'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials + "\n"); + + Ok = this.SetLedMode(this.LedMode, out DebugMessage); + if (Ok) + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'LED mode'-register successful at METER" + MeterIndex + "\n"); + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'LED mode'-register failed at METER" + MeterIndex + "\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + + Trials++; + } + if (Ok == false) + return Ok; + #endregion + #region Write store completion register + Misc.WaitNSeconds(1); + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Store calibration'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials + "\n"); + + Ok = this.SetStoreCalibration(out DebugMessage); + if (Ok) + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Store calibration'-register successful at METER" + MeterIndex + "\n"); + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Writing to 'Store calibration'-register failed at METER" + MeterIndex + "\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + + Trials++; + } + #endregion + #endregion + #region Get registers + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Read registers at METER" + MeterIndex + "\n"); + #region Read zero offset register PATH0 + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading 'ZeroFlowOffset1'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials + "\n"); + + Ok = this.GetRegister(GP30Registers.ZeroOffset1(), out DebugMessage); + if (Ok) + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'ZeroFlowOffset1'-register successful at METER" + MeterIndex + "\n"); + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'ZeroFlowOffset1'-register failed at METER" + MeterIndex + "\n"); + if (CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + + } + + Trials++; + } + if (Ok == false) + return Ok; + #endregion + #region Read zero offset register PATH1 + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading 'ZeroFlowOffset2'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials + "\n"); + + Ok = this.GetRegister(GP30Registers.ZeroOffset2(), out DebugMessage); + if (Ok) + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'ZeroFlowOffset2'-register successful at METER" + MeterIndex + "\n"); + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'ZeroFlowOffset2'-register failed at METER" + MeterIndex + "\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + + Trials++; + } + if (Ok == false) + return Ok; + #endregion + #region Read zero offset register PATH2 + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading 'ZeroFlowOffset3'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + + Ok = this.GetRegister(GP30Registers.ZeroOffset3(), out DebugMessage); + if (Ok) + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'ZeroFlowOffset3'-register successful at METER" + MeterIndex + "\n"); + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'ZeroFlowOffset3'-register failed at METER" + MeterIndex + "\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + + } + + Trials++; + } + if (Ok == false) + return Ok; + #endregion + #region Read first hit percentage register PATH0 + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading 'FirstHitPercentage1'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + + Ok = this.GetRegister(GP30Registers.FirstHitLevelPercentagePath0(), out DebugMessage); + if (Ok) + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'FirstHitPercentage1'-register successful at METER" + MeterIndex + "\n"); + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'FirstHitPercentage1'-register failed at METER" + MeterIndex + "\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + + Trials++; + } + if (Ok == false) + return Ok; + #endregion + #region Read first hit percentage register PATH1 + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading 'FirstHitPercentage2'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + + Ok = this.GetRegister(GP30Registers.FirstHitLevelPercentagePath1(), out DebugMessage); + if (Ok) + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'FirstHitPercentage2'-register successful at METER" + MeterIndex + "\n"); + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'FirstHitPercentage2'-register failed at METER" + MeterIndex + "\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + + Trials++; + } + if (Ok == false) + return Ok; + #endregion + #region Read first hit percentage register PATH2 + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading 'FirstHitPercentage3'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + + Ok = this.GetRegister(GP30Registers.FirstHitLevelPercentagePath2(), out DebugMessage); + if (Ok) + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'FirstHitPercentage3'-register successful at METER" + MeterIndex + "\n"); + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'FirstHitPercentage3'-register failed at METER" + MeterIndex + "\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + + } + + Trials++; + } + if (Ok == false) + return Ok; + #endregion + #region Read tof temp offset register PATH0 + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading 'ToFTempOffset1'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + + Ok = this.GetRegister(GP30Registers.ToFTempOffset1(), out DebugMessage); + if (Ok) + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'ToFTempOffset1'-register successful at METER" + MeterIndex + "\n"); + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'ToFTempOffset1'-register failed at METER" + MeterIndex + "\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + Trials++; + } + if (Ok == false) + return Ok; + #endregion + #region Read tof temp offset register PATH1 + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading 'ToFTempOffset2'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + + Ok = this.GetRegister(GP30Registers.ToFTempOffset2(), out DebugMessage); + if (Ok) + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'ToFTempOffset2'-register successful at METER" + MeterIndex + "\n"); + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'ToFTempOffset2'-register failed at METER" + MeterIndex + "\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + + Trials++; + } + if (Ok == false) + return Ok; + #endregion + #region Read tof temp offset register PATH2 + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading 'ToFTempOffset3'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + + Ok = this.GetRegister(GP30Registers.ToFTempOffset3(), out DebugMessage); + if (Ok) + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'ToFTempOffset3'-register successful at METER" + MeterIndex + "\n"); + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'ToFTempOffset3'-register failed at METER" + MeterIndex + "\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + Trials++; + } + + if (Ok == false) + return Ok; + #endregion + #region Read calfactor register PATH0 + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading 'Calfactor1'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + + Ok = this.GetRegister(GP30Registers.CalFactor1(), out DebugMessage); + if (Ok) + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'Calfactor1'-register successful at METER" + MeterIndex + "\n"); + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'Calfactor1'-register failed at METER" + MeterIndex + "\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + Trials++; + } + if (Ok == false) + return Ok; + #endregion + #region Read calfactor register PATH1 + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading 'Calfactor2'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + + Ok = this.GetRegister(GP30Registers.CalFactor2(), out DebugMessage); + if (Ok) + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'Calfactor2'-register successful at METER" + MeterIndex + "\n"); + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'Calfactor2'-register failed at METER" + MeterIndex + "\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + Trials++; + } + if (Ok == false) + return Ok; + #endregion + #region Read calfactor register PATH2 + Trials = 0; + Ok = false; + while ((Trials < this.NumberOfTrials) && (Ok == false) && (reAuthentication == false)) + { + if (token.IsCancellationRequested) + return false; + + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading 'Calfactor3'-register at METER" + MeterIndex + "; Trial: " + (Trials + 1).ToString(this.GlobalCulture) + " of " + this.NumberOfTrials.ToString(this.GlobalCulture) + "\n"); + + Ok = this.GetRegister(GP30Registers.CalFactor3(), out DebugMessage); + if (Ok) + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'Calfactor3'-register successful at METER" + MeterIndex + "\n"); + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t Reading to 'Calfactor3'-register failed at METER" + MeterIndex + "\n"); + if (this.CommandInterface.Subreason == GP30ConfigExErrors.AccessDenied) + reAuthentication = true; + } + Trials++; + } + System.Diagnostics.Debug.WriteLine(Ok.ToString()); + if (Ok == false) + { + System.Diagnostics.Debug.WriteLine("Returning"); + return Ok; + } + System.Diagnostics.Debug.WriteLine("Write data to file"); + #endregion + #region Write to file + DateTime Timestamp = new DateTime(); + Timestamp = DateTime.Now; + String TimestampFileName = Timestamp.ToString(Formats.LogFileDateTimeString, this.GlobalCulture); + String LoggingText = + "GENESISFLOW_ZeroOffset;0x" + + GenesisZeroFlow._GenesisZeroFlow.GetZeroFlowOffset()[MeterNumber][Constants.PATH0].ToString("X4", this.GlobalCulture) + ";0x" + + GenesisZeroFlow._GenesisZeroFlow.GetZeroFlowOffset()[MeterNumber][Constants.PATH1].ToString("X4", this.GlobalCulture) + ";0x" + + GenesisZeroFlow._GenesisZeroFlow.GetZeroFlowOffset()[MeterNumber][Constants.PATH2].ToString("X4", this.GlobalCulture) + ";\n" + + "GENESISFLOW_FirstHitPercent;0x" + + GenesisZeroFlow._GenesisZeroFlow.GetFirstHitPercentage()[MeterNumber][Constants.PATH0].ToString("X4", this.GlobalCulture) + ";0x" + + GenesisZeroFlow._GenesisZeroFlow.GetFirstHitPercentage()[MeterNumber][Constants.PATH1].ToString("X4", this.GlobalCulture) + ";0x" + + GenesisZeroFlow._GenesisZeroFlow.GetFirstHitPercentage()[MeterNumber][Constants.PATH2].ToString("X4", this.GlobalCulture) + ";\n" + + "GENESISFLOW_ToFTempOffset;0x" + + GenesisZeroFlow._GenesisZeroFlow.GetToFTempOffset()[MeterNumber][Constants.PATH0].ToString("X4", this.GlobalCulture) + ";0x" + + GenesisZeroFlow._GenesisZeroFlow.GetToFTempOffset()[MeterNumber][Constants.PATH1].ToString("X4", this.GlobalCulture) + ";0x" + + GenesisZeroFlow._GenesisZeroFlow.GetToFTempOffset()[MeterNumber][Constants.PATH2].ToString("X4", this.GlobalCulture) + ";\n" + + "GENESISFLOW_Calfactor;0x" + + GenesisZeroFlow._GenesisZeroFlow.GetCalFactor()[MeterNumber][Constants.PATH0].ToString("X4", this.GlobalCulture) + ";0x" + + GenesisZeroFlow._GenesisZeroFlow.GetCalFactor()[MeterNumber][Constants.PATH1].ToString("X4", this.GlobalCulture) + ";0x" + + GenesisZeroFlow._GenesisZeroFlow.GetCalFactor()[MeterNumber][Constants.PATH2].ToString("X4", this.GlobalCulture) + ";\n"; + Logging.WriteToFile(LoggingText, @"..\GenesisZeroflowTest_Registers_METER" + MeterIndex + "_" + TimestampFileName + ".csv"); + ClearData(); + #endregion + #endregion + + return Ok; + } + public void KeepAuthentified(Boolean enable, Boolean sequenceOk, Boolean taskCompleted, ref Int32 counter, LogOn logOn) + { + logOn.KeepAuthentified(enable, sequenceOk, taskCompleted, ref counter); + } + private Boolean ReauthenticationProcedure(LogOn logOn, CancellationToken token, ref Boolean reAuthentication) + { + #region Definitions and initialization + Boolean Ok = false; + String MeterIndex = (this.MeterNumber + 1).ToString(this.GlobalCulture); + String DebugMessage = String.Empty; + Boolean SequenceFailed = false; + DialogResult askForActionsAuth = DialogResult.None; + #endregion + #region Optional reauthentification + if (reAuthentication) + { + + while ((askForActionsAuth == DialogResult.Retry) || (askForActionsAuth == DialogResult.None)) + { + if (askForActionsAuth == DialogResult.None) + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Reauthentication started at METER" + MeterIndex + "\n"); + + Ok = logOn.PerformLogOn(token, out DebugMessage); + if (token.IsCancellationRequested) + { + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Reauthentication aborted at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + return true; + } + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Reauthentication successful at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line); + SequenceFailed = false; + reAuthentication = false; + askForActionsAuth = DialogResult.OK; + } + else + { + GenesisZeroFlow.Display.DebugMessage("COMMAND CHANNEL:\t " + DebugMessage + "\n"); + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Reauthentication failed at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + SequenceFailed = true; + + askForActionsAuth = MessageBox.Show("Reauthentication failed at METER" + MeterIndex, "Retry?", MessageBoxButtons.RetryCancel, MessageBoxIcon.Question); + switch (askForActionsAuth) + { + case DialogResult.Retry: + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Reauthentication restarted at METER" + MeterIndex + "\n"); + break; + case DialogResult.Cancel: + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t Reauthentication canceled at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line); + SequenceFailed = true; + return SequenceFailed; + //break; + default: break; + } + + } + } + } + #endregion + + return SequenceFailed; + + } + private DialogResult AskHowToProceedSequence(String sequenceName) + { + DialogResult AskForActions; + String MeterIndex = (this.MeterNumber + 1).ToString(this.GlobalCulture); + + GenesisZeroFlow.Display.AbortButtonEnabled(false); + AskForActions = MessageBox.Show(sequenceName + " failed at METER" + MeterIndex, "Retry?", MessageBoxButtons.RetryCancel, MessageBoxIcon.Question); + switch (AskForActions) + { + case DialogResult.Retry: + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t " + sequenceName + " restarted at METER" + MeterIndex + "\n"); + break; + case DialogResult.Cancel: + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t " + sequenceName + " canceled at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line); + break; + default: break; + } + GenesisZeroFlow.Display.AbortButtonEnabled(true); + + return AskForActions; + } + public void Meter(Boolean enable, ref Task task, ref Boolean taskStarted, ref Boolean sequenceFailed, LogOn logOn, Completion completion, ref Int32 nextDelayTime, CancellationToken token) + { + #region Avoid CA1062 + if (task == null) + return; + #endregion + #region Definitions and initializations + Int32 DelayTime = 0; + String MeterIndex = (this.MeterNumber + 1).ToString(this.GlobalCulture); + const Int32 DeltaDelay = 5; + DialogResult AskForActions = DialogResult.None; + Boolean ReAuthentication = false; + var _sequenceFailed = sequenceFailed; + var _logOn = logOn; + var _completion = completion; + Int32 temp = DelayTime; + Boolean Ok = false; + #endregion + #region Everything else + if ((enable) && (task.Status != TaskStatus.Running) && (!task.IsCompleted)) + { + DelayTime = nextDelayTime; + nextDelayTime = nextDelayTime + DeltaDelay; + + taskStarted = true; + Misc.WaitNSeconds(temp); + + #region Testprocedure + DelayTime = nextDelayTime; + nextDelayTime = nextDelayTime + DeltaDelay; + taskStarted = true; + Misc.WaitNSeconds(temp); + + task = Task.Run(() => + { + while ((AskForActions == DialogResult.Retry) || (AskForActions == DialogResult.None)) + { + #region Cancellation token + if (AskForActions == DialogResult.None) + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t COMPLETION started at METER" + MeterIndex + "\n"); + #endregion + #region Optional re-authentication + _sequenceFailed = ReauthenticationProcedure(_logOn, token, ref ReAuthentication); + #endregion + #region Sequence + Ok = _completion.PerformCompletion(token, out ReAuthentication); + if (token.IsCancellationRequested) + { + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t COMPLETION aborted at METER" + MeterIndex + "\n"); + return false; + } + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t COMPLETION successful at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line); + _sequenceFailed = false; + + AskForActions = DialogResult.OK; + } + else + { + if (ReAuthentication == false) + { + GenesisZeroFlow.Display.DebugMessage("APPLICATION:\t\t COMPLETION failed at METER" + MeterIndex + "\n"); + GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line); + AskForActions = AskHowToProceedSequence("COMPLETION"); + } + _sequenceFailed = true; + + } + #endregion + } + return _sequenceFailed; + }); + #endregion + + } + #endregion + } + private Boolean SetSampleRateRegister(Int16 value, out String debugMessage) + { + #region Definitions and initialisations + Byte[] Payload = new Byte[4] { 0, 0, 0, 0 }; + Boolean Ok = false; + Int32 ErrCode = GP30LowLevelErrors.NoError; + #endregion + #region Peak detection register + #region Write register + Payload = BitConverter.GetBytes((Int32)value); + ErrCode = this.CommandInterface.WriteRegister(GP30Registers.Samplerate(), Payload, true); + #endregion + #region Wait for answer + if (ErrCode == GP30LowLevelErrors.NoError) + ErrCode = CommandInterface.RXProcessor(GP30RequestType.WriteRegister); + #endregion + #region Debug message + debugMessage = CommandInterface.LowLevelMessages(ErrCode, out Ok); + #endregion + #endregion + + return Ok; + } + private Boolean SetLedMode(Int16 value, out String debugMessage) + { + #region Definitions and initialisations + Byte[] Payload = new Byte[4] { 0, 0, 0, 0 }; // tbd + Boolean Ok = false; + Int32 ErrCode = GP30LowLevelErrors.NoError; + #endregion + #region Peak detection register + #region Write register + Payload = BitConverter.GetBytes((Int32)value); + ErrCode = CommandInterface.WriteRegister(GP30Registers.LedMode(), Payload, true); + #endregion + #region Wait for answer + if (ErrCode == GP30LowLevelErrors.NoError) + ErrCode = CommandInterface.RXProcessor(GP30RequestType.WriteRegister); + #endregion + #region Debug message + debugMessage = CommandInterface.LowLevelMessages(ErrCode, out Ok); + #endregion + #endregion + + return Ok; + } + private Boolean SetStoreCalibration(out String debugMessage) + { + #region Definitions and initialisations + Byte[] Payload = new Byte[4] { 0, 0, 0, 0 }; // tbd + Boolean Ok = false; + Int32 ErrCode = GP30LowLevelErrors.NoError; + #endregion + #region Write register + Payload[0] = 1; + ErrCode = CommandInterface.WriteRegister(GP30Registers.StoreCalibration(), Payload, true); + #endregion + #region Wait for answer + if (ErrCode == GP30LowLevelErrors.NoError) + ErrCode = CommandInterface.RXProcessor(GP30RequestType.WriteRegister); + #endregion + #region Debug message + debugMessage = CommandInterface.LowLevelMessages(ErrCode, out Ok); + #endregion + + return Ok; + } + private Boolean GetRegister(Byte[] register, out String debugMessage) + { + #region Definitions and initialisations + Boolean Ok = false; + Int32 ErrCode = GP30LowLevelErrors.NoError; + #endregion + #region Read register + ErrCode = CommandInterface.ReadRegister(register); + #endregion + #region Wait for answer + if (ErrCode == GP30LowLevelErrors.NoError) + ErrCode = CommandInterface.RXProcessor(GP30RequestType.ReadRegister); + #endregion + #region Debug message + debugMessage = CommandInterface.LowLevelMessages(ErrCode, out Ok); + #endregion + + return Ok; + } + private void ClearData() + { + GenesisZeroFlow._GenesisZeroFlow.SetZeroFlowOffset(this.MeterNumber, Constants.PATH0, 0); + GenesisZeroFlow._GenesisZeroFlow.SetZeroFlowOffset(this.MeterNumber, Constants.PATH1, 0); + GenesisZeroFlow._GenesisZeroFlow.SetZeroFlowOffset(this.MeterNumber, Constants.PATH2, 0); + GenesisZeroFlow._GenesisZeroFlow.SetFirstHitPercentage(this.MeterNumber, Constants.PATH0, 0); + GenesisZeroFlow._GenesisZeroFlow.SetFirstHitPercentage(this.MeterNumber, Constants.PATH1, 0); + GenesisZeroFlow._GenesisZeroFlow.SetFirstHitPercentage(this.MeterNumber, Constants.PATH2, 0); + GenesisZeroFlow._GenesisZeroFlow.SetToFTempOffset(this.MeterNumber, Constants.PATH0, 0); + GenesisZeroFlow._GenesisZeroFlow.SetToFTempOffset(this.MeterNumber, Constants.PATH1, 0); + GenesisZeroFlow._GenesisZeroFlow.SetToFTempOffset(this.MeterNumber, Constants.PATH2, 0); + GenesisZeroFlow._GenesisZeroFlow.SetCalFactor(this.MeterNumber, Constants.PATH0, 0); + GenesisZeroFlow._GenesisZeroFlow.SetCalFactor(this.MeterNumber, Constants.PATH1, 0); + GenesisZeroFlow._GenesisZeroFlow.SetCalFactor(this.MeterNumber, Constants.PATH2, 0); + } + } + #endregion +} diff --git a/ZeroFlowTool/SerialConfig.cs b/ZeroFlowTool/SerialConfig.cs new file mode 100644 index 00000000..374c6d57 --- /dev/null +++ b/ZeroFlowTool/SerialConfig.cs @@ -0,0 +1,5 @@ +namespace GenesisZeroFlow +{ + + +} diff --git a/ZeroFlowTool/TempCalDisplay.cs b/ZeroFlowTool/TempCalDisplay.cs new file mode 100644 index 00000000..9ed7aacc --- /dev/null +++ b/ZeroFlowTool/TempCalDisplay.cs @@ -0,0 +1,508 @@ +using System; +using System.Drawing; +using System.Globalization; +using System.Windows.Forms; + + +namespace GenesisZeroFlow +{ + + public partial class frmTempCalibration : Form + { + + + public Boolean DisplayGetSequenceResult(Boolean sequenceEnabled, Boolean sequenceFailed, String sequenceName, out Boolean stopSequence) + { + #region Definitions and initializations + Boolean Ok = false; + String DebugSequenceFailed = String.Empty; + String DebugSequenceSucceeded = String.Empty; + //Boolean AllSequencesFailed = true; + //Boolean AllSequencesOK = true; + stopSequence = false; + #endregion + #region Get result + #region OK + if ((Boolean.Equals(sequenceFailed, false)) && (Boolean.Equals(sequenceEnabled, true))) + { + //AllSequencesFailed = false; + Ok = true; + //DebugSequenceSucceeded = $"{DebugSequenceSucceeded}"; + } + #endregion + #region Failed + if ((Boolean.Equals(sequenceFailed, true)) && (Boolean.Equals(sequenceEnabled, true))) + { + //AllSequencesOK = false; + Ok = false; + //DebugSequenceFailed = $"{DebugSequenceFailed}"; + } + #endregion + + //#region Summary + //if (AllSequencesFailed) + //{ + // stopSequence = true; + // DisplayTempCal.DebugMessage($"APPLICATION:\t\t {sequenceName} failed!\n"); + // DisplayTempCal.DebugMessage("APPLICATION:\t\t TEMPERATURE CALIBRATION sequence failed\n"); + // DisplayTempCal.DebugMessage(Debugmessages.Line); + // MessageBox.Show("TEMPERATURE CALIBRATION sequence failed", "Form closing", MessageBoxButtons.OK, MessageBoxIcon.Error); + // DisplayTempCal.SetProgressPanel(StatusPanelItems.None); + // DisplayTempCal.StatusLabel("Press 'DETECT'"); + // return Ok; + //} + //else + //{ + // if (AllSequencesOK) + // { + // DisplayTempCal.DebugMessage($"APPLICATION:\t\t {sequenceName} successful\n"); + // DisplayTempCal.DebugMessage(Debugmessages.Line); + // } + // else + // { + // DisplayTempCal.DebugMessage("APPLICATION:\t\t SUMMARY: \n"); + // if (String.IsNullOrEmpty(DebugSequenceFailed)) + // DebugSequenceFailed = "None"; + // DisplayTempCal.DebugMessage($"APPLICATION:\t\t {sequenceName} failed at {DebugSequenceFailed}\n"); + // if (String.IsNullOrEmpty(DebugSequenceSucceeded)) + // DebugSequenceSucceeded = "None"; + // DisplayTempCal.DebugMessage($"APPLICATION:\t\t {sequenceName} successful at {DebugSequenceSucceeded}\n"); + // DisplayTempCal.DebugMessage(Debugmessages.Line); + // } + + //} + //DisplayTempCal.DebugMessage($"APPLICATION:\t\t {sequenceName} finished\n"); + //DisplayTempCal.DebugMessage(Debugmessages.Line); + //#endregion + #endregion + return Ok; + } + + + public static class DisplayTempCal + { + public static void TempCalDetectSetBackColor(Color color) + { + frmTempCalibration._frmTempCalibration.p_TempCal_Detect.BackColor = color; + } + public static void TempCalPrepareSetBackColor(Color color) + { + frmTempCalibration._frmTempCalibration.p_TempCal_Prepare.BackColor = color; + } + public static void TempCalCompletionSetBackColor(Color color) + { + frmTempCalibration._frmTempCalibration.p_TempCal_Completion.BackColor = color; + } + public static void TempCalTempCalSetBackColor(Color color) + { + frmTempCalibration._frmTempCalibration.p_TempCal_TempCal.BackColor = color; + } + public static void TempCalDetectSetLabelColor(Color color) + { + frmTempCalibration._frmTempCalibration.l_TempCal_Detect.ForeColor = color; + } + public static void TempCalPrepareSetLabelColor(Color color) + { + frmTempCalibration._frmTempCalibration.l_TempCal_Prepare.ForeColor = color; + } + public static void TempCalCompletionSetLabelColor(Color color) + { + frmTempCalibration._frmTempCalibration.l_TempCal_Completion.ForeColor = color; + } + public static void TempCalTempCalSetLabelColor(Color color) + { + frmTempCalibration._frmTempCalibration.l_TempCal_TempCal.ForeColor = color; + } + public static void TempCalSetTemperatureLabel(UInt16 path, String text) + { + if (path == Constants.PATH0 && frmTempCalibration._frmTempCalibration.l_TemperatureDispPath0.Text == text) + return; + if (path == Constants.PATH1 && frmTempCalibration._frmTempCalibration.l_TemperatureDispPath1.Text == text) + return; + if (path == Constants.PATH2 && frmTempCalibration._frmTempCalibration.l_TemperatureDispPath2.Text == text) + return; + + if (frmTempCalibration._frmTempCalibration.InvokeRequired) + { + frmTempCalibration._frmTempCalibration.Invoke((Action)TempCalSetTemperatureLabel, path, text); + return; + } + + try + { + if (!String.IsNullOrEmpty(text)) + { + + switch (path) + { + case Constants.PATH0: + frmTempCalibration._frmTempCalibration.l_TemperatureDispPath0.Text = text; + break; + case Constants.PATH1: + frmTempCalibration._frmTempCalibration.l_TemperatureDispPath1.Text = text; + break; + case Constants.PATH2: + frmTempCalibration._frmTempCalibration.l_TemperatureDispPath2.Text = text; + break; + default: break; + } + } + } + catch(Exception) + { + // Do nothing + } + + } + public static void TempCalRefTemperatureLabel(String text) + { + if (frmTempCalibration._frmTempCalibration.InvokeRequired) + { + frmTempCalibration._frmTempCalibration.Invoke((Action)TempCalRefTemperatureLabel, text); + return; + } + + try + { + if (!String.IsNullOrEmpty(text)) + { + frmTempCalibration._frmTempCalibration.l_TemperatureDispRef.Text = text; + } + } + catch(Exception) + { + // Do nothing + } + + } + + + public static void StatusLabel(String debugMessage) + { + if (frmTempCalibration._frmTempCalibration.InvokeRequired) + { + frmTempCalibration._frmTempCalibration.Invoke((Action)StatusLabel, debugMessage); + return; + } + + try + { + // Add line and scroll to caret + if (!String.IsNullOrEmpty(debugMessage)) + { + frmTempCalibration._frmTempCalibration.l_TempCalStatus.Text = debugMessage; + } + } + catch(Exception) + { + // Do nothing + } + } + public static void ConnectionStatus(Boolean[] ok) + { + if (ok == null) + return; + + if (frmTempCalibration._frmTempCalibration.InvokeRequired) + { + frmTempCalibration._frmTempCalibration.Invoke((Action)ConnectionStatus, ok); + return; + } + + //if (ok[Constants.CmdMeter1] && ok[Constants.DataMeter1]) + if (ok[Constants.CmdMeter1] && ok[1]) + { + frmTempCalibration._frmTempCalibration.p_TempCal_Meter1.BackColor = Color.LightGreen; + frmTempCalibration._frmTempCalibration.pB_TempCal_Meter1.Image = frmTempCalibration._frmTempCalibration.pB_AvailableImages.Image; + } + else + { + frmTempCalibration._frmTempCalibration.p_TempCal_Meter1.BackColor = Color.LightPink; + frmTempCalibration._frmTempCalibration.pB_TempCal_Meter1.Image = frmTempCalibration._frmTempCalibration.pB_AvailableImages.ErrorImage; + } + } + public static void ConnectionStatusReset() + { + frmTempCalibration._frmTempCalibration.p_TempCal_Meter1.BackColor = Color.Cornsilk; + frmTempCalibration._frmTempCalibration.pB_TempCal_Meter1.Image = frmTempCalibration._frmTempCalibration.pB_AvailableImages.InitialImage; + } + public static void DebugMessage(String debugText, CultureInfo culture) + { + if (frmTempCalibration._frmTempCalibration.InvokeRequired) + { + frmTempCalibration._frmTempCalibration.Invoke((Action)DebugMessage, debugText, culture); + return; + } + + // Add line and scroll to caret + try + { + if (!String.IsNullOrEmpty(debugText)) + { + String Timestamp = DateTime.Now.ToString(Formats.RawDataDateTimeLogString, culture); + frmTempCalibration._frmTempCalibration.rTB_TempCal.AppendText($"{Timestamp}\t{debugText}"); + frmTempCalibration._frmTempCalibration.rTB_TempCal.ScrollToCaret(); + } + } + catch(Exception) + { + // Do nothing + } + } + public static void SetProgressPanel(Int32 item) + { + if (frmTempCalibration._frmTempCalibration.InvokeRequired) + { + frmTempCalibration._frmTempCalibration.Invoke((Action)SetProgressPanel, item); + return; + } + + switch (item) + { + case StatusPanelItems.None: + frmTempCalibration.DisplayTempCal.TempCalDetectSetBackColor(Color.Gainsboro); + frmTempCalibration.DisplayTempCal.TempCalPrepareSetBackColor(Color.Gainsboro);; + frmTempCalibration.DisplayTempCal.TempCalCompletionSetBackColor(Color.Gainsboro); + frmTempCalibration.DisplayTempCal.TempCalTempCalSetBackColor(Color.Gainsboro); + frmTempCalibration.DisplayTempCal.TempCalDetectSetLabelColor(Color.Gray); + frmTempCalibration.DisplayTempCal.TempCalPrepareSetLabelColor(Color.Gray); + frmTempCalibration.DisplayTempCal.TempCalCompletionSetLabelColor(Color.Gray); + frmTempCalibration.DisplayTempCal.TempCalTempCalSetLabelColor(Color.Gray); + break; + + case StatusPanelItems.Detect: + frmTempCalibration.DisplayTempCal.TempCalDetectSetBackColor(Color.LightGreen); + frmTempCalibration.DisplayTempCal.TempCalPrepareSetBackColor(Color.Gainsboro); + frmTempCalibration.DisplayTempCal.TempCalCompletionSetBackColor(Color.Gainsboro); + frmTempCalibration.DisplayTempCal.TempCalTempCalSetBackColor(Color.Gainsboro); + frmTempCalibration.DisplayTempCal.TempCalDetectSetLabelColor(Color.Black); + frmTempCalibration.DisplayTempCal.TempCalPrepareSetLabelColor(Color.Gray); + frmTempCalibration.DisplayTempCal.TempCalCompletionSetLabelColor(Color.Gray); + frmTempCalibration.DisplayTempCal.TempCalTempCalSetLabelColor(Color.Gray); + break; + + case StatusPanelItems.Prepare: + frmTempCalibration.DisplayTempCal.TempCalDetectSetBackColor(Color.Gainsboro); + frmTempCalibration.DisplayTempCal.TempCalPrepareSetBackColor(Color.LightGreen); + frmTempCalibration.DisplayTempCal.TempCalCompletionSetBackColor(Color.Gainsboro); + frmTempCalibration.DisplayTempCal.TempCalTempCalSetBackColor(Color.Gainsboro); + frmTempCalibration.DisplayTempCal.TempCalDetectSetLabelColor(Color.Gray); + frmTempCalibration.DisplayTempCal.TempCalPrepareSetLabelColor(Color.Black); + frmTempCalibration.DisplayTempCal.TempCalCompletionSetLabelColor(Color.Gray); + frmTempCalibration.DisplayTempCal.TempCalTempCalSetLabelColor(Color.Gray); + break; + + case StatusPanelItems.Completion: + frmTempCalibration.DisplayTempCal.TempCalDetectSetBackColor(Color.Gainsboro); + frmTempCalibration.DisplayTempCal.TempCalPrepareSetBackColor(Color.Gainsboro); + frmTempCalibration.DisplayTempCal.TempCalCompletionSetBackColor(Color.LightGreen); + frmTempCalibration.DisplayTempCal.TempCalTempCalSetBackColor(Color.Gainsboro); + frmTempCalibration.DisplayTempCal.TempCalDetectSetLabelColor(Color.Gray); + frmTempCalibration.DisplayTempCal.TempCalPrepareSetLabelColor(Color.Gray); + frmTempCalibration.DisplayTempCal.TempCalCompletionSetLabelColor(Color.Black); + frmTempCalibration.DisplayTempCal.TempCalTempCalSetLabelColor(Color.Gray); + break; + + case StatusPanelItems.TempCal: + frmTempCalibration.DisplayTempCal.TempCalDetectSetBackColor(Color.Gainsboro); + frmTempCalibration.DisplayTempCal.TempCalPrepareSetBackColor(Color.Gainsboro); + frmTempCalibration.DisplayTempCal.TempCalCompletionSetBackColor(Color.Gainsboro); + frmTempCalibration.DisplayTempCal.TempCalTempCalSetBackColor(Color.LightGreen); + frmTempCalibration.DisplayTempCal.TempCalDetectSetLabelColor(Color.Gray); + frmTempCalibration.DisplayTempCal.TempCalPrepareSetLabelColor(Color.Gray); + frmTempCalibration.DisplayTempCal.TempCalCompletionSetLabelColor(Color.Gray); + frmTempCalibration.DisplayTempCal.TempCalTempCalSetLabelColor(Color.Black); + break; + + default: + frmTempCalibration.DisplayTempCal.TempCalDetectSetBackColor(Color.Gainsboro); + frmTempCalibration.DisplayTempCal.TempCalPrepareSetBackColor(Color.Gainsboro); + frmTempCalibration.DisplayTempCal.TempCalCompletionSetBackColor(Color.Gainsboro); + frmTempCalibration.DisplayTempCal.TempCalTempCalSetBackColor(Color.Gainsboro); + frmTempCalibration.DisplayTempCal.TempCalDetectSetLabelColor(Color.Gray); + frmTempCalibration.DisplayTempCal.TempCalPrepareSetLabelColor(Color.Gray); + frmTempCalibration.DisplayTempCal.TempCalCompletionSetLabelColor(Color.Gray); + frmTempCalibration.DisplayTempCal.TempCalTempCalSetLabelColor(Color.Gray); + break; + + } + } + public static void TemperatureLabelsForm1Visible(Boolean visible) + { + + if (frmTempCalibration._frmTempCalibration.InvokeRequired) + { + frmTempCalibration._frmTempCalibration.Invoke((Action)TemperatureLabelsForm1Visible, visible); + return; + } + + frmTempCalibration._frmTempCalibration.l_TemperatureRef.Visible = visible; + frmTempCalibration._frmTempCalibration.l_TemperatureDispRef.Visible = visible; + frmTempCalibration._frmTempCalibration.l_TemperaturePath0.Visible = visible; + frmTempCalibration._frmTempCalibration.l_TemperatureDispPath0.Visible = visible; + frmTempCalibration._frmTempCalibration.l_TemperaturePath1.Visible = visible; + frmTempCalibration._frmTempCalibration.l_TemperatureDispPath1.Visible = visible; + frmTempCalibration._frmTempCalibration.l_TemperaturePath2.Visible = visible; + frmTempCalibration._frmTempCalibration.l_TemperatureDispPath2.Visible = visible; + } + public static void MeterStatusGreenRed(Boolean ok, Boolean enable) + { + if (frmTempCalibration._frmTempCalibration.InvokeRequired) + { + frmTempCalibration._frmTempCalibration.Invoke((Action)MeterStatusGreenRed, ok, enable); + return; + } + + #region METER1 + if (enable) + { + if (ok) + { + frmTempCalibration._frmTempCalibration.p_TempCal_Meter1.BackColor = Color.LightGreen; + frmTempCalibration._frmTempCalibration.pB_TempCal_Meter1.Image = frmTempCalibration._frmTempCalibration.pB_AvailableImages.Image; + } + else + { + frmTempCalibration._frmTempCalibration.p_TempCal_Meter1.BackColor = Color.LightPink; + frmTempCalibration._frmTempCalibration.pB_TempCal_Meter1.Image = frmTempCalibration._frmTempCalibration.pB_AvailableImages.ErrorImage; + } + } + #endregion + } + public static void MeterStatusRedYellow(Boolean ok, Boolean enable) + { + + + if (frmTempCalibration._frmTempCalibration.InvokeRequired) + { + frmTempCalibration._frmTempCalibration.Invoke((Action)MeterStatusRedYellow, ok, enable); + return; + } + + #region METER1 + if (enable) + { + if (ok) + { + frmTempCalibration._frmTempCalibration.p_TempCal_Meter1.BackColor = Color.LightPink; + frmTempCalibration._frmTempCalibration.pB_TempCal_Meter1.Image = frmTempCalibration._frmTempCalibration.pB_AvailableImages.ErrorImage; + } + else + { + frmTempCalibration._frmTempCalibration.p_TempCal_Meter1.BackColor = Color.Cornsilk; + frmTempCalibration._frmTempCalibration.pB_TempCal_Meter1.Image = frmTempCalibration._frmTempCalibration.pB_AvailableImages.InitialImage; + } + } + #endregion + + } + public static void MeterStatusGreenYellow(Boolean ok, Boolean enable) + { + + if (frmTempCalibration._frmTempCalibration.InvokeRequired) + { + frmTempCalibration._frmTempCalibration.Invoke((Action)MeterStatusGreenYellow, ok, enable); + return; + } + + #region METER1 + if (enable) + { + if (ok) + { + frmTempCalibration._frmTempCalibration.p_TempCal_Meter1.BackColor = Color.LightGreen; + frmTempCalibration._frmTempCalibration.pB_TempCal_Meter1.Image = frmTempCalibration._frmTempCalibration.pB_AvailableImages.Image; + } + else + { + frmTempCalibration._frmTempCalibration.p_TempCal_Meter1.BackColor = Color.Cornsilk; + frmTempCalibration._frmTempCalibration.pB_TempCal_Meter1.Image = frmTempCalibration._frmTempCalibration.pB_AvailableImages.InitialImage; + } + } + #endregion + } + public static void WaitForStabilization(Boolean ok, Boolean stopSequence, Int32 waitingTime) + { + // aborted = false; + + + if (Boolean.Equals(stopSequence, false)) + { + Boolean PerformWait = false; + + if (ok) + PerformWait = true; + + if (PerformWait) + { + for (Int32 i = waitingTime; i >= 0; i--) + { + if (GenesisZeroFlow._GenesisZeroFlow.AbortIndicator) + { + // aborted = true; + return; + } + Misc.WaitNSeconds(1, true); + } + } + } + } + + public static void WaitForStabilizationTempCal(Boolean ok, Boolean stopSequence, Int32 waitingTime) + { + // aborted = false; + + + if (Boolean.Equals(stopSequence, false)) + { + Boolean PerformWait = false; + + if (ok) + PerformWait = true; + + if (PerformWait) + Misc.WaitNSeconds(waitingTime, true); + + } + } + public static void SetControlElements(Boolean enabled) + { + if (enabled) + { + frmTempCalibration._frmTempCalibration.pB_Bubbles1.Visible = false; + frmTempCalibration._frmTempCalibration.btn_TempCal_Detect.Enabled = true; + } + else + { + frmTempCalibration._frmTempCalibration.btn_TempCal_Detect.Enabled = false; + frmTempCalibration._frmTempCalibration.btn_TempCal_Start.Enabled = false; + } + } + public static void TemperatureFieldTempCal() + { + TemperatureFieldTempCal thirdForm; + using (thirdForm = new TemperatureFieldTempCal()) + { + + frmTempCalibration._frmTempCalibration.SetWaitForTemperatureFieldTempCal(true); + thirdForm.Show(); + frmTempCalibration._frmTempCalibration.ThirdFormOpenIndicator = true; + while (frmTempCalibration._frmTempCalibration.WaitForTemperatureFieldTempCal) { Misc.WaitNSeconds(1, false); } + } + + } + } + + internal void FlushBuffer() + { + foreach (var meter in frmTempCalibration._frmTempCalibration.GlobalMeterBatch.ListOfMeters) + { + if (meter is GenesisDisplayTool.ZeroFlowGenesisMeter) + { + ((GenesisDisplayTool.ZeroFlowGenesisMeter) meter).Flush(); + } + } + + } + } +} \ No newline at end of file diff --git a/ZeroFlowTool/Temperature.cs b/ZeroFlowTool/Temperature.cs new file mode 100644 index 00000000..d2d4b7e9 --- /dev/null +++ b/ZeroFlowTool/Temperature.cs @@ -0,0 +1,1219 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Globalization; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using GenesisDisplayTool; +using Xylem.Common.Hardware.WaterMeter.Genesis.Registers; +using Xylem.Common.Hardware.WaterMeter.WaterMeterCore; + + +namespace GenesisZeroFlow +{ + public partial class GenesisZeroFlow : Form + { + public Boolean TempMonitoringFailed; + + private Double[][] MeasuredTemps = new Double[Constants.NumberOfThermometers][]; + + private Boolean[][] MeasuredTempsIndicator = new Boolean[Constants.NumberOfThermometers][]; + + + public void SetMeasuredTemps(UInt16 thermoNumber, UInt16 path, Double value) + { + MeasuredTemps[thermoNumber][path] = value; + } + public void SetMeasuredTempsIndicator(UInt16 thermoNumber, UInt16 path, Boolean value) + { + if (GenesisZeroFlow._GenesisZeroFlow.InvokeRequired) + { + GenesisZeroFlow._GenesisZeroFlow.Invoke((Action)SetMeasuredTempsIndicator, thermoNumber, path, value); + return; + } + MeasuredTempsIndicator[thermoNumber][path] = value; + } + public Double GetMeasuredTemps(UInt16 thermoNumber, UInt16 path) + { + return MeasuredTemps[thermoNumber][path]; + } + public Boolean GetMeasuredTempsIndicator(UInt16 thermoNumber, UInt16 path) + { + Boolean temp = MeasuredTempsIndicator[thermoNumber][path]; + return temp; + } + + } + public static class TempCalibrationSequences + { + public static Boolean[] Total(MeterBatch globalMeterBatch, MeterBatch thermoMeterBatch, Boolean[] allEnable, Boolean manTempAcquisition, Double upperTempLimit, Double lowerTempLimit, Double tempDeviationLimit, out Boolean aborted, CultureInfo culture) + { + #region Definitions and initializations + Boolean[] MeterEnable = Misc.Subarray(allEnable, 0, Constants.NumberOfMeters); + Boolean[] ThermoEnable = Misc.Subarray(allEnable, Constants.NumberOfMeters, Constants.NumberOfThermometers); + Int32 NextDelayTime = 0; + + Boolean[] MeterTaskStarted = new Boolean[Constants.NumberOfMeters]; + Boolean[] MeterTaskCompleted = new Boolean[Constants.NumberOfMeters]; + Boolean[] MeterSequenceOk = new Boolean[Constants.NumberOfMeters]; + Boolean[] MeterSequenceFailed = new Boolean[Constants.NumberOfMeters]; + + Boolean[] ThermoTaskStarted = new Boolean[Constants.NumberOfThermometers]; + Boolean[] ThermoTaskCompleted = new Boolean[Constants.NumberOfThermometers]; + Boolean[] ThermoSequenceOk = new Boolean[Constants.NumberOfThermometers]; + Boolean[] ThermoSequenceFailed = new Boolean[Constants.NumberOfThermometers]; + + MeterTaskStarted = ArrayInit.Meter(false); + MeterTaskCompleted = ArrayInit.Meter(false); + MeterSequenceOk = ArrayInit.Meter(false); + MeterSequenceFailed = ArrayInit.Meter(false); + + ThermoTaskStarted = ArrayInit.Thermo(false); + ThermoTaskCompleted = ArrayInit.Thermo(false); + ThermoSequenceOk = ArrayInit.Thermo(false); + ThermoSequenceFailed = ArrayInit.Thermo(false); + + aborted = false; + + List listTempCalib = new List(); + List listThermoTempCalib = new List(); + GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed = false; + + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + { + var currentMeter = globalMeterBatch.ListOfMeters.FirstOrDefault(m => m.Slot.Equals(Meter + 1)); + + if (currentMeter != null) + listTempCalib.Add(new TempCalibration(Meter, currentMeter, culture)); + else + listTempCalib.Add(new TempCalibration(Meter, culture)); + } + + for (UInt16 Thermo = Constants.Thermo1; Thermo < Constants.NumberOfThermometers; Thermo++) + { + var currentMeter = globalMeterBatch.ListOfMeters.FirstOrDefault(m => m.Slot.Equals(Thermo + 11)); + + if (currentMeter != null) + listThermoTempCalib.Add(new TempCalibration(Thermo, currentMeter, culture)); + else + listThermoTempCalib.Add(new TempCalibration(Thermo, culture)); + } + #region Initialize + foreach (var tempcalib in listTempCalib) + { + tempcalib.Initialize(GenesisZeroFlow._GenesisZeroFlow.PcbID[tempcalib.MeterNumber], Constants.Meter, 0, upperTempLimit, lowerTempLimit, tempDeviationLimit); + tempcalib.MyTask = new Task(() => { return true; }); + } + foreach (var thermotempcalib in listThermoTempCalib) + { + thermotempcalib.Initialize(GenesisZeroFlow._GenesisZeroFlow.ThermoID[thermotempcalib.MeterNumber], Constants.Thermo, 0, upperTempLimit, lowerTempLimit, tempDeviationLimit); + thermotempcalib.MyTask = new Task(() => { return true; }); + } + #endregion + #endregion + #region Perform tests + CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); + CancellationToken token = cancellationTokenSource.Token; + // Temperature acquisition + #region Get manually measured temperatures + if(manTempAcquisition) + GetManualTemperatures(MeterEnable, culture); + + // For what? + Int32 NumberOfTextboxes = 0; + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + { + if (MeterEnable[Meter]) + NumberOfTextboxes++; + } + if (Int32.Equals(NumberOfTextboxes, 0)) + return MeterSequenceFailed.Concat(ThermoSequenceFailed).ToArray(); + + if (manTempAcquisition) + { + listTempCalib[Constants.Meter1].SetRefTemperature(TemperatureField._TemperatureField.GetValueMeter1()); + listTempCalib[Constants.Meter2].SetRefTemperature(TemperatureField._TemperatureField.GetValueMeter2()); + listTempCalib[Constants.Meter3].SetRefTemperature(TemperatureField._TemperatureField.GetValueMeter3()); + listTempCalib[Constants.Meter4].SetRefTemperature(TemperatureField._TemperatureField.GetValueMeter4()); + listTempCalib[Constants.Meter5].SetRefTemperature(TemperatureField._TemperatureField.GetValueMeter5()); + listTempCalib[Constants.Meter6].SetRefTemperature(TemperatureField._TemperatureField.GetValueMeter6()); + listTempCalib[Constants.Meter7].SetRefTemperature(TemperatureField._TemperatureField.GetValueMeter7()); + listTempCalib[Constants.Meter8].SetRefTemperature(TemperatureField._TemperatureField.GetValueMeter8()); + listTempCalib[Constants.Meter9].SetRefTemperature(TemperatureField._TemperatureField.GetValueMeter9()); + listTempCalib[Constants.Meter10].SetRefTemperature(TemperatureField._TemperatureField.GetValueMeter10()); + } + #endregion + // Set meter temperatures + foreach (var tempcalib in listTempCalib) + tempcalib.Meter(ThermoEnable, manTempAcquisition, MeterEnable[tempcalib.MeterNumber], ref MeterTaskStarted[tempcalib.MeterNumber], ref MeterSequenceFailed[tempcalib.MeterNumber], ref NextDelayTime, token); + // Thermometers + foreach (var tempthermocalib in listThermoTempCalib) + { + if (ThermoEnable[tempthermocalib.MeterNumber]) + { + GenesisZeroFlow._GenesisZeroFlow.SetIndicatorTemperatureActivityCheck(tempthermocalib.MeterNumber, true); + GenesisZeroFlow.Display.DebugMessage($"{tempthermocalib.PcbID}\tAPPLICATION:\t\t TEMPERATURE MONITORING started at {tempthermocalib.MeterType}{tempthermocalib.MeterIndex}\n", tempthermocalib.Culture); + GenesisZeroFlow._GenesisZeroFlow.SetLoggingIndicatorThermoMonitoring(tempthermocalib.MeterNumber, true); + } + Misc.WaitNMilliseconds(300); + tempthermocalib.Thermometer(ThermoEnable[tempthermocalib.MeterNumber], ref MeterTaskStarted[tempthermocalib.MeterNumber], ref MeterSequenceFailed[tempthermocalib.MeterNumber], ref NextDelayTime, token); + } + #endregion + #region Wait for tasks + while (!CheckArray(MeterTaskCompleted.Concat(ThermoTaskCompleted).ToArray())) + { + #region Temperature check + foreach (var thermotempcalib in listThermoTempCalib) + { + if (CheckArray(MeterTaskCompleted) && (ThermoEnable[thermotempcalib.MeterNumber])) // If all METERs finished, not THERMOMETERs + { + GenesisZeroFlow._GenesisZeroFlow.SetLoggingIndicatorThermoMonitoring(thermotempcalib.MeterNumber, false); + GenesisZeroFlow.Display.DebugMessage($"{thermotempcalib.PcbID}\tAPPLICATION:\t\t TEMPERATURE MONITORING stopped at {thermotempcalib.MeterType}{thermotempcalib.MeterIndex}\n", thermotempcalib.Culture); + } + } + #endregion + #region Abort check + if (GenesisZeroFlow._GenesisZeroFlow.AbortIndicator) + { + cancellationTokenSource.Cancel(); + aborted = true; + } + #endregion + #region Check result + Misc.WaitNSeconds(1); + #region Meter + foreach (var tempcalib in listTempCalib) + { + MeterTaskCompleted[tempcalib.MeterNumber] = TaskOperations.WaitFor(MeterTaskStarted[tempcalib.MeterNumber], tempcalib.MyTask); + // Stop temperature check + GenesisZeroFlow._GenesisZeroFlow.SetIndicatorTemperatureActivityCheck(tempcalib.MeterNumber, !MeterTaskCompleted[tempcalib.MeterNumber]); + } + foreach (var tempcalib in listTempCalib) + MeterSequenceFailed[tempcalib.MeterNumber] = TaskOperations.GetResult(MeterTaskStarted[tempcalib.MeterNumber], tempcalib.MyTask); + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + MeterSequenceOk[Meter] = !MeterSequenceFailed[Meter]; + #endregion + #region Thermometer + foreach (var thermotempcalib in listThermoTempCalib) + { + ThermoTaskCompleted[thermotempcalib.MeterNumber] = TaskOperations.WaitFor(ThermoTaskStarted[thermotempcalib.MeterNumber], thermotempcalib.MyTask); + // Stop temperature check + GenesisZeroFlow._GenesisZeroFlow.SetIndicatorTemperatureActivityCheck(thermotempcalib.MeterNumber, !MeterTaskCompleted[thermotempcalib.MeterNumber]); + } + foreach (var thermotempcalib in listThermoTempCalib) + ThermoSequenceFailed[thermotempcalib.MeterNumber] = TaskOperations.GetResult(ThermoTaskStarted[thermotempcalib.MeterNumber], thermotempcalib.MyTask); + for (UInt16 Thermometer = Constants.Thermo1; Thermometer < Constants.NumberOfThermometers; Thermometer++) + ThermoSequenceOk[Thermometer] = !ThermoSequenceFailed[Thermometer]; + #endregion + GenesisZeroFlow.Display.MeterStatusGreenRed(MeterSequenceOk, MeterTaskStarted); + GenesisZeroFlow.Display.ThermoStatusGreenRed(ThermoSequenceOk, ThermoTaskStarted); + #endregion + } + #region Sequence failed + foreach (var tempcalib in listTempCalib) + MeterSequenceFailed[tempcalib.MeterNumber] = TaskOperations.GetResult(MeterTaskStarted[tempcalib.MeterNumber], tempcalib.MyTask); + foreach (var thermotempcalib in listThermoTempCalib) + ThermoSequenceFailed[thermotempcalib.MeterNumber] = TaskOperations.GetResult(ThermoTaskStarted[thermotempcalib.MeterNumber], thermotempcalib.MyTask); + #endregion + #region Sequence Ok + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + MeterSequenceOk[Meter] = !MeterSequenceFailed[Meter]; + for (UInt16 Thermo = Constants.Thermo1; Thermo < Constants.NumberOfThermometers; Thermo++) + ThermoSequenceOk[Thermo] = !ThermoSequenceFailed[Thermo]; + GenesisZeroFlow.Display.MeterStatusGreenRed(MeterSequenceOk, MeterTaskStarted); + GenesisZeroFlow.Display.ThermoStatusGreenRed(ThermoSequenceOk, ThermoTaskStarted); + #endregion + #endregion + #region Destroy tasks + foreach (var tempcalib in listTempCalib) + TaskOperations.CheckAndDispose(tempcalib.MyTask); + foreach (var thermotempcalib in listThermoTempCalib) + TaskOperations.CheckAndDispose(thermotempcalib.MyTask); + #endregion + #region Clear data + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + GenesisZeroFlow._GenesisZeroFlow.SetDataToLog(Meter, String.Empty); + #endregion + + return MeterSequenceFailed.Concat(ThermoSequenceFailed).ToArray(); + } + + public static Boolean TotalTempCal(MeterBatch globalMeterBatch, Boolean enable, Boolean adjust, Double upperTempLimit, Double lowerTempLimit, Double tempDeviationLimit, CultureInfo culture, frmTempCalibration parent) + { + #region Definitions and initializations + Boolean SequenceFailed = false; + Boolean TaskStarted = false; + Boolean TaskCompleted = false; + Double RefTemp = 0.0; + List listTempCalib = new List(); + + var currentMeter = globalMeterBatch.ListOfMeters.FirstOrDefault(m => m.Slot.Equals(Constants.Meter1 + 1)); + if (currentMeter != null) + listTempCalib.Add(new TempCalibration(Constants.Meter1, currentMeter, culture)); + else + listTempCalib.Add(new TempCalibration(Constants.Meter1, culture)); + + foreach (var tempcalib in listTempCalib) + { + tempcalib.Initialize(String.Empty, Constants.Thermo, RefTemp, upperTempLimit, lowerTempLimit, tempDeviationLimit); + tempcalib.MyTask = new Task(() => { return true; }); + } + #endregion + #region Perform tests + #region Get manually measured temperatures + if (adjust) + { + frmTempCalibration.DisplayTempCal.StatusLabel("Enter reference temperature value"); + + } + else + { + + frmTempCalibration.DisplayTempCal.StatusLabel("Press OK"); + } + GetTemperaturesTempCal(enable, parent); + Int32 NumberOfTextboxes = 0; + + if (enable) + NumberOfTextboxes++; + + if (Int32.Equals(NumberOfTextboxes, 0)) + return SequenceFailed; + #endregion + if (adjust) + { + TemperatureFieldTempCal._TemperatureFieldTempCal.SetEnabledGbLogging(false); + listTempCalib[Constants.Meter1].SetRefTemperature(TemperatureFieldTempCal._TemperatureFieldTempCal.GetValueMeter1()); + frmTempCalibration.DisplayTempCal.TempCalRefTemperatureLabel(TemperatureFieldTempCal._TemperatureFieldTempCal.GetValueMeter1().ToString("0.00", culture)); + } + else + TemperatureFieldTempCal._TemperatureFieldTempCal.SetEnabledGbLogging(true); + + foreach (var tempcalib in listTempCalib) + tempcalib.MeterTempCal(enable, ref TaskStarted, ref SequenceFailed, adjust); + #endregion + #region Wait for tasks + Boolean SequenceOk = false; + + while (!TaskCompleted) + { + foreach (var tempcalib in listTempCalib) + TaskCompleted = TaskOperations.WaitFor(TaskStarted, tempcalib.MyTask); + + Misc.WaitNSeconds(1); + + foreach (var tempcalib in listTempCalib) + SequenceFailed = TaskOperations.GetResult(TaskStarted, tempcalib.MyTask); + SequenceOk = !SequenceFailed; + frmTempCalibration.DisplayTempCal.MeterStatusGreenRed(SequenceOk, TaskStarted); + } + + foreach (var tempcalib in listTempCalib) + SequenceFailed = TaskOperations.GetResult(TaskStarted, tempcalib.MyTask); + + SequenceOk = !SequenceFailed; + frmTempCalibration.DisplayTempCal.MeterStatusGreenRed(SequenceOk, TaskStarted); + #endregion + #region Destroy tasks + foreach (var tempcalib in listTempCalib) + { + TaskOperations.CheckAndDispose(tempcalib.MyTask); + } + #endregion + #region Clear data + if (Boolean.Equals(adjust, false)) + { + frmTempCalibration.DisplayTempCal.DebugMessage($"APPLICATION:\t\t TEMPERATURE MEASUREMENT stopped\n", culture); + frmTempCalibration.DisplayTempCal.DebugMessage($"{Debugmessages.Line}", culture); + } + #endregion + + return SequenceFailed; + } + private static Boolean CheckArray(Boolean[] array) + { + Boolean Completed = true; + + for (Int32 i = 0; i < array.Count(); i++) + { + if (Boolean.Equals(array[i], false)) + return false; + } + + return Completed; + } + /// + /// For ZeroFlowCalibration tool + /// + /// + /// + private static void GetManualTemperatures(Boolean[] enable, CultureInfo culture) + { + if (Boolean.Equals(GenesisZeroFlow._GenesisZeroFlow.AbortIndicator, false)) + { + // GenesisZeroFlow.Display.SetProgressPanel(StatusPanelItems.TempCal); + GenesisZeroFlow.Display.DebugMessage($"{Constants.TwentySpaces}\tAPPLICATION:\t\t TEMPERATURE CALIBRATION sequence started\n", culture); + GenesisZeroFlow.Display.StatusLabel(GenesisZeroFlow.PredefinedMessages.WaitUntilTemperatureCalibrationFinished(culture)); + GenesisZeroFlow.Display.TemperatureField(enable); + } + else + { + GenesisZeroFlow.Display.DebugMessage($"{Constants.TwentySpaces}\tAPPLICATION:\t\t ZEROFLOW CALIBRATION sequence stopped\n", culture); + GenesisZeroFlow.Display.DebugMessage($"{Constants.TwentySpaces}\t{Debugmessages.Line}", culture); + GenesisZeroFlow._GenesisZeroFlow.StopMainSequence(GenesisZeroFlow.PredefinedMessages.ZeroflowCalibrationSequenceStopped(culture), MessageBoxIcon.Error, culture); + return; + } + } + + /// + /// For temperature calibration tool + /// + /// + private static void GetTemperaturesTempCal(Boolean enable, frmTempCalibration parent = null) + { + if (parent == null) + { + frmTempCalibration.DisplayTempCal.SetProgressPanel(StatusPanelItems.TempCal); + frmTempCalibration.DisplayTempCal.TemperatureFieldTempCal(); + } + else + { + parent.Invoke(new Action(() => + { + frmTempCalibration.DisplayTempCal.SetProgressPanel(StatusPanelItems.TempCal); + frmTempCalibration.DisplayTempCal.TemperatureFieldTempCal(); + })); + } + + } + } + public class TempCalibration + { + private readonly ZeroFlowGenesisMeter GenesisMeter; + public Task MyTask { get; internal set; } + public TempCalibration(UInt16 meterNumber, CultureInfo culture) + { + this.MeterNumber = meterNumber; + this.Culture = culture; + this.MeterIndex = (meterNumber + 1).ToString(culture); + } + public TempCalibration(UInt16 meterNumber, IMeter meter, CultureInfo culture) + { + if (meter is ZeroFlowGenesisMeter) + { + GenesisMeter = meter as ZeroFlowGenesisMeter; + } + this.MeterNumber = meterNumber; + this.Culture = culture; + this.MeterIndex = (meterNumber + 1).ToString(culture); + } + internal void Meter(Boolean[] thermoEnable, Boolean manTempAcquisition, Boolean enable, ref Boolean taskStarted, ref Boolean sequenceFailed, ref Int32 nextDelayTime, CancellationToken token) + { + #region Avoid CA1062 + if (MyTask == null) + return; + #endregion + #region Definitions and initializations + Int32 DelayTime = 0; + const Int32 DeltaDelay = 30; + DialogResult AskForActions = DialogResult.None; + Boolean _sequenceFailed = sequenceFailed; + Int32 temp = DelayTime; + Boolean Ok = false; + #endregion + #region Everything else + if ((enable) && (!TaskStatus.Equals(MyTask.Status, TaskStatus.Running)) && (!MyTask.IsCompleted)) + //if ((!TaskStatus.Equals(MyTask.Status, TaskStatus.Running)) && (!MyTask.IsCompleted)) + { + DelayTime = nextDelayTime; + nextDelayTime = nextDelayTime + DeltaDelay; + + taskStarted = true; + Misc.WaitNSeconds(temp); + + MyTask = Task.Run(() => + { + //if (enable) // tbc + //{ + while ((DialogResult.Equals(AskForActions, DialogResult.Retry)) || (DialogResult.Equals(AskForActions, DialogResult.None)) && (!token.IsCancellationRequested)) + { + #region Abort + if (!token.IsCancellationRequested) + GenesisZeroFlow.Display.AbortButtonEnabled(true); + #endregion + + String Text = String.Empty; + + #region Testprocedure + if (DialogResult.Equals(AskForActions, DialogResult.None)) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t TEMPERATURE CALIBRATION started at {this.MeterType}{this.MeterIndex}\n", this.Culture); + + Ok = this.PerformTest(thermoEnable, manTempAcquisition, PcbID, token); + + if (token.IsCancellationRequested) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t TEMPERATURE CALIBRATION stopped at {this.MeterType}{this.MeterIndex}\n", this.Culture); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + GenesisZeroFlow._GenesisZeroFlow.GenerateReturnNote(this.MeterIndex, this.PcbID, GenesisZeroFlow.PredefinedMessages.AmplitudeStopped(this.Culture), GenesisZeroFlow._GenesisZeroFlow.GetLoggingFromTextBox(), this.Culture); + return true; // sequence failed + } + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t TEMPERATURE CALIBRATION successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + GenesisZeroFlow.Display.DebugMessage($"{Constants.TwentySpaces}\t{Debugmessages.Line}", this.Culture); + _sequenceFailed = false; + AskForActions = DialogResult.OK; + } + else + { + _sequenceFailed = true; + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t TEMPERATURE CALIBRATION failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + AskForActions = DialogResult.Cancel;// MessageBox.Show($"{GenesisZeroFlow.PredefinedMessages.TemCalFailed(this.Culture)}{this.MeterIndex}", "Retry?", MessageBoxButtons.RetryCancel, MessageBoxIcon.Question); + GenesisZeroFlow._GenesisZeroFlow.GenerateReturnNote(this.MeterIndex, this.PcbID, GenesisZeroFlow.PredefinedMessages.AmplitudeFailed(this.Culture), GenesisZeroFlow._GenesisZeroFlow.GetLoggingFromTextBox(), this.Culture); + } + #endregion + } + // } + return _sequenceFailed; + + + }, token); + + } + #endregion + } + internal void MeterTempCal(Boolean enable, ref Boolean taskStarted, ref Boolean sequenceFailed, Boolean adjust) + { + #region Definitions and initializations + DialogResult AskForActions = DialogResult.None; + var _sequenceFailed = sequenceFailed; + var _adjust = adjust; + Boolean Ok = false; + #endregion + #region Avoid CA1062 + if (MyTask == null) + return; + #endregion + #region Everything else + if ((enable) && (!TaskStatus.Equals(MyTask.Status, TaskStatus.Running)) && (!MyTask.IsCompleted)) + { + taskStarted = true; + + MyTask = Task.Run(() => + { + if (_adjust) + { + while ((DialogResult.Equals(AskForActions, DialogResult.Retry)) || (DialogResult.Equals(AskForActions, DialogResult.None))) + { + #region Testprocedure + if (DialogResult.Equals(AskForActions, DialogResult.None)) + frmTempCalibration.DisplayTempCal.DebugMessage($"APPLICATION:\t\t TEMPERATURE CALIBRATION sequence started\n", this.Culture); + + Ok = this.PerformTestTempCal(); + + if (Boolean.Equals(Ok, true)) + { + frmTempCalibration.DisplayTempCal.DebugMessage($"APPLICATION:\t\t TEMPERATURE CALIBRATION sequence successful\n", this.Culture); + frmTempCalibration.DisplayTempCal.DebugMessage(Debugmessages.Line, this.Culture); + _sequenceFailed = false; + AskForActions = DialogResult.OK; + } + else + { + _sequenceFailed = true; + frmTempCalibration.DisplayTempCal.DebugMessage($"APPLICATION:\t\t TEMPERATURE CALIBRATION sequence failed\n", this.Culture); + AskForActions = MessageBox.Show($"TEMPERATURE CALIBRATION failed", "Retry?", MessageBoxButtons.RetryCancel, MessageBoxIcon.Question); + } + #endregion + } + } + else + { + frmTempCalibration.DisplayTempCal.DebugMessage($"APPLICATION:\t\t TEMPERATURE MEASUREMENT started\n", this.Culture); + } + + + return _sequenceFailed; + }); + + } + #endregion + } + internal void Thermometer(Boolean enable, ref Boolean taskStarted, ref Boolean sequenceFailed, ref Int32 nextDelayTime, CancellationToken token) + { + + #region avoid CA1062 + if ((MyTask == null)) + return; + #endregion + #region Definitions and initializations + Int32 DelayTime = 0; + const Int32 DeltaDelay = 30; + Boolean _sequenceFailed = sequenceFailed; + Boolean Ok = true; + #endregion + #region Everything else + if ((enable) && (!TaskStatus.Equals(MyTask.Status, TaskStatus.Running)) && (!MyTask.IsCompleted)) + //if (!TaskStatus.Equals(MyTask.Status, TaskStatus.Running) && (!MyTask.IsCompleted)) + { + DelayTime = nextDelayTime; + nextDelayTime = nextDelayTime + DeltaDelay; + + taskStarted = true; + Misc.WaitNSeconds(DelayTime); + + MyTask = Task.Run(() => + { + //if(enable) // tbc + //{ + Boolean LoggingIndicator = GenesisZeroFlow._GenesisZeroFlow.GetLoggingIndicatorThermoMonitoring()[MeterNumber]; + + while (LoggingIndicator && (Ok == true)) + { + #region Abort + if (!token.IsCancellationRequested) + GenesisZeroFlow.Display.AbortButtonEnabled(true); + #endregion + #region Testprocedure + Ok = this.PerformTempMonitoring(token); + if (Ok == false) + GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed = true; + //Misc.WaitNSeconds(1); + + if (token.IsCancellationRequested) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t TEMPERATURE MONITORING stopped at {this.MeterType}{this.MeterIndex}\n", this.Culture); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + return true; // sequence failed + } + if (Ok) + { + // GenesisZeroFlow.Display.DebugMessage($"APPLICATION:\t\t AMPLITUDE TEST successful at METER{MeterIndex}\t{AppendID}\n", this.Culture); + // GenesisZeroFlow.Display.DebugMessage(Debugmessages.Line, this.Culture); + _sequenceFailed = false; + + } + else + _sequenceFailed = true; + #endregion + Misc.WaitNSeconds(1); + LoggingIndicator = GenesisZeroFlow._GenesisZeroFlow.GetLoggingIndicatorThermoMonitoring()[this.MeterNumber]; + } + //} + + return _sequenceFailed; + + }, token); + } + #endregion + #region Write log data to file + //String DateTime = System.DateTime.Now.ToString(Formats.LogFileDateTimeString, this.Culture); + //if (GenesisZeroFlow._GenesisZeroFlow.GetCBMeanAmplitudeFiles()) + //{ + // Logging.WriteToFile(GenesisZeroFlow._GenesisZeroFlow.GetNumbersToLog()[MeterNumber][Constants.PATH0], $@"..\GenesisZeroFlowTest_Temperature_THERMOMETER{MeterIndex}_PATH0_{DateTime}.csv"); + // Logging.WriteToFile(GenesisZeroFlow._GenesisZeroFlow.GetNumbersToLog()[MeterNumber][Constants.PATH1], $@"..\GenesisZeroFlowTest_Temperature_THERMOMETER{MeterIndex}_PATH1_{DateTime}.csv"); + // Logging.WriteToFile(GenesisZeroFlow._GenesisZeroFlow.GetNumbersToLog()[MeterNumber][Constants.PATH2], $@"..\GenesisZeroFlowTest_Temperature_THERMOMETER{MeterIndex}_PATH2_{DateTime}.csv"); + //} + + this.ClearData(); + #endregion + } + private Boolean PerformTest(Boolean[] thermoEnable, Boolean manTempAcquisition, String pcbID, CancellationToken token) + { + this.ClearData(); + + #region Definitions and initializations + Boolean Ok = false; + const UInt16 NumberOfAvgValues = 10; + UInt16[] Values = new UInt16[Constants.NumberOfThermometers]; + Values = ArrayInit.Thermo((UInt16)0); + Double[][] Temperatures = new Double[Constants.NumberOfThermometers][]; + for (UInt16 Thermo = Constants.Thermo1; Thermo < Constants.NumberOfThermometers; Thermo++) + { + Temperatures[Thermo] = new Double[Constants.NumberOfPaths]; + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + Temperatures[Thermo][Path] = new Double(); + } + String DebugMessage = String.Empty; + #endregion + #region Automatic acquisition + if (!manTempAcquisition) + { + #region Wait for temperature values + Boolean[] GotTemperature = new Boolean[Constants.NumberOfThermometers]; + Boolean[] GotTemperaturesPaths1 = new Boolean[Constants.NumberOfPaths]; + Boolean[] GotTemperaturesPaths2 = new Boolean[Constants.NumberOfPaths]; + + GotTemperature = ArrayInit.Thermo(false); + GotTemperaturesPaths1 = ArrayInit.Path(false); + GotTemperaturesPaths2 = ArrayInit.Path(false); + + while ((!GotTemperature[Constants.Thermo1]) && (thermoEnable[Constants.Thermo1])) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t Waiting for Temperature data at {this.MeterType}{this.MeterIndex}\n", this.Culture); + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + Boolean temp = GenesisZeroFlow._GenesisZeroFlow.GetMeasuredTempsIndicator(Constants.Thermo1, Path); + GotTemperaturesPaths1[Path] = temp; + GotTemperature[Constants.Thermo1] = GotTemperaturesPaths1[Constants.PATH0] & GotTemperaturesPaths1[Constants.PATH1] & GotTemperaturesPaths1[Constants.PATH2]; + } + if (GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + return false; + Misc.WaitNSeconds(1); + } + + while ((!GotTemperature[Constants.Thermo2]) && (thermoEnable[Constants.Thermo2])) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t Waiting for Temperature data at {this.MeterType}{this.MeterIndex}\n", this.Culture); + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + GotTemperaturesPaths2[Path] = GenesisZeroFlow._GenesisZeroFlow.GetMeasuredTempsIndicator(Constants.Thermo2, Path); + GotTemperature[Constants.Thermo2] = GotTemperaturesPaths2[Constants.PATH0] & GotTemperaturesPaths2[Constants.PATH1] & GotTemperaturesPaths2[Constants.PATH2]; + } + if (GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + return false; + Misc.WaitNSeconds(1); + } + #endregion + #region Get temperatures + if (thermoEnable[Constants.Thermo1]) + { + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + var temp = GenesisZeroFlow._GenesisZeroFlow.GetMeasuredTemps(Constants.Thermo1, Path); + Temperatures[Constants.Thermo1][Path] = temp; + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t TEMPERATURE ACQUISITION at {this.MeterType}{this.MeterIndex}; PATH{Path.ToString(this.Culture)}; Value = {Math.Round(Temperatures[Constants.Thermo1][Path], 2).ToString("00.00", this.Culture)}°C\n", this.Culture); + if (GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + return false; + } + } + if (thermoEnable[Constants.Thermo2]) + { + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + Temperatures[Constants.Thermo2][Path] = GenesisZeroFlow._GenesisZeroFlow.GetMeasuredTemps(Constants.Thermo2, Path); + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t TEMPERATURE ACQUISITION at {this.MeterType}{this.MeterIndex}; PATH{Path.ToString(this.Culture)}; Value = {Math.Round(Temperatures[Constants.Thermo2][Path], 2).ToString("00.00", this.Culture)}°C\n", this.Culture); + if (GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + return false; + } + } + #endregion + #region Stop temperature monitoring + GenesisZeroFlow._GenesisZeroFlow.SetLoggingIndicatorThermoMonitoring(Constants.Thermo1, false); + GenesisZeroFlow._GenesisZeroFlow.SetLoggingIndicatorThermoMonitoring(Constants.Thermo2, false); + #endregion + #region Automatic acquisition + List Avg = new List(); + if (thermoEnable[Constants.Thermo1]) + { + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + Avg.Add(Temperatures[Constants.Thermo1][Path]); + } + if (thermoEnable[Constants.Thermo2]) + { + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + Avg.Add(Temperatures[Constants.Thermo2][Path]); + } + if (Avg.Count() > 1) + this.SetRefTemperature(Avg.Average()); + + else + { + if ((Avg.Count() == 1) && (!GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed)) + { + this.SetRefTemperature(Avg.ElementAt(0)); + } + else + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t Automatic temperature acquisition not possible at {this.MeterType}{this.MeterIndex}\n", this.Culture); + this.ClearData(); + return false; + } + } + #endregion + } + #endregion + #region Set temperature calibration register + UInt32 TempToRegister = (UInt32)(this.RefTemp * 4096); + GenesisZeroFlow.Display.StatusLabel(GenesisZeroFlow.PredefinedMessages.WaitUntilRegisterWriteFinished(Culture)); + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing 0x{TempToRegister.ToString("X", this.Culture)} to 'Temperature calibration'-register at {this.MeterType}{this.MeterIndex}\n", this.Culture); + Ok = GenesisMeter.WriteRegisterUnsafe(Register.Genesisflow.ToFTempCalibrate, TempToRegister); + + if (Ok) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing 0x{TempToRegister.ToString("X", this.Culture)} to 'Temperature calibration'-register successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + else + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing 0x{TempToRegister.ToString("X", this.Culture)} to 'Temperature calibration'-register failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + + if (!Ok || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + return false; + #endregion + #region Wait for some seconds + const UInt16 WaitingTime = 10; + Int32[] LinecounterFollowing = new Int32[Constants.NumberOfPaths]; + LinecounterFollowing = ArrayInit.Path(0); + // GenesisZeroFlow._GenesisZeroFlow.SetLoggingIndicatorAmplitudeTest(this.MeterNumber, true); + for (UInt16 Time = 0; Time < WaitingTime; Time++) + { + Ok = this.ActivityCheck(ref LinecounterFollowing, Time); + if (Ok && !GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + { + var Seconds = WaitingTime - Time; + + GenesisZeroFlow.Display.StatusLabel(GenesisZeroFlow.PredefinedMessages.WaitSeconds(Seconds, this.Culture)); + Misc.WaitNSeconds(1); + } + else + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t Activity check failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + GenesisZeroFlow._GenesisZeroFlow.SetTofIndicatorAmplitudeTest(this.MeterNumber, false); + this.ClearData(); + + return false; + } + + if (token.IsCancellationRequested || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + return false; + } + GenesisZeroFlow._GenesisZeroFlow.SetTofIndicatorAmplitudeTest(this.MeterNumber, false); + #endregion + #region Check temperature + Ok = this.CheckTemperature(NumberOfAvgValues, out DebugMessage); + if (Boolean.Equals(Ok, true)) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t Temperature check OK at {this.MeterType}{this.MeterIndex}\n", this.Culture); + else + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t Temperature check failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t Temperatures at {this.MeterType}{this.MeterIndex}: {DebugMessage}", this.Culture); + #endregion + #region Get 'TOF offset1' register + if (Constants.NumberOfPaths > 0) + { + GenesisZeroFlow.Display.StatusLabel(GenesisZeroFlow.PredefinedMessages.WaitUntilRegisterReadFinished(this.Culture)); + Ok = false; + if (token.IsCancellationRequested || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + return false; + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Reading 'TOF offset1'-register at {this.MeterType}{this.MeterIndex}\n", this.Culture); + var tmp = BitConverter.ToInt32(GenesisMeter.ReadRegister(Register.Genesisflow.ToFTempOffset1), 0); + GenesisZeroFlow._GenesisZeroFlow.SetToFTempOffset(this.MeterNumber, Constants.PATH0, tmp); + Ok = true; + if (Boolean.Equals(Ok, true)) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Reading 'TOF offset1'-register successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + else + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Reading 'TOF offset1'-register failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + if (Boolean.Equals(Ok, false) || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + return false; + } + #endregion + #region Get 'TOF offset2' register + if (Constants.NumberOfPaths > 1) + { + GenesisZeroFlow.Display.StatusLabel(GenesisZeroFlow.PredefinedMessages.WaitUntilRegisterReadFinished(this.Culture)); + Ok = false; + if (token.IsCancellationRequested || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + return false; + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Reading 'TOF offset2'-register at {this.MeterType}{this.MeterIndex}\n", this.Culture); + + var tmp = BitConverter.ToInt32(GenesisMeter.ReadRegister(Register.Genesisflow.ToFTempOffset2), 0); + GenesisZeroFlow._GenesisZeroFlow.SetToFTempOffset(this.MeterNumber, Constants.PATH1, tmp); + Ok = true; + if (Boolean.Equals(Ok, true) || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Reading 'TOF offset2'-register successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + else + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Reading 'TOF offset2'-register failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + if (Boolean.Equals(Ok, false) || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + return false; + } + #endregion + #region Get 'TOF offset3' register + if (Constants.NumberOfPaths > 2) + { + GenesisZeroFlow.Display.StatusLabel(GenesisZeroFlow.PredefinedMessages.WaitUntilRegisterReadFinished(this.Culture)); + Ok = false; + if (token.IsCancellationRequested || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + return false; + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Reading 'TOF offset3'-register at {this.MeterType}{this.MeterIndex}\n", this.Culture); + var tmp = BitConverter.ToInt32(GenesisMeter.ReadRegister(Register.Genesisflow.ToFTempOffset3), 0); + GenesisZeroFlow._GenesisZeroFlow.SetToFTempOffset(this.MeterNumber, Constants.PATH2, tmp); + Ok = true; + if (Boolean.Equals(Ok, true)) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Reading 'TOF offset3'-register successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + else + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Reading 'TOF offset3'-register failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + if (Boolean.Equals(Ok, false) || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + return false; + } + #endregion + + this.ClearData(); + return Ok; + } + private Boolean PerformTestTempCal() + { + this.ClearDataTempCal(); + + #region Definitions and initializations + Boolean Ok = false; + String DebugMessage = String.Empty; + #endregion + + UInt32 TempToRegister = (UInt32)(RefTemp * 4096); + + + try + { + #region Set temperature calibration register + frmTempCalibration.DisplayTempCal.StatusLabel("Wait until register write has finished"); + + frmTempCalibration.DisplayTempCal.DebugMessage($"COMMAND CHANNEL:\t Writing 0x{TempToRegister.ToString("X", this.Culture)} to 'Temperature calibration'-register\n", this.Culture); + var temp = BitConverter.GetBytes(TempToRegister); + Ok = GenesisMeter.WriteRegisterUnsafe(Register.Genesisflow.ToFTempCalibrate, temp); + + if (Ok) + frmTempCalibration.DisplayTempCal.DebugMessage($"COMMAND CHANNEL:\t Writing 0x{TempToRegister.ToString("X", this.Culture)} to 'Temperature calibration'-register successful\n", this.Culture); + else + frmTempCalibration.DisplayTempCal.DebugMessage($"COMMAND CHANNEL:\t Writing 0x{TempToRegister.ToString("X", this.Culture)} to 'Temperature calibration'-register failed\n", this.Culture); + if (!Ok) + return false; + #endregion + #region Wait for some seconds + const UInt16 WaitingTime = 20; + Int32[] LinecounterFollowing = new Int32[Constants.NumberOfPaths]; + LinecounterFollowing = ArrayInit.Path(0); + frmTempCalibration._frmTempCalibration.SetEnableIndicatorTempTest(true); + for (UInt16 Time = 0; Time < WaitingTime; Time++) + { + Ok = this.ActivityCheckTempCal(ref LinecounterFollowing, Time); + if (Ok) + { + frmTempCalibration.DisplayTempCal.StatusLabel($"Wait {(WaitingTime - Time).ToString(this.Culture)} seconds"); + Misc.WaitNSeconds(1); + } + else + { + frmTempCalibration.DisplayTempCal.DebugMessage($"DATA CHANNEL:\t\t Activity check failed\n", this.Culture); + frmTempCalibration._frmTempCalibration.SetEnableIndicatorTempTest(false); + this.ClearDataTempCal(); + return false; + } + } + frmTempCalibration._frmTempCalibration.SetEnableIndicatorTempTest(false); + #endregion + #region Check temperature + Ok = this.CheckTemperatureTempCal(out DebugMessage); + if (Ok) + frmTempCalibration.DisplayTempCal.DebugMessage($"APPLICATION:\t\t Temperature check OK\n", this.Culture); + else + frmTempCalibration.DisplayTempCal.DebugMessage($"APPLICATION:\t\t Temperature check failed\n", this.Culture); + frmTempCalibration.DisplayTempCal.DebugMessage($"APPLICATION:\t\t Temperatures: {DebugMessage}", this.Culture); + #endregion + this.ClearDataTempCal(); + } + catch (Exception ex) + { + ErrorLog.Log(LogErrReason.Exeption, "TempCalibration.PerformTestTempCal() failed", $"0x{ex.HResult.ToString("X", Culture)}", String.Empty, Culture); + this.ClearDataTempCal(); + } + return Ok; + } + private Boolean PerformTempMonitoring(CancellationToken token) + { + this.ClearData(); + + #region Definitions and initializations + Int32[] LinecounterFollowing = new Int32[Constants.NumberOfPaths]; + LinecounterFollowing = ArrayInit.Path(0); + Boolean Ok = true; + Int32 ActivityCheckInterval = GenesisZeroFlow._GenesisZeroFlow.GetAmplitudeActivityCheckInterval(); + Ok = this.ThermoActivityCheck(ref LinecounterFollowing, 0); + #endregion + #region Test sequence + #region Check upper value + for (UInt16 Path = 0; Path < Constants.NumberOfPaths; Path++) + { + Double temp = 0; + + try + { + + temp = GenesisZeroFlow._GenesisZeroFlow.GetTemperatures(this.MeterNumber, Path); + String Temperature = $"{Math.Round(temp, 2).ToString("00.00", this.Culture)}°C"; + + switch (this.MeterNumber) + { + case Constants.Meter1: + GenesisZeroFlow.Display.SetThermoLabel1($"{Temperature}"); + GenesisZeroFlow._GenesisZeroFlow.SetMeasuredTemps(Constants.Meter1, Path, temp); + GenesisZeroFlow._GenesisZeroFlow.SetMeasuredTempsIndicator(Constants.Meter1, Path, true); + break; + case Constants.Meter2: + GenesisZeroFlow.Display.SetThermoLabel2($"{Temperature}°C"); + GenesisZeroFlow._GenesisZeroFlow.SetMeasuredTemps(Constants.Meter2, Path, temp); + GenesisZeroFlow._GenesisZeroFlow.SetMeasuredTempsIndicator(Constants.Meter2, Path, true); + break; + default: break; + } + + if (temp > this.UpperTempLimit) + { + GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed = true; + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t TEMPERATURE MONITORING upper value check failed at {this.MeterType}{this.MeterIndex}; (actual/ limit) = {Temperature}/ {Math.Round(this.UpperTempLimit, 2).ToString("00.000", this.Culture)}°C\n", this.Culture); + return false; + } + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t TEMPERATURE MONITORING upper value successful at {this.MeterType}{this.MeterIndex}; Value = {Temperature}\t\n", this.Culture); + + if (temp < this.LowerTempLimit) + { + GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed = true; + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t TEMPERATURE MONITORING lower value check failed at {this.MeterType}{this.MeterIndex}; (actual/ limit) = {Temperature}/ {Math.Round(this.LowerTempLimit, 2).ToString("00.000", this.Culture)}°C\n", this.Culture); + return false; + } + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t TEMPERATURE MONITORING lower value successful at {this.MeterType}{this.MeterIndex}; Value = {Temperature}\n", this.Culture); + #region Deviation check + // Lower value check + if (this.GetTempDeviationMin()[Path] == 0) + this.TempDeviationMin[Path] = temp; + else + { + if (temp < this.GetTempDeviationMin()[Path]) + this.TempDeviationMin[Path] = temp; + } + // Upper value check + if (this.GetTempDeviationMax()[Path] == 0) + this.TempDeviationMax[Path] = temp; + else + { + if (temp > this.GetTempDeviationMax()[Path]) + this.TempDeviationMax[Path] = temp; + } + // Deviation check + + Double DeviationValue = this.GetTempDeviationMax()[Path] - this.GetTempDeviationMin()[Path]; + String Deviation = $"{DeviationValue.ToString("00.000", this.Culture)}°C"; + + if (DeviationValue > this.TempDeviationLimit) + { + GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed = true; + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t TEMPERATURE MONITORING deviation check failed at {this.MeterType}{this.MeterIndex}; PATH{Path.ToString(this.Culture)}; Value = {Deviation}\n", this.Culture); + return false; + } + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t TEMPERATURE MONITORING deviation check successful at {this.MeterType}{this.MeterIndex}; PATH{Path.ToString(this.Culture)}; Value = {Deviation}\n", this.Culture); + #endregion + } + catch (Exception ex) + { + GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed = true; + ErrorLog.Log(LogErrReason.Exeption, "TempCalibration.PerformTemperatureMonitoring() failed", $"0x{ex.HResult.ToString("X", this.Culture)}", String.Empty, this.Culture); + } + } + #endregion + #endregion + return Ok; + } + private Boolean CheckTemperature(UInt16 numberOfAvgValues, out String debugMessage) + { + #region Definitions and initializations + Double[] MeasTemperature = new Double[Constants.NumberOfPaths]; + Boolean TempOk = true; + List[] AvgValues = new List[Constants.NumberOfPaths]; + Double Avg = 0; + + #endregion + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + AvgValues[Path] = new List(); + for (UInt16 Values = 0; Values < numberOfAvgValues; Values++) + { + MeasTemperature[Path] = GenesisZeroFlow._GenesisZeroFlow.GetDecodedAllMeters()[this.MeterNumber][Path].TemperatureDegC; + AvgValues[Path].Add(MeasTemperature[Path]); + } + Avg = AvgValues[Path].Average(); + AvgValues[Path].Clear(); + if (Math.Abs(this.RefTemp - Avg) > this.TempDeviationLimit) + TempOk = false; + } + + #region Debug message + debugMessage = $"Ref. temp = {Math.Round(this.RefTemp, 2).ToString("00.00", this.Culture)}°C at {this.MeterType}{this.MeterIndex}; meas. PATH"; // meas. temp PATH1/2/3 = {Math.Round(MeasTemperature[Constants.PATH0], 2).ToString("00.00", this.Culture)}°C/ {Math.Round(MeasTemperature[Constants.PATH1], 2).ToString("00.00", this.Culture)}°C/ {Math.Round(MeasTemperature[Constants.PATH2], 2).ToString("0.00", this.Culture)}°C\n"; + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + debugMessage = $"{debugMessage}{Path}"; + if ((Constants.NumberOfPaths - 1) == Path) + debugMessage = $"{debugMessage}/"; + else + debugMessage = $"{debugMessage} = "; + } + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + if ((Constants.NumberOfPaths - 1) == Path) + debugMessage = $"{debugMessage}{Math.Round(MeasTemperature[Path], 2).ToString("00.00", this.Culture)}°C /"; + else + debugMessage = $"{debugMessage}{Math.Round(MeasTemperature[Path], 2).ToString("00.00", this.Culture)}°C\n"; + } + #endregion + + return TempOk; + } + private Boolean CheckTemperatureTempCal(out String debugMessage) + { + #region Definitions and initializations + Double[] MeasTemperature = new Double[Constants.NumberOfPaths]; + MeasTemperature = ArrayInit.Path((Double)0); + Boolean TempOk = true; + #endregion + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + MeasTemperature[Path] = frmTempCalibration._frmTempCalibration.GetDecodedAllMeters()[Path].TemperatureDegC; + if (Math.Abs(this.RefTemp - MeasTemperature[Path]) > this.TempDeviationLimit) + TempOk = false; + } + + #region Debug message + debugMessage = $"ref. temperature = {this.RefTemp.ToString("00.00", this.Culture)}°C; meas. temperature "; + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + debugMessage = $"{ debugMessage} PATH{(Path + 1).ToString(this.Culture)} = {Math.Round(MeasTemperature[Path], 2).ToString("00.00", this.Culture)}°C;"; + debugMessage = $"{debugMessage}\n"; + #endregion + + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + frmTempCalibration.DisplayTempCal.TempCalSetTemperatureLabel(Path, Math.Round(MeasTemperature[Path], 2).ToString("0.00", this.Culture)); + + frmTempCalibration.DisplayTempCal.TempCalRefTemperatureLabel(this.RefTemp.ToString("0.00", this.Culture)); + return TempOk; + } + private void ClearData() + { + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + + // GenesisZeroFlow.Display.EraseAmplitudeData(this.MeterNumber, Path); + // GenesisZeroFlow._GenesisZeroFlow.SetLoggingIndicatorAmplitudeTest(this.MeterNumber, false); + // GenesisZeroFlow._GenesisZeroFlow.ClearTotalTimeOfFlightAverage(this.MeterNumber, Path); + // GenesisZeroFlow._GenesisZeroFlow.SetToFTempOffset(this.MeterNumber, Path, 0); + } + } + private void ClearDataTempCal() + { + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + frmTempCalibration._frmTempCalibration.SetToFTempOffset(Path, 0); + } + private Boolean ActivityCheck(ref Int32[] lineCounterFollowing, Int32 seconds) + { + #region Definitions and initializations + Boolean Ok = true; + Boolean Error = false; + #endregion + #region Check activity + //for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + //{ + + // if (!Int32.Equals(GenesisZeroFlow._GenesisZeroFlow.GetLineCounterTemperatureTest()[this.MeterNumber][Path], 0)) + // { + // if (Int32.Equals(GenesisZeroFlow._GenesisZeroFlow.GetLineCounterTemperatureTest()[this.MeterNumber][Path], lineCounterFollowing[Path])) + // return false; + // else + // lineCounterFollowing[Path] = GenesisZeroFlow._GenesisZeroFlow.GetLineCounterTemperatureTest()[this.MeterNumber][Path]; + + // } + // if ((seconds > 0) && (Int32.Equals(GenesisZeroFlow._GenesisZeroFlow.GetLineCounterTemperatureTest()[this.MeterNumber][Path], 0))) + // return false; + //} + #endregion + #region Result + Ok = !Error; + #endregion + + return Ok; + } + private Boolean ActivityCheckTempCal(ref Int32[] lineCounterFollowing, Int32 seconds) + { + #region Definitions and initializations + Boolean Ok = true; + Boolean Error = false; + #endregion + #region Check activity + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + if (!(Int32.Equals(frmTempCalibration._frmTempCalibration.GetLineCounterTemperatureTest()[Path], 0))) + { + if (Int32.Equals(frmTempCalibration._frmTempCalibration.GetLineCounterTemperatureTest()[Path], lineCounterFollowing[Path])) + return false; + else + lineCounterFollowing[Path] = frmTempCalibration._frmTempCalibration.GetLineCounterTemperatureTest()[Path]; + + } + if ((seconds > 0) && (Int32.Equals(frmTempCalibration._frmTempCalibration.GetLineCounterTemperatureTest()[Path], 0))) + return false; + } + #endregion + #region Result + Ok = !Error; + #endregion + + return Ok; + } + private Boolean ThermoActivityCheck(ref Int32[] lineCounterFollowing, Int32 seconds) + { + #region Definitions and initializations + Boolean Ok = true; + Boolean Error = false; + #endregion + #region Check activity + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + if (!Int32.Equals(GenesisZeroFlow._GenesisZeroFlow.GetLineCounterTemperatureTest()[this.MeterNumber][Path], 0)) + { + if (Int32.Equals(GenesisZeroFlow._GenesisZeroFlow.GetLineCounterTemperatureTest()[this.MeterNumber][Path], lineCounterFollowing[Path])) + return false; + else + lineCounterFollowing[Path] = GenesisZeroFlow._GenesisZeroFlow.GetLineCounterTemperatureTest()[this.MeterNumber][Path]; + } + if ((seconds > 0) && (Boolean.Equals(GenesisZeroFlow._GenesisZeroFlow.GetLineCounterTemperatureTest()[this.MeterNumber][Path], 0))) + return false; + } + #endregion + #region Result + Ok = !Error; + #endregion + + return Ok; + } + public void SetRefTemperature(Double temp) + { + this.RefTemp = temp; + } + + public void Initialize(String pcbID, String meterType, Double refTemp, Double upperTempLimit, Double lowerTempLimit, Double tempDeviationLimit) + { + this.RefTemp = refTemp; + this.UpperTempLimit = upperTempLimit; + this.LowerTempLimit = lowerTempLimit; + this.TempDeviationLimit = tempDeviationLimit; + this.MeterType = meterType; + this.TempDeviationMin = new Double[Constants.NumberOfPaths]; + this.TempDeviationMax = new Double[Constants.NumberOfPaths]; + this.TempDeviationMin = ArrayInit.Path((Double)0); + this.TempDeviationMax = ArrayInit.Path((Double)0); + this.PcbID = pcbID; + } + public UInt16 MeterNumber { get; private set; } + public String MeterIndex { get; private set; } + public String MeterType { get; private set; } + public String PcbID { get; private set; } + public CultureInfo Culture { get; private set; } + private Double RefTemp { get; set; } + private Double UpperTempLimit { get; set; } + private Double LowerTempLimit { get; set; } + private Double TempDeviationLimit { get; set; } + private Double[] TempDeviationMin { get; set; } + private Double[] GetTempDeviationMin() + { + return (Double[])this.TempDeviationMin; + } + private Double[] TempDeviationMax { get; set; } + private Double[] GetTempDeviationMax() + { + return (Double[])this.TempDeviationMax; + } + + } +} diff --git a/ZeroFlowTool/TemperatureField.Designer.cs b/ZeroFlowTool/TemperatureField.Designer.cs new file mode 100644 index 00000000..abdb55ab --- /dev/null +++ b/ZeroFlowTool/TemperatureField.Designer.cs @@ -0,0 +1,696 @@ +namespace GenesisZeroFlow +{ + partial class TemperatureField + { + /// + /// 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(TemperatureField)); + this.nUD_TempField_Celsius1 = new System.Windows.Forms.NumericUpDown(); + this.nUD_TempField_Celsius2 = new System.Windows.Forms.NumericUpDown(); + this.nUD_TempField_Celsius3 = new System.Windows.Forms.NumericUpDown(); + this.nUD_TempField_Celsius4 = new System.Windows.Forms.NumericUpDown(); + this.nUD_TempField_Celsius5 = new System.Windows.Forms.NumericUpDown(); + this.nUD_TempField_Celsius6 = new System.Windows.Forms.NumericUpDown(); + this.nUD_TempField_Celsius7 = new System.Windows.Forms.NumericUpDown(); + this.nUD_TempField_Celsius8 = new System.Windows.Forms.NumericUpDown(); + this.nUD_TempField_Celsius9 = new System.Windows.Forms.NumericUpDown(); + this.nUD_TempField_Celsius10 = new System.Windows.Forms.NumericUpDown(); + this.l_TempField_Celsius1 = new System.Windows.Forms.Label(); + this.l_TempField_Celsius2 = new System.Windows.Forms.Label(); + this.l_TempField_Celsius3 = new System.Windows.Forms.Label(); + this.l_TempField_Celsius4 = new System.Windows.Forms.Label(); + this.l_TempField_Celsius5 = new System.Windows.Forms.Label(); + this.l_TempField_Celsius6 = new System.Windows.Forms.Label(); + this.l_TempField_Celsius7 = new System.Windows.Forms.Label(); + this.l_TempField_Celsius8 = new System.Windows.Forms.Label(); + this.l_TempField_Celsius9 = new System.Windows.Forms.Label(); + this.l_TempField_Celsius10 = new System.Windows.Forms.Label(); + this.l_TempField_Meter1 = new System.Windows.Forms.Label(); + this.l_TempField_Meter2 = new System.Windows.Forms.Label(); + this.l_TempField_Meter3 = new System.Windows.Forms.Label(); + this.l_TempField_Meter4 = new System.Windows.Forms.Label(); + this.l_TempField_Meter5 = new System.Windows.Forms.Label(); + this.l_TempField_Meter6 = new System.Windows.Forms.Label(); + this.l_TempField_Meter7 = new System.Windows.Forms.Label(); + this.l_TempField_Meter8 = new System.Windows.Forms.Label(); + this.l_TempField_Meter9 = new System.Windows.Forms.Label(); + this.l_TempField_Meter10 = new System.Windows.Forms.Label(); + this.btn_TempField_OK = new System.Windows.Forms.Button(); + this.pB_TempField_Meter = new System.Windows.Forms.PictureBox(); + this.pB_TempField_Logo = new System.Windows.Forms.PictureBox(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_TempField_Celsius1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_TempField_Celsius2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_TempField_Celsius3)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_TempField_Celsius4)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_TempField_Celsius5)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_TempField_Celsius6)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_TempField_Celsius7)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_TempField_Celsius8)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_TempField_Celsius9)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_TempField_Celsius10)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pB_TempField_Meter)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pB_TempField_Logo)).BeginInit(); + this.SuspendLayout(); + // + // nUD_TempField_Celsius1 + // + this.nUD_TempField_Celsius1.Anchor = System.Windows.Forms.AnchorStyles.None; + this.nUD_TempField_Celsius1.DecimalPlaces = 1; + this.nUD_TempField_Celsius1.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.nUD_TempField_Celsius1.Location = new System.Drawing.Point(245, 39); + this.nUD_TempField_Celsius1.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.nUD_TempField_Celsius1.Maximum = new decimal(new int[] { + 50, + 0, + 0, + 0}); + this.nUD_TempField_Celsius1.Name = "nUD_TempField_Celsius1"; + this.nUD_TempField_Celsius1.ReadOnly = true; + this.nUD_TempField_Celsius1.Size = new System.Drawing.Size(59, 20); + this.nUD_TempField_Celsius1.TabIndex = 0; + this.nUD_TempField_Celsius1.Value = new decimal(new int[] { + 25, + 0, + 0, + 0}); + // + // nUD_TempField_Celsius2 + // + this.nUD_TempField_Celsius2.Anchor = System.Windows.Forms.AnchorStyles.None; + this.nUD_TempField_Celsius2.DecimalPlaces = 1; + this.nUD_TempField_Celsius2.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.nUD_TempField_Celsius2.Location = new System.Drawing.Point(245, 70); + this.nUD_TempField_Celsius2.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.nUD_TempField_Celsius2.Maximum = new decimal(new int[] { + 50, + 0, + 0, + 0}); + this.nUD_TempField_Celsius2.Name = "nUD_TempField_Celsius2"; + this.nUD_TempField_Celsius2.ReadOnly = true; + this.nUD_TempField_Celsius2.Size = new System.Drawing.Size(59, 20); + this.nUD_TempField_Celsius2.TabIndex = 1; + this.nUD_TempField_Celsius2.Value = new decimal(new int[] { + 25, + 0, + 0, + 0}); + // + // nUD_TempField_Celsius3 + // + this.nUD_TempField_Celsius3.Anchor = System.Windows.Forms.AnchorStyles.None; + this.nUD_TempField_Celsius3.DecimalPlaces = 1; + this.nUD_TempField_Celsius3.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.nUD_TempField_Celsius3.Location = new System.Drawing.Point(245, 100); + this.nUD_TempField_Celsius3.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.nUD_TempField_Celsius3.Maximum = new decimal(new int[] { + 50, + 0, + 0, + 0}); + this.nUD_TempField_Celsius3.Name = "nUD_TempField_Celsius3"; + this.nUD_TempField_Celsius3.ReadOnly = true; + this.nUD_TempField_Celsius3.Size = new System.Drawing.Size(59, 20); + this.nUD_TempField_Celsius3.TabIndex = 1; + this.nUD_TempField_Celsius3.Value = new decimal(new int[] { + 25, + 0, + 0, + 0}); + // + // nUD_TempField_Celsius4 + // + this.nUD_TempField_Celsius4.Anchor = System.Windows.Forms.AnchorStyles.None; + this.nUD_TempField_Celsius4.DecimalPlaces = 1; + this.nUD_TempField_Celsius4.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.nUD_TempField_Celsius4.Location = new System.Drawing.Point(245, 132); + this.nUD_TempField_Celsius4.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.nUD_TempField_Celsius4.Maximum = new decimal(new int[] { + 50, + 0, + 0, + 0}); + this.nUD_TempField_Celsius4.Name = "nUD_TempField_Celsius4"; + this.nUD_TempField_Celsius4.ReadOnly = true; + this.nUD_TempField_Celsius4.Size = new System.Drawing.Size(59, 20); + this.nUD_TempField_Celsius4.TabIndex = 3; + this.nUD_TempField_Celsius4.Value = new decimal(new int[] { + 25, + 0, + 0, + 0}); + // + // nUD_TempField_Celsius5 + // + this.nUD_TempField_Celsius5.Anchor = System.Windows.Forms.AnchorStyles.None; + this.nUD_TempField_Celsius5.DecimalPlaces = 1; + this.nUD_TempField_Celsius5.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.nUD_TempField_Celsius5.Location = new System.Drawing.Point(245, 165); + this.nUD_TempField_Celsius5.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.nUD_TempField_Celsius5.Maximum = new decimal(new int[] { + 50, + 0, + 0, + 0}); + this.nUD_TempField_Celsius5.Name = "nUD_TempField_Celsius5"; + this.nUD_TempField_Celsius5.ReadOnly = true; + this.nUD_TempField_Celsius5.Size = new System.Drawing.Size(59, 20); + this.nUD_TempField_Celsius5.TabIndex = 4; + this.nUD_TempField_Celsius5.Value = new decimal(new int[] { + 25, + 0, + 0, + 0}); + // + // nUD_TempField_Celsius6 + // + this.nUD_TempField_Celsius6.Anchor = System.Windows.Forms.AnchorStyles.None; + this.nUD_TempField_Celsius6.DecimalPlaces = 1; + this.nUD_TempField_Celsius6.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.nUD_TempField_Celsius6.Location = new System.Drawing.Point(245, 197); + this.nUD_TempField_Celsius6.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.nUD_TempField_Celsius6.Maximum = new decimal(new int[] { + 50, + 0, + 0, + 0}); + this.nUD_TempField_Celsius6.Name = "nUD_TempField_Celsius6"; + this.nUD_TempField_Celsius6.ReadOnly = true; + this.nUD_TempField_Celsius6.Size = new System.Drawing.Size(59, 20); + this.nUD_TempField_Celsius6.TabIndex = 5; + this.nUD_TempField_Celsius6.Value = new decimal(new int[] { + 25, + 0, + 0, + 0}); + // + // nUD_TempField_Celsius7 + // + this.nUD_TempField_Celsius7.Anchor = System.Windows.Forms.AnchorStyles.None; + this.nUD_TempField_Celsius7.DecimalPlaces = 1; + this.nUD_TempField_Celsius7.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.nUD_TempField_Celsius7.Location = new System.Drawing.Point(245, 231); + this.nUD_TempField_Celsius7.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.nUD_TempField_Celsius7.Maximum = new decimal(new int[] { + 50, + 0, + 0, + 0}); + this.nUD_TempField_Celsius7.Name = "nUD_TempField_Celsius7"; + this.nUD_TempField_Celsius7.ReadOnly = true; + this.nUD_TempField_Celsius7.Size = new System.Drawing.Size(59, 20); + this.nUD_TempField_Celsius7.TabIndex = 6; + this.nUD_TempField_Celsius7.Value = new decimal(new int[] { + 25, + 0, + 0, + 0}); + // + // nUD_TempField_Celsius8 + // + this.nUD_TempField_Celsius8.Anchor = System.Windows.Forms.AnchorStyles.None; + this.nUD_TempField_Celsius8.DecimalPlaces = 1; + this.nUD_TempField_Celsius8.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.nUD_TempField_Celsius8.Location = new System.Drawing.Point(245, 266); + this.nUD_TempField_Celsius8.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.nUD_TempField_Celsius8.Maximum = new decimal(new int[] { + 50, + 0, + 0, + 0}); + this.nUD_TempField_Celsius8.Name = "nUD_TempField_Celsius8"; + this.nUD_TempField_Celsius8.ReadOnly = true; + this.nUD_TempField_Celsius8.Size = new System.Drawing.Size(59, 20); + this.nUD_TempField_Celsius8.TabIndex = 7; + this.nUD_TempField_Celsius8.Value = new decimal(new int[] { + 25, + 0, + 0, + 0}); + // + // nUD_TempField_Celsius9 + // + this.nUD_TempField_Celsius9.Anchor = System.Windows.Forms.AnchorStyles.None; + this.nUD_TempField_Celsius9.DecimalPlaces = 1; + this.nUD_TempField_Celsius9.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.nUD_TempField_Celsius9.Location = new System.Drawing.Point(245, 299); + this.nUD_TempField_Celsius9.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.nUD_TempField_Celsius9.Maximum = new decimal(new int[] { + 50, + 0, + 0, + 0}); + this.nUD_TempField_Celsius9.Name = "nUD_TempField_Celsius9"; + this.nUD_TempField_Celsius9.ReadOnly = true; + this.nUD_TempField_Celsius9.Size = new System.Drawing.Size(59, 20); + this.nUD_TempField_Celsius9.TabIndex = 8; + this.nUD_TempField_Celsius9.Value = new decimal(new int[] { + 25, + 0, + 0, + 0}); + // + // nUD_TempField_Celsius10 + // + this.nUD_TempField_Celsius10.Anchor = System.Windows.Forms.AnchorStyles.None; + this.nUD_TempField_Celsius10.DecimalPlaces = 1; + this.nUD_TempField_Celsius10.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.nUD_TempField_Celsius10.Location = new System.Drawing.Point(245, 333); + this.nUD_TempField_Celsius10.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.nUD_TempField_Celsius10.Maximum = new decimal(new int[] { + 50, + 0, + 0, + 0}); + this.nUD_TempField_Celsius10.Name = "nUD_TempField_Celsius10"; + this.nUD_TempField_Celsius10.ReadOnly = true; + this.nUD_TempField_Celsius10.Size = new System.Drawing.Size(59, 20); + this.nUD_TempField_Celsius10.TabIndex = 9; + this.nUD_TempField_Celsius10.Value = new decimal(new int[] { + 25, + 0, + 0, + 0}); + // + // l_TempField_Celsius1 + // + this.l_TempField_Celsius1.Anchor = System.Windows.Forms.AnchorStyles.None; + this.l_TempField_Celsius1.AutoSize = true; + this.l_TempField_Celsius1.Location = new System.Drawing.Point(309, 43); + this.l_TempField_Celsius1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TempField_Celsius1.Name = "l_TempField_Celsius1"; + this.l_TempField_Celsius1.Size = new System.Drawing.Size(18, 13); + this.l_TempField_Celsius1.TabIndex = 12; + this.l_TempField_Celsius1.Text = "°C"; + // + // l_TempField_Celsius2 + // + this.l_TempField_Celsius2.Anchor = System.Windows.Forms.AnchorStyles.None; + this.l_TempField_Celsius2.AutoSize = true; + this.l_TempField_Celsius2.Location = new System.Drawing.Point(309, 74); + this.l_TempField_Celsius2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TempField_Celsius2.Name = "l_TempField_Celsius2"; + this.l_TempField_Celsius2.Size = new System.Drawing.Size(18, 13); + this.l_TempField_Celsius2.TabIndex = 13; + this.l_TempField_Celsius2.Text = "°C"; + // + // l_TempField_Celsius3 + // + this.l_TempField_Celsius3.Anchor = System.Windows.Forms.AnchorStyles.None; + this.l_TempField_Celsius3.AutoSize = true; + this.l_TempField_Celsius3.Location = new System.Drawing.Point(309, 104); + this.l_TempField_Celsius3.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TempField_Celsius3.Name = "l_TempField_Celsius3"; + this.l_TempField_Celsius3.Size = new System.Drawing.Size(18, 13); + this.l_TempField_Celsius3.TabIndex = 28; + this.l_TempField_Celsius3.Text = "°C"; + // + // l_TempField_Celsius4 + // + this.l_TempField_Celsius4.Anchor = System.Windows.Forms.AnchorStyles.None; + this.l_TempField_Celsius4.AutoSize = true; + this.l_TempField_Celsius4.Location = new System.Drawing.Point(309, 134); + this.l_TempField_Celsius4.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TempField_Celsius4.Name = "l_TempField_Celsius4"; + this.l_TempField_Celsius4.Size = new System.Drawing.Size(18, 13); + this.l_TempField_Celsius4.TabIndex = 29; + this.l_TempField_Celsius4.Text = "°C"; + // + // l_TempField_Celsius5 + // + this.l_TempField_Celsius5.Anchor = System.Windows.Forms.AnchorStyles.None; + this.l_TempField_Celsius5.AutoSize = true; + this.l_TempField_Celsius5.Location = new System.Drawing.Point(309, 167); + this.l_TempField_Celsius5.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TempField_Celsius5.Name = "l_TempField_Celsius5"; + this.l_TempField_Celsius5.Size = new System.Drawing.Size(18, 13); + this.l_TempField_Celsius5.TabIndex = 30; + this.l_TempField_Celsius5.Text = "°C"; + // + // l_TempField_Celsius6 + // + this.l_TempField_Celsius6.Anchor = System.Windows.Forms.AnchorStyles.None; + this.l_TempField_Celsius6.AutoSize = true; + this.l_TempField_Celsius6.Location = new System.Drawing.Point(309, 199); + this.l_TempField_Celsius6.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TempField_Celsius6.Name = "l_TempField_Celsius6"; + this.l_TempField_Celsius6.Size = new System.Drawing.Size(18, 13); + this.l_TempField_Celsius6.TabIndex = 31; + this.l_TempField_Celsius6.Text = "°C"; + // + // l_TempField_Celsius7 + // + this.l_TempField_Celsius7.Anchor = System.Windows.Forms.AnchorStyles.None; + this.l_TempField_Celsius7.AutoSize = true; + this.l_TempField_Celsius7.Location = new System.Drawing.Point(309, 232); + this.l_TempField_Celsius7.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TempField_Celsius7.Name = "l_TempField_Celsius7"; + this.l_TempField_Celsius7.Size = new System.Drawing.Size(18, 13); + this.l_TempField_Celsius7.TabIndex = 32; + this.l_TempField_Celsius7.Text = "°C"; + // + // l_TempField_Celsius8 + // + this.l_TempField_Celsius8.Anchor = System.Windows.Forms.AnchorStyles.None; + this.l_TempField_Celsius8.AutoSize = true; + this.l_TempField_Celsius8.Location = new System.Drawing.Point(309, 266); + this.l_TempField_Celsius8.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TempField_Celsius8.Name = "l_TempField_Celsius8"; + this.l_TempField_Celsius8.Size = new System.Drawing.Size(18, 13); + this.l_TempField_Celsius8.TabIndex = 33; + this.l_TempField_Celsius8.Text = "°C"; + // + // l_TempField_Celsius9 + // + this.l_TempField_Celsius9.Anchor = System.Windows.Forms.AnchorStyles.None; + this.l_TempField_Celsius9.AutoSize = true; + this.l_TempField_Celsius9.Location = new System.Drawing.Point(309, 301); + this.l_TempField_Celsius9.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TempField_Celsius9.Name = "l_TempField_Celsius9"; + this.l_TempField_Celsius9.Size = new System.Drawing.Size(18, 13); + this.l_TempField_Celsius9.TabIndex = 34; + this.l_TempField_Celsius9.Text = "°C"; + // + // l_TempField_Celsius10 + // + this.l_TempField_Celsius10.Anchor = System.Windows.Forms.AnchorStyles.None; + this.l_TempField_Celsius10.AutoSize = true; + this.l_TempField_Celsius10.Location = new System.Drawing.Point(309, 335); + this.l_TempField_Celsius10.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TempField_Celsius10.Name = "l_TempField_Celsius10"; + this.l_TempField_Celsius10.Size = new System.Drawing.Size(18, 13); + this.l_TempField_Celsius10.TabIndex = 35; + this.l_TempField_Celsius10.Text = "°C"; + // + // l_TempField_Meter1 + // + this.l_TempField_Meter1.Anchor = System.Windows.Forms.AnchorStyles.None; + this.l_TempField_Meter1.AutoSize = true; + this.l_TempField_Meter1.Location = new System.Drawing.Point(164, 41); + this.l_TempField_Meter1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TempField_Meter1.Name = "l_TempField_Meter1"; + this.l_TempField_Meter1.Size = new System.Drawing.Size(54, 13); + this.l_TempField_Meter1.TabIndex = 36; + this.l_TempField_Meter1.Text = "METER1:"; + // + // l_TempField_Meter2 + // + this.l_TempField_Meter2.Anchor = System.Windows.Forms.AnchorStyles.None; + this.l_TempField_Meter2.AutoSize = true; + this.l_TempField_Meter2.Location = new System.Drawing.Point(164, 72); + this.l_TempField_Meter2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TempField_Meter2.Name = "l_TempField_Meter2"; + this.l_TempField_Meter2.Size = new System.Drawing.Size(54, 13); + this.l_TempField_Meter2.TabIndex = 37; + this.l_TempField_Meter2.Text = "METER2:"; + // + // l_TempField_Meter3 + // + this.l_TempField_Meter3.Anchor = System.Windows.Forms.AnchorStyles.None; + this.l_TempField_Meter3.AutoSize = true; + this.l_TempField_Meter3.Location = new System.Drawing.Point(164, 102); + this.l_TempField_Meter3.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TempField_Meter3.Name = "l_TempField_Meter3"; + this.l_TempField_Meter3.Size = new System.Drawing.Size(54, 13); + this.l_TempField_Meter3.TabIndex = 38; + this.l_TempField_Meter3.Text = "METER3:"; + // + // l_TempField_Meter4 + // + this.l_TempField_Meter4.Anchor = System.Windows.Forms.AnchorStyles.None; + this.l_TempField_Meter4.AutoSize = true; + this.l_TempField_Meter4.Location = new System.Drawing.Point(164, 134); + this.l_TempField_Meter4.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TempField_Meter4.Name = "l_TempField_Meter4"; + this.l_TempField_Meter4.Size = new System.Drawing.Size(54, 13); + this.l_TempField_Meter4.TabIndex = 39; + this.l_TempField_Meter4.Text = "METER4:"; + // + // l_TempField_Meter5 + // + this.l_TempField_Meter5.Anchor = System.Windows.Forms.AnchorStyles.None; + this.l_TempField_Meter5.AutoSize = true; + this.l_TempField_Meter5.Location = new System.Drawing.Point(164, 167); + this.l_TempField_Meter5.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TempField_Meter5.Name = "l_TempField_Meter5"; + this.l_TempField_Meter5.Size = new System.Drawing.Size(54, 13); + this.l_TempField_Meter5.TabIndex = 40; + this.l_TempField_Meter5.Text = "METER5:"; + // + // l_TempField_Meter6 + // + this.l_TempField_Meter6.Anchor = System.Windows.Forms.AnchorStyles.None; + this.l_TempField_Meter6.AutoSize = true; + this.l_TempField_Meter6.Location = new System.Drawing.Point(164, 199); + this.l_TempField_Meter6.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TempField_Meter6.Name = "l_TempField_Meter6"; + this.l_TempField_Meter6.Size = new System.Drawing.Size(54, 13); + this.l_TempField_Meter6.TabIndex = 41; + this.l_TempField_Meter6.Text = "METER6:"; + // + // l_TempField_Meter7 + // + this.l_TempField_Meter7.Anchor = System.Windows.Forms.AnchorStyles.None; + this.l_TempField_Meter7.AutoSize = true; + this.l_TempField_Meter7.Location = new System.Drawing.Point(164, 232); + this.l_TempField_Meter7.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TempField_Meter7.Name = "l_TempField_Meter7"; + this.l_TempField_Meter7.Size = new System.Drawing.Size(54, 13); + this.l_TempField_Meter7.TabIndex = 42; + this.l_TempField_Meter7.Text = "METER7:"; + // + // l_TempField_Meter8 + // + this.l_TempField_Meter8.Anchor = System.Windows.Forms.AnchorStyles.None; + this.l_TempField_Meter8.AutoSize = true; + this.l_TempField_Meter8.Location = new System.Drawing.Point(164, 266); + this.l_TempField_Meter8.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TempField_Meter8.Name = "l_TempField_Meter8"; + this.l_TempField_Meter8.Size = new System.Drawing.Size(54, 13); + this.l_TempField_Meter8.TabIndex = 43; + this.l_TempField_Meter8.Text = "METER8:"; + // + // l_TempField_Meter9 + // + this.l_TempField_Meter9.Anchor = System.Windows.Forms.AnchorStyles.None; + this.l_TempField_Meter9.AutoSize = true; + this.l_TempField_Meter9.Location = new System.Drawing.Point(164, 301); + this.l_TempField_Meter9.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TempField_Meter9.Name = "l_TempField_Meter9"; + this.l_TempField_Meter9.Size = new System.Drawing.Size(54, 13); + this.l_TempField_Meter9.TabIndex = 44; + this.l_TempField_Meter9.Text = "METER9:"; + // + // l_TempField_Meter10 + // + this.l_TempField_Meter10.Anchor = System.Windows.Forms.AnchorStyles.None; + this.l_TempField_Meter10.AutoSize = true; + this.l_TempField_Meter10.Location = new System.Drawing.Point(164, 335); + this.l_TempField_Meter10.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TempField_Meter10.Name = "l_TempField_Meter10"; + this.l_TempField_Meter10.Size = new System.Drawing.Size(60, 13); + this.l_TempField_Meter10.TabIndex = 45; + this.l_TempField_Meter10.Text = "METER10:"; + // + // btn_TempField_OK + // + this.btn_TempField_OK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btn_TempField_OK.Location = new System.Drawing.Point(432, 309); + this.btn_TempField_OK.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.btn_TempField_OK.Name = "btn_TempField_OK"; + this.btn_TempField_OK.Size = new System.Drawing.Size(100, 42); + this.btn_TempField_OK.TabIndex = 46; + this.btn_TempField_OK.Text = "OK"; + this.btn_TempField_OK.UseVisualStyleBackColor = true; + this.btn_TempField_OK.Click += new System.EventHandler(this.btn_TempField_OK_Click); + // + // pB_TempField_Meter + // + this.pB_TempField_Meter.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.pB_TempField_Meter.BackColor = System.Drawing.Color.Transparent; + this.pB_TempField_Meter.ErrorImage = ((System.Drawing.Image)(resources.GetObject("pB_TempField_Meter.ErrorImage"))); + this.pB_TempField_Meter.Image = ((System.Drawing.Image)(resources.GetObject("pB_TempField_Meter.Image"))); + this.pB_TempField_Meter.InitialImage = ((System.Drawing.Image)(resources.GetObject("pB_TempField_Meter.InitialImage"))); + this.pB_TempField_Meter.Location = new System.Drawing.Point(465, 72); + this.pB_TempField_Meter.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.pB_TempField_Meter.Name = "pB_TempField_Meter"; + this.pB_TempField_Meter.Size = new System.Drawing.Size(50, 41); + this.pB_TempField_Meter.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pB_TempField_Meter.TabIndex = 27; + this.pB_TempField_Meter.TabStop = false; + // + // pB_TempField_Logo + // + this.pB_TempField_Logo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.pB_TempField_Logo.Image = ((System.Drawing.Image)(resources.GetObject("pB_TempField_Logo.Image"))); + this.pB_TempField_Logo.InitialImage = null; + this.pB_TempField_Logo.Location = new System.Drawing.Point(447, 20); + this.pB_TempField_Logo.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.pB_TempField_Logo.Name = "pB_TempField_Logo"; + this.pB_TempField_Logo.Size = new System.Drawing.Size(86, 39); + this.pB_TempField_Logo.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pB_TempField_Logo.TabIndex = 14; + this.pB_TempField_Logo.TabStop = false; + // + // TemperatureField + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.AliceBlue; + this.ClientSize = new System.Drawing.Size(557, 391); + this.Controls.Add(this.btn_TempField_OK); + this.Controls.Add(this.l_TempField_Meter10); + this.Controls.Add(this.l_TempField_Meter9); + this.Controls.Add(this.l_TempField_Meter8); + this.Controls.Add(this.l_TempField_Meter7); + this.Controls.Add(this.l_TempField_Meter6); + this.Controls.Add(this.l_TempField_Meter5); + this.Controls.Add(this.l_TempField_Meter4); + this.Controls.Add(this.l_TempField_Meter3); + this.Controls.Add(this.l_TempField_Meter2); + this.Controls.Add(this.l_TempField_Meter1); + this.Controls.Add(this.l_TempField_Celsius10); + this.Controls.Add(this.l_TempField_Celsius9); + this.Controls.Add(this.l_TempField_Celsius8); + this.Controls.Add(this.l_TempField_Celsius7); + this.Controls.Add(this.l_TempField_Celsius6); + this.Controls.Add(this.l_TempField_Celsius5); + this.Controls.Add(this.l_TempField_Celsius4); + this.Controls.Add(this.l_TempField_Celsius3); + this.Controls.Add(this.pB_TempField_Meter); + this.Controls.Add(this.pB_TempField_Logo); + this.Controls.Add(this.l_TempField_Celsius2); + this.Controls.Add(this.l_TempField_Celsius1); + this.Controls.Add(this.nUD_TempField_Celsius10); + this.Controls.Add(this.nUD_TempField_Celsius9); + this.Controls.Add(this.nUD_TempField_Celsius8); + this.Controls.Add(this.nUD_TempField_Celsius7); + this.Controls.Add(this.nUD_TempField_Celsius6); + this.Controls.Add(this.nUD_TempField_Celsius5); + this.Controls.Add(this.nUD_TempField_Celsius4); + this.Controls.Add(this.nUD_TempField_Celsius3); + this.Controls.Add(this.nUD_TempField_Celsius2); + this.Controls.Add(this.nUD_TempField_Celsius1); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.Name = "TemperatureField"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "SENSUS Hannover - Set temperature"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.TemperatureField_FormClosing); + ((System.ComponentModel.ISupportInitialize)(this.nUD_TempField_Celsius1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_TempField_Celsius2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_TempField_Celsius3)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_TempField_Celsius4)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_TempField_Celsius5)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_TempField_Celsius6)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_TempField_Celsius7)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_TempField_Celsius8)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_TempField_Celsius9)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_TempField_Celsius10)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pB_TempField_Meter)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pB_TempField_Logo)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.Label l_TempField_Celsius1; + private System.Windows.Forms.Label l_TempField_Celsius2; + private System.Windows.Forms.PictureBox pB_TempField_Logo; + private System.Windows.Forms.PictureBox pB_TempField_Meter; + private System.Windows.Forms.Label l_TempField_Celsius3; + private System.Windows.Forms.Label l_TempField_Celsius4; + private System.Windows.Forms.Label l_TempField_Celsius5; + private System.Windows.Forms.Label l_TempField_Celsius6; + private System.Windows.Forms.Label l_TempField_Celsius7; + private System.Windows.Forms.Label l_TempField_Celsius8; + private System.Windows.Forms.Label l_TempField_Celsius9; + private System.Windows.Forms.Label l_TempField_Celsius10; + private System.Windows.Forms.Label l_TempField_Meter1; + private System.Windows.Forms.Label l_TempField_Meter2; + private System.Windows.Forms.Label l_TempField_Meter3; + private System.Windows.Forms.Label l_TempField_Meter4; + private System.Windows.Forms.Label l_TempField_Meter5; + private System.Windows.Forms.Label l_TempField_Meter6; + private System.Windows.Forms.Label l_TempField_Meter7; + private System.Windows.Forms.Label l_TempField_Meter8; + private System.Windows.Forms.Label l_TempField_Meter9; + private System.Windows.Forms.Label l_TempField_Meter10; + private System.Windows.Forms.Button btn_TempField_OK; + private System.Windows.Forms.NumericUpDown nUD_TempField_Celsius1; + private System.Windows.Forms.NumericUpDown nUD_TempField_Celsius2; + private System.Windows.Forms.NumericUpDown nUD_TempField_Celsius3; + private System.Windows.Forms.NumericUpDown nUD_TempField_Celsius4; + private System.Windows.Forms.NumericUpDown nUD_TempField_Celsius5; + private System.Windows.Forms.NumericUpDown nUD_TempField_Celsius6; + private System.Windows.Forms.NumericUpDown nUD_TempField_Celsius7; + private System.Windows.Forms.NumericUpDown nUD_TempField_Celsius8; + private System.Windows.Forms.NumericUpDown nUD_TempField_Celsius9; + private System.Windows.Forms.NumericUpDown nUD_TempField_Celsius10; + } +} \ No newline at end of file diff --git a/ZeroFlowTool/TemperatureField.cs b/ZeroFlowTool/TemperatureField.cs new file mode 100644 index 00000000..e03ede0b --- /dev/null +++ b/ZeroFlowTool/TemperatureField.cs @@ -0,0 +1,127 @@ +using System; +using System.Windows.Forms; + +namespace GenesisZeroFlow +{ + + public partial class TemperatureField : Form + { + public TemperatureField() + { + InitializeComponent(); + _TemperatureField = this; + } + public static TemperatureField _TemperatureField; + private void TemperatureField_FormClosing(object sender, FormClosingEventArgs e) + { + GenesisZeroFlow._GenesisZeroFlow.EnableMaintab(); + } + public void SetMeter1(Boolean enabled) + { + l_TempField_Celsius1.Enabled = enabled; + l_TempField_Meter1.Enabled = enabled; + nUD_TempField_Celsius1.Enabled = enabled; + } + public void SetMeter2(Boolean enabled) + { + l_TempField_Celsius2.Enabled = enabled; + l_TempField_Meter2.Enabled = enabled; + nUD_TempField_Celsius2.Enabled = enabled; + } + public void SetMeter3(Boolean enabled) + { + l_TempField_Celsius3.Enabled = enabled; + l_TempField_Meter3.Enabled = enabled; + nUD_TempField_Celsius3.Enabled = enabled; + } + public void SetMeter4(Boolean enabled) + { + l_TempField_Celsius4.Enabled = enabled; + l_TempField_Meter4.Enabled = enabled; + nUD_TempField_Celsius4.Enabled = enabled; + } + public void SetMeter5(Boolean enabled) + { + l_TempField_Celsius5.Enabled = enabled; + l_TempField_Meter5.Enabled = enabled; + nUD_TempField_Celsius5.Enabled = enabled; + } + public void SetMeter6(Boolean enabled) + { + l_TempField_Celsius6.Enabled = enabled; + l_TempField_Meter6.Enabled = enabled; + nUD_TempField_Celsius6.Enabled = enabled; + } + public void SetMeter7(Boolean enabled) + { + l_TempField_Celsius7.Enabled = enabled; + l_TempField_Meter7.Enabled = enabled; + nUD_TempField_Celsius7.Enabled = enabled; + } + public void SetMeter8(Boolean enabled) + { + l_TempField_Celsius8.Enabled = enabled; + l_TempField_Meter8.Enabled = enabled; + nUD_TempField_Celsius8.Enabled = enabled; + } + public void SetMeter9(Boolean enabled) + { + l_TempField_Celsius9.Enabled = enabled; + l_TempField_Meter9.Enabled = enabled; + nUD_TempField_Celsius9.Enabled = enabled; + } + public void SetMeter10(Boolean enabled) + { + l_TempField_Celsius10.Enabled = enabled; + l_TempField_Meter10.Enabled = enabled; + nUD_TempField_Celsius10.Enabled = enabled; + } + + + public Double GetValueMeter1() + { + return (Double)nUD_TempField_Celsius1.Value; + } + public Double GetValueMeter2() + { + return (Double)nUD_TempField_Celsius2.Value; + } + public Double GetValueMeter3() + { + return (Double)nUD_TempField_Celsius3.Value; + } + public Double GetValueMeter4() + { + return (Double)nUD_TempField_Celsius4.Value; + } + public Double GetValueMeter5() + { + return (Double)nUD_TempField_Celsius5.Value; + } + public Double GetValueMeter6() + { + return (Double)nUD_TempField_Celsius6.Value; + } + public Double GetValueMeter7() + { + return (Double)nUD_TempField_Celsius7.Value; + } + public Double GetValueMeter8() + { + return (Double)nUD_TempField_Celsius8.Value; + } + public Double GetValueMeter9() + { + return (Double)nUD_TempField_Celsius9.Value; + } + public Double GetValueMeter10() + { + return (Double)nUD_TempField_Celsius10.Value; + } + private void btn_TempField_OK_Click(object sender, EventArgs e) + { + TemperatureField._TemperatureField.Close(); + GenesisZeroFlow._GenesisZeroFlow.SetWaitForTemperatureField(false); + } + } +} diff --git a/ZeroFlowTool/TemperatureField.resx b/ZeroFlowTool/TemperatureField.resx new file mode 100644 index 00000000..ae6a9bdd --- /dev/null +++ b/ZeroFlowTool/TemperatureField.resx @@ -0,0 +1,18849 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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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 + xCU28YlRnGIVr5jFLXbxi2EcYxnPOIQBAQA7 + + + + + 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 + jpnmkORYIhCzzdGGmtl33h7/GnK8pflJJ500KM1NlG/fvj3s2oW/4PR4PB5Pv8Wlucfj8XhGZNu2jwf+ + 3SvMP/zw/TgAmDPn7vDQI1viQGa8pfmrb70W+4XgxnWI81lHHhb7xnaw9GzC+nRp3iZKhJeg+tQoqc3H + Tw1N/fcKS+saVF/8nGqC+7I2e252A/dlbakM7xYlwq0tB9fWwFK7BhPhOVQti/ASlAhnQa7g2hqUCC+B + pXYNJsJzqNpUjHeCpXYNLMgVqjaV4d2iRDhLbwXXKlQti+4mWJArVC2L7iZYkCtULYvuJliQK1StkuM5 + WHorWJArVK2S4zlYejfRr9J8+cplYeXqFXG2OWQ5JnSgDnJ8vKU51jSfMmVKPJfm5VggzT/+GOfWHo/H + 4+mnuDT3eDwez4hgTfPdu3eGnTtxwr8nHHnkEeHee++Jg5h1G9aOuzRHX6+9/XpsR3+owyxz9INlW+w2 + 3WB9ujRvEyXCS1B9auw4yR0/NTT13yt2zNei+uLnVBPcl7XZc7MbuC9rYxFeghLh1paDa2tgqV2DifAc + qpZFeAlKhLMgV3BtDUqEl8BSuwYT4TlUbSrGO8FSuwYW5ApVm8rwblEinKW3gmsVqpZFdxMsyBWqlkV3 + EyzIFaqWRXcTLMgVqlbJ8RwsvRUsyBWqVsnxHCy9m+hHaf4PX/5SFOUQ45DiOB9duHhBFOC4zXhL82OO + OSYceuihcXb53//+93hOjeu8trnH4/F4+icuzT0ej8cjMrQ0y+9//9s403zt2tVx8PLAlvsnxPIsuA2u + W519CWipFLY+XZq3iRLhJag+Nfb7zx0/NTT13yt2zNei+uLnVBPcl7XZc7MbuC9rS2V4tygRbm05uLYG + lto1mAjPoWpZhJegRDgLcgXX1qBEeAkstWswEZ5D1aZivBMstWtgQa5QtakM7xYlwll6K7hWoWpZdDfB + glyhall0N8GCXKFqWXQ3wYJcoWqVHM/B0lvBglyhapUcz8HSu4l+lObXXn9N+MKXjgqLliyMsnz+wnlx + XfNlK5aGOXPvmRBrmp922mmDS7Ts2LEjXiK///3v913zeDweT7/EpbnH4/F4RmT79k8G/h36MtCDD54R + 7rxzdli1ZmBAtnLZuEtz9PeTX/409gVx8svf/SpMmjYpCiNIb5aeTVifLs3bRInwElSfGiW1+fipoan/ + XmFpXYPqi59TTXBf1mbPzW7gvqwtleHdokS4teXg2hpYatdgIjyHqmURXoIS4daWg2trUCK8BJbaNZgI + z6FqUzHeCZbaNbAgV6jaVIZ3ixLhLL0VXKtQtSy6m2BBrlC1LLqbYEGuULUsuptgQa5QtUqO52DprWBB + rlC1So7nYOndRD9Kc3whPZZowXUI8TXrVkdpDlEOkT7e0vzYY48N/+N//I/wX//rfw0ffvhhXJblT3/6 + 0zB57vF4PJ7+iUtzj8fj8YjsCe+/jz8r3RM++2x3nDGzYcO6OEiZCMuzYEY5+sZa5q+/80YUYZhp/saP + 3ox9svRswvp0ad4mSoSXoPrUKKnNx08NTf33CkvrGlRf/JxqgvuyNntudgP3ZW2pDO8WJcKtLQfX1sBS + uwYT4TlULYvwEpQIZ0Gu4NoalAgvgaV2DSbCc6jaVIx3gqV2DSzIFao2leHdokQ4S28F1ypULYvuJliQ + K1Qti+4mWJArVC2L7iZYkCtUrZLjOVh6K1iQK1StkuM5WHo30Y/SHEyeOinOMrf/wxeC4mcI8/GW5vgi + 0HPOOSeeN6df/rlt27Z91zwej8fTL3Fp7vF4PB6RoeVZIM0nT54UFi1aENZvHBhErlstpTkExlhJc4ht + 1GGZFtSgbdLAIKpGCHOfLs3bQonwElSfGjtOcsdPDU399wpL6xpUX/ycaoL7sjZ7bnYD92VtqQzvFiXC + rS0H19bAUrsGE+E5VC2L8BKUCGdBruDaGpQIL4Gldg0syBWqNhXjnWCpXQMLcoWqTWV4tygRztJbwbUK + VcuiuwkW5ApVy6K7CRbkClXLorsJFuQKVavkeA6W3k0oKd70/02w9G6iX6X5lGmT47IsmFkOcH3u/HvD + vAVzhy3RghnoWP8cUt3EOUtzLPVy9bVXhe9ffWW48qrvBcjzy664NFxy2cXhwosvCOdfeF449/xzwtnn + nhXOOOv0cNoZp3b1RaCYbT5t2rSB8+fP4hk1wtc9Ho/H0z9xae7xeDwekXJpDnHh0nyiMLSvFGo/tIsS + 4SWoPjV2nOSOnxqa+u8VltY1qL74OdUE92Vt9tzsBu7L2lIZ3i1KhFtbDq6tgaV2DSbCc6haFuElKBHO + glzBtTUoEV4CS+0aTITnULWpGO8ES+0aWJArVG0qw7tFiXCW3gquVahaFt1NsCBXqFoW3U2wIFeoWhbd + TbAgV6haJcdzsPRuwqX5SGql+b3z5rg093g8Hk/rcWnu8Xg8HhGX5v3N0L5SqP3QLkqEl6D61Nhxkjt+ + amjqv1dYWteg+uLnVBPcl7XZc7MbuC9rS2V4tygRbm05uLYGlto1mAjPoWpZhJegRDgLcgXX1qBEeAks + tWswEZ5D1aZivBMstWtgQa5QtakM7xYlwll6K7hWoWpZdDfBglyhall0N8GCXKFqWXQ3wYJcoWqVHM/B + 0rsJl+YjcWnu8Xg8nokUl+Yej8fjEelfac636Qbu06V5WygRXoLqU2PHSe74qaGp/15haV2D6oufU01w + X9Zmz81u4L6sLZXh3aJEuLXl4NoaWGrXYCI8h6plEV6CEuEsyBVcW4MS4SWw1K7BRHgOVZuK8U6w1K6B + BblC1aYyvFuUCGfpreBahapl0d0EC3KFqmXR3QQLcoWqZdHdBAtyhapVcjwHS+8mXJqPpFSaYy1zl+Ye + j8fjGa24NPd4PB6PiEvz/mZoXynUfmgXJcJLUH1q7DjJHT81NPXfKyyta1B98XOqCe7L2uy52Q3cl7Wl + MrxblAi3thxcWwNL7RpMhOdQtSzCS1AinAW5gmtrUCK8BJbaNZgIz6FqUzHeCZbaNbAgV6jaVIZ3ixLh + LL0VXKtQtSy6m2BBrlC1LLqbYEGuULUsuptgQa5QtUqO52Dp3YRL85G4NPd4PB7PRIpLc4/H4/GI9K80 + Z+HZDdynS/O2UCK8BNWnxo6T3PFTQ1P/vcLSugbVFz+nmuC+rM2em93AfVlbKsO7RYlwa8vBtTWw1K7B + RHgOVcsivAQlwlmQK7i2BiXCS2CpXYOJ8ByqNhXjnWCpXQMLcoWqTWV4tygRztJbwbUKVcuiuwkW5ApV + y6K7CRbkClXLorsJFuQKVavkeA6W3k24NB9JqTT35Vk8Ho/HM5pxae7xeDweEZfm/c3QvlKo/dAuSoSX + oPrU2HGSO35qaOq/V1ha16D64udUE9yXtdlzsxu4L2tLZXi3KBFubTm4tgaW2jWYCM+halmEl6BEOAty + BdfWoER4CSy1azARnkPVpmK8Eyy1a2BBrlC1qQzvFiXCWXoruFahall0N8GCXKFqWXQ3wYJcoWpZdDfB + glyhapUcz8HSuwmX5iNxae7xeDyeiRSX5h6Px+MRcWne3wztK4XaD+2iRHgJqk+NHSe546eGpv57haV1 + Daovfk41wX1Zmz03u4H7srZUhneLEuHWloNra2CpXYOJ8ByqlkV4CUqEsyBXcG0NSoSXwFK7BhPhOVRt + KsY7wVK7BhbkClWbyvBuUSKcpbeCaxWqlkV3EyzIFaqWRXcTLMgVqpZFdxMsyBWqVsnxHCy9m3BpPhKX + 5h6Px+OZSHFp7vF4PB6RvbIcl3v27ApTpkwKS5YsChs3b4jSfNN9G8P9D94XpQCLDJPmJowgqEx0QZCZ + YGNpZ/KPpSVj8pKlr0vzJob2lULth3ZRIrwE1afGjhM7jjodS93S1H+v8PFfg+qLRXYT3Je12XOzG7gv + a0tleLcoEW5tObi2BpbaNbAgV6haJcS7QYlwFuQKrq1BifASWGrXYO8pOVStkuM5WGrXwIJcoWqVEO8G + JcJZeiu4VqFqWXQ3wYJcoWpZdDfBglyhall0N8GCXKFqlRzPwdK7CSXFrS0H1ypYejfRj9Ic7ZMmTwoL + Fs2P1yHMIcvxM8Q5hDm46547B6X57XfcNijOm6T55d+9LFx6+SXhoksuDBdcdH4474JzwznnnR3OPPuM + cPqZp4VTTz8lnHTKieH4E48bFOYuzT0ej2f/jUtzj8fj8YhoaY4Z5i7N+4GhfaVQ+6FdlAgvQfWpsePE + jqNOx1K3NPXfK3z816D6YpHdBPdlbfbc7Abuy9pSGd4tSoRbWw6urYGldg0syBWqVgnxblAinAW5gmtr + UCK8BJbaNdh7Sg5Vq+R4DpbaNbAgV6haJcS7QYlwlt4KrlWoWhbdTbAgV6haFt1NsCBXqFoW3U2wIFeo + WiXHcyg5nkOJcBbkCq5VsPRu4kCS5hDmLs09Ho/HUxqX5h6Px+MRcWne3wztK4XaD+2iRHgJqk+NHSd2 + HHU6lrqlqf9e4eO/BtUXi+wmuC9rs+dmN3Bf1pbK8G5RItzacnBtDSy1a2BBrlC1Soh3gxLhLMgVXFuD + EuElsNSuwd5TcqhaJcdzsNSugQW5QtUqId4NSoSz9FZwrULVsuhuggW5QtWy6G6CBblC1bLoboIFuULV + KjmeQ8nxHEqEsyBXcK2CpXcTLs1dmns8Ho+nc1yaezwej0ekf6U536YbuE+X5m2hRHgJqk+NHSd2HHU6 + lrqlqf9e4eO/BtUXi+wmuC9rs+dmN3Bf1pbK8G5RItzacnBtDSy1a2BBrlC1Soh3gxLhLMgVXFuDEuEl + sNSuwd5TcqhaJcdzsNSugQW5QtUqId4NSoSz9FZwrULVsuhuggW5QtWy6G6CBblC1bLoboIFuULVKjme + Q8nxHEqEsyBXcK2CpXcTLs1dmns8Ho+nc1yaezwej0fEpXl/M7SvFGo/tIsS4SWoPjV2nNhx1OlY6pam + /nuFj/8aVF8sspvgvqzNnpvdwH1ZWyrDu0WJcGvLwbU1sNSugQW5QtUqId4NSoSzIFdwbQ1KhJfAUrsG + e0/JoWqVHM/BUrsGFuQKVauEeDcoEc7SW8G1ClXLorsJFuQKVcuiuwkW5ApVy6K7CRbkClWr5HgOJcdz + KBHOglzBtQqW3k24NHdp7vF4PJ7OcWnu8Xg8HhFfnqW/GdpXCrUf2kWJ8BJUnxo7Tuw46nQsdUtT/73C + x38Nqi8W2U1wX9Zmz81u4L6sLZXh3aJEuLXl4NoaWGrXwIJcoWqVEO8GJcJZkCu4tgYlwktgqV2Dvafk + ULVKjudgqV0DC3KFqlVCvBuUCGfpreBahapl0d0EC3KFqmXR3QQLcoWqZdHdBAtyhapVcjyHkuM5lAhn + Qa7gWgVL7yZcmrs093g8Hk/nuDT3eDwej4hL8/5maF8p1H5oFyXCS1B9auw4seOo07HULU399wof/zWo + vlhkN8F9WZs9N7uB+7K2VIZ3ixLh1paDa2tgqV0DC3KFqlVCvBuUCGdBruDaGpQIL4Gldg32npJD1So5 + noOldg0syBWqVgnxblAinKW3gmsVqpZFdxMsyBWqlkV3EyzIFaqWRXcTLMgVqlbJ8RxKjudQIpwFuYJr + FSy9m3Bp7tLc4/F4PJ3j0tzj8Xg8Ii7N+5uhfaVQ+6FdlAgvQfWpsePEjqNOx1K3NPXfK3z816D6YpHd + BPdlbfbc7Abuy9pSGd4tSoRbWw6urYGldg0syBWqVgnxblAinAW5gmtrUCK8BJbaNdh7Sg5Vq+R4Dpba + NbAgV6haJcS7QYlwlt4KrlWoWhbdTbAgV6haFt1NsCBXqFoW3U2wIFeoWiXHcyg5nkOJcBbkCq5VsPRu + wqW5S3OPx+PxdI5Lc4/H4/GMyM6dnw78u1eYb9v2cZg58+Cwbt2aOGBZu35NuO+BzVGaQwZAWECUROEC + YTMAyyNIKsgxlm0s7Uz+sbRkTF6y9IUsRz/4/9fefj2KtEnTJoWX33gl9snSswnr06V5mygRXoLqU2PH + CYtka6ulqf9e4eO/V1J5zc+zHE23LyGV38DacnBtDakEL4Wldg32+pZD1Soh3g1KhLMgV3BtDakEL4Wl + dg0mwnOoWiXHc7DUrsFEeA5Vq4R4NygRztJbwbUKVcuiuwkW5ApVy6K7CRbkClXLorsJFuQKVavkeA4l + x3MoEc6CXMG1CpbeTfSjNAeQ5vj/VWtWhjlz7wkLFy+IwhzgZ3D3nLuiOL/jrtmD4vy22beGm265cVCc + X3fDteGa664OV13z/UFxfsX3Lg+XXXFpuPjSi8KFF18Qzr/wvHDu+eeEs845M5xx1uldSfNjjjkmTJo0 + pFk++uijeLl9+/Z46fF4PJ7+iUtzj8fj8YzI7t07w44dOLnfE3bt2hFP/levXhkeeezhKMzHW5pDfPzq + 97+O8hwSbdKUSfE6+mHh2Q3Wp0vzNkkleCmqT40dJ3YcdTqWuqWp/17h479XlPS2thxNty9BiXBry8G1 + NaQSvBSW2jXY61sOVauEeDcoEc6CXMG1NaQSvBSW2jWYCM+halMx3gmW2jWYCM+hapUQ7wYlwll6K7hW + oWpZdDfBglyhall0N8GCXKFqWXQ3wYJcoWqVHM+h5HgOJcJZkCu4VsHSu4l+lObLViwN0w+aFsU4RPjy + lcvCilXLoxjH/+ekOYT5WEhzCPOTTz45HHnkkeHXv/713pPqgezZs2ffNY/H4/H0U1yaezwej2dEMMMc + whzMmDEt3H//5jB37pw4iNm4ecO4S/M3f/xWlEN2O0hzzDjHTHO0sfRswvp0ad4mqQQvRfWpsePEjqNO + x1K3NPXfK3z894qS3taWo+n2JSgRbm05uLaGVIKXwlK7Bnt9y6FqlRDvBiXCrS0H19aQSvBSWGrXYCI8 + h6pVcjwHS+0aTITnULVKiHeDEuEsvRVcq1C1LLqbYEGuULUsuptgQa5QtSy6m2BBrlC1So7nUHI8hxLh + LMgVXKtg6d1EP0pzLMeCmeaYZY4lAzG7HEuzYIkWLMsy3tL8zDPPDP/6r/8apkyZEnbvxjKHIezYsSP8 + +c9/jtc9Ho/H019xae7xeDwekT1xtjmWZsEs84UL54dly5aEzfdvigOVibA8C26Dvn7yy5+GmUccGgfo + 7/zsR3FbWHo2YX26NG8TJcJLUH1q7Dix46jTsdQtTf33Ch//vaKkt7XlaLp9CUqEW1sOrq0hleClsNSu + wV7fcqhaJcS7QYlwFuQKrq2BBXgNLLVrMBGeQ9UqOZ6DpXYNJsJzqFolxLtBiXCW3gquVahaFt1NsCBX + qFoW3U2wIFeoWhbdTbAgV6haJcdzKDmeQ4lwFuQKrlWw9G6iH6U5lgiENMcEDshwzDyHMIck77Q8y1hJ + 86OPPjp85zvfiWuaI5988km8RP7+97/vu+bxeDyefolLc4/H4/GMiC3NAiDNly5dHObNuzdK8y0PPzju + 0hz1kNuvvPlqvG4zzXE/uGTp2YT16dK8TZQIL0H1qbHjxI6jTsdStzT13yt8/PeKkt7WlqPp9iUoEW5t + Obi2hlSCl8JSuwZ7fcuhapUQ7wYlwlmQK7i2hlSCl8JSuwYT4TlUrZLjOVhq12AiPIeqVUK8G5QIZ+mt + 4FqFqmXR3QQLcoWqZdHdBAtyhapl0d0EC3KFqlVyPIeS4zmUCGdBruBaBUvvJvpRmkOIr1y9IopzfCk9 + ZpdDmqN+7vx7x12an3XWWVGaT548OXz44Yfh/fff33devSNeejwej6e/4tLc4/F4PCJ7Z5rbeubLly+N + S7Ss27A2rh053tIcYhy3xXVIooNmHRyXZsF2uDQHQ/tKofZDuygRXoLqU2PHCUtpPn5qaOq/V/j47xUl + va0tR9PtS1Ai3NpycG0NqQQvhaV2Dfb6lkPVKiHeDUqEW1sOrq2BBXgNLLVrMBGeQ9UqOZ6DpXYNJsJz + qFolxLtBiXCW3gquVahaFt1NsCBXqFoW3U2wIFeoWhbdTbAgV6haJcdzKDmeQ4lwFuQKrlWw9G6iH6U5 + hLlJ8zvvviPW2RItWLplvKX5cccdF77xjW+ECy64IBx66KHxjPqDDz6Il59+ii/Z93g8Hk8/xaW5x+Px + eEYEa5pjaRabaQ5pvnjxwijMIc7HW5rjvn77p9/F+3j1rdfiTPPX33kjXsc2sfRswvp0ad4mSoSXoPrU + 2HHCUpqPnxqa+u8VPv57RUlva8vRdPsSlAi3thxcW0MqwUthqV2Dvb7lULVKiHeDEuEsyBVcW0MqwUth + qV2DifAcqlbJ8RwstWswEZ5D1Soh3g1KhLP0VnCtQtWy6G6CBblC1bLoboIFuULVsuhuggW5QtUqOZ5D + yfEcSoSzIFdwrYKldxP9KM0XLVkYhfhBh8yI56K4ji8EhUiHIB9vaX788cdHvv3tb8fz523btsXzal/T + 3OPxePozLs09Ho/HI7InfPDBe/Fy+vSpcU3zdevWRGG+eu2qcZfmL73+cpRDWNscTDtkehygY01zn2kO + hvaVQu2HdlEivATVp8aOE5bSfPzU0NR/r/Dx3ytKeltbjqbbl6BEuLXl4NoaUgleCkvtGuz1LYeqVUK8 + G5QIt7YcXFtDKsFLYaldg4nwHKpWyfEcLLVrMBGeQ9UqId4NSoSz9FZwrULVsuhuggW5QtWy6G6CBblC + 1bLoboIFuULVKjmeQ8nxHEqEsyBXcK2CpXcT/SjNrR0zzbEcC36GJIdMnwjLsxx77LHhxBNPDKecckqU + 5hz7YlCPx+Px9E9cmns8Ho9nRD77DCf2e5domTp1clzTfOXKvbPM8eVLoy3NWVrmYPk7adqkeDsIb67p + BhPJLs3bRInwElSfQ/CxMhqo+2Lp3St8/PeKkt7WlqPp9iUoEW5tObi2hlSCl8JSuwZ7fcuhapUQ7wYl + wlmQK7i2hlSCl8JSuwYT4TlUrZLjOVhq12AiPIeqVUK8G5QIZ+mt4FqFqmXR3QQLcoWqZdHdBAtyhapl + 0d0EC3KFqlVyPIeS4zmUCGdBruBaBUvvJvpRmuOLP7EUy+Spk6IoR5stzYK1zXPSHLPRu5Hm373yinD5 + dy8Ll1x2cbjokgvDBRedH8674Nxw9rlnhTPPPiOcfuZp4eRTTxqU5gykOdYzP+mkk6I8Z2n+2Wef7bvm + 8Xg8nn6KS3OPx+PxjIhLcyWi+4mRopxR+6FdlAgvQfU5BB8ro4G6L5bevcLHf68o6W1tOZpuX4IS4daW + g2trSCV4KSy1a7DXtxyqVgnxblAinAW5gmtrSCV4KSy1azARnkPVKjmeg6V2DSbCc6haJcS7QYlwlt4K + rlWoWhbdTbAgV6haFt1NsCBXqFoW3U2wIFeoWiXHcyg5nkOJcBbkCq5VsPRu4kCS5t3ONHdp7vF4PB6O + S3OPx+PxjIhLcyWi+4mRopxR+6FdlAgvQfU5BB8ro4G6L5bevcLHf68o6W1tOZpuX4IS4daWg2trSCV4 + KSy1a7DXtxyqVgnxblAinAW5gmtrSCV4KSy1azARnkPVKjmeg6V2DSbCc6haJcS7QYlwlt4KrlWoWhbd + TbAgV6haFt1NsCBXqFoW3U2wIFeoWiXHcyg5nkOJcBbkCq5VsPRuwqW5S3OPx+PxdI5Lc4/H4/GMiEtz + JaL7iZGinFH7oV2UCC9B9TkEHyujgbovlt69wsd/ryjpbW05mm5fghLh1paDa2tIJXgpLLVrsNe3HKpW + CfFuUCKcBbmCa2tIJXgpLLVrMBGeQ9UqOZ6DpXYNJsJzqFolxLtBiXCW3gquVahaFt1NsCBXqFoW3U2w + IFeoWhbdTbAgV6haJcdzKDmeQ4lwFuQKrlWw9G7CpXnv0jyuY+7S3OPxePbbuDT3eDwez4i4NFciup8Y + KcoZtR/aRYnwElSfQ/CxMhqo+2Lp3St8/PeKkt7WlqPp9iUoEW5tObi2hlSCl8JSuwZ7fcuhapUQ7wYl + wlmQK7i2hlSCl8JSuwYT4TlUrZLjOVhq12AiPIeqVUK8G5QIZ+mt4FqFqmXR3QQLcoWqZdHdBAtyhapl + 0d0EC3KFqlVyPIeS4zmUCGdBruBaBUvvJlyauzT3eDweT+e4NPd4PB7PiLg0VyK6nxgpyhm1H9pFifAS + VJ9D8LEyGqj7YundK3z894qS3taWo+n2JSgRbm05uLaGVIKXwlK7Bnt9y6FqlRDvBiXCWZAruLaGVIKX + wlK7BhPhOVStkuM5WGrXYCI8h6pVQrwblAhn6a3gWoWqZdHdBAtyhapl0d0EC3KFqmXR3QQLcoWqVXI8 + h5LjOZQIZ0Gu4FoFS+8mXJr78iwej8fj6RyX5h6Px+MZEZfmSkT3EyNFOaP2Q7soEV6C6nMIPlZGA3Vf + LL17hY//XlHS29pyNN2+BCXCrS0H19aQSvBSWGrXYK9vOVStEuLdoEQ4C3IF19aQSvBSWGrXYCI8h6pV + cjwHS+0aTITnULVKiHeDEuEsvRVcq1C1LLqbYEGuULUsuptgQa5QtSy6m2BBrlC1So7nUHI8hxLhLMgV + XKtg6d2ES3OX5h6Px+PpHJfmHo/H4xkRl+ZKRPcTI0U5o/ZDuygRXoLqcwg+VkYDdV8svXuFj/9eUdLb + 2nI03b4EJcKtLQfX1pBK8FJYatdgr285VK0S4t2gRDgLcgXX1pBK8FJYatdgIjyHqlVyPAdL7RpMhOdQ + tUqId4MS4Sy9FVyrULUsuptgQa5QtSy6m2BBrlC1LLqbYEGuULVKjudQcjyHEuEsyBVcq2Dp3YRLc5fm + Ho/H4+kcl+Yej8fjEdkT2bVrR5g2bUpYtmxJWLNmVdiwaX2U5hDmDz70QBQQJi8gWx59amvY+gxE+eOR + J597Ijz1PKT5k+HpF54Kz7z4dOTZHzwzyHM/fDby/EvPDcLSMgfLX5fmKSNFOaP2Q7soEV6C6nMIE9mj + hbovJb9rYWndK0p6W1uOptuXoEQ4C3IF19agRHgJLLVrYEGuULVKiHeDEuEsyBVcW4MS4SWw1K6BBblC + 1aZivBMstWtgQV6DkuM5lAhn6a3gWoWqZdHdBAtyhapl0d0EC3KFqmXR3QQLcoWqVXI8h5LjOZQIZ0Gu + 4FoFS+8mJqI0hxQ3UnkOmqT5vfPmRO659+4ozu+8+45BcX77HbeFm2+9aVCcX3/jdeHa668JV1971aA4 + 70aan3r6KeHEk08Ix51w7KAwx3Xg0tzj8Xj2r7g093g8Ho+IlubrN65zad4XjBTljNoP7aJEeAmqzyFM + ZI8W6r6U/K6FpXWvKOltbTmabl+CEuEsyBVcW4MS4SWw1K6BBblC1Soh3g1KhLMgV3BtDUqEl8BSuwYW + 5ApVm4rxTigRXoIS4SUoOZ5DiXCW3gquVahaFt1NsCBXqFoW3U2wIFeoWhbdTbAgV6haJcdzKDmeQ4lw + FuQKrlWw9G7iQJLmEOajKc1NnLs093g8nv0rLs09Ho/HI+LSvL8ZKcoZtR/aRYnwElSfQ5jIHi3UfSn5 + XQtL615R0tvacjTdvgQlwlmQK7i2BiXCS2CpXQMLcoWqVUK8G5QIZ0Gu4NoalAgvgaV2DSzIFao2FeOd + UCK8BCXCS1ByPIcS4Sy9FVyrULUsuptgQa5QtSy6m2BBrlC1LLqbYEGuULVKjudQcjyHEuEsyBVcq2Dp + 3YRLc5fmHo/H4+kcl+Yej8fjEXFp3t+MFOWM2g/tokR4CarPIUxkjxbqvpT8roWlda8o6W1tOZpuX4IS + 4SzIFVxbgxLhJbDUroEFuULVKiHeDUqEsyBXcG0NSoSXwFK7BhbkClWbivFOKBFeghLhJSg5nkOJcJbe + Cq5VqFoW3U2wIFeoWhbdTbAgV6haFt1NsCBXqFolx3MoOZ5DiXAW5AquVbD0bsKluUtzj8fj8XSOS3OP + x+PxiLg0729GinJG7Yd2USK8BNXnECayRwt1X0p+18LSuleU9La2HE23L0GJcBbkCq6tQYnwElhq18CC + XKFqlRDvBiXCWZAruLYGJcJLYKldAwtyhapNxXgnlAgvQYnwEpQcz6FEOEtvBdcqVC2L7iZYkCtULYvu + JliQK1Qti+4mWJArVK2S4zmUHM+hRDgLcgXXKlh6N+HS3KW5x+PxeDrHpbnH4/F4RFya9zcjRTmj9kO7 + KBFegupzCBPZo4W6LyW/a2Fp3StKeltbjqbbl6BEOAtyBdfWoER4CSy1a2BBrlC1Soh3gxLhLMgVXFuD + EuElsNSugQW5QtWmYrwTSoSXoER4CUqO51AinKW3gmsVqpZFdxMsyBWqlkV3EyzIFaqWRXcTLMgVqlbJ + 8RxKjudQIpwFuYJrFSy9m3Bp7tLc4/F4PJ3j0tzj8Xg8Ii7N+5uRopxR+6FdlAgvQfU5hIns0ULdl5Lf + tbC07hUlva0tR9PtS1AinAW5gmtrUCK8BJbaNbAgV6haJcS7QYlwFuQKrq1BifASWGrXwIJcoWpTMd4J + JcJLUCK8BCXHcygRztJbwbUKVcuiuwkW5ApVy6K7CRbkClXLorsJFuQKVavkeA4lx3MoEc6CXMG1Cpbe + Tbg0d2nu8Xg8ns5xae7xeDweEZfm/c1IUc6o/dAuSoSXoPocwkT2aKHuS8nvWlha94qS3taWo+n2JSgR + zoJcwbU1KBFeAkvtGliQK1StEuLdoEQ4C3IF19agRHgJLLVrYEGuULWpGO+EEuElKBFegpLjOZQIZ+mt + 4FqFqmXR3QQLcoWqZdHdBAtyhapl0d0EC3KFqlVyPIeS4zmUCGdBruBaBUvvJlyauzT3eDweT+e4NPd4 + PB6PyF5pvnPnp2Hq1MlRmq9cuTxsvn9TBNL8gS33R4EAcQHREoUNJM8AYyHNIbchMyHMra1bIZxK5JEo + Ed1PqMc0hNon7aJEeAmqzyFMZI8W6r6U/K6FpXWvKOltbTmabl+CEuEsyBVcW4MS4SWw1K6BBblC1Soh + 3g1KhFtbDq6tQYnwElhq18CCXKFqlRzPkUrwUpQIL0HJ8RxKhLP0VnCtQtWy6G6CBblC1bLoboIFuULV + suhuggW5QtUqOZ5DyfEcSoSzIFdwrYKldxNKiltbDq5VKFHOKFHONEnz1WtXhbnz7w1Tpg2cmw7UQI6v + WLV8UJbnpPnsO2/vSpp/7/vfDVd87/Jw6eWXhIsvvShcePEF4fwLzwvnnHd2OOucMwel+UmnnBiOP/G4 + KMu/c9wxgxx33HHh+OOPD1/96lfDlClT4hn1p59+GrZt2xavezwej6e/4tLc4/F4PCJ7wq9+9Yt4iZky + y5cvDY8//lhYtWZl2LBpvUvzCY96TEOofdIuSoSXoPocwkT2aKHuS8nvWlha94qS3taWo+n2JSgRzoJc + wbU1KBFeAkvtGliQK1StEuLdoES4teXg2hqUCC+BpXYNLMgVqlbJ8RypBC9FifASlBzPoUQ4S28F1ypU + LYvuJliQK1Qti+4mWJArVC2L7iZYkCtUrZLjOZQcz6FEOAtyBdcqlBzPoUQ4C3IF1yqUKGeUKGeapDlm + l0OIzzh4epgz957w8KMPRQGOujZmmvcqzSHMAWacf+5znwt/+ctf9p5WD2Tnzp37rnk8Ho+nX+LS3OPx + eDwjsmfPLvwbhTlmma9duzosXDg/rNuwNjz0yBaX5hMe9ZiGUPukXZQIL0H1OYSJ7NFC3ZeS37WwtO4V + Jb2tLUfT7UtQIpwFuYJra1AivASW2jWwIFeoWiXEu0GJcGvLwbU1KBFeAkvtGliQK1StkuM5UgleihLh + JSg5nkOJcJbeCq5VqFoW3U2wIFeoWhbdTbAgV6haFt1NsCBXqFolx3MoOZ5DiXAW5AquVSg5nkOJcBbk + Cq5VKFHOKFHONElzSHCcgx7+ucPCXffcGSX4fQ9sDtfdcG1YuXrFuEtzzDC/8MILw9FHHz1seZb3339/ + 3zWPx+Px9FNcmns8Ho9HZE/429/+Ek/458y5OzzyyENxTfO169fEwYlL84mOekxDqH3SLkqEl6D6HMJE + 9mih7kvJ71pYWveKkt7WlqPp9iUoEc6CXMG1NSgRXgJL7RpYkCtUrRLi3aBEuLXl4NoalAgvgaV2DSzI + FapWyfEcqQQvRYnwEpQcz6FEOEtvBdcqVC2L7iZYkCtULYvuJliQK1Qti+4mWJArVK2S4zmUHM+hRDgL + cgXXKpQcz6FEOAtyBdcqlChnlChnmqS5iXHI7qO++Pm4XAt+xv+ZMB9PaX7qqadGcY5lWliaI7t37953 + zePxeDz9EpfmHo/H4xmR7ds/Gfh3TzjiiMPCokULIitWLIuzzNesW+3SfMKjHtMQap+0ixLhJag+hzCR + PVqo+1LyuxaW1r2ipLe15Wi6fQlKhLMgV3BtDUqEl8BSuwYW5ApVq4R4NygRbm05uLYGJcJLYKldAwty + hapVcjxHKsFLUSK8BCXHcygRztJbwbUKVcuiuwkW5ApVy6K7CRbkClXLorsJFuQKVavkeA4lx3MoEc6C + XMG1CiXHcygRzoJcwbUKJcoZJcqZJmmOdvzV4/KVy8KkyZPCLbfdHM9LFy5eECX5RJDmxxxzTLjgggui + NMfyLB988IF/EajH4/H0aVyaezwej0dkT9i9e2eYNm1KWLp0cdi8eWO4++4743rmkOUuzSc66jENofZJ + uygRXoLqcwgT2aOFui8lv2thad0rSnpbW46m25egRDgLcgXX1qBEeAkstWtgQa5QtUqId4MS4daWg2tr + UCK8BJbaNbAgV6haJcdzpBK8FCXCS1ByPIcS4Sy9FVyrULUsuptgQa5QtSy6m2BBrlC1LLqbYEGuULVK + judQcjyHEuEsyBVcq1ByPIcS4SzIFVyrUKKcUaKcaZLmWLccf/GILwOFNF+waH6U5JiBjuVaxluan3zy + yeGkk04K//N//s9w0UUXhcMPP3zfefXeLwT1eDweT3/FpbnH4/F4RmTbto8H/t27pvncuXPi0iybNm2I + M80xMHFpPtFRj2kItU/aRYnwElSfQ5jIHi3UfSn5XQtL615R0tvacjTdvgQlwlmQK7i2BiXCS2CpXQML + coWqVUK8G5QIt7YcXFuDEuElsNSugQW5QtUqOZ4jleClKBFegpLjOZQIZ+mt4FqFqmXR3QQLcoWqZdHd + BAtyhapl0d0EC3KFqlVyPIeS4zmUCGdBruBahZLjOZQIZ0Gu4FqFEuWMEuVMkzSfv3BePA/Fl4BOP2ha + nHEOOY46E+bjKc2/+c1vhhNPPDGccsop4Stf+UqYPHlyePfdd+O5tX8RqMfj8fRfXJp7PB6PZ0Tsi0Bn + zJgWl2bZuHFgULp2dRycdJppbqLHpfl4ox7TEGqftIsS4SWoPocwkT1aqPtS8rsWlta9oqS3teVoun0J + SoSzIFdwbQ1KhJfAUrsGFuQKVcsivAQlwq0tB9fWoER4CSy1a2BBrlC1So7nSCV4KUqEl6DkeA4lwll6 + K7hWoWpZdDfBglyhall0N8GCXKFqWXQ3wYJcoWqVHM+h5HgOJcJZkCu4VqHkeA4lwlmQK7hWoUQ5o0Q5 + 0yTNV6xaHqU41jLHTHNIcSzPgstFSxaOuzT/9re/Hc4444zwrW99K3znO98Jhx56aFzL3IW5x+Px9Gdc + mns8Ho9nRD4LeyIYkECUY5CCNSSxPAv+LPbBhx4IWx5+MDz86EPh0a2PhK1PPBYef3JrBKLH5BQEl4ky + CDYl7Uwk5qRlDpfmnVCPaQi1T9pFifASVJ9D8LEyGqj7YundK3z894qS3taWo+n2JSgRbm05uLYGFuA1 + sNSugQW5QtWmMrxblAhnQa7g2hqUCC+BpXYNLMgVqlbJ8RxKhJegRHgJSo7nUCKcpbeCaxWqlkV3EyzI + a2DprWBBrlC1LLqbYEGuULVKjudQcjyHEuEsyBVcq1ByPIcS4SzIFVyrUKKcUaKcUbWLli8eZMHShXHb + 5y9ZECZNnxx/BvMWzw9zF83LSvPZd94epTnWQDdxfsNN14frbrg2XHPd1YPiPJXmJs7Pu+DcKM7POOv0 + cNoZp4aTTz0pnHDS8eG4E46N4tw4/viBtuOOi8L8hBNOiH+xaeuZ+7rmHo/H039xae7xeDyeEelFmgOT + UxBcJsog2JS0M5GYk5Y5XJp3Qj2mIdQ+aRclwktQfQ7Bx8pooO6LpXev8PHfK0p6W1uOptuXoES4teXg + 2hpYgNfAUrsGFuQKVauEeDcoEc6CXMG1NSgRXgJL7RpYkCtUrZLjOZQIL0GJ8BKUHM+hRDhLbwXXKlSt + kuM5lAgvgaW3ggW5QtWy6G6CBblC1So5nkPJ8RxKhLMgV3CtIhXjnVAinAW5gmsVLL0VLMgVqrYNaW4z + zcdDmu/Zs2fvubVLc4/H4+m7uDT3eDwez4i4NFciup9Qj2kItU/aRYnwElSfQ/CxMhqo+2Lp3St8/PeK + kt7WlqPp9iUoEW5tObi2BhbgNbDUroEFuULVKiHeDUqEsyBXcG0NSoSXwFK7BhbkClWr5HgOJcJLUCK8 + BCXHcygRztJbwbUKVavkeA4lwktg6a1gQa5QtSy6m2BBrlC1So7nUHI8hxLhLMgVXKtIxXgnlAhnQa7g + WgVLbwULcoWqdWnu8Xg8nvGKS3OPx+PxjIhLcyWi+wn1mIZQ+6RdlAgvQfU5BB8ro4G6L5bevcLHf68o + 6W1tOZpuX4IS4daWg2trYAFeA0vtGliQK1StEuLdoEQ4C3IF19agRHgJLLVrYEGuULVKjudQIrwEJcJL + UHI8hxLhLL0VXKtQtUqO51AivASW3goW5ApVy6K7CRbkClWr5HgOJcdzKBHOglzBtYpUjHdCiXAW5Aqu + VbD0VrAgV6hal+Yej8fjGa+4NPd4PB7PiLg0VyK6n1CPaQi1T9pFifASVJ9D8LEyGqj7YundK3z894qS + 3taWo+n2JSgRbm05uLYGFuA1sNSugQW5QtUqId4NSoSzIFdwbQ1KhJfAUrsGFuQKVavkeA4lwktQIrwE + JcdzKBHO0lvBtQpVq+R4DiXCS2DprWBBrlC1LLqbYEGuULVKjudQcjyHEuEsyBVcq0jFeCeUCGdBruBa + BUtvBQtyhap1ae7xeDye8YpLc4/H4/GMiEtzJaL7CfWYhlD7pF2UCC9B9TkEHyujgbovlt69wsd/ryjp + bW05mm5fghLh1paDa2tgAV4DS+0aWJArVK0S4t2gRDgLcgXX1qBEeAkstWtgQa5QtUqO51AivAQlwktQ + cjyHEuEsvRVcq1C1So7nUCK8BJbeChbkClXLorsJFuQKVavkeA4lx3MoEc6CXMG1ilSMd0KJcBbkCq5V + sPRWsCBXqFqX5h6Px+MZr7g093g8Hs+IuDRXIrqfUI9pCLVP2kWJ8BJUn0PwsTIaqPti6d0rfPz3ipLe + 1paj6fYlKBFubTm4tgYW4DWw1K6BBblC1Soh3g1KhLMgV3BtDUqEl8BSuwYW5ApVq+R4DiXCS1AivAQl + x3MoEc7SW8G1ClWr5HgOJcJLYOmtYEGuULUsuptgQa5QtUqO51ByPIcS4SzIFVyrSMV4J5QIZ0Gu4FoF + S28FC3KFqnVp7vF4PJ7xiktzj8fj8YyIS3MlovsJ9ZiGUPukXZQIL0H1OQQfK6OBui+W3r3Cx3+vKOlt + bTmabl+CEuHWloNra2ABXgNL7RpYkCtUrRLi3aBEOAtyBdfWoER4CSy1a2BBrlC1So7nUCK8BCXCS1By + PIcS4Sy9FVyrULVKjudQIrwElt4KFuQKVcuiuwkW5ApVq+R4DiXHcygRzoJcwbWKVIx3QolwFuQKrlWw + 9FawIFeoWpfmHo/H4xmvuDT3eDwez4iwNIcwX7VmZRTmm+7bGO5/8L4ozB96ZEuU5o889nB47PFHozh/ + 4qnH97JPTkFwmSiDYFPSzkRiTloqXnv79fDOz34UB/DTDpkefvjaSxEIo5def1nehlEieThKRPcT6jEN + ofZJuygRXoLqcwg+VkYDdV8svXuFj/9eUdLb2nI03b4EJcKtLQfX1sACvAaW2jWwIFeoWiXEu0GJcGvL + wbU1KBFeAkvtGliQK1StkuM5lAgvQYnwEpQcz6FEOEtvBdcqVG0qxjuhRHgJLL0VLMgVqpZFdxMsyBWq + VsnxHEqO51AinAW5gmsVqRjvhBLhLMgVXKtg6a1gQa5QtSXSfO78eyNz5t4Txfld99w5KM5n33l7uPX2 + WwbF+Y033xCuv/G6cO311wyK8+9ffWWAOL/8u5cNinOW5meefUY4/czTwimnnRxOPPmEQWn+neOOiShp + brLcpbnH4/H0X1yaezwej2dEupHmNtN8PKQ5xMOrb70WXn/njTBpyqR4HWLqt3/6XZQ+6jaMEsnDUSK6 + n1CPaQi1T9pFifASVJ9D8LEyGqj7YundK3z894qS3taWo+n2JSgRbm05uLYGFuA1sNSuwUR4DlWrhHg3 + KBHOglzBtTUoEV4CS+0aWJArVK2S4zmUCC8hleClKDmeQ4lwlt4KrlWoWiXHcygRXgJLbwULcoWqZdHd + BAtyhapVcjyHkuM5lAhnQa7gWkUqxjuhRDgLcgXXKlh6K1iQK1RtG9Icwny8pLnPNPd4PJ7+jUtzj8fj + 8YzIRJfmmGkOOfPyG6+Eg2YdHEURZDD6w/+p2zCpRB6JEtH9hHpMQ6h90i5KhJeg+hyCj5XRQN0XS+9e + 4eO/V5T0trYcTbcvQYlwa8vBtTWwAK+BpXYNLMgVqlYJ8W5QItzacnBtDakEL4Wldg0syBWqVsnxHEqE + l6BEeAlKjudQIpylt4JrFapWyfEcSoSXwNJbwYJcoWpZdDfBglyhapUcz6HkeA4lwlmQK7hWkYrxTigR + zoJcwbUKlt4KFuQKVevS3OPxeDzjFZfmHo/H4xmRfpDm6BOXmGmO27/y5qtxnXNcV7dhlEgejhLR/YR6 + TEOofdIuqQQvRfU5BB8ro4G6LztO24CP/15R0tvacjTdvgQlwq0tB9fWwAK8BpbaNbAgV6haJcS7QYlw + FuQKrq1BifASWGrXwIJcoWqVHM+hRHgJSoSXoOR4DiXCWXoruFahapUcz6FEeAksvRUsyBWqlkV3EyzI + FapWyfEcSo7nUCKcBbmCaxWpGO+EEuEsyBVcq2DprWBBrlC1Ls09Ho/HM15xae7xeDyeEZno0hxixtY0 + n3nEoeEnv/zpYF9Y21zdhlEieThKRPcT6jENofZJuygRXoLqcwg+VkYDdV92nLYBH/+9oqS3teVoun0J + SoRbWw6urYEFeA0stWtgQa5QtUqId4MS4SzIFVxbQyrBS2GpXQMLcoWqVXI8hxLhJSgRXoKS4zmUCGfp + reBahapNxXgnlAgvgaW3ggW5QtWy6G6CBblC1So5nkPJ8RxKhLMgV3CtIhXjnVAinAW5gmsVLL0VLMgV + qtalucfj8XjGKy7NPR6PxzMiE12aox5Ls9hMc5OaEEZv/vgteRtGieThKBHdT6jHNITaJ+2iRHgJqs8h + +FgZDdR92XHaBnz894qS3taWo+n2JSgRbm05uLYGFuA1sNSugQW5QtUqId4NSoRbWw6urUGJ8BJYatfA + glyhapUcz6FEeAlKhJeg5HgOJcJZeiu4VqFqlRzPoUR4CSy9FSzIFaqWRXcTLMgVqlbJ8RxKjudQIpwF + uYJrFakY74QS4SzIFVyrYOmtYEGuULUuzT0ej8czXnFp7vF4PJ4RmejSHOA2mFUOaY77wfVf/f7XUYqo + ekaJ5OEoEd1PqMc0hNon7aJEeAmqzyH4WBkN1H3ZcdoGfPz3ipLe1paj6fYlKBFubTm4tgYW4DWw1K6B + BblC1Soh3g1KhLMgV3BtDUqEl8BSuwYW5ApVm4rxTigRXoIS4SUoOZ5DiXCW3gquVahaJcdzKBFeAktv + BQtyhapl0d0EC3KFqlVyPIeS4zmUCGdBruBaRSrGO6FEOAtyBdcqWHorWJArVK1Lc4/H4/GMV1yaezwe + j2dEJro0x+0w03zStL3CHDPOcTv07cuzAPWYhlD7pF2UCC9B9TkEHyujgbovlt69wsd/ryjpbW05mm5f + ghLh1paDa2tgAV4DS+0aWJArVK0S4t2gRDgLcgXX1qBEeAkstWtgQa5QtUqO51AivAQlwktQcjyHEuEs + vRVcq1C1So7nUCK8BJbeChbkClXLorsJFuQKVavkeA4lx3MoEc6CXMG1ilSMd0KJcBbkCq5VsPRWsCBX + qFqX5h6Px+MZr7g093g8Hs+IQJj//aP34ixuGzRisAbhhUuIA8gHSAtIFsgdlkYmt1Bvci2VdYaJxJy0 + zAH5O2nqpHiJ20CWox98GaiqZ1gga5SI7ifUYxpC7ZN2USK8BNXnEHysjAbqvuw4bQP1PKhFSW9ry9F0 + +xKUCLe2HFxbgxLhJbDUroFf6xSqNpXh3aJEOAtyBdfWoER4CSy1a2BBrlC1qRjvRCrBS1EivAQlx3Mo + Ec7SW8G1ClWr5HgOJcJLYOmtYEFeA0tvhZ3T5FC1So7nUHI8hxLh1paDaxWpGE9RtUqO51CinGHprWBB + rli2YukgS5cviSxZtngQTORYvHRRWLBofphx8PQwb8Hc+DPq755zV1aa33HX7K6kOYT5d6+8IlzxvcsH + pfkFF50fzr/wvCjOzzrnzHDGWaeHU08/JZx0yonh+BOPGxTn4Jhjjgnf/va3ozCHPIc0t+zcuXPfNY/H + 4/H0S1yaezwej2dYMA9mx65Pw27MNJ8yKQ6oMBDEDB4MiCC9IA4gHyAtIFkgd1gamdxCrcm1VNYZJhJz + 0jIH5K9L8xzqMQ2h9km7KBFegupzCD5WRgN1X3actoF6HtSipLe15Wi6fQlKhFtbDq6tQYnwElhq18Cv + dQpVm8rwblEinAW5gmtrUCK8BJbaNbAgV6jaVIx3IpXgpSgRXoKS4zmUCGfpreBahapVcjyHEuElKFHO + KBFeAktvBQtyhapNxXgnlBzPoUQ4C3IF1ypMhOdQtUqO50gleYoS5YwS5UyTNF+0ZGG8hBCHMIc4X7l6 + Raybv7D3mea9SnPI8tNPPz3827/9W7j00kvD5MmTw5///Oe9J9gej8fj6bu4NPd4PB7PsECax6VZpkyK + gyoMHO+ZPyfKaMgJDCAhDiAfIC0gWSB3WBqZ3IIgM7mWyjrDRGJOWuaA/HVpnkM9piHUPmkXJcJLUH0O + wcfKaKDuy47TNlDPg1qU9La2HE23L0GJcGvLwbU1KBFeAkvtGvi1TqFqUxneLUqEsyBXcG0NSoSXwFK7 + BhPhOVRtKsY7kUrwUpQIL0HJ8RxKhLP0VnCtQtUqOZ5DifASlChnlAgvgaW3wkR4DlWr5HgOJcdzKBHO + glzBtQoW5ApVq+R4DiXKGSXKGSXKmSZpjp8xs3zdhrVx6UAsIwgZjvp7580Zd2n+rW99K84wP//888PX + v/71wZnmO3bsiHg8Ho+nv+LS3OPxeDzDAmn+yfaPB2eZY4Y5Bu8Y7GKQh4E2xAHkA6QFJAvkDksjk1sQ + ZCbXUllnmEjMSUsFaiB/XZrnUI9pCLVP2kWJ8BJUn0PwsTIaqPuy47QN1POgFiW9rS1H0+1LUCLc2nJw + bQ1KhJfAUrsGfq1TqNpUhneLEuEsyBVcW4MS4SWw1K6BBblC1aZivBOpBC9FifASUjHeiVRup9JbwbUK + VavkeI5UgpeiRDmjRHgJLL0VLMgVqlbJ8RypGO+EEuEsyBVcqzARnkPVKjmeQ4lyRolyRolypkmaY3b5 + gw89EIU45PhBh8yIM80hwyHTx1uan3zyyVGcf+UrXwmnnHJKmDp1ajy39qVZPB6Ppz/j0tzj8Xg8w2Iz + zQ+adXCYs+DeOAjEFy5hsIwBE6QKxAHkA6QFfobcYWlkcguCzORaKusME4k5aalADeSvS/Mc6jENofZJ + uygRXoLqcwg+VkYDdV92nLaBeh7UoqS3teVoun0JSoRbWw6urUGJ8BJYatfAr3UKVZvK8G5RIpwFuYJr + a1AivASW2jWwIFeo2lSMdyKV4KUoEV6CkuM5lAhn6a3gWoWqTcV4J5QIL0GJckaJ8BJYeitYkCtUbSrG + O6HkeA4lwlmQK7hWwYJcoWpTMd4JJcoZJcoZJcqZJmmO2eRr1q2O65c/sOX+ONN89dpVUZSjdrylOdYz + x/Isp512WhTomGn+0Ucfhffff3/vSbbH4/F4+iouzT0ej8czLJDmH378QZxpjgHQgqULozTEYAlCBYNa + iAPIB0gLtEHusDQyuQVBZnItlXWGiUSTk4ClZQ7IX5fmOdRjGkLtk3ZRIrwE1ecQfKyMBuq+7DhtA/U8 + qEVJb2vL0XT7EpQIt7YcXFuDEuElsNSugV/rFKo2leHdokQ4C3IF19agRHgJLLVrYEGuULWpGO9EKsFL + USK8BCXHcygRztJbwbUKVavkeA4lwktIJXmKEuElsPRWsCBXqFolx3MoOZ5DiXAW5AquVbAgV6jaVIx3 + IpXkKUqUM0qUM03SHO2YbY7Z5fgZ56qQ4xDnEOXjLc3PPPPM8I1vfCPKc3D22WeHww8/fO/59Wc4w/Z4 + PB5PP8Wlucfj8XiGhdc0xwAIs8wxUMJgEINHDEohDiAfIC0gWSB3WBqZ3IIgM7mWyjrDRGJOWuaA/HVp + nkM9piHUPmkXJcJLUH0OwcfKaKDuy47TNlDPg1qU9La2HE23L0GJcGvLwbU1KBFeAkvtGvi1TqFqUxne + LUqEsyBXcG0NSoSXwFK7BhbkClWbivFOpBK8FCXCS1ByPIcS4Sy9FVyrULVKjudQIrwEJcqZVIKXwtJb + YSI8h6pNxXgnlBzPoUQ4C3IF1ypYkCtUbSrGO5FK8hQlyhklypkmaY4lWDbdtzHK8IWLF4Sp06dEYQ4x + Dpk+3tIcS7PYEi1nnHFG+Jd/+ZcwY8aM8MEHH4Q9e/bsPdH2eDweT9/EpbnH4/F4hgXSfPdnu8Kk6ZPj + AAjSHINqDGZxiYE8xAHkA6QFJAvkDksjk1sQZCbXUllnmEjMScsckL8uzXOoxzSE2iftokR4CarPIfhY + GQ3Ufdlx2gbqeVCLkt7WlqPp9iUoEW5tObi2BiXCS2CpXQO/1ilUbSrDu0WJcBbkCq6tQYnwElhq18CC + XKFqUzHeiVSCl6JEeAmpGO+EEuEsvRVcq1C1So7nUCK8hFSSpygRXgJLbwULcoWqVXI8h5LjOZQIZ0Gu + 4FoFC3KFqlVyPEcqyVOUKGeUKGeapPn8hfOiJLcaLM8CSQ5hvmjJwnGX5liW5atf/WqcYY4Z5xDnWKLF + hbnH4/H0Z1yaezwej2dYeKb5ouWL48DKBpAYXGMgD/Fg8gKSBKIGgsdEkcktCDKTa6msM0wk5qRlDsjf + /z97//kl2Xnd+Z5VcARJ+Va32s2sOy/m3+kXMz1t7lVLNCBBwnsSlgBB7wAQILz33oNOFGW6qb5zmw6G + JCiJki67Z0a6M6JEAwIgAJ6pfQo745cPvjvOeXZkAhkVe6/1XZl5aseJykREVsaHwchC8yj6nBbR12Rn + Iwjvic65SG8ruxFdl99OdyK6H2Qj9PZjUVOX74kg3I9F6W4mgvCeFLUzKZBTtNti+NwIwv1YlO5mahG8 + N0XtTA7hUbTbwviyCMJ7IgjvqYXxZRGEK3pTukvRLuF4FEF4TwTlGkF4T4relAI5RbuE41GE41EE4Qrk + lO5SCuQU7RKORxGUawTlGkG5NoXm9kxzy9/ff+DnQIN02zc49+y1zw3O7bXPHc6vuubK4YorL9+C80s/ + e8nwmUs/PXzqM5/cgvOPfvwjg8H5Bz900YjmCueO5mecdfpw6umnDCedcuJw/InHjWh+7HvfPfbe9753 + OP7448eXZjnhhBOGY489dkTzemmWmpqamvWcQvOampqamm0zF80tQwtDEoMaAx6HIsctAzLHtRbrPIfE + CC2jDH8LzaPoc1pEX5OdjSC8JzrnIr2t7EZ0XX473YnofpCN0NuPRU1dvieCcD8WpbuZCMJ7UtTOpEBO + 0W6L4XMjCPdjUbqbqUXw3hS1MymQU7SrKD4VQXhPBOE9tTC+LIJwRW9KdynaJRyPIgjviaBcIwjvSdGb + UiCnaJdwPIpwPIogXIGc0l1KgZyiXcLxKIJyjaBcIyjXsmhue8vQ3MC80LympqampncKzWtqampqtk2h + uUUQvU7R57SIviY7G0F4T3TORXpb2Y3ouvx2uhPR/SAbobcfi5q6fE8E4X4sSnczEYT3pKidSYGcot0W + w+dGEO7HonQ3U4vgvSlqZ1Igp2hXUXwqgvCeCMJ7amF8WQThit6U7lK0SzgeRRDeE0G5RhDek6I3pUBO + 0S7heBTheBRBuAI5pbuUAjlFu4TjUQTlGkG5RlCuFZrX1NTU1OylKTSvqampqdk264DmtmP4W2geRZ/T + Ivqa7GwE4T3RORfpbWU3ouvy2+lORPeDbITefixq6vI9EYT7sSjdzUQQ3pOidiYFcop2WwyfG0G4H4vS + 3UwtgvemqJ1JgZyiXUXxqQjCeyII76mF8WURhCt6U7pL0S7heBRBeE8E5RpBeE+K3pQCOUW7hONRhONR + BOEK5JTuUgrkFO0SjkcRlGsE5RpBubYOaG6vaV5oXlNTU7MZU2heU1NTU7NtCs2tFqHXLfqcFtHXZGcj + CO+JzrlIbyu7EV2X3053IrofZCP09mNRU5fviSDcj0XpbiaC8J4UtTMpkFO022L43AjC/ViU7mZqEbw3 + Re1MCuQU7SqKT0UQ3hNBeE8tjC+LIFzRm9JdinYJx6MIwnsiKNcIwntS9KYUyCnaJRyPIhyPIghXIKd0 + l1Igp2iXcDyKoFwjKNcIyrVC85qampqavTSF5jU1NTU122Yd0Nwy/C00j6LPaRF9TXY2gvCe6JyL9Lay + G9F1+e10J6L7QTZCbz8WNXX5ngjC/ViU7mYiCO9JUTuTAjlFuy2Gz40g3I9F6W6mFsF7U9TOpEBO0a6i + +FQE4T0RhPfUwviyCMIVvSndpWiXcDyKILwngnKNILwnRW9KgZyiXcLxKMLxKIJwBXJKdykFcop2Ccej + CMo1gnKNoFxbBzSvl2epqamp2ZwpNK+pqamp2TaF5hZB9DpFn9Mi+prsbAThPdE5F+ltZTei6/Lb6U5E + 94NshN5+LGrq8j0RhPuxKN3NRBDek6J2JgVyinZbDJ8bQbgfi9LdTC2C96aonUmBnKJdRfGpCMJ7Igjv + qYXxZRGEK3pTukvRLuF4FEF4TwTlGkF4T4relAI5RbuE41GE41EE4QrklO5SCuQU7RKORxGUawTlGkG5 + VmheU1NTU7OXptC8pqampmbbFJpbBNHrFH1Oi+hrsrMRhPdE51ykt5XdiK7Lb6c7Ed0PshF6+7Goqcv3 + RBDux6J0NxNBeE+K2pkUyCnabTF8bgThfixKdzO1CN6bonYmBXKKdhXFpyII74kgvKcWxpdFEK7oTeku + RbuE41EE4T0RlGsE4T0pelMK5BTtEo5HEY5HEYQrkFO6SymQU7RLOB5FUK4RlGsE5VqheU1NTU3NXppC + 85qampqabaNobg9g7IGdPxi1B9f2QN7hwoDEkMVwx2DIUcpxy4DMcU2xTgGRoHIqO9fTzz4z/h3t+p76 + 3tPDN5765vh3+ObT38LLaATJ2yOIXqfoc1pEX5OdjSC8JzrnIr/N7FZ0XXqbXTVF61Uj9PZjUVOX74kg + 3I9F6W4m/z6TTVE7k0N4FO22GD43gnAFckp3M7UI3puidiaH8CjaJRyPIgjviSC8pxbGl0UQruhN6S5F + u4TjUQThPRGUawrgmRS9KQVyinYJx6NaGG+jXcLxKEVvSoGcol3C8SiCco2gXGuRvC2L5ra/DM2vvvaq + WWj+sU98dPjIxz48XPzhDw4XXXzh2AcuumA474Jzh3POO3s46/1njnB+2hmnDiefetJwwknHD8ed8N7h + PccdO1ZoXlNTU3NoTaF5TU1NTc22mYvmlgGJIYvhjsGQo5TjlgGZ45pinQIiQeVU9mxyw6F9R+wb/vp/ + /M2IJ3Ydf/7XfzFeL11GI0jeHkH0OkWf0yL6muxsBOE90TkX+W1mt6Lr0tvsqilarxqhtx+Lmrp8TwTh + fixKdzMpgGdS1M7kEB5Fuy2Gz40g3I9F6W6mFsF7U9TO5P++RNEu4XgUQXhPBOE9tTC+LIJwRW9Kdyna + JRyPIgjviaBcUwDPpOhNKZBTtKvQPZVDeBTtEo5HKXpTCuQU7RKORxGUawTlWovkbVk036lnmhea19TU + 1NToFJrX1NTU1GybdUBzg197Rrn9Hf3ydszObS/TQpfRFJC5FqHXLfqcFtHXZGcjCO+JzrnI/5vvVnRd + eptdNb8f7ESE3n4sauryPRGE+7Eo3c2kAJ5JUTuTQ3gU7bYYPjeCcAVySncztQjem6J2Jv/3JYp2Ccej + CMJ7IgjvqYXxZRGEK3pTukvRLuF4FEF4TwTlmgJ4JkVvSoGcol2F7qkcwqNol3A8StGbUiCnaJdwPIqg + XCMo11okbys0r6mpqanZS1NoXlNTU1OzbdYBzZ/9wffH8zia2/nt+JPffWq8zna/jSB5ewTR6xR9Tovo + a7KzEYT3ROdc5LeZ3YquS2+zq+b3g52I0NuPRU1dvieCcD8WpbuZFMAzKWpncgiPot0Ww+dGEK5ATulu + phbBe1PUzuT/vkTRLuF4FEF4TwThPbUwviyCcEVvSncp2iUcjyII74mgXFMAz6ToTSmQU7Sr0D2VQ3gU + 7RKORyl6UwrkFO0SjkcRlGsE5VqL5G3rgOb2muaF5jU1NTWbMYXmNTU1NTXbZh3Q3K7bzvkrv/mr42uZ + f/s7T44v2WJIZe/TZTSC5O0RRK9T9Dktoq/JzkYQ3hOdc5HfZnYrui69za6aovWqEXr7saipy/dEEO7H + onQ3kwJ4JkXtTA7hUbTbYvjcCMIVyCndzdQieG+K2pn835co2iUcjyII74kgvKcWxpdFEK7oTekuRbuE + 41EE4T0RlGsK4JkUvSkFcop2FbqncgiPol3C8ShFb0qBnKJdwvEognKNoFxrkbyt0LympqamZi9NoXlN + TU1NzbZZBzT/wQ//avz7GZTb38vg3DDYXrKlXp7Fos9pEX1NdjaC8J7onIv8NrNb0XXpbXbVFK1XjdDb + j0VNXb4ngnA/FqW7mRTAMylqZ3IIj6LdFsPnRhCuQE7pbqYWwXtT1M7k/75E0S7heBRBeE8E4T21ML4s + gnBFb0p3KdolHI8iCO+JoFzznzeyKXpTCuQU7Sp0T+UQHkW7hONRit6UAjlFu4TjUQTlGkG51iJ52zqg + eb08S01NTc3mTKF5TU1NTc22WQc0Nyz57X/xT8cHnf+v/+P/vXV9/rItdBmNIHl7BNHrFH1Oi+hrsrMR + hPdE51zkt5ndiq5Lb7Or5veDnYjQ249FTV2+J4JwPxalu5kUwDMpamdyCI+i3RbD50YQrkBO6W6mFsF7 + U9TO5P++RNEu4XgUQXhPBOE9tTC+LIJwRW9KdynaJRyPIgjviaBcUwDPpOhNKZBTtKvQPZVDeBTtEo5H + KXpTCuQU7RKORxGUawTlWovkbYXmNTU1NTV7aQrNa2pqamq2zTqguf8SUHvfnm1uzy63cz397DPj9bf7 + bQTJ2yOIXqfoc1pEX5OdjSC8JzrnIr/N7FZ0XXqbXTVF61Uj9PZjUVOX74kg3I9F6W4m/z6TTVE7k0N4 + FO22GD43gnAFckp3M7UI3puidib/9yWKdgnHowjCeyII76mF8WURhCt6U7pL0S7heBRBeE8E5ZoCeCZF + b0qBnKJdhe6pHMKjaJdwPErRm1Igp2iXcDyKoFwjKNdaJG8rNK+pqamp2UtTaF5TU1NTs23sx/oXX3ph + 2H/UYeODxVvuvHWEGHuwax/bA2yHCwMSQxbDHYMhRynHLQMyxzXFOgVEgso57Tty/3g5ReC5KOx7cS1C + r1v0OS2ir8nORhDeE51zkd9mdiu6Lr3Nrpqi9aoRevuxqKnL90QQ7seidDeTAngmRe1MDuFRtNti+NwI + wv1YlO5mahG8N0XtTA7hUbRLOB5FEN4TQXhPhONRBOGK3pTuUrRLOB7VInhvBOUaQXhPit6UQ3gU7Sp0 + T6VATtEu4XiUojelQE7RLuF4FEG5RlAe5VB+2923bzWF5n7MwNz/7LAj9o9wftsdt45vrRtvvmGE8+tu + uHYLzq++9qrhc1ddsQXnl11+6XDJZZ8ZPn3Jp7bg/KMf/8iI5h/+6IeGD37oouHCD35gOP8D541ofu75 + 5wzvO/usEc5PP/O04ZTTTh5OPPmE4fgTjxvee/x7xgzLjznmmOGUU04Z3vGOdwxve9vbRjS3ee6558a3 + NTU1NTXrM4XmNTU1NTXbRp9pfvUN14xwc+V1V40P4A2c7IG2Q4UBiSGL7RgMOUo5bhmQOa4p1ikgElTO + qdB8WfQ5LaKvyc5GEN4TnXOR32Z2K7ouvc2umqL1qhF6+7Goqcv3RBDux6J0N5N/n8mmqJ3JITyKdhXC + eyIIVyCndDdTi+C9KWpn8n9fomiXcDyKILwngvCeWhhfVovbLXpTukvRLuF4FEF4TwTlGkF4T4relAI5 + RbsK3VMpkFO0SzgepehNKZBTtEs4HkVQrhGOR72eaG5g/nqg+Tvf+c7h7LPPHn73d393hPMTTzxxRPOf + /OQnB3/IrqmpqalZqyk0r6mpqanZNobmRxx1+PiA0R7A2oMggwJ7sGsP7ux9hwoDEkMWwx2DIUcpxy0D + Msc1xToFRILKORWaL4s+p0X0NdnZCMJ7onMu8tvMbkXXpbfZVVO0XjVCbz8WNXX5ngjC/ViU7mZSAM+k + qJ3JITyKdlsMnxtBuAI5pbuZWgTvTVE7k//7EkW7hONRCuCZCMJ7IhyPIghX9KZ0l6JdwvGoFsF7a5G8 + jSC8J0VvSoGcol2F7qkcwqNol3A8StGbUiCnaJdwPKpF8jbC8ahDEc3POuus4d/8m38znHHGGeNLtTia + 29QzzWtqamrWbwrNa2pqamq2jaH5vv37hutuvn7rAfZV1189YoiBg33sUGHHDFkMdwyGHKUctwzIHNcU + 6xQQCSrnVGi+LPqcFtHXZGcjCO+JzrnIbzO7FV2X3mZXTdF61Qi9/VjU1OV7Igj3Y1G6m0kBPJOidiaH + 8CjabTF8bgThCuSU7mZSAM+kqJ3J/32Jot0WxpdFEN4TQXhPhONRLW77v8nL0l2KdgnHowjCeyIo1wjC + e1L0phTIKdpV6J5KgZyiXcLxKEVvSoGcol3C8SiCco1wPGpd0dxe03zZy7OcdNJJw7vf/e7xZVqs/fv3 + H/wBu6ampqZm7abQvKampqZm2xia/86/+Gcjmlv+gNEewNtbQxWHCgMS+9hwx2DIUcpxy4DMcU2xTgGR + oHJOhebLos9pEX1NdjaC8J7onIv8NrNb0XXpbXbVFK1XjdDbj0VNXb4ngnA/FqW7mRTAMylqZ3IIj6Ld + FsPnRhCuQE7pbqYWwXtT1M7k/75E0S7heBRBeE8E4T21ML4sgnBFb0p3KdolHI8iCO+JoFwjCO9J0Zty + CI+iXYXuqRTIKdolHI9S9KYUyCnaJRyPIijXCMejDkU0t18Cas8wNzg/7rjjxmecG5r/6Ec/Gv7xH//x + 4A/aNTU1NTVrM4XmNTU1NTXbxp9pbg9e7cGiP7i2BziGQPYAy6HCgMSQxXDHYMhRynHLgMxxTbFOAZGg + ck6F5suiz2kRfU12NoLwnuici/w2s1vRdeltdtUUrVeN0NuPRU1dvieCcD8WpbuZFMAzKWpncgiPot0W + w+dGEK5ATuluphbBe1PUzuT/vkTRLuF4FEF4TwThPRGOR7W43aI3pbsU7RKORxGE99QieRtBeE+K3pRD + eBTtKnRPpUBO0S7heJSiN+UQHkW7hONRBOVaC+PLWlc0X/byLPbM8mOPPXY455xzxtc1t18Get555229 + REtNTU1NzXpNffeuqampqdk2huZHvumI4bNXXT4+QLrmxmvHB9eGKfaAxtDKocKAxI4b7hgMOUo5bhmQ + Oa4p1ikgElTOqdB8WfQ5LaKvyc5GEN4TnXOR32Z2K7ouvc2umqL1qhF6+7Goqcv3RBDux6J0N5MCeCZF + 7UwO4VG022L43AjCFcgp3c3UInhvitqZ/N+XKNolHI8iCO+JILwnwvGoFrdb9KZ0l6JdwvEogvCeCMo1 + gvCeFL0pBXKKdhW6p1Igp2iXcDxK0ZtSIKdot4XxZRGUa4TjUYcimr/tbW8bfwGogbk96/z0008f/u2/ + /bcjmj///PMHf9CuqampqVmbKTSvqampqdk2/kxze3B78x23jA9C7cG1PcAxxLH3HSoMSAxZ7LjBkKOU + 45YBmeOaYp0CIkHlnArNl0Wf0yL6muxsBOE90TkX+W1mt6Lr0tvsqilarxqhtx+Lmrp8TwThfixKdzMp + gGdS1M7kEB5FuwrhPRGEK5BTupupRfDeFLUz+b8vUbRLOB5FEN4TQXhPhONRLW636E3pLkW7hONRLYL3 + RlCutQjem6I3pUBO0a5C91QK5BTtEo5HKXpTCuQU7RKORxGUay2ML+tQRHP7xZ9vf/vbRyy3Z5zba5uf + euqpw2GHHTa8/PLLB3/QrqmpqalZmyk0r6mpqanZNobm+w/fN4K5PWi0B3T2QNYeLDsaOFgYkBiyGO4o + FjluGZA5rinWKSASVM6p0HxZ9Dktoq/JzkYQ3hOdc5HfZnYrui69za6aovWqEXr7sTn5ZRS19VxT+WUU + tfVclO5mIgjvSVE7k0N4FO22GD43gnAFckp3M7UI3puidiYFcop2CcejFMAzEYT3RDgeRRCu6E3pLkW7 + LYwviyC8pxbJ2wjCe1L0phTIKdpV6J7KITyKdgnHoxS9KQVyinYJx6MIyjXC8ShC86k/92O33nXb1p/Z + z4M33nbTcMudMZpfc93Vs9D845/82AjnH/rIxSOaK5wbmr//nPdtva75aWecOpx0yolbaP6e444dX8/c + X9fcXtPc3hqeH3744cMvf2k/YdfU1NTUrNMUmtfU1NTUbJtCc6tF6HWLPqdF9DXZ2QjCe6JzLvLbzG5F + 16W32VVT9F61Fr/9vjY3v4yitp5rKr+Moraei9LdTAThPSlqZ3IIj6LdFsPnRhCuQE7pbqYWwXtT1M6k + QE7RLuF4lAJ4JoLwngjHowjCFb0p3aVot4XxZRGE99QieRtBeE+K3pQCOUW7Ct1TOYRH0S7heJSiN6VA + TtEu4XgUQbmm6D0VofjUn/uxXjSf+0zzVdH8Pe9Z/DLQQvOampqa9Z9C85qampqabVNobrUIvW7R57SI + viY7G0F4T3TORX6b2a3ouvQ2u2qK3qvW4rff1+bml1HU1nNN5ZdR1NZzUbqbiSC8J0XtTA7hUbTbYvjc + CMIVyCndzdQieG+K2pkUyCnaJRyPUgDPRBDeE+F4FEG4ojeluxTttjC+LILwnlokbyMI70nRm1Igp2hX + oXsqh/Ao2iUcj1L0phTIKdolHI8iKNcUvaciFJ/6cz9WaF5TU1NT83pMoXlNTU1NzbYpNLdahF636HNa + RF+TnY0gvCc65yK/zexWdF16m101Re9Va/Hb72tz88soauu5pvLLKGrruSjdzUQQ3pOidiaH8CjabTF8 + bgThCuSU7mZqEbw3Re1MCuQU7RKORymAZyII74lwPIogXNGb0l2KdlsYXxZBeE8tkrcRhPek6E0pkFO0 + q9A9lUN4FO0SjkcpelMK5BTtEo5HEZRrit5TEYpP/bkfKzSvqampqXk9ptC8pqampmbbFJpbLUKvW/Q5 + LaKvyc5GEN4TnXOR32Z2K7ouvc2umqL3qrX47fe1ufllFLX1XFP5ZRS19VyU7mYiCO9JUTuTQ3gU7bYY + PjeCcAVySncztQjem6J2JgVyinYJx6MUwDMRhPdEOB5FEK7oTekuRbstjC+LILynFsnbCMJ7UvSmFMgp + 2lXonsohPIp2CcejFL0pBXKKdgnHowjKNUXvqQjFp/7cjxWa19TU1NS8HlNoXlNTU1OzbQrNrRah1y36 + nBbR12RnIwjvic65yG8zuxVdl95mV03Re9Va/Pb72tz8Moraeq6p/DKK2nouSnczEYT3pKidySE8inZb + DJ8bQbgCOaW7mVoE701RO5MCOUW7hONRCuCZCMJ7IhyPIghX9KZ0l6LdFsaXRRDeU4vkbQThPSl6Uwrk + FO0qdE/lEB5Fu4TjUYrelAI5RbuE41EE5Zqi91SE4lN/7scKzWtqampqXo8pNK+pqamp2TaF5laL0OsW + fU6L6GuysxGE90TnXOS3md2Krktvs6um6L1qLX77fW1ufhlFbT3XVH4ZRW09F6W7mQjCe1LUzuQQHkW7 + LYbPjSBcgZzS3UwtgvemqJ1JgZyiXcLxKAXwTAThPRGORxGEK3pTukvRbgvjyyII76lF8jaC8J4UvSkF + cop2FbqncgiPol3C8ShFb0qBnKJdwvEognJN0XsqQvGpP/djheY1NTU1Na/HFJrX1NTU1GybQnOrReh1 + iz6nRfQ12dkIwnuicy7y28xuRdelt9lVU/RetRa//b42N7+Moraeayq/jKK2novS3UwE4T0pamdyCI+i + 3RbD50YQrkBO6W6mFsF7U9TOpEBO0S7heJQCeCaC8J4Ix6MIwhW9Kd2laLeF8WURhPfUInkbQXhPit6U + AjlFuwrdUzmER9Eu4XiUojelQE7RLuF4FEG5pug9FaH41J/7sULzmpqamprXYwrNa2pqamq2jf1Iv2// + vvHBiD0AtQdp+iDe0cJwxIDFkMahyFHLccxQzXHOgI8AkaByKoPffYftG771zLfHv8Mz3//OeP3ffPpb + Y3QZrUXk10YQvU7R57SIviY7G0F4T3TORX6b2a3ouui2m62F71Vq8Vvvc3Pyyyhq67mm8ssoauu5KN3N + RBDek6J2JofwKNolEJ8TQbgfi9LdTC2C96aonckhPIp2CcejCMJ7IgjvSf89nYogXNGb0l2KdgnHowjC + eyIo11oE703Rm1Igp2hXoXsqBXKKdlsYX5aiN6VATtEu4XgUQbmm6D2VA7ii+NSf29/72puu27ouw3JD + c3vfnuxxy203j910y40jnF9/43VbcH7NdVcPV179uS04/+wVlw2XfvaS4TOXfnpwODc0/9gnProNzj9w + 0QXDBReeP8L5FJobkhea19TU1Bw6U2heU1NTU7NtFM3tQaM9SPMH7/ZW0cKAxZDGochRy3HMUM1xzoCP + AJGgck6G5nbOp599Zvj6k98YnvzuU1sISPsaQfL2CKLXKfqcFtHXZGcjCO+JzrnIbzO7FV0X3XazKXqv + Wovfep+bk19GUVvPNZVfRlFbz0XpbiaC8J4UtTM5hEfRLoH4nAjC/ViU7mYiCO9JUTuTQ3gU7RKORxGE + 90QQ3pOi+FQtbrfoTekuRbuE41EE4T0RlGsE4T0pelMK5BTtKnRPpUBO0W4L48tS9KYUyCnaJRyPapG8 + TdF7qgyaG4zb1+GGW28cd+zzsJ8H7brtWITmBuavB5rXM81rampqDq0pNK+pqamp2TbrgOZ2OXuQ9IMf + /tUIS349T33v6VnnIkjeHkH0OkWf0yL6muxsBOE90TkX+W1mt6Lram+3q9TC9yq1+K33uTn5ZRS19VxT + +WUUtfVclO5mIgjvSVE7k0N4FO22GD43gnA/FqW7mQjCe1LUzuQQHkW7hONRBOE9EYT3pCg+VYvbLXpT + ukvRLuF4FEF4TwTlGkF4T4relAI5RbsK3VMpkFO0qyg+laI3pUBO0S7heFSL5G2K3lNl0NxegsVemsX+ + +1x53VXjfcp+HrS9m24/COaF5jU1NTU1OzWF5jU1NTU122Yd0NxejsVfnsUv+72/fHbrnO1+G0Hy9gii + 1yn6nBbR12RnaxG8NzrnIr/N7FZ0XXqbXbUWvlepxW+9z83JL6Ooreeayi+jqK3nonQ3E0F4T4ramRzC + o2iXQHxOBOF+LEp3MxGE96SonckhPIp2CcejCMJ7ahG8N0XxqVrcbtGb0l2KdgnHowjCeyIo1wjCe1L0 + phTIKdpV6J5KgZyi3RbGl6XoTSmQU7RLOB5FUK4pek9FKD715wbj9ne3Z5zb1/C6m68ffx6043b9heY1 + NTU1NTs5heY1NTU1NdtmHdDcn2Vu57VzGJ4b1tjbOSjcIvJrI4hep+hzWkRfk52NILwnOuciv83sVnRd + 7e12lVr4XqUWv/U+Nye/jKK2nmsqv4yitp6L0t1MBOE9KWpncgiPol0C8TkRhPuxKN3N1CJ4b4ramRzC + o2iXcDyKILwngvCeFMWnanG7RW9KdynaJRyPIgjviaBcIwjvSdGbUiCnaFeheyoFcop2WxhflqI3pUBO + 0S7heFSL5G2K3lNl0Nz+DvYMc7stGZjbx/YzoX0e9ueF5jU1NTU1OzmF5jU1NTU122Yt0PzI/eNbAwx7 + LfPv/Pl3x18AatfZ7lIEydsjiF6n6HNaRF+TnY0gvCc65yK/zexWdF10283Wwvcqtfit97k5+WX8Puv3 + 27n5ZRS19VyU7mYiCO9JUTuTQ3gU7RKIz4kg3I9F6W4mgvCeFLUzOYRH0S7heFSL4L0RhPekKD5Vi9st + elO6S9Eu4XhUi+C9EZRrBOE9KXpTCuQU7Sp0T6VATtFuC+PLUvSmHMKjaFdRfCqCck3Re6oMmtszyu1r + d/UN14wv1WL3afuZ0I5fcc3nCs1rampqanZ0Cs1rampqarbNWqD5EfuG//btr4/PLLe/g/0iUMMwA/Rv + PPVNvIxGkLw9guh1ij6nRfQ12dkIwnuicy7y28xuRddFt91sLXyvUovfep+bk19GUVvPNZVfRlFbz0Xp + bqYWwXtT1M7kEB5FuwTicyII92NRupuJILwnRe1MDuFRtNvC+LIIwnsiCO9JUXyqFrdb9KZ0l6JdwvEo + gvCeCMo1gvCeFL0pBXKKdhW6p1Igp2i3hfFlKXpTCuQU7RKORxGUa4reU2XQ3P4bf/wznxhvi/bf5ryL + zh/f2rPN7TZdaF5TU1NTs5NTaF5TU1NTs23WAs0PPDgy/LXzPv3sM+P12C8BtfPZ+3QZrUXk10YQvU7R + 57SIviY7G0F4T3TORX6b2a3outrb7Sq18L1KLX7rfW5OfhlFbT3XVH4ZRW09F6W7mQjCe1LUzuQQHkW7 + BOJzIgj3Y1G6m4kgvCdF7UwO4VG0SzgeRRDeE0F4T4riU7W43aI3pbsU7bYwviyC8J4IyrUWwXtT9KYc + wqNoV6F7KgVyinZbGF+WojelQE7RLuF4FEG5pug9VQbN/TXN7e2Nt9003n7tuP1caC/XUmheU1NTU7OT + U2heU1NTs4Hz4osvjm9/+tOfbvsh/vnnn99Cc3vAaA9g7YGdPVCz9w28DA0cRwxYDGkcihylHMcM1Rzn + DPgIEAkqp9p3+L7xrSOwXd6eeW5v56CwXy6uReh1iz6nRfQ12dkIwnuicy7y28xuRddFt91sLXyvUovf + ep+bk1/G77N+v52bX0ZRW89F6W4mBfBMitqZHMKjaJdAfE4E4X4sSnczKYBnUtTOpEBO0S7heFSL4L0R + hPdEOB5FEK7oTekuRbuE41EE4T0pkFME4T0pelMK5BTtKnRPpUBO0W4L48tS9KYUyCnaJRyPIijXFL2n + yqC5fWwvy3LrXbeN79uefewv0RKh+bXXXzOi+VXXXLkF55d/7rPDZZdfOlxy2We24PwTn/r4iOYf/uiH + hos//MGxiy6+cETz8y44dzj3/HNGOD/jrNNHND/ltJNHOD/uhPeOaG5Qfswxxwwnn3zy1luD8337il1q + ampq1nHqu3dNTU3NBs4vfvGLV987OH//938//OxnPxvf/9v/4++GX/m1tw6XX33F+ADFkMAgxmHCHkA6 + jhiw2J85FDlKOY4ZqjnOGfARIBJUTlVoPhV9Tovoa7KzEYT3ROdc5LeZ3Yqui2672Vr4XqUWv/U+Nye/ + jKK2nmsqv4yitp6L0t1MCuCZFLUzOYRH0S6B+JwIwv1YlO5mUgDPpKidySE8inZbGF9Wi+C9EYT3RDge + RRCu6E3pLkW7hONRBOE9EZRrBOE9KXpTDuFRtKvQPZUCOUW7hONRit6UAjlFu4TjUQTlmqL3VITiU39u + H2fQ3J9pviqan3Pe2UvR3ID89NNPH373d393OPXUU4d3vetdw7//9/9+OProo8efsWtqampq1msKzWtq + amo2dH784x8PL7300qsfHRzD9H/2z39nfCBheGIPGv1BqL21B9kGQY4jtmNI41DkKOU4ZqjmOGfAR4BI + UDlVoflU9Dktoq/JzkYQ3hOdc5HfZnYrui667WZr4XuVWvzW+9yc/DKK2nquqfwyitp6Lkp3MymAZ1LU + zuQQHkW7BOJzIgj3Y1G6m0kBPJOidiYFcop2CcejCMJ7IgjviXA8qsXtFr0p3aVol3A8iiC8J4JyTQE8 + k6I3pUBO0a5C91QK5BTtEo5HKXpTCuQU7RKORxGUa4reUxGKT/25fbyX0dxeiuXtb3/7+Izzk046aXy2 + +QUXXDAcddRRw3PPPffqT9s1NTU1NesyheY1NTU1Gzr20iw+r7zyypjN+NIsDy8ezNkDR3ugaw/g7QGt + QYXjiAGLIY1DkaOU45ihmuOcAR8BIkHlVIXmU9HntIi+JjsbQXhPdM5FfpvZrei66LabrYXvVWrxW+9z + c/LLKGrruabyyyhq67ko3c2kAJ5JUTuTQ3gU7RKIz4kg3I9F6W4mBfBMitqZFMgp2iUcjyII74kgvKcW + xpdFEK7oTekuRbuE41EtgvfWInkbQXhPit6UAjlFuwrdU/nPTlG0SzgepehNKZBTtEs4HkVQril6T0Uo + PvXn9vFeRfNj3/vuEcpPOeWUEc9/7/d+bzjhhBOGf/fv/l29PEtNTU3Nmk59966pqanZ8DEst9c195dn + ecuvvHV8gHHldVeND+rsgaNBgWGMPWC2B7WOIwYsdtyhyFHKccxQzXHOgI8AkaByqkLzqehzWkRfk52N + ILwnOuciv83sVnRddNvN1sL3KrX4rfe5OfllFLX1XFP5ZRS19VyU7mZSAM+kqJ3JITyKdgnE50QQ7sei + dDeTAngmRe1MCuQU7RKOR7UI3htBeE+E41EE4YrelO5StNvC+LIIwntqkbyNILwnRW9KgZyiXYXuqRTI + KdolHI9S9KYUyCnaJRyPIijXFL2nIhSf+nP7eC+j+e///u+PL9FiL8ty5plnDu985zuHiy66aHzJloLz + mpqamvWb+s5dU1NTs8FjL8/ywgsvvPrRMPz85z8fn2n+6OOPjA8Y7QG+PSCx9+0BtoOF44gBiyGNQ5Gj + lOOYoZrjnAEfASJB5VSF5lPR57SIviY7G0F4T3TORX6b2a3ouui2m62F71Vq8Vvvc3Pyyyhq67mm8sso + auu5KN3NpACeSVE7k0N4FO0SiM+JINyPReluJgXwTIramRzCo2iXcDyKILynFsF7IxyPanG7RW9Kdyna + JRyPIgjviaBcIwjvSdGbUiCnaFeheyoFcop2CcejFL0pBXKKdgnHowjKNUXvqQjFp/7cPt6raG4vz/Lu + d797eP/73z9iub1vzzT/D//hP4zPOn/rW9/66k/bNTU1NTXrMoXmNTU1NRs49uxyfz1zQ3N7prn367/5 + G+MDCntwYg8a7UGQ4YQ9mLW3hg6OIwYshjQORY5SjmOGao5zBnwEiASVUxWaT0Wf0yL6muxsBOE90TkX + +W1mt6Lrottutha+V6nFb73Pzckvo6it55rKL6OoreeidDeTAngmRe1MDuFRtEsgPieCcD8WpbuZFMAz + KWpnUiCnaLeF8WURhPdEEN4T4XgUQbiiN6W7FO0SjkcRhPfUInkbQXhPit6UAjlFuwrdUymQU7RLOB6l + 6E0pkFO0Szge1SJ5m6L3VITiU39uH+9lNLdnmBuW20u0vOMd7xiOP/744cILLxx/Mej+/fvHn7trampq + atZnCs1rampqNnTsWeU2BuX+bPMXX3xxfKb5bXfcOj64tQeg9oDKoMkerBlSGMo4jhiw2McORY5SjmOG + ao5zBnwEiASVUxWaT0Wf0yL6muxsBOE90TkX+W1mt6Lrottutha+V6nFb73Pzckvo6it55rKL6Ooreei + dDeTf5/JpqidySE8inYJxOdEEO7HonQ3kwJ4JkXtTArkFO0SjkcRhPdEEN4T4XgUQbiiN6W7FO0Sjke1 + CN4bQbnWInhvit6UAjlFuwrdUymQU7TbwviyFL0ph/Ao2iUcjyIo1xS9pyIUn/pz+3gvo7n94k97WZb/ + 9J/+03DyySePvxT0xBMP/Plxx9XLs9TU1NSs4dR37pqampoNHcNyH/8loC+//PKw77D9w5133zE+kLIH + i/Yg1x5U2wN4AwMDCscRAxZDGociRynHMUM1xzkDPgJEgsqpCs2nos9pEX1NdjaC8J7onIv8NrNb0XXR + bTdbC9+r1OK33ufm5JdR1NZzTeWXUdTWc1G6m0kBPJOidiaH8CjaJRCfE0G4H4vS3UwK4JkUtTM5hEfR + LuF4VIvgvRGE99TC+LIIwhW9Kd2laJdwPKpF8N4IyjWC8J4UvSmH8GyK3pQCOUW7hONRit6UQ3gU7RKO + RxGUa4reUxGKz/lzA3NHc8vR/OY7bhluvf1gN9960wjnN9x0/RacX3v9NbPQ/OOf/Ng2OL/wgx8YPnDR + BVtwfva57x/OfN8Zw+lnnjacevopw8mnnjQcf+Jxw3uPf8/wnve8Z3xNc3uGub9vYG5v65nmNTU1Nes3 + heY1NTU1GzqF5stqEXrdos9pEX1NdjaC8J7onIv8NrNb0XXRbTdbC9+r1OK33ufm5JdR1NZzTeWXUdTW + c1G6m0kBPJOidiaH8CjaJRCfE0G4H4vS3UwK4JkUtTM5hEfRLuF4VIvgvRGE99TC+LIIwhW9Kd2laJdw + PKpF8N4IyjWC8J4IyrUWwXtT9KYUyCnaJRyPUvSmHMKjaJdwPIqgXFP0nipC8ak/b9HcsHwKzQ3MdwLN + zz3/nG409wrNa2pqatZvCs1rampqNnQKzZfVIvS6RZ/TIvqa7GwE4T3RORf5bWa3ouui2262Fr5XqcVv + vc/NyS+jqK3nmsovo6it56J0N5MCeCZF7UwO4VG0SyA+J4JwPxalu5kUwDMpamdyCI+iXcLxqBbBeyMI + 76mF8WURhCt6U7pL0S7heFSL4L0RlGsE4T0RlGstgvem6E0pkFO0SzgepehNOYRH0S7heBRBuaboPVWE + 4lN/XmheU1NTU/N6TaF5TU1NzYZOofmyWoRet+hzWkRfk52NILwnOuciv83sVnRddNvN1sL3KrX4rfe5 + OfllFLX1XFP5ZRS19VyU7mZSAM+kqJ3JITyKdgnE50QQ7seidDeTAngmRe1MDuFRtEs4HtUieG8E4T21 + ML4sgnBFb0p3KdolHI9qEbw3gnKNILwngnKtRfDeFL0pBXKKdgnHoxS9KYfwKNolHI8iKNcUvaeKUHzq + z/cqmttrmrdornBeaF5TU1OzflNoXlNTU7OhU2i+rBah1y36nBbR12RnIwjvic65yG8zuxVdF912s7Xw + vUotfut9bk5+GUVtPddUfhP1ouEAAP/0SURBVBlFbT0XpbuZFMAzKWpncgiPol0C8TkRhPuxKN3NpACe + SVE7k0N4FO0Sjke1CN4bQXhPLYwviyBc0ZvSXYp2CcejWgTvjaBcIwjviaBcaxG8N0VvSoGcol3C8ShF + b8ohPIp2CcejCMo1Re+pIhSf+vNC85qampqa12sKzWtqamo2dArNl9Ui9LpFn9Mi+prsbAThPdE5F/lt + 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 + NOefIc15/2Rb4DNeZDgnbzpGRfUHaVbHczRpYSd/x2U09s52Kl/8GFUs4TyydA6NWX7XGWmebXmD9y8c + F9rk3Lf3FSrtfommNu2l7/yfRCXtr9OETW/Rp9fv5P0/m4rWHqLibq7fBjd2rlvxxANpDjGOfu2kOfY9 + pHnbiVw5+m7b6X5pPpcmrX4oJ80b+6X56u3upj1I88yyOGl+h3NPmZLLKHvdKsre1Eglt7Z7aR7y8tI8 + 7KWkebrpWfjn9ZB3XKfxIGV7OCh35+aDylR+mm5cu46mrX1kSNI808DfxYOpfMuXqaSXv6d8Ll3W/JS7 + Cx13slqD0ZMML829NMddFdNadvTfaX6I+wWmZ1HSnC/M8vAfHv3rP4YvHDI1e6lyw5s0dj3XqVpEk1qf + dXdoFNftoupuPqmt5AuRFl5Xd2e5FuZKmruLVn6PkeaZ1XzMEE+6jtPEDj7OBVMoL5NPn/38+/TH3/sq + ffyTHzjhAWkD8QSRB5mJC3tIVcjw4NQsGrnLHKA+lkUbIsEyRXmuDu5KFxGABAIJBepo6TQawfQrMgUL + 7i6HNMfdtpiaAlOIyJ3m+w/sc8lofmGeu3MISRGSIyROkBsQMBBHOBbYNyLSRChCcIpohYwV6awFtcUn + QZpjfTFfNvYnRCz27+//6Xcu2dSC3EKvq5R5aT6A9K+0iDSHeMExgjTHfOZ499I8Ht2WlGmRHYduS8q0 + yI5DtyVlWorHoduSsqAMT4olwqUsDF03DUEJPlgsOR6GJcKlLAxdNw1aiscRlNtAysLQdS2sulp0xyEi + PAyrriXHw7DkeBiWCNeC3ELXtdCC3MKqa4nxKIZTmt//wH3uv8UgzyHL8TPOGY8+/gjte2Gvm6sbD7ZE + /EMfxLriWP7jv/6Tiyk6vo5GcI2MOIX4inMc4jTGZUFJoSvD9SGuH/HwbDwb5I+/yX3y63y8v/olN4Wf + vtMcN13geEGc4zi9evoUPf/Si7Tn0EF69vnn6Old22j7Uw/Tk/13mm958F56ePtOyoyfSZnqT9MVTY9T + duXj/fN/c56F6SaHKM3zIOY4j0MeCGmev2obFa9+inOz+VS96hF3p3nmtnWUx3lp4cLNVOgk2gOUWQCh + dp6lOeeqcdI8Nz2Ll+bnSvOT/Xeany3Ny+ZvovIb63mffYrGLeqgovkPUNUyPgblN1DF4nW2NMd0w/3S + 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 + BeOqAAAAAElFTkSuQmCC + + + + + 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 + Rmv0RnN0R3v0R4N0SIv0SJN0SZv0SaP0MQcEADs= + + + + + /9j/4AAQSkZJRgABAgEAAAAAAAD/7gAOQWRvYmUAZAAAAAAB/+wAEUR1Y2t5AAEABAAAAFAAAP/bAEMA + AgICAgICAgICAgMCAgIDBAMCAgMEBQQEBAQEBQYFBQUFBQUGBgcHCAcHBgkJCgoJCQwMDAwMDAwMDAwM + DAwMDP/bAEMBAwMDBQQFCQYGCQ0LCQsNDw4ODg4PDwwMDAwMDw8MDAwMDAwPDAwMDAwMDAwMDAwMDAwM + DAwMDAwMDAwMDAwMDP/AABEIASMCWAMBEQACEQEDEQH/xAAfAAAABwEBAQEBAAAAAAAAAAAEBQMCBgEA + BwgJCgv/xAC1EAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi + 8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE1OT0ZXWFlaW1 + xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZqbnJ2en5KjpKWmp6 + ipqqusra6vr/xAAfAQACAgMBAQEBAQAAAAAAAAABAAIDBAUGBwgJCgv/xAC1EQACAgECAwUFBAUGBAgD + A20BAAIRAwQhEjFBBVETYSIGcYGRMqGx8BTB0eEjQhVSYnLxMyQ0Q4IWklMlomOywgdz0jXiRIMXVJMI + CQoYGSY2RRonZHRVN/Kjs8MoKdPj84SUpLTE1OT0ZXWFlaW1xdXl9UZWZnaGlqa2xtbm9kdXZ3eHl6e3 + x9fn9zhIWGh4iJiouMjY6Pg5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6vr/2gAMAwEAAhEDEQA/APv5 + irsVdirsVdirsVdirsVdirsVdirsVea/nF/5LHzn/wBs9v8AiS5qu3P8Sy/1XE139xL3Py9zyN5F2Kux + V2KuxV2KuxV2KuxV2Kv1C/J3/wAlj5M/7Z6/8SbPXOw/8Sxf1XrtD/cR9z0rNq5bsVdirsVdirsVdirs + VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs + VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirzf830eT8s/OSRo0jtp7BU + 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 + kKU8c23ZXa0uzzIxiDxVz8nB12hjqgATVPkz/olf5A/8ur5g/wCkK1/rm6/0YZf9Tj8y6/8AkGH88u/6 + JX+QP/Lq+YP+kK1/rj/owy/6nH5lf5Bh/PLv+iV/kD/y6vmD/pCtf64/6MMv+px+ZX+QYfzy7/olf5A/ + 8ur5g/6QrX+uP+jDL/qcfmV/kGH88u/6JX+QP/Lq+YP+kK1/rj/owy/6nH5lf5Bh/PLv+iV/kD/y6vmD + /pCtf64/6MMv+px+ZX+QYfzy7/olf5A/8ur5g/6QrX+uP+jDL/qcfmV/kGH88u/6JX+QP/Lq+YP+kK1/ + rj/owy/6nH5lf5Bh/PLKvL//AD7B/JLT5Yp9f82+bfMRjILWqz2lnbydahxHbPLTp9mQfjtTl9rdTL6Y + xHzP6f0M4dhYRzJPyfbf5Z/k5+Wf5O6VLpH5ceULHyzbXJU31xCHlurkr9kz3UzSTS0qaBnIFTSmaDV6 + 7NqpcWWRP3D3Dk7TBpseAVAU9MzEb3Yqo3Fvb3lvPaXcEd1a3UbQ3NtMoeOSNwVZHVgQysDQg9cIJBsI + IvYvibz/AP8APvf/AJxx88XVxf2Oh6l5Avrkl5W8s3Ygty5JNRa3MdzAi/5MSIKdKZv9N7S6zCKJEh/S + H6RR+brM3Y+nyGwDH3PE7j/n1j+XDTO1r+aHmSGA09OOW2s5XGwrV1WMHf8AyRmePa/N1xx+ZcU9g4/5 + x+xR/wCiV/kD/wAur5g/6QrX+uH/AEYZf9Tj8yv8gw/nl3/RK/yB/wCXV8wf9IVr/XH/AEYZf9Tj8yv8 + gw/nl3/RK/yB/wCXV8wf9IVr/XH/AEYZf9Tj8yv8gw/nl3/RK/yB/wCXV8wf9IVr/XH/AEYZf9Tj8yv8 + gw/nl3/RK/yB/wCXV8wf9IVr/XH/AEYZf9Tj8yv8gw/nl3/RK/yB/wCXV8wf9IVr/XH/AEYZf9Tj8yv8 + gw/nlN9J/wCfW/5R28qvrX5g+bdTjVqmG1+o2nJafZJa3nPXrSm3h1yuftdqD9MIj5n9IZR7BxDnI/Y+ + vfyi/wCcY/yW/JCQ3vkPyfDBrzIY5fNGoO17qRVhxZUnmJ9JWGzLEEU9wc0ut7W1Os2yS27hsP2/F2On + 0OHBvAb9/V77mtct2Kvhf8/P+cGPKn5+fmFc/mFq/nrVtAvLmxtbFtOs7aCWILaqVDBpDWprvnQ9m+0O + TRYfCjAEWTvfV1Wr7KjqMnGZEPFv+iV/kD/y6vmD/pCtf65n/wCjDL/qcfmXG/kGH88u/wCiV/kD/wAu + r5g/6QrX+uP+jDL/AKnH5lf5Bh/PLv8Aolf5A/8ALq+YP+kK1/rj/owy/wCpx+ZX+QYfzy7/AKJX+QP/ + AC6vmD/pCtf64/6MMv8AqcfmV/kGH88u/wCiV/kD/wAur5g/6QrX+uP+jDL/AKnH5lf5Bh/PLv8Aolf5 + A/8ALq+YP+kK1/rj/owy/wCpx+ZX+QYfzy7/AKJX+QP/AC6vmD/pCtf64/6MMv8AqcfmV/kGH88tj/n1 + h+X9RX81PMJHcCztB/HH/Rhl/wBTj8yv8gw/nl6T5T/59q/849aBdx3muXPmbztwNW0/Ur+O3tTQkj4b + CC2l+dZcxM3tVq5io8MfcN/tJH2N2PsTBE2bPx/U+5vK3lPyz5I0Oy8teUNCsvLmg6evGz0uwhWGFK9W + ooFWbqzGpJ3JJzn82aeaRnMkk9S7XHjjjHDEUGQ5UzdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirw3/AJyH/MzXvyl/Le584eXLSwvdThv7S1WD + Uo5ZIOE7EMSsMsLVFNvizadj6KGs1AxzJAonbnt7wXQe0vauXszRnPiAMrA9V1v7iPvfKv5Mf85f/mV+ + Yv5neU/Jet6H5ZtdL164mivLixtrxLhRHbyyj02kvZVBqg6qds33aXs7p9Np55YylY7yK5jyeQ7D9tdZ + rtbjwZIYxGRN0JXyJ6yPd3P0czjX052KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV+SOp/mT+Yk + f/OV8flyPz95jTy8fzKtLA6Euq3YsvqranHG0H1cS+n6ZQlSnGlNqZ6DDRYD2Zx+HHi8Im6F3w87rm+N + Ze1NWO3fC8afB44HDxS4a4wKq6ryfrdnnz7K7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY + q7FXYq7FX5I/85YfmT+Ynlz87fMek+XvP3mPQdLgtNOaDTdO1W7tbdC9pEzlYopVUFiSTQbnPQewNFgy + 6OMp44k2dyATz9z417YdqavB2lOGLNOMQI7CUgPpHQF+t2efPsrsVdirsVdirsVdirsVdirsVdirsVdi + rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVfJP/ADmv/wCSMv8A/tsad/xNs6D2Z/xw + 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 + dirsVdirsVdirsVf/9k= + + + + + AAABAAEA3OIAAAEAGACIXwIAFgAAACgAAADcAAAAxAEAAAEAGAAAAAAAAAAAAHgAAAB4AAAAAAAAAAAA + AAD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////+/vn4+/P6/vf7/vn4/vn5//v4/vv4/f35/f79/P79/P//+/// + +v//+f//+v//+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+//9/P77/f78/P78 + /P/+/P/+/P/+/P/+/P///f/8/f75+/z5/fz6//33/fn5/vv///////////////////////////////// + ///////////////////////////////+/vX4/O75/vT4/vXy/vT1//nz/vn0/vz2/v78+/7++///+f// + +P//9///+P//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v/8/P76/f77/P78 + /P/++//++//++//9+v79+/36+vzz9vj1+/r3//zw+/T1/vn///////////////////////////////// + ///////////////////////////////+/vb9/vP8//b5/vXz/vT0//jy/vnx/vrx//v2/vv2/vv6/fz7 + /fz9/fz7/fz4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv1/vny/vj0/vj0 + /vn2/vr3/vr4/vv3/fv3/fv4/fv0+/j2/fr4//zx+/X2/vr///////////////////////////////// + ///////////////////////////////+/fT7+/H9//f5/vXz/fP0//fx//jt/fbr/fXu/fXv/fX0+/f0 + +/f4+vf1+/bx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXt/fLr//Hs/vHt + /vLu/fPv/fTx/PXy/ff2//v3//v3/vr3/vr5//zy/Pf2/vv///////////////////////////////// + ///////////////////////////////+/Pf++vX+//j5/fXw/PHx//Xi9+ng+unj/u7j/uzj/uvj/unj + /unk/ujk/unj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urf/ufc/+Xd/uXd + /ubg/ujh/unk/uvh+ufc8uDf8uPf7uTw+fP4//v2+vr6/f7///////////////////////////////// + /////////////////////////////////vr//vr///n5/fbv/PDn++zH4c+hwqyXuqKVvJ+VvJ6VvpuV + vpuWvpqWvpuVvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2Rv5qOwZePwJiP + wJiTvpuTvpyWvJ6dv6SuyLKxxra6yb7c5t/0+/f1+fr5/P7///////////////////////////////// + /////////////////////////////////Pz++/r+/vv6/vny//Tl++q428GbyKaWyaKSzZ6RzZ2Pz5mP + 0JmP0ZaQ0JiRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuN0JiJ0paL0peL + 0ZeNz5mOz5qSzJ2UyZ6Wwp+Yu5+mvqrU49nz+/j7+/38+v7///////////////////////////////// + ////////////////////////////////+vz+9vb9+vf7/vnz//Xp/u673sSZyKSUyaCPzZyOzZuM0JaM + 0JWL0pOM0JWOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiK0JaH0pSI0ZWI + 0ZWK0JaKz5ePzZqTzJ2byqSbwaKmwavZ6d71/fn9/P78+v7///////////////////////////////// + ////////////////////////////////+v//+v7/+/j5//jw//Ls//K73cWUyKCQy52Jz5eH0JWF1I+E + 1I6D1oyE1I6H0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOE05GD1JGD1JGD + 1JGD1JGD05GI0ZOKz5WSzJ2Yx6GdwaXX6dz2//r9+/7/+/////////////////////////////////// + ////////////////////////////////+v//+f7/+vj5/vjw//Ls//K83cWUyKCQy52Jz5eH0JWE1I+D + 1I6D1oyE1I6H0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOF0pKF0pKE05GD + 05GC1JCC1JCF0pKI0JSQzZuWyKCcwqTW6dv1//n9+/7/+/////////////////////////////////// + ////////////////////////////////+v//+f7/+vn5/vnw//Lt//K93MaUyKCQy52Jz5eH0JWD1I+D + 1I6D1oyE1I6H0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0ZSI0ZWF0pKF + 05KB1I+B1I+D1JGF0pONz5mUyp6aw6LU6tr0//n9+/7/+/////////////////////////////////// + ////////////////////////////////+v//+f7/+vn6/vnx/vLu//O93MaWx6GRyZ6LzZiKzpeG0pGG + 0pCG1I+H0pGKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aMzpeNzZmKz5WJ + 0JSD05GD05CD1JGF0pOM0JiSy5yXxKDT6tny//f7/P39/P////////////////////////////////// + ////////////////////////////////+v//+f7/+vn6/vny/vPu//O+3MeXxqKTyaCNzZqLzpiI0ZOI + 0ZKI05GJ0ZOMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiOzJqRy5yNzpeM + z5aF0pKE05GD1JGF05KL0ZeRzJuWxZ/S6tjy//f6/P38/P////////////////////////////////// + ////////////////////////////////+///+v7/+vn6/vny/vPv//S/28iZxaSWx6KQy5yPzJuMzpaM + z5aM0JSNzpaPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uTyZ2Wx5+RypuP + y5qH0ZSG0ZOD1JGE05KJ0paQzZuVxp7Q69fw//b4/f37/f////////////////////////////////// + ////////////////////////////////+///+v7/+vn6/vny/vPv//TA28maxKWXx6ORy52PzJuOzpiO + zpeO0JWPzpeRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yVyJ6Yx6GSyp2R + y5yI0JWH0ZSD1JGE05KJ0paPzZqVxp7Q69fw//b4/f36/f////////////////////////////////// + ///////////////////////////////7/vz7/fz9+Pz9+v37+fv2/ffE28eUypuMz5WD1I6B1YyK0JOM + z5WWypySzJqKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aGz5eDzpmKz5aM + z5WQ0JGP0ZGJ0pGI0ZOG0ZmKzJ2MxqHN69nw//b8+v3++/////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////8/P38/Pz++Pv8+/v4+/jz/vXC3MaWyZ2QzZiJ0JOH0ZKMzpaO + zZeUyp2QzJmJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSE0JaB0JeF0ZWG + 0ZSH05CG05CD05GD0pOE0ZmJzJ2NxqHM69nt//f5+/37/P////////////////////////////////// + ////////////////////////////////+f//+f7/+vn6/vny//Lv//LA3MWbxqGYyJ+TyZ2Syp2Ry52R + y52Ry52NzZiI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GD0pOA0pZ805N8 + 1JN31o931o941pF61JOC0pmJzJ6PxaLJ6trp//nz/f72/f////////////////////////////////// + ////////////////////////////////+f//+P7/+fr6/fny//Hv//G/3cOZx5+WyZ2Ry5uQy5qOzJqO + zJqNzZqNzpiMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WJ0JWG0JWD0pOB + 0pJ91Y591Y591I+A05KI0ZiPy5yVxKDP6tnu//f4/P36/f////////////////////////////////// + ////////////////////////////////+f//+P7/+fv6/fry//Hu//C+3sKYyJ6Vy5yPzJmNzZiMzpiL + zpiKz5iMzpiRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmOzpaM0JWI0ZKH + 0pKD1I6D1I6D1I+F0pGN0JeUy5uaxJ/U6tj0//f9/P3//P////////////////////////////////// + ////////////////////////////////+P//9/7/+fv6/frw//Ht/++73sCVypyRzZmK0JWI0JSF0pKF + 0pKD0pKJz5aSyp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2TzJiTzpWP0JKO + 0JKJ046J046J046M0pCS0JWYy5mexZ3Z6tb5//T+/fr//vz///////////////////////////////// + ////////////////////////////////9///9/7/+fv5/frw//Hs/++73sCUy5uQzpiI0ZOG0pKD1JGC + 1JGB1JGH0JaTyp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+VzJmXzpWSz5KR + 0JKM0o6M046M046O0o+U0JSay5mfxZ3b6tX7//P+/vn//vv///////////////////////////////// + ////////////////////////////////9///9/7/+fv5/fnw/+/r/+2537+SzJmOzpaF0pKD05GA1Y5/ + 1Y1+1oyD0pGKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqPzJiTzZePz5SO + 0JKI0o+I046H1I6J04+P0pOUzZeZx5vT69Ty//L5/vf7/vn///////////////////////////////// + ////////////////////////////////9///9/7/+fz5/fnw/+/r/+2537+SzJmNzpaE0pGD05CA1Y5/ + 1Y1+1oyC05GJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmOzJiSzJiOzpSN + z5OH0o+H046G1I6I1I+O0pOTzZiYyJzS69Tw//H3//f5//j///////////////////////////////// + ////////////////////////////////9f/++P7++v36/fry//Hp/+q5376TyZqNypaGzpGEz5CA0I+A + 0I+A0Y5/0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y+EzZaJyZqFzJeE + zJZ+0JF90ZB50o5905GC05aGzpmRzqLF7tTh/+/s//jr//b///////////////////////////////// + ////////////////////////////////9f/++P79+Pn7/frz//Pp/+u53r6Wyp2SzJuL0JaJ0JWG0ZSG + 0ZSG0pSE05OB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKIzpqNy5+JzZyI + zpuB0pWA0pV91JN90pN7y5B/xZKKx5zC7NLi//Hs//ns/vj///////////////////////////////// + ////////////////////////////////+P/++f359/X7//rz//Tp/+y63b+Yxp+Vx52QyZqPyZqOypqO + ypqOypqKzJaD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGJyZyOxaSJyJ+I + yZ6BzZiAzZh+z5aC0pqI1J+Iy56PyaTF7Njj//Xr//vl+/X///////////////////////////////// + ////////////////////////////////+//++v35+PX7//rz//Pp/+u+3sKdxaOZxqCWx5+Vx5+Vx5+V + x6CWxqGTyJ2NzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiTxqGYwqiTxaOS + xqKLypyKy5uGzZqIzZuJy5uLxJyUxaTL6tnp/vby/vzv+/n///////////////////////////////// + /////////////////////////////////P/++/37+/f8//ny/vHq/uvK5M2py62jyKiiyKmiyKqjx6uj + xqulxa6jx6qgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWlxqypw7Gkxa2j + xqybyqWay6SVzqOWzaOXyqKdyKemya/X7N7x/vf7/f39/f////////////////////////////////// + ////////////////////////////////+vz+/P78/fj7//jw/fDs/e3b8d3R6tXT7NjT7NnT7NnW7NzW + 7NzY69/Y7N3a7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dvd7N7g6uDc69zb + 7NvT7dXS7tTN79HN79HM7s/T7tXU6NXr9O35+vn99/3+9/////////////////////////////////// + ///////////////////////////////79Pb++/z8/vf7//fv/e/t/O7o/Orp/e3t//Lu//Lv//Py//fy + //f0//r2//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n9//n///r7//b7 + //Xy/+/x/+7t/+vs/+rs/+ny/+7w+uz3+vb/9vr/9P7/9v////////////////////////////////// + ///////////////////////////////9/Pz+/v7+/v3+//37/vv7/vv6//v6//v6//z7//z7//z8//38 + //38//39//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3///3+//z+ + //z8//v7//v6//r7//r7//r8//v8/vv9/v3//f3//P7//f////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////9//79/v79/v39/v7+/v7+/f7+/f/+/f///f///f///f///f// + /f///f///f///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v7///7///7/ + //7//v7//v///v///f7//f7//f7//f7//v7//v///v///v////////////////////////////////// + ///////////////////////////////3//z1/vr1/Pn3/Pv6+/37+P399//++P//+P//9v//9v//9P// + 9P//8///9f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f/+/Pz+/vv+/vv/ + /vz/+/7/+/7/+v7/+f7/9v3/9vz/9/3/+v7/+/7++/3++/3///////////////////////////////// + ///////////////////////////////3/vv2/vv2/fr2/Pr4+vz7+v39+//++f/++P/+9///9///9f// + 9f//9P/+9v7++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f38/Pr7/ff8/fj8 + /fj++/v++/v/+vz++vz9+vz++/z++/39+/z9+fr8+Pj9+Pj///////////////////////////////// + ///////////////////////////////1+/n4//z4/vz2/Pr4+/z6/f77/v/7/P77+/78+/79+/79+v/9 + +v/9+v/8+/37/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr4/vb3//T3//X3 + //X6/vf7/vf9/fj8/Pf7+/f9/fn+/vr9/fn8/Pj8/Pn9/fr///////////////////////////////// + ///////////////////////////////1+Pj6/v75/f32+/r2/fv3/vzz/Pjz+/j0/Pnz/Pfz/Pfz+/jy + +/fy+/fx/Pbx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/vLx//Dx//Dx + //Dz/vLz/vL1/fL1/fP2/fT4/vb5//j6//j6//j7//j6//f///////////////////////////////// + ///////////////////////////////3+Pr8/v/6/f72+vv2/vvy/ffj8uji9Ojm+uzk++rj++nh++jh + /Ojf/Obg/Ofh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jk++fl++Xl++Xl + ++Xl++bl++bm++bm+ubk9uTi8+Ll9Obv++/2/vX4//b0/fL///////////////////////////////// + ///////////////////////////////8+v39/P74+/31+vr2//rs+/DP5NO21L2x0ris1bOr1rKl2a+l + 2a6i2q2k2a+o1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOs1rKv1bKu1rGu + 1rGs1rGs1rGt1bGv1rOx1LSuz7K6177X79nu/e/0//Xx/vL///////////////////////////////// + ///////////////////////////////++//++/72+fv0+fn2//ro+OzB2cWiw6mcwqSWxp6Vx52OypiN + ypeKzJaMypmRx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Wxp6axZ6YxZ2Y + xp2Wxp2Wxp2Wxp2Zx5+bxaCWvJumyKvN6dDr/O3z//Xt/e////////////////////////////////// + /////////////////////////////////P/9+/72+fv2/frx/vTt/vLA28abxaOXx6COzJmMzZiG0ZKF + 0pKC1I6F0pKKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiRy5qVypySy5qR + zJmPzZeOzZaOzZaQzZiTzJuVyJ2ZxaDP6tPs/u/y//Tz/vX///////////////////////////////// + /////////////////////////////////P/9+/72+vv3/vrw/vPu//PA3MeaxaKWyJ+NzZmLzpeE05GE + 05GA1o2E05GJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eQzJqUy5uRzJmQ + zZiNz5aNz5WNz5WOzpeSzZuVyp2YxZ/P6tTt//Dy//T0//b///////////////////////////////// + /////////////////////////////////f/9/P71+/n1/vnu/vPs//O+3MaYxqGVyZ+LzpeJ0JWD1JGC + 1JB+14yB1I6I0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZONzpeRzJqNzZiM + zpiH0ZOG0pKF05KH0pON0JeRzJuVxp7O69Xt//Pz//j2//n///////////////////////////////// + ///////////////////////////////+/f/8/P70/Pj0/vnt/vPs//O+3MaYxqGVyJ+MzpiKz5aD05GC + 1JB/1o2C1I+I0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKNzZeRy5qNzZiM + zpiG0ZOG0pKE05GG0pOM0JeRzJuVxp7P69bt//P0/vn3/vv///////////////////////////////// + ///////////////////////////////7/v/5/f7z/Pjz//js//Lr//K+3MaZxqKXyKCPzJqNzZiH0pOG + 0pKD1JGG0pGM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKOzZeRy5yNzZiM + zpiF0pKE05GB1JGD05KJ0ZePzJuVxZ/Q6tfw//b4/f36/f////////////////////////////////// + ///////////////////////////////7/v/5/v7z/Pjz//js//Ls//K+3MaaxaKXx6CQy5qOzJmI0ZSH + 0ZOE05GH0pGN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKPzZiRy5yNzZmM + zpiE0pKD05GB1JGD05KJ0ZePzJyVxaDR6tnw//f6/P38/f////////////////////////////////// + ///////////////////////////////7///5/v7z/Pjz//js//Ls//PA3MebxaOYx6GRy5uPzJmK0JaJ + 0JWH0pOK0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQzZiRy52NzZmM + zpmD0pKC05GB1JGD05KJ0ZeQy5yWxKHS6try//n8+/7/+/////////////////////////////////// + ///////////////////////////////7//36/vz5+fr5/Pv1+/fy/vXC3MeXyJ6RzJqI0JOH0ZGK0JSL + z5WQzZiOzpeM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSKzpiIzZqLzpeM + z5aL0ZGK0ZGG0pGG0pOH0ZiMzJ2QxaHP69nw//f8+/3/+/////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//r7/vr++fv++/z9+/n2/vbE3MaVy5mN0JOE1YyD1ouK0ZKM + 0JOXypyUypuPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmTyZ2WyJ+SypyQ + y5uMzZiLzpeK0JSMz5aRzZuWyZ+aw6LT6tnx//f6/P38/P////////////////////////////////// + ///////////////////////////////6//r7/vr++fv9+/z8+/n2//bD3MaVy5mN0JOE1YyC1ouJ0pKM + 0JOXypyUypuPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmTyZ2WyJ+SypyQ + y5uLzpeLzpeJ0JSLz5aQzZuVyZ6Zw6HT6tnx//b5/P38/f7///////////////////////////////// + ///////////////////////////////5//r5/vr7+fv8+/35+/v0//fC3MaSy5mK0ZOB1oyA1ouI0pKK + 0JSVyp2Ry5uMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiRy5yVyZ+Ry5uQ + zJqI0JWH0ZSH0pOI0ZSNz5mSy5yWxZ/Q6tfw//b2//v5//z///////////////////////////////// + ///////////////////////////////4//r4/vr6+fz7/P33+/vz//fA3MaRy5qI0ZOA1ox+1ouG0pKJ + 0JSTyp2Qy5uKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aPzJqTyp2PzJmN + zZiH0ZSG0ZOF0pKH0ZSM0JiRzJyVxp7P69bu//T1//n4//v///////////////////////////////// + ///////////////////////////////2//z2/vz3+vz4/P31+/vw//e+3MePy5uH0ZV91o181oyF0pOH + 0JWRyp+NzJuI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWMzpeQzJqLz5aK + 0JaF0pKE05GD1JGE05KJ0paOzZqTx53N69Tt//Lz//f2//n///////////////////////////////// + ///////////////////////////////1//z0/vz2+f33+/30+vzv/vi93MiOy5yF0ZV81o571o2D0pSG + 0JaQyZ+NzJuH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOLzpeOzJmKz5aI + 0JWE05GD05GB1I+D05GI0pWOzpmSx5zM69Pr//Dy//f1//n///////////////////////////////// + ///////////////////////////////0//30/v31+f72+/3z+vzu/vi93MmNy5yF0ZZ71o961o6D0pWF + 0JeQyaCMzJuH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOLz5aOzZmJ0JWI + 0ZWD05GC1JCB1Y+D1JCI05SNzpiRyJvL69Lr//Dx//b0//n///////////////////////////////// + ///////////////////////////////w+vn1/v75+/73+v70+f3s/fa52cWMyJuFzpZ704561I2Dz5SF + zpaPxp+LypqGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OKzZaOypiKzZWJ + zpSD0ZCC0pCB0o+C0pCGz5KOzpmXzKHM7dPo/+3z//f1//n///////////////////////////////// + ///////////////////////////////x+vr2/v/5+v/2+P71+f3u/fe828iPy5+I0Zl+1pF915CG0peI + 0JmSyaKOzJ2J0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paNz5iRzZuOz5iN + 0JeG05OF1JKE1ZKF1JOH0JSOzZqbz6XP7tXq/+/0//j2//r///////////////////////////////// + ///////////////////////////////5/P76/P/69P/79f78+P71/fnF3M2Sx56HypR+z4580IyFy5OH + yZWSw56OxZqJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSOx5eSxZqNx5eM + x5eFzJGFzJGDzZCHzpONzpmRyJubyKTQ7Nfu//P4/vz0+Pn///////////////////////////////// + ///////////////////////////////6/P/6/P758fz+9//++v/0/PfB2smTx56Ky5eB0JB/0Y+IzJaK + y5iVxKGRx52MypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeRyJqVxp2QyJqP + yJqIzZSIzZSGzpOK0JaRz5ySyJybx6TS69jw//X5/v309vj///////////////////////////////// + ///////////////////////////////9+P7/+v7/8f7/+P//+P/0+PXD1MWbx6GVzpyM05aL1JWSz5uV + zp2gx6WdyaSXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GbyaSex6abyqOZ + yqKUzZ+Tzp6Sz5uTzp2SxpyXwqCjxKra6+D2/vv9+v7/+v////////////////////////////////// + ///////////////////////////////89fz/+v//8v//9///9v/19/bM3M2eyKOTy5qK0JOI0ZGQzJiT + ypqexKKbxaGVyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+ZxaKcxKSYxqGX + x6CRypyRypuQzJmRypqSxZycxqSox67Y6N3x+fb8+P3/+P////////////////////////////////// + ////////////////////////////////9v3/+f//8///9v//8//6+Prg69/A4sO45b2v6bWt6rO257q5 + 5rzE4cXA4sS548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K+4cbC4Mm+4ca9 + 4sW25MC25cC05b625cC75cTF5czK4dDn8Oz19fn99P3/9f////////////////////////////////// + ////////////////////////////////+v//+///9///+f//9//8+vzx+PDr+uzr/+7l/+nk/+jq/+zr + /+3y//Pw//Lr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hv//Px//Xv//Pu + //Pq//Dp//Do/+/p/+/r//Dw//Tv+/L3/Pn8/P7++v7/+v////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////+/P/+/P///P///P//+///+///+////P///P//+///+///+/// + +///+//7/f32//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r0//zz//31//72 + ///3///3/v/4/f/5/f/6/f/5/f/4/f/3/f/2/f/1/v70/v7///////////////////////////////// + ///////////////////////////////+/P/+/P///P//+///+///+///+//9+f/8+P/99//+9//+9//+ + 9//+9//5+vvw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xu/vfs/vnv/Pvw + /Pzy+/3y+/3z+f/1+v/5/f/4/f/2/f/2/v/1/v/0/v7z/v7///////////////////////////////// + ///////////////////////////////+/P/+/P/+/P/9+//8+//8+//8+//8/P/8/P/9/f/9/f/9/f/8 + /f/7/f/8/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f78/vv6/vn8/vv8 + /vz+/vz+/v3+/P/+/P/++v/++//++//+/P/+/f/+/f/+/f////////////////////////////////// + /////////////////////////////////P/++//9/P/9/P/7/P/7/P77/P77/P77/f77/f77/v77/v37 + /v35/v37/f7//P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P/9/fv7//n8//r9 + //r+//v//vv//f3//P3/+v7/+v7/+v7/+/7//P7/+/7/+/7///////////////////////////////// + ////////////////////////////////+//++//8/P/7/P/6/f/5/f34//z2//r1//r0//j0//jy//fy + //fy//X3/Pn/+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f///Pj///T///T/ + //T///T///T///X///b///n//vr//vz//fz//Pz/+f3/+f7///////////////////////////////// + ////////////////////////////////+//++//8/P/7/P75/f74/vz3//v1//r0//nz//fy//fw//Xw + //Xv//Tz/ff6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/ff7//P7//P7 + //P6//P6//P6//T6//T6//X7/vf8/vn+/fv//fz/+/7/+/////////////////////////////////// + ////////////////////////////////+//++//8/P/6/P74//z2//r1//ns/PHo+u7l++vl++vh/Ojg + /Off/Ofj++rq+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/r+uvs++js++fs + ++fq++fq++fq++fq++fr+ufv++v0++/6/PT+/fj//f3//f////////////////////////////////// + ////////////////////////////////+//++/76+v36/P31/fr1//ne7OPE3Mq/2sW73MK63cG23761 + 376z4Ly137243cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC63cC83cC63r66 + 3r634Ly34Ly34Ly5372838HB3sXG3Mjl8eX2/fb5/fz6/f3///////////////////////////////// + /////////////////////////////////P/++/75+fz5/Pzz/Pjz//nH2s2iv6ifwKaaw6GZxKCVxp6U + xp2RyJuQyJqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqSxp6VxaGRxp6R + x56OyJuOyZuOyZuPyZ2UyaKYxaScwKbS6dvv//f0//v2//z///////////////////////////////// + ////////////////////////////////+//++/75+fz5/fvy/Pby//fF2sufwaacw6OVxp6Ux52OypmN + y5iKzZaIzpWGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OKy5mNyJ2JypuI + ypqEzpeDzpaCzpaFzpiLzp2PyqCTxKPL6tjp//Xv//rx//z///////////////////////////////// + ////////////////////////////////+//++v75+vv5/fvy/fbx//bE28qew6WbxaKTyJyRyZuLzZeK + zZaH0JSF0ZKC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CGzpaJy5yFzJmE + zZl/0JV+0ZR90pR/0ZWG0JqKzJ6OxqHH69fm//Xs//rv//z///////////////////////////////// + ////////////////////////////////+//++v75+vv4/fvw/fXv//XA3MebxaOXx6COzJmMzZiE0pGD + 05GB1Y6D05CG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKLzpaOzJmKzpaJ + z5WC05CC049/1Y6B1JCI0pWNzZqSx57O69Xt//P0//n3//z///////////////////////////////// + ////////////////////////////////+//++v75+vv4/fvw/fXu//TA3MeaxqOXyKCOzZqMz5iD1JGD + 1ZGA1o6D1ZCI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSNz5eRzZmM0JaL + 0JWE1JCD1Y+B1o6D1ZCI05SOzpmTx53P69Xv//L2/vn5/vv///////////////////////////////// + ////////////////////////////////+//9+v73+vv3/vrw/vPt//O+3MaXyKGUy56K0JeI0pWB149/ + 14572ouD1JGSzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2XzJqbzZmV0JSU + 0ZON1I2M1YyJ14uL1YyR05CXzpWdx5rZ69P5//L+/fn//fv///////////////////////////////// + ///////////////////////////////++/79+/74+fv4/fvy/fTv/vS/3MaXyaCTzJ2K0paI05SD1pCD + 1pCB14+H05SRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyUzZqXzpmU0JWT + 0ZSO1I6O1Y6K1oyL1Y6P0pKVzpeax5vW69T3//L9/Pr//fz///////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/ZeroFlowTool/TemperatureFieldTempCal.Designer.cs b/ZeroFlowTool/TemperatureFieldTempCal.Designer.cs new file mode 100644 index 00000000..8a0c5dd0 --- /dev/null +++ b/ZeroFlowTool/TemperatureFieldTempCal.Designer.cs @@ -0,0 +1,295 @@ +namespace GenesisZeroFlow +{ + partial class TemperatureFieldTempCal + { + /// + /// 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() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TemperatureFieldTempCal)); + this.pB_TempField_Logo = new System.Windows.Forms.PictureBox(); + this.pB_TempField_Meter = new System.Windows.Forms.PictureBox(); + this.l_TempField_Meter1 = new System.Windows.Forms.Label(); + this.nUD_TempField_Celsius1 = new System.Windows.Forms.NumericUpDown(); + this.btn_TempField_OK = new System.Windows.Forms.Button(); + this.l_TemperatureDispPath2 = new System.Windows.Forms.Label(); + this.l_TemperatureDispPath1 = new System.Windows.Forms.Label(); + this.l_TemperaturePath2 = new System.Windows.Forms.Label(); + this.l_TemperaturePath1 = new System.Windows.Forms.Label(); + this.l_TemperaturePath0 = new System.Windows.Forms.Label(); + this.l_TemperatureDispPath0 = new System.Windows.Forms.Label(); + this.gB_Logging = new System.Windows.Forms.GroupBox(); + this.l_LoggingStatus = new System.Windows.Forms.Label(); + this.cB_Logging = new System.Windows.Forms.CheckBox(); + this.tmrUpdateTemp = new System.Windows.Forms.Timer(this.components); + ((System.ComponentModel.ISupportInitialize)(this.pB_TempField_Logo)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pB_TempField_Meter)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_TempField_Celsius1)).BeginInit(); + this.gB_Logging.SuspendLayout(); + this.SuspendLayout(); + // + // pB_TempField_Logo + // + this.pB_TempField_Logo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.pB_TempField_Logo.Image = ((System.Drawing.Image)(resources.GetObject("pB_TempField_Logo.Image"))); + this.pB_TempField_Logo.InitialImage = null; + this.pB_TempField_Logo.Location = new System.Drawing.Point(479, 20); + this.pB_TempField_Logo.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.pB_TempField_Logo.Name = "pB_TempField_Logo"; + this.pB_TempField_Logo.Size = new System.Drawing.Size(86, 39); + this.pB_TempField_Logo.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pB_TempField_Logo.TabIndex = 15; + this.pB_TempField_Logo.TabStop = false; + // + // pB_TempField_Meter + // + this.pB_TempField_Meter.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.pB_TempField_Meter.BackColor = System.Drawing.Color.Transparent; + this.pB_TempField_Meter.ErrorImage = ((System.Drawing.Image)(resources.GetObject("pB_TempField_Meter.ErrorImage"))); + this.pB_TempField_Meter.Image = ((System.Drawing.Image)(resources.GetObject("pB_TempField_Meter.Image"))); + this.pB_TempField_Meter.InitialImage = ((System.Drawing.Image)(resources.GetObject("pB_TempField_Meter.InitialImage"))); + this.pB_TempField_Meter.Location = new System.Drawing.Point(502, 68); + this.pB_TempField_Meter.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.pB_TempField_Meter.Name = "pB_TempField_Meter"; + this.pB_TempField_Meter.Size = new System.Drawing.Size(50, 41); + this.pB_TempField_Meter.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pB_TempField_Meter.TabIndex = 28; + this.pB_TempField_Meter.TabStop = false; + // + // l_TempField_Meter1 + // + this.l_TempField_Meter1.Anchor = System.Windows.Forms.AnchorStyles.None; + this.l_TempField_Meter1.AutoSize = true; + this.l_TempField_Meter1.Font = new System.Drawing.Font("Microsoft Sans Serif", 16.2F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_TempField_Meter1.Location = new System.Drawing.Point(146, 114); + this.l_TempField_Meter1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TempField_Meter1.Name = "l_TempField_Meter1"; + this.l_TempField_Meter1.Size = new System.Drawing.Size(290, 26); + this.l_TempField_Meter1.TabIndex = 37; + this.l_TempField_Meter1.Text = "Reference Temperature/ [°C]"; + // + // nUD_TempField_Celsius1 + // + this.nUD_TempField_Celsius1.Anchor = System.Windows.Forms.AnchorStyles.None; + this.nUD_TempField_Celsius1.DecimalPlaces = 2; + this.nUD_TempField_Celsius1.Font = new System.Drawing.Font("Microsoft Sans Serif", 16.2F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.nUD_TempField_Celsius1.Increment = new decimal(new int[] { + 1, + 0, + 0, + 131072}); + this.nUD_TempField_Celsius1.Location = new System.Drawing.Point(222, 158); + this.nUD_TempField_Celsius1.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.nUD_TempField_Celsius1.Maximum = new decimal(new int[] { + 50, + 0, + 0, + 0}); + this.nUD_TempField_Celsius1.Name = "nUD_TempField_Celsius1"; + this.nUD_TempField_Celsius1.Size = new System.Drawing.Size(118, 32); + this.nUD_TempField_Celsius1.TabIndex = 38; + this.nUD_TempField_Celsius1.Value = new decimal(new int[] { + 20, + 0, + 0, + 0}); + this.nUD_TempField_Celsius1.ValueChanged += new System.EventHandler(this.nUD_TempField_Celsius1_ValueChanged); + this.nUD_TempField_Celsius1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.nUD_TempField_Celsius1_KeyDown); + this.nUD_TempField_Celsius1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.nUD_TempField_Celsius1_KeyPress); + // + // btn_TempField_OK + // + this.btn_TempField_OK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btn_TempField_OK.Location = new System.Drawing.Point(457, 292); + this.btn_TempField_OK.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.btn_TempField_OK.Name = "btn_TempField_OK"; + this.btn_TempField_OK.Size = new System.Drawing.Size(100, 42); + this.btn_TempField_OK.TabIndex = 47; + this.btn_TempField_OK.Text = "OK"; + this.btn_TempField_OK.UseVisualStyleBackColor = true; + this.btn_TempField_OK.Click += new System.EventHandler(this.btn_TempField_OK_Click); + // + // l_TemperatureDispPath2 + // + this.l_TemperatureDispPath2.AutoSize = true; + this.l_TemperatureDispPath2.Font = new System.Drawing.Font("Microsoft Sans Serif", 13.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_TemperatureDispPath2.Location = new System.Drawing.Point(486, 190); + this.l_TemperatureDispPath2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TemperatureDispPath2.Name = "l_TemperatureDispPath2"; + this.l_TemperatureDispPath2.Size = new System.Drawing.Size(31, 24); + this.l_TemperatureDispPath2.TabIndex = 64; + this.l_TemperatureDispPath2.Text = "---"; + // + // l_TemperatureDispPath1 + // + this.l_TemperatureDispPath1.AutoSize = true; + this.l_TemperatureDispPath1.Font = new System.Drawing.Font("Microsoft Sans Serif", 13.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_TemperatureDispPath1.Location = new System.Drawing.Point(486, 161); + this.l_TemperatureDispPath1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TemperatureDispPath1.Name = "l_TemperatureDispPath1"; + this.l_TemperatureDispPath1.Size = new System.Drawing.Size(31, 24); + this.l_TemperatureDispPath1.TabIndex = 63; + this.l_TemperatureDispPath1.Text = "---"; + // + // l_TemperaturePath2 + // + this.l_TemperaturePath2.AutoSize = true; + this.l_TemperaturePath2.Font = new System.Drawing.Font("Microsoft Sans Serif", 16.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_TemperaturePath2.Location = new System.Drawing.Point(81, 190); + this.l_TemperaturePath2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TemperaturePath2.Name = "l_TemperaturePath2"; + this.l_TemperaturePath2.Size = new System.Drawing.Size(402, 26); + this.l_TemperaturePath2.TabIndex = 62; + this.l_TemperaturePath2.Text = "measured Temperature PATH3/ [°C]:"; + // + // l_TemperaturePath1 + // + this.l_TemperaturePath1.AutoSize = true; + this.l_TemperaturePath1.Font = new System.Drawing.Font("Microsoft Sans Serif", 16.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_TemperaturePath1.Location = new System.Drawing.Point(81, 161); + this.l_TemperaturePath1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TemperaturePath1.Name = "l_TemperaturePath1"; + this.l_TemperaturePath1.Size = new System.Drawing.Size(402, 26); + this.l_TemperaturePath1.TabIndex = 61; + this.l_TemperaturePath1.Text = "measured Temperature PATH2/ [°C]:"; + // + // l_TemperaturePath0 + // + this.l_TemperaturePath0.AutoSize = true; + this.l_TemperaturePath0.Font = new System.Drawing.Font("Microsoft Sans Serif", 16.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_TemperaturePath0.Location = new System.Drawing.Point(81, 132); + this.l_TemperaturePath0.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TemperaturePath0.Name = "l_TemperaturePath0"; + this.l_TemperaturePath0.Size = new System.Drawing.Size(402, 26); + this.l_TemperaturePath0.TabIndex = 60; + this.l_TemperaturePath0.Text = "measured Temperature PATH1/ [°C]:"; + // + // l_TemperatureDispPath0 + // + this.l_TemperatureDispPath0.AutoSize = true; + this.l_TemperatureDispPath0.Font = new System.Drawing.Font("Microsoft Sans Serif", 13.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_TemperatureDispPath0.Location = new System.Drawing.Point(486, 132); + this.l_TemperatureDispPath0.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TemperatureDispPath0.Name = "l_TemperatureDispPath0"; + this.l_TemperatureDispPath0.Size = new System.Drawing.Size(31, 24); + this.l_TemperatureDispPath0.TabIndex = 59; + this.l_TemperatureDispPath0.Text = "---"; + // + // gB_Logging + // + this.gB_Logging.BackColor = System.Drawing.Color.Honeydew; + this.gB_Logging.Controls.Add(this.l_LoggingStatus); + this.gB_Logging.Controls.Add(this.cB_Logging); + this.gB_Logging.Location = new System.Drawing.Point(76, 283); + this.gB_Logging.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.gB_Logging.Name = "gB_Logging"; + this.gB_Logging.Padding = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.gB_Logging.Size = new System.Drawing.Size(351, 58); + this.gB_Logging.TabIndex = 65; + this.gB_Logging.TabStop = false; + this.gB_Logging.Text = "Logging"; + // + // l_LoggingStatus + // + this.l_LoggingStatus.AutoSize = true; + this.l_LoggingStatus.Location = new System.Drawing.Point(108, 24); + this.l_LoggingStatus.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_LoggingStatus.Name = "l_LoggingStatus"; + this.l_LoggingStatus.Size = new System.Drawing.Size(16, 13); + this.l_LoggingStatus.TabIndex = 1; + this.l_LoggingStatus.Text = "---"; + // + // cB_Logging + // + this.cB_Logging.AutoSize = true; + this.cB_Logging.Location = new System.Drawing.Point(22, 24); + this.cB_Logging.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.cB_Logging.Name = "cB_Logging"; + this.cB_Logging.Size = new System.Drawing.Size(59, 17); + this.cB_Logging.TabIndex = 0; + this.cB_Logging.Text = "Enable"; + this.cB_Logging.UseVisualStyleBackColor = true; + this.cB_Logging.CheckedChanged += new System.EventHandler(this.cB_Logging_CheckedChanged); + // + // tmrUpdateTemp + // + this.tmrUpdateTemp.Interval = 1000; + this.tmrUpdateTemp.Tick += new System.EventHandler(this.tmrUpdateTemp_Tick); + // + // TemperatureFieldTempCal + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.AliceBlue; + this.ClientSize = new System.Drawing.Size(590, 365); + this.Controls.Add(this.gB_Logging); + this.Controls.Add(this.l_TemperatureDispPath2); + this.Controls.Add(this.l_TemperatureDispPath1); + this.Controls.Add(this.l_TemperaturePath2); + this.Controls.Add(this.l_TemperaturePath1); + this.Controls.Add(this.l_TemperaturePath0); + this.Controls.Add(this.l_TemperatureDispPath0); + this.Controls.Add(this.btn_TempField_OK); + this.Controls.Add(this.nUD_TempField_Celsius1); + this.Controls.Add(this.l_TempField_Meter1); + this.Controls.Add(this.pB_TempField_Meter); + this.Controls.Add(this.pB_TempField_Logo); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.Name = "TemperatureFieldTempCal"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.TemperatureFieldTempCal_FormClosing); + this.Load += new System.EventHandler(this.TemperatureFieldTempCal_Load); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TemperatureFieldTempCal_KeyDown); + ((System.ComponentModel.ISupportInitialize)(this.pB_TempField_Logo)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pB_TempField_Meter)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_TempField_Celsius1)).EndInit(); + this.gB_Logging.ResumeLayout(false); + this.gB_Logging.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.PictureBox pB_TempField_Logo; + private System.Windows.Forms.PictureBox pB_TempField_Meter; + private System.Windows.Forms.Label l_TempField_Meter1; + private System.Windows.Forms.NumericUpDown nUD_TempField_Celsius1; + private System.Windows.Forms.Button btn_TempField_OK; + private System.Windows.Forms.Label l_TemperatureDispPath2; + private System.Windows.Forms.Label l_TemperatureDispPath1; + private System.Windows.Forms.Label l_TemperaturePath2; + private System.Windows.Forms.Label l_TemperaturePath1; + private System.Windows.Forms.Label l_TemperaturePath0; + private System.Windows.Forms.Label l_TemperatureDispPath0; + private System.Windows.Forms.GroupBox gB_Logging; + private System.Windows.Forms.CheckBox cB_Logging; + private System.Windows.Forms.Label l_LoggingStatus; + private System.Windows.Forms.Timer tmrUpdateTemp; + } +} \ No newline at end of file diff --git a/ZeroFlowTool/TemperatureFieldTempCal.cs b/ZeroFlowTool/TemperatureFieldTempCal.cs new file mode 100644 index 00000000..fff35cca --- /dev/null +++ b/ZeroFlowTool/TemperatureFieldTempCal.cs @@ -0,0 +1,289 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Windows.Forms; +using System.Globalization; + +namespace GenesisZeroFlow +{ + public partial class TemperatureFieldTempCal : Form + { + + + public static class DisplayTempCal + { + public static void TemperatureInputForm2Visible(Boolean visible) + { + if (TemperatureFieldTempCal._TemperatureFieldTempCal.InvokeRequired) + { + TemperatureFieldTempCal._TemperatureFieldTempCal.Invoke((Action)TemperatureInputForm2Visible, visible); + return; + } + + TemperatureFieldTempCal._TemperatureFieldTempCal.l_TempField_Meter1.Visible = visible; + TemperatureFieldTempCal._TemperatureFieldTempCal.nUD_TempField_Celsius1.Visible = visible; + } + + public static void TemperatureDisplayForm2Visible(Boolean visible) + { + if (TemperatureFieldTempCal._TemperatureFieldTempCal.InvokeRequired) + { + TemperatureFieldTempCal._TemperatureFieldTempCal.Invoke((Action)TemperatureDisplayForm2Visible, visible); + return; + } + + TemperatureFieldTempCal._TemperatureFieldTempCal.l_TemperaturePath0.Visible = visible; + TemperatureFieldTempCal._TemperatureFieldTempCal.l_TemperatureDispPath0.Visible = visible; + TemperatureFieldTempCal._TemperatureFieldTempCal.l_TemperaturePath1.Visible = visible; + TemperatureFieldTempCal._TemperatureFieldTempCal.l_TemperatureDispPath1.Visible = visible; + TemperatureFieldTempCal._TemperatureFieldTempCal.l_TemperaturePath2.Visible = visible; + TemperatureFieldTempCal._TemperatureFieldTempCal.l_TemperatureDispPath2.Visible = visible; + } + + public static void TemperatureDisplayForm2(UInt16 path, double? text, CultureInfo Culture) + { + + try + { + if (text.HasValue) + { + var resultText = text.Value.ToString("0.0000", Culture); + if (path == Constants.PATH0 && TemperatureFieldTempCal._TemperatureFieldTempCal.l_TemperatureDispPath0.Text == resultText) + return; + if (path == Constants.PATH1 && TemperatureFieldTempCal._TemperatureFieldTempCal.l_TemperatureDispPath1.Text == resultText) + return; + if (path == Constants.PATH2 && TemperatureFieldTempCal._TemperatureFieldTempCal.l_TemperatureDispPath2.Text == resultText) + return; + + if (TemperatureFieldTempCal._TemperatureFieldTempCal.InvokeRequired) + { + TemperatureFieldTempCal._TemperatureFieldTempCal.Invoke((Action)TemperatureDisplayForm2, path, text, Culture); + return; + } + + + switch (path) + { + case Constants.PATH0: + TemperatureFieldTempCal._TemperatureFieldTempCal.l_TemperatureDispPath0.Text = resultText; + break; + case Constants.PATH1: + TemperatureFieldTempCal._TemperatureFieldTempCal.l_TemperatureDispPath1.Text = resultText; + break; + case Constants.PATH2: + TemperatureFieldTempCal._TemperatureFieldTempCal.l_TemperatureDispPath2.Text = resultText; + break; + } + } + } + catch (Exception) + { + // MessageBox.Show("exception"); + } + } + + + } + + private static double AddTemp(ushort path, double value) + { + var r = 0.0; + switch (path) + { + case Constants.PATH0: + TemperatureDispPath0.Add(value); + if (TemperatureDispPath0.Count > 20) + { + TemperatureDispPath0.RemoveAt(0); + } + + if (!TemperatureDispPath0.Any()) + { + return -100; + } + TemperatureDispPath0.ForEach(a => r = r + a); + r = r / TemperatureDispPath0.Count; + break; + + case Constants.PATH1: + TemperatureDispPath1.Add(value); + if (TemperatureDispPath1.Count > 20) + { + TemperatureDispPath1.RemoveAt(0); + } + if (!TemperatureDispPath1.Any()) + { + return -100; + } + TemperatureDispPath1.ForEach(a => r = r + a); + r = r / TemperatureDispPath1.Count; + break; + case Constants.PATH2: + TemperatureDispPath2.Add(value); + if (TemperatureDispPath2.Count > 20) + { + TemperatureDispPath2.RemoveAt(0); + } + if (!TemperatureDispPath2.Any()) + { + return -100; + } + TemperatureDispPath2.ForEach(a => r = r + a); + r = r / TemperatureDispPath2.Count; + break; + + } + + return r; + + + } + + public TemperatureFieldTempCal() + { + InitializeComponent(); + _TemperatureFieldTempCal = this; + tmrUpdateTemp.Enabled = true; + } + + public static TemperatureFieldTempCal _TemperatureFieldTempCal; + + + static List TemperatureDispPath0 = new List(); + static List TemperatureDispPath1 = new List(); + static List TemperatureDispPath2 = new List(); + + + + public Double GetValueMeter1() + { + return (Double)nUD_TempField_Celsius1.Value; + } + + public void SetEnabledGbLogging(Boolean enabled) + { + gB_Logging.Enabled = enabled; + } + + private void btn_TempField_OK_Click(object sender, EventArgs e) + { + cB_Logging.Checked = false; + TemperatureFieldTempCal._TemperatureFieldTempCal.Close(); + frmTempCalibration._frmTempCalibration.SetWaitForTemperatureFieldTempCal(false); + } + + private void TemperatureFieldTempCal_Load(object sender, EventArgs e) + { + frmTempCalibration._frmTempCalibration.ThirdFormOpenIndicator = true; + Thread.CurrentThread.CurrentCulture = frmTempCalibration._frmTempCalibration.GetGlobalCulture(); + nUD_TempField_Celsius1.Value = (Decimal)((Double)nUD_TempField_Celsius1.Value + 0.01); + nUD_TempField_Celsius1.Value = (Decimal)((Double)nUD_TempField_Celsius1.Value - 0.01); + TemperatureFieldTempCal.DisplayTempCal.TemperatureInputForm2Visible(frmTempCalibration._frmTempCalibration.GetAdjustmentSelectedStatus()); + TemperatureFieldTempCal.DisplayTempCal.TemperatureDisplayForm2Visible(frmTempCalibration._frmTempCalibration.GetMeasurementSelectedStatus()); + + + if (frmTempCalibration._frmTempCalibration.GetMeasurementSelectedStatus()) + this.Text = "SENSUS Hannover - TEMPERATURE MEASUREMENT"; + else + this.Text = "SENSUS Hannover - TEMPERATURE ADJUSTMENT"; + l_LoggingStatus.Text = "Status: Logging not yet started"; + } + + private void TemperatureFieldTempCal_FormClosing(object sender, FormClosingEventArgs e) + { + tmrUpdateTemp.Enabled = false; + frmTempCalibration._frmTempCalibration.SetWaitForTemperatureFieldTempCal(false); + Misc.WaitNMilliseconds(100); + frmTempCalibration._frmTempCalibration.ThirdFormOpenIndicator = false; + + + //TemperatureFieldTempCal._TemperatureFieldTempCal.Close(); + + } + + private void nUD_TempField_Celsius1_KeyDown(object sender, KeyEventArgs e) + { + LevaeFormOnEnterIsPressed(sender, e); + } + + private void TemperatureFieldTempCal_KeyDown(object sender, KeyEventArgs e) + { + LevaeFormOnEnterIsPressed(sender, e); + } + + private void LevaeFormOnEnterIsPressed(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + btn_TempField_OK_Click(sender, EventArgs.Empty); + } + } + + private void nUD_TempField_Celsius1_ValueChanged(object sender, EventArgs e) + { + //if (sender is NumericUpDown) + //{ + // var NumericUpDownSender = (NumericUpDown)sender; + //} + } + + private void nUD_TempField_Celsius1_KeyPress(object sender, KeyPressEventArgs e) + { + if (e.KeyChar.Equals('.') || e.KeyChar.Equals(',')) + { + e.KeyChar = '.'; + } + } + + String TemperatureLoggingPath = String.Empty; + + private void cB_Logging_CheckedChanged(object sender, EventArgs e) + { + CultureInfo Culture = frmTempCalibration._frmTempCalibration.GetGlobalCulture(); + DateTime Time = System.DateTime.Now; + String Logfiletime = Time.ToString(Formats.LogFileDateTimeString, Culture); + String Headertime = Time.ToString(Formats.HeaderFileDateTimeString, Culture); + String Statustime = Time.ToString(Formats.HeaderFileDateTimeString, Culture); + + if (cB_Logging.Checked) + { + + TemperatureLoggingPath = $@"..\TemperatureCalibrator_TemperatureLogging_{Logfiletime}.txt"; + String Header = $"Genesis Temperature Calibrator ; Date = {Headertime}; Operator = {Environment.UserName}\n"; + frmTempCalibration._frmTempCalibration.SetDataToLog(Header); + l_LoggingStatus.Text = $"Status: Logging started at {Statustime}"; + frmTempCalibration._frmTempCalibration.SetLoggingIndicatorTempTest(true); + } + else + { + frmTempCalibration._frmTempCalibration.SetLoggingIndicatorTempTest(false); + l_LoggingStatus.Text = $"Status: Logging stopped at {Statustime}"; + Logging.WriteToFile(frmTempCalibration._frmTempCalibration.GetDataToLog(), TemperatureLoggingPath); + frmTempCalibration._frmTempCalibration.SetDataToLog(String.Empty); + } + } + + private void tmrUpdateTemp_Tick(object sender, EventArgs e) + { + CultureInfo Culture = frmTempCalibration._frmTempCalibration.GetGlobalCulture(); + + + var DecodedAllMeters = frmTempCalibration._frmTempCalibration.GetDecodedAllMeters(); + + for (ushort Path = 0; Path < 3; Path++) + { + if (frmTempCalibration._frmTempCalibration.GetAdjustmentSelectedStatus()) + frmTempCalibration.DisplayTempCal.TempCalSetTemperatureLabel(Path, Math.Round(DecodedAllMeters[Path].TemperatureDegC, 5).ToString("0.00", Culture)); + else + { + if (frmTempCalibration._frmTempCalibration.ThirdFormOpenIndicator) + TemperatureFieldTempCal.DisplayTempCal.TemperatureDisplayForm2(Path, Math.Round(DecodedAllMeters[Path].TemperatureDegC, 5), Culture); + } + } + + frmTempCalibration._frmTempCalibration.FlushBuffer(); + + } + } +} diff --git a/ZeroFlowTool/TemperatureFieldTempCal.resx b/ZeroFlowTool/TemperatureFieldTempCal.resx new file mode 100644 index 00000000..f734fd8b --- /dev/null +++ b/ZeroFlowTool/TemperatureFieldTempCal.resx @@ -0,0 +1,18852 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + /9j/4AAQSkZJRgABAgEAAAAAAAD/7gAOQWRvYmUAZAAAAAAB/+wAEUR1Y2t5AAEABAAAAFAAAP/bAEMA + AgICAgICAgICAgMCAgIDBAMCAgMEBQQEBAQEBQYFBQUFBQUGBgcHCAcHBgkJCgoJCQwMDAwMDAwMDAwM + DAwMDP/bAEMBAwMDBQQFCQYGCQ0LCQsNDw4ODg4PDwwMDAwMDw8MDAwMDAwPDAwMDAwMDAwMDAwMDAwM + DAwMDAwMDAwMDAwMDP/AABEIASMCWAMBEQACEQEDEQH/xAAfAAAABwEBAQEBAAAAAAAAAAAEBQMCBgEA + BwgJCgv/xAC1EAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi + 8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE1OT0ZXWFlaW1 + xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZqbnJ2en5KjpKWmp6 + ipqqusra6vr/xAAfAQACAgMBAQEBAQAAAAAAAAABAAIDBAUGBwgJCgv/xAC1EQACAgECAwUFBAUGBAgD + A20BAAIRAwQhEjFBBVETYSIGcYGRMqGx8BTB0eEjQhVSYnLxMyQ0Q4IWklMlomOywgdz0jXiRIMXVJMI + CQoYGSY2RRonZHRVN/Kjs8MoKdPj84SUpLTE1OT0ZXWFlaW1xdXl9UZWZnaGlqa2xtbm9kdXZ3eHl6e3 + x9fn9zhIWGh4iJiouMjY6Pg5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6vr/2gAMAwEAAhEDEQA/APv5 + irsVdirsVdirsVdirsVdirsVdirsVea/nF/5LHzn/wBs9v8AiS5qu3P8Sy/1XE139xL3Py9zyN5F2Kux + V2KuxV2KuxV2KuxV2Kv1C/J3/wAlj5M/7Z6/8SbPXOw/8Sxf1XrtD/cR9z0rNq5bsVdirsVdirsVdirs + VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs + VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirzf830eT8s/OSRo0jtp7BU + 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 + kKU8c23ZXa0uzzIxiDxVz8nB12hjqgATVPkz/olf5A/8ur5g/wCkK1/rm6/0YZf9Tj8y6/8AkGH88u/6 + JX+QP/Lq+YP+kK1/rj/owy/6nH5lf5Bh/PLv+iV/kD/y6vmD/pCtf64/6MMv+px+ZX+QYfzy7/olf5A/ + 8ur5g/6QrX+uP+jDL/qcfmV/kGH88u/6JX+QP/Lq+YP+kK1/rj/owy/6nH5lf5Bh/PLv+iV/kD/y6vmD + /pCtf64/6MMv+px+ZX+QYfzy7/olf5A/8ur5g/6QrX+uP+jDL/qcfmV/kGH88u/6JX+QP/Lq+YP+kK1/ + rj/owy/6nH5lf5Bh/PLKvL//AD7B/JLT5Yp9f82+bfMRjILWqz2lnbydahxHbPLTp9mQfjtTl9rdTL6Y + xHzP6f0M4dhYRzJPyfbf5Z/k5+Wf5O6VLpH5ceULHyzbXJU31xCHlurkr9kz3UzSTS0qaBnIFTSmaDV6 + 7NqpcWWRP3D3Dk7TBpseAVAU9MzEb3Yqo3Fvb3lvPaXcEd1a3UbQ3NtMoeOSNwVZHVgQysDQg9cIJBsI + IvYvibz/AP8APvf/AJxx88XVxf2Oh6l5Avrkl5W8s3Ygty5JNRa3MdzAi/5MSIKdKZv9N7S6zCKJEh/S + H6RR+brM3Y+nyGwDH3PE7j/n1j+XDTO1r+aHmSGA09OOW2s5XGwrV1WMHf8AyRmePa/N1xx+ZcU9g4/5 + x+xR/wCiV/kD/wAur5g/6QrX+uH/AEYZf9Tj8yv8gw/nl3/RK/yB/wCXV8wf9IVr/XH/AEYZf9Tj8yv8 + gw/nl3/RK/yB/wCXV8wf9IVr/XH/AEYZf9Tj8yv8gw/nl3/RK/yB/wCXV8wf9IVr/XH/AEYZf9Tj8yv8 + gw/nl3/RK/yB/wCXV8wf9IVr/XH/AEYZf9Tj8yv8gw/nl3/RK/yB/wCXV8wf9IVr/XH/AEYZf9Tj8yv8 + gw/nlN9J/wCfW/5R28qvrX5g+bdTjVqmG1+o2nJafZJa3nPXrSm3h1yuftdqD9MIj5n9IZR7BxDnI/Y+ + vfyi/wCcY/yW/JCQ3vkPyfDBrzIY5fNGoO17qRVhxZUnmJ9JWGzLEEU9wc0ut7W1Os2yS27hsP2/F2On + 0OHBvAb9/V77mtct2Kvhf8/P+cGPKn5+fmFc/mFq/nrVtAvLmxtbFtOs7aCWILaqVDBpDWprvnQ9m+0O + TRYfCjAEWTvfV1Wr7KjqMnGZEPFv+iV/kD/y6vmD/pCtf65n/wCjDL/qcfmXG/kGH88u/wCiV/kD/wAu + r5g/6QrX+uP+jDL/AKnH5lf5Bh/PLv8Aolf5A/8ALq+YP+kK1/rj/owy/wCpx+ZX+QYfzy7/AKJX+QP/ + AC6vmD/pCtf64/6MMv8AqcfmV/kGH88u/wCiV/kD/wAur5g/6QrX+uP+jDL/AKnH5lf5Bh/PLv8Aolf5 + A/8ALq+YP+kK1/rj/owy/wCpx+ZX+QYfzy7/AKJX+QP/AC6vmD/pCtf64/6MMv8AqcfmV/kGH88tj/n1 + h+X9RX81PMJHcCztB/HH/Rhl/wBTj8yv8gw/nl6T5T/59q/849aBdx3muXPmbztwNW0/Ur+O3tTQkj4b + CC2l+dZcxM3tVq5io8MfcN/tJH2N2PsTBE2bPx/U+5vK3lPyz5I0Oy8teUNCsvLmg6evGz0uwhWGFK9W + ooFWbqzGpJ3JJzn82aeaRnMkk9S7XHjjjHDEUGQ5UzdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirw3/AJyH/MzXvyl/Le584eXLSwvdThv7S1WD + Uo5ZIOE7EMSsMsLVFNvizadj6KGs1AxzJAonbnt7wXQe0vauXszRnPiAMrA9V1v7iPvfKv5Mf85f/mV+ + Yv5neU/Jet6H5ZtdL164mivLixtrxLhRHbyyj02kvZVBqg6qds33aXs7p9Np55YylY7yK5jyeQ7D9tdZ + rtbjwZIYxGRN0JXyJ6yPd3P0czjX052KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV+SOp/mT+Yk + f/OV8flyPz95jTy8fzKtLA6Euq3YsvqranHG0H1cS+n6ZQlSnGlNqZ6DDRYD2Zx+HHi8Im6F3w87rm+N + Ze1NWO3fC8afB44HDxS4a4wKq6ryfrdnnz7K7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY + q7FXYq7FX5I/85YfmT+Ynlz87fMek+XvP3mPQdLgtNOaDTdO1W7tbdC9pEzlYopVUFiSTQbnPQewNFgy + 6OMp44k2dyATz9z417YdqavB2lOGLNOMQI7CUgPpHQF+t2efPsrsVdirsVdirsVdirsVdirsVdirsVdi + rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVfJP/ADmv/wCSMv8A/tsad/xNs6D2Z/xw + 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 + dirsVdirsVdirsVf/9k= + + + + + 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 + xCU28YlRnGIVr5jFLXbxi2EcYxnPOIQBAQA7 + + + + + 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 + jpnmkORYIhCzzdGGmtl33h7/GnK8pflJJ500KM1NlG/fvj3s2oW/4PR4PB5Pv8Wlucfj8XhGZNu2jwf+ + 3SvMP/zw/TgAmDPn7vDQI1viQGa8pfmrb70W+4XgxnWI81lHHhb7xnaw9GzC+nRp3iZKhJeg+tQoqc3H + Tw1N/fcKS+saVF/8nGqC+7I2e252A/dlbakM7xYlwq0tB9fWwFK7BhPhOVQti/ASlAhnQa7g2hqUCC+B + pXYNJsJzqNpUjHeCpXYNLMgVqjaV4d2iRDhLbwXXKlQti+4mWJArVC2L7iZYkCtULYvuJliQK1StkuM5 + WHorWJArVK2S4zlYejfRr9J8+cplYeXqFXG2OWQ5JnSgDnJ8vKU51jSfMmVKPJfm5VggzT/+GOfWHo/H + 4+mnuDT3eDwez4hgTfPdu3eGnTtxwr8nHHnkEeHee++Jg5h1G9aOuzRHX6+9/XpsR3+owyxz9INlW+w2 + 3WB9ujRvEyXCS1B9auw4yR0/NTT13yt2zNei+uLnVBPcl7XZc7MbuC9rYxFeghLh1paDa2tgqV2DifAc + qpZFeAlKhLMgV3BtDUqEl8BSuwYT4TlUbSrGO8FSuwYW5ApVm8rwblEinKW3gmsVqpZFdxMsyBWqlkV3 + EyzIFaqWRXcTLMgVqlbJ8RwsvRUsyBWqVsnxHCy9m+hHaf4PX/5SFOUQ45DiOB9duHhBFOC4zXhL82OO + OSYceuihcXb53//+93hOjeu8trnH4/F4+icuzT0ej8cjMrQ0y+9//9s403zt2tVx8PLAlvsnxPIsuA2u + W519CWipFLY+XZq3iRLhJag+Nfb7zx0/NTT13yt2zNei+uLnVBPcl7XZc7MbuC9rS2V4tygRbm05uLYG + lto1mAjPoWpZhJegRDgLcgXX1qBEeAkstWswEZ5D1aZivBMstWtgQa5QtakM7xYlwll6K7hWoWpZdDfB + glyhall0N8GCXKFqWXQ3wYJcoWqVHM/B0lvBglyhapUcz8HSu4l+lObXXn9N+MKXjgqLliyMsnz+wnlx + XfNlK5aGOXPvmRBrmp922mmDS7Ts2LEjXiK///3v913zeDweT7/EpbnH4/F4RmT79k8G/h36MtCDD54R + 7rxzdli1ZmBAtnLZuEtz9PeTX/409gVx8svf/SpMmjYpCiNIb5aeTVifLs3bRInwElSfGiW1+fipoan/ + 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 + RxGUa4reUxGKz/lzA3NHc8vR/OY7bhluvf1gN9960wjnN9x0/RacX3v9NbPQ/OOf/Ng2OL/wgx8YPnDR + BVtwfva57x/OfN8Zw+lnnjacevopw8mnnjQcf+Jxw3uPf8/wnve8Z3xNc3uGub9vYG5v65nmNTU1Nes3 + heY1NTU1GzqF5stqEXrdos9pEX1NdjaC8J7onIv8NrNb0XXRbTdbC9+r1OK33ufm5JdR1NZzTeWXUdTW + c1G6m0kBPJOidiaH8CjaJRCfE0G4H4vS3UwK4JkUtTM5hEfRLuF4VIvgvRGE99TC+LIIwhW9Kd2laJdw + PKpF8N4IyjWC8J4IyrUWwXtT9KYUyCnaJRyPUvSmHMKjaJdwPIqgXFP0nipC8ak/b9HcsHwKzQ3MdwLN + zz3/nG409wrNa2pqatZvCs1rampqNnQKzZfVIvS6RZ/TIvqa7GwE4T3RORf5bWa3ouui2262Fr5XqcVv + vc/NyS+jqK3nmsovo6it56J0N5MCeCZF7UwO4VG0SyA+J4JwPxalu5kUwDMpamdyCI+iXcLxqBbBeyMI + 76mF8WURhCt6U7pL0S7heFSL4L0RlGsE4T0RlGstgvem6E0pkFO0SzgepehNOYRH0S7heBRBuaboPVWE + 4lN/XmheU1NTU/N6TaF5TU1NzYZOofmyWoRet+hzWkRfk52NILwnOuciv83sVnRddNvN1sL3KrX4rfe5 + OfllFLX1XFP5ZRS19VyU7mZSAM+kqJ3JITyKdgnE50QQ7seidDeTAngmRe1MDuFRtEs4HtUieG8E4T21 + ML4sgnBFb0p3KdolHI9qEbw3gnKNILwngnKtRfDeFL0pBXKKdgnHoxS9KYfwKNolHI8iKNcUvaeKUHzq + z/cqmttrmrdornBeaF5TU1OzflNoXlNTU7OhU2i+rBah1y36nBbR12RnIwjvic65yG8zuxVdF912s7Xw + vUotfut9bk5+GUVtPddUfhP1ouEAAP/0SURBVBlFbT0XpbuZFMAzKWpncgiPol0C8TkRhPuxKN3NpACe + SVE7k0N4FO0Sjke1CN4bQXhPLYwviyBc0ZvSXYp2CcejWgTvjaBcIwjviaBcaxG8N0VvSoGcol3C8ShF + b8ohPIp2CcejCMo1Re+pIhSf+vNC85qampqa12sKzWtqamo2dArNl9Ui9LpFn9Mi+prsbAThPdE5F/lt + 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 + NOefIc15/2Rb4DNeZDgnbzpGRfUHaVbHczRpYSd/x2U09s52Kl/8GFUs4TyydA6NWX7XGWmebXmD9y8c + F9rk3Lf3FSrtfommNu2l7/yfRCXtr9OETW/Rp9fv5P0/m4rWHqLibq7fBjd2rlvxxANpDjGOfu2kOfY9 + pHnbiVw5+m7b6X5pPpcmrX4oJ80b+6X56u3upj1I88yyOGl+h3NPmZLLKHvdKsre1Eglt7Z7aR7y8tI8 + 7KWkebrpWfjn9ZB3XKfxIGV7OCh35+aDylR+mm5cu46mrX1kSNI808DfxYOpfMuXqaSXv6d8Ll3W/JS7 + Cx13slqD0ZMML829NMddFdNadvTfaX6I+wWmZ1HSnC/M8vAfHv3rP4YvHDI1e6lyw5s0dj3XqVpEk1qf + dXdoFNftoupuPqmt5AuRFl5Xd2e5FuZKmruLVn6PkeaZ1XzMEE+6jtPEDj7OBVMoL5NPn/38+/TH3/sq + ffyTHzjhAWkD8QSRB5mJC3tIVcjw4NQsGrnLHKA+lkUbIsEyRXmuDu5KFxGABAIJBepo6TQawfQrMgUL + 7i6HNMfdtpiaAlOIyJ3m+w/sc8lofmGeu3MISRGSIyROkBsQMBBHOBbYNyLSRChCcIpohYwV6awFtcUn + QZpjfTFfNvYnRCz27+//6Xcu2dSC3EKvq5R5aT6A9K+0iDSHeMExgjTHfOZ499I8Ht2WlGmRHYduS8q0 + yI5DtyVlWorHoduSsqAMT4olwqUsDF03DUEJPlgsOR6GJcKlLAxdNw1aiscRlNtAysLQdS2sulp0xyEi + PAyrriXHw7DkeBiWCNeC3ELXtdCC3MKqa4nxKIZTmt//wH3uv8UgzyHL8TPOGY8+/gjte2Gvm6sbD7ZE + /EMfxLriWP7jv/6Tiyk6vo5GcI2MOIX4inMc4jTGZUFJoSvD9SGuH/HwbDwb5I+/yX3y63y8v/olN4Wf + vtMcN13geEGc4zi9evoUPf/Si7Tn0EF69vnn6Old22j7Uw/Tk/13mm958F56ePtOyoyfSZnqT9MVTY9T + duXj/fN/c56F6SaHKM3zIOY4j0MeCGmev2obFa9+inOz+VS96hF3p3nmtnWUx3lp4cLNVOgk2gOUWQCh + dp6lOeeqcdI8Nz2Ll+bnSvOT/Xeany3Ny+ZvovIb63mffYrGLeqgovkPUNUyPgblN1DF4nW2NMd0w/3S + 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 + BeOqAAAAAElFTkSuQmCC + + + + + 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 + Rmv0RnN0R3v0R4N0SIv0SJN0SZv0SaP0MQcEADs= + + + + 17, 17 + + + + AAABAAEA3OIAAAEAGACIXwIAFgAAACgAAADcAAAAxAEAAAEAGAAAAAAAAAAAAHgAAAB4AAAAAAAAAAAA + AAD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////+/vn4+/P6/vf7/vn4/vn5//v4/vv4/f35/f79/P79/P//+/// + +v//+f//+v//+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+//9/P77/f78/P78 + /P/+/P/+/P/+/P/+/P///f/8/f75+/z5/fz6//33/fn5/vv///////////////////////////////// + ///////////////////////////////+/vX4/O75/vT4/vXy/vT1//nz/vn0/vz2/v78+/7++///+f// + +P//9///+P//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v/8/P76/f77/P78 + /P/++//++//++//9+v79+/36+vzz9vj1+/r3//zw+/T1/vn///////////////////////////////// + ///////////////////////////////+/vb9/vP8//b5/vXz/vT0//jy/vnx/vrx//v2/vv2/vv6/fz7 + /fz9/fz7/fz4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv1/vny/vj0/vj0 + /vn2/vr3/vr4/vv3/fv3/fv4/fv0+/j2/fr4//zx+/X2/vr///////////////////////////////// + ///////////////////////////////+/fT7+/H9//f5/vXz/fP0//fx//jt/fbr/fXu/fXv/fX0+/f0 + +/f4+vf1+/bx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXt/fLr//Hs/vHt + /vLu/fPv/fTx/PXy/ff2//v3//v3/vr3/vr5//zy/Pf2/vv///////////////////////////////// + ///////////////////////////////+/Pf++vX+//j5/fXw/PHx//Xi9+ng+unj/u7j/uzj/uvj/unj + /unk/ujk/unj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urf/ufc/+Xd/uXd + /ubg/ujh/unk/uvh+ufc8uDf8uPf7uTw+fP4//v2+vr6/f7///////////////////////////////// + /////////////////////////////////vr//vr///n5/fbv/PDn++zH4c+hwqyXuqKVvJ+VvJ6VvpuV + vpuWvpqWvpuVvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2Rv5qOwZePwJiP + wJiTvpuTvpyWvJ6dv6SuyLKxxra6yb7c5t/0+/f1+fr5/P7///////////////////////////////// + /////////////////////////////////Pz++/r+/vv6/vny//Tl++q428GbyKaWyaKSzZ6RzZ2Pz5mP + 0JmP0ZaQ0JiRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuN0JiJ0paL0peL + 0ZeNz5mOz5qSzJ2UyZ6Wwp+Yu5+mvqrU49nz+/j7+/38+v7///////////////////////////////// + ////////////////////////////////+vz+9vb9+vf7/vnz//Xp/u673sSZyKSUyaCPzZyOzZuM0JaM + 0JWL0pOM0JWOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiK0JaH0pSI0ZWI + 0ZWK0JaKz5ePzZqTzJ2byqSbwaKmwavZ6d71/fn9/P78+v7///////////////////////////////// + ////////////////////////////////+v//+v7/+/j5//jw//Ls//K73cWUyKCQy52Jz5eH0JWF1I+E + 1I6D1oyE1I6H0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOE05GD1JGD1JGD + 1JGD1JGD05GI0ZOKz5WSzJ2Yx6GdwaXX6dz2//r9+/7/+/////////////////////////////////// + ////////////////////////////////+v//+f7/+vj5/vjw//Ls//K83cWUyKCQy52Jz5eH0JWE1I+D + 1I6D1oyE1I6H0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOF0pKF0pKE05GD + 05GC1JCC1JCF0pKI0JSQzZuWyKCcwqTW6dv1//n9+/7/+/////////////////////////////////// + ////////////////////////////////+v//+f7/+vn5/vnw//Lt//K93MaUyKCQy52Jz5eH0JWD1I+D + 1I6D1oyE1I6H0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0ZSI0ZWF0pKF + 05KB1I+B1I+D1JGF0pONz5mUyp6aw6LU6tr0//n9+/7/+/////////////////////////////////// + ////////////////////////////////+v//+f7/+vn6/vnx/vLu//O93MaWx6GRyZ6LzZiKzpeG0pGG + 0pCG1I+H0pGKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aMzpeNzZmKz5WJ + 0JSD05GD05CD1JGF0pOM0JiSy5yXxKDT6tny//f7/P39/P////////////////////////////////// + ////////////////////////////////+v//+f7/+vn6/vny/vPu//O+3MeXxqKTyaCNzZqLzpiI0ZOI + 0ZKI05GJ0ZOMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiOzJqRy5yNzpeM + z5aF0pKE05GD1JGF05KL0ZeRzJuWxZ/S6tjy//f6/P38/P////////////////////////////////// + ////////////////////////////////+///+v7/+vn6/vny/vPv//S/28iZxaSWx6KQy5yPzJuMzpaM + z5aM0JSNzpaPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uTyZ2Wx5+RypuP + y5qH0ZSG0ZOD1JGE05KJ0paQzZuVxp7Q69fw//b4/f37/f////////////////////////////////// + ////////////////////////////////+///+v7/+vn6/vny/vPv//TA28maxKWXx6ORy52PzJuOzpiO + zpeO0JWPzpeRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yVyJ6Yx6GSyp2R + y5yI0JWH0ZSD1JGE05KJ0paPzZqVxp7Q69fw//b4/f36/f////////////////////////////////// + ///////////////////////////////7/vz7/fz9+Pz9+v37+fv2/ffE28eUypuMz5WD1I6B1YyK0JOM + z5WWypySzJqKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aGz5eDzpmKz5aM + z5WQ0JGP0ZGJ0pGI0ZOG0ZmKzJ2MxqHN69nw//b8+v3++/////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////8/P38/Pz++Pv8+/v4+/jz/vXC3MaWyZ2QzZiJ0JOH0ZKMzpaO + zZeUyp2QzJmJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSE0JaB0JeF0ZWG + 0ZSH05CG05CD05GD0pOE0ZmJzJ2NxqHM69nt//f5+/37/P////////////////////////////////// + ////////////////////////////////+f//+f7/+vn6/vny//Lv//LA3MWbxqGYyJ+TyZ2Syp2Ry52R + y52Ry52NzZiI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GD0pOA0pZ805N8 + 1JN31o931o941pF61JOC0pmJzJ6PxaLJ6trp//nz/f72/f////////////////////////////////// + ////////////////////////////////+f//+P7/+fr6/fny//Hv//G/3cOZx5+WyZ2Ry5uQy5qOzJqO + zJqNzZqNzpiMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WJ0JWG0JWD0pOB + 0pJ91Y591Y591I+A05KI0ZiPy5yVxKDP6tnu//f4/P36/f////////////////////////////////// + ////////////////////////////////+f//+P7/+fv6/fry//Hu//C+3sKYyJ6Vy5yPzJmNzZiMzpiL + zpiKz5iMzpiRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmOzpaM0JWI0ZKH + 0pKD1I6D1I6D1I+F0pGN0JeUy5uaxJ/U6tj0//f9/P3//P////////////////////////////////// + ////////////////////////////////+P//9/7/+fv6/frw//Ht/++73sCVypyRzZmK0JWI0JSF0pKF + 0pKD0pKJz5aSyp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2TzJiTzpWP0JKO + 0JKJ046J046J046M0pCS0JWYy5mexZ3Z6tb5//T+/fr//vz///////////////////////////////// + ////////////////////////////////9///9/7/+fv5/frw//Hs/++73sCUy5uQzpiI0ZOG0pKD1JGC + 1JGB1JGH0JaTyp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+VzJmXzpWSz5KR + 0JKM0o6M046M046O0o+U0JSay5mfxZ3b6tX7//P+/vn//vv///////////////////////////////// + ////////////////////////////////9///9/7/+fv5/fnw/+/r/+2537+SzJmOzpaF0pKD05GA1Y5/ + 1Y1+1oyD0pGKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqPzJiTzZePz5SO + 0JKI0o+I046H1I6J04+P0pOUzZeZx5vT69Ty//L5/vf7/vn///////////////////////////////// + ////////////////////////////////9///9/7/+fz5/fnw/+/r/+2537+SzJmNzpaE0pGD05CA1Y5/ + 1Y1+1oyC05GJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmOzJiSzJiOzpSN + z5OH0o+H046G1I6I1I+O0pOTzZiYyJzS69Tw//H3//f5//j///////////////////////////////// + ////////////////////////////////9f/++P7++v36/fry//Hp/+q5376TyZqNypaGzpGEz5CA0I+A + 0I+A0Y5/0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y+EzZaJyZqFzJeE + zJZ+0JF90ZB50o5905GC05aGzpmRzqLF7tTh/+/s//jr//b///////////////////////////////// + ////////////////////////////////9f/++P79+Pn7/frz//Pp/+u53r6Wyp2SzJuL0JaJ0JWG0ZSG + 0ZSG0pSE05OB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKIzpqNy5+JzZyI + zpuB0pWA0pV91JN90pN7y5B/xZKKx5zC7NLi//Hs//ns/vj///////////////////////////////// + ////////////////////////////////+P/++f359/X7//rz//Tp/+y63b+Yxp+Vx52QyZqPyZqOypqO + ypqOypqKzJaD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGJyZyOxaSJyJ+I + yZ6BzZiAzZh+z5aC0pqI1J+Iy56PyaTF7Njj//Xr//vl+/X///////////////////////////////// + ////////////////////////////////+//++v35+PX7//rz//Pp/+u+3sKdxaOZxqCWx5+Vx5+Vx5+V + x6CWxqGTyJ2NzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiTxqGYwqiTxaOS + xqKLypyKy5uGzZqIzZuJy5uLxJyUxaTL6tnp/vby/vzv+/n///////////////////////////////// + /////////////////////////////////P/++/37+/f8//ny/vHq/uvK5M2py62jyKiiyKmiyKqjx6uj + xqulxa6jx6qgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWlxqypw7Gkxa2j + xqybyqWay6SVzqOWzaOXyqKdyKemya/X7N7x/vf7/f39/f////////////////////////////////// + ////////////////////////////////+vz+/P78/fj7//jw/fDs/e3b8d3R6tXT7NjT7NnT7NnW7NzW + 7NzY69/Y7N3a7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dvd7N7g6uDc69zb + 7NvT7dXS7tTN79HN79HM7s/T7tXU6NXr9O35+vn99/3+9/////////////////////////////////// + ///////////////////////////////79Pb++/z8/vf7//fv/e/t/O7o/Orp/e3t//Lu//Lv//Py//fy + //f0//r2//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n9//n///r7//b7 + //Xy/+/x/+7t/+vs/+rs/+ny/+7w+uz3+vb/9vr/9P7/9v////////////////////////////////// + ///////////////////////////////9/Pz+/v7+/v3+//37/vv7/vv6//v6//v6//z7//z7//z8//38 + //38//39//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3///3+//z+ + //z8//v7//v6//r7//r7//r8//v8/vv9/v3//f3//P7//f////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////9//79/v79/v39/v7+/v7+/f7+/f/+/f///f///f///f///f// + /f///f///f///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v7///7///7/ + //7//v7//v///v///f7//f7//f7//f7//v7//v///v///v////////////////////////////////// + ///////////////////////////////3//z1/vr1/Pn3/Pv6+/37+P399//++P//+P//9v//9v//9P// + 9P//8///9f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f/+/Pz+/vv+/vv/ + /vz/+/7/+/7/+v7/+f7/9v3/9vz/9/3/+v7/+/7++/3++/3///////////////////////////////// + ///////////////////////////////3/vv2/vv2/fr2/Pr4+vz7+v39+//++f/++P/+9///9///9f// + 9f//9P/+9v7++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f38/Pr7/ff8/fj8 + /fj++/v++/v/+vz++vz9+vz++/z++/39+/z9+fr8+Pj9+Pj///////////////////////////////// + ///////////////////////////////1+/n4//z4/vz2/Pr4+/z6/f77/v/7/P77+/78+/79+/79+v/9 + +v/9+v/8+/37/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr4/vb3//T3//X3 + //X6/vf7/vf9/fj8/Pf7+/f9/fn+/vr9/fn8/Pj8/Pn9/fr///////////////////////////////// + ///////////////////////////////1+Pj6/v75/f32+/r2/fv3/vzz/Pjz+/j0/Pnz/Pfz/Pfz+/jy + +/fy+/fx/Pbx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/vLx//Dx//Dx + //Dz/vLz/vL1/fL1/fP2/fT4/vb5//j6//j6//j7//j6//f///////////////////////////////// + ///////////////////////////////3+Pr8/v/6/f72+vv2/vvy/ffj8uji9Ojm+uzk++rj++nh++jh + /Ojf/Obg/Ofh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jk++fl++Xl++Xl + ++Xl++bl++bm++bm+ubk9uTi8+Ll9Obv++/2/vX4//b0/fL///////////////////////////////// + ///////////////////////////////8+v39/P74+/31+vr2//rs+/DP5NO21L2x0ris1bOr1rKl2a+l + 2a6i2q2k2a+o1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOs1rKv1bKu1rGu + 1rGs1rGs1rGt1bGv1rOx1LSuz7K6177X79nu/e/0//Xx/vL///////////////////////////////// + ///////////////////////////////++//++/72+fv0+fn2//ro+OzB2cWiw6mcwqSWxp6Vx52OypiN + ypeKzJaMypmRx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Wxp6axZ6YxZ2Y + xp2Wxp2Wxp2Wxp2Zx5+bxaCWvJumyKvN6dDr/O3z//Xt/e////////////////////////////////// + /////////////////////////////////P/9+/72+fv2/frx/vTt/vLA28abxaOXx6COzJmMzZiG0ZKF + 0pKC1I6F0pKKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiRy5qVypySy5qR + zJmPzZeOzZaOzZaQzZiTzJuVyJ2ZxaDP6tPs/u/y//Tz/vX///////////////////////////////// + /////////////////////////////////P/9+/72+vv3/vrw/vPu//PA3MeaxaKWyJ+NzZmLzpeE05GE + 05GA1o2E05GJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eQzJqUy5uRzJmQ + zZiNz5aNz5WNz5WOzpeSzZuVyp2YxZ/P6tTt//Dy//T0//b///////////////////////////////// + /////////////////////////////////f/9/P71+/n1/vnu/vPs//O+3MaYxqGVyZ+LzpeJ0JWD1JGC + 1JB+14yB1I6I0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZONzpeRzJqNzZiM + zpiH0ZOG0pKF05KH0pON0JeRzJuVxp7O69Xt//Pz//j2//n///////////////////////////////// + ///////////////////////////////+/f/8/P70/Pj0/vnt/vPs//O+3MaYxqGVyJ+MzpiKz5aD05GC + 1JB/1o2C1I+I0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKNzZeRy5qNzZiM + zpiG0ZOG0pKE05GG0pOM0JeRzJuVxp7P69bt//P0/vn3/vv///////////////////////////////// + ///////////////////////////////7/v/5/f7z/Pjz//js//Lr//K+3MaZxqKXyKCPzJqNzZiH0pOG + 0pKD1JGG0pGM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKOzZeRy5yNzZiM + zpiF0pKE05GB1JGD05KJ0ZePzJuVxZ/Q6tfw//b4/f36/f////////////////////////////////// + ///////////////////////////////7/v/5/v7z/Pjz//js//Ls//K+3MaaxaKXx6CQy5qOzJmI0ZSH + 0ZOE05GH0pGN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKPzZiRy5yNzZmM + zpiE0pKD05GB1JGD05KJ0ZePzJyVxaDR6tnw//f6/P38/f////////////////////////////////// + ///////////////////////////////7///5/v7z/Pjz//js//Ls//PA3MebxaOYx6GRy5uPzJmK0JaJ + 0JWH0pOK0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQzZiRy52NzZmM + zpmD0pKC05GB1JGD05KJ0ZeQy5yWxKHS6try//n8+/7/+/////////////////////////////////// + ///////////////////////////////7//36/vz5+fr5/Pv1+/fy/vXC3MeXyJ6RzJqI0JOH0ZGK0JSL + z5WQzZiOzpeM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSKzpiIzZqLzpeM + z5aL0ZGK0ZGG0pGG0pOH0ZiMzJ2QxaHP69nw//f8+/3/+/////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//r7/vr++fv++/z9+/n2/vbE3MaVy5mN0JOE1YyD1ouK0ZKM + 0JOXypyUypuPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmTyZ2WyJ+SypyQ + y5uMzZiLzpeK0JSMz5aRzZuWyZ+aw6LT6tnx//f6/P38/P////////////////////////////////// + ///////////////////////////////6//r7/vr++fv9+/z8+/n2//bD3MaVy5mN0JOE1YyC1ouJ0pKM + 0JOXypyUypuPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmTyZ2WyJ+SypyQ + y5uLzpeLzpeJ0JSLz5aQzZuVyZ6Zw6HT6tnx//b5/P38/f7///////////////////////////////// + ///////////////////////////////5//r5/vr7+fv8+/35+/v0//fC3MaSy5mK0ZOB1oyA1ouI0pKK + 0JSVyp2Ry5uMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiRy5yVyZ+Ry5uQ + zJqI0JWH0ZSH0pOI0ZSNz5mSy5yWxZ/Q6tfw//b2//v5//z///////////////////////////////// + ///////////////////////////////4//r4/vr6+fz7/P33+/vz//fA3MaRy5qI0ZOA1ox+1ouG0pKJ + 0JSTyp2Qy5uKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aPzJqTyp2PzJmN + zZiH0ZSG0ZOF0pKH0ZSM0JiRzJyVxp7P69bu//T1//n4//v///////////////////////////////// + ///////////////////////////////2//z2/vz3+vz4/P31+/vw//e+3MePy5uH0ZV91o181oyF0pOH + 0JWRyp+NzJuI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWMzpeQzJqLz5aK + 0JaF0pKE05GD1JGE05KJ0paOzZqTx53N69Tt//Lz//f2//n///////////////////////////////// + ///////////////////////////////1//z0/vz2+f33+/30+vzv/vi93MiOy5yF0ZV81o571o2D0pSG + 0JaQyZ+NzJuH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOLzpeOzJmKz5aI + 0JWE05GD05GB1I+D05GI0pWOzpmSx5zM69Pr//Dy//f1//n///////////////////////////////// + ///////////////////////////////0//30/v31+f72+/3z+vzu/vi93MmNy5yF0ZZ71o961o6D0pWF + 0JeQyaCMzJuH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOLz5aOzZmJ0JWI + 0ZWD05GC1JCB1Y+D1JCI05SNzpiRyJvL69Lr//Dx//b0//n///////////////////////////////// + ///////////////////////////////w+vn1/v75+/73+v70+f3s/fa52cWMyJuFzpZ704561I2Dz5SF + zpaPxp+LypqGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OKzZaOypiKzZWJ + zpSD0ZCC0pCB0o+C0pCGz5KOzpmXzKHM7dPo/+3z//f1//n///////////////////////////////// + ///////////////////////////////x+vr2/v/5+v/2+P71+f3u/fe828iPy5+I0Zl+1pF915CG0peI + 0JmSyaKOzJ2J0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paNz5iRzZuOz5iN + 0JeG05OF1JKE1ZKF1JOH0JSOzZqbz6XP7tXq/+/0//j2//r///////////////////////////////// + ///////////////////////////////5/P76/P/69P/79f78+P71/fnF3M2Sx56HypR+z4580IyFy5OH + yZWSw56OxZqJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSOx5eSxZqNx5eM + x5eFzJGFzJGDzZCHzpONzpmRyJubyKTQ7Nfu//P4/vz0+Pn///////////////////////////////// + ///////////////////////////////6/P/6/P758fz+9//++v/0/PfB2smTx56Ky5eB0JB/0Y+IzJaK + y5iVxKGRx52MypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeRyJqVxp2QyJqP + yJqIzZSIzZSGzpOK0JaRz5ySyJybx6TS69jw//X5/v309vj///////////////////////////////// + ///////////////////////////////9+P7/+v7/8f7/+P//+P/0+PXD1MWbx6GVzpyM05aL1JWSz5uV + zp2gx6WdyaSXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GbyaSex6abyqOZ + yqKUzZ+Tzp6Sz5uTzp2SxpyXwqCjxKra6+D2/vv9+v7/+v////////////////////////////////// + ///////////////////////////////89fz/+v//8v//9///9v/19/bM3M2eyKOTy5qK0JOI0ZGQzJiT + ypqexKKbxaGVyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+ZxaKcxKSYxqGX + x6CRypyRypuQzJmRypqSxZycxqSox67Y6N3x+fb8+P3/+P////////////////////////////////// + ////////////////////////////////9v3/+f//8///9v//8//6+Prg69/A4sO45b2v6bWt6rO257q5 + 5rzE4cXA4sS548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K+4cbC4Mm+4ca9 + 4sW25MC25cC05b625cC75cTF5czK4dDn8Oz19fn99P3/9f////////////////////////////////// + ////////////////////////////////+v//+///9///+f//9//8+vzx+PDr+uzr/+7l/+nk/+jq/+zr + /+3y//Pw//Lr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hv//Px//Xv//Pu + //Pq//Dp//Do/+/p/+/r//Dw//Tv+/L3/Pn8/P7++v7/+v////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////+/P/+/P///P///P//+///+///+////P///P//+///+///+/// + +///+//7/f32//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r0//zz//31//72 + ///3///3/v/4/f/5/f/6/f/5/f/4/f/3/f/2/f/1/v70/v7///////////////////////////////// + ///////////////////////////////+/P/+/P///P//+///+///+///+//9+f/8+P/99//+9//+9//+ + 9//+9//5+vvw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xu/vfs/vnv/Pvw + /Pzy+/3y+/3z+f/1+v/5/f/4/f/2/f/2/v/1/v/0/v7z/v7///////////////////////////////// + ///////////////////////////////+/P/+/P/+/P/9+//8+//8+//8+//8/P/8/P/9/f/9/f/9/f/8 + /f/7/f/8/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f78/vv6/vn8/vv8 + /vz+/vz+/v3+/P/+/P/++v/++//++//+/P/+/f/+/f/+/f////////////////////////////////// + /////////////////////////////////P/++//9/P/9/P/7/P/7/P77/P77/P77/f77/f77/v77/v37 + /v35/v37/f7//P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P/9/fv7//n8//r9 + //r+//v//vv//f3//P3/+v7/+v7/+v7/+/7//P7/+/7/+/7///////////////////////////////// + ////////////////////////////////+//++//8/P/7/P/6/f/5/f34//z2//r1//r0//j0//jy//fy + //fy//X3/Pn/+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f///Pj///T///T/ + //T///T///T///X///b///n//vr//vz//fz//Pz/+f3/+f7///////////////////////////////// + ////////////////////////////////+//++//8/P/7/P75/f74/vz3//v1//r0//nz//fy//fw//Xw + //Xv//Tz/ff6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/ff7//P7//P7 + //P6//P6//P6//T6//T6//X7/vf8/vn+/fv//fz/+/7/+/////////////////////////////////// + ////////////////////////////////+//++//8/P/6/P74//z2//r1//ns/PHo+u7l++vl++vh/Ojg + /Off/Ofj++rq+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/r+uvs++js++fs + ++fq++fq++fq++fq++fr+ufv++v0++/6/PT+/fj//f3//f////////////////////////////////// + ////////////////////////////////+//++/76+v36/P31/fr1//ne7OPE3Mq/2sW73MK63cG23761 + 376z4Ly137243cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC63cC83cC63r66 + 3r634Ly34Ly34Ly5372838HB3sXG3Mjl8eX2/fb5/fz6/f3///////////////////////////////// + /////////////////////////////////P/++/75+fz5/Pzz/Pjz//nH2s2iv6ifwKaaw6GZxKCVxp6U + xp2RyJuQyJqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqSxp6VxaGRxp6R + x56OyJuOyZuOyZuPyZ2UyaKYxaScwKbS6dvv//f0//v2//z///////////////////////////////// + ////////////////////////////////+//++/75+fz5/fvy/Pby//fF2sufwaacw6OVxp6Ux52OypmN + y5iKzZaIzpWGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OKy5mNyJ2JypuI + ypqEzpeDzpaCzpaFzpiLzp2PyqCTxKPL6tjp//Xv//rx//z///////////////////////////////// + ////////////////////////////////+//++v75+vv5/fvy/fbx//bE28qew6WbxaKTyJyRyZuLzZeK + zZaH0JSF0ZKC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CGzpaJy5yFzJmE + zZl/0JV+0ZR90pR/0ZWG0JqKzJ6OxqHH69fm//Xs//rv//z///////////////////////////////// + ////////////////////////////////+//++v75+vv4/fvw/fXv//XA3MebxaOXx6COzJmMzZiE0pGD + 05GB1Y6D05CG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKLzpaOzJmKzpaJ + z5WC05CC049/1Y6B1JCI0pWNzZqSx57O69Xt//P0//n3//z///////////////////////////////// + ////////////////////////////////+//++v75+vv4/fvw/fXu//TA3MeaxqOXyKCOzZqMz5iD1JGD + 1ZGA1o6D1ZCI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSNz5eRzZmM0JaL + 0JWE1JCD1Y+B1o6D1ZCI05SOzpmTx53P69Xv//L2/vn5/vv///////////////////////////////// + ////////////////////////////////+//9+v73+vv3/vrw/vPt//O+3MaXyKGUy56K0JeI0pWB149/ + 14572ouD1JGSzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2XzJqbzZmV0JSU + 0ZON1I2M1YyJ14uL1YyR05CXzpWdx5rZ69P5//L+/fn//fv///////////////////////////////// + ///////////////////////////////++/79+/74+fv4/fvy/fTv/vS/3MaXyaCTzJ2K0paI05SD1pCD + 1pCB14+H05SRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyUzZqXzpmU0JWT + 0ZSO1I6O1Y6K1oyL1Y6P0pKVzpeax5vW69T3//L9/Pr//fz///////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/ZeroFlowTool/TestComon.Designer.cs b/ZeroFlowTool/TestComon.Designer.cs new file mode 100644 index 00000000..42027848 --- /dev/null +++ b/ZeroFlowTool/TestComon.Designer.cs @@ -0,0 +1,99 @@ +//namespace GenesisDisplayTool +//{ +// partial class TestComon +// { +// /// +// /// 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() +// { +// this.button1 = new System.Windows.Forms.Button(); +// this.button2 = new System.Windows.Forms.Button(); +// this.button3 = new System.Windows.Forms.Button(); +// this.button4 = new System.Windows.Forms.Button(); +// this.SuspendLayout(); +// // +// // button1 +// // +// this.button1.Location = new System.Drawing.Point(12, 12); +// this.button1.Name = "button1"; +// this.button1.Size = new System.Drawing.Size(102, 66); +// this.button1.TabIndex = 0; +// this.button1.Text = "init"; +// this.button1.UseVisualStyleBackColor = true; +// this.button1.Click += new System.EventHandler(this.button1_Click); +// // +// // button2 +// // +// this.button2.Location = new System.Drawing.Point(12, 95); +// this.button2.Name = "button2"; +// this.button2.Size = new System.Drawing.Size(102, 66); +// this.button2.TabIndex = 1; +// this.button2.Text = "Login"; +// this.button2.UseVisualStyleBackColor = true; +// this.button2.Click += new System.EventHandler(this.button2_Click); +// // +// // button3 +// // +// this.button3.Location = new System.Drawing.Point(12, 167); +// this.button3.Name = "button3"; +// this.button3.Size = new System.Drawing.Size(102, 66); +// this.button3.TabIndex = 2; +// this.button3.Text = "Set"; +// this.button3.UseVisualStyleBackColor = true; +// this.button3.Click += new System.EventHandler(this.button3_Click); +// // +// // button4 +// // +// this.button4.Location = new System.Drawing.Point(12, 239); +// this.button4.Name = "button4"; +// this.button4.Size = new System.Drawing.Size(102, 66); +// this.button4.TabIndex = 3; +// this.button4.Text = "Get"; +// this.button4.UseVisualStyleBackColor = true; +// this.button4.Click += new System.EventHandler(this.button4_Click); +// // +// // TestComon +// // +// this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); +// this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; +// this.ClientSize = new System.Drawing.Size(166, 322); +// this.Controls.Add(this.button4); +// this.Controls.Add(this.button3); +// this.Controls.Add(this.button2); +// this.Controls.Add(this.button1); +// this.Name = "TestComon"; +// this.Text = "TestComon"; +// this.ResumeLayout(false); + +// } + +// #endregion + +// private System.Windows.Forms.Button button1; +// private System.Windows.Forms.Button button2; +// private System.Windows.Forms.Button button3; +// private System.Windows.Forms.Button button4; +// } +//} \ No newline at end of file diff --git a/ZeroFlowTool/TestComon.cs b/ZeroFlowTool/TestComon.cs new file mode 100644 index 00000000..97fb08a2 --- /dev/null +++ b/ZeroFlowTool/TestComon.cs @@ -0,0 +1,69 @@ +//using System; +//using System.Collections.Generic; +//using System.ComponentModel; +//using System.Data; +//using System.Drawing; +//using System.Linq; +//using System.Text; +//using System.Threading.Tasks; +//using System.Windows.Forms; +//using Xylem.Common.Hardware.Interface.Com; +//using Xylem.Common.Hardware.WaterMeter; +//using Xylem.Common.Hardware.WaterMeter.Genesis; +//using Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages; + +//namespace GenesisDisplayTool +//{ +// public partial class TestComon : Form +// { +// public TestComon() +// { +// InitializeComponent(); +// } + + +// MeterBatch mb = new MeterBatch(); + +// private void button1_Click(object sender, EventArgs e) +// { +// //inti +// var portConfigLed = new PortConfig(); +// portConfigLed.ReadLine = true; +// portConfigLed.SplitSign = "["; + +// portConfigLed.SerialPort = new System.IO.Ports.SerialPort("COM34", 115200, System.IO.Ports.Parity.None, 8, System.IO.Ports.StopBits.One); + + +// var portConfigRFID = new PortConfig(); +// portConfigRFID.SerialPortType = typeof(RfidComPort); +// portConfigRFID.ReadLine = false; +// portConfigRFID.SplitSign = "["; + +// portConfigRFID.SerialPort = new System.IO.Ports.SerialPort("COM33", 9600, System.IO.Ports.Parity.None, 8, System.IO.Ports.StopBits.One); +// var meter = new GenesisMeter(1, portConfigRFID, portConfigLed); +// mb.AddMeter(meter); +// meter.Init(); +// } + +// private void button2_Click(object sender, EventArgs e) +// { +// //login +// mb.GetMeter(1).Login("119564D5BC83"); +// } + +// private void button3_Click(object sender, EventArgs e) +// { +// // set +// mb.GetMeter(1).SetLcdText(true, new byte[] { 0x00, 0x00 }); +// } +// private void button4_Click(object sender, EventArgs e) +// { +// // get +// GenesisMeter metertodoST = (GenesisMeter)mb.GetMeter(1); +// metertodoST.ReadRegister(Register.Customer.AlarmStatus1); +// metertodoST.WriteRegister(Register.Customer.AlarmStatus1, new byte[] { 0x04 }); + +// mb.GetMeter(1).SetLcdText(false, new byte[] { 0xff, 0xff }); +// } +// } +//} diff --git a/ZeroFlowTool/TestComon.resx b/ZeroFlowTool/TestComon.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/ZeroFlowTool/TestComon.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/ZeroFlowTool/ZeroFlowGenesisMeter.cs b/ZeroFlowTool/ZeroFlowGenesisMeter.cs new file mode 100644 index 00000000..3b905916 --- /dev/null +++ b/ZeroFlowTool/ZeroFlowGenesisMeter.cs @@ -0,0 +1,275 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Threading; +using Xylem.Common.CommonCore.Consts; +using Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.EventArguments; +using Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords; +using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisConfig; +using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore; + + +namespace GenesisDisplayTool +{ + public class CalibrationRecordWithMeterNumber + { + public UInt16 MeterNumber; + public CalibrationRecord CalibChl; + + public String RawData { get; internal set; } + } + public class ZeroFlowGenesisMeter : GenesisMeter + + { + + public event EventHandler OnZeroFlowRecordIsDecoded; + + CultureInfo GlobalCulture { get; set; } + public Byte Gp30LastByte { get; set; } + private Byte[] GP30LastRegister { get; set; } + public void SetGP30LastRegister(Byte[] data) + { + GP30LastRegister = data; + } + private Byte GP30LastPayloadLsb { get; set; } + public Byte GP30LastCommand { get; set; } + private Byte GP30RXPayload { get; set; } + private Boolean GP30RequestStarted { get; set; } + private Boolean GP30RequestFailed { get; set; } + private Boolean GP30RequestGotAnswer { get; set; } + private Byte Privilege { get; set; } + private Byte FirstHitLevelUpPath0 { get; set; } + private Byte FirstHitLevelUpPath1 { get; set; } + private Byte FirstHitLevelUpPath2 { get; set; } + private Byte FirstHitLevelDownPath0 { get; set; } + private Byte FirstHitLevelDownPath1 { get; set; } + private Byte FirstHitLevelDownPath2 { get; set; } + private Byte PercentPath0 { get; set; } + private Byte PercentPath1 { get; set; } + private Byte PercentPath2 { get; set; } + public Byte Subreason { get; set; } + private Byte Starthit { get; set; } + private Byte StoreCalibration { get; set; } + private Byte Amplitude { get; set; } + private Byte Samplerate { get; set; } + private UInt16 CalibrationFactorPath0 { get; set; } + private UInt16 CalibrationFactorPath1 { get; set; } + private UInt16 CalibrationFactorPath2 { get; set; } + private Int32 ZeroOffsetPath0 { get; set; } + private Int32 ZeroOffsetPath1 { get; set; } + private Int32 ZeroOffsetPath2 { get; set; } + private Byte LedMode { get; set; } + private Byte UpdatePeriode { get; set; } + private Byte FirstHitShift { get; set; } + private UInt32 ToFTempCalibrate { get; set; } + private Int32 ToFTempOffsetPath0 { get; set; } + private Int32 ToFTempOffsetPath1 { get; set; } + private Int32 ToFTempOffsetPath2 { get; set; } + public Int32 MeterNumber { get; set; } + private Byte MeterSize { get; set; } + + public Boolean LogOnEnable; + public Boolean AmplitudeEnable; + public Boolean ZeroFlowOffsetEnable; + public Boolean TempCalEnable; + public Boolean CompletionEnable; + public Boolean LoginFailed; + public Boolean PreparationFailed; + public Boolean AmplitudeFailed; + public Boolean ZeroFlowOffsetFailed; + public Boolean TempCalFailed; + public Boolean CompletionFailed; + public Boolean Ok; + public Boolean EmptyPipeCheckEnable; + public Boolean EmptyPipeCheckFailed; + public Boolean MeterSelected; + + public List CurrentRecords = new List(); + public ZeroFlowGenesisMeter(int Slot) : base() + { + base.SetupFromConfigFile(Slot); + //base.EnableAutoLogon(); + Setup(); + } + public ZeroFlowGenesisMeter(int Slot, PortConfig request, PortConfig streaming, bool ignoreCurrptData) : base() + { + base.SetupGenesisMeter(Slot, request, streaming, ignoreCurrptData); + // base.EnableAutoLogon(); + Setup(); + } + private void Setup() + { + base.LogRawData(true); + this.GP30LastRegister = new Byte[2] { 0, 0 }; + this.GP30LastPayloadLsb = 0; + this.GP30LastCommand = 0; + this.GP30RXPayload = 0; + this.GP30RequestStarted = false; + this.GP30RequestFailed = false; + this.GP30RequestGotAnswer = false; + this.FirstHitLevelUpPath0 = 0; + this.FirstHitLevelUpPath1 = 0; + this.FirstHitLevelUpPath2 = 0; + this.FirstHitLevelDownPath0 = 0; + this.FirstHitLevelDownPath1 = 0; + this.FirstHitLevelDownPath2 = 0; + this.Starthit = 0; + this.Amplitude = 0; + this.Samplerate = 0; + this.CalibrationFactorPath0 = 0; + this.CalibrationFactorPath1 = 0; + this.CalibrationFactorPath2 = 0; + this.ZeroOffsetPath0 = 0; + this.ZeroOffsetPath1 = 0; + this.ZeroOffsetPath2 = 0; + this.LedMode = 0; + this.MeterNumber = Slot; + this.GlobalCulture = CultureInfo.CreateSpecificCulture("en-US"); + this.Gp30LastByte = 0; + + //on zeroflow every param has to be stored + _configuration.UseRegisterWatchService = true; + _configuration.RegisterWatchServiceUrl = "http://sla12iis01/MeterProcessState/api/RegisterWatch/"; + } + + public Boolean CheckStreamingPort() + { + if (!StreamingPort.IsOpen()) + { + base.StreamingPort.Open(); + } + return StreamingPort.IsOpen(); + } + public Boolean CheckRequestPort() + { + if (!RequestPort.IsOpen()) + { + base.RequestPort.Open(); + } + return RequestPort.IsOpen(); + } + public void StartRecordData() + { + CurrentRecords.Clear(); + base.StreamingProtocol.OnRecordIsDecoded += StreamingProtocol_OnRecordIsDecoded; ; + SyncStreamingBuffer(SyncMarkRecord.DecodeEveryPackage); + } + + private void StreamingProtocol_OnRecordIsDecoded(object sender, BaseDataEventArgs e) + { + if (e is CalibDataEventArgs) + { + OnZeroFlowRecordIsDecoded?.Invoke(this, new CalibrationRecordWithMeterNumber() { MeterNumber = (ushort)(Slot - 1), CalibChl = ((CalibDataEventArgs)e).CalibChl, RawData = ((CalibDataEventArgs)e).RawData }); + } + } + + public void StopRecordData() + { + StreamingProtocol.OnRecordIsDecoded -= StreamingProtocol_OnRecordIsDecoded; + SyncStreamingBuffer(SyncMarkRecord.SkipDecoding); + } + + internal void Flush() + { + if (StreamingPort == null) + { + throw new ApplicationException("Synchronization not possible due to undefined streaming port"); + } + SyncStreamingBuffer(SyncMarkRecord.FlushBuffer); + } + + + + public new Boolean WriteRegisterUnsafe(string reg, T value) + { + var RetrysLeft = 4; + + + while (RetrysLeft >= 0) + { + try + { + + var result = base.WriteRegister(reg, value,true,false); + if (result) + { + return result; + } + Thread.Sleep(100); + + } + catch (Exception e) + { + base.WriteLog($"Can not WriteRegisterUnsafe retry left: {RetrysLeft}, message: {e.Message}"); + } + RetrysLeft = RetrysLeft - 1; + } + + return false; + + } + + + public new Boolean WriteRegisterSafe(string reg, T value) + { + var RetrysLeft = 4; + + + while (RetrysLeft >= 0) + { + try + { + var result = base.WriteRegister(reg, value,true,true); + if (result) + { + return result; + } + Thread.Sleep(100); + + } + catch (Exception e) + { + base.WriteLog($"Can not WriteRegisterUnsafe retry left: {RetrysLeft}, message: {e.Message}"); + } + RetrysLeft = RetrysLeft - 1; + } + + return false; + + } + + + public new Byte[] ReadRegister(string reg) + { + + + var RetrysLeft = 4; + + Exception lastEx = null; + while (RetrysLeft >= 0) + { + + try + { + return base.ReadRegister(reg); + } + catch (Exception e) + { + lastEx = e; + base.WriteLog($"Can not WriteRegisterUnsafe retry left: {RetrysLeft}, message: {e.Message}"); + } + Thread.Sleep(100); + RetrysLeft = RetrysLeft - 1; + } + + if (lastEx == null) + { + throw new ApplicationException("something went totally wrong on ReadRegister. no Exception found"); + } + throw new ApplicationException($"something went wron on ReadRegister.Message{lastEx.Message}"); + + } + + + } +} diff --git a/ZeroFlowTool/ZeroFlowMeter.cs b/ZeroFlowTool/ZeroFlowMeter.cs new file mode 100644 index 00000000..57e6b34c --- /dev/null +++ b/ZeroFlowTool/ZeroFlowMeter.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using GenesisZeroFlow; +using Xylem.Common.Hardware.WaterMeter; +using Xylem.Common.Hardware.WaterMeter.Genesis; + +namespace GenesisDisplayTool +{ + + public class ZeroFlowMeter : GenesisMeter + { + + public String Password = String.Empty; + public Boolean LogOnEnable = false; + public Boolean PreparationEnable = false; + public Boolean AmplitudeEnable = false; + public Boolean ZeroFlowOffsetEnable = false; + public Boolean TempCalEnable = false; + public Boolean CompletionEnable = false; + public Boolean LoginFailed = false; + public Boolean PreparationFailed = false; + public Boolean AmplitudeFailed = false; + public Boolean ZeroFlowOffsetFailed = false; + public Boolean TempCalFailed = false; + public Boolean CompletionFailed = false; + public Boolean Ok = false; + public Boolean EmptyPipeCheckEnable = false; + public Boolean EmptyPipeCheckFailed = false; + public Boolean MeterSelected = false; + + + public DecodedData DecodedAllMeters = new DecodedData(); + private Boolean NewDataIndicatorAmplitudeTest; + Double[] totalTimeOfFlightAverage = new Double[Constants.NumberOfPaths]; + Double[] DeltaTimeOfFlightAverage = new Double[Constants.NumberOfPaths]; + private Boolean NewDataIndicatorZeroFlowTest; + Double[] AmplitudeValuesPositive = new Double[Constants.NumberOfPaths]; + Double[] AmplitudeValuesNegative = new Double[Constants.NumberOfPaths]; + private Int32 BadDataCounterZeroFlowTest; + Int32 LineCounterZeroFlowTest; + Int32 LineCounterAmplitudeTest; + Int32 LineCounterEmptyPipeTest; + Int32[] ToFTempOffset = new Int32[Constants.NumberOfPaths]; + Int32[] ZeroFlowOffset = new Int32[Constants.NumberOfPaths]; + Byte[] FirstHitPercentage = new Byte[Constants.NumberOfPaths]; + UInt16[] CalFactor = new UInt16[Constants.NumberOfPaths]; + string LoggingPathZeroFlowTest = String.Empty; + bool StartLoggingIndicatorAmplitudeTest = false; + bool LoggingIndicatorAmplitudeTest = false; + String[] NumbersToLog = new String[Constants.NumberOfPaths]; + Int32 SlotNr; + public ZeroFlowMeter(Int32 slot) : base() + { + SlotNr = slot; + base.SetupFromConfigFile(slot); + } + } +} diff --git a/ZeroFlowTool/ZeroFlowTest.cs b/ZeroFlowTool/ZeroFlowTest.cs new file mode 100644 index 00000000..0d8ce2e9 --- /dev/null +++ b/ZeroFlowTool/ZeroFlowTest.cs @@ -0,0 +1,983 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Globalization; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using GenesisDisplayTool; +using Xylem.Common.Hardware.WaterMeter.Genesis.Registers; +using Xylem.Common.Hardware.WaterMeter.WaterMeterCore; + +namespace GenesisZeroFlow +{ + public static class ZeroOffsetSequences + { + public static Boolean[] Total(MeterBatch globalMeterBatch, MeterBatch thermoMeterBatch, Boolean[] allEnable, Int16 settlingTime, Int16 lowerVoltLimit, Int16 upperVoltLimit, Double offsetTimeLimit, Int32 numberOfLines, Double upperTempLimit, Double lowerTempLimit, Double tempDeviationLimit, out Boolean aborted, CultureInfo culture) + { + #region Definitions and initializations + Boolean[] MeterEnable = Misc.Subarray(allEnable, 0, Constants.NumberOfMeters); + Boolean[] ThermoEnable = Misc.Subarray(allEnable, Constants.NumberOfMeters, Constants.NumberOfThermometers); + + Boolean[] MeterTaskStarted = new Boolean[Constants.NumberOfMeters]; + Boolean[] MeterTaskCompleted = new Boolean[Constants.NumberOfMeters]; + Boolean[] MeterSequenceOk = new Boolean[Constants.NumberOfMeters]; + Boolean[] MeterSequenceFailed = new Boolean[Constants.NumberOfMeters]; + + Boolean[] ThermoTaskStarted = new Boolean[Constants.NumberOfThermometers]; + Boolean[] ThermoTaskCompleted = new Boolean[Constants.NumberOfThermometers]; + Boolean[] ThermoSequenceOk = new Boolean[Constants.NumberOfThermometers]; + Boolean[] ThermoSequenceFailed = new Boolean[Constants.NumberOfThermometers]; + + MeterTaskStarted = ArrayInit.Meter(false); + MeterTaskCompleted = ArrayInit.Meter(false); + MeterSequenceOk = ArrayInit.Meter(false); + MeterSequenceFailed = ArrayInit.Meter(false); + + ThermoTaskStarted = ArrayInit.Thermo(false); + ThermoTaskCompleted = ArrayInit.Thermo(false); + ThermoSequenceOk = ArrayInit.Thermo(false); + ThermoSequenceFailed = ArrayInit.Thermo(false); + + Boolean GenerateLogFiles = GenesisZeroFlow._GenesisZeroFlow.GetCBOffsetTestLogFiles(); + Int32 NextDelayTime = 0; + aborted = false; + + List ListZeroFlowOffsetMeter = new List(); + List ThermoListZeroFlowOffsetTest = new List(); + GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed = false; + + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + { + var currentMeter = globalMeterBatch.ListOfMeters.FirstOrDefault(m => m.Slot.Equals(Meter + 1)); + + if (currentMeter != null) + ListZeroFlowOffsetMeter.Add(new ZeroFlowOffsetTest(Meter, culture, currentMeter)); + else + ListZeroFlowOffsetMeter.Add(new ZeroFlowOffsetTest(Meter, culture)); + } + + for (UInt16 Thermo = Constants.Thermo1; Thermo < Constants.NumberOfThermometers; Thermo++) + { + var currentMeter = thermoMeterBatch.ListOfMeters.FirstOrDefault(m => m.Slot.Equals(Thermo + 11)); + + if (currentMeter != null) + ThermoListZeroFlowOffsetTest.Add(new ZeroFlowOffsetTest(Thermo, culture, currentMeter)); + else + ThermoListZeroFlowOffsetTest.Add(new ZeroFlowOffsetTest(Thermo, culture)); + } + #region Initialize + foreach (var zft in ListZeroFlowOffsetMeter) + { + zft.Initialize(GenesisZeroFlow._GenesisZeroFlow.PcbID[zft.MeterNumber], Constants.Meter, lowerVoltLimit, upperVoltLimit, offsetTimeLimit, numberOfLines, 0, 0, 0, GenerateLogFiles); + zft.MyTask = new Task(() => { return true; }); + } + foreach (var zft in ThermoListZeroFlowOffsetTest) + { + zft.Initialize(GenesisZeroFlow._GenesisZeroFlow.ThermoID[zft.MeterNumber], Constants.Thermo, 0, 0, 0, numberOfLines, upperTempLimit, lowerTempLimit, tempDeviationLimit, GenerateLogFiles); + zft.MyTask = new Task(() => { return true; }); + } + #endregion + #endregion + #region Perform test + CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); + CancellationToken token = cancellationTokenSource.Token; + // Zeroflow Offset test + foreach (var zft in ListZeroFlowOffsetMeter) + zft.Meter(MeterEnable[zft.MeterNumber], ref MeterTaskStarted[zft.MeterNumber], ref MeterSequenceFailed[zft.MeterNumber], ref NextDelayTime, settlingTime, token); + // Temperature test + foreach (var zft in ThermoListZeroFlowOffsetTest) + { + if (ThermoEnable[zft.MeterNumber]) + { + GenesisZeroFlow._GenesisZeroFlow.SetIndicatorTemperatureActivityCheck(zft.MeterNumber, true); + GenesisZeroFlow.Display.DebugMessage($"{zft.PcbID}\tAPPLICATION:\t\t TEMPERATURE MONITORING started at {zft.MeterType}{zft.MeterIndex}\n", zft.Culture); + GenesisZeroFlow._GenesisZeroFlow.SetLoggingIndicatorThermoMonitoring(zft.MeterNumber, true); + } + Misc.WaitNMilliseconds(300); + zft.Thermometer(ThermoEnable[zft.MeterNumber], ref ThermoTaskStarted[zft.MeterNumber], ref ThermoSequenceFailed[zft.MeterNumber], ref NextDelayTime, token); + } + #endregion + #region Wait for tasks + while (!CheckArray(MeterTaskCompleted.Concat(ThermoTaskCompleted).ToArray())) + { + #region Temperature check + foreach (var zft in ThermoListZeroFlowOffsetTest) + { + if (CheckArray(MeterTaskCompleted) && (ThermoEnable[zft.MeterNumber])) // If all METERs finished, not THERMOMETERs + { + GenesisZeroFlow._GenesisZeroFlow.SetLoggingIndicatorThermoMonitoring(zft.MeterNumber, false); + GenesisZeroFlow.Display.DebugMessage($"{zft.PcbID}\tAPPLICATION:\t\t TEMPERATURE MONITORING stopped at {zft.MeterType}{zft.MeterIndex}\n", zft.Culture); + } + } + #endregion + #region Abort check + if (GenesisZeroFlow._GenesisZeroFlow.AbortIndicator) + { + cancellationTokenSource.Cancel(); + aborted = true; + } + #endregion + #region Check result + Misc.WaitNSeconds(1); + #region Meter + foreach (var zft in ListZeroFlowOffsetMeter) + { + MeterTaskCompleted[zft.MeterNumber] = TaskOperations.WaitFor(MeterTaskStarted[zft.MeterNumber], zft.MyTask); + // Stop temperature check + var tmp = !MeterTaskCompleted[zft.MeterNumber]; + GenesisZeroFlow._GenesisZeroFlow.SetIndicatorTemperatureActivityCheck(zft.MeterNumber, tmp); + } + foreach (var zft in ListZeroFlowOffsetMeter) + MeterSequenceFailed[zft.MeterNumber] = TaskOperations.GetResult(MeterTaskStarted[zft.MeterNumber], zft.MyTask); + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + MeterSequenceOk[Meter] = !MeterSequenceFailed[Meter]; + #endregion + #region Thermometer + foreach (var zft in ThermoListZeroFlowOffsetTest) + { + ThermoTaskCompleted[zft.MeterNumber] = TaskOperations.WaitFor(ThermoTaskStarted[zft.MeterNumber], zft.MyTask); + // Stop temperature check + GenesisZeroFlow._GenesisZeroFlow.SetIndicatorTemperatureActivityCheck(zft.MeterNumber, !MeterTaskCompleted[zft.MeterNumber]); + } + foreach (var zft in ThermoListZeroFlowOffsetTest) + ThermoSequenceFailed[zft.MeterNumber] = TaskOperations.GetResult(ThermoTaskStarted[zft.MeterNumber], zft.MyTask); + for (UInt16 Thermometer = Constants.Thermo1; Thermometer < Constants.NumberOfThermometers; Thermometer++) + ThermoSequenceOk[Thermometer] = !ThermoSequenceFailed[Thermometer]; + #endregion + GenesisZeroFlow.Display.MeterStatusGreenRed(MeterSequenceOk, MeterTaskStarted); + GenesisZeroFlow.Display.ThermoStatusGreenRed(ThermoSequenceOk, ThermoTaskStarted); + #endregion + } + #region Sequence failed + foreach (var zft in ListZeroFlowOffsetMeter) + MeterSequenceFailed[zft.MeterNumber] = TaskOperations.GetResult(MeterTaskStarted[zft.MeterNumber], zft.MyTask); + foreach (var zft in ThermoListZeroFlowOffsetTest) + ThermoSequenceFailed[zft.MeterNumber] = TaskOperations.GetResult(ThermoTaskStarted[zft.MeterNumber], zft.MyTask); + #endregion + #region SequenceOk/ ThermoSequenceOk + for (UInt16 Meter = Constants.Meter1; Meter < Constants.NumberOfMeters; Meter++) + MeterSequenceOk[Meter] = !MeterSequenceFailed[Meter]; + for (UInt16 Thermo = Constants.Thermo1; Thermo < Constants.NumberOfThermometers; Thermo++) + ThermoSequenceOk[Thermo] = !ThermoSequenceFailed[Thermo]; + GenesisZeroFlow.Display.MeterStatusGreenRed(MeterSequenceOk, MeterTaskStarted); + GenesisZeroFlow.Display.ThermoStatusGreenRed(ThermoSequenceOk, ThermoTaskStarted); + #endregion + #endregion + #region Destroy tasks + foreach (var zft in ListZeroFlowOffsetMeter) + TaskOperations.CheckAndDispose(zft.MyTask); + foreach (var zft in ThermoListZeroFlowOffsetTest) + TaskOperations.CheckAndDispose(zft.MyTask); + #endregion + + return MeterSequenceFailed.Concat(ThermoSequenceFailed).ToArray(); + } + private static Boolean CheckArray(Boolean[] array) + { + Boolean Completed = true; + + for (Int32 i = 0; i < array.Count(); i++) + { + if (Boolean.Equals(array[i], false)) + return false; + } + + return Completed; + } + } + public class ZeroFlowOffsetTest + { + private readonly ZeroFlowGenesisMeter GenesisMeter; + public Task MyTask { get; internal set; } + public ZeroFlowOffsetTest(UInt16 meterNumber, CultureInfo culture) + { + this.Culture = culture; + this.MeterNumber = meterNumber; + this.MeterIndex = (meterNumber + 1).ToString(culture); + } + public ZeroFlowOffsetTest(UInt16 meterNumber, CultureInfo culture, IMeter meter) + { + if (meter is ZeroFlowGenesisMeter) + { + GenesisMeter = meter as ZeroFlowGenesisMeter; + } + + this.Culture = culture; + this.MeterNumber = meterNumber; + this.MeterIndex = (meterNumber + 1).ToString(culture); + } + internal void Meter(Boolean enable, ref Boolean taskStarted, ref Boolean sequenceFailed, ref Int32 nextDelayTime, Int16 settlingTime, CancellationToken token) + { + #region Avoid CA1062 + if (Task.Equals(MyTask, null)) + { + sequenceFailed = true; + taskStarted = false; + return; + } + #endregion + #region Definitions and initializations + Int32 DelayTime = 0; + const Int32 DeltaDelay = 5; + DialogResult AskForActionsTask = DialogResult.None; + DialogResult AskForActionsFinalization = DialogResult.None; + var _sequenceFailed = sequenceFailed; + Int32 temp = DelayTime; + Boolean Ok = false; + #endregion + #region Everything else + if ((enable) && (!Task.Equals(MyTask.Status, TaskStatus.Running))) + { + #region Start delay + DelayTime = nextDelayTime; + nextDelayTime = nextDelayTime + DeltaDelay; + taskStarted = true; + Misc.WaitNSeconds(temp); + #endregion + #region Run task + MyTask = Task.Run(() => + { + while ((DialogResult.Equals(AskForActionsTask, DialogResult.Retry)) || (DialogResult.Equals(AskForActionsTask, DialogResult.None))) + { + #region Abort + if (token.IsCancellationRequested) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t ZEROFLOW OFFSET TEST stopped at {this.MeterType}{this.MeterIndex}\n", this.Culture); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + return true; // sequence failed + } + else + GenesisZeroFlow.Display.AbortButtonEnabled(true); + #endregion + #region Start logging + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t ZEROFLOW OFFSET TEST started at {this.MeterType}{this.MeterIndex}\n", this.Culture); + this.StartTest(); + #endregion + #region Wait for settling time (60s) + for (Int16 Time = settlingTime; Time >= 0; Time--) + { + if ((token.IsCancellationRequested) || (GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed)) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t ZEROFLOW OFFSET TEST stopped at {this.MeterType}{this.MeterIndex}\n", this.Culture); + this.LeaveSequence(); + return true; // sequence failed + } + GenesisZeroFlow.Display.StatusLabel($"{GenesisZeroFlow.PredefinedMessages.ZeroflowOffsetWaitForSettling(this.Culture)}{Time.ToString(this.Culture)}"); + Misc.WaitNSeconds(1); + } + #endregion + #region Start collecting data for calculation + GenesisZeroFlow._GenesisZeroFlow.SetCalculationIndicatorZeroFlowTest(true, this.MeterNumber); + #endregion + #region Activity check + Boolean ActivityOk = true; + if (enable && ActivityOk && ((DialogResult.Equals(AskForActionsTask, DialogResult.None)) || (DialogResult.Equals(AskForActionsTask, DialogResult.Retry)))) + ActivityOk = ActivityCheck(token); + GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed = !ActivityOk; + #endregion + #region Stop logging and stop calculating ==> is also done by the 'MainloopMeterX'-Functions + GenesisZeroFlow._GenesisZeroFlow.SetCalculationIndicatorZeroFlowTest(false, this.MeterNumber); + GenesisZeroFlow._GenesisZeroFlow.SetLoggingIndicatorZeroFlowTest(false, this.MeterNumber); + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t Stop logging at {this.MeterType}{this.MeterIndex}\n", this.Culture); + #endregion + #region Write raw data to files + String LogData = GenesisZeroFlow._GenesisZeroFlow.GetDataToLog()[this.MeterNumber]; + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t Write data to files at {this.MeterType}{this.MeterIndex}\n", this.Culture); + Logging.WriteToFile(LogData, GenesisZeroFlow._GenesisZeroFlow.GetLoggingPathZeroFlowTest()[this.MeterNumber]); + GenesisZeroFlow._GenesisZeroFlow.SetDataToLog(this.MeterNumber, String.Empty); + + if (token.IsCancellationRequested || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t ZEROFLOW OFFSET TEST stopped at {this.MeterType}{this.MeterIndex}\n", this.Culture); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + return true; // sequence failed + } + #endregion + #region Summary + if (token.IsCancellationRequested || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t ZEROFLOW OFFSET TEST stopped at {this.MeterType}{this.MeterIndex}\n", this.Culture); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + return true; // sequence failed + } + + if (ActivityOk) + { + while ((DialogResult.Equals(AskForActionsFinalization, DialogResult.Retry)) || (DialogResult.Equals(AskForActionsFinalization, DialogResult.None))) + { + #region Abort + if (token.IsCancellationRequested || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + { + GenesisZeroFlow._GenesisZeroFlow.GenerateReturnNote(this.MeterIndex, this.PcbID, GenesisZeroFlow.PredefinedMessages.ZeroflowOffsetTestStopped(this.Culture), GenesisZeroFlow._GenesisZeroFlow.GetLoggingFromTextBox(), this.Culture); + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t ZEROFLOW OFFSET TEST stopped at {this.MeterType}{this.MeterIndex}\n", this.Culture); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + return true; // sequence failed + } + else + GenesisZeroFlow.Display.AbortButtonEnabled(true); + #endregion + #region Finalize test + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t Finalize ZEROFLOW OFFSET TEST at {this.MeterType}{this.MeterIndex}\n", this.Culture); + Ok = FinalizeTest(GenesisZeroFlow._GenesisZeroFlow.GetAmplitudeValuesUp(this.MeterNumber), GenesisZeroFlow._GenesisZeroFlow.GetAmplitudeValuesDown(this.MeterNumber), GenesisZeroFlow._GenesisZeroFlow.GetDeltaTimeOfFlightAverage(this.MeterNumber), GenesisZeroFlow._GenesisZeroFlow.GetBadDataCounter(this.MeterNumber), token, GenesisZeroFlow._GenesisZeroFlow.GetDeltaTimeOfFlightAverageRaw(this.MeterNumber)); + + if (Boolean.Equals(Ok, true)) + { + AskForActionsFinalization = DialogResult.OK; + _sequenceFailed = false;//? + } + else + { + // AskForActionsFinalization = this.AskHowToProceedSequence("ZEROFLOW OFFSET TEST"); + GenesisZeroFlow._GenesisZeroFlow.GenerateReturnNote(this.MeterIndex, this.PcbID, GenesisZeroFlow.PredefinedMessages.ZeroflowOffsetTestFailed(this.Culture), GenesisZeroFlow._GenesisZeroFlow.GetLoggingFromTextBox(), this.Culture); + AskForActionsFinalization = DialogResult.Cancel; + _sequenceFailed = true; //? + } + #endregion + } + } + else + Ok = false; + + if (Ok) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t ZEROFLOW OFFSET TEST successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + GenesisZeroFlow.Display.DebugMessage($"{Constants.TwentySpaces}\t{Debugmessages.Line}", this.Culture); + _sequenceFailed = false; + AskForActionsTask = DialogResult.OK; + } + else + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t ZEROFLOW OFFSET TEST failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + GenesisZeroFlow.Display.DebugMessage($"{Constants.TwentySpaces}\t{Debugmessages.Line}", this.Culture); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + GenesisZeroFlow._GenesisZeroFlow.GenerateReturnNote(this.MeterIndex, this.PcbID, GenesisZeroFlow.PredefinedMessages.ZeroflowOffsetTestFailed(this.Culture), GenesisZeroFlow._GenesisZeroFlow.GetLoggingFromTextBox(), this.Culture); + _sequenceFailed = true; + AskForActionsTask = DialogResult.Cancel; + } + #endregion + } + return _sequenceFailed; + }); + #endregion + } + #endregion + } + + + + internal void Thermometer(Boolean enable, ref Boolean taskStarted, ref Boolean sequenceFailed, ref Int32 nextDelayTime, CancellationToken token) + { + #region Avoid CA1062 + if ((MyTask == null)) + return; + #endregion + #region Definitions and initializations + Int32 DelayTime = 0; + const Int32 DeltaDelay = 30; + const Int32 Interval = 4; + var _sequenceFailed = sequenceFailed; + Boolean Ok = true; + #endregion + #region Everything else + if ((enable) && (!TaskStatus.Equals(MyTask.Status, TaskStatus.Running)) && (!MyTask.IsCompleted)) + { + #region Start delay + DelayTime = nextDelayTime; + nextDelayTime = nextDelayTime + DeltaDelay; + taskStarted = true; + Misc.WaitNSeconds(DelayTime); + #endregion + #region Run task + MyTask = Task.Run(() => + { + Boolean LoggingIndicator = GenesisZeroFlow._GenesisZeroFlow.GetLoggingIndicatorThermoMonitoring()[this.MeterNumber]; + Int32 BadCycles = 0; + const Int32 AllowedBadCycles = 1; + + Boolean StatusOk = true; + + while (LoggingIndicator && (StatusOk)) + { + + #region Abort + if (!token.IsCancellationRequested) + GenesisZeroFlow.Display.AbortButtonEnabled(true); + #endregion + #region Testprocedure + Ok = PerformTempMonitoring(token); + + + Misc.WaitNSeconds(Interval); + + + if (token.IsCancellationRequested) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t TEMPERATURE MONITORING stopped at {this.MeterType}{this.MeterIndex}\n", this.Culture); + GenesisZeroFlow.Display.AbortButtonEnabled(false); + return true; // sequence failed + } + + + if (Ok) + { + BadCycles = 0; + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t TEMPERATURE MONITORING successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + GenesisZeroFlow.Display.DebugMessage($"{Constants.TwentySpaces}\t{Debugmessages.Line}", this.Culture); + _sequenceFailed = false; + } + else + { + BadCycles++; + if (BadCycles > AllowedBadCycles) + StatusOk = false; + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t TEMPERATURE MONITORING failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + _sequenceFailed = true; + } + #endregion + LoggingIndicator = GenesisZeroFlow._GenesisZeroFlow.GetLoggingIndicatorThermoMonitoring()[this.MeterNumber]; + } + return _sequenceFailed; + + }, token); + #endregion + } + #endregion + } + private Boolean StartTest() + { + #region Definitions and initializations + Boolean Ok = false; + String time = DateTime.Now.ToString(Formats.LogFileDateTimeString, this.Culture); + String TempPcbID = this.PcbID.Replace(" ", String.Empty); + #endregion + #region Generate Header + String Header = $"Genesis ZeroFlowOffsetTest {this.MeterType}{this.MeterIndex}; PCB ID = {TempPcbID}; Date = {time}; Operator = {Environment.UserName}\n"; + #endregion + #region Start logging + this.ClearData(); + GenesisZeroFlow._GenesisZeroFlow.SetLoggingPathZeroFlowTest(this.MeterNumber, $"{DataLogging.DefaultPath}ZeroflowOffsetTest_RawData_{TempPcbID}_{time}.txt"); + GenesisZeroFlow._GenesisZeroFlow.SetLoggingIndicatorZeroFlowTest(true, this.MeterNumber); // Start logging data + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t Start logging at {this.MeterType}{this.MeterIndex}\n", this.Culture); + #endregion + + return Ok; + } + + + private Boolean FinalizeTest(List[] amplitudeValuesUp, List[] amplitudeValuesDown, List[] deltaTimeOfFlightAverage, Int32[] badData, CancellationToken token, List[] deltaTimeOfFlightAverageRAW) + { + + #region Avoid CA1062 + if ((amplitudeValuesUp == null) || (amplitudeValuesDown == null) || (badData == null) || (deltaTimeOfFlightAverage == null) || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + return false; + #endregion + #region Definitions and initializations + + Boolean Ok = false; + Double[] amplitudeValuesMeanUp = new Double[Constants.NumberOfPaths]; + Double[] amplitudeValuesMeanDown = new Double[Constants.NumberOfPaths]; + Double[] DeltaTimeOfFlightAverage = new Double[Constants.NumberOfPaths]; + amplitudeValuesMeanUp = ArrayInit.Path((Double)0); + amplitudeValuesMeanDown = ArrayInit.Path((Double)0); + DeltaTimeOfFlightAverage = ArrayInit.Path((Double)0); + #endregion + #region Calculating mean values + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t Calculating mean values at {this.MeterType}{this.MeterIndex}\n", this.Culture); + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + amplitudeValuesMeanUp[Path] = amplitudeValuesUp[Path].Mean(); + amplitudeValuesMeanDown[Path] = amplitudeValuesDown[Path].Mean(); + DeltaTimeOfFlightAverage[Path] = deltaTimeOfFlightAverage[Path].Mean(); + + if((amplitudeValuesMeanUp[Path] == 0)|| (amplitudeValuesMeanDown[Path] == 0)||(DeltaTimeOfFlightAverage[Path] == 0)) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t Mean value is zero at {this.MeterType}{this.MeterIndex}; PATH{(Path + 1).ToString(this.Culture)}\n", this.Culture); + this.ClearData(); + return false; + } + } + #endregion + #region Display calculated values + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t Bad data at {this.MeterType}{this.MeterIndex}, PATH{(Path + 1).ToString(this.Culture)}: {badData[Path].ToString(this.Culture)}\n", this.Culture); + + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t Average positive amplitude value at {this.MeterType}{this.MeterIndex}, PATH{(Path + 1).ToString(this.Culture)}: {Math.Round(amplitudeValuesMeanUp[Path], 2).ToString("000.00", this.Culture)}mV\n", this.Culture); + + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t Average negative amplitude value at {this.MeterType}{this.MeterIndex}, PATH{(Path + 1).ToString(this.Culture)}: {Math.Round(amplitudeValuesMeanDown[Path], 2).ToString("000.00", this.Culture)}mV\n", this.Culture); + + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t Average delta time of flight value at {this.MeterType}{this.MeterIndex}, PATH{(Path + 1).ToString(this.Culture)}: { Math.Round(DeltaTimeOfFlightAverage[Path] * (Math.Pow(2, 38)), 2).ToString("000.00", this.Culture)}ps\n", this.Culture); + #endregion + #region Check for bad data + Boolean BadDataCheckOK = false; + BadDataCheckOK = this.CheckForBadData(badData); + if (BadDataCheckOK) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t Bad data check successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + else + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t Bad data check failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + #endregion + #region Check amplitude values + this.ClearData(); + Boolean AmplitudeCheckOK = false; + AmplitudeCheckOK = CheckAmplitudes(amplitudeValuesMeanUp, amplitudeValuesMeanDown); + if (AmplitudeCheckOK) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t Amplitude check successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + else + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t Amplitude check failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + #endregion + #region Check if offsets are within ranges + Boolean OffsetCheckOK = false; + OffsetCheckOK = CheckOffset(DeltaTimeOfFlightAverage); + if (OffsetCheckOK) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t Delta time of flight check successful at {this.MeterType}{this.MeterIndex}\n", this.Culture); + else + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t Delta time of flight check failed at {this.MeterType}{this.MeterIndex}\n", this.Culture); + #endregion + #region Abort if checks failed + if ((Boolean.Equals(BadDataCheckOK, false)) || (Boolean.Equals(AmplitudeCheckOK, false)) || (Boolean.Equals(OffsetCheckOK, false) || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed)) + { + this.ClearData(); + return false; + } + #endregion + + GenesisMeter.Login(); + + #region Write new values to offset registers + #region Write to 'ZeroOffset' register PATH0 + + + this.OffsetValuePath0 = (Int32)((DeltaTimeOfFlightAverage[Constants.PATH0] * Math.Pow(2, 40))); // ZeroOffsetTestConstants.DeltaTofAverageFactor))); + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing {OffsetValuePath0.ToString(this.Culture)} to 'Zero flow offset'-register PATH1 started at {this.MeterType}{this.MeterIndex}\n", this.Culture); + #region Write to register + Ok = GenesisMeter.WriteRegisterSafe(Register.Genesisflow.ZeroOffset1, OffsetValuePath0); + if (Ok) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing {OffsetValuePath0.ToString(this.Culture)} to 'Zero flow offset'-register successful at {this.MeterType}{this.MeterIndex}; PATH1\n", this.Culture); + else + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing {OffsetValuePath0.ToString(this.Culture)} to 'Zero flow offset'-register failed at {this.MeterType}{this.MeterIndex}; PATH1\n", this.Culture); + + if (Boolean.Equals(Ok, false) || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + return false; + #endregion + #endregion + #region Write to 'ZeroOffset' register PATH1 + if (Constants.NumberOfPaths > 1) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t calculating offset PATH2 {DeltaTimeOfFlightAverage[Constants.PATH1]} * {Math.Pow(2, 40)} started at {this.MeterType}{this.MeterIndex}\n", this.Culture); + + var p2AVG = deltaTimeOfFlightAverageRAW[Constants.PATH1].Average(); + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID} AVG RAW Value is {p2AVG}", this.Culture); + + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID} Value in S is {DeltaTimeOfFlightAverage[Constants.PATH1]}", this.Culture); + GenesisZeroFlow.Display.DebugMessage( + $"{this.PcbID} Calculation RAW {DeltaTimeOfFlightAverage[Constants.PATH1] / (1.0 / 0x4000000000)} | RAW {DeltaTimeOfFlightAverage} in Seconds", this.Culture); + + GenesisZeroFlow.Display.DebugMessage( + $"{this.PcbID} Raw x4 calc {DeltaTimeOfFlightAverage[Constants.PATH1] / (1.0 / 0x4000000000) * 4} = offset", this.Culture); + GenesisZeroFlow.Display.DebugMessage( + $"{this.PcbID} Current calc DeltaTimeOfFlightAverage * 2^40 {(Int32)((DeltaTimeOfFlightAverage[Constants.PATH1] * Math.Pow(2, 40)))} = offset", this.Culture); + + + + GenesisZeroFlow.Display.StatusLabel($"{GenesisZeroFlow.PredefinedMessages.WaitUntilRegisterWriteFinished(this.Culture)}"); + this.OffsetValuePath1 = (Int32)((DeltaTimeOfFlightAverage[Constants.PATH1] * Math.Pow(2, 40))); // ZeroOffsetTestConstants.DeltaTofAverageFactor))); + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing {OffsetValuePath1.ToString(this.Culture)} to 'Zero flow offset'-register PATH2 started at {this.MeterType}{this.MeterIndex}\n", this.Culture); + #region Write to register + Ok = GenesisMeter.WriteRegisterSafe(Register.Genesisflow.ZeroOffset2, OffsetValuePath1); + if (Ok) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing {OffsetValuePath1.ToString(this.Culture)} to 'Zero flow offset'-register successful at {this.MeterType}{this.MeterIndex}; PATH2\n", this.Culture); + else + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing {OffsetValuePath1.ToString(this.Culture)} to 'Zero flow offset'-register failed at {this.MeterType}{this.MeterIndex}; PATH2\n", this.Culture); + #endregion + + if (Boolean.Equals(Ok, false) || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + return false; + } + #endregion + #region Write to 'ZeroOffset' register PATH2 + if (Constants.NumberOfPaths > 2) + { + this.OffsetValuePath2 = (Int32)((DeltaTimeOfFlightAverage[Constants.PATH2] * Math.Pow(2, 40)));// ZeroOffsetTestConstants.DeltaTofAverageFactor))); + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing {OffsetValuePath2.ToString(this.Culture)} to 'Zero flow offset'-register PATH3 started at {this.MeterType}{this.MeterIndex}\n", this.Culture); + #region Write to register + Ok = GenesisMeter.WriteRegisterSafe(Register.Genesisflow.ZeroOffset3, OffsetValuePath2); + if (Ok) + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing {OffsetValuePath2.ToString(this.Culture)} to 'Zero flow offset'-register successful at {this.MeterType}{this.MeterIndex}; PATH3\n", this.Culture); + else + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tCOMMAND CHANNEL:\t Writing {OffsetValuePath2.ToString(this.Culture)} to 'Zero flow offset'-register failed at {this.MeterType}{this.MeterIndex}; PATH3\n", this.Culture); + #endregion + if (Boolean.Equals(Ok, false) || GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + return false; + } + #endregion + #endregion + + return Ok; + } + private Boolean PerformTempMonitoring(CancellationToken token) + { + #region Definitions and initializations + Int32[] LinecounterFollowing = new Int32[1]; + + + //Int32[] LinecounterFollowing = new Int32[Constants.NumberOfPaths] { 0, 0, 0 }; + Boolean Ok = true; + Int32 ActivityCheckInterval = GenesisZeroFlow._GenesisZeroFlow.GetAmplitudeActivityCheckInterval(); + Ok = this.ThermoActivityCheck(ref LinecounterFollowing, 0); + #endregion + #region Test sequence + #region Check upper temp value + for (UInt16 Path = 0; Path < Constants.NumberOfPaths; Path++) + { + Double temp = 0; + + try + { + temp = GenesisZeroFlow._GenesisZeroFlow.GetTemperatures(this.MeterNumber, Path); + String Temperature = $"{Math.Round(temp, 2).ToString("00.00", this.Culture)}°C"; + + switch (this.MeterNumber) + { + case Constants.Meter1: + GenesisZeroFlow.Display.SetThermoLabel1($"{Temperature}"); + break; + case Constants.Meter2: + GenesisZeroFlow.Display.SetThermoLabel2($"{Temperature}"); + break; + default: + GenesisZeroFlow.Display.SetThermoLabel1($"n/a"); + break; + } + + #region Upper value + if (temp > this.UpperTempLimit) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t TEMPERATURE MONITORING upper value check failed at {this.MeterType}{this.MeterIndex}; PATH{Path.ToString(this.Culture)}\n", this.Culture); + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t TEMPERATURE MONITORING upper value check values (actual/ limit) = {Temperature}/ {Math.Round(this.UpperTempLimit, 2).ToString("00.00", this.Culture)}°C\n", this.Culture); + GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed = true; + return false; + } + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t TEMPERATURE MONITORING upper value successful at {this.MeterType}{this.MeterIndex}; PATH{Path.ToString(this.Culture)}; Value = {Temperature}\n", this.Culture); + #endregion + #region Lower value + if (temp < this.LowerTempLimit) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t TEMPERATURE MONITORING lower value check failed at {this.MeterType}{this.MeterIndex}; PATH{Path.ToString(this.Culture)}\n", this.Culture); + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t TEMPERATURE MONITORING lower value check values (actual/ limit) = {Temperature}/ {Math.Round(this.LowerTempLimit, 2).ToString("00.00", this.Culture)}°C\n", this.Culture); + GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed = true; + return false; + } + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t TEMPERATURE MONITORING lower value successful at {this.MeterType}{this.MeterIndex}; PATH{Path.ToString(this.Culture)}; Value = {Temperature}\t\n", this.Culture); + #endregion + #region Deviation check + // Lower value check + if (this.GetTempDeviationMin()[Path] == 0) + this.TempDeviationMin[Path] = temp; + else + { + if (temp < this.GetTempDeviationMin()[Path]) + this.TempDeviationMin[Path] = temp; + } + // Upper value check + if (this.GetTempDeviationMax()[Path] == 0) + this.TempDeviationMax[Path] = temp; + else + { + if (temp > this.GetTempDeviationMax()[Path]) + this.TempDeviationMax[Path] = temp; + } + // Deviation check + + Double DeviationValue = this.GetTempDeviationMax()[Path] - this.GetTempDeviationMin()[Path]; + String Deviation = $"{Math.Round(DeviationValue, 3).ToString("00.000", this.Culture)}°C"; + + if (DeviationValue > this.TempDeviationLimit) + { + GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed = true; + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t TEMPERATURE MONITORING deviation check failed at {this.MeterType}{this.MeterIndex}; PATH{Path.ToString(this.Culture)}; Value = {Deviation}\n", this.Culture); + return false; + } + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t TEMPERATURE MONITORING deviation check successful at {this.MeterType}{this.MeterIndex}; PATH{Path.ToString(this.Culture)}; Value = {Deviation}\n", this.Culture); + #endregion + } + catch (Exception ex) + { + GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed = true; + ErrorLog.Log(LogErrReason.Exeption, "ZeroFlowOffsetTest.PerformTemperatureMonitoring() failed", $"0x{ex.HResult.ToString("X", this.Culture)}", String.Empty, this.Culture); + } + } + #endregion + #endregion + return Ok; + } + private Boolean ActivityCheck(CancellationToken token) + { + #region Definitions and initializations + Boolean Ok = true; + Int32[] LineCounterFollowing = new Int32[Constants.NumberOfPaths]; + LineCounterFollowing = ArrayInit.Path((Int32)0); + Int32[] LineCounter = new Int32[Constants.NumberOfPaths]; + LineCounter = ArrayInit.Path((Int32)0); + Int32[] LineCounterFailed = new Int32[Constants.NumberOfPaths]; + LineCounterFailed = ArrayInit.Path((Int32)0); + const Int32 maxLineCounterFailed = 500; + Boolean PerformCheck = true; + + for(UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + if (!(LineCounter[Path] < this.NumberOfLines - 1)) + PerformCheck = false; + if (GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed) + PerformCheck = false; + } + + #endregion + #region Check activity + while (PerformCheck) + //while ((LineCounter[Constants.PATH0] < this.NumberOfLines - 1) && (LineCounter[Constants.PATH1] < this.NumberOfLines - 1) && (LineCounter[Constants.PATH2] < this.NumberOfLines) && (!GenesisZeroFlow._GenesisZeroFlow.TempMonitoringFailed)) + { + if (token.IsCancellationRequested) + return false; + + LineCounterFollowing = (Int32[])LineCounter.Clone(); + GenesisZeroFlow.Display.StatusLabel($"{GenesisZeroFlow.PredefinedMessages.ZeroflowOffsetAqqFinished(this.Culture)} {LineCounterFollowing[Constants.PATH0].ToString(this.Culture)}/{this.NumberOfLines.ToString(this.Culture)}"); // "Wait until data aquisition has finished:" + Misc.WaitNSeconds(2); + LineCounter = (Int32[])GenesisZeroFlow._GenesisZeroFlow.GetLineCounterZeroFlow(this.MeterNumber).Clone(); + + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + if (Int32.Equals(LineCounterFollowing[Path], LineCounter[Path]) && (Int32.Equals((LineCounter[Path] % 3), 0))) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t Data activity check failed at {this.MeterType}{this.MeterIndex}; PATH{Path + 1}; Linecounter = {LineCounter[Path].ToString(this.Culture)}\n", this.Culture); + LineCounterFailed[Path] = LineCounterFailed[Path] + 1; + } + } + + bool testDone = true; + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + + if (LineCounterFailed[Path] > maxLineCounterFailed) + { + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tDATA CHANNEL:\t\t To many bad data Packages {this.MeterType}{this.MeterIndex}; PATH{Path + 1}; Linecounter = {LineCounter[Path].ToString(this.Culture)}\n", this.Culture); + + Ok = false; + break; + } + if (LineCounter[Path] < this.NumberOfLines) + { + testDone = false; + } + } + + if (testDone) + { + Ok = true; + PerformCheck = false; + } + + + + } + #endregion + + return Ok; + } + private Boolean ThermoActivityCheck(ref Int32[] lineCounterFollowing, Int32 seconds) + { + #region Definitions and initializations + Boolean Ok = true; + Boolean Error = false; + #endregion + #region Check activity + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + if (!Int32.Equals(GenesisZeroFlow._GenesisZeroFlow.GetLineCounterTemperatureTest()[this.MeterNumber][Path], 0)) + { + if (Int32.Equals(GenesisZeroFlow._GenesisZeroFlow.GetLineCounterTemperatureTest()[this.MeterNumber][Path], lineCounterFollowing[Path])) + return false; + else + lineCounterFollowing[Path] = GenesisZeroFlow._GenesisZeroFlow.GetLineCounterTemperatureTest()[this.MeterNumber][Path]; + } + if ((seconds > 0) && (Boolean.Equals(GenesisZeroFlow._GenesisZeroFlow.GetLineCounterTemperatureTest()[this.MeterNumber][Path], 0))) + return false; + } + #endregion + #region Result + Ok = !Error; + #endregion + + return Ok; + } + private Boolean CheckForBadData(Int32[] badData) + { + #region Definitions and initializations + const Int32 BadDataLimit = ZeroOffsetTestConstants.BadDataLimit; + Boolean Ok = true; + #endregion + #region Result + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + if (badData[Path] >= BadDataLimit) + Ok = false; + } + #endregion + + return Ok; + } + private Boolean CheckOffset(Double[] deltaTimeOfFlightAvg) + { + #region Definitions and initializations + Boolean Ok = true; + #endregion + #region Result + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + if (deltaTimeOfFlightAvg[Path] > this.OffsetTimeLimit) + Ok = false; + if (deltaTimeOfFlightAvg[Path] < -this.OffsetTimeLimit) + Ok = false; + } + #endregion + + return Ok; + } + private Boolean CheckAmplitudes(Double[] amplitudeValuesUp, Double[] amplitudeValuesDown) + { + #region Definitions and initializations + Boolean Ok = true; + + #endregion + #region Result + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + if (amplitudeValuesUp[Path] > this.UpperVoltLimit) + return false; + if (amplitudeValuesUp[Path] < this.LowerVoltLimit) + return false; + if (amplitudeValuesDown[Path] < this.LowerVoltLimit) + return false; + if (amplitudeValuesDown[Path] > this.UpperVoltLimit) + return false; + } + #endregion + + return Ok; + } + private DialogResult AskHowToProceedSequence(String sequenceName) + { + DialogResult AskForActions; + + GenesisZeroFlow.Display.AbortButtonEnabled(false); + AskForActions = MessageBox.Show(GenesisZeroFlow.PredefinedMessages.MeterSequenceFailed(sequenceName, this.MeterIndex, this.Culture), "Retry?", MessageBoxButtons.RetryCancel, MessageBoxIcon.Question); + switch (AskForActions) + { + case DialogResult.Retry: + GenesisZeroFlow.Display.DebugMessage($"{Constants.TwentySpaces}\tAPPLICATION:\t\t {sequenceName} restarted at {this.MeterType}{this.MeterIndex}\n", this.Culture); + break; + case DialogResult.Cancel: + GenesisZeroFlow.Display.DebugMessage($"{Constants.TwentySpaces}\tAPPLICATION:\t\t {sequenceName} canceled at {this.MeterType}{this.MeterIndex}\n", this.Culture); + GenesisZeroFlow.Display.DebugMessage($"{Constants.TwentySpaces}\t{Debugmessages.Line}", this.Culture); + break; + default: break; + } + + return AskForActions; + } + + private void LeaveSequence() + { + GenesisZeroFlow._GenesisZeroFlow.SetCalculationIndicatorZeroFlowTest(false, this.MeterNumber); + GenesisZeroFlow._GenesisZeroFlow.SetLoggingIndicatorZeroFlowTest(false, this.MeterNumber); + + #region Write raw data to files + if (this.GenerateLogFiles) + { + String temp = GenesisZeroFlow._GenesisZeroFlow.GetDataToLog()[this.MeterNumber]; + + GenesisZeroFlow.Display.DebugMessage($"{this.PcbID}\tAPPLICATION:\t\t Write data to files at {this.MeterType}{this.MeterIndex}\n", this.Culture); + Logging.WriteToFile(temp, GenesisZeroFlow._GenesisZeroFlow.GetLoggingPathZeroFlowTest()[this.MeterNumber]); + } + this.ClearData(); + #endregion + } + + private void ClearData() + { + try + { + GenesisZeroFlow._GenesisZeroFlow.SetCalculationIndicatorZeroFlowTest(false, this.MeterNumber); + GenesisZeroFlow._GenesisZeroFlow.SetLoggingIndicatorZeroFlowTest(false, this.MeterNumber); + Misc.WaitNMilliseconds(100); + + GenesisZeroFlow._GenesisZeroFlow.SetDataToLog(this.MeterNumber, String.Empty); + + for (UInt16 Path = Constants.PATH0; Path < Constants.NumberOfPaths; Path++) + { + GenesisZeroFlow._GenesisZeroFlow.ClearAmplitudeValuesUp(this.MeterNumber); + GenesisZeroFlow._GenesisZeroFlow.ClearAmplitudeValuesDown(this.MeterNumber); + GenesisZeroFlow._GenesisZeroFlow.ClearTotalTimeOfFlightAverage(this.MeterNumber, Path); + GenesisZeroFlow._GenesisZeroFlow.ClearLineCounterZeroFlow(this.MeterNumber); + GenesisZeroFlow._GenesisZeroFlow.ClearBadDataCounter(this.MeterNumber); + } + } + catch(Exception ex) + { + ErrorLog.Log(LogErrReason.Exeption, "ZeroFlowOffsetTest.ClearData() failed", $"0x{ex.HResult.ToString("X", this.Culture)}", String.Empty, this.Culture); + } + } + + public void Initialize(String pcbID, String meterType, Int16 lowerVoltLimit, Int16 upperVoltLimit, Double offsetTimeLimit, Int32 numberOfLines, Double upperTempLimit, Double lowerTempLimit, Double tempDeviationLimit, Boolean generateLogFiles) + { + this.OffsetValuePath0 = 0; + this.OffsetValuePath1 = 0; + this.OffsetValuePath2 = 0; + this.UpperVoltLimit = upperVoltLimit; + this.LowerVoltLimit = lowerVoltLimit; + this.OffsetTimeLimit = offsetTimeLimit; + this.NumberOfLines = numberOfLines; + this.UpperTempLimit = upperTempLimit; + this.LowerTempLimit = lowerTempLimit; + this.TempDeviationLimit = tempDeviationLimit; + this.TempDeviationMin = new Double[Constants.NumberOfPaths]; + this.TempDeviationMax = new Double[Constants.NumberOfPaths]; + this.TempDeviationMin = ArrayInit.Path((Double)0); + this.TempDeviationMax = ArrayInit.Path((Double)0); + this.MeterType = meterType; + this.ActivityInterval = GenesisZeroFlow._GenesisZeroFlow.GetZeroFlowActivityCheckInterval(); + this.PcbID = pcbID; + this.GenerateLogFiles = generateLogFiles; + } + private Boolean GenerateLogFiles { get; set; } + public UInt16 MeterNumber { get; private set; } + public String MeterIndex { get; private set; } + public String MeterType { get; private set; } + public String PcbID { get; private set; } + public CultureInfo Culture { get; private set; } + private Double LowerVoltLimit { get; set; } + private Double UpperVoltLimit { get; set; } + private Int32 OffsetValuePath0 { get; set; } + private Int32 OffsetValuePath1 { get; set; } + private Int32 OffsetValuePath2 { get; set; } + private Double OffsetTimeLimit { get; set; } + private Int32 NumberOfLines { get; set; } + private Int32 ActivityInterval { get; set; } + private Double LowerTempLimit { get; set; } // usually 10.0°C + private Double UpperTempLimit { get; set; } // usually 35.0°C + private Double TempDeviationLimit { get; set; } // usually 0.5°C + internal Double[] TempDeviationMin { get; set; } // to store min. measure temperature value + private Double[] GetTempDeviationMin() + { + return (Double[])TempDeviationMin.Clone(); + } + private Double[] TempDeviationMax { get; set; } // to store max. measure temperature value + private Double[] GetTempDeviationMax() + { + return (Double[])TempDeviationMax.Clone(); + } + + } +} \ No newline at end of file diff --git a/ZeroFlowTool/configuration.json b/ZeroFlowTool/configuration.json new file mode 100644 index 00000000..367afb7f --- /dev/null +++ b/ZeroFlowTool/configuration.json @@ -0,0 +1,7094 @@ +{ + "CUSTOMER": { + "id": 9, + "version": { + "first": 1, + "last": 120 + }, + "registers": { + "AlarmStatus0": { + "id": 0, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "8 bit counts corresponding to alarms 0-3.", + "version": { + "first": 1, + "last": 120 + } + } + ] + }, + "AlarmStatus1": { + "id": 1, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "8 bit counts corresponding to alarms 4-7.", + "version": { + "first": 1, + "last": 120 + } + } + ] + }, + "TriggerAlarmCancel": { + "id": 2, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Any set bits manually clear the corresponding alarm.", + "version": { + "first": 1, + "last": 110 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Any set bits manually clear the corresponding alarm.", + "version": { + "first": 111, + "last": 120 + } + } + ] + }, + "AlarmStatus2": { + "id": 3, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "8 bit counts corresponding to alarms 8-11.", + "version": { + "first": 26, + "last": 120 + } + } + ] + }, + "AlarmStatus3": { + "id": 4, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "8 bit counts corresponding to alarms 12-15.", + "version": { + "first": 26, + "last": 120 + } + } + ] + }, + "AlarmStatus4": { + "id": 5, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "8 bit counts corresponding to alarms 16-19.", + "version": { + "first": 26, + "last": 120 + } + } + ] + }, + "AlarmStatus5": { + "id": 6, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "8 bit counts corresponding to alarms 20-23.", + "version": { + "first": 26, + "last": 120 + } + } + ] + }, + "AlarmStatus6": { + "id": 7, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "8 bit counts corresponding to alarms 24-27.", + "version": { + "first": 26, + "last": 120 + } + } + ] + }, + "AlarmStatus7": { + "id": 8, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "8 bit counts corresponding to alarms 28-31.", + "version": { + "first": 26, + "last": 120 + } + } + ] + }, + "AlarmEnableMask": { + "id": 9, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit set of those alarms which are being monitored.", + "version": { + "first": 26, + "last": 110 + }, + "values": { + "default": 4294967295, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit set of those alarms which are being monitored.", + "version": { + "first": 111, + "last": 120 + }, + "values": { + "default": 4294967295, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "AlarmBroadcastMask": { + "id": 10, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit set of those alarms which will generate events.", + "version": { + "first": 26, + "last": 110 + }, + "values": { + "default": 4294967295, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit set of those alarms which will generate events.", + "version": { + "first": 111, + "last": 120 + }, + "values": { + "default": 4294967295, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "AlarmVisualMask": { + "id": 11, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit set of those alarms which are displayed with IDs and the alarm icon.", + "version": { + "first": 110, + "last": 110 + }, + "values": { + "default": 4294967295, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit set of those alarms which are displayed with IDs and the alarm icon.", + "version": { + "first": 111, + "last": 120 + }, + "values": { + "default": 4294967295, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "AlarmVisualAutoClearMask": { + "id": 12, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Alarms that have their display automatically cleared", + "version": { + "first": 1, + "last": 1 + } + } + ] + }, + "ExcessFlowVolumeThreshold": { + "id": 13, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Flow rate above which broken pipe alarm is set in 1/256 l/h", + "version": { + "first": 61, + "last": 110 + }, + "values": { + "default": 6400000, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Flow rate above which broken pipe alarm is set in 1/256 l/h", + "version": { + "first": 111, + "last": 118 + }, + "values": { + "default": 6400000, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Flow rate above which broken pipe alarm is set in 1/256 l/h", + "version": { + "first": 119, + "last": 120 + }, + "values": { + "default": 640000, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "LeakTimeThreshold": { + "id": 14, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for leak alarm in minutes", + "version": { + "first": 61, + "last": 110 + }, + "values": { + "default": 10080, + "minimum": 0, + "maximum": 69632 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for leak alarm in minutes", + "version": { + "first": 111, + "last": 118 + }, + "values": { + "default": 10080, + "minimum": 0, + "maximum": 69632 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for leak alarm in minutes", + "version": { + "first": 119, + "last": 120 + }, + "values": { + "default": 360, + "minimum": 0, + "maximum": 69632 + } + } + ] + }, + "ReverseFlowTimeThreshold": { + "id": 15, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Number of measurements in reverse flow required to set reverse flow alarm", + "version": { + "first": 61, + "last": 110 + }, + "values": { + "default": 15, + "minimum": 0, + "maximum": 255 + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Number of measurements in reverse flow required to set reverse flow alarm", + "version": { + "first": 111, + "last": 120 + }, + "values": { + "default": 15, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "Locale": { + "id": 18, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Timezone in which this application is set to run.", + "version": { + "first": 24, + "last": 120 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "RebootCount": { + "id": 20, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of times the meter has rebooted", + "version": { + "first": 73, + "last": 110 + }, + "values": { + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of times the meter has rebooted", + "version": { + "first": 111, + "last": 120 + }, + "values": { + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "ExcessFlowTimeThreshold": { + "id": 21, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for broken pipe alarm in minutes", + "version": { + "first": 80, + "last": 110 + }, + "values": { + "default": 15, + "minimum": 0, + "maximum": 69632 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for broken pipe alarm in minutes", + "version": { + "first": 111, + "last": 118 + }, + "values": { + "default": 15, + "minimum": 0, + "maximum": 69632 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for broken pipe alarm in minutes", + "version": { + "first": 119, + "last": 120 + }, + "values": { + "default": 180, + "minimum": 0, + "maximum": 69632 + } + } + ] + }, + "LeakFlowThreshold": { + "id": 22, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Flow rate above which leak alarm can be set in 1/256 l/h", + "version": { + "first": 80, + "last": 110 + }, + "values": { + "default": 12800, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Flow rate above which leak alarm can be set in 1/256 l/h", + "version": { + "first": 111, + "last": 118 + }, + "values": { + "default": 12800, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Flow rate above which leak alarm can be set in 1/256 l/h", + "version": { + "first": 119, + "last": 120 + }, + "values": { + "default": 6400, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "MfgCharge": { + "id": 23, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Charge in uAs available in manufacturing (read only)", + "version": { + "first": 84, + "last": 110 + }, + "values": { + "default": 181440000 + } + } + ] + }, + "TemperatureHighThreshold": { + "id": 24, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "High temperature alarm threshold in 0.1°C", + "version": { + "first": 88, + "last": 110 + }, + "values": { + "default": 500, + "minimum": 0, + "maximum": 800 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "High temperature alarm threshold in 0.1°C", + "version": { + "first": 111, + "last": 120 + }, + "values": { + "default": 500, + "minimum": 0, + "maximum": 800 + } + } + ] + }, + "TemperatureHighDelay": { + "id": 25, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for high temperature alarm in seconds", + "version": { + "first": 88, + "last": 110 + }, + "values": { + "default": 600, + "minimum": 0, + "maximum": 10800 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for high temperature alarm in seconds", + "version": { + "first": 111, + "last": 120 + }, + "values": { + "default": 600, + "minimum": 0, + "maximum": 10800 + } + } + ] + }, + "TemperatureLowThreshold": { + "id": 26, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Low temperature alarm threshold in 0.1°C", + "version": { + "first": 88, + "last": 110 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Low temperature alarm threshold in 0.1°C", + "version": { + "first": 111, + "last": 120 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "TemperatureLowDelay": { + "id": 27, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for low temperature alarm in seconds", + "version": { + "first": 88, + "last": 110 + }, + "values": { + "default": 600, + "minimum": 0, + "maximum": 10800 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for low temperature alarm in seconds", + "version": { + "first": 111, + "last": 120 + }, + "values": { + "default": 600, + "minimum": 0, + "maximum": 10800 + } + } + ] + }, + "PressureHighThreshold": { + "id": 28, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "High pressure alarm threshold in Pa", + "version": { + "first": 88, + "last": 110 + }, + "values": { + "default": 1600000, + "minimum": 0, + "maximum": 2550000 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "High pressure alarm threshold in Pa", + "version": { + "first": 111, + "last": 120 + }, + "values": { + "default": 1600000, + "minimum": 0, + "maximum": 2550000 + } + } + ] + }, + "PressureHighDelay": { + "id": 29, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for high pressure alarm in seconds", + "version": { + "first": 88, + "last": 110 + }, + "values": { + "default": 300, + "minimum": 0, + "maximum": 10800 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for high pressure alarm in seconds", + "version": { + "first": 111, + "last": 118 + }, + "values": { + "default": 300, + "minimum": 0, + "maximum": 10800 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for high pressure alarm in seconds", + "version": { + "first": 119, + "last": 120 + }, + "values": { + "default": 600, + "minimum": 0, + "maximum": 10800 + } + } + ] + }, + "PressureLowThreshold": { + "id": 30, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Low pressure alarm threshold in Pa", + "version": { + "first": 88, + "last": 110 + }, + "values": { + "default": 30000, + "minimum": 0, + "maximum": 2550000 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Low pressure alarm threshold in Pa", + "version": { + "first": 111, + "last": 120 + }, + "values": { + "default": 30000, + "minimum": 0, + "maximum": 2550000 + } + } + ] + }, + "PressureLowDelay": { + "id": 31, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for low pressure alarm in seconds", + "version": { + "first": 88, + "last": 110 + }, + "values": { + "default": 300, + "minimum": 0, + "maximum": 10800 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for low pressure alarm in seconds", + "version": { + "first": 111, + "last": 118 + }, + "values": { + "default": 300, + "minimum": 0, + "maximum": 10800 + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for low pressure alarm in seconds", + "version": { + "first": 119, + "last": 120 + }, + "values": { + "default": 600, + "minimum": 0, + "maximum": 10800 + } + } + ] + }, + "StoreConfiguration": { + "id": 32, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Store all configuration items in non-volatile memory.", + "version": { + "first": 88, + "last": 120 + } + } + ] + } + } + }, + "FUNCTEST": { + "id": 10, + "version": { + "first": null, + "last": null + }, + "registers": { + "GP30Test": { + "id": 0, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "LCDTest": { + "id": 1, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "Iloop": { + "id": 2, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "Pulse": { + "id": 3, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "Pressure": { + "id": 4, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "BatteryVoltage": { + "id": 5, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "SupplyVoltage": { + "id": 6, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "Temperature": { + "id": 7, + "details": [ + { + "type": "int16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "RFID": { + "id": 8, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "OpticalOutput": { + "id": 9, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "Radio": { + "id": 10, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "MultiTest": { + "id": 11, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "NFCUID": { + "id": 12, + "details": [ + { + "type": "uint64_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "CPUTest": { + "id": 13, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + } + } + }, + "OPTICALPORT": { + "id": 5, + "version": { + "first": 1, + "last": 55 + }, + "registers": { + "BaudRateCapabilities": { + "id": 0, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Bitmask of supported rates on the given hardware.", + "version": { + "first": 2, + "last": 55 + } + } + ] + }, + "PacketSizeCapabilities": { + "id": 1, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Bitmask of supported packet sizes.", + "version": { + "first": 2, + "last": 55 + }, + "values": { + "default": 64 + } + } + ] + }, + "ProtocolVersion": { + "id": 2, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Version number as fixed point 16.16 format BCD.", + "version": { + "first": 2, + "last": 55 + } + } + ] + }, + "BaudRateSelected": { + "id": 3, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Baud rate in bits per second.", + "version": { + "first": 2, + "last": 55 + } + } + ] + }, + "PacketSizeSelected": { + "id": 4, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Packet size in bytes.", + "version": { + "first": 2, + "last": 55 + } + } + ] + }, + "ExternalUartControl": { + "id": 5, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "WO", + "lvl2": "WO", + "lvl3": "WO", + "lvl4": "WO", + "lvl5": "WO", + "lvl6": "WO", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Surrenders the UART to another application", + "version": { + "first": 49, + "last": 55 + } + } + ] + } + } + }, + "SENSUSRADIO": { + "id": 16, + "version": { + "first": null, + "last": null + }, + "registers": { + "TxInterval": { + "id": 0, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "OmTxInterval": { + "id": 1, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "LatInterval": { + "id": 2, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "WakeupInterval": { + "id": 3, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "MbusState": { + "id": 4, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "FrequencyIndicator": { + "id": 5, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "FrequencyOffset": { + "id": 6, + "details": [ + { + "type": "int16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "PowerLevel": { + "id": 7, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "SystemState": { + "id": 9, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "RadioAddress": { + "id": 10, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "UtcTimeOffset": { + "id": 11, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "SentBytesCounter": { + "id": 12, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "ReceivedBytesCounter": { + "id": 13, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "ResetCounter": { + "id": 14, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "BootLoaderState": { + "id": 15, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "LeakFlowThreshold": { + "id": 16, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "LeakFlowTimeThreshold": { + "id": 17, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "BrokenPipeFlowThreshold": { + "id": 18, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "BrokenPipeFlowTimeThreshold": { + "id": 19, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "PressureMaxThreshold": { + "id": 20, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "PressureMinThreshold": { + "id": 21, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "PressureLimitTimeMaxThreshold": { + "id": 22, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "PressureLimitTimeMinThreshold": { + "id": 23, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "PressureMeasurePeriod": { + "id": 24, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "PressureUnit": { + "id": 25, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "PressureGaugeOffset": { + "id": 26, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "TemperatureMaxThreshold": { + "id": 27, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "TemperatureMinThreshold": { + "id": 28, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "TemperatureTimeMaxThreshold": { + "id": 29, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "TemperatureTimeMinThreshold": { + "id": 30, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "TemperatureMeasurePeriod": { + "id": 31, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "TemperatureUnit": { + "id": 32, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "PulseOutWidth": { + "id": 33, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "PulseOutDivisor": { + "id": 34, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "PulseOutMode": { + "id": 35, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "CurrentLoopMax": { + "id": 36, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "CurrentLoopSource": { + "id": 37, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "MainAlarmMask": { + "id": 38, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "ExtendedAlarmMask": { + "id": 39, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "HistoricalAlarmsDays": { + "id": 40, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "TestModeTime": { + "id": 43, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "EncryptionKey": { + "id": 44, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "Authentification": { + "id": 45, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "UpgFWVersion": { + "id": 46, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "CustomerText": { + "id": 47, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "RadioLastReadTime": { + "id": 48, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "LowBatDateTime": { + "id": 49, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "VeryLowBatDateTime": { + "id": 50, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "Unit": { + "id": 51, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "ExtendedUnitFlags": { + "id": 52, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "OTAControlFlags": { + "id": 53, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "DataLogContents": { + "id": 56, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "DataLogPeriod": { + "id": 57, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "AverageFlowPeriod": { + "id": 58, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "FixedDateReadingContents": { + "id": 59, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "FixedDateDayOfMonth": { + "id": 60, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "MetroRadioLifeTimeCounter": { + "id": 61, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "PowerLevelOption": { + "id": 62, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "ImpedanceCodeNew": { + "id": 63, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "ImpedanceCodeOption": { + "id": 64, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "IrDAModulePresent": { + "id": 65, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "StoreConfiguration": { + "id": 66, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "LifeTimeSeconds": { + "id": 67, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + } + } + }, + "CONFIGEXCHANGE": { + "id": 4, + "version": { + "first": 3, + "last": 191 + }, + "errors": { + "error": { + "name": "LockedOut", + "code": "0x00", + "description": "happens when....", + "action": "eg. Retry,Log,Display,Logon" + }, + "error": { + "name": "AuthenticationFail", + "code": "0x01", + "description": "happens when....", + "action": "eg. Retry,Log,Display,Logon" + }, + "error": { + "name": "AccessDenied", + "code": "0x02", + "description": "happens when....", + "action": "eg. Retry,Log,Display,Logon" + } + }, + "registers": { + "Privilege": { + "id": 0, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Written to set the login level, followed by the password. Note, this can be read at any login level including 0.", + "version": { + "first": 3, + "last": 191 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 8 + } + } + ] + }, + "Password": { + "id": 1, + "details": [ + { + "type": "uint96_t", + "privilege": { + "lvl1": "WO", + "lvl2": "WO", + "lvl3": "WO", + "lvl4": "WO", + "lvl5": "WO", + "lvl6": "WO", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Password for logging in, requires 3 consecutive writes", + "version": { + "first": 3, + "last": 191 + } + } + ] + }, + "FOpen": { + "id": 2, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this to open a file on the meter, handle returned", + "version": { + "first": 20, + "last": 191 + } + } + ] + }, + "FClose": { + "id": 3, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this to close a file on the meter", + "version": { + "first": 20, + "last": 191 + } + } + ] + }, + "FRead": { + "id": 4, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this to read bytes from an open file", + "version": { + "first": 20, + "last": 191 + } + } + ] + }, + "FWrite": { + "id": 5, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this to write bytes to an open file", + "version": { + "first": 20, + "last": 191 + } + } + ] + }, + "FSeek": { + "id": 6, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this to seek within an open file", + "version": { + "first": 20, + "last": 191 + } + } + ] + }, + "FTell": { + "id": 7, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this to determine position within an open file", + "version": { + "first": 20, + "last": 191 + } + } + ] + }, + "Remove": { + "id": 8, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this to delete a file", + "version": { + "first": 20, + "last": 191 + } + } + ] + }, + "FEOF": { + "id": 9, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this determine whether the current position in an open file is the end of the file", + "version": { + "first": 20, + "last": 191 + } + } + ] + }, + "Catalogue": { + "id": 10, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Returns a list of files in the filesystem that matches a string containing wildcards passed in", + "version": { + "first": 49, + "last": 191 + } + } + ] + }, + "PCBSerialNumber": { + "id": 12, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "String containing the PCB serial number. Note, this can be read at any login level including 0", + "version": { + "first": 59, + "last": 191 + } + } + ] + }, + "ConfigAccessRights": { + "id": 13, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bitmask of login levels permitted to manipulate dangerous files", + "version": { + "first": 59, + "last": 191 + } + } + ] + }, + "FFlush": { + "id": 14, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this to flush write buffers to an open file", + "version": { + "first": 66, + "last": 191 + } + } + ] + } + } + }, + "NFC": { + "id": 21, + "version": { + "first": 1, + "last": 16 + }, + "registers": { + "EraseRMA": { + "id": 0, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RW" + }, + "description": "Writing TRUE to this register erases the RMA area", + "version": { + "first": 7, + "last": 16 + } + } + ] + } + } + }, + "SYSTEM": { + "id": 0, + "version": { + "first": 141, + "last": 439 + }, + "registers": { + "TriggerUpgrade": { + "id": 0, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Writing TRUE to this register internally calls SysTriggerUpgrade() then returns the result.", + "version": { + "first": 141, + "last": 439 + } + } + ] + }, + "CheckPresence": { + "id": 1, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Writing an application id number allows the version number of that application to be read back.", + "version": { + "first": 150, + "last": 439 + } + } + ] + }, + "PCBSerialNumber": { + "id": 2, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "A string reporting the PCB serial number, this string must be set using production equipment.", + "version": { + "first": 169, + "last": 439 + }, + "values": { + "default": "" + } + } + ] + }, + "CustomerSerialNumber0": { + "id": 3, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A string reported relating to the customer, this string can be written only once after manufacture. If subsequent changes are needed CUSTOMERSERIALNUMBER1 must be used.", + "version": { + "first": 170, + "last": 439 + }, + "values": { + "default": "" + } + } + ] + }, + "CustomerSerialNumber1": { + "id": 4, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A string reported relating to the customer, this string can be written only once after manufacture. If subsequent changes are needed CUSTOMERSERIALNUMBER2 must be used.", + "version": { + "first": 170, + "last": 439 + }, + "values": { + "default": "" + } + } + ] + }, + "CustomerSerialNumber2": { + "id": 5, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A string reported relating to the customer, this string can be written only once after manufacture. If subsequent changes are needed CUSTOMERSERIALNUMBER3 must be used.", + "version": { + "first": 170, + "last": 439 + }, + "values": { + "default": "" + } + } + ] + }, + "CustomerSerialNumber3": { + "id": 6, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A string reported relating to the customer, this string can be written only once after manufacture. This is the last customer serial number change slot.", + "version": { + "first": 170, + "last": 439 + }, + "values": { + "default": "" + } + } + ] + }, + "MonotonicSeconds": { + "id": 7, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "The number of seconds since reboot.", + "version": { + "first": 176, + "last": 439 + } + } + ] + }, + "CalendarSeconds": { + "id": 8, + "details": [ + { + "type": "time_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of seconds since 01-Jan-2000.", + "version": { + "first": 176, + "last": 439 + } + } + ] + }, + "CoreRevision": { + "id": 9, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "A string reporting the product version string held in the system core binary.", + "version": { + "first": 196, + "last": 439 + } + } + ] + }, + "DriveCapacity": { + "id": 10, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Writing a drive number returns the drive capacity in bytes, or 0 if the drive is not ready, or an error if the driver is not configured to be present.", + "version": { + "first": 233, + "last": 439 + } + } + ] + }, + "ExitReason": { + "id": 11, + "details": [ + { + "type": "status_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Writing an application id number allows the exit error number of that application to be read back.", + "version": { + "first": 258, + "last": 439 + } + } + ] + }, + "CorePlatform": { + "id": 12, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Reports the instruction set of the hosting microprocessor in b8-15 and allocated platform number in b0-7.", + "version": { + "first": 265, + "last": 439 + } + } + ] + }, + "CRC": { + "id": 13, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Writing an application id number allows the CRC of that application to be read back.", + "version": { + "first": 279, + "last": 439 + } + } + ] + } + } + }, + "METROLOGYASST": { + "id": 18, + "version": { + "first": 4, + "last": 68 + }, + "registers": { + "ILoopMaxFlowRate": { + "id": 0, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The flow rate that gives max output on the current loop", + "version": { + "first": 5, + "last": 36 + } + } + ] + }, + "StoreConfiguration": { + "id": 1, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Writing TRUE to this register stores the values of the other registers to the non-volatile memory", + "version": { + "first": 7, + "last": 68 + } + } + ] + }, + "PulseWeight": { + "id": 2, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Volume represented by one pulse in ml. If this is zero pulse output will not be enabled", + "version": { + "first": 7, + "last": 68 + }, + "values": { + "default": 1000, + "minimum": 1, + "maximum": 4294967295 + } + } + ] + }, + "PulseMode": { + "id": 3, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The way pulses are output on the two available channels. This is an enum of type pulse_mode_t.", + "version": { + "first": 7, + "last": 68 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 6 + } + } + ] + }, + "PulseLength": { + "id": 4, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The length of a pulse. This is an enum of type pulse_length_t.", + "version": { + "first": 7, + "last": 68 + }, + "values": { + "default": 5, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "FlowUnits": { + "id": 5, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The units of flow rate to display on the LCD. An enum of type displayflowunits_t", + "version": { + "first": 8, + "last": 68 + }, + "values": { + "default": 4, + "minimum": 0, + "maximum": 8 + } + } + ] + }, + "FlowPoint": { + "id": 6, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Position of the decimal point on the LCD for flow rate. An enum of type displayflowpoint_t", + "version": { + "first": 8, + "last": 68 + }, + "values": { + "default": 2, + "minimum": 0, + "maximum": 4 + } + } + ] + }, + "ILoopRate": { + "id": 7, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The update rate for the current loop", + "version": { + "first": 9, + "last": 36 + } + } + ] + }, + "TemperatureUnits": { + "id": 8, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Units for displaying temperature on the LCD. 0 – Celcius, 1 – Fahrenheit.", + "version": { + "first": 13, + "last": 68 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + } + } + ] + }, + "PressureUnits": { + "id": 9, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Units for displaying pressure on the LCD. 0 – Mpa, 1 – PSI.", + "version": { + "first": 13, + "last": 68 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + } + } + ] + }, + "PressureRate": { + "id": 10, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time between pressure measurements in milliseconds", + "version": { + "first": 13, + "last": 68 + }, + "values": { + "default": 300000, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "PressureOffset": { + "id": 11, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Value in Pa to subtract from measured value to correct for atmospheric pressure", + "version": { + "first": 13, + "last": 58 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Value in Pa to subtract from measured value to correct for atmospheric pressure", + "version": { + "first": 59, + "last": 68 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + } + } + ] + }, + "PressurePresent": { + "id": 12, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Whether there is a pressure sensor present", + "version": { + "first": 63, + "last": 68 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 1 + } + } + ] + }, + "PressureMeasure": { + "id": 13, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write TRUE to trigger a pressure measurement, Read to get the latest measured value in Pa", + "version": { + "first": 65, + "last": 68 + } + } + ] + } + } + }, + "LOGGER": { + "id": 8, + "version": { + "first": 1, + "last": 15 + }, + "registers": { + "Quota": { + "id": 0, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A quota in bytes for the log. The Logger does not apply any policy to how the quota is allocated, this is left as a restriction to be applied on a product by product basis.", + "version": { + "first": 1, + "last": 15 + }, + "values": { + "default": 4096, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "Drive": { + "id": 1, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The drive to write to.", + "version": { + "first": 1, + "last": 15 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "TriggerLogFlush": { + "id": 2, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Writing TRUE will force a log flush", + "version": { + "first": 7, + "last": 15 + } + } + ] + } + } + }, + "TESTMANAGER": { + "id": 98, + "version": { + "first": null, + "last": null + }, + "registers": { + "OutputFile": { + "id": 0, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "TestNumber": { + "id": 1, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "TestStatus": { + "id": 2, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "TrapError": { + "id": 3, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "TestParameter": { + "id": 4, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + } + } + }, + "PERIODICLOG": { + "id": 17, + "version": { + "first": null, + "last": null + }, + "registers": { + "DataLogContents": { + "id": 0, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "DataLogPeriod": { + "id": 1, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "AverageFlowPeriod": { + "id": 2, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "FixedDateReadingContents": { + "id": 3, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "FixedDateDayOfMonth": { + "id": 4, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "PeriodicLogLifeTimeCounter": { + "id": 5, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + }, + "ResetCounter": { + "id": 6, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Lorem ipsum", + "version": { + "first": null, + "last": null + } + } + ] + } + } + }, + "POWERMON": { + "id": 1, + "version": { + "first": 17, + "last": 58 + }, + "registers": { + "BatteryVoltage": { + "id": 0, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Measured battery terminal voltage in 1mV units.", + "version": { + "first": 17, + "last": 58 + } + } + ] + }, + "BatteryManufacturer": { + "id": 1, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "String describing the battery brand.", + "version": { + "first": 17, + "last": 58 + }, + "values": { + "default": "Tadiran" + } + } + ] + }, + "BatterySize": { + "id": 2, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "One of: 0 = battery absent; 1 = built in; 2 = other; 3 = AA; 4 = AAA; 5 = C; 6 = D; 255 = unknown", + "version": { + "first": 17, + "last": 58 + }, + "values": { + "default": 6, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "BatteryQuantity": { + "id": 4, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "The number of installed batteries.", + "version": { + "first": 17, + "last": 58 + }, + "values": { + "default": 1 + } + } + ] + }, + "BatteryRatedVoltage": { + "id": 5, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Datasheet terminal voltage in 100mV units as manufactured.", + "version": { + "first": 17, + "last": 58 + }, + "values": { + "default": 36, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "BatteryVoltageMinThreshold": { + "id": 7, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Datasheet terminal voltage in 100mV units below which the cell is considered empty.", + "version": { + "first": 17, + "last": 58 + }, + "values": { + "default": 28, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "BatterySelection": { + "id": 8, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Chosen manufacturer from the internal lookup table of known batteries.", + "version": { + "first": 20, + "last": 58 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + } + } + ] + }, + "TotalUsedCharge": { + "id": 9, + "details": [ + { + "type": "uint64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Accumulated charge used in uAs.", + "version": { + "first": 24, + "last": 58 + } + } + ] + }, + "TotalUsedSeconds": { + "id": 10, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Elapsed time since manufacture in seconds.", + "version": { + "first": 39, + "last": 58 + } + } + ] + }, + "WarnFromClamp": { + "id": 11, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time in seconds for which the projected end time cannot exceed.", + "version": { + "first": 39, + "last": 58 + }, + "values": { + "default": 473040000, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "BatteryMilliAHrRating": { + "id": 12, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Datasheet capacity in mAh units as manufactured.", + "version": { + "first": 45, + "last": 58 + }, + "values": { + "default": 19000, + "minimum": 0, + "maximum": 65535 + } + } + ] + } + } + }, + "GENESISFLOW": { + "id": 15, + "version": { + "first": 7, + "last": 246 + }, + "registers": { + "SampleRate": { + "id": 0, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The rate in Hz that each GP30 takes measurements", + "version": { + "first": 7, + "last": 203 + }, + "values": { + "default": 6, + "minimum": 0, + "maximum": 255 + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The rate in Hz that each GP30 takes measurements", + "version": { + "first": 204, + "last": 246 + }, + "values": { + "default": 2, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "FirstHitLvlUp1": { + "id": 1, + "details": [ + { + "type": "int8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 1, units of 0.88mV", + "version": { + "first": 7, + "last": 246 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + } + } + ] + }, + "FirstHitLvlUp2": { + "id": 2, + "details": [ + { + "type": "int8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 2, units of 0.88mV", + "version": { + "first": 7, + "last": 246 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + } + } + ] + }, + "FirstHitLvlUp3": { + "id": 3, + "details": [ + { + "type": "int8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 3, units of 0.88mV", + "version": { + "first": 7, + "last": 246 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + } + } + ] + }, + "FirstHitLvlDown1": { + "id": 4, + "details": [ + { + "type": "int8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 1, units of 0.88mV", + "version": { + "first": 7, + "last": 246 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + } + } + ] + }, + "FirstHitLvlDown2": { + "id": 5, + "details": [ + { + "type": "int8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 2, units of 0.88mV", + "version": { + "first": 7, + "last": 246 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + } + } + ] + }, + "FirstHitLvlDown3": { + "id": 6, + "details": [ + { + "type": "int8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 3, units of 0.88mV", + "version": { + "first": 7, + "last": 246 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + } + } + ] + }, + "StartHit": { + "id": 7, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The hit number to consider as the first hit", + "version": { + "first": 7, + "last": 246 + }, + "values": { + "default": 6, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "AmplitudePeakDetectEnd": { + "id": 8, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Where to stop running the amplitude peak detection", + "version": { + "first": 7, + "last": 246 + }, + "values": { + "default": 19, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "NumFirePulses": { + "id": 9, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of pulses to fire for a measurement", + "version": { + "first": 7, + "last": 246 + }, + "values": { + "default": 17, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "DisplayPow10": { + "id": 10, + "details": [ + { + "type": "int8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The weight of the lowest display digit as a power of 10. The accepted range of values depends on the LCD present and the DisplayUnits chosen", + "version": { + "first": 36, + "last": 246 + }, + "values": { + "default": -6, + "minimum": -128, + "maximum": 127 + } + } + ] + }, + "DisplayUnits": { + "id": 11, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The units of volume to display. The accepted range of values depends on the LCD present and the DisplayPow10 chosen", + "version": { + "first": 36, + "last": 246 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 6 + } + } + ] + }, + "MeterSize": { + "id": 12, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The meter pipe size", + "version": { + "first": 45, + "last": 246 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 9 + } + } + ] + }, + "CalFactor1": { + "id": 13, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 1", + "version": { + "first": 45, + "last": 200 + }, + "values": { + "default": 62500, + "minimum": 0, + "maximum": 65535 + } + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 1", + "version": { + "first": 201, + "last": 246 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + } + } + ] + }, + "CalFactor2": { + "id": 14, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 2", + "version": { + "first": 45, + "last": 200 + }, + "values": { + "default": 62500, + "minimum": 0, + "maximum": 65535 + } + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 2", + "version": { + "first": 201, + "last": 246 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + } + } + ] + }, + "CalFactor3": { + "id": 15, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 3", + "version": { + "first": 45, + "last": 200 + }, + "values": { + "default": 62500, + "minimum": 0, + "maximum": 65535 + } + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 3", + "version": { + "first": 201, + "last": 246 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + } + } + ] + }, + "ZeroOffset1": { + "id": 16, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 1 at zero flow. Value is in usual time of flight scaling (ie LS bit is 2^-38 seconds)", + "version": { + "first": 45, + "last": 132 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + } + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 1 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 133, + "last": 246 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + } + } + ] + }, + "ZeroOffset2": { + "id": 17, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 2 at zero flow. Value is in usual time of flight scaling (ie LS bit is 2^-38 seconds)", + "version": { + "first": 45, + "last": 132 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + } + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 2 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 133, + "last": 246 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + } + } + ] + }, + "ZeroOffset3": { + "id": 18, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 3 at zero flow. Value is in usual time of flight scaling (ie LS bit is 2^-38 seconds)", + "version": { + "first": 45, + "last": 132 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + } + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 3 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 133, + "last": 246 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + } + } + ] + }, + "ScaledBilling": { + "id": 19, + "details": [ + { + "type": "int64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "The scaled volume value shown on the display. In the units and precision set by DisplayUnits and DisplayPow10 respectively. Decimal point is not represented in this value", + "version": { + "first": 47, + "last": 246 + } + } + ] + }, + "ResetAccumulators": { + "id": 20, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "WO", + "lvl2": "WO", + "lvl3": "WO", + "lvl4": "WO", + "lvl5": "WO", + "lvl6": "WO", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write 1 to reset all accumulated volume to zero", + "version": { + "first": 47, + "last": 246 + } + } + ] + }, + "ForwardArrow": { + "id": 21, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The forward flow direction. 0 - undecided, 1 - right, 2 - left", + "version": { + "first": 47, + "last": 246 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 2 + } + } + ] + }, + "LedMode": { + "id": 22, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The type of data output by the green LED", + "version": { + "first": 47, + "last": 203 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 6 + } + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The type of data output by the green LED", + "version": { + "first": 204, + "last": 246 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 6 + } + } + ] + }, + "StoreCalibration": { + "id": 23, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store calibration values to non-volatile storage. Read back for status", + "version": { + "first": 54, + "last": 246 + } + } + ] + }, + "UnscaledFwd": { + "id": 24, + "details": [ + { + "type": "uint64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The forward flow accumulator volume. The scale depends on the meter size", + "version": { + "first": 54, + "last": 246 + } + } + ] + }, + "UnscaledRev": { + "id": 25, + "details": [ + { + "type": "uint64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The reverse flow accumulator volume. The scale depends on the meter size", + "version": { + "first": 54, + "last": 246 + } + } + ] + }, + "LowFlowThreshold": { + "id": 26, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The volume that must pass in LowFlowMaxPeriod for it to be registered as real flow. Units of ml", + "version": { + "first": 55, + "last": 246 + }, + "values": { + "default": 200, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "LowFlowMaxPeriod": { + "id": 27, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The time during which LowFlowThreshold volume must pass for it to be registered as real flow. Units of seconds << 16", + "version": { + "first": 55, + "last": 246 + }, + "values": { + "default": 3932160, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "UpdateThreshold": { + "id": 28, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The amount of flow in ml to accumulate before updating the main scaled accumulators.", + "version": { + "first": 55, + "last": 246 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "ArrowThreshold": { + "id": 29, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The net volume in ml that must flow in one direction for the forward arrow to be set", + "version": { + "first": 55, + "last": 246 + }, + "values": { + "default": 5000000, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "FireBuffer1": { + "id": 30, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 1 to be used", + "version": { + "first": 64, + "last": 246 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "FireBuffer2": { + "id": 31, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 2 to be used", + "version": { + "first": 64, + "last": 246 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "FireBuffer3": { + "id": 32, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 3 to be used", + "version": { + "first": 64, + "last": 246 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "TriggerActive": { + "id": 33, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "WO", + "lvl2": "WO", + "lvl3": "WO", + "lvl4": "WO", + "lvl5": "WO", + "lvl6": "WO", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write 1 to put GenesisFlow in Active mode. This is the normal measurement mode", + "version": { + "first": 75, + "last": 246 + } + } + ] + }, + "TriggerIdle": { + "id": 34, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 0 to put GenesisFlow in Active mode, otherwise put GenesisFlow in Idle mode. Idle mode displays just the number written to TriggerIdle. No measurements are performed. Read returns the number written", + "version": { + "first": 75, + "last": 246 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 65535 + } + + } + ] + }, + "MaxValidDeltaToF": { + "id": 35, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum delta time of flight, above this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 87, + "last": 246 + }, + "values": { + "default": 247390, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "MaxValidToF": { + "id": 36, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum absolute time of flight, above this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 87, + "last": 246 + }, + "values": { + "default": 24739011, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "MinValidToF": { + "id": 37, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The minimum absolute time of flight, below this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 87, + "last": 246 + }, + "values": { + "default": 13743895, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "FirstHitPercent1": { + "id": 38, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 1", + "version": { + "first": 93, + "last": 246 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "FirstHitPercent2": { + "id": 39, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 2", + "version": { + "first": 93, + "last": 246 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "FirstHitPercent3": { + "id": 40, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 3", + "version": { + "first": 93, + "last": 246 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "FirstHitShift": { + "id": 41, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A value describing how long the amplitude is averaged over for calculating the first hit level. This is the amount each amplitude value is shifted down before being added to the moving average", + "version": { + "first": 93, + "last": 246 + }, + "values": { + "default": 4, + "minimum": 3, + "maximum": 8 + } + } + ] + }, + "FirstHitMinimum": { + "id": 42, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Minimum absolute first hit level value", + "version": { + "first": 93, + "last": 246 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "ToFErrorLimit": { + "id": 43, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of ToF errors to allow before resetting the first hit levels to FirstHitMinimum", + "version": { + "first": 93, + "last": 246 + }, + "values": { + "default": 16, + "minimum": 1, + "maximum": 4294967295 + } + } + ] + }, + "FirstHitUpdatePeriod": { + "id": 44, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The period (in seconds) between first hit level updates", + "version": { + "first": 99, + "last": 246 + }, + "values": { + "default": 10, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "PipeFillingDelay": { + "id": 45, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The time (in seconds) to maintain zero flow after leaving empty pipe", + "version": { + "first": 119, + "last": 246 + }, + "values": { + "default": 30, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "ToFTempOffset1": { + "id": 46, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 1. In units of 2^-38 seconds", + "version": { + "first": 124, + "last": 246 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + } + } + ] + }, + "ToFTempOffset2": { + "id": 47, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 2. In units of 2^-38 seconds", + "version": { + "first": 124, + "last": 246 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + } + } + ] + }, + "ToFTempOffset3": { + "id": 48, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 3. In units of 2^-38 seconds", + "version": { + "first": 124, + "last": 246 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + } + } + ] + }, + "ToFTempCalibrate": { + "id": 49, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "WO", + "lvl2": "WO", + "lvl3": "WO", + "lvl4": "WO", + "lvl5": "WO", + "lvl6": "WO", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write the current temperature to this register to trigger a calibration step. In units of 2^-12 degrees celcius", + "version": { + "first": 124, + "last": 204 + }, + "values": { + "minimum": 0, + "maximum": 270336 + } + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "WO", + "lvl2": "WO", + "lvl3": "WO", + "lvl4": "WO", + "lvl5": "WO", + "lvl6": "WO", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write the current temperature to this register to trigger a calibration step. In units of 2^-12 degrees celcius", + "version": { + "first": 205, + "last": 246 + }, + "values": { + "minimum": 0, + "maximum": 286720 + } + } + ] + }, + "StoreConfiguration": { + "id": 50, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store configuration values to non-volatile storage. Read back for status", + "version": { + "first": 141, + "last": 246 + } + } + ] + }, + "SealDisplay": { + "id": 51, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to stop various display related registers being changed. Read back 1 for 'sealed' 0 for 'unsealed'", + "version": { + "first": 161, + "last": 246 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + } + } + ] + }, + "TriggerTest": { + "id": 52, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to put GenesisFlow in Test mode. This differs from normal measurement mode in that the volume is presented to 3 extra decimal places if possible. Read back 1 for Test mode, 0 otherwise", + "version": { + "first": 162, + "last": 246 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + } + } + ] + }, + "MaxValidAmplitude": { + "id": 53, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Maximum amplitude for a valid signal in 2^-22mV units", + "version": { + "first": 168, + "last": 246 + }, + "values": { + "default": 2936012800, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "MinValidAmplitude": { + "id": 54, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Minimum amplitude for a valid signal in 2^-22mV units", + "version": { + "first": 168, + "last": 246 + }, + "values": { + "default": 209715200, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + }, + "HardErrorLimit": { + "id": 55, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Number of hard errors to allow before declaring a fatal error", + "version": { + "first": 176, + "last": 246 + }, + "values": { + "default": 4, + "minimum": 0, + "maximum": 65535 + } + } + ] + } + } + }, + "IRDA": { + "id": 20, + "version": { + "first": 10, + "last": 72 + }, + "registers": { + "PulseReportRate": { + "id": 0, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The rate at which pulse reports are sent to the IrDA pulse adapter", + "version": { + "first": 10, + "last": 72 + }, + "values": { + "default": 255, + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "AdapterPresenceLimit": { + "id": 1, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of 15 minute periods we have to have received no valid IrDA messages to assume there is no adapter present", + "version": { + "first": 18, + "last": 72 + }, + "values": { + "default": 1, + "minimum": 1, + "maximum": 255 + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of 15 minute periods we have to have received no valid IrDA messages to assume there is no adapter present", + "version": { + "first": 29, + "last": 29 + }, + "values": { + "default": 3, + "minimum": 1, + "maximum": 255 + } + } + ] + }, + "PulseSequence": { + "id": 2, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The present sequence number used in pulse reports", + "version": { + "first": 26, + "last": 72 + }, + "values": { + "minimum": 0, + "maximum": 255 + } + } + ] + }, + "StoreConfiguration": { + "id": 3, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store configuration values to non-volatile storage. Read back for status", + "version": { + "first": 26, + "last": 72 + } + } + ] + }, + "AMRDigits": { + "id": 4, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of digits to use for AMR", + "version": { + "first": 40, + "last": 72 + }, + "values": { + "default": 9, + "minimum": 0, + "maximum": 9 + } + } + ] + }, + "AMROffset": { + "id": 5, + "details": [ + { + "type": "int8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The offset of the AMR smallest digit from the right (always negative)", + "version": { + "first": 40, + "last": 72 + }, + "values": { + "default": 0, + "minimum": -9, + "maximum": 0 + } + } + ] + }, + "UI1203Fields": { + "id": 6, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A bitfield of the optional fields being used for UI-1203", + "version": { + "first": 40, + "last": 72 + }, + "values": { + "default": 268, + "minimum": 0, + "maximum": 268 + } + } + ] + }, + "MfgDate": { + "id": 7, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A timestamp of meter manufacture in seconds since 1/1/2000 00:00:00 UTC", + "version": { + "first": 43, + "last": 72 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + } + } + ] + } + } + } +} \ No newline at end of file diff --git a/ZeroFlowTool/frmStartup.Designer.cs b/ZeroFlowTool/frmStartup.Designer.cs new file mode 100644 index 00000000..6f8152b4 --- /dev/null +++ b/ZeroFlowTool/frmStartup.Designer.cs @@ -0,0 +1,90 @@ +namespace GenesisZeroFlow +{ + partial class frmStartup + { + /// + /// 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(frmStartup)); + this.btnZeroFlow = new System.Windows.Forms.Button(); + this.btnTempCalibration = new System.Windows.Forms.Button(); + this.labelSelectApplication = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // btnZeroFlow + // + this.btnZeroFlow.Location = new System.Drawing.Point(54, 72); + this.btnZeroFlow.Name = "btnZeroFlow"; + this.btnZeroFlow.Size = new System.Drawing.Size(186, 48); + this.btnZeroFlow.TabIndex = 0; + this.btnZeroFlow.Text = "ZeroFlow"; + this.btnZeroFlow.UseVisualStyleBackColor = true; + this.btnZeroFlow.Click += new System.EventHandler(this.btnZeroFlow_Click); + // + // btnTempCalibration + // + this.btnTempCalibration.Location = new System.Drawing.Point(54, 138); + this.btnTempCalibration.Name = "btnTempCalibration"; + this.btnTempCalibration.Size = new System.Drawing.Size(186, 48); + this.btnTempCalibration.TabIndex = 1; + this.btnTempCalibration.Text = "TempCalibration"; + this.btnTempCalibration.UseVisualStyleBackColor = true; + this.btnTempCalibration.Click += new System.EventHandler(this.btnTempCalibration_Click); + // + // labelSelectApplication + // + this.labelSelectApplication.AutoSize = true; + this.labelSelectApplication.Font = new System.Drawing.Font("Microsoft Sans Serif", 13.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelSelectApplication.Location = new System.Drawing.Point(36, 30); + this.labelSelectApplication.Name = "labelSelectApplication"; + this.labelSelectApplication.Size = new System.Drawing.Size(224, 29); + this.labelSelectApplication.TabIndex = 2; + this.labelSelectApplication.Text = "Select Application"; + // + // frmStartup + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Honeydew; + this.ClientSize = new System.Drawing.Size(282, 255); + this.Controls.Add(this.labelSelectApplication); + this.Controls.Add(this.btnTempCalibration); + this.Controls.Add(this.btnZeroFlow); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "frmStartup"; + this.Text = "SENSUS Hannover"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button btnZeroFlow; + private System.Windows.Forms.Button btnTempCalibration; + private System.Windows.Forms.Label labelSelectApplication; + } +} \ No newline at end of file diff --git a/ZeroFlowTool/frmStartup.cs b/ZeroFlowTool/frmStartup.cs new file mode 100644 index 00000000..b8097f9a --- /dev/null +++ b/ZeroFlowTool/frmStartup.cs @@ -0,0 +1,35 @@ +using System; +using System.Windows.Forms; + +namespace GenesisZeroFlow +{ + public partial class frmStartup : Form + { + public frmStartup() + { + InitializeComponent(); + + } + + private void btnZeroFlow_Click(object sender, EventArgs e) + { + var form = new GenesisZeroFlow(); + form.Show(); + form.Closed += Form_Closed; + this.Hide(); + } + + private void Form_Closed(object sender, EventArgs e) + { + Close(); + } + + private void btnTempCalibration_Click(object sender, EventArgs e) + { + var form = new frmTempCalibration(); + form.Show(); + form.Closed += Form_Closed; + this.Hide(); + } + } +} diff --git a/ZeroFlowTool/frmStartup.resx b/ZeroFlowTool/frmStartup.resx new file mode 100644 index 00000000..ca102474 --- /dev/null +++ b/ZeroFlowTool/frmStartup.resx @@ -0,0 +1,2718 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + AAABAAEA3OIAAAEAGACIXwIAFgAAACgAAADcAAAAxAEAAAEAGAAAAAAAAAAAAHgAAAB4AAAAAAAAAAAA + AAD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////+/vn4+/P6/vf7/vn4/vn5//v4/vv4/f35/f79/P79/P//+/// + +v//+f//+v//+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+//9/P77/f78/P78 + /P/+/P/+/P/+/P/+/P///f/8/f75+/z5/fz6//33/fn5/vv///////////////////////////////// + ///////////////////////////////+/vX4/O75/vT4/vXy/vT1//nz/vn0/vz2/v78+/7++///+f// + +P//9///+P//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v/8/P76/f77/P78 + /P/++//++//++//9+v79+/36+vzz9vj1+/r3//zw+/T1/vn///////////////////////////////// + ///////////////////////////////+/vb9/vP8//b5/vXz/vT0//jy/vnx/vrx//v2/vv2/vv6/fz7 + /fz9/fz7/fz4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv1/vny/vj0/vj0 + /vn2/vr3/vr4/vv3/fv3/fv4/fv0+/j2/fr4//zx+/X2/vr///////////////////////////////// + ///////////////////////////////+/fT7+/H9//f5/vXz/fP0//fx//jt/fbr/fXu/fXv/fX0+/f0 + +/f4+vf1+/bx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXt/fLr//Hs/vHt + /vLu/fPv/fTx/PXy/ff2//v3//v3/vr3/vr5//zy/Pf2/vv///////////////////////////////// + ///////////////////////////////+/Pf++vX+//j5/fXw/PHx//Xi9+ng+unj/u7j/uzj/uvj/unj + /unk/ujk/unj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urf/ufc/+Xd/uXd + /ubg/ujh/unk/uvh+ufc8uDf8uPf7uTw+fP4//v2+vr6/f7///////////////////////////////// + /////////////////////////////////vr//vr///n5/fbv/PDn++zH4c+hwqyXuqKVvJ+VvJ6VvpuV + vpuWvpqWvpuVvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2Rv5qOwZePwJiP + wJiTvpuTvpyWvJ6dv6SuyLKxxra6yb7c5t/0+/f1+fr5/P7///////////////////////////////// + /////////////////////////////////Pz++/r+/vv6/vny//Tl++q428GbyKaWyaKSzZ6RzZ2Pz5mP + 0JmP0ZaQ0JiRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuN0JiJ0paL0peL + 0ZeNz5mOz5qSzJ2UyZ6Wwp+Yu5+mvqrU49nz+/j7+/38+v7///////////////////////////////// + ////////////////////////////////+vz+9vb9+vf7/vnz//Xp/u673sSZyKSUyaCPzZyOzZuM0JaM + 0JWL0pOM0JWOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiK0JaH0pSI0ZWI + 0ZWK0JaKz5ePzZqTzJ2byqSbwaKmwavZ6d71/fn9/P78+v7///////////////////////////////// + ////////////////////////////////+v//+v7/+/j5//jw//Ls//K73cWUyKCQy52Jz5eH0JWF1I+E + 1I6D1oyE1I6H0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOE05GD1JGD1JGD + 1JGD1JGD05GI0ZOKz5WSzJ2Yx6GdwaXX6dz2//r9+/7/+/////////////////////////////////// + ////////////////////////////////+v//+f7/+vj5/vjw//Ls//K83cWUyKCQy52Jz5eH0JWE1I+D + 1I6D1oyE1I6H0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOF0pKF0pKE05GD + 05GC1JCC1JCF0pKI0JSQzZuWyKCcwqTW6dv1//n9+/7/+/////////////////////////////////// + ////////////////////////////////+v//+f7/+vn5/vnw//Lt//K93MaUyKCQy52Jz5eH0JWD1I+D + 1I6D1oyE1I6H0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0ZSI0ZWF0pKF + 05KB1I+B1I+D1JGF0pONz5mUyp6aw6LU6tr0//n9+/7/+/////////////////////////////////// + ////////////////////////////////+v//+f7/+vn6/vnx/vLu//O93MaWx6GRyZ6LzZiKzpeG0pGG + 0pCG1I+H0pGKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aMzpeNzZmKz5WJ + 0JSD05GD05CD1JGF0pOM0JiSy5yXxKDT6tny//f7/P39/P////////////////////////////////// + ////////////////////////////////+v//+f7/+vn6/vny/vPu//O+3MeXxqKTyaCNzZqLzpiI0ZOI + 0ZKI05GJ0ZOMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiOzJqRy5yNzpeM + z5aF0pKE05GD1JGF05KL0ZeRzJuWxZ/S6tjy//f6/P38/P////////////////////////////////// + ////////////////////////////////+///+v7/+vn6/vny/vPv//S/28iZxaSWx6KQy5yPzJuMzpaM + z5aM0JSNzpaPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uTyZ2Wx5+RypuP + y5qH0ZSG0ZOD1JGE05KJ0paQzZuVxp7Q69fw//b4/f37/f////////////////////////////////// + ////////////////////////////////+///+v7/+vn6/vny/vPv//TA28maxKWXx6ORy52PzJuOzpiO + zpeO0JWPzpeRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yVyJ6Yx6GSyp2R + y5yI0JWH0ZSD1JGE05KJ0paPzZqVxp7Q69fw//b4/f36/f////////////////////////////////// + ///////////////////////////////7/vz7/fz9+Pz9+v37+fv2/ffE28eUypuMz5WD1I6B1YyK0JOM + z5WWypySzJqKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aGz5eDzpmKz5aM + z5WQ0JGP0ZGJ0pGI0ZOG0ZmKzJ2MxqHN69nw//b8+v3++/////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////8/P38/Pz++Pv8+/v4+/jz/vXC3MaWyZ2QzZiJ0JOH0ZKMzpaO + zZeUyp2QzJmJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSE0JaB0JeF0ZWG + 0ZSH05CG05CD05GD0pOE0ZmJzJ2NxqHM69nt//f5+/37/P////////////////////////////////// + ////////////////////////////////+f//+f7/+vn6/vny//Lv//LA3MWbxqGYyJ+TyZ2Syp2Ry52R + y52Ry52NzZiI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GD0pOA0pZ805N8 + 1JN31o931o941pF61JOC0pmJzJ6PxaLJ6trp//nz/f72/f////////////////////////////////// + ////////////////////////////////+f//+P7/+fr6/fny//Hv//G/3cOZx5+WyZ2Ry5uQy5qOzJqO + zJqNzZqNzpiMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WJ0JWG0JWD0pOB + 0pJ91Y591Y591I+A05KI0ZiPy5yVxKDP6tnu//f4/P36/f////////////////////////////////// + ////////////////////////////////+f//+P7/+fv6/fry//Hu//C+3sKYyJ6Vy5yPzJmNzZiMzpiL + zpiKz5iMzpiRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmOzpaM0JWI0ZKH + 0pKD1I6D1I6D1I+F0pGN0JeUy5uaxJ/U6tj0//f9/P3//P////////////////////////////////// + ////////////////////////////////+P//9/7/+fv6/frw//Ht/++73sCVypyRzZmK0JWI0JSF0pKF + 0pKD0pKJz5aSyp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2TzJiTzpWP0JKO + 0JKJ046J046J046M0pCS0JWYy5mexZ3Z6tb5//T+/fr//vz///////////////////////////////// + ////////////////////////////////9///9/7/+fv5/frw//Hs/++73sCUy5uQzpiI0ZOG0pKD1JGC + 1JGB1JGH0JaTyp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+VzJmXzpWSz5KR + 0JKM0o6M046M046O0o+U0JSay5mfxZ3b6tX7//P+/vn//vv///////////////////////////////// + ////////////////////////////////9///9/7/+fv5/fnw/+/r/+2537+SzJmOzpaF0pKD05GA1Y5/ + 1Y1+1oyD0pGKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqPzJiTzZePz5SO + 0JKI0o+I046H1I6J04+P0pOUzZeZx5vT69Ty//L5/vf7/vn///////////////////////////////// + ////////////////////////////////9///9/7/+fz5/fnw/+/r/+2537+SzJmNzpaE0pGD05CA1Y5/ + 1Y1+1oyC05GJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmOzJiSzJiOzpSN + z5OH0o+H046G1I6I1I+O0pOTzZiYyJzS69Tw//H3//f5//j///////////////////////////////// + ////////////////////////////////9f/++P7++v36/fry//Hp/+q5376TyZqNypaGzpGEz5CA0I+A + 0I+A0Y5/0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y+EzZaJyZqFzJeE + zJZ+0JF90ZB50o5905GC05aGzpmRzqLF7tTh/+/s//jr//b///////////////////////////////// + ////////////////////////////////9f/++P79+Pn7/frz//Pp/+u53r6Wyp2SzJuL0JaJ0JWG0ZSG + 0ZSG0pSE05OB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKIzpqNy5+JzZyI + zpuB0pWA0pV91JN90pN7y5B/xZKKx5zC7NLi//Hs//ns/vj///////////////////////////////// + ////////////////////////////////+P/++f359/X7//rz//Tp/+y63b+Yxp+Vx52QyZqPyZqOypqO + ypqOypqKzJaD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGJyZyOxaSJyJ+I + yZ6BzZiAzZh+z5aC0pqI1J+Iy56PyaTF7Njj//Xr//vl+/X///////////////////////////////// + ////////////////////////////////+//++v35+PX7//rz//Pp/+u+3sKdxaOZxqCWx5+Vx5+Vx5+V + x6CWxqGTyJ2NzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiTxqGYwqiTxaOS + xqKLypyKy5uGzZqIzZuJy5uLxJyUxaTL6tnp/vby/vzv+/n///////////////////////////////// + /////////////////////////////////P/++/37+/f8//ny/vHq/uvK5M2py62jyKiiyKmiyKqjx6uj + xqulxa6jx6qgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWlxqypw7Gkxa2j + xqybyqWay6SVzqOWzaOXyqKdyKemya/X7N7x/vf7/f39/f////////////////////////////////// + ////////////////////////////////+vz+/P78/fj7//jw/fDs/e3b8d3R6tXT7NjT7NnT7NnW7NzW + 7NzY69/Y7N3a7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dvd7N7g6uDc69zb + 7NvT7dXS7tTN79HN79HM7s/T7tXU6NXr9O35+vn99/3+9/////////////////////////////////// + ///////////////////////////////79Pb++/z8/vf7//fv/e/t/O7o/Orp/e3t//Lu//Lv//Py//fy + //f0//r2//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n9//n///r7//b7 + //Xy/+/x/+7t/+vs/+rs/+ny/+7w+uz3+vb/9vr/9P7/9v////////////////////////////////// + ///////////////////////////////9/Pz+/v7+/v3+//37/vv7/vv6//v6//v6//z7//z7//z8//38 + //38//39//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3///3+//z+ + //z8//v7//v6//r7//r7//r8//v8/vv9/v3//f3//P7//f////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////9//79/v79/v39/v7+/v7+/f7+/f/+/f///f///f///f///f// + /f///f///f///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v7///7///7/ + //7//v7//v///v///f7//f7//f7//f7//v7//v///v///v////////////////////////////////// + ///////////////////////////////3//z1/vr1/Pn3/Pv6+/37+P399//++P//+P//9v//9v//9P// + 9P//8///9f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f/+/Pz+/vv+/vv/ + /vz/+/7/+/7/+v7/+f7/9v3/9vz/9/3/+v7/+/7++/3++/3///////////////////////////////// + ///////////////////////////////3/vv2/vv2/fr2/Pr4+vz7+v39+//++f/++P/+9///9///9f// + 9f//9P/+9v7++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f38/Pr7/ff8/fj8 + /fj++/v++/v/+vz++vz9+vz++/z++/39+/z9+fr8+Pj9+Pj///////////////////////////////// + ///////////////////////////////1+/n4//z4/vz2/Pr4+/z6/f77/v/7/P77+/78+/79+/79+v/9 + +v/9+v/8+/37/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr4/vb3//T3//X3 + //X6/vf7/vf9/fj8/Pf7+/f9/fn+/vr9/fn8/Pj8/Pn9/fr///////////////////////////////// + ///////////////////////////////1+Pj6/v75/f32+/r2/fv3/vzz/Pjz+/j0/Pnz/Pfz/Pfz+/jy + +/fy+/fx/Pbx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/vLx//Dx//Dx + //Dz/vLz/vL1/fL1/fP2/fT4/vb5//j6//j6//j7//j6//f///////////////////////////////// + ///////////////////////////////3+Pr8/v/6/f72+vv2/vvy/ffj8uji9Ojm+uzk++rj++nh++jh + /Ojf/Obg/Ofh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jk++fl++Xl++Xl + ++Xl++bl++bm++bm+ubk9uTi8+Ll9Obv++/2/vX4//b0/fL///////////////////////////////// + ///////////////////////////////8+v39/P74+/31+vr2//rs+/DP5NO21L2x0ris1bOr1rKl2a+l + 2a6i2q2k2a+o1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOs1rKv1bKu1rGu + 1rGs1rGs1rGt1bGv1rOx1LSuz7K6177X79nu/e/0//Xx/vL///////////////////////////////// + ///////////////////////////////++//++/72+fv0+fn2//ro+OzB2cWiw6mcwqSWxp6Vx52OypiN + ypeKzJaMypmRx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Wxp6axZ6YxZ2Y + xp2Wxp2Wxp2Wxp2Zx5+bxaCWvJumyKvN6dDr/O3z//Xt/e////////////////////////////////// + /////////////////////////////////P/9+/72+fv2/frx/vTt/vLA28abxaOXx6COzJmMzZiG0ZKF + 0pKC1I6F0pKKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiRy5qVypySy5qR + zJmPzZeOzZaOzZaQzZiTzJuVyJ2ZxaDP6tPs/u/y//Tz/vX///////////////////////////////// + /////////////////////////////////P/9+/72+vv3/vrw/vPu//PA3MeaxaKWyJ+NzZmLzpeE05GE + 05GA1o2E05GJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eQzJqUy5uRzJmQ + zZiNz5aNz5WNz5WOzpeSzZuVyp2YxZ/P6tTt//Dy//T0//b///////////////////////////////// + /////////////////////////////////f/9/P71+/n1/vnu/vPs//O+3MaYxqGVyZ+LzpeJ0JWD1JGC + 1JB+14yB1I6I0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZONzpeRzJqNzZiM + zpiH0ZOG0pKF05KH0pON0JeRzJuVxp7O69Xt//Pz//j2//n///////////////////////////////// + ///////////////////////////////+/f/8/P70/Pj0/vnt/vPs//O+3MaYxqGVyJ+MzpiKz5aD05GC + 1JB/1o2C1I+I0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKNzZeRy5qNzZiM + zpiG0ZOG0pKE05GG0pOM0JeRzJuVxp7P69bt//P0/vn3/vv///////////////////////////////// + ///////////////////////////////7/v/5/f7z/Pjz//js//Lr//K+3MaZxqKXyKCPzJqNzZiH0pOG + 0pKD1JGG0pGM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKOzZeRy5yNzZiM + zpiF0pKE05GB1JGD05KJ0ZePzJuVxZ/Q6tfw//b4/f36/f////////////////////////////////// + ///////////////////////////////7/v/5/v7z/Pjz//js//Ls//K+3MaaxaKXx6CQy5qOzJmI0ZSH + 0ZOE05GH0pGN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKPzZiRy5yNzZmM + zpiE0pKD05GB1JGD05KJ0ZePzJyVxaDR6tnw//f6/P38/f////////////////////////////////// + ///////////////////////////////7///5/v7z/Pjz//js//Ls//PA3MebxaOYx6GRy5uPzJmK0JaJ + 0JWH0pOK0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQzZiRy52NzZmM + zpmD0pKC05GB1JGD05KJ0ZeQy5yWxKHS6try//n8+/7/+/////////////////////////////////// + ///////////////////////////////7//36/vz5+fr5/Pv1+/fy/vXC3MeXyJ6RzJqI0JOH0ZGK0JSL + z5WQzZiOzpeM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSKzpiIzZqLzpeM + z5aL0ZGK0ZGG0pGG0pOH0ZiMzJ2QxaHP69nw//f8+/3/+/////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//r7/vr++fv++/z9+/n2/vbE3MaVy5mN0JOE1YyD1ouK0ZKM + 0JOXypyUypuPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmTyZ2WyJ+SypyQ + y5uMzZiLzpeK0JSMz5aRzZuWyZ+aw6LT6tnx//f6/P38/P////////////////////////////////// + ///////////////////////////////6//r7/vr++fv9+/z8+/n2//bD3MaVy5mN0JOE1YyC1ouJ0pKM + 0JOXypyUypuPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmTyZ2WyJ+SypyQ + y5uLzpeLzpeJ0JSLz5aQzZuVyZ6Zw6HT6tnx//b5/P38/f7///////////////////////////////// + ///////////////////////////////5//r5/vr7+fv8+/35+/v0//fC3MaSy5mK0ZOB1oyA1ouI0pKK + 0JSVyp2Ry5uMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiRy5yVyZ+Ry5uQ + zJqI0JWH0ZSH0pOI0ZSNz5mSy5yWxZ/Q6tfw//b2//v5//z///////////////////////////////// + ///////////////////////////////4//r4/vr6+fz7/P33+/vz//fA3MaRy5qI0ZOA1ox+1ouG0pKJ + 0JSTyp2Qy5uKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aPzJqTyp2PzJmN + zZiH0ZSG0ZOF0pKH0ZSM0JiRzJyVxp7P69bu//T1//n4//v///////////////////////////////// + ///////////////////////////////2//z2/vz3+vz4/P31+/vw//e+3MePy5uH0ZV91o181oyF0pOH + 0JWRyp+NzJuI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWMzpeQzJqLz5aK + 0JaF0pKE05GD1JGE05KJ0paOzZqTx53N69Tt//Lz//f2//n///////////////////////////////// + ///////////////////////////////1//z0/vz2+f33+/30+vzv/vi93MiOy5yF0ZV81o571o2D0pSG + 0JaQyZ+NzJuH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOLzpeOzJmKz5aI + 0JWE05GD05GB1I+D05GI0pWOzpmSx5zM69Pr//Dy//f1//n///////////////////////////////// + ///////////////////////////////0//30/v31+f72+/3z+vzu/vi93MmNy5yF0ZZ71o961o6D0pWF + 0JeQyaCMzJuH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOLz5aOzZmJ0JWI + 0ZWD05GC1JCB1Y+D1JCI05SNzpiRyJvL69Lr//Dx//b0//n///////////////////////////////// + ///////////////////////////////w+vn1/v75+/73+v70+f3s/fa52cWMyJuFzpZ704561I2Dz5SF + zpaPxp+LypqGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OKzZaOypiKzZWJ + zpSD0ZCC0pCB0o+C0pCGz5KOzpmXzKHM7dPo/+3z//f1//n///////////////////////////////// + ///////////////////////////////x+vr2/v/5+v/2+P71+f3u/fe828iPy5+I0Zl+1pF915CG0peI + 0JmSyaKOzJ2J0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paNz5iRzZuOz5iN + 0JeG05OF1JKE1ZKF1JOH0JSOzZqbz6XP7tXq/+/0//j2//r///////////////////////////////// + ///////////////////////////////5/P76/P/69P/79f78+P71/fnF3M2Sx56HypR+z4580IyFy5OH + yZWSw56OxZqJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSOx5eSxZqNx5eM + x5eFzJGFzJGDzZCHzpONzpmRyJubyKTQ7Nfu//P4/vz0+Pn///////////////////////////////// + ///////////////////////////////6/P/6/P758fz+9//++v/0/PfB2smTx56Ky5eB0JB/0Y+IzJaK + y5iVxKGRx52MypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeRyJqVxp2QyJqP + yJqIzZSIzZSGzpOK0JaRz5ySyJybx6TS69jw//X5/v309vj///////////////////////////////// + ///////////////////////////////9+P7/+v7/8f7/+P//+P/0+PXD1MWbx6GVzpyM05aL1JWSz5uV + zp2gx6WdyaSXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GbyaSex6abyqOZ + yqKUzZ+Tzp6Sz5uTzp2SxpyXwqCjxKra6+D2/vv9+v7/+v////////////////////////////////// + ///////////////////////////////89fz/+v//8v//9///9v/19/bM3M2eyKOTy5qK0JOI0ZGQzJiT + ypqexKKbxaGVyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+ZxaKcxKSYxqGX + x6CRypyRypuQzJmRypqSxZycxqSox67Y6N3x+fb8+P3/+P////////////////////////////////// + ////////////////////////////////9v3/+f//8///9v//8//6+Prg69/A4sO45b2v6bWt6rO257q5 + 5rzE4cXA4sS548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K+4cbC4Mm+4ca9 + 4sW25MC25cC05b625cC75cTF5czK4dDn8Oz19fn99P3/9f////////////////////////////////// + ////////////////////////////////+v//+///9///+f//9//8+vzx+PDr+uzr/+7l/+nk/+jq/+zr + /+3y//Pw//Lr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hv//Px//Xv//Pu + //Pq//Dp//Do/+/p/+/r//Dw//Tv+/L3/Pn8/P7++v7/+v////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////+/P/+/P///P///P//+///+///+////P///P//+///+///+/// + +///+//7/f32//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r0//zz//31//72 + ///3///3/v/4/f/5/f/6/f/5/f/4/f/3/f/2/f/1/v70/v7///////////////////////////////// + ///////////////////////////////+/P/+/P///P//+///+///+///+//9+f/8+P/99//+9//+9//+ + 9//+9//5+vvw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xu/vfs/vnv/Pvw + /Pzy+/3y+/3z+f/1+v/5/f/4/f/2/f/2/v/1/v/0/v7z/v7///////////////////////////////// + ///////////////////////////////+/P/+/P/+/P/9+//8+//8+//8+//8/P/8/P/9/f/9/f/9/f/8 + /f/7/f/8/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f78/vv6/vn8/vv8 + /vz+/vz+/v3+/P/+/P/++v/++//++//+/P/+/f/+/f/+/f////////////////////////////////// + /////////////////////////////////P/++//9/P/9/P/7/P/7/P77/P77/P77/f77/f77/v77/v37 + /v35/v37/f7//P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P/9/fv7//n8//r9 + //r+//v//vv//f3//P3/+v7/+v7/+v7/+/7//P7/+/7/+/7///////////////////////////////// + ////////////////////////////////+//++//8/P/7/P/6/f/5/f34//z2//r1//r0//j0//jy//fy + //fy//X3/Pn/+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f///Pj///T///T/ + //T///T///T///X///b///n//vr//vz//fz//Pz/+f3/+f7///////////////////////////////// + ////////////////////////////////+//++//8/P/7/P75/f74/vz3//v1//r0//nz//fy//fw//Xw + //Xv//Tz/ff6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/ff7//P7//P7 + //P6//P6//P6//T6//T6//X7/vf8/vn+/fv//fz/+/7/+/////////////////////////////////// + ////////////////////////////////+//++//8/P/6/P74//z2//r1//ns/PHo+u7l++vl++vh/Ojg + /Off/Ofj++rq+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/r+uvs++js++fs + ++fq++fq++fq++fq++fr+ufv++v0++/6/PT+/fj//f3//f////////////////////////////////// + ////////////////////////////////+//++/76+v36/P31/fr1//ne7OPE3Mq/2sW73MK63cG23761 + 376z4Ly137243cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC63cC83cC63r66 + 3r634Ly34Ly34Ly5372838HB3sXG3Mjl8eX2/fb5/fz6/f3///////////////////////////////// + /////////////////////////////////P/++/75+fz5/Pzz/Pjz//nH2s2iv6ifwKaaw6GZxKCVxp6U + xp2RyJuQyJqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqSxp6VxaGRxp6R + x56OyJuOyZuOyZuPyZ2UyaKYxaScwKbS6dvv//f0//v2//z///////////////////////////////// + ////////////////////////////////+//++/75+fz5/fvy/Pby//fF2sufwaacw6OVxp6Ux52OypmN + y5iKzZaIzpWGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OKy5mNyJ2JypuI + ypqEzpeDzpaCzpaFzpiLzp2PyqCTxKPL6tjp//Xv//rx//z///////////////////////////////// + ////////////////////////////////+//++v75+vv5/fvy/fbx//bE28qew6WbxaKTyJyRyZuLzZeK + zZaH0JSF0ZKC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CGzpaJy5yFzJmE + zZl/0JV+0ZR90pR/0ZWG0JqKzJ6OxqHH69fm//Xs//rv//z///////////////////////////////// + ////////////////////////////////+//++v75+vv4/fvw/fXv//XA3MebxaOXx6COzJmMzZiE0pGD + 05GB1Y6D05CG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKLzpaOzJmKzpaJ + z5WC05CC049/1Y6B1JCI0pWNzZqSx57O69Xt//P0//n3//z///////////////////////////////// + ////////////////////////////////+//++v75+vv4/fvw/fXu//TA3MeaxqOXyKCOzZqMz5iD1JGD + 1ZGA1o6D1ZCI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSNz5eRzZmM0JaL + 0JWE1JCD1Y+B1o6D1ZCI05SOzpmTx53P69Xv//L2/vn5/vv///////////////////////////////// + ////////////////////////////////+//9+v73+vv3/vrw/vPt//O+3MaXyKGUy56K0JeI0pWB149/ + 14572ouD1JGSzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2XzJqbzZmV0JSU + 0ZON1I2M1YyJ14uL1YyR05CXzpWdx5rZ69P5//L+/fn//fv///////////////////////////////// + ///////////////////////////////++/79+/74+fv4/fvy/fTv/vS/3MaXyaCTzJ2K0paI05SD1pCD + 1pCB14+H05SRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyUzZqXzpmU0JWT + 0ZSO1I6O1Y6K1oyL1Y6P0pKVzpeax5vW69T3//L9/Pr//fz///////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/ZeroFlowTool/frmTempCalibration.Designer.cs b/ZeroFlowTool/frmTempCalibration.Designer.cs new file mode 100644 index 00000000..5dd5d6ee --- /dev/null +++ b/ZeroFlowTool/frmTempCalibration.Designer.cs @@ -0,0 +1,729 @@ +namespace GenesisZeroFlow +{ + partial class frmTempCalibration + { + /// + /// 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(frmTempCalibration)); + this.btn_TempCal_Detect = new System.Windows.Forms.Button(); + this.btn_TempCal_Start = new System.Windows.Forms.Button(); + this.pB_Logo1 = new System.Windows.Forms.PictureBox(); + this.rTB_TempCal = new System.Windows.Forms.RichTextBox(); + this.p_TempCal_Meter1 = new System.Windows.Forms.Panel(); + this.pB_TempCal_Meter1 = new System.Windows.Forms.PictureBox(); + this.l_TempCal_Meter1 = new System.Windows.Forms.Label(); + this.pB_Bubbles1 = new System.Windows.Forms.PictureBox(); + this.gB_SetTemperature = new System.Windows.Forms.GroupBox(); + this.l_TemperatureDispRef = new System.Windows.Forms.Label(); + this.l_TemperatureRef = new System.Windows.Forms.Label(); + this.l_TemperatureDispPath2 = new System.Windows.Forms.Label(); + this.l_TemperatureDispPath1 = new System.Windows.Forms.Label(); + this.l_TemperaturePath2 = new System.Windows.Forms.Label(); + this.l_TemperaturePath1 = new System.Windows.Forms.Label(); + this.l_TemperaturePath0 = new System.Windows.Forms.Label(); + this.l_TemperatureDispPath0 = new System.Windows.Forms.Label(); + this.l_TempCalStatus = new System.Windows.Forms.Label(); + this.p_TempCal_Detect = new System.Windows.Forms.Panel(); + this.l_TempCal_Detect = new System.Windows.Forms.Label(); + this.p_TempCal_TempCal = new System.Windows.Forms.Panel(); + this.l_TempCal_TempCal = new System.Windows.Forms.Label(); + this.p_TempCal_Completion = new System.Windows.Forms.Panel(); + this.l_TempCal_Completion = new System.Windows.Forms.Label(); + this.p_TempCal_Prepare = new System.Windows.Forms.Panel(); + this.l_TempCal_Prepare = new System.Windows.Forms.Label(); + this.pB_AvailableImages = new System.Windows.Forms.PictureBox(); + this.nUD_SettingsPreparationMetersize = new System.Windows.Forms.NumericUpDown(); + this.l_Password = new System.Windows.Forms.Label(); + this.lB_Comport_DataInterface = new System.Windows.Forms.ListBox(); + this.lB_Comport_CmdInterface = new System.Windows.Forms.ListBox(); + this.l_Comport_DataInterface = new System.Windows.Forms.Label(); + this.l_Comport_CmdInterface = new System.Windows.Forms.Label(); + this.btn_refresh = new System.Windows.Forms.Button(); + this.gB_Mode = new System.Windows.Forms.GroupBox(); + this.rB_Adjustment = new System.Windows.Forms.RadioButton(); + this.rB_Measurement = new System.Windows.Forms.RadioButton(); + this.gB_Setup = new System.Windows.Forms.GroupBox(); + this.tBPassword = new System.Windows.Forms.TextBox(); + this.lTransferMode = new System.Windows.Forms.Label(); + this.lBTransferMode = new System.Windows.Forms.ListBox(); + this.btn_Clear = new System.Windows.Forms.Button(); + this.btn_Save = new System.Windows.Forms.Button(); + this.cB_SinglePath = new System.Windows.Forms.CheckBox(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Logo1)).BeginInit(); + this.p_TempCal_Meter1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_TempCal_Meter1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Bubbles1)).BeginInit(); + this.gB_SetTemperature.SuspendLayout(); + this.p_TempCal_Detect.SuspendLayout(); + this.p_TempCal_TempCal.SuspendLayout(); + this.p_TempCal_Completion.SuspendLayout(); + this.p_TempCal_Prepare.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_AvailableImages)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_SettingsPreparationMetersize)).BeginInit(); + this.gB_Mode.SuspendLayout(); + this.gB_Setup.SuspendLayout(); + this.SuspendLayout(); + // + // btn_TempCal_Detect + // + this.btn_TempCal_Detect.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.btn_TempCal_Detect.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btn_TempCal_Detect.Location = new System.Drawing.Point(870, 216); + this.btn_TempCal_Detect.Margin = new System.Windows.Forms.Padding(2); + this.btn_TempCal_Detect.Name = "btn_TempCal_Detect"; + this.btn_TempCal_Detect.Size = new System.Drawing.Size(110, 69); + this.btn_TempCal_Detect.TabIndex = 24; + this.btn_TempCal_Detect.Text = "PREPARE"; + this.btn_TempCal_Detect.UseVisualStyleBackColor = true; + this.btn_TempCal_Detect.Click += new System.EventHandler(this.btn_ZeroFlowCal_Detect_Click); + // + // btn_TempCal_Start + // + this.btn_TempCal_Start.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.btn_TempCal_Start.Enabled = false; + this.btn_TempCal_Start.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btn_TempCal_Start.Location = new System.Drawing.Point(870, 300); + this.btn_TempCal_Start.Margin = new System.Windows.Forms.Padding(2); + this.btn_TempCal_Start.Name = "btn_TempCal_Start"; + this.btn_TempCal_Start.Size = new System.Drawing.Size(110, 69); + this.btn_TempCal_Start.TabIndex = 25; + this.btn_TempCal_Start.Text = "START"; + this.btn_TempCal_Start.UseVisualStyleBackColor = true; + this.btn_TempCal_Start.Click += new System.EventHandler(this.btn_TempCal_Start_Click); + // + // pB_Logo1 + // + this.pB_Logo1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.pB_Logo1.Image = ((System.Drawing.Image)(resources.GetObject("pB_Logo1.Image"))); + this.pB_Logo1.InitialImage = null; + this.pB_Logo1.Location = new System.Drawing.Point(889, 20); + this.pB_Logo1.Margin = new System.Windows.Forms.Padding(2); + this.pB_Logo1.Name = "pB_Logo1"; + this.pB_Logo1.Size = new System.Drawing.Size(86, 39); + this.pB_Logo1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pB_Logo1.TabIndex = 26; + this.pB_Logo1.TabStop = false; + // + // rTB_TempCal + // + this.rTB_TempCal.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.rTB_TempCal.Location = new System.Drawing.Point(68, 575); + this.rTB_TempCal.Margin = new System.Windows.Forms.Padding(2); + this.rTB_TempCal.Name = "rTB_TempCal"; + this.rTB_TempCal.ReadOnly = true; + this.rTB_TempCal.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical; + this.rTB_TempCal.Size = new System.Drawing.Size(835, 136); + this.rTB_TempCal.TabIndex = 27; + this.rTB_TempCal.Text = ""; + // + // p_TempCal_Meter1 + // + this.p_TempCal_Meter1.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.p_TempCal_Meter1.BackColor = System.Drawing.Color.Cornsilk; + this.p_TempCal_Meter1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.p_TempCal_Meter1.Controls.Add(this.pB_TempCal_Meter1); + this.p_TempCal_Meter1.Controls.Add(this.l_TempCal_Meter1); + this.p_TempCal_Meter1.Location = new System.Drawing.Point(237, 63); + this.p_TempCal_Meter1.Margin = new System.Windows.Forms.Padding(2); + this.p_TempCal_Meter1.Name = "p_TempCal_Meter1"; + this.p_TempCal_Meter1.Size = new System.Drawing.Size(84, 106); + this.p_TempCal_Meter1.TabIndex = 28; + // + // pB_TempCal_Meter1 + // + this.pB_TempCal_Meter1.BackColor = System.Drawing.Color.Transparent; + this.pB_TempCal_Meter1.ErrorImage = ((System.Drawing.Image)(resources.GetObject("pB_TempCal_Meter1.ErrorImage"))); + this.pB_TempCal_Meter1.Image = ((System.Drawing.Image)(resources.GetObject("pB_TempCal_Meter1.Image"))); + this.pB_TempCal_Meter1.InitialImage = ((System.Drawing.Image)(resources.GetObject("pB_TempCal_Meter1.InitialImage"))); + this.pB_TempCal_Meter1.Location = new System.Drawing.Point(16, 20); + this.pB_TempCal_Meter1.Margin = new System.Windows.Forms.Padding(2); + this.pB_TempCal_Meter1.Name = "pB_TempCal_Meter1"; + this.pB_TempCal_Meter1.Size = new System.Drawing.Size(50, 41); + this.pB_TempCal_Meter1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pB_TempCal_Meter1.TabIndex = 25; + this.pB_TempCal_Meter1.TabStop = false; + // + // l_TempCal_Meter1 + // + this.l_TempCal_Meter1.AutoSize = true; + this.l_TempCal_Meter1.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_TempCal_Meter1.Location = new System.Drawing.Point(9, 78); + this.l_TempCal_Meter1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TempCal_Meter1.Name = "l_TempCal_Meter1"; + this.l_TempCal_Meter1.Size = new System.Drawing.Size(67, 13); + this.l_TempCal_Meter1.TabIndex = 25; + this.l_TempCal_Meter1.Text = "THERMO1"; + // + // pB_Bubbles1 + // + this.pB_Bubbles1.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.pB_Bubbles1.Image = ((System.Drawing.Image)(resources.GetObject("pB_Bubbles1.Image"))); + this.pB_Bubbles1.Location = new System.Drawing.Point(73, 49); + this.pB_Bubbles1.Margin = new System.Windows.Forms.Padding(2); + this.pB_Bubbles1.Name = "pB_Bubbles1"; + this.pB_Bubbles1.Size = new System.Drawing.Size(441, 268); + this.pB_Bubbles1.TabIndex = 54; + this.pB_Bubbles1.TabStop = false; + this.pB_Bubbles1.Visible = false; + // + // gB_SetTemperature + // + this.gB_SetTemperature.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.gB_SetTemperature.BackColor = System.Drawing.Color.Honeydew; + this.gB_SetTemperature.Controls.Add(this.l_TemperatureDispRef); + this.gB_SetTemperature.Controls.Add(this.l_TemperatureRef); + this.gB_SetTemperature.Controls.Add(this.l_TemperatureDispPath2); + this.gB_SetTemperature.Controls.Add(this.l_TemperatureDispPath1); + this.gB_SetTemperature.Controls.Add(this.l_TemperaturePath2); + this.gB_SetTemperature.Controls.Add(this.l_TemperaturePath1); + this.gB_SetTemperature.Controls.Add(this.l_TemperaturePath0); + this.gB_SetTemperature.Controls.Add(this.l_TemperatureDispPath0); + this.gB_SetTemperature.Controls.Add(this.p_TempCal_Meter1); + this.gB_SetTemperature.Controls.Add(this.pB_Bubbles1); + this.gB_SetTemperature.Location = new System.Drawing.Point(258, 24); + this.gB_SetTemperature.Margin = new System.Windows.Forms.Padding(2); + this.gB_SetTemperature.Name = "gB_SetTemperature"; + this.gB_SetTemperature.Padding = new System.Windows.Forms.Padding(2); + this.gB_SetTemperature.Size = new System.Drawing.Size(578, 351); + this.gB_SetTemperature.TabIndex = 55; + this.gB_SetTemperature.TabStop = false; + // + // l_TemperatureDispRef + // + this.l_TemperatureDispRef.AutoSize = true; + this.l_TemperatureDispRef.Font = new System.Drawing.Font("Microsoft Sans Serif", 13.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_TemperatureDispRef.Location = new System.Drawing.Point(436, 180); + this.l_TemperatureDispRef.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TemperatureDispRef.Name = "l_TemperatureDispRef"; + this.l_TemperatureDispRef.Size = new System.Drawing.Size(31, 24); + this.l_TemperatureDispRef.TabIndex = 60; + this.l_TemperatureDispRef.Text = "---"; + // + // l_TemperatureRef + // + this.l_TemperatureRef.AutoSize = true; + this.l_TemperatureRef.Font = new System.Drawing.Font("Microsoft Sans Serif", 16.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_TemperatureRef.Location = new System.Drawing.Point(32, 180); + this.l_TemperatureRef.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TemperatureRef.Name = "l_TemperatureRef"; + this.l_TemperatureRef.Size = new System.Drawing.Size(315, 26); + this.l_TemperatureRef.TabIndex = 59; + this.l_TemperatureRef.Text = "reference Temperature/ [°C]:"; + // + // l_TemperatureDispPath2 + // + this.l_TemperatureDispPath2.AutoSize = true; + this.l_TemperatureDispPath2.Font = new System.Drawing.Font("Microsoft Sans Serif", 13.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_TemperatureDispPath2.Location = new System.Drawing.Point(436, 268); + this.l_TemperatureDispPath2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TemperatureDispPath2.Name = "l_TemperatureDispPath2"; + this.l_TemperatureDispPath2.Size = new System.Drawing.Size(31, 24); + this.l_TemperatureDispPath2.TabIndex = 58; + this.l_TemperatureDispPath2.Text = "---"; + // + // l_TemperatureDispPath1 + // + this.l_TemperatureDispPath1.AutoSize = true; + this.l_TemperatureDispPath1.Font = new System.Drawing.Font("Microsoft Sans Serif", 13.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_TemperatureDispPath1.Location = new System.Drawing.Point(436, 239); + this.l_TemperatureDispPath1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TemperatureDispPath1.Name = "l_TemperatureDispPath1"; + this.l_TemperatureDispPath1.Size = new System.Drawing.Size(31, 24); + this.l_TemperatureDispPath1.TabIndex = 57; + this.l_TemperatureDispPath1.Text = "---"; + // + // l_TemperaturePath2 + // + this.l_TemperaturePath2.AutoSize = true; + this.l_TemperaturePath2.Font = new System.Drawing.Font("Microsoft Sans Serif", 16.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_TemperaturePath2.Location = new System.Drawing.Point(32, 268); + this.l_TemperaturePath2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TemperaturePath2.Name = "l_TemperaturePath2"; + this.l_TemperaturePath2.Size = new System.Drawing.Size(402, 26); + this.l_TemperaturePath2.TabIndex = 56; + this.l_TemperaturePath2.Text = "measured Temperature PATH3/ [°C]:"; + // + // l_TemperaturePath1 + // + this.l_TemperaturePath1.AutoSize = true; + this.l_TemperaturePath1.Font = new System.Drawing.Font("Microsoft Sans Serif", 16.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_TemperaturePath1.Location = new System.Drawing.Point(32, 239); + this.l_TemperaturePath1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TemperaturePath1.Name = "l_TemperaturePath1"; + this.l_TemperaturePath1.Size = new System.Drawing.Size(402, 26); + this.l_TemperaturePath1.TabIndex = 55; + this.l_TemperaturePath1.Text = "measured Temperature PATH2/ [°C]:"; + // + // l_TemperaturePath0 + // + this.l_TemperaturePath0.AutoSize = true; + this.l_TemperaturePath0.Font = new System.Drawing.Font("Microsoft Sans Serif", 16.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_TemperaturePath0.Location = new System.Drawing.Point(32, 210); + this.l_TemperaturePath0.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TemperaturePath0.Name = "l_TemperaturePath0"; + this.l_TemperaturePath0.Size = new System.Drawing.Size(402, 26); + this.l_TemperaturePath0.TabIndex = 1; + this.l_TemperaturePath0.Text = "measured Temperature PATH1/ [°C]:"; + // + // l_TemperatureDispPath0 + // + this.l_TemperatureDispPath0.AutoSize = true; + this.l_TemperatureDispPath0.Font = new System.Drawing.Font("Microsoft Sans Serif", 13.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_TemperatureDispPath0.Location = new System.Drawing.Point(436, 210); + this.l_TemperatureDispPath0.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TemperatureDispPath0.Name = "l_TemperatureDispPath0"; + this.l_TemperatureDispPath0.Size = new System.Drawing.Size(31, 24); + this.l_TemperatureDispPath0.TabIndex = 0; + this.l_TemperatureDispPath0.Text = "---"; + // + // l_TempCalStatus + // + this.l_TempCalStatus.AutoSize = true; + this.l_TempCalStatus.Font = new System.Drawing.Font("Microsoft Sans Serif", 22.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_TempCalStatus.Location = new System.Drawing.Point(166, 405); + this.l_TempCalStatus.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TempCalStatus.Name = "l_TempCalStatus"; + this.l_TempCalStatus.Size = new System.Drawing.Size(271, 36); + this.l_TempCalStatus.TabIndex = 56; + this.l_TempCalStatus.Text = "Press \'PREPARE\'"; + // + // p_TempCal_Detect + // + this.p_TempCal_Detect.BackColor = System.Drawing.Color.Gainsboro; + this.p_TempCal_Detect.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.p_TempCal_Detect.Controls.Add(this.l_TempCal_Detect); + this.p_TempCal_Detect.Location = new System.Drawing.Point(81, 483); + this.p_TempCal_Detect.Margin = new System.Windows.Forms.Padding(2); + this.p_TempCal_Detect.Name = "p_TempCal_Detect"; + this.p_TempCal_Detect.Size = new System.Drawing.Size(136, 66); + this.p_TempCal_Detect.TabIndex = 57; + // + // l_TempCal_Detect + // + this.l_TempCal_Detect.AutoSize = true; + this.l_TempCal_Detect.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_TempCal_Detect.ForeColor = System.Drawing.Color.Gray; + this.l_TempCal_Detect.Location = new System.Drawing.Point(36, 24); + this.l_TempCal_Detect.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TempCal_Detect.Name = "l_TempCal_Detect"; + this.l_TempCal_Detect.Size = new System.Drawing.Size(69, 17); + this.l_TempCal_Detect.TabIndex = 39; + this.l_TempCal_Detect.Text = "DETECT"; + // + // p_TempCal_TempCal + // + this.p_TempCal_TempCal.BackColor = System.Drawing.Color.Gainsboro; + this.p_TempCal_TempCal.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.p_TempCal_TempCal.Controls.Add(this.l_TempCal_TempCal); + this.p_TempCal_TempCal.Location = new System.Drawing.Point(351, 483); + this.p_TempCal_TempCal.Margin = new System.Windows.Forms.Padding(2); + this.p_TempCal_TempCal.Name = "p_TempCal_TempCal"; + this.p_TempCal_TempCal.Size = new System.Drawing.Size(136, 66); + this.p_TempCal_TempCal.TabIndex = 58; + // + // l_TempCal_TempCal + // + this.l_TempCal_TempCal.AutoSize = true; + this.l_TempCal_TempCal.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_TempCal_TempCal.ForeColor = System.Drawing.Color.Gray; + this.l_TempCal_TempCal.Location = new System.Drawing.Point(9, 15); + this.l_TempCal_TempCal.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TempCal_TempCal.Name = "l_TempCal_TempCal"; + this.l_TempCal_TempCal.Size = new System.Drawing.Size(123, 34); + this.l_TempCal_TempCal.TabIndex = 40; + this.l_TempCal_TempCal.Text = "TEMPERATURE\r\nADJUSTMENT"; + this.l_TempCal_TempCal.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // p_TempCal_Completion + // + this.p_TempCal_Completion.BackColor = System.Drawing.Color.Gainsboro; + this.p_TempCal_Completion.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.p_TempCal_Completion.Controls.Add(this.l_TempCal_Completion); + this.p_TempCal_Completion.Location = new System.Drawing.Point(486, 483); + this.p_TempCal_Completion.Margin = new System.Windows.Forms.Padding(2); + this.p_TempCal_Completion.Name = "p_TempCal_Completion"; + this.p_TempCal_Completion.Size = new System.Drawing.Size(136, 66); + this.p_TempCal_Completion.TabIndex = 59; + // + // l_TempCal_Completion + // + this.l_TempCal_Completion.AutoSize = true; + this.l_TempCal_Completion.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_TempCal_Completion.ForeColor = System.Drawing.Color.Gray; + this.l_TempCal_Completion.Location = new System.Drawing.Point(18, 24); + this.l_TempCal_Completion.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TempCal_Completion.Name = "l_TempCal_Completion"; + this.l_TempCal_Completion.Size = new System.Drawing.Size(108, 17); + this.l_TempCal_Completion.TabIndex = 40; + this.l_TempCal_Completion.Text = "COMPLETION"; + this.l_TempCal_Completion.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // p_TempCal_Prepare + // + this.p_TempCal_Prepare.BackColor = System.Drawing.Color.Gainsboro; + this.p_TempCal_Prepare.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.p_TempCal_Prepare.Controls.Add(this.l_TempCal_Prepare); + this.p_TempCal_Prepare.Location = new System.Drawing.Point(216, 483); + this.p_TempCal_Prepare.Margin = new System.Windows.Forms.Padding(2); + this.p_TempCal_Prepare.Name = "p_TempCal_Prepare"; + this.p_TempCal_Prepare.Size = new System.Drawing.Size(136, 66); + this.p_TempCal_Prepare.TabIndex = 60; + // + // l_TempCal_Prepare + // + this.l_TempCal_Prepare.AutoSize = true; + this.l_TempCal_Prepare.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_TempCal_Prepare.ForeColor = System.Drawing.Color.Gray; + this.l_TempCal_Prepare.Location = new System.Drawing.Point(32, 24); + this.l_TempCal_Prepare.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_TempCal_Prepare.Name = "l_TempCal_Prepare"; + this.l_TempCal_Prepare.Size = new System.Drawing.Size(80, 17); + this.l_TempCal_Prepare.TabIndex = 39; + this.l_TempCal_Prepare.Text = "PREPARE"; + // + // pB_AvailableImages + // + this.pB_AvailableImages.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.pB_AvailableImages.BackColor = System.Drawing.Color.Transparent; + this.pB_AvailableImages.ErrorImage = ((System.Drawing.Image)(resources.GetObject("pB_AvailableImages.ErrorImage"))); + this.pB_AvailableImages.Image = ((System.Drawing.Image)(resources.GetObject("pB_AvailableImages.Image"))); + this.pB_AvailableImages.InitialImage = ((System.Drawing.Image)(resources.GetObject("pB_AvailableImages.InitialImage"))); + this.pB_AvailableImages.Location = new System.Drawing.Point(930, 576); + this.pB_AvailableImages.Margin = new System.Windows.Forms.Padding(2); + this.pB_AvailableImages.Name = "pB_AvailableImages"; + this.pB_AvailableImages.Size = new System.Drawing.Size(50, 41); + this.pB_AvailableImages.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pB_AvailableImages.TabIndex = 61; + this.pB_AvailableImages.TabStop = false; + // + // nUD_SettingsPreparationMetersize + // + this.nUD_SettingsPreparationMetersize.Location = new System.Drawing.Point(18, 414); + this.nUD_SettingsPreparationMetersize.Margin = new System.Windows.Forms.Padding(2); + this.nUD_SettingsPreparationMetersize.Name = "nUD_SettingsPreparationMetersize"; + this.nUD_SettingsPreparationMetersize.Size = new System.Drawing.Size(32, 20); + this.nUD_SettingsPreparationMetersize.TabIndex = 62; + this.nUD_SettingsPreparationMetersize.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.nUD_SettingsPreparationMetersize.Visible = false; + // + // l_Password + // + this.l_Password.AutoSize = true; + this.l_Password.Location = new System.Drawing.Point(18, 24); + this.l_Password.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_Password.Name = "l_Password"; + this.l_Password.Size = new System.Drawing.Size(53, 13); + this.l_Password.TabIndex = 64; + this.l_Password.Text = "Password"; + // + // lB_Comport_DataInterface + // + this.lB_Comport_DataInterface.FormattingEnabled = true; + this.lB_Comport_DataInterface.Location = new System.Drawing.Point(18, 78); + this.lB_Comport_DataInterface.Margin = new System.Windows.Forms.Padding(2); + this.lB_Comport_DataInterface.Name = "lB_Comport_DataInterface"; + this.lB_Comport_DataInterface.Size = new System.Drawing.Size(186, 69); + this.lB_Comport_DataInterface.TabIndex = 65; + // + // lB_Comport_CmdInterface + // + this.lB_Comport_CmdInterface.FormattingEnabled = true; + this.lB_Comport_CmdInterface.Location = new System.Drawing.Point(18, 171); + this.lB_Comport_CmdInterface.Margin = new System.Windows.Forms.Padding(2); + this.lB_Comport_CmdInterface.Name = "lB_Comport_CmdInterface"; + this.lB_Comport_CmdInterface.Size = new System.Drawing.Size(186, 69); + this.lB_Comport_CmdInterface.TabIndex = 66; + // + // l_Comport_DataInterface + // + this.l_Comport_DataInterface.AutoSize = true; + this.l_Comport_DataInterface.Location = new System.Drawing.Point(18, 63); + this.l_Comport_DataInterface.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_Comport_DataInterface.Name = "l_Comport_DataInterface"; + this.l_Comport_DataInterface.Size = new System.Drawing.Size(90, 13); + this.l_Comport_DataInterface.TabIndex = 67; + this.l_Comport_DataInterface.Text = "DATA CHANNEL"; + // + // l_Comport_CmdInterface + // + this.l_Comport_CmdInterface.AutoSize = true; + this.l_Comport_CmdInterface.Location = new System.Drawing.Point(18, 156); + this.l_Comport_CmdInterface.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_Comport_CmdInterface.Name = "l_Comport_CmdInterface"; + this.l_Comport_CmdInterface.Size = new System.Drawing.Size(117, 13); + this.l_Comport_CmdInterface.TabIndex = 68; + this.l_Comport_CmdInterface.Text = "COMMAND CHANNEL"; + // + // btn_refresh + // + this.btn_refresh.Location = new System.Drawing.Point(18, 312); + this.btn_refresh.Margin = new System.Windows.Forms.Padding(2); + this.btn_refresh.Name = "btn_refresh"; + this.btn_refresh.Size = new System.Drawing.Size(183, 24); + this.btn_refresh.TabIndex = 69; + this.btn_refresh.Text = "REFRESH"; + this.btn_refresh.UseVisualStyleBackColor = true; + this.btn_refresh.Click += new System.EventHandler(this.btn_refresh_Click); + // + // gB_Mode + // + this.gB_Mode.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.gB_Mode.BackColor = System.Drawing.Color.Honeydew; + this.gB_Mode.Controls.Add(this.rB_Adjustment); + this.gB_Mode.Controls.Add(this.rB_Measurement); + this.gB_Mode.Location = new System.Drawing.Point(852, 84); + this.gB_Mode.Margin = new System.Windows.Forms.Padding(2); + this.gB_Mode.Name = "gB_Mode"; + this.gB_Mode.Padding = new System.Windows.Forms.Padding(2); + this.gB_Mode.Size = new System.Drawing.Size(140, 73); + this.gB_Mode.TabIndex = 71; + this.gB_Mode.TabStop = false; + this.gB_Mode.Text = "MODE"; + // + // rB_Adjustment + // + this.rB_Adjustment.AutoSize = true; + this.rB_Adjustment.Location = new System.Drawing.Point(18, 44); + this.rB_Adjustment.Margin = new System.Windows.Forms.Padding(2); + this.rB_Adjustment.Name = "rB_Adjustment"; + this.rB_Adjustment.Size = new System.Drawing.Size(98, 17); + this.rB_Adjustment.TabIndex = 1; + this.rB_Adjustment.Text = "ADJUSTMENT"; + this.rB_Adjustment.UseVisualStyleBackColor = true; + // + // rB_Measurement + // + this.rB_Measurement.AutoSize = true; + this.rB_Measurement.Checked = true; + this.rB_Measurement.Location = new System.Drawing.Point(18, 20); + this.rB_Measurement.Margin = new System.Windows.Forms.Padding(2); + this.rB_Measurement.Name = "rB_Measurement"; + this.rB_Measurement.Size = new System.Drawing.Size(109, 17); + this.rB_Measurement.TabIndex = 0; + this.rB_Measurement.TabStop = true; + this.rB_Measurement.Text = "MEASUREMENT"; + this.rB_Measurement.UseVisualStyleBackColor = true; + // + // gB_Setup + // + this.gB_Setup.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.gB_Setup.BackColor = System.Drawing.Color.Honeydew; + this.gB_Setup.Controls.Add(this.tBPassword); + this.gB_Setup.Controls.Add(this.lTransferMode); + this.gB_Setup.Controls.Add(this.lBTransferMode); + this.gB_Setup.Controls.Add(this.l_Password); + this.gB_Setup.Controls.Add(this.l_Comport_DataInterface); + this.gB_Setup.Controls.Add(this.l_Comport_CmdInterface); + this.gB_Setup.Controls.Add(this.lB_Comport_DataInterface); + this.gB_Setup.Controls.Add(this.btn_refresh); + this.gB_Setup.Controls.Add(this.lB_Comport_CmdInterface); + this.gB_Setup.Location = new System.Drawing.Point(24, 24); + this.gB_Setup.Margin = new System.Windows.Forms.Padding(2); + this.gB_Setup.Name = "gB_Setup"; + this.gB_Setup.Padding = new System.Windows.Forms.Padding(2); + this.gB_Setup.Size = new System.Drawing.Size(220, 351); + this.gB_Setup.TabIndex = 72; + this.gB_Setup.TabStop = false; + this.gB_Setup.Text = "SET UP"; + // + // tBPassword + // + this.tBPassword.Location = new System.Drawing.Point(18, 39); + this.tBPassword.Margin = new System.Windows.Forms.Padding(2); + this.tBPassword.MaxLength = 12; + this.tBPassword.Name = "tBPassword"; + this.tBPassword.Size = new System.Drawing.Size(186, 20); + this.tBPassword.TabIndex = 73; + // + // lTransferMode + // + this.lTransferMode.AutoSize = true; + this.lTransferMode.Location = new System.Drawing.Point(58, 244); + this.lTransferMode.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.lTransferMode.Name = "lTransferMode"; + this.lTransferMode.Size = new System.Drawing.Size(39, 13); + this.lTransferMode.TabIndex = 72; + this.lTransferMode.Text = "MODE"; + // + // lBTransferMode + // + this.lBTransferMode.FormattingEnabled = true; + this.lBTransferMode.Items.AddRange(new object[] { + "RfidComPort", + "SerialComPort", + "IrdaComPort"}); + this.lBTransferMode.Location = new System.Drawing.Point(58, 258); + this.lBTransferMode.Margin = new System.Windows.Forms.Padding(2); + this.lBTransferMode.Name = "lBTransferMode"; + this.lBTransferMode.Size = new System.Drawing.Size(95, 43); + this.lBTransferMode.TabIndex = 71; + // + // btn_Clear + // + this.btn_Clear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btn_Clear.Location = new System.Drawing.Point(927, 678); + this.btn_Clear.Margin = new System.Windows.Forms.Padding(2); + this.btn_Clear.Name = "btn_Clear"; + this.btn_Clear.Size = new System.Drawing.Size(56, 24); + this.btn_Clear.TabIndex = 73; + this.btn_Clear.Text = "Clear"; + this.btn_Clear.UseVisualStyleBackColor = true; + this.btn_Clear.Click += new System.EventHandler(this.btn_Clear_Click); + // + // btn_Save + // + this.btn_Save.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btn_Save.Location = new System.Drawing.Point(927, 639); + this.btn_Save.Margin = new System.Windows.Forms.Padding(2); + this.btn_Save.Name = "btn_Save"; + this.btn_Save.Size = new System.Drawing.Size(56, 24); + this.btn_Save.TabIndex = 74; + this.btn_Save.Text = "Save"; + this.btn_Save.UseVisualStyleBackColor = true; + this.btn_Save.Click += new System.EventHandler(this.btn_Save_Click); + // + // cB_SinglePath + // + this.cB_SinglePath.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cB_SinglePath.AutoSize = true; + this.cB_SinglePath.Location = new System.Drawing.Point(882, 180); + this.cB_SinglePath.Margin = new System.Windows.Forms.Padding(2); + this.cB_SinglePath.Name = "cB_SinglePath"; + this.cB_SinglePath.Size = new System.Drawing.Size(87, 17); + this.cB_SinglePath.TabIndex = 75; + this.cB_SinglePath.Text = "Single PATH"; + this.cB_SinglePath.UseVisualStyleBackColor = true; + // + // frmTempCalibration + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.AliceBlue; + this.ClientSize = new System.Drawing.Size(1008, 730); + this.Controls.Add(this.cB_SinglePath); + this.Controls.Add(this.nUD_SettingsPreparationMetersize); + this.Controls.Add(this.btn_Save); + this.Controls.Add(this.btn_Clear); + this.Controls.Add(this.gB_Mode); + this.Controls.Add(this.pB_AvailableImages); + this.Controls.Add(this.p_TempCal_Prepare); + this.Controls.Add(this.p_TempCal_Completion); + this.Controls.Add(this.p_TempCal_TempCal); + this.Controls.Add(this.p_TempCal_Detect); + this.Controls.Add(this.l_TempCalStatus); + this.Controls.Add(this.gB_SetTemperature); + this.Controls.Add(this.rTB_TempCal); + this.Controls.Add(this.pB_Logo1); + this.Controls.Add(this.btn_TempCal_Start); + this.Controls.Add(this.btn_TempCal_Detect); + this.Controls.Add(this.gB_Setup); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(2); + this.Name = "frmTempCalibration"; + this.Text = "SENSUS Hannover - Temperature Calibrator V0.15/ 2019-02-14"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.frmTempCalibration_FormClosing); + this.Load += new System.EventHandler(this.frmTempCalibration_Load); + ((System.ComponentModel.ISupportInitialize)(this.pB_Logo1)).EndInit(); + this.p_TempCal_Meter1.ResumeLayout(false); + this.p_TempCal_Meter1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_TempCal_Meter1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Bubbles1)).EndInit(); + this.gB_SetTemperature.ResumeLayout(false); + this.gB_SetTemperature.PerformLayout(); + this.p_TempCal_Detect.ResumeLayout(false); + this.p_TempCal_Detect.PerformLayout(); + this.p_TempCal_TempCal.ResumeLayout(false); + this.p_TempCal_TempCal.PerformLayout(); + this.p_TempCal_Completion.ResumeLayout(false); + this.p_TempCal_Completion.PerformLayout(); + this.p_TempCal_Prepare.ResumeLayout(false); + this.p_TempCal_Prepare.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pB_AvailableImages)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_SettingsPreparationMetersize)).EndInit(); + this.gB_Mode.ResumeLayout(false); + this.gB_Mode.PerformLayout(); + this.gB_Setup.ResumeLayout(false); + this.gB_Setup.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button btn_TempCal_Detect; + private System.Windows.Forms.Button btn_TempCal_Start; + private System.Windows.Forms.PictureBox pB_Logo1; + private System.Windows.Forms.RichTextBox rTB_TempCal; + private System.Windows.Forms.Panel p_TempCal_Meter1; + private System.Windows.Forms.PictureBox pB_TempCal_Meter1; + private System.Windows.Forms.Label l_TempCal_Meter1; + private System.Windows.Forms.PictureBox pB_Bubbles1; + private System.Windows.Forms.GroupBox gB_SetTemperature; + private System.Windows.Forms.Label l_TemperaturePath0; + private System.Windows.Forms.Label l_TemperatureDispPath0; + private System.Windows.Forms.Label l_TempCalStatus; + private System.Windows.Forms.Panel p_TempCal_Detect; + private System.Windows.Forms.Label l_TempCal_Detect; + private System.Windows.Forms.Panel p_TempCal_TempCal; + private System.Windows.Forms.Label l_TempCal_TempCal; + private System.Windows.Forms.Panel p_TempCal_Completion; + private System.Windows.Forms.Label l_TempCal_Completion; + private System.Windows.Forms.Panel p_TempCal_Prepare; + private System.Windows.Forms.Label l_TempCal_Prepare; + private System.Windows.Forms.PictureBox pB_AvailableImages; + private System.Windows.Forms.NumericUpDown nUD_SettingsPreparationMetersize; + private System.Windows.Forms.Label l_TemperaturePath2; + private System.Windows.Forms.Label l_TemperaturePath1; + private System.Windows.Forms.Label l_TemperatureDispPath2; + private System.Windows.Forms.Label l_TemperatureDispPath1; + private System.Windows.Forms.Label l_TemperatureDispRef; + private System.Windows.Forms.Label l_TemperatureRef; + private System.Windows.Forms.Label l_Password; + private System.Windows.Forms.ListBox lB_Comport_DataInterface; + private System.Windows.Forms.ListBox lB_Comport_CmdInterface; + private System.Windows.Forms.Label l_Comport_DataInterface; + private System.Windows.Forms.Label l_Comport_CmdInterface; + private System.Windows.Forms.Button btn_refresh; + private System.Windows.Forms.GroupBox gB_Mode; + private System.Windows.Forms.RadioButton rB_Adjustment; + private System.Windows.Forms.RadioButton rB_Measurement; + private System.Windows.Forms.GroupBox gB_Setup; + private System.Windows.Forms.Button btn_Clear; + private System.Windows.Forms.Button btn_Save; + private System.Windows.Forms.Label lTransferMode; + private System.Windows.Forms.ListBox lBTransferMode; + private System.Windows.Forms.TextBox tBPassword; + private System.Windows.Forms.CheckBox cB_SinglePath; + } +} \ No newline at end of file diff --git a/ZeroFlowTool/frmTempCalibration.cs b/ZeroFlowTool/frmTempCalibration.cs new file mode 100644 index 00000000..1125b488 --- /dev/null +++ b/ZeroFlowTool/frmTempCalibration.cs @@ -0,0 +1,1097 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; +using GenesisDisplayTool; +using System.Globalization; + +using System.IO; +using System.IO.Ports; +using Xylem.Common.Hardware.Interfaces.Ports.SerialPorts; +using Xylem.Common.Hardware.WaterMeter.WaterMeterCore; +using Newtonsoft.Json; +using Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords; +using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisConfig; + +namespace GenesisZeroFlow +{ + + + public partial class frmTempCalibration : Form + { + private String dataToLog = String.Empty; + public void SetDataToLog(String data) + { + dataToLog = data; + } + public String GetDataToLog() + { + return (String)dataToLog.Clone(); + } + + public Type TransferType(String input) + { + if (!String.IsNullOrEmpty(input)) + { + if (String.Equals(input, "RfidComPort")) + return typeof(RfidSerialPort); + if (String.Equals(input, "SerialComPort")) + return typeof(UartSerialPort); + if (String.Equals(input, "IrdaComPort")) + return typeof(IrdaSerialPort); + return typeof(RfidSerialPort); + } + else + return typeof(RfidSerialPort); + } + public String GetTransferMode() + { + String temp = String.Empty; + + if (InvokeRequired) + { + lBTransferMode.Invoke(new Action(() => + { + temp = lBTransferMode.Text; + })); + + + } + return lBTransferMode.Text; + } + + public String ConvertTransferMode(String text) + { + + if (!String.IsNullOrEmpty(text)) + { + if (String.Equals(text, "RfidComPort")) + return typeof(RfidSerialPort).ToString(); + if (String.Equals(text, "SerialComPort")) + return typeof(UartSerialPort).ToString(); + if (String.Equals(text, "IrdaComPort")) + return typeof(IrdaSerialPort).ToString(); + return typeof(RfidSerialPort).ToString(); ; + } + else + return typeof(RfidSerialPort).ToString(); ; + } + + public String GetPassword() + { + String temp = String.Empty; + + if (InvokeRequired) + { + tBPassword.Invoke(new Action(() => + { + temp = tBPassword.Text; + })); + + return temp; + } + return tBPassword.Text; + } + public String GetSerialPortCmdChannel() + { + String temp = String.Empty; + + if (InvokeRequired) + { + lB_Comport_CmdInterface.Invoke(new Action(() => + { + temp = lB_Comport_CmdInterface.Text; + })); + + return temp; + } + return lB_Comport_CmdInterface.Text; + } + + + MeterBatch GlobalMeterBatch = new MeterBatch(); + Boolean[] SerialPortOpenFlag = new Boolean[2] { false, false }; + Boolean PreparationFailed = false; + Boolean CompletionEnable = false; + Boolean EmptyPipeCheckEnable = false; + String ModeString = String.Empty; + public Boolean ThirdFormOpenIndicator = false; + + public Boolean CompletionFailed { get; private set; } + public Boolean EmptyPipeCheckFailed { get; private set; } + public Boolean TempCalEnable { get; private set; } + public Boolean TempCalFailed { get; private set; } + private Boolean EnableIndicatorTempTest = false; + private Boolean LoggingIndicatorTempTest = false; + public void SetEnableIndicatorTempTest(Boolean value) + { + EnableIndicatorTempTest = value; + } + public void SetLoggingIndicatorTempTest(Boolean value) + { + LoggingIndicatorTempTest = value; + } + + public Boolean GetLoggingIndicatorTempTest() + { + return LoggingIndicatorTempTest; + } + private Boolean EnableIndicatorEmptyPipeTest = false; + public void SetEnableIndicatorEmptyPipeTest(Boolean value) + { + EnableIndicatorEmptyPipeTest = value; + } + private Int32[] LineCounterEmptyPipeTest = new Int32[Constants.NumberOfPaths]; + public Int32[] GetLineCounterEmptyPipeTest() + { + return (Int32[])LineCounterEmptyPipeTest; + } + public void SetLineCounterEmptyPipeTest(Int32 value, UInt16 path) + { + LineCounterEmptyPipeTest[path] = value; + } + private CalibrationRecord[] DecodedAllMeters = new CalibrationRecord[Constants.NumberOfPaths]; + public CalibrationRecord[] GetDecodedAllMeters() + { + return (CalibrationRecord[])DecodedAllMeters.Clone(); + } + + public CultureInfo GetGlobalCulture() + { + return CultureInfo.CreateSpecificCulture("en-US"); + } + + public frmTempCalibration() + { + InitializeComponent(); + _frmTempCalibration = this; + } + + public static frmTempCalibration _frmTempCalibration; + public Boolean WaitForTemperatureFieldTempCal = false; + private Int32[] ToFTempOffset = new Int32[Constants.NumberOfPaths]; + public void SetToFTempOffset(UInt16 path, Int32 data) + { + ToFTempOffset[path] = data; + } + private Int32[][] ZeroFlowOffset = new Int32[Constants.NumberOfMeters][]; + public void SetWaitForTemperatureFieldTempCal(Boolean value) + { + WaitForTemperatureFieldTempCal = value; + } + private Int32[] LineCounterTemperatureTest = new Int32[Constants.NumberOfPaths]; + public Int32[] GetLineCounterTemperatureTest() + { + return (Int32[])LineCounterTemperatureTest; + } + public void SetLineCounterTemperatureTest(Int32 value, UInt16 path) + { + LineCounterTemperatureTest[path] = value; + } + + public Boolean GetAdjustmentSelectedStatus() + { + Boolean temp = false; + if (InvokeRequired) + { + rB_Adjustment.Invoke(new Action(() => + { + temp = rB_Adjustment.Checked; + })); + + return temp;// rB_Adjustment.Checked; + } + return rB_Adjustment.Checked; + } + + public Boolean GetMeasurementSelectedStatus() + { + Boolean temp = false; + if (InvokeRequired) + { + rB_Adjustment.Invoke(new Action(() => + { + temp = rB_Measurement.Checked; + })); + + return rB_Measurement.Checked; + } + return rB_Measurement.Checked; + + } + public void SetControlElements(Boolean enabled) + { + if (enabled) + { + pB_Bubbles1.Visible = false; + btn_TempCal_Detect.Enabled = true; + } + else + { + btn_TempCal_Detect.Enabled = false; + btn_TempCal_Start.Enabled = false; + } + } + + public String PcbId = String.Empty; + private void btn_ZeroFlowCal_Detect_Click(object sender, EventArgs e) + { + CultureInfo Culture = GetGlobalCulture(); + String TransferMode = GetTransferMode(); + + if (GlobalMeterBatch.ListOfMeters.Any()) + GlobalMeterBatch.RemoveAllMeters(); + else + GlobalMeterBatch = new MeterBatch(); + + try + { + if (cB_SinglePath.Checked) + Constants.NumberOfPaths = 1; + else + Constants.NumberOfPaths = 3; + + PortConfig Configuration = new Xylem.Common.Hardware.WaterMeter.Genesis.GenesisConfig.PortConfig(); + + var requestPort = new PortConfig() + { + PortName = lB_Comport_CmdInterface.Text, + Type = ConvertTransferMode(TransferMode) + }; + var streamingPort = new PortConfig() + { + PortName = lB_Comport_DataInterface.Text, + Type = typeof(UartSerialPort).ToString() + }; + + GlobalMeterBatch.AddMeter(new ZeroFlowGenesisMeter(1, requestPort, streamingPort, false)); + } + catch (Exception) + { + DisplayTempCal.SetProgressPanel(StatusPanelItems.None); + DisplayTempCal.DebugMessage("APPLICATION:\t\t Serial port opening failed\n", Culture); + DisplayTempCal.StatusLabel("Press 'PREPARE'"); + MessageBox.Show("No valid COMPORT", "Form closing", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + foreach (var generalMeter in GlobalMeterBatch.ListOfMeters) + { + if (generalMeter is ZeroFlowGenesisMeter) + { + var Meter = generalMeter as ZeroFlowGenesisMeter; + //Meter.LogOnEnable = SerialPortOpenFlag[Meter.Slot - 1] & SerialPortOpenFlag[(Meter.Slot - 1) + Constants.NumberOfMeters]; + Meter.LogOnEnable = SerialPortOpenFlag[Meter.Slot - 1] & SerialPortOpenFlag[(Meter.Slot - 1) + 1]; + Meter.LoginFailed = false; + Meter.PreparationFailed = false; + Meter.AmplitudeFailed = false; + Meter.ZeroFlowOffsetFailed = false; + Meter.AmplitudeFailed = false; + Meter.CompletionFailed = false; + Meter.Ok = false; + Meter.EmptyPipeCheckEnable = false; + Meter.EmptyPipeCheckFailed = false; + } + } + + #region Definitions and initializations + Boolean[] Ok = new Boolean[2]; + + btn_TempCal_Start.Enabled = false; + #endregion + #region Bubbles + pB_Bubbles1.Visible = true; + #endregion + #region Visual indication 'PREPARE' + frmTempCalibration.DisplayTempCal.SetProgressPanel(StatusPanelItems.Detect); + frmTempCalibration.DisplayTempCal.StatusLabel("Wait until PREPARATION has finished"); + + foreach (var generalMeter in GlobalMeterBatch.ListOfMeters) + { + if (generalMeter is ZeroFlowGenesisMeter) + { + var Meter = generalMeter as ZeroFlowGenesisMeter; + Ok[(Meter.Slot - 1)] = Meter.CheckRequestPort(); + Ok[(Meter.Slot - 1) + 1] = Meter.CheckStreamingPort(); + } + } + + DisplayTempCal.ConnectionStatus(Ok); + SerialPortOpenFlag = Ok; + #endregion + DisplayTempCal.DebugMessage("APPLICATION:\t\t Serial port opening successful\n", Culture); + DisplayTempCal.StatusLabel("Press 'START' or repeat 'PREPARE'"); + btn_TempCal_Start.Enabled = true; + pB_Bubbles1.Visible = false; + } + + private async Task Preparation(CultureInfo culture, bool MeterEnable) + { + #region Preparation + + PreparationFailed = await Task.Run(() => + { + return PreparationSequences.TotalTempCal(GlobalMeterBatch, + (UInt16)nUD_SettingsPreparationMetersize.Value, 0, 0, 0, culture); + }); + + + Boolean StopSequence = false; + + var Ok = DisplayGetSequenceResult(MeterEnable, PreparationFailed, "PREPARATION sequence", + out StopSequence); + if (StopSequence) + { + DisplayTempCal.MeterStatusGreenRed(false, true); + DisplayTempCal.SetProgressPanel(StatusPanelItems.None); + SetControlElements(true); + gB_Mode.Enabled = true; + btn_Save.Enabled = true; + btn_Clear.Enabled = true; + return false; + } + + DisplayTempCal.MeterStatusGreenRed(true, true); + + #endregion + + return true; + + + } + + + + private void TempCal_Start(String password, String transferMode, String portCmdChannel, Double upperTempLimit, Double lowerTempLimit, Double tempDeviationLimit, CultureInfo culture) + { + #region Definitions and initializations + const UInt16 PasswordLength = 12; + Boolean MeterEnable = false; + + pB_Bubbles1.Visible = true; + DisplayTempCal.TemperatureLabelsForm1Visible(rB_Adjustment.Checked); + gB_Mode.Enabled = false; + gB_Setup.Enabled = false; + btn_Save.Enabled = false; + btn_Clear.Enabled = false; + if (rB_Adjustment.Checked) + ModeString = "TEMPERATURE ADJUSTMENT"; + else + ModeString = "TEMPERATURE MEASUREMENT"; + gB_SetTemperature.Text = ModeString; + #endregion + #region Check password + DisplayTempCal.StatusLabel("Wait until LOGIN has finished"); + Misc.WaitNMilliseconds(100); + SetControlElements(false); + DisplayTempCal.SetProgressPanel(StatusPanelItems.Prepare); + + if (!GlobalMeterBatch.ListOfMeters.Any()) + { + MessageBox.Show("No METER selected", "Form closing", MessageBoxButtons.OK, MessageBoxIcon.Error); + DisplayTempCal.SetProgressPanel(StatusPanelItems.None); + gB_Mode.Enabled = true; + SetControlElements(true); + gB_Setup.Enabled = true; + btn_Save.Enabled = true; + btn_Clear.Enabled = true; + return; + } + #endregion + #region Preparation + if (!String.IsNullOrEmpty(password)) + { + if (!Misc.OnlyHexInString(password) || (password.Count() < PasswordLength)) + { + DisplayTempCal.DebugMessage("APPLICATION:\t\t Password invalid\n", culture); + MessageBox.Show("Password invalid"); + DisplayTempCal.MeterStatusGreenRed(false, true); + DisplayTempCal.SetProgressPanel(StatusPanelItems.None); + SetControlElements(true); + gB_Setup.Enabled = true; + btn_Save.Enabled = true; + btn_Clear.Enabled = true; + return; + } + } + #region LOGIN + foreach (var item in GlobalMeterBatch.ListOfMeters) + { + if (item is ZeroFlowGenesisMeter) + { + var Meter = (ZeroFlowGenesisMeter)item; + MeterEnable = true; + Boolean LoginOK = false; + Task LoginTask = Task.Run(() => + { + try + { + if (String.IsNullOrEmpty(password)) + LoginOK = Meter.Login(); + else + LoginOK = Meter.Login(password); + } + catch + { + LoginOK = false; + } + return LoginOK; + }); + + while (!TaskStatus.Equals(LoginTask.Status, TaskStatus.RanToCompletion)) + { + DisplayTempCal.DebugMessage("COMMAND INTERFACE:\t Performing LOGIN\n", culture); + Misc.WaitNSeconds(1, true); + } + try + { + //if (!Meter.Login(Password)) + if (!LoginOK) + { + DisplayTempCal.MeterStatusGreenRed(false, true); + DisplayTempCal.DebugMessage("APPLICATION:\t\t LOGIN failed\n", culture); + DisplayTempCal.DebugMessage(Debugmessages.Line, culture); + DisplayTempCal.SetProgressPanel(StatusPanelItems.None); + SetControlElements(true); + gB_Setup.Enabled = true; + btn_Save.Enabled = true; + btn_Clear.Enabled = true; + gB_Mode.Enabled = true; + return; + } + else + { + DisplayTempCal.DebugMessage("APPLICATION:\t\t LOGIN successful\n", culture); + DisplayTempCal.DebugMessage(Debugmessages.Line, culture); + } + } + catch + { + DisplayTempCal.MeterStatusGreenRed(false, true); + DisplayTempCal.DebugMessage("APPLICATION:\t\t LOGIN failed\n", culture); + DisplayTempCal.DebugMessage(Debugmessages.Line, culture); + DisplayTempCal.SetProgressPanel(StatusPanelItems.None); + SetControlElements(true); + gB_Setup.Enabled = true; + btn_Save.Enabled = true; + btn_Clear.Enabled = true; + gB_Mode.Enabled = true; + return; + } + } + } + #endregion + DisplayTempCal.SetProgressPanel(StatusPanelItems.Prepare); + DisplayTempCal.StatusLabel("Wait until PREPARATION has finished"); + + #region add com port listener + foreach (var item in GlobalMeterBatch.ListOfMeters) + { + if (item is ZeroFlowGenesisMeter) + { + ((ZeroFlowGenesisMeter)item).OnZeroFlowRecordIsDecoded += frmTempCal_OnZeroFlowRecordIsDecoded; + ((ZeroFlowGenesisMeter)item).StartRecordData(); + } + } + #endregion + + Preparation(culture, MeterEnable) + .ContinueWith(async tPrep => await doEmptyPipeCheckEnable(tPrep.Result, culture) + .ContinueWith(async tWait => await doWait(tWait.Result) + .ContinueWith(async tBubble => await doBubble(tBubble.Result) + .ContinueWith(async tTempCal => await doTempCalibration(tTempCal.Result, upperTempLimit, lowerTempLimit, tempDeviationLimit, culture) + .ContinueWith(async tCompletion => await doCompletion(tCompletion.Result, culture) + .ContinueWith(async tBubbleAfter => await doBubble(tBubbleAfter.Result) + )))))); + + #endregion + + + + + + } + + private async Task doCompletion(bool Ok, CultureInfo culture) + { + if (!Ok) + { + DisplayTempCal.DebugMessage($"APPLICATION:\t\t {ModeString} sequence skipped\n", culture); + DisplayTempCal.DebugMessage(Debugmessages.Line, culture); + MessageBox.Show($"{ModeString} sequence skipped", "Form closing", MessageBoxButtons.OK, MessageBoxIcon.Information); + setGuiToDone(); + return false; + } + #region Completion + CompletionEnable = Ok; + DisplayTempCal.SetProgressPanel(StatusPanelItems.Completion); + DisplayTempCal.StatusLabel("Wait until COMPLETION has finished"); + + var TaskCompletion = Task.Run(() => + { + return CompletionSequences.TotalTempCal(GlobalMeterBatch, CompletionEnable, culture); + }); + CompletionFailed = await TaskCompletion; + var StopSequence = false; + + Ok = DisplayGetSequenceResult(CompletionEnable, CompletionFailed, "COMPLETION sequence", out StopSequence); + if (StopSequence) + { + DisplayTempCal.MeterStatusGreenRed(false, true); + DisplayTempCal.SetProgressPanel(StatusPanelItems.None); + DisplayTempCal.StatusLabel("Press 'PREPARE'"); + DisplayTempCal.DebugMessage($"APPLICATION:\t\t {ModeString} sequence failed\n", culture); + DisplayTempCal.DebugMessage(Debugmessages.Line, culture); + MessageBox.Show($"{ModeString} sequence failed", "Form closing", MessageBoxButtons.OK, MessageBoxIcon.Error); + SetControlElements(true); + gB_Mode.Enabled = true; + gB_Setup.Enabled = true; + btn_Save.Enabled = true; + btn_Clear.Enabled = true; + return false; + } + DisplayTempCal.MeterStatusGreenYellow(false, true); + DisplayTempCal.DebugMessage($"APPLICATION:\t\t {ModeString} sequence successful\n", culture); + DisplayTempCal.DebugMessage(Debugmessages.Line, culture); + MessageBox.Show($"{ModeString} sequence successful", "Form closing", MessageBoxButtons.OK, MessageBoxIcon.Information); + setGuiToDone(); + + + return true; + + #endregion + } + + private void setGuiToDone() + { + DisplayTempCal.StatusLabel("Press 'PREPARE'"); + DisplayTempCal.SetProgressPanel(StatusPanelItems.None); + + Invoke(new Action(() => + { + SetControlElements(true); + gB_Mode.Enabled = true; + gB_Setup.Enabled = true; + + btn_Save.Enabled = true; + btn_Clear.Enabled = true; + + })); + } + + private async Task doTempCalibration(bool Ok, Double upperTempLimit, Double lowerTempLimit, Double tempDeviationLimit, CultureInfo culture) + { + if (!Ok) + { + return false; + } + #region Temperature calibration + TempCalEnable = Ok; + var TaskTemp = Task.Run(() => + { + return TempCalibrationSequences.TotalTempCal(GlobalMeterBatch, TempCalEnable, GetAdjustmentSelectedStatus(), upperTempLimit, lowerTempLimit, tempDeviationLimit, culture, this); + }); + + + + TempCalFailed = await TaskTemp; + + if (TempCalFailed) + { + DisplayTempCal.MeterStatusGreenRed(false, true); + DisplayTempCal.SetProgressPanel(StatusPanelItems.None); + SetControlElements(true); + gB_Mode.Enabled = true; + gB_Setup.Enabled = true; + btn_Save.Enabled = true; + btn_Clear.Enabled = true; + return false; + } + DisplayTempCal.MeterStatusGreenRed(true, true); + return true; + + #endregion + + } + + private async Task doBubble(bool Ok) + { + if (!Ok) + { + return false; + } + #region Bubbles + Invoke(new Action(() => + { + pB_Bubbles1.Visible = true; + })); + + await Task.Run(() => Misc.WaitNSeconds(1, true)); + Invoke(new Action(() => + { + pB_Bubbles1.Visible = false; + })); + return Ok; + #endregion + } + + + private async Task doWait(bool Ok) + { + if (!Ok) + { + return false; + } + #region Wait for two minutes + var StopSequence = false; + DisplayGetSequenceResult(EmptyPipeCheckEnable, EmptyPipeCheckFailed, "WAIT FOR STABILIZATION sequence", out StopSequence); + var TaskWait = Task.Run(() => + { + DisplayTempCal.WaitForStabilizationTempCal(Ok, StopSequence, 2); + }); + + + + + await TaskWait; + if (StopSequence) + { + DisplayTempCal.MeterStatusGreenRed(false, true); + DisplayTempCal.SetProgressPanel(StatusPanelItems.None); + SetControlElements(true); + gB_Mode.Enabled = true; + gB_Setup.Enabled = true; + btn_Save.Enabled = true; + btn_Clear.Enabled = true; + return false; + } + DisplayTempCal.MeterStatusGreenRed(true, true); + return Ok; + + #endregion + } + + private async Task doEmptyPipeCheckEnable(bool result, CultureInfo culture) + { + if (!result) + { + return false; + } + #region Empty pipe mode check + EmptyPipeCheckEnable = result; + + var TaskEmpty = Task.Run(() => + { + return !EmptyPipeCheckSequences.TotalTempCal(EmptyPipeCheckEnable, GlobalMeterBatch, culture); + }); + + + EmptyPipeCheckFailed = await TaskEmpty; + bool StopSequence = false; + DisplayGetSequenceResult(EmptyPipeCheckEnable, EmptyPipeCheckFailed, "EMPTY PIPE CHECK sequence", out StopSequence); + if (StopSequence) + { + DisplayTempCal.MeterStatusGreenRed(false, true); + DisplayTempCal.SetProgressPanel(StatusPanelItems.None); + SetControlElements(true); + gB_Mode.Enabled = true; + btn_Save.Enabled = true; + btn_Clear.Enabled = true; + + } + DisplayTempCal.MeterStatusGreenRed(true, true); + #endregion + + return EmptyPipeCheckFailed; + } + + + private void btn_TempCal_Start_Click(object sender, EventArgs e) + { + + + + + CultureInfo Culture = GetGlobalCulture(); + String Password = GetPassword(); + String TransferMode = GetTransferMode(); + String SerialPortCmdChannel = GetSerialPortCmdChannel(); + + const Double UpperTempLimit = 35; + const Double LowerTempLimit = 15; + const Double TempDeviationLimit = (Double)0.5; + + try + { + //todo add form roland + //var currentUsage = new LastUsage() { Password = Password, RequestPortType = TransferMode, RequestPortName = SerialPortCmdChannel, StreamingPortName = lB_Comport_DataInterface.SelectedItem.ToString() }; + + //var text = JsonConvert.SerializeObject(currentUsage); + //File.WriteAllText("lastUsage.json", text); + + } + catch (Exception exception) + { + + } + + + try + { + TempCal_Start(Password, TransferMode, SerialPortCmdChannel, UpperTempLimit, LowerTempLimit, TempDeviationLimit, Culture); + } + catch (Exception ex) + { + GlobalMeterBatch?.RemoveAllMeters(); + DisplayTempCal.DebugMessage($"Exception:\t\t{ex.Message} \n", Culture); + } + finally + { + + } + } + + + private DateTime? lastUpdate0; + private DateTime? lastUpdate1; + private DateTime? lastUpdate2; + + + private void frmTempCal_OnZeroFlowRecordIsDecoded(object sender, CalibrationRecordWithMeterNumber decodedDataAndMeterNr) + { + CultureInfo Culture = frmTempCalibration._frmTempCalibration.GetGlobalCulture(); + #region Definitions and initializations + var decodedDate = decodedDataAndMeterNr; + var MeterNumber = decodedDataAndMeterNr.MeterNumber; + var data = ((CalibrationRecord)decodedDate.CalibChl); + //todo make new imesturementrecord according to units need by zeroflow app + data.TotalTimeOfFlightS = data.TotalTimeOfFlightS * 1000000; + Double temp = data.DeltaTimeOfFlightS; + //data.DeltaTimeOfFlightS = data.DeltaTimeOfFlightS * (1.0 / 0x4000000000); // 2^38; + data.AmplitudeUpV = data.AmplitudeUpV * 1000.0; + data.AmplitudeDownV = data.AmplitudeDownV * 1000.0; + + //todo check performance -> into ram + #endregion + #region Add to list h-protocol + UInt16 Path = (UInt16)(decodedDate.CalibChl.Channel - 1); + //todo check if isValid == crc Ok + if (decodedDate.CalibChl.IsValid) + { + #region Activity check for empty pipe test + LineCounterEmptyPipeTest[Path] = Counters.SetCountersTempCal(EnableIndicatorEmptyPipeTest, Path, LineCounterEmptyPipeTest); + #endregion + #region Activity check for temperature pipe test + LineCounterTemperatureTest[Path] = Counters.SetCountersTempCal(EnableIndicatorTempTest, Path, LineCounterTemperatureTest); + #endregion + } + #endregion + #region Copy to global object + + + DecodedAllMeters[Path] = ((CalibrationRecord)decodedDate.CalibChl.Clone()); + + if (frmTempCalibration._frmTempCalibration.GetLoggingIndicatorTempTest()) + { + try + { + String time = DateTime.Now.ToString(Formats.RawDataDateTimeLogString, Culture); + // SetDataToLog($"{GetDataToLog()} {time} {decodedDate.RawData}\n"); + SetDataToLog($"{GetDataToLog()} {time} {Path.ToString(Culture)} {Math.Round(DecodedAllMeters[Path].TemperatureDegC, 4).ToString(Culture)}\n"); + } + catch (Exception ex) + { + + } + } + + #endregion + } + + private void frmTempCalibration_Load(object sender, EventArgs e) + { + rB_Adjustment.Checked = true; + String[] ListOfComPorts = SerialPort.GetPortNames(); + for (UInt16 i = 0; i < ListOfComPorts.Count(); i++) + { + lB_Comport_CmdInterface.Items.Add(ListOfComPorts[i]); + lB_Comport_DataInterface.Items.Add(ListOfComPorts[i]); + } + + if (!File.Exists("lastUsage.json")) return; + + try + { + using (var tr = new StreamReader("lastUsage.json")) + { + //todo add from roland + //var _fileString = tr.ReadToEnd(); + //var lastConfig = JsonConvert.DeserializeObject(_fileString); + //lB_Comport_CmdInterface.SelectedItem = lastConfig.RequestPortName; + //lB_Comport_DataInterface.SelectedItem = lastConfig.StreamingPortName; + //lBTransferMode.SelectedItem = lastConfig.RequestPortType; + //tBPassword.Text = lastConfig.Password; + } + } + catch (Exception exception) + { + + } + + + } + + + private void btn_refresh_Click(object sender, EventArgs e) + { + lB_Comport_CmdInterface.Items.Clear(); + lB_Comport_DataInterface.Items.Clear(); + String[] ListOfComPorts = SerialPort.GetPortNames(); + for (UInt16 i = 0; i < ListOfComPorts.Count(); i++) + { + lB_Comport_CmdInterface.Items.Add(ListOfComPorts[i]); + lB_Comport_DataInterface.Items.Add(ListOfComPorts[i]); + } + } + + //private void btnAutoDetect_Click(object sender, EventArgs e) + //{ + // CultureInfo Culture = GetGlobalCulture(); + // String Password = GetPassword(); + + // DisplayTempCal.DebugMessage("APPLICATION:\t\t AUTODETECT started\n", Culture); + // DisplayTempCal.StatusLabel("Wait until AUTODETECT has finished"); + // DisplayTempCal.SetProgressPanel(StatusPanelItems.Detect); + // Misc.WaitNSeconds(1, true); + + // Boolean PasswordOK = false; + + // PasswordOK = Misc.OnlyHexInString(Password) && (Int16.Equals((Int16)Password.Count(), (Int16)12)); + + + // if (PasswordOK) + // { + // try + // { + // gB_Setup.Enabled = false; + // btn_TempCal_Detect.Enabled = false; + // gB_Mode.Enabled = false; + // gB_SetTemperature.Enabled = false; + // btn_Save.Enabled = false; + // btn_Clear.Enabled = false; + + // var allPorts = SerialPort.GetPortNames(); + // if (allPorts.Length < 2) + // { + // throw new ApplicationException("No COMPORTS found"); + // } + // List useAblePorts = new List(); + // foreach (var portname in allPorts) + // { + + // DisplayTempCal.DebugMessage($"APPLICATION:\t\t Check port {portname}\n", Culture); + // Misc.WaitNMilliseconds(100); + + // try + // { + // using (var sp = new SerialPort(portname)) + // { + // sp.Open(); + // sp.Close(); + // useAblePorts.Add(portname); + + // DisplayTempCal.DebugMessage($"APPLICATION:\t\t {portname} OK\n", Culture); + // Misc.WaitNMilliseconds(100); + // } + // } + // catch (Exception) + // { + + // } + // } + // //useAblePorts.Add("COM1"); + // //useAblePorts.Add("COM2"); + // //useAblePorts.Add("COM3"); + // //useAblePorts.Add("COM94"); + + + // useAblePorts.Add("COM107"); + // useAblePorts.Add("COM108"); + // //useAblePorts.Add("COM109"); + // //useAblePorts.Add("COM110"); + + // int hitCount = 0; + // PortConfig hitRequestPort; + // foreach (var PortName in useAblePorts) + // { + + // try + // { + // var altPort = hitCount + 1; + // if (altPort >= allPorts.Length) + // { + // altPort = 0; + // } + + // var tmpPortRequest = new PortConfig() { BaudRaterialPort) }; + + + // using (var tmpMeter = new GenesisMeter(0, tmpPortRequest, null, false)) + // { + // using (var mb = new MeterBatch()) + // { + // mb.AddMeter(tmpMeter); + // DisplayTempCal.DebugMessage($"APPLICATION:\t\t Try to login at {PortName}\n", Culture); + // Misc.WaitNMilliseconds(300); + // if (tmpMeter.Login(Password)) + // { + // //hit + // //tmpMeter.WriteRegister(Register.Genesisflow.TriggerActive, new byte[] { 0, 0, 0, 0 }, true); + // tmpMeter.WriteRegister(Register.Genesisflow.SampleRate, new byte[] { 1, 0, 0, 0 }, true); + // tmpMeter.WriteRegisterSafe(Register.Genesisflow.LedMode, + // LedMode.FlowTestAndCalibData.GetHashCode()); + // hitRequestPort = tmpPortRequest; + // mb.RemoveAllMeters(); + // //MessageBox.Show($"Find Comport {tmpPortRequest.SerialPort.PortName} as Request"); + // break; + + // } + // else + // { + // mb.RemoveAllMeters(); + // } + // } + // } + + + // } + // catch (Exception) + // { + + // } + // hitCount = hitCount + 1; + // } + + // var hitStreamingPort = ""; + // if (hitRequestPort != null) + // { + // foreach (var streaming in useAblePorts) + // { + // try + // { + // if (hitRequestPort.SerialPort.PortName != streaming) + // { + // using (var tmpSerialPort = new SerialPort(streaming, 115200)) + // { + // tmpSerialPort.ReadTimeout = 1000; + // tmpSerialPort.Open(); + // var result = tmpSerialPort.ReadLine(); + // if (result.Contains("@")) + // { + // hitStreamingPort = streaming; + // } + // } + // } + // } + // catch (Exception exception) + // { + // Console.WriteLine(exception); + // } + // } + // } + // if (hitRequestPort == null) + // { + // DisplayTempCal.SetProgressPanel(StatusPanelItems.None); + // MessageBox.Show("No request port found", "Form closing", MessageBoxButtons.OK, MessageBoxIcon.Error); + // } + // else + // { + // DisplayTempCal.DebugMessage("COMMAND CHANNEL:\t Request port found\n", Culture); + // MessageBox.Show("Request port found", "Form closing", MessageBoxButtons.OK, MessageBoxIcon.Information); + // lB_Comport_CmdInterface.SetSelected(lB_Comport_CmdInterface.Items.IndexOf(hitRequestPort.SerialPort.PortName), true); + // if (String.IsNullOrEmpty(hitStreamingPort)) + // { + // DisplayTempCal.SetProgressPanel(StatusPanelItems.None); + // MessageBox.Show("No streaming port found", "Form closing", MessageBoxButtons.OK, MessageBoxIcon.Error); + // } + // else + // { + // lB_Comport_DataInterface.SetSelected(lB_Comport_DataInterface.Items.IndexOf(hitStreamingPort), true); + // DisplayTempCal.DebugMessage("DATA CHANNEL:\t\t Streaming port found\n", Culture); + // MessageBox.Show("Streaming port found", "Form closing", MessageBoxButtons.OK, MessageBoxIcon.Information); + // } + // } + // } + // catch + // { + // DisplayTempCal.DebugMessage("APPLICATION:\t\t AUTODETECT failed!\n", Culture); + // } + + // gB_Mode.Enabled = true; + // gB_Setup.Enabled = true; + // btn_TempCal_Detect.Enabled = true; + // gB_SetTemperature.Enabled = true; + // btn_Save.Enabled = true; + // btn_Clear.Enabled = true; + + // DisplayTempCal.DebugMessage("APPLICATION:\t\t AUTODETECT done\n", Culture); + // DisplayTempCal.StatusLabel("AUTODETECT has finished, Press 'PREPARE'"); + // } + // else + // { + // DisplayTempCal.DebugMessage("APPLICATION:\t\t Password invalid\n", Culture); + // MessageBox.Show("Password invalid", "Form closing", MessageBoxButtons.OK, MessageBoxIcon.Error); + // } + + + + //} + + private void btn_Clear_Click(object sender, EventArgs e) + { + rTB_TempCal.Clear(); + } + + private void btn_Save_Click(object sender, EventArgs e) + { + #region Definitions and initializations + CultureInfo Culture = GetGlobalCulture(); + String SaveDataPathRaw = String.Empty; + Boolean RawDialogOk = false; + String Username = System.Security.Principal.WindowsIdentity.GetCurrent().Name; + String ClosingPath = DataLogging.DefaultPath;// + "GenesisZeroFlow_EventLogging_" + TimeForFilename + ".txt"; + String TimeForHeader = String.Empty; + #endregion + #region Logfile + try + { + RawDialogOk = Files.SaveFiledialogTempCalTxt(out SaveDataPathRaw, ClosingPath, PcbId, out TimeForHeader, Culture); + if (RawDialogOk) + { + String SwVersion = this.Text.Replace("SENSUS Hannover - Temperature Calibrator ", String.Empty); + String Data = rTB_TempCal.Text; + String Header = $"Filename = {Path.GetFileName(SaveDataPathRaw)}; User = {Username}; Date/Time = {TimeForHeader}; PcbID: {PcbId}; SW-Version {SwVersion}\n"; + Task.Run(() => + { + Logging.WriteToFile($"{Header}{Data}", SaveDataPathRaw); + }); + } + } + catch (Exception ex) + { + + ErrorLog.Log(LogErrReason.Exeption, "btn_Save_Click() failed", $"0x{ex.HResult.ToString("X", Culture)}", String.Empty, Culture); + MessageBox.Show("Log file storage failed", "Form closing", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + #endregion + } + + private void frmTempCalibration_FormClosing(object sender, FormClosingEventArgs e) + { + GlobalMeterBatch.Dispose(); + Environment.Exit(0); + } + + + } +} diff --git a/ZeroFlowTool/frmTempCalibration.resx b/ZeroFlowTool/frmTempCalibration.resx new file mode 100644 index 00000000..de5ef979 --- /dev/null +++ b/ZeroFlowTool/frmTempCalibration.resx @@ -0,0 +1,35735 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + /9j/4AAQSkZJRgABAgEAAAAAAAD/7gAOQWRvYmUAZAAAAAAB/+wAEUR1Y2t5AAEABAAAAFAAAP/bAEMA + AgICAgICAgICAgMCAgIDBAMCAgMEBQQEBAQEBQYFBQUFBQUGBgcHCAcHBgkJCgoJCQwMDAwMDAwMDAwM + DAwMDP/bAEMBAwMDBQQFCQYGCQ0LCQsNDw4ODg4PDwwMDAwMDw8MDAwMDAwPDAwMDAwMDAwMDAwMDAwM + DAwMDAwMDAwMDAwMDP/AABEIASMCWAMBEQACEQEDEQH/xAAfAAAABwEBAQEBAAAAAAAAAAAEBQMCBgEA + BwgJCgv/xAC1EAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi + 8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE1OT0ZXWFlaW1 + xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZqbnJ2en5KjpKWmp6 + ipqqusra6vr/xAAfAQACAgMBAQEBAQAAAAAAAAABAAIDBAUGBwgJCgv/xAC1EQACAgECAwUFBAUGBAgD + A20BAAIRAwQhEjFBBVETYSIGcYGRMqGx8BTB0eEjQhVSYnLxMyQ0Q4IWklMlomOywgdz0jXiRIMXVJMI + CQoYGSY2RRonZHRVN/Kjs8MoKdPj84SUpLTE1OT0ZXWFlaW1xdXl9UZWZnaGlqa2xtbm9kdXZ3eHl6e3 + x9fn9zhIWGh4iJiouMjY6Pg5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6vr/2gAMAwEAAhEDEQA/APv5 + irsVdirsVdirsVdirsVdirsVdirsVea/nF/5LHzn/wBs9v8AiS5qu3P8Sy/1XE139xL3Py9zyN5F2Kux + V2KuxV2KuxV2KuxV2Kv1C/J3/wAlj5M/7Z6/8SbPXOw/8Sxf1XrtD/cR9z0rNq5bsVdirsVdirsVdirs + VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs + VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirzf830eT8s/OSRo0jtp7BU + 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 + kKU8c23ZXa0uzzIxiDxVz8nB12hjqgATVPkz/olf5A/8ur5g/wCkK1/rm6/0YZf9Tj8y6/8AkGH88u/6 + JX+QP/Lq+YP+kK1/rj/owy/6nH5lf5Bh/PLv+iV/kD/y6vmD/pCtf64/6MMv+px+ZX+QYfzy7/olf5A/ + 8ur5g/6QrX+uP+jDL/qcfmV/kGH88u/6JX+QP/Lq+YP+kK1/rj/owy/6nH5lf5Bh/PLv+iV/kD/y6vmD + /pCtf64/6MMv+px+ZX+QYfzy7/olf5A/8ur5g/6QrX+uP+jDL/qcfmV/kGH88u/6JX+QP/Lq+YP+kK1/ + rj/owy/6nH5lf5Bh/PLKvL//AD7B/JLT5Yp9f82+bfMRjILWqz2lnbydahxHbPLTp9mQfjtTl9rdTL6Y + xHzP6f0M4dhYRzJPyfbf5Z/k5+Wf5O6VLpH5ceULHyzbXJU31xCHlurkr9kz3UzSTS0qaBnIFTSmaDV6 + 7NqpcWWRP3D3Dk7TBpseAVAU9MzEb3Yqo3Fvb3lvPaXcEd1a3UbQ3NtMoeOSNwVZHVgQysDQg9cIJBsI + IvYvibz/AP8APvf/AJxx88XVxf2Oh6l5Avrkl5W8s3Ygty5JNRa3MdzAi/5MSIKdKZv9N7S6zCKJEh/S + H6RR+brM3Y+nyGwDH3PE7j/n1j+XDTO1r+aHmSGA09OOW2s5XGwrV1WMHf8AyRmePa/N1xx+ZcU9g4/5 + x+xR/wCiV/kD/wAur5g/6QrX+uH/AEYZf9Tj8yv8gw/nl3/RK/yB/wCXV8wf9IVr/XH/AEYZf9Tj8yv8 + gw/nl3/RK/yB/wCXV8wf9IVr/XH/AEYZf9Tj8yv8gw/nl3/RK/yB/wCXV8wf9IVr/XH/AEYZf9Tj8yv8 + gw/nl3/RK/yB/wCXV8wf9IVr/XH/AEYZf9Tj8yv8gw/nl3/RK/yB/wCXV8wf9IVr/XH/AEYZf9Tj8yv8 + gw/nlN9J/wCfW/5R28qvrX5g+bdTjVqmG1+o2nJafZJa3nPXrSm3h1yuftdqD9MIj5n9IZR7BxDnI/Y+ + vfyi/wCcY/yW/JCQ3vkPyfDBrzIY5fNGoO17qRVhxZUnmJ9JWGzLEEU9wc0ut7W1Os2yS27hsP2/F2On + 0OHBvAb9/V77mtct2Kvhf8/P+cGPKn5+fmFc/mFq/nrVtAvLmxtbFtOs7aCWILaqVDBpDWprvnQ9m+0O + TRYfCjAEWTvfV1Wr7KjqMnGZEPFv+iV/kD/y6vmD/pCtf65n/wCjDL/qcfmXG/kGH88u/wCiV/kD/wAu + r5g/6QrX+uP+jDL/AKnH5lf5Bh/PLv8Aolf5A/8ALq+YP+kK1/rj/owy/wCpx+ZX+QYfzy7/AKJX+QP/ + AC6vmD/pCtf64/6MMv8AqcfmV/kGH88u/wCiV/kD/wAur5g/6QrX+uP+jDL/AKnH5lf5Bh/PLv8Aolf5 + A/8ALq+YP+kK1/rj/owy/wCpx+ZX+QYfzy7/AKJX+QP/AC6vmD/pCtf64/6MMv8AqcfmV/kGH88tj/n1 + h+X9RX81PMJHcCztB/HH/Rhl/wBTj8yv8gw/nl6T5T/59q/849aBdx3muXPmbztwNW0/Ur+O3tTQkj4b + CC2l+dZcxM3tVq5io8MfcN/tJH2N2PsTBE2bPx/U+5vK3lPyz5I0Oy8teUNCsvLmg6evGz0uwhWGFK9W + ooFWbqzGpJ3JJzn82aeaRnMkk9S7XHjjjHDEUGQ5UzdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir + sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirw3/AJyH/MzXvyl/Le584eXLSwvdThv7S1WD + Uo5ZIOE7EMSsMsLVFNvizadj6KGs1AxzJAonbnt7wXQe0vauXszRnPiAMrA9V1v7iPvfKv5Mf85f/mV+ + Yv5neU/Jet6H5ZtdL164mivLixtrxLhRHbyyj02kvZVBqg6qds33aXs7p9Np55YylY7yK5jyeQ7D9tdZ + rtbjwZIYxGRN0JXyJ6yPd3P0czjX052KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV+SOp/mT+Yk + f/OV8flyPz95jTy8fzKtLA6Euq3YsvqranHG0H1cS+n6ZQlSnGlNqZ6DDRYD2Zx+HHi8Im6F3w87rm+N + Ze1NWO3fC8afB44HDxS4a4wKq6ryfrdnnz7K7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY + q7FXYq7FX5I/85YfmT+Ynlz87fMek+XvP3mPQdLgtNOaDTdO1W7tbdC9pEzlYopVUFiSTQbnPQewNFgy + 6OMp44k2dyATz9z417YdqavB2lOGLNOMQI7CUgPpHQF+t2efPsrsVdirsVdirsVdirsVdirsVdirsVdi + rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVfJP/ADmv/wCSMv8A/tsad/xNs6D2Z/xw + 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 + dirsVdirsVdirsVf/9k= + + + + + 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 + xCU28YlRnGIVr5jFLXbxi2EcYxnPOIQBAQA7 + + + + + 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 + jpnmkORYIhCzzdGGmtl33h7/GnK8pflJJ500KM1NlG/fvj3s2oW/4PR4PB5Pv8Wlucfj8XhGZNu2jwf+ + 3SvMP/zw/TgAmDPn7vDQI1viQGa8pfmrb70W+4XgxnWI81lHHhb7xnaw9GzC+nRp3iZKhJeg+tQoqc3H + Tw1N/fcKS+saVF/8nGqC+7I2e252A/dlbakM7xYlwq0tB9fWwFK7BhPhOVQti/ASlAhnQa7g2hqUCC+B + pXYNJsJzqNpUjHeCpXYNLMgVqjaV4d2iRDhLbwXXKlQti+4mWJArVC2L7iZYkCtULYvuJliQK1StkuM5 + WHorWJArVK2S4zlYejfRr9J8+cplYeXqFXG2OWQ5JnSgDnJ8vKU51jSfMmVKPJfm5VggzT/+GOfWHo/H + 4+mnuDT3eDwez4hgTfPdu3eGnTtxwr8nHHnkEeHee++Jg5h1G9aOuzRHX6+9/XpsR3+owyxz9INlW+w2 + 3WB9ujRvEyXCS1B9auw4yR0/NTT13yt2zNei+uLnVBPcl7XZc7MbuC9rYxFeghLh1paDa2tgqV2DifAc + qpZFeAlKhLMgV3BtDUqEl8BSuwYT4TlUbSrGO8FSuwYW5ApVm8rwblEinKW3gmsVqpZFdxMsyBWqlkV3 + EyzIFaqWRXcTLMgVqlbJ8RwsvRUsyBWqVsnxHCy9m+hHaf4PX/5SFOUQ45DiOB9duHhBFOC4zXhL82OO + OSYceuihcXb53//+93hOjeu8trnH4/F4+icuzT0ej8cjMrQ0y+9//9s403zt2tVx8PLAlvsnxPIsuA2u + W519CWipFLY+XZq3iRLhJag+Nfb7zx0/NTT13yt2zNei+uLnVBPcl7XZc7MbuC9rS2V4tygRbm05uLYG + lto1mAjPoWpZhJegRDgLcgXX1qBEeAkstWswEZ5D1aZivBMstWtgQa5QtakM7xYlwll6K7hWoWpZdDfB + glyhall0N8GCXKFqWXQ3wYJcoWqVHM/B0lvBglyhapUcz8HSu4l+lObXXn9N+MKXjgqLliyMsnz+wnlx + XfNlK5aGOXPvmRBrmp922mmDS7Ts2LEjXiK///3v913zeDweT7/EpbnH4/F4RmT79k8G/h36MtCDD54R + 7rxzdli1ZmBAtnLZuEtz9PeTX/409gVx8svf/SpMmjYpCiNIb5aeTVifLs3bRInwElSfGiW1+fipoan/ + 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 + RxGUa4reUxGKz/lzA3NHc8vR/OY7bhluvf1gN9960wjnN9x0/RacX3v9NbPQ/OOf/Ng2OL/wgx8YPnDR + BVtwfva57x/OfN8Zw+lnnjacevopw8mnnjQcf+Jxw3uPf8/wnve8Z3xNc3uGub9vYG5v65nmNTU1Nes3 + heY1NTU1GzqF5stqEXrdos9pEX1NdjaC8J7onIv8NrNb0XXRbTdbC9+r1OK33ufm5JdR1NZzTeWXUdTW + c1G6m0kBPJOidiaH8CjaJRCfE0G4H4vS3UwK4JkUtTM5hEfRLuF4VIvgvRGE99TC+LIIwhW9Kd2laJdw + PKpF8N4IyjWC8J4IyrUWwXtT9KYUyCnaJRyPUvSmHMKjaJdwPIqgXFP0nipC8ak/b9HcsHwKzQ3MdwLN + zz3/nG409wrNa2pqatZvCs1rampqNnQKzZfVIvS6RZ/TIvqa7GwE4T3RORf5bWa3ouui2262Fr5XqcVv + vc/NyS+jqK3nmsovo6it56J0N5MCeCZF7UwO4VG0SyA+J4JwPxalu5kUwDMpamdyCI+iXcLxqBbBeyMI + 76mF8WURhCt6U7pL0S7heFSL4L0RlGsE4T0RlGstgvem6E0pkFO0SzgepehNOYRH0S7heBRBuaboPVWE + 4lN/XmheU1NTU/N6TaF5TU1NzYZOofmyWoRet+hzWkRfk52NILwnOuciv83sVnRddNvN1sL3KrX4rfe5 + OfllFLX1XFP5ZRS19VyU7mZSAM+kqJ3JITyKdgnE50QQ7seidDeTAngmRe1MDuFRtEs4HtUieG8E4T21 + ML4sgnBFb0p3KdolHI9qEbw3gnKNILwngnKtRfDeFL0pBXKKdgnHoxS9KYfwKNolHI8iKNcUvaeKUHzq + z/cqmttrmrdornBeaF5TU1OzflNoXlNTU7OhU2i+rBah1y36nBbR12RnIwjvic65yG8zuxVdF912s7Xw + vUotfut9bk5+GUVtPddUfhP1ouEAAP/0SURBVBlFbT0XpbuZFMAzKWpncgiPol0C8TkRhPuxKN3NpACe + SVE7k0N4FO0Sjke1CN4bQXhPLYwviyBc0ZvSXYp2CcejWgTvjaBcIwjviaBcaxG8N0VvSoGcol3C8ShF + b8ohPIp2CcejCMo1Re+pIhSf+vNC85qampqa12sKzWtqamo2dArNl9Ui9LpFn9Mi+prsbAThPdE5F/lt + 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 + NOefIc15/2Rb4DNeZDgnbzpGRfUHaVbHczRpYSd/x2U09s52Kl/8GFUs4TyydA6NWX7XGWmebXmD9y8c + F9rk3Lf3FSrtfommNu2l7/yfRCXtr9OETW/Rp9fv5P0/m4rWHqLibq7fBjd2rlvxxANpDjGOfu2kOfY9 + pHnbiVw5+m7b6X5pPpcmrX4oJ80b+6X56u3upj1I88yyOGl+h3NPmZLLKHvdKsre1Eglt7Z7aR7y8tI8 + 7KWkebrpWfjn9ZB3XKfxIGV7OCh35+aDylR+mm5cu46mrX1kSNI808DfxYOpfMuXqaSXv6d8Ll3W/JS7 + Cx13slqD0ZMML829NMddFdNadvTfaX6I+wWmZ1HSnC/M8vAfHv3rP4YvHDI1e6lyw5s0dj3XqVpEk1qf + dXdoFNftoupuPqmt5AuRFl5Xd2e5FuZKmruLVn6PkeaZ1XzMEE+6jtPEDj7OBVMoL5NPn/38+/TH3/sq + ffyTHzjhAWkD8QSRB5mJC3tIVcjw4NQsGrnLHKA+lkUbIsEyRXmuDu5KFxGABAIJBepo6TQawfQrMgUL + 7i6HNMfdtpiaAlOIyJ3m+w/sc8lofmGeu3MISRGSIyROkBsQMBBHOBbYNyLSRChCcIpohYwV6awFtcUn + QZpjfTFfNvYnRCz27+//6Xcu2dSC3EKvq5R5aT6A9K+0iDSHeMExgjTHfOZ499I8Ht2WlGmRHYduS8q0 + yI5DtyVlWorHoduSsqAMT4olwqUsDF03DUEJPlgsOR6GJcKlLAxdNw1aiscRlNtAysLQdS2sulp0xyEi + PAyrriXHw7DkeBiWCNeC3ELXtdCC3MKqa4nxKIZTmt//wH3uv8UgzyHL8TPOGY8+/gjte2Gvm6sbD7ZE + /EMfxLriWP7jv/6Tiyk6vo5GcI2MOIX4inMc4jTGZUFJoSvD9SGuH/HwbDwb5I+/yX3y63y8v/olN4Wf + vtMcN13geEGc4zi9evoUPf/Si7Tn0EF69vnn6Old22j7Uw/Tk/13mm958F56ePtOyoyfSZnqT9MVTY9T + duXj/fN/c56F6SaHKM3zIOY4j0MeCGmev2obFa9+inOz+VS96hF3p3nmtnWUx3lp4cLNVOgk2gOUWQCh + dp6lOeeqcdI8Nz2Ll+bnSvOT/Xeany3Ny+ZvovIb63mffYrGLeqgovkPUNUyPgblN1DF4nW2NMd0w/3S + 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 + BeOqAAAAAElFTkSuQmCC + + + + + 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 + Rmv0RnN0R3v0R4N0SIv0SJN0SZv0SaP0MQcEADs= + + + + + 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 + 2kvTYnofrV3qDQcPyCgC0J9qIgAAOw== + + + + + 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 + xCU28YlRnGIVr5jFLXbxi2EcYxnPOIQBAQA7 + + + + + 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 + jpnmkORYIhCzzdGGmtl33h7/GnK8pflJJ500KM1NlG/fvj3s2oW/4PR4PB5Pv8Wlucfj8XhGZNu2jwf+ + 3SvMP/zw/TgAmDPn7vDQI1viQGa8pfmrb70W+4XgxnWI81lHHhb7xnaw9GzC+nRp3iZKhJeg+tQoqc3H + Tw1N/fcKS+saVF/8nGqC+7I2e252A/dlbakM7xYlwq0tB9fWwFK7BhPhOVQti/ASlAhnQa7g2hqUCC+B + pXYNJsJzqNpUjHeCpXYNLMgVqjaV4d2iRDhLbwXXKlQti+4mWJArVC2L7iZYkCtULYvuJliQK1StkuM5 + WHorWJArVK2S4zlYejfRr9J8+cplYeXqFXG2OWQ5JnSgDnJ8vKU51jSfMmVKPJfm5VggzT/+GOfWHo/H + 4+mnuDT3eDwez4hgTfPdu3eGnTtxwr8nHHnkEeHee++Jg5h1G9aOuzRHX6+9/XpsR3+owyxz9INlW+w2 + 3WB9ujRvEyXCS1B9auw4yR0/NTT13yt2zNei+uLnVBPcl7XZc7MbuC9rYxFeghLh1paDa2tgqV2DifAc + qpZFeAlKhLMgV3BtDUqEl8BSuwYT4TlUbSrGO8FSuwYW5ApVm8rwblEinKW3gmsVqpZFdxMsyBWqlkV3 + EyzIFaqWRXcTLMgVqlbJ8RwsvRUsyBWqVsnxHCy9m+hHaf4PX/5SFOUQ45DiOB9duHhBFOC4zXhL82OO + OSYceuihcXb53//+93hOjeu8trnH4/F4+icuzT0ej8cjMrQ0y+9//9s403zt2tVx8PLAlvsnxPIsuA2u + W519CWipFLY+XZq3iRLhJag+Nfb7zx0/NTT13yt2zNei+uLnVBPcl7XZc7MbuC9rS2V4tygRbm05uLYG + lto1mAjPoWpZhJegRDgLcgXX1qBEeAkstWswEZ5D1aZivBMstWtgQa5QtakM7xYlwll6K7hWoWpZdDfB + glyhall0N8GCXKFqWXQ3wYJcoWqVHM/B0lvBglyhapUcz8HSu4l+lObXXn9N+MKXjgqLliyMsnz+wnlx + XfNlK5aGOXPvmRBrmp922mmDS7Ts2LEjXiK///3v913zeDweT7/EpbnH4/F4RmT79k8G/h36MtCDD54R + 7rxzdli1ZmBAtnLZuEtz9PeTX/409gVx8svf/SpMmjYpCiNIb5aeTVifLs3bRInwElSfGiW1+fipoan/ + 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 + RxGUa4reUxGKz/lzA3NHc8vR/OY7bhluvf1gN9960wjnN9x0/RacX3v9NbPQ/OOf/Ng2OL/wgx8YPnDR + BVtwfva57x/OfN8Zw+lnnjacevopw8mnnjQcf+Jxw3uPf8/wnve8Z3xNc3uGub9vYG5v65nmNTU1Nes3 + heY1NTU1GzqF5stqEXrdos9pEX1NdjaC8J7onIv8NrNb0XXRbTdbC9+r1OK33ufm5JdR1NZzTeWXUdTW + c1G6m0kBPJOidiaH8CjaJRCfE0G4H4vS3UwK4JkUtTM5hEfRLuF4VIvgvRGE99TC+LIIwhW9Kd2laJdw + PKpF8N4IyjWC8J4IyrUWwXtT9KYUyCnaJRyPUvSmHMKjaJdwPIqgXFP0nipC8ak/b9HcsHwKzQ3MdwLN + zz3/nG409wrNa2pqatZvCs1rampqNnQKzZfVIvS6RZ/TIvqa7GwE4T3RORf5bWa3ouui2262Fr5XqcVv + vc/NyS+jqK3nmsovo6it56J0N5MCeCZF7UwO4VG0SyA+J4JwPxalu5kUwDMpamdyCI+iXcLxqBbBeyMI + 76mF8WURhCt6U7pL0S7heFSL4L0RlGsE4T0RlGstgvem6E0pkFO0SzgepehNOYRH0S7heBRBuaboPVWE + 4lN/XmheU1NTU/N6TaF5TU1NzYZOofmyWoRet+hzWkRfk52NILwnOuciv83sVnRddNvN1sL3KrX4rfe5 + OfllFLX1XFP5ZRS19VyU7mZSAM+kqJ3JITyKdgnE50QQ7seidDeTAngmRe1MDuFRtEs4HtUieG8E4T21 + ML4sgnBFb0p3KdolHI9qEbw3gnKNILwngnKtRfDeFL0pBXKKdgnHoxS9KYfwKNolHI8iKNcUvaeKUHzq + z/cqmttrmrdornBeaF5TU1OzflNoXlNTU7OhU2i+rBah1y36nBbR12RnIwjvic65yG8zuxVdF912s7Xw + vUotfut9bk5+GUVtPddUfhP1ouEAAP/0SURBVBlFbT0XpbuZFMAzKWpncgiPol0C8TkRhPuxKN3NpACe + SVE7k0N4FO0Sjke1CN4bQXhPLYwviyBc0ZvSXYp2CcejWgTvjaBcIwjviaBcaxG8N0VvSoGcol3C8ShF + b8ohPIp2CcejCMo1Re+pIhSf+vNC85qampqa12sKzWtqamo2dArNl9Ui9LpFn9Mi+prsbAThPdE5F/lt + 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 + NOefIc15/2Rb4DNeZDgnbzpGRfUHaVbHczRpYSd/x2U09s52Kl/8GFUs4TyydA6NWX7XGWmebXmD9y8c + F9rk3Lf3FSrtfommNu2l7/yfRCXtr9OETW/Rp9fv5P0/m4rWHqLibq7fBjd2rlvxxANpDjGOfu2kOfY9 + pHnbiVw5+m7b6X5pPpcmrX4oJ80b+6X56u3upj1I88yyOGl+h3NPmZLLKHvdKsre1Eglt7Z7aR7y8tI8 + 7KWkebrpWfjn9ZB3XKfxIGV7OCh35+aDylR+mm5cu46mrX1kSNI808DfxYOpfMuXqaSXv6d8Ll3W/JS7 + Cx13slqD0ZMML829NMddFdNadvTfaX6I+wWmZ1HSnC/M8vAfHv3rP4YvHDI1e6lyw5s0dj3XqVpEk1qf + dXdoFNftoupuPqmt5AuRFl5Xd2e5FuZKmruLVn6PkeaZ1XzMEE+6jtPEDj7OBVMoL5NPn/38+/TH3/sq + ffyTHzjhAWkD8QSRB5mJC3tIVcjw4NQsGrnLHKA+lkUbIsEyRXmuDu5KFxGABAIJBepo6TQawfQrMgUL + 7i6HNMfdtpiaAlOIyJ3m+w/sc8lofmGeu3MISRGSIyROkBsQMBBHOBbYNyLSRChCcIpohYwV6awFtcUn + QZpjfTFfNvYnRCz27+//6Xcu2dSC3EKvq5R5aT6A9K+0iDSHeMExgjTHfOZ499I8Ht2WlGmRHYduS8q0 + yI5DtyVlWorHoduSsqAMT4olwqUsDF03DUEJPlgsOR6GJcKlLAxdNw1aiscRlNtAysLQdS2sulp0xyEi + PAyrriXHw7DkeBiWCNeC3ELXtdCC3MKqa4nxKIZTmt//wH3uv8UgzyHL8TPOGY8+/gjte2Gvm6sbD7ZE + /EMfxLriWP7jv/6Tiyk6vo5GcI2MOIX4inMc4jTGZUFJoSvD9SGuH/HwbDwb5I+/yX3y63y8v/olN4Wf + vtMcN13geEGc4zi9evoUPf/Si7Tn0EF69vnn6Old22j7Uw/Tk/13mm958F56ePtOyoyfSZnqT9MVTY9T + duXj/fN/c56F6SaHKM3zIOY4j0MeCGmev2obFa9+inOz+VS96hF3p3nmtnWUx3lp4cLNVOgk2gOUWQCh + dp6lOeeqcdI8Nz2Ll+bnSvOT/Xeany3Ny+ZvovIb63mffYrGLeqgovkPUNUyPgblN1DF4nW2NMd0w/3S + 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 + BeOqAAAAAElFTkSuQmCC + + + + + R0lGODlhZwKOAocAAAIDCbeRH1dJFwIfRARCb4OGg0BjeNbGiQY2YwFSjiAkJAMuSDhWcixScbOsiSM0 + RMHGwgMwU3hqOwJHfAIOJuHj4QlCaOu2DENFRQc3WAM+czM0MpWkqwoZJQRVkAM6ZB5FcApinw4jNN67 + RkGLuAhKeCAnMc3SzgRbnQUmRAYeNJCTjwUwWk9RTQQ6agQqUBQrPVhlcAJKfq+0sAJDdAYiO3FzcCVf + jQUqSOLl5gpclgFOhv7RRBo3SwVRgjBPZfHx8A0TGCdDWhkwRc63aQQ0VggaLKO2vyNUgMC1hcfMx11z + hhc6WP/ijOO2KYGTnRY9YzhMXcnFqMvV2Xl8eVqDmwJWlkNlYT1UZhI9axMmPF91TwQeOyRHZBJEbwMu + TYmMiQEDE5yJTQQ0WxNNfQU9ZvT19ba7twtYiAIULgM+awNNgBIpRBEcLQJGd5WXlUpMSwJRiM3Pz2Rj + VwJSmP///wQTJydzpgo9XhEnQ2JkYg4vUwclPQc3amlrZwQ4XpqdmtGfCbOdT+bLbMOfMI2GbKebbl5U + JHmUp//rrvvHJYWFPyNjkN/DZf/yzP/aYz9BPv/BAZ6TadGqL9WsFKCkoLa0nOnDSLzCvnNxZ0hyj7em + bqmTOdDFlt24PseqTI10KAdipOnJWyV2sPDEOCQ+VV1ebaapqHSHl3t1WtbCeWJaPcO0e5yOWte6WnZ6 + g4yapfnCFtDOt1tdWzo8OlhaV9PNquLDWThniVJqeH+CfsqpPtvd3CssKhtsqP/eebq/u3F5P+i2GMi8 + ieHKe1lPL6WppePOhtnMlpiqshtjmLyeQBocG++/KP/WVb+gHjxbb/Dt66KdhsC8n9ba1Tl8q01rWC48 + SaKULpiRdiNbhCFLbem+Nlx6jP/ONU2WwIN9YyUuN6mtqmxubCZcc211ewsMDr6nXQQOHFBVW7yuff/m + m//uu//33ot/U6GZf1FTUS9+uIGfs3OFj9HW0py7x9quICdrm3yNmKKMLbTFzScyO05cZ//667ehWjla + eSH/C05FVFNDQVBFMi4wAwEBAAAh+QQBAAAAACwAAAAAZwKOAgAI/wDrCBxIsKDBgwgTKlzIsKHDhxAj + SpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjR + o0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDih1LtqzZoGYEpq2ztq3as3DjjnXLduBauXjz6t3L + t6/fv4ADCx5MuLDhgmaAmIkmx4xjxxAqnaokmTIHypN5Pd6cmLPnxocXmmnseXO0tIo3y5nMGjNlyadV + RwMSO7Tt2xDNrBA34xWVMzOCz6i04k3x48aNrzgFfMaZFRDqKAHTXLj1GbpwI4z2qvr1GcAKVP+oA0Zc + 8zPEV6hPjnzF9TPjCgADdEq7/fsFcxSAAIzKfmAAAoMJBAQWaCCBmAQIwW7RiANdgABikiAmZ4CBH0HR + gAGhgAkCCIGG+m0IzIEk8idggP7xB8ZdF7Z4WA5gKKEEFTESqAQEN5KYI4knAFJeC5XsSCImFroIRI06 + QnDCG7MYQ4WNUOJYYokzxjgdiy5mKVg0K9BzAo30yCHjmGSWaSY9lbwBAQbGUCOmmGauwBKWPdGZ2won + vGkmNW/MAYwuJ5gp6Jh5kikHmCcUqeWieZlxApErFKBeAXroQsUsc1Ch6aacduqppn74QQUG43zK6Rzq + pZoqPqoW8EZyr5abA4aqtNZqq6rsKbeqeqze6uuvwAL7hi6vAFLcq29Iqt6stoKRqamgtnAptKba4Oks + emiqB7PKYqIZo+B+xQsgmr5i6SzLKqdrqszW2i6tyhkrLBj0zkrvCvfSq0ut/uFb778AA4zvwAEHTLC9 + 9fqrcL4IL9wwwwgbjLCltIKxr73+Pryura8ed+u7v+r6xr2zvFLOOOOUU0kOdYX/6zJVMOoCxmuVFOAH + IMjmrPPO0uzs889AB/0GzjoTjSzRSL+atNBFM+30000P/bPROVMN9dVYT72tcWC8Mo4fK9j58thJwVeA + OMZQBkgl1hrt9tFA49wz1lZbrfTdU0udtdQ4J2031XbvDbfeT7/ddOBM1x313EtXXbQfCBegiy61vMJL + y2RnbhQmVACCtjHipAnIHLpUsjYgqKeueuqEO9464nG3LvjsiTveN9+436677LVnvTvsQTfu9uqno662 + 6X7YQLClVOgxzhSaR08UBGcbM4M4b1CRydfYhoqyDcxraun4rup9u9Jrm67+8cUT7/7qQ/fN+u/y546+ + +bjn/38+3rTb/nv89qPf+wZ4PPapr3h4e1sBqDA+BjpQF84LlR/0UAs9WFBUC7RBqC4nvQ72JAdUOAVv + wJC8mQkHezjLVvg0Za0WTtCCMLzgBVH2NT+gzIY0LBUYCsDDHvrwh64aoBDdV8DXnG59RzygEWnGxCY6 + 8YlDjGLqIrVDIFoRDBrMRKgyoUUujmN7WtTDHCw4xhhaMBNUsEEmbMBGNmrLDyN7g/qSZYNZzMJa4zDF + OMTmwT7CBAgFqMQMnEQFYwToDMBAJIB0IQ4OdQhCZ/BOcHgjjkpib1nLKlgax2EDTnbyizTEISdDpYcX + mvGUqLRgqWxQjjaysZWvdKUsXf8JS1iycpa4zCUbUwlDU5aSl8nL4fZySMxMyKwA9EImMgVmjLQ5s5mV + aCboePMd4QCiAINUm9RWMA541AJl6MKcH8f5kjPo4gyAGMcbOiQhCEgIE0oozqPeSc8JKfKQ+IzkI0WU + SEUiMpIADWgknXO9UxjUGKeQpjOjydC0OTFSPtSF5CY6uQK8YqIXlahGJ8dRyXW0ohKl6ER5yFGNFiB9 + RXziExFazZZKsqUnpKQlKXm9SdZUpjUtAOgcajrlgEEPcHBeLeRAzqK6xAyvmEw5ZsCfAdnoRjfShZSm + dKAB1fOq9QzQPk/Ez3t2tZ//BKtABQpJfpoVQF7NZyLX+k//gLJVrGOFqXAkWZ2XyvU9d82rXidpg+uF + rqdcA8M4glopoxpWJeE5RV/diaMzrS1QgxqULMjUWKhOdUpWrac7M9tOzdKTQ1x95FbPGsm1vrWtY+0n + XMfK2ta21jnAiS1BYUtb2cY2oLSdbXBsO1eCvlS2ej2DpAbpUJzhS3J+wIAfajGewzqXJCsgVyUKRChZ + nMC6J9jPCbZrXRl1VwmQlRFkwwveyJrXTFO1LFUN1E7GIoixnbUqgjK7Waxilav8HO2G0iqisJ51ta51 + a4AF6tuBAlS33jnPeyrxG3FMpqeTmlwtWlCLGTz3wiGxKBioC97tepgewAADNTwcKBKb/xi83b0uebcr + 3haf98WDqixlLUtjqgppvTiWL3x37NnPZnVC/w2yWgN62gDXtsC+na2C52oDS6YNdRFOIxxaYCE+YvjK + D0lLBV5hgzM4tcPYPQE9qAGINnnJxGhOM5rpgd0Od5jF4y2vnMsb5xKPSU8wNq+UclRj9eL4zwWir6Dt + S2gg47e/pkUrWQcM2wPfFsG6nasuADGDBxMtmWnUAyTGAQQse9oiZgAEHNQ0ICXIgcReGvMKgEGPVIvZ + 1WqOtazT/GY629pMcLqzrgWVa0HJuLJ7jhKfDzRsQPPYqYMm9IkMbWghK/q1jk4yb+06V3pV+sny2uEm + W7ABcXz62/8OmUHqfooB8OBITKgWMzUK8OpWu/vd8IZ3us8863qT+NT4LpQc0C0jOEEWTr3Os4z2PKbG + GrzPfjbQjTHrXs4W+p2HJm2RjQztSFeTmmyrtDZHZrFN6kEBGIgu6oAB7pIPJEOnONdPIZGgp755u/SI + Z7xnTvN4t7vm7n61vdWM71N7mN+FCpSe+N1vX+f64AQ3eJISPiT2uhe+V3Wkfs2KWoo3+tHU/g41qTmc + vhZXOTxMow2Z0QJsMbAccrKyyQ1byWikDQy8uKOHKlvi7VJjBiuoAM2p4W6+w5vvgG914AM/5r4X3uap + TvyZYS3mxpt433W3tdBNTflc4xmqA6f/LJT6bGz2dra+hY54otHK1gEb+LYG1uvWbYpTG9DHdMbdoaU0 + aIMN1MJBZZ6BH0i+dk+boa+YWGDnqDBdCLyp3eqmBnr8PnNqOF/wh2f+8wsvfegzH+eKz7mr6T3rFtu5 + UJWnPK5n/OuFd/7p77WvVoVcddPbFri9vaslWD/TSp5iBp37a+w73kkbfJNTK2AKetB7vgcHNgAGtQAH + cFAAJ1NRlCZCleRXkVQJrfZhjed8zscLGriBFbCBfoeBIBiCUxBv14d9Ord9jhdrp1Z0QxdjmRdsNZZj + 6Qd1oBd1+uVVVQdgcZV6uzVtFpd6vDVJ9TdTujAyJMVC4KSAcEALi6KGAd6kaeNAgFg2GpNDe5cCBvRx + CiODSariB1dgMSLFQ1iILHPTMz0DCNJQWq7VT0oQgtQwBYCHgWP2hhiogSDIC274fCUYePvWgroWcOUX + JevlVFTlcCMCaA5HaPe0iM+GWzSTPkdkPORSUpPzQJYCRhLkPZkQVGwkQRY0C7VQQbUwC/BwR98DPiz/ + I4UmN3IDgm8jOIKtVgHYJFmY0EyWYIsKJU0ZUzAJk0w+tENVJIZiiIWwd0BSBD+V4GWIBleq5X6MlnXW + gR7B8isPw0ItlEZp1EKuhI1udI3XiI2YxIsrkIsLJQ6TMxyAhWmf1AL1oYruODT6VGqG0oa7AWfc9WHY + Z3jON4J6KHhK8E6b5UigBXHHiDrxMz9341GUuJAc5UAOyTzhA5EOSS0UqSwYwywQw4v/shuVtFOfQ47Q + ZB5AuFt7ZVM7RY7isEDiYJD+Mns1xI7u6I44cwQCwmGVRw1gMAP2KGcsRmcq9n3/ZmtAV2t2Zmp2BnD7 + FiZTIAdh0odN2ZR50odS/zmV4lcmB+drw2Z+iAh1ABloPxYhECd6AEKSPghTq4dTMjWE0yQOloA2HylN + IrRAp0A0xyV8XzMOMBmTUgiPNSljlEcN9Sh5KFaUcwaULuZvLkaYAQdwRWeVcGJ8BCImUiIHm3d+M/h5 + EiJ1A4lfUzdkE8daSDaSSqZ6rOdXfhWBQzhT09RMn/OWoCOXEKaOGuQHeamXvYc6+mST5YWTOhleRWmY + dJZicsZviDmcVXmUkQWZlFlwBacPfCYk0FlVPNZwDzch7CSWiRZWrdVPtYVbQVhX8ad1NiWEN3VTaama + TuaW5ChCkzOXHQNRmnKXtWmbq/gGiPRl8wiY4hBzHv8meSnWZt93awEaoMZZJgE3Y/12lZn3glo5iNOZ + iNa5bOv3X9r5mQR2ekf2nXtFU6h5mqd5nujpkbmYkiHEkrJpQ3DQjvQJbmnxKvdpI/qQayegnz1ZYt/1 + m94nlHM2mInJa1VZlc5JJkGKI0PKedEpnTpGiNUZoRKKaP5Ues+IehkKaaR5QvR3PW3JlpaUpW6pnq7J + mirJkvApdrRZH2q3ooYFBIyUm36JbmCACZEnmAMqnHEmoOJ1oyxIKGUSpDAGgxCgD9R1fvKFmdaZmYbK + mUFWodoJbdMGXEtmcVY6nuWJUx+Knh2pnijZnmkSWHYZKi0ACGhactFABc4xd/P/eALUU2e/+Z8EWmKI + SXRkgpx6+qO0inkMeqvBFqhIOp01qH6Z2aTLaKGuVWBY14OjmVdcx6HmaUmVWklcepJvaVArYANzaVxj + WkPOE6rgBgSkGkm6KX7sZqdwlqMDWl7FSaBz1muX55jKCWyUSaTpJYhbOahcCXGHKlqJelpQyp0XKqV0 + RZLIGqloWX+DlJ4deZLkCAh+UK0+JTmtFCqzEIXa+mlA8Aqlip+zWgCFiaNzOq515mI8SXm+KX4Hqme2 + SnDFJq+X+V7z9XCgBazLuKjuF5pJJm0BW1OlyayomZoh+qXQ5Afa5C/CN5sRO7EUqwuwtXlFh6rhGnkq + hmLB/8mxxlmnPeqj48ecBUeZkrmgwiaoNJhZmnmvEypxigpX3QmEQQiw0Iizk2qey/qsTnaLmKpQ6WQM + Bsk1zEO0Emu0V8atF+tyehqucjq4Hzt5hhuyBTp5jWlqfMqn5MecSndjC0evSVqdL9ts+zVkzvh+Nuuo + N5usNzV/zsqzXSqi65lOQZtMs0dKe8u3F8atpYWxx5eq4pqjIduqVXtdt/aj5GVeMYp5kJl0KWtslFuv + hgpk+Eqh+tp+jHpkx1qlbduhOrulTma6uZhODGscR6i3rntlSFWq7qQEjgtZguu0dCqYdEZ0cSacBXqY + VQmIA7ecgVhsOzK5O/Z0S3q5Yv/pXzK7aI7GuTwIngDbUqtXU6LroTy7lpjqmnM5DhuXTL4xm9navRdG + Dd3xoqfKtDXasTz6kzqKo7MaXup6XsaHoH46cJfVeYO6wmGLvGNLdctrtv3auTW7tpJ6ljtLvZZqvdc7 + Dgy7LJKzSX5wRxR8YTNQAPEIuOBFD8bwBtRgu7jrsXYqsogblOJnxbuGtWPiuHvmnPJqv8Xbq/f1q5hb + VqTHvBSHoWlrwzccvTncrKs5twrFNqfTsC45QabQaUV8WOaUxJj3JmjixD4JZq36XZKnvrFqu/P4vlvs + gpjnxSg8vH9WvBC6mclLtsvbvACstuFJwFaalljarAYrxyNaeoCwxzVB3Ek2BA9EtceGFR6xq8RiZrde + Mqu3K6C4S8U8apywWrIkDLnqxXS7imxeuaTX2ZlPisaodXWN5rwKxsZcV55unJqgI7dxrFAiNA4rAGHH + 5ZLOAwfU/+DKr3xOXoaxlMfEb8CfbtaxVCurIPyx49e7eyojQTqk8st5CjfJXxuQX9lsnXnGmazJPviv + nqysA0uwM9WW1wySaSMOynPK3SzEfgAP4SzORQXLGEx3SoDOI0auHfy0TqujVeu+4be4WYyVCBevhfig + LVvJnwWzZiys/TpQGbrGbHxx45nDWtqzq4mSD22tskemeAk9Fk1OwqVILudv6Bxz6Ca15JpiUvubVDvC + J01jWAuZMZjCKtt0yAah9gqs/xzDqKWDnEulnSywOIuaXDq9anmpDM2aB2i32RZ2VPCSHFTUfhQea6XE + YsLR/hnVtWuuvDtZBYpnvnxn84ur9P+70sS8WcZ7vGS8v6bVv4y6yaIJf3o1f24sypfqpaw5otoMWHUp + xN1E1HjdR7A8d5WFbmgCCLW8zn8NteV6uOW6o7tmeVapZ8K71dLpdF0dei4cIflatsPaqGQ5wFVKU6Y5 + uss6yjwsTQ69zVAW0ao8WHd92h1EHC/ql4FCD+6hquUFoHIqdHVKtXrKmLgtcCj7grq6lcfWlT4mkDCN + TwC9naaHZLklwNeh3AXMoaS7027ts6Dz0/vXqdaN3X00M37cmGJGHYcLxR6do7AKz7bdmIeNXkpnIJ3Q + CcPA4Y3QCK4A4h8e4iEu4iRu4iauCsOw4sOgVfca1mWlqDto2Y//+rxyBboGrdPoKbetmYuVkJK6INeo + nEE1BA8WhuAdhIXgQYhl0uBnsMEey6odfGsraKMj64eMWdUDt+Gq8OGX0AzcEAliPuZkXuZmfuZojuYX + AOZOcAuu4Aos3lYxTdlkfXqWjdxmaR38PbCivJafDZLigEXuGVjMU0PpICdILj0KXs4yJnT04OBVTLiG + ad4rZtIWXiZS0Aldfglhnuae/umgHuqg3gzN8OYqTmTKDGA1fdw1fFfR7N+nudbPKqI+++NYtJIFno2h + Ag9vkOiKDgjb3eQbDenmO9shXLt12oIAJwXI0Ai3wA2xIOrSPu3UXu1jTuqXAOfTkMzeiXXF/7pk0JzT + ofuhzV1/psvAYFCisUdSDzvRve7rmrPo5nzOkO7RVj7I5ZreOwonstAJzt4MYn4BAT/wkSDwBU/wBp/w + CL/wB9/wCu/wDP/wEh/xFO8EIwDnpVrc387J0GvQnG2pnr2et26i2lbXu/7u8E420bXdjT7sT47vU26j + g4vesCoLB3ALpGDw1r7zPN/zPr/mrsAK2/6/d47cWQe6bsvWbR3yKCnoJhp2nejuKZ858q7EpoaTL0/F + HEun5+uHSuDvlxDtPj/2ZF/21Q70Qt/MNF2W1IbjOUtJWcrZC/2lgR5C3FzyN5QOKD/1LrPyfZnIgbJh + ky5ehSvhQicmsv9ADF9u9ozf+I4v6qWeBBuP53mO1lsHolt6zV+aUIHeZE8vOVHP63z/MqP6twSHbsL1 + 2rVdo+OtBDa/+BAf+xMv+xRP+7Y/+7hf+7l/+7rf+05ABMNApTfN38uN0AAe8j2OzdOavZhGpqM2+i5T + Ad36900eYur8fVKOnHBy8wCv84///eAf/mrODa4g+QNsVwVcmsWPwOnp5wKOUEBL8p06QeUA/eEi/cDR + XneGbuERcwCh5IRAgicGDiSoRI4SJbJUXYoU6UJEihUtXsSYUeNGjh09fgQZ0uOFEURmnESZUuVJcSxn + tBQHM2bMlzNnGjMmzhJOcTh9/qzkpxIgQG/VVoABU0AXlXHj/OiZZabOVKpVrV7FmlXrVq5dvX4FG1bs + WLJlzZ5Fm1at2RxUzpwBhgnCXIZ1T2AqQK/gXoYHGcqxNYjbxokSIxZGfFixYcaJGy92HBny5MeVJVum + fFnzYpERuRGZthJly5ejS8OsWdPm6pytef70KXSo0aMFqFCx4efprLW9ff8GHlz4cOLFjV9tOwOuXAh1 + Fco5ASzvwoV+/Sq01ahZZ+7dvX8Hz30zZonCXFkSXdolapk629vM2VM+bNhCib55g1QpbqdPpR4HMEAB + /wcksEAD2XJrObrsYggvvaz7ayGHYgmvQgsvxDBDjsxDbyXS1KPJJtVYi8+1nn46BSfZilqhtqVy88MU + 3g6ksUYbb8Qxx63aeiuu5pxTKLrp+hIIOlmIGYy8yzTsbDwnM4NSySifxFAYIjr8MMTTRozJEpt2km8+ + +oypxBj7isovqRd100OP/3SEM04556RTLB4VXFAhhYABQ6/n5JDjgEsK645KQ6fkjElFF/3IiStpSkmm + 1N6DLybXxlSxktmMUpO/3eoENVRRR62xggQxkQvIhegZip6FGrqFQkZnpbXWkRCVkrFIPGFFtfVWC3Gm + GVo7UUzYThkHkE2RAuNFp//afJNUaaelttqxzgDjLVR/hIA6JegBxBhXBbW11kNzPZfQDNVlksMtJaXU + 0krHPKWSGagoYFMXPdXDFGv/BTjgf8XJFq65fqxLDnClIYbCdKPUkMpyb0UX13J51RJYjU28FDZx8DWG + xX1t6C8dOQRGOWWVdZwhW2CAyTNCWzxhF8OHyZs45yZxvbkwK71cjctKjaXv43zv25cpP8aBA5OVn4Y6 + auMI7vHghDshReece+bZYq1tHiE+EUUUm+OiQUZz5EyWhgMCqd+GO+6yWoYLZoQP2O7r787VGyOu+7bI + E/TiDZNYTE8xeihAWkRqqXIyMYVpt+WmvHLLqaL6Zbr/VMn7b4m7xhlwwB3r2wkHNJa32I5xqsTokPGr + zTYbcmNan8tvxz1qul/GRBVhtK7ZVs9BX5JJ0olHnjEnWEF9vhNR5AlfxTktwDam9JA8d+23B5jqM1SR + VfTwPhe/4lw5Cp5WYZgfenWPqQDjdU6bxY32trnHP39RxVkhibxHT97xyge8AVbEdDeRl+GAQjAbnAJp + SbGeU7KnPwpWMEfZcEIANVgZvQ3PfMWzWQEj4gRLIE51mMLJG8YRMhY17jZNmaAFZTjDALXDGSK0EN8G + +LeMkM6DDxuBA0qUwGOtYBzieCD9lOaHdICBhk+EInD68QscVtGKhElUFS/gCpykgcgYKfLiT96QCQe2 + MCkv1E0tdBFFNraxLIkIX/k8KJ4NzvGKi7oAERDXxTGpsF6wg+BtaJeOArjRkIfUSjt48ME6eq1C6bsj + RexYEXVBUm+mCyN9xljG+S2FKeMwRS0KiUhSIpKKkbwQ+VApEksy0pXpClsmfaJCMqFJP6/ATRpHWf9K + XkKRHXHUYiMLJUwerkuSqMyjLI3xBhsg0Yz7KdkuezlNCprhhq3sYDZFWMxVasR0sKnEOKbHOOvBSJTU + RGf+fmmRHwqzm+8U4Dsjco4TtW4cb1jWGXPJRCem05+3syY8N3jM8xG0na5kFKEOutCICMMBZRJHspC2 + guo5S0ZUiNY/NSo1OMpzfKzE4SQ96jdX2BOfadMnjJgYjY22FGpmeATERjrTvsVzpKbzg7JE1imS6SYd + LHVpUAW2TvQR06ipdOQrj4rNR9I0Epw4aVH04yw9MBEIQsWqtZrgVHeCdJsDvQi7GKrUijlhNuR0Vhqv + mlW2iqofi1QlV8Mq16b/6oquktwEIPczO58Cta1/lZMjgEmxsdqUVuOh5FKTd9dafSJN9COZKfxQi7UC + 1rI42uoq44rHkHaVnVmkqRPewdOS+fWypy2QGRaJ0Ctyk7HDtGtiyVpYnkliP9ezah0yilreEscRigAP + bTlorqQKd7OvVdQyXgQjk/XWucbpKGwJGLpyMXVrYP1sbO9qD108LnJwEMdzxRuczCI3uzczr1chad1u + UgIcJGPaDMY7X7XAFLvBzKFMFUtWnRl3v5Fxx3fDS18Ck+Wt+Z3tYuXY2QT3ELSMvcAi/AAH+RbYwl/5 + 7UdrShnZoje9O9PuhynCCQpf2MRbEayIHwxbxBr0DL9JJW6D/Xu+AAz4xP83pgo7PKtiEBfQtS4O8Wud + gGMir8OYMlawbDucZB5rxLBNjog3dkvk+RoZwaKLJ3s70uIXsxbKtlJEP6hc4FN+ub8M/rGTuzzjy8Si + HWOeb0xF+tXzMtnMRR1uk2PhCDg/94YRWzOMV0zHggbafCG8s0ZiwY4+8zamiN7hgum8WaYed6aMbrRl + /3znmqWZx09+spqRPOpzYTrTbHXGQVs7VwSDkNT31XCiO2LqUwf10cYztKUnpmXh2Tm7fhM0V2lda41u + GtJW7DSsZY3FIJt52MRG562XPWgQc/nV/PVOqFmc6xc/G9q8lPNRl3xt8vGas3JNnyV1LVdvf/uQZT57 + so+BHVxqd1OHzJYucvfsbl5aedrJLrS5581mDmeb2gIXsSLezO9D6pjcoiZ4swnNbGtjOd4D1+/DNb6Z + MDPcjQ6flba1ubd6c5rVEnfwh73hcTam+N/zrqv47h3waV+IB1Nmef7aMdgYR5y96w6JcCeOZ4J+RJU+ + N7Qz/3IuQzN4Y+MlPzNnBB7qiiPXh0MX8QV+sfQKGjvGTRa5ZjP+65p7JxFcz195v4Z0lBOWYhv28pah + DmRrs13okeAz2rWXiJFbvOhV17AAPX1lo9Mbym7WO+52zu22o/vgBYc5TQVf9o8oIvGXMwPPr/t06jZ+ + 3ClHOKLLXeeTe/7QdGe8f3lw+cqtlvJBNnelDT9zkIgV3yFf9tZZDzd4Rx2/qCd8oelMdtub/vWROPvu + o+ZwtpM+4vlmtezfbvDTR772oC9u6rUfCcQrf2X90PzmZU59dc9d7nG/fttD3+M7r9z7KnP98bH/eevP + X54AJ33+5d+RR7wfZdIeP85ztf90gz48A7z0Q6rSU7L5G8BlSz7/sxa+szvz+zrcMz5Fob1YK8AJFEDF + WDgInJbF2z+IozjIu0D8Cp4UfLwRBAn3A0Fpib8A5EC3m74SFCgFJLvoCzZZ070XFBV/48D1w8CUA7QM + IYVmOEIkVEJuCD/fm72ayzsfrBPwY0Gio0EVPMGIiAVSIIVGaIRO6ARZOJi5kAvmgIAyPENUKUMp6IRh + aIRbuIRm+J+gSxRXyzPy276IIwUpBJUYrMKis0ErDIlmuIQvpIsxRMREJMMzPJgyVMNHjItI7ARVuIU5 + /MPy6UE+hBN/k7cOFD79YxJCNEQlaI5DJMVSVERGZA40fMQWNHzEV+SduJgGSmyGJqRAjBs3IUSuKP/U + RByhwiC8xaiTPjvEiFi4hQMgRYYoxVNkxjE8xVRUxUZ0RVjEhEhEFWt8mZeZhkZIEvWqQyK0v2WTsl7M + Eae7RMBphkaQgrrgFm5pxkNMRTRcREfclle0x1isxmrMxpf5nhEIv7BLQGDswEwkxwPhOxTcPhzERe64 + BGL4EX1QxohcRnh8RlSERnlURXvMR2vcSH3cx2yEi220RDo0wXOsiA8syNSyRQYUN78rvmDUiGY4AIRh + x4iESFOkSGhcRGmkx57USHyMxI/8yJCMlcIzSmKsOaVLSQM5pQw8vvXiCGNcRyCZSOdwx5y0Gp1cRZ78 + yY7sSKHkR5AEBrg4g2H/6EYgq0ESpLwHXMoAcYRImkHiCw9SQEY9qclXqclknMi9rMgxxEhWVMNp/Els + 9EiwJMuxHMu3aISVhEm1FEjhsry2FBBzrLYuC0CStKRLkAUg4cyJhEi91Mu91Em/jMaMvEevxEahPMyw + JMu3gAtWGMksM0mPaALJBBBOnM1v9I5LsAXOdI7P9M2qRMXQDE1ENMNodETBvEfCBMt9PEzXTMy3AB9C + O8CaqyzbFI5fBJ1dy8PK3Aje9M3wjMhkBM3htMjR3Ekz9Ek1JMyvNEyxbM0ecU24IAKeuzrMPL7+w87h + 6D0EhLL7ZEhbQIiEsEu8ZAjgvMryNM++5MkGbUWN/4RE5mxOxHzO+bTQM6jPw3K+7nw6XtzP3gCCwNuv + G9wIUuhNBhHP4BzPZWzGvmRQ0pTH9bxG1NzI5qwbCo3O6LxQV7jCksxBM1PKD/WNcEM/C2w+8IgFYiDQ + FLVKqpTI8nxHrYTRjEzDuBhM9xxK+MzRC7XQYYhNPDw+DxXSs3hLuGQwQMwIzRxQJk1RdyRPvsTKeJxH + 06RGjkzNCcXR+dRR11QO1+RRw6vCyBzTtPC62US4WECGJb2ONe3MvExQ8zxPOW3QNKTT5cRS52RNCuXS + TT0DSzjLLEJKXHzMF2PLQSWLMiU5jTNTjhAFFGVUNl3RmhTO4izORNxKVlTOr/+c0aDE0zyVT049gz7F + UHBMP13kKhc0VbLggcErwhlkL0U40QF9VViV1WqN1BfVylV8UCu11DvFVNaMT2Dl07eYgWlgzIXcv1JN + 1q84yDsy1q8hhc1MCEad1kYlT2t90kg1TkaMR1bk1hqNxV7NVH4U101VjhkYyU9kQUFdV7Dww9wMCWKg + Bmqgh4mtWIqlh4rN2I3l2I7d2BPIWJAFWXoQWZI1iJNF2ZRF2YR4lYEwUGqdVeFET7+EUEi8hSMb1Q5U + 14bVClQFU1W7TPUzhBYh2qI12qNF2qMoWqQ4CjBoWmZ5Wqdllqmd2qilWmYpAKrN2qTg2qz12q6tnrAV + 27EWJVtdUIqKOtuzNVtdYFu2bYVUfVe5Wv89nvWKTZu8zksoDhWJZpiGM+jbvy1Xvz3Y0DjYkyDc9EBc + DxkN1PgVYWmemTiFyEUcyaXcygWjyP0iyeWjevGiSuBcz60XzxVdMtGU0jVdB/gdGvxDMaVbq3hLAvQ7 + SeMIZ5jY2rXd28Xd3NXd2tVYjNVYj+3YkhVek4UOQDHe4z3ePzHe59ATb2nUdlRQbIVGKZjDUAW+nB2r + SAjS1sWK/oTYjjgG4BVfjx1Z4TUIk1XZ9D2I9d2L64BVOUjQfIXUmb1VV8zVO61R6sW64xMz7r2KfqC/ + 88veoOWI8B3f4T3fkC1ZkmVglEVflIWO9ZXgInFfhHDeAr3J8GRRZbz/VklFTiptxX/lVZBMWLRkwcIg + SP+tAwAU1cbcNk/EwouIhWPwXeAt35Fl4AYGWVmghpM1WQVW35OFDoFACPdNmCNO0QyG0jhFz/p90NME + ysLU3wX8Uew1tIqIhf5V4an4RwIGoI1AhvHlWBzO4Qb+YZFF4yA+geI1iII42fa1yzhmUoSBX9Bs0SZ2 + 0ErdFhEG2H08Vyp+vXXY4qkAQhd+vViwhRoO2Y9l5DK+YR1GY0iG4El+474wUFlw2b/Q4OfVS/iFR5y8 + yDl94nqs0UvlxxI2VIrYw0HOGrgdUS+WYVso4wM2Yxw+3zR+YEqe5AiGEAhZUk1u03uNWX1VRPX8/2BS + hlBvBckpBr5c5NAZwwjWbVifZcks/FnG+9FY4OHgFeNF9uZIBuc0dmCVLd7kdV9vuWA2jV9Qnll+BUxk + 3mNdHWGQNNe0XLaa0U//vTXr7bVIK0ZZFl8yZuRIruVaJug1dhVXWeM1jmBetmDmBWZqzUvitMiKxFZj + duJt3dWAbc5p+N6MiAWcM1Uz+OiOAGiK9V2UvthuHmNwNmPjRWiFkemERt6aBpQCbd6cfll1lkhipl80 + tMYq3ejCFEpVKGnO2NlkVbtqduYGa+oBBoljIFB5ZQiqluhN3mCZzUop3deajdB5JmqB7RGQLNhxDdZg + PVi0PuvCDdY/hRgr9v/Ei5jb1gWuAizC6QLQiFiGpMiGr/XrroWg6uFrsiXssV1btUXstW3btlWKxXbs + x4bspYhsKpBsT7oNy76NzL5sKsAlzfZszv7s0PbscsCN0raB+sGNSfjemtHiaW7m3BQFNVbjXBZiQGFo + dLbp5MXtm+btnZ7ofI3Sdj5mGR1MsfTVPS1YhD1qiqhNuvXeFr7iOyIFFO0LTGaQeuXMhUBQUlwIhFlQ + 0azVTxbl4Q5MKL5GZTbu50TuC+3TtF7rtWZrlEDrGbAEQXy9wpjrhrXFuHVlmsuzqmMXRWiINS1iIlGV + eUViYKaOUjRQmqxKJdAHSJXerqZU4q7TCb1R9ZbFz/Wez/Z+7/eW75QIViIIYLiGZosQ6f0EOfNqJeuy + KURGcAK37gK/6rrYbuCE8CWeX67GVZ9UTjtFby2t0AvVUWE96yNP65OY7/lGCVQeQXYR5IZ9NH625tci + Bhof8F9e0pa17hqv1gONXmcUbzlNTguHxLD+Vg1Xc4Md1ySPbyZH62ng7y/bXlNlzJfEZuo05Iq4BBqv + 4F/GbgLdaZpUxjqO2TsO5R6v1B/PR33sY+POUw7v8ElPcnKFbyUXDRLXwSePiBT/l8x2JdY5987qvF7d + 1EIi6XJpldc/X9QUbfBYBe75De5Er/BchWIMR8zjHnIuFVYPj29MD3GU6EbYNXHLrIikxs5CZb8z1RAp + 8HNXrW4j9vJuSXAGN8UIZ8YIH00nXnTzdvR5Vk1fJXJeR3JLd3O1Fo36zk11qfMPJekGVEgVY5dBgPZo + N/DsvveIThgENfR7FWaKfscJF+V39mpwx1QNT0xNZW9LN3cQX3IRV4kRCOARZFghXfF4h0rOe+HQm24j + PoEut3df9k3srmP4NfluyRNQnvViPuZur9PzfvSwzNRwLesP9/XCBfaVUHcbLPZrswiU/NDnJtY93/ix + U0DD/9Lme5dWvpjW6sj3OaZKlH/TN63oMSfzWvdq9kTzLNV1TY3OXu91EMd5OF8Jt/5RyiuMKB/Tuqby + s/dn+84iJW1ZBAeSpQ/07NaHBq9j7mZHT+7plWf5ln9FRrdSoAz3mZd0YPV1sUf39BCHPz6+drfNdrBn + ymuGAi/iVCfQjyfwee1y3/4LQi/Pfm8ObMdKgUdOgq9ZgxfyrmdztbZ5xof4skfT+76IisfOpe7RTYdq + bwyxeIpWIlH1gdB8vvByf3dS0LzJHb96RR98bzd8XN91PVV8h8f5nHd8+3xmvU0UaV7Khx16tzfSHax9 + jLgEpwd058j8V0X/AQV9hXhIG//v+wffcdRPfT3uSjxdzQoVd3IHiBlnBA4sKPAgwhkJFc4QN4NIpIiR + LkisaPEixowaN3Ls6PFjxSZ1RpIsafIkypQqV7Js6fIlzJgyZ9J0aUYixYkRc+YEqdMn0KAXe24kelGW + EjlKTihZ6pTp06ZQpVJtavXqVaVXIWBtypWrkq9hw0IoS3Zs2bRqMZVl6xaCW0xy487FBMyuXGB39+rt + C+xMX8CC/54pbPhwwcSGDxZeOHAhw8iWhFKubNmy0UjOanLu7Pkz6NCiYbILynPn5dSqgRKrynSqLKgn + Yl+VbVXr1KZas0LYjVYp2OBoh6stbnwtXLhv6zKvy9cv9MH/0qUTRnyYIGOEBh1H7s7N4umf4cejFl+e + vPn06Nefb58eI0Vvo+fTr2//fs1fq3+Cd89evX+YudefRLEk9VpSVNlmFYJOVYVVbljtpo8cvXlllT4X + imUWh2R9hdxyydEll3LO4WXXXihGF9hfLVpXWHWJYSejQY8pZGN3Cjk0Ayv7+fgjUJlJZAZ+RRp5JJKd + 8fCRkBk1CSSB/z1Z0ZMHRNiggw/S9iCXumHYlXBWiTVWhht+eByabYm4XHPNPQedX4C5OKdgLy5GY3YJ + 4YhjjsJA+SegTlrkSJKFGnpooTgFONSAVAaa2pSKVkSKUgguOBWmUm25oKZd+SYhWBcS/4dWmWelyZaI + qTJX4lwpoogXnC3qRZ2d1704Y4036pojQzu6IumjwQKZk0iIGnsssp05EqSwzVJmi1O+IUgbU5syeNu1 + 2Xa1rYVjeVUhcR96eGaaqrLZpomxsjgrnTDWGeOd2eVq4568MjRZlItKqS+/APq7r78ZPZIswQUbjFIT + zQK8cKOmNSwRpbhFxWWmWU71KbaggtvbVxtrGK6H4xYXIsl1sZrXiXrBqq6c08FbK0GN5QoZn5Ht2FAz + zuosIH+RKHIw0EEfu2RHkS66M8NFW4SMgglO7OBrW7rmJafb6sbx1Vt5LC6HaYmMJptrotuqirHKSSdh + LiKGa414NpbGnb0K/boz3asJfTfeRiryL3wPE1i3R0ZL1IyDEu/WYMVRO90VUotbLSbkHItVKrnlokry + ySfDmleKZrM4nXUvKyYv3DXzKk4SgKteGaF5u/76Z+34JPjqwVqZIFOVTkwbtVIvdfGDEVbo25haZejt + hiEnX66qyok99sosy+oy6Le6/dh29eZ48wxJe9/v93yLHx6BicD/fj76MSWCNPjtvycUehEpgnvTU2dZ + m1VSR+glVseDOVxTKBcu5r1FTecikZtS1jl1sat6dopZvGSWp13FrVcz+E7tMpgviRQrfR78oEkSxqye + iY994wPJ7agisUtdK2pYwtj+nPYp/21lVF0b19eQY67nje1NcKKV2tQGM7dphyHaqyBENKhEjQwMhE78 + oDPc17fALXGKGiHcUpSiO9u48H73y43EHncVfYQqLB772PIqZxxUGZCHmnOVynzIrgYKETExwtWMSFdE + e+3IIeLAVxUDGREePLGQ6NubIGsnpEFATYVPqw21tKVFx/FPjN76VvIGaKocgmhNPESXHH9I/0d31dE6 + jCHiHikYN3HEwn3he6UrY0nCivzMkLbE20145rAT8pJ8ujSQ7rJYP0tpy2KPkwXGwPQprGnoTGghYHLa + OKJpbu5VoTwbrWolM1POC24V1JFCPJHI1ZHnluYMWmlmVx5HlVBnSdOIKOz3RQhZSw6R5F8Ys1JJUfkv + TMLhmlo4qaYdUrNNoVwX2rL5wHl105sWtNkIxhnIdpyzogRbhxQhJdH3RcIWYUSQHIgpUiXc836fSqYl + lwfAG6pRh9LMXALvYs2yrahdLxJdzPCoJ8isUiFJZCcseynLoMbvIuwwFpEsWtFHkHOo/doPKRKku3x6 + EUK32dIkKWm14f+FqoxYYekzuwa2l85FcwaNXk3nlNC1bZOIM+uO6bqDOmBtFHDmK0k/PJPUpKIkr0q1 + qDd4RjvAvfMixJikHLaYxdxFBUsV2w1KtWpGryKvsqZqqUvJWqKTucqa0mugu7TJVgmS1oip5KNCAFlX + E+ZkHSvh60j4Ctu/0rYkRJotSVoJEl8C9WjCGixHDLRPycYweJY87uP8eVnlMS8tlzNXQcm2MpqOMjqi + ZWsescfTb1qQKER1qlDD+5+M/AJJuPVrbdG3V5JskLca3ShRbpHY+dK3vvNtbLSEqUX7ItZx/U0uuLhl + w7AO1LnQBeWJPMvAWYUuToEZ4p2yl6ftxC3/Z6t1lpDKexLcypYk663Dh2+bEtymV2jJQIQ8UqxieQBi + neqc5W7bK8vettMiUgBoDgXa3FPt+DjP7SF1pUrfpPRXK5Gtodd6nJa4ns5mDQGnOPwo5Sg3JMpWvvKV + xXnh1W0mJTlAxYrDLOYxkxnFT8BEiXE5kiOo4AUIYMGb39yHFuxSIwD722qAi+dI2KMAfv4zoAPt5xWA + gdCGLnShD72CQyO60YhWNBgiLelJU7rSlr50pFcAiDdwetEr6PQbFh3qT3ua1KIuNapTXepEPxrRgNZF + AWCti1nTuta2vvWsqaALXVOh17v2da+DLWwqEGLLdOsJIfFKklwMgAV9/2ABnKMdZ2k7m9pyjvazoZ0C + LugDxGlGFomT8YcXqIEG5j63BoJBY/da0dgf4YQN4i3vcci73jYohw38LOtY8xvX/pb1v2n9ClwP3NYF + 18XAef1rhO961n7Qgx7mMAuIz0EPE5/FxTNucYtnHOMe/zjHPy7ykWM82DagwslTjnKU4xvl9n45zOOd + CXnPfBwzv7kNxjGOYoP3u+Ltud8ikeyR9INIOegGFxBwbhpowNwEaDrT0S31qC+dAASggRs+kIIidPvb + BcurGarwhwmw4ANLP3c+XsxOH/k8z2AQ9Nv/HHd9Q7zudr873vE+cYjvfeN8r/vF/77xwAd+8BE/fP/F + +173ii8e8Y6vOOQdf/jD713jHuc45kdei1lsvhae7zznPy/6z8PD86WvxelHj3rRl771qE+7u39rkVqW + pB7b6MMYXOAGpu8e6xrYfe+xfu7gn33pbijDHsYwBlh4PVlJrUIfJrCDPeDBDRqYANQ18AzK6FnGUApf + RS5BDzmMf/xTIL8czl9+8tODGu5///t5QQ3582IK8p/C/OEPf/zDnx7yb3/74Z/9CSA9CCAvFCACUgP7 + nQA9MOAJPCAEQmBIhdQJUKAEzlcF8td+Lc6RIRmBWU5zsVFbxFFfUBd0/FTs6UwsmIQ+IIAG7AALuMD1 + mVvTzWANYh/V3WAOOp3/GxwfC9AAAqQB85FY8xlJXh1B9MlAHEBBGdAg9u0eJbDdUwmKBvXEASAXFtaQ + FgpYV5kJDpHLF45VgbWFyZwVCZag5zhYnYTWdUVYER3RN/nRk8mhOKBgCgYLRdCeGUxBA0zABMgAFHzA + 7l0fITYdDhIi9iXiDRoi1PXgB7AAAbjAC7ABmhFhEdIHevHCHkifF5RAEahBD4bi7vXEnUlK9ynNz/lI + /2Qhco3Jx1RIV12SSpUFGYlVCDoP9CAQc/iFCZpNNonOaDWUhKkSat1MH1VZQySRzy0j0KUiLXlbHWBB + H9DBBJQAEyDABLjBBNDANvphN34jN4ajN3JjN/ZgfDaWwQtYwAeMwQAMARBc4qHQwx6swQ5MgA+MgQVk + oyiWAPxcmFEUVlTJUFZQSBY2joBZzSzaENcwV4+VDC7m4kz1ohqWkvVYz4RFBpNtzxxaUI/cIR5WRElE + AQ3sQD0igO6JYiiGo0p2Yzju3jaKozZOgBpEAAGsYwrAwDv/wqMRkgQ9YGM9IgETgKI2huI2SCGMrZuL + 7ccpSoQqsCJJMc7/iArkTKVyLQ8sbhJA+VjzhE10wZGCidIokZJonZJOaRe99JRcPVlDqINH7kxJYMEL + ygASbAMCDKU+mqNd5mU5ZiNfhqIfzqQ6jgEO7ENO6iSSUMMYyABJ0sAeEIBd+uEVzBhdeR8qBpVqGKSE + OOVxlVEsWtYseuFx6BhZmQyrvFE1LdhaaRMERdAbYiR3WRAdPllHtmWzhCQBkGQJIEAZyEBfeqM5cuNv + 6mM5PmZMqkFj/sEfpMAQRINhJgk9jIH07cANQKI3+iENRCb3udspUkoAGZlmIuRBflVY/yBF8ggQS2Wl + Vv6YJ+niLqbMV4KlTQEjN20T6VBYRmrkHKIgM6bifpYiCb3lSMoAGkCBC/ClHz5mdSaoghroH8qABRRB + TSLAYBZmc95HXiEmSe5ACbCAFyjoFvwIuyHlUSrlFDKS1WRIZGFm/kQlWJCnqFTlgHFImRSHaG5lXJiV + m8ARairUWI7OzPDJfR6jkOqIHdKmajRJSfzAbe4AGfxBFvDmgkaplCqoBjRmGfwBDrhjhR5JT0ofHZDB + DyroIlxGiDIKhl1G42DMkVGWeIbnVFqWQj7TcvEY5txoV7rnGcIn6FCkYkRY27QmMfZUbJ6DkQZKT7zl + C+4AEpjklP82qpTypgVA4jriQDhQ6JbaBz1kwA5QIwxqAG9C6QSMqaEmJZOA1551hDAUFyuq6Gb+Txp5 + prjk2C0e0OWUVUwpEAPx6HVBEFnqylm+plqC05PNTX82Y7EGDEYkKQ0kgAx4AAL0gQx8qvT5YbRWq7Ve + 67V6I29qAIde6Qto6aXWh19RAwuQJBIkgAtK6x9aAzY8g5+caVEYJY1lxC7QQ2ZKllNyRT+9qSx+TIwu + pC2uUTQ5JHumC8rk6USG5RrOJ312069uV7BCGZRFVKEGC6IyqbO6QD2CqqM66g7IAA2MAQ2UgYQSZrji + BzVoagLsQAJw6MZia7SSwxVswSJwwjP/ROGochS8EoUk2KsYoRSrPmVKceFYNE55Amxozup6Rtcu6uiC + 6WqPuqF2nVYcwqaOYFDFyqvPKOuXWsEYZMHLwqzYji1v1iO3eoEaIMC3WurJjkZPsiwZdGq0/iHdSqvd + NmgDzGzN3qzCZJSdBUUBTIGX+A8NtWJySeVtKJfygEySMaTA1iku4qhXIqyDKSyf+mlp/WigpqWTHeO7 + Zu17zd7F0uMHuMDcUmvdpu7drq437gABjEHWSShOti0m1gE1MAFJrkHLegHHdqyUkoHe2izONpXOImtF + NAMY+GwldaDhsqgH9uuYAOzX1GjJlFVp3qpM7ahNtaGPXuTDBqla/9Kh9x0r+UrmRdBeNC6rDKCrxjao + 73os9o0B2qotuNLufLxtAtDjD5It/5LtGnzAHxBAF7TAIXDCI3hDYBkbUbhCASjvVolR0B6umwbHP8lp + LS4uCKqnnRbU5B7UHMVnReaU1E4QhXHXkDYEqYJuP/4E+sJlAsQtgc5t/85wte4ADbDA8ZUs29rvZ9AD + EyTAC7csAdAwEZdtH0BBJI4BF8QAXrFDIvzCLyCwCQHFMCTvvX5nBHNmvw6HLFRwQqoR9RIU0zqH0+bq + 9nJv5vqqQzlZsMphQziACgOKfJAEFiwry+rmGhRx/07rDefw2vJwaIzrGMTByu4AFNBAHldrIv/LwCJH + ayMzMiQ7cg0jgNmpwRioABOzRD84MRTzQALn7EfMQAN/JxZ6VYu2KYyapzMFFJ1uZeQiWPa+Z+WCsHxG + 0J/aJ8TyiiVsZJTpp7H+Mi8BytDVwQ8sqw94wB9obCTrsdh+LA0UQQmUwQe8gMkCsmjcLiGvgQeAgAas + gTd7MyOD8zeL8zhD8g6IsxH/QdYpcSbPhBmwAzt08icbpXuRwhlY8RjJEIpCMFZEMOJSJRoxLmgmGTTR + KhkW7MHiqvQ4UAhj1zACqQmz8QxQbNaCXwprBoDmbwKAwG3m8Tl788d+dEgrJkmP9EivQXTe8Pz+sTWH + Bj38QTa37EjmsUf/mzMk1zRNKyY6f6xi+kAfqLMGsPN8wDMUewPRBEojnMEoCyQpO+8Wv2hAZ1KHVI5A + FRDBcjCeHtRgWC73irDmTlCTde4cOkEcZyeNadhI1HEC+AAdbEMZfPRNx3VOz7VclzTIwq4aTHM1tzRn + jGsGxDQCeAFN87RJ23Vh2/U3T0Ac6CYNqMEfLPGREPUveLKPIMMMgIGqNrUYsWlleTGZiNVl8VgnbTCO + Nq1CL/Tl2oqPyshFmlbVCqtClPWfdFD6rnUC5J4PhHNh77Zh23W0kqQGZEA0T3P98nVnvDQh70AciCw9 + /rYe87Rz//ZPu4ElQ7axOAI7NMFkkwJlKME9/zvwcGGMP28hZXUmVxhtjA7HjBL0WNUprZJNLFMuQu3p + wkKYw65x1cohHANz+dbYCmPEXaU1DdCBD6Ar2OY0dDMzSStmyFL3B+DAA+ywccuED7OsdB5yhoZ0hm84 + h2s4SSrmxy6hIKatdRMML9hAJWyCOnDCLnBDM+hWRpDCCSg1eAcQvh5Tq6JyenuxLdaogRn09bZnGXsO + QzOsQ+9RCaMWbMthkRaqRa9dJLSOgK/sYidqhoJ4h2f5hkcrHfAmC0xATX4rc044TYwrAsQBHewAI2RB + gGq5m7/5HwiiBiAAF+iBwZw4IABCJdgAGAiEXnRCJzRCI1zCi0dEIyjBZUvbqxwQ5HDhuAS3qRaat0J2 + iI+3kY0+pJAfrAfLCgirJkPVp2vep9UqBFnLti5VBEXR8YD7gDI0gAbEwYe/uaxvuBuMQQmogQtkqYT/ + k/lL+HAC0MHKIkAJ0KOGLzhhRzdhF/uHL6GwV3c7J8uJV4Ke87lhAENAWYUUxAaNWxLz5vgWQrVKxSlo + Y9ZoP2Rpk/FpE3lq7yprmyWwPtST4Ut/z/tFqwZJ5BUWuMHKokEWWHmsj7SxI3tJm7QNw646UvOu83pL + UMMfAPGX4vC/Y/ms87ZyI0D1zXmJQzuKT3sB+HlZ2fhVfDcpc/a3o4WKevaOn0Voa6Ur26nkZrVEYpMQ + 8elqZldrby68G2NDzKapqx1GoG/60gGsM8FIErzEzzqIY/kE2DoBoONyKvxMXChMe0ACoIGtTzzWh7jF + W59QF0y0TzsYDIReXLuX/8jBZReX8RQkK2rxKX8xe7PyjlUviQS5wWbv056xp4swduzK1OayWIsDRZd1 + YZliRMwxSfyAvpOkC8J61r85iNe6TKJjhEM9TYhDBCT3HfxgrPc2xR99hitmIFrfYz87suA52Hs8iVyS + Vdyz4OrTFUOl6gM0nCJu9Ko3mah8wKbnaGK6wU4XanP1QjV0a4u61ToEKfI38gfzf1sEWgs4HayBMkCB + v3M+9e+2hi99CdRklo455cfEE7xAHHgAHdxAXTb+llv/DnzAB5SABoz+nW/8nof9DMiU10jItjtO4Wq2 + BFfwjp8nQEAQCEEJwYEHEWKCoJBhw4WYIEaUCBEYMP9MFi9W1Lix4hlgHkGeETmSZMkZZ06mRLky5YyW + L13GFCeTJqtIN3Hm1LmTZ0+fP4EGFTp0Z5M6R49ioUFHxh0QGnZEXROValWrV63KYEoDQQkCH3A8AIKU + bFmzZ9GmVbuWbVu3b9OaQQrrRRwPCdYgcEN1at8dfgH/FYx1R5w+H0poQMAlBlzHjnnZqASoko0CIyEO + VLKZs5wZYOhxFq1EzubSo1GnFk2Qs0HRcljHjl2QtmuBtAsaRHhQ4ULfDH8DnxjRIsbixzl21Ajyo8iP + zUuOPGlyJUqVLa3H1L6dpjhPRMGHF0/0ws3ykc6nNz/UUVksbujYhQLVamD7ggP/75AR1c2YxB++EGGK + xwgs0MADETyLLrvoIEMvwiCM0CooXEjsD8YSzLCOyCarDIzpMmNNH9OUOOGMAkIb7TTVWORMls1YY3G2 + 2jZ70TYab9PtoNx22024hyISSCIgibvIyIySW+65kKKjTqTpqsNuu+yy426mGWa60pLxuCRvPfS+VA/M + Mc8br0wxb+rHvQmsiCOO+eIYTMI5B1OsBBo+iACdZDTs088/C1zQAx106IrOQ6syDDECFmsMUAIjA4Qy + yzALMbUzQOusxRVXq7HFGWNsDUYcSc0xx9p6FHKg3n7MzNXhiqMoIyST9Eg5JqFrkiQoVWLpSeuq5E5Y + LInA/0nMY8NMlkxlkR2zy2eHUqSsKYZYI74EoKAhTkTnlCGBHfqT4asIKJjh0XPRTZeuBBJAgREWJtiW + WzoPs5CLXOqQK922OJz0Q5EsZe00zzJt0eAXDUaNIIRHpdHhG29DVbNUVVVVOIeGy7iiI5PkiDkmdZ0O + yl+vg4nKYa/MEssZhIHW5ZeBarbZn5wpS44UdqAjgXsQ0EDeeSWcYAwyNHCBXHP3TVppx9Q8at27dkBg + AqDpfPMDGRRLQayl1+rXw5M21mw0EwuYQkVNU2PY4FBxS401WSDGTTce557Yx1V/C+5VWDmetePnboVu + SV13/TVKYKUcVnGbYG5cZmYh5/+yTJ1+mTaPnBOwoudvqQ56DBnwLIKCI7gu3XS1nnghc7v6KCEqzmF/ + XfYdYocwgT7KEBeBF0SI5vSzvLYBjEpPJVEJTE8wHjVOE1ZC7YYbBnW02fSZLccREaI7Id7yDnLvhiSK + 1bi/lxyccMNH9tUlltaPKVhhVW658fnp71LMRMo6AQfa46CjDJ9nVzsBBtAq3xIaGUKHDqT9joGmWxcd + 0OCB1nWugLMzTBkmwBUc8MF3DURKpCZ1mRlgRGwjMs1nUrQZE3Jmhc1T2PRUYz1Ujcog1cuNxLSXKlZ1 + z3sa69vGOsacwI0kV+cTmfrYhzjFrcwlM2HcsqD4uChGbmb/9ZtfO6aVAmvlbD6coyBh3IAAcZVBdKTz + 4BmT9jQPeKArXvxiAfsABdDtrndo3JBk/EW8iInGRGBI3muURxoXNs81nZIbDUs1wx3pkHsX42HGiBMr + WgWxfOc7nHQOVzKYLLGJWGqGFaE1uZdJsYo6kVYWc4YGFCCAAD97o+wmIEYNkLFcdrRln/RVB7p4gA47 + kKDrXnkVH+AOax94gRY6eMbgiRAjCmkbZ05kNtS0cJDPgx7bRHXIRNZNR93sEXC6RyQihe+HFKHkEJ0D + MsLxKkrXQdz7OqkddYASZqSkYih38gizTAFnOtPBBzTgxmBGRWhrIAAZ0WHGWy40Q+tq/xMbJ/CtOMVJ + ooWhXWEq+q2KyutbHsjC1RjFu2R6MHjDA1hvsCkH5ClvRcxDjTWzqTAbGfI2cHsYjmxDMYq1ylVC6iE5 + xUe+ShYxZEUt2ck4qZ2ZxOKeU3SqPZ1KT8nhZB37xJkH+pcFAmzUohm9KEW7ShWwsqugBHCB6BbIULUW + KHUeaBMd2hgHdl00AXKlq0b5R1G5ynWudT1MMXGATDuCsDLMBIZvcHOaE6BwkKKBqYyg15nZzDSRiuQR + Tu+2w4v9FKiyAuLfbFXJdFqyV0dUIlLhuR0iiFKqrf0JVNHEk6aRhZ85i4MVXLDVuu4Wr72lK135mtE4 + CA10HyjjWv+RSyCH2sVQVBHoc51LGI1moQx3MmYd0VhSPaaGbCk8WyAbG8NnajNuOrqsTndqsYf4ZpyQ + 3Jg5hfoxojopOqU9alKZiCWmupa/Up3cKfO3vzahAE5X8eKBo2tg54ZxDXg6WnIh/JZdPlRqeJUdghF8 + 4d8WhpiKEelg8fg1gLFXhaLBlHcFGd7RMIxt2IzeNbdZ3vSCk6ecLZJx/HZO0X7MktVB4n1Tux1xjMBY + TYWtkb9U5Kc29VmsjUTl9ing2/6vrxednZWx7FvnJiCWBlWDnhQaYTGTZbbLZSMwr5zmLEuXdsTE0zFH + 2sBlOscixRMkwf7oUvA61kWfMmQ2ZVg63huaym7oZS9wDvs98N3YSEIdao8xadr7ts99nNxSf8Hj5CbT + D39WtUsCdFCGVir4yhmuIFViiUDj1v9yzK02S1vfqhcLb5jWsdNyYahbzA9n1waS8hBKKkJi1JxYxYNs + 8Z+tR9lC5nTQdMuhemkMJL11ttHI8RjgdjxfH9eXZOqjNCedgGlx++TIOynTbGl7uTZZgcq3NjWGscy/ + CfyhwWUgV5hd7Wozt46jp05wvKui0cMY1JiC5XWHKHVSsb3mRCkc2J6LLdMXxkjQdoNRob/ZyEOvFwLN + dG9Q47vjHpfW2ydDqpBnUKxxi6fcpTSTTniAFv3tYMAf2Cqp16zmAA53DA1edVrz3eq23uXMbnJTWCf6 + VYsm3asTzbUGrhtnBpYUbIkuJGcWW7CIu3BGz6T4NnE66OzpVLP/wVnvkHz42VopCVfqxGSTjujOSi/x + 0i1H8pKjunKdaLqqZ6ntXawAhZuDNemFX/rhN+qDusYSdLTEd9AhrCZY4ICXt42r0etqdM1rPvOb53wC + ypAFgsMZxAgf3giDxN2GF5thamOx28QL6BjLLaeMxJsjWQVJjoEctCKH9Mjse/JNyuSTeveS8YGCRb/j + rOZb9fxuOe+mzHf++QkoAb0TCHTIR3iXa4RrCaS/eeh3nvril74v1ZC7N2NXmb0OoR4JYsLTEHvrCXPx + qGCDqplCjNmENnQ4N+t7FkKSqm2Srg2d3M5J4g6J3mmJXAH5Xg7vYgvvlCwnxCTm0KK21k2r/9jF8zDP + A6Mv/BSPy+jtoO5t+1xtCSLgLkANBNyA/EBwr8Jv/DiPdrJADXyO9A7OX0AkM7jrM5Ln4VKs/v5svF6o + smRs7O7m9vSGvTyuSBqt2kKOxyCNOkTGZLQDnpIAAsVN08xt73yi75aP5uIABWxu+vaq/NBQBj/w6BYP + +9SgCOxA+1AQuX5gDCoPBbKgBKbvt3zrD/3wotDABdQPLAyu/RDuMjwiRFyM/lRDCFvksQxJbZjtkPjv + vDArvQAQ7SYCxwqw9xDQfN5uAbtN7tiHOxxAAu/O7iiQC3dC+cbQCjIHBGhgtwIREHHRDUnQoBDq8epw + rbAAAXgJDayABf/I4Pxw8a5ukXbqypeoKwfZj6RCTHiArc5mpDS6K+IkMaa67utEpeKaLVWeLdpwz6d6 + yOOAyACTQ76qEO7a6RTpbr9ccShY0Qtj5icwMAMFrF0swPmWMRkBca/mrcHi0A6e4BfFjAHwUBatoHWq + DCA1TMt2qwzKgOA2SOp+h7CEB2yCBJuyDsXQhgghC4aWrVT6b5H+r8ZsrG8+ce1Ciwq1bdskreTkTjvk + Zx4xDaq+0FnE0O/qwgqI8QNqUSL/MRC/il1kAAHWwA2Myw4cBSGTCwtYwAqswK0QgAwAsZe+RStz5h/x + yqPKYAegLrAw8nS0a4Sscbz66I9EcmxgCpv/wFF6Fkns/g/aNrETGc3aei8BSSvSkmj4toMbcPIenaW/ + 7PEmYPEsEGEAbssDCCygHnKuujIqeokyqUIre4vLEMAHaCAOKQBfoDK5GIAF3AoN6KAPIkqjIDIzlbEZ + QU8NiisFYGAsdrCwnIMRU4Oxts6atpHP7E/swlFi/I+RaOynnvC9NkIdy8f32nEUvU2TXCLcVHE661FZ + BnMnauYs9GUxyRAFymAomdHKuHI8L4orgQsplTJ00gA0QxMYp1IWQyALIurC/pA1VfO3egksczANMKH0 + 3uDX0LI31HKlqikS2RKQ2vIbS6REkucEGvRAExTG+A+9MGZVdA85kMRW/0Jik6xDMK+T5VYxyTKNJzot + LfBhAGiOGMvAC1izMlezK/EqPrrMDc7qM9sTuUazNDUnNSMzPO/zR3/UlyhyBxwsDDig9N7vDAR0Mxy0 + SU+AGjBhBXiBGuihSq30SumBSqmUHk7gSrv0BGRB98R00fjmbzDBGCZDUtR0TdmUTd9gTd/0DeRUTgFh + Tu30TvE0T/N0Bd6AT+eUT1cgUAG1TwW1UAUVDAw1UAFhZcQhSxr1Oz70+FxGJy0QJwAsLbhTFlHACyDT + R5mRXUA1VEX1UzFKMzmTltjzRhdKKqnSrfoAK28RSD0VSDuKuojUaCjgSA/uP6mgAMTB1yqhEoxhWP/F + gViNYQWoYBZWAAyYtVmddVmd1VmzwVl1oQB0oVqvFVuzdVu5tVu9tVup4Fr9VE4HtVzxNFAJNVHVtVAR + 9VCX9V3blVnhNVqhNVrt9V7xtQDAQF/1lQqowAYA1gYyQWAJIVJfS0S7sCeMYi0yVZUsIKCM8lAsTDW7 + rDNFJ1VV1ZZytCo1x1tU80U/NhA9wAVcQAaY8gvQQVcRkTL0oBZ6tQD0tVnhlU9noBJOL2W6o1EdVWd5 + dga88aZq79nq8kZMcmjxJrPSztGU9laIqB2FBVKrkzpDtDB3khVfBt3KYjsZk2OzYCj7SlTBNmw/9tOS + 0gfcAFUz1o5mKxjdylX/sfJrxVZsP1VUPQoHoe4LKOAUSq8SdAEOCgBE9ohJoWkFLq4uUQrRlJbOmHY5 + 1Skm/TJxlKh9TjHIANNKugNLeDZzNTdzT6FRT+FzxeFzOzd0O1d0P3dYpdNg9Y5SdUKf2CJTHdMFaABq + HrIoc/EuknIpaxRj0/aMsGAhB6UPvGVubfeuANED1MAFiBRAUhbEjIEKxkEXbGB03UdDN0IcdGGSFHcj + qLAvDedxSUZYKBe/OGlnzVdnMXdzN9cYPJd0TfcUjAF+41dYhXVY0fR+8Td/TyFY97cS+hdNgxVNU1d1 + czICb6I9XncAMqdd1MBrPzZuIbgD0dNsV413e7eB/1gVKFHgVUF1biO4g+P2BhusD/BWb3lNHFpgDt5g + FiiDWK+E0oCNCl7428g3nnBWZXCYUdV3hxuVfXXWh3s4c9nXfou1WO33iI+YfodViek3WJ3YiQEYgJ94 + iqn4iSnjijsEi9t0i9dUGm6SgHnC5fQuH9FCa2nOMbvWA0gVZJdRZ3LXDTzTgi/4d3IUBRJAgoY3VIs3 + ZPFKrup2eVFWZaXRGGYBHlZYF3wNiYG4UWdAMoTYiBU5kiXZfuu3ii35ki2ZMoJVi9N0TTuZi0EZTut0 + lEc5Tk25Tk1ZT1V5lQe1T10ZUAv1HeQnamn57sgtcpSMtaSoAnGiRBl2axMgFA28wIE9+IPDlmw3kwbQ + /3aO0SiDiZGDM9OY4RZs1SALALl5ec0Y/KAFwIAKamFcgZWKn1cXxAGTNzmLs1iLfS2UufhN4TROURlP + 4/lOx9VO/RSW0XVc8xmf17Wf33Vm5RVRBTqg8bWgDZpZJeGLwXh+NO0wK5UnLvWXG9MKssANaJeNbzcB + yrYzI8AO5JiZS6eOXZUPwXaP15h/7vgGATlvQQwQ/MAG/AAM9EAP5HVQpSGVAUGmUXmeVdlc/VldBxpa + 51VmD5pf9/WondWolRpmmbqpnfqpn1pbs9WpsdVamZpbrXVbs3qquXqrvzVbC8GhCViMDbOX32IxFxgF + ZFea2ZqvkhJcymAMbBSkPf8og90qC7Tigdk6bpFXDTiTeQVZzqjgDfTgDeBBF6gAHvzAqZG6WQtgBWaB + X5v6qKE6qqGaW8MVsa81XDObszcbsf01tEV7tEnbBv6VCsrhtE0bYEk7tE37tFXbX1/7tVs7tldbtW97 + tXM7YFl7YHn7t4EbYMchE8Rgoe1nRKm2FXXCG9pCa2+rXb6TBYt5r8PTjTfzbOXwo+laaZxZrT0WhKk7 + bP/4zbC5/d7ADwDBBmoBYOEBHgb2X297tG1gDmobtl0bt3U7uAN2HPygv/XAD2YawP97pvVgDgj8wBE8 + wRV8pg1cweEBDiAcDlpAwlugwi38wic8wyUcwjW8wyv/nMMp3MI3/MNboL0zfMI3fBYEnMBXHMBXXA8W + oTxqWWppfAIPNu/CuEt8OYGfWw8deK8hGHcRAK4vdrsbqAHe0wNC4CqB/IP9WA38mgaMZk9autdWwA/g + gb/hAQNaoBb6G8BroRbgIczDHBJoIczHvAUwAAMifAPM3M3XPM7lfM7nvBc2gM7xHA7iXM8jvM/9/M8B + 3c9bABI2oNDPnMwRfRZqQdHDnNERvdEfPdIl/dH1YBbinBYggRmCYNODQAF6wc4/PdRF/dM3gBZAwbjp + 0TqFQqwJ8yaYGy4WszHV+sdl9Wt99IFpxwNiCa4zwKONnIEy+LZKtsmN+Y9Ptryl/zG9c7oA5gAD5gCm + JxwDaGHNNzzCK5zNLbwWKn0W9AADmEEBJNwPYPtaYVYX9MCo2xVd//OS77d+4/d9QTfePXd0R9d+9/fe + hXV0dRbeTTd03Rd+P9d/+X3g/dfdjQFLjEEXaiETLL0FqKASqoSHedYYdgHVW72eqlbVdWLHeZxrZ5fY + 45Zs/4DI5/rXTQcaklxz3lZU+arlJZi3+BrK/1pPAnvqek0PKmFZC8AP2NzL/QDCA/zL/fvLB5zF4WEW + YFoPPreFF3kGCuDgZ8Jm6/Wgn5WgA/qfBXpdqeAV6nu0Qbvru362T7scclu2X7sAbODB1RsOxuHhfbZW + eozILP9+dSXV1d/CuTV1rUFebN16yLHb102+dKKBCRCAKomxQl4+uPZa8W9Lpc8WZY0BxAh7MsDgWm1g + FtScFjZAz/G889kcEnphvcEAHky7qvcVZsHAD6pVX1fAnK34nDVZk52Yk694iw/rCeHr2l5SV4rIcVWi + I94gEzDAzs9dHBKNqNInkywh3Ga8+W35xlnXZTieLZ5AgTVV1FgQ5kHejzU6mV1gDNLgKQNfaeSADz6A + KjMHmmE+DdmfBnmL/T2gDNQAXAC7pf2gEvq08qHXBsahBQBilo1x4/wUJEjQIMKENlrMqjWOCrxK4pTI + uSiH3pQTvMBgoneCHsiRGEtePIH/MuUJkyxbllwpBwIEJTNl2qRpM2dOTBB4ysTEMyjQoUSBAjt6VCYw + QAXgbICkB8yMoMDOWL2K9eoMrWe2TmsWKazYsWTLmj2LNq3atBfCto30dm3Zt3HF0nWLl6yiOnz7+v3L + t18dfFziWPGAwgUNDwniJGgM2bHkyJQnT/YwAcEOAhbGUMgFOLTo0aRLmz6NOrVq0VPsjLFCRxmKD2sg + P3b8OLfu3bonN7aSRc0ON2W+hIG1OjlqalQK2KgE6M0KMLqo2MiEQY8f7X66d+e+3Xt37H4KwLPhR9wZ + YJhoKnmvhF6BMyeUyIKPP7/+9zNpxuTvXk368NcfBPrcpFOC/z71xGBQDfZUFCbsDXWUhBICo9QMurRA + S3ZgiOMTVlVVlVVWW3VllSV1ycViiy6uteKLLMa4liPKoZKGB1bEgUIWNNxWWZCWBdkYYzIg4IMbamSQ + xj7RKAdllFJOCaUZgslhDgtWoBCHDn2UwJhtQ45JZG6GlWHBDjS4YFwlVL7JCxVU6HJKdNMVUB0VcOix + kELjZIIQoH4AaoMNGNhQgB+ApLeeTPnRA8YZ+wGoxICU3udepjX9V1OAODmqU4AJ7sTgT0NBGKGFFiKF + IQRngKFHLxvUoguIPR21XoklnojVVjMMI2Owwg5L7Fg0BusMlPOkkcBhKKixGG/STstbHP9xGKlZCQQU + YQQ6vLwJbrjiQikYJgAgsKWOH8ggZLtk+nZtcMN9YBwH40IZp5ziQCcdGHg2ZIN1AgdcqHUEGxxwC835 + UYke6rXq33vy0TcpfP/p12mmAHbKccc4fapgqQ86CBSqRE1oFHtKYFKJDRts0AKd7V1IYs25kqirVbyq + Alded/UM9M9C+0x00EUPbTTQaiGN9NJFm9UOlFiowCNiPrqL9buPyQDFcGoUkUYHQPBlxr1mn222Pj8A + MAYKh1nRBxnUzk33tWqUMVwfbaKtWr50VgLdCtOBYQM8ecqJeOKKy6mL4WAoyijE+J0QacUaU9offAW+ + NyDHonacE8j/oz5oasmppgwUTTM09ZQNgACz8og3y55z7RJ6UmzuupvV9LA/s0VWE1X2oIKOiFnwI93K + 7xYHHQkc6XURHQDgxxR8X499cmXXk0cpAPRBx9t9sLt8+bfBnSYNxYWBT/am+T0D4PxOR0Ut1OmCpy74 + 649nAfn/X4sCvIFhDlsPTx5VANjtx1KXw0/GMuc5T4kKZKLTyYJIRzKTGUVCMznDomQ1B6nQREI3W4/N + ZIczXWFoBisIwO5emLtjCUuGLlJE2VRzwzrsww7GexYNrGA+89HhSD6ggQYyMD07iEAOdcih+57ovhvW + wwUviMK5tpQAFHwpTEFUngeyYAHM6C0M/3CA4miYMydxGMMY0AGE4HRhvwL4S47+o2Md7QgGMMwCDCsY + x6IeBir4UE5SlnMgpTR3yM15rCagQtDobOIgDWrQKBCQwwwIpwBIFOAUM0MKzZBiFdrVzio8OYUNIBEI + GKpylcY6Wl5aOaOyJEJK4eChs7LgBi52cVo7cJ4MsqAmAvxheipIAwyUQDYzKvNsgqlDPbKggT5Y8TXO + Gt8ulXetPhAgDuozDgaWCRj4rZGNgIhOAWYxuDyqc53szKMuZmGMOQGigJKDz8TqU8hJRbBzBHIPPxlJ + wUdGknQNEkrJaFKJcWCAFuN4Q6s+yarZlXCiWJFQwzZQDKa5Mmka5f/oRjvau43CMKRi4cGUdogYxEBL + l9dkHh08IIM+oIEMavhDEABgBBXwYQj6aCI4f/omM2zvAxPYAQvWxoR0WcEFJXBeS6dlmD6kzwURAEAU + gNqXfBVgBuJQI+DKeU7pCG6sZC3rWAvgMDk1DJD9kcN7BokpjBlSroek1IEmuMhGPnJkJkPVTIDxBj3Q + YgPj4KQSKgRRVoGSolmZ0ArgoYBeiIGGrKwsWSirNN+9KGq0NEKzjvfDp0qrl8/rQxxKUNPptaEGEeDD + ApjoU6zKNjXNrEcZ3LCDNWhBCGyzAhC1SD7RVgs4UzVOGWWLRl3MgKvG2Bd0wGANN65ArNKRxnT7x0rd + 6ehBQ1RYa6NmwsB7FpKBG5urpzwHulDt9YKRJMpNMPFYZsABDLC7Fc0Si8KJ0m6FYMBALzRJBMsKeMBn + +Z2MhHdSW1otWsLtzUtl8AFuamAM0+MDHyIQgRSwAZmz7XBqjqAG3O4ABFzw3mtQgBgEyK3BvPGANudl + 3Nn67QziWK4a12idcr5BGtF5Q499DOTolHMF262Od+tpkUHmE5H5cZTGKvnA837OkXvFYFDew8IWbEAP + K4AdhVgF0cSGMldXwdAZdAEHWsz3DLcgsJtJCufLvlLOTiuplG4Yjhw5K8QsFS5pY7oDLxCAwgAQgQi+ + UAQWpGABPXX/oocf7ZdoQEEDMtiBpQeAAbahgA468AACasPi3XxRDTKYwPqOi9XkdsXGN1ZrOV8N61jD + egV+OHN36dmezMVnPvjUD3mbDGxNSRmgdwXoeiE5sgPOgAod0gMg+KOqVbFHsaAckc1C6SpdbEABswAE + BICBO4+KG6QfLfe451xgGNHZRSSNBWcTzKMtIc+pocYNEd0wYTsAgA81+MIYIvACTPulmZCGdDSEYOlK + 7yAPvM0AbHSAhk/3ucF0gOYN1lRVVANVq6teLleXrQtyfhU6IwcEyU0enXEAozrzZGt+lLzkBsoCgpXy + D3rxOqoKKiiSFlk2LWhBBXHURFUTqtC0/6mt2BJ+2xg26IUCauFtCHzFzVSvOrFm+aZwGEFHaHhWLkOd + G19CQQYEGPT0asDaIhThCy8QQsHfHumxK3wHe5jmpjstcbCHvQ8auIcG6EXG2TIHfyjqOMidK7/EK15+ + xnhDJoBRgFu7HD/yUWB+3Mpk82Zs2P78WCOnHLKd8MSSNvg5FWaAk6Kg7OgpMzqucEVKCBhjHD9nWE/O + MAzMWp3AcUYLSdXyiHBpvWooQN7EReu8NYxBGyXI9777/e8MaxzuBkf4DhTOAiwAoAhbOoyKj99S3GQh + C0iYQB+qelXZchxFHtdQAW48zvjLP/6AsAEEIt/y7768cvoMNpM3X/9e6MVICaJz7MUTJwAMzEYLNjAD + bhUhRYc6R4d0rwc7Z0AFrYN6JMIKu8d7IuV76ZZZvANLrxQLBEclWmc8OkAADAZ2zjMBY3AP2kJoaKd2 + RQBwbkd9bxcNXVBUlmZUVuRwKBYCIBBcYOcBFUdqxBFjyCUnCWQiZ+A/M9BcakSFzWWFVahG9acEkXdk + oIJ54jUpMSEHv0ZziNQp/7QxxjaAo3JBcoAJb4ABG8CAMXE6G7RBrpd01uYqF6gAp3dYV+EKdmFu5HZu + hUiIBrY7uicj7EAlOYRStxRaYHctHrAGCMAIzTeDrPUHGJYC6RcYOdhhB5dwloYAa8N9L6UDRMj/GKv4 + GKzoiq2YAK+oSx6gAV6QJHoDANMHTlr1elgRhV0FjMEojMHYMhAABlSQf0imBEoWV8Gma3O1KTQngJ6n + XnsVE49FWJKSbKYDgRcibXloZgUACQowBzNwe1fBDRyojnWmiB84ZysSfOKidc2yJV6QS7IIi2GCj67I + RZU4HEdUYawVfTjgiaDoYZLmgzJABwgwTTrgW3AjA0CUj7FIkaxYkRepj81Di5Q2AYCni8uERh6Rh3JE + YzVmkh93kicZP1SwhZKnf5THazFXV5cjjeelhukVMnIgDnqwAbNQCUNXUKmyet44gT2xAhzik+dYFdMg + DOvolE8zF8CTNCzi/w33skNoYAVdhwT3OJEXiZFfSZEJ4AN0sAMIEAcToAHSg1MqUAQI8G8EaZAG1wU+ + 2EvZ11sopkVkwBhOtY9h2Zf6qAEasAYdiX4y1oTRVhWYQJLtx5iN6XHxJAf4V0A+sX+EtED+NxMzJ0E3 + p0g4uYY5IQdn4DJw8JN06F6T1I1Gl1hAAQi10JM/6So4Mwyx8JQC1lEygohysSLudi8oSAdd5yMWKZx+ + +ZWyeC1lSQZoqZZGYAQZMAb/VkV1YIJxCVQ7SJcJsAdY0AHch5fW9IrFOZH42DxWUIvDwSaBx4RUIJKo + wh58BAzL1XGG5yvtB5lcSE+OEl7zIZP9xx8XE/9BxLaGOtcfaDZfUJZBpiOUFEKUngQB4uAHHbICsWNC + 6xFghziIF2qIGNqOsYSbacGIVqlgPfJD+kicJPqXj2EFY7kDUDCYaUlMbPmcLACX1BmKc+mDCZAHUdAG + LJBSeclFw/mdJxqLLkAGN6ABbJKLhqmep/ITxthlOsN+UFp4JyIOVAApyHifzzhIvcafm5lINceZ1Big + oSMHxgAPC2igpeJeRWFfRDdtNNMTBfAyCfRtohSItYmnsJSbHCqIwTMueOZZL5UYX2eiXXmiq3icLFBq + aWkEYVADfFAEfzAGRRCdfTGdNApF1mlpdBAHXBAFKnBiWzI+HhCkYCmkL6X/AQ1wcR4peHLiEaMiOJgw + SipUpVd6ZLk2Ofy3H5lzMXQFgJ7TOTdZQTFxgfBgDDHRpAc6SQp6h5QEASswWAxYpxOVjnnqlHsqgiOI + bmhhUmezDznCaT3iBodhqCUKnmGyIwmwA0xwA0rCLXbAb885BjJakJj6U5raSzugAjpKTVuSBWBiqgH7 + lx6gBraIcValpGBAZUoABm8gq7OTX2R2FOKgC9RwjMnoZF+YQPmka5vzpZ43bAIIUCcACJAAByswgAN1 + mg9oh6qpBA66AROxMiYkO9NAm9ZqWbc5Q+sWlXrBN/uwdeHTIxMARIXqlX1JnAmwBlBwD0bELW2QApDq + /5aUWq/2ukzRAALOswOP4altEAFukwB3wIMvdbQCC56/IS8duYSp5qqItSDuCaW+EqVTSmO6QDkumTq6 + xowVA2X91x+WUoZ5FTo2IQfAMA69oAdngKwLoqwIyrKt9226gAHzRRPUth65l6GZa6Gaq6HBciwbGoJk + EQs2cjZmcA1coCMooEVEa7RAaraxSAdr4AIXN2HMiQN8kAFuOQbR6WhWm6lzqa6cWgM/0Abcdxi+AAUA + y49n+5ecagUWYAHcRFVJqn5zMgv6gz//Yw16cDiL471zkgm1sALX24VaGilcih+AK4Yacx8eKyCcF0ih + ogSVkGZv4FYhw7inwqZE5/+sM+AHcJAeh1VtIxJgOIunMbKn7UgjWHcvZSMHKjAApGoFIdAAGlC05Vqo + pRp2MbUGbjBoRgC1KZC7klqpvgtOWEuWuLEHDGAExnsYTNBLwxmeM2yRsWgY8uIGgAcPSoqykxMfK/Bs + jksyqQKFvLACeHtAMGl5HPt//fmMZ4hXnxMT2lZrJ4BsjMtXBvW4PPEqD/EGlYt0ZzACBjxgOtsiCLyt + aPEL14MJdpACaKAjofAPFvy6SBsmzkOqMZUkGvAHaaACUfsHulvCJqxM1hm8ccAEDNAGe+BbbjMG1/KV + fFm2++gBhmEBanCW9IIOUdC7yoRGEeqxSgDEdep6RLn/KkChIRaLpZMnSLq6n9AYgLGsVzJxAjMwC5AA + Bu9xQaSSvyWzrG8qe36AAZkgKWD2elNHxk+JxsUiQ93KN5hAASkQiyigA1AwAZLsuud6tEPUB3s8BioQ + wm0pqRFQtYTsPjtIb9j5D17rLFbABBppthkMls2SBXhDA/TSAW1gPViVLwqrpdMlwBH4pgP9nrrQES6p + jPfUjJnnvpjzpXk1QaIMB/AwA/QQeldsKhCyrBzEsC0AD19MytRmCbGwuSXduZxbiB3Ks32arSwdFt7Q + yeOiD26MGHSAAtZ8wdl8qLlxhBw8AR8MtXwQyCR8VZdqzteDtVu7tQkwButsvG7z/wGkVcPyzLw2bAVl + gATSGwFKtM8bJycou3knMF23Usqq+aaYoCFGjNBO1sqWaTnr66sPLWyN5Fa6AHQEUmXtpb8sqwQzoAeQ + wICH1XqgxDPJbJsvRCOgqwjv9szRnLo3fc0zPMnaHIuUGDdoOQY5FbUjvLvlfNRI3QXOYy100NRtMAYO + iQIJ4AJrQKp+SdX4GJac6gEfoA1osCZFgA4i0NU/FZJsDR8AjVhlfcpHkdbHWL41JzExWTH8VFcF4p80 + gYZqSA9noActAAj3y4ZqmsVByaRvAAmaBMb4daeG3YHittK6KRe8mT0znQKpawU4XcfavIqVTJYZMJhq + EAEq8AfHuNsHz0nO/59tRkmtrgmwkIo8BjqiA3cQN/lIovFcopZsiwRAVUEgAt/Cz66KE3El1l9szGV9 + 1sW9yvpXSW/lyhx7v/YhbMgtZWgoB5XQAumguFXGy5DEpCgTFNo2C6g33BFVrSaN0j4O5FCpbj0bF0Xu + jitCutkDATSNGO9NtJLtun0p2zIAAjcwAV+TU3nAB2OAAEQN4L8r2gQ+Bor8BzpiBdWQBRFZtg7e4BIM + RmqC3+igArsNTp/s2xCw4XXarJ5E0CBeCZHj27u2xHRlXikeuDa5jIAAB1TQHqBHKhg9xCbT13oAB7rQ + Hqz3SchM3puu0mfBwNkDDI7tW6EA36Uqz32JBv9D1AVocOVFoN8qUAMZ8AH+7dlfbjY7+Bi9RAeJ3AYI + YObKsOCwSODmeuoV6TxWoAbAhHF20AF0vkz9/DGCBNx8btb3hdYVe8QY21Yk7tZ8i5kObWwSxLCVjt0y + jtGlo8UQsCiKUrnSdiFnMA2cbnU6i63Dsg5mdAToEMFHGA/b4AbYXNmTDdsE7hhGlZxq8M1tkFND/QeD + bOt8g7W3cYTZZwdl0MhxsNpkG+XEDp5WQACYjHFBkAaYUL1UANbwgSljHdxmfdbEbdDGnaW6BoYWwzm7 + akjO3dCbV3qAYNGfIqC73LimogSAMAvwIA6FG9yrcgaFLe9lnIgujVlrbEb/+ODYpDoKIDCiwv6jNHy0 + pNo86zqYHywCCv8HH+CW/23UDy8u0bANEk8HGYAFdpAFiOE2cQPbdx+WGHnsFpAFWt0B6AAGyuRovBAw + K5ASIiES1GByVgy/EQ0MYJADbxDiyghXhdS3/uel0e1WhnKsPi/jPqGybAoBbzALVIAhNm7MbRbkP37S + q/97nstur5QsyjQOYYADhuE21uy6kizfPB2LR3LwCd8BKoAHs97wta724YLrRULaWBAELtDkXqLmAm+u + kn3DBGCeX9Co87BMZhANQAAEZiAHEeEHfCQ41DUogyNHebT+7c9OuuBsfqALxw2TFDNe396x/bQpSgAP + /xgAEDNOQFACweBBhAgxJVy4EAKmhpiUACugx4ZBiMAgYgKmkaOnSCFFjiRZ0uRJlClVrmSJ8kLIl5Fi + xoQ5kubJmzdH8gBSx0wdoEGFDiVa1GjQfnWgoWOTAIUVFFkmWEngoerVBFetbtXalSudBGQQ7HCjIYOK + DkZU/PnwZ0yEKEflzqVb1+5dvHWjbcsaJ4EVBFiCqPHwFDAZsFm5esW61QPXrXTiWFGjZgcNF1+M2LmW + 13PRekJAgOjSpQeWAjaMrWZtbAYVXZUqAZpdm/Zt27Pf2DhDhUolPeLOADOoxLjxE2DOHGdunGDz58ej + E5zunHkLeJhOFKTOnXvCg/8OGz4kD1HJ61kr5Dz02J7jtGYt5c+nX99+S50u51MS8mPKZwCBygEGppyy + Qocy3KAKq64UY8wqByEESwYE4qDBLBHQUYGPDNp6K64AQxRxxBCj6aIvD+gY44cgsijsQATWoAOyCBtc + rMGq4vDACyTI+iACtTpIhsS6ftIHCg0m2CFJFxh4RRrj6DmBHiqpAQSQgQrSsjsutTwDjApWsAE44Ygj + SB8l5FCCngLO2K45OKGT8zk0qetOCXjggWA9O8Hz06HwyHvIPHHGgeQNJTbiSNH3YrnvUUgjlVS/mmSi + 1FKRKCFjAg2E+I/IuuRZAIA9nPJAB6kWfGzVGmmU0MH/rKzwgMI43CCgCBXQ4YMPthD4EFRggw02Gi9y + /AsKLOwowwMrQhiFhTVcrRHWGx3L6i8LvLisjy/SUEuIn4QdKil9xtAgATp22IEODRqgAgwtT5D3BGpW + AOS78fIVdKEZCuBlBSoACW644phLbrk4pWOuOi0Vtq6g7eCZhcs+v/MTI4zFe0gJcfzwY4ZEGW0PGFVm + qtRkTFFW+WSWU255ZZdjhnnmliedTxgk0l2yi//CFTeoHLQphdQ4ZkR1qmuTfgxHGhmbEIQEbC3CCF1T + YMstuH7Wemu7TARLRzpYiKJFZpW5J0awIMQR3awSa5tBxSZTI4sdJvjgiw7QMcEI/w64BkqfPpRUd3Aa + sHj3uXmpoeaNey92/Dww/v1tYOIajrIAYBJWAs00ozNOlofvfC46iUe302KLFWJoX47hmAXkjQb1iCMi + bLb99klpng9lkyhBQvAdEtAAik+57qYEKEh1Co1RUoU76aTTvrbptyeA2g0LpkYnBRiu/tVv8MOvY6+k + rahBCHQ+KEzHPhC71u23oZc/fnTltmyCzIwAIJwFUjhi3BH9JCl10MceJqAz4GnAcPBCzpToYSUsHaQg + sihOl4pzhgKEKWCUW0hzDqY56azHYaHbUsNOAI9a7KmCFXOc6spDHo61AA7LYdSiMnIJ3OVQh7jjXU5S + QpMLkP+jbkOkwwT6wARejGiAQfGZGb7RBw90AQBNsQLzvOAGtyUmi/OD3/sUM6uxlKUIbdheCjqEgD9k + TXxr1JrX2mYFLsAhDAiASmH6IAP6gWWLWmRbHq9ihSxogCyZ6QAAtBCBFKRgHkLxWVEaWZcCnktdgpPB + DgjgJDCAbl4PXFwltiTBg1AQlBD4UgXAMLkyFew4bHIT6BKmwldabmHGsQEGtGM67yAkdYFyoUQ6pgca + 1pAjwDgDN3Z4TGQmsyT5acEBJ1m3dPWhB/T4mRk0cccd9AAALzAVCjSgoD5u0Yt9jB/8ZrSGPljoVmhJ + Aa8+4CuxsVGewjIRhJgFg7G5wAr/skJB+/gYPfntsZySsYIG6OYGF0SgkCJYQARwoAIDHGEKjxSRHPYg + SOANjixCsMEKPiclajzwSm/qkiit85wv8eINugCEH1LpOSV8EIRzcpgF12SDWgAjSyv8zi5bGBGOjWMc + sBsURIoqhfjoTqkvY6rMmrpUp0ZVd5DKD05WsQcfDA54SurDHpJIUQCZYQpHYIQgZUCGUQ3BVCH45j/1 + +Da3hjN+j5FBH3zAqTEYIQyJ7FUaQTRPwI5oL4nZJxOi0AELFCZFd0xROR0rTrleC5AEqBshzQGDBXwh + Aix4QQrw8INuHCEaQwGrUcKFiTz0QWdDZK0MmOAHj8bUgQ9k/9x2YOq50RmnlIAogMBOQTCYsvJNcFKh + COPUJeawiRaVoIfoTqfLi40HYxyzwVATVVRGTUMYyuRud3lXKZvgBLwjkcA1oLAuwQlOZywYQvHuskQB + JcMADaBBHwRZNw8IAQADUGxU3NBY+pETsv/cihVkUAay3IpqfMgDWz4whnjCN7ATxguxUvQYK+ChARTI + Qh11cMe4RpZt/xwx2wCpAQsl1A4AwOwXWDCGMXzgAwMYAAu8YABY6KMndgmXGeSRgheoq4ga1SgUTLEC + V8qrSiM96SdLeJxSAqylL/WgcmaKW8u5UmEQoAcgNvCG5jp5hX1qIS8hQIVZiOO6EVFUJ/+6+2Y4jxdT + 4W2JGFqAgXQSWaPpGkAeYMFEuTQyB/VAhAFK0IcXJEkG6dWBfvNwYRQQgAYzkiuJ3ypgx9b1rhoYQ674 + +k6/UljUntnLguiAAmQpa5++CEUf1hDZuIrz0g468SAjEIT9ZTYCY/jDH9TwAnO5gLMRaIAmknGC0g5F + H7hgAQKUlNGMxoEJR26gAztp2xIyrGFfyoGUKVccNKmJTZmLZeeO27DunGAGG9AFPbKdSzL7FGMIoYgf + EBU7RWmkZE/lt1T7DVWA/1vgyZSEDeBxDbrtoJLPZO0EXpAGA1CTLmbQRzJwUV/7TkAGLKCBuhYug/wC + 4Avd/KYVBgz/V4Bi+ouallquasCGq/0hnqOmuV66kDZmjaEBdujwgVDgAjJYxdIBJnGJCaoByyAUSGFo + 8a4R8AE17CEDGkA6DdSAAM5moAtV4IA+kigUXugDEZr4QB/6UAKFVzKjCldXFvQQWzk4kF5v8CS6330n + JWCwAm9AJXCrjDDNYZm4zFmP67BtQRaWGTwFsPd6jMpmTKgizpNHZlWBKOc5k8Qfr7ABHDCQcI9rVaMO + H8AQNIEKfUwhB0KZgj5QUY0GaCDjHpeBDPagLXUlQOEhVysdlOELDUzaseMs8fATk6K6JhhXVfN1W9RY + c+gbZbCPoQMdmMAAERAGBTropwxkTXQ//5rzL1kgQK1+RDUTfOELRYixCwjwggyoAellUIMFKuMCrKsA + B1DoggG0AY0oKAE8IAAyAIE+cAM9G5yFC54sgC0lkIVNohcmQy6bIohS4rspGw6J8BzhShjOGbx3Kwh6 + 0ANagCXEg7cxAw/xUAJAmAVdcLx82QhXoDwavB2dqCrxQolzWAFd6DyEW0BKCj11oYE9YAFhGwMmeABy + +AcG+AELiIABoLoJmMIpXLRK4jiNSgAZ0AYhoIA92IHtC4UsoAEACzFyErHEKJpZOa8SUIMiEIEOSAGY + awuZ+6vou8Og8JpVAQws0IIPqKOfc5/vK76ieyuwsII+oCwaKIMv4LyCNoABNnCxGFMDAoiAPxhDDSAA + AqBETqSBF/gAAkgB+0KAAZgAbfgHbQCBIFzABVS4BPgAPagENInAaztBm8q7DMLAbwsuzJkp4/hAECyI + elGAGVATW0w8xxkPOQAOKtAYfAMGHKpBaTwmHGyJcwAEHjS4B+gDtmvFBJyAPciCMrA/HHABDeCsA0OA + Sqo9tWO7HWABN9C94NmBNUCDLsCBUpkRFPCCA1K5oQsxPkInslADFhABEeADz5KxUP/DQ4Ycn22YkRSx + PgaAAe2DChcogUH0x+FrG2YhPx+ggR9RARWAAfUrgqeTvz34AxpwA6vTxE18yQUoAyJMknPcAS/AARZY + OyF0RzxCgGtAFAiclymZQFnCMurAIJUKGJfyuz1BDivTMuMwRuOapYcRwRlQgBVwNzuhIDGLtzI7j3HI + qfLANykwpoDzN7Q8S7UcuLOksxyUDyIwhjfIRniAgbX7ONbSKgS4vXOcwj6Alj4Yi0UbonVUlzFwgzhI + zASIAxnQgS5wsW7KAnC6tFgbJ8hKEbH4SDUYAxHYEKv5gDJYyIa8Qz3EsDFgAC3osO0LRI30I+N7m8ny + ADcIyZH/LMlJpAEWUMmyuBDefEkc+AAa+AILKAELyIA4yIAUKIFWbMVVZBdIgIXjUDJ56ZeBIDOv9JJc + 3CAqMxjlGK7AGyHQ6Q45wIBa0Mpso5ieUrwOsgFIUDNnXAhgiI9pnM/7wEH7BK/8SAJxkEsw6EE4CAdo + Y7gE1IABGAMvyMkDGwMfKAPBdEciG4MSWEy/iINo6YIXyEcPYKt+tEziOzk9KhotTCcv2MwaMIIa+My2 + KIIfGE08nD5mkUiKhAqoALHX5CMbfSxm6QMLiJq74YIaIMn1O0kCyE0amACW5E0auBBwTJAI0AAZyIKL + UoHb20kBVcAEoIGfjBd5iakz0IXq/1Q8hEBKviMTv0uuXvxOEOoOeqCCDQAGEULP5/JKx0kOdpODGHwI + pKJPPZWUapSPA5gBcZiNFeC8FsiD0PNGIfw4HGADPNiDEpiALBiDHVADbkzAwYFQCV3MNbiBeyyVffIv + qqDMx0K5M3yfHUAAH2jDMeADFTACLsAD0KxDFiXNmxM6RERNF1CsEAC61yS+M7S0ybqMhOKC2oyAImAL + SSPSCUjSJOWUInU4J92DjgPHHlCBF0A7Kk1APNKAnySIuNvSE+hSeWshvQMYMtUImJIpX+QcbZODGTgU + dwtBOE3Bi+GYWtAD7nAI4sCEPN1Tf4WqlejTkhiGMwDUSliB/v/MhBYYArzMVgedADZAACbYg0XrA0nN + AgSQxwRMAASI0KQJHib4glJBgcJYSUpzTfHzIkNUw7rSATJwwxJVCxlLUTuc1VFzUVnpA2jIAzUARBrV + yBslRLjyABrIAhlAqC+oARVgqF2TMTVwAxbAg5V0g7LglGVlyS+IVgJYtCFYAD6QVgVMVCrVAAxYgab8 + 1u0QVzBNCAyih1OwAYHZzlVqE++EE2CsyuiAAz140/PsStRJRioIDhgMD/hYy7RkS8Q9XMUVWJOwvGVy + S5FohTMoWGOohDfAByoYBzgYAp0MW43yvgkYgAOl2ASNAwv4AI3NvXmMgzGYAKuYUL/YrD3/mAyo8AIa + CFVYU1lSHSe6QlWpUVq1gNXQjIAVlTCbDSw9RBfA2FkXQQE0CERRdU3wKycPIL81UDpixaxd+wP3G1I8 + oNqrVdJmxQEasD0aWIMJyAM2gIFrZUVLDT03GAJ4CbfhmgFdWLNBKaoX2gglaJMzGIcMNJNfVJODgcpy + Gzx6WAFaOAM1aTII4EqeGqXHWQE9AIOBkC5+dRR/3eBHYVyTiIVhoIKCnQFjAIQ3OKVMgAMtcF9vzCjh + yQMvQAAcqCQGTQACQN04mEfd2+E46Fi1yWHHFFlTCYW2GsRZE78uAosd4EY3gFkj6AAVmNk/KIKaPd4J + GyxZkZXA4Nk6/wqBnzU6od0ioQsnOpA/9A1JESDJpqU/qP1eIy1SOGZJN7ioNQDbCaiBBViAF0DAQ+1G + ttuqNgCD51ATEbJfCOgIRF4UjVhkREZXXQCGGfCDuC3TuXUTX5ST45ADYGC3KajACYrTvwWP8/CDi3gh + g5gGDeZgPQVYkXDczMuPTsAEEQbUEj7hzMUAPvDcZ1rOScoDN4ACNliDHbCAjM0C1B2cHQ6exVTH182K + NXDMC0UXDwiFK1qQ4vtV3YWrtKEDGTiv321VFSiDWJ05Kxa10pwRBOAHLegDQAS6MVYaBhGoUoVIAjBa + /ImA7I2ApnU/qE0Qqv3nfzZSsHXU2muDPf9IgT3g4/cdPXXhggJQJdkSV2Ga6EHpX3Ggglo4V4iOKStD + UxDkMj+gBWPcMjFDwXE1CMY7hXwlDylwFMN96cSF6cWtDw9eiWkgJV2Y3BkQ1AKggkzAgBRI3bt00LrJ + A0itgbZDAA8ggD7QvRzeYR5GADIwlgR45k6NA5JFgSTF3ZQTVcgCqORr4gwoUSh2sCmu4nKep1LDMA+A + giWoAe2zI+8bY0MEY+k5WT0SOg/QAC9AA7uJgKVV4xgrg+CLWjeYQvBN7DmmATJI6B0oARX4Aj3GPcIU + PXdUkjhw6OKIO2BYKV2oBRvwDdEebdIebV2AByrYDeD4LTPhQLrVHOP/yq3onAFmAIQGtrsK8lvoSggl + qIRxoIKVXohOqGlVLm7IbdySKATf8INa0AUq6K2DBQMb+OkgI+qFXhKj9gIuUBcCUGoCKINkXt0JVUfo + IQMdiIIFYAGsnmZJkxW7xgrpee/j4+YPIIvsAd5wVkhyTmvkvbksTgC3FgF92r7DOL61kZarMPBY2WsL + uIdFTNraZD+oW8mnq0IqvHDzXQMI3QEyMIIvYIM9vu4EdOiF0GQefIMZmAG43c/9bI0Wb/HV2E8VHw4A + XkozuW2OBjy7PWBqmAUMaGBcOsb0rFdd0ANjwBcI6IRUNu5V7re3/KEkOAVjEAcxmQGAIWUwKIBy/whp + JvhcL3ffooZULvAB06UjAshVqJafP0AMtdmBKLpQ2g0ByVyaxkhw+H6eauFmqW5iXDFRPsADF3gnFlhR + /r7ih6S+BMiCcqiBMjA5HQgBJAA5rVgMA/+KVpGs6rUAbQBJwH5EzWIL95sAFoACjbtwKpSBEpBW1lUS + GTCCBWCDhG5Yh13HUrABiaiE2HCOMxOOye11X//1Xj+zGfjfSW5tMyW3S4YTdavtMMM76oBgeAtlCaqE + TECUQBnuVo5pbZ9pbpdp4s52lciPWJiGXgcGXAcGcRAHQCiHOciEVwjpsdAzRB09oyYAFcjhq9uRMugi + pYkR99YZTsWBIlBDMf8EpzpvGnuqClahdD1nhJcFbDvgHu4tu/0udHkykX1ilkRfAgF/kRAAgaCDFWoR + eZK3EYMqgdmEcMyScEp0AwQog1I3dSssgo4zIIUzgj3gg2v9ci9vrT0YBxYU5MGlAmPo9WE3ep329WEH + Bl0wBjnoqF38uzT9Rao/Dmq4M2pojjrp2zi1TgnKXGeUgm9ncrL3oQ+ehqOfXEDI6dW4kgK410zYABbQ + vcKU97AN3QnwgnsfZu/Wp/lRjDX/d92D5tmlAzQIBRAoATpPeHiu87+XZhkYg3t42SJQWoR0sA+oeItf + I5z1gHSGgUanAx3QgbGQFUtf+KVZFcdYeIUvqCz/uF40JsnchLokGQOpqD2NW7RTB9sxqKQ1aIMvwEc3 + kHWx1agUmIVTuF8kb/qkL1jnf/5hP/rOXgFqsAEwsPENNFNLTnbCo23mejI41e16NYZZKAA7PYiWJnv1 + D1j5aIa0X/q1P4NANeH+hIM5CAdu5OV23Mn0zXuA4BJnB4EPVryUoZNgIUOGHhCsoWMlgYcEO3REwVEk + Dh0dKG6UmOhhJMmSFUlSPGlyZEoZfxK4UVOEi5EeMP64+ICARZQ6Pn8CDSp0KNGiRo8iTaqUaLQuVjxY + efoHixY1HlBY0YGAzNOVJlOqRPkVqhcNa9x8iKBCBYwFRcZ8UENgAoIPE2RM/7irF6+MPTR2jJmwYweX + L2xelBi8Q7CMxYMF72jcmM4LeLrOQMicGRMEXcbOgD4zI/Ro0KVFnwG2Agw9G2D8iEudWQlt2ifAnJFV + ezdtfbUh0AauhN4sSHKUQJCTXDjw5siRN48eHbpmXbXEKeEMQUqsSN6/gw8vfjz58ubPo0+vnvwF7+0j + vY/vfv13btNGnwb2BvepSoBW6+IHHL1ooFhjiiF4oGMTDABCH2xYlMUHHtCgxkQNLXTSB1xNNNFFXbyw + B0cehJBFSCyxpFBJCaiYIlgUwfjUGnjs4IYGRdRgxAM3laETCz8sFaSQQxJZJFPbSASVBy9EAUMZVnSk + 1f8OXlWUEoswtnilV1Zo8JcbZaglAgxfRPDHBy7MhUAWjOGVl5t9/RVYAmTksQAOe7ihIIJ7PrZDAmNs + 8EZ2mkHA2WrAoGYaaYuChsl+9FABhh6xATPbbvQUcMYJvHHaqRxnKPDGcc8xRypyssyWqnSEAjcDBjYo + lxkwscgH33y24lqrrrfumiuvv/oabK/Dhtfrd+/RVyx4yH5HymmJYkIFIDMY498KBVBhQwttFGjgYAfq + OVgCE+ThBhRs7BCHBQZ54cKFDi1Ex0NrRHXlhxqNGIqJT4Gl0otU9quSSzBpMEYNaQxxU04f8FRHP0ZC + HLHERjbVVVY1RMFGFlGhgAL/AnGIdFJKLXoFI0omW0GDWRN88MVabRVhJgE00FWGDG3e1WZkLLgRBwtr + jLsHC1q84Ia3fCI9RhAzaKcZZ/shihp+UlM9g2qsRQpbapz1dtxtZ3QaXNhKUGNDL3Ict9xzppY6nWbQ + UXdCARsYA50UzSSbt957831recz2fex4I0x92gydTSuOtWBkW0sQfyG9p2SPNYjAHukS0MdBFsaboclb + SVTvhyHGgQKJM3cVFpb//osiijtAJEPBKpgzBBtmfvDHjxPz3rvvQ0WzzVM6PMVFxu5ehQITI56UZclh + pei6Bl74gJZaKoSzQJlldFkzzjrntQaecYwhQxwl7KQC/wteHD15ZHzuEY5srEKwGibPhpa//vqBwYtr + WldKOLXBlKbCphzl7AY4cuhFOXhRqt+wzTmqog6rMAGHWkAHGHgLHAc76EH61Ao9gCOPK/SnKKZJi1qV + eMMbsGWDOXTgLwo6EGTCtZg8QAEBYwAaQlJmIYV0rkUI2AFWoGIRHfwABxGIgw48EAovuIFfJKOSB5xH + sgRYAQ102AEU1jCBgrWBArYzUxl015PfoTGNEAselKCiA4yxwV1W6NgYpiSWFbEkYCuBEUWs4AIk3EAD + LasBW9wiMxrIYAxlWENj8oKznQlmDGQYFxRYIIKiHQ1pk0tABNKBiQA6DQL7gYAJS/+ZP/5VoBZ+sEFs + tMObr40tOAgc4BuYcYa0mUpsEoSbqlYFnEq0YAUn2A4pPmjMY+rNWH8D1gjLQwRThgYTuphWtd5wLSqM + Qw8K0IBFIpfJxaSACVmoYxwI4AIUlOVCQKyIvKywodBNhIkgEtFTQmEBN0BPdVYKWL8oQgeQwY4ME1CD + wVQwABzg4QO5K8IZ1ejQhyKFjR4gngfgiDwU6IAJPpCXlqDHIteJzCvyUgMItEEAMKlATIb8wMzoYoGb + wRQvkZEBGfCUABbIIAEl6IMLVICncE2OMXtCwAMsAYym0UY1BZiBOJrq1KdCtakzOIUNADEOG4yDUph4 + zqgIuKmFTiXHU7XQAzUsVRvfSBACqCKV296mGSroYQbZ4QaxhMXMu9o1r3XdK16ViUzB4Qo8RIiqU5ka + GyqsoKnGsKYLZ9EGoUKmhu/71mPysIcsDDEBPXTDxjgqL3mRpA9rKOJTLvIDMpXuKlBM3erYGT0rVdFK + oKXIDpjACBoQIANrwUEKcGdGiP8CN7hBqdhIomJRrFhhFNuQwR07iiItfZSd+4SKBkyEFpcVMgN/4B4i + EWCzyOxFpomcQByYkFMy9GECRkCMYiATOcjQIQsmOMVRIXACR+miAHqYhS6o4N//AjjA/7UBPIwBCKxS + KjOzVAIsxyZA4XwqVKNyztp2mSpe9rJVq0ROMf/q4Q+Lp5nKWhYHWyHgAQMYHn4ohw2m+QZd2MAGtWjD + QDSZIASRiw00QEACyqm5dI4EtFUcchfpgIIkTakUXyiCD0xnzyj2E48gNRkeVcTFexBAJiIwQgpSgIec + /IGhwh0zcCVKPCsYL45R8UA8fjCBkEk5nyhR0b9SViDrpRT/ZoeUgZpulrOYNmYP5C3fuPqAhBr8tH03 + fgwdaGACcQTwxdNSwn+yg4lLYzrTmr40MHTBiwNndX4CHE4BgEEb3cSyNtSgggKOM0u0io1tbMVwdOTw + Bj2A4QSuADGve71MEo+YPrE4wKYzXShO6wIYMwAEXF2DTcdKbrKUlZwK8kAGHmv2STFpo2tLMkTSWiFd + TFgyyJyIBBqkbo93JInz8FhbJLiBAEVQATr40FuF/pbM+k5jxZ5i3CjkYWNOdgEZxBJlkK5bJQqxQhay + EAc8FzJm3OWzGt53M0beDJIB9QCf49CHF4DAmzZ8jBaMgYkzFAAQDEbOGagAgaMWO+af/6QCPUCdYAjb + BjexhPUAaUHWXEIwrWtt66qUoIu4qsLXSgdxCNfjV/BMQ+abbvn9mvqGTMyicW3wZrTbK4I9+KAPfqJB + H9CpAZGA1t9ReWdUSovEO0Elubg4e+taJ2fnfnQNW8HtvNGRAjYoVKEN2zfheyfRNefhB2pGARpCIVo6 + XxHyfKTiR62Q5TjQIC15NiT38tTnb63B4jsgAwsmcNMpTYAJOtDAAEoAVK4vxgSfydRXaRMtzkh90y9/ + Rc0RfIZLr402Xk31bj7FDEDQI/gUnnUEaT2blhdgGIDlq177av3qY5/6dTWPiPUWCykcO/eXpjpTDfwG + G6QD61z4pv/7FBR6N2ghCwn4mGY1ZyN/B1lJT4ECEaHkISS+wEZEhS8YwNm5iHQhIHQd3ElYgQz0gQ+o + TN91GQKAWcM8TOFhIMUITxZFRREwQB64i+mEQB8UHBVRyRWFRYc0HOZpXnZtV5fwWRl8C0yJnqD5zCTt + AAt4ABr0gQaAy6IJ1fuQizhQwS0pgRx8lTQVCv0wIaF0GjXY3Py8ks6FzYMJXwEoQFjFmi5VmIVJB3Uo + gTH4gSF0x9KZoTF134ilIXkoQqU0Df284cvpwsmp0GroATzAgxZ0HZ80RuiRgQtkQOgxARnQgTmhAGeh + ABat2VO0E/+1ndt1wRfswUigQAhAwZv/yZkJxpaU5Z1oxcQYqACXeVkfCF5DZeApColEDdkY/EMcXYUT + ZYEMCNkBmkwtuk6W/JMVqEEWEITmiUD2xMwHaIDn8WIjCeH7lN78+ckO/AFJaECBkAFlBSEfaoFrjMoJ + bIocRAsFNSEcFgA1VILvBRBvYIqpEV9wUEMLtEDywc0W6pIXOp99rUAqCMMZ2iMyNVP3raF32AM3diOh + RAspUct/gMErwMEGvABl/SCbgB6f9UFOJcDlaNY5lYXptFNxKcm34Z9p4UvyrAmU2GJIhhRsVRns1IhM + hGKX4UTu7A4quuRS9FsTWQET/AMIzlHjucAa+AvCPY9zFVcC6AAU/yABC16PnpXBzFBceznGZO3BJLFA + wcGO/+nABIidtCmkt9CBCNCCOSLhCaSNLlyYLzGhNPFCOIZafU0h2KTacigHM4BBWQWdEuiD25xKW4Hh + 2xTAPt7jXuaNXgLbCE3CGwyTrLmVdCihaCjONfkBM+xBN32Tt/yhDPbhGMSBB7SLFSCi/g2Zv23Ika2Z + PEkiyHTMR2oi5SFg9DjgGkSgCNRbb1WgKb5kbB5J6lgBAtSkC7xiCBCcZ1FZaYaUSoCMC/xDAhREmIyJ + xMHg54HXYrhXMrLAlFxbVIDWBLjAHt5YAnABBtkGNnolBFBBcLDKrF2YHIABBFDVWZrVFRYQb//gUvEZ + QxAYoTvyhoU1H/08w/VpH37qZ/bh1fTtp18+3Xh8wgoAwjD9Y9EdJlOtEBiUwzgwwwtskftEjgy4gAsY + jQyswbUtxGWWgAFajP5ZQRchl9slURFQBAroCyb6pmlOngfATvWgpB102ZmwJGzK5o3+RL9Rom3Gn0dg + FC8CzEj+Jh59FFCqQQkQ5cssQAZ8APfcBQKoQehlnFLKQDJuhUUgAFTAUwm4QDdNwBa1j/lwgcsBB3di + Y2fIGqrQZ2bQA26Igzhaij54DW6gWhXWhv/0wgmg2poS5tD1EtyMAF/ao1+KkN8QKnmAgjUJJmE+x1qx + FVgqm+LsBzbRwgv/1Bgf7gkL9IEb5Elk/MlCIGJm+l8VqZ1GrplphUgfWeIO8IuQimRvmgRoycA23ECF + gCI65MEoliKO8ipQqCKUsMA/VIUbkYAGECKs+qYesQTDySDEhcOSQWmXwA4vSuNS5qDpPadFjIF0LmIf + UKt77Ylg+MAAuNwRYiM9dKcuvKOpDJ2aMhhuQIAfAFB6ktp6csoBNQc9QEItwGUC+at48pLzJZ2gEuw9 + NpMEYIA1FSiptGtaPcdhnoGkMs44wMFzipxiZMELOOnNRCOP0UG7oECHembccWuINpnamRaZLARWQIEM + wNmKxhlsrYFQfiK9qeRr9mrOBo+SQAUUfGAZ/0AFCnxDFujkiryqq+YTyFiAGiRpIY3BH8iF51Xc0URW + MpoXHVwbqc5RVmQBuljED/bJYJBrZpwrug6TuoLnXTqsfcFrNt1cWtpp8SmBW/arFQIHrK1tWjVHJxQs + X+ZnsHAfe5CHBLQABvxHgfIpXWYHpCropI4DJLzA106bgpzPAESABcyFZCQAE0wJyJZAFphOG11kVAxR + 20HF6ExiFSkXJh5t60KPlY1BCQzUvBlBDaRA4DGMjebsS7JRqQqrVUxUNRAczCZrReiiBdRIGbiMSj2t + GkirmiilYxwIE5heZgHGI3KMBkBBVcpU2A5GHIwtg5UtPaBphUFQLgFHm/+Cjbze3KgN372qDYOdgjmY + Y1z6a3QMHYbZTXf8bf/+5//yp4flo9+IhzCkAjwU7uF+VdsAHakwrsRSgR+EA49d5ZTuQAmwgCQ6qWB0 + LEW4wTmVgBp4JvaGjogil4sikSTCyDcwALopK/GGhRbVlhfFaArkAY3m2+7eaL+hAVQgAAMMa8d4ANHS + GdK6LsowURZU3HURUlswaec54NROG2VZrZ9Ep0ToQBOhgAaAwBfNUCaxwDgIB7qabWcgEAPLGnKorxL4 + waTMz6jknFquJT2sADMIh27Y7fmu6apwQ98a7AcBzqFSQiqMAwIbLoEuMKOmpxJG6oJGcBuwjzcxEsP/ + kEkZuMFdKMbHWOY52QhpbWbbfRs8fYgKT8Q3YAG6GXEqh6RIzB8ZyABB2axrsiSQ6PAOC09x1ebvztGP + 2hEMm+BCWMHS1ogvjknzDiOfxaL3vg/pkZf1ZkC9jIIyYNEEuIEO0AC1ehMLYICCkTE9kC/aKnJc3sYM + yAH7itqllJqDnTEv1AIkUMN8Bt+6wmN03IIfE+z2CW7g2AM2jUMLwAMkKLAVpnGFPbAj+4EJEIBFhF7o + LeMOrIHufMAeRAAB9IwO0BTsVOYHh+zZleyaSQT/jaiLKgOImOhT3EEXRJEvayJt/QEN9x0X1AAOW2At + x6aO+jAQZ0HyoMBuwssR/x+t8apBsw6SEcBMtN5FH0jxFA9GYHhAHQ0GAqyZL4RAVGhASHCJDHVdH2zz + dnpz8qmrQJvvg9ExZviBKYzGOO5GgznYEcoBHMDDO7vjA0mQn4JnZhyAPeP1eAQoAaPHJPSXH/RzC8DB + fyzqLsGzczBy4zKOH4iAw3lTFrCAQkXA5dIAkjbGp34s6E4A6KpdO7XdBzTZiKKqiDRRCFB0HrnqEYsM + jHScG1iAbqFDB3AB7g4eTfPuNoAoj1oFRo1g0U5e6x7xQSCBaipvnn2BMT8pNutJY/iAoCmjRfwB9s4R + DXhBVHgcuDrmDvTBNSBHV9IDNZQV2iYuBR2hzpkzWv8PEO3VqYMxgzBxilxzod4KhxQgi/8GsH3j9/V1 + UBp23yeAQX+NQ2AfcmGzFROuTYJWExjYwEEntWKswRpoAAv8wXa9AGXnTMdOiRuUnciGjpb6nxX0QekY + WTzdQBfgi5N5ASq/qmrzEYygDwTmlhGggxGogEzTsm27ZO/2cG3+7FVkRRkcq+f4NNL+k2WSgWoOUsTF + BUVrtxSD7VKXgAdwrkUwATxlrxdQFBpIK0M79Bp4HCSQ7fii6XjP5xq38dumNRXG0nL0whsk357q8Swl + bmaUYV4Pqn4X6nqcw7UAuIAHdDzHLYJXwmpEsAkgr4PvgA/4AAFIeF18QIUTQOb/iovHVuRmI5eVtx0U + cMSlM9EPkE49QZEqs3iVKMTnYp680Ztsy7Tu4jjh/WouawHQYoUyIABzrbaop3aMBPUO0ABKicmS4YQG + JLe3/OAaFEFODZGLQvWITnd1d4UPQMFR7qIGWEAWaMALgDltIGFXj/mB0g95ytV5v01X0V4VIhA9vEEv + wDdznLF4ThAEBKqdy3vfiNgFbMJq/Dc/GzJhG6i3O+EcIuaCggNj/wFnWUAZZEEZ7CILaFddlEGFWwDN + XHRteTAne6h0k27pYBQk3klqPZGKp7YqrzaMTAASoEGFwDaNB14Ot3oG8jDp6rIV3AEJDBEQ/bYR/zQW + VTuvpbfM5sGFGtBAniA17D1lK1N52xGPR1Q1RY0EZmWBC2gAT0H9C1zDbHAnuna7v2sGuLOxG6N3HJ9j + mzIDWHFhfJ8KL921f943AOf32mMfCAELfQiDA7AQn2OVn6+AYGr9v59cUwHCfthAJijAGGhAhUK9CxCU + hONETkB80CsIj3kAIn7RCEs3CmRBk424B3Q66aA4PsHLSI6655QA/1XIvAVB7X7Zrv+2/Cm++h8AsVXQ + wT2QwM8815C37vHyOkphD7A7r9FA7wxOGxnISWbFQTMyOwpQ9ytawRqE+DL2GEVotaWYaUAu4T/iXqGA + e7wC0Fb5RnrX73s/Bz3oQi/ocazhLWE2B3cE1ryboV/tI7OImD1YwuLke4Cr42Dn/aBshnZc//UDBAQI + wKhgOiPOGKAVBTLpMeElQYI4EiWWYJEBgQsXZV5EsEBjwo4dZHYgSODBTRYUJTSgsPLS5UuZH+KgoKPD + ioc4Orq82JOADpp4WWh48HAS6dGjSZkqZRqRTgIZCHa4UVNEBTo+KT64+PCHRZQ6Y8mWNXsWbVq1a9m2 + dfs2bbT/Li895Mzwj00ZKyh0+HJBJqLTpoMHC/ZgQU3VDxFUqICxAKMaGm5k9FGzRmRmGZl3jJHhgcmO + BCVlykShwYsOHR50oN4R9TVmOi4gKVFyAjc93RB0KYHgW2Bw4QJ9+5azYoaccX7EnQFG3LbtE2DORLd+ + XQk9SLXoYf9d3Ppv8bLEF+cWCX169evZt3f/Hn58+fPps79Qf/6uQuIqvXmzUBcqxhmnBXhqUQiQE8or + rrwGfwNGFwjOmMGY/sCgIhMTLBiNM4lcYOGDrjiKgAA3KBMpAZPo8KKlCVoqDUYroKhJpqV62IOFOG76 + xosJonIKyMAKI8yoynagQY0xskoh/wU8+vgqLLiknJLKKq2Ma5saPbgrDzVeQgMFFz4zbMilggQyDiuy + SIyGMhgTAYYvxvjDBQ0mmCoLzTgTyYc9JvCAqtGYiPE0L+jyoI/NIurQBVoqPEWcSCOtxA9jTqkE00w1 + 3RRTcWxY4RQ9mHMOuujoKeCME7CT4zdWlaAGklmoAQ+87xi81UFV1rsvEl59Re/XXoEdVthigz2WWGSN + TZbZZZ0NFj9leY3PlRVsmAEQQN4AA4wA/cikQEgCpII/Ts3dNJP+VuiWChvmqEUEDRYdbbQ4yHgBgRBd + 6IgAkEYSySQPSugDBRBejPElHWhyCScr0uxpDx11qMaCCXIasv/Mp07S0QMZZrQqgyW5ChGsH+ro58qU + VV75ymiyNMoKHXBgAAYXEg6hDzKCzNhMjK1A7MgPvlABzgWK+EAyyhCwALMdNttMpM3G+DO00RDYq7TT + SnAJDRbp7TABF/bhltt1uS2gFjAKWJvttt1mGww9XgFjlnGae85W204FBrvwbIMVHl5slaXW6xpkEAJZ + psWP8cYdf9w9aR9fPD1WxLEWW4UAFJDAFiDxwxo/1NaFbdJNL+D0tmsZ14blrmgBDgVo4LBDH7IAMUQc + LXDjzsxUZBEFF2NCGAUEfGA4p51+wLEmo1i0ImOemeLYSBaxsmMrJ0OMkuXuvf/+LJdzalj/BQZ6sDmn + EP566kz2y0zTgjKOdJPoOOesc4I1EMgzaj0xy0AGcaCKB3bwh6ztRQNuwIkP+rCGRe0pAX3AgHR0Q48p + 0IM3tslb364jB+ooZ1R4y9t0qkM4DkpnA36Yld9qpQ9ciUc854HcDGlYQxvOUBhJMMYMVkCuSiiEWwEa + UAtagIH+JCg6GzwhJiIEjBnwZ1sYEgEBviaazFgEARnhl79GkqKTTEAlYBwewmaEPDrsBGI62kuPeraz + 9rUvMHSQwQeOpAGsoINJXYGSWMDXRz+mTC45qYsOahAFNmRhLx5Q3xqWghTpRe8wiXHDYhrzmAwgbTKV + uUz/oJaZPXwm/1BkuBpMYKKBEsSMBhpAkWhoR4cPYKBU0SEIJoBRS1oCg5a5xGUtdwkBMIgDAuPQw91K + JYfbUEdVHGzVGcxhjGR+Z0F5O5x4BtEsyT3LmtnE5jav2U1tUg4+4LRPe5phiUjx8FrZ+g/qOEdEOPxn + BRC45Tx3qctcGoQKTuSPQgpgAz+YgIqZ4RCH+rCHD3CEBbvrHcBOAjzhIQwmCABTTHSigx/4pCYoCIUX + 3ECHNrrvjU+JipGsoiQ8NskrYOHjH1na0raIzygo8AAXogADL+UEBWXQGZlCujE4pmlN82OMCsLxhSLQ + yU542tOefDA1QO2AgGMgFGpykgXMDNSKov/pAyQwEUslEGQgu6znWHXJtwIAczl3w4QSXGiqAvDthLaR + wxmCYAxjmpCFGsRVcaQgzhv+FbA3BCe03uMJcyKEhz4EIruGWER4KqGs9hyrLc9AhQntc13+NEEW5pUZ + OojGC3ug0wu+0K+FlgQoKQnewSA6IzrcxApn5AlGb4ICjn6Up3HQyW4JQz0o+ABkIqPTHl1aXOOaJZAx + ywlN82AzOigjFGLarW4lohTqTreN16VuAnRQBkkKrX4LGAMCkjYVAjQNap3cwScTULUdQME0MFGDF0JB + gz50aJWveaVXv1oQepJVrL38ZTCHSaoNkjCuy2zmM/WqV1s1iHAQIEX/YClc4Wg1az5+HYGkzJlYKK5T + FzbIROfeCYYVfNWWKZbsPCt72R8uRMRTpF1WM8OCMeCBXybaDGDG0NAWeWGMMNJBHyZqk4pe9Cc5CUW/ + jIJdn1a3MLqVsk502zGqlFQF2MMBHkjGApMdF8wuhWnCaMoGm3nAF77QqVF8it0pb8ynU9buz+TXpqHG + 6ahqSGBJrNo/zsigqTJIEWAKiDXTUDULIclvViPIVejIwYWzTDGAJWtWtIbQq6dKVVyVIAdgNNOYhqNV + 4YgDgQNYGNWp3lWGiTUfIpwzUjvEnDqD2E7HruDEk15xgPGpzxeDIRP/DGgVXyMSL0RgRAqVQdOY/5Da + MB4sJjiJyQcSYBOcSEQHUcCokr1QlIlY18lu1smTg6Q/H6Tyjlv5A8mKsNIwvxt8LqtLXaxQyDxkoS4J + wBkj33zdOO+WtwHfrgeCSgNKFm0MSCuRJjMTkvSKZA+ACVRJGuYSFJymo32YCH455EpYKrGymPjvrlPs + S7QWGG/XISFevdNpZjqTVg8mNeKa8U2bc/Pm3sT5ztND2GJZOAmSEjo6M4drdjb2nbiWp64pjctePzEh + MM5QQAVa9R2wAAGkLZEbMOPAgDkUyBCNGZHpcPHk8eQLEbOCMnyhBjcs5c3iJjd15Vxlc1vljilgA5eJ + C2+/e098OckJDhrABv81DDJMJWCzwMct8DiTWyI/++6b8IzUO+2vaXri09QSAAWokibIqJmAF2g8Y9HQ + pqsbnGVkm35LJZwVAn7AdCw1ncwTenrBLZf5C3Wlat83zq/i9Hnk4BMLSzwR1ojt4T63xa4RExEDj2U6 + yXFZWV/z058ytiLtBqoBFuyBRCDZcQJ6TAc3tIi1hmZYHzxgE7rsQBldSHuaPLDRoojb33MPt7+nUhU1 + hAx7UmDdyuAPIsBkUObvErBl5kLwrIAJGKC56EJ9dEbOGE//2kzOJC9o7gwyMElpLEDz/OyTnioByAC+ + YKRQ+qAEXkvRUKTjtoq/JG36JkvAxEEJZI+YDoz/OhLM5YKgEmwvwvSqrSDAVWAoFn4PCZFw+NQDnLjh + sMThCc9p1jQHdVqnczAAEEwMxcRq11jMsqAO+6bO9LBKKvbgBRJKx3YAM77u2czO7NQvCzLKyHbAojBK + pkIhC95OSJyi3+TOyXQkAfTnSJJEBSiAD7aM3dxNARdRSlzGo+htDP5BC9Cn/cqgBKIM/8Rt3ByJ4Cav + MYqqCMhrz/ZHT9SrMyagvURDgPbCJdoPBWiACWiAlbZvT+KANoLjOsBqBknu9YAJB51jrVpFb1DF9jgI + 92BOmljocG4hCZuRPpaQcfxKPTYs+ZBPChUL1xiLxKSPC5uOsvLpiX4t2GTs/2vGMEVSYA/6hQzWQAaU + ob1O4vxQgAzCji9YESZ0gLOszaPQyCcSgNveLhMxEE2crLo8YAJ+C+9UIAiYZN36jhEf8i0CqcmsAAEg + sAwGKbp0prreLCI60iM/siM38SQIQA3OjZIcw2jIK5PIC732RGr+JJQQQAeszRf2wgIizvRo8TUkqKuw + Y/V2kdeeY8DGwRRykK2iA8FOSMFg7laaEpr4qudyTip3Tueq8ubeQ1loyBXEwRqFTlKILluMToj8APq2 + JdeA0p6eDrPAQMQUgOqqrhxLQAWGgAZoQBvW0QNESUcMZrVCIb5ICR/BpOzO7gdwQO3q7yMGsgKhLO6S + Yv/KrGwHvIAA0q1JnuQDuAciM3MtogEEDoUiacYF5i2nFO/JQNI0P3K70CAwgmqSKE9O/kDPZJEUlwpq + mgomrciAbKIaqqEm+uAF4gAuBQo4Gy315Mo2ZJCeurCWejGYZu869obTOu3T7KrlNKgIGWQEnFE7Lyyc + Wu3nonI9LIcrx/MrY83DXmxzng92uDE5Aewbrw/G/IAcdZIz6MAHauAFUgkXtCGABAgeW4IMXuTiamsm + 9yIf+cKj6DCN7rDbjCLutAvcHGkjG+kozA1JikAETkqPVEozOzQuuuARX6IiJxEjXUDxtisBVFNFU5RF + V9RFoewo0EADLmOShgYlL6n/vJamFPUEJ91LJmVqN2XgNPKEXrivPvdLiWSwGyutBgnMKIlQOnZwVaBp + rnJPGRuMQaRgO7eUSy8g6J4I+boSCrlyCsXS1qJP6Uau9fBpQizhxfpJ2HKyHHcgDr5PAwgAF25gAuIg + DvrAo7wgC0JhAkDg4vjCDfciMG2iFXdC2w5zye7v3ypQUlXzD4vkA9YgIbUCpaDkyzzUU8ci8DyADijy + H2qG3nJKI2P0NFf1IzcRH9nk4PBMFO+kD/jHaTSvqS5x4nITBW7gDnQr0R5o0QZqq4rTOipr6dqTF2Ev + rQzsOYmR046RwRrsKctDhqhyKq0SW7c1KzEsGsdpPYwP/0zHMwqRT9awcV1CDOnYU8Xcs/rAEbPmARzi + lBZNj08nIB0JAAlkQNDIoA9SC0AFlEALFR/bD2sIKP7mD6dui1UbFiQp1crO7Sqy4hCHi0M/9VPl4hHr + YkRDM2bCRCMdVmQ5UQ1KskYrKSVzdJN2oAX7x6kGyAQRVTWsoDJ0xOqwSr8+zifzabKoj5ZMzkmdtdOi + tISU8hhDzTZMaPeKAxO41Gml8TudhXG4gTzJM0y98jz9o9aWA/qy8CyXlNLU8k016y2D82sQoA9MJDP8 + 1ccEdQJC4eJmsuwQFAWyYKLoAo32IGJkKgTy8CgmYmQblrr0Zw0uNENTIA+G6zIVEapjMxOm6K0iYUAv + cEqnAldkAbcTg+YLasAxXlPP3IDP/uxWRWINPCMVCegPCtXisgAiZsx1UaRYvUoXwXZZLy0H86b2ovXT + TkFVZO4pj/I3mNFph3fVmBArwXU9RgBMx7Vqk49M04kKhWgbcQ2yaJcG2TQcFUJe6XVOlyoBvI+LRgIB + 0mRgBJVQZzJuGYYv4tCM4C+NlIzJLDciAHd+PbLKpqJwJ1ZDScYAT/+mcTtUYwXJCv5AEj8A8cSkfidC + gSligRuYgUGyEzEVvDo3FHMUBEdX81jgNgkIvgoVeu5rlYy0Xl7DBXQ2F8thIFiPSX92KFHOq5LSaF8O + aZPIOhdES4l3eKFWK6uxapGvXMt0cxor+rSQl5SVrMQ2DOeT42hxKvbMd/ayJWRgAghWdQvVbi+O3pTn + DOkPD4sigR8YcOnXfjsyjI9iKiQ27zb1Yv9XMx+XYxlACy4SJipXflkVcwsOvOAkAo7mc/XHVpdqB3wA + gEDj81I3bg1SlWhMkQUqdlulrZCzXWu3OdXqKN2qOqKVmXhXCYKwWsODGbUVlLNVlLmVO4dPnIj/YAZS + mSuvtit3yDyXDz3VxgrdiV1br4hbLHszi3vps+r6FAFITzR8QKLMzwVCQQZAIBTQdyaX+eKuWKZiS0Ht + sP4a1HLD+DTvFwHyN93YoCH/oN3YGIBBdCIRABri+IABo44dluBcoHCFhgsoGAHKIIE0qSVDogXZa3x1 + ggkIluAgiNFmMWdjyZiU1IhvqUmFySitg4SKMTxYRQ4wgRmoU9RoWDxw+GnBVYfj4wJYYVxnoMOstjy/ + EoiPjixvLZ7UtAuRWOraACK8lxZhYwJ++VYFiHwD1UXg9uJCQHVDQBnYl6K02FElA+4EFySteX5HCgow + VX9VoAb+oAwcEpwf/9IRYWaAaUaO2y8LLhGMt9qBu5oiTqJkFWNo4MRzk2o2WdYlT5GQCehHdUAZNEBe + Fm2RYdfRNghZVdgbmbNZcWnUYFgpYUWFYs7BrKMRLBqHM7o9xCkWkiCVO7o8P9oroRCWo1dAwGU9qRct + ec36wHAhgg2g5jQnUcSXZYAk/NMKSiBQyQCZ0xcFlMFQ63ai6C2ai6B5bMuLyZirx1iM7bdIspkkTcoO + VOCpv+KboxoiNVYpPlMLDJhvcyad1XlN2tlGZbUMVvKCAVkkWEDiVNGQQ6BPScJI4bLjkHRn29UbD9qF + vyPUoDM6eYEW0mGFqJWiIeAIDdu+Z6icVHl5x/+TeSP7Gj9sa6/Qa7ewoOsJezGrAKiAXv35axzos/QH + dOl0fFekJY4Ep6s4p6+4NBQUB1jAB9JHqJ/7gRm4t7uGENGhA1QgRKDauBVwqmHmD0BTNFVQxFl1nY/E + Baa7rGlgDWoVauyZM8jgZXXLXwvVTsBbhAGZOGWXCpI1kt1Tr51ToXeQ5Wyjrf6GFmphVpIRS0+NlL88 + lMF8lI2XzLtVPfJ7v9M8pJPvXDErXWf5ss+ywA1apeFU+7oXu783Z0SC/QRGA0JBteFWB0JgJnXa0H06 + J86ovfaAtu+QKOalYVlJcM3YeC40K4IbD9TAqSOAcVvc7+SiyUT1AU0VBcD/xLlBu15THbQXhQ6CSgNy + nHPtBzbN+ro5Q9FkwKlCgw5EKZkNBmfHEKA9LgbLodJ8VihPLqGREplWhYangBZmgRcm+ncn7L63dLAc + h2r1e5Wbl3nF9HkBnF38gEDgYIi/ds53abMRAvsWfIlBew3geiT+lcJRwMKrmJnrttoEj4Dq8DBRIH47 + a9UBXtVfQyoqXX9TfMVLxtMZ8cVfCwr+QQRCU6ZQIFFqHCRV0QPUIE9OtnPnJDb9WE9a9hRTRDRK4ANC + AQ0GoASUnJfp2lhlqckzu6yi/Hatg737hgiJkB4ygRaS1ud/Vwn6qtqHvj48obGPPs2P72o57JWpIHOa + /096aRmzrXfF0v3FtvezUx27RYIMJuAFSOJfPSCVAJ2+UECn0bdQe7raWrGiugAHxuB46q9fIP00t89h + qQt/STID2gAd0oAL+M6bO33hw+zFgcIClkAL2M8KTB0whnPgUT3gd8AKykB+NMCdVYAPjEoUKcMylgrI + rw4wdH2ONqoGLvHBQ1snhT1J/SuzS66Fk51oeRAC6OENgqA6H6yaiL4ZEXs+lHeVHXvbQ/oJrREsKVvc + yzJNZR7d4XVs2d1sU30C8oD0oAAeU/ttd3rQMxxM9F1BFbb9ErMjVf0jHx/jC/7cXOCOOoALVhwPMHPw + Px1ET8Lh4ZgSQwEJ3MDix//4s9TEBTQXIFSoqPGlyAcXGibIQJBlh8MJDiPuIDNmQgIWOzyQQRACSp4S + CRLEkZhgR8mSDlEm6AMJEwQISpTIiQmMCiZgwG7m3Hmz505gSgqIgzDOj7gzOZXAnKmEXoEzJ2TFnEo1 + Jj0wzJjChKk05kslzSJdiCSW7NiyaM+qNcs2bdu1buPCnfu2rty2ZPPCvZs374gZgAPPECeYsDjCgw8P + TnzY2IwVVMRVArRiRQFdVMaNa9ECzpvKSnDq9Ema5xkqwAZPXjEPnB8RBE6anC2xtskJA5jE6ZOAjpss + odaACIGCOHEUyIlnSYDcg/MdN7oUjGMlQagsNELuiBP/srt22d7De+fuYeEaGmoyqECXRgWeDx/+sIhS + p1+d+/jz69/Pv7///wAGKOCA+0WzDR3OeUAHHljA4IIHKKCBQh8yfDcbeBdmCN53CXhQRhk70PDHFwPx + URACH9Dghgx9qOGQDBFBtINFLEzgARM70EHGByggsIcb3G1HW22y5fgBBl9VVZNOP5XG5E0QgDHUOHoc + BcxX+kx1AhhnVOUlBHLIsYICMzDl1ZkxSdHXmmy26eabcMYp55x01vmmK4LlmRhghil22J99EgaZZG98 + dhkVfmzWAgaAgLFCaKJF6uROp50xmDGUFWBDJibEZhuGGMrQBhse9BGHB15oEAoZ/26EgoIOrxqXXBYS + 0mHFczr8gMMe1EGIhBsedKeheCOBmmGwC/lAgBpFiIBOB1zAF18EPxBo7bXYZqttfzkc6NytTECjRRlW + 3DohSOKlq653JmnnQRZexEHDBySKQFARf6ihAQ0LZQHjjABHREaNF+W4Qx9o8MFCCSlFpNKQDrPkEldT + 1QSBTzxljHFQUxqFVJJTOQWVl1VxxcwK9EzFFcUQ3GLnyzDHLHObe8GMZ2CILWYJn4v52TOg4ji2gg0z + AALIG2CAgZlmnHkGmsZQk3ZaapJlaoMfJmSnoW210TEBF3tsdKobLqxKQwiyIgdrccuhcKuCO+jQxQsR + UGcdGf/ZnZTusCKty10C5tHgQhEqUFADH398gIB89G3r+OOQOx5NF3R0aEUcWSwhQh8e6AAhAmSEVGy7 + Fxq7oXbkfSjDvCTyUcMC+H5AAL8IuAjjvzLCSDCOOvZBhgp7lDA6ScSjRMeRIMsEwZIZR43TTlFOWeXH + WzG1ZZckq8yUOW/QIxWaK8cy8/jkl1/nWWi9SYSehfFs2M9/DmZJ/EMXTZllmPmRCWcYIP2opM7zydRU + Y7VMtMELKCne1kwigxewYSMd+s2q3EAcHYTAghi8IK2a4wErxK0Le9jDDsxVBhoEi0OlCw/p9GYS7vjA + A3GQwR/QgB7CoSMFKUjc4iLQuMj/+fCHQNSPgRDknARAoRwiKIMOzNUHkPxNdOF54rr0VpJ3qWF19FKB + vQqSr331C3c7uF1E9mAjjCRgDS4ogQoWVpLRPSyBKpEYJry0JIxNamNCgYAfPHYlilmlAEDJHlXABAdd + mAl8SjiAXuxCF7408pGMjKQjJVmzNaHPTZeMxPrYt5hOEmZn8RMHKIF2mEGtBn+ZUZTT/nfHqA2waisA + QyZe4ykMcc1hE8jDj6DQIS+owWwXhJUwX8U25tzKCnT44AtYYLcQYIdDUgRV38ZDTQ9MAAo+qGEb0MGH + POiQcUEMpzgfN8RvYU5zD2Iiuja0QtOVjjvcQYMLLIBFEtXg/3Wxm91CXPQiGEHkdgiACAJyRIYyZAF4 + IIFYAhtmPBcgKXmhscnzRgO1SEWPKNPrY0ysxyVBKiFLYKKGHlqQMj9S7BLmS6lKYZZJmG1STzvjWc/2 + FKhQKsaUhUJlovj3mRVcLIBQqxQBLbOpTi2UoQtMwAResAcvICCCaghBCbzgqgvGam062ODbPPDBL/DK + XGowYd9W2C4VovCsgEPAeZi1nsN98wU9HKdc5wqgySGoQwnIQjlqUIYOQqiJUAwsPAOrrr8FyQNqKEM9 + tXivP5RBA26YAENkIMZ//YuMCcBRAsiQhYOy4F8PQyqRJPYVM1nMjkAFSh73aKWX+FFkJ//wqFd40QJI + UGOQXVGK+FbK297GqaXpwwtZ8GQpTnpypn6yKaAeQzSjVeZQTIPDKkPTSie9ElOxvJoItGbLW6KEDXvI + Am9QVTa8WdWCVy2m2zqYTLkt027XyVvfnvjEd0LRsCI5VQz/kE1mbXMIiFMcOOlK4ALnp5xFhEIuRJDO + v65zsNOc5mAn3J3BokENWThPFmsgAi7KjgZrQIAFYhTGEsOoIgkYA0ERgAARvIAMCv0UbY73UDqWozTO + s6iUlFCU1vpRCdf7Xva4Qo83MAMTUcmtVzpBySZP8smQhLKTG0mzOd2MfTmTKWL6tCdj/Gl+gorMKQ+1 + 00X1FFLVzdj/K1ejqUwowFNE2ppKJsAGKPSBl6hSFRmoSsxhwkoZWYjDejsYhzgw4Qss8AFYCQDD+0r4 + 0YKNcLtkuAayFcEIYegBG95aLQN7mq52rdytUgCHDjyocr4AgRvmW2FWs5rCsEZsGdaggQ039rG0m3Vl + S+yQ4HmABaHbARP2UIPgdTdDDTMJaWGiD6ZYLFJA1QnH9MhHiMJWthutRBDmiFuYNMK34A43m4AbXLLc + YgaWKq5xt/wzT3K5MY+JjHNRybTOnDnaGluz1bCmAWPdMiVLzQITxhDBLKDAvH1OeFYFXS4FjYQFERCh + FSSUBUZHGL+GhTU1Cx2SEvxhDcsinDl60BDgD4yBWvX5tMrDObkT2koEQghCFjqIBh1AwYnwLPSEOa7x + nM/3XYrVwIgGogIP6xMBuqasDNawhqUvvSJxAF1JxrAHLSwsxgstEo0hqoTTYIKiOYaelIhiCh9/VEsd + FWT15DADZgAitmhSSljETfe6x+nKxsWZ+9r9ZVIKimiVyCmZ9weH/lXmp2kWIBUsFbQCigCBMnZnLjXA + BARU7jcH57MO/CzMDdrqhDtAAFNHmIAQkCE2Ouf5zvPL+tTzvF2SPf3g1gMDGCTuD3/g4cr/dw/EIYak + XFwQQgfIdSsdIEB4I0m+kJTfxuU7P/mFNskHvBAiBNiTDxHAlwuO7q8X7aDpvCZj1DOygz18gQ/Gps1R + j6rslkCUeU1K7bR7TL2qXFu2S1GALqixsq6oye4ASD7ARW6RcAnoFhjqpncK6EmgRFPJJTTydjRJszSq + dG+JZxqoMVSyhDW1hGz/plQv4AbD1ksacHA08CpW4DZLtESvEmjrhSAj4SN7oGgSAgLZEX3Np3w4+HxC + 0kbJlwAeVwI0UAbNgg4iEGB/cHJxxXtMqC121R1WUAMYYAfERx3Hl186N1+ut4Wqx3oZYVC0NnQ1AANf + EAGJo09jQE9K/0dZYcSG4scEFbIDbOBAV7d+Q6J1yPNjEfUkAIQxYic9ZgcmMXE92CaIcoABepAyXqIK + iyRljhhlkDhlkhgXlhQn3JB364ZcycUYQBNvsKRTimJ4/4Nvikc1bLYpsMF+7vQQLwACPlI5XuACmac2 + wpSCLNgQbvM2JSF6EsccZYB6WJiFXCiMOadz25EAv4EGGqAGEdABYcAHfJAB8JF7S9iE1kgg0QACwaIg + OhB8w1cuNXd8PBeMW/hq5MhzHuIvrDMQZIgvuLZPa6h0/0QRQDJQExFCu5JQxwZHKbFsSkIFiNeHFTV/ + 1fZjThFIXpIlg0QN47ABingmEEAKATiR4/9DgH3RDAh4gAmIZXu3iZ0Ib/Uzb9BVgU9zgT2hb9mFNdzl + gbfkNWxQAkzwAsESiygwAV6gglawgjoJBQx3KyIRehE3QhJSQudIjq13jqnXLr+RTWUQAXbwjN4UH0p4 + jVRpLU/4e1yAATJXLglgBeLoekc5jMKIhSfxISEihioQAWb4i7QDBWvQhpUFI+I3UJuVAi+wAHsAI6qo + fjPmUFzHPKiFY3+IUWYnE4PYUUKWkEohB1OgC72gMlwhCxZJkZRpJ5ckDNNwgJh4XDPQgDM1PzQFZmH2 + iWS2GYXXUwF5gULVeETlZnCmQMayVCDwBy9QOTRgcCVAADi5ROVSLln/5QO5eEI+YH28UjlZhXrEuHPl + 6HPFCISggx7N+IxISI1VWZ0BYiAhoSAeoAJRYAd/oCBoYAUfgHPFCJZiyYU7IE8uQGtZtEUskDhh5QZI + F4/xuAaYZUY70AZfgAMvkFAj4YGq6I9U4XWBmWME6WOv9RRwRzJ+xHbmUCaDxGSVOaFwMplrMg3qlqGb + +T6BwhicCJIR+FwU2DQWSIo5gZKaQkv+9oG5VAJZkAfO4QVlgAIuioK9uYLlwpMNl507QHUzOHEooAbI + iZSp13piqZQfRwAuMAYdAAB8kEPxkXudZp1UWiCUIxK3wgVRYARj0EEJoANNVJ5aWKQ953MhkQWK/7WO + 9+RhYSVZikWfSrcDNWJoJkEGXECH+hhnDjNjeTgVziZR0DYpOjYUfpBREEWI2DYVmKAAKIMm3/aIkxiJ + kDqpUVaJ5UYWw5CRgLGRHKl3HUpKHlo/gWco+bM/ZvY0JnoT17VvRhV5SbVUkaUCMSqLqaIDtnJMvZmj + ZOA2eJUAPjAGQ4AR1XGcwfhq5ZmcwQh7arUsTAoAhyONiwNXVTqtB7YNHRIHCKKlbVAENBcCLkAGZBqu + RMqFJaGeWBQBjIVo8EkAkkVPYaQQlPVP9gkkYxCHRcefMCYkcran7Tcx//h18ddKqtUxrXV2IaOg+DcV + 1LABesALYLIV3EChEv/7JhaqCpuqqZqZJ1n2PnwnPzUFgeJgNEijNKlEoiWZqijZGhy4ot6VS3vGBTM5 + oyVQgrjaQbiqoz4ZLD2KaIrWQRVnpOc5pmSJg3HgBknKLM44EIkzBlNJrdTactlpBXnwA23AAoQGpuQ5 + jvsKKl2YV2UghB+AAwPRWB+gAQQgA2PwpjIAr/EIdQgQh22wB2zARhCjp8bTp0pSDssTqBU1mFRiJS5R + FYiaPc2mMtQwC5CgiA+7WxPbuHVCXBi7mZ2EXHynXJ44ZvkTiqhpkpSyeEPVZq0aZ5LXim6gApdDk15A + AOWCIMjEXh3kljsaLHHwByFEHXEQCqlbrEHCQj//ybVJGRKxx6xN+qTSmIS657TTmo3BggYIsgcMsK3g + 6ZUTMFhbm1QZwnMWQAYyIHT2RBAsgCJCKp9vqhATUL7lu3TiVxE6cq8vlmwLlGwr4X4/VkcBa6B5RH8a + RRUHWYgKWwBZoTIS6rgCHCfNkG6aacAZm3cc6zPJdRjzIzTNdT8j2RnTZaKigaJX0wb99kb/BnB5MAGl + C0MEwCOYZ7Mm3JvYtKMhoQMNgAMqVh0hkLtjxcHVCx4cp1T1yqx24KRIOAbSah/Ia52T4x0eMAb/0AZd + OnFeCa7sxLt8I00Z0VkTMC9iy2FsSgNuKo9aTFlzKnUyADa7IgNBUrcLRAcO/xW4/whAYQclY/e39UcV + g/slfroUbScOZsKIlBqpepzHfEyJZBELllBcnJqJM9WRDmi5piTBmctTqHqBJ5qBrNlmj1ckSBWbD6QB + KgCLM1qrrHtMnZzCPik6UMCzSvyLMNROpZPKFsJCszEBICADy5IBw5sC0EqdQUyl2Sg6dLAbZNAB3Ho5 + 0suP7kvDsOkQu5Gm1je26voBQipZLiCP5ru2EzCvoWev+9m+WGe3LOFaH/WnAYlvA0sUBbmYf4SQVHFI + uSUHEHAyJaUEETvA8NwmwyDIB1zPmMihPTNKNRU0zGU/Ilqy9nayaXbBngtLG5g1/Mh+XZNL5asCIuEF + PP9SAmqAAn6lnRU9UFzZHQvBAiIEQyiQBRrAkpQszHzpMHHgymsVnSkQjVJ5vLdcndhZYX2QBXZgtRNH + B6Bzh8QzzGQcEbvcB8hcxdhnhgdBAPIJBfBKvueLvhDxWZsFNngpxsTMkscDCX8pUQXqh2wMiG98sCMj + W+qszvSAAbXgsDHBuPGc1kRgwBoquTKliRyqXKOJuYiiuYfnyCcJyWyGKG+mHcWMIQxNAw4dBxrQB1bg + S1uVINvoAVBABiq8i6NnnL+YdXrK06LVymOANy4QnXzABsVLm9X40k04xCLx01ngy4TmAQEVWgDKr6Il + G5jzAaszdCow1PCZEEgHryv/UgLyaJ8CZRH5ec35aodZVyx9gAH+OqA2kdUDeb/jDMdpJ0ggpbDjAAdM + 8X9pTaHkdolngMD0TM8aqyfv04DLJUqdGJL3AwZUQAWZQJKslFpMcgaFwHjYVQCzlIp7qtAS4TUfPAGD + DdE0qgbVIR7bqFYZrR0IwNGKJmiPFVqsrdPumxIykEySpWHRaS861LSiTZXRgEClzVlQ4MvgSAd9AAIk + 7doJvdP9mAVCmMz3hAPvycxGjSJaHM1c7AZyGjpfLLc1wpfE7dPbrIeAWb9afSVtbKgGqaCJqTIkIweA + wAxboUh8LKlUvsdVzheN+MeBrJEJ7NZa1rF+Rz9iJsEF/1Cyp9nI8P3IpkgZYFBUHZjfr9rfDp0ABEAu + tzng2bmNHQIFMoBMwgKUEkcdP4vir03oWecGYwByg9OkRqACt6fhG26NV7nLLIAEHZDEnRNQPK3fXCPM + x7w6yTwQZTgGzAxZCMDnChFZ5nu+PxJ6wG0Ewt18CsSvK4Hc77fcRN7chDrOCglk0d3kJsV2CgAIKeMy + 2R3Pa41ubM3l4N2pn+RucJ0YEOzPlqEp9VbBAz0aq3mKKnrZLJoHIDABbfDQPILYRXRCi23gJ6QdfRBC + a1AdVtDgPd3Bru0wyPi2SnppANABjt7SoR3pKzfEJgFDRly1txKeVxjhDpFMJcHwBv8z0j69A2gK6gug + zLETviii6pG18ayO4xURRlywn+JX0nB+t1Yt5Fid63x4UW6cv169oF+izlUhBxtgA/QQkccusZk0Asve + 5V7OmaH0oQ58U4CnyAAtiqmZY3m95kS1sqK7tYHt0DtQ2FZQAi5QHXqenR0COgfuED4SASMUB8SKVA5f + 9rPh8PAbI4me703K7xnu0gDPhE9YaKqNBUGQxCOk6ZTN6TKWbJ9OABlQ8Uc46h/wWIheBqm+6pElAyWw + BzSwAxlgETIAPPlIySxJEsed3H8KsBQlsNPGWkgxR360JeacqEpADbVAC/w3dzk/kcAVC5nZ3cw++z6f + M7YP7aL/VLmjKZKY0d4m+94Cq+0FjV0qa1THxjWFJgMf4QUDUBJeYNh3PkVve1fCQrs/Sh2PNe/0ztMT + rlT4zixGAABGYAR/sDiQHve7Z1fbYYU/EAQfAJ6lwjD1vv3/lkziJYR/ILbQWIaJ84sA4WZMGTcyJriZ + kFDhhCIEdmSQsYMMlz04WJTYsSNBxo0ZOWoEqbEPJAgQlJw8qQ8YFUzAWrZ0GfMlMJotIYARB2GcH3Fn + gJWUg1IJvQJnlMgSilJfUghyINADw+xkJKqRLlC9ahXrVq1ds37lCtZrWLJjzYpFW1ZsVbaRiJyZAfeM + 3Bl17d7Fm7euuL0zxPEF/FfwYL4r/2zMAARoxYoCuqiMG9cCDoY3i5XUlJkZ5sszVID5raS4gI1Mbbx0 + 9LhRNcjVCdzkKYHgRUYCCKx4cWElwe4EdHgn8MCEDB0PCeJ0bLCnSBwrcVB8IIAatUfq1a1bnzCGjIYy + RToA6KAiw4cxY15EqZNe/Xr27d2/hx9f/nz69d9HA6HxOB0mUTqU8aA5KxCYYCM6qjtwhwQXzIhBBUNK + oIwyZNDgjwVUUKGGLyIYrwwNBCqjBIMQQqiECUpYYw8adthDhjhkyOMFHF4gI6TUbOQoDpEwwKSkpFbC + ZCbNhgRGiQLEUcIPnnwqySSUTgDjjBOSolKJpk5q6owgTrGlLZAvvwQzTDHHJLNMM7/MiqpY6GIzLrji + gjNOvfryq06//rrzzsCMmWEFKsQJ7Q0wwBgNshYkq2wFCIacabOaztAFLkBFs8EPE6Jr7brq4igBNij2 + oK0PK2hwoTjWHjQOARms8OC43XbYZg8WdijOiiw0eLUjB3dtsFfqdptAVQLU8A4AI1T4A4E/xogAvX7s + gzb/Wmmnpba9aLrwTSM6MvAviwQERAAjTcclN6Q+spCBBgQuVIGPDcf4ADoQRVxoIRkicGOHMfKFEQeL + JtBRul9xpGMkH39kKTNGaYrpppzGMaWnn5x8Msoqq3SyKTl6seGYMz8GOWSRR6aKlbncjPNNOeekk686 + +bIEsDwJE6zPwxJbrLHHImuBMsswa1RhzjwDjdJMRIiuukyXdoMNMhBgI6MscsOtuN804i1c34zbTQYW + 9tjDBwHLcKhcsz1KMKMJWFiDO+/C6MCIZMs7r1q778b7bvz0662/IEptzoM+JkDwbLPj6OODdBH4AkMY + NiziA7JBXAghe1XcoQjCZdCi/6I9auwodBxDisMFHg9WIqjOgoxpYSGNfHjJiZMiqsiLU7IyqNQhoKYW + SBohOXjhh/94TTjloitl5Vm28+WZ9cTzLz79nDRnx8bJRDI4Er0s6KBbx6QzSUNbAYxMLKVB9Ok0TWAC + NiZgYrY41MiNgFJzZS3VEohzNaMivmABc5zjofUZblwyOFB21jCsIrTBHOH5wweW1ay8VdCCF3TPtQ60 + HyZA428BioMHwmVAEibgXBRinApE8LgIwMtDILJcvRIiA8yNASMy+EJFXhARCCntVAoyGMVQAiShEalh + ONGJHiSGupNAySgXE6KVckcUZpBCLVc8CxbTkkUubtGLWv8sC1WScLI2JY95dnHZDCzhvMDoSY2BEUfM + bIYYxTDGMX7gmc9WcBnXgc8lnflM9UZTmtNMZ2mnal8eNIAAUO1galawn9V+85s/kKE4xwEJC3IoNubc + SkcfIaGvqqNAAnygCCJAR9yShQDzoAeDr4Sl3TTItR1AAQHo8Fbg+uCGAj5IlGkDJih34IPElaBCjVMB + CyMnLxbsMiGWo8EEojmBF9AgRS7CzR74QKPV3MiQqXEBSZh4GZYIyXsKg51OZDdOokjpdkK5Uu7OwAxh + EM+e97yn8ciYvDe1aWV5SaPL4Ag9wkzvT+Qr3/V4tr3FLOqc5nwUFSRlDMWAoVKXypT/2RLZhT4wISJq + QEACIolIkMRBVb7p3xoY+YUdjA1XoSwXAncQLBkMawxGQIcWapABVjLLlbEEalDnszfjeMAHCOhDBz4A + nBCOUJgwtQ7iJkSDP7zAce9CgBo+xAKCSPMgboihGzC3B8J5gZF82ANGROfDBq0BiOKkEhEh+r0jPkyJ + TIqiE9/JFKHIYQP4BGxgReaKfR7PsGdkmUDZ+LKa1cwwdLQeFfB4KD3y8aF+DB/RBEkapH3zkKihpi1Z + UKMs2KZqrclVAlTVqlfpiFlha5UOyqCGTxbul2grFylNqQJ0DCEP8BpDVX8qVOIWNz2zjAMdTPoBEXzA + A8oVHC+h/1ouqRqzqleNwDIJ4AYWQMFyJEoIDRCyBw3sIAIliIMXyCOCi3TzIwIDJyR6FEUgzXVhRTqS + OpdokqU00WLvzJjuTEKNVAjWwAcW0zRQhjzD9nN5d0mjnWTGxsDETHp9OugbBAUGhR6KoXt01DnBB8ii + le98GP1hueggAzbswZYZAakH7Hcg/GHNpMPh2kZUGoGw6cYKBBzYdDMiUzcIi1i8HQIfMtAHujnLuE8O + qgZ71Yc+aMG5rRKhuISsKZOWQZrMwi68PrDVD4T3IF5ViIquuQM3lAEBbSCrjdYH34Kdrq+LSph9hVTX + JO4XJUGBipSQ8s6lCFEOm2jLF7sIxv9FN1rRj2Z0JLjBYDIe9p9nVCwcAWPhxuLpsTizow1skEdAgGGP + mCXS0CZqNBR7k6SokcELesDkiJRWpPfDGm+wRqDdYDIjjIvAGpRrBSi8dMvXSYC6yFDKCKjAHEkeg7J8 + CmVqx3JvB6IDGfrgAhGo4blNLdCxr1O6D1i3cStcQAsRMFvueveZZ5bmeMsbZ7N+QAWjdW+KVROwINK3 + nKgWcTqVJDFMSPFJRbldf6nkJOB1BcEPF6zJ3FRGS6tMZXMKaJ3WuNjBGHRSG75e9nqWKIf2ccSaJd9o + /NDZFJNrxS0u7UcR4IGpeSDXiDwp/lS6yWF7SNzVkcFGaFrKIiD/mQ/JWlbdqr10C14LtwiAgpU9YPPo + /vw6UHCBMRnHhWRCLoIaoAG8okkDspf9mXtwCFnXYFYvGIEFhHP1jUBJhw/AFWHfEzGfx3HX2Qkl0Ht9 + pyggPngDl5HBcrJ4YiFMYZp1ujA3q6POJtuzOlrW5JyJVIlV3ur3kpQ1MGKDF2blyD+IdKnqy/XbL+lr + xoGqVVZwgRp6Ke7s1PQDLGhDb7UwnvJ8YbhMBz618JMt4wzgBXkow7eSSyCrV8cHLsh62JEJg3RHbrY0 + YAEexAtW7rth++Rdw9sXGK5714jGcceRCU/nb9aF+L7p3Imf/V4A20FRCf3N2EkuwRZIO5rR//0HwP/j + ii9phn2iODNKPObJuOfRtDgSB49DKJ0xFEQxte65vIgaH8WYB3BAn4xCttSYgBqAjTGQgTVwM5pzgbUi + HQQgA+OAkAwogggYDuYotuYbsgMRCGPaLXSAASVTliJQuuATQmlxulzrnDy4MlpBAC84IOvgIbNZgw9w + gQX6gy/gghXyujHDvj9ACLLzPu6Lpi/QgHspqzHYgQWIM/hyNTpwq4Kxu9Q5CbkCuNbRO75jp6KYEsCr + kmYgvD4cmbV4iwWjNMRDrMXjuIFyvDkCNcnLI+4Bmj5qCRJ7QKMxDc/SN46YABXIA69xKzdLADVIPrn7 + iLfbDR9wwQSQFf9QGbZbATpN2ZwdeMLr4KFFWrYyaLacEoEiWBYg/L0h9EX5GL5944LjW6rmMCF+gUUe + gruZUhvqIJxnZEa4kwEfmBqtm74v+IIiQIAPUAMCyD4S6b4vFCsNSJF88YLlAJtwS5uW+5UPWL+70zMi + EbglCZK8+i8qcQr7g4BY8MN+FJ5pMMAGqzhLM8SWoTCCEgwI1LBB6TBEaShI1AxJJB+L6kB2FEWNkIFh + JAMSlAELmDn6ca/VuLFTzAgPEAIeW4PX48ZmjAgZMIhovA5phEWYZLMx8IES2MEk08Yx4MU6eJZfBEr4 + uBbV2I0jvLKmWpGZZMZmXEpobMIdMME+MDf/rqO+7IogNdhC8dJK79vKFyAAGloRAtiDOMgCNtAyX4o7 + XQmipFCJPJtDmKgrJdg7+UOJdjqBQcMYlIgif+RLkYmF4+kniquLi0MsmVmjNqqwBpyjCGzIynpEEVM1 + zSONShwYDyTKCcgDKFibElSD0rOApRqXOCDFgIFFK+iCHHoQWykvj4hFZ6RJpnTGFQs72yu63tqp8mil + oNTN+8CWHXCVYURC5aMD5sOO3GLKZYRFH5BCa1Shx8nGbexGFviDsdPKraQB8qKh6PCCPUgADeAC9EJL + djzFkZgveHxLdMqvgcOr+6uY+tNDg5OCqghA/6PP+bTPAcTPqhiBuUCe/0pzsAS8NIyTMJlpQMGgHlDj + sFFbqMp4g5K7rMyQSEqxlKTJtyDziAngAi/YzB3wRFsjF14jShnQhtPcA2FjjjFjTddcyuK80BStyRIg + ujawAxgQAZ7iySDczRytAylzlRrYA+RjKtViwiFzRQPioecjiAp5AapcgGyEF6yUTuqszi/0yuzcge2M + AzJggfxImzkjmD7AgHEiJ7wzIptAIoihy5NoJ0LDEirphL6EU/5LNLYgAmA4QH8KULzINDR6I8YiDDei + nkpIFAn0A8oqtVODSJmIUMYgDc57Nbnrzj3Q0ItYgyzIgE8MRS4jRd/UiAnwgC6wCB84EFtRAxt8wv/Z + JDoVCIIhuM0bdSUz0NHdHEqi1BAtkD3WIs6YHCVyac0+wAM3qI3pSzfp5EYCiIDpLLuy40o3+AI1KIE9 + KAjsKxCvMT8f+iaNCKfyhEMlWJ14/B74Wycn0R0nysP3dBJViNN0HZNhEMRBdLDBJEgBJdC/OExNszAM + +ziGpIJMaMSfuSxH+SOUq6jzYbkKrcwsRYAP4S6XdLP5QQBZ9IgxCLcHIQMfYIIcWoOiKoMUfELkbNGm + /NjWDLsFKoMvMAI74INWHQMc6MVY/cUidBUt+AJbnTofEKEhVVEDQk4ecgEuVIMxsMJkatIieFJvnE6u + LDuwIwBqsgCwlAHuEpf/W3mV0emhHRFTOXS/PTNTu/IzillT+2NPKhE8dVXXNKkK/hREgXzXQmyePY2e + t3UsGwAUDbOjcpjAD7O8Bx2aQEq5i0oaV+umjlguLxS/MhiDBMiCD/iklqyOMQCB9TFJsBFVUf2DUtXV + FTWcoEsXG2I2EQiCGshFVupJl5VVKPCNFkyAAZjZFMTVV2zN14RGpyTSjIiDMvgAbdAAoG1ObDzWrBLL + o03WZHUDr3zWghC9ZeyDWLTM+AqSuPq3rJXH/Iq/9RQKvdJDijGJhrvP+hRA7vVes/WSSUNb/xRIuwBQ + PjXEeZ2Zex0MP6EjkNvXRgSDBk3UzVhUijSBlzLY74+IAx/APgKggUmdABmwpfn5A6i8DrfaF11JABlA + AxLVD2JbTaUkoWXkIR5ygyJwAwvoDiP4XCXDTZYlXVntgl8BGy1IPqMS0l3F3BZW0YiAOxeAAkYggOsS + 2uwq2mMFYBoAOx4mu6V9gQn5AhrY3BqJCA3IAl+zjrWqsya5uyKiq63tM+rVHbvES6ZwCt0xuP0jWzgF + X6rYz8ISY3jNUwGVMAbkC2OgGUWMvDta0J+p34BdNUadUEsM3GFigQ+wALAbXoY93MTVEcZlXH3xWAQC + VdcTm8qdXaeEu9iFTZmcgAPBPiQggJJFpRrgg50c/90RBkop44gx2AY2KD06MEUESEoXRuVG5jLJ2Q7d + xcINSRatYoEMEK8dTtbtegFnVRFpejul5LXOMyR+I4mCM0/o/VbpDVchsl7AEyII4OIuhuZhoLQDRBl4 + NaOC3LgJm1fEfEB8ZczHEDkMKDX6/VfMCFi+Hdg6tsgcmZ8IKAMLKLu3kwHDddjaug5Tno4JuAEhwNgD + EaEJtkE22wNt8IIODoKUJVqeFGFO7uQSpg4W+AcrYyqaO8uP/ViPtWiehQICUFLHGVoXMtYxKLsdVtrt + wgFdjibRExGPIIA+QAN7Rj+6EyeT0GKsfUw6lOK5pN66xEMA4yslsCJoTtc0kf9m/3TXuyBMTOsLRCxQ + B/Rmum0Mu31jEEtUl8gsdGbUTHDUz0oAHzhWsiGA7YJWGSCPCEGAOHCriEjriM2XXvHULniBsCFlOsA6 + F81ZFsZouMM+gt5BTN7J3PxJhhZCT9YIFsACLSiVbPMAEABojCahJ5QqN8jdC2kD6sOq2dqDDABgjg5r + GghrAG5WsRq7XoZKt/oAnO08UEIcOyvmmz7m2ElTJYAS99wrIeLD7cXt7s3tRvOSifNtf+InpFZq58kT + ORqMO5keyINffjXU+XXQMlVUiSoxiixYquWIBPACHJAcDQhrsRrgLJiVLDjgNSDvtC5vHyDtC0YDfna9 + pgL/aIvW2UW+iEo2WXTgg1wsjwhYaMEewiJskD1oAIkm5QSwoUEWt4ggN8/WXaFdgCLQrhYKa+7m7M8m + gCAugWqaAJVWGxdB4t1Yx6p1Qyc+Caew6fuqw9he0yvGnRVvUyXgR6HuS7O9AP4k36MWbsVDX5jh5sZ7 + PMiyI8mKjMlwxKqORM2iKDrean0zqS/YbnimAXwhazMEqdIuwRJcAyt33OkwZBwAla62AjJI4ru2aMeO + zR1YJB2MAM+tgRpI6AjA0cDmb2qLBtNNDcMWcB8wqVN+ZGaEYZaEySfsxDLgYVe27BaKF7HMAAlXWgkH + 4JMWbWmKMxmwJBmIDQTq0hsJ/5hwEvEhel7XRk/YZhJ9UOYoKdd3ykeUeHEYT9cCRNvfBm4yhnW9WEAC + nZmCemr4vVtHfNCIFNgV2EB1rtB9u3B4wQPuJjuymoAsMEPxhsXyvvIrjwgWaGv1FoK4NlE62IbVbM0+ + z+iZlF24g1pQbCB0WPOELoL9jnPg828F2QMGaC7i8M0lnF3YrGCltKVh+QMc8Oh04ykP+YI/AGBGj3B4 + xoEQwXBvHGB9ZoSIQABv8VIIAdMeoZLVgWKFOXEqVlOEu538gydVJ9swnjhqTsCkNuNtrnU/9eY2FrV+ + VZRyhssix+pBokz0AwkmwAEX0gB4FkuEuL3SOWArL2+PWP+DfRklOugCNmABU2ypMcgCMad3Mm/kFdtM + NfiAxjnoGogAVnLzlk13KNubZKQDAL9z1dJzV6QD5IxkMo+IP7AAMvjZcyt0MavwDMDKbtSqu290NRjH + CUD4mboBZSAcFsABNAgdNUwATQcKoaiv83wdZCY4g/Mv2mZmK5HT79Xty7d8LpLPtmgEGgfMV1/bAFUs + g0RMTnPA5PZxDotfD9N1E2+URd08TEm/1IiDFDg6CTJ2Y+X5Zf95l/R93x96ZBwyJCBRYRPVhH36s88t + 5Y9JGwLFL0AlhC4PFkgBru964yrCSN4BFmAALQipjRBNLVPlZkT7FZVdHlpCJOhZfRf/2ne5yhbSqmER + eIInCK+cAA2A8mm8AYBBANgAiDg7Bg5MUHAgnT6QIGCCoOThQ2BUMAGjSLEiRovANlKEAEYchHF6xJ0B + BsEhRCUnCpxJ6RKivpdSItGsafMmzpw6d/Ls6fNnzQs6WZ0pWnTG0aRnkDKd4XSp06hSp84QV/WqOKta + t3KdsYKKuEpvVqwooIuKn3EtWmAYu4JhxrgaOQI7QwVY1UqAytrIZEKDwYOBdxikU4JLij9/8GiwQIDA + HhoTPrDY0efPGhkyJmjmLGOHDBZuBn7eMYGOkBd7fCSI4wFBFoIDJ5gmSHu2aTq0b9fGvUPDnhJqPnxp + g44PnyJj/4oUeRGlTr860qdTr279Ovbs2rdz7+7derQushPsaaDlQxw6ceLs2e37fW3evW2DHohgG5IP + f76oEAHjyxcRjDHGB2rskQEBNGigxoIMqqEGAS+44MULGrhhoGc7ZBaHC194EYdBIRIUWAIuLIRSShJh + MpdGLWIEjBIFgDSOHySZhOJD9IBxxgkv+YhjJ0AJOSSRRRopFE3DLKUUU0s2BVVTT01llVRUXoUVV1lp + mZVXYOn1Bhhg6FJOJmq1AIdbSsgVF10W2YVXWIC8UYANfphAgIgE0UHYQHGUgRiBf2hQBgEGSgYFCzKU + McYaE3imGaRksEDDZ6VNgEYXOESwhv96cSCgAX2y8SYfqaHSRkMP2qhRxgJGoFNDDRFkUEQEODw3XXTf + 6borr736Kl14su1QnhZ4JLCnD3uMVl9vt7mHm7Px+dYHFF6o8QcOKqgAwwIBjvFHgV+MQUCDDLrwoAUa + 4FCGGy8Q4AZwlEK6xg4fMIGADwKNxydhfWDQEEpyRDQRmy5ehJFHM45U0kkurQSjjxDhqIRDQUaCJMY0 + ZXyxxh1z/PHGIXssMsgjm1wyyhvrZIlRTDr5spRRUjWDJU5RyeVWWFa1JZcr2BDWG2OZRcU4ZrZFFlwG + s4mRXUuJY8xedGbShheDDcanQS/wkdgHHzT22BeS/VHZB4w6evb/2TKswYIXpM3mQWqrdfppfZ9F2yze + eZ+22x7aaPBBBCK8GusYEUSQwq2/Kr44479GA8Jse5aXxx/p+aADFDRI6x7npkX7rHuffYAHuWN8IcK2 + C7wQAQsEGjiGgxqc++CqNODwAQ0VXsgCZ5ytQe8HUCDghkB5jljiiS/ZteKLSs8V44w1ltSQSzq25GNM + ESthsZHde/+9kS2/vCTMUEIp88xXalVVzVluZUyXMwAiZ5hnFb0WmmSp6fxGcr2ZV9TqdKcEGO946oJB + ChDQtVU95gViqwwUGLUZR0EKUiwAlWZmg6kv7GENrUHCBaG1udpUaoSdo40GmKCqP0RABegw/4IRmGM4 + xDWuhja84XWCNSJiISA9a1BG5txmN4KUhll3680QLYM7AmBLW9wKkHIKJCA10IB2DoKQutj1gixcKDIV + pJcLLJAFF+hrRPxKgEIYMjEVFWxNdEkYBPywsBs5jCUnkIX2HoIjCCADfH784x+RRJNYuIx8TXpSVM5H + FStZqX1Y2dlWLLElr/xMLEKzn9HckrQ1zYVpdwEgXzIhAjztizAGkdQCtqZAQREKMjRwAwLGsINYmgZS + vdvM2ggAmkpNAG6q8QEd8kU3t7ntNiUsTQmZZSnTsIAMwymCEYLQgRguJwLOwSE2s7m4aEChiORpQB6M + pR40iKZuRDSnMf+VqU5muYCLGjCdCtrwH021rkAvyMAVy1W72+XOQhqIwC0zswMXlKEEfVjDevh1RhM1 + TGAQURGLOPki6IVEenTMnhJ0BLGIYVSPD+EeIEMqUp4I0ibNEJ/LkAKzmLE0fY/EklYk6T5LfEV+9BOT + DcaRCfylSaIHa9H/4rQCMAgQTwXkUwlWtzXF/IGBBAjbBMYmg7JNEG0UDA2lmrXBPZAhAZdrgAuEOJ9j + mhOZ5oxPZAgAOBd2IA0RkCENcaXNudI1Ozq8DbEq15o4sABylSIrYMu6y12W5jIXamLqVqccBKjhC/gs + 1+xWpa4PtIuKhrrqZ/pQBmdqIKGCQYi/AOb/EjbSRaJ0gZ4SRGKjhqVkJdfLo49ASrLZnoy2Kastbm+r + W5XlhBuFLJ+UzOfSKUVlfVx6pJYgSUmhlgWTaznaCtTk0xd50ml6CSXVrKan1oxBU1tTTlNb6S5YdpCq + E3DDea06gT3oUjOZ6WXcPLgGHWwjrIAlK72OGdgMTkA0BEBAC80xTeW89Zq5qiuCE1yHaGShiOwB5wcS + 4AEyeGo0AlUbhjPzOw3/Tm0d3nAy6/UHeO2nP0/8Quv+4IIXFKEMDyLoi1elBhz8gQZfoKILIuMoN2Sw + D3hoFALMKCzksVYJDpUIBErLP4vA0Q/SW9HErNejiKGoowcYKZazjJON/40ApYdMyiFbqsgrFddmMOUZ + z+BX0/mBSUxoUQsc0ASG6E63TRUJ6nXpZCdSapeAMkjBAg6XHMXI2ALjBfAaYjlB9KZ3AiVYr7xoIwM3 + oEEIHCQMaz4Q1g97GMQartSFBXrh29BgeAToQwSMYwcVCGiGiVMwrOd614H0wDzo8YAHx+CFD4taQ6AJ + Naj/usv81msMVUQst3DwhSgSp8Wys+KqyjBZG1uWvenNIAK6uYY+aE5fhfEgGk+0RoJFtH/m5ggEZBSS + ORb5IQ97CB5h61FVaLne9q6JK37bpJVCZczpuxlydYZmq/hsBmIhy9Dux5a9vMXc/OsfJpoGSqll9/8g + I/KTsgUdgT8w1sWGflcfOviHMVT1bIzury4fdan4JmANHvhDbH5Xt0+XldO/JutvEOAFtQYYhjK05qtj + LfQbcpOYxEKPVytct79WULD7rU+ityEceCbWcN/6AItdrAYXEPRcLigQDhBgOw1UUcdom+UHMgNLi4/H + X+1+CCaokOSGrKjuaqT73WM0gzha9O3Wk7fEIELvexMey6rwsiGBK+aZMbLMOcNZcrOiZrCwuX5EM1P+ + 3kAxute9851nCEU+KVQ9/4WAZhTI2pT9hRSkYLFl8Li7Sh0BGcTyvG64/e2vvQcNdEZtlO7Cpb36Gg3k + F1JlFXYGkU/Yz3jB2MP/SfULjcA6w9lq6NYnunh6swcs5KGHCaCwzo9//AqSv/y1GUMDpr4AJy5A2a0b + w4pbvHWvD6f+NH6qC2jQIclIhjOzhEJm0N4EeBu/0IGJGIVFrMgM2MD5+BtVAIMunAIwOBlJrAjFQIQc + vJv2dFRKEENu2RYIfqAI7tYI2pZNsELSiI9KhVkDtpRLrU/7GBfOyFTP2IDBBU1zXV4LwAMGlAUY4EUi + xUy/JZI42OApWJKYZIIemEDVKFRgZEEKRECApAAfCIiKad0XJAgC7IEMjNxmoFfugeEERAABbIYtVVrw + eRAU2NfSiV/yJV8t8ddnpJAblEGJoYO2vJWrXR8f+jIONxXRsJiH93HKpBDWo9jSCZlQfKzBGHRBCbgA + PPmH6lgduCybtNVfgbwe2OGOhOifjuWe2lwGaJTAGJmexSVAFvQCFVCBLuhCAZjFWbTAWawiLdaiLdKi + LsyCDeTiOKzWxJzAjgAeSqDE4BWeMXqPILVCK74BIJDEGVAEmI2PCw4XmcngzkDS+3SJOFQeTukUPMAD + JOjBLOjBLN6iOdYiPFBBX8jRLMADHGBAG5DSKfoAC6je6rXetxCUBTSWFrJACSBAouCe7U2AZLjB7vXe + GrhBAsSNDAgfAthXZ3iOZxziZsSHo4CGpHlGFmRBfrCQ4MDK9NXKqx3/WB+WJHfMWiDmAXrEARncg66Z + 4W7YTUVS0C3VpBlOEGggQAbo3xisX+pk3ICUgWqUwdd9QBkYJVKqQQIRAA64AAEI5bucXKKVgWa4wT+O + RhmZEgJcA8XIgVc6VNyBnueNpedBjxxkQt9FmR3l0cQ8RDEeI1x2TxJUQiWEySrqwpxVgjEUBUXIzBCi + TzWamcDtDA1OUsEhoZspHAYwnBKQpWNC2RnogtOcgpyQnlFhDQFRCIBIIRVa4QKVwY2V2gt0Icnhnmni + 3h5YQO9tBhn0wB5sCh3QC2z0XoZwDvn1zm6o3G5oAAjkB3EYBx/ECq0cznOQpEkep3b8YW+wgXn0/0Fr + tOS4nNBFJmIizqTajI4bQOICoM6JvVUGfAAOsECBICUedE3XlAEOjMsLfAAB4EHsucErcQYCYAYFaQAU + mNIOFE9C/MuNnMRJzMBdoJSAig8ERCAEvEJadhQwbhRsdVQjxCWEGsk01MWKFAXUvEE5gsEbwM9G/CU1 + ltlLxRRyGSYV2BTCOdeZlMVbGEVdDChKMeDT0I8uoCUTZiVC8VUKbOYXIIcVgsvrvQAVIcAX/GMR2N5p + 3l4J3NgEVWUcMOSe3MAaSktnnF11hk7o0MAYHBZ/DA6KUV/QISeY5pAQkMaecEEUqKRAgJ8XTOnZSCRN + wiSc1qSk6Ye1FAF//P8kFFViEXCdfhxlGZRngSQGUzolcVgAfDJaouGBTNJeCeyAD3RYfo7BNXSEfzLE + GdhAi7qogGJCBGICjdgIJrwEPbCEEsSbS3CgR92CTYQgCbYqq75qCeYWTbDMCrLoRsyAMeSgKwKCU0Sc + Awqm412j+0AewVUSw+FUmTzXUIGBr5KPph5FicYomFABWoqABeTLeoDIDlhACuCAPaYA4YBLJuKABdAA + C0RACYzNkZ7mHqjBZpSAZtBAAnSBauwAHciAL0ABAbxX2likeqUNbeLkb7BN15zOcXCBHhJnmC4sdoTH + s6iAEGiBcxpELkVkRioidZKQ2uBBjalBT9aAJGb/HAt8Jw7sgaYZ5R/YYdc0VQqMwWQ9JQ6Q3aHyGAIg + QAUlaQq8gLd66wu8QBpAQv+cRN0tYCHVauJBoASmRQWGKo4AI48A3gU+xINGKNUCxTQULflwxNOswFns + IjMiRV28YGAqF7HyzJrRT8Jhng9igkoZxZe9rRFeFxhQqx8oQI7iQLfiLQ4MQA20X4BoTbgq0I9KG4DB + Eu/QAOIm7iu90o2ljaMggaVxYWwCEe+RUC1d5NNZrJQSQJYOxxe4Ckieq8IyLOlORzSMKW9wQSloQRYU + zyyt6W3GYfnNbgVhrn5kZ0+yX8aB1+qcbMr+rn4oZVPdjgbsh6EiLnrJwBgo/6pplEARANoCRO8CsEG3 + GAEt1EVFMA9eMOCHTkVJUEElTCC7qSWDuoRDnK9LTG3Vru9OJB6/PUmHyk+G8upR/NtVSJLAzWAN2tRY + JOY4wANb+OCvDpcNGsPBFQBa+EEbVKH0Su/qcQGAAEgNVCGzGeULlIG5Kou6Ki4H08AelMGOMWl8BZOk + ZEGjVFV8lNy/yu5NDqy1EIcLgeRwXpNclS6YFl0G7UAbRGwfgEhrsE3sUiTtDvHGdmwRLADIzlOACAh4 + mixBKYZ56ocLtOzLYh0VIS/N/oHalEAGaIoUHnEEdEsEcAEkFIW5FUURkln3kgT4ngEFPiPTpsSoli9s + Ef8j+95xTrwtIg2hk4DtUtSlOlIBGFRC2wbc48WU5O3M5AENmJhFTmEeGLwilFgJNRZhjAJCJNOtAvDB + EhtOgABItwII4PZo17gnBo9BcIyBaHRw4rpB49IkpQlByXLKergsRmqs5lJn+d0GAYjGtRTH4IRkXNkw + w4ZHMnGBELBBDweGzqkwbv4rNDuu2vxBBlyInTqRtwIIc2DLF2jiyuoHFPMB7KRAgWBLuSZI7i3Gxuao + 4UihJxuOCpQxixpFGhuXIT+SXVSCG49v9RQAHQPe4MGqq8bqQBe0QCOJMJTPX/bxcB0FINuAIAMCyyjS + IVd0sfLvUGESAGOAmLCEPX//9CMZg7EOVQGUA420gRaEcQQvsQR3ayoJ5xgokH68QFOZjhuoMnwiLtkp + SOJ+sO3Bqxv4QOSyhlc9JExGszMftTQTZBFcCAwfbJcqrHESs0ly027sSR6cKdLtQAmMy+wKMRHXLi6V + wTbw5Pr5hygbThF0cQSsLFOBM7i0bBmQs1qtS6GgQQkQwAQsbwmgpxh/cju/lQrQgrMehTH04sAldnJR + ASCcgR5YVBw7lNPCG5WJqgfiMWZHAiGFWZQwdPc2BSCvYgHo8ySPaGJ/BSNHsnPx4NwWADYqdpqNgwH3 + ry7klAInhzsDthQiMSfXwAC81YCACwLgAOnYKZYqC7nQ/0CCLLdyf/ChbgYNCPUCdBABrYGmSeQQC/Et + 1a6kYUjXrB86cIEItPPqfSlVV/WYVuSwbINK+sAOeAAI7etE3qRN1necVtAfgEAVXfO2fIHqsUARcLNb + MxVTIUDrqQEbNBW2QAgBlAB8TgAClIEXANo76/ayqQAcJFL9HvbTGIOHfziIh7gxWAVjz8Ab05EcryXg + 0cMJAAMg+ENmY7YwBKFwDfBnI8U2zu0uggH8mFnZkmic0HZfGA0C6wKuijiSh/g4fElZqKOTtUGsADZL + A8gCcAFvL9uArBJNE0AGhE3h5HSCaECCKLeNucDt0cCjBXV8gUiiuYBYwyl9w/l99/8ODTDBBFxLC70K + wtppeZ/3wlo1Ce3BDyT4QOgAI7DXatpSWBPxBCRaNbvAEdfAtijbCwTIyCrbKhH4WyfHFI/nuoi5mL+S + Tvp3oNGKbi8ArdiBDS5SJdRIkr/6iNvAG8zAY/uiw/wgbJ0APSiBV7ziGxBBjOPxSfnljQNrlVDFUhjD + nEB0AfBqVIz4axOclwSNal/eN2LAWehCh8N6iG9jJnxJYjqZCdSAqed2bn8BEg8AJ7PO1WELHqhBEeAA + lk4Kc5P5mO+BCxBk/9EA5AZaV+0AEjzk8t0kwYO1doMGAUgdnhsHF6gAioHySPp5SZ6u5wzEHrD3HyCE + NrBAGT7/M006rnqVHH0nmhHzB1qrnncqG7h8i6YTSAqIZ9hdi10/BuJOQAZogaYEmrmvdBHYwThUY1a0 + Ol0OPdEXfdEX4aw/9ikwjFq+VmudwAmcQV0WAI+fQQZe9kETdNYbtNafTDMEYbGv8dhGBSBngi6sgD6T + rZb4DHP573PVNhUcYdEbsNETPSD4gZxkNNH4QSZAQhrY6c6/c60YQY4qR0wrBk3DexaisoI8huOD+lOx + yyuluVBz0I0ywhqy6TNXFefL6cdvBpdPQBkIaQxDMAtMoRBI/A1DQW7uwAuAk14lwD9SCmYluu0resA2 + +rdk5xFzZ7esjndGIbgoxrd8SwbE/3QVCq/MS5uYJ0gJpBp5S/myoXsEqHphisMpQI0f6AX3A0L3f7/3 + e/9hJ/2TUU9r7ciUqcSubyPVr8AMqET6v2WwU+3Xh32wguj6BCvAOQ3X2gBA2AADaEZBcQdnrKAyAxCg + N2DA6LIxbhy8FnCo2KBirBKgjh09hvwoEpAfQCtWFMjox0+ma0YiRPgik+bMmDO51Jg5ZsyfDwhS4FFT + 5AWNMREIaFCTNCkNAk/3lJlAg8YEN258CFmwZ02cHbgQuJAhY8JYsmbLjk1LdkLZtWon7Jgw1E0ZBF9U + oKuhYuaXLymi1BE8mHBhw4cRJ1a8mHFjx4ijdYk7ec+PPAh8JP+QsYOFF7dtz5ZoO5rtaNBuZYg+2+cP + ARdjFuyFsWABDpsZUixA8KEIzz89ffOJUCbFHxd/UpRRo4YqDTwpbNaUvqDIAjs2xJ3Svr3SGz0NwYcX + L76SjTeAxvkRdwYYBCXulcSnV+DMiRP0MBlboWtFpfr2IXBPQFUiKdDAAxFMUMEFGWzQwQchbNCJgiis + 0MILLRRnBg0N2tBDDjVEKEQOC6pEl4z4M4ZChcTp7qGIqKDIIgxipAKk8XAEz7s3VgBDJRv80CMTSDoo + Qrq+aJLpixpwYKG3P6AMqowicCCAKBrU0ICALLdcjoAXynCDqhLEzOoFrhJYIwEEyiitLNH/3gQNztTc + /OwsGWjYo64/IsirBp2K8AuwOvp5zNBDEU1UUcOigcKtHXbYo4E8PtghTc4IIKsEN+uEc7RNTTttLATw + cC1QFUSYzTabioAOSuB84wmBGiL4IIUx1BgDhw+U0oCGLHBY4MjpYooAnVq0qyTZjnZ8w9lnoY32WfQe + ssGGGeCzjx56qKGHlxWAOcMYH1cwRgn74oPvvfcgINDACwqENxJ56Y3X3nnvrRffffXtN99/+QXY34AR + bAbDgyu0pEMSO/ywwhAdFlHDM2YYl4pMqACjO11mOIVZiDKyYUYq/LDBIWhPlhbaFfR4SCWSWcpEASOM + RNLmmnDg4gsn/6H8Awfj9qiSBaSU8lIppnalioCraCBDiDPVlCEB4zRl6yzUsCYN1LbmlIGADAgog08/ + +VJygMAWTVvttdOORojNKLPsjzjiIIMzL+BKbYI5QQ3tar1V27ss1kz9QgQVZvvCtphaXcCnDGLlqTfh + bB3jgzGCeoqALF6g7aZhv6guJnQ28LiS00FimUdnV2B99dZhf12PU8CgQg8qCoAIpd1XAOT2Agg694R1 + BQzQ+AAPiFD55Zlvnnl5I+EGxIg9XLjhhqcHcUSID+peQ0u8p/CNE2eZQyKKgpyllhZaoKUWONIzGfb5 + eYyddx5nSelHllhihma/QFcTxaUgAk/Czf8fyhCBKhVhD11azgOP9oIPiIkAZCKAmdAktd2sATWi8aDg + PhiaDqZlAmuQgQZYsKU/4EUvOlHSoAZTKLbNkIY1rEM0sjAauUhKC5VKQAkwRSchjmVTQiziEc1CxDv5 + xDWwQZWq/DKTIvDhC2NAQG94ksUi/IFWH+DDbnSlHAsgYAC2EdbNbDaTBXQAAxoLSUMekj+UgGGOdaTj + HXvUo1lUogA20EPrPHI6jhjDGOK4Fj2GFx/iKbJ4AcJEJ5wXSUlO0nmeQFiGHuaw6nFPYdz70Ig25D1L + FLJ7BSmAHnx0ookEqRa1wMD6ZgGkOuaRlnjkHRhm4SMqxChm8OgFTD7/h0YlqTE3RSjCAT+gQDWw4AsO + XE7RtLQrNzxFTDTAoNTUxCYlviWJSdwUEkl4JwKMIWxj04sKzviCFMDBhu10p9rcNpkdyGAP22DDHyCV + mc58JlR1CtU/UUMWBLTmNTiQzQK+sIAXhK5VP/sDFrM4BhaMoYt8GMNrUvABNfwljQG0yQJEAIaWOeRk + PaoFRFCaUpWqtAB77OM4ZoCJbMnBPiegBhjOwMhFHo+nEIAkwQYWVIENFahEFWpRkQq9AlmyetdjGMSo + Rz0ReQh8BwFfKL2XVVImZCHGaEiPfiQyWFLhpCs1K0tPqkr+6QEOLbCDR5VULDUy6ZgpyMAHWICD/6E0 + swzKUU6WHijBaS7NKddM09RcwME4AdQ0ddJbPwnQGTWMzQ5/6stfhPBOzW7WMZEJKA8R4BVteCCF/rRa + PwHqWBkM1FQgRVxtoljA3FgOopKLABdrZVHeZBQBRqBNdISJpAikQAuAOOWz5lgAePioAM117nOh21xd + 1AIQ51tPewKkyHPRJ13E6+nxZDoMSo6XvOU10AiyZz1PevKTEmtvKbdX1azOt3biOBnIYjSOFrwvlieN + 7nOZC93pqjI9QYKDHubQgWCCTlg3WQAbVBAB3GSgD0FTg0zU0Ne+PpBLSaOmmJwGtQSQYU0f8KeoskYa + 1MbFa+T8wNg6oAIjXO4Whpy18Y0HE8+2mJAFUciDC3YQh83s0zSicUNbjmyaJH9KcEouAWvxugAVvPYL + C11oQyFnTC1rmaJfKAPlFPiBPKhgccEVYOhSwIw38FEPBXiRSuChCznPmc51rjN1rcsemarrXGCYwU55 + umcI7PmR5jX0oZlnyfVuUqoL4972Hp1VrM6XlAihQrm+mkqS6Xd9tahIAewcajvDI2TjyARb9TCOWXTg + jHC1iV9wUNkM8OGuw9VABF6wJb9meDkWUMPPaKAlqmggK1/Yw2Z24IExZMGfRrbKs5eM5FBFWwN6Ehte + 7NCBNEQRBynIbAxx/xxudzYKNGNhQRd66JUhZ+qDAG03CKctODc8+QMEuCIORJCqKisOgHxYgG2LMLSh + GVMnHxBBrYaLhynjwNXSGa4CnqWLWehBF7nzQy1etkuNn4gKJ/J4x3c5izes5LoyXeQJKrGCEzTyu4LG + BCbEi2iZz1xB6N2kJzs5g5xLVRzy/eSk50tp7xVyBpf2qrNSORFOw2EW+pUzyDUedalznNQTmQUcMJDq + cdSC1Q232QtijJsx9OEvLsCwclzA67+WAQcIcApznLKGHpwJUmSIA9We3WTGMlnJjW2xa1aoAgoYwQ59 + UScGxJ34d+rYLT2+DN2GzOwiN9lTXAtVCLdWgv8/IMACUT7ovq+cAhwEvFilj0CXZ1UEsuchAnYg84KD + axM+qNkhPapILWZxkSDpgfe99/3veT+HFsgZSKfQc3bXpYTurDzQgx70y6H/8p8m1ajVp/71j5p9oi51 + vqGUb9DBH0qgV3VD3w96IQkpDvTPwAaY5pEuN73fFqgPEsC3v/1f2QIMvLLAFw+CmWPPCCLMohDgBfQK + wz7gA8pAARXQr9oOS54i2NagFGZiM2QgDrRpseDtg94N8/QOhVQI24xg2xToC85G8VCwhsityfYgCtJt + B4AohfjO8izPU95t8uZtN8bIifRtoWzjBViAroYmJoaQCJmEi1jABf4CB2L/DKFgb1iEJQhNgHVQqo/8 + ABJo4SK0sK22UAu3EA7gYAP0YBYuZj3Y43je4wQcgvl6SqbcMPowQQpobg7nUNEcTfwW7XtChPysKtLA + T/0AsdIOYv0ujVnA6nw4Tf8wYAPggQvZxwvZhwvbqq3ggRYwYOL6zw+2rgMACAClAweMQARegA+K4C74 + 4MJwwAUScBXV4ANUkTj+4Gh8hQDW4GmObcR2IAPEYvL2bgZTSwYsIIVebEnaoANmzC9eoAbQJgWZsW2E + QNomoDK0AJ80427izRf1zvKOLMlkYN42zw14IzYQB9YWaiZSIAWcxPSKJQhfALf6YAHOMcYYrhM9iqHS + /wAOOKB+UknO9KAWdkkjABIgMyJkBtJ2qAsSKEJFgEHQ1gXlVoBdwOsN4XAhp4EOLRLRPGFErkpi/rAj + /5CUBDEQuwf90E9D2u/owGqXNHH+MIAWbKAFAlIgrWUgZ1IgWyDV+Ccn56ANCMgT06gD+GAUt+gvkukF + VPED+iAsXNEVXSAFEKBohs1MImAN5mlNpAIan40D4U0b8+7IxgKFfG0M8EIFOqDwcK3bMkuGmnEtDWUF + R+MPTEEEQgsGMWU0oq3y8s4u9y4H6y2Z8CJVFKrKFioC+IDhipAIGYfMxiDC/mAB+IAPpqzBIqDVYo8F + 7tEY6ke6Qq4WJqIzM8Faxv+hM0OzM62llVZgFgpAPc7g+NDQIdgl+p4PExZyNl8OGOTwInGTvDLSI3nT + I0ES/EJS/QipJE+B/dzo/YhPRixiFjLhwEhTNKETNCeCCuYvJ/WAf8bBBGjF624C7IYgBWqgFL+ADz5A + cVwgKRFgN1YxAZ0SmuJOCIxNauxuDNqkF+1z77ymgdQgA/CC8GZMJhbgBMGNLQlUMXQsyfYgLoFMyKzx + KqQtybZRL5csyZyNazavFVlAysaR31alBlKgZmBvSV6gCESgiorACPYCnW4iUOCqgNioO5KL42aB1EKz + RqPTRkdTfd7AD1hGQ4ABu7ILAtTwIQMNDmvzR3+0InP/c0klaTd780mBUySFriSpdDhNxhCTbiVxDw5s + AA7mQDpt9DNxlDTnLxOx0wQijDtDJ9b2gA9EYKKIssrWc07Z86K8ZDnIgAKPbZ4wUCocNEK7EhoBtULJ + ZCyWqQS8QCzzogNYTXFi49sKNFIN1FHgxA0ygB9E4APUrS4l9EGh7VMjFEL35skQgAA8j8pso0MJKK5u + wi8WgAtGD1AiIBT3AqFYFAAbrAPgQD/ACtRCDh6shTRHc0xH0wZwzzt6dDVfrqeAQReMx0hnE0mlVUmZ + tFqXx0mhNFt5k0pF0hhOwVsJqRLGgSNOAiL2h9PmgEud00Zv1DOnk+n67zpjRjvV/zQmmJBKaEYsa+AD + DDABd0M91/NWlKIMnkIN8pTu5mkH8M5TQxVUGTYvJ8ACkGIYydIIfEuBApSdJHVjDyOevNINmMAUXtBu + 9qlhGzZQP9VhNa9U8QoHpixxgmVVuEA4himKXqBzXo8vhqYDRGAvGM7rjCQCXlQffZU69QA62VVMbUBp + bUBH/0gPfBT6eAoYqMD5oI82pRVJ2YNarbVrHcRJuTX9hnPoyFarurVbSbJKh3NtW8QPvKr2IuIVgGTr + 4OHquvRol7Zdh5U069ZMWSI7XcgnZaJVOiAD2KANegMHyBMHdmWgHPfFVtGi0o5gNcACnCY++TQsuhFQ + BfVhAf91G93gKxuoDPRVBWo1obptGTl2dW/IUZpsDFxwLodMDU7sPnsxNdKz8zL0ZWErVZdkVaMoeBOK + Cz60Bkb0C+wABiLz1eCqwewADmCUuTgODkrmM5G2Xa1lFkTOD8DAbVdzIZm1ao1UNrNWWs+Aa702fRPE + E771SasUEM+WWwdxftt3bAtJO8CVkDxmHE4H6WAESILkEjHgbvUWTJ8zXeP1TNNUcM3RCGDjrVqlBhCg + NgZq83rmgm9FDVxAObbkYF+g7naAPmvXdhlrLCygCEy1dJWX4YKlBiCVUFhXUhmvLXpMCxAAUmKQALAy + 2kQ1ZVGWa9JzATNUNlCX375gZmf/onMSCqHMSAUWClaHhgIgU0Un09VCR2j5d440jQqod0zzdm/ZFR78 + YEd7dAb0zOUggGpj80jLlz1WczWHIY7leI6HIQnkmBXiGI9ZQQDEoI6TgBX++I8BmRUGWZAJmZDVgRUS + WZEZOZEdWR0gOZIleZIlOQnc4RAMIQkoeZMp2QG+dTtE8hRCGX6l9DfjNxDz95Pzd22HU1zf9kXUKoDT + lYCjU2mtl13ZCoBzUhP3gS8Y2F474Cg4kUpqwGeKI6IuOEqSMMOKpgT01AJ3YDfq5HN3uO8mlCwuDPAM + xwiUV1haWHVjWIahQAMcNBpjd1NZwAIc9siqIkLbGdrY2SpA/7cErOjJdve1fJDfaiAoFShYHBUHOgdW + 8QIIkXeKz+hWW9QOdAFuNZOLS6ZYiVVYrYVLu9c7fHQhl9UNz6BqsVZrf9SN3zikzXikKaakDwYY2goY + mornOpJbRZmV19ZjYHqQKkEcVmADZkE4WflbZ7qnVZmngdp+hbqn0e+ndxpcebqVh9Nj/MAQUyKW2cpu + awFYJTqiizX3xkFec3Ic4KBI6jUFjGCCC48FwFNXnBKZgeM3LKoVCRZPbZEqgYhN5Hkq1tlk6dquJ4AA + Gohi0cEE2sCMFPeFwzlSPXY0XBgG5pIM1mDZ5rqd3flT39lkryIHMwAJ+iCv9uIBfLcc//+EiTmU3xbA + CKDDiRMqeRfuCYVpMjuACuAW/qgAAzTxeqsaNLnYBlKzEmbHjH/UDZ2Patm4jcMlpIX7jc3YpE26Qs6g + AHqhOBkNlD6yW5O6pyuBqNl2DjZgBaI7XPU3pqkbqbfbu19a/cJ7vMU7u7O7u72VdjaitaEatjFg61og + I7x4b6Ezl9cKOzHgrX5ZgTqABfaA1ciaC8z6N7LoVXoGHTPsrwwWCowNrkMYAcjiT++arp/NsSv8wqti + AjTgC0rgNbAtHNDJUQV0sMV5rmXACErBhiFlAuIACvw0ZSM7nh3UwiNbNHjCC1wgr6bMBGDNiPd5oXpX + cYBcoMmMNtL/wKDrNQKCgLWTK+OoFzqVNqIn2rabGmp1G6NjUwkKwBjIN2tBerhF2rhHGmFOQQFsgGKc + 22y7B5Tv97xherrhnCPifLoHST/EsEVkms7lfG2VRc+POqi9W3/xV5WPGqbP+5OjO88LSSVOofaempf8 + YA7eG7anGsqvl11tAIF3OQZaAgO8+pfB+oFfYLhqAHNuJaJQfQz4gAXEpgwGthYxF4j2wAUg22Ej+8JD + dcnU4AW0wQL0lZvJDNYGQGMFQy1JnBmjoRTy0giEYAhCKwFKaA/U4E9lfMLtOtcnW/MyoAxy3KBeK1Vh + a58RqnNiFrakbLQN0DqQ3Otswg5Y+/0i/0KV4MdaotxdQ1NMQ5OiTSK3zxgOtbwSIIA9Pjq4wVzMV3PM + ESZEzkDSzwC+PhJ/31y7aXriT2d+p1RD4AES3qBF4Bx1tJvOQf7jFZ0jvrXPPabkE93QIz7iT+fklWVs + VQJLfbXA9AADMoHS41u2wZg02SqBYya/k5wJx2AP7AChUkAFTF2ieiPgjGkMemMAauXFHmgC4zMOgAgE + PuBBZRx075rrLVxM2kIN9qAESHcsl/ebj73Ey7kNmv2G52kNpH2d5f7a4VkGeKIVJ/OJerxDC/OfP/tV + RztYUiANDkdFQ4eBg2ChY/RE/IBLdR57uxR3qnxiBH6N/518vxzMi/+bpC/JqcyYCpihEoDObN2clUO+ + zg/idIyruS7G1Fw/E3TBRyCCFv5ouoWz4+f840nez5W6zn16uoEa+PVX+Kk7zndfHBidof+RJWp+HCgd + WOl7TOvdBmA7SLCz09+qXmMNAZhwJiCzVSwqAgRu6Z2eom4LSpYjsUoBaugSCmh9suc+/jnXDTaqFcWS + C6Ys2GuDDwQ77QGijsCBBAsaPIgwYZ1oQmi4cTNhgopSMD7E2TFhDQsLEGlM6DjBoxuPJEOaLClypBsZ + GcZY+BBhgQoRfL4swPEF55cafBZ8yQn0BU6ZKb6oSPFiQRoVTBdE+PI0KtSpUSNESCHijdYVYAr/FKBC + xQ8cGzbGkTVrtuxZtWnhUAHjp5KeUzPOALuLKS8mYBAKVLp7JrDgwHXPFJ5RF7FhxIwRi3M847HkGcYU + 2DhzSpxmY5tPGfPs2Zjo0aSNVTItWtwpQCt0URmXySxYXW9W2Lb9xjUVG5k29EJrAwygzKYrGTdu+lQl + 5cyZLz+NurT00dCphxa93Hp06Ke5i3NdCVDtrmDH+fGjB8M4DH5qtVirNpNatrzVwjmPX8/5cXDs/JQK + IFVQXdXBGDgYgVMKKhSRQg0sWAVhBEVIWAQXLCDwxx8uqPEBGULgEIEMO5SwwxgfRARSiiapKNKKD3k0 + gRp7EPDHGF9woUIN/yr4hMMCA0ShUJBCDklkkUYeWVA0UIQEYxsUIbDDDjKsEYEaEH2EJYoRZcnllVim + +EcRL0WAQw01iLDAC0CBqAIfOL255gILcIGTCj3iMFNTEg7IZ4BQpRBOJbVxVYAurolFFn3ypQVcWnq0 + AMZucj0WGDB5WWopBLoYg8lghg2W2GKfNtbYY5BFFplmj8EByRmbvfoZaKV1V9xxn1USqR9m6SJcdeKg + 1h1yo4lDxQZUiPNGAWWNQ8Ubn9V6XLTRFndrtdxtF11y12J7mnLAetttd+J8dYpWYHSlC1nnzYJBJpCc + px59wMUmL1ns4Ycveh30KWCATx14lRFO8aFCBP981ADhgBFGwMUXY4zxxwdqWLlHxWuMWGIfX24MUccc + f+yxGwREQMAHNuqoo1M31QAkki6/DHPMQkZTCg02f2REKVogQAYdE8gw44snDY0S0URfOQYTXiDAAp4q + wMAjUDv1lBScOCVlRFFH5aRjBzXgZJVTT/WrcA0mAMIaobohSl+98akLxwrj6ALIXIrhpRdftnUKjKeH + jboYqahCJlnhqs5ABTOVqCradcA+Pm1muNrghw0FvJGdtOEZB4jm0QKCQQudn+JZa+ZRsQLpnmuuHOvP + eUZr7N925y11tBfn3Oun2LCCoON99dp56dkARy1+tNs2cPCZJd996Amf377/U5Ht7wJGaCGCnQvw0fDB + VS1sFcIIQPxBGWW40cMLLMiQwAQlnjiS0UXPf7RHFuyhRhlFyJTjjjn5CKR+CESAMiugAQ+YECVNgABN + EgIMoCSlCeBPfhSkH0ogMgYokAEBZMoeDNaUkwi0SU0gFIpN6PQFBOVkJnbYURH4xC8AsaAGvRDPG87l + lfK8Rz5tc5tZ9BA3ZsnFGIXBC6YsVQldQOBTgvnbqAQ3OEugynCq0ozkmGEDyjTuWdLxnHLAYAM9WC5z + x+nc5lZXxuOcwg+92BTnllMuXZiHNp4xIxpd95znWAtyfIxW7l5nHOecYhxvsCEOyyM8DNigBbVYz9uU + Tdco+twLX/oZhx6C0Cd/USVsKmgDwZLCvQjUYADTUxiEavCCh2WgfGUoARS+sAf2kWgMCKigLYv2kBJA + pAx7sEAZWGAUptjJJjjggxAQ/4jMZCaTIRqInxvy0IWd7cBnEtTAR0BiwVuG5Eos0OAYmsYUqN3kJj/h + CY/IeSebbG1rDeIfiKwCQ00a7GyDQhdYZgGP5bVtUfPxQwtWkAldyIUugrmLQS0FiAJ0ijAMhWKpZiDF + yVRxor/6FRExQAst9nF14gBEWDIBhsx1zox2fGMaR5pGQW0AHiY1o3JWYIN0gQE7JD3jHW+K05zmMZDj + WIEhwaAb86BHkS2Ax3r4GcnkJcp5+RJeB9QkTwH9BAdLkQlOQlkDLpDpJ1yFygsYlsoimKh8JSjFC/Zw + sSmZ6JrazKZDHhKR+yEhTPxL2f9+pMy86vVlQKgZDTTgkP8XRIENCBDRBG7ABBdgs60UfAgGXcLBBejo + g1ab2pvQCZQ5aa1qdsKTOKcHT3+xgAu90MoN7akLeNTiNUpNqlnEAlMqDLEwdjFopzCRxIX+zaGCMxVF + K8o41YgGccwYDmnApbnPgGGObxBHSldX0pKu7hR62MBMz4jS7ihrHCFdzedy2rppyS52gBRkIHeqRj8U + clA53M26iAqPTMRrPsx75HxsAI9ZmEc/+LGkf6KygBfK8ykKWoCCbILVGtiEqyQcm53GUIRVfuAPZcVB + LDFChiL8gbFu/VIzZYQEk9VVBVzFwQDgsNcUqzhIDHEIAT6Cgy7kAQFr8FkcErtNksT/zyE67nGOt+nY + iIxhD2X4ADifFjWdmFNqcFKnUI6CgzLxiCY+SRj1JKSCawjKNqhVbaKQWh9GzUcPtXiDDWSrByLSFjCB + wQQgdNGpxDjUVFOc4m+D+yzS3UoBmZhBsFZnGriA9Dlo2xxKCx3d72LXpGDoxSy8i+jsnma5fhCoSXMq + XZ1qWlpr9Ol4gLoboQ6vqI5cSyQjyUPVChV66GFGCqLyQupNJQU1ifIwQ8k9m8hJTib8iZ0epOEJlxWW + ZMAYFDYsNB7/WNnM3vGOI8JLEOjvC9mza49YRhACrnjbe1USYG1Ggz10QQUQjAj+HIvudKt73eh+6xgy + UAYO4skO/5QdJ0548qYo90goBqYAU/zNhTRQgAt86AkfBgBPp8g6AmmYxZa7Uiiw1KIWpqav2/A7izeM + owB1I2JBK9U3YLwZGIfhbZ0Ll6qJckbPoXHODGiBAeei0Rge9UMmVmCa7B7a0DyvqaQPbcYW0KJ3kQ4P + 2o5+GkBQjgrD0flzpZvpTaOxpOoVj9oQOdRF5hMOYoRkxdum6vPEoL/jMIFWQyvPF6QgBWXighH8rQI7 + +NsOHUjBTV6Ad33bGgcsKEKw8VCCHhjhwhNAwzbGcE12K37xzSzDC8y3PxUYQUdDKeYxuY15FdMMsAx0 + wx6u0QEaY0QGETifzVTCY9SrPvU8bv+9Y4esgT88pQMA+OBNouwTgk/1C3hPARe4kIIuRAEfHCg+B5JR + fAP8oEE1KIpPqhwgvwehFlsmFFio4GV9irlttZjDCvRQyLgoplJ+o4LJESPFU2km5YxruXScIw4bKAAQ + 0DqjMcLSrJwbvef73zmie+5/4XF/vZAJNFd0ARgeVKAHluZ0l6Y5mRZ1mCYtb+AH5fJpuvAKZZFImeAe + izQLiXJqX8csYcdqurIBRhA2ofUfXCVKv1cKWDAPyVAJx2d88xAFQsAUfIAUV+NrKcACD2IiFPYAALAA + hhUHUIAAI8F6q8eES+h6E+ACRFYjRoEOBHNOeJV5WZhX3kYDBDD/EnsgBHZQbjLAAqbXhGfIeq7HY0WA + PzCBA7T3QTlxNaKEFEIxAL+XAViACHIQDUFCDU8AA/4TQ9+DDtRnLl6hG7WQDhUnZkmFX3rwfYWUZozh + KYNhfqQyGXZGUZzBiRbVRchVRsxABd5lf3CRf/03UqmIiqt4gKpYdG8Ac0DHf4dGc5QTUqj4f7mIgLN4 + aTv3Rp2zAnFRTxGngX7ALpakSFz3dRa3fYxkSZRUOeGwIPsDIN9TA2kwBBzQhwqRA0dggz2QVXXIAkcx + NkWAISDQAwDABlGSEXvwAWgIj06ohG7wAb1UIzIRBCkTE2XSMlrojwdEMxOgAQxEAy9QCqFX/2w/Q2Tz + KI8NiXqt91Z+xyExgQ5hADX7xns38nt0IgSogAk5UBDaNhBmQBAngAV28Gr8MhUT0gHUdxvkARYtMAdr + AWbMSBa1AIng13HjV4l1kUW8ZTiUcWe/4ji0A0hqBHP6N2mwcYtH55RPCZVRKZVTKYDj0AtUYICpOJVH + ZwzB6AdgsBqySFK+OJaLFoBiGS3B6Ds45BoaqAfpgYweCIL1UpM2MHGrhi820AsFExMqOCAMQgExUAEJ + IZIDwQv10A0UoQIBV4cOgyHoo44XkxG0xJDxGI9vFYVlMIUqgA7WBkB1UJj/KJpH4m3fRgCfF3rsSIZm + 6JCtqYYPEQFdQP8js1d7PvETBCN5GLAEyUANJDkQoWkQ2mYGr4AOr1aNfGIHhkgoEUcF8dKIYbZP2JeT + kqhmlTgYNkBnjIFyVFRFoOE41uE5o0MFNXQcZuYHvWN0W6me66melbACvdAC6cmeSIcrZqGVrMh/NvVz + zzV17imMXAY8lJNINjAHyTiTXgdm9RVGcICX+JEJ0igh0GdKfIAOT1AkoQkEcpAMMVAKv8cH6gMxgQcA + NcCOa1AE79ialgmRDuECX1BkkWcO2VN5xpRto2mjRbJ5NsNAX3ANdjAGkkl6apCiQwqRIlMEXWAB8mYE + 5qAF5MQFTBADTwABBeGbR+KbgIAgfvkUL2T/BzZgdYcEFs5pk2lBL2kBD+qlk5MYKoBTF30mUanCfpyx + GZxIHdgBLOH5RmAQBMdSCQooUPMJqIH6lJVQCxvgF0dXSOuZqMahCwson63IikCXi/3Hi4Lyn2zpXhs4 + C2MBBx9IFvSiVPQBRKKWl/uAgjEhVVehAjMgEFVqJK4KBJiACFjQAzjwMAQwBLVXopR5ekN6mQ/hAkoz + hbRnBAJDJp95o8mKo6UwkATAQGwgBACwB1HiBkhQhioKjyqhEl6QAaUnewtAeyIAFWkADUCgVxxgByAi + YPBkEx0gHL9TKOlyH173nJL0Fn6ANmlmKkzURGcgW4OjiSpHp9PxZ9JS/5adQwst8AZzwHSPKqgP257F + ogcOG6jhMQ7cRbGD2oquOKln2Tlg8aUwKaBZxy42MAvvUS/PmRYL2qD70R9+NyFVwSAqcAYDlEwVIAQp + 8AEEAAMA8AUiIgNkwKvY6poOMQF/4E1jYD3oEHclVgMopqxRy2LMSgADSQPQag7TOgFecAMskAUrCm5h + K7ZjS7ZuMD5qMAYR8AJGYJFfQK6uqkyAkAZfBWBQsQBBwHFcJrIMyohjmigY4BrjEB52w5Mldwa84irs + t4lzKiu2g6eSGh5wYA6ZgDkQa7mBigGQ4FOXizbGABc2gDmJSpWQapaGdpa7QzefVijq8l7mwR6bGv9q + n9q39CEWLasr8GAHASY2UMEgIlCze1UBXYADJTCEFyYDbsACKEq2y8u8YusGUUgjNtIGQSB5V9iPUou9 + ScIEGqAGVTsB0Jqax6sNRNa85bu8SsgCY1AG3XogtacC5dqqyuSbHCCILAiueas2usEeoQobFtc8gTu4 + nKEYoUKJiKty3el+yFV/sxiV6ZIJeJueosu5E8yVVmkDESweaJOo65XBG5zBH+sHhwqVElyxSNeKxnBm + X8qcIwuX8qUHczAWIaiyZAFEYXQeptBfLRAEuis2V1EDvwu3yJQDXeAC6YgDQKsNx6aE5svEp+cGZeCt + NsKZlEdMNPqb2Zu9m+f/rA6BAwfZBxFEA2XYxGOshGebtgcSozBADTarVyT5BKf6gxEATO6aNhAHFpkQ + wykrgvZiKILbcXTGpnXBK3HaGUWJHAULXVDpn+OANr1giB7MwZHcwZMsyZVMyZcsySuwAWWmwZ0syR/8 + wZEsKBdbuSQMyiU8lbvDdKcFVBlYjOmhKxigB5squ/RayzQ8Fk11u3YgxwqDA767YiR5BCzABAAwBCsx + AdrABEk4xmM8AfWomcDUBlXoPz2ChViMzZs3MYAFA6WADl8sAx8hxjYDWOUctub8begMbt9GA17wMJqp + th2ADh1goZgHDWnAVcDEBh3Acb9jKAroFopCl/QB/wd97J/rN8CBUxeoo7jC9Z11+rgZWwlhFFKdAwcb + YHSmTMEUPAu9wHGdDNKICtIajTYFsIAivdFUCbIA2pYsrB4uDLu2HIK8wXXQqCstMHi9hgN2wAF1EMR6 + pQk4QIQ/MwFkwAR/8Fdiy87krNRNXc4jgQBEJmKcyRQgchMnhs1Zrc3dSwNZ1gEusAYyEM6Px7xLXb5m + TQMP4wJpm0Lo8ADm+tPJRJJmwA92IAIiwBNGwAwrYC52HBZjwRv16nVlAQeFMg6nkC4AK2eN0RWpskUP + TS14yjlS+X1Mp8F9GgTC4cmYzNmW7NmdTcl9ugFz4Ds2tF6mddo2pNqfbJ6bm//anz2VosvBGVwJX6m6 + QYUfx7geLwzYAl1fz1nTTTUO8BAEIoA9d50G5eDT20aSvCAC5oADa+A+YdwHSmjW193UywuFUghMnGmF + /4NtWY3F2uysBNABDxAEfTAlxzvOTJ3U69yF7p3OYctAgOW1JkMmRgAABeCP9MAL1EANvHAGkFB99gTQ + u9FabvMoQHXYiY3QvTUDSieUjlM70HVSUZmoCqjZqP0GCjCxprXaoP3ZIy7ioIxRp43iWrHar83hsw0G + evDRkDzSobzZIQ2V4HcbiBhq+cEeLlzDMm2TxMNf+YJfvTAFU8ALSL7GWhgFxSkiOyC0f+AGnAffBJnU + Vk7/5e+d5WXwBWoQJlRoVzdhxWws3jdKM/mjBgN53gUiJSXgBWLMQHGuo/FNkFZLkHJO5d82Bl2AAPKW + BgAwDzdaAaVVx8z5KPelPPwkqv8UwoiNndmJiRGeRURJGmSkaLgY0pgjN146wpVAC7QgKDNO4qNe4p6N + OWwkuCpOwh5M4zT+2rry2q3OuXKxFZhajLGsB/zRSPfRQ8+p6MGd68LDHwqQrOMQBgNABuFMhmMgMlce + 31Re33Tu7FbeeR/wBRYAYSnUAVZ4rNdc5lF75mXQvQRgBA8QelNSAiUQAXgw59Jete6uo9Ee581qMxD2 + AQhgE2lgDpUg6OaQuph64D6k/8ePQoF+4eCQXmdK54ngUn92JKkjjDaNGuMtDgh+wAwtjvEZr/Ebz/EU + r8lw4MkdL/Iq7lEw7juqnuKkrupHB4mqCxa3zh9zMA4dKKZskaD3Fdz7dR42gAEbYK42auwp4D5ChtTw + LudHb/R07oU08AFQYAGbue3DtDLX++3JGu4TQ+7XkAZoVa1I8ALsjvRW++zPXt9IT85eyAJElrYLQHf0 + cKPU8BuFrhs1rH11H0bwUPCVoCwPTmeWsH5mRhl6hF6fo5UQv15lkfKoDQhggEUnP/KPD/kZXwnw0Atg + EPmQ757jUA4rXuqXvNmQyBXo8go7vh+yPNxGhTyuZfdMNSjk5/HpPz+ayRAGKZDsEcECSI3nZf9Xum+1 + va/7ncdLT/8Uxcrt1hxA/1WvrEDQAy4g7s5aAwe5PhPgA9rweO/+7kkv5+Am711IkBAWbzFBd1Nwozkw + CzB+WswJD2Ik8I6oB3i/cUk06Q8+OJqhdNcx+GVU+JhcSC++yhwPEIA2wKn0xuBBhAkVLmTY0OEbQON6 + 6QH00KJFG3pWVGxY0SNEkB4BiQS0ws+bFSvAgNFFhYqNcX5kjsMwywa8FjYw+IFpI1PPcUCF2rg5K6bM + mfBolavT1OlTqFGlTqX69Aw6PmsmTNBW5A8NsDQIhB0LtqxYsmnREnBDwAUOC2OKfDHSgY8KHF8W4OAj + pOpfwIEFDyZcGGq0UmrKqFGjgU2UNCx2yFhTgkWZtP9jyxLY3JnzWtBu5JYZE2EBBQW8DK8GrCdmSjAF + WlKBN4do0KE9h+qB92acrlO6bIgjPmOGuOPHiRsTlwmQsUrRpU8HVKn6SOzYQ0Is52fjwRUGw6M8CKiW + AvAX1a+/CAkSwvHj4ZMPLz8+ffIQweh5xZG9Qf84AqSAcUpaSTaXxhlHj5kw0CMTnDLBADfcdLOQQhtq + geeomfSAY6k6zGBtxKj0QScFGWRw4wYWvuJMs89eFCtGGmGckQY3yviijD8ioMuIuxb4AocFaojiqX5I + VHJJJgWLpgcXFmOMDSGM2GMyN9zYA7MXX9SAADUI+DLMMcU0s8svNWOhCNJe+IL/AhWmaFJJQNIBw5QC + VkCQNptu0y0oQIeCRyM/wKhEOOWQQy5RcZgrcDrrorvOuuxGgsg/iEwaRzz86sMPECqC0OU/UksVr5JZ + FKCiovs6ZahVhexTkFP58nMI0wH9MDC22Tj0gyaj4IFHJ54CNVYoQKnQkMNxZoFjnA2UmJNECOwYAEsy + ikDAzC+75fZbb8M9E6wPXlCjxy9UMKIGvCIgcgA4ppV33iYRU4wxNVKA7Is1VJzgiw8487ZLggsW+Mwz + x7hsDDftMIIaeg3LgRbZjCoAQXj6NPbYQG2gooVCdR1wOOaUS65RY5jTlTpJKdXuI0wh0kWPAmK2aAUF + 9CjI/1Seb4aIiolKyq/W9Dz1lFZbbe0ODP+IXshpiArQdSVeX7IBKZkcbBaOm2ohyk+Oh9IQpgXhmXCn + iA3DhIKsZChhgjHGmNFguuvmLEwayiWtiAXUZVfId49Me3DCqwICyjI+YEyLLjrYY40d3Jhgj4AJTvPy + g89ME80ZWRijTRzs6EDOwv8SUZwN9OStlqz1+Pp12GO3AeQVKDrUBkYZRVmck1qOtNJKQSoPkKvrS+l4 + 5JM/HhAMeuHIaOWjl3566pPH7w33wKDPeOlRgj4l770HH/wB9dCFVaSLdqgAPVDitVesx4Fjlqy7lv3+ + 152dBR44MEhnwQ1ATESlq4o+rP/Vr7dpy0vgYqC4BhamsegNXSpQgQhUsADT8MUvBOQg4RDzASmpAQdC + aMMLUsQWgBkMNJpZ4dy6NKMiLMw0dghHDjr4F11gQBcFoMI4NEQLWvQPA0IcIgaMSEQhwmEDGLhadYRD + HChGEWXGOIUNVvA74L1MeAgBgx/KwSlXGe1TelBAAdLXMzQaDRBktEFJxPjG8CFve3GMY31MYQP1HS09 + SSPeFw/EwwTFDwNzkAkkWrABWhhRkUU8oiKRCMQWtMA1CgpHJW5YlbWhyG1w25bdPFm3vL2AND4yQhv+ + NqQFDEBwTUnSJV1JIsS44AOKUwOVrESZt+EAD5/k5Qs547n/DyDgBQsIwypfGZUCTMRqNGFQM/3gTGg+ + 85nyYxA8rFMAkkmxUeI4xSkqERwqeBN4l9piq/ZjRu6FUZ1gYEYbx1c9eMYTnrZKZi3cqM5WEc0+exQj + 8UyhPVrB8WjhAYQfqPCGP7oEJoJ0jR96MYsWbEia0aSoTHBCNhukChDHlAom7JCCftFgAkWQWy9NSi5R + lgYHFKyBEXCQwRRggKMzZc2TokTLFJDwBWugARLWoMsylSlMQwVTUYlKVHGtqU1fCEO8aOqU021gA+ko + pK+wdlWsMnE/TsRdyrbJnCl+syUuG+fTDKIs7QkUn+J7Qy/gwCq1xnWtcn2jHDGwgbSO/69T08OH9/qa + kr+uILCBHdAsRiW+4+GToAZVSdWsxtBnMtFZVsUqVmMyIT20oBeQwERTBkhTfQApRQncFgRNSrcyhZJH + pjGCCtpgBMCl0phPpW1VPviHWZYhp21YQL+y9IJdHtVMZCpqUItrVAhagAUs+IBKATBb2kajEnqQKi2E + dV3sZle7RtTFo57oVSh2k4rSGWtZY5WfX4lHntMDhGYRu174xjd5a1SAO+V73/Ck1TXqrR5CCkoFlchm + Ngs1RYOMYoqdADEd2mVwdj+0AUj4YQafra0ZHqACrfjAB54TE74YowEPNybEIA4xY4qLh5S6iwvqssMX + 9IIDI9VWxv+27QECZqm4nBphp2+jAXOJK1wgG1XIm1ODcovwgbngoKkzhkoFeOFkKD9ZylGmspTBsIFy + QGccYOhmo7p5ipRVAjrfdInLGnKfAtTioGBQSZvZ/GY3xxnObPYNMw4qZzzPOc971nOf8ZySAiigN2zm + M36nd5CM5FWeb/DDKwK8JwVB1g8YCMcbqnzpKU/ZyTZkslP2kYa3uS1up+Ulmf7wBTyUpm8iqIuLA4ek + Ts8YMQjA7Qc0kIcutIFfKnLDCypnYuMGWdhlisCRnQtd2lKYRC2YRXS8kzIqRhvaY64EgQpis4Cu4B2R + uEAkvP1tcIdb3OMmd7nNfW50p1vd4Sb/tJ/dvec3UMEUo0osoZXnPT1QTcDLjJ+wgmICG8R6Tp9+mxto + MGoRJ5zEC/9ww0H8cBGP5Q/AzYBp1NUBO2CQSDXwi7IF/tQn9QG3LsgXCSOQot+WgWDCdWADCxbDP4xh + SEv++JJAFZ0tg3na0KbOGyhiVjm+ARzi7ja3vV10pB9d6UZnetKbvnSnRx3qU3961aVudapHwt6Gth4Y + ZnHnrSNv67NorC508YrHyoRB48CJgjAwg5ovKRxGKAGvOUxqT6qBXDgoQxFIaQ51CWlI+or7jA9H6xuL + oBRteByvfX1cvHcJgkVW6qmV7NTCs2ZA1RnHCqCzc2pLqnYx4x74//aTim8Xfd2rZ33rXf/6SBT63e8O + zzPze7yww4bsBxrw1eJXi2eNIx1wzzxrCO42L9xd2EJe/lAhiGI8FMHvQQBAkFA5AJkWH+Q1RvwH7PCA + IOw65cgVMYlLfH58CTkCCxvSc7W/ms2jigpT5Dl1StI+fspRF4bdNuz9/38AhL3Zk709S4lyoBmEwr02 + W8BZ+KMBsyobWCKYgAPiez/CCAc7qLss4bDmYz4PZLk/wAEoqLgI6AAAsCCNwwHCc4pWssAOehIEGAPc + +gMVeAAAOLkJwJEX+AMPMz+HKz8ghDiIo7wIQAAWmDnMc8HA2LxTgIdaEAcx86bQc5naAQ/pWf+aFciG + ANxCLuxCceuzNwvDxhrDlSBDMdQeeRsVqoGNNnsD9uG9B7wqaAk+ClTCwcBAGZiADRwDIQxCP+zDPmyM + iRulEqw+vHixvrDDV4qGa2iRGeSDHgCAL9gBPSQAXxvChEM/TcQXElu/PzhCYkI2RYyK+POh54iOKdSO + SvADemNDe1uQN+u/1KO6q6tFWrxFrMtFW9RFXJS6NRxAYJQzhLIJ9xHG4nGs27gq6toQ+anAUaQKDCyB + EjC4uNlEa0Q/CwiTEESyFyjEv3GXIhHFZ0wbGJRBWuODa7jBPDS4HezBHwTEPwRCC/BEUKS5cZyK+IOJ + cBIzSMkOiDAf6Sn/AGKkGi1kOi88SIRkPapZSIZsSId8yDU0iUIxQzbrDj0xO+HoIV+RHzhgxjq8x6nA + QK3Yww6DR5OMR1PztQzoRhO8i7x4lyQEycF5Es/5g3OMxEnMEhrYQUy8RmsUkzJYrk/UC3uUyacoRZM4 + RZaxlH/UBQVks1fgj8ZaiYJMSKu8ynODSK3cyodcgUSbyjYrnovpvd9rAeBTkI80yqeAgQzUQzfwHJ+M + Sw8jgBBEgCJgSQCoII2TrafwOLVcEpqMmxisgXTEwbbYAx58x3g8SR/cgwj4AFB0v790CqR8AxuAFElh + yjVyyjCMt1nIE4asSl4czV0szV48TdJETdXzNjaubE3XXIFXqAVHW0ivLJSLcYmXYBY9mJAFQ0tn/Es8 + 1MMeG4OSXEzjhLhs1ICJizm8dElE3P+gyaSXwByDwcTJddxJWpLLawQx5bqMeoxJtdw8Rvsmy5SO62DK + 8CCKqeyifDuQhRRNrIzPqyy6AnBN16xPhsRPqrEJsPw6ljg7fvsVD3Ed/vHN6GwKDNyKPdROuaRLHGgu + vFyx2FKlA5XOFHiB5YpBdASAx8lBS8wAMGFQn4yACBhKYgJPoxRPnSHPzhMn7TgIKmifN/uVhywA+JRP + HE3I/IwNHq1PH+1RIP1RrdRP11hD/zQ7hVooH4KDhtpNAz3QBM1BGtiDIghREcVGbUwpNzHBDkiDIXkX + WqjQeTGDV+CCIqxOScxDsQCuELpS9CsDT/SRUKxQFZWUU/ANPKL/FCt8CTbThXTAIyHlUTAoSNNMTUMt + VERVTUX9NkG1zyENUodcgWYpw6/bN6vJCDhgUmmatF9Jy8mEASNQ0x4rAjf1sDaVkm1cri/g0hYbvBqY + BzGVFxF5Ai5YLhYgTA5dA4OzxD9YDF+9lzL4VWAV1l/91SjpRhMtyr8UTz+IFOlgHyuylOOhgpPIqEAV + UhvNUW21yh/tVkj1VnD9Vkhlia97g0pFUpfwgxbAgFqwKgwwhWas0Chti/XDF8UpA5K7V8Yo1nvp12Fd + jDHAgU/0EVb9AhZ4ARVIhliNGFplgQgQARv8AjX90BBqU3yx2H0tsYqNAMQ82AUAABSVyTpt/5nqqARq + HQcqqE+DEMiMCNduvdFtjdn/uxhxddmavVn8rM9XMIrd04VyyARnmZ9fUcadiFcotQMVAQvPyUZTbVqN + BVZ/VblzwQG7dJeW5K0X4AKFXViG5YIvSINwAAAW0NU1xQN/zdiovVi1DTGSg9MSrUdxvMc6nRTsuKaM + 0AO8nQVaaM+arc9CkFnADUCbHVycxVn81NtZqAUNyZhfsSoG4VSjVcsBCk6x2IMxONu1TdtNDFYNyACB + lbkFMEEL4oMaUFi/5FomQQQuSAMbjICt0ICdzIDMDbGKzVxh3VcSxYN6zL7onNvzfFFWmQ14+KOLKd7i + jY1sBbdEPdRFXf9e523eSDBe6Z1e6q1e651eHtWFFrCaOKys3ezU31RLyiWANQnR20VbzZUS9ZWSlewR + qw2DGkiDhK2DFkTdeUGENNgHABgDGTCLdlRftK1d9MVYxZjHCKi4mTMFOq2Z8aRbpvSeMKyF65XevzXI + wL3gdZtgDd5gDUYrQMrNmCgwogXfCt0HO5AcsSg2zB3gtSU5xnDhjNWAgIWCLyBRI8jLDtha+rXfiCkH + LUjTCfiSHVwMxclXNYgSNVAcJU5iJl7iJY4SC/iCHQTHMOCABa6EV7jM331g3IuNdODg5MVgMc5gMC7j + MtYFCf7gZEQKEc4aEj7QT0NhAlg/Im5iO3b/YiauYz2WkoB130LUAjDgYcIRkRlIU//NABAKVhBa5MQJ + Vkd+5EdOZEUGIY79g7kgJis+0AExWSrIzBcVH31L47Ec5emtYOhlXlR+3lTGxW/boR0aZVeWDVmO5Vee + ZVkuXlq25VjmIXhQ44WqrKyBV081ShERgjTYihSOAEVuZEhu5mVmZGhWHIbJgCNcVXM4gRDZYUGelyTR + B0OmATUYYmceZ3J+ZCiW4h7BASXL5N4tAJMtB7L6CAimmozilenNZZgdY32exejFZTOuZeMF6A2OzT0B + 4U2NHzhoV3gIX6OcBwqQ0jlmk3KeaGempYBFABJdADsIAk7b5sGRgzBw/12D04AXyIBGliU7jhKVxtc7 + VoyVjpIy2IOSdrUwsCRNdueXOAXz6mIwmFRYvmUK3mehLrdd1uBXBuijDmhSzuVb9pre85XHnYmEtoFh + VkuHhmgSZYx7NWKuxld8xeMlThzG6OOAXYA0MIGO9mhuroMpUAEWkNJwlt2MreMi/tW6vhd9LWIQ+gIZ + pGl2nsxNfgmygg/YoJpJNTtdxkjENuVTVmXHbmzIbmXFnmzKdmXLRmzMxkgB22xadmUwcOpLpSykkJ92 + rWqQFBFUSAOREguHvRckBusj5tcixut+HYMUiLm9oIAYUGvCqQAmeGuwiGJEniVZUmklVmKUBqHi/v/q + l04cx6w4dUYHHQZsnNbiTxY7Hm0WAavsya7g1RxqoeZu8R5v8h7vNPMYhYq0gx5teLgj05ZJRBgAgwNn + x/zqr27pDzDu4j5u454lNeBYKMigNMgF3iYcLHgBuC5pJ87vxHGB5jbuJE7u/QYhN5G5F8ABCvjrZcXp + TvZH9VrIi9FuyqaCymZs8AbvVyhvFV9xjCRxzR6WlvgaYC4wtjOK937GVopvDQhiDSBRCWfu/A7yCL/j + fL0pEFKDIhBYFliA0yDwAh/TpmAABA/ukk6cG0tiJW7kaNZyLj/uCHiB0hgSCjiFK94yLUIs95QaCUbS + lmjxNidxxn7sVZ5zOS//VMl+8zbH87PLcxdPcRfvcz5ncxd/8/PGTbLBmhhA6P+58WcUkfgOi/9WZi33 + 70VO4km/sdzKdCtvLhxQtSZ/8rQ58JGO60q/sU3vciuXpVS/MZj+Air90gy/Yo3w8A8nXu3+cz1XbBM/ + 8TEuOhL/dTzH9WAfdmAv9jzP9QIYltD2XqQ4y4WuUNXd8S/xceLuckzXcks/7k0/ctu2ZCIZcFCPmAaY + cnDGAUTe7whHbq+GcOXGY1n6AJlWKQyf7g0/hVl/YFAmXj9Y80FX7GLfdV7X536vbGBnce4u+BYvgHTI + hPSONBGO6l+pBQwoB0YfRUeXb4NTA8fM8v1O7ggHd3IHV3cjby42UBghoQAnD3d5OXAPJXVMh+ZtN/Vo + fvlZ+gLpk2IM1/DwdOd7Fx6eRl4156HZwE2XwHMTr/PIRno6z7pIIHqnL/pff3qpn3rcfHOiN7t2XXZg + /pXJqng7zHEu0AA3mPbHnPmXt/KYl3lTR/IU8HSU/1f5eRF1GgAxHPCKWao1vL97vf+AvOf7ved7KpU5 + Maf3nV/F72iaBHRA9jEfqnf6obPggBfjxp98yq98l0h2lP0a0VY7H5p4rx/FR2+LcKYcvy/9ve/7WvP7 + vncBjqXmvAB3uJ8Wlp/7MlBw1D993C991B+SJMt5Wd8ITOHpUd6QoZ98gI98DLZ85V/+qmedAD3oNvYD + Z6Fqhh7HAYp2sVADF7uxvE/9259B7td7JN8DhyWSt4/9OZHyln8Bu7993c/9vr97Ka5mDCdzTdYeSPgO + K1zPzc56gKBigwrBggQHEgQXaWGkCwsdNnwoMSJFiBYnXqyIcaPGjhk/cgTZkf+hwZIGEZpMqfKkSV16 + agkcN84PzZo2/YyDA8kGnBl1fgINKnQo0aJGjyJNGtQMogE0aGhQs+dLmT8fPvypejWrVaxbP2jFGrbr + BxYpxkTA8YVCLqVu38KNK3euXCwvJmjQUAZHkate/3YN/BXw4A94Xnwp8uUFDgoc6EKOTBdQgTcYqAB6 + o3kFZzArwBQIrWs0vHErTRZiqHo169auX8OOLXs27dYQy502ifJgyd0CTyN8KdDGzJp6buKEsyGnT8nO + nxPt9xMRFw00CKj5EuGrYMLdv3t1UQQHWhyN20JPr379XLtuoH54UcQqeML2u2/9wld/48fs/0NG2Qq1 + 2JD/2WadgZGgaKT5wdJADxZkQ2q1UVihhRdiyBpvEP4WYW8fsgRihwXpAc9w4xxnU4o1YQAJcwDCKFdT + T2H3xR5e1UdWfX/5NcZZaS3AVoxDEvmcXXhhx1eOg+GX42KK6UdBMkVSWZSANIGRGWeffRZaAaNRoQs8 + DY6oW0KriZRmSGt6xKaabcL5ZkYL+cZbmQjhaWeeHaLUZ0FzwDSODTTpUZyK48wBBxx+wCNOlY/WIV0d + 1Fmn1xdf+MUdkzhuSt9fY+QxBgvmCQmpqacC1cAL16mx13x/wBqrrLPSWisCV6kVAX/o+IdqkYCAoQsV + BYxjIIIKjiasmA1C2OxvAylE/1GG01JbbYXPYuvsntvq2a22VJQYU02mIIcTPHrAYQo8zfkaoxmTckHA + dWVMhZWs9tKKY630/XFrESkUkRYOaaDXrsFDHpmXq7Fy6qnD+jbM7wvy8efYwUMCi1slNoDxxpYJgiYa + Qbq0oEe2J0Nrrcors8zaty+jHDPMHM4SqKHG1TROLXDY0EI6jV4cI6XYlXEprPgezS/SD/N79AcRAAxk + qUFTnR4DqxKNQwb7ct2103/op+sCKfBa9X/ADlRJAX547BnICxYERybDyUxFOdG6mXecesvJt997U1TO + zHUPXji4JspEaLl6YJBcLeuazR518taIqdeX0+pv1KQWHP+553XdFdUHOESQNAL0nY5V6v2i3rq9H5yO + A8Xm2XHE5+kBO07HgBAHyGcKikxQTjYILpDgxNuAfPI24N2y889fuLz0yx8/vfXXYy/98cWXSFy5OcMx + i0w+Q357ZJJSSkOrl6ruuunur756V1AHjEOQnZufv1F2sTp6EWP8AYACDCABB2jAAhYQAadjjGJwwIcF + 5EB/kgGWHlagmTcI6g3A+5KwDgKH4WRPes2DHglL+JoQojCFKpQez27mhxWNAx5jookp4JAOdkkwLu+a + HAEqR0AEAhCIQjzgGG5FP6nhL4dKdE9U9lK6ABJxiFIMIgBlJ7YUwCCCSpwL78ZxoBX/UMEPb+PgQTLB + sxUyz4RqXKNq0OjGNxIHDolDDoowUBqbYKAnW5wLPuLVRKMJkIini6IQoYgA+unnfnvc49VYVQaAjQGA + p0OAJCvZr0oO8pKaPN0fzFOEBehHBNFYZFwA0TjfbQmMMAENmAhSjkxgIHmCmiVxrpcKhvQNcLnc5d94 + qUuG0BKOwpSeoIhjxjnmTGcYMEVxjjMOSCgAh6RMyhEG0EM1fGAxmtxkFCnJTU0C8Gl8gNIX7MCPaeaQ + f3pxYgYoKcBMFjGB8jQgJztJukulQARAQKdb3lAoVIIMNLOYhS7IKBA/xDJ7xSzmCNnoUOcVs5YLlSVF + a2nRiV60/6IYtUEmZImBm8lkFnksV04wIE1+FmUKKYBKqxAzzwBmkpKZhOkPA2mVL+RBV2qxAz5Qmj/3 + EKAMo3sirLxpyaNuknXeHCQDL4UDUfoUKZUIo8eOBRpw1UIPA8ENT0CYwoY+NKzWqp7yhinM47VwJiXK + o/hwhhPGjeMMUT2KHFJAgKioQXYfsKRRwUnAvhZRkn/YGgJYMM7FLKB2c/2cXfA61EhGEqaRDew7J+tO + y8bTPGn5Qgq0MMrFEkUcYKiF28boJRvUrBaqVQ48WuDa17q2tbJ17SrEatuVwaG1sG3BbGPL29f29re6 + FS5wf+tb326gtXDAgB0L5cKaiFQPvP8ALVHokQINYCc+X4ikO2kaz+8OMryShSysvnBY2VHgpNT11Q5X + pQZspiACke0rfQd42flONoCa/cICnvrZ9QJFDoPSxe9CxkFlCUQPc2Crahvs4AfXYg6/nLAvK9zLC6sG + IhBucDoe3GEHf5jDHh7xhlULiRbUYhY4UatbaTIOn83ivwCuwxT4gN1WqaW794Usj3vc4wIWMQJ8iMDE + GmO7GV8MFk7Ry+i+AEUfQ5nHQLasfkmnFv8i+Sc5OOjvvAQmYT2IeI8jjkzILJMzoxmst10zbCDCkBWj + Oc5ynjOd63xmM/OkrS801IpyhoFZUOFdWZ6CNZuolkDmN4qKljJZ2OKL2PRmGVWCroOS1Qdf+UY505qG + bAZSwJcrQzXSoyGtgZPFp1q21lDk+t4Lb8nmV1uI1bKeNa3HBb5a8Pl7hZpF+AARaRrbtVXxwcGTN23s + SL5KyE5dy5H/f40qJbtBA1dJwXaPHWUWRHk8WlNLZ2U84xmEUXcL6qBX/dCzO5Zr1TZxtYUpjOF2w3si + 0jpODL5Xb5vcuyb5psm+/dDvfu8ZDrWoNU5QXAs5/Nq6721Vf68tqodjO+IQ93ER/heBGijmBUFSr7Op + VGlhx1fiIp/4yLGd6fFQG9TeBnA0xlEAeIzmSx6S5Uxi2ILn6trVsN75bG6y6hQBXXEvFHrQh270ovc5 + J7i+Cb2Z/udyOFulRPsDYyI5cmtbHeL/A1sNMuBUCjS745BSsug+QG2soz0DOEh5KFcO4I35YRYFcJAs + XYxit6p7ReTSOc/77po+EzzwtC6U42o9/44/w0MJUbdxUPdCHrQbuwjtNC+RQQlpsZsKFu4V6tkhb+0U + UBuU3Xa2GUwz8JPQHI+AnzXf/d53N0dC8LI3vDN5jXOjx/BcBajDpJFcY8dW3fOa3rp5L6VxsGP+Ue9S + MnZc8Iez/w/ZkI3+GKgf/SJEHPvV17629yD6UP8aE3ooB8+8ikyawAHpRF/3u9vv7vfHW1qqUf/R11// + +9O/6DSx/f1zxri4a9GvqdR74Qp5XF/1ZV8Cior2sQD3Vd8Dct2yXV7yVQksBBtWpMACYN8GNmAHcuAH + NuAD/o/2VV+nDcEntZ3YncIs9Iy5kZnQ4QQGrN7i0ETrud7rLcTs6f9grfHf94xDOqRfLUCA2P2eGrjA + 6JCHB2LbCIpgEzLhCGZfJC0AH/TAAiAG8lFglTyBXQmVjySGE4LhE25fxW0fAlYfH4SefpiA2yHZCugB + 47Agq8lg4OmBDd6g383gDuph3MlNuWQCoyyKSWGeSrkANiHhA5ZhxT3hCCqiIo6hI47BF9QAE/TXWnBc + Fv4HLPBBdj1fYkTABn6iB4YiKKIFC5giC0SAKQZMA/5LGqYAH7DhjJkBIAxcC6Tf+fHh7X2PHd4hz+3h + LyLHHCKHSJVGOsjVIKaAGkgbAnhSA4ZiKppiKkIjNJ5iNKoitn3iGCxADVhhlIQdJsYI83VhBoL/YjmO + 4ieOYiM2YgdW3yvaD2etIQXOQFaJVAuIT8290EcJHru5X/z5Yz+yyULkITDOXuPgxIrxWvrpwSwoXvIR + oiGuHVpsoDo+ojpapDNq3zZWoiWCY5Ew3xF24igqIQiCIiqapEk+YyvyF2d5VhbyAhWoGK8xGKPAw6DQ + Hi/2IqzpIkEGXk7MwkLuDFstJBgEIDIqI+yYhxJOI0paozSepDRuoBTWAH8d3zd2ZCbWAAFchY9o4FM6 + 5Vda41OGpXz9yxBEgBXmU1EmHwRQATzMAjwAIXNtAC0wV13a5V3WZW3l5A1CAl765V8CZmAGJiRsQB4J + XIfpQQEgHCbWmBFi/yDAjGVTiuVkTmMoSuICdOMEXiWAiOMf/MsCoGIEiKY0kuZomuZpoqZ88QEfqMUL + DEA4xGLH8cIMgMHQyeA4xEChkMs47GZv8psfZMJe4mDs1Rsz+SZv4sRxKmdyMidyOudy8uY48NoL2cAK + nIFadpyk0BgfGKLZ4UBopmZphmdqYhsOwEARIEaQWOVmqkdnjgFrjmd8yucn8gE3MgYXxADvgeOkmUF/ + yoESQIASAKiABuiAGmiAQoAUoAlAwh+D/uNIRAIEFOiEEmiFHqiFUuiFamiGTugU9Gfv9Z5D1oBjPl98 + zeeJjqZ2jMqQVaJmsud6MB9W/It2xGdo2uh8Nv/galrhC+DnizpHO8ibcL6aj36OHIwoSHqaaIIneaKo + ko5KDbSmehIpe8SoZ8LnjaIoli7pe9rnF/TolNIFkApp34Gp2URDD3wANvmIiY4mlp6mliqpkn4hDkCp + fqzFlJQpdHTmjKImnJLmkobnv+RBN6ZBfuZpXIipgypqgzKqSDDEoVINFozBEfrId8Zpn15qltJpa9Lp + YkJqZMToGZJOk5IqFhnfl36qUiTqmK4ZRKTqwUTBrewV6JFqkz4pZi7GEIToq8KFkmFTBhQBfIqmdhCr + rgyrsRZriiorjabAVMoOqvKqUawqq7JZtPrKDyBAGVASrSbrsRrrt34rjS5aayriwKDKTgo8wD5Za1xM + wQuoaRFwY7G+gLHO66UQGb3qinbUa77e68VNJWKogCmsq7QuaKMu6oPG30IMbJFoZx3EqgtsK7Xdq73K + K73qq8XKK7NywTviwBCo/+vCKgUm8IFQZQDU5Eq91uvFquzK6sq+2mt9tqYKGCrIBoWYwh61ihXNVkkU + jIGMgh6NLkbLTmzKIuu+Cu2lfIFZqEAlYlFs6uxPUEMPKFD1QSmRFSvLIsbEsqy+XgoL1EAN1GsanIJ+ + Pu204qxtPe2QvMsrvADs/MuQUSyyUuzWWi2xJisObKwV1sA1fGzaFoUptC3V5srFouzE4mvhIq5o1qdT + 1cAU+G0drCrCHuzkTtijPu5/vAsHDEBVBGt8zevnCu29Jm7Qiq7VimYKLK1aUMDuXe5QvAsEqMAeBFAK + IAYqzmt4voDt4i6gviJmUgDUPa7Zni0buWrr/kc0XP9D16kdm45m7vZrajrv7aYmnYISF4jAdBkvUcyA + EaSBl7KmeYBv+Irv+JJv+H5tDYQBHABBw+qs8A6vQ2Xvf1TAPlAAnX5v+eJv/vLXFKoAH1BAGzRk/AKF + oM3ANaCDOaBDAivwAjNwAzuwAzPDK/Rt2k6r5BrsBT+owgrwelTAOHQAAj9wCIvwA8+C425wUdDDCcjB + CrNwC7vwC8PwC58AdlJwkL4vG50we/CCCsdwD/uwC6swNeTwEEOK+96wGhFxEisxkUYu5VrwEwekBi/x + FFNx8hnxET9P8VbxFnPxjF0xFkNPF4vxGEdVBTvxGWNwFJPxGrPxFtksGONwG8tI8RxHzhfDccvQcR7r + cbs0cRr7MRRXrhTv8SATcozY8R1XixYX8iIz8nMcMiJbSyNL8iTPhRn/MRoD8pxEAiVzcicfxRtDMgl5 + qPIokzLkhjISl3IqT3IfZzImU67lqnIsF/Ijn7KFKLIs4zId03ItX0gu+7IuF2wrX/Iwa/IvGzMbgzIv + s8wxM7MY77IyU0gzS3MVs7IrEzMaT3M2K/EzQzNtaPM35zA3d7NsgHM5x684jzNsmPM6Xy46p7NrsHM8 + l+07r4w82/PCujM9r8Y983O05rM+w3I/C3Se/jNAb/JAIzSYFjRAJ3RDO/RDQ3RESyX0RFN0RVv0RWN0 + Rmv0RnN0R3v0R4N0SIv0SJN0SZv0SaP0MQcEADs= + + + + + AAABAAEA3OIAAAEAGACIXwIAFgAAACgAAADcAAAAxAEAAAEAGAAAAAAAAAAAAHgAAAB4AAAAAAAAAAAA + AAD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////+/vn4+/P6/vf7/vn4/vn5//v4/vv4/f35/f79/P79/P//+/// + +v//+f//+v//+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+/// + +///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+///+//9/P77/f78/P78 + /P/+/P/+/P/+/P/+/P///f/8/f75+/z5/fz6//33/fn5/vv///////////////////////////////// + ///////////////////////////////+/vX4/O75/vT4/vXy/vT1//nz/vn0/vz2/v78+/7++///+f// + +P//9///+P//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v// + +v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v//+v/8/P76/f77/P78 + /P/++//++//++//9+v79+/36+vzz9vj1+/r3//zw+/T1/vn///////////////////////////////// + ///////////////////////////////+/vb9/vP8//b5/vXz/vT0//jy/vnx/vrx//v2/vv2/vv6/fz7 + /fz9/fz7/fz4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4 + /fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv4/fv1/vny/vj0/vj0 + /vn2/vr3/vr4/vv3/fv3/fv4/fv0+/j2/fr4//zx+/X2/vr///////////////////////////////// + ///////////////////////////////+/fT7+/H9//f5/vXz/fP0//fx//jt/fbr/fXu/fXv/fX0+/f0 + +/f4+vf1+/bx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx + /PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXx/PXt/fLr//Hs/vHt + /vLu/fPv/fTx/PXy/ff2//v3//v3/vr3/vr5//zy/Pf2/vv///////////////////////////////// + ///////////////////////////////+/Pf++vX+//j5/fXw/PHx//Xi9+ng+unj/u7j/uzj/uvj/unj + /unk/ujk/unj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj + /urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urj/urf/ufc/+Xd/uXd + /ubg/ujh/unk/uvh+ufc8uDf8uPf7uTw+fP4//v2+vr6/f7///////////////////////////////// + /////////////////////////////////vr//vr///n5/fbv/PDn++zH4c+hwqyXuqKVvJ+VvJ6VvpuV + vpuWvpqWvpuVvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2V + vZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2VvZ2Rv5qOwZePwJiP + wJiTvpuTvpyWvJ6dv6SuyLKxxra6yb7c5t/0+/f1+fr5/P7///////////////////////////////// + /////////////////////////////////Pz++/r+/vv6/vny//Tl++q428GbyKaWyaKSzZ6RzZ2Pz5mP + 0JmP0ZaQ0JiRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuR + zZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuRzZuN0JiJ0paL0peL + 0ZeNz5mOz5qSzJ2UyZ6Wwp+Yu5+mvqrU49nz+/j7+/38+v7///////////////////////////////// + ////////////////////////////////+vz+9vb9+vf7/vnz//Xp/u673sSZyKSUyaCPzZyOzZuM0JaM + 0JWL0pOM0JWOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiO + zpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiOzpiK0JaH0pSI0ZWI + 0ZWK0JaKz5ePzZqTzJ2byqSbwaKmwavZ6d71/fn9/P78+v7///////////////////////////////// + ////////////////////////////////+v//+v7/+/j5//jw//Ls//K73cWUyKCQy52Jz5eH0JWF1I+E + 1I6D1oyE1I6H0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOE05GD1JGD1JGD + 1JGD1JGD05GI0ZOKz5WSzJ2Yx6GdwaXX6dz2//r9+/7/+/////////////////////////////////// + ////////////////////////////////+v//+f7/+vj5/vjw//Ls//K83cWUyKCQy52Jz5eH0JWE1I+D + 1I6D1oyE1I6H0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOF0pKF0pKE05GD + 05GC1JCC1JCF0pKI0JSQzZuWyKCcwqTW6dv1//n9+/7/+/////////////////////////////////// + ////////////////////////////////+v//+f7/+vn5/vnw//Lt//K93MaUyKCQy52Jz5eH0JWD1I+D + 1I6D1oyE1I6H0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0ZSI0ZWF0pKF + 05KB1I+B1I+D1JGF0pONz5mUyp6aw6LU6tr0//n9+/7/+/////////////////////////////////// + ////////////////////////////////+v//+f7/+vn6/vnx/vLu//O93MaWx6GRyZ6LzZiKzpeG0pGG + 0pCG1I+H0pGKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aMzpeNzZmKz5WJ + 0JSD05GD05CD1JGF0pOM0JiSy5yXxKDT6tny//f7/P39/P////////////////////////////////// + ////////////////////////////////+v//+f7/+vn6/vny/vPu//O+3MeXxqKTyaCNzZqLzpiI0ZOI + 0ZKI05GJ0ZOMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiOzJqRy5yNzpeM + z5aF0pKE05GD1JGF05KL0ZeRzJuWxZ/S6tjy//f6/P38/P////////////////////////////////// + ////////////////////////////////+///+v7/+vn6/vny/vPv//S/28iZxaSWx6KQy5yPzJuMzpaM + z5aM0JSNzpaPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uP + y5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uPy5uTyZ2Wx5+RypuP + y5qH0ZSG0ZOD1JGE05KJ0paQzZuVxp7Q69fw//b4/f37/f////////////////////////////////// + ////////////////////////////////+///+v7/+vn6/vny/vPv//TA28maxKWXx6ORy52PzJuOzpiO + zpeO0JWPzpeRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yR + y5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yRy5yVyJ6Yx6GSyp2R + y5yI0JWH0ZSD1JGE05KJ0paPzZqVxp7Q69fw//b4/f36/f////////////////////////////////// + ///////////////////////////////7/vz7/fz9+Pz9+v37+fv2/ffE28eUypuMz5WD1I6B1YyK0JOM + z5WWypySzJqKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aGz5eDzpmKz5aM + z5WQ0JGP0ZGJ0pGI0ZOG0ZmKzJ2MxqHN69nw//b8+v3++/////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////8/P38/Pz++Pv8+/v4+/jz/vXC3MaWyZ2QzZiJ0JOH0ZKMzpaO + zZeUyp2QzJmJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ + 0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSJ0ZSE0JaB0JeF0ZWG + 0ZSH05CG05CD05GD0pOE0ZmJzJ2NxqHM69nt//f5+/37/P////////////////////////////////// + ////////////////////////////////+f//+f7/+vn6/vny//Lv//LA3MWbxqGYyJ+TyZ2Syp2Ry52R + y52Ry52NzZiI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI + 05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GI05GD0pOA0pZ805N8 + 1JN31o931o941pF61JOC0pmJzJ6PxaLJ6trp//nz/f72/f////////////////////////////////// + ////////////////////////////////+f//+P7/+fr6/fny//Hv//G/3cOZx5+WyZ2Ry5uQy5qOzJqO + zJqNzZqNzpiMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WM + z5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WMz5WJ0JWG0JWD0pOB + 0pJ91Y591Y591I+A05KI0ZiPy5yVxKDP6tnu//f4/P36/f////////////////////////////////// + ////////////////////////////////+f//+P7/+fv6/fry//Hu//C+3sKYyJ6Vy5yPzJmNzZiMzpiL + zpiKz5iMzpiRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmR + zZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmRzZmOzpaM0JWI0ZKH + 0pKD1I6D1I6D1I+F0pGN0JeUy5uaxJ/U6tj0//f9/P3//P////////////////////////////////// + ////////////////////////////////+P//9/7/+fv6/frw//Ht/++73sCVypyRzZmK0JWI0JSF0pKF + 0pKD0pKJz5aSyp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2S + yp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2Syp2TzJiTzpWP0JKO + 0JKJ046J046J046M0pCS0JWYy5mexZ3Z6tb5//T+/fr//vz///////////////////////////////// + ////////////////////////////////9///9/7/+fv5/frw//Hs/++73sCUy5uQzpiI0ZOG0pKD1JGC + 1JGB1JGH0JaTyp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+T + yp+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+Typ+VzJmXzpWSz5KR + 0JKM0o6M046M046O0o+U0JSay5mfxZ3b6tX7//P+/vn//vv///////////////////////////////// + ////////////////////////////////9///9/7/+fv5/fnw/+/r/+2537+SzJmOzpaF0pKD05GA1Y5/ + 1Y1+1oyD0pGKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqK + zJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqKzJqPzJiTzZePz5SO + 0JKI0o+I046H1I6J04+P0pOUzZeZx5vT69Ty//L5/vf7/vn///////////////////////////////// + ////////////////////////////////9///9/7/+fz5/fnw/+/r/+2537+SzJmNzpaE0pGD05CA1Y5/ + 1Y1+1oyC05GJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJ + zZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmJzZmOzJiSzJiOzpSN + z5OH0o+H046G1I6I1I+O0pOTzZiYyJzS69Tw//H3//f5//j///////////////////////////////// + ////////////////////////////////9f/++P7++v36/fry//Hp/+q5376TyZqNypaGzpGEz5CA0I+A + 0I+A0Y5/0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y99 + 0Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y990Y+EzZaJyZqFzJeE + zJZ+0JF90ZB50o5905GC05aGzpmRzqLF7tTh/+/s//jr//b///////////////////////////////// + ////////////////////////////////9f/++P79+Pn7/frz//Pp/+u53r6Wyp2SzJuL0JaJ0JWG0ZSG + 0ZSG0pSE05OB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB + 1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKB1JKIzpqNy5+JzZyI + zpuB0pWA0pV91JN90pN7y5B/xZKKx5zC7NLi//Hs//ns/vj///////////////////////////////// + ////////////////////////////////+P/++f359/X7//rz//Tp/+y63b+Yxp+Vx52QyZqPyZqOypqO + ypqOypqKzJaD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD + 0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGD0JGJyZyOxaSJyJ+I + yZ6BzZiAzZh+z5aC0pqI1J+Iy56PyaTF7Njj//Xr//vl+/X///////////////////////////////// + ////////////////////////////////+//++v35+PX7//rz//Pp/+u+3sKdxaOZxqCWx5+Vx5+Vx5+V + x6CWxqGTyJ2NzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiN + zJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiNzJiTxqGYwqiTxaOS + xqKLypyKy5uGzZqIzZuJy5uLxJyUxaTL6tnp/vby/vzv+/n///////////////////////////////// + /////////////////////////////////P/++/37+/f8//ny/vHq/uvK5M2py62jyKiiyKmiyKqjx6uj + xqulxa6jx6qgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWg + yqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWgyqWlxqypw7Gkxa2j + xqybyqWay6SVzqOWzaOXyqKdyKemya/X7N7x/vf7/f39/f////////////////////////////////// + ////////////////////////////////+vz+/P78/fj7//jw/fDs/e3b8d3R6tXT7NjT7NnT7NnW7NzW + 7NzY69/Y7N3a7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva + 7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dva7dvd7N7g6uDc69zb + 7NvT7dXS7tTN79HN79HM7s/T7tXU6NXr9O35+vn99/3+9/////////////////////////////////// + ///////////////////////////////79Pb++/z8/vf7//fv/e/t/O7o/Orp/e3t//Lu//Lv//Py//fy + //f0//r2//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7 + //n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n7//n9//n///r7//b7 + //Xy/+/x/+7t/+vs/+rs/+ny/+7w+uz3+vb/9vr/9P7/9v////////////////////////////////// + ///////////////////////////////9/Pz+/v7+/v3+//37/vv7/vv6//v6//v6//z7//z7//z8//38 + //38//39//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+ + //3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3+//3///3+//z+ + //z8//v7//v6//r7//r7//r8//v8/vv9/v3//f3//P7//f////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////9//79/v79/v39/v7+/v7+/f7+/f/+/f///f///f///f///f// + /f///f///f///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v// + /v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v7///7///7/ + //7//v7//v///v///f7//f7//f7//f7//v7//v///v///v////////////////////////////////// + ///////////////////////////////3//z1/vr1/Pn3/Pv6+/37+P399//++P//+P//9v//9v//9P// + 9P//8///9f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f/+/Pz+/vv+/vv/ + /vz/+/7/+/7/+v7/+f7/9v3/9vz/9/3/+v7/+/7++/3++/3///////////////////////////////// + ///////////////////////////////3/vv2/vv2/fr2/Pr4+vz7+v39+//++f/++P/+9///9///9f// + 9f//9P/+9v7++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3+ + +f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f3++f38/Pr7/ff8/fj8 + /fj++/v++/v/+vz++vz9+vz++/z++/39+/z9+fr8+Pj9+Pj///////////////////////////////// + ///////////////////////////////1+/n4//z4/vz2/Pr4+/z6/f77/v/7/P77+/78+/79+/79+v/9 + +v/9+v/8+/37/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7 + /fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr7/fr4/vb3//T3//X3 + //X6/vf7/vf9/fj8/Pf7+/f9/fn+/vr9/fn8/Pj8/Pn9/fr///////////////////////////////// + ///////////////////////////////1+Pj6/v75/f32+/r2/fv3/vzz/Pjz+/j0/Pnz/Pfz/Pfz+/jy + +/fy+/fx/Pbx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx + /fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/fTx/vLx//Dx//Dx + //Dz/vLz/vL1/fL1/fP2/fT4/vb5//j6//j6//j7//j6//f///////////////////////////////// + ///////////////////////////////3+Pr8/v/6/f72+vv2/vvy/ffj8uji9Ojm+uzk++rj++nh++jh + /Ojf/Obg/Ofh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh + ++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jh++jk++fl++Xl++Xl + ++Xl++bl++bm++bm+ubk9uTi8+Ll9Obv++/2/vX4//b0/fL///////////////////////////////// + ///////////////////////////////8+v39/P74+/31+vr2//rs+/DP5NO21L2x0ris1bOr1rKl2a+l + 2a6i2q2k2a+o1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo + 1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOo1rOs1rKv1bKu1rGu + 1rGs1rGs1rGt1bGv1rOx1LSuz7K6177X79nu/e/0//Xx/vL///////////////////////////////// + ///////////////////////////////++//++/72+fv0+fn2//ro+OzB2cWiw6mcwqSWxp6Vx52OypiN + ypeKzJaMypmRx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56R + x56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Rx56Wxp6axZ6YxZ2Y + xp2Wxp2Wxp2Wxp2Zx5+bxaCWvJumyKvN6dDr/O3z//Xt/e////////////////////////////////// + /////////////////////////////////P/9+/72+fv2/frx/vTt/vLA28abxaOXx6COzJmMzZiG0ZKF + 0pKC1I6F0pKKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiK + zpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiKzpiRy5qVypySy5qR + zJmPzZeOzZaOzZaQzZiTzJuVyJ2ZxaDP6tPs/u/y//Tz/vX///////////////////////////////// + /////////////////////////////////P/9+/72+vv3/vrw/vPu//PA3MeaxaKWyJ+NzZmLzpeE05GE + 05GA1o2E05GJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJ + z5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eJz5eQzJqUy5uRzJmQ + zZiNz5aNz5WNz5WOzpeSzZuVyp2YxZ/P6tTt//Dy//T0//b///////////////////////////////// + /////////////////////////////////f/9/P71+/n1/vnu/vPs//O+3MaYxqGVyZ+LzpeJ0JWD1JGC + 1JB+14yB1I6I0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI + 0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZOI0ZONzpeRzJqNzZiM + zpiH0ZOG0pKF05KH0pON0JeRzJuVxp7O69Xt//Pz//j2//n///////////////////////////////// + ///////////////////////////////+/f/8/P70/Pj0/vnt/vPs//O+3MaYxqGVyJ+MzpiKz5aD05GC + 1JB/1o2C1I+I0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI + 0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKI0ZKNzZeRy5qNzZiM + zpiG0ZOG0pKE05GG0pOM0JeRzJuVxp7P69bt//P0/vn3/vv///////////////////////////////// + ///////////////////////////////7/v/5/f7z/Pjz//js//Lr//K+3MaZxqKXyKCPzJqNzZiH0pOG + 0pKD1JGG0pGM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM + 0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKM0ZKOzZeRy5yNzZiM + zpiF0pKE05GB1JGD05KJ0ZePzJuVxZ/Q6tfw//b4/f36/f////////////////////////////////// + ///////////////////////////////7/v/5/v7z/Pjz//js//Ls//K+3MaaxaKXx6CQy5qOzJmI0ZSH + 0ZOE05GH0pGN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN + 0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKN0ZKPzZiRy5yNzZmM + zpiE0pKD05GB1JGD05KJ0ZePzJyVxaDR6tnw//f6/P38/f////////////////////////////////// + ///////////////////////////////7///5/v7z/Pjz//js//Ls//PA3MebxaOYx6GRy5uPzJmK0JaJ + 0JWH0pOK0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ + 0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQ0ZKQzZiRy52NzZmM + zpmD0pKC05GB1JGD05KJ0ZeQy5yWxKHS6try//n8+/7/+/////////////////////////////////// + ///////////////////////////////7//36/vz5+fr5/Pv1+/fy/vXC3MeXyJ6RzJqI0JOH0ZGK0JSL + z5WQzZiOzpeM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM + 0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSM0JSKzpiIzZqLzpeM + z5aL0ZGK0ZGG0pGG0pOH0ZiMzJ2QxaHP69nw//f8+/3/+/////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//r7/vr++fv++/z9+/n2/vbE3MaVy5mN0JOE1YyD1ouK0ZKM + 0JOXypyUypuPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmTyZ2WyJ+SypyQ + y5uMzZiLzpeK0JSMz5aRzZuWyZ+aw6LT6tnx//f6/P38/P////////////////////////////////// + ///////////////////////////////6//r7/vr++fv9+/z8+/n2//bD3MaVy5mN0JOE1YyC1ouJ0pKM + 0JOXypyUypuPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmP + zJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmPzJmTyZ2WyJ+SypyQ + y5uLzpeLzpeJ0JSLz5aQzZuVyZ6Zw6HT6tnx//b5/P38/f7///////////////////////////////// + ///////////////////////////////5//r5/vr7+fv8+/35+/v0//fC3MaSy5mK0ZOB1oyA1ouI0pKK + 0JSVyp2Ry5uMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiM + zpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiMzpiRy5yVyZ+Ry5uQ + zJqI0JWH0ZSH0pOI0ZSNz5mSy5yWxZ/Q6tfw//b2//v5//z///////////////////////////////// + ///////////////////////////////4//r4/vr6+fz7/P33+/vz//fA3MaRy5qI0ZOA1ox+1ouG0pKJ + 0JSTyp2Qy5uKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aK + z5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aKz5aPzJqTyp2PzJmN + zZiH0ZSG0ZOF0pKH0ZSM0JiRzJyVxp7P69bu//T1//n4//v///////////////////////////////// + ///////////////////////////////2//z2/vz3+vz4/P31+/vw//e+3MePy5uH0ZV91o181oyF0pOH + 0JWRyp+NzJuI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI + 0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWI0ZWMzpeQzJqLz5aK + 0JaF0pKE05GD1JGE05KJ0paOzZqTx53N69Tt//Lz//f2//n///////////////////////////////// + ///////////////////////////////1//z0/vz2+f33+/30+vzv/vi93MiOy5yF0ZV81o571o2D0pSG + 0JaQyZ+NzJuH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH + 0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOH0ZOLzpeOzJmKz5aI + 0JWE05GD05GB1I+D05GI0pWOzpmSx5zM69Pr//Dy//f1//n///////////////////////////////// + ///////////////////////////////0//30/v31+f72+/3z+vzu/vi93MmNy5yF0ZZ71o961o6D0pWF + 0JeQyaCMzJuH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH + 0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOH0pOLz5aOzZmJ0JWI + 0ZWD05GC1JCB1Y+D1JCI05SNzpiRyJvL69Lr//Dx//b0//n///////////////////////////////// + ///////////////////////////////w+vn1/v75+/73+v70+f3s/fa52cWMyJuFzpZ704561I2Dz5SF + zpaPxp+LypqGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OKzZaOypiKzZWJ + zpSD0ZCC0pCB0o+C0pCGz5KOzpmXzKHM7dPo/+3z//f1//n///////////////////////////////// + ///////////////////////////////x+vr2/v/5+v/2+P71+f3u/fe828iPy5+I0Zl+1pF915CG0peI + 0JmSyaKOzJ2J0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ + 0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paJ0paNz5iRzZuOz5iN + 0JeG05OF1JKE1ZKF1JOH0JSOzZqbz6XP7tXq/+/0//j2//r///////////////////////////////// + ///////////////////////////////5/P76/P/69P/79f78+P71/fnF3M2Sx56HypR+z4580IyFy5OH + yZWSw56OxZqJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJ + yZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSJyZSOx5eSxZqNx5eM + x5eFzJGFzJGDzZCHzpONzpmRyJubyKTQ7Nfu//P4/vz0+Pn///////////////////////////////// + ///////////////////////////////6/P/6/P758fz+9//++v/0/PfB2smTx56Ky5eB0JB/0Y+IzJaK + y5iVxKGRx52MypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeM + ypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeMypeRyJqVxp2QyJqP + yJqIzZSIzZSGzpOK0JaRz5ySyJybx6TS69jw//X5/v309vj///////////////////////////////// + ///////////////////////////////9+P7/+v7/8f7/+P//+P/0+PXD1MWbx6GVzpyM05aL1JWSz5uV + zp2gx6WdyaSXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GX + y6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GXy6GbyaSex6abyqOZ + yqKUzZ+Tzp6Sz5uTzp2SxpyXwqCjxKra6+D2/vv9+v7/+v////////////////////////////////// + ///////////////////////////////89fz/+v//8v//9///9v/19/bM3M2eyKOTy5qK0JOI0ZGQzJiT + ypqexKKbxaGVyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+V + yJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+VyJ+ZxaKcxKSYxqGX + x6CRypyRypuQzJmRypqSxZycxqSox67Y6N3x+fb8+P3/+P////////////////////////////////// + ////////////////////////////////9v3/+f//8///9v//8//6+Prg69/A4sO45b2v6bWt6rO257q5 + 5rzE4cXA4sS548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K5 + 48K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K548K+4cbC4Mm+4ca9 + 4sW25MC25cC05b625cC75cTF5czK4dDn8Oz19fn99P3/9f////////////////////////////////// + ////////////////////////////////+v//+///9///+f//9//8+vzx+PDr+uzr/+7l/+nk/+jq/+zr + /+3y//Pw//Lr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr + //Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hr//Hv//Px//Xv//Pu + //Pq//Dp//Do/+/p/+/r//Dw//Tv+/L3/Pn8/P7++v7/+v////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////+/P/+/P///P///P//+///+///+////P///P//+///+///+/// + +///+//7/f32//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2 + //r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r2//r0//zz//31//72 + ///3///3/v/4/f/5/f/6/f/5/f/4/f/3/f/2/f/1/v70/v7///////////////////////////////// + ///////////////////////////////+/P/+/P///P//+///+///+///+//9+f/8+P/99//+9//+9//+ + 9//+9//5+vvw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw + //Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xw//Xu/vfs/vnv/Pvw + /Pzy+/3y+/3z+f/1+v/5/f/4/f/2/f/2/v/1/v/0/v7z/v7///////////////////////////////// + ///////////////////////////////+/P/+/P/+/P/9+//8+//8+//8+//8/P/8/P/9/f/9/f/9/f/8 + /f/7/f/8/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+ + /f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f7+/f78/vv6/vn8/vv8 + /vz+/vz+/v3+/P/+/P/++v/++//++//+/P/+/f/+/f/+/f////////////////////////////////// + /////////////////////////////////P/++//9/P/9/P/7/P/7/P77/P77/P77/f77/f77/v77/v37 + /v35/v37/f7//P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P// + /P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P///P/9/fv7//n8//r9 + //r+//v//vv//f3//P3/+v7/+v7/+v7/+/7//P7/+/7/+/7///////////////////////////////// + ////////////////////////////////+//++//8/P/7/P/6/f/5/f34//z2//r1//r0//j0//jy//fy + //fy//X3/Pn/+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f// + +f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f///Pj///T///T/ + //T///T///T///X///b///n//vr//vz//fz//Pz/+f3/+f7///////////////////////////////// + ////////////////////////////////+//++//8/P/7/P75/f74/vz3//v1//r0//nz//fy//fw//Xw + //Xv//Tz/ff6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6 + /Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/Pz6/ff7//P7//P7 + //P6//P6//P6//T6//T6//X7/vf8/vn+/fv//fz/+/7/+/////////////////////////////////// + ////////////////////////////////+//++//8/P/6/P74//z2//r1//ns/PHo+u7l++vl++vh/Ojg + /Off/Ofj++rq+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q + +e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/q+e/r+uvs++js++fs + ++fq++fq++fq++fq++fr+ufv++v0++/6/PT+/fj//f3//f////////////////////////////////// + ////////////////////////////////+//++/76+v36/P31/fr1//ne7OPE3Mq/2sW73MK63cG23761 + 376z4Ly137243cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC4 + 3cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC43cC63cC83cC63r66 + 3r634Ly34Ly34Ly5372838HB3sXG3Mjl8eX2/fb5/fz6/f3///////////////////////////////// + /////////////////////////////////P/++/75+fz5/Pzz/Pjz//nH2s2iv6ifwKaaw6GZxKCVxp6U + xp2RyJuQyJqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqP + yZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqPyZqSxp6VxaGRxp6R + x56OyJuOyZuOyZuPyZ2UyaKYxaScwKbS6dvv//f0//v2//z///////////////////////////////// + ////////////////////////////////+//++/75+fz5/fvy/Pby//fF2sufwaacw6OVxp6Ux52OypmN + y5iKzZaIzpWGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OG + z5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OGz5OKy5mNyJ2JypuI + ypqEzpeDzpaCzpaFzpiLzp2PyqCTxKPL6tjp//Xv//rx//z///////////////////////////////// + ////////////////////////////////+//++v75+vv5/fvy/fbx//bE28qew6WbxaKTyJyRyZuLzZeK + zZaH0JSF0ZKC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC + 05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CC05CGzpaJy5yFzJmE + zZl/0JV+0ZR90pR/0ZWG0JqKzJ6OxqHH69fm//Xs//rv//z///////////////////////////////// + ////////////////////////////////+//++v75+vv4/fvw/fXv//XA3MebxaOXx6COzJmMzZiE0pGD + 05GB1Y6D05CG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG + 0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKG0pKLzpaOzJmKzpaJ + z5WC05CC049/1Y6B1JCI0pWNzZqSx57O69Xt//P0//n3//z///////////////////////////////// + ////////////////////////////////+//++v75+vv4/fvw/fXu//TA3MeaxqOXyKCOzZqMz5iD1JGD + 1ZGA1o6D1ZCI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI + 0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSI0pSNz5eRzZmM0JaL + 0JWE1JCD1Y+B1o6D1ZCI05SOzpmTx53P69Xv//L2/vn5/vv///////////////////////////////// + ////////////////////////////////+//9+v73+vv3/vrw/vPt//O+3MaXyKGUy56K0JeI0pWB149/ + 14572ouD1JGSzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2S + zJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2SzJ2XzJqbzZmV0JSU + 0ZON1I2M1YyJ14uL1YyR05CXzpWdx5rZ69P5//L+/fn//fv///////////////////////////////// + ///////////////////////////////++/79+/74+fv4/fvy/fTv/vS/3MaXyaCTzJ2K0paI05SD1pCD + 1pCB14+H05SRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyR + zZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyRzZyUzZqXzpmU0JWT + 0ZSO1I6O1Y6K1oyL1Y6P0pKVzpeax5vW69T3//L9/Pr//fz///////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + ///////////////////////////////7//z7/vz9+Pz9+v37+fv2/ffE28eUypuM0JWC1Y2B1YyK0ZOM + z5SXyp2SzJqK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK + 0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaK0JaFz5eDz5mJz5WM + 0JWQ0JGQ0ZGK0pGI0ZOG0ZmJzJ2MxqHN69nw//f8+v3/+v////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/ZeroFlowTool/packages.config b/ZeroFlowTool/packages.config new file mode 100644 index 00000000..2447ecf8 --- /dev/null +++ b/ZeroFlowTool/packages.config @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ZeroFlowTool/thermometer.GIF b/ZeroFlowTool/thermometer.GIF new file mode 100644 index 00000000..d1d91835 Binary files /dev/null and b/ZeroFlowTool/thermometer.GIF differ